106{
  108 
  109  double         rate_Hz;
  111 
  112  try {
  113 
  114    JParser<> zap(
"Example program to test performance of merge sort.");
 
  115 
  118 
  119    zap(argc, argv);
  120  }
  121  catch(const exception &error) {
  122    FATAL(error.what() << endl);
 
  123  }
  124 
  125 
  127 
  128  if (rate_Hz <= 0.0) {
  129    FATAL(
"Rate " << rate_Hz << 
" < 0 Hz." << endl);
 
  130  }
  131 
  132  const double period = 1.0e9 / rate_Hz;      
  133 
  134  const double Tmin   = 0.0;                  
  135  const double Tmax   = 1.0e8;                
  136 
  137  const int NUMBER_OF_PMTS    =       31;
  138  const int NUMBER_OF_MODULES = 115 * 18;
  139 
  140 
  141  
  142  typedef double                     hit_type; 
  144  const   JElement_t                 getElement;
  147 
  148 
  149  
  150 
  151  JBuffer2D input(NUMBER_OF_PMTS);
  152 
  153  size_t number_of_hits = 0;
  154 
  155  for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
  156 
  157    for (
double t1 = Tmin + gRandom->Exp(period); t1 < Tmax; t1 += gRandom->
Exp(period), ++number_of_hits) {
 
  158      input[i].push_back(getElement(t1));
  159    }
  160 
  161    NOTICE(
"PMT[" << setw(2) << i << 
"]  " << input[i].size() << endl);
 
  162 
  164  }
  165 
  166 
  169    JTimer(
"std::inplace_merge"),
 
  171  };
  172 
  173 
  174  {
  175    JBuffer1D buffer;
  176 
  177    for (int i = 0; i != NUMBER_OF_MODULES; ++i) {
  178 
  180 
  181      buffer.clear();
  182 
  183      for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
  184        copy(input[i].begin(), input[i].end(), back_inserter(buffer));
 
  185      }
  186 
  187      std::sort(buffer.begin(), buffer.end());
  188 
  190 
  191      ASSERT(buffer.size() == number_of_hits,         
"Test std::sort.");
 
  192      ASSERT(is_sorted(buffer.begin(), buffer.end()), 
"Test std::sort.");
 
  193    }
  194  }
  195 
  196  {
  197    JBuffer1D buffer;
  198 
  200 
  201    for (int i = 0; i != NUMBER_OF_MODULES; ++i) {
  202 
  204 
  206 
  207      for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
  208        n += input[i].size();
 
  209      }
  210 
  211      buffer.resize(n);
  212 
  213      JBuffer1D::iterator out = buffer.begin();      
  214 
  215      delimiter[0] = 0;
  216 
  217      for (int i = 0; i != NUMBER_OF_PMTS; ++i) {
  218 
  219        out = 
copy(input[i].begin(), input[i].end(), out);
 
  220 
  221        delimiter[i+1] = 
distance(buffer.begin(), out);
 
  222      }
  223 
  224      inplace_merge(buffer.begin(), delimiter.size(), delimiter.data());
 
  225 
  227 
  228      ASSERT(buffer.size() == number_of_hits,         
"Test std::inplace_merge.");
 
  229      ASSERT(is_sorted(buffer.begin(), buffer.end()), 
"Test std::inplace_merge.");
 
  230    }
  231  }
  232 
  233  {
  234    JBuffer1D            buffer;
  236 
  237    for (int i = 0; i != NUMBER_OF_MODULES; ++i) {
  238 
  240 
  241      buffer.clear();
  242      
  243      merge(input, buffer);
  244 
  246 
  247      ASSERT(buffer.size() == number_of_hits,         
"Test JMergeSort.");
 
  248      ASSERT(is_sorted(buffer.begin(), buffer.end()), 
"Test JMergeSort.");
 
  249    }
  250  }
  251 
  252 
  253  for (int i = 0; i != sizeof(timer)/sizeof(timer[0]); ++i) {
  254    timer[i].
print(cout, 
false);
 
  255  }
  256}
#define ASSERT(A,...)
Assert macro.
 
#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.
 
Auxiliary class for CPU timing and usage.
 
void print(std::ostream &out, const JScale_t scale=milli_t) const
Print timer data.
 
Utility class to parse command line options.
 
void copy(const Head &from, JHead &to)
Copy header from from to to.
 
void putEndMarker(std::vector< JElement_t, JAllocator_t > &buffer, const JElement_t &value)
Put end marker.
 
JExp< JF1_t > Exp(const JF1_t &f1)
Exponent of function.
 
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).