/************************************************************************** * Copyright(c) 1998-1999, 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. * **************************************************************************/ //************************************************************************* // SSD geometry, based on ROOT geometrical modeler // // Enrico Cattaruzza ecattar@ts.infn.it //************************************************************************* #include "TMath.h" #include "TGeoVolume.h" #include "TGeoMedium.h" #include "TGeoMatrix.h" #include #include "AliITSv11GeometrySSD.h" #include "TVector3.h" #include "TGeoArb8.h" #include "TList.h" #include "TGeoMatrix.h" #include "TGeoCompositeShape.h" #include "TGeoTube.h" #include "TGeoBBox.h" #include "TGeoTrd1.h" #include using namespace std; ///////////////////////////////////////////////////////////////////////////////// //Parameters for SSD Geometry ///////////////////////////////////////////////////////////////////////////////// // Layer5 (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDLay5LadderLength = 950.7; const Int_t AliITSv11GeometrySSD::fgkSSDLay5SensorsNumber = 22; const Int_t AliITSv11GeometrySSD::fgkSSDLay5LadderNumber = 34; const Double_t AliITSv11GeometrySSD::fgkSSDLay5RadiusMin = 378.0; const Double_t AliITSv11GeometrySSD::fgkSSDLay5RadiusMax = 384.0; const Double_t AliITSv11GeometrySSD::fgkLay5CenterITSPosition = 467.85; ///////////////////////////////////////////////////////////////////////////////// // Layer6 (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDLay6LadderLength = 1068.0; const Int_t AliITSv11GeometrySSD::fgkSSDLay6SensorsNumber = 25; const Int_t AliITSv11GeometrySSD::fgkSSDLay6LadderNumber = 38; const Double_t AliITSv11GeometrySSD::fgkSSDLay6RadiusMin = 428.0; const Double_t AliITSv11GeometrySSD::fgkSSDLay6RadiusMax = 434.0; const Double_t AliITSv11GeometrySSD::fgkLay6CenterITSPosition = 526.50; ///////////////////////////////////////////////////////////////////////////////// // SSD Chips and Hybrid (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Int_t AliITSv11GeometrySSD::fgkSSDChipNumber = 6; const Double_t AliITSv11GeometrySSD::fgkSSDChipLength = 11.100; const Double_t AliITSv11GeometrySSD::fgkSSDChipWidth = 3.850; const Double_t AliITSv11GeometrySSD::fgkSSDChipHeight = 0.180; const Double_t AliITSv11GeometrySSD::fgkSSDChipSeparationLength = 1.000; const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueLength = fgkSSDChipLength; const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueWidth = fgkSSDChipWidth; const Double_t AliITSv11GeometrySSD::fgkSSDChipGlueHeight = 0.030; ///////////////////////////////////////////////////////////////////////////////// // Stiffener (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerLength = 73.000; const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerWidth = 6.500; //const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerHeight = 3.315; const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerHeight = 0.315; const Double_t AliITSv11GeometrySSD::fgkSSDStiffenerToChipDist = 2.500; const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Length = 1.600; const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Width = 0.870; const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor0603Height = 0.800; const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Length = 4.600; const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Width = 3.400; const Double_t AliITSv11GeometrySSD::fgkSSDCapacitor1812Height = 1.400; const Double_t AliITSv11GeometrySSD::fgkSSDWireLength = 30.000; const Double_t AliITSv11GeometrySSD::fgkSSDWireRadius = 0.185; const Double_t AliITSv11GeometrySSD::fgkSSDConnectorPosition[2] = {44.32, 0.33}; const Double_t AliITSv11GeometrySSD::fgkSSDConnectorSeparation = 0.44; const Double_t AliITSv11GeometrySSD::fgkSSDConnectorLength = 2.16; const Double_t AliITSv11GeometrySSD::fgkSSDConnectorWidth = 3.60; const Double_t AliITSv11GeometrySSD::fgkSSDConnectorHeight = 0.25*fgkSSDStiffenerHeight; ///////////////////////////////////////////////////////////////////////////////// // Cooling Block (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockLength = 3.000; const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockWidth = 4.000; const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHeight[3] = {1.950, 0.240, 0.300}; const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleRadius[2] = {1.000, 0.120}; const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleLength[2] = {1.900, 0.400}; const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleCenter = 1.500; const Double_t AliITSv11GeometrySSD::fgkSSDCoolingBlockHoleHeight = 0.300; ///////////////////////////////////////////////////////////////////////////////// // SSD Sensor (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const char* AliITSv11GeometrySSD::fgkSSDSensitiveVolName = "SSDSensorSensitiveVol"; const Double_t AliITSv11GeometrySSD::fgkSSDSensorLength = 42.000; const Double_t AliITSv11GeometrySSD::fgkSSDSensorHeight = 0.300; const Double_t AliITSv11GeometrySSD::fgkSSDSensorWidth = 75.000; const Double_t AliITSv11GeometrySSD::fgkSSDSensorOverlap = fgkSSDSensorLength-39.1; const Double_t AliITSv11GeometrySSD::fgkSSDSensorInsensitiveLength = 1.; const Double_t AliITSv11GeometrySSD::fgkSSDSensorInsensitiveWidth = 1.; ///////////////////////////////////////////////////////////////////////////////// // Flex (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDFlexFullLength = 106.000; const Double_t AliITSv11GeometrySSD::fgkSSDFlexLength[4] = {0.5*(fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength +(fgkSSDChipNumber-1)*fgkSSDChipSeparationLength), 0.5*(fgkSSDStiffenerLength+fgkSSDChipNumber*fgkSSDChipLength +(fgkSSDChipNumber-1)*fgkSSDChipSeparationLength)-4.000, 9.500, 10.000}; const Double_t AliITSv11GeometrySSD::fgkSSDFlexWidth[2] = { 9.340, 5.380}; const Double_t AliITSv11GeometrySSD::fgkSSDFlexHeight[2] = { 0.030, 0.020}; const Double_t AliITSv11GeometrySSD::fgkSSDFlexAngle = 30.000; const Double_t AliITSv11GeometrySSD::fgkSSDFlexHoleLength = 1.430; const Double_t AliITSv11GeometrySSD::fgkSSDFlexHoleWidth = 3.000; const Double_t AliITSv11GeometrySSD::fgkSSDEndFlexCompLength[6] = {3.30,4.12,4.22,1.70,0.75,7.18}; const Double_t AliITSv11GeometrySSD:: fgkSSDEndFlexCompWidth[3] = {15.03,23.48,12.28}; ///////////////////////////////////////////////////////////////////////////////// // SSD Ladder Cable (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDLadderCableWidth = 23.5; const Double_t AliITSv11GeometrySSD::fgkSSDEndLadderCableLength = 50.000; /////to be modified ///////////////////////////////////////////////////////////////////////////////// // SSD Module (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDModuleStiffenerPosition[2] = { 1.000, 3.900}; const Double_t AliITSv11GeometrySSD::fgkSSDModuleSensorSupportDistance = 45.600; const Double_t AliITSv11GeometrySSD::fgkSSDModuleCoolingBlockToSensor = 5.075; ///////////////////////////////////////////////////////////////////////////////// // Sensor Support (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportLength = 5.800; const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportWidth = 2.000; const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportHeight[2] = { 4.620, 5.180}; const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportThickness[2] = { 0.450, 0.450}; const Double_t AliITSv11GeometrySSD::fgkSSDSensorSideSupportPosition = 0.5*(fgkSSDModuleSensorSupportDistance + fgkSSDSensorSideSupportThickness[0]) - fgkSSDSensorSideSupportLength; const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportLength = 5.250; const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportWidth = 1.680; const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportHeight[2] = {fgkSSDSensorSideSupportHeight[0]+fgkSSDSensorSideSupportThickness[0], fgkSSDSensorSideSupportHeight[1]+fgkSSDSensorSideSupportThickness[1]}; const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportThickness[2] = {fgkSSDSensorSideSupportThickness[0],fgkSSDSensorSideSupportThickness[1]}; const Double_t AliITSv11GeometrySSD::fgkSSDSensorCenterSupportPosition = 19.000; ///////////////////////////////////////////////////////////////////////////////// // Chip Cables (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDChipCablesLength[2] = {73.12/fgkSSDChipNumber,fgkSSDChipLength+2.*0.19}; const Double_t AliITSv11GeometrySSD::fgkSSDChipCablesHeight[4] = { 0.014, 0.010, fgkSSDModuleCoolingBlockToSensor - (fgkSSDSensorSideSupportHeight[1]-fgkSSDSensorSideSupportHeight[0]) - fgkSSDCoolingBlockHoleCenter-fgkSSDStiffenerHeight - fgkSSDChipHeight-fgkSSDSensorHeight, fgkSSDModuleCoolingBlockToSensor - fgkSSDCoolingBlockHoleCenter-fgkSSDStiffenerHeight - fgkSSDChipHeight-fgkSSDSensorHeight}; const Double_t AliITSv11GeometrySSD::fgkSSDChipCablesWidth[3] = { 11.000, 0.800, 0.600}; ///////////////////////////////////////////////////////////////////////////////// // Carbon Fiber Junction Parameters (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionLength = 3.820; //const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionLength = // 3.780; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionWidth = fgkSSDSensorLength-fgkSSDSensorOverlap; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionEdge[2] = { 0.86, 0.30}; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionAngle[2] = { 30.00, 90.00}; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberJunctionToSensorSupport = 1.78; ///////////////////////////////////////////////////////////////////////////////// //Carbon Fiber Parameters (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkCarbonFiberTriangleLength = fgkSSDModuleSensorSupportDistance-2.*fgkCarbonFiberJunctionToSensorSupport; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberTriangleAngle = 60.00; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportTopEdgeDist[2] = { 0.751, 0.482}; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportEdgeLength = 1.630; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportWidth = 0.950; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportXAxisLength = fgkCarbonFiberTriangleLength-0.5*fgkCarbonFiberSupportTopEdgeDist[1] / TMath::Cos(fgkCarbonFiberTriangleAngle*TMath::DegToRad()); const Double_t AliITSv11GeometrySSD::fgkCarbonFiberSupportYAxisLength = 0.5*(fgkCarbonFiberJunctionWidth-fgkCarbonFiberSupportWidth) - fgkCarbonFiberSupportTopEdgeDist[0]-fgkCarbonFiberSupportWidth; ///////////////////////////////////////////////////////////////////////////////// // Carbon Fiber Lower Support Parameters (lengths are in mm) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportWidth = 0.950; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportLowerLenght = 1.600; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportHeight = 0.830; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportVolumeSeparation = 0.5*fgkCarbonFiberSupportWidth; const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportTransverseWidth = fgkCarbonFiberJunctionWidth - 2.*(fgkCarbonFiberLowerSupportWidth + fgkCarbonFiberLowerSupportVolumeSeparation); const Double_t AliITSv11GeometrySSD::fgkCarbonFiberLowerSupportVolumePosition[2] = {fgkCarbonFiberLowerSupportWidth + fgkCarbonFiberLowerSupportVolumeSeparation, fgkCarbonFiberLowerSupportWidth + fgkCarbonFiberLowerSupportVolumeSeparation + fgkCarbonFiberLowerSupportTransverseWidth}; ///////////////////////////////////////////////////////////////////////////////// // End Ladder Carbon Fiber Junction Parameters (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkEndLadderCarbonFiberLowerJunctionLength[2] = {0.5*(fgkSSDLay5LadderLength -fgkSSDLay5SensorsNumber*fgkCarbonFiberJunctionWidth -fgkCarbonFiberLowerSupportWidth), 0.5*(fgkSSDLay5LadderLength -fgkSSDLay5SensorsNumber*fgkCarbonFiberJunctionWidth +fgkCarbonFiberLowerSupportWidth)}; const Double_t AliITSv11GeometrySSD::fgkEndLadderCarbonFiberUpperJunctionLength[2] = {fgkEndLadderCarbonFiberLowerJunctionLength[0]-20.4, fgkEndLadderCarbonFiberLowerJunctionLength[1]-20.6}; const Double_t AliITSv11GeometrySSD::fgkEndLadderMountingBlockPosition[2] = {fgkEndLadderCarbonFiberLowerJunctionLength[0]-16.50, fgkEndLadderCarbonFiberLowerJunctionLength[1]-31.50}; ///////////////////////////////////////////////////////////////////////////////// // Cooling Tube Support (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportRmax = 1.45; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportRmin = fgkSSDCoolingBlockHoleRadius[0]; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportLength = 8.55; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportHeight = 0.85; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportWidth = 2.00; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportSeparation = fgkSSDSensorLength-2.*fgkSSDSensorOverlap; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSupportToCarbonFiber = 11.70; ///////////////////////////////////////////////////////////////////////////////// // Cooling Tube (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkCoolingTubeRmax = fgkCoolingTubeSupportRmin; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeRmin = 0.96; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeLength = fgkCarbonFiberJunctionWidth; const Double_t AliITSv11GeometrySSD::fgkCoolingTubeSeparation = fgkSSDModuleSensorSupportDistance+fgkSSDCoolingBlockLength; //const Double_t AliITSv11GeometrySSD_ct::fgkCoolingTubeLength = 39.1; ///////////////////////////////////////////////////////////////////////////////// // SSD Mounting Block Parameters (lengths are in mm and angles in degrees) ///////////////////////////////////////////////////////////////////////////////// const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockLength[3] = { 60.0, 42.2, 34.0}; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHeight[4] = { 4.0, 8.0, 5.0, 0.2}; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockWidth = 20.0; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTrapezoidAngle = 40.0; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTrapezoidHeight = 0.30*(fgkSSDMountingBlockHeight[1]-fgkSSDMountingBlockHeight[2]); const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTrapezoidUpBasis = 2.5; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTubeLength[2] = { 56.0, 12.0}; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleTubeWidth[2] = { 5.0, 2.9}; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockHoleRadius = 1.0; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleEdge = 6.0; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleHeigth = 4.0; const Double_t AliITSv11GeometrySSD::fgkSSDMountingBlockScrewHoleRadius[2] = { 1.5,fgkSSDMountingBlockScrewHoleEdge/6.}; ///////////////////////////////////////////////////////////////////////////////// AliITSv11GeometrySSD::AliITSv11GeometrySSD(){ ///////////////////////////////// // Standard Default Constructor ///////////////////////////////// // Initializing display colors ////////////////////////////// fColorCarbonFiber = 4; fColorRyton = 5; fColorPhynox = 5; fColorSilicon = 3; fColorAl = 7; fColorKapton = 6; fColorPolyhamide = 5; fColorStiffener = 9; fColorEpoxy = 30; CreateMaterials(); } ///////////////////////////////////////////////////////////////////////////////// // Setting the transformation Matrices ///////////////////////////////////////////////////////////////////////////////// void AliITSv11GeometrySSD::SetSSDSensorSupportCombiTransMatrix(){ //////////////////////////////////////////////////////// //Translation Parameters SSDSensorSupportAssembly: //////////////////////////////////////////////////////// const Double_t SSDSensorSupportTransX[3] = {-0.5*fgkSSDSensorSideSupportWidth, 0.5*fgkSSDSensorSideSupportWidth, 0.5*fgkSSDSensorCenterSupportThickness[0] - fgkSSDSensorCenterSupportPosition}; const Double_t SSDSensorSupportTransY[3] = {0.5*fgkSSDSensorSideSupportThickness[0], -0.5*fgkSSDSensorSideSupportThickness[0] -fgkSSDModuleSensorSupportDistance, 0.5*fgkSSDSensorCenterSupportWidth -0.5*fgkSSDModuleSensorSupportDistance}; const Double_t SSDSensorSupportTransZ[3] = {0.,0., fgkSSDSensorCenterSupportThickness[0]}; //////////////////////////////////////////////////////// //Rotational Parameters SSDSensorSupportAssembly: //////////////////////////////////////////////////////// const Double_t SSDSensorSupportRotPhi[3] = { 0., 180., 270.}; const Double_t SSDSensorSupportRotTheta[3] = { 90., 90., 90.}; const Double_t SSDSensorSupportRotPsi[3] = {- 90.,- 90.,- 90.}; //////////////////////////////////////////////////////////////// //Name of CombiTrans Transformation of SSDSensorSupportAssembly: //////////////////////////////////////////////////////////////// char SSDSensorSupportCombiTransName[40]; char SSDSensorSupportRotName[40]; TGeoCombiTrans *SSDSensorSupportLocalMatrix[fgkSSDSensorSupportCombiTransNumber]; for(Int_t i=0; iSetRotation((*LocalLadderCableRot[1]) * (*LocalLadderCableRot[0])); //////////////////////////////////////////// // LocalLadderCableCombiTransMatrix //////////////////////////////////////////// const Int_t LocalLadderSideCablesNumber = 2; const Int_t LocalLadderCombiTransNumber = 5; TGeoCombiTrans** LocalLadderCableCombiTransMatrix[LocalLadderSideCablesNumber]; for(Int_t i=0; iMultiplyLeft( LocalLadderCableCombiTransMatrix[i][LocalLadderCombiTransNumber-j-1]); } LadderCableRot = new TGeoRotation(); LadderCableRot->SetMatrix(LocalLadderCableHMatrix[i]->GetRotationMatrix()); LadderCableTrans = new TGeoTranslation(); Double_t* LadderCableTransVector = LocalLadderCableHMatrix[i]->GetTranslation(); LadderCableTrans->SetTranslation(LadderCableTransVector[0], LadderCableTransVector[1] + (i==0 ? BeamAxisTrans[0] : 0.) * fgkCarbonFiberJunctionWidth, LadderCableTransVector[2]); LadderCableCombiTransMatrix[i] = new TGeoCombiTrans(*LadderCableTrans, *LadderCableRot); } LadderCableCombiTransMatrix[2] = AddTranslationToCombiTrans(LadderCableCombiTransMatrix[1],0., BeamAxisTrans[1]*fgkCarbonFiberJunctionWidth,0.); LadderCableCombiTransMatrix[3] = AddTranslationToCombiTrans(LadderCableCombiTransMatrix[0],0., BeamAxisTrans[2]*fgkCarbonFiberJunctionWidth,0.); } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupportShape(Double_t length, Double_t height,Double_t width,Double_t* thickness){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 4; const Int_t ShapesNumber = 2; Double_t Width[2] = {width,width}; TVector3** VertexPosition[ShapesNumber]; for(Int_t i = 0; iX()); char* SSDSensorSupportShapeName[ShapesNumber] = {"SSDSensorSupportShape1","SSDSensorSupportShape2"}; TGeoArb8* SSDSensorSupportShape[ShapesNumber]; for(Int_t i = 0; i< ShapesNumber; i++) SSDSensorSupportShape[i] = GetArbShape(VertexPosition[i],Width,i==0 ? thickness[1]: thickness[0], SSDSensorSupportShapeName[i]); ///////////////////////////////////// //Setting Translations and Rotations: ///////////////////////////////////// TGeoRotation* SSDSensorSupportShapeRot[2]; SSDSensorSupportShapeRot[0] = new TGeoRotation("SSDSensorSupportShapeRot1",180.,0.,0.); SSDSensorSupportShapeRot[1] = new TGeoRotation("SSDSensorSupportShapeRot2",90.,90.,-90.); TGeoTranslation* SSDSensorSupportShapeTrans = new TGeoTranslation("SSDSensorSupportShapeTrans",0.,0., 0.5*thickness[0]); TGeoCombiTrans* SSDSensorSupportCombiTrans = new TGeoCombiTrans("SSDSensorSupportCombiTrans",0.5*thickness[0],width,0., new TGeoRotation((*SSDSensorSupportShapeRot[1]) * (*SSDSensorSupportShapeRot[0]))); TGeoVolume* SSDSensorSupportCompVolume = new TGeoVolumeAssembly("SSDSensorSupportCompVolume"); SSDSensorSupportCompVolume->AddNode(new TGeoVolume("SSDSensorSupportVolume1", SSDSensorSupportShape[0],fgkSSDSensorSupportMedium),1, SSDSensorSupportShapeTrans); SSDSensorSupportCompVolume->AddNode(new TGeoVolume("SSDSensorSupportVolume2", SSDSensorSupportShape[1],fgkSSDSensorSupportMedium),1, SSDSensorSupportCombiTrans); return SSDSensorSupportCompVolume; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupport(Int_t VolumeKind, Int_t n){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* SSDSensorSupport; Double_t SideSupportThickness[2] = {fgkSSDSensorSideSupportThickness[0], fgkSSDSensorSideSupportThickness[1]}; VolumeKind == 0 ? SSDSensorSupport = GetSSDSensorSupportShape( fgkSSDSensorSideSupportLength, fgkSSDSensorSideSupportHeight[(n==0 ? 0 : 1)], fgkSSDSensorSideSupportWidth, SideSupportThickness) : SSDSensorSupport = GetSSDSensorSupportShape(fgkSSDSensorCenterSupportLength, fgkSSDSensorCenterSupportHeight[(n==0 ? 0 : 1)], fgkSSDSensorCenterSupportWidth, SideSupportThickness); return SSDSensorSupport; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDSensorSupportAssembly(Int_t n){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* SSDSensorSupportAssembly = new TGeoVolumeAssembly("SSDSensorSupportAssembly"); const Int_t VolumeNumber = 2; TGeoVolume* SSDSensorSupport[VolumeNumber]; for(Int_t i=0; iAddNode((i<2 ? SSDSensorSupport[0]: SSDSensorSupport[1]), i+1,SSDSensorSupportCombiTransMatrix[i]); return SSDSensorSupportAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDModule(Int_t iChipCablesHeight){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* SSDModuleVolume[fgkSSDModuleCombiTransNumber-1]; SSDModuleVolume[0] = GetSSDStiffenerAssembly(); SSDModuleVolume[1] = GetSSDChipAssembly(); SSDModuleVolume[2] = GetSSDSensor(); SSDModuleVolume[3] = GetSSDFlexAssembly(); SSDModuleVolume[4] = GetSSDCoolingBlockAssembly(); SSDModuleVolume[5] = GetSSDChipCablesAssembly(fgkSSDChipCablesHeight[iChipCablesHeight+2]); SetSSDModuleCombiTransMatrix(fgkSSDChipCablesHeight[iChipCablesHeight+2]); TGeoCombiTrans* SSDModuleGlobalCombiTrans = new TGeoCombiTrans("SSDModuleGlobalCombiTrans", fgkSSDModuleStiffenerPosition[0], fgkSSDModuleStiffenerPosition[1],0.,NULL); TGeoHMatrix* SSDModuleHMatrix[fgkSSDModuleCombiTransNumber]; TGeoVolume* SSDModule = new TGeoVolumeAssembly("SSDModule"); for(Int_t i=0; iAddNode(i==fgkSSDModuleCombiTransNumber-1 ? SSDModuleVolume[3] : SSDModuleVolume[i],i!=fgkSSDModuleCombiTransNumber-1?1:2, SSDModuleHMatrix[i]); } return SSDModule; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDSensor(){ //////////////////////////////////////////////////////////////////////////////// Double_t fgkSSDSensorSensitiveLength = fgkSSDSensorLength-2.*fgkSSDSensorInsensitiveLength; Double_t fgkSSDSensorSensitiveWidth = fgkSSDSensorWidth-2.*fgkSSDSensorInsensitiveWidth; TGeoBBox* SSDSensorSensitiveShape = new TGeoBBox("SSDSensorSensitiveShape", 0.5*fgkSSDSensorSensitiveLength, 0.5*fgkSSDSensorSensitiveWidth, 0.5*fgkSSDSensorHeight); TGeoVolume* SSDSensorSensitive = new TGeoVolume(fgkSSDSensitiveVolName,SSDSensorSensitiveShape,fgkSSDSensorMedium); SSDSensorSensitive->SetLineColor(fColorSilicon); TGeoBBox* SSDSensorInsensitiveShape[2]; SSDSensorInsensitiveShape[0] = new TGeoBBox("SSDSensorInSensitiveShape1", 0.5*fgkSSDSensorLength, 0.5*fgkSSDSensorInsensitiveWidth, 0.5*fgkSSDSensorHeight); SSDSensorInsensitiveShape[1] = new TGeoBBox("SSDSensorInSensitiveShape2", 0.5*fgkSSDSensorInsensitiveWidth, 0.5*fgkSSDSensorSensitiveWidth, 0.5*fgkSSDSensorHeight); const char* SSDSensorInsensitiveName[2] = {"SSDSensorInsensitive1", "SSDSensorInsensitive2"}; TGeoVolume* SSDSensorInsensitive[2]; for(Int_t i=0; i<2; i++){ SSDSensorInsensitive[i] = new TGeoVolume(SSDSensorInsensitiveName[i],SSDSensorInsensitiveShape[i], fgkSSDSensorMedium); SSDSensorInsensitive[i]->SetLineColor(fColorCarbonFiber); } TGeoVolume* SSDSensorInsensitiveVol = new TGeoVolumeAssembly("SSDSensorInsensitiveVol"); for(Int_t i=0; i<4; i++) SSDSensorInsensitiveVol->AddNode(i%2==0 ? SSDSensorInsensitive[0]: SSDSensorInsensitive[1],i<2?1:2, new TGeoTranslation(0.5*(1.-TMath::Power(-1.,i))*(i==1? 1.:-1.) * (SSDSensorSensitiveShape->GetDX()+SSDSensorInsensitiveShape[1]->GetDX()), 0.5*(1.+TMath::Power(-1.,i))*(i==0?-1.: 1.) * (SSDSensorSensitiveShape->GetDY()+SSDSensorInsensitiveShape[0]->GetDY()),0.)); TGeoVolume* SSDSensor = new TGeoVolumeAssembly("SSDSensor"); SSDSensor->AddNode(SSDSensorSensitive,1),SSDSensor->AddNode(SSDSensorInsensitiveVol,1); return SSDSensor; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDChipAssembly(){ //////////////////////////////////////////////////////////////////////////////// const Int_t SSDChipRowNumber = 2; TGeoBBox* SSDChipCompShape[2]; SSDChipCompShape[0] = new TGeoBBox("SSDChipCompShape", 0.5*fgkSSDChipLength, 0.5*fgkSSDChipWidth, 0.5*(fgkSSDChipHeight-fgkSSDChipGlueHeight)); SSDChipCompShape[1] = new TGeoBBox("SSDChipGlueCompShape", 0.5*fgkSSDChipLength, 0.5*fgkSSDChipWidth, 0.5*fgkSSDChipGlueHeight); TGeoVolume* SSDChipComp[2]; SSDChipComp[0] = new TGeoVolume("SSDChipComp",SSDChipCompShape[0],fgkSSDChipMedium); SSDChipComp[1] = new TGeoVolume("SSDChipGlueComp",SSDChipCompShape[1], fgkSSDChipGlueMedium); SSDChipComp[0]->SetLineColor(fColorSilicon); SSDChipComp[1]->SetLineColor(fColorEpoxy); TGeoTranslation* SSDChipCompTrans[2]; SSDChipCompTrans[0] = new TGeoTranslation(0.,0.,-SSDChipCompShape[1]->GetDZ()); SSDChipCompTrans[1] = new TGeoTranslation(0.,0.,SSDChipCompShape[0]->GetDZ()); TGeoVolume* SSDChip = new TGeoVolumeAssembly("SSDChip"); for(Int_t i=0; i<2; i++) SSDChip->AddNode(SSDChipComp[i],1,SSDChipCompTrans[i]); Double_t SSDChipSeparation[2] = {fgkSSDChipLength+fgkSSDChipSeparationLength, fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1] - 2.*(fgkSSDStiffenerWidth-fgkSSDStiffenerToChipDist - 0.5*fgkSSDChipWidth)}; TGeoVolume* SSDChipAssembly = new TGeoVolumeAssembly("SSDChipAssembly"); for(Int_t i=0; iAddNode(SSDChip,fgkSSDChipNumber*i+j+1, new TGeoTranslation(j*SSDChipSeparation[0],i*SSDChipSeparation[1],0.)); return SSDChipAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDStiffenerAssembly(){ //////////////////////////////////////////////////////////////////////////////// const Int_t SSDStiffenerNumber = 2; Double_t SSDStiffenerSeparation = fgkSSDSensorLength - 2.*fgkSSDModuleStiffenerPosition[1] - fgkSSDStiffenerWidth; TGeoVolume* SSDStiffener = new TGeoVolumeAssembly("SSDStiffener"); //////////////////////////// // Stiffener Volumes /////////////////////////// const Int_t StiffenerBoxNumber = 6; TGeoBBox* SSDStiffenerBoxShapes[StiffenerBoxNumber]; SSDStiffenerBoxShapes[0] = new TGeoBBox("SSDStiffenerBoxShape1", 0.5* fgkSSDStiffenerLength, 0.5* fgkSSDStiffenerWidth, 0.5*(fgkSSDStiffenerHeight - fgkSSDConnectorHeight)); SSDStiffenerBoxShapes[1] = new TGeoBBox("SSDStiffenerBoxShape2", 0.5*(fgkSSDConnectorPosition[0] - 2.0* fgkSSDConnectorLength - fgkSSDConnectorSeparation), 0.5* fgkSSDStiffenerWidth, 0.5* fgkSSDConnectorHeight); SSDStiffenerBoxShapes[2] = new TGeoBBox("SSDStiffenerBoxShape3", 0.5*(fgkSSDConnectorSeparation + 2.* fgkSSDConnectorLength), 0.5* fgkSSDConnectorPosition[1], 0.5* fgkSSDConnectorHeight); SSDStiffenerBoxShapes[3] = new TGeoBBox("SSDStiffenerBoxShape4", SSDStiffenerBoxShapes[2]->GetDX(), 0.5*(fgkSSDStiffenerWidth - fgkSSDConnectorPosition[1] - fgkSSDConnectorWidth), 0.5* fgkSSDConnectorHeight); SSDStiffenerBoxShapes[4] = new TGeoBBox("SSDStiffenerBoxShape5", 0.5* fgkSSDConnectorSeparation, 0.5* fgkSSDConnectorWidth, 0.5* fgkSSDConnectorHeight); SSDStiffenerBoxShapes[5] = new TGeoBBox("SSDStiffenerBoxShape6", 0.5*(fgkSSDStiffenerLength - fgkSSDConnectorPosition[0]), 0.5* fgkSSDStiffenerWidth, 0.5* fgkSSDConnectorHeight); TGeoVolume* SSDStiffenerBox[StiffenerBoxNumber]; char SSDStiffenerBoxName[30]; for(Int_t i=0; iSetLineColor(fColorStiffener); } //////////////////////////// // Connector /////////////////////////// TGeoBBox* SSDConnectorShape = new TGeoBBox("SSDConnectorShape", 0.5*fgkSSDConnectorLength, 0.5*fgkSSDConnectorWidth, 0.5*fgkSSDConnectorHeight); TGeoVolume* SSDConnector = new TGeoVolume("SSDConnector",SSDConnectorShape, fgkSSDStiffenerConnectorMedium); SSDConnector->SetLineColor(fColorAl); const Int_t SSDConnectorNumber = 2; TGeoTranslation* SSDConnectorTrans[SSDConnectorNumber]; SSDConnectorTrans[0] = new TGeoTranslation("SSDConnectorTrans1", - SSDStiffenerBoxShapes[0]->GetDX()+fgkSSDConnectorPosition[0] - fgkSSDConnectorSeparation-1.5*fgkSSDConnectorLength, SSDStiffenerBoxShapes[0]->GetDY()-fgkSSDConnectorPosition[1] - SSDConnectorShape->GetDY(), SSDStiffenerBoxShapes[0]->GetDZ()+SSDConnectorShape->GetDZ()); SSDConnectorTrans[1] = new TGeoTranslation("SSDConnectorTrans2", - SSDStiffenerBoxShapes[0]->GetDX()+fgkSSDConnectorPosition[0] - 0.5*fgkSSDConnectorLength, SSDStiffenerBoxShapes[0]->GetDY()-fgkSSDConnectorPosition[1] - SSDConnectorShape->GetDY(), SSDStiffenerBoxShapes[0]->GetDZ()+SSDConnectorShape->GetDZ()); for(Int_t i=0; iAddNode(SSDConnector,i+1,SSDConnectorTrans[i]); ////////////////////////////////////// // TGeoTranslation for Stiffener Boxes ////////////////////////////////////// TGeoTranslation* SSDStiffenerBoxTrans[StiffenerBoxNumber]; SSDStiffenerBoxTrans[0] = new TGeoTranslation("SSDStiffenerBoxTrans1",0.,0.,0.); SSDStiffenerBoxTrans[1] = new TGeoTranslation("SSDStiffenerBoxTrans2", - (SSDStiffenerBoxShapes[0]->GetDX()-SSDStiffenerBoxShapes[1]->GetDX()), 0., SSDStiffenerBoxShapes[0]->GetDZ()+SSDStiffenerBoxShapes[1]->GetDZ()); SSDStiffenerBoxTrans[2] = new TGeoTranslation("SSDStiffenerBoxTrans3", - SSDStiffenerBoxShapes[0]->GetDX()-SSDStiffenerBoxShapes[2]->GetDX() + fgkSSDConnectorPosition[0], SSDStiffenerBoxShapes[0]->GetDY()-SSDStiffenerBoxShapes[2]->GetDY(), SSDStiffenerBoxShapes[0]->GetDZ()+SSDStiffenerBoxShapes[2]->GetDZ()); SSDStiffenerBoxTrans[3] = new TGeoTranslation("SSDStiffenerBoxTrans4", - SSDStiffenerBoxShapes[0]->GetDX()-SSDStiffenerBoxShapes[3]->GetDX() + fgkSSDConnectorPosition[0], - SSDStiffenerBoxShapes[0]->GetDY()+SSDStiffenerBoxShapes[3]->GetDY(), SSDStiffenerBoxShapes[0]->GetDZ()+SSDStiffenerBoxShapes[3]->GetDZ()); SSDStiffenerBoxTrans[4] = new TGeoTranslation("SSDStiffenerBoxTrans5", - SSDStiffenerBoxShapes[0]->GetDX()+fgkSSDConnectorPosition[0] - 0.5*fgkSSDConnectorSeparation-2.*SSDConnectorShape->GetDX(), SSDStiffenerBoxShapes[0]->GetDY()-fgkSSDConnectorPosition[1] - SSDConnectorShape->GetDY(), SSDStiffenerBoxShapes[0]->GetDZ()+SSDConnectorShape->GetDZ()); SSDStiffenerBoxTrans[5] = new TGeoTranslation("SSDStiffenerBoxTrans6", - SSDStiffenerBoxShapes[0]->GetDX()+fgkSSDConnectorPosition[0] + SSDStiffenerBoxShapes[5]->GetDX(), 0., SSDStiffenerBoxShapes[0]->GetDZ()+SSDStiffenerBoxShapes[5]->GetDZ()); for(Int_t i=0; iAddNode(SSDStiffenerBox[i],1,SSDStiffenerBoxTrans[i]); TGeoCombiTrans* SSDStiffenerCombiTrans[SSDStiffenerNumber]; char SSDStiffenerCombiTransName[30]; for(Int_t i=0; iSetLineColor(fColorAl); //////////////////////////// // Capacitor 1812-330 nF /////////////////////////// TGeoBBox* Capacitor1812Shape = new TGeoBBox("Capacitor1812Shape", 0.5*fgkSSDCapacitor1812Length, 0.5*fgkSSDCapacitor1812Width, 0.5*fgkSSDCapacitor1812Height); TGeoVolume* Capacitor1812 = new TGeoVolume("Capacitor1812",Capacitor1812Shape, fgkSSDStiffener1812CapacitorMedium); Capacitor1812->SetLineColor(fColorAl); TGeoTranslation* Capacitor1812Trans = new TGeoTranslation("Capacitor1812Trans", 0., 0.5*fgkSSDStiffenerWidth+SSDStiffenerSeparation - Capacitor1812Shape->GetDY()-fgkSSDConnectorPosition[1], SSDStiffenerBoxShapes[0]->GetDZ()+fgkSSDConnectorHeight + 0.5*fgkSSDCapacitor1812Height); //////////////////////////// //Hybrid Wire //////////////////////////// Double_t WireX = 2.*(fgkSSDConnectorPosition[0]-0.5*fgkSSDStiffenerLength - 0.5*fgkSSDConnectorLength)-fgkSSDConnectorLength - fgkSSDConnectorSeparation; Double_t WireY = SSDStiffenerSeparation+fgkSSDStiffenerWidth - 2.*fgkSSDConnectorPosition[1]-fgkSSDConnectorWidth; Double_t SSDWireRadius = TMath::Sqrt(TMath::Power(WireX,2.) + TMath::Power(WireY,2)); Double_t WireAngle = TMath::ATan(WireX/WireY); TGeoTube *HybridWireShape = new TGeoTube("HybridWireShape", 0., fgkSSDWireRadius, 0.5*SSDWireRadius); TGeoVolume* HybridWire = new TGeoVolume("HybridWire",HybridWireShape, fgkSSDStiffenerHybridWireMedium); HybridWire->SetLineColor(fColorPhynox); TGeoCombiTrans* HybridWireCombiTrans[2]; HybridWireCombiTrans[0] = new TGeoCombiTrans("HybridWireCombiTrans1", 0.5*fgkSSDStiffenerLength-fgkSSDConnectorPosition[0] + 1.5*fgkSSDConnectorLength+fgkSSDConnectorSeparation, 0.5*SSDWireRadius-0.5*fgkSSDStiffenerWidth + fgkSSDConnectorPosition[1]+0.5*fgkSSDConnectorWidth, SSDStiffenerBoxShapes[0]->GetDZ()+fgkSSDConnectorHeight + fgkSSDWireRadius, new TGeoRotation("HybridWireRot1",0.,90.,0.)); HybridWireCombiTrans[1] = new TGeoCombiTrans("HybridWireCombiTrans2", 0., - 0.5*fgkSSDConnectorWidth+fgkSSDWireRadius, 0., new TGeoRotation("HybridWireRot2", - WireAngle*TMath::RadToDeg(),0.,0.)); TGeoHMatrix* HybridWireMatrix = new TGeoHMatrix(); HybridWireMatrix->MultiplyLeft(HybridWireCombiTrans[0]); HybridWireMatrix->MultiplyLeft(HybridWireCombiTrans[1]); //////////////////////////// // Stiffener Assembly /////////////////////////// TGeoVolume* SSDStiffenerAssembly = new TGeoVolumeAssembly("SSDStiffenerAssembly"); SSDStiffenerAssembly->AddNode(HybridWire,1,HybridWireMatrix); for(Int_t i=0; iAddNode(SSDStiffener,i+1,SSDStiffenerCombiTrans[i]); for(Int_t j=1; jAddNode(Capacitor0603,Capacitor0603Number*i+j,new TGeoTranslation("",(j-3. )/6*fgkSSDStiffenerLength, i*SSDStiffenerSeparation+ 0.5*((i==0? 1:-1)*fgkSSDStiffenerWidth +(i==0? -1:+1)*fgkSSDCapacitor0603Width), -0.5*(fgkSSDStiffenerHeight+fgkSSDCapacitor0603Height))); } if(i==1) SSDStiffenerAssembly->AddNode(Capacitor1812,1,Capacitor1812Trans); } return SSDStiffenerAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDChipCables(Double_t SSDChipCablesHeigth, char* side){ //////////////////////////////////////////////////////////////////////////////// const Int_t SSDChipCablesLayNumber = 2; Int_t SSDChipCablesColor[2] = {fColorAl,fColorPolyhamide}; Double_t SSDChipCablesRadius[2]; SSDChipCablesRadius[0] = 0.25*(SSDChipCablesHeigth - fgkSSDChipCablesHeight[0] - fgkSSDChipCablesHeight[1]); SSDChipCablesRadius[1] = SSDChipCablesRadius[0]-fgkSSDChipCablesHeight[0]; Double_t SSDChipCablesPieceLength = 0.5*(fgkSSDChipCablesWidth[0] - 2.*TMath::Pi()*SSDChipCablesRadius[0] - SSDChipCablesRadius[0] - fgkSSDChipCablesWidth[1] - fgkSSDChipCablesWidth[2] - (side=="Right" ? 0 : fgkSSDModuleStiffenerPosition[1] + TMath::Pi()*(0.5*fgkSSDSensorHeight + fgkSSDChipCablesHeight[0] + fgkSSDChipCablesHeight[1]))); ////////////////////////// //Box and Tube Seg Shapes ////////////////////////// char* SSDChipCablesBoxShapeName[2*SSDChipCablesLayNumber] = {"SSDChipCablesBoxLay0Shape0","SSDChipCablesBoxLay0Shape1", "SSDChipCablesBoxLay1Shape0","SSDChipCablesBoxLay1Shape1"}; char* SSDChipCablesTubeSegShapeName[2*SSDChipCablesLayNumber] = {"SSDChipCablesTubeSegLay0Shape0","SSDChipCablesTubeSegLay0Shape1", "SSDChipCablesTubeSegLay1Shape0","SSDChipCablesTubeSegLay1Shape1"}; TGeoBBox** SSDChipCablesBoxShape[SSDChipCablesLayNumber]; TGeoTubeSeg** SSDChipCablesTubeSegShape[SSDChipCablesLayNumber]; for(Int_t i=0; iSetLineColor(SSDChipCablesColor[i]); SSDUnderChipCablesBoxTrans[i] = new TGeoTranslation(SSDUnderChipCablesBoxTransName, (side=="Right"?-1.:1.)*0.5*fgkSSDChipWidth, 0.5*(fgkSSDChipCablesLength[0]-fgkSSDChipCablesLength[1]) +0.5*fgkSSDChipCablesLength[1], (i==0?1.:-1.)*0.5*fgkSSDChipCablesHeight[1-i]); } ////////////////// //Trapezoid Shapes ////////////////// const Int_t SSDChipCablesVertexNumber = 2; const Int_t SSDChipCablesTrapezoidNumber = 2; TVector3** SSDChipCablesTrapezoidVertex[SSDChipCablesVertexNumber]; for(Int_t i = 0; i< SSDChipCablesTrapezoidNumber; i++) SSDChipCablesTrapezoidVertex[i] = new TVector3*[SSDChipCablesVertexNumber]; //First Shape Vertex Positioning SSDChipCablesTrapezoidVertex[0][0] = new TVector3(); SSDChipCablesTrapezoidVertex[0][1] = new TVector3(0.5*(fgkSSDChipCablesLength[0]-fgkSSDChipCablesLength[1])); //Second Shape Vertex Positioning SSDChipCablesTrapezoidVertex[1][0] = new TVector3(*SSDChipCablesTrapezoidVertex[0][0]); SSDChipCablesTrapezoidVertex[1][1] = new TVector3(*SSDChipCablesTrapezoidVertex[0][1]); //Setting the names of shapes and volumes char* SSDChipCablesTrapezoidBoxShapeName[SSDChipCablesTrapezoidNumber] = {"SSDChipCablesTrapezoidBoxShape1","SSDChipCablesTrapezoidBoxShape2"}; char* SSDChipCablesTrapezoidShapeName[SSDChipCablesTrapezoidNumber] = {"SSDChipCablesTrapezoidShape1","SSDChipCablesTrapezoidShape2"}; char* SSDChipCablesTrapezoidBoxName[SSDChipCablesTrapezoidNumber] = {"SSDChipCablesTrapezoidBox1","SSDChipCablesTrapezoidBox2"}; char* SSDChipCablesTrapezoidName[SSDChipCablesTrapezoidNumber] = {"SSDChipCablesTrapezoid1","SSDChipCablesTrapezoid2"}; char* SSDChipCablesTrapezoidAssemblyName[SSDChipCablesTrapezoidNumber] = {"SSDChipCablesTrapezoidAssembly1","SSDChipCablesTrapezoidAssembly2"}; //Setting the Shapes TGeoBBox* SSDChipCablesTrapezoidBoxShape[SSDChipCablesTrapezoidNumber]; TGeoArb8* SSDChipCablesTrapezoidShape[SSDChipCablesTrapezoidNumber]; //Setting the Volumes TGeoVolume* SSDChipCablesTrapezoidBox[SSDChipCablesTrapezoidNumber]; TGeoVolume* SSDChipCablesTrapezoid[SSDChipCablesTrapezoidNumber]; TGeoVolume* SSDChipCablesTrapezoidAssembly[SSDChipCablesTrapezoidNumber]; Double_t SSDChipCablesTrapezoidWidth[SSDChipCablesVertexNumber] = {fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2],fgkSSDChipCablesWidth[1]}; for(Int_t i=0; iSetLineColor(SSDChipCablesColor[i]); SSDChipCablesTrapezoid[i]->SetLineColor(SSDChipCablesColor[i]); SSDChipCablesTrapezoidAssembly[i] = new TGeoVolumeAssembly(SSDChipCablesTrapezoidAssemblyName[i]); SSDChipCablesTrapezoidAssembly[i]->AddNode(SSDChipCablesTrapezoidBox[i],1, new TGeoTranslation(0.5*fgkSSDChipCablesLength[1], 0.5*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2]),0.)); SSDChipCablesTrapezoidAssembly[i]->AddNode(SSDChipCablesTrapezoid[i],0, new TGeoCombiTrans(0.,0.,0.,new TGeoRotation("",90.,180.,-90.))); SSDChipCablesTrapezoidAssembly[i]->AddNode(SSDChipCablesTrapezoid[i],1, new TGeoTranslation(fgkSSDChipCablesLength[1],0.,0.)); } ///////////////////////////// //Box and Tube Seg CombiTrans ///////////////////////////// TGeoTranslation* SSDChipCablesBoxTrans[2*SSDChipCablesLayNumber]; SSDChipCablesBoxTrans[0] = new TGeoTranslation("SSDChipCablesLay1Box1Trans",0.,0.,0.); SSDChipCablesBoxTrans[1] = new TGeoTranslation("SSDChipCablesLay1Box2Trans", SSDChipCablesBoxShape[0][1]->GetDX() - 0.5*SSDChipCablesPieceLength, 0.0, - 2.*SSDChipCablesRadius[0] - fgkSSDChipCablesHeight[0]); SSDChipCablesBoxTrans[2] = new TGeoTranslation("SSDChipCablesLay2Box1Trans", 0.0, 0.0, 0.5*(fgkSSDChipCablesHeight[0] + fgkSSDChipCablesHeight[1])); SSDChipCablesBoxTrans[3] = new TGeoTranslation("SSDChipCablesLay2Box2Trans", SSDChipCablesBoxShape[1][1]->GetDX() - 0.5*SSDChipCablesPieceLength, 0.0, - 2.*SSDChipCablesRadius[0] - 0.5*fgkSSDChipCablesHeight[1] - 1.5*fgkSSDChipCablesHeight[0]); TGeoRotation* SSDChipCablesRot[3]; SSDChipCablesRot[0] = new TGeoRotation("SSDChipCablesRot1",0.,90.,0.); SSDChipCablesRot[1] = new TGeoRotation("SSDChipCablesRot2",90.,90.,-90.); SSDChipCablesRot[2] = new TGeoRotation("SSDChipCablesRot3",90.,-90.,-90.); TGeoCombiTrans* SSDChipCablesTubeSegCombiTrans[2*(SSDChipCablesLayNumber+ (side=="Right" ? 0 : 1))]; SSDChipCablesTubeSegCombiTrans[0] = new TGeoCombiTrans("SSDChipCablesLay1TubeSeg1CombiTrans", 0.5*SSDChipCablesPieceLength, 0.0, SSDChipCablesRadius[0] - 0.5*fgkSSDChipCablesHeight[0], new TGeoRotation((*SSDChipCablesRot[1])*(*SSDChipCablesRot[0]))); SSDChipCablesTubeSegCombiTrans[1] = new TGeoCombiTrans("SSDChipCablesLay1TubeSeg2CombiTrans", - 0.5*SSDChipCablesPieceLength, 0.0, - SSDChipCablesRadius[0]-0.5*fgkSSDChipCablesHeight[0], new TGeoRotation((*SSDChipCablesRot[2])*(*SSDChipCablesRot[0]))); SSDChipCablesTubeSegCombiTrans[2] = new TGeoCombiTrans("SSDChipCablesLay2TubeSeg1CombiTrans", 0.5*SSDChipCablesPieceLength, 0.0, SSDChipCablesRadius[0]-0.5*fgkSSDChipCablesHeight[0], new TGeoRotation((*SSDChipCablesRot[1])*(*SSDChipCablesRot[0]))); SSDChipCablesTubeSegCombiTrans[3] = new TGeoCombiTrans("SSDChipCablesLay2TubeSeg2CombiTrans", - 0.5*SSDChipCablesPieceLength, 0.0, - SSDChipCablesRadius[0]+0.5*fgkSSDChipCablesHeight[0] - fgkSSDChipCablesHeight[0], new TGeoRotation((*SSDChipCablesRot[2])*(*SSDChipCablesRot[0]))); SSDChipCablesTubeSegCombiTrans[4] = new TGeoCombiTrans("SSDChipCablesLay1TubeSeg4CombiTrans", 0.5*SSDChipCablesPieceLength+SSDChipCablesRadius[0] + fgkSSDModuleStiffenerPosition[1], 0.0, - 2.*SSDChipCablesRadius[0]-0.5*fgkSSDChipCablesHeight[0] - (0.5*fgkSSDSensorHeight+fgkSSDChipCablesHeight[0] + fgkSSDChipCablesHeight[1]), new TGeoRotation((*SSDChipCablesRot[1])*(*SSDChipCablesRot[0]))); SSDChipCablesTubeSegCombiTrans[5] = new TGeoCombiTrans("SSDChipCablesLay2TubeSeg5CombiTrans", 0.5*SSDChipCablesPieceLength+SSDChipCablesRadius[0] + fgkSSDModuleStiffenerPosition[1], 0.0, - 2.*SSDChipCablesRadius[0]-0.5*fgkSSDChipCablesHeight[0] - (0.5*fgkSSDSensorHeight+fgkSSDChipCablesHeight[0] + fgkSSDChipCablesHeight[1]), new TGeoRotation((*SSDChipCablesRot[1])*(*SSDChipCablesRot[0]))); TGeoCombiTrans* SSDChipCablesTrapezoidCombiTrans[SSDChipCablesLayNumber]; SSDChipCablesTrapezoidCombiTrans[0] = (side=="Right" ? new TGeoCombiTrans("SSDChipCableLay1TrapezoidRightCombiTrans", 0.5*SSDChipCablesPieceLength+SSDChipCablesTrapezoidWidth[0] + SSDChipCablesRadius[0], - 0.5*fgkSSDChipCablesLength[1], - fgkSSDChipCablesHeight[0]-2.*SSDChipCablesRadius[0], new TGeoRotation("",90.,0.,0.)) : new TGeoCombiTrans("SSDChipCableLay1TrapezoidLeftCombiTrans", - 2.*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2]) + 0.5*SSDChipCablesPieceLength+SSDChipCablesTrapezoidWidth[0] + SSDChipCablesRadius[0]+fgkSSDModuleStiffenerPosition[1], 0.5*fgkSSDChipCablesLength[1], - 2.*(fgkSSDChipCablesHeight[0]+fgkSSDChipCablesHeight[1]) - 2.*SSDChipCablesRadius[0]-fgkSSDSensorHeight, new TGeoRotation("",-90.,0.,0.))); SSDChipCablesTrapezoidCombiTrans[1] = (side=="Right" ? new TGeoCombiTrans("SSDChipCableLay2TrapezoidRightCombiTrans", 0.5*SSDChipCablesPieceLength+SSDChipCablesTrapezoidWidth[0] + SSDChipCablesRadius[0], - 0.5*fgkSSDChipCablesLength[1], - 0.5*(fgkSSDChipCablesHeight[0]+fgkSSDChipCablesHeight[1]) - fgkSSDChipCablesHeight[0]-2.*SSDChipCablesRadius[0], new TGeoRotation("",90.,0.,0.)) : new TGeoCombiTrans("SSDChipCableLay2TrapezoidLeftCombiTrans", - 2.*(fgkSSDChipCablesWidth[1]+fgkSSDChipCablesWidth[2]) + 0.5*SSDChipCablesPieceLength+SSDChipCablesTrapezoidWidth[0] + SSDChipCablesRadius[0]+fgkSSDModuleStiffenerPosition[1], 0.5*fgkSSDChipCablesLength[1],-0.5*(fgkSSDChipCablesHeight[0] + fgkSSDChipCablesHeight[1])-fgkSSDChipCablesHeight[1] - fgkSSDChipCablesHeight[0]-2.*SSDChipCablesRadius[0] - fgkSSDSensorHeight,new TGeoRotation("",-90.,0.,0.))); ////////////////////////// //Box and Tube Seg Volumes ////////////////////////// char* SSDChipCablesBoxName[2*SSDChipCablesLayNumber] = {"SSDChipCablesLay1Box1","SSDChipCablesLay1Box2", "SSDChipCablesLay2Box1","SSDChipCablesLay2Box2"}; char* SSDChipRightCablesTubeSegName[2*SSDChipCablesLayNumber] = {"SSDChipRightCablesLay1TubeSeg1","SSDChipRightCablesLay1TubeSeg2", "SSDChipRightCablesLay2TubeSeg1","SSDChipRightCablesLay2TubeSeg2"}; char* SSDChipLeftCablesTubeSegName[2*SSDChipCablesLayNumber] = {"SSDChipLeftCablesLay1TubeSeg1","SSDChipLeftCablesLay1TubeSeg2", "SSDChipLeftCablesLay2TubeSeg1","SSDChipLeftCablesLay2TubeSeg2"}; char* SSDChipCablesLayAssemblyName[SSDChipCablesLayNumber] = {"SSDChipCablesLay1","SSDChipCablesLay2"}; TGeoVolume** SSDChipCablesBox[SSDChipCablesLayNumber]; TGeoVolume** SSDChipCablesTubeSeg[SSDChipCablesLayNumber]; TGeoVolume* SSDChipCablesLayAssembly[SSDChipCablesLayNumber]; for(Int_t i=0; iSetLineColor(SSDChipCablesColor[i]); SSDChipCablesBox[i][1]->SetLineColor(SSDChipCablesColor[i]); SSDChipCablesTubeSeg[i][0]->SetLineColor(SSDChipCablesColor[i]); SSDChipCablesTubeSeg[i][1]->SetLineColor(SSDChipCablesColor[i]); SSDChipCablesLayAssembly[i] = new TGeoVolumeAssembly(SSDChipCablesLayAssemblyName[i]); SSDChipCablesLayAssembly[i]->AddNode(SSDChipCablesBox[i][0],1, SSDChipCablesBoxTrans[2*i]); SSDChipCablesLayAssembly[i]->AddNode(SSDChipCablesBox[i][1],1, SSDChipCablesBoxTrans[2*i+1]); SSDChipCablesLayAssembly[i]->AddNode(SSDChipCablesTubeSeg[i][0],1, SSDChipCablesTubeSegCombiTrans[2*i]); SSDChipCablesLayAssembly[i]->AddNode(SSDChipCablesTubeSeg[i][1],1, SSDChipCablesTubeSegCombiTrans[2*i+1]); if(side!="Right"){ SSDChipCablesTubeSeg[i][2] = new TGeoVolume(SSDChipLeftCablesTubeSegName[2*i], SSDChipCablesTubeSegShape[i][2], SSDChipCablesLayMed); SSDChipCablesTubeSeg[i][2]->SetLineColor(SSDChipCablesColor[i]); SSDChipCablesLayAssembly[i]->AddNode(SSDChipCablesTubeSeg[i][2],1, SSDChipCablesTubeSegCombiTrans[4+i]); } SSDChipCablesLayAssembly[i]->AddNode(SSDChipCablesTrapezoidAssembly[i],1, SSDChipCablesTrapezoidCombiTrans[i]); } TGeoCombiTrans* SSDChipCablesCombiTrans[SSDChipCablesLayNumber]; SSDChipCablesCombiTrans[0] = new TGeoCombiTrans("SSDChipCablesCombiTrans1", (side=="Right" ? -1 : 1)*0.5*SSDChipCablesPieceLength, 0.5*fgkSSDChipCablesLength[0], - (2.*SSDChipCablesRadius[0]-fgkSSDChipCablesHeight[0] - 0.5*fgkSSDChipCablesHeight[1]), new TGeoRotation("",(side=="Right" ? 0 : 1)*180.,0.,0.)); SSDChipCablesCombiTrans[1] = new TGeoCombiTrans("SSDChipCablesCombiTrans2", (side=="Right" ? -1 : 1)*0.5*SSDChipCablesPieceLength, 0.5*fgkSSDChipCablesLength[0], - (2.*SSDChipCablesRadius[0]-fgkSSDChipCablesHeight[0] - 0.5*fgkSSDChipCablesHeight[1]), new TGeoRotation("",(side=="Right" ? 0 : 1)*180.,0.,0.)); TGeoVolume* SSDChipCablesAssembly = new TGeoVolumeAssembly("SSDChipCables"); for(Int_t i=0; iAddNode(SSDChipCablesLayAssembly[i],1, SSDChipCablesCombiTrans[i]); SSDChipCablesAssembly->AddNode(SSDUnderChipCablesBox[i],1,SSDUnderChipCablesBoxTrans[i]); } return SSDChipCablesAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDChipCablesAssembly(Double_t SSDChipCablesHeigth){ //////////////////////////////////////////////////////////////////////////////// const Int_t ChipCablesNumber = 2; Double_t ChipCablesTransVector = fgkSSDSensorLength - 2.*fgkSSDModuleStiffenerPosition[1] - 2.*(fgkSSDStiffenerWidth - fgkSSDStiffenerToChipDist-fgkSSDChipWidth); char* SSDChipCablesName[ChipCablesNumber] = {"Right","Left"}; TGeoVolume* SSDChipCables[ChipCablesNumber]; TGeoVolume* SSDChipCablesAssembly = new TGeoVolumeAssembly("SSDChipCablesAssembly"); for(Int_t i=0; iAddNode(SSDChipCables[i],fgkSSDChipNumber*i+j+1, new TGeoTranslation(-(SSDChipCablesName[i]=="Left" ? 1. : 0.) * ChipCablesTransVector,(j-0.5)*fgkSSDChipCablesLength[0] + 0.5*fgkSSDChipCablesLength[1],0.)); return SSDChipCablesAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDFlex(Double_t SSDFlexRadius, Double_t SSDFlexHeigth){ //////////////////////////////////////////////////////////////////////////////// const Int_t SSDFlexVolumeNumber = 3; TGeoVolume* SSDFlexVolume[SSDFlexVolumeNumber]; //////////////////////// // Setting Display Color //////////////////////// Int_t SSDFlexColor; SSDFlexColor = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fColorAl: fColorPolyhamide); TGeoMedium* SSDFlexMed = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fgkSSDAlTraceFlexMedium : fgkSSDKaptonFlexMedium); //////////////////////// // SSDFlexTrapezoidShape //////////////////////// const Int_t SSDFlexVertexNumber = 2; Double_t SSDFlexWidth[SSDFlexVertexNumber] = {fgkSSDFlexWidth[1], fgkSSDFlexWidth[0]}; TVector3* SSDFlexVertex[SSDFlexVertexNumber]; SSDFlexVertex[0] = new TVector3(); SSDFlexVertex[1] = new TVector3(fgkSSDFlexLength[0]-fgkSSDFlexLength[1]); TGeoArb8* SSDFlexTrapezoidShape = GetTrapezoidShape(SSDFlexVertex, SSDFlexWidth,SSDFlexHeigth, "SSDFlexTrapezoidShape"); SSDFlexVolume[0] = new TGeoVolume("SSDFlexTrapezoid",SSDFlexTrapezoidShape,SSDFlexMed); SSDFlexVolume[0]->SetLineColor(SSDFlexColor); ///////////////////////// //SSDFlexTubeSeg Assembly ///////////////////////// const Int_t SSDFlexTubeSegNumber = 2; TGeoTubeSeg* SSDFlexTubeSegShape[SSDFlexTubeSegNumber]; Double_t SSDFlexRadiusMax = (fgkSSDFlexLength[3]-fgkSSDFlexLength[2]) / TMath::Tan(fgkSSDFlexAngle*TMath::DegToRad()); SSDFlexTubeSegShape[0] = new TGeoTubeSeg("SSDFlexTubeSegShape1", SSDFlexRadius,SSDFlexRadius+SSDFlexHeigth, 0.5*fgkSSDFlexWidth[0],0.,180.); SSDFlexTubeSegShape[1] = new TGeoTubeSeg("SSDFlexTubeSegShape2", SSDFlexRadiusMax-SSDFlexRadius-SSDFlexHeigth, SSDFlexRadiusMax-SSDFlexRadius,0.5*fgkSSDFlexWidth[0], 0.,2.*fgkSSDFlexAngle); TGeoRotation** SSDFlexTubSegRot[SSDFlexTubeSegNumber]; for(Int_t i = 0; iSetLineColor(SSDFlexColor); SSDFlexVolume[1]->AddNode(SSDFlexTubeSeg[i],1,SSDFlexTubeSegCombiTrans[i]); } /////////// //Box Shape /////////// const Int_t SSDFlexBoxNumber = 7; Double_t SSDFlexBoxLength[SSDFlexBoxNumber]; SSDFlexBoxLength[0] = 0.5*(fgkSSDChipNumber * fgkSSDChipLength+(fgkSSDChipNumber-1) * fgkSSDChipSeparationLength - fgkSSDModuleSensorSupportDistance-fgkSSDFlexHoleLength) - (fgkSSDFlexLength[0]-fgkSSDFlexLength[1]); SSDFlexBoxLength[1] = fgkSSDModuleSensorSupportDistance+fgkSSDFlexHoleLength; SSDFlexBoxLength[2] = 0.5*(fgkSSDModuleSensorSupportDistance - fgkSSDFlexHoleLength-fgkSSDFlexHoleWidth); SSDFlexBoxLength[3] = fgkSSDFlexHoleWidth; SSDFlexBoxLength[4] = fgkSSDFlexLength[1]-SSDFlexBoxLength[0] - SSDFlexBoxLength[1]; SSDFlexBoxLength[5] = fgkSSDFlexLength[2]; SSDFlexBoxLength[6] = fgkSSDFlexFullLength-2.*fgkSSDFlexAngle * TMath::DegToRad()*SSDFlexRadiusMax - fgkSSDFlexLength[2]-TMath::Pi() * fgkSSDStiffenerHeight-fgkSSDFlexLength[0]; Double_t SSDFlexBoxWidth[SSDFlexBoxNumber]; SSDFlexBoxWidth[0] = fgkSSDFlexWidth[0]; SSDFlexBoxWidth[1] = fgkSSDFlexWidth[0]-fgkSSDFlexHoleWidth; SSDFlexBoxWidth[2] = fgkSSDFlexHoleWidth; SSDFlexBoxWidth[3] = SSDFlexBoxWidth[2]-fgkSSDFlexHoleLength; SSDFlexBoxWidth[4] = fgkSSDFlexWidth[0]; SSDFlexBoxWidth[5] = fgkSSDFlexWidth[0]; SSDFlexBoxWidth[6] = fgkSSDFlexWidth[0]; TGeoBBox* SSDFlexBoxShape[SSDFlexBoxNumber+1]; for(Int_t i=0; iX()+0.5*SSDFlexBoxLength[0], 0.5*fgkSSDFlexWidth[0],0.,0); SSDFlexBoxCombiTrans[1] = new TGeoCombiTrans("SSDFlexBoxCombiTrans1", SSDFlexVertex[1]->X()+SSDFlexBoxLength[0] + 0.5*SSDFlexBoxLength[1], fgkSSDFlexHoleWidth+0.5*SSDFlexBoxWidth[1],0.,0); SSDFlexBoxCombiTrans[2] = new TGeoCombiTrans("SSDFlexBoxCombiTrans2", SSDFlexVertex[1]->X()+SSDFlexBoxLength[0] + fgkSSDFlexHoleLength+0.5*SSDFlexBoxLength[2], 0.5*SSDFlexBoxWidth[2],0.,0); SSDFlexBoxCombiTrans[3] = new TGeoCombiTrans("SSDFlexBoxCombiTrans3", SSDFlexVertex[1]->X()+SSDFlexBoxLength[0] + fgkSSDFlexHoleLength+SSDFlexBoxLength[2] + 0.5*fgkSSDFlexHoleWidth, fgkSSDFlexHoleLength+0.5*SSDFlexBoxWidth[3],0.,0); SSDFlexBoxCombiTrans[4] = new TGeoCombiTrans("SSDFlexBoxCombiTrans4", SSDFlexVertex[1]->X()+SSDFlexBoxLength[0] + SSDFlexBoxLength[1]+0.5*SSDFlexBoxLength[4], 0.5*fgkSSDFlexWidth[0],0.,0); SSDFlexBoxCombiTrans[5] = new TGeoCombiTrans("SSDFlexBoxCombiTrans5", - 0.5*fgkSSDFlexLength[2]+fgkSSDFlexLength[0], 0.5*fgkSSDFlexWidth[0], 2.*SSDFlexRadius+SSDFlexHeigth,0); SSDFlexBoxCombiTrans[6] = new TGeoCombiTrans("SSDFlexBoxCombiTrans6", - SSDFlexBoxShape[6]->GetDX() + SSDFlexBoxShape[6]->GetDX() * TMath::Cos(2.*fgkSSDFlexAngle*TMath::DegToRad()) + fgkSSDFlexLength[0]-fgkSSDFlexLength[2] - (SSDFlexRadiusMax-SSDFlexRadius-0.5*SSDFlexHeigth) * TMath::Cos(fgkSSDFlexAngle*TMath::DegToRad()), 0.5*fgkSSDFlexWidth[0],SSDFlexBoxShape[6]->GetDX() *TMath::Sin(2.*fgkSSDFlexAngle*TMath::DegToRad()) + SSDFlexHeigth+2.*SSDFlexRadius+(SSDFlexRadiusMax - SSDFlexRadius-0.5*SSDFlexHeigth) * TMath::Sin(fgkSSDFlexAngle*TMath::DegToRad()), new TGeoRotation("",90.,2.*fgkSSDFlexAngle,-90.)); SSDFlexBoxCombiTrans[7] = new TGeoCombiTrans("SSDFlexBoxCombiTrans7", SSDFlexVertex[1]->X()+SSDFlexBoxLength[0] + fgkSSDFlexHoleLength+1.5*SSDFlexBoxLength[2] + SSDFlexBoxLength[3], 0.5*SSDFlexBoxWidth[2],0.,0); //////////////////////////// //SSDFlex Box Shape Assembly //////////////////////////// SSDFlexVolume[2] = new TGeoVolumeAssembly("SSDFlexBoxAssembly"); TGeoVolume* SSDFlexBox[SSDFlexBoxNumber+1]; TGeoVolume* SSDEndFlex = GetSSDEndFlex(SSDFlexBoxLength[6],SSDFlexHeigth); TGeoHMatrix* SSDEndFlexHMatrix = new TGeoHMatrix(); TGeoRotation* SSDEndFlexRot= new TGeoRotation("SSDEndFlexRot",180.,0.,0); SSDEndFlexHMatrix->MultiplyLeft(SSDEndFlexRot); SSDEndFlexHMatrix->MultiplyLeft(SSDFlexBoxCombiTrans[6]); char SSDFlexBoxName[30]; for(Int_t i=0; iAddNode(SSDEndFlex,1,SSDEndFlexHMatrix);} else{ SSDFlexBox[i] = new TGeoVolume(SSDFlexBoxName,SSDFlexBoxShape[i], SSDFlexMed); SSDFlexBox[i]->SetLineColor(SSDFlexColor); SSDFlexVolume[2]->AddNode(SSDFlexBox[i],1,SSDFlexBoxCombiTrans[i]);} } ////////////////////// //SSDFlex Construction ////////////////////// TGeoVolume* SSDFlex = new TGeoVolumeAssembly("SSDFlex"); for(Int_t i =0; iAddNode(SSDFlexVolume[i],1); return SSDFlex; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDEndFlex(Double_t SSDEndFlexLength, Double_t SSDFlexHeigth){ ///////////////////////////////////////// // Setting Display Color, Media and Index ///////////////////////////////////////// Int_t SSDFlexColor; SSDFlexColor = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fColorAl: fColorPolyhamide); TGeoMedium* SSDFlexMed = (SSDFlexHeigth == fgkSSDFlexHeight[0] ? fgkSSDAlTraceFlexMedium : fgkSSDKaptonFlexMedium); //////////////////////// const Int_t SSDEndFlexBoxNumber = 5; TGeoBBox* SSDEndFlexBBoxShape[SSDEndFlexBoxNumber]; SSDEndFlexBBoxShape[0] = new TGeoBBox("SSDFlexBoxShape1", 0.5*SSDEndFlexLength,0.5*fgkSSDFlexWidth[0], 0.5*SSDFlexHeigth); SSDEndFlexBBoxShape[1] = new TGeoBBox("SSDFlexBoxShape2", 0.5*fgkSSDEndFlexCompLength[1], 0.5*(fgkSSDEndFlexCompWidth[0]-fgkSSDFlexWidth[0])/2, 0.5*SSDFlexHeigth); SSDEndFlexBBoxShape[2] = new TGeoBBox("SSDFlexBoxShape3", 0.5*fgkSSDEndFlexCompLength[2], 0.5*(fgkSSDEndFlexCompWidth[1]-fgkSSDFlexWidth[0])/2, 0.5*SSDFlexHeigth); SSDEndFlexBBoxShape[3] = new TGeoBBox("SSDFlexBoxShape4", 0.5*fgkSSDEndFlexCompLength[3], 0.5*(fgkSSDEndFlexCompWidth[0]-fgkSSDFlexWidth[0])/2, 0.5*SSDFlexHeigth); SSDEndFlexBBoxShape[4] = new TGeoBBox("SSDFlexBoxShape5", 0.5*(fgkSSDEndFlexCompLength[4]+fgkSSDEndFlexCompLength[5]), 0.25*(fgkSSDEndFlexCompWidth[2]-fgkSSDFlexWidth[0])/2, 0.5*SSDFlexHeigth); TGeoVolume* SSDEndFlexBBox[SSDEndFlexBoxNumber]; char SSDEndFlexBBoxName[30]; for(Int_t i=0; iSetLineColor(SSDFlexColor); } TGeoVolume* SSDEndFlex = new TGeoVolumeAssembly("SSDEndFlex"); Double_t PartialSumLength = 0.; for(Int_t i=0; iAddNode(SSDEndFlexBBox[0],1); SSDEndFlex->AddNode(SSDEndFlexBBox[1],1,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + 0.5*fgkSSDEndFlexCompLength[1], 0.5*fgkSSDFlexWidth[0]+SSDEndFlexBBoxShape[1]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[1],2,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + 0.5*fgkSSDEndFlexCompLength[1], - 0.5*fgkSSDFlexWidth[0]-SSDEndFlexBBoxShape[1]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[2],1,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + fgkSSDEndFlexCompLength[1]+0.5*fgkSSDEndFlexCompLength[2], + 0.5*fgkSSDFlexWidth[0]+SSDEndFlexBBoxShape[2]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[2],2,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + fgkSSDEndFlexCompLength[1]+0.5*fgkSSDEndFlexCompLength[2], - 0.5*fgkSSDFlexWidth[0]-SSDEndFlexBBoxShape[2]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[3],1,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2] + 0.5*fgkSSDEndFlexCompLength[3], + 0.5*fgkSSDFlexWidth[0]+SSDEndFlexBBoxShape[3]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[3],2,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2] + 0.5*fgkSSDEndFlexCompLength[3], - 0.5*fgkSSDFlexWidth[0]-SSDEndFlexBBoxShape[3]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[4],1,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2] + fgkSSDEndFlexCompLength[3]+0.5*(fgkSSDEndFlexCompLength[4]+fgkSSDEndFlexCompLength[5]), + 0.5*fgkSSDFlexWidth[0]+SSDEndFlexBBoxShape[4]->GetDY(), 0.)); SSDEndFlex->AddNode(SSDEndFlexBBox[4],2,new TGeoTranslation( - 0.5*SSDEndFlexLength+ReferenceLength+fgkSSDEndFlexCompLength[0] + fgkSSDEndFlexCompLength[1]+fgkSSDEndFlexCompLength[2] + fgkSSDEndFlexCompLength[3]+0.5*(fgkSSDEndFlexCompLength[4] + fgkSSDEndFlexCompLength[5]), - 0.5*fgkSSDFlexWidth[0]-SSDEndFlexBBoxShape[4]->GetDY(), 0.)); return SSDEndFlex; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDFlexAssembly(){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* SSDFlexAssembly = new TGeoVolumeAssembly("SSDFlexAssembly"); const Int_t SSDFlexLayerNumber = 4; Double_t SSDFlexHeight[SSDFlexLayerNumber]; Double_t SSDFlexRadius[SSDFlexLayerNumber]; TGeoTranslation* SSDFlexTrans[SSDFlexLayerNumber]; for(Int_t i=0; iAddNode(GetSSDFlex(SSDFlexRadius[i],SSDFlexHeight[i]),i+1, SSDFlexTrans[i]); } return SSDFlexAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDCoolingBlockAssembly(){ //////////////////////////////////////////////////////////////////////////////// const Int_t SSDCoolingBlockTransNumber = 2; Double_t SSDCoolingBlockTransVector[SSDCoolingBlockTransNumber] = {fgkSSDModuleSensorSupportDistance+fgkSSDCoolingBlockLength, fgkSSDSensorLength-2.*fgkSSDModuleStiffenerPosition[1] - fgkSSDCoolingBlockWidth}; TGeoVolume* SSDCoolingBlock = GetSSDCoolingBlock(); TGeoVolume* SSDCoolingBlockAssembly = new TGeoVolumeAssembly("SSDCoolingBlockAssembly"); for(Int_t i=0; iAddNode(SSDCoolingBlock, SSDCoolingBlockTransNumber*i+j+1, new TGeoTranslation(i*SSDCoolingBlockTransVector[0], j*SSDCoolingBlockTransVector[1],0.)); return SSDCoolingBlockAssembly; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDCoolingBlock(){ ///////////////////////////////////////////////////////////////////////////////// // Center Cooling Block Hole //////////////////////////// Double_t CoolingBlockHoleAngle = TMath::ACos(0.5*fgkSSDCoolingBlockHoleLength[0] /fgkSSDCoolingBlockHoleRadius[0])*TMath::RadToDeg(); Double_t CoolingBlockHoleWidth = fgkSSDCoolingBlockWidth; /*TGeoTubeSeg* CoolingBlockHoleShape = */ new TGeoTubeSeg("CoolingBlockHoleShape", 0., fgkSSDCoolingBlockHoleRadius[0], 0.5*CoolingBlockHoleWidth, 180.-CoolingBlockHoleAngle,360.+CoolingBlockHoleAngle); TVector3* CoolingBlockHoleVertex[3]; CoolingBlockHoleVertex[0] = new TVector3(); CoolingBlockHoleVertex[1] = new TVector3(fgkSSDCoolingBlockHoleRadius[0] * TMath::Cos((90.-CoolingBlockHoleAngle)*TMath::DegToRad()), fgkSSDCoolingBlockHoleRadius[0] * TMath::Sin((90.-CoolingBlockHoleAngle)*TMath::DegToRad())); CoolingBlockHoleVertex[2] = new TVector3(CoolingBlockHoleVertex[1]->X(), - CoolingBlockHoleVertex[1]->Y()); /* TGeoArb8* CoolingBlockTriangleHoleShape = */ GetTriangleShape(CoolingBlockHoleVertex, CoolingBlockHoleWidth,"CoolingBlockTriangleHoleShape"); TGeoRotation* CoolingBlockHoleRot = new TGeoRotation("CoolingBlockHoleRot",90,0.,0.); CoolingBlockHoleRot->RegisterYourself(); /* TGeoCompositeShape* CoolingTubeHoleShape = */ new TGeoCompositeShape("CoolingTubeHoleShape", "CoolingBlockTriangleHoleShape:CoolingBlockHoleRot+" "CoolingBlockHoleShape"); /////////////////////////// // Cooling Block Trapezoids /////////////////////////// const Int_t VertexNumber = 4; const Int_t TrapezoidNumber = 2; TVector3** CoolingBlockTrapezoidVertex[TrapezoidNumber]; for(Int_t i = 0; iX() - 2.*CoolingBlockTrapezoidLength[1] - fgkSSDCoolingBlockHoleLength[0])); CoolingBlockTrapezoidVertex[0][3] = new TVector3(CoolingBlockTrapezoidVertex[0][1]->X() - CoolingBlockTrapezoidVertex[0][2]->X()); CoolingBlockTrapezoidVertex[1][0] = new TVector3(); CoolingBlockTrapezoidVertex[1][1] = new TVector3(CoolingBlockTrapezoidLength[1]); CoolingBlockTrapezoidVertex[1][2] = new TVector3(CoolingBlockTrapezoidHeigth[1] / CoolingBlockTrapezoidHeigth[0] * CoolingBlockTrapezoidVertex[0][2]->X()); CoolingBlockTrapezoidVertex[1][3] = new TVector3(CoolingBlockTrapezoidVertex[1][1]->X()); char* CoolingBlockTrapezoidShapeName[TrapezoidNumber] = {"CoolingBlockTrapezoidShape0","CoolingBlockTrapezoidShape1"}; TGeoArb8* CoolingBlockTrapezoidShape[TrapezoidNumber]; for(Int_t i = 0; i< TrapezoidNumber; i++) CoolingBlockTrapezoidShape[i] = GetArbShape(CoolingBlockTrapezoidVertex[i], CoolingBlockTrapezoidWidth, CoolingBlockTrapezoidHeigth[i], CoolingBlockTrapezoidShapeName[i]); TGeoTranslation* CoolingBlockTrapezoidTrans = new TGeoTranslation("CoolingBlockTrapezoidTrans", CoolingBlockTrapezoidVertex[0][2]->X(), 0.0, 0.5*(CoolingBlockTrapezoidHeigth[0] + CoolingBlockTrapezoidHeigth[1])); CoolingBlockTrapezoidTrans->RegisterYourself(); TGeoCombiTrans* CoolingBlockTrapezoidCombiTrans = new TGeoCombiTrans("CoolingBlockTrapezoidCombiTrans", CoolingBlockTrapezoidVertex[0][3]->X(), fgkSSDCoolingBlockWidth, 0.5*(CoolingBlockTrapezoidHeigth[0] + CoolingBlockTrapezoidHeigth[1]), new TGeoRotation("",180.,0.,0.)); CoolingBlockTrapezoidCombiTrans->RegisterYourself(); /* TGeoCompositeShape* CoolingBlockTrapezoidCompositeShape = */ new TGeoCompositeShape("CoolingBlockTrapezoidCompositeShape", "CoolingBlockTrapezoidShape0+CoolingBlockTrapezoidShape1:CoolingBlockTrapezoidTrans+" "CoolingBlockTrapezoidShape1:CoolingBlockTrapezoidCombiTrans"); ///////////////////////////// // Cooling Block Boxes Shapes ///////////////////////////// const Int_t BoxNumber = 3; TGeoBBox* CoolingBlockBoxShape[BoxNumber]; CoolingBlockBoxShape[0] = new TGeoBBox("CoolingBlockBoxShape0", 0.5*fgkSSDCoolingBlockLength, 0.5*fgkSSDCoolingBlockWidth, 0.5*fgkSSDCoolingBlockHoleRadius[1]); CoolingBlockBoxShape[1] = new TGeoBBox("CoolingBlockBoxShape1", 0.5*(fgkSSDCoolingBlockLength - 2.*fgkSSDCoolingBlockHoleLength[1]), 0.5*fgkSSDCoolingBlockWidth, 0.5*fgkSSDCoolingBlockHeight[2]); CoolingBlockBoxShape[2] = new TGeoBBox("CoolingBlockBoxShape2", 0.5*fgkSSDCoolingBlockLength, 0.5*fgkSSDCoolingBlockWidth, 0.5*fgkSSDCoolingBlockHeight[1]); TGeoTranslation* CoolingBlockBoxTrans[BoxNumber-1]; CoolingBlockBoxTrans[0] = new TGeoTranslation("CoolingBlockBoxTrans0",0.,0., 0.5*(fgkSSDCoolingBlockHeight[1] + fgkSSDCoolingBlockHoleRadius[1]) + fgkSSDCoolingBlockHeight[2]); CoolingBlockBoxTrans[1] = new TGeoTranslation("CoolingBlockBoxTrans1", 0.0, 0.0, 0.5*(fgkSSDCoolingBlockHeight[1] + fgkSSDCoolingBlockHeight[2])); for(Int_t i=0; iRegisterYourself(); /* TGeoCompositeShape* CoolingBlockBoxCompositeShape = */ new TGeoCompositeShape("CoolingBlockBoxCompositeShape", "CoolingBlockBoxShape0:CoolingBlockBoxTrans0+" "CoolingBlockBoxShape1:CoolingBlockBoxTrans1+CoolingBlockBoxShape2"); /////////////////////// // Cooling Block Shape ////////////////////// TGeoCombiTrans* CoolingTubeHoleShapeCombiTrans = new TGeoCombiTrans("CoolingTubeHoleShapeCombiTrans", 0.5*fgkSSDCoolingBlockLength, 0.5*fgkSSDCoolingBlockWidth, fgkSSDCoolingBlockHoleCenter, new TGeoRotation("",0.,90.,0.)); CoolingTubeHoleShapeCombiTrans->RegisterYourself(); TGeoTranslation* CoolingBlockTrapezoidCompositeShapeTrans = new TGeoTranslation("CoolingBlockTrapezoidCompositeShapeTrans", 0.0, 0.0, 0.5*CoolingBlockTrapezoidHeigth[0]+fgkSSDCoolingBlockHeight[1]+ fgkSSDCoolingBlockHeight[2]+fgkSSDCoolingBlockHoleRadius[1]); CoolingBlockTrapezoidCompositeShapeTrans->RegisterYourself(); TGeoTranslation* CoolingBlockBoxCompositeShapeTrans = new TGeoTranslation("CoolingBlockBoxCompositeShapeTrans", 0.5*fgkSSDCoolingBlockLength, 0.5*fgkSSDCoolingBlockWidth, 0.5*fgkSSDCoolingBlockHeight[1]); CoolingBlockBoxCompositeShapeTrans->RegisterYourself(); TGeoCompositeShape* SSDCoolingBlockShape = new TGeoCompositeShape("SSDCoolingBlockShape", "CoolingBlockBoxCompositeShape:CoolingBlockBoxCompositeShapeTrans+" "CoolingBlockTrapezoidCompositeShape:CoolingBlockTrapezoidCompositeShapeTrans-" "CoolingTubeHoleShape:CoolingTubeHoleShapeCombiTrans"); TGeoVolume* SSDCoolingBlock = new TGeoVolume("SSDCoolingBlock", SSDCoolingBlockShape,fgkSSDAlCoolBlockMedium); return SSDCoolingBlock; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberJunction(Double_t width){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 4; TVector3* Vertex[VertexNumber]; Vertex[0] = new TVector3(); Vertex[1] = new TVector3(fgkCarbonFiberJunctionLength,0.); Vertex[2] = new TVector3(fgkCarbonFiberJunctionLength - fgkCarbonFiberJunctionEdge[1] * TMath::Cos(fgkCarbonFiberJunctionAngle[1]*TMath::DegToRad()), fgkCarbonFiberJunctionEdge[1]*TMath::Sin(fgkCarbonFiberJunctionAngle[1] * TMath::DegToRad())); Vertex[3] = new TVector3(fgkCarbonFiberJunctionEdge[0] * TMath::Cos(fgkCarbonFiberJunctionAngle[0]*TMath::DegToRad()), fgkCarbonFiberJunctionEdge[0] * TMath::Sin(fgkCarbonFiberJunctionAngle[0]*TMath::DegToRad())); TGeoArb8* CarbonFiberJunctionShapePiece = new TGeoArb8("CarbonFiberJunctionShapePiece",0.5*width); ////////////////////////////////// //Setting the vertices in TGeoArb8 ////////////////////////////////// for(Int_t i = 0; i<2*VertexNumber; i++) CarbonFiberJunctionShapePiece->SetVertex(i, Vertex[(i < VertexNumber ? i: i-VertexNumber)]->X(), Vertex[(i < VertexNumber ? i : i-VertexNumber)]->Y()); TGeoRotation* CarbonFiberJunctionRot = new TGeoRotation("CarbonFiberJunctionRot", 180., 180., 180-2.*fgkCarbonFiberJunctionAngle[0]); TGeoVolume* CarbonFiberJunctionPiece = new TGeoVolume("CarbonFiberJunctionPiece", CarbonFiberJunctionShapePiece,fgkSSDCarbonFiberMedium); TGeoVolume* CarbonFiberJunction = new TGeoVolumeAssembly("CarbonFiberJunction"); CarbonFiberJunctionPiece->SetLineColor(fColorCarbonFiber); CarbonFiberJunction->AddNode(CarbonFiberJunctionPiece,1); CarbonFiberJunction->AddNode(CarbonFiberJunctionPiece,2,CarbonFiberJunctionRot); return CarbonFiberJunction; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberJunctionAssembly(){ //////////////////////////////////////////////////////////////////////////////// SetCarbonFiberJunctionCombiTransMatrix(); TGeoVolume* CarbonFiberJunctionAssembly = new TGeoVolumeAssembly("CarbonFiberJunctionAssembly"); TGeoVolume* CarbonFiberJunction = GetCarbonFiberJunction(fgkCarbonFiberJunctionWidth); for(Int_t i=0; iAddNode(CarbonFiberJunction,i+1, CarbonFiberJunctionCombiTransMatrix[i]); return CarbonFiberJunctionAssembly; } ///////////////////////////////////////////////////////////////////////////////// TList* AliITSv11GeometrySSD::GetLadderCableSegment(Double_t SSDEndLadderCableLength){ ///////////////////////////////////////////////////////////////////////////////// const Int_t LadderCableSegmentNumber = 2; ///////////////////////////////////////// // LadderSegmentBBox Volume ///////////////////////////////////////// TGeoBBox* LadderCableSegmentBBoxShape[LadderCableSegmentNumber]; const char* LadderCableSegmentBBoxShapeName[LadderCableSegmentNumber] = {"LadderCableSegmentBBoxShape1","LadderCableSegmentBBoxShape2"}; for(Int_t i=0; iSetLineColor(i==0 ? fColorAl : fColorPolyhamide); } TGeoTranslation* LadderCableSegmentBBoxTrans[LadderCableSegmentNumber]; LadderCableSegmentBBoxTrans[0] = new TGeoTranslation("LadderCableSegmentBBoxTrans1", 0.5*fgkSSDFlexWidth[0], 0.5*fgkSSDLadderCableWidth, 0.5*fgkSSDFlexHeight[0]); LadderCableSegmentBBoxTrans[1] = new TGeoTranslation("LadderCableSegmentBBoxTrans2", 0.5*fgkSSDFlexWidth[0], 0.5*fgkSSDLadderCableWidth, fgkSSDFlexHeight[0] +0.5*fgkSSDFlexHeight[1]); TGeoVolume* LadderCableSegmentBBoxAssembly = new TGeoVolumeAssembly("LadderCableSegmentBBoxAssembly"); for(Int_t i=0; iAddNode(LadderCableSegmentBBox[i],1, LadderCableSegmentBBoxTrans[i]); ///////////////////////////////////////// // LadderSegmentArb8 Volume ///////////////////////////////////////// const Int_t VertexNumber = 4; TVector3** LadderCableSegmentVertexPosition[LadderCableSegmentNumber]; for(Int_t i = 0; iX(), LadderCableSegmentVertexPosition[i][2]->Y()); } Double_t LadderCableSegmentWidth[2][2] = {{fgkSSDFlexHeight[0],fgkSSDFlexHeight[0]}, {fgkSSDFlexHeight[1],fgkSSDFlexHeight[1]}}; char* LadderCableSegmentArbShapeName[LadderCableSegmentNumber] = {"LadderCableSegmentArbShape1","LadderCableSegmentArbShape2"}; TGeoArb8* LadderCableSegmentArbShape[LadderCableSegmentNumber]; for(Int_t i = 0; i< LadderCableSegmentNumber; i++) LadderCableSegmentArbShape[i] = GetArbShape(LadderCableSegmentVertexPosition[i], LadderCableSegmentWidth[i], fgkCarbonFiberJunctionWidth-fgkSSDFlexWidth[0], LadderCableSegmentArbShapeName[i]); const char* LadderCableSegmentArbName[LadderCableSegmentNumber] = {"LadderCableSegmentArb1","LadderCableSegmentArb2"}; TGeoVolume* LadderCableSegmentArb[LadderCableSegmentNumber]; for(Int_t i=0; iSetLineColor(i==0 ? fColorAl : fColorPolyhamide); } TGeoRotation* LadderCableSegmentArbRot[LadderCableSegmentNumber]; LadderCableSegmentArbRot[0] = new TGeoRotation("LadderCableSegmentArbRot1", 90.,90,-90.); LadderCableSegmentArbRot[1] = new TGeoRotation("LadderCableSegmentArbRot2", 0.,90.,0.); TGeoCombiTrans* LadderCableSegmentArbCombiTrans = new TGeoCombiTrans("LadderCableSegmentArbCombiTrans", 0.5*(fgkCarbonFiberJunctionWidth-fgkSSDFlexWidth[0]) + fgkSSDFlexWidth[0],0.,0., new TGeoRotation((*LadderCableSegmentArbRot[1]) *(*LadderCableSegmentArbRot[0]))); TGeoVolume* LadderCableSegmentArbAssembly = new TGeoVolumeAssembly("LadderCableSegmentArbAssembly"); for(Int_t i=0; iAddNode(LadderCableSegmentArb[i],1, LadderCableSegmentArbCombiTrans); ///////////////////////////////////////// // End Ladder Cable Volume ///////////////////////////////////////// TGeoBBox* LadderEndCableSegmentBBoxShape[LadderCableSegmentNumber]; const char* LadderEndCableSegmentBBoxShapeName[LadderCableSegmentNumber] = {"LadderEndCableSegmentBBoxShape1","LadderEndCableSegmentBBoxShape2"}; for(Int_t i=0; iSetLineColor(i==0 ? fColorAl : fColorPolyhamide); } TGeoTranslation* LadderEndCableSegmentBBoxTrans[LadderCableSegmentNumber]; LadderEndCableSegmentBBoxTrans[0] = new TGeoTranslation("LadderEndCableSegmentBBoxTrans0", 0.5*SSDEndLadderCableLength, 0.5*fgkSSDLadderCableWidth, 0.5*fgkSSDFlexHeight[0]); LadderEndCableSegmentBBoxTrans[1] = new TGeoTranslation("LadderEndCableSegmentBBoxTrans1", 0.5*SSDEndLadderCableLength, 0.5*fgkSSDLadderCableWidth, fgkSSDFlexHeight[0] +0.5*fgkSSDFlexHeight[1]); TGeoVolume* LadderEndCableSegmentBBoxAssembly = new TGeoVolumeAssembly("LadderEndCableSegmentBBoxAssembly"); for(Int_t i=0; iAddNode(LadderEndCableSegmentBBox[i],1, LadderEndCableSegmentBBoxTrans[i]); ///////////////////////////////////////// TList* LadderCableSegmentList = new TList(); LadderCableSegmentList->Add(LadderCableSegmentBBoxAssembly); LadderCableSegmentList->Add(LadderCableSegmentArbAssembly); LadderCableSegmentList->Add(LadderEndCableSegmentBBoxAssembly); return LadderCableSegmentList; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetLadderCable(Int_t n, Double_t SSDEndLadderCableLength){ ///////////////////////////////////////////////////////////////////////////////// TList* LadderCableSegmentList = GetLadderCableSegment(SSDEndLadderCableLength); TGeoVolume* LadderCable = new TGeoVolumeAssembly("LadderCable"); for(Int_t i=0; iAddNode((TGeoVolume*)LadderCableSegmentList->At(0),i+1,LadderCableTrans); if(i!=n-1) LadderCable->AddNode((TGeoVolume*)LadderCableSegmentList->At(1),i+1,LadderCableTrans); } TGeoTranslation* EndLadderCableTrans = new TGeoTranslation("EndLadderCableTrans", (n-1)*fgkCarbonFiberJunctionWidth+fgkSSDFlexWidth[0], fgkSSDLadderCableWidth-fgkSSDFlexWidth[0], (n-1)*(fgkSSDFlexHeight[0]+fgkSSDFlexHeight[1])); LadderCable->AddNode((TGeoVolume*)LadderCableSegmentList->At(2),1,EndLadderCableTrans); return LadderCable; } ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetLadderCableAssembly(Int_t n, Double_t SSDEndLadderCableLength){ ///////////////////////////////////////////////////////////////////////////////// TGeoVolume* LadderCableAssembly = new TGeoVolumeAssembly("LadderCableAssembly"); char LadderCableTransName[30]; for(Int_t i=0; iAddNode(GetLadderCable(n-i,SSDEndLadderCableLength),i+1, new TGeoTranslation(LadderCableTransName,i*fgkCarbonFiberJunctionWidth,0.,0.)); } return LadderCableAssembly; } ///////////////////////////////////////////////////////////////////////////////// TList* AliITSv11GeometrySSD::GetLadderCableAssemblyList(Int_t n, Double_t SSDEndLadderCableLength){ ///////////////////////////////////////////////////////////////////////////////// const Int_t LadderCableAssemblyNumber = 2; TGeoVolume* LadderCableAssembly = GetLadderCableAssembly(n,SSDEndLadderCableLength); TGeoVolume* LadderCable[LadderCableAssemblyNumber]; char LadderCableAssemblyName[30]; TList* LadderCableAssemblyList = new TList(); for(Int_t i=0; iAddNode(LadderCableAssembly,i+1,i==0 ? NULL : new TGeoCombiTrans((n-1) * fgkCarbonFiberJunctionWidth+fgkSSDFlexWidth[0], 2.*fgkSSDLadderCableWidth+0.5*fgkSSDFlexWidth[0], 0.,new TGeoRotation("",180,0.,0.))); LadderCableAssemblyList->Add(LadderCable[i]); } return LadderCableAssemblyList; } ///////////////////////////////////////////////////////////////////////////////// TList* AliITSv11GeometrySSD::GetEndLadderCarbonFiberJunctionAssembly(){ //////////////////////////////////////////////////////////////////////////////// const Int_t EndLabberCarbonFiberJunctionNumber = 2; TGeoVolume* EndLadderCarbonFiberJunctionAssembly[EndLabberCarbonFiberJunctionNumber]; EndLadderCarbonFiberJunctionAssembly[0] = new TGeoVolumeAssembly("EndLadderCarbonFiberJunctionAssembly1"); EndLadderCarbonFiberJunctionAssembly[1] = new TGeoVolumeAssembly("EndLadderCarbonFiberJunctionAssembly2"); TGeoVolume** EndLadderCarbonFiberJunction[EndLabberCarbonFiberJunctionNumber]; for(Int_t i=0; iAddNode(j==2 ? EndLadderCarbonFiberJunction[i][1] : EndLadderCarbonFiberJunction[i][0], j+1,EndLadderCarbonFiberJunctionCombiTransMatrix[j]); EndLadderCarbonFiberJunctionList->Add(EndLadderCarbonFiberJunctionAssembly[i]); } return EndLadderCarbonFiberJunctionList; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberSupport(){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 4; const Int_t ShapesNumber = 2; TVector3** VertexPosition[ShapesNumber]; for(Int_t i=0; iY()); //////////////////////////////////////////////////// //Setting the parameters for Isometry Transformation //////////////////////////////////////////////////// Double_t SymmetryPlanePosition = (fgkCarbonFiberSupportYAxisLength + fgkCarbonFiberSupportTopEdgeDist[0] + fgkCarbonFiberSupportWidth); Double_t* param = new Double_t[4]; param[0] = 0., param[1] = 1., param[2] = 0., param[3] = -SymmetryPlanePosition; for(Int_t j=0; jX(), (GetReflection(VertexPosition[0][j],param))->Y()); char* CarbonFiberSupportShapeName[ShapesNumber] = {"CarbonFiberSupportShape1","CarbonFiberSupportShape2"}; TGeoArb8* CarbonFiberSupportShape[ShapesNumber]; Double_t Width[2] = {fgkCarbonFiberSupportWidth,fgkCarbonFiberSupportWidth}; Double_t CarbonFiberSupportHeight = CarbonFiberSupportXAxisEdgeProj*TMath::Tan(fgkCarbonFiberJunctionAngle[0] *TMath::DegToRad()); for(Int_t i = 0; i< ShapesNumber; i++) CarbonFiberSupportShape[i] = GetArbShape(VertexPosition[i],Width,CarbonFiberSupportHeight, CarbonFiberSupportShapeName[i],i==0 ? 1: -1); ///////////////////////////////////// //Setting Translations and Rotations: ///////////////////////////////////// TGeoTranslation* CarbonFiberSupportTrans = new TGeoTranslation("CarbonFiberSupportTrans", 0.0,0.0,0.5*CarbonFiberSupportHeight); CarbonFiberSupportTrans->RegisterYourself(); TGeoRotation* CarbonFiberCompShapeRot[2]; CarbonFiberCompShapeRot[0] = new TGeoRotation("CarbonFiberCompShapeRot1", 0.0,180.0,0.0); CarbonFiberCompShapeRot[1] = new TGeoRotation("CarbonFiberCompShapeRot2", 90.,-fgkCarbonFiberTriangleAngle,-90.); Double_t TransVector[3] = {fgkCarbonFiberTriangleLength * TMath::Cos(fgkCarbonFiberTriangleAngle * TMath::DegToRad()),0.,-fgkCarbonFiberTriangleLength * TMath::Sin(fgkCarbonFiberTriangleAngle * TMath::DegToRad())}; TGeoCombiTrans* CarbonFiberSupportCombiTrans = new TGeoCombiTrans("CarbonFiberSupportCombiTrans", TransVector[0],2.*SymmetryPlanePosition + TransVector[1],TransVector[2], new TGeoRotation((*CarbonFiberCompShapeRot[1]) * (*CarbonFiberCompShapeRot[0]))); CarbonFiberSupportCombiTrans->RegisterYourself(); //////////////////////////////////////////////////////////////////////////////// TGeoCompositeShape* CarbonFiberSupportCompShape = new TGeoCompositeShape("CarbonFiberSupportCompShape", "CarbonFiberSupportShape1:CarbonFiberSupportTrans+" "CarbonFiberSupportShape2:CarbonFiberSupportTrans"); TGeoVolume* CarbonFiberSupport = new TGeoVolume("CarbonFiberSupport", CarbonFiberSupportCompShape,fgkSSDCarbonFiberMedium); CarbonFiberSupport->SetLineColor(fColorCarbonFiber); TGeoVolume* CarbonFiberSupportAssembly = new TGeoVolumeAssembly("CarbonFiberSupportAssembly"); CarbonFiberSupportAssembly->AddNode(CarbonFiberSupport,1); CarbonFiberSupportAssembly->AddNode(CarbonFiberSupport,2, CarbonFiberSupportCombiTrans); return CarbonFiberSupportAssembly; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberLowerSupport(Int_t ikind, Bool_t EndLadder){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 4; const Int_t ShapesNumber = 2; Double_t Width[2] = {fgkCarbonFiberLowerSupportWidth, fgkCarbonFiberLowerSupportWidth}; TVector3** VertexPosition[ShapesNumber]; for(Int_t i = 0; iX(), VertexPosition[0][0]->X()*TMath::Tan(Theta) + fgkCarbonFiberLowerSupportVolumePosition[0]); VertexPosition[1][1] = new TVector3(VertexPosition[0][1]->X(), VertexPosition[0][1]->X()*TMath::Tan(Theta) + fgkCarbonFiberLowerSupportVolumePosition[0]); VertexPosition[1][2] = new TVector3(0.,fgkCarbonFiberLowerSupportVolumePosition[0]); VertexPosition[1][3] = new TVector3(fgkCarbonFiberTriangleLength, fgkCarbonFiberLowerSupportVolumePosition[1]); char* CarbonFiberLowerSupportName[ShapesNumber] = {"CarbonFiberLowerSupportShape1","CarbonFiberLowerSupportShape2"}; TGeoArb8* CarbonFiberLowerSupportShape[ShapesNumber]; for(Int_t i = 0; i< ShapesNumber; i++) CarbonFiberLowerSupportShape[i] = GetArbShape(VertexPosition[i],Width, fgkCarbonFiberLowerSupportHeight, CarbonFiberLowerSupportName[i]); /////////////////////////////////////////////////////// TGeoTranslation* CarbonFiberLowerSupportTrans[ShapesNumber]; CarbonFiberLowerSupportTrans[0] = new TGeoTranslation("CarbonFiberLowerSupportTrans1", 0.0, VertexPosition[1][3]->Y()+VertexPosition[1][2]->Y(), 0.0); CarbonFiberLowerSupportTrans[1] = new TGeoTranslation("CarbonFiberLowerSupportTrans2", 0.0, - VertexPosition[1][3]->Y()-VertexPosition[1][2]->Y(), 0.0); for(Int_t i = 0; i< ShapesNumber; i++) CarbonFiberLowerSupportTrans[i]->RegisterYourself(); /////////////////////////////////////////////////////// TGeoCompositeShape* CarbonFiberLowerSupportCompShape; if(EndLadder==false) CarbonFiberLowerSupportCompShape = new TGeoCompositeShape("CarbonFiberLowerSupportCompShape", "CarbonFiberLowerSupportShape2+" "CarbonFiberLowerSupportShape1:CarbonFiberLowerSupportTrans1"); else if(ikind==0) CarbonFiberLowerSupportCompShape = (TGeoCompositeShape*)CarbonFiberLowerSupportShape[0]; else CarbonFiberLowerSupportCompShape = new TGeoCompositeShape("CarbonFiberLowerSupportCompShape", "CarbonFiberLowerSupportShape1+" "CarbonFiberLowerSupportShape1:CarbonFiberLowerSupportTrans1"); TGeoVolume* CarbonFiberLowerSupport = new TGeoVolume("CarbonFiberLowerSupport", CarbonFiberLowerSupportCompShape,fgkSSDCarbonFiberMedium); CarbonFiberLowerSupport->SetLineColor(fColorCarbonFiber); return CarbonFiberLowerSupport; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCarbonFiberAssemblySupport(){ //////////////////////////////////////////////////////////////////////////////// SetCarbonFiberAssemblyCombiTransMatrix(); TGeoVolume* CarbonFiberAssemblySupport = new TGeoVolumeAssembly("CarbonFiberAssembly"); TGeoVolume* CarbonFiberAssemblyVolumes[fgkCarbonFiberAssemblyCombiTransNumber]; CarbonFiberAssemblyVolumes[0] = GetCarbonFiberJunctionAssembly(); CarbonFiberAssemblyVolumes[1] = GetCarbonFiberSupport(); CarbonFiberAssemblyVolumes[2] = GetCarbonFiberLowerSupport(); for(Int_t i=0; iAddNode(CarbonFiberAssemblyVolumes[i],1, CarbonFiberAssemblyCombiTransMatrix[i]); return CarbonFiberAssemblySupport; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeSupport(){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 3; Double_t Phi = TMath::ASin(0.5*fgkCoolingTubeSupportHeight / fgkCoolingTubeSupportRmax)*TMath::RadToDeg(); /* TGeoTubeSeg* CoolingTubeSegShape = */ new TGeoTubeSeg("CoolingTubeSegShape",0.0, fgkCoolingTubeSupportRmax, 0.5*fgkCoolingTubeSupportWidth,Phi, 360-Phi); /* TGeoTube* CoolingTubeHoleShape = */ new TGeoTube("CoolingTubeHoleShape",0.0, fgkCoolingTubeSupportRmin, 0.5*fgkCoolingTubeSupportWidth); TVector3* VertexPosition[VertexNumber]; /////////////////////////// //Shape Vertex Positioning /////////////////////////// VertexPosition[0] = new TVector3(); VertexPosition[1] = new TVector3(fgkCoolingTubeSupportRmax * TMath::Cos(Phi*TMath::DegToRad()), fgkCoolingTubeSupportRmax * TMath::Sin(Phi*TMath::DegToRad())); VertexPosition[2] = new TVector3(VertexPosition[1]->X(), - VertexPosition[1]->Y()); /* TGeoArb8* CoolingTubeTriangleShape = */ GetTriangleShape(VertexPosition, fgkCoolingTubeSupportWidth, "CoolingTubeTriangleShape"); Double_t* BoxOrigin = new Double_t[3]; Double_t BoxLength = fgkCoolingTubeSupportLength-fgkCoolingTubeSupportRmax - VertexPosition[1]->X(); BoxOrigin[0] = VertexPosition[1]->X()+0.5*BoxLength, BoxOrigin[1] = BoxOrigin[2] = 0.; /* TGeoBBox* CoolingTubeBoxShape = */ new TGeoBBox("CoolingTubeBoxShape",0.5*BoxLength, 0.5*fgkCoolingTubeSupportHeight, 0.5*fgkCoolingTubeSupportWidth,BoxOrigin); TGeoCompositeShape* CoolingTubeSupportShape = new TGeoCompositeShape("CoolingTubeSupportShape", "(CoolingTubeSegShape+CoolingTubeTriangleShape" "+CoolingTubeBoxShape)-CoolingTubeHoleShape"); TGeoVolume* CoolingTubeSupport = new TGeoVolume("CoolingTubeSupport", CoolingTubeSupportShape,fgkSSDTubeHolderMedium); return CoolingTubeSupport; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeSupportAssembly(){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* CoolingTubeSupportAssembly = new TGeoVolumeAssembly("CoolingTubeSupportAssembly"); TGeoVolume* CoolingTubeSupport = GetCoolingTubeSupport(); SetCoolingTubeSupportCombiTransMatrix(); for(Int_t i=0; iAddNode(CoolingTubeSupport,i+1, CoolingTubeSupportCombiTransMatrix[i]); return CoolingTubeSupportAssembly; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCoolingTube(){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* CoolingTubeAssembly = new TGeoVolumeAssembly("CoolingTubeAssembly"); TGeoTube *CoolingTubeShape = new TGeoTube("CoolingTubeShape", fgkCoolingTubeRmin, fgkCoolingTubeRmax, fgkCoolingTubeLength/2.0); TGeoVolume* CoolingTube = new TGeoVolume("CoolingTube", CoolingTubeShape,fgkSSDCoolingTubePhynox); TGeoTube *CoolingTubeInteriorShape = new TGeoTube("CoolingTubeInteriorShape", 0, fgkCoolingTubeRmin, fgkCoolingTubeLength/2.0); TGeoVolume *CoolingTubeInterior = new TGeoVolume("CoolingTubeInterior", CoolingTubeInteriorShape,fgkSSDCoolingTubeWater); CoolingTubeAssembly->AddNode(CoolingTube,1); CoolingTubeAssembly->AddNode(CoolingTubeInterior,2); return CoolingTubeAssembly; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetCoolingTubeAssembly(){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* CoolingTubeAssembly = new TGeoVolumeAssembly("CoolingTubeAssembly"); TGeoVolume* CoolingTube = GetCoolingTube(); SetCoolingTubeCombiTransMatrix(); for(Int_t i=0; iAddNode(CoolingTube,i+1,CoolingTubeTransMatrix[i]); return CoolingTubeAssembly; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetLadderSegment(Int_t iChipCablesHeight){ //////////////////////////////////////////////////////////////////////////////// TGeoVolume* LadderSegment = new TGeoVolumeAssembly("LadderSegment"); TGeoVolume* LadderSegmentVolumes[fgkLadderSegmentCombiTransNumber]; LadderSegmentVolumes[0] = GetCarbonFiberAssemblySupport(); LadderSegmentVolumes[1] = GetSSDModule(iChipCablesHeight); LadderSegmentVolumes[2] = GetSSDSensorSupportAssembly(iChipCablesHeight); LadderSegmentVolumes[3] = GetCoolingTubeSupportAssembly(); LadderSegmentVolumes[4] = GetCoolingTubeAssembly(); SetLadderSegmentCombiTransMatrix(); for(Int_t i=0; iAddNode(LadderSegmentVolumes[i],1, LadderSegmentCombiTransMatrix[i]); return LadderSegment; } //////////////////////////////////////////////////////////////////////////////// TList* AliITSv11GeometrySSD::GetEndLadderSegment(){ //////////////////////////////////////////////////////////////////////////////// const Int_t EndLadderSegmentNumber = 2; TList* EndLadderCarbonFiberJunctionList = GetEndLadderCarbonFiberJunctionAssembly(); TGeoVolume* EndLadderSegment[EndLadderSegmentNumber]; EndLadderSegment[0] = new TGeoVolumeAssembly("EndLadderSegment1"); EndLadderSegment[1] = new TGeoVolumeAssembly("EndLadderSegment2"); TGeoVolume** LadderSegmentVolumes[EndLadderSegmentNumber]; const Int_t LadderSegmentVolumeNumber = 4; for(Int_t i=0; iAt(0); LadderSegmentVolumes[0][1] = GetCarbonFiberSupport(); LadderSegmentVolumes[0][2] = GetSSDMountingBlock(); LadderSegmentVolumes[0][3] = GetCarbonFiberLowerSupport(0,true); LadderSegmentVolumes[1][0] = (TGeoVolume*)EndLadderCarbonFiberJunctionList->At(1); LadderSegmentVolumes[1][1] = LadderSegmentVolumes[0][1]; LadderSegmentVolumes[1][2] = LadderSegmentVolumes[0][2]; LadderSegmentVolumes[1][3] = GetCarbonFiberLowerSupport(1,true); TList* EndLadderSegmentList = new TList(); for(Int_t i=0; iAddNode(LadderSegmentVolumes[i][j],1, EndLadderSegmentCombiTransMatrix[j]); EndLadderSegmentList->Add(EndLadderSegment[i]); } return EndLadderSegmentList; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetSSDMountingBlock(){ //////////////////////////////////////////////////////////////////////////////// // Mounting Block Boxes Shapes /////////////////////////////////////// const Int_t MountingBlockBoxNumber = 3; TGeoBBox* MountingBlockBoxShape[MountingBlockBoxNumber]; MountingBlockBoxShape[0] = new TGeoBBox("MountingBlockBoxShape0", 0.25*(fgkSSDMountingBlockLength[0] - fgkSSDMountingBlockLength[1]), 0.5*fgkSSDMountingBlockWidth, 0.5*fgkSSDMountingBlockHeight[0]); MountingBlockBoxShape[1] = new TGeoBBox("MountingBlockBoxShape1", 0.25*(fgkSSDMountingBlockLength[1] - fgkSSDMountingBlockLength[2]), 0.5*fgkSSDMountingBlockWidth, 0.5*(fgkSSDMountingBlockHeight[1] - fgkSSDMountingBlockHeight[3])); MountingBlockBoxShape[2] = new TGeoBBox("MountingBlockBoxShape2", 0.5*fgkSSDMountingBlockLength[2], 0.5*fgkSSDMountingBlockWidth, 0.5*(fgkSSDMountingBlockHeight[2] - fgkSSDMountingBlockHeight[3])); TGeoTranslation* MountingBlockBoxTrans[MountingBlockBoxNumber+2]; MountingBlockBoxTrans[0] = new TGeoTranslation("MountingBlockBoxTrans0",0.,0.,0.); MountingBlockBoxTrans[1] = new TGeoTranslation("MountingBlockBoxTrans1", MountingBlockBoxShape[0]->GetDX() + MountingBlockBoxShape[1]->GetDX(), 0.0, MountingBlockBoxShape[1]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3]); MountingBlockBoxTrans[2] = new TGeoTranslation("MountingBlockBoxTrans2", MountingBlockBoxShape[0]->GetDX() + 2.*MountingBlockBoxShape[1]->GetDX() + MountingBlockBoxShape[2]->GetDX(), 0.0, MountingBlockBoxShape[2]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3]); MountingBlockBoxTrans[3] = new TGeoTranslation("MountingBlockBoxTrans3", MountingBlockBoxShape[0]->GetDX() + MountingBlockBoxShape[1]->GetDX() + 2.*(MountingBlockBoxShape[1]->GetDX() + MountingBlockBoxShape[2]->GetDX()), 0.0, MountingBlockBoxShape[1]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3]); MountingBlockBoxTrans[4] = new TGeoTranslation("MountingBlockBoxTrans4", 2.*(MountingBlockBoxShape[0]->GetDX() + 2.*MountingBlockBoxShape[1]->GetDX() + MountingBlockBoxShape[2]->GetDX()), 0.0, 0.0); for(Int_t i=0; iRegisterYourself(); /////////////////////////////////////// // Mounting Block Trapezoid Hole Shapes /////////////////////////////////////// const Int_t HoleTrapezoidVertexNumber = 4; TVector3* HoleTrapezoidVertex[HoleTrapezoidVertexNumber]; HoleTrapezoidVertex[0] = new TVector3(); HoleTrapezoidVertex[1] = new TVector3(fgkSSDMountingBlockHoleTrapezoidHeight); HoleTrapezoidVertex[2] = new TVector3(*HoleTrapezoidVertex[0]); HoleTrapezoidVertex[3] = new TVector3(*HoleTrapezoidVertex[1]); Double_t HoleTrapezoidWidth[2] = {fgkSSDMountingBlockHoleTrapezoidUpBasis + 2.*MountingBlockBoxShape[1]->GetDX() * TMath::Tan(fgkSSDMountingBlockHoleTrapezoidAngle * TMath::DegToRad()), fgkSSDMountingBlockHoleTrapezoidUpBasis}; /* TGeoArb8* HoleTrapezoidShape =*/ GetArbShape(HoleTrapezoidVertex, HoleTrapezoidWidth, 2.*MountingBlockBoxShape[1]->GetDX(), "HoleTrapezoidShape"); TGeoRotation* HoleTrapezoidShapeRot[2]; HoleTrapezoidShapeRot[0] = new TGeoRotation("HoleTrapezoidShapeRot0", 90.,-90.,-90.); HoleTrapezoidShapeRot[1] = new TGeoRotation("HoleTrapezoidShapeRot1", -180.,0.,0.); TGeoCombiTrans* HoleTrapezoidShapeCombiTrans = new TGeoCombiTrans("HoleTrapezoidShapeCombiTrans", MountingBlockBoxShape[0]->GetDX() + 3.*MountingBlockBoxShape[1]->GetDX() + 2.*MountingBlockBoxShape[2]->GetDX(), 0.5*fgkSSDMountingBlockWidth, - fgkSSDMountingBlockHoleTrapezoidHeight + 2.*MountingBlockBoxShape[1]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3], new TGeoRotation((*HoleTrapezoidShapeRot[1]) * (*HoleTrapezoidShapeRot[0]))); HoleTrapezoidShapeCombiTrans->RegisterYourself(); /////////////////////////////////// // Mounting Block Screw Hole Shapes /////////////////////////////////// const Int_t MountingBlockTubeNumber = 2; TGeoTube* MountingBlockTubeShape[MountingBlockTubeNumber]; MountingBlockTubeShape[0] = new TGeoTube("MountingBlockTubeShape0",0.0, fgkSSDMountingBlockHoleRadius, MountingBlockBoxShape[0]->GetDZ()); MountingBlockTubeShape[1] = new TGeoTube("MountingBlockTubeShape1",0.0, fgkSSDMountingBlockHoleRadius, MountingBlockBoxShape[2]->GetDZ()); TGeoTranslation* MountingBlockTubeTrans[2*MountingBlockTubeNumber]; MountingBlockTubeTrans[0] = new TGeoTranslation("MountingBlockTubeTrans0", - 0.5*(fgkSSDMountingBlockLength[0] - fgkSSDMountingBlockHoleTubeLength[0]), 0.5*fgkSSDMountingBlockWidth - fgkSSDMountingBlockHoleTubeWidth[0],0.); MountingBlockTubeTrans[1] = new TGeoTranslation("MountingBlockTubeTrans1", - 0.5*(fgkSSDMountingBlockLength[0] - fgkSSDMountingBlockHoleTubeLength[0]) + fgkSSDMountingBlockHoleTubeLength[0], - 0.5*fgkSSDMountingBlockWidth + fgkSSDMountingBlockHoleTubeWidth[0], 0.); MountingBlockTubeTrans[2] = new TGeoTranslation("MountingBlockTubeTrans2", - MountingBlockBoxShape[0]->GetDX() + 0.5*fgkSSDMountingBlockLength[0] - fgkSSDMountingBlockHoleTubeLength[1], 0.5*fgkSSDMountingBlockWidth - fgkSSDMountingBlockHoleTubeWidth[0], MountingBlockBoxShape[2]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3]); MountingBlockTubeTrans[3] = new TGeoTranslation("MountingBlockTubeTrans3", - MountingBlockBoxShape[0]->GetDX() + 0.5*fgkSSDMountingBlockLength[0], - 0.5*fgkSSDMountingBlockWidth + fgkSSDMountingBlockHoleTubeWidth[1], MountingBlockBoxShape[2]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3]); for(Int_t i=0; i<2*MountingBlockTubeNumber; i++) MountingBlockTubeTrans[i]->RegisterYourself(); /* TGeoCompositeShape* MountingBlockMainShape = */ new TGeoCompositeShape("MountingBlockMainShape", "MountingBlockBoxShape0:MountingBlockBoxTrans0+" "MountingBlockBoxShape1:MountingBlockBoxTrans1+" "MountingBlockBoxShape2:MountingBlockBoxTrans2+" "MountingBlockBoxShape1:MountingBlockBoxTrans3+" "MountingBlockBoxShape0:MountingBlockBoxTrans4"); //////////////////////////////////////////// // Mounting Block Screw Composite Hole Shapes //////////////////////////////////////////// const Int_t MountingBlockHoleTubeSegNumber = 4; /* TGeoTubeSeg* MountingBlockHoleTubeSegShape = */ new TGeoTubeSeg("MountingBlockHoleTubeSegShape", 0.0, fgkSSDMountingBlockScrewHoleRadius[0], 0.5*fgkSSDMountingBlockScrewHoleHeigth,-90.,180.); TGeoCombiTrans* MountingBlockHoleTubeSegCombiTrans[MountingBlockHoleTubeSegNumber]; char* MountingBlockHoleTubeSegCombiTransName[MountingBlockHoleTubeSegNumber] = { "MountingBlockHoleTubeSegCombiTrans0", "MountingBlockHoleTubeSegCombiTrans1", "MountingBlockHoleTubeSegCombiTrans2", "MountingBlockHoleTubeSegCombiTrans3"}; for(Int_t i=0; iRegisterYourself(); } TGeoBBox* MountingBlockHoleBoxShape = new TGeoBBox("MountingBlockHoleBoxShape", 0.5*fgkSSDMountingBlockScrewHoleEdge, 0.5*fgkSSDMountingBlockScrewHoleEdge, 0.5*fgkSSDMountingBlockScrewHoleHeigth); TGeoCompositeShape* MountingBlockScrewHole[2]; MountingBlockScrewHole[0] = new TGeoCompositeShape("MountingBlockScrewHole0", "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans0+" "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans1+" "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans2+" "MountingBlockHoleTubeSegShape:MountingBlockHoleTubeSegCombiTrans3+" "MountingBlockHoleBoxShape"); /* TGeoTubeSeg* MountingBlockLowerHoleTubeSegShape = */ new TGeoTubeSeg("MountingBlockLowerHoleTubeSegShape", 0.0, fgkSSDMountingBlockScrewHoleRadius[1], 0.5*(fgkSSDMountingBlockHoleTubeWidth[0] - fgkSSDMountingBlockScrewHoleHeigth - fgkSSDMountingBlockHeight[3]),0.,90.); TGeoCombiTrans* MountingBlockLowerHoleTubeSegCombiTrans[MountingBlockHoleTubeSegNumber]; char* MountingBlockLowerHoleTubeSegCombiTransName[MountingBlockHoleTubeSegNumber] = { "MountingBlockLowerHoleTubeSegCombiTrans0", "MountingBlockLowerHoleTubeSegCombiTrans1", "MountingBlockLowerHoleTubeSegCombiTrans2", "MountingBlockLowerHoleTubeSegCombiTrans3"}; for(Int_t i=0; iRegisterYourself(); } Double_t fgkSSDMountingBlockLowerScrewHoleEdge = fgkSSDMountingBlockScrewHoleEdge - 2.*fgkSSDMountingBlockScrewHoleRadius[1]; TGeoBBox* MountingBlockLowerHoleBoxShape[2]; MountingBlockLowerHoleBoxShape[0] = new TGeoBBox("MountingBlockLowerHoleBoxShape0", 0.5*fgkSSDMountingBlockLowerScrewHoleEdge, 0.5*fgkSSDMountingBlockLowerScrewHoleEdge, 0.5*(fgkSSDMountingBlockHoleTubeWidth[0] - fgkSSDMountingBlockScrewHoleHeigth - fgkSSDMountingBlockHeight[3])); MountingBlockLowerHoleBoxShape[1] = new TGeoBBox("MountingBlockLowerHoleBoxShape1", 0.5*fgkSSDMountingBlockLowerScrewHoleEdge, 0.5*fgkSSDMountingBlockScrewHoleRadius[1], 0.5*(fgkSSDMountingBlockHoleTubeWidth[0] - fgkSSDMountingBlockScrewHoleHeigth - fgkSSDMountingBlockHeight[3])); TGeoCombiTrans* MountingBlockLowerHoleBoxCombiTrans[MountingBlockHoleTubeSegNumber]; char* MountingBlockLowerHoleBoxCombiTransName[MountingBlockHoleTubeSegNumber] = { "MountingBlockLowerHoleBoxCombiTrans0", "MountingBlockLowerHoleBoxCombiTrans1", "MountingBlockLowerHoleBoxCombiTrans2", "MountingBlockLowerHoleBoxCombiTrans3"}; for(Int_t i=0; iRegisterYourself(); } MountingBlockScrewHole[1] = new TGeoCompositeShape("MountingBlockScrewHole1", "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans0+" "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans1+" "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans2+" "MountingBlockLowerHoleTubeSegShape:MountingBlockLowerHoleTubeSegCombiTrans3+" "MountingBlockLowerHoleBoxShape0+" "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans0+" "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans1+" "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans2+" "MountingBlockLowerHoleBoxShape1:MountingBlockLowerHoleBoxCombiTrans3"); TGeoTranslation* MountingBlockScrewHole1Trans = new TGeoTranslation("MountingBlockScrewHole1Trans",0.,0., - MountingBlockLowerHoleBoxShape[0]->GetDZ() - MountingBlockHoleBoxShape->GetDZ()); MountingBlockScrewHole1Trans->RegisterYourself(); /* TGeoCompositeShape* MountingBlockHole = */ new TGeoCompositeShape("MountingBlockHole", "MountingBlockScrewHole0+MountingBlockScrewHole1:MountingBlockScrewHole1Trans"); TGeoTranslation* MountingBlockHoleTrans = new TGeoTranslation("MountingBlockHoleTrans", 0.5*fgkSSDMountingBlockLength[0] - MountingBlockBoxShape[0]->GetDZ(), 0.0, 2.*MountingBlockBoxShape[2]->GetDZ() - MountingBlockBoxShape[0]->GetDZ() + fgkSSDMountingBlockHeight[3] - MountingBlockHoleBoxShape->GetDZ()); MountingBlockHoleTrans->RegisterYourself(); TGeoCompositeShape* MountingBlockShape = new TGeoCompositeShape("MountingBlockShape", "MountingBlockMainShape-(MountingBlockTubeShape0:MountingBlockTubeTrans0+" "MountingBlockTubeShape0:MountingBlockTubeTrans1+" "MountingBlockTubeShape1:MountingBlockTubeTrans2+" "MountingBlockTubeShape1:MountingBlockTubeTrans3+" "HoleTrapezoidShape:HoleTrapezoidShapeCombiTrans+" "MountingBlockHole:MountingBlockHoleTrans)"); TGeoVolume* SSDMountingBlock = new TGeoVolume("SSDMountingBlock", MountingBlockShape,fgkSSDMountingBlockMedium); return SSDMountingBlock; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetLadder(Int_t iLayer){ TGeoVolume* Ladder = new TGeoVolumeAssembly(iLayer==5 ? "ITSssdLay5Ladd" : "ITSssdLay6Ladd"); TGeoVolume* LadderSegment[2]; LadderSegment[0] = GetLadderSegment(0); LadderSegment[1] = GetLadderSegment(1); TList* EndLadderSegmentList = GetEndLadderSegment(); Double_t BeamAxisTransVector = fgkCarbonFiberJunctionWidth; Int_t SSDLaySensorsNumber = (iLayer==5 ? fgkSSDLay5SensorsNumber : fgkSSDLay6SensorsNumber); for(Int_t i=0; iAddNode(i%2==0 ? LadderSegment[iLayer==5 ? 0 : 1] : LadderSegment[iLayer==5 ? 1 : 0], SSDLaySensorsNumber-i,new TGeoTranslation("",-0.5*fgkCarbonFiberTriangleLength, BeamAxisTransVector*i,0.)); Ladder->AddNode((TGeoVolume*)EndLadderSegmentList->At(0),1, new TGeoTranslation("",-0.5*fgkCarbonFiberTriangleLength, fgkCarbonFiberJunctionWidth*SSDLaySensorsNumber,0.)); Ladder->AddNode((TGeoVolume*)EndLadderSegmentList->At(1),1, new TGeoCombiTrans("",0.5*fgkCarbonFiberTriangleLength, 0.,0.,new TGeoRotation("",180.,0.,0.))); ///////////////////////////////////////////////////////////////////////////// /// Placing Ladder Cables ///////////////////////////////////////////////////////////////////////////// SetLadderCableCombiTransMatrix(iLayer); Int_t SideCableNumber[2] = {0,0}; switch(iLayer){ case 5: SideCableNumber[0] = fgkSSDLay5SensorsNumber/2+1; SideCableNumber[1] = SideCableNumber[0]-2; break; case 6: SideCableNumber[0] = (fgkSSDLay6SensorsNumber-1)/2+1; SideCableNumber[1] = SideCableNumber[0]-1; break; } const Double_t* CarbonFiberToModulePosition = LadderSegmentCombiTransMatrix[1]->GetTranslation(); Double_t SSDEndLadderCableLength[4]; SSDEndLadderCableLength[0] = CarbonFiberToModulePosition[1] + fgkSSDSensorLength - fgkSSDModuleStiffenerPosition[1] - fgkSSDStiffenerWidth - fgkSSDFlexWidth[0] + fgkEndLadderCarbonFiberLowerJunctionLength[1]; SSDEndLadderCableLength[1] = CarbonFiberToModulePosition[1] + fgkSSDModuleStiffenerPosition[1] + fgkSSDStiffenerWidth + fgkEndLadderCarbonFiberLowerJunctionLength[1]; SSDEndLadderCableLength[2] = SSDEndLadderCableLength[1] - fgkEndLadderCarbonFiberLowerJunctionLength[1] + fgkEndLadderCarbonFiberLowerJunctionLength[0]; SSDEndLadderCableLength[3] = fgkCarbonFiberJunctionWidth-(fgkSSDSensorLength + CarbonFiberToModulePosition[1] - fgkSSDModuleStiffenerPosition[1] - fgkSSDStiffenerWidth) + fgkEndLadderCarbonFiberLowerJunctionLength[1]; TList* LadderCableAssemblyList[4]; const Int_t EndLadderCablesNumber = 4; for(Int_t i=0; iAddNode((TGeoVolume*)LadderCableAssemblyList[i]->At(i%2==0?0:1), i<2?1:2,LadderCableCombiTransMatrix[i]); } return Ladder; } //////////////////////////////////////////////////////////////////////////////// TGeoVolume* AliITSv11GeometrySSD::GetLayer(Int_t iLayer){ TGeoVolume* Layer = new TGeoVolumeAssembly(iLayer==5 ? "ITSssdLayer5" : "ITSssdLayer6"); TGeoVolume* Ladder = GetLadder(iLayer); ///////////////////////////////////////////////////// // Setting the CombiTransformation to pass ITS center ///////////////////////////////////////////////////// Double_t ITSCenterTransZ = iLayer==5 ? fgkSSDLay5LadderLength - fgkLay5CenterITSPosition: fgkSSDLay6LadderLength - fgkLay6CenterITSPosition; Double_t ITSSensorYTrans = fgkSSDModuleCoolingBlockToSensor + 0.5* fgkCoolingTubeSupportHeight -(iLayer==5 ? fgkSSDSensorSideSupportHeight[1] - fgkSSDSensorSideSupportHeight[0]: 0.); TGeoRotation* ITSCenterRot[3]; ITSCenterRot[0] = new TGeoRotation("ITSCenterRot0",90.,180.,-90.); ITSCenterRot[1] = new TGeoRotation("ITSCenterRot1",0.,90.,0.); ITSCenterRot[2] = new TGeoRotation((*ITSCenterRot[1])*(*ITSCenterRot[0])); TGeoCombiTrans* ITSCenterCombiTrans = new TGeoCombiTrans("ITSCenterCombiTrans",0., fgkSSDMountingBlockHeight[1]+ITSSensorYTrans, fgkEndLadderCarbonFiberLowerJunctionLength[1] - ITSCenterTransZ,ITSCenterRot[2]); ///////////////////////////////////////////////////// // Setting the Ladder into the Layer ///////////////////////////////////////////////////// Double_t LayLadderAnglePosition = 360./(iLayer==5 ? fgkSSDLay5LadderNumber : fgkSSDLay6LadderNumber); Int_t LayLadderNumber = iLayer==5 ? fgkSSDLay5LadderNumber : fgkSSDLay6LadderNumber; Double_t LayRadiusMin = iLayer==5 ? fgkSSDLay5RadiusMin : fgkSSDLay6RadiusMin; Double_t LayRadiusMax = iLayer==5 ? fgkSSDLay5RadiusMax : fgkSSDLay6RadiusMax; TGeoCombiTrans* LadderCombiTrans[LayLadderNumber]; TGeoHMatrix* LadderHMatrix[LayLadderNumber]; Double_t LayerRadius = 0.; char LadderCombiTransName[30], LadderRotName[30]; for(Int_t i=0; iAddNode(Ladder,i+1,LadderHMatrix[i]); } return Layer; } //////////////////////////////////////////////////////////////////////////////// void AliITSv11GeometrySSD::Layer5(TGeoVolume* moth){ //////////////////////////////////////////////////////////////////////////////// // Insert the layer 5 in the mother volume. //////////////////////////////////////////////////////////////////////////////// if(! moth){ cout << "Error::AliITSv11GeometrySSD: Can't insert layer5, mother is null!"<< endl; return; } fMotherVol = moth; moth->AddNode(GetLayer(5),1,0); } //////////////////////////////////////////////////////////////////////////////// void AliITSv11GeometrySSD::Layer6(TGeoVolume* moth){ //////////////////////////////////////////////////////////////////////////////// // Insert the layer 6 in the mother volume. //////////////////////////////////////////////////////////////////////////////// if(! moth){ cout << "Error::AliITSv11GeometrySSD: Can't insert layer6, mother is null!"<< endl; return; } fMotherVol = moth; moth->AddNode(GetLayer(6),1,0); } //////////////////////////////////////////////////////////////////////////////// TGeoArb8* AliITSv11GeometrySSD::GetTrapezoidShape(TVector3* vertexpos[], Double_t* width, Double_t height, char* shapename){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 4; const Int_t TransVectNumber = 2; TVector3* Vertex[VertexNumber]; TVector3* TransVector[2]; for(Int_t i=0; iSetVertex(i,Vertex[(iX(), Vertex[(iY()); return TrapezoidShape; } //////////////////////////////////////////////////////////////////////////////// TGeoArb8* AliITSv11GeometrySSD::GetArbShape(TVector3* vertexpos[], Double_t* width, Double_t height, char* shapename, Int_t isign){ const Int_t VertexNumber = 8; const Int_t TransVectNumber = 2; TVector3* Vertex[VertexNumber]; TVector3* TransVector[2]; for(Int_t i=0; iSetVertex(i,Vertex[i]->X(),Vertex[i]->Y()); return ArbShape; } //////////////////////////////////////////////////////////////////////////////// TGeoArb8* AliITSv11GeometrySSD::GetTriangleShape(TVector3* vertexpos[], Double_t height, char* shapename){ //////////////////////////////////////////////////////////////////////////////// const Int_t VertexNumber = 4; TVector3* Vertex[VertexNumber]; ////////////////////////////////////// //Setting the vertices for TGeoArb8 //////////////////////////////////// for(Int_t i = 0; iSetVertex(i,Vertex[(i < VertexNumber ? i: i-VertexNumber)]->X(), Vertex[(i < VertexNumber ? i : i-VertexNumber)]->Y()); return TriangleShape; } //////////////////////////////////////////////////////////////////////////////// TVector3* AliITSv11GeometrySSD::GetReflection(TVector3* Vector,Double_t* Param){ //////////////////////////////////////////////////////////////////////////////// TVector3* n = new TVector3(Param[0],Param[1],Param[2]); Double_t D = ((*Vector)*(*n)+Param[3])/n->Mag2(); TVector3* ReflectedVector = new TVector3(*Vector-2*D*(*n)); return ReflectedVector; } //////////////////////////////////////////////////////////////////////////////// TGeoCombiTrans* AliITSv11GeometrySSD::AddTranslationToCombiTrans(TGeoCombiTrans* ct, Double_t dx, Double_t dy, Double_t dz) const{ TGeoCombiTrans* CombiTrans = new TGeoCombiTrans(*ct); // Add a dx,dy,dz translation to the initial TGeoCombiTrans const Double_t *vect = CombiTrans->GetTranslation(); Double_t newVect[3] = {vect[0]+dx, vect[1]+dy, vect[2]+dz}; CombiTrans->SetTranslation(newVect); return CombiTrans; } //////////////////////////////////////////////////////////////////////////////// //To be interfaced with AliRoot Materials file //////////////////////////////////////////////////////////////////////////////// TGeoMedium* AliITSv11GeometrySSD::GetMedium(const char* mediumName) { char ch[30]; sprintf(ch, "ITS_%s",mediumName); TGeoMedium* medium = gGeoManager->GetMedium(ch); if (! medium) printf("Error(AliITSv11GeometrySSD)::medium %s not found !\n", mediumName); return medium; } //////////////////////////////////////////////////////////////////////////////// //To be interfaced with AliRoot Materials file //////////////////////////////////////////////////////////////////////////////// /*void AliITSv11GeometrySSD::CreateMaterials(){ /////////////////////////////////// // This part has to be modified /////////////////////////////////// // Float_t ifield = 2.000; // Float_t fieldm = 10.000; // Int_t ifield = gAlice->Field()->Integ(); // Float_t fieldm = gAlice->Field()->Max(); /////////////////////////////////// // Silicon for Sensor /////////////////////////////////// Int_t SINumber = 0; TGeoMaterial* SiMaterial = new TGeoMaterial("SiMaterial"); TGeoMedium* Silicon = new TGeoMedium("Silicon",SINumber,SiMaterial); fgkSSDSensorMedium = Silicon; /////////////////////////////////// // Silicon Mixture for Sensor /////////////////////////////////// Int_t SiMixtureNumber = 1; TGeoMaterial* SiMixtureMaterial = new TGeoMaterial("SiMixtureMaterial"); TGeoMedium* SiliconMixture = new TGeoMedium("SiliconMixture",SiMixtureNumber,SiMixtureMaterial); fgkSSDChipMedium = SiliconMixture; /////////////////////////////////// // Stiffener Components Materials /////////////////////////////////// Int_t K1100Number = 2; TGeoMaterial* K1100Material = new TGeoMaterial("K1100Material"); TGeoMedium* K1100 = new TGeoMedium("K1100",K1100Number,K1100Material); fgkSSDStiffenerMedium = K1100; /////////////////////////// // Stiffener Connectors /////////////////////////// Int_t SnMaterialNumber = 3; TGeoMaterial* SnMaterial = new TGeoMaterial("SnMaterial"); TGeoMedium* SnMedium = new TGeoMedium("SnMedium",SnMaterialNumber, SnMaterial); fgkSSDStiffenerConnectorMedium = SnMedium; //////////////////////////////// // Stiffener 0603-1812 Capacitor //////////////////////////////// Int_t Al2O3Number = 4; TGeoMaterial* Al2O3Material = new TGeoMaterial("Al2O3Material"); TGeoMedium* Al2O3Medium = new TGeoMedium("Al2O3Medium", Al2O3Number, Al2O3Material); fgkSSDStiffener0603CapacitorMedium = Al2O3Medium; fgkSSDStiffener1812CapacitorMedium = Al2O3Medium; /////////////////////////// // Stiffener Hybrid Wire /////////////////////////// Int_t CuHybridWireNumber = 5; TGeoMaterial* CuHybridWireMaterial = new TGeoMaterial("CuHybridWireMaterial"); TGeoMedium* CuHybridWireMedium = new TGeoMedium("CuHybridWireMedium", CuHybridWireNumber, CuHybridWireMaterial); fgkSSDStiffenerHybridWireMedium = CuHybridWireMedium; /////////////////////////// // Al for Cooling Block /////////////////////////// Int_t AlCoolBlockNumber = 6; TGeoMaterial* AlCoolBlockMaterial = new TGeoMaterial("AlCoolBlockMaterial"); TGeoMedium* AlCoolBlockMedium = new TGeoMedium("AlCoolBlockMedium", AlCoolBlockNumber, AlCoolBlockMaterial); fgkSSDAlCoolBlockMedium = AlCoolBlockMedium; ////////////////////////////////////////////////////// // Kapton and Al for Chip Cable Flex and Ladder Cables ////////////////////////////////////////////////////// Int_t KaptonBlockNumber = 7; TGeoMaterial* KaptonMaterial = new TGeoMaterial("KaptonMaterial"); TGeoMedium* KaptonMedium = new TGeoMedium("KaptonMedium", KaptonBlockNumber, KaptonMaterial); Int_t AlTraceBlockNumber = 8; TGeoMaterial* AlTraceMaterial = new TGeoMaterial("AlTraceMaterial"); TGeoMedium* AlTraceMedium = new TGeoMedium("AlTraceMedium", AlTraceBlockNumber, AlTraceMaterial); fgkSSDKaptonChipCableMedium = KaptonMedium; fgkSSDAlTraceChipCableMedium = AlTraceMedium; fgkSSDKaptonFlexMedium = KaptonMedium; fgkSSDAlTraceFlexMedium = AlTraceMedium; fgkSSDKaptonLadderCableMedium = KaptonMedium; fgkSSDAlTraceLadderCableMedium = AlTraceMedium; ///////////////////////////////////////////////////////////////// // M55J for Carbon Fiber, CarbonFiber Lower Support and Junction ////////////////////////////////////////////////////////////////// Int_t M55JNumber = 9; TGeoMaterial* M55JMaterial = new TGeoMaterial("M55JMaterial"); TGeoMedium* M55JMedium = new TGeoMedium("M55JMedium",M55JNumber, M55JMaterial); fgkSSDCarbonFiberMedium = M55JMedium; fgkSSDMountingBlockMedium = M55JMedium; ///////////////////////////////////////////////////////////////// // G10 for Detector Leg, TubeHolder ////////////////////////////////////////////////////////////////// Int_t G10Number = 10; TGeoMaterial* G10Material = new TGeoMaterial("G10Material"); TGeoMedium* G10Medium = new TGeoMedium("G10Medium",G10Number, G10Material); fgkSSDTubeHolderMedium = G10Medium; fgkSSDSensorSupportMedium = G10Medium; ///////////////////////////////////////////////////////////////// // Water and Phynox for Cooling Tube ////////////////////////////////////////////////////////////////// Int_t WaterNumber = 11; TGeoMaterial* WaterMaterial = new TGeoMaterial("WaterMaterial"); TGeoMedium* WaterMedium = new TGeoMedium("WaterMedium",WaterNumber, WaterMaterial); fgkSSDCoolingTubeWater = WaterMedium; Int_t PhynoxNumber = 12; TGeoMaterial* PhynoxMaterial = new TGeoMaterial("PhynoxMaterial"); TGeoMedium* PhynoxMedium = new TGeoMedium("PhynoxMedium",PhynoxNumber, PhynoxMaterial); fgkSSDCoolingTubePhynox = PhynoxMedium; } */ void AliITSv11GeometrySSD::CreateMaterials(){ /////////////////////////////////// // This part has to be modified /////////////////////////////////// /////////////////////////////////// // Silicon for Sensor /////////////////////////////////// fgkSSDSensorMedium = GetMedium("Si"); /////////////////////////////////// // Silicon Mixture for Sensor /////////////////////////////////// fgkSSDChipMedium = GetMedium("SPD SI CHIP$"); fgkSSDChipGlueMedium = GetMedium("EPOXY$"); /////////////////////////////////// // Stiffener Components Materials /////////////////////////////////// fgkSSDStiffenerMedium = GetMedium("ITSsddCarbonM55J"); /////////////////////////// // Stiffener Connectors /////////////////////////// fgkSSDStiffenerConnectorMedium = GetMedium("COPPER"); //////////////////////////////// // Stiffener 0603-1812 Capacitor //////////////////////////////// fgkSSDStiffener0603CapacitorMedium = GetMedium("SDD ruby sph. Al2O3"); fgkSSDStiffener1812CapacitorMedium = GetMedium("SDD ruby sph. Al2O3"); /////////////////////////// // Stiffener Hybrid Wire /////////////////////////// fgkSSDStiffenerHybridWireMedium = GetMedium("COPPER"); /////////////////////////// // Al for Cooling Block /////////////////////////// fgkSSDAlCoolBlockMedium = GetMedium("ITSal"); ////////////////////////////////////////////////////// // Kapton and Al for Chip Cable Flex and Ladder Cables ////////////////////////////////////////////////////// fgkSSDKaptonChipCableMedium = GetMedium("KAPTONH(POLYCH2)"); fgkSSDAlTraceChipCableMedium = GetMedium("ITSal"); fgkSSDKaptonFlexMedium = GetMedium("KAPTONH(POLYCH2)"); fgkSSDAlTraceFlexMedium = GetMedium("ITSal"); fgkSSDKaptonLadderCableMedium = GetMedium("KAPTONH(POLYCH2)"); fgkSSDAlTraceLadderCableMedium = GetMedium("ITSal"); ///////////////////////////////////////////////////////////////// // M55J for Carbon Fiber, CarbonFiber Lower Support and Junction ////////////////////////////////////////////////////////////////// fgkSSDCarbonFiberMedium = GetMedium("GEN C (M55J)$"); ///////////////////////////////////////////////////////////////// // G10 for Detector Leg, TubeHolder ////////////////////////////////////////////////////////////////// fgkSSDTubeHolderMedium = GetMedium("G10FR4$"); fgkSSDSensorSupportMedium = GetMedium("G10FR4$"); fgkSSDMountingBlockMedium = GetMedium("G10FR4$"); fgkSSDMountingBlockMedium = GetMedium("G10FR4$"); ///////////////////////////////////////////////////////////////// // Water and Phynox for Cooling Tube ////////////////////////////////////////////////////////////////// fgkSSDCoolingTubeWater = GetMedium("WATER"); fgkSSDCoolingTubePhynox = GetMedium("INOX$"); } /////////////////////////////////////////////////////////////////////