Waveform filter programs

◆ main()

int main ( int  iargc,
char *  argv[] 
)

key to select traces

key to select file format

list of keys for filename specific parameters

select traces

set file format

Definition at line 142 of file sigfit.cc.

References Options::ampoffset, Options::amptrend, Options::debug, Options::doskip, Options::equalsearch, Options::fitexp, Options::fitoffset, Options::fittrend, formatfloat(), formatkey, Options::itype, keys, Options::otype, Options::residualname, Options::searchrange, SIGFIT_VERSION, Options::skip, Options::tcexp, Options::Tdate, tracekey, Options::truncate, Options::usesearchrange, Options::verbose, and Options::writeresidual.

143 {
144 
145  // define usage information
146  char usage_text[]=
147  {
148  SIGFIT_VERSION "\n"
149  "usage: sigfit [-v] [-DEBUG] [-Tdate v] [-truncate]" "\n"
150  " [-Sramp[=v]] [-Sconst[=v]] [-Sexp[=v]]" "\n"
151  " [-residual f]" "\n"
152  " [-searchrange[=r]] [-equalsearch] [-skip n]" "\n"
153  " [-itype F] [-otype F]" "\n"
154  " signal [t:T f:F] trial [t:T f:F] [trial [t:T f:F]...]" "\n"
155  " or: sigfit --help|-h" "\n"
156  };
157 
158  // define full help text
159  char help_text[]=
160  {
161  "-v be verbose" "\n"
162  "-Sramp[=v] add a ramp to the set of trial signals with amplitude v" "\n"
163  "-Sconst[=v] add a constant (of value v) to the set of trial signals" "\n"
164  "-Sexp[=v] add a exponential decay (with time constant v relative" "\n"
165  " to the length of the time series) to the set of trial" "\n"
166  " signals" "\n"
167  "-Tdate v tolerance for comparison of date of first sample" "\n"
168  " v give the tolerance in units of the sampling interval" "\n"
169  "-truncate truncate all series to the same number of samples" "\n"
170  "-residual f write waveforms containing residual to file \"f\"" "\n"
171  "-searchrange[=r] set search range to stabilize the fit in cases" "\n"
172  " where a trial series does not (or almost not)" "\n"
173  " contribute to the signal" "\n"
174  " the search range r is given in units of" "\n"
175  " rms(signal)/rms(trial signals)" "\n"
176  "-equalsearch use same search range for each trial signal" "\n"
177  "-skip n skip n seconds at beginning of each trace" "\n"
178  "-itype F set input file formats to F (default: sff)" "\n"
179  "-otype F set output (residual) file format to F (default: sff)" "\n"
180  "\n"
181  "signal signal to by explained by a linear combination" "\n"
182  " of trial signals" "\n"
183  "trial any set of trial signals" "\n"
184  "\n"
185  "File specific options:" "\n"
186  "t:T select specific traces from input file" "\n"
187  " T can be a list of traces like '1,4,5' or" "\n"
188  " a range like '6-19' or mixed like '5,8,12-17,20'" "\n"
189  "f:F specific file format (overrides -itype setting)" "\n"
190  "\n"
191  "The last line of the output is a summary of all results." "\n"
192  "This line contains the following information separated by blanks:" "\n"
193  " channel station instrument julian_day date time" "\n"
194  " explained_rms signal_rms residual_rms" "\n"
195  " for each trial signal: regression_coefficient" "\n"
196  " rms_of_all_coefficients" "\n"
197  " for each trial signal: normalized_regression_coefficient" "\n"
198  " for each trial signal: regression_coefficient*trial_signal_rms" "\n"
199  " for each trial signal:" "\n"
200  " normalized_scalar_product_between_trial_signal_and_signal" "\n"
201  "\n"
202  "The output file (residual argument on the command line) will contain\n"
203  "several traces (N test signals including DC offset and linear trend):\n"
204  " trace #1 signal, channel name as in input file\n"
205  " trace #2 \"syn\", synthetic trace, superposition of all\n"
206  " test signals\n"
207  " trace #3 \"dif\", residual dif=signal-syn\n"
208  " traces #4 - #4+N-1 raw test signals\n"
209  " traces #4+N - #4+2N-1 scaled test signals in units of the final\n"
210  " displaying their contribution to \"syn\"\n"
211  " trace #4+2N \"csi\": csi=signal-cor\n"
212  " trace #4+2N+1 \"cys\": csy=syn-cor\n"
213  " trace #4+2N+2 \"cor\" internal corretion, i.e. the\n"
214  " contributions of the DC offset and the linear\n"
215  " trend to \"syn\"\n"
216  };
217 
218  // define commandline options
219  using namespace tfxx::cmdline;
220  static Declare options[]=
221  {
222  // 0: print help
223  {"help",arg_no,"-"},
224  // 1: verbose mode
225  {"v",arg_no,"-"},
226  // 2: date tolerance
227  {"Tdate",arg_yes,"0."},
228  // 3: truncate to a common number of samples
229  {"truncate",arg_no,"-"},
230  // 4: output SFF file
231  {"residual",arg_yes,"-"},
232  // 5: search range
233  {"searchrange",arg_opt,"100."},
234  // 6: equal search ranges
235  {"equalsearch",arg_no,"-"},
236  // 7: fit a trend
237  {"Sramp",arg_opt,"1."},
238  // 8: fit an offset
239  {"Sconst",arg_opt,"1."},
240  // 9: fit an offset
241  {"skip",arg_yes,"0"},
242  // 10: fit an offset
243  {"Sexp",arg_opt,"1."},
244  // 11: input file format
245  {"itype",arg_yes,"sff"},
246  // 12: output file format
247  {"otype",arg_yes,"sff"},
248  // 13: produce debug output
249  {"DEBUG",arg_no,"-"},
250  {NULL}
251  };
252 
254  const char* const tracekey="t";
256  const char* const formatkey="f";
258  static const char* keys[]={
260  tracekey,
262  formatkey,
263  0
264  }; // const char* keys[]
265 
266  // no arguments? print usage...
267  if (iargc<2)
268  {
269  cerr << usage_text << endl;
270  cerr << tfxx::seitosh::repository_reference << endl;
271  exit(0);
272  }
273 
274  // collect options from commandline
275  Commandline cmdline(iargc, argv, options);
276 
277  // help requested? print full help text...
278  if (cmdline.optset(0))
279  {
280  cout << usage_text << endl;
281  cout << help_text << endl;
282  cerr << tfxx::seitosh::repository_reference << endl;
283  exit(0);
284  }
285 
286  // read options
287  Options opt;
288  opt.verbose=cmdline.optset(1);
289  opt.Tdate=cmdline.double_arg(2);
290  opt.truncate=cmdline.optset(3);
291  opt.writeresidual=cmdline.optset(4);
292  opt.residualname=cmdline.string_arg(4);
293  opt.usesearchrange=cmdline.optset(5);
294  opt.searchrange=cmdline.double_arg(5);
295  opt.equalsearch=cmdline.optset(6);
296  opt.fittrend=cmdline.optset(7);
297  opt.fitoffset=cmdline.optset(8);
298  opt.amptrend=cmdline.double_arg(7);
299  opt.ampoffset=cmdline.double_arg(8);
300  opt.skip=cmdline.double_arg(9);
301  opt.doskip=cmdline.optset(9);
302  opt.fitexp=cmdline.optset(10);
303  opt.tcexp=cmdline.double_arg(10);
304  opt.itype=cmdline.string_arg(11);
305  opt.otype=cmdline.string_arg(12);
306  opt.debug=cmdline.optset(13);
307 
308  /*----------------------------------------------------------------------*/
309 
310  // read file names
311  TFXX_assert(cmdline.extra(),"ERROR: missing signal file name!");
312  //std::string signalname=cmdline.next();
313  tfxx::cmdline::Tparsed infiles(tfxx::cmdline::parse_cmdline(cmdline, keys));
314  //TFXX_assert((cmdline.extra()||opt.fittrend||opt.fitoffset),
315  // "ERROR: missing trial signal file name!");
316  //Tnamelist namelist;
317  //while (cmdline.extra()) { namelist.push_back(cmdline.next()); }
318 
319  // read signal file
320  tfxx::cmdline::Tparsed::const_iterator infile(infiles.begin());
321  TFXX_assert((infile!=infiles.end()||opt.fittrend||opt.fitoffset),
322  "ERROR (sigfit): missing trial signal file name");
323  std::string tracelist("1");
324  if (infile->haskey(tracekey)) { tracelist=infile->value(tracekey); }
325  tfxx::RangeListStepper<int> rls(tfxx::string::rangelist<int>(tracelist));
326  TFXX_assert(rls.valid(), "Illegal tracelist");
327  std::string signalname(infile->name);
328  int signaltrace = rls.current();
329  std::string signalformat(opt.itype);
330  if (infile->haskey(formatkey)) { signalformat=infile->value(formatkey); }
331 
332  Tbundle signal;
333  sff::FREE signalfilefree, signaltracefree;
334  bool hasSignalFileFree;
335  {
336  if (opt.verbose)
337  {
338  cout << "sigfit: open signal file " << signalname << " of format "
339  << signalformat << endl;
340  }
341  std::ifstream ifs(signalname.c_str(),
342  datrw::ianystream::openmode(signalformat));
343  datrw::ianystream is(ifs, signalformat);
344  if (is.hasfree())
345  {
346  is >> signalfilefree;
347  hasSignalFileFree = true;
348  }
349  int itrace=1;
350  while (itrace!=signaltrace) { is.skipseries(); ++itrace; }
351  TFXX_assert(is.good(), "Illegal trace for signal input");
352  if (opt.verbose) { cout << "read trace" << endl; }
353  is >> signal;
354  is >> signal.header;
355  if (is.hasfree()) { is >> signaltracefree; }
356  }
357  ++infile;
358 
359  // read trial files
360  Tbundlevec bundlevec;
361  while (infile != infiles.end())
362  {
363  std::string itype(opt.itype);
364  if (infile->haskey(formatkey)) { itype=infile->value(formatkey); }
365  if (opt.verbose)
366  {
367  cout << "sigfit: Open trial signal file " << infile->name
368  << " of format " << itype << endl;
369  }
370 
371  std::ifstream ifs(infile->name.c_str(),
372  datrw::ianystream::openmode(itype));
373  datrw::ianystream is(ifs, itype);
374 
375  bool selectedTraces=infile->haskey(tracekey);
376  tfxx::RangeList<int> rangeList;
377  if (selectedTraces)
378  {
379  rangeList = tfxx::string::rangelist<int>(infile->value(tracekey));
380  }
381  int traceNum = 1;
382  while (is.good())
383  {
384  Tbundle bundle;
385  bool readthistrace=true;
386  if (selectedTraces) { readthistrace=rangeList.contains(traceNum); }
387  if (readthistrace)
388  {
389  if (opt.verbose)
390  {
391  cout << "sigfit: Reading trace #" << traceNum << " ..." << endl;
392  }
393  is >> bundle;
394  is >> bundle.header;
395  bundlevec.push_back(bundle);
396  if (opt.verbose)
397  {
398  cout << " " << bundle.header.line().substr(0,69) << endl;
399  }
400  }
401  else
402  {
403  is.skipseries();
404  }
405  ++traceNum;
406  }
407  ++infile;
408  }
409 
410  unsigned int ntracesread=bundlevec.size();
411 
412  // add synthetic trial files
413  if (opt.fitoffset)
414  {
415  if (opt.verbose) { cout << "add offset to trial signals" << endl; }
416  Tbundle synsignal;
417  synsignal.header=signal.header;
418  synsignal=Tseries(signal.shape());
419  synsignal=opt.ampoffset;
420  synsignal.header.station="NSP";
421  synsignal.header.channel="off";
422  synsignal.header.auxid="NSP";
423  synsignal.header.instype="NSP";
424  bundlevec.push_back(synsignal);
425  }
426 
427  if (opt.fittrend)
428  {
429  if (opt.verbose) { cout << "add trend to trial signals" << endl; }
430  Tbundle synsignal;
431  synsignal.header=signal.header;
432  synsignal=Tseries(signal.shape());
433  for (int i=synsignal.first(); i<=synsignal.last(); ++i)
434  {
435  synsignal(i)=2.*opt.amptrend*
436  (i-(0.5*(synsignal.first()+synsignal.last())))/
437  synsignal.size();
438  }
439  synsignal.header.station="NSP";
440  synsignal.header.channel="ramp";
441  synsignal.header.auxid="NSP";
442  synsignal.header.instype="NSP";
443  bundlevec.push_back(synsignal);
444  }
445 
446  if (opt.fitexp)
447  {
448  if (opt.verbose)
449  {
450  cout << "add exponential decay to trial signals" << endl;
451  }
452  Tbundle synsignal;
453  synsignal.header=signal.header;
454  synsignal=Tseries(signal.shape());
455  for (int i=synsignal.first(); i<=synsignal.last(); ++i)
456  {
457  double argval=-1.*double(i-synsignal.first())/
458  (double(synsignal.size())*opt.tcexp);
459  synsignal(i)=std::exp(argval);
460  }
461  synsignal.header.station="NSP";
462  synsignal.header.channel="exp";
463  synsignal.header.auxid="NSP";
464  synsignal.header.instype="NSP";
465  bundlevec.push_back(synsignal);
466  }
467 
468  /*----------------------------------------------------------------------*/
469 
470  // truncate length if requested
471  if (opt.truncate)
472  {
473  if (opt.verbose) { cout << "truncate signals if necessary..." << endl; }
474  long int n=signal.last();
475  for (Tbundlevec::const_iterator i=bundlevec.begin();
476  i!=bundlevec.end(); i++)
477  { n=n<i->last() ? n : i->last(); }
478  if (signal.last()>n)
479  {
480  signal.setlastindex(n);
481  signal.header.nsamples=signal.size();
482  if (opt.verbose) { cout << "truncate signal to "
483  << signal.header.nsamples << " samples" << endl; }
484  }
485  for (Tbundlevec::iterator i=bundlevec.begin();
486  i!=bundlevec.end(); i++)
487  {
488  if (i->last()>n)
489  {
490  i->setlastindex(n);
491  i->header.nsamples=signal.size();
492  if (opt.verbose) { cout << "truncate trial signal" << endl
493  << i->header.line() << endl; }
494  }
495  }
496  }
497 
498  /*----------------------------------------------------------------------*/
499 
500  // check header consistency
501  sff::WID2compare compare(sff::Fnsamples | sff::Fdt | sff::Fdate);
502  compare.setdatetolerance(opt.Tdate);
503  if (opt.verbose) { cout << "checking consistency..." << endl; }
504  for (Tbundlevec::const_iterator i=bundlevec.begin(); i!=bundlevec.end(); i++)
505  {
506  if (!compare (i->header,signal.header))
507  {
508  cerr << "ERROR: header signature mismatch:" << endl;
509  cerr << "signal:" << endl;
510  cerr << signal.header.line();
511  cerr << "trial signal:" << endl;
512  cerr << i->header.line();
513  TFXX_abort("baling out...");
514  }
515  }
516 
517  /*----------------------------------------------------------------------*/
518 
519  // skip samples if requested
520  if (opt.doskip)
521  {
522  if (opt.verbose)
523  {
524  cout << "skip " << opt.skip << " seconds" << endl;
525  }
526  int nskip=int(floor(opt.skip/signal.header.dt));
527  if (nskip>0)
528  {
529  libtime::TRelativeTime add=nskip*libtime::double2time(signal.header.dt);
530  signal.setfirstindex(signal.first()+nskip);
531  signal.header.date+=add;
532  for (Tbundlevec::iterator i=bundlevec.begin();
533  i!=bundlevec.end(); i++)
534  {
535  i->setfirstindex(i->first() + nskip);
536  i->header.date += add;
537  }
538  if (opt.verbose)
539  {
540  cout << "skipped " << nskip << " samples ("
541  << add.timestring() << ")" << endl;
542  }
543  }
544  else
545  {
546  if (opt.verbose)
547  {
548  cout << "NOTICE: nothing to skip..." << endl;
549  cout << " seems like "
550  << opt.skip << " seconds to skip < "
551  << signal.header.dt << " seconds sampling interval" << endl;
552  }
553  }
554  }
555 
556  /*----------------------------------------------------------------------*/
557  double signalrms=ts::rms(signal);
558 
559  // set up system of linear equations
560  if (opt.verbose) { cout << "set up system of linear equations..." << endl; }
561  int N=bundlevec.size();
562  if (opt.verbose) { cout << "system is of size " << N << "x" << N << endl; }
563  Tmatrix Matrix(N,N), rhs(N), coeff(N), normproduct(N), trialrms(N);
564  double fulltrialrms=0.;
565  for (int i=1; i<=N; ++i)
566  {
567  for (int k=i; k<=N; ++k)
568  {
569  Matrix(i,k)=ts::innerproduct(bundlevec[i-1], bundlevec[k-1]);
570  Matrix(k,i)=Matrix(i,k);
571  }
572  rhs(i)=ts::innerproduct(bundlevec[i-1], signal);
573  trialrms(i)=ts::rms(bundlevec[i-1]);
574  fulltrialrms+=(trialrms(i)*trialrms(i));
575  normproduct(i)=rhs(i)/(signalrms*trialrms(i)*signal.size());
576  }
577  fulltrialrms=sqrt(fulltrialrms/double(N));
578 
579  // add stabilization
580  if (opt.usesearchrange)
581  {
582  if (opt.verbose)
583  {
584  cout << "stabilize fit:" << endl;
585  cout << " relative search range: " << opt.searchrange << endl;
586  }
587  double searchfac=signal.size()*signalrms;
588  for (int i=1; i<=N; ++i)
589  {
590  double range;
591  if (opt.equalsearch)
592  { range=opt.searchrange*signalrms/fulltrialrms; }
593  else
594  { range=opt.searchrange*signalrms/trialrms(i); }
595  if (opt.verbose)
596  {
597  cout << " search range for trial series " << i
598  << " is " << range << endl;
599  }
600  Matrix(i,i)+=pow((searchfac/range),2);
601  }
602  }
603 
604  // solve
605  coeff=linear::lapack::dposv(Matrix,rhs);
606 
607  // set up synthetics
608  Tbundle synthetics;
609  synthetics=Tseries(signal.shape());
610  synthetics=0.;
611  for (int i=1; i<=N; ++i)
612  { synthetics += coeff(i) * bundlevec[i-1]; }
613  synthetics.header=signal.header;
614  synthetics.header.channel="synt";
615 
616  // set up correction
617  Tbundle correction;
618  correction=Tseries(signal.shape());
619  correction=0.;
620  if (ntracesread<bundlevec.size())
621  {
622  for (int i=ntracesread; i<N; ++i)
623  { correction += coeff(i+1) * bundlevec[i]; }
624  }
625  correction.header=signal.header;
626  correction.header.channel="corr";
627  Tbundle corrsignal;
628  corrsignal.header=signal.header;
629  corrsignal.header.channel="csig";
630  corrsignal=signal-correction;
631  Tbundle corrsynthetics;
632  corrsynthetics.header=signal.header;
633  corrsynthetics.header.channel="csyn";
634  corrsynthetics=synthetics-correction;
635 
636  // set up residual
637  Tbundle residual;
638  residual=Tseries(signal.shape());
639  residual=signal-synthetics;
640  residual.header=signal.header;
641  residual.header.channel="diff";
642 
643  // write waveforms
644  if (opt.writeresidual)
645  {
646  if (opt.verbose)
647  {
648  cout << "write residual waveform to " << opt.residualname
649  << " in format " << opt.otype << endl;
650  }
651  std::ofstream ofs(opt.residualname.c_str(),
652  datrw::oanystream::openmode(opt.otype));
653  datrw::oanystream os(ofs, opt.otype, opt.debug);
654  if (os.handlesfilefree())
655  {
656  sff::FREE residualFileFree;
657  residualFileFree.append(SIGFIT_VERSION);
658  if (hasSignalFileFree)
659  {
660  residualFileFree.append("Signal file free block:");
661  residualFileFree.append(signalfilefree);
662  }
663  os << residualFileFree;
664  }
665  TFXX_debug(opt.debug, "main()", "write trace signal\n " <<
666  TFXX_value(signal.header.channel) << "\n " <<
667  TFXX_value(signal.header.date.timestring()));
668  os << signal;
669  TFXX_debug(opt.debug, "main()", "write trace synthetics\n " <<
670  TFXX_value(synthetics.header.channel) << "\n " <<
671  TFXX_value(synthetics.header.date.timestring()));
672  os << synthetics;
673  TFXX_debug(opt.debug, "main()", "write trace residual\n " <<
674  TFXX_value(residual.header.channel) << "\n " <<
675  TFXX_value(residual.header.date.timestring()));
676  os << residual;
677  for (Tbundlevec::const_iterator i=bundlevec.begin();
678  i!=bundlevec.end(); i++)
679  { os << i->header; os << *i; }
680  for (int i=1; i<=N; ++i)
681  {
682  Tbundle psyn=bundlevec[i-1];
683  psyn=bundlevec[i-1];
684  psyn *= coeff(i);
685  char chan[6];
686  std::sprintf(chan,"s%1.1d", i);
687  psyn.header.channel=std::string(chan);
688  os << psyn.header;
689  os << psyn;
690  }
691  os << corrsignal;
692  os << corrsynthetics;
693  os << correction;
694  }
695 
696  // calculate rms values
697  double residualrms=ts::rms(residual);
698  double explained=1.-(residualrms/signalrms);
699 
700  // calculate direction cosines
701  Tmatrix normcoeff(N);
702  double length=0.;
703  for (int i=1; i<=N; ++i)
704  { length += coeff(i)*coeff(i); }
705  length=sqrt(length);
706  for (int i=1; i<=N; ++i)
707  { normcoeff(i) = coeff(i)/length; }
708 
709  std::string timestring(signal.header.date.timestring());
710  cout << " time: " << timestring.substr(4,21) << endl;
711  cout << " channel: " << signal.header.channel << endl;
712  cout << " station: " << signal.header.station << endl;
713  cout << " instrument: " << signal.header.instype << endl;
714  cout << " signalrms: " << signalrms << endl;
715  cout << " residualrms: " << residualrms << endl;
716  cout << "explained rms: " << explained << endl;
717  cout << " coefficients: ";
718  for (int i=1; i<=N; ++i)
719  { cout << coeff(i) << " "; }
720  cout << endl;
721  cout << " rms coeffic.: " << length << endl;
722  cout << " normalized coefficients: ";
723  for (int i=1; i<=N; ++i)
724  { cout << normcoeff(i) << " "; }
725  cout << endl;
726  cout << " coefficients x rms: ";
727  for (int i=1; i<=N; ++i)
728  {
729  cout << coeff(i)*trialrms(i) << " ";
730  }
731  cout << endl;
732  cout << " normalized scalar product: ";
733  for (int i=1; i<=N; ++i)
734  {
735  cout << normproduct(i) << " ";
736  }
737  cout << endl;
738 
739  // reportline
740  cout << signal.header.station << " "
741  << signal.header.channel << " "
742  << signal.header.instype << " "
743  << timestring << " ";
744  cout << formatfloat(explained);
745  cout << formatfloat(signalrms);
746  cout << formatfloat(residualrms);
747  for (int i=1; i<=N; ++i)
748  {
749  cout << formatfloat(coeff(i));
750  }
751  cout << formatfloat(length);
752  for (int i=1; i<=N; ++i)
753  {
754  cout << formatfloat(normcoeff(i));
755  }
756  for (int i=1; i<=N; ++i)
757  {
758  cout << formatfloat(coeff(i)*trialrms(i));
759  }
760  for (int i=1; i<=N; ++i)
761  {
762  cout << formatfloat(normproduct(i));
763  }
764  cout << endl;
765 }
double tcexp
Definition: sigfit.cc:97
double Tdate
Definition: sigfit.cc:89
bool fitoffset
Definition: sigfit.cc:96
std::string residualname
Definition: sigfit.cc:91
std::vector< Tbundle > Tbundlevec
Definition: sigfit.cc:79
double amptrend
Definition: sigfit.cc:97
bool truncate
Definition: sigfit.cc:90
bool equalsearch
Definition: sigfit.cc:95
aff::Array< Tbundle::Tseries::Tvalue > Tmatrix
Definition: sigfit.cc:80
static const char formatkey[]
Definition: fidasexx.cc:128
bool fittrend
Definition: sigfit.cc:96
const char * keys[]
list of keys for filename specific parameters
Definition: deconv.cc:70
#define SIGFIT_VERSION
Definition: sigfit.cc:50
double skip
Definition: sigfit.cc:97
bool debug
Definition: autocorr.cc:61
datrw::Tdseries Tseries
Definition: sigfit.cc:78
bool writeresidual
Definition: sigfit.cc:92
double searchrange
Definition: sigfit.cc:93
double ampoffset
Definition: sigfit.cc:97
bool verbose
Definition: autocorr.cc:61
bool usesearchrange
Definition: sigfit.cc:94
std::string formatfloat(const double &v)
Definition: sigfit.cc:132
std::string itype
Definition: sigfit.cc:98
std::string otype
Definition: sigfit.cc:98
const char *const tracekey
key to select traces
Definition: deconv.cc:68
bool doskip
Definition: sigfit.cc:96
bool fitexp
Definition: sigfit.cc:96
ts::TDsfftimeseries Tbundle
Definition: sigfit.cc:77
Here is the call graph for this function: