]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - HLT/TPCLib/AliHLTTPCClusterFinderComponent.cxx
documentation
[u/mrichter/AliRoot.git] / HLT / TPCLib / AliHLTTPCClusterFinderComponent.cxx
index ed9e08d72b21154219240c31be2daecabf934bbe..c30bd98030fc1ea4929d1097150a8b9ffbdc8f16 100644 (file)
@@ -1,11 +1,13 @@
 // $Id$
 
 /**************************************************************************
- * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+ * This file is property of and copyright by the ALICE HLT Project        * 
+ * ALICE Experiment at CERN, All rights reserved.                         *
  *                                                                        *
- * Authors: Matthias Richter <Matthias.Richter@ift.uib.no>                *
- *          Timm Steinbeck <timm@kip.uni-heidelberg.de>                   *
- *          for The ALICE Off-line Project.                               *
+ * Primary Authors: Matthias Richter <Matthias.Richter@ift.uib.no>        *
+ *                  Timm Steinbeck <timm@kip.uni-heidelberg.de>           *
+ *                  Jochen Thaeder <thaeder@kip.uni-heidelberg.de>        *
+ *                  for The ALICE HLT Project.                            *
  *                                                                        *
  * Permission to use, copy, modify and distribute this software and its   *
  * documentation strictly for non-commercial purposes is hereby granted   *
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-///////////////////////////////////////////////////////////////////////////////
-//                                                                           //
-// a TPC cluster finder processing component for the HLT                     //
-//                                                                           //
-///////////////////////////////////////////////////////////////////////////////
+/** @file   AliHLTTPCClusterFinderComponent.cxx
+    @author Timm Steinbeck, Matthias Richter, Jochen Thaeder, Kenneth Aamodt
+    @date   
+    @brief  The TPC cluster finder processing component
+*/
 
-#if __GNUC__== 3
+#if __GNUC__>= 3
 using namespace std;
 #endif
-
+#include "AliHLTTPCLogging.h"
 #include "AliHLTTPCClusterFinderComponent.h"
-#include "AliL3ClustFinderNew.h"
-#include "AliL3SpacePointData.h"
+#include "AliHLTTPCDigitReaderPacked.h"
+#include "AliHLTTPCDigitReaderUnpacked.h"
+#include "AliHLTTPCDigitReaderRaw.h"
+#include "AliHLTTPCClusterFinder.h"
+#include "AliHLTTPCSpacePointData.h"
 #include "AliHLTTPCRawDataFormat.h"
 #include "AliHLTTPCClusterDataFormat.h"
-#include "AliL3Transform.h"
+#include "AliHLTTPCTransform.h"
 #include <stdlib.h>
 #include <errno.h>
+#include "TString.h"
 
 // this is a global object used for automatic component registration, do not use this
-AliHLTTPCClusterFinderComponent gAliHLTTPCClusterFinderComponent;
+// use fPackedSwitch = true for packed inputtype "gkDDLPackedRawDataType"
+// use fPackedSwitch = false for unpacked inputtype "gkUnpackedRawDataType"
+AliHLTTPCClusterFinderComponent gAliHLTTPCClusterFinderComponentPacked(true);
+AliHLTTPCClusterFinderComponent gAliHLTTPCClusterFinderComponentUnpacked(false);
 
 ClassImp(AliHLTTPCClusterFinderComponent)
 
-AliHLTTPCClusterFinderComponent::AliHLTTPCClusterFinderComponent()
-    {
-    fClusterFinder = NULL;
-    fClusterDeconv = true;
-    fXYClusterError = -1;
-    fZClusterError = -1;
-    }
+AliHLTTPCClusterFinderComponent::AliHLTTPCClusterFinderComponent(bool packed)
+  :
+  fClusterFinder(NULL),
+  fReader(NULL),
+  fClusterDeconv(true),
+  fXYClusterError(-1),
+  fZClusterError(-1),
+  fPackedSwitch(packed)
+{
+  // see header file for class documentation
+  // or
+  // refer to README to build package
+  // or
+  // visit http://web.ift.uib.no/~kjeks/doc/alice-hlt
+}
+
+AliHLTTPCClusterFinderComponent::AliHLTTPCClusterFinderComponent(const AliHLTTPCClusterFinderComponent&)
+  :
+  fClusterFinder(NULL),
+  fReader(NULL),
+  fClusterDeconv(true),
+  fXYClusterError(-1),
+  fZClusterError(-1),
+  fPackedSwitch(0)
+{
+  // see header file for class documentation
+  HLTFatal("copy constructor untested");
+}
+
+AliHLTTPCClusterFinderComponent& AliHLTTPCClusterFinderComponent::operator=(const AliHLTTPCClusterFinderComponent&)
+{ 
+  // see header file for class documentation
+  HLTFatal("assignment operator untested");
+  return *this;
+}
 
 AliHLTTPCClusterFinderComponent::~AliHLTTPCClusterFinderComponent()
     {
+  // see header file for class documentation
     }
 
 // Public functions to implement AliHLTComponent's interface.
@@ -57,109 +95,287 @@ AliHLTTPCClusterFinderComponent::~AliHLTTPCClusterFinderComponent()
 
 const char* AliHLTTPCClusterFinderComponent::GetComponentID()
     {
-    return "TPCClusterFinder";
+  // see header file for class documentation
+      if (fPackedSwitch) return "TPCClusterFinderPacked";
+      else return "TPCClusterFinderUnpacked";
     }
 
-void AliHLTTPCClusterFinderComponent::GetInputDataTypes( vector<AliHLTComponent_DataType>& list)
+void AliHLTTPCClusterFinderComponent::GetInputDataTypes( vector<AliHLTComponentDataType>& list)
     {
-    list.clear();
-    list.push_back( AliHLTTPCDefinitions::gkUnpackedRawDataType );
+  // see header file for class documentation
+    list.clear(); 
+    if (fPackedSwitch) list.push_back( AliHLTTPCDefinitions::fgkDDLPackedRawDataType );
+    else list.push_back( AliHLTTPCDefinitions::fgkUnpackedRawDataType );
+   
     }
 
-AliHLTComponent_DataType AliHLTTPCClusterFinderComponent::GetOutputDataType()
+AliHLTComponentDataType AliHLTTPCClusterFinderComponent::GetOutputDataType()
     {
-    return AliHLTTPCDefinitions::gkClustersDataType;
+  // see header file for class documentation
+    return AliHLTTPCDefinitions::fgkClustersDataType;
     }
 
 void AliHLTTPCClusterFinderComponent::GetOutputDataSize( unsigned long& constBase, double& inputMultiplier )
     {
-    // XXX TODO: Find more realistic values.
+  // see header file for class documentation
+    // XXX TODO: Find more realistic values.  
     constBase = 0;
-    inputMultiplier = 0.4;
+    if (fPackedSwitch)  inputMultiplier = (6 * 0.4);
+    else  inputMultiplier = 0.4;
     }
 
 AliHLTComponent* AliHLTTPCClusterFinderComponent::Spawn()
     {
-    return new AliHLTTPCClusterFinderComponent;
+  // see header file for class documentation
+    return new AliHLTTPCClusterFinderComponent(fPackedSwitch);
     }
        
 int AliHLTTPCClusterFinderComponent::DoInit( int argc, const char** argv )
     {
+  // see header file for class documentation
     if ( fClusterFinder )
        return EINPROGRESS;
-    fClusterFinder = new AliL3ClustFinderNew();
+
+    fClusterFinder = new AliHLTTPCClusterFinder();
+
+    Int_t rawreadermode =  -1;
+    Int_t sigthresh = -1;
+    Float_t occulimit = 1.0;
+    Int_t oldRCUFormat=0;
+    // Data Format version numbers:
+    // 0: RCU Data format as delivered during TPC commissioning, pads/padrows are sorted, RCU trailer is one 32 bit word.
+    // 1: As 0, but pads/padrows are delivered "as is", without sorting
+    // 2: As 0, but RCU trailer is 3 32 bit words.
+    // 3: As 1, but RCU trailer is 3 32 bit words.
+    // -1: use offline raw reader
+
+    Int_t i = 0;
+    Char_t* cpErr;
+
+    while ( i < argc ) {      
+
+      // -- raw reader mode option
+      if ( !strcmp( argv[i], "rawreadermode" ) ) {
+       if ( argc <= i+1 ) {
+         Logging( kHLTLogError, "HLT::TPCClusterFinder::DoInit", "Missing rawreadermode", "Raw Reader Mode not specified" );
+         return ENOTSUP;
+       }
+
+       // Decodes the rawreader mode: either number or string and returns the rawreadermode
+       // -1 on failure, -2 for offline
+       rawreadermode = AliHLTTPCDigitReaderRaw::DecodeMode( argv[i+1] );
+
+       if (rawreadermode == -1 ) {
+         Logging( kHLTLogError, "HLT::TPCClusterFinder::DoInit", "Missing rawreadermode", "Cannot convert rawreadermode specifier '%s'.", argv[i+1] );
+         return EINVAL;
+       }
+
+       i += 2;
+       continue;
+      }
+
+      // -- pp run option
+      if ( !strcmp( argv[i], "pp-run" ) ) {
+       fClusterDeconv = false;
+       i++;
+       continue;
+      }
+
+      // -- zero suppression threshold
+      if ( !strcmp( argv[i], "adc-threshold" ) ) {
+       sigthresh = strtoul( argv[i+1], &cpErr ,0);
+       if ( *cpErr ) {
+         HLTError("Cannot convert threshold specifier '%s'.", argv[i+1]);
+         return EINVAL;
+       }
+       i+=2;
+       continue;
+      }
+
+      // -- pad occupancy limit
+      if ( !strcmp( argv[i], "occupancy-limit" ) ) {
+       occulimit = strtof( argv[i+1], &cpErr);
+       if ( *cpErr ) {
+         HLTError("Cannot convert occupancy specifier '%s'.", argv[i+1]);
+         return EINVAL;
+       }
+       i+=2;
+       continue;
+      }
+
+      // -- number of timebins (default 1024)
+      if ( !strcmp( argv[i], "timebins" ) ) {
+       TString parameter(argv[i+1]);
+       parameter.Remove(TString::kLeading, ' '); // remove all blanks
+       if (parameter.IsDigit()) {
+         AliHLTTPCTransform::SetNTimeBins(parameter.Atoi());
+         HLTInfo("number of timebins set to %d", AliHLTTPCTransform::GetNTimeBins());
+       } else {
+         HLTError("Cannot timebin specifier '%s'.", argv[i+1]);
+         return EINVAL;
+       }
+       i+=2;
+       continue;
+      }
+
+      // -- checking for rcu format
+      if ( !strcmp( argv[i], "oldrcuformat" ) ) {
+       oldRCUFormat = strtoul( argv[i+1], &cpErr ,0);
+       if ( *cpErr ){
+         HLTError("Cannot convert oldrcuformat specifier '%s'. Should  be 0(off) or 1(on), must be integer", argv[i+1]);
+         return EINVAL;
+       }
+       i+=2;
+       continue;
+      }
+      
+
+      Logging(kHLTLogError, "HLT::TPCClusterFinder::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
+      return EINVAL;
+
+    }
+
+    // Choose reader
+
+    if (fPackedSwitch) { 
+      if (rawreadermode == -2) {
+#if defined(HAVE_ALIRAWDATA) && defined(HAVE_ALITPCRAWSTREAM_H)
+       fReader = new AliHLTTPCDigitReaderPacked();
+       if(oldRCUFormat==1){
+         fReader->SetOldRCUFormat(kTRUE);
+       }
+       else if(oldRCUFormat!=0){
+         HLTWarning("Wrong oldrcuformat specifier %d; oldrcuformat set to default(kFALSE)",oldRCUFormat);
+       }
+       fClusterFinder->SetReader(fReader);
+#else // ! defined(HAVE_ALIRAWDATA) && defined(HAVE_ALITPCRAWSTREAM_H)
+       HLTFatal("DigitReaderPacked not available - check your build");
+       return -ENODEV;
+#endif //  defined(HAVE_ALIRAWDATA) && defined(HAVE_ALITPCRAWSTREAM_H)
+      } else {
+#if defined(HAVE_TPC_MAPPING)
+       fReader = new AliHLTTPCDigitReaderRaw(rawreadermode);
+       fClusterFinder->SetReader(fReader);
+#else //! defined(HAVE_TPC_MAPPING)
+      HLTFatal("DigitReaderRaw not available - check your build");
+      return -ENODEV;
+#endif //defined(HAVE_TPC_MAPPING)
+      }
+    }
+    else {
+      fReader = new AliHLTTPCDigitReaderUnpacked();
+      fClusterFinder->SetReader(fReader);
+    }
+
+    // if pp-run use occupancy limit else set to 1. ==> use all 
+    if ( !fClusterDeconv )
+      fClusterFinder->SetOccupancyLimit(occulimit);
+    else 
+      fClusterFinder->SetOccupancyLimit(1.0);
+      
+    // Variables to setup the Clusterfinder
+    // TODO: this sounds strange and has to be verified; is the cluster finder not working when
+    // fClusterDeconv = false ?
     fClusterDeconv = true;
     fXYClusterError = -1;
     fZClusterError = -1;
-    int i = 0;
-    while ( i < argc )
-       {
-       if ( !strcmp( argv[i], "-pp-run" ) )
-           {
-           fClusterDeconv = false;
-           i++;
-           continue;
-           }
-       Logging(kHLTLogError, "HLT::TPCClusterFinder::DoInit", "Unknown Option", "Unknown option '%s'", argv[i] );
-       return EINVAL;
-       }
+
+    fClusterFinder->SetDeconv( fClusterDeconv );
+    fClusterFinder->SetXYError( fXYClusterError );
+    fClusterFinder->SetZError( fZClusterError );
+    if ( (fXYClusterError>0) && (fZClusterError>0) )
+      fClusterFinder->SetCalcErr( false );
+    fClusterFinder->SetSignalThreshold(sigthresh);
+    
     return 0;
     }
 
 int AliHLTTPCClusterFinderComponent::DoDeinit()
     {
-    if ( !fClusterFinder )
-       return ECANCELED;
+  // see header file for class documentation
+
     if ( fClusterFinder )
        delete fClusterFinder;
     fClusterFinder = NULL;
+    if ( fReader )
+       delete fReader;
+    fReader = NULL;
+    
     return 0;
     }
 
-int AliHLTTPCClusterFinderComponent::DoEvent( const AliHLTComponent_EventData& evtData, const AliHLTComponent_BlockData* blocks, 
-                                             AliHLTComponent_TriggerData& trigData, AliHLTUInt8_t* outputPtr, 
-                                             AliHLTUInt32_t& size, vector<AliHLTComponent_BlockData>& outputBlocks )
+int AliHLTTPCClusterFinderComponent::DoEvent( const AliHLTComponentEventData& evtData, 
+                                             const AliHLTComponentBlockData* blocks, 
+                                             AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr, 
+                                             AliHLTUInt32_t& size, 
+                                             vector<AliHLTComponentBlockData>& outputBlocks )
     {
-    const AliHLTComponent_BlockData* iter = NULL;
+  // see header file for class documentation
+
+    //  == init iter (pointer to datablock)
+    const AliHLTComponentBlockData* iter = NULL;
     unsigned long ndx;
-    AliHLTTPCUnpackedRawData* inPtr;
+
+    //  == OUTdatatype pointer
     AliHLTTPCClusterData* outPtr;
+
     AliHLTUInt8_t* outBPtr;
     UInt_t offset, mysize, nSize, tSize = 0;
+
     outBPtr = outputPtr;
     outPtr = (AliHLTTPCClusterData*)outBPtr;
+
     Int_t slice, patch, row[2];
     unsigned long maxPoints, realPoints = 0;
+
     for ( ndx = 0; ndx < evtData.fBlockCnt; ndx++ )
        {
        iter = blocks+ndx;
        mysize = 0;
        offset = tSize;
-       if ( iter->fDataType != AliHLTTPCDefinitions::gkUnpackedRawDataType )
-           continue;
-       
+
+
+       if (fPackedSwitch) {    
+         char tmp1[14], tmp2[14];
+         DataType2Text( iter->fDataType, tmp1 );
+         DataType2Text( AliHLTTPCDefinitions::fgkDDLPackedRawDataType, tmp2 );
+         Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Event received", 
+                  "Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
+                  evtData.fEventID, evtData.fEventID, tmp1, tmp2 );
+
+         if ( iter->fDataType != AliHLTTPCDefinitions::fgkDDLPackedRawDataType ) continue;
+
+       }
+       else {
+         char tmp1[14], tmp2[14];
+         DataType2Text( iter->fDataType, tmp1 );
+         DataType2Text( AliHLTTPCDefinitions::fgkUnpackedRawDataType, tmp2 );
+         Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Event received", 
+                  "Event 0x%08LX (%Lu) received datatype: %s - required datatype: %s",
+                  evtData.fEventID, evtData.fEventID, tmp1, tmp2 );
+
+         if ( iter->fDataType != AliHLTTPCDefinitions::fgkUnpackedRawDataType ) continue;
+
+       }
+       
        slice = AliHLTTPCDefinitions::GetMinSliceNr( *iter );
        patch = AliHLTTPCDefinitions::GetMinPatchNr( *iter );
-       row[0] = AliL3Transform::GetFirstRow( patch );
-       row[1] = AliL3Transform::GetLastRow( patch );
+       row[0] = AliHLTTPCTransform::GetFirstRow( patch );
+       row[1] = AliHLTTPCTransform::GetLastRow( patch );
        
        Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Input Spacepoints", 
                 "Input: Number of spacepoints: %lu Slice/Patch/RowMin/RowMax: %d/%d/%d/%d.",
                 realPoints, slice, patch, row[0], row[1] );
        
        outPtr = (AliHLTTPCClusterData*)outBPtr;
-       
-       inPtr = (AliHLTTPCUnpackedRawData*)iter->fPtr;
-       maxPoints = (size-tSize-sizeof(AliHLTTPCClusterData))/sizeof(AliL3SpacePointData);
-       
+
+       maxPoints = (size-tSize-sizeof(AliHLTTPCClusterData))/sizeof(AliHLTTPCSpacePointData);
+
        fClusterFinder->InitSlice( slice, patch, row[0], row[1], maxPoints );
-       fClusterFinder->SetDeconv( fClusterDeconv );
-       fClusterFinder->SetXYError( fXYClusterError );
-       fClusterFinder->SetZError( fZClusterError );
-       if ( (fXYClusterError>0) && (fZClusterError>0) )
-           fClusterFinder->SetCalcErr( false );
        fClusterFinder->SetOutputArray( outPtr->fSpacePoints );
-       fClusterFinder->Read( maxPoints, inPtr->fDigits );
+       fClusterFinder->Read(iter->fPtr, iter->fSize );
        fClusterFinder->ProcessDigits();
        realPoints = fClusterFinder->GetNumberOfClusters();
        
@@ -167,15 +383,13 @@ int AliHLTTPCClusterFinderComponent::DoEvent( const AliHLTComponent_EventData& e
                 "Number of spacepoints found: %lu.", realPoints );
        
        outPtr->fSpacePointCnt = realPoints;
-       nSize = sizeof(AliL3SpacePointData)*realPoints;
+       nSize = sizeof(AliHLTTPCSpacePointData)*realPoints;
        mysize += nSize+sizeof(AliHLTTPCClusterData);
        
        Logging( kHLTLogDebug, "HLT::TPCClusterFinder::DoEvent", "Input Spacepoints", 
                 "Number of spacepoints: %lu Slice/Patch/RowMin/RowMax: %d/%d/%d/%d.",
                 realPoints, slice, patch, row[0], row[1] );
-       
-       
-       AliHLTComponent_BlockData bd;
+       AliHLTComponentBlockData bd;
        FillBlockData( bd );
        bd.fOffset = offset;
        bd.fSize = mysize;
@@ -197,7 +411,8 @@ int AliHLTTPCClusterFinderComponent::DoEvent( const AliHLTComponent_EventData& e
        }
     
     size = tSize;
+
     return 0;
     }
 
-       
+