#include <SPACLoop.h>
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) |
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;
}
| 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;}
| void SPACLoopTask::setParameters | ( | const SPACParameters * | param | ) |
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());
}
}