Jpp  debug
the software that should make you happy
JConvert.cc
Go to the documentation of this file.
1 
2 #include <string>
3 #include <iostream>
4 #include <iomanip>
5 #include <type_traits>
6 
12 
13 #include "JDAQ/JDAQTimesliceIO.hh"
14 #include "JDAQ/JDAQEventIO.hh"
16 
18 
23 #include "JSupport/JMeta.hh"
24 #include "JSupport/JSupport.hh"
25 #include "JLang/JPipe.hh"
26 #include "JLang/JObjectSelector.hh"
28 #include "JTools/JRange.hh"
29 
30 #include "Jeep/JParser.hh"
31 #include "Jeep/JMessage.hh"
32 
33 namespace {
34 
35  using namespace KM3NETDAQ;
36  using namespace JLANG;
37 
38  /**
39  * Type definition for DAQ UTC time range.
40  */
42 
43  /**
44  * Default implementation for selection of objects based on UTC time range.
45  */
46  template<class T, bool is_daq = std::is_convertible<T, JDAQHeader>::value>
47  struct JSelector :
48  public virtual JObjectSelector<T>,
49  public virtual JDAQUTCTimeRange
50  {
51  virtual bool accept(const T& object) const override
52  {
53  return true;
54  }
55  };
56 
57  /**
58  * Custom implementation for selection of objects based on UTC time range.
59  */
60  template<>
61  struct JSelector<Evt, false> :
62  public virtual JObjectSelector<Evt>,
63  public virtual JDAQUTCTimeRange
64  {
65  virtual bool accept(const Evt& object) const override
66  {
67  return (*this)(JDAQUTCExtended(object.t.GetSec(), object.t.GetNanoSec() / 16));
68  }
69  };
70 
71  /**
72  * Common implementation for selection of objects based on UTC time range.
73  */
74  template<class T>
75  struct JSelector<T, true> :
76  public virtual JObjectSelector<T>,
77  public virtual JDAQUTCTimeRange
78  {
79  virtual bool accept(const T& object) const override
80  {
81  return (*this)(object.getTimesliceStart());
82  }
83  };
84 
85  /**
86  * Implementation for multiple selection of objects based on UTC time range.
87  */
88  template<class JHead_t, class JTail_t>
89  struct JSelector< JTypeList<JHead_t, JTail_t>, false > :
90  public virtual JObjectSelector< JTypeList<JHead_t, JTail_t> >,
91  public JSelector<JHead_t>,
92  public JSelector<JTail_t>
93  {};
94 
95  /**
96  * Terminator class of recursive JSelector class.
97  */
98  template<class JHead_t>
99  struct JSelector< JTypeList<JHead_t, JNullType>, false > :
100  public JSelector<JHead_t>
101  {};
102 }
103 
104 
105 /**
106  * \file
107  * Auxiliary program to convert data formats and/or to select data.
108  * Possible file name extensions include ".evt" (ASCII), ".root" (ROOT) and ".dat" (binary).\n
109  * The following data structures and file name extensions are supported:
110  *
111  * <table>
112  * <tr><th> type </th><th> evt </th><th> root </th><th> dat </th></tr>
113  * <tr><td> KM3NETDAQ::JDAQEvent </td><td> </td><td> I/O </td><td> I/O </td></tr>
114  * <tr><td> KM3NETDAQ::JDAQTimeslice </td><td> </td><td> I/O </td><td> I/O </td></tr>
115  * <tr><td> KM3NETDAQ::JDAQSummaryslice </td><td> </td><td> I/O </td><td> I/O </td></tr>
116  * <tr><td> Head </td><td> I </td><td> I/O </td><td> </td></tr>
117  * <tr><td> Evt </td><td> I </td><td> I/O </td><td> </td></tr>
118  * </table>
119  *
120  * The name of the data structure following option -C should be preceded by a '+' or '-'
121  * to add or remove data types in the output, respectively.\n
122  * In this, ROOT wildcards are accepted (e.g. <tt>-C -\\\.\\*</tt> will remove all data types).
123  *
124  * \author mdejong
125  */
126 int main(int argc, char **argv)
127 {
128  using namespace std;
129  using namespace JPP;
130 
131  typedef JAllTypes_t typelist;
132 
135  JLimit_t& numberOfEvents = inputFile.getLimit();
136  JROOTClassSelection selection = getROOTClassSelection<typelist>();
137  bool& merge = JMultipleFileScanner<Head>::merge;
138  JSelector<typelist> selector;
139  int debug;
140 
141  try {
142 
143  JParser<> zap("Auxiliary program to convert data formats and/or to select data.");
144 
145  zap['f'] = make_field(inputFile);
146  zap['o'] = make_field(outputFile);
147  zap['n'] = make_field(numberOfEvents) = JLimit::max();
148  zap['C'] = make_field(selection,
149  "Precede name of data structure by a '+' or '-' "
150  "to add or remove data types in the output, respectively."
151  "\nROOT wildcards are accepted.") = JPARSER::initialised();
152  zap['m'] = make_field(merge, "Allow merging of files w/o Monte Carlo headers");
153  zap['r'] = make_field(selector) = JPARSER::initialised();
154  zap['d'] = make_field(debug) = 1;
155 
156  zap(argc, argv);
157  }
158  catch(const exception& error) {
159  FATAL(error.what() << endl);
160  }
161 
162 
163  outputFile.open();
164 
165  outputFile.put(JMeta(argc,argv));
166 
167  inputFile | JValve<typelist>(selection) | selector | outputFile;
168 
169  outputFile.close();
170 }
int main(int argc, char **argv)
Definition: JConvert.cc:126
string outputFile
Recording of objects on file according a format that follows from the file name extension.
General purpose messaging.
#define FATAL(A)
Definition: JMessage.hh:67
int debug
debug level
Definition: JSirene.cc:69
ROOT I/O of application specific meta data.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
Implementation of pipe operation for object iterators.
Auxiliary class to define a range between two values.
ROOT TTree parameter settings of various packages.
Auxiliary class for specifying selection of database data.
Interface for selection of objects.
Auxiliary class for selection of data type.
Definition: JValve.hh:23
Utility class to parse command line options.
Definition: JParser.hh:1714
Object writing to file.
General purpose class for object reading from a list of file names.
Range of values.
Definition: JRange.hh:42
Data structure for UTC time.
Auxiliary classes and methods for language specific functionality.
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
JTOOLS::JRange< JDAQUTCExtended > JDAQUTCTimeRange
Type definition for DAQ UTC time range.
KM3NeT DAQ data structures and auxiliaries.
Definition: DataQueue.cc:39
Definition: JSTDTypes.hh:14
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
Definition: Evt.hh:21
Auxiliary class for no type definition.
Definition: JNullType.hh:19
Type list.
Definition: JTypeList.hh:23
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
Definition: JParser.hh:84
Auxiliary class for ROOT class selection.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:45
static counter_type max()
Get maximum counter value.
Definition: JLimit.hh:128
Auxiliary class for ROOT I/O of application specific meta data.
Definition: JMeta.hh:72