59{
   63 
   65  JLimit_t&      numberOfEvents = inputFile.getLimit();
 
   67  string         detectorFile;
   68  double         Tmax_ns;
   69  double         roadWidth_m;
   70  double         ctMin;
   71  double         alpha_deg;
   72  double         sigma_ns;
   73  int            numberOfOutliers;
   74  bool           useTrue;
   76 
   77  try { 
   78 
   79    JParser<> zap(
"Example program to test chi2 calculations of co-variance matrix including direction uncertainty.");
 
   80    
   93    
   94    zap(argc, argv);
   95  }
   96  catch(const exception& error) {
   97    FATAL(error.what() << endl);
 
   98  }
   99 
  100 
  102 
  103 
  104  const unsigned int NUMBER_OF_HITS      =  6;
  105  const double       STANDARD_DEVIATIONS =  3.0;                        
  106  const double       HIT_OFF             =  1.0e3 * sigma_ns*sigma_ns;  
  107 
  108 
  110 
  111  try {
  113  }
  116  }
  117 
  120 
  122 
  123 
  125 
  126 
  127  TH1D h0("h0", NULL, 50,  0.0,  20.0);
  128  TH1D h1("h1", NULL, 50,  0.0,  20.0);
  129 
  130  TH1D p0("p0", NULL, 50,  0.0,   1.0);
  131  TH1D 
p1(
"p1", NULL, 50,  0.0,   1.0);
 
  132 
  134 
  135  {
  137    
  138    for ( ; 
x <  10.0; 
x +=  1.0) { X.push_back(x); }
 
  139    for ( ; 
x <  25.0; 
x +=  2.0) { X.push_back(x); }
 
  140    for ( ; 
x < 100.0; 
x +=  5.0) { X.push_back(x); }
 
  141  }
  142 
  143  TProfile n0("n0", NULL, X.size() - 1, X.data());
  144  TProfile n1("n1", NULL, X.size() - 1, X.data());
  145 
  146 
  151 
  153 
  155 
  157 
  159 
  161    const Evt*       
event = ps;
 
  162    
  164        
  165    vector<Trk>::const_iterator muon = find_if(event->mc_trks.begin(), event->mc_trks.end(), 
is_muon);
 
  166 
  167    if (muon != event->mc_trks.end()) {
  168 
  170 
  172 
  174      tz.rotate(R);
  175 
  176      const double theta = alpha_deg * PI / 180.0;
  177      const double phi   = gRandom->Uniform(0.0, 2*PI);
  178      
  180 
  181 
  183 
  184      if (!useTrue) {
  185 
  186        buildL2(*tev, moduleRouter, back_inserter(data));
  187        
  188        data.erase(unique(
data.begin(), 
data.end(), equal_to<JDAQModuleIdentifier>()), 
data.end());
 
  189 
  190      } else {
  191 
  193 
  194        for (vector<Hit>::const_iterator i = event->mc_hits.begin(); i != event->mc_hits.end(); ++i) {
  195          
  197            
  198            const JPMTAddress&    address = pmtRouter.getAddress(i->pmt_id);
 
  200            const JPMT&           pmt     = pmtRouter.getPMT(address);
 
  201            const double          t1      = converter.putTime(
getTime(*i));
 
  202 
  204          }
  205        }
  206 
  208 
  209          sort(i->second.begin(), i->second.end(), less<JHit>());
  210          
  211          data.push_back(i->second[0]);
 
  212        }
  213      }
  214 
  215 
  216      
  217 
  219 
  220 
  221      
  222      
  223      for (JData_t::iterator i = 
data.begin(); i != 
data.end(); ++i) {
 
  224        i->rotate(R);
  225      }
  226 
  228 
  229 
  230      
  231 
  233 
  234 
  235      
  236 
  237      for (JData_t::iterator i = 
data.begin(); i != 
data.end(); ++i) {
 
  238        i->sub(tz.getPosition());
  239      }
  240 
  242 
  243      
  244      
  245 
  246      for (JData_t::iterator i = 
data.begin(); i != 
data.end(); ++i) {
 
  247        i->rotate_back(Rs);
  248      }
  249 
  250 
  251      if (
data.size() >= NUMBER_OF_HITS + numberOfOutliers) {
 
  252 
  253        JData_t::iterator __end = 
data.end();
 
  254 
  255        for (
int n = 0; 
n < numberOfOutliers && 
distance(
data.begin(), __end) > NUMBER_OF_HITS; ++
n) {
 
  256          
  257          double            ymax = 0.0;
  258          JData_t::iterator kill = __end;
  259          
  260          for (JData_t::iterator i = 
data.begin(); i != __end; ++i) {
 
  261            
  262            const double y = fabs(i->getT() - tz.getT(*i)) / sigma_ns;
 
  263            
  264            if (y > ymax) {
  266              kill = i;
  267            }
  268          }
  269          
  270          if (ymax >= STANDARD_DEVIATIONS)
  271            iter_swap(kill, --__end);
  272          else 
  273            break;
  274        }
  275 
  276        const double chi2 = 
getChi2(tz, 
data.begin(), __end, sigma_ns);
 
  278        
  279        h0.Fill(chi2 / N);
  280        p0.Fill(TMath::Prob(chi2, N));
  281        n0.Fill((
double) 
data.size(), (
double) N / (
double) 
data.size()); 
 
  282      }
  283 
  284 
  285      if (
data.size() >= NUMBER_OF_HITS + numberOfOutliers) {
 
  286 
  289 
  290        V.
set(tz, 
data.begin(), 
data.end(), alpha_deg, sigma_ns);
 
  292 
  294 
  295        unsigned int N = 
data.size();
 
  296        
  298          
  299          double ymax =  0.0;
  300          int    kill = -1;
  301          
  302          for (
unsigned int i = 0; i != V.
size(); ++i) {
 
  303              
  305            
  306            if (y > ymax) {
  308              kill = i;
  309            }
  310          }
  311 
  312          if (ymax >= STANDARD_DEVIATIONS * STANDARD_DEVIATIONS)
  314          else 
  315            break;
  316        }
  317          
  318        const double chi2 = V.
getDot(Y);
 
  319        
  320        h1.Fill(chi2 / N);
  321        p1.Fill(TMath::Prob(chi2, N));
 
  322        n1.Fill((
double) 
data.size(), (
double) N / (
double) 
data.size());
 
  323      }
  324    }
  325  }
  327 
  328  out.Write();
  329  out.Close();
  330}
#define DEBUG(A)
Message macros.
 
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
 
std::vector< T >::difference_type distance(typename std::vector< T >::const_iterator first, typename PhysicsEvent::const_iterator< T > second)
Specialisation of STL distance.
 
int first
index of module in detector data structure
 
Router for direct addressing of module data in detector data structure.
 
Address of PMT in detector data structure.
 
Router for direct addressing of PMT data in detector data structure.
 
Data structure for PMT geometry, calibration and status.
 
Data structure for fit of straight line paralel to z-axis.
 
Determination of the co-variance matrix of hits for a track along z-axis (JFIT::JLine1Z).
 
void set(const JVector3D &pos, T __begin, T __end, const double alpha, const double sigma)
Set co-variance matrix.
 
static double getDot(const variance &first, const variance &second)
Get dot product.
 
Determination of the time residual vector of hits for a track along z-axis (JFIT::JLine1Z).
 
void set(const JLine1Z &track, T __begin, T __end)
Set time residual vector.
 
Data structure for angles in three dimensions.
 
Data structure for vector in three dimensions.
 
double getZ() const
Get z position.
 
Utility class to parse command line options.
 
counter_type getCounter() const
Get counter.
 
Data structure for L0 hit.
 
static void setSlewing(const bool slewing)
Set slewing option.
 
3D match criterion with road width.
 
Auxiliary class to convert DAQ hit time to/from Monte Carlo hit time.
 
JDirection3D getDirection(const Vec &dir)
Get direction.
 
JPosition3D getPosition(const Vec &pos)
Get position.
 
bool is_muon(const Trk &track)
Test whether given track is a (anti-)muon.
 
bool is_noise(const Hit &hit)
Verify hit origin.
 
Vec getOffset(const JHead &header)
Get offset.
 
void load(const std::string &file_name, JDetector &detector)
Load detector from input file.
 
double getChi2(const double P)
Get chi2 corresponding to given probability.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
 
Head getHeader(const JMultipleFileScanner_t &file_list)
Get Monte Carlo header.
 
const char * getTime()
Get current local time conform ISO-8601 standard.
 
JHitIterator_t clusterizeWeight(JHitIterator_t __begin, JHitIterator_t __end, const JMatch_t &match)
Partition data according given binary match operator.
 
KM3NeT DAQ data structures and auxiliaries.
 
The Evt class respresent a Monte Carlo (MC) event as well as an offline event.
 
General purpose class for multiple pointers.
 
size_t size() const
Get dimension of matrix.
 
void update(const size_t k, const double value)
Update inverted matrix at given diagonal element.
 
void invert()
Invert matrix according LDU decomposition.
 
Auxiliary class for defining the range of iterations of objects.
 
static counter_type max()
Get maximum counter value.
 
Auxiliary class to synchronously read DAQ events and Monte Carlo events (and optionally other events)...
 
virtual bool hasNext() override
Check availability of next element.
 
virtual const multi_pointer_type & next() override
Get next element.
 
Data structure for L2 parameters.
 
The Vec class is a straightforward 3-d vector, which also works in pyroot.