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