Logo coherent WaveBurst  
Library Reference Guide
Logo
cwb_condor_benchmark.C
Go to the documentation of this file.
1 /*
2 # Copyright (C) 2019 Gabriele Vedovato, Marco Drago
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 // draw benchmark plots of computational load : used by the cwb_condor command
20 
21 #include <vector>
22 
23 #define NSTAGE 7
24 
25 TCanvas* canvas;
26 TH1F* hplot;
27 TGraph* gplot;
28 TH2F* h2plot;
29 
31 
32  TString STAGE[NSTAGE] = {"FULL","INIT","STRAIN","CSTRAIN","COHERENCE","SUPERCLUSTER","LIKELIHOOD"};
33 
35 
36  TB.checkFile(gSystem->Getenv("CWB_ROOTLOGON_FILE"));
37  TB.checkFile(gSystem->Getenv("CWB_PARAMETERS_FILE"));
38  TB.checkFile(gSystem->Getenv("CWB_UPARAMETERS_FILE"));
39 
40  // get benchmark options
41  TString cwb_jstage_name = "FULL";
42  TString cwb_fstage_name = "FULL";
43  TString cwb_plot_type = "HIST";
44  TString cwb_plot_save = "";
45  TString cwb_bench_name = "JET"; // JET/SET/MEM/SET
46  double cwb_bench_min = -1; // min bench value
47  double cwb_bench_max = -1; // max bench value
48  int cwb_bench_res = -1; // res bench value (disabled)
49  int cwb_bench_factor= -1; // factor bench value (disabled)
50  TString cwb_bench_opts=TString(gSystem->Getenv("CWB_BENCH_OPTS"));
51  if(cwb_bench_opts!="") {
52  int bstage=false;
53  TString option="";
54  // get fstage
55  option = TB.getParameter(cwb_bench_opts,"--fstage");
56  if(option!="") {
57  cwb_fstage_name = option;
58  cwb_fstage_name.ToUpper();
59  bstage=false;
60  for(int i=0;i<NSTAGE;i++) if(cwb_fstage_name==STAGE[i]) bstage=true;
61  if(!bstage) {
62  cout << "cwb_condor_benchmark.C : fstage "
63  << cwb_fstage_name.Data() << " not correct" << endl;
64  cout << "select : " << endl;
65  for(int i=0;i<NSTAGE;i++) cout << STAGE[i] << endl;
66  gSystem->Exit(1);
67  }
68  }
69  // get jstage
70  option = TB.getParameter(cwb_bench_opts,"--jstage");
71  if(option!="") {
72  cwb_jstage_name = option;
73  cwb_jstage_name.ToUpper();
74  bstage=false;
75  for(int i=0;i<NSTAGE;i++) if(cwb_jstage_name==STAGE[i]) bstage=true;
76  if(!bstage) {
77  cout << "cwb_condor_benchmark.C : jstage "
78  << cwb_jstage_name.Data() << " not correct" << endl;
79  cout << "select : " << endl;
80  for(int i=0;i<NSTAGE;i++) cout << STAGE[i] << endl;
81  gSystem->Exit(1);
82  }
83  }
84  // get res
85  option = TB.getParameter(cwb_bench_opts,"--res");
86  if(option!="") cwb_bench_res = option.Atoi();
87  // get factor
88  option = TB.getParameter(cwb_bench_opts,"--factor");
89  if(option!="") cwb_bench_factor = option.Atoi();
90  // get bench
91  option = TB.getParameter(cwb_bench_opts,"--bench");
92  if(option!="") {
93  cwb_bench_name=option;
94  cwb_bench_name.ToUpper();
95  if((cwb_bench_name!="MEM") && (cwb_bench_name!="JET") &&
96  (cwb_bench_name!="JFS") && (cwb_bench_name!="SET") &&
97  (cwb_bench_name!="PSIZE") && (cwb_bench_name!="CSIZE") &&
98  (cwb_bench_name!="THR") && (cwb_bench_name!="GT")) {
99  cout << "cwb_condor_benchmark.C : Error - "
100  << "currently only JET/MEM/JFS/SET/THR/PSIZE/CSIZE/GT is implemented" << endl;
101  gSystem->Exit(1);
102  }
103  }
104  if((cwb_bench_res>=0) &&
105  (cwb_bench_name!="THR")&&(cwb_bench_name!="PSIZE")&&(cwb_bench_name!="CSIZE")) {
106  cout << "cwb_condor_benchmark.C : Error - "
107  << "'--res' parm must declared only with bench=THR/PSIZE/CSIZE" << endl;
108  gSystem->Exit(1);
109  }
110  if(((cwb_bench_name=="THR") &&(cwb_bench_res<0)) ||
111  ((cwb_bench_name=="PSIZE")&&(cwb_bench_res<0)) ||
112  ((cwb_bench_name=="CSIZE")&&(cwb_bench_res<0))) {
113  cout << "cwb_condor_benchmark.C : Error - "
114  << "when bench=THR/PSIZE/CSIZE the '--res' parm must be > 0" << endl;
115  gSystem->Exit(1);
116  }
117  if(((cwb_bench_name=="THR") &&(cwb_jstage_name!="COHERENCE")) ||
118  ((cwb_bench_name=="PSIZE")&&(cwb_jstage_name!="COHERENCE")) ||
119  ((cwb_bench_name=="GT") &&(cwb_jstage_name!="COHERENCE")) ||
120  ((cwb_bench_name=="CSIZE")&&(cwb_jstage_name!="COHERENCE"))) {
121  cout << "cwb_condor_benchmark.C : Error - "
122  << "bench=THR/PSIZE/CSIZE/GT is available only in COHERENCE stage" << endl;
123  gSystem->Exit(1);
124  }
125  // get plot type
126  option = TB.getParameter(cwb_bench_opts,"--plot");
127  if(option!="") {
128  cwb_plot_type=option;
129  cwb_plot_type.ToUpper();
130  if((cwb_plot_type!="HIST")&&(cwb_plot_type!="GRAPH")&&(cwb_plot_type!="HIST2")) {
131  cout << "cwb_condor_benchmark.C : currently only HIST/GRAPH/HIST2 is implemented" << endl;
132  gSystem->Exit(1);
133  }
134  }
135  // get plot save
136  option = TB.getParameter(cwb_bench_opts,"--save");
137  if(option!="") {
138  cwb_plot_save=option;
139  if(option.EndsWith(".png")) { // if ends with .png then it is a file
140  // get directory
141  if(option.Contains("/")) {
142  option.Remove(option.Last('/')); // strip file name
143  } else option=".";
144  }
145  CWB::Toolbox::checkFile(option); // check if dir exist
146  }
147 
148  // get min
149  option = TB.getParameter(cwb_bench_opts,"--min");
150  if(option!="") cwb_bench_min = option.Atof();
151  // get max
152  option = TB.getParameter(cwb_bench_opts,"--max");
153  if(option!="") cwb_bench_max = option.Atof();
154  if(cwb_bench_min==0) cwb_bench_min=-1;
155  if(cwb_bench_max==0) cwb_bench_max=-1;
156  if(cwb_bench_min>0 && cwb_bench_max>0 && cwb_bench_min>=cwb_bench_max) {
157  cout << "cwb_condor_benchmark.C : Error min must be < max " << endl;
158  gSystem->Exit(1);
159  }
160  }
161 
162  // if bench = JET/SET/JFS/MEM the values of the current stage are reported in the next stage
163  bool uns = false; // uns : use next stage
164  if(cwb_bench_name=="JET") uns = true;
165  if(cwb_bench_name=="SET") uns = true;
166  if(cwb_bench_name=="JFS") uns = true;
167  if(cwb_bench_name=="MEM") uns = true;
168 
169  CWB_STAGE jstage=CWB_STAGE_FINISH;
170  if(cwb_jstage_name=="INIT") jstage = uns ? CWB_STAGE_STRAIN : CWB_STAGE_INIT;
171  if(cwb_jstage_name=="STRAIN") jstage = uns ? CWB_STAGE_CSTRAIN : CWB_STAGE_STRAIN;
172  if(cwb_jstage_name=="CSTRAIN") jstage = uns ? CWB_STAGE_COHERENCE : CWB_STAGE_CSTRAIN;
173  if(cwb_jstage_name=="COHERENCE") jstage = uns ? CWB_STAGE_SUPERCLUSTER: CWB_STAGE_COHERENCE;
174  if(cwb_jstage_name=="SUPERCLUSTER") jstage = uns ? CWB_STAGE_LIKELIHOOD : CWB_STAGE_SUPERCLUSTER;
175  if(cwb_jstage_name=="LIKELIHOOD") jstage = uns ? CWB_STAGE_SAVE : CWB_STAGE_LIKELIHOOD;
176  if(cwb_jstage_name=="FULL") { jstage = CWB_STAGE_FINISH;
177  if(cwb_bench_name=="SET") cwb_bench_name = "JET";}
178 
179  TString fstage="wave_";
180  if(cwb_fstage_name=="INIT") fstage = "init_";
181  if(cwb_fstage_name=="STRAIN") fstage = "strain_";
182  if(cwb_fstage_name=="CSTRAIN") fstage = "cstrain_";
183  if(cwb_fstage_name=="COHERENCE") fstage = "coherence_";
184  if(cwb_fstage_name=="SUPERCLUSTER") fstage = "supercluster_";
185  if(cwb_fstage_name=="LIKELIHOOD") fstage = "wave_";
186  if(cwb_fstage_name=="FULL") fstage = "wave_";
187 
188  if(cwb_jstage_name==cwb_fstage_name) jstage = CWB_STAGE_FINISH;
189 
190  if(nfactor<=0) nfactor=1; // fix nfactor when nfactor is not defined
191  // get the number of job submit by condor
192  char full_condor_dir[1024];
193  sprintf(full_condor_dir,"%s/%s",work_dir,condor_dir);
194  char condor_dag_file[1024];
195  sprintf(condor_dag_file,"%s/%s%s.dag",full_condor_dir,data_label,"");
196  Long_t id,size=0,flags,mt;
197  int estat = gSystem->GetPathInfo(condor_dag_file,&id,&size,&flags,&mt);
198  vector<int> jobList;
199  if (estat==0) jobList=TB.getCondorJobList(full_condor_dir, data_label);
200  else {
201  cout << endl << "cwb_condor_benchmark.C : error - dag file not exist !!!"
202  << endl << condor_dag_file << endl << endl;
203  if (!online) gSystem->Exit(1);
204  }
205  int ncondor_jobs = jobList.size();
206  int max_jobid=0;
207  for(int i=0;i<ncondor_jobs;i++) if(jobList[i]>max_jobid) max_jobid=jobList[i];
208 
209  // factor label
210  char sfactor[32]="";
211  if(simulation) {
212  double factor=factors[nfactor-1];
213  if(simulation==3) {
214  if(factor<0) sprintf(sfactor,"_n%g_",fabs(factor));
215  if(factor==0) sprintf(sfactor,"_z%g_",factor);
216  if(factor>0) sprintf(sfactor,"_p%g_",factor);
217  } else if(simulation==4) {
218  int ioffset = int(factors[0])<=0 ? 1 : int(factors[0]);
219  //ioffset+=nfactor-1;
220  sprintf(sfactor,"_%i_",ioffset);
221  } else sprintf(sfactor,"_%g_",factor);
222  }
223  char job_label[512];
224  if(fstage=="wave_") sprintf(job_label,"%s%s",data_label,sfactor);
225  else sprintf(job_label,"%s",data_label);
226 
227  cout << "Starting reading output directory ..." << endl;
228  vector<TString> fileList = TB.getFileListFromDir(output_dir,".root",fstage,job_label,true);
229  if (online) fileList = TB.getFileListFromDir(output_dir,".root",fstage,"",true);
230  int nfile = fileList.size();
231  float* jobId = new float[nfile];
232  float* istat = new float[nfile];
233  for(int n=0;n<nfile;n++) {jobId[n]=n;istat[n]=0;}
234  for(int n=0;n<nfile;n++) {
235  //cout << n << " " << fileList[n].Data()<< endl;
236 
237  if (n%100==0) cout << "cwb_condor benchmark - " << n << "/" << fileList.size() << " files" << endl;
238 
239  vector<float> bench = CWB::Toolbox::getJobBenchmark(fileList[n],jstage,
240  cwb_bench_res,cwb_bench_factor,cwb_bench_name);
241  jobId[n]=bench[0];
242  istat[n]=bench[1];
243  }
244 
245  //for(int n=0;n<nfile;n++) {if(istat[n]>0) cout << jobId[n] << " " << istat[n] << endl;}
246 
247  if(cwb_plot_save!="") gROOT->SetBatch(true);
248 
249  canvas = new TCanvas("cwb_condor_benchmark", "LVC experiment", 300,40, 800, 600);
250  canvas->Clear();
251  canvas->ToggleEventStatus();
252  canvas->SetGridx(true);
253  canvas->SetGridy(true);
254  canvas->SetFillColor(kWhite);
255 
256  gStyle->SetTitleH(0.050);
257  gStyle->SetTitleW(0.98);
258  gStyle->SetTitleY(0.98);
259  gStyle->SetTitleFont(72);
260 // gStyle->SetLineColor(kWhite);
261  gStyle->SetTitleFillColor(kWhite);
262  gStyle->SetNumberContours(256);
263  gStyle->SetMarkerStyle(7);
264  gStyle->SetMarkerSize(2);
265  gStyle->SetPalette(1,0);
266 
267  if((cwb_bench_name=="JET")||(cwb_bench_name=="SET")) {
268  for(int n=0;n<nfile;n++) istat[n]/=3600.; // sec -> hour
269  }
270  if(cwb_bench_name=="JFS") {
271  for(int n=0;n<nfile;n++) istat[n]/=(1024.*1024.); // bytes -> MB
272  }
273  if((cwb_bench_name=="THR")&&(cwb_bench_max<=0)) {
274  for(int n=0;n<nfile;n++) if(istat[n]>50) istat[n]=50;
275  }
276 
277  // compute istat min/max
278  double istat_min=100000;
279  double istat_max=0;
280  for(int n=0;n<nfile;n++) {
281  if(istat[n]>0 && istat[n]<istat_min) istat_min=istat[n];
282  if(istat[n]>0 && istat[n]>istat_max) istat_max=istat[n];
283  }
284  if(cwb_bench_max>0) istat_max=cwb_bench_max;
285 
286  //for(int n=0;n<nfile;n++) {if(istat[n]>0) cout << jobId[n] << " " << istat[n] << endl;}
287 
288  TString ptitle;
289  if(cwb_bench_name=="SET") ptitle="SET - Elapsed Time in Stage "+cwb_jstage_name;
290  if(cwb_bench_name=="JET") ptitle="JET - Job Elapsed Time at the end of Stage "+cwb_jstage_name;
291  if(cwb_bench_name=="JFS") ptitle="JFS - Job File Size at the end of Stage "+cwb_jstage_name;
292  if(cwb_bench_name=="MEM") ptitle="MEM - Virtual Memory used at the end of Stage "+cwb_jstage_name;
293  if(cwb_bench_name=="THR") {ptitle=cwb_jstage_name+" - Threshold @ ResolutionID : ";
294  ptitle+=cwb_bench_res;ptitle+=" & FactorID : ";
295  ptitle+=cwb_bench_factor;}
296  if(cwb_bench_name=="GT") {ptitle=cwb_jstage_name+" - Gating Time @ FactorID : ";
297  ptitle+=cwb_bench_factor;}
298  if(cwb_bench_name=="PSIZE") {ptitle=cwb_jstage_name+" - Number of pixels per lag @ ResolutionID : ";
299  ptitle+=cwb_bench_res;ptitle+=" & FactorID : ";
300  ptitle+=cwb_bench_factor;}
301  if(cwb_bench_name=="CSIZE") {ptitle=cwb_jstage_name+" - Number of clusters per lag @ ResolutionID : ";
302  ptitle+=cwb_bench_res;ptitle+=" & FactorID : ";
303  ptitle+=cwb_bench_factor;}
304  TString ytitle;
305  if(cwb_bench_name=="SET") ytitle="hour";
306  if(cwb_bench_name=="JET") ytitle="hour";
307  if(cwb_bench_name=="JFS") ytitle="MB";
308  if(cwb_bench_name=="MEM") ytitle="MB";
309  if(cwb_bench_name=="THR") ytitle="energy";
310  if(cwb_bench_name=="GT") ytitle="sec";
311  if(cwb_bench_name=="PSIZE") ytitle="count";
312  if(cwb_bench_name=="CSIZE") ytitle="count";
313 
314  char ofile_name[1024]="";
315  if(cwb_plot_save!="") {
316  if(cwb_plot_save.EndsWith(".png")) { // user defined file name
317  sprintf(ofile_name,"%s",cwb_plot_save.Data());
318  } else { // user define directory
319  TString extraLabel="";
320  if(cwb_bench_res>=0) {extraLabel+="_RESID_";extraLabel+=cwb_bench_res;}
321  if(cwb_bench_factor>=0) {extraLabel+="_FACTORID_";extraLabel+=cwb_bench_factor;}
322  // file name is provided by macro
323  sprintf(ofile_name,"%s/benchmark_%s_%s_%s_%s%s.png",cwb_plot_save.Data(),data_label,
324  cwb_bench_name.Data(),cwb_jstage_name.Data(),cwb_plot_type.Data(),extraLabel.Data());
325  }
326  }
327 
328  if(cwb_plot_type=="GRAPH") {
329  // sort data
330  float* x = new float[max_jobid+1];
331  float* y = new float[max_jobid+1];
332  for(int n=0;n<=max_jobid;n++) {x[n]=n;y[n]=0;}
333  for(int n=0;n<nfile;n++) {
334  if(istat[n]>0) y[int(jobId[n])]=istat[n];
335  }
336  int N=0;
337  for(int n=0;n<=max_jobid;n++) {
338  if(cwb_bench_name=="GT") {x[N]=x[n];y[N]=y[n];N++;}
339  else if(y[n]>0) {x[N]=x[n];y[N]=y[n];N++;}
340  }
341 
342  gplot = new TGraph(N,x,y);
343  gplot->SetName("benchmark");
344  gplot->SetTitle("graph");
345  gplot->SetLineColor(kRed);
346  gplot->SetMarkerColor(kRed);
347  gplot->Draw("APL");
348  gplot->GetHistogram()->SetXTitle("Job id");
349  gplot->GetHistogram()->SetYTitle(ytitle);
350  gplot->SetTitle(ptitle);
351  if(cwb_plot_save!="") {
352  cout << "cwb_condor_benchmark.C : dump -> " << ofile_name << endl;
353  canvas->Print(ofile_name);
354  exit(0);
355  }
356  }
357 
358  if(cwb_plot_type=="HIST") {
359  if((cwb_bench_name=="THR")||(cwb_bench_name=="PSIZE")||(cwb_bench_name=="CSIZE")||(cwb_bench_name=="GT")) {
360  canvas->SetLogy(true);
361  istat_max+=1;
362  }
363  hplot = new TH1F("benchmark","hist",100,istat_min,istat_max);
364  for(int n=0;n<nfile;n++) {
365  if(cwb_bench_name=="GT") hplot->Fill(istat[n]);
366  else if(istat[n]>0) hplot->Fill(istat[n]);
367  }
368  hplot->Draw("HIST");
369  hplot->SetXTitle(ytitle);
370  hplot->SetYTitle("#counts");
371  hplot->SetTitle(ptitle);
372  hplot->SetLineColor(kRed);
373  hplot->SetFillColor(kRed);
374  hplot->GetYaxis()->SetTitleOffset(1.3);
375  if(cwb_plot_save!="") {
376  cout << "cwb_condor_benchmark.C : dump -> " << ofile_name << endl;
377  canvas->Print(ofile_name);
378  exit(0);
379  }
380  }
381 
382  if(cwb_plot_type=="HIST2") {
383 
384  int NX = sqrt(max_jobid); NX=NX-NX%10; if(NX==0) NX=max_jobid;
385  int NY = max_jobid/NX; if(max_jobid%NX) NY+=1;
386 
387  h2plot = new TH2F("benchmark","hist2",NX,0,NX,NY,0,NX*NY);
388  for(int n=0;n<nfile;n++) {
389  int job = jobId[n]-1;
390  int nx = job%NX;
391  int ny = job;
392  double z = istat[n];
393  if(cwb_bench_max>0) if(istat[n]>cwb_bench_max) z=cwb_bench_max;
394  //cout << job << " " << nx << " " << ny << " " << istat[n] << " " << endl;
395  if(istat[n]) h2plot->Fill(nx,ny,z);
396  }
397  canvas->SetLogz(false);
398  h2plot->Draw("colz");
399  char h2title[256];sprintf(h2title," : condor jobs = %d/%d",nfile,ncondor_jobs);
400  h2plot->SetTitle(ptitle+h2title);
401  h2plot->SetStats(kFALSE);
402  h2plot->SetXTitle("");
403  h2plot->SetYTitle("job#");
404  h2plot->SetZTitle(ytitle);
405  h2plot->SetLineColor(kRed);
406  h2plot->SetFillColor(kRed);
407  h2plot->GetYaxis()->SetTitleOffset(1.3);
408  h2plot->GetZaxis()->SetTitleOffset(0.5);
409  h2plot->GetZaxis()->SetRangeUser(0,int(istat_max)+1);
410  //h2plot->GetZaxis()->SetNdivisions(-309);
411  h2plot->GetYaxis()->CenterTitle(true);
412  h2plot->GetZaxis()->CenterTitle(true);
413  if(cwb_plot_save!="") {
414  cout << "cwb_condor_benchmark.C : dump -> " << ofile_name << endl;
415  canvas->Print(ofile_name);
416  exit(0);
417  }
418  }
419 }
bool online
static vector< TString > getFileListFromDir(TString dir_name, TString endString="", TString beginString="", TString containString="", bool fast=false)
Definition: Toolbox.cc:5108
void cwb_condor_benchmark()
float factor
char condor_dag_file[1024]
int n
Definition: cwb_net.C:28
wavearray< double > z
Definition: Test10.C:32
TString("c")
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
char full_condor_dir[1024]
CWB::Toolbox TB
Long_t flags
Long_t size
#define NSTAGE
i drho i
static bool checkFile(TString fName, bool question=false, TString message="")
Definition: Toolbox.cc:4670
#define N
TCanvas * canvas
static vector< float > getJobBenchmark(TString ifName, int stageID, TString bench)
Definition: Toolbox.cc:1445
char data_label[512]
Definition: test_config1.C:160
int ncondor_jobs
vector< int > jobList
i() int(T_cor *100))
char job_label[512]
TH1F * hplot
static vector< int > getCondorJobList(TString condor_dir, TString label)
Definition: Toolbox.cc:1398
static TString getParameter(TString options, TString param="")
Definition: Toolbox.cc:6727
TH2F * h2plot
cout<< "Starting reading output directory ..."<< endl;vector< TString > fileList
double fabs(const Complex &x)
Definition: numpy.cc:55
int estat
int nfactor
Definition: test_config1.C:83
sprintf(tfres,"(1/%g)x(%g) (sec)x(Hz)", 2 *df, df)
Long_t mt
int jobId
Long_t id
char condor_dir[512]
Definition: test_config1.C:148
char work_dir[512]
Definition: test_config1.C:143
TGraph * gplot
simulation
Definition: cwb_eced.C:26
factors[0]
Definition: cwb_eced.C:27
char output_dir[512]
Definition: test_config1.C:146
wavearray< double > y
Definition: Test10.C:31
CWB_STAGE
Definition: cwb.hh:122
exit(0)