60 using namespace KM3NETDAQ;
88 JParser<> zap(
"Example program to analyse track fit results from Evt formatted data.");
110 catch(
const exception& error) {
111 FATAL(error.what() << endl);
114 if (useWeights && numberOfEvents != JLimit::max()) {
115 FATAL(
"Cannot apply weighting to limited number of events.");
123 if (detectorFile !=
"") {
137 bool (*has_reconstruction)(
const Evt&);
138 const Trk& (*get_best_fit)(
const Evt&);
143 }
else if (recotype == shower_t()) {
147 FATAL(
"Invalid recotype: " << recotype);
153 const Int_t N_Nhits = 400;
154 const Double_t Nhits_min = 0.0 - 0.5;
155 const Double_t Nhits_max = 1000.0 - 0.5;
157 const Int_t N_Noverlays = 40;
158 const Double_t Noverlays_min = 0.0 - 0.5;
159 const Double_t Noverlays_max = 1000.0 - 0.5;
161 const Int_t N_radius = 201;
162 const Double_t radius_min = -700.0 - 0.5;
163 const Double_t radius_max = +700.0 + 0.5;
165 const Int_t N_height = 18;
166 const Double_t height_min = 20.0;
167 const Double_t height_max = 200.0;
169 const Int_t N_ToTfrac = 20;
170 const Double_t ToTfrac_min = 0.0;
171 const Double_t ToTfrac_max = 1.0;
173 const Int_t N_dt = 1500;
174 const Double_t dt_min = -500.0 - 0.5;
175 const Double_t dt_max = 1000.0 - 0.5;
177 const Int_t N_zenith = 21;
178 const Double_t zenith_min = -1.0;
179 const Double_t zenith_max = +1.0;
181 const Int_t N_energy = 60;
182 const Double_t energy_min = -2.0;
183 const Double_t energy_max = 4.0;
185 const Int_t N_quality = 100;
186 const Double_t quality_min = -200.0;
187 const Double_t quality_max = +800.0;
189 const Int_t N_beta0 = 60;
190 const Double_t beta0_min = -2.0;
191 const Double_t beta0_max = +3.5;
196 string ordinateLabel(useWeights ?
"Rate [Hz]" :
"Number of events");
200 TH1D hs (
"hs",
MAKE_CSTRING(
"; #snapshot hits; " << ordinateLabel),
201 N_Nhits, Nhits_min, Nhits_max);
202 TH1D hn (
"hn",
MAKE_CSTRING(
"; #triggered hits; " << ordinateLabel),
203 N_Nhits, Nhits_min, Nhits_max);
204 TH1D ho (
"ho",
MAKE_CSTRING(
"; #overlays; " << ordinateLabel),
205 N_Noverlays, Noverlays_min, Noverlays_max);
207 TH1D hz (
"hz",
MAKE_CSTRING(
"; cos(#theta); " << ordinateLabel),
208 N_zenith, zenith_min, zenith_max);
209 TH1D he (
"he",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); " << ordinateLabel),
210 N_energy, energy_min, energy_max);
211 TH1D ht (
"ht",
MAKE_CSTRING(
"; #Delta t [ns]; " << ordinateLabel),
212 N_dt, dt_min, dt_max);
214 TH1D hZ (
"hZ",
MAKE_CSTRING(
"; longitudinal ToT-barycenter [m]; " << ordinateLabel),
215 N_height, height_min, height_max);
216 TH1D hT0 (
"hT0",
MAKE_CSTRING(
"; ToT-fraction below earliest triggered hit [ns]; " << ordinateLabel),
217 N_ToTfrac, ToTfrac_min, ToTfrac_max);
218 TH1D hT1 (
"hT1",
MAKE_CSTRING(
"; ToT-fraction above earliest triggered hit [ns]; " << ordinateLabel),
219 N_ToTfrac, ToTfrac_min, ToTfrac_max);
221 TH1D hq (
"hq",
MAKE_CSTRING(
"; quality; " << ordinateLabel),
222 N_quality, quality_min, quality_max);
223 TH1D hb0 (
"hb0",
MAKE_CSTRING(
"; #beta_{0}; " << ordinateLabel),
224 N_beta0, beta0_min, beta0_max);
226 TH2D hzo (
"hzo",
MAKE_CSTRING(
"; cos(#theta); #overlays; " << ordinateLabel),
227 N_zenith, zenith_min, zenith_max,
228 N_Noverlays, Noverlays_min, Noverlays_max);
229 TH2D hze (
"hze",
MAKE_CSTRING(
"; cos(#theta); log_{10}(E_{reco} / 1 GeV); " << ordinateLabel),
230 N_zenith, zenith_min, zenith_max,
231 N_energy, energy_min, energy_max);
232 TH2D heo (
"heo",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #overlays; " << ordinateLabel),
233 N_energy, energy_min, energy_max,
234 N_Noverlays, Noverlays_min, Noverlays_max);
235 TH2D hzt (
"hzt",
MAKE_CSTRING(
"; cos(#theta); #Delta t [ns]; " << ordinateLabel),
236 N_zenith, zenith_min, zenith_max,
237 N_dt, dt_min, dt_max);
238 TH2D het (
"het",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); #Delta t [ns]; " << ordinateLabel),
239 N_energy, energy_min, energy_max,
240 N_dt, dt_min, dt_max);
241 TH2D hot (
"hot",
MAKE_CSTRING(
"; #overlays; #Delta t [ns]; " << ordinateLabel),
242 N_Noverlays, Noverlays_min, Noverlays_max,
243 N_dt, dt_min, dt_max);
245 TH2D hzq (
"hzq",
MAKE_CSTRING(
"; cos(#theta); quality; " << ordinateLabel),
246 N_zenith, zenith_min, zenith_max,
247 N_quality, quality_min, quality_max);
248 TH2D heq (
"heq",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); quality; " << ordinateLabel),
249 N_energy, energy_min, energy_max,
250 N_quality, quality_min, quality_max);
251 TH2D hoq (
"hoq",
MAKE_CSTRING(
"; #overlays; quality; " << ordinateLabel),
252 N_Noverlays, Noverlays_min, Noverlays_max,
253 N_quality, quality_min, quality_max);
255 TH2D hob0(
"hob0",
MAKE_CSTRING(
"; #overlays; log_{10}(#beta_{0}); " << ordinateLabel),
256 N_Noverlays, Noverlays_min, Noverlays_max,
257 N_beta0, beta0_min, beta0_max);
258 TH2D heb0(
"heb0",
MAKE_CSTRING(
"; log_{10}(E_{reco} / 1 GeV); log_{10}(#beta_{0}); " << ordinateLabel),
259 N_energy, energy_min, energy_max,
260 N_beta0, beta0_min, beta0_max);
261 TH2D hzb0(
"hzb0",
MAKE_CSTRING(
"; cos(#theta); log_{10}(#beta_{0}); " << ordinateLabel),
262 N_zenith, zenith_min, zenith_max,
263 N_beta0, beta0_min, beta0_max);
265 TH2D hxy (
"hxy",
MAKE_CSTRING(
"; x [m]; y [m]; " << ordinateLabel),
266 N_radius, radius_min, radius_max,
267 N_radius, radius_min, radius_max);
272 if (scanners.setFlux(fluxMaps) == 0) {
273 WARNING(
"No file found containing all given primaries; Flux function not set." << endl);
282 scanner->setLimit(numberOfEvents);
284 while (scanner->hasNext()) {
286 const Evt* evt = scanner->next();
288 if (!has_reconstruction(*evt)) {
continue; }
290 const Trk& best_trk = (*get_best_fit)(*evt);
294 const size_t NsnapshotHits = evt->hits.size();
295 const size_t NtriggeredHits = count_if(evt->hits.begin(), evt->hits.end(),
298 if (!triggeredHitsRange(NtriggeredHits) ||
299 !coszenithRange (tb.
getDZ()) ||
300 !energyRange (tb.
getE())) {
306 const double weight = (useWeights ? scanner->getWeight(*evt) : 1.0);
309 RIGHT (15) << scanner->getCounter() <<
314 hs .Fill(NsnapshotHits, weight);
315 hn .Fill(NtriggeredHits, weight);
316 ho .Fill(evt->overlays, weight);
318 hz .Fill(tb.
getDZ(), weight);
319 he .Fill(logE, weight);
320 hq .Fill(best_trk.
lik, weight);
322 hzo.Fill(tb.
getDZ(), evt->overlays, weight);
323 hze.Fill(tb.
getDZ(), logE, weight);
324 heo.Fill(logE, evt->overlays, weight);
326 hoq.Fill(evt->overlays, best_trk.
lik, weight);
327 hzq.Fill(tb.
getDZ(), best_trk.
lik, weight);
328 heq.Fill(logE, best_trk.
lik, weight);
330 hxy.Fill(tb.
getX(), tb.
getY(), weight);
336 hb0 .Fill(logb0, weight);
337 hob0.Fill(evt->overlays, logb0, weight);
338 heb0.Fill(logE, logb0, weight);
339 hzb0.Fill(tb.
getDZ(), logb0, weight);
342 double ToTbelow = 0.0;
343 double ToTabove = 0.0;
344 double ToTtotal = 0.0;
345 double ToTweightedZ = 0.0;
352 if (router.hasPMT(hit->pmt_id)) {
354 const JPMT& pmt = router.getPMT(hit->pmt_id);
356 const double t0 = tb.
getT(pmt);
357 const double t1 =
getTime(*hit);
359 ht .Fill(t1 - t0, weight);
360 hot.Fill(evt->overlays, t1 - t0, weight);
361 hzt.Fill(tb.
getDZ(), t1 - t0, weight);
362 het.Fill(
log10(best_trk.
E), t1 - t0, weight);
366 ToTtotal += hit->tot;
367 ToTweightedZ += hit->tot * hit->pos.z;
369 if (hit->pos.z < firstHit->pos.z) {
370 ToTbelow += hit->tot;
371 }
else if (hit->pos.z >= firstHit->pos.z) {
372 ToTabove += hit->tot;
378 hT0.Fill(ToTbelow / ToTtotal, weight);
379 hT1.Fill(ToTabove / ToTtotal, weight);
380 hZ .Fill(ToTweightedZ / ToTtotal, weight);
Router for direct addressing of PMT data in detector data structure.
Utility class to parse command line options.
JPredicate< JResult_t T::*, JComparison::eq > make_predicate(JResult_t T::*member, const JResult_t value)
Helper method to create predicate for data member.
JComparator< JResult_t T::*, JComparison::lt > make_comparator(JResult_t T::*member)
Helper method to create comparator between values of data member.
JTrack3E getTrack(const Trk &track)
Get track.
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
Utility class to parse parameter values.
#define MAKE_CSTRING(A)
Make C-string.
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
double getTime(const Hit &hit)
Get true time of hit.
double E
Energy [GeV] (either MC truth or reconstructed)
Auxiliary class for defining the range of iterations of objects.
double getE() const
Get energy.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
Data structure for PMT geometry, calibration and status.
std::vector< double > fitinf
place to store additional fit info, see km3net-dataformat/definitions/fitparameters.csv
static const int JGANDALF_BETA0_RAD
KM3NeT Data Definitions v3.1.0 https://git.km3net.de/common/km3net-dataformat.
Auxiliary class for parsing multiparticle fluxes.
double getY() const
Get y position.
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
Auxiliary base class for list of file names.
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
const char *const track_t
std::vector< filescanner_type >::iterator iterator
ULong64_t trig
non-zero if the hit is a trigger hit.
double lik
likelihood or lambda value (for aafit, lambda)
double t
hit time (from tdc+calibration or MC truth)
double getX() const
Get x position.
Auxiliary class for organising Monte Carlo file scanners associated with event weighters.
do set_variable DETECTOR_TXT $WORKDIR detector
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
Auxiliary data structure for floating point format specification.
double getDZ() const
Get z direction.
const array_type< JKey_t > & get_keys(const std::map< JKey_t, JValue_t, JComparator_t, JAllocator_t > &data)
Method to create array of keys of map.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
#define DEBUG(A)
Message macros.