- added TPCLib to doxygen docu, code corrections according to documentation and effC++
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCClusterFinder.cxx
index 6ceb418..1620364 100644 (file)
@@ -1,12 +1,30 @@
 // @(#) $Id$
 // Original: AliL3ClustFinderNew.cxx,v 1.29 2005/06/14 10:55:21 cvetan Exp 
 
-// Author: Anders Vestbo <mailto:vestbo@fi.uib.no>, 
-//         Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>
-//         Jochen Thaeder <mailto:thaeder@kip.uni-heidelberg.de>
-
-//*-- Copyright &copy ALICE HLT Group
-
+/**************************************************************************
+ * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ *                                                                        *
+ * Authors: Anders Vestbo <mailto:vestbo@fi.uib.no>,                     *
+ *          Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>    *
+ *          Jochen Thaeder <mailto:thaeder@kip.uni-heidelberg.de>         *
+ *          for The ALICE Off-line Project.                               *
+ *                                                                        *
+ * Permission to use, copy, modify and distribute this software and its   *
+ * documentation strictly for non-commercial purposes is hereby granted   *
+ * without fee, provided that the above copyright notice appears in all   *
+ * copies and that both the copyright notice and this permission notice   *
+ * appear in the supporting documentation. The authors make no claims     *
+ * about the suitability of this software for any purpose. It is          *
+ * provided "as is" without express or implied warranty.                  *
+ **************************************************************************/
+
+/** @file   AliHLTTPCClusterFinder.cxx
+    @author Anders Vestbo <mailto:vestbo@fi.uib.no>,                
+           Constantin Loizides <mailto:loizides@ikf.uni-frankfurt.de>
+           Jochen Thaeder <mailto:thaeder@kip.uni-heidelberg.de>     
+    @date   
+    @brief  Cluster Finder for the TPC
+*/
 
 #include "AliHLTTPCDigitReader.h"
 #include "AliHLTTPCRootTypes.h"
@@ -99,6 +117,8 @@ AliHLTTPCClusterFinder::AliHLTTPCClusterFinder()
   :
   fMatch(1),
   fThreshold(10),
+  fSignalThreshold(-1),
+  fOccupancyLimit(1.0),
   fXYErr(0.2),
   fZErr(0.3),
   fDeconvPad(kTRUE),
@@ -117,6 +137,8 @@ AliHLTTPCClusterFinder::AliHLTTPCClusterFinder(const AliHLTTPCClusterFinder& src
   :
   fMatch(src.fMatch),
   fThreshold(src.fThreshold),
+  fSignalThreshold(src.fSignalThreshold),
+  fOccupancyLimit(src.fOccupancyLimit),
   fXYErr(src.fXYErr),
   fZErr(src.fZErr),
   fDeconvPad(src.fDeconvPad),
@@ -134,6 +156,8 @@ AliHLTTPCClusterFinder& AliHLTTPCClusterFinder::operator=(const AliHLTTPCCluster
 {
   fMatch=src.fMatch;
   fThreshold=src.fThreshold;
+  fSignalThreshold=src.fSignalThreshold;
+  fOccupancyLimit=src.fOccupancyLimit;
   fXYErr=src.fXYErr;
   fZErr=src.fZErr;
   fDeconvPad=src.fDeconvPad;
@@ -201,7 +225,10 @@ void AliHLTTPCClusterFinder::ProcessDigits()
   fDigitReader->InitBlock(fPtr,fSize,fFirstRow,fLastRow,fCurrentPatch,fCurrentSlice);
   readValue = fDigitReader->Next();
 
-  if (!readValue)return;
+  // Matthias 08.11.2006 the following return would cause termination without writing the
+  // ClusterData and thus would block the component. I just wnt to have the commented line
+  // here for information
+  //if (!readValue)return;
 
   pad = fDigitReader->GetPad();
   time = fDigitReader->GetTime();
@@ -213,9 +240,11 @@ void AliHLTTPCClusterFinder::ProcessDigits()
   fCurrentRow += rowOffset;
 
   UInt_t lastpad = 123456789;
-  AliClusterData *pad1[5000]; //2 lists for internal memory=2pads
-  AliClusterData *pad2[5000]; //2 lists for internal memory=2pads
-  AliClusterData clusterlist[10000]; //Clusterlist
+  const Int_t kPadArraySize=5000;
+  const Int_t kClusterListSize=10000;
+  AliClusterData *pad1[kPadArraySize]; //2 lists for internal memory=2pads
+  AliClusterData *pad2[kPadArraySize]; //2 lists for internal memory=2pads
+  AliClusterData clusterlist[kClusterListSize]; //Clusterlist
 
   AliClusterData **currentPt;  //List of pointers to the current pad
   AliClusterData **previousPt; //List of pointers to the previous pad
@@ -233,7 +262,11 @@ void AliHLTTPCClusterFinder::ProcessDigits()
   Int_t gatingGridOffset=50;
   AliHLTTPCPad baseline(gatingGridOffset, AliHLTTPCTransform::GetNTimeBins());
   // just to make later conversion to a list of objects easier
-  AliHLTTPCPad* pCurrentPad=&baseline;
+  AliHLTTPCPad* pCurrentPad=NULL;
+  if (fSignalThreshold>=0) {
+    pCurrentPad=&baseline;
+    baseline.SetThreshold(fSignalThreshold);
+  }
 
   while ( readValue ){   // Reads through all digits in block
 
@@ -292,7 +325,7 @@ void AliHLTTPCClusterFinder::ProcessDigits()
          }
          pCurrentPad->CalculateBaseLine(AliHLTTPCTransform::GetNTimeBins()/2);
          if (pCurrentPad->Next(kTRUE/*do zero suppression*/)==0) {
-           HLTDebug("no data available after zero suppression");
+           //HLTDebug("no data available after zero suppression");
            pCurrentPad->StopEvent();
            pCurrentPad->ResetHistory();
            break;
@@ -306,9 +339,16 @@ void AliHLTTPCClusterFinder::ProcessDigits()
       }
 
       if (pCurrentPad) {
-       charge = pCurrentPad->GetCorrectedData();
+       Float_t occupancy=pCurrentPad->GetOccupancy();
+       //HLTDebug("pad %d occupancy level: %f", pCurrentPad->GetPadNumber(), occupancy);
+       if ( occupancy < fOccupancyLimit ) {
+         charge = pCurrentPad->GetCorrectedData();
+       } else {
+         charge = 0;
+         //HLTDebug("ignoring pad %d with occupancy level %f", pCurrentPad->GetPadNumber(), occupancy);
+       }
       } else {
-      charge = fDigitReader->GetSignal();
+       charge = fDigitReader->GetSignal();
       }
       //HLTDebug("get next charge value: position %d charge %d", time, charge);
 
@@ -403,7 +443,7 @@ void AliHLTTPCClusterFinder::ProcessDigits()
 
 
     //Compare with results on previous pad:
-    for(UInt_t p=0; p<nprevious; p++){
+    for(UInt_t p=0; p<nprevious && p<kPadArraySize && ncurrent<kPadArraySize; p++){
       
       //dont merge sequences on the same pad twice
       if(previousPt[p]->fLastMergedPad==pad) continue;
@@ -445,7 +485,7 @@ void AliHLTTPCClusterFinder::ProcessDigits()
     } //Loop over results on previous pad.
 
 
-    if(newcluster){
+    if(newcluster && ncurrent<kPadArraySize){
       //Start a new cluster. Add it to the clusterlist, and update
       //the list of pointers to clusters in current pad.
       //current pad will be previous pad on next pad.
@@ -483,6 +523,11 @@ void AliHLTTPCClusterFinder::ProcessDigits()
 
 
     if(!readValue) break; //No more value
+    
+    if (ntotal>=kClusterListSize || ncurrent>=kPadArraySize) {
+      HLTWarning("pad array size exceeded ntotal=%d ncurrent=%d, skip rest of the data", ntotal, ncurrent);
+      break;
+    }
 
     if(fCurrentRow != newRow){
       WriteClusters(ntotal,clusterlist);
@@ -503,8 +548,6 @@ void AliHLTTPCClusterFinder::ProcessDigits()
 
   } // END while(readValue)
 
-  if (pCurrentPad) pCurrentPad->StopEvent();
-
   WriteClusters(ntotal,clusterlist);
 
   HLTInfo("ClusterFinder found %d clusters in slice %d patch %d", fNClusters, fCurrentSlice, fCurrentPatch);