]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - ITS/UPGRADE/AliITSUTrackCond.cxx
Fix for wrong track lenght calculation (at the moment somewhat clumsy,
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUTrackCond.cxx
index 4b6318d264a3201e1da4188d464d2d961a278f77..613c44ef20b064a9e82af1efec179bcbac94dfc0 100644 (file)
@@ -17,12 +17,15 @@ Float_t   AliITSUTrackCond::fgkMaxITSSAChi2 = 15;
 //______________________________________________________________
 AliITSUTrackCond::AliITSUTrackCond(int nLayers)
   :fInitDone(kFALSE)
+  ,fActiveLrInner(0)
+  ,fActiveLrOuter(0)
+  ,fAllowLayers(0)
   ,fNLayers(0)
   ,fMaxITSTPCMatchChi2(fgkMaxMatchChi2)
-  ,fMaxITSSAChi2(fgkMaxITSSAChi2)
   ,fClSharing(0)
   ,fMaxBranches(0)
   ,fMaxCandidates(0)
+  ,fMaxITSSAChi2(0)
   ,fMaxTr2ClChi2(0)
   ,fMaxChi2GloNrm(0)
   ,fMissPenalty(0)
@@ -40,12 +43,15 @@ AliITSUTrackCond::AliITSUTrackCond(int nLayers)
 AliITSUTrackCond::AliITSUTrackCond(const AliITSUTrackCond& src)
   :TObject(src)
   ,fInitDone(src.fInitDone)
+  ,fActiveLrInner(src.fActiveLrInner)
+  ,fActiveLrOuter(src.fActiveLrOuter)
+  ,fAllowLayers(src.fAllowLayers)
   ,fNLayers(0)
   ,fMaxITSTPCMatchChi2(src.fMaxITSTPCMatchChi2)
-  ,fMaxITSSAChi2(src.fMaxITSSAChi2)
   ,fClSharing(0)
   ,fMaxBranches(0)
   ,fMaxCandidates(0)
+  ,fMaxITSSAChi2(0)
   ,fMaxTr2ClChi2(0)
   ,fMaxChi2GloNrm(0)
   ,fMissPenalty(0)
@@ -66,6 +72,8 @@ AliITSUTrackCond::AliITSUTrackCond(const AliITSUTrackCond& src)
     SetNSigmaRoadY(i,src.GetNSigmaRoadY(i));
     SetNSigmaRoadZ(i,src.GetNSigmaRoadZ(i));
     SetClSharing(i,src.GetClSharing(i));
+    SetMaxITSSAChi2(1+2*i,src.GetMaxITSSAChi2(1+2*i));
+    SetMaxITSSAChi2(1+2*i+1,src.GetMaxITSSAChi2(1+2*i+1));
   }
 }
 
@@ -75,10 +83,13 @@ AliITSUTrackCond& AliITSUTrackCond::operator=(const AliITSUTrackCond& src)
   // copy op.
   if (this!=&src) {
     fInitDone = src.fInitDone;
+    fActiveLrInner = src.fActiveLrInner;
+    fActiveLrOuter = src.fActiveLrOuter;
+    //
+    fAllowLayers = src.fAllowLayers;
     fNConditions = src.fNConditions;
     fConditions  = src.fConditions;
     fMaxITSTPCMatchChi2 = src.fMaxITSTPCMatchChi2;
-    fMaxITSSAChi2       = src.fMaxITSSAChi2;
     //
     SetNLayers(src.fNLayers);
     //
@@ -91,6 +102,8 @@ AliITSUTrackCond& AliITSUTrackCond::operator=(const AliITSUTrackCond& src)
       SetNSigmaRoadY(i,src.GetNSigmaRoadY(i));
       SetNSigmaRoadZ(i,src.GetNSigmaRoadZ(i));
       SetClSharing(i,src.GetClSharing(i));
+      SetMaxITSSAChi2(1+2*i,src.GetMaxITSSAChi2(1+2*i));
+      SetMaxITSSAChi2(1+2*i+1,src.GetMaxITSSAChi2(1+2*i+1));
     }
     fAuxData = src.fAuxData;
   }
@@ -111,10 +124,14 @@ void AliITSUTrackCond::SetNLayers(int nLayers)
     delete[] fMissPenalty;
     delete[] fNSigmaRoadY;
     delete[] fNSigmaRoadZ;
+    delete[] fMaxITSSAChi2;
   }
   fNLayers = nLayers;
+  fAllowLayers = 0;
   //
   if (fNLayers>0) {
+    fActiveLrInner = 0;
+    fActiveLrOuter = fNLayers-1;
     fClSharing     = new Char_t[fNLayers];
     fMaxBranches   = new Short_t[fNLayers];
     fMaxCandidates = new Short_t[fNLayers];
@@ -123,13 +140,17 @@ void AliITSUTrackCond::SetNLayers(int nLayers)
     fMissPenalty   = new Float_t[fNLayers];
     fNSigmaRoadY   = new Float_t[fNLayers];
     fNSigmaRoadZ   = new Float_t[fNLayers];
+    fMaxITSSAChi2  = new Float_t[2*fNLayers];
     for (int i=fNLayers;i--;) {
+      fAllowLayers |= 0x1<<i;
       SetClSharing(i,fgkClSharing);
       SetMaxBranches(i,fgkMaxBranches);
       SetMaxCandidates(i,fgkMaxCandidates);
       SetMaxTr2ClChi2(i,fgkMaxTr2ClChi2);
       SetMaxChi2GloNrm(i,fgkMaxChi2GloNrm);
       SetMissPenalty(i,fgkMissPenalty);
+      SetMaxITSSAChi2(1+2*i,fgkMaxITSSAChi2);
+      SetMaxITSSAChi2(1+2*i+1,fgkMaxITSSAChi2);
       SetNSigmaRoadY(i,-1); // force recalculation
       SetNSigmaRoadZ(i,-1); // force recalculation
     }
@@ -148,13 +169,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 +198,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 +206,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)<int(pattReq>>kShiftNcl)) {ok = kFALSE; break;}
+    }
     if (ok) return kTRUE;
     cntCond += kNAuxSz;
   }
@@ -196,20 +223,26 @@ 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;
   }
+  if (fAllowLayers) {
+    printf("Allowed Layers: ");
+    for (int i=0;i<fNLayers;i++) if (!IsLayerExcluded(i)) printf(" %d",i); printf("\n");
+  }
   printf("Cuts:\t%6s\t%6s\t%4s\t%8s\t%8s\t%8s\t%8s\t%8s\n", "MaxBrn","MaxCnd","ClSh","Chi2Cl","Chi2Glo","Mis.Pen.","NSig.Y","NSig.Z");
   for (int i=0;i<fNLayers;i++) {
     printf("Lr%2d:\t%6d\t%6d\t%4d\t%8.1f\t%8.2f\t%8.2f\t%8.2f\t%8.2f\n",i,
@@ -217,7 +250,8 @@ void AliITSUTrackCond::Print(Option_t*) const
   }
   //
   printf("ITS/TPC matching MaxChi2: %.3f\n",fMaxITSTPCMatchChi2);
-  printf("ITS_SA BWD fit   MaxChi2: %.3f\n",fMaxITSSAChi2);
+  printf("ITS_SA BWD fit   MaxChi2 vs Ncl :");
+  for (int i=1;i<=2*fNLayers;i++) if (GetMaxITSSAChi2(i)>1e-6) printf("\t%d: %.2f",i,GetMaxITSSAChi2(i)); printf("\n");
   //
 }
 
@@ -227,15 +261,19 @@ void AliITSUTrackCond::Init()
   // finalize and check consistency
   if (fInitDone) return;
   //
+  fActiveLrInner = -1;
   for (int ilr=0;ilr<fNLayers;ilr++) {
     if (IsLayerExcluded(ilr)) continue;
+    if (fActiveLrInner<0) fActiveLrInner = ilr;
+    fActiveLrOuter = ilr;
     float nsig = Sqrt(2*GetMaxTr2ClChi2(ilr));
     if (GetNSigmaRoadY(ilr)<0) SetNSigmaRoadY(ilr,nsig);
     if (GetNSigmaRoadZ(ilr)<0) SetNSigmaRoadZ(ilr,nsig);
+    if (GetMaxITSSAChi2(1+2*ilr)<1e-6) SetMaxITSSAChi2(1+2*ilr,fgkMaxITSSAChi2);
+    if (GetMaxITSSAChi2(1+2*ilr+1)<1e-6) SetMaxITSSAChi2(1+2*ilr+1,fgkMaxITSSAChi2);
     //
   }
   if (fMaxITSTPCMatchChi2<1e-6) SetMaxITSTPCMatchChi2(fgkMaxMatchChi2);
-  if (fMaxITSSAChi2<1e-6)       SetMaxITSSAChi2(fgkMaxITSSAChi2);
   //
   fInitDone = kTRUE;
 }