BmnRoot
26.10.0-18-g4e3414f9
Software framework of the BM@N experiment
Toggle main menu visibility
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
6
#include "
setup/CbmStsElement.h
"
7
8
#include "
TGeoManager.h
"
9
#include "
TGeoPhysicalNode.h
"
10
#include "
setup/CbmStsSetup.h
"
11
12
// ----- Default constructor -------------------------------------------
13
CbmStsElement::CbmStsElement
()
14
:
TNamed
()
15
,
fAddress
(0)
16
,
fLevel
(
kStsNofLevels
)
17
,
fNode
(NULL)
18
,
fDaughters
()
19
{}
20
// -------------------------------------------------------------------------
21
22
// ----- Standard constructor ------------------------------------------
23
CbmStsElement::CbmStsElement
(
const
char
* name,
const
char
* title,
Int_t
level,
TGeoPhysicalNode
* node)
24
:
TNamed
(name, title)
25
,
fAddress
(0)
26
,
fLevel
(
kStsSystem
)
27
,
fNode
(node)
28
,
fDaughters
()
29
{
30
SetLevel
(level);
31
}
32
// -------------------------------------------------------------------------
33
34
// ----- Add a daughter element ----------------------------------------
35
void
CbmStsElement::AddDaughter
(
CbmStsElement
* 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
}
44
element->
fAddress
=
CbmStsAddress::SetElementId
(
fAddress
, element->
GetLevel
(),
GetNofDaughters
());
45
fDaughters
.push_back(element);
46
}
47
// -------------------------------------------------------------------------
48
49
// ----- Get a daughter element ----------------------------------------
50
CbmStsElement
*
CbmStsElement::GetDaughter
(
Int_t
index)
const
51
{
52
if
(index < 0 || index >=
GetNofDaughters
())
53
return
NULL;
54
return
fDaughters
[index];
55
}
56
// -------------------------------------------------------------------------
57
58
// ----- Recursively read daughters from geometry ----------------------
59
void
CbmStsElement::InitDaughters
()
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
();
84
if
(dName.
Contains
(
CbmStsSetup::GetLevelName
(
fLevel
+ 1),
TString::kIgnoreCase
)) {
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 ---------------------------------------------------------
106
void
CbmStsElement::Print
(
Option_t
* opt)
const
107
{
108
LOG(info) <<
fName
<<
": "
<<
fTitle
<<
", address "
<<
fAddress
<<
", index "
<<
GetIndex
() <<
", level "
109
<<
fLevel
;
110
}
111
// -------------------------------------------------------------------------
112
113
// ----- Set element level ---------------------------------------------
114
void
CbmStsElement::SetLevel
(
Int_t
level)
115
{
116
switch
(level) {
117
case
kStsSystem
:
118
fLevel
=
kStsSystem
;
119
break
;
120
case
kStsStation
:
121
fLevel
=
kStsStation
;
122
break
;
123
case
kStsLadder
:
124
fLevel
=
kStsLadder
;
125
break
;
126
case
kStsHalfLadder
:
127
fLevel
=
kStsHalfLadder
;
128
break
;
129
case
kStsModule
:
130
fLevel
=
kStsModule
;
131
break
;
132
case
kStsSensor
:
133
fLevel
=
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
@ kStsModule
Module.
Definition
CbmStsAddress.h:25
kStsStation
@ kStsStation
Station.
Definition
CbmStsAddress.h:22
kStsLadder
@ kStsLadder
Ladder.
Definition
CbmStsAddress.h:23
kStsSystem
@ kStsSystem
System = STS.
Definition
CbmStsAddress.h:21
kStsNofLevels
@ kStsNofLevels
Number of STS levels.
Definition
CbmStsAddress.h:29
kStsHalfLadder
@ kStsHalfLadder
Halfladder.
Definition
CbmStsAddress.h:24
kStsSensor
@ kStsSensor
Sensor.
Definition
CbmStsAddress.h:26
CbmStsElement.h
CbmStsSetup.h
Int_t
int Int_t
Option_t
const char Option_t
TGeoManager.h
gGeoManager
R__EXTERN TGeoManager * gGeoManager
TGeoPhysicalNode.h
CbmStsAddress::SetElementId
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.
Definition
CbmStsAddress.h:116
CbmStsElement::SetLevel
void SetLevel(Int_t level)
Set the element level from integer Protection against being out of range.
Definition
CbmStsElement.cxx:114
CbmStsElement::AddDaughter
virtual void AddDaughter(CbmStsElement *element)
Add a daughter element The daughter must be one element level higher than the mother.
Definition
CbmStsElement.cxx:35
CbmStsElement::GetLevel
StsElementLevel GetLevel() const
Get the element level.
Definition
CbmStsElement.h:71
CbmStsElement::fAddress
UInt_t fAddress
Unique address.
Definition
CbmStsElement.h:85
CbmStsElement::fLevel
StsElementLevel fLevel
Level in hierarchy.
Definition
CbmStsElement.h:86
CbmStsElement::fDaughters
vector< CbmStsElement * > fDaughters
Array of daughters.
Definition
CbmStsElement.h:88
CbmStsElement::fNode
TGeoPhysicalNode * fNode
Pointer to geometry.
Definition
CbmStsElement.h:87
CbmStsElement::CbmStsElement
CbmStsElement()
Default constructor.
Definition
CbmStsElement.cxx:13
CbmStsElement::Print
virtual void Print(Option_t *opt="") const
Print.
Definition
CbmStsElement.cxx:106
CbmStsElement::GetNofDaughters
Int_t GetNofDaughters() const
Get number of daughter elements.
Definition
CbmStsElement.h:76
CbmStsElement::GetIndex
Int_t GetIndex() const
Get the index within the mother element.
Definition
CbmStsElement.h:66
CbmStsElement::InitDaughters
void InitDaughters()
Initialise daughters from geometry.
Definition
CbmStsElement.cxx:59
CbmStsElement::GetDaughter
CbmStsElement * GetDaughter(Int_t index) const
Get a daughter element.
Definition
CbmStsElement.cxx:50
CbmStsSetup::GetLevelName
static const char * GetLevelName(Int_t level)
Definition
CbmStsSetup.h:30
TGeoNode
TGeoNode::GetNdaughters
Int_t GetNdaughters() const
TGeoNode::GetDaughter
TGeoNode * GetDaughter(Int_t ind) const
TGeoPhysicalNode
TNamed::GetName
const char * GetName() const override
TNamed::fTitle
TString fTitle
TNamed::TNamed
TNamed()
TNamed::fName
TString fName
TString
TString::Data
const char * Data() const
TString::kIgnoreCase
kIgnoreCase
TString::Contains
Bool_t Contains(const char *pat, ECaseCompare cmp=kExact) const
detectors
sts
setup
CbmStsElement.cxx
Generated on
for BmnRoot by
1.17.0