1 //Author: Anders Strand Vestbo
2 //Last Modified: 28.6.01
4 #include <TClonesArray.h>
12 #include "AliTPCParam.h"
13 #include "AliSimDigits.h"
14 #include "AliL3TrackArray.h"
15 #include "AliL3Transform.h"
16 #include "AliL3HoughTransformer.h"
17 #include "AliL3Defs.h"
18 #include "AliL3HoughTrack.h"
19 #include "AliL3HoughEval.h"
21 ClassImp(AliL3HoughEval)
24 AliL3HoughEval::AliL3HoughEval()
27 fTransform = new AliL3Transform();
28 fHoughTransformer = 0;
34 AliL3HoughEval::AliL3HoughEval(AliL3HoughTransformer *transformer)
37 fHoughTransformer = transformer;
38 fTransform = new AliL3Transform();
44 AliL3HoughEval::~AliL3HoughEval()
50 delete [] fMcTrackTable;
54 Bool_t AliL3HoughEval::LookInsideRoad(AliL3HoughTrack *track,Int_t eta_index,Bool_t remove)
56 //Look at rawdata along the road specified by the track candidates.
58 if(!fHoughTransformer)
60 printf("\nAliL3HoughEval: No transformer object\n");
64 Int_t patch = fHoughTransformer->fPatch;
65 Int_t slice = fHoughTransformer->fSlice;
70 Char_t **track_lut = fHoughTransformer->fTrackTable;
74 for(Int_t padrow = NRows[patch][0]; padrow <= NRows[patch][1]; padrow++)
76 Int_t prow = padrow - NRows[patch][0];
77 if(!track->GetCrossingPoint(padrow,xyz))
79 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
83 fTransform->Slice2Sector(slice,padrow,sector,row);
84 fTransform->Local2Raw(xyz,sector,row);
86 //Look at both sides of the crossing point:
87 for(Int_t p=(Int_t)xyz[1]-fNumOfPadsToLook; p<=(Int_t)xyz[1]+fNumOfPadsToLook; p++)
89 if(p<0 || p>fTransform->GetNPads(padrow)) continue;
90 lut_index = (prow<<8) + p;
91 if(track_lut[eta_index][lut_index]>0) //There was a signal here
100 if(nrow >= NRows[patch][1]-NRows[patch][0]-fNumOfRowsToMiss)//this was a good track
102 track->SetEtaIndex(eta_index);
104 RemoveTrackFromImage(track,eta_index);
111 void AliL3HoughEval::LookInsideRawRoad(AliL3TrackArray *tracks,Int_t eta_index,Bool_t remove)
113 //Evalaute the track candidates by looking along the trajectory.
114 //If remove is on, the pixels along the track will be removed.
117 if(!fHoughTransformer)
119 printf("AliL3HoughEval: No transformer object\n");
123 Int_t patch = fHoughTransformer->fPatch;
124 Int_t slice = fHoughTransformer->fSlice;
129 Char_t **track_lut = fHoughTransformer->fTrackTable;
133 for(Int_t i=0; i<tracks->GetNTracks(); i++)
135 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
136 if(!track) {printf("No track\n"); return;}
140 for(Int_t padrow = NRows[patch][0]; padrow <= NRows[patch][1]; padrow++)
142 Int_t prow = padrow - NRows[patch][0];
143 if(!track->GetCrossingPoint(padrow,xyz))
145 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
149 fTransform->Slice2Sector(slice,padrow,sector,row);
150 fTransform->Local2Raw(xyz,sector,row);
152 //Look at both sides of the crossing point:
153 for(Int_t p=(Int_t)xyz[1]-fNumOfPadsToLook; p<=(Int_t)xyz[1]+fNumOfPadsToLook; p++)
155 if(p<0 || p>fTransform->GetNPads(padrow)) continue;
156 lut_index = (prow<<8) + p;
157 if(track_lut[eta_index][lut_index]>0) //There was a signal here
166 if(nrow < NRows[patch][1]-NRows[patch][0]-fNumOfRowsToMiss)
167 tracks->Remove(i); //this was not a good enough track
169 RemoveTrackFromImage(track,eta_index); //this was a good track, so remove it from the image.
175 void AliL3HoughEval::RemoveTrackFromImage(AliL3HoughTrack *track,Int_t eta_index)
177 //Remove the pixels along the track in the image.
179 Int_t patch = fHoughTransformer->fPatch;
180 Int_t slice = fHoughTransformer->fSlice;
182 Int_t maxnpads = fTransform->GetNPads(NRows[patch][1]);
185 Char_t **track_lut = fHoughTransformer->fTrackTable;
188 for(Int_t padrow = NRows[patch][0]; padrow<=NRows[patch][1]; padrow++)
190 Int_t prow = padrow - NRows[patch][0];
191 if(!track->GetCrossingPoint(padrow,xyz))
193 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
197 fTransform->Slice2Sector(slice,padrow,sector,row);
198 fTransform->Local2Raw(xyz,sector,row);
200 for(Int_t p=(Int_t)xyz[1]-fNumOfPadsToLook; p<=(Int_t)xyz[1]+fNumOfPadsToLook; p++)
202 if(p<0 || p>fTransform->GetNPads(padrow)) continue;
203 lut_index = (prow<<8) + p;
204 track_lut[eta_index][lut_index] = -1; //remove it!!
211 void AliL3HoughEval::DisplaySlice(TH2F *hist)
216 for(Int_t padrow = 0; padrow < 174; padrow++)
219 for(pixel=(AliL3Digits*)fHoughTransformer->fRowContainer[padrow].first; pixel!=0; pixel=(AliL3Digits*)pixel->nextRowPixel)
224 fTransform->Slice2Sector(fHoughTransformer->fSlice,padrow,sector,row);
225 fTransform->Raw2Local(xyz_pix,sector,row,pixel->fPad,pixel->fTime); //y alone pad
229 hist->Fill(xyz_pix[0],xyz_pix[1],pixel->fCharge);
237 void AliL3HoughEval::DefineGoodParticles(Char_t *rootfile,Double_t pet)
239 //define the particles that produce good enough signals to be recognized in the transform
241 Int_t num_eta_segments = fHoughTransformer->fNumEtaSegments;
242 Double_t eta_max = fHoughTransformer->fEtaMax;
243 fMcTrackTable = new Int_t[num_eta_segments];
244 for(Int_t i=0; i<num_eta_segments; i++)
246 Double_t etaslice = eta_max/num_eta_segments;
248 Int_t patch = fHoughTransformer->fPatch;
249 Int_t slice = fHoughTransformer->fSlice;
251 TFile *file = new TFile(rootfile);
254 AliRun *gAlice = (AliRun*)file->Get("gAlice");
257 TClonesArray *particles=gAlice->Particles();
258 Int_t np = particles->GetEntriesFast();
260 Int_t row_to_miss = fNumOfRowsToMiss;
261 AliTPCParam *param = (AliTPCParam*)file->Get("75x40_100x60");
262 Int_t zero = param->GetZeroSup();
263 TTree *TD=(TTree*)gDirectory->Get("TreeD_75x40_100x60");
264 AliSimDigits da, *digits=&da;
265 TD->GetBranch("Segment")->SetAddress(&digits); //Return pointer to branch segment.
266 Int_t *good=new Int_t[np];
267 Int_t *count = new Int_t[np]; //np number of particles.
268 Int_t good_number = NRows[patch][1]-NRows[patch][0]-row_to_miss;
270 for (i=0; i<np; i++) count[i]=0;
271 Int_t sectors_by_rows=(Int_t)TD->GetEntries();
272 for (i=0; i<sectors_by_rows; i++)
274 if (!TD->GetEvent(i)) continue;
276 param->AdjustSectorRow(digits->GetID(),sec,row);
278 fTransform->Sector2Slice(ss,sr,sec,row);
279 if(ss!=slice) continue;
280 if(sr < NRows[patch][0]) continue;
281 if(sr > NRows[patch][1]) break;
283 while (digits->Next()) {
284 Int_t it=digits->CurrentRow(), ip=digits->CurrentColumn();
285 Short_t dig = digits->GetDigit(it,ip);
286 Int_t idx0=digits->GetTrackID(it,ip,0);
287 Int_t idx1=digits->GetTrackID(it,ip,1);
288 Int_t idx2=digits->GetTrackID(it,ip,2);
289 if (idx0>=0 && dig>=zero) count[idx0]+=1;
290 if (idx1>=0 && dig>=zero) count[idx1]+=1;
291 if (idx2>=0 && dig>=zero) count[idx2]+=1;
293 for (Int_t j=0; j<np; j++)
295 if (count[j]>1) {//at least two digits at this padrow
304 //TObjArray *part = new TObjArray(0,0);
307 TParticle *p = (TParticle*)particles->UncheckedAt(i);
308 if(p->GetFirstMother()>0) continue; //secondary particle
309 if(good[i] < good_number) continue; //too few padrows
310 Double_t ptg=p->Pt();
311 if(ptg<pet) continue;
312 Int_t eta_index = (Int_t)(p->Eta()/etaslice);
313 if(eta_index < 0 || eta_index > num_eta_segments)
315 //fMcTrackTable[eta_index]++;
320 printf("nparticles %d\n",good_one);
328 void AliL3HoughEval::CompareMC(Char_t *rootfile,AliL3TrackArray *merged_tracks,Float_t *eta)
331 Int_t slice = fHoughTransformer->fSlice;
333 TFile *file = new TFile(rootfile);
336 AliRun *gAlice = (AliRun*)file->Get("gAlice");
339 TClonesArray *particles=gAlice->Particles();
340 Int_t n=particles->GetEntriesFast();
341 Float_t torad=TMath::Pi()/180;
342 Float_t phi_min = slice*20 - 10;
343 Float_t phi_max = slice*20 + 10;
345 for (Int_t j=0; j<n; j++) {
346 TParticle *p=(TParticle*)particles->UncheckedAt(j);
347 if (p->GetFirstMother()>=0) continue; //secondary particle
348 if(p->Eta() < eta[0] || p->Eta() > eta[1]) continue;
349 Double_t ptg=p->Pt(),pxg=p->Px(),pyg=p->Py();//,pzg=p->Pz();
350 Double_t phi_part = TMath::ATan2(pyg,pxg);
351 if (phi_part < 0) phi_part += 2*TMath::Pi();
353 if(phi_part < phi_min*torad || phi_part > phi_max*torad) {continue;}
354 if(ptg<0.100) continue;
356 AliL3HoughTrack *sel_track=0;
358 Double_t min_dist = 10000;
360 for(Int_t t=0; t<merged_tracks->GetNTracks(); t++)
362 AliL3HoughTrack *track = (AliL3HoughTrack*)merged_tracks->GetCheckedTrack(t);
363 if(!track) {printf("AliL3HoughEval: NO TRACK\n"); continue;}
364 Float_t phi0[2] = {track->GetPhi0(),0};
365 fTransform->Local2GlobalAngle(phi0,slice);
366 Double_t dPt = ptg - track->GetPt();
367 Double_t dPhi0 = phi_part - phi0[0];
368 Double_t distance = pow(dPt,2) + pow(dPhi0,2);
369 if(distance < min_dist)
377 sel_track->SetBestMCid(j,min_dist);
379 Double_t dpt = fabs(ptg-sel_track->GetPt());
380 Double_t dphi0 = fabs(phi_part-sel_track->GetPhi0());
381 //printf("Found match, min_dist %f dPt %f dPhi0 %f\n",min_dist,dpt,dphi0);