Jpp
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
JConvertEvt.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 #include <algorithm>
6 
7 #include "TROOT.h"
8 #include "TFile.h"
9 
13 
14 #include "JDetector/JDetector.hh"
16 #include "JDetector/JPMTRouter.hh"
20 
21 #include "JTrigger/JHit.hh"
22 #include "JTrigger/JHitToolkit.hh"
23 
24 #include "JAAnet/JHead.hh"
25 #include "JAAnet/JHeadToolkit.hh"
26 #include "JAAnet/JAAnetToolkit.hh"
27 
28 #include "JDAQ/JDAQEventIO.hh"
30 
32 #include "JSupport/JTreeScanner.hh"
36 #include "JSupport/JSupport.hh"
37 #include "JSupport/JMeta.hh"
38 
39 #include "JReconstruction/JEvt.hh"
41 
42 #include "Jeep/JeepToolkit.hh"
43 #include "Jeep/JParser.hh"
44 #include "Jeep/JMessage.hh"
45 
46 
47 /**
48  * \file
49  * Auxiliary program to convert fit results to AAnet format.
50  *
51  * \author mdejong
52  */
53 int main(int argc, char **argv)
54 {
55  using namespace std;
56  using namespace JPP;
57  using namespace KM3NETDAQ;
58 
59  JMultipleFileScanner<> inputFile;
61  JLimit_t& numberOfEvents = inputFile.getLimit();
62  string detectorFile;
63  JPMTParametersMap pmtParameters;
65  size_t numberOfFits;
66  int debug;
67 
68  try {
69 
70  JParser<> zap("Auxiliary program to convert fit results to AAnet format.\
71  \nThe option -L corresponds to the name of a shared library \
72  \nand function so to rearrange the order of fit results.");
73 
74  zap['f'] = make_field(inputFile);
75  zap['o'] = make_field(outputFile) = "aanet.root";
76  zap['n'] = make_field(numberOfEvents) = JLimit::max();
77  zap['a'] = make_field(detectorFile) = "";
78  zap['P'] = make_field(pmtParameters, "PMT simulation data (or corresponding file name)") = JPARSER::initialised();
80  zap['N'] = make_field(numberOfFits) = 0;
81  zap['d'] = make_field(debug) = 2;
82 
83  zap(argc, argv);
84  }
85  catch(const exception& error) {
86  FATAL(error.what() << endl);
87  }
88 
89 
90  typedef JParallelFileScanner< JTypeList<JDAQEvent, JEvt> > JParallelFileScanner_t;
91  typedef JParallelFileScanner_t::multi_pointer_type multi_pointer_type;
92 
93 
95 
96  if (detectorFile != "") {
97  try {
98  load(detectorFile, detector);
99  }
100  catch(const JException& error) {
101  FATAL(error);
102  }
103  }
104 
105  const JPMTRouter pmt_router(detector);
106  const JModuleRouter mod_router(detector);
107 
108 
109  outputFile.open();
110 
111  Head header;
112 
113  try {
114  header = getHeader(inputFile);
115  } catch(const exception& error) {}
116  {
117  JHead buffer(header);
118 
119  buffer.DAQ.livetime_s = getLivetime(inputFile.begin(), inputFile.end());
120  buffer.push(&JHead::DAQ);
121 
122  copy(buffer, header);
123  }
124 
125  outputFile.put(header);
126 
127 
128  outputFile.put(JMeta(argc, argv));
129 
130 
131  counter_type number_of_events = 0;
132 
133  for (JMultipleFileScanner<>::const_iterator i = inputFile.begin(); i != inputFile.end(); ++i) {
134 
135  STATUS("Processing: " << *i << endl);
136 
137  JParallelFileScanner_t in(*i);
138  JTreeScanner<Evt> mc(*i);
139 
140  in.setLimit(inputFile.getLimit());
141 
142  Vec center(0,0,0);
143 
144  int mc_run_id = 0;
145 
146  try {
147 
148  const JHead head(getHeader(*i));
149 
150  center = get<Vec>(head);
151  mc_run_id = head.start_run.run_id;
152 
153  } catch(const exception& error) {}
154 
155 
156  while (in.hasNext()) {
157 
158  STATUS("event: " << setw(10) << in.getCounter() << '\r'); DEBUG(endl);
159 
160  multi_pointer_type ps = in.next();
161 
162  JDAQEvent* tev = ps;
163  JEvt* evt = ps;
164 
165  JEvt::iterator __end = evt->end();
166 
167  if (numberOfFits > 0) {
168  advance(__end = evt->begin(), min(numberOfFits, evt->size()));
169  }
170 
171  if (qualitySorter.is_valid()) {
172  partial_sort(evt->begin(), __end, evt->end(), qualitySorter);
173  }
174 
175  Evt out; // output event
176 
177  if (mc.getEntries() != 0) {
178 
179  Evt* event = mc.getEntry(tev->getCounter());
180 
181  if (event != NULL) {
182 
183  out = *event; // import Monte Carlo true data
184 
185  if (out.mc_run_id == 0) {
186  out.mc_run_id = mc_run_id;
187  }
188 
189  for (vector<Trk>::iterator i = out.mc_trks.begin(); i != out.mc_trks.end(); ++i) {
190  i->pos += center; // offset true positions
191  }
192  }
193  }
194 
195  read(out, *tev); // import DAQ data
196 
197  if (!pmt_router->empty()) { // import calibration data
198 
199  for (vector<Hit>::iterator i = out.mc_hits.begin(); i != out.mc_hits.end(); ++i) {
200 
201  if (pmt_router.hasPMT(i->pmt_id)) {
202 
203  const JPMTAddress address = pmt_router.getAddress(i->pmt_id);
204  const JPMTIdentifier id = pmt_router.getIdentifier(address);
205  const JPMT& pmt = pmt_router.getPMT(address);
206 
207  i->dom_id = id.getID();
208  i->channel_id = id.getPMTAddress();
209  i->pos = getPosition(pmt);
210 
211  } else {
212 
213  FATAL("Missing PMT" << i->pmt_id << endl);
214  }
215  }
216  }
217 
218  if (!mod_router->empty()) { // import calibration data
219 
220  for (vector<Hit>::iterator i = out.hits.begin(); i != out.hits.end(); ++i) {
221 
222  if (mod_router.hasModule(i->dom_id)) {
223 
224  const JPMTIdentifier id(i->dom_id, i->channel_id);
225  const JPMTAnalogueSignalProcessor cpu(pmtParameters.getPMTParameters(id));
226 
227  const JPMT& pmt = mod_router.getModule(i->dom_id).getPMT(i->channel_id);
228 
229  const JHit hit(getTime(i->tdc, pmt.getCalibration()), i->tot);
230 
231  i->pmt_id = pmt.getID();
232  i->pos = getPosition(pmt);
233  i->t = hit.getT();
234  i->tot = hit.getToT();
235  i->a = cpu.getNPE(i->tot);
236 
237  } else {
238 
239  FATAL("Missing module " << i->dom_id << endl);
240  }
241  }
242  }
243 
244  for (JEvt::const_iterator fit = evt->begin(); fit != __end; ++fit) { // import reconstruction data
245 
246  Trk trk;
247 
248  trk.id = out.trks.size() + 1;
249  trk.pos = Vec(fit->getX(), fit->getY(), fit->getZ());
250  trk.dir = Vec(fit->getDX(), fit->getDY(), fit->getDZ());
251  trk.t = fit->getT();
252  trk.E = fit->getE();
253  trk.lik = fit->getQ();
255 
256  for (JHistory::const_iterator i = fit->getHistory().begin(); i != fit->getHistory().end(); ++i) {
257  trk.rec_stages.push_back(i->type);
258  }
259 
260  for (int i = 0; i != fit->getN(); ++i) {
261  trk.fitinf.push_back(fit->getW(i));
262  }
263 
264  out.trks.push_back(trk);
265  }
266 
267  out.id = ++number_of_events;
268 
269  outputFile.put(out);
270  }
271  }
272 
273  STATUS(endl);
274 
276 
277  io >> outputFile;
278 
279  outputFile.close();
280 }
Router for direct addressing of PMT data in detector data structure.
Definition: JPMTRouter.hh:33
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:1500
General exception.
Definition: JException.hh:23
ROOT TTree parameter settings of various packages.
const JModule & getModule(const JObjectID &id) const
Get module parameters.
double t
track time [ns] (when the particle is at pos )
Definition: Trk.hh:18
JPMTIdentifier getIdentifier(const JPMTAddress &address) const
Get identifier of PMT.
Definition: JPMTRouter.hh:126
#define STATUS(A)
Definition: JMessage.hh:63
Detector data structure.
Definition: JDetector.hh:80
bool read(Vec &v, std::istream &is)
Read a Vec(tor) from a stream.
Definition: io_ascii.hh:141
Recording of objects on file according a format that follows from the file name extension.
Router for direct addressing of module data in detector data structure.
Vec dir
track direction
Definition: Trk.hh:17
General purpose sorter of fit results.
General purpose class for parallel reading of objects from a single file or multiple files...
bool hasPMT(const JObjectID &id) const
Has PMT.
Definition: JPMTRouter.hh:114
const JPMT & getPMT(const JPMTAddress &address) const
Get PMT.
Definition: JPMTRouter.hh:90
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:66
Long64_t counter_type
Type definition for counter.
double livetime_s
Live time [s].
Definition: JHead.hh:964
double getTime(const Hit &hit)
Get true time of hit.
Basic data structure for time and time over threshold information of hit.
string outputFile
double E
Energy [GeV] (either MC truth or reconstructed)
Definition: Trk.hh:19
Data structure for detector geometry and calibration.
Tools for handling different hit types.
Acoustics hit.
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
The Vec class is a straightforward 3-d vector, which also works in pyroot.
Definition: Vec.hh:12
void push(T JHead::*pd)
Push given data member to Head.
Definition: JHead.hh:1175
Detector file.
Definition: JHead.hh:196
Acoustic event fit.
int mc_run_id
MC run identifier.
Definition: Evt.hh:26
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:1961
Auxiliary methods for handling file names, type names and environment.
int getID() const
Get identifier.
Definition: JObjectID.hh:50
JAANET::start_run start_run
Definition: JHead.hh:1326
Parallel scanning of objects from a single file or multiple files according a format that follows fro...
Data structure for PMT geometry and calibration.
Definition: JPMT.hh:47
ROOT I/O of application specific meta data.
JPosition3D getPosition(const Vec &pos)
Get position.
Definition of hit and track types and auxiliary methods for handling Monte Carlo data.
std::vector< double > fitinf
place to store additional fit info, for jgandalf, see JFitParameters.hh
Definition: Trk.hh:30
Support methods.
Auxiliary class for map of PMT parameters.
Direct access to PMT in detector data structure.
int debug
debug level
Definition: JSirene.cc:63
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:211
General purpose messaging.
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
Monte Carlo run header.
Definition: JHead.hh:1050
int run_id
MC run number.
Definition: JHead.hh:113
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
Definition: Head.hh:66
#define FATAL(A)
Definition: JMessage.hh:67
int id
track identifier
Definition: Trk.hh:15
Direct access to module in detector data structure.
Vec pos
postion of the track at time t [m]
Definition: Trk.hh:16
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.
std::vector< Trk > trks
list of reconstructed tracks (can be several because of prefits,showers, etc).
Definition: Evt.hh:36
double getLivetime(const std::string &file_name)
Get data taking live time.
std::vector< int > rec_stages
list of identifyers of succesfull fitting stages resulting in this track
Definition: Trk.hh:25
double lik
likelihood or lambda value (for aafit, lambda)
Definition: Trk.hh:22
Utility class to parse command line options.
std::vector< Hit > mc_hits
MC: list of MC truth hits.
Definition: Evt.hh:45
static const int JPP_RECONSTRUCTION_TYPE
KM3NeT Data Definitions v1.3.1-43-g5270ad8 https://git.km3net.de/common/km3net-dataformat.
bool hasModule(const JObjectID &id) const
Has module.
void copy(const Head &from, JHead &to)
Copy header from from to to.
Definition: JHead.cc:139
PMT analogue signal processor.
int id
offline event identifier
Definition: Evt.hh:21
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:73
std::vector< Hit > hits
list of hits
Definition: Evt.hh:35
do set_variable DETECTOR_TXT $WORKDIR detector
JAANET::DAQ DAQ
Definition: JHead.hh:1348
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
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
Definition: Trk.hh:13
JTriggerCounter_t getCounter() const
Get trigger counter.
std::vector< Trk > mc_trks
MC: list of MC truth tracks.
Definition: Evt.hh:46
const JPMTAddress & getAddress(const JObjectID &id) const
Get address of PMT.
Definition: JPMTRouter.hh:78
bool qualitySorter(const JRECONSTRUCTION::JFit &first, const JRECONSTRUCTION::JFit &second)
Comparison of fit results.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:19
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62
int rec_type
identifyer for the overall fitting algorithm/chain/strategy
Definition: Trk.hh:24
int main(int argc, char *argv[])
Definition: Main.cpp:15