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/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 }