Rivet analyses referenceBESIII_2012_I1079921Mass and angular distributions in near the thresholdExperiment: BESIII (BEPC) Inspire ID: 1079921 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (1.6, 1.6); (1.8, 1.8) GeV Run details:
Mass and angular distributions in near the threshold Source code: BESIII_2012_I1079921.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/Beam.hh"
4#include "Rivet/Projections/UnstableParticles.hh"
5#include "Rivet/Projections/DecayedParticles.hh"
6
7namespace Rivet {
8
9
10 /// @brief J/psi -> gamma p pbar
11 class BESIII_2012_I1079921 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2012_I1079921);
16
17
18 /// @name Analysis methods
19 /// @{
20
21 /// Book histograms and initialise projections before the run
22 void init() {
23 // Initialise and register projections
24 UnstableParticles ufs = UnstableParticles(Cuts::abspid==443 or
25 Cuts::abspid==100443);
26 declare(ufs, "UFS");
27 DecayedParticles PSI(ufs);
28 declare(PSI, "PSI");
29 declare(Beam(), "Beams");
30 // book histos
31 if (isCompatibleWithSqrtS(3.1,0.001)) {
32 for(unsigned int ix=0;ix<4;++ix)
33 book(_h[ix],1,1,1+ix);
34 }
35 else if(isCompatibleWithSqrtS(3.686,0.001)) {
36 book(_h[0],2,1,1);
37 }
38 else {
39 throw Error("Unexpected sqrtS ! Only 3.1 and 3.686 GeV are supported");
40 }
41 }
42
43 // angle cuts due regions of BES calorimeter
44 bool vetoPhoton(const double & cTheta) {
45 return cTheta>0.92 || (cTheta>0.8 && cTheta<0.86);
46 }
47
48 /// Perform the per-event analysis
49 void analyze(const Event& event) {
50 // get the axis, direction of incoming electron
51 const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
52 Vector3 axis;
53 if(beams.first.pid()>0)
54 axis = beams.first .momentum().p3().unit();
55 else
56 axis = beams.second.momentum().p3().unit();
57 // find the J/psi decays
58 static const map<PdgId,unsigned int> & mode = { { 2212,1}, { -2212,1},{ 22,1}};
59 DecayedParticles PSI = apply<DecayedParticles>(event, "PSI");
60 if( PSI.decaying().size()!=1) vetoEvent;
61 if(sqrtS()>3.2 && PSI.decaying()[0].pid()==443) vetoEvent;
62 if(!PSI.modeMatches(0,3,mode)) vetoEvent;
63 const Particle & pp = PSI.decayProducts()[0].at( 2212)[0];
64 const Particle & pbar = PSI.decayProducts()[0].at(-2212)[0];
65 const Particle & gam = PSI.decayProducts()[0].at( 22)[0];
66 double mass = (pp.momentum()+pbar.momentum()).mass()-pp.mass()-pbar.mass();
67 _h[0]->fill(mass);
68 if(!_h[1] || mass>0.05) return;
69 double cTheta = axis.dot(gam.p3().unit());
70 // photon angle
71 if(vetoPhoton(abs(cTheta))) vetoEvent;
72 _h[1]->fill(cTheta);
73 // remaining angles
74 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(PSI.decaying()[0].momentum().betaVec());
75 FourMomentum pGamma = boost1.transform(gam.momentum());
76 FourMomentum pppbar = boost1.transform(pp.momentum()+pbar.momentum());
77 Vector3 e1z = pGamma.p3().unit();
78 Vector3 e1y = e1z.cross(axis).unit();
79 Vector3 e1x = e1y.cross(e1z).unit();
80 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pppbar.betaVec());
81 Vector3 axis2 = boost2.transform(boost1.transform(pp.momentum())).p3().unit();
82 _h[2]->fill(e1z.dot(axis2));
83 double phi = atan2(axis2.dot(e1y),axis2.dot(e1x))/M_PI*180.;
84 _h[3]->fill(phi);
85 }
86
87
88 /// Normalise histograms etc., after the run
89 void finalize() {
90 for(unsigned int ix=0;ix<4;++ix)
91 if(_h[ix]) normalize(_h[ix],1.,false);
92 }
93
94 /// @}
95
96
97 /// @name Histograms
98 /// @{
99 Histo1DPtr _h[4];
100 /// @}
101
102
103 };
104
105
106 RIVET_DECLARE_PLUGIN(BESIII_2012_I1079921);
107
108}
|