Rivet analyses referenceBESIII_2017_I1624548Analysis of $\psi(2S)\to\gamma\chi_{c2}$ decays using $\chi_{c2}\to\gamma\gamma$Experiment: BESIII (BEPC) Inspire ID: 1624548 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (1.8, 1.8) GeV Run details:
Analysis of the angular distribution of the photons and leptons produced in $e^+e^-\to \psi(2S) \to \gamma\chi_{c2}$ followed by $\chi_{c2}\to\gamma \gamma$. Gives information about the decay and is useful for testing correlations in charmonium decays. N.B. the data was read from the figures in the paper and is not corrected and should only be used qualatively. Source code: BESIII_2017_I1624548.cc 1// -*- C++ -*-
2#include "Rivet/Analysis.hh"
3#include "Rivet/Projections/Beam.hh"
4#include "Rivet/Projections/FinalState.hh"
5#include "Rivet/Projections/UnstableParticles.hh"
6
7namespace Rivet {
8
9
10 /// @brief psi(2S) -> gamma chi_c1,2
11 class BESIII_2017_I1624548 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2017_I1624548);
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 declare(Beam(), "Beams");
25 declare(UnstableParticles(Cuts::pid==445), "UFS");
26 declare(FinalState(), "FS");
27 for(unsigned int ix=0;ix<3;++ix)
28 book(_h[ix],1,1,1+ix);
29 }
30
31 void findChildren(const Particle & p,map<long,int> & nRes, int &ncount) {
32 for( const Particle &child : p.children()) {
33 if(child.children().empty()) {
34 nRes[child.pid()]-=1;
35 --ncount;
36 }
37 else
38 findChildren(child,nRes,ncount);
39 }
40 }
41
42 /// Perform the per-event analysis
43 void analyze(const Event& event) {
44 // get the axis, direction of incoming electron
45 const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
46 Vector3 axis;
47 if(beams.first.pid()>0)
48 axis = beams.first .momentum().p3().unit();
49 else
50 axis = beams.second.momentum().p3().unit();
51 // types of final state particles
52 const FinalState& fs = apply<FinalState>(event, "FS");
53 map<long,int> nCount;
54 int ntotal(0);
55 for (const Particle& p : fs.particles()) {
56 nCount[p.pid()] += 1;
57 ++ntotal;
58 }
59 // loop over chi_c states
60 Particle chi;
61 bool matched = false;
62 const UnstableParticles & ufs = apply<UnstableParticles>(event, "UFS");
63 for (const Particle& p : ufs.particles()) {
64 if(p.children().empty()) continue;
65 map<long,int> nRes=nCount;
66 int ncount = ntotal;
67 findChildren(p,nRes,ncount);
68 if(ncount==1) {
69 matched = true;
70 for(auto const & val : nRes) {
71 if(val.first==PID::PHOTON) {
72 if(val.second!=1) {
73 matched = false;
74 break;
75 }
76 }
77 else if(val.second!=0) {
78 matched = false;
79 break;
80 }
81 }
82 if(matched) {
83 chi=p;
84 break;
85 }
86 }
87 }
88 if(!matched) vetoEvent;
89 // have chi_c find psi2S
90 if(chi.parents().empty() || chi.children().size()!=2) vetoEvent;
91 Particle psi2S = chi.parents()[0];
92 if(psi2S.pid()!=100443 || psi2S.children().size()!=2) vetoEvent;
93 // then the first photon
94 Particle gamma1;
95 if(psi2S.children()[0].pid()==PID::PHOTON)
96 gamma1 = psi2S.children()[0];
97 else if(psi2S.children()[1].pid()==PID::PHOTON)
98 gamma1 = psi2S.children()[1];
99 else
100 vetoEvent;
101 // and second photon
102 Particle gamma2;
103 if(chi.children()[0].pid()==PID::PHOTON &&
104 chi.children()[1].pid()==PID::PHOTON) {
105 gamma2 = chi.children()[0];
106 }
107 else
108 vetoEvent;
109 // first angle of gamma1 w.r.t beam
110 _h[0]->fill(axis.dot(gamma1.momentum().p3().unit()));
111 // axis in the chi frame
112 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(chi.momentum().betaVec());
113 Vector3 e1z = gamma1.momentum().p3().unit();
114 Vector3 e1y = e1z.cross(axis).unit();
115 Vector3 e1x = e1y.cross(e1z).unit();
116 // cos theta_2 and phi 2 distributions
117 FourMomentum pGamma2 = boost1.transform(gamma2.momentum());
118 Vector3 axis1 = pGamma2.p3().unit();
119 _h[1]->fill(e1z.dot(axis1));
120 double phi2 = atan2(e1y.dot(axis1),e1x.dot(axis1));
121 if(phi2<0) phi2+=2.*M_PI;
122 _h[2]->fill(phi2);
123 }
124
125
126 /// Normalise histograms etc., after the run
127 void finalize() {
128 for(unsigned int ix=0;ix<3;++ix) {
129 normalize(_h[ix],1.,false);
130 }
131 }
132
133 /// @}
134
135
136 /// @name Histograms
137 /// @{
138 Histo1DPtr _h[3];
139 /// @}
140
141
142 };
143
144
145 RIVET_DECLARE_PLUGIN(BESIII_2017_I1624548);
146
147}
|