212 auto msDescriptor = ts.descriptor(uMsCompIdx, uMsIdx);
214 const uint8_t* msContent =
reinterpret_cast<const uint8_t*
>(ts.content(uMsCompIdx, uMsIdx));
216 uint32_t uSize = msDescriptor.size;
222 <<
" has size: " << uSize;
232 LOG(info) <<
"---------------------------------------------------------------";
235 LOG(warning) <<
"Could not find the gDPB index for AFCK id 0x" << std::hex <<
fuCurrDpbId << std::dec
236 <<
" in timeslice " <<
fulCurrentTsIdx <<
" in microslice " << uMsIdx <<
" component " << uMsCompIdx
238 <<
"If valid this index has to be added in the PSD "
239 "parameter file in the DbpIdArray field";
259 LOG(error) <<
"The input microslice buffer does NOT "
260 <<
"contain only complete nDPB messages!";
268 LOG(error) <<
"CbmMcbm2018UnpackerAlgoPsd:: Negative time! MS time = " <<
fdMsTime
277 const uint64_t* pInBuff =
reinterpret_cast<const uint64_t*
>(msContent);
288 if ((fair::Logger::Logging(fair::Severity::debug)) && (uNbMessages > 1)) {
289 printf(
"%u = %u 64bit messages\n", uSize, uNbMessages);
290 for (uint32_t line_iter = 0; line_iter < uNbMessages - 2; line_iter += 2) {
291 printf(
"%010llx",
static_cast<unsigned long long int>(pInBuff[line_iter] & 0xffffffffff));
292 printf(
"%010llx",
static_cast<unsigned long long int>(pInBuff[line_iter + 1] & 0xffffffffff));
293 printf(
" %u - %u", line_iter + 1, line_iter + 2);
296 printf(
"%020llx %u\n",
static_cast<unsigned long long int>(pInBuff[uNbMessages - 1]), uNbMessages);
300 if (uNbMessages > 1) {
307 if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.
SetPrintOutMode(
true);
310 int ReadResult = PsdReader.
ReadMs();
311 if (fair::Logger::Logging(fair::Severity::debug)) {
315 if (ReadResult == 0) {
317 double prev_hit_time =
321 for (uint64_t hit_iter = 0; hit_iter < PsdReader.
VectHitHdr.size(); hit_iter++) {
323 LOG(error) <<
"Different vector headers sizes!"
324 <<
" in VectPackHdr " << PsdReader.
VectPackHdr.size() <<
" in VectHitHdr "
329 uint8_t uHitChannel = PsdReader.
VectHitHdr.at(hit_iter).uHitChannel;
332 LOG(error) <<
"hit channel number out of range! channel index: " << uHitChannel
338 UInt_t fuAddress = uChanUId;
339 Double_t fdTime = dMsRelativeTime + (double) PsdReader.
VectPackHdr.at(hit_iter).uAdcTime * 12.5
343 Double_t fdEdep = (double) PsdReader.
VectHitHdr.at(hit_iter).uSignalCharge
345 UInt_t fuZL = PsdReader.
VectHitHdr.at(hit_iter).uZeroLevel;
346 Double_t fdAccum = (double) PsdReader.
VectHitHdr.at(hit_iter).uFeeAccum;
347 Double_t fdAdcTime = (double) PsdReader.
VectPackHdr.at(hit_iter).uAdcTime;
349 Double_t fdEdepWfm = 0.;
350 Double_t fdAmpl = 0.;
351 UInt_t fuMinimum = 0;
352 UInt_t fuTimeMax = 0;
353 std::vector<uint16_t> fuWfm = PsdReader.
VectHitData.at(hit_iter).uWfm;
355 Double_t fdFitAmpl = 0.;
356 Double_t fdFitZL = 0.;
357 Double_t fdFitEdep = 0.;
358 Double_t fdFitR2 = 999.;
359 Double_t fdFitTimeMax = -1.;
360 std::vector<uint16_t> fuFitWfm;
362 if (!fuWfm.empty()) {
364 int32_t iHitChargeWfm = std::accumulate(fuWfm.begin(), fuWfm.end(), -fuZL * fuWfm.size());
365 auto const max_iter = std::max_element(fuWfm.begin(), fuWfm.end());
366 assert(max_iter != fuWfm.end());
367 if (max_iter == fuWfm.end())
break;
368 uint8_t uHitTimeMax = std::distance(fuWfm.begin(), max_iter);
369 int32_t iHitAmlpitude = *max_iter - fuZL;
370 auto const min_iter = std::min_element(fuWfm.begin(), fuWfm.end());
371 uint32_t uHitMinimum = *min_iter;
373 fdEdepWfm = (double) iHitChargeWfm /
fUnpackPar->GetMipCalibration(uHitChannel);
374 fdAmpl = (double) iHitAmlpitude / 16.5;
375 fuTimeMax = uHitTimeMax;
376 fuMinimum = uHitMinimum;
379 int gate_end = (int) fuWfm.size() - 1;
386 std::complex<float> first_fit_harmonic = {0.72, 0.0};
387 std::complex<float> second_fit_harmonic = {0.38, -0.0};
396 fdFitR2 = Pfitter.
GetRSquare(gate_beg, gate_end);
402 CbmPsdDsp dsp =
CbmPsdDsp(fuAddress, fdTime, fdTsTime, fdEdep, fuZL, fdAccum, fdAdcTime,
404 fdEdepWfm, fdAmpl, fuMinimum, fuTimeMax, fuWfm,
406 fdFitAmpl, fdFitZL, fdFitEdep, fdFitR2, fdFitTimeMax, fuFitWfm);
408 std::unique_ptr<CbmPsdDigi> digi =
MakeDigi(dsp);
414 if (fdTime < prev_hit_time) printf(
"negative time btw hits! %f after %f \n", fdTime, prev_hit_time);
416 prev_hit_time = fdTime;
421 else if (ReadResult == 1) {
422 LOG(error) <<
"no pack headers in message!";
425 else if (ReadResult == 2) {
429 else if (ReadResult == 3) {
430 LOG(error) <<
"check number of waveform points! In header: " << PsdReader.
HitHdr.
uWfmWords - 1;
434 LOG(error) <<
"PsdGbtReader.ReadEventFles() didn't return expected values";
442 LOG(error) <<
"Wrong amount of messages read!"
458 LOG(error) <<
"too many triggered channels! In header: " << PsdReader.
EvHdrAb.
uHitsNumber
463 if (ReadResult == 0) {
466 UInt_t uHitChannel = PsdReader.
VectHitHdr.at(hit_iter).uHitChannel;
467 UInt_t uSignalCharge = PsdReader.
VectHitHdr.at(hit_iter).uSignalCharge;
473 LOG(error) <<
"hit channel number out of range! channel index: " << uHitChannel
479 LOG(debug) << Form(
"Insert 0x%08x digi with charge ", uChanUId) << uSignalCharge
483 fPsdDigiVector->emplace_back(uChanUId, dHitTime, (
double) uSignalCharge);
487 else if (ReadResult == 1) {
488 LOG(error) <<
"no event headers in message!";
491 else if (ReadResult == 2) {
492 LOG(error) <<
"check number of waveform points! In header: " << PsdReader.
HitHdr.
uWfmPoints
493 <<
" should be: " << 8;
496 else if (ReadResult == 3) {
497 LOG(error) <<
"wrong amount of hits read! In header: " << PsdReader.
EvHdrAb.
uHitsNumber
498 <<
" in hit vector: " << PsdReader.
VectHitHdr.size();
502 LOG(error) <<
"PsdGbtReader.ReadEventFles() didn't return expected values";
509 LOG(error) <<
"Wrong amount of messages read!"
514 LOG(error) <<
"Wrong MS index!"