#include <TGeometry.h>
#include <TLorentzVector.h>
#include <TGeoMatrix.h>
+#include <TGeoPhysicalNode.h>
#include <TArrayD.h>
#include <TArrayF.h>
#include <TString.h>
#include <TTUBE.h>
#include <TGeoManager.h>
#include <TGeoVolume.h>
+#include <TVirtualMC.h>
#include "AliITS.h"
#include "AliITSDetTypeSim.h"
-#include "AliITSGeant3Geometry.h"
#include "AliITSgeom.h"
#include "AliITSgeomSDD.h"
#include "AliITSgeomSPD.h"
ClassImp(AliITSvPPRasymmFMD)
//______________________________________________________________________
-AliITSvPPRasymmFMD::AliITSvPPRasymmFMD() {
+AliITSvPPRasymmFMD::AliITSvPPRasymmFMD(): AliITS(),
+fGeomDetOut(kFALSE),
+fGeomDetIn(kFALSE),
+fByThick(kTRUE),
+fMajorVersion(IsVersion()),
+fMinorVersion(-1),
+fDet1(0),
+fDet2(0),
+fChip1(0),
+fChip2(0),
+fRails(0),
+fFluid(0),
+fIDMother(0)
+ {
// Standard default constructor for the ITS version 10.
// Inputs:
// none.
// Return:
// none.
Int_t i;
-
- fIdN = 0;
- fIdName = 0;
- fIdSens = 0;
- fEuclidOut = kFALSE; // Don't write Euclide file
- fGeomDetOut = kFALSE; // Don't write .det file
- fGeomDetIn = kFALSE; // Read .det file
- fMajorVersion = IsVersion();
- fMinorVersion = -1;
for(i=0;i<60;i++) fRead[i] = '\0';
for(i=0;i<60;i++) fWrite[i] = '\0';
for(i=0;i<60;i++) fEuclidGeomDet[i] = '\0';
}
//______________________________________________________________________
AliITSvPPRasymmFMD::AliITSvPPRasymmFMD(const char *name, const char *title)
- : AliITS("ITS", title){
+ : AliITS("ITS", title),
+ fGeomDetOut(kFALSE),
+ fGeomDetIn(kFALSE),
+ fByThick(kTRUE),
+ fMajorVersion(IsVersion()),
+ fMinorVersion(2),
+ fDet1(0),
+ fDet2(0),
+ fChip1(0),
+ fChip2(0),
+ fRails(0),
+ fFluid(0),
+ fIDMother(0) {
// Standard constructor for the ITS version 10.
// Inputs:
// const char * name Ignored, set to "ITS"
fIdName[5] = "ITS6";
fIdSens = new Int_t[fIdN];
for(i=0;i<fIdN;i++) fIdSens[i] = 0;
- fMajorVersion = IsVersion();
- fMinorVersion = 2;
- fEuclidOut = kFALSE; // Don't write Euclide file
- fGeomDetOut = kFALSE; // Don't write .det file
- fGeomDetIn = kFALSE; // Read .det file
SetThicknessDet1();
SetThicknessDet2();
SetThicknessChip1();
strncpy(fRead,"$ALICE_ROOT/ITS/ITSgeometry_vPPRasymmFMD.det",60);
}
//______________________________________________________________________
-AliITSvPPRasymmFMD::AliITSvPPRasymmFMD(const AliITSvPPRasymmFMD &source) :
- AliITS(source){
- // Copy Constructor for ITS version 10. This function is not to be
- // used. If any other instance of this function, other than "this" is
- // passed, an error message is returned.
- // Inputs:
- // const AliITSvPPRasymmFMD &source This class
- // Outputs:
- // none.
- // Return:
- // an error message
-
- if(&source == this) return;
- Warning("Copy Constructor","Not allowed to copy AliITSvPPRasymmFMD");
- return;
-}
-//______________________________________________________________________
-AliITSvPPRasymmFMD& AliITSvPPRasymmFMD::operator=(const AliITSvPPRasymmFMD
- &source){
- // Assignment operator for the ITS version 10. This function is not
- // to be used. If any other instance of this function, other than "this"
- // is passed, an error message is returned.
- // Inputs:
- // const AliITSvPPRasymmFMD &source This class
- // Outputs:
- // none.
- // Return:
- // an error message
-
- if(&source == this) return *this;
- Warning("= operator","Not allowed to copy AliITSvPPRasymmFMD");
- return *this;
-}
-//______________________________________________________________________
AliITSvPPRasymmFMD::~AliITSvPPRasymmFMD() {
// Standard destructor for the ITS version 10.
// Inputs:
// none.
}
//______________________________________________________________________
+void AliITSvPPRasymmFMD::AddAlignableVolumes() const
+{
+ //
+ // Creates entries for alignable volumes associating the symbolic volume
+ // name with the corresponding volume path.
+ //
+ // Records in the alignable entries the transformation matrices converting
+ // TGeo local coordinates (in the RS of alignable volumes) to the tracking
+ // system
+ // For this, this function has to run before the misalignment because we
+ // are using the ideal positions in the AliITSgeom object.
+
+ AliInfo("Add ITS alignable volumes");
+
+ if (!gGeoManager) {
+ AliFatal("TGeoManager doesn't exist !");
+ return;
+ }
+
+ if( !gGeoManager->SetAlignableEntry("ITS","ALIC_1/ITSV_1") )
+ AliFatal("Unable to set alignable entry!!");
+
+ Double_t al, *gtrans, rotMatrix[9];
+
+ TString strSPD = "ITS/SPD";
+ TString strSDD = "ITS/SDD";
+ TString strSSD = "ITS/SSD";
+ TString strStave = "/Stave";
+ TString strLadder = "/Ladder";
+ TString strSector = "/Sector";
+ TString strSensor = "/Sensor";
+ TString strEntryName1;
+ TString strEntryName2;
+ TString strEntryName3;
+
+ //===== SPD layer1 =====
+ {
+ TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_";
+ TString str1 = "/I10B_";
+ TString str2 = "/I107_";
+
+ TString sector;
+ TString stave;
+ TString module;
+
+ for(Int_t c1 = 1; c1<=10; c1++){
+
+ sector = str0;
+ sector += c1; // this is one full sector
+ strEntryName1 = strSPD;
+ strEntryName1 += 0;
+ strEntryName1 += strSector;
+ strEntryName1 += (c1-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName1.Data(),sector.Data());
+
+ for(Int_t c2 =1; c2<=2; c2++){
+
+ stave = sector;
+ stave += str1;
+ stave += c2;
+ strEntryName2 = strEntryName1;
+ strEntryName2 += strStave;
+ strEntryName2 += (c2-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),stave.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName2.Data(),stave.Data()); // this is a stave
+
+ for(Int_t c3 =1; c3<=4; c3++){
+
+ module = stave;
+ module += str2;
+ module += c3;
+ strEntryName3 = strEntryName2;
+ strEntryName3 += strLadder;
+ strEntryName3 += (c3-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),module.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName3.Data(),module.Data());
+
+ // Creates the TGeo Local to Tracking transformation matrix ...
+ TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(strEntryName3.Data());
+ const char *path = alignableEntry->GetTitle();
+ if (!gGeoManager->cd(path))
+ AliFatal(Form("Volume path %s not valid!",path));
+ TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix();
+ gtrans = globMatrix->GetTranslation();
+ memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t));
+ al = TMath::ATan2(rotMatrix[1],rotMatrix[0]);
+ TGeoHMatrix *matLtoT = new TGeoHMatrix;
+ matLtoT->SetDx( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) ); // translation
+ al += TMath::Pi()/2;
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) );
+ // Not taking into account the shift w.r.t. sensitive volume
+ // correction with fChip1*0.0001/2. is due to the fact
+ // that the alignable volume is not the sensitive volume
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) - fChip1*0.0001/2.);
+ matLtoT->SetDy(-fChip1*0.0001/2.);
+ matLtoT->SetDz(-gtrans[2]);
+ rotMatrix[0]= 0; rotMatrix[1]= 1; rotMatrix[2]= 0; // + rotation
+ rotMatrix[3]=-1; rotMatrix[4]= 0; rotMatrix[5]= 0; // ! flip in y for the SPD1 only
+ rotMatrix[6]= 0; rotMatrix[7]= 0; rotMatrix[8]=-1;
+ TGeoRotation rot;
+ rot.SetMatrix(rotMatrix);
+ matLtoT->MultiplyLeft(&rot);
+ TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse());
+ delete matLtoT;
+ alignableEntry->SetMatrix(matTtoL);
+ }
+ }
+ }
+ }
+
+ //===== SPD layer2 =====
+ {
+ TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_";
+ TString str1 = "/I20B_";
+ TString str2 = "/I1D7_";
+
+ TString sector;
+ TString stave;
+ TString module;
+
+ for(Int_t c1 = 1; c1<=10; c1++){
+
+ sector = str0;
+ sector += c1; // this is one full sector
+ strEntryName1 = strSPD;
+ strEntryName1 += 1;
+ strEntryName1 += strSector;
+ strEntryName1 += (c1-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName1.Data(),sector.Data());
+
+ for(Int_t c2 =1; c2<=4; c2++){
+
+ stave = sector;
+ stave += str1;
+ stave += c2;
+ strEntryName2 = strEntryName1;
+ strEntryName2 += strStave;
+ strEntryName2 += (c2-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),stave.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName2.Data(),stave.Data()); // this is a stave
+
+ for(Int_t c3 =1; c3<=4; c3++){
+
+ module = stave;
+ module += str2;
+ module += c3;
+ strEntryName3 = strEntryName2;
+ strEntryName3 += strLadder;
+ strEntryName3 += (c3-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),module.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName3.Data(),module.Data());
+
+ // Creates the TGeo Local to Tracking transformation matrix ...
+ TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(strEntryName3.Data());
+ const char *path = alignableEntry->GetTitle();
+ if (!gGeoManager->cd(path))
+ AliFatal(Form("Volume path %s not valid!",path));
+ TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix();
+ gtrans = globMatrix->GetTranslation();
+ memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t));
+ al = TMath::ATan2(rotMatrix[1],rotMatrix[0]) + TMath::Pi();
+ TGeoHMatrix *matLtoT = new TGeoHMatrix;
+ matLtoT->SetDx(-gtrans[0]*TMath::Cos(al)-gtrans[1]*TMath::Sin(al) ); // translation
+ al += TMath::Pi()/2;
+ //matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) );
+ // not taking into account the shift w.r.t. sensitive volume
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) + fChip2*0.0001/2.);
+ matLtoT->SetDy(-fChip2*0.0001/2.);
+ matLtoT->SetDz(-gtrans[2]);
+ rotMatrix[0]= 0; rotMatrix[1]= 1; rotMatrix[2]= 0; // + rotation
+ rotMatrix[3]= 1; rotMatrix[4]= 0; rotMatrix[5]= 0;
+ rotMatrix[6]= 0; rotMatrix[7]= 0; rotMatrix[8]=-1;
+ TGeoRotation rot;
+ rot.SetMatrix(rotMatrix);
+ matLtoT->MultiplyLeft(&rot);
+ TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse());
+ delete matLtoT;
+ alignableEntry->SetMatrix(matTtoL);
+ }
+ }
+ }
+ }
+
+ //===== SDD layer1 =====
+ {
+ TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT34_1/I004_";
+ TString str1 = "/I302_";
+
+ TString ladder;
+ TString wafer;
+
+ for(Int_t c1 = 1; c1<=14; c1++){
+
+ ladder = str0;
+ ladder += c1; // the set of wafers from one ladder
+ strEntryName1 = strSDD;
+ strEntryName1 += 2;
+ strEntryName1 +=strLadder;
+ strEntryName1 += (c1-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
+
+ for(Int_t c2 =1; c2<=6; c2++){
+
+ wafer = ladder;
+ wafer += str1;
+ wafer += c2; // one wafer
+ strEntryName2 = strEntryName1;
+ strEntryName2 += strSensor;
+ strEntryName2 += (c2-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
+
+ // Creates the TGeo Local to Tracking transformation matrix ...
+ TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(strEntryName2.Data());
+ const char *path = alignableEntry->GetTitle();
+ if (!gGeoManager->cd(path))
+ AliFatal(Form("Volume path %s not valid!",path));
+ TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix();
+ gtrans = globMatrix->GetTranslation();
+ memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t));
+ al = TMath::ATan2(rotMatrix[1],rotMatrix[0]) + TMath::Pi();
+ TGeoHMatrix *matLtoT = new TGeoHMatrix;
+ matLtoT->SetDx(-gtrans[0]*TMath::Cos(al)-gtrans[1]*TMath::Sin(al) ); // translation
+ al += TMath::Pi()/2;
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) );
+ matLtoT->SetDy( 0 );
+ matLtoT->SetDz(-gtrans[2]);
+ rotMatrix[0]=0; rotMatrix[1]=1; rotMatrix[2]=0; // + rotation
+ rotMatrix[3]=1; rotMatrix[4]=0; rotMatrix[5]=0;
+ rotMatrix[6]=0; rotMatrix[7]=0; rotMatrix[8]=-1;
+ TGeoRotation rot;
+ rot.SetMatrix(rotMatrix);
+ matLtoT->MultiplyLeft(&rot);
+ TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse());
+ delete matLtoT;
+ alignableEntry->SetMatrix(matTtoL);
+ }
+ }
+ }
+
+ //===== SDD layer2 =====
+ {
+ TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT34_1/I005_";
+ TString str1 = "/I402_";
+
+ TString ladder;
+ TString wafer;
+
+ for(Int_t c1 = 1; c1<=22; c1++){
+
+ ladder = str0;
+ ladder += c1; // the set of wafers from one ladder
+ strEntryName1 = strSDD;
+ strEntryName1 += 3;
+ strEntryName1 +=strLadder;
+ strEntryName1 += (c1-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
+
+ for(Int_t c2 =1; c2<=8; c2++){
+
+ wafer = ladder;
+ wafer += str1;
+ wafer += c2; // one wafer
+ strEntryName2 = strEntryName1;
+ strEntryName2 += strSensor;
+ strEntryName2 += (c2-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
+
+ // Creates the TGeo Local to Tracking transformation matrix ...
+ TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(strEntryName2.Data());
+ const char *path = alignableEntry->GetTitle();
+ if (!gGeoManager->cd(path))
+ AliFatal(Form("Volume path %s not valid!",path));
+ TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix();
+ gtrans = globMatrix->GetTranslation();
+ memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t));
+ al = TMath::ATan2(rotMatrix[1],rotMatrix[0]) + TMath::Pi();
+ TGeoHMatrix *matLtoT = new TGeoHMatrix;
+ matLtoT->SetDx(-gtrans[0]*TMath::Cos(al)-gtrans[1]*TMath::Sin(al) ); // translation
+ al += TMath::Pi()/2;
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) );
+ matLtoT->SetDy( 0 );
+ matLtoT->SetDz(-gtrans[2]);
+ rotMatrix[0]=0; rotMatrix[1]=1; rotMatrix[2]=0; // + rotation
+ rotMatrix[3]=1; rotMatrix[4]=0; rotMatrix[5]=0;
+ rotMatrix[6]=0; rotMatrix[7]=0; rotMatrix[8]=-1;
+ TGeoRotation rot;
+ rot.SetMatrix(rotMatrix);
+ matLtoT->MultiplyLeft(&rot);
+ TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse());
+ delete matLtoT;
+ alignableEntry->SetMatrix(matTtoL);
+ }
+ }
+ }
+
+ //===== SSD layer1 =====
+ {
+ TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT56_1/I565_";
+ TString str1 = "/I562_";
+
+ TString ladder;
+ TString wafer;
+
+ for(Int_t c1 = 1; c1<=34; c1++){
+
+ ladder = str0;
+ ladder += c1; // the set of wafers from one ladder
+ strEntryName1 = strSSD;
+ strEntryName1 += 4;
+ strEntryName1 +=strLadder;
+ strEntryName1 += (c1-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
+
+ for(Int_t c2 = 1; c2<=22; c2++){
+
+ wafer = ladder;
+ wafer += str1;
+ wafer += c2; // one wafer
+ strEntryName2 = strEntryName1;
+ strEntryName2 += strSensor;
+ strEntryName2 += (c2-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
+
+ // Creates the TGeo Local to Tracking transformation matrix ...
+ TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(strEntryName2.Data());
+ const char *path = alignableEntry->GetTitle();
+ if (!gGeoManager->cd(path))
+ AliFatal(Form("Volume path %s not valid!",path));
+ TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix();
+ gtrans = globMatrix->GetTranslation();
+ memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t));
+ al = TMath::ATan2(rotMatrix[1],rotMatrix[0]) + TMath::Pi();
+ TGeoHMatrix *matLtoT = new TGeoHMatrix;
+ matLtoT->SetDx(-gtrans[0]*TMath::Cos(al)-gtrans[1]*TMath::Sin(al) ); // translation
+ al += TMath::Pi()/2;
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) );
+ matLtoT->SetDy( 0 );
+ matLtoT->SetDz(-gtrans[2]);
+ rotMatrix[0]=0; rotMatrix[1]=1; rotMatrix[2]=0; // + rotation
+ rotMatrix[3]=1; rotMatrix[4]=0; rotMatrix[5]=0;
+ rotMatrix[6]=0; rotMatrix[7]=0; rotMatrix[8]=-1;
+ TGeoRotation rot;
+ rot.SetMatrix(rotMatrix);
+ matLtoT->MultiplyLeft(&rot);
+ TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse());
+ delete matLtoT;
+ alignableEntry->SetMatrix(matTtoL);
+ }
+ }
+ }
+
+ //===== SSD layer2 =====
+ {
+ TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT56_1/I569_";
+ TString str1 = "/I566_";
+
+ TString ladder;
+ TString wafer;
+
+ for(Int_t c1 = 1; c1<=38; c1++){
+
+ ladder = str0;
+ ladder += c1; // the set of wafers from one ladder
+ strEntryName1 = strSSD;
+ strEntryName1 += 5;
+ strEntryName1 +=strLadder;
+ strEntryName1 += (c1-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
+
+ for(Int_t c2 = 1; c2<=25; c2++){
+
+ wafer = ladder;
+ wafer += str1;
+ wafer += c2; // one wafer
+ strEntryName2 = strEntryName1;
+ strEntryName2 += strSensor;
+ strEntryName2 += (c2-1);
+ if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
+ AliFatal("Unable to set alignable entry!!");
+ //printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
+
+ // Creates the TGeo Local to Tracking transformation matrix ...
+ TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntry(strEntryName2.Data());
+ const char *path = alignableEntry->GetTitle();
+ if (!gGeoManager->cd(path))
+ AliFatal(Form("Volume path %s not valid!",path));
+ TGeoHMatrix* globMatrix = gGeoManager->GetCurrentMatrix();
+ gtrans = globMatrix->GetTranslation();
+ memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t));
+ al = TMath::ATan2(rotMatrix[1],rotMatrix[0]) + TMath::Pi();
+ TGeoHMatrix *matLtoT = new TGeoHMatrix;
+ matLtoT->SetDx(-gtrans[0]*TMath::Cos(al)-gtrans[1]*TMath::Sin(al) ); // translation
+ al += TMath::Pi()/2;
+ // matLtoT->SetDy( gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al) );
+ matLtoT->SetDy( 0 );
+ matLtoT->SetDz(-gtrans[2]);
+ rotMatrix[0]=0; rotMatrix[1]=1; rotMatrix[2]=0; // + rotation
+ rotMatrix[3]=1; rotMatrix[4]=0; rotMatrix[5]=0;
+ rotMatrix[6]=0; rotMatrix[7]=0; rotMatrix[8]=-1;
+ TGeoRotation rot;
+ rot.SetMatrix(rotMatrix);
+ matLtoT->MultiplyLeft(&rot);
+ TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse());
+ delete matLtoT;
+ alignableEntry->SetMatrix(matTtoL);
+ }
+ }
+ }
+}
+//______________________________________________________________________
void AliITSvPPRasymmFMD::BuildGeometry(){
// Geometry builder for the ITS version 10. Event Display geometry.
// Inputs:
}// end if
- AliInfo(Form("Detector thickness on layer 1 is set to %f microns",ddet1));
- AliInfo(Form("Chip thickness on layer 1 is set to %f microns",dchip1));
- AliInfo(Form("Detector thickness on layer 2 is set to %f microns",ddet2));
- AliInfo(Form("Chip thickness on layer 2 is set to %f microns",dchip2));
+ AliDebug(1,Form("Detector thickness on layer 1 is set to %f microns",ddet1));
+ AliDebug(1,Form("Chip thickness on layer 1 is set to %f microns",dchip1));
+ AliDebug(1,Form("Detector thickness on layer 2 is set to %f microns",ddet2));
+ AliDebug(1,Form("Chip thickness on layer 2 is set to %f microns",dchip2));
if(rails == 0 ) {
- AliInfo("Rails are out.");
+ AliDebug(1,"Rails are out.");
} else {
- AliInfo("Rails are in.");
+ AliDebug(1,"Rails are in.");
}// end if
ddet1 = ddet1*0.0001/2.; // conversion from tot length in um to half in cm
dgh[46] = 62;
dgh[47] = 85.;
dgh[48] = ztpc+4.+0.1;
- dgh[49] = 62.4;
+ dgh[49] = 62.0;//62.4;
dgh[50] = 85.;
gMC->Gsvolu("ITSV", "PCON", idtmed[205], dgh, 51);
gMC->Gspos("I116",1,"I113",0.0,0.0042,0.0,0,"ONLY");
gMC->Gspos("I111",1,"I113",-0.1318,-0.0008,0.0,idrotm[204],"ONLY");
gMC->Gspos("I112",1,"I113",-0.25,0.02,0.0,idrotm[203],"ONLY");
- gMC->Gspos("I106",1,"I107",0.0,-dchip1,-1.4,0,"ONLY");
- gMC->Gspos("I106",2,"I107",0.0,-dchip1,0.0,0,"ONLY");
- gMC->Gspos("I106",3,"I107",0.0,-dchip1,1.4,0,"ONLY");
- gMC->Gspos("I106",4,"I107",0.0,-dchip1,2.8,0,"ONLY");
- gMC->Gspos("I106",5,"I107",0.0,-dchip1,-2.8,0,"ONLY");
- gMC->Gspos("I101",1,"I107",0.0,ddet1,0.0,0,"ONLY");
- gMC->Gspos("I1D6",1,"I1D7",0.0,-dchip2,-1.4,0,"ONLY");
- gMC->Gspos("I1D6",2,"I1D7",0.0,-dchip2,0.0,0,"ONLY");
- gMC->Gspos("I1D6",3,"I1D7",0.0,-dchip2,1.4,0,"ONLY");
- gMC->Gspos("I1D6",4,"I1D7",0.0,-dchip2,2.8,0,"ONLY");
- gMC->Gspos("I1D6",5,"I1D7",0.0,-dchip2,-2.8,0,"ONLY");
- gMC->Gspos("I1D1",1,"I1D7",0.0,ddet2,0.0,0,"ONLY");
+ gMC->Gspos("I106",1,"I107",0.0,-ddet1,-1.4,0,"ONLY");
+ gMC->Gspos("I106",2,"I107",0.0,-ddet1,0.0,0,"ONLY");
+ gMC->Gspos("I106",3,"I107",0.0,-ddet1,1.4,0,"ONLY");
+ gMC->Gspos("I106",4,"I107",0.0,-ddet1,2.8,0,"ONLY");
+ gMC->Gspos("I106",5,"I107",0.0,-ddet1,-2.8,0,"ONLY");
+ gMC->Gspos("I101",1,"I107",0.0,dchip1,0.0,0,"ONLY");
+ gMC->Gspos("I1D6",1,"I1D7",0.0,-ddet2,-1.4,0,"ONLY");
+ gMC->Gspos("I1D6",2,"I1D7",0.0,-ddet2,0.0,0,"ONLY");
+ gMC->Gspos("I1D6",3,"I1D7",0.0,-ddet2,1.4,0,"ONLY");
+ gMC->Gspos("I1D6",4,"I1D7",0.0,-ddet2,2.8,0,"ONLY");
+ gMC->Gspos("I1D6",5,"I1D7",0.0,-ddet2,-2.8,0,"ONLY");
+ gMC->Gspos("I1D1",1,"I1D7",0.0,dchip2,0.0,0,"ONLY");
gMC->Gspos("I117",1,"I116",0.0,0.0,0.0,0,"ONLY");
gMC->Gspos("ITS1",1,"I101",0.0,0.0,0.0,0,"ONLY");
gMC->Gspos("ITS2",1,"I1D1",0.0,0.0,0.0,0,"ONLY");
// none.
const Int_t knlayers = 6;
const Int_t kndeep = 3;
- const AliITSDetector idet[knlayers]={kSPD,kSPD,kSDD,kSDD,kSSD,kSSD};
- const TString names[2][knlayers] = {
+ const AliITSDetector kidet[knlayers]={kSPD,kSPD,kSDD,kSDD,kSSD,kSSD};
+ const TString knames[2][knlayers] = {
{"/ALIC_1/ITSV_1/ITSD_1/IT12_1/I12A_%d/I10A_%d/I103_%d/I101_1/ITS1_1", // lay=1
"/ALIC_1/ITSV_1/ITSD_1/IT12_1/I12A_%d/I20A_%d/I1D3_%d/I1D1_1/ITS2_1", // lay=2
"/ALIC_1/ITSV_1/ITSD_1/IT34_1/I004_%d/I302_%d/ITS3_%d", // lay=3
"/ALIC_1/ITSV_1/ITSD_1/IT56_1/I565_%d/I562_%d/ITS5_%d", // lay=5
"/ALIC_1/ITSV_1/ITSD_1/IT56_1/I569_%d/I566_%d/ITS6_%d"}
};
- const Int_t itsGeomTreeCopys[knlayers][kndeep]= {{10, 2, 4},// lay=1
+ const Int_t kitsGeomTreeCopys[knlayers][kndeep]= {{10, 2, 4},// lay=1
{10, 4, 4},// lay=2
{14, 6, 1},// lay=3
{22, 8, 1},// lay=4
mod = 0;
for(i=0;i<knlayers;i++){
k = 1;
- for(j=0;j<kndeep;j++) if(itsGeomTreeCopys[i][j]!=0)
- k *= TMath::Abs(itsGeomTreeCopys[i][j]);
+ for(j=0;j<kndeep;j++) if(kitsGeomTreeCopys[i][j]!=0)
+ k *= TMath::Abs(kitsGeomTreeCopys[i][j]);
mod += k;
} // end for i
SetITSgeom(geom);
mod = 0;
for(lay=1;lay<=knlayers;lay++){
- for(cp0=1;cp0<=itsGeomTreeCopys[lay-1][0];cp0++){
- for(cp1=1;cp1<=itsGeomTreeCopys[lay-1][1];cp1++){
- for(cp2=1;cp2<=itsGeomTreeCopys[lay-1][2];cp2++){
- path.Form(names[fMinorVersion-1][lay-1].Data(),
+ for(cp0=1;cp0<=kitsGeomTreeCopys[lay-1][0];cp0++){
+ for(cp1=1;cp1<=kitsGeomTreeCopys[lay-1][1];cp1++){
+ for(cp2=1;cp2<=kitsGeomTreeCopys[lay-1][2];cp2++){
+ path.Form(knames[fMinorVersion-1][lay-1].Data(),
cp0,cp1,cp2);
switch (lay){
case 1:{
gMC->GetShape(path.Data(),shapeName,shapePar);
shapeParF.Set(shapePar.GetSize());
for(i=0;i<shapePar.GetSize();i++) shapeParF[i]=shapePar[i];
- geom->CreateMatrix(mod,lay,lad,det,idet[lay-1],trans,rot);
+ geom->CreateMatrix(mod,lay,lad,det,kidet[lay-1],trans,rot);
geom->SetTrans(mod,materix.GetTranslation());
geom->SetRotMatrix(mod,materix.GetRotationMatrix());
+ geom->GetGeomMatrix(mod)->SetPath(path.Data());
switch (lay){
case 1: case 2:
if(!shapeDefined[kSPD]){
// Return:
// none.
- AliInfo(Form("Init: Major version %d Minor version %d",fMajorVersion,
+ AliDebug(1,Form("Init: Major version %d Minor version %d",fMajorVersion,
fMinorVersion));
//
+ /* obsolete initialization of AliITSgeom from external "det" file
if(fRead[0]=='\0') strncpy(fRead,fEuclidGeomDet,60);
if(fWrite[0]=='\0') strncpy(fWrite,fEuclidGeomDet,60);
AliITSgeom* geom = new AliITSgeom();
SetITSgeom(geom);
if(fGeomDetIn) GetITSgeom()->ReadNewFile(fRead);
else this->InitAliITSgeom();
- if(fGeomDetOut) GetITSgeom()->WriteNewFile(fWrite);
+ */
+ UpdateInternalGeometry();
AliITS::Init();
+ if(fGeomDetOut) GetITSgeom()->WriteNewFile(fWrite);
+
//
fIDMother = gMC->VolId("ITSV"); // ITS Mother Volume ID.
}