#include "AddOns/Analysis/Triggers/DIS_Algorithm.H" #include "ATOOLS/Phys/Particle_List.H" #include "ATOOLS/Org/Run_Parameter.H" #include "ATOOLS/Org/Message.H" #include #include #include #ifdef PROFILE__all #define PROFILE__Analysis_Phase #endif #ifdef PROFILE__Analysis_Phase #include "prof.hh" #else #define PROFILE_HERE {} #define PROFILE_LOCAL(LOCALNAME) {} #endif using namespace ANALYSIS; using namespace ATOOLS; using namespace std; DIS_Algorithm::DIS_Algorithm(ATOOLS::Particle_Qualifier_Base * const qualifier) : Jet_Algorithm_Base(qualifier), m_matrixsize(0), p_ktij(NULL), p_imap(NULL), p_kis(NULL), p_jets(NULL), p_kts(NULL) { } DIS_Algorithm::~DIS_Algorithm() { if (p_ktij) { for (int i=0;ipush_back(kt2); } } void DIS_Algorithm::AddToJetlist(const Vec4D & mom, int bf) { if (p_jets) { if(!bf) p_jets->push_back(new Particle(p_jets->size(),Flavour(kf_jet),mom)); else p_jets->push_back(new Particle(p_jets->size(),bf>0?Flavour(kf_bjet): Flavour(kf_bjet).Bar(),mom)); } } bool DIS_Algorithm::ConstructJets(const Particle_List * pl, Particle_List * jets, std::vector * kts, double rmin) { DEBUG_FUNC(""); // assume empty containers p_jets = jets; p_kts = kts; m_r2min = sqr(rmin); // create vector list from particle list int n=0; Vec4D * moms = new Vec4D[pl->size()]; int * bflag = new int[pl->size()]; static Particle_Qualifier_Base *bhad(Particle_Qualifier_Getter::GetObject("DecayedBHadron","")); for (Particle_List::const_iterator it=pl->begin(); it!=pl->end();++it) { if ((*p_qualifier)(*it)) { // if (!(*it)->Flav().IsLepton()) { moms[n] = ((*it)->Momentum()); bflag[n] = false; if (m_bflag==0) bflag[n] = (((*it)->Flav()).Kfcode()==kf_b || (*bhad)(*it) || ((*it)->Flav()).Kfcode()==kf_bjet); else if (m_bflag==-1) bflag[n] = (1-2*(*it)->Flav().IsAnti())* (((*it)->Flav()).Kfcode()==kf_b || (*bhad)(*it) || ((*it)->Flav()).Kfcode()==kf_bjet); ++n; } } // boost into breit frame Vec4D l, lp, pp; for (size_t i(0);isize();++i) if ((*p_bl)[i]->Type()==btp::Beam) { Particle *p((*p_bl)[i]->InParticle(0)); if (p->Flav().IsLepton()) l=p->Momentum(); else pp=p->Momentum(); } Blob *me(p_bl->FindFirst(btp::Signal_Process)); if (l==Vec4D() && pp==Vec4D()) { l=rpa->gen.PBeam(0); pp=rpa->gen.PBeam(1); } for (int i(0);iNOutP();++i) if (me->OutParticle(i)->Flav().IsLepton()) { lp=me->OutParticle(i)->Momentum(); break; } Vec4D qq(l-lp); Poincare cms(pp+qq); double Q2(-qq.Abs2()), x(Q2/(2.0*pp*qq)), E(sqrt(Q2)/(2.0*x)); m_p=Vec4D(sqrt(E*E+pp.Abs2()),0.0,0.0,-E); m_q=Vec4D(0.0,0.0,0.0,2.0*x*E); cms.Boost(pp); cms.Boost(qq); Poincare zrot(pp,-Vec4D::ZVEC); zrot.Rotate(pp); zrot.Rotate(qq); Poincare breit(m_p+m_q); breit.BoostBack(pp); breit.BoostBack(qq); if (!IsEqual(pp,m_p,1.0e-3) || !IsEqual(qq,m_q,1.0e-3)) msg_Error()<size();++i) { Vec4D p((*p_jets)[i]->Momentum()); breit.Boost(p); zrot.RotateBack(p); cms.BoostBack(p); (*p_jets)[i]->SetMomentum(p); } p_jets=0; p_kts =0; return true; } void DIS_Algorithm::Init(int size) { PROFILE_HERE; if (size>m_matrixsize ) { if (p_ktij) { for (int i=0;i0} = " <::max(); { PROFILE_LOCAL(" first loop "); for (int i=0;i0) { PROFILE_LOCAL(" main loop "); if (dmin>m_r2min*sqr(rpa->gen.Ecms())) break; if (ii!=jj) { // combine precluster #ifdef DEBUG_JETRATES msg_Debugging()<<"jetrate Q_{"<" <" <" <