Jpp
 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 "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 "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 63 of file JCalibrateMuon.cc.

64 {
65  using namespace std;
66  using namespace JPP;
67  using namespace KM3NETDAQ;
68 
69  typedef JParallelFileScanner< JTypeList<JDAQEvent, JEvt> > JParallelFileScanner_t;
70  typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
71  typedef JAbstractHistogram<double> histogram_type;
72 
73  JParallelFileScanner_t inputFile;
74  string outputFile;
75  JLimit_t& numberOfEvents = inputFile.getLimit();
76  string detectorFile;
77  string pdfFile;
79  histogram_type calibrate;
80  int debug;
81 
82  try {
83 
84  parameters.numberOfPrefits = 1;
85 
86  JParser<> zap("Program to perform detector calibration using reconstructed muon trajectories.");
87 
88  zap['f'] = make_field(inputFile);
89  zap['o'] = make_field(outputFile) = "gandalf.root";
90  zap['a'] = make_field(detectorFile);
91  zap['n'] = make_field(numberOfEvents) = JLimit::max();
92  zap['P'] = make_field(pdfFile);
93  zap['c'] = make_field(calibrate, "Histogram for time calibration per optical module.");
95  zap['d'] = make_field(debug) = 1;
96 
97  zap(argc, argv);
98  }
99  catch(const exception& error) {
100  FATAL(error.what() << endl);
101  }
102 
103  cout.tie(&cerr);
104 
105  if (!calibrate.is_valid()) {
106  FATAL("Invalid calibration data " << calibrate << endl);
107  }
108 
109  if (parameters.numberOfPrefits != 1) {
110  WARNING("Number of prefits " << parameters.numberOfPrefits << " != " << 1 << endl);
111  }
112 
114 
115  try {
116  load(detectorFile, detector);
117  }
118  catch(const JException& error) {
119  FATAL(error);
120  }
121 
122  const JModuleRouter router(detector);
123 
124  JSummaryFileRouter summary(inputFile, parameters.R_Hz);
125 
126  JMuonGandalf fit(parameters, router, summary, pdfFile, debug);
127 
128  typedef vector<JHitL0> JDataL0_t;
129  typedef vector<JHitW0> JDataW0_t;
130 
131  const JBuildL0<JHitL0> buildL0;
132 
133 
134  typedef JManager<string, TProfile> JManager_t;
135 
136  TH2D ha("ha", NULL, 256, -0.5, 255.5,
137  calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
138 
139  TProfile hb("hb", NULL, 256, -0.5, 255.5);
140 
141  TProfile hr("hr", NULL, 60, 0.0, 150.0);
142 
143  TH2D h2("h2", NULL, detector.size(), -0.5, detector.size() - 0.5,
144  calibrate.getNumberOfBins(), calibrate.getLowerLimit(), calibrate.getUpperLimit());
145 
146  JManager_t g1(new TProfile("%", NULL, detector.size(), -0.5, detector.size() - 0.5, -1.0, +1.0));
147 
148 
149  while (inputFile.hasNext()) {
150 
151  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
152 
153  multi_pointer_type ps = inputFile.next();
154 
155  JDAQEvent* tev = ps;
156  JEvt* in = ps;
157 
158  summary.update(*tev);
159 
160  in->select(parameters.numberOfPrefits, qualitySorter);
161 
162  JDataL0_t dataL0;
163 
164  buildL0(*tev, router, true, back_inserter(dataL0));
165 
166  for (JEvt::const_iterator track = in->begin(); track != in->end(); ++track) {
167 
168  const JRotation3D R (getDirection(*track));
169  const JLine1Z tz(getPosition (*track).rotate(R), track->getT());
170  JRange<double> Z_m;
171 
172  if (track->hasW(JSTART_LENGTH_METRES)) {
173  Z_m = JZRange(0.0, track->getW(JSTART_LENGTH_METRES)) + JRange<double>(parameters.ZMin_m, parameters.ZMax_m);
174  }
175 
176  const JModel<JLine1Z> match(tz, parameters.roadWidth_m, JRange<double>(parameters.TMin_ns, parameters.TMax_ns), Z_m);
177 
178  // hit selection based on start value
179 
180  JDataW0_t data;
181 
182  for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
183 
184  double rate_Hz = summary.getRate(*i);
185 
186  if (rate_Hz <= 0.0) {
187  rate_Hz = summary.getRate();
188  }
189 
190  JHitW0 hit(*i, rate_Hz);
191 
192  hit.rotate(R);
193 
194  if (match(hit)) {
195  data.push_back(hit);
196  }
197  }
198 
199  // select first hit
200 
201  sort(data.begin(), data.end(), JMuonGandalf::compare);
202 
203  JDataW0_t::iterator __end = unique(data.begin(), data.end(), equal_to<JDAQPMTIdentifier>());
204 
205 
206  // set fit parameters
207 
208  if (track->getE() > 0.1)
209  fit.JRegressor_t::E_GeV = track->getE();
210  else
211  fit.JRegressor_t::E_GeV = parameters.E_GeV;
212 
213  set<int> buffer;
214 
215  for (JDataW0_t::const_iterator hit = data.begin(); hit != __end; ++hit) {
216  buffer.insert(hit->getModuleID());
217  }
218 
219  const JLine3Z ta(tz);
220 
221  for (set<int>::const_iterator id = buffer.begin(); id != buffer.end(); ++id) {
222 
223  JDataW0_t::iterator q = partition(data.begin(), __end, make_predicate(&JHitW0::getModuleID, *id, JComparison::ne()));
224 
225  if (distance(data.begin(), q) - fit.parameters.size() > 0) {
226 
227  fit(ta, data.begin(), q); // re-fit
228 
229  sort(q, __end, JMuonGandalf::compare); // select first hit in module
230 
231  const int index = router.getIndex(*id);
232  const double t1 = fit.value.getT(q->getPosition());
233  JTrack3D gradient = fit(fit.value, *q).gradient;
234 
235  gradient.rotate_back(R);
236 
237  ha.Fill(q->getToT(), q->getT1() - t1);
238  hb.Fill(q->getToT(), gradient.getT());
239 
240  hr.Fill(fit.value.getDistance(*q), gradient.getT());
241 
242  h2.Fill(index, q->getT() - t1);
243 
244  g1["T"]->Fill(index, gradient.getT());
245  g1["X"]->Fill(index, gradient.getX());
246  g1["Y"]->Fill(index, gradient.getY());
247  g1["Z"]->Fill(index, gradient.getZ());
248  }
249  }
250  }
251  }
252  STATUS(endl);
253 
254  TFile out(outputFile.c_str(), "recreate");
255 
256  putObject(&out, JMeta(argc, argv));
257 
258  out << ha;
259  out << hb;
260  out << hr;
261  out << h2;
262  out << g1;
263 
264  out.Write();
265  out.Close();
266 }
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
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:80
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
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.
#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
int debug
debug level
Definition: JSirene.cc:63
then usage $script[distance] fi case set_variable R
Definition: JDrawLED.sh:40
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
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 fit of straight line paralel to z-axis.
Definition: JLine1Z.hh:27
double getX() const
Get x position.
Definition: JVector3D.hh:94
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 typeset A TRIPODS get_tripods $WORKDIR tripod txt TRIPODS for EMITTER in
Definition: JCanberra.sh:36
JPosition3D & rotate(const JRotation3D &R)
Rotate.
Definition: JPosition3D.hh:186
double getZ() const
Get z position.
Definition: JVector3D.hh:115
JTOOLS::JRange< double > JZRange
Definition: JFit/JModel.hh:21
bool qualitySorter(const JRECONSTRUCTION::JFit &first, const JRECONSTRUCTION::JFit &second)
Comparison of fit results.
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
bool putObject(TDirectory *dir, const T &object)
Write object to ROOT directory.
Double_t g1(const Double_t x)
Function.
Definition: JQuantiles.cc:25