13 #ifndef Pythia8_Analysis_H
14 #define Pythia8_Analysis_H
18 #include "PythiaStdlib.h"
32 Sphericity(
double powerIn = 2.,
int selectIn = 2) : power(powerIn),
33 select(selectIn), nFew(0), nBack(0) {powerInt = 0;
34 if (abs(power - 1.) < 0.01) powerInt = 1;
35 if (abs(power - 2.) < 0.01) powerInt = 2;
36 powerMod = 0.5 * power - 1.;}
39 bool analyze(
const Event& event, ostream& os = cout);
42 double sphericity()
const {
return 1.5 * (eVal2 + eVal3);}
43 double aplanarity()
const {
return 1.5 * eVal3;}
44 double eigenValue(
int i)
const {
return (i < 2) ? eVal1 :
45 ( (i < 3) ? eVal2 : eVal3 ) ;}
46 Vec4 eventAxis(
int i)
const {
return (i < 2) ? eVec1 :
47 ( (i < 3) ? eVec2 : eVec3 ) ;}
50 void list(ostream& os = cout)
const;
53 int nError()
const {
return nFew + nBack;}
58 static const int NSTUDYMIN, TIMESTOPRINT;
59 static const double P2MIN, EIGENVALUEMIN;
67 double eVal1, eVal2, eVal3;
68 Vec4 eVec1, eVec2, eVec3;
85 Thrust(
int selectIn = 2) : select(selectIn), nFew(0) {}
88 bool analyze(
const Event& event, ostream& os = cout);
91 double thrust()
const {
return eVal1;}
92 double tMajor()
const {
return eVal2;}
93 double tMinor()
const {
return eVal3;}
94 double oblateness()
const {
return eVal2 - eVal3;}
95 Vec4 eventAxis(
int i)
const {
return (i < 2) ? eVec1 :
96 ( (i < 3) ? eVec2 : eVec3 ) ;}
99 void list(ostream& os = cout)
const;
102 int nError()
const {
return nFew;}
107 static const int NSTUDYMIN, TIMESTOPRINT;
108 static const double MAJORMIN;
114 double eVal1, eVal2, eVal3;
115 Vec4 eVec1, eVec2, eVec3;
133 pJet(pJetIn), mother(motherIn), daughter(0), multiplicity(1),
134 isAssigned(
false) {pAbs = max( PABSMIN, pJet.pAbs());}
136 { pJet = j.pJet; mother = j.mother; daughter = j.daughter;
137 multiplicity = j.multiplicity; pAbs = j.pAbs;
138 isAssigned = j.isAssigned;}
return *
this; }
144 int mother, daughter, multiplicity;
156 static const double PABSMIN;
179 ClusterJet(
string measureIn =
"Lund",
int selectIn = 2,
int massSetIn = 2,
180 bool preclusterIn =
false,
bool reassignIn =
false) : measure(1),
181 select(selectIn), massSet(massSetIn), doPrecluster(preclusterIn),
182 doReassign(reassignIn), nFew(0) {
183 char firstChar = toupper(measureIn[0]);
184 if (firstChar ==
'J') measure = 2;
185 if (firstChar ==
'D') measure = 3;
189 bool analyze(
const Event& event,
double yScaleIn,
double pTscaleIn,
190 int nJetMinIn = 1,
int nJetMaxIn = 0, ostream& os = cout);
193 int size()
const {
return jets.size();}
194 Vec4 p(
int i)
const {
return jets[i].pJet;}
195 int mult(
int i)
const {
return jets[i].multiplicity;}
198 int jetAssignment(
int i)
const {
199 for (
int iP = 0; iP < int(particles.size()); ++iP)
200 if (particles[iP].mother == i)
return particles[iP].daughter;
204 void list(ostream& os = cout)
const;
207 int distanceSize()
const {
return distances.size();}
208 double distance(
int i)
const {
209 return (i < distanceSize()) ? distances[i] : 0.; }
212 int nError()
const {
return nFew;}
217 static const int TIMESTOPRINT;
218 static const double PIMASS, PABSMIN, PRECLUSTERFRAC, PRECLUSTERSTEP;
221 int measure, select, massSet;
222 bool doPrecluster, doReassign;
223 double yScale, pTscale;
224 int nJetMin, nJetMax;
227 double piMass, dist2Join, dist2BigMin, distPre, dist2Pre;
228 vector<SingleClusterJet> particles;
239 vector<SingleClusterJet> jets;
242 deque<double> distances;
256 SingleCell(
int iCellIn = 0,
double etaCellIn = 0.,
double phiCellIn = 0.,
257 double eTcellIn = 0.,
int multiplicityIn = 0) : iCell(iCellIn),
258 etaCell(etaCellIn), phiCell(phiCellIn), eTcell(eTcellIn),
259 multiplicity(multiplicityIn), canBeSeed(
true), isUsed(
false),
264 double etaCell, phiCell, eTcell;
266 bool canBeSeed, isUsed, isAssigned;
281 double phiCenterIn = 0.,
double etaWeightedIn = 0.,
282 double phiWeightedIn = 0.,
int multiplicityIn = 0,
283 Vec4 pMassiveIn = 0.) : eTjet(eTjetIn), etaCenter(etaCenterIn),
284 phiCenter(phiCenterIn), etaWeighted(etaWeightedIn),
285 phiWeighted(phiWeightedIn), multiplicity(multiplicityIn),
286 pMassive(pMassiveIn) {}
289 double eTjet, etaCenter, phiCenter, etaWeighted, phiWeighted;
305 CellJet(
double etaMaxIn = 5.,
int nEtaIn = 50,
int nPhiIn = 32,
306 int selectIn = 2,
int smearIn = 0,
double resolutionIn = 0.5,
307 double upperCutIn = 2.,
double thresholdIn = 0.,
Rndm* rndmPtrIn = 0)
308 : etaMax(etaMaxIn), nEta(nEtaIn), nPhi(nPhiIn), select(selectIn),
309 smear(smearIn), resolution(resolutionIn), upperCut(upperCutIn),
310 threshold(thresholdIn), nFew(0), rndmPtr(rndmPtrIn) { }
313 bool analyze(
const Event& event,
double eTjetMinIn = 20.,
314 double coneRadiusIn = 0.7,
double eTseedIn = 1.5, ostream& os = cout);
317 int size()
const {
return jets.size();}
318 double eT(
int i)
const {
return jets[i].eTjet;}
319 double etaCenter(
int i)
const {
return jets[i].etaCenter;}
320 double phiCenter(
int i)
const {
return jets[i].phiCenter;}
321 double etaWeighted(
int i)
const {
return jets[i].etaWeighted;}
322 double phiWeighted(
int i)
const {
return jets[i].phiWeighted;}
323 int multiplicity(
int i)
const {
return jets[i].multiplicity;}
324 Vec4 pMassless(
int i)
const {
return jets[i].eTjet *
Vec4(
325 cos(jets[i].phiWeighted), sin(jets[i].phiWeighted),
326 sinh(jets[i].etaWeighted), cosh(jets[i].etaWeighted) );}
327 Vec4 pMassive(
int i)
const {
return jets[i].pMassive;}
328 double m(
int i)
const {
return jets[i].pMassive.mCalc();}
331 void list(ostream& os = cout)
const;
334 int nError()
const {
return nFew;}
339 static const int TIMESTOPRINT;
343 int nEta, nPhi, select, smear;
344 double resolution, upperCut, threshold;
345 double eTjetMin, coneRadius, eTseed;
351 vector<SingleCellJet> jets;
377 virtual bool include(
int iSel,
const Event& event,
Vec4& pSel,
393 double phiIn = 0.) : p(pIn), pT2(pT2In), y(yIn), phi(phiIn),
396 y(ssj.y), phi(ssj.phi), mult(ssj.mult) { }
398 { p = ssj.p; pT2 = ssj.pT2; y = ssj.y; phi = ssj.phi;
399 mult = ssj.mult;}
return *
this; }
418 SlowJet(
int powerIn,
double Rin,
double pTjetMinIn = 0.,
419 double etaMaxIn = 25.,
int selectIn = 2,
int massSetIn = 2,
420 SlowJetHook* sjHookPtrIn = 0) : power(powerIn), R(Rin),
421 pTjetMin(pTjetMinIn), etaMax(etaMaxIn), select(selectIn),
422 massSet(massSetIn), sjHookPtr(sjHookPtrIn)
423 { isAnti = (power < 0); isKT = (power > 0); isCA = (power == 0);
424 R2 = R*R; pT2jetMin = pTjetMin*pTjetMin; cutInEta = (etaMax <= 20.);
425 chargedOnly = (select > 2); visibleOnly = (select == 2);
426 modifyMass = (massSet < 2); noHook = (sjHookPtr == 0); }
429 bool analyze(
const Event& event) {
430 if ( !setup(event) )
return false;
431 while (clSize > 0) doStep();
return true; }
434 bool setup(
const Event& event);
440 bool doNSteps(
int nStep) {
441 while(nStep > 0 && clSize > 0) { doStep(); --nStep;}
442 return (nStep == 0); }
445 bool stopAtN(
int nStop) {
446 while (clSize + jtSize > nStop && clSize > 0) doStep();
447 return (clSize + jtSize == nStop); }
450 int sizeOrig()
const {
return origSize;}
451 int sizeJet()
const {
return jtSize;}
452 int sizeAll()
const {
return jtSize + clSize;}
453 double pT(
int i)
const {
return (i < jtSize)
454 ? sqrt(jets[i].pT2) : sqrt(clusters[i - jtSize].pT2);}
455 double y(
int i)
const {
return (i < jtSize)
456 ? jets[i].y : clusters[i - jtSize].y;}
457 double phi(
int i)
const {
return (i < jtSize)
458 ? jets[i].phi : clusters[i - jtSize].phi;}
459 Vec4 p(
int i)
const {
return (i < jtSize)
460 ? jets[i].p : clusters[i - jtSize].p;}
461 double m(
int i)
const {
return (i < jtSize)
462 ? jets[i].p.mCalc() : clusters[i - jtSize].p.mCalc();}
463 int multiplicity(
int i)
const {
return (i < jtSize)
464 ? jets[i].mult : clusters[i - jtSize].mult;}
467 int iNext()
const {
return (iMin == -1) ? -1 : iMin + jtSize;}
468 int jNext()
const {
return (jMin == -1) ? -1 : jMin + jtSize;}
469 double dNext()
const {
return dMin;}
472 void list(
bool listAll =
false, ostream& os = cout)
const;
477 static const int TIMESTOPRINT;
478 static const double PIMASS, TINY;
482 double R, pTjetMin, etaMax, R2, pT2jetMin;
484 bool isAnti, isKT, isCA, cutInEta, chargedOnly, visibleOnly,
491 vector<SingleSlowJet> clusters;
492 vector<SingleSlowJet> jets;
499 int origSize, clSize, clLast, jtSize, iMin, jMin;
500 double dPhi, dijTemp, dMin;
511 #endif // end Pythia8_Analysis_H