MC_PRINTEVENT.cc
Go to the documentation of this file.
00001 // -*- C++ -*- 00002 #include "Rivet/Analysis.hh" 00003 #include "Rivet/Projections/FinalState.hh" 00004 00005 namespace Rivet { 00006 00007 00008 /// @author Andy Buckley 00009 class MC_PRINTEVENT : public Analysis { 00010 public: 00011 00012 /// Constructor 00013 MC_PRINTEVENT() 00014 : Analysis("MC_PRINTEVENT") 00015 { } 00016 00017 00018 /// @name Analysis methods 00019 //@{ 00020 00021 void init() { 00022 00023 /// Set up particle name map 00024 // quarks & gluons 00025 _pnames[1] = "d"; 00026 _pnames[-1] = "d~"; 00027 _pnames[2] = "u"; 00028 _pnames[-2] = "u~"; 00029 _pnames[3] = "s"; 00030 _pnames[-3] = "s~"; 00031 _pnames[4] = "c"; 00032 _pnames[-4] = "c~"; 00033 _pnames[5] = "b"; 00034 _pnames[-5] = "b~"; 00035 _pnames[6] = "t"; 00036 _pnames[-6] = "t~"; 00037 // bosons 00038 _pnames[21] = "g"; 00039 _pnames[22] = "gamma"; 00040 _pnames[23] = "W+"; 00041 _pnames[-23] = "W-"; 00042 _pnames[-24] = "Z0"; 00043 _pnames[-25] = "h0"; 00044 _pnames[-26] = "h0"; 00045 // leptons 00046 _pnames[11] = "e-"; 00047 _pnames[-11] = "e+"; 00048 _pnames[13] = "mu-"; 00049 _pnames[-13] = "mu+"; 00050 _pnames[15] = "tau-"; 00051 _pnames[-15] = "tau+"; 00052 _pnames[12] = "nu_e"; 00053 _pnames[-12] = "nu_e~"; 00054 _pnames[14] = "nu_mu"; 00055 _pnames[-14] = "nu_mu~"; 00056 _pnames[16] = "nu_tau"; 00057 _pnames[-16] = "nu_tau~"; 00058 // common hadrons 00059 _pnames[111] = "pi0"; 00060 _pnames[211] = "pi+"; 00061 _pnames[-211] = "pi-"; 00062 _pnames[221] = "eta"; 00063 _pnames[331] = "eta'"; 00064 _pnames[113] = "rho0"; 00065 _pnames[213] = "rho+"; 00066 _pnames[-213] = "rho-"; 00067 _pnames[223] = "omega"; 00068 _pnames[333] = "phi"; 00069 _pnames[130] = "K0L"; 00070 _pnames[310] = "K0S"; 00071 _pnames[311] = "K0"; 00072 _pnames[-311] = "K0"; 00073 _pnames[321] = "K+"; 00074 _pnames[-321] = "K-"; 00075 _pnames[313] = "K*0"; 00076 _pnames[-313] = "K*0~"; 00077 _pnames[323] = "K*+"; 00078 _pnames[-323] = "K*-"; 00079 _pnames[411] = "D+"; 00080 _pnames[-411] = "D-"; 00081 _pnames[421] = "D0"; 00082 _pnames[-421] = "D0~"; 00083 _pnames[413] = "D*+"; 00084 _pnames[-413] = "D*-"; 00085 _pnames[423] = "D*0"; 00086 _pnames[-423] = "D*0~"; 00087 _pnames[431] = "Ds+"; 00088 _pnames[-431] = "Ds-"; 00089 _pnames[433] = "Ds*+"; 00090 _pnames[-433] = "Ds*-"; 00091 _pnames[511] = "B0"; 00092 _pnames[-511] = "B0~"; 00093 _pnames[521] = "B+"; 00094 _pnames[-521] = "B-"; 00095 _pnames[513] = "B*0"; 00096 _pnames[-513] = "B*0~"; 00097 _pnames[523] = "B*+"; 00098 _pnames[-523] = "B*-"; 00099 _pnames[531] = "B0s"; 00100 _pnames[541] = "Bc+"; 00101 _pnames[-541] = "Bc-"; 00102 _pnames[441] = "eta_c(1S)"; 00103 _pnames[443] = "J/psi(1S)"; 00104 _pnames[551] = "eta_b(1S)"; 00105 _pnames[553] = "Upsilon(1S)"; 00106 _pnames[2212] = "p+"; 00107 _pnames[-2212] = "p-"; 00108 _pnames[2112] = "n"; 00109 _pnames[-2112] = "n~"; 00110 _pnames[2224] = "Delta++"; 00111 _pnames[2214] = "Delta+"; 00112 _pnames[2114] = "Delta0"; 00113 _pnames[1114] = "Delta-"; 00114 _pnames[3122] = "Lambda"; 00115 _pnames[-3122] = "Lambda~"; 00116 _pnames[3222] = "Sigma+"; 00117 _pnames[-3222] = "Sigma+~"; 00118 _pnames[3212] = "Sigma0"; 00119 _pnames[-3212] = "Sigma0~"; 00120 _pnames[3112] = "Sigma-"; 00121 _pnames[-3112] = "Sigma-~"; 00122 _pnames[4122] = "Lambda_c+"; 00123 _pnames[-4122] = "Lambda_c-"; 00124 _pnames[5122] = "Lambda_b"; 00125 // exotic 00126 _pnames[32] = "Z'"; 00127 _pnames[34] = "W'+"; 00128 _pnames[-34] = "W'-"; 00129 _pnames[35] = "H0"; 00130 _pnames[36] = "A0"; 00131 _pnames[37] = "H+"; 00132 _pnames[-37] = "H-"; 00133 // shower-specific 00134 _pnames[91] = "cluster"; 00135 _pnames[92] = "string"; 00136 _pnames[9922212] = "remn"; 00137 _pnames[1103] = "dd"; 00138 _pnames[2101] = "ud0"; 00139 _pnames[2103] = "ud1"; 00140 _pnames[2203] = "uu"; 00141 00142 } 00143 00144 00145 /// Perform the per-event analysis 00146 void analyze(const Event& event) { 00147 /// @todo Wouldn't this be nice... if HepMC::IO_AsciiParticles was sane :-/ 00148 // printEvent(event.genEvent()); 00149 00150 const GenEvent* evt = event.genEvent(); 00151 00152 cout << string(120, '=') << "\n" << endl; 00153 00154 // Weights 00155 cout << "Weights(" << evt->weights().size() << ")="; 00156 /// @todo Re-enable 00157 // foreach (double w, evt->weights()) 00158 // cout << w << " "; 00159 cout << "\n" 00160 << "EventScale " << evt->event_scale() 00161 << " [energy] \t alphaQCD=" << evt->alphaQCD() 00162 << "\t alphaQED=" << evt->alphaQED() << endl; 00163 00164 if (evt->pdf_info()) { 00165 cout << "PdfInfo: id1=" << evt->pdf_info()->id1() 00166 << " id2=" << evt->pdf_info()->id2() 00167 << " x1=" << evt->pdf_info()->x1() 00168 << " x2=" << evt->pdf_info()->x2() 00169 << " q=" << evt->pdf_info()->scalePDF() 00170 << " xpdf1=" << evt->pdf_info()->pdf1() 00171 << " xpdf2=" << evt->pdf_info()->pdf2() 00172 << endl; 00173 } else { 00174 cout << "PdfInfo: EMPTY"; 00175 } 00176 00177 // Print a legend to describe the particle info 00178 char particle_legend[120]; 00179 sprintf( particle_legend," %9s %8s %-15s %4s %8s %8s (%9s,%9s,%9s,%9s,%9s)", 00180 "Barcode","PDG ID","Name","Stat","ProdVtx","DecayVtx","Px","Py","Pz","E ","m"); 00181 cout << endl; 00182 cout << " GenParticle Legend\n" << particle_legend << "\n"; 00183 // if (m_vertexinfo) { 00184 // sprintf( particle_legend," %60s (%9s,%9s,%9s,%9s)"," ","Vx","Vy","Vz","Vct "); 00185 // cout << particle_legend << endl; 00186 // } 00187 // cout << string(120, '_') << endl; 00188 00189 // Print all particles 00190 // const HepPDT::ParticleDataTable* pdt = m_ppsvc->PDT(); 00191 for (HepMC::GenEvent::particle_const_iterator p = evt->particles_begin(); p != evt->particles_end(); ++p) { 00192 int p_bcode = (*p)->barcode(); 00193 int p_pdg_id = (*p)->pdg_id(); 00194 double p_px = (*p)->momentum().px(); 00195 double p_py = (*p)->momentum().py(); 00196 double p_pz = (*p)->momentum().pz(); 00197 double p_pe = (*p)->momentum().e(); 00198 00199 int p_stat = (*p)->status(); 00200 int p_prodvtx = 0; 00201 if ((*p)->production_vertex() && (*p)->production_vertex()->barcode() != 0) { 00202 p_prodvtx = (*p)->production_vertex()->barcode(); 00203 } 00204 int p_endvtx = 0; 00205 if ((*p)->end_vertex() && (*p)->end_vertex()->barcode() != 0) { 00206 p_endvtx=(*p)->end_vertex()->barcode(); 00207 } 00208 // double v_x = 0; 00209 // double v_y = 0; 00210 // double v_z = 0; 00211 // double v_ct = 0; 00212 // if ((*p)->production_vertex()) { 00213 // v_x = (*p)->production_vertex()->position().x(); 00214 // v_y = (*p)->production_vertex()->position().y(); 00215 // v_z = (*p)->production_vertex()->position().z(); 00216 // v_ct = (*p)->production_vertex()->position().t(); 00217 // } 00218 00219 // Mass (prefer generated mass if available) 00220 double p_mass = (*p)->generated_mass(); 00221 if (p_mass == 0 && !(p_stat == 1 && p_pdg_id == 22)) p_mass = (*p)->momentum().m(); 00222 00223 // Particle names 00224 string sname = (_pnames.find(p_pdg_id) != _pnames.end()) ? _pnames[p_pdg_id] : ""; 00225 const char* p_name = sname.c_str() ; 00226 00227 char particle_entries[120]; 00228 sprintf(particle_entries, " %9i %8i %-15s %4i %8i %8i (%+9.3g,%+9.3g,%+9.3g,%+9.3g,%9.3g)", 00229 p_bcode, p_pdg_id, p_name, p_stat, p_prodvtx, p_endvtx, p_px, p_py, p_pz, p_pe, p_mass); 00230 cout << particle_entries << "\n"; 00231 // if (m_vertexinfo) { 00232 // sprintf(particle_entries," %60s (%+9.3g,%+9.3g,%+9.3g,%+9.3g)"," ",v_x, v_y, v_z, v_ct); 00233 // cout << particle_entries << "\n"; 00234 // } 00235 } 00236 00237 cout << "\n" << endl; 00238 } 00239 00240 00241 /// Normalise histograms etc., after the run 00242 void finalize() { } 00243 00244 //@} 00245 00246 private: 00247 00248 map<long, string> _pnames; 00249 00250 00251 }; 00252 00253 00254 00255 // The hook for the plugin system 00256 DECLARE_RIVET_PLUGIN(MC_PRINTEVENT); 00257 00258 } Generated on Wed Oct 7 2015 12:09:14 for The Rivet MC analysis system by ![]() |