Project
Loading...
Searching...
No Matches
Generator.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
13
15#include "Generators/Trigger.h"
20#include "FairPrimaryGenerator.h"
21#include <fairlogger/Logger.h>
22#include <cmath>
23#include "TClonesArray.h"
24#include "TParticle.h"
25
26namespace o2
27{
28namespace eventgen
29{
30
31std::atomic<int> Generator::InstanceCounter{0};
32unsigned int Generator::gTotalNEvents = 0;
33/*****************************************************************/
34/*****************************************************************/
35
36Generator::Generator() : FairGenerator("ALICEo2", "ALICEo2 Generator"),
37 mBoost(0.)
38{
42}
43
44/*****************************************************************/
45
46Generator::Generator(const Char_t* name, const Char_t* title) : FairGenerator(name, title),
47 mBoost(0.)
48{
52}
53
54/*****************************************************************/
55
56Bool_t
58{
62 return kTRUE;
63}
64
65/*****************************************************************/
66
67Bool_t
69{
73 while (true) {
75
77 mParticles.clear();
78
80 mSubGeneratorId = -1;
81
83 if (!generateEvent()) {
84 LOG(error) << "ReadEvent failed in generateEvent";
85 return kFALSE;
86 }
87
89 if (!importParticles()) {
90 LOG(error) << "ReadEvent failed in importParticles";
91 return kFALSE;
92 }
93
94 if (mSubGeneratorsIdToDesc.empty() && mSubGeneratorId > -1) {
95 LOG(fatal) << "ReadEvent failed because no SubGenerator description given";
96 }
97
98 if (!mSubGeneratorsIdToDesc.empty() && mSubGeneratorId < 0) {
99 LOG(fatal) << "ReadEvent failed because SubGenerator description given but sub-generator not set";
100 }
101
103 if (triggerEvent()) {
105 break;
106 } else {
108 }
109 }
110
112 if (!addTracks(primGen)) {
113 LOG(error) << "ReadEvent failed in addTracks";
114 return kFALSE;
115 }
116
118 auto header = primGen->GetEvent();
119 auto o2header = dynamic_cast<o2::dataformats::MCEventHeader*>(header);
120 if (!header) {
121 LOG(fatal) << "MC event header is not a 'o2::dataformats::MCEventHeader' object";
122 return kFALSE;
123 }
124 updateHeader(o2header);
125 updateSubGeneratorInformation(o2header);
126
128 return kTRUE;
129}
130
131/*****************************************************************/
132
133Bool_t
135{
138 auto o2primGen = dynamic_cast<PrimaryGenerator*>(primGen);
139 if (!o2primGen) {
140 LOG(fatal) << "PrimaryGenerator is not a o2::eventgen::PrimaryGenerator";
141 return kFALSE;
142 }
143
145 for (const auto& particle : mParticles) {
146 o2primGen->AddTrack(particle.GetPdgCode(),
147 particle.Px() * mMomentumUnit,
148 particle.Py() * mMomentumUnit,
149 particle.Pz() * mMomentumUnit,
150 particle.Vx() * mPositionUnit,
151 particle.Vy() * mPositionUnit,
152 particle.Vz() * mPositionUnit,
153 particle.GetMother(0),
154 particle.GetMother(1),
155 particle.GetDaughter(0),
156 particle.GetDaughter(1),
157 particle.TestBit(ParticleStatus::kToBeDone),
158 particle.Energy() * mEnergyUnit,
159 particle.T() * mTimeUnit,
160 particle.GetWeight(),
161 (TMCProcess)particle.GetUniqueID(),
162 particle.GetStatusCode()); // generator status information passed as status code field
163 }
164
166 return kTRUE;
167}
168
169/*****************************************************************/
170
171Bool_t
173{
177 return kTRUE;
178}
179
180/*****************************************************************/
181
182Bool_t
184{
188 if (mTriggers.size() == 0 && mDeepTriggers.size() == 0) {
189 return kTRUE;
190 }
191
193 Bool_t triggered;
194 if (mTriggerMode == kTriggerOFF) {
195 return kTRUE;
196 } else if (mTriggerMode == kTriggerOR) {
197 triggered = kFALSE;
198 } else if (mTriggerMode == kTriggerAND) {
199 triggered = kTRUE;
200 } else {
201 return kTRUE;
202 }
203
205 for (const auto& trigger : mTriggers) {
206 auto retval = trigger(mParticles);
207 if (mTriggerMode == kTriggerOR) {
208 triggered |= retval;
209 }
210 if (mTriggerMode == kTriggerAND) {
211 triggered &= retval;
212 }
213 }
214
216 for (const auto& trigger : mDeepTriggers) {
217 auto retval = trigger(mInterface, mInterfaceName);
218 if (mTriggerMode == kTriggerOR) {
219 triggered |= retval;
220 }
221 if (mTriggerMode == kTriggerAND) {
222 triggered &= retval;
223 }
224 }
225
227 return triggered;
228}
229
230/*****************************************************************/
231
232void Generator::addSubGenerator(int subGeneratorId, std::string const& subGeneratorDescription)
233{
234 if (subGeneratorId < 0) {
235 LOG(fatal) << "Sub-generator IDs must be >= 0, instead, passed value is " << subGeneratorId;
236 }
237 mSubGeneratorsIdToDesc.insert({subGeneratorId, subGeneratorDescription});
238}
239
240/*****************************************************************/
241
242void Generator::updateSubGeneratorInformation(o2::dataformats::MCEventHeader* header) const
243{
244 if (mSubGeneratorId < 0) {
245 return;
246 }
247 header->putInfo<int>(o2::mcgenid::GeneratorProperty::SUBGENERATORID, mSubGeneratorId);
248 header->putInfo<std::unordered_map<int, std::string>>(o2::mcgenid::GeneratorProperty::SUBGENERATORDESCRIPTIONMAP, mSubGeneratorsIdToDesc);
249}
250
251/*****************************************************************/
252/*****************************************************************/
253
254} /* namespace eventgen */
255} /* namespace o2 */
256
ClassImp(o2::eventgen::Generator)
@ kToBeDone
void putInfo(std::string const &key, T const &value)
virtual void updateHeader(o2::dataformats::MCEventHeader *eventHeader)
Definition Generator.h:76
std::string mInterfaceName
Definition Generator.h:120
Bool_t ReadEvent(FairPrimaryGenerator *primGen) final
Definition Generator.cxx:68
static std::atomic< int > InstanceCounter
Definition Generator.h:147
std::vector< Trigger > mTriggers
Definition Generator.h:124
std::function< void(std::vector< TParticle > const &p, int eventCount)> mTriggerOkHook
Definition Generator.h:129
virtual Bool_t generateEvent()=0
std::vector< DeepTrigger > mDeepTriggers
Definition Generator.h:125
std::function< void(std::vector< TParticle > const &p, int eventCount)> mTriggerFalseHook
Definition Generator.h:130
void addSubGenerator(int subGeneratorId, std::string const &subGeneratorDescription)
ETriggerMode_t mTriggerMode
Definition Generator.h:123
Bool_t addTracks(FairPrimaryGenerator *primGen)
std::vector< TParticle > mParticles
Definition Generator.h:140
virtual Bool_t importParticles()=0
Bool_t Init() override
Definition Generator.cxx:57
void AddTrack(Int_t pdgid, Double_t px, Double_t py, Double_t pz, Double_t vx, Double_t vy, Double_t vz, Int_t mother1=-1, Int_t mother2=-1, Int_t daughter1=-1, Int_t daughter2=-1, Bool_t wanttracking=true, Double_t e=-9e9, Double_t tof=0., Double_t weight=0., TMCProcess proc=kPPrimary, Int_t generatorStatus=0)
static constexpr Property SUBGENERATORID
static constexpr Property SUBGENERATORDESCRIPTIONMAP
GLuint const GLchar * name
Definition glcorearb.h:781
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"