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 CreateITSUv0()
{
  //
  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 kLrThick03 = 120e-4;   // -> effective thickness for ~0.3%X layers
  const double kLrThick08 = 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
  //
  const int kNLr = 7;
  const int kNLrInner = 3;
  const int kBuildLevel = 3;
  enum {kRmn,kRmd,kRmx,kNModPerStave,kPhi0,kNStave,kNPar};
  const double tdr5dat[kNLr][kNPar] = { 
    {2.24, 2.34, 2.67,  9., 16.37, 12}, // for each inner layer: rMin,rMid,rMax,NMod/Stave,phi0, nStave
    {3.01, 3.15, 3.46,  9., 12.03, 16},
    {3.78, 3.93, 4.21,  9., 10.02, 20},
    {-1,   19.4, -1,    28., 0.  , 49},  // for others: -, rMid, -, NMod/Stave, phi0, nStave
    {-1,   24.7, -1,    28., 0.  , 61},
    {-1,   35.32,-1,    49., 0.  , 88},
    {-1,   40.52,-1,    49., 0.  , 100}
  };

  // 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 kTilt = -10.; // tilt in degrees for outer layers
  double dzLr,rLr,phi0,turbo,thick;
  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);
  AliITSUv1 *ITS  = new AliITSUv1("ITS Upgrade",7);
  ITS->SetStaveModelIB(AliITSUv1::kIBModel22);
  ITS->SetStaveModelOB(AliITSUv1::kOBModel0);
  //
  const int kNWrapVol = 3;
  const double wrpRMin[kNWrapVol]  = { 2.1, 15.0, 32.0};
  const double wrpRMax[kNWrapVol]  = { 7.0, 27.0, 43.0};
  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]; 
    if (idLr<kNLrInner) {
      seg = seg0;
      turbo = -radii2Turbo(tdr5dat[idLr][kRmn],rLr,tdr5dat[idLr][kRmx],seg->Dx());	
      thick = kLrThick03;
    }
    else {
      seg   = seg1;
      turbo = kTilt;
      thick = kLrThick08;
    }
    nStaveLr = TMath::Nint(tdr5dat[idLr][kNStave]);
    if (nStaveLr<0) nStaveLr = getNStaves(seg,kTilt,rLr,kMinOvl); // calculate automatically
    nModPerStaveLr =  TMath::Nint(tdr5dat[idLr][kNModPerStave]);
    ITS->DefineLayerTurbo(idLr, phi0, rLr, nModPerStaveLr*seg->Dz(), nStaveLr, nModPerStaveLr, 
			  seg->Dx(), turbo, thick, seg->Dy(), seg->GetChipTypeID());
    printf("Add Lr%d: R=%6.2f DZ:%6.2f Turbo:%+6.2f Staves:%3d NMod/Stave:%3d\n",idLr,rLr,nModPerStaveLr*seg->Dz(),turbo,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("Reccommend %2d staves for R=%5.2f, ActiveOvl=%5.2f\% (%6.f micron)\n",nStaveLr,r0,ov*100,ov*span*1e4);
  return nStaveLr;
}
 CreateITSUv0.C:1
 CreateITSUv0.C:2
 CreateITSUv0.C:3
 CreateITSUv0.C:4
 CreateITSUv0.C:5
 CreateITSUv0.C:6
 CreateITSUv0.C:7
 CreateITSUv0.C:8
 CreateITSUv0.C:9
 CreateITSUv0.C:10
 CreateITSUv0.C:11
 CreateITSUv0.C:12
 CreateITSUv0.C:13
 CreateITSUv0.C:14
 CreateITSUv0.C:15
 CreateITSUv0.C:16
 CreateITSUv0.C:17
 CreateITSUv0.C:18
 CreateITSUv0.C:19
 CreateITSUv0.C:20
 CreateITSUv0.C:21
 CreateITSUv0.C:22
 CreateITSUv0.C:23
 CreateITSUv0.C:24
 CreateITSUv0.C:25
 CreateITSUv0.C:26
 CreateITSUv0.C:27
 CreateITSUv0.C:28
 CreateITSUv0.C:29
 CreateITSUv0.C:30
 CreateITSUv0.C:31
 CreateITSUv0.C:32
 CreateITSUv0.C:33
 CreateITSUv0.C:34
 CreateITSUv0.C:35
 CreateITSUv0.C:36
 CreateITSUv0.C:37
 CreateITSUv0.C:38
 CreateITSUv0.C:39
 CreateITSUv0.C:40
 CreateITSUv0.C:41
 CreateITSUv0.C:42
 CreateITSUv0.C:43
 CreateITSUv0.C:44
 CreateITSUv0.C:45
 CreateITSUv0.C:46
 CreateITSUv0.C:47
 CreateITSUv0.C:48
 CreateITSUv0.C:49
 CreateITSUv0.C:50
 CreateITSUv0.C:51
 CreateITSUv0.C:52
 CreateITSUv0.C:53
 CreateITSUv0.C:54
 CreateITSUv0.C:55
 CreateITSUv0.C:56
 CreateITSUv0.C:57
 CreateITSUv0.C:58
 CreateITSUv0.C:59
 CreateITSUv0.C:60
 CreateITSUv0.C:61
 CreateITSUv0.C:62
 CreateITSUv0.C:63
 CreateITSUv0.C:64
 CreateITSUv0.C:65
 CreateITSUv0.C:66
 CreateITSUv0.C:67
 CreateITSUv0.C:68
 CreateITSUv0.C:69
 CreateITSUv0.C:70
 CreateITSUv0.C:71
 CreateITSUv0.C:72
 CreateITSUv0.C:73
 CreateITSUv0.C:74
 CreateITSUv0.C:75
 CreateITSUv0.C:76
 CreateITSUv0.C:77
 CreateITSUv0.C:78
 CreateITSUv0.C:79
 CreateITSUv0.C:80
 CreateITSUv0.C:81
 CreateITSUv0.C:82
 CreateITSUv0.C:83
 CreateITSUv0.C:84
 CreateITSUv0.C:85
 CreateITSUv0.C:86
 CreateITSUv0.C:87
 CreateITSUv0.C:88
 CreateITSUv0.C:89
 CreateITSUv0.C:90
 CreateITSUv0.C:91
 CreateITSUv0.C:92
 CreateITSUv0.C:93
 CreateITSUv0.C:94
 CreateITSUv0.C:95
 CreateITSUv0.C:96
 CreateITSUv0.C:97
 CreateITSUv0.C:98
 CreateITSUv0.C:99
 CreateITSUv0.C:100
 CreateITSUv0.C:101
 CreateITSUv0.C:102
 CreateITSUv0.C:103
 CreateITSUv0.C:104
 CreateITSUv0.C:105
 CreateITSUv0.C:106
 CreateITSUv0.C:107
 CreateITSUv0.C:108
 CreateITSUv0.C:109
 CreateITSUv0.C:110
 CreateITSUv0.C:111
 CreateITSUv0.C:112
 CreateITSUv0.C:113
 CreateITSUv0.C:114
 CreateITSUv0.C:115
 CreateITSUv0.C:116
 CreateITSUv0.C:117
 CreateITSUv0.C:118
 CreateITSUv0.C:119
 CreateITSUv0.C:120
 CreateITSUv0.C:121
 CreateITSUv0.C:122
 CreateITSUv0.C:123
 CreateITSUv0.C:124
 CreateITSUv0.C:125
 CreateITSUv0.C:126
 CreateITSUv0.C:127
 CreateITSUv0.C:128
 CreateITSUv0.C:129
 CreateITSUv0.C:130
 CreateITSUv0.C:131
 CreateITSUv0.C:132
 CreateITSUv0.C:133
 CreateITSUv0.C:134
 CreateITSUv0.C:135
 CreateITSUv0.C:136
 CreateITSUv0.C:137
 CreateITSUv0.C:138
 CreateITSUv0.C:139
 CreateITSUv0.C:140
 CreateITSUv0.C:141
 CreateITSUv0.C:142
 CreateITSUv0.C:143
 CreateITSUv0.C:144
 CreateITSUv0.C:145
 CreateITSUv0.C:146
 CreateITSUv0.C:147
 CreateITSUv0.C:148
 CreateITSUv0.C:149
 CreateITSUv0.C:150
 CreateITSUv0.C:151
 CreateITSUv0.C:152
 CreateITSUv0.C:153
 CreateITSUv0.C:154
 CreateITSUv0.C:155
 CreateITSUv0.C:156
 CreateITSUv0.C:157
 CreateITSUv0.C:158
 CreateITSUv0.C:159