ATLAS Offline Software
BeamHaloGenerator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
10 #include "AtlasHepMC/GenEvent.h"
11 #include "CLHEP/Random/RandFlat.h"
12 #include "CLHEP/Units/PhysicalConstants.h"
13 #include "TMath.h"
14 #include <cmath>
15 
16 BeamHaloGenerator::BeamHaloGenerator(const HepPDT::ParticleDataTable* particleTable,
17  const std::string& inputFile,
18  const std::vector<std::string>& generatorSettings):
19  m_particleTable(particleTable),
20  m_inputFile(inputFile),
21  m_interfacePlane(0.),
22  m_enableFlip(false),
23  m_flipProbability(0.),
24  m_enableSampling(false),
25  m_bufferFileName("buffer.bin"),
26  m_beamHaloParticleBuffer(0),
27  m_asciiInput(0),
28  m_beamHaloGeneratorSettings(0),
29  m_eventNumber(0),
30  m_debug(false),
31  m_generatorSettings(generatorSettings) {
32  for(int i=0;i<NUM_COUNTERS;i++) {
33  m_counters[i] = 0;
34  m_wsums[i] = 0.;
35  }
36 }
37 
38 //------------------------------------------------------------------
39 
41  if(m_asciiInput) delete m_asciiInput;
44 }
45 
46 //------------------------------------------------------------------
47 
51 
52  return 0;
53 }
54 
55 //------------------------------------------------------------------
56 
58 
59  std::cout << "=================================================================" << std::endl;
60  std::cout << "| | Total Number | Total Weight |" << std::endl;
61  std::cout << "|---------------------------------------------------------------|" << std::endl;
62  std::cout << "| Particles read from input file | ";
63  std::cout << std::setw(12) << m_counters[TOT_READ] << " | ";
64  std::cout << std::setw(12) << std::setprecision(8) << m_wsums[TOT_READ] << " |" << std::endl;
65  std::cout << "| Particles after cuts | ";
66  std::cout << std::setw(12) << m_counters[TOT_AFTER] << " | ";
67  std::cout << std::setw(12) << std::setprecision(8) << m_wsums[TOT_AFTER] << " |" << std::endl;
68  std::cout << "| Particles generated | ";
69  std::cout << std::setw(12) << m_counters[TOT_GEN] << " | ";
70  std::cout << std::setw(12) << std::setprecision(8) << m_wsums[TOT_GEN] << " |" << std::endl;
71  std::cout << "=================================================================" << std::endl;
72 
73  std::cout << std::setprecision(6);
74 
75  return 0;
76 }
77 
78 //------------------------------------------------------------------
79 
80 bool BeamHaloGenerator::flipEvent(CLHEP::HepRandomEngine* engine) {
81  if(!m_enableFlip) return false;
82 
83  // Check to see if the event should be flipped or not
84  if(CLHEP::RandFlat::shoot(engine) <= m_flipProbability) {
85  if(m_debug) std::cout << "Debug: Flipping event" << std::endl;
86  return true;
87  }
88 
89  return false;
90 }
91 
92 //------------------------------------------------------------------
93 
94 int BeamHaloGenerator::convertEvent(std::vector<BeamHaloParticle>* beamHaloEvent,
95  HepMC::GenEvent* evt,
96  CLHEP::HepRandomEngine* engine) {
97  double pz;
98  bool flipFlag = flipEvent(engine);
99  HepMC::GenParticlePtr genParticle;
100  HepMC::GenVertexPtr genVertex;
101  const double c = 2.99792458E+11; // speed of light in mm/s
102 
103  std::vector<BeamHaloParticle>::iterator itr = beamHaloEvent->begin();
104  std::vector<BeamHaloParticle>::iterator itr_end = beamHaloEvent->end();
105 
106  if(itr != itr_end) {
107  // Take the primary information from the first particle in the event. If the event is more than one
108  // particle, the particles come from the same primary proton.
109  evt->weights().push_back((*itr).weight()); // event weight
110  HepMC::FourVector primaryPosition = (*itr).positionAtPrimary();
111  evt->weights().push_back(primaryPosition.x()); // Starting position of primary particle: x position (cm)
112  evt->weights().push_back(primaryPosition.y()); // Starting position of primary particle: y position (cm)
113  evt->weights().push_back(primaryPosition.z()); // Starting position of primary particle: z position (cm)
114  evt->weights().push_back(primaryPosition.t()); // Starting position of primary particle: t (s)
115  }
116 
117  // Append each particle to the GenEvent
118  for(;itr!=itr_end;++itr) {
119  HepMC::FourVector position = (*itr).positionAtScoringPlane();
120  HepMC::FourVector fourVector = (*itr).fourVector();
121 
122  if(!flipFlag) {
123  genParticle = HepMC::newGenParticlePtr(fourVector,
124  (*itr).pdgId(),
125  1);
126 
127  genVertex = HepMC::newGenVertexPtr(HepMC::FourVector(position.x(),
128  position.y(),
129  (position.z() + m_interfacePlane),
130  c*position.t() -1.0*std::fabs(m_interfacePlane)),
131  1);
132  }
133  else {
134  pz = fourVector.pz();
135  fourVector.setPz(-pz);
136 
137  genParticle = HepMC::newGenParticlePtr(fourVector,
138  (*itr).pdgId(),
139  1);
140 
141  genVertex = HepMC::newGenVertexPtr(HepMC::FourVector(position.x(),
142  position.y(),
143  -1.0*(position.z() + m_interfacePlane),
144  c*position.t() -1.0*std::fabs(m_interfacePlane)),
145  1);
146  }
147 
148  genVertex->add_particle_out(genParticle);
149  evt->add_vertex(genVertex);
150  }
151 
152  return 0;
153 }
154 
155 //------------------------------------------------------------------
HepMC::GenVertexPtr
HepMC::GenVertex * GenVertexPtr
Definition: GenVertex.h:59
xAOD::iterator
JetConstituentVector::iterator iterator
Definition: JetConstituentVector.cxx:68
BeamHaloGenerator::m_enableFlip
bool m_enableFlip
Flag for flipping event.
Definition: BeamHaloGenerator.h:114
AsciiInput.h
BeamHaloGeneratorSettings
A class to read a vector of strings defining particle filtering settings and provide a method for fil...
Definition: BeamHaloGeneratorSettings.h:25
GenEvent.h
BeamHaloGenerator::m_wsums
double m_wsums[NUM_COUNTERS]
Sum of weights of particles or events of dimension enumCounters.
Definition: BeamHaloGenerator.h:151
BeamHaloGenerator::m_interfacePlane
double m_interfacePlane
The position of the interface plane in mm.
Definition: BeamHaloGenerator.h:111
BeamHaloGenerator.h
HepMC::GenParticlePtr
GenParticle * GenParticlePtr
Definition: GenParticle.h:37
BeamHaloParticleBuffer.h
BeamHaloGenerator::m_counters
long m_counters[NUM_COUNTERS]
Particle or event counters of dimension enumCounters.
Definition: BeamHaloGenerator.h:148
BeamHaloGenerator::TOT_AFTER
@ TOT_AFTER
Definition: BeamHaloGenerator.h:143
LArG4FSStartPointFilter.evt
evt
Definition: LArG4FSStartPointFilter.py:42
BeamHaloGenerator::BeamHaloGenerator
BeamHaloGenerator(const HepPDT::ParticleDataTable *particleTable, const std::string &inputFile, const std::vector< std::string > &generatorSettings)
Definition: BeamHaloGenerator.cxx:16
BeamHaloGenerator::TOT_GEN
@ TOT_GEN
Definition: BeamHaloGenerator.h:144
BeamHaloGenerator::m_asciiInput
AsciiInput * m_asciiInput
A pointer to an AsciiInput object, used to read data from the Ascii input file.
Definition: BeamHaloGenerator.h:131
BeamHaloGenerator::~BeamHaloGenerator
virtual ~BeamHaloGenerator()
Definition: BeamHaloGenerator.cxx:40
jobOptions_CavernBackground.generatorSettings
generatorSettings
Definition: jobOptions_CavernBackground.py:35
BeamHaloGeneratorAlg.h
BeamHaloGeneratorSettings.h
BeamHaloGenerator::genFinalize
virtual int genFinalize()
A function to finalise the generator.
Definition: BeamHaloGenerator.cxx:57
CaloCondBlobAlgs_fillNoiseFromASCII.inputFile
string inputFile
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:17
HepMC::newGenVertexPtr
GenVertexPtr newGenVertexPtr(const HepMC::FourVector &pos=HepMC::FourVector(0.0, 0.0, 0.0, 0.0), const int i=0)
Definition: GenVertex.h:64
lumiFormat.i
int i
Definition: lumiFormat.py:92
BeamHaloGenerator::m_debug
bool m_debug
A flat to turn on or off debug print out.
Definition: BeamHaloGenerator.h:154
BeamHaloGenerator::m_generatorSettings
std::vector< std::string > m_generatorSettings
A vector of generator settings in string command form.
Definition: BeamHaloGenerator.h:159
BeamHaloGenerator::m_beamHaloGeneratorSettings
BeamHaloGeneratorSettings * m_beamHaloGeneratorSettings
A pointer to a BeamHaloGeneratorSettings object used to filter particles.
Definition: BeamHaloGenerator.h:135
Amg::pz
@ pz
Definition: GeoPrimitives.h:40
BeamHaloGenerator::m_flipProbability
float m_flipProbability
Flip probability.
Definition: BeamHaloGenerator.h:117
AsciiInput
A class to provide read access to an ASCII input file.
Definition: AsciiInput.h:18
BeamHaloGenerator::NUM_COUNTERS
@ NUM_COUNTERS
Definition: BeamHaloGenerator.h:145
HepMC::newGenParticlePtr
GenParticlePtr newGenParticlePtr(const HepMC::FourVector &mom=HepMC::FourVector(0.0, 0.0, 0.0, 0.0), int pid=0, int status=0)
Definition: GenParticle.h:39
BeamHaloGenerator::genInitialize
virtual int genInitialize()
A function to initialise the generator.
Definition: BeamHaloGenerator.cxx:48
BeamHaloGenerator::m_inputFile
std::string m_inputFile
Input file name.
Definition: BeamHaloGenerator.h:108
BeamHaloGenerator::convertEvent
int convertEvent(std::vector< BeamHaloParticle > *beamHaloEvent, HepMC::GenEvent *evt, CLHEP::HepRandomEngine *engine)
A member function to convert a vector of beam halo particles into a GenEvent.
Definition: BeamHaloGenerator.cxx:94
BeamHaloGenerator::m_beamHaloParticleBuffer
BeamHaloParticleBuffer * m_beamHaloParticleBuffer
Binary particle buffer for caching converted events.
Definition: BeamHaloGenerator.h:127
python.compressB64.c
def c
Definition: compressB64.py:93
BeamHaloGenerator::flipEvent
bool flipEvent(CLHEP::HepRandomEngine *engine)
A member function to check if the event should be flipped.
Definition: BeamHaloGenerator.cxx:80
BeamHaloGenerator::TOT_READ
@ TOT_READ
Definition: BeamHaloGenerator.h:142