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()
37 AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Float_t *etarange)
41 fTransform = new AliL3Transform();
43 fEtaMin = etarange[0];
44 fEtaMax = etarange[1];
47 fNumOfPadRows=NRowsSlice;
50 AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Double_t *etarange,Int_t n_eta_segments)
53 fTransform = new AliL3Transform();
56 //assumes you want to look at a given etaslice only
57 fEtaMin = etarange[0];
58 fEtaMax = etarange[1];
62 //transform in all etaslices
64 fEtaMax = slice < 18 ? 0.9 : -0.9;
66 fNumEtaSegments = n_eta_segments;
69 fNumOfPadRows = NRowsSlice;
73 AliL3HoughTransformer::~AliL3HoughTransformer()
77 delete [] fRowContainer;
81 delete [] fPhiRowContainer;
86 for(Int_t i=0; i<fNDigits; i++)
92 void AliL3HoughTransformer::InitTemplates(TH2F *hist)
97 Int_t ymin = hist->GetYaxis()->GetFirst();
98 Int_t ymax = hist->GetYaxis()->GetLast();
99 Int_t nbinsy = hist->GetNbinsY();
101 fIndex = new Int_t*[fNDigits];
102 for(Int_t i=0; i<fNDigits; i++)
103 fIndex[i] = new Int_t[nbinsy+1];
107 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
110 for(pixel=(AliL3Digits*)fRowContainer[padrow].first; pixel!=0; pixel=(AliL3Digits*)pixel->nextRowPixel)
113 fTransform->Slice2Sector(fSlice,padrow,sector,row);
114 fTransform->Raw2Local(xyz,sector,row,pixel->fPad,pixel->fTime);
116 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
118 Double_t phi_pix = fTransform->GetPhi(xyz);
119 Int_t index = pixel->fIndex;
120 if(index >= fNDigits)
121 printf("AliL3HoughTransformer::InitTemplates : Index error! %d\n",index);
122 for(Int_t p=ymin; p<=ymax; p++)
125 Double_t phi0 = hist->GetYaxis()->GetBinCenter(p);
126 Double_t kappa = 2*sin(phi_pix-phi0)/r_pix;
127 //printf("kappa %f phi0 %f\n",kappa,phi0);
128 Int_t bin = hist->FindBin(kappa,phi0);
129 if(fIndex[index][p]!=0)
130 printf("AliL3HoughTransformer::InitTemplates : Overlapping indexes\n");
131 fIndex[index][p] = bin;
139 void AliL3HoughTransformer::CountBins()
142 Int_t middle_row = 87; //middle of the slice
144 Double_t r_in_bundle = fTransform->Row2X(middle_row);
145 // Double_t phi_min = (fSlice*20 - 10)*ToRad;
146 //Double_t phi_max = (fSlice*20 + 10)*ToRad;
147 Double_t phi_min = -15*ToRad;
148 Double_t phi_max = 15*ToRad;
150 Double_t phi_slice = (phi_max - phi_min)/fNPhiSegments;
151 Double_t min_phi0 = 10000;
152 Double_t max_phi0 = 0;
153 Double_t min_kappa = 100000;
154 Double_t max_kappa = 0;
158 Float_t xrange[2] = {-0.006 , 0.006}; //Pt 0.2->
159 Float_t yrange[2] = {-0.26 , 0.26}; //slice 2 0.55->0.88
161 TH2F *histo = new TH2F("histo","Parameter space",xbin,xrange[0],xrange[1],ybin,yrange[0],yrange[1]);
163 for(Int_t padrow=NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
165 for(Int_t pad=0; pad < fTransform->GetNPads(padrow); pad++)
167 for(Int_t time = 0; time < fTransform->GetNTimeBins(); time++)
171 fTransform->Slice2Sector(fSlice,padrow,sector,row);
172 fTransform->Raw2Global(xyz,sector,row,pad,time);
173 Double_t eta = fTransform->GetEta(xyz);
174 if(eta < fEtaMin || eta > fEtaMax) continue;
175 fTransform->Global2Local(xyz,sector);
176 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
177 Double_t phi_pix = fTransform->GetPhi(xyz);
179 for(Int_t p=0; p<=fNPhiSegments; p++)
181 Double_t phi_in_bundle = phi_min + p*phi_slice;
183 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));
185 Double_t phi0 = atan(tanPhi0);
186 // if(phi0 < 0.55 || phi0 > 0.88) continue;
188 //if(phi0 < 0) phi0 = phi0 +2*Pi;
189 //Double_t kappa = sin(phi_in_bundle - phi0)*2/r_in_bundle;
191 Double_t angle = phi_pix - phi0;
192 Double_t kappa = 2*sin(angle)/r_pix;
193 histo->Fill(kappa,phi0,1);
198 if(kappa < min_kappa)
200 if(kappa > max_kappa)
212 Int_t xmin = histo->GetXaxis()->GetFirst();
213 Int_t xmax = histo->GetXaxis()->GetLast();
214 Int_t ymin = histo->GetYaxis()->GetFirst();
215 Int_t ymax = histo->GetYaxis()->GetLast();
218 for(Int_t xbin=xmin+1; xbin<xmax; xbin++)
220 for(Int_t ybin=ymin+1; ybin<ymax; ybin++)
223 Int_t bin = histo->GetBin(xbin,ybin);
224 if(histo->GetBinContent(bin)>0)
230 printf("Number of possible tracks in this region %d, bins %d\n",count,bi);
231 printf("Phi, min %f max %f\n",min_phi0,max_phi0);
232 printf("Kappa, min %f max %f\n",min_kappa,max_kappa);
237 void AliL3HoughTransformer::Transform2Circle(TH2F *hist,Int_t eta_index)
239 //Transformation is done with respect to local coordinates in slice.
240 //Transform every pixel into whole phirange, using parametrisation:
241 //kappa = 2*sin(phi-phi0)/R
242 //Assumes you run InitTemplates firstly!!!!
246 Int_t nbinsy = hist->GetNbinsY();
248 Int_t totsignal=0,vol_index;
249 if(fNumEtaSegments==1)
250 eta_index=0; //only looking in one etaslice.
252 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
254 vol_index = eta_index*fNumOfPadRows + padrow;
255 //for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
256 for(pix1=(AliL3Digits*)fVolume[vol_index].first; pix1!=0; pix1=(AliL3Digits*)pix1->fNextVolumePixel)
259 Short_t signal = pix1->fCharge;
260 Int_t index = pix1->fIndex;
261 if(index < 0) continue; //This pixel has been removed.
263 for(Int_t p=0; p <= nbinsy; p++)
264 hist->AddBinContent(fIndex[index][p],signal);
270 printf("Total signal %d\n",totsignal);
274 void AliL3HoughTransformer::Transform2Circle(TH2F *hist)
276 //Transformation is done with respect to local coordinates in slice.
277 //Transform every pixel into whole phirange, using parametrisation:
278 //kappa = 2*sin(phi-phi0)/R
280 printf("Transforming 1 pixel only\n");
285 Int_t ymin = hist->GetYaxis()->GetFirst();
286 Int_t ymax = hist->GetYaxis()->GetLast();
288 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
291 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
295 fTransform->Slice2Sector(fSlice,padrow,sector,row);
296 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
298 Double_t r_pix = sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
300 Double_t phi_pix = fTransform->GetPhi(xyz);
301 Short_t signal = pix1->fCharge;
303 for(Int_t p=ymin+1; p<=ymax; p++)
305 Double_t phi0 = hist->GetYaxis()->GetBinCenter(p);
306 Double_t kappa = 2*sin(phi_pix-phi0)/r_pix;
307 hist->Fill(kappa,phi0,signal);
318 void AliL3HoughTransformer::TransformLines2Circle(TH2F *hist,AliL3TrackArray *tracks)
321 for(Int_t i=0; i<tracks->GetNTracks(); i++)
323 AliL3HoughTrack *track = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
324 if(!track) {printf("AliL3HoughTransformer::TransformLines2Circle : NO TRACK IN ARRAY\n"); continue;}
326 Double_t xmin = fTransform->Row2X(track->GetFirstRow());
327 Double_t xmax = fTransform->Row2X(track->GetLastRow());
329 Double_t a = -1./tan(track->GetPsiLine());
330 Double_t b = track->GetDLine()/sin(track->GetPsiLine());
332 Double_t ymin = a*xmin + b;
333 Double_t ymax = a*xmax + b;
335 Double_t middle_x = xmin + (xmax-xmin)/2;
336 Double_t middle_y = ymin + (ymax-ymin)/2;
338 Double_t r_middle = sqrt(middle_x*middle_x + middle_y*middle_y);
339 Double_t phi = atan2(middle_y,middle_x);
340 Double_t phi0 = 2*phi - track->GetPsiLine();
341 Double_t kappa = 2*sin(phi-phi0)/r_middle;
342 hist->Fill(kappa,phi0,track->GetWeight());
349 void AliL3HoughTransformer::Transform2Line(TH2F *hist,Int_t ref_row,Int_t *rowrange,Double_t *phirange,TH2F *raw)
351 //Transform every pixel into histogram, using parametrisation:
352 //D = x*cos(psi) + y*sin(psi)
354 // printf("In Transform; rowrange %d %d ref_row %d phirange %f %f\n",rowrange[0],rowrange[1],ref_row,phirange[0],phirange[1]);
358 Int_t xmin = hist->GetXaxis()->GetFirst();
359 Int_t xmax = hist->GetXaxis()->GetLast();
361 Double_t x0 = fTransform->Row2X(ref_row);
365 //for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
367 Double_t phi_min = -10*ToRad;
368 Double_t phi_max = 10*ToRad;
369 Double_t delta_phi = (phi_max-phi_min)/fNPhiSegments;
372 Int_t phi_min_index = (Int_t)((phirange[0]*ToRad-phi_min)/delta_phi);
373 Int_t phi_max_index = (Int_t)((phirange[1]*ToRad-phi_min)/delta_phi);
378 for(Int_t phi=phi_min_index; phi <= phi_max_index; phi++)
380 for(Int_t padrow = rowrange[0]; padrow <= rowrange[1]; padrow++)
383 index = phi*fNumOfPadRows + padrow;
384 //printf("Looping index %d\n",index);
385 if(index > fContainerBounds || index < 0)
387 printf("AliL3HoughTransformer::Transform2Line : index %d out of range \n",index);
390 for(pix1=(AliL3Digits*)fRowContainer[padrow].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextRowPixel)
391 //for(pix1=(AliL3Digits*)fPhiRowContainer[index].first; pix1!=0; pix1=(AliL3Digits*)pix1->nextPhiRowPixel)
393 //printf("Transforming pixel in index %d pad %d time %d padrow %d\n",index,pix1->fPad,pix1->fTime,padrow);
395 fTransform->Slice2Sector(fSlice,padrow,sector,row);
396 fTransform->Raw2Local(xyz,sector,row,pix1->fPad,pix1->fTime);
399 raw->Fill(xyz[0],xyz[1],pix1->fCharge);
404 //printf("calculating...");
405 for(Int_t d=xmin+1; d<=xmax; d++)
407 Double_t psi = hist->GetXaxis()->GetBinCenter(d);
408 Double_t D = xyz[0]*cos(psi) + xyz[1]*sin(psi);
410 Short_t signal = pix1->fCharge;
411 hist->Fill(psi,D,signal);
412 //printf("Filling histo, psi %f D %f\n",psi,D);
423 void AliL3HoughTransformer::GetPixels(Char_t *rootfile,TH2F *hist)
426 TFile *file = new TFile(rootfile);
429 AliTPCParam *param=(AliTPCParam *)file->Get("75x40_100x60");
430 TTree *t=(TTree*)file->Get("TreeD_75x40_100x60");
432 AliSimDigits da, *digarr=&da;
433 t->GetBranch("Segment")->SetAddress(&digarr);
434 Stat_t num_of_entries=t->GetEntries();
436 Int_t digit_counter=0;
440 Int_t nrows = NRows[fPatch][1] - NRows[fPatch][0] + 1;
441 printf("nrows %d slice %d patch %d\n",nrows,fSlice,fPatch);
444 delete [] fRowContainer;
445 fRowContainer = new AliL3HoughContainer[fNumOfPadRows];
446 memset(fRowContainer,0,fNumOfPadRows*sizeof(AliL3HoughContainer));
449 //fContainerBounds = (fNPhiSegments+1)*(fNumOfPadRows+1);
450 //printf("Allocating %d bytes to container of size %d\n",fContainerBounds*sizeof(AliL3HoughContainer),fContainerBounds);
454 delete [] fPhiRowContainer;
455 fPhiRowContainer = new AliL3HoughContainer[fContainerBounds];
456 memset(fPhiRowContainer,0,fContainerBounds*sizeof(AliL3HoughContainer));
458 fContainerBounds = (fNumEtaSegments+1)*(fNumOfPadRows+1);
461 fVolume = new AliL3HoughContainer[fContainerBounds];
462 memset(fVolume,0,fContainerBounds*sizeof(AliL3HoughContainer));
464 Double_t phi_min = -10*ToRad;
465 Double_t phi_max = 10*ToRad;
466 Double_t delta_phi = (phi_max-phi_min)/fNPhiSegments;
468 Double_t eta_slice = (fEtaMax-fEtaMin)/fNumEtaSegments;
472 printf("\nLoading ALL pixels in slice\n\n");
474 for (Int_t i=0; i<num_of_entries; i++)
479 param->AdjustSectorRow(digarr->GetID(),sector,row);
481 fTransform->Sector2Slice(slice,padrow,sector,row);
482 if(slice != fSlice) continue;
483 if(padrow < NRows[fPatch][0]) continue;
484 if(padrow > NRows[fPatch][1]) break;
487 Int_t time=digarr->CurrentRow();
488 Int_t pad=digarr->CurrentColumn();
489 Short_t signal=digarr->CurrentDigit();
490 if(time < param->GetMaxTBin()-1 && time > 0)
491 if(digarr->GetDigit(time-1,pad) <= param->GetZeroSup()
492 && digarr->GetDigit(time+1,pad) <= param->GetZeroSup())
496 fTransform->Raw2Global(xyz,sector,row,pad,time);
497 eta = fTransform->GetEta(xyz);
499 if(eta < fEtaMin || eta > fEtaMax) continue;
500 fTransform->Global2Local(xyz,sector);
503 //phi = fTransform->GetPhi(xyz);
505 hist->Fill(xyz[0],xyz[1],signal);
507 AliL3Digits *dig = new AliL3Digits;
508 dig->fIndex = digit_counter;
510 dig->fCharge = signal;
514 if(fRowContainer[padrow].first == NULL)
515 fRowContainer[padrow].first = (void*)dig;
517 ((AliL3Digits*)(fRowContainer[padrow].last))->nextRowPixel=dig;
518 fRowContainer[padrow].last = (void*)dig;
520 //thisHit->etaIndex=(Int_t)((thisHit->GetEta()-fEtaMin)/etaSlice + 1);
521 Int_t eta_index = (Int_t)((eta-fEtaMin)/eta_slice);
522 index = eta_index*fNumOfPadRows + padrow;
523 if(index > fContainerBounds || index < 0)
526 //printf("AliL3HoughTransformer::GetPixels : index out of range %d %d eta_index %d padrow %d\n",index,fContainerBounds,eta_index,padrow);
530 if(fVolume[index].first == NULL)
531 fVolume[index].first = (void*)dig;
533 ((AliL3Digits*)(fVolume[index].last))->fNextVolumePixel = dig;
534 fVolume[index].last = (void*)dig;
537 Int_t phi_index = (Int_t)((phi-phi_min)/delta_phi);
538 index = phi_index*fNumOfPadRows + padrow;
539 if(phi_index > fContainerBounds || phi_index < 0)
541 printf("AliL3HoughTransform::GetPixels : index out of range %d\n",phi_index);
545 if(fPhiRowContainer[index].first == NULL)
546 fPhiRowContainer[index].first = (void*)dig;
548 ((AliL3Digits*)(fPhiRowContainer[index].last))->nextPhiRowPixel = dig;
549 fPhiRowContainer[index].last=(void*)dig;
551 }while (digarr->Next());
555 fNDigits = digit_counter;
556 printf("digitcounter %d\n",digit_counter);
557 printf("Allocated %d bytes to pixels\n",digit_counter*sizeof(AliL3Digits));