1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
16 //-----------------------------------------------------------------
17 // Implementation of the alignment object class through the abstract
18 // class AliAlignObj. From it two derived concrete representation of
19 // alignment object class (AliAlignObjAngles, AliAlignObjMatrix) are
20 // derived in separate files.
21 //-----------------------------------------------------------------
22 /*****************************************************************************
23 * AliAlignObjAngles: derived alignment class storing alignment information *
24 * for a single volume in form of three doubles for the translation *
25 * and three doubles for the rotation expressed with the euler angles *
26 * in the xyz-convention (http://mathworld.wolfram.com/EulerAngles.html), *
27 * also known as roll, pitch, yaw. PLEASE NOTE THE ANGLES SIGNS ARE *
28 * INVERSE WITH RESPECT TO THIS REFERENCE!!! In this way the representation*
29 * is fully consistent with the TGeo Rotation methods. *
30 *****************************************************************************/
32 #include <TGeoManager.h>
33 #include <TGeoPhysicalNode.h>
35 #include "AliAlignObj.h"
36 #include "AliTrackPointArray.h"
38 #include "AliAlignObjAngles.h"
42 Int_t AliAlignObj::fgLayerSize[kLastLayer - kFirstLayer] = {
47 90, 90, 90, 90, 90, 90, // TRD
54 const char* AliAlignObj::fgLayerName[kLastLayer - kFirstLayer] = {
55 "ITS inner pixels layer", "ITS outer pixels layer",
56 "ITS inner drifts layer", "ITS outer drifts layer",
57 "ITS inner strips layer", "ITS outer strips layer",
58 "TPC inner chambers layer", "TPC outer chambers layer",
59 "TRD chambers layer 1", "TRD chambers layer 2", "TRD chambers layer 3",
60 "TRD chambers layer 4", "TRD chambers layer 5", "TRD chambers layer 6",
67 TString* AliAlignObj::fgVolPath[kLastLayer - kFirstLayer] = {
80 AliAlignObj** AliAlignObj::fgAlignObjs[kLastLayer - kFirstLayer] = {
93 //_____________________________________________________________________________
94 AliAlignObj::AliAlignObj():
97 // default constructor
101 //_____________________________________________________________________________
102 AliAlignObj::AliAlignObj(const char* volpath, UShort_t voluid) : TObject()
104 // standard constructor
110 AliAlignObj::AliAlignObj(const char* volpath, ELayerID detId, Int_t volId) : TObject()
112 // standard constructor
115 SetVolUID(detId,volId);
118 //_____________________________________________________________________________
119 AliAlignObj::AliAlignObj(const AliAlignObj& theAlignObj) :
123 fVolPath = theAlignObj.GetVolPath();
124 fVolUID = theAlignObj.GetVolUID();
127 //_____________________________________________________________________________
128 AliAlignObj &AliAlignObj::operator =(const AliAlignObj& theAlignObj)
130 // assignment operator
131 if(this==&theAlignObj) return *this;
132 fVolPath = theAlignObj.GetVolPath();
133 fVolUID = theAlignObj.GetVolUID();
137 //_____________________________________________________________________________
138 AliAlignObj &AliAlignObj::operator*=(const AliAlignObj& theAlignObj)
140 // multiplication operator
141 // The operator can be used to 'combine'
142 // two alignment objects
146 theAlignObj.GetMatrix(m2);
147 m1.MultiplyLeft(&m2);
152 //_____________________________________________________________________________
153 AliAlignObj::~AliAlignObj()
158 //_____________________________________________________________________________
159 void AliAlignObj::SetVolUID(ELayerID detId, Int_t modId)
161 // From detector name and module number (according to detector numbering)
162 // build fVolUID, unique numerical identity of that volume inside ALICE
163 // fVolUID is 16 bits, first 5 reserved for detID (32 possible values),
164 // remaining 11 for module ID inside det (2048 possible values).
166 fVolUID = LayerToVolUID(detId,modId);
169 //_____________________________________________________________________________
170 void AliAlignObj::GetVolUID(ELayerID &layerId, Int_t &modId) const
172 // From detector name and module number (according to detector numbering)
173 // build fVolUID, unique numerical identity of that volume inside ALICE
174 // fVolUID is 16 bits, first 5 reserved for detID (32 possible values),
175 // remaining 11 for module ID inside det (2048 possible values).
177 layerId = VolUIDToLayer(fVolUID,modId);
180 //_____________________________________________________________________________
181 Int_t AliAlignObj::GetLevel() const
183 // Return the geometry level of
184 // the alignable volume to which
185 // the alignment object is associated
186 TString volpath = fVolPath;
187 return (volpath.CountChar('/')+1);
190 //_____________________________________________________________________________
191 Int_t AliAlignObj::Compare(const TObject *obj) const
193 // Compare the levels of two
195 // Used in the sorting during
196 // the application of alignment
197 // objects to the geometry
198 Int_t level = GetLevel();
199 Int_t level2 = ((AliAlignObj *)obj)->GetLevel();
203 return ((level > level2) ? 1 : -1);
206 //_____________________________________________________________________________
207 void AliAlignObj::AnglesToMatrix(const Double_t *angles, Double_t *rot) const
209 // Calculates the rotation matrix using the
210 // Euler angles in "x y z" notation
211 Double_t degrad = TMath::DegToRad();
212 Double_t sinpsi = TMath::Sin(degrad*angles[0]);
213 Double_t cospsi = TMath::Cos(degrad*angles[0]);
214 Double_t sinthe = TMath::Sin(degrad*angles[1]);
215 Double_t costhe = TMath::Cos(degrad*angles[1]);
216 Double_t sinphi = TMath::Sin(degrad*angles[2]);
217 Double_t cosphi = TMath::Cos(degrad*angles[2]);
219 rot[0] = costhe*cosphi;
220 rot[1] = -costhe*sinphi;
222 rot[3] = sinpsi*sinthe*cosphi + cospsi*sinphi;
223 rot[4] = -sinpsi*sinthe*sinphi + cospsi*cosphi;
224 rot[5] = -costhe*sinpsi;
225 rot[6] = -cospsi*sinthe*cosphi + sinpsi*sinphi;
226 rot[7] = cospsi*sinthe*sinphi + sinpsi*cosphi;
227 rot[8] = costhe*cospsi;
230 //_____________________________________________________________________________
231 Bool_t AliAlignObj::MatrixToAngles(const Double_t *rot, Double_t *angles) const
233 // Calculates the Euler angles in "x y z" notation
234 // using the rotation matrix
235 if(TMath::Abs(rot[0])<1e-7 || TMath::Abs(rot[8])<1e-7) return kFALSE;
236 Double_t raddeg = TMath::RadToDeg();
237 angles[0]=raddeg*TMath::ATan2(-rot[5],rot[8]);
238 angles[1]=raddeg*TMath::ASin(rot[2]);
239 angles[2]=raddeg*TMath::ATan2(-rot[1],rot[0]);
243 //______________________________________________________________________________
244 void AliAlignObj::Transform(AliTrackPoint &p) const
246 // The method transforms the space-point coordinates using the
247 // transformation matrix provided by the AliAlignObj
248 // The covariance matrix is not affected since we assume
249 // that the transformations are sufficiently small
251 if (fVolUID != p.GetVolumeID())
252 AliWarning(Form("Alignment object ID is not equal to the space-point ID (%d != %d)",fVolUID,p.GetVolumeID()));
256 Double_t *rot = m.GetRotationMatrix();
257 Double_t *tr = m.GetTranslation();
259 Float_t xyzin[3],xyzout[3];
261 for (Int_t i = 0; i < 3; i++)
270 //_____________________________________________________________________________
271 void AliAlignObj::Transform(AliTrackPointArray &array) const
273 // This method is used to transform all the track points
274 // from the input AliTrackPointArray
276 for (Int_t i = 0; i < array.GetNPoints(); i++) {
279 array.AddPoint(i,&p);
283 //_____________________________________________________________________________
284 void AliAlignObj::Print(Option_t *) const
286 // Print the contents of the
287 // alignment object in angles and
288 // matrix representations
295 const Double_t *rot = m.GetRotationMatrix();
297 printf("Volume=%s\n",GetVolPath());
298 if (GetVolUID() != 0) {
301 GetVolUID(layerId,modId);
302 printf("VolumeID=%d LayerID=%d ( %s ) ModuleID=%d\n", GetVolUID(),layerId,LayerName(layerId),modId);
304 printf("%12.8f%12.8f%12.8f Tx = %12.8f Psi = %12.8f\n", rot[0], rot[1], rot[2], tr[0], angles[0]);
305 printf("%12.8f%12.8f%12.8f Ty = %12.8f Theta = %12.8f\n", rot[3], rot[4], rot[5], tr[1], angles[1]);
306 printf("%12.8f%12.8f%12.8f Tz = %12.8f Phi = %12.8f\n", rot[6], rot[7], rot[8], tr[2], angles[2]);
310 //_____________________________________________________________________________
311 Int_t AliAlignObj::LayerSize(Int_t layerId)
313 // Get the corresponding layer size.
314 // Implemented only for ITS,TPC,TRD,TOF and RICH
315 if (layerId < kFirstLayer || layerId >= kLastLayer) {
316 AliErrorClass(Form("Invalid layer index %d ! Layer range is (%d -> %d) !",layerId,kFirstLayer,kLastLayer));
320 return fgLayerSize[layerId - kFirstLayer];
324 //_____________________________________________________________________________
325 const char* AliAlignObj::LayerName(Int_t layerId)
327 // Get the corresponding layer name.
328 // Implemented only for ITS,TPC,TRD,TOF and RICH
329 if (layerId < kFirstLayer || layerId >= kLastLayer) {
330 AliErrorClass(Form("Invalid layer index %d ! Layer range is (%d -> %d) !",layerId,kFirstLayer,kLastLayer));
331 return "Invalid Layer!";
334 return fgLayerName[layerId - kFirstLayer];
338 //_____________________________________________________________________________
339 UShort_t AliAlignObj::LayerToVolUID(ELayerID layerId, Int_t modId)
341 // From detector (layer) name and module number (according to detector numbering)
342 // build fVolUID, unique numerical identity of that volume inside ALICE
343 // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
344 // remaining 11 for module ID inside det (2048 possible values).
346 return ((UShort_t(layerId) << 11) | UShort_t(modId));
349 //_____________________________________________________________________________
350 UShort_t AliAlignObj::LayerToVolUID(Int_t layerId, Int_t modId)
352 // From detector (layer) index and module number (according to detector numbering)
353 // build fVolUID, unique numerical identity of that volume inside ALICE
354 // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
355 // remaining 11 for module ID inside det (2048 possible values).
357 return ((UShort_t(layerId) << 11) | UShort_t(modId));
360 //_____________________________________________________________________________
361 AliAlignObj::ELayerID AliAlignObj::VolUIDToLayer(UShort_t voluid, Int_t &modId)
363 // From detector (layer) name and module number (according to detector numbering)
364 // build fVolUID, unique numerical identity of that volume inside ALICE
365 // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
366 // remaining 11 for module ID inside det (2048 possible values).
368 modId = voluid & 0x7ff;
370 return VolUIDToLayer(voluid);
373 //_____________________________________________________________________________
374 AliAlignObj::ELayerID AliAlignObj::VolUIDToLayer(UShort_t voluid)
376 // From detector (layer) name and module number (according to detector numbering)
377 // build fVolUID, unique numerical identity of that volume inside ALICE
378 // fVolUID is 16 bits, first 5 reserved for layerID (32 possible values),
379 // remaining 11 for module ID inside det (2048 possible values).
381 return ELayerID((voluid >> 11) & 0x1f);
384 //_____________________________________________________________________________
385 Bool_t AliAlignObj::SetLocalPars(Double_t x, Double_t y, Double_t z,
386 Double_t psi, Double_t theta, Double_t phi)
388 // Set the translations and angles by using parameters
389 // defined in the local (in TGeo means) coordinate system
390 // of the alignable volume. In case that the TGeo was
391 // initialized, returns false and the object parameters are
393 if (!gGeoManager || !gGeoManager->IsClosed()) {
394 AliError("Can't set the alignment object parameters! gGeoManager doesn't exist or it is still opened!");
398 const char* volpath = GetVolPath();
399 TGeoPhysicalNode* node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(volpath);
401 AliError(Form("Volume path %s not valid!",volpath));
404 if (node->IsAligned())
405 AliWarning(Form("Volume %s has been already misaligned!",volpath));
409 tr[0]=x; tr[1]=y; tr[2]=z;
410 m.SetTranslation(tr);
411 Double_t angles[3] = {psi, theta, phi};
413 AnglesToMatrix(angles,rot);
416 TGeoHMatrix align,gprime,gprimeinv;
417 gprime = *node->GetMatrix();
418 gprimeinv = gprime.Inverse();
419 m.Multiply(&gprimeinv);
420 m.MultiplyLeft(&gprime);
427 //_____________________________________________________________________________
428 Bool_t AliAlignObj::ApplyToGeometry()
430 // Apply the current alignment object
431 // to the TGeo geometry
433 if (!gGeoManager || !gGeoManager->IsClosed()) {
434 AliError("Can't apply the alignment object! gGeoManager doesn't exist or it is still opened!");
438 const char* volpath = GetVolPath();
440 if (gGeoManager->GetListOfPhysicalNodes()->FindObject(volpath)) {
441 AliError(Form("Volume %s has been already misaligned!",volpath));
445 if (!gGeoManager->cd(volpath)) {
446 AliError(Form("Volume path %s not valid!",volpath));
450 TGeoPhysicalNode* node = (TGeoPhysicalNode*) gGeoManager->MakePhysicalNode(volpath);
452 AliError(Form("Volume path %s not valid!",volpath));
456 TGeoHMatrix align,gprime;
457 gprime = *node->GetMatrix();
459 gprime.MultiplyLeft(&align);
460 TGeoHMatrix *ginv = new TGeoHMatrix;
461 TGeoHMatrix *g = node->GetMatrix(node->GetLevel()-1);
462 *ginv = g->Inverse();
464 AliAlignObj::ELayerID layerId; // unique identity for volume in the alobj
465 Int_t modId; // unique identity for volume in the alobj
466 GetVolUID(layerId, modId);
467 AliDebug(2,Form("Aligning volume %s of detector layer %d with local ID %d",volpath,layerId,modId));
473 //_____________________________________________________________________________
474 Bool_t AliAlignObj::GetFromGeometry(const char *path, AliAlignObj &alobj)
476 // Get the alignment object which correspond
477 // to the TGeo volume defined by the 'path'.
478 // The method is extremely slow due to the
479 // searching by string. Therefore it should
480 // be used with great care!!
482 // Reset the alignment object
483 alobj.SetPars(0,0,0,0,0,0);
484 alobj.SetVolPath(path);
486 if (!gGeoManager || !gGeoManager->IsClosed()) {
487 AliErrorClass("Can't get the alignment object! gGeoManager doesn't exist or it is still opened!");
491 if (!gGeoManager->GetListOfPhysicalNodes()) {
492 AliErrorClass("Can't get the alignment object! gGeoManager doesn't contain any aligned nodes!");
496 TObjArray* nodesArr = gGeoManager->GetListOfPhysicalNodes();
497 TGeoPhysicalNode* node = NULL;
498 for (Int_t iNode = 0; iNode < nodesArr->GetEntriesFast(); iNode++) {
499 node = (TGeoPhysicalNode*) nodesArr->UncheckedAt(iNode);
500 const char *nodePath = node->GetName();
501 if (strcmp(path,nodePath) == 0) break;
504 if (!gGeoManager->cd(path)) {
505 AliErrorClass(Form("Volume path %s not found!",path));
509 AliWarningClass(Form("Volume (%s) has not been misaligned!",path));
514 TGeoHMatrix align,gprime,g,ginv,l;
515 gprime = *node->GetMatrix();
516 l = *node->GetOriginalMatrix();
517 g = *node->GetMatrix(node->GetLevel()-1);
520 align = gprime * ginv;
521 alobj.SetMatrix(align);
526 //_____________________________________________________________________________
527 void AliAlignObj::InitAlignObjFromGeometry()
529 // Loop over all alignable volumes and extract
530 // the corresponding alignment objects from
533 if(fgAlignObjs[0]) return;
537 for (Int_t iLayer = kFirstLayer; iLayer < AliAlignObj::kLastLayer; iLayer++) {
538 fgAlignObjs[iLayer-kFirstLayer] = new AliAlignObj*[AliAlignObj::LayerSize(iLayer)];
539 for (Int_t iModule = 0; iModule < AliAlignObj::LayerSize(iLayer); iModule++) {
540 UShort_t volid = AliAlignObj::LayerToVolUID(iLayer,iModule);
541 fgAlignObjs[iLayer-kFirstLayer][iModule] = new AliAlignObjAngles("",volid,0,0,0,0,0,0);
542 const char *path = GetVolPath(volid);
543 if (!GetFromGeometry(path, *fgAlignObjs[iLayer-kFirstLayer][iModule]))
544 AliErrorClass(Form("Failed to extract the alignment object for the volume (ID=%d and path=%s) !",volid,path));
550 //_____________________________________________________________________________
551 AliAlignObj* AliAlignObj::GetAlignObj(UShort_t voluid) {
552 // Returns the alignment object for given volume ID
554 ELayerID layerId = VolUIDToLayer(voluid,modId);
555 return GetAlignObj(layerId,modId);
558 //_____________________________________________________________________________
559 AliAlignObj* AliAlignObj::GetAlignObj(ELayerID layerId, Int_t modId)
561 // Returns pointer to alignment object givent its layer and module ID
562 if(modId<0 || modId>=fgLayerSize[layerId-kFirstLayer]){
563 AliWarningClass(Form("Module number %d not in the valid range (0->%d) !",modId,fgLayerSize[layerId-kFirstLayer]-1));
566 return fgAlignObjs[layerId-kFirstLayer][modId];
569 //_____________________________________________________________________________
570 const char* AliAlignObj::GetVolPath(UShort_t voluid) {
571 // Returns the volume path for given volume ID
573 ELayerID layerId = VolUIDToLayer(voluid,modId);
574 return GetVolPath(layerId,modId);
577 //_____________________________________________________________________________
578 const char* AliAlignObj::GetVolPath(ELayerID layerId, Int_t modId)
580 // Returns volume path to alignment object givent its layer and module ID
581 if(modId<0 || modId>=fgLayerSize[layerId-kFirstLayer]){
582 AliWarningClass(Form("Module number %d not in the valid range (0->%d) !",modId,fgLayerSize[layerId-kFirstLayer]-1));
585 return fgVolPath[layerId-kFirstLayer][modId].Data();
588 //_____________________________________________________________________________
589 void AliAlignObj::InitVolPaths()
591 // Initialize the LUTs which contain
592 // the TGeo volume paths for each
593 // alignable volume. The LUTs are
594 // static, so they are created during
595 // the creation of the first intance
598 if (fgVolPath[0]) return;
600 for (Int_t iLayer = 0; iLayer < (kLastLayer - kFirstLayer); iLayer++)
601 fgVolPath[iLayer] = new TString[fgLayerSize[iLayer]];
603 /********************* SPD layer1 ***********************/
606 TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_"; //".../I12A_"
607 TString str1 = "/I10B_"; //"/I10A_";
608 TString str2 = "/I107_"; //"/I103_"
609 // TString str3 = "/I101_1/ITS1_1";
610 TString volpath, volpath1, volpath2;
612 for(Int_t c1 = 1; c1<=10; c1++){
616 for(Int_t c2 =1; c2<=2; c2++){
620 for(Int_t c3 =1; c3<=4; c3++){
624 fgVolPath[kSPD1-kFirstLayer][modnum] = volpath2.Data();
631 /********************* SPD layer2 ***********************/
634 TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_"; //".../I12A_"
635 TString str1 = "/I20B_"; //"/I20A"
636 TString str2 = "/I1D7_"; //"/I1D3"
637 // TString str3 = "/I1D1_1/ITS2_1";
638 TString volpath, volpath1, volpath2;
640 for(Int_t c1 = 1; c1<=10; c1++){
644 for(Int_t c2 =1; c2<=4; c2++){
648 for(Int_t c3 =1; c3<=4; c3++){
652 fgVolPath[kSPD2-kFirstLayer][modnum] = volpath2.Data();
659 /********************* SDD layer1 ***********************/
662 TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT34_1/I004_";
663 TString str1 = "/I302_";
664 // TString str2 = "/ITS3_1";
665 TString volpath, volpath1;
667 for(Int_t c1 = 1; c1<=14; c1++){
671 for(Int_t c2 =1; c2<=6; c2++){
675 fgVolPath[kSDD1-kFirstLayer][modnum] = volpath1.Data();
681 /********************* SDD layer2 ***********************/
684 TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT34_1/I005_";
685 TString str1 = "/I402_";
686 // TString str2 = "/ITS4_1";
687 TString volpath, volpath1;
689 for(Int_t c1 = 1; c1<=22; c1++){
693 for(Int_t c2 = 1; c2<=8; c2++){
697 fgVolPath[kSDD2-kFirstLayer][modnum] = volpath1.Data();
703 /********************* SSD layer1 ***********************/
706 TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT56_1/I565_";
707 TString str1 = "/I562_";
708 // TString str2 = "/ITS5_1";
709 TString volpath, volpath1;
711 for(Int_t c1 = 1; c1<=34; c1++){
715 for(Int_t c2 = 1; c2<=22; c2++){
719 fgVolPath[kSSD1-kFirstLayer][modnum] = volpath1.Data();
725 /********************* SSD layer1 ***********************/
728 TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT56_1/I569_";
729 TString str1 = "/I566_";
730 // TString str2 = "/ITS6_1";
731 TString volpath, volpath1;
733 for(Int_t c1 = 1; c1<=38; c1++){
737 for(Int_t c2 = 1; c2<=25; c2++){
741 fgVolPath[kSSD2-kFirstLayer][modnum] = volpath1.Data();
747 /*************** TPC inner chambers' layer ****************/
750 TString str1 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_1/TPC_SECT_";
751 TString str2 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_2/TPC_SECT_";
752 TString strIn = "/TPC_IROC_1";
755 for(Int_t cnt=1; cnt<=18; cnt++){
759 fgVolPath[kTPC1-kFirstLayer][modnum] = volpath.Data();
762 for(Int_t cnt=1; cnt<=18; cnt++){
766 fgVolPath[kTPC1-kFirstLayer][modnum] = volpath.Data();
771 /*************** TPC outer chambers' layer ****************/
774 TString str1 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_1/TPC_SECT_";
775 TString str2 = "ALIC_1/TPC_M_1/TPC_Drift_1/TPC_ENDCAP_2/TPC_SECT_";
776 TString strOut = "/TPC_OROC_1";
779 for(Int_t cnt=1; cnt<=18; cnt++){
783 fgVolPath[kTPC2-kFirstLayer][modnum] = volpath.Data();
786 for(Int_t cnt=1; cnt<=18; cnt++){
790 fgVolPath[kTPC2-kFirstLayer][modnum] = volpath.Data();
795 /********************* TOF layer ***********************/
801 Int_t nStripSec=nstrA+2*nstrB+2*nstrC;
802 Int_t nStrip=nStripSec*nsec;
804 for (Int_t modnum=0; modnum < nStrip; modnum++) {
806 Int_t sector = modnum/nStripSec;
812 else{ icopy=sector-13;}
814 sprintf(string1,"/ALIC_1/B077_1/BSEGMO%i_1/BTOF%i_1/FTOA_0/FLTA_0",sector,sector);
816 Int_t strInSec=modnum%nStripSec;
819 sprintf(string2,"FSTR_%i",icopy);
821 sprintf(path,"%s/%s",string1,string2);
822 // printf("%d %s\n",modnum,path);
823 fgVolPath[kTOF-kFirstLayer][modnum] = path;
827 /********************* RICH layer ***********************/
829 TString str = "ALIC_1/RICH_";
832 for (Int_t modnum=0; modnum < 7; modnum++) {
834 volpath += (modnum+1);
835 fgVolPath[kRICH-kFirstLayer][modnum] = volpath.Data();
839 /********************* TRD layers 0-6 *******************/
841 TString strSM[18]={"ALIC_1/B077_1/B075_1/BTR3_1/UTR1_3/UTS1_1/UTI1_1/UT",
842 "ALIC_1/B077_1/B075_2/BTR3_1/UTR1_3/UTS1_1/UTI1_1/UT",
843 "ALIC_1/B077_1/B075_3/BTR3_1/UTR1_3/UTS1_1/UTI1_1/UT",
844 "ALIC_1/B077_1/B071_6/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
845 "ALIC_1/B077_1/B071_7/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
846 "ALIC_1/B077_1/B071_8/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
847 "ALIC_1/B077_1/B071_9/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
848 "ALIC_1/B077_1/B071_10/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
849 "ALIC_1/B077_1/B071_11/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
850 "ALIC_1/B077_1/B071_12/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
851 "ALIC_1/B077_1/B071_13/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
852 "ALIC_1/B077_1/B074_1/BTR2_1/UTR1_2/UTS1_1/UTI1_1/UT",
853 "ALIC_1/B077_1/B074_2/BTR2_1/UTR1_2/UTS1_1/UTI1_1/UT",
854 "ALIC_1/B077_1/B071_1/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
855 "ALIC_1/B077_1/B071_2/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
856 "ALIC_1/B077_1/B071_3/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
857 "ALIC_1/B077_1/B071_4/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT",
858 "ALIC_1/B077_1/B071_5/BTR1_1/UTR1_1/UTS1_1/UTI1_1/UT"};
859 TString strPost = "_1";
860 TString zeroStr = "0";
863 Int_t arTRDlayId[6] = {kTRD1, kTRD2, kTRD3, kTRD4, kTRD5, kTRD6};
865 for(Int_t layer=0; layer<6; layer++){
867 for(Int_t sm = 0; sm < 18; sm++){
868 for(Int_t stacknum = 0; stacknum < 5; stacknum++){
869 Int_t chnum = layer + stacknum*6;
871 if(chnum<10) volpath += zeroStr;
874 fgVolPath[arTRDlayId[layer]-kFirstLayer][modnum] = volpath.Data();