diff --git a/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx b/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx index 1afa5d3b5a8062003ba248060e0c8330578168cd..92afaa77b8dd3a3f55803a9485728b71f77ae0b6 100644 --- a/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx +++ b/TileCalorimeter/TileConditions/src/TileCondToolOfc.cxx @@ -7,6 +7,8 @@ // Tile includes #include "TileConditions/TileCondToolOfc.h" +#include "TileConditions/TileCablingService.h" +#include "TileConditions/TileCablingSvc.h" // @@ -24,6 +26,9 @@ TileCondToolOfc::TileCondToolOfc(const std::string& type, const std::string& nam , m_tileToolAutoCr("TileCondToolAutoCr") // , m_tileToolNoiseSample("TileCondToolNoiseSample") , m_tileInfo(0) + , m_maxChannels(0) + , m_maxGains(0) + , m_drawerCacheSize(0) { declareInterface<ITileCondToolOfc>(this); declareProperty("nSamples", m_nSamples = 7, "number of samples used in the run"); @@ -80,6 +85,20 @@ StatusCode TileCondToolOfc::initialize() { //=== Prepare for calculation of OFCs m_weights.n_samples = m_nSamples; + //=== Initialize max values + ServiceHandle<TileCablingSvc> cablingSvc("TileCablingSvc", name()); + CHECK( cablingSvc.retrieve()); + + const TileCablingService* cabling = cablingSvc->cablingService(); + if (!cabling) { + ATH_MSG_ERROR( "Unable to retrieve TileCablingService" ); + return StatusCode::FAILURE; + } + + m_maxChannels = cabling->getMaxChannels(); + m_maxGains = cabling->getMaxGains(); + m_drawerCacheSize = m_maxChannels * m_maxGains; + // Prepare cache table for all channels (array of pointers to "MAP"s) if (m_cache) { diff --git a/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h b/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h index 1428499061d4bd8c4ed1ad4729e3f71bdaa64b4b..4683f62d7ce02db5a1bc96163c30d369eb122c43 100755 --- a/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h +++ b/TileCalorimeter/TileEvent/TileEvent/TileDigitsCollection.h @@ -82,7 +82,8 @@ public: * Get BCID * @return BCID */ - inline uint32_t getFragBCID() const { return m_FragBCID; } + inline uint32_t getFragBCID() const { return (m_FragBCID & 0xFFFF); } + inline uint32_t getFragStatus() const { return (m_FragBCID >> 16); } /** * Set chip header words for this collection diff --git a/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h b/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h index c24504d5e2a6b3daf23c9ad524ad8358a0f5d91e..2c0f3ad927c1a410eecb2196668285f46bdfe0db 100644 --- a/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h +++ b/TileCalorimeter/TileMonitoring/TileMonitoring/TileDQFragMonTool.h @@ -114,7 +114,10 @@ class TileDQFragMonTool: public TileFatherMonTool { TProfile* m_hist_error_lb[4][64]; - static const int NERROR = 15; + static const int NERROR = 17; + static const int MASKEDERROR = NERROR - 3; + static const int DCSERROR = NERROR - 2; + static const int HVERROR = NERROR - 1; static const int NCORRUPTED = 13; static const int NDMU = 16; diff --git a/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h b/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h index 46603880d0382a4899d7c3a3e2e36f06658c7cdf..7af685d0905ee3422c033cf3276d1e078ef4ab33 100644 --- a/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h +++ b/TileCalorimeter/TileMonitoring/TileMonitoring/TilePaterMonTool.h @@ -60,7 +60,8 @@ class TilePaterMonTool: public ManagedMonitorToolBase ~TilePaterMonTool(); StatusCode initialize(); - + + enum TileFragStatus {ALL_OK=0, CRC_ERR=1, ALL_FF=0x10, ALL_00=0x20, NO_FRAG=0x40, NO_ROB=0x80}; protected: /// Implicit version of book1D diff --git a/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py b/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py index 57828948e03831c2540cdc318ba6d2dfdbe59ff1..b3826816275f0ebd6f6596ea0883020aa7bf3f51 100644 --- a/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py +++ b/TileCalorimeter/TileMonitoring/share/TileRec_FlagOptions.py @@ -108,10 +108,10 @@ if not 'TileUseCOOL' in dir(): if TileUseCOOL and not 'tileCOOLtag' in dir(): if doOnline: - tileCOOLtag = "CONDBR2-HLTP-2016-01" + tileCOOLtag = "CONDBR2-HLTP-2017-03" else: if RunNumber > 232498: - tileCOOLtag = "CONDBR2-BLKPA-2016-11" + tileCOOLtag = "CONDBR2-BLKPA-2017-10" else: tileCOOLtag = "COMCOND-BLKPA-RUN1-06" diff --git a/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py b/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py index e9f34459c2bf0d21c61985e6e227daa260d1d27c..3b10ce2595ec3ddd1f7aaad8963d62813e228258 100644 --- a/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py +++ b/TileCalorimeter/TileMonitoring/share/TileRec_topOptions.py @@ -8,7 +8,7 @@ from os import system, popen -def FindFile(path, runinput): +def FindFile(path, runinput, filter): run = str(runinput) @@ -19,15 +19,15 @@ def FindFile(path, runinput): fullname = [] if path.startswith('/castor') : - for f in popen('ls %(path)s | grep %(run)s' % {'path': path, 'run':run }): + for f in popen('ls %(path)s | grep %(run)s | grep %(filt)s' % {'path': path, 'run':run, 'filt':filter }): files.append(f) elif path.startswith('/eos') : - for f in popen('eos ls %(path)s | grep %(run)s' % {'path': path, 'run':run }): + for f in popen('eos ls %(path)s | grep %(run)s | grep %(filt)s' % {'path': path, 'run':run, 'filt':filter }): files.append(f) else: - for f in popen('nsls %(path)s | grep %(run)s' % {'path': path, 'run':run }): + for f in popen('nsls %(path)s | grep %(run)s | grep %(filt)s' % {'path': path, 'run':run, 'filt':filter }): files.append(f) @@ -114,10 +114,12 @@ if not athenaCommonFlags.isOnline(): else: RunFromLocal = False - if not 'FileNameVec' in dir(): - if not 'FileName' in dir(): + if not 'FileNameVec' in dir() or len(FileNameVec) == 0 or len(FileNameVec[0]) == 0: + if not 'FileName' in dir() or len(FileName)==0: - tmp = FindFile(InputDirectory, RunNumber) + if not 'FileFilter' in dir(): + FileFilter = "data" + tmp = FindFile(InputDirectory, RunNumber, FileFilter) FileNameVec = tmp[0] FormattedRunNumber = tmp[1] diff --git a/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx b/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx index 655946b969064a74cac9dd39ba857a3ed106b634..577cd556705a3da965ef26ee9dad1e15c2bb65b7 100644 --- a/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx +++ b/TileCalorimeter/TileMonitoring/src/TileDQFragMonTool.cxx @@ -90,9 +90,12 @@ TileDQFragMonTool::TileDQFragMonTool(const std::string & type, const std::string m_ErrorsLabels.push_back("DOUBLE_STB"); // Error: 9 m_ErrorsLabels.push_back("SINGLE_STB"); // Error: 10 m_ErrorsLabels.push_back("GLOBAL_CRC"); // Error: 11 - m_ErrorsLabels.push_back("MASKED"); // Error: 12 - m_ErrorsLabels.push_back("ALL_M_BAD_DCS"); // Error: 13 - m_ErrorsLabels.push_back("ANY_CH_BAD_HV"); // Error: 14 + m_ErrorsLabels.push_back("DUMMY_FRAG"); // Error: 12 + m_ErrorsLabels.push_back("NO_RECO_FFAG"); // Error: 13 + m_ErrorsLabels.push_back("MASKED"); // Error: 14 + m_ErrorsLabels.push_back("ALL_M_BAD_DCS"); // Error: 15 + m_ErrorsLabels.push_back("ANY_CH_BAD_HV"); // Error: 16 + assert( m_ErrorsLabels.size() != NERROR ); // corrupted data m_ErrorsLabels.push_back("0 -> 1023"); // Error: NERROR - 1 + 1 m_ErrorsLabels.push_back("Zeros"); // Error: NERROR - 1 + 2 @@ -107,6 +110,7 @@ TileDQFragMonTool::TileDQFragMonTool(const std::string & type, const std::string m_ErrorsLabels.push_back("Single Dn LG_s6"); // Error: NERROR - 1 + 11 m_ErrorsLabels.push_back("Up LG_s0_s6 or Gap"); // Error: NERROR - 1 + 12 m_ErrorsLabels.push_back("Dn LG_s0_s6 or Gap"); // Error: NERROR - 1 + 13 + assert( m_ErrorsLabels.size() != (NERROR+NCORRUPTED) ); m_PartitionsLabels.push_back("LBA"); m_PartitionsLabels.push_back("LBC"); @@ -620,7 +624,10 @@ void TileDQFragMonTool::fillBadDrawer() { int channel = m_tileHWID->channel(adcId); int gain = m_tileHWID->adc(adcId); - if ((error = TileRawChannelBuilder::CorruptedData(ROS, drawer, channel, gain, pDigits->samples(), dmin, dmax)) > 0) { + error = TileRawChannelBuilder::CorruptedData(ROS, drawer, channel, gain, pDigits->samples(), dmin, dmax); + + if ((error > 0) && !(isDisconnected(ROS, drawer, channel) + || m_tileBadChanTool->getAdcStatus(adcId).isBad())) { ++nBadCh; if (msgLvl(MSG::DEBUG)) { msg(MSG::DEBUG) << "LB " << getLumiBlock() @@ -689,7 +696,7 @@ void TileDQFragMonTool::fillErrHist(int ros, int drawer) { /*---------------------------------------------------------*/ - bool hasErr = false; + //bool hasErr = false; int n_error_nonmask_DMU = 0; unsigned int cur_lb = getLumiBlock(); @@ -707,9 +714,17 @@ void TileDQFragMonTool::fillErrHist(int ros, int drawer) { if (m_doOnline) m_hist_error_lb[ros][drawer]->Fill(0., -1.); else m_hist_error_lb[ros][drawer]->Fill(cur_lb, -1.); - for (int idmu = 0; idmu < NDMU; ++idmu) fillOneErrHist(ros, drawer, idmu, 13); + for (int idmu = 0; idmu < NDMU; ++idmu) fillOneErrHist(ros, drawer, idmu, DCSERROR); } else { + int status = m_dqStatus->checkGlobalErr(ros + 1, drawer, 0); + int err = 0; + if (status & (TileFragStatus::ALL_FF | TileFragStatus::ALL_00)) { + err = 12; + } else if (status & (TileFragStatus::NO_FRAG | TileFragStatus::NO_ROB)) { + err = 13; + } + for (int idmu = 0; idmu < NDMU; idmu++) { // loop over dmus int ichn = 3 * idmu; @@ -725,15 +740,18 @@ void TileDQFragMonTool::fillErrHist(int ros, int drawer) { && !m_tileBadChanTool->getChannelStatus(drawerIdx, ichn + 2).contains(TileBchPrbs::NoHV) && !m_tileBadChanTool->getChannelStatus(drawerIdx, ichn + 2).contains(TileBchPrbs::WrongHV)))) { - fillOneErrHist(ros, drawer, idmu, 14); + fillOneErrHist(ros, drawer, idmu, HVERROR); } if (m_dqStatus->isChanDQgood(ros + 1, drawer, ichn)) { fillOneErrHist(ros, drawer, idmu, 0); } else { - hasErr |= CheckhasErr(ros, drawer, idmu); + //hasErr |= CheckhasErr(ros, drawer, idmu); if (CheckhasErr(ros, drawer, idmu)) n_error_nonmask_DMU++; - if (m_dqStatus->checkHeaderFormatErr(ros + 1, drawer, idmu, 0) != 0) { // in case of format errors, we only fill this one + + if (err) { + fillOneErrHist(ros, drawer, idmu, err); + } else if (m_dqStatus->checkHeaderFormatErr(ros + 1, drawer, idmu, 0) != 0) { // in case of format errors, we only fill this one fillOneErrHist(ros, drawer, idmu, 1); } else { if (m_dqStatus->checkHeaderParityErr(ros + 1, drawer, idmu, 0) != 0) { @@ -816,7 +834,7 @@ void TileDQFragMonTool::updateHistograms() { for (int ros = 0; ros < 4; ros++) { //loop over ros... for (int drawer = 0; drawer < 64; ++drawer) { for (int dmu = 0; dmu < NDMU; dmu++) { - Int_t bin = m_hist_error[ros][drawer]->FindBin(dmu, NERROR - 3); + Int_t bin = m_hist_error[ros][drawer]->FindBin(dmu, MASKEDERROR); if (m_hist_error[ros][drawer]->GetBinContent(bin) > 0) m_hist_error[ros][drawer]->SetBinContent(bin, m_UpdateTotal); m_hist_error[ros][drawer]->SetEntries(m_UpdateTotal); @@ -964,19 +982,19 @@ void TileDQFragMonTool::fillMasking() sp_EB = false; if (status0.isBad() && status1.isBad() && status2.isBad()) { - m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } else if ((ros > 1) && ((ch == 18 && !sp_EB) || ch == 33)) { //disconnected channels for EBs - if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } else if ((ros < 2) && (ch == 30)) { //disconnected channels for LBs - if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + if (status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } else if ((ros < 2) && (ch == 42)) { //disconnected channels for LBs - if (status0.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + if (status0.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } else if ((ros > 1) && (ch == 24 || ch == 27 || ch == 42 || ch == 45)) { // void DMUs for EBs - m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } else if (sp_EB && (ch == 0)) { // void DMU 0 for EBA15, EBC18 - m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } else if (sp_EB && (ch == 3)) { // disconnected PMT of DMU 1 for EBA15, EBC18 - if (status1.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, 12, 1); + if (status1.isBad() && status2.isBad()) m_hist_error[ros][drawer]->Fill(ch / 3, MASKEDERROR, 1); } } //chan loop } // drawer loop @@ -989,10 +1007,10 @@ bool TileDQFragMonTool::CheckhasErr(int ros, int drawer, int dmu) { /*---------------------------------------------------------*/ if (ros < 2) { - if (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, 13) > 0) return false; + if (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, MASKEDERROR + 1) > 0) return false; } else { if ((dmu == 8) || (dmu == 9) || (dmu == 14) || (dmu == 15) - || (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, 13) > 0)) + || (m_hist_error[ros][drawer]->GetBinContent(dmu + 1, MASKEDERROR + 1) > 0)) return false; else if (((drawer == 14) && (ros == 2)) || ((drawer == 17) && (ros == 3))) { if (dmu == 0) return false; diff --git a/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx b/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx index f6082c71410e4229b2caac1f4cf635e21e9daeac..cc6b1a94dc1d05ea837488d9fec00efde9635e84 100644 --- a/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx +++ b/TileCalorimeter/TileMonitoring/src/TileDigitsMonTool.cxx @@ -189,7 +189,7 @@ void TileDigitsMonTool::bookHists(int ros, int drawer) sStr << moduleName << " DMU Header " << gain[3 + gn] << " errors"; histTitle = sStr.str(); - m_hist2[ros][drawer][adc].push_back(book2F(subDir, histName, histTitle, 16, 0., 16., 6, -0.5, 5.5)); + m_hist2[ros][drawer][adc].push_back(book2F(subDir, histName, histTitle, 16, 0., 16., 8, -0.5, 7.5)); } for (int ch = 0; ch < 48; ++ch) { @@ -353,6 +353,23 @@ StatusCode TileDigitsMonTool::fillHists() if (!m_bookAll) bookHists(ros, drawer); } + uint32_t status = digitsCollection->getFragStatus(); + if (status != TileFragStatus::ALL_OK) { + float bin = 99.; + if (status & (TileFragStatus::ALL_FF || TileFragStatus::ALL_00)) { + bin = 6.; + } else if (status & (TileFragStatus::NO_FRAG || TileFragStatus::NO_ROB)) { + bin = 7.; + } + for (int dmu = 0; dmu < 16; dmu++) { + m_corrup[ros][drawer][0][dmu] = true; + m_corrup[ros][drawer][1][dmu] = true; + m_hist2[ros][drawer][0][0]->Fill(dmu + 0.5, bin, 1.); + m_hist2[ros][drawer][1][0]->Fill(dmu + 0.5, bin, 1.); + } + continue; + } + std::vector<uint32_t> headerVec = digitsCollection->getFragChipHeaderWords(); int headsize = headerVec.size(); @@ -1121,6 +1138,8 @@ void TileDigitsMonTool::drawHists(int ros, int drawer, std::string moduleName) m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(4, "Memory"); m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(5, "SingleStr"); m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(6, "DbleStr"); + m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(7, "DummyFrag"); + m_hist2[ros][drawer][gain][0]->GetYaxis()->SetBinLabel(8, "NoDataFrag"); m_hist2[ros][drawer][gain][0]->GetYaxis()->SetTickLength(0.01); m_hist2[ros][drawer][gain][0]->GetYaxis()->SetLabelOffset(0.001); if (do_plots) { @@ -1661,12 +1680,12 @@ bool TileDigitsMonTool::DMUheaderCheck(std::vector<uint32_t>* headerVec, int ros } if (((*headerVec)[dmu] >> 24) & 0x1) { //Single Strobe Error - m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 5., 1.); + m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 4., 1.); err = true; } if (((*headerVec)[dmu] >> 23) & 0x1) { //Double Strobe Error - m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 0., 1.); + m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 5., 1.); err = true; } if (!err) m_hist2[ros][drawer][gain][0]->Fill(dmu + 0.5, 0., 1.); diff --git a/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h b/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h index 566ea05d8fe6562078e62acb12b1bcac4b7f41fc..98a269c161bc3328f48ff8ab43ace99281243c60 100644 --- a/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h +++ b/TileCalorimeter/TileRecUtils/TileRecUtils/TileBeamInfoProvider.h @@ -101,6 +101,10 @@ class TileDQstatus { return (m_EmptyEventArray[partition][drawer][dmu][0]+((m_EmptyEventArray[partition][drawer][dmu][1]) << 1)); } + /** @brief returns 1 if adc channel has any global error */ + inline int checkGlobalErr(int partition, int drawer, int gain) const { + return m_GlobalCRCErrArray[partition][drawer][gain]; + } /** @brief returns 1 if adc channel has global CRC error */ inline int checkGlobalCRCErr(int partition, int drawer, int gain) const { return m_GlobalCRCErrArray[partition][drawer][gain] & 1; diff --git a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h index 74688c4198fa9a7a1e1d88588a3eb0a10829dd11..9bda9aaf76cc05e16a8cae8e92d4e863bae0ed33 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h +++ b/TileCalorimeter/TileSvc/TileByteStream/TileByteStream/TileROD_Decoder.h @@ -142,6 +142,9 @@ class TileROD_Decoder: public AthAlgTool { void printErrorCounter(bool printIfNoError); int getErrorCounter(); + void printWarningCounter(bool printIfNoWarning); + int getWarningCounter(); + const TileHid2RESrcID * getHid2reHLT() { if (!m_hid2reHLT) initHid2reHLT(); return m_hid2reHLT; @@ -178,6 +181,8 @@ class TileROD_Decoder: public AthAlgTool { void setUseFrag5Raw (bool f) { m_useFrag5Raw = f; } void setUseFrag5Reco (bool f) { m_useFrag5Reco = f; } + enum TileFragStatus {ALL_OK=0, CRC_ERR=1, ALL_FF=0x10, ALL_00=0x20, NO_FRAG=0x40, NO_ROB=0x80}; + private: friend class TileHid2RESrcID; @@ -495,12 +500,14 @@ class TileROD_Decoder: public AthAlgTool { // Error reporting (needs to be mutable) mutable uint32_t m_error; + int m_maxWarningPrint; int m_maxErrorPrint; // Pointer to TileL2Builder TileL2Builder* m_L2Builder; std::string m_TileDefaultL2Builder; + int m_WarningCounter; int m_ErrorCounter; bool m_correctAmplitude; @@ -536,19 +543,43 @@ class TileROD_Decoder: public AthAlgTool { max_allowed_size = 0; if (size < 3 && size > 0) { if (rob->rod_source_id() > 0x50ffff) m_error |= 0x10000; // indicate error in frag size, but ignore error in laser ROD - if (m_ErrorCounter < (m_maxErrorPrint--)) { - ATH_MSG_ERROR("ROB " << std::hex << rob->source_id() - << " ROD " << std::hex << rob->rod_source_id() << std::dec + if (m_WarningCounter < (m_maxWarningPrint--)) { + ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id() + << " ROD " << rob->rod_source_id() << MSG::dec << " has unexpected data size: " << size << " - assuming zero size " ); } return 0; } else if (size > max_allowed_size) { if (rob->rod_source_id() > 0x50ffff) m_error |= 0x10000; // indicate error in frag size, but ignore error in laser ROD - if ((m_ErrorCounter++) < m_maxErrorPrint) { - ATH_MSG_ERROR("ROB " << std::hex << rob->source_id() - << " ROD " << std::hex << rob->rod_source_id() << std::dec - << " has unexpected data size: " << size - << " - assuming size = " << max_allowed_size << " words " ); + + if (size - rob->rod_trailer_size_word() < max_allowed_size) { + if ((m_WarningCounter++) < m_maxWarningPrint) { + ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id() + << " ROD " << rob->rod_source_id() << MSG::dec + << " data size " << size << " is longer than allowed size " << max_allowed_size + << " - assuming that ROD trailer is shorter: " + << rob->rod_trailer_size_word()-(size-max_allowed_size) + << " words instead of " << rob->rod_trailer_size_word()); + } + max_allowed_size = size; + } else if (size - rob->rod_trailer_size_word() == max_allowed_size) { + if ((m_WarningCounter++) < m_maxWarningPrint) { + ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id() + << " ROD " << rob->rod_source_id() << MSG::dec + << " data size " << size << " is longer than allowed size " << max_allowed_size + << " - assuming that ROD trailer (" + << rob->rod_trailer_size_word() + << " words) is absent"); + } + max_allowed_size = size; + } else { + max_allowed_size += rob->rod_trailer_size_word(); + if ((m_WarningCounter++) < m_maxWarningPrint) { + ATH_MSG_WARNING("ROB " << MSG::hex << rob->source_id() + << " ROD " << rob->rod_source_id() << MSG::dec + << " has unexpected data size: " << size + << " - assuming data size = " << max_allowed_size << " words and no ROD trailer at all" ); + } } return max_allowed_size; } else { @@ -590,10 +621,15 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe v.setDetEvType(rob->rod_detev_type()); v.setRODBCID(rob->rod_bc_id()); + uint32_t status = TileFragStatus::ALL_OK; + for (size_t j=0; j<m_digitsMetaData[6]->size(); ++j) { + status |= (*(m_digitsMetaData[6]))[j]; + } + if (v.size() > 0) { // Set meta data v.setFragSize((*(m_digitsMetaData[0]))[0]); - v.setFragBCID((*(m_digitsMetaData[0]))[2]); + v.setFragBCID((*(m_digitsMetaData[0]))[2] | (status<<16)); v.setFragExtraWords(*(m_digitsMetaData[1])); @@ -606,8 +642,14 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe } if (m_verbose) v.printExtra(); } else if ( m_digitsMetaData[0]->size() == 0 ) { - v.setFragBCID(0xDEAD); + // no useful digi fragment or no data inside fragment + status |= TileFragStatus::NO_FRAG; + v.setFragBCID(0xDEAD | (status<<16)); + v.setFragSize(0); } + + if (status!=TileFragStatus::ALL_OK) + ATH_MSG_DEBUG( "Status for drawer 0x" << MSG::hex << v.identify() << " in Digi frag is 0x" << status << MSG::dec); } inline @@ -637,7 +679,17 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe //m_RCBuilder->build(pDigits.begin(),pDigits.end(),(&v)); delete_vec(pDigits); // Digits deleted + + } else { + ATH_MSG_DEBUG( "data for drawer 0x" << MSG::hex << v.identify() << MSG::dec << " not found in BS" ); + } + m_rawchannelMetaData[6]->push_back(TileFragStatus::NO_FRAG); + HWIdentifier drawerID = m_tileHWID->drawer_id(v.identify()); + for (unsigned int ch = 0; ch < m_maxChannels; ++ch) { + HWIdentifier adcID = m_tileHWID->adc_id(drawerID, ch, 0); + v.push_back(new TileRawChannel(adcID, 0.0, -100.0, 31)); } + } v.setLvl1Id(rob->rod_lvl1_id()); @@ -658,7 +710,14 @@ void TileROD_Decoder::make_copy(const ROBData * rob, pDigiVec & pDigits, pRwChVe } } - v.setFragGlobalCRC((*(m_rawchannelMetaData[0]))[0]); + uint32_t status = ((*(m_rawchannelMetaData[0]))[0] & 0x1) ? TileFragStatus::CRC_ERR : TileFragStatus::ALL_OK ; + for (size_t j=0; j<m_rawchannelMetaData[6]->size(); ++j) { + status |= (*(m_rawchannelMetaData[6]))[j]; + } + if (status>TileFragStatus::CRC_ERR) + ATH_MSG_DEBUG( "Status for drawer 0x" << MSG::hex << v.identify() << " is 0x" << status << MSG::dec); + + v.setFragGlobalCRC(status); v.setFragDSPBCID((*(m_rawchannelMetaData[0]))[1]); v.setFragBCID((*(m_rawchannelMetaData[1]))[0]); v.setFragMemoryPar((*(m_rawchannelMetaData[1]))[1]); @@ -726,8 +785,8 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) { // // if (msgLvl(MSG::VERBOSE)) { // msg(MSG::VERBOSE) << "ROD header info: " << endmsg - // msg(MSG::VERBOSE) << " Format Vers. " << std::hex << "0x" << rob->rod_version() << std::dec << endmsg; - // msg(MSG::VERBOSE) << " Source ID " << std::hex << "0x" << rob->rod_source_id() << std::dec << endmsg; + // msg(MSG::VERBOSE) << " Format Vers. " << MSG::hex << "0x" << rob->rod_version() << MSG::dec << endmsg; + // msg(MSG::VERBOSE) << " Source ID " << MSG::hex << "0x" << rob->rod_source_id() << MSG::dec << endmsg; // msg(MSG::VERBOSE) << " Source ID str " << eformat::helper::SourceIdentifier(rob->source_id()).human().c_str() << endmsg; // msg(MSG::VERBOSE) << " Run number " << (int) rob->rod_run_no() << endmsg; // msg(MSG::VERBOSE) << " Level1 ID " << rob->rod_lvl1_id() << endmsg; @@ -742,7 +801,7 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) { // msg(MSG::VERBOSE) << " Status pos " << rob->rod_status_position() << endmsg; // } - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; bool isBeamROD = false; // figure out which fragment we want to unpack @@ -770,6 +829,11 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) { if (size) { bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005 V3format |= (*(p) == 0x00123400); // additional frag marker since Sep 2005 (can appear in buggy ROD frags) + if (!V3format && version>0xff) { + V3format = true; + if ((m_WarningCounter++) < m_maxWarningPrint) + ATH_MSG_WARNING("fillCollection: corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec ); + } if (V3format) { ++p; // skip frag marker m_sizeOverhead = 3; @@ -804,7 +868,7 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) { } } if ((m_ErrorCounter++) < m_maxErrorPrint) { - msg(MSG::ERROR) << "Frag 0x" << std::hex << frag << std::dec + msg(MSG::ERROR) << "Frag 0x" << MSG::hex << frag << MSG::dec << " has unexpected size: " << count; if (wc < size) { msg(MSG::ERROR) << " skipping " << cnt << " words to the next frag" << endmsg; @@ -864,7 +928,7 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) { pChannel.reserve(48); // initialize meta data storage - for (unsigned int i = 0; i < 6; ++i) { + for (unsigned int i = 0; i < 7; ++i) { m_digitsMetaData[i]->clear(); m_rawchannelMetaData[i]->clear(); } @@ -884,8 +948,8 @@ void TileROD_Decoder::fillCollection(const ROBData * rob, COLLECTION & v) { uint32_t idAndType = *(p + 1); int type = (idAndType & 0x00FF0000) >> 16; - ATH_MSG_VERBOSE( "Unpacking frag: 0x" << std::hex << (idAndType & 0xFFFF) - << " type " << type << std::dec ); + ATH_MSG_VERBOSE( "Unpacking frag: 0x" << MSG::hex << (idAndType & 0xFFFF) + << " type " << type << MSG::dec ); createdFrom |= (1 << type); diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx index 842e2ae1808bbaa42baf1c37a00a06d831632b61..d9bb726933afb36269fdc32280af55d47d33c9a1 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx +++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileCellCont.cxx @@ -95,7 +95,7 @@ StatusCode TileCellCont::initialize() { // Get pointer to TileCablingService TileCablingService* cabling = TileCablingService::getInstance(); - int maxChannels = TileCalibUtils::MAX_CHAN; // cabling->getMaxChannels(); + int maxChannels = cabling->getMaxChannels(); //m_hash.initialize(0); m_mbts_rods.clear(); diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx index 5ea593bd6985c236ec1ccd7843213210da13408a..563b68b3c8552843d9e3063d040befb228ab9364 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx +++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileDigitsContByteStreamCnv.cxx @@ -146,7 +146,9 @@ StatusCode TileDigitsContByteStreamCnv::createObj(IOpaqueAddress* pAddr, DataObj } else { m_decoder->fillCollection(robf[0], *digitsCollection); } - } + } else { + digitsCollection->setFragBCID((TileROD_Decoder::NO_ROB)<<16); + } } ATH_MSG_DEBUG( "Creating digits container " << *(pRE_Addr->par()) ); diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx index fdb3d712dc009e9541c1be561574ba6af964fcca..9399952d32f695f884e865892ff6a11abbf719f7 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx +++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileHid2RESrcID.cxx @@ -273,11 +273,11 @@ void TileHid2RESrcID::setROD2ROBmap (const eformat::FullEventFragment<const uint if ( (*it).second != ROBid ) { log << MSG::INFO << "Frag 0x" << MSG::hex << fragid <<" remapping from ROB 0x" << (*it).second - << " to 0x" << ROBid << endmsg; + << " to 0x" << ROBid << MSG::dec << endmsg; } else { log << MSG::DEBUG << "Frag 0x" << MSG::hex << fragid <<" found in ROB 0x" << (*it).second - << " as expected" << endmsg; + << " as expected" << MSG::dec << endmsg; } } diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx index 97c79006c94b40465e306d89eb91353f5e021934..6b8be9e62dfcc3245d316da5cf25bbdcaccbdb8b 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx +++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileROD_Decoder.cxx @@ -70,6 +70,7 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam declareProperty("calibrateEnergy", m_calibrateEnergy = true); // convert ADC counts to pCb for RawChannels declareProperty("suppressDummyFragments", m_suppressDummyFragments = false); declareProperty("maskBadDigits", m_maskBadDigits = false); // put -1 in digits vector for channels with bad BCID or CRC in unpack_frag0 + declareProperty("MaxWarningPrint", m_maxWarningPrint = 1000); declareProperty("MaxErrorPrint", m_maxErrorPrint = 100); declareProperty("AllowedTimeMin", m_allowedTimeMin = -50.); // set amp to zero if time is below allowed time min @@ -81,7 +82,7 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam m_timeMinThresh = -25; m_timeMaxThresh = 25; - for (unsigned int i = 0; i < 6; ++i) { + for (unsigned int i = 0; i < 7; ++i) { m_digitsMetaData.push_back(new std::vector<uint32_t>); m_digitsMetaData[i]->reserve(16); m_rawchannelMetaData.push_back(new std::vector<uint32_t>); @@ -99,6 +100,7 @@ TileROD_Decoder::TileROD_Decoder(const std::string& type, const std::string& nam m_container = 0; m_MBTS = NULL; m_cell2Double.reserve(23); // Maximum number of cells in a drawer + m_WarningCounter = 0; m_ErrorCounter = 0; m_OFWeights.resize(4 * TileCalibUtils::MAX_DRAWERIDX, NULL); @@ -113,7 +115,7 @@ void TileROD_Decoder::updateAmpThreshold(float ampMinThresh) { /** destructor */ TileROD_Decoder::~TileROD_Decoder() { - for (unsigned int i = 0; i < 6; ++i) { + for (unsigned int i = 0; i < 7; ++i) { delete m_digitsMetaData[i]; delete m_rawchannelMetaData[i]; } @@ -128,12 +130,22 @@ const InterfaceID& TileROD_Decoder::interfaceID() { return IID_ITileROD_Decoder; } +void TileROD_Decoder::printWarningCounter(bool printIfNoWarning) { + if (printIfNoWarning || m_WarningCounter > 0) { + ATH_MSG_WARNING( "Found " << m_WarningCounter << " warnings in decoding words"); + } +} + void TileROD_Decoder::printErrorCounter(bool printIfNoError) { if (printIfNoError || m_ErrorCounter > 0) { ATH_MSG_ERROR( "Found " << m_ErrorCounter << " errors in decoding words"); } } +int TileROD_Decoder::getWarningCounter() { + return m_WarningCounter; +} + int TileROD_Decoder::getErrorCounter() { return m_ErrorCounter; } @@ -216,6 +228,7 @@ StatusCode TileROD_Decoder::finalize() { m_Rw2Pmt[i].clear(); } m_list_of_masked_drawers.clear(); + if (m_WarningCounter != 0) printWarningCounter(1); if (m_ErrorCounter != 0) printErrorCounter(1); return StatusCode::SUCCESS; } @@ -254,12 +267,27 @@ void TileROD_Decoder::unpack_frag0(uint32_t version, const uint32_t* p, pDigiVec // Position of first data word, ignore 2 frag header words data = p + 2; - // check that fragment is not dummy - if (m_suppressDummyFragments) { - for (n = 0; n < size; ++n) { - if (data[n] != 0 && data[n] != 0xffffffff) break; + uint32_t all00 = TileFragStatus::ALL_00; + uint32_t allFF = TileFragStatus::ALL_FF; + + for (int i = 0; i < size; ++i) { + uint32_t w = data[i]; + if (allFF && w!=0xFFFFFFFF) { + allFF = TileFragStatus::ALL_OK; + if (all00 == TileFragStatus::ALL_OK) break; + } + if (all00 && w != 0) { + all00 = TileFragStatus::ALL_OK; + if (allFF == TileFragStatus::ALL_OK) break; } - if (n == size) return; // nothing reasonable found + } + + uint32_t status = (all00 | allFF); + m_digitsMetaData[6]->push_back( status ); + + // check that fragment is not dummy + if (m_suppressDummyFragments && status != TileFragStatus::ALL_OK) { + return; // nothing reasonable found } // if (msgLvl(MSG::VERBOSE)) @@ -874,14 +902,18 @@ void TileROD_Decoder::unpack_frag4(uint32_t /* version */, const uint32_t* p, HWIdentifier drawerID = m_tileHWID->drawer_id(frag); TileRawChannel* rc; - + uint32_t all00 = TileFragStatus::ALL_00; + uint32_t allFF = TileFragStatus::ALL_FF; + for (unsigned int ch = 0; ch < m_maxChannels; ++ch) { unsigned int w = (*p); int gain = m_rc2bytes4.gain(w); HWIdentifier adcID = m_tileHWID->adc_id(drawerID, ch, gain); + if (allFF && w!=0xFFFFFFFF) allFF = TileFragStatus::ALL_OK; if (w != 0) { // skip invalid channels + if (all00) all00 = TileFragStatus::ALL_OK; rc = new TileRawChannel(adcID , m_rc2bytes4.amplitude(w) , m_rc2bytes4.time(w) @@ -904,6 +936,8 @@ void TileROD_Decoder::unpack_frag4(uint32_t /* version */, const uint32_t* p, ++p; } + m_rawchannelMetaData[6]->push_back( all00 | allFF ); + if (wc > count) { // check word count ATH_MSG_ERROR( "unpack_frag4 => Incorrect word count: " @@ -1000,18 +1034,30 @@ void TileROD_Decoder::unpack_frag6(uint32_t /*version*/, const uint32_t* p, pDig // pointer to current data word const uint32_t* data = p + 2; // Position of first data word, - // check that fragment is not dummy - if (m_suppressDummyFragments) { - int n = 0; - for (; n < size; ++n) { - if (data[n] != 0 && data[n] != 0xffffffff) break; + uint32_t all00 = TileFragStatus::ALL_00; + uint32_t allFF = TileFragStatus::ALL_FF; + + for (int i = 0; i < size; ++i) { + uint32_t w = data[i]; + if (allFF && w!=0xFFFFFFFF) { + allFF = TileFragStatus::ALL_OK; + if (all00 == TileFragStatus::ALL_OK) break; } - if (n == size) {// nothing reasonable found - ATH_MSG_WARNING("FRAG6: Suppress dummy fragment!!!"); - return; + if (all00 && w != 0) { + all00 = TileFragStatus::ALL_OK; + if (allFF == TileFragStatus::ALL_OK) break; } } + uint32_t status = (all00 | allFF); + m_digitsMetaData[6]->push_back( status ); + + // check that fragment is not dummy + if (m_suppressDummyFragments && status != TileFragStatus::ALL_OK) { + ATH_MSG_WARNING("FRAG6: Suppress dummy fragment!!!"); + return; // nothing reasonable found + } + unsigned int moduleID[4] = {0}; unsigned int runType[4] = {0}; @@ -2342,7 +2388,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p, if (true) { int maxn=size+2-m_sizeOverhead; for(int n=0; n<maxn; ++n){ - ATH_MSG_DEBUG("WORD " << n << " (" << n+11 << ") : (DEC) " << p[n] << " (HEX) 0x" << std::hex << p[n] << std::dec ); + ATH_MSG_DEBUG("WORD " << n << " (" << n+11 << ") : (DEC) " << p[n] << " (HEX) 0x" << MSG::hex << p[n] << MSG::dec ); } } @@ -2356,7 +2402,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p, laserObject.setPLC(-99,-99,-99,-99,-99,-99); laserObject.setDaqType(int(p[2])); - ATH_MSG_DEBUG("SETTING DAQ TYPE IN DECODER = " << std::hex << "0x" << int(p[2]) << " " << std::dec << int(p[2])); + ATH_MSG_DEBUG("SETTING DAQ TYPE IN DECODER = " << MSG::hex << "0x" << int(p[2]) << " " << MSG::dec << int(p[2])); int countr = p[3]; int idiode = (p[4]>>16); @@ -2367,7 +2413,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p, if(laserObject.isLASERII()) ATH_MSG_DEBUG("LASERII VERSION IS " << laserObject.getVersion()); else ATH_MSG_DEBUG("LASERI VERSION IS " << laserObject.getVersion()); - ATH_MSG_DEBUG("laserObject.setLaser: " << std::dec << "COUNTER=" << countr << " | " + ATH_MSG_DEBUG("laserObject.setLaser: " << MSG::dec << "COUNTER=" << countr << " | " << "I_DIODE=" << idiode << " | " << "FILTERN=" << filter << " | " << "TIMINGD=" << timing << " | " @@ -2467,8 +2513,8 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p, ATH_MSG_DEBUG("ALP CHAN=" << channel << " GAIN=LG" << " TYPE=" << laserObject.getType(channel,TileID::LOWGAIN,3) << " MEAN=" << laserObject.getMean(channel,TileID::LOWGAIN,3) << " SIGMA=" << laserObject.getSigma(channel,TileID::LOWGAIN,3) << " N=" << laserObject.getN(channel,TileID::LOWGAIN,3) << " isSet?=" << laserObject.isSet(channel,TileID::LOWGAIN,3) ); ATH_MSG_DEBUG("ALP CHAN=" << channel << " GAIN=HG" << " TYPE=" << laserObject.getType(channel,TileID::HIGHGAIN,3) << " MEAN=" << laserObject.getMean(channel,TileID::HIGHGAIN,3) << " SIGMA=" << laserObject.getSigma(channel,TileID::HIGHGAIN,3) << " N=" << laserObject.getN(channel,TileID::HIGHGAIN,3) << " isSet?=" << laserObject.isSet(channel,TileID::HIGHGAIN,3) ); - ATH_MSG_DEBUG(std::hex << msb0 << " + " << lsb0 << " => " << SSQ0 << - std::dec << " >>> D" << channel << "(HG)" + ATH_MSG_DEBUG(MSG::hex << msb0 << " + " << lsb0 << " => " << SSQ0 << + MSG::dec << " >>> D" << channel << "(HG)" << " SUMX/N=" << sum[channel*2+HG] << " / " << nevt @@ -2479,8 +2525,8 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p, << " / " << nevt << " => STD=" << std[channel*2+0]); - ATH_MSG_DEBUG(std::hex << msb1 << " + " << lsb1 << " => " << SSQ1 << - std::dec << " >>> D" << channel << "(LG)" + ATH_MSG_DEBUG(MSG::hex << msb1 << " + " << lsb1 << " => " << SSQ1 << + MSG::dec << " >>> D" << channel << "(LG)" << " SUMX/N=" << sum[channel*2+LG] << " / " << nevt @@ -2511,7 +2557,7 @@ void TileROD_Decoder::unpack_frag17(uint32_t /* version */, const uint32_t* p, } } else { // short fragment - ATH_MSG_DEBUG("SHORT FRAGMENT, size=" << p[0] << " type=0x" << std::hex << p[1] << std::dec); + ATH_MSG_DEBUG("SHORT FRAGMENT, size=" << p[0] << " type=0x" << MSG::hex << p[1] << MSG::dec); memset(ped,0,sizeof(ped)); memset(std,0,sizeof(std)); } @@ -2813,7 +2859,7 @@ StatusCode TileROD_Decoder::convert(const RawEvent* re, TileL2Container* L2Cnt) } void TileROD_Decoder::fillCollectionL2(const ROBData * rob, TileL2Container & v) { - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; uint32_t wc = 0; uint32_t size = data_size(rob); @@ -2824,6 +2870,11 @@ void TileROD_Decoder::fillCollectionL2(const ROBData * rob, TileL2Container & v) if (size) { bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005 + if (!V3format && version>0xff) { + V3format = true; + if ((m_WarningCounter++) < m_maxWarningPrint) + ATH_MSG_WARNING("fillCollectionL2( corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec ); + } if (V3format) ++p; // skip frag marker } @@ -3008,7 +3059,7 @@ StatusCode TileROD_Decoder::convertLaser(const RawEvent* re, TileLaserObject* la void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v) { // v.setBCID(-999); // TileLaserObject default tag -> Laser only if BCID != -999 - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; uint32_t wc = 0; uint32_t size = data_size(rob); @@ -3025,6 +3076,11 @@ void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v) } bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005 + if (!V3format && version>0) { + V3format = true; + if ((m_WarningCounter++) < m_maxWarningPrint) + ATH_MSG_WARNING("fillTileLaserObj: corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec ); + } if (V3format) { ++p; // skip frag marker m_sizeOverhead = 3; @@ -3042,13 +3098,13 @@ void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v) int frag = *(p + 1) & 0xFFFF; int type = *(p + 1) >> 16; - msg(MSG::DEBUG) << wc << " / " << size << " HEX = 0x" << std::hex << count << " DEC = " << std::dec << count << " ( FRAG , TYPE ) = " << frag << " , " << type << endmsg; + msg(MSG::DEBUG) << wc << " / " << size << " HEX = 0x" << MSG::hex << count << " DEC = " << MSG::dec << count << " ( FRAG , TYPE ) = " << frag << " , " << type << endmsg; if (count < m_sizeOverhead || count > size - wc) { int cnt = 0; for (; wc < size; ++wc, ++cnt, ++p) { if ((*p) == 0xff1234ff) { - msg(MSG::DEBUG) << "DATA POINTER: HEX = " << std::hex << (*p) << " DEC = " << std::dec << (*p) << endmsg; + msg(MSG::DEBUG) << "DATA POINTER: HEX = " << MSG::hex << (*p) << " DEC = " << MSG::dec << (*p) << endmsg; ++cnt; ++wc; ++p; @@ -3107,7 +3163,7 @@ void TileROD_Decoder::fillTileLaserObj(const ROBData * rob, TileLaserObject & v) } //end of FillLaserObj void TileROD_Decoder::fillCollectionHLT(const ROBData * rob, TileCellCollection & v) { - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; // Resets error flag m_error = 0x0; @@ -3129,6 +3185,11 @@ void TileROD_Decoder::fillCollectionHLT(const ROBData * rob, TileCellCollection if (size) { bool V3format = (*(p) == 0xff1234ff); // additional frag marker since Sep 2005 + if (!V3format && version>0xff) { + V3format = true; + if ((m_WarningCounter++) < m_maxWarningPrint) + ATH_MSG_WARNING("fillCollectionHLT: corrupted frag separator 0x" << MSG::hex << (*p) << " instead of 0xff1234ff in ROB 0x" << rob->rod_source_id() << MSG::dec ); + } if (V3format) { ++p; // skip frag marker m_sizeOverhead = 3; @@ -3978,7 +4039,7 @@ void TileROD_Decoder::fillCollection_TileMuRcv_Digi(const ROBData* rob , TileDig bool b_sof = false; bool b_digiTmdb = false; - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; uint32_t sourceid = rob->rod_source_id(); int size = rob->rod_ndata(); @@ -4038,7 +4099,7 @@ void TileROD_Decoder::fillCollection_TileMuRcv_RawChannel(const ROBData* rob , T bool b_sof = false; bool b_rcTmdb = false; - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; uint32_t sourceid = rob->rod_source_id(); int size = rob->rod_ndata(); int offset = 0; @@ -4137,7 +4198,7 @@ void TileROD_Decoder::fillContainer_TileMuRcv_Decision(const ROBData* rob ,TileM bool b_sof = false; bool b_deciTmdb = false; - uint32_t version = rob->rod_version() & 0xFF; + uint32_t version = rob->rod_version() & 0xFFFF; uint32_t sourceid = rob->rod_source_id(); int size = rob->rod_ndata(); int offset = 0; diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx index 7d83d089b3c2b9562f4a86df919ae8b469d17d9e..48b32f62990b905c13a59a31da94b54f483d2673 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx +++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamCnv.cxx @@ -150,6 +150,8 @@ StatusCode TileRawChannelContByteStreamCnv::createObj(IOpaqueAddress* pAddr, Dat } else { m_decoder->fillCollection(robf[0], *rawChannelCollection); } + } else { + rawChannelCollection->setFragGlobalCRC(TileROD_Decoder::NO_ROB); } } diff --git a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx index 65cb4962d25294935dbb79c6f1658268f883d4f1..53b1f130b1925f6ecc54dea57ef18441db3c4169 100644 --- a/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx +++ b/TileCalorimeter/TileSvc/TileByteStream/src/TileRawChannelContByteStreamTool.cxx @@ -69,7 +69,7 @@ StatusCode TileRawChannelContByteStreamTool::initialize() { // get TileBadChanTool CHECK( m_tileBadChanTool.retrieve() ); - m_maxChannels = TileCalibUtils::MAX_CHAN; // TileCablingService::getInstance()->getMaxChannels(); + m_maxChannels = TileCablingService::getInstance()->getMaxChannels(); m_channels = new TileFastRawChannel[m_tileHWID->channel_hash_max()]; diff --git a/TileCalorimeter/TileTBRec/src/TileTBDump.cxx b/TileCalorimeter/TileTBRec/src/TileTBDump.cxx index ac265bd508a8a380e449560a62484de7faca7f59..74e00c2db55fb907e26248d7a46891216b8b94df 100755 --- a/TileCalorimeter/TileTBRec/src/TileTBDump.cxx +++ b/TileCalorimeter/TileTBRec/src/TileTBDump.cxx @@ -327,7 +327,7 @@ StatusCode TileTBDump::execute() { unsigned int max_allowed_size = robf.rod_fragment_size_word(); unsigned int delta = robf.rod_header_size_word() + robf.rod_trailer_size_word(); - if (max_allowed_size > delta) { + if (max_allowed_size >= delta) { max_allowed_size -= delta; } else { std::cout << " Problem with ROD data: total length " << max_allowed_size @@ -363,8 +363,24 @@ StatusCode TileTBDump::execute() { unsigned int size = robf.rod_ndata(); if (size > max_allowed_size) { - size = max_allowed_size; - std::cout<<" Problem with data size - assuming " << size << " words"<<std::endl; + if (size - robf.rod_trailer_size_word() < max_allowed_size) { + std::cout<<" Problem with data size - assuming that trailer size is " << robf.rod_trailer_size_word()-(size-max_allowed_size) + <<" words instead of " << robf.rod_trailer_size_word() << " and data size is " << size << " words " << std::endl; + max_allowed_size = size; + } else if (size - robf.rod_trailer_size_word() == max_allowed_size) { + std::cout<<" Problem with data size - assuming that trailer is absent " + << " ROD size " << robf.rod_fragment_size_word() + << " header size " << robf.rod_header_size_word() + << " data size " << size << std::endl; + max_allowed_size = size; + } else { + max_allowed_size += robf.rod_trailer_size_word(); + size = max_allowed_size; + std::cout<<" Problem with data size - assuming " << size << " words and no trailer at all"<<std::endl; + } + std::cout << std::endl << "Dump of whole ROB fragment 0x" << std::hex << robf.rod_source_id() << std::dec + << " (" << robf.rod_fragment_size_word()+robf.header_size_word() << " words)" << std::endl; + dump_data(fprob, robf.rod_fragment_size_word()+robf.header_size_word(), version, verbosity); } if ( size > 0 ) { @@ -389,9 +405,10 @@ StatusCode TileTBDump::execute() { dump_digi(subdet_id,data, size, version, verbosity, source_id); } } - - std::cout << std::endl; + } else { + std::cout << std::endl << std::hex << "NO DATA in ROB fragment 0x" << robf.rod_source_id() << std::dec << std::endl << std::endl; } + std::cout << std::endl; } } @@ -443,14 +460,14 @@ std::ostream &setupPr4 (std::ostream &stream){ void TileTBDump::dump_data(const uint32_t * data, unsigned int size, unsigned int /* version */, int /* verbosity */) { boost::io::ios_base_all_saver coutsave(std::cout); - std::cout << std::endl << " Fragment data as 4 byte words:" << std::hex << std::setw(8) << std::setprecision(8); + std::cout << std::endl << " Fragment data as 4 byte words:" << std::hex << std::setfill('0') ; for (unsigned int cnter = 0; cnter < size; ++cnter) { if (!(cnter % 8)) std::cout << std::endl; - std::cout << (*data++) << " "; + std::cout << std::setw(8) << (*data++) << " "; } - std::cout << std::dec << std::endl << std::endl; + std::cout <<std::setfill(' ') << std::dec << std::endl << std::endl; } @@ -486,7 +503,7 @@ void TileTBDump::dump_digi(unsigned int subdet_id, const uint32_t* roddata, unsi version = 0; // reset version in COMMON BEAM ROD // don't expect different versions there } else { - version &= 0xFF; // keep just minor version number + version &= 0xFFFF; // keep just minor version number } find_frag(roddata, rodsize, version, verbosity, frag, &nfrag); @@ -1806,16 +1823,22 @@ void dump_it(unsigned int nw, unsigned int * data) { /* ------------------------------------------------------------------------ */ void TileTBDump::find_frag(const uint32_t* data, unsigned int size, unsigned int version - , int /* verbosity */, T_RodDataFrag** frag, int* nfrag) { + , int verbosity, T_RodDataFrag** frag, int* nfrag) { unsigned int offset = 0; *nfrag = 0; m_v3Format = (*(data) == 0xff1234ff); // additional frag marker since Sep 2005 m_v3Format |= (*(data) == 0x00123400); // another possible frag marker (can appear in buggy ROD frags) - if (m_v3Format) { + if (m_v3Format || (version > 0xff)) { m_sizeOverhead = 3; ++offset; // skip frag marker - std::cout << " *(p) = 0x" << std::hex << (*(data)) << std::dec << std::endl; + std::cout << " *(p) = 0x" << std::hex << (*(data)) << std::dec << ((m_v3Format)?"":" => ERROR Corrupted frag separator") << std::endl; std::cout << " v3Format = true" << std::endl; + if (!m_v3Format) { + m_v3Format = true; + std::cout << std::endl << "Dump of whole data fragment (" + << size << " words)" << std::endl; + dump_data(data, size, version, verbosity); + } } else { m_sizeOverhead = 2; } diff --git a/TileCalorimeter/TileTBRec/src/TileTBStat.cxx b/TileCalorimeter/TileTBRec/src/TileTBStat.cxx index 3bfa0a1d10be4320bb0a84d324f15b852bfb1a66..db56fae088e4ea4498ed43d5e890c121a7d2680c 100755 --- a/TileCalorimeter/TileTBRec/src/TileTBStat.cxx +++ b/TileCalorimeter/TileTBRec/src/TileTBStat.cxx @@ -255,8 +255,22 @@ StatusCode TileTBStat::execute() { unsigned int size = robf.rod_ndata(); if (size > max_allowed_size) { + + if (size - robf.rod_trailer_size_word() < max_allowed_size) { + ATH_MSG_ERROR( "Problem with data size - assuming that trailer size is " << robf.rod_trailer_size_word()-(size-max_allowed_size) + <<" words instead of " << robf.rod_trailer_size_word() << " and data size is " << size << " words " ); + max_allowed_size = size; + } else if (size - robf.rod_trailer_size_word() == max_allowed_size) { + ATH_MSG_ERROR( "Problem with data size - assuming that trailer is absent " + << " ROD size " << robf.rod_fragment_size_word() + << " header size " << robf.rod_header_size_word() + << " data size " << size ); + max_allowed_size = size; + } else { + max_allowed_size += robf.rod_trailer_size_word(); size = max_allowed_size; - ATH_MSG_ERROR( "Problem with data size - assuming " << size << " words " ); + ATH_MSG_ERROR( "Problem with data size - assuming " << size << " words and no trailer at all" ); + } } if ( size > 0 ) {