17 #ifndef Pythia8_HISubCollisionModel_H 18 #define Pythia8_HISubCollisionModel_H 20 #include "Pythia8/Pythia.h" 21 #include "Pythia8/HINucleusModel.h" 50 double bIn,
double bpIn,
double olappIn,
CollisionType typeIn)
65 ( abs(
proj->
id()) == 2112? 2: 0 );}
105 : subCollisionsSave(subCollisionsIn), TSave({TIn, TIn, TIn, TIn}) {}
110 double T12In,
double T21In,
double T22In)
111 : subCollisionsSave(subCollisionsIn), TSave({TIn, T12In, T21In, T22In}) {}
114 bool empty()
const {
return subCollisionsSave.empty(); }
118 double T(
unsigned i = 0)
const {
return TSave[i]; }
121 multiset<SubCollision>::const_iterator
begin()
const {
122 return subCollisionsSave.begin(); }
123 multiset<SubCollision>::const_iterator end()
const {
124 return subCollisionsSave.end(); }
129 multiset<SubCollision> subCollisionsSave;
133 vector<double> TSave = {};
160 double avNDb, davNDb2, avNOF, davNOF2;
163 SigEst(): sig(8, 0.0), dsig2(8, 0.0), fsig(8, false),
164 avNDb(0.0), davNDb2(0.0), avNOF(0.0), davNOF2(0.0) {}
171 : sigTarg(11, 0.0), sigErr(8, 0.05), sigTargNN(4, vector<double>(11, 0.0)),
172 parmSave(nParm), NInt(100000), NPop(20), sigFuzz(0.2), impactFudge(1),
173 fitPrint(true), eCMlow(20.0), avNDb(1.0), avNDolap(1.0),
174 projPtr(), targPtr(), sigTotPtr(), sigCmbPtr(), settingsPtr(),
175 infoPtr(), rndmPtr(), loggerPtr(), particleDataPtr(),
176 idASave(0), idBSave(0), doVarECM(false), doVarBeams(false),
177 eMin(0.0), eMax(0.0), eSave(0.0), eCMPts(5), idAList(),
178 subCollParmsPtr(), subCollParmsMap(), elasticMode(1),
185 static shared_ptr<SubCollisionModel> create(
int model);
188 virtual bool init(
int idAIn,
int idBIn,
double eCMIn);
196 sigTotPtr = &sigTotIn;
197 settingsPtr = &settingsIn;
206 lowEnergyCache.sigCmbPtr = sigCmbPtr = sigmaCombPtrIn;
210 bool hasXSec()
const {
212 return ( sigTargNN[0][0] + sigTargNN[1][0] +
213 sigTargNN[2][0] + sigTargNN[3][0] > 0.0 );
214 for (
int i = 0; i< 4; ++i )
215 for (
int j = 1; j < 11; ++j ) {
216 if ( j == 6 || j == 7 )
continue;
217 if ( sigTargNN[i][j] > 0.0 )
return true;
226 double sigTot()
const {
return sigTarg[0]; }
229 double sigEl()
const {
return sigTarg[6]; }
232 double sigCDE()
const {
return sigTarg[5]; }
235 double sigSDE()
const {
return sigSDEP() + sigSDET(); }
238 double sigSDEP()
const {
return sigTarg[3] - sigTarg[1] - sigTarg[2]; }
241 double sigSDET()
const {
return sigTarg[4] - sigTarg[1] - sigTarg[2]; }
244 double sigDDE()
const {
return sigTarg[2]; }
247 double sigND()
const {
return sigTarg[1]; }
250 double sigLow()
const {
return sigLExc() + sigLAnn() + sigLRes(); }
259 double sigLRes()
const {
return sigTarg[10]; }
262 double bSlope()
const {
return sigTarg[7]; }
265 double avNDB()
const {
return avNDb; }
268 void updateSig(
int idAIn,
int idBIn,
double eCMIn);
271 double Chi2(
const SigEst & sigs,
int npar)
const;
274 bool setKinematics(
double eCMIn);
277 bool setIDA(
int idA);
280 bool evolve(
int nGenerations,
double eCM,
int idANow);
283 int nParms()
const {
return parmSave.size(); }
287 for (
size_t i = 0; i < parmSave.size(); ++i)
288 parmSave[i] = parmIn[i];
292 vector<double>
getParm()
const {
return parmSave; }
295 virtual vector<double> minParm()
const = 0;
298 virtual vector<double> defParm()
const = 0;
301 virtual vector<double> maxParm()
const = 0;
312 virtual SigEst getSig()
const = 0;
320 bool saveParms(
string fileName)
const;
321 bool loadParms(
string fileName);
328 vector< vector<double> > sigTargNN;
359 bool doVarECM, doVarBeams;
360 double eMin, eMax, eSave;
384 map<pair<int,int>, map<int, vector< vector<double> > > > cache;
388 double eCMStep = 0.1;
390 void set(vector< vector<double> > & sigNN,
391 int idAIn,
int idBIn,
double eCM) {
392 auto & beamCache = cache[{idAIn, idBIn}];
393 int iECMl = int(eCM/eCMStep);
394 int iECMh = iECMl + 1;
395 auto itl = beamCache.find(iECMl);
396 if ( itl == beamCache.end() ) {
397 fillCache(sigNN, idAIn, idBIn, iECMl);
398 itl = beamCache.find(iECMl);
400 auto ith = beamCache.find(iECMh);
401 if ( ith == beamCache.end() ) {
402 fillCache(sigNN, idAIn, idBIn, iECMh);
403 ith = beamCache.find(iECMh);
405 auto & sigl = itl->second;
406 auto & sigh = ith->second;
407 double fl = (eCM - iECMl*eCMStep)/eCMStep;
408 double fh = 1.0 - fl;
409 for (
size_t i = 0; i < sigl.size(); ++i )
410 for (
size_t j = 0; j < sigl[i].size(); ++j )
412 ( sigl[i][j] > 0.0? fl*sigl[i][j] + fh*sigh[i][j]: 0.0 );
416 int idAIn,
int idBIn,
int iECM) {
417 double eCMIn = iECM*eCMStep;
419 for (
int i = 0; i < 4; ++i ) {
423 if ( abs(idA) != 2212 )
continue;
424 idA = ( idA > 0? 2112: -2112 );
427 if ( abs(idB) != 2212 )
continue;
428 idB = ( idB > 0? 2112: -2112 );
430 double mA = particleDataPtr->m0(idA);
431 double mB = particleDataPtr->m0(idB);
434 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 0)*MB2FMSQ;
437 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 1)*MB2FMSQ;
440 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 5)*MB2FMSQ;
443 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 4)*MB2FMSQ +
444 sigNN[i][1] + sigNN[i][2];
447 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 3)*MB2FMSQ +
448 sigNN[i][1] + sigNN[i][2];
451 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 6)*MB2FMSQ;
454 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 2)*MB2FMSQ;
459 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 7)*MB2FMSQ;
462 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 8)*MB2FMSQ;
465 sigCmbPtr->
sigmaPartial(idA, idB, eCMIn, mA, mB, 9)*MB2FMSQ;
467 if ( idA == 130 ) sigNN[i][10] = 0;
469 cache[{idAIn, idBIn}][iECM] = sigNN;
495 vector<double>
minParm()
const override {
return vector<double>(); }
496 vector<double>
defParm()
const override {
return vector<double>(); }
497 vector<double>
maxParm()
const override {
return vector<double>(); }
531 vector<double>
minParm()
const override {
return vector<double>(); }
532 vector<double>
defParm()
const override {
return vector<double>(); }
533 vector<double>
maxParm()
const override {
return vector<double>(); }
540 s.
sig[3] = sigSDEP();
541 s.
sig[4] = sigSDET();
567 sigd(parmSave[nParmIn]), alpha(parmSave[nParmIn + 1]) {}
574 virtual bool init(
int idAIn,
int idBIn,
double eCMIn)
override;
585 vector<double> getCollTypeProbs(
const vector<double> & T)
const;
588 virtual SigEst getSig()
const override;
593 virtual double pickRadiusProj()
const = 0;
594 virtual double pickRadiusTarg()
const = 0;
608 double opacity(
double sig)
const {
611 return pow(-expm1(-sig), alpha);
612 return sig > numeric_limits<double>::epsilon() ?
613 pow(-expm1(-1.0/sig), alpha) : 1.0;
617 double log1mT0(
double sig)
const {
618 double T0 = opacity(sig);
619 if ( 1.0 - T0 > 1.0e6*numeric_limits<double>::epsilon() )
620 return -log(1.0 - T0);
621 if ( opacityMode == 1 )
622 return sig/sigd -log(alpha);
624 return sigd/sig -log(alpha);
628 double getOverlap(
double b,
double rt,
double rp)
const {
629 double sig = M_PI*
pow2(rp+rt);
630 double T0 = opacity(sig);
634 return (b>(rt+rp))? 0.0: 2.0*log1mT0(sig)/(2.0*T0 -
pow2(T0));
641 double sig = M_PI*
pow2(p[0] + t[0]);
642 double grey = opacity(sig);
643 return sig/grey > b*b*2.0*M_PI? grey: 0.0;
665 vector<double>
minParm()
const override {
return { 0.01, 1.0, 0.0 }; }
666 vector<double>
defParm()
const override {
return { 2.15, 17.24, 0.33 }; }
668 return { (opacityMode == 0? 60.00: 10.0), 60.0,
669 (opacityMode == 0? 20.0: 2.0) }; }
674 double r = rndmPtr->gamma(k0, r0());
675 return (r < numeric_limits<double>::epsilon() ?
676 numeric_limits<double>::epsilon() : r);
678 double pickRadiusTarg()
const override {
679 double r = rndmPtr->gamma(k0, r0());
680 return (r < numeric_limits<double>::epsilon() ?
681 numeric_limits<double>::epsilon() : r);
692 return sqrt(sigTot() / (M_PI * (2.0 * k0 + 4.0 * k0 * k0)));
721 virtual Vec4 generate(
double & weight)
const;
727 return forceUnitWeight? M_PI*
pow2(width()*cut): 2.0*M_PI *
pow2(width());
731 void width(
double widthIn) { widthSave = widthIn; }
734 double width()
const {
return widthSave; }
742 double widthSave = 0.0;
749 bool forceUnitWeight =
false;
778 kProj(parmSave[0]), kTarg(parmSave[1]),
779 rProj(parmSave[2]), rTarg(parmSave[3]) {}
788 return { 0.01, 0.01, 0.10, 0.10, 1.00, 0.00 }; }
790 return { 1.00, 1.00, 0.54, 0.54, 17.24, 0.33 }; }
792 return { 2.00, 2.00, 4.00, 4.00, 20.00, 2.00 }; }
797 double pickRadiusTarg()
const override {
return pickRadius(kTarg, rTarg); }
809 double pickRadius(
double k0,
double r0)
const {
810 double logSig = log(M_PI *
pow2(r0)) + k0 * rndmPtr->gauss();
811 return sqrt(exp(logSig) / M_PI);
vector< LogInterpolator > * subCollParmsPtr
Definition: HISubCollisionModel.h:368
vector< int > idAList
The list of particles that have been fitted.
Definition: HISubCollisionModel.h:364
constexpr double pow2(const double &x)
Powers of small integers - for balance speed/code clarity.
Definition: PythiaStdlib.h:175
int elasticMode
Definition: HISubCollisionModel.h:375
CollisionType type
The type of collision.
Definition: HISubCollisionModel.h:85
bool failed
Whether the subcollision failed, i.e. has a failed excitation.
Definition: HISubCollisionModel.h:88
vector< double > defParm() const override
Get the default parameter values for this model.
Definition: HISubCollisionModel.h:496
vector< double > sigTarg
Definition: HISubCollisionModel.h:327
Definition: HISubCollisionModel.h:653
double sigmaPartial(int id1, int id2, double eCM12, double m1, double m2, int type, int mixLoHi=0)
Get partial cross sections.
Definition: SigmaLowEnergy.cc:1563
vector< double > maxParm() const override
Get the maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:667
int nParms() const
Get the number of free parameters for the model.
Definition: HISubCollisionModel.h:283
vector< double > defParm() const override
Get the default parameter values for this model.
Definition: HISubCollisionModel.h:789
double T(unsigned i=0) const
Definition: HISubCollisionModel.h:118
FluctuatingSubCollisionModel(int nParmIn, int modein)
The default constructor simply lists the nucleon-nucleon cross sections.
Definition: HISubCollisionModel.h:565
virtual ~FluctuatingSubCollisionModel() override
Virtual destructor.
Definition: HISubCollisionModel.h:571
Helper class to cache cross sections at low energy.
Definition: HISubCollisionModel.h:382
double sigSDE() const
The target single diffractive excitation cross section (both sides).
Definition: HISubCollisionModel.h:235
SigEst()
Constructor for zeros.
Definition: HISubCollisionModel.h:163
double sigLRes() const
The Low-energy resonant cross section (code 159).
Definition: HISubCollisionModel.h:259
Nucleon * targ
The target nucleon.
Definition: HISubCollisionModel.h:71
Definition: HINucleusModel.h:152
Logger * loggerPtr
Pointer to the logger.
Definition: Info.h:86
Definition: SigmaLowEnergy.h:135
double sigLAnn() const
The Low-energy annihilation cross section (code 158).
Definition: HISubCollisionModel.h:256
Definition: HISubCollisionModel.h:520
double avNDb
Definition: HISubCollisionModel.h:343
virtual ~BlackSubCollisionModel() override
Virtual destructor.
Definition: HISubCollisionModel.h:492
vector< double > getParm() const
Get the current parameters of this model.
Definition: HISubCollisionModel.h:292
double bSlope() const
The target elastic b-slope parameter.
Definition: HISubCollisionModel.h:262
SubCollision(Nucleon &projIn, Nucleon &targIn, double bIn, double bpIn, double olappIn, CollisionType typeIn)
Constructor with configuration.
Definition: HISubCollisionModel.h:49
Definition: SigmaTotal.h:141
void initPtr(NucleusModel &projIn, NucleusModel &targIn, SigmaTotal &sigTotIn, Settings &settingsIn, Info &infoIn, Rndm &rndmIn)
Initialize the pointers.
Definition: HISubCollisionModel.h:191
vector< double > maxParm() const override
Get the maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:497
void width(double widthIn)
Set the width (in femtometers).
Definition: HISubCollisionModel.h:731
Both excited but with central diffraction.
Definition: HISubCollisionModel.h:42
LogNormalSubCollisionModel(int modeIn=0)
The default constructor simply lists the nucleon-nucleon cross sections.
Definition: HISubCollisionModel.h:776
int NInt
Definition: HISubCollisionModel.h:335
double bp
Definition: HISubCollisionModel.h:78
vector< double > State
The state of a nucleon is a general vector of doubles.
Definition: HINucleusModel.h:41
map< int, vector< LogInterpolator > > subCollParmsMap
Mapping id -> interpolator, one entry for each particle.
Definition: HISubCollisionModel.h:371
SubCollisionSet(multiset< SubCollision > subCollisionsIn, double TIn)
Constructor with subcollisions.
Definition: HISubCollisionModel.h:104
double sigND() const
The target non-diffractive (absorptive) cross section.
Definition: HISubCollisionModel.h:247
BlackSubCollisionModel()
The default constructor simply lists the nucleon-nucleon cross sections.
Definition: HISubCollisionModel.h:489
virtual SigEst getSig() const override
Get cross sections used by this model.
Definition: HISubCollisionModel.h:500
vector< double > parmSave
Saved parameters.
Definition: HISubCollisionModel.h:331
vector< double > maxParm() const override
Get the maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:791
double avNDb
Definition: HISubCollisionModel.h:160
double sigCDE() const
The target central diffractive excitation cross section.
Definition: HISubCollisionModel.h:232
Definition: HINucleusModel.h:28
Definition: HINucleusModel.h:198
virtual double xSecScale() const
Definition: HISubCollisionModel.h:726
Definition: HISubCollisionModel.h:704
double elasticFudge
Definition: HISubCollisionModel.h:379
(Low energy) excitation of target and projectile.
Definition: HISubCollisionModel.h:44
multiset< SubCollision >::const_iterator begin() const
Iterators over the subcollisions.
Definition: HISubCollisionModel.h:121
double avNDB() const
Return the average non-diffractive impact parameter.
Definition: HISubCollisionModel.h:265
The SubCollisionSet gives a set of subcollisions between two nuclei.
Definition: HISubCollisionModel.h:96
This is an absorptive (non-diffractive) collision.
Definition: HISubCollisionModel.h:43
ParticleData * particleDataPtr
Pointer to the particle data table.
Definition: PhysicsBase.h:88
void initLowEnergy(SigmaCombined *sigmaCombPtrIn)
Initialize low energy treatment.
Definition: HISubCollisionModel.h:205
The target is diffractively excited.
Definition: HISubCollisionModel.h:40
vector< bool > fsig
Which cross sections were actually fitted.
Definition: HISubCollisionModel.h:156
double width() const
Get the width.
Definition: HISubCollisionModel.h:734
vector< double > defParm() const override
Get the default parameter values for this model.
Definition: HISubCollisionModel.h:532
vector< double > dsig2
The estimated error (squared)
Definition: HISubCollisionModel.h:153
(Low energy) annihilation.
Definition: HISubCollisionModel.h:45
Definition: HISubCollisionModel.h:484
virtual ~ImpactParameterGenerator()
Virtual destructor.
Definition: HISubCollisionModel.h:713
bool empty() const
Reset the subcollisions.
Definition: HISubCollisionModel.h:114
Definition: HISubCollisionModel.h:143
double sigLExc() const
The Low-energy excitation cross section (code 157).
Definition: HISubCollisionModel.h:253
double sigDDE() const
The target double diffractive excitation cross section.
Definition: HISubCollisionModel.h:244
virtual ~DoubleStrikmanSubCollisionModel() override
Virtual destructor.
Definition: HISubCollisionModel.h:662
virtual SigEst getSig() const override
Get cross sections used by this model.
Definition: HISubCollisionModel.h:536
SubCollision()
Default constructor.
Definition: HISubCollisionModel.h:55
double olapp
Definition: HISubCollisionModel.h:82
This is an elastic scattering.
Definition: HISubCollisionModel.h:38
void setParm(const vector< double > &parmIn)
Set the parameters of this model.
Definition: HISubCollisionModel.h:286
virtual ~NaiveSubCollisionModel() override
Virtual destructor.
Definition: HISubCollisionModel.h:528
Definition: HISubCollisionModel.h:30
Internal class to report cross section estimates.
Definition: HISubCollisionModel.h:148
int id() const
Accessor functions:
Definition: HINucleusModel.h:52
DoubleStrikmanSubCollisionModel(int modeIn=0)
The default constructor simply lists the nucleon-nucleon cross sections.
Definition: HISubCollisionModel.h:658
double sigLow() const
The Low-energy cross sections.
Definition: HISubCollisionModel.h:250
void fillCache(vector< vector< double > > &sigNN, int idAIn, int idBIn, int iECM)
Definition: HISubCollisionModel.h:415
int nucleons() const
Definition: HISubCollisionModel.h:64
Both projectile and target are diffractively excited.
Definition: HISubCollisionModel.h:41
virtual ~SubCollisionModel()
Virtual destructor.
Definition: HISubCollisionModel.h:182
vector< double > defParm() const override
Get the default parameter values for this model.
Definition: HISubCollisionModel.h:666
ParticleData * particleDataPtr
Pointer to the particle data table.
Definition: Info.h:83
double sigEl() const
The target elastic cross section.
Definition: HISubCollisionModel.h:229
Definition: HISubCollisionModel.h:771
SubCollisionSet(multiset< SubCollision > subCollisionsIn, double TIn, double T12In, double T21In, double T22In)
Definition: HISubCollisionModel.h:109
CollisionType
This defines the type of a binary nucleon collision.
Definition: HISubCollisionModel.h:35
double pickRadiusProj() const override
Pick a radius for the nucleon, depending on the specific model.
Definition: HISubCollisionModel.h:796
virtual void generateNucleonStates(Nucleus &, Nucleus &)
Definition: HISubCollisionModel.h:305
vector< double > minParm() const override
Get the minimum and maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:531
Header for classes to set beam momentum and interaction vertex spread.
Definition: Analysis.h:20
double sigSDET() const
The target single diffractive excitation cross section (target).
Definition: HISubCollisionModel.h:241
Definition: HISubCollisionModel.h:560
virtual ~LogNormalSubCollisionModel()
Virtual destructor.
Definition: HISubCollisionModel.h:782
SubCollisionModel(int nParm)
Definition: HISubCollisionModel.h:170
double sigTot() const
The target total nucleon-nucleon cross section.
Definition: HISubCollisionModel.h:226
bool operator<(const SubCollision &s) const
Used to order sub-collisions in a set.
Definition: HISubCollisionModel.h:60
int idASave
For variable energies.
Definition: HISubCollisionModel.h:358
double sigSDEP() const
The target single diffractive excitation cross section (projectile).
Definition: HISubCollisionModel.h:238
Nucleon * proj
The projectile nucleon.
Definition: HISubCollisionModel.h:68
This is not a collision.
Definition: HISubCollisionModel.h:37
vector< double > minParm() const override
virtual SigEst getSig() const override;
Definition: HISubCollisionModel.h:787
vector< double > maxParm() const override
Get the maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:533
vector< double > minParm() const override
Get the minimum and maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:495
vector< double > sig
The cross sections (tot, nd, dd, sdp, sdt, cd, el, bslope).
Definition: HISubCollisionModel.h:150
This class holds a map of all ParticleDataEntries.
Definition: ParticleData.h:423
double pickRadiusProj() const override
Pick a radius for the nucleon, depending on the specific model.
Definition: HISubCollisionModel.h:673
vector< double > minParm() const override
Get the minimum and maximum allowed parameter values for this model.
Definition: HISubCollisionModel.h:665
Definition: Settings.h:196
double b
The impact parameter distance between the nucleons in femtometer.
Definition: HISubCollisionModel.h:74
NaiveSubCollisionModel()
The default constructor simply lists the nucleon-nucleon cross sections.
Definition: HISubCollisionModel.h:525
The projectile is diffractively excited.
Definition: HISubCollisionModel.h:39
int opacityMode
Optional mode for opacity.
Definition: HISubCollisionModel.h:597