From: loizides Date: Thu, 5 Sep 2002 11:13:54 +0000 (+0000) Subject: Changes done for new aliroot version. Faster calculation through saving LUT for kappa. X-Git-Url: http://git.uio.no/git/?p=u%2Fmrichter%2FAliRoot.git;a=commitdiff_plain;h=18659a6b1ccaf840474c612e118fce5a7994ac49 Changes done for new aliroot version. Faster calculation through saving LUT for kappa. --- diff --git a/HLT/hough/AliL3HoughTransformerLUT.cxx b/HLT/hough/AliL3HoughTransformerLUT.cxx index 1c218e52369..a0f39a0a68c 100644 --- a/HLT/hough/AliL3HoughTransformerLUT.cxx +++ b/HLT/hough/AliL3HoughTransformerLUT.cxx @@ -47,6 +47,10 @@ AliL3HoughTransformerLUT::AliL3HoughTransformerLUT() : AliL3HoughBaseTransformer fLUTphi0=0; fLUT2sinphi0=0; fLUT2cosphi0=0; + fLUTKappa=0; + + fLastPad=0; + fLastIndex=0; } AliL3HoughTransformerLUT::AliL3HoughTransformerLUT(Int_t slice,Int_t patch,Int_t n_eta_segments) : AliL3HoughBaseTransformer(slice,patch,n_eta_segments) @@ -71,6 +75,10 @@ AliL3HoughTransformerLUT::AliL3HoughTransformerLUT(Int_t slice,Int_t patch,Int_t fLUTphi0=0; fLUT2sinphi0=0; fLUT2cosphi0=0; + fLUTKappa=0; + + fLastPad=0; + fLastIndex=0; Init(slice,patch,n_eta_segments); } @@ -109,10 +117,12 @@ void AliL3HoughTransformerLUT::DeleteHistograms() delete[] fLUT2sinphi0; delete[] fLUT2cosphi0; delete[] fLUTphi0; + delete[] fLUTKappa; fNPhi0=0; fLUTphi0=0; fLUT2sinphi0=0; fLUT2cosphi0=0; + fLUTKappa=0; } if(!fParamSpace){ @@ -229,6 +239,7 @@ void AliL3HoughTransformerLUT::CreateHistograms(Int_t nxbin,Double_t xmin,Double fLUTphi0=new Float_t[fNPhi0]; fLUT2sinphi0=new Float_t[fNPhi0]; fLUT2cosphi0=new Float_t[fNPhi0]; + fLUTKappa=new Float_t[fNPhi0]; Float_t diff=(ymax-ymin)/nybin; Float_t phi0=ymin-0.5*diff; for(Int_t i=0; i=0)&&(rz2>fLUTEta[index])){ + index--; + } } + //cout << start << " - " << index << ": " << rz2 << " " << fLUTEta[index] << endl; return index; } @@ -373,6 +394,13 @@ void AliL3HoughTransformerLUT::TransformCircle() continue; } + Float_t x = CalcX(row); + Float_t x2=x*x; + Float_t y=0,y2=0; + Float_t r2=0; + Float_t R2=0; + fLastPad=-1; + //Loop over the data on this padrow: for(UInt_t j=0; jfNDigit; j++) { @@ -385,14 +413,25 @@ void AliL3HoughTransformerLUT::TransformCircle() UChar_t pad = digPt[j].fPad; UShort_t time = digPt[j].fTime; - Float_t x = CalcX(row); - Float_t y = CalcY(pad,row); + if(fLastPad!=pad){ //only update if necessary + fLastIndex=fNEtas-1; + y = CalcY(pad,row); + y2 = y*y; + r2 = x2 + y2; + R2 = 1. / r2; + for(Int_t b=0; b= fNEtas){ //LOG(AliL3Log::kWarning,"AliL3HoughTransformerLUT::TransformCircle","Histograms")<<"No histograms corresponding to eta index value of "<Fill(kappa,fLUTphi0[b],charge); //cout << kappa << " " << fLUTphi0[b] << " " << charge << endl; diff --git a/HLT/hough/AliL3HoughTransformerLUT.h b/HLT/hough/AliL3HoughTransformerLUT.h index 2861f984498..5f00b2db5a8 100644 --- a/HLT/hough/AliL3HoughTransformerLUT.h +++ b/HLT/hough/AliL3HoughTransformerLUT.h @@ -37,14 +37,18 @@ class AliL3HoughTransformerLUT : public AliL3HoughBaseTransformer { Float_t *fLUTphi0; //! Float_t *fLUT2sinphi0; //! Float_t *fLUT2cosphi0; //! + Float_t *fLUTKappa; //! + Int_t fLastPad; + Int_t fLastIndex; + Float_t CalcRoverZ2(Float_t eta); Float_t CalcEta(Float_t roverz2); Float_t CalcX(Int_t row); Float_t CalcY(Int_t pad, Int_t row); Float_t CalcZ(Int_t time); - Int_t FindIndex(Float_t rz2); + Int_t FindIndex(Float_t rz2, Int_t start=-100); public: @@ -73,7 +77,3 @@ class AliL3HoughTransformerLUT : public AliL3HoughBaseTransformer { }; #endif - - - - diff --git a/HLT/hough/AliL3HoughTransformerVhdl.cxx b/HLT/hough/AliL3HoughTransformerVhdl.cxx index 0aac048497f..de7faf66e3d 100644 --- a/HLT/hough/AliL3HoughTransformerVhdl.cxx +++ b/HLT/hough/AliL3HoughTransformerVhdl.cxx @@ -11,6 +11,7 @@ #include "AliL3Transform.h" #include "AliL3DigitData.h" #include "AliL3HoughTransformerVhdl.h" +#include "AliL3FFloat.h" #if GCCVERSION == 3 using namespace std; @@ -67,6 +68,12 @@ void AliL3HoughTransformerVhdl::CreateHistograms(Int_t nxbin,Double_t xmin,Doubl fSinEpsilon=sin(fEpsilon); fCosEpsilon=cos(fEpsilon); + fNxbin=nxbin; + fXmin=xmin; + fXmax=xmax; + fNybin=nybin; + fYmin=ymin; + fYmax=ymax; // cout << fEpsilon << " - " << (xmax-xmin)/nxbin << endl; } @@ -88,6 +95,7 @@ void AliL3HoughTransformerVhdl::TransformCircle() //which histogram in which the pixel should be transformed, the eta-value is calcluated //and the proper histogram index is found by GetEtaIndex(eta). + AliL3DigitRowData *tempPt = GetDataPointer(); if(!tempPt) { @@ -115,6 +123,14 @@ void AliL3HoughTransformerVhdl::TransformCircle() continue; } + Float_t x = CalcX(row); + Float_t x2=x*x; + Float_t y=0,y2=0; + Float_t r2=0; + Float_t R2=0; + fLastPad=-1; + + //Loop over the data on this padrow: for(UInt_t j=0; jfNDigit; j++) { @@ -127,8 +143,91 @@ void AliL3HoughTransformerVhdl::TransformCircle() UChar_t pad = digPt[j].fPad; UShort_t time = digPt[j].fTime; - Float_t x = CalcX(row); - Float_t y = CalcY(pad,row); + if(fLastPad!=pad){ //only update if necessary + fLastIndex=fNEtas-1; + y = CalcY(pad,row); + y2 = y*y; + r2 = x2 + y2; + R2 = 1. / r2; + for(Int_t b=0; bFill(kappa,phi,charge); + + for(Int_t b=fNPhi0/2+1; bFill(kappa,phi,charge); + } // end positive running values + + phi = fLUTphi0[fNPhi0/2]; + kappa=A*cos(phi)+B*sin(phi); + kappaprime=B*cos(phi)-A*sin(phi); + its=fIts; + lastkappa=kappa; + lastkappaprime=kappaprime; + //hist->Fill(kappa,fLUTphi0[b],charge); + + for(Int_t b=fNPhi0/2-1; b>=0; b--){ + Float_t exact_kappa=R2*(y*fLUT2cosphi0[b]-x*fLUT2sinphi0[b]); + + Float_t phi = fLUTphi0[b]; + + if(its==0) { //initialize or re-adjust values + kappa=A*cos(phi)+B*sin(phi); //equals exact_kappa! + kappaprime=B*cos(phi)-A*sin(phi); + its=fIts; + } else { + //kappa=fCosEpsilon*lastkappa-fSinEpsilon*lastkappaprime; + //kappaprime=fCosEpsilon*lastkappaprime+fSinEpsilon*lastkappa; + kappa=lastkappa-fEpsilon*lastkappaprime; + kappaprime=lastkappaprime+fEpsilon*lastkappa; + its--; + } + + lastkappa=kappa; + lastkappaprime=kappaprime; + + // hist->Fill(kappa,phi,charge); + } + + fLastPad=pad; + } + Float_t z = CalcZ(time); //find eta slice @@ -147,97 +246,7 @@ void AliL3HoughTransformerVhdl::TransformCircle() continue; } - //Fill the histogram along the phirange - Float_t kappa=0; - Float_t kappaprime=0; - Float_t lastkappa=0; - Float_t lastkappaprime=0; - Int_t its=0; - Float_t R2=1/(x*x+y*y); - Float_t A=2*y*R2; - Float_t B=-2*x*R2; - -#if 1 - //starting point - Float_t phi = fLUTphi0[fNPhi0/2]; - kappa=A*cos(phi)+B*sin(phi); - kappaprime=B*cos(phi)-A*sin(phi); - its=fIts; - lastkappa=kappa; - lastkappaprime=kappaprime; - hist->Fill(kappa,phi,charge); - - for(Int_t b=fNPhi0/2+1; bFill(kappa,phi,charge); - } // end positive running values - - phi = fLUTphi0[fNPhi0/2]; - kappa=A*cos(phi)+B*sin(phi); - kappaprime=B*cos(phi)-A*sin(phi); - its=fIts; - lastkappa=kappa; - lastkappaprime=kappaprime; - //hist->Fill(kappa,fLUTphi0[b],charge); - - for(Int_t b=fNPhi0/2-1; b>=0; b--){ - Float_t exact_kappa=R2*(y*fLUT2cosphi0[b]-x*fLUT2sinphi0[b]); - - Float_t phi = fLUTphi0[b]; - - if(its==0) { //initialize or re-adjust values - kappa=A*cos(phi)+B*sin(phi); //equals exact_kappa! - kappaprime=B*cos(phi)-A*sin(phi); - its=fIts; - } else { - //kappa=fCosEpsilon*lastkappa-fSinEpsilon*lastkappaprime; - //kappaprime=fCosEpsilon*lastkappaprime+fSinEpsilon*lastkappa; - kappa=lastkappa-fEpsilon*lastkappaprime; - kappaprime=lastkappaprime+fEpsilon*lastkappa; - its--; - } - - lastkappa=kappa; - lastkappaprime=kappaprime; - - hist->Fill(kappa,phi,charge); - } - -#else for(Int_t b=0; bFill(kappa,fLUTphi0[b],charge); + //hist->Fill(kappa,fLUTphi0[b],charge); //cout << kappa << " " << fLUTphi0[b] << " " << charge << endl; } -#endif /*test*/ - } //Move the data pointer to the next padrow: AliL3MemHandler::UpdateRowPointer(tempPt); @@ -269,6 +272,7 @@ void AliL3HoughTransformerVhdl::TransformCircle() cout <<"Max Error: " << max_error << endl; cout <<"Rel Error average: " << rel_error/counter << endl; #endif + } void AliL3HoughTransformerVhdl::Print() @@ -278,3 +282,57 @@ void AliL3HoughTransformerVhdl::Print() cout << "fEpsilon: " << fEpsilon << endl; cout << "fIts: " << fIts << endl; } + +void AliL3HoughTransformerVhdl::PrintVhdl() +{ + cout << "fSlice := " << GetSlice() << ";" << endl; + cout << "fPatch := " << GetPatch() << ";" << endl; + // cout << "fSector := " << fSector << ";" << endl; + // cout << "fSectorRow := " << fSectorRow << ";" << endl; + // cout << "fMinRow := " << fMinRow << ";" << endl; + // cout << "fMaxRow := " << fMaxRow << ";" << endl; + // cout << "fNRows := " << fNRows << ";" << endl; + // cout << "fNEtas := " << fNEtas << ";" << endl; + // cout << "fNPhi0 := " << fNPhi0 << ";" << endl; + cout << "fZSign := " << fZSign << ";" << endl; + cout << "fZLengthPlusOff := " << fZLengthPlusOff << ";" << endl; + cout << "fPadPitch := " << fPadPitch << ";" << endl; + cout << "fTimeWidth := " << fTimeWidth << ";" << endl; + + if(!fNRows) return; + cout << "fNLUTX :=" << fNRows << ";" << endl; + cout << "fLUTX := ( "; + for(Int_t i=0;i