Logo Coherent WaveBurst  
Reference Guide
Logo
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
DrawMedianPRCvsSNR.C
Go to the documentation of this file.
1 //
2 // Draw median50/90 sky localization error region angle vs SNR
3 // Note : this macro is used to generate the PRC report (cwb_report merge_label prc)
4 // Author : Gabriele Vedovato
5 //
6 // input lst file names format :
7 // output root merge file_name mdc_name mdc_type line_color line_style
8 // wave_ADV_SIM_BRST_L1H1V1_run1.M1.root WNB250_100_0d100 1 6 0
9 // note : mdc_type = type[1]+1, where type[1] is the parameter declared in the waveburst tree
10 //
11 // command : root -l 'root 'macro/DrawMedianPRCvsSNR.C("file.lst","plot title","MEDIAN50","output_plot.png")'
12 //
13 
14 #define APPLY_FIT
15 
16 #define MAX_FILES 20 // num max of file in the input file list
17 
18 //------------------------------------------------------
19 // Thresholds Settings
20 //------------------------------------------------------
21 
22 #define TREE_NAME "waveburst"
23 
24 #define MIN_SNR_NET 5 // SNRnet inf
25 #define MAX_SNR_NET 100 // SNRnet sup
26 #define NSNR 20 // number of snr bins
27 
28 #define MIN_NSNR 20 // minimum number of entries in the SNR bin
29 #define MAX_MEDIAN50 50 // max median50 to be included in the fit
30 #define MAX_MEDIAN90 100 // max median90 to be included in the fit
31 
32 #define LINX // set Logx to false
33 
34 Double_t
35 medianfit(Double_t *x, Double_t *par); // fit function
36 int
37 GetMedian(TString ifName, int type, TString pType, wavearray<double>& snr,
39  float T_win, int pp_inetcc, float T_cor, int pp_irho, float T_cut, float T_vED, float T_pen, float T_ifar);
40 
41 void
43  float T_win=0, int pp_inetcc=0, float T_cor=0, int pp_irho=0,
44  float T_cut=0, float T_vED=0, float T_pen=0, float T_ifar=0) {
45 
46  if((ofName!="")&&(!ofName.Contains(".png"))) {
47  cout << "Error Output File : " << ilist_file.Data() << endl;
48  cout << "Must have .png extension" << endl;
49  exit(1);
50  } else {
51  ofName.ReplaceAll(".png",".gif");
52  }
53 
54  TString ptitle="Sky Localization : median error area vs SNR";
55 
56  if((pType!="MEDIAN50")&&(pType!="MEDIAN90")&&(pType!="")) {
57  ptitle=pType;
58  } else {
59  if(pType=="") pType="MEDIAN50";
60  if(pType=="MEDIAN50") ptitle=ptitle+"50% error region";
61  if(pType=="MEDIAN90") ptitle=ptitle+"90% error region";
62  }
63 
66  int type[MAX_FILES];
67  int colors[MAX_FILES];
68  int lstyle[MAX_FILES];
69 
70  // Open list
71  ifstream in;
72  in.open(ilist_file.Data(),ios::in);
73  if (!in.good()) {cout << "Error Opening File : " << ilist_file.Data() << endl;exit(1);}
74 
75  int size=0;
76  char str[1024];
77  int fpos=0;
78  while(true) {
79  in.getline(str,1024);
80  if (!in.good()) break;
81  if(str[0] != '#') size++;
82  }
83  cout << "size " << size << endl;
84  in.clear(ios::goodbit);
85  in.seekg(0, ios::beg);
86  if (size==0) {cout << "Error : File " << ilist_file.Data() << " is empty" << endl;exit(1);}
87 
88  char sfile[256];
89  char sname[256];
90  int stype;
91  int scolors;
92  int sltyle;
93  int NFILE=0;
94  while(true) {
95  in >> sfile >> sname >> stype >> scolors >> sltyle;
96  if(!in.good()) break;
97  if(sfile[0]=='#') continue;
98  ifile[NFILE]=sfile;
99  name[NFILE]=sname;
100  type[NFILE]=stype;
101  colors[NFILE]=scolors;
102  lstyle[NFILE]=sltyle;
103  cout << NFILE+1 << " " << ifile[NFILE] << " " << name[NFILE] << " "
104  << type[NFILE] << " " << colors[NFILE] << " " << lstyle[NFILE] << endl;
105  NFILE++;
106  }
107  in.close();
108 
109 #ifdef APPLY_FIT
110  TF1* f1 = NULL;
111  f1=new TF1("medianfit",medianfit,0.5,4,3);
112  f1->SetParNames("A","B","C");
113  f1->SetLineWidth(2);
114  f1->SetNpx(10000);
115 #endif
116 
117  // get medians
118  double max_median=0;
119  int nevents[MAX_FILES];
123  for(int n=0;n<NFILE;n++) {
124  cout << "Process File : " << ifile[n].Data() << endl;
125  nevents[n]=GetMedian(ifile[n], type[n], pType, snr[n], median[n], entries[n],
127  // find max median
128  for(int i=0;i<snr[n].size();i++) {
129  if(median[n][i]>max_median) max_median=median[n][i];
130  //cout << n << " " << i << "\t snr " << snr[n][i] << "\t median " << median[n][i] << endl;
131  }
132  //cout << n << " max_median " << max_median << endl;
133  }
134 
135  // create plots
136  gStyle->SetFrameBorderMode(0); // remove the red box around canvas
137  gROOT->ForceStyle();
138 
139  gStyle->SetTitleFont(72);
140  gStyle->SetMarkerColor(50);
141  gStyle->SetLineColor(kWhite);
142  gStyle->SetTitleW(0.98);
143  gStyle->SetTitleH(0.05);
144  gStyle->SetTitleY(0.98);
145  gStyle->SetFillColor(kWhite);
146  gStyle->SetLineColor(kWhite);
147  gStyle->SetTitleFont(12,"D");
148 
149  TCanvas *canvas = new TCanvas("median", "median", 300,40, 600, 600);
150  canvas->Clear();
151  canvas->ToggleEventStatus();
152 #ifdef LINX
153  canvas->SetLogx(false);
154 #else
155  canvas->SetLogx(true);
156 #endif
157  //canvas->SetLogy();
158  canvas->SetGridx();
159  canvas->SetGridy();
160  canvas->SetFillColor(kWhite);
161 
162  double A[MAX_FILES];
163  double B[MAX_FILES];
164  double C[MAX_FILES];
165  double chi2[MAX_FILES];
166  //TGraph* gr[MAX_FILES];
167  //for(int n=0;n<NFILE;n++) gr[n] = new TGraph(snr[n].size(),snr[n].data,median[n].data);
168  TGraphErrors* gr[MAX_FILES];
169  for(int n=0;n<NFILE;n++) {
170  wavearray<double> esnr=snr[n];esnr=0;
171  wavearray<double> emedian=median[n];emedian=0;
172  //for(int i=0;i<emedian.size();i++) emedian[i]=1./sqrt(entries[n][i]);
173  gr[n] = new TGraphErrors(snr[n].size(),snr[n].data,median[n].data,esnr.data,emedian.data);
174  }
175  for(int n=0;n<NFILE;n++) {
176  gr[n]->SetLineWidth(0);
177  gr[n]->SetLineColor(colors[n]);
178  gr[n]->SetLineStyle(1);
179  gr[n]->SetMarkerColor(colors[n]);
180  gr[n]->SetMarkerStyle(20);
181  gr[n]->SetMarkerSize(1);
182 
183 #ifdef APPLY_FIT
184  f1->SetLineColor(colors[n]);
185  f1->SetLineStyle(lstyle[n]);
186 // f1->SetLineWidth(1);
187  f1->SetNpx(100);
188  gr[n]->Fit("medianfit");
189  chi2[n]=f1->GetChisquare();
190  A[n]=f1->GetParameter(0);
191  B[n]=f1->GetParameter(1);
192  C[n]=f1->GetParameter(2);
193 #endif
194  }
195 
196  TMultiGraph* mg = new TMultiGraph();
197  TString gTitle = "Sky Localization "+pType+" vs SNR";
198  if(pTitle!="") gTitle = gTitle+" : "+pTitle;
199  mg->SetTitle(gTitle.Data());
200  for(int n=0;n<NFILE;n++) mg->Add(gr[n]);
201  mg->Paint("AP");
202 
203  mg->GetHistogram()->GetXaxis()->SetRangeUser(MIN_SNR_NET,MAX_SNR_NET);
204 // mg->GetHistogram()->GetYaxis()->SetRangeUser(0,max_median);
205 
206  mg->GetHistogram()->GetXaxis()->SetTitle("Injected SNRnet");
207  if(pType=="MEDIAN50") mg->GetHistogram()->GetYaxis()->SetTitle("Median50 error angle (degrees)");
208  else mg->GetHistogram()->GetYaxis()->SetTitle("Median90 error angle (degrees)");
209 
210  mg->GetHistogram()->GetXaxis()->SetLabelSize(0.04);
211  mg->GetHistogram()->GetYaxis()->SetLabelSize(0.04);
212  mg->GetHistogram()->GetXaxis()->SetTitleSize(0.04);
213  mg->GetHistogram()->GetYaxis()->SetTitleSize(0.04);
214  mg->GetHistogram()->GetXaxis()->SetTitleOffset(1.2);
215  mg->GetHistogram()->GetYaxis()->SetTitleOffset(1.2);
216  mg->GetHistogram()->GetXaxis()->CenterTitle(true);
217  mg->GetHistogram()->GetYaxis()->CenterTitle(true);
218  mg->GetHistogram()->GetXaxis()->SetLabelFont(42);
219  mg->GetHistogram()->GetXaxis()->SetTitleFont(42);
220  mg->GetHistogram()->GetYaxis()->SetLabelFont(42);
221  mg->GetHistogram()->GetYaxis()->SetTitleFont(42);
222  mg->Draw("AP");
223 
224  // draw the legend
225 
226  TLegend* leg;
227  double hleg = 0.8-NFILE*0.05;
228  leg = new TLegend(0.5793173,hleg,0.9915385,0.8721805,NULL,"brNDC");
229 
230  leg->SetBorderSize(1);
231  leg->SetTextAlign(22);
232  leg->SetTextFont(12);
233  leg->SetLineColor(1);
234  leg->SetLineStyle(1);
235  leg->SetLineWidth(1);
236  leg->SetFillColor(0);
237  leg->SetFillStyle(1001);
238  leg->SetTextSize(0.05);
239  leg->SetLineColor(kBlack);
240  leg->SetFillColor(kWhite);
241 
242  for(int n=0;n<NFILE;n++) {
243  double median_snr15 = A[n]+pow(fabs(B[n])/15.,1)+pow(C[n]/15.,2);
244  char legLabel[256];
245  //sprintf(legLabel,"%s : %2.1f (%g)",name[n].Data(),median_snr10,nevents[n]);
246  sprintf(legLabel,"SNR(15) = %2.1f",median_snr15);
247  leg->AddEntry(gr[n],legLabel,"lp");
248  }
249  leg->Draw();
250 
251  // save plot
252 
253  if(ofName!="") {
254  TString gfileName=ofName;
255  canvas->Print(gfileName);
256  TString pfileName=gfileName;
257  pfileName.ReplaceAll(".gif",".png");
258  char cmd[1024];
259  sprintf(cmd,"convert %s %s",gfileName.Data(),pfileName.Data());
260  cout << cmd << endl;
261  gSystem->Exec(cmd);
262  sprintf(cmd,"rm %s",gfileName.Data());
263  cout << cmd << endl;
264  gSystem->Exec(cmd);
265  //gSystem->Exit(0);
266  }
267 }
268 
269 Double_t
270 medianfit(Double_t *x, Double_t *par) {
271  // constrain par[1] to be >=0
272  double y = par[0]+pow(fabs(par[1])/x[0],1)+pow(par[2]/x[0],2);
273  return y;
274 }
275 
276 int
277 GetMedian(TString ifName, int type, TString pType, wavearray<double>& snr,
279  float T_win, int pp_inetcc, float T_cor, int pp_irho, float T_cut, float T_vED, float T_pen, float T_ifar) {
280 
281  // open input tree
282  TFile *file0 = TFile::Open(ifName);
283  cout << ifName.Data() << endl;
284  if (file0==NULL) {cout << "Error Opening file" << endl;exit(1);}
285  TTree* itree = (TTree *) gROOT->FindObject(TREE_NAME);
286  if (itree==NULL) {cout << "Error Opening tree" << endl;exit(1);}
287 
288  // get detector list
289  TList* list = itree->GetUserInfo();
290  int nIFO=list->GetSize();
291  if (nIFO==0) {cout << "Error : no ifo present in the tree" << endl;exit(1);}
292  for (int n=0;n<list->GetSize();n++) {
293  detector* pDetector;
294  pDetector = (detector*)list->At(n);
295  detectorParams dParams = pDetector->getDetectorParams();
296  //pDetector->print();
297  }
298 
299  // define selection cuts
300  char cut[1024];
301  char tmp[1024];
302  sprintf(cut,"abs(time[0]-time[%d])<%f && netcc[%d]>%f && rho[%d]>%f",
303  nIFO,T_win,pp_inetcc,T_cor,pp_irho,T_cut);
304  if(T_vED>0) {strcpy(tmp,cut);sprintf(cut,"%s && neted[0]/ecor<%f",tmp,T_vED);}
305  if(T_pen>0) {strcpy(tmp,cut);sprintf(cut,"%s && penalty>%f",tmp,T_pen);}
306  if(type>0) {strcpy(tmp,cut);sprintf(cut,"%s && type[1]==%d",tmp,type);}
307  if(T_ifar>0) {strcpy(tmp,cut);sprintf(cut,"%s && ifar>(24.*3600.*365.)*%f",tmp,T_ifar);}
308 
309 #ifdef LINX
310  double fsnr = (MAX_SNR_NET-MIN_SNR_NET)/NSNR;
311 #else
312  double fsnr = TMath::Exp(TMath::Log(MAX_SNR_NET-MIN_SNR_NET)/NSNR);
313 #endif
314  entries.resize(NSNR);
315  median.resize(NSNR);
316  snr.resize(NSNR);
317  int nsnr=0;
318  double max_median = (pType=="MEDIAN50") ? MAX_MEDIAN50 : MAX_MEDIAN90;
319  double infsnr=MIN_SNR_NET;
320 #ifdef LINX
321  double supsnr=fsnr+infsnr;
322 #else
323  double supsnr=fsnr*infsnr;
324 #endif
325  char SNRnet[256]="";
326  strcpy(tmp,"iSNR[0]");
327  for(int i=1;i<nIFO;i++) {sprintf(SNRnet,"%s+iSNR[%d]",tmp,i);strcpy(tmp,SNRnet);}
328  sprintf(SNRnet,"sqrt(%s)",tmp);
329  int nevents=0;
330  for(int n=0;n<NSNR;n++) {
331 
332  char icut[512];
333  sprintf(icut,"%s && %s>%f && %s<=%f",cut,SNRnet,infsnr,SNRnet,supsnr);
334  //sprintf(icut,"%s && sqrt(likelihood/%d)>%f && sqrt(likelihood/%d)<=%f",cut,nIFO,infsnr,nIFO,supsnr);
335  //cout << icut << endl;
336  itree->Draw("erA[0]",icut,"goff");
337 
338  int size = itree->GetSelectedRows();
339  nevents+=size;
340  double* erA = itree->GetV1();
341 
342  if(size>MIN_NSNR) {
343  int* index = new int[size];
344  TMath::Sort(size,erA,index,false);
345 
346  entries[nsnr] = size;
347  median[nsnr] = (pType=="MEDIAN50") ? erA[index[int(size*0.5)]] : erA[index[int(size*0.9)]]; // median
348  snr[nsnr] = (supsnr+infsnr)/2.; // SNRnet
349  if(median[nsnr]<max_median) {
350  cout << "Selected entries : " << entries[nsnr] << "\t SNRnet : "
351  << snr[nsnr] << "\t median : " << median[nsnr] << endl;
352  nsnr++;
353  }
354 
355  delete [] index;
356  }
357 
358 #ifdef LINX
359  infsnr += fsnr;
360  supsnr += fsnr;
361 #else
362  infsnr *= fsnr;
363  supsnr *= fsnr;
364 #endif
365  }
366 
367  entries.resize(nsnr);
368  median.resize(nsnr);
369  snr.resize(nsnr);
370 
371  return nevents; // return total number of selected events
372 }
373 
#define MAX_MEDIAN90
detectorParams getDetectorParams()
Definition: detector.cc:201
char cut[512]
virtual size_t size() const
Definition: wavearray.hh:127
static const double C
Definition: GNGen.cc:10
int GetMedian(TString ifName, int type, TString pType, wavearray< double > &snr, wavearray< double > &median, wavearray< double > &entries, float T_win, int pp_inetcc, float T_cor, int pp_irho, float T_cut, float T_vED, float T_pen, float T_ifar)
double T_ifar
TString ofName
double T_pen
char cmd[1024]
#define MIN_SNR_NET
par[0] name
#define B
int n
Definition: cwb_net.C:10
TString("c")
double T_cor
TLegend * leg
Definition: compare_bkg.C:246
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<< "\t layers : "<< nLAYERS<< "\t dF(hz) : "<< dF<< "\t 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
double median(std::vector< double > &vec)
Definition: wavegraph.cc:467
Complex Exp(double phase)
Definition: numpy.cc:33
return wmap canvas
i pp_inetcc
#define NSNR
Long_t size
Color_t colors[16]
Double_t medianfit(Double_t *x, Double_t *par)
i drho i
TList * list
#define nIFO
char str[1024]
TGraph * gr
void DrawMedianPRCvsSNR(TString ilist_file, TString pTitle, TString pType, TString ofName, float T_win=0, int pp_inetcc=0, float T_cor=0, int pp_irho=0, float T_cut=0, float T_vED=0, float T_pen=0, float T_ifar=0)
i() int(T_cor *100))
#define TREE_NAME
double * tmp
Definition: testWDM_5.C:31
float chi2
Definition: cbc_plots.C:603
static double A
Definition: geodesics.cc:8
#define MIN_NSNR
vector< mdcpar > par
TFile * ifile
int nevents
#define MAX_SNR_NET
ifstream in
wavearray< int > index
double T_win
double fabs(const Complex &x)
Definition: numpy.cc:37
strcpy(RunLabel, RUN_LABEL)
sprintf(tfres,"(1/%g)x(%g) (sec)x(Hz)", 2 *df, df)
double T_cut
TTree * itree
DataType_t * data
Definition: wavearray.hh:301
snr * snr
Definition: ComputeSNR.C:71
double T_vED
virtual void resize(unsigned int)
Definition: wavearray.cc:445
wavearray< double > y
Definition: Test10.C:31
TMultiGraph * mg
i drho pp_irho
#define MAX_FILES
exit(0)
#define MAX_MEDIAN50