Angular analysis of B+->K*+(K+pi0)mumu
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

201 lines
5.2 KiB

//Renata Kopecna
#include <folder.hh>
#include <TRandom3.h>
#include <event.hh>
#include <helpers.hh>
#include <spdlog.h>
///fold the set of angles according to the chosen folding scheme
void fcnc::folder::fold(event* e){
//make sure, that the full angular information was saved before into the correct parameters:
assert(e->costhetal == e->costhetal_fa);
assert(e->costhetak == e->costhetak_fa);
assert(e->phi == e->phi_fa);
double pi = TMath::Pi();
switch(this->scheme){
case -1:
return;
case 0:
if(e->phi < 0)e->phi = e->phi + pi;
break;
case 1:
if(e->phi < 0){
e->phi = -e->phi;
}
if(e->costhetal < 0){
e->phi = pi - e->phi;
e->costhetal = -e->costhetal;
}
break;
case 2:
if(e->phi < 0) e->phi = -e->phi;
if(e->costhetal < 0) e->costhetal = -e->costhetal;
break;
case 3:
if(e->phi > pi/2.) e->phi = pi - e->phi;
if(e->phi < -pi/2.) e->phi = -pi - e->phi;
if(e->costhetal < 0) e->costhetal = -e->costhetal;
break;
case 4:
if(e->phi > pi/2.) e->phi = pi - e->phi;
if(e->phi < -pi/2.) e->phi = -pi - e->phi;
if(e->costhetal < 0){
e->costhetal = -e->costhetal;
e->costhetak = -e->costhetak;
}
break;
}
return;
}
///inverse fold the set of angles according to the chosen folding scheme
void fcnc::folder::invers_fold(const event* e, event *u_phi, event *u_ctl, event *u_full){
/*
phi /^\
| :
| (2) : (4)
| :
|---------+--------
| :
| (1) : (3)
|_________________>
cos(theta)
(1): original event (e)
(2): unfolded in phi (u_phi)
(3): unfolded in ctl (u_ctl)
(4): twice unfolded (u_full)
*/
*u_phi = *e; //only inversly folded in dependence of phi
*u_ctl = *e; //only inversly folded in dependence of ctl
*u_full = *e; //full inversly folded
double pi = TMath::Pi();
switch(this->scheme){
case -1:
return;
case 0:
assert(e->phi > 0.0);
u_phi->phi = u_phi->phi - pi;
u_full->phi = u_full->phi - pi;
break;
case 1:
assert(e->phi > 0.0);
assert(e->costhetal > 0.0);
u_ctl->phi = pi - u_ctl->phi;
u_full->phi = pi - u_full->phi;
u_ctl->costhetal = -u_ctl->costhetal;
u_full->costhetal = -u_full->costhetal;
u_phi->phi = -u_phi->phi;
u_full->phi = -u_full->phi;
break;
case 2:
assert(e->phi > 0.0);
assert(e->costhetal > 0.0);
u_phi->phi = -u_phi->phi;
u_full->phi = -u_full->phi;
u_ctl->costhetal = -u_ctl->costhetal;
u_full->costhetal = -u_full->costhetal;
break;
case 3:
assert(e->phi < pi/2.);
assert(e->phi > -pi/2.);
assert(e->costhetal > 0.0);
if(e->phi > 0.0){
u_phi->phi = pi - u_phi->phi;
u_full->phi = pi - u_full->phi;
}
else{
u_phi->phi = -pi - u_phi->phi;
u_full->phi = -pi - u_full->phi;
}
u_ctl->costhetal = -u_ctl->costhetal;
u_full->costhetal = -u_full->costhetal;
break;
case 4:
assert(e->phi < pi/2.);
assert(e->phi > -pi/2.);
assert(e->costhetal > 0.0);
if(e->phi > 0.0){
u_phi->phi = pi - u_phi->phi;
u_full->phi = pi - u_full->phi;
}
else{
u_phi->phi = -pi - u_phi->phi;
u_full->phi = -pi - u_full->phi;
}
u_ctl->costhetal = -u_ctl->costhetal;
u_ctl->costhetak = -u_ctl->costhetak;
u_full->costhetal = -u_full->costhetal;
u_full->costhetak = -u_full->costhetak;
break;
}
}
void fcnc::folder::test_inv_folding(){
fcnc::event e;
e.m = 5286.0;
TRandom3 * r = new TRandom3(0);
for(int i = 0; i < 10000; i++){
if(i % 100 == 0 && spdlog_info())std::cout << i / 100. << "%" << std::endl;
//generate a folded event:
e.costhetal = r->Rndm() * 2. - 1.;
e.costhetak = r->Rndm() * 2. - 1.;
e.phi = (r->Rndm() * 2. - 1.) * TMath::Pi();
e.costhetal_fa = e.costhetal;
e.costhetak_fa = e.costhetak;
e.phi_fa = e.phi;
this->fold(&e);
//get 3 events for (partial-)inverse folding:
fcnc::event inv_e[3];
this->invers_fold(&e, &inv_e[0], &inv_e[1], &inv_e[2]);
for(int j = 0; j < 3; j++){
inv_e[j].costhetal_fa = inv_e[j].costhetal;
inv_e[j].costhetak_fa = inv_e[j].costhetak;
inv_e[j].phi_fa = inv_e[j].phi;
this->fold(&inv_e[j]);
assert(abs(e.phi - inv_e[j].phi ) < 1e-7);
assert(abs(e.costhetal - inv_e[j].costhetal) < 1e-7);
assert(abs(e.costhetak - inv_e[j].costhetak) < 1e-7);
}
}
spdlog::info("[DONE]\t\tInverse folding #{0:d} works!", this->scheme);
}
int fcnc::folder::get_scheme(){
return this->scheme;
}
void fcnc::folder::set_scheme(int s){
this->scheme = s;
}