BmnRoot
Loading...
Searching...
No Matches
CbmStsElement.cxx
Go to the documentation of this file.
1
7#include "TGeoManager.h"
8#include "TGeoPhysicalNode.h"
9
10#include "setup/CbmStsElement.h"
11#include "setup/CbmStsSetup.h"
12
13
14// ----- Default constructor -------------------------------------------
16 fAddress(0),
17 fLevel(kStsNofLevels),
18 fNode(NULL),
19 fDaughters()
20{
21}
22// -------------------------------------------------------------------------
23
24
25
26// ----- Standard constructor ------------------------------------------
27CbmStsElement::CbmStsElement(const char* name, const char* title,
28 Int_t level,
29 TGeoPhysicalNode* node) :
30 TNamed(name, title),
31 fAddress(0),
32 fLevel(kStsSystem),
33 fNode(node),
34 fDaughters()
35{
36 SetLevel(level);
37}
38// -------------------------------------------------------------------------
39
40
41
42// ----- Add a daughter element ----------------------------------------
44 if ( ! element ) return;
45 if ( element->GetLevel() != fLevel + 1) {
46 LOG(error) << fName << ": Trying to add an element of level "
47 << element->GetLevel() << " as daughter of level "
48 << fLevel << "! Command will be ignored.";
49 return;
50
51 }
53 element->GetLevel(),
55 fDaughters.push_back(element);
56}
57// -------------------------------------------------------------------------
58
59
60
61// ----- Get a daughter element ----------------------------------------
63 if ( index < 0 || index >=GetNofDaughters() ) return NULL;
64 return fDaughters[index];
65}
66// -------------------------------------------------------------------------
67
68
69
70// ----- Recursively read daughters from geometry ----------------------
72
73
74 // --- Catch absence of TGeoManager
75 if ( ! gGeoManager ) {
76 LOG(error) << fName << ": cannot initialise without TGeoManager!";
77 return;
78 }
79
80 // --- No daughter elements below sensor level
81 if ( fLevel > kStsSensor ) return;
82
83 // --- Catch physical node not being set
84 if ( ! fNode ) {
85 LOG(error) << fName << ": physical node is not set!";
86 return;
87 }
88
89 TGeoNode* mNode = fNode->GetNode(); // This node
90 TString mPath = fNode->GetName(); // Path to this node
91 for (Int_t iNode = 0; iNode < mNode->GetNdaughters(); iNode++) {
92
93 // Check name of daughter node for level name
94 TString dName = mNode->GetDaughter(iNode)->GetName();
95 if ( dName.Contains(CbmStsSetup::GetLevelName(fLevel + 1),
96 TString::kIgnoreCase ) ) {
97
98 // Create physical node
99 const char* name = "";
100 const char* title = CbmStsSetup::GetLevelName(fLevel+1);
101 TString dPath = mPath + "/" + dName;
102 TGeoPhysicalNode* pnNode = new TGeoPhysicalNode(dPath.Data());
103
104 // Create element and add it as daughter
105 CbmStsElement* dElement = new CbmStsElement(name, title,
106 fLevel + 1, pnNode);
107 AddDaughter(dElement);
108
109 // Call method recursively for the daughter elements
110 dElement->InitDaughters();
111
112 } // name of daughter node
113
114 } // daughter node loop
115
116}
117// -------------------------------------------------------------------------
118
119
120
121// ----- Print ---------------------------------------------------------
122void CbmStsElement::Print(Option_t* opt) const {
123 LOG(info) << fName << ": " << fTitle << ", address " << fAddress
124 << ", index " << GetIndex() << ", level " << fLevel;
125}
126// -------------------------------------------------------------------------
127
128
129
130// ----- Set element level ---------------------------------------------
131void CbmStsElement::SetLevel(Int_t level) {
132 switch (level) {
133 case kStsSystem: fLevel = kStsSystem; break;
134 case kStsStation: fLevel = kStsStation; break;
135 case kStsLadder: fLevel = kStsLadder; break;
136 case kStsHalfLadder: fLevel = kStsHalfLadder; break;
137 case kStsModule: fLevel = kStsModule; break;
138 case kStsSensor: fLevel = kStsSensor; break;
139 default: LOG(error) << fName << ": trying to set the level to "
140 << level << " while max. level is "
141 << kStsNofLevels - 1; break;
142 }
143}
144// -------------------------------------------------------------------------
@ kStsModule
Module.
@ kStsStation
Station.
@ kStsLadder
Ladder.
@ kStsSystem
System = STS.
@ kStsNofLevels
Number of STS levels.
@ kStsHalfLadder
Halfladder.
@ kStsSensor
Sensor.
static UInt_t SetElementId(UInt_t address, Int_t level, Int_t newId)
Class representing an element of the STS setup.
void SetLevel(Int_t level)
virtual void AddDaughter(CbmStsElement *element)
StsElementLevel GetLevel() const
UInt_t fAddress
Unique address.
StsElementLevel fLevel
Level in hierarchy.
vector< CbmStsElement * > fDaughters
Array of daughters.
TGeoPhysicalNode * fNode
Pointer to geometry.
virtual void Print(Option_t *opt="") const
Int_t GetNofDaughters() const
Int_t GetIndex() const
CbmStsElement * GetDaughter(Int_t index) const
static const char * GetLevelName(Int_t level)
Definition CbmStsSetup.h:36