You can subscribe to this list here.
2003 |
Jan
|
Feb
(25) |
Mar
(121) |
Apr
(44) |
May
(21) |
Jun
(28) |
Jul
(18) |
Aug
(63) |
Sep
(15) |
Oct
(40) |
Nov
(65) |
Dec
(8) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
(46) |
Feb
(13) |
Mar
(9) |
Apr
(49) |
May
(44) |
Jun
(13) |
Jul
(23) |
Aug
(43) |
Sep
(34) |
Oct
(53) |
Nov
(44) |
Dec
(51) |
2005 |
Jan
(50) |
Feb
(25) |
Mar
(26) |
Apr
(45) |
May
(87) |
Jun
(58) |
Jul
(26) |
Aug
(21) |
Sep
(25) |
Oct
(37) |
Nov
(7) |
Dec
(6) |
2006 |
Jan
(41) |
Feb
(21) |
Mar
(32) |
Apr
(35) |
May
(28) |
Jun
(88) |
Jul
(47) |
Aug
(17) |
Sep
(55) |
Oct
(86) |
Nov
(39) |
Dec
(21) |
2007 |
Jan
(7) |
Feb
(21) |
Mar
(35) |
Apr
(23) |
May
(106) |
Jun
(49) |
Jul
(19) |
Aug
(9) |
Sep
(15) |
Oct
(25) |
Nov
(10) |
Dec
(19) |
2008 |
Jan
(22) |
Feb
(20) |
Mar
(19) |
Apr
(9) |
May
(9) |
Jun
(1) |
Jul
(3) |
Aug
(1) |
Sep
(15) |
Oct
(5) |
Nov
(1) |
Dec
(10) |
2009 |
Jan
(11) |
Feb
(4) |
Mar
(9) |
Apr
|
May
(12) |
Jun
|
Jul
(3) |
Aug
(13) |
Sep
(4) |
Oct
(6) |
Nov
|
Dec
(5) |
2010 |
Jan
(8) |
Feb
(3) |
Mar
(1) |
Apr
(1) |
May
(24) |
Jun
(10) |
Jul
(6) |
Aug
(5) |
Sep
(8) |
Oct
(3) |
Nov
(14) |
Dec
(13) |
2011 |
Jan
(50) |
Feb
(13) |
Mar
(36) |
Apr
(20) |
May
|
Jun
(21) |
Jul
(2) |
Aug
(1) |
Sep
(3) |
Oct
(3) |
Nov
(5) |
Dec
(53) |
2012 |
Jan
(19) |
Feb
(3) |
Mar
(5) |
Apr
|
May
(24) |
Jun
(27) |
Jul
(7) |
Aug
(5) |
Sep
(2) |
Oct
|
Nov
(1) |
Dec
(14) |
2013 |
Jan
(3) |
Feb
(2) |
Mar
(1) |
Apr
(10) |
May
(9) |
Jun
(14) |
Jul
(18) |
Aug
(14) |
Sep
(11) |
Oct
(13) |
Nov
|
Dec
|
2014 |
Jan
|
Feb
(2) |
Mar
(6) |
Apr
(11) |
May
(2) |
Jun
|
Jul
(6) |
Aug
(9) |
Sep
|
Oct
(14) |
Nov
(10) |
Dec
(11) |
2015 |
Jan
(3) |
Feb
(33) |
Mar
(13) |
Apr
(30) |
May
(13) |
Jun
(6) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(18) |
Dec
|
From: <ro...@us...> - 2015-03-06 09:45:00
|
Revision: 2272 http://sourceforge.net/p/nsclspectcl/code/2272 Author: ron-fox Date: 2015-03-06 09:44:53 +0000 (Fri, 06 Mar 2015) Log Message: ----------- Makefile -> llnl setup Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2015-03-04 02:13:43 UTC (rev 2271) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2015-03-06 09:44:53 UTC (rev 2272) @@ -1,6 +1,7 @@ INSTDIR=/usr/opt/spectcl/3.4 -DAQROOT=/usr/opt/daq/10.2-mtdc +DAQROOT=/usr/opt/daq/10.2-llnl + include $(INSTDIR)/etc/SpecTcl_Makefile.include This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
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. |
From: <ro...@us...> - 2015-03-02 13:27:00
|
Revision: 2270 http://sourceforge.net/p/nsclspectcl/code/2270 Author: ron-fox Date: 2015-03-02 13:26:52 +0000 (Mon, 02 Mar 2015) Log Message: ----------- * Add test for zlib in configure.ac * Add zlib.m4 zlib test macro to m4 dir. * Add compress package to support zlib deflate/inflate. Modified Paths: -------------- trunk/main/CHANGELOG trunk/main/Makefile.am trunk/main/configure.ac Added Paths: ----------- trunk/main/compress/ trunk/main/m4/zlib.m4 Property Changed: ---------------- trunk/main/ Index: trunk/main =================================================================== --- trunk/main 2015-03-02 13:25:03 UTC (rev 2269) +++ trunk/main 2015-03-02 13:26:52 UTC (rev 2270) Property changes on: trunk/main ___________________________________________________________________ Modified: svn:mergeinfo ## -1,7 +1,7 ## /branches/3.3-007-dev:1983-1986 /branches/3.3-008-dev:1987-1996 /branches/3.3-009-development:2000-2014 -/branches/3.4-getcontents:2262-2265 +/branches/3.4-getcontents:2262-2269 /branches/SpecTcl-3.3-010-development:2016-2031 /branches/SpecTcl-3.3-013:2051-2061 /tags/SpecTcl-3.3-013-premerge:2062-2063 \ No newline at end of property Modified: trunk/main/CHANGELOG =================================================================== --- trunk/main/CHANGELOG 2015-03-02 13:25:03 UTC (rev 2269) +++ trunk/main/CHANGELOG 2015-03-02 13:26:52 UTC (rev 2270) @@ -1057,4 +1057,5 @@ 3.4-005 * Feature #3531 - add version command. * Feature #3532 - add scontents command. + * Feature #3538 - add compress package with deflate/inflate commands. Modified: trunk/main/Makefile.am =================================================================== --- trunk/main/Makefile.am 2015-03-02 13:25:03 UTC (rev 2269) +++ trunk/main/Makefile.am 2015-03-02 13:26:52 UTC (rev 2270) @@ -4,7 +4,7 @@ DecoderRing TreeParam \ Fits SpecTcl \ contrib TestFiles Gui splash filtsplit calibratedparams treegui \ - ccusb vmusb tkcon + ccusb vmusb tkcon compress ACLOCAL_AMFLAGS=-I m4 Modified: trunk/main/configure.ac =================================================================== --- trunk/main/configure.ac 2015-03-02 13:25:03 UTC (rev 2269) +++ trunk/main/configure.ac 2015-03-02 13:26:52 UTC (rev 2270) @@ -694,6 +694,12 @@ AX_GENGETOPT +## +# Check for zlib for the zip/unzip commands. + +AX_CHECK_ZLIB([AC_MSG_RESULT([Have zlib])], [AC_MSG_ERROR([zlib is a prerequisite for this version of SpecTcl])]) + + # # libTclPlus and libException could have been installed from # Ryan's Deb or I might need to install my own versions which @@ -805,4 +811,4 @@ calibratedparams/Makefile \ ccusb/Makefile ccusb/MakefileSkel \ vmusb/Makefile vmusb/MakefileSkel \ - tkcon/Makefile ) + tkcon/Makefile compress/Makefile ) Copied: trunk/main/m4/zlib.m4 (from rev 2269, branches/3.4-getcontents/m4/zlib.m4) =================================================================== --- trunk/main/m4/zlib.m4 (rev 0) +++ trunk/main/m4/zlib.m4 2015-03-02 13:26:52 UTC (rev 2270) @@ -0,0 +1,142 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_zlib.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_ZLIB([action-if-found], [action-if-not-found]) +# +# DESCRIPTION +# +# This macro searches for an installed zlib library. If nothing was +# specified when calling configure, it searches first in /usr/local and +# then in /usr, /opt/local and /sw. If the --with-zlib=DIR is specified, +# it will try to find it in DIR/include/zlib.h and DIR/lib/libz.a. If +# --without-zlib is specified, the library is not searched at all. +# +# If either the header file (zlib.h) or the library (libz) is not found, +# shell commands 'action-if-not-found' is run. If 'action-if-not-found' is +# not specified, the configuration exits on error, asking for a valid zlib +# installation directory or --without-zlib. +# +# If both header file and library are found, shell commands +# 'action-if-found' is run. If 'action-if-found' is not specified, the +# default action appends '-I${ZLIB_HOME}/include' to CPFLAGS, appends +# '-L$ZLIB_HOME}/lib' to LDFLAGS, prepends '-lz' to LIBS, and calls +# AC_DEFINE(HAVE_LIBZ). You should use autoheader to include a definition +# for this symbol in a config.h file. Sample usage in a C/C++ source is as +# follows: +# +# #ifdef HAVE_LIBZ +# #include <zlib.h> +# #endif /* HAVE_LIBZ */ +# +# LICENSE +# +# Copyright (c) 2008 Loic Dachary <lo...@se...> +# Copyright (c) 2010 Bastien Chevreux <ba...@ch...> +# +# 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; either version 2 of the License, or (at your +# option) any later version. +# +# 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. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <http://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 14 + +AU_ALIAS([CHECK_ZLIB], [AX_CHECK_ZLIB]) +AC_DEFUN([AX_CHECK_ZLIB], +# +# Handle user hints +# +[AC_MSG_CHECKING(if zlib is wanted) +zlib_places="/usr/local /usr /opt/local /sw" +AC_ARG_WITH([zlib], +[ --with-zlib=DIR root directory path of zlib installation @<:@defaults to + /usr/local or /usr if not found in /usr/local@:>@ + --without-zlib to disable zlib usage completely], +[if test "$withval" != no ; then + AC_MSG_RESULT(yes) + if test -d "$withval" + then + zlib_places="$withval $zlib_places" + else + AC_MSG_WARN([Sorry, $withval does not exist, checking usual places]) + fi +else + zlib_places= + AC_MSG_RESULT(no) +fi], +[AC_MSG_RESULT(yes)]) + +# +# Locate zlib, if wanted +# +if test -n "${zlib_places}" +then + # check the user supplied or any other more or less 'standard' place: + # Most UNIX systems : /usr/local and /usr + # MacPorts / Fink on OSX : /opt/local respectively /sw + for ZLIB_HOME in ${zlib_places} ; do + if test -f "${ZLIB_HOME}/include/zlib.h"; then break; fi + ZLIB_HOME="" + done + + ZLIB_OLD_LDFLAGS=$LDFLAGS + ZLIB_OLD_CPPFLAGS=$CPPFLAGS + if test -n "${ZLIB_HOME}"; then + LDFLAGS="$LDFLAGS -L${ZLIB_HOME}/lib" + CPPFLAGS="$CPPFLAGS -I${ZLIB_HOME}/include" + fi + AC_LANG_SAVE + AC_LANG_C + AC_CHECK_LIB([z], [inflateEnd], [zlib_cv_libz=yes], [zlib_cv_libz=no]) + AC_CHECK_HEADER([zlib.h], [zlib_cv_zlib_h=yes], [zlib_cv_zlib_h=no]) + AC_LANG_RESTORE + if test "$zlib_cv_libz" = "yes" && test "$zlib_cv_zlib_h" = "yes" + then + # + # If both library and header were found, action-if-found + # + m4_ifblank([$1],[ + CPPFLAGS="$CPPFLAGS -I${ZLIB_HOME}/include" + LDFLAGS="$LDFLAGS -L${ZLIB_HOME}/lib" + LIBS="-lz $LIBS" + AC_DEFINE([HAVE_LIBZ], [1], + [Define to 1 if you have `z' library (-lz)]) + ],[ + # Restore variables + LDFLAGS="$ZLIB_OLD_LDFLAGS" + CPPFLAGS="$ZLIB_OLD_CPPFLAGS" + $1 + ]) + else + # + # If either header or library was not found, action-if-not-found + # + m4_default([$2],[ + AC_MSG_ERROR([either specify a valid zlib installation with --with-zlib=DIR or disable zlib usage with --without-zlib]) + ]) + fi +fi +]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-03-02 13:25:05
|
Revision: 2269 http://sourceforge.net/p/nsclspectcl/code/2269 Author: ron-fox Date: 2015-03-02 13:25:03 +0000 (Mon, 02 Mar 2015) Log Message: ----------- Add code to deflate the JSON for 2-d's if scontents is supported (scontents was rolled out the same time that the compress package was. Modified Paths: -------------- trunk/plugins/rest/custom/spectrum.tcl Modified: trunk/plugins/rest/custom/spectrum.tcl =================================================================== --- trunk/plugins/rest/custom/spectrum.tcl 2015-03-02 12:49:37 UTC (rev 2268) +++ trunk/plugins/rest/custom/spectrum.tcl 2015-03-02 13:25:03 UTC (rev 2269) @@ -251,7 +251,11 @@ } } } + return [::SpecTcl::_returnObject OK [json::write array {*}$nonZeroChannels]] } else { + # Note that we also have inflate/deflate: + package require compress + set data [scontents $name] foreach channel $data { lappend nonZeroChannels [json::write object \ @@ -260,6 +264,15 @@ value [lindex $channel 2] \ ] } + set json [::SpecTcl::_returnObject OK [json::write array {*}$nonZeroChannels]] + set jsonGzip [deflate $json] + + # Force content encoding -> gzip. + # + set sock [Httpd_CurrentSocket] + Httpd_AddHeaders $sock Content-Encoding deflate + return $jsonGzip + } - return [::SpecTcl::_returnObject OK [json::write array {*}$nonZeroChannels]] + } \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-03-02 12:49:49
|
Revision: 2268 http://sourceforge.net/p/nsclspectcl/code/2268 Author: ron-fox Date: 2015-03-02 12:49:37 +0000 (Mon, 02 Mar 2015) Log Message: ----------- Add Feature #3538 - Add compress package to SpecTcl. This provides: * deflate - zlib's compress function. * inflate - zlib's uncompress function. Modified Paths: -------------- branches/3.4-getcontents/CHANGELOG branches/3.4-getcontents/Makefile.am branches/3.4-getcontents/configure.ac Added Paths: ----------- branches/3.4-getcontents/compress/ branches/3.4-getcontents/compress/Makefile.am branches/3.4-getcontents/compress/compressPackage.cpp branches/3.4-getcontents/compress/deflate.cpp branches/3.4-getcontents/compress/deflate.h branches/3.4-getcontents/compress/inflate.cpp branches/3.4-getcontents/compress/inflate.h branches/3.4-getcontents/m4/zlib.m4 Modified: branches/3.4-getcontents/CHANGELOG =================================================================== --- branches/3.4-getcontents/CHANGELOG 2015-02-25 12:25:24 UTC (rev 2267) +++ branches/3.4-getcontents/CHANGELOG 2015-03-02 12:49:37 UTC (rev 2268) @@ -1057,4 +1057,5 @@ 3.4-005 * Feature #3531 - add version command. * Feature #3532 - add scontents command. + * Feature #3538 - add compress package with deflate/inflate commands. Modified: branches/3.4-getcontents/Makefile.am =================================================================== --- branches/3.4-getcontents/Makefile.am 2015-02-25 12:25:24 UTC (rev 2267) +++ branches/3.4-getcontents/Makefile.am 2015-03-02 12:49:37 UTC (rev 2268) @@ -4,7 +4,7 @@ DecoderRing TreeParam \ Fits SpecTcl \ contrib TestFiles Gui splash filtsplit calibratedparams treegui \ - ccusb vmusb tkcon + ccusb vmusb tkcon compress ACLOCAL_AMFLAGS=-I m4 Added: branches/3.4-getcontents/compress/Makefile.am =================================================================== --- branches/3.4-getcontents/compress/Makefile.am (rev 0) +++ branches/3.4-getcontents/compress/Makefile.am 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,12 @@ +lib_LTLIBRARIES=libCompress.la + +libCompress_la_SOURCES=deflate.cpp deflate.h inflate.cpp inflate.h \ + compressPackage.cpp + +libCompress_la_CXXFLAGS=@LIBTCLPLUS_CFLAGS@ @TCL_CPPFLAGS@ +libCompress_la_LIBADD=@LIBTCLPLUS_LDFLAGS@ @TCL_LIBS@ -lz + +install-data-hook: + $(mkinstalldirs) @prefix@/TclLibs/compress + $(INSTALL_PROGRAM) @libdir@/libCompress.so @prefix@/TclLibs/compress + echo pkg_mkIndex @prefix@/TclLibs/compress "*.so" | @TCLSH@ \ No newline at end of file Added: branches/3.4-getcontents/compress/compressPackage.cpp =================================================================== --- branches/3.4-getcontents/compress/compressPackage.cpp (rev 0) +++ branches/3.4-getcontents/compress/compressPackage.cpp 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,73 @@ +/** + +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2013. +# +# You may use this software under the terms of the GNU public license +# (GPL). The terms of this license are described at: +# +# http://www.gnu.org/licenses/gpl.txt +# +# Author: +# Ron Fox +# NSCL +# Michigan State University +# East Lansing, MI 48824-1321 + +## +# @file compressPackage.cpp +# @brief Package initialization for zlib compression package. +# @author <fo...@ns...> +*/ +#include <tcl.h> +#include "inflate.h" +#include "deflate.h" +#include <TCLInterpreter.h> + + +static const char* pkgVersion="1.0"; + +/** + * compress_Init + * Provides the initialization function for unsafe-interpreters. + * * Register the package with the interpreter. + * * Encapsulate the interpreter + * * Instantiate the commands (which registers them).l + * * return TCL_OK assuming all goes well. + * @param pRawInterp -the raw Tcl interpreter. + * @return int TCL_OK normally. + */ +extern "C" { + int Compress_Init(Tcl_Interp* pRawInterp) + { + int status = Tcl_PkgProvide(pRawInterp, "compress", pkgVersion); + if (status != TCL_OK) return status; + + /* + * Must encapsulate this way else leaving scope deletes + * the interpreter. That's ok since Tcl doesn't really provide + * a way to unload packages. + */ + + CTCLInterpreter& interp(*new CTCLInterpreter(pRawInterp)); + + /* + * Similarly for the commands: + */ + + new CInflate(interp); + new CDeflate(interp); + + return TCL_OK; + } + + /** + * compress_SafeInit + * Nothing unsafe about the package so: + */ + int Compress_SafeInit(Tcl_Interp* interp) { + return Compress_Init(interp); + } +void* gpTCLApplication(0); +} + Added: branches/3.4-getcontents/compress/deflate.cpp =================================================================== --- branches/3.4-getcontents/compress/deflate.cpp (rev 0) +++ branches/3.4-getcontents/compress/deflate.cpp 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,102 @@ +/** + +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2013. +# +# You may use this software under the terms of the GNU public license +# (GPL). The terms of this license are described at: +# +# http://www.gnu.org/licenses/gpl.txt +# +# Author: +# Ron Fox +# NSCL +# Michigan State University +# East Lansing, MI 48824-1321 + +## +# @file deflate.cpp +# @brief Implement the deflate commnd. +# @author <fo...@ns...> +*/ +#include "deflate.h" +#include <TCLInterpreter.h> +#include <TCLObject.h> +#include <tcl.h> + +#include <zlib.h> + +/** + * constructor + * Create the command. This is actually done by the base class constructor. + * + * @param interp - interpreter on which the command is registered. + * @param command - Command name string (defaults to "deflate"). + */ +CDeflate::CDeflate(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) + {} + +/** + * destructor -no-op for now. + */ +CDeflate::~CDeflate() {} + +/** + * operator() + * Called when the command is executed. + * + * @param interp - the interpreter on which the command is being registered. + * @param objv - Vector of objects that make up the command. + * @return int - TCL_OK for success TCL_ERROR if failed. + * + * The result of the command is the compressed data or an error message + * if there was a failure. +*/ +int +CDeflate::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + bindAll(interp, objv); + Bytef* pCompressedData(0); + try { + requireExactly(objv, 2, "Usage:\n deflate data\n"); + + // Get the data from the object: + + Tcl_Obj* dataObj = objv[1].getObject(); + int length; + + unsigned char* data = Tcl_GetByteArrayFromObj(dataObj, &length); + + // Figure out the size and allocate the output buffer. + + uLong requiredLength = compressBound(length); + pCompressedData = new Byte[requiredLength]; + + int status = compress(pCompressedData, &requiredLength, data, length); + switch (status) { + case Z_OK: + { + Tcl_Obj* pResult = Tcl_NewByteArrayObj(pCompressedData, requiredLength); + Tcl_SetObjResult(interp.getInterpreter(), pResult); + } + break; + case Z_MEM_ERROR: + throw std::string("Compression was not able to allocate sufficient dynamicm emory"); + case Z_BUF_ERROR: + throw std::string("Result buffer was incorrectly sized"); + default: + throw std::string("Zlib's compress function failed for some unanticipated reason"); + + } + + } + catch (std::string msg) { + delete pCompressedData; + interp.setResult(msg); + return TCL_ERROR; + } + delete pCompressedData; + + return TCL_OK; +} \ No newline at end of file Added: branches/3.4-getcontents/compress/deflate.h =================================================================== --- branches/3.4-getcontents/compress/deflate.h (rev 0) +++ branches/3.4-getcontents/compress/deflate.h 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,58 @@ +/** + +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2013. +# +# You may use this software under the terms of the GNU public license +# (GPL). The terms of this license are described at: +# +# http://www.gnu.org/licenses/gpl.txt +# +# Author: +# Ron Fox +# NSCL +# Michigan State University +# East Lansing, MI 48824-1321 + +## +# @file deflate.h +# @brief Define command class to deflate byte array. +# @author <fo...@ns...> +*/ + +#ifndef __DEFLATE_H +#define __DEFLATE_H + +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + +/** + * @class CDeflate + * + * Provides the deflate class. This is a simple hook to zlib that + * takes an object byte array and uses zlib's compress function + * to turn it into a compressed version of itself. + * The inflate command in this package can be used to reverse this + * process. + * + * Usage: + * + * \verbatim + * + * set compressed-data [compress something-to-compress] + * + * \endverbatim + */ +class CDeflate : public CTCLObjectProcessor +{ +public: + CDeflate(CTCLInterpreter& interp, const char* command="deflate"); + virtual ~CDeflate(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); +}; + + +#endif \ No newline at end of file Added: branches/3.4-getcontents/compress/inflate.cpp =================================================================== --- branches/3.4-getcontents/compress/inflate.cpp (rev 0) +++ branches/3.4-getcontents/compress/inflate.cpp 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,137 @@ +/** + +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2013. +# +# You may use this software under the terms of the GNU public license +# (GPL). The terms of this license are described at: +# +# http://www.gnu.org/licenses/gpl.txt +# +# Author: +# Ron Fox +# NSCL +# Michigan State University +# East Lansing, MI 48824-1321 + +## +# @file inflate.cpp +# @brief Implement the inflate command +# @author <fo...@ns...> +*/ +#include "inflate.h" +#include <TCLInterpreter.h> +#include <TCLObject.h> +#include <zlib.h> +#include <stdlib.h> + +/** + * constructor + * Use the base class constructor to register the command. + * + * @param interp - Reference to the interpreter that will get this command. + * @param command - Command keyword string defaults to inflate + */ +CInflate::CInflate(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) +{} + +/** + * destructor + */ +CInflate::~CInflate() {} + +/** + * operator() + * Executes the inflate command. Note that the implementation of this command + * is a bit problematic given that we're just using the uncompress function + * rather than the more complex versions. This is because, from the + * zlib docs: " (The size of the uncompressed data must have been saved + * previously by the compressor and transmitted to the decompressor by + * some mechanism outside the scope of this compression library.)" + * Which means we don't have an a-priori way to size the output buffer. + * What we are going to do therefore is something that is a bit + * ugly: + * - An initial output buffer of 4* the input buffer is + * allocated. + * - If a decompression fails with Z_BUF_ERROR, indicating we + * did not choose a sufficiently large buffer we'll add + * more space and try again (increment is .5 the size of the + * original input buffer). + * + * This process continues until either we fail in our realloc + * or we get a status other than Z_BUF_ERROR at which point we're + * as done as we can be. + * + * @param interp - references the interpreter running the command. + * @param objv - Vector of encapsulated objects that represent the + * command words. + * @return int - TCL_OK - if success and TCL_ERROR on error. + * On success the command result is the decompressed data + * while on failure the result is an error message. + */ +int +CInflate::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + bindAll(interp, objv); + void* pUncompressed(0); + try { + requireExactly(objv, 2, "Usage:\n inflate compressed-data"); + + // Get pointer and length of compressed data: + + int length; + unsigned char* pCompressed = Tcl_GetByteArrayFromObj( + objv[1].getObject(), &length); + + // Give the allocationa try and loop until we get a + // status other than Z_BUF_ERROR: + + int status = Z_BUF_ERROR; + unsigned uclength = 4*length; + uLongf actualLen; + unsigned char* pUncompressed(0); + pUncompressed = reinterpret_cast<unsigned char*>(malloc(uclength)); + while(pUncompressed && (status == Z_BUF_ERROR)) { + + actualLen = uclength; + status = uncompress(pUncompressed, &actualLen, pCompressed, length); + if (status == Z_OK) break; + + uclength += length/4; // In case we need to enlarge + pUncompressed = + reinterpret_cast<unsigned char*>(realloc(pUncompressed, uclength)); + } + // If pUncompressed == 0 we failed to realloc: + + if (!pUncompressed) { + throw std::string("Could not allocate the output buffer"); + } + switch (status) { + case Z_OK: + { + Tcl_Obj* result = Tcl_NewByteArrayObj( + reinterpret_cast<unsigned char*>(pUncompressed), + actualLen + ); + Tcl_SetObjResult(interp.getInterpreter(), result); + } + break; + case Z_DATA_ERROR: + throw std::string("Input was not compressed with 'deflate'"); + case Z_MEM_ERROR: + throw std::string("Zlib internal memory allocation failed"); + default: + throw std::string("Unanticipated error from zlib uncompress function"); + } + + } + catch (std::string msg) { + free(pUncompressed); + interp.setResult(msg); + return TCL_ERROR; + } + + free(pUncompressed); + return TCL_OK; +} \ No newline at end of file Added: branches/3.4-getcontents/compress/inflate.h =================================================================== --- branches/3.4-getcontents/compress/inflate.h (rev 0) +++ branches/3.4-getcontents/compress/inflate.h 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,57 @@ +/** + +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2013. +# +# You may use this software under the terms of the GNU public license +# (GPL). The terms of this license are described at: +# +# http://www.gnu.org/licenses/gpl.txt +# +# Author: +# Ron Fox +# NSCL +# Michigan State University +# East Lansing, MI 48824-1321 + +## +# @file inflate.h +# @brief Define the class that implements inflate. +# @author <fo...@ns...> +*/ + +#ifndef _INFLATE_H +#define _INFLATE_H +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + +/** + * @class CInflate + * + * Provides a class that implements an inflate command. The + * inflate command decompresses data that was compressed by + * zlib. The form of the command is: + * + * \verbatim + * set result [inflate compressed-data] + * \endverbatim + * + * The following should be a time wasting null transform: + * + * \verbatim + * set result [inflate [deflate some-data]] + * \endverbatim + */ + +class CInflate : public CTCLObjectProcessor +{ +public: + CInflate(CTCLInterpreter& interp, const char* command = "inflate"); + virtual ~CInflate(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); +}; + +#endif \ No newline at end of file Modified: branches/3.4-getcontents/configure.ac =================================================================== --- branches/3.4-getcontents/configure.ac 2015-02-25 12:25:24 UTC (rev 2267) +++ branches/3.4-getcontents/configure.ac 2015-03-02 12:49:37 UTC (rev 2268) @@ -694,6 +694,12 @@ AX_GENGETOPT +## +# Check for zlib for the zip/unzip commands. + +AX_CHECK_ZLIB([AC_MSG_RESULT([Have zlib])], [AC_MSG_ERROR([zlib is a prerequisite for this version of SpecTcl])]) + + # # libTclPlus and libException could have been installed from # Ryan's Deb or I might need to install my own versions which @@ -805,4 +811,4 @@ calibratedparams/Makefile \ ccusb/Makefile ccusb/MakefileSkel \ vmusb/Makefile vmusb/MakefileSkel \ - tkcon/Makefile ) + tkcon/Makefile compress/Makefile ) Added: branches/3.4-getcontents/m4/zlib.m4 =================================================================== --- branches/3.4-getcontents/m4/zlib.m4 (rev 0) +++ branches/3.4-getcontents/m4/zlib.m4 2015-03-02 12:49:37 UTC (rev 2268) @@ -0,0 +1,142 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_zlib.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_ZLIB([action-if-found], [action-if-not-found]) +# +# DESCRIPTION +# +# This macro searches for an installed zlib library. If nothing was +# specified when calling configure, it searches first in /usr/local and +# then in /usr, /opt/local and /sw. If the --with-zlib=DIR is specified, +# it will try to find it in DIR/include/zlib.h and DIR/lib/libz.a. If +# --without-zlib is specified, the library is not searched at all. +# +# If either the header file (zlib.h) or the library (libz) is not found, +# shell commands 'action-if-not-found' is run. If 'action-if-not-found' is +# not specified, the configuration exits on error, asking for a valid zlib +# installation directory or --without-zlib. +# +# If both header file and library are found, shell commands +# 'action-if-found' is run. If 'action-if-found' is not specified, the +# default action appends '-I${ZLIB_HOME}/include' to CPFLAGS, appends +# '-L$ZLIB_HOME}/lib' to LDFLAGS, prepends '-lz' to LIBS, and calls +# AC_DEFINE(HAVE_LIBZ). You should use autoheader to include a definition +# for this symbol in a config.h file. Sample usage in a C/C++ source is as +# follows: +# +# #ifdef HAVE_LIBZ +# #include <zlib.h> +# #endif /* HAVE_LIBZ */ +# +# LICENSE +# +# Copyright (c) 2008 Loic Dachary <lo...@se...> +# Copyright (c) 2010 Bastien Chevreux <ba...@ch...> +# +# 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; either version 2 of the License, or (at your +# option) any later version. +# +# 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. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see <http://www.gnu.org/licenses/>. +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 14 + +AU_ALIAS([CHECK_ZLIB], [AX_CHECK_ZLIB]) +AC_DEFUN([AX_CHECK_ZLIB], +# +# Handle user hints +# +[AC_MSG_CHECKING(if zlib is wanted) +zlib_places="/usr/local /usr /opt/local /sw" +AC_ARG_WITH([zlib], +[ --with-zlib=DIR root directory path of zlib installation @<:@defaults to + /usr/local or /usr if not found in /usr/local@:>@ + --without-zlib to disable zlib usage completely], +[if test "$withval" != no ; then + AC_MSG_RESULT(yes) + if test -d "$withval" + then + zlib_places="$withval $zlib_places" + else + AC_MSG_WARN([Sorry, $withval does not exist, checking usual places]) + fi +else + zlib_places= + AC_MSG_RESULT(no) +fi], +[AC_MSG_RESULT(yes)]) + +# +# Locate zlib, if wanted +# +if test -n "${zlib_places}" +then + # check the user supplied or any other more or less 'standard' place: + # Most UNIX systems : /usr/local and /usr + # MacPorts / Fink on OSX : /opt/local respectively /sw + for ZLIB_HOME in ${zlib_places} ; do + if test -f "${ZLIB_HOME}/include/zlib.h"; then break; fi + ZLIB_HOME="" + done + + ZLIB_OLD_LDFLAGS=$LDFLAGS + ZLIB_OLD_CPPFLAGS=$CPPFLAGS + if test -n "${ZLIB_HOME}"; then + LDFLAGS="$LDFLAGS -L${ZLIB_HOME}/lib" + CPPFLAGS="$CPPFLAGS -I${ZLIB_HOME}/include" + fi + AC_LANG_SAVE + AC_LANG_C + AC_CHECK_LIB([z], [inflateEnd], [zlib_cv_libz=yes], [zlib_cv_libz=no]) + AC_CHECK_HEADER([zlib.h], [zlib_cv_zlib_h=yes], [zlib_cv_zlib_h=no]) + AC_LANG_RESTORE + if test "$zlib_cv_libz" = "yes" && test "$zlib_cv_zlib_h" = "yes" + then + # + # If both library and header were found, action-if-found + # + m4_ifblank([$1],[ + CPPFLAGS="$CPPFLAGS -I${ZLIB_HOME}/include" + LDFLAGS="$LDFLAGS -L${ZLIB_HOME}/lib" + LIBS="-lz $LIBS" + AC_DEFINE([HAVE_LIBZ], [1], + [Define to 1 if you have `z' library (-lz)]) + ],[ + # Restore variables + LDFLAGS="$ZLIB_OLD_LDFLAGS" + CPPFLAGS="$ZLIB_OLD_CPPFLAGS" + $1 + ]) + else + # + # If either header or library was not found, action-if-not-found + # + m4_default([$2],[ + AC_MSG_ERROR([either specify a valid zlib installation with --with-zlib=DIR or disable zlib usage with --without-zlib]) + ]) + fi +fi +]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-25 12:25:26
|
Revision: 2267 http://sourceforge.net/p/nsclspectcl/code/2267 Author: ron-fox Date: 2015-02-25 12:25:24 +0000 (Wed, 25 Feb 2015) Log Message: ----------- Fix Makefile.am typo that makes out of tree build fails. Modified Paths: -------------- trunk/main/SpecTcl/Makefile.am Modified: trunk/main/SpecTcl/Makefile.am =================================================================== --- trunk/main/SpecTcl/Makefile.am 2015-02-25 11:35:46 UTC (rev 2266) +++ trunk/main/SpecTcl/Makefile.am 2015-02-25 12:25:24 UTC (rev 2267) @@ -59,7 +59,7 @@ ScalerProcessor.h ScalerProcessorCallbacks.h \ DocumentationException.h DocumentationCallback.h \ SpecTcl.h CFoldCommand.h CProjectionCommand.h CFitCommand.h \ - IntegrateCommand.h VersionCommand.h SContentsCommand.cpp + IntegrateCommand.h VersionCommand.h SContentsCommand.h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-25 11:35:54
|
Revision: 2266 http://sourceforge.net/p/nsclspectcl/code/2266 Author: ron-fox Date: 2015-02-25 11:35:46 +0000 (Wed, 25 Feb 2015) Log Message: ----------- SpecTcl 3.4-005 * Add version command * Add scontents command. Modified Paths: -------------- trunk/main/CHANGELOG trunk/main/SpecTcl/Makefile.am trunk/main/SpecTcl/TclGrammerApp.cpp trunk/main/configure.ac Added Paths: ----------- trunk/main/SpecTcl/SContentsCommand.cpp trunk/main/SpecTcl/SContentsCommand.h trunk/main/SpecTcl/VersionCommand.cpp trunk/main/SpecTcl/VersionCommand.h Property Changed: ---------------- trunk/main/ Index: trunk/main =================================================================== --- trunk/main 2015-02-25 11:33:33 UTC (rev 2265) +++ trunk/main 2015-02-25 11:35:46 UTC (rev 2266) Property changes on: trunk/main ___________________________________________________________________ Modified: svn:mergeinfo ## -1,6 +1,7 ## /branches/3.3-007-dev:1983-1986 /branches/3.3-008-dev:1987-1996 /branches/3.3-009-development:2000-2014 +/branches/3.4-getcontents:2262-2265 /branches/SpecTcl-3.3-010-development:2016-2031 /branches/SpecTcl-3.3-013:2051-2061 /tags/SpecTcl-3.3-013-premerge:2062-2063 \ No newline at end of property Modified: trunk/main/CHANGELOG =================================================================== --- trunk/main/CHANGELOG 2015-02-25 11:33:33 UTC (rev 2265) +++ trunk/main/CHANGELOG 2015-02-25 11:35:46 UTC (rev 2266) @@ -1053,4 +1053,8 @@ * Fix error in displaying gates on 2dsum spectra: was the case that all but gates on the first two parameters were displayed flipped. * Fix error in compound get visual editor - was calling a deprecated browser - method. \ No newline at end of file + method. +3.4-005 + * Feature #3531 - add version command. + * Feature #3532 - add scontents command. + Modified: trunk/main/SpecTcl/Makefile.am =================================================================== --- trunk/main/SpecTcl/Makefile.am 2015-02-25 11:33:33 UTC (rev 2265) +++ trunk/main/SpecTcl/Makefile.am 2015-02-25 11:35:46 UTC (rev 2266) @@ -43,7 +43,8 @@ ScalerProcessor.cpp ScalerProcessorCallbacks.cpp \ DocumentationException.cpp DocumentationCallback.cpp \ SpecTcl.cpp CFoldCommand.cpp CProjectionCommand.cpp CFitCommand.cpp \ - IntegrateCommand.cpp RingFormatCommand.cpp + IntegrateCommand.cpp RingFormatCommand.cpp VersionCommand.cpp \ + SContentsCommand.cpp include_HEADERS = AppInit.h ApplyCommand.h AttachCommand.h BindCommand.h \ @@ -58,7 +59,7 @@ ScalerProcessor.h ScalerProcessorCallbacks.h \ DocumentationException.h DocumentationCallback.h \ SpecTcl.h CFoldCommand.h CProjectionCommand.h CFitCommand.h \ - IntegrateCommand.h + IntegrateCommand.h VersionCommand.h SContentsCommand.cpp Copied: trunk/main/SpecTcl/SContentsCommand.cpp (from rev 2265, branches/3.4-getcontents/SpecTcl/SContentsCommand.cpp) =================================================================== --- trunk/main/SpecTcl/SContentsCommand.cpp (rev 0) +++ trunk/main/SpecTcl/SContentsCommand.cpp 2015-02-25 11:35:46 UTC (rev 2266) @@ -0,0 +1,129 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file SContentsCommand.cpp + * @brief Implements the scontents command. + * @author Ron Fox <fo...@ns...> + */ +#include <config.h> +#include "SContentsCommand.h" +#include <Spectrum.h> +#include <SpecTcl.h> + +/** + * constructor + * Use the base class constructor to register the command + * @param interp - references the interpreter on which we are registering. + * @param command - Pointer to the string that defines the command keyword. + * this defaults to "scontents" + */ +CSContentsCommand::CSContentsCommand(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) +{} + +/** + * destructor + */ +CSContentsCommand::~CSContentsCommand() {} + +/** + * operator() + * Command processor. We get here if we must: + * * Figure out the dimensionality of the spectrum + * * Figure out the size of each axis. + * * Fetch the data from the spectrum marshalled as an appropriate list of lists. + * + * @param interp - Interpreter on which this is running. + * @param objv - Vector of encapsulated Tcl_Obj's that make up the command words. + * @return int - TCL_OK if successful or TCL_ERROR if not + */ +int +CSContentsCommand::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + // We'll use the exception throw model for handling errors. + + try { + bindAll(interp, objv); + + // Should have exactly two command words: + + requireExactly(objv, 2, "Usage\n scontents spectrum-name"); + + // Locate the spectrum + + std::string name = objv[1]; + SpecTcl* api = SpecTcl::getInstance(); + CSpectrum* pSpectrum = api->FindSpectrum(name); + + if (!pSpectrum) { + std::string msg = "Spectrum: "; + msg += name; + msg += " is not defined"; + throw msg; + } + // Figure out the dimensionality: + + UInt_t nAxes = pSpectrum->Dimensionality(); + Size_t xDim = pSpectrum->Dimension(0); // There's always an xdim. + CTCLObject result; + result.Bind(interp); + + if (nAxes == 1) { + + // 1-d spectrum [list [list x y]]. + + for (UInt_t x = 0; x < xDim; x++) { + ULong_t y = (*pSpectrum)[&x]; + if (y > 0) { + CTCLObject channel; + channel.Bind(interp); + channel += static_cast<int>(x); + channel += static_cast<int>(y); + result += channel; + } + } + + } else { + // 2-d spectrum: + + Size_t yDim = pSpectrum->Dimension(1); + UInt_t coords[2]; // For operator[] + for (UInt_t y = 0; y < yDim; y++) { + coords[1] = y; + for (UInt_t x = 0; x < xDim; x++) { + coords[0] = x; + ULong_t z = (*pSpectrum)[coords]; + if (z > 0) { + CTCLObject channel; + channel.Bind(interp); + channel += static_cast<int>(x); + channel += static_cast<int>(y); + channel += static_cast<int>(z); + result += channel; + } + } + } + } + interp.setResult(result); + + } + catch (std::string msg) { + interp.setResult(msg); + return TCL_ERROR; + } + return TCL_OK; +} \ No newline at end of file Copied: trunk/main/SpecTcl/SContentsCommand.h (from rev 2265, branches/3.4-getcontents/SpecTcl/SContentsCommand.h) =================================================================== --- trunk/main/SpecTcl/SContentsCommand.h (rev 0) +++ trunk/main/SpecTcl/SContentsCommand.h 2015-02-25 11:35:46 UTC (rev 2266) @@ -0,0 +1,65 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file SContentsCommand.h + * @brief Declare class to implement the scontents command. + * @author Ron Fox <fo...@ns...> + */ +#ifndef __SCONTENTSCOMMAND_H +#define __SCONTENTSCOMMAND_H + +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + +/** + * @class CSContentsCommand + * + * This class will implement the scontents command; The form of this + * command is: + *\verbatim + * scontents spectrum-name + *\endverbatim + * + * The return value is the list of non-zero channels from that spectrum + * (could be empty). + * + * Each list is a pair (for 1-d spectra) and a triplet (for 2-d spectra) + * the coordinates of each channel are the first (one or two) items fo the + * sublists + * + * E.g. for a 1-d spectrum you might see: + * \verbatim + * { {1 5} {3 100} ...} + * \endverbatim + * + * For a 2-d spectrum you might see: + * + * \verbatim + * { {1 2 100}, {2 4 1234} ...} + * \endverbatim + */ +class CSContentsCommand : public CTCLObjectProcessor +{ +public: + CSContentsCommand(CTCLInterpreter& interp, const char* command = "scontents"); + virtual ~CSContentsCommand(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); +}; +#endif \ No newline at end of file Modified: trunk/main/SpecTcl/TclGrammerApp.cpp =================================================================== --- trunk/main/SpecTcl/TclGrammerApp.cpp 2015-02-25 11:33:33 UTC (rev 2265) +++ trunk/main/SpecTcl/TclGrammerApp.cpp 2015-02-25 11:35:46 UTC (rev 2266) @@ -61,6 +61,8 @@ #include <CProjectionCommand.h> #include "IntegrateCommand.h" +#include "VersionCommand.h" +#include "SContentsCommand.h" #include <histotypes.h> #include <buftypes.h> @@ -539,6 +541,11 @@ CIntegrateCommand* pIntegrate = new CIntegrateCommand(rInterp); cerr << "integrate command (c) 2007 Written by Ron Fox\n"; + + CVersionCommand* pVersion = new CVersionCommand(rInterp); + CSContentsCommand* pContents = new CSContentsCommand(rInterp); + + cerr << "version, scontents command (c) 2015 Written by Ron Fox\n"; cerr.flush(); } Copied: trunk/main/SpecTcl/VersionCommand.cpp (from rev 2265, branches/3.4-getcontents/SpecTcl/VersionCommand.cpp) =================================================================== --- trunk/main/SpecTcl/VersionCommand.cpp (rev 0) +++ trunk/main/SpecTcl/VersionCommand.cpp 2015-02-25 11:35:46 UTC (rev 2266) @@ -0,0 +1,65 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file VersionCommand.cpp + * @brief implement a command to return the SpecTcl version. + * @author Ron Fox<fo...@ns...> + */ + +#include "VersionCommand.h" +#include "TCLObject.h" +#include "TCLInterpreter.h" + + +/** + * constructor + * Use base class constructor to register the command. + * + * @param interp - References the interpreter on which the command is + * registered. + * @param command - Command keyword (defaults to version). + */ +CVersionCommand::CVersionCommand(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) +{} + +/** + * destructor + */ +CVersionCommand::~CVersionCommand() {} + +/** + * operator() + * The actual command processor. Our job is trivial since the VERSION + * preprocessor string already carries the Spectcl version string. + * + * @param interp - Interpreter running the commnand. + * @param objv - The encapsulated Tcl_Obj's that make up the command. + * @return int - TCL_OK on success, TCL_ERROR on failure + * The only possible failure is to have additional words in + * the command list after the keyword. + */ +int CVersionCommand::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + if (objv.size() != 1) { + interp.setResult("Incorrect number of parameters"); + return TCL_ERROR; + } + + interp.setResult(VERSION); + return TCL_OK; +} \ No newline at end of file Copied: trunk/main/SpecTcl/VersionCommand.h (from rev 2265, branches/3.4-getcontents/SpecTcl/VersionCommand.h) =================================================================== --- trunk/main/SpecTcl/VersionCommand.h (rev 0) +++ trunk/main/SpecTcl/VersionCommand.h 2015-02-25 11:35:46 UTC (rev 2266) @@ -0,0 +1,50 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file VersionCommand.h + * @brief Define a command to return the SpecTcl version. + * @author Ron Fox<fo...@ns...> + */ +#ifndef __VERSIONCOMMAND_H +#define __VERSIONCOMMAND_H + +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + +/** + * @class CVersionCommand + * + * Define a command processor that returns the Spectcl version in + * major.minor-editlevel format. + * This is intended to allow scripts to determine if specific featurs + * are present in the SpecTcl in which they run. Note that given the Tcl + * octal leading 0 bit scripts should trim leading zeroes from the edit level + * prior to interpreting it. + */ +class CVersionCommand : public CTCLObjectProcessor +{ +public: + CVersionCommand(CTCLInterpreter& interp, const char* pCommand="version"); + virtual ~CVersionCommand(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); +}; + + +#endif \ No newline at end of file Modified: trunk/main/configure.ac =================================================================== --- trunk/main/configure.ac 2015-02-25 11:33:33 UTC (rev 2265) +++ trunk/main/configure.ac 2015-02-25 11:35:46 UTC (rev 2266) @@ -1,5 +1,5 @@ # Process this file with autoconf to produce a configure script. -AC_INIT(SpecTcl,3.4-004) +AC_INIT(SpecTcl,3.4-005) AC_CONFIG_SRCDIR(SpecTcl/MySpecTclApp.cpp) AC_CONFIG_AUX_DIR(config) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-25 11:33:35
|
Revision: 2265 http://sourceforge.net/p/nsclspectcl/code/2265 Author: ron-fox Date: 2015-02-25 11:33:33 +0000 (Wed, 25 Feb 2015) Log Message: ----------- If the scontents command is available, use it to create JSON for 2-d spectra. Modified Paths: -------------- trunk/plugins/rest/configure trunk/plugins/rest/custom/spectrum.tcl Modified: trunk/plugins/rest/configure =================================================================== --- trunk/plugins/rest/configure 2015-02-24 14:47:14 UTC (rev 2264) +++ trunk/plugins/rest/configure 2015-02-25 11:33:33 UTC (rev 2265) @@ -1,40 +1,771 @@ #! /bin/sh - # Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# Generated by GNU Autoconf 2.69. # +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## -# Defaults: -ac_help= +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug...@gn... about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 </dev/null +exec 6>&1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-serverroot=DIR Location of where to install the server document tree" -ac_help="$ac_help - --enable-gcc allow use of gcc if available [--disable-gcc]" -ac_help="$ac_help - --with-tcl directory containing tcl configuration (tclConfig.sh)" -ac_help="$ac_help - --with-tclinclude directory containing the public Tcl header files." -ac_help="$ac_help - --enable-threads build with threads" -ac_help="$ac_help - --enable-shared build and link with shared libraries [--enable-shared]" -ac_help="$ac_help - --enable-symbols build with debugging symbols [--disable-symbols]" +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= +PACKAGE_URL= + +ac_unique_file="bin/httpd.tcl" +# Factoring default headers for most tests. +ac_includes_default="\ +#include <stdio.h> +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef STDC_HEADERS +# include <stdlib.h> +# include <stddef.h> +#else +# ifdef HAVE_STDLIB_H +# include <stdlib.h> +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include <memory.h> +# endif +# include <string.h> +#endif +#ifdef HAVE_STRINGS_H +# include <strings.h> +#endif +#ifdef HAVE_INTTYPES_H +# include <inttypes.h> +#endif +#ifdef HAVE_STDINT_H +# include <stdint.h> +#endif +#ifdef HAVE_UNISTD_H +# include <unistd.h> +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +TCLSH_PROG +SHLIB_LD_LIBS +crypt_LIB_FILE +limit_LIB_FILE +SHARED_BUILD +MAKE_STATIC_LIB +MAKE_SHARED_LIB +MAKE_LIB +LDFLAGS_DEFAULT +CFLAGS_DEFAULT +BUILD_LIMIT +LIMIT_EXTENSION +EGREP +GREP +CPP +CRYPT_OBJS +SHLIB_LDFLAGS +SHLIB_CFLAGS +SHLIB_LD +STLIB_LD +CFLAGS_OPTIMIZE +CFLAGS_DEBUG +CLEANFILES +TCL_INCLUDES +TCL_BUILD_STUB_LIB_SPEC +TCL_STUB_LIB_SPEC +TCL_BUILD_LIB_SPEC +TCL_LIB_SPEC +TCL_STUB_LIB_FILE +TCL_LD_FLAGS +TCL_EXTRA_CFLAGS +TCL_SHLIB_LD_LIBS +TCL_DEFS +TCL_LIBS +TCL_LIB_FILE +TCL_SRC_DIR +TCL_BIN_DIR +TCL_DBGX +RELPATH +CYGPATH +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +RANLIB +SET_MAKE +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +THREAD_VERSION +TCLLIB_VERSION +TCL_VERSION +WIN_LIMIT_VERSION +LIMIT_VERSION +LIMIT_PACKAGE +WIN_CRYPT_VERSION +CRYPT_VERSION +CRYPT_PACKAGE +WIN_VERSION +RELEASE +VERSION +SERVER_ROOT +PACKAGE +CONFIGDIR +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +with_serverroot +enable_gcc +with_tcl +with_tclinclude +enable_threads +enable_shared +enable_symbols +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP' + + # Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. -build=NONE -cache_file=./config.cache +cache_file=/dev/null exec_prefix=NONE -host=NONE no_create= -nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE @@ -43,94 +774,132 @@ silent= site= srcdir= -target=NONE verbose= x_includes=NONE x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' +datarootdir='${prefix}/share' +datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' +docdir='${datarootdir}/doc/${PACKAGE}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - ac_prev= +ac_dashdash= for ac_option do - # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" + eval $ac_prev=\$ac_option ac_prev= continue fi - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. - case "$ac_option" in + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; + bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) - ac_prev=build ;; + ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; + build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; + cache_file=$ac_optarg ;; - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "enable_${ac_feature}='$ac_optarg'" ;; + eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ @@ -139,116 +908,77 @@ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; + exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; -host | --host | --hos | --ho) - ac_prev=host ;; + ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; + host_alias=$ac_optarg ;; + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; + includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; + infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; + libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; + libexecdir=$ac_optarg ;; + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) + | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; + mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) + | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ @@ -262,26 +992,26 @@ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; + oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; + prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; + program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; + program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ @@ -298,8 +1028,18 @@ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; + program_transform_name=$ac_optarg ;; + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; @@ -308,7 +1048,7 @@ ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; + sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ @@ -319,58 +1059,67 @@ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; + sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; + site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; + srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; + sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; + ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; + target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; esac - eval "with_${ac_package}='$ac_optarg'" ;; + eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. @@ -381,180 +1130,1072 @@ ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; + x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; + x_libraries=$ac_optarg ;; - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" ;; + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" fi -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac fi -exec 5>./config.log -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=bin/httpd.tcl +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then + if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures this package to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-gcc allow use of gcc if available --disable-gcc + --enable-threads build with threads + --enable-shared build and link with shared libraries --enable-shared + --enable-symbols build with debugging symbols --disable-symbols + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-serverroot=DIR Location of where to install the server document tree + --with-tcl directory containing tcl configuration (tclConfig.sh) + --with-tclinclude directory containing the public Tcl header files. + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a + nonstandard directory <lib dir> + LIBS libraries to pass to the linker, e.g. -l<library> + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if + you have headers in a nonstandard directory <include dir> + CPP C preprocessor + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to the package provider. +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +configure +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" +} # ac_fn_c_try_compile + +# ac_fn_c_try_link LINENO +# ----------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_link () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext conftest$ac_exeext + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + test -x conftest$ac_exeext + }; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" + # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information + # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would + # interfere with the next link command; also delete a directory that is + # left behind by Apple's compiler. We do this before executing the actions. + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_link + +# ac_fn_c_check_func LINENO FUNC VAR +# ---------------------------------- +# Tests whether FUNC exists, setting the cache variable VAR accordingly +ac_fn_c_check_func () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Define $2 to an innocuous variant, in case <limits.h> declares $2. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $2 innocuous_$2 + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $2 (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $2 + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char $2 (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$2 || defined __stub___$2 +choke me +#endif + +int +main () +{ +return $2 (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_func + +# ac_fn_c_try_cpp LINENO +# ---------------------- +# Try to preprocess conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_cpp () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_cpp conftest.$ac_ext" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } > conftest.i && { + ... [truncated message content] |
From: <ro...@us...> - 2015-02-24 14:47:22
|
Revision: 2264 http://sourceforge.net/p/nsclspectcl/code/2264 Author: ron-fox Date: 2015-02-24 14:47:14 +0000 (Tue, 24 Feb 2015) Log Message: ----------- Feature #3532 - add scontents command to better support REST interface for large 2-d spectra. Modified Paths: -------------- branches/3.4-getcontents/CHANGELOG branches/3.4-getcontents/SpecTcl/Makefile.am branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp Added Paths: ----------- branches/3.4-getcontents/SpecTcl/SContentsCommand.cpp branches/3.4-getcontents/SpecTcl/SContentsCommand.h Modified: branches/3.4-getcontents/CHANGELOG =================================================================== --- branches/3.4-getcontents/CHANGELOG 2015-02-24 13:17:19 UTC (rev 2263) +++ branches/3.4-getcontents/CHANGELOG 2015-02-24 14:47:14 UTC (rev 2264) @@ -1053,4 +1053,8 @@ * Fix error in displaying gates on 2dsum spectra: was the case that all but gates on the first two parameters were displayed flipped. * Fix error in compound get visual editor - was calling a deprecated browser - method. \ No newline at end of file + method. +3.4-005 + * Feature #3531 - add version command. + * Feature #3532 - add scontents command. + Modified: branches/3.4-getcontents/SpecTcl/Makefile.am =================================================================== --- branches/3.4-getcontents/SpecTcl/Makefile.am 2015-02-24 13:17:19 UTC (rev 2263) +++ branches/3.4-getcontents/SpecTcl/Makefile.am 2015-02-24 14:47:14 UTC (rev 2264) @@ -43,7 +43,8 @@ ScalerProcessor.cpp ScalerProcessorCallbacks.cpp \ DocumentationException.cpp DocumentationCallback.cpp \ SpecTcl.cpp CFoldCommand.cpp CProjectionCommand.cpp CFitCommand.cpp \ - IntegrateCommand.cpp RingFormatCommand.cpp VersionCommand.cpp + IntegrateCommand.cpp RingFormatCommand.cpp VersionCommand.cpp \ + SContentsCommand.cpp include_HEADERS = AppInit.h ApplyCommand.h AttachCommand.h BindCommand.h \ @@ -58,7 +59,7 @@ ScalerProcessor.h ScalerProcessorCallbacks.h \ DocumentationException.h DocumentationCallback.h \ SpecTcl.h CFoldCommand.h CProjectionCommand.h CFitCommand.h \ - IntegrateCommand.h VersionCommand.h + IntegrateCommand.h VersionCommand.h SContentsCommand.cpp Added: branches/3.4-getcontents/SpecTcl/SContentsCommand.cpp =================================================================== --- branches/3.4-getcontents/SpecTcl/SContentsCommand.cpp (rev 0) +++ branches/3.4-getcontents/SpecTcl/SContentsCommand.cpp 2015-02-24 14:47:14 UTC (rev 2264) @@ -0,0 +1,129 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file SContentsCommand.cpp + * @brief Implements the scontents command. + * @author Ron Fox <fo...@ns...> + */ +#include <config.h> +#include "SContentsCommand.h" +#include <Spectrum.h> +#include <SpecTcl.h> + +/** + * constructor + * Use the base class constructor to register the command + * @param interp - references the interpreter on which we are registering. + * @param command - Pointer to the string that defines the command keyword. + * this defaults to "scontents" + */ +CSContentsCommand::CSContentsCommand(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) +{} + +/** + * destructor + */ +CSContentsCommand::~CSContentsCommand() {} + +/** + * operator() + * Command processor. We get here if we must: + * * Figure out the dimensionality of the spectrum + * * Figure out the size of each axis. + * * Fetch the data from the spectrum marshalled as an appropriate list of lists. + * + * @param interp - Interpreter on which this is running. + * @param objv - Vector of encapsulated Tcl_Obj's that make up the command words. + * @return int - TCL_OK if successful or TCL_ERROR if not + */ +int +CSContentsCommand::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + // We'll use the exception throw model for handling errors. + + try { + bindAll(interp, objv); + + // Should have exactly two command words: + + requireExactly(objv, 2, "Usage\n scontents spectrum-name"); + + // Locate the spectrum + + std::string name = objv[1]; + SpecTcl* api = SpecTcl::getInstance(); + CSpectrum* pSpectrum = api->FindSpectrum(name); + + if (!pSpectrum) { + std::string msg = "Spectrum: "; + msg += name; + msg += " is not defined"; + throw msg; + } + // Figure out the dimensionality: + + UInt_t nAxes = pSpectrum->Dimensionality(); + Size_t xDim = pSpectrum->Dimension(0); // There's always an xdim. + CTCLObject result; + result.Bind(interp); + + if (nAxes == 1) { + + // 1-d spectrum [list [list x y]]. + + for (UInt_t x = 0; x < xDim; x++) { + ULong_t y = (*pSpectrum)[&x]; + if (y > 0) { + CTCLObject channel; + channel.Bind(interp); + channel += static_cast<int>(x); + channel += static_cast<int>(y); + result += channel; + } + } + + } else { + // 2-d spectrum: + + Size_t yDim = pSpectrum->Dimension(1); + UInt_t coords[2]; // For operator[] + for (UInt_t y = 0; y < yDim; y++) { + coords[1] = y; + for (UInt_t x = 0; x < xDim; x++) { + coords[0] = x; + ULong_t z = (*pSpectrum)[coords]; + if (z > 0) { + CTCLObject channel; + channel.Bind(interp); + channel += static_cast<int>(x); + channel += static_cast<int>(y); + channel += static_cast<int>(z); + result += channel; + } + } + } + } + interp.setResult(result); + + } + catch (std::string msg) { + interp.setResult(msg); + return TCL_ERROR; + } + return TCL_OK; +} \ No newline at end of file Added: branches/3.4-getcontents/SpecTcl/SContentsCommand.h =================================================================== --- branches/3.4-getcontents/SpecTcl/SContentsCommand.h (rev 0) +++ branches/3.4-getcontents/SpecTcl/SContentsCommand.h 2015-02-24 14:47:14 UTC (rev 2264) @@ -0,0 +1,65 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file SContentsCommand.h + * @brief Declare class to implement the scontents command. + * @author Ron Fox <fo...@ns...> + */ +#ifndef __SCONTENTSCOMMAND_H +#define __SCONTENTSCOMMAND_H + +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + +/** + * @class CSContentsCommand + * + * This class will implement the scontents command; The form of this + * command is: + *\verbatim + * scontents spectrum-name + *\endverbatim + * + * The return value is the list of non-zero channels from that spectrum + * (could be empty). + * + * Each list is a pair (for 1-d spectra) and a triplet (for 2-d spectra) + * the coordinates of each channel are the first (one or two) items fo the + * sublists + * + * E.g. for a 1-d spectrum you might see: + * \verbatim + * { {1 5} {3 100} ...} + * \endverbatim + * + * For a 2-d spectrum you might see: + * + * \verbatim + * { {1 2 100}, {2 4 1234} ...} + * \endverbatim + */ +class CSContentsCommand : public CTCLObjectProcessor +{ +public: + CSContentsCommand(CTCLInterpreter& interp, const char* command = "scontents"); + virtual ~CSContentsCommand(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); +}; +#endif \ No newline at end of file Modified: branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp =================================================================== --- branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp 2015-02-24 13:17:19 UTC (rev 2263) +++ branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp 2015-02-24 14:47:14 UTC (rev 2264) @@ -62,6 +62,7 @@ #include <CProjectionCommand.h> #include "IntegrateCommand.h" #include "VersionCommand.h" +#include "SContentsCommand.h" #include <histotypes.h> #include <buftypes.h> @@ -542,6 +543,7 @@ cerr << "integrate command (c) 2007 Written by Ron Fox\n"; CVersionCommand* pVersion = new CVersionCommand(rInterp); + CSContentsCommand* pContents = new CSContentsCommand(rInterp); cerr << "version, scontents command (c) 2015 Written by Ron Fox\n"; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-24 13:17:21
|
Revision: 2263 http://sourceforge.net/p/nsclspectcl/code/2263 Author: ron-fox Date: 2015-02-24 13:17:19 +0000 (Tue, 24 Feb 2015) Log Message: ----------- * Update VERSION to 3.4-005 * Add the version command so that scripts can do feature testing. Modified Paths: -------------- branches/3.4-getcontents/SpecTcl/Makefile.am branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp branches/3.4-getcontents/configure.ac Added Paths: ----------- branches/3.4-getcontents/SpecTcl/VersionCommand.cpp branches/3.4-getcontents/SpecTcl/VersionCommand.h Modified: branches/3.4-getcontents/SpecTcl/Makefile.am =================================================================== --- branches/3.4-getcontents/SpecTcl/Makefile.am 2015-02-24 12:48:44 UTC (rev 2262) +++ branches/3.4-getcontents/SpecTcl/Makefile.am 2015-02-24 13:17:19 UTC (rev 2263) @@ -43,7 +43,7 @@ ScalerProcessor.cpp ScalerProcessorCallbacks.cpp \ DocumentationException.cpp DocumentationCallback.cpp \ SpecTcl.cpp CFoldCommand.cpp CProjectionCommand.cpp CFitCommand.cpp \ - IntegrateCommand.cpp RingFormatCommand.cpp + IntegrateCommand.cpp RingFormatCommand.cpp VersionCommand.cpp include_HEADERS = AppInit.h ApplyCommand.h AttachCommand.h BindCommand.h \ @@ -58,7 +58,7 @@ ScalerProcessor.h ScalerProcessorCallbacks.h \ DocumentationException.h DocumentationCallback.h \ SpecTcl.h CFoldCommand.h CProjectionCommand.h CFitCommand.h \ - IntegrateCommand.h + IntegrateCommand.h VersionCommand.h Modified: branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp =================================================================== --- branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp 2015-02-24 12:48:44 UTC (rev 2262) +++ branches/3.4-getcontents/SpecTcl/TclGrammerApp.cpp 2015-02-24 13:17:19 UTC (rev 2263) @@ -61,6 +61,7 @@ #include <CProjectionCommand.h> #include "IntegrateCommand.h" +#include "VersionCommand.h" #include <histotypes.h> #include <buftypes.h> @@ -539,6 +540,10 @@ CIntegrateCommand* pIntegrate = new CIntegrateCommand(rInterp); cerr << "integrate command (c) 2007 Written by Ron Fox\n"; + + CVersionCommand* pVersion = new CVersionCommand(rInterp); + + cerr << "version, scontents command (c) 2015 Written by Ron Fox\n"; cerr.flush(); } Added: branches/3.4-getcontents/SpecTcl/VersionCommand.cpp =================================================================== --- branches/3.4-getcontents/SpecTcl/VersionCommand.cpp (rev 0) +++ branches/3.4-getcontents/SpecTcl/VersionCommand.cpp 2015-02-24 13:17:19 UTC (rev 2263) @@ -0,0 +1,65 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file VersionCommand.cpp + * @brief implement a command to return the SpecTcl version. + * @author Ron Fox<fo...@ns...> + */ + +#include "VersionCommand.h" +#include "TCLObject.h" +#include "TCLInterpreter.h" + + +/** + * constructor + * Use base class constructor to register the command. + * + * @param interp - References the interpreter on which the command is + * registered. + * @param command - Command keyword (defaults to version). + */ +CVersionCommand::CVersionCommand(CTCLInterpreter& interp, const char* command) : + CTCLObjectProcessor(interp, command, true) +{} + +/** + * destructor + */ +CVersionCommand::~CVersionCommand() {} + +/** + * operator() + * The actual command processor. Our job is trivial since the VERSION + * preprocessor string already carries the Spectcl version string. + * + * @param interp - Interpreter running the commnand. + * @param objv - The encapsulated Tcl_Obj's that make up the command. + * @return int - TCL_OK on success, TCL_ERROR on failure + * The only possible failure is to have additional words in + * the command list after the keyword. + */ +int CVersionCommand::operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv) +{ + if (objv.size() != 1) { + interp.setResult("Incorrect number of parameters"); + return TCL_ERROR; + } + + interp.setResult(VERSION); + return TCL_OK; +} \ No newline at end of file Added: branches/3.4-getcontents/SpecTcl/VersionCommand.h =================================================================== --- branches/3.4-getcontents/SpecTcl/VersionCommand.h (rev 0) +++ branches/3.4-getcontents/SpecTcl/VersionCommand.h 2015-02-24 13:17:19 UTC (rev 2263) @@ -0,0 +1,50 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +/** + * @file VersionCommand.h + * @brief Define a command to return the SpecTcl version. + * @author Ron Fox<fo...@ns...> + */ +#ifndef __VERSIONCOMMAND_H +#define __VERSIONCOMMAND_H + +#include <TCLObjectProcessor.h> + +class CTCLInterpreter; +class CTCLObject; + +/** + * @class CVersionCommand + * + * Define a command processor that returns the Spectcl version in + * major.minor-editlevel format. + * This is intended to allow scripts to determine if specific featurs + * are present in the SpecTcl in which they run. Note that given the Tcl + * octal leading 0 bit scripts should trim leading zeroes from the edit level + * prior to interpreting it. + */ +class CVersionCommand : public CTCLObjectProcessor +{ +public: + CVersionCommand(CTCLInterpreter& interp, const char* pCommand="version"); + virtual ~CVersionCommand(); + + int operator()(CTCLInterpreter& interp, std::vector<CTCLObject>& objv); +}; + + +#endif \ No newline at end of file Modified: branches/3.4-getcontents/configure.ac =================================================================== --- branches/3.4-getcontents/configure.ac 2015-02-24 12:48:44 UTC (rev 2262) +++ branches/3.4-getcontents/configure.ac 2015-02-24 13:17:19 UTC (rev 2263) @@ -1,5 +1,5 @@ # Process this file with autoconf to produce a configure script. -AC_INIT(SpecTcl,3.4-004) +AC_INIT(SpecTcl,3.4-005) AC_CONFIG_SRCDIR(SpecTcl/MySpecTclApp.cpp) AC_CONFIG_AUX_DIR(config) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-24 12:48:47
|
Revision: 2262 http://sourceforge.net/p/nsclspectcl/code/2262 Author: ron-fox Date: 2015-02-24 12:48:44 +0000 (Tue, 24 Feb 2015) Log Message: ----------- Branch to: * Add version command to SpecTcl so you can get the version number and use it to determine if features are present. * Add scontents command to improve REST plugin performance for large 2d spectra. Added Paths: ----------- branches/3.4-getcontents/ branches/3.4-getcontents/ChangeLog branches/3.4-getcontents/Makefile.am branches/3.4-getcontents/SpecTcl/SpecTcl_Makefile.include Removed Paths: ------------- branches/3.4-getcontents/ChangeLog branches/3.4-getcontents/Makefile.am branches/3.4-getcontents/SpecTcl/SpecTcl_Makefile.include Index: branches/3.4-getcontents =================================================================== --- trunk/main 2015-02-03 19:46:48 UTC (rev 2244) +++ branches/3.4-getcontents 2015-02-24 12:48:44 UTC (rev 2262) Property changes on: branches/3.4-getcontents ___________________________________________________________________ Added: svn:mergeinfo ## -0,0 +1,6 ## +/branches/3.3-007-dev:1983-1986 +/branches/3.3-008-dev:1987-1996 +/branches/3.3-009-development:2000-2014 +/branches/SpecTcl-3.3-010-development:2016-2031 +/branches/SpecTcl-3.3-013:2051-2061 +/tags/SpecTcl-3.3-013-premerge:2062-2063 \ No newline at end of property Deleted: branches/3.4-getcontents/ChangeLog =================================================================== --- trunk/main/ChangeLog 2015-02-03 19:46:48 UTC (rev 2244) +++ branches/3.4-getcontents/ChangeLog 2015-02-24 12:48:44 UTC (rev 2262) @@ -1,1051 +0,0 @@ -] -2.1-006 - Incorporate fix 113 - low level cutoffs lead to corrupted - 1-d displays. - - Have build procedures clean any pre-built Gri prior to - tarring up the distribution. -2.1-007 - Incorporate fix 120 - memory leak on spectrum -delete -all - - Date/time/version stamp installation. -2.1-008 - - Incorporate fix for issue 95: parameter -list -byid fails to parse - the output list for sorting. - - Incorporate fix for issue 105: sbind usage level help refers to - itself as the bind command not sbind. - - Incorporate fix for issue 111: swrite creates a file even if - no valid spectra are included on the command line. -2.1-009 - - Incorporate printing fixes for last channel of 1-d. - - Incorporate printinf fix ensure that 2-d spectrum channels display - all non zeroes even if they are below the threshold for the lowest - color range. - - Place upper limits on 1-d graphical entries at the top of the - channel rather than at the bottom. This more realistically - describes what's going on - - Fix issue 118 Superpositions in window files are by id not name. - - Fix issue 122 Speclist with a single spectrum gives blank output. - - Fix issue 123 Print with superpositions crashes gri (gives it a - bad command file). - - Fix issue 124 FWHM not transformed to mapped coordinates. -2.1-010 - Fix Display/Makefile issues with lingering bison/flex output - Add missing return value in ValidValue::operator=. -2.1-011 - Fix issue 135 swrite -format ascii does not retain the axis - mapping information correctly. - - Fallout from issue 133; fixed a defect in Display/axes.cc where - computation of mapped channel tick mark intervals could cause - DIV0 crashes in Xamine when the axis decreases from left to right. - - Backport colormanager intelligent visual choices from 2.2 -2.1-012 - Backport fix for defect 144 from 2.2: Memory leak when user - rejects events. - - Backport repair for defect 149: Some cases where spectrum - deletion from Xamine can kill both Xamine and SpecTcl - - Backport repair for defect 145 Names with special characters - cause saveall to produce bad files. -2.1-013 - Backport filter generation fix from 2.2 - Repair defect 157: Graphical object copies fail if target - is spectrum slot > 999 -2.1-014 - - Fixed defect 151: printing 2-d's the channels have incorrect - values, and log prints are just plain flat lined. -2.1-015 - - Fix un-numbered defect channel command gets/sets wrong channel - on Gamma 2-d's. This was broken with the introduction of - arbitrary binning in 2.1. -Modifications for SpecTcl 2.2 -January 30,2004 - Updated gri to gri-2.12.7 -March 23, 2004 - Issue 97b - Add hierarchical unpacking capability to scripted spectcl. - - Also don't require begin run to pick up config. -March 31, 2004 - Added -rpath to contrib/scripted Makefile so that - LD_LIBRARY_PATH or ld.so.conf not needed. -April 5, 2004 - Fix issue 118 - low level cutoff display bug. -April 12, 2004 - Extract as many defs as possible from skeleton makefiles - to centrally located include files in order to keep the - user makefiles constant. - - Use etc not Etc for etcetera stuff. - - Add buildstamp -April 13, 2004 - Fix memory leak on delete -all command: Spectrum - storage itself is not getting deleted. - - Fix lack of error checking on insufficient memory for - binding 2d spectrum (can segfault). -April 29, 2004 - Fix issue 95: parameter -list -byid fails. -April 29, 2004 - Fix issue 105: sbind Usage level help calls itself the - bind command which conflicts, of course, with the TCL - bind command. -April 29, 2004 - Fix issue 111 - swrite command creates a file even if no - existing spectra have been specified. -May 5, 2004 - Fix little diddly issues with printing and also - Put right limit at the top of a channel rather than the - left side of a channel. - - Fix ISSUE 118 superpositions in window files are written - as id's not as names. - - Fix issue 123 superpositions don't print - - Fix issue 124 FWHM is not translated to mapped coordinates - when spectrum is in mapped mode. -May 12, 2004 - Fix issue 49 - Fetching values from ValidValues that are in the - invalid state will now throw exceptions - - Fix issue with Display/Makefile that clean leaves behind - detritus from flex and bison. (Added MOSTLYCLEANFILES - to Display/Makefile.am). -June 8, 2004 - Increase spectrum size limits to 2^31. -June 17, 2004 - Defect 131 - There were problems generating the print tick - intervals when the axis specifications went in 'reverse' - (e.g. {100 -100 200}). Fixed in modifications to - griprint.cc I think. - - Fix build issues in TestFiles directory so that the - event test generting programs can be built again Yeah. -July 1, 2004 - Defect 135 - swrite does not properly preserve the - axis mapping information. - Fallout from defect 133 discovered and fixed a defect - that causes the axis tick computation to DIV0 when - mapped axes have decreasing values going away from the - origin (e.g. {100 -100 201}). -July 2, 2004 - Defect 132 - Translator pointers are constrained to - natural data boundaries. - - Defect 137 - Fix defect introducec by fix of Defect 132: - assumed getOffset was returning T offset it's now returning - byte offsets. -July 9, 2004 - Added DesignByContract to the Utility headers. -July 27, 2004 - Added contrib/calibratedparams (TUNL) for linear - calibrations for parameters first the fit functions. -July 30, 2004 - Added CCAENV1x90Data.h to contrib/scriptable in order - to support unpacking of this module. -August 9, 2004 - Modified colormgr.cc to better deal with systems that - have visuals that are not in decent order nor good: - Look through all the visuals and choose the true/direct - color visual with the most bits, if none exist, then - Choose the Pseudo color visual with the most bits. - If none of those exist drop back to bitonal. -August 16, 2004 - Fix broken link to apply.htm in categories.htm documentation -August 17, 2004 - Added the calbrated parameters sources to the mix - (need to get them to compile!). - Debugged as of August 20. -August 25, 2004 - Fixed defect 144 - memory leak if user rejects events. -September 2, 2004 - Made pseudo parameters pass validity flags too. -September 7, 2004 - Fix error in CEventFilter::setBit... which did not - count on there being 8 bits per byte. -September 8, 2004 - Removed in-linedness of CGate::RecursiveReest I had - thought this was triggering a compiler error but - it was not in fact. Since this is a virt. there's no - gain to inlining it anyway. -September 23,2004 - NamedItem.h - decided to finally trust stl's string - constructors.. the way I was doing named item - constructors was giving Purify fits. -September 24,2004 - Added CalibrationDistribution to produce evenly spaced - identical peaks. - - Added mechanism to fetch the applicatino's test data - source so that it can be modified etc. - - Fixed defect in CTclGrammerApp::SetupTestDatsSource - there was a local declaration of a m_pMultiTestSource - that masked the member data.: - -September 30,2004 - Happy Birthday Ron!! - - Fixed issue 133 Centroids and - FWHM not correct for mapped parameters (still). - - Made test distributions produce floating point params - to make the more flexible.. Gaussian is a symmetric - cutoff now. -October 4, 2004 - Added a bit of defensive programming in view of defect - 149. -October 19, 2004 - Changed default gate names in Xamine to be better in line - with well behaved TCL Strings. -October 18-20 2004 - Factor all coordinate transformations into common spots - part of trying to fix defect 133. -October 20, 2004 - Additional code reorganization of Xamine stuff that - I just could not stand to look at in fixing defect 133. -October 20, 2004 - Factor acceptgates.cc DrawPoints functions back into - the base class where it belongs. Could not stand to look - at it duplicated in 3 different places. -October 20-22 2004 - Fix defect 145: Spaces and special characters in names - can make saveall loadall fail miserably...and other misc. - things uncovered while repairing the defect. -October 25,26 2004 - Optimize 1d long histogram increments. Note that many - but not all changes will help 2d word increments too, but - these (less often used) histograms won't get full benefit - as there are modifications to the Spectrum1DL file that - are deliberately not propagated back to Spectrum1DW -October 27, 2004 -Optimize2d short histogram increments - -November 3,2004 - Fixed position computations on expanded spectra. -November 4,2004 - Fixed defect 60 in Xamine: Spectrum choosers should come out - sorted by name. -November 102004 - Repaired defect 147: Xamine copy object copies to wrong - spectrum if slot # > 999 - -Edit level 2.2-001 -November 30, 2004 - - Forward port fix to defect 151 from 2.1: - colorscales on griprint were way off for 2-d prints. - - Fix unnumbered defect: channel get/set broke for 2-d gamma - spectra starting with SpecTcl 2.2 - spectrum if slot # > 999 - -SpecTcl 3.0: - Port to gcc/g++ 3.x: - o Lots of gruntwork with config.h etc. in all sources. - o Added Tcl Channel inquiry functions to CTCLInterpreter to - allow the location of Tcl_Channel given it's name. - GetChannel - GetChannelNames - o Added CTCLChannel object that can do simple channel operations. - Read - Write - atEof - Flush - Close - o In {Write,Read}Command.cpp use tcl[io]streams to connect - swrite/sread to Tcl channel parameters rather than decoding the - filename. - Propagate fix for defect 151 from 2.1 -> 2.2-> 3.0 - -December 28, 2004 - - Switch ExprLong -> strtol in contrib/scriptable CIntConfigParam.cpp - and CIntArrayParam.cpp since ExprLong, as of Tcl 8.4 does not work - with large unsigned values. -December 31, 2004 - - D. Bazin removed the treeparam Makefiles. Adjust the - contrib/Makefile.am accordingly. -January 06, 2005 - - Fixed up some missing quotes on makefile.skel's. -January 11, 2005 - - Roll in another treeparmaeter update from D. Bazin -January 12, 2005 - - swrite file creation needs an ios::trunc else existing files will - leave postpended data if they were larger. -January 13, 2005 - - Xamine superposition fix for id's > 999 -January 26, 2005 - - Fix problem with long spectrum names: - o Xamine's truncation was making CHistogrammer::UnbindFromDisplay - assert fail. - o Xamine was not putting up the correct spectrum list due to a buffer - overflow problem in spectra.cc -January 27, 2005 - - Fix low level cutoff in 1-ds that had been fixed in 2.1 but not - propagated to new versions. - -3.0-001 -February 11, 2005 - - Added Analysis subdirectory to the build. This directory will have stuff - that's used by buffer analysis it is NSCL specific. -February 14, 2005 - - Completed testing of Analysis library. -February 15, 2005 - - Added C interface to Analysis library and unit tests for those. - - Added check for paths for the 'check' c unit test framework. -February 22, 2005 - - Added/debugged classes to TCL++ that make it easy to - do variable tracing (TCLTracedVariable, and VariableTraceCallbac e.g.). - - Added stuff to SpecTcl that allows it to pull stuff out of string list - buffers that represent TCL scriptlets and execute those scripts. this - is currently useful to reconstruct control system data and other stuff - that may be in statevariable and runvariable buffers which look like - a bunch of set varname value commands. - - Fix 1/0 month counting problem with run control timestamps in - Analysis library. -February 25, 2005 - - Documented the variable tracing support. - - Documented run/state variable recovery. -March 4, 2005 - - Set the version string to 3.0pre1 -March 8, 2005 - - Move the event sink pipeline class into Events and out of - the Filter directory. - - Add SpecTcl API (tested) to the build and cvs. -March 17, 2005 - - Add documentation for the SpecTcl api as a spectcl man page. -March 21, 2005 - - Added -fno-elide-constructors to user's makefile to ensure that - TreeParameter construction is handled correctly. - - Support settable I/O poll dwell time. -April 15, 2005 - - Began integrating a rewritten treeparameter into the software. -April 16, 2005 - - In contrib/calibparam : add a random number in [-.5, .5] to the - input of the calibration under the assumption that the input is - integer and therefore needs to be turned into a real. -April 18, 2005 - - Added documentation to the treeparamter package. -April 19, 2005 - - Fix up a tcl 8.4 dependency in CTreeVariableProperties.cpp -April 21, 2005 - - Fix up coordinate transform problems in Xamine with grobj locations. - Scaled wrong and offset wrong. - - Make it a bit clearer that the Treeparameter GUI version is decoupled - from SpecTcl's version... for now. -April 22, 2005 - - Remove nulls from Xamine's log files and replace them with \n's instead. -April 29, 2005 - - TreeParameter save function didn't always get the dependencies right - causing error in loading. Changed functions in SpectrumGenerator.tcl. - Fix for bugzilla bug 173 -May 2, 2005 - - Ensure filters get closed if active at program normal exit. - - Encapsulate Xamine's gates and grobs inside a vector so that there's no - longer a fixed compilation limit on the number of gates /objects that - can be defined. - - Support GCC-3.4 compiler -May 11, 2005 - - Added support for StripChart Spectra - - Check the compiler type in configure to see if we can use -pedantic - and do so if we can. - - Debug -pedantic effects on compilation. - - Fix defects nobody noticed in swrite -format binary/sread -format binary - Probably introduced about SpecTcl-2.0 -May 12, 2005 - - Fixed attach -format .... error that probably only expresses on - gcc-3.x since nobody's seen/reported it but me until now -May 13, 2005 - - Fixed problem in Strip chart so that the parameter list is returned - in the correct order ---------------------------- End of Pre3 mods ------------ -May 17, 2005 - - Set map to on by default in Xamine. -May 18, 2005 - - Add support for CTCLString::AppendElement(DFloat_t, const char* format) - use it in parameter package's parameter list of mapped parameters - as a test. - - Add support for CTCLString::AppendElement(long, const char* format) - - Add support for mask equals gates as well as define the mask gate base class. - Add Support for "not mask" and "and mask" gates -May 20, 2005 - - Support for compilation on gcc/g++ 4.0 -May 23, 2005 - - Integrate gamma gate redo======= - - Add Support for "not mask" and "and mask" gates - - Added support for "gate -list [pattern]" so that users can filter - the results of the gate -list command - - Added support for "spectrum -list [pattern]" so that users can filter - the results of the spectrum -list command -May 27, 2005 - - Added support for a glob like pattern in the switch of the clear, pararmeter - bind, apply, and pseudo commands. When a pattern is given after -list, the - command returns objects whose name matches the pattern. -May 31, 2005 - - Remove extra copy construction in TreeParameter ThrowIf's.. as that's an - enormous performance hit. -June 1, 2005 - - Fix documentation errors in gate command wrt mask gates. - -3.1 -June 7, 2005 - - Incorporate defect fix in guiintegrate.cc into this version. -June 20, 2005 - - Fix type on Spectrum.h getAxisMapCount() had been spelled GetAxisMapCout().June 21, 2005 - - Forward port some fixes for tree parameter gui: - o gui writing tree variables and parameters with "" units doesn't put - {} for units but leaves it empty. - o Allow treevariable -set units optional. -June 22, 2005 - - Support for projection spectra. -June 29, 2005 - - Remove need for working fortran compiler. -July 7, 2005 - - Add ia64 adjustments from 3.0 branch -July 27, 2005 - - Fix up some automake incorrectnesses that old versions of AM let slide. - This is part of an effort to port to Cygwin. - - Fix up issues with the definition of PAGESIZE in Xamine (Display subdir) - That make it not build correctly on CYGWIN. -August 16, 2005 - - Add support to scripted readout for caenv1785 adc (primitive). -September 2, 2005 - - Added support for 2d long spectra. -September 22, 2005 - - Fix defect in Gamma 2d increment: If no valid parameters are left, - the outer loop limits are very very bad. - - Forward port the inclusion of bitmask gates - - Support dynamic creation of treeparameters. - - Document treeparameter -create command in online user guide. -September 30, 2005 - Happy Birthday Ron: 48 - - Add -listnew to treeparameter command so that new gui can - figure out which parameters have been created since program - started ... and save them. -October 5, 2005 - - Retry select in pipe data source in case of EINTR. - - Add attach -list to support determination of event source. -October 7, 2005 - - Fix defects in eventsink pipeline add/delete code. Predicates - not constructed correctly. -October 17, 2005 - - Add the new browser based GUI to the system. -October 18, 2005 - - Add fix for defect 188 - grobj files need to specify spectra by name. -October 21, 2005 - - Fix error in old tree gui handling of old list mode save files: - treeparameter -set was invoked with the wrong number of parameters. -October 24, 2005 - - Fix error in old tree gui: Saving list mode files treeparameterList - was missing a $ when being appended to the list of lists...so no modified - treeparameters were saved. -October 31, 2005 - - Fix buffer overflow problem in griprint.cc found by D. Caussyn. -November 29, 2005 - - Put spectrum names in integrations (and hence in logfiles), rather - than slot numbers - - Defect 174 - Make +/- buttons kick out of autoscale. - - Defect 162 - Document user's obligation to delete buffer - translators. -Decemberr 19, 2005 - - Remove illegal default parameter from PointlistGate.h's InGate with - parameters. -February 1, 2006 - - Factor adding a configuration parameter to a CModule in Scriptable SpecTcl - into AddParameter member function so extenders can add new parameter types. -3.1-pre5 -February 17, 2006 - - Factor out multiple identical definitions of some typedefs into - xamineDataTypes.h -February 20, 2006 - - Add longer descriptive titles to the Xamine names (parameter, gates etc). - - Fix some quoting errors in gui with respect to spectrum names with spaces. -February 21, 2006 - - Protect evals from parameters that have spaces in them by quoting - with [list]. - - Add ability to list gates with spectra in SpectrumPackage.cpp's - DescribeSpectrum and immediate callers. - - Add -showgate switch to -list operation on spectrum command. - - Fix PseudoScript.cpp - did not properly handle cases where pseudo names - had spaces in them. -February 23, 2006 - - Fix typo in Gui/spectrum.tcl -March 10, 2006 - - Unit tested migration of TCL++ library to object interfaces (remove - deprecated interfaces). - - Added Docbook generating stuff to configure.in -March 13, 2006 - - Made operator=, operator== and operator!= of CTCLChannel private as there - are no implementations. -March 16, 2006 - - Added extensive XML based manpages for the tclPlus CTCL class - library. - - Support pre/post command functions for CTCLProcessor. - this is used in nscldaq to implement the CDAQTCLProcessor. - - Need to implement CTCLProcssor::Bind to bind itself and the adaptor. -March 20, 2006 - - Added a bit more error checking/reporting to spectrum creation gui. -March 22, 2006 - - Fixed an error in 1-d spectrum creation.. syntax -March 30, 2006 - - Credit D. Bazin with concept of treeparameter in treeparam C++ sources. -April 17, 2006 - - Fix some 64 bit uncleanliness in Xamine so SpecTcl/Xamine can run - reliably on 64bit systems in 64bit mode. -April 18, 2006 - - Old method of long titles did not work very well as it made - old .win files worthless. -April 20, 2006 - - Fix error in sourcing file from GUI.. file should execute at global level. -April 21, 2006 - - Add buffersize selector to event source dialogs. -April 23, 2006 - - Fix typos in event source dialogs buffersize stuff. - - Add many credits. -April 26, 2006 - - Added screen dump based printing for the A1900 group and the - KSU folks who want a wysiwyg printing mechanism. -May 23, 2006 - - Fix defect 195,196: gri was emitting epsf which caused multiple pages - to smoosh onto a single page, printer.cc: Print setup dialog had a - widget that duplicated the name of another widget causing it to operate - funny. -SpecTcl-3.1-001 - - Try to make the docbook builds more robust even in the presence of missing - or broken(?) docbook installs. - - configure for libgd. - -SpecTcl 3.2-pre1 starts. - June 20, 2006 defect 206: Check parameter validity in mask gates. - Catch exceptions while histogramming - Defect 197: Averaging reduction boxes too large by - 1 channel in x. - Defect 200: Gamma 1dL spectrum increments no 64 bit clean - Defect 209: Mor of the same as 200. - June 23, 2006 Defect 210: Problems with scaning ints -> longs. - June 28, 2006 Xamine has some 64 bit defects as well, these manifest - on longword 2d spectra - Gui has problems if the user makes e.g. a and a.b fix this. - Defect 211 - crash if making g1 spectrum with empty parameter - list - June 29, 2006 Improve performance of terminal parent creation in gui. - Fix defect in allocatro.c's alignment mask computation that - causes free list corruption on e.g. 64 bit systems. - July 5, 2006 Propagate fix for 64 bit problems with mask equal gates. - Work around issue with tclsh 8.4 early where - string is integer 0x80000000 (e.g.) returns false.. - makes creation of mask gates fail. - July 13, 2006 Forward propagate fix for defect 213 to this version. - Took the easy way out copying all of *.cc,*.h from Display - and ChanCommand.cpp from SpecTcl. - July 17, 2006 Fix bitmask gate inconsistency between mask size in command - and in the classes implemebnting the gates....do this - by loading the gate mask value into the base class. - July 19, 2006 Fix error in newGui.tcl. When used with scaler processing, - RunNumber could be >Unknown< when formatting the status - line. - July 28, 2006 Fix error in wysiwyg printing for zoomed displays. - July 31, 2006 Fix off by one error in scaling.cc - for small scale ranges, - and small channel values, the channel height was visibly - lower than the corresponding tick mark. - August 8, 2006 Enhancement 194 - increase precision in output of - integrations. - August 15,2006 Enhancement 205 - Limited the length of the attach spec on the - GUI status line to at most 50 chars with the middle ones - replaced by ... this prevents the window from becoming - >very large< for e.g. cluster file analysis. - August 16, 2006 Do performance tuning of browser.tcl for 64 bit system. - on those systems, treeview find is terribly slow. - August 29, 2006 Added setResult functions to CTCLInterpreter to factor - object based result setting into one spot. - September 7, 2006 Added support for super-events with - CAnalyzer::entityNotDone() function. - Sept 8, 2006b Related to the above, allow event processors to indicate that - 0 bytes of the event were processed if the event was not complete. - Sept 27,2006 Added code to support multiply incremented 2-d sum spectra. - Oct. 03, 2006 Gui: Add preferences control panel with ~/.SpecTclDefaults - save file. Use this to default the length of 2-d spectrum - axes. - Oct 03, 2006 Gui: Prevent status lines from expanding in height. - Oct 04, 2006 rwio package - added permissions letter to the cvs and - to the distro. - - Oct 05, 2006 Xamine- add support for entering fitlines. - Oct 09, 2006 GUI - Bugzilla 207 - Increase the sophistication used - by SpecTcl's gui to located spectcldaq. - Oct 10, 2006 - GUI - Bugzilla 208 - Enhancement request for File->Save... - to support a selective store. - - Filter processor Bugzilla 217 - Put a bit of code in the - filter event processor to attempt to determine if it has - been pointed at something that is not a filter file. - Seems to work for the cases I've tried, so it's - certainly better than it was before. - Oct 16, 2006 - Bugzilla 219 : Added code to TclGrammerApp.cpp to output - the VERSION file to tkcon. - - BZ 220 Allow user to disable prompt for - new gui. If NoPromptForNewGui is defined and true, - prompting will be disabled. - Oct 19, 2006 - BZ 224 - 2d long integrations were incorrect on 64 bit plats. - - BZ 226 - Added support for attach and eof callouts to - event processors. - - Documented new functions in the event processors. - Oct 20,2006 - BZ 87 Added basic fitting... still some kinks to work out - in the Xamine display but it does work...also need - to Xamine drive Gui to create the fit. - Oct 23, 2006 - Added documentation for the fit command and how to - extend the fitting subsystem. - Oct 24, 2006 - Fixed error in log display of fitlines (actually convert1d error). - Made fitlines solid lines not just dots. - Fixed defect introduced with fitlines - where 1-d objects - got deleted on updates. - Ensured that fitlines get sent in on sbind. - Added framework for user processing of Xamine buttons in - the Xamine custom button box. - Oct 25, 2006 - CXamineEvent::addButtonHandler needs to be public. - Expose ability to get the histogrammer etc. in SpecTcl.h - Expose fit id allocation in CfitCommand. - Added credits for gsl.{cpp,h} and permission grant to the - November 1, 2006 - Fix some issues for building from the distro rather than - from CVS. - distribution - Nov 2, 2006 - Get the calibrated parameter contrib install to stop polluting - $(prefix)/include with its headers. - - Fix wierd issues with make dist on ubuntu edgy edge... - was not putting config dir into the distro.======= - distribution - Nov 3, 2006 - Fix error introduced in scaler display by attempt to - format totals as %u when they are actually floating point - exactly to keep them from overflowing. - - Support a default buffersize preference. - Nov 8, 2006 - Add Xamine restart handler capability to Xamine interface. - Nov 9, 2006 - Install CHANGELOG - Nov 17, 2006 - Fix defect 228 - Xamine.Defaults can get printing defaults - all garbled causing printing to fail or crash Xamine - - Fix defect 299 - setup.tcl is obsolete now, don't distribute - in Skel dir. -December 1, 2006 - - Fix defect in edit2dmulti.tcl (pre-release). If selecting - a spectrum and an axis parameter is not a treeparameter, - use the source spectrum axis definitions to provide the - appropriate axis def for the new spectrum. -December 7, 2006 - - Fix 2 defects: - o Removing fits from xamine via SpecTcl failed due to - not allowing that 'gate type' to be recognized for - deletion. - o Deleting a spectrum should delete all fits that are - defined on that spectrum. -December 19, 2006 - - Fix defect per D. Caussyn FSU: CXdrInputStream.cpp was - doing delete m_pBuffer -> delete [] m_pBuffer. -Decmeber 21,2006 - - Ensure that the scriptable makefile also links in - the fits library. -Release Jan 15, 2007 - -Pre 2 starts. - -January 18, 2007 - Defect 288 : applygate.tcl did not handle case of - multiple target spectra correctly. -February 12, 2007 - Enh Request 232 : when treevariable -set is invoked, - fire the traces on that variable so that any GUI elements - bound to that treevariable are updated -February 13, 2007 - Defect/enh. 234 : When a configuration is restored, - and the config script has an error, keep on trying to - execute the script but report all the errors in a dialog... - at present, hopefully there are not very many errors as - the dialog is not a scrolling dialog. -February 15,2007 - Synch gpVersion with VERSION symbol in config.h -Week of Feb 22, 2007 - BZ enhancement request 291 Gamma 2d deluxe - spectrum. -Week of Feb 26, 2007 - BZ 292? Ensure that tk app name is unique - so multiple tkcons will open. - - Fix inadvertent leaving of Gamma 2d as Ulong_t not - UInt_t and same for gamma deluxe, for 3.1 , Gamma 2dL - was already correct. -Week of March 5 - Add Splash screen. - - Adjust chisquare calculation to be correct for CGaussianFit - (thanks to Dirk Weisshaar). -Week of March 12, 2007- - - Ensure that SpecTcl does not crash if VERSION not readable. - (BZ 294). -Week of March 19, 2007 - - Make CEvent::clear() O(1) time.bg -Week of April 2, 2007 - - Add disclaimer to filterread.htm about data beyond the last used - position in filter buffers as someone made an assumption that is not - true about it. - - Added whatsnew3.1.htm page linked to front page that allows - users to see what's new in SpecTcl 3.1 - -Pre-released April 26, 2007 - -Pre-3. - -Week of April 30, 2007 - - Added observer capability to all dictionaries types. This will - allow support of traces on e.g. spectrum dictionary. - - Added tests for dictionary observers and the observer manager - helper classes. - - Added capability to add/remove observers from the spectrum dictionary - to CHistogrammer. - - Added API entries to add/remove spectrum observers. - - Added spectrum -trace command. - - Added docs for the -trace command. - - Made Xamine's Xamine_DrawFittedString also attempt truncation - rather than just leaving a string blank if it does not fit. - e.g. a title that is: - "this is a very long string that does not fit" - could get rendered/displayed as: - "this is a very lo..." if that's all the room there is - - Port in the jumbo buffer decoder and put it in scriptable unpacker - too -Week of May 7, 2007 - - BZ 295 - add support for splitting/joining filter files. Note that - cat can join perfectly well, so this reduces to writing a program - filtsplit that can split. We'll choose to write: - filtspilt --size blocks_per_file --output stem_name input_file - blocks_per_file - number of input filter blocks per output file. - stem_name - Is the stem of the split output files which - will have names like stem_name_nnn.flt - input_file - Is the input file to split. - - Changed swrite format level to 3: Make NSCLAsciiFormatter able to read: - rev 2,1 and even 2 where summary spectra only have 1 coord. - - Fix some issues with Gamma Delux 2d spectrum classes that don't compile - on 4.x compilers - - get NSCLAsciiFormatter to properly read rev 2,3 and 'malformed rev2' - produced by the pre2 version of 3.2. - - Make the spectrum file read functions able to correctly report errors in - reads (e.g. not a spectrum file). -Week of May 14, 2007 - - BZ 297 - Make axis tick marks draw correctly if there's only one channel in - the spectrum (well really just don't draw tick marks at all. - - Add code to support gate observers.. for new displayer. - - Add -trace subcommand to gate. - - Fix error in TreeParameter/SpectrumGenerator.tcl -state normal not - -state enabled. - - Fix error in TreeParameter/SpectrumGenerator.tcl - Duplicate button - did not correctly decode parameters of spectrum being duplicated. - - Add docs for the gate -trace subcommand to the web docs. - - Fix CNSCLJumboBuffer::size32() member, was not correctly picking up - the buffer revision level. -Week of May 24, 2007 - - Only clear gates that are worth clearing. -Week of May 28,l 2007 - - Fix channel position to pixel position coversions which had - the width of a channel to be too large (too few channels in displayed - range. - - Do some jiggerypokery with 1-d gates to make them more consistent with - their integration: - o On acceptance the right point is adjusted to the right by a channel. - o Gate checking is now exclusive of the right point. - o On entering in the display the adjustment is un-done so that - Xamine will display correctly. - Week of June 4, 2007 - - Ensure that Xamine's SuperPrompt::SetList message boxes - from Xamine_error_msg() get displayed by making them - children of the prompter's parent rather than of the prompter - which, after all is hidden. - Week of June 11, 2007 - - Get nice support for ubuntu edgy eft. - Week of June 25, 2007 - - Begin adding the 'integrate' command. - Week of July 2, 2007 - - 2-d integrations in Xamine had displayed standard deviations not - fwhm's as advertised. - - Add docs for integrate command. -Week of July 9, 2007 - - Corrected CPacket.cpp for jumbos in scriptable. -Week of August 13, 2007 - - BZ 318 - Old GUI SpectrumGenerator.tcl was not listing applied - gates correctly when the filter mask was not * -Week of Sept 10,2007 - - BZ 318 revisited... need to use hash tables for the applied gates - rather than lists to be utterly reliable. - - Fix error in gamma 2d deluxe where if only one y parameter was specified - one of the constructors would segfault because it was mistakenly getting units - from y[1] not y[0]. - - Fix error in swrite NSCLAsciiSpectrumFormatter...get axis limits directly from the - spectrum description rather than dorking around to get them from - the converter. -Pre3 released - -October 11, 2007 Pre 4 (or possibly 3.2-001) opened. - -October 12, 2007 - Make multicolored monster understand Gamman deluxe spectra. -October 15, 2007 - Redid a bunch of stuff with the test data sources to - allow attach, re-attach , re-re attach etc. Don't think there - are any memory leaks. -October 23, 2007 - Add detach menu entry.. really stops processing and does an - attach -file /dev/null - - added version specific daq locations to search path for - spectcldaq (gui). - -November 6, 2007 - Convert to svn repository -November 26, 2007 - BZ 327 - Fix multicolored monster problems with changing spectra - in resopnse to tree parameter range changes. -December 4,2007 - Correct the Usage member of the calibration fit command so that - it reflects the change in the name of the command. - -January 3, 2008 - Install splash/license.terms -> $(prefix)/splash.license - to comply with its license terms. -Finalized Pre-release 4 January 3, 2008 - -Start edit level 3.2-pre5 (may change to 3.2-001 midstream.. watch the log below). -January 7, 2008 - Fixed include license.terms in the build. - - GUI Attach -pipe was failing due to attempts to set - the value of the buffersize widget prior to the creation - of that widget's spinbox. -January 9, 2008 - Add needParameter virtual to CSpectrum class hierarchy. - this is used to know which list spectra belong in. -January 10, 2008 - Fix errors in 1d construction. - - Use spectra organized by parameter to make - increments a bit more efficent. - - Use observers to maintain the flattened gate lists - so there's no increment time overhead. -January 11, 2008 - Make CFlattenedGateList work even if the gate container - for the gate has changed from the inserted one.. - that is match the name. -January 16, 2008 - Separate filter output formatting from the filter - class itself. -January 17, 2008 - Provide extensible filter format structure. - - Fix error in filter save in gui .. parameter list had - an extra layer of {}'s. - - Add ability to introspect filter format. -January 18, 2008 - Added support for the newer spectrum types to the API - - Added filter support to the API. -January 25, 2008 - Debugged filter support API - - Fixed error in gate flattener handling that was preventing - gate from being properly applied. -February 25,2008 - Work around lesstif file dialog bug..For each re-use of the file selection - dialog, explicitly set the search mask to the dirname of the mask with - *.win appended. lesstif has the tendency to store the selected file - in the filter path. -March 12, 2008 - Cosmetic changes to folder gui file menu and the prompter for the - which gui to use dialog. -March 21, 2008 - Fix error in MCM GUI where parameters with empty units could cause - errors in the data structures keeping track of the parameters. - Specifically, the entries in the units list would collapse out of - that list due to the use of append, rather than lappend to create those lists. -March 24, 2008 - Add spectrum memory usage to status line of folder GUI per Kevin Carnes - suggestion. - -March 24,2008 tag release of 3.2 -Start work on 3.2-001 - -March 27, 2008 - Correct error in spectrum observer. Don't try to enter a spectrum that is - not connected to all its parameters. This can happen in e.g. sread. - -March 28, 2008 - BZ330 (hopefully) - o Added easy ability to remove callbacks. - o Registered all graphical input widgets to call - Xamine_DestroyGraphicalInput on both delete and popdown - o Have Xamine_DestroyGraphicalInput - * Kill mouse callbacks for graph input. - * Remove the callbacks for delete and popdown. - -April 1, 2008 - Stop recycling properties dialog so it gets - properly recreated (lesstif mis-remanages it). -April 4, 2008 - BZ330 - Don't call cancel callback in - Xamine_DestroyGraphicalInput until the callbacks - are removed so we avoid recursion that will double - destroy the object. -April 22, 2008 - Fix slight errors in binning in SpecTcl.. correctly - compute the bin width for the integeristas. - Per Thomas Baumann. -May 7, 2008 - Fix defect in Xamine gate acceptor on m2 spectra. - Needed to select appropriately between adding the gate - and modifying the existing gate, rather than unconditionally - adding the gate.. which can throw an uncaught exception. - Thanks to Kevin Carnes KSU for stepping into this defect - and alerting me to it. - - Added Kevin Carnes and Dirk Weisshaar to the acknowledgements. -June 5, 2008 - Fix typeo in BufferAnalysis.h - -July 11, 2008 - Gui/slice.tcl - re-init the browser on accepting a gate (reinit member) - that restores the parameters used to the list. - - Expose the treeview interface to clients of - Gui/browser.tcl -August 18, 2008 - Update to tkcon V2.4 -September 17, 2008 - - Fixed error in RunState handling.. Set it to - "Inactive" on event source EOF. This is needed to - support batchmode processing of e.g. filter files. - -Start on 3.3 -September 17, 2008 - - Added extensible factory template class directory - factories. This can be used both by new factories - and to refactor the code provided by existing factories. - - Use extensible factory to generate the buffer decoder - selected by the attach -format switch so that buffer decoders - are extensible. -September 18, 2008 - - Registered default decoders with DataSourcePackage -September 22, 2008 - - Added CRingBufferDecoder support so that ring buffer - data can be decoded. -September 26, 2008 - - Provided mechanisms for buffer decoders to specify they - operate either on fixed sized blocks of data or on streams. - This is needed to ensure SpecTcl's input stage does not - get permanently blocked when data taking pauses or - a run ends on a stream oriented pipe data source. - - Indicated that the CRingBufferDecoder is a stream decoder. - - Documented SpecTcl::addBufferDecoder. - - Documented new behavior of the -format switch on the - attach command. - - Xamine - integrate superimposed spectra as well - as base spectra. -October 2, 2008 - Add ungate context menu option to new GUI. - - Don't write applications if the gate is -Ungated- - (spectrum was ungated). - - Correct the count of buffers analyzed to account for the - fact that the first buffer is sequence 0 so we need - the first buffer to increment our buffers analyzed -> 0. - -January 5, 2009 - Added gamma summary spectrum. -January 15, 2009 - - Fix Xamine compilation errors with -pedantic. - Need to use reinterpret_cast to cast XtPointer -> - function pointers. - - Document gamma summary spectra in the on-board html. - - Document GUI gamma summary spectrum creator. - - Added API docs for gamma deluxe and gamma summary spectra -February 18, 2008 - - Made the background of the button box a clear indicator of whether - or not SpecTcl is in a test system. -pre2: - March 6, 2009 - Make the rEvent array hold doubles not floats. - March 18, 2009 - Fix tkcon.tcl so it does not implement a clear command - that interferes with the SpecTcl clear command. - March 24, 2009 - Make the delgrob dialog a multiselect. - May 1, 2009 - CSpectrum2Dm.{h,cpp} Ensure these spectra get put in the - don't need a parameter list rather than some need a parameter list - which causes them to be grossly underincremented. -pre3: - May 2009 - Port to debian lenny with minimized compiler warnings. - May 20,2009 - In source files add back the newline after each lineof - a multiline command to prevent syntax errors on e.g. - pseudo defs. - May 27, 2009 - Fix error switch/case for handling gate point scaling. - gamma gates resulted in no points being accepted. - August 13, 2009 - Fix error in Strip chart spectrum was not requiring - that target parameter was defined. - - Fix error in strip chart shift. If shift is larger than spectrum - channel count would segfault. - Sep 4, 2009 - Fix BZ 378 - Segfaults can happen when cutting down the - Y parameters of a g2d spectrum to generate the title. - -pre4: - October 11, 2009 - BZ 379 when SpecTcl started using double for parameters - in an event, filters broke. The fix allows both filters - from older and current versions of SpecTcl to be read. - October 14, 2009 - Strip chart spectrum was miscalculateing m_nOffset on - shifts to the left leaving gaps in the spectra for - continuously varying parameters. - December 4, 2009 - Fix error in XMWarningDialog::Create .. was referencing - button objects prior to ensuring they were created. - December 4, 2009 - BZ384 - Provide some fallback fonts in case the adobe-courier - family is not present. - BZ384 - Provide a const char* exception handler in main() - when caught displays a modal warning box with the - exception displayed and when dismissed exits Xamine. - - Throw an appropriate const char* exception when - no suitable fonts can be found in text.cc:LoadFonts - -February 2, 2010 - Export CRingBufferDecoder.h to the world rather than - hiding it in noinst_HEADERS. -Feburary 11, 2010 - Modify data source GUI elements to include a data - format selector that includes support for ring so people - can attach to ring buffers or event files from the ring - buffer system. - -pre6: -May 6, 2010 - Fold in KSU fix for tkcon problems on ubuntu 10.?? -May 6, 2010 - Update to gri-2.12.20 -May 14, 2010- Remove memswap usage in CIntegrateCommand.cpp. - - Remove all -lpub's from Makefile.am and includes. - - Fix buffer overflow (BZ 404) in griprint.c -pre7: -May 18, 2010 - Fix error in GUI spectrum usage calculation. Was under - calcluating summary spectrum usage. -June 2, 2010 - - Fix treegui problems: - * Gate dependencies not calculated right if only one gate. - * mclistbox now clean for tcl 8.5 -June 3, 2010 - - WO 2529-005-CP-005 - Add an extra layer of indirection - (parameter scoreboarding) to improve the performance - of histogramming when spectra and parameters are sparse. - -June 13, 2011 - Fix some memory double deallocations found by Coupland. - -3.3-002 - - Fixes pointed out by cppcheck static analyzer. - - Misc. warning removals. - - Use mkstemp rather than tmpnam in wsyswig printing. -3.3-003 -June 30, 2011 - - Fix error in CRingBufferDecoder - premature free of glued buffer -3.3-004 -November 14, 2011 - - Increase the capacity of the integration widget in Xamine to - 50,000 chars (Carpino request). - -3.3-005 -December 5, 2011 - - TR 6912 - undo changes in dfltmgr.cc suggested by cppcheck specifically: - - assignment operator of win_*d infinitely recurses - - use memcpy instead which causes ccpcheck to complain about memcpy-ing objects - circumventing assignment. Must still see why the recursion occurs. - - The earlier assignment was ill motivated and did not actually change the caller's - win_xd for Xamine_CreatexdDefault.... functions as it just did pointer assignment - rather than actually transferring the attributes to the caller. This resulted in - unconditionally using a scatter plot rendition rather than the more usual color. - - -3.3-006 -November 30-?? 2011 - - Added flag to guistate.tcl so that new/treegui can ask it to - save without spectrum -delete and thus support the 'cumulate' - (sic) checkbutton. - - Fix errors in Stripchart spectrum shifting and channel caculation. - - Fix case in spectrum definition where we might ask Tcl to delete - storage we never allocated. - - Remove use of TkTable which disappears eventually in Tcl. -3.3-007 -?? - Ensure this all works on ring buffers. - -3.3-008 - - issue 107 Fix SpecTcl-2d integration command (gives wrong answers) - - issue 108 Support Xamine builds if OpenMotif is the motif version installed. - - issue 105 In folder gui make spectrum save a 2-step wizard so that it fits - on small screens better. - - issue 973 Do a smart search for the ring buffer clients in data source tcl. - - issue 866 Protect GUIs (folder standalone and tree) from multiple startups. - -3.3-009 - - May 4, 2012 - Added cusbSpecTcl to the build. - - June 6, 2012 - Added vmusbSpecTcl to the build. - - June 6, 2012 Tell user about missing parameters array elements. - - June 6, 2012 VMUSBSpecTcl - process madc -resolution config option. -3.3-010 - - June 8, 2012 Branched the development repository and upped the - configure.ac version to 3.3-010 - - June 11, 2012 Issue #1089 fix order of gui startup with respect - to config file processing. - - June 11, 2012 Issue #1087 correct handling when saving gates for - gates that have spaces in their name. - - June 14, 2012 Issue #1008 Provide error information and exit if SpecTclRC.tcl - or SpecTclInit.tcl failed. - - June 14, 2012 Issue #1070 Provide error information for failing Pseudo params. - - June 15, 2012 Issue #1046: - * Default to ring format if online. - * Allow user to specify ring name. - - - June 15, 2012 Issue #1063 Improve new gui startup time. -3.3-011 - July 2, 2012 Issue # 1191 Save spectrum channel type (byte word longword e.g.) - when doing a save of failsafe write. - - July 9, 2012 Issue #1152, Issue #1150, Issue #1151, Issue #1153 - Get clean builds - on Ubuntu Precise Pangolin.. - - July 24, 2012 - Use 64bit clean DataFormat.h (time_t -> uint32_t). -3.3-012 - - Issue #1322 - Add product name to VERSION file e.g. SpecTcl- -3.3-013 - - Issue #1451 - Re cast the Xamine shared memory region in terms of - the types in stdint.h - this due to observation that 64bit - shared memory requirements were significantly larger than - 32 bit systems due to the use of architecture specific types. - - Issue #1328 - Remove SpecTcl's local instance of gri and require gri - be installed on systems using SpecTcl. Note that lack of gri will - result in warning at configuration/install time. - - Issue #1111 Add -rpaths in the case of links to shared libraries - that are may not be in the normal places (e.g. provided by --with - flags at build time). - - Issue #1142 - Remove all dependencies on BLT as this package will - likely become unavailable with Tcl 8.6 - which is now out of beta - test. - - Fixed various compile warnings in anticipation of compiler versions - that will treat these as errors (finally solved the callbacks - as data in Xt casting problem). -3.3-015 - * Fix error in griprint.cc - buffer overflow for printing spectra with - numbers above 99. Thanks to Dave Caussyn at FSU for finding this one. - * Fix redef errors in NSCLAsciiFormatter.. - -3.4 - * Provide support code for NSCLDAQ-11/10 ring item decoding. - * Issue # 1713, Issue# 1712 Support ringformat specification in - all data source dialogs. In addtion add the format selection - to the bottom of data source prompters that did not originally - have them. - * Issue #1659 Provide mechanisms for ring buffer analyzers - to fish data out of the event body header if it exists. - * Issue #1658 Add ability for CRingBufferDecoder to autoselect - the format helper if a ring format item is seen in the input data. - * Issue #1633 Provide event processors with a post SpecTclRC.tcl - initialization hook. - * Much more documentation on how to build event processors etc. - * Extract the tcl++ and exception libs so they can be centrally - maintained. -3.4-001 - * Update AC_INIT to provide version number. - * Add some tests to m4 and use them there instead of in - configure.ac - * Set up to use Jenkins CI server. - * Only let the cppunit tests that don't need a display survive. - * Properly integrate the V1729 FADC in VMUSB's spectclSetup.tcl - file. - * Fix error in vmusb spectclSetup.tcl typo on V1x90 configuration -3.4-002 - * Bug #2100 - gates on m2 spectra incorrectly convert their points. - * Issue #2101 - Axis definitions for m2 and gd spectra are not clear. - * Feature #2102 Want to display gates on m2 spectra. -3.4-003 - * Feature #2103 - Allow users to hide the gates on displayed spectra - Spectra->Hide Gates and then refresh the menu is a toggle button. - * Feature #1484 - Make work with Tcl 8.6. - * Fix error in 11 ring format helper - was not getting the runnumber properly. - * Remove clear command from new Tkcon so it does not interfere with - SpecTcl's. -3.4-004 - * Factor in the daqroot preference in finding ringselector. - * Figure out if ringselector supports --non-blocking and - if so turn it on. Copied: branches/3.4-getcontents/ChangeLog (from rev 2254, trunk/main/ChangeLog) =================================================================== --- branches/3.4-getcontents/ChangeLog (rev 0) +++ branches/3.4-getcontents/ChangeLog 2015-02-24 12:48:44 UTC (rev 2262) @@ -0,0 +1,1054 @@ +] +2.1-006 - Incorporate fix 113 - low level cutoffs lead to corrupted + 1-d displays. + - Have build procedures clean any pre-built Gri prior to + tarring up the distribution. +2.1-007 - Incorporate fix 120 - memory leak on spectrum -delete -all + - Date/time/version stamp installation. +2.1-008 + - Incorporate fix for issue 95: parameter -list -byid fails to parse + the output list for sorting. + - Incorporate fix for issue 105: sbind usage level help refers to + itself as the bind command not sbind. + - Incorporate fix for issue 111: swrite creates a file even if + no valid spectra are included on the command line. +2.1-009 + - Incorporate printing fixes for last channel of 1-d. + - Incorporate printinf fix ensure that 2-d spectrum channels display + all non zeroes even if they are below the threshold for the lowest + color range. + - Place upper limits on 1-d graphical entries at the top of the + channel rather than at the bottom. This more realistically + describes what's going on + - Fix issue 118 Superpositions in window files are by id not name. + - Fix issue 122 Speclist with a single spectrum gives blank output. + - Fix issue 123 Print with superpositions crashes gri (gives it a + bad command file). + - Fix issue 124 FWHM not transformed to mapped coordinates. +2.1-010 - Fix Display/Makefile issues with lingering bison/flex output + Add missing return value in ValidValue::operator=. +2.1-011 - Fix issue 135 swrite -format ascii does not retain the axis + mapping information correctly. + - Fallout from issue 133; fixed a defect in Display/axes.cc where + computation of mapped channel tick mark intervals could cause + DIV0 crashes in Xamine when the axis decreases from left to right. + - Backport colormanager intelligent visual choices from 2.2 +2.1-012 - Backport fix for defect 144 from 2.2: Memory leak when user + rejects events. + - Backport repair for defect 149: Some cases where spectrum + deletion from Xamine can kill both Xamine and SpecTcl + - Backport repair for defect 145 Names with special characters + cause saveall to produce bad files. +2.1-013 - Backport filter generation fix from 2.2 + Repair defect 157: Graphical object copies fail if target + is spectrum slot > 999 +2.1-014 + - Fixed defect 151: printing 2-d's the channels have incorrect + values, and log prints are just plain flat lined. +2.1-015 + - Fix un-numbered defect channel command gets/sets wrong channel + on Gamma 2-d's. This was broken with the introduction of + arbitrary binning in 2.1. +Modifications for SpecTcl 2.2 +January 30,2004 - Updated gri t... [truncated message content] |
From: <ro...@us...> - 2015-02-20 02:40:48
|
Revision: 2261 http://sourceforge.net/p/nsclspectcl/code/2261 Author: ron-fox Date: 2015-02-20 02:40:41 +0000 (Fri, 20 Feb 2015) Log Message: ----------- * Fix detector number calculation. * Start building the mechanisms for a scatter plot based waterfall plot. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-02-13 19:38:35 UTC (rev 2260) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-02-20 02:40:41 UTC (rev 2261) @@ -48,6 +48,9 @@ 0 // End of array sentinel. }; +static std::map<int, unsigned> detectorCounts; +static std::map<int, unsigned> rawCounts; + /** * constructor * Build the tree variables, tree parameters and the initial gates. @@ -111,6 +114,9 @@ } m_mustEnd = true; // Need to make headers and close files. m_eventCount = 0; + + detectorCounts.clear(); + rawCounts.clear(); } return kfTRUE; @@ -149,15 +155,14 @@ m_eventCount++; double time = m_timestamp; // Time in seconds. int detInModule = m_bankNo; - if (detInModule > 16) detInModule -= 8; + if (detInModule > 15) detInModule -= 8; 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) { - std::cerr << "Neutron at : " << time << " from " << detno << std::endl; - } + + // Would love to put all of this in a struct, however structs can be padded so we must // write like this: @@ -193,6 +198,10 @@ CFileWriter::OnEnd(CAnalyzer& rAnalyzer, CBufferDecoder& rBuffer) { if (m_enable != 0.0) { + + // Detector number histograms: + + m_mustEnd = false; // closed binary regardless. m_binaryOutput.close(); char finalFilename[1000]; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2015-02-13 19:38:35 UTC (rev 2260) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2015-02-20 02:40:41 UTC (rev 2261) @@ -33,7 +33,9 @@ #include <Spectrum1DL.h> #include <iostream> +static const unsigned MaxScatterPoints(1024*1024); + /** * @class CSpectrumAbsStrip * This helper class is sort of a strip chart spectrum. Where a @@ -275,6 +277,12 @@ m_lastTime = (0.0); m_lastTimeGated = (0.0); + // Clear the waterfall data: + + m_waterfall.clear(); + m_waterfallGated.clear(); + + m_fInitialized = true; // We're initialized. return kfTRUE; @@ -351,6 +359,7 @@ // Now do the dt parameters. These provide the time in ns since the most recent event and // most recent event that makes m_delataTGate true. + // add points to the waterfall data as well. double dtns= (m_highPTimestamp - m_lastTime)/10.0; m_deltaTns = dtns; @@ -361,6 +370,7 @@ } else { m_logDtns = .0001; // standard fudge for 0/negative log values. } + addScatterPoint(m_highPTimestamp, m_logDtns, m_waterfall, MaxScatterPoints); if ((*m_deltaTGate)(rEvent)) { m_deltaTGatedns = (m_highPTimestamp - m_lastTimeGated)/10.0; @@ -371,7 +381,27 @@ } else { m_logDtGatedns = 0.01; } + addScatterPoint(m_highPTimestamp, m_logDtGatedns, m_waterfallGated, MaxScatterPoints); } return kfTRUE; } + +/** + * addScatterPoint + * Add a scatter plot point. If the list gets too large remove the front point as well. + * + * @param time - ns at which the the point occured. + * @param dt - Delta time between this and the last point in ns. + * @param dest - Scatterplot list. + * @param maxpts - Maximum points allowed in the list. + */ +void +CTimeParameters::addScatterPoint(double time, double dt, ScatterData& dest, unsigned maxpts) +{ + 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-02-13 19:38:35 UTC (rev 2260) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h 2015-02-20 02:40:41 UTC (rev 2261) @@ -30,7 +30,9 @@ #include <TrueGate.h> #include <GateContainer.h> +#include <list> + class CSpectrum; /** @@ -51,6 +53,13 @@ class CTimeParameters : public CEventProcessor { +public: + typedef struct _ScatterPoint { + double s_time; + double s_dt; + } ScatterPoint; + typedef std::list<ScatterPoint> ScatterData; + private: // variables for time differences (including the start time). @@ -100,6 +109,11 @@ CSpectrum* m_CumulativeGatedSec; CSpectrum* m_CumulativeGatedNs; + // Scatter plot data: + + ScatterData m_waterfall; + ScatterData m_waterfallGated; + // Internal state bool m_fInitialized; @@ -121,8 +135,14 @@ CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder); // Physics Event. + ScatterData& getWaterfallData() { return m_waterfall; } + ScatterData& getGatedWaterfallData() {return m_waterfallGated; } +private: + void addScatterPoint(double time, double dt, ScatterData& dest, unsigned maxpts); + + }; #endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-02-13 19:38:35 UTC (rev 2260) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-02-20 02:40:41 UTC (rev 2261) @@ -1,4 +1,4 @@ -# SpecTclGUI save file created Fri Feb 13 13:35:42 EST 2015 +# SpecTclGUI save file created Thu Feb 19 21:07:07 EST 2015 # SpecTclGui Version: 1.0 # Author: Ron Fox (fo...@ns...) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-13 19:38:37
|
Revision: 2260 http://sourceforge.net/p/nsclspectcl/code/2260 Author: ron-fox Date: 2015-02-13 19:38:35 +0000 (Fri, 13 Feb 2015) Log Message: ----------- * On start up if rates.tcl exists source it to gedt rates definitions. * Add Save button to the rates display to save configuration to rates.tcl. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/rates.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2015-02-13 19:31:58 UTC (rev 2259) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2015-02-13 19:38:35 UTC (rev 2260) @@ -143,4 +143,10 @@ button .py3f -text {Y3f} -command [list Y3f .y3f] pack .py3f -fill x -expand 1 + +set ratesFile [file join $here rates.tcl] +if {[file readable $ratesFile]} { + source $ratesFile +} + source [file join $here ratesDisplay.tcl] Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/rates.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/rates.tcl 2015-02-13 19:31:58 UTC (rev 2259) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/rates.tcl 2015-02-13 19:38:35 UTC (rev 2260) @@ -1,3 +1,2 @@ rate create e.01 rate create e.02 -rate create e.08 Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl 2015-02-13 19:31:58 UTC (rev 2259) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl 2015-02-13 19:38:35 UTC (rev 2260) @@ -243,9 +243,10 @@ button $::Rates::Controls.add -text {Add Rate...} -command ::Rates::AddRate button $::Rates::Controls.del -text {Remove Rate...} -command ::Rates::RemoveRate +button $::Rates::Controls.save -text {Save} -command ::Rates::SaveDefs -grid $::Rates::Controls.add $::Rates::Controls.del -padx 5 +grid $::Rates::Controls.add $::Rates::Controls.del $Rates::Controls.save -padx 5 grid $::Rates::Controls -sticky nsew ## @@ -271,7 +272,20 @@ } } +## +# :Rates::SaveDefs +# Save rates definitions: +# +proc ::Rates::SaveDefs {} { + set fd [open rates.tcl w] + foreach rate [rate list] { + set name [lindex $rate 0] + puts $fd [list rate create $name] + } + close $fd +} + ## # Handlers for during the run: # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-13 19:32:15
|
Revision: 2259 http://sourceforge.net/p/nsclspectcl/code/2259 Author: ron-fox Date: 2015-02-13 19:31:58 +0000 (Fri, 13 Feb 2015) Log Message: ----------- Add rates display to startup file Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2015-02-13 19:30:33 UTC (rev 2258) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2015-02-13 19:31:58 UTC (rev 2259) @@ -142,4 +142,5 @@ source [file join $here ploty3f.tcl] button .py3f -text {Y3f} -command [list Y3f .y3f] pack .py3f -fill x -expand 1 -puts done \ No newline at end of file + +source [file join $here ratesDisplay.tcl] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-13 19:30:45
|
Revision: 2258 http://sourceforge.net/p/nsclspectcl/code/2258 Author: ron-fox Date: 2015-02-13 19:30:33 +0000 (Fri, 13 Feb 2015) Log Message: ----------- Initial working rates display Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CRateProcessor.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CRateProcessor.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CRateProcessor.cpp 2015-02-13 15:09:13 UTC (rev 2257) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CRateProcessor.cpp 2015-02-13 19:30:33 UTC (rev 2258) @@ -180,7 +180,7 @@ // Now sum based on the spectrum dimensionality: UInt_t numDims = m_pSpectrum->Dimensionality(); - uint32_t sum; + uint32_t sum = 0; if (numDims == 1) { sum = sum1d(); @@ -198,6 +198,7 @@ m_increments = sum - m_totalCounts; m_totalCounts = sum; + return kfTRUE; } //////////////////////////////////////////////////////////////////// @@ -230,10 +231,10 @@ if (!m_pSpectrum) { disable(); + clear(); // Reset our counters. return; } - clear(); // Reset our counters. } Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-02-13 15:09:13 UTC (rev 2257) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-02-13 19:30:33 UTC (rev 2258) @@ -1,4 +1,4 @@ -# SpecTclGUI save file created Fri Feb 13 07:35:48 EST 2015 +# SpecTclGUI save file created Fri Feb 13 13:35:42 EST 2015 # SpecTclGui Version: 1.0 # Author: Ron Fox (fo...@ns...) Added: branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/ratesDisplay.tcl 2015-02-13 19:30:33 UTC (rev 2258) @@ -0,0 +1,323 @@ +if 0 { + +/****************************************************************************** +* +* 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 ratesDisplay.tcl + * @brief Code to manage the rates display + * @author Ron Fox <ro...@ca...> + */ +} + +package require Tk +package require snit +package require xmbGUI + + +namespace eval Rates { + variable runInfo + variable Display + variable Controls + variable Title + variable Run + variable Elapsed +} + +## +# @class RateDisplay +# Megawidget that uses a treeview to display rate information. +# The treeview is given a vertical scrollbar as well. +# Columns are: +# * name - Name of the spectrum on which the rate is. +# * rate - Count rate for the spectrum. +# * total- Total number of counts in the spectrum. +# +# METHODS +# add - Adds a rate line. +# remove - Remove an existing rate line. +# udpate - Update an existing rate line. +# +snit::widgetadaptor RateDisplay { + component table + + # This variable is an array. Keys are rate names, + # values are the item ids for them in the table: + + variable rates -array [list] + + delegate option * to table + + ## + # constructor + # - construct the hull. + # - construct and initialize the treeview and its scrollbar. + # - Layout the widgets. + + constructor args { + installhull using ttk::frame + + # Build/layout the table and its vertical scrollbar: + + install table using ttk::treeview $win.table \ + -columns [list name rate total] \ + -selectmode none -show headings \ + -yscrollcommand [list $win.sb set] + ttk::scrollbar $win.sb -orient vertical -command [$table yview] + + grid $table $win.sb -sticky nswe + + # Create the titles for the columns: + + foreach heading [list name rate total] { + $table heading $heading -text $heading + } + $self configurelist $args + + } + ## + # add - add a new rate to the table. Adding an existing rate is a no-op. + # + # @param name -- Name of the new rate. + # + method add name { + + # Only do something if the rate is not yet there: + + if {[array names rates $name] eq ""} { + set id [$table insert {} end -values $name] + set rates($name) $id + } + } + ## + # remove - remove a line from the rate display. + # + # @param name - name to remove it's an error to remove a nonexistent rate. + # + method remove name { + if {[array names rates $name] eq $name} { + set id $rates($name) + $table delete $id + array unset rates $name + } else { + error "$name is not a rate yet" + } + } + ## + # update + # Update the values for a rate: + # + # @param name -name of the rate - error if it does not exist. + # @param rate -Value for the rate column. + # @param total - Value for the totals column. + # + method update {name rate total} { + if {[array names rates $name] eq $name} { + set id $rates($name) + $table item $id -values [list $name $rate $total] + } else { + error "$name is not a rate" + } + } + ## + # list + # provide a list of the rates that are in the display already: + # in no particular order. + # + method list {} { + return [array names rates] + } +} + +## +# _listRateSpectra +# Return a list of the rate spectra. +# +proc Rates::_listRateSpectra {} { + # + # list the spectra that are already rates: + # + set ratesSpectra [list] + foreach rate [rate list] { + lappend ratesSpectra [lindex $rate 0] + } + + return $ratesSpectra +} + +## +# Rates::chooseNewRate +# Select a rate spectrum +# - Get a list of all spectrum names that are not already rates +# - use chooseListItem to prompt for one of them: +# +# @return string - name of the selected spectrum. +# @retval "" - No choice was made. +# +proc Rates::chooseNewRate {} { + + set ratesSpectra [Rates::_listRateSpectra]' + + # List the spectra whose names are not in ratesSpectra: + + set spectrumList [list] + foreach spectrum [spectrum -list] { + set name [lindex $spectrum 1] + if {$name ni $ratesSpectra} { + lappend spectrumList $name + } + } + + return [::chooseListItem .rselect $spectrumList] +} + +## +# Rates::chooseExistingRate +# Choose a spectrum that is already a rate: +# +proc Rates::chooseExistingRate {} { + return [::chooseListItem .rselect [::Rates::_listRateSpectra]] +} + +## +# Set up the top level with the rates display. +# +# Three frames: +# +--------------------------------------+ +# | Run information | +# +--------------------------------------+ +# | Rates display widget | +# +--------------------------------------+ +# | control buttons. | +# +--------------------------------------+ + + +# Top level and the three components it has: + +toplevel .rates +set ::Rates::runInfo [ttk::frame .rates.runinfo] +set ::Rates::Display [RateDisplay .rates.display] +set ::Rates::Controls [ttk::frame .rates.controls] + + +# Run information: + +label $::Rates::runInfo.titlelabel -text Title: +set Rates::Title [label $::Rates::runInfo.title] + +label $::Rates::runInfo.runlabel -text {Run number: } +set Rates::Run [label $::Rates::runInfo.run] + +label $::Rates::runInfo.elapsedlabel -text {Run Time: } +set Rates::Elapsed [label $::Rates::runInfo.elapsed ] + +grid $::Rates::runInfo.titlelabel $::Rates::Title \ + $::Rates::runInfo.runlabel $::Rates::Run \ + $::Rates::runInfo.elapsedlabel $::Rates::Elapsed + +grid $::Rates::runInfo -sticky nsew + +# Rates - add any rates that are currently defined: + +foreach rate [::Rates::_listRateSpectra] { + $::Rates::Display add $rate +} +grid $::Rates::Display -sticky nsew + + + +# Control buttons: + +button $::Rates::Controls.add -text {Add Rate...} -command ::Rates::AddRate +button $::Rates::Controls.del -text {Remove Rate...} -command ::Rates::RemoveRate + + +grid $::Rates::Controls.add $::Rates::Controls.del -padx 5 +grid $::Rates::Controls -sticky nsew + +## +# Rates::AddRate +# Add a new rate: +# +proc ::Rates::AddRate {} { + set newRate [::Rates::chooseNewRate] + if {$newRate ne ""} { + rate create $newRate + $::Rates::Display add $newRate + } +} +## +# Rates::RemoveRate +# Choose a rate to delete +# +proc ::Rates::RemoveRate {} { + set oldRate [::Rates::chooseExistingRate] + if {$oldRate ne ""} { + rate delete $oldRate + $::Rates::Display remove $oldRate + } +} + + +## +# Handlers for during the run: +# + +## +# Rates::OnBegin - Begin run callback. +# +proc Rates::OnBegin {run title} { + $::Rates::Title configure -text $title + $::Rates::Run configure -text $run +} + +## +# Rates::OnEnd - end run callback +# +proc Rates::OnEnd {run title} { + ::Rates::OnBegin $run $title +} + + +## +# Rates::Update +# Update the rates. +# +proc Rates::Update {start end} { + set dt [expr {$end - $start}] + foreach rate [rate list] { + + # only take action if the rate is not marked for deletion. + + if {! [lindex $rate 1]} { + set name [lindex $rate 0] + set totals [lindex $rate 2] + set rate [expr double([lindex $rate 3])/$dt] + + $::Rates::Display update $name $rate $totals + } + } + set secs [expr {$end % 60}] + set end [expr {$end / 60}] + set min [expr {$end % 60}] + set end [expr {$end / 60}] + set hrs [expr {$end % 24}] + set days [expr {$end/24}] + + set elapsed [format "%02d %02d:%02d:%02d" $days $hrs $min $secs] + $::Rates::Elapsed configure -text $elapsed + +} \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-13 15:09:21
|
Revision: 2257 http://sourceforge.net/p/nsclspectcl/code/2257 Author: ron-fox Date: 2015-02-13 15:09:13 +0000 (Fri, 13 Feb 2015) Log Message: ----------- Add an event processor that can call Tcl scripts on scaler items and run state changes * Run state changes provide the run number and title. * Scaler items provide the interval start/stop run offsets. The use case for this is to provide support for a rates display whose updates are tied to the event data (rather than clock time). Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2015-02-13 13:44:24 UTC (rev 2256) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2015-02-13 15:09:13 UTC (rev 2257) @@ -242,9 +242,7 @@ } } - if (builds > 0) { - std::cerr << "-----------------------------------------\n"; - } + } /** * hasOutputEvent Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.cpp 2015-02-13 15:09:13 UTC (rev 2257) @@ -0,0 +1,141 @@ +/****************************************************************************** +* +* 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 CRateUpdateProcessor.h + * @brief Implement the CRateUpdateProcessor. + * @author Ron Fox <ro...@ca...> + */ +#include <config.h> +#include "CRateUpdateProcessor.h" +#include <TCLInterpreter.h> +#include <TCLObject.h> +#include <SpecTcl.h> +#include <CRingBufferDecoder.h> +#include <DataFormat.h> +#include <iostream> +#include <stdlib.h> + +/** + * OnBegin + * Fetch the run number and title and invoke Rates::OnBegin + * The invocation is done with all errors ignored in case we have no such + * command. + * + * @param rAnalyzer - Object driving the analyzer. + * @param rDecoder - The buffer decoder. At this stage we don't need any assumptions + * about its actual type. + * @return kfTRUE - Indicating successful completion. + */ +Bool_t +CRateUpdateProcessor::OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) +{ + SpecTcl* pApi = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = pApi->getInterpreter(); + + CTCLObject command; + command.Bind(*pInterp); + + command += "Rates::OnBegin"; + command += static_cast<int>(rDecoder.getRun()); + command += rDecoder.getTitle(); + + try { + pInterp->GlobalEval(((std::string)(command)).c_str()); + } + catch(...) {} // Ignore errors. + + return kfTRUE; +} + +/** + * OnEnd + * Same really as on begin but invokes the Rates::OnEnd command. + * Should refactor but won't for now. + * + * @param rAnalyzer - Object driving the analyzer. + * @param rDecoder - The buffer decoder. At this stage we don't need any assumptions + * about its actual type. + * @return kfTRUE - Indicating successful completion. + */ +Bool_t +CRateUpdateProcessor::OnEnd(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) +{ + SpecTcl* pApi = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = pApi->getInterpreter(); + + CTCLObject command; + command.Bind(*pInterp); + + command += "Rates::OnEnd"; + command += static_cast<int>(rDecoder.getRun()); + command += rDecoder.getTitle(); + + try { + pInterp->GlobalEval(((std::string)(command)).c_str()); + } + catch(...) {} // Ignore errors. + + return kfTRUE; +} +/** + * OnOther + * We care about scaler events. For those we need to get the ring item + * to pull out the interval start/end times and use them to invoke + * Rates::Update start end + * + * @param nType - item type (2 are scalers to be compatible with 8.x) + * @param analyzer - The analyzer that drives the event processors. + * @param decoder - Buffer decoder. We assume this is a CRingBufferDecoder + * @return kfTrue - success. + */ +Bool_t +CRateUpdateProcessor::OnOther(UInt_t nType, CAnalyzer& analyze, CBufferDecoder& decoder) +{ + if (nType == 2) { + SpecTcl* pApi = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = pApi->getInterpreter(); + CTCLObject command; + command.Bind(*pInterp); + + // Get what we need from the ring item: + + CRingBufferDecoder* pDecoder = dynamic_cast<CRingBufferDecoder*>(&decoder); + if (!pDecoder) { + // not a ring decoder + + std::cerr << "Buffer decoder is not a ring buffer decoder!\n"; + exit(-1); + } + pScalerItem pItem = reinterpret_cast<pScalerItem>(pDecoder->getItemPointer()); + int start = pItem->s_intervalStartOffset; + int end = pItem->s_intervalEndOffset; + + // build up the command: + + command += "Rates::Update"; + command += start; + command += end; + + try { + pInterp->GlobalEval(((std::string)(command)).c_str()); + } + catch(...) {} + } + + + return kfTRUE; +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CRateUpdateProcessor.h 2015-02-13 15:09:13 UTC (rev 2257) @@ -0,0 +1,40 @@ +/****************************************************************************** +* +* 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 CRateUpdateProcessor.h + * @brief Defines event processor to drive rate display updates. + * @author Ron Fox <ro...@ca...> + */ + +#ifndef __CRATEUPDATEPROCESSOR_H +#define __CRATEUPDATEPROCESSOR_H + + +#include <EventProcessor.h> + +class CRateUpdateProcessor : public CEventProcessor +{ +public: + virtual Bool_t OnBegin(CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Begin Run and initializer. + virtual Bool_t OnEnd(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder); + virtual Bool_t OnOther(UInt_t nType, CAnalyzer& analyzer, CBufferDecoder& decoder); + +}; + + +#endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2015-02-13 13:44:24 UTC (rev 2256) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2015-02-13 15:09:13 UTC (rev 2257) @@ -1,10 +1,12 @@ INSTDIR=/usr/opt/spectcl/3.4 +DAQROOT=/usr/opt/daq/10.2-mtdc include $(INSTDIR)/etc/SpecTcl_Makefile.include + # If you have any switches that need to be added to the default c++ compilation # rules, add them to the definition below: -USERCXXFLAGS= +USERCXXFLAGS=-I$(DAQROOT)/include # # Uncomment the next line to enable reportage of bad events to stderr. #USERCXXFLAGS=-DREPORT_BAD_EVENTS @@ -17,7 +19,7 @@ # If you have any switches you need to add to the link add them below: -USERLDFLAGS=-ltcl8.5 +USERLDFLAGS= # # Append your objects to the definitions below: @@ -31,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 + CTimeParameters.o CFileWriter.o CRateUpdateProcessor.o # Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2015-02-13 13:44:24 UTC (rev 2256) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2015-02-13 15:09:13 UTC (rev 2257) @@ -48,6 +48,7 @@ #include "CEventBuilder.h" #include "CTimeParameters.h" #include "CFileWriter.h" +#include "CRateUpdateProcessor.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -111,6 +112,7 @@ RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); RegisterEventProcessor(*(new CTimeParameters), "Time-parameters"); RegisterEventProcessor(*(new CFileWriter), "file-writer"); + RegisterEventProcessor(*(new CRateUpdateProcessor), "rate-updater"); // RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-13 13:44:36
|
Revision: 2256 http://sourceforge.net/p/nsclspectcl/code/2256 Author: ron-fox Date: 2015-02-13 13:44:24 +0000 (Fri, 13 Feb 2015) Log Message: ----------- * Incorporate updates/fixes from LLNL visit. * Fix problems with gate management in event processors. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -27,8 +27,8 @@ #include <Event.h> #include "CParamMapCommand.h" #include <fstream> +#include <SpecTcl.h> - // Unpacker codes. static const int MADC32Unpacker(2); @@ -68,12 +68,15 @@ m_tdcHits[i].clear(); m_tdcWrapping[i].s_lastStamp = 0; m_tdcWrapping[i].s_wrapAdjust = 0; + m_tdcWrapping[i].s_lastAdjustedStamp = 0; + m_tdcWrapping[i].s_lastComputedTime = 0.0; } - for (int m = 0; m < 3; m++) { - for (int i =0; i < 2; i++) { - m_adcHits[i][m].clear(); - m_adcWrapping[i][m].s_lastStamp = 0 ; - m_adcWrapping[i][m].s_wrapAdjust = 0; + for (int m = 0; m < 32; m++) { + for (int i =0; i < 3; i++) { + m_adcHits[m][i].clear(); + m_adcWrapping[m][i].s_lastStamp = 0 ; + m_adcWrapping[m][i].s_wrapAdjust = 0; + } } buildParameterMaps(); @@ -83,7 +86,7 @@ // Clear the built queue too: m_builtEvents.clear(); - + m_skipping = skippingADC; } @@ -115,6 +118,19 @@ queueEvent(); buildEvents(); + // Clear the input queues for the next time through: + + for (int i =0; i < 34; i++) { + m_tdcHits[i].clear(); + } + for (int m = 0; m < 32; m++) { + for (int i =0; i < 3; i++) { + m_adcHits[m][i].clear(); + } + } + + + if (outputEvent(rEvent)) { return kfTRUE; } else { @@ -136,30 +152,37 @@ { // The MADCs first: + m_skipping = ok; CMADC32Unpacker::hits& madcHits(CMADC32Unpacker::getAccumulatedHits()); - for(int i = 0; i < madcHits.size(); i++) { - int id = madcHits[i].s_moduleId; - int ch = madcHits[i].s_channel; - if ((m_adcParameters[ch][id] >= 0) && (tdcQueueForAdc(id,ch) >= 0)) { - // only build using used parameters that have a tdc. - m_adcHits[ch][id].push_back(madcHits[i]); + if ((m_skipping == skippingADC) && (madcHits.size() > 0) ) { + m_skipping = skippingTDC; + } else { + for(int i = 0; i < madcHits.size(); i++) { + int id = madcHits[i].s_moduleId; + int ch = madcHits[i].s_channel; + if ((m_adcParameters[ch][id] >= 0) && (tdcQueueForAdc(id,ch) >= 0)) { + // only build using used parameters that have a tdc. + m_adcHits[ch][id].push_back(madcHits[i]); + } } } - CMADC32Unpacker::clearAccumulatedHits(); // and now the tdc hits: std::vector<CMTDC32Unpacker::hitInfo>& mtdcHits(CMTDC32Unpacker::getAccumulatedHits()); - for (int i =0; i < mtdcHits.size(); i++) { - - int ch = mtdcHits[i].s_channel; - std::pair<std::pair<int, int>, std::pair<int, int> > adcQueues = adcQueuesForTdc(ch); - if((m_tdcParameters[ch] >= 0) && (adcQueues.first.first >= 0) && (adcQueues.second.first >= 0) ){ - m_tdcHits[ch].push_back(mtdcHits[i]); + if (m_skipping == ok) { + for (int i =0; i < mtdcHits.size(); i++) { + + int ch = mtdcHits[i].s_channel; + std::pair<std::pair<int, int>, std::pair<int, int> > adcQueues = adcQueuesForTdc(ch); + if((m_tdcParameters[ch] >= 0) && (adcQueues.first.first >= 0) && (adcQueues.second.first >= 0) ){ + m_tdcHits[ch].push_back(mtdcHits[i]); + } } + } else if ((m_skipping == skippingTDC) && (mtdcHits.size() > 0)) { + m_skipping = ok; } - CMTDC32Unpacker::clearAccumulatedHits(); } /** @@ -177,28 +200,62 @@ void CEventBuilder::buildEvents() { - for (int i = 0; i < 34; i++) { + bool done = false; + int builds = 0; + while (! done) { + uint64_t earliest = 0xffffffffffffffff; + int tdcq; + std::pair<int, int> eq; + std::pair<int, int> tacq; + for (int i = 0; i < 34; i++) { - // Try to build for queues that have corresponding parameters and are not empty: - if ((m_tdcParameters[i] >= 0) && (!m_tdcHits[i].empty())) { - std::pair<std::pair<int, int>, std::pair<int, int> > madcs = adcQueuesForTdc(i); - - // Pull out the e/t madc queue specs...they must be defined _and_ they both - // must be non empty: - - std::pair<int, int> equeue = madcs.first; - std::pair<int, int> tacqueue = madcs.second; - if ((equeue.first >= 0) && (tacqueue.first >= 0) && - (!m_adcHits[equeue.first][equeue.second].empty()) && - (!m_adcHits[tacqueue.first][tacqueue.second].empty())) { - matchOrRecover(equeue, tacqueue, i); + // Try to build for queues that have corresponding parameters and are not empty: + + if ((m_tdcParameters[i] >= 0) && (!m_tdcHits[i].empty())) { + std::pair<std::pair<int, int>, std::pair<int, int> > madcs = adcQueuesForTdc(i); + + // Pull out the e/t madc queue specs...they must be defined _and_ they both + // must be non empty: + + std::pair<int, int> equeue = madcs.first; + std::pair<int, int> tacqueue = madcs.second; + if ((equeue.first >= 0) && (tacqueue.first >= 0) && + (!m_adcHits[equeue.first][equeue.second].empty()) && + (!m_adcHits[tacqueue.first][tacqueue.second].empty())) { + if (m_tdcHits[i].front().s_rawTime < earliest) { + earliest = m_tdcHits[i].front().s_rawTime; + tdcq = i; + eq = equeue; + tacq = tacqueue; + } + + } + } + } + if (earliest != 0xffffffffffffffff) { + builds++; + matchOrRecover(eq, tacq, tdcq); + } else { + done =true; + } - } } + if (builds > 0) { + std::cerr << "-----------------------------------------\n"; + } } /** + * hasOutputEvent + * True if the built event queue is not empty. + */ +bool +CEventBuilder::hasOutputEvent() +{ + return !m_builtEvents.empty(); +} +/** * outputEvent * If there's at least one event in the m_builtEvents queue emit it to the * next stage of processing. @@ -211,18 +268,35 @@ 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()) { + pGate->second->Reset(); + pGate++; + } + + if (!m_builtEvents.empty()) { BuiltEvent& event(m_builtEvents.front()); // No copy here due to references. - // Set the raw parameters in rEvent, by now we can assume that there are definitions - // for all of them. - - int paramId = m_adcParameters[event.s_Energy.s_channel][event.s_Energy.s_moduleId]; - rEvent[paramId] = event.s_Energy.s_energy; + // Set the raw parameters in rEvent, - paramId = m_adcParameters[event.s_MADCTiming.s_channel][event.s_MADCTiming.s_moduleId]; - rEvent[paramId] = event.s_MADCTiming.s_energy; + int paramId; + if (event.s_Energy.s_moduleId != 0xffffffff) { + paramId = m_adcParameters[event.s_Energy.s_channel][event.s_Energy.s_moduleId]; + rEvent[paramId] = event.s_Energy.s_energy; + } + if (event.s_MADCTiming.s_moduleId != 0xffffffff) { + paramId = m_adcParameters[event.s_MADCTiming.s_channel][event.s_MADCTiming.s_moduleId]; + rEvent[paramId] = event.s_MADCTiming.s_energy; + } + // TDC is always there. + paramId = m_tdcParameters[event.s_MTDCTiming.s_channel]; rEvent[paramId] = event.s_MTDCTiming.s_rawTime; @@ -231,15 +305,27 @@ // Note that since the MTDC time is what we use in future processing, the bank is going // to just be the channel of the energy from the MADC. - m_timestamp = computeAdcTimestamp(event); + // These each only get computed if the needed data are present: + + if (event.s_Energy.s_moduleId != 0xffffffff) { + m_timestamp = computeAdcTimestamp(event); + m_moduleID = event.s_Energy.s_moduleId; + m_bankNo = event.s_Energy.s_channel; + m_Energy = event.s_Energy.s_energy; + } m_highPTimestamp = computeTdcTimestamp(event); - m_moduleID = event.s_Energy.s_moduleId; - m_bankNo = event.s_Energy.s_channel; - m_Energy = event.s_Energy.s_energy; + + // + if (0) { + std::cerr << "Module: " << event.s_Energy.s_moduleId + << " Channel " << event.s_Energy.s_channel + << " TDC Conversion: " << std::hex << event.s_MTDCTiming.s_rawTime << std::hex + << " Seconds " << ((double)m_highPTimestamp)/1.0e10 + << std::endl; + } + // remove the event from the queue: - // remove the event from the queue: - m_builtEvents.pop_front(); // Indicate that we did build an event. @@ -256,28 +342,17 @@ * matchOrRecover * Given two MADC queue identifiers and an MTDC queue identifier build * as many events as we can for those queues and add them to the - * m_builtEvents output queue. An event is successfully built when - * there are elements at the front of each queue and: - * * The event correlation information for the two madcs are identical and - * * The event correlation for the madc is within m_builtWindow of the event - * correlation information in the MTDC. + * m_builtEvents output queue. * - * Given the hardware trigger, if there are elements at the front of all three - * queues and this does not hold, this is a problem. - * To be honest I'm not really sure what to do in - * that case as I don't have enough bits of matching information from the TDC to reliably - * even know if times are ahead or behind (with a rollover of 4ms). The temptation is strong - * to clear all 3 involved queues but there's no assurance when I start getting data that I won't - * be off by an event in one or more of the queues because of where the queue tails are. - * - * Given the order in which the data appear in the super events, the likely hood is that I - * have only one time event but maybe more than one MADC event. Here's what I'll try to do: - * * Drop the time event. - * * If the MADC events are a match for each other, drop both of them. - * * If the MADC events are not a match for each other, drop the oldest one, until: - * > I get a match at which time I stop dropping events. - * > Or one of the queues has been emptied. + * We build events from whatever we can find that matches. This could be + * a tdc + e and not TAC...ideally it would be a tdc, an e and a tac. + * Note that when the caller has built everything that can be built the queues + * get cleared (that's actually the recovery) The idea is that observationally, + * events at the VM-USB level consist of one or more MADC module data packets + * and the TDC data for the 'real stuff'. * + * We're going to tag missing elements by giving them an s_moduleId = 0xffffffff + * * @param equeue - Identifies the MADC E queue (first is channel, second is module). * @param tacqueue - Identifies the MADC TAQC queue * @param mtdcqueue - Identifies the mtdc queue involved. @@ -305,6 +380,7 @@ m_adcHits[equeue.first][equeue.second].pop_front(); m_adcHits[tacqueue.first][tacqueue.second].pop_front(); m_tdcHits[mtdcqueue].pop_front(); + return; } else { // Recover from mismatch: @@ -312,8 +388,8 @@ std::cerr << "Failed to match times at front of queues for tdc " << mtdcqueue << " attempting to re-sync\n"; - m_tdcHits[mtdcqueue].pop_front(); // Drop the times. - recoverMADCQueues(equeue, tacqueue); // Try to recover synch in the MADC queues. + // m_tdcHits[mtdcqueue].pop_front(); // Drop the times. + recoverMADCQueues(equeue, tacqueue, tdcHit); // Try to recover synch in the MADC queues. } @@ -321,19 +397,16 @@ done = true; // Can't build if there's an empty queue. } } - + } /** * matchingHits - * Determine if two MADC hits and an MTDC hit are part of the same event based on their - * event correlation information. * - * * The two MADC's must have an identical event correlation value since they are from - * the same gate on the same MADC and the event correlation value timestamps the gate. - * * The MTDC hit must be within m_buildWindow of the MADC timestamps. - * + * Hits match if the timing of all data present are within the time window of + * the TDC hit. The TDC hit is the only one we are ensured we have + * * @param ehit - The MADC32 energy hit. * @param tachit - The MADC32 TAC hit. * @param tdchit - The MTDC32 timing hit. @@ -344,35 +417,77 @@ CEventBuilder::matchingHits(CMADC32Unpacker::hitInfo& ehit, CMADC32Unpacker::hitInfo& tachit, CMTDC32Unpacker::hitInfo& tdchit) { - if (ehit.s_eventCorr == tachit.s_eventCorr) { - // The TDC only has the bottom 16 bits of the event correlation information: + return match2(ehit.s_eventCorr, tdchit.s_eventCorr) && + match2(tachit.s_eventCorr, tdchit.s_eventCorr); - uint32_t madcStamp = ehit.s_eventCorr & 0xffff; - uint32_t tdcStamp = tdchit.s_eventCorr; - unsigned tolerance = m_buildWindow; - // First try them without worrying about the wrap differences could go either way: +#ifdef OLDCODE + if ((ehit.s_moduleId != 0xffffffff) && (tachit.s_moduleId != 0xffffffff)) { + if (ehit.s_eventCorr != tachit.s_eventCorr) return false; + } + + // If both E/TAC are missing it's a TDC that hit during the MADC busy...toss: + + if ((ehit.s_moduleId == 0xffffffff) && (tachit.s_moduleId == 0xffffffff)) { + return false; + } + // Ok so if we have two MADC times they will be the same so this gets the + // ADC time for the match + + uint32_t madcStamp; + if (ehit.s_moduleId != 0xffffffff) { + madcStamp = ehit.s_eventCorr; + } + if(tachit.s_moduleId != 0xffffffff) { + madcStamp = tachit.s_eventCorr; + } + + madcStamp = madcStamp & 0xffff; /// MTDC only has bottom 16 bits. + uint32_t tdcStamp = tdchit.s_eventCorr; + + + // Now do the compare: + + unsigned tolerance = m_buildWindow; - if ((madcStamp - tdcStamp) < tolerance) return true; - if ((tdcStamp - madcStamp) < tolerance) return true; + // First try them without worrying about the wrap differences could go either way: - // One stamp could be wrapped relative to the other. In that case the wrapped - // one is always larger: + if ((madcStamp - tdcStamp) < tolerance) return true; + if ((tdcStamp - madcStamp) < tolerance) return true; - uint32_t wrapped = madcStamp | 0x10000; // MADC stamp is wrapped: - if ((wrapped - tdcStamp) < tolerance) return true; - - wrapped = tdcStamp | 0x10000; // TDC Stamp wrapped: - if((wrapped - madcStamp) < tolerance) return true; - } else { - return false; - } + // One stamp could be wrapped relative to the other. In that case the wrapped + // one is always larger: + + uint32_t wrapped = madcStamp | 0x10000; // MADC stamp is wrapped: + if ((wrapped - tdcStamp) < tolerance) return true; + + wrapped = tdcStamp | 0x10000; // TDC Stamp wrapped: + if((wrapped - madcStamp) < tolerance) return true; + // If we fall here, there's no match: return false; +#endif } +bool CEventBuilder::match2(uint32_t madcTime, uint32_t mtdcTime) +{ + madcTime = madcTime & 0xffff; // Mtdc time is only 16 bits wide. + unsigned tolerance = m_buildWindow; + + if((madcTime - mtdcTime) < tolerance) return true; + uint32_t wrapped = mtdcTime | 0x10000; // If the mtdc wrapped ok? + if ((mtdcTime - madcTime) < tolerance) return true; + + wrapped = madcTime | 0x10000; // If the madc time is wrapped? + if ((madcTime - mtdcTime) < tolerance) return true; + +} + /** * recoverMADCQueues + * + * OBSOLETE - not called -- left in for now. + * * Tries to recover synchronization in am MADC queue. * * If the front of both queues match, just drop front elements and stop. * * If the front of both queues don't match, drop the oldest until there @@ -382,40 +497,21 @@ * @param tacqueue - Specifies the TAC queue. */ void -CEventBuilder::recoverMADCQueues(std::pair<int, int> equeue, std::pair <int, int> tacqueue) +CEventBuilder::recoverMADCQueues(std::pair<int, int> equeue, std::pair <int, int> tacqueue, CMTDC32Unpacker::hitInfo& tdchit) { // Let's start by getting queue references: AdcQueue& e(m_adcHits[equeue.first][equeue.second]); AdcQueue& tac(m_adcHits[tacqueue.first][tacqueue.second]); - // If the fronts match just drop the front elements and try again later. - // This happens if, e.g. an MADC event sneaks in due to a threshold that's too low. - // and therefore does not have a TDC event. - - if (e.front().s_eventCorr == tac.front().s_eventCorr) { - e.pop_front(); + if (!match2(e.front().s_eventCorr, tdchit.s_eventCorr)) { + e.pop_front(); + } + if (!match2(tac.front().s_eventCorr, tdchit.s_eventCorr)) { tac.pop_front(); - return; } - // NO match in the front so drop oldest element between the TAC/Q until we can get a - // match or one of the queues - // emptied: This should only happen if e.g. an event sneaks into one of the MADC's - // but not the other again, most likely due to threshold problems. - while(!e.empty() && !tac.empty()) { - if(e.front().s_eventCorr == tac.front().s_eventCorr) return; // back to matching. - - // Drop the oldest of the two elements - - if(e.front().s_eventCorr < tac.front().s_eventCorr) { - e.pop_front(); - } else { - tac.pop_front(); - } - } - } /** * computeAdcTimestamp' @@ -436,10 +532,10 @@ uint64_t rawTimestamp = event.s_Energy.s_eventCorr; unsigned module = event.s_Energy.s_moduleId; - unsigned bank = event.s_Energy.s_channel/2; + unsigned bank = event.s_Energy.s_channel/16; if (rawTimestamp < m_adcWrapping[bank][module].s_lastStamp) { - m_adcWrapping[bank][module].s_wrapAdjust += 0x100000000; // we wrapped 2^32 up. + m_adcWrapping[bank][module].s_wrapAdjust += 0x40000000; // we wrapped 2^32 up. } m_adcWrapping[bank][module].s_lastStamp = rawTimestamp; return rawTimestamp + m_adcWrapping[bank][module].s_wrapAdjust; @@ -464,8 +560,16 @@ m_tdcWrapping[channel].s_lastStamp = rawTimestamp; rawTimestamp += m_tdcWrapping[channel].s_wrapAdjust; // full wraw timestamp. + m_tdcWrapping[channel].s_lastAdjustedStamp = rawTimestamp; - return (static_cast<double>(rawTimestamp) * event.s_MTDCTiming.s_timeCalibration); + double dStamp = rawTimestamp; + double cStamp = dStamp * (event.s_MTDCTiming.s_timeCalibration/100.0); + + m_tdcWrapping[channel].s_lastComputedTime = cStamp; + + + + return cStamp; } /** * adcQueuesForTdc Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2015-02-13 13:44:24 UTC (rev 2256) @@ -91,8 +91,10 @@ // information about wrapping the actual raw high resolution times: typedef struct _WrapTrack { - uint32_t s_lastStamp; + uint64_t s_lastStamp; uint64_t s_wrapAdjust; + uint64_t s_lastAdjustedStamp; + double s_lastComputedTime; } WrapTrack; // Data: @@ -126,9 +128,18 @@ std::pair<int, int> m_TACFromTDC[34]; std::pair<int, int> m_tacFromE[32][3]; - std::pair<int, int> m_eFromTAC[32][3]; + std::pair<int, int> m_eFromTAC[32][3];\ + // begin run intialization is a bit wonky and depensd on some states: + typedef enum _skipState { + skippingADC, + skippingTDC, + ok} skipState; + skipState m_skipping; + + + // canonicals: public: CEventBuilder(); @@ -143,7 +154,8 @@ CEvent& rEvent, CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder); - + bool hasOutputEvent(); + bool outputEvent(CEvent& rEvent); // Private Utilities: private: @@ -152,10 +164,9 @@ void queueEvent(); void buildEvents(); - bool outputEvent(CEvent& rEvent); void matchOrRecover(std::pair<int, int> equeue, std::pair<int, int> tacqueue, int mtdcqueue); bool matchingHits(CMADC32Unpacker::hitInfo& ehit, CMADC32Unpacker::hitInfo& tachit, CMTDC32Unpacker::hitInfo& tdcHit); - void recoverMADCQueues(std::pair<int, int> equeue, std::pair <int, int> tacqueue); + void recoverMADCQueues(std::pair<int, int> equeue, std::pair <int, int> tacqueue, CMTDC32Unpacker::hitInfo& tdchit); // Not directly related t event building. @@ -171,6 +182,7 @@ int tdcQueueForAdc(int module, int channel); std::pair<int, int> tacFromE(int module, int channel); std::pair<int, int> eFromTac(int module, int channel); + bool match2(uint32_t adctime, uint32_t tdctime); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -31,6 +31,8 @@ #include <stdio.h> #include <stdint.h> #include <unistd.h> +#include <iostream> +#include <Histogrammer.h> static const char* gateNames[] = { "xmb.gamma-block-gamma", @@ -55,7 +57,7 @@ m_offsets("xmb.offsets", 0.0, "", 32*3), m_slopes("xmb.slopes", 1.0, "", 32*3), m_quadcoef("xmb.quadcoef", 0.0, "", 32*3), - m_timestamp("timestampPS"), + m_timestamp("Time.Run-Time-s"), m_moduleId("moduleID"), m_bankNo("bankNo"), m_energy("Energy"), @@ -130,22 +132,32 @@ Bool_t CFileWriter::operator()(const Address_t pEvent, CEvent& rEvent, CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { + + // Only do anything if enabled: if (m_enable != 0.0) { + uint16_t pid = m_defaultPID; // in case no gates are made. for (int i=0; i < m_gates.size(); i++) { - CGateContainer g(*m_gates[i]); - if ((*g)(rEvent)) { + if ((**m_gates[i])(rEvent)) { pid = m_pids[i]; break; } } + m_eventCount++; - double time = m_timestamp/1.0e9; // Time in seconds. - uint16_t detno = m_moduleId*m_bankNo; + double time = m_timestamp; // Time in seconds. + int detInModule = m_bankNo; + if (detInModule > 16) detInModule -= 8; + 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) { + std::cerr << "Neutron at : " << time << " from " << detno << std::endl; + } + // Would love to put all of this in a struct, however structs can be padded so we must // write like this: @@ -184,7 +196,7 @@ m_mustEnd = false; // closed binary regardless. m_binaryOutput.close(); char finalFilename[1000]; - sprintf(finalFilename, "run-%04d-xmb.evt", m_runNumber); + sprintf(finalFilename, "run-%04d.xmb", m_runNumber); std::ofstream finalFile(finalFilename); if (finalFile.fail()) { std::cerr << "Unable to open final output file: " << finalFilename << std::endl; @@ -254,7 +266,7 @@ char command[2000]; sprintf(command, "cat %s >> %s", binaryFilename, finalFilename); system(command); - // unlink(binaryFilename); + unlink(binaryFilename); } Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h 2015-02-13 13:44:24 UTC (rev 2256) @@ -83,7 +83,7 @@ CTreeParameter m_energy; - static const int m_defaultPID = 11; /* Meaning uncertain. */ + static const int m_defaultPID = 5; /* Meaning uncertain. */ bool m_mustEnd; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -127,81 +127,78 @@ return offset + 2; } - - uint32_t type = (header & ALL_TYPEMASK) >> ALL_TYPESHFT; - if (type != TYPE_HEADER) return offset; - - int longsRead = 1; // Count the longwords processed: - - int id = (header & HDR_IDMASK) >> HDR_IDSHFT; - if (id != pMap->vsn) return offset; - m_moduleID = id; // Save it for the multiplicity unpacker. - + while (moreData(pMap->vsn, header)) { + int id = pMap->vsn; + + m_moduleID = id; // Save it for the multiplicity unpacker. + // We've established this is our data. // We're going to use the trailer to terminate so we don't need the // conversion count field of the header. - offset += 2; - unsigned long datum = getLong(event, offset); - longsRead++; - offset += 2; - hits eventHits; // Hits to be added to the accumulated hits: + offset += 2; + unsigned long datum = getLong(event, offset); - while (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_DATA) { - bool overflow = (datum & DATA_ISOVERFLOW) != 0; - if (!overflow) { - int channel = (datum & DATA_CHANNELMASK) >> DATA_CHANNELSHFT; - m_bankNo = channel/16; // Bank number within the ADC (each bank is a separate 'module'). - int value = datum & DATA_VALUEMASK; - int id = pMap->map[channel]; - if (id != -1) { - rEvent[id] = value; - } - hitInfo hit = {pMap->vsn, channel, value, 0}; // Don't yet know the timestamp: - eventHits.push_back(hit); - } - datum = getLong(event, offset); - longsRead++; - offset += 2; - } - // The timestamp should be in the trailer. If so then - // set it. There will only be a single tiemstamp per event as we ensure that we - // only analyze one module/event in each superevent by breaking out at the first non-event - // Events that don't have a trailer won't get a timestamp. + offset += 2; + hits eventHits; // Hits to be added to the accumulated hits: - uint32_t timestamp; - if (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_TRAILER) { - timestamp = datum & TRAILER_COUNTMASK; - m_timestamp = timestamp; + while (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_DATA) { + bool overflow = (datum & DATA_ISOVERFLOW) != 0; + if (!overflow) { + int channel = (datum & DATA_CHANNELMASK) >> DATA_CHANNELSHFT; + m_bankNo = channel/16; // Bank number within the ADC (each bank is a separate 'module'). + int value = datum & DATA_VALUEMASK; + int id = pMap->map[channel]; + if (id != -1) { + rEvent[id] = value; + } + hitInfo hit = {pMap->vsn, channel, value, 0}; // Don't yet know the timestamp: + eventHits.push_back(hit); + } + datum = getLong(event, offset); - double a = m_timestamp; - if (a < 0.0) { - cerr << "Bad timestamp\n"; - } else { - // Put the timestamp into the hits and append them to the accumulated hits: - - for (int i = 0; i < eventHits.size(); i++) { - eventHits[i].s_eventCorr = timestamp; + offset += 2; } - m_accumulatedHits.insert(m_accumulatedHits.end(), eventHits.begin(), eventHits.end()); + // The timestamp should be in the trailer. If so then + // set it. There will only be a single tiemstamp per event as we ensure that we + // only analyze one module/event in each superevent by breaking out at the first non-event + // Events that don't have a trailer won't get a timestamp. + + uint32_t timestamp; + if (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_TRAILER) { + timestamp = datum & TRAILER_COUNTMASK; + m_timestamp = timestamp; + + double a = m_timestamp; + if (a < 0.0) { + cerr << "Bad timestamp\n"; + } else { + // Put the timestamp into the hits and append them to the accumulated hits: + + for (int i = 0; i < eventHits.size(); i++) { + eventHits[i].s_eventCorr = timestamp; + } + m_accumulatedHits.insert(m_accumulatedHits.end(), eventHits.begin(), eventHits.end()); + + } + } + else { + // Sometimes I see wonky events...missing trailers... data with the top 1/2 filled with only 1's. + // I'm going to pop an exeption out so that the caller can move on to the next event/supervevent, + // If this is not just another header. If it's another header I'll assume the trailer is just + // missing. - } - } - else { - // Sometimes I see wonky events...missing trailers... data with the top 1/2 filled with only 1's. - // I'm going to pop an exeption out so that the caller can move on to the next event/supervevent, - // If this is not just another header. If it's another header I'll assume the trailer is just - // missing. - - if ((datum & ALL_TYPEMASK >> ALL_TYPESHFT) == TYPE_HEADER) { - return offset - 2; // Put the header back in the event for then ext call... - } - else { + if ((datum & ALL_TYPEMASK >> ALL_TYPESHFT) == TYPE_HEADER) { + offset = offset - 2; // Put the header back in the event for then ext call... + } + else { - throw string("MADC Unpacker did not see a trailer at the end of an MADC32 event"); + throw string("MADC Unpacker did not see a trailer at the end of an MADC32 event"); + } + } + header = getLong(event, offset); } - } - return offset; + return offset; } /** @@ -220,3 +217,19 @@ { m_accumulatedHits.clear(); } +/** + * moreData determine if we have an MADC header and if that header + * has our id. + * + * @param id - Our virtual slot id. + * @param datum - a word to check on + */ +bool +CMADC32Unpacker::moreData(int id, uint32_t datum) +{ + uint32_t type = (datum & ALL_TYPEMASK) >> ALL_TYPESHFT; + int module = (datum & HDR_IDMASK) >> HDR_IDSHFT; + + return ((type == TYPE_HEADER) && (module == id)); + +} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h 2015-02-13 13:44:24 UTC (rev 2256) @@ -77,7 +77,7 @@ static hits& getAccumulatedHits(); static void clearAccumulatedHits(); - + bool moreData(int id, uint32_t datum); }; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -71,37 +71,38 @@ // pExtraData pD = reinterpret_cast<pExtraData>(pMap->extraData); - std::vector<hitInfo> hits; // Only do one event so that data can be pushed through the event // builder. - if (moreData(getLong(event, offset), pMap)) { + while (moreData(getLong(event, offset), pMap)) { + std::vector<hitInfo> hits; offset = unpackMTDC32Event(hits, event, offset); + + + // Put the hits into the tree parameters. + + int hitcount[34]; // Number of hits already in each channel. + memset(hitcount, 0, sizeof(hitcount)); + for (int i =0; i < hits.size(); i++) { + int ch = hits[i].s_channel; + if ((hitcount[ch] < pD->s_maxHits) && (pMap->map[i] >= 0)) { + int h = hitcount[ch]; + pD->s_time[ch][h] = hits[i].s_rawTime; + pD->s_eventCorr[ch][h] = hits[i].s_eventCorr; + hitcount[ch]++; + } + + } + // Add the hits to the accumulated hits: + + m_accumulatedHits.insert(m_accumulatedHits.end(), hits.begin(), hits.end()); } // If our last word was 0xffffffff need to skip it too: - + if (getLong(event, offset) == 0xffffffff) { offset +=2; } - // Put the hits into the tree parameters. - - int hitcount[34]; // Number of hits already in each channel. - memset(hitcount, 0, sizeof(hitcount)); - for (int i =0; i < hits.size(); i++) { - int ch = hits[i].s_channel; - if ((hitcount[ch] < pD->s_maxHits) && (pMap->map[i] >= 0)) { - int h = hitcount[ch]; - pD->s_time[ch][h] = hits[i].s_rawTime; - pD->s_eventCorr[ch][h] = hits[i].s_eventCorr; - hitcount[ch]++; - } - - } - // Add the hits to the accumulated hits: - - m_accumulatedHits.insert(m_accumulatedHits.end(), hits.begin(), hits.end()); - return offset; } @@ -271,7 +272,7 @@ datum = getLong(event, offset); if (!MTDC::isEnd(datum)) { - std::string("Exected end of event in timestamp mode and was disappointed"); + return offset; } offset +=2; words -=1; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -183,7 +183,7 @@ for (int i =0; i < ids.size(); i++) { int id = atoi(ids[i].c_str()); - for(int b = 0; b < 4; b+=2) { + for(int b = 0; b < 32; b+=2) { bankQueue bank; @@ -194,8 +194,8 @@ bank.s_firstEvent = true; m_fragmentQueues.push_back(bank); - bank.s_bankNumber = b+16; // The E's in the top bank of the MADC - m_fragmentQueues.push_back(bank); + //bank.s_bankNumber = b+16; // The E's in the top bank of the MADC + //m_fragmentQueues.push_back(bank); } } m_initialized=true; @@ -323,7 +323,7 @@ return kfFALSE; // Abort event processing. } - double highPStampNs = highPTimestamp / 1000.0; /// 1000ps/ns. + double highPStampNs = highPTimestamp / 10.0; /// 1000ps/ns. double timestamp = rawTimestamp; // If first event, save that sort of stuff too: Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -28,6 +28,7 @@ #include "CPSD.h" #include "CV1729Unpacker.h" #include "CMTDC32Unpacker.h" +#include "CEventBuilder.h" #include <Event.h> @@ -61,6 +62,8 @@ static CV1729Unpacker unpackV1729; static CMTDC32Unpacker unpackMTDC32; +extern CEventBuilder* gpEventBuilder; + // table of unpackers for each type of module. CModuleUnpacker* CStackUnpacker::m_unpackers[] = @@ -134,6 +137,12 @@ m_state = Internal; m_stack = info.s_stackNumber; case Internal: + if (gpEventBuilder->hasOutputEvent()) { + // gpEventBuilder->outputEvent(rEvent); + analyzer.entityNotDone(); + analyzer.SetEventSize(0); + return kfTRUE; + } unpackEvent(rEvent); break; default: @@ -152,9 +161,17 @@ } else { // No data left in the superevent, transition to the Initial state: - - analyzer.SetEventSize(m_size*sizeof(uint16_t)); - m_state = Initial; + + // Flush the output event queue until it's empty: + + if (!gpEventBuilder->hasOutputEvent()) { + analyzer.SetEventSize(m_size*sizeof(uint16_t)); + m_state = Initial; + } else { + //gpEventBuilder->outputEvent(rEvent); + analyzer.entityNotDone(); + analyzer.SetEventSize(0); + } } return kfTRUE; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -31,6 +31,7 @@ #include <vector> #include <stdint.h> #include <Spectrum1DL.h> +#include <iostream> /** @@ -301,24 +302,44 @@ CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { + static double lastTimeS; if (!m_fInitialized) OnBegin(rAnalyzer, rDecoder); // Set the initial times if they are 0.0: double hpTs = m_highPTimestamp; if (m_t0 == 0.0) { + std::cerr << "Establishing t0 to be: " << hpTs << std::endl; m_t0 = hpTs; m_lastTime = hpTs; m_lastTimeGated = hpTs; + lastTimeS = 0.0; } // Figure out the run time in ns and seconds (note that the highPTimestamp is in picoseconds). // These are typically x axes for spectra/strip charts and therefore won't be logged. double elapsedTimePs = hpTs - m_t0; - m_runTimeNs = elapsedTimePs/1000.0; // 1000 ps in a nanosecond. + m_runTimeNs = elapsedTimePs/10.0; // 1000 ps in a nanosecond. m_runTimeS = m_runTimeNs / 1.0e9; // 10^9 ns in a second. + double rtNs = m_runTimeNs; + double rtS = m_runTimeS; +#ifdef UNDEFINED + if ((rtS - lastTimeS) > 1.0) { + std::cerr << "Skip by more than one second: " + << (rtS - lastTimeS) + << " time: " << rtS + << std::endl; + } + if (rtS < lastTimeS) { + std::cerr << "Time went backwards " + << "Prior " << lastTimeS + << "Now " << rtS << std::endl; + } +#endif + lastTimeS = rtS; + m_HaveEvent = 1; m_totalEvents = m_totalEvents + 1; m_EventCount = m_totalEvents; @@ -331,17 +352,18 @@ // Now do the dt parameters. These provide the time in ns since the most recent event and // most recent event that makes m_delataTGate true. - m_deltaTns = (m_highPTimestamp - m_lastTime)/1000.0; + double dtns= (m_highPTimestamp - m_lastTime)/10.0; + m_deltaTns = dtns; m_lastTime = m_highPTimestamp; if (m_deltaTns > 0.0) { m_logDtns = log10(m_deltaTns); } else { - m_logDtns = .01; // standard fudge for 0/negative log values. + m_logDtns = .0001; // standard fudge for 0/negative log values. } if ((*m_deltaTGate)(rEvent)) { - m_deltaTGatedns = (m_highPTimestamp - m_lastTimeGated)/1000.0; + m_deltaTGatedns = (m_highPTimestamp - m_lastTimeGated)/10.0; m_lastTimeGated = m_highPTimestamp; if (m_deltaTGatedns > 0.0) { Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -107,6 +107,12 @@ float MTDC::psPerChannel(unsigned res) { + return 3.9; + // Note the timestamp mode always uses 3.9ps + + if (res == 15) { + return 3.9; + } return resToPs[res]; } Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2015-02-13 13:44:24 UTC (rev 2256) @@ -101,12 +101,13 @@ */ - +CEventBuilder* gpEventBuilder(0); void CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); - RegisterEventProcessor(*(new CEventBuilder), "eventBuilder"); + gpEventBuilder = (new CEventBuilder); + RegisterEventProcessor(*gpEventBuilder, "eventBuilder"); RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); RegisterEventProcessor(*(new CTimeParameters), "Time-parameters"); RegisterEventProcessor(*(new CFileWriter), "file-writer"); @@ -234,10 +235,10 @@ CTclGrammerApp::SelectDisplayer(nDisplaySize, rHistogrammer); CXamineEventHandler* pEventHandler = getXamineEvents(); - // CButtonBoxSetup* pSetup = new CButtonBoxSetup; - // pEventHandler->addRestartHandler(*pSetup); + CButtonBoxSetup* pSetup = new CButtonBoxSetup; + pEventHandler->addRestartHandler(*pSetup); - // (*pSetup)(); // Get it set up the first time. + (*pSetup)(); // Get it set up the first time. Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2015-02-13 13:44:24 UTC (rev 2256) @@ -76,7 +76,36 @@ set file [file join $::env(HOME) config daqconfig.tcl] vmusbConfig $file +if {[info globals madcIds] eq ""} { + set madcIds [list] +} +splash::progress $splash {Creating additional spectra} +# +# Create the 2-d spectra for the e vs. t +# +set parameters [parameter -list e.*] +foreach edef $parameters { + set ename [lindex $edef 0] + set enum [lindex [split $ename .] 1] + set tname t.$enum + + spectrum 2d.$enum 2 [list $ename $tname] {{0 4095 512} {0 4095 512}} +} + +for {set i 1} {$i <= 24} {incr i} { + set sname [format det-%02d $i] + set ename [format e.%02d $i] + set tname [format t.%02d $i] + + spectrum $sname 2 [list $ename $tname] {{0 4095 512} {0 4095 512}} +} +spectrum Sum2D m2 {e.01 t.01 e.02 t.02 e.03 t.03 e.04 t.04 e.05 t.05 e.06 t.06 e.07 t.07 e.08 t.08 e.09 t.09 e.10 t.10 e.11 t.11 e.12 t.12 e.13 t.13 e.14 t.14 e.15 t.15 e.16 t.16 e.17 t.17 e.18 t.18 e.19 t.19 e.20 t.20 e.21 t.21 e.22 t.22 e.23 t.23 e.24 t.24} {{0.000000 4095.000000 2048} {0.000000 4095.000000 512}} + +sbind -all +.treegui.notebook.b update + + splash::progress $splash {Building LLNL Neutrons parameter GUI} source [file join $here llnlui.tcl] @@ -86,4 +115,31 @@ splash::config $splash -delay 2000 -source plotIntervalSpectra.tcl \ No newline at end of file +source plotIntervalSpectra.tcl + + +if {0} { +source [file join $here plotTotalMult.tcl] +button .ptotal -text {TotalMult} -command [list totalMultiplicity .tm] +pack .ptotal -fill x -expand 1 + +source [file join $here plotMultBins.tcl] +button .pmult -text {Specific Mult} -command [list plotMultBins .pb] +pack .pmult -fill x -expand 1 +} +source [file join $here plotGateMult.tcl] +button .pgate -text {Gate Multiplicity} -command [list gateMultiplicity .pg] +pack .pgate -fill x -expand 1 + +source [file join $here plotCbar.tcl] +button .pcbar -text {CBar} -command [list Cbar .pcb] +pack .pcbar -fill x -expand 1 + +source [file join $here ploty2f.tcl] +button .py2f -text {Y2f} -command [list Y2f .y2f] +pack .py2f -fill x -expand 1 + +source [file join $here ploty3f.tcl] +button .py3f -text {Y3f} -command [list Y3f .y3f] +pack .py3f -fill x -expand 1 +puts done \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-02-11 12:54:23 UTC (rev 2255) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-02-13 13:44:24 UTC (rev 2256) @@ -1,4 +1,4 @@ -# SpecTclGUI save file created Fri Dec 19 09:39:50 EST 2014 +# SpecTclGUI save file created Fri Feb 13 07:35:48 EST 2015 # SpecTclGui Version: 1.0 # Author: Ron Fox (fo...@ns...) @@ -12,39 +12,22 @@ catch {treeparameter -create e.06 0 4095 4096 {}} catch {treeparameter -create e.07 0 4095 4096 {}} catch {treeparameter -create e.08 0 4095 4096 {}} -catch {treeparameter -create madc.00 0 4095 4096 {}} -catch {treeparameter -create madc.01 0 4095 4096 {}} -catch {treeparameter -create madc.02 0 4095 4096 {}} -catch {treeparameter -create madc.03 0 4095 4096 {}} -catch {treeparameter -create madc.04 0 4095 4096 {}} -catch {treeparameter -create madc.05 0 4095 4096 {}} -catch {treeparameter -create madc.06 0 4095 4096 {}} -catch {treeparameter -create madc.07 0 4095 4096 {}} -catch {treeparameter -create madc.08 0 4095 4096 {}} -catch {treeparameter -create madc.09 0 4095 4096 {}} -catch {treeparameter -create madc.10 0 4095 4096 {}} -catch {treeparameter -create madc.11 0 4095 4096 {}} -catch {treeparameter -create madc.12 0 4095 4096 {}} -catch {treeparameter -create madc.13 0 4095 4096 {}} -catch {treeparameter -create madc.14 0 4095 4096 {}} -catch {treeparameter -create madc.15 0 4095 4096 {}} -catch {treeparameter -create madc.16 0 4095 4096 {}} -catch {treeparameter -create madc.17 0 4095 4096 {}} -catch {treeparameter -create madc.18 0 4095 4096 {}} -catch {treeparameter -create madc.19 0 4095 4096 {}} -catch {treeparameter -create madc.20 0 4095 4096 {}} -catch {treeparameter -create madc.21 0 4095 4096 {}} -catch {treeparameter -create madc.22 0 4095 4096 {}} -catch {treeparameter -create madc.23 0 4095 4096 {}} -catch {treeparameter -create madc.24 0 4095 4096 {}} -catch {treeparameter -create madc.25 0 4095 4096 {}} -catch {treeparameter -create madc.26 0 4095 4096 {}} -catch {treeparameter -create madc.27 0 4095 4096 {}} -catch {treeparameter -create madc.28 0 4095 4096 {}} -catch {treeparameter -create madc.29 0 4095 4096 {}} -catch {treeparameter -create madc.30 0 4095 4096 {}} -catch {treeparameter -create madc.31 0 4095 4096 {}} -catch {treeparameter -create madc.timestamp 0 4095 4096 {}} +catch {treeparameter -create e.09 0 4095 4096 {}} +catch {treeparameter -create e.10 0 4095 4096 {}} +catch {treeparameter -create e.11 0 4095 4096 {}} +catch {treeparameter -create e.12 0 4095 4096 {}} +catch {treeparameter -create e.13 0 4095 4096 {}} +catch {treeparameter -create e.14 0 4095 4096 {}} +catch {treeparameter -create e.15 0 4095 4096 {}} +catch {treeparameter -create e.16 0 4095 4096 {}} +catch {treeparameter -create e.17 0 4095 4096 {}} +catch {treeparameter -create e.18 0 4095 4096 {}} +catch {treeparameter -create e.19 0 4095 4096 {}} +catch {treeparameter -create e.20 0 4095 4096 {}} +catch {treeparameter -create e.21 0 4095 4096 {}} +catch {treeparameter -create e.22 0 4095 4096 {}} +catch {treeparameter -create e.23 0 4095 4096 {}} +catch {treeparameter -create e.24 0 4095 4096 {}} catch {treeparameter -create t.01 0 4095 4096 {}} catch {treeparameter -create t.02 0 4095 4096 {}} catch {treeparameter -create t.03 0 4095 4096 {}} @@ -53,6 +36,22 @@ catch {treeparameter -create t.06 0 4095 4096 {}} catch {treeparameter -create t.07 0 4095 4096 {}} catch {treeparameter -create t.08 0 4095 4096 {}} +catch {treeparameter -create t.09 0 4095 4096 {}} +catch {treeparameter -create t.10 0 4095 4096 {}} +catch {treeparameter -create t.11 0 4095 4096 {}} +catch {treeparameter -create t.12 0 4095 4096 {}} +catch {treeparameter -create t.13 0 4095 4096 {}} +catch {treeparameter -create t.14 0 4095 4096 {}} +catch {treeparameter -create t.15 0 4095 4096 {}} +catch {treeparameter -create t.16 0 4095 4096 {}} +catch {treeparameter -create t.17 0 4095 4096 {}} +catch {treeparameter -create t.18 0 4095 4096 {}} +catch {treeparameter -create t.19 0 4095 4096 {}} +catch {treeparameter -create t.20 0 4095 4096 {}} +catch {treeparameter -create t.21 0 4095 4096 {}} +catch {treeparameter -create t.22 0 4095 4096 {}} +catch {treeparameter -create t.23 0 4095 4096 {}} +catch {treeparameter -create t.24 0 4095 4096 {}} catch {treeparameter -create tdc.chan00 0 65534 65535 {}} catch {treeparameter -create tdc.chan01 0 65534 65535 {}} catch {treeparameter -create tdc.chan02 0 65534 65535 {}} @@ -96,108 +95,108 @@ # Tree variable definitions: -treevariable -set evb.buildWindow 16 ticks +treevariable -set evb.buildWindow 16 {} treevariable -set multiplicity.bins 512 bins treevariable -set multiplicity.cycleCount 100 cycles treevariable -set multiplicity.frequency 16000 KHz treevariable -set multiplicity.mintime 100 ns -treevariable -set xmb.enable 1 flag -treevariable -set xmb.offsets.00 0 KeV -treevariable -set xmb.offsets.01 0 KeV -treevariable -set xmb.offsets.02 0 KeV -treevariable -set xmb.offsets.03 0 KeV -treevariable -set xmb.offsets.04 0 KeV -treevariable -set xmb.offsets.05 0 KeV -treevariable -set xmb.offsets.06 0 KeV -treevariable -set xmb.offsets.07 0 KeV -treevariable -set xmb.offsets.08 0 KeV -treevariable -set xmb.offsets.09 0 KeV -treevariable -set xmb.offsets.10 0 KeV -treevariable -set xmb.offsets.11 0 KeV -treevariable -set xmb.offsets.12 0 KeV -treevariable -set xmb.offsets.13 0 KeV -treevariable -set xmb.offsets.14 0 KeV -treevariable -set xmb.offsets.15 0 KeV -treevariable -set xmb.offsets.16 0 KeV -treevariable -set xmb.offsets.17 0 KeV -treevariable -set xmb.offsets.18 0 KeV -treevariable -set xmb.offsets.19 0 KeV -treevariable -set xmb.offsets.20 0 KeV -treevariable -set xmb.offsets.21 0 KeV -treevariable -set xmb.offsets.22 0 KeV -treevariable -set xmb.offsets.23 0 KeV -treevariable -set xmb.offsets.24 0 KeV -treevariable -set xmb.offsets.25 0 KeV -treevariable -set xmb.offsets.26 0 KeV -treevariable -set xmb.offsets.27 0 KeV -treevariable -set xmb.offsets.28 0 KeV -treevariable -set xmb.offsets.29 0 KeV -treevariable -set xmb.offsets.30 0 KeV -treevariable -set xmb.offsets.31 0 KeV -treevariable -set xmb.offsets.32 0 KeV -treevariable -set xmb.offsets.33 0 KeV -treevariable -set xmb.offsets.34 0 KeV -treevariable -set xmb.offsets.35 0 KeV -treevariable -set xmb.offsets.36 0 KeV -treevariable -set xmb.offsets.37 0 KeV -treevariable -set xmb.offsets.38 0 KeV -treevariable -set xmb.offsets.39 0 KeV -treevariable -set xmb.offsets.40 0 KeV -treevariable -set xmb.offsets.41 0 KeV -treevariable -set xmb.offsets.42 0 KeV -treevariable -set xmb.offsets.43 0 KeV -treevariable -set xmb.offsets.44 0 KeV -treevariable -set xmb.offsets.45 0 KeV -treevariable -set xmb.offsets.46 0 KeV -treevariable -set xmb.offsets.47 0 KeV -treevariable -set xmb.offsets.48 0 KeV -treevariable -set xmb.offsets.49 0 KeV -treevariable -set xmb.offsets.50 0 KeV -treevariable -set xmb.offsets.51 0 KeV -treevariable -set xmb.offsets.52 0 KeV -treevariable -set xmb.offsets.53 0 KeV -treevariable -set xmb.offsets.54 0 KeV -treevariable -set xmb.offsets.55 0 KeV -treevariable -set xmb.offsets.56 0 KeV -treevariable -set xmb.offsets.57 0 KeV -treevariable -set xmb.offsets.58 0 KeV -treevariable -set xmb.offsets.59 0 KeV -treevariable -set xmb.offsets.60 0 KeV -treevariable -set xmb.offsets.61 0 KeV -treevariable -set xmb.offsets.62 0 KeV -treevariable -set xmb.offsets.63 0 KeV -treevariable -set xmb.offsets.64 0 KeV -treevariable -set xmb.offsets.65 0 KeV -treevariable -set xmb.offsets.66 0 KeV -treevariable -set xmb.offsets.67 0 KeV -treevariable -set xmb.offsets.68 0 KeV -treevariable -set xmb.offsets.69 0 KeV -treevariable -set xmb.offsets.70 0 KeV -treevariable -set xmb.offsets.71 0 KeV -treevariable -set xmb.offsets.72 0 KeV -treevariable -set xmb.offsets.73 0 KeV -treevariable -set xmb.offsets.74 0 KeV -treevariable -set xmb.offsets.75 0 KeV -treevariable -set xmb.offsets.76 0 KeV -treevariable -set xmb.offsets.77 0 KeV -treevariable -set xmb.offsets.78 0 KeV -treevariable -set xmb.offsets.79 0 KeV -treevariable -set xmb.offsets.80 0 KeV -treevariable -set xmb.offsets.81 0 KeV -treevariable -set xmb.offsets.82 0 KeV -treevariable -set xmb.offsets.83 0 KeV -treevariable -set xmb.offsets.84 0 KeV -treevariable -set xmb.offsets.85 0 KeV -treevariable -set xmb.offsets.86 0 KeV -treevariable -set xmb.offsets.87 0 KeV -treevariable -set xmb.offsets.88 0 KeV -treevariable -set xmb.offsets.89 0 KeV -treevariable -set xmb.offsets.90 0 KeV -treevariable -set xmb.offsets.91 0 KeV -treevariable -set xmb.offsets.92 0 KeV -treevariable -set xmb.offsets.93 0 KeV -treevariable -set xmb.offsets.94 0 KeV -treevariable -set xmb.offsets.95 0 KeV +treevariable -set xmb.enable 0 flag +treevariable -set xmb.offsets.00 0 {} +treevariable -set xmb.offsets.01 0 {} +treevariable -set xmb.offsets.02 0 {} +treevariable -set xmb.offsets.03 0 {} +treevariable -set xmb.offsets.04 0 {} +treevariable -set xmb.offsets.05 0 {} +treevariable -set xmb.offsets.06 0 {} +treevariable -set xmb.offsets.07 0 {} +treevariable -set xmb.offsets.08 0 {} +treevariable -set xmb.offsets.09 0 {} +treevariable -set xmb.offsets.10 0 {} +treevariable -set xmb.offsets.11 0 {} +treevariable -set xmb.offsets.12 0 {} +treevariable -set xmb.offsets.13 0 {} +treevariable -set xmb.offsets.14 0 {} +treevariable -set xmb.offsets.15 0 {} +treevariable -set xmb.offsets.16 0 {} +treevariable -set xmb.offsets.17 0 {} +treevariable -set xmb.offsets.18 0 {} +treevariable -set xmb.offsets.19 0 {} +treevariable -set xmb.offsets.20 0 {} +treevariable -set xmb.offsets.21 0 {} +treevariable -set xmb.offsets.22 0 {} +treevariable -set xmb.offsets.23 0 {} +treevariable -set xmb.offsets.24 0 {} +treevariable -set xmb.offsets.25 0 {} +treevariable -set xmb.offsets.26 0 {} +treevariable -set xmb.offsets.27 0 {} +treevariable -set xmb.offsets.28 0 {} +treevariable -set xmb.offsets.29 0 {} +treevariable -set xmb.offsets.30 0 {} +treevariable -set xmb.offsets.31 0 {} +treevariable -set xmb.offsets.32 0 {} +treevariable -set xmb.offsets.33 0 {} +treevariable -set xmb.offsets.34 0 {} +treevariable -set xmb.offsets.35 0 {} +treevariable -set xmb.offsets.36 0 {} +treevariable -set xmb.offsets.37 0 {} +treevariable -set xmb.offsets.38 0 {} +treevariable -set xmb.offsets.39 0 {} +treevariable -set xmb.offsets.40 0 {} +treevariable -set xmb.offsets.41 0 {} +treevariable -set xmb.offsets.42 0 {} +treevariable -set xmb.offsets.43 0 {} +treevariable -set xmb.offsets.44 0 {} +treevariable -set xmb.offsets.45 0 {} +treevariable -set xmb.offsets.46 0 {} +treevariable -set xmb.offsets.47 0 {} +treevariable -set xmb.offsets.48 0 {} +treevariable -set xmb.offsets.49 0 {} +treevariable -set xmb.offsets.50 0 {} +treevariable -set xmb.offsets.51 0 {} +treevariable -set xmb.offsets.52 0 {} +treevariable -set xmb.offsets.53 0 {} +treevariable -set xmb.offsets.54 0 {} +treevariable -set xmb.offsets.55 0 {} +treevariable -set xmb.offsets.56 0 {} +treevariable -set xmb.offsets.57 0 {} +treevariable -set xmb.offsets.58 0 {} +treevariable -set xmb.offsets.59 0 {} +treevariable -set xmb.offsets.60 0 {} +treevariable -set xmb.offsets.61 0 {} +treevariable -set xmb.offsets.62 0 {} +treevariable -set xmb.offsets.63 0 {} +treevariable -set xmb.offsets.64 0 {} +treevariable -set xmb.offsets.65 0 {} +treevariable -set xmb.offsets.66 0 {} +treevariable -set xmb.offsets.67 0 {} +treevariable -set xmb.offsets.68 0 {} +treevariable -set xmb.offsets.69 0 {} +treevariable -set xmb.offsets.70 0 {} +treevariable -set xmb.offsets.71 0 {} +treevariable -set xmb.offsets.72 0 {} +treevariable -set xmb.offsets.73 0 {} +treevariable -set xmb.offsets.74 0 {} +treevariable -set xmb.offsets.75 0 {} +treevariable -set xmb.offsets.76 0 {} +treevariable -set xmb.offsets.77 0 {} +treevariable -set xmb.offsets.78 0 {} +treevariable -set xmb.offsets.79 0 {} +treevariable -set xmb.offsets.80 0 {} +treevariable -set xmb.offsets.81 0 {} +treevariable -set xmb.offsets.82 0 {} +treevariable -set xmb.offsets.83 0 {} +treevariable -set xmb.offsets.84 0 {} +treevariable -set xmb.offsets.85 0 {} +treevariable -set xmb.offsets.86 0 {} +treevariable -set xmb.offsets.87 0 {} +treevariable -set xmb.offsets.88 0 {} +treevariable -set xmb.offsets.89 0 {} +treevariable -set xmb.offsets.90 0 {} +treevariable -set xmb.offsets.91 0 {} +treevariable -set xmb.offsets.92 0 {} +treevariable -set xmb.offsets.93 0 {} +treevariable -set xmb.offsets.94 0 {} +treevariable -set xmb.offsets.95 0 {} treevariable -set xmb.quadcoef.00 0 {} treevariable -set xmb.quadcoef.01 0 {} treevariable -set xmb.quadcoef.02 0 {} @@ -294,111 +293,153 @@ treevariable -set xmb.quadcoef.93 0 {} treevariable -set xmb.quadcoef.94 0 {} treevariable -set xmb.quadcoef.95 0 {} -treevariable -set xmb.slopes.00 1 KeV/Chan -treevariable -set xmb.slopes.01 1 KeV/Chan -treevariable -set xmb.slopes.02 1 KeV/Chan -treevariable -set xmb.slopes.03 1 KeV/Chan -treevariable -set xmb.slopes.04 1 KeV/Chan -treevariable -set xmb.slopes.05 1 KeV/Chan -treevariable -set xmb.slopes.06 1 KeV/Chan -treevariable -set xmb.slopes.07 1 KeV/Chan -treevariable -set xmb.slopes.08 1 KeV/Chan -treevariable -set xmb.slopes.09 1 KeV/Chan -treevariable -set xmb.slopes.10 1 KeV/Chan -treevariable -set xmb.slopes.11 1 KeV/Chan -treevariable -set xmb.slopes.12 1 KeV/Chan -treevariable -set xmb.slopes.13 1 KeV/Chan -treevariable -set xmb.slopes.14 1 KeV/Chan -treevariable -set xmb.slopes.15 1 KeV/Chan -treevariable -set xmb.slopes.16 1 KeV/Chan -treevariable -set xmb.slopes.17 1 KeV/Chan -treevariable -set xmb.slopes.18 1 KeV/Chan -treevariable -set xmb.slopes.19 1 KeV/Chan -treevariable -set xmb.slopes.20 1 KeV/Chan -treevariable -set xmb.slopes.21 1 KeV/Chan -treevariable -set xmb.slopes.22 1 KeV/Chan -treevariable -set xmb.slopes.23 1 KeV/Chan -treevariable -set xmb.slopes.24 1 KeV/Chan -treevariable -set xmb.slopes.25 1 KeV/Chan -treevariable -set xmb.slopes.26 1 KeV/Chan -treevariable -set xmb.slopes.27 1 KeV/Chan -treevariable -set xmb.slopes.28 1 KeV/Chan -treevariable -set xmb.slopes.29 1 KeV/Chan -treevariable -set xmb.slopes.30 1 KeV/Chan -treevariable -set xmb.slopes.31 1 KeV/Chan -treevariable -set xmb.slopes.32 1 KeV/Chan -treevariable -set xmb.slopes.33 1 KeV/Chan -treevariable -set xmb.slopes.34 1 KeV/Chan -treevariable -set xmb.slopes.35 1 KeV/Chan -treevariable -set xmb.slopes.36 1 KeV/Chan -treevariable -set xmb.slopes.37 1 KeV/Chan -treevariable -set xmb.slopes.38 1 KeV/Chan -treevariable -set xmb.slopes.39 1 KeV/Chan -treevariable -set xmb.slopes.40 1 KeV/Chan -treevariable -set xmb.slopes.41 1 KeV/Chan -treevariable -set xmb.slopes.42 1 KeV/Chan -treevariable -set xmb.slopes.43 1 KeV/Chan -treevariable -set xmb.slopes.44 1 KeV/Chan -treevariable -set xmb.slopes.45 1 KeV/Chan -treevariable -set xmb.slopes.46 1 KeV/Chan -treevariable -set xmb.slopes.47 1 KeV/Chan -treevariable -set xmb.slopes.48 1 KeV/Chan -treevariable -set xmb.slopes.49 1 KeV/Chan -treevariable -set xmb.slopes.50 1 KeV/Chan -treevariable -set xmb.slopes.51 1 KeV/Chan -treevariable -set xmb.slopes.52 1 KeV/Chan -treevariable -set xmb.slopes.53 1 KeV/Chan -treevariable -set xmb.slopes.54 1 KeV/Chan -treevariable -set xmb.slopes.55 1 KeV/Chan -treevariable -set xmb.slopes.56 1 KeV/Chan -treevariable -set xmb.slopes.57 1 KeV/Chan -treevariable -set xmb.slopes.58 1 KeV/Chan -treevariable -set xmb.slopes.59 1 KeV/Chan -treevariable -set xmb.slopes.60 1 KeV/Chan -treevariable -set xmb.slopes.61 1 KeV/Chan -treevariable -set xmb.slopes.62 1 KeV/Chan -treevariable -set xmb.slopes.63 1 KeV/Chan -treevariable -set xmb.slopes.64 1 KeV/Chan -treevariable -set xmb.slopes.65 1 KeV/Chan -treevariable -set xmb.slopes.66 1 KeV/Chan -treevariable -set xmb.slopes.67 1 KeV/Chan -treevariable -set xmb.slopes.68 1 KeV/Chan -treevariable -set xmb.slopes.69 1 KeV/Chan -treevariable -set xmb.slopes.70 1 KeV/Chan -treevariable -set xmb.slopes.71 1 KeV/Chan -treevariable -set xmb.slopes.72 1 KeV/Chan -treevariable -set xmb.slopes.73 1 KeV/Chan -treevariable -set xmb.slopes.74 1 KeV/Chan -treevariable -set xmb.slopes.75 1 KeV/Chan -treevariable -set xmb.slopes.76 1 KeV/Chan -treevariable -set xmb.slopes.77 1 KeV/Chan -treevariable -set xmb.slopes.78 1 KeV/Chan -treevariable -set xmb.slopes.79 1 KeV/Chan -treevariable -set xmb.slopes.80 1 KeV/Chan -treevariable -set xmb.slopes.81 1 KeV/Chan -treevariable -set xmb.slopes.82 1 KeV/Chan -treevari... [truncated message content] |
From: <ro...@us...> - 2015-02-11 12:54:25
|
Revision: 2255 http://sourceforge.net/p/nsclspectcl/code/2255 Author: ron-fox Date: 2015-02-11 12:54:23 +0000 (Wed, 11 Feb 2015) Log Message: ----------- Fix testBuildTarball to extract the version correctly from configure.ac Modified Paths: -------------- branches/SpecTcl-3.3-maintenance/testBuildTarball Modified: branches/SpecTcl-3.3-maintenance/testBuildTarball =================================================================== --- branches/SpecTcl-3.3-maintenance/testBuildTarball 2015-02-11 12:49:09 UTC (rev 2254) +++ branches/SpecTcl-3.3-maintenance/testBuildTarball 2015-02-11 12:54:23 UTC (rev 2255) @@ -3,7 +3,7 @@ rm -rf ${WORKSPACE}/sptrunk -version=`grep AM_INIT_AUTOMAKE configure.ac | cut -f2 -d" " | sed s/,//` +version=`grep AM_INIT_AUTOMAKE configure.ac | cut -f2 -d" " | sed -e s/,// | sed -e 's/)//'` rm -rf SpecTcl-${version} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-11 12:49:16
|
Revision: 2254 http://sourceforge.net/p/nsclspectcl/code/2254 Author: ron-fox Date: 2015-02-11 12:49:09 +0000 (Wed, 11 Feb 2015) Log Message: ----------- Add TCLLIBS back to LIBS in Makefile but sed out the -lieee to deal with the issues that library has being double linked. Modified Paths: -------------- trunk/main/ChangeLog trunk/main/Makefile.am trunk/main/SpecTcl/SpecTcl_Makefile.include Modified: trunk/main/ChangeLog =================================================================== --- trunk/main/ChangeLog 2015-02-09 18:26:08 UTC (rev 2253) +++ trunk/main/ChangeLog 2015-02-11 12:49:09 UTC (rev 2254) @@ -1049,3 +1049,6 @@ * Factor in the daqroot preference in finding ringselector. * Figure out if ringselector supports --non-blocking and if so turn it on. + * Add TCLLIBS back into the compilation includes but use sed to + remove the -lieee to prevent the double def of _LIB_VERSION + Modified: trunk/main/Makefile.am =================================================================== --- trunk/main/Makefile.am 2015-02-09 18:26:08 UTC (rev 2253) +++ trunk/main/Makefile.am 2015-02-11 12:49:09 UTC (rev 2254) @@ -56,7 +56,8 @@ echo X11INCLUDES=$(X11INCLUDES) >> Directories.temp echo X11LIBS =$(XLIBSW) $(MOTIF_LIBSW) -lXm -lXt -lX11 >> Directories.temp cat Directories.include >> Directories.temp - $(INSTALL_DATA) Directories.temp $(sysconfdir)/Directories.include + sed -e 's/-lieee//g' Directories.temp >Directories.edited + $(INSTALL_DATA) Directories.edited $(sysconfdir)/Directories.include $(INSTALL_DATA) LICENSE $(prefix) echo CXX=$(CXX) > CompilationRules.temp echo CC=$(CC) >> CompilationRules.temp Modified: trunk/main/SpecTcl/SpecTcl_Makefile.include =================================================================== --- trunk/main/SpecTcl/SpecTcl_Makefile.include 2015-02-09 18:26:08 UTC (rev 2253) +++ trunk/main/SpecTcl/SpecTcl_Makefile.include 2015-02-11 12:49:09 UTC (rev 2254) @@ -42,10 +42,8 @@ -lgsl -lgslcblas \ $(LIBTCLPLUS_LDFLAGS) \ $(X11LIBS) \ - -Wl,"-rpath=$(SPECLIBS)" + -Wl,"-rpath=$(SPECLIBS)" $(TCLLIBS) -# Removed: $(TCLLIBS) -# included in libtclplus and caused double defs in -lieee :-( include $(SPECETC)/CompilationRules.include This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-09 18:26:19
|
Revision: 2253 http://sourceforge.net/p/nsclspectcl/code/2253 Author: ron-fox Date: 2015-02-09 18:26:08 +0000 (Mon, 09 Feb 2015) Log Message: ----------- Good compilation of SpecTcl with position calculation. Modified Paths: -------------- branches/seetf/production/Makefile branches/seetf/production/MySpecTclApp.cpp Added Paths: ----------- branches/seetf/production/CPosition.cpp branches/seetf/production/CPosition.h Added: branches/seetf/production/CPosition.cpp =================================================================== --- branches/seetf/production/CPosition.cpp (rev 0) +++ branches/seetf/production/CPosition.cpp 2015-02-09 18:26:08 UTC (rev 2253) @@ -0,0 +1,610 @@ +/* + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of this License, + you may choose any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author to +ask for permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE +THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS +*/ +#include <config.h> +#include "CPosition.h" +#include <Parameter.h> +#include <Globals.h> +#include <TCLVariable.h> +#include <TCLInterpreter.h> +#include <Histogrammer.h> +#include <Event.h> +#include <Analyzer.h> +#include <BufferDecoder.h> + +#include <stdlib.h> + +using namespace std; + +// Implement the Cposition class. + +/*! + Construct a position calculator. This does not do any + binding of the tcl variables nor parameters as they are + not assumed to be ready to be bound: + - The Tcl variables are bound at the first OnBegin call. + - The parameters are re-bound every OnBegin call. + + \param Result (const string& [in]): + Name of the position parameter produced. + \param Param1 (const string& [in]): + Name of the first parameter that is used in the position + computation. + \param Param2 (const string& [in]): + Name of the second parameter that is used in the position + computation. + \param Scale1 (const string& [in]): + Scale factor to calibrate parameter1. + \param Offset1 (const string& [in]): + Offset to calibrate parameter 1. + \param Scale2 (const string& [in]): + Scale to calibrate parameter2. + \param Offset2 (const string& [in]): + Offset to calibrate paramteter2. + \param SumMin (const string& [in]): + Name of paramter giving minimum valid sum signal. + \param Slope (const string& [in]): + Name of the final slope parameter. + \param Offset (const string& [in]): + Name of the final offset parameter. + +*/ +CPosition::CPosition(const string& Position, + const string& Param1, const string& Param2, + const string& Scale1, const string& Offset1, + const string& Scale2, const string& Offset2, + const string& SumMin, + const string& Slope, const string& Offset) : + m_Result(Position), + m_Param1(Param1), + m_Param2(Param2), + m_pParam1(0), + m_pParam2(0), + m_Scale1Name(Scale1), + m_Scale2Name(Scale2), + m_Offset1Name(Offset1), + m_Offset2Name(Offset2), + m_SumMinName(SumMin), + m_SlopeName(Slope), + m_OffsetName(Offset), + m_fScale1(1.0), + m_fScale2(1.0), + m_fOffset1(0.0), + m_fOffset2(0.0), + m_fSumMin(1.0), + m_fSlope(1.0), + m_fOffset(0.0), + m_fBound(false) + + +{ + +} +/*! + Copy constructor, uses the Copy utility. +*/ +CPosition::CPosition(const CPosition& rhs) : + CEventProcessor(rhs) +{ + Copy(rhs); +} +/*! + Assignment... uses Copy utility. +*/ +CPosition& +CPosition::operator=(const CPosition& rhs) +{ + if(this != &rhs) { + CEventProcessor::operator=(rhs); + Copy(rhs); + } + return *this; +} +/*! + Equality comparison. This is a shallow compare. +*/ +int +CPosition::operator==(const CPosition& rhs) const +{ + return (CEventProcessor::operator==(rhs) && + (m_Result == rhs.m_Result) && + (m_Param1 == rhs.m_Param1) && + (m_Param2 == rhs.m_Param2) && + (m_pParam1 == rhs.m_pParam1) && + (m_pResult == rhs.m_pResult) && + (m_Scale1Name == rhs.m_Scale1Name) && + (m_Scale2Name == rhs.m_Scale2Name) && + (m_Offset1Name== rhs.m_Offset1Name) && + (m_Offset2Name== rhs.m_Offset2Name) && + (m_SumMinName == rhs.m_SumMinName) && + (m_SlopeName == rhs.m_SlopeName) && + (m_OffsetName == rhs.m_OffsetName) && + (m_fScale1 == rhs.m_fScale1) && + (m_fScale2 == rhs.m_fScale2) && + (m_fOffset1 == rhs.m_fOffset1) && + (m_fSumMin == rhs.m_fSumMin) && + (m_fSlope == rhs.m_fSlope) && + (m_fOffset == rhs.m_fOffset) && + (m_fBound == rhs.m_fBound)); +} +/*! + Called when the run begins. If this is the first time, + we bind the calibration variables to the member variables. + Regardless, we map the parameter names to histogramer paramters. + \param rAnalyzer (CAnalyzer& [in]): + reference to our analyzer. + \param rDecoder (CBufferDecoder& [in]): + Reference to our buffer decodeer object. + + \return Bool_t + - kfTrue - if everything worked. + - kfFalse - if there was a failure, this stops the analysis + pipeline + +*/ +Bool_t +CPosition::OnBegin (CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + + // If necessary, bind the variables: + + if(!m_fBound) { + + CTCLVariable scale1(gpInterpreter, m_Scale1Name, kfFALSE); + CTCLVariable scale2(gpInterpreter, m_Scale2Name, kfFALSE); + CTCLVariable offset1(gpInterpreter, m_Offset1Name, kfFALSE); + CTCLVariable offset2(gpInterpreter, m_Offset2Name, kfFALSE); + CTCLVariable minsum(gpInterpreter, m_SumMinName, kfFALSE); + + CTCLVariable slope(gpInterpreter, m_SlopeName, kfFALSE); + CTCLVariable offset(gpInterpreter, m_OffsetName, kfFALSE); + + // Link the variables to their associated members. + // Note that the value used for the Tcl variable initially + // is that of the bound C/C++ variable. Therefore we first + // need to get the actual value of the Tcl variable, set it + // in the variable we'll bind to it and then link the variable. + // + + m_fScale1 = GetDoubleValue(scale1, m_fScale1); + scale1.Link(&m_fScale1, TCL_LINK_DOUBLE); + + m_fScale2 = GetDoubleValue(scale2, m_fScale2); + scale2.Link(&m_fScale2, TCL_LINK_DOUBLE); + + m_fOffset1 = GetDoubleValue(offset1, m_fOffset1); + offset1.Link(&m_fOffset1, TCL_LINK_DOUBLE); + + m_fOffset2 = GetDoubleValue(offset2, m_fOffset2); + offset2.Link(&m_fOffset2, TCL_LINK_DOUBLE); + + m_fSumMin = GetDoubleValue(minsum, m_fSumMin); + minsum.Link(&m_fSumMin, TCL_LINK_DOUBLE); + + m_fSlope = GetDoubleValue(slope, m_fSlope); + slope.Link(&m_fSlope, TCL_LINK_DOUBLE); + + m_fOffset= GetDoubleValue(offset, m_fOffset); + offset.Link(&m_fOffset, TCL_LINK_DOUBLE); + + m_fBound = true; // Only need to bind first time. + } + + // Rebind the parameter names: + // Note that null paramters are possible and indicate a lack + // of desire for these values. + // + + CHistogrammer& Hist(*(CHistogrammer*)gpEventSink); + m_pParam1 = Hist.FindParameter(m_Param1); + m_pParam2 = Hist.FindParameter(m_Param2); + m_pResult = Hist.FindParameter(m_Result); + + + + return kfTRUE; +} + +/*! + Calculate the position We depend on the following member data: + - m_pResult - Pointer to the parameter describing where the + result goes. + - m_pParam1 - First parameter in the position computation, + e.g. left. + - m_pParam2 - Second parameter in the position computation, + e.g. right. + - m_fScale1, m_fOffset1 - Calibrations for param1. + - m_fScale2, m_fOffset2 - Calibrations for param2. + - m_fSumMin - Minimum required sum for the parameters. + - m_fSlope, m_fOffset - maps the range [-1.0,1.0] to + parameter channels. + + \note If any of the paramters is not defined, the computation + is disabled. + + \param pEvent (const Address_t [in]): + Pointer to the raw event (ignored). + \param rEvent (CEvent& [in/out]): + The event being built. We take the specified two parameters + as input and produce a single output parameter in this + `array.' + \param rAnalyzer (CAnalyzer& [in]): + Reference to the analyzer (ignored). + \param rDecoder (CBufferDecoder& [in]): + Reference to the buffer decoder (ignored). + + \return Bool_t + kfTRUE - It's not possible for this event processor to fail. +*/ +Bool_t +CPosition::operator() (const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + // All parameters must map to real parameters: + + if(m_pParam1 && m_pParam2 && m_pResult) { + + // Map parameter numbers to rEvent indices: + + int p1 = m_pParam1->getNumber(); + int p2 = m_pParam2->getNumber(); + int r = m_pResult->getNumber(); + + // p1, p2 must be valid: + + if(rEvent[p1].isValid() && rEvent[p2].isValid()) { + double scaled1 = ((double)rEvent[p1] + drand48())*m_fScale1 + + m_fOffset1; + double scaled2 = ((double)rEvent[p2] + drand48())*m_fScale2 + + m_fOffset2; + double sum = scaled1 + scaled2; + if(sum > m_fSumMin) { + rEvent[r] = ((scaled2 - scaled1)/sum)*m_fSlope + + m_fOffset; + } + } + } + + + // always return true: + + return kfTRUE; +} +/*! + Copy from another CPosition to *this. +*/ +void +CPosition::Copy(const CPosition& rhs) +{ + m_Result = rhs.m_Result; + m_Param1 = rhs.m_Param1; + m_Param2 = rhs.m_Param2; + + + m_pParam1 = rhs.m_pParam1; + m_pParam2 = rhs.m_pParam2; + m_pResult = rhs.m_pResult; + + m_Scale1Name = rhs.m_Scale1Name; + m_Scale2Name = rhs.m_Scale2Name; + m_Offset1Name= rhs.m_Offset1Name; + m_Offset2Name= rhs.m_Offset2Name; + + m_SumMinName = rhs.m_SumMinName; + m_SlopeName = rhs.m_SlopeName; + m_OffsetName = rhs.m_OffsetName; + + m_fScale1 = rhs.m_fScale1; + m_fScale2 = rhs.m_fScale2; + m_fOffset1 = rhs.m_fOffset1; + m_fOffset2 = rhs.m_fOffset2; + m_fSumMin = rhs.m_fSumMin; + + m_fSlope = rhs.m_fSlope; + m_fOffset = rhs.m_fOffset; + + m_fBound = rhs.m_fBound; + +} + + +/*! + This function returns the value of a TCL variable + converted to a double. If an exception was thrown + by the get or the convert (variable doesn't exist or + has a non double expression), a default is supplied. + \param var (CTCLVariable& [in]): + Reference to the variable to convert. + \param def (double [in]): + Default value for the variable. + \return double + Value of the variable or the default. +*/ +double +CPosition::GetDoubleValue(CTCLVariable& var, double def) +{ + try { + string value(var.Get()); + return var.getInterpreter()->ExprDouble(value); + } + catch (...) { + return def; + } +} Property changes on: branches/seetf/production/CPosition.cpp ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: branches/seetf/production/CPosition.h =================================================================== --- branches/seetf/production/CPosition.h (rev 0) +++ branches/seetf/production/CPosition.h 2015-02-09 18:26:08 UTC (rev 2253) @@ -0,0 +1,539 @@ +/* + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of this License, + you may choose any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author to +ask for permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE +THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS +*/ + +#ifndef __CPOSITION_H +#define __CPOSITION_H + +// Header files. + +#ifndef __EVENTPROCESSOR_H +#include <EventProcessor.h> +#endif + +#ifndef __STL_STRING +#include <string> +#define __STL_STRING +#endif + + +// Forward definitions. + +class CParameter; +class CTCLVariable; +/*! + This class calculates a position from two sides of a PPAC. + The calibrated position p position is calculated as follows: + \verbatim + + scaled1 = (param1 + rand()) * slope1 + offset1 + scaled2 = (param2 + rand()) * slope2 + offset2 + sum = (scaled1 + scaled2) + + pos = { (scaled2 - scaled1)/sum [sum > summin] + { undefined [sum <= summin] + + Where: + param1, param2 are the two raw parameters. + slope1, slope2, offset1, offset2, summin are Tcl variables. + pos is the final position parameter. + rand returns uniformly distributed random numbers in the + range [0.0, 1.0]. + + \endverbatim + + Thus for each of these event processors, there needs to be: + - A pair of raw parameter names. + - A pair of TCL calibration variables. +*/ +class CPosition : public CEventProcessor +{ + // Member data: + +private: + std::string m_Result; //!< Name of result parameter. + std::string m_Param1; //!< Name of first parameter. + std::string m_Param2; //!< Name of second parameter. + + CParameter* m_pParam1; //!< Pointer first param descript. + CParameter* m_pParam2; //!< Pointer to second param descr. + CParameter* m_pResult; + + std::string m_Scale1Name; //!< Name of tcl scale variables. + std::string m_Scale2Name; + std::string m_Offset1Name; //!< Name of tcl offset variables. + std::string m_Offset2Name; + + std::string m_SumMinName; //!< Name of min sum parameter. + + std::string m_SlopeName; //!< Name of final slope param. + std::string m_OffsetName; //!< Name of final offset name. + + double m_fScale1; //!< Current calibration scales. + double m_fScale2; + double m_fOffset1; //!< Current calibration offsets. + double m_fOffset2; + double m_fSumMin; //!< Minimum parameter sum. + + + double m_fSlope; //!< Final slope value. + double m_fOffset; //!< Final offset value. + + + bool m_fBound; //!< True if Tcl variables bound. + + // Constructors and other canonical operations. + +public: + CPosition(const std::string& Result, + const std::string& Param1, const std::string& Param2, + const std::string& Scale1, const std::string& Offset1, + const std::string& Scale2, const std::string& Offset2, + const std::string& SumMin, + const std::string& Slope, const std::string& Offset); + virtual ~CPosition() {} + + CPosition(const CPosition& rhs); + CPosition& operator=(const CPosition& rhs); + int operator==(const CPosition& rhs) const; + int operator!=(const CPosition& rhs) const { + return !operator==(rhs); + } + + + // Selectors: + +public: + std::string getResultName() const { //!< Name of result parameter. + return m_Result; + } + std::string getParam1Name() const { //!< Name of first input param. + return m_Param1; + } + std::string getParam2Name() const { //!< Name of second input param. + return m_Param2; + } + + CParameter* getResultParam() { //!< Param ptr of result param. + return m_pResult; + } + CParameter* getParam1Param() { //!< Param ptr of first param. + return m_pParam1; + } + CParameter* getParam2Param() { //!< Param ptr of second param. + return m_pParam2; + } + + std::string getScale1Name() const { //!< Name of param1 scale factor + return m_Scale1Name; + } + std::string getScale2Name()const { //!< Name of param2 scale factor. + return m_Scale2Name; + } + std::string getOffset1Name() const { //!< Name of param1 offset. + return m_Offset1Name; + } + std::string getOffset2Name() const { //!< Name of param2 offset. + return m_Offset2Name; + } + std::string getSumMinName() const { //!< Name of sum minimum param. + return m_SumMinName; + } + std::string getSlopeName() const { //!< Name of final scale factor. + return m_SlopeName; + } + std::string getOffsetName() const { //!< Name of final offset param. + return m_OffsetName; + } + + double getScale1() const { //!< Value of param 1 scale. + return m_fScale1; + } + double getScale2() const { //!< Value of param 2 scale. + return m_fScale2; + } + double getOffset1() const { //!< Value of param 1 offset. + return m_fOffset1; + } + double getOffset2() const { //!< Value of param 2 offset. + return m_fOffset2; + } + double getSumMin() const { //!< Value of minimum param sum. + return m_fSumMin; + } + double getSlope() const { //!< Value of final slope param + return m_fSlope; + } + double getOffset() const { //!< Value of final offset apram. + return m_fOffset; + } + bool isBound() const { //!< Variables bound yet? + return m_fBound; + } + + + // Mutators: + +protected: + void setResultName(const std::string& n) { + m_Result = n; + } + void setParam1Name(const std::string& n) { + m_Param1 = n; + } + void setParam2Name(const std::string& n) { + m_Param2 = n; + } + + void setParam1(CParameter* p) { + m_pParam1 = p; + } + void setParam2(CParameter* p) { + m_pParam2 = p; + } + void setResult(CParameter* p) { + m_pResult = p; + } + + void setScale1Name(const std::string& n) { + m_Scale1Name = n; + } + void setScale2Name(const std::string& n) { + m_Scale2Name = n; + } + void setOffset1Name(const std::string& n) { + m_Offset1Name = n; + } + void setOffset2Name(const std::string& n) { + m_Offset2Name =n; + } + void setSumMinName(const std::string& n) { + m_SumMinName = n; + } + void setSlopeName(const std::string& n) { + m_SlopeName = n; + } + void setOffsetName(const std::string& n) { + m_OffsetName = n; + } + + void setScale1Value(double f) { + m_fScale1 = f; + } + void setScale2Value(double f) { + m_fScale2 = f; + } + void setScale1OffsetValue(double f) { + m_fOffset1 = f; + } + void setScale2OffsetValue(double f) { + m_fOffset2 = f; + } + void setSumMinValue(double f) { + m_fSumMin = f; + } + void setSlopeValue(double f) { + m_fSlope = f; + } + void setOffsetValue(double f) { + m_fOffset = f; + } + + void setBound(bool f=true) { + m_fBound = f; + } + + + // Class operations: + +public: + virtual Bool_t OnBegin (CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); + + virtual Bool_t operator() (const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); + + // Utility functions: + +private: + void Copy(const CPosition& rhs); //!< Copy members to self. + double GetDoubleValue(CTCLVariable& rVar, double d); +}; + +#endif Property changes on: branches/seetf/production/CPosition.h ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Modified: branches/seetf/production/Makefile =================================================================== --- branches/seetf/production/Makefile 2015-02-09 12:13:15 UTC (rev 2252) +++ branches/seetf/production/Makefile 2015-02-09 18:26:08 UTC (rev 2253) @@ -15,7 +15,7 @@ # If you have any switches you need to add to the link add them below: -USERLDFLAGS= +USERLDFLAGS=-ltcl8.5 # # Append your objects to the definitions below: @@ -41,6 +41,7 @@ CV1x90Unpacker.o \ CV977Unpacker.o \ LICENCE.o \ +CPosition.o \ MySpecTclApp.o # Modified: branches/seetf/production/MySpecTclApp.cpp =================================================================== --- branches/seetf/production/MySpecTclApp.cpp 2015-02-09 12:13:15 UTC (rev 2252) +++ branches/seetf/production/MySpecTclApp.cpp 2015-02-09 18:26:08 UTC (rev 2253) @@ -36,6 +36,7 @@ #include "CRateCommand.h" #include "CRateEventProcessor.h" #include "CFitButton.h" +#include "CPosition.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -67,8 +68,32 @@ +// These event processor instances of CPosition compute PPAC positions +// for the x and y axes +CPosition ppacx("see.ppac.x", + "see.ppac.l", + "see.ppac.r", + "ppac.x.scale1", + "ppac.x.offset1", + "ppac.x.scale2", + "ppac.x.offset2", + "ppac.x.minsum", + "ppac.x.slope", + "ppac.x.offset"); + +CPosition ppacy("see.ppac.y", + "see.ppac.u", + "see.ppac.d", + "ppac.y.scale1", + "ppac.y.offset1", + "ppac.y.scale2", + "ppac.y.offset2", + "ppac.y.minsum", + "ppac.y.slope", + "ppac.y.offset"); + // Function: // void CreateAnalysisPipeline(CAnalyzer& rAnalyzer) // Operation Type: @@ -94,8 +119,12 @@ CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); - // RegisterEventProcessor(*(new CRateEventProcessor), "rate-stripchart"); + + // PPAC Positions: + RegisterEventProcessor(ppacx, "PPAC x position"); + RegisterEventProcessor(ppacy, "PPAC y position"); + } // Constructors, destructors and other replacements for compiler cannonicals: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-09 12:13:34
|
Revision: 2252 http://sourceforge.net/p/nsclspectcl/code/2252 Author: ron-fox Date: 2015-02-09 12:13:15 +0000 (Mon, 09 Feb 2015) Log Message: ----------- Initial import of the VMUSBSpecTcl skeleton Added Paths: ----------- branches/seetf/production/C785Unpacker.cpp branches/seetf/production/C785Unpacker.h branches/seetf/production/CFitButton.cpp branches/seetf/production/CFitButton.h branches/seetf/production/CHINP.cpp branches/seetf/production/CHINP.h branches/seetf/production/CLLNLUnpacker.cpp branches/seetf/production/CLLNLUnpacker.h branches/seetf/production/CMADC32Unpacker.cpp branches/seetf/production/CMADC32Unpacker.h branches/seetf/production/CMASE.cpp branches/seetf/production/CMASE.h branches/seetf/production/CModuleUnpacker.cpp branches/seetf/production/CModuleUnpacker.h branches/seetf/production/CNADC2530Unpacker.cpp branches/seetf/production/CNADC2530Unpacker.h branches/seetf/production/CPSD.cpp branches/seetf/production/CPSD.h branches/seetf/production/CParamMapCommand.cpp branches/seetf/production/CParamMapCommand.h branches/seetf/production/CRateCommand.cpp branches/seetf/production/CRateCommand.h branches/seetf/production/CRateEventProcessor.cpp branches/seetf/production/CRateEventProcessor.h branches/seetf/production/CRateEventProcssor.cpp branches/seetf/production/CRateEventProcssor.h branches/seetf/production/CRateList.cpp branches/seetf/production/CRateList.h branches/seetf/production/CRateProcessor.cpp branches/seetf/production/CRateProcessor.h branches/seetf/production/CStackMapCommand.cpp branches/seetf/production/CStackMapCommand.h branches/seetf/production/CStackUnpacker.cpp branches/seetf/production/CStackUnpacker.h branches/seetf/production/CV1729Unpacker.cpp branches/seetf/production/CV1729Unpacker.h branches/seetf/production/CV1x90Unpacker.cpp branches/seetf/production/CV1x90Unpacker.h branches/seetf/production/CV977Unpacker.cpp branches/seetf/production/CV977Unpacker.h branches/seetf/production/LICENCE.cpp branches/seetf/production/Makefile branches/seetf/production/MySpecTclApp.cpp branches/seetf/production/MySpecTclApp.h Added: branches/seetf/production/C785Unpacker.cpp =================================================================== --- branches/seetf/production/C785Unpacker.cpp (rev 0) +++ branches/seetf/production/C785Unpacker.cpp 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,171 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <config.h> +#include "C785Unpacker.h" +#include <Event.h> +#include <stdint.h> + +using namespace std; + +// Constants: + + // All data words have these bits: + +static const uint32_t ALLH_TYPEMASK(0x7000000); +static const uint32_t ALLH_TYPESHIFT(24); +static const uint32_t ALLH_GEOMASK(0xf8000000); +static const uint32_t ALLH_GEOSHIFT(27); + + // High part of header. + +static const uint32_t HDRH_CRATEMASK(0x00ff0000); +static const uint32_t HDRH_CRATESHIFT(16); + + // Low part of header. +static const uint32_t HDRL_COUNTMASK(0X3f00); +static const uint32_t HDRL_COUNTSHIFT(8); + + // High part of data: + +static const uint32_t DATAH_CHANMASK(0x3f0000); +static const uint32_t DATAH_CHANSHIFT(16); + + // Low part of data + +static const uint32_t DATAL_UNBIT(0x2000); +static const uint32_t DATAL_OVBIT(0x1000); +static const uint32_t DATAL_VBIT(0x40000); +static const uint32_t DATAL_DATAMASK(0x0fff); + + // High part of trailer:- index in event to the first unprocessed word of the event. + +static const uint32_t TRAILH_EVHIMASK(0x00ff0000); + + // Word types: + +static const uint32_t HEADER(2); +static const uint32_t DATA(0); +static const uint32_t TRAILER(4); +static const uint32_t INVALID(6); + + + +///////////////////////////////////////////////////////////////////// +// Canonicals.. + +/*! + Construction is a no-op. + +*/ +C785Unpacker::C785Unpacker() {} + +/*! + Destruction is a no-op. +*/ +C785Unpacker::~C785Unpacker() {} + +////////////////////////////////////////////////////////////////////// +// Virtual function overrides + +/*! + Perform the unpack. + - If we are not pointing to the header corresopnding to our ADC, + skip out without doing anything. + - For all data words, until we see a non data word; + extract the data -> the parameter index indicated by our parameter map. + + \param rEvent - The event we are unpacking. + \param event - References the vector containing the assembled event + (the internal segment headers have been removed). + \param offset - Index in event to our chunk. + \param pMap - Pointer to our parameter map. This contains our VSN and map of channel-> + parameter id (index in rEvent). + + \return unsigned int + \retval offset to the first word of the event not processed by this member. + + + \note - Overflow and Underflow parameters are not transferred to parameters. + \note - the data are in little-endian form. +*/ +unsigned int +C785Unpacker::operator()(CEvent& rEvent, + vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + + // Get the 'header' .. ensure that it is one and that it matches our VSN. + + unsigned long header= getLong(event, offset); + if (header == 0xffffffff) { + return offset+2; // If immed BERR skip the BERR word and give up + } + + int vsn = (header & ALLH_GEOMASK) >> ALLH_GEOSHIFT; + if(vsn != pMap->vsn) return offset; + + // Ok this is our data: + + offset += 2; // Next longword.. + + // I've seen cases where all I get is a _trailer_.. in that case + // we're done so skip the analysis: + + if (((header & ALLH_TYPEMASK) >> ALLH_TYPESHIFT) != TRAILER) { + + unsigned long datum = getLong(event, offset); + offset += 2; // skip even if its not a data long as it's a trailer then. + + while (((datum & ALLH_TYPEMASK) >> ALLH_TYPESHIFT) == DATA) { + bool underflow = (datum & DATAL_UNBIT) != 0; + bool overflow = (datum & DATAL_OVBIT) != 0; + + // Must have valid and neither of the underflow/overflow bits. + + if (!(overflow || underflow)) { + // Extract channel and the data: + + int channel = (datum & DATAH_CHANMASK) >> DATAH_CHANSHIFT; + int value = datum & DATAL_DATAMASK; + int id = pMap->map[channel]; + if (id != -1) { + rEvent[id] = value; + } + } + + datum = getLong(event, offset); + offset += 2; + } + // And damned if I havn't seen duplicated trailers as well so: + + while(((datum & ALLH_TYPEMASK) >> ALLH_TYPESHIFT) == TRAILER) { + datum = getLong(event,offset); + offset += 2; + } + offset -= 2; // Don't count the non trailer longword. + } + + // An extra 32 bits of 0xffffffff was read if not in a chain or if at + // end of chain: + + if (getLong(event, offset) == 0xffffffff) { + offset += 2; + } + + + return offset; +} Added: branches/seetf/production/C785Unpacker.h =================================================================== --- branches/seetf/production/C785Unpacker.h (rev 0) +++ branches/seetf/production/C785Unpacker.h 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,52 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __C785UNPACKER_H +#define __C785UNPACKER_H + +#ifndef __CMODULEUNPACKER_H +#include "CModuleUnpacker.h" +#endif + + + +/*! + This unpacker is responsible for unpacking CAEN 32 channel digitizers. These modules + include the CAEN V775, 785, 792, and 862 modules. These modules have a + virtual slot number. Furthermore it is possible that the readout of a specific + module may be completely supressed. Fortunately the header of a module is + quite unambiguous and this unpacker can deal with that case just fine. +*/ +class C785Unpacker : public CModuleUnpacker +{ +public: + // Canonicals: + + C785Unpacker(); + virtual ~C785Unpacker(); + + // The unpacker entry: + +public: + virtual unsigned int operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap); + + +}; + +#endif Added: branches/seetf/production/CFitButton.cpp =================================================================== --- branches/seetf/production/CFitButton.cpp (rev 0) +++ branches/seetf/production/CFitButton.cpp 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,277 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CFitButton.h" +#include "ButtonEvent.h" +#include <Xamine.h> +#include <CGaussianFit.h> +#include <CSpectrumFit.h> +#include <CFitDictionary.h> +#include <Histogrammer.h> +#include <SpecTcl.h> +#include <Spectrum.h> +#include <CFitCommand.h> +#include <TCLInterpreter.h> + +#include <clientops.h> +#include <string> + +#ifdef HAVE_STD_NAMESPACE +using namespace std; +#endif + +#include <iostream> // For debugging. + +/*! + + For now we assume we have the button box all to ourselves. + + \param pEventHandler : CXamineEventHandler* + Pointer to the xamine event handler (we register ourselvse on this). + +*/ +CFitButton::CFitButton(CXamineEventHandler* pEventHandler) +{ + // Generic Gauss fit button. + + + m_FitButtonId = 1; + ButtonDescription myButton; + myButton.button_code = m_FitButtonId; + strcpy(myButton.label, "Gauss Fit"); + myButton.type = Push; + myButton.sensitive = T; + myButton.prompter = Points; + myButton.whenavailable = In1dSpectrum; + strcpy(myButton.promptstr, "Fit limits"); // Ingored? + myButton.spectype = Oned; // I think this is ignored for this prompter + myButton.minpts = 2; + myButton.maxpts = 2; // need exactly 2 pts. + + // Xamine_DefineButton(0,0, &myButton); // Old button in case Tim needs to see. + + // The Fit Gammas button is about the same as the GaussFit button.. just + // different Id and label: + + m_GammaFitButtonId = 2; + myButton.button_code = m_GammaFitButtonId; + strcpy(myButton.label, "Fit Gammas"); + Xamine_DefineButton(0,0, &myButton); + + // The fit Neutrons button is also about the same as the guass fit button: + + m_NeutronFitButtonId = 3; + myButton.button_code = m_NeutronFitButtonId; + strcpy(myButton.label, "Fit Neutrons"); + Xamine_DefineButton(0,2, &myButton); + + // The SHOW FOM button has no prompter, and requires + // we be in a 1-d spectrum... + + m_FOMButtonId = 4; + myButton.button_code = m_FOMButtonId; + strcpy(myButton.label, "FOM"); + myButton.prompter = NoPrompt; + Xamine_DefineButton(2,0, &myButton); + + // Show all FOM button has no prompter, and no requirements + // about the current spectrum. + + m_FOMAllButtonId = 5; + myButton.button_code = m_FOMAllButtonId; + strcpy(myButton.label, "FOM All"); + myButton.whenavailable = Anytime; + Xamine_DefineButton(2,1, &myButton); + + + // Project button: + + m_projectButtonId = 6; + myButton.button_code = m_projectButtonId; + strcpy(myButton.label, "Project"); + myButton.whenavailable = In2dSpectrum; + Xamine_DefineButton(2,2, &myButton); + + pEventHandler->addButtonHandler(*this); + + + +} +/*! + The destructor does nothing for now, however note that a call to the + destructor is really really bad since at present, there's no way to + unregister us as a button event handler!! +*/ +CFitButton::~CFitButton() {} +/* + The button handler is called when \em any button in the button box + sends its message back to SpecTcl. We need to determine if we can + successfully process the message. If so return true if not, + false so that other handlers can try. + + \param event : CButtonEvent& + Reference to an object that describes the button event. + + \return Bool_t + \retval kfTRUE - we processed the event, no need for other handlers to fire. + \retval kfFALSE - we did not process the event, continue checking handlers. +*/ + +Bool_t +CFitButton::operator()(CButtonEvent& event) +{ + // If this is not our button, return false right away: + + int buttonId = event.getId(); + + // What we do depends a bit on the button that has been clicked: + + if (buttonId == m_FitButtonId | + buttonId == m_GammaFitButtonId | + buttonId == m_NeutronFitButtonId) { + + // Fits are all the same except for where the fit name comes from. + + + // Before we can fit, we need to get: + // - The name of the fit. + // - The name of the spectrum. + // - The fit points. + + PointArray pts = event.getPoints(); + string spectrum = spectrumName(event); + // Figure out the fit source depending on the actual button + // id: + + + + string fitName; + if (buttonId == m_FitButtonId) { + fitName = event.getm_sPromptedString(); + + } + if (buttonId == m_GammaFitButtonId) { + fitName = spectrum; + fitName += "-gammas"; + } + if (buttonId == m_NeutronFitButtonId) { + fitName = spectrum; + fitName += "-neutrons"; + } + + // Now we can create the fit: + + CGaussianFit* pFit = new CGaussianFit(fitName, CFitCommand::id()); + int low = pts[0].X(); + int high = pts[1].X(); + + // Danger Will Robinson.. if low==high, gsl will exit our + // program.. not likely but need to catch it because the + // game theoretcial payoff is soo sooo bad. + // + if (low == high) { + invokeScript(string("tk_messageBox -icon error -message {Both fit points have the same X positions}")); + return kfTRUE; + } + if (low > high) { + int temp = low; + low = high; + high = temp; + } + // This is in a try/catch block in case the user did the truly + // pathalogical thing of deleting the spectrum just as they + // accepted the fit ... kids these days. + // + CSpectrumFit* pSpectrumFit; + try { + pSpectrumFit = new CSpectrumFit(spectrum, + pFit->getNumber(), + low, high, *pFit); + } + catch (...) { + delete pFit; // Just abort the operation silently. + return kfTRUE; + } + + // we use the addOrReplace function of the fit dictionary: + + CFitDictionary& dict(CFitDictionary::getInstance()); + dict.addOrReplace(*pSpectrumFit); + + } + else if (buttonId == m_FOMButtonId) { + // + // We're going to invoke ShowFOM spectrum name: + // construc the script: + + string script = "ShowFOM "; + script += spectrumName(event); + + invokeScript(script); + } + else if (buttonId == m_FOMAllButtonId) { + // Report all the FOM's. + // + + invokeScript(string("ShowFOMAll")); + } + else if (buttonId == m_projectButtonId) { + // + // Invoke the projection GUI: + + string script = "Project2D "; + script += spectrumName(event); + invokeScript(script); + } + else { + return kfFALSE; // Not one of our buttons. + } + return kfTRUE; +} +// Return the spectrum name associated with a button click. +// an empty string if spectrum is not defined. +// +string +CFitButton::spectrumName(CButtonEvent& event) +{ + int bindId = event.getPromptedSpectrum(); + SpecTcl* pApi = SpecTcl::getInstance(); + CHistogrammer* pHistogrammer = pApi->GetHistogrammer(); + CSpectrum* pSpectrum = pHistogrammer->DisplayBinding(bindId-1); + string spectrumName; + if (pSpectrum) { + spectrumName = pSpectrum->getName(); + } + else { + spectrumName = ""; + } + return spectrumName; +} +// +// Invoke a Tcl script ignoring any errors that may occur in it: +// +void +CFitButton::invokeScript(string script) +{ + SpecTcl* api = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = api->getInterpreter(); + try { + pInterp->GlobalEval(script); + } + catch (...) { + } +} Added: branches/seetf/production/CFitButton.h =================================================================== --- branches/seetf/production/CFitButton.h (rev 0) +++ branches/seetf/production/CFitButton.h 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,91 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CFITBUTTON_H +#define __CFITBUTTON_H + +#ifndef __XAMINEEVENTHANDLER_H +#include <XamineEventHandler.h> // For base class. +#endif + +#ifndef __STL_STRING +#include <string> +#ifndef __STL_STRING +#define __STL_STRING +#endif +#endif + +class CButtonEvent; + +/*! + This class defines a subclass of CXamineEventHandler::CButtonHandler. + The constructor creates a set of buttons in the Xamine client + button box, which is assumed to already have been made. + - Fit Gammas - requests a 1-d point prompter and creates a fit + named <spectrumname>-gammas + - Fit Neutrons - requests a 1-d point prompter and creates a fit + named <specturmname>-neutrons + - FOM - Performs the figure of merit computation on the currently + selected spectrum (no prompter). + - FOM All - Performs the figure of merit computation on all spectra + for which it is possible and pops it up in a new toplevel so that + the user can inspect or write to file. + - Project - allows you to create a projection of the current 2-d spectrum. + + Note that this class makes use of several helper Tcl scripts that + are assumed to already be defined: + + - ShowFOM spectrumname + Shows the figure of merit computation for the currently selected spectrum. + - ShowFOMAll + shows the figure of merit computation for all spectra that are elligible for + this. + - Project2D manages the gui for 2-d projections. + +*/ +class CFitButton : public CXamineEventHandler::CButtonHandler +{ + // Member data. +private: + int m_FitButtonId; // Ids assigned to buttons. + int m_GammaFitButtonId; + int m_NeutronFitButtonId; + int m_FOMButtonId; + int m_FOMAllButtonId; + int m_projectButtonId; + + // constructors and canonicals.. note that copy-like ops are forbidden. +public: + CFitButton(CXamineEventHandler* pHandler); + virtual ~CFitButton(); +private: + CFitButton(const CFitButton& rhs); + CFitButton& operator=(const CFitButton& rhs); + int operator==(const CFitButton& rhs) const; + int operator!=(const CFitButton& rhs) const; + + // The following is called when the button is successfully used: + + virtual Bool_t operator()(CButtonEvent& event); + + STD(string) spectrumName(CButtonEvent& event); + void invokeScript(STD(string) script); + +}; + + + +#endif Added: branches/seetf/production/CHINP.cpp =================================================================== --- branches/seetf/production/CHINP.cpp (rev 0) +++ branches/seetf/production/CHINP.cpp 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,143 @@ +#include <config.h> +#include "CHINP.h" +#include <Event.h> +#include <stdint.h> +#include <TreeParameter.h> +#include <iostream> +#include <TCLVariable.h> +#include <TCLList.h> +#include <SpecTcl.h> +#include <stdlib.h> +#include <stdio.h> + +using namespace std; + +CHINP::CHINP() {} +CHINP::~CHINP() {} + +/* +** unpacker: +** when called first tack a tree parameter array +** of arrays on to the parameter map +** so that we can unpack into it. +** data looks like: +** Channel count (uint32_t) (>4095 on is an error) +** Channel tags Chipid (8bits) 0 (1bit) (channel# 4bits) +** ... +** Channel count +** tdc(32), adc(32) +** ... +** Note that when processing ADC/TDC data +** If we run off the end of the event, we just silently stop +** processing. +** +*/ +unsigned int +CHINP::operator()(CEvent& rEvent, + vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + CTreeParameterArray*** myParameters = getTree(pMap, rEvent); + + vector<uint32_t> channelIds; + uint32_t channelCount = getLong(event, offset); + offset+=2; + // + // Channel counts > 4095 are error indicators.. + // just skip the data the VMUSB can't help but read + // + if (channelCount >4095) { + cerr << "Got an error report from " << pMap->name << " " + << channelCount << endl; + channelCount &= 0xfff; + offset += channelCount*2 +1; + return offset; + } + // Stuff the channel tags into the channelIds vector + for (int i =0; i < channelCount; i++) { + channelIds.push_back(getLong(event, offset)); + offset += 2; + } + offset += 2; // Skip over the second channel count. + + // for testing we need to watch for running off the end of + // the event as we pick up adc data. + // + for (int i = 0; i < channelCount; i++) { + if (offset >= event.size()) break; + uint32_t time = getLong(event, offset); + offset += 2; + if (offset >= event.size()) break; + uint32_t e = getLong(event, offset); + offset += 2; + + uint32_t channelId = channelIds[i]; + uint32_t channel = channelId & 0x0f; + uint32_t chip = (channelId >> 5) & 0xff; + CTreeParameterArray** pChipTree = myParameters[chip-1]; + CTreeParameterArray* pEs = pChipTree[0]; + CTreeParameterArray* pTs = pChipTree[1]; + + (*pEs)[channel] = e; + (*pTs)[channel] = time; + } + + return offset; +} +/* +** Return the extra data that is the tree parameter for this +** unpacking... creating it if it does not yet exist. +** ..and binding it to the event. +*/ +CTreeParameterArray*** +CHINP::getTree(CParamMapCommand::AdcMapping* pMap, + CEvent& rEvent) +{ + if (!pMap->extraData) { + SpecTcl* api = SpecTcl::getInstance(); + CTCLInterpreter *pInterp = api->getInterpreter(); + string baseName = pMap->name; + CTCLVariable HINPChips(pInterp, "HINPChips",false); + + const char* pChipList = + HINPChips.Get(TCL_GLOBAL_ONLY, + const_cast<char*>(baseName.c_str())); + if (!pChipList) { + cerr << "HINPChips("<< baseName << ") not defined!!\n"; + exit(-1); + } + CTCLList ChipList(pInterp, pChipList); + StringArray chips; + ChipList.Split(chips); + + CTreeParameterArray*** chipArray = + new CTreeParameterArray**[chips.size()]; + pMap->extraData = chipArray; + + // Iterate over the chips making an E and T tree parameter + // array. + + for (int i =0; i < chips.size(); i++) { + char chipNumber[100]; + sprintf(chipNumber, "%02d", atoi(chips[i].c_str())); + CTreeParameterArray** teArray = new CTreeParameterArray*[2]; + chipArray[i] = teArray; + string eBaseName = baseName; + eBaseName += ".e."; + eBaseName += chipNumber; + teArray[0] = new CTreeParameterArray(eBaseName, + 14, + 16, 0); + string tBaseName = baseName; + tBaseName += ".t."; + tBaseName += chipNumber; + teArray[1] = new CTreeParameterArray(tBaseName, + 14, 16, 0); + } + + CTreeParameter::BindParameters(); + CTreeParameter::setEvent(rEvent); + } + return reinterpret_cast<CTreeParameterArray***>(pMap->extraData); +} Added: branches/seetf/production/CHINP.h =================================================================== --- branches/seetf/production/CHINP.h (rev 0) +++ branches/seetf/production/CHINP.h 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,35 @@ +/*! + Unpacker for XLM/HINP version +*/ +#ifndef __CHINP_H +#define __CHINP_H + +#ifndef __CMODULEUNPACKER_H +#include "CModuleUnpacker.h" +#endif + +class CTreeParameterArray; + +class CHINP : public CModuleUnpacker +{ +public: + // Canonicals: + + CHINP(); + virtual ~CHINP(); + + // The unpacker entry: + +public: + virtual unsigned int operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap); + + +private: + CTreeParameterArray*** getTree(CParamMapCommand::AdcMapping* pMap, + CEvent& rEvent); +}; + +#endif Added: branches/seetf/production/CLLNLUnpacker.cpp =================================================================== --- branches/seetf/production/CLLNLUnpacker.cpp (rev 0) +++ branches/seetf/production/CLLNLUnpacker.cpp 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,356 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CLLNLUnpacker.h" +#include "CParamMapCommand.h" +#include <Event.h> +#include <Analyzer.h> +#include <TCLAnalyzer.h> +#include <BufferDecoder.h> +#include <EventFormatError.h> + +// Constants: + +static const uint16_t LengthMask(0x0fff); +static const uint16_t ContinuedMask(0x1000); +// CAEN definitions. + + // All data words have these bits: + +static const uint32_t ALLH_TYPEMASK(0x7000000); +static const uint32_t ALLH_TYPESHIFT(24); +static const uint32_t ALLH_GEOMASK(0xf8000000); +static const uint32_t ALLH_GEOSHIFT(27); + + // High part of header. + +static const uint32_t HDRH_CRATEMASK(0x00ff0000); +static const uint32_t HDRH_CRATESHIFT(16); + + // Low part of header. + +static const uint32_t HDRL_COUNTMASK(0X3f00); +static const uint32_t HDRL_COUNTSHIFT(8); + + // High part of data: + +static const uint32_t DATAH_CHANMASK(0x3f0000); +static const uint32_t DATAH_CHANSHIFT(16); + + // Low part of data + +static const uint32_t DATAL_UNBIT(0x2000); +static const uint32_t DATAL_OVBIT(0x1000); +static const uint32_t DATAL_VBIT(0x40000); +static const uint32_t DATAL_DATAMASK(0x0fff); + + // High part of trailer: + +static const uint32_t TRAILH_EVHIMASK(0x00ff0000); + + // Word types: + +static const uint32_t HEADER(2); +static const uint32_t DATA(0); +static const uint32_t TRAILER(4); +static const uint32_t INVALID(6); + + +/*! + Construct the unpacker. The initial state is...well Initial... +*/ +CLLNLUnpacker::CLLNLUnpacker() : + m_state(Initial), + m_size(0) +{ +} +/*! + Dont' need anything for the destructor: +*/ +CLLNLUnpacker::~CLLNLUnpacker() +{ +} +/*! + Copy constructor... just copy the member data. +*/ +CLLNLUnpacker::CLLNLUnpacker(const CLLNLUnpacker& rhs) : + CEventProcessor(rhs), + m_state(rhs.m_state), + m_event(rhs.m_event), + m_size(rhs.m_size) +{ +} + +/*! + Assignment.. not much different than copy construction. +*/ +CLLNLUnpacker& +CLLNLUnpacker::operator=(const CLLNLUnpacker& rhs) +{ + if (this != &rhs) { + CEventProcessor::operator=(rhs); + m_state = rhs.m_state; + m_event = rhs.m_event; + m_size = rhs.m_size; + } + return *this; +} +/*! + Equality if all members are identical: +*/ +int +CLLNLUnpacker::operator==(const CLLNLUnpacker& rhs) const +{ + return (CEventProcessor::operator==(rhs) && + (m_state == rhs.m_state) && + (m_event == rhs.m_event) && + (m_size == rhs.m_size)); + +} +int +CLLNLUnpacker::operator!=(const CLLNLUnpacker& rhs) const +{ + return !(*this == rhs); +} + +/*! + The unpacker. Most of the detail about this is described in the class + header. +*/ +Bool_t +CLLNLUnpacker::operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + UInt_t nWords = 0; // This will be tallied as we go. + CTclAnalyzer& analyzer(dynamic_cast<CTclAnalyzer&>(rAnalyzer)); + TranslatorPointer<UShort_t> p(*(rDecoder.getBufferTranslator()), pEvent); + CTclAnalyzer & rAna((CTclAnalyzer&)rAnalyzer); + + // What we do next depends on the state: + + switch (m_state) { + case Initial: + fetchSuperEvent(p); + m_state = Internal; // Want it to fall through to unpack. + case Internal: + unpackModule(rEvent); + break; // Don't want to fall through for exception. + default: + throw CEventFormatError(static_cast<int>(CEventFormatError::knBadPacketContents), + "Invalid state in CLLNLUnpacker::operator()"); + } + + // If the super event is empty we've finished the super event. + // otherwise we still have a way to go: + + if (m_event.empty()) { + rAna.SetEventSize(m_size*sizeof(uint16_t)); + m_state = Initial; // Need an event header next. + } + else { + rAna.entityNotDone(); // Don't let analyze decrement entity count. + rAna.SetEventSize(0); // Don't advance pointers until the last chunk. + } + return kfTRUE; + +} + +/////////////////////////////////////////////////////////////// +//////////////////// Utility functions; /////////////////////// +/////////////////////////////////////////////////////////////// + + +/* + Fetch a super event from the buffer. A super event is defined + as all the event fragments in a full event... a VMUSB event. + this can come in muliple 2Kword chunks. +*/ +void +CLLNLUnpacker::fetchSuperEvent(TranslatorPointer<UShort_t>& p) +{ + // We're going to eat up the delimiters so the first thing should + // be the event header. + // + m_size = 0; + int fragments = 0; + + // Fetch the first header: + bool more = true; // force the first loop pass. + uint16_t header; + uint16_t fragmentSize; + + + while (more) { + header = *p++; + fragmentSize = header & LengthMask; + more = (header & ContinuedMask) != 0; + m_size += fragmentSize + 1;; + fragments++; + + // Copy out a single event fragment. + // Since Jan has decided to put 0xffff after each BERR + // terminating block we need to copy out a 16 bit word at a time. + // + + while (fragmentSize) { + m_event.push_back(*p++); + fragmentSize--; + } + } +} + +// Utility functions for longs in CAEN data: + +uint32_t getType(uint32_t value) { + return (value & ALLH_TYPEMASK) >> ALLH_TYPESHIFT; +} +bool isHeader(uint32_t value) +{ + return getType(value) == HEADER; +} +/* + We just consume longwords in the m_event until we have + either emptied it or analyzed a module. + It is possible for there to be no data to analyze (all invalids). +*/ + +void +CLLNLUnpacker::unpackModule(CEvent& rEvent) +{ + + // We're going to try to do this by only paying attention + // to the data words: + + // We're going to get data until we have a non datum + // because I don't trust the CAEN module channel count. It has let me + // down before. + // + + + CParamMapCommand::ParameterMap& theMap(CParamMapCommand::getMap()); + uint32_t datum = getGoodl(); + uint32_t type = getType(datum); + int slot = (datum & ALLH_GEOMASK) >> ALLH_GEOSHIFT; + // + // Lowest geo is 3 hard coded to get around Jtec issues + // + if (slot < 3) { +#ifdef REPORT_BAD_EVENTS + cerr << "slot num too small " << dec << slot << endl; +#endif + m_event.clear(); + return; + } + while ((type == DATA) && (!m_event.empty())) { + + + int channel = (datum & DATAH_CHANMASK) >> DATAH_CHANSHIFT; + int value = (datum & DATAL_DATAMASK); + bool overflow = (datum & DATAL_OVBIT) != 0; + bool underflow= (datum & DATAL_UNBIT) != 0; + bool valid = (datum& DATAL_VBIT) != 0; + + if (channel > 31) { +#ifdef REPORT_BAD_EVENTS + cerr << dec << "Bad channel number: " << hex << datum + << dec << " " << channel << " " << value << endl; +#endif + // When we see this what appears to be happening is that + // the top 16 bits got dropped...in that case, + // The top 16 bits are likley the bottom 16 bit of + // the next datum...so push that into the front and + // see if we can keep analyzing: + + if (!m_event.empty()) { + uint16_t nextlow = (datum >> 16) & 0xffff; + m_event.push_front(nextlow); + } + return; + } + if (theMap.size() > slot) { // Map must have the slot. + int paramno = theMap[slot][channel]; + if ((paramno >= 0) && + (!overflow) && (!underflow) && valid) + rEvent[paramno] = value; + } + if (!m_event.empty()) { + datum = getGoodl(); // This is ok since there should be a trailer. + type = getType(datum); + // If the slot changed... then we put the data back and + // break ... + int newslot = (datum & ALLH_GEOMASK) >> ALLH_GEOSHIFT; + if (newslot != slot) { + m_event.push_front(datum); + break; + } + } + } +} + +/* +** Utilties to get at the super event +** peekw - gets the next word without removing it. +** getw - gets the next word destructively +** getl - gets the next longword destructively. +*/ +uint16_t +CLLNLUnpacker::peekw() { + return m_event.front(); +} +uint16_t +CLLNLUnpacker::getw() +{ + if (m_event.empty()) { + return 0xffff; + } + uint16_t result = m_event.front(); + m_event.pop_front(); + return result; +} +uint32_t +CLLNLUnpacker::getl() +{ + uint32_t result; + result = getw() | ((uint32_t)getw() << 16); // Litle endian data. + return result; +} +uint32_t +CLLNLUnpacker::getGoodl() +{ + union { + uint16_t words[2]; + uint32_t Long; + } result; + result.Long =0; + int goodwords = 0; + + while (!m_event.empty() && (goodwords < 2)) { + uint16_t item = getw(); + if (item != 0xffff) { + result.words[goodwords] = item; + goodwords++; + } + } + if (goodwords < 2) { + return 0xffffffff; + } + else { + return result.Long; + } +} Added: branches/seetf/production/CLLNLUnpacker.h =================================================================== --- branches/seetf/production/CLLNLUnpacker.h (rev 0) +++ branches/seetf/production/CLLNLUnpacker.h 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,152 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CLLNLUNPACKER_H +#define __CLLNLUNPACKER_h + +#ifndef __EVENTPROCESSOR_H +#include <EventProcessor.h> +#endif + +#ifndef __TRANSLATORPOINTER_H +#include <TranslatorPointer.h> +#endif + + +#ifndef __STL_LIST +#include <list> +#ifndef __STL_LIST +#define __STL_LIST +#endif +#endif + + +#ifndef __CRT_STDINT +#include <stdint.h> +#ifndef __CRT_STDINT +#define __CRT_STDINT +#endif +#endif + +/*! + This class unpacks data from the LLNL neutron data taking system + into parameters. Events have a format that is described in + the VM-USB manual at about page 29, and is reproduced here. + Events come in fragments that are at most 2K words long. + A fragment has a header that looks like this: +\verbatim + 15-13 12 11 - 0 + +-----------+-------------+--------------------+ + | stackid | continued | fragment_length | + +-----------+-------------+--------------------+ + +\endverbatim + Where: + - stackid is the id of the stack that produced the event. For us this is + always 2. + - continued indicates this is not the last fragment of the event. + - fragment_length is the number of 16 bit words in the event. + + Following each event fragment is a word of 0x5555, that is not counted + in the fragment_length. + + The LLNL Neutron data is essentially a singles data taking system. Each + detector has an energy and TAC singal, but no coincidences between detectors + are not meaningful. Data taking, however will lump the data from several + triggers into a single VM-USB event for efficiency sake... it is very possible, + therefore, that a VMUSB event will contain data from the same adc channels more + than once, in fact we are hoping it will. + + Processing therefore follows a state machine. + States are: +\verbatim + Initial - We don't know the length of the current fragment. the next word + will either be the 0x5555 (invalid header for us since our stack id + is 2), or a fragment header. We extract the fragment length + and enter the Internal state. + Internal- We are in the middle of an event fragment. In this state, the next + longword should be the header of an ADC. We unpack ADC and there are + three potential cases: + o ADC falls completely within the event fragment, we remain in the + Internal state. + o ADC completes the event fragment, we enter the Initial state. + o ADC Spans the event fragment boundary. We skip the 0x5555, decode + the next fragment length and continue processing the event...the event + end condition will then be one of the previous 2 cases (since a single + ADC header/data/trailer is at most 34longs it will not require more + than the end of one fragment and the beginning of another. + + We have a nasty side issue to deal with.. That is that the number of events +in the buffer header is really a bit of a fake. The number of events listed in the +buffer header is actually the number of VM-USB events, and we are going +to process more events than that.. given how we operate. We are therefore +going to use a feature of SpecTcl-3.2 that is not available in earlier versions. +SpecTcl-3.2 will add a member function to CAnalyzer called: +entityNotDone(). We will invoke this for every event until we reach the +end of a full event (that is the end of a segment with the continuation bit +not set). This will prevent the analyzer from decrementing the event count +which would make us analyze too little of the buffer. + +\endverbatim + + */ +class CLLNLUnpacker : public CEventProcessor +{ + // Private data types. + +private: + typedef enum _UnpackState { + Initial, + Internal + } UnpackState; + + // member data: +private: + UnpackState m_state; // Current state of unpacker. + STD(list)<uint16_t> m_event; // Super event data. + UInt_t m_size; // Full size of superevent (words). + + +public: + // Canonicals: + CLLNLUnpacker(); + CLLNLUnpacker(const CLLNLUnpacker& rhs); + virtual ~CLLNLUnpacker(); + + CLLNLUnpacker& operator=(const CLLNLUnpacker& rhs); + int operator==(const CLLNLUnpacker& rhs) const; + int operator!=(const CLLNLUnpacker& rhs) const; + + // Virtual overrides: + + virtual Bool_t operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); + + // Utilities: + +private: + void fetchSuperEvent(TranslatorPointer<UShort_t>& p); + void unpackModule( CEvent& rEvent); + uint16_t peekw(); + uint16_t getw(); + uint32_t getl(); + uint32_t getGoodl(); + +}; + +#endif Added: branches/seetf/production/CMADC32Unpacker.cpp =================================================================== --- branches/seetf/production/CMADC32Unpacker.cpp (rev 0) +++ branches/seetf/production/CMADC32Unpacker.cpp 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,172 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <config.h> +#include "CMADC32Unpacker.h" +#include <Event.h> +#include <stdint.h> + +using namespace std; + +// Constants + +// All longwords have a type in the top two bits: + +static const uint32_t ALL_TYPEMASK(0xc0000000); +static const uint32_t ALL_TYPESHFT(30); + +static const uint32_t TYPE_HEADER(1); +static const uint32_t TYPE_DATA(0); +static const uint32_t TYPE_TRAILER(3); + +// Fields in the headers: + +static const uint32_t HDR_COUNTMASK(0x7ff); + +static const uint32_t HDR_ERRORMASK(0x800); // Buffer overflow. +static const uint32_t HDR_ERRORSHFT(12); + +static const uint32_t HDR_IDMASK(0xff0000); +static const uint32_t HDR_IDSHFT(16); + +// Fields in the data words: + +static const uint32_t DATA_VALUEMASK(0x1fff); + +static const uint32_t DATA_ISOVERFLOW(0x4000); + +static const uint32_t DATA_CHANNELMASK(0x1f0000); +static const uint32_t DATA_CHANNELSHFT(16); + +static const uint32_t DATA_ISPAD(0x04000000); + +// Fields in the trailer. + +static const uint32_t TRAILER_COUNTMASK(0x3fffffff); // trigger count or timestamp counter. + +///////////////////////////////////////////////////////////////////////////// +// Canonical functions. +// + +/*! + Constrution is a no-op. +*/ +CMADC32Unpacker::CMADC32Unpacker() +{ +} + +/*! + Destruction is a no-op. +*/ +CMADC32Unpacker::~CMADC32Unpacker() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////// +// Virtual function overrides. + +/*! + Perform the unpack. + - If the offset does not 'point' to a header corresponding to our ADC, + return without advancing the offset. + - For all data words, extract the channel number and parameter value until we + see a non-data word. For now we suppress overflows. + - For the trailer, the count field goes in parameter number 32 (numbered from 0). + + \param rEvent - The event we are unpacking. + \param event - References the vector containing the assembled event + (the internal segment headers have been removed). + \param offset - Index in event to our chunk. + \param pMap - Pointer to our parameter map. This contains our VSN and map of channel-> + parameter id (index in rEvent). + + \return unsigned int + \retval offset to the first word of the event not processed by this member. + + + \note - the data are in little-endian form. + \note - in single event mode, buffer overflows are not possible so we ignore the + header error flag. +*/ +unsigned int +CMADC32Unpacker::operator()(CEvent& rEvent, + vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + + // For now, the MADC and VM-usb are not cooperating on + // ending the event on BERR. For each BERR 'transfer' the + // VM-USB puts a 16 bit word of 0xffff in the event. + // we need to ensure that we'll skip these. + // + // Get the 'header' and be sure it actually is a header and for our module id. + + uint32_t header = getLong(event, offset); + + if (header == 0xffffffff) { // ADC had no data there will be just the two words of 0xffffffff + return offset + 2; + } + + + uint32_t type = (header & ALL_TYPEMASK) >> ALL_TYPESHFT; + if (type != TYPE_HEADER) return offset; + + int longsRead = 1; // Count the longwords processed: + + int id = (header & HDR_IDMASK) >> HDR_IDSHFT; + if (id != pMap->vsn) return offset; + + // We've established this is our data. + // We're going to use the trailer to terminate so we don't need the + // conversion count field of the header. + + offset += 2; + unsigned long datum = getLong(event, offset); + longsRead++; + offset += 2; + while (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_DATA) { + bool overflow = (datum & DATA_ISOVERFLOW) != 0; + if (!overflow) { + int channel = (datum & DATA_CHANNELMASK) >> DATA_CHANNELSHFT; + int value = datum & DATA_VALUEMASK; + int id = pMap->map[channel]; + if (id != -1) { + rEvent[id] = value; + } + } + datum = getLong(event, offset); + longsRead++; + offset += 2; + } + // The datum should be the trailer.. verify this.. If so, + // then save the count field ans parameter 32. + + if (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_TRAILER) { + uint32_t value = datum & TRAILER_COUNTMASK; + int id = pMap->map[32]; + if (id != -1) { + rEvent[id] = value; + } + } + else { + longsRead--; // Really should not happen!! + } + + // There will be a 0xffffffff longword for the BERR at the end of the + // readout. + + return offset + 2; +} Added: branches/seetf/production/CMADC32Unpacker.h =================================================================== --- branches/seetf/production/CMADC32Unpacker.h (rev 0) +++ branches/seetf/production/CMADC32Unpacker.h 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,58 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CMADC32UNPACKER_H +#define __CMADC32UNPACKER_H + +#ifndef __CMODULEUNPACKER_H +#include "CModuleUnpacker.h" +#endif + + +/*! + This module is responsible for unpacking the Mesytec MADC-32 32 channel ADC. + These modules have a virtual slot number. It is therefore possible to + to do perfect matching on the data stream.. and to deal with complete supression + of the module in the data stream. + + One wrinkle is that the module actually recognized 33 channels. Channel 0-31 + are the conversions of the various channels of the ADC module. Channel 32 is + the timestamp/event-number. + + this allows the user to create strip charts of something vs time (e.g. counts of + hits in some place) +*/ +class CMADC32Unpacker : public CModuleUnpacker +{ + // canonicals: +public: + CMADC32Unpacker(); + virtual ~CMADC32Unpacker(); + + // The unpacker entry: + +public: + virtual unsigned int operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap); + + + +}; + + +#endif Added: branches/seetf/production/CMASE.cpp =================================================================== --- branches/seetf/production/CMASE.cpp (rev 0) +++ branches/seetf/production/CMASE.cpp 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,326 @@ + +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <config.h> +#include "CMASE.h" + +#include <Event.h> +#include <TreeParameter.h> +#include <stdint.h> +#include <iostream> +#include <string.h> +#include <SpecTcl.h> +#include <Parameter.h> +#include <TCLInterpreter.h> +#include <TCLVariable.h> +#include <TCLList.h> +#include <stdio.h> + +using std::vector; +using std::string; +using std::cerr; + +// Assumption: Each CHB is fully populated with 32 channels: + +static const int CHB_CHANNELS = 32; + + + +//////////////////////////////////////////////////////////////////////////// +// Implemented canonicals. +// +/** + * Construction is a no-op for now. + */ +CMASE::CMASE() : + m_state(CMASE::initial), + m_longsRemaining(0) + {} +/** + * Destruction is a chain to the base class: + */ +CMASE::~CMASE() {} + +/** + * Unpack the data from a Mase packet. The structure of this + * packet is: + * LongwordCount + * Channel Designator + * Channel Values.. + * + * Channel Designator is divided in bytes where, from low to high, + * Byte 0 = COB number. + * Byte 1 = CHB number. + * Byte 2 = Channel number + * Byte 3 = Trigger number(?). + * Channel values contain a time in the least significant 16 bits and + * energy in the most significant 16 bits. + * + * @param rEvent output Parameter 'array'. + * @param event Vector of words that make up the event. + * @param offset Offset to the first 16 bit word of our event. + * @param pMap Our mapping data. note that we will use our extension + * creating it if required. + * @return unsigned int + * @retval offset to the first unused word. + */ +unsigned int +CMASE::operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + + COBVector& trees = getInfo(pMap); + // + // In the initial state we need to get the number of words + // in the block of triggers we have..then transition to the internal state + // where we remain until the end of that block is encountered. + // + + int goodsize = 0; + + if (m_state == initial) { + + int words = getLong(event, offset); + offset += 2; + + + if (words == 0) { // Empty mase event. + return offset; + } +//02/16/2001 -- SH : no extra pointer.... +// words = getLong(event, offset); // Read twice! +// offset += 2; + + +// cout << "2nd w " << words << "\t"; + + m_longsRemaining = words; + m_state = internal; +//02/16/2001 -- SH : no extra pointer.... +// m_longsRemaining--; // Size is self inclusive. + + } + bool haveTriggerNumber(false); // Process until triggers no longer are the same as + int triggerNumber(-1); // this trigger.... + + while ((m_longsRemaining > 0) && (offset < event.size())) { + + int chDesignator = getLong(event, offset); + offset += 2; + m_longsRemaining--; + + int chValues = getLong(event, offset); + offset += 2; + m_longsRemaining--; + + + int chan = chDesignator & 0xff; + int chb = (chDesignator >> 8) & 0xff; + int cob = (chDesignator >> 16) & 0xff; + + int trigger = (chDesignator >> 24) & 0xff; + + int t = chValues & 0xffff; // For when we use the times.q + int e = (chValues >> 16) & 0xffff; + + + //printf("0x%08x\t",chDesignator); + //printf("0x%08x\n",chValues); + + if (m_longsRemaining < 0) { + throw string("Got an incomplete MASE event: channel designator without value e.g."); + } + +// if (haveTriggerNumber && (trigger != triggerNumber)) { +// // This pair is part of the next event: +// +//// cout << "Different trigger number" << endl; +// +// m_longsRemaining += 2; +// return offset - 4; +// } +// else { +// triggerNumber = trigger; +// haveTriggerNumber = true; +// } + + // get the tree parameter vector.. or ignore the data if not + // defined. + + if (cob < trees.size()) { + CHBVector* pCHB = trees[cob]; + if(chb < pCHB->size()) { + pchbParams pTree = (*pCHB)[chb]; + + // Channel numbers are gauranteed to be < 32 and each tree param array + // is 32 chans long so: + + (*(pTree->pEnergies))[chan] = e; + (*(pTree->pTimes))[chan] = t; + } + } + + + + } + + // If we fell through the loop we're done with this block of triggers too: + + m_state = initial; + return offset; +} + + + +///////////////////////////////////////////////////////////////////////////////////////////////////// +// Private utilities +// +// These are all related to creating/retrieving the mappings between COB/CHB/Channel and +// parameters in SpecTcl. +// + + +/** + * Get the parameter mapping information, or create it and link it to the + * parameter mapping structure if it does not yet exist. + * @param pMap - parameter mapping structure for this module. + */ + +CMASE::COBVector& +CMASE::getInfo(CParamMapCommand::AdcMapping* pMap) +{ + // If the mapping does not yet exist, create it and set it: + + if (pMap->extraData == 0) { + COBVector* parameters = createCOBVector(pMap->name); + pMap->extraData = parameters; + CTreeParameter::BindParameters(); // Also need to bind the new tree parameters to parameter ids. + } + return *reinterpret_cast<COBVector*>(pMap->extraData); +} +/** + * Create the COB vector.. this requires that we fetch the + * values of our maseCOBCount and maseCHBCounts Tcl arrays. + * these will be sensible since otherwise the setup will have failed grossly and we won't + * get called (I hope). + * @param name - Base name for the parameters. + */ +CMASE::COBVector* +CMASE::createCOBVector(string baseName) +{ + COBVector* pVector = new COBVector; + + // retrieve and decode the mase arrays: + + SpecTcl* api = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = api->getInterpreter(); + + // Figure out how many COB's there are. + + CTCLVariable maseCOBCount("maseCOBCount", false); + maseCOBCount.Bind(*pInterp); + const char* pCOBCount = maseCOBCount.Get(TCL_GLOBAL_ONLY, + const_cast<char*>(baseName.c_str())); + if (!pCOBCount) { + cerr << "ERROR - SpecTcl misconfigured. CMASE not able to get maseCOBCount(" + << baseName << ") from TCL\n"; + exit(-1); + } + int cobCount = atoi(pCOBCount); + + // Get an array of CHB counts for each COB: + + CTCLVariable maseCHBCounts("maseCHBCounts", false); + maseCHBCounts.Bind(*pInterp); + const char* pCHBCounts = maseCHBCounts.Get(TCL_GLOBAL_ONLY, + const_cast<char*>(baseName.c_str())); + if(!pCHBCounts) { + cerr << "ERROR - SpecTcl misconfigured CMASE not able to get maseCHBCounts(" + << baseName << ") from Tcl\n"; + exit(-1); + } + CTCLList maseCHBCountList(pInterp, pCHBCounts); + StringArray maseCHBCountArray; + maseCHBCountList.Split(maseCHBCountArray); + + + // Ok now create each CHB vector .we'll just decode the chb count as we go: + + for (int cob = 0; cob < cobCount; cob++) { + int chbCount = atoi(maseCHBCountArray[cob].c_str()); + pVector->push_back(createCHBVector(baseName, cob, chbCount)); + } + + return pVector; +} + +/** + * Create a vector of the parameterse for a single COB. This is a vector + * of CHB's each with 32 channels. The names of these parameters + * are basename.cobNumber.chbnumber.0..31 + * + * @param basename - The base parameter name. + * @param cobNumber - Number of the COB for which we're creating the CHB + * parameters + * @param chbCount - Number of CHB's (each with 32 channels) in this COB. + * @return CHBVector* + * @retval A vector of 32 channel tree vectors. + * + */ +CMASE::CHBVector* +CMASE::createCHBVector(string basename, int cobNumber, int chbCount) +{ + // Encode the first part of the parameter name: + + char cob[5]; // Should be more than enough. + sprintf(cob, "%02d", cobNumber); + string parameterBase = basename; + parameterBase += '.'; + parameterBase += cob; + parameterBase += '.'; + + // + // + CHBVector* pResult = new CHBVector; + + for (int chb =0; chb < chbCount; chb++) { + char chbNumber[100]; + sprintf(chbNumber, "%02d.e", chb); + string eTreeName = parameterBase; + eTreeName += chbNumber; + string tTreeName = parameterBase; + sprintf(chbNumber, "%02d.t", chb); + tTreeName += chbNumber; + + CTreeParameterArray *pEArray = new CTreeParameterArray(eTreeName, + 8192, + 32, + 0); + CTreeParameterArray *pTArray = new CTreeParameterArray(tTreeName, + 8192, 32, 0); + pchbParams pParams = new chbParams; + pParams->pEnergies = pEArray; + pParams->pTimes = pTArray; + + // have to bind it too.. + + pResult->push_back(pParams); + } + + return pResult; +} Added: branches/seetf/production/CMASE.h =================================================================== --- branches/seetf/production/CMASE.h (rev 0) +++ branches/seetf/production/CMASE.h 2015-02-09 12:13:15 UTC (rev 2252) @@ -0,0 +1,115 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2005. + + You may use this software under the terms of the GNU public license + (GPL). The terms of this license are described at: + + http://www.gnu.org/licenses/gpl.txt + + Author: + Ron Fox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + + +#ifndef __CMASE_H +#define __CMASE_H + + +#ifndef __CMODULEUNPACKER_H +#include <CModuleUnpacker.h> +#endif + + +#ifndef __CPARAMMAPCOMMAND_H +#include "CParamMapCommand.h" +#endif + + +#ifndef __STL_VECTOR +#include <vector> +#ifndef __STL_VECTOR +#define __STL_VECTOR +#endif +#endif + + + +#ifndef __CRT_STDINT_H +#include <stdint.h> +#ifndef __CRT_STDINT_H +#define __CRT_STDINT_H +#endif +#endif + +// Forward definitions. + +class CEvent; +class CTreeParameterArray; +class CTCLInterpreter; + + +/*! + This class unpacks data from the CAENV1x90 TDC. + In this case the mapping is tacked on to the + mapping structure when we first seen an event. + to do that we use: + - The fact that the basename is the name in the mapping struct. + - The tcl global maseCOBCount(basename) is the number of COB boards in this module. + - The tcl global maseCHBCounts(mase) are the number of CHB boards in this module. + - Each CHB board has 32 channel all of which are assumed to be connected. +*/ +class CMASE : public CModuleUnpacker +{ +private: + // internal data structures/typedefs: + + typedef struct _chbParams { + CTreeParameterArray* pEnergies; + CTreeParameterArray* pTimes; + } chbParams, *pchbParams; + typedef std::vector<pchbParams> CHBVector; // Vector of tree parameter arrays. + typedef std::vector<CHBVector*> COBVector; // Vector of COBs. + typedef enum _state { + initial, // First words are size field.s + internal // First words are data. + } state; + + // Internal data: +private: + state m_state; + uint32_t m_longsRemaining; +public: + // Supported anonicals. + + CMASE(); + virtual ~CMASE(); + +private: + // unsupported canonicals. + + CMASE(const CMASE& rhs); + CMASE& operator=(const CMASE& rhs); + int operator==(const CMASE& rhs) const; + int operator!=(const CMASE& rhs) const; + + // Implementing the module Unpacker interface: +public: + virtual unsigned int operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap); + + // private utilitye functions: + +private: + COBVector& getInfo(CParamMapCommand::AdcMapping* pMap); + CO... [truncated message content] |
From: <ro...@us...> - 2015-02-04 20:38:02
|
Revision: 2251 http://sourceforge.net/p/nsclspectcl/code/2251 Author: ron-fox Date: 2015-02-04 20:38:00 +0000 (Wed, 04 Feb 2015) Log Message: ----------- Tag official release of SpecTcl 3.4 (February 2015). Added Paths: ----------- tags/SpecTcl-3.4-004/ Index: tags/SpecTcl-3.4-004 =================================================================== --- trunk/main 2015-02-03 19:46:48 UTC (rev 2244) +++ tags/SpecTcl-3.4-004 2015-02-04 20:38:00 UTC (rev 2251) Property changes on: tags/SpecTcl-3.4-004 ___________________________________________________________________ Added: svn:mergeinfo ## -0,0 +1,6 ## +/branches/3.3-007-dev:1983-1986 +/branches/3.3-008-dev:1987-1996 +/branches/3.3-009-development:2000-2014 +/branches/SpecTcl-3.3-010-development:2016-2031 +/branches/SpecTcl-3.3-013:2051-2061 +/tags/SpecTcl-3.3-013-premerge:2062-2063 \ No newline at end of property This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-04 14:59:42
|
Revision: 2250 http://sourceforge.net/p/nsclspectcl/code/2250 Author: ron-fox Date: 2015-02-04 14:59:41 +0000 (Wed, 04 Feb 2015) Log Message: ----------- Will hold new seetf production spectcl code Added Paths: ----------- branches/seetf/production/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-02-04 14:58:20
|
Revision: 2249 http://sourceforge.net/p/nsclspectcl/code/2249 Author: ron-fox Date: 2015-02-04 14:58:03 +0000 (Wed, 04 Feb 2015) Log Message: ----------- Original SEETF SpecTcl. Added Paths: ----------- branches/seetf/original/ branches/seetf/original/C branches/seetf/original/CBoolConfigParam.cpp branches/seetf/original/CBoolConfigParam.h branches/seetf/original/CCAENDigitizerCreator.cpp branches/seetf/original/CCAENDigitizerCreator.h branches/seetf/original/CCAENDigitizerModule.cpp branches/seetf/original/CCAENDigitizerModule.h branches/seetf/original/CCAENV830Creator.cpp branches/seetf/original/CCAENV830Creator.h branches/seetf/original/CCAENV830Module.cpp branches/seetf/original/CCAENV830Module.h branches/seetf/original/CConfigurationParameter.cpp branches/seetf/original/CConfigurationParameter.h branches/seetf/original/CIntArrayParam.cpp branches/seetf/original/CIntArrayParam.h branches/seetf/original/CIntConfigParam.cpp branches/seetf/original/CIntConfigParam.h branches/seetf/original/CModule.cpp branches/seetf/original/CModule.h branches/seetf/original/CModuleCommand.cpp branches/seetf/original/CModuleCommand.h branches/seetf/original/CModuleCreator.cpp branches/seetf/original/CModuleCreator.h branches/seetf/original/CModuleDictionary.cpp branches/seetf/original/CModuleDictionary.h branches/seetf/original/CPosition.cpp branches/seetf/original/CPosition.h branches/seetf/original/CProfile.cpp branches/seetf/original/CProfile.h branches/seetf/original/CSeeAnalyzer.cpp branches/seetf/original/CSeeAnalyzer.h branches/seetf/original/CStringArrayparam.cpp branches/seetf/original/CStringArrayparam.h branches/seetf/original/CStringConfigParam.cpp branches/seetf/original/CStringConfigParam.h branches/seetf/original/CUnpacker.cpp branches/seetf/original/CUnpacker.h branches/seetf/original/CUnpackerCommand.cpp branches/seetf/original/CUnpackerCommand.h branches/seetf/original/Conceptual Design.rtf branches/seetf/original/ConceptualDesign.doc branches/seetf/original/DetailedDesign.WC branches/seetf/original/DetailedDesign.omt branches/seetf/original/Makefile branches/seetf/original/Makefile.old branches/seetf/original/MySpecTclApp.cpp branches/seetf/original/MySpecTclApp.h branches/seetf/original/Requirements.doc branches/seetf/original/SpecTclRC.tcl branches/seetf/original/TESTDIR.TMP branches/seetf/original/ToplevelClassRelations.WC branches/seetf/original/ToplevelClassRelations.omt branches/seetf/original/allchans.win branches/seetf/original/getgoing.tcl branches/seetf/original/mona.config branches/seetf/original/rdosetup.tcl branches/seetf/original/setup.tcl Added: branches/seetf/original/C =================================================================== --- branches/seetf/original/C (rev 0) +++ branches/seetf/original/C 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1 @@ +ou \ No newline at end of file Property changes on: branches/seetf/original/C ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CBoolConfigParam.cpp =================================================================== --- branches/seetf/original/CBoolConfigParam.cpp (rev 0) +++ branches/seetf/original/CBoolConfigParam.cpp 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,437 @@ +/* + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of this License, + you may choose any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author to +ask for permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE +THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS +*/ +static const char* Copyright = "(C) Copyright Michigan State University 1977, All rights reserved"; +/*! \class CBoolConfigParam + CLASS_PACKAGE + Encapsulates a boolean parameter. +*/ +#include <config.h> +#include "CBoolConfigParam.h" +#include <TCLInterpreter.h> +#include <TCLResult.h> + +using namespace std; + +/*! + Constructor. + \param rName const string& [in] + Name of the parameter (keyword recognized by config). + \param fDefault bool [in] + Default (initial) value of the parameter. +*/ +CBoolConfigParam::CBoolConfigParam (const string& rName, + bool fDefault) : + CConfigurationParameter(rName), + m_fValue(fDefault) +{ + setValue(fDefault ? "true" : "false"); +} + +/*! + Destructor +*/ +CBoolConfigParam::~CBoolConfigParam ( ) +{ +} +/*! + Copy constructor. Used to create temproraries such as + for passing by value to functions. + \param rhs const CBoolConfigParam [in] + The reference object we are copying. +*/ +CBoolConfigParam::CBoolConfigParam (const CBoolConfigParam& rhs) + : CConfigurationParameter (rhs), + m_fValue(rhs.m_fValue) +{ +} + +/*! + Assignment + \param rhs const CBoolConfigParam& [in] + The right hand parameter of the = operator. + \return reference to *this. +*/ +CBoolConfigParam& +CBoolConfigParam::operator= (const CBoolConfigParam& rhs) +{ + if(this != &rhs) { + CConfigurationParameter::operator=(rhs); + m_fValue = rhs.m_fValue; + } + return *this; +} +/*! + Compare for functional equality. + \param rhs const CBoolConfigParam& [in] + Right hand operand of the == operator. + \return Any of: + - 0 For inequality. + - 1 for equality. +*/ +int CBoolConfigParam::operator== (const CBoolConfigParam& rhs) const +{ + return ( CConfigurationParameter::operator==(rhs) && + (m_fValue == rhs.m_fValue)); +} + +// Functions for class CBoolConfigParam + +/*! +Returns the value of the parameter. + +*/ +bool +CBoolConfigParam::getOptionValue() +{ + return m_fValue; +} + +/*! + +Parses the parameter value. +This function can fail if: +- The parameter is not avalid bool. + +\return One of: +- TCL_OK - the parse worked. +- TCL_ERROR - the pares failed. + +*/ +int +CBoolConfigParam::SetValue(CTCLInterpreter& rInterp, + CTCLResult& rResult, + const char* pFlag) +{ + // First try to parse the flag.. It seems that ExprBoolean is busted. + // in some way, so we'll do a manual parse.. we want to expand the + // acceptable bool values to enabled disable too so what the heck. + try { + Bool_t param; + param = ParseFlag(pFlag); + m_fValue = param; + } + catch (...) { + string Result; + Result += "Boolean parameter: "; + Result += getSwitch(); + Result += " value "; + Result += pFlag; + Result += " Cannot be parsed as a bool"; + rResult.AppendElement(Result); + return TCL_ERROR; + } + return TCL_OK; +} +/*! + \return The format of the configuration parameter in this + case "on | off" +*/ +string +CBoolConfigParam::GetParameterFormat() +{ + return string("on | off"); +} +/*! + Utility function to parse a boolean flag: + \param value const char* [in] Character value of the flag. Legal + values for true are: + - true + - on + - enable + Legal values for false are: + - false + - off + - disable + + \return Bool_t kfTRUE if parses as true, kfFALSE if as false, and an + exception (char*) if no parse. +*/ +Bool_t +CBoolConfigParam::ParseFlag(const char* value) +{ + string sValue(value); + if( (sValue == string("true")) || + (sValue == string("on")) || + (sValue == string("enable"))) return kfTRUE; + else if ( (sValue == string("false")) || + (sValue == string("off")) || + (sValue == string("disable"))) return kfFALSE; + else + throw "Invalid boolean value."; + +} Property changes on: branches/seetf/original/CBoolConfigParam.cpp ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CBoolConfigParam.h =================================================================== --- branches/seetf/original/CBoolConfigParam.h (rev 0) +++ branches/seetf/original/CBoolConfigParam.h 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,324 @@ +/* + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + Preamble + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of this License, + you may choose any version ever published by the Free Software Foundation. + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author to +ask for permission. For software which is copyrighted by the Free Software +Foundation, write to the Free Software Foundation; we sometimes make +exceptions for this. Our decision will be guided by the two goals of +preserving the free status of all derivatives of our free software and of +promoting the sharing and reuse of software generally. + NO WARRANTY + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE +THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND +PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, +YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO +LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR +THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + END OF TERMS AND CONDITIONS +*/ +// Author: +// Ron Fox +// NSCL +// Michigan State University +// East Lansing, MI 48824-1321 +// mailto:fo...@ns... +// + +#ifndef __CBOOLCONFIGPARAM_H //Required for current class +#define __CBOOLCONFIGPARAM_H + +// +// Include files: +// + + //Required for base classes +#ifndef __CCONFIGURATIONPARAMETER_H //CConfigurationParameter +#include "CConfigurationParameter.h" +#endif + +#ifndef __HISTOTYPES_H +#include <histotypes.h> +#endif + +/*! +Encapsulates a boolean parameter. Bool parameters +are keyword value pairs. The value is any string that +is parseable by Tcl_ExprBoolean. True values are: +- 1 +- true +- yes +- on +False values are: +- 0 +- false +- no +- off + +An example of a parameter of this sort might be: +\verbatim +-eclreadout off +\endverbatim +Turn s off ecl readout for e.g. a fera. +*/ +class CBoolConfigParam : public CConfigurationParameter +{ +private: + bool m_fValue; //!< Current boolean value. : + // Constructors and other cannonical member functions: +public: + CBoolConfigParam (const std::string& rName, + bool fDefault = false); //!< Constructor + ~ CBoolConfigParam ( ); //!< Destructor + CBoolConfigParam (const CBoolConfigParam& rhs); //!< copy constructor + CBoolConfigParam& operator= (const CBoolConfigParam& rhs); //!< Assignment + int operator== (const CBoolConfigParam& rhs) const; //!< Equality test + int operator!= (const CBoolConfigParam& rhs) const + { + return !operator==(rhs); + } + + // Selectors: + +public: + + bool getValue() const { + return m_fValue; + } + // Mutators +protected: + void setBool(bool fValue) { + m_fValue = fValue; + } + // Class operations: + +public: + + bool getOptionValue () ; //!< get current flag. + virtual int SetValue (CTCLInterpreter& rInterp, + CTCLResult& rResult, + const char* pFlag) ; //!< Parse flag. + virtual std::string GetParameterFormat(); + protected: + static Bool_t ParseFlag(const char* value); +}; +#endif Property changes on: branches/seetf/original/CBoolConfigParam.h ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CCAENDigitizerCreator.cpp =================================================================== --- branches/seetf/original/CCAENDigitizerCreator.cpp (rev 0) +++ branches/seetf/original/CCAENDigitizerCreator.cpp 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,84 @@ +#include <config.h> +#include "CCAENDigitizerCreator.h" +#include "CModule.h" +#include "CCAENDigitizerModule.h" +#include <TCLInterpreter.h> +#include <TCLResult.h> + +using namespace std; + +/*! + Construct a digitizer creator for CAEN7xx modules. +*/ +CCAENDigitizerCreator::CCAENDigitizerCreator () : + CModuleCreator("caen7xx") +{ + +} +/*! Destructor +*/ + CCAENDigitizerCreator::~CCAENDigitizerCreator ( ) //Destructor - Delete dynamic objects +{ +} +/*! + Copy construction + \param rhs (const CCAENDigitizerCreator& [in]): Reference to the object our construction + duplicates. + */ +CCAENDigitizerCreator::CCAENDigitizerCreator (const CCAENDigitizerCreator& rhs) + : CModuleCreator (rhs) + +{ + +} +/*! + Assignment. + \param rhs (const CCAENDigitizerCreator& [in]): Right hand side of the assignment + operator. + \return CCAENDigitizerCreator& reference to *this. + */ +CCAENDigitizerCreator& +CCAENDigitizerCreator::operator= (const CCAENDigitizerCreator& rhs) +{ + if(this != &rhs) { + CModuleCreator::operator=(rhs); + } + return *this; +} + +/*! + Comparison. + \param rhs (const CCAENDigitizerCreator& [in]): Item we are compared to. + \return nonzero if equal. +*/ +int +CCAENDigitizerCreator::operator== (const CCAENDigitizerCreator& rhs) const +{ + return CModuleCreator::operator==(rhs); +} + +// Functions for class CCAENDigitizerCreator + +/*! + +Creates a CAEN digitizer unpacking module. +\param rInterp (CTCLInterpreter& [in]): The interpreter that should be used to + create the digitizer. +\param rResult (CTCLResult& [out]): Any errors from this creation are reported here. +\param rName (const string& [in]): Name of the new module (command name too). +\return POinter to the new module or null if could not create. +*/ +CModule* +CCAENDigitizerCreator::Create(CTCLInterpreter& rInterp, + const string& rName) +{ + return new CCAENDigitizerModule(rInterp, rName); +} +/*! + \return string containing a description of what we create. +*/ +string +CCAENDigitizerCreator::TypeInfo() const +{ + return string(" Unpacks common event format for CAEN 7xx digitizers"); +} Property changes on: branches/seetf/original/CCAENDigitizerCreator.cpp ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CCAENDigitizerCreator.h =================================================================== --- branches/seetf/original/CCAENDigitizerCreator.h (rev 0) +++ branches/seetf/original/CCAENDigitizerCreator.h 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,48 @@ + +#ifndef __CCAENDIGITIZERCREATOR_H //Required for current class +#define __CCAENDIGITIZERCREATOR_H + +// +// Include files: +// + + //Required for base classes +#ifndef __CMODULECREATOR_H //CModuleCreator +#include "CModuleCreator.h" +#endif + +#ifndef __STL_STRING +#include <string> +#define __STL_STRING +#endif + +// forward class definitions: + +class CModule; +class CTCLInterpreter; +class CTCLResult; + +/*! +Creator for CAEN digitizers (common format). +*/ +class CCAENDigitizerCreator : public CModuleCreator +{ + +public: + // Constructors and other cannonical operatios. + CCAENDigitizerCreator (); + ~ CCAENDigitizerCreator ( ); + CCAENDigitizerCreator (const CCAENDigitizerCreator& rhs ); + CCAENDigitizerCreator& operator= (const CCAENDigitizerCreator& rhs); + int operator== (const CCAENDigitizerCreator& rhs) const; + int operator!= (const CCAENDigitizerCreator& rhs) const { + return !(operator==(rhs)); + } + +public: + + CModule* Create (CTCLInterpreter& rInterp, const std::string& rName); + virtual std::string TypeInfo() const; +}; + +#endif Property changes on: branches/seetf/original/CCAENDigitizerCreator.h ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CCAENDigitizerModule.cpp =================================================================== --- branches/seetf/original/CCAENDigitizerModule.cpp (rev 0) +++ branches/seetf/original/CCAENDigitizerModule.cpp 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,243 @@ +#include <config.h> +#include <histotypes.h> +#include "CCAENDigitizerModule.h" +#include <TCLInterpreter.h> +#include <TCLResult.h> +#include <Globals.h> +#include <string.h> +#include <Histogrammer.h> +#include <Parameter.h> +#include <BufferDecoder.h> +#include <CConfigurationParameter.h> +#include <CIntArrayParam.h> +#include <CIntConfigParam.h> +#include <CStringArrayparam.h> +#include <CStringConfigParam.h> +#include <Analyzer.h> +#include <TranslatorPointer.h> + +using namespace std; + + +// Mask definitions: + // All data words have these bits: + +static const unsigned int ALLH_TYPEMASK(0x700); +static const unsigned int ALLH_TYPESHIFT(8); +static const unsigned int ALLH_GEOMASK(0xf800); +static const unsigned int ALLH_GEOSHIFT(11); + + // High part of header. + +static const unsigned int HDRH_CRATEMASK(0x00ff); +static const unsigned int HDRH_CRATESHIFT(0); + + // Low part of header. + +static const unsigned int HDRL_COUNTMASK(0X3f00); +static const unsigned int HDRL_COUNTSHIFT(8); + + // High part of data: + +static const unsigned int DATAH_CHANMASK(0x3f); +static const unsigned int DATAH_CHANSHIFT(0); + + // Low part of data: + +static const unsigned int DATAL_UNBIT(0x2000); +static const unsigned int DATAL_OVBIT(0x1000); +static const unsigned int DATAL_VBIT(0x40000); +static const unsigned int DATAL_DATAMASK(0x0fff); + + // High part of trailer: + +static const unsigned int TRAILH_EVHIMASK(0x00ff); + + // Word types: + +static const unsigned int HEADER(2); +static const unsigned int DATA(0); +static const unsigned int TRAILER(4); +static const unsigned int INVALID(6); + +/*! + Constructs a digitizer module. This module is responsible for + decoding data from a 7xx CAEN digitizer.. They all have a common + format. See Unpack for more information about the data format. + This decoder supports the following parameters: + - crate - Integer parameter that is the crate number to be matched + against the data. + - slot - Integer parameter that is the geographical address to be matched + against the data. + - parameters - String array that defines the set of parameters that + the data will be unpacked into. The array has 32 elements, + one for each channel. */ +CCAENDigitizerModule::CCAENDigitizerModule (CTCLInterpreter& rInterp, + const string& rName) + : CModule( rName, rInterp), + m_nCrate(0), + m_nSlot(0), + m_pCrateConfig(0), + m_pSlotConfig(0), + m_pParamConfig(0) + +{ + + + memset(m_aParameterMap, 0, sizeof(m_aParameterMap)); + + // Register the parameters: + + m_pCrateConfig = AddIntParam(string("crate")); + m_pCrateConfig->setRange(0, 0xff); + m_pSlotConfig = AddIntParam(string("slot")); + m_pSlotConfig->setRange(0, 0x1f); + + m_pParamConfig= AddStringArrayParam(string("parameters"), 32); + + // The remaining parameters are ignored but registered for compatibility + // with the readout software (to support a unified readout script). + // + + AddIntArrayParam(string("threshold"), 32, 0); + AddBoolParam(string("keepunder"), false); + AddBoolParam(string("keepoverflow"), false); + AddBoolParam(string("card"), true); + AddBoolParam(string("geo"), true); // Geographical addressing. + AddIntArrayParam(string("enable"), 32, 1); + AddIntParam(string("base"), 0); + AddBoolParam(string("multievent"), false); + + // V785 specific parameters: + + AddIntParam(string("range"), 500); + + // V792 specific parameters: + + AddIntParam(string("Iped"), 0); + +} +/*! + Destructor. No dynamic storage is managed, so the implementation is a No-Op. +*/ + CCAENDigitizerModule::~CCAENDigitizerModule ( ) //Destructor - Delete dynamic objects +{ + delete m_pCrateConfig; + delete m_pSlotConfig; + delete m_pParamConfig; +} +// Functions for class CCAENDigitizerModule + +/*! + + Called prior to processing the first event. The parameters are decoded as follows: + - crate - unpacked into m_nCrate. + - slot - unpacked into m_nSlot. + - parameters - Translated into parameter ids and put in m_aParameterMap. + Untranslatable parameters map to -1 and the corresponding channels + will not be placed in parameter elements. + +*/ +void +CCAENDigitizerModule::Setup(CAnalyzer& rAnalyzer, + CHistogrammer& rHistogrammer) +{ + // The crate and slot are trivial: + + m_nCrate = m_pCrateConfig->getOptionValue(); + m_nSlot = m_pSlotConfig->getOptionValue(); + + // For the parameter we need to get the histogrammer and + // translate names into parameter ids: + + CHistogrammer* pHist = &rHistogrammer; + for(int i =0; i < 32; i++) { + string ParamName = (*m_pParamConfig)[i]; + CParameter* pParameter = pHist->FindParameter(ParamName); + if(pParameter) { + m_aParameterMap[i] = pParameter->getNumber(); + } + else { + m_aParameterMap[i] = -1; // No mapping. + } + } +} + +/*! + +Determines if the next item in the event stream is the +specified digitizer. If so, the digitizer is unpacked into +the parameters as specified by the parameter map. +CAEN event data looks like a sequence of longwords. + +Header word: | Geo 5bits|0|1|0| Crate 8 bits| 0 | 0| nChannels 6bits| unused 8bits| + +Data words | Geo 5bits| mbz 5bits| Channel 6 bits|x|x|Un|Ov| Value: 12 bits| + +Trailer word | Geo 5 bits| 1|0|0| Event number 24 bits | + +The header is used to determine if this is data from the right slot. +\note The words within the long word are stored in big endian order while the + bytes within are in the order of the generating system. Therefore we treat the + data as word data. + + \param pEvent (TranslatorPointer<UShort_t> [in]) + Pointer to the raw event chunk that + could be our event chunk. + \param rEvent (CEvent& [out]) Reference to the event array we will fill in. + \param rAnalyzer (CAnalyzer& [in]) Reference to our analyzer. + \param rDecoder (CBufferDecoder& [in] Reference to our buffer decoder. + \return - the address of the next section of the event to unpack (unchanged + if the event segment being pointed to does not match this module. +*/ +TranslatorPointer<UShort_t> +CCAENDigitizerModule::Unpack(TranslatorPointer<UShort_t> pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + + // Make an appropriately translating pointer: + + TranslatorPointer<UShort_t> p(pEvent); + + UShort_t HeaderTop = *p; + + + // To decode, Header must be a header word and match our crate/slot: + + UShort_t nSlot = (HeaderTop & ALLH_GEOMASK) >> ALLH_GEOSHIFT; + UShort_t nType= (HeaderTop & ALLH_TYPEMASK) >> ALLH_TYPESHIFT; + UShort_t nCrate=(HeaderTop & HDRH_CRATEMASK) >> HDRH_CRATESHIFT; + + if( (nType == HEADER) && + ( nCrate == m_nCrate) && + ( nSlot == m_nSlot)) { // match: + ++p; + UShort_t nChannels = (*p & HDRL_COUNTMASK) >> HDRL_COUNTSHIFT; + ++p; + // Unpack the channels -> rEvent. + + for(int i =0; i < nChannels; i++) { + UShort_t nChan = (*p & DATAH_CHANMASK) >> DATAH_CHANSHIFT; + ++p; + if(m_aParameterMap[nChan] >=0 && + ((*p & (DATAL_UNBIT | DATAL_OVBIT)) == 0)) { + rEvent[m_aParameterMap[nChan]] = (*p & DATAL_DATAMASK); + } + ++p; + } + + p += 2; // Skip the trailer longword too. + } + + return p; +} +/*! + Return a string indicating what type of module this is: +*/ +string +CCAENDigitizerModule::getType() const +{ + return string("caen7xx"); +} Property changes on: branches/seetf/original/CCAENDigitizerModule.cpp ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CCAENDigitizerModule.h =================================================================== --- branches/seetf/original/CCAENDigitizerModule.h (rev 0) +++ branches/seetf/original/CCAENDigitizerModule.h 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,124 @@ +//! \class: CCAENDigitizerModule +//! \file: .h +// Author: +// Ron Fox +// NSCL +// Michigan State University +// East Lansing, MI 48824-1321 +// mailto:fo...@ns... +// +// Copyright + +#ifndef __CCAENDIGITIZERMODULE_H //Required for current class +#define __CCAENDIGITIZERMODULE_H + +// +// Include files: +// + + //Required for base classes +#ifndef __CMODULE_H //CModule +#include "CModule.h" +#endif + +#ifndef __STL_STRING +#include <string> +#define __STL_STRING +#endif + +#ifndef __CRTL_STRING_H +#include <string.h> +#define __CRTL_STRING_H +#endif + +#ifndef __TRANSLATORPOINTER_H +#include <TranslatorPointer.h> +#endif + +// Forward Class Defintions: + +class CTCLInterpreter; +class CTCLResult; +class CAnalyzer; +class CBufferDecoder; +class CEvent; + +/*! +Unpacks data from a CAEN digitizer. +*/ +class CCAENDigitizerModule : public CModule +{ +private: + + // Private Member data: + int m_aParameterMap[32]; //! Maps channels to spectcl parameter ids. + int m_nCrate; //! Crate number (from crate register). + int m_nSlot; //! Slot number from GEO address or register. + CIntConfigParam* m_pCrateConfig; //!< Pointer to "crate" parameter + CIntConfigParam* m_pSlotConfig; //!< Pointer to "slot" parameter. + CStringArrayparam* m_pParamConfig; //!< Pointer to "parameters" param. + +public: + // Constructors and other canonical functions + CCAENDigitizerModule (CTCLInterpreter& rInterp, + const std::string& rName); + virtual ~ CCAENDigitizerModule ( ); +private: + + CCAENDigitizerModule (const CCAENDigitizerModule& aCCAENDigitizerModule ); + CCAENDigitizerModule& operator= (const CCAENDigitizerModule& aCCAENDigitizerModule); + int operator== (const CCAENDigitizerModule& aCCAENDigitizerModule) const; + int operator!=(const CCAENDigitizerModule& rhs) const; +public: +// Selectors: + +public: + + //Get accessor function for non-static attribute data member + const int* getParameterMap() const + { + return m_aParameterMap; + } + //Get accessor function for non-static attribute data member + int getCrate() const + { + return m_nCrate; + } + //Get accessor function for non-static attribute data member + int getSlot() const + { + return m_nSlot; + } + +// Attribute mutators: + +protected: + + //Set accessor function for non-static attribute data member + void setParameterMap (const int* am_aParameterMap) + { + memcpy(m_aParameterMap, am_aParameterMap, + sizeof(m_aParameterMap)); + } + //Set accessor function for non-static attribute data member + void setCrate (const int am_nCrate) + { m_nCrate = am_nCrate; + } + //Set accessor function for non-static attribute data member + void setSlot (const int am_nSlot) + { m_nSlot = am_nSlot; + } + + // Class operations: + +public: + virtual std::string getType() const; + virtual void Setup (CAnalyzer& rAnalyzer, CHistogrammer& rHistogrammer) ; // + virtual TranslatorPointer<UShort_t> + Unpack (TranslatorPointer<UShort_t> pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) ; // + +}; + +#endif Property changes on: branches/seetf/original/CCAENDigitizerModule.h ___________________________________________________________________ Added: svn:executable \ No newline at end of property Added: branches/seetf/original/CCAENV830Creator.cpp =================================================================== --- branches/seetf/original/CCAENV830Creator.cpp (rev 0) +++ branches/seetf/original/CCAENV830Creator.cpp 2015-02-04 14:58:03 UTC (rev 2249) @@ -0,0 +1,347 @@ +/* + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and cond... [truncated message content] |
From: <ro...@us...> - 2015-02-04 14:55:02
|
Revision: 2248 http://sourceforge.net/p/nsclspectcl/code/2248 Author: ron-fox Date: 2015-02-04 14:55:01 +0000 (Wed, 04 Feb 2015) Log Message: ----------- Branch for the original SEETF spectcl code. In fact this diretory is for reference purposes only. The scripted SpecTcl gets abandoned in favor of the VMUSBSpecTcl tailored for this software. Added Paths: ----------- branches/seetf/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |