**************************************************************************/
-// $Id$
+/* $Id$ */
//========================================================================
//
// Geometry of the Inner Tracking System
-//
+// ---------------------------------------
// This geometry is a mix between the old geometry (originally coded
// in AliITSvPPRasymmFMD) and the new TGeo geometry (v11).
// The flags which indicate whether the old or the new part is used
-// $Log$
+// $Log: AliITSv11Hybrid.cxx,v $
+// Revision 1.14 2008/01/10 11:14:13 masera
+// SPD/SDD thermal shield and SPD cones updated (M. Sitta)
+//
+// Revision 1.13 2007/12/20 16:58:46 masera
+// bug fixes for SPD1 and SDD1 (A. Dainese)
+//
+// Revision 1.12 2007/12/17 14:48:23 masera
+// Thermal shield between SPD and SDD (M. Sitta)
+//
+// Revision 1.11 2007/11/22 08:32:48 masera
+// Second thermal shield updated in agreement with the installed one. Correction concerning the chemical composition of Rohacell (M.Sitta)
+//
// Revision 1.10 2007/11/19 17:01:26 masera
// SSD ladder supports + endcaps systems (E. Cattaruzza)
//
#include <TTUBE.h>
#include <TGeoManager.h>
#include <TGeoVolume.h>
+#include <TGeoXtru.h>
#include <TVirtualMC.h>
#include "AliITS.h"
#include "AliITSv11GeometrySPD.h"
#include "AliITSv11GeometrySDD.h"
#include "AliITSv11GeometrySSD.h"
+#include "AliITSv11GeometrySupport.h"
ClassImp(AliITSv11Hybrid)
fInitGeom((AliITSVersion_t)fMajorVersion,fMinorVersion),
fSPDgeom(0),
fSDDgeom(0),
- fSSDgeom(0)
+ fSSDgeom(0),
+ fSupgeom(0)
{
// Standard default constructor
// Inputs:
fInitGeom((AliITSVersion_t)fMajorVersion,fMinorVersion),
fSPDgeom(0),
fSDDgeom(0),
- fSSDgeom(0) {
+ fSSDgeom(0),
+ fSupgeom(0)
+{
// Standard constructor for the v11Hybrid geometry.
// Inputs:
// const char * title Arbitrary title
fSPDgeom = new AliITSv11GeometrySPD();
fSDDgeom = new AliITSv11GeometrySDD(0);
fSSDgeom = new AliITSv11GeometrySSD();
+ fSupgeom = new AliITSv11GeometrySupport();
fIdN = 6;
fIdName = new TString[fIdN];
fInitGeom((AliITSVersion_t)fMajorVersion,fMinorVersion),
fSPDgeom(0),
fSDDgeom(0),
- fSSDgeom(0) {
+ fSSDgeom(0),
+ fSupgeom(0)
+{
// Standard constructor for the v11Hybrid geometry.
// Inputs:
// const char * name Ignored, set to "ITS"
fSPDgeom = new AliITSv11GeometrySPD();
fSDDgeom = new AliITSv11GeometrySDD(0);
fSSDgeom = new AliITSv11GeometrySSD();
+ fSupgeom = new AliITSv11GeometrySupport();
fIdN = 6;
fIdName = new TString[fIdN];
delete fSPDgeom;
delete fSDDgeom;
delete fSSDgeom;
+ delete fSupgeom;
}
//______________________________________________________________________
}
//______________________________________________________________________
-void AliITSv11Hybrid::AddAlignableVolumes() const
-{
- //
+void AliITSv11Hybrid::AddAlignableVolumes() const{
// Creates entries for alignable volumes associating the symbolic volume
// name with the corresponding volume path.
//
// system
// For this, this function has to run before the misalignment because we
// are using the ideal positions in the AliITSgeom object.
+ // Inputs:
+ // none.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
AliInfo("Add ITS alignable volumes");
}
if( !gGeoManager->SetAlignableEntry("ITS","ALIC_1/ITSV_1") )
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry ! %s :: %s",
+ "ITS","ALIC_1/ITSV_1"));
TString strSPD = "ITS/SPD";
TString strSDD = "ITS/SDD";
//===== SPD layers =====
if (AliITSInitGeometry::SPDIsTGeoNative()) { // new SPD geometry
- TString str0 = "ALIC_1/ITSV_1/ITSSPDCarbonFiberSectorV_";
- TString str1 = "/ITSSPDSensitiveVirtualvolumeM0_1/LAY1_STAVE_";
- TString str1Bis = "/HALF-STAVE";
+ TString str0 = "ALIC_1/ITSV_1/ITSSPD_1/ITSSPDCarbonFiberSectorV_";
+ TString str1 = "/ITSSPDSensitiveVirtualvolumeM0_1/ITSSPDlay1-Stave_";
+ TString str1Bis = "/ITSSPDhalf-Stave";
TString str1Tierce = "_1";
- TString str2 = "/LAY1_LADDER_";
+ TString str2 = "/ITSSPDlay1-Ladder_";
TString sector;
TString stave;
strEntryName1 += strSector;
strEntryName1 += cSect;
if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data()))
- AliFatal("Unable to set alignable entry!!");
- //printf("%s == %s\n",strEntryName1.Data(),sector.Data());
-
+ AliFatal(Form("New lay 1: Unable to set alignable entry 1! %s::%s",
+ strEntryName1.Data(),sector.Data()));
+
for(Int_t cStave=0; cStave<2; cStave++) {
stave = sector;
stave += str1;
- stave += cStave;
+ stave += cStave+1;
strEntryName2 = strEntryName1;
strEntryName2 += strStave;
strEntryName2 += cStave;
strEntryName3 += strHalfStave;
strEntryName3 += cHS;
- if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),halfStave.Data()))
- AliFatal(Form("Unable to set alignable entry!! %s :: %s",strEntryName3.Data(),halfStave.Data()));
+ if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),
+ halfStave.Data()))
+ AliFatal(Form("New lay 1: Unable to set alignable entry 3! %s::%s",
+ strEntryName3.Data(),halfStave.Data()));
for(Int_t cLad=0; cLad<2; cLad++) {
module = halfStave;
module += str2;
- module += cLad+cHS*2;
+ module += cLad+cHS*2+1;
strEntryName4 = strEntryName3;
strEntryName4 += strLadder;
strEntryName4 += cLad+cHS*2;
- if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data()))
- AliFatal("Unable to set alignable entry!!");
-
- SetT2Lmatrix(strEntryName4.Data(), -0.0081, kTRUE, kTRUE);
- // -0.0081 is the shift between the centers of alignable and sensitive volumes
- // It is directly extracted from the new SPD geometry
-
- }
- }
- }
- }
-
- str1 = "/ITSSPDSensitiveVirtualvolumeM0_1/LAY2_STAVE_";
- str2 = "/LAY2_LADDER_";
+ if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),
+ module.Data()))
+ AliFatal(Form("New lay 1: Unable to set alignable entry 4! %s::%s",
+ strEntryName4.Data(),module.Data()));
+
+ SetT2Lmatrix(strEntryName4.Data(), 0.0081, kTRUE, kTRUE);
+ // 0.0081 is the shift between the centers of alignable
+ // and sensitive volumes. It is directly extracted from
+ // the new SPD geometry
+ } // end for cLad
+ } // end for cHS
+ } // end for cStave
+ } // end for cSect
+
+ str1 = "/ITSSPDSensitiveVirtualvolumeM0_1/ITSSPDlay2-Stave_";
+ str2 = "/ITSSPDlay2-Ladder_";
for(Int_t cSect = 0; cSect<10; cSect++) {
stave = sector;
stave += str1;
- stave += cStave;
+ stave += cStave+1;
strEntryName2 = strEntryName1;
strEntryName2 += strStave;
strEntryName2 += cStave;
strEntryName3 += strHalfStave;
strEntryName3 += cHS;
- if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),halfStave.Data()))
- AliFatal("Unable to set alignable entry!!");
+ if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),
+ halfStave.Data()))
+ AliFatal(Form("New lay 2: Unable to set alignable entry 3! %s::%s",
+ strEntryName3.Data(),halfStave.Data()));
for(Int_t cLad=0; cLad<2; cLad++) {
-
+
module = halfStave;
module += str2;
- module += cLad+cHS*2;
+ module += cLad+cHS*2 +1;
strEntryName4 = strEntryName3;
strEntryName4 += strLadder;
strEntryName4 += cLad+cHS*2;
- if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data()))
- AliFatal("Unable to set alignable entry!!");
+ if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),
+ module.Data()))
+ AliFatal(Form("New lay 2: Unable to set alignable entry 4! %s::%s",
+ strEntryName4.Data(),module.Data()));
SetT2Lmatrix(strEntryName4.Data(), -0.0081, kFALSE);
- }
- }
- }
- }
+ } // end for cLad
+ } // end for cHS
+ } // end for cStave
+ } // cSect
} else { // else old SPD geometry
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!!");
-
+ AliFatal(Form("Old lay1: Unable to set alignable entry 1! %s::%s",
+ strEntryName1.Data(),sector.Data()));
+
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
+ // this is a stave
+ //printf("%s == %s\n",strEntryName2.Data(),stave.Data());
for(Int_t cHS=0; cHS<2; cHS++) {
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!!");
+ // this is a half-stave
+ //printf("%s == %s\n",strEntryName3.Data(),halfStave.Data());
+ if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),
+ halfStave.Data()))
+ AliFatal(Form("Old lay 1: Unable to set alignable entry 3! %s::%s",
+ strEntryName3.Data(),halfStave.Data()));
for(Int_t cLadder = 0; cLadder<2; cLadder++) {
strEntryName4 += strLadder;
strEntryName4 += cLadder+cHS*2;
//printf("%s == %s\n",strEntryName4.Data(),module.Data());
- if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data()))
- AliFatal("Unable to set alignable entry!!");
+ if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),
+ module.Data()))
+ AliFatal(Form("Old lay 1: Unable to set alignable entry 4! %s::%s",
+ strEntryName4.Data(),module.Data()));
SetT2Lmatrix(strEntryName4.Data(), -fChip1*0.0001/2., kTRUE);
- }
- }
- }
- }
+ } // end for cLadder
+ } // end for cHS
+ } // end for cStave
+ } // end for cSect
str1Bis = "/L2H-STAVE";
str1 = "/I20B_";
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 ...
-
+ //if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data()))
+ // AliFatal(Form("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;
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!!");
+ // this is a half-stave
+ //printf("%s == %s\n",strEntryName3.Data(),halfStave.Data());
+ if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(),
+ halfStave.Data()))
+ AliFatal(Form("Old lay 2: Unable to set alignable entry 3! %s::%s",
+ strEntryName3.Data(),halfStave.Data()));
for(Int_t cLad =0; cLad<2; cLad++) {
-
+
module = halfStave;
module += str2;
module += cLad+cHS*2+1;
strEntryName4 += strLadder;
strEntryName4 += cLad+cHS*2;
//printf("%s == %s\n",strEntryName4.Data(),module.Data());
- if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data()))
- AliFatal("Unable to set alignable entry!!");
+ if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),
+ module.Data()))
+ AliFatal(Form("Old lay2: Unable to set alignable entry 4! %s::%s",
+ strEntryName4.Data(),module.Data()));
SetT2Lmatrix(strEntryName4.Data(), -fChip2*0.0001/2., kFALSE);
- }
- }
- }
- }
- }
+ } // end for cLad
+ } // end for cHS
+ } // end for cStave
+ } // end for cSect
+ } // end if AliITSInitGeometry::SPSIsTGeoNative().
//===== SDD layers =====
if (AliITSInitGeometry::SDDIsTGeoNative()) { // new SDD geometry
strEntryName1 += c1;
//printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
for(Int_t c2 =0; c2<6; c2++) {
strEntryName2 += c2;
//printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
+ if(c1 != 2) {
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE, c2>=3);
+ } else {// for ladder 2, mounted with a pi rot around y
+ SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE, c2<3);
+ }
}
}
strEntryName1 += c1;
//printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
for(Int_t c2 =0; c2<8; c2++) {
strEntryName2 += c2;
//printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE, c2>=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());
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
for(Int_t c2 =1; c2<=6; c2++){
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());
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE);
}
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());
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
for(Int_t c2 =1; c2<=8; c2++){
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());
+ AliFatal(Form("Unable to set alignable entry 2! %s,%s",
+ strEntryName2.Data(),wafer.Data()));
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE);
}
//===== SSD layers =====
if (AliITSInitGeometry::SSDIsTGeoNative()) { // new SSD geometry
- TString str0 = "/ALIC_1/ITSV_1/ITSssdLayer5_1/ITSssdLay5Ladd_"; // SSD layer1
+ TString str0 = "/ALIC_1/ITSV_1/ITSssdLayer5_1/ITSssdLay5Ladd_";//SSD layer1
TString str1 = "/ITSsddSensor5_";
TString str2 = "";
TString ladder;
strEntryName1 += c1;
//printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
for(Int_t c2 =0; c2<22; c2++) {
strEntryName2 += c2;
//printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE, kFALSE);
}
strEntryName1 += c1;
//printf("%s == %s\n",strEntryName1.Data(),ladder.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
for(Int_t c2 =0; c2<25; c2++) {
strEntryName2 += c2;
//printf("%s == %s\n",strEntryName2.Data(),wafer.Data());
if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data()))
- AliFatal("Unable to set alignable entry!!");
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE, kFALSE);
}
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());
-
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
+
for(Int_t c2 = 1; c2<=22; c2++){
wafer = ladder;
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());
-
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
+
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE);
}
}
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());
-
+ AliFatal(Form("Unable to set alignable entry 1! %s :: %s",
+ strEntryName1.Data(),ladder.Data()));
+
for(Int_t c2 = 1; c2<=25; c2++){
wafer = ladder;
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());
-
+ AliFatal(Form("Unable to set alignable entry 2! %s :: %s",
+ strEntryName2.Data(),wafer.Data()));
+
SetT2Lmatrix(strEntryName2.Data(), 0, kFALSE);
}
}
TGeoManager *geoManager = gGeoManager;
CreateOldGeometry();
- TGeoVolume *vITS = geoManager->GetVolume("ITSV");
+ TGeoVolume *vITS = geoManager->GetVolume("ITSV");
TGeoVolume *vIS02 = geoManager->GetVolume("IS02");
-
const Char_t *cvsDate="$Date$";
const Char_t *cvsRevision="$Revision$";
const Int_t kLength=100;
fSSDgeom->EndCapSupportSystemLayer6(vITS);
fSSDgeom->EndCapSupportSystemLayer5(vITS);
}
+
+ if (AliITSInitGeometry::SPDshieldIsTGeoNative())
+ fSupgeom->SPDCone(vITS);
}
//______________________________________________________________________
// Special media
- AliMaterial(90,"SPD shield$", 12.011, 6., 1.93/10. , 22.1*10., 999);
+ AliMaterial(90,"SPD shield$", 12.011, 6., 1.93 , 22.36, 999);
AliMedium(90,"SPD shield$",90,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ);
// SPD End Ladder (data from Petra Riedler)
return;
}
+