@@ -34,6 +34,7 @@ std::string GeometryTGeo::sITOFSensorName = "ITOFSensor";
3434// Outer TOF
3535std::string GeometryTGeo::sOTOFLayerName = " OTOFLayer" ;
3636std::string GeometryTGeo::sOTOFStaveName = " OTOFStave" ;
37+ std::string GeometryTGeo::sOTOFSubStaveName = " OTOFSubStave" ;
3738std::string GeometryTGeo::sOTOFModuleName = " OTOFModule" ;
3839std::string GeometryTGeo::sOTOFChipName = " OTOFChip" ;
3940std::string GeometryTGeo::sOTOFSensorName = " OTOFSensor" ;
@@ -81,11 +82,38 @@ int GeometryTGeo::extractNumberOfStavesIOTOF(int lay) const
8182 return numberOfStaves;
8283}
8384
85+ int GeometryTGeo::extractNumberOfSubStavesIOTOF (int lay) const
86+ {
87+ if (lay == 0 ) {
88+ return 1 ;
89+ }
90+
91+ int numberOfSubStaves{0 };
92+
93+ std::string staveName = GeometryTGeo::getOTOFStavePattern ();
94+ TGeoVolume* staveV = gGeoManager ->GetVolume (staveName.c_str ());
95+ if (staveV == nullptr ) {
96+ LOG (fatal) << " Can't find volume " << staveName;
97+ return -1 ;
98+ }
99+
100+ TObjArray* nodes = staveV->GetNodes ();
101+ int nNodes = nodes->GetEntriesFast ();
102+
103+ for (int j{0 }; j < nNodes; ++j) {
104+ if (strstr (nodes->At (j)->GetName (), GeometryTGeo::getOTOFSubStavePattern ()) != nullptr ) {
105+ numberOfSubStaves++;
106+ }
107+ }
108+
109+ return numberOfSubStaves;
110+ }
111+
84112int GeometryTGeo::extractNumberOfModulesIOTOF (int lay) const
85113{
86114 int numberOfModules{0 };
87115
88- std::string staveName = lay == 0 ? GeometryTGeo::getITOFStavePattern () : GeometryTGeo::getOTOFStavePattern ();
116+ std::string staveName = lay == 0 ? GeometryTGeo::getITOFStavePattern () : GeometryTGeo::getOTOFSubStavePattern ();
89117 TGeoVolume* staveV = gGeoManager ->GetVolume (staveName.c_str ());
90118 if (staveV == nullptr ) {
91119 LOG (fatal) << " Can't find volume " << staveName;
@@ -151,33 +179,27 @@ int GeometryTGeo::getIOTOFLayer(int index) const
151179 return index > mLastChipIndex [0 ] ? 1 : 0 ;
152180}
153181
154- int GeometryTGeo::getIOTOFChipIndex (int lay, int sta, int mod, int chip) const
182+ int GeometryTGeo::getIOTOFChipIndex (int lay, int sta, int substa, int mod, int chip) const
155183{
156- return getIOTOFFirstChipIndex (lay) + (sta - 1 ) * mNumberOfChipsPerStaveIOTOF [lay] + (mod - 1 ) * mNumberOfChipsPerModuleIOTOF [lay] + (chip - 1 );
184+ return getIOTOFFirstChipIndex (lay) + (sta - 1 ) * mNumberOfChipsPerStaveIOTOF [lay] + (substa - 1 ) * mNumberOfChipsPerSubStaveIOTOF [lay] + ( mod - 1 ) * mNumberOfChipsPerModuleIOTOF [lay] + (chip - 1 );
157185}
158186
159- bool GeometryTGeo::getIOTOFChipId (int index, int & lay, int & sta, int & mod, int & chip) const
187+ bool GeometryTGeo::getIOTOFChipId (int index, int & lay, int & sta, int & substa, int & mod, int & chip) const
160188{
161189 lay = getIOTOFLayer (index);
162190 index -= getIOTOFFirstChipIndex (lay);
163191 sta = mNumberOfStavesIOTOF [lay] > 0 ? index / mNumberOfChipsPerStaveIOTOF [lay] : -1 ;
164192 index %= mNumberOfChipsPerStaveIOTOF [lay];
193+ substa = mNumberOfSubStavesIOTOF [lay] > 0 ? index / mNumberOfChipsPerSubStaveIOTOF [lay] : -1 ;
194+ index %= mNumberOfChipsPerSubStaveIOTOF [lay];
165195 mod = mNumberOfModulesIOTOF [lay] > 0 ? index / mNumberOfChipsPerModuleIOTOF [lay] : -1 ;
166196 chip = index % mNumberOfChipsPerModuleIOTOF [lay];
167197 return true ;
168198}
169199
170- const ChipSpecifics& GeometryTGeo::getChipSpecifics (int iotofLayer)
171- {
172- if (iotofLayer == 0 ) {
173- return ITOFChipSpecificParam::Instance ();
174- }
175- return OTOFChipSpecificParam::Instance ();
176- }
177-
178200o2::math_utils::Point3D<float > GeometryTGeo::detectorToLocal (int row, int col, int chipId) const
179201{
180- const auto & specs = getChipSpecifics ( getIOTOFLayer (chipId) );
202+ const auto & specs = ChipSpecificsParam::Instance ( );
181203 o2::math_utils::Point3D<float > loc;
182204 loc.SetCoordinates (0 .5f * ((specs.ActiveMatrixSizeRows () - specs.PassiveEdgeTop + specs.PassiveEdgeReadOut ) - specs.PitchRow ) - row * specs.PitchRow ,
183205 0 .f ,
@@ -187,11 +209,12 @@ o2::math_utils::Point3D<float> GeometryTGeo::detectorToLocal(int row, int col, i
187209
188210TString GeometryTGeo::getMatrixPath (int index) const
189211{
190- int lay, sta, mod, chip;
191- getIOTOFChipId (index, lay, sta, mod, chip);
212+ int lay, sta, substa, mod, chip;
213+ getIOTOFChipId (index, lay, sta, substa, mod, chip);
192214
193215 TString path = Form (" /cave_1/barrel_1/%s_2/" , GeometryTGeo::getIOTOFVolPattern ());
194216 sta += 1 ;
217+ substa += 1 ;
195218 mod += 1 ;
196219 chip += 1 ;
197220
@@ -211,6 +234,9 @@ TString GeometryTGeo::getMatrixPath(int index) const
211234 if (mNumberOfStavesIOTOF [lay] > 0 ) {
212235 path += Form (" %s_%d/" , GeometryTGeo::getOTOFStavePattern (), sta);
213236 }
237+ if (mNumberOfSubStavesIOTOF [lay] > 0 ) {
238+ path += Form (" %s_%d/" , GeometryTGeo::getOTOFSubStavePattern (), substa);
239+ }
214240 if (mNumberOfModulesIOTOF [lay] > 0 ) {
215241 path += Form (" %s_%d/" , GeometryTGeo::getOTOFModulePattern (), mod);
216242 }
@@ -266,6 +292,7 @@ void GeometryTGeo::Build(int loadTrans)
266292 // Inner/outer TOF
267293 for (int j{0 }; j < 2 ; ++j) {
268294 mNumberOfStavesIOTOF [j] = extractNumberOfStavesIOTOF (j);
295+ mNumberOfSubStavesIOTOF [j] = extractNumberOfSubStavesIOTOF (j);
269296 mNumberOfModulesIOTOF [j] = extractNumberOfModulesIOTOF (j);
270297 mNumberOfChipsPerModuleIOTOF [j] = extractNumberOfChipsPerModuleIOTOF (j);
271298 }
@@ -278,14 +305,15 @@ void GeometryTGeo::Build(int loadTrans)
278305
279306 int numberOfChips{0 };
280307 for (int j{0 }; j < 2 ; ++j) {
281- mNumberOfChipsPerStaveIOTOF [j] = mNumberOfModulesIOTOF [j] * mNumberOfChipsPerModuleIOTOF [j];
308+ mNumberOfChipsPerStaveIOTOF [j] = mNumberOfSubStavesIOTOF [j] * mNumberOfModulesIOTOF [j] * mNumberOfChipsPerModuleIOTOF [j];
309+ mNumberOfChipsPerSubStaveIOTOF [j] = mNumberOfModulesIOTOF [j] * mNumberOfChipsPerModuleIOTOF [j];
282310 mNumberOfChipsIOTOF [j] = mNumberOfStavesIOTOF [j] * mNumberOfChipsPerStaveIOTOF [j];
283311 numberOfChips += mNumberOfChipsIOTOF [j];
284312 mLastChipIndex [j] = numberOfChips - 1 ;
285313 }
286314
287315 LOG (info) << " TF3 geometry: numberOfChipsITOF = " << mNumberOfChipsIOTOF [0 ] << " , numberOfChipsOTOF = "
288- << mNumberOfChipsIOTOF [1 ] << " , numberOfChips = " << numberOfChips << " , mNumberOfChipesPerStaveITOF "
316+ << mNumberOfChipsIOTOF [1 ] << " , numberOfChips = " << numberOfChips << " , mNumberOfChipsPerStaveITOF "
289317 << mNumberOfChipsPerStaveIOTOF [0 ];
290318
291319 setSize (numberOfChips);
0 commit comments