]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/AliHLTTPCKryptonClusterFinder.cxx
Compilation on Windows/Cygwin
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCKryptonClusterFinder.cxx
CommitLineData
187229ab 1// $Id$
2/**************************************************************************
3 * This file is property of and copyright by the ALICE HLT Project *
4 * ALICE Experiment at CERN, All rights reserved. *
5 * *
98034d0d 6 * Primary Authors: Kenneth Aamodt <kenneth.aamodt@student.uib.no> *
187229ab 7 * for The ALICE HLT Project. *
8 * *
9 * Permission to use, copy, modify and distribute this software and its *
10 * documentation strictly for non-commercial purposes is hereby granted *
11 * without fee, provided that the above copyright notice appears in all *
12 * copies and that both the copyright notice and this permission notice *
13 * appear in the supporting documentation. The authors make no claims *
14 * about the suitability of this software for any purpose. It is *
15 * provided "as is" without express or implied warranty. *
16 **************************************************************************/
17
18/** @file AliHLTTPCKryptonClusterFinder.cxx
98034d0d 19 @author Kenneth Aamodt, Kalliopi Kanaki
187229ab 20 @date
21 @brief Krypton Cluster Finder for the TPC
22*/
23
24#include "AliHLTTPCDigitReader.h"
187229ab 25#include "AliHLTTPCKryptonClusterFinder.h"
187229ab 26#include "AliHLTTPCTransform.h"
b7625c4d 27#include "TFile.h"
187229ab 28
29#if __GNUC__ >= 3
30using namespace std;
31#endif
32
33ClassImp(AliHLTTPCKryptonClusterFinder)
34
35AliHLTTPCKryptonClusterFinder::AliHLTTPCKryptonClusterFinder()
98034d0d 36 : AliHLTTPCClusterFinder(),
37 fTimebinsInBunch(),
b7625c4d 38 fIndexOfBunchStart(),
39 fHKryptonSpectrumFullPatch(NULL),
40 fHKryptonSpectrumSelection(NULL),
41 fHNumberOfKryptonClusters(NULL),
42 fHNumberOfKryptonClustersSelection(NULL),
43 fHMaxQofKryptonClusterLast1000(NULL),
44 fHMaxQofKryptonClusterSelection(NULL),
45 fStartBinKryptonSpectrum(0),
46 fEndBinKryptonSpectrum(3000),
47 fStartBinMaxQ(0),
48 fEndBinMaxQ(1000),
49 fStartBinNumberOfKryptonClusters(0),
50 fEndBinNumberOfKryptonClusters(1000),
51 fSelectionMinRowNumber(0),
52 fSelectionMaxRowNumber(0),
53 fMaxQOfCluster(0),
54 fMaxQOfClusterBin(0),
55 fNumberOfKryptonClusters(0),
56 fNumberOfKryptonClustersBin(0),
57 fHistogramsInitialized(kFALSE)
187229ab 58{
59 //constructor
60}
61
b7625c4d 62AliHLTTPCKryptonClusterFinder::~AliHLTTPCKryptonClusterFinder(){
63 if(fHKryptonSpectrumFullPatch){
64 delete fHKryptonSpectrumFullPatch;
65 fHKryptonSpectrumFullPatch=NULL;
66 }
67 if(fHKryptonSpectrumSelection){
68 delete fHKryptonSpectrumSelection;
69 fHKryptonSpectrumSelection=NULL;
70 }
71 if(fHNumberOfKryptonClusters){
72 delete fHNumberOfKryptonClusters;
73 fHNumberOfKryptonClusters=NULL;
74 }
75 if(fHMaxQofKryptonClusterLast1000){
76 delete fHMaxQofKryptonClusterLast1000;
77 fHMaxQofKryptonClusterLast1000=NULL;
78 }
79 if(fHMaxQofKryptonClusterSelection){
80 delete fHMaxQofKryptonClusterSelection;
81 fHMaxQofKryptonClusterSelection=NULL;
82 }
83}
84
187229ab 85void AliHLTTPCKryptonClusterFinder::ReBunch(const UInt_t *bunchData , Int_t bunchSize){
86 fTimebinsInBunch.clear();
87 fIndexOfBunchStart.clear();
88 Bool_t newBunch=kTRUE;
89 Int_t currentBunchNumber=-1;
90 for(Int_t i=0;i<bunchSize;i++){
91 if(newBunch){
92 if(bunchData[i]>5){
93 fIndexOfBunchStart.push_back(i);
94 fTimebinsInBunch.push_back(1);
95 currentBunchNumber++;
96 newBunch=kFALSE;
97 }
98 }
99 else{
100 if(bunchData[i]>0){
101 fTimebinsInBunch[currentBunchNumber]++;
102 }
103 else{
104 newBunch=kTRUE;
105 }
106 }
107 }
108}
109
110void AliHLTTPCKryptonClusterFinder::ReadDataUnsorted(void* ptr,unsigned long size)
111{
112 //set input pointer
113 fPtr = (UChar_t*)ptr;
114 fSize = size;
115
116 if(!fVectorInitialized){
117 InitializePadArray();
98034d0d 118 }
187229ab 119
120 fDigitReader->InitBlock(fPtr,fSize,fFirstRow,fLastRow,fCurrentPatch,fCurrentSlice);
121
122 while(fDigitReader->NextChannel()){
123 UInt_t row=fDigitReader->GetRow();
124 UInt_t pad=fDigitReader->GetPad();
125
126 fRowPadVector[row][pad]->ClearCandidates();
127
128 while(fDigitReader->NextBunch()){
129 if(fDigitReader->GetBunchSize()>1){
130 const UInt_t *bunchData= fDigitReader->GetSignals();
131
132 ReBunch(bunchData,fDigitReader->GetBunchSize());
133 Int_t rebunchCount=fIndexOfBunchStart.size();
134
135 for(Int_t r=0;r<rebunchCount;r++){
136 UInt_t time = fDigitReader->GetTime()+fIndexOfBunchStart[r];
137 AliHLTTPCClusters candidate;
138 candidate.fTotalCharge=0;
b7625c4d 139 candidate.fChargeFalling=0;//PS This variable will store teh maximum charge of the candidate, used later. Keep this in mind
187229ab 140 if(fTimebinsInBunch[r]>2){
141 for(Int_t i=0;i<fTimebinsInBunch[r];i++){
142 candidate.fTotalCharge+=bunchData[i + fIndexOfBunchStart[r]];
143 candidate.fTime += time*bunchData[i + fIndexOfBunchStart[r]];
144 candidate.fTime2 += time*time*bunchData[i + fIndexOfBunchStart[r]];
b7625c4d 145 if(bunchData[i + fIndexOfBunchStart[r]]>candidate.fChargeFalling){
146 candidate.fChargeFalling = bunchData[i + fIndexOfBunchStart[r]];
147 }
187229ab 148 time++;
149 }
150 if(candidate.fTotalCharge>0){
151 candidate.fMean=candidate.fTime/candidate.fTotalCharge;
152 candidate.fPad=candidate.fTotalCharge*pad;
153 candidate.fPad2=candidate.fPad*pad;
154 candidate.fLastMergedPad=pad;
155 candidate.fRowNumber=row+fDigitReader->GetRowOffset();
156 }
157 if(candidate.fTotalCharge>10 && candidate.fMean<924){
158 fRowPadVector[row][pad]->AddClusterCandidate(candidate);
159 }
160 }
161 }
162 }
163 }
164 }
165}
166
b7625c4d 167Bool_t AliHLTTPCKryptonClusterFinder::ComparePads(AliHLTTPCPad *nextPad,AliHLTTPCClusters* cluster,Int_t nextPadToRead){
168 //Checking if we have a match on the next pad
169 for(UInt_t candidateNumber=0;candidateNumber<nextPad->fClusterCandidates.size();candidateNumber++){
170 AliHLTTPCClusters *candidate =&nextPad->fClusterCandidates[candidateNumber];
171 if(cluster->fMean-candidate->fMean==1 || candidate->fMean-cluster->fMean==1 || cluster->fMean-candidate->fMean==0){
172 cluster->fMean=candidate->fMean;
173 cluster->fTotalCharge+=candidate->fTotalCharge;
174 cluster->fTime += candidate->fTime;
175 cluster->fTime2 += candidate->fTime2;
176 cluster->fPad+=candidate->fPad;
177 cluster->fPad2=candidate->fPad2;
178 cluster->fLastMergedPad=candidate->fPad;
179
180 if(candidate->fChargeFalling>cluster->fChargeFalling){
181 cluster->fChargeFalling = candidate->fChargeFalling;
182 }
183
184 //setting the matched pad to used
185 nextPad->fUsedClusterCandidates[candidateNumber]=1;
186 nextPadToRead++;
187 if(nextPadToRead<(Int_t)fNumberOfPadsInRow[fRowOfFirstCandidate]){
188 nextPad=fRowPadVector[fRowOfFirstCandidate][nextPadToRead];
189 ComparePads(nextPad,cluster,nextPadToRead);
190 }
191 else{
192 return kFALSE;
193 }
194 }
195 else{
196 return kFALSE;
197 }
198 }
199 return kFALSE;
200}
201
98034d0d 202void AliHLTTPCKryptonClusterFinder::FindRowClusters()
187229ab 203{
204 // see header file for function documentation
205
206 AliHLTTPCClusters* tmpCandidate=NULL;
207 for(UInt_t row=5;row<fNumberOfRows-5;row++){
208 fRowOfFirstCandidate=row;
209 for(UInt_t pad=5;pad<fNumberOfPadsInRow[row]-1-5;pad++){
210 AliHLTTPCPad *tmpPad=fRowPadVector[row][pad];
211 for(size_t candidate=0;candidate<tmpPad->fClusterCandidates.size();candidate++){
212 if(tmpPad->fUsedClusterCandidates[candidate]){
213 continue;
214 }
215 if((Int_t)tmpPad->fClusterCandidates[candidate].fMean<100 || (Int_t)tmpPad->fClusterCandidates[candidate].fMean>AliHLTTPCTransform::GetNTimeBins()-100){
216 continue;
217 }
218 tmpCandidate=&tmpPad->fClusterCandidates[candidate];
219 UInt_t tmpTotalCharge=tmpCandidate->fTotalCharge;
b7625c4d 220
187229ab 221 ComparePads(fRowPadVector[row][pad+1],tmpCandidate,pad+1);
222 if(tmpCandidate->fTotalCharge>tmpTotalCharge){
223 //we have a cluster
224 tmpCandidate->fPad=tmpCandidate->fPad/tmpCandidate->fTotalCharge;
225 fClusters.push_back(*tmpCandidate);
226 }
227 }
228 }
229 }
230
231 HLTDebug("Found %d normal clusters.",fClusters.size());
232}
233
234void AliHLTTPCKryptonClusterFinder::FindKryptonClusters()
235{
236 if(fClusters.size()<2){
237 return;
238 }
239
240 for(UInt_t i=0; i<fClusters.size();i++){
241 AliHLTTPCClusters * tmpCluster=&fClusters[i];
242 if(tmpCluster->fFlags==99){//quickfix to check if a cluster is used already
243 continue;
244 }
b7625c4d 245 if((Int_t)tmpCluster->fChargeFalling>fMaxQOfCluster){
246 fMaxQOfCluster = tmpCluster->fChargeFalling;
247 }
187229ab 248
249 //adds "normal" clusters belonging to the krypton cluster
250 for(UInt_t j=i+1;j<fClusters.size();j++){
251 AliHLTTPCClusters * nextCluster=&fClusters[j];
252
253 if(nextCluster->fFlags==99){//quickfix to check if a cluster is used already
254 continue;
255 }
256
257 if(tmpCluster->fRowNumber==nextCluster->fRowNumber-1){//Checks if the row numbers are ok (next to eachother)
187229ab 258 if(abs((Int_t)(tmpCluster->fPad) - (Int_t)(nextCluster->fPad))<3){ // checks if the pad numbers are ok
259 if(abs((Int_t)tmpCluster->fMean-(Int_t)nextCluster->fMean)<2){
260 tmpCluster->fMean=nextCluster->fMean;
261 tmpCluster->fTotalCharge+=nextCluster->fTotalCharge;
262 tmpCluster->fPad=nextCluster->fPad;
b7625c4d 263
264 if((Int_t)nextCluster->fChargeFalling>fMaxQOfCluster){
265 fMaxQOfCluster = nextCluster->fChargeFalling;
266 }
267
187229ab 268 if(tmpCluster->fFlags!=99){//means that this is the first time normal clusters match
b7625c4d 269 CheckForCandidateOnPreviousRow(tmpCluster);
187229ab 270 }
271 tmpCluster->fRowNumber=nextCluster->fRowNumber;
272 nextCluster->fFlags=99;
273 tmpCluster->fFlags=99;
274 if(j!=fClusters.size()-1){
275 continue;
276 }
277
278 }
279 }
280 }
281
282 if(tmpCluster->fFlags==99){
283 //adds a clustercandidate on next row if present TODO
284 /* if(tmpCluster->fFlags==99){
285 for(Int_t p=-1;p<2;p++){
286 AliHLTTPCPad *padAfter=fRowPadVector[tmpCluster->fRowNumber+1][tmpCluster->fPad+p];
287 for(UInt_t c=0;c<padAfter->fClusterCandidates.size();c++)
288 if(abs((Int_t)tmpCluster->fMean - (Int_t)padAfter->fClusterCandidates[c].fMean)<2){
289 tmpCluster->fTotalCharge+=padAfter->fClusterCandidates[c].fTotalCharge;
290 }
291 }//end add clustercandidate if present
292 }*/
b7625c4d 293 fHMaxQofKryptonClusterLast1000->Fill(fMaxQOfClusterBin,fMaxQOfCluster);
294 fMaxQOfClusterBin++;
295 if(fMaxQOfClusterBin>fEndBinMaxQ){
296 fMaxQOfClusterBin=0;
297 }
298 fHKryptonSpectrumFullPatch->Fill(tmpCluster->fTotalCharge);
299 fHNumberOfKryptonClusters->Fill(fNumberOfKryptonClustersBin);
300 if(fNumberOfKryptonClustersBin>fEndBinNumberOfKryptonClusters){
301 fNumberOfKryptonClustersBin=0;
302 }
303 /*
304 fHKryptonSpectrumSelection
305 fHNumberOfKryptonClustersSelection
306 fHMaxQofKryptonClusterSelection
307 */
187229ab 308 HLTInfo("Krypton cluster found, charge: %d in patch number: %d",tmpCluster->fTotalCharge,fCurrentPatch);
309 break;
310 }
311
312
313 }
314 }//end add "normal" clusters belonging to the krypton cluster
b7625c4d 315 fNumberOfKryptonClustersBin++;
187229ab 316}
317
b7625c4d 318void AliHLTTPCKryptonClusterFinder::CheckForCandidateOnPreviousRow(AliHLTTPCClusters *tmpCluster){
187229ab 319 if(tmpCluster->fRowNumber>1){
320 for(Int_t p=-1;p<2;p++){
321 if(tmpCluster->fPad+p>0 && tmpCluster->fPad+p<fNumberOfPadsInRow[tmpCluster->fRowNumber-1]){
322 AliHLTTPCPad *prevPad=fRowPadVector[tmpCluster->fRowNumber-1-AliHLTTPCTransform::GetFirstRow(fCurrentPatch)][tmpCluster->fPad+p];
323 for(UInt_t i=0;i<prevPad->fClusterCandidates.size();i++){
324 if(abs((Int_t)prevPad->fClusterCandidates[i].fMean - (Int_t)tmpCluster->fMean)<2 && prevPad->fUsedClusterCandidates[i]==0){
325 tmpCluster->fTotalCharge += prevPad->fClusterCandidates[i].fTotalCharge;
326 }
327 }
328 }
329 }
330 }
331}
b7625c4d 332
333void AliHLTTPCKryptonClusterFinder::InitializeHistograms(){
334
335
336 if(fHistogramsInitialized){
337 return;
338 }
339
340 TString sliceStr("-Slice_");
341 sliceStr+=fCurrentSlice;
342 TString patchStr("-Patch_");
343 patchStr+=fCurrentPatch;
344
345 TString namefKryptonSpectrumFullPatch("KryptonSpectrumFullPatch"+sliceStr+patchStr);
346 TString namefKryptonSpectrumSelection = "KryptonSpectrumSelection"+sliceStr+patchStr;
347 TString namefNumberOfKryptonClusters = "NumberOfKryptonClusters"+sliceStr+patchStr;
348 TString namefNumberOfKryptonClustersSelection = "NumberOfKryptonClustersSelection"+sliceStr+patchStr;
349 TString namefMaxQLast1000 = "MaxQ"+sliceStr+patchStr;
350 TString namefMaxQSelection = "MaxQSelection"+sliceStr+patchStr;
351
352 fHKryptonSpectrumFullPatch = new TH1F(namefKryptonSpectrumFullPatch,namefKryptonSpectrumFullPatch,fEndBinKryptonSpectrum-fStartBinKryptonSpectrum,fStartBinKryptonSpectrum,fEndBinKryptonSpectrum);
353
354 fHKryptonSpectrumSelection = new TH1F(namefKryptonSpectrumSelection,namefKryptonSpectrumSelection,fEndBinKryptonSpectrum-fStartBinKryptonSpectrum,fStartBinKryptonSpectrum,fEndBinKryptonSpectrum);
355
356 fHNumberOfKryptonClusters = new TH1F(namefNumberOfKryptonClusters,namefNumberOfKryptonClusters,fEndBinNumberOfKryptonClusters-fStartBinNumberOfKryptonClusters,fStartBinNumberOfKryptonClusters,fEndBinNumberOfKryptonClusters);
357
358 fHNumberOfKryptonClustersSelection = new TH1F(namefNumberOfKryptonClustersSelection,namefNumberOfKryptonClustersSelection,fEndBinNumberOfKryptonClusters-fStartBinNumberOfKryptonClusters,fStartBinNumberOfKryptonClusters,fEndBinNumberOfKryptonClusters);
359
360 fHMaxQofKryptonClusterLast1000 = new TH1F(namefMaxQLast1000,namefMaxQLast1000,fEndBinMaxQ-fStartBinMaxQ,fStartBinMaxQ,fEndBinMaxQ);
361
362 fHMaxQofKryptonClusterSelection = new TH1F(namefMaxQSelection,namefMaxQSelection,fEndBinMaxQ-fStartBinMaxQ,fStartBinMaxQ,fEndBinMaxQ);
363
364 fHistogramsInitialized=kTRUE;
365}
366
367void AliHLTTPCKryptonClusterFinder::ResetHistograms(TString histoName){
368
369 if (histoName.CompareTo("KryptonSpectrumFullPatch")==0){
370 fHKryptonSpectrumFullPatch->Reset();
371 }
372 if (histoName.CompareTo("KryptonSpectrumSelection")==0){
373 fHKryptonSpectrumSelection->Reset();
374 }
375 if (histoName.CompareTo("NumberOfKryptonClusters")==0){
376 fHNumberOfKryptonClusters->Reset();
377 }
378 if (histoName.CompareTo("NumberOfKryptonClustersSelection")==0){
379 fHNumberOfKryptonClustersSelection->Reset();
380 }
381 if (histoName.CompareTo("MaxQ")==0){
382 fHMaxQofKryptonClusterLast1000->Reset();
383 }
384 if (histoName.CompareTo("MaxQSelection")==0){
385 fHMaxQofKryptonClusterSelection->Reset();
386 }
387 if (histoName.CompareTo("All")==0){
388 fHKryptonSpectrumFullPatch->Reset();
389 fHKryptonSpectrumSelection->Reset();
390 fHNumberOfKryptonClusters->Reset();
391 fHNumberOfKryptonClustersSelection->Reset();
392 fHMaxQofKryptonClusterLast1000->Reset();
393 fHMaxQofKryptonClusterSelection->Reset();
394 }
395}
396
397void AliHLTTPCKryptonClusterFinder::SetSelection(Int_t minRow, Int_t maxRow){
398 fSelectionMinRowNumber=minRow;
399 fSelectionMaxRowNumber=maxRow;
400}
401
402void AliHLTTPCKryptonClusterFinder::GetHistogramObjectArray(TObjArray & histos){
403 // TObjArray histos;
404 histos.Add(fHKryptonSpectrumFullPatch);
405 histos.Add(fHKryptonSpectrumSelection);
406 histos.Add(fHNumberOfKryptonClusters);
407 histos.Add(fHNumberOfKryptonClustersSelection);
408 histos.Add(fHMaxQofKryptonClusterLast1000);
409 histos.Add(fHMaxQofKryptonClusterSelection);
410 // return histos;
411}
412
413void AliHLTTPCKryptonClusterFinder::WriteHistograms(TString filename){
414
415 TFile file(filename,"recreate");
416 fHKryptonSpectrumFullPatch->Write();
417 fHKryptonSpectrumSelection->Write();
418 fHNumberOfKryptonClusters->Write();
419 fHNumberOfKryptonClustersSelection->Write();
420 fHMaxQofKryptonClusterLast1000->Write();
421 fHMaxQofKryptonClusterSelection->Write();
422 file.Close();
423}