Signals | Public Member Functions | Friends
RealTimeArrayManager Class Reference

Brief description of class still missing. More...

#include <RealTimeArrayManager.h>

List of all members.

Signals

void queueChanged (int size)
void queueChanged (int size)

Public Member Functions

void createTasks ()
void createTasks ()
IrregularGrid2D fkDispersion () const
IrregularGrid2D fkDispersion () const
IrregularGrid2D hrfkDispersion () const
IrregularGrid2D hrfkDispersion () const
bool isActive () const
bool isActive () const
double maximumTime () const
double maximumTime () const
 RealTimeArrayManager (ArrayStations *array)
 RealTimeArrayManager (ArrayStations *array)
void setFrequencyBandWidth (double fbw)
void setFrequencyBandWidth (double fbw)
void setKmax (double k)
void setKmin (double k)
void setMaximumSlowness (double s)
void setMaximumTime (double t)
void setMaximumTime (double t)
void setSamplingParameters (const SamplingParameters &p)
void setSamplingParameters (const SamplingParameters &p)
void setWavenumberRange (double kmin, double kmax)
void setWindowLenght (double l)
void setWindowLenght (double l)
IrregularGrid2D spacDispersion () const
IrregularGrid2D spacDispersion () const
void start ()
void start ()
void stop ()
void stop ()
 ~RealTimeArrayManager ()
 ~RealTimeArrayManager ()

Friends

class RealTimeArrayProcess

Detailed Description

Brief description of class still missing.

Full description of class still missing


Constructor & Destructor Documentation

Description of constructor still missing

References RealTimeArrayProcess, GeopsyCore::TimeRange::setEnd(), RealTimeArrayProcess::setFrequencyBands(), GeopsyCore::TimeRange::setStart(), and QGpCoreTools::Thread::start().

{
  printf("RealTimeArrayManager %p\n",this);
  // Create as many processes as the number of processors
  //int maximumThreads=Thread::idealThreadCount();
  int maximumThreads=1;
  if(maximumThreads<1) maximumThreads=1;
  // _threads is never modified in thread, only in main thread, hence no need for mutex
  for(int i=0; i<maximumThreads; i++) {
    RealTimeArrayProcess * t=new RealTimeArrayProcess(this, array);
    t->setObjectName(QString("arrayprocess%1").arg(i+1));
    _threads.append(t);
    t->setFrequencyBands(&_bands);
    t->start();
  }

  _array=array;
  // Get the minimum starting time
  double minTime=-1e99;
  for(ArrayStations::iterator it=_array->begin();it!=_array->end();it++) {
    double t=(*it)->minTime();
    if(t>minTime) minTime=t;
  }
  _globalRange.setStart(minTime);
  _globalRange.setEnd(minTime);
  _active=false;
}

Description of destructor still missing

{
  clearTasks();
  for(QList<RealTimeArrayProcess *>::iterator it=_threads.begin(); it!=_threads.end(); it++) {
    (*it)->terminate();
  }
  _event.wakeAll();
  for(QList<RealTimeArrayProcess *>::iterator it=_threads.begin(); it!=_threads.end(); it++) {
    (*it)->wait();
  }
  printf("~RealTimeArrayManager %p\n",this);
}

Member Function Documentation

References GeopsyCore::TimeRangeList::add(), GeopsyCore::TimeRangeList::begin(), ArrayCore::FrequencyBand::center(), GeopsyCore::TimeRange::end(), GeopsyCore::TimeRangeList::end(), GeopsyCore::SparseKeepSignal::initValues(), GeopsyCore::SparseTimeRange::intersection(), GeopsyCore::TimeRangeList::isEmpty(), GeopsyCore::SparseTimeRange::printDebug(), ArrayCore::FrequencyBand::setCenter(), ArrayCore::FrequencyBand::setRelativeWidth(), GeopsyCore::TimeRangeList::timeRange(), and QGpCoreTools::SamplingParameters::value().

Referenced by start().

{
  if( !_active || _lastFrequencyTimes.isEmpty()) return;
  // Get minimum lastFrequency time
  double minLastFrequencyTime=_globalRange.end();
  for(int i=_lastFrequencyTimes.count()-1;i>=0;i--) {
    if(_lastFrequencyTimes[i]<minLastFrequencyTime) {
      minLastFrequencyTime=_lastFrequencyTimes[i];
    }
  }
  // Get the minimum end time (to skip gap computation at the end of signals)
  double minEndTime=_globalRange.end();
  for(ArrayStations::iterator it=_array->begin();it!=_array->end();it++) {
    double t=(*it)->maxTime();
    if(t<minEndTime) minEndTime=t;
  }
  // Get gaps between minLastFrequencyTime and minEndTime
  // Horizontal components are ignored for now
  TimeRange globalProcessRange(minLastFrequencyTime, minEndTime);
  SparseTimeRange globalSparseRange(globalProcessRange);
  //printf("############################################\n");
  //printf("**** global\n");
  printf("From %lf to %lf\n",minLastFrequencyTime, globalProcessRange.end());
  for(int i=_array->count()-1;i>=0;i--) {
    globalSparseRange=globalSparseRange.intersection(_array->at(i)->timeRange(globalProcessRange));
  }
  globalSparseRange.printDebug();
  SparseKeepSignal keep(globalSparseRange);
  // Adjust range taking sampling of all stations into account
  for(int i=_array->count()-1;i>=0;i--) {
    _array->at(i)->setSampling(&keep);
  }
  // Set values of keep
  keep.initValues(1);
  for(int i=_array->count()-1;i>=0;i--) {
    _array->at(i)->setKeep(&keep, _windowingParameters, i);
  }
  // Calculate time windows for each frequency
  FrequencyBand fb;
  fb.setRelativeWidth(_frequencyBandWidth);
  for(int i=_lastFrequencyTimes.count()-1;i>=0;i--) {
    TimeRangeList wList;
    fb.setCenter(_samplingParameters.value(i));
    wList.add(fb.center(), _windowingParameters, keep, TimeRange(_lastFrequencyTimes[i], _globalRange.end()), 0);
    if(!wList.isEmpty()) {
      //printf("Enqueue...\n");
      for(TimeRangeList::iterator it=wList.begin();it!=wList.end();it++) {
        addTask(new ArrayTask(i, fb, **it) );
      }
      _lastFrequencyTimes[i]=wList.timeRange().end();
    }
  }
}
{return _fkDispersion;}
{return _fkDispersion;}
{return _hrfkDispersion;}
{return _hrfkDispersion;}
bool RealTimeArrayManager::isActive ( ) const [inline]
{return _active;}
bool RealTimeArrayManager::isActive ( ) const [inline]
{return _active;}
double RealTimeArrayManager::maximumTime ( ) const [inline]

References GeopsyCore::TimeRange::end().

{return _globalRange.end();}
double RealTimeArrayManager::maximumTime ( ) const [inline]

References GeopsyCore::TimeRange::end().

{return _globalRange.end();}
void RealTimeArrayManager::queueChanged ( int  size) [signal]
void RealTimeArrayManager::queueChanged ( int  size) [signal]

References start().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  _frequencyBandWidth=fbw;
  if(wasActive) start();
}
void RealTimeArrayManager::setKmax ( double  k)

References start().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  for(QList<RealTimeArrayProcess *>::iterator it=_threads.begin(); it!=_threads.end(); it++) {
    (*it)->setKmax(k);
  }
  if(wasActive) start();
}
void RealTimeArrayManager::setKmin ( double  k)

References start().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  for(QList<RealTimeArrayProcess *>::iterator it=_threads.begin(); it!=_threads.end(); it++) {
    (*it)->setKmin(k);
  }
  if(wasActive) start();
}

References start().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  for(QList<RealTimeArrayProcess *>::iterator it=_threads.begin(); it!=_threads.end(); it++) {
    (*it)->setMaximumSlowness(s);
  }
  if(wasActive) start();
}

References GeopsyCore::TimeRange::end(), and GeopsyCore::TimeRange::setEnd().

{
  printf("Maximum time %lf\n",t);
  if(t>_globalRange.end())
    _globalRange.setEnd(t);
}

References QGpCoreTools::SamplingParameters::count(), RealTimeHistogram::init(), QGpCoreTools::LinearScale, and start().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  _samplingParameters=p;
  _lastFrequencyTimes.resize(_samplingParameters.count());
  _fkDispersion.init(p, 200, 0.0005, 0.01, LinearScale);
  _hrfkDispersion.init(p, 200, 0.0005, 0.01, LinearScale);
  _spacDispersion.init(p, 200, 0.0005, 0.01, LinearScale);
  _bands.resize(_samplingParameters.count());
  if(wasActive) start();
}
void RealTimeArrayManager::setWavenumberRange ( double  kmin,
double  kmax 
)

References start().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  for(QList<RealTimeArrayProcess *>::iterator it=_threads.begin(); it!=_threads.end(); it++) {
    (*it)->setWavenumberRange(kmin, kmax);
  }
  if(wasActive) start();
}

References GeopsyCore::WindowingParameters::setPeriodCount(), and start().

Referenced by ProcessUnit::setArrayWindowLength().

{
  bool wasActive=_active;
  if(wasActive) clearTasks();
  _windowingParameters.setPeriodCount(l);
  if(wasActive) start();
}
{return _spacDispersion;}
{return _spacDispersion;}

References ArrayCore::FrequencyBand::center(), RealTimeHistogram::clear(), QGpCoreTools::SamplingParameters::count(), createTasks(), GeopsyCore::WindowingParameters::periodCount(), ArrayCore::FrequencyBand::setCenter(), ArrayCore::FrequencyBand::setRelativeWidth(), GeopsyCore::TimeRange::start(), and QGpCoreTools::SamplingParameters::value().

Referenced by setFrequencyBandWidth(), setKmax(), setKmin(), setMaximumSlowness(), setSamplingParameters(), setWavenumberRange(), and setWindowLenght().

{
  // Clean result grids
  _fkDispersion.clear();
  _hrfkDispersion.clear();
  _spacDispersion.clear();
  // Reset starting times for each frequency band
  for(int i=_lastFrequencyTimes.count()-1;i>=0;i--) {
    _lastFrequencyTimes[i]=_globalRange.start();
  }
  // Cache frequency bands for each process
  int n=_samplingParameters.count();
  for(int i=0; i<n; i++) {
    FrequencyBand fb;
    fb.setRelativeWidth(_frequencyBandWidth);
    fb.setCenter(_samplingParameters.value(i));
    _bands[i].calculate(fb, _windowingParameters.periodCount()/fb.center());
  }
  _active=true;
  createTasks();
}
{
  if(_active) {
    _active=false;
    clearTasks();
  }
}

Friends And Related Function Documentation

Referenced by RealTimeArrayManager().


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