Jpp  master_rocky
the software that should make you happy
Functions
JMatrixNZ.cc File Reference

Example program to test chi2 calculations based on JFIT::JMatrixNZ. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <map>
#include <algorithm>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TProfile.h"
#include "TRandom.h"
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/Evt.hh"
#include "km3net-dataformat/tools/time_converter.hh"
#include "JDAQ/JDAQEventIO.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JAAnet/JHead.hh"
#include "JAAnet/JHeadToolkit.hh"
#include "JAAnet/JAAnetToolkit.hh"
#include "JPhysics/JConstants.hh"
#include "JGeometry3D/JDirection3D.hh"
#include "JGeometry3D/JRotation3D.hh"
#include "JGeometry3D/JGeometry3DToolkit.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JDetector/JPMTRouter.hh"
#include "JTrigger/JHit.hh"
#include "JTrigger/JFrame.hh"
#include "JTrigger/JTimeslice.hh"
#include "JTrigger/JHitL0.hh"
#include "JTrigger/JHitL1.hh"
#include "JTrigger/JBuildL1.hh"
#include "JTrigger/JBuildL2.hh"
#include "JTrigger/JAlgorithm.hh"
#include "JTrigger/JMatch1D.hh"
#include "JTrigger/JMatch3B.hh"
#include "JSupport/JTriggeredFileScanner.hh"
#include "JSupport/JFileRecorder.hh"
#include "JSupport/JMonteCarloFileSupportkit.hh"
#include "JSupport/JSupport.hh"
#include "JFit/JMatrixNZ.hh"
#include "JFit/JFitToolkit.hh"
#include "Jeep/JParser.hh"
#include "Jeep/JMessage.hh"

Go to the source code of this file.

Functions

int main (int argc, char **argv)
 

Detailed Description

Example program to test chi2 calculations based on JFIT::JMatrixNZ.

Author
mdejong

Definition in file JMatrixNZ.cc.

Function Documentation

◆ main()

int main ( int  argc,
char **  argv 
)

Definition at line 58 of file JMatrixNZ.cc.

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 }
string outputFile
TPaveText * p1
#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
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2142
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
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
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
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
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.
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