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());
 
  442         he.Fill(log10(track->
E));
 
  447     hn.Fill((Double_t) n);
 
Utility class to parse command line options. 
 
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 
 
General purpose messaging. 
 
Vec & normalize()
Normalise this vector. 
 
z range($ZMAX-$ZMIN)< $MINIMAL_DZ." fi fi mv $WORKDIR/fit.root $MODULE_ROOT typeset -Z 4 STRING typeset -Z 2 FLOOR JPlot1D -f $
 
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
 
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. 
 
alias put_queue eval echo n
 
static const double MASS_PROTON
proton mass [GeV] 
 
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. 
 
#define DEBUG(A)
Message macros. 
 
int main(int argc, char *argv[])