QseAverager Class Reference

#include <qseaverager.h>

Inheritance diagram for QseAverager:

Inheritance graph
[legend]
Collaboration diagram for QseAverager:

Collaboration graph
[legend]

List of all members.

Signals

void message (const QString &msg)

Public Member Functions

 QseAverager (QObject *parent=0)
 ~QseAverager ()
void exec (QseDataSet *in, QseAveragerRole *r, QseDataSet *out)
void normalizeScan (QseDataSet *in, QseAveragerRole *r, QseScan *out, int n)
bool addScans (QseScan *s1, const QseScan *s2)
bool divideScan (QseScan *s, double v)
void mergeHeaders (QseScan *s1, const QseScan *s2)


Detailed Description

Definition at line 11 of file qseaverager.h.


Constructor & Destructor Documentation

QseAverager::QseAverager ( QObject parent = 0  ) 

Definition at line 8 of file qseaverager.cpp.

00009         : QObject(parent)
00010 {}

QseAverager::~QseAverager (  ) 

Definition at line 12 of file qseaverager.cpp.

00013 {}


Member Function Documentation

void QseAverager::exec ( QseDataSet in,
QseAveragerRole r,
QseDataSet out 
)

Definition at line 15 of file qseaverager.cpp.

References normalizeScan().

Referenced by QseController::runNormalizer().

00018 {
00019   outFile -> clear();
00020 
00021   int ns = inFile -> scanCount();
00022 
00023   for (int s = 0; s < ns; s++) {
00024     QseScan *sc = inFile -> scan(s);
00025 
00026     if (role -> matchesScan(sc)) {
00027       QseScan *osc = outFile -> appendScan();
00028 
00029       normalizeScan(inFile, role, osc, s);
00030     }
00031   }
00032 
00033   outFile -> emitLoadCompleted();
00034 }

Here is the call graph for this function:

void QseAverager::normalizeScan ( QseDataSet in,
QseAveragerRole r,
QseScan out,
int  n 
)

Definition at line 40 of file qseaverager.cpp.

References QseAveragerRole::energyScalingRatio(), mergeHeaders(), message(), QseDataSet::scan(), and QseScan::scanNumber().

Referenced by exec(), and QseController::updateGraphs().

00044 {
00045   QseScan *sc = inFile->scan(n);
00046 
00047   if (sc) {
00048     int nc = sc -> columnCount();
00049     int energycol = -1;
00050 
00051     for (int c = 0; c < nc; c++) {
00052       QseColumn *col = sc -> column(c);
00053 
00054       if (role -> matchesEnergyColumn(col)) {
00055   energycol = c;
00056       }
00057     }
00058 
00059     if (energycol < 0) {
00060       emit message(QString("No energy column found for scan %1").arg(n));
00061     } else {
00062       mergeHeaders(osc, sc);
00063 
00064       osc -> setScanNumber(sc->scanNumber());
00065 
00066       QseColumn *energy = osc -> appendColumn("Energy", sc -> column(energycol));
00067       QseColumn *normal = osc -> appendColumn("Norm");
00068       QseColumn *detect = osc -> appendColumn("Detector");
00069       QseColumn *seconds = osc -> appendColumn("Seconds");
00070 
00071       energy -> multiplication(role->energyScalingRatio());
00072 
00073       int nnorm = 0, ndet = 0, nsecs = 0;
00074       
00075       for (int c = 0; c < nc; c++) {
00076   QseColumn *col = sc -> column(c);
00077 
00078   if (role -> matchesNormalizationColumn(col)) {
00079     nnorm += 1;
00080     normal -> addition(col);
00081   } else if (role -> matchesDetectorColumn(col)) {
00082     ndet += 1;
00083     detect -> addition(col);
00084   } else if (role -> matchesSecondsColumn(col)) {
00085     nsecs += 1;
00086     seconds -> addition(col);
00087   }
00088       }
00089       
00090       if (nnorm > 0) {
00091   QseColumn *ratio = osc -> appendColumn("Ratio", detect);
00092   
00093   ratio -> division(normal);
00094   
00095   emit message(QString("Scan %1 had %2 detector columns, was normalized by %3 ion chambers").arg(n).arg(ndet).arg(nnorm));
00096       } else if (nsecs > 0) {
00097   QseColumn *ratio = osc -> appendColumn("Ratio", detect);
00098   
00099   ratio -> division(seconds);
00100   emit message(QString("Scan %1 had %2 detector columns, was normalized by counting time").arg(n).arg(ndet));
00101       } else {
00102   QseColumn *ratio = osc -> appendColumn("Ratio", detect);
00103   
00104   emit message(QString("Scan %1 had %2 detector columns, no normalization performed").arg(n).arg(ndet));
00105       }
00106     }
00107   }
00108 }

Here is the call graph for this function:

bool QseAverager::addScans ( QseScan s1,
const QseScan s2 
)

Definition at line 110 of file qseaverager.cpp.

References QseScan::appendColumn(), QseScan::column(), QseScan::columnCount(), mergeHeaders(), message(), QseColumn::name(), QseColumn::rowCount(), and QseScan::scanCommand().

00111 {
00112   if (s1 && s2) {
00113     int nc1 = s1->columnCount();
00114     int nc2 = s2->columnCount();
00115 
00116     if (nc1 == 0) {
00117       for (int c = 0; c < nc2; c++) {
00118   QseColumn *c2 = s2->column(c);
00119   QseColumn *c1 = s1->appendColumn(c2->name(), c2);
00120       }
00121 
00122       mergeHeaders(s1, s2);
00123 
00124       emit message(QString("Started new average with scan %1").arg(s1->scanCommand()));
00125 
00126       return true;
00127     } else {
00128       if (nc1 != nc2) {
00129   emit message(QString("Scans have different numbers of columns (%1,%2)").arg(nc1).arg(nc2));
00130   return false;
00131       }
00132       
00133       for (int c = 0; c < nc1; c++) {
00134   QseColumn *c1 = s1->column(c);
00135   QseColumn *c2 = s2->column(c);
00136 
00137   if (c1 && c2) {
00138     int nr1 = c1->rowCount();
00139     int nr2 = c2->rowCount();
00140     
00141     if (nr1 != nr2) {
00142       emit message(QString("Scan columns have differing numbers of points"));
00143       return false;
00144     }
00145   } else {
00146     emit message(QString("Scan column missing in one or other scan"));
00147     return false;
00148   }
00149       }
00150 
00151       for (int c = 0; c < nc1; c++) {
00152   QseColumn *c1 = s1->column(c);
00153   QseColumn *c2 = s2->column(c);
00154   
00155   if (c1 && c2) {
00156     c1 -> addition(c2);
00157   }
00158       }
00159 
00160       mergeHeaders(s1, s2);
00161 
00162       emit message(QString("Scan %1 added to scan %2").arg(s2->scanCommand()).arg(s1->scanCommand()));
00163 
00164       return true;
00165     }
00166   } else {
00167     emit message(QString("Scan was missing"));
00168     return false;
00169   }
00170 }

Here is the call graph for this function:

bool QseAverager::divideScan ( QseScan s,
double  v 
)

Definition at line 172 of file qseaverager.cpp.

References QseScan::column(), QseScan::columnCount(), and QseColumn::division().

00173 {
00174   if (s) {
00175     int nc = s->columnCount();
00176 
00177     for (int c = 0; c < nc; c++) {
00178       QseColumn *col = s->column(c);
00179 
00180       if (col) {
00181   col->division(v);
00182       }
00183     }
00184 
00185     return true;
00186   } else {
00187     return false;
00188   }
00189 }

Here is the call graph for this function:

void QseAverager::mergeHeaders ( QseScan s1,
const QseScan s2 
)

Definition at line 191 of file qseaverager.cpp.

References QseScan::header(), QseScan::mergeHeaders(), QseScan::name(), QseScan::setName(), and QseScan::setScanDateTime().

Referenced by addScans(), and normalizeScan().

00192 {
00193   if (s1 && s2) {
00194 //     printf("set name %s\n", qPrintable(s2->name()));
00195     s1->setName(s2->name());
00196     s1->mergeHeaders(s2->header());
00197     s1->setScanDateTime(QDateTime::currentDateTime());
00198   }
00199 }

Here is the call graph for this function:

void QseAverager::message ( const QString &  msg  )  [signal]

Referenced by addScans(), and normalizeScan().


The documentation for this class was generated from the following files:

Generated on Fri May 2 16:26:41 2008 for QSE by  doxygen 1.5.5