ROOT logo
#if !defined(__CINT__) || defined(__MAKECINT__)
#include <TSystem.h>
#include <TMath.h>
#endif

//---------------------------------------
double radii2Turbo(double rMin,double rMid,double rMax, double sensW)
{
  // compute turbo angle from radii and sensor width
  return TMath::ASin((rMax*rMax-rMin*rMin)/(2*rMid*sensW))*TMath::RadToDeg();
}

double radii2Phi(double rMin,double rMid,double rMax, double sensW)
{
  // compute phi coverage
  return 2*TMath::ACos((rMax+rMin)*
		       (rMid*rMid+rMin*rMax-sensW*sensW/4.)/
		       (4.*rMid*rMax*rMin));
}

void CreateITSUv1()
{
  //
  gSystem->Load("libITSUpgradeBase.so");
  gSystem->Load("libITSUpgradeSim.so");
  //
  // build ITS upgrade detector
  // sensitive area 13x15mm (X,Z) with 20x20 micron pitch, 2mm dead zone on readout side and 50 micron guardring
  const double kSensThick = 18e-4;
  const double kPitchX = 20e-4;
  const double kPitchZ = 20e-4;
  const int    kNRow   = 650; 
  const int    kNCol   = 1500;
  const double kSiThickIB = 50e-4;
  const double kSiThickOB = 50e-4;
  //  const double kSensThick = 120e-4;   // -> sensor Si thickness
  //
  const double kReadOutEdge = 0.2;   // width of the readout edge (passive bottom)
  const double kGuardRing   = 50e-4; // width of passive area on left/right/top of the sensor
  //
  const int kNLr = 7;
  const int kNLrInner = 3;
  const int kBuildLevel = 0;
  enum {kRmn,kRmd,kRmx,kNModPerStave,kPhi0,kNStave,kNPar};
  // Radii are from last TDR (ALICE-TDR-017.pdf Tab. 1.1, rMid is mean value)
  const double tdr5dat[kNLr][kNPar] = { 
    {2.24, 2.34, 2.67,  9., 16.37, 12}, // for each inner layer: rMin,rMid,rMax,NChip/Stave, phi0, nStaves
    {3.01, 3.15, 3.46,  9., 12.03, 16},
    {3.78, 3.93, 4.21,  9., 10.02, 20},
    {-1,  19.6 ,   -1,  4.,  0.  , 24},  // for others: -, rMid, -, NMod/HStave, phi0, nStaves // 24 was 49
    {-1,  24.55, -1,    4.,  0.  , 30},  // 30 was 61
    {-1,  34.39, -1,    7.,  0.  , 42},  // 42 was 88
    {-1,  39.34, -1,    7.,  0.  , 48}   // 48 was 100
  };
  const int nChipsPerModule = 7; // For OB: how many chips in a row

  // create segmentations:
  AliITSUSegmentationPix* seg0 = new AliITSUSegmentationPix(0,        // segID (0:9)
							    1,  // chips per module
							    kNCol,    // ncols (total for module)
							    kNRow,    // nrows
							    kPitchX,  // default row pitch in cm
							    kPitchZ,  // default col pitch in cm
							    kSensThick,  // sensor thickness in cm
							    -1,     // no special left col between chips
							    -1,     // no special right col between chips
							    kGuardRing, // left
							    kGuardRing, // right
							    kGuardRing, // top
							    kReadOutEdge  // bottom
							    );    // see AliITSUSegmentationPix.h for extra options
  seg0->Store(AliITSUGeomTGeo::GetITSsegmentationFileName());
  //
  seg0->Print();
  //
  double dzLr,rLr,phi0,turbo;
  int nStaveLr,nModPerStaveLr,idLr;
  //
  AliITSUv1 *ITS  = new AliITSUv1("ITS Upgrade",kNLr);
  ITS->SetStaveModelIB(AliITSUv1::kIBModel4);
  ITS->SetStaveModelOB(AliITSUv1::kOBModel2);
  //
  const int kNWrapVol = 3;
  const double wrpRMin[kNWrapVol]  = { 2.1, 15.0, 32.0};
  const double wrpRMax[kNWrapVol]  = { 7.0, 27.0+2.5, 43.0+1.5};
  const double wrpZSpan[kNWrapVol] = {28.0, 86.0, 150.0};
  //
  ITS->SetNWrapVolumes(kNWrapVol); // define wrapper volumes for layers
  for (int iw=0;iw<kNWrapVol;iw++) ITS->DefineWrapVolume(iw,wrpRMin[iw],wrpRMax[iw],wrpZSpan[iw]);
  //
  for (int idLr=0;idLr<kNLr;idLr++) {
    rLr   = tdr5dat[idLr][kRmd];
    phi0  = tdr5dat[idLr][kPhi0]; 
    //
    nStaveLr = TMath::Nint(tdr5dat[idLr][kNStave]);
    nModPerStaveLr =  TMath::Nint(tdr5dat[idLr][kNModPerStave]);
    int nChipsPerStaveLr = nModPerStaveLr;
    //
    if (idLr>=kNLrInner) {
      nChipsPerStaveLr *= nChipsPerModule;
      ITS->DefineLayer(idLr, phi0, rLr, nChipsPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, 
		       kSiThickOB, seg0->Dy(), seg0->GetChipTypeID(),kBuildLevel);
      //      printf("Add Lr%d: R=%6.2f DZ:%6.2f Staves:%3d NMod/Stave:%3d\n",
      //	     idLr,rLr,nChipsPerStaveLr*seg0->Dz(),nStaveLr,nModPerStaveLr);
    } else {
      turbo = -radii2Turbo(tdr5dat[idLr][kRmn],rLr,tdr5dat[idLr][kRmx],seg0->Dx());	
      ITS->DefineLayerTurbo(idLr, phi0, rLr, nChipsPerStaveLr*seg0->Dz(), nStaveLr, nChipsPerStaveLr, 
			    seg0->Dx(), turbo, kSiThickIB, seg0->Dy(), seg0->GetChipTypeID(),kBuildLevel);
      //      printf("Add Lr%d: R=%6.2f DZ:%6.2f Turbo:%+6.2f Staves:%3d NMod/Stave:%3d\n",
      //	     idLr,rLr,nChipsPerStaveLr*seg0->Dz(),turbo,nStaveLr,nModPerStaveLr);
    }
    //
  }
  //  
}
 CreateITSUv1.C:1
 CreateITSUv1.C:2
 CreateITSUv1.C:3
 CreateITSUv1.C:4
 CreateITSUv1.C:5
 CreateITSUv1.C:6
 CreateITSUv1.C:7
 CreateITSUv1.C:8
 CreateITSUv1.C:9
 CreateITSUv1.C:10
 CreateITSUv1.C:11
 CreateITSUv1.C:12
 CreateITSUv1.C:13
 CreateITSUv1.C:14
 CreateITSUv1.C:15
 CreateITSUv1.C:16
 CreateITSUv1.C:17
 CreateITSUv1.C:18
 CreateITSUv1.C:19
 CreateITSUv1.C:20
 CreateITSUv1.C:21
 CreateITSUv1.C:22
 CreateITSUv1.C:23
 CreateITSUv1.C:24
 CreateITSUv1.C:25
 CreateITSUv1.C:26
 CreateITSUv1.C:27
 CreateITSUv1.C:28
 CreateITSUv1.C:29
 CreateITSUv1.C:30
 CreateITSUv1.C:31
 CreateITSUv1.C:32
 CreateITSUv1.C:33
 CreateITSUv1.C:34
 CreateITSUv1.C:35
 CreateITSUv1.C:36
 CreateITSUv1.C:37
 CreateITSUv1.C:38
 CreateITSUv1.C:39
 CreateITSUv1.C:40
 CreateITSUv1.C:41
 CreateITSUv1.C:42
 CreateITSUv1.C:43
 CreateITSUv1.C:44
 CreateITSUv1.C:45
 CreateITSUv1.C:46
 CreateITSUv1.C:47
 CreateITSUv1.C:48
 CreateITSUv1.C:49
 CreateITSUv1.C:50
 CreateITSUv1.C:51
 CreateITSUv1.C:52
 CreateITSUv1.C:53
 CreateITSUv1.C:54
 CreateITSUv1.C:55
 CreateITSUv1.C:56
 CreateITSUv1.C:57
 CreateITSUv1.C:58
 CreateITSUv1.C:59
 CreateITSUv1.C:60
 CreateITSUv1.C:61
 CreateITSUv1.C:62
 CreateITSUv1.C:63
 CreateITSUv1.C:64
 CreateITSUv1.C:65
 CreateITSUv1.C:66
 CreateITSUv1.C:67
 CreateITSUv1.C:68
 CreateITSUv1.C:69
 CreateITSUv1.C:70
 CreateITSUv1.C:71
 CreateITSUv1.C:72
 CreateITSUv1.C:73
 CreateITSUv1.C:74
 CreateITSUv1.C:75
 CreateITSUv1.C:76
 CreateITSUv1.C:77
 CreateITSUv1.C:78
 CreateITSUv1.C:79
 CreateITSUv1.C:80
 CreateITSUv1.C:81
 CreateITSUv1.C:82
 CreateITSUv1.C:83
 CreateITSUv1.C:84
 CreateITSUv1.C:85
 CreateITSUv1.C:86
 CreateITSUv1.C:87
 CreateITSUv1.C:88
 CreateITSUv1.C:89
 CreateITSUv1.C:90
 CreateITSUv1.C:91
 CreateITSUv1.C:92
 CreateITSUv1.C:93
 CreateITSUv1.C:94
 CreateITSUv1.C:95
 CreateITSUv1.C:96
 CreateITSUv1.C:97
 CreateITSUv1.C:98
 CreateITSUv1.C:99
 CreateITSUv1.C:100
 CreateITSUv1.C:101
 CreateITSUv1.C:102
 CreateITSUv1.C:103
 CreateITSUv1.C:104
 CreateITSUv1.C:105
 CreateITSUv1.C:106
 CreateITSUv1.C:107
 CreateITSUv1.C:108
 CreateITSUv1.C:109
 CreateITSUv1.C:110
 CreateITSUv1.C:111
 CreateITSUv1.C:112
 CreateITSUv1.C:113
 CreateITSUv1.C:114
 CreateITSUv1.C:115
 CreateITSUv1.C:116