Jpp 19.3.0-rc.3
the software that should make you happy
Loading...
Searching...
No Matches
JEventShapeVariables.cc
Go to the documentation of this file.
1#include <iostream>
2#include <string>
3#include <vector>
4
7
11
13
16
17#include "JSupport/JSupport.hh"
21
22#include "Jeep/JeepToolkit.hh"
23#include "Jeep/JParser.hh"
24#include "Jeep/JMessage.hh"
25
26#include "TFile.h"
27#include "TH1D.h"
28
29
30/**
31 * \file
32 *
33 * Auxiliary program to plot event shape variables.
34 * \author bjjung
35 */
36int main(int argc, char **argv)
37{
38 using namespace std;
39 using namespace JPP;
40
41 JMultipleFileScanner_t inputFiles;
42 string outputFile;
43 string detectorFile;
44
45 JLimit_t numberOfEvents;
46
47 bool useBoost;
48
49 bool useWeights;
50 JFluxMap fluxMap;
51
52 int debug;
53
54 try {
55
56 JParser<> zap("Auxiliary program to test event shape variables.");
57
58 zap['f'] = make_field(inputFiles);
59 zap['o'] = make_field(outputFile);
60 zap['a'] = make_field(detectorFile) = "";
61 zap['n'] = make_field(numberOfEvents) = JLimit::max();
62 zap['B'] = make_field(useBoost);
63 zap['W'] = make_field(useWeights);
64 zap['@'] = make_field(fluxMap)
66 zap['d'] = make_field(debug) = 3;
67
68 zap(argc, argv);
69 }
70 catch(const exception &error) {
71 FATAL(error.what() << endl);
72 }
73
74 if (useWeights && numberOfEvents != JLimit::max()) {
75 FATAL("Cannot apply weighting to limited number of events.");
76 }
77
78
79 // Load detector file
80
82
83 if (!detectorFile.empty()) {
84 try {
85 load(detectorFile, detector);
86 }
87 catch(const JException& error) {
88 FATAL(error);
89 }
90 }
91
92 JCylinder3D fiducialVolume;
93
94 if (!detector.empty()) {
95 fiducialVolume.set(detector.begin(), detector.end());
96 }
97
98
99 // Create file scanners
100
101 JEvtWeightFileScannerSet<> scanners(inputFiles);
102
103 if (scanners.setFlux(fluxMap) == 0) {
104 WARNING("No flux function set." << endl);
105 }
106
107
108 // Define histograms
109
110 TFile out(outputFile.c_str(), "recreate");
111
112 TH1D hT("hT", "thrust", 50, 0.5, 1.0);
113
114 TH1D hA("hA", "aplanarity", 50, 0.0, 0.5);
115 TH1D hS("hS", "sphericity", 100, 0.0, 1.0);
116 TH1D hc("hc", "circularity", 100, 0.0, 1.0);
117 TH1D hp("hp", "planar flow", 100, 0.0, 1.0);
118
119 TH1D hC("hC", "C-variable", 100, 0.0, 1.0);
120 TH1D hD("hD", "D-variable", 100, 0.0, 1.0);
121
122 TH1D hH10("hH10", "H10", 100, 0.0, 1.0);
123 TH1D hH20("hH20", "H20", 100, 0.0, 1.0);
124 TH1D hH30("hH30", "H30", 100, 0.0, 1.0);
125 TH1D hH40("hH40", "H40", 100, 0.0, 1.0);
126
127 TH1D hq("hq", "Logarithmic eigenvalue ratio hit inertia tensor", 200, -20.0, 0.0);
128
129
130 // Loop over events
131
132 STATUS(RIGHT(15) << "header ID" << RIGHT(15) << "event" << RIGHT(15) << "weight" << endl);
133
134 for (JEvtWeightFileScannerSet<>::iterator scanner = scanners.begin(); scanner != scanners.end(); ++scanner) {
135
136 scanner->setLimit(numberOfEvents);
137
138 const JHead& header = scanner->getHeader();
139
140 if (detector.empty()) { // Use can volume if detector file has not been specified
141 fiducialVolume = getCylinder(header);
142 }
143
144 while (scanner->hasNext()) {
145
146 Evt* event = scanner->next();
147
148 const double weight = (useWeights ? scanner->getWeight(*event) : 1.0);
149
150 STATUS(RIGHT (15) << distance(scanners.begin(), scanner) <<
151 RIGHT (15) << scanner->getCounter() <<
152 SCIENTIFIC(15, 3) << weight << '\r'); DEBUG(endl);
153
154 if (useBoost) { boostToCOM(*event); }
155
156 const JVertex3D vertex = getVertex(*event);
157
158 const JSphericityTensor S1(*event, 1.0);
159 const JSphericityTensor S2(*event, 2.0);
160
161 const JFoxWolframMoments H(*event, fiducialVolume, 4);
162
163 const JHitInertiaTensor Q(*event, vertex);
164
165 const double thrust = getThrust(*event);
166
167 const double aplanarity = S2.getAplanarity();
168 const double sphericity = S2.getSphericity();
169 const double circularity = S2.getCircularity();
170 const double planarflow = S2.getPlanarFlow();
171
172 const double C = S1.getC();
173 const double D = S1.getD();
174
175 const double q = Q.getEigenvalueRatio();
176
177 hT.Fill(thrust, weight);
178
179 hA.Fill(aplanarity, weight);
180 hS.Fill(sphericity, weight);
181 hc.Fill(circularity, weight);
182 hp.Fill(planarflow, weight);
183
184 hC.Fill(C, weight);
185 hD.Fill(D, weight);
186
187 hH10.Fill(H[1]/H[0], weight);
188 hH20.Fill(H[2]/H[0], weight);
189 hH30.Fill(H[3]/H[0], weight);
190 hH40.Fill(H[4]/H[0], weight);
191
192 hq.Fill(log10(q), weight);
193 }
194 }
195
196 STATUS(endl);
197
198 out.Write();
199 out.Close();
200
201 return 0;
202}
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
string outputFile
Data structure for detector geometry and calibration.
int main(int argc, char **argv)
Event shape variables.
Auxiliary methods for calculating Lorentz boosts.
General purpose messaging.
#define DEBUG(A)
Message macros.
Definition JMessage.hh:62
#define STATUS(A)
Definition JMessage.hh:63
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define WARNING(A)
Definition JMessage.hh:65
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
ROOT TTree parameter settings of various packages.
Auxiliary methods for handling file names, type names and environment.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Template specialisation for a map between event categories and flux factors.
Monte Carlo run header.
Definition JHead.hh:1236
const JHead & getHeader() const
Get header.
Definition JHead.hh:1270
Detector data structure.
Definition JDetector.hh:96
void set(const JVector2D &p0, const JVector2D &p1)
Set circle.
Definition JCircle2D.hh:157
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
#define S1(x)
void boostToCOM(Evt &event)
Boost event to the Center of Mass (COM) frame.
JCylinder3D getCylinder(const JHead &header)
Get cylinder corresponding to the positions of generated tracks (i.e.
JVertex3D getVertex(const Trk &track)
Get vertex.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
@ RIGHT
Definition JTwosome.hh:18
static const double H
Planck constant [eV s].
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getThrust(const std::vector< Trk >::const_iterator __begin, const std::vector< Trk >::const_iterator __end)
Compute thrust for a given range of tracks.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition Evt.hh:21
Detector file.
Definition JHead.hh:227
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition JParser.hh:68
Class for computing Fox-Wolfram moments.
Class for hit inertia tensor calculations.
double getEigenvalueRatio() const
Get eigenvalue ratio.
Class for sphericity tensor calculations.
double getSphericity() const
Get sphericity.
double getAplanarity() const
Get aplanarity.
double getCircularity() const
Get circularity.
double getPlanarFlow() const
Get planar flow.
Auxiliary class for organising Monte Carlo file scanners associated with event weighters.
size_t setFlux(const JEvtCategoryHelper &category, const JFluxHelper &flux)
Set flux function for all MC-files corresponding to a given event category.
std::vector< filescanner_type >::iterator iterator
Auxiliary class for defining the range of iterations of objects.
Definition JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128
Auxiliary base class for list of file names.
Auxiliary data structure for alignment of data.
Definition JManip.hh:298
Auxiliary data structure for floating point format specification.
Definition JManip.hh:488