BmnRoot
Loading...
Searching...
No Matches
BmnSsdElement.cxx
Go to the documentation of this file.
1
7#include "BmnSsdElement.h"
8
9#include <cassert>
10#include "TGeoManager.h"
11#include "BmnSsdModule.h"
12#include "BmnSsdSetup.h"
13#include "BmnSsdStation.h"
14
15#include <iomanip>
16
17using std::left;
18using std::right;
19using std::setw;
20using std::pair;
21using std::multimap;
22
23// ----- Default constructor -------------------------------------------
25 fAddress(0),
26 fLevel(kSsdNofLevels),
27 fNode(NULL),
28 fDaughters(),
29 fMother(NULL)
30{
31}
32// -------------------------------------------------------------------------
33
34
35
36// ----- Standard constructor ------------------------------------------
37BmnSsdElement::BmnSsdElement(Int_t address, Int_t level,
38 TGeoPhysicalNode* node,
39 BmnSsdElement* mother) :
40 TNamed(),
41 fAddress(address),
42 fLevel(kSsdSystem),
43 fNode(node),
44 fDaughters(),
45 fMother(mother)
46{
47 SetLevel(level);
48 SetName(ConstructName(address, fLevel).Data());
49}
50// -------------------------------------------------------------------------
51
52
53
54// ----- Construct the name of an element --------------------------------
56
57 // Set the name for the SSD system
58 if ( GetLevel() == kSsdSystem ) {
59 SetName("SSD");
60 return;
61 }
62
63 // Special case half-ladder ("U"p or "D"own)
64 if ( GetLevel() == kSsdHalfLadder ) {
65 TString label;
67 case 0: label = "U"; break;
68 case 1: label = "D"; break;
69 default: break;
70 }
71 SetName( fMother->GetName() + label );
72 return;
73 }
74
75 // For other levels: Expand the name of the mother
76 TString label;
77 switch ( GetLevel() ) {
78 case kSsdUnit: label = "_U"; break;
79 case kSsdLadder: label = "_L"; break;
80 case kSsdModule: label = "_M"; break;
81 case kSsdSensor: label = "_S"; break;
82 default: break;
83 }
84 label += Form("%02i",
86 SetName( fMother->GetName() + label );
87
88}
89// -------------------------------------------------------------------------
90
91
92
93// ----- Construct name from address -----------------------------------
94TString BmnSsdElement::ConstructName(Int_t address,
95 ESsdElementLevel level) {
96
97 TString result = "SSD";
98 if ( level >= kSsdUnit ) {
99 Int_t unit = BmnSsdAddress::GetElementId(address, kSsdUnit);
100 result += Form("_U%02i", unit + 1);
101 if ( level >= kSsdLadder ) {
102 Int_t ladder = BmnSsdAddress::GetElementId(address, kSsdLadder);
103 result += Form("_L%02i", ladder + 1);
104 if ( level >= kSsdHalfLadder ) {
105 Int_t hladder = BmnSsdAddress::GetElementId(address, kSsdHalfLadder);
106 result += (hladder == 0 ? "U" : "D");
107 if ( level >= kSsdModule ) {
108 Int_t module = BmnSsdAddress::GetElementId(address, kSsdModule);
109 result += Form("_M%02i", module + 1);
110 if ( level >= kSsdSensor ) {
111 Int_t sensor = BmnSsdAddress::GetElementId(address, kSsdSensor);
112 result += Form("_S%02i", sensor + 1);
113 } //? sensor
114 } //? module
115 } //? halfladder
116 } //? ladder
117 } //? unit
118
119 return result;
120}
121// -------------------------------------------------------------------------
122
123
124
125// ----- Get a daughter element ----------------------------------------
127 if ( index < 0 || index >=GetNofDaughters() ) return NULL;
128 return fDaughters[index];
129}
130// -------------------------------------------------------------------------
131
132
133
134// ----- Get number of elements at lower hierarchy levels --------------
135Int_t BmnSsdElement::GetNofElements(Int_t level) const {
136
137 Int_t nElements = 0;
138 if ( level <= fLevel ) nElements = 0;
139 else if ( level == fLevel + 1) nElements = GetNofDaughters();
140 else
141 for (Int_t iDaughter = 0; iDaughter < GetNofDaughters(); iDaughter++)
142 nElements += GetDaughter(iDaughter)->GetNofElements(level);
143
144 return nElements;
145}
146// -------------------------------------------------------------------------
147
148
149
150// ----- Recursively read daughters from geometry ----------------------
152
153 // --- Catch absence of TGeoManager
154 assert( gGeoManager );
155
156 // --- No daughter elements below sensor level
157 if ( fLevel > kSsdSensor ) return;
158
159 // --- Catch physical node not being set
160 if ( ! fNode ) {
161 LOG(error) << fName << ": physical node is not set!";
162 return;
163 }
164
165 TGeoNode* mNode = fNode->GetNode(); // This node
166 TString mPath = fNode->GetName(); // Full path to this node
167
168 for (Int_t iNode = 0; iNode < mNode->GetNdaughters(); iNode++) {
169
170 // Check name of daughter node for level name
171 TString dName = mNode->GetDaughter(iNode)->GetName();
172 if ( dName.Contains(BmnSsdSetup::Instance()->GetLevelName(fLevel + 1),
173 TString::kIgnoreCase ) ) {
174
175 // Create physical node
176 TString dPath = mPath + "/" + dName;
177 TGeoPhysicalNode* pNode = new TGeoPhysicalNode(dPath.Data());
178
179 // Create element and add it as daughter
180 UInt_t address = BmnSsdAddress::SetElementId(fAddress,
181 fLevel + 1,
183 BmnSsdElement* dElement = NULL;
184 switch ( fLevel) {
185 case kSsdHalfLadder:
186 dElement = new BmnSsdModule(address, pNode, this); break;
187 default:
188 dElement = new BmnSsdElement(address, fLevel+1, pNode, this); break;
189 }
190 fDaughters.push_back(dElement);
191
192 // Call init method recursively for the daughter elements
193 dElement->InitDaughters();
194
195 } // name of daughter node
196
197 } // daughter node loop
198
199}
200// -------------------------------------------------------------------------
201
202
203
204// ----- Print ---------------------------------------------------------
205void BmnSsdElement::Print(Option_t* opt) const {
206 LOG(info) << setw(10) << right << fAddress << " "
207 << setw(12) << left << fName
208 << " type " << setw(22) << fTitle << " path "
209 << fNode->GetName() << " " << fNode->GetTitle();
210 if ( opt[0] == 'R' ) {
211 for (Int_t iDaughter = 0; iDaughter < GetNofDaughters(); iDaughter++)
212 GetDaughter(iDaughter)->Print("R");
213 }
214}
215// -------------------------------------------------------------------------
216
217
218
219// ----- Set element level ---------------------------------------------
220void BmnSsdElement::SetLevel(Int_t level) {
221 switch (level) {
222 case kSsdSystem: fLevel = kSsdSystem; break;
223 case kSsdUnit : fLevel = kSsdUnit; break;
224 case kSsdLadder: fLevel = kSsdLadder; break;
225 case kSsdHalfLadder: fLevel = kSsdHalfLadder; break;
226 case kSsdModule: fLevel = kSsdModule; break;
227 case kSsdSensor: fLevel = kSsdSensor; break;
228 default: LOG(fatal) << fName << ": Illegal element level "
229 << level; break;
230 }
231}
232// -------------------------------------------------------------------------
ESsdElementLevel
@ kSsdLadder
@ kSsdUnit
@ kSsdNofLevels
@ kSsdSystem
@ kSsdSensor
@ kSsdModule
@ kSsdHalfLadder
Class representing an element of the SSD setup.
virtual void InitDaughters()
TGeoPhysicalNode * fNode
Pointer to geometry.
std::vector< BmnSsdElement * > fDaughters
Array of daughters.
Int_t GetNofDaughters() const
Int_t GetNofElements(Int_t level) const
Int_t fAddress
Unique element address.
BmnSsdElement * GetDaughter(Int_t index) const
virtual void Print(Option_t *opt="") const
BmnSsdElement * fMother
Mother element.
ESsdElementLevel GetLevel() const
ESsdElementLevel fLevel
Level in hierarchy.
void SetLevel(Int_t level)
Class representing an instance of a readout unit in the BMN-SSD.
static BmnSsdSetup * Instance()
const char * GetLevelName(Int_t level)
UInt_t GetElementId(Int_t address, Int_t level)
Get the index of an element.
Int_t SetElementId(Int_t address, Int_t level, UInt_t newId)
Set the index of an element, leaving the other element levels untouched.