Jpp  18.5.2
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JMuonPath.cc File Reference

Program to perform JFIT::JRegressor<JLine3Z,JGandalf> fit with I/O of JFIT::JEvt data. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/MultiHead.hh"
#include "km3net-dataformat/offline/Evt.hh"
#include "km3net-dataformat/definitions/fitparameters.hh"
#include "JDAQ/JDAQEventIO.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JDAQ/JDAQSummarysliceIO.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JTrigger/JHit.hh"
#include "JTrigger/JFrame.hh"
#include "JTrigger/JTimeslice.hh"
#include "JTrigger/JHitL0.hh"
#include "JTrigger/JBuildL0.hh"
#include "JTrigger/JTriggerParameters.hh"
#include "JSupport/JSingleFileScanner.hh"
#include "JSupport/JParallelFileScanner.hh"
#include "JSupport/JFileRecorder.hh"
#include "JSupport/JSupport.hh"
#include "JSupport/JMeta.hh"
#include "JFit/JPMTW0.hh"
#include "JFit/JLine3Z.hh"
#include "JFit/JGandalf.hh"
#include "JFit/JLine3ZRegressor.hh"
#include "JFit/JFitToolkit.hh"
#include "JFit/JModel.hh"
#include "JReconstruction/JHitW0.hh"
#include "JReconstruction/JEvt.hh"
#include "JReconstruction/JEvtToolkit.hh"
#include "JPhysics/JConstants.hh"
#include "JTools/JFunction1D_t.hh"
#include "JTools/JFunctionalMap_t.hh"
#include "JPhysics/JPDFTable.hh"
#include "JPhysics/JPDFToolkit.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

Program to perform JFIT::JRegressor<JLine3Z,JGandalf> fit with I/O of JFIT::JEvt data.

Author
mdejong

Definition in file JMuonPath.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 62 of file JMuonPath.cc.

63 {
64  using namespace std;
65  using namespace JPP;
66  using namespace KM3NETDAQ;
67 
68  typedef JParallelFileScanner< JTypeList<JDAQEvent, JEvt> > JParallelFileScanner_t;
69  typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
71 
72  JParallelFileScanner_t inputFile;
74  JLimit_t& numberOfEvents = inputFile.getLimit();
75  string detectorFile;
76  string pdfFile;
77  double roadWidth_m;
78  double R_Hz;
79  size_t numberOfPrefits;
80  double TTS_ns;
81  double E_GeV;
82  int debug;
83 
84  try {
85 
86  JParser<> zap("Program to perform fit of muon path to data.");
87 
88  zap['f'] = make_field(inputFile);
89  zap['o'] = make_field(outputFile) = "path.root";
90  zap['a'] = make_field(detectorFile);
91  zap['n'] = make_field(numberOfEvents) = JLimit::max();
92  zap['P'] = make_field(pdfFile);
93  zap['R'] = make_field(roadWidth_m) = numeric_limits<double>::max();
94  zap['B'] = make_field(R_Hz) = 6.0e3;
95  zap['N'] = make_field(numberOfPrefits) = 1;
96  zap['T'] = make_field(TTS_ns);
97  zap['E'] = make_field(E_GeV) = 1.0e3;
98  zap['d'] = make_field(debug) = 1;
99 
100  zap(argc, argv);
101  }
102  catch(const exception& error) {
103  FATAL(error.what() << endl);
104  }
105 
106 
108 
109  try {
110  load(detectorFile, detector);
111  }
112  catch(const JException& error) {
113  FATAL(error);
114  }
115 
116  const JModuleRouter router(detector);
117 
118 
119  typedef vector<JHitL0> JDataL0_t;
120  const JBuildL0<JHitL0> buildL0;
121 
122 
124 
126  JRegressor_t::T_ns.setRange(-50.0, +50.0); // ns
127  JRegressor_t::Vmax_npe = 10.0; // npe
128  JRegressor_t::MAXIMUM_ITERATIONS = 10000;
129 
130  JRegressor_t fit(pdfFile, TTS_ns);
131 
132  fit.transform(JRegressor_t::transformer_type::getDefaultTransformer()); // get rid of R-dependent weight function
133 
134  fit.estimator.reset(new JMEstimatorLorentzian());
135 
136  fit.parameters.resize(4);
137 
138  fit.parameters[0] = JLine3Z::pX();
139  fit.parameters[1] = JLine3Z::pY();
140  fit.parameters[2] = JLine3Z::pDX();
141  fit.parameters[3] = JLine3Z::pDY();
142 
143  if (fit.getRmax() < roadWidth_m) {
144 
145  roadWidth_m = fit.getRmax();
146 
147  WARNING("Set road width to [m] " << roadWidth_m << endl);
148  }
149 
150  const double Rmax_m = 100.0; // hit selection [m]
151  const double Tmax_ns = 10.0; // hit selection [ns]
152 
153 
154  outputFile.open();
155 
156  outputFile.put(JMeta(argc, argv));
157 
158  while (inputFile.hasNext()) {
159 
160  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
161 
162  multi_pointer_type ps = inputFile.next();
163 
164  const JDAQEvent* tev = ps;
165  const JEvt* in = ps;
166 
167  JEvt cp = *in;
168  JEvt out;
169 
170  cp.select(numberOfPrefits, qualitySorter);
171 
172 
173  JDataL0_t dataL0;
174 
175  buildL0(*tev, router, true, back_inserter(dataL0));
176 
177 
178  for (JEvt::const_iterator track = cp.begin(); track != cp.end(); ++track) {
179 
180  const JRotation3D R (getDirection(*track));
181  const JLine1Z tz(getPosition (*track).rotate(R), track->getT());
182  const JModel<JLine1Z> match(tz, roadWidth_m, JRegressor_t::T_ns);
183 
184  // hit selection based on start value
185 
187 
189 
190  for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
191 
192  JHitW0 hit(*i, R_Hz);
193 
194  hit.rotate(R);
195 
196  if (match(hit)) {
197 
198  top.insert(hit.getPMTIdentifier());
199 
200  const double t1 = hit.getT() - tz.getT(hit);
201 
202  if (tz.getDistance(hit) <= Rmax_m && t1 >= -Tmax_ns && t1 <= +Tmax_ns) {
203  Z.include(hit.getZ() - tz.getDistance(hit) / getTanThetaC());
204  }
205  }
206  }
207 
208 
209  vector<JPMTW0> buffer;
210 
211  for (JDetector::const_iterator module = detector.begin(); module != detector.end(); ++module) {
212 
213  JPosition3D pos(module->getPosition());
214 
215  pos.rotate(R);
216 
217  if (tz.getDistance(pos) <= roadWidth_m && Z(pos.getZ() - tz.getDistance(pos) / getTanThetaC())) {
218 
219  for (unsigned int i = 0; i != module->size(); ++i) {
220 
221  const JDAQPMTIdentifier id(module->getID(), i);
222 
223  JPMT pmt(module->getPMT(i));
224 
225  pmt.rotate(R);
226 
227  buffer.push_back(JPMTW0(pmt, R_Hz, top.count(id)));
228  }
229  }
230  }
231 
232 
233  const int NDF = buffer.size() - fit.parameters.size();
234 
235  if (NDF >= 0) {
236 
237  // set fit parameters
238 
239  if (track->getE() > 0.1)
240  fit.E_GeV = track->getE();
241  else
242  fit.E_GeV = E_GeV;
243 
244  const double chi2 = fit(JLine3Z(tz), buffer.begin(), buffer.end());
245 
246  JTrack3D tb(fit.value);
247 
248  tb.rotate_back(R);
249 
250  out.push_back(getFit(JMUONPATH, tb, getQuality(chi2), NDF));
251 
252  out.rbegin()->setW(track->getW());
253  }
254  }
255 
256  // apply default sorter
257 
258  sort(out.begin(), out.end(), qualitySorter);
259 
260  outputFile.put(out);
261  }
262  STATUS(endl);
263 
265 
266  io >> outputFile;
267 
268  outputFile.close();
269 }
Template definition of a data regressor of given model.
Definition: JRegressor.hh:70
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Object writing to file.
Utility class to parse command line options.
Definition: JParser.hh:1514
General exception.
Definition: JException.hh:24
#define WARNING(A)
Definition: JMessage.hh:65
static const int JMUONPATH
double getQuality(const double chi2, const int NDF)
Get quality of fit.
range_type & include(argument_type x)
Include given value to range.
Definition: JRange.hh:397
Template specialisation of L0 builder for JHitL0 data type.
Definition: JBuildL0.hh:102
Auxiliary class for handling PMT geometry, rate and response.
Definition: JPMTW0.hh:22
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:89
Router for direct addressing of module data in detector data structure.
Rotation matrix.
Definition: JRotation3D.hh:111
General purpose class for parallel reading of objects from a single file or multiple files...
Template specialisation of class JModel to match hit with muon trajectory along z-axis.
Definition: JFit/JModel.hh:34
Data structure for fit of straight line in positive z-direction.
Definition: JLine3Z.hh:36
string outputFile
JFIT::JRegressor< JFIT::JLine3Z, JFIT::JGandalf > JRegressor_t
Definition: JPerth.cc:132
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
Type list.
Definition: JTypeList.hh:22
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
JAxis3D & rotate(const JRotation3D &R)
Rotate axis.
Definition: JAxis3D.hh:225
Detector file.
Definition: JHead.hh:226
JDirection3D getDirection(const Vec &dir)
Get direction.
Acoustic event fit.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1989
Data structure for PMT geometry, calibration and status.
Definition: JPMT.hh:43
JPosition3D getPosition(const Vec &pos)
Get position.
#define FATAL(A)
Definition: JMessage.hh:67
then JCookie sh JDataQuality D $DETECTOR_ID R
Definition: JDataQuality.sh:41
Auxiliary class for a hit with background rate value.
Definition: JHitW0.hh:21
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
JFit getFit(const int id, const JMODEL::JString &string)
Get fit parameters of string.
Regressor function object for JLine3Z fit using JGandalf minimiser.
then fatal Wrong number of arguments fi set_variable DETECTOR $argv[1] set_variable INPUT_FILE $argv[2] eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY JAcoustics sh $DETECTOR_ID source JAcousticsToolkit sh CHECK_EXIT_CODE typeset A EMITTERS get_tripods $WORKDIR tripod txt EMITTERS get_transmitters $WORKDIR transmitter txt EMITTERS for EMITTER in
Definition: JCanberra.sh:48
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
then cp
double getTanThetaC()
Get average tangent of Cherenkov angle of water corresponding to group velocity.
do set_variable MODULE getModule a $WORKDIR detector_a datx L $STRING JEditDetector a $WORKDIR detector_a datx M $MODULE setz o $WORKDIR detector_a datx JEditDetector a $WORKDIR detector_b datx M $MODULE setz o $WORKDIR detector_b datx done echo Output stored at $WORKDIR detector_a datx and $WORKDIR tripod_a txt JDrawDetector2D a $WORKDIR detector_a datx a $WORKDIR detector_b datx L BL o detector $FORMAT $BATCH JDrawDetector2D T $WORKDIR tripod_a txt T $WORKDIR tripod_b txt L BL o tripod $FORMAT $BATCH JCompareDetector a $WORKDIR detector_a datx b $WORKDIR detector_b datx o $WORKDIR abc root &dev null for KEY in X Y Z
Object reading from a list of files.
Data structure for position in three dimensions.
Definition: JPosition3D.hh:36
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:84
do set_variable DETECTOR_TXT $WORKDIR detector
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Definition: JPosition3D.hh:186
Lorentzian M-estimator.
Definition: JMEstimator.hh:65
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62