Page Menu
Home
HEPForge
Search
Configure Global Search
Log In
Files
F7879110
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
13 KB
Subscribers
None
View Options
diff --git a/Analysis/RivetAnalysis.cc b/Analysis/RivetAnalysis.cc
--- a/Analysis/RivetAnalysis.cc
+++ b/Analysis/RivetAnalysis.cc
@@ -1,172 +1,173 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the RivetAnalysis class.
//
#include "RivetAnalysis.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Interface/ParVector.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/Switch.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Vectors/HepMCConverter.h"
#include "ThePEG/Config/HepMCHelper.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Repository/CurrentGenerator.h"
#include "HepMC/GenEvent.h"
#include "Rivet/AnalysisHandler.hh"
+#include "Rivet/Tools/RivetPaths.hh"
#include "Rivet/Tools/Logging.hh"
#include <config.h>
using namespace ThePEG;
RivetAnalysis::RivetAnalysis() : debug(false), _rivet(), _nevent(0)
{}
void RivetAnalysis::analyze(ThePEG::tEventPtr event, long ieve, int loop, int state) {
++_nevent;
AnalysisHandler::analyze(event, ieve, loop, state);
// Rotate to CMS, extract final state particles and call analyze(particles).
// convert to hepmc
HepMC::GenEvent * hepmc = ThePEG::HepMCConverter<HepMC::GenEvent>::convert(*event);
// analyse the event
CurrentGenerator::Redirect stdout(cout);
if ( _rivet ) _rivet->analyze(*hepmc);
// delete hepmc event
delete hepmc;
}
ThePEG::IBPtr RivetAnalysis::clone() const {
return new_ptr(*this);
}
ThePEG::IBPtr RivetAnalysis::fullclone() const {
return new_ptr(*this);
}
void RivetAnalysis::persistentOutput(ThePEG::PersistentOStream & os) const {
os << _analyses << _paths << filename << debug;
}
void RivetAnalysis::persistentInput(ThePEG::PersistentIStream & is, int) {
is >> _analyses >> _paths >> filename >> debug;
}
ThePEG::ClassDescription<RivetAnalysis> RivetAnalysis::initRivetAnalysis;
// Definition of the static class description member.
void RivetAnalysis::Init() {
static ThePEG::ClassDocumentation<RivetAnalysis> documentation
("The RivetAnalysis class is a simple class to allow analyses"
" from the Rivet library to be called from ThePEG");
static ThePEG::ParVector<RivetAnalysis,string> interfaceAnalyses
("Analyses",
"The names of the Rivet analyses to use",
&RivetAnalysis::_analyses, -1, "", "","" "",
false, false, ThePEG::Interface::nolimits);
static ThePEG::ParVector<RivetAnalysis,string> interfacePaths
("Paths",
"The directory paths where Rivet should look for analyses.",
&RivetAnalysis::_paths, -1, "", "","" "",
false, false, ThePEG::Interface::nolimits);
static Parameter<RivetAnalysis,string> interfaceFilename
("Filename",
#if ThePEG_RIVET_VERSION == 1
"The name of the file where the AIDA histograms are put. If empty, "
"the run name will be used instead. '.aida' will in any case be "
"appended to the file name.",
#elif ThePEG_RIVET_VERSION > 1
"The name of the file where the YODA histograms are put. If empty, "
"the run name will be used instead. '.yoda' will in any case be "
"appended to the file name.",
#else
#error "Unknown ThePEG_RIVET_VERSION"
#endif
&RivetAnalysis::filename, "", true, false);
static Switch<RivetAnalysis,bool> interfaceDebug
("Debug",
"Enable debug information from Rivet",
&RivetAnalysis::debug, false, true, false);
static SwitchOption interfaceDebugNo
(interfaceDebug,
"No",
"Disable debug information.",
false);
static SwitchOption interfaceDebugYes
(interfaceDebug,
"Yes",
"Enable debug information from Rivet.",
true);
interfaceAnalyses.rank(10);
}
void RivetAnalysis::dofinish() {
AnalysisHandler::dofinish();
if( _nevent > 0 && _rivet ) {
CurrentGenerator::Redirect stdout(cout);
_rivet->setCrossSection(generator()->integratedXSec()/picobarn);
_rivet->finalize();
string fname = filename;
#if ThePEG_RIVET_VERSION == 1
if ( fname.empty() ) fname = generator()->runName() + ".aida";
#elif ThePEG_RIVET_VERSION > 1
if ( fname.empty() ) fname = generator()->runName() + ".yoda";
#else
#error "Unknown ThePEG_RIVET_VERSION"
#endif
_rivet->writeData(fname);
}
delete _rivet;
_rivet = 0;
}
void RivetAnalysis::doinit() {
AnalysisHandler::doinit();
if(_analyses.empty())
throw ThePEG::Exception() << "Must have at least one analysis loaded in "
<< "RivetAnalysis::doinitrun()"
<< ThePEG::Exception::runerror;
// check that analysis list is available
_rivet = new Rivet::AnalysisHandler; //(fname);
for ( int i = 0, N = _paths.size(); i < N; ++i ) Rivet::addAnalysisLibPath(_paths[i]);
_rivet->addAnalyses(_analyses);
if ( _rivet->analysisNames().size() != _analyses.size() ) {
throw ThePEG::Exception()
<< "Rivet could not find all requested analyses.\n"
<< "Use 'rivet --list-analyses' to check availability.\n"
<< ThePEG::Exception::runerror;
}
delete _rivet;
_rivet = 0;
}
void RivetAnalysis::doinitrun() {
AnalysisHandler::doinitrun();
// create Rivet analysis handler
CurrentGenerator::Redirect stdout(cout);
_rivet = new Rivet::AnalysisHandler; //(fname);
for ( int i = 0, N = _paths.size(); i < N; ++i ) Rivet::addAnalysisLibPath(_paths[i]);
_rivet->addAnalyses(_analyses);
// check that analysis list is still available
if ( _rivet->analysisNames().size() != _analyses.size() ) {
throw ThePEG::Exception()
<< "Rivet could not find all requested analyses.\n"
<< "Use 'rivet --list-analyses' to check availability.\n"
<< ThePEG::Exception::runerror;
}
if ( debug )
Rivet::Log::setLevel("Rivet",Rivet::Log::DEBUG);
}
diff --git a/PDT/MixedParticleData.cc b/PDT/MixedParticleData.cc
--- a/PDT/MixedParticleData.cc
+++ b/PDT/MixedParticleData.cc
@@ -1,228 +1,227 @@
// -*- C++ -*-
//
// This is the implementation of the non-inlined, non-templated member
// functions of the MixedParticleData class.
//
#include "MixedParticleData.h"
#include "ThePEG/Interface/Parameter.h"
#include "ThePEG/Interface/ClassDocumentation.h"
#include "ThePEG/Persistency/PersistentOStream.h"
#include "ThePEG/Persistency/PersistentIStream.h"
#include "ThePEG/Repository/EventGenerator.h"
#include "ThePEG/Repository/UseRandom.h"
#include "ThePEG/Utilities/Debug.h"
#include "ThePEG/PDT/DecayMode.h"
using namespace ThePEG;
void MixedParticleData::persistentOutput(PersistentOStream & os) const {
os << ounit(_deltam,GeV) << ounit(_deltagamma,GeV) << _pqmag << _pqphase
<< _pq << _zmag << _zphase << _z << _x << _y << _prob;
}
void MixedParticleData::persistentInput(PersistentIStream & is, int) {
is >> iunit(_deltam,GeV) >> iunit(_deltagamma,GeV) >> _pqmag >> _pqphase
>> _pq >> _zmag >> _zphase >> _z >> _x >> _y >> _prob;
}
ClassDescription<MixedParticleData> MixedParticleData::initMixedParticleData;
// Definition of the static class description member.
void MixedParticleData::Init() {
static ClassDocumentation<MixedParticleData> documentation
("The MixedParticleData class provides storage of the particle data"
" for particles which undergo mixing.");
static Parameter<MixedParticleData,Energy> interfaceDeltaM
("DeltaM",
"The mass difference",
&MixedParticleData::_deltam, GeV, 0.0*GeV, 0.0*GeV, 1.*GeV,
false, false, Interface::limited,
&MixedParticleData::setDeltaM, 0, 0, 0, 0);
static Parameter<MixedParticleData,Energy> interfaceDeltaGamma
("DeltaGamma",
"The width difference",
&MixedParticleData::_deltagamma, GeV, 0.0*GeV, 0.0*GeV, 1.0*GeV,
false, false, Interface::limited,
&MixedParticleData::setDeltaGamma, 0, 0, 0, 0);
static Parameter<MixedParticleData,double> interfacePQMagnitude
("PQMagnitude",
"The value of |p/q|",
&MixedParticleData::_pqmag, 1.0, 0.0, 10.0,
false, false, Interface::limited,
&MixedParticleData::setPQMagnitude, 0, 0, 0, 0);
static Parameter<MixedParticleData,double> interfacePQPhase
("PQPhase",
"The phase of p/q",
&MixedParticleData::_pqmag, 0.0, 0.0, 2.*Constants::pi,
false, false, Interface::limited,
&MixedParticleData::setPQPhase, 0, 0, 0, 0);
static Parameter<MixedParticleData,double> interfaceZMagnitude
("ZMagnitude",
"The value of |z|",
&MixedParticleData::_zmag, 0.0, 0.0, 1.0,
false, false, Interface::limited,
&MixedParticleData::setZMagnitude, 0, 0, 0, 0);
static Parameter<MixedParticleData,double> interfaceZPhase
("ZPhase",
"The phase of z",
&MixedParticleData::_zmag, 0.0, 0.0, 2.*Constants::pi,
false, false, Interface::limited,
&MixedParticleData::setZPhase, 0, 0, 0, 0);
}
MixedParticleData::MixedParticleData(long newId, string newPDGName)
: ParticleData(newId, newPDGName), _deltam(0.*GeV), _deltagamma(0.*GeV),
_pqmag(1.), _pqphase(0.), _pq(1.,0.), _zmag(0.), _zphase(0.), _z(0.),
_x(0.), _y(0.), _prob(make_pair(1.,0.)) {}
PDPtr MixedParticleData::
Create(long newId, string newPDGName) {
return new_ptr(MixedParticleData(newId, newPDGName));
}
PDPair MixedParticleData::
Create(long newId, string newPDGName, string newAntiPDGName) {
PDPair pap;
pap.first = new_ptr(MixedParticleData(newId, newPDGName));
pap.second = new_ptr(MixedParticleData(-newId, newAntiPDGName));
antiSetup(pap);
return pap;
}
PDPtr MixedParticleData::pdclone() const {
return new_ptr(*this);
}
void MixedParticleData::setDeltaM(Energy m) {
_deltam = m;
MixedParticleData * apd =
dynamic_cast<MixedParticleData*>(CC().operator->());
if ( synchronized() && apd ) apd->_deltam = m;
}
void MixedParticleData::setDeltaGamma(Energy m) {
_deltagamma = m;
MixedParticleData * apd =
dynamic_cast<MixedParticleData*>(CC().operator->());
if ( synchronized() && apd ) apd->_deltagamma = m;
}
void MixedParticleData::setPQMagnitude(double m) {
_pqmag = m;
MixedParticleData * apd =
dynamic_cast<MixedParticleData*>(CC().operator->());
if ( synchronized() && apd ) apd->_pqmag = m;
}
void MixedParticleData::setPQPhase(double m) {
_pqphase = m;
MixedParticleData * apd =
dynamic_cast<MixedParticleData*>(CC().operator->());
if ( synchronized() && apd ) apd->_pqphase = m;
}
void MixedParticleData::setZMagnitude(double m) {
_zmag = m;
MixedParticleData * apd =
dynamic_cast<MixedParticleData*>(CC().operator->());
if ( synchronized() && apd ) apd->_zmag = m;
}
void MixedParticleData::setZPhase(double m) {
_zphase = m;
MixedParticleData * apd =
dynamic_cast<MixedParticleData*>(CC().operator->());
if ( synchronized() && apd ) apd->_zphase = m;
}
void MixedParticleData::doinit() throw(InitException) {
ParticleData::doinit();
// calculate the complex parameters from the magnitudes and phases
// and x and y from massive parameters
// p/q
_pq = _pqmag*Complex(cos(_pqphase),sin(_pqphase));
// z
_z = _zmag *Complex(cos(_zphase ),sin(_zphase ));
// x
_x = _deltam /width();
// y
_y = 0.5*_deltagamma/width();
// probabilities
double zr = _z.real(), zi = _z.imag();
double root = sqrt( (1 - 2 * zr * zr + 2 * zi * zi + pow( zr, 4)
+ 2 * zr * zr * zi * zi + pow( zi, 4)));
double x2=sqr(_x),y2=sqr(_y),modqp=1./sqr(abs(_pq)),z2(sqr(zr)+sqr(zi));
double mixprob = id()>0 ?
-modqp*root*(x2+y2)/(2*zr*_y*(1+x2) - modqp*root*(x2+y2)
- (1.+z2)*x2 - 2*zi*_x*(1-y2) + y2*(1-z2) - 2) :
root*(x2+y2)/(2*modqp*zr*(1+x2)*_y+root*(x2+y2)+modqp*(1.+z2)*x2
- 2*modqp*zi*_x*(1-y2)-modqp*y2*(1-z2)+2*modqp);
_prob= make_pair(1.-mixprob,mixprob);
if( Debug::level ) {
generator()->log() << "Parameters for the mixing of " << PDGName() << " and "
<< CC()->PDGName() << "\n";
generator()->log() << "x = " << _x << "\t y = " << _y << "\n";
generator()->log() << "Integrated mixing probability = " << mixprob << "\n";
}
}
pair<bool,Length> MixedParticleData::generateLifeTime() const {
// first decide if mixes
bool mix = UseRandom::rndbool(_prob.second);
double wgt;
Length ct;
double zi(_z.imag()),zr(_z.real()),zabs(sqr(zi)+sqr(zr)),
root(1.-zabs);
Length ctau = hbarc/(width()-0.5*abs(_deltagamma));
do {
ct = UseRandom::rndExp(ctau);
double gt = ct/cTau();
- wgt=1.;
if(id()>0) {
if(!mix) {
wgt = 0.5*(1.+zabs)*cosh(_y*gt)+0.5*(1.-zabs)*cos(_x*gt)
-zr*sinh(_y*gt)+zi*sin(_x*gt);
}
else {
wgt = 0.5*root/sqr(abs(_pq))*(cosh(_y*gt)-cos(_x*gt));
}
}
else {
if(!mix) {
wgt = 0.5*(1.+zabs)*cosh(_y*gt)+0.5*(1.-zabs)*cos(_x*gt)
+zr*sinh(_y*gt)-zi*sin(_x*gt);
}
else {
wgt = 0.5*root*sqr(abs(_pq))*(cosh(_y*gt)-cos(_x*gt));
}
}
wgt *= exp(-gt+ct/ctau);
}
while(UseRandom::rnd()>wgt);
return make_pair(mix,ct);
}
pair<Complex,Complex> MixedParticleData::mixingAmplitudes(Length ct,bool part) const {
double gt = ct/cTau();
Complex ep = exp(Complex(-0.5*_y,-0.5*_x)*gt);
Complex gp = 0.5*(ep+1./ep), gm = 0.5*(ep-1./ep);
pair<Complex,Complex> output;
if(part) {
output.first = gp + _z*gm;
output.second = -sqrt(1.-sqr(_z))/_pq*gm;
}
else {
output.first = gp - _z*gm;
output.second = -sqrt(1.-sqr(_z))*_pq*gm;
}
return output;
}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Nov 19, 7:37 PM (1 d, 9 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3805856
Default Alt Text
(13 KB)
Attached To
rTHEPEGHG thepeghg
Event Timeline
Log In to Comment