7 #include "AliTPCParam.h"
8 #include "AliSimDigits.h"
10 #include "AliL3Defs.h"
11 #include "AliL3Transform.h"
12 #include "AliL3HoughTransformer.h"
13 #include "AliL3HoughTrack.h"
14 #include "AliL3TrackArray.h"
16 ClassImp(AliL3HoughTransformer)
18 AliL3HoughTransformer::AliL3HoughTransformer()
36 AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Float_t *etarange)
40 fTransform = new AliL3Transform();
42 fEtaMin = etarange[0];
43 fEtaMax = etarange[1];
46 fNumOfPadRows=NRowsSlice;
49 AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Double_t *etarange,Int_t n_eta_segments)
52 fTransform = new AliL3Transform();
55 //assumes you want to look at a given etaslice only
56 fEtaMin = etarange[0];
57 fEtaMax = etarange[1];
61 //transform in all etaslices
63 fEtaMax = slice < 18 ? 0.9 : -0.9;
65 fNumEtaSegments = n_eta_segments;
68 fNumOfPadRows = NRowsSlice;
72 AliL3HoughTransformer::~AliL3HoughTransformer()
76 delete [] fRowContainer;
80 delete [] fPhiRowContainer;
85 for(Int_t i=0; i<fNDigits; i++)
91 void AliL3HoughTransformer::InitTemplates(TH2F *hist)
96 Int_t ymin = hist->GetYaxis()->GetFirst();
97 Int_t ymax = hist->GetYaxis()->GetLast();
98 Int_t nbinsy = hist->GetNbinsY();
100 fIndex = new Int_t*[fNDigits];
101 for(Int_t i=0; i<fNDigits; i++)
102 fIndex[i] = new Int_t[nbinsy+1];
106 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
109 for(pixel=(AliL3Digits*)fRowContainer[padrow].first; pixel!=0; pixel=(AliL3Digits*)pixel->nextRowPixel)
112 fTransform->Slice2Sector(fSlice,padrow,sector,row);
113 fTransform->Raw2Local(xyz,sector,row,pixel->fPad,pixel->fTime);
115 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
117 Double_t phi_pix = fTransform->GetPhi(xyz);
118 Int_t index = pixel->fIndex;
119 if(index >= fNDigits)
120 printf("AliL3HoughTransformer::InitTemplates : Index error! %d\n",index);
121 for(Int_t p=ymin; p<=ymax; p++)
124 Double_t phi0 = hist->GetYaxis()->GetBinCenter(p);
125 Double_t kappa = 2*sin(phi_pix-phi0)/r_pix;
126 //printf("kappa %f phi0 %f\n",kappa,phi0);
127 Int_t bin = hist->FindBin(kappa,phi0);
128 if(fIndex[index][p]!=0)
129 printf("AliL3HoughTransformer::InitTemplates : Overlapping indexes\n");
130 fIndex[index][p] = bin;
138 void AliL3HoughTransformer::CountBins()
141 Int_t middle_row = 87; //middle of the slice
143 Double_t r_in_bundle = fTransform->Row2X(middle_row);
144 // Double_t phi_min = (fSlice*20 - 10)*ToRad;
145 //Double_t phi_max = (fSlice*20 + 10)*ToRad;
146 Double_t phi_min = -15*ToRad;
147 Double_t phi_max = 15*ToRad;
149 Double_t phi_slice = (phi_max - phi_min)/fNPhiSegments;
150 Double_t min_phi0 = 10000;
151 Double_t max_phi0 = 0;
152 Double_t min_kappa = 100000;
153 Double_t max_kappa = 0;
157 Float_t xrange[2] = {-0.006 , 0.006}; //Pt 0.2->
158 Float_t yrange[2] = {-0.26 , 0.26}; //slice 2 0.55->0.88
160 TH2F *histo = new TH2F("histo","Parameter space",xbin,xrange[0],xrange[1],ybin,yrange[0],yrange[1]);
162 for(Int_t padrow=NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
164 for(Int_t pad=0; pad < fTransform->GetNPads(padrow); pad++)
166 for(Int_t time = 0; time < fTransform->GetNTimeBins(); time++)
170 fTransform->Slice2Sector(fSlice,padrow,sector,row);
171 fTransform->Raw2Global(xyz,sector,row,pad,time);
172 Double_t eta = fTransform->GetEta(xyz);
173 if(eta < fEtaMin || eta > fEtaMax) continue;
174 fTransform->Global2Local(xyz,sector);
175 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
176 Double_t phi_pix = fTransform->GetPhi(xyz);
178 for(Int_t p=0; p<=fNPhiSegments; p++)
180 Double_t phi_in_bundle = phi_min + p*phi_slice;
182 Double_t tanPhi0 = (r_pix*sin(phi_in_bundle)-r_in_bundle*sin(phi_pix))/(r_pix*cos(phi_in_bundle)-r_in_bundle*cos(phi_pix));
184 Double_t phi0 = atan(tanPhi0);
185 // if(phi0 < 0.55 || phi0 > 0.88) continue;
187 //if(phi0 < 0) phi0 = phi0 +2*Pi;
188 //Double_t kappa = sin(phi_in_bundle - phi0)*2/r_in_bundle;
190 Double_t angle = phi_pix - phi0;
191 Double_t kappa = 2*sin(angle)/r_pix;
192 histo->Fill(kappa,phi0,1);
197 if(kappa < min_kappa)
199 if(kappa > max_kappa)
211 Int_t xmin = histo->GetXaxis()->GetFirst();
212 Int_t xmax = histo->GetXaxis()->GetLast();
213 Int_t ymin = histo->GetYaxis()->GetFirst();
214 Int_t ymax = histo->GetYaxis()->GetLast();
217 for(Int_t xbin=xmin+1; xbin<xmax; xbin++)
219 for(Int_t ybin=ymin+1; ybin<ymax; ybin++)
222 Int_t bin = histo->GetBin(xbin,ybin);
223 if(histo->GetBinContent(bin)>0)
229 printf("Number of possible tracks in this region %d, bins %d\n",count,bi);
230 printf("Phi, min %f max %f\n",min_phi0,max_phi0);
231 printf("Kappa, min %f max %f\n",min_kappa,max_kappa);
236 void AliL3HoughTransformer::Transform2Circle(TH2F *hist,Int_t eta_index)
238 //Transformation is done with respect to local coordinates in slice.
239 //Transform every pixel into whole phirange, using parametrisation:
240 //kappa = 2*sin(phi-phi0)/R
241 //Assumes you run InitTemplates firstly!!!!
245 Int_t nbinsy = hist->GetNbinsY();
247 Int_t totsignal=0,vol_index;
248 if(fNumEtaSegments==1)
249 eta_index=0; //only looking in one etaslice.
251 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
253 vol_index = eta_index*fNumOfPadRows + padrow;
254 //for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
255 for(pix1=(AliL3Digits*)fVolume[vol_index].first; pix1!=0; pix1=(AliL3Digits*)pix1->fNextVolumePixel)
258 Short_t signal = pix1->fCharge;
259 Int_t index = pix1->fIndex;
260 if(index < 0) continue; //This pixel has been removed.
262 for(Int_t p=0; p <= nbinsy; p++)
263 hist->AddBinContent(fIndex[index][p],signal);
269 printf("Total signal %d\n",totsignal);
273 void AliL3HoughTransformer::Transform2Circle(TH2F *hist)
275 //Transformation is done with respect to local coordinates in slice.
276 //Transform every pixel into whole phirange, using parametrisation:
277 //kappa = 2*sin(phi-phi0)/R
279 printf("Transforming 1 pixel only\n");
284 Int_t ymin = hist->GetYaxis()->GetFirst();
285 Int_t ymax = hist->GetYaxis()->GetLast();
287 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
290 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
294 fTransform->Slice2Sector(fSlice,padrow,sector,row);
295 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
297 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
299 Double_t phi_pix = fTransform->GetPhi(xyz);
300 Short_t signal = pix1->fCharge;
302 for(Int_t p=ymin+1; p<=ymax; p++)
304 Double_t phi0 = hist->GetYaxis()->GetBinCenter(p);
305 Double_t kappa = 2*sin(phi_pix-phi0)/r_pix;
306 hist->Fill(kappa,phi0,signal);
317 void AliL3HoughTransformer::TransformLines2Circle(TH2F *hist,AliL3TrackArray *tracks)
320 for(Int_t i=0; i<tracks->GetNTracks(); i++)
322 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
323 if(!track) {printf("AliL3HoughTransformer::TransformLines2Circle : NO TRACK IN ARRAY\n"); continue;}
325 Double_t xmin = fTransform->Row2X(track->GetFirstRow());
326 Double_t xmax = fTransform->Row2X(track->GetLastRow());
328 Double_t a = -1./tan(track->GetPsiLine());
329 Double_t b = track->GetDLine()/sin(track->GetPsiLine());
331 Double_t ymin = a*xmin + b;
332 Double_t ymax = a*xmax + b;
334 Double_t middle_x = xmin + (xmax-xmin)/2;
335 Double_t middle_y = ymin + (ymax-ymin)/2;
337 Double_t r_middle = sqrt(middle_x*middle_x + middle_y*middle_y);
338 Double_t phi = atan2(middle_y,middle_x);
339 Double_t phi0 = 2*phi - track->GetPsiLine();
340 Double_t kappa = 2*sin(phi-phi0)/r_middle;
341 hist->Fill(kappa,phi0,track->GetWeight());
348 void AliL3HoughTransformer::Transform2Line(TH2F *hist,Int_t ref_row,Int_t *rowrange,Double_t *phirange,TH2F *raw)
350 //Transform every pixel into histogram, using parametrisation:
351 //D = x*cos(psi) + y*sin(psi)
353 // printf("In Transform; rowrange %d %d ref_row %d phirange %f %f\n",rowrange[0],rowrange[1],ref_row,phirange[0],phirange[1]);
357 Int_t xmin = hist->GetXaxis()->GetFirst();
358 Int_t xmax = hist->GetXaxis()->GetLast();
360 Double_t x0 = fTransform->Row2X(ref_row);
364 //for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
366 Double_t phi_min = -10*ToRad;
367 Double_t phi_max = 10*ToRad;
368 Double_t delta_phi = (phi_max-phi_min)/fNPhiSegments;
371 Int_t phi_min_index = (Int_t)((phirange[0]*ToRad-phi_min)/delta_phi);
372 Int_t phi_max_index = (Int_t)((phirange[1]*ToRad-phi_min)/delta_phi);
377 for(Int_t phi=phi_min_index; phi <= phi_max_index; phi++)
379 for(Int_t padrow = rowrange[0]; padrow <= rowrange[1]; padrow++)
382 index = phi*fNumOfPadRows + padrow;
383 //printf("Looping index %d\n",index);
384 if(index > fContainerBounds || index < 0)
386 printf("AliL3HoughTransformer::Transform2Line : index %d out of range \n",index);
389 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
390 //for(pix1=(AliL3Digits*)fPhiRowContainer[index].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextPhiRowPixel)
392 //printf("Transforming pixel in index %d pad %d time %d padrow %d\n",index,pix1->fPad,pix1->fTime,padrow);
394 fTransform->Slice2Sector(fSlice,padrow,sector,row);
395 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
398 raw->Fill(xyz[0],xyz[1],pix1->fCharge);
403 //printf("calculating...");
404 for(Int_t d=xmin+1; d<=xmax; d++)
406 Double_t psi = hist->GetXaxis()->GetBinCenter(d);
407 Double_t D = xyz[0]*cos(psi) + xyz[1]*sin(psi);
409 Short_t signal = pix1->fCharge;
410 hist->Fill(psi,D,signal);
411 //printf("Filling histo, psi %f D %f\n",psi,D);
422 void AliL3HoughTransformer::GetPixels(Char_t *rootfile,TH2F *hist)
425 TFile *file = new TFile(rootfile);
428 AliTPCParam *param=(AliTPCParam *)file->Get("75x40_100x60");
429 TTree *t=(TTree*)file->Get("TreeD_75x40_100x60");
431 AliSimDigits da, *digarr=&da;
432 t->GetBranch("Segment")->SetAddress(&digarr);
433 Stat_t num_of_entries=t->GetEntries();
435 Int_t digit_counter=0;
439 Int_t nrows = NRows[fPatch][1] - NRows[fPatch][0] + 1;
440 printf("nrows %d slice %d patch %d\n",nrows,fSlice,fPatch);
443 delete [] fRowContainer;
444 fRowContainer = new AliL3HoughContainer[fNumOfPadRows];
445 memset(fRowContainer,0,fNumOfPadRows*sizeof(AliL3HoughContainer));
448 //fContainerBounds = (fNPhiSegments+1)*(fNumOfPadRows+1);
449 //printf("Allocating %d bytes to container of size %d\n",fContainerBounds*sizeof(AliL3HoughContainer),fContainerBounds);
453 delete [] fPhiRowContainer;
454 fPhiRowContainer = new AliL3HoughContainer[fContainerBounds];
455 memset(fPhiRowContainer,0,fContainerBounds*sizeof(AliL3HoughContainer));
457 fContainerBounds = (fNumEtaSegments+1)*(fNumOfPadRows+1);
460 fVolume = new AliL3HoughContainer[fContainerBounds];
461 memset(fVolume,0,fContainerBounds*sizeof(AliL3HoughContainer));
463 Double_t phi_min = -10*ToRad;
464 Double_t phi_max = 10*ToRad;
465 Double_t delta_phi = (phi_max-phi_min)/fNPhiSegments;
467 Double_t eta_slice = (fEtaMax-fEtaMin)/fNumEtaSegments;
471 printf("\nLoading ALL pixels in slice\n\n");
473 for (Int_t i=0; i<num_of_entries; i++)
478 param->AdjustSectorRow(digarr->GetID(),sector,row);
480 fTransform->Sector2Slice(slice,padrow,sector,row);
481 if(slice != fSlice) continue;
482 if(padrow < NRows[fPatch][0]) continue;
483 if(padrow > NRows[fPatch][1]) break;
486 Int_t time=digarr->CurrentRow();
487 Int_t pad=digarr->CurrentColumn();
488 Short_t signal=digarr->CurrentDigit();
489 if(time < param->GetMaxTBin()-1 && time > 0)
490 if(digarr->GetDigit(time-1,pad) <= param->GetZeroSup()
491 && digarr->GetDigit(time+1,pad) <= param->GetZeroSup())
495 fTransform->Raw2Global(xyz,sector,row,pad,time);
496 eta = fTransform->GetEta(xyz);
498 if(eta < fEtaMin || eta > fEtaMax) continue;
499 fTransform->Global2Local(xyz,sector);
502 //phi = fTransform->GetPhi(xyz);
504 hist->Fill(xyz[0],xyz[1],signal);
506 AliL3Digits *dig = new AliL3Digits;
507 dig->fIndex = digit_counter;
509 dig->fCharge = signal;
513 if(fRowContainer[padrow].first == NULL)
514 fRowContainer[padrow].first = (void*)dig;
516 ((AliL3Digits*)(fRowContainer[padrow].last))->nextRowPixel=dig;
517 fRowContainer[padrow].last = (void*)dig;
519 //thisHit->etaIndex=(Int_t)((thisHit->GetEta()-fEtaMin)/etaSlice + 1);
520 Int_t eta_index = (Int_t)((eta-fEtaMin)/eta_slice);
521 index = eta_index*fNumOfPadRows + padrow;
522 if(index > fContainerBounds || index < 0)
525 //printf("AliL3HoughTransformer::GetPixels : index out of range %d %d eta_index %d padrow %d\n",index,fContainerBounds,eta_index,padrow);
529 if(fVolume[index].first == NULL)
530 fVolume[index].first = (void*)dig;
532 ((AliL3Digits*)(fVolume[index].last))->fNextVolumePixel = dig;
533 fVolume[index].last = (void*)dig;
536 Int_t phi_index = (Int_t)((phi-phi_min)/delta_phi);
537 index = phi_index*fNumOfPadRows + padrow;
538 if(phi_index > fContainerBounds || phi_index < 0)
540 printf("AliL3HoughTransform::GetPixels : index out of range %d\n",phi_index);
544 if(fPhiRowContainer[index].first == NULL)
545 fPhiRowContainer[index].first = (void*)dig;
547 ((AliL3Digits*)(fPhiRowContainer[index].last))->nextPhiRowPixel = dig;
548 fPhiRowContainer[index].last=(void*)dig;
550 }while (digarr->Next());
554 fNDigits = digit_counter;
555 printf("digitcounter %d\n",digit_counter);
556 printf("Allocated %d bytes to pixels\n",digit_counter*sizeof(AliL3Digits));