]>
Commit | Line | Data |
---|---|---|
4cafa5fc | 1 | //Author: Anders Strand Vestbo |
99e7186b | 2 | //Last Modified: 14.09.01 |
4cafa5fc | 3 | |
48f3c46f | 4 | #include "AliL3MemHandler.h" |
e26acabd | 5 | #include "AliL3Logging.h" |
99e7186b | 6 | #include "AliL3HoughTransformer.h" |
4de874d1 | 7 | #include "AliL3Defs.h" |
8 | #include "AliL3Transform.h" | |
4cafa5fc | 9 | #include "AliL3DigitData.h" |
99e7186b | 10 | #include "AliL3Histogram.h" |
4de874d1 | 11 | |
12 | ClassImp(AliL3HoughTransformer) | |
13 | ||
14 | AliL3HoughTransformer::AliL3HoughTransformer() | |
15 | { | |
16 | //Default constructor | |
4cafa5fc | 17 | |
4de874d1 | 18 | } |
19 | ||
99e7186b | 20 | AliL3HoughTransformer::AliL3HoughTransformer(Int_t slice,Int_t patch,Int_t n_eta_segments) |
52a2a604 | 21 | { |
52a2a604 | 22 | fSlice = slice; |
23 | fPatch = patch; | |
99e7186b | 24 | fNEtaSegments = n_eta_segments; |
25 | fEtaMin = 0; | |
26 | fEtaMax = fSlice < 18 ? 0.9 : -0.9; | |
27 | fTransform = new AliL3Transform(); | |
28 | fThreshold = 0; | |
48f3c46f | 29 | fNDigitRowData=0; |
30 | fDigitRowData=0; | |
52a2a604 | 31 | } |
32 | ||
4de874d1 | 33 | AliL3HoughTransformer::~AliL3HoughTransformer() |
34 | { | |
4de874d1 | 35 | if(fTransform) |
36 | delete fTransform; | |
99e7186b | 37 | DeleteHistograms(); |
4cafa5fc | 38 | } |
39 | ||
99e7186b | 40 | void AliL3HoughTransformer::DeleteHistograms() |
4cafa5fc | 41 | { |
99e7186b | 42 | if(!fParamSpace) |
43 | return; | |
44 | for(Int_t i=0; i<fNEtaSegments; i++) | |
4fc9a6a4 | 45 | { |
46 | if(!fParamSpace[i]) continue; | |
47 | delete fParamSpace[i]; | |
48 | } | |
99e7186b | 49 | delete [] fParamSpace; |
4cafa5fc | 50 | } |
51 | ||
e26acabd | 52 | void AliL3HoughTransformer::CreateHistograms(Int_t nxbin,Double_t pt_min, |
53 | Int_t nybin,Double_t phimin,Double_t phimax) | |
54 | { | |
55 | //Set the minimum absolute pt value, and phi0 angles given in degrees. | |
56 | ||
57 | Double_t torad = 3.1415/180; | |
58 | Double_t bfact = 0.0029980; | |
59 | Double_t bfield = 0.2; | |
60 | Double_t x = bfact*bfield/pt_min; | |
61 | CreateHistograms(nxbin,-1.*x,x,nybin,phimin*torad,phimax*torad); | |
62 | } | |
63 | ||
99e7186b | 64 | void AliL3HoughTransformer::CreateHistograms(Int_t nxbin,Double_t xmin,Double_t xmax, |
65 | Int_t nybin,Double_t ymin,Double_t ymax) | |
4cafa5fc | 66 | { |
4fc9a6a4 | 67 | |
99e7186b | 68 | fParamSpace = new AliL3Histogram*[fNEtaSegments]; |
4cafa5fc | 69 | |
99e7186b | 70 | Char_t histname[256]; |
71 | for(Int_t i=0; i<fNEtaSegments; i++) | |
4de874d1 | 72 | { |
99e7186b | 73 | sprintf(histname,"paramspace_%d",i); |
74 | fParamSpace[i] = new AliL3Histogram(histname,"",nxbin,xmin,xmax,nybin,ymin,ymax); | |
4de874d1 | 75 | } |
4cafa5fc | 76 | } |
77 | ||
e26acabd | 78 | void AliL3HoughTransformer::Reset() |
79 | { | |
48f3c46f | 80 | //Reset all the histograms |
e26acabd | 81 | |
82 | if(!fParamSpace) | |
83 | { | |
84 | LOG(AliL3Log::kWarning,"AliL3HoughTransformer::Reset","Histograms") | |
85 | <<"No histograms to reset"<<ENDLOG; | |
86 | return; | |
87 | } | |
88 | ||
89 | for(Int_t i=0; i<fNEtaSegments; i++) | |
90 | fParamSpace[i]->Reset(); | |
e26acabd | 91 | } |
92 | ||
99e7186b | 93 | void AliL3HoughTransformer::SetInputData(UInt_t ndigits,AliL3DigitRowData *ptr) |
9f33a1db | 94 | { |
99e7186b | 95 | fNDigitRowData = ndigits; |
96 | fDigitRowData = ptr; | |
4de874d1 | 97 | } |
98 | ||
4fc9a6a4 | 99 | void AliL3HoughTransformer::TransformCircle() |
4de874d1 | 100 | { |
99e7186b | 101 | //Transform the input data with a circle HT. |
102 | ||
52a2a604 | 103 | |
99e7186b | 104 | //Set pointer to the data |
105 | AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fDigitRowData; | |
106 | if(!tempPt || fNDigitRowData==0) | |
4de874d1 | 107 | { |
4fc9a6a4 | 108 | printf("\nAliL3HoughTransformer::TransformCircle : No input data!!!\n\n"); |
99e7186b | 109 | return; |
4de874d1 | 110 | } |
99e7186b | 111 | |
112 | Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments; | |
4cafa5fc | 113 | for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++) |
114 | { | |
99e7186b | 115 | AliL3DigitData *digPt = tempPt->fDigitData; |
116 | if(i != (Int_t)tempPt->fRow) | |
4cafa5fc | 117 | { |
4fc9a6a4 | 118 | printf("AliL3HoughTransform::TransformCircle : Mismatching padrow numbering\n"); |
99e7186b | 119 | continue; |
120 | } | |
121 | for(UInt_t j=0; j<tempPt->fNDigit; j++) | |
122 | { | |
123 | UShort_t charge = digPt[j].fCharge; | |
124 | UChar_t pad = digPt[j].fPad; | |
125 | UShort_t time = digPt[j].fTime; | |
48f3c46f | 126 | if(charge <= fThreshold) |
99e7186b | 127 | continue; |
4cafa5fc | 128 | Int_t sector,row; |
99e7186b | 129 | Float_t xyz[3]; |
4cafa5fc | 130 | fTransform->Slice2Sector(fSlice,i,sector,row); |
99e7186b | 131 | fTransform->Raw2Local(xyz,sector,row,(Int_t)pad,(Int_t)time); |
4fc9a6a4 | 132 | Double_t eta = fTransform->GetEta(xyz); |
48f3c46f | 133 | Int_t eta_index = (Int_t)((eta-fEtaMin)/etaslice); |
99e7186b | 134 | if(eta_index < 0 || eta_index >= fNEtaSegments) |
135 | continue; | |
4cafa5fc | 136 | |
e26acabd | 137 | //Get the correct histogrampointer: |
99e7186b | 138 | AliL3Histogram *hist = fParamSpace[eta_index]; |
139 | if(!hist) | |
4cafa5fc | 140 | { |
4fc9a6a4 | 141 | printf("AliL3HoughTransformer::TransformCircle : Error getting histogram in index %d\n",eta_index); |
99e7186b | 142 | continue; |
4cafa5fc | 143 | } |
4cafa5fc | 144 | |
99e7186b | 145 | //Start transformation |
e26acabd | 146 | Float_t R = sqrt(xyz[0]*xyz[0] + xyz[1]*xyz[1]); // + xyz[2]*xyz[2]); |
99e7186b | 147 | Float_t phi = fTransform->GetPhi(xyz); |
4de874d1 | 148 | |
99e7186b | 149 | //Fill the histogram along the phirange |
150 | for(Int_t b=hist->GetFirstYbin(); b<=hist->GetLastYbin(); b++) | |
4de874d1 | 151 | { |
99e7186b | 152 | Float_t phi0 = hist->GetBinCenterY(b); |
153 | Float_t kappa = 2*sin(phi - phi0)/R; | |
154 | hist->Fill(kappa,phi0,charge); | |
4de874d1 | 155 | } |
4de874d1 | 156 | } |
48f3c46f | 157 | AliL3MemHandler::UpdateRowPointer(tempPt); |
4de874d1 | 158 | } |
4de874d1 | 159 | } |
160 | ||
4fc9a6a4 | 161 | void AliL3HoughTransformer::TransformLine() |
162 | { | |
163 | //Do a line transform on the data. | |
164 | ||
165 | ||
166 | AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fDigitRowData; | |
167 | if(!tempPt || fNDigitRowData==0) | |
168 | { | |
169 | printf("\nAliL3HoughTransformer::TransformLine : No input data!!!\n\n"); | |
170 | return; | |
171 | } | |
172 | ||
173 | Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments; | |
174 | for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++) | |
175 | { | |
176 | AliL3DigitData *digPt = tempPt->fDigitData; | |
177 | if(i != (Int_t)tempPt->fRow) | |
178 | { | |
179 | printf("AliL3HoughTransform::TransformLine : Mismatching padrow numbering\n"); | |
180 | continue; | |
181 | } | |
182 | for(UInt_t j=0; j<tempPt->fNDigit; j++) | |
183 | { | |
184 | UShort_t charge = digPt[j].fCharge; | |
185 | UChar_t pad = digPt[j].fPad; | |
186 | UShort_t time = digPt[j].fTime; | |
187 | if(charge < fThreshold) | |
188 | continue; | |
189 | Int_t sector,row; | |
190 | Float_t xyz[3]; | |
191 | fTransform->Slice2Sector(fSlice,i,sector,row); | |
192 | fTransform->Raw2Local(xyz,sector,row,(Int_t)pad,(Int_t)time); | |
193 | Float_t eta = fTransform->GetEta(xyz); | |
194 | Int_t eta_index = (Int_t)(eta/etaslice); | |
195 | if(eta_index < 0 || eta_index >= fNEtaSegments) | |
196 | continue; | |
197 | ||
198 | //Get the correct histogram: | |
199 | AliL3Histogram *hist = fParamSpace[eta_index]; | |
200 | if(!hist) | |
201 | { | |
202 | printf("AliL3HoughTransformer::TransformLine : Error getting histogram in index %d\n",eta_index); | |
203 | continue; | |
204 | } | |
205 | for(Int_t xbin=hist->GetFirstXbin(); xbin<hist->GetLastXbin(); xbin++) | |
206 | { | |
207 | Double_t theta = hist->GetBinCenterX(xbin); | |
208 | Double_t rho = xyz[0]*cos(theta) + xyz[1]*sin(theta); | |
209 | hist->Fill(theta,rho,charge); | |
210 | } | |
211 | } | |
48f3c46f | 212 | AliL3MemHandler::UpdateRowPointer(tempPt); |
4fc9a6a4 | 213 | } |
214 | ||
215 | } |