+void
+ProjectionFileView::OnPlotTThetaSampling (wxCommandEvent& event)
+{
+ DialogGetThetaRange dlgTheta (this->getFrame(), ParallelRaysums::THETA_RANGE_UNCONSTRAINED);
+ if (dlgTheta.ShowModal() != wxID_OK)
+ return;
+
+ int iThetaRange = dlgTheta.getThetaRange();
+
+ Projections& rProj = GetDocument()->getProjections();
+ ParallelRaysums parallel (&rProj, iThetaRange);
+ PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+ PlotFile& rPlot = pPlotDoc->getPlotFile();
+ ParallelRaysums::CoordinateContainer& coordContainer = parallel.getCoordinates();
+ double* pdT = new double [parallel.getNumCoordinates()];
+ double* pdTheta = new double [parallel.getNumCoordinates()];
+
+ for (int i = 0; i < parallel.getNumCoordinates(); i++) {
+ pdT[i] = coordContainer[i]->m_dT;
+ pdTheta[i] = coordContainer[i]->m_dTheta;
+ }
+ rPlot.setCurveSize (2, parallel.getNumCoordinates(), true);
+ rPlot.addEzsetCommand ("title T-Theta Sampling");
+ rPlot.addEzsetCommand ("xlabel T");
+ rPlot.addEzsetCommand ("ylabel Theta");
+ rPlot.addEzsetCommand ("curve 1");
+ if (rProj.nDet() < 50 && rProj.nView() < 50)
+ rPlot.addEzsetCommand ("symbol 1"); // x symbol
+ else
+ rPlot.addEzsetCommand ("symbol 6"); // point symbol
+ rPlot.addEzsetCommand ("noline");
+ rPlot.addColumn (0, pdT);
+ rPlot.addColumn (1, pdTheta);
+ delete pdT;
+ delete pdTheta;
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->Activate();
+}
+
+
+void
+ProjectionFileView::OnPlotHistogram (wxCommandEvent& event)
+{
+ Projections& rProj = GetDocument()->getProjections();
+ int nDet = rProj.nDet();
+ int nView = rProj.nView();
+
+ if (nDet < 1 || nView < 1)
+ return;
+
+ PlotFileDocument* pPlotDoc = theApp->newPlotDoc();
+ if (! pPlotDoc) {
+ sys_error (ERR_SEVERE, "Internal error: unable to create Plot file");
+ return;
+ }
+
+ DetectorValue* pdDetval = rProj.getDetectorArray(0).detValues();
+ double dMin = pdDetval[0], dMax = pdDetval[0];
+
+ for (int iv = 0; iv < nView; iv++) {
+ pdDetval = rProj.getDetectorArray(iv).detValues();
+ for (int id = 0; id < nDet; id++) {
+ double dV = pdDetval[id];
+ if (dV < dMin)
+ dMin = dV;
+ else if (dV > dMax)
+ dMax = dV;
+ }
+ }
+
+ double* pX = new double [NUMBER_HISTOGRAM_BINS];
+ double* pY = new double [NUMBER_HISTOGRAM_BINS];
+ double dBinWidth = (dMax - dMin) / NUMBER_HISTOGRAM_BINS;
+
+ for (int i = 0; i < NUMBER_HISTOGRAM_BINS; i++) {
+ pX[i] = dMin + (i + 0.5) * dBinWidth;
+ pY[i] = 0;
+ }
+ for (int j = 0; j < nView; j++) {
+ pdDetval = rProj.getDetectorArray(j).detValues();
+ for (int id = 0; id < nDet; id++) {
+ int iBin = nearest<int> ((pdDetval[id] - dMin) / dBinWidth);
+ if (iBin >= 0 && iBin < NUMBER_HISTOGRAM_BINS)
+ pY[iBin] += 1;
+ }
+ }
+ PlotFile& rPlotFile = pPlotDoc->getPlotFile();
+ std::ostringstream os;
+ os << "Histogram";
+ std::string title("title ");
+ title += os.str();
+ rPlotFile.addEzsetCommand (title.c_str());
+ rPlotFile.addEzsetCommand ("xlabel Detector Value");
+ rPlotFile.addEzsetCommand ("ylabel Count");
+ rPlotFile.addEzsetCommand ("box");
+ rPlotFile.addEzsetCommand ("grid");
+ rPlotFile.setCurveSize (2, NUMBER_HISTOGRAM_BINS);
+ rPlotFile.addColumn (0, pX);
+ rPlotFile.addColumn (1, pY);
+ rPlotFile.addDescription (rProj.remark());
+ os << " plot of " << dynamic_cast<wxFrame*>(GetDocument()->GetFirstView()->GetFrame())->GetTitle().c_str();
+ *theApp->getLog() << wxConvUTF8.cMB2WX(os.str().c_str()) << _T("\n");
+ rPlotFile.addDescription (os.str().c_str());
+ delete pX;
+ delete pY;
+ if (theApp->getAskDeleteNewDocs())
+ pPlotDoc->Modify (true);
+ pPlotDoc->getView()->getFrame()->Show(true);
+ pPlotDoc->UpdateAllViews ();
+ pPlotDoc->Activate();
+}
+
+
+void
+ProjectionFileView::OnConvertParallel (wxCommandEvent& event)
+{
+ Projections& rProj = GetDocument()->getProjections();
+ if (rProj.geometry() == Scanner::GEOMETRY_PARALLEL) {
+ wxMessageBox (_T("Projections are already parallel"), _T("Error"));
+ return;
+ }
+ wxProgressDialog dlgProgress (_T("Convert to Parallel"), _T("Conversion Progress"), 1, getFrameForChild(), wxPD_APP_MODAL);
+ Projections* pProjNew = rProj.interpolateToParallel();
+ ProjectionFileDocument* pProjDocNew = theApp->newProjectionDoc();
+ pProjDocNew->setProjections (pProjNew);
+
+ if (ProjectionFileView* projView = pProjDocNew->getView()) {
+ projView->OnUpdate (projView, NULL);
+ if (projView->getCanvas())
+ projView->getCanvas()->SetClientSize (pProjNew->nDet(), pProjNew->nView());
+ if (wxFrame* pFrame = projView->getFrame()) {
+ pFrame->Show(true);
+ pFrame->SetFocus();
+ pFrame->Raise();
+ }
+ GetDocumentManager()->ActivateView (projView, true);
+ }
+ if (theApp->getAskDeleteNewDocs())
+ pProjDocNew-> Modify(true);
+ pProjDocNew->UpdateAllViews (this);
+ pProjDocNew->getView()->setInitialClientSize();
+ pProjDocNew->Activate();
+}
+