Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F8309065
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
15 KB
Subscribers
None
View Options
diff --git a/Decay/WeakCurrents/WeakBaryonCurrent.cc b/Decay/WeakCurrents/WeakBaryonCurrent.cc
--- a/Decay/WeakCurrents/WeakBaryonCurrent.cc
+++ b/Decay/WeakCurrents/WeakBaryonCurrent.cc
@@ -1,214 +1,213 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the WeakBaryonCurrent class.
//
#include "WeakBaryonCurrent.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/Reference.h"
#include "ThePEG/EventRecord/Particle.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Utilities/DescribeClass.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Helicity/WaveFunction/SpinorWaveFunction.h"
#include "ThePEG/Helicity/WaveFunction/SpinorBarWaveFunction.h"
#include "ThePEG/Helicity/HelicityFunctions.h"
using namespace Herwig;
WeakBaryonCurrent::WeakBaryonCurrent() {}
IBPtr WeakBaryonCurrent::clone() const {
return new_ptr(*this);
}
IBPtr WeakBaryonCurrent::fullclone() const {
return new_ptr(*this);
}
void WeakBaryonCurrent::persistentOutput(PersistentOStream & os) const {
os << formFactor_;
}
void WeakBaryonCurrent::persistentInput(PersistentIStream & is, int) {
is >> formFactor_;
}
// The following static variable is needed for the type
// description system in ThePEG.
DescribeClass<WeakBaryonCurrent,WeakCurrent>
describeHerwigWeakBaryonCurrent("Herwig::WeakBaryonCurrent", "Herwig.so");
void WeakBaryonCurrent::Init() {
static ClassDocumentation<WeakBaryonCurrent> documentation
("The WeakBaryonCurrent class is a wrapper for the BaryonFormFactor"
" so it can be used as a WeakCurrent");
static Reference<WeakBaryonCurrent,BaryonFormFactor> interfaceFormFactor
("FormFactor",
"The baryon form factor",
&WeakBaryonCurrent::formFactor_, false, false, true, false, false);
}
void WeakBaryonCurrent::doinit() {
// initialize the form factor
formFactor_->init();
// set the modes
for(unsigned int iloc=0;iloc<formFactor_->numberOfFactors();++iloc) {
int ispin(0), ospin(0), spect1(0), spect2(0), inquark(0), outquark(0);
formFactor_->formFactorInfo(iloc,ispin,ospin,spect1,spect2,inquark,outquark);
addDecayMode(outquark,-inquark);
}
setInitialModes(formFactor_->numberOfFactors());
WeakCurrent::doinit();
}
// complete the construction of the decay mode for integration
bool WeakBaryonCurrent::createMode(int icharge, tcPDPtr ,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp ) {
// todo isospin in the form factors
// no isospin here
if(Itotal!=IsoSpin::IUnknown || i3 !=IsoSpin::I3Unknown) return false;
unsigned int iq(0),ia(0);
tPDVector out = particles(icharge,imode,iq,ia);
// make sure the the decays are kinematically allowed
Energy min =out[0]->massMin()+out[1]->massMin();
if(min>=upp) return false;
// set the resonances and check charge
tPDPtr res;
if(icharge==3) res=getParticleData(ParticleID::Wplus );
else if(icharge==-3) res=getParticleData(ParticleID::Wminus);
else res=getParticleData(ParticleID::gamma );
// create the channel
mode->addChannel((PhaseSpaceChannel(phase),ires,res,ires+1,iloc+1,ires+1,iloc+2));
// return if successful
return true;
}
// the particles produced by the current
tPDVector WeakBaryonCurrent::particles(int icharge, unsigned int imode, int , int ) {
tPDVector extpart(2);
int id0(0),id1(0);
formFactor_->particleID(imode,id0,id1);
extpart[0] = getParticleData(id0);
if(extpart[0]->CC()) extpart[0]=extpart[0]->CC();
extpart[1] = getParticleData(id1);
int charge = extpart[0]->iCharge()+extpart[1]->iCharge();
if(charge==icharge)
return extpart;
else if(charge==-icharge) {
for(unsigned int ix=0;ix<2;++ix)
if(extpart[ix]->CC()) extpart[ix]=extpart[ix]->CC();
return extpart;
}
else
return tPDVector();
}
void WeakBaryonCurrent::constructSpinInfo(ParticleVector decay) const {
- assert(false);
- // if(decay[0]->id()>0) {
- // SpinorWaveFunction ::constructSpinInfo(wave_ ,decay[1],outgoing,true);
- // SpinorBarWaveFunction::constructSpinInfo(wavebar_,decay[0],outgoing,true);
- // }
- // else {
- // SpinorWaveFunction ::constructSpinInfo( wave_,decay[0],outgoing,true);
- // SpinorBarWaveFunction::constructSpinInfo(wavebar_,decay[1],outgoing,true);
- // }
+ if(decay[0]->id()>0) {
+ SpinorWaveFunction ::constructSpinInfo(wave_ ,decay[1],outgoing,true);
+ SpinorBarWaveFunction::constructSpinInfo(wavebar_,decay[0],outgoing,true);
+ }
+ else {
+ SpinorWaveFunction ::constructSpinInfo( wave_,decay[0],outgoing,true);
+ SpinorBarWaveFunction::constructSpinInfo(wavebar_,decay[1],outgoing,true);
+ }
}
// hadronic current
vector<LorentzPolarizationVectorE>
WeakBaryonCurrent::current(tcPDPtr ,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
const int, const int, Energy & scale,
const tPDVector & outgoing,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption) const {
// no isospin here
if(Itotal!=IsoSpin::IUnknown || i3 !=IsoSpin::I3Unknown) return vector<LorentzPolarizationVectorE>();
useMe();
Lorentz5Momentum q = momenta[0]+momenta[1];
q.rescaleMass();
scale=q.mass();
int in = abs(outgoing[0]->id());
int out = abs(outgoing[1]->id());
Energy m1 = outgoing[0]->mass();
Energy m2 = outgoing[1]->mass();
bool cc = false;
unsigned int imode = formFactor_->formFactorNumber(in,out,cc);
// todo generalize to spin != 1/2
assert(outgoing[0]->iSpin()==PDT::Spin1Half &&
outgoing[1]->iSpin()==PDT::Spin1Half );
- vector<LorentzSpinor <SqrtEnergy> > f2(2);
- vector<LorentzSpinorBar<SqrtEnergy> > a2(2);
+ wave_.resize(2);
+ wavebar_.resize(2);
for(unsigned int ix=0;ix<2;++ix) {
- a2[ix] = HelicityFunctions::dimensionedSpinorBar(-momenta[0],ix,Helicity::outgoing);
- f2[ix] = HelicityFunctions::dimensionedSpinor (-momenta[1],ix,Helicity::outgoing);
+ wavebar_[ix] = HelicityFunctions::dimensionedSpinorBar(-momenta[0],ix,Helicity::outgoing);
+ wave_[ix] = HelicityFunctions::dimensionedSpinor (-momenta[1],ix,Helicity::outgoing);
}
// get the form factors
Complex f1v(0.),f2v(0.),f3v(0.),f1a(0.),f2a(0.),f3a(0.);
formFactor_->SpinHalfSpinHalfFormFactor(sqr(scale),imode,in,out,m1,m2,
f1v,f2v,f3v,f1a,f2a,f3a,
BaryonFormFactor::TimeLike);
Complex left = f1v - f1a + f2v -double((m1-m2)/(m1+m2))*f2a;
Complex right = f1v + f1a + f2v +double((m1-m2)/(m1+m2))*f2a;
vector<LorentzPolarizationVectorE> baryon;
Lorentz5Momentum diff = momenta[0]-momenta[1];
for(unsigned int ohel1=0;ohel1<2;++ohel1) {
for(unsigned int ohel2=0;ohel2<2;++ohel2) {
LorentzPolarizationVectorE
- vtemp = f2[ohel2].generalCurrent(a2[ohel1],left,right);
- complex<Energy> vspin=f2[ohel2].scalar (a2[ohel1]);
- complex<Energy> aspin=f2[ohel2].pseudoScalar(a2[ohel1]);
+ vtemp = wave_[ohel2].generalCurrent(wavebar_[ohel1],left,right);
+ complex<Energy> vspin=wave_[ohel2].scalar (wavebar_[ohel1]);
+ complex<Energy> aspin=wave_[ohel2].pseudoScalar(wavebar_[ohel1]);
vtemp-= (f2v*vspin+f2a*aspin)/(m1+m2)*diff;
vtemp+= (f3v*vspin+f3a*aspin)/(m1+m2)*q;
baryon.push_back(vtemp);
}
}
// return the answer
return baryon;
}
bool WeakBaryonCurrent::accept(vector<int> id) {
assert(false);
// bool allowed(false);
// if(id.size()!=2) return false;
// if(abs(id[0])%2==0) {
// if((id[0]> 10&&id[0]< 18&&id[1]==-id[0]+1)||
// (id[0]<-10&&id[0]>-18&&id[1]==-id[0]-1)) allowed=true;
// }
// else {
// if((id[1]> 10&&id[1]< 18&&id[0]==-id[1]+1)||
// (id[1]<-10&&id[1]>-18&&id[0]==-id[1]-1)) allowed=true;
// }
// return allowed;
}
// the decay mode
unsigned int WeakBaryonCurrent::decayMode(vector<int> idout) {
assert(idout.size()==2);
int itemp[2] = {idout[0],idout[1]};
for(unsigned int ix=0;ix<2;++ix)
if(itemp[ix]<0) itemp[ix]=-itemp[ix];
bool cc = false;
return formFactor_->formFactorNumber(itemp[0],itemp[1],cc);
}
// output the information for the database
void WeakBaryonCurrent::dataBaseOutput(ofstream & output,bool header,
bool create) const {
if(header) output << "update decayers set parameters=\"";
if(create) output << "create Herwig::WeakBaryonCurrent " << name() << "\n";
output << "newdef " << name() << ":FormFactor " << formFactor_ << "\n";
WeakCurrent::dataBaseOutput(output,false,false);
if(header) output << "\n\" where BINARY ThePEGName=\"" << fullName() << "\";" << endl;
}
diff --git a/Decay/WeakCurrents/WeakBaryonCurrent.h b/Decay/WeakCurrents/WeakBaryonCurrent.h
--- a/Decay/WeakCurrents/WeakBaryonCurrent.h
+++ b/Decay/WeakCurrents/WeakBaryonCurrent.h
@@ -1,194 +1,207 @@
// -*- C++ -*-
#ifndef Herwig_WeakBaryonCurrent_H
#define Herwig_WeakBaryonCurrent_H
//
// This is the declaration of the WeakBaryonCurrent class.
//
#include "WeakCurrent.h"
#include "Herwig/Decay/FormFactors/BaryonFormFactor.h"
+#include "ThePEG/Helicity/LorentzSpinorBar.h"
namespace Herwig {
using namespace ThePEG;
/**
* The WeakBaryonCurrent class is a wrapper around the BaryonFormFactor so that
* they can be used as a current.
*
* @see \ref WeakBaryonCurrentInterfaces "The interfaces"
* defined for WeakBaryonCurrent.
*/
class WeakBaryonCurrent: public WeakCurrent {
public:
/**
* The default constructor.
*/
WeakBaryonCurrent();
public:
/** @name Methods for the construction of the phase space integrator. */
//@{
/**
* Complete the construction of the decay mode for integration.classes inheriting
* from this one.
* This method is purely virtual and must be implemented in the classes inheriting
* from WeakCurrent.
* @param icharge The total charge of the outgoing particles in the current.
* @param resonance If specified only include terms with this particle
* @param Itotal If specified the total isospin of the current
* @param I3 If specified the thrid component of isospin
* @param imode The mode in the current being asked for.
* @param mode The phase space mode for the integration
* @param iloc The location of the of the first particle from the current in
* the list of outgoing particles.
* @param ires The location of the first intermediate for the current.
* @param phase The prototype phase space channel for the integration.
* @param upp The maximum possible mass the particles in the current are
* allowed to have.
* @return Whether the current was sucessfully constructed.
*/
virtual bool createMode(int icharge, tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
unsigned int imode,PhaseSpaceModePtr mode,
unsigned int iloc,int ires,
PhaseSpaceChannel phase, Energy upp );
/**
* The particles produced by the current. This just returns the leptons.
* @param icharge The total charge of the particles in the current.
* @param imode The mode for which the particles are being requested
* @param iq The PDG code for the quark
* @param ia The PDG code for the antiquark
* @return The external particles for the current.
*/
virtual tPDVector particles(int icharge, unsigned int imode, int iq, int ia);
//@}
/**
* Hadronic current. This method is purely virtual and must be implemented in
* all classes inheriting from this one.
* @param resonance If specified only include terms with this particle
* @param Itotal If specified the total isospin of the current
* @param I3 If specified the thrid component of isospin
* @param imode The mode
* @param ichan The phase-space channel the current is needed for.
* @param scale The invariant mass of the particles in the current.
* @param outgoing The particles produced in the decay
* @param momenta The momenta of the particles produced in the decay
* @param meopt Option for the calculation of the matrix element
* @return The current.
*/
virtual vector<LorentzPolarizationVectorE>
current(tcPDPtr resonance,
IsoSpin::IsoSpin Itotal, IsoSpin::I3 i3,
const int imode, const int ichan,Energy & scale,
const tPDVector & outgoing,
const vector<Lorentz5Momentum> & momenta,
DecayIntegrator::MEOption meopt) const;
/**
* Construct the SpinInfo for the decay products
*/
void constructSpinInfo(ParticleVector decay) const;
/**
* Accept the decay. Checks that this is one of the allowed modes.
* @param id The id's of the particles in the current.
* @return Can this current have the external particles specified.
*/
virtual bool accept(vector<int> id);
/**
* Returns the decay mode number for a given set of particles in the current.
* @param id The id's of the particles in the current.
* @return The number of the mode
*/
virtual unsigned int decayMode(vector<int> id);
/**
* Output the setup information for the particle database
* @param os The stream to output the information to
* @param header Whether or not to output the information for MySQL
* @param create Whether or not to add a statement creating the object
*/
virtual void dataBaseOutput(ofstream & os,bool header,bool create) const;
public:
/** @name Functions used by the persistent I/O system. */
//@{
/**
* Function used to write out object persistently.
* @param os the persistent output stream written to.
*/
void persistentOutput(PersistentOStream & os) const;
/**
* Function used to read in object persistently.
* @param is the persistent input stream read from.
* @param version the version number of the object when written.
*/
void persistentInput(PersistentIStream & is, int version);
//@}
/**
* The standard Init function used to initialize the interfaces.
* Called exactly once for each class by the class description system
* before the main function starts or
* when this class is dynamically loaded.
*/
static void Init();
protected:
/** @name Clone Methods. */
//@{
/**
* Make a simple clone of this object.
* @return a pointer to the new object.
*/
virtual IBPtr clone() const;
/** Make a clone of this object, possibly modifying the cloned object
* to make it sane.
* @return a pointer to the new object.
*/
virtual IBPtr fullclone() const;
//@}
protected:
/** @name Standard Interfaced functions. */
//@{
/**
* Initialize this object after the setup phase before saving an
* EventGenerator to disk.
* @throws InitException if object could not be initialized properly.
*/
virtual void doinit();
//@}
private:
/**
* The assignment operator is private and must never be called.
* In fact, it should not even be implemented.
*/
- WeakBaryonCurrent & operator=(const WeakBaryonCurrent &);
+ WeakBaryonCurrent & operator=(const WeakBaryonCurrent &) = delete;
private:
/**
* The baryon form factor
*/
BaryonFormFactorPtr formFactor_;
+
+private:
+
+ /**
+ * Spinors for the decay products
+ */
+ mutable vector<Helicity::LorentzSpinor <SqrtEnergy> > wave_;
+
+ /**
+ * barred spinors for the decay products
+ */
+ mutable vector<Helicity::LorentzSpinorBar<SqrtEnergy> > wavebar_;
};
}
#endif /* Herwig_WeakBaryonCurrent_H */
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Dec 21, 2:10 PM (16 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4023070
Default Alt Text
(15 KB)
Attached To
rHERWIGHG herwighg
Event Timeline
Log In to Comment