Skip to content

Commit f494e43

Browse files
committed
Generators: Embedd into correct event when using collision-context
This fixes a problem with embedding and when option `--embedIntoFile` is used. Here, we had an index problem in the primary generator class, which was not taking into account the actual event index according the collision context. This could lead to wrong vertices or using wrong MCHeader information for the embedding decision.
1 parent 527dbd4 commit f494e43

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

Generators/include/Generators/PrimaryGenerator.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,9 @@ class PrimaryGenerator : public FairPrimaryGenerator
8080
/** Public embedding methods **/
8181
Bool_t embedInto(TString fname);
8282

83+
/// sets the embedding index
84+
void setEmbedIndex(int idx) { mEmbedIndex = idx; }
85+
8386
void setExternalVertexForNextEvent(double x, double y, double z);
8487

8588
// sets the vertex mode; if mode is kCCDB, a valid MeanVertexObject pointer must be given at the same time

Generators/src/PrimaryGenerator.cxx

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ Bool_t PrimaryGenerator::GenerateEvent(FairGenericStack* pStack)
8181
/** generate event **/
8282

8383
/** normal generation if no embedding **/
84-
if (!mEmbedTree) {
84+
if (!mEmbedTree || mEmbedIndex < 0) {
8585
fixInteractionVertex(); // <-- always fixes vertex outside of FairROOT
8686
auto ret = FairPrimaryGenerator::GenerateEvent(pStack);
8787
if (ret) {
@@ -91,17 +91,18 @@ Bool_t PrimaryGenerator::GenerateEvent(FairGenericStack* pStack)
9191
}
9292

9393
/** this is for embedding **/
94-
95-
/** setup interaction vertex **/
96-
mEmbedTree->GetEntry(mEmbedIndex);
97-
setInteractionVertex(mEmbedEvent);
98-
99-
/** notify event generators **/
100-
auto genList = GetListOfGenerators();
101-
for (int igen = 0; igen < genList->GetEntries(); ++igen) {
102-
auto o2gen = dynamic_cast<Generator*>(genList->At(igen));
103-
if (o2gen) {
104-
o2gen->notifyEmbedding(mEmbedEvent);
94+
if (mEmbedIndex >= 0) {
95+
/** setup interaction vertex **/
96+
mEmbedTree->GetEntry(mEmbedIndex);
97+
setInteractionVertex(mEmbedEvent);
98+
99+
/** notify event generators **/
100+
auto genList = GetListOfGenerators();
101+
for (int igen = 0; igen < genList->GetEntries(); ++igen) {
102+
auto o2gen = dynamic_cast<Generator*>(genList->At(igen));
103+
if (o2gen) {
104+
o2gen->notifyEmbedding(mEmbedEvent);
105+
}
105106
}
106107
}
107108

run/O2PrimaryServerDevice.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
#include <chrono>
4747
#include <CCDB/BasicCCDBManager.h>
4848
#include <TRandom3.h>
49+
#include <regex>
4950

5051
namespace o2
5152
{
@@ -135,6 +136,17 @@ class O2PrimaryServerDevice final : public fair::mq::Device
135136

136137
auto embedinto_filename = conf.getEmbedIntoFileName();
137138
if (!embedinto_filename.empty()) {
139+
// determine the sim prefix from the embedding filename
140+
// the filename should be an MCHeader file ... so it should match SOME_PATH/prefix_MCHeader.root
141+
std::regex re(R"((.*/)?([^/]+)_MCHeader\.root$)");
142+
std::smatch match;
143+
144+
if (std::regex_search(embedinto_filename, match, re)) {
145+
std::cout << "Extracted embedding prefix : " << match[2] << '\n';
146+
mEmbeddIntoPrefix = match[2];
147+
} else {
148+
LOG(fatal) << "Embedding asked but no suitable embedding prefix extractable from " << embedinto_filename;
149+
}
138150
mPrimGen->embedInto(embedinto_filename);
139151
}
140152

@@ -197,6 +209,19 @@ class O2PrimaryServerDevice final : public fair::mq::Device
197209
auto& vertex = vertices.at(collisionindex);
198210
LOG(info) << "Setting vertex " << vertex << " for event " << mEventCounter << " for prefix " << mSimConfig.getOutPrefix() << " from CollContext";
199211
mPrimGen->setExternalVertexForNextEvent(vertex.X(), vertex.Y(), vertex.Z());
212+
213+
// set correct embedding index for PrimaryGenerator ... based on collision context for embedding
214+
auto& collisionParts = mCollissionContext->getEventParts()[collisionindex];
215+
int background_index = -1; // -1 means no embedding taking place for this signal
216+
217+
// find the part that corresponds to the event embeded into
218+
for (auto& part : collisionParts) {
219+
if (mCollissionContext->getSimPrefixes()[part.sourceID] == mEmbeddIntoPrefix) {
220+
background_index = part.entryID;
221+
LOG(info) << "Setting embedding index to " << background_index;
222+
}
223+
}
224+
mPrimGen->setEmbedIndex(background_index);
200225
}
201226
}
202227
mPrimGen->GenerateEvent(mStack);
@@ -696,6 +721,7 @@ class O2PrimaryServerDevice final : public fair::mq::Device
696721
// some information specific to use case when we have a collision context
697722
o2::steer::DigitizationContext* mCollissionContext = nullptr; //!
698723
std::unordered_map<int, int> mEventID_to_CollID; //!
724+
std::string mEmbeddIntoPrefix; //! sim prefix of background events
699725

700726
TRandom3 mSeedGenerator; //! specific random generator for seed generation for work chunks
701727
};

0 commit comments

Comments
 (0)