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 | |
10 | ClassImp(AliL3HoughTransformer) |
11 | |
12 | AliL3HoughTransformer::AliL3HoughTransformer() |
13 | { |
14 | //Default constructor |
4cafa5fc |
15 | |
4de874d1 |
16 | } |
17 | |
99e7186b |
18 | AliL3HoughTransformer::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 |
30 | AliL3HoughTransformer::~AliL3HoughTransformer() |
31 | { |
4de874d1 |
32 | if(fTransform) |
33 | delete fTransform; |
99e7186b |
34 | DeleteHistograms(); |
4cafa5fc |
35 | } |
36 | |
99e7186b |
37 | void 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 |
46 | void 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 |
60 | void AliL3HoughTransformer::SetInputData(UInt_t ndigits,AliL3DigitRowData *ptr) |
9f33a1db |
61 | { |
99e7186b |
62 | fNDigitRowData = ndigits; |
63 | fDigitRowData = ptr; |
4de874d1 |
64 | } |
65 | |
99e7186b |
66 | AliL3DigitRowData *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 |
76 | void 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 | |