diff --git a/DataFormats/CSCDigi/interface/CSCShowerDigi.h b/DataFormats/CSCDigi/interface/CSCShowerDigi.h new file mode 100644 index 0000000000000..b07ec5c4c6a16 --- /dev/null +++ b/DataFormats/CSCDigi/interface/CSCShowerDigi.h @@ -0,0 +1,53 @@ +#ifndef DataFormats_CSCDigi_CSCShowerDigi_h +#define DataFormats_CSCDigi_CSCShowerDigi_h + +#include +#include +#include +#include + +class CSCShowerDigi { +public: + // Run-3 definitions as provided in DN-20-033 + enum Run3Shower { kInvalid = 0, kLoose = 1, kNominal = 2, kTight = 3 }; + enum BitMask { kInTimeMask = 0x2, kOutTimeMask = 0x2 }; + enum BitShift { kInTimeShift = 0, kOutTimeShift = 2 }; + + /// Constructors + CSCShowerDigi(const uint16_t inTimeBits, const uint16_t outTimeBits, const uint16_t cscID); + /// default + CSCShowerDigi(); + + /// clear this Shower + void clear() { bits_ = 0; } + + /// data + bool isValid() const; + + bool isLooseInTime() const; + bool isNominalInTime() const; + bool isTightInTime() const; + bool isLooseOutTime() const; + bool isNominalOutTime() const; + bool isTightOutTime() const; + + uint16_t bits() const { return bits_; } + uint16_t bitsInTime() const; + uint16_t bitsOutTime() const; + + uint16_t getCSCID() const { return cscID_; } + + /// set cscID + void setCSCID(const uint16_t c) { cscID_ = c; } + +private: + void setDataWord(const uint16_t newWord, uint16_t& word, const unsigned shift, const unsigned mask); + uint16_t getDataWord(const uint16_t word, const unsigned shift, const unsigned mask) const; + + uint16_t bits_; + // 4-bit CSC chamber identifier + uint16_t cscID_; +}; + +std::ostream& operator<<(std::ostream& o, const CSCShowerDigi& digi); +#endif diff --git a/DataFormats/CSCDigi/interface/CSCShowerDigiCollection.h b/DataFormats/CSCDigi/interface/CSCShowerDigiCollection.h new file mode 100644 index 0000000000000..f44152f1116d5 --- /dev/null +++ b/DataFormats/CSCDigi/interface/CSCShowerDigiCollection.h @@ -0,0 +1,10 @@ +#ifndef DataFormats_CSCDigi_CSCShowerDigiCollection_h +#define DataFormats_CSCDigi_CSCShowerDigiCollection_h + +#include "DataFormats/MuonDetId/interface/CSCDetId.h" +#include "DataFormats/CSCDigi/interface/CSCShowerDigi.h" +#include "DataFormats/MuonData/interface/MuonDigiCollection.h" + +typedef MuonDigiCollection CSCShowerDigiCollection; + +#endif diff --git a/DataFormats/CSCDigi/src/CSCShowerDigi.cc b/DataFormats/CSCDigi/src/CSCShowerDigi.cc new file mode 100644 index 0000000000000..7a4545d219340 --- /dev/null +++ b/DataFormats/CSCDigi/src/CSCShowerDigi.cc @@ -0,0 +1,51 @@ +#include "DataFormats/CSCDigi/interface/CSCShowerDigi.h" +#include "FWCore/MessageLogger/interface/MessageLogger.h" +#include +#include + +using namespace std; + +/// Constructors +CSCShowerDigi::CSCShowerDigi(const uint16_t bitsInTime, const uint16_t bitsOutTime, const uint16_t cscID) + : cscID_(cscID) { + setDataWord(bitsInTime, bits_, kInTimeShift, kInTimeMask); + setDataWord(bitsOutTime, bits_, kOutTimeShift, kOutTimeMask); +} + +/// Default +CSCShowerDigi::CSCShowerDigi() : bits_(0), cscID_(0) {} + +bool CSCShowerDigi::isValid() const { + // any loose shower is valid + return isLooseInTime() or isLooseOutTime(); +} + +bool CSCShowerDigi::isLooseInTime() const { return bitsInTime() >= kLoose; } + +bool CSCShowerDigi::isNominalInTime() const { return bitsInTime() >= kNominal; } + +bool CSCShowerDigi::isTightInTime() const { return bitsInTime() >= kTight; } + +bool CSCShowerDigi::isLooseOutTime() const { return bitsOutTime() >= kLoose; } + +bool CSCShowerDigi::isNominalOutTime() const { return bitsOutTime() >= kNominal; } + +bool CSCShowerDigi::isTightOutTime() const { return bitsOutTime() >= kTight; } + +uint16_t CSCShowerDigi::bitsInTime() const { return getDataWord(bits_, kInTimeShift, kInTimeMask); } + +uint16_t CSCShowerDigi::bitsOutTime() const { return getDataWord(bits_, kOutTimeShift, kOutTimeMask); } + +void CSCShowerDigi::setDataWord(const uint16_t newWord, uint16_t& word, const unsigned shift, const unsigned mask) { + // clear the old value + word &= ~(mask << shift); + + // set the new value + word |= newWord << shift; +} + +uint16_t CSCShowerDigi::getDataWord(const uint16_t word, const unsigned shift, const unsigned mask) const { + return (word >> shift) & mask; +} + +std::ostream& operator<<(std::ostream& o, const CSCShowerDigi& digi) { return o << "CSC Shower: " << digi.bits(); } diff --git a/DataFormats/CSCDigi/src/classes.h b/DataFormats/CSCDigi/src/classes.h index 879a26bef5055..e8cf57f4aa1e3 100644 --- a/DataFormats/CSCDigi/src/classes.h +++ b/DataFormats/CSCDigi/src/classes.h @@ -31,6 +31,8 @@ #include "DataFormats/CSCDigi/interface/CSCCLCTPreTriggerDigiCollection.h" #include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigi.h" #include "DataFormats/CSCDigi/interface/CSCALCTPreTriggerDigiCollection.h" +#include "DataFormats/CSCDigi/interface/CSCShowerDigi.h" +#include "DataFormats/CSCDigi/interface/CSCShowerDigiCollection.h" // dummy structs to ensure backward compatibility struct GEMCSCLCTDigi {}; diff --git a/DataFormats/CSCDigi/src/classes_def.xml b/DataFormats/CSCDigi/src/classes_def.xml index abf504d37a7e5..848aeeddd3639 100644 --- a/DataFormats/CSCDigi/src/classes_def.xml +++ b/DataFormats/CSCDigi/src/classes_def.xml @@ -37,6 +37,9 @@ + + + @@ -76,6 +79,7 @@ + @@ -95,6 +99,7 @@ + @@ -114,6 +119,7 @@ + @@ -134,6 +140,7 @@ + @@ -153,5 +160,6 @@ +