Rivet analyses referenceCLEO_2009_I832707Analysis of $\psi(2S)\to\gamma\chi_{c(1,2)}$ decays using $\chi_{c(1,2)}\to J/\psi\gamma$Experiment: CLEO (CESR) Inspire ID: 832707 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_{c(1,2)}$ followed by $\chi_{c(1,2)}\to\gamma J/\psi$ and $J/\psi\to\ell^+\ell^-$ 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: CLEO_2009_I832707.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 CLEO_2009_I832707 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(CLEO_2009_I832707);
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==20443 || Cuts::pid==445), "UFS");
26 declare(FinalState(), "FS");
27 for(unsigned int ix=0;ix<2;++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 // then the J/psi and second photon
102 Particle JPsi,gamma2;
103 if(chi.children()[0].pid()==PID::PHOTON &&
104 chi.children()[1].pid()==443) {
105 gamma2 = chi.children()[0];
106 JPsi = chi.children()[1];
107 }
108 else if(chi.children()[1].pid()==PID::PHOTON &&
109 chi.children()[0].pid()==443) {
110 gamma2 = chi.children()[1];
111 JPsi = chi.children()[0];
112 }
113 else
114 vetoEvent;
115 // finally the leptons from J/psi decay
116 if(JPsi.children().size()!=2) vetoEvent;
117 if(JPsi.children()[0].pid()!=-JPsi.children()[1].pid()) vetoEvent;
118 if(JPsi.children()[0].abspid()!=PID::EMINUS &&
119 JPsi.children()[0].abspid()!=PID::MUON) vetoEvent;
120 Particle lm = JPsi.children()[0];
121 Particle lp = JPsi.children()[1];
122 if(lm.pid()<0) swap(lm,lp);
123 // type chi state
124 unsigned int ichi= chi.pid()==445 ? 1 : 0;
125 // axis in the chi frame
126 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(chi.momentum().betaVec());
127 FourMomentum pGamma2 = boost1.transform(gamma2.momentum());
128 Vector3 axis1 = pGamma2.p3().unit();
129 // cos thetaxs distributions
130 FourMomentum pJpsi = boost1.transform(JPsi.momentum());
131 FourMomentum plp = boost1.transform( lp.momentum());
132 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pJpsi.betaVec());
133 Vector3 axis2 = boost2.transform(plp).p3().unit();
134 Vector3 e2z = gamma2.momentum().p3().unit();
135 _h[ichi]->fill(abs(e2z.dot(axis2)));
136 }
137
138
139 /// Normalise histograms etc., after the run
140 void finalize() {
141 for(unsigned int ix=0;ix<2;++ix) {
142 normalize(_h[ix]);
143 }
144 }
145
146 /// @}
147
148
149 /// @name Histograms
150 /// @{
151 Histo1DPtr _h[2];
152 /// @}
153
154
155 };
156
157
158 RIVET_DECLARE_PLUGIN(CLEO_2009_I832707);
159
160}
|