]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/AliHLTTPCClusterFinder.h
bug https://savannah.cern.ch/bugs/?69885
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCClusterFinder.h
index 95af7ea355a8726ceaf9e55ad34d56c0aa2c9df6..ab58327d184c9bd62a0584e1461fc2064428dab1 100644 (file)
 // @(#) $Id$
 // Original: AliHLTClustFinderNew.h,v 1.13 2004/06/18 10:55:26 loizides 
 
-#ifndef AliHLTTPC_CLUSTERFINDER
-#define AliHLTTPC_CLUSTERFINDER
-/* This file is property of and copyright by the ALICE HLT Project        * 
- * ALICE Experiment at CERN, All rights reserved.                         *
- * See cxx source for full Copyright notice                               */
-
-/** @file   AliHLTTPCClusterFinder.h
-    @author Anders Vestbo, Constantin Loizides, Jochen Thaeder
-           Kenneth Aamodt kenneth.aamodt@student.uib.no
-    @date   
-    @brief  Cluster Finder for the TPC
-*/
-
-// see below for class documentation
-// or
-// refer to README to build package
-// or
-// visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
-
-#define UNSORTED 0
+#ifndef ALIHLTTPCCLUSTERFINDER_H
+#define ALIHLTTPCCLUSTERFINDER_H
+//* This file is property of and copyright by the ALICE HLT Project        * 
+//* ALICE Experiment at CERN, All rights reserved.                         *
+//* See cxx source for full Copyright notice                               *
+
+//  @file   AliHLTTPCClusterFinder.h
+//  @author Anders Vestbo, Constantin Loizides
+//         Kenneth Aamodt kenneth.aamodt@student.uib.no
+//  @brief  HLT Cluster Finder for the TPC
+//  @note
 
 #include "AliHLTLogging.h"
-#include "AliHLTTPCPadArray.h"
+#include <vector>
+#include "AliHLTTPCTransform.h"
+#include "AliHLTTPCDigitData.h"
+#include "AliHLTTPCDigitReader.h"
+#include "AliTPCRecoParam.h"
+
+class AliHLTTPCPad;
 class AliHLTTPCSpacePointData;
-class AliHLTTPCDigitReader;
+class AliHLTTPCClusters;
+class AliTPCTransform;
+class AliTPCParam;
 
+/**
+ * @class AliHLTTPCClusterFinder
+ *
+ * The current cluster finder for HLT
+ * (Based on STAR L3)
+ *
+ * Basically we have two versions for the cluster finder now.
+ * The default version, reads the data pad by pad, and find the
+ * clusters as it reads the data. The other version has now been
+ * developed to cope with unsorted data. New methods for the unsorted
+ * version can  be found at the end of the default one i the source file.
+ * Currently the new version is only build to manage zero-suppressed data.
+ * More functionality will be added later.
+ * 
+ * The cluster finder is initialized with the Init function, 
+ * providing the slice and patch information to work on. 
+ *
+ * The input is a provided by the AliHLTTPCDigitReader class,
+ * using the init() funktion, and the next() funktion in order 
+ * to get the next bin. Either packed or unpacked data can be
+ * processed, dependent if one uses AliHLTTPCDigitReaderPacked 
+ * class or AliHLTTPCDigitReaderUnpacked class in the 
+ * Clusterfinder Component.
+ * The resulting space points will be in the
+ * array given by the SetOutputArray function.
+ * 
+ * There are several setters which control the behaviour:
+ *
+ * - SetXYError(Float_t):   set fixed error in XY direction
+ * - SetZError(Float_t):    set fixed error in Z  direction
+ *                            (used if errors are not calculated) 
+ * - SetDeconv(Bool_t):     switch on/off deconvolution
+ * - SetThreshold(UInt_t):  set charge threshold for cluster
+ * - SetMatchWidth(UInt_t): set the match distance in 
+ *                            time for sequences to be merged 
+ * - SetSTDOutput(Bool_t):  switch on/off output about found clusters   
+ * - SetCalcErr(Bool_t):    switch on/off calculation of 
+ *                          space point errors (or widths in raw system)
+ * - SetRawSP(Bool_t):      switch on/off convertion to raw system
+ *
+ *
+ * Example Usage:
+ *
+ * <pre>
+ * AliHLTTPCFileHandler *file = new AliHLTTPCFileHandler();
+ * file->SetAliInput(digitfile); //give some input file
+ * for(int slice=0; slice<=35; slice++){
+ *   for(int patch=0; pat<6; pat++){
+ *     file->Init(slice,patch);
+ *     UInt_t ndigits=0;
+ *     UInt_t maxclusters=100000;
+ *     UInt_t pointsize = maxclusters*sizeof(AliHLTTPCSpacePointData);
+ *     AliHLTTPCSpacePointData *points = (AliHLTTPCSpacePointData*)memory->Allocate(pointsize);
+ *     AliHLTTPCDigitRowData *digits = (AliHLTTPCDigitRowData*)file->AliAltroDigits2Memory(ndigits,event);
+ *     AliHLTTPCClusterFinder *cf = new AliHLTTPCClusterFinder();
+ *     cf->SetMatchWidth(2);
+ *     cf->InitSlice( slice, patch, row[0], row[1], maxPoints );
+ *     cf->SetSTDOutput(kTRUE);    //Some output to standard IO
+ *     cf->SetRawSP(kFALSE);       //Convert space points to local system
+ *     cf->SetThreshold(5);        //Threshold of cluster charge
+ *     cf->SetDeconv(kTRUE);       //Deconv in pad and time direction
+ *     cf->SetCalcErr(kTRUE);      //Calculate the errors of the spacepoints
+ *     cf->SetOutputArray(points); //Move the spacepoints to the array
+ *     cf->Read(iter->fPtr, iter->fSize ); //give the data to the cf
+ *     cf->ProcessDigits();        //process the rows given by init
+ *     Int_t npoints = cf->GetNumberOfClusters();
+ *     AliHLTTPCMemHandler *out= new AliHLTTPCMemHandler();
+ *     out->SetBinaryOutput(fname);
+ *     out->Memory2Binary(npoints,points); //store the spacepoints
+ *     out->CloseBinaryOutput();
+ *     delete out;
+ *     file->free();
+ *     delete cf;
+ *   }
+ * }
+ * </pre>
+ * @ingroup alihlt_tpc
+ */
 class AliHLTTPCClusterFinder : public AliHLTLogging {
 
  public:
@@ -43,45 +120,110 @@ class AliHLTTPCClusterFinder : public AliHLTLogging {
     UInt_t fLastCharge;    //for deconvolution
     UInt_t fLastMergedPad; //dont merge twice per pad
     Int_t fRow;             //row value
+    UInt_t fQMax;           //qmax
   };
   typedef struct AliClusterData AliClusterData; //!
 
+  struct MCWeight{
+    Int_t fMCID; //!
+    Float_t fWeight; //!
+    static Bool_t CompareWeights( const MCWeight &mc1,  const MCWeight &mc2 ){ return mc1.fWeight > mc2.fWeight; }
+  };
+  typedef struct MCWeight MCWeight;
+
+  struct ClusterMCInfo{
+    MCWeight fClusterID[3]; //!
+  };
+  typedef struct ClusterMCInfo ClusterMCInfo;
+
+
   /** standard constructor */
   AliHLTTPCClusterFinder();
+
   /** destructor */
   virtual ~AliHLTTPCClusterFinder();
 
-  void Read(void* ptr,unsigned long size);
-
-  void InitSlice(Int_t slice,Int_t patch,Int_t firstrow, Int_t lastrow,Int_t maxpoints);
+  /** Initialize the slice */
   void InitSlice(Int_t slice,Int_t patch,Int_t maxpoints);
-  void ProcessDigits();
 
+  /** Initializes the pad array (vector)*/
+  void InitializePadArray();
+
+  /** Deinitialize the pad array (vector)*/
+  Int_t DeInitializePadArray();
+
+  /** Read the data in unsorted format, storing the clustercandidates */
+  void ReadDataUnsorted(void* ptr,unsigned long size);
+
+  /** Read the data in unsorted format, and deconvolute the signals for each pad in time direction */
+  void ReadDataUnsortedDeconvoluteTime(void* ptr,unsigned long size);
+
+  /** Loops over all rows finding the clusters */
+  void FindClusters();
+
+  /** Compare two neighbouring pads for matching clustercandidates */
+  Bool_t ComparePads(AliHLTTPCPad *nextPad,AliHLTTPCClusters* candidate,Int_t nextPadToRead);
+  
+  /**  Fills the hw address list */
+  Int_t FillHWAddressList(AliHLTUInt16_t *hwaddlist, Int_t maxHWAddress);
+
+ /**  Fills the mc info */
+  Int_t FillOutputMCInfo(AliHLTTPCClusterFinder::ClusterMCInfo * outputMCInfo, Int_t maxNumberOfClusterMCInfo);
+
+  /** Set the pointer to the outputbuffer */
   void SetOutputArray(AliHLTTPCSpacePointData *pt);
-  void WriteClusters(Int_t n_clusters,AliClusterData *list);
 
+  /** Returns the number of clusters */
+  Int_t GetNumberOfClusters() const {return fNClusters;}
+
+  /** Returns the Ocuppancy limit */
+  Float_t GetOccupancyLimit() const {return fOccupancyLimit;}
+  
+  // setters
+  void SetDeconv(Bool_t f) {fDeconvPad=f; fDeconvTime=f;}
+  void SetDeconvPad(Bool_t f) {fDeconvPad=f;}
+  void SetDeconvTime(Bool_t f) {fDeconvTime=f;}
+  void SetUnsorted(Int_t unsorted){fUnsorted=unsorted;}
+  void SetPatch(Int_t patch){fCurrentPatch=patch;}
+  void SetDoPadSelection(Bool_t input){fDoPadSelection=input;}
+  void SetLastTimeBin(Int_t ltb){fLastTimeBin=ltb;}
+  void SetFirstTimeBin(Int_t ftb){fFirstTimeBin=ftb;}
+  void SetReleaseMemory( Bool_t v ){ fReleaseMemory = v;}
+  void UpdateLastTimeBin(){fLastTimeBin=AliHLTTPCTransform::GetNTimeBins();}
+
+//---------------------------------- Under this line the old sorted clusterfinder functions can be found --------------------------------
+  void Read(void* ptr,unsigned long size);
+  void ProcessDigits();
+  void WriteClusters(Int_t n_clusters,AliClusterData *list);
+  void WriteClusters(Int_t nclusters,AliHLTTPCClusters *list);
+  void PrintClusters();
   void SetXYError(Float_t f) {fXYErr=f;}
   void SetZError(Float_t f) {fZErr=f;}
-  void SetDeconv(Bool_t f) {fDeconvPad=f; fDeconvTime=f;}
   void SetThreshold(UInt_t i) {fThreshold=i;}
   void SetOccupancyLimit(Float_t f) {fOccupancyLimit=f;}
-  void SetSignalThreshold(Int_t i) {fSignalThreshold=i;}
-  void SetNSigmaThreshold(Double_t d) {fNSigmaThreshold=d;}
   void SetMatchWidth(UInt_t i) {fMatch=i;}
   void SetSTDOutput(Bool_t f=kFALSE) {fStdout=f;}  
   void SetCalcErr(Bool_t f=kTRUE) {fCalcerr=f;}
   void SetRawSP(Bool_t f=kFALSE) {fRawSP=f;}
   void SetReader(AliHLTTPCDigitReader* f){fDigitReader = f;}
-  Int_t GetNumberOfClusters() const {return fNClusters;}
 
-  //----------------------------------Methods for the new unsorted way of reading data ----------
-  void SetPadArray(AliHLTTPCPadArray *padArray);
-  void ReadDataUnsorted(void* ptr,unsigned long size);
-  void FindClusters();
-  Int_t GetActivePads(AliHLTTPCPadArray::AliHLTTPCActivePads* activePads,Int_t maxActivePads);
-  void WriteClusters(Int_t nclusters,AliHLTTPCClusters *list);
+  void Set32BitFormat(Bool_t flag){f32BitFormat = flag;}
+
+  void SetDoMC(Bool_t flag){fDoMC = flag;}
+  
+  vector<AliHLTUInt16_t> fClustersHWAddressVector;  //! transient
+  
+  typedef vector<AliHLTTPCPad*> AliHLTTPCPadVector;
   
- private: 
+  vector<AliHLTTPCPadVector> fRowPadVector;     //! transient
+  
+  void FillMCClusterVector(vector<AliHLTTPCDigitData> digitData);
+
+  vector<AliHLTTPCClusterFinder::MCWeight> GetClusterMCInfo() const {return fClusterMCVector;}
+
+  Bool_t UpdateCalibDB();
+
+ protected: 
   /** copy constructor prohibited */
   AliHLTTPCClusterFinder(const AliHLTTPCClusterFinder&);
   /** assignment operator prohibited */
@@ -90,40 +232,74 @@ class AliHLTTPCClusterFinder : public AliHLTLogging {
   AliHLTTPCSpacePointData *fSpacePointData; //! array of space points
   AliHLTTPCDigitReader *fDigitReader;       //! reader instance
 
-  UChar_t* fPtr;   //! pointer to packed block
-  unsigned long fSize; //packed block size
-  Bool_t fDeconvTime; //deconv in time direction
-  Bool_t fDeconvPad;  //deconv in pad direction
-  Bool_t fStdout;     //have print out in write clusters
-  Bool_t fCalcerr;    //calculate centroid sigmas
-  Bool_t fRawSP;      //store centroids in raw system
-
-
-  Int_t fFirstRow;       //first row
-  Int_t fLastRow;        //last row
-  Int_t fCurrentRow;     //current active row
-  Int_t fCurrentSlice;   //current slice
-  Int_t fCurrentPatch;   //current patch
-  Int_t fMatch;          //size of match
-  UInt_t fThreshold;     //threshold for clusters
-  /** threshold for zero suppression (applied per bin) */
-  Int_t fSignalThreshold;// see above
-  /** threshold for zero suppression 2007 December run */
-  Double_t fNSigmaThreshold; // see above
-  Int_t fNClusters;      //number of found clusters
-  Int_t fMaxNClusters;   //max. number of clusters
-  Float_t fXYErr;        //fixed error in XY
-  Float_t fZErr;         //fixed error in Z
+  UChar_t* fPtr;           //! pointer to packed block
+  unsigned long fSize;     //! packed block size
+  Bool_t fDeconvTime;      //! deconv in time direction
+  Bool_t fDeconvPad;       //! deconv in pad direction
+  Bool_t fStdout;          //! have print out in write clusters
+  Bool_t fCalcerr;         //! calculate centroid sigmas
+  Bool_t fRawSP;           //! store centroids in raw system
+
+
+  Int_t fFirstRow;       //! first row
+  Int_t fLastRow;        //! last row
+  Int_t fCurrentRow;     //! current active row
+  Int_t fCurrentSlice;   //! current slice
+  Int_t fCurrentPatch;   //! current patch
+  Int_t fMatch;          //! size of match
+  UInt_t fThreshold;     //! threshold for clusters
+  Int_t fNClusters;      //! number of found clusters
+  Int_t fMaxNClusters;   //! max. number of clusters
+  Float_t fXYErr;        //! fixed error in XY
+  Float_t fZErr;         //! fixed error in Z
   
-  Float_t fOccupancyLimit; // Occupancy Limit
+  Float_t fOccupancyLimit;    //! Occupancy Limit
+
+  Int_t fUnsorted;            //! enable for processing of unsorted digit data
+  Bool_t fVectorInitialized;  //! flag to check if pad vector is initialized
+  vector<AliHLTTPCClusters> fClusters;                             //! transient
+
+  vector<ClusterMCInfo> fClustersMCInfo;                           //! transient
+
+  vector<AliHLTTPCDigitData> fMCDigits;                            //! transient
+  
+  UInt_t* fNumberOfPadsInRow;                                      //! transient
+  
+  UInt_t fNumberOfRows;                                            //! transient
+  
+  UInt_t fRowOfFirstCandidate;                                    //! transient
+
+  Bool_t fDoPadSelection;                                         //! transient
+
+  Int_t fFirstTimeBin;                                            //! transient
+  
+  Int_t fLastTimeBin;                                             //! transient
+
+  UInt_t fTotalChargeOfPreviousClusterCandidate;                   //! transient
+
+  Bool_t fChargeOfCandidatesFalling;                               //! transient
+
+  Bool_t f32BitFormat;                                             //! transient
+
+  Bool_t fDoMC;                                                    //! transient
+
+  vector<MCWeight> fClusterMCVector;                               //! transient
+
+  AliTPCTransform * fOfflineTransform;                             //! transient
+
+  AliTPCParam   *fOfflineTPCParam;                                 //! transient
+
+  AliTPCRecoParam fOfflineTPCRecoParam;                            //! transient
 
-  AliHLTTPCPadArray * fPadArray; //! transient
+  Float_t fTimeMeanDiff;                                           //! transient
 
+  Bool_t fReleaseMemory; //! flag to release the memory after each event
 
 #ifdef do_mc
-  void GetTrackID(Int_t pad,Int_t time,Int_t *trackID);
+  void GetTrackID(Int_t pad,Int_t time,Int_t *trackID) const;
 #endif
   
-  ClassDef(AliHLTTPCClusterFinder,1) //Fast cluster finder
+  ClassDef(AliHLTTPCClusterFinder,11) //Fast cluster finder
 };
 #endif