Rivet analyses referenceBESIII_2023_I2155157Mass and angular distributions in $J/\psi\to\gamma K^0_SK^0_S\pi^0$ decaysExperiment: BESIII (BEPC) Inspire ID: 2155157 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (1.6, 1.6) GeV Run details:
Measurement of mass and angular distributions in $J/\psi\to\gamma K^0_SK^0_S\pi^0$ decays. Source code: BESIII_2023_I2155157.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 KS0 KS0 pi0
11 class BESIII_2023_I2155157 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(BESIII_2023_I2155157);
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);
25 declare(ufs, "UFS");
26 DecayedParticles PSI(ufs);
27 PSI.addStable(PID::K0S);
28 PSI.addStable(PID::ETA);
29 PSI.addStable(PID::PI0);
30 declare(PSI, "PSI");
31 declare(Beam(), "Beams");
32 // Book histograms
33 for (unsigned int ix=0; ix<7; ++ix) {
34 book(_h[ix], 1, 1, 1+ix);
35 }
36 }
37
38 // angle cuts due regions of BES calorimeter
39 bool vetoPhoton(const double & cTheta) {
40 return cTheta>0.92 || (cTheta>0.8 && cTheta<0.86);
41 }
42
43 /// Perform the per-event analysis
44 void analyze(const Event& event) {
45 // get the axis, direction of incoming electron
46 const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
47 Vector3 axis;
48 if (beams.first.pid()>0) {
49 axis = beams.first .mom().p3().unit();
50 }
51 else {
52 axis = beams.second.mom().p3().unit();
53 }
54 // find the J/psi decays
55 DecayedParticles PSI = apply<DecayedParticles>(event, "PSI");
56 if ( PSI.decaying().size()!=1) vetoEvent;
57 if (!PSI.modeMatches(0,4,mode)) vetoEvent;
58 const Particle & pi0 = PSI.decayProducts()[0].at(111)[0];
59 const Particles& K0 = PSI.decayProducts()[0].at(310);
60 const Particle & gam = PSI.decayProducts()[0].at( 22)[0];
61 double cTheta = axis.dot(gam.p3().unit());
62 // photon angle cut
63 if (vetoPhoton(abs(cTheta))) vetoEvent;
64 // gamma pi omega mass cut
65 if (abs((pi0.mom()+gam.mom()).mass()-0.78266)<0.04) vetoEvent;
66 double mKKpi = (K0[0].mom()+K0[1].mom()+pi0.mom()).mass();
67 if (mKKpi>1.6) vetoEvent;
68 _h[0]->fill(mKKpi);
69 _h[1]->fill((K0[0].mom()+K0[1].mom()).mass());
70 _h[1]->fill((K0[0].mom()+pi0 .mom()).mass());
71 _h[2]->fill((K0[1].mom()+pi0 .mom()).mass());
72 _h[3]->fill(cTheta);
73 // remaining angles
74 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(PSI.decaying()[0].mom().betaVec());
75 FourMomentum pGamma = boost1.transform(gam.mom());
76 FourMomentum pHadron = boost1.transform(K0[0].mom()+K0[1].mom()+pi0.mom());
77 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pHadron.betaVec());
78 Vector3 axis1 = pGamma.p3().unit();
79 Vector3 axis2 = boost2.transform(boost1.transform(pi0.mom())).p3().unit();
80 for (unsigned int ix=0; ix<2; ++ix) {
81 axis2 = boost2.transform(boost1.transform(K0[ix].mom())).p3().unit();
82 _h[4]->fill(axis1.dot(axis2));
83 }
84 _h[5]->fill(axis1.dot(axis2));
85 FourMomentum pKK = boost2.transform(boost1.transform(K0[0].mom()+K0[1].mom()));
86 axis2=pKK.p3().unit();
87 LorentzTransform boost3 = LorentzTransform::mkFrameTransformFromBeta(pKK.betaVec());
88 for (unsigned ix=0; ix<2; ++ix) {
89 Vector3 axis3 = boost3.transform(boost2.transform(boost1.transform(K0[ix].mom()))).p3().unit();
90 _h[6]->fill(axis3.dot(axis2));
91 }
92 }
93
94
95 /// Normalise histograms etc., after the run
96 void finalize() {
97 normalize(_h, 1.0, false);
98 }
99
100 /// @}
101
102
103 /// @name Histograms
104 /// @{
105 Histo1DPtr _h[7];
106 const map<PdgId,unsigned int> mode = { { 111,1}, { 310,2},{ 22,1}};
107 /// @}
108
109
110 };
111
112
113 RIVET_DECLARE_PLUGIN(BESIII_2023_I2155157);
114
115}
|