diff --git a/core/data/raw/PsdGbtDataFormat-v1.00.h b/core/data/raw/PsdGbtDataFormat-v1.00.h index 36073046074407e567bb33834fcc2ef59ad99efb..9193d97f595785206d42f12a4d0ca97e93b3c5ef 100644 --- a/core/data/raw/PsdGbtDataFormat-v1.00.h +++ b/core/data/raw/PsdGbtDataFormat-v1.00.h @@ -135,7 +135,7 @@ namespace PsdDataV100 { printf("waveform: "); for (uint8_t iter = 0; iter < uWfm.size(); iter++) - printf("%u\n ", uWfm.at(iter)); + printf("%u ", uWfm.at(iter)); printf("\n"); } diff --git a/core/data/raw/stash.patch b/core/data/raw/stash.patch deleted file mode 100644 index fdc0247c85a36ee669ce5fb32eed20e45dfbf816..0000000000000000000000000000000000000000 --- a/core/data/raw/stash.patch +++ /dev/null @@ -1,857 +0,0 @@ -diff --git a/MQ/monitor/CMakeLists.txt b/MQ/monitor/CMakeLists.txt -index e8366b2b..56ec47c9 100644 ---- a/MQ/monitor/CMakeLists.txt -+++ b/MQ/monitor/CMakeLists.txt -@@ -3,7 +3,7 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerT0Monitor2020.sh.in ${C - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerTofMonitor2020.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startMQSamplerTofMonitor2020.sh) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerT0Monitor2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startMQSamplerT0Monitor2021.sh) - configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerTofMonitor2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startMQSamplerTofMonitor2021.sh) --configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerPsdMonitor2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startMQSamplerPsdMonitor2021.sh) -+#configure_file(${CMAKE_CURRENT_SOURCE_DIR}/startMQSamplerPsdMonitor2021.sh.in ${CMAKE_BINARY_DIR}/bin/MQ/topologies/startMQSamplerPsdMonitor2021.sh) - - - set(INCLUDE_DIRECTORIES -@@ -131,5 +131,5 @@ set(DEPENDENCIES - RHTTP - ) - #GENERATE_LIBRARY() --GENERATE_EXECUTABLE() -+#GENERATE_EXECUTABLE() - -diff --git a/core/data/CMakeLists.txt b/core/data/CMakeLists.txt -index 95559844..4814515d 100644 ---- a/core/data/CMakeLists.txt -+++ b/core/data/CMakeLists.txt -@@ -139,6 +139,6 @@ GENERATE_LIBRARY() - # Install file which has no corresponding source file - Install(FILES - CbmDefs.h rich/CbmRichRingLight.h base/CbmDigiVector.h -- raw/bitmask_operators.hpp raw/PsdGbtDataFormat.h -+ raw/bitmask_operators.hpp raw/PsdGbtDataFormatV100.h - DESTINATION include - ) -diff --git a/core/data/raw/PsdGbtReader.cxx b/core/data/raw/PsdGbtReader.cxx -index 421f61ad..c0de94d4 100644 ---- a/core/data/raw/PsdGbtReader.cxx -+++ b/core/data/raw/PsdGbtReader.cxx -@@ -7,122 +7,198 @@ - - #include "PsdGbtReader.h" - --#include <cstdint> // for uint16_t, uint64_t, uint32_t -- - namespace PsdData { - - PsdGbtReader::~PsdGbtReader() { -- EvHdrAb.clear(); -- EvHdrAc.clear(); -+ MsHdr.clear(); -+ PackHdr.clear(); - HitHdr.clear(); - HitData.clear(); -+ VectPackHdr.clear(); - VectHitHdr.clear(); - VectHitData.clear(); - } - -- void PsdGbtReader::ReadEventHeaderAbFles() { -- EvHdrAb.clear(); -- buffer_shift = 0; -- EvHdrAb.ulMicroSlice = -- (buffer[gbt_word_index] >> buffer_shift) & 0xffffffffffffffff; -- gbt_word_index++; -+ void PsdGbtReader::ReadMsHeader() { -+ MsHdr.clear(); -+ save_buffer.push_back(std::to_string(buffer[word_index])); -+ save_buffer.push_back(std::to_string(buffer[word_index+1])); - -- buffer_shift = 0; -- EvHdrAb.uHitsNumber = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << EvHdrAb.HNs) - 1); -- buffer_shift += EvHdrAb.HNs; -- EvHdrAb.uMagicWordAB = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << EvHdrAb.MWs) - 1); -- gbt_word_index++; -- -- if (PrintOut) EvHdrAb.printout(); -+ MsHdr.uMagicWord = (buffer[word_index] >> 32) & 0xff; -+ MsHdr.ulMicroSlice = ((buffer[word_index] & 0xffffff) << 40) | (buffer[word_index+1] & 0xffffffffff); -+ word_index+=2; -+ -+ if(print) MsHdr.printout(); - } - -- void PsdGbtReader::ReadEventHeaderAcFles() { -- EvHdrAc.clear(); -- buffer_shift = 0; -- EvHdrAc.uAdcTime = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint64_t>(1)) << EvHdrAc.TMs) - 1); -- gbt_word_index++; -+ void PsdGbtReader::ReadPackHeader() { -+ PackHdr.clear(); -+ save_buffer.push_back(std::to_string(buffer[word_index])); -+ save_buffer.push_back(std::to_string(buffer[word_index+1])); -+ -+ buffer_shift = 0; -+ PackHdr.uHitsNumber = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint16_t>(1)) << PackHdr.HNs) - 1); -+ buffer_shift += PackHdr.HNs+PackHdr.E0s; -+ PackHdr.uLinkIndex = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint16_t>(1)) << PackHdr.LIs) - 1); -+ buffer_shift += PackHdr.LIs; -+ PackHdr.uMagicWord = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint16_t>(1)) << PackHdr.MWs) - 1); -+ word_index++; - - buffer_shift = 0; -- EvHdrAc.uPacketVersion = -- (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << EvHdrAc.PVs) - 1); -- buffer_shift += EvHdrAc.PVs; -- EvHdrAc.uMagicWordAC = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << EvHdrAc.MWs) - 1); -- gbt_word_index++; -- -- if (PrintOut) EvHdrAc.printout(); -+ -+ PackHdr.uAdcTime = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint64_t>(1)) << PackHdr.TMs) - 1); -+ buffer_shift += PackHdr.TMs; -+ PackHdr.uTotalWords = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint32_t>(1)) << PackHdr.TWs) - 1); -+ word_index++; -+ -+ if(print) PackHdr.printout(); - } - -- void PsdGbtReader::ReadHitHeaderFles() { -+ void PsdGbtReader::ReadHitHeader() { - HitHdr.clear(); -- buffer_shift = 0; -- HitHdr.uZeroLevel = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << HitHdr.ZLs) - 1); -+ save_buffer.push_back(std::to_string(buffer[word_index])); -+ save_buffer.push_back(std::to_string(buffer[word_index+1])); -+ -+ buffer_shift = 24; -+ HitHdr.uWfmWords = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint16_t>(1)) << HitHdr.WWs) - 1); -+ buffer_shift += HitHdr.WWs; -+ HitHdr.uHitChannel = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint32_t>(1)) << HitHdr.HCs) - 1); -+ word_index++; -+ -+ buffer_shift = 0; -+ HitHdr.uZeroLevel = (buffer[word_index] >> buffer_shift) -+ & (((static_cast<uint32_t>(1)) << HitHdr.ZLs) - 1); - buffer_shift += HitHdr.ZLs; -- HitHdr.uSignalCharge = (buffer[gbt_word_index] >> buffer_shift) -+ HitHdr.uSignalCharge = (buffer[word_index] >> buffer_shift) - & (((static_cast<uint32_t>(1)) << HitHdr.SCs) - 1); -- gbt_word_index++; -+ word_index++; - -- buffer_shift = 0; -- HitHdr.uHitChannel = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << HitHdr.HCs) - 1); -- buffer_shift += HitHdr.HCs; -- HitHdr.uWfmPoints = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << HitHdr.WPSs) - 1); -- gbt_word_index++; -- -- if (PrintOut) HitHdr.printout(); -+ if(print) HitHdr.printout(); - } - -- void PsdGbtReader::ReadHitDataFles() { -- HitData.clear(); -- buffer_shift = 64; -- for (int wfm_pt_iter = 0; wfm_pt_iter < HitHdr.uWfmPoints; wfm_pt_iter++) { -- buffer_shift -= HitData.WPs; -- uint16_t wfm_point = (buffer[gbt_word_index] >> buffer_shift) -- & (((static_cast<uint32_t>(1)) << HitData.WPs) - 1); -- HitData.uWfm.push_back(wfm_point); -- if (buffer_shift == 0) { -- gbt_word_index += 2; -- buffer_shift = 64; -- } -- } -- -- if (PrintOut) HitData.printout(); -+ void PsdGbtReader::ReadHitData() { -+ save_buffer.push_back(std::to_string(buffer[word_index])); -+ save_buffer.push_back(std::to_string(buffer[word_index+1])); -+ -+ uint16_t wfm_point = 0; -+ wfm_point = ((buffer[word_index] >> 8) & 0xffff); -+ HitData.uWfm.push_back(wfm_point); -+ wfm_point = ((buffer[word_index] & 0xff) << 8) | ((buffer[word_index+1] >> 32) & 0xff); -+ HitData.uWfm.push_back(wfm_point); -+ word_index++; -+ -+ wfm_point = ((buffer[word_index] >> 16) & 0xffff); -+ HitData.uWfm.push_back(wfm_point); -+ wfm_point = (buffer[word_index] & 0xffff); -+ HitData.uWfm.push_back(wfm_point); -+ word_index++; - } - -- int PsdGbtReader::ReadEventFles() { -- bool IsAbHeaderInMessage = false; -- bool IsAcHeaderInMessage = false; -+ int PsdGbtReader::ReadMs() { -+ -+ -+ -+ -+ -+ -+ -+ save_buffer.clear(); -+ bool word_is_Ms_header = false; -+ -+ while(!word_is_Ms_header) -+ { -+ ReadMsHeader(); -+ word_is_Ms_header = (MsHdr.uMagicWord == 0xa0); -+ -+ if(word_is_Ms_header) { ms_hdrs_read++; break; } -+ else words_missed++; -+ } -+ -+ bool word_is_Pack_header = true; -+ VectPackHdr.clear(); -+ VectHitHdr.clear(); -+ VectHitData.clear(); -+ -+ while(word_is_Pack_header) -+ { -+ ReadPackHeader(); -+ -+ if(PackHdr.uMagicWord != 0xb) -+ { -+ word_is_Pack_header = false; -+ if(print) printf("End of microslice\n"); -+ word_index-=2; -+ save_buffer.pop_back(); -+ break; //return 1; //TODO uncomment me -+ } -+ else -+ { -+ //hit loop -+ for(int hit_iter = 0; hit_iter < PackHdr.uHitsNumber; hit_iter++) -+ { -+ ReadHitHeader(); -+ if(HitHdr.uHitChannel > 32) return 2; -+ -+ VectHitHdr.emplace_back(HitHdr); -+ VectPackHdr.emplace_back(PackHdr); //for convenient use of uAdcTime with each hit -+ -+ HitData.clear(); -+ if(HitHdr.uWfmWords > 10) return 3; -+ for(int wfm_word_iter = 0; wfm_word_iter < HitHdr.uWfmWords-1; wfm_word_iter++) -+ ReadHitData(); -+ -+ VectHitData.emplace_back(HitData); -+ if(print) HitData.printout(); -+ -+ } //hit loop -+ } -+ -+ } -+ ms_ends_read++; -+ -+ return 0; -+ -+} -+ -+ -+ -+ -+ -+void PsdGbtReader::PrintSaveBuff() -+{ -+ for (auto & elem : save_buffer) printf("%s\n", elem.c_str()); -+} -+ -+void PsdGbtReader::PrintOut() -+{ -+ MsHdr.printout(); -+ for(int hit_iter = 0; hit_iter < (int)VectPackHdr.size(); hit_iter++) -+ { -+ VectPackHdr.at(hit_iter).printout(); -+ VectHitHdr.at(hit_iter).printout(); -+ VectHitData.at(hit_iter).printout(); -+ } -+ PackHdr.printout(); -+ -+} -+ -+ -+ -+ -+ -+ -+ - -- ReadEventHeaderAbFles(); -- ReadEventHeaderAcFles(); -- IsAbHeaderInMessage = (EvHdrAb.uMagicWordAB == 171); -- IsAcHeaderInMessage = (EvHdrAc.uMagicWordAC == 172); - -- if (IsAbHeaderInMessage && IsAcHeaderInMessage) { -- VectHitHdr.clear(); -- VectHitData.clear(); - -- //hit loop -- for (int hit_iter = 0; hit_iter < EvHdrAb.uHitsNumber; hit_iter++) { -- ReadHitHeaderFles(); -- VectHitHdr.push_back(HitHdr); -- ReadHitDataFles(); -- VectHitData.push_back(HitData); - -- if (VectHitHdr.at(hit_iter).uWfmPoints != 8) { return 2; } -- } //hit loop - -- if (EvHdrAb.uHitsNumber != VectHitHdr.size()) { return 3; } -- } else { -- return 1; -- } - -- return 0; -- } - } // namespace PsdData -diff --git a/core/data/raw/PsdGbtReader.h b/core/data/raw/PsdGbtReader.h -index bfac3d37..d4c14a8b 100644 ---- a/core/data/raw/PsdGbtReader.h -+++ b/core/data/raw/PsdGbtReader.h -@@ -8,51 +8,63 @@ - #ifndef PSD_GBT_READER_H_ - #define PSD_GBT_READER_H_ - -+#include <cstdint> // for uint16_t, uint64_t, uint32_t - #include <stdint.h> // for uint64_t, uint32_t - #include <vector> // for vector -+#include <string> // for string - --#include "PsdGbtDataFormat.h" // for PsdHitData, PsdHitHeader, PsdEventHead... -- -+#include "PsdGbtDataFormatV100.h" - namespace PsdData { -- class PsdGbtReader { - -+ class PsdGbtReader { - public: - PsdGbtReader() {}; -- PsdGbtReader(const uint64_t* input) { -+ PsdGbtReader(const uint64_t* input, uint8_t data_vers) { - buffer = input; -- gbt_word_index = 0; -+ data_version = data_vers; - } - -- ~PsdGbtReader(); -+ void SetInput(const uint64_t* input, uint8_t data_vers) { -+ buffer = input; -+ data_version = data_vers; -+ } -+ std::vector<std::string> save_buffer; - -- PsdEventHeaderAB EvHdrAb; -- PsdEventHeaderAC EvHdrAc; -- PsdHitHeader HitHdr; -- PsdHitData HitData; -+ struct PsdMsHeader MsHdr; -+ struct PsdPackHeader PackHdr; -+ struct PsdHitHeader HitHdr; -+ struct PsdHitData HitData; - -- std::vector<PsdHitHeader> VectHitHdr; -- std::vector<PsdHitData> VectHitData; -+ std::vector<struct PsdPackHeader> VectPackHdr; -+ std::vector<struct PsdHitHeader> VectHitHdr; -+ std::vector<struct PsdHitData> VectHitData; - -- void SetInput(const uint64_t* input) { -- buffer = input; -- gbt_word_index = 0; -- } -- void SetPrintOutMode(bool mode) { PrintOut = mode; } -- void ReadEventHeaderAbFles(); -- void ReadEventHeaderAcFles(); -- void ReadHitHeaderFles(); -- void ReadHitDataFles(); -- int ReadEventFles(); -+ void ReadMsHeader(); -+ void ReadPackHeader(); -+ void ReadHitHeader(); -+ void ReadHitData(); -+ int ReadMs(); -+ -+ void PrintSaveBuff(); -+ void PrintOut(); - - //Getters -- uint32_t GetTotalGbtWordsRead() { return gbt_word_index; } -+ uint32_t GetTotalGbtWordsRead() { return word_index; } -+ -+ void SetPrintOutMode(bool mode) { print = mode; } -+ ~PsdGbtReader(); -+ -+ int word_index = 0; -+ int words_missed = 0; -+ int ms_hdrs_read = 0; -+ int ms_ends_read = 0; - - private: - const uint64_t* buffer; -+ uint8_t data_version; - -- bool PrintOut = false; -- uint32_t gbt_word_index = 0; -- int buffer_shift = 0; -+ bool print = false; -+ int buffer_shift = 0; - }; - } // namespace PsdData - -diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx -index 2c4d8254..76d1fef0 100644 ---- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx -+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx -@@ -358,44 +358,47 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, - } - } - -- PsdData::PsdGbtReader PsdReader(pInBuff); -+ PsdData::PsdGbtReader PsdReader(pInBuff, 1); - if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.SetPrintOutMode(true); -- if (uSize > 0) { -+ // every 80bit gbt word is decomposed into two 64bit words -+ if (uSize > 1) { - while (PsdReader.GetTotalGbtWordsRead() < uNbMessages) { -- int ReadResult = PsdReader.ReadEventFles(); -- if (PsdReader.EvHdrAb.uHitsNumber > kuNbChanPsd) { -- LOG(error) << "too many triggered channels! In header: " -- << PsdReader.EvHdrAb.uHitsNumber -- << " in PSD: " << GetNbChanPsd(); -- break; -- } -+ int ReadResult = PsdReader.ReadMs(); - - if (ReadResult == 0) { - fuCountsLastSecond++; -- fhAdcTime->Fill(PsdReader.EvHdrAc.uAdcTime); - fuReadEvtCntInMs++; - - //hit loop -- for (int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; -- hit_iter++) { -- UInt_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel; -- UInt_t uSignalCharge = -- PsdReader.VectHitHdr.at(hit_iter).uSignalCharge; -- UInt_t uZeroLevel = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel; -+ for (uint64_t hit_iter = 0; hit_iter < PsdReader.VectHitHdr.size(); hit_iter++) { -+ if(PsdReader.VectPackHdr.size() != PsdReader.VectHitHdr.size()){ -+ LOG(error) << "Different vector headers sizes!" -+ << " in VectPackHdr " << PsdReader.VectPackHdr.size() -+ << " in VectHitHdr " << PsdReader.VectHitHdr.size() << "\n"; -+ break; -+ } -+ -+ uint8_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel; -+ uint8_t uLinkIndex = PsdReader.VectPackHdr.at(hit_iter).uLinkIndex; -+ uint32_t uSignalCharge = PsdReader.VectHitHdr.at(hit_iter).uSignalCharge; -+ uint16_t uZeroLevel = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel; -+ //double dHitTime = (double) fulCurrentMsIdx + PsdReader.VectPackHdr.at(hit_iter).uAdcTime*12.5; //in ns -+ double dHitTime = PsdReader.MsHdr.ulMicroSlice*1000. + PsdReader.VectPackHdr.at(hit_iter).uAdcTime*12.5; //in ns - std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm; - -- if (uHitChannel >= kuNbChanPsd) //uHitChannel numerated from 0 -- { -+ fhAdcTime->Fill(PsdReader.VectPackHdr.at(hit_iter).uAdcTime); -+ -+ //uHitChannel numerated from 0 -+ if (uHitChannel >= kuNbChanPsd){ - LOG(error) << "hit channel number out of range! channel index: " - << uHitChannel << " max: " << GetNbChanPsd(); - break; - } -- //Hit header -+ -+ //Pack header - fhHitChargeMap->Fill(uHitChannel, uSignalCharge); - fhHitMapEvo->Fill(uHitChannel, fdMsTime - fdStartTime); -- fhChanHitMapEvo->Fill( -- uHitChannel, -- fdMsTime - fdStartTime); //should be placed map(channel) -+ fhChanHitMapEvo->Fill(uHitChannel, fdMsTime - fdStartTime); //should be placed map(channel) - - if (fbMonitorChanMode) { - -@@ -403,18 +406,27 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, - fvhHitZeroLevelChan[uHitChannel]->Fill(uZeroLevel); - - //Hit data -- uint16_t uHitAmlpitude = 0; -- UInt_t uHitChargeWfm = 0; -+ int32_t iHitAmlpitude = 0; -+ int32_t iHitChargeWfm = 0; - if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Reset(); - if (fbMonitorFitMode) fvhHitFitWfmChan[uHitChannel]->Reset(); -- for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++) { -- if (uWfm.at(wfm_iter) > uHitAmlpitude) uHitAmlpitude = uWfm.at(wfm_iter); -- uHitChargeWfm += uWfm.at(wfm_iter) - uZeroLevel; -- if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter)); -+ -+ if(!uWfm.empty()){ -+ iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0); -+ iHitChargeWfm -= uZeroLevel*uWfm.size(); -+ -+ auto const max_iter = std::max_element(uWfm.begin(), uWfm.end()); -+ assert(max_iter != uWfm.end()); -+ if (max_iter == uWfm.end()) break; -+ -+ uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter); -+ iHitAmlpitude = *max_iter-uZeroLevel; -+ -+ for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++) -+ if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter)); - } -- uHitAmlpitude -= uZeroLevel; -- fvhHitAmplChan[uHitChannel]->Fill(uHitAmlpitude); -- fvhHitChargeByWfmChan[uHitChannel]->Fill(uHitChargeWfm); -+ fvhHitAmplChan[uHitChannel]->Fill(iHitAmlpitude); -+ fvhHitChargeByWfmChan[uHitChannel]->Fill(iHitChargeWfm); - - if (fbMonitorWfmMode) { - fvhHitWfmChan[uHitChannel]->SetTitle(Form("Waveform channel %03u charge %0u zero level %0u; Time [adc " -@@ -447,7 +459,7 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, - - if (fbMonitorFitMode) { - int gate_beg = 0; -- int gate_end = 7; -+ int gate_end = uWfm.size()-1; - PsdSignalFitting::PronyFitter Pfitter(2, 2, gate_beg, gate_end); - - Pfitter.SetDebugMode(0); -@@ -480,18 +492,16 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, - } //if (fbMonitorChanMode) - - } // for(int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++) -- - } else if (ReadResult == 1) { -- LOG(error) << "no event headers in message!"; -+ LOG(error) << "no pack headers in message!"; - break; - } else if (ReadResult == 2) { -- LOG(error) << "check number of waveform points! In header: " -- << PsdReader.HitHdr.uWfmPoints << " should be: " << 8; -+ LOG(error) << "wrong channel! In header: " -+ << PsdReader.HitHdr.uHitChannel; - break; - } else if (ReadResult == 3) { -- LOG(error) << "wrong amount of hits read! In header: " -- << PsdReader.EvHdrAb.uHitsNumber -- << " in hit vector: " << PsdReader.VectHitHdr.size(); -+ LOG(error) << "check number of waveform points! In header: " -+ << PsdReader.HitHdr.uWfmWords-1 << " should be: LE " << 8; - break; - } else { - LOG(error) -@@ -520,16 +530,16 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, - } - } - -- if (fulCurrentMsIdx != PsdReader.EvHdrAb.ulMicroSlice) -+ if (fulCurrentMsIdx != PsdReader.MsHdr.ulMicroSlice) - LOG(error) << "Wrong MS index!" - << " in microslice " << fulCurrentMsIdx << " by PsdReader " -- << PsdReader.EvHdrAb.ulMicroSlice << "\n"; -+ << PsdReader.MsHdr.ulMicroSlice << "\n"; - - fuMsgsCntInMs += uNbMessages; - fuReadMsgsCntInMs += PsdReader.GetTotalGbtWordsRead(); - fuLostMsgsCntInMs += uNbMessages - PsdReader.GetTotalGbtWordsRead(); - -- } //if(uSize != 0) -+ } //if(uSize > 1) - - if (fdPrevMsTime < 0.) - fdPrevMsTime = fdMsTime; -diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h -index 15a18e82..d9abac39 100644 ---- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h -+++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h -@@ -24,6 +24,7 @@ - // C/C++ - #include <map> - #include <vector> -+#include <numeric> - - class CbmMcbm2018PsdPar; - class TH1; -diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx -index 6061e880..42bba122 100644 ---- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx -+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx -@@ -123,7 +123,7 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::InitParameters() { - fuNrOfGbtx = fUnpackPar->GetNrOfGbtx(); - LOG(info) << "Nr. of GBTx: " << fuNrOfGbtx; - -- //Temporary until creation of full psd map -+ //FIXME Temporary until creation of full psd map - UInt_t uNrOfModules = 1; - UInt_t uNrOfSections = 32; - UInt_t uNrOfChannels = uNrOfModules * uNrOfSections; -@@ -192,7 +192,7 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessTs(const fles::Timeslice& ts) { - // LOG(info) << Form( "TS %5d Start %12f Stop %12f", fulCurrentTsIdx, fdTsStartTime, fdTsStopTimeCore ); - - /// Loop over core microslices (and overlap ones if chosen) -- for (fuMsIndex = 0; fuMsIndex < fuNbMsLoop; fuMsIndex++) { -+ //for (fuMsIndex = 0; fuMsIndex < fuNbMsLoop; fuMsIndex++) { //TODO uncoment me! - /// Loop over registered components - for (UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); - ++uMsCompIdx) { -@@ -204,7 +204,7 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessTs(const fles::Timeslice& ts) { - return kFALSE; - } // if( kFALSE == ProcessMs( ts, uMsCompIdx, fuMsIndex ) ) - } // for( UInt_t uMsCompIdx = 0; uMsCompIdx < fvMsComponentsList.size(); ++uMsCompIdx ) -- } // for( fuMsIndex = 0; fuMsIndex < uNbMsLoop; fuMsIndex ++ ) -+ //} // for( fuMsIndex = 0; fuMsIndex < uNbMsLoop; fuMsIndex ++ ) //TODO uncoment me! - - /// Sort the buffers of hits due to the time offsets applied - std::sort(fDigiVect.begin(), -@@ -287,79 +287,126 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, - uint32_t uNbMessages = - (uSize - (uSize % kuBytesPerMessage)) / kuBytesPerMessage; - -- // Prepare variables for the loop on contents -- const uint64_t* pInBuff = reinterpret_cast<const uint64_t*>(msContent); - -- PsdData::PsdGbtReader PsdReader(pInBuff); -- //PsdReader.SetPrintOutMode(true); -- if (uSize != 0) { -+ -+ -+ const uint16_t total_words = 150; -+ uint64_t* pInBuff = new uint64_t[2*total_words]; -+ for(int i =0; i < 2*total_words; i++) -+ pInBuff[i] = 0; -+ -+ uNbMessages = 2*total_words; -+ -+ std::string filename = "/mnt/inr/dry24_cosmic/readout.tsa"; -+ -+ FILE *DataFile; -+ DataFile = fopen(filename.data(), "rb"); -+ if(DataFile == NULL){ -+ printf("file was NOT opened: %s\n", filename.data()); -+ return 0; -+ }; -+ printf("\nReading GBT data from file: %s\n\n", filename.data()); -+ -+ -+ //memset(DataFile, 0, sizeof(DataFile)); -+ //int Event_size = 10; -+ //fseek(DataFile, (eventn)*Event_size, SEEK_SET); -+ -+ int buf_iter = 0; -+ //for(long line_iter = 0; line_iter < 50 ; line_iter++) -+ for(long line_iter = 0; (!feof(DataFile)) ; line_iter++) -+ { -+ -+ uint64_t flim_buffer[2] = {0}; -+ std::memset(flim_buffer, 0, sizeof flim_buffer); -+ int read_result = fread(flim_buffer, sizeof(flim_buffer[0]), 2, DataFile); -+ -+ if(read_result == 2){ -+ printf(" -> %016lx and %016lx", flim_buffer[0], flim_buffer[1]); -+ printf("\n"); -+ -+ pInBuff[buf_iter] = flim_buffer[0]; -+ buf_iter++; -+ pInBuff[buf_iter] = flim_buffer[1]; -+ buf_iter++; -+ } -+ -+ std::memset(flim_buffer, 0, sizeof flim_buffer); -+ } -+ fclose(DataFile); -+ -+ -+ -+ -+ -+ // for(int i =0; i < 2*total_words; i++) printf("%016lx\n", pInBuff[i]); -+ -+ PsdData::PsdGbtReader PsdReader(pInBuff, 1); -+ if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.SetPrintOutMode(true); -+ // every 80bit gbt word is decomposed into two 64bit words -+ if (uSize > 1) { - while (PsdReader.GetTotalGbtWordsRead() < uNbMessages) { -- int ReadResult = PsdReader.ReadEventFles(); -- if (PsdReader.EvHdrAb.uHitsNumber > fviPsdChUId.size()) { -- LOG(error) << "too many triggered channels! In header: " -- << PsdReader.EvHdrAb.uHitsNumber -- << " in PSD: " << fviPsdChUId.size(); -- break; -- } -+ int ReadResult = PsdReader.ReadMs(); - - if (ReadResult == 0) { - //hit loop -- for (int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; -- hit_iter++) { -- UInt_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel; -- UInt_t uSignalCharge = -- PsdReader.VectHitHdr.at(hit_iter).uSignalCharge; -- UInt_t uZeroLevel = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel; -+ for (uint64_t hit_iter = 0; hit_iter < PsdReader.VectHitHdr.size(); hit_iter++) { -+ if(PsdReader.VectPackHdr.size() != PsdReader.VectHitHdr.size()){ -+ LOG(error) << "Different vector headers sizes!" -+ << " in VectPackHdr " << PsdReader.VectPackHdr.size() -+ << " in VectHitHdr " << PsdReader.VectHitHdr.size() << "\n"; -+ break; -+ } -+ -+ uint8_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel; -+ uint8_t uLinkIndex = PsdReader.VectPackHdr.at(hit_iter).uLinkIndex; -+ uint32_t uSignalCharge = PsdReader.VectHitHdr.at(hit_iter).uSignalCharge; -+ uint16_t uZeroLevel = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel; -+ //double dHitTime = (double) fulCurrentMsIdx + PsdReader.VectPackHdr.at(hit_iter).uAdcTime*12.5; //in ns -+ double dHitTime = PsdReader.MsHdr.ulMicroSlice*1000. + PsdReader.VectPackHdr.at(hit_iter).uAdcTime*12.5; //in ns - std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm; - -+ int32_t iHitAmlpitude = 0; -+ int32_t iHitChargeWfm = 0; -+ if(!uWfm.empty()){ -+ iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0); -+ iHitChargeWfm -= uZeroLevel*uWfm.size(); -+ -+ auto const max_iter = std::max_element(uWfm.begin(), uWfm.end()); -+ assert(max_iter != uWfm.end()); -+ if (max_iter == uWfm.end()) break; -+ -+ uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter); -+ iHitAmlpitude = *max_iter-uZeroLevel; -+ } -+ - if (uHitChannel >= fviPsdChUId.size()) { - LOG(error) << "hit channel number out of range! channel index: " - << uHitChannel << " max: " << fviPsdChUId.size(); - break; - } - -- UInt_t uChId = uHitChannel; -- UInt_t uRpdChId = uChId; //Should be map(uChId) TODO -- UInt_t uChanUId = fviPsdChUId[uRpdChId]; //unique ID -+ uint8_t uChId = uHitChannel; -+ uint8_t uRpdChId = uChId; //Should be map(uChId) TODO -+ uint8_t uChanUId = fviPsdChUId[uRpdChId]; //unique ID - -- UInt_t uHitAmlpitude = 0; -- UInt_t uHitChargeWfm = 0; -- for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++) { -- if (uWfm.at(wfm_iter) > uHitAmlpitude) -- uHitAmlpitude = uWfm.at(wfm_iter); -- uHitChargeWfm += uWfm.at(wfm_iter) - uZeroLevel; -- } -- uHitAmlpitude -= uZeroLevel; -- -- //printf("0x%08x %u %u %u %f %f\n", uChanUId, uChId, CbmPsdAddress::GetModuleId(uChanUId), CbmPsdAddress::GetSectionId(uChanUId), (double)PsdReader.VectHitHdr.at(hit_iter).uSignalCharge, (double)PsdReader.EvHdrAc.uAdcTime ); -- -- Double_t dAdcTime = (double) PsdReader.EvHdrAb.ulMicroSlice -- + (double) PsdReader.EvHdrAc.uAdcTime * 12.5 -- - fdTimeOffsetNs; -- -- LOG(debug) << Form("Insert 0x%08x digi with charge ", uChanUId) -- << uSignalCharge -- << Form(", at %u,", PsdReader.EvHdrAc.uAdcTime) -- << " epoch: " << PsdReader.EvHdrAb.ulMicroSlice; -- -- fDigiVect.emplace_back(uChanUId, (double) uSignalCharge, dAdcTime); -+ fDigiVect.emplace_back(uChanUId, (double) uSignalCharge, dHitTime); - -- fDigiVect.back().SetAmpl(uHitAmlpitude); -- fDigiVect.back().SetEdepWfm(uHitChargeWfm); -+ fDigiVect.back().SetAmpl(iHitAmlpitude); -+ fDigiVect.back().SetEdepWfm(iHitChargeWfm); - fDigiVect.back().SetZL(uZeroLevel); - - } // for(int hit_iter = 0; hit_iter < PsdReader.EvHdrAb.uHitsNumber; hit_iter++) - } else if (ReadResult == 1) { -- LOG(error) << "no event headers in message!"; -+ LOG(error) << "no pack headers in message!"; - break; - } else if (ReadResult == 2) { -- LOG(error) << "check number of waveform points! In header: " -- << PsdReader.HitHdr.uWfmPoints << " should be: " << 8; -+ LOG(error) << "wrong channel! In header: " -+ << PsdReader.HitHdr.uHitChannel; - break; - } else if (ReadResult == 3) { -- LOG(error) << "wrong amount of hits read! In header: " -- << PsdReader.EvHdrAb.uHitsNumber -- << " in hit vector: " << PsdReader.VectHitHdr.size(); -+ LOG(error) << "check number of waveform points! In header: " -+ << PsdReader.HitHdr.uWfmWords-1 << " should be: LE " << 8; - break; - } else { - LOG(error) -@@ -367,6 +414,8 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, - break; - } - -+ -+ - } // while(PsdReader.GetTotalGbtWordsRead()<uNbMessages) - - if (uNbMessages != PsdReader.GetTotalGbtWordsRead()) -@@ -374,10 +423,10 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, - << " in microslice " << uNbMessages << " by PsdReader " - << PsdReader.GetTotalGbtWordsRead() << "\n"; - -- if (fulCurrentMsIdx != PsdReader.EvHdrAb.ulMicroSlice) -+ if (fulCurrentMsIdx != PsdReader.MsHdr.ulMicroSlice) - LOG(error) << "Wrong MS index!" - << " in microslice " << fulCurrentMsIdx << " by PsdReader " -- << PsdReader.EvHdrAb.ulMicroSlice << "\n"; -+ << PsdReader.MsHdr.ulMicroSlice << "\n"; - - } //if(uSize != 0) - -diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h -index 07f682d8..010bbdc1 100644 ---- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h -+++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.h -@@ -24,6 +24,7 @@ - // C/C++ - #include <map> - #include <vector> -+#include <numeric> - - class CbmMcbm2018PsdPar; - -diff --git a/macro/beamtime/mcbm2020/unpack_tsa_mcbm.C b/macro/beamtime/mcbm2020/unpack_tsa_mcbm.C -index aadd7491..8d6b211a 100644 ---- a/macro/beamtime/mcbm2020/unpack_tsa_mcbm.C -+++ b/macro/beamtime/mcbm2020/unpack_tsa_mcbm.C -@@ -599,7 +599,7 @@ Bool_t unpack_tsa_mcbm(TString inFile = "", - source->SetWriteOutputFlag(kTRUE); // For writing TS metadata - - source->SetFileName(inFile); -- -+/* - source->AddUnpacker(unpacker_sts, 0x10, ECbmModuleId::kSts); // STS xyter - source->AddUnpacker(unpacker_much, 0x50, ECbmModuleId::kMuch); // MUCH xyter - if (isActiveTrd) -@@ -607,7 +607,7 @@ Bool_t unpack_tsa_mcbm(TString inFile = "", - source->AddUnpacker(unpacker_tof, 0x60, ECbmModuleId::kTof); // gDPB TOF - source->AddUnpacker(unpacker_tof, 0x90, ECbmModuleId::kTof); // gDPB T0 - source->AddUnpacker(unpacker_rich, 0x30, ECbmModuleId::kRich); // RICH trb -- source->AddUnpacker(unpacker_psd, 0x80, ECbmModuleId::kPsd); // PSD -+*/ source->AddUnpacker(unpacker_psd, 0x80, ECbmModuleId::kPsd); // PSD - - /// Select a pre-identified spills block through block index + block length (in spills) - /// Also select where we split the spills: beginning, middle or end of the spill break diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx index 88d1302e1c444de8c2035863af6df2516598db15..bb08e14b7c857323acf75c71667dd1020da0cff3 100644 --- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx +++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.cxx @@ -362,9 +362,8 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM } } - switch (fuRawDataVersion) { - case 0: { + case 000: { PsdDataV000::PsdGbtReader PsdReader(pInBuff); if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.SetPrintOutMode(true); @@ -388,6 +387,7 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM UInt_t uSignalCharge = PsdReader.VectHitHdr.at(hit_iter).uSignalCharge; UInt_t uZeroLevel = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel; std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm; + uSignalCharge /= kfAdc_to_mV; // ->now in mV if (uHitChannel >= kuNbChanPsd) //uHitChannel numerated from 0 { @@ -407,18 +407,22 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM fvhHitZeroLevelChan[uHitChannel]->Fill(uZeroLevel); //Hit data - uint16_t uHitAmlpitude = 0; - UInt_t uHitChargeWfm = 0; + int32_t iHitAmlpitude = 0; + int32_t iHitChargeWfm = 0; if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Reset(); if (fbMonitorFitMode) fvhHitFitWfmChan[uHitChannel]->Reset(); - for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++) { - if (uWfm.at(wfm_iter) > uHitAmlpitude) uHitAmlpitude = uWfm.at(wfm_iter); - uHitChargeWfm += uWfm.at(wfm_iter) - uZeroLevel; - if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter)); - } - uHitAmlpitude -= uZeroLevel; - fvhHitAmplChan[uHitChannel]->Fill(uHitAmlpitude); - fvhHitChargeByWfmChan[uHitChannel]->Fill(uHitChargeWfm); + + iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0); + iHitChargeWfm -= uZeroLevel * uWfm.size(); + auto const max_iter = std::max_element(uWfm.begin(), uWfm.end()); + assert(max_iter != uWfm.end()); + if (max_iter == uWfm.end()) break; + uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter); + iHitAmlpitude = *max_iter - uZeroLevel; + iHitAmlpitude /= kfAdc_to_mV; + iHitChargeWfm /= kfAdc_to_mV; + fvhHitAmplChan[uHitChannel]->Fill(iHitAmlpitude); + fvhHitChargeByWfmChan[uHitChannel]->Fill(iHitChargeWfm); if (fbMonitorWfmMode) { fvhHitWfmChan[uHitChannel]->SetTitle( @@ -449,7 +453,6 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM } // for (uint8_t i=0; i<kuNbWfmRanges; ++i) } //if (fbMonitorWfmMode) - if (fbMonitorFitMode) { int gate_beg = 0; int gate_end = uWfm.size() - 1; @@ -464,7 +467,7 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM Pfitter.CalculateFitHarmonics(); Pfitter.CalculateFitAmplitudes(); - Float_t fit_integral = Pfitter.GetIntegral(gate_beg, gate_end); + Float_t fit_integral = Pfitter.GetIntegral(gate_beg, gate_end) / kfAdc_to_mV; Float_t fit_R2 = Pfitter.GetRSquare(gate_beg, gate_end); std::complex<float>* harmonics = Pfitter.GetHarmonics(); @@ -549,17 +552,14 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM } // case 0 - case 1: { - + case 100: { PsdDataV100::PsdGbtReader PsdReader(pInBuff); if (fair::Logger::Logging(fair::Severity::debug)) PsdReader.SetPrintOutMode(true); // every 80bit gbt word is decomposed into two 64bit words if (uNbMessages > 1) { while (PsdReader.GetTotalGbtWordsRead() < uNbMessages) { - int ReadResult = PsdReader.ReadMs(); - if (ReadResult == 0) { fuCountsLastSecond++; fuReadEvtCntInMs++; @@ -573,13 +573,14 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM break; } - uint8_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel; + uint16_t uHitChannel = PsdReader.VectHitHdr.at(hit_iter).uHitChannel; uint8_t uLinkIndex = PsdReader.VectPackHdr.at(hit_iter).uLinkIndex; uint32_t uSignalCharge = PsdReader.VectHitHdr.at(hit_iter).uSignalCharge; uint16_t uZeroLevel = PsdReader.VectHitHdr.at(hit_iter).uZeroLevel; double dHitTime = (double) fulCurrentMsIdx + PsdReader.VectPackHdr.at(hit_iter).uAdcTime * 12.5; //in ns //double dHitTime = PsdReader.MsHdr.ulMicroSlice*1000. + PsdReader.VectPackHdr.at(hit_iter).uAdcTime*12.5; //in ns std::vector<uint16_t> uWfm = PsdReader.VectHitData.at(hit_iter).uWfm; + uSignalCharge /= kfAdc_to_mV; // ->now in mV fhAdcTime->Fill(PsdReader.VectPackHdr.at(hit_iter).uAdcTime); @@ -590,44 +591,31 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM break; } - //Pack header fhHitChargeMap->Fill(uHitChannel, uSignalCharge); fhChanHitMapEvo->Fill(uHitChannel, fdMsTime - fdStartTime); //should be placed map(channel) - if (fbMonitorChanMode) { - fvhHitChargeChan[uHitChannel]->Fill(uSignalCharge); fvhHitZeroLevelChan[uHitChannel]->Fill(uZeroLevel); - //Hit data - int32_t iHitAmlpitude = 0; int32_t iHitChargeWfm = 0; if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Reset(); if (fbMonitorFitMode) fvhHitFitWfmChan[uHitChannel]->Reset(); - - if (!uWfm.empty()) { - iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0); - iHitChargeWfm -= uZeroLevel * uWfm.size(); - - auto const max_iter = std::max_element(uWfm.begin(), uWfm.end()); - assert(max_iter != uWfm.end()); - if (max_iter == uWfm.end()) break; - - uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter); - iHitAmlpitude = *max_iter - uZeroLevel; - - for (UInt_t wfm_iter = 0; wfm_iter < uWfm.size(); wfm_iter++) - if (fbMonitorWfmMode) fvhHitWfmChan[uHitChannel]->Fill(wfm_iter, uWfm.at(wfm_iter)); - } - + iHitChargeWfm = std::accumulate(uWfm.begin(), uWfm.end(), 0); + iHitChargeWfm -= uZeroLevel * uWfm.size(); + auto const max_iter = std::max_element(uWfm.begin(), uWfm.end()); + assert(max_iter != uWfm.end()); + if (max_iter == uWfm.end()) break; + uint8_t hit_time_max = std::distance(uWfm.begin(), max_iter); + iHitAmlpitude = *max_iter - uZeroLevel; + iHitAmlpitude /= kfAdc_to_mV; + iHitChargeWfm /= kfAdc_to_mV; fvhHitAmplChan[uHitChannel]->Fill(iHitAmlpitude); fvhHitChargeByWfmChan[uHitChannel]->Fill(iHitChargeWfm); - if (fbMonitorWfmMode) { fvhHitWfmChan[uHitChannel]->SetTitle( Form("Waveform channel %03u charge %0u zero level %0u; Time [adc " @@ -671,7 +659,7 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM Pfitter.CalculateFitHarmonics(); Pfitter.CalculateFitAmplitudes(); - Float_t fit_integral = Pfitter.GetIntegral(gate_beg, gate_end); + Float_t fit_integral = Pfitter.GetIntegral(gate_beg, gate_end) / kfAdc_to_mV; Float_t fit_R2 = Pfitter.GetRSquare(gate_beg, gate_end); std::complex<float>* harmonics = Pfitter.GetHarmonics(); @@ -732,11 +720,9 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM } } - fuMsgsCntInMs += uNbMessages; fuReadMsgsCntInMs += PsdReader.GetTotalGbtWordsRead(); fuLostMsgsCntInMs += uNbMessages - PsdReader.GetTotalGbtWordsRead(); - } //if (uNbMessages > 1) if (fdPrevMsTime < 0.) fdPrevMsTime = fdMsTime; @@ -751,8 +737,7 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t uM break; } // case 1 - - } // switch + } // switch return kTRUE; } @@ -769,9 +754,8 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::CreateHistograms() std::vector<double> dBinsLogVector = GenerateLogBinArray(2, 3, 1, iNbBinsLog); double* dBinsLog = dBinsLogVector.data(); - fhHitChargeMap = - new TH2I("hHitChargeMap", "Map of hits charges in PSD detector; Chan; Charge [adc counts]", kuNbChanPsd, 0., - kuNbChanPsd, fviHistoChargeArgs.at(0), fviHistoChargeArgs.at(1), fviHistoChargeArgs.at(2)); + fhHitChargeMap = new TH2I("hHitChargeMap", "Map of hits charges in PSD detector; Chan; Charge [mV]", kuNbChanPsd, 0., + kuNbChanPsd, fviHistoChargeArgs.at(0), fviHistoChargeArgs.at(1), fviHistoChargeArgs.at(2)); fhHitMapEvo = new TH2I("hHitMapEvo", "Map of hits in PSD detector electronics vs time in " "run; Chan; Time in run [s]; Hits Count []", @@ -825,7 +809,7 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::CreateHistograms() for (UInt_t uChan = 0; uChan < kuNbChanPsd; ++uChan) { fvhHitChargeChan[uChan] = new TH1I(Form("hHitChargeChan%03u", uChan), - Form("Hits charge distribution for channel %03u; Charge [adc counts]", uChan), + Form("Hits charge distribution for channel %03u; Charge [mV]", uChan), fviHistoChargeArgs.at(0), fviHistoChargeArgs.at(1), fviHistoChargeArgs.at(2)); fvhHitZeroLevelChan[uChan] = @@ -833,15 +817,14 @@ Bool_t CbmMcbm2018MonitorAlgoPsd::CreateHistograms() Form("Hits zero level distribution for channel %03u; ZeroLevel [adc counts]", uChan), fviHistoZLArgs.at(0), fviHistoZLArgs.at(1), fviHistoZLArgs.at(2)); - fvhHitAmplChan[uChan] = - new TH1I(Form("hHitAmplChan%03u", uChan), - Form("Hits amplitude distribution for channel %03u; Amplitude [adc counts]", uChan), - fviHistoAmplArgs.at(0), fviHistoAmplArgs.at(1), fviHistoAmplArgs.at(2)); + fvhHitAmplChan[uChan] = new TH1I(Form("hHitAmplChan%03u", uChan), + Form("Hits amplitude distribution for channel %03u; Amplitude [mV]", uChan), + fviHistoAmplArgs.at(0), fviHistoAmplArgs.at(1), fviHistoAmplArgs.at(2)); fvhHitChargeByWfmChan[uChan] = new TH1I(Form("hHitChargeByWfmChan%03u", uChan), Form("Hits charge by waveform distribution for channel %03u; " - "Charge [adc counts]", + "Charge [mV]", uChan), fviHistoChargeArgs.at(0), fviHistoChargeArgs.at(1), fviHistoChargeArgs.at(2)); diff --git a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h index b38c949dff2f06268c4fa28bd8091bd01e6799a6..995d5c152baf39c09a821736e83e694bd3e2d6b2 100644 --- a/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h +++ b/fles/mcbm2018/monitor/CbmMcbm2018MonitorAlgoPsd.h @@ -103,7 +103,8 @@ private: /// Constants static const Int_t kiMaxNbFlibLinks = 32; static const UInt_t kuBytesPerMessage = 8; - static const UInt_t kuNbChanPsd = 10; + static const UInt_t kuNbChanPsd = 12; + const float kfAdc_to_mV = 1; static constexpr UInt_t GetNbChanPsd() { return kuNbChanPsd; } /// Running indices diff --git a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx index 1b828c386f6e2cfc6fa12ba9e3c3c57d321c81fe..abfc07f789c4cb68b626e751368790c06302fa57 100644 --- a/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx +++ b/fles/mcbm2018/unpacker/CbmMcbm2018UnpackerAlgoPsd.cxx @@ -317,7 +317,7 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u if (uSize > 8) { //more than one 64 bit word switch (fuRawDataVersion) { - case 0: { + case 000: { PsdDataV000::PsdGbtReader PsdReader(pInBuff); //PsdReader.SetPrintOutMode(true); @@ -404,10 +404,11 @@ Bool_t CbmMcbm2018UnpackerAlgoPsd::ProcessMs(const fles::Timeslice& ts, size_t u LOG(error) << "Wrong MS index!" << " in microslice " << fulCurrentMsIdx << " by PsdReader " << PsdReader.EvHdrAb.ulMicroSlice << "\n"; - break; } - case 1: { + + case 100: { + PsdDataV100::PsdGbtReader PsdReader(pInBuff); //PsdReader.SetPrintOutMode(true); diff --git a/macro/beamtime/mcbm2018/mPsdPar.par b/macro/beamtime/mcbm2018/mPsdPar.par index 2ec6e01d92cf01031aa1ed96adf16f9b69b8038a..28db9c32994cadb98afa4bd17f01d9d27c2180e6 100644 --- a/macro/beamtime/mcbm2018/mPsdPar.par +++ b/macro/beamtime/mcbm2018/mPsdPar.par @@ -1,5 +1,6 @@ [CbmMcbm2018PsdPar] //---------------------------------------------------------------------------- +DataVersion: Int_t 0 NrOfGdpbs: Int_t 1 GdpbIdArray: Int_t \ 0x193d @@ -9,6 +10,9 @@ NrOfGbtx: Int_t 1 NrOfModules: Int_t 1 ModuleId: Int_t \ 1 +NrOfSections: Int_t 11 +MipCalibration: Double_t \ #adc per MeV + 1.00 1.00 1.00 1.0 1.00 1.00 1.00 1.00 1.00 1.00 1.00 NbMsTot: Int_t 100 NbMsOverlap: Int_t 1 SizeMsInNs: Double_t 102400.0 diff --git a/macro/beamtime/mcbm2019/mPsdPar.par b/macro/beamtime/mcbm2019/mPsdPar.par index 2ec6e01d92cf01031aa1ed96adf16f9b69b8038a..28db9c32994cadb98afa4bd17f01d9d27c2180e6 100644 --- a/macro/beamtime/mcbm2019/mPsdPar.par +++ b/macro/beamtime/mcbm2019/mPsdPar.par @@ -1,5 +1,6 @@ [CbmMcbm2018PsdPar] //---------------------------------------------------------------------------- +DataVersion: Int_t 0 NrOfGdpbs: Int_t 1 GdpbIdArray: Int_t \ 0x193d @@ -9,6 +10,9 @@ NrOfGbtx: Int_t 1 NrOfModules: Int_t 1 ModuleId: Int_t \ 1 +NrOfSections: Int_t 11 +MipCalibration: Double_t \ #adc per MeV + 1.00 1.00 1.00 1.0 1.00 1.00 1.00 1.00 1.00 1.00 1.00 NbMsTot: Int_t 100 NbMsOverlap: Int_t 1 SizeMsInNs: Double_t 102400.0 diff --git a/macro/beamtime/mcbm2020/mPsdPar.par b/macro/beamtime/mcbm2020/mPsdPar.par index d2433a3a82cd94d010e3c40108cdd23c0bd5aa36..bb0bef939ca23fff72d386629041a92eaf3126ad 100644 --- a/macro/beamtime/mcbm2020/mPsdPar.par +++ b/macro/beamtime/mcbm2020/mPsdPar.par @@ -1,18 +1,18 @@ [CbmMcbm2018PsdPar] //---------------------------------------------------------------------------- -DataVersion: Int_t 1 +DataVersion: Int_t 0 NrOfGdpbs: Int_t 1 GdpbIdArray: Int_t \ -0x0 +0x193d NrOfFeesPerGdpb: Int_t 1 NrOfChannelsPerFee: Int_t 32 NrOfGbtx: Int_t 1 NrOfModules: Int_t 1 ModuleId: Int_t \ 1 -NrOfSections: Int_t 11 +NrOfSections: Int_t 12 MipCalibration: Double_t \ #adc per MeV - 36.83 37.12 37.52 38.35 37.78 37.19 34.91 33.96 37.95 35.77 1.00 + 1.00 1.00 1.00 1.0 1.00 1.00 1.00 1.00 1.00 1.00 1.00 1.00 NbMsTot: Int_t 100 NbMsOverlap: Int_t 1 SizeMsInNs: Double_t 102400.0 diff --git a/macro/beamtime/mcbm2021/mPsdPar.par b/macro/beamtime/mcbm2021/mPsdPar.par index 2ec6e01d92cf01031aa1ed96adf16f9b69b8038a..88afeaf8189d577e3db598e7e7d841c428cccd42 100644 --- a/macro/beamtime/mcbm2021/mPsdPar.par +++ b/macro/beamtime/mcbm2021/mPsdPar.par @@ -1,14 +1,18 @@ [CbmMcbm2018PsdPar] //---------------------------------------------------------------------------- +DataVersion: Int_t 100 NrOfGdpbs: Int_t 1 GdpbIdArray: Int_t \ -0x193d +0x0 NrOfFeesPerGdpb: Int_t 1 NrOfChannelsPerFee: Int_t 32 NrOfGbtx: Int_t 1 NrOfModules: Int_t 1 ModuleId: Int_t \ 1 +NrOfSections: Int_t 11 +MipCalibration: Double_t \ #adc per MeV + 36.83 37.12 37.52 38.35 37.78 37.19 34.91 33.96 37.95 35.77 1.00 NbMsTot: Int_t 100 NbMsOverlap: Int_t 1 SizeMsInNs: Double_t 102400.0