Newer
Older
Presentations / ACFI_2017 / FCC / images / getUL.C
@Marcin Chrzaszcz Marcin Chrzaszcz on 16 Jul 2017 1 KB uff
// m: mass [MeV]
// tau: lifetime [ps]
// type: 0 = relative, 1 = absolute limits
// returns UL at 95% CL, or -1 if no limit is set where requested
double getUL(double m, double tau, int type){  
  // veto regions
  if(m < 214) return -1;
  if(m > 4350) return -1;
  if(m > 1000 && m < 1040 && tau < 1) return -1;
  if(m > 742 && m < 822 && tau < 1) return -1;
  if(m > 2913 && m < 3211) return -1;
  if(m > 3609 && m < 3875) return -1;

  TFile f("lhcb_2015_036.root");
  TGraph *g = (TGraph*)f.Get("g_masses");
  // find best mass
  int n = g->GetN(),mmin=-1;
  double min=1e6;
  for(int i=0; i<n; i++){
    if(fabs(m-g->GetX()[i]) < min){
      min = fabs(m-g->GetX()[i]);
      mmin = int(g->GetX()[i]);
    }
  }
  char name[100];
  if(type == 0) sprintf(name,"rel_ul_spline_%d",mmin);
  else if(type == 1) sprintf(name,"abs_ul_spline_%d",mmin);
  else {
    cout << "Only types are 0 and 1.  Please try again." << endl; 
    return -666;
  }
  TSpline3 *spl = (TSpline3*)f.Get(name);
  if(tau < 1000){
    return spl->Eval(tau);
  }
  double ul1000 = spl->Eval(1000);
  return ul1000/(1-exp(-1000/tau))*(1-exp(-1));
}