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
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
00090 resize(520, 300);
00091
00092
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
00107
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:
00382 GaussianView->showNewGaussianData(*gaussianList.next());
00383 setGaussianText(gaussianList.at());
00384 changeGaussianBtnState();
00385 break;
00386 case 2:
00387 PulseView->showNewPulseData(*pulseList.next());
00388 setPulseText(pulseList.at());
00389 changePulseBtnState();
00390 break;
00391 case 3:
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:
00407 GaussianView->showNewGaussianData(*gaussianList.prev());
00408 setGaussianText(gaussianList.at());
00409 changeGaussianBtnState();
00410 break;
00411 case 2:
00412 PulseView->showNewPulseData(*pulseList.prev());
00413 setPulseText(pulseList.at());
00414 changePulseBtnState();
00415 break;
00416 case 3:
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:
00432 GaussianView->showNewGaussianData(*gaussianList.first());
00433 setGaussianText(gaussianList.at());
00434 changeGaussianBtnState();
00435 break;
00436 case 2:
00437 PulseView->showNewPulseData(*pulseList.first());
00438 setPulseText(pulseList.at());
00439 changePulseBtnState();
00440 break;
00441 case 3:
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:
00457 GaussianView->showNewGaussianData(*gaussianList.last());
00458 setGaussianText(gaussianList.at());
00459 changeGaussianBtnState();
00460 break;
00461 case 2:
00462 PulseView->showNewPulseData(*pulseList.last());
00463 setPulseText(pulseList.at());
00464 changePulseBtnState();
00465 break;
00466 case 3:
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:
00568 SaveBtn->setEnabled(false);
00569 break;
00570 case 1:
00571 if(gaussianList.count() > 0)
00572 SaveBtn->setEnabled(true);
00573 else
00574 SaveBtn->setEnabled(false);
00575 break;
00576 case 2:
00577 if(pulseList.count() > 0)
00578 SaveBtn->setEnabled(true);
00579 else
00580 SaveBtn->setEnabled(false);
00581 break;
00582 case 3:
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:
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:
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:
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;
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