rivet is hosted by Hepforge, IPPP Durham

Rivet analyses reference

BELLE_2011_I916712

$X(3872)$ mass and angular distributions using $B\to KX(3872)$
Experiment: BELLE (KEKB)
Inspire ID: 916712
Status: VALIDATED NOHEPDATA
Authors:
  • Peter Richardson
References:
  • Phys.Rev.D 84 (2011) 052004
Beams: * *
Beam energies: ANY
Run details:
  • Any process producting B+ and V0 mesons, origniallyu Upsilon(4S) decay

Measurement of mass and angular distribution for the production of $X(3872)$ in the decay $B\to KX(3872)$. There is no consensus as to the nature of the $X(3872)$ $c\bar{c}$ state and therefore we taken its PDG code to be 9030443, i.e. the first unused code for an undetermined spin one $c\bar{c}$ state. This can be changed using the PID option if a different code is used by the event generator performing the simulation.

Source code: BELLE_2011_I916712.cc
  1// -*- C++ -*-
  2#include "Rivet/Analysis.hh"
  3#include "Rivet/Projections/UnstableParticles.hh"
  4
  5namespace Rivet {
  6
  7
  8  /// @brief B -> K X(3872)
  9  class BELLE_2011_I916712 : public Analysis {
 10  public:
 11
 12    /// Constructor
 13    RIVET_DEFAULT_ANALYSIS_CTOR(BELLE_2011_I916712);
 14
 15
 16    /// @name Analysis methods
 17    /// @{
 18
 19    /// Book histograms and initialise projections before the run
 20    void init() {
 21      // set the PDG code
 22      _pid = getOption<double>("PID", 9030443);
 23      // projections
 24      declare(UnstableParticles(Cuts::abspid==511 ||
 25				Cuts::abspid==521), "UFS");
 26      // histograms
 27      for(unsigned int ix=0;ix<4;++ix)
 28	book(_h[ix],1+ix,1,1);
 29    }
 30    
 31    void findChildren(const Particle & p, Particles & pim, Particles & pip,
 32		      Particles & Jpsi, unsigned int &ncount) {
 33      for( const Particle &child : p.children()) {
 34	if(child.pid()==PID::PIPLUS) {
 35	  pip.push_back(child);
 36	  ncount+=1;
 37	}
 38	else if(child.pid()==PID::PIMINUS) {
 39	  pim.push_back(child);
 40	  ncount+=1;
 41	}
 42	else if(child.pid()==PID::JPSI) {
 43	  Jpsi.push_back(child);
 44	  ncount+=1;
 45	}
 46	else if(child.children().empty()) {
 47	  ncount+=1;
 48	}
 49    	else
 50    	  findChildren(child,pim,pip,Jpsi,ncount);
 51      }
 52    }
 53
 54    /// Perform the per-event analysis
 55    void analyze(const Event& event) {
 56      for(const Particle & p : apply<UnstableParticles>(event, "UFS").particles()) {
 57	if(p.children().empty()) continue;
 58	if(p.children().size()==1) continue;
 59	if(p.children().size()!=2) continue;
 60	Particle K,X;
 61	if(p.children()[0].pid()==_pid) {
 62	  X = p.children()[0];
 63	  K = p.children()[1];
 64	}
 65	else if(p.children()[1].pid()==_pid) {
 66	  X = p.children()[1];
 67	  K = p.children()[0];
 68	}
 69	else continue;
 70	if(K.abspid()!=311 && K.abspid()!=321 &&
 71	   K.abspid()!=310 && K.abspid()!=130) continue;
 72	// X(3872) decay
 73	unsigned int ncount=0;
 74	Particles pip,pim,Jpsi;
 75	findChildren(X,pim,pip,Jpsi,ncount);
 76	if( ncount!=3 || !(pim.size()==1 && pip.size()==1 && Jpsi.size()==1)) continue;
 77	_h[3]->fill((pip[0].momentum()+pim[0].momentum()).mass());
 78	LorentzTransform boostB = LorentzTransform::mkFrameTransformFromBeta(p.momentum().betaVec());
 79	Vector3 axisX = -boostB.transform(K.momentum()).p3().unit();
 80	FourMomentum pX   = boostB.transform(X      .momentum());
 81	LorentzTransform boostX = LorentzTransform::mkFrameTransformFromBeta(pX.betaVec());
 82	FourMomentum pPsi = boostX.transform(boostB.transform(Jpsi[0].momentum()));
 83	double cTheta = axisX.dot(pPsi.p3().unit());
 84	_h[0]->fill(cTheta);
 85	// finally the leptons from J/psi decay
 86	if(Jpsi[0].children().size()!=2) vetoEvent;
 87	if(Jpsi[0].children()[0].pid()!=-Jpsi[0].children()[1].pid()) vetoEvent;
 88	if(Jpsi[0].children()[0].abspid()!=PID::EMINUS &&
 89	   Jpsi[0].children()[0].abspid()!=PID::MUON) vetoEvent;
 90	Particle lm = Jpsi[0].children()[0];
 91	Particle lp = Jpsi[0].children()[1];
 92	Vector3 axispi = boostX.transform(boostB(pip[0].momentum())).p3().unit();
 93	Vector3 axisZ = axispi.cross(axisX).unit();
 94	Vector3 axisL = boostX.transform(boostB(lp.momentum())).p3().unit();
 95	_h[2]->fill(abs(axisZ.dot(axisL)));
 96	_h[1]->fill(abs(axisX.dot(axisL)));
 97      }
 98    }
 99
100
101    /// Normalise histograms etc., after the run
102    void finalize() {
103      for(unsigned int ix=0;ix<4;++ix)
104	normalize(_h[ix],1.,false);
105    }
106
107    /// @}
108
109
110    /// @name Histograms
111    /// @{
112    Histo1DPtr _h[4];
113    int _pid;
114    /// @}
115
116
117  };
118
119
120  RIVET_DECLARE_PLUGIN(BELLE_2011_I916712);
121
122}