31926b6c5c93e9428c9a40e2130c684e991c0eaf
[u/mrichter/AliRoot.git] / ITS / UPGRADE / AliITSUTrackCond.cxx
1 #include "AliITSUTrackCond.h"
2 #include "AliITSUAux.h"
3 #include "AliLog.h"
4 #include <TMath.h>
5
6 using namespace AliITSUAux;
7 using namespace TMath;
8
9 Int_t     AliITSUTrackCond::fgkMaxBranches = 50;
10 Int_t     AliITSUTrackCond::fgkMaxCandidates = 500;
11 Float_t   AliITSUTrackCond::fgkMaxTr2ClChi2  = 50.;
12 Float_t   AliITSUTrackCond::fgkMissPenalty  = 2.;
13
14 //______________________________________________________________
15 AliITSUTrackCond::AliITSUTrackCond(int nLayers)
16   :fInitDone(kFALSE)
17   ,fNLayers(0)
18   ,fMaxBranches(0)
19   ,fMaxCandidates(0)
20   ,fMaxTr2ClChi2(0)
21   ,fMissPenalty(0)
22   ,fNSigmaRoadY(0)
23   ,fNSigmaRoadZ(0)
24   ,fNConditions(0)
25   ,fConditions(0)
26   ,fAuxData(0)
27 {
28   // def c-tor
29   if (nLayers) SetNLayers(nLayers);
30 }
31
32 //______________________________________________________________
33 AliITSUTrackCond::AliITSUTrackCond(const AliITSUTrackCond& src)
34   :TObject(src)
35   ,fInitDone(src.fInitDone)
36   ,fNLayers(0)
37   ,fMaxBranches(0)
38   ,fMaxCandidates(0)
39   ,fMaxTr2ClChi2(0)
40   ,fMissPenalty(0)
41   ,fNSigmaRoadY(0)
42   ,fNSigmaRoadZ(0)
43   ,fNConditions(src.fNConditions)
44   ,fConditions(src.fConditions)
45   ,fAuxData(src.fAuxData)
46 {
47   // copy c-tor
48   SetNLayers(src.fNLayers);
49   for (int i=fNLayers;i--;) {
50     SetMaxBranches(i,src.GetMaxBranches(i));
51     SetMaxCandidates(i,src.GetMaxCandidates(i));
52     SetMaxTr2ClChi2(i,src.GetMaxTr2ClChi2(i));
53     SetMissPenalty(i,src.GetMissPenalty(i));
54     SetNSigmaRoadY(i,src.GetNSigmaRoadY(i));
55     SetNSigmaRoadZ(i,src.GetNSigmaRoadZ(i));
56   }
57 }
58
59 //______________________________________________________________
60 AliITSUTrackCond& AliITSUTrackCond::operator=(const AliITSUTrackCond& src)
61 {
62   // copy op.
63   if (this!=&src) {
64     fInitDone = src.fInitDone;
65     fNConditions = src.fNConditions;
66     fConditions  = src.fConditions;
67     //
68     SetNLayers(src.fNLayers);
69     //
70     for (int i=fNLayers;i--;) {
71       SetMaxBranches(i,src.GetMaxBranches(i));
72       SetMaxCandidates(i,src.GetMaxCandidates(i));
73       SetMaxTr2ClChi2(i,src.GetMaxTr2ClChi2(i));
74       SetMissPenalty(i,src.GetMissPenalty(i));
75       SetNSigmaRoadY(i,src.GetNSigmaRoadY(i));
76       SetNSigmaRoadZ(i,src.GetNSigmaRoadZ(i));
77     }
78     fAuxData = src.fAuxData;
79   }
80   return *this;
81 }
82
83 //______________________________________________________________
84 void AliITSUTrackCond::SetNLayers(int nLayers)
85 {
86   // set number of layers
87   fInitDone = kFALSE;
88   if (fNLayers) {
89     delete fMaxBranches;
90     delete fMaxCandidates;
91     delete fMaxTr2ClChi2;
92     delete fMissPenalty;
93     delete fNSigmaRoadY;
94     delete fNSigmaRoadZ;
95   }
96   fNLayers = nLayers;
97   //
98   if (fNLayers>0) {
99     fMaxBranches = new Short_t[fNLayers];
100     fMaxCandidates = new Short_t[fNLayers];
101     fMaxTr2ClChi2  = new Float_t[fNLayers];
102     fMissPenalty   = new Float_t[fNLayers];
103     fNSigmaRoadY   = new Float_t[fNLayers];
104     fNSigmaRoadZ   = new Float_t[fNLayers];
105     for (int i=fNLayers;i--;) {
106       SetMaxBranches(i,fgkMaxBranches);
107       SetMaxCandidates(i,fgkMaxCandidates);
108       SetMaxTr2ClChi2(i,fgkMaxTr2ClChi2);
109       SetMissPenalty(i,fgkMissPenalty);
110       SetNSigmaRoadY(i,-1); // force recalculation
111       SetNSigmaRoadZ(i,-1); // force recalculation
112     }
113   }
114   else {
115     fMaxBranches   = 0;
116     fMaxCandidates = 0;
117     fMaxTr2ClChi2  = 0;
118     fMissPenalty   = 0;
119     fNSigmaRoadY   = 0;
120     fNSigmaRoadZ   = 0;
121   }
122   //
123 }
124
125 //______________________________________________________________
126 void AliITSUTrackCond::AddGroupPattern(UShort_t patt)
127 {
128   // add new group pattern to last condition
129   if (fNConditions<1) AliFatal("Can be called only after AddCondition");
130   int ind = fConditions.GetSize();
131   fConditions.Set(ind+1);
132   fConditions[ind] = patt;
133   fAuxData[(fNConditions-1)*kNAuxSz + kNGroups]++;
134 }
135
136 //______________________________________________________________
137 void AliITSUTrackCond::AddNewCondition(Int_t minClusters)
138 {
139   // add new track condition
140   fAuxData.Set( (1+fNConditions)*kNAuxSz );
141   fAuxData[fNConditions*kNAuxSz+kCondStart] = fConditions.GetSize();
142   fAuxData[fNConditions*kNAuxSz+kNGroups]   = 0;
143   fAuxData[fNConditions*kNAuxSz+kMinClus]   = minClusters;
144   fNConditions++;
145   //
146 }
147
148 //______________________________________________________________
149 Bool_t AliITSUTrackCond::CheckPattern(UShort_t patt) const
150 {
151   // check if the pattern matches to some condition
152   Short_t *arrAux = (Short_t*)fAuxData.GetArray();
153   Short_t *arrGrp = (Short_t*)fConditions.GetArray();  
154   int ncl = NumberOfBitsSet(patt);
155   int cntCond = 0;
156   for (int ic=0;ic<fNConditions;ic++) {
157     if (arrAux[cntCond+kMinClus]>ncl) {cntCond+=kNAuxSz; continue;} // check number of clusters
158     int grAddr = arrAux[cntCond+kCondStart]; // 1st group pattern address in the condition
159     Bool_t ok = kTRUE;
160     // if every group of the condition does not match, check next contition
161     for (int ig=arrAux[cntCond+kNGroups];ig--;) if ( !(patt&arrGrp[grAddr++]) ) {ok = kFALSE; break;}
162     if (ok) return kTRUE;
163     cntCond += kNAuxSz;
164   }
165   return kFALSE;
166 }
167
168 //______________________________________________________________
169 void AliITSUTrackCond::Print(Option_t*) const
170 {
171   // print conditions
172   int nc = GetNConditions();  
173   Short_t *arrAux = (Short_t*)fAuxData.GetArray();
174   Short_t *arrGrp = (Short_t*)fConditions.GetArray();  
175   int cntCond = 0;
176   printf("Conditions set ID=%d : %d entries\n",GetID(),nc);
177   for (int i=0;i<nc;i++) {
178     printf("#%2d: MinCl:%2d | %d groups :",i,arrAux[cntCond+kMinClus],arrAux[cntCond+kNGroups]);
179     int grAddr = arrAux[cntCond+kCondStart];
180     for (int ig=arrAux[cntCond+kNGroups];ig--;) {
181       printf("{");
182       PrintBits(arrGrp[grAddr++], fNLayers);
183       printf("}");
184     }
185     printf("\n");
186     cntCond += kNAuxSz;
187   }
188   printf("Cuts:\t%8s\t%8s\t%8s\t%8s\t%8s\t%8s\n", "MaxBrn","MaxCand","Chi2Cl","Mis.Pen.","NSig.Y","NSig.Z");
189   for (int i=0;i<fNLayers;i++) {
190     printf("Lr%2d:\t%8d\t%8d\t%8.1f\t%8.2f\t%8.2f\t%8.2f\n",i,
191            fMaxBranches[i],fMaxCandidates[i],fMaxTr2ClChi2[i],fMissPenalty[i],fNSigmaRoadY[i],fNSigmaRoadZ[i]);
192   }
193   //
194 }
195
196 //______________________________________________________________
197 void AliITSUTrackCond::Init()
198 {
199   // finalize and check consistency
200   if (fInitDone) return;
201   //
202   for (int ilr=0;ilr<fNLayers;ilr++) {
203     if (IsLayerExcluded(ilr)) continue;
204     float nsig = Sqrt(GetMaxTr2ClChi2(ilr));
205     if (GetNSigmaRoadY(ilr)<0) SetNSigmaRoadY(ilr,nsig);
206     if (GetNSigmaRoadZ(ilr)<0) SetNSigmaRoadZ(ilr,nsig);
207     //
208   }
209   //
210   fInitDone = kTRUE;
211 }