Jpp test-rotations-old
the software that should make you happy
Loading...
Searching...
No Matches
JHistHDF.cc File Reference

Program to histogram event-by-event data of muon light for making PDFs. More...

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Program to histogram event-by-event data of muon light for making PDFs.

Author
mdejong

Definition in file JHistHDF.cc.

Function Documentation

◆ main()

int main ( int argc,
char ** argv )

Definition at line 102 of file JHistHDF.cc.

103{
104 using namespace std;
105 using namespace JPP;
106 using namespace KM3NET;
107
109 JLimit_t& numberOfEvents = inputFile.getLimit();
110 string outputFile;
111 string detectorFile;
112 int debug;
113
114 try {
115
116 JParser<> zap("Program to histogram event-by-event data of muon light for making PDFs.");
117
118 zap['f'] = make_field(inputFile);
119 zap['o'] = make_field(outputFile);
120 zap['n'] = make_field(numberOfEvents) = JLimit::max();
121 zap['a'] = make_field(detectorFile);
122 zap['d'] = make_field(debug) = 1;
123
124 zap(argc, argv);
125 }
126 catch(const exception &error) {
127 FATAL(error.what() << endl);
128 }
129
130
132
133 try {
134 load(detectorFile, detector);
135 }
136 catch(const JException& error) {
137 FATAL(error);
138 }
139
140 JHead head(JMultipleFileScanner<Head>(inputFile).getHeader()); // Monte Carlo header
141
142 const bool KM3Sim = is_km3sim(head);
143 const Vec offset = getOffset(head);
144
145 NOTICE("Apply detector offset " << offset << endl);
146
147 detector -= getPosition(offset);
148
149 const JCylinder3D can(detector.begin(), detector.end());
150
151 const JPMTRouter pmtRouter(detector);
152
153 const double P_atm = NAMESPACE::getAmbientPressure();
154 const double wmax = getMaximalWavelength();
155
156 const JDispersion dispersion(P_atm);
157
158 typedef JHistogram1D_t::abscissa_type abscissa_type;
159
163 JHistogramGridMap_t>::maplist> JMultiHistogram_t;
164
165 typedef JPDFTransformer<3, abscissa_type> JFunction3DTransformer_t;
166
167 JMultiHistogram_t h0; // occurrence rate of PMT (used for normalisation)
168 JMultiHistogram_t h1; // light from muon
169 JMultiHistogram_t h2; // light from showers
170
171 const double cmin = dispersion.getKmin (wmax);
172
173 h1.transformer.reset(new JFunction3DTransformer_t(35.0, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
174 h2.transformer.reset(new JFunction3DTransformer_t(35.0, 2, cmin, 0.0, NAMESPACE::getAngularAcceptance, 0.10));
175
176
177 // configure bins
178
179 const double R[] = { 0.0, 5.0, 10.0, 20.0, 30.0, 40.0, 50.0, 70.0, 80.0, 90.0, 100.0, 170.0, 250.0 };
180
181 for (int i = 0; i != sizeof(R)/sizeof(R[0]); ++i) {
182
183 const double R_m = R[i];
184
185 const double grid = 10.0 + 0.0 * R_m/100.0; // [deg]
186 const double alpha = 2.0 * sqrt(1.0 - cos(grid * PI / 180.0)); // azimuth angle unit step size
187
188 const int number_of_theta_points = max(2, (int) (180.0/(1.4 * grid)));
189 const double theta_step = PI / (number_of_theta_points + 1);
190
191 for (double theta = -0.5*theta_step; theta < PI + theta_step; theta += theta_step) {
192
193 const int number_of_phi_points = max(2, (int) (PI * sin(theta) / alpha));
194 const double phi_step = PI / (number_of_phi_points + 1);
195
196 for (double phi = -0.5*phi_step; phi < PI + phi_step; phi += phi_step) {
197
198 for (JMultiHistogram_t* p : { &h0, &h1, &h2 }) {
199 (*p)[R_m][theta][phi];
200 }
201 }
202 }
203 }
204
205 for (JMultiHistogram_t::super_iterator
206 i1 = h1.super_begin(),
207 i2 = h2.super_begin(); i1 != h1.super_end(); ++i1, ++i2) {
208
209 for (double x : { 0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 7.5, 10.0, 15.0, 20.0, 30.0, 40.0, 50.0, 60.0, 70.0, 85.0, 100.0, 125.0, 150.0, 200.0, 500.0} ) {
210 i1.getValue()[x];
211 i2.getValue()[x];
212 }
213 }
214
215
216 while (inputFile.hasNext()) {
217
218 NOTICE("event: " << setw(10) << inputFile.getCounter() << '\r'); STATUS(endl);
219
220 const Evt* event = inputFile.next();
221
222 for (vector<Trk>::const_iterator track = event->mc_trks.begin(); track != event->mc_trks.end(); ++track) {
223
224 if (is_muon(*track)) {
225
226 // track parameters
227
228 const double Evis = getVisibleEnergy (*event, can);
229 const Vec EvisVector = getVisibleEnergyVector(*event, can);
230
231 JVertex3D vertex = getVertex(*track);
232
233 const JRotation3D R(getDirection(EvisVector));
234
235 vertex.rotate(R);
236
237 JRange<double> Z(0.0, gWater(track->E)); // range of muon
238
239 for (vector<Hit>::const_iterator hit = event->mc_hits.begin(); hit != event->mc_hits.end(); ++hit) {
240
241 try {
242
243 JAxis3D axis = pmtRouter.getPMT(hit->pmt_id);
244
245 axis.transform(R, vertex);
246
247 const double t1 = vertex.getT() + (axis.getZ() + axis.getX()*getTanThetaC()) / getSpeedOfLight();
248
249 const double R_m = axis.getX();
250 const double theta = axis.getTheta();
251 const double phi = fabs(axis.getPhi());
252 const double dt = getTime(*hit) - t1;
253 const double npe = getNPE (*hit);
254
255 const int ID = (KM3Sim ? classify_km3sim(*track, *hit) : classify(*track, *hit));
256
257 switch (ID) {
258
259 case 1:
260 h1.fill(R_m, theta, phi, dt, npe); // light from muon
261 break;
262
263 case 2:
264 h2.fill(R_m, theta, phi, dt, npe / max(1.0, Evis)); // light from shower
265 break;
266 }
267 }
268 catch(const exception& error) {
269 FATAL(error.what() << endl);
270 }
271 }
272
273
274 for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
275
276 JPosition3D P = module->getPosition();
277
278 P.rotate(R);
279
280 P.sub(vertex);
281
282 if (sqrt(P.getX()*P.getX() + P.getY()*P.getY()) <= h0.getXmax()) {
283
284 for (JModule::const_iterator pmt = module->begin(); pmt != module->end(); ++pmt) {
285
286 JAxis3D axis = *pmt;
287
288 axis.transform(R, vertex);
289
290 if (Z(axis.getZ() - axis.getX()/getTanThetaC())) {
291 h0.fill(axis.getX(), axis.getTheta(), fabs(axis.getPhi()), 0.0, 1.0);
292 }
293 }
294 }
295 }
296 }
297 }
298 }
299 NOTICE(endl);
300
301
302 // output
303
304 JFileStreamWriter out(outputFile.c_str());
305
306 for (const JMultiHistogram_t* p : { &h0, &h1, &h2 }) {
307 out.store(*p);
308 }
309
310 out.close();
311}
string outputFile
#define STATUS(A)
Definition JMessage.hh:63
#define NOTICE(A)
Definition JMessage.hh:64
#define FATAL(A)
Definition JMessage.hh:67
int debug
debug level
Definition JSirene.cc:72
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Monte Carlo run header.
Definition JHead.hh:1236
Detector data structure.
Definition JDetector.hh:96
Router for direct addressing of PMT data in detector data structure.
Definition JPMTRouter.hh:37
Axis object.
Definition JAxis3D.hh:41
void transform(const JAxis3D &axis)
Transform axis to reference frame of given axis.
Definition JAxis3D.hh:359
Data structure for position in three dimensions.
JPosition3D & rotate(const JRotation3D &R)
Rotate.
double getY() const
Get y position.
Definition JVector3D.hh:104
double getZ() const
Get z position.
Definition JVector3D.hh:115
JVector3D & sub(const JVector3D &vector)
Subtract vector.
Definition JVector3D.hh:158
double getX() const
Get x position.
Definition JVector3D.hh:94
double getTheta() const
Get theta angle.
Definition JVersor3D.hh:128
double getPhi() const
Get phi angle.
Definition JVersor3D.hh:144
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition JVertex3D.hh:147
Binary buffered file output.
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
Implementation of dispersion for water in deep sea.
Template definition of transformer of the probability density function (PDF) of the time response of ...
General purpose class for object reading from a list of file names.
virtual bool hasNext() override
Check availability of next element.
counter_type getCounter() const
Get counter.
virtual const pointer_type & next() override
Get next element.
collection_type::abscissa_type abscissa_type
Range of values.
Definition JRange.hh:42
Transformable multidimensional histogram.
JDirection3D getDirection(const Vec &dir)
Get direction.
bool is_km3sim(const JHead &header)
Check for detector simulation.
JVertex3D getVertex(const Trk &track)
Get vertex.
JPosition3D getPosition(const Vec &pos)
Get position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
double getNPE(const Hit &hit)
Get true charge of hit.
Vec getOffset(const JHead &header)
Get offset.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
static const JGeaneWater gWater
Function object for energy loss of muon in sea water.
Definition JGeane.hh:381
const double getSpeedOfLight()
Get speed of light.
double getMaximalWavelength()
Get maximal wavelength for PDF evaluations.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
double getVisibleEnergy(const Trk &, const JCylinder3D &)
Get the visible energy of a track.
Vec getVisibleEnergyVector(const Trk &track, const JCylinder3D &can=getMaximumContainmentVolume())
Get the visible energy vector of a track.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
const char * getTime()
Get current local time conform ISO-8601 standard.
JHistogram1D< JElement2D< double, double >, JCollection > JHistogram1D_t
Type definition of a 1 dimensional histogram based on a JCollection.
Name space for KM3NeT.
Definition Jpp.hh:16
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition Evt.hh:21
The cylinder used for photon tracking.
Definition JHead.hh:575
Detector file.
Definition JHead.hh:227
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
Type definition of a JHistogramMap based on JGridMap implementation.
Type definition of a JHistogramMap based on JMap implementation.
Auxiliary class for recursive map list generation.
Definition JMapList.hh:109
The Vec class is a straightforward 3-d vector, which also works in pyroot.
Definition Vec.hh:13