Rivet analyses
Azimuthal asymmetries in inclusive charged ππ pair production at 10.58 GeV
Experiment: BABAR (PEP-II)
Inspire ID: 1254862
Status: VALIDATED NOHEPDATA
Authors: - Peter Richardson
References: - Phys.Rev.D 90 (2014) 5, 052003
Beams: e+ e-
Beam energies: (5.3, 5.3)GeV
Run details: - e+e- to hadrons
Measurement of azimuthal asymmetries in inclusive charged ππ pair production at $\sqrt{s}=10.58$ GeV by the BABAR experiment. Only the distributions in z1, 2 are currently implemented.
Source
code:BABAR_2014_I1254862.cc
// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/Thrust.hh"
#include "Rivet/Projections/FinalState.hh"
#include "Rivet/Projections/Beam.hh"
#include "Rivet/Tools/Random.hh"
namespace Rivet {
/// @brief azimuthal asymmetries in pipi
class BABAR_2014_I1254862 : public Analysis {
public:
/// Constructor
RIVET_DEFAULT_ANALYSIS_CTOR(BABAR_2014_I1254862);
/// @name Analysis methods
/// @{
/// Book histograms and initialise projections before the run
void init() {
// projections
const FinalState fs;
declare(fs,"FS");
declare(Thrust(fs),"Thrust");
declare(Beam(), "Beams");
// declare the histos for the distributions
string charge[3] = {"Like","Opposite","All"};
unsigned int nbin=20;
for (unsigned int icharge=0;icharge<3;++icharge) {
for (unsigned int ibin1=0;ibin1<6;++ibin1) {
for (unsigned int ibin2=0;ibin2<6;++ibin2) {
book(_h_thrust[icharge][ibin1][ibin2],
"TMP/h_thrust_"+charge[icharge]+"_" +toString(ibin1+1) + "_" + toString(ibin2+1),
nbin, 0., M_PI);
book(_h_hadron[icharge][ibin1][ibin2],
"TMP/h_hadron_"+charge[icharge]+"_" +toString(ibin1+1) + "_" + toString(ibin2+1),
nbin, 0., M_PI);
}
}
}
}
unsigned int iBin(double z) {
if (z<.2) return 0;
else if(z<.3) return 1;
else if(z<.4) return 2;
else if(z<.5) return 3;
else if(z<.7) return 4;
else return 5;
}
/// Perform the per-event analysis
void analyze(const Event& event) {
// get the axis, direction of incoming electron
const ParticlePair& beams = apply<Beam>(event, "Beams").beams();
Vector3 axis1;
if (beams.first.pid()>0) {
axis1 = beams.first .momentum().p3().unit();
}
else {
axis1 = beams.second.momentum().p3().unit();
}
// apply thrust cuts T > 0.8
Thrust thrust = apply<Thrust>(event,"Thrust");
if(thrust.thrust()<=0.8) vetoEvent;
// construct x,y,z axes for thrust defn
ThreeVector t_z = thrust.thrustAxis();
ThreeVector t_x = (axis1-t_z.dot(axis1)*t_z).unit();
ThreeVector t_y = t_z.cross(t_x);
// loop over the particles
Particles charged = apply<FinalState>(event,"FS").particles(Cuts::abspid==PID::PIPLUS);
for (unsigned int ix=0;ix<charged.size();++ix) {
// z and angle cut
const double x1=2.*charged[ix].momentum().t()/sqrtS();
if (x1<0.15||x1>.9) continue;
double dot1 = t_z.dot(charged[ix].p3().unit());
if (abs(dot1)<sqrt(0.5)) continue;
for (unsigned int iy=ix+1;iy<charged.size();++iy) {
const double x2=2.*charged[iy].momentum().t()/sqrtS();
// z and angle cut
if (x2<0.15||x2>.9) continue;
double dot2 = t_z.dot(charged[iy].p3().unit());
if (abs(dot2)<sqrt(.5) || dot1*dot2>0.) continue;
Particle p1=charged[ix], p2=charged[iy];
double z1(x1),z2(x2);
// randomly order the particles
if (rand01() < 0.5 ) {
swap(p1,p2);
swap(z1,z2);
}
// thrust def
double phi12 = atan2(p1.p3().dot(t_y),p1.p3().dot(t_x))+atan2(p2.p3().dot(t_y),p2.p3().dot(t_x));
if (phi12>M_PI) phi12 -= 2*M_PI;
if (phi12<-M_PI) phi12 += 2*M_PI;
if (phi12<0.) phi12 = -phi12;
// hadron defn
ThreeVector h_z = p2.p3().unit();
ThreeVector h_x = (axis1-h_z.dot(axis1)*h_z).unit();
ThreeVector pt1 = p1.p3()-h_z.dot(p1.p3())*h_z;
double phi0 = pt1.angle(h_x);
if (phi0>M_PI) phi0 -= 2*M_PI;
if (phi0<-M_PI) phi0 += 2*M_PI;
unsigned int ibin1=iBin(z1);
unsigned int ibin2=iBin(z2);
if (p1.pid()==p2.pid()) {
_h_thrust[0][ibin1][ibin2]->fill(phi12);
_h_hadron[0][ibin1][ibin2]->fill(phi0);
}
else {
_h_thrust[1][ibin1][ibin2]->fill(phi12);
_h_hadron[1][ibin1][ibin2]->fill(phi0);
}
_h_thrust[2][ibin1][ibin2]->fill(phi12);
_h_hadron[2][ibin1][ibin2]->fill(phi0);
}
}
}
pair<double,double> calcAsymmetry(Estimate1DPtr hist,double fact=1.) {
double sum1(0.),sum2(0.);
for (const auto& bin : hist->bins() ) {
double Oi = bin.val();
if (Oi==0. || std::isnan(Oi) ) continue;
double ai = 1.;
double bi = (sin(fact*bin.xMax())-sin(fact*bin.xMin()))/(bin.xMax()-bin.xMin())/fact;
double Ei = bin.errAvg();
sum1 += sqr(bi/Ei);
sum2 += bi/sqr(Ei)*(Oi-ai);
}
if (sum1==0.) return make_pair(0.,0.);
return make_pair(sum2/sum1*1e2,sqrt(1./sum1)*1e2);
}
/// Normalise histograms etc., after the run
void finalize() {
for (unsigned int ibin1=0;ibin1<6;++ibin1) {
Estimate1DPtr hthrustUL,hhadronUL;
book(hthrustUL,1,1+ibin1,1);
book(hhadronUL,1,1+ibin1,2);
Estimate1DPtr hthrustUC,hhadronUC;
book(hthrustUC,2,1+ibin1,1);
book(hhadronUC,2,1+ibin1,2);
for (unsigned int ibin2=0;ibin2<6;++ibin2) {
for (unsigned int icharge=0;icharge<3;++icharge) {
normalize(_h_thrust[icharge][ibin1][ibin2]);
normalize(_h_hadron[icharge][ibin1][ibin2]);
}
Estimate1DPtr htemp;
book(htemp,"TMP/R_thrust_UL_"+toString(ibin1)+"_"+toString(ibin2),_h_thrust[0][ibin1][ibin2]->xEdges());
// UL thrust
divide(_h_thrust[1][ibin1][ibin2],_h_thrust[0][ibin1][ibin2],htemp);
pair<double,double> asym = calcAsymmetry(htemp);
hthrustUL->bin(ibin2+1).set(asym.first,asym.second);
// UC thrust
book(htemp,"TMP/R_thrust_UC_"+toString(ibin1)+"_"+toString(ibin2),_h_thrust[1][ibin1][ibin2]->xEdges());
divide(_h_thrust[1][ibin1][ibin2],_h_thrust[2][ibin1][ibin2],htemp);
asym = calcAsymmetry(htemp);
hthrustUC->bin(ibin2+1).set(asym.first,asym.second);
// UL hadron
book(htemp,"TMP/R_hadron_UL_"+toString(ibin1)+"_"+toString(ibin2),_h_hadron[1][ibin1][ibin2]->xEdges());
divide(_h_hadron[1][ibin1][ibin2],_h_hadron[0][ibin1][ibin2],htemp);
asym = calcAsymmetry(htemp);
hhadronUL->bin(ibin2+1).set(asym.first,asym.second);
// UC hadron
book(htemp,"TMP/R_hadron_UC_"+toString(ibin1)+"_"+toString(ibin2),_h_hadron[1][ibin1][ibin2]->xEdges());
divide(_h_hadron[1][ibin1][ibin2],_h_hadron[2][ibin1][ibin2],htemp);
asym = calcAsymmetry(htemp);
hhadronUC->bin(ibin2+1).set(asym.first,asym.second);
}
}
}
/// @}
/// @name Histograms
/// @{
Histo1DPtr _h_thrust[3][6][6],_h_hadron[3][6][6];
/// @}
};
RIVET_DECLARE_PLUGIN(BABAR_2014_I1254862);
}