Skip to content
Snippets Groups Projects
Commit 7194d97f authored by Alexandru Bercuci's avatar Alexandru Bercuci
Browse files

move time representation in the TRD2D digi from clk to ns

parent e31c5bfc
No related branches found
No related tags found
1 merge request!2028Trd2d online - finner time calibration
......@@ -187,14 +187,9 @@ namespace cbm::algo::trd2d
MsContext ctx = {};
// define time wrt start of time slice in TRD/FASP clks [80 MHz]. Contains:
// - relative offset of the MS wrt the TS
// - FASP epoch offset for current CROB
// - TRD2D system offset wrt to experiment time (e.g. Bmon)
uint64_t time = uint64_t((msDescr.idx - tTimeslice - fParams.fSystemTimeOffset) / 12.5);
// Get parameters for current eq id.
//const uint8_t crob_id = fParams.fEqId;
// define time wrt start of time slice in TRD/FASP clks [80 MHz].
uint64_t time = uint64_t((msDescr.idx - tTimeslice) / 25); // guaranteed by CBM-DAQ
time <<= 1; // time expressed in 12.5 ns clks
// Get the number of complete words in the input MS buffer.
const uint32_t nwords = msDescr.size / 4;
......@@ -280,7 +275,7 @@ namespace cbm::algo::trd2d
// No need to extra check
double r, t;
int32_t dt;
const int32_t dtime = (*id).GetTimeDAQ() - lTime;
const int32_t dtime = (*id).GetTime() - lTime;
bool use(false);
if (abs(dtime) < 5) { // test message part of (last) digi
......@@ -291,7 +286,7 @@ namespace cbm::algo::trd2d
}
else if (lchT && t < 0.1) { // set T charge on an empty slot
(*id).SetCharge(lchT, r, +dtime);
(*id).SetTimeDAQ(uint64_t((*id).GetTimeDAQ() - dtime));
(*id).SetTime(lTime);
use = true;
}
}
......@@ -343,6 +338,12 @@ namespace cbm::algo::trd2d
// reset flags as they were used only to mark the correctly setting of the charge/digi
(*id).SetFlag(0, false);
(*id).SetFlag(1, false);
/** Convert global time from clk temporary representation to the finale version in [ns]
* Correct the time with the system time offset which is derived in calibration.*/
uint64_t gtime = (*id).GetTime() * fAsicClockPeriod;
gtime >>= 1;
if (gtime >= uint64_t(fParams.fSystemTimeOffset)) gtime -= fParams.fSystemTimeOffset;
(*id).SetTime(gtime);
outputDigis.emplace_back(std::move((*id)));
}
// clear digi buffer wrt the digi which was forwarded to higher structures
......@@ -369,11 +370,16 @@ namespace cbm::algo::trd2d
Result_t result = {};
MsContext ctx = {};
// define time wrt start of time slice in TRD/FASP clks [80 MHz]. Contains:
// - relative offset of the MS wrt the TS
// - FASP epoch offset for current CROB
// - TRD2D system offset wrt to experiment time
uint64_t time = uint64_t((msDescr.idx - tTimeslice - fParams.fSystemTimeOffset) * fAsicClockFreq);
// // define time wrt start of time slice in TRD/FASP clks [80 MHz]. Contains:
// // - relative offset of the MS wrt the TS
// // - FASP epoch offset for current CROB
// // - TRD2D system offset wrt to experiment time
// uint64_t time = uint64_t((msDescr.idx - tTimeslice - fParams.fSystemTimeOffset) * fAsicClockFreq);
//define the time in run as function of CBM 40MHz clk
uint64_t timeClk = (msDescr.idx - tTimeslice) / 25;
//convert to TRD2D 80MHz clk
timeClk <<= 1;
// Get the number of complete words in the input MS buffer.
const uint32_t nwords = msDescr.size / 4;
......@@ -399,12 +405,12 @@ namespace cbm::algo::trd2d
if (ctx.fMess.ch == 0) { // check word integrity
// clear buffer
if (vMess.size()) {
pushDigis(vMess, time, ctx);
pushDigis(vMess, timeClk, ctx);
}
vMess.clear();
lFaspOld = 0xff;
time += FASP_EPOCH_LENGTH;
timeClk += FASP_EPOCH_LENGTH;
}
else {
L_(error) << "FASP message[Epoch] with wrong signature.";
......@@ -416,7 +422,7 @@ namespace cbm::algo::trd2d
// PROCESS DATA MESSAGES
// clear buffer when switching to other FASP
if (ctx.fMess.fasp != lFaspOld) {
if (vMess.size()) pushDigis(vMess, time, ctx);
if (vMess.size()) pushDigis(vMess, timeClk, ctx);
vMess.clear();
lFaspOld = ctx.fMess.fasp;
}
......@@ -432,6 +438,12 @@ namespace cbm::algo::trd2d
for (uint16_t ipad(0); ipad < NFASPMOD * NFASPPAD; ipad++) {
if (!ctx.fRobDigi[ipad].size()) continue;
for (auto id : ctx.fRobDigi[ipad]) {
/** Convert global time from clk temporary representation to the finale version in [ns]
* Correct the time with the system time offset which is derived in calibration.*/
uint64_t gtime = id.GetTime() * fAsicClockPeriod;
gtime >>= 1;
if (gtime >= uint64_t(fParams.fSystemTimeOffset)) gtime -= fParams.fSystemTimeOffset;
id.SetTime(gtime);
outputDigis.emplace_back(std::move(id));
}
}
......@@ -462,7 +474,7 @@ namespace cbm::algo::trd2d
if (calPar.noise.fSignalThres && imess.data <= calPar.noise.fSignalThres) continue;
const uint32_t pad = mch / 2;
const bool hasPairingR = bool(chPar.fPadAddress > 0);
const uint64_t lTime = time + calPar.fDaqOffset + imess.tlab;
const uint64_t lTime = time + imess.tlab + calPar.fDaqOffset;
const uint16_t sgn =
uint16_t((imess.data - fParams.fRefSignal) * calPar.fGainFee - calPar.fBaseline + fParams.fRefSignal);
const uint16_t lchR = hasPairingR ? sgn : 0;
......@@ -482,7 +494,7 @@ namespace cbm::algo::trd2d
// No need to extra check
double r, t;
int32_t dt;
const int32_t dtime = id.GetTimeDAQ() - lTime;
const int32_t dtime = id.GetTime() - lTime;
bool use(false);
if (abs(dtime) < 5) { // test message part of (last) digi
r = id.GetCharge(t, dt);
......@@ -492,7 +504,7 @@ namespace cbm::algo::trd2d
}
else if (lchT && t < 0.1) { // set T charge on an empty slot
id.SetCharge(lchT, r, +dtime);
id.SetTimeDAQ(uint64_t(id.GetTimeDAQ() - dtime));
id.SetTime(lTime);
use = true;
}
}
......
......@@ -44,6 +44,9 @@ namespace cbm::algo::trd2d
kNone
};
/** @brief Clock period of FASP 12.5ns. Use 25ns follow by division by 2*/
static constexpr uint fAsicClockPeriod = 25;
/** @brief Data structure for unpacking the FASP word */
// Constants
/** @brief Bytes per FASP frame stored in the microslices (32 bits words)
......@@ -308,9 +311,6 @@ namespace cbm::algo::trd2d
bool pushDigis(std::vector<FaspMessage> messages, const uint64_t time, MsContext& ctx) const;
UnpackPar fParams = {}; ///< Parameter container
/** @brief Clock frequency of FASP in 0.08 GHz. HW also supports 0.04 GHz*/
static constexpr float fAsicClockFreq = 0.08;
};
} // namespace cbm::algo::trd2d
......@@ -251,22 +251,6 @@ void CbmTrdDigi::SetFlag(const int32_t iflag, bool set)
CLRBIT(fInfo, fgkFlgOffset + iflag);
}
//_________________________________________________________________________________
void CbmTrdDigi::SetTime(double t)
{
switch (GetType()) {
case eCbmTrdAsicType::kFASP: {
fTime = uint64_t(ceil(t / Clk(GetType())));
break;
}
case eCbmTrdAsicType::kSPADIC: {
fTime = static_cast<uint64_t>(t);
break;
}
case eCbmTrdAsicType::kNTypes: return;
}
}
//_________________________________________________________________________________
void CbmTrdDigi::SetTimeOffset(int8_t t)
{
......
......@@ -54,6 +54,7 @@ public:
* \param[in] chargeT Charge for tilt pad parring.
* \param[in] chargeR Charge for rectangle pad parring.
* \param[in] time Absolute time [ASIC clocks].
* \sa CbmTrdModuleSim2D::AddDigi(), cbm::algo::trd2d::UnpackMS::pushDigis(), [legacy] CbmTrdUnpackFaspAlgo::pushDigis()
*/
CbmTrdDigi(int32_t padChNr, float chargeT, float chargeR, uint64_t time);
/**
......@@ -137,7 +138,6 @@ public:
**/
static ECbmModuleId GetSystem() { return ECbmModuleId::kTrd; }
/** @brief Class name (static)
** @return CbmTrdDigi
**/
......@@ -149,16 +149,13 @@ public:
static const char* GetBranchName() { return "TrdDigi"; }
/** \brief Getter for physical time [ns]. Accounts for clock representation of each ASIC. In SPADIC case physical time is already stored in fTime. */
double GetTime() const
{
return (GetType() == eCbmTrdAsicType::kFASP) ? fTime * fgClk[static_cast<size_t>(GetType())] : fTime;
}
/** \brief Getter for global DAQ time [clk]. Differs for each ASIC. In FASP case DAQ time is already stored in fTime.*/
uint64_t GetTimeDAQ() const
{
return (GetType() == eCbmTrdAsicType::kFASP) ? fTime : fTime / fgClk[static_cast<size_t>(GetType())];
}
/** \brief Getter for physical time [ns]. Accounts for clock representation of each ASIC. In SPADIC case physical time is already stored in fTime.
* Applies also to FASP starting with mCBM2025/02 (\sa FinalizeTime())
*/
double GetTime() const { return fTime; }
/** \brief Getter for global DAQ time [clk]. Differs for each ASIC. [In FASP case DAQ time is already stored in fTime. - to be removed]
*/
uint64_t GetTimeDAQ() const { return fTime / fgClk[static_cast<size_t>(GetType())]; }
/** \brief Channel trigger type. SPADIC specific see CbmTrdTriggerType*/
int32_t GetTriggerType() const { return (fInfo >> fgkTrgOffset) & 0x3; }
......@@ -217,10 +214,17 @@ public:
{
if (GetType() == eCbmTrdAsicType::kFASP) SetFlag(kFlag2, set);
}
/** \brief Set global digi time (ns)*/
void SetTime(double t);
/** \brief Set global digi time (clk)*/
void SetTimeDAQ(uint64_t t) { fTime = t; }
/** \brief Set global digi time (ns)
* !! Use this function if you know what you are doing !
* \sa CbmTrdFasp::WriteDigi(),
* \sa cbm::algo::trd2d::UnpackMS::operator(),
* \sa cbm::algo::trd2d::UnpackMS::pushDigis(),
* \sa cbm::algo::trd2d::UnpackMS::FinalizeComponent()
* \sa CbmTrdUnpackFaspAlgo::unpack(),
* \sa CbmTrdUnpackFaspAlgo::pushDigis(),
* \sa CbmTrdUnpackFaspAlgo::FinalizeComponent()
*/
void SetTime(double t) { fTime = static_cast<uint64_t>(t); }
/** \brief Set time offset of rectangular to tilt pads for FASP (clk)*/
void SetTimeOffset(int8_t t);
/** \brief Set digi trigger type */
......@@ -267,7 +271,7 @@ protected:
uint32_t fInfo = 0; //< pad address and extra information
uint32_t fCharge = 0; //< measured charge. For SPADIC is int32_t(charge*1eN) where N is the precission while
//< for FASP it contains the R and T charges each on 12bits and the time difference between R and T pads in CLK (8 bits).
uint64_t fTime = 0; //< global time of the digi: For SPADIC in ns, for FASP in ASIC clock
uint64_t fTime = 0; //< global time of the digi: For SPADIC & FASP in ns
/**
* @brief clock length in ns for acquisition
......
......@@ -171,7 +171,7 @@ bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFas
// No need to extra check
Double_t r, t;
Int_t dt;
const Int_t dtime = (*id).GetTimeDAQ() - lTime;
const Int_t dtime = (*id).GetTime() - lTime;
bool use(false);
if (TMath::Abs(dtime) < 5) { // test message part of (last) digi
......@@ -182,7 +182,7 @@ bool CbmTrdUnpackFaspAlgo::pushDigis(std::vector<CbmTrdUnpackFaspAlgo::CbmTrdFas
}
else if (lchT && t < 0.1) { // set T charge on an empty slot
(*id).SetCharge(lchT, r, +dtime);
(*id).SetTimeDAQ(ULong64_t((*id).GetTimeDAQ() - dtime));
(*id).SetTime(lTime);
use = true;
}
}
......@@ -259,6 +259,11 @@ void CbmTrdUnpackFaspAlgo::FinalizeComponent()
// reset flags as they were used only to mark the correctly setting of the charge/digi
(*id).SetFlag(0, false);
(*id).SetFlag(1, false);
/** Convert global time from clk temporary representation to the finale version in [ns]
* Correct the time with the system time offset which is derived in calibration.*/
uint64_t gtime = (*id).GetTime() * 12.5; // fAsicClockPeriod;
if (gtime >= uint64_t(fSystemTimeOffset)) gtime -= fSystemTimeOffset;
(*id).SetTime(gtime);
fOutputVec.emplace_back(std::move((*id)));
}
// clear digi buffer wrt the digi which was forwarded to higher structures
......@@ -300,7 +305,8 @@ bool CbmTrdUnpackFaspAlgo::unpack(const fles::Timeslice* ts, std::uint16_t icomp
}
}
// define time wrt start of time slice in TRD/FASP clks [80 MHz]
fTime = ULong64_t((msdesc.idx - fTsStartTime - fSystemTimeOffset) / 12.5);
fTime = uint64_t((msdesc.idx - fTsStartTime) / 25);
fTime <<= 1;
// get MOD_id and ROB id from the equipment, using the comp map: eq_id -> (mod_id, rob_id)
fMess->mod = fAsicSet.FindModuleByEqId(msdesc.eq_id, fMess->rob, fMess->elink);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment