diff --git a/CepGen/Cards/ConfigHandler.cpp b/CepGen/Cards/ConfigHandler.cpp index 1dcf4f2..cbff4fe 100644 --- a/CepGen/Cards/ConfigHandler.cpp +++ b/CepGen/Cards/ConfigHandler.cpp @@ -1,257 +1,257 @@ #include "ConfigHandler.h" #ifdef LIBCONFIG namespace CepGen { namespace Cards { //----- specialization for CepGen input cards ConfigHandler::ConfigHandler( const char* file ) { #ifdef LIBCONFIG libconfig::Config cfg; try { cfg.readFile( file ); } catch ( const libconfig::ParseException& pe ) { FatalError( Form( "Failed to parse the configuration card \"%s\".\n\tParser error: %s (at line %d)", file, pe.getError(), pe.getLine() ) ); } try { const libconfig::Setting& root = cfg.getRoot(); const libconfig::Setting& proc = root["process"]; //--- type of process to consider const char* proc_name = proc["name"]; const std::string str_proc_name = proc_name; if ( str_proc_name == "lpair" ) params_.setProcess( new Process::GamGamLL ); else if ( str_proc_name == "pptoll" ) params_.setProcess( new Process::PPtoLL ); else if ( str_proc_name == "pptoww" ) params_.setProcess( new Process::PPtoWW ); else FatalError( Form( "Unrecognised process: %s", proc_name ) ); //--- process mode int int_mode; const char* mode; if ( proc.lookupValue( "mode", int_mode ) ) { params_.kinematics.mode = (Kinematics::ProcessMode)int_mode; } else if ( proc.lookupValue( "mode", mode ) ) { const std::string str_mode = mode; if ( str_mode == "elastic/elastic" ) params_.kinematics.mode = Kinematics::ProcessMode::ElasticElastic; else if ( str_mode == "elastic/inelastic" ) params_.kinematics.mode = Kinematics::ProcessMode::ElasticInelastic; else if ( str_mode == "inelastic/elastic" ) params_.kinematics.mode = Kinematics::ProcessMode::InelasticElastic; else if ( str_mode == "inelastic/inelastic" ) params_.kinematics.mode = Kinematics::ProcessMode::InelasticInelastic; else FatalError( Form( "Unrecognised interaction mode: %s", mode ) ); } //--- process kinematics if ( proc.exists( "in_kinematics" ) ) parseIncomingKinematics( proc["in_kinematics"] ); if ( proc.exists( "out_kinematics" ) ) parseOutgoingKinematics( proc["out_kinematics"] ); //--- generation parameters if ( root.exists( "vegas" ) ) parseVegas( root["vegas"] ); if ( root.exists( "generator" ) ) parseGenerator( root["generator"] ); //--- taming functions if ( proc.exists( "taming_functions" ) ) parseTamingFunctions( proc["taming_functions"] ); } catch ( const libconfig::SettingNotFoundException& nfe ) { FatalError( Form( "Failed to retrieve the field \"%s\".", nfe.getPath() ) ); } catch ( const libconfig::SettingTypeException& te ) { FatalError( Form( "Field \"%s\" has wrong type.", te.getPath() ) ); } #else InWarning( "libconfig++ is not present on this machine" ); #endif } #ifdef LIBCONFIG void ConfigHandler::parseIncomingKinematics( const libconfig::Setting& kin ) { try { if ( kin.exists( "beam1_pz" ) ) params_.kinematics.inp.first = (double)kin["beam1_pz"]; if ( kin.exists( "beam2_pz" ) ) params_.kinematics.inp.second = (double)kin["beam2_pz"]; if ( kin.exists( "structure_functions" ) ) { const char* sf = kin["structure_functions" ]; const std::string sf_str = sf; if ( sf_str == "electron" ) params_.kinematics.structure_functions = Electron; else if ( sf_str == "elastic proton" ) params_.kinematics.structure_functions = ElasticProton; else if ( sf_str == "Suri-Yennie" ) params_.kinematics.structure_functions = SuriYennie; else if ( sf_str == "Suri-Yennie;lowQ2" ) params_.kinematics.structure_functions = SuriYennieLowQ2; else if ( sf_str == "Szczurek-Uleshchenko" ) params_.kinematics.structure_functions = SzczurekUleshchenko; - else if ( sf_str == "Fiore;valence" ) params_.kinematics.structure_functions = FioreVal; - else if ( sf_str == "Fiore;sea" ) params_.kinematics.structure_functions = FioreSea; - else if ( sf_str == "Fiore" ) params_.kinematics.structure_functions = Fiore; + else if ( sf_str == "Fiore" ) params_.kinematics.structure_functions = FioreBrasse; else if ( sf_str == "ALLM" ) params_.kinematics.structure_functions = ALLM97; else if ( sf_str == "ALLM;91" ) params_.kinematics.structure_functions = ALLM91; else if ( sf_str == "ALLM;97" ) params_.kinematics.structure_functions = ALLM97; else if ( sf_str == "ALLM;HHT" ) params_.kinematics.structure_functions = ALLM_HHT; else if ( sf_str == "ALLM;HHT-FT" ) params_.kinematics.structure_functions = ALLM_HHT_FT; + else if ( sf_str == "ALLM;GD07p" ) params_.kinematics.structure_functions = ALLM_GD07p; + else if ( sf_str == "ALLM;GD11p" ) params_.kinematics.structure_functions = ALLM_GD11p; else FatalError( Form( "Invalid structure functions mode: %s", sf ) ); } } catch ( const libconfig::SettingNotFoundException& nfe ) { FatalError( Form( "Failed to retrieve the field \"%s\".", nfe.getPath() ) ); } catch ( const libconfig::SettingTypeException& te ) { FatalError( Form( "Field \"%s\" has wrong type.", te.getPath() ) ); } } void ConfigHandler::parseOutgoingKinematics( const libconfig::Setting& kin ) { try { if ( kin.exists( "pair" ) ) { Particle::ParticleCode pair = (Particle::ParticleCode)(int)kin["pair"]; params_.kinematics.central_system = { pair, pair }; } if ( kin.exists( "min_pt" ) ) params_.kinematics.central_cuts[Cuts::pt_single].min() = (double)kin["min_pt"]; if ( kin.exists( "max_pt" ) ) params_.kinematics.central_cuts[Cuts::pt_single].max() = (double)kin["max_pt"]; if ( kin.exists( "min_ptdiff" ) ) params_.kinematics.central_cuts[Cuts::pt_diff].min() = (double)kin["min_ptdiff"]; if ( kin.exists( "max_ptdiff" ) ) params_.kinematics.central_cuts[Cuts::pt_diff].max() = (double)kin["max_ptdiff"]; if ( kin.exists( "min_dely" ) ) params_.kinematics.central_cuts[Cuts::dely].min() = (double)kin["min_dely"]; if ( kin.exists( "max_dely" ) ) params_.kinematics.central_cuts[Cuts::dely].max() = (double)kin["max_dely"]; if ( kin.exists( "min_energy" ) ) params_.kinematics.central_cuts[Cuts::energy_single].min() = (double)kin["min_energy"]; if ( kin.exists( "max_energy" ) ) params_.kinematics.central_cuts[Cuts::energy_single].max() = (double)kin["max_energy"]; if ( kin.exists( "min_eta" ) ) params_.kinematics.central_cuts[Cuts::eta_single].min() = (double)kin["min_eta"]; if ( kin.exists( "max_eta" ) ) params_.kinematics.central_cuts[Cuts::eta_single].max() = (double)kin["max_eta"]; if ( kin.exists( "min_rapidity" ) ) params_.kinematics.central_cuts[Cuts::rapidity_single].min() = (double)kin["min_rapidity"]; if ( kin.exists( "max_rapidity" ) ) params_.kinematics.central_cuts[Cuts::rapidity_single].max() = (double)kin["max_rapidity"]; if ( kin.exists( "min_mx" ) ) params_.kinematics.remnant_cuts[Cuts::mass].min() = (double)kin["min_mx"]; if ( kin.exists( "max_mx" ) ) params_.kinematics.remnant_cuts[Cuts::mass].max() = (double)kin["max_mx"]; } catch ( const libconfig::SettingNotFoundException& nfe ) { FatalError( Form( "Failed to retrieve the field \"%s\".", nfe.getPath() ) ); } catch ( const libconfig::SettingTypeException& te ) { FatalError( Form( "Field \"%s\" has wrong type.", te.getPath() ) ); } } void ConfigHandler::parseVegas( const libconfig::Setting& veg ) { try { if ( veg.exists( "num_points" ) ) params_.vegas.npoints = (int)veg["num_points"]; if ( veg.exists( "num_integration_calls" ) ) params_.vegas.ncvg = (int)veg["num_integration_calls"]; if ( veg.exists( "num_integration_iterations" ) ) params_.vegas.itvg = (int)veg["num_integration_iterations"]; if ( veg.exists( "seed" ) ) params_.vegas.seed = (unsigned long)veg["seed"]; } catch ( const libconfig::SettingNotFoundException& nfe ) { FatalError( Form( "Failed to retrieve the field \"%s\".", nfe.getPath() ) ); } } void ConfigHandler::parseGenerator( const libconfig::Setting& gen ) { params_.generation.enabled = true; try { if ( gen.exists( "num_events" ) ) params_.generation.maxgen = (int)gen["num_events"]; if ( gen.exists( "print_every" ) ) params_.generation.gen_print_every = (int)gen["print_every"]; } catch ( const libconfig::SettingNotFoundException& nfe ) { FatalError( Form( "Failed to retrieve the field \"%s\".", nfe.getPath() ) ); } } void ConfigHandler::parseTamingFunctions( const libconfig::Setting& tf ) { if ( !tf.isList() ) FatalError( "The taming functions definition must be wrapped within a list!" ); for ( unsigned short i = 0; i < tf.getLength(); ++i ) { params_.taming_functions.add( tf[i]["variable"], tf[i]["expression"] ); } } void ConfigHandler::writeProcess( const Parameters* params, libconfig::Setting& root ) { libconfig::Setting& proc = root.add( "process", libconfig::Setting::TypeGroup ); proc.add( "name", libconfig::Setting::TypeString ) = params->processName(); std::ostringstream os; os << params->kinematics.mode; proc.add( "mode", libconfig::Setting::TypeString ) = os.str(); } void ConfigHandler::writeIncomingKinematics( const Parameters* params, libconfig::Setting& root ) { libconfig::Setting& kin = root.add( "in_kinematics", libconfig::Setting::TypeGroup ); kin.add( "beam1_pz", libconfig::Setting::TypeFloat ) = params->kinematics.inp.first; kin.add( "beam2_pz", libconfig::Setting::TypeFloat ) = params->kinematics.inp.second; std::ostringstream os; os << params->kinematics.structure_functions; kin.add( "structure_function", libconfig::Setting::TypeString ) = os.str(); } void ConfigHandler::writeOutgoingKinematics( const Parameters* params, libconfig::Setting& root ) { libconfig::Setting& kin = root.add( "out_kinematics", libconfig::Setting::TypeGroup ); if ( params->kinematics.central_system.size() > 0 ) kin.add( "pair", libconfig::Setting::TypeInt ) = (int)params->kinematics.central_system[0]; if ( params->kinematics.central_cuts.count( Cuts::pt_single ) ) { kin.add( "min_pt", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::pt_single ).min(); kin.add( "max_pt", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::pt_single ).max(); } if ( params->kinematics.central_cuts.count( Cuts::pt_diff ) ) { kin.add( "min_ptdiff", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::pt_diff ).min(); kin.add( "max_ptdiff", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::pt_diff ).max(); } if ( params->kinematics.central_cuts.count( Cuts::dely ) ) { kin.add( "min_dely", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::dely ).min(); kin.add( "max_dely", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::dely ).max(); } if ( params->kinematics.central_cuts.count( Cuts::energy_single ) ) { kin.add( "min_energy", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::energy_single ).min(); kin.add( "max_energy", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::energy_single ).max(); } if ( params->kinematics.central_cuts.count( Cuts::eta_single ) ) { kin.add( "min_eta", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::eta_single ).min(); kin.add( "max_eta", libconfig::Setting::TypeFloat ) = params->kinematics.central_cuts.at( Cuts::eta_single ).max(); } if ( params->kinematics.remnant_cuts.count( Cuts::mass ) ) { kin.add( "min_mx", libconfig::Setting::TypeFloat ) = params->kinematics.remnant_cuts.at( Cuts::mass ).min(); kin.add( "max_mx", libconfig::Setting::TypeFloat ) = params->kinematics.remnant_cuts.at( Cuts::mass ).max(); } } void ConfigHandler::writeTamingFunctions( const Parameters* params, libconfig::Setting& root ) { libconfig::Setting& tf = root.add( "taming_functions", libconfig::Setting::TypeList ); for ( std::map<std::string,TamingFunction>::const_iterator it = params->taming_functions.begin(); it != params->taming_functions.end(); ++it ) { libconfig::Setting& fun = tf.add( libconfig::Setting::TypeGroup ); fun.add( "variable", libconfig::Setting::TypeString ) = it->first; fun.add( "expression", libconfig::Setting::TypeString ) = it->second.expression; } } void ConfigHandler::writeVegas( const Parameters* params, libconfig::Setting& root ) { libconfig::Setting& veg = root.add( "vegas", libconfig::Setting::TypeGroup ); veg.add( "num_points", libconfig::Setting::TypeInt ) = (int)params->vegas.npoints; veg.add( "num_integration_calls", libconfig::Setting::TypeInt ) = (int)params->vegas.ncvg; veg.add( "num_integration_iterations", libconfig::Setting::TypeInt ) = (int)params->vegas.itvg; veg.add( "seed", libconfig::Setting::TypeInt64 ) = (long)params->vegas.seed; } void ConfigHandler::writeGenerator( const Parameters* params, libconfig::Setting& root ) { if ( !params->generation.enabled ) return; libconfig::Setting& gen = root.add( "generator", libconfig::Setting::TypeGroup ); gen.add( "num_events", libconfig::Setting::TypeInt ) = (int)params->generation.maxgen; gen.add( "print_every", libconfig::Setting::TypeInt ) = (int)params->generation.gen_print_every; } #endif void ConfigHandler::store( const Parameters* params, const char* file ) { #ifdef LIBCONFIG libconfig::Config cfg; libconfig::Setting& root = cfg.getRoot(); writeProcess( params, root ); writeIncomingKinematics( params, root["process"] ); writeOutgoingKinematics( params, root["process"] ); writeTamingFunctions( params, root["process"] ); writeVegas( params, root ); writeGenerator( params, root ); cfg.writeFile( file ); #endif } } } #endif diff --git a/CepGen/Physics/FormFactors.cpp b/CepGen/Physics/FormFactors.cpp index e27b879..905adb0 100644 --- a/CepGen/Physics/FormFactors.cpp +++ b/CepGen/Physics/FormFactors.cpp @@ -1,74 +1,72 @@ #include "FormFactors.h" namespace CepGen { FormFactors FormFactors::Trivial() { return FormFactors( 1.0, 1.0 ); } FormFactors FormFactors::ProtonElastic( double q2 ) { const double mp = Particle::massFromPDGId( Particle::Proton ), mp2 = mp*mp; const double GE = pow( 1.+q2/0.71, -2. ), GE2 = GE*GE; const double GM = 2.79*GE, GM2 = GM*GM; return FormFactors( ( 4.*mp2*GE2 + q2*GM2 ) / ( 4.*mp2 + q2 ), GM2 ); } FormFactors FormFactors::ProtonInelastic( const StructureFunctionsType& sf, double q2, double mi2, double mf2 ) { switch ( sf ) { case StructureFunctionsType::ElasticProton: InWarning( "Elastic proton form factors requested! Check your process definition!" ); return FormFactors::ProtonElastic( q2 ); case StructureFunctionsType::SuriYennie: return FormFactors::SuriYennie( q2, mi2, mf2 ); case StructureFunctionsType::SzczurekUleshchenko: return FormFactors::SzczurekUleshchenko( q2, mi2, mf2 ); - case StructureFunctionsType::Fiore: - case StructureFunctionsType::FioreSea: - case StructureFunctionsType::FioreVal: + case StructureFunctionsType::FioreBrasse: return FormFactors::FioreBrasse( q2, mi2, mf2 ); default: throw Exception( __PRETTY_FUNCTION__, "Invalid structure functions required!", FatalError ); } } FormFactors FormFactors::SuriYennie( double q2, double mi2, double mf2 ) { const double x = q2 / ( q2 + mf2 - mi2 ); SF::SuriYennie suriyennie; const StructureFunctions sy = suriyennie( q2, x ); //std::cout << "---> " << sy.FM << "\t" << sy.F2*x/q2 << "\t" << sy.F2*x*sqrt(mi2)/q2 << std::endl; return FormFactors( sy.F2 * x * sqrt( mi2 ) / q2, sy.FM ); //FIXME } FormFactors FormFactors::FioreBrasse( double q2, double mi2, double mf2 ) { const double x = q2 / ( q2 + mf2 - mi2 ); SF::FioreBrasse fb; StructureFunctions sf = fb( q2, x ); return FormFactors( sf.F2 * x / q2, -2.*sf.F1 / q2 ); } FormFactors FormFactors::SzczurekUleshchenko( double q2, double mi2, double mf2 ) { const double x = q2 / ( q2 + mf2 - mi2 ); SF::SzczurekUleshchenko su; StructureFunctions sf = su( q2, x ); return FormFactors( sf.F2 * x / q2, -2.*sf.F1 / q2 ); } std::ostream& operator<<( std::ostream& os, const FormFactors& ff ) { os << Form( "Form factors: electric: Fe = %.3e ; magnetic: Fm = %.3e", ff.FE, ff.FM ).c_str(); return os; } } diff --git a/CepGen/Processes/GenericKTProcess.cpp b/CepGen/Processes/GenericKTProcess.cpp index dabab26..1bee34b 100644 --- a/CepGen/Processes/GenericKTProcess.cpp +++ b/CepGen/Processes/GenericKTProcess.cpp @@ -1,279 +1,285 @@ #include "GenericKTProcess.h" namespace CepGen { namespace Process { GenericKTProcess::GenericKTProcess( const std::string& name, const std::string& description, const unsigned int& num_user_dimensions, const std::array<Particle::ParticleCode,2>& partons, const std::vector<Particle::ParticleCode>& central ) : GenericProcess( name, description+" (kT-factorisation approach)" ), kNumUserDimensions( num_user_dimensions ), kIntermediateParts( partons ), kProducedParts( central ) {} GenericKTProcess::~GenericKTProcess() {} void GenericKTProcess::addEventContent() { GenericProcess::setEventContent( { // incoming state { Particle::IncomingBeam1, Particle::Proton }, { Particle::IncomingBeam2, Particle::Proton }, { Particle::Parton1, kIntermediateParts[0] }, { Particle::Parton2, kIntermediateParts[1] } }, { // outgoing state { Particle::OutgoingBeam1, { Particle::Proton } }, { Particle::OutgoingBeam2, { Particle::Proton } }, { Particle::CentralSystem, kProducedParts } } ); setExtraContent(); } unsigned int GenericKTProcess::numDimensions( const Kinematics::ProcessMode& process_mode ) const { switch ( process_mode ) { default: case Kinematics::ElasticElastic: return kNumRequiredDimensions+kNumUserDimensions; case Kinematics::ElasticInelastic: case Kinematics::InelasticElastic: return kNumRequiredDimensions+kNumUserDimensions+1; case Kinematics::InelasticInelastic: return kNumRequiredDimensions+kNumUserDimensions+2; } } void GenericKTProcess::addPartonContent() { // Incoming partons qt1_ = exp( log_qmin_+( log_qmax_-log_qmin_ )*x( 0 ) ); qt2_ = exp( log_qmin_+( log_qmax_-log_qmin_ )*x( 1 ) ); phi_qt1_ = 2.*M_PI*x( 2 ); phi_qt2_ = 2.*M_PI*x( 3 ); DebuggingInsideLoop( Form( "photons transverse virtualities (qt):\n\t" " mag = %f / %f (%.2f < log(qt) < %.2f)\n\t" " phi = %f / %f", qt1_, qt2_, log_qmin_, log_qmax_, phi_qt1_, phi_qt2_ ) ); } void GenericKTProcess::setKinematics( const Kinematics& kin ) { cuts_ = kin; log_qmin_ = -10.; // FIXME //log_qmin_ = std::log( std::sqrt( cuts_.q2min ) ); log_qmax_ = log( cuts_.initial_cuts[Cuts::qt].max() ); } double GenericKTProcess::computeWeight() { addPartonContent(); prepareKTKinematics(); computeOutgoingPrimaryParticlesMasses(); const double jac = computeJacobian(), integrand = computeKTFactorisedMatrixElement(), weight = jac*integrand; DebuggingInsideLoop( Form( "Jacobian = %f\n\tIntegrand = %f\n\tdW = %f", jac, integrand, weight ) ); return weight; } void GenericKTProcess::computeOutgoingPrimaryParticlesMasses() { const unsigned int op_index = kNumRequiredDimensions+kNumUserDimensions; const Kinematics::Limits remn_mx_cuts = cuts_.remnant_cuts[Cuts::mass]; switch ( cuts_.mode ) { case Kinematics::ElectronProton: default: { InError( "This kT factorisation process is intended for p-on-p collisions! Aborting!" ); exit( 0 ); } break; case Kinematics::ElasticElastic: { MX_ = event_->getOneByRole( Particle::IncomingBeam1 ).mass(); MY_ = event_->getOneByRole( Particle::IncomingBeam2 ).mass(); } break; case Kinematics::ElasticInelastic: { const double mx_min = remn_mx_cuts.min(), mx_range = remn_mx_cuts.range(); MX_ = event_->getOneByRole( Particle::IncomingBeam1 ).mass(); MY_ = mx_min + mx_range*x( op_index ); } break; case Kinematics::InelasticElastic: { const double mx_min = remn_mx_cuts.min(), mx_range = remn_mx_cuts.range(); MX_ = mx_min + mx_range*x( op_index ); MY_ = event_->getOneByRole( Particle::IncomingBeam2 ).mass(); } break; case Kinematics::InelasticInelastic: { const double mx_min = remn_mx_cuts.min(), mx_range = remn_mx_cuts.range(); MX_ = mx_min + mx_range*x( op_index ); MY_ = mx_min + mx_range*x( op_index+1 ); } break; } DebuggingInsideLoop( Form( "outgoing remnants invariant mass: %f / %f (%.2f < M(X/Y) < %.2f)", MX_, MY_, remn_mx_cuts.min(), remn_mx_cuts.max() ) ); } void GenericKTProcess::computeIncomingFluxes( double x1, double q1t2, double x2, double q2t2 ) { flux1_ = flux2_ = 0.; switch ( cuts_.mode ) { case Kinematics::ElasticElastic: flux1_ = elasticFlux( x1, q1t2 ); flux2_ = elasticFlux( x2, q2t2 ); break; case Kinematics::ElasticInelastic: flux1_ = elasticFlux( x1, q1t2 ); flux2_ = inelasticFlux( x2, q2t2, MY_ ); break; case Kinematics::InelasticElastic: flux1_ = inelasticFlux( x1, q1t2, MX_ ); flux2_ = elasticFlux( x2, q2t2 ); break; case Kinematics::InelasticInelastic: flux1_ = inelasticFlux( x1, q1t2, MX_ ); flux2_ = inelasticFlux( x2, q2t2, MY_ ); break; default: return; } flux1_ = std::max( flux1_, 1.e-20 ); flux2_ = std::max( flux2_, 1.e-20 ); DebuggingInsideLoop( Form( "Form factors: %e / %e", flux1_, flux2_ ) ); } void GenericKTProcess::fillKinematics( bool ) { fillPrimaryParticlesKinematics(); fillCentralParticlesKinematics(); } void GenericKTProcess::fillPrimaryParticlesKinematics() { //================================================================= // outgoing protons //================================================================= Particle& op1 = event_->getOneByRole( Particle::OutgoingBeam1 ), &op2 = event_->getOneByRole( Particle::OutgoingBeam2 ); op1.setMomentum( PX_ ); op2.setMomentum( PY_ ); switch ( cuts_.mode ) { case Kinematics::ElasticElastic: op1.setStatus( Particle::FinalState ); op2.setStatus( Particle::FinalState ); break; case Kinematics::ElasticInelastic: op1.setStatus( Particle::FinalState ); op2.setStatus( Particle::Undecayed ); op2.setMass( MY_ ); break; case Kinematics::InelasticElastic: op1.setStatus( Particle::Undecayed ); op1.setMass( MX_ ); op2.setStatus( Particle::FinalState ); break; case Kinematics::InelasticInelastic: op1.setStatus( Particle::Undecayed ); op1.setMass( MX_ ); op2.setStatus( Particle::Undecayed ); op2.setMass( MY_ ); break; default: { FatalError( "This kT factorisation process is intended for p-on-p collisions! Aborting!" ); } break; } //================================================================= // incoming partons (photons, pomerons, ...) //================================================================= //FIXME ensure the validity of this approach Particle& g1 = event_->getOneByRole( Particle::Parton1 ), &g2 = event_->getOneByRole( Particle::Parton2 ); g1.setMomentum( event_->getOneByRole( Particle::IncomingBeam1 ).momentum()-PX_, true ); g1.setStatus( Particle::Incoming ); g2.setMomentum( event_->getOneByRole( Particle::IncomingBeam2 ).momentum()-PY_, true ); g2.setStatus( Particle::Incoming ); } double GenericKTProcess::minimalJacobian() const { double jac = 1.; jac *= ( log_qmax_-log_qmin_ )*qt1_; // d(q1t) . q1t jac *= ( log_qmax_-log_qmin_ )*qt2_; // d(q2t) . q2t jac *= 2.*M_PI; // d(phi1) jac *= 2.*M_PI; // d(phi2) const double mx_range = cuts_.remnant_cuts.at( Cuts::mass ).range(); switch ( cuts_.mode ) { case Kinematics::ElasticElastic: default: break; case Kinematics::ElasticInelastic: jac *= 2.* mx_range * MY_; break; case Kinematics::InelasticElastic: jac *= 2.* mx_range * MX_; break; case Kinematics::InelasticInelastic: jac *= 2.* mx_range * MX_; jac *= 2.* mx_range * MY_; break; } // d(mx/y**2) return jac; } double GenericKTProcess::elasticFlux( double x, double kt2 ) { const double mp = Particle::massFromPDGId( Particle::Proton ), mp2 = mp*mp; const double Q2_min = x*x*mp2/( 1.-x ), Q2_ela = Q2_min + kt2/( 1.-x ); const FormFactors ela = FormFactors::ProtonElastic( Q2_ela ); const double ela1 = ( 1.-x )*( 1.-Q2_min/Q2_ela ); const double ela2 = ela.FE; //const double ela3 = 1.-( Q2_ela-kt2 )/Q2_ela; const double f_ela = Constants::alphaEM/M_PI/kt2*( ela1*ela2 + 0.5*x*x*ela.FM ); return f_ela * ( 1.-x ) * kt2 / Q2_ela; } double GenericKTProcess::inelasticFlux( double x, double kt2, double mx ) { const double mx2 = mx*mx, mp = Particle::massFromPDGId( Particle::Proton ), mp2 = mp*mp; // F2 structure function const double Q2min = 1. / ( 1.-x )*( x*( mx2-mp2 ) + x*x*mp2 ), Q2 = Q2min + kt2 / ( 1.-x ); float xbj = Q2 / ( Q2 + mx2 - mp2 ); StructureFunctions sf; switch ( cuts_.structure_functions ) { case StructureFunctionsType::SzczurekUleshchenko: { SF::SzczurekUleshchenko su; sf = su( Q2, xbj ); } break; case StructureFunctionsType::SuriYennie: { SF::SuriYennie sy; sf = sy( Q2, xbj ); } break; - case StructureFunctionsType::Fiore: { + case StructureFunctionsType::FioreBrasse: { SF::FioreBrasse fb; sf = fb( Q2, xbj ); } break; case StructureFunctionsType::ALLM91: { SF::ALLM allm91( SF::ALLM::Parameterisation::allm91() ); sf = allm91( Q2, xbj ); } break; case StructureFunctionsType::ALLM97: { SF::ALLM allm97( SF::ALLM::Parameterisation::allm97() ); sf = allm97( Q2, xbj ); } break; + case StructureFunctionsType::ALLM_GD07p: { + SF::ALLM gd07p( SF::ALLM::Parameterisation::gd07p() ); + sf = gd07p( Q2, xbj ); } break; + case StructureFunctionsType::ALLM_GD11p: { + SF::ALLM gd11p( SF::ALLM::Parameterisation::gd11p() ); + sf = gd11p( Q2, xbj ); } break; default: break; //FIXME } // Longitudinal/transverse virtual photon cross section R // from Sibirtsev and Blunden (Phys Rev C 88,065202 (2013)) const double R = 0.014 * Q2 * ( exp( -0.07*Q2 ) + 41.*exp( -0.8*Q2 ) ); const double F1 = sf.F2 * ( 1.+4*xbj*xbj*mp2/Q2 )/( 1.+R )/( 2.*xbj ); const double ine1 = ( 1.-x )*( 1.-Q2min / Q2 ); const double f_D = sf.F2/( Q2 + mx2 - mp2 ) * ine1, f_C= 2.*F1/Q2; const double f_ine = Constants::alphaEM/M_PI/kt2*( f_D + 0.5*x*x*f_C ); return f_ine * ( 1.-x ) * kt2 / Q2; } } } diff --git a/CepGen/StructureFunctions/StructureFunctions.cpp b/CepGen/StructureFunctions/StructureFunctions.cpp index 3bc4182..b3d2c0e 100644 --- a/CepGen/StructureFunctions/StructureFunctions.cpp +++ b/CepGen/StructureFunctions/StructureFunctions.cpp @@ -1,30 +1,28 @@ #include "StructureFunctions.h" namespace CepGen { std::ostream& operator<<( std::ostream& os, const StructureFunctionsType& sf ) { switch ( sf ) { case Electron: return os << "electron"; case ElasticProton: return os << "elastic proton"; case SuriYennie: return os << "Suri-Yennie"; case SuriYennieLowQ2: return os << "Suri-Yennie;lowQ2"; case SzczurekUleshchenko: return os << "Szczurek-Uleshchenko"; - case FioreVal: return os << "Fiore;valence"; - case FioreSea: return os << "Fiore;sea"; - case Fiore: return os << "Fiore"; + case FioreBrasse: return os << "Fiore-Brasse"; case ALLM91: return os << "ALLM;91"; case ALLM97: return os << "ALLM;97"; case ALLM_HHT: return os << "ALLM;HHT"; case ALLM_HHT_FT: return os << "ALLM;HHT-FT"; default: return os; } } std::ostream& operator<<( std::ostream& os, const StructureFunctions& sf ) { return os << "F2 = " << sf.F2 << ", FL = " << sf.FL; } } diff --git a/CepGen/StructureFunctions/StructureFunctions.h b/CepGen/StructureFunctions/StructureFunctions.h index c8de7f8..32d082c 100644 --- a/CepGen/StructureFunctions/StructureFunctions.h +++ b/CepGen/StructureFunctions/StructureFunctions.h @@ -1,40 +1,38 @@ #ifndef CepGen_StructureFunctions_StructureFunctions_h #define CepGen_StructureFunctions_StructureFunctions_h #include "CepGen/Event/Particle.h" #include <ostream> #include <vector> #include <cmath> namespace CepGen { /// Proton structure function to be used in the outgoing state description /// \note Values correspond to the LPAIR legacy steering card values enum StructureFunctionsType { Electron = 1, ElasticProton = 2, SuriYennie = 11, SuriYennieLowQ2 = 12, SzczurekUleshchenko = 15, - FioreVal = 101, - FioreSea = 102, - Fiore = 103, - ALLM91, ALLM97, ALLM_HHT, ALLM_HHT_FT + FioreBrasse = 101, + ALLM91, ALLM97, ALLM_HHT, ALLM_HHT_FT, ALLM_GD07p, ALLM_GD11p }; /// Human-readable format of a structure function type std::ostream& operator<<( std::ostream& os, const StructureFunctionsType& sf ); class StructureFunctions { public: StructureFunctions( double f2=0.0 ) : F2( f2 ), FL( 0.0 ), FM( 0.0 ) {} double F2; double F1; double FL, FM; }; /// Human-readable format of a structure function object std::ostream& operator<<( std::ostream& os, const StructureFunctions& sf ); } #endif diff --git a/CepGen/StructureFunctions/SuriYennie.cpp b/CepGen/StructureFunctions/SuriYennie.cpp index 8b4318a..f2c18e1 100644 --- a/CepGen/StructureFunctions/SuriYennie.cpp +++ b/CepGen/StructureFunctions/SuriYennie.cpp @@ -1,51 +1,51 @@ #include "SuriYennie.h" namespace CepGen { namespace SF { SuriYennie::Parameterisation SuriYennie::Parameterisation::standard() { Parameterisation p; p.C1 = 0.86926; p.C2 = 2.23422; p.D1 = 0.12549; p.rho2 = 0.585; p.Cp = 0.96; p.Bp = 0.63; return p; } SuriYennie::Parameterisation SuriYennie::Parameterisation::alternative() { Parameterisation p; p.C1 = 0.6303; p.C2 = 2.3049; p.D1 = 0.04681; p.rho2 = 1.05; p.Cp = 1.23; p.Bp = 0.61; return p; } StructureFunctions SuriYennie::operator()( double q2, double xbj ) const { const double mp = Particle::massFromPDGId( Particle::Proton ), mp2 = mp*mp; const double mx2 = q2 * ( 1.-xbj )/xbj + mp2, // [GeV^2] nu = 0.5 * ( q2 + mx2 - mp2 ) / mp; // [GeV] const double dm2 = mx2-mp2, Xpr = q2/( q2+mx2 ), En = dm2+q2, Tau = 0.25 * q2/mp2, MQ = params_.rho2+q2; StructureFunctions sy; sy.FM = ( params_.C1*dm2*pow( params_.rho2/MQ, 2 ) + ( params_.C2*mp2*pow( 1.-Xpr, 4 ) ) / ( 1.+Xpr*( Xpr*params_.Cp-2.*params_.Bp ) ) )/q2; const double FE = ( Tau*sy.FM + params_.D1*dm2*q2*params_.rho2/mp2*pow( dm2/MQ/En, 2 ) ) / ( 1.+0.25*En*En/mp2/q2 ); - const double w2 = 2.*mp*FE, w1 = 0.5 * sy.FM*q2/mp; + const double w2 = 2.*mp*FE/*, w1 = 0.5 * sy.FM*q2/mp*/; sy.F2 = nu/mp*w2; return sy; } } }