Histogramming

The best is to start with an example. So, build and run the inlib histo.cpp example with :

    cd <path to inlib>
    cd examples/cpp
    c++ -I../.. histo.cpp
    ./a.out
 and on Windows :
    DOS> <setup VisualC++>
    DOS> CL.exe /I..\.. /GX /GR histo.cpp
    DOS> histo.exe

Simple, straight. And the same with the fit example. In the directory, can be found also a "build" shell script to have less typing (well there is no build.bat yet for Windows) :

    cd <path to inlib>
    cd examples/cpp
    ./build histo.cpp
    ./inlib_example_histo

You can have a look to histo.cpp and see that the code is rather simple and easy to customize...

// Copyright (C) 2010, Guy Barrand. All rights reserved.
// See the file inlib.license for terms.

#include <inlib/histo/h1d>
#include <inlib/histo/h2d>
#include <inlib/histo/p1d>
#include <inlib/histo/sliced>

#include <inlib/random>

#include <iostream>

int main(int argc,char** argv) {
  bool print = true;
  if(argc==2) {
    std::string s = argv[1];
    if(s=="-noprint") print = false;
  }

  unsigned int entries = 1000000;
 {
   inlib::random::gauss rg(1,2);
   inlib::histo::h1d h("Gauss",100,-5,5);
   for(unsigned int count=0;count<entries;count++) {
     h.fill(rg.shoot(),1.4);
   }
   if(print) h.hprint(std::cout);
   //std::cout << " mean " << h.mean() << ", rms " << h.rms() << std::endl;
 }

 {
   inlib::random::bw rbw(0,1);
   inlib::histo::h1d h("BW",100,-5,5);
   for(unsigned int count=0;count<entries;count++) {
     h.fill(rbw.shoot(),2.3);
   }
   if(print) h.hprint(std::cout);
 }

 {
   inlib::random::gauss rg(1,2);
   inlib::random::bw rbw(0,1);
   inlib::histo::p1d h("Profile",100,-5,5,-2,2);
   for(unsigned int count=0;count<entries;count++) {
     h.fill(rg.shoot(),rbw.shoot(),1);
   }
   if(print) h.hprint(std::cout);
 }

 {
   inlib::random::gauss rg(1,2);
   inlib::random::bw rbw(0,1);
   inlib::histo::h2d histogram("Gauss_BW",100,-5,5,100,-2,2);
   for(unsigned int count=0;count<entries;count++) {
     histogram.fill(rg.shoot(),rbw.shoot(),0.8);
   }
   if(print) histogram.hprint(std::cout);

  {
    inlib::histo::h1d* projection = 
      inlib::histo::projection_x(histogram,"SliceX");
    if(!projection) return -1;
    projection->set_title("Gauss_BW_projectionX");
    if(print) projection->hprint(std::cout);
    delete projection;
  }
   
  {
    inlib::histo::h1d* projection = 
      inlib::histo::projection_y(histogram,"SliceY");
    if(!projection) return -1;
    projection->set_title("Gauss_BW_projectionY");
    if(print) projection->hprint(std::cout);
    delete projection;
  }

  {
    inlib::histo::h1d* slice = 
      inlib::histo::slice_x(histogram,40,60,"SliceX");
    if(!slice) return -1;
    slice->set_title("Gauss_BW_sliceX");
    if(print) slice->hprint(std::cout);
    delete slice;
  }

  {
    inlib::histo::h1d* slice = 
      inlib::histo::slice_x(histogram,
              inlib::histo::axis<double>::UNDERFLOW_BIN,
              inlib::histo::axis<double>::UNDERFLOW_BIN,"SliceX");
    if(!slice) return -1;
    slice->set_title("Gauss_BW_sliceX_UNDER");
    if(print) slice->hprint(std::cout);
    delete slice;
  }

  {
    inlib::histo::h1d* slice = 
      inlib::histo::slice_x(histogram,
              inlib::histo::axis<double>::OVERFLOW_BIN,
              inlib::histo::axis<double>::OVERFLOW_BIN,"SliceX");
    if(!slice) return -1;
    slice->set_title("Gauss_BW_sliceX_OVER");
    if(print) slice->hprint(std::cout);
    delete slice;
  }

  {
    inlib::histo::h1d* slice = 
      inlib::histo::slice_y(histogram,30,50,"SliceY");
    if(!slice) return -1;
    slice->set_title("Gauss_BW_sliceY");
    if(print) slice->hprint(std::cout);
    delete slice;
  }

  {
    using namespace inlib::histo; //playing with namespaces.
    h1d* slice = slice_y(histogram,
                         axis<double>::UNDERFLOW_BIN,
                         axis<double>::UNDERFLOW_BIN,"SliceY");
    if(!slice) return -1;
    slice->set_title("Gauss_BW_sliceY_UNDER");
    if(print) slice->hprint(std::cout);
    delete slice;
  }

  {
    namespace tools = inlib::histo; //playing with namespaces.
    tools::h1d* slice = slice_y(histogram,
				tools::axis<double>::OVERFLOW_BIN,
				tools::axis<double>::OVERFLOW_BIN,"SliceY");
    if(!slice) return -1;
    slice->set_title("Gauss_BW_sliceY_OVER");
    if(print) slice->hprint(std::cout);
    delete slice;
  }

 }

  return 0;
}