Kalanand's November 2008 Log

   October 2008   
November 2008
SuMoTuWeThFrSa
      1
2345678
9101112131415
16171819202122
23242526272829
30      
   December 2008   

November 4th

Accessing CMS edm objects from ROOT browser

To be able to access CMS edm objects from ROOT browser, one need to include the following lines in .root_logon.C or at the command prompt in an interactive ROOT session.
gSystem->Load("libFWCoreFWLite.so");
AutoLibraryLoader::enable();

November 20th

Computing expected significance of a signal

The code below (ExpectedSignificance.C) computes the expected significance of a signal in a counting experiment given the number of signal and background events.
void ExpectedSignificance(double nb, double ns)
{
  cout<<"Average background    = "<< nb << endl;
  cout<<"Average signal        = "<< ns << endl;
  cout<<"Expected Significance = "<< NSigmas(nb,ns) << " sigma"<< endl; 
}




double NSigmas(double nb, double ns)
{
  int i;
  double sum,n,high,sigmas,dsum,w,p;
  n = nb+ns;
  high = 2*n;
  sum = TMath::Exp(-n);
  i = 0;
  dsum = 1.e+9;
  while ((i < high) || (dsum>1.e-8*sum))
    {
      i++;
      w = TMath::Exp(1.*i*TMath::Log(n)-n-TMath::LnGamma(1.*i+1.));//probability to observe i number of events when you expect n 
      p = TMath::Gamma(1.*i+1.,nb);//tail probability under the background hypothesis
      dsum = p*w;
      sum+=dsum;
      if ((i==high) || (dsum<1.e-8*sum))
        break;
    }
  if (sum<1.e-316)
    {
      sigmas = 0;
      cout << "WARNING: tail probability out of limits!!!!"<< endl;
    }
  else
    sigmas = InvertTailGaus(sum);
  return sigmas;
}




double TailGaus(double x)
{
  // Function to integrate the tail of the Normal Gaussian
  // It uses the standard Trapezoid method.
  double xmax = 38;
  double sum = 0.; 
  double dx = 0.01;
  double y = x;
  double tmp;
  int i,N;
  N = (xmax-x)/dx;
  if (x>xmax)
    return 0.;
  else
    {
      if (x<=0)
        return 0.5;
      else
        { 
          sum = 0.5*(TMath::Gaus(x,0,1,kTRUE)+TMath::Gaus(xmax,0,1,kTRUE));
          for(i=1;i< N;i++)
            {
              tmp = TMath::Gaus(x+i*dx,0,1,kTRUE);
              sum+=tmp;
            }
          return dx*sum;
        }
    } 
}




double InvertTailGaus(double x)
{
  // Function to invert the tail probability of the Normal Gaussian
  // It uses the Bisection method to solve numerically the equation y-f(x)=0 for a given y.
  // The Newton method is faster but it does not work for x<1e-16.
  int n = 0;
  double a = 0;
  double b = 38;
  double y,tmp,result,fa,fb,f,e;
  if (x==0.5)
    result=0;
  else
    {
      e = 100;
      y = 0.5*(a+b);
      while ((e>1.e-3) && (n<100))
        {  
          f = x-TailGaus(y);
          fa = x-TailGaus(a);
          fb = x-TailGaus(b);
          if (f==0)
            {
              result=y;
              break;
            }
          if (fa==0)
            {
              result=a;
              break;
            } 
          if (fb==0)
            {
              result=b;
              break;
            }
          // Do not change the expression to fa*fb<0 because it will work only down to f,fa = 1e-158          
          if ((f>0 && fa<0) || (f<0 && fa>0))
            b = y;
          if ((f>0 && fb<0) || (f<0 && fb>0))
            a = y;
          tmp = y;
          y = 0.5*(a+b); 
          e = fabs(tmp-y);
          n++;
          if ((e<1.e-3) || (n>=100))
            {
              result=y;
              break;
            } 
         }      
    }
  return result; 
}

Go to October's log


Last modified: Tue Nov 25 18:11:37 CST 2008