/************************************************************************** * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. * * * * Author: The ALICE Off-line Project. * * Contributors are mentioned in the code where appropriate. * * * * Permission to use, copy, modify and distribute this software and its * * documentation strictly for non-commercial purposes is hereby granted * * without fee, provided that the above copyright notice appears in all * * copies and that both the copyright notice and this permission notice * * appear in the supporting documentation. The authors make no claims * * about the suitability of this software for any purpose. It is * * provided "as is" without express or implied warranty. * **************************************************************************/ /* $Id: */ //======================================================================== // // Geometry of the Inner Tracking System // --------------------------------------- // This geometry is fully described in TGeo geometry (v11) // // Ludovic Gaudichet (gaudichet@to.infn.it) // Mario Sitta (sitta@to.infn.it) // //======================================================================== // $Log$ // Revision 1.1 2011/06/10 14:48:24 masera // First version from v11Hybrid to v11 (M. Sitta) // #include #include #include #include #include #include #include #include #include #include #include "AliITS.h" #include "AliITSDetTypeSim.h" #include "AliITShit.h" #include "AliITSCalibrationSDD.h" #include "AliITSsegmentationSDD.h" #include "AliITSsegmentationSPD.h" #include "AliITSsegmentationSSD.h" #include "AliITSv11.h" #include "AliLog.h" #include "AliMC.h" #include "AliMagF.h" #include "AliRun.h" #include "AliTrackReference.h" #include "AliITSv11GeometrySPD.h" #include "AliITSv11GeometrySDD.h" #include "AliITSv11GeometrySSD.h" #include "AliITSv11GeometrySupport.h" #include "AliGeomManager.h" ClassImp(AliITSv11) //______________________________________________________________________ AliITSv11::AliITSv11(): fByThick(kTRUE), fIDMother(0), fInitGeom(kv11), fSPDgeom(0), fSDDgeom(0), fSSDgeom(0), fSupgeom(0) { // Standard default constructor // Inputs: // none. // Outputs: // none. // Return: // none. } //______________________________________________________________________ AliITSv11::AliITSv11(const char *title) : AliITS("ITS", title), fByThick(kTRUE), fIDMother(0), fInitGeom(kv11), fSPDgeom(0), fSDDgeom(0), fSSDgeom(0), fSupgeom(0) { // Standard constructor for the v11 geometry. // Inputs: // const char * title Arbitrary title // Outputs: // none. // Return: // none. Int_t i; fSPDgeom = new AliITSv11GeometrySPD(); fSDDgeom = new AliITSv11GeometrySDD(0); fSSDgeom = new AliITSv11GeometrySSD(); fSupgeom = new AliITSv11GeometrySupport(); fIdN = 6; fIdName = new TString[fIdN]; fIdName[0] = fSPDgeom->GetSenstiveVolumeName1(); fIdName[1] = fSPDgeom->GetSenstiveVolumeName2(); fIdName[2] = fSDDgeom->GetSenstiveVolumeName3(); fIdName[3] = fSDDgeom->GetSenstiveVolumeName4(); fIdName[4] = fSSDgeom->GetSenstiveVolumeName5(); fIdName[5] = fSSDgeom->GetSenstiveVolumeName6(); fIdSens = new Int_t[fIdN]; for(i=0;iGetSenstiveVolumeName1(); fIdName[1] = fSPDgeom->GetSenstiveVolumeName2(); fIdName[2] = fSDDgeom->GetSenstiveVolumeName3(); fIdName[3] = fSDDgeom->GetSenstiveVolumeName4(); fIdName[4] = fSSDgeom->GetSenstiveVolumeName5(); fIdName[5] = fSSDgeom->GetSenstiveVolumeName6(); fIdSens = new Int_t[fIdN]; for(i=0;iGetAlignableEntryByUID(uid); TGeoHMatrix* globMatrix = alignableEntry->GetGlobalOrig(); Double_t *gtrans = globMatrix->GetTranslation(), rotMatrix[9]; memcpy(&rotMatrix[0], globMatrix->GetRotationMatrix(), 9*sizeof(Double_t)); Double_t al = TMath::ATan2(rotMatrix[1],rotMatrix[0]); if (yRot180) { al = TMath::ATan2(rotMatrix[1],-rotMatrix[0]); } Double_t xShift = gtrans[0]*TMath::Cos(al)+gtrans[1]*TMath::Sin(al); Double_t zShift = -gtrans[2]; TGeoHMatrix *matLtoT = new TGeoHMatrix; matLtoT->SetDx( xShift ); // translation matLtoT->SetDy( yShift ); matLtoT->SetDz( zShift ); rotMatrix[0]= 0; rotMatrix[1]= 1; rotMatrix[2]= 0; // + rotation rotMatrix[3]= 1; rotMatrix[4]= 0; rotMatrix[5]= 0; rotMatrix[6]= 0; rotMatrix[7]= 0; rotMatrix[8]=-1; if (yFlip) rotMatrix[3] = -1; // flipping in y (for SPD1) if (yFlip) rotMatrix[1] = -1; // flipping in y (for SPD1) if (yRot180) { // rotation of pi around the axis perpendicular to the wafer if (yFlip) matLtoT->SetDx( -xShift ); // flipping in y (for SPD1) matLtoT->SetDy( -yShift ); matLtoT->SetDz( -zShift ); rotMatrix[8]=1; rotMatrix[3] = -1; if (yFlip) rotMatrix[3] = 1; // flipping in y (for SPD1) } TGeoRotation rot; rot.SetMatrix(rotMatrix); matLtoT->MultiplyLeft(&rot); TGeoHMatrix *matTtoL = new TGeoHMatrix(matLtoT->Inverse()); delete matLtoT; alignableEntry->SetMatrix(matTtoL); } //______________________________________________________________________ void AliITSv11::AddAlignableVolumes() const { // Creates entries for alignable volumes associating the symbolic volume // name with the corresponding volume path. // // Records in the alignable entries the transformation matrices converting // TGeo local coordinates (in the RS of alignable volumes) to the tracking // system // For this, this function has to run before the misalignment because we // are using the ideal positions in the AliITSgeom object. // Inputs: // none. // Outputs: // none. // Return: // none. AliInfo("Add ITS alignable volumes"); if (!gGeoManager) { AliFatal("TGeoManager doesn't exist !"); return; } AliGeomManager::ELayerID layerId; Int_t modUID, modnum; if( !gGeoManager->SetAlignableEntry("ITS","ALIC_1/ITSV_1") ) AliFatal(Form("Unable to set alignable entry ! %s :: %s", "ITS","ALIC_1/ITSV_1")); TString strSPD = "ITS/SPD"; TString strSDD = "ITS/SDD"; TString strSSD = "ITS/SSD"; TString strStave = "/Stave"; TString strHalfStave = "/HalfStave"; TString strLadder = "/Ladder"; TString strSector = "/Sector"; TString strSensor = "/Sensor"; TString strEntryName1; TString strEntryName2; TString strEntryName3; TString strEntryName4; TString str0; TString str1; TString str2; TString ladder; //===== SPD layers ===== str0 = "ALIC_1/ITSV_1/ITSSPD_1/ITSSPDCarbonFiberSectorV_"; str1 = "/ITSSPDSensitiveVirtualvolumeM0_1/ITSSPDlay1-Stave_"; TString str1Bis = "/ITSSPDhalf-Stave"; TString str1Tierce = "_1"; str2 = "/ITSSPDlay1-Ladder_"; TString sector; TString stave; TString halfStave; TString module; layerId = AliGeomManager::kSPD1; modnum = 0; for(Int_t cSect = 0; cSect<10; cSect++) { sector = str0; sector += cSect+1; // this is one full sector strEntryName1 = strSPD; strEntryName1 += 0; strEntryName1 += strSector; strEntryName1 += cSect; if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),sector.Data())) AliFatal(Form("New lay 1: Unable to set alignable entry 1! %s::%s", strEntryName1.Data(),sector.Data())); for(Int_t cStave=0; cStave<2; cStave++) { stave = sector; stave += str1; stave += cStave+1; strEntryName2 = strEntryName1; strEntryName2 += strStave; strEntryName2 += cStave; for(Int_t cHS=0; cHS<2; cHS++) { halfStave = stave; halfStave += str1Bis; halfStave += cHS; halfStave += str1Tierce; strEntryName3 = strEntryName2; strEntryName3 += strHalfStave; strEntryName3 += cHS; if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(), halfStave.Data())) AliFatal(Form("New lay 1: Unable to set alignable entry 3! %s::%s", strEntryName3.Data(),halfStave.Data())); for(Int_t cLad=0; cLad<2; cLad++) { modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); module = halfStave; module += str2; module += cLad+cHS*2+1; strEntryName4 = strEntryName3; strEntryName4 += strLadder; strEntryName4 += cLad+cHS*2; if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data(),modUID)) AliFatal(Form("New lay 1: Unable to set alignable entry 4! %s::%s", strEntryName4.Data(),module.Data())); SetT2Lmatrix(modUID, 0.0081, kTRUE, kTRUE); // 0.0081 is the shift between the centers of alignable // and sensitive volumes. It is directly extracted from // the new SPD geometry } // end for cLad } // end for cHS } // end for cStave } // end for cSect layerId = AliGeomManager::kSPD2; modnum = 0; str1 = "/ITSSPDSensitiveVirtualvolumeM0_1/ITSSPDlay2-Stave_"; str2 = "/ITSSPDlay2-Ladder_"; for(Int_t cSect = 0; cSect<10; cSect++) { sector = str0; sector += cSect+1; // this is one full sector strEntryName1 = strSPD; strEntryName1 += 1; strEntryName1 += strSector; strEntryName1 += cSect; for(Int_t cStave=0; cStave<4; cStave++) { stave = sector; stave += str1; stave += cStave+1; strEntryName2 = strEntryName1; strEntryName2 += strStave; strEntryName2 += cStave; for(Int_t cHS=0; cHS<2; cHS++) { halfStave = stave; halfStave += str1Bis; halfStave += cHS; halfStave += str1Tierce; strEntryName3 = strEntryName2; strEntryName3 += strHalfStave; strEntryName3 += cHS; if(!gGeoManager->SetAlignableEntry(strEntryName3.Data(), halfStave.Data())) AliFatal(Form("New lay 2: Unable to set alignable entry 3! %s::%s", strEntryName3.Data(),halfStave.Data())); for(Int_t cLad=0; cLad<2; cLad++) { modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); module = halfStave; module += str2; module += cLad+cHS*2 +1; strEntryName4 = strEntryName3; strEntryName4 += strLadder; strEntryName4 += cLad+cHS*2; if(!gGeoManager->SetAlignableEntry(strEntryName4.Data(),module.Data(),modUID)) AliFatal(Form("New lay 2: Unable to set alignable entry 4! %s::%s", strEntryName4.Data(),module.Data())); SetT2Lmatrix(modUID, -0.0081, kFALSE); } // end for cLad } // end for cHS } // end for cStave } // cSect //===== SDD layers ===== layerId = AliGeomManager::kSDD1; modnum = 0; str0 = "/ALIC_1/ITSV_1/ITSsddLayer3_1/ITSsddLadd_"; // SDD layer1 str1 = "/ITSsddSensor3_"; TString sensor; for(Int_t c1 = 0; c1<14; c1++) { ladder = str0; ladder += c1; // the set of wafers from one ladder strEntryName1 = strSDD; strEntryName1 += 2; strEntryName1 +=strLadder; strEntryName1 += c1; //printf("%s == %s\n",strEntryName1.Data(),ladder.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data())) AliFatal(Form("Unable to set alignable entry 1! %s :: %s", strEntryName1.Data(),ladder.Data())); for(Int_t c2 =0; c2<6; c2++) { modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); sensor = ladder; sensor += str1; sensor += c2; strEntryName2 = strEntryName1; strEntryName2 += strSensor; strEntryName2 += c2; //printf("%s == %s\n",strEntryName2.Data(),wafer.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),sensor.Data(),modUID)) AliFatal(Form("Unable to set alignable entry 2! %s :: %s", strEntryName2.Data(),sensor.Data())); SetT2Lmatrix(modUID, 0, kFALSE, c2>=3); } } layerId = AliGeomManager::kSDD2; modnum = 0; str0 = "/ALIC_1/ITSV_1/ITSsddLayer4_1/ITSsddLadd_"; // SDD layer2 str1 = "/ITSsddSensor4_"; for(Int_t c1 = 0; c1<22; c1++) { ladder = str0; ladder += c1; // the set of wafers from one ladder strEntryName1 = strSDD; strEntryName1 += 3; strEntryName1 += strLadder; strEntryName1 += c1; //printf("%s == %s\n",strEntryName1.Data(),ladder.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data())) AliFatal(Form("Unable to set alignable entry 1! %s :: %s", strEntryName1.Data(),ladder.Data())); for(Int_t c2 =0; c2<8; c2++) { modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); sensor = ladder; sensor += str1; sensor += c2; strEntryName2 = strEntryName1; strEntryName2 += strSensor; strEntryName2 += c2; //printf("%s == %s\n",strEntryName2.Data(),wafer.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),sensor.Data(),modUID)) AliFatal(Form("Unable to set alignable entry 2! %s :: %s", strEntryName2.Data(),sensor.Data())); SetT2Lmatrix(modUID, 0, kFALSE, c2>=4); } } //===== SSD layers ===== layerId = AliGeomManager::kSSD1; modnum = 0; str0 = "/ALIC_1/ITSV_1/ITSssdLayer5_1/ITSssdLay5Ladd_";//SSD layer1 str1 = "/ITSssdSensor5_"; str2 = ""; TString wafer; for(Int_t c1 = 0; c1<34; c1++) { ladder = str0; ladder += c1; // the set of wafers from one ladder strEntryName1 = strSSD; strEntryName1 += 4; strEntryName1 += strLadder; strEntryName1 += c1; //printf("%s == %s\n",strEntryName1.Data(),ladder.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data())) AliFatal(Form("Unable to set alignable entry 1! %s :: %s", strEntryName1.Data(),ladder.Data())); for(Int_t c2 =0; c2<22; c2++) { modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); wafer = ladder; wafer += str1; wafer += c2; //wafer += str2; // one wafer strEntryName2 = strEntryName1; strEntryName2 += strSensor; strEntryName2 += c2; //printf("%s == %s\n",strEntryName2.Data(),wafer.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data(),modUID)) AliFatal(Form("Unable to set alignable entry 2! %s :: %s", strEntryName2.Data(),wafer.Data())); SetT2Lmatrix(modUID, 0, kFALSE, kFALSE); } } layerId = AliGeomManager::kSSD2; modnum = 0; str0 = "/ALIC_1/ITSV_1/ITSssdLayer6_1/ITSssdLay6Ladd_"; // SSD layer2 str1 = "/ITSssdSensor6_"; str2 = ""; for(Int_t c1 = 0; c1<38; c1++) { ladder = str0; ladder += c1; // the set of wafers from one ladder strEntryName1 = strSSD; strEntryName1 += 5; strEntryName1 += strLadder; strEntryName1 += c1; //printf("%s == %s\n",strEntryName1.Data(),ladder.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName1.Data(),ladder.Data())) AliFatal(Form("Unable to set alignable entry 1! %s :: %s", strEntryName1.Data(),ladder.Data())); for(Int_t c2 =0; c2<25; c2++) { modUID = AliGeomManager::LayerToVolUID(layerId,modnum++); wafer = ladder; wafer += str1; wafer += c2; //wafer += str2; // one wafer strEntryName2 = strEntryName1; strEntryName2 += strSensor; strEntryName2 += c2; //printf("%s == %s\n",strEntryName2.Data(),wafer.Data()); if(!gGeoManager->SetAlignableEntry(strEntryName2.Data(),wafer.Data(),modUID)) AliFatal(Form("Unable to set alignable entry 2! %s :: %s", strEntryName2.Data(),wafer.Data())); SetT2Lmatrix(modUID, 0, kFALSE, kFALSE); } } } //______________________________________________________________________ void AliITSv11::CreateGeometry() { // Create the geometry and insert it in ALIC TGeoManager *geoManager = gGeoManager; TGeoVolume *vALIC = geoManager->GetVolume("ALIC"); // This part is really ugly, needs to be redone new TGeoVolumeAssembly("ITSV"); new TGeoVolumeAssembly("ITSS"); TGeoVolume *vITSV = geoManager->GetVolume("ITSV"); TGeoVolume *vITSS = geoManager->GetVolume("ITSS"); vALIC->AddNode(vITSV, 1, 0); vALIC->AddNode(vITSS, 1, 0); // const Int_t kLength=100; Char_t vstrng[kLength]; if(fInitGeom.WriteVersionString(vstrng,kLength,(AliITSVersion_t)IsVersion())){ vITSV->SetTitle(vstrng); vITSS->SetTitle(vstrng); } fSPDgeom->SPDSector(vITSV); fSDDgeom->Layer3(vITSV); fSDDgeom->Layer4(vITSV); fSDDgeom->ForwardLayer3(vITSV); fSDDgeom->ForwardLayer4(vITSV); fSSDgeom->Layer5(vITSV); fSSDgeom->Layer6(vITSV); fSSDgeom->LadderSupportLayer5(vITSV); fSSDgeom->LadderSupportLayer6(vITSV); fSSDgeom->EndCapSupportSystemLayer6(vITSV); fSSDgeom->EndCapSupportSystemLayer5(vITSV); fSupgeom->SPDCone(vITSV); fSupgeom->SDDCone(vITSV); fSupgeom->SSDCone(vITSV); fSDDgeom->SDDCables(vITSV); fSSDgeom->SSDCables(vITSV); fSupgeom->ServicesCableSupport(vITSS); fSupgeom->ITSTPCSupports(vITSS); } //______________________________________________________________________ void AliITSv11::CreateMaterials() { // Create ITS materials // This function defines the default materials used in the Geant // Monte Carlo simulations for the geometries AliITSv1, AliITSv3, // AliITSv11. // In general it is automatically replaced by // the CreateMaterials routine defined in AliITSv?. Should the function // CreateMaterials not exist for the geometry version you are using this // one is used. See the definition found in AliITSv5 or the other routine // for a complete definition. // Inputs: // none. // Outputs: // none. // Return: // none. Int_t ifield = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ(); Float_t fieldm = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max(); Float_t tmaxfd = 0.1; // 1.0; // Degree Float_t stemax = 1.0; // cm Float_t deemax = 0.1; // 30.0; // Fraction of particle's energy 0

The Exel spread sheet from which these density number come from. */ //End_Html // AliMaterial(86,"AIRFMDSDD$",0.14610E+02,0.73000E+01,0.12050E-02,0.30423E+05,0.99900E+03); Float_t aA[13],zZ[13],wW[13],den; // From Pierluigi Barberis calculations of 2SPD+1SDD October 2 2002. zZ[0] = 1.0; aA[0] = 1.00794; // Hydrogen zZ[1] = 6.0; aA[1] = 12.011; // Carbon zZ[2] = 7.0; aA[2] = 14.00674; // Nitrogen zZ[3] = 8.0; aA[3] = 15.9994; // Oxigen zZ[4] = 14.0; aA[4] = 28.0855; // Silicon zZ[5] = 24.0; aA[5] = 51.9961; //Cromium zZ[6] = 25.0; aA[6] = 54.938049; // Manganese zZ[7] = 26.0; aA[7] = 55.845; // Iron zZ[8] = 28.0; aA[8] = 58.6934; // Nickle zZ[9] = 29.0; aA[9] = 63.546; // Copper zZ[10] = 13.0; aA[10] = 26.981539; // Alulminum zZ[11] = 47.0; aA[11] = 107.8682; // Silver zZ[12] = 27.0; aA[12] = 58.9332; // Cobolt wW[0] = 0.019965; wW[1] = 0.340961; wW[2] = 0.041225; wW[3] = 0.200352; wW[4] = 0.000386; wW[5] = 0.001467; wW[6] = 0.000155; wW[7] = 0.005113; wW[8] = 0.000993; wW[9] = 0.381262; wW[10] = 0.008121; wW[11] = 0.000000; wW[12] = 0.000000; if(fByThick){// New values seeITS_MatBudget_4B.xls den = 1.5253276; // g/cm^3 Cell O370 }else{ den = 2.58423412; // g/cm^3 Cell L370 } // end if fByThick //den = 6161.7/(3671.58978);//g/cm^3 Volume does not exclude holes AliMixture(86,"AIRFMDSDD$",aA,zZ,den,+11,wW); AliMedium(86,"AIRFMDSDD$",86,0,ifield,fieldm,tmaxfdAir,stemaxAir, deemaxAir,epsilAir,stminAir); //AliMaterial(87,"AIRFMDSSD$",0.14610E+02,0.73000E+01,0.12050E-02,0.30423E+05,0.99900E+03); // From Pierluigi Barberis calculations of SSD October 2 2002. wW[0] = 0.019777; wW[1] = 0.325901; wW[2] = 0.031848; wW[3] = 0.147668; wW[4] = 0.030609; wW[5] = 0.013993; wW[6] = 0.001479; wW[7] = 0.048792; wW[8] = 0.009477; wW[9] = 0.350697; wW[10] = 0.014546; wW[11] = 0.005213; wW[12] = 0.000000; if(fByThick){// New values seeITS_MatBudget_4B.xls den = 1.2464275; // g/cm^3 Cell O403 }else{ den = 1.28134409; // g/cm^3 Cell L403 } // end if fByThick //den = 7666.3/(9753.553259); // volume does not exclude holes AliMixture(87,"AIRFMDSSD$",aA,zZ,den,+12,wW); AliMedium(87,"AIRFMDSSD$",87,0,ifield,fieldm,tmaxfdAir,stemaxAir, deemaxAir,epsilAir,stminAir); //AliMaterial(88,"ITS SANDW CFMDSDD$",0.12011E+02,0.60000E+01,0.41000E+00,0.90868E+02,0.99900E+03); // From Pierluigi Barberis calculations of 1SDD+Carbon fiber October 2 2002 wW[0] = 0.016302; wW[1] = 0.461870; wW[2] = 0.033662; wW[3] = 0.163595; wW[4] = 0.000315; wW[5] = 0.001197; wW[6] = 0.000127; wW[7] = 0.004175; wW[8] = 0.000811; wW[9] = 0.311315; wW[10] = 0.006631; wW[11] = 0.000000; wW[12] = 0.000000; if(fByThick){// New values seeITS_MatBudget_4B.xls den = 1.9353276; // g/cm^3 Cell N370 }else{ den = 3.2788626; // g/cm^3 Cell F370 } // end if fByThick //den = 7667.1/(3671.58978); // Volume does not excludeholes AliMixture(88,"ITS SANDW CFMDSDD$",aA,zZ,den,+11,wW); AliMedium(88,"ITS SANDW CFMDSDD$",88,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); //AliMaterial(89,"ITS SANDW CFMDSSD$",0.12011E+02,0.60000E+01,0.41000E+00,0.90868E+02,0.99900E+03); // From Pierluigi Barberis calculations of SSD+Carbon fiber October 2 2002. wW[0] = 0.014065; wW[1] = 0.520598; wW[2] = 0.022650; wW[3] = 0.105018; wW[4] = 0.021768; wW[5] = 0.009952; wW[6] = 0.001051; wW[7] = 0.034700; wW[8] = 0.006740; wW[9] = 0.249406; wW[10] = 0.010345; wW[11] = 0.0003707; wW[12] = 0.000000; if(fByThick){// New values seeITS_MatBudget_4B.xls den = 1.6564275; // g/cm^3 Cell N304 }else{ den = 1.7028296; // g/cm^3 Cell F304 } // end if fByThick //den = 1166.5/(3671.58978); // Volume does not exclude holes AliMixture(89,"ITS SANDW CFMDSSD$",aA,zZ,den,+12,wW); AliMedium(89,"ITS SANDW CFMDSSD$",89,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); //AliMaterial(97,"SPD SERVICES$",0.12011E+02,0.60000E+01,0.41000E+00,0.90868E+02,0.99900E+03); // From Pierluigi Barberis calculations of 1SPD October 2 2002. wW[0] = 0.005970; wW[1] = 0.304704; wW[2] = 0.042510; wW[3] = 0.121715; wW[4] = 0.001118; wW[5] = 0.030948; wW[6] = 0.003270; wW[7] = 0.107910; wW[8] = 0.020960; wW[9] = 0.360895; wW[10] = 0.000000; wW[11] = 0.000000; wW[12] = 0.000000; if(fByThick){// New values seeITS_MatBudget_4B.xls den = 80.31136576; // g/cm^3 Cell H329 }else{ den = 87.13062; // g/cm^3 Cell G329 } // end if fByThick //den = 1251.3/(0.05*2.0*TMath::Pi()*(7.75*7.75 - 3.7*3.7)); // g/cm^3 AliMixture(97,"SPD SERVICES$",aA,zZ,den,+10,wW); AliMedium(97,"SPD SERVICES$",97,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); // Special media AliMaterial(90,"SPD shield$", 12.011, 6., 1.93 , 22.36, 999); AliMedium(90,"SPD shield$",90,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); // SPD End Ladder (data from Petra Riedler) Float_t aSPDel[5] = {1.00794,12.0107,14.01,15.9994,63.54 }; Float_t zSPDel[5] = {1.,6.,7.,8.,29.}; Float_t wSPDel[5] = {0.004092,0.107274,0.011438,0.032476,0.844719}; Float_t dSPDel = 3.903403; // AliMaterial(91, "SPD End ladder$", 47.0447, 21.7963, 3.6374, 4.4711, 999); AliMixture(91,"SPD End ladder$",aSPDel,zSPDel,dSPDel,5,wSPDel); AliMedium(91,"SPD End ladder$",91,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); AliMaterial(92, "SPD cone$",28.0855, 14., 2.33, 9.36, 999); AliMedium(92,"SPD cone$",92,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); /* Material with fractional Z not actually used AliMaterial(93, "SDD End ladder$", 69.9298, 29.8246, 0.3824, 36.5103, 999); AliMedium(93,"SDD End ladder$",93,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); */ AliMaterial(94, "SDD cone$",63.546, 29., 1.15, 1.265, 999); AliMedium(94,"SDD cone$",94,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); /* Material with fractional Z not actually used AliMaterial(95, "SSD End ladder$", 32.0988, 15.4021, 0.68, 35.3238, 999); AliMedium(95,"SSD End ladder$",95,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); */ AliMaterial(96, "SSD cone$",63.546, 29., 1.15, 1.265, 999); AliMedium(96,"SSD cone$",96,0,ifield,fieldm,tmaxfdServ,stemaxServ,deemaxServ,epsilServ,stminServ); AliMixture(98,"SDD OPTICFIB$",aoptfib,zoptfib,doptfib,-2,woptfib); AliMedium(98,"SDD OPTICFIB$",98,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); AliMixture(95,"SSD FEP$",aFEP,zFEP,dFEP,-2,wFEP); AliMedium(95,"SSD FEP$",95,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); // Mean material for low-voltage cables on SPD trays Side A // (Copper + PolyEthylene (C2-H4)) (D.Elia for cable number and // cross-section area, M.Sitta for elemental computation) - 26 Feb 10 wW[0] = 0.323024;//H wW[2] = 0.515464;//Cu wW[1] = 0.161512;//C wW[3] = 0.000000;//O wW[4] = 0.000000;//S wW[5] = 0.000000;//F wW[6] = 0.000000;//Sn wW[7] = 0.000000;//Pb wW[8] = 0.000000;//Cr wW[9] = 0.000000;//Si wW[10] = 0.000000;//Ni wW[11] = 0.000000;//Ca den = 5.078866; AliMixture(60,"SPD_LOWCABLES$",aA,zZ,den,+3,wW); AliMedium(60,"SPD_LOWCABLES$",60,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); // Mean material for high-voltage cables on SPD trays Side A & C // (Copper + HD PolyEthylene (C2-H2)) (D.Elia for cable number and // cross-section area, M.Sitta for elemental computation) - 10 Jun 10 wW[0] = 0.083766;//H wW[2] = 0.417136;//Cu wW[1] = 0.499098;//C wW[3] = 0.000000;//O wW[4] = 0.000000;//S wW[5] = 0.000000;//F wW[6] = 0.000000;//Sn wW[7] = 0.000000;//Pb wW[8] = 0.000000;//Cr wW[9] = 0.000000;//Si wW[10] = 0.000000;//Ni wW[11] = 0.000000;//Ca den = 1.514930; AliMixture(58,"SPD_HICABLES$",aA,zZ,den,+3,wW); AliMedium(58,"SPD_HICABLES$",58,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); // PolyUrethane [C25-H42-N2-O6] - 07 Mar 10 zZ[2] = 7.0; aA[2] = 14.0067; // Nitrogen - From Root TGeoElementTable wW[0] = 0.090724;//H wW[2] = 0.060035;//N wW[1] = 0.643513;//C wW[3] = 0.205728;//O wW[4] = 0.000000;//S wW[5] = 0.000000;//F wW[6] = 0.000000;//Sn wW[7] = 0.000000;//Pb wW[8] = 0.000000;//Cr wW[9] = 0.000000;//Si wW[10] = 0.000000;//Ni wW[11] = 0.000000;//Ca den = 1.158910; AliMixture(67,"POLYURETHANE$",aA,zZ,den,+4,wW); AliMedium(67,"POLYURETHANE$",67,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); // POM (Polyoxymethylene = (CH2O)n ) - 02 May 10 zZ[2] = 8.0; aA[2] = 15.9994; // Oxigen wW[0] = 0.067137;//H wW[1] = 0.400016;//C wW[2] = 0.532847;//O wW[3] = 0.000000;//O wW[4] = 0.000000;//S wW[5] = 0.000000;//F wW[6] = 0.000000;//Sn wW[7] = 0.000000;//Pb wW[8] = 0.000000;//Cr wW[9] = 0.000000;//Si wW[10] = 0.000000;//Ni wW[11] = 0.000000;//Ca den = 1.4200; AliMixture(57,"POLYOXYMETHYLENE$",aA,zZ,den,+3,wW); AliMedium(57,"POLYOXYMETHYLENE$",57,0,ifield,fieldm,tmaxfd,stemax, deemax,epsil,stmin); // Anticorodal (Aliminum alloy) - 08 nov 10 // A,Z from Root TGeoElementTable, W from Web sites zZ[0] = 13.0; aA[0] = 26.9815; // Aluminium zZ[1] = 29.0; aA[1] = 63.546 ; // Copper zZ[2] = 26.0; aA[2] = 55.845 ; // Iron zZ[3] = 25.0; aA[3] = 54.938 ; // Manganese zZ[4] = 12.0; aA[4] = 24.305 ; // Magnesium zZ[5] = 14.0; aA[5] = 28.0855; // Silicon zZ[6] = 30.0; aA[6] = 65.39 ; // Zinc zZ[7] = 24.0; aA[7] = 51.9961; // Chromium zZ[8] = 22.0; aA[8] = 47.867 ; // Titanium wW[1] = 0.001000;//Cu wW[2] = 0.005000;//Fe wW[3] = 0.007000;//Mn - mean value wW[4] = 0.009000;//Mg - mean value wW[5] = 0.001000;//Si - mean value wW[6] = 0.002000;//Zn wW[7] = 0.002500;//Cr wW[8] = 0.001000;//Ti Double_t totFrac = 0; for (Int_t j=1; j<9; j++) totFrac += wW[j]; wW[0] = 1. - totFrac;//Al - the remainder den = 2.69; AliMixture(93,"ANTICORODAL$",aA,zZ,den,+9,wW); AliMedium(93,"ANTICORODAL$",93,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); // Hokotol (another Aluminium alloy) - 08 nov 10 // A,Z from Root TGeoElementTable, W from Web sites zZ[0] = 13.0; aA[0] = 26.9815; // Aluminium zZ[1] = 29.0; aA[1] = 63.546 ; // Copper zZ[2] = 26.0; aA[2] = 55.845 ; // Iron zZ[3] = 25.0; aA[3] = 54.938 ; // Manganese zZ[4] = 12.0; aA[4] = 24.305 ; // Magnesium zZ[5] = 14.0; aA[5] = 28.0855; // Silicon zZ[6] = 30.0; aA[6] = 65.39 ; // Zinc zZ[7] = 24.0; aA[7] = 51.9961; // Chromium zZ[8] = 22.0; aA[8] = 47.867 ; // Titanium zZ[9] = 40.0; aA[9] = 91.224 ; // Zirconium wW[1] = 0.020500;//Cu - mean value wW[2] = 0.000300;//Fe wW[3] = 0.022000;//Mn - mean value wW[4] = 0.001000;//Mg - mean value wW[5] = 0.002000;//Si - mean value wW[6] = 0.066500;//Zn wW[7] = 0.005000;//Cr wW[8] = 0.000600;//Ti wW[9] = 0.001650;//Zr - mean value totFrac = 0; for (Int_t j=1; j<10; j++) totFrac += wW[j]; wW[0] = 1. - totFrac;//Al - the remainder den = 2.69; AliMixture(34,"HOKOTOL$",aA,zZ,den,+10,wW); AliMedium(34,"HOKOTOL$",34,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); // Ergal (7075) (yet another Aluminium alloy) - 09 nov 10 // A,Z from Root TGeoElementTable, W from Web sites zZ[0] = 13.0; aA[0] = 26.9815; // Aluminium zZ[1] = 29.0; aA[1] = 63.546 ; // Copper zZ[2] = 26.0; aA[2] = 55.845 ; // Iron zZ[3] = 25.0; aA[3] = 54.938 ; // Manganese zZ[4] = 12.0; aA[4] = 24.305 ; // Magnesium zZ[5] = 14.0; aA[5] = 28.0855; // Silicon zZ[6] = 30.0; aA[6] = 65.39 ; // Zinc zZ[7] = 24.0; aA[7] = 51.9961; // Chromium zZ[8] = 22.0; aA[8] = 47.867 ; // Titanium wW[1] = 0.016000;//Cu - mean value wW[2] = 0.005000;//Fe wW[3] = 0.003000;//Mn wW[4] = 0.025000;//Mg - mean value wW[5] = 0.004000;//Si wW[6] = 0.056000;//Zn - mean value wW[7] = 0.002300;//Cr - mean value wW[8] = 0.002000;//Ti totFrac = 0; for (Int_t j=1; j<9; j++) totFrac += wW[j]; wW[0] = 1. - totFrac;//Al - the remainder den = 2.69; AliMixture(33,"ERGAL$",aA,zZ,den,+9,wW); AliMedium(33,"ERGAL$",33,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); // Alcoa (2024) (yet another Aluminium alloy) - 11 sep 14 // A,Z from Root TGeoElementTable, W from Web sites zZ[0] = 13.0; aA[0] = 26.9815; // Aluminium zZ[1] = 29.0; aA[1] = 63.546 ; // Copper zZ[2] = 26.0; aA[2] = 55.845 ; // Iron zZ[3] = 25.0; aA[3] = 54.938 ; // Manganese zZ[4] = 12.0; aA[4] = 24.305 ; // Magnesium zZ[5] = 14.0; aA[5] = 28.0855; // Silicon zZ[6] = 30.0; aA[6] = 65.39 ; // Zinc zZ[7] = 24.0; aA[7] = 51.9961; // Chromium zZ[8] = 22.0; aA[8] = 47.867 ; // Titanium wW[1] = 0.044000;//Cu - mean value wW[2] = 0.005000;//Fe wW[3] = 0.006000;//Mn - mean value wW[4] = 0.015000;//Mg - mean value wW[5] = 0.005000;//Si wW[6] = 0.002500;//Zn wW[7] = 0.001000;//Cr wW[8] = 0.001500;//Ti totFrac = 0; for (Int_t j=1; j<9; j++) totFrac += wW[j]; wW[0] = 1. - totFrac;//Al - the remainder den = 2.69; AliMixture(32,"ALCOAAL$",aA,zZ,den,+9,wW); AliMedium(32,"ALCOAAL$",32,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin); } //______________________________________________________________________ void AliITSv11::Init() { // Initialise the ITS after it has been created. // Inputs: // none. // Outputs: // none. // Return: // none. UpdateInternalGeometry(); AliITS::Init(); fIDMother = TVirtualMC::GetMC()->VolId("ITSV"); // ITS Mother Volume ID. } //______________________________________________________________________ void AliITSv11::SetDefaults() { // sets the default segmentation, response, digit and raw cluster classes // Inputs: // none. // Outputs: // none. // Return: // none. if(!fDetTypeSim){ Warning("SetDefaults","Error fDetTypeSim not defined"); return; } fDetTypeSim->SetDefaults(); if(fgkNTYPES>3){ Warning("SetDefaults", "Only the four basic detector types are initialised!"); }// end if return; } //______________________________________________________________________ void AliITSv11::StepManager() { // Called for every step in the ITS, then calles the AliITShit class // creator with the information to be recoreded about that hit. // The value of the macro ALIITSPRINTGEOM if set to 1 will allow the // printing of information to a file which can be used to create a .det // file read in by the routine CreateGeometry(). If set to 0 or any other // value except 1, the default behavior, then no such file is created nor // it the extra variables and the like used in the printing allocated. // Inputs: // none. // Outputs: // none. // Return: // none. if(!(this->IsActive())) return; if(!(TVirtualMC::GetMC()->TrackCharge())) return; Int_t copy, lay = 0; Int_t id = TVirtualMC::GetMC()->CurrentVolID(copy); Bool_t notSens = kFALSE; while ((layIsTrackExiting()) { AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kITS); } // if Outer ITS mother Volume static TLorentzVector position, momentum; // Saves on calls to construtors static AliITShit hit;// Saves on calls to constructors TClonesArray &lhits = *(Hits()); Int_t cpn0, cpn1, mod, status = 0; // // Track status if(TVirtualMC::GetMC()->IsTrackInside()) status += 1; if(TVirtualMC::GetMC()->IsTrackEntering()) status += 2; if(TVirtualMC::GetMC()->IsTrackExiting()) status += 4; if(TVirtualMC::GetMC()->IsTrackOut()) status += 8; if(TVirtualMC::GetMC()->IsTrackDisappeared()) status += 16; if(TVirtualMC::GetMC()->IsTrackStop()) status += 32; if(TVirtualMC::GetMC()->IsTrackAlive()) status += 64; // // retrieve the indices with the volume path // switch (lay) { case 0:case 1: // SPD TVirtualMC::GetMC()->CurrentVolOffID(1,copy); // ladder TVirtualMC::GetMC()->CurrentVolOffID(3,cpn1); // stave TVirtualMC::GetMC()->CurrentVolOffID(5,cpn0); // sector break; case 2:case 3: // SDD copy = 1; TVirtualMC::GetMC()->CurrentVolOffID(2,cpn1); TVirtualMC::GetMC()->CurrentVolOffID(3,cpn0); break; case 4:case 5: // SSD copy = 1; TVirtualMC::GetMC()->CurrentVolOffID(1,cpn1); TVirtualMC::GetMC()->CurrentVolOffID(2,cpn0); break; default: AliError(Form("Invalid value: lay= %d . Not an ITS sensitive volume",lay)); return; // not an ITS sensitive volume. } // fInitGeom.DecodeDetector(mod,lay+1,cpn0,cpn1,copy); // We should not need to pass by the switch ! // This is time consuming... // therefore DecodeDetectorv11(...) shouldn't be private ! // and we should be able to use instead : //fInitGeom.DecodeDetectorv11(mod,lay+1,cpn0,cpn1,copy); // // Fill hit structure. // hit.SetModule(mod); hit.SetTrack(gAlice->GetMCApp()->GetCurrentTrackNumber()); TVirtualMC::GetMC()->TrackPosition(position); TVirtualMC::GetMC()->TrackMomentum(momentum); hit.SetPosition(position); hit.SetTime(TVirtualMC::GetMC()->TrackTime()); hit.SetMomentum(momentum); hit.SetStatus(status); hit.SetEdep(TVirtualMC::GetMC()->Edep()); hit.SetShunt(GetIshunt()); if(TVirtualMC::GetMC()->IsTrackEntering()){ hit.SetStartPosition(position); hit.SetStartTime(TVirtualMC::GetMC()->TrackTime()); hit.SetStartStatus(status); return; // don't save entering hit. } // end if IsEntering // Fill hit structure with this new hit. //Info("StepManager","Calling Copy Constructor"); new(lhits[fNhits++]) AliITShit(hit); // Use Copy Construtor. // Save old position... for next hit. hit.SetStartPosition(position); hit.SetStartTime(TVirtualMC::GetMC()->TrackTime()); hit.SetStartStatus(status); return; }