EmCandCatagory

GctFormatTranslateBase

JetCandCategory

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156
#ifndef GctFormatTranslateBase_h_
#define GctFormatTranslateBase_h_

// C++ includes
#include <map>
#include <utility>
#include <string>

// CMSSW includes
#include "DataFormats/FEDRawData/interface/FEDRawDataCollection.h"
#include "L1Trigger/TextToDigi/interface/SourceCardRouting.h"
#include "EventFilter/GctRawToDigi/src/GctBlockHeader.h"
#include "EventFilter/GctRawToDigi/src/GctUnpackCollections.h"

/*!
* \class GctFormatTranslateBase
* \brief Abstract interface for RawToDigi/DigiToRaw conversions of GCT data.
* 
* This class provides the common interface/functionality for the various
* concrete classes that can translate to/from specific RAW formats.
*
* \author Robert Frazier
*/

class GctFormatTranslateBase {
public:
  /// Constructor.
  /*! \param hltMode - set true to unpack only BX zero and GCT output data (i.e. to run as quick as possible).
   *  \param unpackSharedRegions - this is a commissioning option to unpack the shared RCT calo regions. */
  explicit GctFormatTranslateBase(bool hltMode = false, bool unpackSharedRegions = false);

  virtual ~GctFormatTranslateBase();  ///< Destructor.

  /// Set the pointer to the unpack collections
  void setUnpackCollections(GctUnpackCollections* const collections) { m_collections = collections; }

  // Set the bunch crossing ID that will be put into the block headers when packing raw data (i.e. Digi -> Raw).
  void setPackingBxId(uint32_t bxId) { m_packingBxId = bxId; }

  // Set the event ID that will be put into the block headers when packing raw data (i.e. Digi -> Raw).
  void setPackingEventId(uint32_t eventId) { m_packingEventId = eventId; }

  /// Generate a block header from four 8-bit values
  virtual GctBlockHeader generateBlockHeader(const unsigned char* data) const = 0;

  /// Get block description
  const std::string& getBlockDescription(const GctBlockHeader& header) const;

  /// Get digis from the block - will return true if it succeeds, false otherwise.
  virtual bool convertBlock(const unsigned char* d, const GctBlockHeader& hdr) = 0;

protected:
  /* PROTECTED TYPDEFS, ENUMS, AND CLASS CONSTANTS. */

  /// An enum of the EM candidate types.
  /*! Note that the order here mimicks the order in the RAW data format. */
  enum EmCandCatagory { NON_ISO_EM_CANDS, ISO_EM_CANDS, NUM_EM_CAND_CATEGORIES };

  /// Useful enumeration for jet candidate pack/unpack.
  /*! Note that the order here mimicks the order in the RAW data format. */
  enum JetCandCategory { TAU_JETS, FORWARD_JETS, CENTRAL_JETS, NUM_JET_CATEGORIES };

  typedef std::map<unsigned int, unsigned int> BlockLengthMap;    ///< Block ID to Block Length map
  typedef std::pair<unsigned int, unsigned int> BlockLengthPair;  ///< Block ID/length pair
  typedef std::map<unsigned int, std::string> BlockNameMap;       ///< Block ID to Block Description map
  typedef std::pair<unsigned int, std::string> BlockNamePair;     ///< Block ID/Description pair

  /// Typedef for mapping block ID to RCT crate.
  typedef std::map<unsigned int, unsigned int> BlkToRctCrateMap;

  /*! A typedef that holds the inclusive lower and upper bounds of pipeline
   *  gct trigger object pair number for isolated EM candidates.
   *  I.e. if the first and second trig object pair in the pipeline payload
   *  are isolated cands (4 iso in total), then the IsoBoundaryPair would
   *  be (0,1). */
  typedef std::pair<unsigned int, unsigned int> IsoBoundaryPair;

  /// A typdef for mapping Block IDs to IsoBoundaryPairs.
  typedef std::map<unsigned int, IsoBoundaryPair> BlockIdToEmCandIsoBoundMap;

  /* PROTECTED METHODS */

  /* Static data member access methods */
  virtual const BlockLengthMap& blockLengthMap() const = 0;  ///< get the static block ID to block-length map.

  virtual const BlockNameMap& blockNameMap() const = 0;  ///< get the static block ID to blockname map.

  virtual const BlkToRctCrateMap& rctEmCrateMap()
      const = 0;  ///< get static the block ID to RCT crate map for electrons.

  virtual const BlkToRctCrateMap& rctJetCrateMap() const = 0;  ///< get the static block ID to RCT crate map for jets

  virtual const BlockIdToEmCandIsoBoundMap& internEmIsoBounds()
      const = 0;  ///< get the static intern EM cand isolated boundary map.

  /* Data member access methods */
  GctUnpackCollections* const colls() const {
    return m_collections;
  }  ///< Protected access to the GCT Unpack Collections.
  bool hltMode() const { return m_hltMode; }  ///< Protected interface to get HLT optimisation mode flag.
  bool unpackSharedRegions() const {
    return m_unpackSharedRegions;
  }  /// Protected interface to the unpackSharedRegions commissioning option.
  const SourceCardRouting& srcCardRouting() const {
    return m_srcCardRouting;
  }  ///< Protected access to SourceCardRouting.
  const uint32_t packingBxId() const { return m_packingBxId; }        ///< Get the BxId to be used when packing data.
  const uint32_t packingEventId() const { return m_packingEventId; }  ///< Get the EventId to be used when packing data.

  /* Other general methods */
  /// Get a specific jet candandiate collection using the JetCandCategory enumeration.
  L1GctJetCandCollection* const gctJets(const unsigned cat) const;

  /// Returns a raw 32-bit header word generated from the blockId, number of time samples, bunch-crossing and event IDs.
  virtual uint32_t generateRawHeader(const uint32_t blockId,
                                     const uint32_t nSamples,
                                     const uint32_t bxId,
                                     const uint32_t eventId) const = 0;

  /// Writes a raw block header into the raw data array for a given block ID and number of time-samples.
  /*! BxId and EventId values for the raw header are set via the setPackingBxId() and setPackingEventId() methods. */
  void writeRawHeader(unsigned char* data, uint32_t blockId, uint32_t nSamples) const;

  /// Performs checks on the block header to see if the block is possible to unpack or not.
  bool checkBlock(const GctBlockHeader& hdr) const;

  /// The null unpack function - obviously common to all formats.
  void blockDoNothing(const unsigned char* d, const GctBlockHeader& hdr) {}

private:
  /* PRIVATE STATIC CONSTS */
  static const std::string INVALID_BLOCK_HEADER_STR;

  /* PRIVATE MEMBER DATA */

  /// Pointer to the output collections object.
  GctUnpackCollections* m_collections;

  /// If true, unpack only BX zero and GCT output data (i.e. to run as quickly as possible)
  bool m_hltMode;

  /// If true, the shared RCT Calo regions will be unpacked also
  /*! This is a commissioning option only - may not be relevant to all concrete implementations! */
  bool m_unpackSharedRegions;

  /// Source card mapping info
  SourceCardRouting m_srcCardRouting;

  /// The bunch-crossing ID to be used by the data packing methods
  uint32_t m_packingBxId;

  /// The event ID to be used by the data packing methods
  uint32_t m_packingEventId;
};

#endif /* GctFormatTranslateBase_h_ */