Jpp  15.0.1-rc.1-highqe
the software that should make you happy
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Functions
JCalibrateMuon.cc File Reference

Program to perform detector calibration using reconstructed muon trajectories. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <vector>
#include <set>
#include <algorithm>
#include <memory>
#include "TROOT.h"
#include "TFile.h"
#include "TProfile.h"
#include "TH2D.h"
#include "km3net-dataformat/offline/Head.hh"
#include "km3net-dataformat/offline/Evt.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 "JDynamics/JDynamics.hh"
#include "JLang/JPredicate.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/JSupport.hh"
#include "JSupport/JParallelFileScanner.hh"
#include "JSupport/JSummaryFileRouter.hh"
#include "JSupport/JMeta.hh"
#include "JReconstruction/JEvt.hh"
#include "JReconstruction/JMuonGandalf.hh"
#include "JReconstruction/JMuonGandalfParameters_t.hh"
#include "JTools/JAbstractHistogram.hh"
#include "JROOT/JRootToolkit.hh"
#include "JROOT/JManager.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 detector calibration using reconstructed muon trajectories.

It is recommended to perform the detector calibration after JMuonGandalf.cc and to accordingly set option JMuonGandalfParameters_t::numberOfPrefits = 1, so that the best track from the previous output is used. Several histograms will be produced which can subsequently be processed with JHobbit.cc for the determination of the time calibration of optical modules and JFrodo.cc for the time-slewing correction.

Author
mdejong

Definition in file JCalibrateMuon.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 66 of file JCalibrateMuon.cc.

67 {
68  using namespace std;
69  using namespace JPP;
70  using namespace KM3NETDAQ;
71 
72  typedef JParallelFileScanner< JTypeList<JDAQEvent, JFIT::JEvt> > JParallelFileScanner_t;
73  typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
75  JACOUSTICS::JEvt>::typelist calibration_types;
76  typedef JMultipleFileScanner<calibration_types> JCalibration_t;
77  typedef JAbstractHistogram<double> histogram_type;
78 
79  JParallelFileScanner_t inputFile;
80  string outputFile;
81  JLimit_t& numberOfEvents = inputFile.getLimit();
82  string detectorFile;
83  JCalibration_t calibrationFile;
84  double Tmax_s;
85  string pdfFile;
87  histogram_type calibrate;
88  int debug;
89 
90  try {
91 
92  parameters.numberOfPrefits = 1;
93 
94  JParser<> zap("Program to perform detector calibration using reconstructed muon trajectories.");
95 
96  zap['f'] = make_field(inputFile);
97  zap['o'] = make_field(outputFile) = "gandalf.root";
98  zap['a'] = make_field(detectorFile);
99  zap['+'] = make_field(calibrationFile) = JPARSER::initialised();
100  zap['T'] = make_field(Tmax_s) = 100.0;
101  zap['n'] = make_field(numberOfEvents) = JLimit::max();
102  zap['P'] = make_field(pdfFile);
103  zap['c'] = make_field(calibrate, "Histogram for time calibration per optical module.");
105  zap['d'] = make_field(debug) = 1;
106 
107  zap(argc, argv);
108  }
109  catch(const exception& error) {
110  FATAL(error.what() << endl);
111  }
112 
113  cout.tie(&cerr);
114 
115  if (!calibrate.is_valid()) {
116  FATAL("Invalid calibration data " << calibrate << endl);
117  }
118 
119  if (parameters.numberOfPrefits != 1) {
120  WARNING("Number of prefits " << parameters.numberOfPrefits << " != " << 1 << endl);
121  }
122 
124 
125  try {
126  load(detectorFile, detector);
127  }
128  catch(const JException& error) {
129  FATAL(error);
130  }
131 
132 
133  getMechanics.load(detector.getID());
134 
135  unique_ptr<JDynamics> dynamics;
136 
137  try {
138 
139  dynamics.reset(new JDynamics(detector, Tmax_s));
140 
141  dynamics->load(calibrationFile);
142  }
143  catch(const exception& error) {
144  if (!calibrationFile.empty()) {
145  FATAL(error.what());
146  }
147  }
148 
149  const JModuleRouter router(dynamics ? dynamics->getDetector() : detector);
150 
151  JSummaryFileRouter summary(inputFile, parameters.R_Hz);
152 
153  JMuonGandalf fit(parameters, router, summary, pdfFile, debug);
154 
155  typedef vector<JHitL0> JDataL0_t;
156  typedef vector<JHitW0> JDataW0_t;
157 
158  const JBuildL0<JHitL0> buildL0;
159 
160 
161  typedef JManager<string, TProfile> JManager_t;
162 
163  TH2D ha("ha", NULL, 256, -0.5, 255.5,
164  calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
165 
166  TProfile hb("hb", NULL, 256, -0.5, 255.5);
167 
168  TProfile hr("hr", NULL, 60, 0.0, 150.0);
169 
170  TH2D h2("h2", NULL, detector.size(), -0.5, detector.size() - 0.5,
171  calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
172 
173  JManager_t g1(new TProfile("%", NULL, detector.size(), -0.5, detector.size() - 0.5, -1.0, +1.0));
174 
175 
176  while (inputFile.hasNext()) {
177 
178  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
179 
180  multi_pointer_type ps = inputFile.next();
181 
182  JDAQEvent* tev = ps;
183  JFIT::JEvt* in = ps;
184 
185  summary.update(*tev);
186 
187  if (dynamics) {
188  dynamics->update(*tev);
189  }
190 
191  in->select(parameters.numberOfPrefits, qualitySorter);
192 
193  JDataL0_t dataL0;
194 
195  buildL0(*tev, router, true, back_inserter(dataL0));
196 
197  for (JFIT::JEvt::const_iterator track = in->begin(); track != in->end(); ++track) {
198 
199  const JRotation3D R (getDirection(*track));
200  const JLine1Z tz(getPosition (*track).rotate(R), track->getT());
201  JRange<double> Z_m;
202 
203  if (track->hasW(JSTART_LENGTH_METRES)) {
204  Z_m = JZRange(0.0, track->getW(JSTART_LENGTH_METRES)) + JRange<double>(parameters.ZMin_m, parameters.ZMax_m);
205  }
206 
207  const JFIT::JModel<JLine1Z> match(tz, parameters.roadWidth_m, JRange<double>(parameters.TMin_ns, parameters.TMax_ns), Z_m);
208 
209  // hit selection based on start value
210 
211  JDataW0_t data;
212 
213  for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
214 
215  double rate_Hz = summary.getRate(*i);
216 
217  if (rate_Hz <= 0.0) {
218  rate_Hz = summary.getRate();
219  }
220 
221  JHitW0 hit(*i, rate_Hz);
222 
223  hit.rotate(R);
224 
225  if (match(hit)) {
226  data.push_back(hit);
227  }
228  }
229 
230  // select first hit
231 
232  sort(data.begin(), data.end(), JHitL0::compare);
233 
234  JDataW0_t::iterator __end = unique(data.begin(), data.end(), equal_to<JDAQPMTIdentifier>());
235 
236 
237  // set fit parameters
238 
239  if (track->getE() > 0.1)
240  fit.JRegressor_t::E_GeV = track->getE();
241  else
242  fit.JRegressor_t::E_GeV = parameters.E_GeV;
243 
244  set<int> buffer;
245 
246  for (JDataW0_t::const_iterator hit = data.begin(); hit != __end; ++hit) {
247  buffer.insert(hit->getModuleID());
248  }
249 
250  const JLine3Z ta(tz);
251 
252  for (set<int>::const_iterator id = buffer.begin(); id != buffer.end(); ++id) {
253 
254  JDataW0_t::iterator q = partition(data.begin(), __end, make_predicate(&JHitW0::getModuleID, *id, JComparison::ne()));
255 
256  if (distance(data.begin(), q) - fit.parameters.size() > 0) {
257 
258  fit(ta, data.begin(), q); // re-fit
259 
260  for (JDataW0_t::const_iterator hit = q; hit != __end; ++hit) {
261 
262  const int index = router.getIndex(*id);
263  const double t1 = fit.value.getT(hit->getPosition());
264  JTrack3D gradient = fit(fit.value, *hit).gradient;
265 
266  gradient.rotate_back(R);
267 
268  ha.Fill(hit->getToT(), hit->getT1() - t1);
269  hb.Fill(hit->getToT(), gradient.getT());
270 
271  hr.Fill(fit.value.getDistance(*hit), gradient.getT());
272 
273  h2.Fill(index, hit->getT() - t1);
274 
275  g1["T"]->Fill(index, gradient.getT());
276  g1["X"]->Fill(index, gradient.getX());
277  g1["Y"]->Fill(index, gradient.getY());
278  g1["Z"]->Fill(index, gradient.getZ());
279  }
280  }
281  }
282  }
283  }
284  STATUS(endl);
285 
286  TFile out(outputFile.c_str(), "recreate");
287 
288  putObject(out, JMeta(argc, argv));
289 
290  out << ha;
291  out << hb;
292  out << hr;
293  out << h2;
294  out << g1;
295 
296  out.Write();
297  out.Close();
298 }
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:70
Utility class to parse command line options.
Definition: JParser.hh:1500
General exception.
Definition: JException.hh:23
#define WARNING(A)
Definition: JMessage.hh:65
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
Definition: JPredicate.hh:128
static JDetectorMechanics getMechanics
Function object to get string mechanics.
Definition: JMechanics.hh:243
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
Template specialisation of L0 builder for JHitL0 data type.
Definition: JBuildL0.hh:102
#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
*fatal Wrong number of arguments esac JCookie sh typeset Z DETECTOR typeset Z SOURCE_RUN typeset Z TARGET_RUN set_variable PARAMETERS_FILE $WORKDIR parameters
Definition: diff-Tuna.sh:38
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
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:66
Data structure for fit of straight line in positive z-direction.
Definition: JLine3Z.hh:36
Simple data structure for histogram binning.
string outputFile
Wrapper class to make final fit of muon trajectory.
Definition: JMuonGandalf.hh:72
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
Auxiliary class to manage set of compatible ROOT objects (e.g. histograms) using unique keys...
Definition: JManager.hh:43
Detector file.
Definition: JHead.hh:196
JDirection3D getDirection(const Vec &dir)
Get direction.
Acoustic event fit.
Auxiliary class for recursive type list generation.
Definition: JTypeList.hh:351
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
JPosition3D getPosition(const Vec &pos)
Get position.
JAxis3D & rotate_back(const JRotation3D &R)
Rotate back axis.
Definition: JAxis3D.hh:240
File router for fast addressing of summary data.
double getY() const
Get y position.
Definition: JVector3D.hh:104
void load(const std::string &file_name)
Load mechanical model parameters from file.
Definition: JMechanics.hh:142
int debug
debug level
Definition: JSirene.cc:63
bool putObject(TDirectory &dir, const TObject &object)
Write object to ROOT directory.
then usage $script[distance] fi case set_variable R
Definition: JDrawLED.sh:43
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Definition: JTrack3D.hh:126
#define FATAL(A)
Definition: JMessage.hh:67
Dynamic detector calibration.
Definition: JDynamics.hh:61
Auxiliary class for a hit with background rate value.
Definition: JHitW0.hh:21
static const int JSTART_LENGTH_METRES
distance between first and last hits in metres from JStart.cc
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
Data structure for set of track fit results.
General purpose class for object reading from a list of file names.
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
Data structure for fit of straight line paralel to z-axis.
Definition: JLine1Z.hh:27
double getX() const
Get x position.
Definition: JVector3D.hh:94
Orientation of module.
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
do set_variable DETECTOR_TXT $WORKDIR detector
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 source JAcoustics sh $DETECTOR_ID CHECK_EXIT_CODE typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:41
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Definition: JPosition3D.hh:186
void select(const JSelector_t &selector)
Select fits.
double getZ() const
Get z position.
Definition: JVector3D.hh:115
JTOOLS::JRange< double > JZRange
Definition: JFit/JModel.hh:21
then usage $script< detector file >< tripodfile >< stage > input file nInput files correspond to the output of JAcousticsEventBuilder[.sh] nFirst stage eval JPrintDetector a $DETECTOR O IDENTIFIER eval JPrintDetector a $DETECTOR O SUMMARY eval JPrintDetector a $DETECTOR O CAN source JAcoustics sh $DETECTOR_ID typeset A CONFIGURATION for key in Tmax_s
Double_t g1(const Double_t x)
Function.
Definition: JQuantiles.cc:25