Project
Loading...
Searching...
No Matches
GeneratorPythia8.h
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
14#ifndef ALICEO2_EVENTGEN_GENERATORPYTHIA8_H_
15#define ALICEO2_EVENTGEN_GENERATORPYTHIA8_H_
16
18#include "Pythia8/Pythia.h"
19#include <functional>
21
22namespace o2
23{
24namespace eventgen
25{
26
27/*****************************************************************/
28/*****************************************************************/
87{
88
89 public:
95 GeneratorPythia8(const Char_t* name, const Char_t* title = "ALICEo2 Pythia8 Generator");
97 ~GeneratorPythia8() override = default;
98
102 Bool_t Init() override;
104 Bool_t generateEvent() override;
106 Bool_t importParticles() override { return importParticles(mPythia.event); };
112 void setConfig(std::string val) { mConfig = val; };
116 void setHooksFileName(std::string val) { mHooksFileName = val; };
119 void setHooksFuncName(std::string val) { mHooksFuncName = val; };
122 void setUserHooks(Pythia8::UserHooks* hooks);
128 bool readString(std::string val) { return mPythia.readString(val, true); };
130 bool readFile(std::string val) { return mPythia.readFile(val, true); };
137 void getNcoll(int& nColl)
138 {
139 getNcoll(mPythia.info, nColl);
140 };
143 void getNpart(int& nPart)
144 {
145 getNpart(mPythia.info, nPart);
146 };
150 void getNpart(int& nProtonProj, int& nNeutronProj, int& nProtonTarg, int& nNeutronTarg)
151 {
152 getNpart(mPythia.info, nProtonProj, nNeutronProj, nProtonTarg, nNeutronTarg);
153 };
155 void getNremn(int& nProtonProj, int& nNeutronProj, int& nProtonTarg, int& nNeutronTarg)
156 {
157 getNremn(mPythia.event, nProtonProj, nNeutronProj, nProtonTarg, nNeutronTarg);
158 };
162 void getNfreeSpec(int& nFreenProj, int& nFreepProj, int& nFreenTarg, int& nFreepTarg)
163 {
164 getNfreeSpec(mPythia.info, nFreenProj, nFreepProj, nFreenTarg, nFreepTarg);
165 };
166
167 typedef std::function<bool(const Pythia8::Particle&)> UserFilterFcn;
168
173 bool setInitialSeed(long seed);
174
175 protected:
180
187 typedef std::vector<int> (*GetRelatives)(const Pythia8::Particle&);
189 typedef void (*SetRelatives)(Pythia8::Particle&, int, int);
191 typedef std::pair<int, int> (*FirstLastRelative)(const Pythia8::Particle&);
201 void updateHeader(o2::dataformats::MCEventHeader* eventHeader) override;
207 Bool_t importParticles(Pythia8::Event& event);
213 void pruneEvent(Pythia8::Event& event, Select select);
227 void investigateRelatives(Pythia8::Event& event, // Event
228 const std::vector<int>& old2New, // Map from old to new idx
229 size_t index, // Current particle
230 std::vector<bool>& done, // cache flag
231 GetRelatives getter, // get relatives
232 SetRelatives setter, // set relatives
233 FirstLastRelative firstLast, // get first and last relative
234 const std::string& what, // what are we looking for
235 const std::string& ind = ""); // logging indent
244 void selectFromAncestor(int ancestor, Pythia8::Event& inputEvent, Pythia8::Event& outputEvent);
247 void getNcoll(const Pythia8::Info& info, int& nColl);
250 void getNpart(const Pythia8::Info& info, int& nPart);
254 void getNpart(const Pythia8::Info& info, int& nProtonProj, int& nNeutronProj, int& nProtonTarg, int& nNeutronTarg);
256 void getNremn(const Pythia8::Event& event, int& nProtonProj, int& nNeutronProj, int& nProtonTarg, int& nNeutronTarg);
260 void getNfreeSpec(const Pythia8::Info& info, int& nFreenProj, int& nFreepProj, int& nFreenTarg, int& nFreepTarg);
264 void seedGenerator();
265
266 // Hyperloop flag
268
270 // Show banner only when not running in Hyperloop
271 Pythia8::Pythia mPythia{/*Default*/ "../share/Pythia8/xmldoc", /*banner*/ !mIsHyperloop};
272
276 std::string mConfig;
278 std::string mHooksFileName;
281 std::string mHooksFuncName;
284 UserFilterFcn mUserFilterFcn = [](Pythia8::Particle const&) -> bool { return true; };
286
287 bool mApplyPruning = false;
288 bool mIsInitialized = false; // if Init function has been called
289 long mInitialRNGSeed = -1; // initial seed for Pythia random number state;
290 // will be transported to Pythia in the Init function through the Pythia::readString("Random:seed") mechanism.
291 // Value of -1 means unitialized; 0 will be time-dependent and values >1 <= MAX_SEED concrete reproducible seeding
292 Pythia8GenConfig mGenConfig; // configuration object
293
294 static std::atomic<int> Pythia8InstanceCounter;
296
297 constexpr static long MAX_SEED = 900000000;
298
300
301};
303/*****************************************************************/
304/*****************************************************************/
305
306} // namespace eventgen
307} // namespace o2
308
309#endif /* ALICEO2_EVENTGEN_GENERATORPYTHIA8_H_ */
310//
311// EOF
312//
bool done
configStandalone Reconstruction rec_tpc multiplier for the combined cluster track error during track following area in cm for the search of for z only used if decrease removal by when above this local occupancy rowx Shift of TPC revert cluster flag edge bit distance to edge exceeds this ZOffset for secondary multiple of radius max P of electron K BB bands crossing max P of electron p BB bands crossing max P of electron d BB bands crossing max P of electron t BB bands crossing min accepted dEdxMaxTPC of the track Additive extra cluster error for Y2 if edge flag set Additive extra cluster error for Y2 if single set Additive extra cluster error for Y2 if or single set Additive extra cluster error for Z2 if or single set Extra errors to add to track when crossing depending on addErrorsCECrossing Inner portion of y range in sector that is not used in searching for extrapolated track candidates factor2YS for track merging factor2K for track merging Margin in cm of Y position when rejecting edge clusters based on uncorrected track Y Max fraction of shared clusters for tracklet Except pad from cluster finding if total number of charges in a fragment is above this Except pad from cluster finding if number of consecutive charges in a fragment is above this Threshold where a timebin is considered disabling the noisy pad check for that pad Treat signal above this minimum as saturated Smoothing factor for the exponential Highly Ionising Particle tail filter Number of timebins to use for the averaging Add additional custom track errors when crossing relative as fraction of Do N fit passes in final fit of< 0:reject at max -n hits") AddOptionRTC(rejectIFCLowRadiusCluster, uint8_t, 1, "", 0, "Reject clusters that get the IFC mask error during refit") AddOptionRTC(dEdxTruncLow, uint8_t, 2, "", 0, "Low truncation threshold, fraction of 128") AddOptionRTC(dEdxTruncHigh, uint8_t, 77, "", 0, "High truncation threshold, fraction of 128") AddOptionRTC(extrapolationTracking, int8_t, 1, "", 0, "Enable Extrapolation Tracking(prolong tracks to adjacent sectors to find short segments)") AddOptionRTC(disableRefitAttachment, uint8_t, 0, "", 0, "Bitmask to disable certain attachment steps during refit(1:attachment, 2:propagation, 4:loop following, 8:mirroring)") AddOptionRTC(rejectionStrategy, uint8_t, o2::gpu::GPUSettings::RejectionStrategyA, "", 0, "Enable rejection of TPC clusters for compression(0=no, 1=strategy A, 2=strategy B)") AddOptionRTC(mergeLoopersAfterburner, uint8_t, 1, "", 0, "Run afterburner for additional looper merging") AddOptionRTC(compressionTypeMask, uint8_t, o2::gpu::GPUSettings::CompressionFull, "", 0, "TPC Compression mode bits(1=truncate charge/width LSB, 2=differences, 4=track-model)") AddOptionRTC(compressionSortOrder, uint8_t, o2::gpu::GPUSettings::SortTime, "", 0, "Sort order of TPC compression(0=time, 1=pad, 2=Z-time-pad, 3=Z-pad-time, 4=no sorting(use incoming order))") AddOptionRTC(sigBitsCharge, uint8_t, 4, "", 0, "Number of significant bits for TPC cluster charge in compression mode 1") AddOptionRTC(sigBitsWidth, uint8_t, 3, "", 0, "Number of significant bits for TPC cluster width in compression mode 1") AddOptionRTC(dropLoopers, uint8_t, 0, "", 0, "Drop looping tracks starting from second loop") AddOptionRTC(mergerInterpolateErrors, uint8_t, 1, "", 0, "Use interpolation instead of extrapolation for chi2 based cluster rejection") AddOptionRTC(mergerInterpolateRejectAlsoOnCurrentPosition, uint8_t, 1, "", 0, "When using mergerInterpolateErrors, reject based on chi2 twice computed with interpolated and current track position starting from NDF > mergerNonInterpolateRejectMinNDF Merge tracks accross the central electrode Enable PID response Add sub threshold clusters in TPC dEdx computation OR mask of TPC flags that will reject the cluster in alternative dEdx Reject edge clusters based on uncorrected track Y during track fit Increase decrease removal by when on this number of pads from the edge h configStandalone Reconstruction rec_trd Max chi2 for TRD tracklets to be matched to a track Chi2 cut for strict matching mode Number of sigmas for ITS TPC track time error estimate Addition to search road around track prolongation along Y in cm Optimal tracklet rphi resolution in maximum chi2 per attached tracklet for TRD tracks take into account the full likelihood of the slope including exponential tails Tracks with less attached tracklets are discarded after the tracking Post trigger Pile up integration time in BCs fits all iterations but the last one in projections Use material lookup table for TPC refit Apply workarounds to avoid cyclic merge should not be needed tpc dyn configStandalone Processing proc_rtc bool
~GeneratorPythia8() override=default
GeneratorPythia8 & operator=(const GeneratorPythia8 &)
void(* SetRelatives)(Pythia8::Particle &, int, int)
std::pair< int, int >(* FirstLastRelative)(const Pythia8::Particle &)
std::vector< int >(* GetRelatives)(const Pythia8::Particle &)
GeneratorPythia8(const GeneratorPythia8 &)
void setHooksFuncName(std::string val)
void selectFromAncestor(int ancestor, Pythia8::Event &inputEvent, Pythia8::Event &outputEvent)
void pruneEvent(Pythia8::Event &event, Select select)
bool readString(std::string val)
static std::atomic< int > Pythia8InstanceCounter
void setHooksFileName(std::string val)
void investigateRelatives(Pythia8::Event &event, const std::vector< int > &old2New, size_t index, std::vector< bool > &done, GetRelatives getter, SetRelatives setter, FirstLastRelative firstLast, const std::string &what, const std::string &ind="")
ClassDefOverride(GeneratorPythia8, 1)
void getNremn(int &nProtonProj, int &nNeutronProj, int &nProtonTarg, int &nNeutronTarg)
void seedGenerator()
performs seeding of the random state of Pythia (called from Init)
void getNpart(int &nProtonProj, int &nNeutronProj, int &nProtonTarg, int &nNeutronTarg)
std::function< bool(const Pythia8::Particle &)> UserFilterFcn
void setUserHooks(Pythia8::UserHooks *hooks)
void updateHeader(o2::dataformats::MCEventHeader *eventHeader) override
void getNfreeSpec(int &nFreenProj, int &nFreepProj, int &nFreenTarg, int &nFreepTarg)
void setConfig(std::string val)
static bool isHyperloop()
Definition Generator.cxx:49
struct _cl_event * event
Definition glcorearb.h:2982
GLuint const GLchar * name
Definition glcorearb.h:781
typedef void(APIENTRYP PFNGLCULLFACEPROC)(GLenum mode)
GLuint GLfloat * val
Definition glcorearb.h:1582
std::vector< InputSpec > select(char const *matcher="")
a couple of static helper functions to create timestamp values for CCDB queries or override obsolete ...