]>
Commit | Line | Data |
---|---|---|
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 |