7 #include "AliTPCParam.h"
8 #include "AliSimDigits.h"
10 #include "AliL3Defs.h"
11 #include "AliL3Transform.h"
12 #include "AliL3HoughPixel.h"
13 #include "AliL3HoughTransformer.h"
14 #include "AliL3HoughTrack.h"
15 #include "AliL3TrackArray.h"
17 ClassImp(AliL3HoughTransformer)
19 AliL3HoughTransformer::AliL3HoughTransformer()
36 AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Float_t *etarange,Int_t phi_segments)
40 fTransform = new AliL3Transform();
43 fEtaMin = etarange[0];
44 fEtaMax = etarange[1];
47 fNPhiSegments = phi_segments;
48 fNumOfPadRows=NRowsSlice;
52 AliL3HoughTransformer::~AliL3HoughTransformer()
56 delete [] fRowContainer;
60 delete [] fPhiRowContainer;
63 for(Int_t i=0; i<fNDigits; i++)
69 void AliL3HoughTransformer::InitTemplates(TH2F *hist)
74 Int_t ymin = hist->GetYaxis()->GetFirst();
75 Int_t ymax = hist->GetYaxis()->GetLast();
76 Int_t nbinsy = hist->GetNbinsY();
78 fIndex = new Int_t*[fNDigits];
79 for(Int_t i=0; i<fNDigits; i++)
80 fIndex[i] = new Int_t[nbinsy+1];
83 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
86 for(pixel=(AliL3Digits*)fRowContainer[padrow].first; pixel!=0; pixel=(AliL3Digits*)pixel->nextRowPixel)
89 fTransform->Slice2Sector(fSlice,padrow,sector,row);
90 fTransform->Raw2Local(xyz,sector,row,pixel->fPad,pixel->fTime);
92 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
94 Double_t phi_pix = fTransform->GetPhi(xyz);
95 Int_t index = pixel->fIndex;
97 printf("AliL3HoughTransformer::InitTemplates : Index error! %d\n",index);
98 for(Int_t p=ymin; p<=ymax; p++)
101 Double_t phi0 = hist->GetYaxis()->GetBinCenter(p);
102 Double_t kappa = 2*sin(phi_pix-phi0)/r_pix;
104 Int_t bin = hist->FindBin(kappa,phi0);
105 if(fIndex[index][p]!=0)
106 printf("AliL3HoughTransformer::InitTemplates : Overlapping indexes\n");
107 fIndex[index][p] = bin;
115 void AliL3HoughTransformer::CountBins()
118 Int_t middle_row = 87; //middle of the slice
120 Double_t r_in_bundle = fTransform->Row2X(middle_row);
121 // Double_t phi_min = (fSlice*20 - 10)*ToRad;
122 //Double_t phi_max = (fSlice*20 + 10)*ToRad;
123 Double_t phi_min = -15*ToRad;
124 Double_t phi_max = 15*ToRad;
126 Double_t phi_slice = (phi_max - phi_min)/fNPhiSegments;
127 Double_t min_phi0 = 10000;
128 Double_t max_phi0 = 0;
129 Double_t min_kappa = 100000;
130 Double_t max_kappa = 0;
134 Float_t xrange[2] = {-0.006 , 0.006}; //Pt 0.2->
135 Float_t yrange[2] = {-0.26 , 0.26}; //slice 2 0.55->0.88
137 TH2F *histo = new TH2F("histo","Parameter space",xbin,xrange[0],xrange[1],ybin,yrange[0],yrange[1]);
139 for(Int_t padrow=NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
141 for(Int_t pad=0; pad < fTransform->GetNPads(padrow); pad++)
143 for(Int_t time = 0; time < fTransform->GetNTimeBins(); time++)
147 fTransform->Slice2Sector(fSlice,padrow,sector,row);
148 fTransform->Raw2Global(xyz,sector,row,pad,time);
149 Double_t eta = fTransform->GetEta(xyz);
150 if(eta < fEtaMin || eta > fEtaMax) continue;
151 fTransform->Global2Local(xyz,sector);
152 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
153 Double_t phi_pix = fTransform->GetPhi(xyz);
155 for(Int_t p=0; p<=fNPhiSegments; p++)
157 Double_t phi_in_bundle = phi_min + p*phi_slice;
159 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));
161 Double_t phi0 = atan(tanPhi0);
162 // if(phi0 < 0.55 || phi0 > 0.88) continue;
164 //if(phi0 < 0) phi0 = phi0 +2*Pi;
165 //Double_t kappa = sin(phi_in_bundle - phi0)*2/r_in_bundle;
167 Double_t angle = phi_pix - phi0;
168 Double_t kappa = 2*sin(angle)/r_pix;
169 histo->Fill(kappa,phi0,1);
174 if(kappa < min_kappa)
176 if(kappa > max_kappa)
188 Int_t xmin = histo->GetXaxis()->GetFirst();
189 Int_t xmax = histo->GetXaxis()->GetLast();
190 Int_t ymin = histo->GetYaxis()->GetFirst();
191 Int_t ymax = histo->GetYaxis()->GetLast();
194 for(Int_t xbin=xmin+1; xbin<xmax; xbin++)
196 for(Int_t ybin=ymin+1; ybin<ymax; ybin++)
199 Int_t bin = histo->GetBin(xbin,ybin);
200 if(histo->GetBinContent(bin)>0)
206 printf("Number of possible tracks in this region %d, bins %d\n",count,bi);
207 printf("Phi, min %f max %f\n",min_phi0,max_phi0);
208 printf("Kappa, min %f max %f\n",min_kappa,max_kappa);
213 void AliL3HoughTransformer::Transform2Circle(TH2F *hist,Int_t middle_row)
215 //Transformation is done with respect to local coordinates in slice.
221 //Define a common point
224 Double_t rowdist1 = fTransform->Row2X(middle_row-1);
225 Double_t rowdist2 = fTransform->Row2X(middle_row);
226 Double_t r_in_bundle = rowdist1 + (rowdist1-rowdist2)/2;
229 Double_t r_in_bundle = fTransform->Row2X(middle_row);
230 //Make overlap between slices
231 Double_t phi_min = -15*ToRad;
232 Double_t phi_max = 15*ToRad;
234 Double_t phi_slice = (phi_max - phi_min)/fNPhiSegments;
236 for(Int_t p=0; p <= fNPhiSegments; p++)
238 Double_t phi_in_bundle = phi_min + p*phi_slice;
239 //printf("phi %f in slice %d patch %d middle row %f\n",phi_in_bundle/ToRad,fSlice,fPatch,r_in_bundle);
241 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
242 //for(Int_t padrow = middle_row; padrow <= 173; padrow++)
243 //for(Int_t padrow = 0; padrow <= middle_row; padrow++)
246 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
250 fTransform->Slice2Sector(fSlice,padrow,sector,row);
251 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
252 //fTransform->Raw2Global(xyz,sector,row,pix1->fPad,pix1->fTime);
254 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
256 Double_t phi_pix = fTransform->GetPhi(xyz);
258 //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));
259 Double_t tanPhi0 = (r_in_bundle*sin(phi_pix)-r_pix*sin(phi_in_bundle))/(r_in_bundle*cos(phi_pix)-r_pix*cos(phi_in_bundle));
261 Double_t phi0 = atan(tanPhi0);
262 //if(padrow > middle_row)
264 //if(phi0 < 0.55 || phi0 > 0.88) continue;
266 Double_t angle = phi_pix - phi0;
267 Double_t kappa = 2*sin(angle)/r_pix;
269 //Double_t angle = phi_in_bundle - phi0;
270 //Double_t kappa = 2*sin(angle)/r_in_bundle;
272 //if(kappa < -0.006 || kappa > 0.006) continue;
274 Short_t signal = pix1->fCharge;
276 hist->Fill(kappa,phi0,signal);
287 void AliL3HoughTransformer::Transform2Circle(TH2F *hist)
289 //Transformation is done with respect to local coordinates in slice.
290 //Transform every pixel into whole phirange, using parametrisation:
291 //kappa = 2*sin(phi-phi0)/R
292 //Assumes you run InitTemplates firstly!!!!
296 Int_t nbinsy = hist->GetNbinsY();
298 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
301 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
304 Short_t signal = pix1->fCharge;
305 Int_t index = pix1->fIndex;
307 for(Int_t p=0; p <= nbinsy; p++)
308 hist->AddBinContent(fIndex[index][p],signal);
318 void AliL3HoughTransformer::Transform2Circle(TH2F *hist)
320 //Transformation is done with respect to local coordinates in slice.
321 //Transform every pixel into whole phirange, using parametrisation:
322 //kappa = 2*sin(phi-phi0)/R
324 printf("Transforming 1 pixel only\n");
329 Int_t ymin = hist->GetYaxis()->GetFirst();
330 Int_t ymax = hist->GetYaxis()->GetLast();
332 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
335 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
339 fTransform->Slice2Sector(fSlice,padrow,sector,row);
340 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
342 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
344 Double_t phi_pix = fTransform->GetPhi(xyz);
345 Short_t signal = pix1->fCharge;
347 for(Int_t p=ymin+1; p<=ymax; p++)
349 Double_t phi0 = hist->GetYaxis()->GetBinCenter(p);
350 Double_t kappa = 2*sin(phi_pix-phi0)/r_pix;
351 hist->Fill(kappa,phi0,signal);
362 void AliL3HoughTransformer::TransformLines2Circle(TH2F *hist,AliL3TrackArray *tracks)
365 for(Int_t i=0; i<tracks->GetNTracks(); i++)
367 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
368 if(!track) {printf("AliL3HoughTransformer::TransformLines2Circle : NO TRACK IN ARRAY\n"); continue;}
370 Double_t xmin = fTransform->Row2X(track->GetFirstRow());
371 Double_t xmax = fTransform->Row2X(track->GetLastRow());
373 Double_t a = -1./tan(track->GetPsiLine());
374 Double_t b = track->GetDLine()/sin(track->GetPsiLine());
376 Double_t ymin = a*xmin + b;
377 Double_t ymax = a*xmax + b;
379 Double_t middle_x = xmin + (xmax-xmin)/2;
380 Double_t middle_y = ymin + (ymax-ymin)/2;
382 Double_t r_middle = sqrt(middle_x*middle_x + middle_y*middle_y);
383 Double_t phi = atan2(middle_y,middle_x);
384 Double_t phi0 = 2*phi - track->GetPsiLine();
385 Double_t kappa = 2*sin(phi-phi0)/r_middle;
386 hist->Fill(kappa,phi0,track->GetWeight());
393 void AliL3HoughTransformer::Transform2Line(TH2F *hist,Int_t ref_row,Int_t *rowrange,Double_t *phirange,TH2F *raw)
395 //Transform every pixel into histogram, using parametrisation:
396 //D = x*cos(psi) + y*sin(psi)
398 // printf("In Transform; rowrange %d %d ref_row %d phirange %f %f\n",rowrange[0],rowrange[1],ref_row,phirange[0],phirange[1]);
402 Int_t xmin = hist->GetXaxis()->GetFirst();
403 Int_t xmax = hist->GetXaxis()->GetLast();
405 Double_t x0 = fTransform->Row2X(ref_row);
409 //for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
411 Double_t phi_min = -10*ToRad;
412 Double_t phi_max = 10*ToRad;
413 Double_t delta_phi = (phi_max-phi_min)/fNPhiSegments;
416 Int_t phi_min_index = (Int_t)((phirange[0]*ToRad-phi_min)/delta_phi);
417 Int_t phi_max_index = (Int_t)((phirange[1]*ToRad-phi_min)/delta_phi);
422 for(Int_t phi=phi_min_index; phi <= phi_max_index; phi++)
424 for(Int_t padrow = rowrange[0]; padrow <= rowrange[1]; padrow++)
427 index = phi*fNumOfPadRows + padrow;
428 //printf("Looping index %d\n",index);
429 if(index > fContainerBounds || index < 0)
431 printf("AliL3HoughTransformer::Transform2Line : index %d out of range \n",index);
434 //for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
435 for(pix1=(AliL3Digits*)fPhiRowContainer[index].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextPhiRowPixel)
437 //printf("Transforming pixel in index %d pad %d time %d padrow %d\n",index,pix1->fPad,pix1->fTime,padrow);
439 fTransform->Slice2Sector(fSlice,padrow,sector,row);
440 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
443 raw->Fill(xyz[0],xyz[1],pix1->fCharge);
448 //printf("calculating...");
449 for(Int_t d=xmin+1; d<=xmax; d++)
451 Double_t psi = hist->GetXaxis()->GetBinCenter(d);
452 Double_t D = xyz[0]*cos(psi) + xyz[1]*sin(psi);
454 Short_t signal = pix1->fCharge;
455 hist->Fill(psi,D,signal);
456 //printf("Filling histo, psi %f D %f\n",psi,D);
467 void AliL3HoughTransformer::GetPixels(Char_t *rootfile,TH2F *hist)
470 TFile *file = new TFile(rootfile);
473 AliTPCParam *param=(AliTPCParam *)file->Get("75x40_100x60");
474 TTree *t=(TTree*)file->Get("TreeD_75x40_100x60");
476 AliSimDigits da, *digarr=&da;
477 t->GetBranch("Segment")->SetAddress(&digarr);
478 Stat_t num_of_entries=t->GetEntries();
480 Int_t digit_counter=0;
484 Int_t nrows = NRows[fPatch][1] - NRows[fPatch][0] + 1;
485 printf("nrows %d slice %d patch %d\n",nrows,fSlice,fPatch);
488 delete [] fRowContainer;
489 fRowContainer = new AliL3HoughContainer[fNumOfPadRows];
490 memset(fRowContainer,0,fNumOfPadRows*sizeof(AliL3HoughContainer));
493 fContainerBounds = (fNPhiSegments+1)*(fNumOfPadRows+1);
494 printf("Allocating %d bytes to container of size %d\n",fContainerBounds*sizeof(AliL3HoughContainer),fContainerBounds);
496 delete [] fPhiRowContainer;
497 fPhiRowContainer = new AliL3HoughContainer[fContainerBounds];
498 memset(fPhiRowContainer,0,fContainerBounds*sizeof(AliL3HoughContainer));
500 Double_t phi_min = -10*ToRad;
501 Double_t phi_max = 10*ToRad;
502 Double_t delta_phi = (phi_max-phi_min)/fNPhiSegments;
506 for (Int_t i=0; i<num_of_entries; i++)
511 param->AdjustSectorRow(digarr->GetID(),sector,row);
513 fTransform->Sector2Slice(slice,padrow,sector,row);
514 if(slice != fSlice) continue;
515 if(padrow < NRows[fPatch][0]) continue;
516 if(padrow > NRows[fPatch][1]) break;
519 Int_t time=digarr->CurrentRow();
520 Int_t pad=digarr->CurrentColumn();
521 Short_t signal=digarr->CurrentDigit();
522 if(time < param->GetMaxTBin()-1 && time > 0)
523 if(digarr->GetDigit(time-1,pad) <= param->GetZeroSup()
524 && digarr->GetDigit(time+1,pad) <= param->GetZeroSup())
528 fTransform->Raw2Global(xyz,sector,row,pad,time);
529 eta = fTransform->GetEta(xyz);
530 if(eta < fEtaMin || eta > fEtaMax) continue;
531 fTransform->Global2Local(xyz,sector);
534 phi = fTransform->GetPhi(xyz);
536 hist->Fill(xyz[0],xyz[1],signal);
538 AliL3Digits *dig = new AliL3Digits;
539 dig->fIndex = digit_counter;
541 dig->fCharge = signal;
545 if(fRowContainer[padrow].first == NULL)
546 fRowContainer[padrow].first = (void*)dig;
548 ((AliL3Digits*)(fRowContainer[padrow].last))->nextRowPixel=dig;
549 fRowContainer[padrow].last = (void*)dig;
551 Int_t phi_index = (Int_t)((phi-phi_min)/delta_phi);
552 index = phi_index*fNumOfPadRows + padrow;
553 if(phi_index > fContainerBounds || phi_index < 0)
555 printf("AliL3HoughTransform::GetPixels : index out of range %d\n",phi_index);
559 if(fPhiRowContainer[index].first == NULL)
560 fPhiRowContainer[index].first = (void*)dig;
562 ((AliL3Digits*)(fPhiRowContainer[index].last))->nextPhiRowPixel = dig;
563 fPhiRowContainer[index].last=(void*)dig;
565 }while (digarr->Next());
569 fNDigits = digit_counter;
570 printf("digitcounter %d\n",digit_counter);
571 printf("Allocated %d bytes to pixels\n",digit_counter*sizeof(AliL3Digits));