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