X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;ds=sidebyside;f=MUON%2FAliMUONSt1GeometryBuilderV2.cxx;h=8198a92d46d8b90a70c2f40cf40cf17703d8dd3c;hb=96dd05194692caabc1880df43d51408b3ffef8e2;hp=fb5f574f858e6bc40cdddc570f202798d77daecd;hpb=b367fd8fcf8993052544fbc09b55a6d21bb01c0b;p=u%2Fmrichter%2FAliRoot.git diff --git a/MUON/AliMUONSt1GeometryBuilderV2.cxx b/MUON/AliMUONSt1GeometryBuilderV2.cxx index fb5f574f858..8198a92d46d 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 @@ -109,32 +121,22 @@ 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 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 +144,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 +162,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 +170,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 +197,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 +227,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,40 +469,141 @@ 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.275; + gMC->Gsvolu("Spacer5A","BOX",idFrameEpoxy,par,3); + + par[0] = 0.575; + 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); -#ifdef ST1_WITH_STL +#ifdef 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 -#ifdef ST1_WITH_ROOT +#ifdef WITH_ROOT SpecialMap specialMap; specialMap.Add(76, (Long_t) new AliMUONSt1SpecialMotif(TVector2( 0.1, 0.84), 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(); +/* + AliMpSectorReader reader1(AliMp::kStation1, AliMp::kBendingPlane); + AliMpSector* kSector1 = reader1.BuildSector(); +*/ //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 +#ifdef WITH_STL specialMap.clear(); specialMap[76] = AliMUONSt1SpecialMotif(TVector2(1.01,0.59),90.); specialMap[75] = AliMUONSt1SpecialMotif(TVector2(1.96, 0.17)); @@ -537,41 +616,63 @@ void AliMUONSt1GeometryBuilderV2::CreateQuadrant(Int_t chamber) // Was: specialMap[47] = AliMUONSt1SpecialMotif(TVector2(1.61,-1.18)); #endif -#ifdef ST1_WITH_ROOT +#ifdef 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.59),90.)); + specialMap.Add(75 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(1.96, 0.17))); + specialMap.Add(47 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(2.18,-0.98))); + specialMap.Add(20 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.2 ,-0.08))); + specialMap.Add(46 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.2 , 0.25))); + specialMap.Add(74 | nb,(Long_t) new AliMUONSt1SpecialMotif(TVector2(0.28, 0.21))); // 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); +/* + AliMpSectorReader reader2(AliMp::kStation1, AliMp::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 +#ifdef 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,89 +686,117 @@ 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.0; + gMC->Gspos("Spacer5A", 1, FoamBoxName(segNumber).Data(), posX, posY, posZ,0, "ONLY"); + + posY = -0.75; + 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" ) posZ *= -1.0; + gMC->Gspos("Spacer6", 1, FoamBoxName(segNumber).Data(), posX, posY, posZ,0, "ONLY"); + + posY = 0.0; + posZ = 0.0; + 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::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] ). const Float_t kNearFarLHC=2.4; // Near and Far TUBS Origin wrt LHC Origin @@ -1135,6 +1264,46 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) par[4] = fgkMotherPhiU1; gMC->Gsvolu(QuadrantMLayerName(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); + } + } + // Quadrant volume TUBS2, positioned at the end par[0] = fgkMotherIR2; par[1] = fgkMotherOR2; @@ -2018,8 +2187,7 @@ void AliMUONSt1GeometryBuilderV2::CreateFrame(Int_t chamber) //______________________________________________________________________________ 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 +2282,59 @@ 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; + cout << "spacer05 pos1: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer05", 1, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); + + y = 44.54 - my; + cout << "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; + cout << "spacer06 pos1: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer06", 1, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); + + z = 525.06 - mz; + cout << "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; + cout << "spacer07 pos1: " << x << ", " << y << ", " << z << endl; + gMC->Gspos("Spacer07", 1, QuadrantMLayerName(chamber), x, y, z, 0, "ONLY"); +} + +//______________________________________________________________________________ +void AliMUONSt1GeometryBuilderV2::PlaceSector(const AliMpSector* sector, + SpecialMap 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. + +/// \cond SKIP static Int_t segNum=1; Int_t sgn; @@ -2139,11 +2353,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,29 +2368,28 @@ 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 +#ifdef 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 +#ifdef 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 for (Int_t motifNum=0;motifNumGetNofMotifs();motifNum++) { @@ -2186,11 +2399,11 @@ 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"); @@ -2204,13 +2417,13 @@ void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap spe 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 (iGetDirection() == 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,10 +2457,10 @@ 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++); @@ -2258,13 +2471,13 @@ void AliMUONSt1GeometryBuilderV2::PlaceSector(AliMpSector* sector,SpecialMap spe }// 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 +2489,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 +2496,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 +2525,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 +2539,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 +2601,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 +2635,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 // @@ -2514,9 +2695,7 @@ void AliMUONSt1GeometryBuilderV2::CreateGeometry() detElemId[3] = 2; // quadrant IV // Shift in Z of the middle layer - // Double_t deltaZ = 7.5/2.; - Double_t deltaZ = fgkMotherThick1; - // Fix (6) - shift of the middle layer = half of its thickness + Double_t deltaZ = 7.5/2.; // Position of quadrant I wrt to the chamber position // TVector3 pos0(-fgkDeltaQuadLHC, -fgkDeltaQuadLHC, deltaZ); @@ -2570,6 +2749,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 } } } @@ -2577,25 +2763,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");