#include <CompatAutocorrCurves.h>
Public Types | |
enum | FrequencyRange { Complete, NoInitialFlat, FirstSlope } |
Public Member Functions | |
void | calculate (CompatDispersion &disp) |
CompatAutocorrCurves () | |
CompatAutocorrCurves (int modesCount, int radiusCount, int omegasCount) | |
CompatAutocorrCurves (const CompatAutocorrCurves *o) | |
CompatAutocorrCurves (const CompatAutocorrCurves *o, int modesCount) | |
int | omegasCount (int imode, int r) const |
int | omegasCount () const |
Returns the omega count. | |
double | radiusAverage (int i) const |
QVector< double > * | radiusAverage () const |
int | radiusCount () const |
double | radiusMax (int i) const |
double | radiusMin (int i) const |
void | radiusToReport (QDataStream &s) const |
uint | rayleighModesCount () |
void | reportToOmega (QDataStream &s) |
Loads the _omega from the binary stream (usually the inversion_report) | |
void | reportToRadius (QDataStream &s) |
void | reportToValues (QDataStream &s) |
void | resetAutocorr () |
void | resetValues () |
void | setRadius (QVector< double > &rmin, QVector< double > &rmax) |
void | setRadius (CompatAutocorrCurves *o) |
void | setRadius (QString radiusFile) |
void | setRadius (int r, double rmin, double rmax) |
void | setRangeType (FrequencyRange fr) |
void | setRayleighModesCount (int rm) |
void | setValue (int i, int r, int m, double value) |
int | toDistancePointVector (int imode, int iomega, Point2D *pointList) |
int | toPointVector (int imode, int iRadius, Point2D *pointList) |
void | toStream (FILE *f) |
double | value (int i, int r, int m) const |
void | valuesToReport (QDataStream &s) const |
virtual | ~CompatAutocorrCurves () |
Static Public Member Functions | |
static int | getRadiusCount (QString radiusFile) |
Protected Member Functions | |
void | allocatesRadius () |
void | allocatesValues () |
void | deleteValues () |
Protected Attributes | |
int | _radiusCount |
double * | _radiusMax |
double * | _radiusMin |
FrequencyRange | _rangeType |
uint | _rayleighModesCount |
double *** | _values |
Friends | |
class | CompatAutocorrData |
References _radiusCount, _radiusMax, _radiusMin, _rangeType, _rayleighModesCount, _values, Complete, and TRACE.
: CompatMultiModalFrequency() { TRACE; _values=0; _radiusCount=0; _radiusMin=0; _radiusMax=0; _rangeType=Complete; _rayleighModesCount=0; }
QGpCompatibility::CompatAutocorrCurves::CompatAutocorrCurves | ( | int | modesCount, |
int | radiusCount, | ||
int | omegasCount | ||
) |
References _radiusCount, _radiusMax, _radiusMin, _rangeType, _rayleighModesCount, _values, allocatesRadius(), allocatesValues(), Complete, radiusMax(), radiusMin(), and TRACE.
: CompatMultiModalFrequency(o) { TRACE; _radiusCount=o->_radiusCount; _radiusMin=0; _radiusMax=0; allocatesRadius(); // Copy the radius min and max for(int iRadius=0;iRadius<_radiusCount;iRadius++) { _radiusMin[iRadius]=o->radiusMin(iRadius); _radiusMax[iRadius]=o->radiusMax(iRadius); } _values=0; allocatesValues(); _rangeType=Complete; _rayleighModesCount=o->_rayleighModesCount; }
QGpCompatibility::CompatAutocorrCurves::CompatAutocorrCurves | ( | const CompatAutocorrCurves * | o, |
int | modesCount | ||
) |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, _radiusCount, _radiusMax, _radiusMin, _rangeType, _rayleighModesCount, _values, allocatesRadius(), allocatesValues(), Complete, radiusMax(), radiusMin(), and TRACE.
: CompatMultiModalFrequency(o, modesCount) { TRACE; _radiusCount=o->_radiusCount; _radiusMin=0; _radiusMax=0; allocatesRadius(); // Copy the radius min and max for(int iRadius=0;iRadius<_radiusCount;iRadius++) { _radiusMin[iRadius]=o->radiusMin(iRadius); _radiusMax[iRadius]=o->radiusMax(iRadius); } _values=0; allocatesValues(); _rangeType=Complete; _rayleighModesCount=o->_rayleighModesCount; if((int)_rayleighModesCount>_modesCount) _rayleighModesCount=_modesCount; }
References _radiusMax, _radiusMin, deleteValues(), and TRACE.
{ TRACE; deleteValues(); delete [] _radiusMin; delete [] _radiusMax; }
void QGpCompatibility::CompatAutocorrCurves::allocatesRadius | ( | ) | [protected] |
References _radiusCount, _radiusMax, _radiusMin, and TRACE.
Referenced by CompatAutocorrCurves(), and reportToRadius().
{ TRACE; delete [] _radiusMin; delete [] _radiusMax; _radiusMin=new double[_radiusCount]; _radiusMax=new double[_radiusCount]; }
void QGpCompatibility::CompatAutocorrCurves::allocatesValues | ( | ) | [protected] |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, deleteValues(), and TRACE.
Referenced by CompatAutocorrCurves(), and reportToOmega().
{ TRACE; ASSERT (_radiusCount>0); deleteValues(); _values=new double**[_modesCount]; for(int imode=0;imode<_modesCount;imode++) { double ** autocorrMode=new double*[_radiusCount]; _values[imode]=autocorrMode; for(int iradius=0; iradius<_radiusCount;iradius++) autocorrMode[iradius]=new double[_omegasCount]; } }
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegas, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _radiusMax, _radiusMin, _rangeType, _values, CompatAUTOCORR_INVALID_VALUE, Complete, FirstSlope, QGpCompatibility::CompatMultiModalFrequency::modesCount(), NoInitialFlat, TRACE, and QGpCompatibility::CompatMultiModalCurves::value().
{ TRACE; int maxMode=disp.modesCount(); if(maxMode>_modesCount) maxMode=_modesCount; int imode; for(imode=0;imode<maxMode;imode++) { double ** autocorrMode=_values[imode]; for(int iRadius=0;iRadius<_radiusCount;iRadius++) { double rmin=_radiusMin[iRadius]; double rmax=_radiusMax[iRadius]; double r0=0.5*(rmin+rmax); double dr=rmax-rmin; double arg0,arg1; double * autocorres =autocorrMode[iRadius]; // To make as Bruno Bettig, switch from SPAC to MSPAC if the radius range // is too large. Threshold is 2%. if(fabs(dr) < 0.02*r0) { for(int j=0;j<_omegasCount;j++) { /********************************************************/ /* nearly perfect ring - use original Aki's relation */ /* between averaged autocorrelation and Bessel function */ /********************************************************/ arg0=_omegas[j]*r0*disp.value(j,imode); switch (_rangeType) { case Complete: autocorres[j]=j0(arg0); break; case NoInitialFlat: if(arg0 < 0.4) autocorres[j]=CompatAUTOCORR_INVALID_VALUE; else autocorres[j]=j0(arg0); break; case FirstSlope: if(arg0 < 0.4 || arg0 > 3.2) autocorres[j]=CompatAUTOCORR_INVALID_VALUE; else autocorres[j]=j0(arg0); break; } } } else { double rFactor=r0*dr; double slow; for(int j=0;j<_omegasCount;j++) { slow=disp.value(j,imode); arg0= _omegas[j]*rmax*slow; arg1= _omegas[j]*rmin*slow; switch (_rangeType) { case Complete: autocorres[j]=(rmax*j1(arg0)-rmin*j1(arg1)) /(_omegas[j]*rFactor*slow); break; case NoInitialFlat: if(arg0 < 0.4 || arg1 < 0.4) autocorres[j]=CompatAUTOCORR_INVALID_VALUE; else autocorres[j]=(rmax*j1(arg0)-rmin*j1(arg1)) /(_omegas[j]*rFactor*slow); break; case FirstSlope: if(arg0 < 0.4 || arg0 > 3.2 || arg1 < 0.4 || arg1 > 3.2) autocorres[j]=CompatAUTOCORR_INVALID_VALUE; else autocorres[j]=(rmax*j1(arg0)-rmin*j1(arg1)) /(_omegas[j]*rFactor*slow); break; } } } } } // Dispersion contains less modes than this autocorr object, complete with invalid values for(imode=maxMode;imode<_modesCount;imode++) { double ** autocorrMode=_values[imode]; for(int iRadius=0;iRadius<_radiusCount;iRadius++) { double * autocorres =autocorrMode[iRadius]; for(int j=0;j<_omegasCount;j++) autocorres[j]=CompatAUTOCORR_INVALID_VALUE; } } }
void QGpCompatibility::CompatAutocorrCurves::deleteValues | ( | ) | [protected] |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, _radiusCount, _values, and TRACE.
Referenced by allocatesValues(), reportToOmega(), and ~CompatAutocorrCurves().
{ TRACE; if(_values) { for(int imode=0;imode<_modesCount;imode++) { double ** autocorrMode=_values[imode]; for(int radius=0; radius<_radiusCount;radius++) delete [] autocorrMode[radius]; delete [] _values[imode]; } delete [] _values; _values=0; } }
int QGpCompatibility::CompatAutocorrCurves::getRadiusCount | ( | QString | radiusFile | ) | [static] |
References radiusCount(), str, and TRACE.
Referenced by setRadius().
{ TRACE; QFile f(radiusFile); if(!f.open(QIODevice::ReadOnly)) { fprintf(stderr," **** Cannot open radius file\n"); return 0; } QTextStream s(&f); QString str; // Count radius int radiusCount=0; while(!s.atEnd()) { str=s.readLine().trimmed(); if(!str.isEmpty() && str.left(1)!="#") radiusCount++; } return radiusCount; }
int QGpCompatibility::CompatAutocorrCurves::omegasCount | ( | int | imode, |
int | r | ||
) | const |
References QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _values, CompatAUTOCORR_INVALID_VALUE, and TRACE.
{ TRACE; int n=0; double * autocorrValues=_values[imode][iradius]; for(int i=0;i<_omegasCount;i++) { if(autocorrValues[i]!=CompatAUTOCORR_INVALID_VALUE) n++; } return n; }
int QGpCompatibility::CompatAutocorrCurves::omegasCount | ( | ) | const [inline] |
Returns the omega count.
Reimplemented from QGpCompatibility::CompatMultiModalFrequency.
{return _omegasCount;}
double QGpCompatibility::CompatAutocorrCurves::radiusAverage | ( | int | i | ) | const [inline] |
{return (_radiusMax[i]+_radiusMin[i])/2;}
QVector< double > * QGpCompatibility::CompatAutocorrCurves::radiusAverage | ( | ) | const |
References _radiusCount.
Referenced by toDistancePointVector().
{ QVector<double> * list=new QVector<double>; list->reserve(_radiusCount); for(int i=0;i<_radiusCount;i++) list->push_back(radiusAverage(i)); return list; }
int QGpCompatibility::CompatAutocorrCurves::radiusCount | ( | ) | const [inline] |
Referenced by CompatAutocorrCurves(), getRadiusCount(), and QGpCompatibility::CompatAutocorrReport::radiusCount().
{return _radiusCount;}
double QGpCompatibility::CompatAutocorrCurves::radiusMax | ( | int | i | ) | const [inline] |
Referenced by CompatAutocorrCurves(), and QGpCompatibility::CompatAutocorrData::CompatAutocorrData().
{return _radiusMax[i];}
double QGpCompatibility::CompatAutocorrCurves::radiusMin | ( | int | i | ) | const [inline] |
Referenced by CompatAutocorrCurves(), and QGpCompatibility::CompatAutocorrData::CompatAutocorrData().
{return _radiusMin[i];}
void QGpCompatibility::CompatAutocorrCurves::radiusToReport | ( | QDataStream & | s | ) | const |
References _radiusCount, _radiusMax, _radiusMin, and TRACE.
Referenced by QGpCompatibility::CompatAutocorrData::dataToReport().
{ TRACE; s << _radiusCount; for(int i=0;i<_radiusCount;i++) { s << _radiusMin[i]; s << _radiusMax[i]; } }
uint QGpCompatibility::CompatAutocorrCurves::rayleighModesCount | ( | ) | [inline] |
void QGpCompatibility::CompatAutocorrCurves::reportToOmega | ( | QDataStream & | s | ) |
Loads the _omega from the binary stream (usually the inversion_report)
Reimplemented from QGpCompatibility::CompatMultiModalFrequency.
References allocatesValues(), deleteValues(), and TRACE.
Referenced by QGpCompatibility::CompatAutocorrReport::initCurrentAutocorr(), and QGpCompatibility::CompatAutocorrReport::loadAutocorr().
{ TRACE; deleteValues(); CompatMultiModalFrequency::reportToOmega(s); allocatesValues(); }
void QGpCompatibility::CompatAutocorrCurves::reportToRadius | ( | QDataStream & | s | ) |
References _radiusCount, _radiusMax, _radiusMin, allocatesRadius(), and TRACE.
Referenced by QGpCompatibility::CompatAutocorrReport::initCurrentAutocorr(), QGpCompatibility::CompatAutocorrReport::loadAutocorr(), and QGpCompatibility::CompatAutocorrData::reportToData().
{ TRACE; s >> _radiusCount; allocatesRadius(); for(int i=0;i<_radiusCount;i++) { s >> _radiusMin[i]; s >> _radiusMax[i]; } }
void QGpCompatibility::CompatAutocorrCurves::reportToValues | ( | QDataStream & | s | ) |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, _radiusCount, _values, and TRACE.
Referenced by QGpCompatibility::CompatAutocorrReport::loadAutocorr(), and QGpCompatibility::CompatAutocorrReport::loadAutocorrOnly().
{ TRACE; ASSERT(_values!=0); for(int imode=0; imode<_modesCount;imode++) { double ** autocorrMode=_values[imode]; for(int iRadius=0; iRadius<_radiusCount;iRadius++) { //s.readRawData((char *)autocorrMode[iRadius],_omegasCount*sizeof(double)); double * autocorrValues=autocorrMode[iRadius]; for(int i=0;i<_omegasCount;i++) s >> autocorrValues[i]; } } }
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, and TRACE.
{ TRACE; for(int imode=0; imode<_modesCount;imode++) { double ** autocorrMode=_values[imode]; for(int radius=0; radius<_radiusCount;radius++) { double * autocorrValues=autocorrMode[radius]; for(int i=0;i<_omegasCount;i++) autocorrValues[i]=CompatAUTOCORR_INVALID_VALUE; } } }
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, mode, and TRACE.
{ TRACE; for(int mode=0; mode<_modesCount;mode++) { double ** valuesMode=_values[mode]; for(int iradius=0; iradius<_radiusCount;iradius++) { double * values=valuesMode[iradius]; for(int i=0;i<_omegasCount;i++) values[i]=CompatAUTOCORR_INVALID_VALUE; } } }
void QGpCompatibility::CompatAutocorrCurves::setRadius | ( | QVector< double > & | rmin, |
QVector< double > & | rmax | ||
) |
References _radiusCount, _radiusMax, _radiusMin, and TRACE.
{ TRACE; ASSERT ((int)rmin.count()==_radiusCount && (int)rmax.count()==_radiusCount); for(int i=0;i<_radiusCount;i++) { _radiusMin[i]=rmin[i]; _radiusMax[i]=rmax[i]; } }
References _radiusCount, _radiusMax, _radiusMin, and TRACE.
{ TRACE; ASSERT(_radiusCount==o->_radiusCount); for(int iradius=0; iradius<_radiusCount;iradius++) { _radiusMin[iradius] =o->_radiusMin[iradius]; _radiusMax[iradius] =o->_radiusMax[iradius]; } }
void QGpCompatibility::CompatAutocorrCurves::setRadius | ( | QString | radiusFile | ) |
References _radiusCount, _radiusMax, _radiusMin, getRadiusCount(), str, and TRACE.
{ TRACE; ASSERT(getRadiusCount(radiusFile)==_radiusCount); QFile f(radiusFile); if(!f.open(QIODevice::ReadOnly)) { fprintf(stderr," **** Cannot open radius file\n"); return; } QTextStream s(&f); QString str; int iRadius=0; while(!s.atEnd()) { str=s.readLine().trimmed(); if(!str.isEmpty() && str.left(1)!="#") { _radiusMin[iRadius]=str.section(QRegExp("[ \t]"),0,0).toDouble(); _radiusMax[iRadius]=str.section(QRegExp("[ \t]"),1,1).toDouble(); iRadius++; } } }
void QGpCompatibility::CompatAutocorrCurves::setRadius | ( | int | r, |
double | rmin, | ||
double | rmax | ||
) | [inline] |
{_radiusMin[r]=rmin;_radiusMax[r]=rmax;}
void QGpCompatibility::CompatAutocorrCurves::setRangeType | ( | FrequencyRange | fr | ) | [inline] |
{_rangeType=fr;}
void QGpCompatibility::CompatAutocorrCurves::setRayleighModesCount | ( | int | rm | ) | [inline] |
Referenced by QGpCompatibility::CompatAutocorrReport::initCurrentAutocorr(), and QGpCompatibility::CompatAutocorrReport::loadAutocorrGoal().
{ if(rm<=_modesCount) _rayleighModesCount=rm; }
void QGpCompatibility::CompatAutocorrCurves::setValue | ( | int | i, |
int | r, | ||
int | m, | ||
double | value | ||
) | [inline] |
int QGpCompatibility::CompatAutocorrCurves::toDistancePointVector | ( | int | imode, |
int | iomega, | ||
Point2D * | pointList | ||
) |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, radiusAverage(), and TRACE.
{ TRACE; if(imode>=_modesCount || iomega>=_omegasCount) return 0; double ** autocorrValues=_values[imode]; int count=_radiusCount; for(int i=0;i<_radiusCount;i++) { double val=autocorrValues[i][iomega]; if(val!=CompatAUTOCORR_INVALID_VALUE) *(pointList++)=Point2D(radiusAverage(i),val); else count--; } return count; }
int QGpCompatibility::CompatAutocorrCurves::toPointVector | ( | int | imode, |
int | iRadius, | ||
Point2D * | pointList | ||
) |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegas, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, TRACE, and twopi.
{ TRACE; if(imode>=_modesCount || iradius>=_radiusCount) return 0; double * autocorrValues=_values[imode][iradius]; int count=_omegasCount; for(int i=0;i<_omegasCount;i++) { double val=autocorrValues[i]; if(val!=CompatAUTOCORR_INVALID_VALUE) *(pointList++)=Point2D(_omegas[i]/twopi,val); else count--; } return count; }
void QGpCompatibility::CompatAutocorrCurves::toStream | ( | FILE * | f | ) |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegas, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, CompatAUTOCORR_INVALID_VALUE, TRACE, and twopi.
{ TRACE; for(int imode=0; imode<_modesCount;imode++) { double ** autocorrMode=_values[imode]; for(int radius=0; radius<_radiusCount;radius++) { double * autocorrValues=autocorrMode[radius]; for(int i=0;i<_omegasCount;i++) { if(autocorrValues[i]!=CompatAUTOCORR_INVALID_VALUE) { fprintf(f,"%lf %lf\n",twopi/_omegas[i],autocorrValues[i]); } } fprintf(f,">\n"); } } }
double QGpCompatibility::CompatAutocorrCurves::value | ( | int | i, |
int | r, | ||
int | m | ||
) | const [inline] |
{return _values[m][r][i];}
void QGpCompatibility::CompatAutocorrCurves::valuesToReport | ( | QDataStream & | s | ) | const |
References QGpCompatibility::CompatMultiModalFrequency::_modesCount, QGpCompatibility::CompatMultiModalFrequency::_omegasCount, _radiusCount, _values, and TRACE.
Referenced by QGpCompatibility::CompatAutocorrReport::addModel().
{ TRACE; for(int imode=0; imode<_modesCount;imode++) { double ** autocorrMode=_values[imode]; for(int iRadius=0; iRadius<_radiusCount;iRadius++) { //s.writeRawData((char *)autocorrMode[iRadius],_omegasCount*sizeof(double)); double * autocorrValues=autocorrMode[iRadius]; for(int i=0;i<_omegasCount;i++) s << autocorrValues[i]; } } }
friend class CompatAutocorrData [friend] |
int QGpCompatibility::CompatAutocorrCurves::_radiusCount [protected] |
Referenced by QGpCompatibility::CompatAutocorrData::allocatesData(), allocatesRadius(), allocatesValues(), calculate(), CompatAutocorrCurves(), QGpCompatibility::CompatAutocorrData::CompatAutocorrData(), QGpCompatibility::CompatAutocorrData::dataToReport(), QGpCompatibility::CompatAutocorrData::deleteData(), deleteValues(), QGpCompatibility::CompatAutocorrData::distanceMeasurements(), QGpCompatibility::CompatAutocorrData::distanceStddev(), QGpCompatibility::CompatAutocorrData::isSameData(), QGpCompatibility::CompatAutocorrData::measurements(), radiusAverage(), radiusToReport(), QGpCompatibility::CompatAutocorrData::reportToData(), QGpCompatibility::CompatAutocorrData::reportToDataWeight(), reportToRadius(), reportToValues(), resetAutocorr(), resetValues(), setRadius(), QGpCompatibility::CompatAutocorrData::stddev(), toDistancePointVector(), toPointVector(), toStream(), QGpCompatibility::CompatAutocorrData::valuesToData(), valuesToReport(), and QGpCompatibility::CompatAutocorrData::weight().
double* QGpCompatibility::CompatAutocorrCurves::_radiusMax [protected] |
double* QGpCompatibility::CompatAutocorrCurves::_radiusMin [protected] |
Referenced by calculate(), and CompatAutocorrCurves().
uint QGpCompatibility::CompatAutocorrCurves::_rayleighModesCount [protected] |
Referenced by CompatAutocorrCurves().
double*** QGpCompatibility::CompatAutocorrCurves::_values [protected] |
Referenced by allocatesValues(), calculate(), CompatAutocorrCurves(), QGpCompatibility::CompatAutocorrData::CompatAutocorrData(), deleteValues(), omegasCount(), reportToValues(), resetAutocorr(), resetValues(), toDistancePointVector(), toPointVector(), toStream(), QGpCompatibility::CompatAutocorrData::valuesToData(), and valuesToReport().