Cleaning up a lot
[u/mrichter/AliRoot.git] / HLT / hough / AliL3HoughTransformer.cxx
CommitLineData
4cafa5fc 1//Author: Anders Strand Vestbo
99e7186b 2//Last Modified: 14.09.01
4cafa5fc 3
99e7186b 4#include "AliL3HoughTransformer.h"
4de874d1 5#include "AliL3Defs.h"
6#include "AliL3Transform.h"
4cafa5fc 7#include "AliL3DigitData.h"
99e7186b 8#include "AliL3Histogram.h"
4de874d1 9
10ClassImp(AliL3HoughTransformer)
11
12AliL3HoughTransformer::AliL3HoughTransformer()
13{
14 //Default constructor
4cafa5fc 15
4de874d1 16}
17
99e7186b 18AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Int_t n_eta_segments)
52a2a604 19{
52a2a604 20 fSlice = slice;
21 fPatch = patch;
99e7186b 22 fNEtaSegments = n_eta_segments;
23 fEtaMin = 0;
24 fEtaMax = fSlice < 18 ? 0.9 : -0.9;
25 fTransform = new AliL3Transform();
26 fThreshold = 0;
4cafa5fc 27
52a2a604 28}
29
4de874d1 30AliL3HoughTransformer::~AliL3HoughTransformer()
31{
4de874d1 32 if(fTransform)
33 delete fTransform;
99e7186b 34 DeleteHistograms();
4cafa5fc 35}
36
99e7186b 37void AliL3HoughTransformer::DeleteHistograms()
4cafa5fc 38{
99e7186b 39 if(!fParamSpace)
40 return;
41 for(Int_t i=0; i<fNEtaSegments; i++)
42 delete fParamSpace[i];
43 delete [] fParamSpace;
4cafa5fc 44}
45
99e7186b 46void AliL3HoughTransformer::CreateHistograms(Int_t nxbin,Double_t xmin,Double_t xmax,
47 Int_t nybin,Double_t ymin,Double_t ymax)
4cafa5fc 48{
4cafa5fc 49
99e7186b 50 fParamSpace = new AliL3Histogram*[fNEtaSegments];
4cafa5fc 51
99e7186b 52 Char_t histname[256];
53 for(Int_t i=0; i<fNEtaSegments; i++)
4de874d1 54 {
99e7186b 55 sprintf(histname,"paramspace_%d",i);
56 fParamSpace[i] = new AliL3Histogram(histname,"",nxbin,xmin,xmax,nybin,ymin,ymax);
4de874d1 57 }
4cafa5fc 58}
59
99e7186b 60void AliL3HoughTransformer::SetInputData(UInt_t ndigits,AliL3DigitRowData *ptr)
9f33a1db 61{
99e7186b 62 fNDigitRowData = ndigits;
63 fDigitRowData = ptr;
4de874d1 64}
65
99e7186b 66AliL3DigitRowData *AliL3HoughTransformer::UpdateDataPointer(AliL3DigitRowData *tempPt)
4de874d1 67{
99e7186b 68 //Update the data pointer to the next padrow
4de874d1 69
99e7186b 70 Byte_t *tmp = (Byte_t*)tempPt;
71 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
72 tmp += size;
73 return (AliL3DigitRowData*)tmp;
4de874d1 74}
75
99e7186b 76void AliL3HoughTransformer::Transform()
4de874d1 77{
99e7186b 78 //Transform the input data with a circle HT.
79
52a2a604 80
99e7186b 81 //Set pointer to the data
82 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fDigitRowData;
83 if(!tempPt || fNDigitRowData==0)
4de874d1 84 {
99e7186b 85 printf("\nAliL3HoughTransformer::TransformTables : No input data!!!\n\n");
86 return;
4de874d1 87 }
99e7186b 88
89 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
4cafa5fc 90 for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++)
91 {
99e7186b 92 AliL3DigitData *digPt = tempPt->fDigitData;
93 if(i != (Int_t)tempPt->fRow)
4cafa5fc 94 {
99e7186b 95 printf("AliL3HoughTransform::Transform : Mismatching padrow numbering\n");
96 continue;
97 }
98 for(UInt_t j=0; j<tempPt->fNDigit; j++)
99 {
100 UShort_t charge = digPt[j].fCharge;
101 UChar_t pad = digPt[j].fPad;
102 UShort_t time = digPt[j].fTime;
103 if(charge < fThreshold)
104 continue;
4cafa5fc 105 Int_t sector,row;
99e7186b 106 Float_t xyz[3];
4cafa5fc 107 fTransform->Slice2Sector(fSlice,i,sector,row);
99e7186b 108 fTransform->Raw2Local(xyz,sector,row,(Int_t)pad,(Int_t)time);
109 Float_t eta = fTransform->GetEta(xyz);
110 Int_t eta_index = (Int_t)(eta/etaslice);
111 if(eta_index < 0 || eta_index >= fNEtaSegments)
112 continue;
4cafa5fc 113
99e7186b 114 //Get the correct histogram:
115 AliL3Histogram *hist = fParamSpace[eta_index];
116 if(!hist)
4cafa5fc 117 {
99e7186b 118 printf("AliL3HoughTransformer::Transform : Error getting histogram in index %d\n",eta_index);
119 continue;
4cafa5fc 120 }
4cafa5fc 121
99e7186b 122 //Start transformation
123 Float_t R = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1] + xyz[2]*xyz[2]);
124 Float_t phi = fTransform->GetPhi(xyz);
4de874d1 125
99e7186b 126 //Fill the histogram along the phirange
127 for(Int_t b=hist->GetFirstYbin(); b<=hist->GetLastYbin(); b++)
4de874d1 128 {
99e7186b 129 Float_t phi0 = hist->GetBinCenterY(b);
130 Float_t kappa = 2*sin(phi - phi0)/R;
131 hist->Fill(kappa,phi0,charge);
4de874d1 132 }
4de874d1 133 }
99e7186b 134 tempPt = UpdateDataPointer(tempPt);
4de874d1 135 }
4de874d1 136}
137