Soluzioni: Lezione 9

../_images/linea.png

9.1 generazione di toy experiment

  • esercizio_01.cpp

/*
c++ -o esercizio_01 casual.cc esercizio_01.cpp
*/

#include <iostream>
#include <vector>

#include "casual.h"

using namespace std ;

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

  if (argc < 3)
    {
      cerr << "uso: " << argv[0] << " tau nnumero_di_eventi" << endl ;
      exit (1) ;
    }

  double t_zero = atof (argv[1]) ;
  vector<double> campione ;
  for (int i = 0 ; i < atoi (argv[2]) ; ++i)
    {
      campione.push_back (rand_exp (t_zero)) ;
    }

  cout << "generati: " << campione.size () << " numeri pseudo-casuali\n" ;
  return 0 ;
}
  • casual.h

#ifndef casual_h
#define casual_h

double rand_range (double min, double max) ;

float rand_exp (double t_zero) ;

float rand_pois (double media) ;

#endif
  • casual.cc

#include "casual.h"
#include <cstdlib>
#include <cmath>

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

float rand_exp (double t_zero)
{
  return -1. * log (1 - rand_range (0., 1.)) * t_zero ;
}

float rand_pois (double media) 
{
  double t_tot = rand_exp (1.) ;
  int N_evt = 0 ;
  while (t_tot < media)
    {
      ++N_evt ;
      t_tot += rand_exp (1.) ;
    }
  return N_evt ;
}
../_images/linea.png

9.2 disegno di toy experiment

  • esercizio_02.cpp

/*
c++ -o esercizio_02 `root-config --glibs --cflags` utils.cc casual.cc esercizio_02.cpp
*/

#include <iostream>
#include <vector>

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

#include "utils.h"
#include "casual.h"
#include "statistiche.h"

using namespace std ;


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

  if (argc < 3)
    {
      cerr << "uso: " << argv[0] << " tau nnumero_di_eventi" << endl ;
      exit (1) ;
    }

  double t_zero = atof (argv[1]) ;
  vector<double> campione ;
  for (int i = 0 ; i < atoi (argv[2]) ; ++i)
    {
      campione.push_back (rand_exp (t_zero)) ;
    }

  TH1F * histo = crea_histo ("h_exp", campione) ;

  TCanvas c1 ;
  histo->SetFillColor (kBlue) ;
  histo->Draw () ;
  c1.Print ("esercizio_02.png", "png") ;

  delete histo ;
  return 0 ;
}
  • statistiche.h

#ifndef statistiche_h
#define statistiche_h

#include <cmath>
#include <vector>

template <class T>
double media (std::vector<T> const & inputV)
  {
    double sum = 0. ;
    for (int i = 0 ; i < inputV.size () ; ++i) sum += inputV.at (i) ;
    return sum / inputV.size () ;
  }

template <class T>
double varianza (std::vector<T> const & inputV)
  {
    double sum = 0. ;
    double sumSq = 0. ;
    for (int i = 0 ; i < inputV.size () ; ++i) 
      {
        sum += inputV.at (i) ;
        sumSq += inputV.at (i) * inputV.at (i) ;
      }
    return sumSq / inputV.size () - (sum * sum) / (inputV.size () * inputV.size ()) ;
  }

template <class T>
double sigma (std::vector<T> const & inputV)
  {
    return sqrt (varianza (inputV)) ;
  }

template <class T>
double asimmetria (std::vector<T> const & inputV)
  {
    double mediaV = media (inputV) ;
    double asimmV = 0. ;
    for (int i = 0 ; i < inputV.size () ; ++i) 
      {
        asimmV += pow ((inputV.at (i) - mediaV), 3.) ;
      }
    return asimmV / (inputV.size () * pow (sigma (inputV),3.)) ;
  }

template <class T>
double curtosi (std::vector<T> const & inputV) 
  {
    double mediaV = media (inputV) ;
    double curtosiV = 0. ;
    for (int i = 0 ; i < inputV.size () ; ++i) 
      {
        curtosiV += pow ((inputV.at (i) - mediaV), 4.) ;
      }
    return curtosiV / (inputV.size () * varianza (inputV) * varianza (inputV)) - 3. ;
  }

#endif
  • utils.h

#ifndef L9_utils_h
#define L9_utils_h

#include "TH1F.h"
#include <string>
#include <vector>

TH1F * crea_histo (const std::string & histo_name, const std::vector<double> & campione) ;

#endif
  • utils.cc

#include "utils.h"
#include "statistiche.h"

using namespace std ;

TH1F * crea_histo (const string & histo_name, const vector<double> & campione)
{
  double m = media (campione) ;
  double s = sigma (campione) ;
  double N = campione.size () ;
  double minimo_campione = *min_element (campione.begin (), campione.end ()) ;
  double massimo_campione = *max_element (campione.begin (), campione.end ()) ;
  double minimo_histo = max (minimo_campione, m - 5 * s) ;
  double massimo_histo = min (massimo_campione, m + 5 * s) ;
  int Nbin = 10 * log (N/10) ;

  TH1F * histo = new TH1F (
      histo_name.c_str (), histo_name.c_str (),
      Nbin, 
      minimo_histo, 
      massimo_histo
    ) ;

  for (int i = 0 ; i < campione.size () ; ++i)
    {
      histo->Fill (campione.at (i)) ;
    }
  return histo ;
}
../_images/linea.png

9.3 disegno di una funzione implementata in `C++`

  • esercizio_03.cpp

/*
c++ -o esercizio_03 `root-config --glibs --cflags` funzioni.cc esercizio_03.cpp
*/

#include <iostream>
#include <vector>

#include "TCanvas.h"
#include "TF1.h"

#include "funzioni.h"

using namespace std ;

int main (int argc, char ** argv)
{
  if (argc < 2)
    {
      cerr << "uso: " << argv[0] << " tau" << endl ;
      exit (1) ;
    }

  double t_zero = atof (argv[1]) ;

  TF1 f_exp ("f_exp", exp_R, 0, 5 * t_zero, 1) ;
  f_exp.SetParameter (0, t_zero) ;
  f_exp.SetParName (0, "t_0") ;
  f_exp.SetLineColor (kBlue) ;
  f_exp.SetLineWidth (2) ;

  TCanvas c1 ;
  f_exp.Draw () ;
  c1.Print ("esercizio_03.png", "png") ;

  return 0 ;
}
  • funzioni.h

#ifndef L9_funzioni_h
#define L9_funzioni_h

#include "TF1.h"

double esponenziale (double x, double tau) ;

Double_t exp_R (Double_t * x, Double_t * par) ;

Double_t loglikelihood (Double_t * x, Double_t * par) ;

#endif
../_images/linea.png

9.4 disegno di una funzione di verosimiglianza

  • esercizio_04.cpp

/*
c++ -o esercizio_04 `root-config --glibs --cflags` casual.cc funzioni.cc esercizio_04.cpp
*/

#include <iostream>
#include <vector>

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

#include "casual.h"
#include "funzioni.h"
#include "statistiche.h"

using namespace std ;


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

  if (argc < 3)
    {
      cerr << "uso: " << argv[0] << " tau nnumero_di_eventi" << endl ;
      exit (1) ;
    }

  double t_zero = atof (argv[1]) ;
  vector<double> campione ;
  for (int i = 0 ; i < atoi (argv[2]) ; ++i)
    {
      campione.push_back (rand_exp (t_zero)) ;
    }

  double m = media (campione) ;
  double s = sigma (campione) ;

  vector<double> dati_forTF1 ;
  dati_forTF1.push_back (campione.size ()) ;
  dati_forTF1.insert (dati_forTF1.end (), campione.begin (), campione.end ()) ;

  TF1 f_ll ("f_ll", loglikelihood, max (0.1 * m, m - 3 * s), m + 3 * s, dati_forTF1.size ()) ;
  f_ll.SetParameters (&dati_forTF1[0]) ;
  f_ll.SetLineColor (kRed) ;
  f_ll.SetLineWidth (2) ;

  TCanvas c1 ;
  f_ll.Draw () ;
  c1.Print ("esercizio_04.png", "png") ;

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