--- /dev/null
+/**************************************************************************
+ * Copyright(c) 2007-2009, ALICE Experiment at CERN, All rights reserved. *
+ * *
+ * Author: The ALICE Off-line Project. *
+ * Contributors are mentioned in the code where appropriate. *
+ * *
+ * Permission to use, copy, modify and distribute this software and its *
+ * documentation strictly for non-commercial purposes is hereby granted *
+ * without fee, provided that the above copyright notice appears in all *
+ * copies and that both the copyright notice and this permission notice *
+ * appear in the supporting documentation. The authors make no claims *
+ * about the suitability of this software for any purpose. It is *
+ * provided "as is" without express or implied warranty. *
+ **************************************************************************/
+
+
+/* $Id: AliITSUv0.cxx */
+
+
+//========================================================================
+//
+// Geometry for the Upgrade of the Inner Tracking System
+//
+// Mario Sitta (sitta@to.infn.it)
+// Chinorat Kobdaj (kobdaj@g.sut.ac.th)
+//
+//========================================================================
+
+
+
+// $Log: AliITSUv0.cxx,v $
+
+#include <TClonesArray.h>
+#include <TGeoGlobalMagField.h>
+#include <TGeoManager.h>
+#include <TGeoMatrix.h>
+#include <TGeoPhysicalNode.h>
+#include <TGeoVolume.h>
+#include <TGeoXtru.h>
+#include <TLorentzVector.h>
+#include <TString.h>
+#include <TVirtualMC.h>
+
+#include "AliITSU.h"
+#include "AliITSUHit.h"
+#include "AliLog.h"
+#include "AliMC.h"
+#include "AliMagF.h"
+#include "AliRun.h"
+#include "AliTrackReference.h"
+#include "AliITSv11Geometry.h"
+#include "AliITSUv0Layer.h"
+#include "AliITSUv0.h"
+#include "AliITSUGeomTGeo.h"
+#include "AliGeomManager.h"
+using namespace TMath;
+
+
+ClassImp(AliITSUv0)
+
+//______________________________________________________________________
+AliITSUv0::AliITSUv0()
+: fLayTurbo(0)
+ ,fLayPhi0(0)
+ ,fLayRadii(0)
+ ,fLayZLength(0)
+ ,fLaddPerLay(0)
+ ,fModPerLadd(0)
+ ,fLadThick(0)
+ ,fLadWidth(0)
+ ,fLadTilt(0)
+ ,fDetThick(0)
+ ,fDetTypeID(0)
+ ,fBuildLevel(0)
+ ,fUpGeom(0)
+ ,fStaveModel(kModel0)
+{
+ // Standard default constructor
+ // Inputs:
+ // none.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+}
+
+//______________________________________________________________________
+AliITSUv0::AliITSUv0(const char *title,const Int_t nlay)
+ :AliITSU(title,nlay)
+ ,fLayTurbo(0)
+ ,fLayPhi0(0)
+ ,fLayRadii(0)
+ ,fLayZLength(0)
+ ,fLaddPerLay(0)
+ ,fModPerLadd(0)
+ ,fLadThick(0)
+ ,fLadWidth(0)
+ ,fLadTilt(0)
+ ,fDetThick(0)
+ ,fDetTypeID(0)
+ ,fBuildLevel(0)
+ ,fUpGeom(0)
+ ,fStaveModel(kModel0)
+{
+ // Standard constructor for the Upgrade geometry.
+ // Inputs:
+ // const char * name Ignored, set to "ITS"
+ // const char * title Arbitrary title
+ // const Int_t nlay Number of layers
+ //
+ fLayerName = new TString[fNLayers];
+ //
+ for (Int_t j=0; j<fNLayers; j++)
+ fLayerName[j].Form("%s%d",AliITSUGeomTGeo::GetITSSensorPattern(),j); // See AliITSUv0Layer
+ //
+ fLayTurbo = new Bool_t[fNLayers];
+ fLayPhi0 = new Double_t[fNLayers];
+ fLayRadii = new Double_t[fNLayers];
+ fLayZLength = new Double_t[fNLayers];
+ fLaddPerLay = new Int_t[fNLayers];
+ fModPerLadd = new Int_t[fNLayers];
+ fLadThick = new Double_t[fNLayers];
+ fLadWidth = new Double_t[fNLayers];
+ fLadTilt = new Double_t[fNLayers];
+ fDetThick = new Double_t[fNLayers];
+ fDetTypeID = new UInt_t[fNLayers];
+ fBuildLevel = new Int_t[fNLayers];
+
+
+ fUpGeom = new AliITSUv0Layer*[fNLayers];
+
+ if (fNLayers > 0) { // if not, we'll Fatal-ize in CreateGeometry
+ for (Int_t j=0; j<fNLayers; j++) {
+ fLayPhi0[j] = 0;
+ fLayRadii[j] = 0.;
+ fLayZLength[j] = 0.;
+ fLaddPerLay[j] = 0;
+ fModPerLadd[j] = 0;
+ fLadWidth[j] = 0.;
+ fDetThick[j] = 0.;
+ fDetTypeID[j] = 0;
+ fBuildLevel[j] = 0;
+ fUpGeom[j] = 0;
+ }
+ }
+}
+
+//______________________________________________________________________
+AliITSUv0::~AliITSUv0() {
+ // Standard destructor
+ // Inputs:
+ // none.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+ delete [] fLayTurbo;
+ delete [] fLayPhi0;
+ delete [] fLayRadii;
+ delete [] fLayZLength;
+ delete [] fLaddPerLay;
+ delete [] fModPerLadd;
+ delete [] fLadThick;
+ delete [] fLadWidth;
+ delete [] fLadTilt;
+ delete [] fDetThick;
+ delete [] fDetTypeID;
+ delete [] fBuildLevel;
+ delete [] fUpGeom;
+
+}
+
+//______________________________________________________________________
+void AliITSUv0::AddAlignableVolumes() const{
+ // Creates entries for alignable volumes associating the symbolic volume
+ // name with the corresponding volume path.
+ //
+ // Records in the alignable entries the transformation matrices converting
+ // TGeo local coordinates (in the RS of alignable volumes) to the tracking
+ // system
+ // For this, this function has to run before the misalignment because we
+ // are using the ideal positions in the AliITSgeom object.
+ // Inputs:
+ // none.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+
+ AliInfo("Add ITS alignable volumes");
+
+ if (!gGeoManager) { AliFatal("TGeoManager doesn't exist !"); return; }
+ TString pth;
+ //
+ pth = Form("ALIC_1/%s_2",AliITSUGeomTGeo::GetITSVolPattern());
+ // RS: to be checked with MS
+ if( !gGeoManager->SetAlignableEntry(AliITSUGeomTGeo::ComposeSymNameITS(),pth.Data()) )
+ AliFatal(Form("Unable to set alignable entry ! %s :: %s","ITS",pth.Data()));
+ //
+ int modNum = 0;
+ //
+ for (int lr=0; lr<fNLayers; lr++) {
+ //
+ pth = Form("ALIC_1/%s_2/%s%d_1",AliITSUGeomTGeo::GetITSVolPattern(),AliITSUGeomTGeo::GetITSLayerPattern(),lr);
+ //printf("SetAlignable: %s %s\n",snm.Data(),pth.Data());
+ gGeoManager->SetAlignableEntry(AliITSUGeomTGeo::ComposeSymNameLayer(lr),pth.Data());
+ //
+ for (int ld=0; ld<fLaddPerLay[lr]; ld++) {
+ //
+ TString pthL = Form("%s/%s%d_%d",pth.Data(),AliITSUGeomTGeo::GetITSLadderPattern(),lr,ld);
+ //printf("SetAlignable: %s %s\n",snmL.Data(),pthL.Data());
+ gGeoManager->SetAlignableEntry(AliITSUGeomTGeo::ComposeSymNameLadder(lr,ld),pthL.Data());
+ //
+ for (int md=0; md<fModPerLadd[lr]; md++) {
+ //
+ TString pthM = Form("%s/%s%d_%d",pthL.Data(),AliITSUGeomTGeo::GetITSModulePattern(),lr,md);
+ //
+ // RS: Attention, this is a hack: AliGeomManager cannot accomodate all ITSU modules w/o
+ // conflicts with TPC. For this reason we define the UID of the module to be simply its ID
+ // int modUID = AliGeomManager::LayerToVolUID(lr+1,modNum++); // here modNum would be module within the layer
+ int modUID = AliITSUGeomTGeo::ModuleVolUID( modNum++ );
+ //
+ gGeoManager->SetAlignableEntry(AliITSUGeomTGeo::ComposeSymNameModule(lr,ld,md),pthM.Data(),modUID);
+ //
+ }
+ }
+ }
+ //
+}
+
+//______________________________________________________________________
+void AliITSUv0::CreateGeometry() {
+
+ // Create the geometry and insert it in the mother volume ITSV
+ TGeoManager *geoManager = gGeoManager;
+
+ TGeoVolume *vALIC = geoManager->GetVolume("ALIC");
+
+ new TGeoVolumeAssembly(AliITSUGeomTGeo::GetITSVolPattern());
+ TGeoVolume *vITSV = geoManager->GetVolume(AliITSUGeomTGeo::GetITSVolPattern());
+ vALIC->AddNode(vITSV, 2, 0); // Copy number is 2 to cheat AliGeoManager::CheckSymNamesLUT
+
+ //
+ const Int_t kLength=100;
+ Char_t vstrng[kLength] = "xxxRS"; //?
+ vITSV->SetTitle(vstrng);
+ //
+ // Check that we have all needed parameters
+ if (fNLayers <= 0) AliFatal(Form("Wrong number of layers (%d)",fNLayers));
+ //
+ for (Int_t j=0; j<fNLayers; j++) {
+ if (fLayRadii[j] <= 0) AliFatal(Form("Wrong layer radius for layer %d (%f)",j,fLayRadii[j]));
+ if (fLayZLength[j] <= 0) AliFatal(Form("Wrong layer length for layer %d (%f)",j,fLayZLength[j]));
+ if (fLaddPerLay[j] <= 0) AliFatal(Form("Wrong number of ladders for layer %d (%d)",j,fLaddPerLay[j]));
+ if (fModPerLadd[j] <= 0) AliFatal(Form("Wrong number of modules for layer %d (%d)",j,fModPerLadd[j]));
+ if (fLadThick[j] < 0) AliFatal(Form("Wrong ladder thickness for layer %d (%f)",j,fLadThick[j]));
+ if (fLayTurbo[j] && fLadWidth[j] <= 0) AliFatal(Form("Wrong ladder width for layer %d (%f)",j,fLadWidth[j]));
+ if (fDetThick[j] < 0) AliFatal(Form("Wrong module thickness for layer %d (%f)",j,fDetThick[j]));
+ //
+ if (j > 0) {
+ if (fLayRadii[j]<=fLayRadii[j-1]) AliFatal(Form("Layer %d radius (%f) is smaller than layer %d radius (%f)",
+ j,fLayRadii[j],j-1,fLayRadii[j-1]));
+ } // if (j > 0)
+
+ if (fLadThick[j] == 0) AliInfo(Form("Ladder thickness for layer %d not set, using default",j));
+ if (fDetThick[j] == 0) AliInfo(Form("Module thickness for layer %d not set, using default",j));
+
+ } // for (Int_t j=0; j<fNLayers; j++)
+
+ // Now create the actual geometry
+ for (Int_t j=0; j<fNLayers; j++) {
+ if (fLayTurbo[j]) {
+ fUpGeom[j] = new AliITSUv0Layer(j,kTRUE,kFALSE);
+ fUpGeom[j]->SetLadderWidth(fLadWidth[j]);
+ fUpGeom[j]->SetLadderTilt(fLadTilt[j]);
+ }
+ else fUpGeom[j] = new AliITSUv0Layer(j,kFALSE);
+ //
+ fUpGeom[j]->SetPhi0(fLayPhi0[j]);
+ fUpGeom[j]->SetRadius(fLayRadii[j]);
+ fUpGeom[j]->SetZLength(fLayZLength[j]);
+ fUpGeom[j]->SetNLadders(fLaddPerLay[j]);
+ fUpGeom[j]->SetNModules(fModPerLadd[j]);
+ fUpGeom[j]->SetDetType(fDetTypeID[j]);
+ fUpGeom[j]->SetBuildLevel(fBuildLevel[j]);
+ fUpGeom[j]->SetStaveModel(fStaveModel);
+ AliDebug(1,Form("fBuildLevel: %d\n",fBuildLevel[j]));
+ //
+ if (fLadThick[j] != 0) fUpGeom[j]->SetLadderThick(fLadThick[j]);
+ if (fDetThick[j] != 0) fUpGeom[j]->SetSensorThick(fDetThick[j]);
+ fUpGeom[j]->CreateLayer(vITSV);
+ }
+ //
+}
+
+//______________________________________________________________________
+void AliITSUv0::CreateMaterials() {
+ // Create ITS materials
+ // This function defines the default materials used in the Geant
+ // Monte Carlo simulations for the geometries AliITSv1, AliITSv3,
+ // AliITSv11Hybrid.
+ // In general it is automatically replaced by
+ // the CreateMaterials routine defined in AliITSv?. Should the function
+ // CreateMaterials not exist for the geometry version you are using this
+ // one is used. See the definition found in AliITSv5 or the other routine
+ // for a complete definition.
+ // Inputs:
+ // none.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+
+ Int_t ifield = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Integ();
+ Float_t fieldm = ((AliMagF*)TGeoGlobalMagField::Instance()->GetField())->Max();
+
+ Float_t tmaxfd = 0.1; // 1.0; // Degree
+ Float_t stemax = 1.0; // cm
+ Float_t deemax = 0.1; // 30.0; // Fraction of particle's energy 0<deemax<=1
+ Float_t epsil = 1.0E-4; // 1.0; // cm
+ Float_t stmin = 0.0; // cm "Default value used"
+
+ Float_t tmaxfdSi = 0.1; // .10000E+01; // Degree
+ Float_t stemaxSi = 0.0075; // .10000E+01; // cm
+ Float_t deemaxSi = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
+ Float_t epsilSi = 1.0E-4;// .10000E+01;
+ Float_t stminSi = 0.0; // cm "Default value used"
+
+ Float_t tmaxfdAir = 0.1; // .10000E+01; // Degree
+ Float_t stemaxAir = .10000E+01; // cm
+ Float_t deemaxAir = 0.1; // 0.30000E-02; // Fraction of particle's energy 0<deemax<=1
+ Float_t epsilAir = 1.0E-4;// .10000E+01;
+ Float_t stminAir = 0.0; // cm "Default value used"
+
+ // AIR
+ Float_t aAir[4]={12.0107,14.0067,15.9994,39.948};
+ Float_t zAir[4]={6.,7.,8.,18.};
+ Float_t wAir[4]={0.000124,0.755267,0.231781,0.012827};
+ Float_t dAir = 1.20479E-3;
+
+ // Water
+ Float_t aWater[2]={1.00794,15.9994};
+ Float_t zWater[2]={1.,8.};
+ Float_t wWater[2]={0.111894,0.888106};
+ Float_t dWater = 1.0;
+
+
+ // Kapton
+ Float_t aKapton[4]={1.00794,12.0107, 14.010,15.9994};
+ Float_t zKapton[4]={1.,6.,7.,8.};
+ Float_t wKapton[4]={0.026362,0.69113,0.07327,0.209235};
+ Float_t dKapton = 1.42;
+
+ AliMixture(1,"AIR$",aAir,zAir,dAir,4,wAir);
+ AliMedium(1, "AIR$",1,0,ifield,fieldm,tmaxfdAir,stemaxAir,deemaxAir,epsilAir,stminAir);
+
+ AliMixture(2,"WATER$",aWater,zWater,dWater,2,wWater);
+ AliMedium(2, "WATER$",2,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
+
+ AliMaterial(3,"SI$",0.28086E+02,0.14000E+02,0.23300E+01,0.93600E+01,0.99900E+03);
+ AliMedium(3, "SI$",3,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+
+ AliMaterial(4,"BERILLIUM$",9.01, 4., 1.848, 35.3, 36.7);// From AliPIPEv3
+ AliMedium(4, "BERILLIUM$",4,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
+
+ AliMaterial(5,"COPPER$",0.63546E+02,0.29000E+02,0.89600E+01,0.14300E+01,0.99900E+03);
+ AliMedium(5, "COPPER$",5,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
+
+
+ // needed for STAVE , Carbon, kapton, Epoxy, flexcable
+
+ //AliMaterial(6,"CARBON$",12.0107,6,2.210,999,999);
+ AliMaterial(6,"CARBON$",12.0107,6,2.210/1.3,999,999);
+ AliMedium(6, "CARBON$",6,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+
+ AliMixture(7,"KAPTON(POLYCH2)$", aKapton, zKapton, dKapton, 4, wKapton);
+ AliMedium(7, "KAPTON(POLYCH2)$",7,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
+
+
+
+ // values below modified as compared to source AliITSv11 !
+
+ //AliMaterial(7,"GLUE$",0.12011E+02,0.60000E+01,0.1930E+01/2.015,999,999); // original
+ AliMaterial(7,"GLUE$",12.011,6,1.93/2.015,999,999); // conform with ATLAS, Corrado, Stefan
+ AliMedium(7, "GLUE$",7,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
+
+ // All types of carbon
+ // Unidirectional prepreg
+ AliMaterial(8,"K13D2U2k$",12.0107,6,1.643,999,999);
+ AliMedium(8, "K13D2U2k$",8,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+ //Impregnated thread
+ AliMaterial(9,"M60J3K$",12.0107,6,2.21,999,999);
+ AliMedium(9, "M60J3K$",9,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+ //Impregnated thread
+ AliMaterial(10,"M55J6K$",12.0107,6,1.63,999,999);
+ AliMedium(10, "M55J6K$",10,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+ // Fabric(0/90)
+ AliMaterial(11,"T300$",12.0107,6,1.725,999,999);
+ AliMedium(11, "T300$",11,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+ //AMEC Thermasol
+ AliMaterial(12,"FGS003$",12.0107,6,1.6,999,999);
+ AliMedium(12, "FGS003$",12,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+ // Carbon fleece
+ AliMaterial(13,"CarbonFleece$",12.0107,6,0.4,999,999);
+ AliMedium(13, "CarbonFleece$",13,0,ifield,fieldm,tmaxfdSi,stemaxSi,deemaxSi,epsilSi,stminSi);
+
+ // Flex cable
+ Float_t aFCm[5]={12.0107,1.00794,14.0067,15.9994,26.981538};
+ Float_t zFCm[5]={6.,1.,7.,8.,13.};
+ Float_t wFCm[5]={0.520088819984,0.01983871336,0.0551367996,0.157399667056, 0.247536};
+ //Float_t dFCm = 1.6087; // original
+ //Float_t dFCm = 2.55; // conform with STAR
+ Float_t dFCm = 2.595; // conform with Corrado
+
+ AliMixture(14,"FLEXCABLE$",aFCm,zFCm,dFCm,5,wFCm);
+ AliMedium(14, "FLEXCABLE$",14,0,ifield,fieldm,tmaxfd,stemax,deemax,epsil,stmin);
+
+}
+
+//______________________________________________________________________
+void AliITSUv0::DefineLayer(const Int_t nlay, const double phi0, const Double_t r,
+ const Double_t zlen, const Int_t nladd,
+ const Int_t nmod, const Double_t lthick,
+ const Double_t dthick, const UInt_t dettypeID)
+{
+ // Sets the layer parameters
+ // Inputs:
+ // nlay layer number
+ // phi0 layer phi0
+ // r layer radius
+ // zlen layer length
+ // nladd number of ladders
+ // nmod number of modules per ladder
+ // lthick ladder thickness (if omitted, defaults to 0)
+ // dthick detector thickness (if omitted, defaults to 0)
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+
+ if (nlay >= fNLayers || nlay < 0) {
+ AliError(Form("Wrong layer number (%d)",nlay));
+ return;
+ }
+
+ fLayTurbo[nlay] = kFALSE;
+ fLayPhi0[nlay] = phi0;
+ fLayRadii[nlay] = r;
+ fLayZLength[nlay] = zlen;
+ fLaddPerLay[nlay] = nladd;
+ fModPerLadd[nlay] = nmod;
+ fLadThick[nlay] = lthick;
+ fDetThick[nlay] = dthick;
+ fDetTypeID[nlay] = dettypeID;
+
+}
+
+//______________________________________________________________________
+void AliITSUv0::DefineLayerTurbo(Int_t nlay, Double_t phi0, Double_t r, Double_t zlen, Int_t nladd,
+ Int_t nmod, Double_t width, Double_t tilt,
+ Double_t lthick,Double_t dthick,
+ UInt_t dettypeID, Int_t buildLevel)
+{
+ // Sets the layer parameters for a "turbo" layer
+ // (i.e. a layer whose ladders overlap in phi)
+ // Inputs:
+ // nlay layer number
+ // phi0 phi of 1st ladder
+ // r layer radius
+ // zlen layer length
+ // nladd number of ladders
+ // nmod number of modules per ladder
+ // width ladder width
+ // tilt layer tilt angle (degrees)
+ // lthick ladder thickness (if omitted, defaults to 0)
+ // dthick detector thickness (if omitted, defaults to 0)
+ // dettypeID ??
+ // buildLevel (if 0, all geometry is build, used for material budget studies)
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+
+ if (nlay >= fNLayers || nlay < 0) {
+ AliError(Form("Wrong layer number (%d)",nlay));
+ return;
+ }
+
+ fLayTurbo[nlay] = kTRUE;
+ fLayPhi0[nlay] = phi0;
+ fLayRadii[nlay] = r;
+ fLayZLength[nlay] = zlen;
+ fLaddPerLay[nlay] = nladd;
+ fModPerLadd[nlay] = nmod;
+ fLadThick[nlay] = lthick;
+ fLadWidth[nlay] = width;
+ fLadTilt[nlay] = tilt;
+ fDetThick[nlay] = dthick;
+ fDetTypeID[nlay] = dettypeID;
+ fBuildLevel[nlay] = buildLevel;
+
+}
+
+//______________________________________________________________________
+void AliITSUv0::GetLayerParameters(Int_t nlay, Double_t &phi0,
+ Double_t &r, Double_t &zlen,
+ Int_t &nladd, Int_t &nmod,
+ Double_t &width, Double_t &tilt,
+ Double_t <hick, Double_t &dthick,
+ UInt_t &dettype) const
+{
+ // Gets the layer parameters
+ // Inputs:
+ // nlay layer number
+ // Outputs:
+ // phi0 phi of 1st ladder
+ // r layer radius
+ // zlen layer length
+ // nladd number of ladders
+ // nmod number of modules per ladder
+ // width ladder width
+ // tilt ladder tilt angle
+ // lthick ladder thickness
+ // dthick detector thickness
+ // dettype detector type
+ // Return:
+ // none.
+
+ if (nlay >= fNLayers || nlay < 0) {
+ AliError(Form("Wrong layer number (%d)",nlay));
+ return;
+ }
+
+ phi0 = fLayPhi0[nlay];
+ r = fLayRadii[nlay];
+ zlen = fLayZLength[nlay];
+ nladd = fLaddPerLay[nlay];
+ nmod = fModPerLadd[nlay];
+ width = fLadWidth[nlay];
+ tilt = fLadTilt[nlay];
+ lthick = fLadThick[nlay];
+ dthick = fDetThick[nlay];
+ dettype= fDetTypeID[nlay];
+}
+
+//______________________________________________________________________
+void AliITSUv0::Init()
+{
+ // Initialise the ITS after it has been created.
+ UpdateInternalGeometry();
+ AliITSU::Init();
+ //
+}
+
+//______________________________________________________________________
+Bool_t AliITSUv0::IsLayerTurbo(Int_t nlay)
+{
+ // Returns true if the layer is a "turbo" layer
+ if ( nlay < 0 || nlay > fNLayers ) {
+ AliError(Form("Wrong layer number %d",nlay));
+ return kFALSE;
+ }
+ else return fUpGeom[nlay]->IsTurbo();
+}
+
+//______________________________________________________________________
+void AliITSUv0::SetDefaults()
+{
+ // sets the default segmentation, response, digit and raw cluster classes
+}
+
+//______________________________________________________________________
+void AliITSUv0::StepManager()
+{
+ // Called for every step in the ITS, then calles the AliITSUHit class
+ // creator with the information to be recoreded about that hit.
+ // The value of the macro ALIITSPRINTGEOM if set to 1 will allow the
+ // printing of information to a file which can be used to create a .det
+ // file read in by the routine CreateGeometry(). If set to 0 or any other
+ // value except 1, the default behavior, then no such file is created nor
+ // it the extra variables and the like used in the printing allocated.
+ // Inputs:
+ // none.
+ // Outputs:
+ // none.
+ // Return:
+ // none.
+ if(!(this->IsActive())) return;
+ if(!(gMC->TrackCharge())) return;
+ //
+ Int_t copy, lay = 0;
+ Int_t id = gMC->CurrentVolID(copy);
+
+ Bool_t notSens = kFALSE;
+ while ((lay<fNLayers) && (notSens = (id!=fIdSens[lay]))) ++lay;
+ //printf("R: %.1f | Lay: %d NotSens: %d\n",positionRS.Pt(), lay, notSens);
+
+ if (notSens) return;
+
+ if(gMC->IsTrackExiting()) {
+ AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kITS);
+ } // if Outer ITS mother Volume
+
+ static TLorentzVector position, momentum; // Saves on calls to construtors
+ static AliITSUHit hit;// Saves on calls to constructors
+
+ TClonesArray &lhits = *(Hits());
+ Int_t cpn0, cpn1, mod, status = 0;
+ //
+ // Track status
+ if(gMC->IsTrackInside()) status += 1;
+ if(gMC->IsTrackEntering()) status += 2;
+ if(gMC->IsTrackExiting()) status += 4;
+ if(gMC->IsTrackOut()) status += 8;
+ if(gMC->IsTrackDisappeared()) status += 16;
+ if(gMC->IsTrackStop()) status += 32;
+ if(gMC->IsTrackAlive()) status += 64;
+
+ //
+ // retrieve the indices with the volume path
+ //
+ if (lay < 0 || lay >= fNLayers) {
+ AliError(Form("Invalid value: lay=%d. Not an ITS sensitive volume",lay));
+ return; // not an ITS sensitive volume.
+ } else {
+ copy = 1;
+ gMC->CurrentVolOffID(1,cpn1);
+ gMC->CurrentVolOffID(2,cpn0);
+ } //
+
+ mod = fGeomTGeo->GetModuleIndex(lay,cpn0,cpn1);
+ //RS2DEL fInitGeom.DecodeDetector(mod,lay+1,cpn0,cpn1,copy);
+ //
+ // Fill hit structure.
+ //
+ hit.SetModule(mod);
+ hit.SetTrack(gAlice->GetMCApp()->GetCurrentTrackNumber());
+ gMC->TrackPosition(position);
+ gMC->TrackMomentum(momentum);
+ hit.SetPosition(position);
+ hit.SetTime(gMC->TrackTime());
+ hit.SetMomentum(momentum);
+ hit.SetStatus(status);
+ hit.SetEdep(gMC->Edep());
+ hit.SetShunt(GetIshunt());
+ if(gMC->IsTrackEntering()){
+ hit.SetStartPosition(position);
+ hit.SetStartTime(gMC->TrackTime());
+ hit.SetStartStatus(status);
+ return; // don't save entering hit.
+ } // end if IsEntering
+ // Fill hit structure with this new hit.
+ //Info("StepManager","Calling Copy Constructor");
+ new(lhits[fNhits++]) AliITSUHit(hit); // Use Copy Construtor.
+ // Save old position... for next hit.
+ hit.SetStartPosition(position);
+ hit.SetStartTime(gMC->TrackTime());
+ hit.SetStartStatus(status);
+
+ return;
+}
+
+//______________________________________________________________________
+void AliITSUv0::SetLayerDetTypeID(Int_t lr, UInt_t id)
+{
+ // set det type
+ if (!fDetTypeID || fNLayers<=lr) AliFatal(Form("Number of layers %d, %d is manipulated",fNLayers,lr));
+ fDetTypeID[lr] = id;
+}
+
+//______________________________________________________________________
+Int_t AliITSUv0::GetLayerDetTypeID(Int_t lr)
+{
+ // set det type
+ if (!fDetTypeID || fNLayers<=lr) AliFatal(Form("Number of layers %d, %d is manipulated",fNLayers,lr));
+ return fDetTypeID[lr];
+}
--- /dev/null
+/**************************************************************************\r
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *\r
+ * *\r
+ * Author: The ALICE Off-line Project. *\r
+ * Contributors are mentioned in the code where appropriate. *\r
+ * *\r
+ * Permission to use, copy, modify and distribute this software and its *\r
+ * documentation strictly for non-commercial purposes is hereby granted *\r
+ * without fee, provided that the above copyright notice appears in all *\r
+ * copies and that both the copyright notice and this permission notice *\r
+ * appear in the supporting documentation. The authors make no claims *\r
+ * about the suitability of this software for any purpose. It is *\r
+ * provided "as is" without express or implied warranty. *\r
+ **************************************************************************/\r
+\r
+//*************************************************************************\r
+// This class Defines the Geometry for the ITS Upgrade using TGeo\r
+// This is a work class used to study different configurations\r
+// during the development of the new ITS structure.\r
+//\r
+// Mario Sitta <sitta@to.infn.it>\r
+// Chinorat Kobdaj (kobdaj@g.sut.ac.th)\r
+//*************************************************************************\r
+\r
+\r
+/* $Id: AliITSUv0Layer.cxx */\r
+// General Root includes\r
+#include <TMath.h>\r
+// Root Geometry includes\r
+//#include <AliLog.h>\r
+#include <TGeoManager.h>\r
+#include <TGeoVolume.h>\r
+#include <TGeoPcon.h>\r
+#include <TGeoCone.h>\r
+#include <TGeoTube.h> // contaings TGeoTubeSeg\r
+#include <TGeoArb8.h>\r
+#include <TGeoXtru.h>\r
+#include <TGeoCompositeShape.h>\r
+#include <TGeoMatrix.h>\r
+#include "AliITSUv0Layer.h"\r
+#include "AliITSUGeomTGeo.h"\r
+#include <TGeoBBox.h>\r
+#include <TGeoShape.h>\r
+#include <TGeoTrd1.h>\r
+using namespace TMath;\r
+\r
+const Double_t AliITSUv0Layer::fgkDefaultSensorThick = 300*fgkmicron;\r
+const Double_t AliITSUv0Layer::fgkDefaultLadderThick = 1*fgkcm;\r
+\r
+ClassImp(AliITSUv0Layer)\r
+\r
+#define SQ(A) (A)*(A)\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer::AliITSUv0Layer(): \r
+ AliITSv11Geometry(),\r
+ fLayerNumber(0),\r
+ fPhi0(0),\r
+ fLayRadius(0),\r
+ fZLength(0),\r
+ fSensorThick(0),\r
+ fLadderThick(0),\r
+ fLadderWidth(0),\r
+ fLadderTilt(0),\r
+ fNLadders(0),\r
+ fNModules(0),\r
+ fDetTypeID(0),\r
+ fIsTurbo(0),\r
+ fBuildLevel(0),\r
+ fStaveModel(kModel0)\r
+{\r
+ //\r
+ // Standard constructor\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer::AliITSUv0Layer(Int_t debug): \r
+ AliITSv11Geometry(debug),\r
+ fLayerNumber(0),\r
+ fPhi0(0),\r
+ fLayRadius(0),\r
+ fZLength(0),\r
+ fSensorThick(0),\r
+ fLadderThick(0),\r
+ fLadderWidth(0),\r
+ fLadderTilt(0),\r
+ fNLadders(0),\r
+ fNModules(0),\r
+ fDetTypeID(0),\r
+ fIsTurbo(0),\r
+ fBuildLevel(0),\r
+ fStaveModel(kModel0)\r
+{\r
+ //\r
+ // Constructor setting debugging level\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer::AliITSUv0Layer(Int_t lay, Int_t debug): \r
+ AliITSv11Geometry(debug),\r
+ fLayerNumber(lay),\r
+ fPhi0(0),\r
+ fLayRadius(0),\r
+ fZLength(0),\r
+ fSensorThick(0),\r
+ fLadderThick(0),\r
+ fLadderWidth(0),\r
+ fLadderTilt(0),\r
+ fNLadders(0),\r
+ fNModules(0),\r
+ fDetTypeID(0),\r
+ fIsTurbo(0),\r
+ fBuildLevel(0),\r
+ fStaveModel(kModel0)\r
+{\r
+ //\r
+ // Constructor setting layer number and debugging level\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer::AliITSUv0Layer(Int_t lay, Bool_t turbo, Int_t debug): \r
+ AliITSv11Geometry(debug),\r
+ fLayerNumber(lay),\r
+ fPhi0(0),\r
+ fLayRadius(0),\r
+ fZLength(0),\r
+ fSensorThick(0),\r
+ fLadderThick(0),\r
+ fLadderWidth(0),\r
+ fLadderTilt(0),\r
+ fNLadders(0),\r
+ fNModules(0),\r
+ fDetTypeID(0),\r
+ fIsTurbo(turbo),\r
+ fBuildLevel(0),\r
+ fStaveModel(kModel0)\r
+{\r
+ //\r
+ // Constructor setting layer number and debugging level\r
+ // for a "turbo" layer (i.e. where ladders overlap in phi)\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer::AliITSUv0Layer(const AliITSUv0Layer &s):\r
+ AliITSv11Geometry(s.GetDebug()),\r
+ fLayerNumber(s.fLayerNumber),\r
+ fPhi0(s.fPhi0),\r
+ fLayRadius(s.fLayRadius),\r
+ fZLength(s.fZLength),\r
+ fSensorThick(s.fSensorThick),\r
+ fLadderThick(s.fLadderThick),\r
+ fLadderWidth(s.fLadderWidth),\r
+ fLadderTilt(s.fLadderTilt),\r
+ fNLadders(s.fNLadders),\r
+ fNModules(s.fNModules),\r
+ fDetTypeID(s.fDetTypeID),\r
+ fIsTurbo(s.fIsTurbo),\r
+ fBuildLevel(s.fBuildLevel),\r
+ fStaveModel(s.fStaveModel)\r
+{\r
+ //\r
+ // Copy constructor\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer& AliITSUv0Layer::operator=(const AliITSUv0Layer &s)\r
+{\r
+ //\r
+ // Assignment operator \r
+ //\r
+ if(&s == this) return *this;\r
+\r
+ fLayerNumber = s.fLayerNumber;\r
+ fPhi0 = s.fPhi0;\r
+ fLayRadius = s.fLayRadius;\r
+ fZLength = s.fZLength;\r
+ fSensorThick = s.fSensorThick;\r
+ fLadderThick = s.fLadderThick;\r
+ fLadderWidth = s.fLadderWidth;\r
+ fLadderTilt = s.fLadderTilt;\r
+ fNLadders = s.fNLadders;\r
+ fNModules = s.fNModules;\r
+ fIsTurbo = s.fIsTurbo;\r
+ fDetTypeID = s.fDetTypeID;\r
+ fBuildLevel = s.fBuildLevel;\r
+ fStaveModel = s.fStaveModel;\r
+\r
+ return *this;\r
+}\r
+\r
+//________________________________________________________________________\r
+AliITSUv0Layer::~AliITSUv0Layer() {\r
+ //\r
+ // Destructor\r
+ //\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliITSUv0Layer::CreateLayer(TGeoVolume *moth){\r
+//\r
+// Creates the actual Layer and places inside its mother volume\r
+//\r
+// Input:\r
+// moth : the TGeoVolume owing the volume structure\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 17 Jun 2011 Mario Sitta\r
+// Updated: 08 Jul 2011 Mario Sitta\r
+// Updated: 20 May 2013 Mario Sitta Layer is Assembly instead of Tube\r
+//\r
+ // Local variables\r
+ char volname[30];\r
+ Double_t xpos, ypos, zpos;\r
+ Double_t alpha;\r
+\r
+\r
+ // Check if the user set the proper parameters\r
+ if (fLayRadius <= 0) AliFatal(Form("Wrong layer radius (%f)",fLayRadius));\r
+ if (fZLength <= 0) AliFatal(Form("Wrong layer length (%f)",fZLength));\r
+ if (fNLadders <= 0) AliFatal(Form("Wrong number of ladders (%d)",fNLadders));\r
+ if (fNModules <= 0) AliFatal(Form("Wrong number of modules (%d)",fNModules));\r
+\r
+ if (fLadderThick <= 0) {\r
+ AliInfo(Form("Ladder thickness wrong or not set (%f), using default (%f)",\r
+ fLadderThick,fgkDefaultLadderThick));\r
+ fLadderThick = fgkDefaultLadderThick;\r
+ }\r
+\r
+ if (fSensorThick <= 0) {\r
+ AliInfo(Form("Sensor thickness wrong or not set (%f), using default (%f)",\r
+ fSensorThick,fgkDefaultSensorThick));\r
+ fSensorThick = fgkDefaultSensorThick;\r
+ }\r
+\r
+ if (fSensorThick > fLadderThick) {\r
+ AliWarning(Form("Sensor thickness (%f) is greater than ladder thickness (%f), fixing",\r
+ fSensorThick,fLadderThick));\r
+ fSensorThick = fLadderThick;\r
+ }\r
+\r
+\r
+ // If a Turbo layer is requested, do it and exit\r
+ if (fIsTurbo) {\r
+ CreateLayerTurbo(moth);\r
+ return;\r
+ }\r
+\r
+\r
+ // First create the ladder container\r
+ alpha = (360./(2*fNLadders))*DegToRad();\r
+\r
+ // fLadderWidth = fLayRadius*Tan(alpha);\r
+\r
+ snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSLayerPattern(),fLayerNumber);\r
+ TGeoVolume *layVol = new TGeoVolumeAssembly(volname);\r
+ layVol->SetUniqueID(fDetTypeID);\r
+\r
+// layVol->SetVisibility(kFALSE);\r
+ layVol->SetVisibility(kTRUE);\r
+ layVol->SetLineColor(1);\r
+\r
+ TGeoVolume *laddVol = CreateLadder();\r
+\r
+\r
+ // Now build up the layer\r
+ alpha = 360./fNLadders;\r
+ Double_t r = fLayRadius + ((TGeoBBox*)laddVol->GetShape())->GetDY();\r
+ for (Int_t j=0; j<fNLadders; j++) {\r
+ Double_t phi = j*alpha + fPhi0;\r
+ xpos = r*CosD(phi);// r*SinD(-phi);\r
+ ypos = r*SinD(phi);// r*CosD(-phi);\r
+ zpos = 0.;\r
+ phi += 90;\r
+ layVol->AddNode(laddVol, j, new TGeoCombiTrans( xpos, ypos, zpos,\r
+ new TGeoRotation("",phi,0,0)));\r
+ }\r
+\r
+\r
+ // Finally put everything in the mother volume\r
+ moth->AddNode(layVol, 1, 0);\r
+\r
+\r
+ // Upgrade geometry is served\r
+ return;\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliITSUv0Layer::CreateLayerTurbo(TGeoVolume *moth){\r
+//\r
+// Creates the actual Layer and places inside its mother volume\r
+// A so-called "turbo" layer is a layer where ladders overlap in phi\r
+// User can set width and tilt angle, no check is performed here\r
+// to avoid volume overlaps\r
+//\r
+// Input:\r
+// moth : the TGeoVolume owing the volume structure\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 08 Jul 2011 Mario Sitta\r
+// Updated: 08 Mar 2012 Mario Sitta Correct way to compute container R\r
+// Updated: 20 May 2013 Mario Sitta Layer is Assemgbly instead of Tube\r
+//\r
+\r
+\r
+ // Local variables\r
+ char volname[30];\r
+ Double_t xpos, ypos, zpos;\r
+ Double_t alpha;\r
+\r
+\r
+ // Check if the user set the proper (remaining) parameters\r
+ if (fLadderWidth <= 0)\r
+ AliFatal(Form("Wrong ladder width (%f)",fLadderWidth));\r
+ if (Abs(fLadderTilt) > 45)\r
+ AliWarning(Form("Ladder tilt angle (%f) greater than 45deg",fLadderTilt));\r
+\r
+\r
+ snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSLayerPattern(), fLayerNumber);\r
+ TGeoVolume *layVol = new TGeoVolumeAssembly(volname);\r
+ layVol->SetUniqueID(fDetTypeID);\r
+ layVol->SetVisibility(kTRUE);\r
+ layVol->SetLineColor(1);\r
+ TGeoVolume *laddVol = CreateLadder();\r
+\r
+\r
+ // Now build up the layer\r
+\r
+\r
+ // Now build up the layer\r
+ alpha = 360./fNLadders;\r
+ Double_t r = fLayRadius + ((TGeoBBox*)laddVol->GetShape())->GetDY();\r
+ for (Int_t j=0; j<fNLadders; j++) {\r
+ Double_t phi = j*alpha + fPhi0;\r
+ xpos = r*CosD(phi);// r*SinD(-phi);\r
+ ypos = r*SinD(phi);// r*CosD(-phi);\r
+ zpos = 0.;\r
+ phi += 90;\r
+ layVol->AddNode(laddVol, j, new TGeoCombiTrans( xpos, ypos, zpos,\r
+ new TGeoRotation("", phi-fLadderTilt,0,0)));\r
+ }\r
+\r
+\r
+ // Finally put everything in the mother volume\r
+ moth->AddNode(layVol, 1, 0);\r
+\r
+ return;\r
+}\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateLadder(const TGeoManager *mgr){\r
+//\r
+// Creates the actual Ladder\r
+//\r
+// Input:\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Jun 2011 Mario Sitta\r
+//\r
+\r
+ char volname[30];\r
+ Double_t xlen, ylen, zlen;\r
+ Double_t xpos, ypos, zpos, zmod;\r
+ Double_t alpha;\r
+\r
+\r
+ // First create all needed shapes\r
+ alpha = (360./(2*fNLadders))*DegToRad();\r
+\r
+ // The ladder\r
+ xlen = fLayRadius*Tan(alpha);\r
+ if (fIsTurbo) xlen = 0.5*fLadderWidth;\r
+ ylen = 0.5*fLadderThick;\r
+ zlen = 0.5*fZLength;\r
+\r
+ Double_t yplus = 0.46;\r
+ // Double_t origin[]={0,-yplus/2,0};\r
+ // TGeoBBox *ladder = new TGeoBBox(xlen, ylen+yplus/2, zlen, origin);\r
+ TGeoXtru *ladder = new TGeoXtru(2); //z sections\r
+ Double_t xv[5] = {xlen,xlen,0,-xlen,-xlen};\r
+ Double_t yv[5] = {ylen+0.09,-0.15,-yplus-fSensorThick,-0.15,ylen+0.09}; \r
+ ladder->DefinePolygon(5,xv,yv);\r
+ ladder->DefineSection(0,-zlen,0,0,1.);\r
+ ladder->DefineSection(1,+zlen,0,0,1.);\r
+ \r
+\r
+ // We have all shapes: now create the real volumes\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+\r
+ snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSLadderPattern(), fLayerNumber);\r
+ TGeoVolume *laddVol = new TGeoVolume(volname, ladder, medAir);\r
+\r
+ // laddVol->SetVisibility(kFALSE);\r
+ laddVol->SetVisibility(kTRUE);\r
+ laddVol->SetLineColor(2);\r
+ TGeoVolume *modVol = CreateModule(xlen,ylen, zlen);\r
+\r
+\r
+ // Now build up the ladder\r
+ zmod = ((TGeoBBox*)modVol->GetShape())->GetDZ();\r
+ for (Int_t j=0; j<fNModules; j++) {\r
+ xpos = 0.;\r
+ ypos = 0.01; // Remove small overlap - M.S: 21may13\r
+ zpos = -ladder->GetDZ() + j*2*zmod + zmod;\r
+ laddVol->AddNode(modVol, j, new TGeoTranslation(xpos, ypos, zpos));\r
+ }\r
+ \r
+\r
+ // put mechanical stave structure, only inner barrel up to now\r
+ if (fLayerNumber<3) {\r
+ TGeoVolume *mechLaddVol = CreateStaveStruct(xlen,zlen); \r
+ if (mechLaddVol)\r
+ laddVol->AddNode(mechLaddVol, fNModules, new TGeoCombiTrans(0, -0.15-ylen, 0, new TGeoRotation("",0, 0, 180)));\r
+ }\r
+ \r
+\r
+ // Done, return the ladder\r
+ return laddVol;\r
+}\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveStruct(const Double_t xlad,\r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Create the mechanical stave structure\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Mar 2013 Chinorat Kobdaj\r
+// Updated: 26 Apr 2013 Mario Sitta\r
+//\r
+\r
+ TGeoVolume *mechLaddVol = 0;\r
+\r
+ switch (fStaveModel) {\r
+ case kModelDummy:\r
+ mechLaddVol = CreateStaveModelDummy(xlad,zlad,mgr);\r
+ break;\r
+ case kModel0:\r
+ mechLaddVol = CreateStaveModel0(xlad,zlad,mgr);\r
+ break;\r
+ case kModel1:\r
+ mechLaddVol = CreateStaveModel1(xlad,zlad,mgr);\r
+ break;\r
+ case kModel21:\r
+ mechLaddVol = CreateStaveModel21(xlad,zlad,mgr);\r
+ break;\r
+ case kModel22:\r
+ mechLaddVol = CreateStaveModel22(xlad,zlad,mgr);\r
+ break;\r
+ case kModel3:\r
+ mechLaddVol = CreateStaveModel3(xlad,zlad,mgr);\r
+ break;\r
+ default:\r
+ AliFatal(Form("Unknown stave model %d",fStaveModel));\r
+ break;\r
+ }\r
+\r
+ return mechLaddVol; \r
+}\r
+\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveModelDummy(const Double_t ,\r
+ const Double_t ,\r
+ const TGeoManager *){\r
+//\r
+// Create dummy stave\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Mar 2013 Chinorat Kobdaj\r
+// Updated: 26 Apr 2013 Mario Sitta\r
+//\r
+\r
+ // Done, return the stave structur\r
+ return 0;\r
+}\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveModel0(const Double_t xlad,\r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Create the mechanical stave structure for Model 0 of TDR\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Mar 2013 Chinorat Kobdaj\r
+// Updated: 26 Apr 2013 Mario Sitta\r
+//\r
+ \r
+ // Materials defined in AliITSUv0\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+ TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");\r
+\r
+ TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$"); \r
+ TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");\r
+ TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");\r
+ TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");\r
+\r
+ // Local parameters\r
+ Double_t kConeOutRadius = 0.15/2;\r
+ Double_t kConeInRadius = 0.1430/2;\r
+ Double_t kStaveLength = zlad*2;\r
+ Double_t kStaveWidth = xlad*2-kConeOutRadius*2;\r
+ Double_t kWidth = kStaveWidth/4;//1/2 of kWidth\r
+ Double_t kStaveHeight = 0.3;\r
+ Double_t kHeight = kStaveHeight/2;\r
+ Double_t kAlpha = 90-67;//90-33.69;\r
+ Double_t kTheta = kAlpha*TMath::DegToRad();\r
+ Double_t kS1 = kWidth/TMath::Sin(kTheta);\r
+ Double_t kL1 = kWidth/TMath::Tan(kTheta);\r
+ Double_t kS2 = TMath::Sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(the2);\r
+ Double_t kThe2 = TMath::ATan(kHeight/kS1);\r
+ Double_t kBeta = kThe2*TMath::RadToDeg();\r
+ // Int_t loop = kStaveLength/(kL1);\r
+ // Double_t s3 = kWidth/(2*TMath::Sin(kTheta));\r
+ // Double_t s4 = 3*kWidth/(2*TMath::Sin(kTheta));\r
+\r
+ AliDebug(1, Form("BuildLevel %d\n",fBuildLevel));\r
+\r
+ char volname[30];\r
+ snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSLadderPattern(), fLayerNumber);\r
+\r
+ Double_t z=0, y=-0.011+0.0150, x=0;\r
+\r
+ TGeoVolume *mechLaddVol = 0;\r
+\r
+ if (fBuildLevel < 5) {\r
+\r
+ // world (trapezoid)\r
+ TGeoXtru *mechStruct = new TGeoXtru(2); //z sections\r
+ Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};\r
+ Double_t yv[5] = {-kConeOutRadius*2-0.07,0,kStaveHeight,0,-kConeOutRadius*2-0.07}; \r
+ mechStruct->DefinePolygon(5,xv,yv);\r
+ mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);\r
+ mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);\r
+\r
+ mechLaddVol = new TGeoVolume(volname, mechStruct, medAir);\r
+ mechLaddVol->SetLineColor(12);\r
+ mechLaddVol->SetFillColor(12); \r
+ mechLaddVol->SetVisibility(kTRUE);\r
+ \r
+ // detailed structure ++++++++++++++\r
+ //Pipe Kapton grey-35\r
+ TGeoTube *coolTube = new TGeoTube(kConeInRadius,kConeOutRadius,kStaveLength/2);\r
+ TGeoVolume *volCoolTube= new TGeoVolume("pipe", coolTube, medKapton);\r
+ volCoolTube->SetFillColor(35);\r
+ volCoolTube->SetLineColor(35);\r
+ mechLaddVol->AddNode(volCoolTube,0,new TGeoTranslation(x+(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));\r
+ mechLaddVol->AddNode(volCoolTube,1,new TGeoTranslation(x-(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));\r
+ }\r
+\r
+ if (fBuildLevel < 4) {\r
+ TGeoTube *coolTubeW = new TGeoTube(0.,kConeInRadius,kStaveLength/2);\r
+ TGeoVolume *volCoolTubeW= new TGeoVolume("pipeWater", coolTubeW, medWater);\r
+ volCoolTubeW->SetFillColor(4);\r
+ volCoolTubeW->SetLineColor(4);\r
+ mechLaddVol->AddNode(volCoolTubeW,0,new TGeoTranslation(x+(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));\r
+ mechLaddVol->AddNode(volCoolTubeW,1,new TGeoTranslation(x-(kStaveWidth/2),y-(kHeight-kConeOutRadius),0));\r
+ }\r
+\r
+ //frequency of filament\r
+ //n = 4 means very dense(4 filaments per interval)\r
+ //n = 2 means dense(2 filaments per interval)\r
+ Int_t n =4;\r
+ Int_t loop = (Int_t)(kStaveLength/(4*kL1/n) + 2/n)-1;\r
+ if (fBuildLevel < 3) {\r
+ //Top CFRP Filament black-12 Carbon structure TGeoBBox (length,thickness,width)\r
+ TGeoBBox *t2=new TGeoBBox(kS2,0.007/2,0.15/2);//(kS2,0.002,0.02);\r
+ TGeoVolume *volT2=new TGeoVolume("TopFilament", t2, medM60J3K);\r
+ volT2->SetLineColor(12);\r
+ volT2->SetFillColor(12); \r
+\r
+ for(int i=1;i<loop;i++){ //i<60;i++){\r
+ mechLaddVol->AddNode(volT2,4*i+0,\r
+ new TGeoCombiTrans(x+kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),\r
+ new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));\r
+ mechLaddVol->AddNode(volT2,4*i+1,\r
+ new TGeoCombiTrans(x-kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),\r
+ new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));\r
+ mechLaddVol->AddNode(volT2,4*i+2,\r
+ new TGeoCombiTrans(x+kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1),\r
+ new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));\r
+ mechLaddVol->AddNode(volT2,4*i+3,\r
+ new TGeoCombiTrans(x-kWidth,y+(2*kConeOutRadius),z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2,//z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));\r
+ }\r
+\r
+\r
+ //Bottom CFRP Filament black-12 Carbon structure TGeoBBox (thickness,width,length)\r
+ TGeoBBox *t1=new TGeoBBox(0.007/2,0.15/2,kS1);//(0.002,0.02,kS1);\r
+ TGeoVolume *volT1=new TGeoVolume("CFRPBottom", t1, medM60J3K);\r
+ volT1->SetLineColor(12);\r
+ volT1->SetFillColor(12); \r
+\r
+ for(int i=1;i<loop;i++){\r
+ mechLaddVol->AddNode(volT1,4*i+0,\r
+ new TGeoCombiTrans(x+kWidth,y-kHeight,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volT1",-90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+1,\r
+ new TGeoCombiTrans(x-kWidth,y-kHeight,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volT1",90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+2,\r
+ new TGeoCombiTrans(x+kWidth,y-kHeight,z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2, //z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volT1",-90,-kAlpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+3,\r
+ new TGeoCombiTrans(x-kWidth,y-kHeight,z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2, //z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volT1",-90,+kAlpha,0)));\r
+ }\r
+ }\r
+ \r
+ if (fBuildLevel < 2) {\r
+ // Glue CFRP-Silicon layers TGeoBBox(thickness,width,kS1);\r
+ TGeoBBox *tG=new TGeoBBox(0.0075/2,0.18/2,kS1);\r
+ TGeoVolume *volTG=new TGeoVolume("Glue1", tG, medGlue);\r
+ volTG->SetLineColor(5);\r
+ volTG->SetFillColor(5); \r
+\r
+ for(int i=1;i<loop;i++){ //i<60;i++){\r
+ mechLaddVol->AddNode(volTG,4*i+0,\r
+ new TGeoCombiTrans(x+kWidth,y-0.16,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(2*kL1*i), \r
+ new TGeoRotation("volTG",-90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volTG,4*i+1,\r
+ new TGeoCombiTrans(x-kWidth,y-0.16,z-kStaveLength/2+((4/n)*kL1*i)+kS1/2, //z-14.25+(2*kL1*i), \r
+ new TGeoRotation("volTG",90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volTG,4*i+2,\r
+ new TGeoCombiTrans(x+kWidth,y-0.16,z-kStaveLength/2+((4/n)*i*kL1)+kS1/2, //z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volTG",-90,-kAlpha,0)));\r
+ mechLaddVol->AddNode(volTG,4*i+3,\r
+ new TGeoCombiTrans(x-kWidth,y-0.16,z-kStaveLength/2+(i*(4/n)*kL1)+kS1/2, //z-14.25+(i*2*kL1), \r
+ new TGeoRotation("volTG",-90,+kAlpha,0)));\r
+ }\r
+\r
+ TGeoBBox *glue = new TGeoBBox(xlad, 0.005/2, zlad);\r
+ TGeoVolume *volGlue=new TGeoVolume("Glue2", glue, medGlue);\r
+ volGlue->SetLineColor(5);\r
+ volGlue->SetFillColor(5); \r
+ //mechLaddVol->AddNode(volGlue, 0, new TGeoCombiTrans(x, y-0.16, z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volGlue, 1, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+\r
+ if (fBuildLevel < 1) {\r
+ //Flex cable brown-28 TGeoBBox(width,thickness,length); \r
+ TGeoBBox *kapCable = new TGeoBBox(xlad, 0.01/2, zlad);\r
+ TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);\r
+ volCable->SetLineColor(28);\r
+ volCable->SetFillColor(28); \r
+ mechLaddVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005-0.01, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+\r
+ // Done, return the stave structur\r
+ return mechLaddVol;\r
+}\r
+\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveModel1(const Double_t xlad,\r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Create the mechanical stave structure for Model 1 of TDR\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Mar 2013 Chinorat Kobdaj\r
+// Updated: 26 Apr 2013 Mario Sitta\r
+//\r
+ \r
+ // Materials defined in AliITSUv0\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+ TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");\r
+\r
+ TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$"); \r
+ TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");\r
+ TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");\r
+ TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");\r
+\r
+ // Local parameters\r
+ Double_t kConeOutRadius = 0.15/2;\r
+ // Double_t kConeInRadius = 0.1430/2;\r
+ Double_t kStaveLength = zlad*2;\r
+ // Double_t kStaveWidth = xlad*2-kConeOutRadius*2;\r
+ Double_t kStaveWidth = xlad*2;\r
+ Double_t kWidth = kStaveWidth/4;//1/2 of kWidth\r
+ Double_t kStaveHeight = 0.3;\r
+ Double_t kHeight = kStaveHeight/2;\r
+ Double_t kAlpha = 90-33.;//90-30;\r
+ Double_t kTheta = kAlpha*TMath::DegToRad();\r
+ Double_t kS1 = kWidth/TMath::Sin(kTheta);\r
+ Double_t kL1 = kWidth/TMath::Tan(kTheta);\r
+ Double_t kS2 = TMath::Sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(the2);\r
+ Double_t kThe2 = TMath::ATan(kHeight/kS1);\r
+ Double_t kBeta = kThe2*TMath::RadToDeg();\r
+ Int_t loop = (Int_t)((kStaveLength/(2*kL1))/2);\r
+ \r
+\r
+ TGeoVolume *mechLaddVol = 0;\r
+\r
+ char volname[30];\r
+ snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSLadderPattern(), fLayerNumber);\r
+ \r
+\r
+ // detailed structure ++++++++++++++\r
+ Double_t z=0, y=-0.011+0.0150, x=0;\r
+\r
+ // Polimide micro channels numbers\r
+ Double_t yMC = y-kHeight+0.01;\r
+ Int_t nb = (Int_t)(kStaveWidth/0.1)+1;\r
+ Double_t xladMC = (nb*0.1-0.08)/2;\r
+\r
+\r
+ if (fBuildLevel < 5) {\r
+ // world (trapezoid)\r
+ TGeoXtru *mechStruct = new TGeoXtru(2); //z sections\r
+ Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};\r
+ Double_t yv[5] = {-kConeOutRadius*2-0.07,0,kStaveHeight,0,-kConeOutRadius*2-0.07}; \r
+ mechStruct->DefinePolygon(5,xv,yv);\r
+ mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);\r
+ mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);\r
+\r
+ mechLaddVol = new TGeoVolume(volname, mechStruct, medAir);\r
+ mechLaddVol->SetLineColor(12);\r
+ mechLaddVol->SetFillColor(12); \r
+ mechLaddVol->SetVisibility(kTRUE);\r
+ \r
+ // Polimide micro channels numbers\r
+ TGeoBBox *tM0=new TGeoBBox(xladMC, 0.005/2, zlad);\r
+ TGeoVolume *volTM0=new TGeoVolume("MicroChanCover", tM0, medKapton);\r
+ volTM0->SetLineColor(35);\r
+ volTM0->SetFillColor(35); \r
+ mechLaddVol->AddNode(volTM0, 0, new TGeoCombiTrans(x,-0.0125+yMC, z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0, 1, new TGeoCombiTrans(x,+0.0125+yMC, z, new TGeoRotation("",0, 0, 0)));\r
+ \r
+ TGeoBBox *tM0b=new TGeoBBox(0.02/2, 0.02/2, zlad);\r
+ TGeoVolume *volTM0b=new TGeoVolume("MicroChanWalls", tM0b, medKapton);\r
+ volTM0b->SetLineColor(35);\r
+ volTM0b->SetFillColor(35); \r
+ for (Int_t ib=0;ib<nb;ib++) {\r
+ mechLaddVol->AddNode(volTM0b, ib, new TGeoCombiTrans(x+ib*0.1-xladMC+0.01,yMC, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+ \r
+ }\r
+ \r
+ if (fBuildLevel < 4) {\r
+ // Water in Polimide micro channels\r
+ TGeoBBox *water=new TGeoBBox(0.08/2, 0.02/2, zlad+0.1);\r
+ TGeoVolume *volWater=new TGeoVolume("Water", water, medWater);\r
+ volWater->SetLineColor(4);\r
+ volWater->SetFillColor(4); \r
+ for (Int_t ib=0;ib<(nb-1);ib++) {\r
+ mechLaddVol->AddNode(volWater, ib, new TGeoCombiTrans(x+ib*0.1-xladMC+0.06,yMC, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+ }\r
+ \r
+ if (fBuildLevel < 3) {\r
+ //Bottom filament CFRP black-12 Carbon structure TGeoBBox (thickness,width,length)\r
+ Double_t filWidth = 0.04;\r
+ Double_t filHeight= 0.02;\r
+ TGeoBBox *t1=new TGeoBBox(filHeight/2,filWidth/2,kS1);\r
+ TGeoVolume *volT1=new TGeoVolume("CFRPBottom", t1, medM60J3K);\r
+ volT1->SetLineColor(12);\r
+ volT1->SetFillColor(12); \r
+ for(int i=0;i<loop;i++){//i<30;i++){\r
+ mechLaddVol->AddNode(volT1,4*i+0,\r
+ new TGeoCombiTrans(x+kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+(4*kL1)+kS1/2, \r
+ new TGeoRotation("volT1",-90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+1,\r
+ new TGeoCombiTrans(x-kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+(4*kL1*i)+kS1/2, \r
+ new TGeoRotation("volT1",90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+2,\r
+ new TGeoCombiTrans(x+kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2, \r
+ new TGeoRotation("volT1",-90,-kAlpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+3,\r
+ new TGeoCombiTrans(x-kWidth,y-kHeight+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2, \r
+ new TGeoRotation("volT1",-90,+kAlpha,0)));\r
+ }\r
+\r
+ // Top filament CFRP black-12 Carbon structure TGeoBBox (length,thickness,width)\r
+ TGeoBBox *t2=new TGeoBBox(kS2,filHeight/2,filWidth/2);\r
+ TGeoVolume *volT2=new TGeoVolume("CFRPTop", t2, medM60J3K);\r
+ volT2->SetLineColor(12);\r
+ volT2->SetFillColor(12); \r
+ for(int i=0;i<loop;i++){ //i<30;i++){\r
+ mechLaddVol->AddNode(volT2,4*i+0,\r
+ new TGeoCombiTrans(x+kWidth,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*kL1)+kS1/2,\r
+ new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));\r
+ mechLaddVol->AddNode(volT2,4*i+1,\r
+ new TGeoCombiTrans(x-kWidth,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*kL1)+kS1/2,\r
+ new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));\r
+ mechLaddVol->AddNode(volT2,4*i+2,\r
+ new TGeoCombiTrans(x+kWidth,y+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2,\r
+ new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));\r
+ mechLaddVol->AddNode(volT2,4*i+3,\r
+ new TGeoCombiTrans(x-kWidth,y+0.04+filHeight/2,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2, \r
+ new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));\r
+ }\r
+ }\r
+\r
+ if (fBuildLevel < 2) {\r
+ // Glue between filament and polimide micro channel\r
+ TGeoBBox *t3=new TGeoBBox(0.01/2,0.04,kS1);\r
+ TGeoVolume *volT3=new TGeoVolume("FilamentGlue", t3, medGlue);\r
+ volT3->SetLineColor(5);\r
+ volT3->SetFillColor(5); \r
+ for(int i=0;i<loop;i++){//i<30;i++){\r
+ mechLaddVol->AddNode(volT3,4*i+0,\r
+ new TGeoCombiTrans(x+kWidth,y-kHeight+0.0325,z-kStaveLength/2+(4*kL1*i)+kS1/2, \r
+ new TGeoRotation("volT1",-90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volT3,4*i+1,\r
+ new TGeoCombiTrans(x-kWidth,y-kHeight+0.0325,z-kStaveLength/2+(4*kL1*i)+kS1/2, \r
+ new TGeoRotation("volT1",90,kAlpha,0)));\r
+ mechLaddVol->AddNode(volT3,4*i+2,\r
+ new TGeoCombiTrans(x+kWidth,y-kHeight+0.0325,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2, \r
+ new TGeoRotation("volT1",-90,-kAlpha,0)));\r
+ mechLaddVol->AddNode(volT3,4*i+3,\r
+ new TGeoCombiTrans(x-kWidth,y-kHeight+0.0325,z-kStaveLength/2+2*kL1+(i*4*kL1)+kS1/2, \r
+ new TGeoRotation("volT1",-90,+kAlpha,0)));\r
+ }\r
+ \r
+ // Glue microchannel and sensor\r
+ TGeoBBox *glueM = new TGeoBBox(xlad, 0.01/2, zlad);\r
+ TGeoVolume *volGlueM=new TGeoVolume("MicroChanGlue", glueM, medGlue);\r
+ volGlueM->SetLineColor(5);\r
+ volGlueM->SetFillColor(5); \r
+ mechLaddVol->AddNode(volGlueM, 0, new TGeoCombiTrans(x, y-0.16, z, new TGeoRotation("",0, 0, 0)));\r
+\r
+ // Glue sensor and kapton\r
+ TGeoBBox *glue = new TGeoBBox(xlad, 0.005/2, zlad);\r
+ TGeoVolume *volGlue=new TGeoVolume("SensorGlue", glue, medGlue);\r
+ volGlue->SetLineColor(5);\r
+ volGlue->SetFillColor(5); \r
+ mechLaddVol->AddNode(volGlue, 1, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+\r
+ if (fBuildLevel < 1) {\r
+ TGeoBBox *kapCable = new TGeoBBox(xlad, 0.01/2, zlad);\r
+ TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);\r
+ volCable->SetLineColor(28);\r
+ volCable->SetFillColor(28); \r
+ mechLaddVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-0.165-fSensorThick-0.005-0.01, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+ \r
+ // Done, return the stave structur\r
+ return mechLaddVol;\r
+\r
+}\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveModel21(const Double_t xlad,\r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Create the mechanical stave structure for Model 2.1 of TDR\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Mar 2013 Chinorat Kobdaj\r
+// Updated: 26 Apr 2013 Mario Sitta\r
+//\r
+ \r
+ // Materials defined in AliITSUv0\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+ TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");\r
+\r
+ TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$"); \r
+ TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");\r
+ TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");\r
+ TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");\r
+ TGeoMedium *medK13D2U2k = mgr->GetMedium("ITS_K13D2U2k$");\r
+ TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$"); \r
+ TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$"); \r
+\r
+ // Local parameters\r
+ Double_t kConeOutRadius =0.151384/2;\r
+ Double_t kConeInRadius = 0.145034/2;\r
+ Double_t kStaveLength = zlad;\r
+ Double_t kStaveWidth = xlad*2;\r
+ Double_t kWidth = (kStaveWidth+0.005)/4;\r
+ Double_t kStaveHeigth = 0.33;//0.33;\r
+ Double_t kHeight = (kStaveHeigth+0.025)/2;\r
+ Double_t kAlpha = 57; //56.31;\r
+ Double_t kTheta = kAlpha*TMath::DegToRad();\r
+ Double_t kS1 = (kStaveWidth/4)/TMath::Sin(kTheta);\r
+ Double_t kL1 = (kStaveWidth/4)/TMath::Tan(kTheta);\r
+ Double_t kS2 = sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(the2);\r
+ Double_t kThe2 = TMath::ATan(kHeight/kS1);\r
+ Double_t kBeta = kThe2*TMath::RadToDeg();\r
+ // Double_t lay1 = 0.003157;\r
+ Double_t kLay1 = 0.003;//Amec carbon\r
+ // Double_t lay2 = 0.0043215;//C Fleece carbon\r
+ Double_t kLay2 = 0.002;//C Fleece carbon\r
+ Double_t kLay3 = 0.007;//K13D2U carbon\r
+ Int_t loop = (Int_t)(kStaveLength/(2*kL1));\r
+\r
+\r
+ char volname[30];\r
+ snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSLadderPattern(), fLayerNumber);\r
+\r
+ Double_t z=0, y=-(kConeOutRadius+0.03)+0.0385, x=0;\r
+\r
+ TGeoVolume *mechLaddVol = 0;\r
+\r
+ if (fBuildLevel < 5) {\r
+ // world (trapezoid)\r
+ TGeoXtru *mechStruct = new TGeoXtru(2); //z sections\r
+ Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};\r
+ Double_t yv[5] = {-kConeOutRadius*2-0.07,0,kStaveHeigth,0,-kConeOutRadius*2-0.07}; \r
+ mechStruct->DefinePolygon(5,xv,yv);\r
+ mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);\r
+ mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);\r
+\r
+ mechLaddVol = new TGeoVolume(volname, mechStruct, medAir);\r
+ mechLaddVol->SetLineColor(12);\r
+ mechLaddVol->SetFillColor(12); \r
+ mechLaddVol->SetVisibility(kTRUE); \r
+ \r
+ //Pipe Kapton grey-35 \r
+ TGeoCone *cone1 = new TGeoCone(kStaveLength,kConeInRadius,kConeOutRadius,kConeInRadius,kConeOutRadius);\r
+ TGeoVolume *volCone1= new TGeoVolume("PolyimidePipe", cone1, medKapton);\r
+ volCone1->SetFillColor(35);\r
+ volCone1->SetLineColor(35);\r
+ mechLaddVol->AddNode(volCone1,1,new TGeoTranslation(x+0.25,y,z));\r
+ mechLaddVol->AddNode(volCone1,2,new TGeoTranslation(x-0.25,y,z));\r
+ }\r
+\r
+ if (fBuildLevel < 4) {\r
+ \r
+ TGeoTube *coolTubeW = new TGeoTube(0.,kConeInRadius,kStaveLength);\r
+ TGeoVolume *volCoolTubeW= new TGeoVolume("Water", coolTubeW, medWater);\r
+ volCoolTubeW->SetFillColor(4);\r
+ volCoolTubeW->SetLineColor(4);\r
+ mechLaddVol->AddNode(volCoolTubeW,0,new TGeoTranslation(x-0.25,y,z));\r
+ mechLaddVol->AddNode(volCoolTubeW,1,new TGeoTranslation(x+0.25,y,z));\r
+ }\r
+\r
+ if (fBuildLevel < 3) {\r
+ //top fillament\r
+ // Top filament M60J black-12 Carbon structure TGeoBBox (length,thickness,width)\r
+ TGeoBBox *t2=new TGeoBBox(kS2,0.02/2,0.04/2); //TGeoBBox *t2=new TGeoBBox(kS2,0.01,0.02);\r
+ TGeoVolume *volT2=new TGeoVolume("TopFilament", t2, medM60J3K);\r
+ volT2->SetLineColor(12);\r
+ volT2->SetFillColor(12); \r
+ for(int i=0;i<loop;i++){// i<28;i++){\r
+ mechLaddVol->AddNode(volT2,i*4+1,new TGeoCombiTrans(x+kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));\r
+ mechLaddVol->AddNode(volT2,i*4+2,new TGeoCombiTrans(x-kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));\r
+ mechLaddVol->AddNode(volT2,i*4+3,new TGeoCombiTrans(x+kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));\r
+ mechLaddVol->AddNode(volT2,i*4+4,new TGeoCombiTrans(x-kWidth,y+kHeight+(0.12/2)-0.014+0.007,z-kStaveLength+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));\r
+// mechLaddVol->AddNode(volT2,i*4+1,new TGeoCombiTrans(x+kWidth+0.0036,y+kHeight-(0.12/2)+0.072,z+kStaveLength+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));\r
+\r
+ }\r
+ \r
+ //wall side structure out\r
+ TGeoBBox *box4 = new TGeoBBox(0.03/2,0.12/2,kStaveLength-0.50);\r
+ TGeoVolume *plate4 = new TGeoVolume("WallOut",box4,medM60J3K);\r
+ plate4->SetFillColor(35);\r
+ plate4->SetLineColor(35);\r
+ mechLaddVol->AddNode(plate4,1,new TGeoCombiTrans(x+(2*kStaveWidth/4)-(0.03/2),y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate4",0,0,0)));\r
+ mechLaddVol->AddNode(plate4,2,new TGeoCombiTrans(x-(2*kStaveWidth/4)+(0.03/2),y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate4",0,0,0)));\r
+ //wall side in\r
+ TGeoBBox *box5 = new TGeoBBox(0.015/2,0.12/2,kStaveLength-0.50);\r
+ TGeoVolume *plate5 = new TGeoVolume("WallIn",box5,medM60J3K);\r
+ plate5->SetFillColor(12);\r
+ plate5->SetLineColor(12);\r
+ mechLaddVol->AddNode(plate5,1,new TGeoCombiTrans(x+(2*kStaveWidth/4)-0.03-0.015/2,y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate5",0,0,0)));\r
+ mechLaddVol->AddNode(plate5,2,new TGeoCombiTrans(x-(2*kStaveWidth/4)+0.03+0.015/2,y-0.0022-kConeOutRadius+0.12/2+0.007,z,new TGeoRotation("plate5",0,0,0)));\r
+\r
+ //Amec Thermasol red-2 cover tube FGS300\r
+ TGeoConeSeg *cons1 = new TGeoConeSeg(kStaveLength-0.50,kConeOutRadius,kConeOutRadius+kLay1,kConeOutRadius,kConeOutRadius+kLay1,0,180);\r
+ TGeoVolume *Cone11 = new TGeoVolume("ThermasolPipeCover",cons1,medFGS003);\r
+ Cone11->SetFillColor(2);\r
+ Cone11->SetLineColor(2);\r
+ mechLaddVol->AddNode(Cone11,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("Cone11",0,0,0)));\r
+ mechLaddVol->AddNode(Cone11,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("Cone11",0,0,0)));\r
+\r
+ TGeoBBox *box2 = new TGeoBBox((0.50-(2*kConeOutRadius))/2,kLay1/2,kStaveLength-0.50);\r
+ TGeoVolume *plate2 = new TGeoVolume("ThermasolMiddle",box2,medFGS003);\r
+ plate2->SetFillColor(2);\r
+ plate2->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate2,1,new TGeoCombiTrans(x,y-kConeOutRadius+(kLay1/2),z,new TGeoRotation("plate2",0,0,0)));\r
+\r
+ TGeoBBox *box21 = new TGeoBBox((0.75-0.25-kConeOutRadius-kLay1)/2,kLay1/2,kStaveLength-0.50);\r
+ TGeoVolume *plate21 = new TGeoVolume("ThermasolLeftRight",box21,medFGS003);\r
+ plate21->SetFillColor(2);\r
+ plate21->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate21,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(0.75-0.25-kConeOutRadius)/2-(kLay1/2),y-kConeOutRadius+(kLay1/2),z,new TGeoRotation("plate21",0,0,0)));\r
+ mechLaddVol->AddNode(plate21,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-(0.75-0.25-kConeOutRadius)/2+(kLay1/2),y-kConeOutRadius+(kLay1/2),z,new TGeoRotation("plate21",0,0,0)));\r
+\r
+ TGeoBBox *box22 = new TGeoBBox((kLay1/2),kConeOutRadius/2,kStaveLength-0.50);\r
+ TGeoVolume *plate22 = new TGeoVolume("ThermasolVertical",box22,medFGS003);\r
+ plate22->SetFillColor(2);\r
+ plate22->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate22,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+ mechLaddVol->AddNode(plate22,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+ mechLaddVol->AddNode(plate22,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+ mechLaddVol->AddNode(plate22,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-(kLay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+\r
+ //C Fleece\r
+ TGeoConeSeg *cons2 = new TGeoConeSeg(kStaveLength-0.50,kConeOutRadius+kLay1,kConeOutRadius+kLay1+kLay2,kConeOutRadius+kLay1,kConeOutRadius+kLay1+kLay2,0,180); \r
+ TGeoVolume *Cone12 = new TGeoVolume("CFleecePipeCover",cons2,medCarbonFleece);\r
+ Cone12->SetFillColor(28);\r
+ Cone12->SetLineColor(28);\r
+ mechLaddVol->AddNode(Cone12,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("Cone12",0,0,0)));\r
+ mechLaddVol->AddNode(Cone12,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("Cone12",0,0,0)));\r
+\r
+ TGeoBBox *box3 = new TGeoBBox((0.50-(2*(kConeOutRadius+kLay1)))/2,kLay2/2,kStaveLength-0.50);\r
+ TGeoVolume *plate3 = new TGeoVolume("CFleeceMiddle",box3,medCarbonFleece);\r
+ plate3->SetFillColor(28);\r
+ plate3->SetLineColor(28);\r
+ mechLaddVol->AddNode(plate3,1,new TGeoCombiTrans(x,y-kConeOutRadius+kLay1+(kLay2/2),z,new TGeoRotation("plate3",0,0,0)));\r
+\r
+ TGeoBBox *box31 = new TGeoBBox((0.75-0.25-kConeOutRadius-kLay1)/2,kLay2/2,kStaveLength-0.50);\r
+ TGeoVolume *plate31 = new TGeoVolume("CFleeceLeftRight",box31,medCarbonFleece);\r
+ plate31->SetFillColor(28);\r
+ plate31->SetLineColor(28);\r
+ mechLaddVol->AddNode(plate31,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+kLay1+(0.75-0.25-kConeOutRadius-kLay1)/2,y-kConeOutRadius+kLay1+(kLay2/2),z,new TGeoRotation("plate31",0,0,0)));\r
+ mechLaddVol->AddNode(plate31,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-kLay1-(0.75-0.25-kConeOutRadius-kLay1)/2,y-kConeOutRadius+kLay1+(kLay2/2),z,new TGeoRotation("plate31",0,0,0)));\r
+\r
+ TGeoBBox *box32 = new TGeoBBox((kLay2/2),(kConeOutRadius-kLay1)/2,kStaveLength-0.50);\r
+ TGeoVolume *plate32 = new TGeoVolume("CFleeceVertical",box32,medCarbonFleece);\r
+ plate32->SetFillColor(28);\r
+ plate32->SetLineColor(28);\r
+ mechLaddVol->AddNode(plate32,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+kLay1+(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+ mechLaddVol->AddNode(plate32,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-kLay1-(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+ mechLaddVol->AddNode(plate32,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+kLay1+(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+ mechLaddVol->AddNode(plate32,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-kLay1-(kLay2/2),y+(kLay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+\r
+\r
+ //K13D2U carbon plate\r
+ TGeoBBox *box1 = new TGeoBBox(2*kWidth,kLay3/2,kStaveLength-0.50);\r
+ TGeoVolume *plate1 = new TGeoVolume("CarbonPlate",box1,medK13D2U2k);\r
+ plate1->SetFillColor(5);\r
+ plate1->SetLineColor(5);\r
+ mechLaddVol->AddNode(plate1,1,new TGeoCombiTrans(x,y-(kConeOutRadius+(kLay3/2)),z,new TGeoRotation("plate1",0,0,0)));\r
+\r
+ //C Fleece bottom plate \r
+ TGeoBBox *box6 = new TGeoBBox(2*kWidth,kLay2/2,kStaveLength-0.50);\r
+ TGeoVolume *plate6 = new TGeoVolume("CFleeceBottom",box6,medCarbonFleece);\r
+ plate6->SetFillColor(2);\r
+ plate6->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate6,1,new TGeoCombiTrans(x,y-(kConeOutRadius+kLay3+(kLay2/2)),z,new TGeoRotation("plate1",0,0,0)));\r
+ \r
+ \r
+ }\r
+\r
+ if (fBuildLevel < 2) {\r
+ //Glue layers and kapton\r
+ TGeoBBox *glue = new TGeoBBox(kStaveWidth/2, 0.005/2, zlad);\r
+ TGeoVolume *volGlue=new TGeoVolume("Glue", glue, medGlue);\r
+ volGlue->SetLineColor(5);\r
+ volGlue->SetFillColor(5); \r
+ mechLaddVol->AddNode(volGlue, 0, new TGeoCombiTrans(x,y-(kConeOutRadius+kLay3+(kLay2/2)+(0.01/2)), z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volGlue, 1, new TGeoCombiTrans(x,y-(kConeOutRadius+kLay3+(kLay2/2)+0.01+fSensorThick+(0.01/2)), z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+\r
+ if (fBuildLevel < 1) {\r
+ TGeoBBox *kapCable = new TGeoBBox(kStaveWidth/2, 0.01/2, zlad);\r
+ TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);\r
+ volCable->SetLineColor(28);\r
+ volCable->SetFillColor(28); \r
+ mechLaddVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-(kConeOutRadius+kLay3+(kLay2/2)+0.01+fSensorThick+0.01+(0.01/2)), z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+ \r
+\r
+ // Done, return the stave structure\r
+ return mechLaddVol;\r
+ \r
+}\r
+// new model22\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveModel22(const Double_t xlad,\r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Create the mechanical stave structure for Model 2.2 of TDR\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Mar 2013 Chinorat Kobdaj\r
+// Updated: 26 Apr 2013 Mario Sitta\r
+// Updated: 30 Apr 2013 Wanchaloem Poonsawat \r
+//\r
+ \r
+ // Materials defined in AliITSUv0\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+ TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");\r
+\r
+ TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$"); \r
+ TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");\r
+ TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");\r
+ TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");\r
+ TGeoMedium *medK13D2U2k = mgr->GetMedium("ITS_K13D2U2k$");\r
+ TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$"); \r
+ TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$"); \r
+\r
+ // Local parameters\r
+ Double_t kConeOutRadius =0.107/2;//0.107/2;\r
+ Double_t kConeInRadius = 0.1015/2;//0.10105/2\r
+ Double_t kStaveLength = zlad;\r
+ Double_t kStaveWidth = xlad*2;\r
+ Double_t kWidth = (kStaveWidth)/4;\r
+ Double_t kStaveHeight = 0.283;//0.33;\r
+ Double_t kHeight = (kStaveHeight)/2;\r
+ Double_t kAlpha = 57;//56.31;\r
+ Double_t kTheta = kAlpha*TMath::DegToRad();\r
+ Double_t kS1 = ((kStaveWidth)/4)/TMath::Sin(kTheta);\r
+ Double_t kL1 = (kStaveWidth/4)/TMath::Tan(kTheta);\r
+ Double_t kS2 = sqrt(kHeight*kHeight + kS1*kS1);//TMath::Sin(kThe2);\r
+ Double_t kThe2 = TMath::ATan(kHeight/(0.375-0.036));\r
+ Double_t kBeta = kThe2*TMath::RadToDeg();\r
+ Double_t klay1 = 0.003;//Amec carbon\r
+ Double_t klay2 = 0.002;//C Fleece carbon\r
+ Double_t klay3 = 0.007;//CFplate K13D2U carbon\r
+ Double_t klay4 = 0.007;//GluekStaveLength/2\r
+ Double_t klay5 = 0.01;//Flex cable\r
+ Double_t kTopVertexMaxWidth = 0.072;\r
+ Double_t kTopVertexHeight = 0.04;\r
+ Double_t kSideVertexMWidth = 0.052;\r
+ Double_t kSideVertexHeight = 0.11; \r
+\r
+ \r
+ Int_t loop = (Int_t)(kStaveLength/(2*kL1));\r
+\r
+ char volname[30];\r
+ snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSLadderPattern(), fLayerNumber);\r
+\r
+ Double_t z=0, y=-(2*kConeOutRadius)+klay1+klay2+fSensorThick/2-0.0004, x=0;\r
+\r
+ TGeoVolume *mechLaddVol = 0;\r
+\r
+ if (fBuildLevel < 5) {\r
+ // world (trapezoid)\r
+ TGeoXtru *mechStruct = new TGeoXtru(2); //z sections\r
+ Double_t xv[6] = {kStaveWidth/2,kStaveWidth/2,0.012,-0.012,-kStaveWidth/2,-kStaveWidth/2}; \r
+ /* Double_t yv[6] = {-2*(kConeOutRadius+klay1+1.5*klay2+klay3+klay4+fSensorThick+klay5),\r
+ 0-0.02,kStaveHeight+0.01,kStaveHeight+0.01,0-0.02,\r
+ -2*(kConeOutRadius+klay1+1.5*klay2+klay3+klay4+fSensorThick+klay5)}; // (kConeOutRadius*2)-0.0635 */\r
+ Double_t yv[6] = {-(kConeOutRadius*2)-0.06395,0-0.02,kStaveHeight+0.01,kStaveHeight+0.01,0-0.02,-(kConeOutRadius*2)-0.06395}; // (kConeOutRadius*2)-0.064\r
+ mechStruct->DefinePolygon(6,xv,yv);\r
+ mechStruct->DefineSection(0,-kStaveLength,0,0,1.);\r
+ mechStruct->DefineSection(1,kStaveLength,0,0,1.);\r
+\r
+ mechLaddVol = new TGeoVolume(volname, mechStruct, medAir);\r
+ mechLaddVol->SetLineColor(12);\r
+ mechLaddVol->SetFillColor(12); \r
+ mechLaddVol->SetVisibility(kTRUE); \r
+ \r
+ //Polyimide Pipe Kapton grey-35 \r
+ TGeoCone *cone1 = new TGeoCone(kStaveLength,kConeInRadius,kConeOutRadius-0.0001,kConeInRadius,kConeOutRadius-0.0001);\r
+ TGeoVolume *volCone1= new TGeoVolume("PolyimidePipe", cone1, medKapton);\r
+ volCone1->SetFillColor(35);\r
+ volCone1->SetLineColor(35);\r
+ mechLaddVol->AddNode(volCone1,1,new TGeoTranslation(x+0.25,y,z));\r
+ mechLaddVol->AddNode(volCone1,2,new TGeoTranslation(x-0.25,y,z));\r
+ }\r
+\r
+ if (fBuildLevel < 4) {\r
+ TGeoTube *coolTubeW = new TGeoTube(0.,kConeInRadius-0.0001,kStaveLength);\r
+ TGeoVolume *volCoolTubeW= new TGeoVolume("Water", coolTubeW, medWater);\r
+ volCoolTubeW->SetFillColor(4);\r
+ volCoolTubeW->SetLineColor(4);\r
+ mechLaddVol->AddNode(volCoolTubeW,0,new TGeoTranslation(x-0.25,y,z));\r
+ mechLaddVol->AddNode(volCoolTubeW,1,new TGeoTranslation(x+0.25,y,z));\r
+ }\r
+\r
+ if (fBuildLevel < 3) {\r
+ //top fillament\r
+ // Top filament M60J black-12 Carbon structure TGeoBBox (length,thickness,width)\r
+ TGeoBBox *t2=new TGeoBBox(kS2-0.028,0.02/2,0.02/2); //0.04/2//TGeoBBox *t2=new TGeoBBox(kS2,0.01,0.02);//kS2-0.03 old Config.C\r
+ TGeoVolume *volT2=new TGeoVolume("TopFilament", t2, medM60J3K);\r
+ volT2->SetLineColor(12);\r
+ volT2->SetFillColor(12); \r
+ for(int i=0;i<loop;i++){// i<28;i++){\r
+ // 1) Front Left Top Filament\r
+ mechLaddVol->AddNode(volT2,i*4+1,new TGeoCombiTrans(x+kWidth+0.0036,y+kHeight+0.01,z-kStaveLength+0.1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,90-kBeta)));\r
+ // 2) Front Right Top Filament\r
+ mechLaddVol->AddNode(volT2,i*4+2,new TGeoCombiTrans(x-kWidth-0.0036,y+kHeight+0.01,z-kStaveLength+0.1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,-90+kBeta)));\r
+ // 3) Back Left Top Filament\r
+ mechLaddVol->AddNode(volT2,i*4+3,new TGeoCombiTrans(x+kWidth+0.0036,y+kHeight+0.01,z-kStaveLength+0.1+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,-90+kAlpha,90-kBeta)));\r
+ // 4) Back Right Top Filament\r
+ mechLaddVol->AddNode(volT2,i*4+4,new TGeoCombiTrans(x-kWidth-0.0036,y+kHeight+0.01,z-kStaveLength+0.1+2*kL1+(i*4*kL1)+kS1/2, new TGeoRotation("volT2",90,90-kAlpha,-90+kBeta)));\r
+ }\r
+ \r
+ //Vertex structure \r
+\r
+ //top ver trd1\r
+ TGeoTrd1 *trd1 = new TGeoTrd1(0,kTopVertexMaxWidth/2,kStaveLength,kTopVertexHeight/2);\r
+ TGeoVolume *ibdv = new TGeoVolume("TopVertex",trd1,medM60J3K);\r
+ ibdv->SetFillColor(12);\r
+ ibdv->SetLineColor(12);\r
+ mechLaddVol->AddNode(ibdv,1,new TGeoCombiTrans(x,y+kStaveHeight+0.03,z,new TGeoRotation("ibdv",0.,-90,0)));//y+kStaveHeight+0.056\r
+\r
+ //left trd2\r
+ TGeoTrd1 *trd2 = new TGeoTrd1(0,kSideVertexMWidth/2,kStaveLength, kSideVertexHeight/2);\r
+ TGeoVolume *ibdv2 = new TGeoVolume("LeftVertex",trd2,medM60J3K);\r
+ ibdv2->SetFillColor(12);\r
+ ibdv2->SetLineColor(12);\r
+ mechLaddVol->AddNode(ibdv2,1,new TGeoCombiTrans(x+kStaveWidth/2-0.06,y-0.0355,z,new TGeoRotation("ibdv2",-103.3,90,0))); //x-kStaveWidth/2-0.09 old Config.C y-0.0355,\r
+\r
+ //right trd3\r
+ TGeoTrd1 *trd3 = new TGeoTrd1(0,kSideVertexMWidth/2,kStaveLength, kSideVertexHeight/2);\r
+ TGeoVolume *ibdv3 = new TGeoVolume("RightVertex",trd3,medM60J3K);\r
+ ibdv3->SetFillColor(12);\r
+ ibdv3->SetLineColor(12);\r
+ mechLaddVol->AddNode(ibdv3,1,new TGeoCombiTrans(x-kStaveWidth/2+0.06,y-0.0355,z,new TGeoRotation("ibdv3",103.3,90,0))); //x-kStaveWidth/2+0.09 old Config.C\r
+ \r
+ //Carbon Fleece\r
+ TGeoConeSeg *cons2 = new TGeoConeSeg(zlad,kConeOutRadius+klay1,kConeOutRadius+klay1+klay2,kConeOutRadius+klay1,kConeOutRadius+klay1+klay2,0,180); \r
+ TGeoVolume *cone12 = new TGeoVolume("CarbonFleecePipeCover",cons2,medCarbonFleece);\r
+ cone12->SetFillColor(28);\r
+ cone12->SetLineColor(28);\r
+ mechLaddVol->AddNode(cone12,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("cone12",0,0,0)));\r
+ mechLaddVol->AddNode(cone12,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("cone12",0,0,0)));\r
+\r
+ TGeoBBox *box3 = new TGeoBBox((0.50-(2*(kConeOutRadius+klay1)))/2,klay2/2,zlad);//kStaveLength-0.50);\r
+ TGeoVolume *plate3 = new TGeoVolume("CarbonFleeceMiddle",box3,medCarbonFleece);\r
+ plate3->SetFillColor(28);\r
+ plate3->SetLineColor(28);\r
+ mechLaddVol->AddNode(plate3,1,new TGeoCombiTrans(x,y-kConeOutRadius+klay1+(klay2/2),z,new TGeoRotation("plate3",0,0,0)));\r
+\r
+ TGeoBBox *box31 = new TGeoBBox((0.75-0.25-kConeOutRadius-klay1)/2+0.0025,klay2/2,zlad);\r
+ TGeoVolume *plate31 = new TGeoVolume("CarbonFleeceLeftRight",box31,medCarbonFleece);\r
+ plate31->SetFillColor(28);\r
+ plate31->SetLineColor(28);\r
+ mechLaddVol->AddNode(plate31,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+klay1+(0.75-0.25-kConeOutRadius-klay1)/2+0.0025,y-kConeOutRadius+klay1+(klay2/2),z,new TGeoRotation("plate31",0,0,0)));\r
+ mechLaddVol->AddNode(plate31,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-klay1-(0.75-0.25-kConeOutRadius-klay1)/2-0.0025,y-kConeOutRadius+klay1+(klay2/2),z,new TGeoRotation("plate31",0,0,0)));\r
+\r
+ TGeoBBox *box32 = new TGeoBBox((klay2/2),(kConeOutRadius-klay1)/2,zlad);\r
+ TGeoVolume *plate32 = new TGeoVolume("CarbonFleeceVertical",box32,medCarbonFleece);\r
+ plate32->SetFillColor(28);\r
+ plate32->SetLineColor(28);\r
+ mechLaddVol->AddNode(plate32,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+klay1+(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+ mechLaddVol->AddNode(plate32,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-klay1-(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+ mechLaddVol->AddNode(plate32,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+klay1+(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+ mechLaddVol->AddNode(plate32,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-klay1-(klay2/2),y+(klay1-kConeOutRadius)/2,z,new TGeoRotation("plate32",0,0,0)));\r
+\r
+ //Amec Thermasol red-2 cover tube FGS300 or Carbon Paper\r
+ TGeoConeSeg *cons1 = new TGeoConeSeg(zlad,kConeOutRadius,kConeOutRadius+klay1-0.0001,kConeOutRadius,kConeOutRadius+klay1-0.0001,0,180);//kConeOutRadius+klay1-0.0001\r
+ TGeoVolume *cone11 = new TGeoVolume("ThermasolPipeCover",cons1,medFGS003);\r
+ cone11->SetFillColor(2);\r
+ cone11->SetLineColor(2);\r
+ mechLaddVol->AddNode(cone11,1,new TGeoCombiTrans(x+0.25,y,z,new TGeoRotation("cone11",0,0,0)));\r
+ mechLaddVol->AddNode(cone11,2,new TGeoCombiTrans(x-0.25,y,z,new TGeoRotation("cone11",0,0,0)));\r
+\r
+ TGeoBBox *box2 = new TGeoBBox((0.50-(2*kConeOutRadius))/2,(klay1/2),zlad);//kStaveLength-0.50);\r
+ TGeoVolume *plate2 = new TGeoVolume("ThermasolMiddle",box2,medFGS003);\r
+ plate2->SetFillColor(2);\r
+ plate2->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate2,1,new TGeoCombiTrans(x,y-kConeOutRadius+(klay1/2),z,new TGeoRotation("plate2",0,0,0)));\r
+\r
+ TGeoBBox *box21 = new TGeoBBox((0.75-0.25-kConeOutRadius-klay1)/2+0.0025,(klay1/2),zlad);\r
+ TGeoVolume *plate21 = new TGeoVolume("ThermasolLeftRight",box21,medFGS003);\r
+ plate21->SetFillColor(2);\r
+ plate21->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate21,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(0.75-0.25-kConeOutRadius)/2-(klay1/2)+0.0025,y-kConeOutRadius+(klay1/2),z,new TGeoRotation("plate21",0,0,0)));\r
+ mechLaddVol->AddNode(plate21,2,new TGeoCombiTrans(x-0.25-kConeOutRadius-(0.75-0.25-kConeOutRadius)/2+(klay1/2)-0.0025,y-kConeOutRadius+(klay1/2),z,new TGeoRotation("plate21",0,0,0)));\r
+\r
+ TGeoBBox *box22 = new TGeoBBox((klay1/2),kConeOutRadius/2,zlad);\r
+ TGeoVolume *plate22 = new TGeoVolume("ThermasolVertical",box22,medFGS003);\r
+ plate22->SetFillColor(2);\r
+ plate22->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate22,1,new TGeoCombiTrans(x+0.25+kConeOutRadius+(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+ mechLaddVol->AddNode(plate22,2,new TGeoCombiTrans(x+0.25-kConeOutRadius-(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+ mechLaddVol->AddNode(plate22,3,new TGeoCombiTrans(x-0.25+kConeOutRadius+(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+ mechLaddVol->AddNode(plate22,4,new TGeoCombiTrans(x-0.25-kConeOutRadius-(klay1/2),y-kConeOutRadius/2,z,new TGeoRotation("plate22",0,0,0)));\r
+\r
+ //K13D2U CF plate\r
+ TGeoBBox *box1 = new TGeoBBox(2*kWidth,(klay3)/2,zlad);\r
+ TGeoVolume *plate1 = new TGeoVolume("CFPlate",box1,medK13D2U2k);\r
+ plate1->SetFillColor(5);\r
+ plate1->SetLineColor(5);\r
+ mechLaddVol->AddNode(plate1,1,new TGeoCombiTrans(x,y-(kConeOutRadius+(klay3/2)),z,new TGeoRotation("plate1",0,0,0)));\r
+\r
+ //C Fleece bottom plate \r
+ TGeoBBox *box6 = new TGeoBBox(2*kWidth,(klay2)/2,zlad);\r
+ TGeoVolume *plate6 = new TGeoVolume("CarbonFleeceBottom",box6,medCarbonFleece);\r
+ plate6->SetFillColor(2);\r
+ plate6->SetLineColor(2);\r
+ mechLaddVol->AddNode(plate6,1,new TGeoCombiTrans(x,y-(kConeOutRadius+klay3+(klay2/2)),z,new TGeoRotation("plate6",0,0,0)));\r
+\r
+ }\r
+ if (fBuildLevel < 2) {\r
+ //Glue klayers and kapton\r
+ TGeoBBox *glue = new TGeoBBox(kStaveWidth/2, (klay4)/2, zlad);\r
+ TGeoVolume *volGlue=new TGeoVolume("Glue", glue, medGlue);\r
+ volGlue->SetLineColor(5);\r
+ volGlue->SetFillColor(5); \r
+ // mechLaddVol->AddNode(volGlue, 0, new TGeoCombiTrans(x,y-(kConeOutRadius+klay3+klay2+(klay4/2)), z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volGlue, 0, new TGeoCombiTrans(x,y-(kConeOutRadius+klay3+klay2+(klay4)/2)+0.00005, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+\r
+ if (fBuildLevel < 1) {\r
+ //Flex Cable or Bus\r
+ TGeoBBox *kapCable = new TGeoBBox(kStaveWidth/2, klay5/2, zlad);//klay5/2\r
+ TGeoVolume *volCable=new TGeoVolume("FlexCable", kapCable, medFlexCable);\r
+ volCable->SetLineColor(28);\r
+ volCable->SetFillColor(28); \r
+ // mechLaddVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-(kConeOutRadius+klay3+klay2+klay4+fSensorThick+(klay5)/2)+0.0002, z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-(kConeOutRadius+klay3+klay2+klay4+fSensorThick+(klay5)/2)+0.0002, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+ // Done, return the stave structe\r
+ return mechLaddVol;\r
+}\r
+\r
+// model3\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateStaveModel3(const Double_t xlad,\r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Create the mechanical stave structure for Model 3 of TDR\r
+//\r
+// Input:\r
+// xlad : X length\r
+// zlad : Z length\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 28 May 2013 Chinorat Kobdaj\r
+// Updated: Mario Sitta\r
+// Updated: Wanchaloem Poonsawat \r
+//\r
+ \r
+ // Materials defined in AliITSUv0\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+ TGeoMedium *medWater = mgr->GetMedium("ITS_WATER$");\r
+\r
+ TGeoMedium *medM60J3K = mgr->GetMedium("ITS_M60J3K$"); \r
+ TGeoMedium *medKapton = mgr->GetMedium("ITS_KAPTON(POLYCH2)$");\r
+ TGeoMedium *medGlue = mgr->GetMedium("ITS_GLUE$");\r
+ TGeoMedium *medFlexCable = mgr->GetMedium("ITS_FLEXCABLE$");\r
+ TGeoMedium *medK13D2U2k = mgr->GetMedium("ITS_K13D2U2k$");\r
+ TGeoMedium *medFGS003 = mgr->GetMedium("ITS_FGS003$"); \r
+ TGeoMedium *medCarbonFleece = mgr->GetMedium("ITS_CarbonFleece$"); \r
+\r
+ // Local parameters\r
+ Double_t kConeOutRadius = 0.15/2;\r
+ Double_t kStaveLength = zlad*2;\r
+ Double_t kStaveWidth = xlad*2;\r
+ Double_t W = kStaveWidth/4;//1/2 of W\r
+ Double_t stave_height = 0.3;\r
+ Double_t H = stave_height/2;\r
+ Double_t alpha = 90-33.;//90-30;\r
+ Double_t the1 = alpha*TMath::DegToRad();\r
+ Double_t s1 = W/TMath::Sin(the1);\r
+ Double_t L = W/TMath::Tan(the1);\r
+ Double_t s2 = TMath::Sqrt(H*H + s1*s1);//TMath::Sin(the2);\r
+ Double_t the2 = TMath::ATan(H/s1);\r
+ Double_t beta = the2*TMath::RadToDeg();\r
+ Double_t klay4 = 0.007; //Glue\r
+ Double_t klay5 = 0.01; //Flexcable\r
+ Int_t loop = (kStaveLength/(2*L))/2;\r
+ Double_t hh = 0.01;\r
+ Double_t ang1 = 0*TMath::DegToRad();\r
+ Double_t ang2 = 0*TMath::DegToRad();\r
+ Double_t ang3 = 0*TMath::DegToRad();\r
+ Int_t modules = 4;\r
+ Double_t headWidth=0.25;\r
+ Double_t smcLength=kStaveLength/modules-2*headWidth;//6.25;\r
+ Double_t smcWidth=kStaveWidth;\r
+ Double_t smcSide1Thick=0.03;\r
+ Double_t vaporThick=0.032;\r
+ Double_t liquidThick=0.028;\r
+ Double_t smcSide2Thick=0.01;\r
+ Double_t smcSide3Thick=0.0055;\r
+ Double_t smcSide4Thick=0.0095;\r
+ Double_t smcSide5Thick=0.0075;\r
+ Double_t smcSpace=0.01;\r
+\r
+\r
+ char volname[30];\r
+ snprintf(volname, 30, "%s%d_StaveStruct", AliITSUGeomTGeo::GetITSLadderPattern(), fLayerNumber);\r
+ \r
+ // detailed structure ++++++++++++++\r
+ Double_t z=0, y=0-0.007, x=0;\r
+\r
+ // Polimide micro channels numbers\r
+ Double_t yMC = y-H+0.01;\r
+ Int_t nb = (Int_t)(kStaveWidth/0.1)+1;\r
+ Double_t xladMC = (nb*0.1-0.08)/2;\r
+\r
+\r
+ TGeoVolume *mechLaddVol = 0;\r
+ if (fBuildLevel < 5) {\r
+ // world (trapezoid)\r
+ TGeoXtru *mechStruct = new TGeoXtru(2); //z sections\r
+ Double_t xv[5] = {kStaveWidth/2+0.1,kStaveWidth/2+0.1,0,-kStaveWidth/2-0.1,-kStaveWidth/2-0.1};\r
+ Double_t yv[5] = {-kConeOutRadius*2-0.07,0,stave_height,0,-kConeOutRadius*2-0.07}; \r
+ mechStruct->DefinePolygon(5,xv,yv);\r
+ mechStruct->DefineSection(0,-kStaveLength-0.1,0,0,1.);\r
+ mechStruct->DefineSection(1,kStaveLength+0.1,0,0,1.);\r
+ mechLaddVol = new TGeoVolume(volname, mechStruct, medAir);\r
+ mechLaddVol->SetLineColor(12);\r
+ mechLaddVol->SetFillColor(12); \r
+ mechLaddVol->SetVisibility(kTRUE);\r
+\r
+ // Silicon micro channels numbers\r
+ \r
+ TGeoBBox *tM0a=new TGeoBBox(smcWidth/2, 0.003/2, headWidth/2);\r
+ TGeoVolume *volTM0a=new TGeoVolume("microChanTop1", tM0a, medKapton);\r
+ volTM0a->SetLineColor(35);\r
+ volTM0a->SetFillColor(35); \r
+\r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0a, 0, new TGeoCombiTrans(x,yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));\r
+ mechLaddVol->AddNode(volTM0a, 1, new TGeoCombiTrans(x,yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));\r
+ }\r
+ TGeoBBox *tM0c=new TGeoBBox(0.3/2, 0.003/2,smcLength/2);\r
+ TGeoVolume *volTM0c=new TGeoVolume("microChanTop2", tM0c, medKapton);\r
+ volTM0c->SetLineColor(35);\r
+ volTM0c->SetFillColor(35); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0c, 0, new TGeoCombiTrans(x+(smcWidth/2)-(0.3/2),yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));\r
+ mechLaddVol->AddNode(volTM0c, 1, new TGeoCombiTrans(x-(smcWidth/2)+(0.3/2),yMC+0.03, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0c1=new TGeoBBox(0.2225/2, 0.003/2,smcLength/2);\r
+ TGeoVolume *volTM0c1=new TGeoVolume("microChanBot1", tM0c1, medKapton);\r
+ volTM0c1->SetLineColor(6);\r
+ volTM0c1->SetFillColor(6); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0c1, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick)-(0.2225/2),yMC+0.03-hh-(0.003), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0c1, 1, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick)+(smcSide4Thick)+(0.2225/2),yMC+0.03-hh-(0.003), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0c2=new TGeoBBox(0.072/2, 0.003/2,smcLength/2);\r
+ TGeoVolume *volTM0c2=new TGeoVolume("microChanBot2", tM0c2, medKapton);\r
+ volTM0c2->SetLineColor(35);\r
+ volTM0c2->SetFillColor(35); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0c2, 0, new TGeoCombiTrans(x+smcWidth/2-(0.072/2),yMC+0.03-(0.035+0.0015)-(0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0c2r=new TGeoBBox(0.068/2, 0.003/2,smcLength/2);\r
+ TGeoVolume *volTM0c2r=new TGeoVolume("microChanBot3", tM0c2r, medKapton);\r
+ volTM0c2r->SetLineColor(35);\r
+ volTM0c2r->SetFillColor(35); \r
+ for(Int_t mo=1; mo<=modules; mo++) { \r
+ mechLaddVol->AddNode(volTM0c2r, 0, new TGeoCombiTrans(x-smcWidth/2+(0.068/2),yMC+0.03-(0.035+0.0015)-(0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0d=new TGeoBBox(smcSide1Thick/2, 0.035/2,smcLength/2);\r
+ TGeoVolume *volTM0d=new TGeoVolume("microChanSide1", tM0d, medKapton);\r
+ volTM0d->SetLineColor(12);\r
+ volTM0d->SetFillColor(12); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0d, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0d, 1, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+\r
+ TGeoBBox *tM0d1=new TGeoBBox(smcSide2Thick/2, 0.035/2,smcLength/2);\r
+ TGeoVolume *volTM0d1=new TGeoVolume("microChanSide2", tM0d1, medKapton);\r
+ volTM0d1->SetLineColor(12);\r
+ volTM0d1->SetFillColor(12); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0d1, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick/2),yMC+0.03-(0.003+0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0d1, 1, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick/2),yMC+0.03-(0.003+0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0d2=new TGeoBBox(smcSide3Thick/2, (hh+0.003)/2, smcLength/2);\r
+ TGeoVolume *volTM0d2=new TGeoVolume("microChanSide3", tM0d2, medKapton);\r
+ volTM0d2->SetLineColor(12);\r
+ volTM0d2->SetFillColor(12); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0d2, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick/2),yMC+0.03-(0.003+hh+0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0d2r=new TGeoBBox(smcSide4Thick/2, (hh+0.003)/2, smcLength/2);\r
+ TGeoVolume *volTM0d2r=new TGeoVolume("microChanSide4", tM0d2r, medKapton);\r
+ volTM0d2r->SetLineColor(12);\r
+ volTM0d2r->SetFillColor(12); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0d2r, 0, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick)+(smcSide4Thick/2),yMC+0.03-(0.003+hh+0.003)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0e=new TGeoBBox(smcSide5Thick/2, hh/2,smcLength/2);\r
+ TGeoVolume *volTM0e=new TGeoVolume("microChanSide5", tM0e, medKapton); \r
+ volTM0e->SetLineColor(12);\r
+ volTM0e->SetFillColor(12); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ for (Int_t ie=0;ie<11;ie++) {\r
+ mechLaddVol->AddNode(volTM0e, 0, new TGeoCombiTrans(x-(ie*(smcSpace+smcSide5Thick))+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick)-smcSpace-(smcSide5Thick/2),yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0e, 1, new TGeoCombiTrans(x+(ie*(smcSpace+smcSide5Thick))-smcWidth/2+(smcSide1Thick)+(liquidThick)+(smcSide2Thick)+(smcSide4Thick)+smcSpace+(smcSide5Thick/2),yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ }\r
+ \r
+ TGeoBBox *tM0f=new TGeoBBox(0.02/2, hh/2, smcLength/2);\r
+ TGeoVolume *volTM0f=new TGeoVolume("microChanTop3", tM0f, medKapton);\r
+ Double_t smcChannels=12;\r
+ Double_t smcCloseWallvapor=smcWidth/2-smcSide1Thick-vaporThick-smcSide2Thick-smcSide3Thick-12*smcSpace-11*smcSide5Thick;\r
+ Double_t smcCloseWallliquid=smcWidth/2-smcSide1Thick-liquidThick-smcSide2Thick-smcSide4Thick-12*smcSpace-11*smcSide5Thick;\r
+ volTM0f->SetLineColor(12);\r
+ volTM0f->SetFillColor(12); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0f, 0, new TGeoCombiTrans(x+smcCloseWallvapor-(0.02)/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0f, 1, new TGeoCombiTrans(x-smcCloseWallliquid+(0.02)/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ //Head(back) microchannel\r
+\r
+ TGeoBBox *tM0hb=new TGeoBBox(smcWidth/2, 0.025/2, headWidth/2);\r
+ TGeoVolume *volTM0hb=new TGeoVolume("microChanHeadBackBottom1", tM0hb, medKapton);\r
+ volTM0hb->SetLineColor(4);\r
+ volTM0hb->SetFillColor(4); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0hb, 0, new TGeoCombiTrans(x,yMC+0.03-0.0145-(0.025/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0hb, 1, new TGeoCombiTrans(x,yMC+0.03-0.0145-(0.025)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-(headWidth/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0h1=new TGeoBBox(smcWidth/2, 0.013/2, 0.05/2);\r
+ TGeoVolume *volTM0h1=new TGeoVolume("microChanHeadBackBottom2", tM0h1, medKapton);\r
+ volTM0h1->SetLineColor(5);\r
+ volTM0h1->SetFillColor(5); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0h1, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-headWidth+(0.05/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0h2=new TGeoBBox(smcWidth/2, 0.003/2, 0.18/2);\r
+ TGeoVolume *volTM0h2=new TGeoVolume("microChanHeadBackBottom7", tM0h2, medKapton);\r
+ volTM0h2->SetLineColor(6);\r
+ volTM0h2->SetFillColor(6);\r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0h2, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-0.01-(0.003/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-0.02-(0.18/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0h3=new TGeoBBox(smcWidth/2, 0.013/2, 0.02/2);\r
+ TGeoVolume *volTM0h3=new TGeoVolume("microChanHeadBackBottom3", tM0h3, medKapton);\r
+ volTM0h3->SetLineColor(5);\r
+ volTM0h3->SetFillColor(5); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0h3, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth-smcLength/2-(0.02/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0b1=new TGeoBBox(smcWidth/2, 0.013/2, 0.03/2);\r
+ TGeoVolume *volTM0b1=new TGeoVolume("microChanHeadBackBottom4", tM0b1, medKapton);\r
+ volTM0b1->SetLineColor(5);\r
+ volTM0b1->SetFillColor(5); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0b1, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+headWidth-(0.03/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0b2=new TGeoBBox(smcWidth/2, 0.003/2, 0.2/2);\r
+ TGeoVolume *volTM0b2=new TGeoVolume("microChanHeadBackBottom5", tM0b2, medKapton);\r
+ volTM0b2->SetLineColor(6);\r
+ volTM0b2->SetFillColor(6); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0b2, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-0.01-(0.003/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+0.02+(0.2/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0b3=new TGeoBBox(smcWidth/2, 0.013/2, 0.02/2);\r
+ TGeoVolume *volTM0b3=new TGeoVolume("microChanHeadBackBottom6", tM0b3, medKapton);\r
+ volTM0b3->SetLineColor(5);\r
+ volTM0b3->SetFillColor(5); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0b3, 0, new TGeoCombiTrans(x,yMC+0.03-0.0015-(0.013/2), z+(mo-3)*kStaveLength/4+smcLength/2+headWidth+smcLength/2+(0.02/2), new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ \r
+ TGeoBBox *tM0b=new TGeoBBox(0.02/2, 0.02/2, zlad);\r
+ TGeoVolume *volTM0b=new TGeoVolume("microChanWalls", tM0b, medKapton);\r
+ volTM0b->SetLineColor(35);\r
+ volTM0b->SetFillColor(35); \r
+ for (Int_t ib=0;ib<nb;ib++) {\r
+ //mechLaddVol->AddNode(volTM0b, ib, new TGeoCombiTrans(x+ib*0.1-xladMC+0.01,yMC, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+ \r
+ } \r
+ \r
+ if (fBuildLevel < 4) {\r
+\r
+ //**********cooling inlet outlet\r
+\r
+ TGeoBBox *tM0dv=new TGeoBBox(vaporThick/2, 0.035/2,smcLength/2);\r
+ TGeoVolume *volTM0dv=new TGeoVolume("microChanVapor", tM0dv, medWater);\r
+ volTM0dv->SetLineColor(2);\r
+ volTM0dv->SetFillColor(2);\r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0dv, 0, new TGeoCombiTrans(x+smcWidth/2-(smcSide1Thick)-(vaporThick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ TGeoBBox *tM0dl=new TGeoBBox(liquidThick/2, 0.035/2,smcLength/2);\r
+ TGeoVolume *volTM0dl=new TGeoVolume("microChanLiquid", tM0dl, medWater);\r
+ volTM0dl->SetLineColor(3);\r
+ volTM0dl->SetFillColor(3); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ mechLaddVol->AddNode(volTM0dl, 0, new TGeoCombiTrans(x-smcWidth/2+(smcSide1Thick)+(liquidThick/2),yMC+0.03-0.0015-(0.035)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ // small cooling fluid now using water wait for freeon value \r
+ TGeoBBox *tM0dlq=new TGeoBBox(smcSpace/2, hh/2,smcLength/2);\r
+ TGeoVolume *volTM0dlq=new TGeoVolume("smallLiquid", tM0dlq, medWater);\r
+ volTM0dlq->SetLineColor(3);\r
+ volTM0dlq->SetFillColor(3); \r
+ TGeoBBox *tM0dvp=new TGeoBBox(smcSpace/2, hh/2,smcLength/2);\r
+ TGeoVolume *volTM0dvp=new TGeoVolume("microChanVapor", tM0dvp, medWater);\r
+ volTM0dvp->SetLineColor(2);\r
+ volTM0dvp->SetFillColor(2); \r
+ for(Int_t mo=1; mo<=modules; mo++) {\r
+ for (Int_t is=0;is<12;is++) {\r
+ mechLaddVol->AddNode(volTM0dlq, 0, new TGeoCombiTrans(x+(is*(smcSpace+smcSide5Thick))-smcWidth/2+(smcSide1Thick)+(vaporThick)+(smcSide2Thick)+(smcSide3Thick)+smcSpace/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0dvp, 1, new TGeoCombiTrans(x-(is*(smcSpace+smcSide5Thick))+smcWidth/2-(smcSide1Thick)-(vaporThick)-(smcSide2Thick)-(smcSide3Thick)-smcSpace/2,yMC+0.03-(0.003+hh)/2, z+(mo-3)*kStaveLength/4+smcLength/2+headWidth, new TGeoRotation("",ang1, ang2, ang3)));//("",0, 0, 0)));\r
+ }\r
+ }\r
+\r
+ //*************\r
+\r
+ }\r
+ \r
+ if (fBuildLevel < 3) {\r
+\r
+ //Bottom filament CFRP black-12 Carbon structure TGeoBBox (thickness,width,length)\r
+ \r
+ Double_t filWidth = 0.04;\r
+ Double_t filHeight= 0.02;\r
+ TGeoBBox *t1=new TGeoBBox(filHeight/2,filWidth/2,s1);\r
+ TGeoVolume *volT1=new TGeoVolume("bottomFilament", t1, medM60J3K);\r
+ volT1->SetLineColor(12);\r
+ volT1->SetFillColor(12); \r
+ for(int i=0;i<loop;i++){//i<30;i++){\r
+ mechLaddVol->AddNode(volT1,4*i+0,\r
+ new TGeoCombiTrans(x+W,y-H+0.04+filHeight/2,z-kStaveLength/2+(4*L*i)+s1/2, \r
+ new TGeoRotation("volT1",-90,alpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+1,\r
+ new TGeoCombiTrans(x-W,y-H+0.04+filHeight/2,z-kStaveLength/2+(4*L*i)+s1/2, \r
+ new TGeoRotation("volT1",90,alpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+2,\r
+ new TGeoCombiTrans(x+W,y-H+0.04+filHeight/2,z-kStaveLength/2+2*L+(i*4*L)+s1/2, \r
+ new TGeoRotation("volT1",-90,-alpha,0)));\r
+ mechLaddVol->AddNode(volT1,4*i+3,\r
+ new TGeoCombiTrans(x-W,y-H+0.04+filHeight/2,z-kStaveLength/2+2*L+(i*4*L)+s1/2, \r
+ new TGeoRotation("volT1",-90,+alpha,0)));\r
+ }\r
+ \r
+ // Top filament CERP black-12 Carbon structure TGeoBBox (length,thickness,width)\r
+\r
+ TGeoBBox *t2=new TGeoBBox(s2,filHeight/2,filWidth/2);\r
+ TGeoVolume *volT2=new TGeoVolume("topFilament", t2, medM60J3K);\r
+ volT2->SetLineColor(12);\r
+ volT2->SetFillColor(12); \r
+ for(int i=0;i<loop;i++){ //i<30;i++){\r
+ mechLaddVol->AddNode(volT2,4*i+0,\r
+ new TGeoCombiTrans(x+W,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*L)+s1/2,\r
+ new TGeoRotation("volT2",90,90-alpha,90-beta)));\r
+ mechLaddVol->AddNode(volT2,4*i+1,\r
+ new TGeoCombiTrans(x-W,y+0.04+filHeight/2,z-kStaveLength/2+(i*4*L)+s1/2,\r
+ new TGeoRotation("volT2",90,-90+alpha,-90+beta)));\r
+ mechLaddVol->AddNode(volT2,4*i+2,\r
+ new TGeoCombiTrans(x+W,y+0.04+filHeight/2,z-kStaveLength/2+2*L+(i*4*L)+s1/2,\r
+ new TGeoRotation("volT2",90,-90+alpha,90-beta)));\r
+ mechLaddVol->AddNode(volT2,4*i+3,\r
+ new TGeoCombiTrans(x-W,y+0.04+filHeight/2,z-kStaveLength/2+2*L+(i*4*L)+s1/2, \r
+ new TGeoRotation("volT2",90,90-alpha,-90+beta)));\r
+ }\r
+ }\r
+\r
+ if (fBuildLevel < 2) {\r
+\r
+ // Glue Filament and Silicon MicroChannel\r
+ TGeoBBox *tM0=new TGeoBBox(xladMC/5, klay4/2, zlad);\r
+ TGeoVolume *volTM0=new TGeoVolume("glueFM", tM0,medGlue );\r
+ volTM0->SetLineColor(5);\r
+ volTM0->SetFillColor(5); \r
+ mechLaddVol->AddNode(volTM0, 0, new TGeoCombiTrans(x-xlad/2-0.25,0.03+yMC, z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volTM0, 1, new TGeoCombiTrans(x+xlad/2+0.25,0.03+yMC, z, new TGeoRotation("",0, 0, 0)));\r
+\r
+ \r
+ // Glue microchannel and sensor\r
+ TGeoBBox *glueM = new TGeoBBox(xladMC/5, klay4/2, zlad);\r
+ TGeoVolume *volGlueM=new TGeoVolume("glueMS", glueM, medGlue);\r
+ volGlueM->SetLineColor(5);\r
+ volGlueM->SetFillColor(5); \r
+ mechLaddVol->AddNode(volGlueM, 0, new TGeoCombiTrans(x-xlad/2-0.25,yMC-0.01, z, new TGeoRotation("",0, 0, 0)));\r
+ mechLaddVol->AddNode(volGlueM, 1, new TGeoCombiTrans(x+xlad/2+0.25,yMC-0.01, z, new TGeoRotation("",0, 0, 0)));\r
+ \r
+ // Glue sensor and kapton\r
+ TGeoBBox *glue = new TGeoBBox(xlad, klay4/2, zlad);\r
+ TGeoVolume *volGlue=new TGeoVolume("glueSensorBus", glue, medGlue);\r
+ volGlue->SetLineColor(5);\r
+ volGlue->SetFillColor(5); \r
+ mechLaddVol->AddNode(volGlue, 1, new TGeoCombiTrans(x, y-0.154-fSensorThick-klay4/2, z, new TGeoRotation("",0, 0, 0)));\r
+ } \r
+\r
+ if (fBuildLevel < 1) {\r
+ TGeoBBox *kapCable = new TGeoBBox(xlad, klay5/2, zlad);\r
+ TGeoVolume *volCable=new TGeoVolume("Flexcable", kapCable, medFlexCable);\r
+ volCable->SetLineColor(28);\r
+ volCable->SetFillColor(28); \r
+ mechLaddVol->AddNode(volCable, 0, new TGeoCombiTrans(x, y-0.154-fSensorThick-klay4-klay5/2, z, new TGeoRotation("",0, 0, 0)));\r
+ }\r
+\r
+ // Done, return the stave structur\r
+ return mechLaddVol;\r
+ }\r
+\r
+//________________________________________________________________________\r
+TGeoVolume* AliITSUv0Layer::CreateModule(const Double_t xlad,\r
+ const Double_t ylad, \r
+ const Double_t zlad,\r
+ const TGeoManager *mgr){\r
+//\r
+// Creates the actual Module\r
+//\r
+// Input:\r
+// xlad,zlad : the ladder dimensions\r
+// mgr : the GeoManager (used only to get the proper material)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 22 Jun 2011 Mario Sitta\r
+//\r
+\r
+ char volname[30];\r
+ Double_t xlen, ylen, zlen;\r
+ Double_t xpos, ypos, zpos;\r
+\r
+\r
+ // First create all needed shapes\r
+\r
+ // The module\r
+ TGeoBBox *module = new TGeoBBox(xlad, ylad, zlad/fNModules);\r
+\r
+ // The sensor\r
+ xlen = module->GetDX();\r
+ ylen = 0.5*fSensorThick;\r
+ zlen = module->GetDZ();\r
+ TGeoBBox *sensor = new TGeoBBox(xlen, ylen, zlen);\r
+\r
+\r
+ // We have all shapes: now create the real volumes\r
+ TGeoMedium *medAir = mgr->GetMedium("ITS_AIR$");\r
+ TGeoMedium *medSi = mgr->GetMedium("ITS_SI$");\r
+\r
+ snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSModulePattern(), fLayerNumber);\r
+ // TGeoVolume *modVol = new TGeoVolume(volname, module, medAir);\r
+ TGeoVolume *modVol = new TGeoVolume(volname, module, medSi);\r
+ modVol->SetVisibility(kTRUE);\r
+ modVol->SetLineColor(1);\r
+\r
+ snprintf(volname, 30, "%s%d", AliITSUGeomTGeo::GetITSSensorPattern(), fLayerNumber);\r
+ TGeoVolume *sensVol = new TGeoVolume(volname, sensor, medSi);\r
+ sensVol->SetVisibility(kTRUE);\r
+ sensVol->SetLineColor(8);\r
+ sensVol->SetLineWidth(1);\r
+ sensVol->SetFillColor(sensVol->GetLineColor());\r
+ sensVol->SetFillStyle(4000); // 0% transparent\r
+\r
+\r
+ // Now build up the module\r
+ xpos = 0.;\r
+ ypos = -module->GetDY() + sensor->GetDY();\r
+ zpos = 0.;\r
+\r
+ modVol->AddNode(sensVol, 1, new TGeoTranslation(xpos, ypos, zpos));\r
+\r
+ // Done, return the module\r
+ return modVol;\r
+}\r
+\r
+//________________________________________________________________________\r
+Double_t AliITSUv0Layer::RadiusOfTurboContainer(){\r
+//\r
+// Computes the inner radius of the air container for the Turbo configuration\r
+// as the radius of either the circle tangent to the ladder or the circle\r
+// passing for the ladder's lower vertex\r
+//\r
+// Input:\r
+// none (all needed parameters are class members)\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+// the radius of the container if >0, else flag to use the lower vertex\r
+//\r
+// Created: 08 Mar 2012 Mario Sitta\r
+//\r
+\r
+ Double_t rr, delta, z, lladd, rladd;\r
+\r
+ if (fLadderThick > 89.) // Very big angle: avoid overflows since surely\r
+ return -1; // the radius from lower vertex is the right value\r
+\r
+ rladd = fLayRadius + 0.5*fLadderThick;\r
+ delta = (0.5*fLadderThick)/CosD(fLadderTilt);\r
+ z = (0.5*fLadderThick)*TanD(fLadderTilt);\r
+\r
+ rr = rladd - delta;\r
+ lladd = (0.5*fLadderWidth) - z;\r
+\r
+ if ( (rr*SinD(fLadderTilt) < lladd) )\r
+ return (rr*CosD(fLadderTilt));\r
+ else\r
+ return -1;\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliITSUv0Layer::SetLadderTilt(const Double_t t)\r
+{\r
+//\r
+// Sets the Ladder tilt angle (for turbo layers only)\r
+//\r
+// Input:\r
+// t : the ladder tilt angle\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 08 Jul 2011 Mario Sitta\r
+//\r
+\r
+ if (fIsTurbo)\r
+ fLadderTilt = t;\r
+ else\r
+ AliError("Not a Turbo layer");\r
+\r
+}\r
+\r
+//________________________________________________________________________\r
+void AliITSUv0Layer::SetLadderWidth(const Double_t w){\r
+//\r
+// Sets the Ladder width (for turbo layers only)\r
+//\r
+// Input:\r
+// w : the ladder width\r
+//\r
+// Output:\r
+//\r
+// Return:\r
+//\r
+// Created: 08 Jul 2011 Mario Sitta\r
+//\r
+\r
+ if (fIsTurbo)\r
+ fLadderWidth = w;\r
+ else\r
+ AliError("Not a Turbo layer");\r
+\r
+}\r
+\r