X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=MUON%2FAliMUONSt1GeometryBuilderV2.cxx;h=2ed8def5d1cdc727b52fc1bfe61e4e331898a504;hb=d1f9a8ab3a5b4a639ed45a698f799480db221f72;hp=8aca558741d76d1ba40b723c8a0bc78bc7453a7d;hpb=9370c03220a604f32f0f44e7dfc75fe96c607d99;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONSt1GeometryBuilderV2.cxx b/MUON/AliMUONSt1GeometryBuilderV2.cxx index 8aca558741d..2ed8def5d1c 100644 --- a/MUON/AliMUONSt1GeometryBuilderV2.cxx +++ b/MUON/AliMUONSt1GeometryBuilderV2.cxx @@ -15,55 +15,67 @@ // $Id$ // -// Authors: David Guez, Ivana Hrivnacova, Marion MacCormick; IPN Orsay -// +//----------------------------------------------------------------------------- // Class AliMUONSt1GeometryBuilderV2 // --------------------------------- // MUON Station1 detailed geometry construction class. // (Originally defined in AliMUONv2.cxx - now removed.) // Included in AliRoot 2004/01/23 +// Authors: David Guez, Ivana Hrivnacova, Marion MacCormick; IPN Orsay +//----------------------------------------------------------------------------- -#ifdef ST1_WITH_STL - #include -#endif - -#ifdef ST1_WITH_ROOT - #include "TArrayI.h" -#endif - -#include -#include -#include -#include -#include -#include -#include +#include "AliMUONSt1GeometryBuilderV2.h" +#include "AliMUONSt1SpecialMotif.h" +#include "AliMUON.h" +#include "AliMUONConstants.h" +#include "AliMUONGeometryModule.h" +#include "AliMUONGeometryEnvelopeStore.h" -#include "AliMpFiles.h" -#include "AliMpReader.h" +#include "AliMpSegmentation.h" +#include "AliMpDEManager.h" +#include "AliMpContainers.h" +#include "AliMpConstants.h" +#include "AliMpCDB.h" +#include "AliMpSectorSegmentation.h" #include "AliMpSector.h" #include "AliMpRow.h" #include "AliMpVRowSegment.h" #include "AliMpMotifMap.h" #include "AliMpMotifPosition.h" +#include "AliMpPlaneType.h" #include "AliRun.h" #include "AliMagF.h" #include "AliLog.h" -#include "AliMUONSt1GeometryBuilderV2.h" -#include "AliMUONSt1SpecialMotif.h" -#include "AliMUON.h" -#include "AliMUONChamber.h" -#include "AliMUONGeometryModule.h" -#include "AliMUONGeometryEnvelopeStore.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef WITH_STL + #include +#endif +#ifdef WITH_ROOT + #include "TArrayI.h" +#endif + +/// \cond CLASSIMP ClassImp(AliMUONSt1GeometryBuilderV2) +/// \endcond // Thickness Constants const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzPadPlane=0.0148/2.; //Pad plane -const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzFoam = 2.083/2.; //Foam of mechanicalplane -const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzFR4 = 0.0031/2.; //FR4 of mechanical plane +const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzFoam = 2.503/2.; //Foam of mechanicalplane +const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzFR4 = 0.062/2.; //FR4 of mechanical plane const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzSnPb = 0.0091/2.; //Pad/Kapton connection (66 pt) const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzKapton = 0.0122/2.; //Kapton const GReal_t AliMUONSt1GeometryBuilderV2::fgkHzBergPlastic = 0.3062/2.;//Berg connector @@ -98,7 +110,7 @@ const GReal_t AliMUONSt1GeometryBuilderV2::fgkHxDaughter=2.3/2.; const GReal_t AliMUONSt1GeometryBuilderV2::fgkHyDaughter=6.3/2.; const GReal_t AliMUONSt1GeometryBuilderV2::fgkOffsetX=1.46; const GReal_t AliMUONSt1GeometryBuilderV2::fgkOffsetY=0.71; -const GReal_t AliMUONSt1GeometryBuilderV2::fgkDeltaFilleEtamX=1.46; +const GReal_t AliMUONSt1GeometryBuilderV2::fgkDeltaFilleEtamX=1.00; const GReal_t AliMUONSt1GeometryBuilderV2::fgkDeltaFilleEtamY=0.051; const GReal_t AliMUONSt1GeometryBuilderV2::fgkDeltaQuadLHC=2.6; // LHC Origin wrt Quadrant Origin @@ -109,32 +121,23 @@ const GReal_t AliMUONSt1GeometryBuilderV2::fgkFrameOffset=5.2; const GReal_t AliMUONSt1GeometryBuilderV2::fgkPadXOffsetBP = 0.50 - 0.63/2; // = 0.185 const GReal_t AliMUONSt1GeometryBuilderV2::fgkPadYOffsetBP = -0.31 - 0.42/2; // =-0.52 -const char* AliMUONSt1GeometryBuilderV2::fgkHoleName="MCHL"; -const char* AliMUONSt1GeometryBuilderV2::fgkDaughterName="MCDB"; -const char AliMUONSt1GeometryBuilderV2::fgkFoamLayerSuffix='F'; // prefix for automatic volume naming +const char* AliMUONSt1GeometryBuilderV2::fgkHoleName="SCHL"; +const char* AliMUONSt1GeometryBuilderV2::fgkDaughterName="SCDB"; const char* AliMUONSt1GeometryBuilderV2::fgkQuadrantEnvelopeName="SE"; const char* AliMUONSt1GeometryBuilderV2::fgkQuadrantMLayerName="SQM"; const char* AliMUONSt1GeometryBuilderV2::fgkQuadrantNLayerName="SQN"; const char* AliMUONSt1GeometryBuilderV2::fgkQuadrantFLayerName="SQF"; +const char* AliMUONSt1GeometryBuilderV2::fgkQuadrantMFLayerName="SQMF"; +const Int_t AliMUONSt1GeometryBuilderV2::fgkFoamBoxNameOffset=200; +const Int_t AliMUONSt1GeometryBuilderV2::fgkFR4BoxNameOffset=400; const Int_t AliMUONSt1GeometryBuilderV2::fgkDaughterCopyNoOffset=1000; //______________________________________________________________________________ AliMUONSt1GeometryBuilderV2::AliMUONSt1GeometryBuilderV2(AliMUON* muon) - : AliMUONVGeometryBuilder("st1V2.dat", - muon->Chamber(0).GetGeometry(), - muon->Chamber(1).GetGeometry()), + : AliMUONVGeometryBuilder(0, 2), fMUON(muon) { - // set path to mapping data files - if (! gSystem->Getenv("MINSTALL")) { - TString dirPath = gSystem->Getenv("ALICE_ROOT"); - dirPath += "/MUON/mapping"; - AliMpFiles::Instance()->SetTopPath(dirPath); - gSystem->Setenv("MINSTALL", dirPath.Data()); - //cout << "AliMpFiles top path set to " << dirPath << endl; - } - //else - // cout << gSystem->Getenv("MINSTALL") << endl; +/// Standard constructor } //______________________________________________________________________________ @@ -142,38 +145,16 @@ AliMUONSt1GeometryBuilderV2::AliMUONSt1GeometryBuilderV2() : AliMUONVGeometryBuilder(), fMUON(0) { -// Default Constructor -// -- -} - -//______________________________________________________________________________ -AliMUONSt1GeometryBuilderV2::AliMUONSt1GeometryBuilderV2(const AliMUONSt1GeometryBuilderV2& rhs) - : AliMUONVGeometryBuilder(rhs) -{ -// Dummy copy constructor - - AliFatal("Copy constructor is not implemented."); +/// Default Constructor } //______________________________________________________________________________ AliMUONSt1GeometryBuilderV2::~AliMUONSt1GeometryBuilderV2() { -// Destructor +/// Destructor } -//______________________________________________________________________________ -AliMUONSt1GeometryBuilderV2& -AliMUONSt1GeometryBuilderV2::operator = (const AliMUONSt1GeometryBuilderV2& rhs) -{ - // check assignement to self - if (this == &rhs) return *this; - - AliFatal("Assignment operator is not implemented."); - - return *this; -} - // // Private methods // @@ -182,8 +163,7 @@ AliMUONSt1GeometryBuilderV2::operator = (const AliMUONSt1GeometryBuilderV2& rhs) TString AliMUONSt1GeometryBuilderV2::QuadrantEnvelopeName(Int_t chamber, Int_t quadrant) const { -// Generate unique envelope name from chamber Id and quadrant number -// --- +/// Generate unique envelope name from chamber Id and quadrant number return Form("%s%d", Form("%s%d",fgkQuadrantEnvelopeName,chamber), quadrant); } @@ -191,8 +171,8 @@ AliMUONSt1GeometryBuilderV2::QuadrantEnvelopeName(Int_t chamber, Int_t quadrant) //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateHole() { -// Create all the elements found inside a foam hole -// -- +/// Create all the elements found inside a foam hole + Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; Int_t idAir = idtmed[1100]; // medium 1 //Int_t idCopper = idtmed[1109]; // medium 10 = copper @@ -218,18 +198,18 @@ void AliMUONSt1GeometryBuilderV2::CreateHole() par[0] = fgkHxHole; par[1] = fgkHyBergPlastic; par[2] = fgkHzKapton; - gMC->Gsvolu("KAPT", "BOX", idCopper, par, 3); + gMC->Gsvolu("SKPT", "BOX", idCopper, par, 3); posX = 0.; posY = 0.; posZ = 0.; - gMC->Gspos("KAPT",1,fgkHoleName, posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SKPT",1,fgkHoleName, posX, posY, posZ, 0,"ONLY"); } //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateDaughterBoard() { -// Create all the elements in a daughter board -// -- +/// Create all the elements in a daughter board + Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; Int_t idAir = idtmed[1100]; // medium 1 //Int_t idCopper = idtmed[1109]; // medium 10 = copper @@ -248,43 +228,42 @@ void AliMUONSt1GeometryBuilderV2::CreateDaughterBoard() par[0]=fgkHxBergPlastic; par[1]=fgkHyBergPlastic; par[2]=fgkHzBergPlastic; - gMC->Gsvolu("BRGP","BOX",idPlastic,par,3); + gMC->Gsvolu("SBGP","BOX",idPlastic,par,3); posX=0.; posY=0.; posZ = -TotalHzDaughter() + fgkHzBergPlastic; - gMC->Gspos("BRGP",1,fgkDaughterName,posX,posY,posZ,0,"ONLY"); + gMC->Gspos("SBGP",1,fgkDaughterName,posX,posY,posZ,0,"ONLY"); par[0]=fgkHxBergCopper; par[1]=fgkHyBergCopper; par[2]=fgkHzBergCopper; - gMC->Gsvolu("BRGC","BOX",idCopper,par,3); + gMC->Gsvolu("SBGC","BOX",idCopper,par,3); posX=0.; posY=0.; posZ=0.; - gMC->Gspos("BRGC",1,"BRGP",posX,posY,posZ,0,"ONLY"); + gMC->Gspos("SBGC",1,"SBGP",posX,posY,posZ,0,"ONLY"); par[0]=fgkHxDaughter; par[1]=fgkHyDaughter; par[2]=fgkHzDaughter; - gMC->Gsvolu("DGHT","BOX",idCopper,par,3); + gMC->Gsvolu("SDGH","BOX",idCopper,par,3); posX=0.; posY=0.; posZ = -TotalHzDaughter() + 2.*fgkHzBergPlastic + fgkHzDaughter; - gMC->Gspos("DGHT",1,fgkDaughterName,posX,posY,posZ,0,"ONLY"); + gMC->Gspos("SDGH",1,fgkDaughterName,posX,posY,posZ,0,"ONLY"); } //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateInnerLayers() { -// Create the layer of sensitive volumes with gas -// and the copper layer. -// -- +/// Create the layer of sensitive volumes with gas +/// and the copper layer. // Gas Medium Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; - //Int_t idArCO2 = idtmed[1108]; // medium 9 (ArCO2 80%) + Int_t idArCO2 = idtmed[1108]; // medium 9 (ArCO2 80%) //Int_t idCopper = idtmed[1109]; // medium 10 = copper - Int_t idArCO2 = idtmed[1124]; // medium 25 (ArCO2 80%) + //Int_t idArCO2 = idtmed[1124]; // medium 25 (ArCO2 80%) Int_t idCopper = idtmed[1121]; // medium 22 = copper Float_t par[11]; @@ -491,87 +470,181 @@ void AliMUONSt1GeometryBuilderV2::CreateInnerLayers() gMC->Gsvolu("SK1C", "TRAP", idCopper,par, 11); } +//______________________________________________________________________________ +void AliMUONSt1GeometryBuilderV2::CreateSpacer0() +{ +/// The spacer volumes are defined according to the input prepared by Nicole Willis +/// without any modifications +///
+/// No.    Type  Material Center (mm)            Dimensions (mm) (half lengths)
+///  5     BOX   EPOXY    408.2  430.4 522.41    5.75  1.5   25.5
+///  5P    BOX   EPOXY    408.2  445.4 522.41    5.75  1.5   25.5
+///  6     BOX   EPOXY    408.2  437.9 519.76    5.75  15.0   1.0
+///  6P    BOX   EPOXY    408.2  437.9 525.06    5.75  15.0   1.0
+///  7     CYL   INOX     408.2  437.9 522.41    r=3.0  hz=20.63
+///                                                                      
+ + // tracking medias + Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; + Int_t idFrameEpoxy = idtmed[1123]; // medium 24 = Frame Epoxy ME730 // was 20 not 16 + Int_t idInox = idtmed[1128]; // medium 29 Stainless Steel (18%Cr,9%Ni,Fe) // was 21 not 17 + + GReal_t par[3]; + par[0] = 0.575; + par[1] = 0.150; + par[2] = 2.550; + gMC->Gsvolu("Spacer05","BOX",idFrameEpoxy,par,3); + + par[0] = 0.575; + par[1] = 1.500; + par[2] = 0.100; + gMC->Gsvolu("Spacer06","BOX",idFrameEpoxy,par,3); + + par[0] = 0.000; + par[1] = 0.300; + par[2] = 2.063; + gMC->Gsvolu("Spacer07","TUBE",idInox,par,3); +} + + +//______________________________________________________________________________ +void AliMUONSt1GeometryBuilderV2::CreateSpacer() +{ +/// The spacer volumes are defined according to the input prepared by Nicole Willis +/// with modifications needed to fit into existing geometry. +///
+/// No.    Type  Material Center (mm)            Dimensions (mm) (half lengths)
+///  5     BOX   EPOXY    408.2  430.4 522.41    5.75  1.5   25.5
+///  5P    BOX   EPOXY    408.2  445.4 522.41    5.75  1.5   25.5
+///  6     BOX   EPOXY    408.2  437.9 519.76    5.75  15.0   1.0
+///  6P    BOX   EPOXY    408.2  437.9 525.06    5.75  15.0   1.0
+///  7     CYL   INOX     408.2  437.9 522.41    r=3.0  hz=20.63
+///                                                                      
+/// To fit in existing volumes the volumes 5 and 7 are represented by 2 volumes +/// with half size in z (5A, &A); the dimensions of the volume 5A were also modified +/// to avoid overlaps (x made smaller, y larger to abotain the identical volume) + + // tracking medias + Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; + Int_t idFrameEpoxy = idtmed[1123]; // medium 24 = Frame Epoxy ME730 // was 20 not 16 + Int_t idInox = idtmed[1128]; // medium 29 Stainless Steel (18%Cr,9%Ni,Fe) // was 21 not 17 + + //GReal_t par[3]; + //par[0] = 0.575; + //par[1] = 0.150; + //par[2] = 2.550; + //gMC->Gsvolu("Spacer5","BOX",idFrameEpoxy,par,3); + + GReal_t par[3]; + par[0] = 0.510; + par[1] = 0.170; + par[2] = 1.1515; + gMC->Gsvolu("Spacer5A","BOX",idFrameEpoxy,par,3); + + par[0] = 0.516; + par[1] = 1.500; + par[2] = 0.100; + gMC->Gsvolu("Spacer6","BOX",idFrameEpoxy,par,3); + + //par[0] = 0.000; + //par[1] = 0.300; + //par[2] = 2.063; + //gMC->Gsvolu("Spacer7","TUBE",idInox,par,3); + + par[0] = 0.000; + par[1] = 0.300; + par[2] = 1.0315; + gMC->Gsvolu("Spacer7A","TUBE",idInox,par,3); +} + //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateQuadrant(Int_t chamber) { -// create the quadrant (bending and non-bending planes) -// for the given chamber -// -- +/// Create the quadrant (bending and non-bending planes) +/// for the given chamber - CreateFrame(chamber); + // CreateQuadrantLayersAsVolumes(chamber); + CreateQuadrantLayersAsAssemblies(chamber); -#ifdef ST1_WITH_STL - SpecialMap specialMap; - specialMap[76] = AliMUONSt1SpecialMotif(TVector2( 0.1, 0.84), 90.); - specialMap[75] = AliMUONSt1SpecialMotif(TVector2( 0.5, 0.36)); - specialMap[47] = AliMUONSt1SpecialMotif(TVector2(1.01, 0.36)); -#endif + CreateFrame(chamber); -#ifdef ST1_WITH_ROOT - SpecialMap specialMap; - specialMap.Add(76, (Long_t) new AliMUONSt1SpecialMotif(TVector2( 0.1, 0.84), 90.)); + TExMap specialMap; + specialMap.Add(76, (Long_t) new AliMUONSt1SpecialMotif(TVector2( 0.1, 0.72), 90.)); specialMap.Add(75, (Long_t) new AliMUONSt1SpecialMotif(TVector2( 0.5, 0.36))); specialMap.Add(47, (Long_t) new AliMUONSt1SpecialMotif(TVector2(1.01, 0.36))); -#endif - AliMpReader reader1(kStation1, kBendingPlane); - AliMpSector* sector1 = reader1.BuildSector(); + // Load mapping from OCDB + if ( ! AliMpSegmentation::Instance() ) { + AliFatal("Mapping has to be loaded first !"); + } + + const AliMpSectorSegmentation* kSegmentation1 + = dynamic_cast( + AliMpSegmentation::Instance() + ->GetMpSegmentation(100, AliMpDEManager::GetCathod(100, AliMp::kBendingPlane))); + if ( ! kSegmentation1 ) { + AliFatal("Could not access sector segmentation !"); + } + + const AliMpSector* kSector1 = kSegmentation1->GetSector(); //Bool_t reflectZ = true; Bool_t reflectZ = false; //TVector3 where = TVector3(2.5+0.1+0.56+0.001, 2.5+0.1+0.001, 0.); TVector3 where = TVector3(fgkDeltaQuadLHC + fgkPadXOffsetBP, fgkDeltaQuadLHC + fgkPadYOffsetBP, 0.); - PlaceSector(sector1, specialMap, where, reflectZ, chamber); + PlaceSector(kSector1, specialMap, where, reflectZ, chamber); -#ifdef ST1_WITH_STL - specialMap.clear(); - specialMap[76] = AliMUONSt1SpecialMotif(TVector2(1.01,0.59),90.); - specialMap[75] = AliMUONSt1SpecialMotif(TVector2(1.96, 0.17)); - specialMap[47] = AliMUONSt1SpecialMotif(TVector2(2.18,-0.98)); - specialMap[20] = AliMUONSt1SpecialMotif(TVector2(0.2 ,-0.08)); - specialMap[46] = AliMUONSt1SpecialMotif(TVector2(0.2 , 0.25)); - specialMap[74] = AliMUONSt1SpecialMotif(TVector2(0.28, 0.21)); - // Fix (7) - overlap of SQ42 with MCHL (after moving the whole sector - // in the true position) - // Was: specialMap[47] = AliMUONSt1SpecialMotif(TVector2(1.61,-1.18)); -#endif - -#ifdef ST1_WITH_ROOT + Int_t nb = AliMpConstants::ManuMask(AliMp::kNonBendingPlane); + TExMapIter it(&specialMap); + Long_t key; + Long_t value; + while ( it.Next(key,value) == kTRUE ) { + delete reinterpret_cast(value); + } specialMap.Delete(); - specialMap.Add(76,(Long_t) new AliMUONSt1SpecialMotif(TVector2(1.01,0.59),90.)); - specialMap.Add(75,(Long_t) new AliMUONSt1SpecialMotif(TVector2(1.96, 0.17))); - specialMap.Add(47,(Long_t) new AliMUONSt1SpecialMotif(TVector2(2.18,-0.98))); - specialMap.Add(20,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.2 ,-0.08))); - specialMap.Add(46,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.2 , 0.25))); - specialMap.Add(74,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.28, 0.21))); + specialMap.Add(76 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(1.01,0.51),90.)); + specialMap.Add(75 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(1.96,-0.04))); + specialMap.Add(47 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(2.18,-1.11))); + specialMap.Add(20 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.2 ,-0.08))); + specialMap.Add(46 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.6 , 0.17))); + specialMap.Add(74 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.28, -0.10))); // Fix (7) - overlap of SQ42 with MCHL (after moving the whole sector // in the true position) // Was: specialMap.Add(47,(Long_t) new AliMUONSt1SpecialMotif(TVector2(1.61,-1.18))); -#endif - AliMpReader reader2(kStation1, kNonBendingPlane); - AliMpSector* sector2 = reader2.BuildSector(); - + const AliMpSectorSegmentation* kSegmentation2 + = dynamic_cast( + AliMpSegmentation::Instance() + ->GetMpSegmentation(100, AliMpDEManager::GetCathod(100, AliMp::kNonBendingPlane))); + if ( ! kSegmentation2 ) { + AliFatal("Could not access sector segmentation !"); + } + + const AliMpSector* kSector2 = kSegmentation2->GetSector(); + //reflectZ = false; reflectZ = true; - TVector2 offset = sector2->Offset(); - where = TVector3(where.X()+offset.X()/10., where.Y()+offset.Y()/10., 0.); + TVector2 offset = kSector2->Position(); + where = TVector3(where.X()+offset.X(), where.Y()+offset.Y(), 0.); // Add the half-pad shift of the non-bending plane wrt bending plane // (The shift is defined in the mapping as sector offset) // Fix (4) - was TVector3(where.X()+0.63/2, ... - now it is -0.63/2 - PlaceSector(sector2, specialMap, where, reflectZ, chamber); + PlaceSector(kSector2, specialMap, where, reflectZ, chamber); -#ifdef ST1_WITH_ROOT + it.Reset(); + while ( it.Next(key,value) == kTRUE ) { + delete reinterpret_cast(value); + } specialMap.Delete(); -#endif } //______________________________________________________________________________ -void AliMUONSt1GeometryBuilderV2::CreateFoamBox(const char* name,const TVector2& dimensions) +void AliMUONSt1GeometryBuilderV2::CreateFoamBox( + Int_t segNumber, + const TVector2& dimensions) { -// create all the elements in the copper plane -// -- +/// Create all the elements in the copper plane Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; Int_t idAir = idtmed[1100]; // medium 1 @@ -585,96 +658,253 @@ void AliMUONSt1GeometryBuilderV2::CreateFoamBox(const char* name,const TVector2 par[0] = dimensions.X(); par[1] = dimensions.Y(); par[2] = TotalHzPlane(); - gMC->Gsvolu(name,"BOX",idAir,par,3); + gMC->Gsvolu(PlaneSegmentName(segNumber).Data(),"BOX",idAir,par,3); // foam layer - GReal_t posX,posY,posZ; - char eName[5]; - strcpy(eName,name); - eName[3]=fgkFoamLayerSuffix; par[0] = dimensions.X(); par[1] = dimensions.Y(); par[2] = fgkHzFoam; - gMC->Gsvolu(eName,"BOX",idFoam,par,3); + gMC->Gsvolu(FoamBoxName(segNumber).Data(),"BOX",idFoam,par,3); + GReal_t posX,posY,posZ; posX=0.; posY=0.; posZ = -TotalHzPlane() + fgkHzFoam; - gMC->Gspos(eName,1,name,posX,posY,posZ,0,"ONLY"); + gMC->Gspos(FoamBoxName(segNumber).Data(),1, + PlaneSegmentName(segNumber).Data(),posX,posY,posZ,0,"ONLY"); // mechanical plane FR4 layer - eName[3]='R'; par[0] = dimensions.X(); par[1] = dimensions.Y(); par[2] = fgkHzFR4; - gMC->Gsvolu(eName,"BOX",idFR4,par,3); + gMC->Gsvolu(FR4BoxName(segNumber).Data(),"BOX",idFR4,par,3); posX=0.; posY=0.; posZ = -TotalHzPlane()+ 2.*fgkHzFoam + fgkHzFR4; - gMC->Gspos(eName,1,name,posX,posY,posZ,0,"ONLY"); + gMC->Gspos(FR4BoxName(segNumber).Data(),1, + PlaneSegmentName(segNumber).Data(),posX,posY,posZ,0,"ONLY"); } //______________________________________________________________________________ -void AliMUONSt1GeometryBuilderV2::CreatePlaneSegment(const char* name,const TVector2& dimensions, - Int_t nofHoles) +void AliMUONSt1GeometryBuilderV2::CreatePlaneSegment(Int_t segNumber, + const TVector2& dimensions, + Int_t nofHoles) { -// Create a segment of a plane (this includes a foam layer, -// holes in the foam to feed the kaptons through, kapton connectors -// and the mother board.) -// -- +/// Create a segment of a plane (this includes a foam layer, +/// holes in the foam to feed the kaptons through, kapton connectors +/// and the mother board.) - CreateFoamBox(name,dimensions); - - char eName[5]; - strcpy(eName,name); - eName[3]=fgkFoamLayerSuffix; + CreateFoamBox(segNumber,dimensions); + // Place spacer in the concrete plane segments: + // S225 (in S025), S267 (in S067) in chamber1 and S309 (in S109). S351(in S151) + // in chamber2 + // The segments were found as those which caused overlaps when we placed + // the spacer in global coordinates via PlaceSpacer0 + // + // + // + // + // + + if ( FoamBoxName(segNumber) == "S225" || + FoamBoxName(segNumber) == "S267" || + FoamBoxName(segNumber) == "S309" || + FoamBoxName(segNumber) == "S351" ) + { + GReal_t posX = 12.6; + GReal_t posY = 0.75; + GReal_t posZ = -0.1; + if ( FoamBoxName(segNumber) == "S267" || + FoamBoxName(segNumber) == "S351" ) posY += fgkPadYOffsetBP; + gMC->Gspos("Spacer5A", 1, FoamBoxName(segNumber).Data(), posX, posY, posZ,0, "ONLY"); + + posY = -0.75; + if ( FoamBoxName(segNumber) == "S267" || + FoamBoxName(segNumber) == "S351" ) posY += fgkPadYOffsetBP; + gMC->Gspos("Spacer5A", 2, FoamBoxName(segNumber).Data(), posX, posY, posZ,0, "ONLY"); + + posY = 0.0; + posZ = 1.1515; + if ( FoamBoxName(segNumber) == "S267" || + FoamBoxName(segNumber) == "S351" ) posY += fgkPadYOffsetBP; + gMC->Gspos("Spacer6", 1, FoamBoxName(segNumber).Data(), posX, posY, posZ,0, "ONLY"); + + posY = 0.0; + posZ = 0.0; + if ( FoamBoxName(segNumber) == "S267" || + FoamBoxName(segNumber) == "S351" ) posY += fgkPadYOffsetBP; + gMC->Gspos("Spacer7A", 1, FoamBoxName(segNumber).Data(), posX, posY, posZ,0, "ONLY"); + } + for (Int_t holeNum=0;holeNumGspos(fgkHoleName,holeNum+1,eName,posX,posY,posZ,0,"ONLY"); + + gMC->Gspos(fgkHoleName,holeNum+1, + FoamBoxName(segNumber).Data(),posX,posY,posZ,0,"ONLY"); } } +//______________________________________________________________________________ +void AliMUONSt1GeometryBuilderV2::CreateQuadrantLayersAsVolumes(Int_t chamber) +{ +/// Create the three main layers as real volumes. +/// Not used anymore. + + // tracking medias + Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; + Int_t idAir = idtmed[1100]; // medium 1 + + Float_t par[11]; + Float_t posX,posY,posZ; + +// Quadrant volume TUBS1, positioned at the end + par[0] = fgkMotherIR1; + par[1] = fgkMotherOR1; + par[2] = fgkMotherThick1; + par[3] = fgkMotherPhiL1; + par[4] = fgkMotherPhiU1; + gMC->Gsvolu(QuadrantMLayerName(chamber),"TUBS",idAir,par,5); + // gMC->Gsvolu(QuadrantMFLayerName(chamber),"TUBS",idAir,par,5); + +// Replace the volume shape with a composite shape +// with substracted overlap with beam shield (YMOT) + + if ( gMC->IsRootGeometrySupported() ) { + + // Get shape + TGeoVolume* mlayer + = gGeoManager->FindVolumeFast(QuadrantMLayerName(chamber)); + if ( !mlayer ) { + AliErrorStream() + << "Quadrant volume " << QuadrantMLayerName(chamber) << " not found" + << endl; + } + else { + TGeoShape* quadrant = mlayer->GetShape(); + quadrant->SetName("quadrant"); + + // Beam shield recess + par[0] = 0; + par[1] = 15.4; + par[2] = fgkMotherThick1; + new TGeoTube("shield_tube", par[0], par[1], par[2]); + + // Displacement + posX = 2.6; + posY = 2.6; + posZ = 0; + TGeoTranslation* displacement + = new TGeoTranslation("TR", posX, posY, posZ); + displacement->RegisterYourself(); + + // Composite shape + TGeoShape* composite + = new TGeoCompositeShape("composite", "quadrant-shield_tube:TR"); + + // Reset shape to volume + mlayer->SetShape(composite); + } + + TGeoVolume* malayer + = gGeoManager->FindVolumeFast(QuadrantMFLayerName(chamber)); + if ( !malayer ) { + AliErrorStream() + << "Quadrant volume " << QuadrantMFLayerName(chamber) << " not found" + << endl; + } + else { + TGeoShape* quadrant = malayer->GetShape(); + quadrant->SetName("quadrant"); + + // Beam shield recess + par[0] = 0; + par[1] = 15.4; + par[2] = fgkMotherThick1; + new TGeoTube("shield_tube", par[0], par[1], par[2]); + + // Displacement + posX = 2.6; + posY = 2.6; + posZ = 0; + TGeoTranslation* displacement + = new TGeoTranslation("TR", posX, posY, posZ); + displacement->RegisterYourself(); + + // Composite shape + TGeoShape* composite + = new TGeoCompositeShape("composite", "quadrant-shield_tube:TR"); + + // Reset shape to volume + malayer->SetShape(composite); + } + } + +// Quadrant volume TUBS2, positioned at the end + par[0] = fgkMotherIR2; + par[1] = fgkMotherOR2; + par[2] = fgkMotherThick2; + par[3] = fgkMotherPhiL2; + par[4] = fgkMotherPhiU2; + + gMC->Gsvolu(QuadrantNLayerName(chamber),"TUBS",idAir,par,5); + gMC->Gsvolu(QuadrantFLayerName(chamber),"TUBS",idAir,par,5); +} + +//______________________________________________________________________________ +void AliMUONSt1GeometryBuilderV2::CreateQuadrantLayersAsAssemblies(Int_t chamber) +{ +/// Create the three main layers as assemblies + + gGeoManager->MakeVolumeAssembly(QuadrantMLayerName(chamber).Data()); + gGeoManager->MakeVolumeAssembly(QuadrantMFLayerName(chamber).Data()); + gGeoManager->MakeVolumeAssembly(QuadrantNLayerName(chamber).Data()); + gGeoManager->MakeVolumeAssembly(QuadrantFLayerName(chamber).Data()); +} + //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) { -// Create the non-sensitive elements of the frame for the -// -// -// Model and notation: -// -// The Quadrant volume name starts with SQ -// The volume segments are numbered 00 to XX. -// -// OutTopFrame -// (SQ02-16) -// ------------ -// OutEdgeFrame / | -// (SQ17-24) / | InVFrame (SQ00-01) -// / | -// | | -// OutVFrame | _- - -// (SQ25-39) | | InArcFrame (SQ42-45) -// | | -// ------------- -// InHFrame (SQ40-41) -// -// -// 06 February 2003 - Overlapping volumes resolved. -// One quarter chamber is comprised of three TUBS volumes: SQMx, SQNx, and SQFx, -// where SQMx is the Quadrant Middle layer for chamber ( posZ in [-3.25,3.25]), -// SQNx is the Quadrant Near side layer for chamber ( posZ in [-6.25,3-.25) ), and -// SQFx is the Quadrant Far side layer for chamber ( posZ in (3.25,6.25] ). -//--- +/// Create the non-sensitive elements of the frame for the \a chamber +/// +/// Model and notation: \n +/// \n +/// The Quadrant volume name starts with SQ \n +/// The volume segments are numbered 00 to XX \n +/// \n +/// OutTopFrame \n +/// (SQ02-16) \n +/// ------------ \n +/// OutEdgeFrame / | \n +/// (SQ17-24) / | InVFrame (SQ00-01) \n +/// / | \n +/// | | \n +/// OutVFrame | _- - \n +/// (SQ25-39) | | InArcFrame (SQ42-45) \n +/// | | \n +/// ------------- \n +/// InHFrame (SQ40-41) \n +/// \n +/// \n +/// 06 February 2003 - Overlapping volumes resolved. \n +/// One quarter chamber is comprised of three TUBS volumes: SQMx, SQNx, and SQFx, +/// where SQMx is the Quadrant Middle layer for chamber \a chamber ( posZ in [-3.25,3.25]), +/// SQNx is the Quadrant Near side layer for chamber \a chamber ( posZ in [-6.25,3-.25) ), and +/// SQFx is the Quadrant Far side layer for chamber \a chamber ( posZ in (3.25,6.25] ). + + // TString quadrantMLayerName = QuadrantMLayerName(chamber); + + TString quadrantMLayerName = QuadrantMFLayerName(chamber); + TString quadrantNLayerName = QuadrantNLayerName(chamber); + TString quadrantFLayerName = QuadrantFLayerName(chamber); const Float_t kNearFarLHC=2.4; // Near and Far TUBS Origin wrt LHC Origin // tracking medias Int_t* idtmed = fMUON->GetIdtmed()->GetArray()-1099; - Int_t idAir = idtmed[1100]; // medium 1 + //Int_t idAir = idtmed[1100]; // medium 1 //Int_t idFrameEpoxy = idtmed[1115]; // medium 16 = Frame Epoxy ME730 //Int_t idInox = idtmed[1116]; // medium 17 Stainless Steel (18%Cr,9%Ni,Fe) //Int_t idFR4 = idtmed[1110]; // medium 11 FR4 @@ -1127,24 +1357,6 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) Float_t par[11]; Float_t posX,posY,posZ; -// Quadrant volume TUBS1, positioned at the end - par[0] = fgkMotherIR1; - par[1] = fgkMotherOR1; - par[2] = fgkMotherThick1; - par[3] = fgkMotherPhiL1; - par[4] = fgkMotherPhiU1; - gMC->Gsvolu(QuadrantMLayerName(chamber),"TUBS",idAir,par,5); - -// Quadrant volume TUBS2, positioned at the end - par[0] = fgkMotherIR2; - par[1] = fgkMotherOR2; - par[2] = fgkMotherThick2; - par[3] = fgkMotherPhiL2; - par[4] = fgkMotherPhiU2; - - gMC->Gsvolu(QuadrantNLayerName(chamber),"TUBS",idAir,par,5); - gMC->Gsvolu(QuadrantFLayerName(chamber),"TUBS",idAir,par,5); - if (chamber==1) { // InVFrame par[0] = kHxInVFrame; @@ -1576,7 +1788,7 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = kHxInVFrame; posY = 2.0*kHyInHFrame+2.*kHyH1mm+kIAF+kHyInVFrame; posZ = 0.; - gMC->Gspos("SQ00",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ00",1,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); // keep memory of the mid position. Used for placing screws const GReal_t kMidVposX = posX; @@ -1587,85 +1799,85 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = 2.0*kHxInVFrame+kHxV1mm; posY = 2.0*kHyInHFrame+2.*kHyH1mm+kIAF+kHyV1mm; posZ = 0.; - gMC->Gspos("SQ01",1,QuadrantMLayerName(chamber),posX, posY, posZ,0, "ONLY"); + gMC->Gspos("SQ01",1,quadrantMLayerName,posX, posY, posZ,0, "ONLY"); // TopFrameAnode place 2 layers of TopFrameAnode cuboids posX = kHxTFA; posY = 2.*kHyInHFrame+2.*kHyH1mm+kIAF+2.*kHyInVFrame+kHyTFA; posZ = kHzOuterFrameInox; - gMC->Gspos("SQ02",1,QuadrantMLayerName(chamber),posX, posY, posZ,0,"ONLY"); + gMC->Gspos("SQ02",1,quadrantMLayerName,posX, posY, posZ,0,"ONLY"); posZ = posZ+kHzOuterFrameInox; - gMC->Gspos("SQ03",1,QuadrantMLayerName(chamber),posX, posY, posZ,0,"ONLY"); + gMC->Gspos("SQ03",1,quadrantMLayerName,posX, posY, posZ,0,"ONLY"); // place 2 layers of TopFrameAnodeA trapezoids posX = 35.8932+fgkDeltaQuadLHC; posY = 92.6745+fgkDeltaQuadLHC; posZ = kHzOuterFrameInox; - gMC->Gspos("SQ04",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ04",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); posZ = posZ+kHzOuterFrameInox; - gMC->Gspos("SQ05",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ05",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); // place 2 layers of TopFrameAnodeB trapezoids posX = 44.593+fgkDeltaQuadLHC; posY = 90.737+fgkDeltaQuadLHC; posZ = kHzOuterFrameInox; - gMC->Gspos("SQ06",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ06",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); posZ = posZ+kHzOuterFrameInox; - gMC->Gspos("SQ07",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ07",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); // TopAnode1 place 2 layers posX = 6.8+fgkDeltaQuadLHC; posY = 99.85+fgkDeltaQuadLHC; posZ = -1.*kHzAnodeFR4; - gMC->Gspos("SQ08",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ08",1,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); posZ = posZ+kHzTopAnodeSteel1; - gMC->Gspos("SQ09",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ09",1,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); // TopAnode2 place 2 layers posX = 18.534+fgkDeltaQuadLHC; posY = 99.482+fgkDeltaQuadLHC; posZ = -1.*kHzAnodeFR4; - gMC->Gspos("SQ10",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ10",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); posZ = posZ+kHzTopAnodeSteel2; - gMC->Gspos("SQ11",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ11",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); // TopAnode3 place 1 layer posX = 25.80+fgkDeltaQuadLHC; posY = 98.61+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ12",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ12",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); // TopEarthFace - 2 copies posX = 23.122+fgkDeltaQuadLHC; posY = 96.90+fgkDeltaQuadLHC; posZ = kHzOuterFrameEpoxy+kHzOuterFrameInox+kHzTopEarthFaceCu; - gMC->Gspos("SQ13",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ13",1,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); posZ = -1.*posZ; - gMC->Gspos("SQ13",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ13",2,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); // TopEarthProfile posX = 14.475+fgkDeltaQuadLHC; posY = 97.900+fgkDeltaQuadLHC; posZ = kHzTopEarthProfileCu; - gMC->Gspos("SQ14",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ14",1,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ14",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ14",2,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); // TopGasSupport - 2 copies posX = 4.9500+fgkDeltaQuadLHC; posY = 96.200+fgkDeltaQuadLHC; posZ = kHzOuterFrameEpoxy+kHzOuterFrameInox+kHzTopGasSupportAl; - gMC->Gspos("SQ15",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ15",1,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); posZ = -1.*posZ; - gMC->Gspos("SQ15",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ15",2,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); // TopPositioner parameters - single Stainless Steel trapezoid - 2 copies posX = 7.60+fgkDeltaQuadLHC; posY = 98.98+fgkDeltaQuadLHC; posZ = kHzOuterFrameEpoxy+kHzOuterFrameInox+2.*kHzTopGasSupportAl+kHzTopPositionerSteel; - gMC->Gspos("SQ16",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ16",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); posZ = -1.*posZ; - gMC->Gspos("SQ16",2,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ16",2,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); // OutEdgeFrame Float_t xCenter[8]; @@ -1696,31 +1908,31 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) yCenter[7] = 87.418 + fgkDeltaQuadLHC; posZ = -1.0*kHzOuterFrameInox; - gMC->Gspos("SQ17",1,QuadrantMLayerName(chamber), xCenter[0], yCenter[0], posZ, rot2,"ONLY"); - gMC->Gspos("SQ17",2,QuadrantMLayerName(chamber), xCenter[4], yCenter[4], posZ, rot3,"ONLY"); + gMC->Gspos("SQ17",1,quadrantMLayerName, xCenter[0], yCenter[0], posZ, rot2,"ONLY"); + gMC->Gspos("SQ17",2,quadrantMLayerName, xCenter[4], yCenter[4], posZ, rot3,"ONLY"); - gMC->Gspos("SQ19",1,QuadrantMLayerName(chamber), xCenter[1], yCenter[1], posZ, rot2,"ONLY"); - gMC->Gspos("SQ19",2,QuadrantMLayerName(chamber), xCenter[5], yCenter[5], posZ, rot3,"ONLY"); + gMC->Gspos("SQ19",1,quadrantMLayerName, xCenter[1], yCenter[1], posZ, rot2,"ONLY"); + gMC->Gspos("SQ19",2,quadrantMLayerName, xCenter[5], yCenter[5], posZ, rot3,"ONLY"); - gMC->Gspos("SQ21",1,QuadrantMLayerName(chamber), xCenter[2], yCenter[2], posZ, rot2,"ONLY"); - gMC->Gspos("SQ21",2,QuadrantMLayerName(chamber), xCenter[6], yCenter[6], posZ, rot3,"ONLY"); + gMC->Gspos("SQ21",1,quadrantMLayerName, xCenter[2], yCenter[2], posZ, rot2,"ONLY"); + gMC->Gspos("SQ21",2,quadrantMLayerName, xCenter[6], yCenter[6], posZ, rot3,"ONLY"); - gMC->Gspos("SQ23",1,QuadrantMLayerName(chamber), xCenter[3], yCenter[3], posZ, rot2,"ONLY"); - gMC->Gspos("SQ23",2,QuadrantMLayerName(chamber), xCenter[7], yCenter[7], posZ, rot3,"ONLY"); + gMC->Gspos("SQ23",1,quadrantMLayerName, xCenter[3], yCenter[3], posZ, rot2,"ONLY"); + gMC->Gspos("SQ23",2,quadrantMLayerName, xCenter[7], yCenter[7], posZ, rot3,"ONLY"); - posZ = posZ+kHzOuterFrameEpoxy; + posZ = posZ+kHzOuterFrameEpoxy + kHzOuterFrameInox; - gMC->Gspos("SQ18",1,QuadrantMLayerName(chamber), xCenter[0], yCenter[0], posZ, rot2,"ONLY"); - gMC->Gspos("SQ18",2,QuadrantMLayerName(chamber), xCenter[4], yCenter[4], posZ, rot3,"ONLY"); + gMC->Gspos("SQ18",1,quadrantMLayerName, xCenter[0], yCenter[0], posZ, rot2,"ONLY"); + gMC->Gspos("SQ18",2,quadrantMLayerName, xCenter[4], yCenter[4], posZ, rot3,"ONLY"); - gMC->Gspos("SQ20",1,QuadrantMLayerName(chamber), xCenter[1], yCenter[1], posZ, rot2,"ONLY"); - gMC->Gspos("SQ20",2,QuadrantMLayerName(chamber), xCenter[5], yCenter[5], posZ, rot3,"ONLY"); + gMC->Gspos("SQ20",1,quadrantMLayerName, xCenter[1], yCenter[1], posZ, rot2,"ONLY"); + gMC->Gspos("SQ20",2,quadrantMLayerName, xCenter[5], yCenter[5], posZ, rot3,"ONLY"); - gMC->Gspos("SQ22",1,QuadrantMLayerName(chamber), xCenter[2], yCenter[2], posZ, rot2,"ONLY"); - gMC->Gspos("SQ22",2,QuadrantMLayerName(chamber), xCenter[6], yCenter[6], posZ, rot3,"ONLY"); + gMC->Gspos("SQ22",1,quadrantMLayerName, xCenter[2], yCenter[2], posZ, rot2,"ONLY"); + gMC->Gspos("SQ22",2,quadrantMLayerName, xCenter[6], yCenter[6], posZ, rot3,"ONLY"); - gMC->Gspos("SQ24",1,QuadrantMLayerName(chamber), xCenter[3], yCenter[3], posZ, rot2,"ONLY"); - gMC->Gspos("SQ24",2,QuadrantMLayerName(chamber), xCenter[7], yCenter[7], posZ, rot3,"ONLY"); + gMC->Gspos("SQ24",1,quadrantMLayerName, xCenter[3], yCenter[3], posZ, rot2,"ONLY"); + gMC->Gspos("SQ24",2,quadrantMLayerName, xCenter[7], yCenter[7], posZ, rot3,"ONLY"); //--- @@ -1728,7 +1940,7 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = 2.*kHxInVFrame+kIAF+2.*kHxInHFrame-kHxOutVFrame+2.*kHxV1mm; posY = 2.*kHyInHFrame+kHyOutVFrame; posZ = 0.; - gMC->Gspos("SQ25",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ25",1,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); // keep memory of the mid position. Used for placing screws const GReal_t kMidOVposX = posX; @@ -1742,112 +1954,112 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = kOUTX; posY = kTOPY+((kBl1OCTF+kTl1OCTF)/2.); posZ = 0.; - gMC->Gspos("SQ26",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1,"ONLY"); + gMC->Gspos("SQ26",1,quadrantMLayerName,posX, posY, posZ, rot1,"ONLY"); // VertEarthFaceCu - 2 copies posX = 89.4000+fgkDeltaQuadLHC; posY = 25.79+fgkDeltaQuadLHC; posZ = kHzFrameThickness+2.0*kHzFoam+kHzVertEarthFaceCu; - gMC->Gspos("SQ27",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1, "ONLY"); + gMC->Gspos("SQ27",1,quadrantMLayerName,posX, posY, posZ, rot1, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ27",2,QuadrantMLayerName(chamber),posX, posY, posZ, rot1, "ONLY"); + gMC->Gspos("SQ27",2,quadrantMLayerName,posX, posY, posZ, rot1, "ONLY"); // VertEarthSteel - 2 copies posX = 91.00+fgkDeltaQuadLHC; posY = 30.616+fgkDeltaQuadLHC; posZ = kHzFrameThickness+2.0*kHzFoam+kHzVertBarSteel; - gMC->Gspos("SQ28",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1, "ONLY"); + gMC->Gspos("SQ28",1,quadrantMLayerName,posX, posY, posZ, rot1, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ28",2,QuadrantMLayerName(chamber),posX, posY, posZ, rot1, "ONLY"); + gMC->Gspos("SQ28",2,quadrantMLayerName,posX, posY, posZ, rot1, "ONLY"); // VertEarthProfCu - 2 copies posX = 92.000+fgkDeltaQuadLHC; posY = 29.64+fgkDeltaQuadLHC; posZ = kHzFrameThickness; - gMC->Gspos("SQ29",1,QuadrantMLayerName(chamber),posX, posY, posZ, rot1, "ONLY"); + gMC->Gspos("SQ29",1,quadrantMLayerName,posX, posY, posZ, rot1, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ29",2,QuadrantMLayerName(chamber),posX, posY, posZ, rot1, "ONLY"); + gMC->Gspos("SQ29",2,quadrantMLayerName,posX, posY, posZ, rot1, "ONLY"); // SuppLateralPositionner - 2 copies posX = 90.2-kNearFarLHC; posY = 5.00-kNearFarLHC; posZ = kHzLateralPosnAl-fgkMotherThick2; - gMC->Gspos("SQ30",1,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ30",1,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ30",2,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ30",2,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); // LateralPositionner - 2 copies - Face view posX = 92.175-kNearFarLHC-2.*kHxLPP; posY = 5.00-kNearFarLHC; posZ =2.0*kHzLateralPosnAl+kHzLateralPosnInoxFace-fgkMotherThick2; - gMC->Gspos("SQ31",1,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ31",1,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ31",2,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ31",2,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); // LateralPositionner - Profile view posX = 92.175+fgkDeltaQuadLHC+kHxLPF-kHxLPP; posY = 5.00+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ32",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); // middle layer + gMC->Gspos("SQ32",1,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); // middle layer posX = 92.175-kNearFarLHC+kHxLPF-kHxLPP; posY = 5.0000-kNearFarLHC; posZ = fgkMotherThick2-kHzLPNF; - gMC->Gspos("SQ33",1,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); // near layer + gMC->Gspos("SQ33",1,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); // near layer posZ = -1.*posZ; - gMC->Gspos("SQ33",2,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); // far layer + gMC->Gspos("SQ33",2,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); // far layer // VertCradleA 1st Trapezoid - 3 copies posX = 95.73+fgkDeltaQuadLHC; posY = 33.26+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ34",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ34",2,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); posX = 95.73-kNearFarLHC; posY = 33.26-kNearFarLHC; posZ = 2.0*kHzLateralSightAl+kHzVerticalCradleAl-fgkMotherThick2; - gMC->Gspos("SQ34",1,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ34",1,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ34",3,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ34",3,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); // VertCradleB 2nd Trapezoid - 3 copies posX = 97.29+fgkDeltaQuadLHC; posY = 23.02+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ35",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ35",2,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); posX = 97.29-kNearFarLHC; posY = 23.02-kNearFarLHC; posZ = 2.0*kHzLateralSightAl+kHzVerticalCradleAl-fgkMotherThick2; - gMC->Gspos("SQ35",1,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ35",1,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ35",3,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ35",3,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); // OutVertCradleC 3rd Trapeze - 3 copies posX = 98.31+fgkDeltaQuadLHC; posY = 12.77+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ36",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ36",2,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); posX = 98.05-kNearFarLHC; posY = 12.77-kNearFarLHC; posZ = 2.0*kHzLateralSightAl+kHzVerticalCradleAl-fgkMotherThick2; // Fix (2) of extrusion SQ36 from SQN1, SQN2, SQF1, SQF2 // (was posX = 98.31 ...) - gMC->Gspos("SQ36",1,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ36",1,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ36",3,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ36",3,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); // OutVertCradleD 4th Trapeze - 3 copies posX = 98.81+fgkDeltaQuadLHC; posY = 2.52+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ37",2,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ37",2,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); posZ = fgkMotherThick1-kHzVerticalCradleAl; - gMC->Gspos("SQ37",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ37",1,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ37",3,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ37",3,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); // LateralSightSupport - 2 copies posX = 98.33-kNearFarLHC; @@ -1855,15 +2067,15 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posZ = kHzLateralSightAl-fgkMotherThick2; // Fix (3) of extrusion SQ38 from SQN1, SQN2, SQF1, SQF2 // (was posX = 98.53 ...) - gMC->Gspos("SQ38",1,QuadrantNLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ38",1,quadrantNLayerName,posX, posY, posZ, 0, "ONLY"); posZ = -1.0*posZ; - gMC->Gspos("SQ38",2,QuadrantFLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ38",2,quadrantFLayerName,posX, posY, posZ, 0, "ONLY"); // Mire placement posX = 92.84+fgkDeltaQuadLHC; posY = 8.13+fgkDeltaQuadLHC; posZ = 0.; - gMC->Gspos("SQ39",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0,"ONLY"); + gMC->Gspos("SQ39",1,quadrantMLayerName,posX, posY, posZ, 0,"ONLY"); //--- @@ -1871,7 +2083,7 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = 2.0*kHxInVFrame+2.*kHxV1mm+kIAF+kHxInHFrame; posY = kHyInHFrame; posZ = 0.; - gMC->Gspos("SQ40",1,QuadrantMLayerName(chamber),posX, posY, posZ, 0, "ONLY"); + gMC->Gspos("SQ40",1,quadrantMLayerName,posX, posY, posZ, 0, "ONLY"); // keep memory of the mid position. Used for placing screws const GReal_t kMidHposX = posX; @@ -1882,13 +2094,13 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = 2.0*kHxInVFrame+2.*kHxV1mm+kIAF+kHxH1mm; posY = 2.0*kHyInHFrame+kHyH1mm; posZ = 0.; - gMC->Gspos("SQ41",1,QuadrantMLayerName(chamber),posX, posY, posZ,0, "ONLY"); + gMC->Gspos("SQ41",1,quadrantMLayerName,posX, posY, posZ,0, "ONLY"); // InArcFrame posX = 2.0*kHxInVFrame+2.*kHxV1mm; posY = 2.0*kHyInHFrame+2.*kHyH1mm; posZ = 0.; - gMC->Gspos("SQ42",1,QuadrantMLayerName(chamber),posX, posY, posZ,0, "ONLY"); + gMC->Gspos("SQ42",1,quadrantMLayerName,posX, posY, posZ,0, "ONLY"); // keep memory of the mid position. Used for placing screws const GReal_t kMidArcposX = posX; @@ -1918,10 +2130,10 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = fgkDeltaQuadLHC + scruX[i]; posY = fgkDeltaQuadLHC + scruY[i]; posZ = 0.; - gMC->Gspos("SQ43",i+1,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); + gMC->Gspos("SQ43",i+1,quadrantMLayerName,posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); if (chamber==1) gMC->Gspos("SQ44",i+1,"SQ40",posX+0.1-kMidHposX, posY+0.1-kMidHposY, posZ-kMidHposZ, 0, "ONLY"); - gMC->Gspos("SQ45",i+1,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); + gMC->Gspos("SQ45",i+1,quadrantMLayerName,posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); } // special screw coordinates scruX[63] = 16.3; @@ -1929,10 +2141,10 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = fgkDeltaQuadLHC + scruX[63]; posY = fgkDeltaQuadLHC + scruY[63]; posZ = 0.; - gMC->Gspos("SQ43",64,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); + gMC->Gspos("SQ43",64,quadrantMLayerName,posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); if (chamber==1) gMC->Gspos("SQ44",64,"SQ40",posX+0.1-kMidHposX, posY+0.1-kMidHposY, posZ-kMidHposZ, 0, "ONLY"); - gMC->Gspos("SQ45",64,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); + gMC->Gspos("SQ45",64,quadrantMLayerName,posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); // Screws on the IVEpoxyFrame @@ -1957,10 +2169,10 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = fgkDeltaQuadLHC + scruX[i+lastScrew-1]; posY = fgkDeltaQuadLHC + scruY[i+lastScrew-1]; posZ = 0.; - gMC->Gspos("SQ43",i+lastScrew,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); + gMC->Gspos("SQ43",i+lastScrew,quadrantMLayerName,posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); if (chamber==1) gMC->Gspos("SQ44",i+lastScrew,"SQ00",posX+0.1-kMidVposX, posY+0.1-kMidVposY, posZ-kMidVposZ, 0, "ONLY"); - gMC->Gspos("SQ45",i+lastScrew,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); + gMC->Gspos("SQ45",i+lastScrew,quadrantMLayerName,posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); } // Screws on the OVEpoxyFrame @@ -1984,11 +2196,11 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = fgkDeltaQuadLHC + scruX[i+firstScrew-1]; posY = fgkDeltaQuadLHC + scruY[i+firstScrew-1]; posZ = 0.; - gMC->Gspos("SQ43",i+firstScrew,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); + gMC->Gspos("SQ43",i+firstScrew,quadrantMLayerName,posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); // ?? if (chamber==1) gMC->Gspos("SQ44",i+firstScrew,"SQ25",posX+0.1-kMidOVposX, posY+0.1-kMidOVposY, posZ-kMidOVposZ, 0, "ONLY"); - gMC->Gspos("SQ45",i+firstScrew,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); + gMC->Gspos("SQ45",i+firstScrew,quadrantMLayerName,posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); } // special case for 1st screw, inside the horizontal frame (volume 40) posX = fgkDeltaQuadLHC + scruX[firstScrew-1]; @@ -2008,18 +2220,17 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) posX = fgkDeltaQuadLHC + scruX[i+58]; posY = fgkDeltaQuadLHC + scruY[i+58]; posZ = 0.; - gMC->Gspos("SQ43",i+58+1,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); + gMC->Gspos("SQ43",i+58+1,quadrantMLayerName,posX+0.1, posY+0.1, posZ-kHzInHFrame-kSCRUHLE, 0, "ONLY"); if (chamber==1) gMC->Gspos("SQ44",i+58+1,"SQ42",posX+0.1-kMidArcposX, posY+0.1-kMidArcposY, posZ-kMidArcposZ, 0, "ONLY"); - gMC->Gspos("SQ45",i+58+1,QuadrantMLayerName(chamber),posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); + gMC->Gspos("SQ45",i+58+1,quadrantMLayerName,posX+0.1, posY+0.1, posZ+kHzInHFrame+kSCRUNLE, 0, "ONLY"); } } //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::PlaceInnerLayers(Int_t chamber) { -// Place the gas and copper layers for the specified chamber. -// -- +/// Place the gas and copper layers for the specified chamber. // Rotation Matrices Int_t rot1, rot2, rot3, rot4; @@ -2114,13 +2325,60 @@ void AliMUONSt1GeometryBuilderV2::PlaceInnerLayers(Int_t chamber) gMC->Gspos("SK1C", 2+dpos ,QuadrantMLayerName(chamber),x,y,-zc,0,"ONLY"); } + //______________________________________________________________________________ -void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap specialMap, +void AliMUONSt1GeometryBuilderV2::PlaceSpacer0(Int_t chamber) +{ +/// Place the spacer defined in global positions +/// !! This method should be used only to find out the right mother volume +/// for the spacer if geometry is changed and the plane segment volumes +/// will change their numbering + + // Global position of mother volume for the QuadrantMLayer + // SQM1: (-2.6, -2.6, -522.41) + // SQM2: (-2.6, -2.6, -541.49) + GReal_t mx = 2.6; + GReal_t my = -2.6; + GReal_t mz = 522.41; + + GReal_t x, y, z; + x = 40.82 - mx; + y = 43.04 - my; + z = 522.41 - mz; + AliDebugStream(2) << "spacer05 pos1: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer05", 1, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); + + y = 44.54 - my; + AliDebugStream(2) << "spacer05 pos2: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer05", 2, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); + + x = 40.82 - mx; + y = 43.79 - my; + z = 519.76 - mz; + AliDebugStream(2) << "spacer06 pos1: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer06", 1, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); + + z = 525.06 - mz; + AliDebugStream(2) << "spacer06 pos2: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer06", 2, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); + + x = 40.82 - mx; + y = 43.79 - my; + z = 522.41 - mz; + AliDebugStream(2) << "spacer07 pos1: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer07", 1, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); +} + +//______________________________________________________________________________ +void AliMUONSt1GeometryBuilderV2::PlaceSector(const AliMpSector* sector, + TExMap specialMap, const TVector3& where, Bool_t reflectZ, Int_t chamber) { -// Place all the segments in the mother volume, at the position defined -// by the sector's data. -// -- +/// Place all the segments in the mother volume, at the position defined +/// by the sector's data. \n +/// The lines with comments COMMENT OUT BEGIN/END indicates blocks +/// which can be commented out in order to reduce the number of volumes +/// in a sector to the plane segments corresponding to regular motifs only. static Int_t segNum=1; Int_t sgn; @@ -2139,11 +2397,11 @@ void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap spe GReal_t posX,posY,posZ; -#ifdef ST1_WITH_STL +#ifdef WITH_STL vector alreadyDone; #endif -#ifdef ST1_WITH_ROOT +#ifdef WITH_ROOT TArrayI alreadyDone(20); Int_t nofAlreadyDone = 0; #endif @@ -2154,31 +2412,23 @@ void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap spe for (Int_t iseg=0;isegGetNofRowSegments();iseg++){ // for each row segment AliMpVRowSegment* seg = row->GetRowSegment(iseg); - char segName[5]; -#ifdef ST1_WITH_STL - SpecialMap::iterator iter - = specialMap.find(seg->GetMotifPositionId(0)); - - if ( iter == specialMap.end()){ //if this is a normal segment (ie. not part of ) -#endif - -#ifdef ST1_WITH_ROOT Long_t value = specialMap.GetValue(seg->GetMotifPositionId(0)); if ( value == 0 ){ //if this is a normal segment (ie. not part of ) -#endif // create the cathode part - sprintf(segName,"%.3dM", segNum); - CreatePlaneSegment(segName, seg->Dimensions()/10., seg->GetNofMotifs()); + CreatePlaneSegment(segNum, seg->Dimensions(), seg->GetNofMotifs()); - posX = where.X() + seg->Position().X()/10.; - posY = where.Y() + seg->Position().Y()/10.; + posX = where.X() + seg->Position().X(); + posY = where.Y() + seg->Position().Y(); posZ = where.Z() + sgn * (TotalHzPlane() + fgkHzGas + 2.*fgkHzPadPlane); - gMC->Gspos(segName, 1, QuadrantMLayerName(chamber), posX, posY, posZ, reflZ, "ONLY"); + gMC->Gspos(PlaneSegmentName(segNum).Data(), 1, + QuadrantMLayerName(chamber), posX, posY, posZ, reflZ, "ONLY"); // and place all the daughter boards of this segment + +// COMMENT OUT BEGIN for (Int_t motifNum=0;motifNumGetNofMotifs();motifNum++) { // Copy number @@ -2186,31 +2436,33 @@ void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap spe AliMpMotifPosition* motifPos = sector->GetMotifMap()->FindMotifPosition(motifPosId); Int_t copyNo = motifPosId; - if ( sector->GetDirection() == kX) copyNo += fgkDaughterCopyNoOffset; + if ( sector->GetDirection() == AliMp::kX) copyNo += fgkDaughterCopyNoOffset; // Position - posX = where.X() + motifPos->Position().X()/10.+fgkOffsetX; - posY = where.Y() + motifPos->Position().Y()/10.+fgkOffsetY; + posX = where.X() + motifPos->Position().X() + fgkOffsetX; + posY = where.Y() + motifPos->Position().Y() + fgkOffsetY; posZ = where.Z() + sgn * (fgkMotherThick1 - TotalHzDaughter()); - gMC->Gspos(fgkDaughterName, copyNo, QuadrantMLayerName(chamber), posX, posY, posZ, reflZ, "ONLY"); } +// COMMENT OUT END + segNum++; } else { +// COMMENT OUT BEGIN // if this is a special segment for (Int_t motifNum=0;motifNumGetNofMotifs();motifNum++) {// for each motif Int_t motifPosId = seg->GetMotifPositionId(motifNum); -#ifdef ST1_WITH_STL +#ifdef WITH_STL if (find(alreadyDone.begin(),alreadyDone.end(),motifPosId) != alreadyDone.end()) continue; // don't treat the same motif twice AliMUONSt1SpecialMotif spMot = specialMap[motifPosId]; #endif -#ifdef ST1_WITH_ROOT +#ifdef WITH_ROOT Bool_t isDone = false; Int_t i=0; while (iGetMotifMap()->FindMotifPosition(motifPosId); // Copy number Int_t copyNo = motifPosId; - if ( sector->GetDirection() == kX) copyNo += fgkDaughterCopyNoOffset; + if ( sector->GetDirection() == AliMp::kX) copyNo += fgkDaughterCopyNoOffset; // place the hole for the motif, wrt the requested rotation angle Int_t rot = ( spMot.GetRotAngle()<0.1 ) ? reflZ:rotMat; - posX = where.X() + motifPos->Position().X()/10.+spMot.GetDelta().X(); - posY = where.Y() + motifPos->Position().Y()/10.+spMot.GetDelta().Y(); + posX = where.X() + motifPos->Position().X() + spMot.GetDelta().X(); + posY = where.Y() + motifPos->Position().Y() + spMot.GetDelta().Y(); posZ = where.Z() + sgn * (TotalHzPlane() + fgkHzGas + 2.*fgkHzPadPlane); gMC->Gspos(fgkHoleName, copyNo, QuadrantMLayerName(chamber), posX, posY, posZ, rot, "ONLY"); @@ -2244,27 +2495,28 @@ void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap spe posZ = where.Z() + sgn * (fgkMotherThick1 - TotalHzDaughter()); gMC->Gspos(fgkDaughterName, copyNo, QuadrantMLayerName(chamber), posX, posY, posZ, rot, "ONLY"); -#ifdef ST1_WITH_STL +#ifdef WITH_STL alreadyDone.push_back(motifPosId);// mark this motif as done #endif -#ifdef ST1_WITH_ROOT +#ifdef WITH_ROOT if (nofAlreadyDone == alreadyDone.GetSize()) alreadyDone.Set(2*nofAlreadyDone); alreadyDone.AddAt(motifPosId, nofAlreadyDone++); #endif - // check - // cout << chamber << " processed motifPosId: " << motifPosId << endl; + AliDebugStream(2) << chamber << " processed motifPosId: " << motifPosId << endl; } +// COMMENT OUT END + }// end of special motif case } } +/// \endcond } //______________________________________________________________________________ TString AliMUONSt1GeometryBuilderV2::GasVolumeName(const TString& name, Int_t chamber) const { -// Inserts the chamber number into the name. -// --- +/// Insert the chamber number into the name. TString newString(name); @@ -2276,43 +2528,6 @@ TString AliMUONSt1GeometryBuilderV2::GasVolumeName(const TString& name, Int_t ch return newString; } -/* -//______________________________________________________________________________ -Bool_t AliMUONSt1GeometryBuilderV2::IsInChamber(Int_t ich, Int_t volGid) const -{ -// True if volume is part of the sensitive -// volumes of chamber -// --- - for (Int_t i = 0; i < fChamberV2[ich]->GetSize(); i++) { - if (fChamberV2[ich]->At(i) == volGid) return kTRUE; - } - return kFALSE; -} -*/ - -// -// protected methods -// - -/* -//______________________________________________________________________________ -Int_t AliMUONSt1GeometryBuilderV2::GetChamberId(Int_t volId) const -{ -// Check if the volume with specified volId is a sensitive volume (gas) -// of some chamber and returns the chamber number; -// if not sensitive volume - return 0. -// --- - - for (Int_t i = 1; i <=2; i++) - if (IsInChamber(i-1,volId)) return i; - - for (Int_t i = 3; i <= AliMUONConstants::NCh(); i++) - if (volId==((AliMUONChamber*)(*fChambers)[i-1])->GetGid()) return i; - - return 0; -} -*/ - // // public methods // @@ -2320,6 +2535,8 @@ Int_t AliMUONSt1GeometryBuilderV2::GetChamberId(Int_t volId) const //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateMaterials() { +/// Define materials specific to station 1 + // Materials and medias defined in MUONv1: // // AliMaterial( 9, "ALUMINIUM$", 26.98, 13., 2.7, 8.9, 37.2); @@ -2347,6 +2564,7 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials() // AliMedium(12, "VETRONITE ", 32, 0, iSXFLD, ... // AliMedium(13, "CARBON ", 33, 0, iSXFLD, ... // AliMedium(14, "Rohacell ", 34, 0, iSXFLD, ... +// AliMedium(24, "FrameCH$ ", 44, 1, iSXFLD, ... // // --- Define materials for GEANT --- @@ -2360,14 +2578,14 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials() // --- Define mixtures for GEANT --- // - // Ar-CO2 gas II (80%+20%) - Float_t ag1[2] = { 39.95, 44.01}; - Float_t zg1[2] = { 18., 22.}; - Float_t wg1[2] = { .8, 0.2}; - Float_t dg1 = .001821; - fMUON->AliMixture(45, "ArCO2 II 80%$", ag1, zg1, dg1, 2, wg1); - // was id: 22 - // use wg1 weighting factors (6th arg > 0) + // // Ar-CO2 gas II (80%+20%) +// Float_t ag1[2] = { 39.95, 44.01}; +// Float_t zg1[2] = { 18., 22.}; +// Float_t wg1[2] = { .8, 0.2}; +// Float_t dg1 = .001821; +// fMUON->AliMixture(45, "ArCO2 II 80%$", ag1, zg1, dg1, 2, wg1); +// // was id: 22 +// // use wg1 weighting factors (6th arg > 0) // Rohacell 51 II - imide methacrylique Float_t aRohacell51[4] = { 12.01, 1.01, 16.00, 14.01}; @@ -2422,20 +2640,17 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials() GReal_t stmin = -.8; GReal_t maxStepAlu = fMUON->GetMaxStepAlu(); GReal_t maxDestepAlu = fMUON->GetMaxDestepAlu(); - GReal_t maxStepGas = fMUON->GetMaxStepGas(); - Int_t iSXFLD = gAlice->Field()->Integ(); + // GReal_t maxStepGas = fMUON->GetMaxStepGas(); + Int_t iSXFLD = gAlice->Field()->PrecInteg(); Float_t sXMGMX = gAlice->Field()->Max(); fMUON->AliMedium(21, "ALU_II$", 41, 0, iSXFLD, sXMGMX, tmaxfd, maxStepAlu, maxDestepAlu, epsil, stmin); - // was med: 15 mat: 31 - fMUON->AliMedium(24, "FrameCH$", 44, 1, iSXFLD, sXMGMX, - 10.0, 0.001, 0.001, 0.001, 0.001); // was med: 20 mat: 36 - fMUON->AliMedium(25, "ARG_CO2_II", 45, 1, iSXFLD, sXMGMX, - tmaxfd, maxStepGas, maxDestepAlu, epsil, stmin); - // was med: 9 mat: 22 + // fMUON->AliMedium(25, "ARG_CO2_II", 45, 1, iSXFLD, sXMGMX, +// tmaxfd, maxStepGas, maxDestepAlu, epsil, stmin); +// // was med: 9 mat: 22 fMUON->AliMedium(26, "FOAM_CH$", 46, 0, iSXFLD, sXMGMX, 10.0, 0.1, 0.1, 0.1, 0.1, 0, 0) ; // was med: 16 mat: 32 @@ -2459,15 +2674,20 @@ void AliMUONSt1GeometryBuilderV2::CreateMaterials() //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::CreateGeometry() { -// Create the detailed GEANT geometry for the dimuon arm station1 -// -- +/// Create the detailed GEANT geometry for the dimuon arm station1 + AliDebug(1,"Called"); + // Define chamber volumes as virtual + // + // Create basic volumes // CreateHole(); CreateDaughterBoard(); CreateInnerLayers(); + // CreateSpacer0(); + CreateSpacer(); // Create reflexion matrices // @@ -2553,6 +2773,9 @@ void AliMUONSt1GeometryBuilderV2::CreateGeometry() GetEnvelopes(ich-1) ->AddEnvelopeConstituent(QuadrantMLayerName(ich), QuadrantEnvelopeName(ich,i), i+1, TGeoTranslation(posx, posy, posz)); + GetEnvelopes(ich-1) + ->AddEnvelopeConstituent(QuadrantMFLayerName(ich), QuadrantEnvelopeName(ich,i), + i+5, TGeoTranslation(posx, posy, posz)); // Near/far layers GReal_t posx2 = posx + shiftXY;; @@ -2568,6 +2791,13 @@ void AliMUONSt1GeometryBuilderV2::CreateGeometry() GetEnvelopes(ich-1) ->AddEnvelopeConstituent(QuadrantFLayerName(ich), QuadrantEnvelopeName(ich,i), i+1, TGeoTranslation(posx2, posy2, posz2)); + + // Place spacer in global coordinates in the first non rotated quadrant + // if ( detElemId[i] == 0 ) PlaceSpacer0(ich); + // !! This placement should be used only to find out the right mother volume + // for the spacer if geometry is changed and the plane segment volumes + // will change their numbering + // The call to the method CreateSpacer0(); above haa to be uncommented, too } } } @@ -2575,25 +2805,27 @@ void AliMUONSt1GeometryBuilderV2::CreateGeometry() //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::SetTransformations() { -// Defines the transformations for the station2 chambers. -// --- - - AliMUONChamber* iChamber1 = &fMUON->Chamber(0); - Double_t zpos1 = - iChamber1->Z(); - iChamber1->GetGeometry() - ->SetTranslation(TGeoTranslation(0., 0., zpos1)); - - AliMUONChamber* iChamber2 = &fMUON->Chamber(1); - Double_t zpos2 = - iChamber2->Z(); - iChamber2->GetGeometry() - ->SetTranslation(TGeoTranslation(0., 0., zpos2)); +/// Define the transformations for the station2 chambers. + + if (gAlice->GetModule("SHIL")) { + SetMotherVolume(0, "YOUT1"); + SetMotherVolume(1, "YOUT1"); + } + + SetVolume(0, "SC01", true); + SetVolume(1, "SC02", true); + + Double_t zpos1 = - AliMUONConstants::DefaultChamberZ(0); + SetTranslation(0, TGeoTranslation(0., 0., zpos1)); + + Double_t zpos2 = - AliMUONConstants::DefaultChamberZ(1); + SetTranslation(1, TGeoTranslation(0., 0., zpos2)); } //______________________________________________________________________________ void AliMUONSt1GeometryBuilderV2::SetSensitiveVolumes() { -// Defines the sensitive volumes for station2 chambers. -// --- +/// Define the sensitive volumes for station2 chambers. GetGeometry(0)->SetSensitiveVolume("SA1G"); GetGeometry(0)->SetSensitiveVolume("SB1G");