Logo coherent WaveBurst  
Config Reference Guide
Logo
ComputeJobProcDataTime.C
Go to the documentation of this file.
1 /*
2 # Copyright (C) 2019 Gabriele Vedovato
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <https://www.gnu.org/licenses/>.
16 */
17 
18 //
19 // this macro is used to compute the effective observational time processed with jobs at zero lag after cat1 & cat2 subtraction
20 // -> produces a file with list of standard/extended (fixed/variable length) segments
21 //
22 
23 #define HOUR 3600.
24 #define DAY (24.*3600.)
25 #define SEGMLS 200 // used for extended segments
26 
27 bool sortByName(const string &ifo1, const string &ifo2) { return ifo1 < ifo2; }
28 
29 void ComputeJobProcDataTime(TString type, TString parameter1, TString parameter2="", TString parameter3="", TString parameter4="") {
30 
31  TString chunk;
32  TString odir="";
33  TString olabel="";
34 
35  TString ifname1;
36  TString ifname2;
37 
38  TString ofname;
39 
40  if(type!="standard" && type!="extended" && type!="exclusive") {
41  cout << "ComputeJobProcDataTime.C - Error: allowed input type must be standard/extended/exclusive" << endl;
42  exit(1);
43  }
44 
45  CWB::Toolbox TB;
46  vector<waveSegment> segList;
47  double seg_time;
48 
49  vector<TString> ifos(nIFO);
50  for(int n=0;n<nIFO;n++) {
51  if(strlen(ifo[n])!=0) ifos[n]=ifo[n]; // built in detector
52  else ifos[n]=detParms[n].name; // user define detector
53  }
54 
55  // sort detector names
56  vector<string> uifos(nIFO); // unsorted ifos
57  for(int i=0;i<nIFO;i++) uifos[i]=ifos[i].Data();
58  sort(uifos.begin(), uifos.end(), sortByName);
59  TString sifos[3]; // sorted ifos
60  int n=0; for(string &ifo : uifos) sifos[n++]=ifo.c_str();
61  //for(int i=0;i<nIFO;i++) cout << i << " -------------------> SORTED " << sifos[i] << endl;
62 
63  // set name label for output file
64  TString snet = sifos[0];
65  for(int i=1;i<nIFO;i++) snet += "_"+sifos[i];
66 
67  if(type=="exclusive") {
68 
69  ifname1 = parameter1;
70  ifname2 = parameter2;
71  odir = parameter3;
72  olabel = parameter4;
73 
74  vector<waveSegment> seg1 = TB.readSegments(ifname1); // read segments 1
75  double seg1_time = TB.getTimeSegList(seg1);
76  cout << "seg1_time = " << (int)seg1_time << " sec - " << seg1_time/DAY << " days" << endl;
77 
78  vector<waveSegment> seg2 = TB.readSegments(ifname2); // read segments 2
79  double seg2_time = TB.getTimeSegList(seg2);
80  cout << "seg2_time = " << (int)seg2_time << " sec - " << seg2_time/DAY << " days" << endl;
81 
82  vector<waveSegment> iseg2 = TB.invertSegments(seg2); // compute inverse iseg2 segments
83 
84  vector<waveSegment> xseg12 = TB.mergeSegLists(seg1,iseg2); // compute the exclusive time of seg1 wrt seg2
85  double xseg12_time = TB.getTimeSegList(xseg12);
86  cout << "xseg12_time = " << (int)xseg12_time << " sec - " << xseg12_time/DAY << " days" << endl;
87 
88  segList = xseg12;
89  seg_time = xseg12_time;
90  snet="exclusive";
91 
92  ofname = ifname1;
93  TString label = olabel!="_not" ? "_not_"+olabel : "";
94  ofname.ReplaceAll(".txt",label+".txt");
95  }
96 
97  if(type=="standard" || type=="extended") {
98 
99  chunk = parameter1;
100  odir = parameter2;
101  olabel = parameter3;
102 
103  // extract cat0 segments
104  vector<waveSegment> cat0List=TB.readSegList(nDQF, DQF, CWB_CAT0);
105  double cat0_time=TB.getTimeSegList(cat0List);
106  cout << "total livetime after cat0: " << int(cat0_time) << " sec "
107  << cat0_time/HOUR << " h " << cat0_time/DAY << " days" << endl;
108  cout << endl;
109 
110  // extract cat1 segments
111  vector<waveSegment> cat1List=TB.readSegList(nDQF, DQF, CWB_CAT1);
112  double cat1_time=TB.getTimeSegList(cat1List);
113  cout << "total livetime after cat1: " << int(cat1_time) << " sec "
114  << cat1_time/HOUR << " h " << cat1_time/DAY << " days" << endl;
115  cout << endl;
116 
117  // extract cat2 segments
118  vector<waveSegment> cat2List=TB.readSegList(nDQF, DQF, CWB_CAT2);
119  double cat2_time=TB.getTimeSegList(cat2List);
120  cout << "total livetime after cat2: " << int(cat2_time) << " sec "
121  << cat2_time/HOUR << " h " << cat2_time/DAY << " days" << endl;
122  cout << endl;
123 
124  // extract job segments
125  if(type=="standard") {
126  vector<waveSegment> jobList=TB.getSlagJobList(cat1List, segLen);
127  int slagSegs=jobList.size();
128  vector<slag> rslagList;
129  // full slag list: force slagSize=1, slagFile=NULL
130  vector<slag> slagList=TB.getSlagList(nIFO, 1, slagSegs, slagOff, slagMin, slagMax, slagSite, NULL);
131  cout << "slagList size : " << slagList.size() << endl;
132  // reduced slag list (removed slag with max segLength < segMSL after cat1 & segLength < segTHR after cat2)
133  cout << endl << "Start segments selection from dq cat1 list ..." << endl << endl;
134  rslagList=TB.getSlagList( slagList, ifos, segLen, segMLS, segEdge, nDQF, DQF, CWB_CAT1);
135  cout << "Number of selected jobs after cat1 : " << rslagList.size() << endl;
136  cout << endl << "Start segments selection from dq cat2 list ..." << endl << endl;
137  rslagList=TB.getSlagList(rslagList, ifos, segLen, segTHR, segEdge, nDQF, DQF, CWB_CAT2);
138  cout << "Number of selected jobs after cat2 : " << rslagList.size() << endl;
139 
140  slag SLAG;
141  waveSegment SEG;
142  vector<waveSegment> tmpList;
143 
144  for(int i=0;i<rslagList.size();i++) {
145 
146  SLAG = rslagList[i];
147 
148  // get range segment for this job intersecting with cat1 list (cat1List)
149  SEG.start = jobList[SLAG.segId[0]-1].start-segEdge;
150  SEG.stop = jobList[SLAG.segId[0]-1].stop+segEdge;
151  tmpList.clear();
152  tmpList.push_back(SEG);
153  tmpList = TB.mergeSegLists(cat1List,tmpList); // merge detector segments with dq cat1
154  SEG = TB.getMaxSeg(tmpList); // extract max length segment (only this segment is used for analysis)
155  int segLength=SEG.stop-SEG.start;
156  if(segLength>=segMLS+2*segEdge) {
157  SEG.start+=segEdge;
158  SEG.stop-=segEdge;
159  segList.push_back(SEG);
160  }
161  }
162 
163  char fname[1024];
164  TString label = olabel!="" ? "_"+olabel : "";
165  sprintf(fname,"%s/K%s_sjobs_%s_cat012%s.txt",odir.Data(),chunk.Data(),snet.Data(),label.Data());
166  ofname=fname;
167  }
168 
169  if(type=="extended") {
170  vector<waveSegment> jobList=TB.getJobList(cat1List, cat2List, segLen, SEGMLS, segTHR, segEdge);
171  cout<<endl<<"Final number of extended jobs : " << jobList.size() <<endl<<endl;
172  segList=jobList;
173 
174  char fname[1024];
175  TString label = olabel!="" ? "_"+olabel : "";
176  sprintf(fname,"%s/K%s_ejobs_%s_cat012%s.txt",odir.Data(),chunk.Data(),snet.Data(),label.Data());
177  ofname=fname;
178  }
179 
180  cout.precision(6);
181 
182  double job_time=TB.getTimeSegList(segList);
183  cout << "cat1 livetime (zero lag) of the standard job list : " << int(job_time) << " sec "
184  << job_time/HOUR << " h " << job_time/DAY << " days" << endl;
185  cout << endl;
186 
187  segList = TB.mergeSegLists(segList,cat2List);
188  double job_time_cat2=TB.getTimeSegList(segList);
189  cout << "cat1+cat2 livetime (zero lag) of the standard job list : " << int(job_time_cat2) << " sec "
190  << job_time_cat2/HOUR << " h " << job_time_cat2/DAY << " days" << endl;
191 
192  seg_time = job_time_cat2;
193  }
194 
195  if(odir!="") {
196 
197  // remove segment with zero length
198  vector<waveSegment> osegList;
199  for(int i=0;i<segList.size();i++) {
200  if(segList[i].stop > segList[i].start) osegList.push_back(segList[i]);
201  }
202 
203  // output job list file
204  cout<<"Dump segment list : includes jobs discarted by the condition livetime<segTHR"<<endl;
205  TB.dumpSegList(osegList,ofname);
206 
207  // dump to README.md file
208  ofstream out;
209  if(TB.isFileExisting("README.md")) {
210  out.open("README.md",ios::app); // append
211  } else {
212  out.open("README.md",ios::out); // create
213  }
214  if(!out.good()) {cout << "ComputeJobProcDataTime.C - Error : Opening File : "
215  << "README.md" << endl;gSystem->Exit(1);}
216  out.precision(6);
217  out << "--------------------------------------------------------------------------" << endl;
218  if(type=="exclusive") out << snet << " network exclusive time after cat0+cat1+cat2 on standard segments" << endl;
219  if(type=="standard") out << snet << " network coincident time after cat0+cat1+cat2 on standard segments" << endl;
220  if(type=="extended") out << snet << " network coincident time after cat0+cat1+cat2 on extended segments" << endl;
221  out << "--------------------------------------------------------------------------" << endl;
222  out << endl;
223  out << snet << "_time = " << (int)seg_time << " sec - " << seg_time/DAY << " days" << endl;
224  out << "-> " << gSystem->BaseName(ofname) << endl << endl;
225  out.close();
226  }
227  cout << endl;
228 
229  exit(0);
230 }
#define HOUR
#define DAY
bool sortByName(const string &ifo1, const string &ifo2)
void ComputeJobProcDataTime(TString type, TString parameter1, TString parameter2="", TString parameter3="", TString parameter4="")
#define SEGMLS
segEdge
slagMin
slagMax
segMLS
slagOff
nDQF
segLen
nIFO
segTHR
shift breaksw case n
Definition: cwb_clchunk.csh:75
char fname[256]
list ifos
Definition: cWB_conf.py:23
string label
Definition: cWB_conf.py:18