67{
   71 
   75 
   78  JLimit_t&              numberOfEvents = inputFile.getLimit();
 
   79  string                 detectorFile;
   80  JCalibration_t         calibrationFile;
   81  double                 Tmax_s;
   84  size_t                 numberOfFits;
   86 
   87  try {
   88 
   89    JParser<> zap(
"Auxiliary program to convert fit results to Evt format.\ 
   90                  \nThe option -L corresponds to the name of a shared library \
   91                  \nand function so to rearrange the order of fit results.");
   92 
  103 
  104    zap(argc, argv);
  105  }
  106  catch(const exception& error) {
  107    FATAL(error.what() << endl);
 
  108  }
  109 
  110  if (detectorFile == "" && !calibrationFile.empty()) {
  111    FATAL(
"Missing detector file." << endl);
 
  112  }
  113 
  115  typedef JParallelFileScanner_t::multi_pointer_type                multi_pointer_type;
  116 
  118 
  119  if (detectorFile != "") {
  120    try {
  122    }
  125    }
  126  }
  127 
  128  unique_ptr<JDynamics> dynamics;
  129 
  130  if (!calibrationFile.empty()) {
  131 
  132    try {
  133 
  135 
  136      dynamics->load(calibrationFile);
  137    }
  138    catch(const exception& error) {
  140    }
  141  }
  142 
  143 
  146 
  147 
  149 
  151 
  152  try {
  154  } catch(const exception& error) {}
  155 
  157 
  158  
  159 
  161 
  162    buffer.DAQ.livetime_s = 
getLivetime(inputFile.begin(), inputFile.end());
 
  164 
  165    copy(buffer, header);
 
  166  }
  167 
  168  if (detectorFile != "") {
  169 
  172 
  173    copy(buffer, header);
 
  174  }
  175 
  176  
  178 
  179 
  181 
  184 
  186 
  188    
  189    STATUS(
"Processing: " << *i << endl);
 
  190    
  191    JParallelFileScanner_t in(*i);
  193 
  194    in.setLimit(inputFile.getLimit());
  195 
  197 
  198    int mc_run_id = 0;
  199    
  200    try {
  201 
  203    
  205      mc_run_id = head.start_run.run_id;
  206      
  207    } catch(const exception& error) {}
  208 
  209    
  210    while (in.hasNext()) {
  211 
  212      STATUS(
"event: " << setw(10) << in.getCounter() << 
'\r'); 
DEBUG(endl);
 
  213 
  214      multi_pointer_type ps = in.next();
  215 
  218 
  219      if (dynamics) {
  220        dynamics->update(*tev);                                                      
  221      }
  222 
  223      JFIT::JEvt::iterator __end = evt->end();
  224      
  225      if (numberOfFits > 0) {
  226        advance(__end = evt->begin(), min(numberOfFits, evt->size()));
 
  227      }
  228 
  230        partial_sort(evt->begin(), __end, evt->end(), 
qualitySorter);
 
  231      }
  232      
  234 
  235      if (mc.getEntries() != 0) {
  236 
  238 
  239        if (event != NULL) {
  240 
  241          out = *event;                                                              
  242 
  245          }
  246 
  248            i->pos += offset;                                                        
  249          }
  250        }
  251      }
  252      
  254 
  255      if (!pmt_router->empty()) {                                                    
  256 
  258 
  259          if (pmt_router.hasPMT(i->pmt_id)) {
  260 
  261            const JPMTAddress    address = pmt_router.getAddress(i->pmt_id);
 
  263            const JPMT&          pmt     = pmt_router.getPMT(address);
 
  264 
  265            i->dom_id     = 
id.
getID();
 
  266            i->channel_id = id.getPMTAddress();
  269 
  270          } else {
  271 
  272            miss_pmt[i->pmt_id] += 1;
  273          }
  274        }
  275      }
  276 
  277      if (!mod_router->empty()) {                                                    
  278 
  280 
  281          if (mod_router.hasModule(i->dom_id)) {
  282 
  284 
  287 
  288            const JPMT& pmt = mod_router.getPMT(
id);
 
  289 
  291            
  293            
  294            i->pmt_id = pmt.
getID();
 
  297            i->t      = hit.getT();
  298            i->tot    = hit.getToT();
  299            i->a      = cpu.getNPE(i->tot);
  300 
  301          } else {
  302 
  303            miss_mod[i->dom_id] += 1;
  304          }
  305        }
  306      }
  307 
  309 
  310        inline int get_index(
const JUUID& element)
 const 
  311        {
  312          const_iterator i = this->find(element);
  313          
  314          if (i != this->end())
  315            return std::distance(this->begin(), i);
  316          else
  317            return -1;
  318        }
  319      } uuid;
  320      
  321      for (JFIT::JEvt::const_iterator fit = evt->begin(); fit != __end; ++fit) {
  322        uuid.insert(fit->getUUID());
  323      }
  324 
  325      for (JFIT::JEvt::const_iterator fit = evt->begin(); fit != __end; ++fit) {     
  326        
  328        
  329        trk.
id        = uuid.get_index(fit->getUUID());
 
  330        trk.
pos       = 
Vec(fit->getX(),  fit->getY(),  fit->getZ());
 
  331        trk.
dir       = 
Vec(fit->getDX(), fit->getDY(), fit->getDZ());
 
  334        trk.
lik       = fit->getQ();
 
  337        
  338        if (fit->hasParentUUID()) {
  339          trk.
mother_id = uuid.get_index(fit->getParentUUID());
 
  340        }
  341 
  342        for (JHistory::const_iterator i = fit->getHistory().begin(); i != fit->getHistory().end(); ++i) {
  344        }
  345        
  346        for (int i = 0; i != fit->getN(); ++i) {
  347          trk.
fitinf.push_back(fit->getW(i));
 
  348        }
  349 
  351        
  352        out.
trks.push_back(trk);
 
  353      }
  354 
  355      out.
id = ++number_of_events;
 
  356 
  358    }
  359  }
  360 
  362 
  363  for (
const auto& i : miss_pmt) { 
ERROR(
"Misses PMT    "  << setw(8) << i.first << 
' ' << setw(8) << i.second << endl); }
 
  364  for (
const auto& i : miss_mod) { 
ERROR(
"Misses module "  << setw(8) << i.first << 
' ' << setw(8) << i.second << endl); }
 
  365 
  367 
  369 
  371}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
JAANET::calibration calibration
 
const JCalibration & getCalibration() const
Get calibration.
 
Router for direct addressing of module data in detector data structure.
 
Address of PMT in detector data structure.
 
Auxiliary class for map of PMT parameters.
 
const JPMTParameters & getPMTParameters(const JPMTIdentifier &id) const
Get PMT parameters.
 
Data structure for PMT parameters.
 
bool slewing
time slewing of analogue signal
 
Router for direct addressing of PMT data in detector data structure.
 
Data structure for PMT geometry, calibration and status.
 
Data structure for set of track fit results.
 
int getID() const
Get identifier.
 
Utility class to parse command line options.
 
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.
 
Template definition for direct access of elements in ROOT TChain.
 
static void setSlewing(const bool slewing)
Set slewing option.
 
JTriggerCounter_t getCounter() const
Get trigger counter.
 
static const int JPP_RECONSTRUCTION_TYPE
KM3NeT Data Definitions v3.6.0 https://git.km3net.de/common/km3net-dataformat.
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
void copy(const Head &from, JHead &to)
Copy header from from to to.
 
JPosition3D getPosition(const Vec &pos)
Get position.
 
Vec getOffset(const JHead &header)
Get offset.
 
std::istream & read(std::istream &in, JTestSummary &summary, const char delimiter=' ')
Read test summary.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
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.
 
counter_type advance(counter_type &counter, const counter_type value, const counter_type limit=std::numeric_limits< counter_type >::max())
Advance counter.
 
Long64_t counter_type
Type definition for counter.
 
double getLivetime(const std::string &file_name)
Get data taking live time.
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
const char * getTime()
Get current local time conform ISO-8601 standard.
 
KM3NeT DAQ data structures and auxiliaries.
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
std::vector< Hit > hits
list of hits
 
int mc_run_id
MC run identifier.
 
std::vector< Hit > mc_hits
MC: list of MC truth hits.
 
std::vector< Trk > mc_trks
MC: list of MC truth tracks.
 
int id
offline event identifier
 
std::vector< Trk > trks
list of reconstructed tracks (can be several because of prefits,showers, etc).
 
The Head class reflects the header of Monte-Carlo event files, which consists of keys (also referred ...
 
static const std::string dynamical()
 
PMT analogue signal processor.
 
Dynamic detector calibration.
 
Auxiliary class for recursive type list generation.
 
Empty structure for specification of parser element that is initialised (i.e. does not require input)...
 
General purpose sorter of fit results.
 
Auxiliary class for defining the range of iterations of objects.
 
static counter_type max()
Get maximum counter value.
 
The Trk class represents a Monte Carlo (MC) particle as well as a reconstructed track/shower.
 
int status
MC status code, see km3net-dataformat/definitions/trkmembers.csv for values.
 
std::vector< double > error_matrix
(NxN) error covariance matrix for fit parameters (stored as linear vector)
 
std::vector< double > fitinf
place to store additional fit info, see km3net-dataformat/definitions/fitparameters....
 
std::vector< int > rec_stages
list of identifyers of succesfull fitting stages resulting in this track
 
double E
Energy [GeV] (either MC truth or reconstructed)
 
double t
track time [ns] (when the particle is at pos )
 
int rec_type
identifier of the fitting algorithm/chain/strategy, see km3net-dataformat/definitions/reconstruction....
 
int mother_id
MC id of the parent particle.
 
double lik
likelihood or lambda value (for aafit, lambda)
 
Vec pos
postion [m] of the track at time t
 
The Vec class is a straightforward 3-d vector, which also works in pyroot.
 
static const int TRK_ST_FINALSTATE
for MC: the particle must be processed by detector simulation ('track_in' tag in evt files)....
 
static const int TRK_ST_UNDEFINED
status was not defined for this MC track (all reco tracks have this value)