Jpp  17.3.0
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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

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 JPosition3D center = get<JPosition3D>(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 
158  JTriggeredFileScanner<>::multi_pointer_type ps = inputFile.next();
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(center);
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 }
Router for direct addressing of PMT data in detector data structure.
Definition: JPMTRouter.hh:35
Data structure for angles in three dimensions.
Definition: JAngle3D.hh:33
Utility class to parse command line options.
Definition: JParser.hh:1517
General exception.
Definition: JException.hh:23
1D match criterion.
Definition: JMatch1D.hh:31
static struct JTRIGGER::clusterizeWeight clusterizeWeight
TPaveText * p1
void set(const JVector3D &pos, T __begin, T __end, const double alpha, const double sigma)
Set co-variance matrix.
Definition: JMatrixNZ.hh:85
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
static double getDot(const variance &first, const variance &second)
Get dot product.
Definition: JMatrixNZ.hh:196
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:89
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
Router for direct addressing of module data in detector data structure.
Rotation matrix.
Definition: JRotation3D.hh:111
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
then JShowerPostfit f $INPUT_FILE o $OUTPUT_FILE N
JVertex3D & add(const JVertex3D &value)
Addition operator.
Definition: JVertex3D.hh:87
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
then fatal Wrong number of arguments fi set_variable STRING $argv[1] set_variable DETECTORXY_TXT $WORKDIR $DETECTORXY_TXT tail read X Y CHI2 RMS printf optimum n $X $Y $CHI2 $RMS awk v Y
double getTime(const Hit &hit)
Get true time of hit.
void update(const size_t k, const double value)
Update inverted matrix at given diagonal element.
Definition: JMatrixNS.hh:457
V(JDAQEvent-JTriggerReprocessor)*1.0/(JDAQEvent+1.0e-10)
string outputFile
bool is_noise(const Hit &hit)
Verify hit origin.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
int first
index of module in detector data structure
const int n
Definition: JPolint.hh:697
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
Template L2 builder.
Definition: JBuildL2.hh:45
Determination of the time residual vector of hits for a track along z-axis (JFIT::JLine1Z).
Definition: JVectorNZ.hh:21
Detector file.
Definition: JHead.hh:226
JDirection3D getDirection(const Vec &dir)
Get direction.
Data structure for vector in three dimensions.
Definition: JVector3D.hh:34
Determination of the co-variance matrix of hits for a track along z-axis (JFIT::JLine1Z).
Definition: JMatrixNZ.hh:28
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1993
Data structure for PMT geometry, calibration and status.
Definition: JPMT.hh:43
JPosition3D getPosition(const Vec &pos)
Get position.
static const double PI
Mathematical constants.
void set(const JLine1Z &track, T __begin, T __end)
Set time residual vector.
Definition: JVectorNZ.hh:68
#define FATAL(A)
Definition: JMessage.hh:67
void invert()
Invert matrix according LDU decomposition.
Definition: JMatrixNS.hh:80
size_t size() const
Get dimension of matrix.
Definition: JMatrixND.hh:177
Data structure for L2 parameters.
then JCookie sh JDataQuality D $DETECTOR_ID R
Definition: JDataQuality.sh:41
const double getSpeedOfLight()
Get speed of light.
Address of PMT in detector data structure.
Definition: JPMTAddress.hh:32
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Data structure for L0 hit.
Definition: JHitL0.hh:27
then if[[!-f $DETECTOR]] then JDetector sh $DETECTOR fi cat $WORKDIR trigger_parameters txt<< EOFtrigger3DMuon.enabled=1;trigger3DMuon.numberOfHits=5;trigger3DMuon.gridAngle_deg=1;ctMin=0.0;TMaxLocal_ns=15.0;EOF set_variable TRIGGEREFFICIENCY_TRIGGERED_EVENTS_ONLY INPUT_FILES=() for((i=1;$i<=$NUMBER_OF_RUNS;++i));do JSirene.sh $DETECTOR $JPP_DATA/genhen.km3net_wpd_V2_0.evt.gz $WORKDIR/sirene_ ${i}.root JTriggerEfficiency.sh $DETECTOR $DETECTOR $WORKDIR/sirene_ ${i}.root $WORKDIR/trigger_efficiency_ ${i}.root $WORKDIR/trigger_parameters.txt $JPP_DATA/PMT_parameters.txt INPUT_FILES+=($WORKDIR/trigger_efficiency_ ${i}.root) done for ANGLE_DEG in $ANGLES_DEG[*];do set_variable SIGMA_NS 3.0 set_variable OUTLIERS 3 set_variable OUTPUT_FILE $WORKDIR/matrix\[${ANGLE_DEG}\deg\].root $JPP_DIR/examples/JReconstruction-f"$INPUT_FILES[*]"-o $OUTPUT_FILE-S ${SIGMA_NS}-A ${ANGLE_DEG}-O ${OUTLIERS}-d ${DEBUG}--!fiif[[$OPTION=="plot"]];then if((0));then for H1 in h0 h1;do JPlot1D-f"$WORKDIR/matrix["${^ANGLES_DEG}" deg].root:${H1}"-y"1 2e3"-Y-L TR-T""-\^"number of events [a.u.]"-> o chi2
Definition: JMatrixNZ.sh:106
Data structure for fit of straight line paralel to z-axis.
Definition: JLine1Z.hh:27
no fit printf nominal n $STRING awk v X
Data structure for position in three dimensions.
Definition: JPosition3D.hh:36
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
do set_variable DETECTOR_TXT $WORKDIR detector
General purpose class for multiple pointers.
double getChi2(const double P)
Get chi2 corresponding to given probability.
Definition: JFitToolkit.hh:56
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Definition: JPosition3D.hh:186
int debug
debug level
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:20
3D match criterion with road width.
Definition: JMatch3B.hh:34
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62