Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
200 changes: 101 additions & 99 deletions DataFormats/HGCDigi/interface/HGCSample.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,118 +10,120 @@
@short wrapper for a data word
*/

class HGCSample {
public:
enum HGCSampleMasks {
kThreshMask = 0x1,
kModeMask = 0x1,
kToAValidMask = 0x1,
kGainMask = 0xf,
kToAMask = 0x3ff,
kDataMask = 0xfff
};
enum HGCSampleShifts {
kThreshShift = 31,
kModeShift = 30,
kToAValidShift = 29,
kToGainShift = 22,
kToAShift = 12,
kDataShift = 0
};

/**
namespace io_v1 {
class HGCSample {
public:
enum HGCSampleMasks {
kThreshMask = 0x1,
kModeMask = 0x1,
kToAValidMask = 0x1,
kGainMask = 0xf,
kToAMask = 0x3ff,
kDataMask = 0xfff
};
enum HGCSampleShifts {
kThreshShift = 31,
kModeShift = 30,
kToAValidShift = 29,
kToGainShift = 22,
kToAShift = 12,
kDataShift = 0
};

/**
@short CTOR
*/
HGCSample() : value_(0) {}
HGCSample(uint32_t value) : value_(value) {}
HGCSample(const HGCSample& o) : value_(o.value_) {}
HGCSample& operator=(const HGCSample&) = default;
HGCSample() : value_(0) {}
HGCSample(uint32_t value) : value_(value) {}
HGCSample(const HGCSample& o) : value_(o.value_) {}
HGCSample& operator=(const HGCSample&) = default;

/**
/**
@short setters
*/
void setThreshold(bool thr) { setWord(thr, kThreshMask, kThreshShift); }
void setMode(bool mode) { setWord(mode, kModeMask, kModeShift); }
void setGain(uint16_t gain) { setWord(gain, kGainMask, kToGainShift); }
void setToA(uint16_t toa) { setWord(toa, kToAMask, kToAShift); }
void setData(uint16_t data) { setWord(data, kDataMask, kDataShift); }
void setToAValid(bool toaFired) { setWord(toaFired, kToAValidMask, kToAValidShift); }

void set(bool thr, bool mode, uint16_t gain, uint16_t toa, uint16_t data) {
setThreshold(thr);
setMode(mode);
setGain(gain);
setToA(toa);
setData(data);
}

void print(std::ostream& out = std::cout) {
out << "THR: " << threshold() << " Mode: " << mode() << " ToA: " << toa() << " Data: " << data() << " Raw=0x"
<< std::hex << raw() << std::dec << std::endl;
}

/**
void setThreshold(bool thr) { setWord(thr, kThreshMask, kThreshShift); }
void setMode(bool mode) { setWord(mode, kModeMask, kModeShift); }
void setGain(uint16_t gain) { setWord(gain, kGainMask, kToGainShift); }
void setToA(uint16_t toa) { setWord(toa, kToAMask, kToAShift); }
void setData(uint16_t data) { setWord(data, kDataMask, kDataShift); }
void setToAValid(bool toaFired) { setWord(toaFired, kToAValidMask, kToAValidShift); }

void set(bool thr, bool mode, uint16_t gain, uint16_t toa, uint16_t data) {
setThreshold(thr);
setMode(mode);
setGain(gain);
setToA(toa);
setData(data);
}

void print(std::ostream& out = std::cout) {
out << "THR: " << threshold() << " Mode: " << mode() << " ToA: " << toa() << " Data: " << data() << " Raw=0x"
<< std::hex << raw() << std::dec << std::endl;
}

/**
@short getters
*/
uint32_t raw() const { return value_; }
bool threshold() const { return getWord(kThreshMask, kThreshShift); }
bool mode() const { return getWord(kModeMask, kModeShift); }
uint16_t gain() const { return getWord(kGainMask, kToGainShift); }
uint16_t toa() const { return getWord(kToAMask, kToAShift); }
uint16_t data() const { return getWord(kDataMask, kDataShift); }
bool getToAValid() const { return getWord(kToAValidMask, kToAValidShift); }
uint32_t operator()() { return value_; }

/**
uint32_t raw() const { return value_; }
bool threshold() const { return getWord(kThreshMask, kThreshShift); }
bool mode() const { return getWord(kModeMask, kModeShift); }
uint16_t gain() const { return getWord(kGainMask, kToGainShift); }
uint16_t toa() const { return getWord(kToAMask, kToAShift); }
uint16_t data() const { return getWord(kDataMask, kDataShift); }
bool getToAValid() const { return getWord(kToAValidMask, kToAValidShift); }
uint32_t operator()() { return value_; }

/**
@short Data Model Evolution
*/
static uint32_t convertV9ToV10(uint32_t valueOldForm, bool toaFiredOldForm) {
// combine value&toaFired from the dataformat V9-or-earlier
// from persisted objects
// to produce a value_ compatible w/ the V10 format
// i.e.
// 1) shift the 10 toa bits by 1 bit
// 2) insert the toaFired into _value
// NOTE: nothing can be done for the gain bits:
// info about gain was not preswent in V9-or-earlier, and will be left to 0 in V10
// root doc: https://root.cern.ch/root/html/io/DataModelEvolution.html
// see PR 28349 for more info

// V9 Format: tm--------tttttttttt-dddddddddddd
uint32_t valueNewForm(valueOldForm);

// set to 0 the 17 bits bits (between 13 and 29 - both included)
valueNewForm &= ~(0x3FFFF << kToAShift);

// copy toa to start from bit 13
valueNewForm |= ((valueOldForm >> 13) & kToAMask) << kToAShift;

// set 1 bit toaFiredOldForm in position 30
valueNewForm |= (toaFiredOldForm & kToAValidMask) << kToAValidShift;

return valueNewForm;
}

private:
/**
static uint32_t convertV9ToV10(uint32_t valueOldForm, bool toaFiredOldForm) {
// combine value&toaFired from the dataformat V9-or-earlier
// from persisted objects
// to produce a value_ compatible w/ the V10 format
// i.e.
// 1) shift the 10 toa bits by 1 bit
// 2) insert the toaFired into _value
// NOTE: nothing can be done for the gain bits:
// info about gain was not preswent in V9-or-earlier, and will be left to 0 in V10
// root doc: https://root.cern.ch/root/html/io/DataModelEvolution.html
// see PR 28349 for more info

// V9 Format: tm--------tttttttttt-dddddddddddd
uint32_t valueNewForm(valueOldForm);

// set to 0 the 17 bits bits (between 13 and 29 - both included)
valueNewForm &= ~(0x3FFFF << kToAShift);

// copy toa to start from bit 13
valueNewForm |= ((valueOldForm >> 13) & kToAMask) << kToAShift;

// set 1 bit toaFiredOldForm in position 30
valueNewForm |= (toaFiredOldForm & kToAValidMask) << kToAValidShift;

return valueNewForm;
}

private:
/**
@short wrapper to reset words at a given position
*/
void setWord(uint16_t word, HGCSampleMasks mask, HGCSampleShifts shift) {
// mask and shift bits
const uint32_t masked_word = (word & mask) << shift;
void setWord(uint16_t word, HGCSampleMasks mask, HGCSampleShifts shift) {
// mask and shift bits
const uint32_t masked_word = (word & mask) << shift;

//clear to 0 bits which will be set by word
value_ &= ~(mask << shift);
//clear to 0 bits which will be set by word
value_ &= ~(mask << shift);

//now set bits
value_ |= (masked_word);
}
//now set bits
value_ |= (masked_word);
}

uint32_t getWord(HGCSampleMasks mask, HGCSampleShifts shift) const { return ((value_ >> shift) & mask); }

// a 32-bit word
// V10 Format: tmt---ggggttttttttttdddddddddddd
uint32_t value_;
};
uint32_t getWord(HGCSampleMasks mask, HGCSampleShifts shift) const { return ((value_ >> shift) & mask); }

// a 32-bit word
// V10 Format: tmt---ggggttttttttttdddddddddddd
uint32_t value_;
};
} // namespace io_v1
using HGCSample = io_v1::HGCSample;
#endif
20 changes: 7 additions & 13 deletions DataFormats/HGCDigi/src/classes_def.xml
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
<lcgdict>
<class name="HGCSample" ClassVersion="10">
<version ClassVersion="10" checksum="2120380856"/>
<ioread sourceClass = "HGCSample" version="[-9]" targetClass="HGCSample" source="uint32_t value_; bool toaFired_;" target="value_">
<![CDATA[
HGCSample tmp(HGCSample::convertV9ToV10(onfile.value_, onfile.toaFired_));
*newObj=tmp;
]]>
</ioread>
<class name="io_v1::HGCSample" ClassVersion="3">
<version ClassVersion="3" checksum="690571832"/>
</class>

<class name="std::vector<HGCSample>"/>
<class name="std::vector<io_v1::HGCSample>"/>

<!-- Not specific -->
<class name="HGCDataFrame<DetId,HGCSample>"/>
<class name="std::vector<HGCDataFrame<DetId,HGCSample> >"/>
<class name="edm::SortedCollection<HGCDataFrame<DetId,HGCSample>, edm::StrictWeakOrdering<HGCDataFrame<DetId,HGCSample> > >"/>
<class name="edm::Wrapper<edm::SortedCollection<HGCDataFrame<DetId,HGCSample>,edm::StrictWeakOrdering<HGCDataFrame<DetId,HGCSample> > > >" />
<class name="HGCDataFrame<DetId,io_v1::HGCSample>"/>
<class name="std::vector<HGCDataFrame<DetId,io_v1::HGCSample> >"/>
<class name="edm::SortedCollection<HGCDataFrame<DetId,io_v1::HGCSample>, edm::StrictWeakOrdering<HGCDataFrame<DetId,io_v1::HGCSample> > >"/>
<class name="edm::Wrapper<edm::SortedCollection<HGCDataFrame<DetId,io_v1::HGCSample>,edm::StrictWeakOrdering<HGCDataFrame<DetId,io_v1::HGCSample> > > >" />

</lcgdict>