1 #include "AliITSUTrackCond.h"
2 #include "AliITSUAux.h"
6 using namespace AliITSUAux;
9 Int_t AliITSUTrackCond::fgkMaxBranches = 50;
10 Int_t AliITSUTrackCond::fgkMaxCandidates = 500;
11 Float_t AliITSUTrackCond::fgkMaxTr2ClChi2 = 50.;
12 Float_t AliITSUTrackCond::fgkMissPenalty = 2.;
14 //______________________________________________________________
15 AliITSUTrackCond::AliITSUTrackCond(int nLayers)
29 if (nLayers) SetNLayers(nLayers);
32 //______________________________________________________________
33 AliITSUTrackCond::AliITSUTrackCond(const AliITSUTrackCond& src)
35 ,fInitDone(src.fInitDone)
43 ,fNConditions(src.fNConditions)
44 ,fConditions(src.fConditions)
45 ,fAuxData(src.fAuxData)
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));
59 //______________________________________________________________
60 AliITSUTrackCond& AliITSUTrackCond::operator=(const AliITSUTrackCond& src)
64 fInitDone = src.fInitDone;
65 fNConditions = src.fNConditions;
66 fConditions = src.fConditions;
68 SetNLayers(src.fNLayers);
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));
78 fAuxData = src.fAuxData;
83 //______________________________________________________________
84 void AliITSUTrackCond::SetNLayers(int nLayers)
86 // set number of layers
90 delete fMaxCandidates;
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
125 //______________________________________________________________
126 void AliITSUTrackCond::AddGroupPattern(UShort_t patt)
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]++;
136 //______________________________________________________________
137 void AliITSUTrackCond::AddNewCondition(Int_t minClusters)
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;
148 //______________________________________________________________
149 Bool_t AliITSUTrackCond::CheckPattern(UShort_t patt) const
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);
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
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;
168 //______________________________________________________________
169 void AliITSUTrackCond::Print(Option_t*) const
172 int nc = GetNConditions();
173 Short_t *arrAux = (Short_t*)fAuxData.GetArray();
174 Short_t *arrGrp = (Short_t*)fConditions.GetArray();
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--;) {
182 PrintBits(arrGrp[grAddr++], fNLayers);
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]);
196 //______________________________________________________________
197 void AliITSUTrackCond::Init()
199 // finalize and check consistency
200 if (fInitDone) return;
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);