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

//---------------------------------------
Int_t getNStaves(AliITSUSegmentationPix* seg, double tilt, double r0, double minOvl);

void CreateITSU()
{
  //
  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   = 750;
  const int    kNChips = 2;
  const double kLrTick03 = 120e-4;   // -> effective thickness for ~0.3%X layers
  const double kLrTick08 = 600e-4;   // -> effective thickness for ~0.8%X layers
  //
  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
  // create segmentations:
  AliITSUSegmentationPix* seg0 = new AliITSUSegmentationPix(0,        // segID (0:9)
							    kNChips,  // chips per module
							    kNChips*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());
  //
  AliITSUSegmentationPix* seg1 = new AliITSUSegmentationPix(1,        // segID (0:9)
							    kNChips,  // chips per module
							    kNChips*kNCol,    // ncols (total for module)
							    2*kNRow,    // nrows for oute layers
							    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
							    kReadOutEdge, // top   !!! readout from both sides
							    kReadOutEdge  // bottom
							    );    // see AliITSUSegmentationPix.h for extra options
  seg1->Store(AliITSUGeomTGeo::GetITSsegmentationFileName());
  //
  seg0->Print();
  seg1->Print();
  //
  const double kMinOvl = 0.005; // require active zones overlap
  const double kPhi0 = 0.;  // az.angle of 1st stave
  const double kTilt = -10.; // tilt in degrees
  double dzLr,rLr,ovlA,xActProj;
  AliITSUSegmentationPix* seg=0;
  int nStaveLr,nModPerStaveLr,idLr;
  //      virtual void   DefineLayerTurbo(const Int_t nlay, const Double_t r,  const Double_t zlen, const Int_t nladd,   const Int_t nmod, const Double_t width,
  //				  const Double_t tilt,   const Double_t lthick = 0.,    const Double_t dthick = 0.,   const UInt_t detType=0);
  AliITSUv0 *ITS  = new AliITSUv0("ITS Upgrade",7);
  ITS->SetStaveModel(AliITSUv0::kModel22);
  //
  const int kNWrapVol = 3;
  const double wrpRMin[kNWrapVol]  = { 2.05, 15.0, 32.0};
  const double wrpRMax[kNWrapVol]  = { 8.0, 27.0, 45.0};
  const double wrpZSpan[kNWrapVol] = {28.0, 86.0, 152.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]);
  // 
  // INNER LAYERS
  idLr = 0;
  rLr = 2.2; // 2.165?
  dzLr = 2*11.2;   // min Z to cover
  seg = seg0;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick03, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //
  idLr = 1;
  rLr = 2.8; // 2.77 ?
  dzLr = 2*12.1;
  seg = seg0;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick03, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //
  idLr = 2;
  rLr = 3.6; // 3.58 ?
  dzLr = 2*13.4;
  seg = seg0;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick03, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //
  // 
  // MIDDLE LAYERS (double side readout sensors)
  idLr = 3;
  rLr = 20.0;
  dzLr = 2*39.0;
  seg = seg1;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick08, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //
  idLr = 4;
  rLr = 22.0;
  dzLr = 2*41.8;
  seg = seg1;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick08, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //
  // 
  // OUTER LAYERS (double side readout sensors)
  idLr = 5;
  rLr = 40.0;
  dzLr = 2*71.2;
  seg = seg1;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick08, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //
  idLr = 6;
  rLr = 43.0;
  dzLr = 2*74.3;
  seg = seg1;
  nModPerStaveLr = 1+dzLr/seg->Dz();
  nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl);
  ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, seg->Dx(), kTilt, kLrTick08, seg->Dy(), seg->GetChipTypeID());
  printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz()/2,nStaveLr,nModPerStaveLr);
  //  
}

Int_t getNStaves(AliITSUSegmentationPix* seg, double tilt, double r0, double minOvl)
{
  double dphi = (90.-tilt)*TMath::DegToRad();
  double cs = TMath::Cos(dphi);
  double sn = TMath::Sin(dphi);  
  double dx = seg->Dx();
  double tL = -dx/2 + seg->GetGuardBot();
  double tU =  dx/2 - seg->GetGuardTop();
  //
  double xL = r0 + cs*tL;
  double yL =      sn*tL;
  double xU = r0 + cs*tU;
  double yU =      sn*tU;
  double phiL = TMath::ATan2(yL,xL);
  double phiU = TMath::ATan2(yU,xU);
  double dphi = TMath::Abs(phiL-phiU);
  if (dphi>TMath::Pi()) dphi = TMath::Abs(dphi-TMath::Pi()*2);
  double span = dphi*r0;
  //
  double ov = -1;
  int nStaveLr = 1 + r0*TMath::Pi()*2/span;
  do { ov = 1.-r0*TMath::Pi()*2/nStaveLr/span; } while ( minOvl>=0 && ov<minOvl && nStaveLr++ );
  printf("Recomend %2d staves for R=%5.2f, ActiveOvl=%5.2f\% (%6.f micron)\n",nStaveLr,r0,ov*100,ov*span*1e4);
  return nStaveLr;
}
 CreateITSU_cdr.C:1
 CreateITSU_cdr.C:2
 CreateITSU_cdr.C:3
 CreateITSU_cdr.C:4
 CreateITSU_cdr.C:5
 CreateITSU_cdr.C:6
 CreateITSU_cdr.C:7
 CreateITSU_cdr.C:8
 CreateITSU_cdr.C:9
 CreateITSU_cdr.C:10
 CreateITSU_cdr.C:11
 CreateITSU_cdr.C:12
 CreateITSU_cdr.C:13
 CreateITSU_cdr.C:14
 CreateITSU_cdr.C:15
 CreateITSU_cdr.C:16
 CreateITSU_cdr.C:17
 CreateITSU_cdr.C:18
 CreateITSU_cdr.C:19
 CreateITSU_cdr.C:20
 CreateITSU_cdr.C:21
 CreateITSU_cdr.C:22
 CreateITSU_cdr.C:23
 CreateITSU_cdr.C:24
 CreateITSU_cdr.C:25
 CreateITSU_cdr.C:26
 CreateITSU_cdr.C:27
 CreateITSU_cdr.C:28
 CreateITSU_cdr.C:29
 CreateITSU_cdr.C:30
 CreateITSU_cdr.C:31
 CreateITSU_cdr.C:32
 CreateITSU_cdr.C:33
 CreateITSU_cdr.C:34
 CreateITSU_cdr.C:35
 CreateITSU_cdr.C:36
 CreateITSU_cdr.C:37
 CreateITSU_cdr.C:38
 CreateITSU_cdr.C:39
 CreateITSU_cdr.C:40
 CreateITSU_cdr.C:41
 CreateITSU_cdr.C:42
 CreateITSU_cdr.C:43
 CreateITSU_cdr.C:44
 CreateITSU_cdr.C:45
 CreateITSU_cdr.C:46
 CreateITSU_cdr.C:47
 CreateITSU_cdr.C:48
 CreateITSU_cdr.C:49
 CreateITSU_cdr.C:50
 CreateITSU_cdr.C:51
 CreateITSU_cdr.C:52
 CreateITSU_cdr.C:53
 CreateITSU_cdr.C:54
 CreateITSU_cdr.C:55
 CreateITSU_cdr.C:56
 CreateITSU_cdr.C:57
 CreateITSU_cdr.C:58
 CreateITSU_cdr.C:59
 CreateITSU_cdr.C:60
 CreateITSU_cdr.C:61
 CreateITSU_cdr.C:62
 CreateITSU_cdr.C:63
 CreateITSU_cdr.C:64
 CreateITSU_cdr.C:65
 CreateITSU_cdr.C:66
 CreateITSU_cdr.C:67
 CreateITSU_cdr.C:68
 CreateITSU_cdr.C:69
 CreateITSU_cdr.C:70
 CreateITSU_cdr.C:71
 CreateITSU_cdr.C:72
 CreateITSU_cdr.C:73
 CreateITSU_cdr.C:74
 CreateITSU_cdr.C:75
 CreateITSU_cdr.C:76
 CreateITSU_cdr.C:77
 CreateITSU_cdr.C:78
 CreateITSU_cdr.C:79
 CreateITSU_cdr.C:80
 CreateITSU_cdr.C:81
 CreateITSU_cdr.C:82
 CreateITSU_cdr.C:83
 CreateITSU_cdr.C:84
 CreateITSU_cdr.C:85
 CreateITSU_cdr.C:86
 CreateITSU_cdr.C:87
 CreateITSU_cdr.C:88
 CreateITSU_cdr.C:89
 CreateITSU_cdr.C:90
 CreateITSU_cdr.C:91
 CreateITSU_cdr.C:92
 CreateITSU_cdr.C:93
 CreateITSU_cdr.C:94
 CreateITSU_cdr.C:95
 CreateITSU_cdr.C:96
 CreateITSU_cdr.C:97
 CreateITSU_cdr.C:98
 CreateITSU_cdr.C:99
 CreateITSU_cdr.C:100
 CreateITSU_cdr.C:101
 CreateITSU_cdr.C:102
 CreateITSU_cdr.C:103
 CreateITSU_cdr.C:104
 CreateITSU_cdr.C:105
 CreateITSU_cdr.C:106
 CreateITSU_cdr.C:107
 CreateITSU_cdr.C:108
 CreateITSU_cdr.C:109
 CreateITSU_cdr.C:110
 CreateITSU_cdr.C:111
 CreateITSU_cdr.C:112
 CreateITSU_cdr.C:113
 CreateITSU_cdr.C:114
 CreateITSU_cdr.C:115
 CreateITSU_cdr.C:116
 CreateITSU_cdr.C:117
 CreateITSU_cdr.C:118
 CreateITSU_cdr.C:119
 CreateITSU_cdr.C:120
 CreateITSU_cdr.C:121
 CreateITSU_cdr.C:122
 CreateITSU_cdr.C:123
 CreateITSU_cdr.C:124
 CreateITSU_cdr.C:125
 CreateITSU_cdr.C:126
 CreateITSU_cdr.C:127
 CreateITSU_cdr.C:128
 CreateITSU_cdr.C:129
 CreateITSU_cdr.C:130
 CreateITSU_cdr.C:131
 CreateITSU_cdr.C:132
 CreateITSU_cdr.C:133
 CreateITSU_cdr.C:134
 CreateITSU_cdr.C:135
 CreateITSU_cdr.C:136
 CreateITSU_cdr.C:137
 CreateITSU_cdr.C:138
 CreateITSU_cdr.C:139
 CreateITSU_cdr.C:140
 CreateITSU_cdr.C:141
 CreateITSU_cdr.C:142
 CreateITSU_cdr.C:143
 CreateITSU_cdr.C:144
 CreateITSU_cdr.C:145
 CreateITSU_cdr.C:146
 CreateITSU_cdr.C:147
 CreateITSU_cdr.C:148
 CreateITSU_cdr.C:149
 CreateITSU_cdr.C:150
 CreateITSU_cdr.C:151
 CreateITSU_cdr.C:152
 CreateITSU_cdr.C:153
 CreateITSU_cdr.C:154
 CreateITSU_cdr.C:155
 CreateITSU_cdr.C:156
 CreateITSU_cdr.C:157
 CreateITSU_cdr.C:158
 CreateITSU_cdr.C:159
 CreateITSU_cdr.C:160
 CreateITSU_cdr.C:161
 CreateITSU_cdr.C:162
 CreateITSU_cdr.C:163
 CreateITSU_cdr.C:164
 CreateITSU_cdr.C:165
 CreateITSU_cdr.C:166
 CreateITSU_cdr.C:167
 CreateITSU_cdr.C:168
 CreateITSU_cdr.C:169
 CreateITSU_cdr.C:170
 CreateITSU_cdr.C:171
 CreateITSU_cdr.C:172
 CreateITSU_cdr.C:173
 CreateITSU_cdr.C:174
 CreateITSU_cdr.C:175
 CreateITSU_cdr.C:176
 CreateITSU_cdr.C:177