Public Member Functions | Static Public Member Functions | Protected Member Functions
Acquisition Class Reference

Brief description of class still missing. More...

#include <Acquisition.h>

Inheritance diagram for Acquisition:
QGpCoreTools::Thread

List of all members.

Public Member Functions

 Acquisition ()
 Acquisition (double timeScale=1.0)
Histogram apparentResistivityHistogram () const
Histogram currentHistogram () const
const QString & fileName () const
bool read (QString fileName=QString::null)
void setDelay (double d)
bool setSignals (SubSignalPool subPool)
void startStations (QString stationList)
void status ()
void stop ()
void stopStations (QString stationList)
Histogram variabilityHistogram () const
Curve< Point2DvarVoltageCurve () const
Histogram voltageHistogram () const
void write (QTextStream &s, double voltageThreshold, double variabilityThreshold) const
 ~Acquisition ()
 ~Acquisition ()

Static Public Member Functions

static const QDir & destination ()
static bool setDestination (QString destDir)

Protected Member Functions

virtual void run ()

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References TRACE.

{
  TRACE;
  _minimumElectrodeSpacing=1.0;
  _arrayCode=0;
}

Description of destructor still missing

References TRACE.

{
  TRACE;
  qDeleteAll(_measurements);
}
Acquisition::Acquisition ( double  timeScale = 1.0)

Description of constructor still missing

References TRACE.

    : Thread()
{
  TRACE;
  srand(time( NULL) ); // initialize random generator
  _globalTimer=0;
  _timeScale=timeScale;
}

Member Function Documentation

References QGpCoreTools::Histogram::addValue(), QGpCoreTools::LogScale, QGpCoreTools::Histogram::setSampling(), and TRACE.

Referenced by Results::Results().

{
  TRACE;
  Histogram h;
  h.setSampling(200, 0.5, 2000.0, LogScale);
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    h.addValue((*it)->apparentResistivity());
  }
  return h;
}

References QGpCoreTools::Histogram::addValue(), QGpCoreTools::LogScale, QGpCoreTools::Histogram::setSampling(), and TRACE.

Referenced by Results::Results().

{
  TRACE;
  Histogram h;
  h.setSampling(200, 0.05, 1000.0, LogScale);
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    h.addValue((*it)->current());
  }
  return h;
}
static const QDir& Acquisition::destination ( ) [inline, static]
{return _destDir;}
const QString& Acquisition::fileName ( ) const [inline]

Referenced by read(), and Results::Results().

{return _fileName;}
bool Acquisition::read ( QString  fileName = QString::null)

References HeaderMap::count(), QGpCoreTools::LineParser::count(), fileName(), HeaderMap::isOk(), HeaderMap::map(), HeaderMap::maximumCount(), HeaderMap::missingFields(), MSG_ID, Measurement::set(), QGpCoreTools::LineParser::setDelimiters(), QGpCoreTools::LineParser::setSkipEmpty(), QGpCoreTools::LineParser::setString(), QGpCoreTools::tr(), and TRACE.

Referenced by main().

{
  TRACE;
  if(fileName.isEmpty()) {
    fileName=Message::getOpenFileName(tr("Open ABEM output file"),
                                      tr("ABEM output file (*.txt)"));
    if(fileName.isEmpty()) {
      return false;
    }
  }
  _fileName=fileName;
  QFile f(fileName);
  if(!f.open(QIODevice::ReadOnly)) {
    Message::warning(MSG_ID, tr("Open ABEM output file"),
                     tr("Cannot open file %1").arg(fileName), Message::cancel());
    return false;
  }
  QTextStream s(&f);
  LineParser parser;
  parser.setDelimiters("\t");
  parser.setSkipEmpty(false);
  int lineNumber=1;
  HeaderMap header;
  while(!s.atEnd()) {
    QString line=s.readLine();
    parser.setString(line);
    if(parser.count()>=HeaderMap::maximumCount() &&
       header.map(parser) &&
       header.count()>=12) { // Matched at least A(x), B(x),...
        break;
    } else if(!line.isEmpty()) {
      switch(line.at(0).unicode()) {
      case 'A':
        if(line.startsWith("ArrayCode:")) {
          _arrayCode=line.section(":", 1,1).trimmed().toInt();
        }
      case 'P':
        if(line.startsWith("Project name:")) {
          _projectName=line.section(":", 1,1).trimmed();
        }
      case 'T':
        if(line.startsWith("Task Name:")) {
          _taskName=line.section(":", 1,1).trimmed();
        }
      case 'S':
        if(line.startsWith("Smallest electrode spacing:")) {
          _minimumElectrodeSpacing=line.section(":", 1,1).trimmed().toDouble();
        }
      }
    }
    lineNumber++;
  }
  if(!header.isOk()) {
    Message::warning(MSG_ID, tr("Open ABEM output file"),
                     tr("Cannot find header line or this(these) fields is(are) missing:\n"
                        "[header line identified at line %1]\n"
                        "%2")
                     .arg(lineNumber).arg(header.missingFields()), Message::cancel());
    return false;
  }
  int columnCount=parser.count();
  lineNumber++;
  while(!s.atEnd()) {
    QString line=s.readLine();
    parser.setString(line);
    if(parser.count()!=columnCount) {
      break;
    }
    Measurement * m=new Measurement;
    if(m->set(parser, header, lineNumber)) {
      _measurements.append(m);
    } else {
      delete m;
      return false;
    }
    lineNumber++;
  }
  Message::information(MSG_ID, tr("Open ABEM output file"),
                       tr("Read %1 measurements").arg(_measurements.count()), Message::ok());
  return true;
}
void Acquisition::run ( ) [protected, virtual]

References GeopsyCore::TimeRange::lengthSeconds(), and TRACE.

{
  TRACE;
  mainLoop();
  _globalTimer=new QTimer;
  _globalTimer->setSingleShot(false);
  connect(_globalTimer, SIGNAL(timeout()), this, SLOT(mainLoop()), Qt::DirectConnection);
  _globalTimer->start((int)ceil(( _globalTimeWindow.lengthSeconds() + 2*_delay) * 1000.0/_timeScale) );

  QThread::exec();
}
void Acquisition::setDelay ( double  d) [inline]

Referenced by main().

{_delay=fabs(d);}
bool Acquisition::setDestination ( QString  destDir) [static]

References TRACE.

Referenced by main().

{
  TRACE;
  _destDir.setPath(destDir);
  if(_destDir.exists()) {
    QStringList filters;
    filters.append("*.mseed");
    QStringList files=_destDir.entryList(filters);
    for(QStringList::iterator it=files.begin();it!=files.end();it++) {
      _destDir.remove( *it);
    }
    return true;
  } else {
    return false;
  }
}

References GeopsyCore::StationList::addSignals(), QGpCoreTools::endl(), GeopsyCore::StationList::hasAllComponents(), ArrayCore::ArrayStations::hasCompatibleStations(), QGpCoreTools::log(), GeopsyCore::TimeRange::setEnd(), GeopsyCore::TimeRange::setStart(), AcquisitionSignals::setT0(), GeopsyCore::TimeRange::start(), QGpCoreTools::tr(), and TRACE.

Referenced by main().

{
  TRACE;
  QString log;
  if( !_array.addSignals(&subPool , &log) ||
       !_array.hasAllComponents(&log) ||
       !_array.hasCompatibleStations(&log) ) {
    App::stream() << log << endl;
    return false;
  }
  if(_array.count()<2) {
    App::stream() << tr("Creating array: found less than 2 stations." ) << endl;
    return false;
  }
  log += tr( "Found %1 different stations\n" ).arg(_array.count());
  App::stream() << log << endl;
  int n=_array.count();
  for(int i=0;i<n;i++) {
    AcquisitionSignals * stat=new AcquisitionSignals(_array.at(i), _timeScale);
    _stations.append(stat);
  }
  // Set available signals for each station
  double globalMinTime=1e99;
  double globalMaxTime=-1e99;
  /*WindowingParameters param;
  param.setNComponents(_array.nComponents());
  param.setNStations(_array.count());
  param.rawSignal.doIt=false;
  param.filtSignal.doIt=false;
  param.percClip=100;*/
  for(int i=0;i<n;i++) {
    double t1, t2;
    t1=_array.at(i)->minTime();
    if(t1<globalMinTime) globalMinTime=t1;
    t2=_array.at(i)->maxTime();
    if(t2>globalMaxTime) globalMaxTime=t2;
    AcquisitionSignals * stat=_stations.at(i);
    /*TimeRange tw(t1, t2);
    AcquisitionSignals * stat=_stations.at(i);
    //SparseTimeRange stat->originalSignals()->timeRange(tw) const;
    //stat->setRange(tw);
    //stat->setKeep(param,i);
    stat->setProcessed(tw, 0);*/
    stat->setT0(t1);
  }
  _globalTimeWindow.setStart(globalMinTime);
  _globalTimeWindow.setEnd(globalMaxTime);
  for(int i=0;i<n;i++) {
    _stations.at(i)->setGlobalT0(_globalTimeWindow.start());
  }
  return true;
}
void Acquisition::startStations ( QString  stationList)

References GeopsyCore::StationSignals::name(), GeopsyCore::StationProcessSignals::originalSignals(), AcquisitionSignals::setOn(), and TRACE.

Referenced by main().

{
  TRACE;
  QStringList stations=stationList.split(",", QString::SkipEmptyParts);
  bool all=stationList=="all";
  int n=_array.count();
  for(QStringList::iterator it=stations.begin();it!=stations.end();it++) {
    for(int i=0;i<n;i++) {
      AcquisitionSignals * s=_stations.at(i);
      if(all || s->originalSignals()->name()==*it) {
        s->setOn(true);
      }
    }
  }
}

References TRACE.

Referenced by main().

{
  TRACE;
  int n=_array.count();
  for(int i=0;i<n;i++) {
    printf("%-20s:",_array.at(i)->name().toAscii().data());
    printf(" %6s",_stations.at(i)->isOn() ? "on" : "off");
    printf(" %6s",_stations.at(i)->isActive() ? "active" : "idle");
    printf("\n");
  }
}

References QGpCoreTools::Thread::sleep(), and TRACE.

Referenced by main().

{
  TRACE;
  _globalTimer->stop();
  int n=_array.count();
  for(int i=0;i<n;i++) {
    _stations.at(i)->stop();
  }
  exit();
  while(isRunning()) {
    CoreApplication::sleep(500);
    QCoreApplication::processEvents();
  }
}
void Acquisition::stopStations ( QString  stationList)

References GeopsyCore::StationSignals::name(), GeopsyCore::StationProcessSignals::originalSignals(), AcquisitionSignals::setOn(), and TRACE.

Referenced by main().

{
  TRACE;
  QStringList stations=stationList.split(",", QString::SkipEmptyParts);
  bool all=stationList=="all";
  int n=_array.count();
  for(QStringList::iterator it=stations.begin();it!=stations.end();it++) {
    for(int i=0;i<n;i++) {
      AcquisitionSignals * s=_stations.at(i);
      if(all || s->originalSignals()->name()==*it) {
        s->setOn(false);
      }
    }
  }
}

References QGpCoreTools::Histogram::addValue(), QGpCoreTools::LogScale, QGpCoreTools::Histogram::setSampling(), and TRACE.

Referenced by Results::Results().

{
  TRACE;
  Histogram h;
  h.setSampling(200, 0.05, 2000.0, LogScale);
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    h.addValue((*it)->variability());
  }
  return h;
}

References QGpCoreTools::Curve< pointType >::append(), TRACE, Measurement::variability(), and Measurement::voltage().

Referenced by Results::Results().

{
  TRACE;
  Curve<Point2D> c;
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    const Measurement& m=**it;
    c.append(Point2D(1e3*m.voltage(), m.variability()));
  }
  return c;
}

References QGpCoreTools::Histogram::addValue(), QGpCoreTools::LogScale, QGpCoreTools::Histogram::setSampling(), and TRACE.

Referenced by Results::Results().

{
  TRACE;
  Histogram h;
  h.setSampling(200, 0.005, 20000.0, LogScale);
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    h.addValue(1e3*(*it)->voltage());
  }
  return h;
}
void Acquisition::write ( QTextStream &  s,
double  voltageThreshold,
double  variabilityThreshold 
) const

References Measurement::a(), Measurement::b(), Measurement::m(), Measurement::n(), Measurement::resistance(), TRACE, Measurement::variability(), Measurement::voltage(), QGpCoreTools::Point2D::x(), and QGpCoreTools::Point::z().

Referenced by Results::exportDAT().

{
  TRACE;
  // Count good measurements
  int n=0;
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    const Measurement& m=**it;
    if(m.voltage()>=voltageThreshold &&
      m.variability()<=variabilityThreshold) {
      n++;
    }
  }
  s << _projectName << "_" << _taskName << "\n"
    << _minimumElectrodeSpacing << "\n"
       "11\n"
    << _arrayCode << "\n"
       "Type of measurement (0=app.resistivity,1=resistance)\n"
       "1\n"
    << n << "\n"
    << "2\n"
       "0\n";
  for(QList<Measurement *>::const_iterator it=_measurements.begin(); it!=_measurements.end(); it++) {
    const Measurement& m=**it;
    if(m.voltage()>=voltageThreshold &&
      m.variability()<=variabilityThreshold) {
      s << "4 " << m.a().x() << " " << m.a().z() << " "
                << m.b().x() << " " << m.b().z() << " "
                << m.m().x() << " " << m.m().z() << " "
                << m.n().x() << " " << m.n().z() << " "
                << m.resistance() << "\n";
    }
  }
  s << "0\n0\n0\n0\n";
}

The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines