File indexing completed on 2024-09-27 07:03:39
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033 #ifdef HEPMC3_ON
0034 #include "hepmc3writer.h"
0035 #endif
0036
0037 #include <iostream>
0038 #include <exception>
0039 #include <cstdlib>
0040
0041 #include "eventfilewriter.h"
0042 #include "starlightparticlecodes.h"
0043
0044 using namespace std;
0045
0046
0047 eventFileWriter::eventFileWriter()
0048 : fileWriter()
0049 ,_writeFullPythia(false)
0050 ,_writeFullHepMC3(false)
0051 { }
0052
0053
0054 eventFileWriter::eventFileWriter(std::string filename)
0055 : fileWriter(filename)
0056 { }
0057
0058
0059 int eventFileWriter::writeInit(inputParameters &_p)
0060 {
0061 _fileStream<<"CONFIG_OPT: "<<_p.productionMode()<<" "<<_p.prodParticleId()<<" "<<_p.nmbEvents()
0062 <<" "<<_p.quantumGlauber()<<" "<<_p.impulseVM()<<" "<<_p.randomSeed()<<std::endl;
0063 _fileStream<<"ELECTRON_BEAM: "<<" "<<_p.electronBeamLorentzGamma()<<std::endl;
0064 _fileStream<<"TARGET_BEAM: "<<_p.targetBeamZ()<<" "<<_p.targetBeamA()<<" "<<_p.targetBeamLorentzGamma()<<std::endl;
0065 _fileStream<<"PHOTON: "<<_p.nmbEnergyBins()<<" "<<_p.fixedQ2Range()<<" "<<_p.nmbGammaQ2Bins()
0066 <<" "<<_p.minGammaQ2()<<" "<<_p.maxGammaQ2()<<std::endl;
0067
0068 if ( _writeFullHepMC3 )
0069 {
0070 #ifdef HEPMC3_ON
0071 _hepmc3writer = new hepMC3Writer();
0072 _hepmc3writer->initWriter(_p);
0073 #else
0074 std::cout << "***HepMC3 file format not written --- eStarlight not compiled with HepMC3 Enabled***" << std::endl;
0075 _writeFullHepMC3 = false;
0076 #endif
0077 }
0078
0079 return 0;
0080 }
0081
0082
0083 int eventFileWriter::writeInitLUND(inputParameters &_p)
0084 {
0085 _fileStream<<"PYTHIA EVENT FILE"<<std::endl;
0086 _fileStream<<"============================================"<<std::endl;
0087 _fileStream<<"I, ievent, genevent, subprocess, nucleon, targetparton, xtargparton, beamparton, xbeamparton, thetabeamprtn, truey, trueQ2, truex, trueW2, trueNu, leptonphi, s_hat, t_hat, u_hat, pt2_hat, Q2_hat, F2, F1, R, sigma_rad, SigRadCor, EBrems, photonflux, t-diff, nrTracks"<<std::endl;
0088 _fileStream<<"============================================"<<std::endl;
0089 _fileStream<<"I K(I,1) K(I,2) K(I,3) K(I,4) K(I,5) P(I,1) P(I,2) P(I,3) P(I,4) P(I,5) V(I,1) V(I,2) V(I,3)"<<std::endl;
0090 _fileStream<<"============================================"<<std::endl;
0091
0092
0093 double p_mass = 0.93827;
0094 double e_mass = 0.000511;
0095
0096
0097 double _electronBeam_E = e_mass*_p.electronBeamLorentzGamma();
0098 double _targetBeam_E = p_mass*_p.targetBeamLorentzGamma();
0099 double _electronBeam_pz = -1.0*sqrt(_electronBeam_E*_electronBeam_E - e_mass*e_mass);
0100 double _targetBeam_pz = sqrt(_targetBeam_E*_targetBeam_E - p_mass*p_mass);
0101
0102
0103 _electronBeam_four_vector_={0,0,_electronBeam_pz,_electronBeam_E};
0104 _targetBeam_four_vector_ ={0,0,_targetBeam_pz,_targetBeam_E};
0105 _electronBeam_pdg_id_ = 11;
0106 int nuclear_pid = _p.targetBeamA()*10 + _p.targetBeamZ()*10000 + 1000000000;
0107 _targetBeam_pdg_id_ = ( _p.targetBeamA() > 1 ) ? nuclear_pid : 2212;
0108
0109 return 0;
0110 }
0111
0112
0113 int eventFileWriter::writeEvent(eXEvent &event, int eventnumber)
0114 {
0115
0116 int numberoftracks = 0;
0117 if(_writeFullPythia)
0118 {
0119 numberoftracks = event.getParticles()->size();
0120 }
0121 else
0122 {
0123 for(unsigned int i = 0; i<event.getParticles()->size(); ++i)
0124 {
0125 if(event.getParticles()->at(i).getStatus() >= 0) numberoftracks++;
0126 }
0127 }
0128
0129
0130
0131 if(numberoftracks){
0132 eventnumber++;
0133
0134 _fileStream << "EVENT: " << eventnumber << " " << numberoftracks << " " << 1 << std::endl;
0135
0136 _fileStream <<"VERTEX: "<<0.<<" "<<0.<<" "<<0.<<" "<<0.<<" "<<1<<" "<<0<<" "<<0<<" "<<numberoftracks<<std::endl;
0137
0138 for( uint igam = 0 ; igam < event.getGammaEnergies()->size(); ++igam){
0139 _fileStream <<"GAMMA: "<<event.getGammaEnergies()->at(igam)<<" "<<event.getGammaMasses()->at(igam)<<std::endl;
0140 lorentzVector gam = event.getGamma()->at(igam);
0141
0142
0143 }
0144 for( uint itarget = 0 ; itarget < event.getTarget()->size(); ++itarget){
0145 lorentzVector target = event.getTarget()->at(itarget);
0146 _fileStream <<"t: "<<event.getVertext()->at(itarget)<<std::endl;
0147 _fileStream <<"TARGET: "<<target.GetPx()<<" "<<target.GetPy()<<" "<<target.GetPz()<<" "<<target.GetE()<<std::endl;
0148 }
0149 for( uint iel = 0 ; iel < event.getSources()->size(); ++iel){
0150 lorentzVector el = event.getSources()->at(iel);
0151 _fileStream <<"SOURCE: "<<el.GetPx()<<" "<<el.GetPy()<<" "<<el.GetPz()<<" "<<el.GetE()<<std::endl;
0152 }
0153
0154 int ipart = 0;
0155 std::vector<starlightParticle>::const_iterator part = (event.getParticles())->begin();
0156
0157 for (part = event.getParticles()->begin(); part != event.getParticles()->end(); part++, ipart++)
0158 {
0159 if(!_writeFullPythia)
0160 {
0161 if((*part).getStatus() < 0) continue;
0162 }
0163 _fileStream << "TRACK: " << " "<< starlightParticleCodes::jetsetToGeant((*part).getPdgCode()) <<" "<< (*part).GetPx() << " " << (*part).GetPy()
0164 << " "<< (*part).GetPz() << " " << eventnumber << " " << ipart << " " << 0 << " "
0165 << (*part).getPdgCode();
0166
0167 if(_writeFullPythia)
0168 {
0169 lorentzVector vtx = (*part).getVertex();
0170 _fileStream << " " << vtx.GetPx() << " " << vtx.GetPy() << " " << vtx.GetPz() << " " << vtx.GetE();
0171 _fileStream << " " << (*part).getFirstParent() << " " << (*part).getLastParent() << " " << (*part).getFirstDaughter() << " " << (*part).getLastDaughter() << " " << (*part).getStatus();
0172 }
0173
0174 _fileStream <<std::endl;
0175 }
0176 }
0177
0178 #ifdef HEPMC3_ON
0179 if ( _writeFullHepMC3 ){
0180 _hepmc3writer->writeEvent(event,eventnumber);
0181 }
0182 #endif
0183
0184 return 0;
0185 }
0186
0187
0188
0189 int eventFileWriter::writeEventLUND(eXEvent &event, int eventnumber)
0190 {
0191 _fileStream << "0 "<<eventnumber<<" 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0"<<std::endl;
0192 _fileStream<<"============================================"<<std::endl;
0193
0194 int particleIndex=1;
0195 uint lineNumberOfFirstElectronDaughter=3;
0196 uint lineNumberOfLastElectronDaughter=4;
0197 uint lineNumberOfFirstIonDaughter=6;
0198 uint lineNumberOfLastIonDaughter=lineNumberOfFirstIonDaughter+event.getParticles()->size();
0199 uint numberOfElectrons = event.getSources()->size();
0200 uint numberOfIons = event.getTarget()->size();
0201 uint numberOfGammas = event.getGammaEnergies()->size();
0202
0203 auto sp0 = std::setw(8);
0204 auto sp1 = std::setw(14);
0205
0206 double electronmass = sqrt(_electronBeam_four_vector_[3]*_electronBeam_four_vector_[3] - _electronBeam_four_vector_[2]*_electronBeam_four_vector_[2] - _electronBeam_four_vector_[1]*_electronBeam_four_vector_[1] - _electronBeam_four_vector_[0]*_electronBeam_four_vector_[0]);
0207 _fileStream <<particleIndex << sp0 <<21 << sp0 <<_electronBeam_pdg_id_<<" "<<0<<" "<<lineNumberOfFirstElectronDaughter<<" "<<lineNumberOfLastElectronDaughter<<" " << std::setprecision(6) << sp1 <<_electronBeam_four_vector_[0]<<" " << sp1 <<_electronBeam_four_vector_[1]<<" " << sp1 <<_electronBeam_four_vector_[2]<<" " <<sp1<<_electronBeam_four_vector_[3]<<" "<<sp1<<electronmass<<" 0 0 0"<<std::endl;
0208 particleIndex++;
0209
0210 double ionmass = sqrt(_targetBeam_four_vector_[3]*_targetBeam_four_vector_[3] - _targetBeam_four_vector_[2]*_targetBeam_four_vector_[2] - _targetBeam_four_vector_[1]*_targetBeam_four_vector_[1] - _targetBeam_four_vector_[0]*_targetBeam_four_vector_[0]);
0211 _fileStream <<particleIndex <<sp0<<21 << sp0 <<_targetBeam_pdg_id_<<" "<<0<<" "<<lineNumberOfFirstIonDaughter<<" "<<lineNumberOfLastIonDaughter<<" " << sp1 <<_targetBeam_four_vector_[0]<<" " <<sp1<<_targetBeam_four_vector_[1]<<" " <<sp1<<_targetBeam_four_vector_[2]<<" " <<sp1<<_targetBeam_four_vector_[3]<<" "<<sp1<<ionmass<<" 0 0 0"<<std::endl;
0212 particleIndex++;
0213
0214
0215 for( uint iel = 0 ; iel < numberOfElectrons; ++iel){
0216 lorentzVector el = event.getSources()->at(iel);
0217 _fileStream <<particleIndex<<sp0<<21 <<sp0<<11<<" "<<1<<" "<<0<<" "<<0<<" " <<sp1<<el.GetPx()<<" " <<sp1<<el.GetPy()<<" " <<sp1<<el.GetPz()<<" " <<sp1<<el.GetE()<<" "<<sp1<<electronmass<<" 0 0 0"<<std::endl;
0218 particleIndex++;
0219 }
0220
0221 for( uint igam = 0 ; igam < numberOfGammas; ++igam){
0222 lorentzVector gam = event.getGamma()->at(igam);
0223 _fileStream <<particleIndex <<sp0<<21 <<sp0<<22<<" "<<1<<" "<<0<<" "<<0<<" " <<sp1<<gam.GetPx()<<" " <<sp1<<gam.GetPy()<<" " <<sp1<<gam.GetPz()<<" " <<sp1<<event.getGammaEnergies()->at(igam)<<" "<<sp1<<event.getGammaMasses()->at(igam)<<" 0 0 0"<<std::endl;
0224 particleIndex++;
0225 }
0226
0227
0228
0229 for( uint iel = 0 ; iel < numberOfElectrons; ++iel){
0230 lorentzVector el = event.getSources()->at(iel);
0231 _fileStream <<particleIndex<<sp0<<1 <<sp0<<11<<" "<<3<<" "<<0<<" "<<0<<" " <<sp1<<el.GetPx()<<" " <<sp1<<el.GetPy()<<" " <<sp1<<el.GetPz()<<" " <<sp1<<el.GetE()<<" "<<sp1<<electronmass<<" 0 0 0"<<std::endl;
0232 particleIndex++;
0233 }
0234
0235
0236 for( uint itarget = 0 ; itarget < numberOfIons; ++itarget){
0237 lorentzVector target = event.getTarget()->at(itarget);
0238 _fileStream <<particleIndex <<sp0<<1 <<sp0<<2212<<" "<<2<<" "<<lineNumberOfFirstIonDaughter<<" "<<lineNumberOfLastIonDaughter<<" " <<sp1<<target.GetPx()<<" " <<sp1<<target.GetPy()<<" " <<sp1<<target.GetPz()<<" " <<sp1<<target.GetE()<<" "<<sp1<<ionmass<<" 0 0 0"<<std::endl;
0239 particleIndex++;
0240 }
0241
0242
0243 int ipart = 0;
0244 std::vector<starlightParticle>::const_iterator part = (event.getParticles())->begin();
0245
0246 for (part = event.getParticles()->begin(); part != event.getParticles()->end(); part++, ipart++)
0247 {
0248 _fileStream <<particleIndex <<sp0<<1 <<sp0<<(*part).getPdgCode()<<" "<<2<<" "<<0<<" "<<0<<" " <<sp1<<(*part).GetPx()<<" " <<sp1<<(*part).GetPy()<<" " <<sp1<<(*part).GetPz()<<" " <<sp1<<(*part).GetE()<<" "<<sp1<<(*part).M()<<" 0 0 0"<<std::endl;
0249 particleIndex++;
0250 }
0251
0252
0253 _fileStream<<"=============== Event finished ==============="<<std::endl;
0254 return 0;
0255 }
0256
0257
0258 int eventFileWriter::close()
0259 {
0260
0261 #ifdef HEPMC3_ON
0262 if ( _writeFullHepMC3 ){
0263 _hepmc3writer->close();
0264 }
0265 #endif
0266
0267 try
0268 {
0269 _fileStream.close();
0270 }
0271 catch (const ios::failure & error)
0272 {
0273 cerr << "I/O exception: " << error.what() << endl;
0274 return EXIT_FAILURE;
0275 }
0276 return 0;
0277 }