1 //Author: Anders Strand Vestbo
2 //Last Modified: 14.09.01
4 #include "AliL3HoughTransformer.h"
6 #include "AliL3Transform.h"
7 #include "AliL3DigitData.h"
8 #include "AliL3Histogram.h"
10 ClassImp(AliL3HoughTransformer)
12 AliL3HoughTransformer::AliL3HoughTransformer()
18 AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Int_t n_eta_segments)
22 fNEtaSegments = n_eta_segments;
24 fEtaMax = fSlice < 18 ? 0.9 : -0.9;
25 fTransform = new AliL3Transform();
30 AliL3HoughTransformer::~AliL3HoughTransformer()
37 void AliL3HoughTransformer::DeleteHistograms()
41 for(Int_t i=0; i<fNEtaSegments; i++)
42 delete fParamSpace[i];
43 delete [] fParamSpace;
46 void AliL3HoughTransformer::CreateHistograms(Int_t nxbin,Double_t xmin,Double_t xmax,
47 Int_t nybin,Double_t ymin,Double_t ymax)
50 fParamSpace = new AliL3Histogram*[fNEtaSegments];
53 for(Int_t i=0; i<fNEtaSegments; i++)
55 sprintf(histname,"paramspace_%d",i);
56 fParamSpace[i] = new AliL3Histogram(histname,"",nxbin,xmin,xmax,nybin,ymin,ymax);
60 void AliL3HoughTransformer::SetInputData(UInt_t ndigits,AliL3DigitRowData *ptr)
62 fNDigitRowData = ndigits;
66 AliL3DigitRowData *AliL3HoughTransformer::UpdateDataPointer(AliL3DigitRowData *tempPt)
68 //Update the data pointer to the next padrow
70 Byte_t *tmp = (Byte_t*)tempPt;
71 Int_t size = sizeof(AliL3DigitRowData) + tempPt->fNDigit*sizeof(AliL3DigitData);
73 return (AliL3DigitRowData*)tmp;
76 void AliL3HoughTransformer::Transform()
78 //Transform the input data with a circle HT.
81 //Set pointer to the data
82 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fDigitRowData;
83 if(!tempPt || fNDigitRowData==0)
85 printf("\nAliL3HoughTransformer::TransformTables : No input data!!!\n\n");
89 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
90 for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++)
92 AliL3DigitData *digPt = tempPt->fDigitData;
93 if(i != (Int_t)tempPt->fRow)
95 printf("AliL3HoughTransform::Transform : Mismatching padrow numbering\n");
98 for(UInt_t j=0; j<tempPt->fNDigit; j++)
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)
107 fTransform->Slice2Sector(fSlice,i,sector,row);
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)
114 //Get the correct histogram:
115 AliL3Histogram *hist = fParamSpace[eta_index];
118 printf("AliL3HoughTransformer::Transform : Error getting histogram in index %d\n",eta_index);
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);
126 //Fill the histogram along the phirange
127 for(Int_t b=hist->GetFirstYbin(); b<=hist->GetLastYbin(); b++)
129 Float_t phi0 = hist->GetBinCenterY(b);
130 Float_t kappa = 2*sin(phi - phi0)/R;
131 hist->Fill(kappa,phi0,charge);
134 tempPt = UpdateDataPointer(tempPt);