]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/UPGRADE/AliITSUv1.cxx
v1
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUv1.cxx
index 77fa195b92cb338f7a58324c2006ab3cce0290bd..6172df3d815260f37d032585b878702e34a75d56 100644 (file)
@@ -70,10 +70,10 @@ AliITSUv1::AliITSUv1()
   ,fLayRadii(0)
   ,fLayZLength(0)
   ,fStavPerLay(0)
-  ,fModPerStav(0)
-  ,fStaThick(0)
-  ,fStaWidth(0)
-  ,fStaTilt(0)
+  ,fUnitPerStave(0)
+  ,fStaveThick(0)
+  ,fStaveWidth(0)
+  ,fStaveTilt(0)
   ,fDetThick(0)
   ,fChipTypeID(0)
   ,fBuildLevel(0)
@@ -102,10 +102,10 @@ AliITSUv1::AliITSUv1(const char *title,const Int_t nlay)
   ,fLayRadii(0)
   ,fLayZLength(0)
   ,fStavPerLay(0)
-  ,fModPerStav(0)
-  ,fStaThick(0)
-  ,fStaWidth(0)
-  ,fStaTilt(0)
+  ,fUnitPerStave(0)
+  ,fStaveThick(0)
+  ,fStaveWidth(0)
+  ,fStaveTilt(0)
   ,fDetThick(0)
   ,fChipTypeID(0)
   ,fBuildLevel(0)
@@ -124,34 +124,34 @@ AliITSUv1::AliITSUv1(const char *title,const Int_t nlay)
   for (Int_t j=0; j<fNLayers; j++)
     fLayerName[j].Form("%s%d",AliITSUGeomTGeo::GetITSSensorPattern(),j); // See AliITSUv1Layer
   //
-  fLayTurbo   = new Bool_t[fNLayers];
-  fLayPhi0    = new Double_t[fNLayers];
-  fLayRadii   = new Double_t[fNLayers];
-  fLayZLength = new Double_t[fNLayers];
-  fStavPerLay = new Int_t[fNLayers];
-  fModPerStav = new Int_t[fNLayers];
-  fStaThick   = new Double_t[fNLayers];
-  fStaWidth   = new Double_t[fNLayers];
-  fStaTilt    = new Double_t[fNLayers];
-  fDetThick   = new Double_t[fNLayers];
-  fChipTypeID  = new UInt_t[fNLayers];
-  fBuildLevel = new Int_t[fNLayers];
+  fLayTurbo     = new Bool_t[fNLayers];
+  fLayPhi0      = new Double_t[fNLayers];
+  fLayRadii     = new Double_t[fNLayers];
+  fLayZLength   = new Double_t[fNLayers];
+  fStavPerLay   = new Int_t[fNLayers];
+  fUnitPerStave = new Int_t[fNLayers];
+  fStaveThick   = new Double_t[fNLayers];
+  fStaveWidth   = new Double_t[fNLayers];
+  fStaveTilt    = new Double_t[fNLayers];
+  fDetThick     = new Double_t[fNLayers];
+  fChipTypeID   = new UInt_t[fNLayers];
+  fBuildLevel   = new Int_t[fNLayers];
 
 
   fUpGeom = new AliITSUv1Layer*[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.;
-      fStavPerLay[j] = 0;
-      fModPerStav[j] = 0;
-      fStaWidth[j] = 0.;
-      fDetThick[j] = 0.;
-      fChipTypeID[j] = 0;
-      fBuildLevel[j] = 0;
-      fUpGeom[j] = 0;     
+      fLayPhi0[j]      = 0;
+      fLayRadii[j]     = 0.;
+      fLayZLength[j]   = 0.;
+      fStavPerLay[j]   = 0;
+      fUnitPerStave[j] = 0;
+      fStaveWidth[j]   = 0.;
+      fDetThick[j]     = 0.;
+      fChipTypeID[j]   = 0;
+      fBuildLevel[j]   = 0;
+      fUpGeom[j]       = 0;
     }
   }
 }
@@ -170,10 +170,10 @@ AliITSUv1::~AliITSUv1() {
   delete [] fLayRadii;
   delete [] fLayZLength;
   delete [] fStavPerLay;
-  delete [] fModPerStav;
-  delete [] fStaThick;
-  delete [] fStaWidth;
-  delete [] fStaTilt;
+  delete [] fUnitPerStave;
+  delete [] fStaveThick;
+  delete [] fStaveWidth;
+  delete [] fStaveTilt;
   delete [] fDetThick;
   delete [] fChipTypeID;
   delete [] fBuildLevel;
@@ -224,7 +224,7 @@ void AliITSUv1::AddAlignableVolumes() const{
       //printf("SetAlignable: %s %s\n",snmL.Data(),pthL.Data());
       gGeoManager->SetAlignableEntry(AliITSUGeomTGeo::ComposeSymNameStave(lr,ld),pthL.Data());
       //
-      for (int md=0; md<fModPerStav[lr]; md++) {
+      for (int md=0; md<fUnitPerStave[lr]; md++) {
        //
        TString pthM = Form("%s/%s%d_%d",pthL.Data(),AliITSUGeomTGeo::GetITSChipPattern(),lr,md);
        //
@@ -287,21 +287,21 @@ void AliITSUv1::CreateGeometry() {
   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 (fStavPerLay[j] <= 0)               AliFatal(Form("Wrong number of staves for layer %d (%d)",j,fStavPerLay[j]));
-    if (fModPerStav[j] <= 0)               AliFatal(Form("Wrong number of chips for layer %d (%d)",j,fModPerStav[j]));
-    if (fStaThick[j] < 0)                  AliFatal(Form("Wrong stave thickness for layer %d (%f)",j,fStaThick[j]));
-    if (fLayTurbo[j] && fStaWidth[j] <= 0) AliFatal(Form("Wrong stave width for layer %d (%f)",j,fStaWidth[j]));
-    if (fDetThick[j] < 0)                  AliFatal(Form("Wrong chip thickness for layer %d (%f)",j,fDetThick[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 (fStavPerLay[j] <= 0)                 AliFatal(Form("Wrong number of staves for layer %d (%d)",j,fStavPerLay[j]));
+    if (fUnitPerStave[j] <= 0)               AliFatal(Form("Wrong number of chips for layer %d (%d)",j,fUnitPerStave[j]));
+    if (fStaveThick[j] < 0)                  AliFatal(Form("Wrong stave thickness for layer %d (%f)",j,fStaveThick[j]));
+    if (fLayTurbo[j] && fStaveWidth[j] <= 0) AliFatal(Form("Wrong stave width for layer %d (%f)",j,fStaveWidth[j]));
+    if (fDetThick[j] < 0)                    AliFatal(Form("Wrong chip 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 (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 (fStaThick[j] == 0) AliInfo(Form("Stave thickness for layer %d not set, using default",j));
-    if (fDetThick[j] == 0) AliInfo(Form("Chip thickness for layer %d not set, using default",j));
+    if (fStaveThick[j] == 0) AliInfo(Form("Stave thickness for layer %d not set, using default",j));
+    if (fDetThick[j]   == 0) AliInfo(Form("Chip thickness for layer %d not set, using default",j));
 
   } // for (Int_t j=0; j<fNLayers; j++)
 
@@ -321,8 +321,8 @@ void AliITSUv1::CreateGeometry() {
     //
     if (fLayTurbo[j]) {
       fUpGeom[j] = new AliITSUv1Layer(j,kTRUE,kFALSE);
-      fUpGeom[j]->SetStaveWidth(fStaWidth[j]);
-      fUpGeom[j]->SetStaveTilt(fStaTilt[j]);
+      fUpGeom[j]->SetStaveWidth(fStaveWidth[j]);
+      fUpGeom[j]->SetStaveTilt(fStaveTilt[j]);
     }
     else fUpGeom[j] = new AliITSUv1Layer(j,kFALSE);
     //
@@ -330,7 +330,7 @@ void AliITSUv1::CreateGeometry() {
     fUpGeom[j]->SetRadius(fLayRadii[j]);
     fUpGeom[j]->SetZLength(fLayZLength[j]);
     fUpGeom[j]->SetNStaves(fStavPerLay[j]);
-    fUpGeom[j]->SetNChips(fModPerStav[j]);
+    fUpGeom[j]->SetNUnits(fUnitPerStave[j]);
     fUpGeom[j]->SetChipType(fChipTypeID[j]);
     fUpGeom[j]->SetBuildLevel(fBuildLevel[j]);
     if (j < 3)
@@ -339,8 +339,8 @@ void AliITSUv1::CreateGeometry() {
       fUpGeom[j]->SetStaveModel(fStaveModelOB);
     AliDebug(1,Form("fBuildLevel: %d\n",fBuildLevel[j]));
     //
-    if (fStaThick[j] != 0) fUpGeom[j]->SetStaveThick(fStaThick[j]);
-    if (fDetThick[j] != 0) fUpGeom[j]->SetSensorThick(fDetThick[j]);
+    if (fStaveThick[j] != 0) fUpGeom[j]->SetStaveThick(fStaveThick[j]);
+    if (fDetThick[j]   != 0) fUpGeom[j]->SetSensorThick(fDetThick[j]);
     //
     for (int iw=0;iw<fNWrapVol;iw++) {
       if (fLayRadii[j]>fWrapRMin[iw] && fLayRadii[j]<fWrapRMax[iw]) {
@@ -487,7 +487,7 @@ void AliITSUv1::CreateMaterials() {
 //______________________________________________________________________
 void AliITSUv1::DefineLayer(const Int_t nlay, const double phi0, const Double_t r,
                            const Double_t zlen, const Int_t nstav,
-                           const Int_t nmod, const Double_t lthick,
+                           const Int_t nunit, const Double_t lthick,
                            const Double_t dthick, const UInt_t dettypeID,
                            const Int_t buildLevel)
 {
@@ -498,9 +498,11 @@ void AliITSUv1::DefineLayer(const Int_t nlay, const double phi0, const Double_t
   //          r       layer radius
   //          zlen    layer length
   //          nstav   number of staves
-  //          nmod    number of chips per stave
+  //          nunit   IB: number of chips per stave
+  //                  OB: number of modules per half stave
   //          lthick  stave 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.
@@ -517,8 +519,8 @@ void AliITSUv1::DefineLayer(const Int_t nlay, const double phi0, const Double_t
   fLayRadii[nlay] = r;
   fLayZLength[nlay] = zlen;
   fStavPerLay[nlay] = nstav;
-  fModPerStav[nlay] = nmod;
-  fStaThick[nlay] = lthick;
+  fUnitPerStave[nlay] = nunit;
+  fStaveThick[nlay] = lthick;
   fDetThick[nlay] = dthick;
   fChipTypeID[nlay] = dettypeID;
   fBuildLevel[nlay] = buildLevel;
@@ -527,7 +529,7 @@ void AliITSUv1::DefineLayer(const Int_t nlay, const double phi0, const Double_t
 
 //______________________________________________________________________
 void AliITSUv1::DefineLayerTurbo(Int_t nlay, Double_t phi0, Double_t r, Double_t zlen, Int_t nstav,
-                                Int_t nmod, Double_t width, Double_t tilt,
+                                Int_t nunit, Double_t width, Double_t tilt,
                                 Double_t lthick,Double_t dthick,
                                 UInt_t dettypeID, Int_t buildLevel)
 {
@@ -539,7 +541,8 @@ void AliITSUv1::DefineLayerTurbo(Int_t nlay, Double_t phi0, Double_t r, Double_t
   //          r       layer radius
   //          zlen    layer length
   //          nstav   number of staves
-  //          nmod    number of chips per stave
+  //          nunit   IB: number of chips per stave
+  //                  OB: number of modules per half stave
   //          width   stave width
   //          tilt    layer tilt angle (degrees)
   //          lthick  stave thickness (if omitted, defaults to 0)
@@ -561,10 +564,10 @@ void AliITSUv1::DefineLayerTurbo(Int_t nlay, Double_t phi0, Double_t r, Double_t
   fLayRadii[nlay] = r;
   fLayZLength[nlay] = zlen;
   fStavPerLay[nlay] = nstav;
-  fModPerStav[nlay] = nmod;
-  fStaThick[nlay] = lthick;
-  fStaWidth[nlay] = width;
-  fStaTilt[nlay] = tilt;
+  fUnitPerStave[nlay] = nunit;
+  fStaveThick[nlay] = lthick;
+  fStaveWidth[nlay] = width;
+  fStaveTilt[nlay] = tilt;
   fDetThick[nlay] = dthick;
   fChipTypeID[nlay] = dettypeID;
   fBuildLevel[nlay] = buildLevel;
@@ -587,7 +590,8 @@ void AliITSUv1::GetLayerParameters(Int_t nlay, Double_t &phi0,
   //          r       layer radius
   //          zlen    layer length
   //          nstav   number of staves
-  //          nmod    number of chips per stave
+  //          nmod    IB: number of chips per stave
+  //                  OB: number of modules per half stave
   //          width   stave width
   //          tilt    stave tilt angle
   //          lthick  stave thickness
@@ -605,10 +609,10 @@ void AliITSUv1::GetLayerParameters(Int_t nlay, Double_t &phi0,
   r      = fLayRadii[nlay];
   zlen   = fLayZLength[nlay];
   nstav  = fStavPerLay[nlay];
-  nmod   = fModPerStav[nlay];
-  width  = fStaWidth[nlay];
-  tilt   = fStaTilt[nlay];
-  lthick = fStaThick[nlay];
+  nmod   = fUnitPerStave[nlay];
+  width  = fStaveWidth[nlay];
+  tilt   = fStaveTilt[nlay];
+  lthick = fStaveThick[nlay];
   dthick = fDetThick[nlay];
   dettype= fChipTypeID[nlay];
 }
@@ -679,6 +683,7 @@ void AliITSUv1::StepManager()
   //   none.
   // Return:
   //   none.
+  //
   if(!(this->IsActive())) return;
   if(!(gMC->TrackCharge())) return;
   //
@@ -690,44 +695,43 @@ void AliITSUv1::StepManager()
   //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
-
+  //
+  if (lay < 0 || lay >= fNLayers) {
+    AliError(Form("Invalid value: lay=%d. Not an ITS sensitive volume",lay));
+    return; // not an ITS sensitive 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;
+  Int_t chipID, status = 0;
   //
   // Track status
   if(gMC->IsTrackInside())      status +=  1;
   if(gMC->IsTrackEntering())    status +=  2;
-  if(gMC->IsTrackExiting())     status +=  4;
+  if(gMC->IsTrackExiting()) {
+    AddTrackReference(gAlice->GetMCApp()->GetCurrentTrackNumber(), AliTrackReference::kITS);
+    status +=  4;
+  } // if Outer ITS mother Volume
   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->GetChipIndex(lay,cpn0,cpn1);
-  //RS2DEL  fInitGeom.DecodeDetector(mod,lay+1,cpn0,cpn1,copy);
+  gMC->TrackPosition(position);
+  int chip=-1,module=-1,sstave=-1,stave=-1,level=0; // volume copies on different levels
+  gMC->CurrentVolOffID(++level,chip);
+  if (fGeomTGeo->GetNModules(lay)>0)    gMC->CurrentVolOffID(++level,module);
+  if (fGeomTGeo->GetNHalfStaves(lay)>0) gMC->CurrentVolOffID(++level,sstave);
+  gMC->CurrentVolOffID(++level,stave);
   //
+  chipID = fGeomTGeo->GetChipIndex(lay,stave,sstave,module,chip);
   // Fill hit structure.
   //
-  hit.SetChip(mod);
+  hit.SetChip(chipID);
   hit.SetTrack(gAlice->GetMCApp()->GetCurrentTrackNumber());
   gMC->TrackPosition(position);
   gMC->TrackMomentum(momentum);