// @(#) $Id$
#ifndef ALIHLTTPCCLUSTERFINDERCOMPONENT_H
#define ALIHLTTPCCLUSTERFINDERCOMPONENT_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 AliHLTTPCClusterFinderComponent.h
@author Timm Steinbeck, Matthias Richter, Kenneth Aamodt
@date
@brief The TPC cluster finder component.
*/
#include "AliHLTProcessor.h"
class AliHLTTPCClusterFinder;
class AliHLTTPCDigitReader;
/**
* @class AliHLTTPCClusterFinderComponent
* Implementation of the cluster finder component.
* The component implements the interface methods of the @ref AliHLTProcessor.
* The actual cluster finding algorithm is implemented in @ref AliHLTTPCClusterFinder.
* Two components are registered, TPCClusterFinderPacked and TPCClusterFinderDecoder.
* TPCClusterFinderDecoder use the AliTPCRawStream class for decoding of the data, while TPCClusterFinderDecoder
* use the AliAltroDecoder for decoding the data.
*
* TPCClusterFinderDecoder is the fastest of the two, this is due to that the AliAltroDecoder
* returns data in a bunch format. A bunch consist of consecutive signals.
* TPCClusterFinderPacked first have to read the data one by one, which means that row, pad and
* time signals have to be compared between each new digit, which leads to a slower alorithm.
*
*
* The clusterfinder is now using the AliTPCTransform instead of the AliHLTTPCTransform for
* transformations from row, pad time -> x,y,z.
*
*
General properties:
*
* Component ID: \b TPCClusterFinderDecoder and TPCClusterFinderPacked
* Library: \b libAliHLTTPC
* Input Data Types: @ref kAliHLTDataTypeDDLRaw
* Output Data Types: @ref AliHLTTPCDefinitions::fgkClustersDataType and/or kAliHLTDataTypeHwAddr16
*
*
* Mandatory arguments:
*
*
* Optional arguments:
*
* \li -deconvolute-time
* Turns on deconvolution in the time direction.
* \li -deconvolute-pad
* Turns on deconvolution in the pad direction.
* \li -timebins
* Sets the number of timebins (446 for simulated data, and 1024 for real data) Default:1024
* \li -first-timebin
* First timebin taken into consideration when reading the data.
* \li -last-timebin
* Last timebin taken into consideration when reading the data.
* \li -sorted
* Switch off unsorted reading of data. Equivalent to the old argument unsorted 0.
* \li -active-pads
* Switch off unsorted reading of data. Equivalent to the old argument unsorted 0.
* \li -occupancy-limit
* Set the occupancy limit for the sorted clusterfinding.
*
*
* Obsolete arguments:
* \li occupancy-limit
* \li rawreadermode
* \li pp-run
* \li adc-threshold
* \li oldrcuformat
* \li unsorted
* \li nsigma-threshold
*
* Default CDB entries:
* The component has these default CDB entries
* \li GRP/GRP/Data.
* \li TPC/Calib/PadTime0.
* \li TPC/Calib/Parameters.
* \li TPC/Calib/TimeDrift.
* \li TPC/Calib/Temperature.
*
* TODO: pad by pad gain calibration also has to be added to the clusterfinder
*
* And it also needs these below to avoid warnings during initialization and update of calibDB
* \li TPC/Calib/PadGainFactor.
* \li TPC/Calib/TimeGain.
* \li TPC/Calib/GainFactorDedx.
* \li TPC/Calib/PadNoise.
* \li TPC/Calib/Pedestals.
* \li TPC/Calib/ClusterParam.
* \li TPC/Calib/AltroConfig.
* \li TPC/Calib/Pulser.
* \li TPC/Calib/CE.
* \li TPC/Calib/Raw.
* \li TPC/Calib/QA.
* \li TPC/Calib/Mapping.
* \li TPC/Calib/Goofie.
* \li TPC/Calib/HighVoltage.
* \li TPC/Calib/Ref.
*
* These entries are used by the AliTPCTransform class to correct for T0, drift and ExB.
* @ingroup alihlt_tpc_components
*/
class AliHLTTPCClusterFinderComponent : public AliHLTProcessor
{
public:
/**
* Defines for the cluster finder type.
* The cluster finders can work on different formats of input data,
* the AliHLTTPCDigitReader interface provides a transparent way to
* read the data.
*/
enum {
/** real data, offline AliAltroRawStream used for data decoding */
kClusterFinderPacked,
/** Unpacked data of format AliHLTTPCUnpackedRawData */
kClusterFinderUnpacked,
/** real data, fast AliAltroDecoder used for data decoding */
kClusterFinderDecoder,
/** real data, offline altro decoder 32 bit format*/
kClusterFinder32Bit
};
/**
* constructor
* @param mode input type see e.g. @ref kClusterFinderUnpacked
*/
AliHLTTPCClusterFinderComponent(int mode);
/** destructor */
virtual ~AliHLTTPCClusterFinderComponent();
// Public functions to implement AliHLTComponent's interface.
// These functions are required for the registration process
/** interface function, see AliHLTComponent for description */
const char* GetComponentID();
/** interface function, see AliHLTComponent for description */
void GetInputDataTypes( vector& list);
/** interface function, see AliHLTComponent for description */
AliHLTComponentDataType GetOutputDataType();
/** interface function, see AliHLTComponent for description */
int GetOutputDataTypes(AliHLTComponentDataTypeList& tgtList);
/** interface function, see AliHLTComponent for description */
virtual void GetOutputDataSize( unsigned long& constBase, double& inputMultiplier );
/** interface function, see AliHLTComponent for description */
AliHLTComponent* Spawn();
protected:
// Protected functions to implement AliHLTComponent's interface.
// These functions provide initialization as well as the actual processing
// capabilities of the component.
int DoInit( int argc, const char** argv );
int DoDeinit();
int DoEvent( const AliHLTComponentEventData& evtData, const AliHLTComponentBlockData* blocks,
AliHLTComponentTriggerData& trigData, AliHLTUInt8_t* outputPtr,
AliHLTUInt32_t& size, vector& outputBlocks );
int Configure(const char* arguments);
int ScanConfigurationArgument(int argc, const char** argv);
int Reconfigure(const char* cdbEntry, const char* chainId);
using AliHLTProcessor::DoEvent;
private:
/** standard constructor prohibited */
AliHLTTPCClusterFinderComponent();
/** copy constructor prohibited */
AliHLTTPCClusterFinderComponent(const AliHLTTPCClusterFinderComponent&);
/** assignment operator prohibited */
AliHLTTPCClusterFinderComponent& operator=(const AliHLTTPCClusterFinderComponent&);
/** the cluster finder object */
AliHLTTPCClusterFinder* fClusterFinder; //!transient
/** the reader object for data decoding */
AliHLTTPCDigitReader* fReader; //!transient
/** flag to deconvolute in time direction */
Bool_t fDeconvTime; //!transient
/** flag to deconvolute in pad direction */
Bool_t fDeconvPad; //!transient
/** flag to switch on/off deconvolution in pad and time directions (used by sorted clusterfinding method) */
bool fClusterDeconv; //!transient
/** Error in xy of cluster */
float fXYClusterError; //!transient
/** Error in Z direction of cluster */
float fZClusterError; //!transient
/**
* switch to indicated the reader
* use fModeSwitch = 0 for packed inputtype "gkDDLPackedRawDataType"
* use fModeSwitch = 1 for unpacked inputtype "gkUnpackedRawDataType"
* use fModeSwitch = 2 for packed inputtype "gkDDLPackedRawDataType" with new digit reader
* use fModeSwitch = 3 for packed inputtype "gkDDLPackedRawDataType" with 32bit digit reader
*/
Int_t fModeSwitch; // see above
/*
* Reads the data the new unsorted way if true
*
*/
Int_t fUnsorted; //!transient
/*
* Patch number to be read, currently given as component argument,
* will be changed later.
*/
Int_t fPatch; //!transient
/*
* Switch to specify if one ship out a list of active pads (pads conected to a cluster).
*/
Int_t fGetActivePads; //!transient
/** First timebin taken into account when reading the data */
Int_t fFirstTimeBin; //!transient
/** Last timebin taken in to account when reading the data */
Int_t fLastTimeBin; //!transient
Bool_t fDoMC; // flag to provide MC labels
Bool_t fReleaseMemory; // flag to release the memory after each event
/// the default configuration entry for this component
static const char* fgkOCDBEntryPacked; //!transient
static const char* fgkOCDBEntryUnpacked; //!transient
static const char* fgkOCDBEntryDecoder; //!transient
static const char* fgkOCDBEntry32Bit; //!transient
ClassDef(AliHLTTPCClusterFinderComponent, 8)
};
#endif