rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BABAR_2007_I748372

Measurement of angular distributions in $B\to K^* + J/\psi, \psi(2S)$ and $\chi_{c1}$ decays
Experiment: BABAR (PEP-II)
Inspire ID: 748372
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 76 (2007) 031102
Beams: * *
Beam energies: ANY
Run details:
  • Any process producing B mesons, orginally Upsilon(4S) decay

Measurement of the $K^*$ helicity angle and transversality angles in the charmonium decay for $B\to K^* + J/\psi, \psi(2S)$ and $\chi_{c1}$ decays. The data were read from Figure 2 in the paper which are corrected for efficiency/acceptance.

Source code: BABAR_2007_I748372.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief B -> K* J/psi, psi(2S) and chi_c1
  9  class BABAR_2007_I748372 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2007_I748372);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21      // Initialise and register projections
 22      UnstableParticles ufs = UnstableParticles(Cuts::abspid==511 or
 23						Cuts::abspid==521);
 24      declare(ufs, "UFS");
 25      // histograms
 26      for(unsigned int ix=0;ix<3;++ix)
 27	for(unsigned int iy=0;iy<3;++iy)
 28	  for(unsigned int iz=0;iz<3;++iz)
 29	    book(_h[ix][iy][iz],1+ix,1+iy,1+iz);
 30    }
 31
 32    bool isOnium(int pid) const {
 33      return pid==443 || pid==100443 || pid==20443;
 34    }
 35
 36    bool isKstar(int pid) const {
 37      return pid==313 || pid==323;
 38    }
 39
 40    bool isK(int pid) const {
 41      return pid==130 || pid==310 || pid==311 || pid==321;
 42    }
 43
 44    bool isPi(int pid) const {
 45      return pid==211 || pid==111;
 46    }
 47
 48    /// Perform the per-event analysis
 49    void analyze(const Event& event) {
 50      UnstableParticles ufs = apply<UnstableParticles>(event, "UFS");
 51      for(const Particle & B : ufs.particles()) {
 52	if(B.children().size()!=2) continue;
 53	Particle onium,Kstar;
 54	if(isOnium(B.children()[0].abspid()) &&
 55	   isKstar(B.children()[1].abspid())) {
 56	  onium = B.children()[0];
 57	  Kstar = B.children()[1];
 58	}
 59	else if(isOnium(B.children()[1].abspid()) &&
 60		isKstar(B.children()[0].abspid())) {
 61	  onium = B.children()[1];
 62	  Kstar = B.children()[0];
 63	}
 64	else
 65	  continue;
 66	if(onium.children().size()!=2) continue;
 67	// find Kstar decay products
 68	Particle K;
 69	if(isK (Kstar.children()[0].abspid()) &&
 70	   isPi(Kstar.children()[1].abspid())) {
 71	  K = Kstar.children()[0];
 72	}
 73	else if(isK (Kstar.children()[1].abspid()) &&
 74		isPi(Kstar.children()[0].abspid())) {
 75	  K = Kstar.children()[1];
 76	}
 77	else
 78	  continue;
 79	int iK=-1;
 80	if(B.abspid()==511) {
 81	  if(K.abspid()==321) iK=0;
 82	  else continue;
 83	}
 84	else {
 85	  if(K.abspid()==321) iK=2;
 86	  else                iK=1;
 87	}
 88	// find onium decay products
 89	Particle oDec;
 90	if(onium.pid()==20443) {
 91	  if(onium.children()[0].pid()==443 &&
 92	     onium.children()[1].pid()==22) {
 93	    oDec = onium.children()[0];
 94	  }
 95	  else if(onium.children()[1].pid()==443 &&
 96		  onium.children()[0].pid()==22) {
 97	    oDec = onium.children()[1];
 98	  }
 99	  else
100	    continue;
101	}
102	else {
103	  if(onium.children()[0].pid()==-13 &&
104	     onium.children()[1].pid()== 13) {
105	    oDec = onium.children()[1];
106	  }
107	  else if(onium.children()[1].pid()==-13 &&
108		  onium.children()[0].pid()== 13) {
109	    oDec = onium.children()[0];
110	  }
111	  else if(onium.children()[0].pid()==-11 &&
112	     onium.children()[1].pid()== 11) {
113	    oDec = onium.children()[1];
114	  }
115	  else if(onium.children()[1].pid()==-11 &&
116		  onium.children()[0].pid()== 11) {
117	    oDec = onium.children()[0];
118	  }
119	  else
120	    continue;
121	}
122	// boost to B rest frame
123	LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(B.momentum().betaVec());
124	FourMomentum pOnium = boost.transform(onium.momentum());
125	FourMomentum pKstar = boost.transform(Kstar.momentum());
126	FourMomentum pK     = boost.transform(K    .momentum());
127	FourMomentum pOdec  = boost.transform(oDec .momentum());
128	// axes
129	Vector3 axisX = pOnium.p3().unit();
130	Vector3 axisY = (pK.p3()-axisX.dot(pK.p3())*axisX).unit();
131	Vector3 axisZ = axisX.cross(axisY).unit();
132	// kaon helicity angle
133	LorentzTransform boostK = LorentzTransform::mkFrameTransformFromBeta(pKstar.betaVec());
134	double cosK = -axisX.dot(boostK.transform(pK).p3().unit());
135	// transversality angles
136	LorentzTransform boostL = LorentzTransform::mkFrameTransformFromBeta(pOnium.betaVec());
137	Vector3 axisL = boostL.transform(pOdec).p3().unit();
138	double cosL = axisL.dot(axisZ);
139	double phiL = atan2(axisL.dot(axisY),axisL.dot(axisX));
140	if(phiL<0.) phiL +=2.*M_PI;
141	// fill hists
142	int iloc = onium.pid()==443 ? 0 : (onium.pid()==100443 ? 1 : 2);
143	_h[0][iloc][iK]->fill(cosK);
144	_h[1][iloc][iK]->fill(cosL);
145	_h[2][iloc][iK]->fill(phiL);
146      }
147    }
148
149
150    /// Normalise histograms etc., after the run
151    void finalize() {
152      for(unsigned int ix=0;ix<3;++ix)
153	for(unsigned int iy=0;iy<3;++iy)
154	  for(unsigned int iz=0;iz<3;++iz)
155	    normalize(_h[ix][iy][iz],1.,false);
156    }
157
158    /// @}
159
160
161    /// @name Histograms
162    /// @{
163    Histo1DPtr _h[3][3][3];
164    /// @}
165
166
167  };
168
169
170  RIVET_DECLARE_PLUGIN(BABAR_2007_I748372);
171
172}