#include <StationSignals.h>
Public Types | |
| enum | Component { UndefinedComponent = 0, VerticalComponent = 1, HorizontalComponent = 2, AllComponent = 3, AnySingleComponent = 7 } |
Public Member Functions | |
| bool | addSignal (Signal *sig, QString *log=0) |
| Signal::Components | component () const |
| Components | components () const |
| bool | contains (Signal *sig) const |
| const Point & | coordinates () const |
| double | deltaT () const |
| Signal * | firstValidSignal () const |
| bool | hasAllComponents (QString *log=0) const |
| Signal * | lastValidSignal () const |
| double | maxTime () const |
| double | minTime () const |
| QString | name () const |
| QString | nameComponent () const |
| int | nComponents () const |
| const SubSignalPool & | originals (int iComp) const |
| void | setComponents (Components c) |
| void | setKeep (SparseKeepSignal *keep, const WindowingParameters ¶m, int stationIndex) const |
| void | setSampling (SparseKeepSignal *keep) const |
| const Point & | source () const |
| double | sourceReceiverAzimuth () const |
| double | sourceReceiverDistance () const |
| StationSignals (Components c=UndefinedComponent) | |
| double | t0 () const |
| SparseTimeRange | timeRange (const TimeRange &r) const |
| QDateTime | timeReference () const |
| virtual | ~StationSignals () |
Static Public Member Functions | |
| static Signal::Components | component (int index, Components c) |
| static int | nComponents (Components c) |
| static void | organizeSubPool (SubSignalPool *subPool) |
Protected Attributes | |
| SubSignalPool * | _signals |
| UndefinedComponent | |
| VerticalComponent | |
| HorizontalComponent | |
| AllComponent | |
| AnySingleComponent |
{UndefinedComponent=0, VerticalComponent=1, HorizontalComponent=2, AllComponent=3,
AnySingleComponent=7};
| GeopsyCore::StationSignals::StationSignals | ( | Components | c = UndefinedComponent | ) |
References _signals, nComponents(), TRACE, and UndefinedComponent.
{
TRACE;
_components=c;
if(_components==UndefinedComponent)
_signals=0;
else
_signals=new SubSignalPool[nComponents()];
}
| GeopsyCore::StationSignals::~StationSignals | ( | ) | [virtual] |
| bool GeopsyCore::StationSignals::addSignal | ( | Signal * | sig, |
| QString * | log = 0 |
||
| ) |
Add signal sig to this station. If it is not compatible, it returns false. Compatibility criteria have been almost suppressed with sparse time range. Remains only errors for bad components: when validated, remove the bool (like returns always true).
References _signals, GeopsyCore::SubSignalPool::addSignal(), AllComponent, AnySingleComponent, GeopsyCore::Signal::component(), coordinates(), GeopsyCore::Signal::East, GeopsyCore::DoubleSignal::fastFourierTransform(), HorizontalComponent, GeopsyCore::Signal::id(), name(), GeopsyCore::Signal::North, SAFE_UNINITIALIZED, TRACE, UndefinedComponent, GeopsyCore::Signal::userName(), GeopsyCore::Signal::Vertical, VerticalComponent, and GeopsyCore::DoubleSignal::Waveform.
Referenced by GeopsyCore::StationList::addSignal().
{
TRACE;
// Check that deltaT and T0 are compatible, if no reference signal is available, the station
// is still empty and may accept any signal
// No longer a mandatory condition: still requires some testing
/*Signal * refSig=firstValidSignal();
if(refSig) {
double refDeltaT=refSig->deltaT();
if(refDeltaT!=sig->deltaT()) {
if(log)
(*log) += tr( "The sampling rate is not compatible (signal id %1).\n" ).arg(sig->id());
else
Message::warning(MSG_ID, tr("Adding station %1").arg(sig->name()),
tr( "The sampling rate is not compatible (signal id %1)." ).arg(sig->id()),
Message::cancel());
return false;
}
double nDeltaT0=fabs(refSig->t0() - sig->t0())/refDeltaT;
if(nDeltaT0 - round(nDeltaT0) > 0.01 * refDeltaT) {
if(log)
(*log) += tr( "The differences between t0s must be a multiple of "
"the sampling period (signal id %1).\n" ).arg(sig->id());
else
Message::warning(MSG_ID, tr("Adding station %1").arg(sig->name()),
tr( "The differences between t0s must be a multiple of "
"the sampling period (signal id %1)." ).arg(sig->id()),
Message::cancel());
return false;
}
}*/
// Identify component index
int iComp;
SAFE_UNINITIALIZED(iComp,0);
switch(_components) {
case VerticalComponent:
if(sig->component()!=Signal::Vertical) return false;
iComp=0;
break;
case HorizontalComponent:
switch(sig->component()) {
case Signal::North:
iComp=0;
break;
case Signal::East:
iComp=1;
break;
default:
return false;
}
break;
case AllComponent:
switch(sig->component()) {
case Signal::Vertical:
iComp=0;
break;
case Signal::North:
iComp=1;
break;
case Signal::East:
iComp=2;
break;
default:
return false;
}
break;
case AnySingleComponent:
iComp=0;
break;
case UndefinedComponent:
return false;
}
// Check for overlap in time and insert signal at correct place
// Overlap is no longer a problem
SubSignalPool& subPool=_signals[iComp];
/*for(SubSignalPool::iterator it=subPool.begin(); it!= subPool.end(); it++ ) {
Signal * sig0=*it;
if(( sig->t0()<sig0->t0() && sig0->t0()<sig->endTime()) ||
(sig0->t0()<sig->t0() && sig->t0()<sig0->endTime()) ) {
if(log)
( *log) += tr( "Signals id %1 and id %2 overlap in time.\n" ).
arg(sig0->id()).arg(sig->id());
else
Message::warning(MSG_ID, tr("Add signal %1").arg(sig->nameComponent()).arg(sig->id()),
tr( "Signals id %1 and id %2 overlap in time." ).
arg(sig0->id()).arg(sig->id()), Message::cancel());
return false;
}
}*/
// Make sure signals are in time (needed for signal composition)
sig->fastFourierTransform(Signal::Waveform);
subPool.addSignal(sig);
if(log)
( *log) += QString( "Add signal id %1 to component %2 of station %3 at %4\n" )
.arg(sig->id())
.arg(Signal::userName(sig->component()) )
.arg(name())
.arg(coordinates().toString());
return true;
}
| Signal::Components GeopsyCore::StationSignals::component | ( | int | index, |
| Components | c | ||
| ) | [static] |
References AllComponent, AnySingleComponent, GeopsyCore::Signal::East, HorizontalComponent, GeopsyCore::Signal::North, UndefinedComponent, GeopsyCore::Signal::Vertical, and VerticalComponent.
Referenced by GeopsyCore::StationList::addSignal().
{
switch (c) {
case VerticalComponent:
return Signal::Vertical;
case HorizontalComponent:
switch (index) {
case 0: return Signal::North;
default: return Signal::East;
}
break;
case AllComponent:
switch (index) {
case 0: return Signal::Vertical;
case 1: return Signal::North;
default: return Signal::East;
}
break;
case AnySingleComponent:
case UndefinedComponent:
break;
}
return Signal::UndefinedComponent;
}
| Signal::Components GeopsyCore::StationSignals::component | ( | ) | const [inline] |
References GeopsyCore::Signal::component(), firstValidSignal(), TRACE, and UndefinedComponent.
Referenced by GeopsyCore::StationList::component(), and hasAllComponents().
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->component() : Signal::UndefinedComponent;
}
| Components GeopsyCore::StationSignals::components | ( | ) | const [inline] |
{return _components;}
| bool GeopsyCore::StationSignals::contains | ( | Signal * | sig | ) | const |
Return true if signal sig is one of the original signals of this station
References _signals, nComponents(), and TRACE.
Referenced by MonoStation::AbstractTool::refreshSignal().
{
TRACE;
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
if(_signals[iComp].contains(sig)) {
return true;
}
}
return false;
}
| const Point & GeopsyCore::StationSignals::coordinates | ( | ) | const [inline] |
References firstValidSignal(), and GeopsyCore::Signal::receiver().
Referenced by GeopsyCore::StationList::addSignal(), addSignal(), GeopsyGui::StationCoordinatesItem::data(), HVStation::HVStation(), GeopsyCore::StationList::pointList(), SpectrumStation::save(), HVStation::save(), ToolSPAC::setArrayMap(), ToolSPAC::setCoArrayMap(), ArrayCore::StationCouple::setStations(), SpectrumStation::SpectrumStation(), and StructureStation::StructureStation().
{
static Point dummy;
Signal * sig=firstValidSignal();
return sig ? sig->receiver() : dummy;
}
| double GeopsyCore::StationSignals::deltaT | ( | ) | const [inline] |
References GeopsyCore::DoubleSignal::deltaT(), firstValidSignal(), and TRACE.
Referenced by GeopsyCore::StationProcessSignals::copyOriginalSignal(), GeopsyCore::StationProcessSignals::setHighPassFilter(), and SpectrumStation::start().
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->deltaT() : 0.0;
}
| Signal * GeopsyCore::StationSignals::firstValidSignal | ( | ) | const |
References _signals, GeopsyCore::SubSignalPool::first(), nComponents(), and TRACE.
Referenced by GeopsyCore::TimeRangeParameters::absoluteRange(), component(), coordinates(), deltaT(), name(), nameComponent(), LinearFKActiveStationSignals::normalize(), MonoStation::AbstractTool::refreshSignal(), SpectrumStation::save(), StructureStation::save(), MonoStation::AbstractStation::shortFileName(), source(), sourceReceiverAzimuth(), sourceReceiverDistance(), t0(), LinearFKActiveStationSignals::taper(), and timeReference().
{
TRACE;
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
if(!_signals[iComp].isEmpty()) return _signals[iComp].first();
}
return 0;
}
| bool GeopsyCore::StationSignals::hasAllComponents | ( | QString * | log = 0 | ) | const |
Check that all components are available
References _signals, component(), name(), nComponents(), QGpCoreTools::tr(), TRACE, and GeopsyCore::Signal::userName().
{
TRACE;
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
if(_signals[iComp].isEmpty()) {
if(log)
( *log) += tr( "Missing %1 component for station %2.\n" )
.arg(Signal::userName(component( iComp, _components)) )
.arg(name());
return false;
}
}
return true;
}
| Signal * GeopsyCore::StationSignals::lastValidSignal | ( | ) | const |
References _signals, GeopsyCore::SubSignalPool::last(), nComponents(), and TRACE.
Referenced by GeopsyCore::TimeRangeParameters::absoluteRange().
{
TRACE;
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
if(!_signals[iComp].isEmpty()) return _signals[iComp].last();
}
return 0;
}
| double GeopsyCore::StationSignals::maxTime | ( | ) | const |
Return maximum ending time for all components
References _signals, GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::end(), GeopsyCore::Signal::endTime(), nComponents(), and TRACE.
Referenced by GeopsyGui::ChronogramLayer::boundingRect().
{
TRACE;
int nComp=nComponents();
double t=-1e99;
for(int iComp=0; iComp<nComp; iComp++) {
SubSignalPool& subPool=_signals[iComp];
for(SubSignalPool::iterator it=subPool.begin();it!=subPool.end();it++) {
Signal * sig=*it;
if(sig->endTime() > t) t=sig->endTime();
}
}
return t;
}
| double GeopsyCore::StationSignals::minTime | ( | ) | const |
Return minimum starting time for all components
References _signals, GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::end(), nComponents(), GeopsyCore::Signal::t0(), and TRACE.
Referenced by GeopsyGui::ChronogramLayer::boundingRect().
{
TRACE;
int nComp=nComponents();
double t=1e99;
for(int iComp=0; iComp<nComp; iComp++) {
SubSignalPool& subPool=_signals[iComp];
for(SubSignalPool::iterator it=subPool.begin();it!=subPool.end();it++) {
Signal * sig=*it;
if(sig->t0() < t) t=sig->t0();
}
}
return t;
}
| QString GeopsyCore::StationSignals::name | ( | ) | const [inline] |
References firstValidSignal(), GeopsyCore::Signal::name(), and TRACE.
Referenced by GeopsyCore::StationList::addSignal(), addSignal(), GeopsyGui::StationCoordinatesItem::data(), GeopsyGui::ChronogramLayer::exportGaps(), hasAllComponents(), HVStation::HVStation(), ToolStructure::initStations(), HVStation::name(), StructureStation::name(), StructureStationSignals::organizeSubPool(), GeopsyCore::StationList::pointList(), HVStation::save(), StructureStation::save(), MonoStation::WinResults::saveResults(), ToolSPAC::setArrayMap(), setSampling(), Acquisition::startStations(), and Acquisition::stopStations().
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->name() : QString::null;
}
| QString GeopsyCore::StationSignals::nameComponent | ( | ) | const [inline] |
References firstValidSignal(), GeopsyCore::Signal::nameComponent(), and TRACE.
Referenced by SpectrumStation::name(), SpectrumStation::SpectrumStation(), and StructureStation::StructureStation().
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->nameComponent() : QString::null;
}
| int GeopsyCore::StationSignals::nComponents | ( | ) | const [inline] |
References nComponents().
Referenced by MonoStation::CategoryGroupItem::belongsTo(), contains(), firstValidSignal(), hasAllComponents(), lastValidSignal(), maxTime(), minTime(), GeopsyCore::StationList::nComponents(), nComponents(), setComponents(), setKeep(), setSampling(), MonoStation::CategoryGroupItem::setSignals(), StationSignals(), and timeRange().
{return nComponents(_components);}
| int GeopsyCore::StationSignals::nComponents | ( | Components | c | ) | [static] |
References AllComponent, AnySingleComponent, HorizontalComponent, TRACE, and VerticalComponent.
{
TRACE;
switch (c) {
case VerticalComponent:
case AnySingleComponent:
return 1;
case HorizontalComponent:
return 2;
case AllComponent:
return 3;
default:
return 0;
}
}
| void GeopsyCore::StationSignals::organizeSubPool | ( | SubSignalPool * | subPool | ) | [static] |
Organise a subPool with signals sorted by station
References GeopsyCore::SortKey::add(), GeopsyCore::SortKey::clear(), GeopsyCore::MetaDataFactory::Component, GeopsyCore::MetaDataFactory::Name, GeopsyCore::MetaDataFactory::ReceiverX, GeopsyCore::MetaDataFactory::ReceiverY, GeopsyCore::SubSignalPool::sort(), GeopsyCore::MetaDataFactory::T0, and TRACE.
| const SubSignalPool& GeopsyCore::StationSignals::originals | ( | int | iComp | ) | const [inline] |
Referenced by MonoStation::CategoryGroupItem::belongsTo(), MonoStation::WinResults::categoriesToGroups(), GeopsyCore::StationProcessSignals::copyOriginalSignal(), GeopsyGui::ChronogramLayer::exportGaps(), ToolSpectrum::initStations(), ToolStructure::initStations(), ToolHV::initStations(), GeopsyGui::ChronogramLayer::rangeUpdate(), GeopsyGui::ChronogramLayer::selection(), GeopsyCore::StationProcessSignals::setHighPassFilter(), setKeep(), setSampling(), MonoStation::CategoryGroupItem::setSignals(), and timeRange().
{return _signals[iComp];}
| void GeopsyCore::StationSignals::setComponents | ( | Components | c | ) |
Modify number of components. Never remove components. Always add if necessary.
References _signals, AllComponent, AnySingleComponent, HorizontalComponent, nComponents(), TRACE, UndefinedComponent, and VerticalComponent.
{
TRACE;
if(c==_components || c==UndefinedComponent) return;
switch(_components) {
case UndefinedComponent:
_components=c;
_signals=new SubSignalPool[nComponents()];
break;
case VerticalComponent:
if(c==HorizontalComponent || c==AllComponent) {
_components=AllComponent;
SubSignalPool * s=new SubSignalPool[nComponents()];
s[0]=_signals[0];
delete [] _signals;
_signals=s;
}
break;
case HorizontalComponent:
if(c==VerticalComponent || c==AllComponent) {
_components=AllComponent;
SubSignalPool * s=new SubSignalPool[nComponents()];
s[1]=_signals[0];
s[2]=_signals[1];
delete [] _signals;
_signals=s;
}
break;
case AnySingleComponent:
case AllComponent:
break;
}
}
| void GeopsyCore::StationSignals::setKeep | ( | SparseKeepSignal * | keep, |
| const WindowingParameters & | param, | ||
| int | stationIndex | ||
| ) | const |
Values of keep are initially all to 1. This function toogles them to 0 if param conditions are not satisfied.
References GeopsyCore::DoubleSignal::abs(), GeopsyCore::WindowingParameters::badSampleThreshold(), GeopsyCore::SubSignalPool::begin(), GeopsyCore::DoubleSignal::clipMaxToKeep(), GeopsyCore::DoubleSignal::copySamplesFrom(), GeopsyCore::WindowingParameters::ShortLongTermAverage::enabled, GeopsyCore::SubSignalPool::end(), GeopsyCore::DoubleSignal::filter(), GeopsyCore::WindowingParameters::filter(), GeopsyCore::WindowingParameters::filterComponent(), GeopsyCore::WindowingParameters::filterSignalAntiTrigger(), GeopsyCore::WindowingParameters::filterStation(), GeopsyCore::SparseKeepSignal::keeps(), nComponents(), originals(), GeopsyCore::SparseTimeRange::range(), GeopsyCore::WindowingParameters::rawComponent(), GeopsyCore::WindowingParameters::rawSignalAntiTrigger(), GeopsyCore::WindowingParameters::rawStation(), GeopsyCore::DoubleSignal::staltaToKeep(), GeopsyCore::KeepSignal::t0(), GeopsyCore::Signal::t0(), GeopsyCore::Signal::timeRange(), and TRACE.
{
TRACE;
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
const SubSignalPool& subPool=originals(iComp);
for(SubSignalPool::const_iterator itSig=subPool.begin();itSig!=subPool.end(); ++itSig) {
const Signal * sig=*itSig;
QVector<KeepSignal *> keeps=keep->keeps(sig->timeRange().range());
for(QVector<KeepSignal *>::iterator itKeep=keeps.begin(); itKeep!=keeps.end(); itKeep++) {
KeepSignal * keepSig=*itKeep;
double delay=sig->t0()-keepSig->t0();
if(param.rawSignalAntiTrigger().enabled &&
param.rawComponent(iComp) &&
param.rawStation(stationIndex)) {
DoubleSignal * tempsig=new DoubleSignal( *sig);
tempsig->copySamplesFrom(sig);
tempsig->abs();
tempsig->staltaToKeep(param.rawSignalAntiTrigger(), keepSig, delay);
delete tempsig;
}
if(param.filterSignalAntiTrigger().enabled &&
param.filterComponent(iComp) &&
param.filterStation(stationIndex)) {
DoubleSignal * tempsig=new DoubleSignal( *sig);
tempsig->copySamplesFrom(sig);
tempsig->filter(param.filter());
tempsig->abs();
tempsig->staltaToKeep(param.filterSignalAntiTrigger(), keepSig, delay);
delete tempsig;
}
if(param.badSampleThreshold()<100.0) {
sig->clipMaxToKeep((double) param.badSampleThreshold(), keepSig, delay);
}
}
}
}
}
| void GeopsyCore::StationSignals::setSampling | ( | SparseKeepSignal * | keep | ) | const |
Check sampling in all sub-ranges. In case of incompatibilities, discard the sub-ranges.
References GeopsyCore::SubSignalPool::begin(), GeopsyCore::DoubleSignal::deltaT(), GeopsyCore::TimeRange::end(), GeopsyCore::SubSignalPool::end(), QGpCoreTools::endl(), name(), nComponents(), originals(), GeopsyCore::SparseTimeRange::range(), GeopsyCore::SparseKeepSignal::remove(), GeopsyCore::SparseKeepSignal::setSampling(), GeopsyCore::TimeRange::start(), GeopsyCore::Signal::timeRange(), QGpCoreTools::tr(), and TRACE.
{
TRACE;
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
const SubSignalPool& subPool=originals(iComp);
for(SubSignalPool::const_iterator itSig=subPool.begin();itSig!=subPool.end();++itSig) {
const Signal * sig=*itSig;
TimeRange r=sig->timeRange().range();
if(!keep->setSampling(r, sig->deltaT())) {
App::stream() << tr("Station '%1': incompatible sampling from %2 to %3 s, skipping range")
.arg(name()).arg(r.start()).arg(r.end()) << endl;
keep->remove(r);
}
}
}
}
| const Point & GeopsyCore::StationSignals::source | ( | ) | const [inline] |
References firstValidSignal(), and GeopsyCore::Signal::source().
{
static Point dummy;
Signal * sig=firstValidSignal();
return sig ? sig->source() : dummy;
}
| double GeopsyCore::StationSignals::sourceReceiverAzimuth | ( | ) | const [inline] |
References firstValidSignal(), GeopsyCore::Signal::sourceReceiverAzimuth(), and TRACE.
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->sourceReceiverAzimuth() : 0.0;
}
| double GeopsyCore::StationSignals::sourceReceiverDistance | ( | ) | const [inline] |
References firstValidSignal(), GeopsyCore::Signal::sourceReceiverDistance(), and TRACE.
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->sourceReceiverDistance() : 0.0;
}
| double GeopsyCore::StationSignals::t0 | ( | ) | const [inline] |
References firstValidSignal(), GeopsyCore::Signal::t0(), and TRACE.
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->t0() : 0.0;
}
| SparseTimeRange GeopsyCore::StationSignals::timeRange | ( | const TimeRange & | r | ) | const |
Get the range where all components are available
References GeopsyCore::SparseTimeRange::add(), GeopsyCore::SubSignalPool::begin(), GeopsyCore::SubSignalPool::end(), GeopsyCore::SparseTimeRange::intersection(), nComponents(), originals(), and TRACE.
{
TRACE;
SparseTimeRange globalRange(r);
int nComp=nComponents();
for(int iComp=0; iComp<nComp; iComp++) {
const SubSignalPool& subPool=originals(iComp);
SparseTimeRange compRange;
for(SubSignalPool::const_iterator itSig=subPool.begin();itSig!=subPool.end();++itSig) {
compRange.add((*itSig)->timeRange(), false);
}
globalRange=globalRange.intersection(compRange);
}
return globalRange;
}
| QDateTime GeopsyCore::StationSignals::timeReference | ( | ) | const [inline] |
References firstValidSignal(), GeopsyCore::Signal::timeReference(), and TRACE.
{
TRACE;
Signal * sig=firstValidSignal();
return sig ? sig->timeReference() : QDateTime();
}
SubSignalPool* GeopsyCore::StationSignals::_signals [protected] |