]> git.uio.no Git - u/mrichter/AliRoot.git/blame - HLT/TPCLib/AliHLTTPCPad.cxx
The ShipDataToFXS methods should be protected, not private, because other classes...
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCPad.cxx
CommitLineData
2a083ac4 1// @(#) $Id$
2
46b33a24 3/**************************************************************************
9be2600f 4 * This file is property of and copyright by the ALICE HLT Project *
5 * ALICE Experiment at CERN, All rights reserved. *
46b33a24 6 * *
9be2600f 7 * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no> *
01f43166 8 * Kenneth Aamodt <Kenneth.aamodt@ift.uib.no> *
9be2600f 9 * for The ALICE HLT Project. *
46b33a24 10 * *
11 * Permission to use, copy, modify and distribute this software and its *
12 * documentation strictly for non-commercial purposes is hereby granted *
13 * without fee, provided that the above copyright notice appears in all *
14 * copies and that both the copyright notice and this permission notice *
15 * appear in the supporting documentation. The authors make no claims *
16 * about the suitability of this software for any purpose. It is *
17 * provided "as is" without express or implied warranty. *
18 **************************************************************************/
19
20/** @file AliHLTTPCPad.cxx
01f43166 21 @author Matthias Richter, Kenneth Aamodt
46b33a24 22 @date
23 @brief Container Class for TPC Pads.
24*/
25
a1dbf058 26// see header file for class documentation
27// or
28// refer to README to build package
29// or
30// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
31
46b33a24 32#if __GNUC__>= 3
33using namespace std;
34#endif
35
36#include <cerrno>
37#include "AliHLTTPCPad.h"
84645eb0 38#include "AliHLTStdIncludes.h"
46b33a24 39
01f43166 40
41//added by kenneth
42#include "AliHLTTPCTransform.h"
43#include "AliHLTTPCClusters.h"
44#include <sys/time.h>
45//------------------------------
46
46b33a24 47/** margin for the base line be re-avaluated */
48#define ALIHLTPAD_BASELINE_MARGIN (2*fAverage)
49
50/** ROOT macro for the implementation of ROOT specific class methods */
51ClassImp(AliHLTTPCPad)
52
53AliHLTTPCPad::AliHLTTPCPad()
54 :
a1dbf058 55 fClusterCandidates(),
56 fUsedClusterCandidates(),
46b33a24 57 fRowNo(-1),
58 fPadNo(-1),
59 fThreshold(0),
60 fAverage(-1),
61 fNofEvents(0),
62 fSum(0),
2a083ac4 63 fCount(0),
64 fTotal(0),
46b33a24 65 fBLMax(-1),
66 fBLMaxBin(-1),
84645eb0 67 fBLMin(-1),
68 fBLMinBin(-1),
46b33a24 69 fFirstBLBin(0),
70 fNofBins(0),
2a083ac4 71 fReadPos(0),
01f43166 72 fpRawData(NULL),
01f43166 73 fDataSignals(NULL),
74 fSignalPositionArray(NULL),
75 fSizeOfSignalPositionArray(0)
46b33a24 76{
2a083ac4 77 // see header file for class documentation
78 // or
79 // refer to README to build package
80 // or
81 // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
01f43166 82 // HLTInfo("Entering default constructor");
83 fDataSignals= new AliHLTTPCSignal_t[AliHLTTPCTransform::GetNTimeBins()];
84 memset( fDataSignals, 0xFF, sizeof(Int_t)*(AliHLTTPCTransform::GetNTimeBins()));
85
86 fSignalPositionArray= new AliHLTTPCSignal_t[AliHLTTPCTransform::GetNTimeBins()];
87 memset( fSignalPositionArray, 0xFF, sizeof(Int_t)*(AliHLTTPCTransform::GetNTimeBins()));
88 fSizeOfSignalPositionArray=0;
46b33a24 89}
90
91AliHLTTPCPad::AliHLTTPCPad(Int_t offset, Int_t nofBins)
92 :
a1dbf058 93 fClusterCandidates(),
94 fUsedClusterCandidates(),
46b33a24 95 fRowNo(-1),
96 fPadNo(-1),
97 fThreshold(0),
98 fAverage(-1),
99 fNofEvents(0),
100 fSum(0),
2a083ac4 101 fCount(0),
102 fTotal(0),
46b33a24 103 fBLMax(-1),
104 fBLMaxBin(-1),
84645eb0 105 fBLMin(-1),
106 fBLMinBin(-1),
46b33a24 107 fFirstBLBin(offset),
108 fNofBins(nofBins),
2a083ac4 109 fReadPos(0),
01f43166 110 fpRawData(NULL),
01f43166 111 fDataSignals(NULL),
112 fSignalPositionArray(NULL),
113 fSizeOfSignalPositionArray(0)
46b33a24 114{
2a083ac4 115 // see header file for class documentation
46b33a24 116}
117
46b33a24 118AliHLTTPCPad::~AliHLTTPCPad()
119{
2a083ac4 120 // see header file for class documentation
46b33a24 121 if (fpRawData) {
122 HLTWarning("event data acquisition not stopped");
123 StopEvent();
124 }
01f43166 125 if (fDataSignals) {
126 AliHLTTPCSignal_t* pData=fDataSignals;
127 fDataSignals=NULL;
128 delete [] pData;
129 }
130 if (fSignalPositionArray) {
131 AliHLTTPCSignal_t* pData=fSignalPositionArray;
132 fSignalPositionArray=NULL;
133 // delete [] pData;
134 }
135
46b33a24 136}
137
138Int_t AliHLTTPCPad::SetID(Int_t rowno, Int_t padno)
139{
2a083ac4 140 // see header file for class documentation
46b33a24 141 fRowNo=rowno;
142 fPadNo=padno;
2a083ac4 143 return 0;
46b33a24 144}
145
146Int_t AliHLTTPCPad::StartEvent()
147{
2a083ac4 148 // see header file for class documentation
46b33a24 149 Int_t iResult=0;
150 if (fpRawData==NULL) {
151 fBLMax=-1;
152 fBLMaxBin=-1;
84645eb0 153 fBLMin=-1;
154 fBLMinBin=-1;
46b33a24 155 fSum=0;
156 fCount=0;
157 fTotal=0;
158 if (fNofBins>0) {
159 fpRawData=new AliHLTTPCSignal_t[fNofBins];
160 if (fpRawData) {
161 for (int i=0; i<fNofBins; i++) fpRawData[i]=-1;
162 } else {
163 HLTError("memory allocation failed");
164 iResult=-ENOMEM;
165 }
166 }
167 } else {
168 HLTWarning("event data acquisition already started");
169 iResult=-EALREADY;
170 }
171 return iResult;
172}
173
174Int_t AliHLTTPCPad::CalculateBaseLine(Int_t reqMinCount)
175{
2a083ac4 176 // see header file for class documentation
46b33a24 177 Int_t iResult=0;
178 AliHLTTPCSignal_t avBackup=fAverage;
84645eb0 179 //HLTDebug("reqMinCount=%d fCount=%d fTotal=%d fSum=%d fBLMax=%d fBLMin=%d", reqMinCount, fCount, fTotal, fSum, fBLMax, fBLMin);
46b33a24 180 if (fCount>=reqMinCount && fCount>=fTotal/2) {
181 fAverage=fCount>0?fSum/fCount:0;
182 if (fAverage>0) {
84645eb0 183 //HLTDebug("average for current event %d (%d - %d)", fAverage, fBLMax, fBLMin);
46b33a24 184 fCount=0;fSum=-1;
185 if (fBLMax>ALIHLTPAD_BASELINE_MARGIN) {
186 // calculate again
21b6a334 187 //HLTDebug("maximum value %d exceeds margin for base line (%d) "
188 // "-> re-evaluate base line", fBLMax, ALIHLTPAD_BASELINE_MARGIN);
46b33a24 189 if (fpRawData) {
190 for (Int_t i=fFirstBLBin; i<fNofBins; i++)
191 if (fpRawData[i]>=0) AddBaseLineValue(i, fpRawData[i]);
192 if (fCount>0 && fCount>=reqMinCount && fCount>=fTotal/2) {
193 fAverage=fSum/fCount;
3cde846d 194 //HLTDebug("new average %d", fAverage);
46b33a24 195 } else {
3cde846d 196// HLTDebug("baseline re-eveluation skipped because of to few "
197// "contributing bins: total=%d, contributing=%d, req=%d"
198// "\ndata might be already zero suppressed"
199// , fTotal, fCount, reqMinCount);
46b33a24 200 iResult=-ENODATA;
201 }
202 fCount=0;fSum=-1;
203 } else {
204 HLTError("missing raw data for base line calculation");
205 iResult=-ENOBUFS;
206 }
207 }
208 if (iResult>=0) {
209 // calculate average for all events
210 fAverage=((avBackup*fNofEvents)+fAverage)/(fNofEvents+1);
84645eb0 211 //HLTDebug("base line average for %d event(s): %d", fNofEvents+1, fAverage);
46b33a24 212 } else {
213 fAverage=avBackup;
214 }
215 } else {
216 fAverage=avBackup;
217 }
218 } else {
3cde846d 219// HLTDebug("baseline calculation skipped because of to few contributing "
220// "bins: total=%d, contributing=%d, required=%d \ndata might be "
221// "already zero suppressed", fTotal, fCount, reqMinCount);
46b33a24 222 }
223
224 return iResult;
225}
226
227Int_t AliHLTTPCPad::StopEvent()
228{
2a083ac4 229 // see header file for class documentation
46b33a24 230 Int_t iResult=0;
231 if (fpRawData) {
232 AliHLTTPCSignal_t* pData=fpRawData;
233 fpRawData=NULL;
234 delete [] pData;
235 fTotal=0;
236 fNofEvents++;
237 Rewind();
238 } else if (fNofBins>0) {
239 HLTError("event data acquisition not started");
240 iResult=-EBADF;
241 }
242 return iResult;
243}
244
245Int_t AliHLTTPCPad::ResetHistory()
246{
2a083ac4 247 // see header file for class documentation
46b33a24 248 Int_t iResult=0;
249 fAverage=-1;
250 fNofEvents=0;
251 return iResult;
252}
253
254Int_t AliHLTTPCPad::SetThreshold(AliHLTTPCSignal_t thresh)
255{
2a083ac4 256 // see header file for class documentation
46b33a24 257 Int_t iResult=0;
258 fThreshold=thresh;
259 return iResult;
260}
261
262Int_t AliHLTTPCPad::AddBaseLineValue(Int_t bin, AliHLTTPCSignal_t value)
263{
2a083ac4 264 // see header file for class documentation
46b33a24 265 Int_t iResult=0;
266 if (bin>=fFirstBLBin) {
267 if (fAverage<0 || value<ALIHLTPAD_BASELINE_MARGIN) {
268 // add to the current sum and count
269 fSum+=value;
270 fCount++;
271 if (fBLMax<value) {
272 // keep the maximum value for later quality control of the base
273 // line calculation
274 fBLMax=value;
275 fBLMaxBin=bin;
276 }
84645eb0 277 if (fBLMin<0 || fBLMin>value) {
278 // keep the minimum value for later quality control of the base
279 // line calculation
280 fBLMin=value;
281 fBLMinBin=bin;
282 }
46b33a24 283 } else {
3cde846d 284// HLTDebug("ignoring value %d (bin %d) for base line calculation "
285// "(current average is %d)",
286// value, bin, fAverage);
46b33a24 287 }
288 }
289 return iResult;
290}
291
292Int_t AliHLTTPCPad::SetRawData(Int_t bin, AliHLTTPCSignal_t value)
293{
2a083ac4 294 // see header file for class documentation
46b33a24 295 Int_t iResult=0;
296 if (fpRawData) {
297 if (bin<fNofBins) {
298 if (value>=0) {
299 if (fpRawData[bin]<0) {
300 AddBaseLineValue(bin, value);
301 fTotal++;
302 } else {
303 // ignore value for average calculation
84645eb0 304 HLTWarning("overriding content of bin %d (%d)", bin, fpRawData[bin]);
46b33a24 305 }
306 fpRawData[bin]=value;
307 } else {
308 HLTWarning("ignoring neg. raw data");
309 }
310 } else {
311 HLTWarning("bin %d out of range (%d)", bin, fNofBins);
312 iResult=-ERANGE;
313 }
314 } else if (fNofBins>0) {
315 HLTError("event cycle not started");
316 iResult=-EBADF;
317 }
318 return iResult;
319}
320
321Int_t AliHLTTPCPad::Next(Int_t bZeroSuppression)
322{
2a083ac4 323 // see header file for class documentation
46b33a24 324 if (fpRawData==NULL) return 0;
325 Int_t iResult=fReadPos<fNofBins;
326 if (iResult>0 && (iResult=(++fReadPos<fNofBins))>0) {
327 if (bZeroSuppression) {
328 while ((iResult=(fReadPos<fNofBins))>0 &&
329 GetCorrectedData(fReadPos)<=0)
330 fReadPos++;
331 }
332 }
333 return iResult;
334}
335
336Int_t AliHLTTPCPad::Rewind(Int_t bZeroSuppression)
337{
2a083ac4 338 // see header file for class documentation
46b33a24 339 fReadPos=(bZeroSuppression>0?0:fFirstBLBin)-1;
340 return Next(bZeroSuppression);
341}
342
343AliHLTTPCSignal_t AliHLTTPCPad::GetRawData(Int_t bin) const
344{
2a083ac4 345 // see header file for class documentation
46b33a24 346 AliHLTTPCSignal_t data=0;
347 if (fpRawData) {
348 if (bin<fNofBins) {
349 data=fpRawData[bin];
350 } else {
351 HLTWarning("requested bin %d out of range (%d)", bin, fNofBins);
352 }
353 } else if (fNofBins>0) {
354 HLTWarning("data only available within event cycle");
355 }
356 return data;
357}
358
359AliHLTTPCSignal_t AliHLTTPCPad::GetCorrectedData(Int_t bin) const
360{
2a083ac4 361 // see header file for class documentation
46b33a24 362 AliHLTTPCSignal_t data=GetRawData(bin)-GetBaseLine(bin);
5235c3e9 363 AliHLTTPCSignal_t prev=0;
364 if (bin>1) prev=GetRawData(bin-1)-GetBaseLine(bin-1);
365 AliHLTTPCSignal_t succ=0;
366 if (bin+1<GetSize()) succ=GetRawData(bin+1)-GetBaseLine(bin+1);
367 if (fThreshold>0) {
368 data-=fThreshold;
369 prev-=fThreshold;
370 succ-=fThreshold;
371 }
372
373 // case 1:
374 // the signal is below the base-line and threshold
46b33a24 375 if (data<0) data=0;
5235c3e9 376
377 //case 2:
378 // the neighboring bins are both below base-line/threshold
379 // a real signal is always more than one bin wide because of the shaper
380 if (prev<=0 && succ<=0) data=0;
381
382 // case 3:
383 // the bin is inside the range of ignored bins
46b33a24 384 if (bin<fFirstBLBin) data=0;
84645eb0 385 //HLTDebug("fReadPos=%d data=%d threshold=%d raw data=%d base line=%d", fReadPos, data, fThreshold, GetRawData(bin), GetBaseLine(bin));
46b33a24 386 return data;
387}
388
389AliHLTTPCSignal_t AliHLTTPCPad::GetBaseLine(Int_t bin) const
390{
2a083ac4 391 // see header file for class documentation
84645eb0 392 AliHLTTPCSignal_t val=0;
393 if (fAverage>0) {
394 // we take the minumum value as the base line if it doesn't differ from
395 // the average to much
84645eb0 396 val=fAverage;
5235c3e9 397#ifdef KEEP_NOISE
2a083ac4 398 const AliHLTTPCSignal_t kMaxDifference=15;
84645eb0 399 if ((fAverage-fBLMin)<=kMaxDifference) val=fBLMin;
400 else val>kMaxDifference?val-=kMaxDifference:0;
5235c3e9 401#endif
84645eb0 402 }
403 if (val<0) {
404 // here we should never get
405 val=0;
406 HLTFatal("wrong base line value");
407 }
408 return val;
46b33a24 409}
410
411AliHLTTPCSignal_t AliHLTTPCPad::GetAverage() const
412{
2a083ac4 413 // see header file for class documentation
46b33a24 414 return fAverage>0?fAverage:0;
415}
416
5235c3e9 417Float_t AliHLTTPCPad::GetOccupancy() const
418{
2a083ac4 419 // see header file for class documentation
5235c3e9 420 Float_t occupancy=0;
421 if (fpRawData && fNofBins>0) {
422 for (Int_t i=fFirstBLBin; i<fNofBins; i++) {
423 if (GetCorrectedData(i)>0) occupancy+=1;
424 }
425 if (fNofBins-fFirstBLBin>0)
426 occupancy/=fNofBins-fFirstBLBin;
427 }
428 return occupancy;
429}
430
431Float_t AliHLTTPCPad::GetAveragedOccupancy() const
432{
2a083ac4 433 // see header file for class documentation
434
5235c3e9 435 // history is not yet implemented
436 return GetOccupancy();
437}
a1dbf058 438void AliHLTTPCPad::PrintRawData()
439{
440 // see header file for class documentation
01f43166 441 for(Int_t bin=0;bin<AliHLTTPCTransform::GetNTimeBins();bin++){
442 if(GetDataSignal(bin)>0)
443 cout<<fRowNo<<"\t"<<fPadNo<<"\t"<<bin<<"\t"<<GetDataSignal(bin)<<endl;;
444 }
445 cout<<"bins: "<<AliHLTTPCTransform::GetNTimeBins()<<endl;
446}
447
a1dbf058 448void AliHLTTPCPad::SetDataToDefault()
449{
450 // see header file for class documentation
01f43166 451 if(fpRawData){
452 memset( fDataSignals, 0xFF, sizeof(Int_t)*(AliHLTTPCTransform::GetNTimeBins()));
453 memset( fSignalPositionArray, 0xFF, sizeof(Int_t)*(AliHLTTPCTransform::GetNTimeBins()));
454 fSizeOfSignalPositionArray=0;
455 }
456}
a1dbf058 457
458void AliHLTTPCPad::SetDataSignal(Int_t bin,Int_t signal)
459{
460 // see header file for class documentation
01f43166 461 fDataSignals[bin]=signal;
462 fSignalPositionArray[fSizeOfSignalPositionArray]=bin;
463 fSizeOfSignalPositionArray++;
464}
a1dbf058 465
466Int_t AliHLTTPCPad::GetDataSignal(Int_t bin) const
467{
468 // see header file for class documentation
01f43166 469 return fDataSignals[bin];
470}
a1dbf058 471
472void AliHLTTPCPad::FindClusterCandidates()
473{
474 // see header file for class documentation
01f43166 475 UInt_t seqcharge=0;
476 UInt_t seqaverage=0;
477 UInt_t seqerror=0;
478 vector<Int_t> tmpPos;
479 vector<Int_t> tmpSig;
480 UInt_t isFalling=0;
481
482 for(Int_t pos=fSizeOfSignalPositionArray-2;pos>=0;pos--){
483
484 if(fSignalPositionArray[pos]==fSignalPositionArray[pos+1]+1){
485 seqcharge+=fDataSignals[fSignalPositionArray[pos+1]];
486 seqaverage += fSignalPositionArray[pos+1]*fDataSignals[fSignalPositionArray[pos+1]];
487 seqerror += fSignalPositionArray[pos+1]*fSignalPositionArray[pos+1]*fDataSignals[fSignalPositionArray[pos+1]];
488
489 tmpPos.push_back(fSignalPositionArray[pos+1]);
490 tmpSig.push_back(fDataSignals[fSignalPositionArray[pos+1]]);
491
492 if(fDataSignals[fSignalPositionArray[pos+1]]>fDataSignals[fSignalPositionArray[pos]]){
493 isFalling=1;
494 }
495 if(fDataSignals[fSignalPositionArray[pos+1]]<fDataSignals[fSignalPositionArray[pos]]&&isFalling){
496 Int_t seqmean=0;
497 seqmean = seqaverage/seqcharge;
498
499 //Calculate mean in pad direction:
500 Int_t padmean = seqcharge*fPadNo;
501 Int_t paderror = fPadNo*padmean;
502 AliHLTTPCClusters candidate;
503 candidate.fTotalCharge = seqcharge;
504 candidate.fPad = padmean;
505 candidate.fPad2 = paderror;
506 candidate.fTime = seqaverage;
507 candidate.fTime2 = seqerror;
508 candidate.fMean = seqmean;
509 candidate.fLastMergedPad = fPadNo;
510 fClusterCandidates.push_back(candidate);
511 fUsedClusterCandidates.push_back(0);
512 isFalling=0;
513 seqcharge=0;
514 seqaverage=0;
515 seqerror=0;
516
517 tmpPos.clear();
518 tmpSig.clear();
519
520 continue;
521 }
522
523 if(pos<1){
524 seqcharge+=fDataSignals[fSignalPositionArray[0]];
525 seqaverage += fSignalPositionArray[0]*fDataSignals[fSignalPositionArray[0]];
526 seqerror += fSignalPositionArray[0]*fSignalPositionArray[0]*fDataSignals[fSignalPositionArray[0]];
527 tmpPos.push_back(fSignalPositionArray[0]);
528 tmpSig.push_back(fDataSignals[fSignalPositionArray[0]]);
529
530 //Calculate mean of sequence:
531 Int_t seqmean=0;
532 seqmean = seqaverage/seqcharge;
533
534 //Calculate mean in pad direction:
535 Int_t padmean = seqcharge*fPadNo;
536 Int_t paderror = fPadNo*padmean;
537 AliHLTTPCClusters candidate;
538 candidate.fTotalCharge = seqcharge;
539 candidate.fPad = padmean;
540 candidate.fPad2 = paderror;
541 candidate.fTime = seqaverage;
542 candidate.fTime2 = seqerror;
543 candidate.fMean = seqmean;
544 candidate.fLastMergedPad = fPadNo;
545 fClusterCandidates.push_back(candidate);
546 fUsedClusterCandidates.push_back(0);
547 isFalling=0;
548 seqcharge=0;
549 seqaverage=0;
550 seqerror=0;
551
552 tmpPos.clear();
553 tmpSig.clear();
554 }
555 }
556 else if(seqcharge>0){
557 seqcharge+=fDataSignals[fSignalPositionArray[pos+1]];
558 seqaverage += fSignalPositionArray[pos+1]*fDataSignals[fSignalPositionArray[pos+1]];
559 seqerror += fSignalPositionArray[pos+1]*fSignalPositionArray[pos+1]*fDataSignals[fSignalPositionArray[pos+1]];
560 tmpPos.push_back(fSignalPositionArray[pos+1]);
561 tmpSig.push_back(fDataSignals[fSignalPositionArray[pos+1]]);
562
563 //Calculate mean of sequence:
564 Int_t seqmean=0;
565 seqmean = seqaverage/seqcharge;
566
567 //Calculate mean in pad direction:
568 Int_t padmean = seqcharge*fPadNo;
569 Int_t paderror = fPadNo*padmean;
570 AliHLTTPCClusters candidate;
571 candidate.fTotalCharge = seqcharge;
572 candidate.fPad = padmean;
573 candidate.fPad2 = paderror;
574 candidate.fTime = seqaverage;
575 candidate.fTime2 = seqerror;
576 candidate.fMean = seqmean;
577 candidate.fLastMergedPad = fPadNo;
578 fClusterCandidates.push_back(candidate);
579 fUsedClusterCandidates.push_back(0);
580 isFalling=0;
581 seqcharge=0;
582 seqaverage=0;
583 seqerror=0;
584
585 tmpPos.clear();
586 tmpSig.clear();
587 }
588 }
589}