1 //Author: Anders Strand Vestbo
2 //Last Modified: 28.6.01
4 #include "AliL3HoughEval.h"
5 #include "AliL3HoughTransformer.h"
6 #include "AliL3DigitData.h"
7 #include "AliL3HoughTrack.h"
8 #include "AliL3Transform.h"
9 #include "AliL3Histogram.h"
10 #include "AliL3Defs.h"
12 ClassImp(AliL3HoughEval)
14 AliL3HoughEval::AliL3HoughEval()
19 AliL3HoughEval::AliL3HoughEval(AliL3HoughTransformer *transformer)
22 fHoughTransformer = transformer;
23 fTransform = new AliL3Transform();
25 fSlice = fHoughTransformer->GetSlice();
26 fPatch = fHoughTransformer->GetPatch();
27 fNrows = NRows[fPatch][1] - NRows[fPatch][0] + 1;
28 fNEtaSegments = fHoughTransformer->GetNEtaSegments();
29 fEtaMin = fHoughTransformer->GetEtaMin();
30 fEtaMax = fHoughTransformer->GetEtaMax();
31 fRemoveFoundTracks = kFALSE;
37 AliL3HoughEval::~AliL3HoughEval()
42 delete [] fRowPointers;
45 void AliL3HoughEval::GenerateLUT()
47 //Generate a LUT, to limit the access to raw data
49 fRowPointers = new AliL3DigitRowData*[fNrows];
51 AliL3DigitRowData *tempPt = (AliL3DigitRowData*)fHoughTransformer->GetDataPointer();
53 printf("AliL3HoughEval::GenerateLUT : Zero data pointer\n");
55 for(Int_t i=NRows[fPatch][0]; i<=NRows[fPatch][1]; i++)
57 Int_t prow = i - NRows[fPatch][0];
58 fRowPointers[prow] = tempPt;
59 tempPt = fHoughTransformer->UpdateDataPointer(tempPt);
64 Bool_t AliL3HoughEval::LookInsideRoad(AliL3HoughTrack *track,Int_t eta_index,Bool_t remove)
66 //Look at rawdata along the road specified by the track candidates.
67 //If track is good, return true, if not return false.
74 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
75 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
77 Int_t prow = padrow - NRows[fPatch][0];
79 if(!track->GetCrossingPoint(padrow,xyz))
81 printf("AliL3HoughEval::LookInsideRoad : Track does not cross line!!\n");
85 fTransform->Slice2Sector(fSlice,padrow,sector,row);
86 fTransform->Local2Raw(xyz,sector,row);
89 //Get the timebins for this pad
90 AliL3DigitRowData *tempPt = fRowPointers[prow];
93 printf("AliL3HoughEval::LookInsideRoad : Zero data pointer\n");
97 //Look at both sides of the pad:
98 for(Int_t p=(Int_t)xyz[1]-fNumOfPadsToLook; p<=(Int_t)xyz[1]+fNumOfPadsToLook; p++)
100 AliL3DigitData *digPt = tempPt->fDigitData;
101 for(UInt_t j=0; j<tempPt->fNDigit; j++)
103 UChar_t pad = digPt[j].fPad;
104 if(pad < p) continue;
106 UShort_t time = digPt[j].fTime;
107 Double_t eta = fTransform->GetEta(row,pad,time);
108 Int_t pixel_index = (Int_t)(eta/etaslice);
109 if(pixel_index > eta_index) continue;
110 if(pixel_index != eta_index) break;
112 digPt[j].fCharge = 0; //Delete the track from image
125 if(nrow >= fNrows - fNumOfRowsToMiss)//this was a good track
127 track->SetEtaIndex(eta_index);
128 if(fRemoveFoundTracks)
129 LookInsideRoad(track,eta_index,kTRUE);
136 void AliL3HoughEval::DisplayEtaSlice(Int_t eta_index,AliL3Histogram *hist)
138 //Display the current raw data inside the slice
142 printf("AliL3HoughEval::DisplayEtaSlice : No input histogram!\n");
146 Double_t etaslice = (fEtaMax - fEtaMin)/fNEtaSegments;
147 for(Int_t padrow = NRows[fPatch][0]; padrow <= NRows[fPatch][1]; padrow++)
149 Int_t prow = padrow - NRows[fPatch][0];
151 AliL3DigitRowData *tempPt = fRowPointers[prow];
154 printf("AliL3HoughEval::DisplayEtaSlice : Zero data pointer\n");
158 AliL3DigitData *digPt = tempPt->fDigitData;
159 for(UInt_t j=0; j<tempPt->fNDigit; j++)
161 UChar_t pad = digPt[j].fPad;
162 UChar_t charge = digPt[j].fCharge;
163 UShort_t time = digPt[j].fTime;
166 fTransform->Slice2Sector(fSlice,padrow,sector,row);
167 fTransform->Raw2Local(xyz,sector,row,pad,time);
168 Double_t eta = fTransform->GetEta(xyz);
169 Int_t pixel_index = (Int_t)(eta/etaslice);
170 if(pixel_index != eta_index) continue;
171 hist->Fill(xyz[0],xyz[1],charge);