BmnRoot 26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Loading...
Searching...
No Matches
CbmStsElement.cxx
Go to the documentation of this file.
1/** @file CbmStsElement.cxx
2 ** @author Volker Friese <v.friese@gsi.de>
3 ** @date 27.05.2013
4 **/
5
7
8#include "TGeoManager.h"
9#include "TGeoPhysicalNode.h"
10#include "setup/CbmStsSetup.h"
11
12// ----- Default constructor -------------------------------------------
14 : TNamed()
15 , fAddress(0)
17 , fNode(NULL)
18 , fDaughters()
19{}
20// -------------------------------------------------------------------------
21
22// ----- Standard constructor ------------------------------------------
23CbmStsElement::CbmStsElement(const char* name, const char* title, Int_t level, TGeoPhysicalNode* node)
24 : TNamed(name, title)
25 , fAddress(0)
27 , fNode(node)
28 , fDaughters()
29{
30 SetLevel(level);
31}
32// -------------------------------------------------------------------------
33
34// ----- Add a daughter element ----------------------------------------
36{
37 if (!element)
38 return;
39 if (element->GetLevel() != fLevel + 1) {
40 LOG(error) << fName << ": Trying to add an element of level " << element->GetLevel() << " as daughter of level "
41 << fLevel << "! Command will be ignored.";
42 return;
43 }
45 fDaughters.push_back(element);
46}
47// -------------------------------------------------------------------------
48
49// ----- Get a daughter element ----------------------------------------
51{
52 if (index < 0 || index >= GetNofDaughters())
53 return NULL;
54 return fDaughters[index];
55}
56// -------------------------------------------------------------------------
57
58// ----- Recursively read daughters from geometry ----------------------
60{
61
62 // --- Catch absence of TGeoManager
63 if (!gGeoManager) {
64 LOG(error) << fName << ": cannot initialise without TGeoManager!";
65 return;
66 }
67
68 // --- No daughter elements below sensor level
69 if (fLevel > kStsSensor)
70 return;
71
72 // --- Catch physical node not being set
73 if (!fNode) {
74 LOG(error) << fName << ": physical node is not set!";
75 return;
76 }
77
78 TGeoNode* mNode = fNode->GetNode(); // This node
79 TString mPath = fNode->GetName(); // Path to this node
80 for (Int_t iNode = 0; iNode < mNode->GetNdaughters(); iNode++) {
81
82 // Check name of daughter node for level name
83 TString dName = mNode->GetDaughter(iNode)->GetName();
85
86 // Create physical node
87 const char* name = "";
88 const char* title = CbmStsSetup::GetLevelName(fLevel + 1);
89 TString dPath = mPath + "/" + dName;
90 TGeoPhysicalNode* pnNode = new TGeoPhysicalNode(dPath.Data());
91
92 // Create element and add it as daughter
93 CbmStsElement* dElement = new CbmStsElement(name, title, fLevel + 1, pnNode);
94 AddDaughter(dElement);
95
96 // Call method recursively for the daughter elements
97 dElement->InitDaughters();
98
99 } // name of daughter node
100
101 } // daughter node loop
102}
103// -------------------------------------------------------------------------
104
105// ----- Print ---------------------------------------------------------
107{
108 LOG(info) << fName << ": " << fTitle << ", address " << fAddress << ", index " << GetIndex() << ", level "
109 << fLevel;
110}
111// -------------------------------------------------------------------------
112
113// ----- Set element level ---------------------------------------------
115{
116 switch (level) {
117 case kStsSystem:
119 break;
120 case kStsStation:
122 break;
123 case kStsLadder:
125 break;
126 case kStsHalfLadder:
128 break;
129 case kStsModule:
131 break;
132 case kStsSensor:
134 break;
135 default:
136 LOG(error) << fName << ": trying to set the level to " << level << " while max. level is "
137 << kStsNofLevels - 1;
138 break;
139 }
140}
141// -------------------------------------------------------------------------
@ kStsModule
Module.
@ kStsStation
Station.
@ kStsLadder
Ladder.
@ kStsSystem
System = STS.
@ kStsNofLevels
Number of STS levels.
@ kStsHalfLadder
Halfladder.
@ kStsSensor
Sensor.
int Int_t
const char Option_t
R__EXTERN TGeoManager * gGeoManager
static UInt_t SetElementId(UInt_t address, Int_t level, Int_t newId)
Set the index of an element leaving the other element levels untouched.
void SetLevel(Int_t level)
Set the element level from integer Protection against being out of range.
virtual void AddDaughter(CbmStsElement *element)
Add a daughter element The daughter must be one element level higher than the mother.
StsElementLevel GetLevel() const
Get the element level.
UInt_t fAddress
Unique address.
StsElementLevel fLevel
Level in hierarchy.
vector< CbmStsElement * > fDaughters
Array of daughters.
TGeoPhysicalNode * fNode
Pointer to geometry.
CbmStsElement()
Default constructor.
virtual void Print(Option_t *opt="") const
Print.
Int_t GetNofDaughters() const
Get number of daughter elements.
Int_t GetIndex() const
Get the index within the mother element.
void InitDaughters()
Initialise daughters from geometry.
CbmStsElement * GetDaughter(Int_t index) const
Get a daughter element.
static const char * GetLevelName(Int_t level)
Definition CbmStsSetup.h:30
Int_t GetNdaughters() const
TGeoNode * GetDaughter(Int_t ind) const
const char * GetName() const override
TString fTitle
TString fName
const char * Data() const
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const