Jpp  master_rocky-40-g5f0272dcd
the software that should make you happy
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"
18 #include "JDAQ/JDAQTimesliceIO.hh"
19 #include "JAAnet/JHead.hh"
20 #include "JAAnet/JHeadToolkit.hh"
21 #include "JAAnet/JAAnetToolkit.hh"
22 #include "JPhysics/JConstants.hh"
26 #include "JDetector/JDetector.hh"
29 #include "JDetector/JPMTRouter.hh"
30 #include "JTrigger/JHit.hh"
31 #include "JTrigger/JFrame.hh"
32 #include "JTrigger/JTimeslice.hh"
33 #include "JTrigger/JHitL0.hh"
34 #include "JTrigger/JHitL1.hh"
35 #include "JTrigger/JBuildL1.hh"
36 #include "JTrigger/JBuildL2.hh"
37 #include "JTrigger/JAlgorithm.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  */
58 int main(int argc, char **argv)
59 {
60  using namespace std;
61  using namespace JPP;
62  using namespace KM3NETDAQ;
63 
64  JTriggeredFileScanner<> inputFile;
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 
133  vector<double> X;
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:69
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.
Definition: JPMTAddress.hh:35
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.
Definition: JPMTRouter.hh:128
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.
Definition: JPosition3D.hh:152
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Definition: JPosition3D.hh:186
const JPosition3D & getPosition() const
Get position.
Definition: JPosition3D.hh:130
Rotation matrix.
Definition: JRotation3D.hh:114
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
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.
double getTime(const Hit &hit)
Get true time of hit.
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.
Definition: JFitToolkit.hh:56
static const double PI
Mathematical constants.
const double getSpeedOfLight()
Get speed of light.
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 int n
Definition: JPolint.hh:786
static const struct JTRIGGER::clusterizeWeight clusterizeWeight
KM3NeT DAQ data structures and auxiliaries.
Definition: DataQueue.cc:39
Definition: JSTDTypes.hh:14
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
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.