@@ -44,6 +44,21 @@ const float
4444 ENERGY_RESOLUTION_TRU = ENERGY_TRUNCATION / ENERGY_BITS,
4545 ENERGY_RESOLUTION_LEDMON = ENERGY_TRUNCATION / ENERGY_BITS;
4646}
47+
48+ namespace v2
49+ {
50+ const float
51+ ENERGY_BITS = static_cast <float >(0x3FFF ),
52+ SAFETYMARGIN = 0.2 ,
53+ HGLGTRANSITION = o2::emcal::constants::OVERFLOWCUT * o2::emcal::constants::EMCAL_ADCENERGY,
54+ OFFSET_LG = HGLGTRANSITION - SAFETYMARGIN,
55+ ENERGY_TRUNCATION = 250 .,
56+ ENERGY_RESOLUTION_LG = (ENERGY_TRUNCATION - OFFSET_LG) / ENERGY_BITS,
57+ ENERGY_RESOLUTION_HG = HGLGTRANSITION / ENERGY_BITS,
58+ ENERGY_RESOLUTION_TRU = ENERGY_TRUNCATION / ENERGY_BITS,
59+ ENERGY_RESOLUTION_LEDMON = ENERGY_TRUNCATION / ENERGY_BITS;
60+
61+ }
4762} // namespace EnergyEncoding
4863
4964namespace DecodingV0
@@ -87,6 +102,10 @@ uint16_t Cell::getEnergyEncoded(EncoderVersion version) const
87102 case EncoderVersion::EncodingV1:
88103 energyBits = encodeEnergyV1 (mEnergy , mChannelType );
89104 break ;
105+
106+ case EncoderVersion::EncodingV2:
107+ energyBits = encodeEnergyV2 (mEnergy , mChannelType );
108+ break ;
90109 }
91110 return energyBits;
92111}
@@ -105,6 +124,9 @@ void Cell::setEnergyEncoded(uint16_t energyBits, uint16_t channelTypeBits, Encod
105124 case EncoderVersion::EncodingV1:
106125 mEnergy = decodeEnergyV1 (energyBits, static_cast <ChannelType_t>(channelTypeBits));
107126 break ;
127+ case EncoderVersion::EncodingV2:
128+ mEnergy = decodeEnergyV2 (energyBits, static_cast <ChannelType_t>(channelTypeBits));
129+ break ;
108130 }
109131}
110132
@@ -214,12 +236,55 @@ uint16_t Cell::encodeEnergyV1(float energy, ChannelType_t celltype)
214236 return static_cast <uint16_t >(std::round ((truncatedEnergy - energyOffset) / resolutionApplied));
215237};
216238
239+ uint16_t Cell::encodeEnergyV2 (float energy, ChannelType_t celltype)
240+ {
241+ double truncatedEnergy = energy;
242+ if (truncatedEnergy < 0 .) {
243+ truncatedEnergy = 0 .;
244+ } else if (truncatedEnergy > EnergyEncoding::v2::ENERGY_TRUNCATION) {
245+ truncatedEnergy = EnergyEncoding::v2::ENERGY_TRUNCATION;
246+ }
247+ float resolutionApplied = 0 ., energyOffset = 0 .;
248+ switch (celltype) {
249+ case ChannelType_t::HIGH_GAIN: {
250+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_HG;
251+ break ;
252+ }
253+ case ChannelType_t::LOW_GAIN: {
254+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_LG;
255+ energyOffset = EnergyEncoding::v2::OFFSET_LG;
256+ break ;
257+ }
258+ case ChannelType_t::TRU: {
259+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_TRU;
260+ break ;
261+ }
262+ case ChannelType_t::LEDMON: {
263+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_LEDMON;
264+ break ;
265+ }
266+ }
267+ return static_cast <uint16_t >(std::round ((truncatedEnergy - energyOffset) / resolutionApplied));
268+ };
269+
217270uint16_t Cell::V0toV1 (uint16_t energyBits, ChannelType_t celltype)
218271{
219272 auto decodedEnergy = decodeEnergyV0 (energyBits);
220273 return encodeEnergyV1 (decodedEnergy, celltype);
221274}
222275
276+ uint16_t Cell::V0toV2 (uint16_t energyBits, ChannelType_t celltype)
277+ {
278+ auto decodedEnergy = decodeEnergyV0 (energyBits);
279+ return encodeEnergyV2 (decodedEnergy, celltype);
280+ }
281+
282+ uint16_t Cell::V1toV2 (uint16_t energyBits, ChannelType_t celltype)
283+ {
284+ auto decodedEnergy = decodeEnergyV1 (energyBits, celltype);
285+ return encodeEnergyV2 (decodedEnergy, celltype);
286+ }
287+
223288float Cell::decodeTime (uint16_t timestampBits)
224289{
225290 return (static_cast <float >(timestampBits) * TimeEncoding::TIME_RESOLUTION) - TimeEncoding::TIME_SHIFT;
@@ -256,6 +321,32 @@ float Cell::decodeEnergyV1(uint16_t energyBits, ChannelType_t celltype)
256321 return (static_cast <float >(energyBits) * resolutionApplied) + energyOffset;
257322}
258323
324+ float Cell::decodeEnergyV2 (uint16_t energyBits, ChannelType_t celltype)
325+ {
326+ float resolutionApplied = 0 .,
327+ energyOffset = 0 .;
328+ switch (celltype) {
329+ case ChannelType_t::HIGH_GAIN: {
330+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_HG;
331+ break ;
332+ }
333+ case ChannelType_t::LOW_GAIN: {
334+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_LG;
335+ energyOffset = EnergyEncoding::v2::OFFSET_LG;
336+ break ;
337+ }
338+ case ChannelType_t::TRU: {
339+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_TRU;
340+ break ;
341+ }
342+ case ChannelType_t::LEDMON: {
343+ resolutionApplied = EnergyEncoding::v2::ENERGY_RESOLUTION_LEDMON;
344+ break ;
345+ }
346+ }
347+ return (static_cast <float >(energyBits) * resolutionApplied) + energyOffset;
348+ }
349+
259350void Cell::PrintStream (std::ostream& stream) const
260351{
261352 stream << " EMCAL Cell: Type " << getType () << " , Energy " << getEnergy () << " , Time " << getTimeStamp () << " , Tower " << getTower ();
0 commit comments