Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

UgliGeomHandle.cxx

Go to the documentation of this file.
00001 
00002 // $Id: UgliGeomHandle.cxx,v 1.21 2007/06/14 14:49:06 rhatcher Exp $
00003 //
00004 // UgliGeomHandle
00005 //
00006 // UgliGeomHandle is single geometry
00007 //
00008 // Author:  R. Hatcher 2000.04.25
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    // Default constructor
00030 
00031    MSG("Ugli",Msg::kWarning) 
00032       << endl
00033       << "UgliGeomHandle created by default ctor" 
00034       << endl;
00035 
00036 //   assert(0);
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    // Normal constructor
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    // copy constructor keeps reference count up-to-date
00092 
00093    // patterned after other ROOT objects
00094 
00095    ((UgliGeomHandle&)that).Copy(*this);
00096    if ( !IsGeo() ) fUgliGeometry->IncrementRef();
00097    else fGeoGeometry->IncrementRef();
00098    
00099 }
00100 
00101 //_____________________________________________________________________________
00102 UgliGeomHandle::~UgliGeomHandle()
00103 {
00104    // handle deletion updates reference count
00105    if ( !IsGeo() ) fUgliGeometry->DecrementRef();
00106    else            fGeoGeometry->DecrementRef();
00107   
00108 } 
00109 
00110 //_____________________________________________________________________________
00111 UgliGeomHandle&  UgliGeomHandle::operator=(const UgliGeomHandle& ugh)
00112 {
00113    // assignment keeps reference counts up-to-date
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    // static method for testing if ctor will construct a new geometry
00151    // turns around and asks UgliLoanPool
00152    return UgliLoanPool::Instance()->DoesValidGeomExist(vldc,mmode);
00153 }
00154 
00155 //_____________________________________________________________________________
00156 void UgliGeomHandle::Copy(TObject &that) const
00157 {
00158    // actual copying
00159 
00160    TObject::Copy(that);
00161    ((UgliGeomHandle&)that).fUgliGeometry = fUgliGeometry;
00162    ((UgliGeomHandle&)that).fGeoGeometry  = fGeoGeometry;
00163 
00164 }
00165 
00166 //_____________________________________________________________________________
00167 // inlining these causes a circular dependency
00168 
00169 //inline 
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 //inline 
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 //inline 
00184 vector<UgliScintPlnHandle> UgliGeomHandle::GetScintPlnHandleVector()
00185 {
00186 //{ return fUgliGeometry->GetScintPlnHandleVector(); }
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 //inline 
00205 vector<UgliSteelPlnHandle> UgliGeomHandle::GetSteelPlnHandleVector()
00206 {
00207 //{ return fUgliGeometry->GetSteelPlnHandleVector(); }
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 //inline 
00226 vector<UgliPlnHandle> UgliGeomHandle::GetPlnHandleVector()
00227 {
00228 //{ return fUgliGeometry->GetPlnHandleVector(); }
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   // Switch to swimmer media.  Only useful within PTSimApplication 
00248   // context, so perhaps should be protected with friend access? 
00249   // For now is public method.
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 //_____________________________________________________________________________

Generated on Mon Feb 15 11:07:48 2010 for loon by  doxygen 1.3.9.1