Ksetiwatch API Documentation


loggedsigs.cpp

Go to the documentation of this file.
00001 /***************************************************************************/
00014 #include <qpushbutton.h>
00015 #include <qlistview.h>
00016 #include <qtabwidget.h>
00017 #include <qtextview.h>
00018 #include <qpainter.h>
00019 #include <qlabel.h>
00020 
00021 #include <klocale.h>
00022 #include <kapp.h>
00023 #include <kfiledialog.h>
00024 #include <kmessagebox.h>
00025 #include <ksimpleconfig.h>
00026 #include <kiconloader.h>
00027 
00028 #include "ksetiwatch.h"
00029 #include "seticontainer.h"
00030 #include "setiloc.h"
00031 #include "loggedsigs.h"
00032 #include "gaussianplot.h"
00033 #include "pulseplot.h"
00034 #include "tripletplot.h"
00035 
00036 /*------------------------------------------------------------------------ */
00038 QString SpikeListViewItem::key(int column, bool) const
00039 {
00040 // return value must be static
00041 static QString ret;
00042 QString val;
00043 double tmp;
00044 
00045 val = text(column);
00046 tmp = val.toDouble();
00047 val.sprintf("%f", tmp);
00048 ret = val.rightJustify(32, '0');
00049 
00050 return(ret);
00051 }
00052 
00053 /*------------------------------------------------------------------------ */
00054 LoggedSigs::LoggedSigs(const QString& locName, const QString& wu,
00055                        QWidget* parent, const char* name)
00056           : LoggedSigsTmpl(parent, name, false, WDestructiveClose)
00057 {
00058 Ksetiwatch::TableColumn spcols[] =
00059   {
00060   {i18n("Power"), -1, AlignRight},
00061   {i18n("Resolution"), -1, AlignRight},
00062   {i18n("Signal Ratio"), -1, AlignRight},
00063   {i18n("RA"), 50, AlignRight},
00064   {i18n("Dec"), 50, AlignRight},
00065   {i18n("Frequency"), -1, AlignRight},
00066   {i18n("Chirp Rate"), -1, AlignRight}
00067   };
00068 
00069 location = Ksetiwatch::getLocation(locName);
00070 wuname   = wu;
00071 setCaption(i18n("Work Unit %1: Logged Signals").arg(wuname));
00072 
00073 SpikeListView->setShowSortIndicator(false);
00074 SpikeListView->addColumn( i18n( "Power" ) );
00075 SpikeListView->addColumn( i18n( "Resolution" ) );
00076 SpikeListView->addColumn( i18n( "Signal Ratio" ) );
00077 SpikeListView->addColumn( i18n( "RA" ) );
00078 SpikeListView->addColumn( i18n( "Dec" ) );
00079 SpikeListView->addColumn( i18n( "Frequency" ) );
00080 SpikeListView->addColumn( i18n( "Chirp Rate" ) );
00081 
00082 GaussianView->setName(wuname);
00083 GaussianView->showInfoText(false);
00084 PulseView->setName(wuname);
00085 PulseView->showInfoText(false);
00086 TripletView->setName(wuname);
00087 TripletView->showInfoText(false);
00088 
00089 // default size
00090 resize(520, 300);
00091 
00092 // set the pixmaps of the navigation buttons
00093 FirstGaussianBtn->setPixmap(SmallIcon("start"));
00094 PreviousGaussianBtn->setPixmap(SmallIcon("back"));
00095 NextGaussianBtn->setPixmap(SmallIcon("forward"));
00096 LastGaussianBtn->setPixmap(SmallIcon("finish"));
00097 FirstPulseBtn->setPixmap(SmallIcon("start"));
00098 PreviousPulseBtn->setPixmap(SmallIcon("back"));
00099 NextPulseBtn->setPixmap(SmallIcon("forward"));
00100 LastPulseBtn->setPixmap(SmallIcon("finish"));
00101 FirstTripletBtn->setPixmap(SmallIcon("start"));
00102 PreviousTripletBtn->setPixmap(SmallIcon("back"));
00103 NextTripletBtn->setPixmap(SmallIcon("forward"));
00104 LastTripletBtn->setPixmap(SmallIcon("finish"));
00105 
00106 // right-align the columns in the spike list (Qt Designer can't handle
00107 // this (yet))
00108 for(int i=0; i<SpikeListView->columns(); i++)
00109   {
00110   if(spcols[i].width != -1)  SpikeListView->setColumnWidth(i, spcols[i].width);
00111   SpikeListView->setColumnAlignment(i, spcols[i].alignment);
00112   }
00113 
00114 spikeList.setAutoDelete(true);
00115 gaussianList.setAutoDelete(true);
00116 pulseList.setAutoDelete(true);
00117 tripletList.setAutoDelete(true);
00118 
00119 readLoggedSigs();
00120 slotFillSpikeTable();
00121 slotShowFirstSignals();
00122 }
00123 
00124 /*------------------------------------------------------------------------ */
00125 LoggedSigs::~LoggedSigs()
00126 {
00127 clearLists();
00128 }
00129 
00130 /*------------------------------------------------------------------------ */
00131 void LoggedSigs::paintEvent(QPaintEvent* e)
00132 {
00133 SpikeListView->setGridEnabled(globalopts->DrawGrid);
00134 QWidget::paintEvent(e);
00135 }
00136 
00137 /*------------------------------------------------------------------------ */
00138 void LoggedSigs::slotShowHelp()
00139 {
00140 kapp->invokeHelp("logsigs_id");
00141 }
00142 
00143 /*------------------------------------------------------------------------ */
00144 void LoggedSigs::clearLists()
00145 {
00146 spikeList.clear();
00147 gaussianList.clear();
00148 pulseList.clear();
00149 tripletList.clear();
00150 }
00151 
00152 /*------------------------------------------------------------------------ */
00153 bool LoggedSigs::readLoggedSigs()
00154 {
00155 bool status = false;
00156 KSimpleConfig log(location->logDirectory() + "/" + ResultLogFileName, true);
00157 QString sigId[4] = {"spike", "gaussian", "pulse", "triplet"};
00158 enum sigIdNum {SigSpike=0, SigGaussian=1, SigPulse=2, SigTriplet=3};
00159 
00160 if(!wuname.isNull() && !wuname.isEmpty())
00161   {
00162   log.setGroup(wuname);
00163 
00164   for(int i=0;i<4;i++)
00165     {
00166     QString sig, no;
00167     bool finished = false;
00168     int k = 1;
00169     while(!finished)
00170       {
00171       no.sprintf("%02d", k);
00172       sig = log.readEntry(sigId[i]+no);
00173       if(sig.isNull())
00174         finished = true;
00175       else
00176         {
00177         switch(i)
00178           {
00179           case SigSpike:
00180             {
00181             SpikeScore* spsc = new SpikeScore;
00182             *spsc = SetiLoc::loggedSpikeSignal(sig);
00183             spikeList.append(spsc);
00184             break;
00185             }
00186           case SigGaussian:
00187             {
00188             GaussianScore* gasc = new GaussianScore;
00189             *gasc = SetiLoc::loggedGaussianSignal(sig);
00190             gaussianList.append(gasc);
00191             break;
00192             }
00193           case SigPulse:
00194             {
00195             PulseScore* pusc = new PulseScore;
00196             *pusc = SetiLoc::loggedPulseSignal(sig);
00197             pulseList.append(pusc);
00198             break;
00199             }
00200           case SigTriplet:
00201             {
00202             TripletScore* trsc = new TripletScore;
00203             *trsc = SetiLoc::loggedTripletSignal(sig);
00204             tripletList.append(trsc);
00205             break;
00206             }
00207           }
00208         }
00209       k++;
00210       }
00211     }
00212   status = true;
00213   }
00214 return(status);
00215 }
00216 
00217 /*------------------------------------------------------------------------ */
00218 void LoggedSigs::slotFillSpikeTable()
00219 {
00220 SpikeListView->clear();
00221 
00222 for(SpikeScore* sp=spikeList.first(); sp != 0; sp = spikeList.next())
00223   {
00224   SpikeListViewItem* it = new SpikeListViewItem(SpikeListView);
00225   it->setText(0, " " + ((sp->power > 1.0e6) ?
00226                  QString::number(sp->power, 'e', 6) :
00227                  QString::number(sp->power, 'f', 3)));
00228   it->setText(1, QString::number(SliceFrequency/sp->fft_len, 'f', 3));
00229   double ratio = (sp->power*MaxFFTLen)/(8*sp->fft_len);
00230   it->setText(2, " " + ((ratio > 1.0e6) ?
00231                  QString::number(ratio, 'e', 6) :
00232                  QString::number(ratio, 'f', 3)));
00233   it->setText(3, QString::number(sp->ra, 'f', 2));
00234   it->setText(4, QString::number(sp->dec, 'f', 2));
00235   it->setText(5, " " + QString::number(sp->frequency/1.0e9, 'f', 9));
00236   it->setText(6, QString::number(sp->chirprate, 'f', 4));
00237   }
00238 }
00239 
00240 /*------------------------------------------------------------------------ */
00241 void LoggedSigs::slotShowFirstSignals()
00242 {
00243 if(gaussianList.count() > 0)
00244   {
00245   GaussianView->showNewGaussianData(*gaussianList.first());
00246   setGaussianText(gaussianList.at());
00247   }
00248 if(pulseList.count() > 0)
00249   {
00250   PulseView->showNewPulseData(*pulseList.first());
00251   setPulseText(pulseList.at());
00252   }
00253 if(tripletList.count() > 0)
00254   {
00255   TripletView->showNewTripletData(*tripletList.first());
00256   setTripletText(tripletList.at());
00257   }
00258 changeGaussianBtnState();
00259 changePulseBtnState();
00260 changeTripletBtnState();
00261 }
00262 
00263 /*------------------------------------------------------------------------ */
00264 void LoggedSigs::changeGaussianBtnState()
00265 {
00266 int curSig = gaussianList.at()+1;
00267 int numSig = gaussianList.count();
00268 
00269 if(curSig <= 1)
00270   {
00271   FirstGaussianBtn->setEnabled(false);
00272   PreviousGaussianBtn->setEnabled(false);
00273   }
00274 else
00275   {
00276   FirstGaussianBtn->setEnabled(true);
00277   PreviousGaussianBtn->setEnabled(true);
00278   }
00279 if(numSig > 1)
00280   {
00281   if(curSig == numSig)
00282     {
00283     LastGaussianBtn->setEnabled(false);
00284     NextGaussianBtn->setEnabled(false);
00285     }
00286   else
00287     {
00288     LastGaussianBtn->setEnabled(true);
00289     NextGaussianBtn->setEnabled(true);
00290     }
00291   }
00292 else
00293   {
00294   LastGaussianBtn->setEnabled(false);
00295   NextGaussianBtn->setEnabled(false);
00296   }
00297 GaussianLbl->setText(i18n("%1 of %2").arg(curSig).arg(numSig));
00298 }
00299 
00300 /*------------------------------------------------------------------------ */
00301 void LoggedSigs::changePulseBtnState()
00302 {
00303 int curSig = pulseList.at()+1;
00304 int numSig = pulseList.count();
00305 
00306 if(curSig <= 1)
00307   {
00308   FirstPulseBtn->setEnabled(false);
00309   PreviousPulseBtn->setEnabled(false);
00310   }
00311 else
00312   {
00313   FirstPulseBtn->setEnabled(true);
00314   PreviousPulseBtn->setEnabled(true);
00315   }
00316 if(numSig > 1)
00317   {
00318   if(curSig == numSig)
00319     {
00320     LastPulseBtn->setEnabled(false);
00321     NextPulseBtn->setEnabled(false);
00322     }
00323   else
00324     {
00325     LastPulseBtn->setEnabled(true);
00326     NextPulseBtn->setEnabled(true);
00327     }
00328   }
00329 else
00330   {
00331   LastPulseBtn->setEnabled(false);
00332   NextPulseBtn->setEnabled(false);
00333   }
00334 PulseLbl->setText(i18n("%1 of %2").arg(curSig).arg(numSig));
00335 }
00336 
00337 /*------------------------------------------------------------------------ */
00338 void LoggedSigs::changeTripletBtnState()
00339 {
00340 int curSig = tripletList.at()+1;
00341 int numSig = tripletList.count();
00342 
00343 if(curSig <= 1)
00344   {
00345   FirstTripletBtn->setEnabled(false);
00346   PreviousTripletBtn->setEnabled(false);
00347   }
00348 else
00349   {
00350   FirstTripletBtn->setEnabled(true);
00351   PreviousTripletBtn->setEnabled(true);
00352   }
00353 if(numSig > 1)
00354   {
00355   if(curSig == numSig)
00356     {
00357     LastTripletBtn->setEnabled(false);
00358     NextTripletBtn->setEnabled(false);
00359     }
00360   else
00361     {
00362     LastTripletBtn->setEnabled(true);
00363     NextTripletBtn->setEnabled(true);
00364     }
00365   }
00366 else
00367   {
00368   LastTripletBtn->setEnabled(false);
00369   NextTripletBtn->setEnabled(false);
00370   }
00371 TripletLbl->setText(i18n("%1 of %2").arg(curSig).arg(numSig));
00372 }
00373 
00374 /*------------------------------------------------------------------------ */
00375 void LoggedSigs::slotNextSignal()
00376 {
00377 int tab = SigTabs->currentPageIndex();
00378 
00379 switch(tab)
00380   {
00381   case 1: // Gaussian
00382     GaussianView->showNewGaussianData(*gaussianList.next());
00383     setGaussianText(gaussianList.at());
00384     changeGaussianBtnState();
00385     break;
00386   case 2: // Pulse
00387     PulseView->showNewPulseData(*pulseList.next());
00388     setPulseText(pulseList.at());
00389     changePulseBtnState();
00390     break;
00391   case 3: // Triplet
00392     TripletView->showNewTripletData(*tripletList.next());
00393     setTripletText(tripletList.at());
00394     changeTripletBtnState();
00395     break;
00396   }
00397 }
00398 
00399 /*------------------------------------------------------------------------ */
00400 void LoggedSigs::slotPreviousSignal()
00401 {
00402 int tab = SigTabs->currentPageIndex();
00403 
00404 switch(tab)
00405   {
00406   case 1: // Gaussian
00407     GaussianView->showNewGaussianData(*gaussianList.prev());
00408     setGaussianText(gaussianList.at());
00409     changeGaussianBtnState();
00410     break;
00411   case 2: // Pulse
00412     PulseView->showNewPulseData(*pulseList.prev());
00413     setPulseText(pulseList.at());
00414     changePulseBtnState();
00415     break;
00416   case 3: // Triplet
00417     TripletView->showNewTripletData(*tripletList.prev());
00418     setTripletText(tripletList.at());
00419     changeTripletBtnState();
00420     break;
00421   }
00422 }
00423 
00424 /*------------------------------------------------------------------------ */
00425 void LoggedSigs::slotFirstSignal()
00426 {
00427 int tab = SigTabs->currentPageIndex();
00428 
00429 switch(tab)
00430   {
00431   case 1: // Gaussian
00432     GaussianView->showNewGaussianData(*gaussianList.first());
00433     setGaussianText(gaussianList.at());
00434     changeGaussianBtnState();
00435     break;
00436   case 2: // Pulse
00437     PulseView->showNewPulseData(*pulseList.first());
00438     setPulseText(pulseList.at());
00439     changePulseBtnState();
00440     break;
00441   case 3: // Triplet
00442     TripletView->showNewTripletData(*tripletList.first());
00443     setTripletText(tripletList.at());
00444     changeTripletBtnState();
00445     break;
00446   }
00447 }
00448 
00449 /*------------------------------------------------------------------------ */
00450 void LoggedSigs::slotLastSignal()
00451 {
00452 int tab = SigTabs->currentPageIndex();
00453 
00454 switch(tab)
00455   {
00456   case 1: // Gaussian
00457     GaussianView->showNewGaussianData(*gaussianList.last());
00458     setGaussianText(gaussianList.at());
00459     changeGaussianBtnState();
00460     break;
00461   case 2: // Pulse
00462     PulseView->showNewPulseData(*pulseList.last());
00463     setPulseText(pulseList.at());
00464     changePulseBtnState();
00465     break;
00466   case 3: // Triplet
00467     TripletView->showNewTripletData(*tripletList.last());
00468     setTripletText(tripletList.at());
00469     changeTripletBtnState();
00470     break;
00471   }
00472 }
00473 
00474 /*------------------------------------------------------------------------ */
00475 void LoggedSigs::setGaussianText(int idx)
00476 {
00477 QString txt;
00478 GaussianScore* g = gaussianList.at(idx);
00479 
00480 txt = i18n("<b><u>Gaussian Data:</u></b><br>"
00481            "<table>"
00482            "<tr><td>Power:</td><td>%1</td></tr>"
00483            "<tr><td>Mean:</td><td>%2</td></tr>"
00484            "<tr><td>Sigma:</td><td>%3</td></tr>"
00485            "<tr><td>Fit:</td><td>%4</td></tr>"
00486            "<tr><td><b>Score:</b></td><td><b>%5</b></td></tr>"
00487            "<tr><td>RA:</td><td>%6</td></tr>"
00488            "<tr><td>Dec:</td><td>%7</td></tr>"
00489            "<tr><td>Freq:</td><td>%8 GHz</td></tr>"
00490            "<tr><td>Chirp:</td><td>%9 Hz/s</td></tr>"
00491            "</table>")
00492            .arg(g->power)
00493            .arg(g->true_mean)
00494            .arg(g->sigma)
00495            .arg(g->chisq)
00496            .arg(g->score)
00497            .arg(SetiContainer::convertRAToString(g->ra))
00498            .arg(SetiContainer::convertDecToString(g->dec))
00499            .arg(g->frequency/1.0e9, 0, 'f', 9)
00500            .arg(g->chirprate, 0, 'f', 4);
00501 GaussianInfo->setText(txt);
00502 }
00503 
00504 /*------------------------------------------------------------------------ */
00505 void LoggedSigs::setPulseText(int idx)
00506 {
00507 QString txt;
00508 PulseScore* p = pulseList.at(idx);
00509 
00510 txt = i18n("<b><u>Pulse Data:</u></b><br>"
00511            "<table>"
00512            "<tr><td>Power:</td><td>%1</td></tr>"
00513            "<tr><td>Mean:</td><td>%2</td></tr>"
00514            "<tr><td>Period:</td><td>%3 s</td></tr>"
00515            "<tr><td><b>Score:</b></td><td><b>%4</b></td></tr>"
00516            "<tr><td>RA:</td><td>%5</td></tr>"
00517            "<tr><td>Dec:</td><td>%6</td></tr>"
00518            "<tr><td>Freq:</td><td>%7 GHz</td></tr>"
00519            "<tr><td>Chirp:</td><td>%8 Hz/s</td></tr>"
00520            "</table>")
00521            .arg(p->power)
00522            .arg(p->mean)
00523            .arg(p->period)
00524            .arg(p->score)
00525            .arg(SetiContainer::convertRAToString(p->ra))
00526            .arg(SetiContainer::convertDecToString(p->dec))
00527            .arg(p->frequency/1.0e9, 0, 'f', 9)
00528            .arg(p->chirprate, 0, 'f', 4);
00529 PulseInfo->setText(txt);
00530 }
00531 
00532 /*------------------------------------------------------------------------ */
00533 void LoggedSigs::setTripletText(int idx)
00534 {
00535 QString txt;
00536 TripletScore* t = tripletList.at(idx);
00537 
00538 txt = i18n("<b><u>Triplet Data:</u></b><br>"
00539            "<table>"
00540            "<tr><td>Power:</td><td>%1</td></tr>"
00541            "<tr><td>Mean:</td><td>%2</td></tr>"
00542            "<tr><td>Period:</td><td>%3 s</td></tr>"
00543            "<tr><td><b>Score:</b></td><td><b>%4</b></td></tr>"
00544            "<tr><td>RA:</td><td>%5</td></tr>"
00545            "<tr><td>Dec:</td><td>%6</td></tr>"
00546            "<tr><td>Freq:</td><td>%7 GHz</td></tr>"
00547            "<tr><td>Chirp:</td><td>%8 Hz/s</td></tr>"
00548            "</table>")
00549            .arg(t->power)
00550            .arg(t->mean)
00551            .arg(t->period)
00552            .arg(t->score)
00553            .arg(SetiContainer::convertRAToString(t->ra))
00554            .arg(SetiContainer::convertDecToString(t->dec))
00555            .arg(t->frequency/1.0e9, 0, 'f', 9)
00556            .arg(t->chirprate, 0, 'f', 4);
00557 TripletInfo->setText(txt);
00558 }
00559 
00560 /*------------------------------------------------------------------------ */
00561 void LoggedSigs::slotChangeSaveBtnState(QWidget*)
00562 {
00563 int idx = SigTabs->currentPageIndex();
00564 
00565 switch(idx)
00566   {
00567   case 0: // spikes
00568     SaveBtn->setEnabled(false);
00569     break;
00570   case 1: // gaussians
00571     if(gaussianList.count() > 0)
00572       SaveBtn->setEnabled(true);
00573     else
00574       SaveBtn->setEnabled(false);
00575     break;
00576   case 2: // pulses
00577     if(pulseList.count() > 0)
00578       SaveBtn->setEnabled(true);
00579     else
00580       SaveBtn->setEnabled(false);
00581     break;
00582   case 3: // triplets
00583     if(tripletList.count() > 0)
00584       SaveBtn->setEnabled(true);
00585     else
00586       SaveBtn->setEnabled(false);
00587     break;
00588   }
00589 }
00590 
00591 /*------------------------------------------------------------------------ */
00592 void LoggedSigs::slotSave()
00593 {
00594 int idx = SigTabs->currentPageIndex();
00595 QPixmap pm;
00596 
00597 switch(idx)
00598   {
00599   case 1: // gaussians
00600     {
00601     GaussianPlot* gp = new GaussianPlot();
00602     gp->showNewGaussianData(*gaussianList.current());
00603     gp->setName(wuName());
00604     pm = gp->createPixmap();
00605     gp->close(true);
00606     break;
00607     }
00608   case 2: // pulses
00609     {
00610     PulsePlot* pp = new PulsePlot();
00611     pp->showNewPulseData(*pulseList.current());
00612     pp->setName(wuName());
00613     pm = pp->createPixmap();
00614     pp->close(true);
00615     break;
00616     }
00617   case 3: // triplets
00618     {
00619     TripletPlot* tp = new TripletPlot();
00620     tp->showNewTripletData(*tripletList.current());
00621     tp->setName(wuName());
00622     pm = tp->createPixmap();
00623     tp->close(true);
00624     break;
00625     }
00626   }
00627 
00628 QString fn;
00629 fn = KFileDialog::getSaveFileName(location->directory(), "*.png *.PNG");
00630 if(!fn.isEmpty())
00631     {
00632     if(strcmp((const char*)fn.right(4),".png") &&
00633        strcmp((const char*)fn.right(4),".PNG"))
00634       {
00635         fn.append(".png");
00636         }
00637     if(QFile::exists(fn))
00638         {
00639         int ret;
00640         ret = KMessageBox::warningYesNo(this,
00641                                         i18n("File already exists. Overwrite?"));
00642         if(ret == KMessageBox::No) return;  // <----- outta here
00643         }
00644     if(pm.save(fn, "PNG") == false)
00645         {
00646         KMessageBox::error(this, i18n("Could not save the image. Probably\n"
00647                                   "you don't have write permission."));
00648         }
00649     }
00650 }
00651 
00652 #include "loggedsigs.moc"
00653 
KDE Logo
This file is part of the documentation for Ksetiwatch API Version 2.6.1.
Documentation copyright © 2000-2003 Gordon Machel.
Generated on Fri Jun 6 00:28:14 2003 by doxygen 1.2.18, written by Dimitri van Heesch, © 1997-2002