X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSvPPRasymmFMD.cxx;h=aaf72a7de7ae503fd224c0a1400646a2d076c681;hb=31f11c63e553375404a7821eea8d4076e813ec2d;hp=217c97b2e51a2af3446baad40869f0bcb68122af;hpb=94acb61f68ad1663c2e22b48d144cf69280884ad;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSvPPRasymmFMD.cxx b/ITS/AliITSvPPRasymmFMD.cxx index 217c97b2e51..aaf72a7de7a 100644 --- a/ITS/AliITSvPPRasymmFMD.cxx +++ b/ITS/AliITSvPPRasymmFMD.cxx @@ -32,12 +32,19 @@ #include #include #include +#include +#include +#include +#include +#include #include #include +#include +#include +#include #include "AliITS.h" #include "AliITSDetTypeSim.h" -#include "AliITSGeant3Geometry.h" #include "AliITSgeom.h" #include "AliITSgeomSDD.h" #include "AliITSgeomSPD.h" @@ -56,6 +63,7 @@ #include "AliMagF.h" #include "AliRun.h" #include "AliTrackReference.h" +#include "AliGeomManager.h" #define GEANTGEOMETRY kTRUE @@ -63,7 +71,27 @@ ClassImp(AliITSvPPRasymmFMD) //______________________________________________________________________ -AliITSvPPRasymmFMD::AliITSvPPRasymmFMD() { +AliITSvPPRasymmFMD::AliITSvPPRasymmFMD(): +AliITS(), // Default AliITS Constructor +fGeomDetOut(kFALSE), // Flag to write .det file out +fGeomDetIn(kFALSE), // Flag to read .det file or directly from Geat. +fByThick(kTRUE), // Flag to use services materials by thickness + // ture, or mass false. +fMajorVersion(IsVersion()), // Major version number == IsVersion +fMinorVersion(2), // Minor version number +fEuclidGeomDet("$ALICE_ROOT/ITS/ITSgeometry_vPPRasymm2.det"),// file where detector transormation are define. +fRead("$ALICE_ROOT/ITS/ITSgeometry_vPPRasymm.det"),//! file name to read .det file +fWrite("$ALICE_ROOT/ITS/ITSgeometry_vPPRasymm2.det"),//! file name to write .det file +fDet1(200.0), // thickness of detector in SPD layer 1 [microns] +fDet2(200.0), // thickness of detector in SPD layer 2 [microns] +fChip1(150.0), // thickness of chip in SPD layer 1 [microns] +fChip2(150.0), // thickness of chip in SPD layer 2 [microns] +fRails(0), // flag to switch rails on (=1) and off (=0) +fFluid(1), // flag to switch between water (=1)& freon (=0) +fIDMother(0), //! ITS Mother Volume id. +fIgm((AliITSVersion_t)fMajorVersion,fMinorVersion)//! Get access to decoding + // and AliITSgeom init functions + { // Standard default constructor for the ITS version 10. // Inputs: // none. @@ -71,24 +99,81 @@ AliITSvPPRasymmFMD::AliITSvPPRasymmFMD() { // none. // Return: // none. + fIgm.SetGeometryName(""); +} + +//______________________________________________________________________ +AliITSvPPRasymmFMD::AliITSvPPRasymmFMD(const Char_t *title): +AliITS(title), // Standard AliITS Constructor +fGeomDetOut(kFALSE), // Flag to write .det file out +fGeomDetIn(kFALSE), // Flag to read .det file or directly from Geat. +fByThick(kTRUE), // Flag to use services materials by thickness + // ture, or mass false. +fMajorVersion(IsVersion()), // Major version number == IsVersion +fMinorVersion(2), // Minor version number +fEuclidGeomDet("$ALICE_ROOT/ITS/ITSgeometry_vPPRasymm2.det"),// file where detector transormation are define. +fRead("$ALICE_ROOT/ITS/ITSgeometry_vPPRasymm.det"),//! file name to read .det file +fWrite("$ALICE_ROOT/ITS/ITSgeometry_vPPRasymm2.det"),//! file name to write .det file +fDet1(200.0), // thickness of detector in SPD layer 1 [microns] +fDet2(200.0), // thickness of detector in SPD layer 2 [microns] +fChip1(150.0), // thickness of chip in SPD layer 1 [microns] +fChip2(150.0), // thickness of chip in SPD layer 2 [microns] +fRails(0), // flag to switch rails on (=1) and off (=0) +fFluid(1), // flag to switch between water (=1)& freon (=0) +fIDMother(0), //! ITS Mother Volume id. +fIgm((AliITSVersion_t)fMajorVersion,fMinorVersion)//! Get access to decoding + // and AliITSgeom init functions +{ + // Standard constructor for the ITS version 10. + // Inputs: + // const Char_t * title Arbitrary title + // Outputs: + // 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 = kTRUE; // 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'; - strncpy(fRead,"$ALICE_ROOT/ITS/ITSgeometry_vPPRasymmFMD.det",60); + fIgm.SetDecoding(kFALSE);// Use Alice compliant naming/numbering system + fIgm.SetTiming(kFALSE);// default no timing + fIgm.SetSegGeom(kFALSE);// use AliITSgeomS?D classes instead + // of segmentation AliITSsegmentationS?D class + fIgm.SetGeometryName("ITS PPR aymmetric services with course" + " cables on cones"); + // Set some AliITS class veriables. + fIdN = 6; + fIdName = new TString[fIdN]; + fIdName[0] = "ITS1"; + fIdName[1] = "ITS2"; + fIdName[2] = "ITS3"; + fIdName[3] = "ITS4"; + fIdName[4] = "ITS5"; + fIdName[5] = "ITS6"; + fIdSens = new Int_t[fIdN]; + for(i=0;iSetAlignableEntry("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 strHalfStave = "/HalfStave"; + TString strLadder = "/Ladder"; + TString strSector = "/Sector"; + TString strSensor = "/Sensor"; + TString strEntryName1; + TString strEntryName2; + TString strEntryName3; + TString strEntryName4; + + //===== SPD layer1 ===== + { + layerId = AliGeomManager::kSPD1; + modnum = 0; + TString str0 = "ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_"; + TString str1 = "/I10B_"; + TString str1Bis = "/L1H-STAVE"; + TString str1Tierce = "_1"; + TString str2 = "/I107_"; + + TString sector; + TString stave; + TString halfStave; + TString module; + + for(Int_t cSect = 0; cSect<10; cSect++) + { + sector = str0; + sector += cSect+1; // this is one full sector + strEntryName1 = strSPD; + strEntryName1 += 0; + strEntryName1 += strSector; + strEntryName1 += cSect; + //printf("%s == %s\n",strEntryName1.Data(),sector.Data()); + if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data())) + AliFatal("Unable to set alignable entry!!"); + + for(Int_t cStave = 0; cStave<2; cStave++) + { + stave = sector; + stave += str1; + stave += cStave+1; + strEntryName2 = strEntryName1; + strEntryName2 += strStave; + strEntryName2 += cStave; + //printf("%s == %s\n",strEntryName2.Data(),stave.Data()); // this is a stave + + for(Int_t cHS=0; cHS<2; cHS++) + { + halfStave = stave; + halfStave += str1Bis; + halfStave += cHS; + halfStave += str1Tierce; + strEntryName3 = strEntryName2; + strEntryName3 += strHalfStave; + strEntryName3 += cHS; + //printf("%s == %s\n",strEntryName3.Data(),halfStave.Data()); // this is a half-stave + if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),halfStave.Data())) + AliFatal("Unable to set alignable entry!!"); + + for(Int_t cLadder = 0; cLadder<2; cLadder++) + { + modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); + module = halfStave; + module += str2; + module += cLadder+cHS*2+1; + strEntryName4 = strEntryName3; + strEntryName4 += strLadder; + strEntryName4 += cLadder+cHS*2; + //printf("%s == %s\n",strEntryName4.Data(),module.Data()); + if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data(),modUID)) + AliFatal("Unable to set alignable entry!!"); + + // Creates the TGeo Local to Tracking transformation matrix ... + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix *globMatrix = alignableEntry->GetGlobalOrig(); + 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(-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 ===== + layerId = AliGeomManager::kSPD2; + modnum = 0; + str1Bis = "/L2H-STAVE"; + str1 = "/I20B_"; + str2 = "/I1D7_"; + + for(Int_t cSect = 0; cSect<10; cSect++) + { + sector = str0; + sector += cSect+1; // this is one full sector + strEntryName1 = strSPD; + strEntryName1 += 1; + strEntryName1 += strSector; + strEntryName1 += cSect; + // if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data())) + // AliFatal("Unable to set alignable entry!!"); + // we don't need the previous lines because the whole sector is already define + // with first layer ... + + for(Int_t cStave =0; cStave<4; cStave++) + { + stave = sector; + stave += str1; + stave += cStave+1; + strEntryName2 = strEntryName1; + strEntryName2 += strStave; + strEntryName2 += cStave; + + for(Int_t cHS=0; cHS<2; cHS++) + { + halfStave = stave; + halfStave += str1Bis; + halfStave += cHS; + halfStave += str1Tierce; + strEntryName3 = strEntryName2; + strEntryName3 += strHalfStave; + strEntryName3 += cHS; + //printf("%s == %s\n",strEntryName3.Data(),halfStave.Data()); // this is a half-stave + if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),halfStave.Data())) + AliFatal("Unable to set alignable entry!!"); + + for(Int_t cLad =0; cLad<2; cLad++) + { + modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); + module = halfStave; + module += str2; + module += cLad+cHS*2+1; + strEntryName4 = strEntryName3; + strEntryName4 += strLadder; + strEntryName4 += cLad+cHS*2; + //printf("%s == %s\n",strEntryName4.Data(),module.Data()); + if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data(),modUID)) + AliFatal("Unable to set alignable entry!!"); + + // Creates the TGeo Local to Tracking transformation matrix ... + TGeoPNEntry *alignableEntry = gGeoManager->GetAlignableEntryByUID(modUID); + TGeoHMatrix *globMatrix = alignableEntry->GetGlobalOrig(); + 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(-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 ===== + { + layerId = AliGeomManager::kSDD1; + modnum = 0; + 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++) + { + modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); + wafer = ladder; + wafer += str1; + wafer += c2; // one wafer + strEntryName2 = strEntryName1; + strEntryName2 += strSensor; + strEntryName2 += (c2-1); + if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data(),modUID)) + 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->GetAlignableEntryByUID(modUID); + TGeoHMatrix *globMatrix = alignableEntry->GetGlobalOrig(); + 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 ===== + { + layerId = AliGeomManager::kSDD2; + modnum = 0; + 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++) + { + modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); + wafer = ladder; + wafer += str1; + wafer += c2; // one wafer + strEntryName2 = strEntryName1; + strEntryName2 += strSensor; + strEntryName2 += (c2-1); + if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data(),modUID)) + 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->GetAlignableEntryByUID(modUID); + TGeoHMatrix *globMatrix = alignableEntry->GetGlobalOrig(); + 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 ===== + { + layerId = AliGeomManager::kSSD1; + modnum = 0; + 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++) + { + modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); + wafer = ladder; + wafer += str1; + wafer += c2; // one wafer + strEntryName2 = strEntryName1; + strEntryName2 += strSensor; + strEntryName2 += (c2-1); + if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data(),modUID)) + 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->GetAlignableEntryByUID(modUID); + TGeoHMatrix *globMatrix = alignableEntry->GetGlobalOrig(); + 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 ===== + { + layerId = AliGeomManager::kSSD2; + modnum = 0; + 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++) + { + modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); + wafer = ladder; + wafer += str1; + wafer += c2; // one wafer + strEntryName2 = strEntryName1; + strEntryName2 += strSensor; + strEntryName2 += (c2-1); + if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data(),modUID)) + 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->GetAlignableEntryByUID(modUID); + TGeoHMatrix *globMatrix = alignableEntry->GetGlobalOrig(); + 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. @@ -227,6 +788,7 @@ void AliITSvPPRasymmFMD::BuildGeometry(){ node->SetLineColor(kColorITS); fNodes->Add(node); } + //______________________________________________________________________ void AliITSvPPRasymmFMD::CreateGeometry(){ // This routine defines and Creates the geometry for version 10 of @@ -302,6 +864,11 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ Float_t dbus=300.; // total bus thickness on both layers (micron) + // These constant character strings are set by cvs during commit + // do not change them unless you know what you are doing! + const Char_t *cvsDate="$Date$"; + const Char_t *cvsRevision="$Revision$"; + ddet1 = GetThicknessDet1(); ddet2 = GetThicknessDet2(); dchip1 = GetThicknessChip1(); @@ -352,14 +919,14 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ }// 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 @@ -373,7 +940,6 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ Int_t thickness = fMinorVersion/10; Int_t option = fMinorVersion - 10*thickness; - // Define some variables for SDD @@ -535,6 +1101,7 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ AliMatrix(idrotm[218],90.0,337.003998,90.0,67.003998,0.0,0.0); AliMatrix(idrotm[219],90.0,247.000305,90.0,337.000305,0.0,0.0); AliMatrix(idrotm[220],90.0,305.633514,90.0,35.633499,0.0,0.0); + AliMatrix(idrotm[221],90.0,58.000198,90.0,148.000198,0.0,0.0); AliMatrix(idrotm[222],90.0,327.997101,90.0,57.997101,0.0,0.0); AliMatrix(idrotm[223],90.0,237.994202,90.0,327.994202,0.0,0.0); @@ -879,64 +1446,76 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ ztpc = 284.; // --- Define ghost volume containing the whole ITS (including services) // and fill it with air - dgh[0] = 0.; - dgh[1] = 360.; - dgh[2] = 16.; - dgh[3] = -ztpc-5.-0.1; - dgh[4] = 46; - dgh[5] = 85.; - dgh[6] = -ztpc; - dgh[7] = 46; - dgh[8] = 85.; - dgh[9] = -ztpc; - dgh[10] = 46; - dgh[11] = rlim+7.5; - dgh[12] = -97.5; - dgh[13] = 46; - dgh[14] = rlim+7.5; - dgh[15] = -zmax; - dgh[16] = 46; - dgh[17] = rlim+7.5; - dgh[18] = -48; - dgh[19] = 6; - dgh[20] = rlim+7.5; - dgh[21] = -28.6; - dgh[22] = 6; - dgh[23] = rlim+7.5; - dgh[24] = -27.6; - dgh[25] = 3.295; - dgh[26] = rlim+7.5; - dgh[27] = 27.6; - dgh[28] = 3.295; - dgh[29] = rlim+7.5; - dgh[30] = 28.6; - dgh[31] = 6; - dgh[32] = rlim+7.5; - dgh[33] = 48; - dgh[34] = 6; - dgh[35] = rlim+7.5; - dgh[36] = zmax; - dgh[37] = 46; - dgh[38] = rlim+7.5; - dgh[39] = 97.5; - dgh[40] = 46; - dgh[41] = rlim+7.5; - dgh[42] = ztpc; - dgh[43] = 62; - dgh[44] = 62+4.; - dgh[45] = ztpc; - dgh[46] = 62; - dgh[47] = 85.; - dgh[48] = ztpc+4.+0.1; - dgh[49] = 62.4; - dgh[50] = 85.; - gMC->Gsvolu("ITSV", "PCON", idtmed[205], dgh, 51); +// dgh[0] = 0.; +// dgh[1] = 360.; +// dgh[2] = 16.; +// dgh[3] = -ztpc-5.-0.1; +// dgh[4] = 46; +// dgh[5] = 85.; +// dgh[6] = -ztpc; +// dgh[7] = 46; +// dgh[8] = 85.; +// dgh[9] = -ztpc; +// dgh[10] = 46; +// dgh[11] = rlim+7.5; +// dgh[12] = -97.5; +// dgh[13] = 46; +// dgh[14] = rlim+7.5; +// dgh[15] = -zmax; +// dgh[16] = 46; +// dgh[17] = rlim+7.5; +// dgh[18] = -48; +// dgh[19] = 6; +// dgh[20] = rlim+7.5; +// dgh[21] = -28.6; +// dgh[22] = 6; +// dgh[23] = rlim+7.5; +// dgh[24] = -27.6; +// dgh[25] = 3.295; +// dgh[26] = rlim+7.5; +// dgh[27] = 27.6; +// dgh[28] = 3.295; +// dgh[29] = rlim+7.5; +// dgh[30] = 28.6; +// dgh[31] = 6; +// dgh[32] = rlim+7.5; +// dgh[33] = 48; +// dgh[34] = 6; +// dgh[35] = rlim+7.5; +// dgh[36] = zmax; +// dgh[37] = 46; +// dgh[38] = rlim+7.5; +// dgh[39] = 97.5; +// dgh[40] = 46; +// dgh[41] = rlim+7.5; +// dgh[42] = ztpc; +// dgh[43] = 62; +// dgh[44] = 62+4.; +// dgh[45] = ztpc; +// dgh[46] = 62; +// dgh[47] = 85.; +// dgh[48] = ztpc+4.+0.1; +// dgh[49] = 62.0;//62.4; +// dgh[50] = 85.; +// gMC->Gsvolu("ITSV", "PCON", idtmed[205], dgh, 51); + TGeoVolumeAssembly *itsV = gGeoManager->MakeVolumeAssembly("ITSV"); + const Int_t length=100; + Char_t vstrng[length]; + if(fIgm.WriteVersionString(vstrng,length,(AliITSVersion_t)IsVersion(), + fMinorVersion,cvsDate,cvsRevision)) + itsV->SetTitle(vstrng); + // --- Place the ghost volume in its mother volume (ALIC) and make it // invisible - // gMC->Gspos("ITSV", 1, "ALIC", 0., 0., 0., 0, "ONLY"); - gMC->Gspos("ITSV", 1, "ALIC", 0., 0., 0., idrotm[199], "MANY"); - //gMC->Gsatt("ITSV", "SEEN", 0); + // gMC->Gspos("ITSV", 1, "ALIC", 0., 0., 0., idrotm[199], "MANY"); + TGeoVolume *alic = gGeoManager->GetVolume("ALIC"); + if(alic==0) { + Error("CreateGeometry","alic=0"); + return; + } // end if + // See idrotm[199] for angle definitions. + alic->AddNode(itsV,1,new TGeoRotation("", 90.,180., 90.,90., 180.,0.)); // --- Define ghost volume containing the six layers and fill it with air @@ -1075,6 +1654,7 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dits[4] = 75.261; gMC->Gsvolu("I137", "TUBS", idtmed[253], dits, 5); + dits[0] = 1.3401; dits[1] = 0.01; dits[2] = 24; @@ -1372,14 +1952,15 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dits[1] = 7.75; dits[2] = 26.1; gMC->Gsvolu("IT12", "TUBE", idtmed[254], dits, 3); - + /* dits[0] = 3.7; dits[1] = 7.7; dits[2] = 24; dits[3] = 57; dits[4] = 100; - gMC->Gsvolu("I12B", "TUBS", idtmed[254], dits, 5); // sector - + gMC->Gsvolu("I12B", "TUBS", idtmed[254], dits, 5); // sector */ + // TGeoVolumeAssembly *i12b = gGeoManager->MakeVolumeAssembly("I12B"); + gGeoManager->MakeVolumeAssembly("I12B"); di10b[0] = 0.843; di10b[1] = ddet1+dchip1+dbus+0.0025; di10b[2] = 19.344; @@ -1644,12 +2225,13 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dits2[2] = 3.48; gMC->Gsvolu("ITS2", "BOX ", idtmed[200], dits2, 3); // detector layer 2 - dits[0] = 3.701; - dits[1] = 7.699; - dits[2] = 4; - dits[3] = 57.1; - dits[4] = 99.9; - gMC->Gsvolu("I650", "TUBS", idtmed[254], dits, 5); // was I150 in old geom. +// dits[0] = 3.701; +// dits[1] = 7.699; +// dits[2] = 4; +// dits[3] = 57.1; +// dits[4] = 99.9; +// gMC->Gsvolu("I650", "TUBS", idtmed[254], dits, 5); // was I150 in old geom. + gGeoManager->MakeVolumeAssembly("I650"); dits[0] = 3.7; dits[1] = 7.75; @@ -1746,28 +2328,28 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ cos30 = cos(30.*3.14159/180.); sin30 = sin(30.*3.14159/180.); - + Double_t maxRadius = 28.5; dits[0] = 0; dits[1] = 360; dits[2] = 6; dits[3] = -34.6; dits[4] = 23.49; - dits[5] = 28; + dits[5] = maxRadius; dits[6] = -27.35; dits[7] = 23.49; - dits[8] = 28; + dits[8] = maxRadius; dits[9] = -27.35; dits[10] = 14.59; - dits[11] = 28; + dits[11] = maxRadius; dits[12] = 27.35; dits[13] = 14.59; - dits[14] = 28; + dits[14] = maxRadius; dits[15] = 27.35; dits[16] = 23.49; - dits[17] = 28; + dits[17] = maxRadius; dits[18] = 34.6; dits[19] = 23.49; - dits[20] = 28; + dits[20] = maxRadius; gMC->Gsvolu("IT34", "PCON", idtmed[209], dits, 21); // block of the SDD electronics and related ladder frame @@ -2103,7 +2685,8 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dits[18] = 57.45; dits[19] = 43.6; dits[20] = 48; - gMC->Gsvolu("IT56", "PCON", idtmed[220], dits, 21); + //gMC->Gsvolu("IT56", "PCON", idtmed[220], dits, 21); // SSD air + gMC->Gsvolu("IT56", "PCON", idtmed[204], dits, 21); // air dits[0] = 3.4; dits[1] = 1.955; @@ -2468,42 +3051,62 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dits[0] = 0; dits[1] = 360; dits[2] = 12; + dits[3] = -59.7; dits[4] = 27; dits[5] = 28.6; + dits[6] = -42.7; dits[7] = 10; dits[8] = 28.6; + dits[9] = -34.65; dits[10] = 10; dits[11] = 28.6; + dits[12] = -34.65; dits[13] = 10; dits[14] = 23.495; + dits[15] = -23.7; dits[16] = 10; dits[17] = 23.495; + dits[18] = -23.7; dits[19] = 10; dits[20] = 14.595; + dits[21] = 23.7; dits[22] = 10; dits[23] = 14.595; + dits[24] = 23.7; dits[25] = 10; dits[26] = 23.495; + dits[27] = 34.65; dits[28] = 10; dits[29] = 23.495; + dits[30] = 34.65; dits[31] = 10; dits[32] = 28.6; + dits[33] = 42.7; dits[34] = 10; dits[35] = 28.6; + dits[36] = 59.7; dits[37] = 27.2637; - dits[38] = 28.6; + dits[38] = 28.6; + + + // fixing overlaps : + dits[15] = -27.35; + dits[18] = -27.35; + dits[21] = 27.35; + dits[24] = 27.35; + gMC->Gsvolu("IS02", "PCON", idtmed[204], dits, 39); dits[0] = 0; @@ -2973,16 +3576,16 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ if (option == 2) { - gMC->Gspos("I12B",1,"IT12",0.0,0.0,0.0,0,"MANY"); - gMC->Gspos("I12B",8,"IT12",0.0,0.0,0.0,idrotm[233],"MANY"); - gMC->Gspos("I12B",7,"IT12",0.0,0.0,0.0,idrotm[244],"MANY"); - gMC->Gspos("I12B",6,"IT12",0.0,0.0,0.0,idrotm[236],"MANY"); - gMC->Gspos("I12B",2,"IT12",0.0,0.0,0.0,idrotm[245],"MANY"); - gMC->Gspos("I12B",3,"IT12",0.0,0.0,0.0,idrotm[234],"MANY"); - gMC->Gspos("I12B",4,"IT12",0.0,0.0,0.0,idrotm[246],"MANY"); - gMC->Gspos("I12B",5,"IT12",0.0,0.0,0.0,idrotm[247],"MANY"); - gMC->Gspos("I12B",9,"IT12",0.0,0.0,0.0,idrotm[248],"MANY"); - gMC->Gspos("I12B",10,"IT12",0.0,0.0,0.0,idrotm[249],"MANY"); + gMC->Gspos("I12B",1,"IT12",0.0,0.0,0.0,0,"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",8,"IT12",0.0,0.0,0.0,idrotm[233],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",7,"IT12",0.0,0.0,0.0,idrotm[244],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",6,"IT12",0.0,0.0,0.0,idrotm[236],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",2,"IT12",0.0,0.0,0.0,idrotm[245],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",3,"IT12",0.0,0.0,0.0,idrotm[234],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",4,"IT12",0.0,0.0,0.0,idrotm[246],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",5,"IT12",0.0,0.0,0.0,idrotm[247],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",9,"IT12",0.0,0.0,0.0,idrotm[248],"ONLY"/*"MANY"*/); + gMC->Gspos("I12B",10,"IT12",0.0,0.0,0.0,idrotm[249],"ONLY"/*"MANY"*/); deltax=((ddet1-0.01/2.)+(dchip1-0.015/2.))*TMath::Cos(270.*TMath::Pi()/180.); // see definition of idrotm[238] deltay=((ddet1-0.01/2.)+(dchip1-0.015/2.))*TMath::Sin(270.*TMath::Pi()/180.); // see definition of idrotm[238] gMC->Gspos("I10B",2,"I12B",0.203+deltax,3.8206+deltay,0.0,idrotm[238],"ONLY"); @@ -3043,19 +3646,40 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I124",1,"I12B",-0.4965,6.8742,0.0,idrotm[215],"ONLY"); gMC->Gspos("I105",3,"I10B",-0.05,-0.01,-16.844,idrotm[201],"ONLY"); gMC->Gspos("I105",4,"I10B",-0.05,-0.01,16.844,0,"ONLY"); - gMC->Gspos("I107",2,"I10B",-0.0455,-di10b[1]+di107[1],3.536,0,"ONLY"); - gMC->Gspos("I107",1,"I10B",-0.0455,-di10b[1]+di107[1],10.708,0,"ONLY"); - gMC->Gspos("I107",4,"I10B",-0.0455,-di10b[1]+di107[1],-10.708,0,"ONLY"); - gMC->Gspos("I107",3,"I10B",-0.0455,-di10b[1]+di107[1],-3.536,0,"ONLY"); + + // Insertion of half-stave level in SPD1: + gGeoManager->MakeVolumeAssembly("L1H-STAVE0"); + gGeoManager->MakeVolumeAssembly("L1H-STAVE1"); + gMC->Gspos("L1H-STAVE0",1,"I10B",0,0,0,0,"ONLY"); + gMC->Gspos("L1H-STAVE1",1,"I10B",0,0,0,0,"ONLY"); + gMC->Gspos("I107",1,"L1H-STAVE0",-0.0455,-di10b[1]+di107[1],10.708,0,"ONLY"); + gMC->Gspos("I107",2,"L1H-STAVE0",-0.0455,-di10b[1]+di107[1],3.536,0,"ONLY"); + gMC->Gspos("I107",3,"L1H-STAVE1",-0.0455,-di10b[1]+di107[1],-3.536,0,"ONLY"); + gMC->Gspos("I107",4,"L1H-STAVE1",-0.0455,-di10b[1]+di107[1],-10.708,0,"ONLY"); +// gMC->Gspos("I107",2,"I10B",-0.0455,-di10b[1]+di107[1],3.536,0,"ONLY"); +// gMC->Gspos("I107",1,"I10B",-0.0455,-di10b[1]+di107[1],10.708,0,"ONLY"); +// gMC->Gspos("I107",4,"I10B",-0.0455,-di10b[1]+di107[1],-10.708,0,"ONLY"); +// gMC->Gspos("I107",3,"I10B",-0.0455,-di10b[1]+di107[1],-3.536,0,"ONLY"); + + // Insertion of half-stave level in SPD2: + gGeoManager->MakeVolumeAssembly("L2H-STAVE0"); + gGeoManager->MakeVolumeAssembly("L2H-STAVE1"); + gMC->Gspos("L2H-STAVE0",1,"I20B",0,0,0,0,"ONLY"); + gMC->Gspos("L2H-STAVE1",1,"I20B",0,0,0,0,"ONLY"); + gMC->Gspos("I1D7",1,"L2H-STAVE0",-0.0455,-di20b[1]+di1d7[1],10.708,0,"ONLY"); + gMC->Gspos("I1D7",2,"L2H-STAVE0",-0.0455,-di20b[1]+di1d7[1],3.536,0,"ONLY"); + gMC->Gspos("I1D7",3,"L2H-STAVE1",-0.0455,-di20b[1]+di1d7[1],-3.536,0,"ONLY"); + gMC->Gspos("I1D7",4,"L2H-STAVE1",-0.0455,-di20b[1]+di1d7[1],-10.708,0,"ONLY"); +// gMC->Gspos("I1D7",2,"I20B",-0.0455,-di20b[1]+di1d7[1],3.536,0,"ONLY"); +// gMC->Gspos("I1D7",1,"I20B",-0.0455,-di20b[1]+di1d7[1],10.708,0,"ONLY"); +// gMC->Gspos("I1D7",4,"I20B",-0.0455,-di20b[1]+di1d7[1],-10.708,0,"ONLY"); +// gMC->Gspos("I1D7",3,"I20B",-0.0455,-di20b[1]+di1d7[1],-3.536,0,"ONLY"); + gMC->Gspos("I109",1,"I10B",-0.138,0.015,-16.844,idrotm[201],"ONLY"); gMC->Gspos("I109",2,"I10B",-0.138,0.015,16.844,0,"ONLY"); gMC->Gspos("I108",1,"I10B",-0.138,-di10b[1]+2.*di107[1]+di108[1],0.0,0,"ONLY"); gMC->Gspos("I105",1,"I20B",-0.05,-0.01,-16.844,idrotm[201],"ONLY"); gMC->Gspos("I105",2,"I20B",-0.05,-0.01,16.844,0,"ONLY"); - gMC->Gspos("I1D7",2,"I20B",-0.0455,-di20b[1]+di1d7[1],3.536,0,"ONLY"); - gMC->Gspos("I1D7",1,"I20B",-0.0455,-di20b[1]+di1d7[1],10.708,0,"ONLY"); - gMC->Gspos("I1D7",4,"I20B",-0.0455,-di20b[1]+di1d7[1],-10.708,0,"ONLY"); - gMC->Gspos("I1D7",3,"I20B",-0.0455,-di20b[1]+di1d7[1],-3.536,0,"ONLY"); gMC->Gspos("I109",3,"I20B",-0.138,0.015,-16.844,idrotm[201],"ONLY"); gMC->Gspos("I109",4,"I20B",-0.138,0.015,16.844,0,"ONLY"); gMC->Gspos("I108",2,"I20B",-0.138,-di20b[1]+2.*di1d7[1]+di108[1],0.0,0,"ONLY"); @@ -3070,44 +3694,50 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ 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"); gMC->Gspos("I651",1,"IT12",0.0,0.0,26.05,0,"ONLY"); - gMC->Gspos("I651",2,"IT12",0.0,0.0,-26.05,0,"ONLY"); - gMC->Gspos("I650",16,"IT12",0.0,0.0,22.0,idrotm[1104],"MANY"); - gMC->Gspos("I650",20,"IT12",0.0,0.0,22.0,idrotm[1130],"MANY"); - gMC->Gspos("I650",18,"IT12",0.0,0.0,22.0,idrotm[1117],"MANY"); - gMC->Gspos("I650",1,"IT12",0.0,0.0,22.0,0,"MANY"); - gMC->Gspos("I650",4,"IT12",0.0,0.0,22.0,idrotm[1106],"MANY"); - gMC->Gspos("I650",6,"IT12",0.0,0.0,22.0,idrotm[1039],"MANY"); - gMC->Gspos("I650",8,"IT12",0.0,0.0,22.0,idrotm[1107],"MANY"); - gMC->Gspos("I650",10,"IT12",0.0,0.0,22.0,idrotm[1065],"MANY"); - gMC->Gspos("I650",12,"IT12",0.0,0.0,22.0,idrotm[1078],"MANY"); - gMC->Gspos("I650",14,"IT12",0.0,0.0,22.0,idrotm[1091],"MANY"); - gMC->Gspos("I650",19,"IT12",0.0,0.0,-22.0,idrotm[1108],"MANY"); - gMC->Gspos("I650",2,"IT12",0.0,0.0,-22.0,idrotm[1109],"MANY"); - gMC->Gspos("I650",3,"IT12",0.0,0.0,-22.0,idrotm[1110],"MANY"); - gMC->Gspos("I650",5,"IT12",0.0,0.0,-22.0,idrotm[1111],"MANY"); - gMC->Gspos("I650",7,"IT12",0.0,0.0,-22.0,idrotm[1112],"MANY"); - gMC->Gspos("I650",9,"IT12",0.0,0.0,-22.0,idrotm[1113],"MANY"); - gMC->Gspos("I650",11,"IT12",0.0,0.0,-22.0,idrotm[1114],"MANY"); - gMC->Gspos("I650",13,"IT12",0.0,0.0,-22.0,idrotm[1115],"MANY"); - gMC->Gspos("I650",15,"IT12",0.0,0.0,-22.0,idrotm[1116],"MANY"); - gMC->Gspos("I650",17,"IT12",0.0,0.0,-22.0,idrotm[1118],"MANY"); - gMC->Gspos("I666",1,"I650",0.0,0.0,0.25,idrotm[1003],"MANY"); + gMC->Gspos("I651",2,"IT12",0.0,0.0,-26.05,0,"ONLY"); + + + gMC->Gspos("I650",16,"IT12",0.0,0.0,22.0,idrotm[1104],"ONLY"); + gMC->Gspos("I650",20,"IT12",0.0,0.0,22.0,idrotm[1130],"ONLY"); + gMC->Gspos("I650",18,"IT12",0.0,0.0,22.0,idrotm[1117],"ONLY"); + gMC->Gspos("I650",1,"IT12",0.0,0.0,22.0,0,"ONLY"); + gMC->Gspos("I650",4,"IT12",0.0,0.0,22.0,idrotm[1106],"ONLY"); + gMC->Gspos("I650",6,"IT12",0.0,0.0,22.0,idrotm[1039],"ONLY"); + gMC->Gspos("I650",8,"IT12",0.0,0.0,22.0,idrotm[1107],"ONLY"); + gMC->Gspos("I650",10,"IT12",0.0,0.0,22.0,idrotm[1065],"ONLY"); + gMC->Gspos("I650",12,"IT12",0.0,0.0,22.0,idrotm[1078],"ONLY"); + gMC->Gspos("I650",14,"IT12",0.0,0.0,22.0,idrotm[1091],"ONLY"); + gMC->Gspos("I650",19,"IT12",0.0,0.0,-22.0,idrotm[1108],"ONLY"); + gMC->Gspos("I650",2,"IT12",0.0,0.0,-22.0,idrotm[1109],"ONLY"); + gMC->Gspos("I650",3,"IT12",0.0,0.0,-22.0,idrotm[1110],"ONLY"); + gMC->Gspos("I650",5,"IT12",0.0,0.0,-22.0,idrotm[1111],"ONLY"); + gMC->Gspos("I650",7,"IT12",0.0,0.0,-22.0,idrotm[1112],"ONLY"); + gMC->Gspos("I650",9,"IT12",0.0,0.0,-22.0,idrotm[1113],"ONLY"); + gMC->Gspos("I650",11,"IT12",0.0,0.0,-22.0,idrotm[1114],"ONLY"); + gMC->Gspos("I650",13,"IT12",0.0,0.0,-22.0,idrotm[1115],"ONLY"); + gMC->Gspos("I650",15,"IT12",0.0,0.0,-22.0,idrotm[1116],"ONLY"); + gMC->Gspos("I650",17,"IT12",0.0,0.0,-22.0,idrotm[1118],"ONLY"); + + + + gMC->Gspos("I666",1,"I650",0.0,0.0,0.25,idrotm[1003],"ONLY"); + gMC->Gspos("I667",1,"I650",0.1102,0.9945,0.45,idrotm[1088],"ONLY"); gMC->Gspos("I669",3,"I650",0.1883,4.0372,-3.2,0,"ONLY"); gMC->Gspos("I671",3,"I650",0.1883,4.0372,0.6,0,"ONLY"); @@ -3132,9 +3762,11 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I668",1,"I667",0.0,0.0,0.0,0,"ONLY"); gMC->Gspos("I670",1,"I669",0.0,0.0,0.0,0,"ONLY"); gMC->Gspos("I672",1,"I671",0.0,0.0,0.0,0,"ONLY"); - gMC->Gspos("I674",1,"I673",0.0,0.0,0.0,0,"MANY"); + + gMC->Gspos("I674",1,"I673",0.0,0.0,0.0,0,"ONLY"); + gMC->Gspos("I675",1,"I673",0.0,0.0,-0.5,0,"ONLY"); - gMC->Gspos("I677",1,"I676",0.0,0.0,0.0,0,"MANY"); + gMC->Gspos("I677",1,"I676",0.0,0.0,0.0,0,"ONLY"); gMC->Gspos("I678",1,"I676",0.0,0.0,-0.95,0,"ONLY"); } @@ -3221,22 +3853,23 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I022", 1,"I018", 0.0, -1.79, 3.55, idrotm[312], "ONLY"); gMC->Gspos("I022", 2,"I018", 0.0, -1.79, -0.1, idrotm[312], "ONLY"); - gMC->Gspos("I023", 1,"I018", 0.0, -1.79, 1.725, idrotm[341], "ONLY"); gMC->Gspos("I023", 2,"I018", 0.0, -1.79, -1.925, idrotm[341], "ONLY"); + gMC->Gspos("I033", 1,"I018", 1.8, -1.75, 1.35, 0, "ONLY"); + + gMC->Gspos("I033", 2,"I018", -1.8, -1.75, -2.65, idrotm[345], "ONLY"); + gMC->Gspos("I033", 3,"I018", -1.8, -1.75, 1.35, idrotm[345], "ONLY"); + gMC->Gspos("I033", 4,"I018", 1.8, -1.75, -2.65, 0, "ONLY"); + - gMC->Gspos("I033", 1,"I018", 1.8, -1.75, 1.35, 0, "MANY"); - gMC->Gspos("I033", 2,"I018", -1.8, -1.75, -2.65, idrotm[345], "MANY"); - gMC->Gspos("I033", 3,"I018", -1.8, -1.75, 1.35, idrotm[345], "MANY"); - gMC->Gspos("I033", 4,"I018", 1.8, -1.75, -2.65, 0, "MANY"); gMC->Gspos("I034", 1,"I018", 1.6, -1.775, 1.35, idrotm[312], "ONLY"); gMC->Gspos("I034", 2,"I018", -1.6, -1.775, -2.65, idrotm[348], "ONLY"); gMC->Gspos("I034", 3,"I018", -1.6, -1.775, 1.35, idrotm[348], "ONLY"); gMC->Gspos("I034", 4,"I018", 1.6, -1.775, -2.65, idrotm[312], "ONLY"); - gMC->Gspos("I035", 1,"I018", 1.7, -0.55, iI018dits[2]-iI035dits[2], 0, "MANY"); - gMC->Gspos("I035", 2,"I018", -1.7, -0.55, iI018dits[2]-iI035dits[2], 0, "MANY"); + gMC->Gspos("I035", 1,"I018", 1.7, -0.55, iI018dits[2]-iI035dits[2], 0, "ONLY"); + gMC->Gspos("I035", 2,"I018", -1.7, -0.55, iI018dits[2]-iI035dits[2], 0, "ONLY"); gMC->Gspos("I036", 1,"I018", 0.3087, 1.7191, 3.56, idrotm[346], "ONLY"); gMC->Gspos("I036", 2,"I018", 0.3087, 1.7191,-0.11, idrotm[346], "ONLY"); @@ -3344,7 +3977,7 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I421", 1,"I420", 0.0, 0.0, 0.0, idrotm[312], "ONLY"); gMC->Gspos("I420", 1,"I028", -iI028dits[0]/3., iI028dits[1]-iI420dits[1], 0.0, 0, "ONLY"); gMC->Gspos("I424", 1,"I028", xI424, yI424, 0.0, 0, "ONLY"); - gMC->Gspos("I028", 1,"I024", 0.0, iI028dits[1]-iI024dits[1], iI024dits[2]-iI028dits[2], 0, "MANY"); + gMC->Gspos("I028", 1,"I024", 0.0, iI028dits[1]-iI024dits[1], iI024dits[2]-iI028dits[2], 0, "ONLY"); // -- build the SDD ladder 3 @@ -3751,8 +4384,10 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I556",2,"I553",1.0311,0.2033,-2.203,idrotm[577],"ONLY"); gMC->Gspos("I556",4,"I553",-1.031,0.2033,-0.287,idrotm[579],"ONLY"); gMC->Gspos("I559",2,"I553",-2.25,-1.615,0.0,idrotm[573],"ONLY"); - gMC->Gspos("I561",1,"I553",2.1,-1.615,-0.24,0,"MANY"); - gMC->Gspos("I561",2,"I553",-2.1,-1.615,-0.24,idrotm[573],"MANY"); + + gMC->Gspos("I561",1,"I553",2.1,-1.615,-0.24,0,"ONLY"); + gMC->Gspos("I561",2,"I553",-2.1,-1.615,-0.24,idrotm[573],"ONLY"); + gMC->Gspos("I519",37,"I523",0.0001,-1.79,-0.99,idrotm[586],"ONLY"); gMC->Gspos("I519",36,"I523",-3.2986,-1.79,-1.2943,0,"ONLY"); gMC->Gspos("I519",35,"I523",-3.2986,-1.71,-1.2943,0,"ONLY"); @@ -3806,14 +4441,16 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I519",1,"I523",3.302,-1.71,-1.2943,0,"ONLY"); gMC->Gspos("I520",1,"I523",2.2501,-1.845,-1.19,0,"ONLY"); gMC->Gspos("I521",1,"I523",2.8161,-1.7075,-0.982,0,"ONLY"); - gMC->Gspos("I522",1,"I523",2.2501,-1.655,-1.3,idrotm[583],"MANY"); - gMC->Gspos("I522",2,"I523",-2.2499,-1.655,-1.3,idrotm[583],"MANY"); + + gMC->Gspos("I522",1,"I523",2.2501,-1.655,-1.3,idrotm[583],"ONLY"); + gMC->Gspos("I522",2,"I523",-2.2499,-1.655,-1.3,idrotm[583],"ONLY"); + gMC->Gspos("I542",2,"I523",-2.2499,-1.615,0.0,idrotm[573],"ONLY"); gMC->Gspos("I541",2,"I523",-2.2499,-1.615,0.0,idrotm[573],"ONLY"); gMC->Gspos("I541",1,"I523",2.2501,-1.615,0.0,0,"ONLY"); gMC->Gspos("I542",1,"I523",2.2501,-1.615,0.0,0,"ONLY"); - gMC->Gspos("I543",1,"I523",2.1001,-1.615,0.955,0,"MANY"); - gMC->Gspos("I543",2,"I523",-2.0999,-1.615,0.955,idrotm[573],"MANY"); + gMC->Gspos("I543",1,"I523",2.1001,-1.615,0.955,0,"ONLY"); + gMC->Gspos("I543",2,"I523",-2.0999,-1.615,0.955,idrotm[573],"ONLY"); gMC->Gspos("I537",2,"I523",1.7501,-1.52,0.0,idrotm[583],"ONLY"); gMC->Gspos("I538",2,"I523",1.8368,-1.3122,0.0,idrotm[575],"ONLY"); gMC->Gspos("I537",3,"I523",0.1035,1.6901,0.0,idrotm[575],"ONLY"); @@ -3846,8 +4483,10 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I549",2,"I544",0.12,1.6613,0.0,idrotm[575],"ONLY"); gMC->Gspos("I549",3,"I544",-1.8367,-1.3122,0.0,idrotm[581],"ONLY"); gMC->Gspos("I548",3,"I544",-1.75,-1.52,0.0,idrotm[583],"ONLY"); - gMC->Gspos("I552",1,"I544",2.1,-1.615,-0.24,0,"MANY"); - gMC->Gspos("I552",2,"I544",-2.1,-1.615,-0.24,idrotm[573],"MANY"); + + gMC->Gspos("I552",1,"I544",2.1,-1.615,-0.24,0,"ONLY"); + gMC->Gspos("I552",2,"I544",-2.1,-1.615,-0.24,idrotm[573],"ONLY"); + gMC->Gspos("I515",12,"I516",-1.6896,-1.7075,-0.9822,0,"ONLY"); gMC->Gspos("I515",11,"I516",-1.6896,-1.7925,-0.9822,0,"ONLY"); gMC->Gspos("I513",37,"I516",0.0,-1.79,-1.035,idrotm[586],"ONLY"); @@ -3916,14 +4555,16 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I529",1,"I516",1.8,-1.75,-0.195,idrotm[571],"ONLY"); gMC->Gspos("I530",1,"I516",0.0,-1.785,1.905,idrotm[571],"ONLY"); gMC->Gspos("I529",2,"I516",-1.8,-1.75,-0.195,idrotm[572],"ONLY"); - gMC->Gspos("I517",1,"I516",2.25,-1.655,-1.3,idrotm[583],"MANY"); - gMC->Gspos("I517",2,"I516",-2.25,-1.655,-1.3,idrotm[584],"MANY"); + + gMC->Gspos("I517",1,"I516",2.25,-1.655,-1.3,idrotm[583],"ONLY"); + gMC->Gspos("I517",2,"I516",-2.25,-1.655,-1.3,idrotm[584],"ONLY"); + gMC->Gspos("I531",2,"I516",-2.25,-1.615,0.0,idrotm[573],"ONLY"); gMC->Gspos("I531",1,"I516",2.25,-1.615,0.0,0,"ONLY"); gMC->Gspos("I532",1,"I516",2.25,-1.615,0.0,0,"ONLY"); gMC->Gspos("I532",2,"I516",-2.25,-1.615,0.0,idrotm[573],"ONLY"); - gMC->Gspos("I533",1,"I516",2.1,-1.615,0.955,0,"MANY"); - gMC->Gspos("I533",2,"I516",-2.1,-1.615,0.955,idrotm[573],"MANY"); + gMC->Gspos("I533",1,"I516",2.1,-1.615,0.955,0,"ONLY"); + gMC->Gspos("I533",2,"I516",-2.1,-1.615,0.955,idrotm[573],"ONLY"); gMC->Gspos("ITS5",1,"I562",0.0,0.0,0.0,0,"ONLY"); @@ -3946,26 +4587,28 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ // --- Place volumes of SDD cone ---------------------------------- - gMC->Gspos("I093",1,"IS02",0.0,0.0,0.0,0,"MANY"); - gMC->Gspos("I093",2,"IS02",0.0,0.0,0.0,idrotm[856],"MANY"); - gMC->Gspos("I099",4,"IS02",0.0,0.0,0.0,idrotm[857],"MANY"); - gMC->Gspos("I099",3,"IS02",0.0,0.0,0.0,idrotm[858],"MANY"); - gMC->Gspos("I099",5,"IS02",0.0,0.0,0.0,idrotm[859],"MANY"); - gMC->Gspos("I099",6,"IS02",0.0,0.0,0.0,idrotm[860],"MANY"); - gMC->Gspos("I099",7,"IS02",0.0,0.0,0.0,idrotm[861],"MANY"); - gMC->Gspos("I099",2,"IS02",0.0,0.0,0.0,idrotm[862],"MANY"); - gMC->Gspos("I200",4,"IS02",0.0,0.0,0.0,idrotm[863],"MANY"); - gMC->Gspos("I200",3,"IS02",0.0,0.0,0.0,idrotm[864],"MANY"); - gMC->Gspos("I200",2,"IS02",0.0,0.0,0.0,idrotm[865],"MANY"); - gMC->Gspos("I200",13,"IS02",0.0,0.0,0.0,idrotm[867],"MANY"); - gMC->Gspos("I200",12,"IS02",0.0,0.0,0.0,idrotm[869],"MANY"); - gMC->Gspos("I200",11,"IS02",0.0,0.0,0.0,idrotm[870],"MANY"); - gMC->Gspos("I200",10,"IS02",0.0,0.0,0.0,idrotm[871],"MANY"); - gMC->Gspos("I200",9,"IS02",0.0,0.0,0.0,idrotm[872],"MANY"); - gMC->Gspos("I200",8,"IS02",0.0,0.0,0.0,idrotm[873],"MANY"); - gMC->Gspos("I200",7,"IS02",0.0,0.0,0.0,idrotm[874],"MANY"); - gMC->Gspos("I200",6,"IS02",0.0,0.0,0.0,idrotm[875],"MANY"); - gMC->Gspos("I200",5,"IS02",0.0,0.0,0.0,idrotm[876],"MANY"); + gMC->Gspos("I093",1,"IS02",0.0,0.0,0.0,0,"ONLY"); + gMC->Gspos("I093",2,"IS02",0.0,0.0,0.0,idrotm[856],"ONLY"); + gMC->Gspos("I099",4,"IS02",0.0,0.0,0.0,idrotm[857],"ONLY"); + gMC->Gspos("I099",3,"IS02",0.0,0.0,0.0,idrotm[858],"ONLY"); + gMC->Gspos("I099",5,"IS02",0.0,0.0,0.0,idrotm[859],"ONLY"); + gMC->Gspos("I099",6,"IS02",0.0,0.0,0.0,idrotm[860],"ONLY"); + gMC->Gspos("I099",7,"IS02",0.0,0.0,0.0,idrotm[861],"ONLY"); + gMC->Gspos("I099",2,"IS02",0.0,0.0,0.0,idrotm[862],"ONLY"); + + gMC->Gspos("I200",4,"IS02",0.0,0.0,0.0,idrotm[863],"ONLY"); + gMC->Gspos("I200",3,"IS02",0.0,0.0,0.0,idrotm[864],"ONLY"); + gMC->Gspos("I200",2,"IS02",0.0,0.0,0.0,idrotm[865],"ONLY"); + gMC->Gspos("I200",13,"IS02",0.0,0.0,0.0,idrotm[867],"ONLY"); + gMC->Gspos("I200",12,"IS02",0.0,0.0,0.0,idrotm[869],"ONLY"); + gMC->Gspos("I200",11,"IS02",0.0,0.0,0.0,idrotm[870],"ONLY"); + gMC->Gspos("I200",10,"IS02",0.0,0.0,0.0,idrotm[871],"ONLY"); + gMC->Gspos("I200",9,"IS02",0.0,0.0,0.0,idrotm[872],"ONLY"); + gMC->Gspos("I200",8,"IS02",0.0,0.0,0.0,idrotm[873],"ONLY"); + gMC->Gspos("I200",7,"IS02",0.0,0.0,0.0,idrotm[874],"ONLY"); + gMC->Gspos("I200",6,"IS02",0.0,0.0,0.0,idrotm[875],"ONLY"); + gMC->Gspos("I200",5,"IS02",0.0,0.0,0.0,idrotm[876],"ONLY"); + gMC->Gspos("I090",2,"IS02",0.0,0.0,-39.4,0,"ONLY"); gMC->Gspos("I090",1,"IS02",0.0,0.0,39.4,idrotm[856],"ONLY"); gMC->Gspos("I099",9,"IS02",0.0,0.0,0.0,idrotm[877],"ONLY"); @@ -3986,10 +4629,12 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I200",21,"IS02",0.0,0.0,0.0,idrotm[892],"ONLY"); gMC->Gspos("I200",20,"IS02",0.0,0.0,0.0,idrotm[868],"ONLY"); gMC->Gspos("I200",19,"IS02",0.0,0.0,0.0,idrotm[893],"ONLY"); - gMC->Gspos("I098",1,"IS02",0.0,0.0,33.6,0,"MANY"); - gMC->Gspos("I097",1,"IS02",0.0,0.0,26.6,0,"MANY"); - gMC->Gspos("I097",2,"IS02",0.0,0.0,-26.6,idrotm[856],"MANY"); - gMC->Gspos("I098",2,"IS02",0.0,0.0,-33.6,idrotm[856],"MANY"); + + gMC->Gspos("I098",1,"IS02",0.0,0.0,33.6,0,"ONLY"); + gMC->Gspos("I097",1,"IS02",0.0,0.0,26.6,0,"ONLY"); + gMC->Gspos("I097",2,"IS02",0.0,0.0,-26.6,idrotm[856],"ONLY"); + gMC->Gspos("I098",2,"IS02",0.0,0.0,-33.6,idrotm[856],"ONLY"); + gMC->Gspos("I202",1,"IS02",12.1,0.0,33.84,0,"ONLY"); gMC->Gspos("I202",6,"IS02",-6.05,-10.4789,33.84,idrotm[930],"ONLY"); gMC->Gspos("I202",5,"IS02",-6.05,10.4789,33.84,idrotm[929],"ONLY"); @@ -4009,6 +4654,8 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I203",2,"IS02",10.9227,18.9186,42.24,idrotm[853],"ONLY"); gMC->Gspos("I203",1,"IS02",21.8453,0.0,42.24,0,"ONLY"); gMC->Gspos("I095",1,"I098",0.0,0.0,0.0,0,"ONLY"); + + //I096 and I098 are real volume that are really overlapping, can not use ONLY gMC->Gspos("I096",23,"I098",22.77,0.0,0.0,idrotm[894],"MANY"); gMC->Gspos("I096",14,"I098",22.3754,6.57,0.0,idrotm[895],"MANY"); gMC->Gspos("I096",3,"I098",19.1553,12.3104,0.0,idrotm[896],"MANY"); @@ -4031,7 +4678,10 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I096",10,"I098",15.2714,-17.6241,0.0,idrotm[914],"MANY"); gMC->Gspos("I096",21,"I098",19.1553,-12.3104,0.0,idrotm[915],"MANY"); gMC->Gspos("I096",12,"I098",22.3754,-6.57,0.0,idrotm[916],"MANY"); + gMC->Gspos("I094",1,"I097",0.0,0.0,0.0,0,"ONLY"); + + // idem gMC->Gspos("I096",1,"I097",13.87,0.0,0.0,idrotm[894],"MANY"); gMC->Gspos("I096",32,"I097",13.037,6.2783,0.0,idrotm[917],"MANY"); gMC->Gspos("I096",25,"I097",8.6478,10.844,0.0,idrotm[918],"MANY"); @@ -4051,8 +4701,9 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ // --- Place volumes of SSD cone ---------------------------------- - gMC->Gspos("I212",2,"IS01",0.0,0.0,0.0,idrotm[701],"MANY"); - gMC->Gspos("I212",1,"IS01",0.0,0.0,0.0,0,"MANY"); + gMC->Gspos("I212",2,"IS01",0.0,0.0,0.0,idrotm[701],"ONLY"); + gMC->Gspos("I212",1,"IS01",0.0,0.0,0.0,0,"ONLY"); + gMC->Gspos("I211",1,"IS01",0.0,0.0,-56.5,0,"ONLY"); gMC->Gspos("I217",1,"IS01",0.0,0.0,-44.4,0,"ONLY"); // this will change after PPR to be symmetric gMC->Gspos("I219",1,"IS01",0.0,0.0,-50.25,0,"ONLY"); // this will change after PPR to be symmetric @@ -4062,19 +4713,21 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I214",2,"IS01",0.0,0.0,67.25,idrotm[701],"ONLY"); gMC->Gspos("I213",2,"IS01",0.0,0.0,62.25,idrotm[701],"ONLY"); gMC->Gspos("I213",1,"IS01",0.0,0.0,-62.25,0,"ONLY"); - gMC->Gspos("I214",1,"IS01",0.0,0.0,-67.25,0,"ONLY"); - gMC->Gspos("I215",19,"IS01",0.0,0.0,0.0,idrotm[702],"MANY"); - gMC->Gspos("I215",21,"IS01",0.0,0.0,0.0,idrotm[703],"MANY"); - gMC->Gspos("I215",23,"IS01",0.0,0.0,0.0,idrotm[704],"MANY"); - gMC->Gspos("I215",24,"IS01",0.0,0.0,0.0,idrotm[705],"MANY"); - gMC->Gspos("I215",3,"IS01",0.0,0.0,0.0,idrotm[706],"MANY"); - gMC->Gspos("I215",5,"IS01",0.0,0.0,0.0,idrotm[707],"MANY"); - gMC->Gspos("I215",7,"IS01",0.0,0.0,0.0,idrotm[708],"MANY"); - gMC->Gspos("I215",9,"IS01",0.0,0.0,0.0,idrotm[709],"MANY"); - gMC->Gspos("I215",11,"IS01",0.0,0.0,0.0,idrotm[710],"MANY"); - gMC->Gspos("I215",13,"IS01",0.0,0.0,0.0,idrotm[711],"MANY"); - gMC->Gspos("I215",15,"IS01",0.0,0.0,0.0,idrotm[712],"MANY"); - gMC->Gspos("I215",17,"IS01",0.0,0.0,0.0,idrotm[713],"MANY"); + gMC->Gspos("I214",1,"IS01",0.0,0.0,-67.25,0,"ONLY"); + + gMC->Gspos("I215",19,"IS01",0.0,0.0,0.0,idrotm[702],"ONLY"); + gMC->Gspos("I215",21,"IS01",0.0,0.0,0.0,idrotm[703],"ONLY"); + gMC->Gspos("I215",23,"IS01",0.0,0.0,0.0,idrotm[704],"ONLY"); + gMC->Gspos("I215",24,"IS01",0.0,0.0,0.0,idrotm[705],"ONLY"); + gMC->Gspos("I215",3,"IS01",0.0,0.0,0.0,idrotm[706],"ONLY"); + gMC->Gspos("I215",5,"IS01",0.0,0.0,0.0,idrotm[707],"ONLY"); + gMC->Gspos("I215",7,"IS01",0.0,0.0,0.0,idrotm[708],"ONLY"); + gMC->Gspos("I215",9,"IS01",0.0,0.0,0.0,idrotm[709],"ONLY"); + gMC->Gspos("I215",11,"IS01",0.0,0.0,0.0,idrotm[710],"ONLY"); + gMC->Gspos("I215",13,"IS01",0.0,0.0,0.0,idrotm[711],"ONLY"); + gMC->Gspos("I215",15,"IS01",0.0,0.0,0.0,idrotm[712],"ONLY"); + gMC->Gspos("I215",17,"IS01",0.0,0.0,0.0,idrotm[713],"ONLY"); + gMC->Gspos("I216",9,"IS01",0.0,0.0,45.5,idrotm[714],"ONLY"); gMC->Gspos("I216",11,"IS01",0.0,0.0,45.5,idrotm[715],"ONLY"); gMC->Gspos("I216",12,"IS01",0.0,0.0,45.5,idrotm[716],"ONLY"); @@ -4087,28 +4740,29 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->Gspos("I216",4,"IS01",0.0,0.0,-44,idrotm[723],"ONLY"); gMC->Gspos("I216",6,"IS01",0.0,0.0,-44,idrotm[724],"ONLY"); gMC->Gspos("I216",8,"IS01",0.0,0.0,-44,idrotm[725],"ONLY"); - gMC->Gspos("I215",1,"IS01",0.0,0.0,0.0,idrotm[726],"MANY"); - gMC->Gspos("I215",2,"IS01",0.0,0.0,0.0,idrotm[727],"MANY"); - gMC->Gspos("I215",4,"IS01",0.0,0.0,0.0,idrotm[728],"MANY"); - gMC->Gspos("I215",6,"IS01",0.0,0.0,0.0,idrotm[729],"MANY"); - gMC->Gspos("I215",8,"IS01",0.0,0.0,0.0,idrotm[733],"MANY"); - gMC->Gspos("I215",10,"IS01",0.0,0.0,0.0,idrotm[730],"MANY"); - gMC->Gspos("I215",12,"IS01",0.0,0.0,0.0,idrotm[731],"MANY"); - gMC->Gspos("I215",14,"IS01",0.0,0.0,0.0,idrotm[768],"MANY"); - gMC->Gspos("I215",16,"IS01",0.0,0.0,0.0,idrotm[732],"MANY"); - gMC->Gspos("I215",18,"IS01",0.0,0.0,0.0,idrotm[734],"MANY"); - gMC->Gspos("I215",20,"IS01",0.0,0.0,0.0,idrotm[798],"MANY"); - gMC->Gspos("I215",22,"IS01",0.0,0.0,0.0,idrotm[735],"MANY"); + + gMC->Gspos("I215",1,"IS01",0.0,0.0,0.0,idrotm[726],"ONLY"); + gMC->Gspos("I215",2,"IS01",0.0,0.0,0.0,idrotm[727],"ONLY"); + gMC->Gspos("I215",4,"IS01",0.0,0.0,0.0,idrotm[728],"ONLY"); + gMC->Gspos("I215",6,"IS01",0.0,0.0,0.0,idrotm[729],"ONLY"); + gMC->Gspos("I215",8,"IS01",0.0,0.0,0.0,idrotm[733],"ONLY"); + gMC->Gspos("I215",10,"IS01",0.0,0.0,0.0,idrotm[730],"ONLY"); + gMC->Gspos("I215",12,"IS01",0.0,0.0,0.0,idrotm[731],"ONLY"); + gMC->Gspos("I215",14,"IS01",0.0,0.0,0.0,idrotm[768],"ONLY"); + gMC->Gspos("I215",16,"IS01",0.0,0.0,0.0,idrotm[732],"ONLY"); + gMC->Gspos("I215",18,"IS01",0.0,0.0,0.0,idrotm[734],"ONLY"); + gMC->Gspos("I215",20,"IS01",0.0,0.0,0.0,idrotm[798],"ONLY"); + gMC->Gspos("I215",22,"IS01",0.0,0.0,0.0,idrotm[735],"ONLY"); // --- Place subdetectors' mother volumes and supports' mother volumes // into ITS mother volume ITSD - gMC->Gspos("IT12",1,"ITSD",0.0,0.0,0.0,0,"MANY"); // SPD mother volume - gMC->Gspos("IT34",1,"ITSD",0.0,0.0,0.0,0,"MANY"); // SDD mother volume - gMC->Gspos("IT56",1,"ITSD",0.0,0.0,0.0,0,"MANY"); // SSD mother volume - gMC->Gspos("IS02",1,"ITSD",0.0,0.0,0.0,0,"MANY"); // SDD cones/supports - gMC->Gspos("IS01",1,"ITSD",0.0,0.0,0.0,0,"MANY"); // SSD cones/supports + gMC->Gspos("IT12",1,"ITSD",0.0,0.0,0.0,0,"ONLY"); // SPD mother volume + gMC->Gspos("IT34",1,"ITSD",0.0,0.0,0.0,0,"ONLY"); // SDD mother volume + gMC->Gspos("IT56",1,"ITSD",0.0,0.0,0.0,0,"ONLY"); // SSD mother volume + gMC->Gspos("IS02",1,"ITSD",0.0,0.0,0.0,0,"ONLY"); // SDD cones/supports + gMC->Gspos("IS01",1,"ITSD",0.0,0.0,0.0,0,"ONLY"); // SSD cones/supports // **************************** SERVICES ********************************* @@ -4452,9 +5106,9 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dgh[1] = 12.; dgh[2] = 5.; gMC->Gsvolu("ISR2", "BOX ", idtmed[210], dgh, 3); - gMC->Gspos("ISR2", 1, "ITSV", -53.5, 0., -125.5, idrotm[199], "MANY"); + gMC->Gspos("ISR2", 1, "ITSV", -53.5, 0., -125.5, idrotm[199], "ONLY"); gMC->Gsvolu("ISR3", "BOX ", idtmed[210], dgh, 3); - gMC->Gspos("ISR3", 1, "ITSV", 53.5, 0., -125.5, idrotm[199], "MANY"); + gMC->Gspos("ISR3", 1, "ITSV", 53.5, 0., -125.5, idrotm[199], "ONLY"); dgh[0] = 5.-2.; dgh[1] = 12.-2.; @@ -4470,9 +5124,9 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ dgh[1] = 5.; dgh[2] = 2.; gMC->Gsvolu("ISR6", "TUBE", idtmed[210], dgh, 3); - gMC->Gspos("ISR6", 1, "ITSV", 0., 54., -77., idrotm[199], "MANY"); - gMC->Gspos("ISR6", 2, "ITSV", 0., 54., 77., idrotm[199], "MANY"); - gMC->Gspos("ISR6", 3, "ITSV", 0., -54., 77., idrotm[199], "MANY"); + gMC->Gspos("ISR6", 1, "ITSV", 0., 54., -77., idrotm[199], "ONLY"); + gMC->Gspos("ISR6", 2, "ITSV", 0., 54., 77., idrotm[199], "ONLY"); + gMC->Gspos("ISR6", 3, "ITSV", 0., -54., 77., idrotm[199], "ONLY"); // --- Outputs the geometry tree in the EUCLID/CAD format @@ -4480,7 +5134,224 @@ void AliITSvPPRasymmFMD::CreateGeometry(){ gMC->WriteEuclid("ITSgeometry", "ITSV", 1, 5); } + + { + if (!gGeoManager) { + AliError("TGeoManager doesn't exist !"); + return; + } + + //====== Converting mother volumes of alignable objects + //====== into TGeoAssemblies : + + TObjArray *list = gGeoManager->GetListOfVolumes(); + + { + char spdLaddName[20] = "I10B"; + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(spdLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(spdLaddName,toTransform->GetName()) == 0); + } + + // SPD 2 + { + char spdLaddName[20] = "I20B"; + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(spdLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(spdLaddName, toTransform->GetName()) == 0); + } + + //--- + + // SPD 1 + { + char spdLaddName[20] = "I107"; // "I107" + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(spdLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(spdLaddName,toTransform->GetName()) == 0); + } + + // SPD 2 + { + char spdLaddName[20] = "I1D7"; // "I1D7" + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(spdLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(spdLaddName, toTransform->GetName()) == 0); + } + + // SDD 1 + { + char sddLaddName[20] = "I004";// "I302" + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(sddLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(sddLaddName, toTransform->GetName()) == 0); + } + + // SDD 2 + { + char sddLaddName[20] = "I005";// "I402" + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(sddLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(sddLaddName, toTransform->GetName()) == 0); + } + + + // SSD 1 + { + char ssdLaddName[20] = "I565";// "I562" + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(ssdLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(ssdLaddName,toTransform->GetName()) == 0); + } + + // SSD 2 + { + char ssdLaddName[20] = "I569";// "I566" + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(ssdLaddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(ssdLaddName, toTransform->GetName()) == 0); + } + + + //====== Converting some virtual volumes to assemblies in order + //====== to avoid overlaps : + + { + char sddName[20] = "I047"; + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(sddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(sddName, toTransform->GetName()) == 0); + } + + { + char sddName[20] = "I048"; + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(sddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(sddName, toTransform->GetName()) == 0); + } + + { + char sddName[20] = "I018"; + + TGeoVolume *toTransform = gGeoManager->FindVolumeFast(sddName); + Int_t index = list->IndexOf(toTransform); + do { + TGeoVolume *transformed = 0; // this will be in fact TGeoVolumeAssembly + if (toTransform) + transformed = TGeoVolumeAssembly::MakeAssemblyFromVolume(toTransform); + if (transformed) + gGeoManager->ReplaceVolume(toTransform, transformed); + index++; + toTransform = (TGeoVolume*)list->At(index); + } + while (strcmp(sddName, toTransform->GetName()) == 0); + } + + + } + } + //______________________________________________________________________ void AliITSvPPRasymmFMD::CreateMaterials(){ // Create ITS materials @@ -4488,7 +5359,7 @@ void AliITSvPPRasymmFMD::CreateMaterials(){ // Monte Carlo simulations for the geometries AliITSv1, AliITSv3, // AliITSvPPRasymmFMD. // In general it is automatically replaced by - // the CreatMaterials routine defined in AliITSv?. Should the function + // the CreateMaterials routine defined in AliITSv?. Should the function // CreateMaterials not exist for the geometry version you are using this // one is used. See the definition found in AliITSv5 or the other routine // for a complete definition. @@ -4660,7 +5531,6 @@ void AliITSvPPRasymmFMD::CreateMaterials(){ Float_t wAlOxide[2] = {0.4707, 0.5293}; Float_t dAlOxide = 3.97; - AliMaterial(1,"SI$",0.28086E+02,0.14000E+02,0.23300E+01,0.93600E+01,0.99900E+03); AliMedium(1,"SI$",1,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi); @@ -4997,6 +5867,7 @@ void AliITSvPPRasymmFMD::CreateMaterials(){ AliMaterial(96, "SSD cone$",63.546, 29., 1.15, 1.265, 999); AliMedium(96,"SSD cone$",96,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); } + //______________________________________________________________________ void AliITSvPPRasymmFMD::InitAliITSgeom(){ // Based on the geometry tree defined in Geant 3.21, this @@ -5008,144 +5879,113 @@ void AliITSvPPRasymmFMD::InitAliITSgeom(){ // none. // Return: // none. -//#if GEANTGEOMETRY - if(strcmp(gMC->GetName(),"TGeant3")) { - Error("InitAliITSgeom", - "Wrong Monte Carlo. InitAliITSgeom uses TGeant3 calls"); - return; - } // end if - AliDebug(1,"Reading Geometry transformation directly from Geant 3."); const Int_t knlayers = 6; - const Int_t kndeep = 9; - Int_t itsGeomTreeNames[knlayers][kndeep],lnam[20],lnum[20]; - Int_t nlad[knlayers],ndet[knlayers]; - Double_t t[3],r[10]; - Float_t par[20],att[20]; - Int_t npar,natt,idshape,imat,imed; - AliITSGeant3Geometry *ig = new AliITSGeant3Geometry(); - Int_t mod,lay,lad,det,i,j,k; - Char_t names[knlayers][kndeep][4]; - Int_t itsGeomTreeCopys[knlayers][kndeep]; - if(fMinorVersion == 1){ // Option A - const char *namesA[knlayers][kndeep] = { - {"ALIC","ITSV","ITSD","IT12","I12A","I10A","I103","I101","ITS1"}, // lay=1 - {"ALIC","ITSV","ITSD","IT12","I12A","I20A","I1D3","I1D1","ITS2"}, // lay=2 - {"ALIC","ITSV","ITSD","IT34","I004","I302","ITS3"," "," "}, // lay=3 - {"ALIC","ITSV","ITSD","IT34","I005","I402","ITS4"," "," "}, // lay=4 - {"ALIC","ITSV","ITSD","IT56","I565","I562","ITS5"," "," "}, // lay=5 - {"ALIC","ITSV","ITSD","IT56","I569","I566","ITS6"," "," "}};// lay=6 - Int_t itsGeomTreeCopysA[knlayers][kndeep]= {{1,1,1,1,10, 2, 4,1,1},// lay=1 - {1,1,1,1,10, 4, 4,1,1},// lay=2 - {1,1,1,1,14, 6, 1,0,0},// lay=3 - {1,1,1,1,22, 8, 1,0,0},// lay=4 - {1,1,1,1,34,22, 1,0,0},// lay=5 - {1,1,1,1,38,25, 1,0,0}};//lay=6 - for(i=0;iStringToInt(names[i][j]); + const Int_t kndeep = 3; + 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/IT34_1/I005_%d/I402_%d/ITS4_%d", // lay=4 + "/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"},// lay=6 + {"/ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_%d/I10B_%d/I107_%d/I101_1/ITS1_1", // lay=1 + "/ALIC_1/ITSV_1/ITSD_1/IT12_1/I12B_%d/I20B_%d/I1D7_%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/IT34_1/I005_%d/I402_%d/ITS4_%d", // lay=4 + "/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 kitsGeomTreeCopys[knlayers][kndeep]= {{10, 2, 4},// lay=1 + {10, 4, 4},// lay=2 + {14, 6, 1},// lay=3 + {22, 8, 1},// lay=4 + {34,22, 1},// lay=5 + {38,25, 1}};//lay=6 + Int_t nlad[knlayers],ndet[knlayers]; + Int_t mod,lay,lad=0,det=0,i,j,k,cp0,cp1,cp2; + TString path,shapeName; + TGeoHMatrix materix; + Double_t trans[3]={3*0.0},rot[10]={9*0.0,1.0}; + TArrayD shapePar; + TArrayF shapeParF; + Bool_t shapeDefined[3]={kFALSE,kFALSE,kFALSE}; + + AliDebug(1,"Reading Geometry transformation directly from Modler."); mod = 0; for(i=0;iGetGeometry(kndeep,lnam,lnum,t,r,idshape,npar,natt, - par,att,imat,imed); - GetITSgeom()->CreatMatrix(mod,lay,lad,det,kSPD,t,r); - if(!(GetITSgeom()->IsShapeDefined((Int_t)kSPD))) - GetITSgeom()->ReSetShape(kSPD, - new AliITSgeomSPD425Short(npar,par)); - } // end for det - } // end for k - } // end for j - break; - case 3: case 4: case 5: case 6: // layers 3-6 - lnum[6] = 1; - for(lad=1;lad<=itsGeomTreeCopys[lay-1][4];lad++){ - lnum[4] = lad; - for(det=1;det<=itsGeomTreeCopys[lay-1][5];det++){ - lnum[5] = det; - mod++; - ig->GetGeometry(7,lnam,lnum,t,r,idshape,npar,natt, - par,att,imat,imed); - switch (lay){ - case 3: case 4: - GetITSgeom()->CreatMatrix(mod,lay,lad,det,kSDD,t,r); - if(!(GetITSgeom()->IsShapeDefined(kSDD))) - GetITSgeom()->ReSetShape(kSDD, - new AliITSgeomSDD256(npar,par)); - break; - case 5: - GetITSgeom()->CreatMatrix(mod,lay,lad,det,kSSD,t,r); - if(!(GetITSgeom()->IsShapeDefined(kSSD))) - GetITSgeom()->ReSetShape(kSSD, - new AliITSgeomSSD275and75(npar,par)); - break; - case 6: - GetITSgeom()->CreatMatrix(mod,lay,lad,det,kSSD,t,r); - if(!(GetITSgeom()->IsShapeDefined(kSSD))) - GetITSgeom()->ReSetShape(kSSD, - new AliITSgeomSSD75and275(npar,par)); - break; - } // end switch - } // end for det - } // end for lad - break; - } // end switch + 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:{ + det = cp2; + lad = cp1+2*(cp0-1); + }break; + case 2:{ + det = cp2; + lad = cp1+4*(cp0-1); + } break; + case 3: case 4: case 5: case 6:{ + det = cp1; + lad = cp0; + } break; + } // end switch + //AliInfo(Form("path=%s lay=%d lad=%d det=%d", + // path.Data(),lay,lad,det)); + gMC->GetTransformation(path.Data(),materix); + gMC->GetShape(path.Data(),shapeName,shapePar); + shapeParF.Set(shapePar.GetSize()); + for(i=0;iCreateMatrix(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]){ + geom->ReSetShape(kSPD,new AliITSgeomSPD425Short( + shapeParF.GetSize(),shapeParF.GetArray())); + shapeDefined[kSPD] = kTRUE; + }break; + case 3: case 4: + if(!shapeDefined[kSDD]){ + geom->ReSetShape(kSDD,new AliITSgeomSDD256( + shapeParF.GetSize(),shapeParF.GetArray())); + shapeDefined[kSDD] = kTRUE; + }break; + case 5: case 6: + if(!shapeDefined[kSSD]){ + geom->ReSetShape(kSSD,new AliITSgeomSSD75and275( + shapeParF.GetSize(),shapeParF.GetArray())); + shapeDefined[kSSD] = kTRUE; + }break; + default:{ + }break; + } // end switch + mod++; + } /// end for cp2 + } // end for cp1 + } // end for cp0 } // end for lay -//#endif return; } + //______________________________________________________________________ void AliITSvPPRasymmFMD::Init(){ // Initialise the ITS after it has been created. @@ -5156,20 +5996,25 @@ void AliITSvPPRasymmFMD::Init(){ // Return: // none. - AliInfo(Form("Minor version %d",fMinorVersion)); + 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); - if(GetITSgeom()!=0) SetITSgeom(0x0); 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. } + //______________________________________________________________________ void AliITSvPPRasymmFMD::SetDefaults(){ // sets the default segmentation, response, digit and raw cluster classes @@ -5180,96 +6025,20 @@ void AliITSvPPRasymmFMD::SetDefaults(){ // Return: // none. - const Float_t kconv = 1.0e+04; // convert cm to microns - AliInfo("Called"); + if(!fDetTypeSim){ + Warning("SetDefaults","Error fDetTypeSim not defined"); + return; + } - if(!fDetTypeSim) fDetTypeSim = new AliITSDetTypeSim(); - fDetTypeSim->SetITSgeom(GetITSgeom()); - - AliITSgeomSPD *s0; - AliITSgeomSDD *s1; - AliITSgeomSSD *s2; - Int_t i; - Float_t bx[256],bz[280]; - - fDetTypeSim->ResetCalibrationArray(); - fDetTypeSim->ResetSegmentation(); - fDetTypeSim->SetDefaults(); - //SPD - s0 = (AliITSgeomSPD*) GetITSgeom()->GetShape(kSPD);// Get shape info. Do it this way for now. - //AliITSCalibrationSPD* resp0=new AliITSCalibrationSPD(); - - //AliITSsegmentationSPD *seg0=new AliITSsegmentationSPD(GetITSgeom()); - - AliITSsegmentationSPD* seg0 = (AliITSsegmentationSPD*)fDetTypeSim->GetSegmentationModel(0); - seg0->SetDetSize(s0->GetDx()*2.*kconv, // base this on AliITSgeomSPD - s0->GetDz()*2.*kconv, // for now. - s0->GetDy()*2.*kconv); // x,z,y full width in microns. - seg0->SetNPads(256,160);// Number of Bins in x and z - for(i=000;i<256;i++) bx[i] = 50.0; // in x all are 50 microns. - for(i=000;i<160;i++) bz[i] = 425.0; // most are 425 microns except below - for(i=160;i<280;i++) bz[i] = 0.0; // Outside of detector. - bz[ 31] = bz[ 32] = 625.0; // first chip boundry - bz[ 63] = bz[ 64] = 625.0; // first chip boundry - bz[ 95] = bz[ 96] = 625.0; // first chip boundry - bz[127] = bz[128] = 625.0; // first chip boundry - bz[160] = 425.0; // Set so that there is no zero pixel size for fNz. - seg0->SetBinSize(bx,bz); // Based on AliITSgeomSPD for now. - SetSegmentationModel(kSPD,seg0); - // set digit and raw cluster classes to be used - const char *kData0=(fDetTypeSim->GetCalibrationModel(GetITSgeom()->GetStartSPD()))->DataType(); - if (strstr(kData0,"real")) fDetTypeSim->SetDigitClassName(kSPD,"AliITSdigit"); - else fDetTypeSim->SetDigitClassName(kSPD,"AliITSdigitSPD"); - // SDD - s1 = (AliITSgeomSDD*) GetITSgeom()->GetShape(kSDD);// Get shape info. Do it this way for now. - - //AliITSCalibrationSDD* resp1=new AliITSCalibrationSDD("simulated"); - - //AliITSsegmentationSDD *seg1=new AliITSsegmentationSDD(GetITSgeom(),resp1); - - AliITSsegmentationSDD* seg1 = (AliITSsegmentationSDD*)fDetTypeSim->GetSegmentationModel(1); - seg1->SetDetSize(s1->GetDx()*kconv, // base this on AliITSgeomSDD - s1->GetDz()*2.*kconv, // for now. - s1->GetDy()*2.*kconv); // x,z,y full width in microns. - seg1->SetNPads(256,256);// Use AliITSgeomSDD for now - SetSegmentationModel(kSDD,seg1); - const char *kData1=(fDetTypeSim->GetCalibrationModel(GetITSgeom()->GetStartSDD()))->DataType(); - AliITSCalibrationSDD* rsp = (AliITSCalibrationSDD*)fDetTypeSim->GetCalibrationModel(GetITSgeom()->GetStartSDD()); - const char *kopt=rsp->GetZeroSuppOption(); - if((!strstr(kopt,"2D")) && (!strstr(kopt,"1D")) || strstr(kData1,"real") ){ - fDetTypeSim->SetDigitClassName(kSDD,"AliITSdigit"); - } else fDetTypeSim->SetDigitClassName(kSDD,"AliITSdigitSDD"); - // SSD Layer 5 - - s2 = (AliITSgeomSSD*) GetITSgeom()->GetShape(kSSD);// Get shape info. Do it this way for now. - - - //SetCalibrationModel(GetITSgeom()->GetStartSSD(),new AliITSCalibrationSSD("simulated")); - - //AliITSsegmentationSSD *seg2=new AliITSsegmentationSSD(GetITSgeom()); - AliITSsegmentationSSD* seg2 = (AliITSsegmentationSSD*)fDetTypeSim->GetSegmentationModel(2); - seg2->SetDetSize(s2->GetDx()*2.*kconv, // base this on AliITSgeomSSD - s2->GetDz()*2.*kconv, // for now. - s2->GetDy()*2.*kconv); // x,z,y full width in microns. - seg2->SetPadSize(95.,0.); // strip x pitch in microns - seg2->SetNPads(768,0); // number of strips on each side. - seg2->SetAngles(0.0075,0.0275); // strip angels rad P and N side. - seg2->SetAnglesLay5(0.0075,0.0275); // strip angels rad P and N side. - seg2->SetAnglesLay6(0.0275,0.0075); // strip angels rad P and N side. - SetSegmentationModel(kSSD,seg2); - const char *kData2=(fDetTypeSim->GetCalibrationModel(GetITSgeom()->GetStartSSD()))->DataType(); - if(strstr(kData2,"real") ) fDetTypeSim->SetDigitClassName(kSSD,"AliITSdigit"); - else fDetTypeSim->SetDigitClassName(kSSD,"AliITSdigitSSD"); if(fgkNTYPES>3){ Warning("SetDefaults", "Only the four basic detector types are initialised!"); }// end if - - return; } + //______________________________________________________________________ void AliITSvPPRasymmFMD::DrawModule() const{ // Draw a shaded view of the FMD version 10. @@ -5322,6 +6091,8 @@ void AliITSvPPRasymmFMD::DrawModule() const{ gMC->Gdhead(1111, "Inner Tracking System Version 1"); gMC->Gdman(17, 6, "MAN"); } + +/* //______________________________________________________________________ void AliITSvPPRasymmFMD::StepManager(){ // Called for every step in the ITS, then calles the AliITShit class @@ -5455,3 +6226,261 @@ void AliITSvPPRasymmFMD::StepManager(){ return; } + +*/ + +//______________________________________________________________________ +void AliITSvPPRasymmFMD::StepManager(){ + // Called for every step in the ITS, then calles the AliITShit class + // creator with the information to be recoreded about that hit. + // The value of the macro ALIITSPRINTGEOM if set to 1 will allow the + // printing of information to a file which can be used to create a .det + // file read in by the routine CreateGeometry(). If set to 0 or any other + // value except 1, the default behavior, then no such file is created nor + // it the extra variables and the like used in the printing allocated. + // Inputs: + // none. + // Outputs: + // none. + // Return: + // none. + + if(!(this->IsActive())) return; + if(!(gMC->TrackCharge())) return; + + Int_t copy, id,kk; + Bool_t sensvol = kFALSE; + + id = gMC->CurrentVolID(copy); + for(kk=0;kkIsTrackExiting()){ + AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kITS); + } // if Outer ITS mother Volume + + static TLorentzVector position, momentum; // Saves on calls to construtors + static AliITShit hit;// Saves on calls to construtors + Int_t cpn0,cpn1,cpn2,status,mod; + //TClonesArray &lhits = *(GetDetTypeSim()->GetHits()); + TClonesArray &lhits = *(Hits()); + // + // Track status + status = 0; + if(gMC->IsTrackInside()) status += 1; + if(gMC->IsTrackEntering()) status += 2; + if(gMC->IsTrackExiting()) status += 4; + if(gMC->IsTrackOut()) status += 8; + if(gMC->IsTrackDisappeared()) status += 16; + if(gMC->IsTrackStop()) status += 32; + if(gMC->IsTrackAlive()) status += 64; + // + switch (kk){ + case 0:case 1: // SPD + gMC->CurrentVolOffID(2,cpn2); + gMC->CurrentVolOffID(4,cpn1); + gMC->CurrentVolOffID(5,cpn0); + break; + case 2:case 3: // SDD + cpn2 = 1; + gMC->CurrentVolOffID(1,cpn1); + gMC->CurrentVolOffID(2,cpn0); + break; + case 4:case 5: // SSD + cpn2 = 1; + gMC->CurrentVolOffID(1,cpn1); + gMC->CurrentVolOffID(2,cpn0); + break; + default: + AliError(Form("Invalid value: kk= %d . Not an ITS sensitive volume",kk)); + return; // not an ITS sensitive volume. + } // + fIgm.DecodeDetector(mod,kk+1,cpn0,cpn1,cpn2); + //Info("StepManager","lay=%d mod=%d cpn0=%d cpn1=%d cpn2=%d",kk+1,mod,cpn0,cpn1,cpn2); + Int_t lay,lad,det,cpy0,cpy1,cpy2; + fIgm.DecodeDetectorLayers(mod,lay,lad,det); + fIgm.RecodeDetector(mod,cpy0,cpy1,cpy2); +// printf("gMC: kk=%d cpn0=%d cpn1=%d cpn2=%d -> mod=%d -> " +// "lay=%d lad=%d det=%d -> cpn0=%d cpn1=%d cpn2=%d\n", +// kk,cpn0,cpn1,cpn2,mod,lay,lad,det,cpy0,cpy1,cpy2); + // + // Fill hit structure. + // + hit.SetModule(mod); + hit.SetTrack(gAlice->GetMCApp()->GetCurrentTrackNumber()); + gMC->TrackPosition(position); + gMC->TrackMomentum(momentum); + hit.SetPosition(position); + hit.SetTime(gMC->TrackTime()); + hit.SetMomentum(momentum); + hit.SetStatus(status); + hit.SetEdep(gMC->Edep()); + hit.SetShunt(GetIshunt()); + if(gMC->IsTrackEntering()){ + hit.SetStartPosition(position); + hit.SetStartTime(gMC->TrackTime()); + hit.SetStartStatus(status); + return; // don't save entering hit. + } // end if IsEntering + // Fill hit structure with this new hit. + //Info("StepManager","Calling Copy Constructor"); + new(lhits[fNhits++]) AliITShit(hit); // Use Copy Construtor. + // Save old position... for next hit. + hit.SetStartPosition(position); + hit.SetStartTime(gMC->TrackTime()); + hit.SetStartStatus(status); + // + /* + Int_t idettype,ix,iz; + Float_t lx,lz; + Double_t g0[4],l0[4],g1[4]; + position.GetXYZT(g0); + gMC->Gmtod(g0,l0,1); // flag=1 convert coordiantes + gMC->Gdtom(l0,g1,1); // flag=1 convert coordinates + switch(idettype=(Int_t)GetITSgeom()->GetModuleType(mod)){ + case kSPD: + AliITSsegmentationSPD *segspd = (AliITSsegmentationSPD *)GetSegmentationModelByModule(mod); + segspd->LocalToDet((Float_t)l0[0],(Float_t)l0[2],ix,iz); + segspd->DetToLocal(ix,iz,lx,lz); + break; + case kSDD: + AliITSsegmentationSDD *segsdd = (AliITSsegmentationSDD *)GetSegmentationModelByModule(mod); + segsdd->LocalToDet((Float_t)l0[0],(Float_t)l0[2],ix,iz); + segsdd->DetToLocal(ix,iz,lx,lz); + break; + case kSSD: + AliITSsegmentationSSD *segssd = (AliITSsegmentationSSD *)GetSegmentationModelByModule(mod); + segssd->LocalToDet((Float_t)l0[0],(Float_t)l0[2],ix,iz); + segssd->DetToLocal(ix,iz,lx,lz); + break; + default: + ix = iz = -1; + lx = lz = 0.0; + Warning("StepManager","Unknown module type id=%d mod=%d", + (Int_t)(GetITSgeom()->GetModuleType(mod)),mod); + } // end if + printf(" gMC: mod=%d g=%g %g %g %g -> " + "l=%g %g %g %g -> " + "g=%g %g %g %g -> " + "ix=%d iz=%d -> lx=%g lz=%g\n", + mod,g0[0],g0[1],g0[2],g0[3], + l0[0],l0[1],l0[2],l0[3], + g1[0],g1[1],g1[2],g1[3],ix,iz,lx,lz); + GetITSgeom()->GtoL(mod,g0,l0); + GetITSgeom()->LtoG(mod,l0,g1); + printf("ITSgeom: mod=%d g=%g %g %g %g -> " + "l=%g %g %g %g -> " + "g=%g %g %g %g -> " + "ix=%d iz=%d -> lx=%g lz=%g\n", + mod,g0[0],g0[1],g0[2],g0[3], + l0[0],l0[1],l0[2],l0[3], + g1[0],g1[1],g1[2],g1[3],ix,iz,lx,lz); + TGeoNode *cur = gGeoManager->GetCurrentNode(); + cur->MasterToLocal(g0,l0); + cur->LocalToMaster(l0,g1); + printf(" TGeo: mod=%d g=%g %g %g %g -> " + "l=%g %g %g %g -> " + "g=%g %g %g %g\n", + mod,g0[0],g0[1],g0[2],g0[3], + l0[0],l0[1],l0[2],l0[3], + g1[0],g1[1],g1[2],g1[3]); + printf("=====================\n"); + // + */ + return; +} + +//______________________________________________________________________ +void AliITSvPPRasymmFMD::PrintAscii(ostream *os)const{ + // Print out class data values in Ascii Form to output stream + // Inputs: + // ostream *os Output stream where Ascii data is to be writen + // Outputs: + // none. + // Return: + // none. +#if defined __GNUC__ +#if __GNUC__ > 2 + ios::fmtflags fmt; +#else + Int_t fmt; +#endif +#else +#if defined __ICC || defined __ECC || defined __xlC__ + ios::fmtflags fmt; +#else + Int_t fmt; +#endif +#endif + + *os << fGeomDetOut << " " << fGeomDetIn << " " << fByThick << " "; + *os << fMajorVersion << " " << fMinorVersion << " "; + *os << "\"" << fEuclidGeomDet.Data() << "\"" << " "; + *os << "\"" << fRead.Data() << "\"" << " "; + *os << "\"" << fWrite.Data() << "\"" << " "; + fmt = os->setf(ios::scientific); // set scientific floating point output + *os << fDet1 << " " << fDet2 << " " << fChip1 << " " << fChip2 << " "; + *os << fRails << " " << fFluid << " " << fIDMother; + os->flags(fmt); // reset back to old Formating. + return; +} + +//______________________________________________________________________ +void AliITSvPPRasymmFMD::ReadAscii(istream *is){ + // Read in class data values in Ascii Form to output stream + // Inputs: + // istream *is Input stream where Ascii data is to be read in from + // Outputs: + // none. + // Return: + // none. + Char_t name[120]; + + *is >> fGeomDetOut >> fGeomDetIn >> fByThick; + *is >> fMajorVersion >> fMinorVersion; + *is >> name; + fEuclidGeomDet = name; + *is >> name; + fRead = name; + *is >> name; + fWrite = name; + *is >> fDet1 >> fDet2 >> fChip1 >> fChip2; + *is >> fRails >> fFluid >> fIDMother; + fIgm.SetVersion((AliITSVersion_t)fMajorVersion,fMinorVersion); + fIgm.SetGeometryName("ITS PPR aymmetric services with course" + " cables on cones"); +} + +//______________________________________________________________________ +ostream &operator<<(ostream &os,const AliITSvPPRasymmFMD &s){ + // Standard output streaming function + // Inputs: + // ostream &os output steam + // AliITSvPPRasymmFMD &s class to be streamed. + // Output: + // none. + // Return: + // ostream &os The stream pointer + + s.PrintAscii(&os); + return os; +} + +//______________________________________________________________________ +istream &operator>>(istream &is,AliITSvPPRasymmFMD &s){ + // Standard inputput streaming function + // Inputs: + // istream &is input steam + // AliITSvPPRasymmFMD &s class to be streamed. + // Output: + // none. + // Return: + // ostream &os The stream pointer + + s.ReadAscii(&is); + return is; +}