LCOV - code coverage report
Current view: top level - HLT/MUON/OnlineAnalysis - AliHLTMUONHitReconstructor.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 26 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 26 0.0 %

          Line data    Source code
       1             : #ifndef ALIHLTMUONHITRECONSTRUCTOR_H
       2             : #define ALIHLTMUONHITRECONSTRUCTOR_H
       3             : /* This file is property of and copyright by the ALICE HLT Project        *
       4             :  * ALICE Experiment at CERN, All rights reserved.                         *
       5             :  * See cxx source for full Copyright notice                               */
       6             : 
       7             : // $Id$
       8             : 
       9             : ///////////////////////////////////////////////
      10             : //Author : Indranil Das, SINP, INDIA
      11             : //         Sukalyan Chattopadhyay, SINP, INDIA
      12             : //         
      13             : //Email :  indra.das@saha.ac.in
      14             : //         sukalyan.chattopadhyay@saha.ac.in 
      15             : ///////////////////////////////////////////////
      16             : 
      17             : #include <map>
      18             : 
      19             : #include "AliHLTLogging.h"
      20             : #include "AliMUONTrackerDDLDecoder.h"
      21             : #include "AliMUONTrackerDDLDecoderEventHandler.h"
      22             : #include "AliHLTMUONDataTypes.h"
      23             : 
      24             : #if __GNUC__ && __GNUC__ < 3
      25             : #define std
      26             : #endif
      27             : 
      28             : 
      29             : extern "C" struct AliHLTMUONRecHitStruct;
      30             : extern "C" struct AliHLTMUONClusterStruct;
      31             : extern "C" struct AliHLTMUONChannelStruct;
      32             : typedef std::map<AliHLTInt32_t, AliHLTInt32_t> IdManuChannelToEntry;
      33             : typedef IdManuChannelToEntry MaxEntryPerBusPatch;
      34             : 
      35             : class AliHLTMUONHitReconstructor : public AliHLTLogging
      36             : {
      37             : public:
      38             :         
      39             :         AliHLTMUONHitReconstructor();
      40             :         virtual ~AliHLTMUONHitReconstructor(void);
      41             :         
      42             :         void SetLookUpTable(
      43             :                         const AliHLTMUONHitRecoLutRow* lookupTable,
      44             :                         const IdManuChannelToEntry* idToEntry,
      45             :                         const MaxEntryPerBusPatch* maxEntryPerBP
      46             :                 );
      47             :         
      48           0 :         void SetDCCut(AliHLTInt32_t dcCut) { fDCCut = dcCut; }
      49           0 :         AliHLTInt32_t GetDCCut() const { return fDCCut; }
      50             :         
      51             :         bool Run(
      52             :                         AliHLTUInt32_t* rawData,
      53             :                         AliHLTUInt32_t rawDataSize,
      54             :                         AliHLTMUONRecHitStruct* const recHit,
      55             :                         AliHLTUInt32_t& nofHit
      56             :                 );
      57             :         
      58             :         /**
      59             :          * Fills the output clusters array with the extra cluster information generated.
      60             :          * If the method GenerateClusterInfo(true) was not called, then no cluster information
      61             :          * is generated and this method will not do anything.
      62             :          * \param [out] clusters  This is the output array that will be filled.
      63             :          * \param [in,out] nofClusters Initially this contains the maximum number of elements
      64             :          *     that can be stored in the clusters array. The method will fill this with
      65             :          *     the actual number of elements stored.
      66             :          * \returns true if all elements were copied and false if there is not enough space in
      67             :          *     the output array.
      68             :          */
      69             :         bool FillClusterData(AliHLTMUONClusterStruct* clusters, AliHLTUInt32_t& nofClusters);
      70             :         
      71             :         /**
      72             :          * Fills the output channels array with the extra channel information generated.
      73             :          * If the method GenerateChannelInfo(true) was not called, then no extra channel
      74             :          * information is generated and this method will not do anything.
      75             :          * \param [out] channels  This is the output array that will be filled.
      76             :          * \param [in,out] nofChannels Initially this contains the maximum number of elements
      77             :          *     that can be stored in the channels array. The method will fill this with
      78             :          *     the actual number of elements stored.
      79             :          * \returns true if all elements were copied and false if there is not enough space in
      80             :          *     the output array.
      81             :          */
      82             :         bool FillChannelData(AliHLTMUONChannelStruct* channels, AliHLTUInt32_t& nofChannels);
      83             :         
      84             :         static AliHLTInt32_t GetkDetectorId() { return fgkDetectorId; }
      85             :         static AliHLTInt32_t GetkDDLOffSet() { return fgkDDLOffSet; }
      86             :         static AliHLTInt32_t GetkNofDDL() { return fgkNofDDL; }
      87             :         static AliHLTInt32_t GetkDDLHeaderSize() { return fgkDDLHeaderSize; }
      88             :         static AliHLTInt32_t GetkNofDetElemInDDL(Int_t iDDL);
      89             :         static AliHLTInt32_t GetkMinDetElemIdInDDL(Int_t iDDL);
      90             :         
      91             :         /// The error recovery mode used for TryRecover.
      92             :         enum ERecoveryMode
      93             :         {
      94             :                 kDontTryRecover = 0,  /// Will not try recover from errors.
      95             :                 kRecoverFull,  /// Try recover from all errors.
      96             :                 kRecoverJustSkip,  /// Just skip any corrupt structures.
      97             :                 kRecoverFromParityErrorsOnly  /// Recover only from parity errors.
      98             :         };
      99             :         
     100             :         /// Returns the recovery mode used for the TryRecover option.
     101             :         /// This controls if the decoder is set to enable recovery logic if
     102             :         /// raw data errors are found.
     103           0 :         ERecoveryMode TryRecover() const { return fRecoveryMode; }
     104             :         
     105             :         /// Sets if the decoder should enable the error recovery logic and how.
     106             :         void TryRecover(ERecoveryMode mode);
     107             :         
     108             :         /// Returns true if ADC digits with parity errors are skipped.
     109             :         bool SkipParityErrors() const { return fHLTMUONDecoder.GetHandler().SkipParityErrors(); }
     110             :         
     111             :         /// Sets the flag indicating if ADC digits with parity errors are skipped.
     112           0 :         void SkipParityErrors(bool value) { fHLTMUONDecoder.GetHandler().SkipParityErrors(value); }
     113             :         
     114             :         /// Returns true if messages about parity errors are not printed.
     115             :         bool DontPrintParityErrors() const { return fHLTMUONDecoder.GetHandler().DontPrintParityErrors(); }
     116             :         
     117             :         /// Sets the flag indicating if messages about parity errors are not printed.
     118           0 :         void DontPrintParityErrors(bool value) { fHLTMUONDecoder.GetHandler().DontPrintParityErrors(value); }
     119             :         
     120             :         /// Returns true if the extra cluster information should be generated.
     121           0 :         bool GenerateClusterInfo() const { return fGenerateClusterInfo; }
     122             :         
     123             :         /// Sets the flag to indicate if the extra cluster information should be generated.
     124           0 :         void GenerateClusterInfo(bool value) { fGenerateClusterInfo = value; }
     125             :         
     126             :         /// Returns true if the extra channel information should be generated.
     127           0 :         bool GenerateChannelInfo() const { return fGenerateChannelInfo; }
     128             :         
     129             :         /// Sets the flag to indicate if the extra channel information should be generated.
     130           0 :         void GenerateChannelInfo(bool value) { fGenerateChannelInfo = value; }
     131             :         
     132             :         /// Returns the maximum channel multiplicity allowed per cluster.
     133             :         bool MaxChannelMultiplicity() const { return fMaxChannelMult; }
     134             :         
     135             :         /// Sets the maximum channel multiplicity allowed per cluster.
     136             :         /// \note This effects the memory allocation required. Generally M*N number of
     137             :         ///   channel structures will be allocated, where M = fMaxChannelMult and
     138             :         ///   N = the maximum number of hits that can be filled into the output buffers.
     139             :         void MaxChannelMultiplicity(bool value) { fMaxChannelMult = value; }
     140             :         
     141             :         /// Returns the DDL number the component expects data to be received from.
     142             :         AliHLTInt32_t DDLNumber() const { return fDDL; }
     143             :         
     144             :         /// Sets the DDL number the component expects data to be received from.
     145           0 :         void DDLNumber(AliHLTInt32_t value) { fDDL = (value & 0x1F); }  // 0x1F forces value into our required range.
     146             : 
     147             :         bool InitDetElemInDDLArray();
     148             :         bool DeInitDetElemInDDLArray();
     149             : 
     150             : private:
     151             : 
     152             :         static const AliHLTInt32_t fgkDetectorId;      // DDL Offset
     153             :         static const AliHLTInt32_t fgkDDLOffSet;       // DDL Offset
     154             :         static const AliHLTInt32_t fgkNofDDL;          // Number of DDL 
     155             :         static const AliHLTInt32_t fgkDDLHeaderSize;   // DDL header size
     156             :         static const AliHLTInt32_t fgkLutLine;         // nof Line in LookupTable
     157             :         static const AliHLTInt32_t fgkMaxNofDataPerDetElem;         // maximum allowed data points per detlem
     158             :         static const AliHLTInt32_t fgkNofDetElemInDDL[20] ;         // nof Detelem in a given ddl
     159             :         static const AliHLTInt32_t fgkMinDetElemIdInDDL[20] ;       // the detelem which has minimum value in ddl
     160             : 
     161             :         AliHLTMUONHitReconstructor(const AliHLTMUONHitReconstructor& rhs); // copy constructor
     162             :         AliHLTMUONHitReconstructor& operator=(const AliHLTMUONHitReconstructor& rhs); // assignment operator
     163             : 
     164             :         struct AliHLTMUONPad
     165             :         {
     166             :                 AliHLTInt32_t fDetElemId;  // The detector element ID of the pad.
     167             :                 AliHLTInt32_t fIX, fIY;  // The X,Y number of the pad.
     168             :                 AliHLTFloat32_t fRealX, fRealY, fRealZ;   // The real coordinate of the pad.
     169             :                 AliHLTFloat32_t fHalfPadSize; // half padsize in X and Y
     170             :                 AliHLTFloat32_t fPadSizeXY; // padsize in Y for bending plane and X for nonbending
     171             :                 AliHLTInt32_t fPlane;   // The plane and PCB zone ID numbers.
     172             :                 AliHLTFloat32_t fCharge;  // The charge measured on the pad.
     173             :                 AliHLTInt32_t fBusPatch;  // The bus patch of the raw data word from the DDL stream.
     174             :                 AliHLTUInt32_t fRawData;  // The raw data word from the DDL stream.
     175             :         };
     176             :         
     177             : 
     178             :         class AliHLTMUONRawDecoder : public AliMUONTrackerDDLDecoderEventHandler, public AliHLTLogging
     179             :         {
     180             :         public:
     181             :         
     182             :                 AliHLTMUONRawDecoder();
     183             :                 virtual ~AliHLTMUONRawDecoder();
     184             :                 
     185             :                 void OnData(UInt_t dataWord, bool parityError);
     186             :                 void OnNewBusPatch(const AliMUONBusPatchHeaderStruct* header, const void* data) ;
     187             :                 
     188             :                 void OnNewBuffer(const void* buffer, UInt_t bufferSize);
     189             :                 void OnError(ErrorCode code, const void* location);
     190             :                 
     191           0 :                 void SetDCCut(AliHLTInt32_t dcCut) {fDCCut = dcCut;}
     192           0 :                 void SetPadData(AliHLTMUONPad* const padData) {fPadData = padData;}
     193           0 :                 void SetLookUpTable(const AliHLTMUONHitRecoLutRow* lookUpTableData) {fkLookUpTableData = lookUpTableData;}
     194             : 
     195           0 :                 void SetIdManuChannelToEntry(const IdManuChannelToEntry* idToEntry) {fkIdToEntry = idToEntry;}
     196           0 :                 void SetMaxEntryPerBusPatch(const MaxEntryPerBusPatch* maxEntryPerBP) {fkMaxEntryPerBusPatch = maxEntryPerBP;}
     197             : 
     198             :                 AliHLTInt32_t DDLNumber() const { return fDDL; }
     199           0 :                 void DDLNumber(AliHLTInt32_t value) { fDDL = (value & 0x1F); }  // 0x1F forces value into our required range.
     200             :                 // The following two methods have to called after set the ddl
     201           0 :                 void SetNofFiredDetElemId(AliHLTUInt16_t* const nofDataInDetElem) {fNofDataInDetElem = nofDataInDetElem;}
     202           0 :                 void SetMaxFiredPerDetElem(AliHLTUInt16_t** const dataCountListPerDetElem) {fDataCountListPerDetElem = dataCountListPerDetElem;}                
     203             : 
     204             : 
     205           0 :                 AliHLTInt32_t GetDataCount() const {return fDataCount;}
     206             :                 
     207             :                 /**
     208             :                  * Returns true if the OnError handler method will only generate warning
     209             :                  * messages and rather than error messages.
     210             :                  */
     211             :                 bool WarnOnly() const { return fWarnOnly; }
     212             :                 
     213             :                 /**
     214             :                  * Sets the flag indicating if the OnError method should only generate
     215             :                  * warnings rather than error messages.
     216             :                  */
     217           0 :                 void WarnOnly(bool value) { fWarnOnly = value; }
     218             :                 
     219             :                 /**
     220             :                  * Returns true if ADC digits with parity errors are skipped.
     221             :                  */
     222             :                 bool SkipParityErrors() const { return fSkipParityErrors; }
     223             :                 
     224             :                 /**
     225             :                  * Sets the flag indicating if ADC digits with parity errors are skipped.
     226             :                  */
     227           0 :                 void SkipParityErrors(bool value) { fSkipParityErrors = value; }
     228             :                 
     229             :                 /**
     230             :                  * Returns true if messages about parity errors are not printed.
     231             :                  */
     232           0 :                 bool DontPrintParityErrors() const { return fDontPrintParityErrors; }
     233             :                 
     234             :                 /**
     235             :                  * Sets the flag indicating if messages about parity errors are not printed.
     236             :                  */
     237           0 :                 void DontPrintParityErrors(bool value) { fDontPrintParityErrors = value; }
     238             :                 
     239             :                 /**
     240             :                  * Returns true if parity error messages are printed as warnings.
     241             :                  */
     242             :                 bool PrintParityErrorAsWarning() const { return fPrintParityErrorAsWarning; }
     243             :                 
     244             :                 /**
     245             :                  * Sets the flag indicating if parity error messages are printed as warnings.
     246             :                  */
     247           0 :                 void PrintParityErrorAsWarning(bool value) { fPrintParityErrorAsWarning = value; }
     248             :                 
     249             :                 /**
     250             :                  * Returns true if a parity error was found during the last call to Decode.
     251             :                  */
     252           0 :                 bool ParityErrorFound() const { return fParityErrorFound; }
     253             :                 
     254             :                 /**
     255             :                  * Returns true if a non-parity error was found during the last call to Decode.
     256             :                  */
     257           0 :                 bool NonParityErrorFound() const { return fNonParityErrorFound; }
     258             :         
     259             :         private:
     260             :                 // Do not allow copying of this class.
     261             :                 /// Not implemented
     262             :                 AliHLTMUONRawDecoder(const AliHLTMUONRawDecoder& rhs); // copy constructor
     263             :                 /// Not implemented
     264             :                 AliHLTMUONRawDecoder& operator=(const AliHLTMUONRawDecoder& rhs); // assignment operator
     265             :         
     266             :                 const void* fkBufferStart;   // Pointer to the start of the current DDL payload buffer.
     267             :                 AliHLTInt32_t fBusPatchId;  // buspatchId
     268             :                 AliHLTInt32_t fDCCut;       // DC Cut value
     269             :                 AliHLTMUONPad* fPadData;    // pointer to the array containing the information of each padhits
     270             :                 const AliHLTMUONHitRecoLutRow* fkLookUpTableData;   // pointer to the array of Lookuptable data
     271             :                 /* AliHLTInt32_t* fNofFiredDetElem;         // counter for detector elements that are fired  */
     272             :                 /* AliHLTInt32_t* fMaxFiredPerDetElem;      // array for detector elements that are fired  */
     273             :                 const IdManuChannelToEntry* fkIdToEntry;  // Mapping between Linenumber to IdManuChannel;
     274             :                 const MaxEntryPerBusPatch* fkMaxEntryPerBusPatch;   // Maximum allowed entry per Buspatch.
     275             :                 
     276             :                 AliHLTInt32_t fDDL;                 // DDL number
     277             :                 AliHLTInt32_t fDataCount;           // Data Counter
     278             :                 AliHLTInt32_t fPrevDetElemId;       // previous detection elementId
     279             :                 AliHLTInt32_t fPadCharge;           // pedestal subtracted pad charge
     280             :                 AliHLTFloat32_t fCharge;            //calibrated pad charge 
     281             :                 AliHLTInt32_t fIdManuChannel;       // id manu channel
     282             :                 AliHLTInt32_t fLutEntry;            // i-th entry in lookuptable
     283             :                 
     284             :                 AliHLTUInt16_t **fDataCountListPerDetElem;               ///< List of datacounts associated with given ddl
     285             :                 AliHLTUInt16_t *fNofDataInDetElem;                       ///< Nof datacount in a ddl
     286             :                 bool fWarnOnly;  ///< Flag indicating if the OnError method should generate warnings rather than error messages.
     287             :                 bool fSkipParityErrors;  ///< Flag indicating if ADC digits with parity errors should be skipped.
     288             :                 bool fDontPrintParityErrors;  ///< Flag for controlling if messages about parity errors should be printed.
     289             :                 bool fPrintParityErrorAsWarning;  ///< Flag for controlling if parity error messages are printed as warnings.
     290             :                 bool fParityErrorFound;  ///< Flag if a parity error was found after a decoding pass.
     291             :                 bool fNonParityErrorFound;  ///< Flag which indicates if a non parity error code was found after a decoding pass.
     292             :                 bool fIsMuchNoisy;  ///< tag for noisy buspatch.
     293             :         };
     294             : 
     295             :         AliMUONTrackerDDLDecoder<AliHLTMUONRawDecoder> fHLTMUONDecoder; // robust HLTMUON Decoder
     296             :         
     297             :         AliHLTInt32_t fkBlockHeaderSize;      // Block header size
     298             :         AliHLTInt32_t fkDspHeaderSize;        // DSP header size
     299             :         AliHLTInt32_t fkBuspatchHeaderSize;   // buspatch header size
     300             :         
     301             :         AliHLTInt32_t fDCCut;                 // DC Cut value
     302             :         
     303             :         AliHLTMUONPad* fPadData;  // pointer to the array containing the information of each padhits
     304             :         const AliHLTMUONHitRecoLutRow* fkLookUpTableData;  // pointer to the array of Lookuptable data (The memory is not owned by this component).
     305             :         
     306             :         AliHLTMUONRecHitStruct* fRecPoints;      // Reconstructed hits
     307             :         AliHLTUInt32_t *fRecPointsCount;         // nof reconstructed hit.
     308             :         AliHLTUInt32_t fMaxRecPointsCount;       // max nof reconstructed hit.
     309             :         
     310             :         AliHLTMUONClusterStruct* fClusters;  // Array of output cluster infromation.
     311             :         AliHLTUInt32_t fClusterCount;       // Number of elemenets in fClusters.
     312             :         AliHLTUInt32_t fMaxClusters;        // Maximum number of clusters in fClusters.
     313             :         bool fGenerateClusterInfo;   // Flag indicating if extra cluster information should be generated.
     314             :         AliHLTInt32_t fNewClusterId;  // The ID to use for a new cluster structure.
     315             :         AliHLTInt32_t fDDL;   // The source DDL number of the raw data.
     316             :         
     317             :         AliHLTMUONChannelStruct* fChannels;  // Array of output channel infromation.
     318             :         AliHLTUInt32_t fChannelCount;       // Number of elemenets in fChannels.
     319             :         AliHLTUInt32_t fMaxChannels;        // Maximum number of channels in fChannels.
     320             :         bool fGenerateChannelInfo;   // Flag indicating if extra channel information should be generated.
     321             :         AliHLTUInt32_t fMaxChannelMult;  // Indicates the maximum channel multiplicity per cluster allowed.
     322             :         
     323             :         AliHLTInt32_t fCentralCountB, fCentralCountNB;   // centeral hits.
     324             :         AliHLTInt32_t fDigitPerDDL;                      // Total nof Digits perDDL.
     325             : 
     326             :         AliHLTUInt16_t **fDataCountListPerDetElem;               // List of datacounts associated with given ddl
     327             :         AliHLTUInt16_t *fNofDataInDetElem;                       // Nof datacount in a ddl
     328             :         AliHLTInt32_t *fCentralChargeB, *fCentralChargeNB;       // pointer to an array of central hit
     329             :         AliHLTFloat32_t *fRecX, *fRecY;                          // pointer to an array of reconstructed hit
     330             :         AliHLTFloat32_t *fAvgChargeX, *fAvgChargeY;              // average charge on central pad found using CG method
     331             :         AliHLTFloat32_t *fTotChargeX, *fTotChargeY;              // Total charge in bending and nonbending direction
     332             :         AliHLTInt32_t *fNofBChannel, *fNofNBChannel;             // number of channels bending and non-bending.
     333             :         AliHLTInt32_t *fNofYNeighbour;                           // number of neighbour pad in y direction, needed for y-resolution correction
     334             :         AliHLTInt32_t fGetIdTotalData[336][237][2];              // an array of idManuChannel with argument of centralX, centralY and planeType.
     335             :         //AliHLTInt32_t fNofFiredDetElem,fMaxFiredPerDetElem[130];  // counter for detector elements that are fired
     336             :         const IdManuChannelToEntry* fkIdToEntry;   // Mapping between Linenumber to IdManuChannel (The object is not owned by this component).
     337             :         const MaxEntryPerBusPatch* fkMaxEntryPerBusPatch;   // Maximum allowed entry per Buspatch.
     338             :         
     339             :         ERecoveryMode fRecoveryMode;  ///< The recovery mode for the decoder.
     340             :         
     341             :         bool DecodeDDL(AliHLTUInt32_t* rawData, AliHLTUInt32_t rawDataSize);
     342             :         void FindCentralHits(AliHLTInt32_t iDet);
     343             :         bool FindRecHits();
     344             :         void RecXRecY();
     345             :         bool MergeSlatRecHits();
     346             :         bool MergeQuadRecHits();
     347             :         void Clear();
     348             : 
     349             : };
     350             : 
     351             : #endif // ALIHLTMUONHITRECONSTRUCTOR_H

Generated by: LCOV version 1.11