Rivet analyses

MC analysis of ω, ϕ and a1 → 3π decays

Experiment: ()

Status: VALIDATED

Authors: - Peter Richardson

References: none listed

Beams: * *

Beam energies: ANY

Run details: - Any process producing a1, omega or phi mesons

Analysis of the mass distributions and Dalitz plots in a1 → 3π and ω, ϕ → π+ππ0 decays. Based on old Herwig++ internal analysis.

Source code:MC_DECAY_OMEGAPHIA1_3PION.cc

// -*- C++ -*-
#include "Rivet/Analysis.hh"
#include "Rivet/Projections/UnstableParticles.hh"

namespace Rivet {


  class MC_DECAY_OMEGAPHIA1_3PION : public Analysis {
  public:

    /// Constructor
    RIVET_DEFAULT_ANALYSIS_CTOR(MC_DECAY_OMEGAPHIA1_3PION);


    /// @name Analysis methods
    /// @{

    /// Book histograms and initialise projections before the run
    void init() {

      // Initialise and register projections
      declare(UnstableParticles(), "UFS");
      // book histograms a_1
      // Histograms for a_10 -> pi0pi0pi0
      book(_hist0, "hist0", 200, 0.2, 1.5);
      // // dalitz plot
      book(_dalitz0, "dalitz0", 50, 0.2, 1.5, 50, 0.2, 1.5);
      // Histograms for a_1+ -> pi0pi0pi+
      // Mass of the pi0pi0 pair
      book(_hist1A, "hist1A", 200, 0.2, 1.5);
      // Mass of the pi0pi+ pair
      book(_hist1B, "hist1B", 200, 0.2, 1.5);
      // dalitz plot
      book(_dalitz1, "dalitz1", 50, 0.2, 1.5, 50, 0.2, 1.5);
      // Histograms for a_10 -> pi+pi-pi0
      // Mass of the pi+pi- pair
      book(_hist2A, "hist2A", 200, 0.2, 1.5);
      // Mass of the pi+pi0 pair
      book(_hist2B, "hist2B", 200, 0.2, 1.5);
      // Mass of the pi-pi0 pair
      book(_hist2C, "hist2C", 200, 0.2, 1.5);
      // dalitz plot
      book(_dalitz2, "dalitz2", 50, 0.2, 1.5, 50, 0.2, 1.5);
      //  Histograms for a_1+ -> pi+pi+pi-
      // Mass of the pi+pi+ pair
      book(_hist3A, "hist3A", 200, 0.2, 1.5);
      // Mass of the pi+pi- pair
      book(_hist3B, "hist3B", 200, 0.2, 1.5);
      // dalitz plot
      book(_dalitz3, "dalitz3", 50, 0.2, 1.5, 50, 0.2, 1.5);

      // Book histograms omega/phi
      for (unsigned int ix = 0; ix < 2; ++ix) {
        double mmax = ix == 0 ? 0.8 : 1.0;
        std::ostringstream title1;
        title1 << "xhist_" << ix + 1;
        _h_xhist.push_back(Histo1DPtr());
        book(_h_xhist.back(), title1.str(), 200, -300., 300.);
        std::ostringstream title2;
        title2 << "yhist_" << ix + 1;
        _h_yhist.push_back(Histo1DPtr());
        book(_h_yhist.back(), title2.str(), 200, 0., 400.);
        std::ostringstream title3;
        title3 << "mplus_" << ix + 1;
        _h_mplus.push_back(Histo1DPtr());
        book(_h_mplus.back(), title3.str(), 200, 200., mmax * 1000.);
        std::ostringstream title4;
        title4 << "mminus_" << ix + 1;
        _h_mminus.push_back(Histo1DPtr());
        book(_h_mminus.back(), title4.str(), 200, 200., mmax * 1000.);
        std::ostringstream title5;
        title5 << "m0_" << ix + 1;
        _h_m0.push_back(Histo1DPtr());
        book(_h_m0.back(), title5.str(), 200, 200., mmax * 1000.);
        std::ostringstream title6;
        title6 << "dalitz_" << ix + 1;
        _h_dalitz.push_back(Histo2DPtr());
        book(_h_dalitz.back(), title6.str(), 50, 0.2, mmax, 50, 0.2, mmax);
      }
    }


    void findDecayProducts(const Particle& mother,
                           unsigned int& nstable,
                           Particles& pip,
                           Particles& pim,
                           Particles& pi0) {
      for (const Particle& p : mother.children()) {
        int id = p.pid();
        if (id == PID::PIPLUS) {
          pip.push_back(p);
          ++nstable;
        }
        else if (id == PID::PIMINUS) {
          pim.push_back(p);
          ++nstable;
        }
        else if (id == PID::PI0) {
          pi0.push_back(p);
          ++nstable;
        }
        else if (!p.children().empty()) {
          findDecayProducts(p, nstable, pip, pim, pi0);
        }
        else
          ++nstable;
      }
    }

    /// Perform the per-event analysis
    void analyze(const Event& event) {
      for (const Particle& meson : apply<UnstableParticles>(event, "UFS")
                                       .particles(Cuts::pid == PID::PHI || Cuts::pid == PID::OMEGA
                                                  || Cuts::abspid == 20213 || Cuts::pid == 20113)) {
        unsigned int nstable(0);
        Particles pip, pim, pi0;
        findDecayProducts(meson, nstable, pip, pim, pi0);
        if (nstable != 3) continue;
        if (meson.pid() < 0) {
          swap(pim, pip);
        }
        if (meson.pid() == PID::PHI || meson.pid() == PID::OMEGA) {
          if (pip.size() != 1 || pim.size() != 1 || pi0.size() != 1) continue;
          unsigned int iloc = meson.pid() == PID::OMEGA ? 0 : 1;
          LorentzTransform boost = LorentzTransform::mkFrameTransformFromBeta(meson.momentum().betaVec());
          FourMomentum pp = boost.transform(pip[0].momentum());
          FourMomentum pm = boost.transform(pim[0].momentum());
          FourMomentum p0 = boost.transform(pi0[0].momentum());
          double mp = (pp + p0).mass(), mm = (pm + pp).mass();
          _h_mplus[iloc]->fill(mp / MeV);
          _h_mminus[iloc]->fill((pm + p0).mass() / MeV);
          _h_m0[iloc]->fill(mm / MeV);
          double x = pp.t() - pm.t();
          double y = p0.t() - p0.mass();
          _h_xhist[iloc]->fill(x / MeV);
          _h_yhist[iloc]->fill(y / MeV);
          _h_dalitz[iloc]->fill(mp, mm);
        }
        else {
          // a_1+ -> pi+pi+pi-
          if (pip.size() == 2 && pim.size() == 1) {
            _hist3A->fill((pip[0].momentum() + pip[1].momentum()).mass());
            _hist3B->fill((pip[0].momentum() + pim[0].momentum()).mass());
            _hist3B->fill((pip[1].momentum() + pim[0].momentum()).mass());
            _dalitz3->fill((pip[0].momentum() + pim[0].momentum()).mass(),
                           (pip[1].momentum() + pim[0].momentum()).mass());
            _dalitz3->fill((pip[1].momentum() + pim[0].momentum()).mass(),
                           (pip[0].momentum() + pim[0].momentum()).mass());
          }
          // a_1+ -> pi0pi0pi+
          else if (pip.size() == 1 && pi0.size() == 2) {
            _hist1A->fill((pi0[0].momentum() + pi0[1].momentum()).mass());
            _hist1B->fill((pip[0].momentum() + pi0[0].momentum()).mass());
            _hist1B->fill((pip[0].momentum() + pi0[1].momentum()).mass());
            _dalitz1->fill((pip[0].momentum() + pi0[0].momentum()).mass(),
                           (pip[0].momentum() + pi0[1].momentum()).mass());
            _dalitz1->fill((pip[0].momentum() + pi0[1].momentum()).mass(),
                           (pip[0].momentum() + pi0[0].momentum()).mass());
          }
          // a_10 -> pi0pi0pi0
          else if (pi0.size() == 3) {
            _hist0->fill((pi0[0].momentum() + pi0[1].momentum()).mass());
            _hist0->fill((pi0[0].momentum() + pi0[2].momentum()).mass());
            _hist0->fill((pi0[1].momentum() + pi0[2].momentum()).mass());
            _dalitz0->fill((pi0[0].momentum() + pi0[1].momentum()).mass(),
                           (pi0[0].momentum() + pi0[2].momentum()).mass());
            _dalitz0->fill((pi0[0].momentum() + pi0[1].momentum()).mass(),
                           (pi0[1].momentum() + pi0[2].momentum()).mass());
            _dalitz0->fill((pi0[0].momentum() + pi0[2].momentum()).mass(),
                           (pi0[1].momentum() + pi0[2].momentum()).mass());
            _dalitz0->fill((pi0[0].momentum() + pi0[2].momentum()).mass(),
                           (pi0[0].momentum() + pi0[1].momentum()).mass());
            _dalitz0->fill((pi0[1].momentum() + pi0[2].momentum()).mass(),
                           (pi0[0].momentum() + pi0[1].momentum()).mass());
            _dalitz0->fill((pi0[1].momentum() + pi0[2].momentum()).mass(),
                           (pi0[0].momentum() + pi0[2].momentum()).mass());
          }
          // a_10 -> pi+pi-pi0
          else if (pi0.size() == 1 && pip.size() == 1 && pim.size() == 1) {
            _hist2A->fill((pim[0].momentum() + pip[0].momentum()).mass());
            _hist2B->fill((pip[0].momentum() + pi0[0].momentum()).mass());
            _hist2C->fill((pim[0].momentum() + pi0[0].momentum()).mass());
            _dalitz2->fill((pim[0].momentum() + pi0[0].momentum()).mass(),
                           (pip[0].momentum() + pi0[0].momentum()).mass());
          }
        }
      }
    }


    /// Normalise histograms etc., after the run
    void finalize() {
      // a_1
      normalize(_hist0);
      normalize(_dalitz0);
      normalize(_hist1A);
      normalize(_hist1B);
      normalize(_dalitz1);
      normalize(_hist2A);
      normalize(_hist2B);
      normalize(_hist2C);
      normalize(_dalitz2);
      normalize(_hist3A);
      normalize(_hist3B);
      normalize(_dalitz3);
      // omega/phi
      for (unsigned int ix = 0; ix < 2; ++ix) {
        normalize(_h_xhist[ix]);
        normalize(_h_yhist[ix]);
        normalize(_h_mplus[ix]);
        normalize(_h_mminus[ix]);
        normalize(_h_m0[ix]);
        normalize(_h_dalitz[ix]);
      }
    }

    /// @}

    /// @name Histograms a_1
    /// @{
    // Histograms for a_10 -> pi0pi0pi0
    Histo1DPtr _hist0;
    // dalitz plot
    Histo2DPtr _dalitz0;
    // Histograms for a_1+ -> pi0pi0pi+
    // Mass of the pi0pi0 pair
    Histo1DPtr _hist1A;
    // Mass of the pi0pi+ pair
    Histo1DPtr _hist1B;
    // dalitz plot
    Histo2DPtr _dalitz1;
    // Histograms for a_10 -> pi+pi-pi0
    // Mass of the pi+pi- pair
    Histo1DPtr _hist2A;
    // Mass of the pi+pi0 pair
    Histo1DPtr _hist2B;
    // Mass of the pi-pi0 pair
    Histo1DPtr _hist2C;
    // dalitz plot
    Histo2DPtr _dalitz2;
    //  Histograms for a_1+ -> pi+pi+pi-
    // Mass of the pi+pi+ pair
    Histo1DPtr _hist3A;
    // Mass of the pi+pi- pair
    Histo1DPtr _hist3B;
    // dalitz plot
    Histo2DPtr _dalitz3;
    /// @}

    /// @name Histograms omega/phi
    /// @{
    // Histogram for the x-values
    vector<Histo1DPtr> _h_xhist;
    // Histogram for the y-values
    vector<Histo1DPtr> _h_yhist;
    //  The mass of the \rho^+
    vector<Histo1DPtr> _h_mplus;
    //  The mass of the \rho^-
    vector<Histo1DPtr> _h_mminus;
    // The mass of the \rho^0
    vector<Histo1DPtr> _h_m0;
    // Dalitz plot
    vector<Histo2DPtr> _h_dalitz;
    /// @}
  };


  RIVET_DECLARE_PLUGIN(MC_DECAY_OMEGAPHIA1_3PION);

}