Logo coherent WaveBurst  
Library Reference Guide
Logo
CombineSearchesWithFAD.C
Go to the documentation of this file.
1 // This macro is used to computed the false alarm probability of combined searches
2 // Uses as input parameters the files produced by the report sim when pp_fad is enabled
3 //
4 // the fadList is the name of the file which contains the list of searches
5 // for each line is a search and it is define as :
6 // 1 - file name of FAD vs RHO
7 // 2 - file name of PROD vs FAD
8 // 3 - label to be used in the legend
9 // 4 - line color
10 // 5 - line style
11 //
12 // NOTE : if PROD is constant for every rho then it is possible to input the value
13 // of PROD instead of file name of PROD vs FAD
14 //
15 //
16 // Example :
17 // S6A_FADvsRHO_ALL_lt.txt S6A_PRODvsFAD_ALL_lt.txt S6A_INET_LT_0d5 1 9
18 //
19 // Auxiliary parameters :
20 // rho_min : minimum rho showed in the plot (def=0, the value is computed from input files)
21 // rho_max : maximum rho showed in the plot (def=0, the value is computed from input files)
22 // refline : vertical line showed as reference in the plot (def=0, not showed)
23 // reflabel: refernce label used in the legend (def="reference")
24 // pfile : saved file name. If !="" -> save plot with name pfile (def="")
25 // if == "batch" the macro is executed in batch mode
26 //
27 // How to run (example) :
28 // root 'CombineSearchesWithFAD.C("FAD.lst",5,40,7.35,"BigDog")'
29 //
30 
31 #define MAX_FAP 20
32 #define SHOW_3SIGMA // plot 3 sigma probability line
33 #define PROB_3SIGMA 0.002699796063 // percentage outside 3 sigma gaussian probability
34 #define SHOW_4SIGMA // plot 4 sigma probability line
35 #define PROB_4SIGMA 0.000063342484 // percentage outside 4 sigma gaussian probability
36 //#define SHOW_5SIGMA // plot 5 sigma probability line
37 #define PROB_5SIGMA 0.000000573303 // percentage outside 5 sigma gaussian probability
38 
39 //#define XAXIS_IS_IFAD // uncomment to use as xaxis IFAD instead of RHO
40 
41 double GetFAP(double rho, int n, int nFAP, TString* FADvsRHO, TString* PRODvsFAD);
42 
43 void GetFAPvsRHO(int n, vector<double>& x, vector<double>& y,
44  int nFAP, TString* FADvsRHO, TString* PRODvsFAD);
45 
46 TGraph* GetGraph(vector<double> x, vector<double> y,
47  TString ptitle, TString xtitle, TString ytitle);
48 
49 double gRHO_MIN = 0;
50 double gRHO_MAX = 0;
51 
52 double gFAP_MIN = 1.79769e+308;
53 double gFAP_MAX = -1.79769e+308;
54 
55 void CombineSearchesWithFAD(TString fadList, double rho_min=0, double rho_max=0,
56  double refline=0, TString reflabel="reference", TString pfile="") {
57 
58  bool batch=false;
59  if(pfile=="batch") {gROOT->SetBatch(true);pfile="";batch=true;}
60 
61  if(pfile!="" && !pfile.EndsWith(".png")) {
62  cout << endl;
63  cout << "CombineSearchesWithFAD : Error in pfile name : " << pfile << endl;
64  cout << " file name must ends with .png" << endl << endl;
65  exit(1);
66  }
67 
68  gRHO_MIN = rho_min;
69  gRHO_MAX = rho_max;
70 
71  TString FADvsRHO[MAX_FAP];
72  TString PRODvsFAD[MAX_FAP];
73  TString FAP_LABEL[MAX_FAP];
74  int FAP_COLOR[MAX_FAP];
75  int FAP_STYLE[MAX_FAP];
76 
77  // Open list
78  ifstream in;
79  in.open(fadList.Data(),ios::in);
80  if (!in.good()) {cout << "Error Opening File : " << fadList.Data() << endl;exit(1);}
81 
82  int size=0;
83  char str[1024];
84  int fpos=0;
85  while(true) {
86  in.getline(str,1024);
87  if (!in.good()) break;
88  if(str[0] != '#') size++;
89  }
90  cout << "size " << size << endl;
91  in.clear(ios::goodbit);
92  in.seekg(0, ios::beg);
93  if (size==0) {cout << "Error : File " << fadList.Data() << " is empty" << endl;exit(1);}
94 
95  char iFADvsRHO[1024];
96  char iPRODvsFAD[1024];
97  char iFAP_LABEL[1024];
98  int iFAP_COLOR;
99  int iFAP_STYLE;
100  int nFAP=0;
101  char line[1024];
102  while(true) {
103  in.getline(line,1024);
104  if (in.eof()) break;
105  std::stringstream linestream(line);
106  if((line[0]=='#')||(TString(line)=="")) continue;
107  linestream >> iFADvsRHO >> iPRODvsFAD >> iFAP_LABEL >> iFAP_COLOR >> iFAP_STYLE;
108  FADvsRHO[nFAP]=iFADvsRHO;
109  PRODvsFAD[nFAP]=iPRODvsFAD;
110  FAP_LABEL[nFAP]=iFAP_LABEL;
111  FAP_COLOR[nFAP]=iFAP_COLOR;
112  FAP_STYLE[nFAP]=iFAP_STYLE;
113  cout << nFAP+1 << " " << FADvsRHO[nFAP] << " " << PRODvsFAD[nFAP]
114  << " " << FAP_LABEL[nFAP] << " " << FAP_COLOR[nFAP] << " " << FAP_STYLE[nFAP] << endl;
115  nFAP++;
116  }
117  in.close();
118 
119  // get FAP for RHO=refline
120  if(refline>0) {
121  cout << endl << "---------------------------------------------------------------------" << endl;
122  for(int i=0;i<nFAP;i++) {
123  double FAP = GetFAP(refline, i, nFAP, FADvsRHO, PRODvsFAD);
124  cout << "Search : " << FAP_LABEL[i] << "\t -> FAP at RHO = " << refline << " is " << FAP << endl;
125  }
126  cout << "---------------------------------------------------------------------" << endl << endl;
127  if(batch) exit(0);
128  }
129 
130  // create canvas
131  TCanvas* gCANVAS;
132  gCANVAS = new TCanvas("canvas", "canvas",16,30,825,546);
133  gCANVAS->Range(-19.4801,-9.25,-17.4775,83.25);
134  gCANVAS->SetBorderSize(2);
135  gCANVAS->SetFrameFillColor(0);
136  gCANVAS->SetGridx();
137  gCANVAS->SetGridy();
138 //#ifdef XAXIS_IS_IFAD
139  gCANVAS->SetLogx();
140 //#endif
141  gCANVAS->SetLogy();
142  gStyle->SetOptFit(kTRUE);
143 
144  // create graphs
145  rho_max=0;
146  TGraph* gr[MAX_FAP];
147  vector<double> x[MAX_FAP];
148  vector<double> y[MAX_FAP];
149  for(int i=0;i<nFAP;i++) {
150  GetFAPvsRHO(i, x[i], y[i], nFAP, FADvsRHO, PRODvsFAD);
151 #ifdef XAXIS_IS_IFAD
152  gr[i] = GetGraph(x[i],y[i],"False Alarm Probability","IFAD","FAP");
153 #else
154  gr[i] = GetGraph(x[i],y[i],"False Alarm Probability","rho","FAP");
155 #endif
156  gr[i]->SetLineColor(FAP_COLOR[i]);
157  gr[i]->SetLineStyle(FAP_STYLE[i]);
158  if(x[i][x[i].size()-1] > rho_max) rho_max=x[i][x[i].size()-1];
159  }
161 
162  TMultiGraph* mg = new TMultiGraph();
163  mg->SetTitle("False Alarm Probability");
164  for(int i=0;i<nFAP;i++) mg->Add(gr[i]);
165 
166  // add reference line
167  if(refline>0) {
168  gr[nFAP] = new TGraph;
169  gr[nFAP]->SetPoint(0,refline,0);
170  gr[nFAP]->SetPoint(1,refline,1);
171  gr[nFAP]->SetLineColor(kGreen);
172  gr[nFAP]->SetLineWidth(2);
173  mg->Add(gr[nFAP]);
174  }
175 
176  // add 3sigma reference line
177 #ifdef SHOW_3SIGMA
178  gr[nFAP+1] = new TGraph;
179  gr[nFAP+1]->SetPoint(0,gRHO_MIN,PROB_3SIGMA);
180  gr[nFAP+1]->SetPoint(1,rho_max,PROB_3SIGMA);
181  gr[nFAP+1]->SetLineColor(kBlue);
182  gr[nFAP+1]->SetLineWidth(2);
183  gr[nFAP+1]->SetLineStyle(10);
184  mg->Add(gr[nFAP+1]);
185 #endif
186 
187  // add 4sigma reference line
188 #ifdef SHOW_4SIGMA
189  gr[nFAP+2] = new TGraph;
190  gr[nFAP+2]->SetPoint(0,gRHO_MIN,PROB_4SIGMA);
191  gr[nFAP+2]->SetPoint(1,rho_max,PROB_4SIGMA);
192  gr[nFAP+2]->SetLineColor(kRed);
193  gr[nFAP+2]->SetLineWidth(2);
194  gr[nFAP+2]->SetLineStyle(10);
195  mg->Add(gr[nFAP+2]);
196 #endif
197 
198  // add 5sigma reference line
199 #ifdef SHOW_5SIGMA
200  gr[nFAP+3] = new TGraph;
201  gr[nFAP+3]->SetPoint(0,gRHO_MIN,PROB_5SIGMA);
202  gr[nFAP+3]->SetPoint(1,rho_max,PROB_5SIGMA);
203  gr[nFAP+3]->SetLineColor(kGreen);
204  gr[nFAP+3]->SetLineWidth(2);
205  gr[nFAP+3]->SetLineStyle(10);
206  mg->Add(gr[nFAP+3]);
207 #endif
208 
209  mg->Paint("APL");
210 
211  mg->GetHistogram()->GetXaxis()->SetLabelSize(0.04);
212  mg->GetHistogram()->GetYaxis()->SetLabelSize(0.04);
213  mg->GetHistogram()->GetXaxis()->SetTitleSize(0.04);
214  mg->GetHistogram()->GetYaxis()->SetTitleSize(0.04);
215  mg->GetHistogram()->GetXaxis()->SetLabelFont(42);
216  mg->GetHistogram()->GetXaxis()->SetRangeUser(gRHO_MIN,gRHO_MAX);
217  mg->GetHistogram()->GetYaxis()->SetLabelFont(42);
218  mg->GetHistogram()->GetYaxis()->SetLabelOffset(0.01);
219  mg->GetHistogram()->GetYaxis()->SetTitleOffset(1.5);
220  mg->GetHistogram()->GetYaxis()->SetRangeUser(0.5*gFAP_MIN,1.5*gFAP_MAX);
221 
222  mg->GetXaxis()->SetLabelFont(42);
223  mg->GetYaxis()->SetLabelFont(42);
224  mg->GetXaxis()->SetTitleFont(42);
225  mg->GetYaxis()->SetTitleFont(42);
226  mg->GetXaxis()->SetTitleOffset(1.20);
227  mg->GetYaxis()->SetTitleOffset(1.05);
228  mg->GetXaxis()->SetTitleSize(0.04);
229  mg->GetYaxis()->SetTitleSize(0.04);
230 #ifdef XAXIS_IS_IFAD
231  mg->GetXaxis()->SetTitle("IFAD");
232 #else
233  mg->GetXaxis()->SetTitle("rho");
234 #endif
235  mg->GetYaxis()->SetTitle("FAP");
236 
237  mg->GetXaxis()->SetMoreLogLabels();
238 
239  mg->Draw("ALP");
240 
241  // draw the legend
242  TLegend *leg;
243  double hleg = 0.9-nFAP*0.03;
244  leg = new TLegend(0.7369062,hleg,0.9914738,0.9846154,NULL,"brNDC");
245  leg->SetBorderSize(1);
246  leg->SetTextAlign(22);
247  leg->SetTextFont(12);
248  leg->SetLineColor(1);
249  leg->SetLineStyle(1);
250  leg->SetLineWidth(1);
251  leg->SetFillColor(0);
252  leg->SetFillStyle(1001);
253  leg->SetTextSize(0.03);
254  leg->SetLineColor(kBlack);
255  leg->SetFillColor(kWhite);
256 
257  for(int i=0;i<nFAP;i++) leg->AddEntry(gr[i],FAP_LABEL[i].Data(),"lp");
258  if(refline>0) leg->AddEntry(gr[nFAP],reflabel.Data(),"lp");
259 #ifdef SHOW_3SIGMA
260  leg->AddEntry(gr[nFAP+1],"3 sigma","lp");
261 #endif
262 #ifdef SHOW_4SIGMA
263  leg->AddEntry(gr[nFAP+2],"4 sigma","lp");
264 #endif
265 #ifdef SHOW_5SIGMA
266  leg->AddEntry(gr[nFAP+3],"5 sigma","lp");
267 #endif
268  leg->Draw();
269 
270  // save plot
271  if(pfile!="") {
272  TString gfile=pfile;
273  gfile.ReplaceAll(".png",".gif");
274  gCANVAS->Print(gfile);
275  char cmd[1024];
276  sprintf(cmd,"convert %s %s",gfile.Data(),pfile.Data());
277  cout << cmd << endl;
278  gSystem->Exec(cmd);
279  sprintf(cmd,"rm %s",gfile.Data());
280  gSystem->Exec(cmd);
281  exit(0);
282  }
283 }
284 
285 double GetFAP(double rho, int n, int nFAP, TString* FADvsRHO, TString* PRODvsFAD) {
286 
287  double RHO = rho;
288  double FAD = CWB::Toolbox::GetStepFunction("Y",FADvsRHO[n],RHO);
289  double PROD = 0;
290  for(int j=0;j<nFAP;j++) {
291  if(PRODvsFAD[j].IsFloat()) { // read PROD from file name
292  PROD += PRODvsFAD[j].Atof();
293  } else { // read PROD from file
294  PROD += CWB::Toolbox::GetStepFunction("Y",PRODvsFAD[j],FAD);
295  }
296  }
297  double MU = FAD*PROD;
298  double FAP = 1.-exp(-MU);
299 
300  return FAP;
301 }
302 
303 void GetFAPvsRHO(int n, vector<double>& x, vector<double>& y, int nFAP, TString* FADvsRHO, TString* PRODvsFAD) {
304 
305  double rho_min = CWB::Toolbox::GetStepFunction("xmin",FADvsRHO[n]);
306  double rho_max = CWB::Toolbox::GetStepFunction("xmax",FADvsRHO[n]);
307  if((gRHO_MIN>0)&&(rho_min<gRHO_MIN)) rho_min = gRHO_MIN;
308  if((gRHO_MAX>0)&&(rho_max>gRHO_MAX)) rho_max = gRHO_MAX;
309 
310  double drho = 0.1;
311  int nrho = TMath::Nint((rho_max-rho_min)/drho)+2;
312 
313  for(int i=0;i<nrho;i++) {
314  double RHO = rho_min+i*drho;
315  double FAD = CWB::Toolbox::GetStepFunction("Y",FADvsRHO[n],RHO);
316  double PROD = 0;
317  for(int j=0;j<nFAP;j++) {
318  if(PRODvsFAD[j].IsFloat()) { // read PROD from file name
319  PROD += PRODvsFAD[j].Atof();
320  } else { // read PROD from file
321  PROD += CWB::Toolbox::GetStepFunction("Y",PRODvsFAD[j],FAD);
322  }
323  }
324  double MU = FAD*PROD;
325  double FAP = 1.-exp(-MU);
326 
327 #ifdef XAXIS_IS_IFAD
328  x.push_back(1./FAD);
329 #else
330  x.push_back(RHO);
331 #endif
332  y.push_back(FAP);
333 
334  if((FAP!=0)&&(FAP<gFAP_MIN)) gFAP_MIN = FAP; // skip last y[i]=0 to avoid TGraph log issue
335  if(FAP>gFAP_MAX) gFAP_MAX = FAP;
336  }
337 }
338 
339 TGraph*
340 GetGraph(vector<double> x, vector<double> y, TString ptitle, TString xtitle, TString ytitle) {
341 
342  int size = x.size();
343 
344  TGraph* gr = new TGraph;
345 
346  int cnt=0;
347 
348  for(int i=1;i<size;i++) {
349  if(y[i]==0) continue; // skip y[i]=0 to avoid TGraph log issue
350  double dx = (x[i]-x[i-1])/10000.;
351  gr->SetPoint(cnt++,x[i]-dx,y[i-1]);
352  gr->SetPoint(cnt++,x[i]+dx,y[i]);
353  }
354 
355  gr->GetHistogram()->GetXaxis()->SetTitle(xtitle.Data());
356  gr->GetHistogram()->GetYaxis()->SetTitle(ytitle.Data());
357  gr->GetHistogram()->GetYaxis()->SetTitleOffset(1.4);
358  // add more log labels when y range is small
359  double max=0;double min=1e80;
360  for(int i=0;i<size;i++) {
361  if(y[i]==0) continue; // skip y[i]=0 to avoid TGraph log issue
362  if(y[i]>max) max=y[i]; if(y[i]<min && y[i]!=0) min=y[i];
363  }
364  if(max/min<10) {
365  gr->GetHistogram()->GetYaxis()->SetMoreLogLabels();
366  }
367  gr->SetTitle(ptitle);
368  gr->SetLineColor(kRed);
369  gr->SetLineWidth(2);
370 
371  return gr;
372 }
double rho
char xtitle[1024]
double GetFAP(double rho, int n, int nFAP, TString *FADvsRHO, TString *PRODvsFAD)
double min(double x, double y)
Definition: eBBH.cc:31
int n
Definition: cwb_net.C:28
#define PROB_4SIGMA
double rho_min
TGraph * GetGraph(vector< double > x, vector< double > y, TString ptitle, TString xtitle, TString ytitle)
TString("c")
double gFAP_MIN
cout<< endl;cout<< "ts size = "<< ts.size()<< " ts rate = "<< ts.rate()<< endl;tf.Forward(ts, wdm);int levels=tf.getLevel();cout<< "tf size = "<< tf.size()<< endl;double dF=tf.resolution();double dT=1./(2 *dF);cout<< "rate(hz) : "<< RATE<< "\ layers : "<< nLAYERS<< "\ dF(hz) : "<< dF<< "\ dT(ms) : "<< dT *1000.<< endl;int itime=TIME_PIXEL_INDEX;int ifreq=FREQ_PIXEL_INDEX;int index=(levels+1) *itime+ifreq;double time=itime *dT;double freq=(ifreq >0) ? ifreq *dF :dF/4;cout<< endl;cout<< "PIXEL TIME = "<< time<< " sec "<< endl;cout<< "PIXEL FREQ = "<< freq<< " Hz "<< endl;cout<< endl;wavearray< double > x
vector< double > RHO
Definition: cwb_mkfad.C:73
Long_t size
double gRHO_MAX
int j
Definition: cwb_net.C:28
i drho i
void GetFAPvsRHO(int n, vector< double > &x, vector< double > &y, int nFAP, TString *FADvsRHO, TString *PRODvsFAD)
#define MAX_FAP
char str[1024]
void CombineSearchesWithFAD(TString fadList, double rho_min=0, double rho_max=0, double refline=0, TString reflabel="reference", TString pfile="")
TGraph * gr
double FAP
double rho_max
#define PROB_5SIGMA
double gFAP_MAX
#define PROB_3SIGMA
ifstream in
static int GetStepFunction(TString fName, vector< double > &x, vector< double > &y, vector< double > &ex=DEFAULT_DOUBLE_VECTOR, vector< double > &ey=DEFAULT_DOUBLE_VECTOR)
Definition: Toolbox.cc:6429
TCanvas * gCANVAS
Definition: cwb_mkfad.C:61
char cmd[1024]
int cnt
double gRHO_MIN
sprintf(tfres,"(1/%g)x(%g) (sec)x(Hz)", 2 *df, df)
TString gfile
char line[1024]
wavearray< double > y
Definition: Test10.C:31
TMultiGraph * mg
exit(0)