Logo coherent WaveBurst  
Library Reference Guide
Logo
DrawWaveformPE.C
Go to the documentation of this file.
1 // this macro shows how to read the PE results from ROOT and ASCII file
2 // plot the waveforms with tghe same format presented in the PE CED
3 // Author : G.Vedovato
4 
5 #include "constants.hh"
6 
13 
14 std::vector<TString> ReadDataFromROOT(TString ifile, int ifo, wavearray<double> *winj, wavearray<double> *wrec, wavearray<double> *wwht,
17 
21  TString pdir, double P, bool freq=false, bool showerr=true);
22 
23 void DumpWaveform(int ifo, wavearray<double>* wrec, wavearray<double>* wmed,
26 
27 
28 double GetTimeBoundaries(wavearray<double> x, double P, double& bT, double& eT);
31 
32 void FrequencyCut(wavearray<double>* x, double bF, double eF);
33 void PlotSpectrogram(wavearray<double>* x, double tstart=0, double tstop=0, TString title="", TString ofname="", double tchirp=0., double mchirp=0.);
34 
35 
36 #define IN_CWB_ASCII_FILE_L1 "L1_pe_wave.dat"
37 #define IN_CWB_ASCII_FILE_H1 "H1_pe_wave.dat"
38 
39 #define OUT_CWB_ASCII_FILE_L1 "OUT_L1_pe_wave.dat"
40 #define OUT_CWB_ASCII_FILE_H1 "OUT_H1_pe_wave.dat"
41 
42 
43 //#define FREQUENCY_CUT
44 #define FLOW 16
45 #define FHIGH 256
46 
48 TF1* fchirp;
49 
50 void DrawWaveformPE(TString ipath, int gtype=0, int ifo=0, double tshift=0, TString label="PLOT", double P=0.99) {
51 //
52 // ipath- > if(gtype<0) input ced idir
53 // if(gtype>0) input root file name
54 //
55 // gtype -> plot type
56 // < 0 -> plot instantaneous frequency : must be used only when ifo[0]=L1 and ifo[1]=H1
57 // 0 -> plot reconstructed vs whitened
58 // 1 -> plot reconstructed vs median
59 // 2 -> plot rec vs inj (only if injection is present in the input file)
60 // 3 -> plot the difference between med/rec and inj waveforms
61 // 4 -> plot spectrogram ifo
62 // 5 -> plot spectrogram ifo_0 + ifo_1(inv+tshift) : must be used only when ifo[0]=L1 and ifo[1]=H1
63 // 6 -> plot spectrogram ifo_0 - ifo_1(inv+tshift) : must be used only when ifo[0]=L1 and ifo[1]=H1
64 // >=7 -> dump data to ascii file
65 //
66 // ifo -> detector id : 0,1,...
67 //
68 // tshift-> the second detector is shifted by tshift and sign inverted : must be used only when ifo[0]=L1 and ifo[1]=H1
69 // GW150914 -> tshift =-0.0069
70 // GW151226 -> tshift =-0.0011
71 // LVT151012 -> tshift = 0.001
72 //
73 // label -> used for title and output plot files
74 //
75 // P -> [0,1] is used to restrict the plot time interval around the wave energy percentage P
76 //
77 
78  bool bexit = label.Contains("EXIT") ? true : false;
79  label.ReplaceAll("EXIT","");
80 
81  fchirp=NULL;
82  stft=NULL;
83 
84  double tchirp=0.;
85  double mchirp=0.;
86 
87  if(label=="GW150914") {tshift=-0.0069;tchirp=8.42;mchirp=30.0;}
88  if(label=="GW151226") {tshift=-0.0011;tchirp=7.65;mchirp=8.9;}
89  if(label=="LVT151012") {tshift= 0.0010;tchirp=7.43;mchirp=24.0;} // ?
90 
92 
100 
107 
108  int nifo=0;
109  std::vector<TString> ifoname;
110 
111  if(gtype<0) {
112  // read data from PE ascii output files
113  ReadDataFromASCII(ipath, ifo, &wrec[ifo], &wmed[ifo], &wl50[ifo], &wu50[ifo], &wl90[ifo], &wu90[ifo],
114  &frec[ifo], &fmed[ifo], &fl50[ifo], &fu50[ifo], &fl90[ifo], &fu90[ifo]);
115  PlotWaveformAsymmErrors("", "", &frec[ifo], &fmed[ifo], &fl50[ifo], &fu50[ifo], &fl90[ifo],
116  &fu90[ifo], &wrec[ifo], ".", P, true);
117  return;
118  } else {
119  // read data from PE root output file
120  for(int n=0;n<NIFO_MAX;n++) {
121  ifoname = ReadDataFromROOT(ipath, n, &winj[n], &wrec[n], &wwht[n], &wmed[n], &wl50[n], &wu50[n], &wl90[n], &wu90[n]);
122  nifo = ifoname.size();
123  if(n>=nifo-1) break;
124  }
125  if(ifo>nifo-1) {cout << "DrawWaveformPE Error : input ifo=" << ifo << " parameter must be < nifo=" << nifo << endl;exit(1);}
126 #ifdef FREQUENCY_CUT
127  // frequency cut for whitened data
128  for(int n=0;n<nifo;n++) FrequencyCut(&wwht[n], FLOW, FHIGH);
129 #endif
130  }
131 
132  // compute med,start,stop times for input wavearray
133  double tmed = wrec[0].start()+(wrec[0].size()/wrec[0].rate())/2.;
134  double tstart = tmed-1;
135  double tstop = tmed+1;
136  GetTimeBoundaries(wrec[0], P, tstart, tstop);
137  //cout << "Time Boundaries : " << tstart-wrec[0].start() << " " << tstop-wrec[0].start() << endl;exit(0);
138 
139  if(gtype==0) {
140  // plot reconstructed vs whitened
141  PlotWaveformAsymmErrors("", "", &wrec[ifo], &wwht[ifo], &wl50[ifo], &wu50[ifo], &wl90[ifo], &wu90[ifo], &wrec[ifo], "", P, false, false);
142  return;
143  }
144  if(gtype==1) {
145  // plot reconstructed vs median
146  PlotWaveformAsymmErrors("", "", &wrec[ifo], &wmed[ifo], &wl50[ifo], &wu50[ifo], &wl90[ifo], &wu90[ifo], &wrec[ifo], "", P);
147  return;
148  }
149  if(gtype==2) {
150  // plot reconstructed vs injected
151  PlotWaveformAsymmErrors("", "", &winj[ifo], &wmed[ifo], &wl50[ifo], &wu50[ifo], &wl90[ifo], &wu90[ifo], &wrec[ifo], "", P);
152  return;
153  }
154  if(gtype==3) {
155  // plot difference between med/rec and inj
157  wdif[ifo] = GetDifWaveform(&wmed[ifo], &winj[ifo]);
158  PlotWaveformAsymmErrors("", "", &wdif[ifo], &wdif[ifo], &wl50[ifo], &wu50[ifo], &wl90[ifo], &wu90[ifo], &wrec[ifo], "", P);
159  return;
160  }
161  if(gtype==4) {
162  // plot spectrogram ifo
163  TString title = TString::Format("%s whitened data %s",label.Data(),ifoname[ifo].Data());
164  TString ofile = TString::Format("%s_whitened_data_%s_Spectrogram.png",label.Data(),ifoname[ifo].Data());
165  PlotSpectrogram(&wwht[ifo], tstart, tstop,title,ofile,tchirp,mchirp);
166  if(bexit) exit(0); else return;
167  }
168  if(gtype==5) {
169  // plot spectrogram ifo_0 + ifo_1(inv+tshift)
170  TString title = TString::Format("%s whitened data %s + %s(inv/tshift)",label.Data(),ifoname[0].Data(),ifoname[1].Data());
171  TString ofile = TString::Format("%s_whitened_data_%s_plus_%s_Spectrogram.png",label.Data(),ifoname[0].Data(),ifoname[1].Data());
172  // invert sign of the second ifo
173  wwht[1]*=-1;
174  // shift time of the second ifo
175  CWB::mdc::TimeShift(wwht[1],tshift);
176  // add first and second ifo
177  wwht[0]+=wwht[1];
178  PlotSpectrogram(&wwht[ifo], tstart, tstop,title,ofile,tchirp,mchirp);
179  if(bexit) exit(0); else return;
180  }
181  if(gtype==6) {
182  // plot spectrogram ifo_0 - ifo_1(inv+tshift)
183  TString title = TString::Format("%s whitened data %s - %s(inv/tshift)",label.Data(),ifoname[0].Data(),ifoname[1].Data());
184  TString ofile = TString::Format("%s_whitened_data_%s_minus_%s_Spectrogram.png",label.Data(),ifoname[0].Data(),ifoname[1].Data());
185  // invert sign of the second ifo
186  wwht[1]*=-1;
187  // shift time of the second ifo
188  CWB::mdc::TimeShift(wwht[1],tshift);
189  // subctract second from the first ifo
190  wwht[0]-=wwht[1];
191  PlotSpectrogram(&wwht[ifo], tstart, tstop,title,ofile,tchirp,mchirp);
192  if(bexit) exit(0); else return;
193  }
194  if(gtype>=7) {
195  // dump data to ascii file
196  DumpWaveform(ifo, &wrec[ifo], &wmed[ifo], &wl50[ifo], &wu50[ifo], &wl90[ifo], &wu90[ifo]);
197  exit(0);
198  }
199 
200  return;
201 }
202 
205  wavearray<double> *wl90, wavearray<double> *wu90) {
206 //
207 // ----------------------------------------------------
208 // ROOT Output PE Parameters
209 // ----------------------------------------------------
210 
211  float pe_erR[11]; // probability distribution of residuals
212  float pe_erF[11]; // probability distribution of frequency residuals
213  int pe_trials; // number of effective trials
214  float pe_pnul[2*NIFO_MAX]; // null pixel statistic, for each detector pnul[0]=avr, pnul=rms
215  float pe_snet[2]; // SNRnet statistic, 0 -> avr, 1 -> rms
216  float pe_ff[2]; // Fitting Factor statistic, 0 -> avr, 1 -> rms
217  float pe_of[2]; // Overlap Factor statistic, 0 -> avr, 1 -> rms
218  float pe_mch[2]; // chirp mass statistic, 0 -> avr, 1 -> rms
219 
220  wavearray<double>* pe_wINJ[NIFO_MAX];
221  wavearray<double>* pe_wREC[NIFO_MAX];
222  wavearray<double>* pe_wWHT[NIFO_MAX];
223  wavearray<double>* pe_wMED[NIFO_MAX];
224  wavearray<double>* pe_wL50[NIFO_MAX];
225  wavearray<double>* pe_wU50[NIFO_MAX];
226  wavearray<double>* pe_wL90[NIFO_MAX];
227  wavearray<double>* pe_wU90[NIFO_MAX];
228  wavearray<double>* pe_wAVR[NIFO_MAX];
229  wavearray<double>* pe_wRMS[NIFO_MAX];
230 
231  TFile* froot = new TFile(ifile,"READ");
232  if(froot==NULL) {cout << "ReadWaveformPE Error : opening input root file" << endl;exit(1);}
233  TTree* gTREE = (TTree*)froot->Get("waveburst");
234  if(gTREE==NULL) {cout << "ReadWaveformPE Error : no waveburst present in the file" << endl;exit(1);}
235 
236  // get detector list
237  TList* list = gTREE->GetUserInfo();
238  int nIFO=list->GetSize();
239  std::vector<TString> ifoname;
240  if (nIFO==0) {cout << "ReadWaveformPE Error : no ifo present in the tree" << endl;exit(1);}
241  for (int n=0;n<list->GetSize();n++) {
242  detector* pDetector;
243  pDetector = (detector*)list->At(n);
244  ifoname.push_back(pDetector->Name);
245  detectorParams dParams = pDetector->getDetectorParams();
246  //pDetector->print();
247  }
248 
249  for(int n=0;n<nIFO;n++) {
250  pe_wINJ[n] = new wavearray<double>;
251  pe_wREC[n] = new wavearray<double>;
252  pe_wWHT[n] = new wavearray<double>;
253  pe_wMED[n] = new wavearray<double>;
254  pe_wL50[n] = new wavearray<double>;
255  pe_wU50[n] = new wavearray<double>;
256  pe_wL90[n] = new wavearray<double>;
257  pe_wU90[n] = new wavearray<double>;
258  pe_wAVR[n] = new wavearray<double>;
259  pe_wRMS[n] = new wavearray<double>;
260  }
261 
262  gTREE->SetBranchAddress("pe_trials",&pe_trials);
263  gTREE->SetBranchAddress("pe_erR",pe_erR);
264  gTREE->SetBranchAddress("pe_erF",pe_erF);
265  gTREE->SetBranchAddress("pe_pnul",pe_pnul);
266  gTREE->SetBranchAddress("pe_snet",pe_snet);
267  gTREE->SetBranchAddress("pe_ff",pe_ff);
268  gTREE->SetBranchAddress("pe_of",pe_of);
269  gTREE->SetBranchAddress("pe_mch",pe_mch);
270 
271  for(int n=0;n<nIFO;n++) {
272  gTREE->SetBranchAddress(TString::Format("pe_wINJ_%d",n).Data(),&pe_wINJ[n]);
273  gTREE->SetBranchAddress(TString::Format("pe_wREC_%d",n).Data(),&pe_wREC[n]);
274  gTREE->SetBranchAddress(TString::Format("pe_wWHT_%d",n).Data(),&pe_wWHT[n]);
275  gTREE->SetBranchAddress(TString::Format("pe_wMED_%d",n).Data(),&pe_wMED[n]);
276  gTREE->SetBranchAddress(TString::Format("pe_wL50_%d",n).Data(),&pe_wL50[n]);
277  gTREE->SetBranchAddress(TString::Format("pe_wU50_%d",n).Data(),&pe_wU50[n]);
278  gTREE->SetBranchAddress(TString::Format("pe_wL90_%d",n).Data(),&pe_wL90[n]);
279  gTREE->SetBranchAddress(TString::Format("pe_wU90_%d",n).Data(),&pe_wU90[n]);
280  gTREE->SetBranchAddress(TString::Format("pe_wAVR_%d",n).Data(),&pe_wAVR[n]);
281  gTREE->SetBranchAddress(TString::Format("pe_wRMS_%d",n).Data(),&pe_wRMS[n]);
282  }
283 
284  gTREE->GetEntry(0);
285 
286  cout.precision(4);
287  cout << "---------------------> size " << pe_wMED[0]->size() << endl;
288  cout << "---------------------> pe_trials " << pe_trials << endl;
289 
290  int n = ifo;
291 
292  *winj = GetAlignedWaveform(pe_wINJ[n],pe_wREC[n]);
293  *wrec = GetAlignedWaveform(pe_wREC[n],pe_wREC[n]);
294  *wwht = GetAlignedWaveform(pe_wWHT[n],pe_wREC[n]);
295  *wmed = GetAlignedWaveform(pe_wMED[n],pe_wREC[n]);
296  *wl50 = GetAlignedWaveform(pe_wL50[n],pe_wREC[n]);
297  *wu50 = GetAlignedWaveform(pe_wU50[n],pe_wREC[n]);
298  *wl90 = GetAlignedWaveform(pe_wL90[n],pe_wREC[n]);
299  *wu90 = GetAlignedWaveform(pe_wU90[n],pe_wREC[n]);
300 
301  for(int n=0;n<nIFO;n++) {
302  delete pe_wINJ[n];
303  delete pe_wREC[n];
304  delete pe_wWHT[n];
305  delete pe_wMED[n];
306  delete pe_wL50[n];
307  delete pe_wU50[n];
308  delete pe_wL90[n];
309  delete pe_wU90[n];
310  delete pe_wAVR[n];
311  delete pe_wRMS[n];
312  }
313 
314  return ifoname;
315 }
316 
317 
318 double GetTimeBoundaries(wavearray<double> x, double P, double& bT, double& eT) {
319 
320  if(P<0) P=0;
321  if(P>1) P=1;
322 
323  int N = x.size();
324 
325  double E = 0; // signal energy
326  double avr = 0; // average
327  for(int i=0;i<N;i++) {avr+=i*x[i]*x[i]; E+=x[i]*x[i];}
328  int M=int(avr/E); // central index
329 
330  // search range which contains percentage P of the total energy E
331  int jB=0;
332  int jE=N-1;
333  double a,b;
334  double sum = ((M>=0)&&(M<N)) ? x[M]*x[M] : 0.;
335  for(int j=1; j<N; j++) {
336  a = ((M-j>=0)&&(M-j<N)) ? x[M-j] : 0.;
337  b = ((M+j>=0)&&(M+j<N)) ? x[M+j] : 0.;
338  if(a) jB=M-j;
339  if(b) jE=M+j;
340  sum += a*a+b*b;
341  if(sum/E > P) break;
342  }
343 
344  bT = x.start()+jB/x.rate();
345  eT = x.start()+jE/x.rate();
346 
347  return eT-bT;
348 }
349 
353  TString pdir, double P, bool freq, bool showerr) {
354 
355  int size = wrec->size();
356 
357  wavearray<double> time(size);
358  wavearray<double> etime(size); etime=0;
359  for (int i=0; i<size; i++) time[i] = i/wrec->rate();
360 
361  double bT, eT;
362  GetTimeBoundaries(*wref, P, bT, eT);
363  bT-=wref->start();
364  eT-=wref->start();
365 
366  // set to 0 the frequency values outside the time range -> fix the y scale autoscale
367  // info : this procedure modify the frequency input data but it is not relevant
368  if(freq) {
369  for(int i=0;i<wrec->size();i++) {
370  if(time[i]>bT && time[i]<eT) continue;
371  wrec->data[i]=0; wmed->data[i]=0; wl50->data[i]=0; wu50->data[i]=0; wl90->data[i]=0; wu90->data[i]=0;
372  }
373  }
374 
375  TGraphAsymmErrors* egr90 = new TGraphAsymmErrors(size,time.data,wmed->data,etime.data,etime.data,wl90->data,wu90->data);
376  egr90->SetLineColor(17);
377  egr90->SetFillStyle(1001);
378  egr90->SetFillColor(17);
379  egr90->GetXaxis()->SetTitle("time (s)");
380  if(freq) egr90->GetYaxis()->SetTitle("frequency (hz)");
381  else egr90->GetYaxis()->SetTitle("magnitude");
382  egr90->SetTitle(title);
383 
384  TGraphAsymmErrors* egr50 = new TGraphAsymmErrors(size,time.data,wmed->data,etime.data,etime.data,wl50->data,wu50->data);
385  egr50->SetLineColor(15);
386  egr50->SetFillStyle(1001);
387  egr50->SetFillColor(15);
388 
389  TGraph* agr = new TGraph(size,time.data,wmed->data);
390  agr->SetLineWidth(1);
391  agr->SetLineColor(kWhite);
392  agr->SetLineStyle(1);
393 
394  TGraph* gr = new TGraph(size,time.data,wrec->data);
395  gr->SetLineWidth(1);
396  gr->SetLineColor(2);
397 
398  TCanvas* canvas = new TCanvas("wrec", "wrec",200,20,800,500);
399  canvas->cd();
400  canvas->SetGridx();
401  canvas->SetGridy();
402 
403  egr90->GetXaxis()->SetRangeUser(bT, eT);
404  if(showerr) {
405  egr90->Draw("A4");
406  egr50->Draw("4same");
407  agr->Draw("Lsame");
408  gr->Draw("Lsame");
409  } else {
410  agr->GetXaxis()->SetTitle("time (s)");
411  if(freq) agr->GetYaxis()->SetTitle("frequency (hz)");
412  else agr->GetYaxis()->SetTitle("magnitude");
413  agr->SetTitle(title);
414  agr->GetXaxis()->SetRangeUser(bT, eT);
415  agr->SetLineColor(16);
416  gr->SetLineWidth(2);
417  agr->Draw("AL");
418  gr->Draw("Lsame");
419  }
420 
421  if(ofname!="") {
422  ofname = TString(pdir)+TString("/")+ofname;
423  canvas->Print(ofname);
424  cout << "write : " << ofname << endl;
425  }
426 
427 /*
428  delete canvas;
429  delete egr50;
430  delete egr90;
431  delete agr;
432  delete gr;
433 */
434  return;
435 }
436 
438 
439  wavearray<double> wf = *wf2;
440  wf=0;
441 
442  if(wf1==NULL) return wf;
443  if(wf1->size()==0) return wf;
444 
445  double R=wf1->rate();
446 
447  double b_wf1 = wf1->start();
448  double e_wf1 = wf1->start()+wf1->size()/R;
449  double b_wf2 = wf2->start();
450  double e_wf2 = wf2->start()+wf2->size()/R;
451 
452  int o_wf1 = b_wf1>b_wf2 ? 0 : int((b_wf2-b_wf1)*R+0.5);
453  int o_wf2 = b_wf1<b_wf2 ? 0 : int((b_wf1-b_wf2)*R+0.5);
454 
455  double startXCOR = b_wf1>b_wf2 ? b_wf1 : b_wf2;
456  double endXCOR = e_wf1<e_wf2 ? e_wf1 : e_wf2;
457  int sizeXCOR = int((endXCOR-startXCOR)*R+0.5);
458 
459  for(int i=0;i<sizeXCOR;i++) wf[i+o_wf2] = wf1->data[i+o_wf1];
460 
461  return wf;
462 }
463 
465 
466  double R=wf1->rate();
467 
468  double b_wf1 = wf1->start();
469  double e_wf1 = wf1->start()+wf1->size()/R;
470  double b_wf2 = wf2->start();
471  double e_wf2 = wf2->start()+wf2->size()/R;
472 
473  int o_wf1 = b_wf1>b_wf2 ? 0 : int((b_wf2-b_wf1)*R+0.5);
474  int o_wf2 = b_wf1<b_wf2 ? 0 : int((b_wf1-b_wf2)*R+0.5);
475 
476  double startXCOR = b_wf1>b_wf2 ? b_wf1 : b_wf2;
477  double endXCOR = e_wf1<e_wf2 ? e_wf1 : e_wf2;
478  int sizeXCOR = int((endXCOR-startXCOR)*R+0.5);
479 
480  wavearray<double> wfdif(sizeXCOR);
481  wfdif=0.;
482  wfdif.rate(R);
483  wfdif.start(b_wf1+double(o_wf1)/R);
484 
485  for(int i=0;i<sizeXCOR;i++) wfdif[i] = wf1->data[i+o_wf1] - wf2->data[i+o_wf2];
486 
487  return wfdif;
488 }
489 
492  wavearray<double>* wl90, wavearray<double>* wu90, wavearray<double>* wref, TString pdir, double P, bool freq) {
493 
494  int size = wrec->size();
495 
496  wavearray<double> time(size);
497  wavearray<double> etime(size); etime=0;
498  for (int i=0; i<size; i++) time[i] = i/wrec->rate();
499 
500  double bT, eT;
501  GetTimeBoundaries(*wref, P, bT, eT);
502  bT-=wref->start();
503  eT-=wref->start();
504 
505  // set to 0 the frequency values outside the time range -> fix the y scale autoscale
506  // info : this procedure modify the frequency input data but it is not relevant
507  if(freq) {
508  for(int i=0;i<wrec->size();i++) {
509  if(time[i]>bT && time[i]<eT) continue;
510  wrec->data[i]=0; wmed->data[i]=0; wl50->data[i]=0; wu50->data[i]=0; wl90->data[i]=0; wu90->data[i]=0;
511  }
512  }
513 
514  TGraphAsymmErrors* egr90 = new TGraphAsymmErrors(size,time.data,wmed->data,etime.data,etime.data,wl90->data,wu90->data);
515  egr90->SetLineColor(17);
516  egr90->SetFillStyle(1001);
517  egr90->SetFillColor(17);
518  egr90->GetXaxis()->SetTitle("time (s)");
519  if(freq) egr90->GetYaxis()->SetTitle("frequency (hz)");
520  else egr90->GetYaxis()->SetTitle("magnitude");
521  egr90->SetTitle(title);
522 
523  TGraphAsymmErrors* egr50 = new TGraphAsymmErrors(size,time.data,wmed->data,etime.data,etime.data,wl50->data,wu50->data);
524  egr50->SetLineColor(15);
525  egr50->SetFillStyle(1001);
526  egr50->SetFillColor(15);
527 
528  TGraph* agr = new TGraph(size,time.data,wmed->data);
529  agr->SetLineWidth(1);
530  agr->SetLineColor(kWhite);
531  agr->SetLineStyle(1);
532 
533  TGraph* gr = new TGraph(size,time.data,wrec->data);
534  gr->SetLineWidth(1);
535  gr->SetLineColor(2);
536 
537  TCanvas* canvas = new TCanvas("wrec", "wrec",200,20,800,500);
538  canvas->cd();
539  canvas->SetGridx();
540  canvas->SetGridy();
541 
542  egr90->GetXaxis()->SetRangeUser(bT, eT);
543  egr90->Draw("A4");
544  egr50->Draw("4same");
545  agr->Draw("Lsame");
546  gr->Draw("Lsame");
547 
548  ofname = TString(pdir)+TString("/")+ofname;
549  if(ofname!="") {
550  canvas->Print(ofname);
551  cout << "write : " << ofname << endl;
552  }
553 
554  delete canvas;
555  delete egr50;
556  delete egr90;
557  delete agr;
558  delete gr;
559 }
560 
561 // Dumps reconstructed waveform/time/errors array in ASCII format.
564  wavearray<double>* wl90, wavearray<double>* wu90) {
565 
566  char ofname[256];
567 
568  if(ifo==0) sprintf(ofname,OUT_CWB_ASCII_FILE_L1);
569  if(ifo==1) sprintf(ofname,OUT_CWB_ASCII_FILE_H1);
570 
571  ofstream out;
572  out.open(ofname,ios::out);
573  if (!out.good()) {cout << "Error Opening Output File : " << ofname << endl;exit(1);}
574  cout << "Create Output File : " << ofname << endl;
575  out.precision(19);
576 
577  // write header
578  out << "#whitened data : time, amp_point, amp_median, amp_lower_50_perc, amp_lower_90_perc, amp_upper_50_perc, amp_upper_90_perc" << endl;
579 
580  // write data
581  int size = wrec->size();
582  double dt=1./wrec->rate();
583  for (int i=0; i<size; i++) {
584  double time = i*dt+wrec->start();
585 
586  double vrec = wrec->data[i];
587  double vmed = wmed->data[i];
588  double vl50 = fabs(wl50->data[i]);
589  double vu50 = fabs(wu50->data[i]);
590  double vl90 = fabs(wl90->data[i]);
591  double vu90 = fabs(wu90->data[i]);
592 
593  double l50 = vmed-vl50;
594  double u50 = vmed+vu50;
595  double l90 = vmed-vl90;
596  double u90 = vmed+vu90;
597 
598  // dump full percentiles
599  out << time << " " << vrec << " " << vmed << " " << l50 << " " << l90 << " " << u50 << " " << u90 << endl;
600  // dump dif percentiles from median
601  //out << time << " " << vrec << " " << vmed << " " << vl50 << " " << vl90 << " " << vu50 << " " << vu90 << endl;
602 
603  }
604 
605  out.close();
606 }
607 
608 // Read reconstructed waveform/time/errors array from ascii file
612  wavearray<double>* frec, wavearray<double>* fmed,
614  wavearray<double>* fl90, wavearray<double>* fu90) {
615 
616 // #whitened data : time, amp_point, amp_mean, amp_rms, amp_median, amp_lower_50_perc, amp_lower_90_perc, amp_upper_50_perc, amp_upper_90_perc,
617 // frq_point, frq_mean, frq_rms, frq_median, frq_lower_50_perc, frq_lower_90_perc, frq_upper_50_perc, frq_upper_90_perc
618 
619 
620  char ifname[256];
621 
622  if(ifo==0) sprintf(ifname,"%s/%s",ipath.Data(),IN_CWB_ASCII_FILE_L1);
623  if(ifo==1) sprintf(ifname,"%s/%s",ipath.Data(),IN_CWB_ASCII_FILE_H1);
624 
625  ifstream in(ifname);
626  if(!in.good()) {cout << "Error Opening File : " << ifname << endl;exit(1);}
627 
628  int size=0;
629  char str[1024];
630  int fpos=0;
631  in.getline(str,1024); // skip first line : header
632  while(true) {
633  in.getline(str,1024);
634  if (!in.good()) break;
635  size++;
636  }
637  cout << "size " << size << endl;
638  in.clear(ios::goodbit);
639  in.seekg(0, ios::beg);
640  if (size==0) {cout << "Error : File " << ifname<< " is empty" << endl;gSystem->Exit(1);}
641 
642  double time;
643  double vrec, vavr, vrms, vmed, vl50, vl90, vu50, vu90;
644  double grec, gavr, grms, gmed, gl50, gl90, gu50, gu90;
645 
646  wrec->rate(2048.);
647  wmed->rate(2048.);
648  wl50->rate(2048.);
649  wu50->rate(2048.);
650  wl90->rate(2048.);
651  wu90->rate(2048.);
652 
653  wrec->resize(size);
654  wmed->resize(size);
655  wl50->resize(size);
656  wu50->resize(size);
657  wl90->resize(size);
658  wu90->resize(size);
659 
660  frec->rate(2048.);
661  fmed->rate(2048.);
662  fl50->rate(2048.);
663  fu50->rate(2048.);
664  fl90->rate(2048.);
665  fu90->rate(2048.);
666 
667  frec->resize(size);
668  fmed->resize(size);
669  fl50->resize(size);
670  fu50->resize(size);
671  fl90->resize(size);
672  fu90->resize(size);
673 
674  // skip header
675  in.getline(str,1024);
676 
677  int i=0;
678  while(1) {
679 
680  in >> time
681  >> vrec >> vavr >> vrms >> vmed >> vl50 >> vl90 >> vu50 >> vu90
682  >> grec >> gavr >> grms >> gmed >> gl50 >> gl90 >> gu50 >> gu90;
683 
684  if (!in.good()) break;
685 
686  wrec->data[i] = vrec;
687  wmed->data[i] = vmed;
688 
689  // read full percentile -> reduce to relative percentiles
690  wl50->data[i] = vmed-vl50;
691  wu50->data[i] = vu50-vmed;
692  wl90->data[i] = vmed-vl90;
693  wu90->data[i] = vu90-vmed;
694 
695  if(i==0) {
696  wrec->start(time);
697  wmed->start(time);
698  wl50->start(time);
699  wu50->start(time);
700  wl90->start(time);
701  wu90->start(time);
702  }
703 
704  frec->data[i] = grec;
705  fmed->data[i] = gmed;
706 
707  // read full percentile -> reduce to relative percentiles
708  fl50->data[i] = gmed-gl50;
709  fu50->data[i] = gu50-gmed;
710  fl90->data[i] = gmed-gl90;
711  fu90->data[i] = gu90-gmed;
712 
713  if(i==0) {
714  frec->start(time);
715  fmed->start(time);
716  fl50->start(time);
717  fu50->start(time);
718  fl90->start(time);
719  fu90->start(time);
720  }
721 
722  i++;
723  }
724 
725  wrec->resize(i);
726  wmed->resize(i);
727  wl50->resize(i);
728  wu50->resize(i);
729  wl90->resize(i);
730  wu90->resize(i);
731 
732  frec->resize(i);
733  fmed->resize(i);
734  fl50->resize(i);
735  fu50->resize(i);
736  fl90->resize(i);
737  fu90->resize(i);
738 
739 }
740 
741 void FrequencyCut(wavearray<double>* x, double bF, double eF) {
742 
743  // cut frequency range bF,eF
744  double F=0.;
745  double dF=(x->rate()/(double)x->size())/2.;
746  x->FFTW(1);
747  for(int j=0;j<x->size()/2;j+=2) {
748  F = j*dF;
749  if(F<bF || F>eF) {x->data[j]=0;x->data[j+1]=0;}
750  }
751  x->FFTW(-1);
752 }
753 
754 void PlotSpectrogram(wavearray<double>* x, double tstart, double tstop, TString title, TString ofname, double tchirp, double mchirp) {
755 
756  if(tstart==0) tstart=x->start();
757  if(tstop==0) tstop=x->stop();
758 
759  // START CHIRP FUNCTION
760  if(mchirp>0) {
761  double Mc = mchirp;
762  double Tc = tchirp;
763 
764  const double G = watconstants::GravitationalConstant();
765  const double SM = watconstants::SolarMass();
766  const double C = watconstants::SpeedOfLightInVacuo();
767  const double Pi = TMath::Pi();
768 
769  double p0 = 256.*Pi/5*pow(G*Mc*SM*Pi/C/C/C, 5./3);
770  double p1 = Tc;
771 
772  double tmin=Tc-0.9;
773  double tmax=Tc;
774 
775  // chirp function -> freq = p0 * (time-p1);
776  fchirp = new TF1("fchirp", "pow([0]*([1]-x),-3./8.)", tmin, tmax);
777  fchirp->SetLineColor(kWhite);
778  fchirp->SetLineWidth(1);
779  fchirp->SetLineStyle(2);
780  fchirp->SetParameter(0, p0);
781  fchirp->SetParameter(1, p1);
782  }
783  // END CHIRP FUNCTION
784 
785  TString xtitle = TString::Format("Time (sec) : GPS OFFSET = %.3f",x->start());
786 
787  int nfact=4;
788  int nfft=nfact*512;
789  int noverlap=nfft-10;
790  double fparm=nfact*6;
791  int ystart = int((tstart-x->start()-1)*x->rate());
792  int ystop = int((tstop-x->start()+1)*x->rate());
793  ystart-=nfft;
794  ystop+=nfft;
795  int ysize=ystop-ystart;
796  wavearray<double> y;y.resize(ysize);y.rate(x->rate());y.start(ystart/x->rate());
797 
798  // stft use dt=y.rate() to normalize data but whitened data are already normalized by dt
799  // so before stft data must be divided by 1./sqrt(dt)
800  for(int i=0;i<(int)y.size();i++) y.data[i]=x->data[i+ystart]/sqrt(y.rate());
801 
802  stft = new CWB::STFT(y,nfft,noverlap,"energy","gauss",fparm);
803 
804  TCanvas* canvas;
805  double xtstart = nfft/x->rate()+ystart/x->rate();
806  double xtstop = (ysize-nfft)/x->rate()+ystart/x->rate();
807 
808  xtstart+=0.9;xtstop-=0.9;
809  stft->Draw(xtstart,xtstop,16,1024,0,0,1);
810  if(fchirp!=NULL) fchirp->Draw("SAME");
811  stft->GetHistogram()->SetTitle(title);
812  stft->GetHistogram()->GetXaxis()->SetTitle(xtitle);
813  canvas = stft->GetCanvas();
814  canvas->SetLogy(true);
815  stft->GetHistogram()->GetXaxis()->SetTitle(xtitle);
816  if(ofname!="") stft->Print(ofname);
817 
818  y.resize(0);
819 }
820 
char ofile[1024]
CWB::config * cfg
detectorParams getDetectorParams()
Definition: detector.cc:218
static const double C
Definition: GNGen.cc:28
int noverlap
Definition: TestDelta.C:20
char xtitle[1024]
double M
Definition: DrawEBHH.C:13
void FrequencyCut(wavearray< double > *x, double bF, double eF)
virtual void rate(double r)
Definition: wavearray.hh:141
void Print(TString pname)
Definition: STFT.cc:315
#define OUT_CWB_ASCII_FILE_H1
std::vector< TString > ReadDataFromROOT(TString ifile, int ifo, wavearray< double > *winj, wavearray< double > *wrec, wavearray< double > *wwht, wavearray< double > *wmed, wavearray< double > *wl50, wavearray< double > *wu50, wavearray< double > *wl90, wavearray< double > *wu90)
wavearray< double > a(hp.size())
int n
Definition: cwb_net.C:28
TString("c")
ofstream out
Definition: cwb_merge.C:214
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
double SolarMass()
Definition: constants.hh:202
int nfact
Definition: TestDelta.C:18
#define FHIGH
int nfft
Definition: TestDelta.C:19
return wmap canvas
wavearray< double > GetAlignedWaveform(wavearray< double > *wf, wavearray< double > *wref)
waveform wf
Long_t size
void PlotSpectrogram(wavearray< double > *x, double tstart=0, double tstop=0, TString title="", TString ofname="", double tchirp=0., double mchirp=0.)
virtual void start(double s)
Definition: wavearray.hh:137
int j
Definition: cwb_net.C:28
i drho i
TList * list
#define N
CWB::STFT * stft
char ifo[NIFO_MAX][8]
void Draw(double t1=0.0, double t2=0.0, double f1=0.0, double f2=0.0, double z1=0.0, double z2=0.0, int dpaletteId=DUMMY_PALETTE_ID, Option_t *option="colfz")
Definition: STFT.cc:94
TTree * gTREE
#define nIFO
double tstart
virtual size_t size() const
Definition: wavearray.hh:145
#define FLOW
char str[1024]
wavearray< double > freq
Definition: Regression_H1.C:79
double G
Definition: DrawEBHH.C:12
TGraph * gr
static const double SM
Definition: GNGen.cc:26
i() int(T_cor *100))
#define IN_CWB_ASCII_FILE_L1
TString label
Definition: MergeTrees.C:21
double Pi
watplot p1(const_cast< char *>("TFMap1"))
TF1 * fchirp
const int NIFO_MAX
Definition: wat.hh:22
TH2D * GetHistogram()
Definition: STFT.hh:71
void PlotWaveformAsymmErrors(TString ofname, TString title, wavearray< double > *wrec, wavearray< double > *wmed, wavearray< double > *wl50, wavearray< double > *wu50, wavearray< double > *wl90, wavearray< double > *wu90, wavearray< double > *wref, TString pdir, double P, bool freq=false, bool showerr=true)
float mchirp
wavearray< double > GetDifWaveform(wavearray< double > *wf1, wavearray< double > *wf2)
double tstop
void ReadDataFromASCII(TString ipath, int ifo, wavearray< double > *wrec, wavearray< double > *wmed, wavearray< double > *wl50, wavearray< double > *wu50, wavearray< double > *wl90, wavearray< double > *wu90, wavearray< double > *frec, wavearray< double > *fmed, wavearray< double > *fl50, wavearray< double > *fu50, wavearray< double > *fl90, wavearray< double > *fu90)
void DumpWaveform(int ifo, wavearray< double > *wrec, wavearray< double > *wmed, wavearray< double > *wl50, wavearray< double > *wu50, wavearray< double > *wl90, wavearray< double > *wu90)
double F
TFile * ifile
#define IN_CWB_ASCII_FILE_H1
TFile * froot
double dt
virtual void FFTW(int=1)
Definition: wavearray.cc:896
double GravitationalConstant()
Definition: constants.hh:131
static void TimeShift(wavearray< double > &x, double tShift=0.)
Definition: mdc.cc:2903
double GetTimeBoundaries(wavearray< double > x, double P, double &bT, double &eT)
int nifo
char title[256]
Definition: SSeriesExample.C:1
ifstream in
char Name[16]
Definition: detector.hh:327
virtual void stop(double s)
Definition: wavearray.hh:139
double fabs(const Complex &x)
Definition: numpy.cc:55
TCanvas * GetCanvas()
Definition: STFT.hh:70
#define OUT_CWB_ASCII_FILE_L1
void DrawWaveformPE(TString ipath, int gtype=0, int ifo=0, double tshift=0, TString label="PLOT", double P=0.99)
sprintf(tfres,"(1/%g)x(%g) (sec)x(Hz)", 2 *df, df)
DataType_t * data
Definition: wavearray.hh:319
virtual void resize(unsigned int)
Definition: wavearray.cc:463
wavearray< double > y
Definition: Test10.C:31
gwavearray< double > * grec
double fparm
Definition: TestDelta.C:22
exit(0)
double SpeedOfLightInVacuo()
Definition: constants.hh:114
double avr