Rivet analyses referenceCLEOIII_2006_I694170Mass and angular distriubtions for $\Upsilon\to\pi^+\pi^-$, $K^+K^+$ and $p\bar{p}$Experiment: CLEOIII (CESR) Inspire ID: 694170 Status: VALIDATED NOHEPDATA Authors:
Beam energies: (4.7, 4.7) GeV Run details:
Mass and angular distriubtions for $\Upsilon\to\pi^+\pi^-$, $K^+K^+$ and $p\bar{p}$. The background subtracted data were read from the plots in the paper Source code: CLEOIII_2006_I694170.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 Upsilon -> gamma pi+pi- K+K- ppbar
11 class CLEOIII_2006_I694170 : public Analysis {
12 public:
13
14 /// Constructor
15 RIVET_DEFAULT_ANALYSIS_CTOR(CLEOIII_2006_I694170);
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==553);
25 declare(ufs, "UFS");
26 DecayedParticles UPS(ufs);
27 declare(UPS, "UPS");
28 declare(Beam(), "Beams");
29 // histos
30 for (unsigned int ix=0;ix<4;++ix) {
31 book(_h_mass[ix],1+ix,1,1);
32 }
33 for (unsigned int ix=0;ix<2;++ix) {
34 for (unsigned int iy=0;iy<2;++iy) {
35 book(_h_angle[ix][iy],5+ix,1,1+iy);
36 }
37 }
38 }
39
40
41 /// Perform the per-event analysis
42 void analyze(const Event& event) {
43 // get the axis, direction of incoming electron
44 const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
45 Vector3 axis;
46 if (beams.first.pid()>0) {
47 axis = beams.first .momentum().p3().unit();
48 }
49 else {
50 axis = beams.second.momentum().p3().unit();
51 }
52 unsigned int iprod[3]={211,321,2212};
53 const map<PdgId,unsigned int> modes[3] = {{ { 211 ,1}, { -211 ,1}, { 22,1}},
54 { { 321 ,1}, { -321 ,1}, { 22,1}},
55 { { 2212,1}, { -2212,1}, { 22,1}}};
56 DecayedParticles UPS = apply<DecayedParticles>(event, "UPS");
57 if (UPS.decaying().size()!=1) vetoEvent;
58 int imode=-1;
59 for (unsigned int ix=0; ix<3; ++ix) {
60 if (UPS.modeMatches(0,3,modes[ix])) {
61 imode=ix;
62 break;
63 }
64 }
65 if (imode<0) vetoEvent;
66 const Particle & Mp = UPS.decayProducts()[0].at( iprod[imode])[0];
67 const Particle & Mm = UPS.decayProducts()[0].at(-iprod[imode])[0];
68 FourMomentum pMM = Mp.momentum()+Mm.momentum();
69 double mass = pMM.mass();
70 if (imode==0) {
71 _h_mass[0]->fill(mass);
72 _h_mass[1]->fill(mass);
73 }
74 else {
75 _h_mass[1+imode]->fill(mass);
76 }
77 if (imode==2) return;
78 bool hasf2[2]={false,false};
79 for (const Particle & p : UPS.decaying()[0].children()) {
80 if (p.pid()==225) hasf2[0]=true;
81 else if (p.pid()==335) hasf2[1]=true;
82 }
83 if ( (imode==0 && hasf2[0]) || (imode==1&&hasf2[1]) ) {
84 const Particle & gam = UPS.decayProducts()[0].at(22)[0];
85 const double cTheta = axis.dot(gam.p3().unit());
86 _h_angle[imode][1]->fill(abs(cTheta));
87 // remaining angles
88 LorentzTransform boost1 = LorentzTransform::mkFrameTransformFromBeta(UPS.decaying()[0].mom().betaVec());
89 FourMomentum pGamma = boost1.transform(gam.mom());
90 pMM = boost1.transform(pMM);
91 Vector3 e1z = pGamma.p3().unit();
92 LorentzTransform boost2 = LorentzTransform::mkFrameTransformFromBeta(pMM.betaVec());
93 Vector3 axis2 = boost2.transform(boost1.transform(Mp.mom())).p3().unit();
94 _h_angle[imode][0]->fill(abs(e1z.dot(axis2)));
95 }
96 }
97
98
99 /// Normalise histograms etc., after the run
100 void finalize() {
101 for (unsigned int ix=0; ix<4; ++ix) {
102 normalize(_h_mass[ix], 1.0, false);
103 }
104 for (unsigned int ix=0; ix<2; ++ix) {
105 for (unsigned int iy=0; iy<2; ++iy) {
106 normalize(_h_angle[ix][iy], 1.0, false);
107 }
108 }
109 }
110
111 /// @}
112
113
114 /// @name Histograms
115 /// @{
116 Histo1DPtr _h_mass[4], _h_angle[2][2];
117 /// @}
118
119
120 };
121
122
123 RIVET_DECLARE_PLUGIN(CLEOIII_2006_I694170);
124
125}
|