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