1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348
|
// -*- C++ -*-
//
// SubProcess.h 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.
//
#ifndef ThePEG_SubProcess_H
#define ThePEG_SubProcess_H
// This is the declaration of the SubProcess class.
#include <vector>
#include "ThePEG/EventRecord/Particle.h"
namespace ThePEG {
class SubProcessGroup;
/**
* A SubProcess object represents a hard \f$2\rightarrow n\f$
* sub-process in a collision. It carries information about the
* incoming and outgoing particles, as well as possible intermediate
* ones. It also has a pointer to the MEBase object which generated
* the sub-process.
*
* @see Event
* @see Particle
* @see SubProcessGroup
*/
class SubProcess: public EventRecordBase {
public:
/** Most of the Event classes are friends with each other. */
friend class Step;
/** Most of the Event classes are friends with each other. */
friend class Collision;
/** Most of the Event classes are friends with each other. */
friend class SubProcessGroup;
public:
/**
* Standard constructor.
* @param newIncoming the two incoming partons.
* @param newCollision the Collision to which this SubProcess belongs.
* @param newHandler the MEBase object which generated this SubProcess.
*/
SubProcess(const PPair & newIncoming,
tCollPtr newCollision = tCollPtr(),
tcEventBasePtr newHandler = tcEventBasePtr(),
tSubProPtr newHead = tSubProPtr(),
double newGroupWeight = 1.0);
/**
* Destructor.
*/
virtual ~SubProcess();
/**
* A pointer to the MEBase object which generated this SubProcess.
*/
tcEventBasePtr handler() const { return theHandler; }
/**
* A pointer to the collision to which this sub-process belongs.
*/
tCollPtr collision() const { return theCollision; }
/**
* The pair of incoming partons.
*/
const PPair & incoming() const { return theIncoming; }
/**
* A reference to the vector of intermediate partons.
*/
const ParticleVector & intermediates() const { return theIntermediates; }
/**
* A reference to the vector of outgoing particles.
*/
const ParticleVector & outgoing() const { return theOutgoing; }
/**
* Set the vector of outgoing particles.
*/
template <class InputIterator>
void setOutgoing(InputIterator, InputIterator);
/**
* Add a particle to the list of outgoing ones. If \a fixrelations
* is true the mother daughter pointers will be set to/from the
* incoming partons.
*/
void addOutgoing(tPPtr p, bool fixrelations = true);
/**
* Change the incoming parton
*/
void changeIncoming(tPPtr pnew, tPPtr pold);
/**
* Set the vector of intermediate particles.
*/
template <class InputIterator>
void setIntermediates(InputIterator, InputIterator);
/**
* Add a particle to the list of intermediate ones. If \a fixrelations
* is true the mother daughter pointers will be set to/from the
* incoming partons.
*/
void addIntermediate(tPPtr p, bool fixrelations = true);
/**
* Remove a particle entry from this sub-process.
*/
void removeEntry(tPPtr p);
/**
* Return a clone of this sub process.
*/
virtual SubProPtr clone() const;
/**
* True if a perturbative cascade has been applied to this sub
* process.
*/
bool decayed() const { return isDecayed; }
/**
* Set to true if a perturbative cascade has been applied to this
* sub process.
*/
void decayed(bool x) { isDecayed = x; }
/**
* Return the head SubProcess, if this SubProcess
* object belongs to a SubProcessGroup. Return NULL
* if head of a SubProcessGroup or not member of
* a SubProcessGroup at all.
*/
tSubProPtr head() const { return theHead; }
/**
* Set the head SubProcess
*/
void head(tSubProPtr newHead) { theHead = newHead; }
/**
* If this SubProcess belongs to a SubProcessGroup,
* return its relative weight w.r.t. the head's
* weight.
*/
double groupWeight() const { return theGroupWeight; }
/**
* If this SubProcess belongs to a SubProcessGroup,
* set its relative weight w.r.t. the head's
* weight.
*/
void groupWeight(double w) { theGroupWeight = w; }
protected:
/**
* Rebind to cloned objects. When a SubProcess is cloned, a shallow
* copy is done first, then all <code>Particle</code>s etc, are
* cloned, and finally this method is used to see to that the
* pointers in the cloned SubProcess points to the cloned
* <code>Particle</code>s etc.
*/
virtual void rebind(const EventTranslationMap & trans);
public:
/**
* Perform a LorentzTransformation of all particles in the sub
* process.
*/
virtual void transform(const LorentzRotation &);
/**
* Return the value of the Mandelstam variable \f$\hat{s}\f$ in this
* SubProcess. It is calculated using the incoming particles.
*/
Energy2 shat() const {
return (incoming().first->momentum() + incoming().second->momentum()).m2();
}
/**
* Return the value of the Mandelstam variable \f$\hat{t}\f$ in this
* SubProcess. It is calculated using the first incoming and first outgoing
* particle.
*/
Energy2 that() const {
return (incoming().first->momentum() - outgoing()[0]->momentum()).m2();
}
/**
* Return the value of the Mandelstam variable \f$\hat{u}\f$ in this
* SubProcess. It is calculated using the first incoming and last outgoing
* particle.
*/
Energy2 uhat() const {
return (incoming().second->momentum() - outgoing()[0]->momentum()).m2();
}
public:
/**
* Standard function for writing to a persistent stream.
*/
void persistentOutput(PersistentOStream &) const;
/**
* Standard function for reading from a persistent stream.
*/
void persistentInput(PersistentIStream &, int);
/**
* Standard Init function. @see Base::Init().
*/
static void Init();
private:
/**
* A pointer to the MEBase object which generated this sub-process.
*/
tcEventBasePtr theHandler;
/**
* A pointer to the collision to which this sub-process belongs.
*/
tCollPtr theCollision;
/**
* The pair of incoming particles.
*/
PPair theIncoming;
/**
* The vector of intermediate particles,
*/
ParticleVector theIntermediates;
/**
* The vector of outgoing particles.
*/
ParticleVector theOutgoing;
/**
* True if a perturbative cascade has been applied to this sub process.
*/
bool isDecayed;
/**
* The head SubProcess, if this SubProcess
* object belongs to a SubProcessGroup. NULL
* if head of a SubProcessGroup or not member of
* a SubProcessGroup at all.
*/
tSubProPtr theHead;
/**
* If this SubProcess belongs to a SubProcessGroup,
* this gives its relative weight w.r.t. the head's
* weight.
*/
double theGroupWeight;
public:
/**
* Print out debugging information for this object on std::cerr. To
* be called from within a debugger via the debug() function.
*/
virtual void debugme() const;
/**
* Put to ostream
*/
virtual void printMe(ostream&) const;
private:
/**
* Default constructor
*/
SubProcess() : isDecayed(false), theGroupWeight(1.0) {}
/**
* Describe concrete class with persistent data.
*/
static ClassDescription<SubProcess> initSubProcess;
/**
* The ClassTraits<SubProcess> class must be a friend to be able to
* use the private default constructor.
*/
friend struct ClassTraits<SubProcess>;
/**
* Assignment is forbidden.
*/
SubProcess & operator=(const SubProcess &);
};
/** Output a SubProcess to an ostream. */
ostream & operator<<(ostream &, const SubProcess &);
/** @cond TRAITSPECIALIZATIONS */
/** This template specialization informs ThePEG about the
* base class of Collision. */
template <>
struct BaseClassTrait<SubProcess,1>: public ClassTraitsType {
/** Typedef of the first base class of SubProcess. */
typedef EventRecordBase NthBase;
};
/** This template specialization informs ThePEG about the name of
* the SubProcess class and how to create it. */
template <>
struct ClassTraits<SubProcess>: public ClassTraitsBase<SubProcess> {
/** Return a platform-independent class name */
static string className() { return "ThePEG::SubProcess"; }
/** Create a SubProcess object. */
static TPtr create() { return TPtr::Create(SubProcess()); }
};
/** @endcond */
}
#ifndef ThePEG_TEMPLATES_IN_CC_FILE
#include "SubProcess.tcc"
#endif
#endif /* ThePEG_SubProcess_H */
|