00001 #include <iostream>
00002 #include <cmath>
00003
00004 #include "boost/lexical_cast.hpp"
00005
00006 #include "FWCore/Framework/interface/Event.h"
00007 #include "FWCore/Framework/interface/Run.h"
00008 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00010 #include "FWCore/ServiceRegistry/interface/Service.h"
00011 #include "FWCore/Utilities/interface/RandomNumberGenerator.h"
00012 #include "FWCore/Utilities/interface/EDMException.h"
00013 #include "GeneratorInterface/Core/interface/RNDMEngineAccess.h"
00014
00015 #include "GeneratorInterface/AMPTInterface/interface/AMPTHadronizer.h"
00016 #include "GeneratorInterface/AMPTInterface/interface/AMPTWrapper.h"
00017
00018 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
00019 #include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"
00020 #include "SimDataFormats/GeneratorProducts/interface/GenRunInfoProduct.h"
00021
00022 #include "HepMC/GenEvent.h"
00023 #include "HepMC/HeavyIon.h"
00024 #include "HepMC/SimpleVector.h"
00025 #include "CLHEP/Random/RandomEngine.h"
00026
00027 static const double pi = 3.14159265358979;
00028
00029 using namespace edm;
00030 using namespace std;
00031 using namespace gen;
00032
00033 CLHEP::HepRandomEngine* _amptRandomEngine;
00034
00035 extern "C"
00036 {
00037 float gen::ranart_(int *idummy)
00038 {
00039 if(0) idummy = idummy;
00040 float rannum = _amptRandomEngine->flat();
00041 return rannum;
00042 }
00043 }
00044
00045 extern "C"
00046 {
00047 float gen::ran1_(int *idummy)
00048 {
00049 if(0) idummy = idummy;
00050 return _amptRandomEngine->flat();
00051 }
00052 }
00053
00054 AMPTHadronizer::AMPTHadronizer(const ParameterSet &pset) :
00055 BaseHadronizer(pset),
00056 evt(0),
00057 pset_(pset),
00058 bmax_(pset.getParameter<double>("bMax")),
00059 bmin_(pset.getParameter<double>("bMin")),
00060 efrm_(pset.getParameter<double>("comEnergy")),
00061 frame_(pset.getParameter<string>("frame")),
00062 proj_(pset.getParameter<string>("proj")),
00063 targ_(pset.getParameter<string>("targ")),
00064 iap_(pset.getParameter<int>("iap")),
00065 izp_(pset.getParameter<int>("izp")),
00066 iat_(pset.getParameter<int>("iat")),
00067 izt_(pset.getParameter<int>("izt")),
00068 amptmode_(pset.getParameter<int>("amptmode")),
00069 ntmax_(pset.getParameter<int>("ntmax")),
00070 dt_(pset.getParameter<double>("dt")),
00071 stringFragA_(pset.getParameter<double>("stringFragA")),
00072 stringFragB_(pset.getParameter<double>("stringFragB")),
00073 popcornmode_(pset.getParameter<bool>("popcornmode")),
00074 popcornpar_(pset.getParameter<double>("popcornpar")),
00075 shadowingmode_(pset.getParameter<bool>("shadowingmode")),
00076 quenchingmode_(pset.getParameter<bool>("quenchingmode")),
00077 quenchingpar_(pset.getParameter<double>("quenchingpar")),
00078 pthard_(pset.getParameter<double>("pthard")),
00079 mu_(pset.getParameter<double>("mu")),
00080 izpc_(pset.getParameter<int>("izpc")),
00081 alpha_(pset.getParameter<double>("alpha")),
00082 dpcoal_(pset.getParameter<double>("dpcoal")),
00083 drcoal_(pset.getParameter<double>("drcoal")),
00084 ks0decay_(pset.getParameter<bool>("ks0decay")),
00085 phidecay_(pset.getParameter<bool>("phidecay")),
00086 deuteronmode_(pset.getParameter<int>("deuteronmode")),
00087 deuteronfactor_(pset.getParameter<int>("deuteronfactor")),
00088 deuteronxsec_(pset.getParameter<int>("deuteronxsec")),
00089 minijetpt_(pset.getParameter<double>("minijetpt")),
00090 maxmiss_(pset.getParameter<int>("maxmiss")),
00091 doInitialAndFinalRadiation_(pset.getParameter<int>("doInitialAndFinalRadiation")),
00092 ktkick_(pset.getParameter<int>("ktkick")),
00093 diquarkembedding_(pset.getParameter<int>("diquarkembedding")),
00094 diquarkpx_(pset.getParameter<double>("diquarkpx")),
00095 diquarkpy_(pset.getParameter<double>("diquarkpy")),
00096 diquarkx_(pset.getParameter<double>("diquarkx")),
00097 diquarky_(pset.getParameter<double>("diquarky")),
00098 phi0_(0.),
00099 sinphi0_(0.),
00100 cosphi0_(1.),
00101 rotate_(pset.getParameter<bool>("rotateEventPlane"))
00102 {
00103
00104 edm::Service<RandomNumberGenerator> rng;
00105 _amptRandomEngine = &(rng->getEngine());
00106 }
00107
00108
00109
00110 AMPTHadronizer::~AMPTHadronizer()
00111 {
00112 }
00113
00114
00115 void AMPTHadronizer::add_heavy_ion_rec(HepMC::GenEvent *evt)
00116 {
00117
00118 HepMC::HeavyIon* hi = new HepMC::HeavyIon(
00119 hmain1.jatt,
00120 hmain1.np,
00121 hmain1.nt,
00122 hmain1.n0+hmain1.n01+hmain1.n10+hmain1.n11,
00123 0,
00124 0,
00125 hmain1.n01,
00126 hmain1.n10,
00127 hmain1.n11,
00128 hparnt.hint1[18],
00129 phi0_,
00130 0,
00131 hparnt.hint1[11]
00132 );
00133 evt->set_heavy_ion(*hi);
00134 delete hi;
00135 }
00136
00137
00138 HepMC::GenParticle* AMPTHadronizer::build_ampt(int index, int barcode)
00139 {
00140
00141
00142 float px0 = hbt.plast[index][0];
00143 float py0 = hbt.plast[index][1];
00144 float pz0 = hbt.plast[index][2];
00145 float m = hbt.plast[index][3];
00146
00147 float px = px0*cosphi0_-py0*sinphi0_;
00148 float py = py0*cosphi0_+px0*sinphi0_;
00149 float pz = pz0;
00150 float e = sqrt(px*px+py*py+pz*pz+m*m);
00151 int status = 1;
00152
00153 HepMC::GenParticle* p = new HepMC::GenParticle(
00154 HepMC::FourVector(px,
00155 py,
00156 pz,
00157 e),
00158 INVFLV(hbt.lblast[index]),
00159 status
00160 );
00161
00162 p->suggest_barcode(barcode);
00163 return p;
00164 }
00165
00166
00167 HepMC::GenVertex* AMPTHadronizer::build_ampt_vertex(int i,int id)
00168 {
00169
00170 HepMC::GenVertex* vertex = new HepMC::GenVertex(HepMC::FourVector(0,0,0,0),id);
00171 return vertex;
00172 }
00173
00174 bool AMPTHadronizer::generatePartonsAndHadronize()
00175 {
00176
00177 if(rotate_) rotateEvtPlane();
00178
00179
00180 AMPT(frame_.data(), bmin_, bmax_, strlen(frame_.data()));
00181
00182
00183 HepMC::GenEvent *evt = new HepMC::GenEvent();
00184 get_particles(evt);
00185
00186 add_heavy_ion_rec(evt);
00187
00188 event().reset(evt);
00189
00190
00191 return true;
00192 }
00193
00194
00195 bool AMPTHadronizer::get_particles(HepMC::GenEvent *evt )
00196 {
00197 HepMC::GenVertex* vertice;
00198
00199 vector<HepMC::GenParticle*> particles;
00200 vector<int> mother_ids;
00201 vector<HepMC::GenVertex*> prods;
00202
00203 vertice = new HepMC::GenVertex(HepMC::FourVector(0,0,0,0),0);
00204 evt->add_vertex(vertice);
00205 if(!evt->signal_process_vertex()) evt->set_signal_process_vertex(vertice);
00206
00207 const unsigned int knumpart = hbt.nlast;
00208 for (unsigned int ipart = 0; ipart<knumpart; ipart++) {
00209 int mid = 0;
00210 particles.push_back(build_ampt(ipart,ipart+1));
00211 prods.push_back(build_ampt_vertex(ipart,0));
00212 mother_ids.push_back(mid);
00213 LogDebug("DecayChain")<<"Mother index : "<<mid;
00214 }
00215
00216 LogDebug("AMPT")<<"Number of particles in vector "<<particles.size();
00217
00218 for (unsigned int ipart = 0; ipart<particles.size(); ipart++) {
00219 HepMC::GenParticle* part = particles[ipart];
00220
00221 int mid = mother_ids[ipart];
00222 LogDebug("DecayChain")<<"Particle "<<ipart;
00223 LogDebug("DecayChain")<<"Mother's ID "<<mid;
00224 LogDebug("DecayChain")<<"Particle's PDG ID "<<part->pdg_id();
00225
00226 if(mid <= 0){
00227 vertice->add_particle_out(part);
00228 continue;
00229 }
00230
00231 if(mid > 0){
00232 HepMC::GenParticle* mother = particles[mid];
00233 LogDebug("DecayChain")<<"Mother's PDG ID "<<mother->pdg_id();
00234
00235 HepMC::GenVertex* prod_vertex = mother->end_vertex();
00236 if(!prod_vertex){
00237 prod_vertex = prods[ipart];
00238 prod_vertex->add_particle_in(mother);
00239 evt->add_vertex(prod_vertex);
00240 prods[ipart]=0;
00241
00242 }
00243 prod_vertex->add_particle_out(part);
00244 }
00245 }
00246
00247
00248 for (unsigned int i = 0; i<prods.size(); i++) {
00249 if(prods[i]) delete prods[i];
00250 }
00251
00252 return true;
00253 }
00254
00255
00256 bool AMPTHadronizer::call_amptset(double efrm, std::string frame, std::string proj, std::string targ, int iap, int izp, int iat, int izt)
00257 {
00258
00259 AMPTSET(efrm,frame.data(),proj.data(),targ.data(),iap,izp,iat,izt,strlen(frame.data()),strlen(proj.data()),strlen(targ.data()));
00260 return true;
00261 }
00262
00263 bool AMPTHadronizer::ampt_init(const ParameterSet &pset)
00264 {
00265 anim.isoft=amptmode_;
00266 input2.ntmax=ntmax_;
00267 input1.dt=dt_;
00268 ludat1.parj[40]=stringFragA_;
00269 ludat1.parj[41]=stringFragB_;
00270 popcorn.ipop=popcornmode_;
00271 ludat1.parj[4]=popcornpar_;
00272 hparnt.ihpr2[5]=shadowingmode_;
00273 hparnt.ihpr2[3]=quenchingmode_;
00274 hparnt.hipr1[13]=quenchingpar_;
00275 hparnt.hipr1[7]=pthard_;
00276 para2.xmu=mu_;
00277 anim.izpc=izpc_;
00278 para2.alpha=alpha_;
00279 coal.dpcoal=dpcoal_;
00280 coal.drcoal=drcoal_;
00281 resdcy.iksdcy=ks0decay_;
00282 phidcy.iphidcy=phidecay_;
00283 para8.idpert=deuteronmode_;
00284 para8.npertd=deuteronfactor_;
00285 para8.idxsec=deuteronxsec_;
00286 phidcy.pttrig=minijetpt_;
00287 phidcy.maxmiss=maxmiss_;
00288 hparnt.ihpr2[1]=doInitialAndFinalRadiation_;
00289 hparnt.ihpr2[4]=ktkick_;
00290 embed.iembed=diquarkembedding_;
00291 embed.pxqembd=diquarkpx_;
00292 embed.pyqembd=diquarkpy_;
00293 embed.xembd=diquarkx_;
00294 embed.yembd=diquarky_;
00295
00296 return true;
00297 }
00298
00299
00300 bool AMPTHadronizer::initializeForInternalPartons(){
00301
00302
00303 ampt_init(pset_);
00304
00305
00306 LogInfo("AMPTinAction") << "##### Calling AMPTSET(" << efrm_ << "," <<frame_<<","<<proj_<<","<<targ_<<","<<iap_<<","<<izp_<<","<<iat_<<","<<izt_<<") ####";
00307
00308 call_amptset(efrm_,frame_,proj_,targ_,iap_,izp_,iat_,izt_);
00309
00310 return true;
00311 }
00312
00313 bool AMPTHadronizer::declareStableParticles( std::vector<int> pdg )
00314 {
00315 return true;
00316 }
00317
00318
00319 void AMPTHadronizer::rotateEvtPlane(){
00320 int zero = 0;
00321 double test = (double)gen::ranart_(&zero);
00322 phi0_ = 2.*pi*test - pi;
00323 sinphi0_ = sin(phi0_);
00324 cosphi0_ = cos(phi0_);
00325 }
00326
00327
00328 bool AMPTHadronizer::hadronize()
00329 {
00330 return false;
00331 }
00332
00333 bool AMPTHadronizer::decay()
00334 {
00335 return true;
00336 }
00337
00338 bool AMPTHadronizer::residualDecay()
00339 {
00340 return true;
00341 }
00342
00343 void AMPTHadronizer::finalizeEvent(){
00344 return;
00345 }
00346
00347 void AMPTHadronizer::statistics(){
00348 return;
00349 }
00350
00351 const char* AMPTHadronizer::classname() const
00352 {
00353 return "gen::AMPTHadronizer";
00354 }
00355