List of time ranges. More...
#include <TimeRangeList.h>
Public Types | |
typedef QList< TimeRange * > ::const_iterator | const_iterator |
typedef QList< TimeRange * > ::iterator | iterator |
Public Member Functions | |
void | add (double frequency, const WindowingParameters ¶m, const SparseKeepSignal &keep, const TimeRange &r, QString *log) |
void | add (QTextStream &s, QString *log) |
void | add (const TimeRangeList &list) |
void | addBlanks (double frequency, const WindowingParameters ¶m, const SparseKeepSignal &keep, const TimeRange &r, QString *log) |
TimeRange & | addOne (const TimeRange &r) |
TimeRange & | addOne () |
const TimeRange & | at (int index) const |
TimeRange & | at (int index) |
iterator | begin () |
const_iterator | begin () const |
bool | clear () |
int | count () const |
iterator | end () |
const_iterator | end () const |
void | inverse (double frequency, const WindowingParameters ¶m, const SparseKeepSignal &keep, const TimeRange &r, QString *log) |
bool | isEmpty () const |
double | longestWindow () const |
void | remove (const TimeRange &r, QString *log) |
void | remove (int index, QString *log) |
TimeRange | timeRange () const |
TimeRangeList () | |
TimeRangeList (const TimeRangeList &o, int firstIndex) | |
QString | toString () const |
virtual | ~TimeRangeList () |
Protected Member Functions | |
virtual TimeRange * | cloneTimeRange (TimeRange *r) |
virtual void | deleteTimeRange (TimeRange *r) |
void | internalClear () |
virtual TimeRange * | newTimeRange (double start, double end) |
List of time ranges.
Subclass this class to store time ranges with more features (e.g. color) and re-implement newTimeRange(), cloneTimeRange(), deleteTimeRange(). TimeRange is not virtual to keep it as basic as possible.
typedef QList<TimeRange *>::const_iterator GeopsyCore::TimeRangeList::const_iterator |
typedef QList<TimeRange *>::iterator GeopsyCore::TimeRangeList::iterator |
GeopsyCore::TimeRangeList::TimeRangeList | ( | ) | [inline] |
{}
GeopsyCore::TimeRangeList::TimeRangeList | ( | const TimeRangeList & | o, |
int | firstIndex | ||
) |
References at(), count(), GeopsyCore::TimeRange::end(), newTimeRange(), GeopsyCore::TimeRange::start(), and TRACE.
{ TRACE; int n=count(); for(int i=firstIndex;i<n;i++) { const TimeRange& r=o.at(i); append(newTimeRange(r.start(), r.end())); } }
GeopsyCore::TimeRangeList::~TimeRangeList | ( | ) | [virtual] |
This function must be re-impleted in all subclasses. Virtual mechanism for deleteTimeRange() does not work for destructors. In each subclass, the list must be cleared to avoid re-delete in lower level classes.
References begin(), end(), internalClear(), and TRACE.
{ TRACE; for(iterator it=begin(); it!=end(); ++it) { delete *it; } internalClear(); }
void GeopsyCore::TimeRangeList::add | ( | double | frequency, |
const WindowingParameters & | param, | ||
const SparseKeepSignal & | keep, | ||
const TimeRange & | r, | ||
QString * | log | ||
) |
Add windows in tw time interval according to windowing parameters param and keep vectors keeps.
References GeopsyCore::WindowingParameters::badSampleTolerance(), CONST_LOCK_SAMPLES, GeopsyCore::KeepSignal::deltaT(), GeopsyCore::TimeRange::end(), GeopsyCore::SparseKeepSignal::keeps(), GeopsyCore::WindowingParameters::maximumLength(), GeopsyCore::WindowingParameters::minimumLength(), newTimeRange(), GeopsyCore::SignalTemplate< sampleType >::nSamples(), GeopsyCore::WindowingParameters::overlap(), GeopsyCore::TimeRange::start(), GeopsyCore::KeepSignal::t0(), QGpCoreTools::tr(), TRACE, and UNLOCK_SAMPLES.
Referenced by addBlanks(), MonoStation::AbstractStation::addWindows(), RealTimeArrayManager::createTasks(), inverse(), and ArrayCore::ArrayProcess::setFrequency().
{ TRACE; //App::stream() << tr("add time windows from %1 to %2").arg(r.start()).arg(r.end()) << endl; const QVector<KeepSignal *>& keeps=keep.keeps(); for(QVector<KeepSignal *>::const_iterator it=keeps.begin(); it!=keeps.end(); it++) { const KeepSignal * keepSig=*it; double deltaT=keepSig->deltaT(); double freqSamp=1.0/deltaT; int nMin=(int)round(param.minimumLength(frequency)*freqSamp); int nMax=(int)round(param.maximumLength(frequency)*freqSamp); int nOverlap=(int)round((param.overlap()*0.01)*(double)nMax); int nBadTol=(int)round(param.badSampleTolerance()*freqSamp); int nStart=(int)round((r.start()-keepSig->t0())*freqSamp); if(nStart>keepSig->nSamples()) { continue; } else if(nStart<0) { nStart=0; } int nEnd=(int)round((r.end()-keepSig->t0())*freqSamp); if(nEnd<0) { continue; } else if(nEnd>keepSig->nSamples()) { nEnd=keepSig->nSamples(); } //printf("nStart %i nEnd %i\n",nStart, nEnd); CONST_LOCK_SAMPLES(int, kSamp, keepSig) int i=nStart; int * badSamples=new int[nMax]; int nBadSample, winStart, winLength; while(i<nEnd) { while(i<nEnd && kSamp[i]==-1) { // find beginning of first window i++; } int acceptableSample=i; while(i<nEnd && kSamp[i]==0) { // finds beginning of first window i++; } i-=nBadTol; // Admits nbad_tol bad samples so go back if(i<acceptableSample) { i=acceptableSample; } nBadSample=0; winStart=-1; winLength=0; // Try to find a window at least with ntmin samples and with less than // bad_tol number of bad samples do { if(winStart==-1) { winStart=i; } else { // Restarting because n_bad_sample==bad_tol and i-start_w+1<ntmin // This means a too short window with too much bad samples // Restart window at the first bad_sample winLength-=badSamples[0]+1-winStart; winStart=badSamples[0] + 1; // move all bad samples in the vector for(int j=1; j<nBadSample; j++) { badSamples[j-1]=badSamples[j]; } nBadSample--; //printf("Restarting i=%i winStart=%i winLength=%i nBadSample=%i\n",i, // winStart,winLength,nBadSample); } while(i<nEnd && nBadSample<=nBadTol && winLength<nMax) { if(kSamp[i]==0) { badSamples[nBadSample]=i; nBadSample++; //printf("Found bad sample at %i, nBadSample=%i\n",i,nBadSample); } else if(kSamp[i]==-1) { // This sample cannot be tolerated //printf("Found very bad sample at %i, restarting\n",i); break; } winLength++; i++; } if(kSamp[i]==-1) { break; } } while(i<nEnd && winLength<nMin); // Found a window if(winLength>=nMin) { TimeRange * newRange=newTimeRange(winStart*deltaT+keepSig->t0(), i*deltaT+keepSig->t0()); //App::stream() << tr("good win: start=%1 end=%2").arg(newRange->start()).arg(newRange->end()) << endl; append(newRange); if(log) { (*log)+=tr("Adding window from %1 to %2 s.\n").arg(newRange->start()).arg(newRange->end()); } // Due to overlap, the next window can start before current i int effOverlap=nOverlap-1; if(effOverlap>=winLength) { effOverlap=winLength-1; } i-=effOverlap; } } delete [] badSamples; UNLOCK_SAMPLES(keepSig) } }
void GeopsyCore::TimeRangeList::add | ( | QTextStream & | s, |
QString * | log | ||
) |
References newTimeRange(), QGpCoreTools::tr(), and TRACE.
{ TRACE; QString line; while( !s.atEnd()) { line=s.readLine().simplified(); if(line.contains( "### End Time Windows ###" )) return ; while( !s.atEnd() && line.left(1)=="#" ) { line=s.readLine().trimmed().simplified(); ; if(line.contains( "### End Time Windows ###" )) return ; } double winStart=line.section(QRegExp( "[ \t]" ), 0, 0).toDouble(); double winEnd=line.section(QRegExp( "[ \t]" ), 1, 1).toDouble(); if(winStart < winEnd) { append(newTimeRange(winStart, winEnd)); if(log) { (*log)+= tr( "Adding window from %1 to %2 s.\n" ).arg(winStart).arg(winEnd); } } } }
void GeopsyCore::TimeRangeList::add | ( | const TimeRangeList & | list | ) |
References begin(), cloneTimeRange(), end(), and TRACE.
{ TRACE; for(const_iterator it=list.begin();it!=list.end();++it) { append(cloneTimeRange(*it)); } }
void GeopsyCore::TimeRangeList::addBlanks | ( | double | frequency, |
const WindowingParameters & | param, | ||
const SparseKeepSignal & | keep, | ||
const TimeRange & | r, | ||
QString * | log | ||
) |
Add windows according to param in available blanks
References add(), GeopsyCore::SparseKeepSignal::copySamplesFrom(), GeopsyCore::WindowingParameters::overlap(), and TRACE.
Referenced by MonoStation::AbstractStation::addWindows().
TimeRange & GeopsyCore::TimeRangeList::addOne | ( | const TimeRange & | r | ) | [inline] |
Reimplemented in GeopsyGui::TimeWindowList.
References GeopsyCore::TimeRange::end(), newTimeRange(), and GeopsyCore::TimeRange::start().
{ TimeRange * rr=newTimeRange(r.start(), r.end()); append(rr); return *rr; }
TimeRange & GeopsyCore::TimeRangeList::addOne | ( | ) | [inline] |
Reimplemented in GeopsyGui::TimeWindowList.
References newTimeRange().
{ TimeRange * r=newTimeRange(0.0, 0.0); append(r); return *r; }
const TimeRange& GeopsyCore::TimeRangeList::at | ( | int | index | ) | const [inline] |
Reimplemented in GeopsyGui::TimeWindowList.
Referenced by remove(), LinearFKPassiveLoopTask::run(), FKLoopTask::run(), SPACLoopTask::run(), HRFKTimeWindows::setComponent(), FKTimeWindows::setComponent(), SpectrumStation::start(), HVStation::start(), and TimeRangeList().
{return *QList<TimeRange *>::at(index);}
TimeRange& GeopsyCore::TimeRangeList::at | ( | int | index | ) | [inline] |
Reimplemented in GeopsyGui::TimeWindowList.
{return *QList<TimeRange *>::operator[](index);}
iterator GeopsyCore::TimeRangeList::begin | ( | ) | [inline] |
Referenced by add(), clear(), RealTimeArrayManager::createTasks(), longestWindow(), timeRange(), toString(), ~TimeRangeList(), and GeopsyGui::TimeWindowList::~TimeWindowList().
{return QList<TimeRange *>::begin();}
const_iterator GeopsyCore::TimeRangeList::begin | ( | ) | const [inline] |
{return QList<TimeRange *>::begin();}
bool GeopsyCore::TimeRangeList::clear | ( | ) |
Returns false if it is already empty
References begin(), deleteTimeRange(), end(), internalClear(), isEmpty(), and TRACE.
Referenced by MonoStation::AbstractStation::clearAllWindows(), LinearFKActiveArrayStations::clearTimeWindows(), inverse(), and ArrayCore::ArrayProcess::setFrequency().
{ TRACE; if(isEmpty()) { return false; } else { for(iterator it=begin(); it!=end(); ++it) { deleteTimeRange(*it); } internalClear(); return true; } }
virtual TimeRange* GeopsyCore::TimeRangeList::cloneTimeRange | ( | TimeRange * | r | ) | [inline, protected, virtual] |
int GeopsyCore::TimeRangeList::count | ( | ) | const [inline] |
Referenced by MonoStation::AbstractStation::clearGrayWindows(), MonoStation::AbstractStation::hasGrayWindows(), remove(), GeopsyGui::TimeWindowList::resetColors(), LinearFKPassiveLoopTask::run(), FKLoopTask::run(), SPACLoopTask::run(), FKTimeWindows::setCurrentWindow(), ArrayCore::ArrayProcess::setFrequency(), MonoStation::AbstractStation::setWindowColors(), SpectrumStation::start(), HVStation::start(), TimeRangeList(), toString(), GeopsyGui::TimeWindowList::xml_setProperty(), and GeopsyGui::TimeWindowList::xml_writeProperties().
{return QList<TimeRange *>::count();}
virtual void GeopsyCore::TimeRangeList::deleteTimeRange | ( | TimeRange * | r | ) | [inline, protected, virtual] |
iterator GeopsyCore::TimeRangeList::end | ( | ) | [inline] |
Referenced by add(), clear(), RealTimeArrayManager::createTasks(), longestWindow(), timeRange(), toString(), ~TimeRangeList(), and GeopsyGui::TimeWindowList::~TimeWindowList().
{return QList<TimeRange *>::end();}
const_iterator GeopsyCore::TimeRangeList::end | ( | ) | const [inline] |
{return QList<TimeRange *>::end();}
void GeopsyCore::TimeRangeList::internalClear | ( | ) | [inline, protected] |
Referenced by clear(), ~TimeRangeList(), and GeopsyGui::TimeWindowList::~TimeWindowList().
void GeopsyCore::TimeRangeList::inverse | ( | double | frequency, |
const WindowingParameters & | param, | ||
const SparseKeepSignal & | keep, | ||
const TimeRange & | r, | ||
QString * | log | ||
) |
References add(), clear(), GeopsyCore::SparseKeepSignal::initValues(), GeopsyCore::WindowingParameters::overlap(), QGpCoreTools::tr(), and TRACE.
Referenced by MonoStation::AbstractStation::inverseWindows().
bool GeopsyCore::TimeRangeList::isEmpty | ( | ) | const [inline] |
Referenced by MonoStation::AbstractStation::addWindows(), clear(), RealTimeArrayManager::createTasks(), FKTimeWindows::setCurrentWindow(), and timeRange().
{return QList<TimeRange *>::isEmpty();}
double GeopsyCore::TimeRangeList::longestWindow | ( | ) | const |
virtual TimeRange* GeopsyCore::TimeRangeList::newTimeRange | ( | double | start, |
double | end | ||
) | [inline, protected, virtual] |
Reimplemented in GeopsyGui::TimeWindowList.
Referenced by add(), addOne(), and TimeRangeList().
{return new TimeRange(start, end);}
void GeopsyCore::TimeRangeList::remove | ( | const TimeRange & | globalRange, |
QString * | log | ||
) |
Remove all time windows inside or partially inside tw.
References at(), count(), deleteTimeRange(), GeopsyCore::TimeRange::end(), GeopsyCore::TimeRange::intersects(), GeopsyCore::TimeRange::start(), QGpCoreTools::tr(), and TRACE.
Referenced by MonoStation::AbstractStation::clearGrayWindows(), and MonoStation::AbstractStation::removeWindows().
void GeopsyCore::TimeRangeList::remove | ( | int | index, |
QString * | log | ||
) |
References at(), deleteTimeRange(), GeopsyCore::TimeRange::end(), GeopsyCore::TimeRange::start(), QGpCoreTools::tr(), and TRACE.
{ TRACE; TimeRange& r=at(index); if(log) { (*log)+= tr( "Removing window from %1 to %2 s.\n" ).arg(r.start()).arg(r.end()); } deleteTimeRange(&r); QList<TimeRange *>::removeAt(index); }
References begin(), GeopsyCore::TimeRange::end(), end(), isEmpty(), GeopsyCore::TimeRange::setEnd(), GeopsyCore::TimeRange::setStart(), GeopsyCore::TimeRange::start(), and TRACE.
Referenced by RealTimeArrayManager::createTasks().
{ TRACE; if(isEmpty()) return TimeRange(); const_iterator it=begin(); TimeRange globalRange=**it; for(it++;it!=end();++it) { const TimeRange& r=**it; if(r.start()<globalRange.start()) { globalRange.setStart(r.start()); } if(r.end()>globalRange.end()) { globalRange.setEnd(r.end()); } } return globalRange; }
QString GeopsyCore::TimeRangeList::toString | ( | ) | const |
References begin(), count(), GeopsyCore::TimeRange::end(), end(), GeopsyCore::TimeRange::lengthSeconds(), GeopsyCore::TimeRange::start(), str, QGpCoreTools::tr(), TRACE, and w.
Referenced by MonoStation::AbstractTool::setLog().
{ TRACE; QString str; str+="### Time Windows ###\n"; str+=tr("# Number= %1\n").arg(count()); str+=tr("# Start time \t End Time \t Window length\n"); for(const_iterator it=begin();it!=end();++it) { TimeRange& w=**it; str+=QString("%1\t%2\t%3\n").arg(w.start()).arg(w.end()).arg(w.lengthSeconds()); } str+="### End Time Windows ###\n"; return str; }