Public Member Functions | Protected Member Functions
SPACLoopTask Class Reference

#include <SPACLoop.h>

Inheritance diagram for SPACLoopTask:
QGpCoreTools::LoopTask QGpCoreTools::Thread

List of all members.

Public Member Functions

virtual void setArray (const ArrayStations &array)
void setLoop (const SPACLoop *l)
void setParameters (const SPACParameters *param)
 SPACLoopTask ()
 ~SPACLoopTask ()

Protected Member Functions

virtual void run (int index)

Constructor & Destructor Documentation

References TRACE.

{
  TRACE;
  _process=0;
}

References ArrayCore::ArrayProcess::takeParameters(), and TRACE.

{
  TRACE;
  for(int iRing=0;iRing < _nRings; iRing++ ) {
    delete [] _sum[iRing];
    delete [] _sum2[iRing];
  }
  delete [] _sum;
  delete [] _sum2;
  // Parameters are not owned by process
  _process->takeParameters();
  delete _process;
}

Member Function Documentation

void SPACLoopTask::run ( int  index) [protected, virtual]

Implements QGpCoreTools::LoopTask.

References SPACLoop::addLog(), SPACLoop::array(), GeopsyCore::TimeRangeList::at(), ArrayCore::FrequencyBand::center(), GeopsyCore::StationList::components(), GeopsyCore::TimeRangeList::count(), QGpCoreWave::AutocorrCurves::curves(), QGpCoreTools::LoopTask::endIndex(), ArrayCore::ArrayProcess::frequency(), ArrayCore::RingCouplesProcess::horizontalAutocorr(), SPACLoop::lockOutputStmap(), ArrayCore::ArrayProcess::lockTimeWindow(), QGpCoreWave::AutocorrRing::maxRadius(), QGpCoreWave::AutocorrRing::minRadius(), SPACLoop::outputStmap(), ArrayCore::SPACArrayProcess::parameters(), ArrayCore::RingCouplesProcess::radialAutocorr(), ArrayCore::SPACParameters::ring(), ArrayCore::ArrayProcess::setFrequency(), QGpCoreTools::StatisticalValue< numberType >::setMean(), QGpCoreTools::LoopTask::setProgressMaximum(), QGpCoreTools::LoopTask::setProgressValue(), QGpCoreTools::LoopTask::setStatus(), QGpCoreTools::StatisticalValue< numberType >::setStddev(), QGpCoreTools::StatisticalValue< numberType >::setWeight(), QGpCoreTools::StatisticalPoint< numberType >::setX(), QGpCoreTools::sqrt(), SPACLoop::target(), QGpCoreTools::LoopTask::terminated(), ArrayCore::ArrayProcess::timeRangeList(), TRACE, ArrayCore::RingCouplesProcess::transverseAutocorr(), SPACLoop::unlockOutputStmap(), ArrayCore::ArrayProcess::unlockTimeWindow(), and ArrayCore::RingCouplesProcess::verticalAutocorr().

{
  TRACE;
  // Revert the order: start with expensive high frequencies
  // When the number of cores increases and tends to the number
  // of frequencies, it is more efficient to start with with the
  // most expensive frequencies.
  index=endIndex()-index-1;

  QString freqLog, freqStatus;
  _process->setFrequency(index, &freqLog, &freqStatus);
  setStatus(freqStatus);
  _loop->addLog(freqLog);
  // Loop over all time windows
  const TimeRangeList& winList=*_process->timeRangeList();
  int nWin=winList.count();
  resetStatistics();
  setProgressMaximum(nWin);
  for(int iWin=0;iWin < nWin; iWin++ ) {
    if(terminated()) break;
    setProgressValue(iWin);
    _win=&winList.at(iWin);
    if( !_process->lockTimeWindow(_win) ) continue;
    for(int iRing=0;iRing < _nRings;iRing++ ) {
      RingCouplesProcess& ring=_rings[iRing];
      double * sumRing=_sum[iRing];
      double * sum2Ring=_sum2[iRing];
      double autocorrValue;
      switch (_loop->array()->components()) {
      case StationSignals::AllComponent: {
          ring.horizontalAutocorr();
          autocorrValue=ring.radialAutocorr();
          sumRing[ 1 ] += autocorrValue;
          sum2Ring[ 1 ] += autocorrValue * autocorrValue;
          writeMax(1, iRing, autocorrValue);
          autocorrValue=ring.transverseAutocorr();
          sumRing[ 2 ] += autocorrValue;
          sum2Ring[ 2 ] += autocorrValue * autocorrValue;
          writeMax(2, iRing, autocorrValue);
        }
      case StationSignals::VerticalComponent: {
          autocorrValue=ring.verticalAutocorr();
          sumRing[ 0 ] += autocorrValue;
          sum2Ring[ 0 ] += autocorrValue * autocorrValue;
          writeMax(0, iRing, autocorrValue);
        }
        break;
      }
    }
    _process->unlockTimeWindow();
  }
  // Compute statistics
  double dNWin=(double) winList.count();
  double invNWin=1.0/dNWin;
  double invNWin1=1.0/(dNWin - 1.0);
  double f=_process->frequency().center();
  for(int iRing=0;iRing < _nRings; iRing++ ) {
    double * sumRing=_sum[iRing];
    double * sum2Ring=_sum2[iRing];
    for(int iComp=0; iComp<_nComp; iComp++ ){
      double tsum=sumRing[ iComp ] * invNWin;
      double tsum2;
      if(dNWin<=1) {
        tsum2=0.0;
      } else {
        tsum2=(sum2Ring[iComp]-tsum*tsum*dNWin)*invNWin1;
        if(tsum2<0.0) {
          tsum2=0.0;
        }
      }
      if(_loop->target()) {
        ModalCurve& curve=_loop->target()->curves()[iRing*_nComp+iComp];
        FactoryPoint& p=curve[index];
        p.setX(f);
        p.setMean(tsum);
        p.setStddev(sqrt(tsum2));
        p.setWeight(dNWin);
      }
      if(_loop->outputStmap(iComp)) {
        _loop->lockOutputStmap(iComp);
        const RingCouples& ring=_process->parameters()->ring(iRing);
        QTextStream * s=new QTextStream(_loop->outputStmap(iComp));
        (*s) << iRing << " "
             << index << " "
             << f << " "
             << tsum << " "
             << sqrt(tsum2) << " "
             << ring.minRadius()*0.001 << " "
             << ring.maxRadius()*0.001 << "\n";
        delete s;
        _loop->unlockOutputStmap(iComp);
      }
    }
  }
}
void SPACLoopTask::setArray ( const ArrayStations array) [virtual]

References ArrayCore::ArrayProcess::setTimeRangeList(), and TRACE.

Referenced by SPACLoop::newTask().

{
  TRACE;
  _process=new SPACArrayProcess(array);
  _process->setTimeRangeList(new TimeWindowList);
}
void SPACLoopTask::setLoop ( const SPACLoop l) [inline]

Referenced by SPACLoop::newTask().

{_loop=l;}

References SPACLoop::array(), GeopsyCore::StationList::nComponents(), ArrayCore::SPACParameters::ring(), ArrayCore::SPACParameters::ringCount(), ArrayCore::SPACArrayProcess::setParameters(), ArrayCore::ArrayProcess::stations(), and TRACE.

Referenced by SPACLoop::newTask().

{
  TRACE;
  _process->setParameters(param, true);

  _nRings=param->ringCount();
  _nComp=_loop->array()->nComponents();
  _rings.resize(_nRings);
  _sum=new double * [_nRings];
  _sum2=new double * [_nRings];
  for(int iRing=0; iRing<_nRings; iRing++ ){
    _sum[iRing]=new double[_nComp];
    _sum2[iRing]=new double[_nComp];
    _rings[iRing].init(param->ring(iRing), _process->stations());
  }
}

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