#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().