Jpp 19.3.0-rc.1
the software that should make you happy
Loading...
Searching...
No Matches
JMatrixNZ.cc
Go to the documentation of this file.
1#include <string>
2#include <iostream>
3#include <iomanip>
4#include <vector>
5#include <map>
6#include <algorithm>
7
8#include "TROOT.h"
9#include "TFile.h"
10#include "TH1D.h"
11#include "TProfile.h"
12#include "TRandom.h"
13
17#include "JDAQ/JDAQEventIO.hh"
19#include "JAAnet/JHead.hh"
30#include "JTrigger/JHit.hh"
31#include "JTrigger/JFrame.hh"
33#include "JTrigger/JHitL0.hh"
34#include "JTrigger/JHitL1.hh"
35#include "JTrigger/JBuildL1.hh"
36#include "JTrigger/JBuildL2.hh"
38#include "JTrigger/JMatch1D.hh"
39#include "JTrigger/JMatch3B.hh"
43#include "JSupport/JSupport.hh"
44
45#include "JFit/JMatrixNZ.hh"
46#include "JFit/JFitToolkit.hh"
47
48#include "Jeep/JParser.hh"
49#include "Jeep/JMessage.hh"
50
51
52/**
53 * \file
54 *
55 * Example program to test chi2 calculations based on JFIT::JMatrixNZ.
56 * \author mdejong
57 */
58int main(int argc, char **argv)
59{
60 using namespace std;
61 using namespace JPP;
62 using namespace KM3NETDAQ;
63
65 JLimit_t& numberOfEvents = inputFile.getLimit();
66 string outputFile;
67 string detectorFile;
68 double Tmax_ns;
69 double roadWidth_m;
70 double ctMin;
71 double alpha_deg;
72 double sigma_ns;
73 int numberOfOutliers;
74 bool useTrue;
75 int debug;
76
77 try {
78
79 JParser<> zap("Example program to test chi2 calculations of co-variance matrix including direction uncertainty.");
80
81 zap['f'] = make_field(inputFile);
82 zap['o'] = make_field(outputFile) = "matrixnz.root";
83 zap['a'] = make_field(detectorFile);
84 zap['n'] = make_field(numberOfEvents) = JLimit::max();
85 zap['T'] = make_field(Tmax_ns) = 20.0; // [ns]
86 zap['R'] = make_field(roadWidth_m) = 150.0; // [m]
87 zap['C'] = make_field(ctMin) = 0.0; //
88 zap['A'] = make_field(alpha_deg);
89 zap['S'] = make_field(sigma_ns);
90 zap['O'] = make_field(numberOfOutliers);
91 zap['U'] = make_field(useTrue);
92 zap['d'] = make_field(debug) = 1;
93
94 zap(argc, argv);
95 }
96 catch(const exception& error) {
97 FATAL(error.what() << endl);
98 }
99
100
101 using namespace KM3NETDAQ;
102
103
104 const unsigned int NUMBER_OF_HITS = 6;
105 const double STANDARD_DEVIATIONS = 3.0; // [unit]
106 const double HIT_OFF = 1.0e3 * sigma_ns*sigma_ns; // [ns^2]
107
108
110
111 try {
112 load(detectorFile, detector);
113 }
114 catch(const JException& error) {
115 FATAL(error);
116 }
117
118 const JModuleRouter moduleRouter(detector);
119 const JPMTRouter pmtRouter (detector);
120
121 const Vec offset = getOffset(getHeader(inputFile));
122
123
124 TFile out(outputFile.c_str(), "recreate");
125
126
127 TH1D h0("h0", NULL, 50, 0.0, 20.0);
128 TH1D h1("h1", NULL, 50, 0.0, 20.0);
129
130 TH1D p0("p0", NULL, 50, 0.0, 1.0);
131 TH1D p1("p1", NULL, 50, 0.0, 1.0);
132
134
135 {
136 double x = -0.5;
137
138 for ( ; x < 10.0; x += 1.0) { X.push_back(x); }
139 for ( ; x < 25.0; x += 2.0) { X.push_back(x); }
140 for ( ; x < 100.0; x += 5.0) { X.push_back(x); }
141 }
142
143 TProfile n0("n0", NULL, X.size() - 1, X.data());
144 TProfile n1("n1", NULL, X.size() - 1, X.data());
145
146
147 typedef vector<JHitL1> JData_t;
148 const JBuildL2<JHitL1> buildL2(JL2Parameters(2, Tmax_ns, ctMin));
149 const JMatch3B<JHitL1> match3B(roadWidth_m, Tmax_ns);
150 const JMatch1D<JHitL1> match1D(roadWidth_m, Tmax_ns);
151
152 JHit::setSlewing(!useTrue);
153
154 while (inputFile.hasNext()) {
155
156 STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
157
159
160 const JDAQEvent* tev = ps;
161 const Evt* event = ps;
162
163 const time_converter converter(*event, *tev);
164
165 vector<Trk>::const_iterator muon = find_if(event->mc_trks.begin(), event->mc_trks.end(), is_muon);
166
167 if (muon != event->mc_trks.end()) {
168
169 const JRotation3D R(getDirection(*muon));
170
171 JLine1Z tz(getPosition(*muon), converter.putTime(muon->t));
172
173 tz.add(getPosition(offset));
174 tz.rotate(R);
175
176 const double theta = alpha_deg * PI / 180.0;
177 const double phi = gRandom->Uniform(0.0, 2*PI);
178
179 const JRotation3D Rs(JAngle3D(theta,phi));
180
181
182 JData_t data;
183
184 if (!useTrue) {
185
186 buildL2(*tev, moduleRouter, back_inserter(data));
187
188 data.erase(unique(data.begin(), data.end(), equal_to<JDAQModuleIdentifier>()), data.end());
189
190 } else {
191
193
194 for (vector<Hit>::const_iterator i = event->mc_hits.begin(); i != event->mc_hits.end(); ++i) {
195
196 if (!is_noise(*i)) {
197
198 const JPMTAddress& address = pmtRouter.getAddress(i->pmt_id);
199 const JPMTIdentifier& id = pmtRouter.getIdentifier(address);
200 const JPMT& pmt = pmtRouter.getPMT(address);
201 const double t1 = converter.putTime(getTime(*i));
202
203 zbuf[address.first].push_back(JHitL0(JDAQPMTIdentifier(id.getModuleID(), id.getPMTAddress()), pmt, t1));
204 }
205 }
206
207 for (map<int, vector<JHitL0> >::iterator i = zbuf.begin(); i != zbuf.end(); ++i) {
208
209 sort(i->second.begin(), i->second.end(), less<JHit>());
210
211 data.push_back(i->second[0]);
212 }
213 }
214
215
216 // 3D cluster
217
218 data.erase(clusterizeWeight(data.begin(), data.end(), match3B), data.end());
219
220
221 // 1D cluster
222
223 for (JData_t::iterator i = data.begin(); i != data.end(); ++i) {
224 i->rotate(R);
225 }
226
227 data.erase(clusterizeWeight(data.begin(), data.end(), match1D), data.end());
228
229
230 // move true muon to center of mass of hits
231
232 tz.setZ(JWeighedCenter3D(data.begin(), data.end()).getZ(), getSpeedOfLight());
233
234
235 // set coordinate origin to true muon position
236
237 for (JData_t::iterator i = data.begin(); i != data.end(); ++i) {
238 i->sub(tz.getPosition());
239 }
240
241 tz.setPosition(JVector3D(0,0,0));
242
243
244 // apply rotational smearing to hits
245
246 for (JData_t::iterator i = data.begin(); i != data.end(); ++i) {
247 i->rotate_back(Rs);
248 }
249
250
251 if (data.size() >= NUMBER_OF_HITS + numberOfOutliers) {
252
253 JData_t::iterator __end = data.end();
254
255 for (int n = 0; n < numberOfOutliers && distance(data.begin(), __end) > NUMBER_OF_HITS; ++n) {
256
257 double ymax = 0.0;
258 JData_t::iterator kill = __end;
259
260 for (JData_t::iterator i = data.begin(); i != __end; ++i) {
261
262 const double y = fabs(i->getT() - tz.getT(*i)) / sigma_ns;
263
264 if (y > ymax) {
265 ymax = y;
266 kill = i;
267 }
268 }
269
270 if (ymax >= STANDARD_DEVIATIONS)
271 iter_swap(kill, --__end);
272 else
273 break;
274 }
275
276 const double chi2 = getChi2(tz, data.begin(), __end, sigma_ns);
277 const int N = distance(data.begin(), __end);
278
279 h0.Fill(chi2 / N);
280 p0.Fill(TMath::Prob(chi2, N));
281 n0.Fill((double) data.size(), (double) N / (double) data.size());
282 }
283
284
285 if (data.size() >= NUMBER_OF_HITS + numberOfOutliers) {
286
287 JMatrixNZ V;
288 JVectorNZ Y;
289
290 V.set(tz, data.begin(), data.end(), alpha_deg, sigma_ns);
291 Y.set(tz, data.begin(), data.end());
292
293 V.invert();
294
295 unsigned int N = data.size();
296
297 for (int n = 0; n < numberOfOutliers && N > NUMBER_OF_HITS; ++n, --N) {
298
299 double ymax = 0.0;
300 int kill = -1;
301
302 for (unsigned int i = 0; i != V.size(); ++i) {
303
304 const double y = getChi2(Y, V, i);
305
306 if (y > ymax) {
307 ymax = y;
308 kill = i;
309 }
310 }
311
312 if (ymax >= STANDARD_DEVIATIONS * STANDARD_DEVIATIONS)
313 V.update(kill, HIT_OFF);
314 else
315 break;
316 }
317
318 const double chi2 = V.getDot(Y);
319
320 h1.Fill(chi2 / N);
321 p1.Fill(TMath::Prob(chi2, N));
322 n1.Fill((double) data.size(), (double) N / (double) data.size());
323 }
324 }
325 }
326 STATUS(endl);
327
328 out.Write();
329 out.Close();
330}
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
Algorithms for hit clustering and sorting.
string outputFile
Data structure for detector geometry and calibration.
TPaveText * p1
Recording of objects on file according a format that follows from the file name extension.
Auxiliary methods to evaluate Poisson probabilities and chi2.
Basic data structure for L0 hit.
Basic data structure for L1 hit.
Match operator for Cherenkov light from muon with given direction.
Match operator for Cherenkov light from muon in any direction.
int main(int argc, char **argv)
Definition JMatrixNZ.cc:58
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
Direct access to module in detector data structure.
Direct access to PMT in detector data structure.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition JParser.hh:2142
Physics constants.
ROOT TTree parameter settings of various packages.
Basic data structure for time and time over threshold information of hit.
Synchronously read DAQ events and Monte Carlo events (and optionally other events).
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
int first
index of module in detector data structure
Router for direct addressing of module data in detector data structure.
Address of PMT in detector data structure.
Router for direct addressing of PMT data in detector data structure.
Definition JPMTRouter.hh:37
const JPMT & getPMT(const JPMTAddress &address) const
Get PMT.
Definition JPMTRouter.hh:92
JPMTIdentifier getIdentifier(const JPMTAddress &address) const
Get identifier of PMT.
const JPMTAddress & getAddress(const JObjectID &id) const
Get address of PMT.
Definition JPMTRouter.hh:80
Data structure for PMT geometry, calibration and status.
Definition JPMT.hh:49
Data structure for fit of straight line paralel to z-axis.
Definition JLine1Z.hh:29
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition JLine1Z.hh:114
void setZ(const double z, const double velocity)
Set z-position of vertex.
Definition JLine1Z.hh:75
Determination of the co-variance matrix of hits for a track along z-axis (JFIT::JLine1Z).
Definition JMatrixNZ.hh:30
void set(const JVector3D &pos, T __begin, T __end, const double alpha, const double sigma)
Set co-variance matrix.
Definition JMatrixNZ.hh:85
static double getDot(const variance &first, const variance &second)
Get dot product.
Definition JMatrixNZ.hh:196
Determination of the time residual vector of hits for a track along z-axis (JFIT::JLine1Z).
Definition JVectorNZ.hh:23
void set(const JLine1Z &track, T __begin, T __end)
Set time residual vector.
Definition JVectorNZ.hh:68
Data structure for angles in three dimensions.
Definition JAngle3D.hh:35
void setPosition(const JVector3D &pos)
Set position.
JPosition3D & rotate(const JRotation3D &R)
Rotate.
const JPosition3D & getPosition() const
Get position.
Data structure for vector in three dimensions.
Definition JVector3D.hh:36
double getZ() const
Get z position.
Definition JVector3D.hh:115
JVertex3D & add(const JVertex3D &value)
Addition operator.
Definition JVertex3D.hh:87
General exception.
Definition JException.hh:24
Utility class to parse command line options.
Definition JParser.hh:1698
counter_type getCounter() const
Get counter.
Template L2 builder.
Definition JBuildL2.hh:49
Data structure for L0 hit.
Definition JHitL0.hh:31
static void setSlewing(const bool slewing)
Set slewing option.
1D match criterion.
Definition JMatch1D.hh:33
3D match criterion with road width.
Definition JMatch3B.hh:36
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
double putTime() const
Get Monte Carlo time minus DAQ/trigger time.
JDirection3D getDirection(const Vec &dir)
Get direction.
JPosition3D getPosition(const Vec &pos)
Get position.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
bool is_noise(const Hit &hit)
Verify hit origin.
Vec getOffset(const JHead &header)
Get offset.
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.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
const char * getTime()
Get current local time conform ISO-8601 standard.
const int n
Definition JPolint.hh:791
JHitIterator_t clusterizeWeight(JHitIterator_t __begin, JHitIterator_t __end, const JMatch_t &match)
Partition data according given binary match operator.
KM3NeT DAQ data structures and auxiliaries.
Definition DataQueue.cc:39
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
General purpose class for multiple pointers.
size_t size() const
Get dimension of matrix.
Definition JMatrixND.hh:202
void update(const size_t k, const double value)
Update inverted matrix at given diagonal element.
Definition JMatrixNS.hh:446
void invert()
Invert matrix according LDU decomposition.
Definition JMatrixNS.hh:75
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 class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
virtual bool hasNext() override
Check availability of next element.
virtual const multi_pointer_type & next() override
Get next element.
Data structure for L2 parameters.
The Vec class is a straightforward 3-d vector, which also works in pyroot.
Definition Vec.hh:13
Auxiliary include file for time conversion between DAQ/trigger hit and Monte Carlo hit.