3 // Author: Constantin Loizides <mailto:loizides@fi.uib.no>
4 //*-- Copyright&Copy CL
6 #include "AliL3StandardIncludes.h"
8 #include "AliL3RootTypes.h"
9 #include "AliL3Logging.h"
10 #include "AliL3MemHandler.h"
11 #include "AliL3Transform.h"
12 #include "AliL3DigitData.h"
13 #include "AliL3HoughTransformerVhdl.h"
19 /** \class AliL3HoughTransformerVhdl
21 //_____________________________________________________________
22 // AliL3HoughTransformerVhdl
24 // Hough transformation class for VHDL comparism.
29 ClassImp(AliL3HoughTransformerVhdl)
32 AliL3HoughTransformerVhdl::AliL3HoughTransformerVhdl()
33 : AliL3HoughTransformerLUT()
42 AliL3HoughTransformerVhdl::AliL3HoughTransformerVhdl(Int_t slice,Int_t patch,Int_t n_eta_segments,Int_t n_its)
43 : AliL3HoughTransformerLUT(slice,patch,n_eta_segments)
51 AliL3HoughTransformerVhdl::~AliL3HoughTransformerVhdl()
56 void AliL3HoughTransformerVhdl::CreateHistograms(Int_t nxbin,Double_t pt_min,Int_t nybin,Double_t phimin,Double_t phimax)
58 AliL3HoughTransformerLUT::CreateHistograms(nxbin,pt_min,nybin,phimin,phimax);
61 void AliL3HoughTransformerVhdl::CreateHistograms(Int_t nxbin,Double_t xmin,Double_t xmax,
62 Int_t nybin,Double_t ymin,Double_t ymax)
64 AliL3HoughTransformerLUT::CreateHistograms(nxbin,xmin,xmax,nybin,ymin,ymax);
66 fEpsilon=(ymax-ymin)/nybin;
67 fSinEpsilon=sin(fEpsilon);
68 fCosEpsilon=cos(fEpsilon);
70 // cout << fEpsilon << " - " << (xmax-xmin)/nxbin << endl;
73 void AliL3HoughTransformerVhdl::Init(Int_t slice,Int_t patch,Int_t n_eta_segments,Int_t n_its)
75 AliL3HoughTransformerLUT::Init(slice,patch,n_eta_segments);
78 void AliL3HoughTransformerVhdl::TransformCircle()
80 //Transform the input data with a circle HT.
81 //The function loops over all the data, and transforms each pixel with the equation:
83 //kappa = lastkappa +- epsilon * lastkappaprime
85 //kappaprime = lastkappaprime -+ epsilon * lastkappa
87 //Each pixel then transforms into a curve in the (kappa,phi0)-space. In order to find
88 //which histogram in which the pixel should be transformed, the eta-value is calcluated
89 //and the proper histogram index is found by GetEtaIndex(eta).
91 AliL3DigitRowData *tempPt = GetDataPointer();
94 LOG(AliL3Log::kError,"AliL3HoughTransformerVhdl::TransformCircle","Data")
95 <<"No input data "<<ENDLOG;
106 //Loop over the padrows:
107 for(Int_t i=fMinRow, row=0; i<=fMaxRow; i++, row++)
109 //Get the data on this padrow:
110 AliL3DigitData *digPt = tempPt->fDigitData;
111 if(i != (Int_t)tempPt->fRow)
113 LOG(AliL3Log::kError,"AliL3HoughTransformerVhdl::TransformCircle","Data")
114 <<"AliL3HoughTransformerLUT::TransformCircle : Mismatching padrow numbering "<<i<<" != "<<(Int_t)tempPt->fRow<<ENDLOG;
118 //Loop over the data on this padrow:
119 for(UInt_t j=0; j<tempPt->fNDigit; j++)
121 UShort_t charge = digPt[j].fCharge;
124 if((Int_t)charge <= GetLowerThreshold() || (Int_t)charge > GetUpperThreshold())
127 UChar_t pad = digPt[j].fPad;
128 UShort_t time = digPt[j].fTime;
130 Float_t x = CalcX(row);
131 Float_t y = CalcY(pad,row);
132 Float_t z = CalcZ(time);
135 Float_t rz2 = 1 + (x*x+y*y)/(z*z);
136 Int_t eta_index = FindIndex(rz2);
138 if(eta_index < 0 || eta_index >= fNEtas){
139 //LOG(AliL3Log::kWarning,"AliL3HoughTransformerVhdl::TransformCircle","Histograms")<<"No histograms corresponding to eta index value of "<<eta_index<<"."<<ENDLOG;
143 //Get the correct histogrampointer:
144 AliL3Histogram *hist = fParamSpace[eta_index];
146 //LOG(AliL3Log::kWarning,"AliL3HoughTransformerVhdl::TransformCircle","Histograms")<<"Error getting histogram in index "<<eta_index<<"."<<ENDLOG;
150 //Fill the histogram along the phirange
152 Float_t kappaprime=0;
154 Float_t lastkappaprime=0;
156 Float_t R2=1/(x*x+y*y);
162 Float_t phi = fLUTphi0[fNPhi0/2];
163 kappa=A*cos(phi)+B*sin(phi);
164 kappaprime=B*cos(phi)-A*sin(phi);
167 lastkappaprime=kappaprime;
168 hist->Fill(kappa,phi,charge);
170 for(Int_t b=fNPhi0/2+1; b<fNPhi0; b++){
171 Float_t exact_kappa=R2*(y*fLUT2cosphi0[b]-x*fLUT2sinphi0[b]);
175 if(its==0) { //initialize or re-adjust values
176 kappa=A*cos(phi)+B*sin(phi); //equals exact_kappa!
177 kappaprime=B*cos(phi)-A*sin(phi);
180 //kappa=fCosEpsilon*lastkappa+fSinEpsilon*lastkappaprime;
181 //kappaprime=fCosEpsilon*lastkappaprime-fSinEpsilon*lastkappa;
182 kappa=lastkappa+fEpsilon*lastkappaprime;
183 kappaprime=lastkappaprime-fEpsilon*lastkappa;
188 lastkappaprime=kappaprime;
190 hist->Fill(kappa,phi,charge);
191 } // end positive running values
193 phi = fLUTphi0[fNPhi0/2];
194 kappa=A*cos(phi)+B*sin(phi);
195 kappaprime=B*cos(phi)-A*sin(phi);
198 lastkappaprime=kappaprime;
199 //hist->Fill(kappa,fLUTphi0[b],charge);
201 for(Int_t b=fNPhi0/2-1; b>=0; b--){
202 Float_t exact_kappa=R2*(y*fLUT2cosphi0[b]-x*fLUT2sinphi0[b]);
204 Float_t phi = fLUTphi0[b];
206 if(its==0) { //initialize or re-adjust values
207 kappa=A*cos(phi)+B*sin(phi); //equals exact_kappa!
208 kappaprime=B*cos(phi)-A*sin(phi);
211 //kappa=fCosEpsilon*lastkappa-fSinEpsilon*lastkappaprime;
212 //kappaprime=fCosEpsilon*lastkappaprime+fSinEpsilon*lastkappa;
213 kappa=lastkappa-fEpsilon*lastkappaprime;
214 kappaprime=lastkappaprime+fEpsilon*lastkappa;
219 lastkappaprime=kappaprime;
221 hist->Fill(kappa,phi,charge);
225 for(Int_t b=0; b<fNPhi0; b++){
226 Float_t exact_kappa=R2*(y*fLUT2cosphi0[b]-x*fLUT2sinphi0[b]);
228 Float_t phi = fLUTphi0[b];
230 if(its==0) { //initialize or re-adjust values
231 kappa=A*cos(phi)+B*sin(phi); //equals exact_kappa!
232 kappaprime=B*cos(phi)-A*sin(phi);
235 //kappa=fCosEpsilon*lastkappa+fSinEpsilon*lastkappaprime;
236 //kappaprime=fCosEpsilon*lastkappaprime-fSinEpsilon*lastkappa;
237 kappa=lastkappa+fEpsilon*lastkappaprime;
238 kappaprime=lastkappaprime-fEpsilon*lastkappa;
243 Float_t err=fabs((exact_kappa-kappa)/exact_kappa);
246 //cout << max_error << " - " << err << " " << kappa << " " << exact_kappa << " " << kappa/exact_kappa<< endl;
255 lastkappaprime=kappaprime;
257 hist->Fill(kappa,fLUTphi0[b],charge);
259 //cout << kappa << " " << fLUTphi0[b] << " " << charge << endl;
264 //Move the data pointer to the next padrow:
265 AliL3MemHandler::UpdateRowPointer(tempPt);
269 cout <<"Max Error: " << max_error << endl;
270 cout <<"Rel Error average: " << rel_error/counter << endl;
274 void AliL3HoughTransformerVhdl::Print()
276 AliL3HoughTransformerLUT::Print();
278 cout << "fEpsilon: " << fEpsilon << endl;
279 cout << "fIts: " << fIts << endl;