12 #include "TDatabasePDG.h"
13 #include "TParticlePDG.h"
44 inline double getE(
const Trk& trk,
const Vec& start)
58 inline double getEkin(
const Trk& trk,
const Vec& start)
60 const TDatabasePDG pdb;
62 const double energy = getE(trk, start);
63 const double mass = pdb.GetParticle(trk.
type)->Mass();
67 return sqrt((energy - mass) * (energy + mass));
83 inline double getE0(
const Evt& evt)
93 for (
size_t i = 1; i != evt.
mc_trks.size(); ++i) {
130 inline double getE1(
const Evt& evt)
138 for (
size_t i = 1; i != evt.
mc_trks.size(); ++i) {
142 E1 += getE(track, neutrino.
pos);
158 inline double getVisibleEnergy(
const Trk& track,
const Vec& start) {
164 return muMeters /
geanc();
168 return pythia(track.
type, getEkin(track, start));
180 inline double getVisibleEnergy(
const Evt& evt)
188 for (
size_t i = 1; i != evt.
mc_trks.size(); ++i) {
190 Evis += getVisibleEnergy(evt.
mc_trks[i], neutrino.
pos);
204 inline Vec getVisibleEnergyDirection(
const Evt& evt)
208 const double EvisTotal = getVisibleEnergy(evt);
214 for (
size_t i = 1; i < evt.
mc_trks.size(); ++i) {
217 const double EvisFrac = getVisibleEnergy(track, neutrino.
pos) / EvisTotal;
219 EvisDir += EvisFrac * track.
dir;
236 inline double getTransverseVisibleEnergy(
const Trk& track,
241 const double sinth = (1 + costh) * (1 - costh);
243 return sinth * getVisibleEnergy(track, start);
255 inline double getTransverseVisibleEnergy(
const Evt& evt,
const Vec& refDir)
263 for (
size_t i = 1; i < evt.
mc_trks.size(); ++i) {
265 const double EvisT = getTransverseVisibleEnergy(evt.
mc_trks[i], neutrino.
dir, refDir);
267 EvisT2 += EvisT * EvisT;
282 inline Vec getP0(
const Evt& evt)
290 P0 = neutrino.
E * neutrino.
dir;
304 inline Vec getP1(
const Evt& evt)
312 for (
size_t i = 1; i != evt.
mc_trks.size(); ++i) {
315 const double trackEk = getEkin(track, neutrino.
pos);
317 P1 += trackEk * track.
dir;
332 int main(
int argc,
char **argv)
345 JParser<> zap(
"Example program to verify generator data.");
349 zap[
'n'] =
make_field(numberOfEvents) = JLimit::max();
355 catch(
const exception &error) {
356 FATAL(error.what() << endl);
363 TH1D h0 (
"h0",
"Fractional energy conservation",
365 TH1D
h1 (
"h1",
"Fractional momentum conservation",
367 TH1D job(
"job",
"Particle types",
368 10001, -5000.5, +5000.5);
370 TH1D hv(
"hv",
"Visible energy as fraction of initial state energy",
372 TH1D ha(
"ha",
"Angle between neutrino-direction and visible-energy-weighted direction",
374 TH1D ht(
"ht",
"Square-root of summed squared transverse visible energy as fraction of initial state energy",
377 TH1D hn(
"hn",
"Number of muons per event",
378 2001, -0.5, +2000.5);
379 TH1D he(
"he",
"Muon energies",
381 TH2D hp(
"hp",
"Muon positions",
386 while (inputFile.hasNext()) {
388 STATUS(
"event: " << setw(10) << inputFile.getCounter() <<
'\r');
DEBUG(endl);
390 const Evt*
event = inputFile.next();
393 job.Fill((
double) track->
type);
398 const Trk& neutrino =
event->mc_trks[0];
400 const Vec& P0 = getP0(*event);
401 const Vec& P1 = getP1(*event);
403 const double E0 = getE0(*event);
404 const double E1 = getE1(*event);
406 const double Evis = getVisibleEnergy (*event);
407 const Vec& EvisDir = getVisibleEnergyDirection (*event);
408 const double EvisT = getTransverseVisibleEnergy(*event, EvisDir);
412 cout << endl <<
"--------------------------------------------------------" << endl;
413 cout <<
"event: " << setw(8) <<
event->mc_id <<
" energy [GeV] momentum (x, y, z) [GeV] distance [m]" << endl;
415 for (
size_t i = 0; i !=
event->mc_trks.size(); ++i) {
417 const Trk& track =
event->mc_trks[i];
419 const TDatabasePDG pdg;
420 const TParticlePDG* particle = pdg.GetParticle(track.
type);
422 cout << setw(32) << left << showpos << particle->GetName() <<
' ' <<
FIXED(7,3) << track.
E <<
" " <<
FIXED(7,3) << track.
E * track.
dir <<
" " <<
FIXED(7,3) << (track.
pos - neutrino.
pos).len() << endl;
424 cout << setw(32) << left <<
"balance:" <<
' ' <<
FIXED(7,3) << E0 - E1 <<
" " <<
FIXED(7,3) << P0 - P1 << endl;
431 h0.Fill((E0 - E1)/E0);
432 h1.Fill((P0 - P1).len()/P0.
len());
447 hn.Fill((Double_t) n);
Utility class to parse command line options.
int main(int argc, char *argv[])
ROOT TTree parameter settings of various packages.
double getDot(const JNeutrinoDirection &first, const JNeutrinoDirection &second)
Dot product.
double geanc()
Equivalent muon track length per unit shower energy.
bool has_neutrino(const Evt &evt)
Test whether given event has an incoming neutrino.
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
static const double MASS_MUON
muon mass [GeV]
then for HISTOGRAM in h0 h1
static const JGeaneWater gWater
Function object for energy loss of muon in sea water.
virtual double getX(const double E0, const double E1) const override
Get distance traveled by muon.
Auxiliary data structure for floating point format specification.
static const JPythia pythia
Function object for relative light yield as a function of GEANT particle code.
double E
Energy [GeV] (either MC truth or reconstructed)
double getDot(const JAngle3D &angle) const
Get dot product.
double len() const
Get length.
static const double MASS_NEUTRON
neutron mass [GeV]
bool is_neutrino(const Trk &track)
Test whether given track is a neutrino.
Auxiliary class for defining the range of iterations of objects.
The Vec class is a straightforward 3-d vector, which also works in pyroot.
I/O formatting auxiliaries.
JDirection3D getDirection(const Vec &dir)
Get direction.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
set_variable E_E log10(E_{fit}/E_{#mu})"
General purpose messaging.
Vec & normalize()
Normalise this vector.
Scanning of objects from multiple files according a format that follows from the extension of each fi...
int type
MC: particle type in PDG encoding.
then for APP in event gandalf start energy
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
Vec pos
postion of the track at time t [m]
Auxiliary class to define a range between two values.
General purpose class for object reading from a list of file names.
Utility class to parse command line options.
static const double MASS_PROTON
proton mass [GeV]
then usage $script< input_file >< detector_file > fi set_variable OUTPUT_DIR set_variable SELECTOR JDAQTimesliceL1 set_variable DEBUG case set_variable DEBUG
const JLimit & getLimit() const
Get limit.
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
std::vector< Trk > mc_trks
MC: list of MC truth tracks.
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.