]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/hough/AliL3HoughTest.cxx
Merged Bergen, mergen Cvetan TransformerRow and
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughTest.cxx
CommitLineData
3e87ef69 1// @(#) $Id$
7a1f1432 2
3// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>
3e87ef69 4//*-- Copyright &copy ALICE HLT Group
7a1f1432 5
6#include "AliL3StandardIncludes.h"
7#include "AliL3HoughTest.h"
8#include "AliL3ModelTrack.h"
9#include "AliL3Transform.h"
10#include "AliL3Histogram.h"
3e87ef69 11#include "AliL3TrackArray.h"
12#include "AliL3HoughTrack.h"
13
14#include <TRandom.h>
15#include <TMath.h>
16#include <TH2.h>
17#include <TH3.h>
18#include <TAxis.h>
7a1f1432 19
0bd0c1ef 20#if __GNUC__ == 3
7a1f1432 21using namespace std;
22#endif
23
24//_____________________________________________________________
25// AliL3HoughTest
26
27
28ClassImp(AliL3HoughTest)
29
30AliL3HoughTest::AliL3HoughTest()
31{
32 fData=0;
33}
34
35
36AliL3HoughTest::~AliL3HoughTest()
37{
38 if(fData)
39 delete [] fData;
40}
41
c3853fab 42Bool_t AliL3HoughTest::GenerateTrackData(Double_t pt,Double_t psi,Double_t tgl,Int_t sign,Int_t patch,Int_t minhits)
7a1f1432 43{
44 fCurrentPatch=patch;
45 if(fData)
46 delete fData;
47 fData = new SimData[AliL3Transform::GetNRows(patch)];
48 memset(fData,0,AliL3Transform::GetNRows(patch)*sizeof(SimData));
49
50 AliL3ModelTrack *track = new AliL3ModelTrack();
51 track->Init(0,patch);
52 track->SetPt(pt);
53 track->SetPsi(psi);
c3853fab 54 track->SetTgl(tgl);
d7ab65da 55 track->SetCharge(sign);
56 track->SetFirstPoint(0,0,0);
7a1f1432 57 track->CalculateHelix();
7a1f1432 58
59 Int_t temp[200];
62bb4b3d 60 // Int_t temp2[AliL3Transform::GetNTimeBins()];
61 Int_t * temp2 = new Int_t[AliL3Transform::GetNTimeBins()];
7a1f1432 62 Int_t entries=100;
63 Int_t clustercharge=100;
d7ab65da 64 Int_t hitcounter=0;
7a1f1432 65 for(Int_t i=AliL3Transform::GetFirstRow(patch); i<=AliL3Transform::GetLastRow(patch); i++)
66 {
7a1f1432 67
3e87ef69 68 Float_t xyz[3];
7a1f1432 69 if(!track->GetCrossingPoint(i,xyz))
70 continue;
3e87ef69 71
d7ab65da 72 Int_t rowindex = i - AliL3Transform::GetFirstRow(patch);
7a1f1432 73 Int_t sector,row;
74 AliL3Transform::Slice2Sector(0,i,sector,row);
75 AliL3Transform::Local2Raw(xyz,sector,row);
76
c3853fab 77 if(xyz[1] < 0 || xyz[1] >= AliL3Transform::GetNPads(i) || xyz[2] < 0 || xyz[2] >= AliL3Transform::GetNTimeBins())
7a1f1432 78 continue;
d7ab65da 79 hitcounter++;
80 track->SetPadHit(i,xyz[1]);
c3853fab 81 track->SetTimeHit(i,xyz[2]);
3e87ef69 82
83 Double_t beta = track->GetCrossingAngle(i);
84 track->SetCrossingAngleLUT(i,beta);
85 track->CalculateClusterWidths(i);
c3853fab 86
7a1f1432 87 memset(temp,0,200*sizeof(Int_t));
c3853fab 88 memset(temp2,0,AliL3Transform::GetNTimeBins()*sizeof(Int_t));
7a1f1432 89 Double_t xysigma = sqrt(track->GetParSigmaY2(i));
c3853fab 90 Double_t zsigma = sqrt(track->GetParSigmaZ2(i));
3e87ef69 91
7a1f1432 92 Int_t minpad=200,j;
c3853fab 93 Int_t mintime = 1000;
7a1f1432 94 for(j=0; j<entries; j++)
95 {
96 Int_t pad = TMath::Nint(gRandom->Gaus(xyz[1],xysigma));
c3853fab 97 Int_t time = TMath::Nint(gRandom->Gaus(xyz[2],zsigma));
98 if(pad < 0 || pad >= AliL3Transform::GetNPads(i) || time < 0 || time >= AliL3Transform::GetNTimeBins())
7a1f1432 99 continue;
100 temp[pad]++;
c3853fab 101 temp2[time]++;
7a1f1432 102 if(pad < minpad)
103 minpad=pad;
c3853fab 104 if(time < mintime)
105 mintime=time;
7a1f1432 106 }
c3853fab 107 Int_t npads=0;
7a1f1432 108 for(j=0; j<200; j++)
109 {
110 if(temp[j]==0) continue;
c3853fab 111
7a1f1432 112 Int_t index = j - minpad;
c3853fab 113
7a1f1432 114 if(index < 0 || index >= 10)
115 {
116 cerr<<"AliL3HoughTest::GenerateTrackData : Wrong index "<<index<<endl;
117 exit(5);
118 }
c3853fab 119 npads++;
120 Int_t seq_charge = clustercharge*temp[j]/entries;
121 Int_t ntimes=0;
122 for(Int_t k=0; k<AliL3Transform::GetNTimeBins(); k++)
123 {
124 if(temp2[k]==0) continue;
125 Int_t tindex = k - mintime;
126 if(tindex < 0 || tindex >= 10)
127 {
128 cerr<<"AliL3HoughTest::GenerateTrackData : Wrong timeindex "<<tindex<<" "<<k<<" "<<mintime<<endl;
129 exit(5);
130 }
131 Int_t charge = seq_charge*temp2[k]/entries;
132 if(charge < 3 )
133 continue;
134 if(charge > 1023)
135 charge=1023;
136 //cout<<"row "<<i<<" pad "<<j<<" time "<<k<<" charge "<<charge<<endl;
137 ntimes++;
138 fData[rowindex].pads[index][tindex]=charge;
139 }
7a1f1432 140 }
d7ab65da 141 fData[rowindex].minpad=minpad;
c3853fab 142 fData[rowindex].mintime=mintime;
143 fData[rowindex].npads=npads;
7a1f1432 144 }
145 delete track;
62bb4b3d 146 delete [] temp2;
d7ab65da 147 if(hitcounter < minhits)
148 return kFALSE;
149 return kTRUE;
7a1f1432 150}
151
d7ab65da 152void AliL3HoughTest::Transform2Circle(AliL3Histogram *hist)
7a1f1432 153{
154 if(!fData)
155 {
156 cerr<<"AliL3HoughTest::Transform : No data"<<endl;
157 return;
158 }
159 Float_t R,phi,phi0,kappa,xyz[3];
c3853fab 160 Int_t pad,time,charge,sector,row;
7a1f1432 161 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
162 {
d7ab65da 163 Int_t rowindex = i - AliL3Transform::GetFirstRow(fCurrentPatch);
7a1f1432 164 AliL3Transform::Slice2Sector(0,i,sector,row);
d7ab65da 165 for(Int_t j=0; j<fData[rowindex].npads; j++)
7a1f1432 166 {
d7ab65da 167 pad = j + fData[rowindex].minpad;
c3853fab 168 for(Int_t k=0; k<10; k++)
7a1f1432 169 {
c3853fab 170 time = k + fData[rowindex].mintime;
171 charge = fData[rowindex].pads[j][k];
172 if(charge == 0) continue;
173 AliL3Transform::Raw2Local(xyz,sector,row,pad,time);
174
175 R = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]);
176
177 phi = AliL3Transform::GetPhi(xyz);
178
179 for(Int_t k=hist->GetFirstYbin(); k<=hist->GetLastYbin(); k++)
180 {
181 phi0 = hist->GetBinCenterY(k);
182 kappa = 2*sin(phi-phi0)/R;
183 hist->Fill(kappa,phi0,charge);
184 }
7a1f1432 185 }
186 }
187 }
188}
189
d7ab65da 190void AliL3HoughTest::Transform2CircleC(AliL3Histogram *hist)
7a1f1432 191{
192 if(!fData)
193 {
194 cerr<<"AliL3HoughTest::TransformC : No data"<<endl;
195 return;
196 }
c3853fab 197 Int_t pad1,pad2,time1,time2,charge1,charge2,sector,row;
7a1f1432 198 Float_t r1,r2,phi1,phi2,phi_0,kappa,hit[3],hit2[3];
199 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
200 {
d7ab65da 201 Int_t rowindex1 = i - AliL3Transform::GetFirstRow(fCurrentPatch);
202 for(Int_t d1=0; d1<fData[rowindex1].npads; d1++)
7a1f1432 203 {
d7ab65da 204 pad1 = d1 + fData[rowindex1].minpad;
c3853fab 205 for(Int_t j=0; j<10; j++)
7a1f1432 206 {
c3853fab 207 time1 = j + fData[rowindex1].mintime;
208 charge1 = fData[rowindex1].pads[d1][j];
209 if(charge1==0) continue;
210 AliL3Transform::Slice2Sector(0,i,sector,row);
211 AliL3Transform::Raw2Local(hit,sector,row,pad1,time1);
212 r1 = sqrt(hit[0]*hit[0]+hit[1]*hit[1]);
213 phi1 = atan2(hit[1],hit[0]);
214
215 for(Int_t j=i+1; j<=AliL3Transform::GetLastRow(fCurrentPatch); j++)
7a1f1432 216 {
c3853fab 217 Int_t rowindex2 = j - AliL3Transform::GetFirstRow(fCurrentPatch);
218 for(Int_t d2=0; d2<fData[rowindex2].npads; d2++)
219 {
220 pad2 = d2 + fData[rowindex2].minpad;
221 for(Int_t k=0; k<10; k++)
222 {
223 time2 = k + fData[rowindex2].mintime;
224 charge2 = fData[rowindex2].pads[d2][k];
225 if(charge2==0) continue;
226 AliL3Transform::Slice2Sector(0,j,sector,row);
227 AliL3Transform::Raw2Local(hit2,sector,row,pad2,time2);
228 r2 = sqrt(hit2[0]*hit2[0]+hit2[1]*hit2[1]);
229 phi2 = atan2(hit2[1],hit2[0]);
230 phi_0 = atan( (r2*sin(phi1) - r1*sin(phi2)) / (r2*cos(phi1) - r1*cos(phi2)) );
231
232 kappa = 2*sin(phi1-phi_0) / r1;
233 hist->Fill(kappa,phi_0,charge1+charge2);
c3853fab 234 }
235 }
7a1f1432 236 }
3e87ef69 237 return;
7a1f1432 238 }
239 }
240 }
241}
242
3e87ef69 243void AliL3HoughTest::Transform2CircleF(AliL3Histogram *hist)
244{
245 //Fix one point in the middle of the tpc
246
247 if(!fData)
248 {
249 cerr<<"AliL3HoughTest::TransformF : No data"<<endl;
250 return;
251 }
252 Int_t pad1,pad2,time1,time2,charge1,charge2,sector,row;
253 Float_t r1,r2,phi1,phi2,phi_0,kappa,hit[3],hit2[3];
254
255 Int_t rowindex1 = 80 - AliL3Transform::GetFirstRow(fCurrentPatch);
256 for(Int_t d1=1; d1<fData[rowindex1].npads; d1++)
257 {
258 pad1 = d1 + fData[rowindex1].minpad;
259
260 AliL3Transform::Slice2Sector(0,80,sector,row);
261 AliL3Transform::Raw2Local(hit,sector,row,pad1,0);
262 r1 = sqrt(hit[0]*hit[0]+hit[1]*hit[1]);
263 phi1 = atan2(hit[1],hit[0]);
264
265 for(Int_t j=0; j<10; j++)
266 {
267 time1 = j + fData[rowindex1].mintime;
268 charge1 = fData[rowindex1].pads[d1][j];
269 if(charge1==0) continue;
270
271 for(Int_t j=0; j<=AliL3Transform::GetLastRow(fCurrentPatch); j++)
272 {
273 if(j==80) continue;
274 Int_t rowindex2 = j - AliL3Transform::GetFirstRow(fCurrentPatch);
275 for(Int_t d2=0; d2<fData[rowindex2].npads; d2++)
276 {
277 pad2 = d2 + fData[rowindex2].minpad;
278 for(Int_t k=0; k<10; k++)
279 {
280 time2 = k + fData[rowindex2].mintime;
281 charge2 = fData[rowindex2].pads[d2][k];
282 if(charge2==0) continue;
283 AliL3Transform::Slice2Sector(0,j,sector,row);
284 AliL3Transform::Raw2Local(hit2,sector,row,pad2,time2);
285 r2 = sqrt(hit2[0]*hit2[0]+hit2[1]*hit2[1]);
286 phi2 = atan2(hit2[1],hit2[0]);
287 phi_0 = atan( (r2*sin(phi1) - r1*sin(phi2)) / (r2*cos(phi1) - r1*cos(phi2)) );
288
289 kappa = 2*sin(phi1-phi_0) / r1;
290 hist->Fill(kappa,phi_0,charge1+charge2);
291 //cout<<"Filling "<<kappa<<" psi "<<phi_0<<" charge "<<charge1<<endl;
292 }
293 }
294 }
295 }
296 return;
297 }
298}
299
d7ab65da 300void AliL3HoughTest::Transform2Line(AliL3Histogram *hist,Int_t *rowrange)
301{
302 if(!fData)
303 {
304 cerr<<"AliL3HoughTest::Transform2Line : No data"<<endl;
305 return;
306 }
307
c3853fab 308 Int_t pad,time,charge,sector,row;
d7ab65da 309 Float_t hit[3],theta,rho;
3e87ef69 310 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
d7ab65da 311 {
3e87ef69 312 if(i<rowrange[0])
313 continue;
314 if(i>rowrange[1])
315 break;
d7ab65da 316 Int_t rowindex = i - AliL3Transform::GetFirstRow(fCurrentPatch);
317 for(Int_t d=0; d<fData[rowindex].npads; d++)
318 {
319 pad = d + fData[rowindex].minpad;
c3853fab 320 for(Int_t j=0; j<10; j++)
d7ab65da 321 {
c3853fab 322 time = j + fData[rowindex].mintime;
323 charge = fData[rowindex].pads[d][j];
324 if(charge==0) continue;
325 AliL3Transform::Slice2Sector(0,i,sector,row);
326 AliL3Transform::Raw2Local(hit,sector,row,pad,time);
327
328 hit[0] = hit[0] - AliL3Transform::Row2X(rowrange[0]);
329
330 for(Int_t xbin=hist->GetFirstXbin(); xbin<hist->GetLastXbin(); xbin++)
331 {
332 theta = hist->GetBinCenterX(xbin);
333 rho = hit[0]*cos(theta) + hit[1]*sin(theta);
334 hist->Fill(theta,rho,charge);
335 }
d7ab65da 336 }
337 }
338 }
339}
340
341void AliL3HoughTest::Transform2LineC(AliL3Histogram *hist,Int_t *rowrange)
342{
343 if(!fData)
344 {
345 cerr<<"AliL3HoughTest::Transform2Line : No data"<<endl;
346 return;
347 }
348
c3853fab 349 Int_t pad1,pad2,time1,time2,charge1,charge2,sector,row;
d7ab65da 350 Float_t theta,rho,hit[3],hit2[3];
351 for(Int_t i=rowrange[0]; i<=rowrange[1]; i++)
352 {
353 Int_t rowindex1 = i - AliL3Transform::GetFirstRow(fCurrentPatch);
354 for(Int_t d1=0; d1<fData[rowindex1].npads; d1++)
355 {
356 pad1 = d1 + fData[rowindex1].minpad;
c3853fab 357 for(Int_t j=0; j<10; j++)
d7ab65da 358 {
c3853fab 359 time1 = j + fData[rowindex1].mintime;
360 charge1 = fData[rowindex1].pads[d1][j];
361 if(charge1==0) continue;
362 AliL3Transform::Slice2Sector(0,i,sector,row);
363 AliL3Transform::Raw2Local(hit,sector,row,pad1,time1);
364
365 hit[0] = hit[0] - AliL3Transform::Row2X(rowrange[0]);
366
3e87ef69 367 for(Int_t i2=i+1; i2<=rowrange[1]; i2++)
d7ab65da 368 {
3e87ef69 369 Int_t rowindex2 = i2 - AliL3Transform::GetFirstRow(fCurrentPatch);
c3853fab 370 for(Int_t d2=0; d2<fData[rowindex2].npads; d2++)
371 {
372 pad2 = d2 + fData[rowindex2].minpad;
373 for(Int_t k=0; k<10; k++)
374 {
375 time2 = k + fData[rowindex2].mintime;
376 charge2 = fData[rowindex2].pads[d2][k];
377 if(charge2==0) continue;
3e87ef69 378 AliL3Transform::Slice2Sector(0,i2,sector,row);
c3853fab 379 AliL3Transform::Raw2Local(hit2,sector,row,pad2,time2);
380
381 hit2[0] = hit2[0] - AliL3Transform::Row2X(rowrange[0]);
382
383 theta = atan2(hit2[0]-hit[0],hit[1]-hit2[1]);
384 rho = hit[0]*cos(theta)+hit[1]*sin(theta);
385 hist->Fill(theta,rho,charge1+charge2);
386 }
387 }
d7ab65da 388 }
389 }
390 }
391 }
392}
393
3e87ef69 394void AliL3HoughTest::FillImage(TH2 *hist,Int_t displayrow)
7a1f1432 395{
396 if(!fData)
397 {
398 cerr<<"AliL3HoughTest::FillImage : No data to fill"<<endl;
399 return;
400 }
c3853fab 401
7a1f1432 402 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
403 {
d7ab65da 404 Int_t rowindex = i - AliL3Transform::GetFirstRow(fCurrentPatch);
3e87ef69 405 if(displayrow >=0)
406 if(i != displayrow) continue;
c3853fab 407
408 //cout<<"row "<<i<<" npads "<<fData[rowindex].npads<<endl;
d7ab65da 409 for(Int_t j=0; j<fData[rowindex].npads; j++)
7a1f1432 410 {
d7ab65da 411 Int_t pad = j + fData[rowindex].minpad;
c3853fab 412 for(Int_t k=0; k<10; k++)
413 {
414 Int_t time = k + fData[rowindex].mintime;
415 Int_t charge = fData[rowindex].pads[j][k];
416 if(charge==0) continue;
417 //cout<<i<<" "<<pad<<" "<<time<<" "<<charge<<endl;
418 Float_t xyz[3];
419 Int_t sector,row;
420 AliL3Transform::Slice2Sector(0,i,sector,row);
421 AliL3Transform::Raw2Local(xyz,sector,row,pad,time);
3e87ef69 422 if(displayrow>=0)
c3853fab 423 hist->Fill(pad,time,charge);
424 else
425 hist->Fill(xyz[0],xyz[1],charge);
426 }
7a1f1432 427 }
3e87ef69 428 if(displayrow>=0)
c3853fab 429 break;
7a1f1432 430 }
431}
c3853fab 432
3e87ef69 433void AliL3HoughTest::Transform2Line3D(TH3 *hist,Int_t *rowrange,Float_t *phirange)
c3853fab 434{
435 if(!fData)
436 {
437 cerr<<"AliL3HoughTest::Transform2Line : No data"<<endl;
438 return;
439 }
440
441 Int_t pad,time,charge,sector,row;
442 Float_t hit[3],theta,rho,R,delta;
3e87ef69 443 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
c3853fab 444 {
3e87ef69 445
446 if(i<rowrange[0])
447 continue;
448 if(i>rowrange[1])
449 break;
450
c3853fab 451 Int_t rowindex = i - AliL3Transform::GetFirstRow(fCurrentPatch);
452 for(Int_t d=0; d<fData[rowindex].npads; d++)
453 {
454 pad = d + fData[rowindex].minpad;
455 for(Int_t j=0; j<10; j++)
456 {
457 time = j + fData[rowindex].mintime;
458 charge = fData[rowindex].pads[d][j];
459 if(charge==0) continue;
460 AliL3Transform::Slice2Sector(0,i,sector,row);
461 AliL3Transform::Raw2Local(hit,sector,row,pad,time);
462
3e87ef69 463 Float_t phi = AliL3Transform::GetPhi(hit);
464 if(phi < phirange[0] || phi > phirange[1])
465 continue;
466
c3853fab 467 hit[0] = hit[0] - AliL3Transform::Row2X(rowrange[0]);
3e87ef69 468 Float_t x = hit[0] + AliL3Transform::Row2X(rowrange[0]);
469 R = sqrt(x*x + hit[1]*hit[1]);
470 delta = atan(hit[2]/R);
c3853fab 471
472 for(Int_t xbin=hist->GetXaxis()->GetFirst(); xbin<=hist->GetXaxis()->GetLast(); xbin++)
473 {
474 theta = hist->GetXaxis()->GetBinCenter(xbin);
475 rho = hit[0]*cos(theta) + hit[1]*sin(theta);
c3853fab 476 hist->Fill(theta,rho,delta,charge);
477 }
478 }
479 }
480 }
481}
482
483void AliL3HoughTest::Transform2LineC3D(TH3 *hist,Int_t *rowrange)
484{
485 if(!fData)
486 {
487 cerr<<"AliL3HoughTest::Transform2Line : No data"<<endl;
488 return;
489 }
490
491 Int_t pad1,pad2,time1,time2,charge1,charge2,sector,row;
492 Float_t theta,rho,hit[3],hit2[3],R1,R2,delta,delta1,delta2;
3e87ef69 493 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
c3853fab 494 {
3e87ef69 495 if(i<rowrange[0])
496 continue;
497 if(i>rowrange[1])
498 break;
c3853fab 499 Int_t rowindex1 = i - AliL3Transform::GetFirstRow(fCurrentPatch);
500 for(Int_t d1=0; d1<fData[rowindex1].npads; d1++)
501 {
502 pad1 = d1 + fData[rowindex1].minpad;
503 for(Int_t j=0; j<10; j++)
504 {
505 time1 = j + fData[rowindex1].mintime;
506 charge1 = fData[rowindex1].pads[d1][j];
507 if(charge1==0) continue;
508 AliL3Transform::Slice2Sector(0,i,sector,row);
509 AliL3Transform::Raw2Local(hit,sector,row,pad1,time1);
510 R1 = sqrt(hit[0]*hit[0]+hit[1]*hit[1]);
511 delta1 = atan(hit[2]/R1);
512 hit[0] = hit[0] - AliL3Transform::Row2X(rowrange[0]);
513
3e87ef69 514 for(Int_t i2=i+1; i2<=rowrange[1]; i2++)
c3853fab 515 {
3e87ef69 516 Int_t rowindex2 = i2 - AliL3Transform::GetFirstRow(fCurrentPatch);
c3853fab 517 for(Int_t d2=0; d2<fData[rowindex2].npads; d2++)
518 {
519 pad2 = d2 + fData[rowindex2].minpad;
520 for(Int_t k=0; k<10; k++)
521 {
522 time2 = k + fData[rowindex2].mintime;
523 charge2 = fData[rowindex2].pads[d2][k];
524 if(charge2==0) continue;
3e87ef69 525 AliL3Transform::Slice2Sector(0,i2,sector,row);
c3853fab 526 AliL3Transform::Raw2Local(hit2,sector,row,pad2,time2);
527 R2 = sqrt(hit2[0]*hit2[0]+hit2[1]*hit2[1]);
528 delta2 = atan(hit2[2]/R2);
529 delta = (charge1*delta1 + charge2*delta2)/(charge1+charge2);
530 hit2[0] = hit2[0] - AliL3Transform::Row2X(rowrange[0]);
531
532 theta = atan2(hit2[0]-hit[0],hit[1]-hit2[1]);
533 rho = hit[0]*cos(theta)+hit[1]*sin(theta);
534 hist->Fill(theta,rho,delta,charge1+charge2);
535 }
536 }
537 }
538 }
539 }
540 }
541}
3e87ef69 542
543void AliL3HoughTest::TransformLines2Circle(TH3 *hist,AliL3TrackArray *tracks)
544{
545
546 for(Int_t i=0; i<tracks->GetNTracks(); i++)
547 {
548 AliL3HoughTrack *tr = (AliL3HoughTrack*)tracks->GetCheckedTrack(i);
549 if(!tr) continue;
550 Int_t middlerow = (Int_t)(tr->GetFirstRow()+(tr->GetLastRow()-tr->GetFirstRow())/2);
551 Float_t hit[3];
552 tr->GetLineCrossingPoint(middlerow,hit);
553 hit[0] += AliL3Transform::Row2X(tr->GetFirstRow());
554 Float_t R = sqrt(hit[0]*hit[0] + hit[1]*hit[1]);
555 hit[2] = R*tr->GetTgl();
556 Float_t phi = atan2(hit[1],hit[0]);
557 Float_t theta = tr->GetPsiLine() - AliL3Transform::Pi()/2;
558 Float_t psi = 2*phi - theta;
559 Float_t kappa = 2/R*sin(phi-psi);
560 Float_t delta = atan(hit[2]/R);
561 hist->Fill(kappa,psi,delta,tr->GetWeight());
562
563 }
564}
565
566void AliL3HoughTest::Transform2Center(AliL3Histogram *hist)
567{
568 //Choose parameter space to be center of curvature.
569
570 if(!fData)
571 {
572 cerr<<"AliL3HoughTest::TransformC : No data"<<endl;
573 return;
574 }
575 Int_t pad1,pad2,time1,time2,charge1,charge2,sector,row;
576 Float_t r1,r2,phi1,phi2,hit[3],hit2[3];
577 //Float_t phi_0,kappa;
578 for(Int_t i=AliL3Transform::GetFirstRow(fCurrentPatch); i<=AliL3Transform::GetLastRow(fCurrentPatch); i++)
579 {
580 Int_t rowindex1 = i - AliL3Transform::GetFirstRow(fCurrentPatch);
581 for(Int_t d1=0; d1<fData[rowindex1].npads; d1++)
582 {
583 pad1 = d1 + fData[rowindex1].minpad;
584 for(Int_t j=0; j<10; j++)
585 {
586 time1 = j + fData[rowindex1].mintime;
587 charge1 = fData[rowindex1].pads[d1][j];
588 if(charge1==0) continue;
589 AliL3Transform::Slice2Sector(0,i,sector,row);
590 AliL3Transform::Raw2Local(hit,sector,row,pad1,time1);
591 r1 = sqrt(hit[0]*hit[0]+hit[1]*hit[1])/2;
592 phi1 = atan2(hit[1],hit[0]);
593
594 for(Int_t j=i+1; j<=AliL3Transform::GetLastRow(fCurrentPatch); j++)
595 {
596 Int_t rowindex2 = j - AliL3Transform::GetFirstRow(fCurrentPatch);
597 for(Int_t d2=0; d2<fData[rowindex2].npads; d2++)
598 {
599 pad2 = d2 + fData[rowindex2].minpad;
600 for(Int_t k=0; k<10; k++)
601 {
602 time2 = k + fData[rowindex2].mintime;
603 charge2 = fData[rowindex2].pads[d2][k];
604 if(charge2==0) continue;
605 AliL3Transform::Slice2Sector(0,j,sector,row);
606 AliL3Transform::Raw2Local(hit2,sector,row,pad2,time2);
607 r2 = sqrt(hit2[0]*hit2[0]+hit2[1]*hit2[1])/2;
608 phi2 = atan2(hit2[1],hit2[0]);
609 Float_t yc = (r2-(r1/cos(phi1))*cos(phi2))/(sin(phi2)-tan(phi1)*cos(phi2));
610 Float_t xc = r1/cos(phi1) - (r2*tan(phi1)-r1*sin(phi1)*cos(phi2))/(sin(phi2)-tan(phi1)*cos(phi2));
611 hist->Fill(xc,yc,charge1+charge2);
612 }
613 }
614 }
615 }
616 }
617 }
618}
619
620
621void AliL3HoughTest::FindAbsMaxima(TH3 *hist,Int_t zsearch,Float_t &max_x,Float_t &max_y,Float_t &max_z,Int_t &maxvalue)
622{
623
624 TH1 *h1 = hist->Project3D("z");
625
626 TAxis *z = hist->GetZaxis();
627 Float_t zpeak[50];
628 Int_t n=0,i,zbin[50];
629 for(i=z->GetFirst()+1; i<z->GetLast()-1; i++)
630 {
631 int bin1 = h1->GetBin(i-1);
632 int bin2 = h1->GetBin(i);
633 int bin3 = h1->GetBin(i+1);
634 if(h1->GetBinContent(bin2) > h1->GetBinContent(bin1) && h1->GetBinContent(bin2) > h1->GetBinContent(bin3))
635 {
636 zbin[n]=bin2;
637 zpeak[n++]=h1->GetBinCenter(bin2);
638 }
639 }
640
641 Int_t zrange[2] = {z->GetFirst(),z->GetLast()};
642 z->SetRange(zbin[0]-zsearch,zbin[0]+zsearch);
643
644 TH1 *h2 = hist->Project3D("yx");
645 z->SetRange(zrange[0],zrange[1]);
646
647 TAxis *x = h2->GetXaxis();
648 TAxis *y = h2->GetYaxis();
649 maxvalue=0;
650 for(i=0; i<n; i++)
651 {
652 for(Int_t xbin=x->GetFirst(); xbin<=x->GetLast(); xbin++)
653 {
654 Float_t xvalue = x->GetBinCenter(xbin);
655 for(Int_t ybin=y->GetFirst(); ybin<=y->GetLast(); ybin++)
656 {
657 Float_t yvalue = y->GetBinCenter(ybin);
658 Int_t value = (Int_t)h2->GetBinContent(xbin,ybin);
659 if(value > maxvalue)
660 {
661 maxvalue=value;
662 max_x = xvalue;
663 max_y = yvalue;
664 max_z = zpeak[i];
665 }
666 }
667 }
668 }
669
670 delete h1;
671 delete h2;
672}
673