Esempi: Lezione 3

../_images/linea.png

3.0 inclusione di una classe di `ROOT`

/*
c++ -o main_00 `root-config --glibs --cflags` main_00.cpp
*/

#include "TH1F.h"

int main (int argc, char ** argv)
  {
    TH1F istogramma ("istogramma", "titolo", 10, -5., 5.) ;

    return 0 ;
  }
../_images/linea.png

3.1 Riempimento di un `TH1F`

/*
c++ -o main_01 `root-config --glibs --cflags` main_01.cpp
*/

#include "TH1F.h"

int main (int argc, char ** argv)
  {
    TH1F istogramma ("istogramma", "istogramma", 10, -5., 5.) ;

    istogramma.Fill (2.2) ;

    return 0 ;
  }
../_images/linea.png

3.2 Disegno di un `TH1F`

/*
c++ -o main_02 `root-config --glibs --cflags` main_02.cpp
*/

#include "TH1F.h"
#include "TCanvas.h"

int main (int argc, char ** argv)
  {
    TH1F istogramma ("istogramma", "titolo", 10, -5., 5.) ;

    istogramma.Fill (2.2) ;
    istogramma.Fill (2.1) ;
    istogramma.Fill (-1.4) ;

    TCanvas c1 ;
//    istogramma.SetFillColor (kOrange + 1) ;
    istogramma.Draw () ;
    c1.Print ("esempio.png", "png") ;

    return 0 ;
  }
../_images/linea.png

3.3 Disegno di un `TH1F` con opzioni grafiche

/*
c++ -o main_03 `root-config --glibs --cflags` main_03.cpp
*/

#include "TH1F.h"
#include "TCanvas.h"

int main (int argc, char ** argv)
  {
    TH1F istogramma ("istogramma", "titolo", 10, -5., 5.) ;

    istogramma.Fill (2.2) ;
    istogramma.Fill (2.1) ;
    istogramma.Fill (-1.4) ;

    TCanvas c1 ;
    istogramma.SetFillColor (kOrange + 1) ;
    istogramma.GetXaxis ()->SetTitle ("asse x") ;
    istogramma.GetYaxis ()->SetTitle ("conteggi per bin") ;
    istogramma.Draw () ;
    c1.Print ("esempio.png", "png") ;

    return 0 ;
  }
../_images/linea.png

3.4 Riempimento di un istogramma con numeri casuali

/*
c++ -o main_04 `root-config --cflags --glibs` main_04.cpp
*/

#include <cstdlib>
#include <iostream>
#include <cmath>

#include "TH1F.h"
#include "TCanvas.h"

float fgaus (float x) 
  {
    return exp (-0.5 * x * x) ; 
  }

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 

float rand_TCL (float xMin, float xMax, int N = 10)
  {
    double y = 0. ; 
    for (int i = 0 ; i < N ; ++i)
      y += rand_range (xMin, xMax) ;
    y /= N ;
    return y ;
  }

int main (int argc, char ** argv)
  {
    TCanvas c1 ("c1", "c1", 100, 100, 1000, 1000) ;

    TH1F h ("h", "eventi pseudo-casuali Gaussiani", 200, -1.5, 1.5) ;

    for (int j = 0 ; j < 1000000 ; ++j)
      h.Fill (rand_TCL (-1., 1., 10)) ;

    h.GetXaxis ()->SetTitle ("numeri generati") ;
    h.SetFillColor (kOrange + 1) ;
    h.Draw () ;

    c1.Print ("Gaussian.png", "png") ;

    return 0 ;
  }
../_images/linea.png

3.5 Visualizzazione in scala logaritmica

/*
c++ -o main_05 `root-config --cflags --glibs` main_05.cpp
*/

#include <cstdlib>
#include <iostream>
#include <cmath>

#include "TH1F.h"
#include "TCanvas.h"

float fgaus (float x) 
  {
    return exp (-0.5 * x * x) ; 
  }

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 

float rand_TCL (float xMin, float xMax, int N = 10)
  {
    double y = 0. ; 
    for (int i = 0 ; i < N ; ++i)
      y += rand_range (xMin, xMax) ;
    y /= N ;
    return y ;
  }

int main (int argc, char ** argv)
  {
    TCanvas c1 ("c1", "c1", 100, 100, 1000, 1000) ;

    TH1F h ("h", "eventi pseudo-casuali Gaussiani", 200, -1.5, 1.5) ;

    for (int j = 0 ; j < 1000000 ; ++j)
      h.Fill (rand_TCL (-1., 1., 10)) ;

    h.GetXaxis ()->SetTitle ("numeri generati") ;
    h.SetFillColor (kOrange + 1) ;
    h.Draw () ;

    c1.SetLogy () ;
    c1.Print ("Gaussian.png", "png") ;

    return 0 ;
  }
../_images/linea.png

3.6 Stampa delle statistiche di un istogramma

/*
c++ -o main_06 `root-config --cflags --glibs` main_06.cpp
*/

#include <cstdlib>
#include <iostream>
#include <cmath>

#include "TH1F.h"
#include "TCanvas.h"

float fgaus (float x) 
  {
    return exp (-0.5 * x * x) ; 
  }

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 

float rand_TCL (float xMin, float xMax, int N = 10)
  {
    double y = 0. ; 
    for (int i = 0 ; i < N ; ++i)
      y += rand_range (xMin, xMax) ;
    y /= N ;
    return y ;
  }

int main (int argc, char ** argv)
  {
    TCanvas c1 ("c1", "c1", 100, 100, 1000, 1000) ;

    TH1F h ("h", "eventi pseudo-casuali Gaussiani", 200, -1.5, 1.5) ;

    for (int j = 0 ; j < 1000000 ; ++j)
      h.Fill (rand_TCL (-1., 1., 10)) ;

    std::cout << "numero di eventi:    " << h.GetEntries () << std::endl ;
    std::cout << "media:               " << h.GetMean ()    << std::endl ;
    std::cout << "deviazione standard: " << h.GetRMS ()     << std::endl ;

    return 0 ;
  }
../_images/linea.png

3.7 Test di una classe per il calcolo delle statistiche

  • La classe statistiche

#ifndef statistiche_h
#define statistiche_h

#include <cmath>

class statistiche
{
  public:

    statistiche () :
      m_sum (0.),
      m_sumSq (0.),
      m_N (0)
      {}

    ~statistiche () {}

    // aggiunge un elemento al campione
    long long int addEvent (double value) 
      {
        m_sum += value ;
        m_sumSq += value * value ;
        ++m_N ;
        return m_N ;
      }

    // restituisce la media
    double getMean () const
      {
        if (m_N == 0) return 0. ; 
        return m_sum / static_cast<double> (m_N) ;
      }

    // restituisce la varianza
    double getVariance (bool correct = false) const
      {
        if (m_N == 0) return 0. ; 
        double sigma = m_sumSq / static_cast<double>  (m_N) 
                       - (m_sum * m_sum) / static_cast<double> (m_N * m_N) ;
        if (correct && m_N > 1) sigma = sigma * m_N / static_cast<double> (m_N - 1) ;         
        return sigma ;
      }

    // restituisce la sigma
    double getSigma (bool correct = false) const
      {
        return sqrt (getVariance (correct)) ;
      }

    // restituisce la varianza della media
    double getVarianceMean (bool correct = false) const
      {
        return getVariance (correct) / m_N ;
      }

    // restituisce la sigma della media
    double getSigmaMean (bool correct = false) const
      {
        return sqrt (getVarianceMean (correct)) ;
      }
    
    // restituisce il numero di eventi
    double getN () const
      {
        return m_N ;
      }
    
    // annulla tutti i membri
    void reset () 
      {
        m_sum = 0. ;
        m_sumSq = 0. ;
        m_N = 0 ;
        return ;
      }

  private:  

    // somma dei numeri del campione
    double m_sum ;
    // somma quadrata dei numeri del campione
    double m_sumSq ;
    // numero di elementi del campione
    long long int m_N ;

} ;


#endif
  • il test

/*
c++ -o main_07 main_07.cpp
*/

#include <cstdlib>
#include <iostream>
#include "statistiche.h"

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 


int main (int argc, char ** argv)
  {
    statistiche s_eventi ;

    int i = 0 ;
    while (i++ < 1000) s_eventi.addEvent (rand_range (-3., 3.)) ;

    std::cout << "media               : " << s_eventi.getMean () << std::endl ;
    std::cout << "sigma               : " << s_eventi.getSigma () << std::endl ;
    std::cout << "sigma (corr)        : " << s_eventi.getSigma (true) << std::endl ;
    std::cout << "dev st. mean        : " << s_eventi.getSigmaMean () << std::endl ;
    std::cout << "dev st. mean (corr) : " << s_eventi.getSigmaMean (true) << std::endl ;

    return 0 ;
  }
../_images/linea.png

3.8 Calcolo della varianza all’aumentare del numero di punti

/*
c++ -o main_08 main_08.cpp
*/

#include <cstdlib>
#include <iostream>
#include "statistiche.h"

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 


int main (int argc, char ** argv)
  {
    if (argc < 2) 
      {
        std::cerr << "uso del programma: " << argv[0] << " NMAX" << std::endl ;
        return 1 ;
      }

    int NMAX = atoi (argv[1]) ;
    statistiche s_eventi ;

    for (int N = 1 ; N < NMAX ; N = N * 2)
      {
        int i = 0 ;
        while (i++ < N) s_eventi.addEvent (rand_range (-3., 3.)) ;
        std::cout << N 
                  << "\t" << s_eventi.getMean () 
                  << "\t" << s_eventi.getSigma ()
                  << "\t" << s_eventi.getSigmaMean () << "\n" ;
        s_eventi.reset () ;
      }

    return 0 ;
  }
../_images/linea.png

3.9 Disegno della varianza all’aumentare del numero di punti con TGraph

/*
c++ -o main_09 `root-config --glibs --cflags` main_09.cpp
*/

#include <cstdlib>
#include <iostream>
#include "TH1F.h"
#include <TGraph.h>
#include <TCanvas.h>
#include "statistiche.h"

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 


int main (int argc, char ** argv)
  {
    if (argc < 2) 
      {
        std::cerr << "uso del programma: " << argv[0] << " NMAX" << std::endl ;
        return 1 ;
      }

    int NMAX = atoi (argv[1]) ;
    statistiche s_eventi ;

    TGraph g_sigma ;
    TGraph g_sigmaMedia ;
    for (int N = 10 ; N < NMAX ; N = N * 2)
      {
        int i = 0 ;
        while (i++ < N) s_eventi.addEvent (rand_range (-3., 3.)) ;

        g_sigma.SetPoint (g_sigma.GetN (), N, s_eventi.getSigma ()) ;
        g_sigmaMedia.SetPoint (g_sigmaMedia.GetN (), N, s_eventi.getSigmaMean ()) ;

        s_eventi.reset () ;
      }

    TCanvas c1 ("c1", "c1", 100, 100, 1000, 1000) ;
    c1.SetLogx () ;

    g_sigma.SetMarkerStyle (20) ;
    g_sigma.SetMarkerColor (kAzure - 1) ;
    g_sigma.SetLineColor (kGray + 1) ;
    g_sigma.SetMarkerSize (2) ;
    g_sigma.GetHistogram ()->GetYaxis ()->SetRangeUser (0., 2.) ;
    g_sigma.GetHistogram ()->GetXaxis ()->SetTitle ("numero di eventi nel campione") ;
    g_sigma.GetHistogram ()->GetYaxis ()->SetTitle ("deviazione standard") ;
    g_sigma.Draw ("ALP") ;
    c1.Print ("sigmaTrend.png", "png") ;

    g_sigmaMedia.SetMarkerStyle (20) ;
    g_sigmaMedia.SetMarkerColor (kAzure - 1) ;
    g_sigmaMedia.SetLineColor (kGray + 1) ;
    g_sigmaMedia.SetMarkerSize (2) ;
    g_sigmaMedia.GetHistogram ()->GetXaxis ()->SetTitle ("numero di eventi nel campione") ;
    g_sigmaMedia.GetHistogram ()->GetYaxis ()->SetTitle ("deviazione standard dalla media") ;
    g_sigmaMedia.Draw ("ALP") ;
    c1.Print ("sigmaMediaTrend.png", "png") ;


    return 0 ;
  }
../_images/linea.png

3.10 Riempimento e disegno di un `TH2F` con numeri casuali

/*
c++ -o main_10 `root-config --cflags --glibs` main_10.cpp
*/

#include <cstdlib>
#include <iostream>
#include <cmath>

#include "TH2F.h"
#include "TCanvas.h"

float fgaus (float x) 
  {
    return exp (-0.5 * x * x) ; 
  }

float rand_range (float min, float max)
  {
    return min + (max - min) * rand () / static_cast<float> (RAND_MAX) ;
  } 

float rand_TCL (float xMin, float xMax, int N = 10)
  {
    double y = 0. ; 
    for (int i = 0 ; i < N ; ++i)
      y += rand_range (xMin, xMax) ;
    y /= N ;
    return y ;
  }

int main (int argc, char ** argv)
  {
    TCanvas c1 ("c1", "c1", 100, 100, 1000, 1000) ;

    TH2F h2 ("h2", "eventi pseudo-casuali Gaussiani", 200, -1.5, 1.5, 200, -1.5, 1.5) ;

    for (int j = 0 ; j < 1000000 ; ++j)
      h2.Fill (rand_TCL (-1., 1., 10), rand_TCL (-1., 1., 10)) ;

    h2.GetXaxis ()->SetTitle ("numeri generati") ;
    h2.GetYaxis ()->SetTitle ("numeri generati") ;
    h2.Draw ("LEGO") ;

    c1.Print ("Gaussian2D.png", "png") ;

    return 0 ;
  }
../_images/linea.png

3.11 Utilizzo di un oggetto della classe `TApplication`

/*
c++ -o main_11 `root-config --glibs --cflags` main_11.cpp
*/

#include "TH1F.h"
#include "TCanvas.h"
#include "TApplication.h"

int main (int argc, char ** argv)
  {

    TH1F istogramma ("istogramma", "istogramma", 10, -5., 5.) ;

    istogramma.Fill (2.2) ;

    TApplication theApp ("theApp", &argc, argv) ;
    TCanvas c1 ;
    istogramma.Draw ("hist") ;

    theApp.Run () ;

    return 0 ;
  }
../_images/linea.png

3.12 utilizzo di un oggetto della classe `TString`

/*
c++ -o main_12 `root-config --glibs --cflags` main_12.cpp
*/

#include "TH1F.h"
#include "TString.h"
#include "TCanvas.h"
#include "TApplication.h"

int main (int argc, char ** argv)
  {
    int num = atoi (argv[1]) ;
    TString titolo = "ci sono " ;
    titolo += num ;
    titolo += " eventi" ;
    TH1F istogramma ("istogramma", titolo, 10, -5., 5.) ;
    for (int i = 0 ; i < num ; ++i) istogramma.Fill (2.2) ;

    TApplication theApp ("theApp", &argc, argv) ;
    TCanvas c1 ;
    istogramma.Draw () ;
    theApp.Run () ;

    return 0 ;
  }