Skip to content

Commit 0a1335c

Browse files
authored
Merge pull request #14 from mverwe/prodHybrid
get parton production points in hybrid events
2 parents c7116ba + e319c61 commit 0a1335c

5 files changed

+188
-5
lines changed

PU14/EventMixer.cc

+3-2
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,15 @@ bool EventMixer::next_event() {
4949
_pu_event_weight = 1;
5050

5151
// first get the hard event
52-
if (! _hard->append_next_event(_particles,_hard_event_weight,0)) return false;
52+
if (! _hard->append_next_event(_particles,_hard_event_weight,_posX,_posY,0)) return false;
5353

5454
unsigned hard_size = _particles.size();
5555

5656
// add pileup if available
5757
if (_pileup.get()){
5858
for (int i = 1; i <= _npu; i++) {
59-
if (! _pileup->append_next_event(_particles,_pu_event_weight,i)) return false;
59+
double dumX, dumY;
60+
if (! _pileup->append_next_event(_particles,_pu_event_weight,dumX,dumY,i)) return false;
6061
}
6162
}
6263

PU14/EventMixer.hh

+3
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public:
4242
double weight() {return _hard_event_weight * _pu_event_weight;}
4343
double pu_weight() {return _pu_event_weight;}
4444
double hard_weight() {return _hard_event_weight;}
45+
double productionX() {return _posX;}
46+
double productionY() {return _posY;}
4547

4648
/// returns the number of pileup events generated in the last mixed event
4749
int npu() const {return _npu;}
@@ -73,6 +75,7 @@ private:
7375

7476
std::vector<fastjet::PseudoJet> _particles;
7577
double _hard_event_weight, _pu_event_weight;
78+
double _posX, _posY;
7679
};
7780

7881
#endif // __EVENTMIXER_HH__

PU14/EventSource.cc

+20-2
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ void EventSource::open_stream(const std::string & filename) {
3030

3131
//----------------------------------------------------------------------
3232
bool EventSource::append_next_event(std::vector<fastjet::PseudoJet> & particles,
33-
double &event_weight, int vertex_number) {
33+
double &event_weight, double &prodX, double &prodY,
34+
int vertex_number) {
3435
PseudoJet particle;
3536
string line;
3637
double px, py, pz, m, E;
@@ -48,6 +49,7 @@ bool EventSource::append_next_event(std::vector<fastjet::PseudoJet> & particles,
4849
// event (try to make the check as efficient as possible).
4950
if (line[0] == 'e' && line.substr(0,3) == "end") break;
5051

52+
bool bStop = false;
5153
// if the line says "weight", we multiply current weight by the number that follows
5254
if(line[0] == 'w' && line.substr(0, 6) == "weight")
5355
{
@@ -57,9 +59,25 @@ bool EventSource::append_next_event(std::vector<fastjet::PseudoJet> & particles,
5759
readline >> dummy >> temp;
5860
if(temp > 0)
5961
event_weight = event_weight * temp;
60-
continue;
62+
bStop = true;
6163
}
6264

65+
//extraction production point info for hybrid event generator
66+
if(line.find("cross") < line.size()) {
67+
std::size_t posX = line.find("X");
68+
std::string strX = line.substr(posX+2,6);
69+
70+
std::size_t posY = line.find("Y");
71+
std::string strY = line.substr(posY+2,6);
72+
73+
prodX = atof(strX.c_str());
74+
prodY = atof(strY.c_str());
75+
76+
bStop = true;
77+
}
78+
79+
if(bStop) continue;
80+
6381
// FastIStringStream is not a proper stream, but it's a lot faster
6482
// than standard istringstream.
6583
FastIStringStream readline(line.c_str());

PU14/EventSource.hh

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ public:
2525
/// appends the particles from the next event that is read onto the
2626
/// particles vector.
2727
bool append_next_event(std::vector<fastjet::PseudoJet> & particles,
28-
double &event_weight, int vertex_number = 0);
28+
double &event_weight, double &prodX, double &prodY,
29+
int vertex_number = 0);
2930

3031
private:
3132
std::istream * _stream;

runHybridJetAnalysis.cc

+160
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
#include <iostream>
2+
#include <chrono>
3+
4+
#include "TFile.h"
5+
#include "TTree.h"
6+
7+
#include "fastjet/PseudoJet.hh"
8+
#include "fastjet/ClusterSequenceArea.hh"
9+
10+
#include "include/ProgressBar.h"
11+
12+
#include "PU14/EventMixer.hh"
13+
#include "PU14/CmdLine.hh"
14+
#include "PU14/PU14.hh"
15+
16+
#include "include/extraInfo.hh"
17+
#include "include/jetCollection.hh"
18+
#include "include/softDropGroomer.hh"
19+
#include "include/treeWriter.hh"
20+
#include "include/jetMatcher.hh"
21+
#include "include/Angularity.hh"
22+
23+
using namespace std;
24+
using namespace fastjet;
25+
26+
// ./runHybridJetAnalysis -hard samples/HYBRID_Hadrons_5020_dijet_K20_kappa_0.404_K_20.000.pu14 -nev 10
27+
28+
int main (int argc, char ** argv) {
29+
30+
auto start_time = chrono::steady_clock::now();
31+
32+
CmdLine cmdline(argc,argv);
33+
// inputs read from command line
34+
int nEvent = cmdline.value<int>("-nev",1); // first argument: command line option; second argument: default value
35+
//bool verbose = cmdline.present("-verbose");
36+
37+
cout << "will run on " << nEvent << " events" << endl;
38+
39+
// Uncomment to silence fastjet banner
40+
ClusterSequence::set_fastjet_banner_stream(NULL);
41+
42+
//to write info to root tree
43+
treeWriter trw("jetTree");
44+
45+
//Jet definition
46+
double R = 0.4;
47+
double ghostRapMax = 6.0;
48+
double ghost_area = 0.005;
49+
int active_area_repeats = 1;
50+
GhostedAreaSpec ghost_spec(ghostRapMax, active_area_repeats, ghost_area);
51+
AreaDefinition area_def = AreaDefinition(active_area,ghost_spec);
52+
JetDefinition jet_def(antikt_algorithm, R);
53+
54+
double jetRapMax = 3.0;
55+
Selector jet_selector = SelectorAbsRapMax(jetRapMax);
56+
57+
Angularity width(1.,1.,R);
58+
Angularity pTD(0.,2.,R);
59+
60+
ProgressBar Bar(cout, nEvent);
61+
Bar.SetStyle(-1);
62+
63+
EventMixer mixer(&cmdline); //the mixing machinery from PU14 workshop
64+
65+
// loop over events
66+
int iev = 0;
67+
unsigned int entryDiv = (nEvent > 200) ? nEvent / 200 : 1;
68+
while ( mixer.next_event() && iev < nEvent )
69+
{
70+
// increment event number
71+
iev++;
72+
73+
Bar.Update(iev);
74+
Bar.PrintWithMod(entryDiv);
75+
76+
vector<PseudoJet> particlesMerged = mixer.particles();
77+
78+
vector<double> eventWeight;
79+
eventWeight.push_back(mixer.hard_weight());
80+
eventWeight.push_back(mixer.pu_weight());
81+
82+
//get parton production points from hybrid file
83+
vector<double> prodX;
84+
vector<double> prodY;
85+
prodX.push_back(mixer.productionX());
86+
prodY.push_back(mixer.productionY());
87+
88+
//std::cout << "X: " << mixer.productionX() << " Y: " << mixer.productionY() << std::endl;
89+
90+
// extract hard partons that initiated the jets
91+
fastjet::Selector parton_selector = SelectorVertexNumber(-1);
92+
vector<PseudoJet> partons = parton_selector(particlesMerged);
93+
94+
// select final state particles from hard event only
95+
vector<PseudoJet> particlesBkg, particlesSig;
96+
SelectorIsHard().sift(particlesMerged, particlesSig, particlesBkg); // this sifts the full event into two vectors of PseudoJet, one for the hard event, one for the underlying event
97+
98+
//---------------------------------------------------------------------------
99+
// jet clustering
100+
//---------------------------------------------------------------------------
101+
102+
fastjet::ClusterSequenceArea csSig(particlesSig, jet_def, area_def);
103+
jetCollection jetCollectionSig(sorted_by_pt(jet_selector(csSig.inclusive_jets(10.))));
104+
105+
//calculate some angularities
106+
vector<double> widthSig; widthSig.reserve(jetCollectionSig.getJet().size());
107+
vector<double> pTDSig; pTDSig.reserve(jetCollectionSig.getJet().size());
108+
for(PseudoJet jet : jetCollectionSig.getJet()) {
109+
widthSig.push_back(width.result(jet));
110+
pTDSig.push_back(pTD.result(jet));
111+
}
112+
jetCollectionSig.addVector("widthSig", widthSig);
113+
jetCollectionSig.addVector("pTDSig", pTDSig);
114+
115+
//---------------------------------------------------------------------------
116+
// Groom the jets
117+
//---------------------------------------------------------------------------
118+
119+
//SoftDrop grooming classic for signal jets (zcut=0.1, beta=0)
120+
softDropGroomer sdgSigBeta00Z01(0.1, 0.0, R);
121+
jetCollection jetCollectionSigSDBeta00Z01(sdgSigBeta00Z01.doGrooming(jetCollectionSig));
122+
jetCollectionSigSDBeta00Z01.addVector("zgSigSDBeta00Z01", sdgSigBeta00Z01.getZgs());
123+
jetCollectionSigSDBeta00Z01.addVector("ndropSigSDBeta00Z01", sdgSigBeta00Z01.getNDroppedSubjets());
124+
jetCollectionSigSDBeta00Z01.addVector("dr12SigSDBeta00Z01", sdgSigBeta00Z01.getDR12());
125+
126+
127+
//---------------------------------------------------------------------------
128+
// write tree
129+
//---------------------------------------------------------------------------
130+
131+
//Give variable we want to write out to treeWriter.
132+
//Only vectors of the types 'jetCollection', and 'double', 'int', 'PseudoJet' are supported
133+
134+
trw.addCollection("eventWeight", eventWeight);
135+
trw.addCollection("prodX", prodX);
136+
trw.addCollection("prodY", prodY);
137+
trw.addPartonCollection("partons", partons);
138+
139+
trw.addCollection("sigJet", jetCollectionSig);
140+
trw.addCollection("sigJetSDBeta00Z01", jetCollectionSigSDBeta00Z01);
141+
142+
trw.fillTree();
143+
144+
}//event loop
145+
146+
Bar.Update(nEvent);
147+
Bar.Print();
148+
Bar.PrintLine();
149+
150+
TTree *trOut = trw.getTree();
151+
152+
TFile *fout = new TFile(cmdline.value<string>("-output", "JetToyHIResultHybridJetAnalysis.root").c_str(), "RECREATE");
153+
trOut->Write();
154+
fout->Write();
155+
fout->Close();
156+
157+
double time_in_seconds = chrono::duration_cast<chrono::milliseconds>
158+
(chrono::steady_clock::now() - start_time).count() / 1000.0;
159+
cout << "runFromFile: " << time_in_seconds << endl;
160+
}

0 commit comments

Comments
 (0)