From: <ro...@us...> - 2015-03-04 02:13:47
|
Revision: 2271 http://sourceforge.net/p/nsclspectcl/code/2271 Author: ron-fox Date: 2015-03-04 02:13:43 +0000 (Wed, 04 Mar 2015) Log Message: ----------- * Get the xmb file right. * Create scatterplot command. * Create waterfall plot using scatterplots. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.h branches/LLNLMadcChainSpecTcl-mtdcdev/logscatter.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2015-03-04 02:13:43 UTC (rev 2271) @@ -112,7 +112,9 @@ if (!m_fInitialized) { OnBegin(rAnalyzer, rDecoder); } + rEvent.clear(); // Clear any data from the raw unpackers. + // The logic here is very straightforward. queueEvent(); @@ -200,6 +202,7 @@ void CEventBuilder::buildEvents() { + bool done = false; int builds = 0; while (! done) { @@ -266,10 +269,10 @@ bool CEventBuilder::outputEvent(CEvent& rEvent) { + // Destroy the raw decoded parameters. // further, some event processors use gates so we reset the cache on all gates at this point: - rEvent.clear(); // Clear any data from the raw unpackers. SpecTcl* pApi = SpecTcl::getInstance(); CGateDictionaryIterator pGate = pApi->GateBegin(); while (pGate != pApi->GateEnd()) { Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-03-04 02:13:43 UTC (rev 2271) @@ -159,6 +159,9 @@ detInModule = detInModule/2; uint16_t detno = (detInModule + 8*m_moduleId) + 1; float energy = m_energy* (m_energy * m_quadcoef[detno] + m_slopes[detno]) + m_offsets[detno]; + if(pid != m_defaultPID) { + detectorCounts[detno]++; + } @@ -201,6 +204,12 @@ // Detector number histograms: + std::map<int, unsigned>::iterator p = detectorCounts.begin(); + while (p!= detectorCounts.end()) { + std::cerr << "Detector " << p->first << " : " << p->second << std::endl; + p++; + } + // m_mustEnd = false; // closed binary regardless. m_binaryOutput.close(); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h 2015-03-04 02:13:43 UTC (rev 2271) @@ -83,7 +83,7 @@ CTreeParameter m_energy; - static const int m_defaultPID = 5; /* Meaning uncertain. */ + static const int m_defaultPID = 11; /* Meaning uncertain. */ bool m_mustEnd; Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.cpp 2015-03-04 02:13:43 UTC (rev 2271) @@ -0,0 +1,113 @@ +/****************************************************************************** +* +* CAEN SpA - Front End Division +* Via Vetraia, 11 - 55049 - Viareggio ITALY +* +390594388398 - www.caen.it +* +***************************************************************************//** +* \note TERMS OF USE: +* This program is free software; you can redistribute it and/or modify it under +* the terms of the GNU General Public License as published by the Free Software +* Foundation. This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The user relies on the +* software, documentation and results solely at his own risk. +******************************************************************************/ + +/** + * @file CScatterDataCommand.cpo + * @brief Implement class for Tcl command to get scatter plot data. + * @author Ron Fox <ro...@ca...> + */ + +#include <config.h> + +#include "CScatterDataCommand.h" +#include <TCLInterpreter.h> +#include <TCLObject.h> +#include "CTimeParameters.h" +#include <SpecTcl.h> + +/** + * constructor + * Register the command with an interpreter. + * + * @param interp - the interpreter on which the command will be registered. + * @param command - The command name. + */ +CScatterDataCommand::CScatterDataCommand(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) +{} + +/** + * Destructor - use the base class + */ +CScatterDataCommand::~CScatterDataCommand() {} + + +int CScatterDataCommand::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + // Locate and cast the event processor: + + SpecTcl* pApi = SpecTcl::getInstance(); + CTclAnalyzer::EventProcessorIterator pProcessor = pApi->FindEventProcessor("Time-parameters"); + assert(pProcessor != pApi->ProcessingPipelineEnd()); + + // Get references to the raw data: + + CTimeParameters* pTp = reinterpret_cast<CTimeParameters*>(pProcessor->second); + CTimeParameters::ScatterData& ungated = pTp->getWaterfallData(); + CTimeParameters::ScatterData& gated = pTp->getGatedWaterfallData(); + + // The output lists: + + CTCLObject ungatedT, ungatedDt; + CTCLObject gatedT, gatedDt; + ungatedT.Bind(interp); + ungatedDt.Bind(interp); + gatedT.Bind(interp); + gatedDt.Bind(interp); + + // Now build up the ungated lists: + + CTimeParameters::ScatterList::iterator p = ungated.begin(); + while (p != ungated.end()) { + ungatedT += p->s_time; + ungatedDt += p->s_dt; + + p++; + } + + // The gated lists. + + p = gated.begin(); + while (p != gated.end()) { + gatedT += p->s_time; + gatedDt += p->s_dt; + p++; + } + + // The final result: + + CTCLObject result; + CTCLObject gatedList; + CTCLObject ungatedList; + result.Bind(interp); + gatedList.Bind(interp); + ungatedList.Bind(interp); + + ungatedList += ungatedT; + ungatedList += ungatedDt; + + gatedList += gatedT; + gatedList += gatedDt; + + result += ungatedList; + result += gatedList; + + + interp.setResult(result); + + + return TCL_OK; +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CScatterDataCommand.h 2015-03-04 02:13:43 UTC (rev 2271) @@ -0,0 +1,52 @@ +/****************************************************************************** +* +* CAEN SpA - Front End Division +* Via Vetraia, 11 - 55049 - Viareggio ITALY +* +390594388398 - www.caen.it +* +***************************************************************************//** +* \note TERMS OF USE: +* This program is free software; you can redistribute it and/or modify it under +* the terms of the GNU General Public License as published by the Free Software +* Foundation. This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The user relies on the +* software, documentation and results solely at his own risk. +******************************************************************************/ + +/** + * @file CScatterDataCommand.h + * @brief declare class for Tcl command to get scatter plot data. + * @author Ron Fox <ro...@ca...> + */ + +#ifndef __CSCATTERDATACOMMAND_H +#define __CSCATTERDATACOMMAND_H + + +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + + +/** + * @class CScatterDataCommand + * provides a command that locates the CTimeParameters event processor and + * returns the scatter plot raw data from it. The data are returned + * two lists. Each list contains two sublists. The first sublist are + * time coordinates the second the dt coordinates. This return format + * is deliberately chosen with Plotchart in mind. + * + */ + +class CScatterDataCommand : public CTCLObjectProcessor +{ +public: + CScatterDataCommand(CTCLInterpreter& interp, const char* command); + virtual ~CScatterDataCommand(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); + +}; +#endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2015-03-04 02:13:43 UTC (rev 2271) @@ -33,9 +33,11 @@ #include <Spectrum1DL.h> #include <iostream> -static const unsigned MaxScatterPoints(1024*1024); +static const unsigned MaxScatterPoints(10*1024); + + /** * @class CSpectrumAbsStrip * This helper class is sort of a strip chart spectrum. Where a @@ -117,7 +119,40 @@ } +// Implementation of CTimeParameters::ScatterList +CTimeParameters::ScatterData::ScatterData() { + clear(); +} + +void CTimeParameters::ScatterData::push_back(ScatterPoint& pt) { + m_list.push_back(pt); + m_size++; +} + +void CTimeParameters::ScatterData::pop_front() { + m_list.pop_front(); + m_size--; +} + +size_t CTimeParameters::ScatterData::size() { + return m_size; +} + +void CTimeParameters::ScatterData::clear() { + m_list.clear(); + m_size = 0; +} + +CTimeParameters::ScatterList::iterator CTimeParameters::ScatterData::begin() { + return m_list.begin(); +} + +CTimeParameters::ScatterList::iterator CTimeParameters::ScatterData::end() { + return m_list.end(); +} + + /** * constructor * - Initialize the regular variables. @@ -370,7 +405,7 @@ } else { m_logDtns = .0001; // standard fudge for 0/negative log values. } - addScatterPoint(m_highPTimestamp, m_logDtns, m_waterfall, MaxScatterPoints); + addScatterPoint(m_runTimeS, m_deltaTns, m_waterfall, MaxScatterPoints); if ((*m_deltaTGate)(rEvent)) { m_deltaTGatedns = (m_highPTimestamp - m_lastTimeGated)/10.0; @@ -381,7 +416,7 @@ } else { m_logDtGatedns = 0.01; } - addScatterPoint(m_highPTimestamp, m_logDtGatedns, m_waterfallGated, MaxScatterPoints); + addScatterPoint(m_runTimeS, m_deltaTGatedns, m_waterfallGated, MaxScatterPoints); } return kfTRUE; @@ -399,7 +434,7 @@ void CTimeParameters::addScatterPoint(double time, double dt, ScatterData& dest, unsigned maxpts) { - ScatterPoint pt = {time, dt}; + ScatterPoint pt(time, dt); dest.push_back(pt); if(dest.size() > maxpts) { dest.pop_front(); // Trim list from front. Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h 2015-03-04 02:13:43 UTC (rev 2271) @@ -57,9 +57,26 @@ typedef struct _ScatterPoint { double s_time; double s_dt; + _ScatterPoint(double t, double dt) : + s_time(t), s_dt(dt) {} } ScatterPoint; - typedef std::list<ScatterPoint> ScatterData; + typedef std::list<ScatterPoint> ScatterList; + class ScatterData { + private: + ScatterList m_list; + size_t m_size; + + public: + ScatterData(); + void push_back(ScatterPoint& pt); + void pop_front(); + size_t size(); + void clear(); + ScatterList::iterator begin(); + ScatterList::iterator end(); + }; + private: // variables for time differences (including the start time). Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2015-03-04 02:13:43 UTC (rev 2271) @@ -33,7 +33,7 @@ CY2fCommand.o CFitY2FCommand.o CY3fCommand.o CFitY3FCommand.o MTDCHelpers.o \ CMTDC32Unpacker.o CHINP.o CPSD.o CV1729Unpacker.o CEventBuilder.o \ CMultiplicity.o CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ - CTimeParameters.o CFileWriter.o CRateUpdateProcessor.o + CTimeParameters.o CFileWriter.o CRateUpdateProcessor.o CScatterDataCommand.o # Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2015-03-04 02:13:43 UTC (rev 2271) @@ -49,6 +49,7 @@ #include "CTimeParameters.h" #include "CFileWriter.h" #include "CRateUpdateProcessor.h" +#include "CScatterDataCommand.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -337,6 +338,7 @@ new CFitY2FCommand(rInterp); new CY3fCommand(rInterp); new CFitY3FCommand(rInterp); + new CScatterDataCommand(rInterp, "scatterdata"); } // Function: Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-03-04 02:13:43 UTC (rev 2271) @@ -1,4 +1,4 @@ -# SpecTclGUI save file created Thu Feb 19 21:07:07 EST 2015 +# SpecTclGUI save file created Tue Mar 03 20:52:54 EST 2015 # SpecTclGui Version: 1.0 # Author: Ron Fox (fo...@ns...) Added: branches/LLNLMadcChainSpecTcl-mtdcdev/logscatter.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/logscatter.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/logscatter.tcl 2015-03-04 02:13:43 UTC (rev 2271) @@ -0,0 +1,109 @@ +#/****************************************************************************** +#* +#* CAEN SpA - Front End Division +#* Via Vetraia, 11 - 55049 - Viareggio ITALY +#* +390594388398 - www.caen.it +#* +#***************************************************************************//** +#* \note TERMS OF USE: +#* This program is free software; you can redistribute it and/or modify it under +#* the terms of the GNU General Public License as published by the Free Software +#* Foundation. This program is distributed in the hope that it will be useful, +#* but WITHOUT ANY WARRANTY; without even the implied warranty of +#* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. The user relies on the +#* software, documentation and results solely at his own risk. +#******************************************************************************/ + + +#/** +# * @file logscatter.tcl +# * @brief create plotchart scatter plots with log y scale. +# * @author Ron Fox <ro...@ca...> +# */ + +package require Plotchart 2.3.1 + +namespace eval waterfall { + variable plotId "" +} + +## +# eraseLogPlot +# +# Destroy a log plot. +# +# @param plot - Plotchart plotid. +# +proc eraseLogPlot plot { + puts "Erasing $plot" + set canvas [$plot canvas] + ::Plotchart::eraseplot $plot + $canvas delete [$canvas gettags all] +} + +## +# plotLogScatter +# Plot the scatter chart on a canvas +# +# @param c - The canvas +# @param xpts - X points (list). +# @param ypts - Y points (list). +# @param ymin - Minimum Y value. +# @param ymax - Maxiumu Y value. +# +# @return plotchartId - id of the plotchart created. +# +# @note - the xpts must be ordered, and their range is therefore autoconfigured +# as [lindex $xpts 0] [lindex $xpts end] +# @note - 0 radius circles are used to render each point. +# +proc plotLogScatter {c xpts ypts ymin ymax} { + set xmin [lindex $xpts 0] + set xmax [lindex $xpts end] + + # Compute a good range list for X: + + + set plotList [Plotchart::determineScale $xmin $xmax] + + # Create the plot and configure the series (scatter). + + + set p [::Plotchart::createXLogYPlot $c $plotList [list $ymin $ymax]] + $p yconfig -format %.0E + $p dataconfig scatter -symbol dot -radius 0 -type symbol + + foreach x $xpts y $ypts { + $p plot scatter $x $y + } + $p xtext {t seconds} + $p ytext {dt ns} + + return $p + +} + +proc updateWaterfall {} { + if {$waterfall::plotId ne ""} { + eraseLogPlot $waterfall::plotId + set waterfall::plotId "" + destroy + } + set data [scatterdata] + set x [lindex [lindex $data 1] 0] + set y [lindex [lindex $data 1] 1] + + destroy .waterfall.plot + canvas .waterfall.plot -width 800 -height 300 + grid .waterfall.plot + + set waterfall::plotId [plotLogScatter .waterfall.plot $x $y .01 1.0E9] +} + +toplevel .waterfall +wm title .waterfall {Waterfall plot} + +canvas .waterfall.plot -width 800 -height 300 +button .waterfall.update -text Update -command {updateWaterfall} +grid .waterfall.update +grid .waterfall.plot Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2015-03-04 02:13:43 UTC (rev 2271) @@ -7,6 +7,7 @@ package require Plotchart 2.3.1 source plotLog.tcl +source logscatter.tcl toplevel .plots wm title .plots {Time interval plots} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2015-03-04 02:13:43 UTC (rev 2271) @@ -32,4 +32,6 @@ return $plot -} \ No newline at end of file +} + + Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl 2015-03-02 13:26:52 UTC (rev 2270) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl 2015-03-04 02:13:43 UTC (rev 2271) @@ -365,7 +365,7 @@ # Side effects: # Axis drawn in canvas # -proc ::Plotchart::DrawLogYaxis { w ymin ymax ydelt } { +proc ::Plotchart::DrawLogYaxis { w ymin ymax ydelt args } { variable scaling variable config This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |