| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

In This Package:

TH2DE Class Reference

#include <TH2DE.h>

Inheritance diagram for TH2DE:

[legend]
Collaboration diagram for TH2DE:
[legend]
List of all members.

Public Member Functions

 TH2DE (const std::string &type, const std::string &name, const IInterface *parent)
virtual ~TH2DE ()
virtual StatusCode GetBestDetectorElement (const G4TouchableHistory *inHistory, const std::vector< std::string > &, const IDetectorElement *&outElement, int &outCompatibility)
 Do the conversion.
virtual StatusCode G4VolumeToDetDesc (const G4VPhysicalVolume *inVol, const IPVolume *&outVol)
 Utility to do a simpler conversion: find the IPVolume from a G4PhysicalVolume.
virtual StatusCode ClearCache ()
 Clear caches in case of geometry change.
virtual StatusCode initialize ()
virtual StatusCode finalize ()
INTupleSvcntupleSvc () const
INTupleSvcevtColSvc () const
IDataProviderSvcdetSvc () const
IDataProviderSvcevtSvc () const
IIncidentSvcincSvc () const
IChronoStatSvcchronoSvc () const
IHistogramSvchistoSvc () const
IAlgContextSvccontextSvc () const
DataObjectput (IDataProviderSvc *svc, DataObject *object, const std::string &address, const bool useRootInTES=true) const
DataObjectput (DataObject *object, const std::string &address, const bool useRootInTES=true) const
Gaudi::Utils::GetData< TYPE
>::return_type 
get (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
Gaudi::Utils::GetData< TYPE
>::return_type 
get (const std::string &location, const bool useRootInTES=true) const
TYPE * getDet (IDataProviderSvc *svc, const std::string &location) const
TYPE * getDet (const std::string &location) const
bool exist (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
bool exist (const std::string &location, const bool useRootInTES=true) const
bool existDet (IDataProviderSvc *svc, const std::string &location) const
bool existDet (const std::string &location) const
TYPE * getOrCreate (IDataProviderSvc *svc, const std::string &location, const bool useRootInTES=true) const
TYPE * getOrCreate (const std::string &location, const bool useRootInTES=true) const
TOOL * tool (const std::string &type, const std::string &name, const IInterface *parent=0, bool create=true) const
TOOL * tool (const std::string &type, const IInterface *parent=0, bool create=true) const
SERVICE * svc (const std::string &name, const bool create=true) const
IUpdateManagerSvcupdMgrSvc () const
IDataProviderSvcfastContainersSvc () const
StatusCode Error (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
StatusCode Warning (const std::string &msg, const StatusCode st=StatusCode::FAILURE, const size_t mx=10) const
StatusCode Print (const std::string &msg, const StatusCode st=StatusCode::SUCCESS, const MSG::Level lev=MSG::INFO) const
StatusCode Assert (const bool ok, const std::string &message="", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Assert (const bool ok, const char *message, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Exception (const std::string &msg, const GaudiException &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Exception (const std::string &msg, const std::exception &exc, const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
StatusCode Exception (const std::string &msg="no message", const StatusCode sc=StatusCode(StatusCode::FAILURE, true)) const
MsgStreammsgStream (const MSG::Level level) const
MsgStreamalways () const
MsgStreamfatal () const
MsgStreamerr () const
MsgStreamerror () const
MsgStreamwarning () const
MsgStreaminfo () const
MsgStreamdebug () const
MsgStreamverbose () const
MsgStreammsg () const
const Statisticscounters () const
StatEntitycounter (const std::string &tag) const
MSG::Level msgLevel () const
bool msgLevel (const MSG::Level level) const
void resetMsgStream () const
bool typePrint () const
bool propsPrint () const
bool statPrint () const
bool errorsPrint () const
long printStat (const MSG::Level level=MSG::ALWAYS) const
long printErrors (const MSG::Level level=MSG::ALWAYS) const
long printProps (const MSG::Level level=MSG::ALWAYS) const
void registerCondition (const std::string &condition, StatusCode(CallerClass::*mf)()=NULL)
void registerCondition (const std::string &condition, CondType *&condPtrDest, StatusCode(CallerClass::*mf)()=NULL)
void registerCondition (char *condition, StatusCode(CallerClass::*mf)()=NULL)
void registerCondition (TargetClass *condition, StatusCode(CallerClass::*mf)()=NULL)
StatusCode runUpdate ()
TransientFastContainer< T > * getFastContainer (const std::string &location, typename TransientFastContainer< T >::size_type initial=0)
StatusCode release (const IInterface *interface) const
virtual unsigned long release ()
const std::string & context () const
const std::string & rootInTES () const
double globalTimeOffset () const
virtual StatusCode queryInterface (const InterfaceID &riid, void **ppvUnknown)
virtual unsigned long addRef ()
virtual const std::string & name () const
virtual const std::string & type () const
virtual const IInterfaceparent () const
virtual StatusCode configure ()
virtual StatusCode start ()
virtual StatusCode stop ()
virtual StatusCode terminate ()
virtual StatusCode reinitialize ()
virtual StatusCode restart ()
virtual Gaudi::StateMachine::State FSMState () const
virtual Gaudi::StateMachine::State targetFSMState () const
virtual StatusCode sysInitialize ()
virtual StatusCode sysStart ()
virtual StatusCode sysStop ()
virtual StatusCode sysFinalize ()
virtual StatusCode sysReinitialize ()
virtual StatusCode sysRestart ()
virtual StatusCode setProperty (const Property &p)
virtual StatusCode setProperty (const std::string &s)
virtual StatusCode setProperty (const std::string &n, const std::string &v)
StatusCode setProperty (const std::string &name, const TYPE &value)
virtual StatusCode getProperty (Property *p) const
virtual const PropertygetProperty (const std::string &name) const
virtual StatusCode getProperty (const std::string &n, std::string &v) const
virtual const std::vector<
Property * > & 
getProperties () const
PropertyMgrgetPropertyMgr ()
ISvcLocatorserviceLocator () const
ISvcLocatorsvcLoc () const
IMessageSvcmsgSvc () const
IToolSvctoolSvc () const
StatusCode setProperties ()
StatusCode service (const std::string &name, T *&svc, bool createIf=true) const
StatusCode service (const std::string &type, const std::string &name, T *&svc) const
void declInterface (const InterfaceID &, void *)
PropertydeclareProperty (const std::string &name, T &property, const std::string &doc="none") const
PropertydeclareRemoteProperty (const std::string &name, IProperty *rsvc, const std::string &rname="") const
IAuditorSvcauditorSvc () const
IMonitorSvcmonitorSvc () const
void declareInfo (const std::string &name, const T &var, const std::string &desc) const
void declareInfo (const std::string &name, const std::string &format, const void *var, int size, const std::string &desc) const

Static Public Member Functions

static const InterfaceIDinterfaceID ()
static const InterfaceIDinterfaceID ()
static const InterfaceIDinterfaceID ()

Public Attributes

 SUCCESS
 NO_INTERFACE
 VERSMISMATCH
 LAST_ERROR

Protected Types

typedef std::map< std::string,
StatEntity
Statistics
typedef std::map< std::string,
unsigned int > 
Counter
typedef std::vector< IAlgTool * > AlgTools
typedef std::pair< IInterface *,
std::string > 
ServiceEntry
typedef std::vector< ServiceEntryServices

Protected Member Functions

StatusCode releaseTool (const IAlgTool *tool) const
StatusCode releaseSvc (const IInterface *svc) const
int outputLevel () const
virtual unsigned long refCount () const
IntegerPropertyoutputLevelProperty ()
void initOutputLevel (Property &prop)

Static Protected Attributes

static const bool IgnoreRootInTES
static const bool UseRootInTES

Private Types

typedef std::pair< std::string,
std::string > 
LvPvPair_t
typedef std::vector< LvPvPair_tNameHistory_t
typedef std::vector< G4VPhysicalVolume * > TouchableHistory_t
typedef std::map< TouchableHistory_t,
const IDetectorElement * > 
THCache_t
typedef std::map< const G4VPhysicalVolume *,
const IPVolume * > 
PVCache_t
 SUCCESS
 NO_INTERFACE
 VERSMISMATCH
 LAST_ERROR
enum  Status

Private Member Functions

const IDetectorElementFindChildDE (const IDetectorElement *de, NameHistory_t &name_history)
const IDetectorElementFindDE (const IDetectorElement *de, NameHistory_t &name_history)
int InHistory (const IDetectorElement *de, const NameHistory_t &name_history)
const IDetectorElementCheckCache (const G4TouchableHistory *g4hist)
virtual const std::string & type () const =0
virtual const IInterfaceparent () const =0
virtual StatusCode configure ()=0
virtual StatusCode initialize ()=0
virtual StatusCode start ()=0
virtual StatusCode stop ()=0
virtual StatusCode finalize ()=0
virtual StatusCode terminate ()=0
virtual StatusCode reinitialize ()=0
virtual StatusCode restart ()=0
virtual Gaudi::StateMachine::State FSMState () const =0
virtual StatusCode sysInitialize ()=0
virtual StatusCode sysStart ()=0
virtual StatusCode sysStop ()=0
virtual StatusCode sysFinalize ()=0
virtual StatusCode sysReinitialize ()=0
virtual StatusCode sysRestart ()=0
virtual unsigned long refCount () const =0
virtual const std::string & name () const =0
virtual StatusCode queryInterface (const InterfaceID &riid, void **ppvInterface)=0
virtual unsigned long addRef ()=0
virtual unsigned long release ()=0

Static Private Member Functions

static const InterfaceIDinterfaceID ()

Private Attributes

THCache_t m_THcache
PVCache_t m_PVcache

Detailed Description

Definition at line 19 of file TH2DE.h.


Member Typedef Documentation

typedef std::pair<std::string,std::string> TH2DE::LvPvPair_t [private]

Definition at line 39 of file TH2DE.h.

typedef std::vector<LvPvPair_t> TH2DE::NameHistory_t [private]

Definition at line 40 of file TH2DE.h.

typedef std::vector<G4VPhysicalVolume*> TH2DE::TouchableHistory_t [private]

Definition at line 41 of file TH2DE.h.

typedef std::map<TouchableHistory_t,const IDetectorElement*> TH2DE::THCache_t [private]

Definition at line 42 of file TH2DE.h.

typedef std::map<const G4VPhysicalVolume*,const IPVolume*> TH2DE::PVCache_t [private]

Definition at line 43 of file TH2DE.h.


Constructor & Destructor Documentation

TH2DE::TH2DE ( const std::string &  type,
const std::string &  name,
const IInterface parent 
)

Definition at line 15 of file TH2DE.cc.

00018     : GaudiTool(type,name,parent)
00019 {
00020     declareInterface<ITouchableToDetectorElement>(this);
00021     this->ClearCache();  
00022 }

TH2DE::~TH2DE (  )  [virtual]

Definition at line 24 of file TH2DE.cc.

00025 {
00026     this->ClearCache();
00027 }


Member Function Documentation

StatusCode TH2DE::GetBestDetectorElement ( const G4TouchableHistory *  inHistory,
const std::vector< std::string > &  ,
const IDetectorElement *&  outElement,
int &  outCompatibility 
) [virtual]

Do the conversion.

Implements ITouchableToDetectorElement.

Definition at line 55 of file TH2DE.cc.

00059 {
00060     if (!inHistory->GetHistoryDepth()) {
00061         warning() << "TH2DE::GetBestDetectorElement given an empty history" << endreq;
00062         return StatusCode::FAILURE;
00063     }
00064 
00065     const IDetectorElement* de = this->CheckCache(inHistory);
00066     if (de) {
00067         outElement = de;
00068         return StatusCode::SUCCESS;
00069     }
00070         
00071     TouchableHistory_t th;      // for cache
00072     NameHistory_t name_history; // always read backwards, [0] = daughter, [n] = ancestors
00073     const int depth = inHistory->GetHistoryDepth();
00074     for (int ind=0; ind < depth; ++ind) {
00075         G4VPhysicalVolume* g4pv = inHistory->GetVolume(ind);
00076         th.push_back(g4pv);
00077 
00078         string full_name = g4pv->GetName();
00079 
00080         verbose() << ind << ": " << full_name << endreq;
00081 
00082         vector<string> names;
00083         split(names,full_name,'#');
00084 
00085 #if 0
00086         for (size_t iname=0; iname<names.size(); ++iname) {
00087             debug() << iname << ": [" << names[iname] << "]";
00088         }
00089         debug() << endreq;
00090 #endif
00091 
00092         if (depth-ind == 1) { // have /dd/Structure top level DE
00093             if (names.size() != 1) {
00094                 warning() << "got unknown type at top of history: " << full_name << ", " <<names.size() << endreq;
00095                 return StatusCode::FAILURE;
00096             }
00097 
00098             DataObject* obj = 0;
00099             StatusCode sc = detSvc()->retrieveObject(names[0],obj);
00100             if (sc.isFailure()) {
00101                 warning() << "failed to get DetectorElement: " << names[0] << endreq;
00102                 return StatusCode::FAILURE;
00103             }
00104             de = dynamic_cast<const IDetectorElement*>(obj);
00105             if (!de) {
00106                 warning() << "failed to dynamic_cast<DetectorElement*>: " << names[0] << endreq;
00107                 return StatusCode::FAILURE;
00108             }
00109             break;
00110         }
00111             
00112 
00113         if (names.size() > 2) {   // have pv1#pv2#pv3 style path
00114             DataObject* obj = 0;
00115             StatusCode sc = detSvc()->retrieveObject(names[0],obj);
00116             if (sc.isFailure()) {
00117                 warning() << "failed to get LVolume: " << names[0] << endreq;
00118                 return StatusCode::FAILURE;
00119             }
00120             const ILVolume* lv = dynamic_cast<const ILVolume*>(obj);
00121             if (!lv) {
00122                 warning() << "failed to dynamic_cast<LVolume*>: " << names[0] << endreq;
00123                 return StatusCode::FAILURE;
00124             }
00125             const IPVolume* pv = (*lv)[names[1]];
00126             lv = pv->lvolume();
00127             NameHistory_t reverse;
00128             for (string::size_type iname = 2; iname < names.size(); ++iname) {
00129                 pv = (*lv)[names[iname]];
00130                 reverse.push_back(LvPvPair_t(lv->name(),pv->name()));
00131                 lv = pv->lvolume();
00132             }
00133             name_history.insert(name_history.end(),reverse.rbegin(),reverse.rend());
00134         }
00135 
00136         name_history.push_back(LvPvPair_t(names[0],names[1]));
00137 
00138     } // loop over history
00139 
00140     if (!de) {
00141         const int depth = inHistory->GetHistoryDepth();
00142         warning() << "failed to find top level supporting DetectorElement, history has depth of " << depth << "\n";
00143         for (int ind=0; ind < depth; ++ind) {
00144             G4VPhysicalVolume* g4pv = inHistory->GetVolume(ind);
00145             warning() << "\n\t(" << ind << ") " << g4pv->GetName();
00146         }
00147         warning() << endreq;
00148         return StatusCode::FAILURE;
00149     }
00150 
00151     de = this->FindDE(de,name_history);
00152     if (!de) {
00153         warning() << "failed to find DetectorElement for TouchableHistory:\n" << dumpstr(inHistory) << endreq;
00154         return StatusCode::FAILURE;
00155     }
00156 
00157     m_THcache[th] = de;
00158     outElement = de;
00159     outCompatibility = name_history.size();
00160     return StatusCode::SUCCESS;
00161 }

StatusCode TH2DE::G4VolumeToDetDesc ( const G4VPhysicalVolume *  inVol,
const IPVolume *&  outVol 
) [virtual]

Utility to do a simpler conversion: find the IPVolume from a G4PhysicalVolume.

Implements ITouchableToDetectorElement.

Definition at line 263 of file TH2DE.cc.

00265 {
00266     
00267     if (!inVol) {
00268       warning() << "TH2DE:  No PhysicalVolume detected!   " <<endreq;
00269       return StatusCode::FAILURE;
00270     }
00271     outVol = m_PVcache[inVol];
00272     if (outVol) return StatusCode::FAILURE;
00273 
00274     vector<string> names;
00275     split(names,inVol->GetName(),'#');
00276 
00277     DataObject* obj = 0;
00278     StatusCode sc = detSvc()->retrieveObject(names[0],obj);
00279     if (sc.isFailure()) return sc;
00280 
00281     if (names.size() == 1) {    // this PV is named after a detector element
00282         const IDetectorElement* de = dynamic_cast<const IDetectorElement*>(obj);
00283         const IGeometryInfo* gi = de->geometry();
00284         const ILVolume* lv_target = gi->lvolume();
00285         const ILVolume* lv = gi->supportIGeometryInfo()->lvolume();
00286         const ILVolume::ReplicaPath& rpath = gi->supportPath();
00287         const IPVolume* pv = 0;
00288         for (size_t ind=0; ind < rpath.size(); ++ind) {
00289             pv = lv->pvolumes()[rpath[ind]];
00290             if (!pv) return StatusCode::FAILURE;
00291             lv = pv->lvolume();
00292             if (!lv) return StatusCode::FAILURE;
00293         }
00294         if (lv != lv_target) {
00295             warning() << "Don't come full circle: " << lv_target->name() << " != " << lv->name() << endreq;
00296             return StatusCode::FAILURE;
00297         }
00298         outVol = pv;
00299     }
00300     else {
00301         const ILVolume* lv = dynamic_cast<const ILVolume*>(obj);
00302         const IPVolume* pv = (*lv)[names[1]];
00303         if (!pv) return StatusCode::FAILURE;
00304 
00305         if (names.size() > 2) {   // have pv1#pv2#pv3 style path
00306             lv = pv->lvolume();
00307             if (!lv) return StatusCode::FAILURE;
00308 
00309             for (string::size_type iname = 2; iname < names.size(); ++iname) {
00310                 pv = (*lv)[names[iname]];
00311                 if (!pv) return StatusCode::FAILURE;
00312                 lv = pv->lvolume();
00313                 if (!lv) return StatusCode::FAILURE;
00314             }
00315         }
00316         outVol = pv;
00317     }
00318     if (outVol) {
00319         m_PVcache[inVol] = outVol;
00320         return StatusCode::SUCCESS;
00321     }
00322     return StatusCode::FAILURE;
00323 }

StatusCode TH2DE::ClearCache (  )  [virtual]

Clear caches in case of geometry change.

Implements ITouchableToDetectorElement.

Definition at line 325 of file TH2DE.cc.

00326 {
00327     m_THcache.clear();
00328     m_PVcache.clear();
00329     return StatusCode::SUCCESS;
00330 }

const IDetectorElement * TH2DE::FindChildDE ( const IDetectorElement de,
NameHistory_t name_history 
) [private]

Definition at line 194 of file TH2DE.cc.

00195 {
00196     IDetectorElement::IDEContainer& children = de->childIDetectorElements();
00197     size_t nchildren = children.size();
00198     verbose() << "Finding children from " << nchildren << endreq;
00199     for (size_t ichild = 0; ichild < nchildren; ++ichild) {
00200         IDetectorElement* child = children[ichild];
00201         int index = this->InHistory(child,name_history);
00202 
00203         if (index<0) continue;
00204 
00205         verbose() << "Found child: " << child->name() << " at index " <<index<<" lv#pv=" << name_history[index].first << "#"<< name_history[index].second << endreq;
00206 
00207         // strip off used history
00208         while ((int)name_history.size() > index) {
00209             LvPvPair_t lvpv = name_history.back();
00210             verbose () << "\tpoping: index="<<index<<", size=" << name_history.size() << " [" << lvpv.first << "#" << lvpv.second << "]" << endreq;
00211             name_history.pop_back();
00212         }
00213         return child;
00214     }
00215     return 0;
00216 }

const IDetectorElement * TH2DE::FindDE ( const IDetectorElement de,
NameHistory_t name_history 
) [private]

Definition at line 218 of file TH2DE.cc.

00219 {
00220     // If exhausted the NH then the current DE must be the one
00221     if (!name_history.size()) return de;
00222 
00223 
00224 #if 0
00225     debug() << "FindDE: " << de->name() << endreq;
00226     for (size_t inh=0; inh<name_history.size(); ++inh) {
00227         debug() << inh <<": " << name_history[inh].first << "#" << name_history[inh].second << endreq;
00228     }
00229 #endif
00230 
00231     LvPvPair_t lvpv(name_history.back().first,name_history.back().second);
00232 
00233     string de_lvname = de->geometry()->lvolumeName();
00234     if (de_lvname != lvpv.first) {
00235         warning() << "The given DE's LV does not match LV from top of history: "
00236                   << de_lvname <<" != "<< lvpv.first << endreq;
00237         return 0;
00238     }
00239 
00240     // Find immediate child that points into the history
00241     const IDetectorElement* child_de = this->FindChildDE(de,name_history);
00242 
00243     // If one found, recurse.
00244     if (child_de) return this->FindDE(child_de,name_history);
00245 
00246     // If we get here, we have reached the end of possible DEs.
00247     // Pop off the touchable history coresponding to current DE and return;
00248     name_history.pop_back();
00249     return de;
00250 }

int TH2DE::InHistory ( const IDetectorElement de,
const NameHistory_t name_history 
) [private]

Definition at line 163 of file TH2DE.cc.

00164 {
00165     const IGeometryInfo* gi = de->geometry();
00166     if (!gi->hasSupport()) return -1;
00167 
00168     const ILVolume::ReplicaPath& rpath = gi->supportPath();
00169     const IGeometryInfo* support_gi = gi->supportIGeometryInfo();
00170     const ILVolume* lv = support_gi->lvolume();
00171 
00172     verbose() << "InHistory de=" << de->name() << endreq;
00173 
00174     // Walk the DE's support and match against name_history;
00175     size_t index = name_history.size();
00176     for (size_t ind = 0; index && ind < rpath.size(); ++ind) {
00177         IPVolume* pv = lv->pvolumes()[rpath[ind]];
00178 
00179         --index;
00180         const LvPvPair_t& check = name_history[index];
00181 
00182         verbose() << "("<<index<<") lvpv=" << lv->name() << "#" << pv->name() 
00183                   << " =?= " 
00184                   << check.first << "#" << check.second << endreq;
00185 
00186         if (lv->name() != check.first) return -1;
00187         if (pv->name() != check.second) return -1;
00188 
00189         lv = pv->lvolume();
00190     }
00191     return index;
00192 }

const IDetectorElement * TH2DE::CheckCache ( const G4TouchableHistory *  g4hist  )  [private]

Definition at line 252 of file TH2DE.cc.

00253 {
00254     TouchableHistory_t th;
00255     const int depth = g4hist->GetHistoryDepth();
00256     for (int ind=0; ind < depth; ++ind) {
00257         G4VPhysicalVolume* g4pv = g4hist->GetVolume(ind);
00258         th.push_back(g4pv);
00259     }
00260     return m_THcache[th];
00261 }

const InterfaceID & ITouchableToDetectorElement::interfaceID (  )  [static, inherited]

Reimplemented from IAlgTool.

Definition at line 8 of file ITouchableToDetectorElement.cc.

00009 { 
00010     return IID_ITouchableToDetectorElement; 
00011 }


Member Data Documentation

THCache_t TH2DE::m_THcache [private]

Definition at line 44 of file TH2DE.h.

PVCache_t TH2DE::m_PVcache [private]

Definition at line 45 of file TH2DE.h.


The documentation for this class was generated from the following files:
| Classes | Job Modules | Data Objects | Services | Algorithms | Tools | Packages | Directories | Tracs |

Generated on Mon Apr 11 20:32:10 2011 for G4DataHelpers by doxygen 1.4.7