25#include "fairlogger/Logger.h"
60 mMcmHeaderEmpty = (1 << 31) | (
row << 27) | (column << 25) | 1;
62 uint64_t hcid = 2 * mDetector + (mRobPos % 2);
63 uint64_t
format = mUseFloatingPointForQ ? 1UL : 0UL;
67 mTrapConfig = trapconfig;
70 mADCR.resize(mNTimeBin *
NADCMCM);
71 mADCF.resize(mNTimeBin *
NADCMCM);
88 std::fill(mADCR.begin(), mADCR.end(), 0);
89 std::fill(mADCF.begin(), mADCF.end(), 0);
90 std::fill(mADCDigitIndices.begin(), mADCDigitIndices.end(), -1);
92 for (
auto filterreg : mInternalFilterRegisters) {
97 std::fill(mZSMap.begin(), mZSMap.end(), 0);
98 std::fill(mMCMT.begin(), mMCMT.end(), 0);
104 for (
auto& fitreg : mFitReg) {
109 mTrackletArray64.clear();
110 mTrackletDigitCount.clear();
111 mTrackletDigitIndices.clear();
149 if (!
mcm.checkInitialized()) {
156 os <<
"TRAP " <<
mcm.getMcmPos() <<
" on ROB " <<
mcm.getRobPos() <<
" in detector " <<
mcm.getDetector() << std::endl;
158 os <<
"----- Unfiltered ADC data (10 bit) -----" << std::endl;
160 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
161 os << std::setw(5) << iChannel;
164 for (
int iTimeBin = 0; iTimeBin <
mcm.getNumberOfTimeBins(); iTimeBin++) {
165 os <<
"tb " << std::setw(2) << iTimeBin <<
":";
166 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
167 os << std::setw(5) << (
mcm.getDataRaw(iChannel, iTimeBin) >>
mcm.mgkAddDigits);
171 os <<
"----- Filtered ADC data (10+2 bit) -----" << std::endl;
173 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
174 os << std::setw(4) << iChannel
175 << ((~mcm.getZeroSupressionMap(iChannel) != 0) ?
"!" :
" ");
178 for (
int iTimeBin = 0; iTimeBin <
mcm.getNumberOfTimeBins(); iTimeBin++) {
179 os <<
"tb " << std::setw(2) << iTimeBin <<
":";
180 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
181 os << std::setw(4) << (
mcm.getDataFiltered(iChannel, iTimeBin))
182 << (((
mcm.getZeroSupressionMap(iChannel) & (1 << iTimeBin)) == 0) ?
"!" :
" ");
191 int addrOffset = 0x2000;
194 for (
int iTimeBin = 0; iTimeBin <
mcm.getNumberOfTimeBins(); iTimeBin++) {
195 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
196 os << std::setw(5) << 10
197 << std::setw(5) << addrOffset + iChannel * addrStep + iTimeBin
198 << std::setw(5) << (
mcm.getDataFiltered(iChannel, iTimeBin))
199 << std::setw(5) << dest << std::endl;
208 std::vector<uint32_t>
buf;
210 int bufLength =
mcm.packData(
buf, 0);
212 for (
int i = 0;
i < bufLength;
i++) {
213 std::cout <<
"0x" << std::hex <<
buf[
i] << std::dec << std::endl;
219 os <<
"unknown format set" << std::endl;
236 const char*
const aquote{R
"(")"};
237 const char*
const cmdid{R
"(" cmdid="0">)"};
239 os <<
"<nginject>" << std::endl;
240 os <<
"<ack roc=\"" << mDetector << cmdid << std::endl;
241 os <<
"<dmem-readout>" << std::endl;
242 os <<
"<d det=\"" << mDetector <<
"\">" << std::endl;
243 os <<
" <ro-board rob=\"" << mRobPos <<
"\">" << std::endl;
244 os <<
" <m mcm=\"" << mMcmPos <<
"\">" << std::endl;
247 os <<
" <c cpu=\"" <<
cpu <<
"\">" << std::endl;
249 for (
int adcch = mFitPtr[
cpu]; adcch < mFitPtr[
cpu] + 2; adcch++) {
251 LOG(error) <<
"adcch going awol : " << adcch <<
" > 25";
253 os <<
" <ch chnr=\"" << adcch <<
"\">" << std::endl;
254 os <<
" <hits>" << mFitReg[adcch].nHits <<
"</hits>" << std::endl;
255 os <<
" <q0>" << mFitReg[adcch].q0 <<
"</q0>" << std::endl;
256 os <<
" <q1>" << mFitReg[adcch].q1 <<
"</q1>" << std::endl;
257 os <<
" <sumx>" << mFitReg[adcch].sumX <<
"</sumx>" << std::endl;
258 os <<
" <sumxsq>" << mFitReg[adcch].sumX2 <<
"</sumxsq>" << std::endl;
259 os <<
" <sumy>" << mFitReg[adcch].sumY <<
"</sumy>" << std::endl;
260 os <<
" <sumysq>" << mFitReg[adcch].sumY2 <<
"</sumysq>" << std::endl;
261 os <<
" <sumxy>" << mFitReg[adcch].sumXY <<
"</sumxy>" << std::endl;
262 os <<
" </ch>" << std::endl;
265 os <<
" </c>" << std::endl;
267 os <<
" </m>" << std::endl;
268 os <<
" </ro-board>" << std::endl;
269 os <<
"</d>" << std::endl;
270 os <<
"</dmem-readout>" << std::endl;
271 os <<
"</ack>" << std::endl;
272 os <<
"</nginject>" << std::endl;
280 const char*
const cmdid{R
"(" cmdid="0">)"};
281 os << "<nginject>" << std::endl;
282 os <<
"<ack roc=\"" << mDetector << cmdid << std::endl;
283 os <<
"<dmem-readout>" << std::endl;
284 os <<
"<d det=\"" << mDetector <<
"\">" << std::endl;
285 os <<
" <ro-board rob=\"" << mRobPos <<
"\">" << std::endl;
286 os <<
" <m mcm=\"" << mMcmPos <<
"\">" << std::endl;
291 if (mMCMT[
cpu] == 0x10001000) {
297 pid = (mMCMT[
cpu] & 0xFF000000) >> 24;
299 slope = (mMCMT[
cpu] & 0xFE000) >> 13;
302 os <<
" <trk> <pid>" <<
pid <<
"</pid>"
303 <<
" <padrow>" <<
padrow <<
"</padrow>"
304 <<
" <slope>" <<
slope <<
"</slope>"
305 <<
" <offset>" <<
offset <<
"</offset>"
306 <<
"</trk>" << std::endl;
309 os <<
" </m>" << std::endl;
310 os <<
" </ro-board>" << std::endl;
311 os <<
"</d>" << std::endl;
312 os <<
"</dmem-readout>" << std::endl;
313 os <<
"</ack>" << std::endl;
314 os <<
"</nginject>" << std::endl;
321 os <<
"# MCM " << mMcmPos <<
" on ROB " << mRobPos <<
" in detector " << mDetector << std::endl;
323 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
324 for (
int iChannel = 0; iChannel <
NADCMCM; ++iChannel) {
335 os <<
"MCM " << mMcmPos <<
" on ROB " << mRobPos <<
" in detector " << mDetector << std::endl;
337 os <<
"----- Unfiltered ADC data (10 bit) -----" << std::endl;
339 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
340 os << std::setw(5) << iChannel;
343 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
344 os <<
"tb " << std::setw(2) << iTimeBin <<
":";
345 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
346 os << std::setw(5) << (
getDataRaw(iChannel, iTimeBin));
351 os <<
"----- Filtered ADC data (10+2 bit) -----" << std::endl;
353 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
354 os << std::setw(4) << iChannel
355 << ((~mZSMap[iChannel] != 0) ?
"!" :
" ");
358 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
359 os <<
"tb " << std::setw(2) << iTimeBin <<
":";
360 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
362 << (((mZSMap[iChannel] & (1 << iTimeBin)) == 0) ?
"!" :
" ");
372 const char*
const cmdid{R
"(" cmdid="0">)"};
373 os << "<nginject>" << std::endl;
374 os <<
"<ack roc=\"" << mDetector << cmdid << std::endl;
375 os <<
"<dmem-readout>" << std::endl;
376 os <<
"<d det=\"" << mDetector <<
"\">" << std::endl;
377 os <<
" <ro-board rob=\"" << mRobPos <<
"\">" << std::endl;
378 os <<
" <m mcm=\"" << mMcmPos <<
"\">" << std::endl;
380 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
381 os <<
" <ch chnr=\"" << iChannel <<
"\">" << std::endl;
382 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
383 os <<
"<tb>" << mADCF[iChannel * mNTimeBin + iTimeBin] / 4 <<
"</tb>";
385 os <<
" </ch>" << std::endl;
388 os <<
" </m>" << std::endl;
389 os <<
" </ro-board>" << std::endl;
390 os <<
"</d>" << std::endl;
391 os <<
"</dmem-readout>" << std::endl;
392 os <<
"</ack>" << std::endl;
393 os <<
"</nginject>" << std::endl;
400 mTrapConfig->
printDatx(os, 2602, 1, 0, 127);
403 int addrOffset = 0x2000;
405 int addrOffsetEBSIA = 0x20;
407 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
408 for (
int iChannel = 0; iChannel <
NADCMCM; iChannel++) {
409 if ((iTimeBin < timeBinOffset) || (iTimeBin >= mNTimeBin + timeBinOffset)) {
410 if (broadcast ==
false) {
413 mTrapConfig->
printDatx(os, addrOffset + iChannel * addrStep + addrOffsetEBSIA + iTimeBin, 10, 0, 127);
416 if (broadcast ==
false) {
419 mTrapConfig->
printDatx(os, addrOffset + iChannel * addrStep + addrOffsetEBSIA + iTimeBin, (
getDataFiltered(iChannel, iTimeBin - timeBinOffset) / 4), 0, 127);
447 std::string nameInputGain;
448 std::string nameInputTail;
452 nameInputGain =
"Noise";
456 nameInputGain =
"Pedestal";
460 LOG(error) <<
"Undefined input to tail cancellation filter";
466 nameInputTail =
"Noise";
470 nameInputTail =
"Pedestal";
474 nameInputTail =
"Gain";
478 LOG(error) <<
"Undefined input to tail cancellation filter";
482 TH1F*
h =
new TH1F(
"noise",
"Gaussian Noise;sample;ADC count",
484 TH1F* hfp =
new TH1F(
"ped",
"Noise #rightarrow Pedestal filter;sample;ADC count",
nsamples, 0,
nsamples);
485 TH1F* hfg =
new TH1F(
"gain",
486 (nameInputGain +
"#rightarrow Gain;sample;ADC count").c_str(),
488 TH1F* hft =
new TH1F(
"tail",
489 (nameInputTail +
"#rightarrow Tail;sample;ADC count").c_str(),
492 hfp->SetStats(
false);
493 hfg->SetStats(
false);
494 hft->SetStats(
false);
501 value = (
int)gRandom->Gaus(mean, sigma);
506 if (inputGain == 0) {
512 if (inputTail == 0) {
514 }
else if (inputTail == 1) {
520 hfp->SetBinContent(
i, valuep >> 2);
521 hfg->SetBinContent(
i, valueg >> 2);
522 hft->SetBinContent(
i, valuet >> 2);
525 TCanvas*
c =
new TCanvas;
554 LOG(
debug) <<
"MCM " << mMcmPos <<
" on ROB " << mRobPos <<
" in detector " << mDetector;
563 for (
int iTrkl = 0; iTrkl < mTrackletArray64.size(); iTrkl++) {
564 LOG(
debug) <<
"tracklet " << iTrkl <<
": 0x" << hex << std::setw(32) << mTrackletArray64[iTrkl].getTrackletWord();
565 LOG(
debug) << mTrackletArray64[iTrkl];
582 TFile* rootfile =
new TFile(
"trdtrackletplots.root",
"UPDATE");
583 TCanvas*
c1 =
new TCanvas(Form(
"canvas_%i_%i:%i:%i_%i",
index, mDetector, mRobPos, mMcmPos, (
int)mTrackletArray64.size()));
584 TH2F* hist =
new TH2F(Form(
"mcmdata_%i",
index),
585 Form(
"Data of MCM %i on ROB %i in detector %i ", mMcmPos, mRobPos, mDetector),
592 hist->GetXaxis()->SetTitle(
"ADC Channel");
593 hist->GetYaxis()->SetTitle(
"Timebin");
594 hist->SetStats(
false);
595 TH2F* histfiltered =
new TH2F(Form(
"mcmdataf_%i",
index),
596 Form(
"Data of MCM %i on ROB %i in detector %i filtered", mMcmPos, mRobPos, mDetector),
603 histfiltered->GetXaxis()->SetTitle(
"ADC Channel");
604 histfiltered->GetYaxis()->SetTitle(
"Timebin");
607 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
608 for (
int iAdc = 0; iAdc <
NADCMCM; iAdc++) {
609 hist->SetBinContent(iAdc + 1, iTimeBin + 1, mADCR[iAdc * mNTimeBin + iTimeBin] >>
mgkAddDigits);
614 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
615 for (
int iAdc = 0; iAdc <
NADCMCM; iAdc++) {
616 histfiltered->SetBinContent(iAdc + 1, iTimeBin + 1, mADCF[iAdc * mNTimeBin + iTimeBin] >>
mgkAddDigits);
619 histfiltered->Draw(
"COLZ");
623 TLine* trklLines =
new TLine[4];
625 if (mTrackletArray64.size() > 0) {
626 LOG(
debug) <<
"Tracklet : for " << mTrackletArray64[0].getDetector() <<
"::" << mTrackletArray64[0].getROB() <<
" : " << mTrackletArray64[0].getMCM();
628 LOG(
debug) <<
"Tracklet : for trackletarray size of zero ";
630 for (
int iTrkl = 0; iTrkl < mTrackletArray64.size(); iTrkl++) {
632 float position = trkl.getPosition();
634 float slope = trkl.getSlope();
639 trklLines[iTrkl].SetX1(position -
slope *
t0);
640 trklLines[iTrkl].SetY1(
t0);
641 trklLines[iTrkl].SetX2(position -
slope *
t1);
642 trklLines[iTrkl].SetY2(
t1);
643 trklLines[iTrkl].SetLineColor(2);
644 trklLines[iTrkl].SetLineWidth(2);
645 LOG(
debug) <<
"Tracklet " << iTrkl <<
": y = " << trkl.getPosition() <<
", slope = " << (float)trkl.getSlope() <<
"for a det:rob:mcm combo of : " << mDetector <<
":" << mRobPos <<
":" << mMcmPos;
646 LOG(
debug) <<
"Tracklet " << iTrkl <<
": x1,y1,x2,y2 :: " << trklLines[iTrkl].GetX1() <<
"," << trklLines[iTrkl].GetY1() <<
"," << trklLines[iTrkl].GetX2() <<
"," << trklLines[iTrkl].GetY2();
648 trklLines[iTrkl].Draw();
663 LOG(error) <<
"TRAP is not initialized, cannot call setData()";
667 if (adc < 0 || adc >=
NADCMCM) {
668 LOG(error) <<
"Error: ADC " <<
adc <<
" is out of range (0 .. " <<
NADCMCM - 1 <<
")";
672 for (
int it = 0; it < mNTimeBin; it++) {
677 mADCFilled |= (1 <<
adc);
679 mADCDigitIndices[
adc] = digitIdx;
690 LOG(error) <<
"TRAP is not initialized, cannot call setBaselines()";
696 if ((mADCFilled & (1 <<
adc)) == 0) {
697 for (
int timebin = 0; timebin < mNTimeBin; timebin++) {
716 if (adc < 0 || adc >=
NADCMCM) {
720 for (
int it = 0; it < mNTimeBin; it++) {
736 uint32_t wordswritten = 0;
741 int trackletcount = 0;
744 std::array<TrackletMCMData, 3>
tracklets{};
747 mcmhead.
padrow = ((mRobPos >> 1) << 2) | (mMcmPos >> 2);
751 LOG(
debug) <<
"packing data with trackletarry64 size of : " << mTrackletArray64.size();
752 for (
int i = 0;
i < 3;
i++) {
753 if (
i < mTrackletArray64.size()) {
754 LOG(
debug) <<
"we have a tracklet at i=" <<
i <<
" with trackletword 0x" << mTrackletArray64[
i].getTrackletWord();
757 mcmhead.
pid0 = ((mTrackletArray64[0].getQ2()) << 2) + ((mTrackletArray64[0].getQ1()) >> 5);
760 mcmhead.
pid1 = ((mTrackletArray64[1].getQ2()) << 2) + ((mTrackletArray64[1].getQ1()) >> 5);
763 mcmhead.
pid2 = ((mTrackletArray64[2].getQ2()) << 2) + ((mTrackletArray64[2].getQ1()) >> 5);
768 tracklets[
i].pid = mTrackletArray64[
i].getQ0() & (mTrackletArray64[
i].getQ1() << 8);
769 tracklets[
i].slope = mTrackletArray64[
i].getSlope();
770 tracklets[
i].pos = mTrackletArray64[
i].getPosition();
777 LOG(
debug) <<
"setting mcmhead pid1 to 0xff with tracklet array size of " << mTrackletArray64[
i];
786 LOG(
debug) <<
"pushing back mcm head of 0x" << std::hex << mcmhead.
word <<
" with trackletcount of : " << std::dec << trackletcount <<
":-:" << wordswritten;
787 rawdata.push_back(mcmhead.
word);
789 for (
int i = 0;
i < trackletcount;
i++) {
796 LOG(
debug) <<
">>>>> START info OUTPUT OF packData trackletcount:-:wordcount" << trackletcount <<
":-:" << wordswritten;
799 if (trackletcount > 1) {
802 if (trackletcount > 2) {
805 LOG(
debug) <<
"<<<<< END info OUTPUT OF packData";
809 LOG(
debug) <<
"now to leave pack data after passing asserts with wordswritten = " << wordswritten;
851 mInternalFilterRegisters[
adc].mPedAcc = (baseline << 2) * (1 <<
mgkFPshifts[fptc]);
861 LOG(
debug) <<
"BEGIN: " << __FILE__ <<
":" << __func__ <<
":" << __LINE__;
867 unsigned short accumulatorShifted;
868 unsigned short inpAdd;
870 inpAdd =
value + fpnp;
872 accumulatorShifted = (mInternalFilterRegisters[
adc].mPedAcc >>
mgkFPshifts[fptc]) & 0x3FF;
875 int correction = (
value & 0x3FF) - accumulatorShifted;
876 mInternalFilterRegisters[
adc].mPedAcc = (mInternalFilterRegisters[
adc].mPedAcc + correction) & 0x7FFFFFFF;
886 if (inpAdd <= accumulatorShifted) {
889 inpAdd = inpAdd - accumulatorShifted;
890 if (inpAdd > 0xFFF) {
910 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
911 for (
int iAdc = 0; iAdc <
NADCMCM; iAdc++) {
912 int oldadc = mADCF[iAdc * mNTimeBin + iTimeBin];
928 mInternalFilterRegisters[
adc].mGainCounterA = 0;
929 mInternalFilterRegisters[
adc].mGainCounterB = 0;
951 unsigned int mgfExtended = 0x700 + mgf;
959 corr = (
value * mgfExtended) >> 11;
960 corr = corr > 0xfff ? 0xfff : corr;
962 corr = addUintClipping(corr, mga, 12);
967 if (!((mInternalFilterRegisters[
adc].mGainCounterA == 0x3FFFFFF) || (mInternalFilterRegisters[
adc].mGainCounterB == 0x3FFFFFF)))
972 mInternalFilterRegisters[
adc].mGainCounterB++;
973 }
else if (corr >= mgta) {
974 mInternalFilterRegisters[
adc].mGainCounterA++;
990 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
1004 unsigned short lambdaLong = (1 << 10) | (1 << 9) | (mTrapConfig->
getTrapReg(
TrapConfig::kFTLL, mDetector, mRobPos, mMcmPos) & 0x1FF);
1005 unsigned short lambdaShort = (0 << 10) | (1 << 9) | (mTrapConfig->
getTrapReg(
TrapConfig::kFTLS, mDetector, mRobPos, mMcmPos) & 0x1FF);
1007 float lambdaL = lambdaLong * 1.0 / (1 << 11);
1008 float lambdaS = lambdaShort * 1.0 / (1 << 11);
1009 float alphaL = alphaLong * 1.0 / (1 << 11);
1011 qup = (1 - lambdaL) * (1 - lambdaS);
1012 qdn = 1 - lambdaS * alphaL - lambdaL * (1 - alphaL);
1013 float kdc = qup / qdn;
1021 ql = lambdaL * (1 - lambdaS) * alphaL;
1022 qs = lambdaS * (1 - lambdaL) * (1 - alphaL);
1025 int value = baseline & 0xFFF;
1027 corr = corr > 0xfff ? 0xfff : corr;
1030 float kt = kdc * baseline;
1031 unsigned short aout = baseline - (
unsigned short)kt;
1033 mInternalFilterRegisters[
adc].mTailAmplLong = (
unsigned short)(aout * ql / (ql + qs));
1034 mInternalFilterRegisters[
adc].mTailAmplShort = (
unsigned short)(aout * qs / (ql + qs));
1046 unsigned short lambdaLong = (1 << 10) | (1 << 9) | (mTrapConfig->
getTrapReg(
TrapConfig::kFTLL, mDetector, mRobPos, mMcmPos) & 0x1FF);
1047 unsigned short lambdaShort = (0 << 10) | (1 << 9) | (mTrapConfig->
getTrapReg(
TrapConfig::kFTLS, mDetector, mRobPos, mMcmPos) & 0x1FF);
1051 unsigned int alInpv;
1055 unsigned short inpVolt =
value & 0xFFF;
1058 aQ = addUintClipping(mInternalFilterRegisters[
adc].mTailAmplLong, mInternalFilterRegisters[
adc].mTailAmplShort, 12);
1062 aDiff = inpVolt - aQ;
1068 alInpv = (aDiff * alphaLong) >> 11;
1072 tmp = addUintClipping(mInternalFilterRegisters[
adc].mTailAmplLong, alInpv, 12);
1073 tmp = (tmp * lambdaLong) >> 11;
1074 mInternalFilterRegisters[
adc].mTailAmplLong = tmp & 0xFFF;
1076 tmp = addUintClipping(mInternalFilterRegisters[
adc].mTailAmplShort, aDiff - alInpv, 12);
1077 tmp = (tmp * lambdaShort) >> 11;
1078 mInternalFilterRegisters[
adc].mTailAmplShort = tmp & 0xFFF;
1092 for (
int iTimeBin = 0; iTimeBin < mNTimeBin; iTimeBin++) {
1093 for (
int iAdc = 0; iAdc <
NADCMCM; iAdc++) {
1094 mADCF[iAdc * mNTimeBin + iTimeBin] =
filterTailNextSample(iAdc, mADCF[iAdc * mNTimeBin + iTimeBin]);
1118 for (
int iAdc = 0; iAdc <
NADCMCM; iAdc++) {
1122 for (
int it = 0; it < mNTimeBin; it++) {
1135 an = mADCF[(iAdc + 1) * mNTimeBin + it] >>
mgkAddDigits;
1137 mask = (ac >= ap && ac >= an) ? 0 : 0x1;
1138 mask += (ap + ac + an > eBIT) ? 0 : 0x2;
1139 mask += (ac > eBIS) ? 0 : 0x4;
1141 supp = (eBIL >>
mask) & 1;
1143 mZSMap[iAdc] &= ~((1 - supp) << it);
1145 mZSMap[iAdc + 1] &= ~((1 - supp) << it);
1151 ap = mADCF[(iAdc - 1) * mNTimeBin + it] >>
mgkAddDigits;
1155 mask = (ac >= ap && ac >= an) ? 0 : 0x1;
1156 mask += (ap + ac + an > eBIT) ? 0 : 0x2;
1157 mask += (ac > eBIS) ? 0 : 0x4;
1159 supp = (eBIL >>
mask) & 1;
1161 mZSMap[iAdc] &= ~((1 - supp) << it);
1163 mZSMap[iAdc - 1] &= ~((1 - supp) << it);
1167 for (iAdc = 1; iAdc <
NADCMCM - 1; iAdc++) {
1168 ap = mADCF[(iAdc - 1) * mNTimeBin + it] >>
mgkAddDigits;
1170 an = mADCF[(iAdc + 1) * mNTimeBin + it] >>
mgkAddDigits;
1172 mask = (ac >= ap && ac >= an) ? 0 : 0x1;
1173 mask += (ap + ac + an > eBIT) ? 0 : 0x2;
1174 mask += (ac > eBIS) ? 0 : 0x4;
1176 supp = (eBIL >>
mask) & 1;
1178 mZSMap[iAdc] &= ~((1 - supp) << it);
1180 mZSMap[iAdc - 1] &= ~((1 - supp) << it);
1181 mZSMap[iAdc + 1] &= ~((1 - supp) << it);
1204 if (timebin >= 1 && timebin < 6) {
1205 mFitReg[
adc].q0 += qtot;
1208 if (timebin >= 14 && timebin < 20) {
1209 mFitReg[
adc].q1 += qtot;
1212 if ((timebin >= 1) &&
1214 mFitReg[
adc].sumX += timebin;
1215 mFitReg[
adc].sumX2 += timebin * timebin;
1216 mFitReg[
adc].nHits++;
1217 mFitReg[
adc].sumY += ypos;
1218 mFitReg[
adc].sumY2 += ypos * ypos;
1219 mFitReg[
adc].sumXY += timebin * ypos;
1220 LOGF(
debug,
"FitReg for channel %i and timebin %u: ypos(%i), qtot(%i)",
adc, timebin, ypos, qtot);
1256 for (
auto& fitreg : mFitReg) {
1260 for (
unsigned int timebin = timebin1; timebin < timebin2; timebin++) {
1263 std::array<unsigned short, 20> qTotal{};
1264 int adcLeft, adcCentral, adcRight;
1265 for (
int adcch = 0; adcch <
NADCMCM - 2; adcch++) {
1266 adcLeft = mADCF[adcch * mNTimeBin + timebin];
1267 adcCentral = mADCF[(adcch + 1) * mNTimeBin + timebin];
1268 adcRight = mADCF[(adcch + 2) * mNTimeBin + timebin];
1269 bool hitQual =
false;
1274 hitQual = ((adcLeft * adcRight) <
1277 LOG(
debug) <<
"cluster quality cut passed with " << adcLeft <<
", " << adcCentral <<
", "
1284 int qtotTemp = adcLeft + adcCentral + adcRight;
1288 (adcLeft <= adcCentral) &&
1289 (adcCentral > adcRight)) {
1290 qTotal[adcch] = qtotTemp;
1296 short fromLeft = -1;
1299 std::array<unsigned short, 6> marked{};
1303 while ((adcch < 16) && (found < 3)) {
1304 if (qTotal[adcch] > 0) {
1306 marked[2 * found + 1] = adcch;
1312 short fromRight = -1;
1315 while ((adcch > 2) && (found < 3)) {
1316 if (qTotal[adcch] > 0) {
1317 marked[2 * found] = adcch;
1325 if ((fromLeft >= 0) && (fromRight >= 0) && (fromLeft < fromRight)) {
1326 for (adcch = fromLeft + 1; adcch < fromRight; adcch++) {
1332 for (adcch = 0; adcch < 19; adcch++) {
1333 if (qTotal[adcch] > 0) {
1340 if (marked[4] == marked[5]) {
1343 std::array<unsigned short, 6> qMarked;
1344 for (found = 0; found < 6; found++) {
1345 qMarked[found] = qTotal[marked[found]] >> 4;
1348 unsigned short worse1, worse2;
1349 sort6To2Worst(marked[0], marked[3], marked[4], marked[1], marked[2], marked[5],
1366 for (adcch = 0; adcch < 19; adcch++) {
1367 if (qTotal[adcch] > 0)
1369 adcLeft = mADCF[adcch * mNTimeBin + timebin];
1370 adcCentral = mADCF[(adcch + 1) * mNTimeBin + timebin];
1371 adcRight = mADCF[(adcch + 2) * mNTimeBin + timebin];
1372 LOGF(
debug,
"ch(%i): left(%i), central(%i), right(%i)", adcch, adcLeft, adcCentral, adcRight);
1377 LOG(
debug) <<
"Hit found, time=" << timebin <<
", adcch=" << adcch <<
"/" << adcch + 1 <<
"/"
1378 << adcch + 2 <<
", adc values=" << adcLeft <<
"/" << adcCentral <<
"/"
1381 if (adcLeft < regTPFP) {
1386 if (adcCentral < regTPFP) {
1389 adcCentral -= regTPFP;
1391 if (adcRight < regTPFP) {
1394 adcRight -= regTPFP;
1399 if (adcCentral == 0) {
1400 LOG(error) <<
"bad configuration detected";
1403 short ypos = 128 * (adcRight - adcLeft) / adcCentral;
1412 mDetector, mRobPos, mMcmPos);
1415 if (adcLeft > adcRight) {
1418 LOGF(
debug,
"ch(%i): left(%i), central(%i), right(%i), ypos(%i)", adcch, adcLeft, adcCentral, adcRight, ypos);
1429 unsigned short adcIdx,
i,
j, ntracks, tmp;
1430 std::array<unsigned short, 18> trackletCandch{};
1431 std::array<unsigned short, 18> trackletCandhits{};
1436 for (adcIdx = 0; adcIdx < 18; adcIdx++) {
1438 (mFitReg[adcIdx].nHits + mFitReg[adcIdx + 1].nHits >= 8)) {
1439 trackletCandch[ntracks] = adcIdx;
1440 trackletCandhits[ntracks] = mFitReg[adcIdx].nHits + mFitReg[adcIdx + 1].nHits;
1445 LOG(
debug) <<
"Number of track candidates:" << ntracks;
1446 for (
i = 0;
i < ntracks;
i++) {
1447 LOG(
debug) <<
"TRACKS: " <<
i <<
" " << trackletCandch[
i] <<
" " << trackletCandhits[
i];
1451 for (
j = 0;
j < (ntracks - 1);
j++) {
1452 for (
i =
j + 1;
i < ntracks;
i++) {
1453 if ((trackletCandhits[
j] < trackletCandhits[
i]) ||
1454 ((trackletCandhits[
j] == trackletCandhits[
i]) && (trackletCandch[
j] < trackletCandch[
i]))) {
1456 tmp = trackletCandhits[
j];
1457 trackletCandhits[
j] = trackletCandhits[
i];
1458 trackletCandhits[
i] = tmp;
1459 tmp = trackletCandch[
j];
1460 trackletCandch[
j] = trackletCandch[
i];
1461 trackletCandch[
i] = tmp;
1470 for (
j = 0;
j < (ntracks - 1);
j++) {
1471 for (
i =
j + 1;
i < ntracks;
i++) {
1472 if (trackletCandch[
j] < trackletCandch[
i]) {
1474 tmp = trackletCandhits[
j];
1475 trackletCandhits[
j] = trackletCandhits[
i];
1476 trackletCandhits[
i] = tmp;
1477 tmp = trackletCandch[
j];
1478 trackletCandch[
j] = trackletCandch[
i];
1479 trackletCandch[
i] = tmp;
1483 for (
i = 0;
i < ntracks;
i++) {
1484 mFitPtr[
i] = trackletCandch[
i];
1486 for (
i = ntracks;
i < 4;
i++) {
1529 std::array<uint32_t, NCPU> adcChannelMask = {0};
1530 std::array<uint32_t, NCPU> charges = {0};
1531 std::array<uint16_t, NADCMCM> trap_adc_q2_sum = {0};
1538 charges[
cpu] = 0xff << (8 *
cpu);
1541 adcChannelMask[
cpu] = mFitPtr[
cpu];
1547 if ((mFitPtr[
cpu] == mFitPtr[
cpu - 1] + 1) || (mFitPtr[
cpu] + 1 == mFitPtr[
cpu - 1])) {
1551 charges[
cpu] = 0xff << (8 *
cpu);
1561 wrks = adcChannelMask[
cpu];
1568 adcChannelMask[3] |= wrku << wrks;
1570 adcChannelMask[3] |= wrku >> (-wrks);
1574 if (adcChannelMask[3] > 0) {
1578 for (
int ch = 0; ch <
NADCMCM; ch++) {
1579 if ((adcChannelMask[3] >> ch) & 1) {
1581 for (
int timebin = mQ2LeftMargin; timebin < (mQ2LeftMargin + mQ2WindowWidth); timebin++) {
1586 LOGF(
debug,
"trap_adc_q2_sum[%i]=%i", ch, trap_adc_q2_sum[ch]);
1591 int decPlacesSlope = 2;
1592 int rndAdd = 1 << (decPlaces - 1);
1594 int yoffs = (21 << (8 + decPlaces)) / 2;
1598 LOG(
debug) <<
"using mis-alignment correction";
1602 uint64_t shift = 1UL << 32;
1609 FitReg* fit1 = &mFitReg[mFitPtr[
cpu] + 1];
1613 int64_t mult64 = 1L << (32 + decPlaces);
1618 LOG(
debug) <<
"using time offset of t0 = " <<
t0;
1622 int32_t sumX = fit0->
sumX + fit1->
sumX;
1624 uint32_t q0 = fit0->
q0 + fit1->
q0;
1625 uint32_t q1 = fit0->
q1 + fit1->
q1;
1629 LOGF(
debug,
"Q0(%i), Q1(%i)", q0, q1);
1631 int32_t denom = nHits * sumX2 - sumX * sumX;
1632 int32_t mult32 = mult64 / denom;
1635 int32_t
slope = nHits * sumXY - sumX * sumY;
1636 int32_t position = sumX2 * sumY - sumX * sumXY;
1639 int64_t temp =
slope;
1645 position = temp >> 32;
1646 LOGF(
debug,
"2 slope=%i, position=%i",
slope, position);
1648 position = position << decPlaces;
1649 position +=
t0 * nHits * sumXY -
t0 * sumX * sumY;
1650 position = position >> decPlaces;
1652 wrks = (mFitPtr[
cpu] << (8 + decPlaces)) - yoffs;
1653 LOGF(
debug,
"yoffs=%i, wrks=%i", yoffs, wrks);
1658 slope = mult64 >> 32;
1660 position = -position;
1664 position = mult64 >> 32;
1665 LOGF(
debug,
"3 slope=%i, position=%i",
slope, position);
1668 position = (position + rndAdd) >> decPlaces;
1672 LOGF(
debug,
" pos =%5d, slope =%5d\n", position,
slope);
1675 float fitSlope = (float)(nHits * sumXY - sumX * sumY) / (nHits * sumX2 - sumX * sumX);
1676 float fitOffset = (float)(sumX2 * sumY - sumX * sumXY) / (nHits * sumX2 - sumX * sumX);
1677 LOGF(
debug,
"Fit results as float: offset(%f), slope(%f)", fitOffset, fitSlope);
1678 float sx = (float)sumX;
1679 float sx2 = (float)sumX2;
1680 float sy = (float)sumY;
1681 float sy2 = (float)sumY2;
1682 float sxy = (float)sumXY;
1683 float fitError = sy2 - (sx2 * sy * sy - 2 * sx * sxy * sy + nHits * sxy * sxy) / (nHits * sx2 - sx * sx);
1687 if (slope < -128 || slope > 127) {
1688 LOGF(
debug,
"Slope is outside of allowed range: %i",
slope);
1690 if (position < -1023) {
1691 LOGF(warning,
"Position is smaller than allowed range (%i), clipping it", position);
1694 if (position > 1023) {
1695 LOGF(warning,
"Position is larger than allowed range (%i), clipping it", position);
1699 if (slope < -127 || slope > 127) {
1701 LOGF(
debug,
"Dropping tracklet of CPU %i with slope %i which is out of range",
cpu,
slope);
1702 charges[
cpu] = 0xff << (8 *
cpu);
1706 position = position & 0x7ff;
1709 uint32_t q2 = trap_adc_q2_sum[mFitPtr[
cpu]] + trap_adc_q2_sum[mFitPtr[
cpu] + 1] + trap_adc_q2_sum[mFitPtr[
cpu] + 2] + trap_adc_q2_sum[mFitPtr[
cpu] + 3];
1710 LOGF(
debug,
"IntCharge of %d ... %d : 0x%04x, 0x%04x 0x%04x, 0x%04x", mFitPtr[
cpu], mFitPtr[
cpu] + 3, trap_adc_q2_sum[mFitPtr[
cpu]], trap_adc_q2_sum[mFitPtr[
cpu] + 1], trap_adc_q2_sum[mFitPtr[
cpu] + 2], trap_adc_q2_sum[mFitPtr[
cpu] + 3]);
1711 LOGF(
debug,
"q2 = %i", q2);
1714 if (mUseFloatingPointForQ) {
1717 wrku = q0 | q1 | q2;
1719 if ((wrku >> mDynShift0) == 0) {
1722 }
else if ((wrku >> mDynShift1) == 0) {
1725 }
else if ((wrku >> mDynShift2) == 0) {
1738 LOGF(
debug,
"Compressed Q0 %4d, Q1 %4d, Q2 %4d", q0 << shft, q1 << shft, q2 << shft);
1739 q2 |= shcd << mDynSize;
1740 if (q2 == mEmptyHPID8) {
1745 charges[
cpu] <<= mDynSize;
1747 charges[
cpu] <<= mDynSize;
1765 if (q0 > mMaskQ0Q1) {
1768 if (q1 > mMaskQ0Q1) {
1776 charges[
cpu] <<= mSizeQ0Q1;
1778 charges[
cpu] <<= mSizeQ0Q1;
1786 LOGF(
debug,
"We have a tracklet! Position(%i), Slope(%i), q0(%i), q1(%i), q2(%i)", position ^ 0x80,
slope ^ 0x80, q0, q1, q2);
1788 mMCMT[
cpu + 1] = position ^ 0x80;
1789 mMCMT[
cpu + 1] <<= mSizeLPID;
1790 mMCMT[
cpu + 1] |= charges[
cpu] & mMaskLPID;
1791 mMCMT[
cpu + 1] <<= 8;
1793 mMCMT[
cpu + 1] <<= 1;
1795 charges[
cpu] >>= 12;
1796 charges[
cpu] <<= 8 *
cpu;
1799 uint64_t trkltWord64 = mTrkltWordEmpty;
1801 mTrackletArray64.emplace_back(trkltWord64);
1804 mTrackletDigitCount.push_back(0);
1805 for (
int ch = 0; ch <
NCOLMCM; ch++) {
1806 if (mADCDigitIndices[ch] >= 0 && ((ch == mFitPtr[
cpu]) || (ch == mFitPtr[
cpu] + 1))) {
1808 mTrackletDigitCount.back() += 1;
1809 mTrackletDigitIndices.push_back(mADCDigitIndices[ch]);
1819 wrku = charges[0] | charges[1] | charges[2];
1822 if ((wrku != mEmptyHPID24) || !mDontSendEmptyHeaderTrklt)
1824 mMCMT[0] = mMcmHeaderEmpty | (wrku << 1);
1827 LOG(
debug) <<
"4x32 bit tracklet data:";
1828 for (
int i = 0;
i < 4; ++
i) {
1829 LOGF(
debug,
"0x%08x", mMCMT[
i]);
1839 if (!mInitialized) {
1850unsigned int TrapSimulator::addUintClipping(
unsigned int a,
unsigned int b,
unsigned int nbits)
const
1857 unsigned int sum =
a +
b;
1859 unsigned int maxv = (1 << nbits) - 1;
1871void TrapSimulator::sort2(uint16_t idx1i, uint16_t idx2i,
1872 uint16_t val1i, uint16_t val2i,
1873 uint16_t* idx1o, uint16_t* idx2o,
1874 uint16_t* val1o, uint16_t* val2o)
const
1878 if (val1i > val2i) {
1891void TrapSimulator::sort3(uint16_t idx1i, uint16_t idx2i, uint16_t idx3i,
1892 uint16_t val1i, uint16_t val2i, uint16_t val3i,
1893 uint16_t* idx1o, uint16_t* idx2o, uint16_t* idx3o,
1894 uint16_t* val1o, uint16_t* val2o, uint16_t* val3o)
const
1900 if (val1i > val2i) {
1905 if (val2i > val3i) {
1908 if (val3i > val1i) {
1968 LOG(error) <<
"ERROR in Sort3!!!";
1973void TrapSimulator::sort6To4(uint16_t idx1i, uint16_t idx2i, uint16_t idx3i, uint16_t idx4i, uint16_t idx5i, uint16_t idx6i,
1974 uint16_t val1i, uint16_t val2i, uint16_t val3i, uint16_t val4i, uint16_t val5i, uint16_t val6i,
1975 uint16_t* idx1o, uint16_t* idx2o, uint16_t* idx3o, uint16_t* idx4o,
1976 uint16_t* val1o, uint16_t* val2o, uint16_t* val3o, uint16_t* val4o)
const
1980 uint16_t idx21s, idx22s, idx23s, dummy;
1981 uint16_t val21s, val22s, val23s;
1982 uint16_t idx23as, idx23bs;
1983 uint16_t val23as, val23bs;
1985 sort3(idx1i, idx2i, idx3i, val1i, val2i, val3i,
1986 idx1o, &idx21s, &idx23as,
1987 val1o, &val21s, &val23as);
1989 sort3(idx4i, idx5i, idx6i, val4i, val5i, val6i,
1990 idx2o, &idx22s, &idx23bs,
1991 val2o, &val22s, &val23bs);
1993 sort2(idx23as, idx23bs, val23as, val23bs, &idx23s, &dummy, &val23s, &dummy);
1995 sort3(idx21s, idx22s, idx23s, val21s, val22s, val23s,
1996 idx3o, idx4o, &dummy,
1997 val3o, val4o, &dummy);
2000void TrapSimulator::sort6To2Worst(uint16_t idx1i, uint16_t idx2i, uint16_t idx3i, uint16_t idx4i, uint16_t idx5i, uint16_t idx6i,
2001 uint16_t val1i, uint16_t val2i, uint16_t val3i, uint16_t val4i, uint16_t val5i, uint16_t val6i,
2002 uint16_t* idx5o, uint16_t* idx6o)
const
2006 uint16_t idx21s, idx22s, idx23s, dummy1, dummy2, dummy3, dummy4, dummy5;
2007 uint16_t val21s, val22s, val23s;
2008 uint16_t idx23as, idx23bs;
2009 uint16_t val23as, val23bs;
2011 sort3(idx1i, idx2i, idx3i, val1i, val2i, val3i,
2012 &dummy1, &idx21s, &idx23as,
2013 &dummy2, &val21s, &val23as);
2015 sort3(idx4i, idx5i, idx6i, val4i, val5i, val6i,
2016 &dummy1, &idx22s, &idx23bs,
2017 &dummy2, &val22s, &val23bs);
2019 sort2(idx23as, idx23bs, val23as, val23bs, &idx23s, idx5o, &val23s, &dummy1);
2021 sort3(idx21s, idx22s, idx23s, val21s, val22s, val23s,
2022 &dummy1, &dummy2, idx6o,
2023 &dummy3, &dummy4, &dummy5);
2033 LOG(
debug) <<
"Reading packed configuration";
2039 int step, bwidth, nwords, exitFlag, bitcnt;
2041 unsigned short caddr;
2042 unsigned int dat, msk, header, dataHi;
2044 while (idx <
size && *
data != 0x00000000) {
2046 int rob = (*
data >> 28) & 0x7;
2047 int mcm = (*
data >> 24) & 0xf;
2049 LOG(
debug) <<
"Config of det. " << det <<
" MCM " <<
rob <<
":" <<
mcm <<
" (0x" << std::hex << *
data <<
")";
2052 while (idx <
size && *
data != 0x00000000) {
2058 LOG(
debug) <<
"read: 0x" << hex << header;
2062 dat = (header >> 2) & 0xFFFF;
2063 caddr = (header >> 18) & 0x3FFF;
2065 if (caddr != 0x1FFF)
2070 LOG(
debug) <<
"read: 0x" << hex << dataHi;
2073 err += ((dataHi ^ (dat | 1)) & 0xFFFF) != 0;
2074 dat = (dataHi & 0xFFFF0000) | dat;
2078 LOG(
debug) <<
"(single-write): non-existing address 0x" << std::hex << caddr <<
" containing 0x" << std::hex << header;
2081 LOG(
debug) <<
"(single-write): no more data, missing end marker";
2085 LOG(
debug) <<
"(single-write): address 0x" << setw(4) << std::hex << caddr <<
" => old endmarker?" << std::dec;
2092 step = (header >> 1) & 0x0003;
2093 bwidth = ((header >> 3) & 0x001F) + 1;
2094 nwords = (header >> 8) & 0x00FF;
2095 caddr = (header >> 16) & 0xFFFF;
2096 exitFlag = (step == 0) || (step == 3) || (nwords == 0);
2108 msk = (1 << bwidth) - 1;
2110 while (nwords > 0) {
2115 LOG(
debug) <<
"read 0x" << setw(8) << std::hex << header << std::dec;
2118 err += (header & 1);
2119 header = header >> 1;
2120 bitcnt = 31 - bwidth;
2122 LOG(
debug) <<
"addr=0x" << setw(4) << std::hex << caddr <<
"(" << cfg->
getRegName(cfg->
getRegByAddress(caddr)) <<
") data=0x" << setw(8) << std::hex << (header & msk);
2123 if (!cfg->
poke(caddr, header & msk, det,
rob,
mcm)) {
2124 LOG(
debug) <<
"(single-write): non-existing address 0x" << setw(4) << std::hex << caddr <<
" containing 0x" << setw(8) << std::hex << header << std::dec;
2128 header = header >> bwidth;
2130 LOG(
debug) <<
"(block-write): no end marker! " << idx <<
" words read";
2137 while (nwords > 0) {
2139 LOG(
debug) <<
"read 0x" << setw(8) << std::hex << header;
2143 err += (header & 1);
2146 if (!cfg->
poke(caddr, header >> 1, det,
rob,
mcm)) {
2147 LOG(
debug) <<
"(single-write): non-existing address 0x" << setw(4) << std::hex <<
" containing 0x" << setw(8) << std::hex << header << std::dec;
2152 LOG(
debug) <<
"no end marker! " << idx <<
" words read";
2164 LOG(
debug) <<
"no end marker! " << idx <<
" words read";
bool const GPUTPCGMMerger::trackCluster * c1
std::vector< uint16_t > nsamples
Class for time synchronization of RawReader instances.
bool getUseTimeOffset() const
static int getPadRowFromMCM(int irob, int imcm)
static FeeParam * instance()
bool getUseMisalignCorr() const
static constexpr uint64_t posbs
static constexpr uint64_t Q1bs
static constexpr uint64_t colbs
static constexpr uint64_t slopebs
static constexpr uint64_t Q2bs
static constexpr uint64_t padrowbs
static constexpr uint64_t hcidbs
static constexpr uint64_t formatbs
void printDatx(std::ostream &os, unsigned int addr, unsigned int data, int rob, int mcm)
bool poke(int addr, unsigned int value, int det, int rob, int mcm)
unsigned int getDmemUnsigned(int addr, int det, int rob, int mcm)
std::string getRegName(TrapReg_t reg)
int getTrapReg(TrapReg_t reg, int det=-1, int rob=-1, int mcm=-1)
TrapReg_t getRegByAddress(int address)
void filterPedestalInit(int baseline=10)
static const int mgkFormatIndex
unsigned short filterTailNextSample(int adc, unsigned short value)
static std::ostream & raw(std::ostream &os)
void printFitRegXml(std::ostream &os) const
static constexpr int mgkDmemAddrTimeOffset
static bool readPackedConfig(TrapConfig *cfg, int hc, unsigned int *data, int size)
void printAdcDatDatx(std::ostream &os, bool broadcast=kFALSE, int timeBinOffset=-1) const
static std::ostream & cfdat(std::ostream &os)
void noiseTest(int nsamples, int mean, int sigma, int inputGain=1, int inputTail=2)
int getDataFiltered(int iadc, int timebin) const
void zeroSupressionMapping()
int getNumberOfTimeBins() const
void printAdcDatTxt(std::ostream &os) const
void printAdcDatXml(std::ostream &os) const
bool checkInitialized() const
static std::ostream & text(std::ostream &os)
static constexpr int mgkDmemAddrNdrift
int getDataRaw(int iadc, int timebin) const
static const std::array< unsigned short, 4 > mgkFPshifts
static const int mgkAddDigits
void setData(int iadc, const ArrayADC &adc, unsigned int digitIdx)
unsigned short filterGainNextSample(int adc, unsigned short value)
unsigned short filterPedestalNextSample(int adc, int timebin, unsigned short value)
void printTrackletsXml(std::ostream &os) const
void print(int choice) const
void draw(int choice, int index)
static constexpr int mgkDmemAddrYcorr
void filterTailInit(int baseline=-1)
void init(TrapConfig *trapconfig, int det, int rob, int mcm)
void printAdcDatHuman(std::ostream &os) const
void addHitToFitreg(int adc, unsigned short timebin, unsigned short qtot, short ypos)
int packData(std::vector< uint32_t > &rawdata, uint32_t offset) const
void setDataPedestal(int iadc)
float sum(float s, o2::dcs::DataPointValue v)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * value
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLboolean GLboolean GLboolean GLboolean a
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLint GLsizei GLint GLenum format
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
constexpr int NMCMROBINCOL
the number of MCMs per ROB in column direction
constexpr int TRACKLETENDMARKER
marker for the end of tracklets in raw data, 2 of these.
constexpr int NCPU
the number of CPUs inside the TRAP chip
constexpr int NOTRACKLETFIT
this value is assigned to the fit pointer in case no tracklet is available
constexpr int PADGRANULARITYTRKLSLOPE
tracklet deflection is stored in units of 1/128 pad per time bin
constexpr int PADGRANULARITYTRKLPOS
tracklet position is stored in units of 1/40 pad
constexpr int NADCMCM
the number of ADC channels per MCM
constexpr int NCOLMCM
the number of pads per MCM
constexpr int CHANNELNRNOTRKLT
this marks channels in the ADC mask which don't contribute to a tracklet
void printTrackletMCMHeader(const o2::trd::TrackletMCMHeader &mcmhead)
std::array< ADC_t, constants::TIMEBINS > ArrayADC
void printTrackletMCMData(const o2::trd::TrackletMCMData &tracklet)
std::ostream & operator<<(std::ostream &stream, const Digit &d)
Defining DataPointCompositeObject explicitly as copiable.
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"
std::vector< Tracklet64 > tracklets