diff --git a/Detectors/CPV/base/include/CPVBase/CPVSimParams.h b/Detectors/CPV/base/include/CPVBase/CPVSimParams.h index d51790135fa7f..818b498662c5e 100644 --- a/Detectors/CPV/base/include/CPVBase/CPVSimParams.h +++ b/Detectors/CPV/base/include/CPVBase/CPVSimParams.h @@ -25,10 +25,10 @@ struct CPVSimParams : public o2::conf::ConfigurableParamHelper { std::string mCCDBPath = "localtest"; ///< use "localtest" to avoid connecting ccdb server, otherwise use ccdb-test.cern.ch //Parameters used in conversion of deposited energy to APD response - int mnCellZ = 128; - int mnCellX = 60; - float mPadSizeZ = 1.13; ///< overall size of CPV active size - float mPadSizeX = 2.1093; ///< in phi and z directions + int mnCellX = 128; + int mnCellZ = 60; + float mPadSizeX = 1.13; ///< overall size of CPV active size + float mPadSizeZ = 2.1093; ///< in phi and z directions float mDetR = 0.1; ///< Relative energy fluctuation in track for 100 e- float mdEdx = 4.0; ///< Average energy loss in CPV; int mNgamz = 5; ///< Ionization size in Z diff --git a/Detectors/CPV/base/include/CPVBase/Geometry.h b/Detectors/CPV/base/include/CPVBase/Geometry.h index 8390f77e11e8e..e3c49ce303ef7 100644 --- a/Detectors/CPV/base/include/CPVBase/Geometry.h +++ b/Detectors/CPV/base/include/CPVBase/Geometry.h @@ -33,15 +33,15 @@ class Geometry static constexpr short kNPAD = 48; static constexpr short kNDilogic = 10; static constexpr short kNRow = 16; - static constexpr short kNDDL = 3; + static constexpr short kNMod = 4; /// Available numbering schems: /// relative pad coordinates - /// relId[3]={Module, phi col, z row} where Module=1..3, phi col=0..127, z row=0..59 + /// relId[3]={Module, phi col, z row} where Module=2..4, phi col=0..127, z row=0..59 /// Absolute pad coordunate - /// absId=0..128*60*3=23040 + /// absId=0..128*60*3-1=23039 /// Raw addresses: - /// DDL corresponds to one module: ddl=Module-1 + /// DDL corresponds to one module: ddl=Module /// each module consist of 16 columns of width 8 pads: row=0..15 /// Each column consists of 10 dilogics (in z direction) dilogic=0...9 /// Ecah dilogic contains 8*6 pads: hwaddress=0...48 diff --git a/Detectors/CPV/base/src/Geometry.cxx b/Detectors/CPV/base/src/Geometry.cxx index f9f27f57ffdb9..5128a3be5ac3d 100644 --- a/Detectors/CPV/base/src/Geometry.cxx +++ b/Detectors/CPV/base/src/Geometry.cxx @@ -18,7 +18,7 @@ ClassImp(Geometry); unsigned short Geometry::relToAbsId(short moduleNumber, short iphi, short iz) { //converts module number, phi and z coordunates to absId - return kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ * (moduleNumber - 1) + kNumberOfCPVPadsZ * iz + iphi; + return kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ * (moduleNumber - 2) + kNumberOfCPVPadsZ * iphi + iz; } bool Geometry::absToRelNumbering(unsigned short absId, short* relid) @@ -29,8 +29,8 @@ bool Geometry::absToRelNumbering(unsigned short absId, short* relid) // relid[2] = Row number inside a CPV module (Z coordinate) const short nCPV = kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ; - relid[0] = absId / nCPV + 1; - absId -= (relid[0] - 1) * nCPV; + relid[0] = absId / nCPV + 2; + absId -= (relid[0] - 2) * nCPV; relid[1] = absId / kNumberOfCPVPadsZ; relid[2] = absId % kNumberOfCPVPadsZ; @@ -39,7 +39,7 @@ bool Geometry::absToRelNumbering(unsigned short absId, short* relid) short Geometry::absIdToModule(unsigned short absId) { - return 1 + absId / (kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ); + return 2 + absId / (kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ); } short Geometry::areNeighbours(unsigned short absId1, unsigned short absId2) @@ -95,29 +95,31 @@ bool Geometry::relToAbsNumbering(const short* relId, unsigned short& absId) { absId = - (relId[0] - 1) * kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ + // the offset of PHOS modules + (relId[0] - 2) * kNumberOfCPVPadsPhi * kNumberOfCPVPadsZ + // the offset of PHOS modules relId[1] * kNumberOfCPVPadsZ + // the offset along phi relId[2]; // the offset along z return true; } -void Geometry::hwaddressToAbsId(short ddl, short row, short dilog, short hw, unsigned short& absId) +void Geometry::hwaddressToAbsId(short /*ddl*/, short row, short dilog, short hw, unsigned short& absId) { - - short relid[3] = {short(ddl + 1), short(8 * row + hw % 8), short(6 * dilog + hw / 8)}; + short mod = row / 16; + row = row % 16; + short relid[3] = {short(mod + 2), short(8 * row + hw % 8), short(6 * dilog + hw / 8)}; relToAbsNumbering(relid, absId); } -void Geometry::absIdToHWaddress(unsigned short absId, short& ddl, short& row, short& dilogic, short& hw) +void Geometry::absIdToHWaddress(unsigned short absId, short& mod, short& row, short& dilogic, short& hw) { // Convert absId to hw address - // Arguments: w32,ddl,row,dilogic,address where to write the results + // Arguments: w32,mod,row,dilogic,address where to write the results + // return row in range 0...47, packing rows from all modules in common numeration short relid[3]; absToRelNumbering(absId, relid); - ddl = relid[0] - 1; // DDL# 0..2 + mod = relid[0]; // DDL# 2..4 row = relid[1] / 8; // row# 0..16 dilogic = relid[2] / 6; // Dilogic# 0..10 hw = relid[1] % 8 + 8 * (relid[2] % 6); // Address 0..47 @@ -127,7 +129,7 @@ void Geometry::absIdToHWaddress(unsigned short absId, short& ddl, short& row, sh hw = 0; dilogic = 0; row = 0; - ddl = 0; + mod = 0; return; } if (dilogic < 0 || dilogic > kNDilogic) { @@ -135,7 +137,7 @@ void Geometry::absIdToHWaddress(unsigned short absId, short& ddl, short& row, sh hw = 0; dilogic = 0; row = 0; - ddl = 0; + mod = 0; return; } if (row < 0 || row > kNRow) { @@ -143,7 +145,8 @@ void Geometry::absIdToHWaddress(unsigned short absId, short& ddl, short& row, sh hw = 0; dilogic = 0; row = 0; - ddl = 0; + mod = 0; return; } + row += (mod - 2) * 16; } diff --git a/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVGainCalibDevice.cxx b/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVGainCalibDevice.cxx index b2a130a056564..25f77e2cf9f70 100644 --- a/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVGainCalibDevice.cxx +++ b/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVGainCalibDevice.cxx @@ -70,12 +70,6 @@ void CPVGainCalibDevice::run(o2::framework::ProcessingContext& ctx) auto& header = rawreader.getRawHeader(); auto triggerBC = o2::raw::RDHUtils::getTriggerBC(header); auto triggerOrbit = o2::raw::RDHUtils::getTriggerOrbit(header); - auto ddl = o2::raw::RDHUtils::getFEEID(header); - // - if (ddl > o2::cpv::Geometry::kNDDL) { //only 4 correct DDLs - LOG(ERROR) << "DDL=" << ddl; - continue; //skip STU ddl - } // use the altro decoder to decode the raw data, and extract the RCU trailer o2::cpv::RawDecoder decoder(rawreader); RawErrorType_t err = decoder.decode(); diff --git a/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVPedestalCalibDevice.cxx b/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVPedestalCalibDevice.cxx index 5ad937bf95ef0..bb953292c948b 100644 --- a/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVPedestalCalibDevice.cxx +++ b/Detectors/CPV/calib/CPVCalibWorkflow/src/CPVPedestalCalibDevice.cxx @@ -62,11 +62,6 @@ void CPVPedestalCalibDevice::run(o2::framework::ProcessingContext& ctx) auto& header = rawreader.getRawHeader(); auto triggerBC = o2::raw::RDHUtils::getTriggerBC(header); auto triggerOrbit = o2::raw::RDHUtils::getTriggerOrbit(header); - auto ddl = o2::raw::RDHUtils::getFEEID(header); - if (ddl > o2::cpv::Geometry::kNDDL) { //only 4 correct DDLs - LOG(ERROR) << "DDL=" << ddl; - continue; //skip STU ddl - } // use the decoder to decode the raw data, and extract signals o2::cpv::RawDecoder decoder(rawreader); RawErrorType_t err = decoder.decode(); diff --git a/Detectors/CPV/reconstruction/src/RawDecoder.cxx b/Detectors/CPV/reconstruction/src/RawDecoder.cxx index 18937c0e8ea31..8ac0ac45467b4 100644 --- a/Detectors/CPV/reconstruction/src/RawDecoder.cxx +++ b/Detectors/CPV/reconstruction/src/RawDecoder.cxx @@ -27,13 +27,13 @@ RawErrorType_t RawDecoder::decode() { auto& header = mRawReader.getRawHeader(); - short ddl = o2::raw::RDHUtils::getFEEID(header); + short mod = o2::raw::RDHUtils::getFEEID(header); mDigits.clear(); auto payloadwords = mRawReader.getPayload(); if (payloadwords.size() == 0) { - mErrors.emplace_back(ddl, 0, 0, 0, kNO_PAYLOAD); //add error - LOG(ERROR) << "Empty payload for DDL=" << ddl; + mErrors.emplace_back(mod, 0, 0, 0, kNO_PAYLOAD); //add error + LOG(ERROR) << "Empty payload for DDL=" << mod; return kNO_PAYLOAD; } @@ -56,47 +56,41 @@ RawErrorType_t RawDecoder::readChannels() { mChannelsInitialized = false; auto& header = mRawReader.getRawHeader(); - short ddl = o2::raw::RDHUtils::getFEEID(header); //Current fee/ddl + short mod = o2::raw::RDHUtils::getLinkID(header) + 2; //Current module auto& payloadwords = mRawReader.getPayload(); //start reading from the end auto currentWord = payloadwords.rbegin(); while (currentWord != payloadwords.rend()) { - SegMarkerWord sw = {*currentWord++}; //first get value, then increment - if (sw.marker != 2736) { //error - mErrors.emplace_back(ddl, 17, 2, 0, kSEGMENT_HEADER_ERROR); //add error for non-existing row + SegMarkerWord sw = {*currentWord++}; //first get value, then increment + if (sw.marker != 2736) { //error + LOG(ERROR) << "Seg. marker word not in place: marker=" << sw.marker << " expected " << 2736 << " word=" << sw.mDataWord; + mErrors.emplace_back(mod, 17, 2, 0, kSEGMENT_HEADER_ERROR); //add error for non-existing row //try adding this as padWord - addDigit(sw.mDataWord, ddl); + addDigit(sw.mDataWord, mod); continue; } short nSegWords = sw.nwords; - short currentRow = sw.row; short nEoE = 0; while (nSegWords > 0 && currentWord != payloadwords.rend()) { EoEWord ew = {*currentWord++}; + short currentRow = ew.row; nSegWords--; if (ew.checkbit != 1) { //error - LOG(ERROR) << " error EoE, ddl" << ddl << " row " << currentRow; - mErrors.emplace_back(ddl, currentRow, 11, 0, kEOE_HEADER_ERROR); //add error + LOG(ERROR) << " error EoE, mod" << mod << " row " << currentRow; + mErrors.emplace_back(mod, currentRow, 11, 0, kEOE_HEADER_ERROR); //add error //try adding this as padWord - addDigit(ew.mDataWord, ddl); + addDigit(ew.mDataWord, mod); continue; } nEoE++; short nEoEwords = ew.nword; short currentDilogic = ew.dilogic; - if (ew.row != currentRow) { - LOG(ERROR) << "Row in EoE=" << ew.row << " != expected row " << currentRow; - mErrors.emplace_back(ddl, currentRow, currentDilogic, 0, kEOE_HEADER_ERROR); //add error - //try adding this as padWord - addDigit(ew.mDataWord, ddl); - continue; - } if (currentDilogic < 0 || currentDilogic > 10) { LOG(ERROR) << "wrong Dilogic in EoE=" << currentDilogic; - mErrors.emplace_back(ddl, currentRow, currentDilogic, 0, kEOE_HEADER_ERROR); //add error + mErrors.emplace_back(mod, currentRow, currentDilogic, 0, kEOE_HEADER_ERROR); //add error //try adding this as padWord - addDigit(ew.mDataWord, ddl); + addDigit(ew.mDataWord, mod); continue; } while (nEoEwords > 0 && currentWord != payloadwords.rend()) { @@ -105,16 +99,16 @@ RawErrorType_t RawDecoder::readChannels() nSegWords--; if (pad.zero != 0) { LOG(ERROR) << "bad pad, word=" << pad.mDataWord; - mErrors.emplace_back(ddl, currentRow, currentDilogic, 49, kPADERROR); //add error and skip word + mErrors.emplace_back(mod, currentRow, currentDilogic, 49, kPADERROR); //add error and skip word continue; } //check paw/pad indexes if (pad.row != currentRow || pad.dilogic != currentDilogic) { LOG(ERROR) << "RawPad " << pad.row << " != currentRow=" << currentRow << "dilogicPad=" << pad.dilogic << "!= currentDilogic=" << currentDilogic; - mErrors.emplace_back(ddl, short(pad.row), short(pad.dilogic), short(pad.address), kPadAddress); //add error and skip word + mErrors.emplace_back(mod, short(pad.row), short(pad.dilogic), short(pad.address), kPadAddress); //add error and skip word //do not skip, try adding using info from pad } - addDigit(pad.mDataWord, ddl); + addDigit(pad.mDataWord, mod); } //pads in EoE if (nEoE % 10 == 0) { // kNDilogic = 10; ///< Number of dilogic per row if (currentWord != payloadwords.rend()) { //Read row HEader @@ -122,10 +116,10 @@ RawErrorType_t RawDecoder::readChannels() nSegWords--; currentRow--; if (rw.marker != 13992) { - LOG(ERROR) << "Error in row marker:" << rw.marker << "row header word=" << rw.mDataWord; - mErrors.emplace_back(ddl, currentRow, 11, 0, kPadAddress); //add error and skip word + LOG(ERROR) << "Error in row marker: " << rw.marker << "!=13992, row header word=" << rw.mDataWord; + mErrors.emplace_back(mod, currentRow, 11, 0, kPadAddress); //add error and skip word //try adding digit assuming this is pad word - addDigit(rw.mDataWord, ddl); + addDigit(rw.mDataWord, mod); } } } @@ -151,7 +145,7 @@ const std::vector& RawDecoder::getDigits() const return mDigits; } -void RawDecoder::addDigit(uint32_t w, short ddl) +void RawDecoder::addDigit(uint32_t w, short mod) { PadWord pad = {w}; @@ -162,7 +156,7 @@ void RawDecoder::addDigit(uint32_t w, short ddl) short dilogicPad = pad.dilogic; short hw = pad.address; unsigned short absId; - o2::cpv::Geometry::hwaddressToAbsId(ddl, rowPad, dilogicPad, hw, absId); + o2::cpv::Geometry::hwaddressToAbsId(mod, rowPad, dilogicPad, hw, absId); AddressCharge ac = {0}; ac.Address = absId; diff --git a/Detectors/CPV/simulation/include/CPVSimulation/Detector.h b/Detectors/CPV/simulation/include/CPVSimulation/Detector.h index 9c95ec79c0017..882c016c6d01a 100644 --- a/Detectors/CPV/simulation/include/CPVSimulation/Detector.h +++ b/Detectors/CPV/simulation/include/CPVSimulation/Detector.h @@ -152,7 +152,7 @@ class Detector : public o2::base::DetImpl void defineSensitiveVolumes(); // Geometry parameters - Bool_t mActiveModule[6]; // list of modules to create + Bool_t mActiveModule[5]; // list of modules to create // Simulation std::vector* mHits = nullptr; //! Collection of CPV hits diff --git a/Detectors/CPV/simulation/include/CPVSimulation/RawWriter.h b/Detectors/CPV/simulation/include/CPVSimulation/RawWriter.h index 8f80129b29434..ed72bdb71fc3d 100644 --- a/Detectors/CPV/simulation/include/CPVSimulation/RawWriter.h +++ b/Detectors/CPV/simulation/include/CPVSimulation/RawWriter.h @@ -33,10 +33,11 @@ namespace o2 namespace cpv { -static constexpr short kNDDL = 3; ///< Total number of DDLs +static constexpr short kNMod = 3; ///< Total number of modules +static constexpr short kFirstMod = 2; ///< First available module static constexpr short kNPAD = 48; ///< Nuber of pads per dilogic static constexpr short kNDilogic = 10; ///< Number of dilogic per row -static constexpr short kNRow = 16; ///< number of rows per dddl +static constexpr short kNRow = 48; ///< number of rows 16*3 mod struct padCharge { short charge; @@ -73,13 +74,13 @@ class RawWriter std::vector& trailer, std::vector& header) const; private: - std::vector mPadCharge[kNDDL][kNRow][kNDilogic]; ///< list of signals per event - FileFor_t mFileFor = FileFor_t::kFullDet; ///< Granularity of the output files - std::string mOutputLocation = "./"; ///< Rawfile name - std::unique_ptr mCalibParams; ///< CPV calibration - std::vector mPayload; ///< Payload to be written - gsl::span mDigits; ///< Digits input vector - must be in digitized format including the time response - std::unique_ptr mRawWriter; ///< Raw writer + std::vector mPadCharge[kNRow][kNDilogic]; ///< list of signals per event + FileFor_t mFileFor = FileFor_t::kFullDet; ///< Granularity of the output files + std::string mOutputLocation = "./"; ///< Rawfile name + std::unique_ptr mCalibParams; ///< CPV calibration + std::vector mPayload; ///< Payload to be written + gsl::span mDigits; ///< Digits input vector - must be in digitized format including the time response + std::unique_ptr mRawWriter; ///< Raw writer ClassDefNV(RawWriter, 1); }; diff --git a/Detectors/CPV/simulation/src/Detector.cxx b/Detectors/CPV/simulation/src/Detector.cxx index 7c69a27f9955e..012b07d665429 100644 --- a/Detectors/CPV/simulation/src/Detector.cxx +++ b/Detectors/CPV/simulation/src/Detector.cxx @@ -351,11 +351,10 @@ void Detector::ConstructGeometry() // Configure geometry So far we have only one: Run3 { mActiveModule[0] = kFALSE; - mActiveModule[1] = kTRUE; + mActiveModule[1] = kFALSE; mActiveModule[2] = kTRUE; mActiveModule[3] = kTRUE; - mActiveModule[4] = kFALSE; - mActiveModule[5] = kFALSE; + mActiveModule[4] = kTRUE; } // First create necessary materials @@ -375,7 +374,7 @@ void Detector::ConstructGeometry() int iXYZ, iAngle; char im[5]; for (int iModule = 0; iModule < 5; iModule++) { - if (!mActiveModule[iModule + 1]) { + if (!mActiveModule[iModule]) { continue; } float angle[3][2] = {0}; @@ -565,6 +564,9 @@ void Detector::addAlignableVolumes() const for (Int_t iModule = 0; iModule < geom->GetNModules(); iModule++) { + if (!mActiveModule[iModule]) { + continue; + } TString volPath(physModulePath); volPath += iModule; diff --git a/Detectors/CPV/simulation/src/Digitizer.cxx b/Detectors/CPV/simulation/src/Digitizer.cxx index b167f86eafbd4..f23a7de3aa925 100644 --- a/Detectors/CPV/simulation/src/Digitizer.cxx +++ b/Detectors/CPV/simulation/src/Digitizer.cxx @@ -142,9 +142,9 @@ void Digitizer::processHits(const std::vector* hits, const std::vectorregisterLink(ddl, crorc, link, 0, rawfilename.data()); - } + //ddl,crorc, link,... + mRawWriter->registerLink(0, 0, 0, 0, rawfilename.data()); } void RawWriter::digitsToRaw(gsl::span digitsbranch, gsl::span triggerbranch) @@ -71,84 +69,79 @@ bool RawWriter::processTrigger(const gsl::span digitsbranch, con { //Array used to sort properly digits - for (int i = kNDDL; i--;) { - for (int j = kNRow; j--;) { - for (int k = kNDilogic; k--;) { - mPadCharge[i][j][k].clear(); - } + for (int j = kNRow; j--;) { + for (int k = kNDilogic; k--;) { + mPadCharge[j][k].clear(); } } for (auto& dig : gsl::span(digitsbranch.data() + trg.getFirstEntry(), trg.getNumberOfObjects())) { + short absId = dig.getAbsId(); - short ddl, dilogic, row, hwAddr; - o2::cpv::Geometry::absIdToHWaddress(absId, ddl, row, dilogic, hwAddr); + short mod, dilogic, row, hwAddr; + o2::cpv::Geometry::absIdToHWaddress(absId, mod, row, dilogic, hwAddr); //Convert Amp to ADC counts short charge = dig.getAmplitude() / mCalibParams->getGain(absId); if (charge > 2047) { charge = 2047; } - mPadCharge[ddl][row][dilogic].emplace_back(charge, hwAddr); + mPadCharge[row][dilogic].emplace_back(charge, hwAddr); } //Do through DLLs and fill raw words in proper order - for (int ddl = 0; ddl < kNDDL; ddl++) { - mPayload.clear(); - //write empty header, later will be updated ? - - int nwInSegment = 0; - int posRowMarker = 0; - for (int row = 0; row < kNRow; row++) { - //reserve place for row header - mPayload.emplace_back(uint32_t(0)); - posRowMarker = mPayload.size() - 1; - nwInSegment++; - int nwRow = 0; - for (Int_t dilogic = 0; dilogic < kNDilogic; dilogic++) { - int nPad = 0; - for (padCharge& pc : mPadCharge[ddl][row][dilogic]) { - PadWord currentword = {0}; - currentword.charge = pc.charge; - currentword.address = pc.pad; - currentword.dilogic = dilogic; - currentword.row = row; - mPayload.push_back(currentword.mDataWord); - nwInSegment++; - nPad++; - nwRow++; - } - EoEWord we = {0}; - we.nword = nPad; - we.dilogic = dilogic; - we.row = row; - we.checkbit = 1; - mPayload.push_back(we.mDataWord); + mPayload.clear(); + //write empty header, later will be updated ? + + int nwInSegment = 0; + int posRowMarker = 0; + for (int row = 0; row < kNRow; row++) { + //reserve place for row header + mPayload.emplace_back(uint32_t(0)); + posRowMarker = mPayload.size() - 1; + nwInSegment++; + int nwRow = 0; + for (Int_t dilogic = 0; dilogic < kNDilogic; dilogic++) { + int nPad = 0; + for (padCharge& pc : mPadCharge[row][dilogic]) { + PadWord currentword = {0}; + currentword.charge = pc.charge; + currentword.address = pc.pad; + currentword.dilogic = dilogic; + currentword.row = row; + mPayload.push_back(currentword.mDataWord); nwInSegment++; + nPad++; nwRow++; } - if (row % 8 == 7) { - SegMarkerWord w = {0}; - w.row = row; - w.nwords = nwInSegment; - w.marker = 2736; - mPayload.push_back(w.mDataWord); - nwInSegment = 0; - nwRow++; - } - //Now we know number of words, update rawMarker - RowMarkerWord wr = {0}; - wr.marker = 13992; - wr.nwords = nwRow - 1; - mPayload[posRowMarker] = wr.mDataWord; + EoEWord we = {0}; + we.nword = nPad; + we.dilogic = dilogic; + we.row = row; + we.checkbit = 1; + mPayload.push_back(we.mDataWord); + nwInSegment++; + nwRow++; } - - // register output data - LOG(DEBUG1) << "Adding payload with size " << mPayload.size() << " (" << mPayload.size() / 4 << " ALTRO words)"; - - short crorc = 0, link = ddl; - mRawWriter->addData(ddl, crorc, link, 0, trg.getBCData(), gsl::span(reinterpret_cast(mPayload.data()), mPayload.size() * sizeof(uint32_t))); + if (row % 2 == 1) { + SegMarkerWord w = {0}; + w.row = row; + w.nwords = nwInSegment; + w.marker = 2736; + mPayload.push_back(w.mDataWord); + nwInSegment = 0; + nwRow++; + } + //Now we know number of words, update rawMarker + RowMarkerWord wr = {0}; + wr.marker = 13992; + wr.nwords = nwRow - 1; + mPayload[posRowMarker] = wr.mDataWord; } + + // register output data + LOG(DEBUG1) << "Adding payload with size " << mPayload.size() << " (" << mPayload.size() << " ALTRO words)"; + mRawWriter->addData(0, 0, 0, 0, trg.getBCData(), gsl::span(reinterpret_cast(mPayload.data()), mPayload.size() * sizeof(uint32_t))); return true; } int RawWriter::carryOverMethod(const header::RDHAny* rdh, const gsl::span data, diff --git a/Detectors/CPV/workflow/src/RawToDigitConverterSpec.cxx b/Detectors/CPV/workflow/src/RawToDigitConverterSpec.cxx index 219e19ccb6248..3c18ba36b3a83 100644 --- a/Detectors/CPV/workflow/src/RawToDigitConverterSpec.cxx +++ b/Detectors/CPV/workflow/src/RawToDigitConverterSpec.cxx @@ -121,8 +121,11 @@ void RawToDigitConverterSpec::run(framework::ProcessingContext& ctx) auto& header = rawreader.getRawHeader(); auto triggerBC = o2::raw::RDHUtils::getTriggerBC(header); auto triggerOrbit = o2::raw::RDHUtils::getTriggerOrbit(header); - auto ddl = o2::raw::RDHUtils::getFEEID(header); - ddl -= mDDL; + // auto ddl = o2::raw::RDHUtils::getFEEID(header); + auto mod = o2::raw::RDHUtils::getLinkID(header) + 2; //ddl=0,1,2 -> mod=2,3,4 + // if(ddl != mDDL){ + // LOG(ERROR) << "DDL from header "<< ddl << " != configured DDL=" << mDDL; + // } o2::InteractionRecord currentIR(triggerBC, triggerOrbit); std::shared_ptr> currentDigitContainer; @@ -134,10 +137,10 @@ void RawToDigitConverterSpec::run(framework::ProcessingContext& ctx) currentDigitContainer = found->second; } // - if (ddl > o2::cpv::Geometry::kNDDL) { //only 4 correct DDLs - LOG(ERROR) << "DDL=" << ddl; - mOutputHWErrors.emplace_back(6, ddl, 0, 0, kHEADER_INVALID); //Add non-existing DDL as DDL 5 - continue; //skip STU ddl + if (mod > o2::cpv::Geometry::kNMod) { //only 3 correct modules:2,3,4 + LOG(ERROR) << "module=" << mod << "do not exist"; + mOutputHWErrors.emplace_back(6, mod, 0, 0, kHEADER_INVALID); //Add non-existing DDL as DDL 5 + continue; //skip STU mod } // use the altro decoder to decode the raw data, and extract the RCU trailer o2::cpv::RawDecoder decoder(rawreader); @@ -146,7 +149,7 @@ void RawToDigitConverterSpec::run(framework::ProcessingContext& ctx) if (err != kOK) { //TODO handle severe errors //TODO: probably careful conversion of decoder errors to Fitter errors? - mOutputHWErrors.emplace_back(ddl, 1, 0, 0, err); //assign general header errors to non-existing FEE 16 + mOutputHWErrors.emplace_back(mod, 1, 0, 0, err); //assign general header errors to non-existing FEE 16 } // Loop over all the channels for (uint32_t adch : decoder.getDigits()) {