diff --git a/Decay/EvtGen/EvtGenInterface.cc b/Decay/EvtGen/EvtGenInterface.cc --- a/Decay/EvtGen/EvtGenInterface.cc +++ b/Decay/EvtGen/EvtGenInterface.cc @@ -1,1020 +1,1020 @@ // -*- C++ -*- // // This is the implementation of the non-inlined, non-templated member // functions of the EvtGenInterface class. // #include "EvtGenInterface.h" #include "ThePEG/Interface/ClassDocumentation.h" #include "ThePEG/Interface/Switch.h" #include "ThePEG/Interface/Parameter.h" #include "ThePEG/Interface/ParVector.h" #include "ThePEG/EventRecord/Particle.h" #include "ThePEG/Repository/UseRandom.h" #include "ThePEG/Repository/EventGenerator.h" #include "ThePEG/Utilities/DescribeClass.h" #include "ThePEG/Persistency/PersistentOStream.h" #include "ThePEG/Persistency/PersistentIStream.h" #include "ThePEG/PDT/DecayMode.h" #include "Herwig/Decay/DecayVertex.h" #include "Herwig/Decay/GeneralDecayMatrixElement.h" #include "EvtGenBase/EvtRandom.hh" #include "EvtGenBase/EvtAbsRadCorr.hh" #include "EvtGenExternal/EvtExternalGenList.hh" #include "EvtGenBase/EvtScalarParticle.hh" #include "EvtGenBase/EvtDiracParticle.hh" #include "EvtGenBase/EvtVectorParticle.hh" #include "EvtGenBase/EvtRaritaSchwingerParticle.hh" #include "EvtGenBase/EvtTensorParticle.hh" #include "EvtGenBase/EvtStringParticle.hh" #include "EvtGenBase/EvtHighSpinParticle.hh" #include "EvtGenBase/EvtDecayTable.hh" -#ifndef EVTGEN_PREFIX -#error Makefile.am needs to define EVTGEN_PREFIX +#ifndef EVTGEN_SHARE +#error Makefile.am needs to define EVTGEN_SHARE #endif using namespace Herwig; namespace { -const string prefix=EVTGEN_PREFIX ""; +const string prefix=EVTGEN_SHARE ""; const string p8data=PYTHIA8DATA ""; } -EvtGenInterface::EvtGenInterface() : decayName_(prefix+"/share/DECAY_2010.DEC"), - pdtName_(prefix+"/share/evt.pdl"), +EvtGenInterface::EvtGenInterface() : decayName_(prefix+"/DECAY_2010.DEC"), + pdtName_(prefix+"/evt.pdl"), reDirect_(true), checkConv_(false), p8Data_(p8data) {} EvtGenInterface::EvtGenInterface(const EvtGenInterface & x) : Interfaced(x), decayName_(x.decayName_), pdtName_(x.pdtName_), userDecays_(x.userDecays_), reDirect_(x.reDirect_), checkConv_(x.checkConv_), convID_(x.convID_), p8Data_(x.p8Data_), evtrnd_(x.evtrnd_),evtgen_(x.evtgen_) {} EvtGenInterface::~EvtGenInterface() {} IBPtr EvtGenInterface::clone() const { return new_ptr(*this); } IBPtr EvtGenInterface::fullclone() const { return new_ptr(*this); } void EvtGenInterface::persistentOutput(PersistentOStream & os) const { os << decayName_ << pdtName_ << reDirect_ << userDecays_ << checkConv_ << convID_ << p8Data_; } void EvtGenInterface::persistentInput(PersistentIStream & is, int) { is >> decayName_ >> pdtName_ >> reDirect_ >> userDecays_ >> checkConv_ >> convID_ >> p8Data_; } // The following static variable is needed for the type // description system in ThePEG. DescribeClass describeHerwigEvtGenInterface("Herwig::EvtGenInterface", "HwEvtGenInterface.so"); void EvtGenInterface::Init() { static ClassDocumentation documentation ("The EvtGenInterface class is the main class for the use of the EvtGen " "decay package with Herwig"); static Parameter interfaceDecay_File ("Decay_File", "The name of the file for the EvtGen decays.", &EvtGenInterface::decayName_, prefix+"/share/DECAY_2010.DEC", false, false); static Parameter interfacePDT_File ("PDTFile", "The name of the file for the EvtGen particle data.", &EvtGenInterface::pdtName_, prefix+"/share/evt.pdl", false, false); static Switch interfaceRedirect ("Redirect", "By default cerr and cout are redirected when EvtGen is running to" " allow us to catch errors, due to EvtGen's poor internal error " "handling. This can be a problem for debugging and so can be switched off.", &EvtGenInterface::reDirect_, true, false, false); static SwitchOption interfaceRedirectYes (interfaceRedirect, "Yes", "Redirect the output", true); static SwitchOption interfaceRedirectNo (interfaceRedirect, "No", "Don't redirect the output", false); static Switch interfaceCheckConversion ("CheckConversion", "Check the conversion of particles to and from EvtGen", &EvtGenInterface::checkConv_, false, false, false); static SwitchOption interfaceCheckConversionfalse (interfaceCheckConversion, "No", "Don't check the conversion", false); static SwitchOption interfaceCheckConversionCheck (interfaceCheckConversion, "Yes", "Check the conversion", true); static ParVector interfaceOutputModes ("OutputModes", "Particles for which to output the EvtGen decay modes" " so they can be read into Herwig", &EvtGenInterface::convID_, -1, long(0), 0, 0, false, false, Interface::nolimits); static ParVector interfaceUserDecays ("UserDecays", "List of user decay files to be loaded", &EvtGenInterface::userDecays_, -1, "", "", "", false, false, Interface::nolimits); static Parameter interfacePythia8Data ("Pythia8Data", "Location of the Pythia8 data directory", &EvtGenInterface::p8Data_, p8data, false, false); } void EvtGenInterface::doinitrun() { Interfaced::doinitrun(); // redirect cerr and cout if needed std::streambuf *temp[2]={cout.rdbuf(),cerr.rdbuf()}; if(reDirect_ && ! generator()->useStdOut() ) { const string f = generator()->filename() + "-EvtGen.log"; logFile_.open(f); std::streambuf *psbuf = logFile_.rdbuf(); cout.rdbuf(psbuf); cerr.rdbuf(psbuf); } // output the EvtGen initialization info to the log file cout << "Initializing EvtGen \n"; // set up the random number generator for EvtGen cout << "Setting EvtGen random number generator" << " to the Herwig one.\n"; evtrnd_ = new EvtGenRandom(const_ptr_cast::pointer> (&(UseRandom::current()))); EvtRandom::setRandomEngine(evtrnd_); // PHOTOS STUFF EvtAbsRadCorr* radCorrEngine = 0; std::list extraModels; EvtExternalGenList genList(true,p8Data_,"gamma",true); radCorrEngine = genList.getPhotosModel(); extraModels = genList.getListOfModels(); // Initialize EvtGen evtgen_ = new EvtGen(decayName_.c_str(),pdtName_.c_str(), evtrnd_, radCorrEngine, &extraModels); // additional user decays for(unsigned int ix=0;ixreadUDecay(userDecays_[ix].c_str()); // check the conversion of particles if needed if(checkConv_) checkConversion(); // convert any particle decay modes which are needed for(unsigned int ix=0;ixuseStdOut() ) { cout.rdbuf(temp[0]); cerr.rdbuf(temp[1]); } } void EvtGenInterface::dofinish() { Interfaced::dofinish(); if(logFile_.is_open()) logFile_.close(); } ParticleVector EvtGenInterface::decay(const Particle &parent, bool recursive, const DecayMode & dm) const { // redirect cout to the log file ostringstream stemp; std::streambuf *temp[2]={cout.rdbuf(),cerr.rdbuf()}; if(reDirect_ && ! generator()->useStdOut() ) { std::streambuf *psbuf[2] ={logFile_.rdbuf(),stemp.rdbuf()}; cout.rdbuf(psbuf[0]); cerr.rdbuf(psbuf[1]); } // generate the decay ParticleVector output; EvtId parID(EvtGenID(parent.id())); try { EvtDecayBase *decayer = NULL; // create evtgen particle for the parent EvtParticle* particle = EvtGenParticle(parent); EvtParticle* evtParent = NULL; // special if parent is the same to avoid doing mixing twice if(parent.parents().size()==1 && abs(parent.parents()[0]->id())==abs(parent.id())) { evtParent = EvtGenParticle(*parent.parents()[0]); particle->addDaug(evtParent); } // simplest case, evtgen selects mode and recursively decays, use their standard mechanism if(dm.wildProductMatcher() && recursive) { evtgen_->generateDecay(particle); } // otherwise we're in control else { // select the EvtGen decayer to use if(dm.wildProductMatcher()) { decayer = EvtDecayTable::getInstance()->getDecayFunc(particle); } // otherwise we should pick one else { int imode(EvtGenChannel(dm)); decayer = EvtDecayTable::getInstance()->getDecay(parID.getAlias(),imode); particle->setChannel(imode); } // must be a decayer if(!decayer) throw Exception() << "Could find EvtGen decayer in EvtGen::decay()" << Exception::runerror; // masses of the children bool massTreeOK(true); if ( particle->getNDaug() == 0 ) massTreeOK = particle->generateMassTree(); if ( ! massTreeOK ) { // delete the EvtGen particle particle->deleteDaughters(); delete particle; particle = 0; if(evtParent) { delete evtParent; } throw Exception() << "EvtGen could not decay " << EvtPDL::name(particle->getId()) <<" with mass "<< particle->mass() <<" to decay channel number "<< particle->getChannel() << "\n" << Exception::eventerror; } assert(decayer !=0 ); // perform decay decayer->makeDecay(particle,recursive); } // cast the decayer EvtDecayAmp *damp = dynamic_cast(decayer); // translate the decay products output=decayProducts(particle); // set spin information if needed tSpinPtr pspin(getSpinInfo(parent)); // if has spin information translate it if(damp) { ParticleVector products; unsigned int nbeforerad=decayer->getNDaug(); for(unsigned int ix=0;ixdevelop(); RhoDMatrix rhotemp(pspin->iSpin()); pspin->DMatrix()=rhotemp; } pspin->decay(); if(recursive) { pspin->developed(); pspin->DMatrix()=ThePEGSpinDensity(particle->getSpinDensityBackward(), ThePEGID(particle->getId())); } // delete the EvtGen particle particle->deleteDaughters(); delete particle; if(evtParent) { delete evtParent; } particle = 0; } catch ( ... ) { // change stream back if(reDirect_ && ! generator()->useStdOut() ) { cout.rdbuf(temp[0]); cerr.rdbuf(temp[1]); } throw; } // change stream back if(reDirect_ && ! generator()->useStdOut() ) { cout.rdbuf(temp[0]); cerr.rdbuf(temp[1]); string stemp2=stemp.str(); if(stemp2.length()>0) throw Exception() << "EvtGen report error in EvtGen::decay " << "killing event\n" << "Error was " << stemp2 << Exception::eventerror; } // return the decay products return output; } EvtParticle * EvtGenInterface::EvtGenParticle(const Particle & part) const { // convert the momentum Lorentz5Momentum inmom(part.momentum()); EvtVector4R p4(EvtGenMomentum(inmom)); EvtParticle *evtpart; // EvtGen ID and spin type EvtId id = EvtGenID(part.id()); EvtSpinType::spintype thisSpin=EvtPDL::getSpinType(id); // boost to the rest frame to get the basis states right PPtr decay(const_ptr_cast(new_ptr(part))); decay->transform(LorentzRotation(-inmom.boostVector())); // get spin information so can transfer to EvtGen tcSpinPtr spin(dynamic_ptr_cast(part.spinInfo())); if(spin) spin->decay(); // don't convert neutrinos, aren't decays so waste of time if ( thisSpin == EvtSpinType::NEUTRINO) { throw Exception() << "Tried to convert a neutrino to EvtGen in " << "EvtGen::EvtParticle. This should not be needed as" << "EvtGen does not decay neutrinos" << Exception::eventerror; } // don't convert photons, aren't decays so waste of time else if ( thisSpin == EvtSpinType::PHOTON ) { throw Exception() << "Tried to convert a photon to EvtGen in " << "EvtGen::EvtParticle. This should not be needed as" << "EvtGen does not decay photons" << Exception::eventerror; } // scalar particles else if ( thisSpin == EvtSpinType::SCALAR ) { // create particle EvtScalarParticle * myPart = new EvtScalarParticle; myPart->init(id, p4); // set rho matrix if needed tcScalarSpinPtr sp(dynamic_ptr_cast(spin)); if(sp) { myPart->setSpinDensityForward(EvtGenSpinDensity(sp->rhoMatrix())); } else { EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); } evtpart=myPart; } else if ( thisSpin == EvtSpinType::DIRAC ) { EvtDiracParticle *myPart =new EvtDiracParticle; // get the spin info tcFermionSpinPtr sp(dynamic_ptr_cast(spin)); // has spin info transfer if(sp) { vector prod,decay; // transfer spinors for(unsigned int ix=0;ix<2;++ix) { prod .push_back(EvtGenSpinor(sp->getProductionBasisState(ix))); decay.push_back(EvtGenSpinor(sp->getDecayBasisState (ix))); } myPart->init(id, p4,prod[0],prod[1],decay[0],decay[1]); // set the density matrix myPart->setSpinDensityForward(EvtGenSpinDensity(sp->rhoMatrix())); } // no spin info else { myPart->init(id, p4); EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); } evtpart=myPart; } // vector particles else if ( thisSpin == EvtSpinType::VECTOR ) { EvtVectorParticle *myPart=new EvtVectorParticle; // get the spin info tcVectorSpinPtr sp(dynamic_ptr_cast(spin)); // has spin info transfer if(sp) { // transfer polarization vectors vector eps; for(unsigned int ix=0;ix<3;++ix) { eps.push_back(EvtGenPolarization(sp->getDecayBasisState(ix))); } myPart->init(id, p4,eps[0],eps[1],eps[2]); // set spin density matrix myPart->setSpinDensityForward(EvtGenSpinDensity(sp->rhoMatrix())); } // no spin info else { myPart->init(id, p4); EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); } evtpart=myPart; } // spin 3/2 particles else if ( thisSpin == EvtSpinType::RARITASCHWINGER ) { EvtRaritaSchwingerParticle *myPart=new EvtRaritaSchwingerParticle; // get the spin info tcRSFermionSpinPtr sp(dynamic_ptr_cast(spin)); // has spin info transfer if(sp) { // transfer spinors vector prod,decay; for(unsigned int ix=0;ix<4;++ix) { prod .push_back(EvtGenRSSpinor(sp->getProductionBasisState(ix))); decay.push_back(EvtGenRSSpinor(sp->getDecayBasisState(ix) )); } myPart->init(id, p4, prod[0] ,prod[1] ,prod[2] , prod[3], decay[0],decay[1],decay[2],decay[3]); // set spin density matrix myPart->setSpinDensityForward(EvtGenSpinDensity(sp->rhoMatrix())); } // no spin info else { myPart->init(id, p4); EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); } evtpart=myPart; } // spin-2 particles else if ( thisSpin == EvtSpinType::TENSOR ) { EvtTensorParticle *myPart =new EvtTensorParticle; tcTensorSpinPtr sp(dynamic_ptr_cast(spin)); // has spin info transfer if(sp) { // transfer the polarization tensors vector eps; for(unsigned int ix=0;ix<5;++ix) { eps.push_back(EvtGenTensor(sp->getDecayBasisState(ix))); } myPart->init(id, p4,eps[0],eps[1],eps[2],eps[3],eps[4]); // set spin density matrix myPart->setSpinDensityForward(EvtGenSpinDensity(sp->rhoMatrix())); } // no spin info else { myPart->init(id, p4); EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); } evtpart=myPart; } // shouldn't be doing this but here for safety else if ( thisSpin == EvtSpinType::STRING ) { EvtStringParticle *myPart; myPart=new EvtStringParticle; myPart->init(id, p4); EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); evtpart=myPart; } // high spin particles else if ( thisSpin == EvtSpinType::SPIN3 || thisSpin == EvtSpinType::SPIN5HALF || thisSpin == EvtSpinType::SPIN4 || thisSpin == EvtSpinType::SPIN7HALF) { EvtHighSpinParticle *myPart; myPart=new EvtHighSpinParticle; myPart->init(id, p4); EvtSpinDensity rho; rho.setDiag(EvtSpinType::getSpinStates(thisSpin)); myPart->setSpinDensityForward(rho); evtpart=myPart; } else { throw Exception() << "Can't convert particle to EvtGen " << part << Exception::eventerror; } // boost particle back and return the particle decay->boost(inmom.boostVector()); return evtpart; } // convert from ThePEG to EvtGen EvtId EvtGenInterface::EvtGenID(int id, bool exception) const { EvtId output; int absid=abs(id),ispin(absid%10),isgn(id/absid); // handle the easy cases if( //quarks(+excited) absid<=8|| // leptons(+exicted) (absid>=11&&absid<=18)|| // SM(+extensions) gauge bosons and higgs (absid>=21&&absid<=25)||(absid>=32&&absid<=37)|| // 1 1S0, 1 3S1 and 1 3P2 1 3D3 mesons are the same (absid>100&&absid<600&&ispin%2==1&&ispin<=9)|| // 2 1S0, 2 3S1 are the same (absid>100100&&absid<100600&&(ispin==1||ispin==3))|| // 1 3d1 goes to 3s in evtgen (absid>30100&&absid<30600&&ispin==3) || // 1 1P1 mesons are the same apart from D_s1 (absid>10100&&absid<10600&&(ispin==3)) || // 1 3P1 mesons are the same apart from D_s1 (absid>20100&&absid<20600&&(ispin==3)) || // mixed kaons and diffractive states (absid>=100&&absid<=3000&&ispin==0)) { output = EvtPDL::evtIdFromStdHep(id); } // lowest baryon multiplets and diquarks are almost the same else if(absid>1000&&absid<6000&&ispin>=1&&ispin<=4) { output = EvtPDL::evtIdFromStdHep(id); } // 1 3p0 same apart from f'0 else if (absid>10100&&absid<10600&&ispin==1) { if(absid==10221) output = EvtPDL::evtIdFromStdHep(isgn*30221); else output = EvtPDL::evtIdFromStdHep(id); } // excited baryons else if(((absid>10000&&absid<16000)||(absid>20000&&absid<26000)|| (absid>30000&&absid<36000))&&(ispin==2||ispin==4)) { output=EvtPDL::evtIdFromStdHep(id); } // special for any bottomonium states else if((absid%1000)/10==55) { output=EvtPDL::evtIdFromStdHep(id); } // special meson codes else if (absid>9000000) { // f_0/a_0(980) goes into f_0/a_0(980) if(absid==9000111||absid==9000211||absid==9010221) { output=EvtPDL::evtIdFromStdHep(id); } // sigma else if(absid==9000221) { output=EvtPDL::evtIdFromStdHep(id); } // psi(4040) else if(absid==9000443) { output=EvtPDL::evtIdFromStdHep(50443); } // f_0(1500) else if(absid==9030221) { output=EvtPDL::evtIdFromStdHep(9020221); } } // check its O.K. if(output.getAlias()==-1&&exception) { throw Exception() << "Can't find the EvtGen Id for particle " << getParticleData(id)->PDGName() << " with PDG code = " << id << " in EvtGen::EvtGenID" << Exception::eventerror; } return output; } ParticleVector EvtGenInterface::decayProducts(EvtParticle *part, bool boost) const { ParticleVector output,temp; for(unsigned int ix=0,N=part->getNDaug();ixgetDaug(ix); // may just have been used for mass generation, so check has valid momentum if(!daug->hasValidP4()) continue; // get the Herwig ParticleData object int id=ThePEGID(daug->getId()); tcPDPtr pd=getParticleData(id); // if easy to convert do it if(pd) output.push_back(ThePEGParticle(daug,pd)); // special for EvtGen particles like string we don't need to include else if(id==90) { // check if needs to be decayed by EvtGen if(EvtPDL::getStdHep(daug->getId())==92||daug->isDecayed()) { // add the particles ParticleVector temp(decayProducts(daug,EvtPDL::getStdHep(daug->getId())!=92)); if(EvtPDL::getStdHep(daug->getId())==92) { Lorentz5Momentum pstring(ThePEGMomentum(daug->getP4(),daug->mass())); Boost bv(-pstring.x()/pstring.e(),-pstring.y()/pstring.e(),-pstring.z()/pstring.e()); for(unsigned int ix=0;ixdeepBoost(bv); } } for(unsigned int iy=0;iyisDecayed()) { EvtDecayBase *decayer = EvtDecayTable::getInstance()->getDecayFunc(daug); // must be a decayer if(!decayer) throw Exception() << "Could find EvtGen decayer in " << "EvtGenInterface::decayProducts()" << Exception::runerror; // If there are already daughters, then this step is already done! // figure out the masses if ( daug->getNDaug() == 0 ) daug->generateMassTree(); // perform decay decayer->makeDecay(daug,false); // add the particles ParticleVector temp(decayProducts(daug)); for(unsigned int iy=0;iy0) { if(boost) { Boost bv=ThePEGMomentum(part->getP4(),part->mass()).boostVector(); for(unsigned int ix=0; ixdeepBoost(bv); } } return output; } void EvtGenInterface::ThePEGSpin(PPtr peg,EvtParticle *evt) const { // if no corresponding ThePEG spin type return if(evt->getSpinType()==EvtSpinType::STRING|| evt->getSpinType()==EvtSpinType::SPIN3||evt->getSpinType()==EvtSpinType::SPIN4|| evt->getSpinType()==EvtSpinType::SPIN5HALF|| evt->getSpinType()==EvtSpinType::SPIN7HALF) return; // now deal with the other cases // scalars unsigned int ix; SpinPtr spin; if(evt->getSpinType()==EvtSpinType::SCALAR) { ScalarSpinPtr sca(new_ptr(ScalarSpinInfo(peg->momentum(),true))); spin=sca; } // massless spin 1/2 else if(evt->getSpinType()==EvtSpinType::NEUTRINO) { FermionSpinPtr fer(new_ptr(FermionSpinInfo(peg->momentum(),true))); spin=fer; ix=peg->id()<0; fer->setBasisState(ix,ThePEGSpinor(evt->spParentNeutrino())); ix=peg->id()>0; fer->setBasisState(ix,LorentzSpinor()); } // massive spin-1/2 else if(evt->getSpinType()==EvtSpinType::DIRAC) { FermionSpinPtr fer(new_ptr(FermionSpinInfo(peg->momentum(),true))); spin=fer; for(ix=0;ix<2;++ix) { fer->setBasisState(ix,ThePEGSpinor(evt->spParent(ix))); } } // massless vectors else if(evt->getSpinType()==EvtSpinType::PHOTON) { VectorSpinPtr vec(new_ptr(VectorSpinInfo(peg->momentum(),true))); spin=vec; for(ix=0;ix<1;++ix) { vec->setBasisState(2*ix,ThePEGPolarization(evt->epsParentPhoton(ix)));} vec->setBasisState(1,LorentzVector()); } // massive vectors else if(evt->getSpinType()==EvtSpinType::VECTOR) { VectorSpinPtr vec(new_ptr(VectorSpinInfo(peg->momentum(),true))); spin=vec; for(ix=0;ix<3;++ix) { vec->setBasisState(ix,ThePEGPolarization(evt->epsParent(ix))); } } // massive spin 3/2 else if(evt->getSpinType()==EvtSpinType::RARITASCHWINGER) { RSFermionSpinPtr rs(new_ptr(RSFermionSpinInfo(peg->momentum(),true))); spin=rs; for(ix=0;ix<4;++ix) { rs->setBasisState(ix,ThePEGRSSpinor(evt->spRSParent(ix)));} } // tensors else if(evt->getSpinType()==EvtSpinType::TENSOR) { TensorSpinPtr ten(new_ptr(TensorSpinInfo(peg->momentum(),true))); spin=ten; for(ix=0;ix<5;++ix) { ten->setBasisState(ix,ThePEGTensor(evt->epsTensorParent(ix))); } } else { throw Exception() << "Unknown EvtGen spin type in EvtGen::ThePEGSpin() " << Exception::runerror; } // set the spininfo peg->spinInfo(spin); // final set up if the particle has decayed if(evt->getSpinDensityForward().getDim()!=0) { spin->rhoMatrix()=ThePEGSpinDensity(evt->getSpinDensityForward(),peg->id()); } if(evt->isDecayed()) { spin->decayed(true); spin->develop(); if(evt->getSpinDensityBackward().getDim()!=0) { spin->DMatrix()=ThePEGSpinDensity(evt->getSpinDensityBackward(),peg->id()); } } } // convert from EvtGen to ThePEG int EvtGenInterface::ThePEGID(EvtId eid,bool exception) const { int output(0); int id(EvtPDL::getStdHep(eid)),absid(abs(id)),ispin(absid%10); // handle the easy cases // special particles like string which we delete and include decay products if(absid==92||absid==41||absid==42||absid==43||absid==44|| absid==30343||absid==30353|| absid==30363||absid==30373||absid==30383) { output=90; } //quarks(+excited) else if(absid<=8|| // leptons(+excited) (absid>=11&&absid<=18)|| // SM gauge bosons and higgs (absid>=21&&absid<=25)||(absid>=32&&absid<=37)|| // 1 1S0, 1 3S1 and 1 3P2 mesons are the same (absid>100&&absid<600&&(ispin%2==1&&ispin<9))|| // 2 1S0 and 2 3S1 mesons are the same (absid>100100&&absid<100600&&(ispin==1||ispin==3))|| // 1 3p0 are the same (absid>10100&&absid<10600&&ispin==1) || // 3d1 are the same (absid>30100&&absid<30600&&ispin==3) || // 1 1P1 mesons are the same (absid>10100&&absid<10600&&(ispin==3)) || // 1 3P1 mesons are the same (absid>20100&&absid<20600&&(ispin==3)) || // lowest baryon multiplets and diquarks (absid>1000&&absid<6000&&ispin>=1&&ispin<=4)|| // mixed kaons and diffractive states (absid>=100&&absid<=3000&&ispin==0)) { output=id; } // 1 3P0 special for f'0 else if(absid==30221) output = 10221; // special for the virtual W (we don't distinguish so return W) else if(absid==89) return id/absid*24; // excited baryons else if(((absid>10000&&absid<16000)||(absid>20000&&absid<26000)|| (absid>30000&&absid<36000))&&(ispin==2||ispin==4)) { output=id; } // bottomium else if((absid%1000)/10==55) { output = id; } // special mesons else if(absid>9000000) { // f_0/a_0(980) goes into f_0/a_0(980) if(absid==9000111||absid==9000211||absid==9010221) { output=id; } // sigma else if(absid==9000221) { output=id; } // psi(4040) else if(absid==9000443) { output=id; } // f_0(1500) else if(absid==9020221) { output=9030221; } } // check its O.K. if(output==0&&exception) { throw Exception() << "Can't find the ThePEG id for particle " << EvtPDL::name(eid) << " with PDG code = " << id << " in EvtGen::ThePEGID" << Exception::eventerror; } return output; } RhoDMatrix EvtGenInterface::ThePEGSpinDensity(const EvtSpinDensity & rho, int id) const { RhoDMatrix output; unsigned int ix,iy; // special for neutrinos if(abs(id)%2==0&&abs(id)>=12&&abs(id)<=16) { output = RhoDMatrix(PDT::Spin1Half, false); if(id>0) output(0,0)=ThePEGComplex(rho.get(0,0)); else output(1,1)=ThePEGComplex(rho.get(0,0)); } // special for photons else if(id==ParticleID::gamma) { output = RhoDMatrix(PDT::Spin1, false); for(ix=0;ix<2;++ix) { for(iy=0;iy<2;++iy) output(2*ix,2*iy)=ThePEGComplex(rho.get(ix,iy)); } } // normal behaviour else { unsigned int ndim(abs(rho.getDim())); if(ndim!=0) { output = RhoDMatrix(PDT::Spin(ndim)); for(ix=0;ixparticles().begin(); ParticleMap::const_iterator pend = generator()->particles().end(); cout << "Testing conversion of particles from ThePEG to EvtGen\n"; EvtId etemp; for(;pit!=pend;++pit) { cout << pit->first << " "; etemp=EvtGenID(pit->first,false); Energy mass = pit->second->mass(); Energy width = pit->second->width(); if(etemp.getAlias()>=0) { cout << pit->second->PDGName() << "\t becomes " << EvtPDL::name(etemp) << "\t " << EvtPDL::getStdHep(etemp); if(ThePEGID(etemp,false)-pit->first!=0) { cout << " and converting back to ThePEG fails"; } double mass2 = EvtPDL::getMeanMass(etemp); double width2 = EvtPDL::getWidth(etemp); if(mass!=ZERO) { double delta = (mass-mass2*GeV)/mass; if(abs(delta)>1e-6) cout << " Mass Difference " << mass/GeV-mass2; } if(width>ZERO) { double delta = (width-width2*GeV)/width; if(abs(delta)>1e-6) cout << " Width Difference " << width/GeV-width2; } cout << "\n"; } else { cout << pit->second->PDGName() << " has no match in EvtGen \n"; } } // test the conversion the other way cout << "Testing conversion of particles from EvtGen to ThePEG\n"; int idtemp; tcPDPtr ptemp; for(unsigned int ix=0;ixPDGName() << " " << ptemp->id(); if(EvtGenID(ptemp->id(),false)!=EvtPDL::getEntry(ix)) { cout << " and converting back to EvtGEN fails "; } cout << "\n"; } else { cout << " has no match in ThePEG \n"; } } } void EvtGenInterface::outputEvtGenDecays(long parentid) const { // output the decay modes from EvtGen so we can read them in EvtId parent(EvtGenID(parentid)); // get evtids for children cout << "Outputting decays for " << getParticleData(parentid)->PDGName() << "\n"; for(int ix=0;ixgetNMode(parent.getAlias());++ix) { EvtDecayBase* decayer=EvtDecayTable::getInstance()->getDecay(parent.getAlias(),ix); vector pegid; for(int iy=0;iygetNDaug();++iy) { pegid.push_back(ThePEGID(decayer->getDaug(iy),false)); } for(unsigned int iy=pegid.size();iy<7;++iy) pegid.push_back(0); double br=decayer->getBranchingFraction(); cout << "insert into decay_modes (incomingID,BR,decayon,star,outgoingID1," << "outgoingID2,outgoingID3,outgoingID4,outgoingID5,outgoingID6,outgoingID7," << "description,decayer) values (" << parentid << "," << br << ",'on','*',"; for(int iy=0;iy<7;++iy) { cout << pegid[iy] << ","; } cout << "'Decay of %name% with branching " << "ratio taken from EvtGen.',3);\n"; } } int EvtGenInterface::EvtGenChannel(const DecayMode & dm) const { // get evtid for parent EvtId parent(EvtGenID(dm.parent()->id())); // get evtids for children EvtId daugs[20]; unsigned int ndaug(0); ParticleMSet::const_iterator pit = dm.products().begin(); ParticleMSet::const_iterator pend = dm.products().end(); EvtId etemp; for( ;pit!=pend&&ndaug<20;++pit) { etemp=EvtGenID((**pit).id()); daugs[ndaug]=etemp; ndaug++; } if(ndaug>=20) throw Exception() << "Too many decay products " << "in EvtGen::EvtGenChannel" << Exception::eventerror; // find the channel int output=EvtDecayTable::getInstance()->inChannelList(parent,ndaug,daugs); if(output<0) { string dmode; dmode = "decay of " + dm.parent()->PDGName() + " -> "; pit = dm.products().begin(); pend = dm.products().end(); for( ;pit!=pend&&ndaug<20;++pit) dmode += (**pit).PDGName()+" "; throw Exception() << "Can't find EVtGen decay mode in EvtGenChannel for " << dmode << " in EvtGen::EvtGenChannel" << Exception::runerror; } return output; } // translate the matrix element to our form void EvtGenInterface::constructVertex(const Particle & parent, ParticleVector products, EvtDecayAmp* damp) const { unsigned int ix,iy; vector outspin; for(ix=0;ixdataPtr()->iSpin()); } vector constants(products.size()+2,0); unsigned int nstate(1),idtemp; for(ix=outspin.size();ix>0;--ix) { idtemp=abs(products[ix-1]->id()); if(idtemp==ParticleID::gamma) { nstate*=2; constants[ix]=nstate; } else if(idtemp%2==0&&idtemp>=12&&idtemp<=16) { constants[ix]=nstate; } else { nstate*=outspin[ix-1]; constants[ix]=nstate; } } PDT::Spin inspin(parent.dataPtr()->iSpin()); nstate*=inspin; constants[0]=nstate; constants[outspin.size()+1]=1; int eind[10]={0,0,0,0,0,0,0,0,0,0}; unsigned int iloc; vector hind(outspin.size()+1,0); DecayMEPtr newME = new_ptr(GeneralDecayMatrixElement(inspin,outspin)); for(ix=0;ixid()==ParticleID::gamma) { hind[iy+1]=2*(ix%constants[iy+1])/constants[iy+2]; eind[iloc]=hind[iy+1]/2; ++iloc; } else if(constants[iy+1]==1) { hind[iy+1]=products[iy]->id()<0; } else { hind[iy+1]=(ix%constants[iy+1])/constants[iy+2]; eind[iloc]=hind[iy+1];++iloc; } } if(iloc==0) eind[0]=0; (*newME)(hind)=ThePEGComplex(damp->amplitude().getAmp(eind)); } // create the decay vertex VertexPtr vertex(new_ptr(DecayVertex())); DVertexPtr Dvertex(dynamic_ptr_cast(vertex)); // set the incoming particle for the decay vertex dynamic_ptr_cast(parent.spinInfo())->decayVertex(vertex); for(ix=0;ix(products[ix]->spinInfo()) ->productionVertex(vertex); } // set the matrix element Dvertex->ME(newME); } diff --git a/Decay/EvtGen/Makefile.am b/Decay/EvtGen/Makefile.am --- a/Decay/EvtGen/Makefile.am +++ b/Decay/EvtGen/Makefile.am @@ -1,12 +1,12 @@ pkglib_LTLIBRARIES = HwEvtGenInterface.la HwEvtGenInterface_la_SOURCES = \ EvtGenInterface.cc EvtGenInterface.h EvtGenInterface.fh \ EvtGenRandom.h \ EvtGenDecayer.cc EvtGenDecayer.h HwEvtGenInterface_la_LDFLAGS = $(AM_LDFLAGS) -module -version-info 2:0:0 HwEvtGenInterface_la_LIBADD = $(EVTGENLIBS) $(PYTHIA8LIB) HwEvtGenInterface_la_CPPFLAGS = $(AM_CPPFLAGS) $(EVTGENINCLUDE) \ --DEVTGEN_PREFIX="\"$(EVTGENPREFIX)\"" \ +-DEVTGEN_SHARE="\"$(EVTGENSHARE)\"" \ -DPYTHIA8DATA="\"$(PYTHIA8DATA)\"" diff --git a/m4/herwig.m4 b/m4/herwig.m4 --- a/m4/herwig.m4 +++ b/m4/herwig.m4 @@ -1,1003 +1,1009 @@ dnl ##### THEPEG ##### AC_DEFUN([HERWIG_CHECK_THEPEG], [ defaultlocation="${prefix}" test "x$defaultlocation" = xNONE && defaultlocation="${ac_default_prefix}" AC_MSG_CHECKING([for libThePEG in]) AC_ARG_WITH(thepeg, AC_HELP_STRING([--with-thepeg=DIR],[location of ThePEG installation]), [], [with_thepeg="${defaultlocation}"]) AC_MSG_RESULT([$with_thepeg]) if test "x$with_thepeg" = "xno"; then AC_MSG_ERROR([Cannot build Herwig without ThePEG. Please set --with-thepeg.]) fi THEPEGLDFLAGS="-L${with_thepeg}/lib/ThePEG" THEPEGHASLHAPDF="no" if test -e ${with_thepeg}/lib/ThePEG/ThePEGLHAPDF.so ; then THEPEGHASLHAPDF="yes" fi if test "${host_cpu}" == "x86_64" -a -e ${with_thepeg}/lib64/ThePEG/libThePEG.so ; then THEPEGLDFLAGS="-L${with_thepeg}/lib64/ThePEG" if test -e ${with_thepeg}/lib64/ThePEG/ThePEGLHAPDF.so ; then THEPEGHASLHAPDF="yes" fi fi if test "x$THEPEGHASLHAPDF" == "xno" ; then AC_MSG_ERROR([Herwig requires ThePEG to be build with lhapdf.]) fi THEPEGHASFASTJET="no" if test -e ${with_thepeg}/lib/ThePEG/FastJetFinder.so ; then THEPEGHASFASTJET="yes" fi if test "${host_cpu}" == "x86_64" -a -e ${with_thepeg}/lib64/ThePEG/libThePEG.so ; then THEPEGLDFLAGS="-L${with_thepeg}/lib64/ThePEG" if test -e ${with_thepeg}/lib64/ThePEG/FastJetFinder.so ; then THEPEGHASFASTJET="yes" fi fi if test "x$THEPEGHASFASTJET" == "xno" ; then AC_MSG_ERROR([Herwig requires ThePEG to be build with FastJet.]) fi THEPEGPATH="${with_thepeg}" oldldflags="$LDFLAGS" oldlibs="$LIBS" LDFLAGS="$LDFLAGS $THEPEGLDFLAGS" AC_CHECK_LIB([ThePEG],[debugThePEG],[], [AC_MSG_ERROR([No ThePEG libraries in $THEPEGLDFLAGS. Please set --with-thepeg.])]) AC_SUBST([THEPEGLIB],[-lThePEG]) AC_SUBST(THEPEGLDFLAGS) AC_SUBST(THEPEGPATH) AC_SUBST(THEPEGHASLHAPDF) AC_SUBST(THEPEGHASFASTJET) LIBS="$oldlibs" LDFLAGS="$oldldflags" AC_MSG_CHECKING([for ThePEG headers in]) AC_ARG_WITH([thepeg-headers], AC_HELP_STRING([--with-thepeg-headers=DIR],[location of ThePEG include directory]), [], [with_thepeg_headers="${with_thepeg}/include"]) AC_MSG_RESULT([$with_thepeg_headers]) if test "x$with_thepeg_headers" = "xno"; then AC_MSG_ERROR([Cannot build Herwig without ThePEG headers. Please set --with-thepeg-headers.]) fi THEPEGINCLUDE="-I$with_thepeg_headers" oldcppflags="$CPPFLAGS" CPPFLAGS="$CPPFLAGS $THEPEGINCLUDE" AC_CHECK_HEADER([ThePEG/Config/ThePEG.h],[], [AC_MSG_ERROR([No ThePEG headers in $with_thepeg_headers. Please set --with-thepeg-headers.])]) CPPFLAGS="$oldcppflags" AC_SUBST(THEPEGINCLUDE) AC_MSG_CHECKING([for HepMCAnalysis.so in ThePEG]) THEPEGHASHEPMC="no" if test -e ${with_thepeg}/lib/ThePEG/HepMCAnalysis.so ; then THEPEGHASHEPMC="yes" fi if test "${host_cpu}" == "x86_64" -a -e ${with_thepeg}/lib64/ThePEG/libThePEG.so ; then THEPEGLDFLAGS="-L${with_thepeg}/lib64/ThePEG" if test -e ${with_thepeg}/lib64/ThePEG/HepMCAnalysis.so ; then THEPEGHASHEPMC="yes" fi fi if test "x$THEPEGHASHEPMC" == "xno" ; then CREATE_HEPMC="# create" AC_MSG_RESULT([not found]) else CREATE_HEPMC="create" AC_MSG_RESULT([found]) fi AC_SUBST([CREATE_HEPMC]) AC_MSG_CHECKING([for RivetAnalysis.so in ThePEG]) THEPEGHASRIVET="no" if test -e ${with_thepeg}/lib/ThePEG/RivetAnalysis.so ; then THEPEGHASRIVET="yes" fi if test "${host_cpu}" == "x86_64" -a -e ${with_thepeg}/lib64/ThePEG/libThePEG.so ; then THEPEGLDFLAGS="-L${with_thepeg}/lib64/ThePEG" if test -e ${with_thepeg}/lib64/ThePEG/RivetAnalysis.so ; then THEPEGHASRIVET="yes" fi fi if test "x$THEPEGHASRIVET" == "xno" ; then CREATE_RIVET="# create" AC_MSG_RESULT([not found]) else CREATE_RIVET="create" AC_MSG_RESULT([found]) fi AM_CONDITIONAL(HAVE_RIVET,[test x$THEPEGHASRIVET = xyes]) AC_SUBST([CREATE_RIVET]) ]) dnl ##### LOOPTOOLS ##### AC_DEFUN([HERWIG_LOOPTOOLS], [ AC_REQUIRE([AC_PROG_FC]) AC_REQUIRE([AC_FC_LIBRARY_LDFLAGS]) AC_REQUIRE([AC_PROG_CC]) AC_REQUIRE([HERWIG_COMPILERFLAGS]) AC_MSG_CHECKING([if Looptools build works]) enable_looptools=yes if test "x$GCC" = "xyes"; then case "${host}" in x86_64-*|*-darwin1*) AM_FCFLAGS="$AM_FCFLAGS -fdefault-integer-8" ;; esac AC_LANG_PUSH([Fortran]) oldFCFLAGS="$FCFLAGS" FCFLAGS="$AM_FCFLAGS" AC_COMPILE_IFELSE( AC_LANG_PROGRAM([],[ print *[,]"Hello"]), [], [AC_MSG_RESULT([no]) AC_MSG_ERROR([needs gfortran on 64bit machines])] ) FCFLAGS="$oldFCFLAGS" AC_LANG_POP([Fortran]) fi AC_MSG_RESULT([$enable_looptools]) AC_LANG_PUSH([Fortran]) AC_MSG_CHECKING([checking if fortran compiler compiles argument mismatches]) AC_COMPILE_IFELSE(AC_LANG_SOURCE([[ program temp call a(1.0D0) end program subroutine a(b) double complex b end]]), [AC_MSG_RESULT([yes])], [oldFCFLAGS="$FCFLAGS" FCFLAGS="-std=legacy" AC_MSG_CHECKING([checking if fortran compiler compiles argument mismatches with -std=legacy]) AC_COMPILE_IFELSE(AC_LANG_SOURCE([[ program temp double precision b double complex c b = 1.0D0 c =1.0D0 call a(b) call a(c) end program subroutine a(b) double complex b end]]), [AC_MSG_RESULT([yes]) AM_FCFLAGS="$AM_FCFLAGS -std=legacy"], [AC_MSG_RESULT([no]) AC_MSG_ERROR([fortran compiler won't compile LoopTools])]) FCFLAGS="$oldFCFLAGS -std=legacy"] ) AC_MSG_CHECKING([checking if fortran compiler compiles long lines]) AC_COMPILE_IFELSE(AC_LANG_SOURCE([[ program temp write (*,*) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' end program]]), [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no]) oldFCFLAGS="$FCFLAGS" FCFLAGS="-ffixed-line-length-none" AC_MSG_CHECKING([checking if fortran compiler compiles long lines with -ffixed-line-length-none]) AC_COMPILE_IFELSE(AC_LANG_SOURCE([[ program temp write (*,*) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' end program]]), [AC_MSG_RESULT([yes]) AM_FCFLAGS="$AM_FCFLAGS -ffixed-line-length-none" FCFLAGS="$oldFCFLAGS -ffixed-line-length-none"], [FCFLAGS="-132" AC_MSG_CHECKING([checking if fortran compiler compiles long lines with -132]) AC_COMPILE_IFELSE(AC_LANG_SOURCE([[ program temp write (*,*) 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa' end program]]), [AC_MSG_RESULT([yes]) AM_FCFLAGS="$AM_FCFLAGS -132" FCFLAGS="$oldFCFLAGS -132"], [AC_MSG_RESULT([no]) AC_MSG_ERROR([fortran compiler won't compile LoopTools])])]) ] ) AC_LANG_POP([Fortran]) AC_SUBST([F77],[$FC]) AC_SUBST([FFLAGS],[$FCFLAGS]) AC_SUBST([AM_FFLAGS],[$AM_FCFLAGS]) AC_SUBST([FLIBS],[$FCLIBS]) ]) dnl ##### VBFNLO ##### AC_DEFUN([HERWIG_CHECK_VBFNLO], [ AC_MSG_CHECKING([for VBFNLO]) AC_ARG_WITH([vbfnlo], AS_HELP_STRING([--with-vbfnlo=DIR], [Installation path of VBFNLO]), [], [with_vbfnlo=no] ) AC_MSG_RESULT([$with_vbfnlo]) AS_IF([test "x$with_vbfnlo" != "xno"], [AC_CHECK_FILES( ${with_vbfnlo}/lib/VBFNLO/libVBFNLO.so, [have_vbfnlo=lib], [have_vbfnlo=no])], [have_vbfnlo=no]) AS_IF([test "x$with_vbfnlo" != "xno" -a "x$have_vbfnlo" = "xno" ], [AC_CHECK_FILES( ${with_vbfnlo}/lib64/VBFNLO/libVBFNLO.so, [have_vbfnlo=lib64], [have_vbfnlo=no])]) AS_IF([test "x$with_vbfnlo" != "xno" -a "x$have_vbfnlo" = "xno" ], [AC_CHECK_FILES( ${with_vbfnlo}/lib/VBFNLO/libVBFNLO.dylib, [have_vbfnlo=lib], [have_vbfnlo=no])]) AS_IF([test "x$with_vbfnlo" != "xno" -a "x$have_vbfnlo" = "xno" ], [AC_CHECK_FILES( ${with_vbfnlo}/lib64/VBFNLO/libVBFNLO.dylib, [have_vbfnlo=lib64], [have_vbfnlo=no])]) AS_IF([test "x$have_vbfnlo" = "xlib"], [VBFNLOLIBS=${with_vbfnlo}/lib/VBFNLO AC_SUBST(VBFNLOLIBS) ]) AS_IF([test "x$have_vbfnlo" = "xlib64"], [VBFNLOLIBS=${with_vbfnlo}/lib64/VBFNLO AC_SUBST(VBFNLOLIBS) ]) AS_IF([test "x$with_vbfnlo" != "xno" -a "x$have_vbfnlo" = "xno"], [AC_MSG_ERROR([vbfnlo requested but not found])]) AM_CONDITIONAL(HAVE_VBFNLO,[test "x$have_vbfnlo" = "xlib" -o "x$have_vbfnlo" = "xlib64"]) if test "x$have_vbfnlo" = "xlib" -o "x$have_vbfnlo" = "xlib64" ; then AC_REQUIRE([AC_PROG_SED]) VBFNLOINCLUDE=${with_vbfnlo}/include AC_SUBST(VBFNLOINCLUDE) VBFNLOLIB=$(echo ${with_vbfnlo}/${have_vbfnlo}/VBFNLO | $SED -e 's%/\+%/%g') AC_SUBST(VBFNLOLIB) LOAD_VBFNLO="library" CREATE_VBFNLO="create" INSERT_VBFNLO="insert" SET_VBFNLO="set" DO_VBFNLO="do" MKDIR_VBFNLO="mkdir" else LOAD_VBFNLO="# library" CREATE_VBFNLO="# create" INSERT_VBFNLO="# insert" SET_VBFNLO="# set" DO_VBFNLO="# do" MKDIR_VBFNLO="# mkdir" fi AC_SUBST([LOAD_VBFNLO]) AC_SUBST([CREATE_VBFNLO]) AC_SUBST([INSERT_VBFNLO]) AC_SUBST([SET_VBFNLO]) AC_SUBST([DO_VBFNLO]) AC_SUBST([MKDIR_VBFNLO]) ]) dnl ##### njet ##### AC_DEFUN([HERWIG_CHECK_NJET], [ AC_MSG_CHECKING([for njet]) AC_ARG_WITH([njet], AS_HELP_STRING([--with-njet=DIR], [Installation path of njet]), [], [with_njet=no] ) AC_MSG_RESULT([$with_njet]) AS_IF([test "x$with_njet" != "xno"], [AC_CHECK_FILES( ${with_njet}/lib/libnjet2.so, [have_njet=lib], [have_njet=no])], [have_njet=no]) AS_IF([test "x$with_njet" != "xno" -a "x$have_njet" = "xno" ], [AC_CHECK_FILES( ${with_njet}/lib64/libnjet2.so, [have_njet=lib64], [have_njet=no])]) AS_IF([test "x$with_njet" != "xno" -a "x$have_njet" = "xno" ], [AC_CHECK_FILES( ${with_njet}/lib/libnjet2.dylib, [have_njet=lib], [have_njet=no])]) AS_IF([test "x$with_njet" != "xno" -a "x$have_njet" = "xno" ], [AC_CHECK_FILES( ${with_njet}/lib/libnjet3.so, [have_njet=lib], [have_njet=no])]) AS_IF([test "x$with_njet" != "xno" -a "x$have_njet" = "xno" ], [AC_CHECK_FILES( ${with_njet}/lib64/libnjet3.so, [have_njet=lib], [have_njet=no])]) AS_IF([test "x$with_njet" != "xno" -a "x$have_njet" = "xno" ], [AC_CHECK_FILES( ${with_njet}/lib/libnjet3.dylib, [have_njet=lib], [have_njet=no])]) AS_IF([test "x$with_njet" != "xno" ], [AC_CHECK_FILES( ${with_njet}/include/njet.h, [njet_include=include], [njet_include=include/njet])]) AS_IF([test "x$have_njet" = "xlib"], [NJETLIBPATH=${with_njet}/lib AC_SUBST(NJETLIBPATH) NJETINCLUDEPATH=${with_njet}/$njet_include AC_SUBST(NJETINCLUDEPATH) NJETPREFIX=${with_njet} AC_SUBST(NJETPREFIX) ]) AS_IF([test "x$have_njet" = "xlib64"], [NJETLIBPATH=${with_njet}/lib64 AC_SUBST(NJETLIBPATH) NJETINCLUDEPATH=${with_njet}/$njet_include AC_SUBST(NJETINCLUDEPATH) NJETPREFIX=${with_njet} AC_SUBST(NJETPREFIX) ]) AS_IF([test "x$with_njet" != "xno" -a "x$have_njet" = "xno"], [AC_MSG_ERROR([njet requested but not found])]) AM_CONDITIONAL(HAVE_NJET,[test "x$have_njet" = "xlib" -o "x$have_njet" = "xlib64"]) AS_IF([test "x$with_njet" != "xno"],[AC_MSG_CHECKING([for Njet version]) tmp_njetversion=[$(${with_njet}/bin/njet.py --version 2>&1 | grep -oE '[0-9]{4}$')] AS_IF([test -z "$tmp_njetversion"], [tmp_njetversion=1023]) AC_MSG_RESULT([${tmp_njetversion}]) NJET_VERSION=${tmp_njetversion} AC_SUBST(NJET_VERSION) ]) if test "x$have_njet" = "xlib" -o "x$have_njet" = "xlib64" ; then LOAD_NJET="library" CREATE_NJET="create" INSERT_NJET="insert" DO_NJET="do" else LOAD_NJET="# library" CREATE_NJET="# create" INSERT_NJET="# insert" DO_NJET="# do" fi AC_SUBST([LOAD_NJET]) AC_SUBST([CREATE_NJET]) AC_SUBST([INSERT_NJET]) AC_SUBST([DO_NJET]) ]) dnl ##### gosam ##### AC_DEFUN([HERWIG_CHECK_GOSAM], [ AC_MSG_CHECKING([for GoSam]) AC_ARG_WITH([gosam], AS_HELP_STRING([--with-gosam=DIR], [Installation path of GoSam]), [], [with_gosam=no] ) AC_MSG_RESULT([$with_gosam]) AS_IF([test "x$with_gosam" != "xno"], [AC_CHECK_FILES( ${with_gosam}/bin/gosam.py, [have_gosam=lib], [have_gosam=no])], [have_gosam=no]) AS_IF([test "x$have_gosam" = "xlib"], [GOSAMPREFIX=${with_gosam} AC_SUBST(GOSAMPREFIX) ]) AS_IF([test "x$with_gosam" != "xno" -a "x$have_gosam" = "xno"], [AC_MSG_ERROR([GoSam requested but not found])]) AS_IF([test "x$with_gosam" != "xno"], [AC_MSG_CHECKING([for GoSam version >= 2.0.4]) tmp_gosamversion=[$(${with_gosam}/bin/gosam.py --version | grep 'GoSam.*rev' | cut -d' ' -f2)] AX_COMPARE_VERSION([${tmp_gosamversion}],[lt],[2.0.4], [AC_MSG_RESULT([no]) AC_MSG_ERROR([Herwig requires GoSam 2.0.4 or later, found ${tmp_gosamversion}])], [AC_MSG_RESULT([yes])])]) AM_CONDITIONAL(HAVE_GOSAM,[test "x$have_gosam" = "xlib" ]) if test "x$have_gosam" = "xlib" ; then LOAD_GOSAM="library" CREATE_GOSAM="create" INSERT_GOSAM="insert" DO_GOSAM="do" else LOAD_GOSAM="# library" CREATE_GOSAM="# create" INSERT_GOSAM="# insert" DO_GOSAM="# do" fi AC_SUBST([LOAD_GOSAM]) AC_SUBST([CREATE_GOSAM]) AC_SUBST([INSERT_GOSAM]) AC_SUBST([DO_GOSAM]) ]) dnl ##### gosam-contrib ##### AC_DEFUN([HERWIG_CHECK_GOSAM_CONTRIB], [ AC_MSG_CHECKING([for gosam-contrib]) AC_ARG_WITH([gosam-contrib], AS_HELP_STRING([--with-gosam-contrib=DIR], [Installation path of gosam-contrib]), [], [with_gosam_contrib=no] ) AC_MSG_RESULT([$with_gosam_contrib]) AS_IF([test "x$with_gosam_contrib" = "xno" -a "x$with_gosam" != "xno"], [AC_CHECK_FILES( ${with_gosam}/lib/libsamurai.so, [with_gosam_contrib=${with_gosam}], []) ]) AS_IF([test "x$with_gosam_contrib" = "xno" -a "x$with_gosam" != "xno"], [AC_CHECK_FILES( ${with_gosam}/lib64/libsamurai.so, [with_gosam_contrib=${with_gosam}], []) ]) AS_IF([test "x$with_gosam_contrib" = "xno" -a "x$with_gosam" != "xno"], [AC_CHECK_FILES( ${with_gosam}/lib/libsamurai.dylib, [with_gosam_contrib=${with_gosam}], []) ]) AS_IF([test "x$with_gosam_contrib" = "xno" -a "x$with_gosam" != "xno"], [AC_CHECK_FILES( ${with_gosam}/lib64/libsamurai.dylib, [with_gosam_contrib=${with_gosam}], []) ]) AS_IF([test "x$with_gosam_contrib" = "xno" -a "x$with_gosam" != "xno"], [AC_MSG_ERROR([GoSam requested without requesting GoSam-Contrib])]) AS_IF([test "x$with_gosam_contrib" != "xno"], [AC_CHECK_FILES( ${with_gosam_contrib}/lib/libsamurai.so, [have_gosam_contrib=lib], [have_gosam_contrib=no])], [have_gosam_contrib=no]) AS_IF([test "x$with_gosam_contrib" != "xno" -a "x$have_gosam_contrib" = "xno" ], [AC_CHECK_FILES( ${with_gosam_contrib}/lib64/libsamurai.so, [have_gosam_contrib=lib64], [have_gosam_contrib=no])]) AS_IF([test "x$with_gosam_contrib" != "xno" -a "x$have_gosam_contrib" = "xno" ], [AC_CHECK_FILES( ${with_gosam_contrib}/lib/libsamurai.dylib, [have_gosam_contrib=lib], [have_gosam_contrib=no])]) AS_IF([test "x$with_gosam_contrib" != "xno" -a "x$have_gosam_contrib" = "xno" ], [AC_CHECK_FILES( ${with_gosam_contrib}/lib64/libsamurai.dylib, [have_gosam_contrib=lib64], [have_gosam_contrib=no])]) AS_IF([test "x$have_gosam_contrib" != "xno"], [GOSAMCONTRIBPREFIX=${with_gosam_contrib} AC_SUBST(GOSAMCONTRIBPREFIX) ]) AS_IF([test "x$have_gosam_contrib" = "xlib"], [GOSAMCONTRIBLIBS=${with_gosam_contrib}/lib AC_SUBST(GOSAMCONTRIBLIBS) ]) AS_IF([test "x$have_gosam_contrib" = "xlib64"], [GOSAMCONTRIBLIBS=${with_gosam_contrib}/lib64 AC_SUBST(GOSAMCONTRIBLIBS) ]) AS_IF([test "x$with_gosam_contrib" != "xno" -a "x$have_gosam_contrib" = "xno"], [AC_MSG_ERROR([GoSam-Contrib requested but not found])]) AM_CONDITIONAL(HAVE_GOSAM_CONTRIB,[test "x$have_gosam_contrib" = "xlib" -o "x$have_gosam_contrib" = "xlib64"]) if test "x$have_gosam_contrib" = "xlib" -o "x$have_gosam_contrib" = "xlib64" ; then LOAD_GOSAM_CONTRIB="library" CREATE_GOSAM_CONTRIB="create" INSERT_GOSAM_CONTRIB="insert" else LOAD_GOSAM_CONTRIB="# library" CREATE_GOSAM_CONTRIB="# create" INSERT_GOSAM_CONTRIB="# insert" fi AC_SUBST([LOAD_GOSAM_CONTRIB]) AC_SUBST([CREATE_GOSAM_CONTRIB]) AC_SUBST([INSERT_GOSAM_CONTRIB]) ]) dnl ##### OpenLoops ##### AC_DEFUN([HERWIG_CHECK_OPENLOOPS], [ AC_MSG_CHECKING([for OpenLoops]) AC_ARG_WITH([openloops], AS_HELP_STRING([--with-openloops=DIR], [Installation path of OpenLoops]), [], [with_openloops=no] ) AC_MSG_RESULT([$with_openloops]) AS_IF([test "x$with_openloops" != "xno"], [AC_CHECK_FILES( ${with_openloops}/lib/libopenloops.so, [have_openloops=lib], [have_openloops=no])], [have_openloops=no]) AS_IF([test "x$with_openloops" != "xno" -a "x$have_openloops" = "xno" ], [AC_CHECK_FILES( ${with_openloops}/lib/libopenloops.dylib, [have_openloops=lib], [have_openloops=no])]) AS_IF([test "x$with_openloops" != "xno" -a "x$have_openloops" = "xno" ], [AC_CHECK_FILES( ${with_openloops}/lib64/libopenloops.so, [have_openloops=lib64], [have_openloops=no])]) AS_IF([test "x$with_openloops" != "xno" -a "x$have_openloops" = "xno" ], [AC_CHECK_FILES( ${with_openloops}/lib64/libopenloops.dylib, [have_openloops=lib64], [have_openloops=no])]) AS_IF([test "x$have_openloops" = "xlib"], [OPENLOOPSLIBS=${with_openloops}/lib AC_SUBST(OPENLOOPSLIBS) ]) AS_IF([test "x$have_openloops" = "xlib64"], [OPENLOOPSLIBS=${with_openloops}/lib64 AC_SUBST(OPENLOOPSLIBS) ]) AS_IF([test "x$with_openloops" != "xno" -a "x$have_openloops" = "xno"], [AC_MSG_ERROR([OpenLoops requested but not found])]) AM_CONDITIONAL(HAVE_OPENLOOPS,[test "x$have_openloops" = "xlib" -o "x$have_openloops" = "xlib64"]) if test "x$have_openloops" = "xlib" -o "x$have_openloops" = "xlib64" ; then OPENLOOPSPREFIX=${with_openloops} LOAD_OPENLOOPS="library" CREATE_OPENLOOPS="create" INSERT_OPENLOOPS="insert" SET_OPENLOOPS="set" DO_OPENLOOPS="do" MKDIR_OPENLOOPS="mkdir" else LOAD_OPENLOOPS="# library" CREATE_OPENLOOPS="# create" INSERT_OPENLOOPS="# insert" SET_OPENLOOPS="# set" DO_OPENLOOPS="# do" MKDIR_OPENLOOPS="# mkdir" fi AC_SUBST([OPENLOOPSPREFIX]) AC_SUBST([LOAD_OPENLOOPS]) AC_SUBST([CREATE_OPENLOOPS]) AC_SUBST([INSERT_OPENLOOPS]) AC_SUBST([SET_OPENLOOPS]) AC_SUBST([DO_OPENLOOPS]) AC_SUBST([MKDIR_OPENLOOPS]) ]) ######################################### dnl ##### madgraph ##### AC_DEFUN([HERWIG_CHECK_MADGRAPH], [ AC_MSG_CHECKING([for MadGraph]) AC_ARG_WITH([madgraph], AS_HELP_STRING([--with-madgraph=DIR], [Installation path of MadGraph]), [], [with_madgraph=no] ) AC_MSG_RESULT([$with_madgraph]) AS_IF([test "x$with_madgraph" != "xno"], [AC_CHECK_FILES( ${with_madgraph}/bin/mg5_aMC, [have_madgraph=yes], [have_madgraph=no])], [have_madgraph=no]) AS_IF([test "x$have_madgraph" = "xyes"], [MADGRAPHPREFIX=${with_madgraph} AC_SUBST(MADGRAPHPREFIX) ]) AS_IF([test "x$with_madgraph" != "xno" -a "x$have_madgraph" = "xno"], [AC_MSG_ERROR([MadGraph requested but not found])]) AM_CONDITIONAL(HAVE_MADGRAPH,[test "x$have_madgraph" = "xyes" ]) if test "x$have_madgraph" = "xyes" ; then LOAD_MADGRAPH="library" CREATE_MADGRAPH="create" INSERT_MADGRAPH="insert" SET_MADGRAPH="set" DO_MADGRAPH="do" else LOAD_MADGRAPH="# library" CREATE_MADGRAPH="# create" INSERT_MADGRAPH="# insert" SET_MADGRAPH="# set" DO_MADGRAPH="# do" fi AC_SUBST([LOAD_MADGRAPH]) AC_SUBST([CREATE_MADGRAPH]) AC_SUBST([INSERT_MADGRAPH]) AC_SUBST([SET_MADGRAPH]) AC_SUBST([DO_MADGRAPH]) ]) AC_DEFUN([HERWIG_CHECK_PYTHIA], [ dnl check if a directory is specified for Pythia AC_ARG_WITH(pythia, [AC_HELP_STRING([--with-pythia=dir], [Assume the given directory for Pythia])]) dnl search for the pythia-config script if test "$with_pythia" = ""; then AC_PATH_PROG(pythiaconfig, pythia8-config, no) else AC_PATH_PROG(pythiaconfig, pythia8-config, no, ${with_pythia}/bin) fi if test "${pythiaconfig}" = "no"; then AC_MSG_CHECKING(Pythia) AC_MSG_RESULT(no); PYTHIA8LIB= # $2 else PYTHIA8DATA=`${pythiaconfig} --datadir`/xmldoc PYTHIA8LIB="-L`${pythiaconfig} --libdir` -lpythia8" fi AC_SUBST(PYTHIA8DATA) AC_SUBST(PYTHIA8LIB) ]) dnl CHECK PYTHIA END dnl ##### EvtGen ##### AC_DEFUN([HERWIG_CHECK_EVTGEN], [ AC_MSG_CHECKING([for evtgen]) AC_ARG_WITH([evtgen], AS_HELP_STRING([--with-evtgen=DIR], [Installation path of EvtGen]), [], [with_evtgen=no] ) AC_MSG_RESULT([$with_evtgen]) AS_IF([test "x$with_evtgen" != "xno"], [AC_CHECK_FILES( ${with_evtgen}/lib/libEvtGenExternal.so, [have_evtgen=lib], [have_evtgen=no])], [have_evtgen=no]) AS_IF([test "x$with_evtgen" != "xno" -a "x$have_evtgen" = "xno"], [AC_CHECK_FILES( ${with_evtgen}/lib64/libEvtGenExternal.so, [have_evtgen=lib64], [have_evtgen=no])]) AS_IF([test "x$with_evtgen" != "xno" -a "x$have_evtgen" = "xno" ], [AC_CHECK_FILES( ${with_evtgen}/lib/libEvtGenExternal.dylib, [have_evtgen=lib], [have_evtgen=no])]) AS_IF([test "x$have_evtgen" = "xlib" -o "x$have_evtgen" = "xlib64" ], [EVTGENPREFIX=${with_evtgen} AC_SUBST(EVTGENPREFIX) ]) + +AS_IF([test "x$have_evtgen" = "xlib" -o "x$have_evtgen" = "xlib64" ], + [AC_CHECK_FILES( + ${with_evtgen}/share/evt.pdl, + [EVTGENSHARE=${with_evtgen}/share], [EVTGENSHARE=${with_evtgen}/share/EvtGen]) + AC_SUBST(EVTGENSHARE)]) AS_IF([test "x$with_evtgen" != "xno" -a "x$have_evtgen" = "xno"], [AC_MSG_ERROR([EvtGen requested but not found])]) AC_SUBST([EVTGENINCLUDE],[-I$EVTGENPREFIX/include]) AM_CONDITIONAL(HAVE_EVTGEN,[test "x$have_evtgen" = "xlib" -o "x$have_evtgen" = "xlib64"]) if test "x$have_evtgen" = "xlib" ; then LOAD_EVTGEN_DECAYS="read EvtGenBDecays.in" LOAD_EVTGEN_DECAYER="read EvtGenDecayer.in" EVTGENLIBS="-L$with_evtgen/lib -lEvtGen -lEvtGenExternal" elif test "x$have_evtgen" = "xlib64" ; then LOAD_EVTGEN_DECAYS="read EvtGenBDecays.in" LOAD_EVTGEN_DECAYER="read EvtGenDecayer.in" EVTGENLIBS="-L$with_evtgen/lib64 -lEvtGen -lEvtGenExternal" else LOAD_EVTGEN_DECAYS="read HerwigBDecays.in" LOAD_EVTGEN_DECAYER="#read EvtGenDecayer.in" EVTGENLIBS="" fi AC_SUBST([LOAD_EVTGEN_DECAYS]) AC_SUBST([LOAD_EVTGEN_DECAYER]) AC_SUBST([EVTGENLIBS]) ]) dnl ###### GSL ###### AC_DEFUN([HERWIG_CHECK_GSL], [ AC_MSG_CHECKING([for gsl location]) GSLINCLUDE="" GSLLIBS="" AC_ARG_WITH(gsl, AC_HELP_STRING([--with-gsl=DIR],[location of gsl installation @<:@default=system libs@:>@]), [], [with_gsl=system]) if test "x$with_gsl" = "xno"; then AC_MSG_ERROR([libgsl is required. Please install the GNU scientific library and header files.]) fi if test "x$with_gsl" = "xsystem"; then AC_MSG_RESULT([in system libraries]) oldlibs="$LIBS" AC_CHECK_LIB(m,main) AC_CHECK_LIB(gslcblas,main) AC_CHECK_LIB(gsl,main,[], [ AC_MSG_ERROR([Cannot find libgsl. Please install the GNU scientific library and header files or use --with-gsl=.]) ] ) GSLLIBS="$LIBS" GSLPATH="$with_gsl" LIBS=$oldlibs else if test "`uname -m`" = "x86_64" -a -e "$with_gsl/lib64/libgsl.a" -a -d "$with_gsl/include/gsl"; then AC_MSG_RESULT([found in $with_gsl]) GSLLIBS="-L$with_gsl/lib64 -R$with_gsl/lib64 -lgslcblas -lgsl" GSLINCLUDE="-I$with_gsl/include" GSLPATH="$with_gsl" elif test -e "$with_gsl/lib/libgsl.a" -a -d "$with_gsl/include/gsl"; then AC_MSG_RESULT([found in $with_gsl]) GSLLIBS="-L$with_gsl/lib -R$with_gsl/lib -lgslcblas -lgsl" GSLINCLUDE="-I$with_gsl/include" GSLPATH="$with_gsl" else AC_MSG_RESULT([not found]) AC_MSG_ERROR([Can't find $with_gsl/lib/libgsl.a or the headers in $with_gsl/include]) fi fi AC_SUBST(GSLINCLUDE) AC_SUBST(GSLLIBS) AC_SUBST(GSLPATH) ]) dnl ##### COMPILERFLAGS ##### AC_DEFUN([HERWIG_COMPILERFLAGS], [ AC_REQUIRE([HERWIG_CHECK_GSL]) AC_REQUIRE([HERWIG_CHECK_THEPEG]) AC_REQUIRE([BOOST_REQUIRE]) AC_REQUIRE([AX_COMPILER_VENDOR]) AM_CPPFLAGS="-I\$(top_builddir)/include $THEPEGINCLUDE \$(GSLINCLUDE) \$(BOOST_CPPFLAGS)" AC_MSG_CHECKING([for debugging mode]) AC_ARG_ENABLE(debug, AC_HELP_STRING([--enable-debug],[debug mode, use --enable-debug=slow for additional options that slow down the run.]), [], [enable_debug=no] ) AC_MSG_RESULT([$enable_debug]) if test "x$enable_debug" = "xno"; then debugflags="" else debugflags="-g" fi dnl -Wfloat-equal -fvisibility-inlines-hidden -Wctor-dtor-privacy -Weffc++ if test -n "$GCC"; then warnflags="-pedantic -Wall -Wextra -Wno-overloaded-virtual" if test "x$enable_debug" = "xslow"; then debugflags="$debugflags -fno-inline" AM_CPPFLAGS="$AM_CPPFLAGS -D_GLIBCXX_DEBUG" fi fi dnl do an actual capability check on ld instead of this workaround case "${host}" in *-darwin*) ;; *) AM_LDFLAGS="-Wl,--enable-new-dtags" ;; esac case "${ax_cv_cxx_compiler_vendor}" in gnu) AM_CXXFLAGS="-pedantic -Wall -W" ;; clang) AM_CXXFLAGS="-pedantic -Wall -Wno-overloaded-virtual -Wno-unused-function -Wno-unused-parameter" dnl -Wno-unneeded-internal-declaration ;; intel) AM_CXXFLAGS="-strict-ansi -Wall -wd13000,1418,981,444,383,1599,1572,2259,980" ;; esac AC_SUBST(AM_CPPFLAGS) AC_SUBST(AM_CFLAGS, ["$warnflags $debugflags"]) AC_SUBST(AM_CXXFLAGS,["$AM_CXXFLAGS $warnflags $debugflags"]) AC_SUBST(AM_FCFLAGS, ["$debugflags"]) AC_SUBST(AM_LDFLAGS) ]) AC_DEFUN([HERWIG_ENABLE_MODELS], [ AC_MSG_CHECKING([if BSM models should be built]) AC_ARG_ENABLE(models, AC_HELP_STRING([--disable-models],[Turn off compilation of BSM models.]), [], [enable_models=yes] ) AC_MSG_RESULT([$enable_models]) LOAD_BSM="" if test "$enable_models" = "yes"; then LOAD_BSM="read BSMlibs.in" fi AC_SUBST(LOAD_BSM) AM_CONDITIONAL(WANT_BSM,[test "$enable_models" = "yes"]) ]) AC_DEFUN([HERWIG_OVERVIEW], [ FCSTRING=`$FC --version | head -1` CXXSTRING=`$CXX --version | head -1` CCSTRING=`$CC --version | head -1` if test "x$PYTHON" != "x:" then python_was_found="yes, using Python $PYTHON_VERSION" else python_was_found="no, requires Python >= 2.6" fi cat << _HW_EOF_ > config.herwig ***************************************************** *** $PACKAGE_STRING configuration summary *** Please include this information in bug reports! ***-------------------------------------------------- *** Prefix: $prefix *** *** BSM models: $enable_models *** UFO converter: ${python_was_found} *** *** Herwig debug mode: $enable_debug *** *** ThePEG: $with_thepeg *** ThePEG headers: $with_thepeg_headers *** *** GoSam: $with_gosam *** GoSam-Contrib: $with_gosam_contrib *** MadGraph: $with_madgraph *** njet: $with_njet ${NJET_VERSION} *** OpenLoops: $with_openloops *** VBFNLO: $with_vbfnlo *** *** EvtGen: $with_evtgen *** GSL: $with_gsl *** boost: ${BOOST_CPPFLAGS:-system} *** Fastjet: ${fjconfig} *** *** Host: $host *** CC: $CCSTRING *** CXX: $CXXSTRING *** FC: $FCSTRING *** *** CXXFLAGS: $CXXFLAGS *** FCFLAGS: $FCFLAGS ***************************************************** _HW_EOF_ ])