9#include "TApplication.h" 
   11#include "TRootCanvas.h" 
   82  inline void execute(
const std::string& command, 
int debug)
 
   89    istream in(process.getInputStreamBuffer());
 
   91    for (
string buffer; 
getline(in, buffer); ) {
 
   92      DEBUG(buffer << endl);
 
   96  const char* 
const histogram_t   =   
"histogram";     
 
   97  const char* 
const arrow_t       =   
"arrow";         
 
  115  typedef JParallelFileScanner_t::multi_pointer_type               multi_pointer_type;
 
  120  JParallelFileScanner_t   inputFile;
 
  123  JCalibration_t           calibrationFile;
 
  133    double                 arrowSize   =   0.003;
 
  134    string                 arrowType   =  
"|->";
 
  135    double                 arrowScale  = 250.0;
 
  136    Width_t                lineWidth   =   2;
 
  137    Style_t                lineStyle   =   1;
 
  159    JParser<> zap(
"Program to display hit probabilities.");
 
  161    zap[
'w'] = 
make_field(canvas,       
"size of canvas <nx>x<ny> [pixels]")  = 
JCanvas(1200, 600);
 
  162    zap[
'f'] = 
make_field(inputFile,    
"input file (output of JXXXMuonReconstruction.sh)");
 
  173    zap[
'O'] = 
make_field(option,       
"draw option")                         = arrow_t, histogram_t;
 
  174    zap[
'B'] = 
make_field(batch,        
"batch processing");
 
  179  catch(
const exception& error) {
 
  180    FATAL(error.what() << endl);
 
  184    FATAL(
"Missing output file name " << 
outputFile << 
" in batch mode." << endl);
 
  204  unique_ptr<JDynamics> dynamics;
 
  210    dynamics->load(calibrationFile);
 
  212  catch(
const exception& error) {
 
  213    if (!calibrationFile.empty()) {
 
  218  const double Zbed = 0.0;
 
  224  if (cylinder.
getZmin() < Zbed) {
 
  242  Vec offset(0.0, 0.0, 0.0);
 
  246  } 
catch(
const exception& error) {}
 
  251  gROOT->SetBatch(batch);
 
  253  TApplication* tp = 
new TApplication(
"user", NULL, NULL);
 
  254  TCanvas*      cv = 
new TCanvas(
"display", 
"", canvas.
x, canvas.
y);
 
  257    ((TRootCanvas *) cv->GetCanvasImp())->Connect(
"CloseWindow()", 
"TApplication", tp, 
"Terminate()");
 
  260  unique_ptr<TStyle> gStyle(
new JStyle(
"gplot", cv->GetWw(), cv->GetWh(), graphics));
 
  262  gROOT->SetStyle(
"gplot");
 
  265  const size_t NUMBER_OF_PADS = 3;
 
  267  cv->SetFillStyle(4000);
 
  268  cv->SetFillColor(kWhite);
 
  270  TPad* 
p1 = 
new TPad(
"p1", NULL, 0.0, 0.00, 1.0, 0.95);
 
  271  TPad* p2 = 
new TPad(
"p2", NULL, 0.0, 0.95, 1.0, 1.00);
 
  273  p1->Divide(NUMBER_OF_PADS, 1);
 
  279  const double Rmin = 0.0;
 
  280  const double Rmax = min(parameters.
roadWidth_m, 0.4 * Dmax);
 
  281  const double Tmin = min(parameters.
TMin_ns,  -10.0);
 
  282  const double Tmax = max(parameters.
TMax_ns, +100.0);
 
  283  const double Amin = 0.002 * (Tmax - Tmin);                               
 
  284  const double Amax = 0.8   * (Tmax - Tmin);                               
 
  285  const double ymin = Tmin - (option == arrow_t ? 0.2 * Amax : 0.0);
 
  286  const double ymax = Tmax + (option == arrow_t ? 0.5 * Amax : 0.0);
 
  288  const string Xlabel[NUMBER_OF_PADS] = { 
"R [m]", 
"#phi [rad]",   
"z [m]"  };
 
  289  const double Xmin  [NUMBER_OF_PADS] = {  Rmin,      -
PI,      -0.4 * Dmax };
 
  290  const double Xmax  [NUMBER_OF_PADS] = {  Rmax,      +
PI,      +0.4 * Dmax };
 
  292  double Xs[NUMBER_OF_PADS];
 
  294  for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  295    Xs[i] = 0.003 * (Xmax[i] - Xmin[i]) * (0.5 * NUMBER_OF_PMTS);          
 
  298  TH2D   H2[NUMBER_OF_PADS];
 
  299  TGraph G2[NUMBER_OF_PADS];
 
  301  for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  303    H2[i] = TH2D(
MAKE_CSTRING(
"h" << i), NULL, graphics.nbinsX, Xmin[i] - Xs[i], Xmax[i] + Xs[i], graphics.nbinsY, ymin, ymax);
 
  305    H2[i].GetXaxis()->SetTitle(Xlabel[i].c_str());
 
  306    H2[i].GetYaxis()->SetTitle(
"#Deltat [ns]");
 
  308    H2[i].GetXaxis()->CenterTitle(
true);
 
  309    H2[i].GetYaxis()->CenterTitle(
true);
 
  311    H2[i].SetStats(kFALSE);
 
  315    G2[i].SetPoint(0, H2[i].GetXaxis()->GetXmin(), 0.0);
 
  316    G2[i].SetPoint(1, H2[i].GetXaxis()->GetXmax(), 0.0);
 
  327    cout << 
"event: " << setw(8) << inputFile.getCounter() << endl;
 
  329    multi_pointer_type ps = inputFile.next();
 
  336      dynamics->update(*tev);
 
  339    if (mc.getEntries() != 0) {
 
  349      if (!event_selector(*tev, *in, event)) {
 
  356      buildL0(*tev, router, 
true, back_inserter(dataL0));
 
  366        for (
const auto& t1 : event->mc_trks) {
 
  368            if (t1.E > muon.
getE()) {
 
  375              muon = 
getFit(0, ta, 0.0, 0, t1.E, 1);
 
  383      bool   monte_carlo = 
false;                                          
 
  386      for (
bool next = 
false; !next; ) {
 
  388        for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  413        for (JDataL0_t::const_iterator i = dataL0.begin(); i != dataL0.end(); ++i) {
 
  426        sort(data.begin(), data.end(), JHitW0::compare);
 
  428        JDataW0_t::iterator __end = unique(data.begin(), data.end(), equal_to<JDAQPMTIdentifier>());      
 
  430        double E_GeV = parameters.
E_GeV;
 
  441        for (JDataW0_t::iterator hit = data.begin(); hit != __end; ++hit) {
 
  443          const double x  = hit->getX() - tz.
getX();
 
  444          const double y  = hit->getY() - tz.
getY();
 
  445          const double z  = hit->getZ();
 
  446          const double R  = sqrt(x*x + y*y);
 
  451        const double   z0 = tz.
getZ();
 
  464          marker[2].push_back(TMarker(z0 - tz.
getZ(), 0.0, kFullCircle));
 
  467          static_cast<TAttMarker&
>(marker[2][0]) = TAttMarker(kRed, kFullCircle, 0.7);
 
  468          static_cast<TAttMarker&
>(marker[2][1]) = TAttMarker(kRed, kFullCircle, 0.7);
 
  479        for (JDataW0_t::const_iterator hit = data.begin(); hit != __end; ++hit) {
 
  481          const double x  = hit->getX() - tz.
getX();
 
  482          const double y  = hit->getY() - tz.
getY();
 
  483          const double z  = hit->getZ() - tz.
getZ();
 
  484          const double R  = sqrt(x*x + y*y);
 
  488          JDirection3D dir(hit->getDX(), hit->getDY(), hit->getDZ()); 
 
  492          const double theta = dir.
getTheta();
 
  493          const double phi   = fabs(dir.
getPhi());                    
 
  496          const double E  = E_GeV;
 
  497          const double dt = T_ns.
constrain(hit->getT()  -  t1);
 
  508          chi2 += H1.getChi2() - H0.getChi2();
 
  511                << setw(8) << hit->getModuleID() << 
'.' << 
FILL(2,
'0') << (
int) hit->getPMTAddress() << 
FILL() << 
' ' 
  513                << 
FIXED(7,2) << R            << 
' ' 
  514                << 
FIXED(7,4) << theta        << 
' ' 
  515                << 
FIXED(7,4) << phi          << 
' ' 
  516                << 
FIXED(7,3) << dt           << 
' ' 
  517                << 
FIXED(7,3) << H1.getChi2() << 
' ' 
  518                << 
FIXED(7,3) << H0.getChi2() << endl);
 
  520          const double derivative = H1.getDerivativeOfChi2() - H0.getDerivativeOfChi2();
 
  522          double size = derivative * graphics.arrowScale;             
 
  524          if        (fabs(size) < Amin) { 
 
  525            size = (size > 0.0 ? +Amin : -Amin);
 
  526          } 
else if (fabs(size) > Amax) { 
 
  527            size = (size > 0.0 ? +Amax : -Amax);
 
  530          const double X[NUMBER_OF_PADS] = { R, atan2(y,x), z - R/
getTanThetaC() };
 
  532          const double xs = (double) (NUMBER_OF_PMTS - 2 * hit->getPMTAddress()) / (double) NUMBER_OF_PMTS;
 
  534          for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  536            TArrow a1(X[i] + xs*Xs[i], dt + graphics.T_ns, X[i] + xs*Xs[i], dt + graphics.T_ns  + size, graphics.arrowSize, graphics.arrowType.c_str());
 
  538            a1.SetLineWidth(graphics.lineWidth);
 
  539            a1.SetLineStyle(graphics.lineStyle);
 
  541            arrow[i].push_back(a1);
 
  543            H2[i].Fill(X[i], dt + graphics.T_ns);
 
  549        for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  550          if (H2[i].GetMaximum() > zmax) {
 
  551            zmax = H2[i].GetMaximum();
 
  557        for (
size_t i = 0; i != NUMBER_OF_PADS; ++i) {
 
  558          H2[i].SetMaximum(zmax);
 
  562        os << 
"  Q = "           << 
FIXED(4,0)      << fit.
getQ()
 
  563           << 
'/'                << 
FIXED(4,0)      << -chi2;
 
  565        os << 
"  cos(#theta) = " << 
FIXED(6,3)      << fit.
getDZ();
 
  569          os << 
"  Monte Carlo";
 
  576        TLatex title(0.05, 0.5, os.str().c_str());
 
  578        title.SetTextAlign(12);
 
  579        title.SetTextFont(42);
 
  580        title.SetTextSize(0.6);
 
  586        for (
int i = 0; i != NUMBER_OF_PADS; ++i) {
 
  590          if (option == arrow_t) {
 
  592            for (
auto& a1 : arrow[i]) {
 
  596            for (
auto& m1 : marker[i]) {
 
  601          if (option == histogram_t) {
 
  619          static int count = 0;
 
  622            cout << endl << 
"Type '?' for possible options." << endl;
 
  625          for (
bool user = 
true; user; ) {
 
  631            ts.
move(intersection.first);
 
  633            cout << 
"\n> " << flush;
 
  639              cout << 
"possible options: " << endl;
 
  640              cout << 
'p' << 
" -> " << 
"print information"                           << endl;
 
  641              cout << 
'q' << 
" -> " << 
"exit application"                            << endl;
 
  642              cout << 
'u' << 
" -> " << 
"update canvas"                               << endl;
 
  643              cout << 
's' << 
" -> " << 
"save graphics to file"                       << endl;
 
  644              cout << 
'+' << 
" -> " << 
"next fit"                                    << endl;
 
  645              cout << 
'-' << 
" -> " << 
"previous fit"                                << endl;
 
  646              cout << 
'M' << 
" -> " << 
"Monte Carlo true muon information"           << endl;
 
  647              cout << 
'F' << 
" -> " << 
"fit information"                             << endl;
 
  649                cout << 
'L' << 
" -> " << 
"reload event selector"                       << endl;
 
  651              cout << 
'r' << 
" -> " << 
"rewind input file"                           << endl;
 
  652              cout << 
'R' << 
" -> " << 
"switch to ROOT mode (quit ROOT to continue)" << endl;
 
  653              cout << 
' ' << 
" -> " << 
"next event (as well as any other key)"       << endl;
 
  659              cout << 
"intersection: " << 
FIXED(6,1) << intersection.first << 
' '<< 
FIXED(6,1) << intersection.second << endl;
 
  660              cout << 
"entry point:  " 
  683              index = (index != in->size() - 1 ? index + 1 : 0);
 
  689              index = (index != 0 ? index - 1 : in->size() - 1);
 
  697                ERROR(endl << 
"No Monte Carlo muon available." << endl);
 
  708                execute(
MAKE_STRING(
"make -f " << 
getPath(argv[0]) << 
"/JMakeEventSelector libs"), 3);
 
 
KM3NeT DAQ constants, bit handling, etc.
 
Data structure for detector geometry and calibration.
 
Dynamic detector calibration.
 
Basic data structure for L0 hit.
 
Keyboard settings for unbuffered input.
 
General purpose messaging.
 
#define DEBUG(A)
Message macros.
 
Direct access to module in detector data structure.
 
Auxiliary data structure for muon PDF.
 
Parallel scanning of objects from a single file or multiple files according a format that follows fro...
 
Utility class to parse command line options.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
I/O formatting auxiliaries.
 
#define MAKE_CSTRING(A)
Make C-string.
 
#define MAKE_STRING(A)
Make string.
 
Utility class to parse parameter values.
 
#define gmake_property(A)
macros to convert (template) parameter to JPropertiesElement object
 
int main(int argc, char **argv)
 
ROOT TTree parameter settings of various packages.
 
Router for direct addressing of module data in detector data structure.
 
Utility class to parse parameter values.
 
Data structure for set of track fit results.
 
void select(const JSelector_t &selector)
Select fits.
 
Data structure for track fit results with history and optional associated values.
 
void setW(const std::vector< double > &W)
Set associated values.
 
double getDZ() const
Get Z-slope.
 
double getE() const
Get energy.
 
int getStatus() const
Get status of the fit; negative values should refer to a bad fit.
 
double getQ() const
Get quality.
 
const std::vector< double > & getW() const
Get associated values.
 
double getT() const
Get time.
 
bool hasW(const int i) const
Check availability of value.
 
Data structure for fit of straight line paralel to z-axis.
 
double getT(const JVector3D &pos) const
Get arrival time of Cherenkov light at given position.
 
double getZ(const JPosition3D &pos) const
Get point of emission of Cherenkov light along muon path.
 
void setZ(const double z, const double velocity)
Set z-position of vertex.
 
double getY() const
Get y position.
 
double getX() const
Get x position.
 
JAxis3D & rotate(const JRotation3D &R)
Rotate axis.
 
void move(const double step)
Move vertex along this axis.
 
double getZmin() const
Get minimal z position.
 
intersection_type getIntersection(const JAxis3D &axis) const
Get intersection points of axis with cylinder.
 
void setZmin(const double zmin)
Set minimal z position.
 
void addMargin(const double D)
Add (safety) margin.
 
Data structure for direction in three dimensions.
 
JDirection3D & rotate(const JRotation3D &R)
Rotate.
 
JTime & add(const JTime &value)
Addition operator.
 
double getY() const
Get y position.
 
double getZ() const
Get z position.
 
double getX() const
Get x position.
 
double getTheta() const
Get theta angle.
 
double getPhi() const
Get phi angle.
 
Utility class to parse command line options.
 
Auxiliary class for a hit with background rate value.
 
Data structure for size of TCanvas.
 
int y
number of pixels in Y
 
int x
number of pixels in X
 
Wrapper class around ROOT TStyle.
 
General purpose class for object reading from a list of file names.
 
General purpose class for parallel reading of objects from a single file or multiple files.
 
Object reading from a list of files.
 
File router for fast addressing of summary data.
 
void update(const JDAQHeader &header)
Update router.
 
double getRate(const JDAQPMTIdentifier &id) const
Get rate.
 
Template definition for direct access of elements in ROOT TChain.
 
Enable unbuffered terminal input.
 
Streaming of input and output from Linux command.
 
int getRunNumber() const
Get run number.
 
int getFrameIndex() const
Get frame index.
 
JTriggerCounter_t getCounter() const
Get trigger counter.
 
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
 
double putTime() const
Get Monte Carlo time minus DAQ/trigger time.
 
static const int JSTART_LENGTH_METRES
distance between projected positions on the track of optical modules for which the response does not ...
 
JAxis3D getAxis(const Trk &track)
Get axis.
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
JTrack3E getTrack(const Trk &track)
Get track.
 
JPosition3D getPosition(const Vec &pos)
Get position.
 
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
 
Vec getOffset(const JHead &header)
Get offset.
 
JFit getFit(const int id, const JMODEL::JString &string)
Get fit parameters of string.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
double getMaximalDistance(const JDetector &detector, const bool option=false)
Get maximal distance between modules in detector.
 
std::string getPath(const std::string &file_name)
Get path, i.e. part before last JEEP::PATHNAME_SEPARATOR if any.
 
double getAngle(const JQuaternion3D &first, const JQuaternion3D &second)
Get space angle between quanternions.
 
std::istream & getline(std::istream &in, JString &object)
Read string from input stream until end of line.
 
std::string replace(const std::string &input, const std::string &target, const std::string &replacement)
Replace tokens in string.
 
static const double PI
Mathematical constants.
 
const double getInverseSpeedOfLight()
Get inverse speed of light.
 
double getTanThetaC()
Get average tangent of Cherenkov angle of water corresponding to group velocity.
 
const double getSpeedOfLight()
Get speed of light.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
bool qualitySorter(const JFit &first, const JFit &second)
Comparison of fit results.
 
JRECONSTRUCTION::JWeight getWeight
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
KM3NeT DAQ data structures and auxiliaries.
 
static const char WILDCARD
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
Auxiliary data structure for sequence of same character.
 
Auxiliary data structure for floating point format specification.
 
Dynamic detector calibration.
 
bool is_valid() const
Check validity of function.
 
void reload()
Reload function from shared library.
 
Auxiliary class to test history.
 
Auxiliary class to match data points with given model.
 
Auxiliary class for recursive type list generation.
 
Auxiliary data structure for muon PDF.
 
JFunction1D_t::result_type result_type
 
result_type calculate(const double E, const double R, const double theta, const double phi, const double t1) const
Get PDF.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
Data structure for fit parameters.
 
double TTS_ns
transition-time spread [ns]
 
double TMin_ns
minimal time w.r.t. Cherenkov hypothesis [ns]
 
double roadWidth_m
road width [m]
 
double TMax_ns
maximal time w.r.t. Cherenkov hypothesis [ns]
 
double VMax_npe
maximum number of of photo-electrons
 
double R_Hz
default rate [Hz]
 
size_t numberOfPrefits
number of prefits
 
Auxiliary class for defining the range of iterations of objects.
 
const JLimit & getLimit() const
Get limit.
 
static counter_type max()
Get maximum counter value.
 
Auxiliary data structure for floating point format specification.
 
The Vec class is a straightforward 3-d vector, which also works in pyroot.
 
Auxiliary include file for time conversion between DAQ/trigger hit and Monte Carlo hit.