1) Fix in tracking condition pattern definition
authorshahoian <shahoian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 14 May 2013 08:55:28 +0000 (08:55 +0000)
committershahoian <shahoian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Tue, 14 May 2013 08:55:28 +0000 (08:55 +0000)
2) ITS in the Config.C redefined for 20x20 pixels with 3*0.3,4*0.5% X/X0 layers
The module has 4chips with 13(X)x15(Z)mm active zone each, 2mm dead zone on the
readout side and 50micron dead zone around.
3) Regenerated itsupcdb.tar.gz with corresponding MakeITSUSimuParam and
MakeITSRecoParam tuned for PbPb reco (for 20x20 pixels diagonal clusterization is off)

ITS/UPGRADE/AliITSUAux.h
ITS/UPGRADE/AliITSUTrackCond.cxx
ITS/UPGRADE/AliITSUTrackCond.h
ITS/UPGRADE/AliITSUTrackerGlo.cxx
ITS/UPGRADE/testITSU/Config.C
ITS/UPGRADE/testITSU/MakeITSRecoParam.C
ITS/UPGRADE/testITSU/itsupcdb.tar.gz

index 04244f7..f243f30 100644 (file)
@@ -37,6 +37,7 @@ namespace AliITSUAux {
   const UInt_t   kLrMask    = 0xf0000000;     // layer mask
   const UInt_t   kClMask    = 0x0fffffff;     // cluster mask
   const UInt_t   kMaxLayers = 15;             // max number of active layers
+  const UInt_t   kMaxLrMask = 0x7fff;         // bitmask for allowed layers
 }
 
 //_________________________________________________________________________________
index 4b6318d..f149086 100644 (file)
@@ -148,13 +148,15 @@ void AliITSUTrackCond::SetNLayers(int nLayers)
 }
 
 //______________________________________________________________
-void AliITSUTrackCond::AddGroupPattern(UShort_t patt)
+void AliITSUTrackCond::AddGroupPattern(UShort_t patt,Int_t minCl)
 {
-  // add new group pattern to last condition
+  // add new group pattern to last condition: the track should have at least minCl clusters at layers given by patt
   if (fNConditions<1) AliFatal("Can be called only after AddCondition");
+  if (minCl>int(AliITSUAux::kMaxLayers)) AliFatal(Form("Requested Nlayers=%d exceeds max alowed %d",minCl,AliITSUAux::kMaxLayers));
+  if (minCl<1)                           AliFatal(Form("Requested Nlayers=%d for pattern %x",minCl,patt));
   int ind = fConditions.GetSize();
   fConditions.Set(ind+1);
-  fConditions[ind] = patt;
+  fConditions[ind] = (patt&AliITSUAux::kMaxLrMask) | (minCl<<kShiftNcl);
   fAuxData[(fNConditions-1)*kNAuxSz + kNGroups]++;
 }
 
@@ -175,7 +177,7 @@ Bool_t AliITSUTrackCond::CheckPattern(UShort_t patt) const
 {
   // check if the pattern matches to some condition
   Short_t *arrAux = (Short_t*)fAuxData.GetArray();
-  Short_t *arrGrp = (Short_t*)fConditions.GetArray();  
+  UInt_t  *arrGrp = (UInt_t*)fConditions.GetArray();  
   int ncl = NumberOfBitsSet(patt);
   int cntCond = 0;
   for (int ic=0;ic<fNConditions;ic++) {
@@ -183,7 +185,11 @@ Bool_t AliITSUTrackCond::CheckPattern(UShort_t patt) const
     int grAddr = arrAux[cntCond+kCondStart]; // 1st group pattern address in the condition
     Bool_t ok = kTRUE;
     // if every group of the condition does not match, check next contition
-    for (int ig=arrAux[cntCond+kNGroups];ig--;) if ( !(patt&arrGrp[grAddr++]) ) {ok = kFALSE; break;}
+    for (int ig=arrAux[cntCond+kNGroups];ig--;) {
+      UInt_t pattReq = arrGrp[grAddr++];
+      UShort_t actLr = (pattReq&AliITSUAux::kMaxLrMask)&patt;  // patter of active layers satisfying to mask
+      if (!actLr || NumberOfBitsSet(actLr)<(pattReq>>kShiftNcl)) {ok = kFALSE; break;}
+    }
     if (ok) return kTRUE;
     cntCond += kNAuxSz;
   }
@@ -196,16 +202,18 @@ void AliITSUTrackCond::Print(Option_t*) const
   // print conditions
   int nc = GetNConditions();  
   Short_t *arrAux = (Short_t*)fAuxData.GetArray();
-  Short_t *arrGrp = (Short_t*)fConditions.GetArray();  
+  UInt_t  *arrGrp = (UInt_t*)fConditions.GetArray();  
   int cntCond = 0;
   printf("Conditions set ID=%d : %d entries\n",GetID(),nc);
   for (int i=0;i<nc;i++) {
     printf("#%2d: MinCl:%2d | %d groups :",i,arrAux[cntCond+kMinClus],arrAux[cntCond+kNGroups]);
     int grAddr = arrAux[cntCond+kCondStart];
     for (int ig=arrAux[cntCond+kNGroups];ig--;) {
+      UInt_t patt = arrGrp[grAddr];
       printf("{");
-      PrintBits(arrGrp[grAddr++], fNLayers);
-      printf("}");
+      PrintBits(patt, fNLayers);      
+      printf("|%d}",patt>>kShiftNcl);
+      grAddr++;
     }
     printf("\n");
     cntCond += kNAuxSz;
index 24810fc..2d4235a 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <TObject.h>
 #include <TArrayS.h>
+#include <TArrayI.h>
 
 //------------------------------------------------------------------------------
 //
@@ -24,6 +25,7 @@ class AliITSUTrackCond : public TObject
 {
  public:
   enum {kCondStart,kNGroups,kMinClus,kNAuxSz};
+  enum {kShiftNcl=24};  // the min_Nclusters for each pattern is stored starting from this bit
   //
   AliITSUTrackCond(Int_t nLayers=0);
   AliITSUTrackCond(const AliITSUTrackCond& src);
@@ -37,7 +39,7 @@ class AliITSUTrackCond : public TObject
   void        SetMaxCandidates(Int_t lr, Int_t nc) {fMaxCandidates[lr] = nc;}
   void        SetID(Int_t id)                      {SetUniqueID(id);}
   void        AddNewCondition(Int_t minClusters);
-  void        AddGroupPattern(UShort_t patt);
+  void        AddGroupPattern(UShort_t patt,Int_t ncl);
 
   Int_t       GetID()                                  const {return GetUniqueID();}
   Int_t       GetMaxBranches(Int_t lr)                 const {return fMaxBranches[lr];}
@@ -85,7 +87,7 @@ class AliITSUTrackCond : public TObject
   Float_t*    fNSigmaRoadZ;              // [fNLayers] number of sigmas in Z
   //
   Short_t     fNConditions;              // number of conditions defined
-  TArrayS     fConditions;               // fNConditions  set of conditions
+  TArrayI     fConditions;               // fNConditions  set of conditions
   TArrayS     fAuxData;                  // condition beginning (1st group), n groups, min clus
   //
   static Char_t  fgkClSharing;           // def cl.sharing allowed level
@@ -97,7 +99,7 @@ class AliITSUTrackCond : public TObject
   static Float_t fgkMaxMatchChi2;         // max acceptable matching chi2
   static Float_t fgkMaxITSSAChi2;         // max acceptable standalone ITS backward fit chi2
   //
-  ClassDef(AliITSUTrackCond,5)           // set of requirements on track hits pattern
+  ClassDef(AliITSUTrackCond,6)           // set of requirements on track hits pattern
 };
 
 
index da5df06..620d0c5 100644 (file)
@@ -146,7 +146,7 @@ void AliITSUTrackerGlo::CreateDefaultTrackCond()
   //
   cond->SetNLayers(fNLrActive);
   cond->AddNewCondition(fNLrActive);
-  cond->AddGroupPattern( 0xffff ); // require all layers hit
+  cond->AddGroupPattern( 0xffff, fNLrActive ); // require all layers hit
   cond->Init();
   //
   fDefTrackConds.AddLast(cond);
index 996caaa..5049339 100644 (file)
@@ -48,7 +48,7 @@
 #include <TVirtualMagField.h>
 #endif
 
-Int_t generatorFlag = 0;
+Int_t generatorFlag = 1;
 
 /* $Id: Config.C 47147 2011-02-07 11:46:44Z amastros $ */
 enum PprTrigConf_t
@@ -159,11 +159,10 @@ void Config()
 
 
   // The cocktail itself
-  
   if (generatorFlag==0) {
     // Fast generator with parametrized pi,kaon,proton distributions
     
-    int  nParticles = 100;//14022;
+    int  nParticles = 1000;//14022;
     AliGenHIJINGpara *gener = new AliGenHIJINGpara(nParticles);
     gener->SetMomentumRange(0.1, 10.);
     gener->SetPhiRange(0., 360.);
@@ -171,10 +170,58 @@ void Config()
     Float_t thmax = EtaToTheta(-2.5);  // theta max. <---> eta min
     gener->SetThetaRange(thmin,thmax);
     gener->SetOrigin(0, 0, 0);  //vertex position
-    gener->SetSigma(0, 0, 0);   //Sigma in (X,Y,Z) (cm) on IP position
+    gener->SetSigma(50e-4, 50e-4, 5.0);   //Sigma in (X,Y,Z) (cm) on IP position
+    gener->SetVertexSmear(kPerEvent);
     gener->Init();
     
-  } else if (generatorFlag==1) {
+  }
+  else if (generatorFlag==1) {
+    int  nParticlesHP = 10000;
+    int  nPiPFlat=200;
+    int  nPiMFlat=200;
+
+    AliGenCocktail *cocktail = new AliGenCocktail();
+    cocktail->SetProjectile("A", 208, 82);
+    cocktail->SetTarget    ("A", 208, 82);
+    Float_t thmin = EtaToTheta( 2.5);   // theta min. <---> eta max
+    Float_t thmax = EtaToTheta(-2.5);  // theta max. <---> eta min 
+    cocktail->SetThetaRange(thmin,thmax);
+    cocktail->SetEnergyCMS(5500);
+    cocktail->SetOrigin(0, 0, 0);  //vertex position
+    cocktail->SetSigma(50e-4, 50e-4, 5.0);   //Sigma in (X,Y,Z) (cm) on IP position
+    cocktail->SetVertexSmear(kPerEvent);
+    cocktail->Init();  
+
+    // HijingParam + flat pion spectrum
+    
+    AliGenHIJINGpara *generH = new AliGenHIJINGpara(nParticlesHP);
+    generH->SetMomentumRange(0.1, 10.);
+    generH->SetPhiRange(0., 360.);
+    generH->SetThetaRange(thmin,thmax);
+    generH->SetOrigin(0, 0, 0);  //vertex position
+    generH->SetSigma(0, 0, 0);   //Sigma in (X,Y,Z) (cm) on IP position
+    //    generH->Init();
+    //
+    cocktail->AddGenerator(generH,"hijingParam",1);
+    //
+    AliGenBox *gpipflat = new AliGenBox(nPiPFlat);
+    gpipflat->SetMomentumRange(0,10.);
+    gpipflat->SetPhiRange(0., 360.);
+    gpipflat->SetThetaRange(thmin,thmax);
+    gpipflat->SetPart(kPiPlus);
+    cocktail->AddGenerator(gpipflat,"genPiPlus",1);
+    //
+    //
+    AliGenBox *gpimflat = new AliGenBox(nPiMFlat);
+    gpimflat->SetMomentumRange(0,10.);
+    gpimflat->SetPhiRange(0., 360.);
+    gpimflat->SetThetaRange(thmin,thmax);
+    gpimflat->SetPart(kPiMinus);
+    cocktail->AddGenerator(gpimflat,"genPimus",1);
+    //
+    cocktail->Init();
+  }
+  else if (generatorFlag==2) {
     
     // Pure HiJing generator adapted to ~2000dNdy at highest energy
     
@@ -192,11 +239,13 @@ void Config()
     generHijing->SetPtHardMin(4.5);
     
     AliGenerator*  gener = generHijing;
-    gener->SetSigma(0, 0, 6);      // Sigma in (X,Y,Z) (cm) on IP position
+    gener->SetSigma(50e-4, 50e-4, 5.0);   //Sigma in (X,Y,Z) (cm) on IP position
     gener->SetVertexSmear(kPerEvent);
     gener->Init();
       
   }
+  // 
+  
 
   // 
   // Activate this line if you want the vertex smearing to happen
@@ -292,21 +341,24 @@ void Config()
     {
       //=================== ITS parameters ============================
       //
-      const int kDiodShift_NCol_M32terP31 = 2;
-      const int kDiodShift_NRow_M32terP31 = 1;
+      // 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 = 4;
       //
-      const double kReadOutEdge = 0.1;   // width of the readout edge (passive bottom)
-      const double kGuardRing   = 0.005; // width of passive area on left/right/top of the sensor
-      const double kDiodShiftM32terP31X[ kDiodShift_NCol_M32terP31 ][ kDiodShift_NRow_M32terP31 ] = {0.30,-0.19};
-      const double kDiodShiftM32terP31Z[ kDiodShift_NCol_M32terP31 ][ kDiodShift_NRow_M32terP31 ] = {0.0 , 0.0 };
+      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)
-                                                               5,    // chips per module
-                                                               1500, // ncols (total for module)
-                                                               350,  //835,  // nrows
-                                                               33.e-4,  // default row pitch in cm
-                                                               20.e-4,  // default col pitch in cm
-                                                               18.e-4,  // sensor thickness in cm
+      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
@@ -314,68 +366,97 @@ void Config()
                                                                kGuardRing, // top
                                                                kReadOutEdge  // bottom
                                                                );    // see AliITSUSegmentationPix.h for extra options
-      seg0->SetDiodShiftMatrix(kDiodShift_NRow_M32terP31,kDiodShift_NCol_M32terP31, &kDiodShiftM32terP31X[0][0], &kDiodShiftM32terP31Z[0][0]);
       seg0->Store(AliITSUGeomTGeo::GetITSsegmentationFileName());
-      AliITSUSegmentationPix* seg1 = new AliITSUSegmentationPix(1,    // segID (0:9)
-                                                               5*2,    // chips per module
-                                                               1500, // ncols (total for module)
-                                                               700,//835,  // nrows
-                                                               33.e-4,  // default row pitch in cm
-                                                               20.e-4,  // default col pitch in cm
-                                                               18.e-4,  // 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
-      seg1->SetDiodShiftMatrix(kDiodShift_NRow_M32terP31,kDiodShift_NCol_M32terP31, &kDiodShiftM32terP31X[0][0], &kDiodShiftM32terP31Z[0][0]);
-      seg1->Store(AliITSUGeomTGeo::GetITSsegmentationFileName());
-      AliITSUSegmentationPix* seg2 = new AliITSUSegmentationPix(2,    // segID (0:9)
-                                                               5*2,    // chips per module
-                                                               1500, // ncols (total for module)
-                                                               700,//835,  // nrows
-                                                               33.e-4,  // default row pitch in cm
-                                                               20.e-4,  // default col pitch in cm
-                                                               18.e-4,   // 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      
-      seg2->SetDiodShiftMatrix(kDiodShift_NRow_M32terP31,kDiodShift_NCol_M32terP31, &kDiodShiftM32terP31X[0][0], &kDiodShiftM32terP31Z[0][0]);
-      seg2->Store(AliITSUGeomTGeo::GetITSsegmentationFileName());
       //
-      int nmod,nlad; // modules per ladded, n ladders
-      // sum of insensitive boarder around module (in cm)
-      double tilt = 10.;     double thickLr = 0.05;
+      seg0->Print();
+      //
+      const double kMinOvl = 0.01; // require active zones overlap
+      const double kPhi0 = 0.;  // az.angle of 1st stave
+      const double kTilt = 10.; // tilt in degrees
+      const double kLrTick03 = 280e-4;   // stave thickness for 0.3%X layers
+      const double kLrTick05 = 470e-4;   // stave thickness for 0.5%X layers
+      double xActProj = seg0->DxActive()*TMath::Cos(kTilt*TMath::DegToRad()); // effective r-phi coverage by single stave
+      double dzLr,rLr,ovlA;
+      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);
       AliITSUv11 *ITS  = new AliITSUv11("ITS Upgrade",7);
-      nmod = 9;
-      nlad = 12;
-      ITS->DefineLayerTurbo(0,0., 2.2,  nmod*seg0->Dz(), nlad, nmod, seg0->Dx(), tilt, thickLr, seg0->Dy(), seg0->GetDetTypeID());
-      nmod = 9;
-      nlad = 16;
-      ITS->DefineLayerTurbo(1,0., 2.8,  nmod*seg0->Dz(), nlad, nmod, seg0->Dx(), tilt, thickLr, seg0->Dy(), seg0->GetDetTypeID());
-      nmod = 9;
-      nlad = 20;
-      ITS->DefineLayerTurbo(2,0., 3.6,  nmod*seg0->Dz(), nlad, nmod, seg0->Dx(), tilt, thickLr, seg0->Dy(), seg0->GetDetTypeID());
-      nmod = 29;
-      nlad = 48;
-      ITS->DefineLayerTurbo(3,0., 20.0, nmod*seg1->Dz(), nlad, nmod, seg1->Dx(), tilt, thickLr, seg1->Dy(), seg1->GetDetTypeID());
-      nmod = 29;
-      nlad = 48;
-      ITS->DefineLayerTurbo(4,0., 22.0, nmod*seg1->Dz(), nlad, nmod, seg1->Dx(), tilt, thickLr, seg1->Dy(), seg1->GetDetTypeID());
-      nmod = 50;
-      nlad = 94;
-      ITS->DefineLayerTurbo(5,0., 40.0, nmod*seg2->Dz(), nlad, nmod, seg2->Dx(), tilt, thickLr, seg2->Dy(), seg2->GetDetTypeID()); //41 creates ovl!
-      nmod = 50;
-      nlad = 94;
-      ITS->DefineLayerTurbo(6,0., 43.0, nmod*seg2->Dz(), nlad, nmod, seg2->Dx(), tilt, thickLr, seg2->Dy(), seg2->GetDetTypeID()); 
+      idLr = 0;
+      rLr = 2.2;
+      dzLr = 2*11.2;   // min Z to cover
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++ );          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick03, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
+      //
+      idLr = 1;
+      rLr = 2.8;
+      dzLr = 2*12.1;
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++;);          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick03, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
+      //
+      idLr = 2;
+      rLr = 3.6;
+      dzLr = 2*13.4;
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++ );          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick03, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
+      //
+      idLr = 3;
+      rLr = 20.0;
+      dzLr = 2*39.0;
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++ );          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick05, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
+      //
+      idLr = 4;
+      rLr = 22.0;
+      dzLr = 2*41.8;
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++ );          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick05, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
+      //
+      idLr = 5;
+      rLr = 40.0;
+      dzLr = 2*71.2;
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++ );          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick05, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
+      //
+      idLr = 6;
+      rLr = 43.0;
+      dzLr = 2*74.3;
+      nModPerStaveLr = 1+dzLr/seg0->Dz();
+      ovlA = -1;
+      nStaveLr = 1 + rLr*TMath::Pi()*2/xActProj;
+      do { ovlA = 1.-rLr*TMath::Pi()*2/nStaveLr/xActProj; } while ( kMinOvl>=0 && ovlA<0.015 && nStaveLr++ );          
+      ITS->DefineLayerTurbo(idLr, kPhi0, rLr, nModPerStaveLr*seg0->Dz(), nStaveLr, nModPerStaveLr, seg0->Dx(), kTilt, kLrTick05, seg0->Dy(), seg0->GetDetTypeID());
+      printf("Add Lr%d: R=%.1f DZ:%.1f Staves:%3d NMod/Stave:%3d -> Active Overlap:%.1f\% (%d micron)\n",
+            idLr,rLr,nModPerStaveLr*seg0->Dz()/2,nStaveLr,nModPerStaveLr,ovlA*100,int(ovlA*xActProj*1e4));
       //
     }
  
index 8097120..8ad16d1 100644 (file)
@@ -34,13 +34,38 @@ void MakeITSRecoParam(AliRecoParam::EventSpecie_t default=AliRecoParam::kLowMult
     recoParamArray->AddLast(itsRecoParam);
   }
   //
+  const Bool_t kAllowDiagCl = kFALSE;
+  //
+  // tuned for 20x20 pixels with x/x0= 0.3,0.3,0.3,0.5,0.5,0.5,0.5%
+  int nBranch[7] = {5,10,15,4,6,6,10}; // max branching for the seed on layer
+  int nCands[7]  = {10,20,45,20,45,15,10}; // max candidates for the TPC seed
+  float tr2clChi2[7] = {20,25,30,40,45,45,70}; // cut on cluster to track chi2 
+  float gloChi2[7]   = {10, 15,20,40,70,70,70}; // cut on seed global norm chi2
+  float missPen[7] = {2.,2.,2.,2.,2.,2.,2.};    // missing cluster penalty
+  float maxChi2Match = 10.;
+  float maxChi2SA    = 10.;  
+  //
+  /*
+    // tuned for 20x33 pixels
   int nBranch[7] = {5,10,15,4,6,6,10}; // max branching for the seed on layer
   int nCands[7]  = {10,20,25,20,30,15,20}; // max candidates for the TPC seed
   float tr2clChi2[7] = {20,20,25,25,25,30,40}; // cut on cluster to track chi2 
   float gloChi2[7]   = {9, 10,15,20,30,30,30}; // cut on seed global norm chi2
   float missPen[7] = {2.,2.,2.,2.,2.,2.,2.};    // missing cluster penalty
   float maxChi2Match = 10.;
-  float maxChi2SA    = 10.;  
+  float maxChi2SA    = 10.;      
+  */
+
+  /*
+  // this is for tuning only
+  int nBranch[7] = {30,20,20,20,20,20,20}; // max branching for the seed on layer
+  int nCands[7]  = {20,100,100,100,100,55,20}; // max candidates for the TPC seed
+  float tr2clChi2[7] = {40,50,60,80,80,80,80}; // cut on cluster to track chi2 
+  float gloChi2[7]   = {20, 30,40,60,80,80,80}; // cut on seed global norm chi2
+  float missPen[7] = {2.,2.,2.,2.,2.,2.,2.};    // missing cluster penalty
+  float maxChi2Match = 20.;
+  float maxChi2SA    = 20.;  
+  */
   //
   {
     AliITSURecoParam * itsRecoParam = AliITSURecoParam::GetLowFluxParam();
@@ -52,7 +77,7 @@ void MakeITSRecoParam(AliRecoParam::EventSpecie_t default=AliRecoParam::kLowMult
     itsRecoParam->SetTitle("LowMult");
     recoParamArray->AddLast(itsRecoParam);
     //******************************************************************
-    for (int i=0;i<nLr;i++) itsRecoParam->SetAllowDiagonalClusterization(i,kTRUE);
+    for (int i=0;i<nLr;i++) itsRecoParam->SetAllowDiagonalClusterization(i,kAllowDiagCl);
     //  
     // Add tracking conditions >>>
     trCond = new AliITSUTrackCond();
@@ -70,24 +95,9 @@ void MakeITSRecoParam(AliRecoParam::EventSpecie_t default=AliRecoParam::kLowMult
     }
     //
     trCond->AddNewCondition(5); // min hits
-    trCond->AddGroupPattern( kBit0|kBit1 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
-    //
-    trCond->AddNewCondition(5); // min hits
-    trCond->AddGroupPattern( kBit0|kBit1 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
-    //
-    trCond->AddNewCondition(5);
-    trCond->AddGroupPattern( kBit0|kBit2 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
-    //
-    trCond->AddNewCondition(5);
-    trCond->AddGroupPattern( kBit1|kBit2 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
+    trCond->AddGroupPattern( kBit0|kBit1|kBit2, 2); // at least 2 hits in 3 inner layers
+    trCond->AddGroupPattern( kBit3|kBit4      , 1); // at least 1 hit in 2 middle layers
+    trCond->AddGroupPattern( kBit5|kBit6      , 1); // at least 1 hit in 2 outer layers
     //
     trCond->Init();
     //
@@ -104,7 +114,7 @@ void MakeITSRecoParam(AliRecoParam::EventSpecie_t default=AliRecoParam::kLowMult
     itsRecoParam->SetTitle("HighMult");
     recoParamArray->AddLast(itsRecoParam);
     //******************************************************************
-     for (int i=0;i<nLr;i++) itsRecoParam->SetAllowDiagonalClusterization(i,kTRUE);
+    for (int i=0;i<nLr;i++) itsRecoParam->SetAllowDiagonalClusterization(i,kAllowDiagCl);
     //  
     // Add tracking conditions >>>
     trCond = new AliITSUTrackCond();
@@ -122,19 +132,9 @@ void MakeITSRecoParam(AliRecoParam::EventSpecie_t default=AliRecoParam::kLowMult
     }
     //
     trCond->AddNewCondition(5); // min hits
-    trCond->AddGroupPattern( kBit0|kBit1 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
-    //
-    trCond->AddNewCondition(5);
-    trCond->AddGroupPattern( kBit0|kBit2 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
-    //
-    trCond->AddNewCondition(5);
-    trCond->AddGroupPattern( kBit1|kBit2 );
-    trCond->AddGroupPattern( kBit3|kBit4 );
-    trCond->AddGroupPattern( kBit5|kBit6 );
+    trCond->AddGroupPattern( kBit0|kBit1|kBit2, 2); // at least 2 hits in 3 inner layers
+    trCond->AddGroupPattern( kBit3|kBit4      , 1); // at least 1 hit in 2 middle layers
+    trCond->AddGroupPattern( kBit5|kBit6      , 1); // at least 1 hit in 2 outer layers
     //
     trCond->Init();
     //
index 29fd236..e147137 100644 (file)
Binary files a/ITS/UPGRADE/testITSU/itsupcdb.tar.gz and b/ITS/UPGRADE/testITSU/itsupcdb.tar.gz differ