31 LOG(info) <<
"Initialization of ZDC DigiParser";
33 LOG(fatal) <<
"Missing ModuleConfig configuration object";
45 for (
int ich = 0; ich <
NChannels; ich++) {
47 if (ropt.
amod[ich] < 0 || ropt.
ach[ich] < 0) {
48 for (
int im = 0; im <
NModules; im++) {
50 if (mModuleConfig->
modules[im].channelID[ic] == ich && mModuleConfig->
modules[im].readChannel[ic]) {
54 mChMask[ich] = (0x1 << (4 * im + ic));
61 mChMask[ich] = (0x1 << (4 * ropt.
amod[ich] + ropt.
ach[ich]));
65 LOG(info) <<
"Channel " << ich <<
"(" <<
ChannelNames[ich] <<
") mod " << ropt.
amod[ich] <<
" ch " << ropt.
ach[ich] <<
" bit " << (4 * ropt.
amod[ich] + ropt.
ach[ich]);
71 int nbx = std::round(xmax - xmin);
73 if (mTransmitted ==
nullptr) {
74 mTransmitted = std::make_unique<TH1F>(
"ht",
"Transmitted channels",
NChannels, -0.5,
NChannels - 0.5);
76 if (mFired ==
nullptr) {
77 mFired = std::make_unique<TH1F>(
"hfired",
"Fired channels",
NChannels, -0.5,
NChannels - 0.5);
79 if (mAlignment ==
nullptr) {
82 for (uint32_t ich = 0; ich <
NChannels; ich++) {
83 if (mBaseline[ich] ==
nullptr) {
85 TString htit = TString::Format(
"Baseline %s;Average orbit baseline",
ChannelNames[ich].
data());
86 mBaseline[ich] = std::make_unique<TH1F>(hname, htit, 65536, -32768.5, 32767.5);
88 if (mCounts[ich] ==
nullptr) {
90 TString htit = TString::Format(
"Counts %s; Orbit hits",
ChannelNames[ich].
data());
93 if (mSignalTH[ich] ==
nullptr) {
95 TString htit = TString::Format(
"Signal %s AUTOT & Hit; Sample; ADC",
ChannelNames[ich].
data());
102 if (mBunchH[ich] ==
nullptr) {
104 TString htit = TString::Format(
"Bunch %s AUTOT Hit; BC units; - BC hundreds",
ChannelNames[ich].
data());
105 mBunchH[ich] = std::make_unique<TH2F>(hname, htit, 100, -0.5, 99.5, 36, -35.5, 0.5);
145int DigiParser::process(
const gsl::span<const o2::zdc::OrbitData>& orbitdata,
const gsl::span<const o2::zdc::BCData>& bcdata,
const gsl::span<const o2::zdc::ChannelData>& chdata)
148 int norb = orbitdata.size();
151 for (
int iorb = 0; iorb < norb; iorb++) {
152 for (
int ich = 0; ich <
NChannels; ich++) {
154 scaler[ich] += orbitdata[iorb].scaler[ich];
155 mCounts[ich]->Fill(orbitdata[iorb].scaler[ich]);
159 mBaseline[ich]->Fill(myped);
162 LOG(warn) <<
"Corrupted scaler data for orbit " << orbitdata[iorb].ir.orbit;
167 mNBC = bcdata.size();
168 std::vector<std::array<uint32_t, NChannels>> chRef;
172 for (
int ibc = 0; ibc < mNBC; ibc++) {
173 auto& bcd = bcdata[ibc];
174 int chEnt = bcd.ref.getFirstEntry();
175 for (
int ich = 0; ich <
NChannels; ich++) {
178 for (
int ic = 0; ic < bcd.ref.getEntries(); ic++) {
179 auto& chd = chdata[chEnt];
181 chRef[ibc][chd.id] = chEnt;
182 mTransmitted->Fill(chd.id);
183 if ((bcdata[ibc].triggers & mChMask[chd.id]) != 0) {
184 mFired->Fill(chd.id);
191 for (uint32_t isig = 0; isig <
NChannels; isig++) {
192 for (
int ibc = 0; ibc < mNBC; ibc++) {
193 auto&
ir = bcdata[ibc].ir;
198 for (
int ibn = -4; ibn < 5; ibn++) {
204 if ((bcdata[ibt].triggers & mChMask[isig]) != 0) {
218 for (
int ibn = -1; ibn < 4; ibn++) {
222 auto bcd = bcdata[ibt].ir.differenceInBC(
ir);
225 if ((bcdata[ibc].triggers & mChMask[isig]) != 0) {
226 double bc_d = uint32_t(
ir.
bc / 100);
227 double bc_m = uint32_t(
ir.
bc % 100);
228 mBunchH[isig]->Fill(bc_m, -bc_d);
230 mAlignment->Fill(
ir.
bc, isig);
234 if ((bcdata[ibt].triggers & mChMask[isig]) != 0) {
236 auto ref = chRef[ibc][isig];