00001
00002
00003
00004
00005
00006
00007
00008
00009
00011
00012 #include "UgliGeometry/UgliGeomHandle.h"
00013 #include "UgliGeometry/UgliLoanPool.h"
00014 #include "UgliGeometry/UgliGeometry.h"
00015
00016 #include "Validity/VldContext.h"
00017
00018 #include "MessageService/MsgService.h"
00019 CVSID("$Id: UgliGeomHandle.cxx,v 1.21 2007/06/14 14:49:06 rhatcher Exp $");
00020
00021 #include <cassert>
00022
00023 ClassImp(UgliGeomHandle)
00024
00025
00026 UgliGeomHandle::UgliGeomHandle()
00027 : fUgliGeometry(0),fGeoGeometry(0)
00028 {
00029
00030
00031 MSG("Ugli",Msg::kWarning)
00032 << endl
00033 << "UgliGeomHandle created by default ctor"
00034 << endl;
00035
00036
00037
00038 VldContext vldc(Detector::kUnknown,SimFlag::kUnknown,
00039 VldTimeStamp((time_t)0,0));
00040
00041 if ( !UgliLoanPool::Instance()->UseGeo() ) {
00042 fUgliGeometry
00043 = UgliLoanPool::Instance()->GetUgliGeometry(vldc,true);
00044 fUgliGeometry->IncrementRef();
00045 }
00046 else {
00047 fGeoGeometry
00048 = UgliLoanPool::Instance()->GetGeoGeometry(vldc,true,Geo::kRecons);
00049 fGeoGeometry->IncrementRef();
00050 }
00051
00052
00053 }
00054
00055
00056 UgliGeomHandle::UgliGeomHandle(const VldContext& vldc,
00057 Ugli::EModifyMode mmode,
00058 Geo::EAppType apptype) : fUgliGeometry(0),
00059 fGeoGeometry(0)
00060 {
00061
00062
00063 Bool_t use_frozen = true;
00064 switch (mmode) {
00065 case (Ugli::kModifiable): use_frozen = false; break;
00066 case (Ugli::kFrozen): use_frozen = true; break;
00067 case (Ugli::kUseGlobal):
00068 use_frozen = true;
00069 if (Ugli::kModifiable ==
00070 Ugli::GetDefaultModifyMode()) use_frozen = false;
00071 break;
00072 }
00073
00074 if ( !UgliLoanPool::Instance()->UseGeo() ) {
00075 fUgliGeometry
00076 = UgliLoanPool::Instance()->GetUgliGeometry(vldc,use_frozen);
00077 fUgliGeometry->IncrementRef();
00078 }
00079 else {
00080 fGeoGeometry
00081 = UgliLoanPool::Instance()->GetGeoGeometry(vldc,use_frozen,apptype);
00082 fGeoGeometry->IncrementRef();
00083 }
00084
00085 }
00086
00087
00088 UgliGeomHandle::UgliGeomHandle(const UgliGeomHandle &that)
00089 : UgliGeomABC()
00090 {
00091
00092
00093
00094
00095 ((UgliGeomHandle&)that).Copy(*this);
00096 if ( !IsGeo() ) fUgliGeometry->IncrementRef();
00097 else fGeoGeometry->IncrementRef();
00098
00099 }
00100
00101
00102 UgliGeomHandle::~UgliGeomHandle()
00103 {
00104
00105 if ( !IsGeo() ) fUgliGeometry->DecrementRef();
00106 else fGeoGeometry->DecrementRef();
00107
00108 }
00109
00110
00111 UgliGeomHandle& UgliGeomHandle::operator=(const UgliGeomHandle& ugh)
00112 {
00113
00114
00115 if ( !IsGeo() ) fUgliGeometry->DecrementRef();
00116 else fGeoGeometry->DecrementRef();
00117
00118 ((UgliGeomHandle&)ugh).Copy(*this);
00119
00120 if ( !IsGeo() ) fUgliGeometry->IncrementRef();
00121 else fGeoGeometry->IncrementRef();
00122
00123 return *this;
00124 }
00125
00126
00127 void UgliGeomHandle::ResetVldContext(const VldContext& vldc)
00128 {
00129 Bool_t use_frozen = IsFrozen();
00130 if ( !IsGeo() ) {
00131 fUgliGeometry->DecrementRef();
00132 fUgliGeometry
00133 = UgliLoanPool::Instance()->GetUgliGeometry(vldc,use_frozen);
00134 fUgliGeometry->IncrementRef();
00135 }
00136 else {
00137 Geo::EAppType apptype = fGeoGeometry->GetAppType();
00138 fGeoGeometry->DecrementRef();
00139 fGeoGeometry
00140 = UgliLoanPool::Instance()->GetGeoGeometry(vldc,use_frozen,apptype);
00141 fGeoGeometry->IncrementRef();
00142 }
00143
00144 }
00145
00146
00147 bool UgliGeomHandle::DoesValidGeomExist(const VldContext& vldc,
00148 Ugli::EModifyMode mmode)
00149 {
00150
00151
00152 return UgliLoanPool::Instance()->DoesValidGeomExist(vldc,mmode);
00153 }
00154
00155
00156 void UgliGeomHandle::Copy(TObject &that) const
00157 {
00158
00159
00160 TObject::Copy(that);
00161 ((UgliGeomHandle&)that).fUgliGeometry = fUgliGeometry;
00162 ((UgliGeomHandle&)that).fGeoGeometry = fGeoGeometry;
00163
00164 }
00165
00166
00167
00168
00169
00170 UgliScintPlnHandle UgliGeomHandle::GetScintPlnHandle(PlexPlaneId planeid)
00171 { if ( !IsGeo() )
00172 return UgliScintPlnHandle(fUgliGeometry->GetScintPlnNode(planeid));
00173 else
00174 return UgliScintPlnHandle(fGeoGeometry->GetScintPlnNode(planeid)); }
00175
00176
00177 UgliStripHandle UgliGeomHandle::GetStripHandle(PlexStripEndId seid)
00178 { if ( !IsGeo() )
00179 return UgliStripHandle(fUgliGeometry->GetStripNode(seid));
00180 else
00181 return UgliStripHandle(fGeoGeometry->GetStripNode(seid)); }
00182
00183
00184 vector<UgliScintPlnHandle> UgliGeomHandle::GetScintPlnHandleVector()
00185 {
00186
00187 vector<UgliScintPlnHandle> scintPlnHandles;
00188 if ( !IsGeo() ) {
00189 vector<UgliScintPlnNode*> scintPlnNodes =
00190 fUgliGeometry->GetScintPlnNodePtrVector();
00191 for (unsigned int i=0; i<scintPlnNodes.size(); ++i)
00192 scintPlnHandles.push_back(UgliScintPlnHandle(scintPlnNodes[i]));
00193 }
00194 else {
00195 vector<GeoScintPlnNode*> scintPlnNodes =
00196 fGeoGeometry->GetScintPlnNodePtrVector();
00197 for (unsigned int i=0; i<scintPlnNodes.size(); ++i)
00198 scintPlnHandles.push_back(UgliScintPlnHandle(scintPlnNodes[i]));
00199 }
00200
00201 return scintPlnHandles;
00202 }
00203
00204
00205 vector<UgliSteelPlnHandle> UgliGeomHandle::GetSteelPlnHandleVector()
00206 {
00207
00208 vector<UgliSteelPlnHandle> steelPlnHandles;
00209 if ( !IsGeo() ) {
00210 vector<UgliSteelPlnNode*> steelPlnNodes =
00211 fUgliGeometry->GetSteelPlnNodePtrVector();
00212 for (unsigned int i=0; i<steelPlnNodes.size(); ++i)
00213 steelPlnHandles.push_back(UgliSteelPlnHandle(steelPlnNodes[i]));
00214 }
00215 else {
00216 vector<GeoSteelPlnNode*> steelPlnNodes =
00217 fGeoGeometry->GetSteelPlnNodePtrVector();
00218 for (unsigned int i=0; i<steelPlnNodes.size(); ++i)
00219 steelPlnHandles.push_back(UgliSteelPlnHandle(steelPlnNodes[i]));
00220 }
00221
00222 return steelPlnHandles;
00223 }
00224
00225
00226 vector<UgliPlnHandle> UgliGeomHandle::GetPlnHandleVector()
00227 {
00228
00229 vector<UgliPlnHandle> plnHandles;
00230 if ( !IsGeo() ) {
00231 vector<UgliPlnNode*> plnNodes =
00232 fUgliGeometry->GetPlnNodePtrVector();
00233 for (unsigned int i=0; i<plnNodes.size(); ++i)
00234 plnHandles.push_back(UgliPlnHandle(plnNodes[i]));
00235 }
00236 else {
00237 vector<GeoPlnNode*> plnNodes =
00238 fGeoGeometry->GetPlnNodePtrVector();
00239 for (unsigned int i=0; i<plnNodes.size(); ++i)
00240 plnHandles.push_back(UgliPlnHandle(plnNodes[i]));
00241 }
00242
00243 return plnHandles;
00244 }
00245
00246 void UgliGeomHandle::SwitchMedia(bool toswim) {
00247
00248
00249
00250
00251 if ( !IsGeo() ) MSG("Ugli",Msg::kWarning)
00252 << "SwitchMedia with UgliGeometry is not applicable." << endl;
00253 else fGeoGeometry -> SwitchMedia(toswim);
00254
00255 }
00256
00257