diff --git a/Generators/include/Generators/PrimaryGenerator.h b/Generators/include/Generators/PrimaryGenerator.h index 097bfabf4ef57..cd4d842761418 100644 --- a/Generators/include/Generators/PrimaryGenerator.h +++ b/Generators/include/Generators/PrimaryGenerator.h @@ -80,6 +80,9 @@ class PrimaryGenerator : public FairPrimaryGenerator /** Public embedding methods **/ Bool_t embedInto(TString fname); + /// sets the embedding index + void setEmbedIndex(int idx) { mEmbedIndex = idx; } + void setExternalVertexForNextEvent(double x, double y, double z); // sets the vertex mode; if mode is kCCDB, a valid MeanVertexObject pointer must be given at the same time diff --git a/Generators/src/PrimaryGenerator.cxx b/Generators/src/PrimaryGenerator.cxx index ee7c6a16330f9..e7b70108a5d4b 100644 --- a/Generators/src/PrimaryGenerator.cxx +++ b/Generators/src/PrimaryGenerator.cxx @@ -81,7 +81,7 @@ Bool_t PrimaryGenerator::GenerateEvent(FairGenericStack* pStack) /** generate event **/ /** normal generation if no embedding **/ - if (!mEmbedTree) { + if (!mEmbedTree || mEmbedIndex < 0) { fixInteractionVertex(); // <-- always fixes vertex outside of FairROOT auto ret = FairPrimaryGenerator::GenerateEvent(pStack); if (ret) { @@ -91,17 +91,18 @@ Bool_t PrimaryGenerator::GenerateEvent(FairGenericStack* pStack) } /** this is for embedding **/ - - /** setup interaction vertex **/ - mEmbedTree->GetEntry(mEmbedIndex); - setInteractionVertex(mEmbedEvent); - - /** notify event generators **/ - auto genList = GetListOfGenerators(); - for (int igen = 0; igen < genList->GetEntries(); ++igen) { - auto o2gen = dynamic_cast(genList->At(igen)); - if (o2gen) { - o2gen->notifyEmbedding(mEmbedEvent); + if (mEmbedIndex >= 0) { + /** setup interaction vertex **/ + mEmbedTree->GetEntry(mEmbedIndex); + setInteractionVertex(mEmbedEvent); + + /** notify event generators **/ + auto genList = GetListOfGenerators(); + for (int igen = 0; igen < genList->GetEntries(); ++igen) { + auto o2gen = dynamic_cast(genList->At(igen)); + if (o2gen) { + o2gen->notifyEmbedding(mEmbedEvent); + } } } diff --git a/run/O2PrimaryServerDevice.h b/run/O2PrimaryServerDevice.h index ece3747b2c94a..4eecf79cffdb6 100644 --- a/run/O2PrimaryServerDevice.h +++ b/run/O2PrimaryServerDevice.h @@ -46,6 +46,7 @@ #include #include #include +#include namespace o2 { @@ -135,6 +136,17 @@ class O2PrimaryServerDevice final : public fair::mq::Device auto embedinto_filename = conf.getEmbedIntoFileName(); if (!embedinto_filename.empty()) { + // determine the sim prefix from the embedding filename + // the filename should be an MCHeader file ... so it should match SOME_PATH/prefix_MCHeader.root + std::regex re(R"((.*/)?([^/]+)_MCHeader\.root$)"); + std::smatch match; + + if (std::regex_search(embedinto_filename, match, re)) { + std::cout << "Extracted embedding prefix : " << match[2] << '\n'; + mEmbeddIntoPrefix = match[2]; + } else { + LOG(fatal) << "Embedding asked but no suitable embedding prefix extractable from " << embedinto_filename; + } mPrimGen->embedInto(embedinto_filename); } @@ -197,6 +209,19 @@ class O2PrimaryServerDevice final : public fair::mq::Device auto& vertex = vertices.at(collisionindex); LOG(info) << "Setting vertex " << vertex << " for event " << mEventCounter << " for prefix " << mSimConfig.getOutPrefix() << " from CollContext"; mPrimGen->setExternalVertexForNextEvent(vertex.X(), vertex.Y(), vertex.Z()); + + // set correct embedding index for PrimaryGenerator ... based on collision context for embedding + auto& collisionParts = mCollissionContext->getEventParts()[collisionindex]; + int background_index = -1; // -1 means no embedding taking place for this signal + + // find the part that corresponds to the event embeded into + for (auto& part : collisionParts) { + if (mCollissionContext->getSimPrefixes()[part.sourceID] == mEmbeddIntoPrefix) { + background_index = part.entryID; + LOG(info) << "Setting embedding index to " << background_index; + } + } + mPrimGen->setEmbedIndex(background_index); } } mPrimGen->GenerateEvent(mStack); @@ -696,6 +721,7 @@ class O2PrimaryServerDevice final : public fair::mq::Device // some information specific to use case when we have a collision context o2::steer::DigitizationContext* mCollissionContext = nullptr; //! std::unordered_map mEventID_to_CollID; //! + std::string mEmbeddIntoPrefix; //! sim prefix of background events TRandom3 mSeedGenerator; //! specific random generator for seed generation for work chunks };