1 #include <TClonesArray.h>
8 #include "AliL3TrackArray.h"
9 #include "AliL3Transform.h"
10 #include "AliL3HoughTransformer.h"
11 #include "AliL3Defs.h"
12 #include "AliL3HoughTrack.h"
13 #include "AliL3HoughEval.h"
15 ClassImp(AliL3HoughEval)
18 AliL3HoughEval::AliL3HoughEval()
21 fTransform = new AliL3Transform();
22 fHoughTransformer = NULL;
26 AliL3HoughEval::AliL3HoughEval(AliL3HoughTransformer *transformer)
29 fHoughTransformer = transformer;
30 fTransform = new AliL3Transform();
34 AliL3HoughEval::~AliL3HoughEval()
43 void AliL3HoughEval::LookInsideRoad(AliL3TrackArray *tracks,TH2F *hist,TH2F *fake)
45 //Look at rawdata along the road specified by the track candidates.
47 if(!fHoughTransformer)
49 printf("AliL3HoughEval: No transformer object\n");
54 Int_t patch = fHoughTransformer->fPatch;
55 Int_t slice = fHoughTransformer->fSlice;
56 Int_t num_of_pads_to_look = 1;
57 Int_t rows_to_miss = 2;
59 for(Int_t i=0; i<tracks->GetNTracks(); i++)
61 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
62 if(!track) {printf("No track\n"); return;}
66 for(Int_t padrow = NRows[patch][0]; padrow <= NRows[patch][1]; padrow++)
70 //Get the crossing point of the track and current padrow:
71 //if(!track->GetCrossingPoint(slice,padrow,xyz))
72 if(!track->GetCrossingPoint(padrow,xyz))
74 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
79 fake->Fill(xyz[0],xyz[1],1);
82 //Get the pixels along the track candidate
83 for(pixel=(AliL3Digits*)fHoughTransformer->fRowContainer[padrow].first; pixel!=0; pixel=(AliL3Digits*)pixel->nextRowPixel)
88 fTransform->Slice2Sector(slice,padrow,sector,row);
89 fTransform->Raw2Local(xyz_pix,sector,row,pixel->fPad,pixel->fTime); //y alone pad
92 //check if we are inside road
93 if(fabs(xyz_pix[1] - xyz[1]) > num_of_pads_to_look*fTransform->GetPadPitchWidthLow()) continue;
98 //fTransform->Local2Global(xyz_pix,slice);
99 hist->Fill(xyz_pix[0],xyz_pix[1],pixel->fCharge);
109 if(nrow < NRows[patch][1]-NRows[patch][0]-rows_to_miss)
119 void AliL3HoughEval::DisplaySlice(TH2F *hist)
124 for(Int_t padrow = 0; padrow < 174; padrow++)
127 for(pixel=(AliL3Digits*)fHoughTransformer->fRowContainer[padrow].first; pixel!=0; pixel=(AliL3Digits*)pixel->nextRowPixel)
132 fTransform->Slice2Sector(fHoughTransformer->fSlice,padrow,sector,row);
133 fTransform->Raw2Local(xyz_pix,sector,row,pixel->fPad,pixel->fTime); //y alone pad
137 hist->Fill(xyz_pix[0],xyz_pix[1],pixel->fCharge);
146 void AliL3HoughEval::CompareMC(Char_t *rootfile,AliL3TrackArray *merged_tracks,Float_t *eta)
149 Int_t slice = fSlice;
151 TFile *file = new TFile(rootfile);
154 AliRun *gAlice = (AliRun*)file->Get("gAlice");
157 TClonesArray *particles=gAlice->Particles();
158 Int_t n=particles->GetEntriesFast();
159 Float_t torad=TMath::Pi()/180;
160 Float_t phi_min = slice*20 - 10;
161 Float_t phi_max = slice*20 + 10;
163 for (Int_t j=0; j<n; j++) {
164 TParticle *p=(TParticle*)particles->UncheckedAt(j);
165 if (p->GetFirstMother()>=0) continue; //secondary particle
166 if(p->Eta() < eta[0] || p->Eta() > eta[1]) continue;
167 Double_t ptg=p->Pt(),pxg=p->Px(),pyg=p->Py();//,pzg=p->Pz();
168 Double_t phi_part = TMath::ATan2(pyg,pxg);
169 if (phi_part < 0) phi_part += 2*TMath::Pi();
171 if(phi_part < phi_min*torad || phi_part > phi_max*torad) {continue;}
172 if(ptg<0.100) continue;
174 AliL3HoughTrack *sel_track=0;
176 Double_t min_dist = 10000;
178 for(Int_t t=0; t<merged_tracks->GetNTracks(); t++)
180 AliL3HoughTrack *track = (AliL3HoughTrack*)merged_tracks->GetCheckedTrack(t);
181 if(!track) {printf("AliL3HoughEval: NO TRACK\n"); continue;}
182 Float_t phi0[2] = {track->GetPhi0(),0};
183 fTransform->Local2GlobalAngle(phi0,slice);
184 Double_t dPt = ptg - track->GetPt();
185 Double_t dPhi0 = phi_part - phi0[0];
186 Double_t distance = pow(dPt,2) + pow(dPhi0,2);
187 if(distance < min_dist)
195 sel_track->SetBestMCid(j,min_dist);
197 Double_t dpt = fabs(ptg-sel_track->GetPt());
198 Double_t dphi0 = fabs(phi_part-sel_track->GetPhi0());
199 //printf("Found match, min_dist %f dPt %f dPhi0 %f\n",min_dist,dpt,dphi0);