rivet is hosted by Hepforge, IPPP Durham
BELLE_2006_S6265367.cc
Go to the documentation of this file.
00001 // -*- C++ -*-
00002 #include <iostream>
00003 #include "Rivet/Analysis.hh"
00004 #include "Rivet/RivetYODA.hh"
00005 #include "Rivet/Tools/ParticleIdUtils.hh"
00006 #include "Rivet/Projections/Beam.hh"
00007 #include "Rivet/Projections/UnstableFinalState.hh"
00008 
00009 namespace Rivet {
00010 
00011 
00012   /// @brief BELLE charmed mesons and baryons from fragmentation
00013   /// @author Eike von Seggern
00014   class BELLE_2006_S6265367 : public Analysis {
00015   public:
00016 
00017     BELLE_2006_S6265367()
00018       : Analysis("BELLE_2006_S6265367")
00019     { }
00020 
00021 
00022     void analyze(const Event& e) {
00023       const double weight = e.weight();
00024 
00025       // Loop through unstable FS particles and look for charmed mesons/baryons
00026       const UnstableFinalState& ufs = applyProjection<UnstableFinalState>(e, "UFS");
00027 
00028       const Beam beamproj = applyProjection<Beam>(e, "Beams");
00029       const ParticlePair& beams = beamproj.beams();
00030       FourMomentum mom_tot = beams.first.momentum() + beams.second.momentum();
00031       LorentzTransform cms_boost(-mom_tot.boostVector());
00032       const double s = sqr(beamproj.sqrtS());
00033       const bool onresonance = fuzzyEquals(beamproj.sqrtS(), 10.58, 5E-3);
00034 
00035       // Particle masses from PDGlive (accessed online 16. Nov. 2009).
00036       foreach (const Particle& p, ufs.particles()) {
00037 
00038         double xp = 0.0;
00039         double mH2 = 0.0;
00040         // 3-momentum in CMS frame
00041         const double mom = cms_boost.transform(p.momentum()).vector3().mod();
00042 
00043         const int PdgId = abs(p.pdgId());
00044         MSG_DEBUG("pdgID = " << PdgId << "  mom = " << mom);
00045         switch (PdgId) {
00046 
00047           case 421:
00048             MSG_DEBUG("D0 found");
00049             mH2 = 3.47763; // 1.86484^2
00050             xp = mom/sqrt(s/4.0 - mH2);
00051             // off-resonance cross section
00052             if(!onresonance) _sigmaD0->fill(10.6,weight);
00053             if(checkDecay(p.genParticle())) {
00054               if (onresonance)
00055                 _histXpD0_R->fill(xp, s*weight);
00056               else
00057                 _histXpD0_C->fill(xp, s*weight);
00058             }
00059             if (onresonance)
00060               _histXpD0_R_N->fill(xp, weight);
00061             else
00062               _histXpD0_C_N->fill(xp, weight);
00063             break;
00064 
00065           case 411:
00066             MSG_DEBUG("D+ found");
00067             mH2 = 3.49547; // 1.86962^2
00068             xp = mom/sqrt(s/4.0 - mH2);
00069             if(!onresonance) _sigmaDPlus->fill(10.6,weight);
00070             if(checkDecay(p.genParticle())) {
00071               if (onresonance)
00072                 _histXpDplus_R->fill(xp, s*weight);
00073               else
00074                 _histXpDplus_C->fill(xp, s*weight);
00075             }
00076             if (onresonance)
00077               _histXpDplus_R_N->fill(xp, weight);
00078             else
00079               _histXpDplus_C_N->fill(xp, weight);
00080             break;
00081           case 431:
00082             MSG_DEBUG("D+_s found");
00083             mH2 = 3.87495; // 1.96849^2
00084             xp = mom/sqrt(s/4.0 - mH2);
00085             if(!onresonance) _sigmaDs->fill(10.6,weight);
00086             if(checkDecay(p.genParticle())) {
00087               if (onresonance)
00088                 _histXpDplus_s_R->fill(xp, s*weight);
00089               else
00090                 _histXpDplus_s_C->fill(xp, s*weight);
00091             }
00092             if (onresonance)
00093               _histXpDplus_s_R_N->fill(xp, weight);
00094             else
00095               _histXpDplus_s_C_N->fill(xp, weight);
00096             break;
00097 
00098           case 4122:
00099             MSG_DEBUG("Lambda_c found");
00100             mH2 = 5.22780; // 2.28646^2
00101             xp = mom/sqrt(s/4.0 - mH2);
00102             if(!onresonance) _sigmaLambdac   ->fill(10.6,weight);
00103             if(checkDecay(p.genParticle())) {
00104               if (onresonance)
00105                 _histXpLambda_c_R->fill(xp, s*weight);
00106               else
00107                 _histXpLambda_c_C->fill(xp, s*weight);
00108             }
00109             if (onresonance)
00110               _histXpLambda_c_R_N->fill(xp, weight);
00111             else
00112               _histXpLambda_c_C_N->fill(xp, weight);
00113             break;
00114 
00115 
00116           case 413: {
00117             MSG_DEBUG("D*+ found");
00118             mH2 = 4.04119; // 2.01027^2
00119             xp = mom/sqrt(s/4.0 - mH2);
00120             if(!onresonance) {
00121               _sigmaDStarPlusA->fill(10.6,weight);
00122               _sigmaDStarPlusB->fill(10.6,weight);
00123               _sigmaDStarPlusC->fill(10.6,weight);
00124             }
00125             const GenParticle * Dmeson = &p.genParticle();
00126             const GenVertex* dv = p.genParticle().end_vertex();
00127             bool D0decay(false), Pi0decay(false), Piplusdecay(false), Dplusdecay(false);
00128 
00129             for (GenVertex::particles_out_const_iterator
00130                    pp = dv->particles_out_const_begin();
00131                  pp != dv->particles_out_const_end(); ++pp) {
00132               if (abs((*pp)->pdg_id()) == 421) {
00133                 Dmeson = *pp;
00134                 D0decay = true;
00135               } else if (abs((*pp)->pdg_id()) == 411) {
00136                 Dmeson = *pp;
00137                 Dplusdecay = true;
00138               } else if (abs((*pp)->pdg_id()) == 111) {
00139                 Pi0decay = true;
00140               } else if (abs((*pp)->pdg_id()) == 211) {
00141                 Piplusdecay = true;
00142               }
00143             }
00144             if (D0decay && Piplusdecay && checkDecay(*Dmeson)) {
00145               if (onresonance)
00146                 _histXpDstarplus2D0_R->fill(xp, s*weight);
00147               else
00148                 _histXpDstarplus2D0_C->fill(xp, s*weight);
00149             }
00150             else if (Dplusdecay && Pi0decay && checkDecay(*Dmeson)) {
00151               if (onresonance)
00152                 _histXpDstarplus2Dplus_R->fill(xp, s*weight);
00153               else
00154                 _histXpDstarplus2Dplus_C->fill(xp, s*weight);
00155             }
00156             else {
00157               MSG_WARNING("Unexpected D* decay!");
00158             }
00159             if (onresonance) {
00160               _histXpDstarplus2D0_R_N->fill(xp, weight);
00161               _histXpDstarplus2Dplus_R_N->fill(xp, weight);
00162             }
00163             else {
00164               _histXpDstarplus2D0_C_N->fill(xp, weight);
00165               _histXpDstarplus2Dplus_C_N->fill(xp, weight);
00166             }
00167             break;
00168             }
00169 
00170           case 423:
00171             MSG_DEBUG("D*0 found");
00172             mH2 = 4.02793; // 2.00697**2
00173             xp = mom/sqrt(s/4.0 - mH2);
00174             if(!onresonance) _sigmaDStar0    ->fill(10.6,weight);
00175             MSG_DEBUG("xp = " << xp);
00176             const GenParticle * Dmeson = &p.genParticle();
00177             const GenVertex* dv = p.genParticle().end_vertex();
00178             bool D0decay(false), Pi0decay(false);
00179             for (GenVertex::particles_out_const_iterator
00180                    pp = dv->particles_out_const_begin();
00181                  pp != dv->particles_out_const_end(); ++pp) {
00182               if (abs((*pp)->pdg_id()) == 421) {
00183                 Dmeson = *pp;
00184                 D0decay = true;
00185               }
00186               else if (abs((*pp)->pdg_id()) == 111) {
00187                 Pi0decay = true;
00188               }
00189             }
00190             if (D0decay && Pi0decay && checkDecay(*Dmeson)) {
00191               if (onresonance)
00192                 _histXpDstar0_R->fill(xp, s*weight);
00193               else {
00194                 _histXpDstar0_C->fill(xp, s*weight);
00195               }
00196             }
00197             if (onresonance)
00198               _histXpDstar0_R_N->fill(xp, weight);
00199             else {
00200               _histXpDstar0_C_N->fill(xp, weight);
00201             }
00202             break;
00203         }
00204       }
00205     } // analyze
00206 
00207 
00208     void finalize() {
00209       scale(_histXpDstarplus2D0_R, crossSection()/nanobarn/sumOfWeights());
00210       scale(_histXpD0_R, crossSection()/nanobarn/sumOfWeights());
00211       scale(_histXpDplus_R, crossSection()/nanobarn/sumOfWeights());
00212       scale(_histXpDplus_s_R, crossSection()/nanobarn/sumOfWeights());
00213       scale(_histXpLambda_c_R, crossSection()/nanobarn/sumOfWeights());
00214       scale(_histXpDstarplus2Dplus_R, crossSection()/nanobarn/sumOfWeights());
00215       scale(_histXpDstar0_R, crossSection()/nanobarn/sumOfWeights());
00216 
00217       scale(_histXpDstarplus2D0_C, crossSection()/nanobarn/sumOfWeights());
00218       scale(_histXpD0_C, crossSection()/nanobarn/sumOfWeights());
00219       scale(_histXpDplus_C, crossSection()/nanobarn/sumOfWeights());
00220       scale(_histXpDplus_s_C, crossSection()/nanobarn/sumOfWeights());
00221       scale(_histXpLambda_c_C, crossSection()/nanobarn/sumOfWeights());
00222       scale(_histXpDstarplus2Dplus_C, crossSection()/nanobarn/sumOfWeights());
00223       scale(_histXpDstar0_C, crossSection()/nanobarn/sumOfWeights());
00224 
00225       normalize(_histXpDstarplus2D0_R_N);
00226       normalize(_histXpD0_R_N);
00227       normalize(_histXpDplus_R_N);
00228       normalize(_histXpDplus_s_R_N);
00229       normalize(_histXpLambda_c_R_N);
00230       normalize(_histXpDstarplus2Dplus_R_N);
00231       normalize(_histXpDstar0_R_N);
00232 
00233       normalize(_histXpDstarplus2D0_C_N);
00234       normalize(_histXpD0_C_N);
00235       normalize(_histXpDplus_C_N);
00236       normalize(_histXpDplus_s_C_N);
00237       normalize(_histXpLambda_c_C_N);
00238       normalize(_histXpDstarplus2Dplus_C_N);
00239       normalize(_histXpDstar0_C_N);
00240 
00241       scale(_sigmaD0, crossSection()/picobarn/sumOfWeights());
00242       scale(_sigmaDPlus, crossSection()/picobarn/sumOfWeights());
00243       scale(_sigmaDs, crossSection()/picobarn/sumOfWeights());
00244       scale(_sigmaLambdac, crossSection()/picobarn/sumOfWeights());
00245       scale(_sigmaDStar0, crossSection()/picobarn/sumOfWeights());
00246       scale(_sigmaDStarPlusA, crossSection()/picobarn/sumOfWeights());
00247       scale(_sigmaDStarPlusB, crossSection()/picobarn/sumOfWeights());
00248       scale(_sigmaDStarPlusC, crossSection()/picobarn/sumOfWeights());
00249     } // finalize
00250 
00251 
00252     void init() {
00253       addProjection(Beam(), "Beams");
00254       addProjection(UnstableFinalState(), "UFS");
00255 
00256       // continuum cross sections
00257       _sigmaD0         = bookHisto1D(1,1,1);
00258       _sigmaDPlus      = bookHisto1D(1,1,2);
00259       _sigmaDs         = bookHisto1D(1,1,3);
00260       _sigmaLambdac    = bookHisto1D(1,1,4);
00261       _sigmaDStar0     = bookHisto1D(1,1,5);
00262       _sigmaDStarPlusA = bookHisto1D(1,1,6);
00263       _sigmaDStarPlusB = bookHisto1D(1,1,7);
00264       _sigmaDStarPlusC = bookHisto1D(1,1,8);
00265 
00266       // histograms for continuum data (sqrt(s) = 10.52 GeV)
00267       _histXpDstarplus2D0_C    = bookHisto1D(2, 1, 1);
00268       _histXpD0_C              = bookHisto1D(3, 1, 1);
00269       _histXpDplus_C           = bookHisto1D(4, 1, 1);
00270       _histXpDplus_s_C         = bookHisto1D(5, 1, 1);
00271       _histXpLambda_c_C        = bookHisto1D(6, 1, 1);
00272       _histXpDstarplus2Dplus_C = bookHisto1D(7, 1, 1);
00273       _histXpDstar0_C          = bookHisto1D(8, 1, 1);
00274 
00275       // histograms for on-resonance data (sqrt(s) = 10.58 GeV)
00276       _histXpDstarplus2D0_R    = bookHisto1D(9, 1, 1);
00277       _histXpD0_R              = bookHisto1D(10, 1, 1);
00278       _histXpDplus_R           = bookHisto1D(11, 1, 1);
00279       _histXpDplus_s_R         = bookHisto1D(12, 1, 1);
00280       _histXpLambda_c_R        = bookHisto1D(13, 1, 1);
00281       _histXpDstarplus2Dplus_R = bookHisto1D(14, 1, 1);
00282       _histXpDstar0_R          = bookHisto1D(15, 1, 1);
00283 
00284       // histograms for continuum data (sqrt(s) = 10.52 GeV)
00285       _histXpDstarplus2D0_C_N    = bookHisto1D(2, 1, 2);
00286       _histXpD0_C_N              = bookHisto1D(3, 1, 2);
00287       _histXpDplus_C_N           = bookHisto1D(4, 1, 2);
00288       _histXpDplus_s_C_N         = bookHisto1D(5, 1, 2);
00289       _histXpLambda_c_C_N        = bookHisto1D(6, 1, 2);
00290       _histXpDstarplus2Dplus_C_N = bookHisto1D(7, 1, 2);
00291       _histXpDstar0_C_N          = bookHisto1D(8, 1, 2);
00292 
00293       // histograms for on-resonance data (sqrt(s) = 10.58 GeV)
00294       _histXpDstarplus2D0_R_N    = bookHisto1D(9, 1, 2);
00295       _histXpD0_R_N              = bookHisto1D(10, 1, 2);
00296       _histXpDplus_R_N           = bookHisto1D(11, 1, 2);
00297       _histXpDplus_s_R_N         = bookHisto1D(12, 1, 2);
00298       _histXpLambda_c_R_N        = bookHisto1D(13, 1, 2);
00299       _histXpDstarplus2Dplus_R_N = bookHisto1D(14, 1, 2);
00300       _histXpDstar0_R_N          = bookHisto1D(15, 1, 2);
00301 
00302     } // init
00303 
00304   private:
00305 
00306     //@{
00307     /// Histograms
00308 
00309     // Histograms for the continuum cross sections
00310     Histo1DPtr _sigmaD0;
00311     Histo1DPtr _sigmaDPlus;
00312     Histo1DPtr _sigmaDs;
00313     Histo1DPtr _sigmaLambdac;
00314     Histo1DPtr _sigmaDStar0;
00315     Histo1DPtr _sigmaDStarPlusA;
00316     Histo1DPtr _sigmaDStarPlusB;
00317     Histo1DPtr _sigmaDStarPlusC;
00318 
00319     // histograms for continuum data (sqrt(s) = 10.52 GeV)
00320     Histo1DPtr _histXpDstarplus2D0_C;
00321     Histo1DPtr _histXpD0_C;
00322     Histo1DPtr _histXpDplus_C;
00323     Histo1DPtr _histXpDplus_s_C;
00324     Histo1DPtr _histXpLambda_c_C;
00325     Histo1DPtr _histXpDstarplus2Dplus_C;
00326     Histo1DPtr _histXpDstar0_C;
00327     Histo1DPtr _histXpDstarplus2D0_C_N;
00328     Histo1DPtr _histXpD0_C_N;
00329     Histo1DPtr _histXpDplus_C_N;
00330     Histo1DPtr _histXpDplus_s_C_N;
00331     Histo1DPtr _histXpLambda_c_C_N;
00332     Histo1DPtr _histXpDstarplus2Dplus_C_N;
00333     Histo1DPtr _histXpDstar0_C_N;
00334 
00335     // histograms for on-resonance data (sqrt(s) = 10.58 GeV)
00336     Histo1DPtr _histXpDstarplus2D0_R;
00337     Histo1DPtr _histXpD0_R;
00338     Histo1DPtr _histXpDplus_R;
00339     Histo1DPtr _histXpDplus_s_R;
00340     Histo1DPtr _histXpLambda_c_R;
00341     Histo1DPtr _histXpDstarplus2Dplus_R;
00342     Histo1DPtr _histXpDstar0_R;
00343     Histo1DPtr _histXpDstarplus2D0_R_N;
00344     Histo1DPtr _histXpD0_R_N;
00345     Histo1DPtr _histXpDplus_R_N;
00346     Histo1DPtr _histXpDplus_s_R_N;
00347     Histo1DPtr _histXpLambda_c_R_N;
00348     Histo1DPtr _histXpDstarplus2Dplus_R_N;
00349     Histo1DPtr _histXpDstar0_R_N;
00350     //@}
00351 
00352     bool checkDecay(const GenParticle & p) {
00353       unsigned int nstable=0,npip=0,npim=0;
00354       unsigned int np=0,nap=0,nKp=0,nKm=0,nPhi=0;
00355       findDecayProducts(p,nstable,npip,npim,
00356                         np,nap,nKp,nKm,nPhi);
00357       int id = p.pdg_id();
00358       //D0
00359       if(id==421) {
00360         if(nstable==2&&nKm==1&&npip==1) return true;
00361       }
00362       //Dbar0
00363       else if(id==-421) {
00364         if(nstable==2&&nKp==1&&npim==1) return true;
00365       }
00366       // D+
00367       else if(id==411) {
00368         if(nstable==3&&nKm==1&&npip==2) return true;
00369       }
00370       // D-
00371       else if(id==-411) {
00372         if(nstable==3&&nKp==1&&npim==2) return true;
00373       }
00374       // D_s+
00375       else if(id==431) {
00376         if(nstable==1&&nPhi==1&&npip==1) return true;
00377       }
00378       // D_s-
00379       else if(id==-431) {
00380         if(nstable==1&&nPhi==1&&npim==1) return true;
00381       }
00382       // Lambda_c
00383       else if(id==4122) {
00384         if(nstable==3&&np==1&&npip==1&&nKm==1) return true;
00385       }
00386       // Lambda_c bar
00387       else if(id==-4122) {
00388         if(nstable==3&&nap==1&&npim==1&&nKp==1) return true;
00389       }
00390       return false;
00391     }
00392 
00393     void findDecayProducts(const GenParticle & p,
00394                            unsigned int & nstable, unsigned int & npip,
00395                            unsigned int & npim   , unsigned int & np,
00396                            unsigned int & nap    , unsigned int & nKp,
00397                            unsigned int & nKm    , unsigned int & nPhi) {
00398       const GenVertex* dv = p.end_vertex();
00399       for (GenVertex::particles_out_const_iterator
00400              pp = dv->particles_out_const_begin();
00401            pp != dv->particles_out_const_end(); ++pp) {
00402         int id = (*pp)->pdg_id();
00403         if(id==333)
00404           ++nPhi;
00405         else if(id==111||id==221)
00406           ++nstable;
00407         else if((*pp)->end_vertex())
00408           findDecayProducts(**pp,nstable,npip,npim,np,nap,nKp,nKm,nPhi);
00409         else {
00410           if(id!=22) ++nstable;
00411           if     (id ==   211) ++npip;
00412           else if(id ==  -211) ++npim;
00413           else if(id ==  2212) ++np;
00414           else if(id == -2212) ++nap;
00415           else if(id ==   321) ++nKp;
00416           else if(id ==  -321) ++nKm;
00417         }
00418       }
00419     }
00420   };
00421 
00422 
00423   // The hook for the plugin system
00424   DECLARE_RIVET_PLUGIN(BELLE_2006_S6265367);
00425 
00426 }