13#include <TGeoManager.h>
26std::unique_ptr<o2::trk::GeometryTGeo> GeometryTGeo::sInstance;
65 LOGP(fatal,
"Invalid use of public constructor: o2::trk::GeometryTGeo instance exists");
82 LOGP(warning,
"Already built");
86 if (gGeoManager ==
nullptr) {
87 LOGP(fatal,
"Geometry is not loaded");
129 int numberOfChipsTotal = 0;
157 std::vector<int> numberOfDiscs;
158 for (
int iDir = 0; iDir < 2; iDir++) {
160 totDiscs += numberOfDiscs[iDir];
161 LOG(
debug) <<
"direction " << iDir <<
"; disk total " << totDiscs;
163 for (
int iDisc = 0; iDisc < numberOfDiscs[iDir]; iDisc++) {
165 if (trkV ==
nullptr) {
169 if (layerNode ==
nullptr) {
173 auto layerVol = layerNode->GetVolume();
174 if (layerVol ==
nullptr) {
177 TObjArray*
nodes = layerVol->GetNodes();
178 int nNodes =
nodes->GetEntriesFast();
181 std::vector<int> chipsPerStave;
182 for (
int j = 0;
j < nNodes;
j++) {
183 auto nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
184 const char*
name = nd->GetName();
185 if (strstr(
name,
"FT3Sensor") !=
nullptr && strstr(
name,
"Inactive") ==
nullptr) {
186 int direction = 0,
layer = 0;
187 int stave = 0, chip = 0;
189 if (stave >= chipsPerStave.size()) {
190 chipsPerStave.resize(stave + 1, 0);
194 if (chip + 1 >= chipsPerStave[stave]) {
195 chipsPerStave[stave] = chip + 1;
200 LOG(
debug) <<
"direction " << iDir <<
" disc " << iDisc <<
" has " << nNodes <<
" nodes of which " << nSensor <<
" sensors in " << chipsPerStave.size() <<
" staves";
202 if (nStaves != chipsPerStave.size()) {
203 LOG(info) <<
"Inconsistency in stave count " << nStaves <<
" " << chipsPerStave.size();
206 for (
int nChips : chipsPerStave) {
207 LOG(
debug) <<
"Absolute Stave ID " << absStaveIdx <<
" : " << nChips <<
" sensors, setting first chip ID for next stave to " <<
mFirstChipIndexStave[absStaveIdx] + nChips;
208 numberOfChipsTotal += nChips;
214 LOG(
debug) <<
"Total sensors so far " << numberOfChipsTotal;
218 if (numberOfChipsTotal > std::numeric_limits<unsigned short>::max()) {
219 LOG(fatal) <<
"Too many sensor chips in TRK: " << numberOfChipsTotal;
225 LOG(info) <<
"Build done";
285 }
else if (subDetID == 1) {
290 }
else if (subDetID == 2) {
306 int firstDetLayer = 0;
314 }
else if (subDetID == 2) {
328 }
else if (subDetID == 1) {
337 int chipsPerModule = Nchip;
338 int chipsPerHalfStave = Nmod * chipsPerModule;
339 int chipsPerStave = Nhs * chipsPerHalfStave;
340 return index / chipsPerStave;
341 }
else if (Nhs == 1) {
342 int chipsPerModule = Nchip;
343 int chipsPerStave = Nmod * chipsPerModule;
344 return index / chipsPerStave;
346 }
else if (subDetID == 2) {
366 }
else if (subDetID == 1) {
374 int chipsPerModule = Nchip;
375 int chipsPerHalfStave = Nmod * chipsPerModule;
376 int chipsPerStave = Nhs * chipsPerHalfStave;
378 int rem =
index % chipsPerStave;
379 return rem / chipsPerHalfStave;
393 }
else if (subDetID == 1) {
402 int chipsPerModule = Nchip;
403 int chipsPerHalfStave = Nmod * chipsPerModule;
404 int rem =
index % (Nhs * chipsPerHalfStave);
405 rem = rem % chipsPerHalfStave;
406 return rem / chipsPerModule;
407 }
else if (Nhs == 1) {
408 int chipsPerModule = Nchip;
409 int rem =
index % (Nmod * chipsPerModule);
410 return rem / chipsPerModule;
425 }
else if (subDetID == 1) {
434 int chipsPerModule = Nchip;
435 return index % chipsPerModule;
436 }
else if (Nhs == 1) {
437 int chipsPerModule = Nchip;
438 return index % chipsPerModule;
440 }
else if (subDetID == 2) {
457 }
else if (subDetID == 1) {
463 int chipsPerModule = Nchip;
464 int chipsPerHalfStave = Nmod * chipsPerModule;
465 int chipsPerStave = Nhs * chipsPerHalfStave;
466 return getFirstChipIndex(lay, petalcase, subDetID) + stave * chipsPerStave + halfstave * chipsPerHalfStave + mod * chipsPerModule + chip;
467 }
else if (Nhs == 1) {
468 int chipsPerModule = Nchip;
469 int chipsPerStave = Nmod * chipsPerModule;
470 return getFirstChipIndex(lay, petalcase, subDetID) + stave * chipsPerStave + mod * chipsPerModule + chip;
474 LOGP(warning,
"Chip index not found for subDetID {}, petalcase {}, disk {}, layer {}, stave {}, halfstave {}, module {}, chip {}, returning numeric limit", subDetID, petalcase, disk, lay, stave, halfstave, mod, chip);
475 return std::numeric_limits<unsigned short>::max();
484 }
else if (subDetID == 1) {
490 int chipsPerModule = Nchip;
491 int chipsPerHalfStave = Nmod * chipsPerModule;
492 int chipsPerStave = Nhs * chipsPerHalfStave;
493 return getFirstChipIndex(lay, -1, subDetID) + stave * chipsPerStave + halfstave * chipsPerHalfStave + mod * chipsPerModule + chip;
494 }
else if (Nhs == 1) {
495 int chipsPerModule = Nchip;
496 int chipsPerStave = Nmod * chipsPerModule;
497 return getFirstChipIndex(lay, -1, subDetID) + stave * chipsPerStave + mod * chipsPerModule + chip;
499 }
else if (subDetID == 2) {
504 LOGP(warning,
"Chip index not found for subDetID {}, volume {}, layer {}, stave {}, halfstave {}, module {}, chip {}, returning numeric limit", subDetID, volume, lay, stave, halfstave, mod, chip);
505 return std::numeric_limits<unsigned short>::max();
532 int subDetID, petalcase, disk,
layer, stave, halfstave, mod, chip;
546 }
else if (
layer >= 0) {
553 }
else if (subDetID == 1) {
566 }
else if (subDetID == 2) {
573 path += Form(
"FT3Sensor_Active_%d_%d_%d_%d_%d", direction,
layer, stave, chip, chip);
589 static TGeoHMatrix matTmp;
590 gGeoManager->PushPath();
592 if (!gGeoManager->cd(
path.Data())) {
593 gGeoManager->PopPath();
594 LOG(error) <<
"Error in cd-ing to " <<
path.Data();
598 matTmp = *gGeoManager->GetCurrentMatrix();
603 gGeoManager->PopPath();
605 static int chipInGlo{0};
640 size_t newSize = nSensMLOT + nSensMLOTDisk;
643 for (
int i = 0;
i < nSensMLOT;
i++) {
647 for (
int i = nSensMLOT;
i < newSize;
i++) {
658 LOG(warning) <<
"The method Build was not called yet";
666 LOGP(info,
"Loading {} L2G matrices from TGeo; there are {} matrices",
getName(),
mSize);
668 cacheL2G.setSize(
mSize);
672 cacheL2G.setMatrix(
Mat3D(*hm),
i);
678 LOGP(info,
"Loading {} T2L matrices from TGeo for ML & OT",
getName());
682 cacheT2L.setSize(m_Size);
683 for (
int i = 0;
i < m_Size;
i++) {
686 cacheT2L.setMatrix(
Mat3D(hm),
i);
696#ifdef ENABLE_UPGRADES
732 if (volName.find(
"FT3Sensor_Active") == 0) {
733 int idx = volName.find(
'_') + 1;
734 idx = volName.find(
'_', idx) + 1;
735 int direction = std::stoi(volName.substr(idx));
736 idx = volName.find(
'_', idx) + 1;
737 layer = std::stoi(volName.substr(idx));
738 idx = volName.find(
'_', idx) + 1;
739 stave = std::stoi(volName.substr(idx));
740 idx = volName.find(
'_', idx) + 1;
741 chip = std::stoi(volName.substr(idx));
742 if (direction == 1) {
746 LOG(error) <<
"extractChipIdsFT3: Not a sensor volume " << volName;
765 if (!nms.BeginsWith(prefix)) {
768 nms.Remove(0, strlen(prefix));
769 if (!isdigit(nms.Data()[0])) {
778 int numberOfLayers = 0;
780 if (trkV ==
nullptr) {
786 TObjArray*
nodes = trkV->GetNodes();
788 int nNodes =
nodes->GetEntriesFast();
789 for (
int j = 0;
j < nNodes;
j++) {
791 auto nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
792 const char*
name = nd->GetName();
796 LOG(fatal) <<
"Failed to extract layer ID from the " <<
name;
802 LOG(fatal) <<
"Failed to extract wrapper ID from the " <<
name;
804 TObjArray* nodesW = nd->GetNodes();
805 int nNodesW = nodesW->GetEntriesFast();
807 for (
int jw = 0; jw < nNodesW; jw++) {
808 auto ndW =
dynamic_cast<TGeoNode*
>(nodesW->At(jw))->GetName();
811 LOGP(fatal,
"Failed to extract layer ID from wrapper volume '{}' from one of its nodes '{}'",
name, ndW);
819 return numberOfLayers;
825 int numberOfPetals = 0;
833 TObjArray*
nodes = trkV->GetNodes();
839 LOGP(info,
"Searching for petal assemblies in {} (pattern: {})",
842 for (
int j = 0;
j <
nodes->GetEntriesFast();
j++) {
843 auto* nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
844 const char*
name = nd->GetName();
848 LOGP(info,
"Found petal assembly: {}",
name);
851 TGeoVolume* petalVol = nd->GetVolume();
853 TObjArray* petalNodes = petalVol->GetNodes();
855 LOGP(
debug,
"Petal {} contains {} child nodes",
name, petalNodes->GetEntriesFast());
857 for (
int k = 0; k < petalNodes->GetEntriesFast(); k++) {
858 auto* petalNode =
dynamic_cast<TGeoNode*
>(petalNodes->At(k));
859 LOGP(
debug,
" Node {}: {}", k, petalNode->GetName());
862 LOGP(warning,
"Petal {} has no child nodes",
name);
865 LOGP(warning,
"Petal {} has no volume",
name);
870 if (numberOfPetals == 0) {
871 LOGP(warning,
"No petal assemblies found in geometry");
873 LOGP(info,
"Found {} petal assemblies", numberOfPetals);
876 return numberOfPetals;
883 int numberOfParts = 0;
891 TObjArray*
nodes = vdV->GetNodes();
897 bool petalFound =
false;
899 for (
int j = 0;
j <
nodes->GetEntriesFast();
j++) {
900 auto* nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
901 const char*
name = nd->GetName();
907 LOGP(info,
"Counting active parts in petal: {}",
name);
910 TGeoVolume* petalVol = nd->GetVolume();
912 LOGP(warning,
"Petal {} has no volume",
name);
916 TObjArray* petalNodes = petalVol->GetNodes();
918 LOGP(warning,
"Petal {} has no child nodes",
name);
922 for (
int k = 0; k < petalNodes->GetEntriesFast(); k++) {
923 auto* petalNode =
dynamic_cast<TGeoNode*
>(petalNodes->At(k));
924 const char* nodeName = petalNode->GetName();
929 LOGP(
debug,
"Found active part in {}: {}",
name, nodeName);
941 if (numberOfParts == 0) {
942 LOGP(warning,
"No active parts (layers/disks) found in petal");
948 LOGP(info,
"Total number of active parts: {} ({}*{})",
957 int numberOfDisks = 0;
965 TObjArray*
nodes = vdV->GetNodes();
971 bool petalFound =
false;
973 for (
int j = 0;
j <
nodes->GetEntriesFast();
j++) {
974 auto* nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
980 LOGP(info,
"Counting disks in petal: {}", nd->GetName());
983 TGeoVolume* petalVol = nd->GetVolume();
985 LOGP(warning,
"Petal {} has no volume", nd->GetName());
989 TObjArray* petalNodes = petalVol->GetNodes();
991 LOGP(warning,
"Petal {} has no child nodes", nd->GetName());
995 for (
int k = 0; k < petalNodes->GetEntriesFast(); k++) {
996 auto* petalNode =
dynamic_cast<TGeoNode*
>(petalNodes->At(k));
999 LOGP(info,
"Found disk in {} : {}", nd->GetName(), petalNode->GetName());
1010 if (numberOfDisks == 0) {
1011 LOGP(warning,
"No disks found in VD geometry");
1014 return numberOfDisks;
1021 int numberOfLayers = 0;
1029 TObjArray*
nodes = vdV->GetNodes();
1035 bool petalFound =
false;
1037 for (
int j = 0;
j <
nodes->GetEntriesFast();
j++) {
1038 auto* nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
1044 LOGP(info,
"Counting layers in petal: {}", nd->GetName());
1047 TGeoVolume* petalVol = nd->GetVolume();
1049 LOGP(warning,
"Petal {} has no volume", nd->GetName());
1053 TObjArray* petalNodes = petalVol->GetNodes();
1055 LOGP(warning,
"Petal {} has no child nodes", nd->GetName());
1059 for (
int k = 0; k < petalNodes->GetEntriesFast(); k++) {
1060 auto* petalNode =
dynamic_cast<TGeoNode*
>(petalNodes->At(k));
1063 LOGP(info,
"Found layer in {} : {}", nd->GetName(), petalNode->GetName());
1074 if (numberOfLayers == 0) {
1075 LOGP(warning,
"No layers found in VD geometry");
1078 return numberOfLayers;
1085 int numberOfChips = 0;
1093 TObjArray*
nodes = vdV->GetNodes();
1099 bool petalFound =
false;
1101 for (
int j = 0;
j <
nodes->GetEntriesFast();
j++) {
1102 auto* nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
1103 const char*
name = nd->GetName();
1109 LOGP(info,
"Counting chips in petal: {}",
name);
1112 TGeoVolume* petalVol = nd->GetVolume();
1114 LOGP(warning,
"Petal {} has no volume",
name);
1118 TObjArray* petalNodes = petalVol->GetNodes();
1120 LOGP(warning,
"Petal {} has no child nodes",
name);
1124 for (
int k = 0; k < petalNodes->GetEntriesFast(); k++) {
1125 auto* petalNode =
dynamic_cast<TGeoNode*
>(petalNodes->At(k));
1126 const char* nodeName = petalNode->GetName();
1127 TGeoVolume* vol = petalNode->GetVolume();
1130 LOGP(
debug,
"Node {} has no volume", nodeName);
1135 TObjArray* subNodes = vol->GetNodes();
1137 LOGP(
debug,
"Node {} has no sub-nodes", nodeName);
1141 for (
int i = 0;
i < subNodes->GetEntriesFast();
i++) {
1142 auto* subNode =
dynamic_cast<TGeoNode*
>(subNodes->At(
i));
1145 LOGP(
debug,
"Found chip in {}: {}", nodeName, subNode->GetName());
1157 if (numberOfChips == 0) {
1158 LOGP(warning,
"No chips/sensors found in VD petal");
1161 LOGP(info,
"Number of chips per petal: {}", numberOfChips);
1162 return numberOfChips;
1168 int numberOfStaves = 0;
1171 TGeoVolume* layV = gGeoManager->GetVolume(layName.c_str());
1173 if (layV ==
nullptr) {
1178 TObjArray*
nodes = layV->GetNodes();
1181 int nNodes =
nodes->GetEntriesFast();
1183 for (
int j = 0;
j < nNodes;
j++) {
1185 auto nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
1186 const char*
name = nd->GetName();
1191 return numberOfStaves;
1197 int numberOfHalfStaves = 0;
1200 TGeoVolume* staveV = gGeoManager->GetVolume(staveName.c_str());
1202 if (staveV ==
nullptr) {
1207 TObjArray*
nodes = staveV->GetNodes();
1210 int nNodes =
nodes->GetEntriesFast();
1212 for (
int j = 0;
j < nNodes;
j++) {
1213 auto nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
1214 const char*
name = nd->GetName();
1216 numberOfHalfStaves++;
1220 if (numberOfHalfStaves == 0) {
1221 numberOfHalfStaves = 1;
1223 return numberOfHalfStaves;
1229 int numberOfModules = 0;
1232 TGeoVolume* staveV = gGeoManager->GetVolume(staveName.c_str());
1234 if (staveV ==
nullptr) {
1239 TObjArray*
nodes = staveV->GetNodes();
1240 int nNodes =
nodes->GetEntriesFast();
1242 for (
int j = 0;
j < nNodes;
j++) {
1243 auto nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
1244 const char*
name = nd->GetName();
1249 return numberOfModules;
1255 int numberOfChips = 0;
1258 TGeoVolume* moduleV = gGeoManager->GetVolume(moduleName.c_str());
1260 if (moduleV ==
nullptr) {
1265 TObjArray*
nodes = moduleV->GetNodes();
1266 int nNodes =
nodes->GetEntriesFast();
1268 for (
int j = 0;
j < nNodes;
j++) {
1269 auto nd =
dynamic_cast<TGeoNode*
>(
nodes->At(
j));
1270 const char*
name = nd->GetName();
1275 return numberOfChips;
1281 std::cout <<
"\nindex = " <<
index << std::endl;
1282 std::cout <<
"subDetID = " << subDetID << std::endl;
1283 std::cout <<
"petalcase = " << petalcase << std::endl;
1284 std::cout <<
"layer = " << lay << std::endl;
1285 std::cout <<
"disk = " << disk << std::endl;
1286 std::cout <<
"first chip index = " <<
getFirstChipIndex(lay, petalcase, subDetID) << std::endl;
1287 std::cout <<
"stave = " << stave << std::endl;
1288 std::cout <<
"halfstave = " << halfstave << std::endl;
1289 std::cout <<
"module = " << mod << std::endl;
1290 std::cout <<
"chip = " << chip << std::endl;
1297 LOGF(info,
"Geometry not built yet!");
1300 std::cout <<
"Detector ID: " << sInstance.get()->getDetID() << std::endl;
1302 LOGF(info,
"Summary of GeometryTGeo: %s",
getName());
1308 LOGF(info,
"Number of chips per petal VD: ");
1312 LOGF(info,
"Number of staves and half staves per layer MLOT: ");
1314 std::string mlot =
"";
1318 LOGF(info,
"Number of modules per stave (half stave) in each ML(OT) layer: ");
1322 LOGF(info,
"Number of chips per module MLOT: ");
1326 LOGF(info,
"Number of chips per layer MLOT: ");
1342 std::cout <<
"mLastChipIndexVD = [";
1349 std::cout <<
"]" << std::endl;
1363 if (subDetID < 0 || subDetID > 1) {
1364 LOG(error) <<
"getBarrelLayer(): Invalid subDetID for barrel: " << subDetID
1365 <<
". Expected values are 0 or 1.";
1369 if (subLayerID < 0 || subLayerID > 7) {
1370 LOG(error) <<
"getBarrelLayer(): Invalid subLayerID for barrel: " << subDetID
1371 <<
". Expected values are between 0 and 7.";
1375 const int baseOffsets[] = {0, 3};
1377 return baseOffsets[subDetID] + subLayerID;
1384 double locA[3] = {-100., 0., 0.}, locB[3] = {100., 0., 0.}, gloA[3], gloB[3];
1385 double xp{0}, yp{0};
1389 LOG(error) <<
"extractSensorXAlphaMLOT(): VD layers are not supported yet! chipID = " << chipID;
1394 matL2G->LocalToMaster(locA, gloA);
1395 matL2G->LocalToMaster(locB, gloB);
1396 double dx = gloB[0] - gloA[0], dy = gloB[1] - gloA[1];
1397 double t = (gloB[0] * dx + gloB[1] * dy) / (dx * dx + dy * dy);
1398 xp = gloB[0] - dx * t;
1399 yp = gloB[1] - dy * t;
1402 alp = std::atan2(yp, xp);
1403 x = std::hypot(xp, yp);
1404 o2::math_utils::bringTo02Pi(alp);
1417 LOG(error) <<
"createT2LMatrixMLOT(): VD layers are not supported yet! chipID = " << chipID
1418 <<
"returning dummy values! ";
1419 static TGeoHMatrix dummy;
1423 static TGeoHMatrix t2l;
1426 t2l.RotateZ(
alpha * TMath::RadToDeg());
1428 const TGeoHMatrix& matL2Gi = matL2G->Inverse();
1429 t2l.MultiplyLeft(&matL2Gi);
Definition of the SegmentationChipclass.
static const TRKBaseParam & Instance()
Static class with identifiers, bitmasks and names for ALICE detectors.
const MatrixCache< Mat3D > & getCacheT2L() const
const char * getName() const
int mSize
prebooked number of sensors
const MatrixCache< Mat3D > & getCacheL2G() const
static const char * composeSymNameModule(int d, int layer)
int extractNumberOfDisksMLOT(int dir) const
Determines the number of active parts in the Geometry.
static const char * getTRKPetalDiskPattern()
int getModule(int index) const
static std::string sPetalAssemblyName
static const char * getTRKStavePattern()
int getPetalCase(int index) const
static const char * getTRKChipPattern()
std::vector< int > mNumberOfChipsPerLayerVD
number of chips per layer VD ( = number of petals)
static std::string sVolumeName
int getSubDetID(int index) const
std::array< char, MAXLAYERS > mLayerToWrapper
Layer to wrapper correspondence, not implemented yet.
static const char * composeSymNameChip(int d, int layer)
static std::string sPetalLayerName
static const char * getTRKSensorPattern()
static std::string sStaveName
bool getChipID(int index, int &subDetID, int &petalcase, int &disk, int &lay, int &stave, int &halfstave, int &mod, int &chip) const
std::vector< int > mNumberOfHalfStaves
Number Of Half staves in each stave of the layer in ML/OT.
int extractNumberOfChipsPerPetalVD() const
bool isTrackingFrameCachedMLOT() const
int extractNumberOfHalfStavesMLOT(int lay) const
static const char * getTRKPetalLayerPattern()
int getChip(int index) const
static std::string sFT3ChipName
Chip name.
int extractNumberOfLayersMLOT()
int extractNumberOfChipsMLOT(int lay) const
std::vector< int > mNumbersOfChipPerDiskVD
numbersOfChipPerDiskVD
std::vector< int > mNumberOfStaves
Number Of Staves per layer in ML/OT barrels.
static const char * getFT3LayerPattern()
Int_t mNumberOfPetalsVD
number of Petals = chip in each VD layer
static std::string sFT3PassiveName
Passive material name.
std::vector< int > mNumberOfModules
Number Of Modules per stave (half stave) in ML/OT.
static std::string sPetalName
void fillTrackingFramesCacheMLOT()
int extractNumberOfStavesMLOT(int lay) const
static std::string sPetalDiskName
void Print(Option_t *opt="") const
float getSensorRefAlphaMLOT(int chipId) const
int getLayer(int index) const
local layer index within the sub-detector (0-based per VD/MLOT)
std::vector< unsigned short > mLastChipIndexVD
max ID of the detector in the layer for the VD
static const char * getTRKWrapVolPattern()
std::vector< float > mCacheRefXMLOT
TString getMatrixPath(int index) const
static const char * getTRKPetalAssemblyPattern()
static std::string sFT3VolumeName
Mother volume name.
int getNumberOfChips() const
static const char * getTRKLayerPattern()
static std::string sHalfStaveName
std::vector< unsigned short > mFirstChipIndexStave
Index of first chip on stave (Discs)
unsigned short getFirstChipIndex(int lay, int petalcase, int subDetID) const
std::vector< int > mNumberOfChips
number of chips per module in ML/OT
static std::string sFT3SensorName
Sensor name.
std::vector< unsigned short > mFirstStaveIndexDisc
Index of first stave (abs ID) in each MLOT Disc.
o2::math_utils::Transform3D Mat3D
static std::string sWrapperVolumeName
Wrapper volume name, not implemented at the moment.
static std::string sServiceVolName
TGeoHMatrix & createT2LMatrixMLOT(int)
std::vector< float > mCacheRefAlphaMLOT
cache for X of ML and OT
static const char * getTRKHalfStavePattern()
int extractNumberOfLayersVD() const
std::vector< int > mNumberOfChipsPerPetalVD
numbersOfChipPerPetalVD
static std::string sMetalStackName
static std::string sChipName
static std::string sSensorName
static const char * composeSymNameLayerFT3(int dir, int layer)
void fillMatrixCache(int mask)
std::vector< int > sensorsMLOT
is it owned by the singleton?
static std::string sDeadzoneName
void extractChipIdsFT3(std::string const volName, int &layer, int &stave, int &chip) const
Extract number following the prefix in the name string.
static std::string sLayerName
unsigned short getChipIndex(int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const
int extractNumberOfActivePartsVD() const
void PrintChipID(int index, int subDetID, int petalcase, int disk, int lay, int stave, int halfstave, int mod, int chip) const
static const char * composeSymNameSensor(int d, int layer)
int extractNumberOfModulesMLOT(int lay) const
static std::string sFT3InnerVolumeName
Mother inner volume name.
int extractNumberOfDisksVD() const
static std::string sFT3LayerName
Layer name.
int getLayerTRK(int index) const
global layer index across the full TRK (VD layers 0..nVD-1, MLOT layers nVD..nTotal-1)
static const char * getTRKPetalPattern()
Int_t mNumberOfActivePartsVD
number of layers
std::vector< int > mNumberOfChipsPerLayerMLOT
number of chips per layer MLOT
Int_t mNumberOfDisksVD
number of Disks = 6
Int_t mNumberOfLayersMLOT
number of layers
std::vector< unsigned short > mFirstChipIndexMLOTDisc
ID of the first sensor chip in the layer for the MLOT; array size is one larger than the number of di...
static const char * composeSymNameLayer(int d, int layer)
int getStave(int index) const
int getBarrelLayer(int) const
static const char * getTRKVolPattern()
static const char * getTRKModulePattern()
static const char * composeSymNameStave(int d, int layer)
int getDisk(int index) const
int extractNumberOfPetalsVD() const
int extractVolumeCopy(const char *name, const char *prefix) const
std::vector< unsigned short > mLastChipIndex
max ID of the detector in the petal(VD) or layer(MLOT)
void extractSensorXAlphaMLOT(int, float &, float &)
Int_t mNumberOfDisksMLOT
number of ML/OT disks (12 for v3)
void Build(int loadTrans)
eMLOTLayout mLayoutMLOT
cache for sensor ref alpha ML and OT
Int_t mNumberOfLayersVD
number of layers
int getHalfStave(int index) const
GeometryTGeo(bool build=false, int loadTrans=0)
TGeoHMatrix * extractMatrixSensor(int index) const
static std::string sModuleName
GLfloat GLfloat GLfloat alpha
GLuint const GLchar * name
GLsizei const GLchar *const * path
GLenum GLuint GLint GLint layer
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"