From 6a462f7b6c8cda85edf4205f40a2e9a2f3e3f511 Mon Sep 17 00:00:00 2001 From: Chiara Zampolli Date: Tue, 2 Nov 2021 17:23:59 +0100 Subject: [PATCH 1/2] Use mc flag to be able to run with data clang-format --- .../AODProducerWorkflowSpec.h | 4 +- Detectors/AOD/src/AODProducerWorkflowSpec.cxx | 123 +++++++++--------- 2 files changed, 67 insertions(+), 60 deletions(-) diff --git a/Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h b/Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h index dfc295f6ae2d9..829f361e37bbc 100644 --- a/Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h +++ b/Detectors/AOD/include/AODProducerWorkflow/AODProducerWorkflowSpec.h @@ -191,13 +191,15 @@ typedef boost::unordered_map Triple class AODProducerWorkflowDPL : public Task { public: - AODProducerWorkflowDPL(GID::mask_t src, std::shared_ptr dataRequest) : mInputSources(src), mDataRequest(dataRequest) {} + AODProducerWorkflowDPL(GID::mask_t src, std::shared_ptr dataRequest, bool useMC = true) : mInputSources(src), mDataRequest(dataRequest), mUseMC(useMC) {} ~AODProducerWorkflowDPL() override = default; void init(InitContext& ic) final; void run(ProcessingContext& pc) final; void endOfStream(framework::EndOfStreamContext& ec) final; private: + bool mUseMC = true; + const float cSpeed = 0.029979246f; // speed of light in TOF units GID::mask_t mInputSources; diff --git a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx index dce741421fa19..c58bc48b5e17b 100644 --- a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx +++ b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx @@ -1067,40 +1067,42 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) // correct ordering when iterating over container elements std::map, int> mcColToEvSrc; - // TODO: figure out collision weight - float mcColWeight = 1.; - // filling mcCollision table - int nMCCollisions = mcContext->getNCollisions(); - for (int iCol = 0; iCol < nMCCollisions; iCol++) { - auto time = mcRecords[iCol].getTimeNS(); - auto globalBC = mcRecords[iCol].toLong(); - auto item = bcsMap.find(globalBC); - int bcID = -1; - if (item != bcsMap.end()) { - bcID = item->second; - } else { - LOG(FATAL) << "Error: could not find a corresponding BC ID for MC collision; BC = " << globalBC << ", mc collision = " << iCol; - } - auto& colParts = mcParts[iCol]; - for (auto colPart : colParts) { - auto eventID = colPart.entryID; - auto sourceID = colPart.sourceID; - if (sourceID == 0) { // embedding: using background event info - // FIXME: - // use generators' names for generatorIDs (?) - short generatorID = sourceID; - auto& header = mcReader.getMCEventHeader(sourceID, eventID); - mcCollisionsCursor(0, - bcID, - generatorID, - truncateFloatFraction(header.GetX(), mCollisionPosition), - truncateFloatFraction(header.GetY(), mCollisionPosition), - truncateFloatFraction(header.GetZ(), mCollisionPosition), - truncateFloatFraction(time, mCollisionPosition), - truncateFloatFraction(mcColWeight, mCollisionPosition), - header.GetB()); + if (mUseMC) { + // TODO: figure out collision weight + float mcColWeight = 1.; + // filling mcCollision table + int nMCCollisions = mcContext->getNCollisions(); + for (int iCol = 0; iCol < nMCCollisions; iCol++) { + auto time = mcRecords[iCol].getTimeNS(); + auto globalBC = mcRecords[iCol].toLong(); + auto item = bcsMap.find(globalBC); + int bcID = -1; + if (item != bcsMap.end()) { + bcID = item->second; + } else { + LOG(FATAL) << "Error: could not find a corresponding BC ID for MC collision; BC = " << globalBC << ", mc collision = " << iCol; + } + auto& colParts = mcParts[iCol]; + for (auto colPart : colParts) { + auto eventID = colPart.entryID; + auto sourceID = colPart.sourceID; + if (sourceID == 0) { // embedding: using background event info + // FIXME: + // use generators' names for generatorIDs (?) + short generatorID = sourceID; + auto& header = mcReader.getMCEventHeader(sourceID, eventID); + mcCollisionsCursor(0, + bcID, + generatorID, + truncateFloatFraction(header.GetX(), mCollisionPosition), + truncateFloatFraction(header.GetY(), mCollisionPosition), + truncateFloatFraction(header.GetZ(), mCollisionPosition), + truncateFloatFraction(time, mCollisionPosition), + truncateFloatFraction(mcColWeight, mCollisionPosition), + header.GetB()); + } + mcColToEvSrc.emplace(std::pair(eventID, sourceID), iCol); // point background and injected signal events to one collision } - mcColToEvSrc.emplace(std::pair(eventID, sourceID), iCol); // point background and injected signal events to one collision } } @@ -1179,12 +1181,14 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) ft0RecPoint.getTrigger().triggersignals); } - // filling MC collision labels - for (auto& label : primVerLabels) { - auto it = mcColToEvSrc.find(std::pair(label.getEventID(), label.getSourceID())); - int32_t mcCollisionID = it != mcColToEvSrc.end() ? it->second : -1; - uint16_t mcMask = 0; // todo: set mask using normalized weights? - mcColLabelsCursor(0, mcCollisionID, mcMask); + if (mUseMC) { + // filling MC collision labels + for (auto& label : primVerLabels) { + auto it = mcColToEvSrc.find(std::pair(label.getEventID(), label.getSourceID())); + int32_t mcCollisionID = it != mcColToEvSrc.end() ? it->second : -1; + uint16_t mcMask = 0; // todo: set mask using normalized weights? + mcColLabelsCursor(0, mcCollisionID, mcMask); + } } // hash map for track indices of secondary vertices @@ -1288,26 +1292,27 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) bcsMap.clear(); - // filling mc particles table - fillMCParticlesTable(mcReader, - mcParticlesCursor, - primVer2TRefs, - primVerGIs, - recoData, - mcColToEvSrc); - - mcColToEvSrc.clear(); - - // ------------------------------------------------------ - // filling track labels - - // need to go through labels in the same order as for tracks - fillMCTrackLabelsTable(mcTrackLabelCursor, mcMFTTrackLabelCursor, mcFwdTrackLabelCursor, primVer2TRefs.back(), primVerGIs, recoData); - for (int iref = 0; iref < primVer2TRefs.size() - 1; iref++) { - auto& trackRef = primVer2TRefs[iref]; - fillMCTrackLabelsTable(mcTrackLabelCursor, mcMFTTrackLabelCursor, mcFwdTrackLabelCursor, trackRef, primVerGIs, recoData); + if (mUseMC) { + // filling mc particles table + fillMCParticlesTable(mcReader, + mcParticlesCursor, + primVer2TRefs, + primVerGIs, + recoData, + mcColToEvSrc); + + mcColToEvSrc.clear(); + + // ------------------------------------------------------ + // filling track labels + + // need to go through labels in the same order as for tracks + fillMCTrackLabelsTable(mcTrackLabelCursor, mcMFTTrackLabelCursor, mcFwdTrackLabelCursor, primVer2TRefs.back(), primVerGIs, recoData); + for (int iref = 0; iref < primVer2TRefs.size() - 1; iref++) { + auto& trackRef = primVer2TRefs[iref]; + fillMCTrackLabelsTable(mcTrackLabelCursor, mcMFTTrackLabelCursor, mcFwdTrackLabelCursor, trackRef, primVerGIs, recoData); + } } - mToStore.clear(); pc.outputs().snapshot(Output{"TFN", "TFNumber", 0, Lifetime::Timeframe}, tfNumber); @@ -1360,7 +1365,7 @@ DataProcessorSpec getAODProducerWorkflowSpec(GID::mask_t src, bool useMC) "aod-producer-workflow", dataRequest->inputs, outputs, - AlgorithmSpec{adaptFromTask(src, dataRequest)}, + AlgorithmSpec{adaptFromTask(src, dataRequest, useMC)}, Options{ ConfigParamSpec{"aod-timeframe-id", VariantType::Int64, -1L, {"Set timeframe number"}}, ConfigParamSpec{"enable-truncation", VariantType::Int, 1, {"Truncation parameter: 1 -- on, != 1 -- off"}}, From fcffb23721947ebc56268cd4486db2af3a368dec Mon Sep 17 00:00:00 2001 From: Chiara Zampolli Date: Wed, 3 Nov 2021 10:10:46 +0100 Subject: [PATCH 2/2] Changes by Ruben fix --- Detectors/AOD/src/AODProducerWorkflowSpec.cxx | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx index c58bc48b5e17b..1d617869584f1 100644 --- a/Detectors/AOD/src/AODProducerWorkflowSpec.cxx +++ b/Detectors/AOD/src/AODProducerWorkflowSpec.cxx @@ -974,17 +974,15 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) auto v0sCursor = v0sBuilder.cursor(); auto zdcCursor = zdcBuilder.cursor(); - o2::steer::MCKinematicsReader mcReader("collisioncontext.root"); - const auto mcContext = mcReader.getDigitizationContext(); - const auto& mcRecords = mcContext->getEventRecords(); - const auto& mcParts = mcContext->getEventParts(); - - LOG(DEBUG) << "FOUND " << mcRecords.size() << " records"; - LOG(DEBUG) << "FOUND " << mcParts.size() << " parts"; + std::unique_ptr mcReader; + if (mUseMC) { + mcReader = std::make_unique("collisioncontext.root"); + LOG(DEBUG) << "FOUND " << mcReader->getDigitizationContext()->getEventRecords().size() + << " records" << mcReader->getDigitizationContext()->getEventParts().size() << " parts"; + } std::map bcsMap; - collectBCs(fddRecPoints, ft0RecPoints, fv0RecPoints, primVertices, mcRecords, bcsMap); - + collectBCs(fddRecPoints, ft0RecPoints, fv0RecPoints, primVertices, mUseMC ? mcReader->getDigitizationContext()->getEventRecords() : std::vector{}, bcsMap); const auto* dh = o2::header::get(pc.inputs().getFirstValid(true).header); o2::InteractionRecord startIR = {0, dh->firstTForbit}; @@ -1071,7 +1069,9 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) // TODO: figure out collision weight float mcColWeight = 1.; // filling mcCollision table - int nMCCollisions = mcContext->getNCollisions(); + int nMCCollisions = mcReader->getDigitizationContext()->getNCollisions(); + const auto& mcRecords = mcReader->getDigitizationContext()->getEventRecords(); + const auto& mcParts = mcReader->getDigitizationContext()->getEventParts(); for (int iCol = 0; iCol < nMCCollisions; iCol++) { auto time = mcRecords[iCol].getTimeNS(); auto globalBC = mcRecords[iCol].toLong(); @@ -1090,7 +1090,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) // FIXME: // use generators' names for generatorIDs (?) short generatorID = sourceID; - auto& header = mcReader.getMCEventHeader(sourceID, eventID); + auto& header = mcReader->getMCEventHeader(sourceID, eventID); mcCollisionsCursor(0, bcID, generatorID, @@ -1294,7 +1294,7 @@ void AODProducerWorkflowDPL::run(ProcessingContext& pc) if (mUseMC) { // filling mc particles table - fillMCParticlesTable(mcReader, + fillMCParticlesTable(*mcReader, mcParticlesCursor, primVer2TRefs, primVerGIs,