Page MenuHomeHEPForge

No OneTemporary

diff --git a/Config/Containers.cc b/Config/Containers.cc
deleted file mode 100644
--- a/Config/Containers.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-// -*- C++ -*-
-//
-// Containers.cc is a part of ThePEG - Toolkit for HEP Event Generation
-// Copyright (C) 1999-2011 Leif Lonnblad
-//
-// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
-// Please respect the MCnet academic guidelines, see GUIDELINES for details.
-//
-
-// This file contains the implementations of the container
-// declarations in Containers.h.
-
-#include "ThePEG.h"
-#include "ThePEG/PDT/ParticleData.h"
-#include "ThePEG/PDT/MatcherBase.h"
-#include "ThePEG/PDT/DecayMode.h"
-#include "ThePEG/Interface/InterfacedBase.h"
-#include "ThePEG/Repository/EventGenerator.h"
-
-#ifdef ThePEG_TEMPLATES_IN_CC_FILE
-// #include "Containers.tcc"
-#endif
-
-using namespace ThePEG;
-
-ThePEG_IMPLEMENT_SET(PDPTr,ParticleDataSet)
-ThePEG_IMPLEMENT_SET(PMPtr,MatcherSet)
-ThePEG_IMPLEMENT_SET(DMPtr,DecayModeSet)
-ThePEG_IMPLEMENT_SET(tDMPtr,DecaySet)
-ThePEG_IMPLEMENT_SET(IBPtr,ObjectSet)
-ThePEG_IMPLEMENT_SET(IBPtr,DependencySet)
-ThePEG_IMPLEMENT_MAP(long,PDPtr,ParticleMap)
-ThePEG_IMPLEMENT_MAP(string,IBPtr,ObjectMap)
-ThePEG_IMPLEMENT_MAP(IBPtr,DependencySet,DependencyMap)
-ThePEG_IMPLEMENT_MAP(string,const InterfaceBase *,InterfaceMap)
-ThePEG_IMPLEMENT_MAP(string,EGPtr,GeneratorMap)
-ThePEG_IMPLEMENT_SET(string,StringSet)
-// typedef set<const InterfaceBase *> InterfaceSet;
diff --git a/Config/Makefile.am b/Config/Makefile.am
--- a/Config/Makefile.am
+++ b/Config/Makefile.am
@@ -1,18 +1,18 @@
-mySOURCES = ThePEG.cc Containers.cc
+mySOURCES = ThePEG.cc
DOCFILES = ThePEG.h Constants.h Containers.h Pointers.h \
Unitsystem.h algorithm.h \
std.h Complex.h TemplateTools.h \
PhysicalQty.h PhysicalQtyOps.h PhysicalQtyComplex.h
if HAVE_HEPMC
DOCFILES += HepMCHelper.h
endif
INCLUDEFILES = $(DOCFILES)
noinst_LTLIBRARIES = libThePEGConfig.la
libThePEGConfig_la_SOURCES = $(mySOURCES) $(INCLUDEFILES)
include $(top_srcdir)/Config/Makefile.aminclude
diff --git a/Config/std.h b/Config/std.h
--- a/Config/std.h
+++ b/Config/std.h
@@ -1,493 +1,180 @@
// -*- C++ -*-
//
// std.h is a part of ThePEG - Toolkit for HEP Event Generation
// Copyright (C) 1999-2011 Leif Lonnblad
//
// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
#ifndef ThePEG_std_H
#define ThePEG_std_H
/** \file
* This file introduces a number of <code>std::</code> classes into
* the ThePEG namespace. Also introduces some useful functions for
* standard library classes.
*
* Do not make changes in this file. If you want to use alternatives
* to the <code>std::</code> classes in ThePEG, edit a copy of this
* file and include it in an alternative config file which can be
* included in the main ThePEG.h config file using the macro
* <code>ThePEG_ALTERNATE_CONFIG</code>.
*/
#include <map>
#include <set>
#include <string>
#include <vector>
#include <list>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <stack>
#include <utility>
#include <typeinfo>
#include <stdexcept>
#include <cmath>
namespace std {
/** @cond TRAITSPECIALIZATIONS */
/**
* This specialization of the std::less class is needed in order to be
* able use put pointers to type_info objects as keys in maps and
* sets.
*/
template <>
struct less<const type_info *> :
public binary_function<const type_info *, const type_info *, bool>
{
/**
* This is the function called when comparing two pointers to
* type_info.
*/
bool operator()(const type_info * x, const type_info * y) const {
return x->before(*y); }
};
/** @endcond */
}
namespace ThePEG {
using std::deque;
using std::stack;
using std::vector;
using std::multiset;
using std::set;
using std::map;
using std::list;
using std::multimap;
using std::pair;
using std::make_pair;
using std::less;
using std::string;
using std::type_info;
using std::exception;
using std::range_error;
using std::ios;
using std::ostream;
using std::istream;
using std::ofstream;
using std::ifstream;
using std::ostringstream;
using std::istringstream;
using std::cin;
using std::cout;
using std::cerr;
using std::endl;
using std::flush;
using std::setprecision;
using std::setw;
using std::swap;
using std::min;
using std::max;
using std::mem_fun;
using std::sqrt;
//using std::pow;
using std::abs;
using std::atan2;
using std::isfinite;
/** Powers - standard or non-standard */
template <class ExponentT>
inline constexpr double pow(double x, ExponentT p) {
return std::pow(x,double(p));
}
/** Square root of an integer. */
inline double sqrt(int x) {
return std::sqrt(double(x));
}
/** Check if a given object is a part of a container. */
template <typename Container, typename Key>
inline bool member(const Container & c, const Key & k) {
return c.find(k) != c.end();
}
/** Check if a given object is a part of a vector. */
template <typename T, typename Key>
inline bool member(const vector<T> & v, const Key & k) {
for ( typename vector<T>::const_iterator i = v.begin(); i != v.end(); ++i )
if ( *i == k ) return true;
return false;
// return find(v.begin(), v.end(), k) != v.end();
}
/** Return an insert iterator for a given container. */
template <typename Cont>
inline std::insert_iterator<Cont> inserter(Cont & c) {
return std::insert_iterator<Cont>(c, c.end());
}
/** Return an insert iterator for a given vector. Overrides the
* general version. */
template <typename T, typename A>
inline std::back_insert_iterator< vector<T,A> > inserter(vector<T,A> & v) {
return back_inserter(v);
}
/** Return an insert iterator for a given vector. Overrides the
* general version. */
template <typename T, typename A>
inline std::back_insert_iterator< deque<T,A> > inserter(deque<T,A> & v) {
return back_inserter(v);
}
/** Stream manipulator setting an ostream to left-adjust its ouput. */
inline ostream& left(ostream& os) {
os.setf(ios::left, ios::adjustfield);
return os;
}
/** Stream manipulator setting an ostream to right-adjust its ouput. */
inline ostream& right(ostream& os) {
os.setf(ios::right, ios::adjustfield);
return os;
}
}
-#ifndef ThePEG_WRAP_STL_CONTAINERS
-
/** Macro for declaring a set. */
#define ThePEG_DECLARE_SET(VALTYPE,NAME) \
/** A set of VALTYPE. */ \
typedef set<VALTYPE, less<VALTYPE> > NAME
/** Macro for declaring a multiset. */
#define ThePEG_DECLARE_MULTISET(VALTYPE,NAME) \
/** A multiset of VALTYPE. */ \
typedef multiset<VALTYPE, less<VALTYPE> > NAME
/** Macro for declaring a map. */
#define ThePEG_DECLARE_MAP(KEYTYPE,VALTYPE,NAME) \
/** A map of VALTYPE indexed by KEYTYPE. */ \
typedef map<KEYTYPE, VALTYPE, less<KEYTYPE> > NAME
-/** Macro for implementing a set. */
-#define ThePEG_IMPLEMENT_SET(VALTYPE,NAME)
-
-/** Macro for implementing a multiset. */
-#define ThePEG_IMPLEMENT_MULTISET(VALTYPE,NAME)
-
-/** Macro for implementing a map. */
-#define ThePEG_IMPLEMENT_MAP(KEYTYPE,VALTYPE,NAME)
-
-#else
-
-/** Macro for declaring a set. */
-#define ThePEG_DECLARE_SET(VALTYPE,NAME) \
-class NAME : public set<VALTYPE, less<VALTYPE> > { \
-public: \
- typedef set<VALTYPE, less<VALTYPE> > SETTYPE; \
- NAME(); \
- explicit NAME(const key_compare & c, \
- const allocator_type & a = allocator_type()); \
- template <typename InputIterator> \
- NAME(InputIterator first, InputIterator last) \
- : SETTYPE(first, last) {} \
- template <typename InputIterator> \
- NAME(InputIterator first, InputIterator last, const key_compare & c, \
- const allocator_type & a = allocator_type()) \
- : SETTYPE(first, last, c, a) {} \
- NAME(const SETTYPE & s); \
- NAME(const NAME & s); \
- ~NAME(); \
- NAME & operator=(const NAME &); \
- NAME & operator=(const SETTYPE &); \
- pair<iterator,bool> insert(const value_type & x); \
- iterator insert(iterator position, const value_type & x); \
- template <typename InputIterator> \
- void insert(InputIterator first, InputIterator last) { \
- SETTYPE::insert(first, last); \
- } \
- void erase(iterator position); \
- size_type erase(const key_type & x); \
- void erase(iterator first, iterator last); \
- void clear(); \
- iterator find(const key_type & x) const; \
- size_type count(const key_type & x) const; \
- iterator lower_bound(const key_type & x) const; \
- iterator upper_bound(const key_type & x) const; \
- pair<iterator,iterator> equal_range(const key_type & x) const; \
-}
-
-
-/** Macro for declaring a multiset. */
-#define ThePEG_DECLARE_MULTISET(VALTYPE,NAME) \
-class NAME : \
- public multiset<VALTYPE, less<VALTYPE> > { \
-public: \
- typedef multiset<VALTYPE, less<VALTYPE> > SETTYPE;\
- NAME(); \
- explicit NAME(const key_compare & c, \
- const allocator_type & a = allocator_type()); \
- template <typename InputIterator> \
- NAME(InputIterator first, InputIterator last) \
- : SETTYPE(first, last) {} \
- template <typename InputIterator> \
- NAME(InputIterator first, InputIterator last, const key_compare & c, \
- const allocator_type & a = allocator_type()) \
- : SETTYPE(first, last, c, a) {} \
- NAME(const SETTYPE & s); \
- NAME(const NAME & s); \
- ~NAME(); \
- NAME & operator=(const NAME &); \
- NAME & operator=(const SETTYPE &); \
- iterator insert(const value_type & x); \
- iterator insert(iterator position, const value_type & x); \
- template <typename InputIterator> \
- void insert(InputIterator first, InputIterator last) { \
- SETTYPE::insert(first, last); \
- } \
- void erase(iterator position); \
- size_type erase(const key_type & x); \
- void erase(iterator first, iterator last); \
- void clear(); \
- iterator find(const key_type & x) const; \
- size_type count(const key_type & x) const; \
- iterator lower_bound(const key_type & x) const; \
- iterator upper_bound(const key_type & x) const; \
- pair<iterator,iterator> equal_range(const key_type & x) const; \
-}
-
-
-/** Macro for declaring a map. */
-#define ThePEG_DECLARE_MAP(KEYTYPE,VALTYPE,NAME) \
-class NAME : \
- public map<KEYTYPE, VALTYPE, less<KEYTYPE> > { \
-public: \
- typedef map<KEYTYPE, VALTYPE, less<KEYTYPE> > MAPTYPE; \
- NAME(); \
- explicit NAME(const key_compare & c, \
- const allocator_type & a = allocator_type()); \
- template <typename InputIterator> \
- NAME(InputIterator first, InputIterator last) \
- : MAPTYPE(first, last) {} \
- template <typename InputIterator> \
- NAME(InputIterator first, InputIterator last, const key_compare & c, \
- const allocator_type & a = allocator_type()) \
- : MAPTYPE(first, last, c, a) {} \
- NAME(const NAME & s); \
- NAME(const MAPTYPE & s); \
- ~NAME(); \
- NAME & operator=(const NAME &); \
- NAME & operator=(const MAPTYPE &); \
- data_type & operator[](const key_type & k); \
- pair<iterator,bool> insert(const value_type & x); \
- iterator insert(iterator position, const value_type & x); \
- template <typename InputIterator> \
- void insert(InputIterator first, InputIterator last) { \
- MAPTYPE::insert(first, last); \
- } \
- void erase(iterator position); \
- size_type erase(const key_type & x); \
- void erase(iterator first, iterator last); \
- void clear(); \
- iterator find(const key_type & x); \
- const_iterator find(const key_type & x) const; \
- size_type count(const key_type & x) const; \
- iterator lower_bound(const key_type & x); \
- const_iterator lower_bound(const key_type & x) const; \
- iterator upper_bound(const key_type & x); \
- const_iterator upper_bound(const key_type & x) const; \
- pair<iterator,iterator> equal_range(const key_type & x); \
- pair<const_iterator,const_iterator> \
- equal_range(const key_type & x) const; \
-}
-
-
-/** Macro for implementing a set. */
-#define ThePEG_IMPLEMENT_SET(VALTYPE,NAME) \
-NAME::NAME() {} \
-NAME::NAME(const key_compare & c, const allocator_type & a) \
- :SETTYPE(c, a) {} \
-NAME::NAME(const NAME & x) : SETTYPE(x) {} \
-NAME::NAME(const SETTYPE & x) : SETTYPE(x) {} \
-NAME::~NAME() {} \
-NAME & NAME::operator=(const NAME & x) { \
- SETTYPE::operator=(x); \
- return *this; \
-} \
-NAME & NAME::operator=(const SETTYPE & x) { \
- SETTYPE::operator=(x); \
- return *this; \
-} \
-pair<NAME::iterator,bool> NAME::insert(const value_type & x) { \
- return SETTYPE::insert(x); \
-} \
-NAME::iterator NAME::insert(iterator position, const value_type & x) { \
- return SETTYPE::insert(position, x); \
-} \
-void NAME::erase(iterator position) { \
- SETTYPE::erase(position); \
-} \
-NAME::size_type NAME::erase(const key_type & x) { \
- return SETTYPE::erase(x); \
-} \
-void NAME::erase(iterator first, iterator last) { \
- SETTYPE::erase(first, last); \
-} \
-void NAME::clear() { \
- SETTYPE::clear(); \
-} \
-NAME::iterator NAME::find(const key_type & x) const { \
- return SETTYPE::find(x); \
-} \
-NAME::size_type NAME::count(const key_type & x) const { \
- return SETTYPE::count(x); \
-} \
-NAME::iterator NAME::lower_bound(const key_type & x) const { \
- return SETTYPE::lower_bound(x); \
-} \
-NAME::iterator NAME::upper_bound(const key_type & x) const { \
- return SETTYPE::upper_bound(x); \
-} \
-pair<NAME::iterator,NAME::iterator> \
-NAME::equal_range(const key_type & x) const { \
- return SETTYPE::equal_range(x); \
-} \
-
-
-/** Macro for implementing a multiset. */
-#define ThePEG_IMPLEMENT_MULTISET(VALTYPE,NAME) \
-NAME::NAME() {} \
-NAME::NAME(const key_compare & c, const allocator_type & a) \
- :SETTYPE(c, a) {} \
-NAME::NAME(const NAME & x) : SETTYPE(x) {} \
-NAME::NAME(const SETTYPE & x) : SETTYPE(x) {} \
-NAME::~NAME() {} \
-NAME & NAME::operator=(const NAME & x) { \
- SETTYPE::operator=(x); \
- return *this; \
-} \
-NAME & NAME::operator=(const SETTYPE & x) { \
- SETTYPE::operator=(x); \
- return *this; \
-} \
-NAME::iterator NAME::insert(const value_type & x) { \
- return SETTYPE::insert(x); \
-} \
-NAME::iterator NAME::insert(iterator position, const value_type & x) { \
- return SETTYPE::insert(position, x); \
-} \
-void NAME::erase(iterator position) { \
- SETTYPE::erase(position); \
-} \
-NAME::size_type NAME::erase(const key_type & x) { \
- return SETTYPE::erase(x); \
-} \
-void NAME::erase(iterator first, iterator last) { \
- SETTYPE::erase(first, last); \
-} \
-void NAME::clear() { \
- SETTYPE::clear(); \
-} \
-NAME::iterator NAME::find(const key_type & x) const { \
- return SETTYPE::find(x); \
-} \
-NAME::size_type NAME::count(const key_type & x) const { \
- return SETTYPE::count(x); \
-} \
-NAME::iterator NAME::lower_bound(const key_type & x) const { \
- return SETTYPE::lower_bound(x); \
-} \
-NAME::iterator NAME::upper_bound(const key_type & x) const { \
- return SETTYPE::upper_bound(x); \
-} \
-pair<NAME::iterator,NAME::iterator> \
-NAME::equal_range(const key_type & x) const { \
- return SETTYPE::equal_range(x); \
-} \
-
-
-/** Macro for implementing a map. */
-#define ThePEG_IMPLEMENT_MAP(KEYTYPE,VALTYPE,NAME) \
-NAME::NAME() {} \
-NAME::NAME(const key_compare & c, const allocator_type & a) \
- :MAPTYPE(c, a) {} \
-NAME::NAME(const NAME & x) : MAPTYPE(x) {} \
-NAME::NAME(const MAPTYPE & x) : MAPTYPE(x) {} \
-NAME::~NAME() {} \
-NAME & NAME::operator=(const NAME & x) { \
- MAPTYPE::operator=(x); \
- return *this; \
-} \
-NAME & NAME::operator=(const MAPTYPE & x) { \
- MAPTYPE::operator=(x); \
- return *this; \
-} \
-pair<NAME::iterator,bool> NAME::insert(const value_type & x) { \
- return MAPTYPE::insert(x); \
-} \
-NAME::iterator NAME::insert(iterator position, const value_type & x) { \
- return MAPTYPE::insert(position, x); \
-} \
-void NAME::erase(iterator position) { \
- MAPTYPE::erase(position); \
-} \
-NAME::size_type NAME::erase(const key_type & x) { \
- return MAPTYPE::erase(x); \
-} \
-void NAME::erase(iterator first, iterator last) { \
- MAPTYPE::erase(first, last); \
-} \
-void NAME::clear() { \
- MAPTYPE::clear(); \
-} \
-NAME::iterator NAME::find(const key_type & x) { \
- return MAPTYPE::find(x); \
-} \
-NAME::const_iterator NAME::find(const key_type & x) const { \
- return MAPTYPE::find(x); \
-} \
-NAME::size_type NAME::count(const key_type & x) const { \
- return MAPTYPE::count(x); \
-} \
-NAME::iterator NAME::lower_bound(const key_type & x) { \
- return MAPTYPE::lower_bound(x); \
-} \
-NAME::const_iterator NAME::lower_bound(const key_type & x) const { \
- return MAPTYPE::lower_bound(x); \
-} \
-NAME::iterator NAME::upper_bound(const key_type & x) { \
- return MAPTYPE::upper_bound(x); \
-} \
-NAME::const_iterator NAME::upper_bound(const key_type & x) const { \
- return MAPTYPE::upper_bound(x); \
-} \
-pair<NAME::iterator,NAME::iterator> \
-NAME::equal_range(const key_type & x) { \
- return MAPTYPE::equal_range(x); \
-} \
-pair<NAME::const_iterator,NAME::const_iterator> \
-NAME::equal_range(const key_type & x) const { \
- return MAPTYPE::equal_range(x); \
-} \
-NAME::data_type & NAME::operator[](const key_type & k) { \
- return MAPTYPE::operator[](k); \
-} \
-
-#endif
-
-// #include "std.icc"
-#ifndef ThePEG_TEMPLATES_IN_CC_FILE
-// #include "std.tcc"
-#endif
-
#endif /* ThePEG_std_H */
diff --git a/EventRecord/Particle.cc b/EventRecord/Particle.cc
--- a/EventRecord/Particle.cc
+++ b/EventRecord/Particle.cc
@@ -1,524 +1,521 @@
// -*- C++ -*-
//
// Particle.cc is a part of ThePEG - Toolkit for HEP Event Generation
// Copyright (C) 1999-2011 Leif Lonnblad
//
// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined member functions of
// the Particle class.
//
#include "Particle.h"
#include "ThePEG/EventRecord/Step.h"
#include "ThePEG/EventRecord/Event.h"
#include "ThePEG/EventRecord/ColourLine.h"
#include "ThePEG/Utilities/Rebinder.h"
#include "ThePEG/Config/algorithm.h"
#include "ThePEG/EventRecord/ParticleTraits.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/PDT/DecayMode.h"
#include <iostream>
#include <iomanip>
#include <cctype>
#ifdef ThePEG_TEMPLATES_IN_CC_FILE
#include "Particle.tcc"
#endif
using namespace ThePEG;
Particle::ParticleRep::ParticleRep(const ParticleRep & p)
: theParents(p.theParents), theChildren(p.theChildren),
thePrevious(p.thePrevious), theNext(p.theNext),
theBirthStep(p.theBirthStep), theVertex(p.theVertex),
theLifeLength(p.theLifeLength), theScale(p.theScale),
theVetoScale(p.theVetoScale), theNumber(p.theNumber),
theExtraInfo(p.theExtraInfo.size()) {
if ( p.theColourInfo )
theColourInfo = dynamic_ptr_cast<CBPtr>(p.theColourInfo->clone());
if ( p.theSpinInfo )
theSpinInfo = dynamic_ptr_cast<SpinPtr>(p.theSpinInfo->clone());
for ( int i = 0, N = p.theExtraInfo.size(); i < N; ++i )
theExtraInfo[i] = p.theExtraInfo[i]->clone();
}
Particle::Particle(const Particle & p)
: Base(p), theData(p.theData), theMomentum(p.theMomentum), theRep(p.theRep) {
if ( p.theRep ) {
theRep = new ParticleRep(*p.theRep);
theRep->theParents.clear();
}
}
Particle::~Particle() {
if ( theRep ) {
if ( colourLine() ) colourLine()->removeColoured(this);
if ( antiColourLine() ) antiColourLine()->removeAntiColoured(this);
delete theRep;
}
theRep = 0;
theData = cEventPDPtr();
}
void Particle::initFull() {
if ( theRep ) return;
theRep = new ParticleRep;
Energy width = data().generateWidth(mass());
if ( width > ZERO ) {
Time lifetime = data().generateLifeTime(mass(), width);
theRep->theLifeLength.setTau(lifetime);
theRep->theLifeLength.
setVect((momentum().vect()*(lifetime /
max(mass(), Constants::epsilon*GeV))));
theRep->theLifeLength.rescaleEnergy();
}
}
PPtr Particle::clone() const {
return ptr_new<PPtr>(*this);
}
void Particle::rebind(const EventTranslationMap & trans) {
for ( ParticleVector::iterator pit = rep().theChildren.begin();
pit != rep().theChildren.end(); ++pit ) *pit = trans.translate(*pit);
for ( tParticleVector::iterator pit = rep().theParents.begin();
pit != rep().theParents.end(); ++pit ) *pit = trans.translate(*pit);
rep().thePrevious = trans.translate(rep().thePrevious);
rep().theNext = trans.translate(rep().theNext);
if ( hasColourInfo() ) colourInfo()->rebind(trans);
if ( spinInfo() ) spinInfo()->rebind(trans);
rep().theBirthStep = trans.translate(rep().theBirthStep);
for ( EIVector::const_iterator ie = rep().theExtraInfo.begin();
ie != rep().theExtraInfo.end(); ++ie ) (**ie).rebind(trans);
}
tParticleSet Particle::siblings() const {
tParticleSet theSiblings;
for ( tParticleVector::const_iterator pit = parents().begin();
pit != parents().end(); ++pit )
theSiblings.insert((*pit)->children().begin(), (*pit)->children().end());
theSiblings.erase(const_cast<Particle *>(this));
return theSiblings;
}
void Particle::colourNeighbour(tPPtr p, bool anti) {
tColinePtr line = colourLine(!anti);
if ( !line ) line = ColourLine::create(this, !anti);
line->addColoured(p, anti);
}
void Particle::outgoingColour(tPPtr p, bool anti) {
tColinePtr line = colourLine(anti);
if ( !line ) line = ColourLine::create(this, anti);
line->addColoured(p, anti);
}
tPPtr Particle::incomingColour(bool anti) const {
if ( !hasColourInfo() ) return tPPtr();
tColinePtr line = colourLine(anti);
if ( !line ) return tPPtr();
for ( int i = 0, N = parents().size(); i < N; ++i )
if ( parents()[i]->hasColourLine(line, anti) ) return parents()[i];
return tPPtr();
}
tPPtr Particle::outgoingColour(bool anti) const {
if ( !hasColourInfo() ) return tPPtr();
tColinePtr line = colourLine(anti);
if ( !line ) return tPPtr();
for ( int i = 0, N = children().size(); i < N; ++i )
if ( children()[i]->hasColourLine(line, anti) ) return children()[i];
return tPPtr();
}
LorentzPoint Particle::labVertex() const {
LorentzPoint r(rep().theBirthStep && rep().theBirthStep->collision()?
vertex() + rep().theBirthStep->collision()->vertex():
vertex());
return r;
}
void Particle::setLabVertex(const LorentzPoint & p) {
rep().theVertex = ( rep().theBirthStep && rep().theBirthStep->collision()?
p - rep().theBirthStep->collision()->vertex() : p );
}
void Particle::transform(const LorentzRotation & r) {
if ( hasRep() && spinInfo() ) spinInfo()->transform(momentum(), r);
theMomentum.transform(r);
if ( !hasRep() ) return;
rep().theVertex.transform(r);
rep().theLifeLength.transform(r);
}
void Particle::deepTransform(const LorentzRotation & r) {
transform(r);
if ( !theRep ) return;
for ( int i = 0, N = children().size(); i < N; ++i )
rep().theChildren[i]->deepTransform(r);
if ( rep().theNext ) rep().theNext->deepTransform(r);
}
void Particle::rotateX(double a) {
LorentzRotation r;
r.rotateX(a);
transform(r);
}
void Particle::deepRotateX(double a) {
LorentzRotation r;
r.rotateX(a);
deepTransform(r);
}
void Particle::rotateY(double a) {
LorentzRotation r;
r.rotateY(a);
transform(r);
}
void Particle::deepRotateY(double a) {
LorentzRotation r;
r.rotateY(a);
deepTransform(r);
}
void Particle::rotateZ(double a) {
LorentzRotation r;
r.rotateZ(a);
transform(r);
}
void Particle::deepRotateZ(double a) {
LorentzRotation r;
r.rotateZ(a);
deepTransform(r);
}
void Particle::rotate(double a, const Axis & axis) {
LorentzRotation r;
r.rotate(a, axis);
transform(r);
}
void Particle::deepRotate(double a, const Axis & axis) {
LorentzRotation r;
r.rotate(a, axis);
deepTransform(r);
}
string Particle::outputFormat =
"%n3%s10 %i7 %p[,]0 %c(,) %^^0%vv0 %>>0%<>0 %l{,}0\n"
" %x10.3%y10.3%z10.3%e10.3%m10.3\n";
int getNumber(string::const_iterator & pos, int def) {
if ( !isdigit(*pos) ) return def;
def = *pos++ - '0';
while ( isdigit(*pos) ) def = 10*def + *pos++ - '0';
return def;
}
void writePrecision(ostream & os, string::const_iterator & pos,
int defw, int defp, double x) {
defw = getNumber(pos, defw);
if ( *pos == '.' ) defp = getNumber(++pos, defp);
int oldp = os.precision();
os << setprecision(defp) << setw(defw) << x << setprecision(oldp);
}
void writeStringAdjusted(ostream & os, bool left, int w, string str) {
while ( !left && w-- > int(str.size()) ) os << ' ';
os << str;
while ( left && w-- > int(str.size()) ) os << ' ';
}
template <typename Container>
void writeParticleRanges(ostream & os, const Container & co, char sep, int w) {
set<int> cnum;
for ( typename Container::const_iterator it = co.begin();
it != co.end(); ++it) cnum.insert((**it).number());
bool elipsis = false;
int last = -10;
for ( set<int>::iterator it = cnum.begin(); it != cnum.end(); ++it) {
int n = *it;
int next = 0;
set<int>::iterator itn = it;
if ( ++itn != cnum.end() ) next = *itn;
bool writeit = true;
bool writesep = false;
if ( elipsis && ( n != last + 1 || n != next - 1 ) )
elipsis = false;
else if ( !elipsis && n == last + 1 && n == next -1 ) {
os << "..";
elipsis = true;
writeit = false;
}
else if ( elipsis && n == last + 1 && n == next -1 )
writeit = false;
else if ( it != cnum.begin() )
writesep = true;
if ( writeit ) {
if ( writesep ) os << sep;
os << setw(w) << n;
}
last = n;
}
}
ostream & ThePEG::operator<<(ostream & os, const Particle & p) {
return p.print(os, p.birthStep());
}
ostream & Particle::print(ostream & os, tcStepPtr step) const {
if ( !step ) step = birthStep();
tCollPtr coll = step? step->collision(): tCollPtr();
tEventPtr event = coll? coll->event(): tEventPtr();
string::const_iterator pos = Particle::outputFormat.begin();
ios::fmtflags saveflags = os.setf(ios::fixed, ios::floatfield);
while ( pos != Particle::outputFormat.end() ) {
if ( *pos == '%' && ++pos != Particle::outputFormat.end() ) {
bool left = false;
if ( *pos == '-' ) {
left = true;
os.setf(ios::left, ios::adjustfield);
++pos;
} else {
os.setf(ios::right, ios::adjustfield);
}
char mark;
char open;
char close;
char sep;
int w;
string str;
string fill;
if ( pos == Particle::outputFormat.end() ) break;
bool fullColour = false;
switch ( *pos ) {
case 'n':
os << setw(getNumber(++pos, 3)) << number();
break;
case 'i':
os << setw(getNumber(++pos, 8)) << id();
break;
case 's':
writeStringAdjusted(os, left, getNumber(++pos, 8), PDGName());
break;
case 'x':
writePrecision(os, ++pos, 10, 3, momentum().x()/GeV);
break;
case 'y':
writePrecision(os, ++pos, 10, 3, momentum().y()/GeV);
break;
case 'z':
writePrecision(os, ++pos, 10, 3, momentum().z()/GeV);
break;
case 'e':
writePrecision(os, ++pos, 10, 3, momentum().e()/GeV);
break;
case 'm':
writePrecision(os, ++pos, 10, 3, momentum().mass()/GeV);
break;
case 'P':
fullColour = true;
case 'p':
open = *++pos;
sep = *++pos;
close = *++pos;
w = getNumber(++pos, 0);
if ( parents().empty() ) break;
if ( open ) os << open;
writeParticleRanges(os, parents(), sep, w);
if ( fullColour && hasColourInfo() &&
( incomingColour() || incomingAntiColour() ) ) {
if ( close ) os << open;
if ( incomingColour() )
os << "+" << incomingColour()->number();
if ( incomingAntiColour() )
os << "-" << incomingAntiColour()->number();
if ( close ) os << close;
}
if ( close ) os << close;
break;
case 'l':
open = *++pos;
sep = *++pos;
close = *++pos;
w = getNumber(++pos, 0);
if ( hasColourInfo() &&
( colourLine() || antiColourLine() ) && event) {
if ( open ) os << open;
vector<tcColinePtr> clines = colourInfo()->colourLines();
for ( int i = 0, N = clines.size(); i < N; ++i ) {
if ( i > 0 && sep ) os << sep;
clines[i]->write(os, event, false);
}
vector<tcColinePtr> aclines = colourInfo()->antiColourLines();
for ( int i = 0, N = aclines.size(); i < N; ++i ) {
if ( ( i > 0 || clines.size() ) && sep ) os << sep;
aclines[i]->write(os, event, true);
}
if ( close ) os << close;
}
break;
case 'C':
fullColour = true;
case 'c':
open = *++pos;
sep = *++pos;
close = *++pos;
w = getNumber(++pos, 0);
if ( children().empty() ) break;
if ( open ) os << open;
writeParticleRanges(os, children(), sep, w);
if ( fullColour && hasColourInfo() &&
( outgoingColour() || outgoingAntiColour() ) ) {
if ( close ) os << open;
if ( outgoingColour() )
os << "+" << outgoingColour()->number();
if ( outgoingAntiColour() )
os << "-" << outgoingAntiColour()->number();
if ( close ) os << close;
}
if ( close ) os << close;
break;
case '>':
mark = *++pos;
w = getNumber(++pos, 0);
if ( hasColourInfo() && step && step->colourNeighbour(this) ) {
os << setw(w-1) << step->colourNeighbour(this)->number() << mark;
}
break;
case '<':
mark = *++pos;
w = getNumber(++pos, 0);
if ( hasColourInfo() && step && step->antiColourNeighbour(this) ) {
int n = step->antiColourNeighbour(this)->number();
ostringstream oss;
oss << mark << n;
writeStringAdjusted(os, left, w, oss.str());
}
break;
case 'v':
mark = *++pos;
w = getNumber(++pos, 0);
if ( next() ) {
if ( left && mark ) os << mark;
os << setw(w) << next()->number();
if ( !left && mark ) os << mark;
}
break;
case '^':
mark = *++pos;
w = getNumber(++pos, 0);
if ( previous() ) {
if ( left && mark ) os << mark;
os << setw(w) << previous()->number();
if ( !left && mark ) os << mark;
}
break;
case 'd':
switch ( *++pos ) {
case 'x':
writePrecision(os, ++pos, 10, 3, lifeLength().x()/mm);
break;
case 'y':
writePrecision(os, ++pos, 10, 3, lifeLength().y()/mm);
break;
case 'z':
writePrecision(os, ++pos, 10, 3, lifeLength().z()/mm);
break;
case 't':
writePrecision(os, ++pos, 10, 3, lifeLength().e()/mm);
break;
case 'T':
writePrecision(os, ++pos, 10, 3, lifeLength().tau()/mm);
break;
}
break;
case 'V':
switch ( *++pos ) {
case 'x':
writePrecision(os, ++pos, 10, 3, vertex().x()/mm);
break;
case 'y':
writePrecision(os, ++pos, 10, 3, vertex().y()/mm);
break;
case 'z':
writePrecision(os, ++pos, 10, 3, vertex().z()/mm);
break;
case 't':
writePrecision(os, ++pos, 10, 3, vertex().e()/mm);
break;
}
case 'L':
switch ( *++pos ) {
case 'x':
writePrecision(os, ++pos, 10, 3, labVertex().x()/mm);
break;
case 'y':
writePrecision(os, ++pos, 10, 3, labVertex().y()/mm);
break;
case 'z':
writePrecision(os, ++pos, 10, 3, labVertex().z()/mm);
break;
case 't':
writePrecision(os, ++pos, 10, 3, labVertex().e()/mm);
break;
}
break;
default:
os << *pos++;
}
} else {
if ( pos != Particle::outputFormat.end() ) os << *pos++;
}
}
os.flags(saveflags);
return os;
}
void Particle::debugme() const {
cerr << *this;
EventRecordBase::debugme();
}
void Particle::persistentOutput(PersistentOStream & os) const {
EventConfig::putParticleData(os, theData);
os << ounit(theMomentum, GeV) << bool( theRep != 0 );
if ( !theRep ) return;
os << rep().theParents << rep().theChildren
<< rep().thePrevious << rep().theNext << rep().theBirthStep
<< ounit(rep().theVertex, mm) << ounit(rep().theLifeLength, mm)
<< ounit(rep().theScale, GeV2) << ounit(rep().theVetoScale, GeV2)
<< rep().theNumber << rep().theDecayMode
<< rep().theColourInfo << rep().theSpinInfo << rep().theExtraInfo;
}
void Particle::persistentInput(PersistentIStream & is, int) {
bool readRep;
EventConfig::getParticleData(is, theData);
is >> iunit(theMomentum, GeV) >> readRep;
if ( !readRep ) return;
if ( !hasRep() ) theRep = new ParticleRep;
is >> rep().theParents >> rep().theChildren
>> rep().thePrevious >> rep().theNext >> rep().theBirthStep
>> iunit(rep().theVertex, mm) >> iunit(rep().theLifeLength, mm)
>> iunit(rep().theScale, GeV2) >> iunit(rep().theVetoScale, GeV2)
>> rep().theNumber >> rep().theDecayMode
>> rep().theColourInfo >> rep().theSpinInfo >> rep().theExtraInfo;
}
ClassDescription<Particle> Particle::initParticle;
void Particle::Init() {}
-
-ThePEG_IMPLEMENT_SET(PPtr,ParticleSet)
-
diff --git a/EventRecord/Step.cc b/EventRecord/Step.cc
--- a/EventRecord/Step.cc
+++ b/EventRecord/Step.cc
@@ -1,450 +1,448 @@
// -*- C++ -*-
//
// Step.cc is a part of ThePEG - Toolkit for HEP Event Generation
// Copyright (C) 1999-2011 Leif Lonnblad
//
// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the Step class.
//
#include "Step.h"
#include "ThePEG/Utilities/Rebinder.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Config/algorithm.h"
#include <iostream>
#include <iomanip>
#ifdef ThePEG_TEMPLATES_IN_CC_FILE
#include "Step.tcc"
#endif
using namespace ThePEG;
Step::Step(const Step & s)
: Base(s),
theParticles(s.theParticles), theIntermediates(s.theIntermediates),
allParticles(s.allParticles), theCollision(s.theCollision),
theHandler(s.theHandler) {}
Step::~Step() {
for ( ParticleSet::iterator it = allParticles.begin();
it != allParticles.end(); ++it )
if ( (**it).hasRep() && (**it).birthStep() == this )
(**it).rep().theBirthStep = tStepPtr();
theParticles.clear();
theIntermediates.clear();
theSubProcesses.clear();
allParticles.clear();
theCollision = tCollPtr();
theHandler = tcEventBasePtr();
}
StepPtr Step::clone() const {
return ptr_new<StepPtr>(*this);
}
void Step::rebind(const EventTranslationMap & trans) {
ParticleSet::const_iterator pit;
allParticles.clear();
for ( pit = theParticles.begin(); pit != theParticles.end(); ++pit )
allParticles.insert(trans.translate(*pit));
theParticles.swap(allParticles);
allParticles.clear();
for ( pit = theIntermediates.begin(); pit != theIntermediates.end(); ++pit )
allParticles.insert(trans.translate(*pit));
theIntermediates = allParticles;
allParticles.insert(theParticles.begin(), theParticles.end());
for ( pit = allParticles.begin(); pit != allParticles.end(); ++pit )
(**pit).rebind(trans);
}
void Step::addParticle(tPPtr p) {
if ( !p->birthStep() ) p->rep().theBirthStep = this;
theParticles.insert(p);
allParticles.insert(p);
if ( collision() ) collision()->addParticle(p);
}
void Step::addSubProcess(tSubProPtr sp) {
if (( !member(allParticles, sp->incoming().first) && collision() &&
sp->incoming().first != collision()->incoming().first) &&
std::find(sp->incoming().first->parents().begin(),
sp->incoming().first->parents().end(),
collision()->incoming().first)==
sp->incoming().first->parents().end()) {
collision()->incoming().first->
rep().theChildren.push_back(sp->incoming().first);
sp->incoming().first->rep().theParents.push_back(collision()->incoming().first);
}
if (( !member(allParticles, sp->incoming().second) && collision() &&
sp->incoming().second != collision()->incoming().second) &&
std::find(sp->incoming().second->parents().begin(),
sp->incoming().second->parents().end(),collision()->incoming().second)==
sp->incoming().second->parents().end()) {
collision()->incoming().second->
rep().theChildren.push_back(sp->incoming().second);
sp->incoming().second->rep().theParents.push_back(collision()->incoming().second);
}
if ( !sp->incoming().first->birthStep() )
sp->incoming().first->rep().theBirthStep = this;
if ( !sp->incoming().second->birthStep() )
sp->incoming().second->rep().theBirthStep = this;
addIntermediate(sp->incoming().first);
addIntermediate(sp->incoming().second);
addIntermediates(sp->intermediates().begin(), sp->intermediates().end());
addParticles(sp->outgoing().begin(), sp->outgoing().end());
theSubProcesses.push_back(sp);
if ( collision() ) collision()->addSubProcess(sp);
}
void Step::removeSubProcess(tSubProPtr sp) {
SubProcessVector::iterator sit = ThePEG::find(theSubProcesses, sp);
if ( sit == theSubProcesses.end() ) return;
for ( int i = 0, N = sp->outgoing().size(); i < N; ++i )
removeParticle(sp->outgoing()[i]);
for ( int i = 0, N = sp->intermediates().size(); i < N; ++i )
removeParticle(sp->intermediates()[i]);
removeParticle(sp->incoming().first);
removeParticle(sp->incoming().second);
theSubProcesses.erase(sit);
if ( collision() ) collision()->removeSubProcess(sp);
}
void Step::addIntermediate(tPPtr p) {
theIntermediates.insert(p);
ParticleSet::iterator pit = theParticles.find(p);
if ( pit != theParticles.end() ) theParticles.erase(pit);
else {
if ( !p->birthStep() ) p->rep().theBirthStep = this;
allParticles.insert(p);
if ( collision() ) collision()->addParticle(p);
}
}
void Step::
insertIntermediate(tPPtr p, tPPtr parent, tPPtr child) {
if ( !p->birthStep() ) p->rep().theBirthStep = this;
addIntermediate(p);
parent->removeChild(child);
child->removeParent(parent);
if ( parent ) {
parent->rep().theChildren.push_back(p);
p->rep().theParents.push_back(parent);
}
if ( child ) {
p->rep().theChildren.push_back(child);
child->rep().theParents.push_back(p);
}
}
void Step::removeEntry(tPPtr p) {
ParticleSet::iterator it = allParticles.find(p);
if ( it == allParticles.end() ) return;
allParticles.erase(it);
it = theParticles.find(p);
if ( it != theParticles.end() ) theParticles.erase(it);
if ( p->previous() ) {
it = theIntermediates.find(p->previous());
if ( it != theIntermediates.end() ) theIntermediates.erase(it);
theParticles.insert(p->previous());
allParticles.insert(p->previous());
}
while ( !p->parents().empty() ) {
PPtr parent = p->parents().back();
p->removeParent(parent);
parent->removeChild(p);
if ( !parent->children().empty() ) continue;
it = theIntermediates.find(parent);
if ( it != theIntermediates.end() ) theIntermediates.erase(it);
theParticles.insert(parent);
allParticles.insert(parent);
}
if ( p->hasColourInfo() ) {
if ( colourNeighbour(p) )
colourNeighbour(p)->antiColourNeighbour(antiColourNeighbour(p));
if ( antiColourNeighbour(p) )
antiColourNeighbour(p)->colourNeighbour(colourNeighbour(p));
if ( p->incomingColour() ) p->outgoingColour(tPPtr());
if ( p->incomingAntiColour() ) p->outgoingAntiColour(tPPtr());
}
it = theIntermediates.find(p);
if ( it != theIntermediates.end() ) theIntermediates.erase(it);
}
void Step::removeParticle(tPPtr p) {
if ( p->next() ) removeParticle(p->next());
while ( !p->children().empty() ) removeParticle(p->children().back());
removeEntry(p);
}
bool Step::nullStep() const {
for ( ParticleSet::const_iterator it = allParticles.begin();
it != allParticles.end(); ++it )
if ( (**it).birthStep() == this ) return false;
return true;
}
tPPtr Step::copyParticle(tcPPtr pin) {
PPtr cp;
tPPtr p = const_ptr_cast<tPPtr>(pin);
if ( !collision() ) return cp;
ParticleSet::iterator pit = theParticles.find(p);
if ( collision()->finalStep() != this || p->next() ||
! p->children().empty() || pit == theParticles.end() ) return cp;
cp = p->clone();
cp->rep().thePrevious = p;
p->rep().theNext = cp;
if ( p->hasColour() ) p->colourFlow(cp);
if ( p->hasAntiColour() ) p->antiColourFlow(cp);
cp->rep().theBirthStep = this;
theParticles.erase(pit);
if ( p->birthStep() == this ) theIntermediates.insert(p);
addParticle(cp);
return cp;
}
bool Step::setCopy(tcPPtr poldin, tPPtr pnew) {
if ( poldin->id() != pnew->id() ) return false;
tPPtr pold = const_ptr_cast<tPPtr>(poldin);
pold->rep().theNext = pnew;
pnew->rep().thePrevious = pold;
theParticles.erase(pold);
if ( pold->birthStep() == this ) theIntermediates.insert(pold);
pnew->rep().theBirthStep = this;
addParticle(pnew);
return true;
}
tPPtr Step::insertCopy(tcPPtr pin) {
PPtr cp;
tPPtr p = const_ptr_cast<tPPtr>(pin);
if ( !collision() ) return cp;
if ( collision()->all().find(p) == collision()->all().end() ) return cp;
cp = p->clone();
cp->rep().theNext = p;
cp->rep().theChildren.clear();
if ( p->previous() ) {
p->previous()->rep().theNext = cp;
cp->rep().thePrevious = p->previous();
} else {
for ( int i = 0, N = p->parents().size(); i < N; ++i ) {
tPPtr parent = p->parents()[i];
for ( int j = 0, M = parent->children().size(); j < M; ++j )
if ( parent->children()[j] == p ) parent->rep().theChildren[j] = cp;
}
}
p->rep().theParents.clear();
p->rep().thePrevious = cp;
if ( p->hasColour() ) cp->colourFlow(p);
if ( p->hasAntiColour() ) cp->antiColourFlow(p);
cp->rep().theBirthStep = this;
theIntermediates.insert(cp);
return cp;
}
bool Step::removeDecayProduct(tcPPtr par, tPPtr child) {
if ( !collision() ) return false;
tPPtr parent = const_ptr_cast<tPPtr>(par->final());
if ( collision()->all().find(parent) == collision()->all().end() )
return false;
if ( !par->hasRep() ) return false;
PVector::iterator it = ThePEG::find(parent->rep().theChildren, child);
if ( it == parent->rep().theChildren.end() ) return false;
parent->rep().theChildren.erase(it);
ParticleSet::iterator cit = theParticles.find(child);
if ( cit != theParticles.end() ) {
theParticles.erase(cit);
if ( child->birthStep() == this ) theIntermediates.insert(child);
}
return true;
}
bool Step::addDecayProduct(tcPPtr par, tPPtr child, bool fixColour) {
if ( !collision() ) return false;
tPPtr parent = const_ptr_cast<tPPtr>(par->final());
if ( collision()->finalStep() != this || parent->next() ) return false;
ParticleSet::iterator pit = theParticles.find(parent);
if ( pit != theParticles.end() ) {
theParticles.erase(pit);
if ( parent->birthStep() == this ) theIntermediates.insert(parent);
} else {
if ( parent != collision()->incoming().first &&
parent != collision()->incoming().second &&
parent->children().empty() ) return false;
}
parent->rep().theChildren.push_back(child);
child->rep().theParents.push_back(parent);
child->rep().theBirthStep = this;
addParticle(child);
if ( !fixColour || !parent->hasColourInfo() || !parent->coloured() ||
!child->coloured() ) return true;
if ( parent->hasColour() && child->hasColour() &&
!parent->outgoingColour() && !child->colourLine() )
parent->colourFlow(child);
if ( parent->hasAntiColour() && child->hasAntiColour() &&
!child->antiColourLine() ) {
if ( parent->outgoingAntiColour() )
parent->antiColourLine()->
removeAntiColoured(parent->outgoingAntiColour());
parent->antiColourFlow(child);
}
return true;
}
void Step::addDecayNoCheck(tPPtr parent, tPPtr child) {
ParticleSet::iterator pit = theParticles.find(parent);
if ( pit != theParticles.end() ) {
theParticles.erase(pit);
if ( parent->birthStep() == this ) theIntermediates.insert(parent);
}
child->rep().theBirthStep = this;
addParticle(child);
}
void Step::addDecayProduct(tPPtr child) {
for ( int i = 0, N = child->parents().size(); i < N; ++i ) {
ParticleSet::iterator pit = theParticles.find(child->parents()[i]);
if ( pit != theParticles.end() ) {
theParticles.erase(pit);
if ( child->parents()[i]->birthStep() == this )
theIntermediates.insert(child->parents()[i]);
}
}
child->rep().theBirthStep = this;
addParticle(child);
}
void Step::fixColourFlow() {
tParticleVector news;
for ( ParticleSet::iterator pi = theParticles.begin();
pi != theParticles.end(); ++pi )
if ( (**pi).birthStep() == this ) news.push_back(*pi);
for ( int i = 0, N = news.size(); i < N; ++i ) {
tPPtr p = news[i];
if ( p->hasColour() && !antiColourNeighbour(p) ) {
tPPtr ng = p;
while ( ( ng = ng->incomingColour() ) && !antiColourNeighbour(ng) ) {}
if ( ng ) {
ng = antiColourNeighbour(ng);
if ( !ng->outgoingColour() ) ng = copyParticle(ng);
while ( ng->outgoingColour() ) ng = ng->outgoingColour();
p->antiColourConnect(ng);
}
}
if ( p->hasAntiColour() && !colourNeighbour(p) ) {
tPPtr ng = p;
while ( ( ng = ng->incomingAntiColour() ) && !colourNeighbour(ng) ) {}
if ( ng ) {
ng = colourNeighbour(ng);
if ( !ng->outgoingAntiColour() ) ng = copyParticle(ng);
while ( ng->outgoingAntiColour() ) ng = ng->outgoingAntiColour();
p->colourConnect(ng);
}
}
}
}
tPPtr Step::antiColourNeighbour(tcPPtr p) const {
return colourNeighbour(p, true);
}
tPPtr Step::colourNeighbour(tcPPtr p, bool anti) const {
if ( !member(particles(), const_ptr_cast<tPPtr>(p)) ) return tPPtr();
tColinePtr line = p->colourLine(!anti);
if ( !line ) return tPPtr();
for ( ParticleSet::const_iterator it = particles().begin();
it != particles().end(); ++it )
if ( (**it).hasColourLine(line, anti) ) return *it;
return tPPtr();
}
vector<tPVector> Step::getSinglets(tParticleSet & left) {
vector<tPVector> ret;
while ( !left.empty() ) {
tPPtr first = *left.begin();
left.erase(first);
if ( !first->hasColourInfo() || !first->coloured() ) continue;
tPPtr last = first;
tPPtr test;
while ( ( test = last->antiColourNeighbour(left.begin(), left.end()) ) &&
test != first )
last = test;
while ( ( test = first->colourNeighbour(left.begin(), left.end()) ) &&
test != last )
first = test;
ret.push_back(tPVector());
for ( ; first != last;
first = first->antiColourNeighbour(left.begin(), left.end()) ) {
left.erase(first);
ret.back().push_back(first);
}
left.erase(first);
ret.back().push_back(first);
}
return ret;
}
ostream & ThePEG::operator<<(ostream & os, const Step & s) {
if ( !s.intermediates().empty() ) os << "--- intermediates:" << endl;
Particle::PrintParticles(os, s.intermediates(), &s);
os << "--- final:" << endl;
LorentzMomentum sum;
Energy2 sumx = Energy2();
Energy2 sumy = Energy2();
Energy2 sumz = Energy2();
Particle::PrintParticles(os, s.particles(), &s);
for ( ParticleSet::const_iterator it = s.particles().begin();
it != s.particles().end(); ++it ) {
sum += (**it).momentum();
sumx += sqr((**it).momentum().x());
sumy += sqr((**it).momentum().y());
sumz += sqr((**it).momentum().z());
}
os << string(78, '-') << endl << " Sum of momenta: ";
int oldprecision = os.precision();
Energy sumx1
= ( sqr(sum.x()) > Constants::epsilon*sumx ?
sum.x(): ZERO );
Energy sumy1
= ( sqr(sum.y()) > Constants::epsilon*sumy ?
sum.y(): ZERO );
Energy sumz1
= ( sqr(sum.z()) > Constants::epsilon*sumz ?
sum.z(): ZERO );
os << setprecision(3) << setw(10) << sumx1/GeV << setw(10) << sumy1/GeV
<< setw(10) << sumz1/GeV << setw(10) << sum.e()/GeV
<< setw(10) << sum.m()/GeV << endl << setprecision(oldprecision);
return os;
}
void Step::debugme() const {
cerr << *this;
EventRecordBase::debugme();
}
void Step::persistentOutput(PersistentOStream & os) const {
os << theParticles << theIntermediates << theSubProcesses << allParticles
<< theCollision;
EventConfig::putHandler(os, theHandler);
}
void Step::persistentInput(PersistentIStream & is, int) {
is >> theParticles >> theIntermediates >> theSubProcesses >> allParticles
>> theCollision;
EventConfig::getHandler(is, theHandler);
}
ClassDescription<Step> Step::initStep;
void Step::Init() {}
-
-ThePEG_IMPLEMENT_SET(StepPtr,StepSet)
diff --git a/EventRecord/SubProcess.cc b/EventRecord/SubProcess.cc
--- a/EventRecord/SubProcess.cc
+++ b/EventRecord/SubProcess.cc
@@ -1,152 +1,150 @@
// -*- C++ -*-
//
// SubProcess.cc is a part of ThePEG - Toolkit for HEP Event Generation
// Copyright (C) 1999-2011 Leif Lonnblad
// Copyright (C) 2009-2011 Simon Platzer
//
// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the SubProcess class.
//
#include "SubProcess.h"
#include "ThePEG/EventRecord/Collision.h"
#include "ThePEG/Config/algorithm.h"
#include "ThePEG/EventRecord/ParticleTraits.h"
#include "ThePEG/Utilities/Rebinder.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include <iostream>
#ifdef ThePEG_TEMPLATES_IN_CC_FILE
#include "SubProcess.tcc"
#endif
using namespace ThePEG;
SubProcess::
SubProcess(const PPair & newIncoming,
tCollPtr newCollision, tcEventBasePtr newHandler,
tSubProPtr newHead, double newGroupWeight)
: theHandler(newHandler), theCollision(newCollision),
theIncoming(newIncoming), isDecayed(false),
theHead(newHead), theGroupWeight(newGroupWeight) {}
SubProcess::~SubProcess() {}
SubProPtr SubProcess::clone() const {
return ptr_new<SubProPtr>(*this);
}
void SubProcess::addIntermediate(tPPtr p, bool fixrelations) {
if ( fixrelations ) {
incoming().first->rep().theChildren.push_back(p);
incoming().second->rep().theChildren.push_back(p);
p->rep().theParents.push_back(incoming().first);
p->rep().theParents.push_back(incoming().second);
}
theIntermediates.push_back(p);
}
void SubProcess::addOutgoing(tPPtr p, bool fixrelations) {
if ( fixrelations ) {
if ( intermediates().empty() ) {
incoming().first->rep().theChildren.push_back(p);
incoming().second->rep().theChildren.push_back(p);
p->rep().theParents.push_back(incoming().first);
p->rep().theParents.push_back(incoming().second);
} else {
for (ParticleVector::iterator it = theIntermediates.begin();
it != theIntermediates.end(); ++it ) {
(**it).rep().theChildren.push_back(p);
p->rep().theParents.push_back(*it);
}
}
}
theOutgoing.push_back(p);
}
void SubProcess::changeIncoming(tPPtr pnew, tPPtr pold) {
if(pold==theIncoming.first) {
theIntermediates.push_back(pold);
theIncoming.first = pnew;
}
else if(pold==theIncoming.second) {
theIntermediates.push_back(pold);
theIncoming.second = pnew;
}
}
void SubProcess::rebind(const EventTranslationMap & trans) {
theIncoming.first = trans.translate(theIncoming.first);
theIncoming.second = trans.translate(theIncoming.second);
theCollision = trans.translate(theCollision);
for ( ParticleVector::iterator pit = theOutgoing.begin();
pit != theOutgoing.end(); ++pit )
*pit = trans.translate(*pit);
for ( ParticleVector::iterator pit = theIntermediates.begin();
pit != theIntermediates.end(); ++pit )
*pit = trans.translate(*pit);
}
void SubProcess::removeEntry(tPPtr p) {
if ( p == theIncoming.first ) theIncoming.first = PPtr();
if ( p == theIncoming.second ) theIncoming.second = PPtr();
ParticleVector::iterator pit = theOutgoing.begin();
while ( pit != theOutgoing.end() ) {
if ( *pit == p ) pit = theOutgoing.erase(pit);
else ++pit;
}
pit = theIntermediates.begin();
while ( pit != theIntermediates.end() ) {
if ( *pit == p ) pit = theIntermediates.erase(pit);
else ++pit;
}
}
void SubProcess::transform(const LorentzRotation & r) {
incoming().first->transform(r);
incoming().second->transform(r);
for_each(intermediates(), Transformer(r));
for_each(outgoing(), Transformer(r));
}
void SubProcess::printMe(ostream& os) const {
os << "--- incoming:" << endl
<< *incoming().first << *incoming().second;
if ( !intermediates().empty() ) os << "--- intermediates:" << endl;
Particle::PrintParticles(os, intermediates().begin(),
intermediates().end());
os << "--- outgoing:" << endl;
Particle::PrintParticles(os, outgoing().begin(), outgoing().end());
}
ostream & ThePEG::operator<<(ostream & os, const SubProcess & sp) {
sp.printMe(os);
return os;
}
void SubProcess::debugme() const {
cerr << *this;
EventRecordBase::debugme();
}
void SubProcess::persistentOutput(PersistentOStream & os) const {
EventConfig::putHandler(os, theHandler);
os << theCollision << theIncoming << theIntermediates << theOutgoing
<< isDecayed << theHead << theGroupWeight;
}
void SubProcess::persistentInput(PersistentIStream & is, int) {
EventConfig::getHandler(is, theHandler);
is >> theCollision >> theIncoming >> theIntermediates >> theOutgoing
>> isDecayed >> theHead >> theGroupWeight;
}
ClassDescription<SubProcess> SubProcess::initSubProcess;
void SubProcess::Init() {}
-
-ThePEG_IMPLEMENT_SET(SubProPtr,SubProcessSet)
diff --git a/PDT/DecayMode.cc b/PDT/DecayMode.cc
--- a/PDT/DecayMode.cc
+++ b/PDT/DecayMode.cc
@@ -1,685 +1,680 @@
// -*- C++ -*-
//
// DecayMode.cc is a part of ThePEG - Toolkit for HEP Event Generation
// Copyright (C) 1999-2011 Leif Lonnblad
//
// ThePEG is licenced under version 2 of the GPL, see COPYING for details.
// Please respect the MCnet academic guidelines, see GUIDELINES for details.
//
//
// This is the implementation of the non-inlined, non-templated member
// functions of the DecayMode class.
//
#include "DecayMode.h"
#include "DecayMode.xh"
#include "ThePEG/Repository/Repository.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Utilities/Rebinder.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Reference.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Utilities/EnumIO.h"
using namespace ThePEG;
DecayMode::DecayMode()
: theBrat(0.0), isOn(false) {}
DecayMode::DecayMode(tPDPtr newParticle, double newBrat, bool newOn)
: theBrat(newBrat), isOn(newOn), theParent(newParticle) {}
DecayMode::DecayMode(const DecayMode & dm)
: Interfaced(dm), theTag(dm.theTag), theBrat(dm.theBrat), isOn(dm.isOn),
theParent(dm.theParent), theProducts(dm.theProducts),
theOrderedProducts(dm.theOrderedProducts),
theCascadeProducts(dm.theCascadeProducts), theMatchers(dm.theMatchers),
theWildMatcher(dm.theWildMatcher), theExcluded(dm.theExcluded),
theOverlap(dm.theOverlap), theDecayer(dm.theDecayer),
theAntiPartner(dm.theAntiPartner), theLinks(dm.theLinks) {}
DecayMode::~DecayMode() {}
DMPtr DecayMode::Create(tPDPtr newParent, double newBrat, bool newOn) {
DMPtr dm = new_ptr(DecayMode(newParent, newBrat, newOn));
Repository::Register(dm, newParent->fullName() + "/NEWMODE");
if ( !newParent->CC() ) return dm;
DMPtr adm = new_ptr(DecayMode(newParent->CC(), newBrat, newOn));
Repository::Register(adm, newParent->CC()->fullName() + "/NEWMODE");
dm->theAntiPartner = adm;
adm->theAntiPartner = dm;
return dm;
}
void DecayMode::readSetup(istream & is) {
string decnam;
is >> theBrat >> ienum(isOn) >> decnam;
if ( decnam.empty() ) return;
BaseRepository::DirectoryAppend(decnam);
setDecayer(BaseRepository::GetObject<tDecayerPtr>(decnam));
}
IBPtr DecayMode::clone() const {
return dmclone();
}
DMPtr DecayMode::dmclone() const {
return new_ptr(*this);
}
IBPtr DecayMode::fullclone() const {
DMPtr dm = dmclone();
Repository::Register(dm);
if ( !CC() ) return dm;
DMPtr adm = CC()->dmclone();
Repository::Register(adm);
dm->theAntiPartner = adm;
adm->theAntiPartner = dm;
return dm;
}
void DecayMode::doupdate() {
Interfaced::doupdate();
bool redo = touched();
UpdateChecker::check(decayer(), redo);
if ( !redo ) return;
if ( theBrat > 0.0 && isOn && !decayer()->accept(*this) )
throw DecModNoAccept(tag(), decayer()->name());
}
void DecayMode::rebind(const TranslationMap & trans) {
try {
theParent = trans.alwaysTranslate(theParent);
ParticleMSet newProducts;
trans.alwaysTranslate(inserter(newProducts),
products().begin(), products().end());
products().swap(newProducts);
tPDVector newOrdered;
trans.alwaysTranslate(inserter(newOrdered),
orderedProducts().begin(), orderedProducts().end());
theOrderedProducts.swap(newOrdered);
ModeMSet newCasc;
trans.alwaysTranslate(inserter(newCasc),
cascadeProducts().begin(), cascadeProducts().end());
cascadeProducts().swap(newCasc);
MatcherMSet newMatchers;
trans.alwaysTranslate(inserter(newMatchers),
productMatchers().begin(), productMatchers().end());
productMatchers().swap(newMatchers);
wildProductMatcher() = trans.alwaysTranslate(wildProductMatcher());
ParticleMSet newExclude;
trans.alwaysTranslate(inserter(newExclude),
excluded().begin(), excluded().end());
excluded().swap(newExclude);
theAntiPartner = trans.alwaysTranslate(CC());
for ( int i = 0, N = theLinks.size(); i < N; ++i ) {
theLinks[i].first = trans.alwaysTranslate(theLinks[i].first);
theLinks[i].second = trans.alwaysTranslate(theLinks[i].second);
}
}
catch (IBPtr ip) {
throw DecModRebind(name(), ip->name());
}
catch (...) {
throw DecModRebind(name(), "<unknown>");
}
}
IVector DecayMode::getReferences() {
IVector ret;
ret.push_back(theParent);
ret.insert(ret.end(), products().begin(), products().end());
ret.insert(ret.end(), cascadeProducts().begin(), cascadeProducts().end());
ret.insert(ret.end(), productMatchers().begin(), productMatchers().end());
if ( wildProductMatcher() ) ret.push_back(wildProductMatcher());
ret.insert(ret.end(), excluded().begin(), excluded().end());
if ( CC() ) ret.push_back(CC());
return ret;
}
bool DecayMode::addOverlap(tcDMPtr d) {
bool inc = includes(*d);
if ( !inc ) return false;
if ( find(theOverlap.begin(), theOverlap.end(), d) != theOverlap.end() )
return true;
theOverlap.push_back(d);
return true;
}
void DecayMode::resetOverlap() {
theOverlap.clear();
}
bool DecayMode::
compareId(const ParticleMSet & s1, const ParticleMSet & si2) const {
if ( generator() ) return s1 == si2;
ParticleMSet s2 = si2;
for ( ParticleMSet::const_iterator p1 = s1.begin(); p1 != s1.end(); ++p1 ) {
ParticleMSet::const_iterator p2 = s2.begin();
while ( p2 != s2.end() && (**p2).id() != (**p1).id() ) ++p2;
if ( p2 == s2.end() ) return false;
s2.erase(p2);
}
return s2.empty();
}
ParticleMSet::const_iterator
DecayMode::findId(const ParticleMSet & s, const ParticleData & p) const {
for ( ParticleMSet::const_iterator pit = s.begin(); pit != s.end(); ++pit )
if ( (**pit).id() == p.id() ) return pit;
return s.end();
}
struct IdCmp {
bool operator()(tcPDPtr p1, tcPDPtr p2) { return p1->id() == p2->id(); }
};
bool DecayMode::includes(const DecayMode & d) const {
// Fast check for ordinary decay modes.
if ( cascadeProducts().empty() && productMatchers().empty() &&
excluded().empty() && !wildProductMatcher() &&
d.cascadeProducts().empty() && d.productMatchers().empty() &&
d.excluded().empty() && !d.wildProductMatcher() ) {
if ( links().size() != d.links().size() ) return false;
if ( !compareId(products(), d.products()) ) return false;
LinkVector dlinks = d.links();
for ( int i = 0, N = links().size(); i < N; ++i ) {
for ( int j = 0, M = dlinks.size(); j < M; ++j ) {
if ( ( links()[i].first->id() == dlinks[j].first->id() &&
links()[i].second->id() == dlinks[j].second->id() ) ||
( links()[i].first->id() == dlinks[j].second->id() &&
links()[i].second->id() == dlinks[j].first->id() ) ) {
dlinks.erase(dlinks.begin() + j);
break;
}
}
return false;
}
return dlinks.empty();
}
// First check that none of the excluded products in this are
// present in the other.
ParticleMSet::const_iterator pit;
for ( pit = excluded().begin(); pit != excluded().end(); ++pit ) {
if ( findId(d.products(), **pit ) != d.products().end() ) return false;
for ( ModeMSet::const_iterator mit = d.cascadeProducts().begin();
mit != d.cascadeProducts().end(); ++mit )
if ( (**pit).id() == (**mit).parent()->id() ) return false;
}
// Check that all cascade decays in this overlaps with one in the
// other. Save the ones that are left
ModeMSet cascleft = d.cascadeProducts();
for ( ModeMSet::iterator mit = cascadeProducts().begin();
mit != cascadeProducts().end(); ++mit ) {
ModeMSet::iterator mit2 = cascleft.begin();
while ( mit2 != cascleft.end() && !(**mit).includes(**mit2) ) ++mit2;
if ( mit2 == cascleft.end() ) return false;
}
// Check that all cascade product parents in the other matches
// something in this. Otherwise expand the cascade product.
ParticleMSet partleft = d.products();
MatcherMSet matchleft = d.productMatchers();
ParticleMSet excludeleft = d.excluded();
MatcherMSet wildleft;
if ( d.wildProductMatcher() ) wildleft.insert(wildProductMatcher());
ParticleMSet part = products();
MatcherMSet match = productMatchers();
while ( cascleft.size() ) {
ModeMSet::iterator cdmit = cascleft.begin();
cDMPtr cdm = *cdmit;
ParticleMSet::iterator pit = findId(part, *(cdm->parent()));
if ( pit != part.end() ) {
cascleft.erase(cdmit);
part.erase(pit);
} else {
MatcherMSet::iterator mit = match.begin();
while ( mit != match.end() && !(**mit).matches(*(cdm->parent())) ) ++mit;
if ( mit != match.end() ) {
cascleft.erase(cdmit);
match.erase(mit);
} else {
if ( wildProductMatcher() &&
wildProductMatcher()->matches(*(cdm->parent())) ) {
cascleft.erase(cdmit);
} else {
cascleft.erase(cdmit);
partleft.insert(cdm->products().begin(), cdm->products().end());
matchleft.insert(cdm->productMatchers().begin(),
cdm->productMatchers().end());
if ( cdm->wildProductMatcher() )
wildleft.insert(cdm->wildProductMatcher());
excludeleft.insert(cdm->excluded().begin(), cdm->excluded().end());
cascleft.insert(cdm->cascadeProducts().begin(),
cdm->cascadeProducts().end());
}
}
}
}
// Check that all excluded left in the other are absent in this.
if ( find_first_of(excludeleft.begin(), excludeleft.end(), part.begin(),
part.end(), IdCmp()) != excludeleft.end() ) return false;
// Now all particles and matches left in this must match something
// in the other.
pit = part.begin();
while ( pit != part.end() ) {
ParticleMSet::iterator pit2 = findId(partleft, **pit++);
if ( pit2 == partleft.end() ) return false;
partleft.erase(pit2);
}
MatcherMSet::const_iterator pmit = match.begin();
while ( pmit != match.end() ) {
ParticleMSet::iterator pit2 = partleft.begin();
while ( pit2 != partleft.end() && ! (**pmit).matches(**pit2) ) ++pit2;
if ( pit2 != partleft.end() ) {
partleft.erase(pit2);
} else {
MatcherMSet::iterator pmit2 = matchleft.begin();
while ( pmit2 != matchleft.end() && ! (**pmit).matches(**pmit2) ) ++pmit2;
if ( pmit2 != matchleft.end() ) {
matchleft.erase(pmit2);
} else
return false;
}
}
// Now all particles and matchers left in the other must be matched
// by the wild match in this.
if ( wildProductMatcher() ) {
pit = partleft.begin();
while ( pit != partleft.end() )
if ( !(wildProductMatcher()->matches(**pit++)) ) return false;
pmit = matchleft.begin();
while (pmit != matchleft.end() )
if ( !(wildProductMatcher()->matches(**pmit++)) ) return false;
pmit = wildleft.begin();
while (pmit != wildleft.end() )
if ( !(wildProductMatcher()->matches(**pmit++)) ) return false;
} else
return partleft.empty() && matchleft.empty() && wildleft.empty();
return true;
}
DMPtr DecayMode::clone(tPDPtr pd) const {
DMPtr dm = dmclone();
dm->theParent = pd;
Repository::Register(dm, pd->fullName() + "/" + dm->name());
if ( !theDecayer || !theDecayer->accept(*dm) ) dm->isOn = false;
if ( pd->CC() ) {
DMPtr adm = CC()? CC()->dmclone(): dmclone();
adm->theParent = pd->CC();
Repository::Register(adm, pd->CC()->fullName() + "/" + adm->name());
dm->theAntiPartner = adm;
adm->theAntiPartner = dm;
if ( !adm->theDecayer->accept(*adm) ) adm->isOn = false;
} else
dm->theAntiPartner = DMPtr();
return dm;
}
void DecayMode::synchronize() {
if ( !CC() ) return;
theBrat = CC()->theBrat;
isOn = CC()->isOn;
theDecayer = CC()->theDecayer;
}
struct ParticleOrdering {
bool operator()(tcPDPtr p1, tcPDPtr p2) {
return abs(p1->id()) > abs(p2->id()) ||
( abs(p1->id()) == abs(p2->id()) && p1->id() > p2->id() ) ||
( p1->id() == p2->id() && p1->fullName() > p2->fullName() );
}
};
struct ModeOrdering {
bool operator()(tcDMPtr d1, tcDMPtr d2) {
ParticleOrdering ord;
return ord(d1->parent(), d2->parent()) ||
( !ord(d2->parent(), d1->parent()) &&
( d1->tag() < d2->tag() ||
( d1->tag() == d2->tag() && d1->fullName() < d2->fullName() ) ) );
}
};
struct MatcherOrdering {
bool operator()(tcPMPtr m1, tcPMPtr m2) {
return m1->name() < m2->name() ||
( m1->name() == m2->name() && m1->fullName() < m2->fullName() );
}
};
PVector DecayMode::produceProducts() const {
PVector ret;
for ( int i = 0, N = orderedProducts().size(); i < N; ++i )
ret.push_back(orderedProducts()[i]->produceParticle());
return ret;
}
string DecayMode::makeTag() const {
string ret;
typedef multiset<tcPDPtr,ParticleOrdering> OrderedParticles;
typedef multiset<tcPMPtr,MatcherOrdering> OrderedMatchers;
typedef multiset<tcDMPtr,ModeOrdering> OrderedModes;
LinkVector dlinks = links();
ret = theParent->PDGName() + "->";
if ( dlinks.empty() ) {
OrderedParticles prod(products().begin(), products().end());
for (OrderedParticles::iterator pit = prod.begin();
pit != prod.end(); ++pit )
ret += (**pit).PDGName() + ",";
} else {
unsigned int dl = 0;
for ( int i = 0, N = orderedProducts().size(); i < N; ++i ) {
if ( dl < dlinks.size() && orderedProducts()[i] == dlinks[dl].first ) {
ret += orderedProducts()[i]->PDGName() + "=";
++dl;
} else
ret += orderedProducts()[i]->PDGName() + ",";
}
}
OrderedModes casc(cascadeProducts().begin(), cascadeProducts().end());
for ( OrderedModes::iterator dmit = casc.begin();dmit != casc.end(); ++dmit )
ret += "[" + (**dmit).tag() + "],";
OrderedMatchers match(productMatchers().begin(), productMatchers().end());
for ( OrderedMatchers::iterator mit = match.begin();
mit != match.end(); ++mit ) ret += "?" +(**mit).name() + ",";
if ( theWildMatcher )
ret += "*" + theWildMatcher->name() + ",";
OrderedParticles ex(excluded().begin(), excluded().end());
for ( OrderedParticles::iterator pit = ex.begin(); pit != ex.end(); ++pit )
ret += "!" + (**pit).PDGName() + ",";
ret[ret.size()-1] = ';';
return ret;
}
void DecayMode::brat(double newBrat) {
theBrat = newBrat;
if ( theBrat <= 0.0 ) switchOff();
if ( CC() && parent()->synchronized() ) CC()->theBrat = newBrat;
}
double DecayMode::brat() const {
return isOn? theDecayer->brat(*this, *theParent, theBrat): 0.0;
}
double DecayMode::brat(const Particle & p) const {
return isOn && p.dataPtr() == parent()?
theDecayer->brat(*this, p, theBrat): 0.0;
}
void DecayMode::switchOn() {
isOn = true;
if ( CC() && parent()->synchronized() ) CC()->isOn = true;
}
void DecayMode::switchOff() {
isOn = false;
if ( CC() && parent()->synchronized() ) CC()->isOn = false;
}
void DecayMode::addProduct(tPDPtr pd) {
products().insert(pd);
theOrderedProducts.push_back(pd);
if ( CC() ) {
CC()->products().insert(pd->CC()? pd->CC(): pd);
CC()->theOrderedProducts.push_back(pd->CC()? pd->CC(): pd);
}
resetTag();
}
void DecayMode::addLink(tPDPtr a, tPDPtr b) {
theLinks.push_back(make_pair(a, b));
if ( CC() ) CC()->theLinks.push_back(make_pair(a->CC()? a->CC(): a,
b->CC()? b->CC(): b));
resetTag();
}
void DecayMode::addCascadeProduct(tDMPtr dm) {
cascadeProducts().insert(dm);
if ( CC() ) CC()->cascadeProducts().insert(dm->CC()? dm->CC(): dm);
resetTag();
}
void DecayMode::addProductMatcher( tPMPtr pm) {
productMatchers().insert(pm);
if ( CC() ) CC()->productMatchers().insert(pm->CC()? pm->CC(): pm);
resetTag();
}
void DecayMode::setWildMatcher(tPMPtr pm) {
wildProductMatcher() = pm;
if ( CC() ) CC()->wildProductMatcher() = pm->CC()? pm->CC(): pm;
resetTag();
}
void DecayMode::addExcluded(tPDPtr pd) {
excluded().insert(pd);
if ( CC() ) CC()->excluded().insert(pd->CC()? pd->CC(): pd);
resetTag();
}
void DecayMode::decayer(tDecayerPtr dec) {
if ( !dec || !dec->accept(*this) )
throw DecModSetupNoAccept(tag(), dec->name());
if ( CC() && parent()->synchronized() ) {
if ( !dec->accept(*CC()) )
throw DecModSetupNoAccept(CC()->tag(), dec->name());
CC()->theDecayer = dec;
}
theDecayer = dec;
}
DMPtr DecayMode::constructDecayMode(string & tag, vector<DMPtr> * save) {
DMPtr rdm;
DMPtr adm;
int level = 0;
string::size_type end = 0;
while ( end < tag.size() && ( tag[end] != ']' || level ) ) {
switch ( tag[end++] ) {
case '[':
++level;
break;
case ']':
--level;
break;
}
}
string::size_type next = tag.find("->");
if ( next == string::npos ) return rdm;
if ( tag.find(';') == string::npos ) return rdm;
tPDPtr pd = Repository::findParticle(tag.substr(0,next));
if ( !pd ) return rdm;
rdm = ptr_new<DMPtr>();
rdm->parent(pd);
if ( pd->CC() ) {
adm = ptr_new<DMPtr>();
adm->parent(pd->CC());
rdm->theAntiPartner = adm;
adm->theAntiPartner = rdm;
}
bool error = false;
tag = tag.substr(next+2);
tPDPtr lastprod;
bool dolink = false;
do {
switch ( tag[0] ) {
case '[':
{
tag = tag.substr(1);
DMPtr cdm = constructDecayMode(tag, save);
if ( save ) save->push_back(cdm);
if ( cdm ) rdm->addCascadeProduct(cdm);
else error = true;
} break;
case '=':
dolink = true;
case ',':
case ']':
tag = tag.substr(1);
break;
case '?':
{
next = min(tag.find(','), tag.find(';'));
tPMPtr pm = Repository::findMatcher(tag.substr(1,next-1));
if ( pm ) rdm->addProductMatcher(pm);
else error = true;
tag = tag.substr(next);
} break;
case '!':
{
next = min(tag.find(','), tag.find(';'));
tPDPtr pd = Repository::findParticle(tag.substr(1,next-1));
if ( pd ) rdm->addExcluded(pd);
else error = true;
tag = tag.substr(next);
} break;
case '*':
{
next = min(tag.find(','), tag.find(';'));
tPMPtr pm = Repository::findMatcher(tag.substr(1,next-1));
if ( pm ) rdm->setWildMatcher(pm);
else error = true;
tag = tag.substr(next);
} break;
default:
{
next = min(tag.find('='), min(tag.find(','), tag.find(';')));
tPDPtr pdp = Repository::findParticle(tag.substr(0,next));
if ( pdp ) rdm->addProduct(pdp);
else error = true;
tag = tag.substr(next);
if ( dolink && lastprod ) {
rdm->addLink(lastprod, pdp);
dolink = false;
}
lastprod = pdp;
} break;
}
} while ( tag[0] != ';' && tag.size() );
if ( tag[0] != ';' || error ) {
return DMPtr();
}
tag = tag.substr(1);
for ( DecaySet::const_iterator dit = pd->decayModes().begin();
dit != pd->decayModes().end(); ++dit )
if ( (**dit).tag() == rdm->tag() ) return *dit;
if ( save ) {
save->push_back(rdm);
save->push_back(adm);
} else {
pd->addDecayMode(rdm);
Repository::Register(rdm, pd->fullName() + "/" + rdm->tag());
if ( adm )
Repository::Register(adm, pd->CC()->fullName() + "/" + adm->tag());
}
return rdm;
}
void DecayMode::persistentOutput(PersistentOStream & os) const {
multiset<tcPDPtr,ParticleOrdering> prod(products().begin(), products().end());
multiset<tcDMPtr,ModeOrdering>
casc(cascadeProducts().begin(), cascadeProducts().end());
multiset<tcPMPtr,MatcherOrdering>
match(productMatchers().begin(), productMatchers().end());
multiset<tcPDPtr,ParticleOrdering> ex(excluded().begin(), excluded().end());
multiset<tcDMPtr,ModeOrdering> ovlap(overlap().begin(), overlap().end());
os << theTag << theBrat << isOn << theParent << prod << theOrderedProducts
<< casc << match << theWildMatcher << ex << ovlap << theDecayer
<< theAntiPartner << theLinks;
}
void DecayMode::persistentInput(PersistentIStream & is, int) {
is >> theTag >> theBrat >> isOn >> theParent >> theProducts
>> theOrderedProducts >> theCascadeProducts >> theMatchers
>> theWildMatcher >> theExcluded >> theOverlap >> theDecayer
>> theAntiPartner >> theLinks;
}
ClassDescription<DecayMode> DecayMode::initDecayMode;
void DecayMode::setOn(long i) {
isOn = i;
}
long DecayMode::getOn() const {
return isOn;
}
void DecayMode::setDecayer(DecayerPtr dp) {
decayer(dp);
}
void DecayMode::Init() {
static ClassDocumentation<DecayMode> documentation
("Represents a specific decay channel of a particle.");
static Parameter<DecayMode,double> interfaceBrat
("BranchingRatio",
"The branching fraction for this decay mode. Note that if the sum of "
"branching ratios for one particle is always renormalized to 1. Also, "
"the decaying particle may change this branching ratio if it has a "
"ThePEG::WidthGenerator object assigned to it. ",
&DecayMode::theBrat, 0.0, 0.0, 1.0, false, false, true);
interfaceBrat.setHasDefault(false);
static Switch<DecayMode> interfaceOn
("OnOff",
"Indicates if the decay mode is switched on or off.",
0, 0, false, false, &DecayMode::setOn, &DecayMode::getOn);
static SwitchOption interfaceOnYes
(interfaceOn, "On", "The decay channel is switched on.", 1);
static SwitchOption interfaceOnNo
(interfaceOn, "Off", "The decay channel is switched off.", 0);
interfaceOn.setHasDefault(false);
static Reference<DecayMode,Decayer> interfaceDecayer
("Decayer",
"The ThePEG::Decayer object responsible for performing this decay.",
&DecayMode::theDecayer, false, false, true, false,
&DecayMode::setDecayer);
interfaceBrat.rank(10);
interfaceDecayer.rank(9);
interfaceOn.rank(8);
}
DecModNoAccept::DecModNoAccept(string tag, string dec) {
theMessage << "The Decayer '" << dec << "' is not capable to "
<< "perform the decay in the DecayMode '" << tag << "'.";
severity(warning);
}
DecModSetupNoAccept::DecModSetupNoAccept(string tag, string dec) {
theMessage << "The Decayer '" << dec << "' is not capable to "
<< "perform the decay in the DecayMode '" << tag << "'.";
severity(warning);
}
DecModRebind::DecModRebind(string tag, string obj) {
theMessage << "'Rebind' of DecayMode '" << tag << "' failed because "
<< "the object '" << obj << "' refered to lacked a translation.";
severity(abortnow);
}
-
-ThePEG_IMPLEMENT_MULTISET(tPDPtr,ParticleMSet)
-ThePEG_IMPLEMENT_MULTISET(tPMPtr,MatcherMSet)
-ThePEG_IMPLEMENT_MULTISET(tDMPtr,ModeMSet)
-

File Metadata

Mime Type
text/x-diff
Expires
Tue, Nov 19, 6:45 PM (1 d, 15 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805659
Default Alt Text
(85 KB)

Event Timeline