Jpp 19.3.0-rc.2
the software that should make you happy
Loading...
Searching...
No Matches
JReconstruction/JShowerNPE.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <iomanip>
4#include <vector>
5#include <algorithm>
6
7#include "JDAQ/JDAQEventIO.hh"
9
13
14#include "JTrigger/JHitL0.hh"
15#include "JTrigger/JBuildL0.hh"
16
17#include "JSupport/JSupport.hh"
20
21#include "JPhysics/JNPE_t.hh"
22#include "JPhysics/JPDF_t.hh"
23
24#include "JFit/JPoint4D.hh"
25#include "JFit/JModel.hh"
26#include "JFit/JFitToolkit.hh"
27
32
33#include "Jeep/JPrint.hh"
34#include "Jeep/JParser.hh"
35#include "Jeep/JMessage.hh"
36
37#include "JTools/JResult.hh"
38
39namespace {
40
41 /**
42 * Auxiliary data structure for sorting of hits.
43 */
44 static const struct {
45 /**
46 * Compare hits by PMT identifier and time.
47 *
48 * \param first first hit
49 * \param second second hit
50 * \return true if first before second; else false
51 */
52 template<class T>
53 bool operator()(const T& first, const T& second) const
54 {
55 using namespace std;
56 using namespace JPP;
57 using namespace KM3NETDAQ;
58
59 if (equal_to<JDAQPMTIdentifier>()(first, second))
60 return less<JHit>()(first, second);
61 else
62 return less<JDAQPMTIdentifier>()(first, second);
63 }
64 } compare;
65}
66
67
68/**
69 * \file
70 *
71 * Program to evaluate hit probabilities.
72 *
73 * \author mdejong and adomi
74 */
75int main(int argc, char **argv)
76{
77 using namespace std;
78 using namespace JPP;
79 using namespace KM3NETDAQ;
80
81 typedef JParallelFileScanner< JTypeList<JDAQEvent, JEvt> > JParallelFileScanner_t;
82 typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
83
84 JParallelFileScanner_t inputFile;
85 JLimit_t& numberOfEvents = inputFile.getLimit();
86 string detectorFile;
87 string pdfFile;
88 JShowerFitParameters_t parameters;
89 int debug;
90
91 try {
92
93 parameters.numberOfPrefits = 1;
94
95 JParser<> zap("Program to evaluate hit probabilities.");
96
97 zap['f'] = make_field(inputFile);
98 zap['a'] = make_field(detectorFile);
99 zap['n'] = make_field(numberOfEvents) = JLimit::max();
100 zap['P'] = make_field(pdfFile);
101 zap['@'] = make_field(parameters) = JPARSER::initialised();
102 zap['d'] = make_field(debug) = 1;
103
104 zap(argc, argv);
105 }
106 catch(const exception& error) {
107 FATAL(error.what() << endl);
108 }
109
110 //setDAQLongprint(debug >= JEEP::debug_t);
111
112
113 if (parameters.numberOfPrefits != 1) {
114 WARNING("Number of prefits " << parameters.numberOfPrefits << " != " << 1 << endl);
115 }
116
118
119 try {
120 load(detectorFile, detector);
121 }
122 catch(const JException& error) {
123 FATAL(error);
124 }
125
126 const JModuleRouter router(detector);
127
128 JSummaryFileRouter summary(inputFile, parameters.R_Hz);
129
130 const JShowerNPE_t npe(pdfFile);
131
132 const JTimeRange T_ns(parameters.TMin_ns, parameters.TMax_ns);
133
134 typedef vector<JHitL0> JDataL0_t;
135 typedef vector<JHitW0> JDataW0_t;
136
137 const JBuildL0<JHitL0> buildL0;
138
139 while (inputFile.hasNext()) {
140
141 STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
142
143 multi_pointer_type ps = inputFile.next();
144
145 JDAQEvent* tev = ps;
146 JEvt* in = ps;
147
148 DEBUG("event: " << *tev << endl);
149
150 summary.update(*tev);
151
152 in->select(parameters.numberOfPrefits, qualitySorter);
153
154 JDataL0_t dataL0;
155
156 buildL0(*tev, router, true, back_inserter(dataL0));
157
158 for (JEvt::const_iterator shower = in->begin(); shower != in->end(); ++shower) {
159
160 DEBUG("shower: " << *shower << endl);
161
162 JRotation3D R (getDirection(*shower));
163 JPoint4D vx(getPosition(*shower).rotate(R), shower->getT());
164
165 const JModel<JPoint4D> match(vx, parameters.DMax_m, T_ns);
166
167 // hit selection based on start value
168
169 JDataW0_t data;
170
171 for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
172
173 double rate_Hz = summary.getRate(*i);
174
175 if (rate_Hz <= 0.0) {
176 rate_Hz = summary.getRate();
177 }
178
179 JHitW0 hit(*i, rate_Hz);
180
181 hit.rotate(R);
182
183 if (match(hit)) {
184 data.push_back(hit);
185 }
186 }
187
188 // select first hit in PMT
189
190 sort(data.begin(), data.end(), compare);
191
192 JDataW0_t::iterator __end = unique(data.begin(), data.end(), equal_to<JDAQPMTIdentifier>());
193
194 DEBUG("point4d: "
195 << FIXED(12,3) << vx.getX() << ' '
196 << FIXED(12,3) << vx.getY() << ' '
197 << FIXED(12,3) << vx.getZ() << ' '
198 << FIXED(12,3) << vx.getT() << ' '
199 << FIXED( 8,3) << shower->getQ() << endl);
200
201 double Q = 0.0;
202
203 for (JDataW0_t::const_iterator hit = data.begin(); hit != __end; ++hit) {
204
205 JPosition3D D(hit->getPosition());
206 D.sub(vx);
207
208 const double x = hit->getX() - vx.getX();
209 const double y = hit->getY() - vx.getY();
210 const double z = hit->getZ() - vx.getZ();
211 const double cd = z/D.getLength(); // Delta = angle between shower direction and PMT position
212
213 const double t1 = vx.getT() + (D.getLength() * getIndexOfRefraction() * getInverseSpeedOfLight());
214
215 JDirection3D u(hit->getDX(), hit->getDY(), hit->getDZ()); // PMT orientation
216
217 u.rotate(JRotation3Z(-atan2(y,x))); // rotate PMT axis to x-z plane
218
219 const double theta = u.getTheta();
220 const double phi = fabs(u.getPhi()); // rotational symmetry of Cherenkov cone
221
222 const double E = shower->getE();
223 const double dt = T_ns.constrain(hit->getT() - t1);
224
225 double H1 = npe.calculate(E, D.getLength(), cd, theta, phi);
226 double H0 = hit->getR() * 1e-9 * T_ns.getLength();
227
228 double Vmax_npe = 20.0;
229 if (H1 >= Vmax_npe) {
230 H1 *= Vmax_npe / H1;
231 }
232
233 H1 += H0; // signal + background
234
235 const double chi2 = getChi2(H1, true); // -log(lik)
236
237 DEBUG("hit: "
238 << setw(10) << hit->getModuleID() << ':' << setw( 2) << setfill('0') << hit->getPMTAddress() << setfill(' ') << ' '
239 << FIXED(12,1) << E << ' '
240 << FIXED( 9,1) << R << ' '
241 << FIXED( 6,4) << theta << ' '
242 << FIXED( 6,4) << phi << ' '
243 << FIXED( 8,3) << dt << ' '
244 << FIXED(12,3) << chi2 << endl);
245
246 Q += getQuality(chi2);
247 }
248
249 DEBUG("quality: " << FIXED(8,3) << Q << ' ' << distance(data.begin(), __end) << endl);
250 }
251 }
252 STATUS(endl);
253}
Data structure for detector geometry and calibration.
Auxiliary methods to evaluate Poisson probabilities and chi2.
Basic data structure for L0 hit.
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
Direct access to module in detector data structure.
Auxiliary data structure for muon PDF.
Auxiliary data structure for muon PDF.
Parallel scanning of objects from a single file or multiple files according a format that follows fro...
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
I/O formatting auxiliaries.
int main(int argc, char **argv)
This include file containes various data structures that can be used as specific return types for the...
ROOT TTree parameter settings of various packages.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Detector data structure.
Definition JDetector.hh:96
Router for direct addressing of module data in detector data structure.
Data structure for vertex fit.
Definition JPoint4D.hh:24
JAxis3D & rotate(const JRotation3D &R)
Rotate axis.
Definition JAxis3D.hh:225
Data structure for direction in three dimensions.
JDirection3D & rotate(const JRotation3D &R)
Rotate.
Data structure for position in three dimensions.
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Rotation around Z-axis.
double getY() const
Get y position.
Definition JVector3D.hh:104
double getLength() const
Get length.
Definition JVector3D.hh:246
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
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
Auxiliary class for a hit with background rate value.
Definition JHitW0.hh:23
General purpose class for parallel reading of objects from a single file or multiple files.
File router for fast addressing of summary data.
void update(const JDAQHeader &header)
Update router.
double getRate() const
Get default rate.
T getLength() const
Get length (difference between upper and lower limit).
Definition JRange.hh:289
T constrain(argument_type x) const
Constrain value to range.
Definition JRange.hh:350
Template L0 hit builder.
Definition JBuildL0.hh:38
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
double getQuality(const JEvent &evt)
Get average quality.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
double getChi2(const double P)
Get chi2 corresponding to given probability.
double getIndexOfRefraction()
Get average index of refraction of water corresponding to group velocity.
const double getInverseSpeedOfLight()
Get inverse speed of light.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
KM3NeT DAQ data structures and auxiliaries.
Definition DataQueue.cc:39
Auxiliary data structure for floating point format specification.
Definition JManip.hh:448
Detector file.
Definition JHead.hh:227
Acoustic event fit.
Model for fit to acoustics data.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition JParser.hh:68
Data structure for fit parameters.
double DMax_m
maximal distance to optical module [m]
double TMax_ns
maximum time for local coincidences [ns]
double TMin_ns
minimum time for local coincidences [ns]
Auxiliary class for defining the range of iterations of objects.
Definition JLimit.hh:45
const JLimit & getLimit() const
Get limit.
Definition JLimit.hh:84
static counter_type max()
Get maximum counter value.
Definition JLimit.hh:128
Auxiliary data structure for shower PDF.
Definition JNPE_t.hh:175
double calculate(const double E, const double D, const double cd, const double theta, const double phi) const
Get PDF.
Definition JNPE_t.hh:249