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

Auxiliary program to determine time slewing from K40 data. More...

#include <string>
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <random>
#include "TROOT.h"
#include "TFile.h"
#include "TH1D.h"
#include "TH2D.h"
#include "TF1.h"
#include "TProfile.h"
#include "TProfile2D.h"
#include "JROOT/JMinimizer.hh"
#include "km3net-dataformat/online/JDAQ.hh"
#include "JDAQ/JDAQTimesliceIO.hh"
#include "JDetector/JDetector.hh"
#include "JDetector/JDetectorToolkit.hh"
#include "JDetector/JModuleRouter.hh"
#include "JMath/JMathToolkit.hh"
#include "JTrigger/JHitR0.hh"
#include "JTrigger/JHitToolkit.hh"
#include "JTools/JRange.hh"
#include "JSupport/JMultipleFileScanner.hh"
#include "JSupport/JSupport.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

Auxiliary program to determine time slewing from K40 data.

Author
mdejong

Definition in file JSlewingK40.cc.

Function Documentation

int main ( int  argc,
char **  argv 
)

Definition at line 39 of file JSlewingK40.cc.

40 {
41  using namespace std;
42  using namespace JPP;
43  using namespace KM3NETDAQ;
44 
46  JLimit_t& numberOfEvents = inputFile.getLimit();
47  string outputFile;
48  string detectorFile;
49  Double_t TMax_ns;
50  JRange<double> totVeto_ns;
51  JRange<int> multiplicity;
52  JRange<double> ct;
53  bool slewing;
54  int debug;
55 
56  try {
57 
58  JParser<> zap("Auxiliary program to determine time slewing from K40 data.");
59 
60  zap['f'] = make_field(inputFile);
61  zap['o'] = make_field(outputFile) = "monitor.root";
62  zap['a'] = make_field(detectorFile);
63  zap['n'] = make_field(numberOfEvents) = JLimit::max();
64  zap['T'] = make_field(TMax_ns) = 20.5; // [ns]
65  zap['t'] = make_field(totVeto_ns) = JRange<double>(0, 1e4); // time over threshold of reference hits [ns]
66  zap['M'] = make_field(multiplicity) = JRange<int>(2, 2);
67  zap['C'] = make_field(ct) = JRange<double>(0.0, 1.0); // cosine space angle between PMTs
68  zap['S'] = make_field(slewing);
69  zap['d'] = make_field(debug) = 1;
70 
71  zap(argc, argv);
72  }
73  catch(const exception &error) {
74  FATAL(error.what() << endl);
75  }
76 
77 
78  using namespace KM3NETDAQ;
79 
80  if (!multiplicity.is_valid()) { FATAL("Invalid multiplicity " << multiplicity << endl); }
81  if ( multiplicity.getLowerLimit() < 2) { FATAL("Invalid multiplicity " << multiplicity << endl); }
82  if (!totVeto_ns .is_valid()) { FATAL("Invalid time over threshold " << totVeto_ns << endl); }
83 
84  JHit::setSlewing(slewing);
85 
87 
88  try {
89  load(detectorFile, detector);
90  }
91  catch(const JException& error) {
92  FATAL(error);
93  }
94 
95  if (detector.empty()) {
96  FATAL("Empty detector." << endl);
97  }
98 
99  const JModuleRouter router(detector);
100 
101 
102  TFile out(outputFile.c_str(), "recreate");
103 
104  TH1D h0("h0", NULL, 41, -TMax_ns, +TMax_ns);
105  TH1D h1("h1", NULL, 50, -0.5, 49.5);
106  TProfile2D hx("hx", NULL, 50, -0.5, 49.5, 50, -0.5, 49.5, -2*TMax_ns, +2*TMax_ns);
107  TProfile h2("h2", NULL, 100, 0.5, 100.5, -2*TMax_ns, +2*TMax_ns);
108 
109  h0.Sumw2();
110  h1.Sumw2();
111 
112  random_device rd;
113  mt19937 g(rd());
114 
115  vector<JHitR0> buffer;
116 
117  while (inputFile.hasNext()) {
118 
119  STATUS("event: " << setw(10) << inputFile.getCounter() << '\r'); DEBUG(endl);
120 
121  const JDAQTimeslice* timeslice = inputFile.next();
122 
123  for (JDAQTimeslice::const_iterator super_frame = timeslice->begin(); super_frame != timeslice->end(); ++super_frame) {
124 
125  if (router.hasModule(super_frame->getModuleID()) && !super_frame->empty()) {
126 
127  const JModule& module = router.getModule(super_frame->getModuleID());
128 
129  // process data
130 
131  buffer.resize(super_frame->size());
132 
133  vector<JHitR0>::iterator out = buffer.begin();
134 
135  for (JDAQSuperFrame::const_iterator i = super_frame->begin(); i != super_frame->end(); ++i) {
136  *out = JHitR0(i->getPMT(), JHitToolkit<JHit>::getHit(*i, module.getPMT(i->getPMT())));
137  ++out;
138  }
139 
140  sort(buffer.begin(), buffer.end());
141 
142  for (vector<JHitR0>::iterator p = buffer.begin(); p != buffer.end(); ) {
143 
145 
146  while (++q != buffer.end() && q->getT() - p->getT() <= TMax_ns ) {}
147 
148  if (multiplicity(distance(p,q))) {
149 
150  shuffle(p,q,g);
151 
152  for (vector<JHitR0>::const_iterator __p = p; __p != q; ++__p) {
153  for (vector<JHitR0>::const_iterator __q = __p; ++__q != q; ) {
154 
155  const double dot = JMATH::getDot(module.getPMT(__p->getPMT()),
156  module.getPMT(__q->getPMT()));
157 
158  if (ct(dot)) {
159 
160  h0.Fill(__q->getT() - __p->getT());
161  h1.Fill(__q->getToT());
162  hx.Fill(__p->getToT(), __q->getToT(), __q->getT() - __p->getT());
163 
164  if (totVeto_ns(__p->getToT())) {
165  h2.Fill(__q->getToT(), __q->getT() - __p->getT());
166  }
167  }
168  }
169  }
170 
171  sort(p,q);
172  }
173 
174  p = q;
175  }
176  }
177  }
178  }
179  STATUS(endl);
180 
181 
182  // Fit function
183 
184  TF1 f1("f1", "[0]*exp([1]*sqrt(x) + [2]*x) + [3]");
185 
186  f1.SetParameter(0, h2.GetMaximum());
187  f1.SetParameter(1, -0.01);
188  f1.SetParameter(2, -0.05);
189  f1.SetParameter(3, h2.GetMinimum());
190 
191  h2.ProjectionX()->Fit(&f1, "", "same");
192 
193  for (int i = 0; i != f1.GetNpar(); ++i) {
194  cout << "\tstatic double p" << i << "() { return " << setw(9) << setprecision(5) << f1.GetParameter(i) << "; }" << endl;
195  }
196 
197 
198  out.Write();
199  out.Close();
200 }
Utility class to parse command line options.
Definition: JParser.hh:1711
General exception.
Definition: JException.hh:24
Data structure for a composite optical module.
Definition: JModule.hh:67
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
#define STATUS(A)
Definition: JMessage.hh:63
bool is_valid(const json &js)
Check validity of JSon data.
Detector data structure.
Definition: JDetector.hh:89
Router for direct addressing of module data in detector data structure.
string outputFile
const JPolynome f1(1.0, 2.0, 3.0)
Function.
Auxiliary class for defining the range of iterations of objects.
Definition: JLimit.hh:41
Detector file.
Definition: JHead.hh:226
Reduced data structure for L0 hit.
Definition: JHitR0.hh:25
Hit data structure.
Definition: JDAQHit.hh:34
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
Definition: JParser.hh:2158
Data time slice.
double getDot(const JFirst_t &first, const JSecond_t &second)
Get dot product of objects.
then $JPP_DIR examples JDetector JSlewing P slewing
Definition: JSlewing.sh:43
const JPMT & getPMT(const int index) const
Get PMT.
Definition: JModule.hh:172
#define FATAL(A)
Definition: JMessage.hh:67
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
General purpose class for object reading from a list of file names.
Template definition of hit toolkit.
Definition: JHitToolkit.hh:60
const JLimit & getLimit() const
Get limit.
Definition: JLimit.hh:84
do set_variable DETECTOR_TXT $WORKDIR detector
int debug
debug level
#define DEBUG(A)
Message macros.
Definition: JMessage.hh:62