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   using namespace Cuts;
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       /// @todo Wouldn't this be nice... if HepMC::IO_AsciiParticles was sane :-/
00157       // printEvent(event.genEvent());
00158 
00159       const GenEvent* evt = event.genEvent();
00160 
00161       cout << string(120, '=') << "\n" << endl;
00162 
00163       // Weights
00164       cout << "Weights(" << evt->weights().size() << ")=";
00165       for (HepMC::WeightContainer::const_iterator wgt = evt->weights().begin(); wgt != evt->weights().end(); ++wgt) {
00166         cout << *wgt << " ";
00167       }
00168       cout << "\n"
00169            << "EventScale " << evt->event_scale()
00170            << " [energy] \t alphaQCD=" << evt->alphaQCD()
00171            << "\t alphaQED=" << evt->alphaQED() << endl;
00172 
00173       if (evt->pdf_info()) {
00174         cout << "PdfInfo: id1=" << evt->pdf_info()->id1()
00175              << " id2=" << evt->pdf_info()->id2()
00176              << " x1=" << evt->pdf_info()->x1()
00177              << " x2=" << evt->pdf_info()->x2()
00178              << " q=" << evt->pdf_info()->scalePDF()
00179              << " xpdf1=" << evt->pdf_info()->pdf1()
00180              << " xpdf2=" << evt->pdf_info()->pdf2()
00181              << endl;
00182       } else {
00183         cout << "PdfInfo: EMPTY";
00184       }
00185 
00186       // Print a legend to describe the particle info
00187       char particle_legend[120];
00188       sprintf( particle_legend,"     %9s %8s %-15s %4s %8s %8s   (%9s,%9s,%9s,%9s,%9s)",
00189                "Barcode","PDG ID","Name","Stat","ProdVtx","DecayVtx","Px","Py","Pz","E ","m");
00190       cout << endl;
00191       cout << "                                       GenParticle Legend\n" << particle_legend << "\n";
00192       // if (m_vertexinfo) {
00193       //   sprintf( particle_legend," %60s (%9s,%9s,%9s,%9s)"," ","Vx","Vy","Vz","Vct ");
00194       //   cout << particle_legend << endl;
00195       // }
00196       // cout << string(120, '_') << endl;
00197 
00198       // Print all particles
00199       // const HepPDT::ParticleDataTable* pdt = m_ppsvc->PDT();
00200       for (HepMC::GenEvent::particle_const_iterator p = evt->particles_begin(); p != evt->particles_end(); ++p) {
00201         int p_bcode = (*p)->barcode();
00202         int p_pdg_id = (*p)->pdg_id();
00203         double p_px = (*p)->momentum().px();
00204         double p_py = (*p)->momentum().py();
00205         double p_pz = (*p)->momentum().pz();
00206         double p_pe = (*p)->momentum().e();
00207 
00208         int p_stat = (*p)->status();
00209         int p_prodvtx = 0;
00210         if ((*p)->production_vertex() && (*p)->production_vertex()->barcode() != 0) {
00211           p_prodvtx = (*p)->production_vertex()->barcode();
00212         }
00213         int p_endvtx = 0;
00214         if ((*p)->end_vertex() && (*p)->end_vertex()->barcode() != 0) {
00215           p_endvtx=(*p)->end_vertex()->barcode();
00216         }
00217         // double v_x = 0;
00218         // double v_y = 0;
00219         // double v_z = 0;
00220         // double v_ct = 0;
00221         // if ((*p)->production_vertex()) {
00222         //   v_x = (*p)->production_vertex()->position().x();
00223         //   v_y = (*p)->production_vertex()->position().y();
00224         //   v_z = (*p)->production_vertex()->position().z();
00225         //   v_ct = (*p)->production_vertex()->position().t();
00226         // }
00227 
00228         // Mass (prefer generated mass if available)
00229         double p_mass = (*p)->generated_mass();
00230         if (p_mass == 0 && !(p_stat == 1 && p_pdg_id == 22)) p_mass = (*p)->momentum().m();
00231 
00232         // Particle names
00233         string sname = (_pnames.find(p_pdg_id) != _pnames.end()) ? _pnames[p_pdg_id] : "";
00234         const char* p_name = sname.c_str() ;
00235 
00236         char particle_entries[120];
00237         sprintf(particle_entries, " %9i %8i %-15s %4i %8i %8i   (%+9.3g,%+9.3g,%+9.3g,%+9.3g,%9.3g)",
00238                 p_bcode, p_pdg_id, p_name, p_stat, p_prodvtx, p_endvtx, p_px, p_py, p_pz, p_pe, p_mass);
00239         cout << particle_entries << "\n";
00240         // if (m_vertexinfo) {
00241         //   sprintf(particle_entries," %60s (%+9.3g,%+9.3g,%+9.3g,%+9.3g)"," ",v_x, v_y, v_z, v_ct);
00242         //   cout << particle_entries << "\n";
00243         // }
00244       }
00245 
00246       cout << "\n" << endl;
00247     }
00248 
00249 
00250     /// Normalise histograms etc., after the run
00251     void finalize() {    }
00252 
00253     //@}
00254 
00255   private:
00256 
00257     map<long, string> _pnames;
00258 
00259 
00260   };
00261 
00262 
00263 
00264   // The hook for the plugin system
00265   DECLARE_RIVET_PLUGIN(MC_PRINTEVENT);
00266 
00267 }