#include "HADRONS++/PS_Library/Four_Body_PSs.H" #include "PHASIC++/Channels/Channel_Elements.H" #include "ATOOLS/Org/Message.H" #include "ATOOLS/Org/MyStrStream.H" #include "ATOOLS/Math/Random.H" #include "ATOOLS/Math/Poincare.H" using namespace HADRONS; using namespace PHASIC; using namespace ATOOLS; using namespace std; TwoResonances::TwoResonances(const Flavour * fl, SimpleResonanceFlavour prop1,const int _k, SimpleResonanceFlavour prop2,const int _i, const int _j ) : Single_Channel(1,4,fl), m_P(Vec4D(fl[0].HadMass(),0.,0.,0.)), m_i (_i), m_j (_j), m_k (_k), m_prop1 (prop1), m_prop2 (prop2) { m_name = string("TwoResonances_") + prop1.Name() + string("_") + ToString(m_k) + string("_") + prop2.Name() + string("_") + ToString(m_i)+ToString(m_j); // generate channel name p_fl = new Flavour[5]; for (short int i=0;i " < " < "< "< "< "<GeneratePoint(_ran); for(int i=0;iGenerateWeight(p_rans); if (wt!=0.) wt = vw/wt/pow(2.*M_PI,4*3.-4.); m_weight = wt; } // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% IsotropicSpectator::IsotropicSpectator(const ATOOLS::Flavour * fl, int nOut, int spectator, const ATOOLS::Mass_Selector* ms) : Single_Channel(1,nOut,fl), m_spectator(spectator), m_spectator_mass(ms->Mass(fl[spectator])), m_residual_mass(0.) { Flavour *isotropicflavs = new Flavour[m_nout]; isotropicflavs[0] = Flavour(kf_none); int j=1; for (short int i=1;i<1+m_nout;i++) { if(i!=m_spectator) { msg_Debugging()<<" PS: add decay product: "<Mass(fl[i]); j++; } else msg_Debugging()<<" PS: add spectator: "<Mass(isotropicflavs[0]); m_decayer_mass = ms->Mass(fl[0])-ms->Mass(fl[spectator]); isotropicflavs[0].SetMass(m_decayer_mass); m_rambo = new Rambo(1,m_nout-1,isotropicflavs,ms); isotropicflavs[0].SetMass(mass_saved); msg_Debugging()<<" PS: m_decayermass = "<Mass(fl[spectator])<<", m_nout = "<GetGaussian(); if (pspat < 1e-6) pspat = lambda_qcd+lambda_qcd/m_decayer_mass*ran->GetGaussian(); } while(pspat<1e-6); } while (sqr(p[0][0]-sqrt(sqr(m_spectator_mass)+sqr(pspat))) - sqr(pspat) < critE2); double costheta = ran->Get()*2.0-1.0; double sintheta = sin(acos(costheta)); double phi = ran->Get()*2.0*M_PI; double px = pspat*sintheta*cos(phi); double py = pspat*sintheta*sin(phi); double pz = pspat*costheta; Vec4D spectator_mom = Vec4D(sqrt(sqr(m_spectator_mass)+sqr(pspat)), px, py, pz); Vec4D decayer_mom = Vec4D(p[0][0]-spectator_mom[0], -px, -py, -pz); Vec4D *isotropicmoms = new Vec4D[m_nout+1]; Poincare boost(decayer_mom); isotropicmoms[0] = boost*decayer_mom; m_rambo->GeneratePoint(isotropicmoms); boost.Invert(); int j=1; for (short int i=1;i<1+m_nout;i++) { if(i==m_spectator) {//at the moment spectator always at 1. p[i] = spectator_mom; } else { p[i] = boost*isotropicmoms[j]; j++; } } delete[] isotropicmoms; } void IsotropicSpectator::GenerateWeight(ATOOLS::Vec4D * p, PHASIC::Cut_Data * cuts) { Vec4D *isotropicmoms = new Vec4D[m_nout+1]; int j=1; for (short int i=1;i<1+m_nout;i++) { if(i!=m_spectator) { isotropicmoms[j] = p[i]; j++; } } isotropicmoms[0] = isotropicmoms[1]; for (short int i=2;iGenerateWeight(isotropicmoms); SetWeight(m_rambo->Weight()); if (IsNan(m_rambo->Weight())) { msg_Error()<<"Rambo weight gives a nan!\n" <<" boost vector: "<