File indexing completed on 2024-04-06 12:13:45
0001 #include <iostream>
0002 #include <cmath>
0003
0004 #include "FWCore/Concurrency/interface/SharedResourceNames.h"
0005 #include "FWCore/Framework/interface/Event.h"
0006 #include "FWCore/Framework/interface/Run.h"
0007 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0009 #include "FWCore/Utilities/interface/EDMException.h"
0010
0011 #include "GeneratorInterface/HijingInterface/interface/HijingHadronizer.h"
0012 #include "GeneratorInterface/HijingInterface/interface/HijingPythiaWrapper.h"
0013 #include "GeneratorInterface/HijingInterface/interface/HijingWrapper.h"
0014 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
0015 #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
0016 #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h"
0017
0018 #include "HepMC/GenEvent.h"
0019 #include "HepMC/HeavyIon.h"
0020 #include "HepMC/SimpleVector.h"
0021
0022 #include "CLHEP/Random/RandomEngine.h"
0023
0024 static const double pi = 3.14159265358979;
0025
0026 using namespace edm;
0027 using namespace std;
0028 using namespace gen;
0029
0030 static CLHEP::HepRandomEngine* hijRandomEngine;
0031
0032 extern "C" {
0033 float gen::hijran_(int* idummy) { return hijRandomEngine->flat(); }
0034 }
0035
0036 extern "C" {
0037 float ran_(unsigned int* iseed) {
0038 return hijRandomEngine->flat();
0039
0040
0041 }
0042 }
0043
0044 extern "C" {
0045 float rlu_(unsigned int* iseed) {
0046 return hijRandomEngine->flat();
0047
0048
0049 }
0050 }
0051
0052 const std::vector<std::string> HijingHadronizer::theSharedResources = {edm::SharedResourceNames::kPythia6};
0053
0054 HijingHadronizer::HijingHadronizer(const ParameterSet& pset)
0055 : BaseHadronizer(pset),
0056 evt(nullptr),
0057 pset_(pset),
0058 bmax_(pset.getParameter<double>("bMax")),
0059 bmin_(pset.getParameter<double>("bMin")),
0060 efrm_(pset.getParameter<double>("comEnergy")),
0061 frame_(pset.getParameter<string>("frame")),
0062 proj_(pset.getParameter<string>("proj")),
0063 targ_(pset.getParameter<string>("targ")),
0064 iap_(pset.getParameter<int>("iap")),
0065 izp_(pset.getParameter<int>("izp")),
0066 iat_(pset.getParameter<int>("iat")),
0067 izt_(pset.getParameter<int>("izt")),
0068 phi0_(0.),
0069 sinphi0_(0.),
0070 cosphi0_(1.),
0071 rotate_(pset.getParameter<bool>("rotateEventPlane")) {
0072
0073 }
0074
0075
0076 HijingHadronizer::~HijingHadronizer() {
0077
0078 }
0079
0080
0081 void HijingHadronizer::doSetRandomEngine(CLHEP::HepRandomEngine* v) { hijRandomEngine = v; }
0082
0083
0084 void HijingHadronizer::add_heavy_ion_rec(HepMC::GenEvent* evt) {
0085
0086 HepMC::HeavyIon* hi = new HepMC::HeavyIon(himain1.jatt,
0087 himain1.np,
0088 himain1.nt,
0089 himain1.n0 + himain1.n01 + himain1.n10 + himain1.n11,
0090 0,
0091 0,
0092 himain1.n01,
0093 himain1.n10,
0094 himain1.n11,
0095
0096 hiparnt.hint1[18],
0097 phi0_,
0098 0,
0099
0100 hiparnt.hint1[11]
0101 );
0102 evt->set_heavy_ion(*hi);
0103 delete hi;
0104 }
0105
0106
0107 HepMC::GenParticle* HijingHadronizer::build_hijing(int index, int barcode) {
0108
0109
0110 double x0 = himain2.patt[0][index];
0111 double y0 = himain2.patt[1][index];
0112
0113 double x = x0 * cosphi0_ - y0 * sinphi0_;
0114 double y = y0 * cosphi0_ + x0 * sinphi0_;
0115
0116
0117
0118 if (himain2.katt[3][index] <= 10 && himain2.katt[3][index] > 0)
0119 himain2.katt[3][index] = 1;
0120 if (himain2.katt[3][index] <= 20 && himain2.katt[3][index] > 10)
0121 himain2.katt[3][index] = 2;
0122
0123 HepMC::GenParticle* p = new HepMC::GenParticle(HepMC::FourVector(x,
0124 y,
0125 himain2.patt[2][index],
0126 himain2.patt[3][index]),
0127 himain2.katt[0][index],
0128 himain2.katt[3][index]
0129 );
0130 p->suggest_barcode(barcode);
0131
0132 return p;
0133 }
0134
0135
0136 HepMC::GenVertex* HijingHadronizer::build_hijing_vertex(int i, int id) {
0137
0138 double x0 = himain2.vatt[0][i];
0139 double y0 = himain2.vatt[1][i];
0140 double x = x0 * cosphi0_ - y0 * sinphi0_;
0141 double y = y0 * cosphi0_ + x0 * sinphi0_;
0142 double z = himain2.vatt[2][i];
0143 double t = himain2.vatt[3][i];
0144
0145 HepMC::GenVertex* vertex = new HepMC::GenVertex(HepMC::FourVector(x, y, z, t), id);
0146 return vertex;
0147 }
0148
0149 bool HijingHadronizer::generatePartonsAndHadronize() {
0150
0151 if (rotate_)
0152 rotateEvtPlane();
0153
0154
0155
0156 float f_bmin = bmin_;
0157 float f_bmax = bmax_;
0158 HIJING(frame_.c_str(), f_bmin, f_bmax, frame_.length());
0159
0160
0161 HepMC::GenEvent* evt = new HepMC::GenEvent();
0162 get_particles(evt);
0163
0164
0165
0166 add_heavy_ion_rec(evt);
0167
0168 event().reset(evt);
0169
0170 return true;
0171 }
0172
0173
0174 bool HijingHadronizer::get_particles(HepMC::GenEvent* evt) {
0175 HepMC::GenVertex* vertice;
0176
0177 vector<HepMC::GenParticle*> particles;
0178 vector<int> mother_ids;
0179 vector<HepMC::GenVertex*> prods;
0180
0181 vertice = new HepMC::GenVertex(HepMC::FourVector(0, 0, 0, 0), 0);
0182 evt->add_vertex(vertice);
0183 if (!evt->signal_process_vertex())
0184 evt->set_signal_process_vertex(vertice);
0185
0186 const unsigned int knumpart = himain1.natt;
0187
0188 for (unsigned int ipart = 0; ipart < knumpart; ipart++) {
0189 int mid = himain2.katt[2][ipart] - 1;
0190
0191 particles.push_back(build_hijing(ipart, ipart + 1));
0192 prods.push_back(build_hijing_vertex(ipart, 0));
0193 mother_ids.push_back(mid);
0194 LogDebug("DecayChain") << "Mother index : " << mid;
0195 }
0196
0197 LogDebug("Hijing") << "Number of particles in vector " << particles.size();
0198
0199 for (unsigned int ipart = 0; ipart < particles.size(); ipart++) {
0200 HepMC::GenParticle* part = particles[ipart];
0201
0202 int mid = mother_ids[ipart];
0203 LogDebug("DecayChain") << "Particle " << ipart;
0204 LogDebug("DecayChain") << "Mother's ID " << mid;
0205 LogDebug("DecayChain") << "Particle's PDG ID " << part->pdg_id();
0206
0207
0208 if (part->status() == 1 &&
0209 sqrt(part->momentum().px() * part->momentum().px() + part->momentum().py() * part->momentum().py()) == 0)
0210 continue;
0211
0212 if (mid <= 0) {
0213 vertice->add_particle_out(part);
0214 continue;
0215 }
0216
0217 if (mid > 0) {
0218 HepMC::GenParticle* mother = particles[mid];
0219 LogDebug("DecayChain") << "Mother's PDG ID " << mother->pdg_id();
0220 HepMC::GenVertex* prod_vertex = mother->end_vertex();
0221 if (!prod_vertex) {
0222 prod_vertex = prods[ipart];
0223 prod_vertex->add_particle_in(mother);
0224
0225 evt->add_vertex(prod_vertex);
0226 prods[ipart] = nullptr;
0227 }
0228 prod_vertex->add_particle_out(part);
0229 }
0230 }
0231
0232
0233 for (unsigned int i = 0; i < prods.size(); i++) {
0234 if (prods[i])
0235 delete prods[i];
0236 }
0237
0238 return true;
0239 }
0240
0241
0242 bool HijingHadronizer::call_hijset(
0243 double efrm, std::string frame, std::string proj, std::string targ, int iap, int izp, int iat, int izt) {
0244 float ef = efrm;
0245
0246 frame.resize(4, ' ');
0247 proj.resize(4, ' ');
0248 targ.resize(4, ' ');
0249 HIJSET(ef, frame.data(), proj.data(), targ.data(), iap, izp, iat, izt, frame.length(), proj.length(), targ.length());
0250 return true;
0251 }
0252
0253
0254 bool HijingHadronizer::initializeForInternalPartons() {
0255
0256
0257
0258
0259
0260
0261 LogInfo("HIJINGinAction") << "##### Calling HIJSET(" << efrm_ << "," << frame_ << "," << proj_ << "," << targ_ << ","
0262 << iap_ << "," << izp_ << "," << iat_ << "," << izt_ << ") ####";
0263 call_hijset(efrm_, frame_, proj_, targ_, iap_, izp_, iat_, izt_);
0264
0265 return true;
0266 }
0267
0268 bool HijingHadronizer::declareStableParticles(const std::vector<int>& pdg) { return true; }
0269
0270
0271 void HijingHadronizer::rotateEvtPlane() {
0272 phi0_ = 2. * pi * gen::hijran_(nullptr) - pi;
0273 sinphi0_ = sin(phi0_);
0274 cosphi0_ = cos(phi0_);
0275 }
0276
0277
0278 bool HijingHadronizer::hadronize() { return false; }
0279
0280 bool HijingHadronizer::decay() { return true; }
0281
0282 bool HijingHadronizer::residualDecay() { return true; }
0283
0284 void HijingHadronizer::finalizeEvent() { return; }
0285
0286 void HijingHadronizer::statistics() { return; }
0287
0288 const char* HijingHadronizer::classname() const { return "gen::HijingHadronizer"; }