File indexing completed on 2025-09-15 09:06:42
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef Pythia8_HIInfo_H
0014 #define Pythia8_HIInfo_H
0015
0016 #include "Pythia8/Pythia.h"
0017 #include "Pythia8/HIBasics.h"
0018 #include "Pythia8/HISubCollisionModel.h"
0019
0020 namespace Pythia8 {
0021
0022
0023
0024
0025
0026
0027 class HIInfo {
0028
0029 public:
0030
0031 friend class HeavyIons;
0032 friend class Angantyr;
0033
0034
0035 HIInfo() = default;
0036
0037
0038 double b() const { return bSave; }
0039
0040
0041 double phi() const { return phiSave; }
0042
0043
0044 double T() { return TSave; }
0045
0046
0047
0048 double avNDb() const { return avNDbSave; }
0049
0050
0051 long nAttempts() const { return NSave; }
0052
0053
0054 long nAccepted() const { return NAccSave; }
0055
0056
0057 int nCollTot() const { return nCollSave[0]; }
0058
0059
0060 int nCollND() const { return nCollSave[1]; }
0061
0062
0063
0064 int nCollSDP() const { return nCollSave[2]; }
0065
0066
0067
0068 int nCollSDT() const { return nCollSave[3]; }
0069
0070
0071 int nCollDD() const { return nCollSave[4]; }
0072
0073
0074 int nCollCD() const { return nCollSave[5]; }
0075
0076
0077 int nCollEl() const { return nCollSave[6]; }
0078
0079
0080 int nPartProj() const { return nProjSave[0]; }
0081
0082
0083 int nAbsProj() const { return nProjSave[1]; }
0084
0085
0086 int nDiffProj() const { return nProjSave[2]; }
0087
0088
0089 int nElProj() const { return nProjSave[3]; }
0090
0091
0092 int nPartTarg() const { return nTargSave[0]; }
0093
0094
0095 int nAbsTarg() const { return nTargSave[1]; }
0096
0097
0098 int nDiffTarg() const { return nTargSave[2]; }
0099
0100
0101 int nElTarg() const { return nTargSave[3]; }
0102
0103
0104 double weight() const { return weightSave; }
0105
0106
0107 double weightSum() const { return weightSumSave; }
0108
0109
0110 int nFail() const {
0111 return nFailSave;
0112 }
0113
0114
0115 void failedExcitation(const SubCollision& subColl) {
0116 subColl.failed = true;
0117 ++nFailSave;
0118 }
0119
0120
0121 void glauberReset();
0122
0123
0124 double glauberTot() const {
0125 return sigmaTotSave*FMSQ2MB;
0126 }
0127
0128
0129
0130 double glauberTotErr() const {
0131 return sqrt(sigErr2TotSave/max(1.0, double(NSave)))*FMSQ2MB;
0132 }
0133
0134
0135 double glauberND() const {
0136 return sigmaNDSave*FMSQ2MB;
0137 }
0138
0139
0140
0141 double glauberNDErr() const {
0142 return sqrt(sigErr2NDSave/max(1.0, double(NSave)))*FMSQ2MB;
0143 }
0144
0145
0146 double glauberINEL() const {
0147 return sigmaINELSave*FMSQ2MB;
0148 }
0149
0150
0151
0152 double glauberINELErr() const {
0153 return sqrt(sigErr2INELSave/max(1.0, double(NSave)))*FMSQ2MB;
0154 }
0155
0156
0157 double glauberEL() const {
0158 return sigmaELSave*FMSQ2MB;
0159 }
0160
0161
0162
0163 double glauberELErr() const {
0164 return sqrt(sigErr2ELSave/max(1.0, double(NSave)))*FMSQ2MB;
0165 }
0166
0167
0168
0169 double glauberDiffT() const {
0170 return sigmaDiffTSave*FMSQ2MB;
0171 }
0172
0173
0174
0175 double glauberDiffTErr() const {
0176 return sqrt(sigErr2DiffTSave/max(1.0, double(NSave)))*FMSQ2MB;
0177 }
0178
0179
0180
0181 double glauberDiffP() const {
0182 return sigmaDiffPSave*FMSQ2MB;
0183 }
0184
0185
0186
0187 double glauberDiffPErr() const {
0188 return sqrt(sigErr2DiffPSave/max(1.0, double(NSave)))*FMSQ2MB;
0189 }
0190
0191
0192
0193 double glauberDDiff() const {
0194 return sigmaDDiffSave*FMSQ2MB;
0195 }
0196
0197
0198
0199 double glauberDDiffErr() const {
0200 return sqrt(sigErr2DDiffSave/max(1.0, double(NSave)))*FMSQ2MB;
0201 }
0202
0203
0204 double glauberBSlope() const {
0205 return slopeSave/(sigmaTotSave*pow2(HBARC));
0206 }
0207
0208
0209 double glauberBSlopeErr() const {
0210 return sqrt((slopeErrSave/pow2(slopeSave) +
0211 sigErr2TotSave/pow2(sigmaTotSave))/max(1.0, double(NSave)))*
0212 glauberBSlope();
0213 }
0214
0215 private:
0216
0217
0218
0219
0220 void addAttempt(double T, double bin, double phiin,
0221 double bweight, double xSecScale);
0222
0223
0224 void reweight(double w) {
0225 weightSave *= w;
0226 }
0227
0228
0229 void select(Info & in) {
0230 primInfo = in;
0231 primInfo.hiInfo = this;
0232 }
0233
0234
0235 void accept();
0236
0237
0238 void reject() {}
0239
0240
0241 void glauberStatistics();
0242
0243
0244 static void runAvg(double & sig, double & sigErr2, double N,
0245 double w) {
0246 double delta = w - sig;
0247 sig += delta/N;
0248 sigErr2 += (delta*(w - sig) - sigErr2)/N;
0249 }
0250
0251
0252 int idProjSave = 0, idTargSave = 0;
0253
0254
0255 double bSave = 0.0;
0256 double phiSave = 0.0;
0257
0258
0259 long NSave = 0, NAccSave = 0;
0260 double TSave = 0.0;
0261
0262 double sigmaTotSave = {}, sigmaNDSave = {},
0263 sigmaELSave = {}, sigmaINELSave = {},
0264 sigmaDiffPSave = {}, sigmaDiffTSave = {}, sigmaDDiffSave = {},
0265 slopeSave ={};
0266 double sigErr2TotSave = {}, sigErr2NDSave = {},
0267 sigErr2ELSave = {}, sigErr2INELSave = {},
0268 sigErr2DiffPSave = {}, sigErr2DiffTSave = {}, sigErr2DDiffSave = {},
0269 slopeErrSave ={};
0270 double avNDbSave = {};
0271 double weightSave = {}, weightSumSave = {}, xSecScaleSave = {};
0272
0273
0274
0275 vector<int> nCollSave{}, nProjSave{}, nTargSave{};
0276
0277
0278
0279 map<int,double> sumPrimW{}, sumPrimW2{};
0280 map<int,int> NPrim{};
0281 map<int,string> NamePrim{};
0282
0283
0284 Info primInfo{};
0285
0286
0287 int nFailSave = 0;
0288
0289 public:
0290
0291
0292 const SubCollisionSet* subCollisionsPtr() { return subCollisionsPtrSave; }
0293
0294 private:
0295
0296
0297 void setSubCollisions(const SubCollisionSet* subCollisionsPtrIn) {
0298 subCollisionsPtrSave = subCollisionsPtrIn; }
0299
0300
0301
0302 const SubCollisionSet* subCollisionsPtrSave{};
0303
0304 };
0305
0306
0307
0308
0309
0310
0311
0312
0313 class HIUserHooks {
0314
0315 public:
0316
0317
0318 HIUserHooks(): idProjSave(0), idTargSave(0) {}
0319
0320
0321 virtual ~HIUserHooks() {}
0322
0323
0324 virtual void init(int idProjIn, int idTargIn) {
0325 idProjSave = idProjIn;
0326 idTargSave = idTargIn;
0327 }
0328
0329
0330 virtual bool hasImpactParameterGenerator() const { return false; }
0331 virtual shared_ptr<ImpactParameterGenerator> impactParameterGenerator()
0332 const { return nullptr; }
0333
0334
0335 virtual bool hasProjectileModel() const { return false; }
0336 virtual shared_ptr<NucleusModel> projectileModel() const { return nullptr; }
0337 virtual bool hasTargetModel() const { return false; }
0338 virtual shared_ptr<NucleusModel> targetModel() const { return nullptr; }
0339
0340
0341
0342 virtual bool hasSubCollisionModel() { return false; }
0343 virtual shared_ptr<SubCollisionModel> subCollisionModel() { return nullptr; }
0344
0345
0346 virtual bool hasEventOrdering() const { return false; }
0347 virtual double eventOrdering(const Event &, const Info &) { return -1; }
0348
0349
0350
0351 virtual bool canFixIsoSpin() const { return false; }
0352 virtual bool fixIsoSpin(EventInfo &) { return false; }
0353
0354
0355 virtual bool canShiftEvent() const { return false; }
0356 virtual EventInfo & shiftEvent(EventInfo & ei) const { return ei; }
0357
0358
0359
0360 bool canAddNucleonExcitation() const { return false; }
0361 bool addNucleonExcitation(EventInfo &, EventInfo &, bool) const {
0362 return false; }
0363
0364
0365 virtual bool canForceHadronLevel() const { return false; }
0366 virtual bool forceHadronLevel(Pythia &) { return false; }
0367
0368
0369
0370
0371 virtual bool canFindRecoilers() const { return false; }
0372 virtual vector<int>
0373 findRecoilers(const Event &, bool , int , int ,
0374 const Vec4 & , const Vec4 & ) const {
0375 return vector<int>();
0376 }
0377
0378 protected:
0379
0380
0381
0382 int idProjSave, idTargSave;
0383
0384 };
0385
0386
0387
0388 }
0389
0390 #endif