From: <ro...@us...> - 2014-10-24 12:02:22
|
Revision: 2201 http://sourceforge.net/p/nsclspectcl/code/2201 Author: ron-fox Date: 2014-10-24 12:02:08 +0000 (Fri, 24 Oct 2014) Log Message: ----------- Coding progress - backup. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/filesource/CApplication.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 12:02:08 UTC (rev 2201) @@ -0,0 +1,181 @@ +/****************************************************************************** +* +* 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 CMTDC32Unpacker.cpp + * @brief Unpacker for Mesytec TDCs. + * @author Ron Fox <fo...@ns...> + */ + +#include <config.h> +#include "CMTDC32Unpacker.h" +#include "CParamMapCommand.h" +#include "MTDC32.h" +#include "MTDCHelpers.h" +#include <string> +#include <string.h> + + + + +/*------------------------------------------------------------------------------------- + * Helpers + */ + + +/** + * unpackMTDC32Event + * Unpack exactly one MTDC32 Event and put its hits in a larger hit array. + * The idea behind this is that in timestamp mode an actual physics trigger can + * have several TDC hits and therefore several timestamps. + * + * @param hits - Referncde to the vector in which the hit data should be placed. + * @param event - THe stack event as a vector. + * @param offset- Where in the event our data starts. + * @return unsigned - Where the next part of the event starts. + * + * @note THe struture of an event depends on whether or not the device is in + * timestamp or multi hit mode. This can be detected from the data. + * In timestamp mode each hit is follwed by an event synchronization word + * while in multihit mode that dat is at the end of the event. + * Further in timestamp mode each 'event' contains exactly one hit. + */ +unsigned int +CMTDC32Unpacker::unpackMTDC32Event(std::vector<hitInfo>& hits, + std::vector<unsigned short>& event, + unsigned int offset) +{ + std::vector<hitInfo> newHits; // Hits in this event. + + // First is a header that tells us how many words follow, as well as the + // time resolution: + + uint32_t header = getLong(event, offset); + if (!MTDC::isHeader(header)) { + throw std::string("Expected MTDC32 header but was disappointed!!"); + } + unsigned words = MTDC::wordCount(header); + float psPerChan = MTDC::psPerChannel(MTDC::resolution(header)); // for calibrated times. + offset+= 2; + + // Now the body of the event; each timestamp has its own sync data while + // hits have sync data at the very end. + + + unsigned datum = getLong(event, offset); + if(!MTDC::isDataType16(datum)) { + throw std::string("Expected a datum with 16 bits of time data was disappointed"); + } + offset += 2; + words -= 1; + + unsigned ch = MTDC::channel(datum); + uint64_t rawTime = MTDC::time16(datum); + + // Next word is either sync data (timestamp) or another data item (multihit mode): + + datum = getLong(event, offset); + if (MTDC::isDataTypeEvtSyn(datum)) { + // Timestamp mode: + + uint32_t syncInfo = MTDC::getSync16(datum); + offset +=2; + words -=1; + + // Next word must be an end marker and has the top bits of the time. + + datum = getLong(event, offset); + if (!MTDC::isEnd(datum)) { + std::string("Exected end of event in timestamp mode and was disappointed"); + } + offset +=2; + words -=1; + uint64_t topTime = MTDC::getData30(datum); + rawTime |= (topTime << 16); + + double timePs = (double)rawTime * psPerChan; + hitInfo hit; + hit.s_channel = ch; + hit.s_rawTime = rawTime; + hit.s_timePs = timePs; + hit.s_eventCorr = syncInfo; + hits.push_back(hit); + + } else { + // TDC is in multi-hit mode. We don't know anything about the syn data + // until the end of the event: + + hitInfo hit; + hit.s_channel = ch; + hit.s_rawTime = rawTime; + hit.s_timePs = (double)rawTime * psPerChan; + newHits.push_back(hit); + + // deal with data until we get something different. + + while (MTDC::isData(datum)) { + hitInfo hit; + hit.s_channel =ch; + hit.s_rawTime = MTDC::time16(datum); + hit.s_timePs = (double)(hit.s_rawTime) * psPerChan; + newHits.push_back(hit); + + offset +=2; + words -=1; + datum = getLong(event, offset); + } + + // That something different must be an end mark and has all the sync data. + + if (!MTDC::isEnd(datum)) { + throw std::string("Expecting end in multi-hit mode but was disappointed"); + } + uint32_t syncInfo = MTDC::getData30(datum); + for (int i =0; i < newHits.size(); i++) { + newHits[i].s_eventCorr = syncInfo; + hits.push_back(newHits[i]); + } + + offset += 2; + words -= 1; + + } + + if (words != 0) { + throw std::string("Completly processed the event but there are left over words"); + } + return offset; + + +} + +/** + * moreData + * Determine if there is more data to unpack for this module. + * * THe datum must not be 0xffffffff + * * THe datum must be a header. + * * The datum must have the vsn indicated by pMap. + * + * @param datum - Next data item in the event. + * @param pMap - Pointer to the map data + */ +bool +CMTDC32Unpacker::moreData(uint32_t datum, CParamMapCommand::AdcMapping* pMap) +{ + return (datum != 0xffffffff) && (MTDC::isHeader(datum)) && (MTDC::id(datum) == pMap->vsn); + +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-24 12:02:08 UTC (rev 2201) @@ -0,0 +1,147 @@ + +/****************************************************************************** +* +* 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 CMTDC32Unpacker.h + * @brief Unpacker for Mesytec TDCs. + * @author Ron Fox <fo...@ns...> + */ + +// Base class include + +#ifndef _CMODULEUNPACKER_H +#include "CModuleUnpacker.h" +#endif + +#ifndef __CRT_STDINT_H +#include <stdint.h> +#ifndef __CRT_STDINT_H +#define __CRT_STDINT_H +#endif +#endif + +#ifndef __TREEPARAMETER_H +#include <TreeParameter.h> +#endif + +#ifndef __STL_VECTOR +#include <vector> +#ifndef __STL_VECTOR +#define __STL_VECTOR +#endif +#endif + + +/** + * @class CMTDC32Unpacker + * This class is responsible for npacking the Mesytec MTDC32 32/34 channel TDC. + * The module can be run sort of like the CAEN V1x90 series of modules, either in a + * trigger matching mode or in a timestamped mode. Note that in timestamped mode, + * the gate inputs can be channels as well. This implies to me that the gates (in + * trigger matching mode) are responded to at high enough resolution that it's not + * necessar to do the reference channel game the V1x90's need(?) for absolute timing. + * + * The data format can tell us whether or not the module is in trigger matching mode or in + * timestamp mode. In timestamp mode, each channel hit is a separate MTDC32 event and there is a word + * of event synchronization data that can be either a timestamp or an event counter. Note each + * VMUSB event can therefore have more than one MTDC32 event and that the read size is large + * enough that we're pretty much ensured of a 0xffffffff end word. + * + * Extra data associated with each module is: + * * MTDCMaxHits(module-name) Maximum number of hits that will be accepted. + * * MTDCLow(module-name) Tree parameter low limit on suggested spectra. + * * MTDCHi(module_name) Tree parameter high limit on suggested spectdra. + * * MTDCChans(module-name) Tree parameter suggested channels/spectra. + * + * The TDC resolution is provided in the data and therefore does not need to be in the + * metadata since it's provided in the event. + * + * For each hit (MTDC32 event in timestamp mode) we produce the following (relative to the + * basename): + * * time[channel][hit] - The time for hit number n in the specified channel. + * * timeps[channel][hit] - The time in ps for hit number n in the specified channel. + * * eventcorr[channel][hit] - Event correlation information for hit n in specified channel. + * + * This data organization can handle 'ordinary' time difference as well as timestamping mode. + * Note that typically in timestamp mode sense will be made of the unpacked data in a separate + * event processor since direct histogramming makes no sense whatsoever. + */ +class CMTDC32Unpacker : public CModuleUnpacker +{ +public: + + // Information for a tdc hit - across all MTDC32's in the setup. + + typedef struct _hitInfo { + unsigned s_channel; + uint64_t s_rawTime; + double s_timePs; + uint32_t s_eventCorr; + _hitInfo() : s_channel(0), s_rawTime(0), s_timePs(0.0), s_eventCorr(0.0) {} + } hitInfo; +private: + + // The cooked data goes here. + + + + + bool m_Initialized; + + // _extraData used to construct the tree parameter arrays as well as to + // limit the number of accepted hits. + + + typedef struct _ExtraData { + unsigned s_maxHits; + float s_lowLim; + float s_hiLim; + std::vector<hitInfo> hits; // Raw hit information if that's better for later bits of the event pipeline. + CTreeParameterArray s_time[34]; + CTreeParameterArray s_timePs[34]; + CTreeParameterArray s_eventCorr[34]; + } ExtraData, *pExtraData; + + // Canonicals: + +public: + CMTDC32Unpacker(); + virtual ~CMTDC32Unpacker(); + + // CModuleUnpacker polymorphic interface: + +public: + virtual unsigned int operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap); + + // methods to get at the raw unpacking: + +public: + std::vector<hitInfo>& getRawHits(unsigned moduleId); + +private: + void defineTreeParams(CParamMapCommand::AdcMapping* pMap); + void linkExtraData(CParamMapCommand::AdcMapping* pMap); + unsigned int unpackMTDC32Event(std::vector<hitInfo>& hits, + std::vector<unsigned short>& event, + unsigned int offset); + bool moreData(uint32_t datum, CParamMapCommand::AdcMapping* pMap); + +}; Added: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h 2014-10-24 12:02:08 UTC (rev 2201) @@ -0,0 +1,85 @@ +/****************************************************************************** +* +* 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 MTDC32.h + * @brief Define the bit patterns in MTDC32 data. + * @author Ron Fox <ro...@ca...> + */ + +#ifndef __MTDC32_H +#define __MTDC32_H + +/* Header fields: */ + +#define MTDC_SIGNATURE_MASK 0xc0000000 +#define MTDC_SIGNATURE_HEADER 0x40000000 + +#define MTDC_SUBHEADER_MASK 0x3f000000 +#define MTDC_SUBHEADER_SHFIT 24 +#define MTDC_SUBHEADER_VALUE 0x00000000 + +#define MTDC_ID_MASK 0x00ff0000 +#define MTDC_ID_SHIFT 16 + +#define MTDC_RES_MASK 0x0000f000 +#define MTDC_RES_SHIFT 12 + +// Resolutions in pico seconds given the resolution code. + +static float psPerChanel[10] = { + 0.0, 0.0, /* 0,1 are not defined resolution values */ + 3.9, 7.8, 15.6, 31.3, 62.5, 125, 250, 500 +}; + +#define MTDC_WORDS_MASK 0x00000fff + +/* 16 bits of data, or low order 16 bits depending on structure */ + +#define MTDC_SIGNATURE_DATA 0x00000000 + +#define MTDC_DATA_TYPE_MASK 0x3fc00000 +#define MTDC_DATA_TYPE_16 0x08000000 + +#define MTDC_CHANNEL_MASK 0x003f0000 +#define MTDC_CHANNEL_SHIFT 16 + +#define MTDC_TIME16_MASK 0x0000ffff + +/* Extended timestamp has 16 bits of sync data in this type */ +/* Synch data is either timestamp or event counter depending on format mode */ + +#define MTDC_DATA_TYPE_EVTSYNC 0x09000000 + +#define MTDC_EVENT_SYNC16_MASK 0X0000FFFF + +/* End of event with 30 bits of timestamp */ +/* The 30 bits of timestamp are either all there is or in the + stamping mode the top 30 bits. Stamping mode is on if the EVTSYNC word + appears +*/ + + +#define MTDC_SIGNATURE_END 0xc0000000 + +#define MTDC_TIMESTAMP_30_MASK 0x3fffffff + + + + + + +#endif Added: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp 2014-10-24 12:02:08 UTC (rev 2201) @@ -0,0 +1,188 @@ +/****************************************************************************** +* +* 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 MTDCHelpers.cpp + * @brief Implementation of decode helpers. + * @author Ron Fox <fo...@ns...> + */ + +#include "MTDCHelpers.h" +#include "MTDC32.h" + +/* All functions are in the MTDC namespace */ + +/** + * signature + * Extract the signature from the word. + * + * @param word - a 32 bit word from the data + * + * @return the signature part. + */ +uint32_t MTDC::signature(uint32_t word) { + return word & MTDC_SIGNATURE_MASK; +} + +/** + * isHeader + * @param word - the 32 bit word to test. + * @return bool true if the word is a header word. + */ +bool MTDC::isHeader(uint32_t word) { + return signature(word) == MTDC_SIGNATURE_HEADER; +} +/** + * isData + * @param word - the 32 bit word to test. + * @return bool - True if the word is a data word (all types of data have the same sig). + */ +bool MTDC::isData(uint32_t word) +{ + return signature(word) == MTDC_SIGNATURE_DATA; +} +/** + * isEnd + * @param word - the 32 bit word to test. + * @return bool - true if the word is an end word. + */ +bool MTDC::isEnd(uint32_t word) +{ + return signature(word) == MTDC_SIGNATURE_END; +} + +/** + * id + * Extracts the module id from a header word. It's up to the caller to + * ensure the data parameter is a header word. + * + * @param header - A header word. + * @return the id of the module that produced the header. + */ +unsigned +MTDC::id(uint32_t header) +{ + return (header & MTDC_ID_MASK) >> MTDC_ID_SHIFT; +} +/** + * resolution + * Extracts the resolution field from a header word. + * + * @param header - The header word. It's up to the caller to ensure + * that word is in facts a header (isHeader). + * @return unsigne - the resolution code. + */ +unsigned +MTDC::resolution(uint32_t header) +{ + return (header & MTDC_RES_MASK) >> MTDC_RES_SHIFT; +} +/** + * wordCount + * Return the size of an event given a header word. + * + * @param header - the header word. The caller must have ensured this is a header. + * @return unsigned - The value of the word count field. + */ +unsigned +MTDC::wordCount(uint32_t header) +{ + return (header & MTDC_WORDS_MASK); +} + +/** + * isDataType16 + * @param word - A data word (caller must verify this has a MTDC_SIGNATURE_DATA). + * @return bool - true if the fixed part of the data word indicates the word represents + * 16 bits of time data. What this represents will depend on whether + * the next word is an event sync word or not. + */ +bool +MTDC::isDataType16(uint32_t word) +{ + return (word & MTDC_DATA_TYPE_MASK) == MTDC_DATA_TYPE_16; +} +/** + * channel + * Extract the channel number from a a data16 word: + * + * @param word - the data16 word. + * @return The channel number. + */ +unsigned +MTDC::channel(uint32_t data16) +{ + return (data16 & MTDC_CHANNEL_MASK) >> MTDC_CHANNEL_SHIFT; +} +/** + * time16 + * Extract the 16 bit time from a data16 word. This could be the entire time data + * or it might be the low order 16 bits of the time if in full time-stamping mode + * This depends on the type of the next word. + * + * @param data16 - The data 16 word. + * @return The 16 bits of time data. + */ +uint32_t +MTDC::time16(uint32_t data16) +{ + return (data16 & MTDC_TIME16_MASK); +} +/** + * isDataTypeEvtSyn + * Returns true if a data words is a trigger sync word. + * If this is the case the word provides a 16 bit sync word that is + * either the bottom 16 bits of the timestamp or the bottom 16 + * bits of an event counter. + * + * @param word - Word to test.] + * @return true if this is a trigger sync word. + */ +bool +MTDC::isDataTypeEvtSyn(uint32_t word) +{ + return (word & MTDC_DATA_TYPE_MASK) == MTDC_DATA_TYPE_EVTSYNC; +} +/** + * getSync16 + * Get the 16 bits of event synchronization information from the TDC. + * This could be 16 bits of time or it could be an event counter depending on the + * device setup + * + * @param sync16 - A data word that is known to be an event synch data word. + * @return the 16 bits of synch data. + */ +unsigned +MTDC::getSync16(uint32_t sync16) +{ + return sync16 & MTDC_EVENT_SYNC16_MASK; +} + +/** + * getData30 + * Get the 30 bits of data from the end of event data word. The meaning of these + * bits depends on the mode of the TDC. in timestmpa mode, this is the + * top 30 bits of the timestamp. For trigger matching mode, this is either the + * bottom 30 bits of the timestamp or the event counter depending on the marking type. + * + * @param end - The end of event word. + * @return - the 30 bits of data in this word. + */ +uint32_t +MTDC::getData30(uint32_t end) +{ + return (end & MTDC_TIMESTAMP_30_MASK); +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h 2014-10-24 12:02:08 UTC (rev 2201) @@ -0,0 +1,57 @@ +/****************************************************************************** +* +* 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 MTDCHelpers.h + * @brief Define unbound functions to help with MTDC32 decode. + * @author Ron Fox <fo...@ns...> + */ + +#ifndef __MTDCHELPERS_H +#define __MTDCHELPERS_H + +#ifndef __CRT_STDINT_H +#include <stdint.h> +#ifndef __CRT_STDINT_H +#define __CRT_STDINT_H +#endif +#endif + + +namespace MTDC { + uint32_t signature(uint32_t word); + bool isHeader(uint32_t word); + bool isData(uint32_t word); + bool isEnd(uint32_t word); + + unsigned id(uint32_t header); + unsigned resolution(uint32_t header); + unsigned wordCount(uint32_t header); + float psPerChannel(int resolution); + + bool isDataType16(uint32_t word); + unsigned channel(uint32_t data16); + uint32_t time16(uint32_t data16); + + bool isDataTypeEvtSyn(uint32_t word); + unsigned getSync16(uint32_t sync16); + + uint32_t getData30(uint32_t data30); + + +}; + +#endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-10-10 19:30:34 UTC (rev 2200) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-10-24 12:02:08 UTC (rev 2201) @@ -1,4 +1,4 @@ -INSTDIR=/usr/opt/spectcl/3.3 +INSTDIR=/usr/opt/spectcl/3.4 # Skeleton makefile for 3.3 @@ -19,7 +19,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: @@ -31,9 +31,9 @@ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ - CY2fCommand.o CFitY2FCommand.o CY3fCommand.o CFitY3FCommand.o + CY2fCommand.o CFitY2FCommand.o CY3fCommand.o CFitY3FCommand.o MTDCHelpers.o \ + CMTDC32Unpacker.o - # # Finally the makefile targets. # @@ -44,10 +44,10 @@ $(LDFLAGS) fsgui: - (cd filesource; make) +# (cd filesource; make) online: - (cd onlinesource; make) +# (cd onlinesource; make) clean: rm -f $(OBJECTS) SpecTcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-10-10 19:30:34 UTC (rev 2200) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-10-24 12:02:08 UTC (rev 2201) @@ -1,5 +1,5 @@ # This software is Copyright by the Board of Trustees of Michigan -# State University (c) Copyright 2009. +# 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: @@ -19,172 +19,56 @@ # Setup the standard scripted commandsin SpecTcl. # -tk appname SpecTcl +# Access SpecTcl Packages, +# Load splash and jpeg support: + +lappend auto_path $SpecTclHome/TclLibs +package require splash +package require img::jpeg + + + +set splash [splash::new -text 1 -imgfile $splashImage -progress 6 -hidemain 0] +splash::progress $splash {Loading button bar} 0 + puts -nonewline "Loading SpecTcl gui..." source $SpecTclHome/Script/gui.tcl puts "Done." +splash::progress $splash {Loading state I/O scripts} 1 + puts -nonewline "Loading state I/O scripts..." source $SpecTclHome/Script/fileall.tcl puts "Done." +splash::progress $splash {Loading formatted listing scripts} 1 + puts -nonewline "Loading formatted listing scripts..." source $SpecTclHome/Script/listall.tcl puts "Done." +splash::progress $splash {Loading gate copy scripts} 1 + puts -nonewline "Loading gate copy script procs..." source $SpecTclHome/Script/CopyGates.tcl puts "Done." +splash::progress $splash {Loading tkcon console} 1 + if {$tcl_platform(os) != "Windows NT"} { puts -nonewline "Loading TKCon console..." source $SpecTclHome/Script/tkcon.tcl puts "Done." } +splash::progress $splash {Loading SpecTcl Tree Gui} 1 + puts -nonewline "Starting treeparamgui..." -source $SpecTclHome/Script/newGui.tcl +source $SpecTclHome/Script/SpecTclGui.tcl puts " Done" -puts "Adding SpecTcl exec directory to auto_path" -set llnlSpecTcl [file dirname $argv0] -lappend auto_path $llnlSpecTcl +splash::progress $splash {SpecTcl ready for use} 1 -set here $llnlSpecTcl - -puts "done" - -tk appname SpecTcl-[exec hostname]-[pid] - -puts "Sourcing histogram config file" - - -source [file join $here spectclSetup.tcl] -puts "done" - - -# -# 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}} -} - - -sbind -all - -.gui.b update - -# - -# -puts -nonewline "Starting scaler display.." -set scalerWin [toplevel .scalers] -source /usr/opt/daq/current/TclLibs/ScalerDisplay/scaler.tcl -if {[file exists [file join ~/config scalerdisplay.tcl]]} { - source [file join ~/config scalerdisplay.tcl] -} -puts " done" - -# -# Adding the rates GUi to the scaler display and folder GUI: -# - -puts -nonewline "Adding rates GUI " -puts "Loading scripts from $here" -source [file join $here ratesGui.tcl] -puts Done. - -# -# Loading the rates.tcl file from ~/config if it exists: -# - -set ratesFile [file join ~ config rates.tcl] -if {[file exists $ratesFile]} { - puts -nonewline "Found rates file $ratesFile restoring it " - source $ratesFile - puts Done. -} -# -# Load the projection gui -# -puts -nonewline "Loading projection GUI" -source [file join $here project.tcl] -puts " Done" -# -# Source the multiplicity gates stuff: -# -puts -nonewline "Loading multiplicity gate selection GUI ..." -source [file join $here multiplicityGates.tcl] -# -# Put this is on the button bar.. -# -button .multgates -text {Neutron Gates} -command [list promptMultiplicityGates .mult] -pack .multgates -fill x -expand 1 -# -# And the gates menu: -# -.topmenu.gate add separator -.topmenu.gate add command -label {Neutron Gates...} \ - -command [list promptMultiplicityGates .mult] -puts Done - -# -# Load the figure of merit tcl code: -# -puts -nonewline "Loading FOM Tcl Scripts " -source [file join $here fom.tcl] -puts Done - - -puts -nonewline "Loading the file segment data source" - -source [file join $here filesource fsGui.tcl] -addFsGuiMenuElement -puts done - -puts -nonewline "Loading unsampled event source" -source [file join $here onlinesource datasource.tcl] -nosampleSource -puts done - -# -# Add plotting: -# - -puts -nonewline "Adding plotting interface.." - -# Not using these plots for now... - -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 +splash::config $splash -delay 2000 Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/filesource/CApplication.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/filesource/CApplication.cpp 2014-10-10 19:30:34 UTC (rev 2200) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/filesource/CApplication.cpp 2014-10-24 12:02:08 UTC (rev 2201) @@ -23,8 +23,8 @@ #include <string.h> #include <stdlib.h> #include <stdint.h> -#include <buftypes.h> -#include <buffer.h> +// #include <buftypes.h> +// #include <buffer.h> using namespace std; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-10-24 12:31:22
|
Revision: 2202 http://sourceforge.net/p/nsclspectcl/code/2202 Author: ron-fox Date: 2014-10-24 12:31:19 +0000 (Fri, 24 Oct 2014) Log Message: ----------- Progress coding Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 12:02:08 UTC (rev 2201) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 12:31:19 UTC (rev 2202) @@ -29,9 +29,49 @@ #include <string> #include <string.h> +/** + * operator() + * The event unpacker. An event is assumed to be a single multi hit event or + * a stream of timestamp events. + * + * @param rEvent - The raw event + * @param event - The event unpacked into an std::vector + * @param offset - Offset into 'event at which we start analyzing. + * @param pMap - Data for this module from the map command. + * @return unsigned int - Where the next processor should pick up processing. + */ +unsigned int +CMTDC32Unpacker::operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + // If neeced link in our extra data + if(!pMap->extraData) { + linkExtraData(pMap); + defineTreeParams(pMap); + } + // + std::vector<hitInfo> hits; + while(moreData(getLong(event, offset))) { + offset = unpackMTDC32Event(hits, event, offset); + } + // 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. + + + + + return offset; +} + /*------------------------------------------------------------------------------------- * Helpers */ Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp 2014-10-24 12:02:08 UTC (rev 2201) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.cpp 2014-10-24 12:31:19 UTC (rev 2202) @@ -23,6 +23,11 @@ #include "MTDCHelpers.h" #include "MTDC32.h" +static const float resToPs[10] = { + 0.0, 0.0, // 0,1 have no meaning + 3.9, 7.8, 15.6, 31.3, 62.5, 125, 250, 500 +}; + /* All functions are in the MTDC namespace */ /** @@ -90,7 +95,22 @@ { return (header & MTDC_RES_MASK) >> MTDC_RES_SHIFT; } + /** + * psPerChannel + * Given a valude from resolution above, turns that into a time + * calibration in terms of ps per channel. + * + * @param res - Resolution value from MTDC::resolution + * @return float - ps/channel. + */ +float +MTDC::psPerChannel(unsigned res) +{ + return resToPs[res]; +} + +/** * wordCount * Return the size of an event given a header word. * Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h 2014-10-24 12:02:08 UTC (rev 2201) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDCHelpers.h 2014-10-24 12:31:19 UTC (rev 2202) @@ -40,7 +40,7 @@ unsigned id(uint32_t header); unsigned resolution(uint32_t header); unsigned wordCount(uint32_t header); - float psPerChannel(int resolution); + float psPerChannel(unsigned resolution); bool isDataType16(uint32_t word); unsigned channel(uint32_t data16); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-10-24 16:23:28
|
Revision: 2204 http://sourceforge.net/p/nsclspectcl/code/2204 Author: ron-fox Date: 2014-10-24 16:23:25 +0000 (Fri, 24 Oct 2014) Log Message: ----------- Good compile on CMTDC32Unpacker.cpp Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 12:37:03 UTC (rev 2203) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 16:23:25 UTC (rev 2204) @@ -28,7 +28,19 @@ #include "MTDCHelpers.h" #include <string> #include <string.h> +#include <SpecTcl.h> +#include <Parameter.h> +#include <TCLInterpreter.h> +#include <TCLVariable.h> +#include <stdlib.h> +#include <tcl.h> +#include <stdio.h> +#include <assert.h> +#include <TreeParameter.h> +#include <limits.h> +std::vector<CParamMapCommand::AdcMapping* > CMTDC32Unpacker::m_MappingInfo; + /** * operator() * The event unpacker. An event is assumed to be a single multi hit event or @@ -51,11 +63,14 @@ if(!pMap->extraData) { linkExtraData(pMap); defineTreeParams(pMap); + m_MappingInfo.push_back(pMap); } // + pExtraData pD = reinterpret_cast<pExtraData>(pMap->extraData); + std::vector<hitInfo>& hits(pD->s_hits); + hits.clear(); - std::vector<hitInfo> hits; while(moreData(getLong(event, offset), pMap)) { offset = unpackMTDC32Event(hits, event, offset); } @@ -68,10 +83,9 @@ int hitcount[34]; // Number of hits already in each channel. memset(hitcount, 0, sizeof(hitcount)); - pExtraData pD = reinterpret_cast<pExtraData>(pMap->extraData); for (int i =0; i < hits.size(); i++) { int ch = hits[i].s_channel; - if (hitcount[ch] < pD->s_maxHits) { + 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_timePs[ch][h] = hits[i].s_timePs; @@ -81,7 +95,6 @@ } - return offset; } @@ -89,8 +102,90 @@ * Helpers */ +/** + * defineTreeParams + * Initializes the tree parameters in the extra data. + * The Tcl part of the configuration will have created a set of parameters + * whose ids are stored in the first 34 elements (at most) ofr the map element + * of pMap. The names of those parameters are used to generate the base names + * for tree paramter names by appending a string that is the type of parameter. + * e.g. if a parameter is named george, we create tree parameter names: + * * george.time for the raw time for each hit. + * * george.timePs for the calibrated time for each hit. + * * george.eventCorr for the event correlation data for each hit. + * + * @param pMap - Pointer to the map data produced by CParamMapCommand. + */ +void +CMTDC32Unpacker::defineTreeParams(CParamMapCommand::AdcMapping* pMap) +{ + SpecTcl* pApi = SpecTcl::getInstance(); + pExtraData pD = reinterpret_cast<pExtraData>(pMap->extraData); + + unsigned maxHits = pD->s_maxHits; + float low = pD->s_lowLim; + float hi = pD->s_hiLim; + for(int i =0; i < 34; i++) { + int id = pMap->map[i]; + if (id >= 0) { + CParameter* pParam = pApi->FindParameter(id); + if (pParam) { + std::string baseName = pParam->getName(); + + // raw time for now 0-maxint + + std::string name = baseName; + name += ".time"; + pD->s_time[i].Initialize(name, 0.0, INT_MAX, "channels", maxHits, 0 ); + + // Calibrated time uses low/hi + + name = baseName; + name+= ".timePs"; + pD->s_timePs[i].Initialize(name, low, hi, "Picoseconds", maxHits, 0); + + // Synch info 0-MAXINT + + name = baseName; + name += baseName + ".eventCorr"; + pD->s_timePs[i].Initialize(name, 0.0, INT_MAX, "channels", maxHits, 0); + } + } + } + + + CTreeParameter::BindParameters(); +} + /** + * linkExtraData + * Create the extra data associated with the module. + * * Allocates the data + * * Gets the maxhits from MTDCMaxHits(name) + * * Gets the low limit from MTDCLowLim(name) + * * Gets the high limit from MTDCHiLim(name) + * + * The tree parameters need to be created by invoking defineTreeParameters + * after the extra data has been created. + * + * @param pMap - The mapping data (with extraData not yet filled in. + */ +void +CMTDC32Unpacker::linkExtraData(CParamMapCommand::AdcMapping* pMap) +{ + assert(pMap->extraData == 0); + + pExtraData pData = new ExtraData; // because this constructs the tree parameter arrays. + pData->s_maxHits = getTclIntElement("MTDCMaxHits", pMap->name, "Getting the maximum hit count"); + pData->s_lowLim = getTclFloatElement("MTDCLowLim", pMap->name, "Getting the spectrum low limits"); + pData->s_hiLim = getTclFloatElement("MTDCHiLim", pMap->name, "Getting the spetrum high limits"); + + pMap->extraData = pData; + +} + +/** * unpackMTDC32Event * Unpack exactly one MTDC32 Event and put its hits in a larger hit array. * The idea behind this is that in timestamp mode an actual physics trigger can @@ -232,3 +327,96 @@ return (datum != 0xffffffff) && (MTDC::isHeader(datum)) && (MTDC::id(datum) == pMap->vsn); } +/** + * getTclElement + * Returns the value of a Tcl array element (string), calls throw Error if not able. + * + * @param name - name of the tcl array. + * @param index - Index into the array. + * @param doing - A string that is incorporated into any thrown errors. + * + * @return std::string - value of the Tcl variable. + */ +std::string +CMTDC32Unpacker::getTclElement(std::string name, std::string element, std::string doing) const +{ + SpecTcl* pApi = SpecTcl::getInstance(); + + CTCLVariable var(pApi->getInterpreter(), name, false); + const char* pStringValue = var.Get(TCL_LEAVE_ERR_MSG | TCL_GLOBAL_ONLY, + const_cast<char*>(element.c_str())); + if (!pStringValue) { + throwError("There does not seem to be any value for an array element %s", doing); + } + return std::string(pStringValue); +} + +/** + * getTclFloatElement + * Returns the value of a Tcl Array element that is required to contain a floating point + * value. Failures result in a call to throwError which in turn throws an exception. + * + * @param name - Name of the Tcl array. + * @param index - Index in to the array. + * @param doing - String that is encoded into errors that says what we are trying to fetch. + * + * @return float - the converted value of the array element. + */ +float +CMTDC32Unpacker::getTclFloatElement(std::string name, std::string index, std::string doing) const +{ + std::string stringValue = getTclElement(name, index, doing); + + const char* pStringValue = stringValue.c_str(); + char* endptr; + float result = strtof(pStringValue, &endptr); + if (endptr == pStringValue) { + throwError("Unable to convert a value to a float for %s", doing); + } + return result; +} +/** + * getIntElement + * Returns the value of a Tcl array element that is required to contain an integer value. + * Failures result in a call to throwError which, in turn, throws an exception. + * + * @param name - name of the array. + * @param index - Index of the element of the array. + * @param doing - A string that is used as part of an error message if there are problems. + * + */ +int +CMTDC32Unpacker::getTclIntElement(std::string name, std::string index, std::string doing) const +{ + std::string stringValue = getTclElement(name, index, doing); + const char* pStringValue = stringValue.c_str(); + char* endptr; + long result = strtol(pStringValue, &endptr, 0); + if (endptr == pStringValue) { + throwError("Not able to convert a value %s to an integer", doing); + } + return result; +} + +/** + * throwError + * Throws an std::string constructed from a format string and a second string + * that is sprintf'd into it. + * + * @param formatString - the sprintf format string. + * @param substString - the substitution string. + * @return - this function does not return. + * + */ +void +CMTDC32Unpacker::throwError(std::string formatString, std::string substString) const +{ + // Since C++ does not have the printf like stuff our simplest is to use sprintf. + // that requires, however that we figure out a max length: + + size_t totalLength = formatString.size() + substString.size() + 10; // Probably really only need e.g.2 + char target[totalLength]; + + snprintf(target, totalLength, formatString.c_str(), substString.c_str()); + throw std::string(target); +} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-24 12:37:03 UTC (rev 2203) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-24 16:23:25 UTC (rev 2204) @@ -94,15 +94,7 @@ uint32_t s_eventCorr; _hitInfo() : s_channel(0), s_rawTime(0), s_timePs(0.0), s_eventCorr(0.0) {} } hitInfo; -private: - // The cooked data goes here. - - - - - bool m_Initialized; - // _extraData used to construct the tree parameter arrays as well as to // limit the number of accepted hits. @@ -111,12 +103,14 @@ unsigned s_maxHits; float s_lowLim; float s_hiLim; - std::vector<hitInfo> hits; // Raw hit information if that's better for later bits of the event pipeline. + std::vector<hitInfo> s_hits; // Raw hit information if that's better for later bits of the event pipeline. CTreeParameterArray s_time[34]; CTreeParameterArray s_timePs[34]; CTreeParameterArray s_eventCorr[34]; } ExtraData, *pExtraData; + static std::vector<CParamMapCommand::AdcMapping*> m_MappingInfo; + // Canonicals: public: @@ -144,4 +138,9 @@ unsigned int offset); bool moreData(uint32_t datum, CParamMapCommand::AdcMapping* pMap); + std::string getTclElement(std::string name, std::string index, std::string doing) const; + float getTclFloatElement(std::string name, std::string index, std::string doing) const; + int getTclIntElement(std::string name, std::string index, std::string doing) const; + void throwError(std::string formatString, std::string substString) const; + }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-10-24 21:26:04
|
Revision: 2205 http://sourceforge.net/p/nsclspectcl/code/2205 Author: ron-fox Date: 2014-10-24 21:26:01 +0000 (Fri, 24 Oct 2014) Log Message: ----------- Got initial decoder working: Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-24 21:26:01 UTC (rev 2205) @@ -41,6 +41,9 @@ std::vector<CParamMapCommand::AdcMapping* > CMTDC32Unpacker::m_MappingInfo; +CMTDC32Unpacker::CMTDC32Unpacker() {} +CMTDC32Unpacker::~CMTDC32Unpacker() {} + /** * operator() * The event unpacker. An event is assumed to be a single multi hit event or @@ -148,8 +151,8 @@ // Synch info 0-MAXINT name = baseName; - name += baseName + ".eventCorr"; - pD->s_timePs[i].Initialize(name, 0.0, INT_MAX, "channels", maxHits, 0); + name += ".eventCorr"; + pD->s_eventCorr[i].Initialize(name, 0.0, INT_MAX, "channels", maxHits, 0); } } } @@ -225,7 +228,7 @@ unsigned datum = getLong(event, offset); - if(!MTDC::isDataType16(datum)) { + if(!MTDC::isData(datum) || !MTDC::isDataType16(datum)) { throw std::string("Expected a datum with 16 bits of time data was disappointed"); } offset += 2; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CStackUnpacker.cpp 2014-10-24 21:26:01 UTC (rev 2205) @@ -24,7 +24,12 @@ #include "CParamMapCommand.h" #include "CStackMapCommand.h" #include "CMASE.h" +#include "CHINP.h" +#include "CPSD.h" +#include "CV1729Unpacker.h" +#include "CMTDC32Unpacker.h" + #include <Event.h> #include <TCLAnalyzer.h> #include <Analyzer.h> @@ -51,6 +56,10 @@ static CV1x90Unpacker unpackV1x90; static CV977Unpacker unpackV977; static CMASE unpackMase; +static CHINP unpackHinp; +static CPSD unpackPsd; +static CV1729Unpacker unpackV1729; +static CMTDC32Unpacker unpackMTDC32; // table of unpackers for each type of module. @@ -61,7 +70,12 @@ &unpackMADC32, &unpackV1x90, &unpackV977, - &unpackMase + &unpackMase, + &unpack785, + &unpackHinp, + &unpackPsd, + &unpackV1729, + &unpackMTDC32 }; ////////////////////////////////////////////////////////////////////////////////// Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MTDC32.h 2014-10-24 21:26:01 UTC (rev 2205) @@ -38,7 +38,7 @@ #define MTDC_RES_MASK 0x0000f000 #define MTDC_RES_SHIFT 12 -// Resolutions in pico seconds given the resolution code. +// Resolutions in pico Mseconds given the resolution code. static float psPerChanel[10] = { 0.0, 0.0, /* 0,1 are not defined resolution values */ @@ -52,7 +52,7 @@ #define MTDC_SIGNATURE_DATA 0x00000000 #define MTDC_DATA_TYPE_MASK 0x3fc00000 -#define MTDC_DATA_TYPE_16 0x08000000 +#define MTDC_DATA_TYPE_16 0x04000000 #define MTDC_CHANNEL_MASK 0x003f0000 #define MTDC_CHANNEL_SHIFT 16 @@ -62,7 +62,7 @@ /* Extended timestamp has 16 bits of sync data in this type */ /* Synch data is either timestamp or event counter depending on format mode */ -#define MTDC_DATA_TYPE_EVTSYNC 0x09000000 +#define MTDC_DATA_TYPE_EVTSYNC 0x04800000 #define MTDC_EVENT_SYNC16_MASK 0X0000FFFF Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-10-24 21:26:01 UTC (rev 2205) @@ -1,7 +1,5 @@ INSTDIR=/usr/opt/spectcl/3.4 -# Skeleton makefile for 3.3 - include $(INSTDIR)/etc/SpecTcl_Makefile.include # If you have any switches that need to be added to the default c++ compilation @@ -32,7 +30,7 @@ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ CY2fCommand.o CFitY2FCommand.o CY3fCommand.o CFitY3FCommand.o MTDCHelpers.o \ - CMTDC32Unpacker.o + CMTDC32Unpacker.o CHINP.o CPSD.o CV1729Unpacker.o # # Finally the makefile targets. @@ -69,3 +67,274 @@ (cd onlinesource; make install DEST=$(DEST)/onlinesource) +# DO NOT DELETE + +C785Unpacker.o: C785Unpacker.h CModuleUnpacker.h CParamMapCommand.h +C785Unpacker.o: /usr/include/stdint.h /usr/include/features.h +CCbarCommand.o: CCbarCommand.h CMultiplicity.h /usr/include/stdint.h +CCbarCommand.o: /usr/include/features.h +CFitButton.o: CFitButton.h +CFitY2FCommand.o: CFitY2FCommand.h /usr/include/gsl/gsl_rng.h +CFitY2FCommand.o: /usr/include/stdlib.h /usr/include/features.h +CFitY2FCommand.o: /usr/include/alloca.h /usr/include/gsl/gsl_types.h +CFitY2FCommand.o: /usr/include/gsl/gsl_errno.h /usr/include/stdio.h +CFitY2FCommand.o: /usr/include/libio.h /usr/include/_G_config.h +CFitY2FCommand.o: /usr/include/wchar.h /usr/include/errno.h +CFitY2FCommand.o: /usr/include/gsl/gsl_inline.h +CFitY2FCommand.o: /usr/include/gsl/gsl_randist.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_complex_long_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_complex.h +CFitY2FCommand.o: /usr/include/gsl/gsl_check_range.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_long_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_long_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_complex.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_complex_long_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_complex_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_complex_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_complex_float.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_float.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_float.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_complex_float.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_ulong.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_ulong.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_long.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_long.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_uint.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_uint.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_int.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_int.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_ushort.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_ushort.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_short.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_short.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_uchar.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_uchar.h +CFitY2FCommand.o: /usr/include/gsl/gsl_vector_char.h +CFitY2FCommand.o: /usr/include/gsl/gsl_block_char.h +CFitY2FCommand.o: /usr/include/gsl/gsl_blas.h /usr/include/gsl/gsl_matrix.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_complex_long_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_complex_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_complex_float.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_long_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_double.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_float.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_ulong.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_long.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_uint.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_int.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_ushort.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_short.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_uchar.h +CFitY2FCommand.o: /usr/include/gsl/gsl_matrix_char.h +CFitY2FCommand.o: /usr/include/gsl/gsl_blas_types.h +CFitY2FCommand.o: /usr/include/gsl/gsl_cblas.h +CFitY2FCommand.o: /usr/include/gsl/gsl_multifit_nlin.h +CFitY2FCommand.o: /usr/include/gsl/gsl_math.h /usr/include/math.h +CFitY2FCommand.o: /usr/include/gsl/gsl_sys.h /usr/include/gsl/gsl_machine.h +CFitY2FCommand.o: /usr/include/limits.h /usr/include/gsl/gsl_precision.h +CFitY2FCommand.o: /usr/include/gsl/gsl_nan.h /usr/include/gsl/gsl_pow_int.h +CFitY2FCommand.o: /usr/include/gsl/gsl_minmax.h +CFitY3FCommand.o: CFitY3FCommand.h /usr/include/gsl/gsl_rng.h +CFitY3FCommand.o: /usr/include/stdlib.h /usr/include/features.h +CFitY3FCommand.o: /usr/include/alloca.h /usr/include/gsl/gsl_types.h +CFitY3FCommand.o: /usr/include/gsl/gsl_errno.h /usr/include/stdio.h +CFitY3FCommand.o: /usr/include/libio.h /usr/include/_G_config.h +CFitY3FCommand.o: /usr/include/wchar.h /usr/include/errno.h +CFitY3FCommand.o: /usr/include/gsl/gsl_inline.h +CFitY3FCommand.o: /usr/include/gsl/gsl_randist.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_complex_long_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_complex.h +CFitY3FCommand.o: /usr/include/gsl/gsl_check_range.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_long_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_long_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_complex.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_complex_long_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_complex_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_complex_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_complex_float.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_float.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_float.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_complex_float.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_ulong.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_ulong.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_long.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_long.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_uint.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_uint.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_int.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_int.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_ushort.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_ushort.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_short.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_short.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_uchar.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_uchar.h +CFitY3FCommand.o: /usr/include/gsl/gsl_vector_char.h +CFitY3FCommand.o: /usr/include/gsl/gsl_block_char.h +CFitY3FCommand.o: /usr/include/gsl/gsl_blas.h /usr/include/gsl/gsl_matrix.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_complex_long_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_complex_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_complex_float.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_long_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_double.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_float.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_ulong.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_long.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_uint.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_int.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_ushort.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_short.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_uchar.h +CFitY3FCommand.o: /usr/include/gsl/gsl_matrix_char.h +CFitY3FCommand.o: /usr/include/gsl/gsl_blas_types.h +CFitY3FCommand.o: /usr/include/gsl/gsl_cblas.h +CFitY3FCommand.o: /usr/include/gsl/gsl_multifit_nlin.h +CFitY3FCommand.o: /usr/include/gsl/gsl_math.h /usr/include/math.h +CFitY3FCommand.o: /usr/include/gsl/gsl_sys.h /usr/include/gsl/gsl_machine.h +CFitY3FCommand.o: /usr/include/limits.h /usr/include/gsl/gsl_precision.h +CFitY3FCommand.o: /usr/include/gsl/gsl_nan.h /usr/include/gsl/gsl_pow_int.h +CFitY3FCommand.o: /usr/include/gsl/gsl_minmax.h +CGetGateMultCmd.o: CGetGateMultCmd.h CMultiplicity.h /usr/include/stdint.h +CGetGateMultCmd.o: /usr/include/features.h +CGetMultCmd.o: CGetMultCmd.h CMultiplicity.h /usr/include/stdint.h +CGetMultCmd.o: /usr/include/features.h +CHINP.o: CHINP.h CModuleUnpacker.h CParamMapCommand.h /usr/include/stdint.h +CHINP.o: /usr/include/features.h /usr/include/stdlib.h /usr/include/alloca.h +CHINP.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h +CHINP.o: /usr/include/wchar.h +CLLNLUnpacker.o: CLLNLUnpacker.h /usr/include/stdint.h +CLLNLUnpacker.o: /usr/include/features.h CParamMapCommand.h +CMADC32Unpacker.o: CMADC32Unpacker.h CModuleUnpacker.h CParamMapCommand.h +CMADC32Unpacker.o: /usr/include/stdint.h /usr/include/features.h +CMASE.o: CMASE.h CModuleUnpacker.h CParamMapCommand.h /usr/include/stdint.h +CMASE.o: /usr/include/features.h /usr/include/string.h /usr/include/xlocale.h +CMASE.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h +CMASE.o: /usr/include/wchar.h +CMTDC32Unpacker.o: CMTDC32Unpacker.h CModuleUnpacker.h CParamMapCommand.h +CMTDC32Unpacker.o: /usr/include/stdint.h /usr/include/features.h MTDC32.h +CMTDC32Unpacker.o: MTDCHelpers.h /usr/include/string.h /usr/include/xlocale.h +CMTDC32Unpacker.o: /usr/include/stdlib.h /usr/include/alloca.h +CMTDC32Unpacker.o: /usr/include/stdio.h /usr/include/libio.h +CMTDC32Unpacker.o: /usr/include/_G_config.h /usr/include/wchar.h +CMTDC32Unpacker.o: /usr/include/assert.h /usr/include/limits.h +CModuleUnpacker.o: CModuleUnpacker.h CParamMapCommand.h +CMultiplicity.o: CMultiplicity.h /usr/include/stdint.h +CMultiplicity.o: /usr/include/features.h /usr/include/stdlib.h +CMultiplicity.o: /usr/include/alloca.h /usr/include/unistd.h +CMultiplicity.o: /usr/include/getopt.h /usr/include/time.h +CMultiplicity.o: /usr/include/xlocale.h /usr/include/stdio.h +CMultiplicity.o: /usr/include/libio.h /usr/include/_G_config.h +CMultiplicity.o: /usr/include/wchar.h /usr/include/assert.h +CNADC2530Unpacker.o: CNADC2530Unpacker.h CModuleUnpacker.h CParamMapCommand.h +CNADC2530Unpacker.o: /usr/include/stdint.h /usr/include/features.h +CPSD.o: CPSD.h CModuleUnpacker.h CParamMapCommand.h /usr/include/stdint.h +CPSD.o: /usr/include/features.h /usr/include/stdlib.h /usr/include/alloca.h +CPSD.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h +CPSD.o: /usr/include/wchar.h +CParamMapCommand.o: CParamMapCommand.h +CRateCommand.o: CRateCommand.h CRateList.h CRateProcessor.h +CRateCommand.o: /usr/include/stdint.h /usr/include/features.h +CRateEventProcessor.o: CRateEventProcessor.h /usr/include/stdint.h +CRateEventProcessor.o: /usr/include/features.h /usr/include/stdlib.h +CRateEventProcessor.o: /usr/include/alloca.h +CRateList.o: CRateList.h +CRateProcessor.o: CRateProcessor.h /usr/include/stdint.h +CRateProcessor.o: /usr/include/features.h CRateList.h +CStackMapCommand.o: CStackMapCommand.h CParamMapCommand.h +CStackUnpacker.o: CStackUnpacker.h /usr/include/stdint.h +CStackUnpacker.o: /usr/include/features.h CModuleUnpacker.h +CStackUnpacker.o: CParamMapCommand.h C785Unpacker.h CNADC2530Unpacker.h +CStackUnpacker.o: CMADC32Unpacker.h CV1x90Unpacker.h CV977Unpacker.h +CStackUnpacker.o: CStackMapCommand.h CMASE.h CHINP.h CPSD.h CV1729Unpacker.h +CStackUnpacker.o: CMTDC32Unpacker.h +CTotalMultCmd.o: CTotalMultCmd.h CMultiplicity.h /usr/include/stdint.h +CTotalMultCmd.o: /usr/include/features.h +CV1729Unpacker.o: CV1729Unpacker.h /usr/include/stdint.h +CV1729Unpacker.o: /usr/include/features.h /usr/include/stdio.h +CV1729Unpacker.o: /usr/include/libio.h /usr/include/_G_config.h +CV1729Unpacker.o: /usr/include/wchar.h /usr/include/string.h +CV1729Unpacker.o: /usr/include/xlocale.h +CV1x90Unpacker.o: CV1x90Unpacker.h /usr/include/stdint.h +CV1x90Unpacker.o: /usr/include/features.h /usr/include/string.h +CV1x90Unpacker.o: /usr/include/xlocale.h /usr/include/stdio.h +CV1x90Unpacker.o: /usr/include/libio.h /usr/include/_G_config.h +CV1x90Unpacker.o: /usr/include/wchar.h +CV977Unpacker.o: CV977Unpacker.h /usr/include/stdint.h +CV977Unpacker.o: /usr/include/features.h +CY2fCommand.o: CY2fCommand.h CMultiplicity.h /usr/include/stdint.h +CY2fCommand.o: /usr/include/features.h +CY3fCommand.o: CY3fCommand.h CMultiplicity.h /usr/include/stdint.h +CY3fCommand.o: /usr/include/features.h +MTDCHelpers.o: MTDCHelpers.h MTDC32.h +MySpecTclApp.o: MySpecTclApp.h CParamMapCommand.h CStackMapCommand.h +MySpecTclApp.o: CStackUnpacker.h /usr/include/stdint.h +MySpecTclApp.o: /usr/include/features.h CMultiplicity.h CRateCommand.h +MySpecTclApp.o: CRateEventProcessor.h CFitButton.h CTotalMultCmd.h +MySpecTclApp.o: CGetMultCmd.h CGetGateMultCmd.h CCbarCommand.h CY2fCommand.h +MySpecTclApp.o: CFitY2FCommand.h /usr/include/gsl/gsl_rng.h +MySpecTclApp.o: /usr/include/stdlib.h /usr/include/alloca.h +MySpecTclApp.o: /usr/include/gsl/gsl_types.h /usr/include/gsl/gsl_errno.h +MySpecTclApp.o: /usr/include/stdio.h /usr/include/libio.h +MySpecTclApp.o: /usr/include/_G_config.h /usr/include/wchar.h +MySpecTclApp.o: /usr/include/errno.h /usr/include/gsl/gsl_inline.h +MySpecTclApp.o: /usr/include/gsl/gsl_randist.h /usr/include/gsl/gsl_vector.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_complex_long_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_complex.h +MySpecTclApp.o: /usr/include/gsl/gsl_check_range.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_long_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_long_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_complex.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_complex_long_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_complex_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_complex_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_complex_float.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_float.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_float.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_complex_float.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_ulong.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_ulong.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_long.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_long.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_uint.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_uint.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_int.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_int.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_ushort.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_ushort.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_short.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_short.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_uchar.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_uchar.h +MySpecTclApp.o: /usr/include/gsl/gsl_vector_char.h +MySpecTclApp.o: /usr/include/gsl/gsl_block_char.h /usr/include/gsl/gsl_blas.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_complex_long_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_complex_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_complex_float.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_long_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_double.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_float.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_ulong.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_long.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_uint.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_int.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_ushort.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_short.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_uchar.h +MySpecTclApp.o: /usr/include/gsl/gsl_matrix_char.h +MySpecTclApp.o: /usr/include/gsl/gsl_blas_types.h +MySpecTclApp.o: /usr/include/gsl/gsl_cblas.h +MySpecTclApp.o: /usr/include/gsl/gsl_multifit_nlin.h +MySpecTclApp.o: /usr/include/gsl/gsl_math.h /usr/include/math.h +MySpecTclApp.o: /usr/include/gsl/gsl_sys.h /usr/include/gsl/gsl_machine.h +MySpecTclApp.o: /usr/include/limits.h /usr/include/gsl/gsl_precision.h +MySpecTclApp.o: /usr/include/gsl/gsl_nan.h /usr/include/gsl/gsl_pow_int.h +MySpecTclApp.o: /usr/include/gsl/gsl_minmax.h CY3fCommand.h CFitY3FCommand.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-10-24 21:26:01 UTC (rev 2205) @@ -103,8 +103,8 @@ CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); - RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); - RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); + // RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); + // RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); // RegisterEventProcessor(*(new CRateEventProcessor), "rate-stripchart"); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-10-24 21:26:01 UTC (rev 2205) @@ -68,7 +68,15 @@ source $SpecTclHome/Script/SpecTclGui.tcl puts " Done" +splash::progress $splash {Loading VMUSB Configuration file...} +set here [file dirname [info script]] +source [file join $here constants.tcl] +source [file join $here configFile.tcl] +source [file join $here spectclSetup.tcl] +set file [file join $::env(HOME) config daqconfig.tcl] +vmusbConfig $file + splash::progress $splash {SpecTcl ready for use} 1 splash::config $splash -delay 2000 Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl 2014-10-24 21:26:01 UTC (rev 2205) @@ -40,30 +40,19 @@ # # -# Define the device types so the decoder can be selected: +package provide vmusbconfigfile 1.0 +package require vmusbconstants -set typeCAEN 0; # CAEN V775,785,792,862 -set typeHYTEC 1; # Hytec NADC 2530. -set typeMADC32 2; # Mesytec MADC 32. -set typeTDC1x90 3; # CAEN V1x90. -set typeV977 4; # CAEN V977 input register. -set typeMase 5; # MASE XLM subsystem. -# For the multiplicity calculation we need to know about all of the MADC modules -# so that we can keep track of when we are done with a time interval. -# - -set madcIds [list] - # We create as well spectra for each single parameter, and corresponding # pairs of n's. -package provide configFile 1.0 # we will be maintaining a global array # array will be indexed by adc name. Each array will contain the # geo address assigned to the adc. +array set adcConfiguration [list]; # empty array. #----------------------------------------------------------------- # @@ -72,7 +61,8 @@ # proc configClear {} { global adcConfiguration - catch {unset adcConfiguration} + array set adcConfiguration [list] + } #------------------------------------------------------------------ # Read a configuration file. This is just a source. @@ -92,6 +82,7 @@ # presumably, the adcConfig will override this value later. # proc adcCreate tail { + puts "adcCreate $tail" global adcConfiguration set name [lindex $tail 0] @@ -114,9 +105,66 @@ } } } +#---------------------------------------------------------------- +# +# Configures a v1729 FADC. We're just looking for the +# -chanmask parameter which we'll put in this module's +# v1729channelMasks variable. +# +proc v1729config tail { + global v1729channelMasks + global v1729postTriggers + + set name [lindex $tail 0] + set options [lrange $tail 1 end] + puts "Tail: $options" + foreach {optname optval} $options { + if {$optname eq "-posttrigger"} { + set ::v1729postTriggers($name) $optval + } + } +} +#----------------------------------------------------------------- +# +# Create a v1729 and then process the configuration parameters. +# +proc v1729create tail { + global readoutDeviceType + global v1729channelMasks + + set name [lindex $tail 0] + + set ::adcConfiguration($name) -1 + set ::readoutDeviceType($name) $::typeV1729 + set ::v1729postTriggers($name) 64 + v1729config $tail +} + #------------------------------------------------------------------ # +# v1729 - processes the V1729 command. This requires additional +# data. Specifically we need to know the channel enables +# mask which will go into the global atrray +# v1729channelMasks(name). This is initialized the first time +# a module is seen to 0xf which enables all 4 channels. +# but can be modified by the -chnmask configuration switch. +# +proc v1729a args { + set subcommand [lindex $args 0] + set tail [lrange $args 1 end] + + if {$subcommand eq "create"} { + v1729create $tail + } + if {$subcommand eq "config"} { + v1729config $tail + } + +} + +#------------------------------------------------------------------ +# # v977 - Processes the v977 command, dispatches to the create/config # commands. # @@ -134,22 +182,82 @@ set ::readoutDeviceType($name) $::typeV977 } +#------------------------------------------------------------------ +# hinp Process the hinp command which configures the HINP XLM +# firmware/chip front end devices. +# +proc hinp args { + set subcommand [lindex $args 0] + set tail [lrange $args 1 end] + + if {$subcommand eq "create"} { + set name [lindex $tail 0] + set ::adcConfiguration($name) 0; # Change this to the -id later. + set ::readoutDeviceType($name) $::typeHINP + } +} + +#------------------------------------------------------------------ +# PSD Process the psd command which configures the PSD XLM +# firmware/chip front end devices. +# +proc psd args { + set subcommand [lindex $args 0] + set tail [lrange $args 1 end] + + if {$subcommand eq "create"} { + set name [lindex $tail 0] + set ::adcConfiguration($name) 0; # Change this to the -id later. + set ::readoutDeviceType($name) $::typePSD + } +} #------------------------------------------------------------------- +# +# caenv965 Process the caenv956 command which handles CAEN +# dual range qdc's. This is just the same as the +# adc command but the type is different. +# In fact we use the adcConfig proc to do our +# configuration magic. +# +proc caenv965 args { + set subcommand [lindex $args 0] + set tail [lrange $args 1 end] + + if {$subcommand eq "create"} { + set name [lindex $tail 0] + set ::adcConfiguration($name) 0 + set ::readoutDeviceType($name) $::typeCAENDual + + } + if {$subcommand eq "config"} { + adcConfig $tail + } +} +#------------------------------------------------------------------- # adc - processes the adc command dispatches to the create/config # commands. All other subcommands are no-ops. # proc adc args { + puts "adc $args" set subcommand [lindex $args 0] set tail [lrange $args 1 end] - + puts "Subcommand $subcommand tail: $tail" if {$subcommand eq "create"} { + puts "Create" adcCreate $tail - } + } if {$subcommand eq "config"} { + puts "config" adcConfig $tail } + puts "done" } +proc caenv792 args { + adc {*}$args +} + + #---------------------------------------------------------------- # The hytec command processes creation and configuration commands # for the hytec N2530 ADC. @@ -197,6 +305,7 @@ set name [lindex $args 1] set ::readoutDeviceType($name) $::typeMADC32 + # The config or create subcommand have the # -id config which sets the 'vsn' for this module. @@ -204,12 +313,39 @@ set ididx [lsearch -exact $args "-id"] if {$ididx != -1} { incr ididx - set id [lindex $args $ididx] - set ::adcConfiguration($name) $id - lappend ::madcIds $id + set ::adcConfiguration($name) [lindex $args $ididx] } + # Save the -resolution parameter in madcResolutions(name) + + set residx [lsearch -exact $args "-resolution"] + if {$residx != -1} { + incr residx + set ::madcResolutions($name) [lindex $args $residx] + } } } + +#-------------------------------------------------------------- +# mtdc - for the mtdc32 +# +proc mtdc args { + set subcommand [lindex $args 0] + set name [lindex $args 1] + + set ::readoutDeviceType($name) $::typeMTDC32 + + # create and config may have -id which sets the vsn. + + if {($subcommand eq "create") || ($subcommand eq "config")} { + set ididx [lsearch -exact $args "-id"] + if {$ididx != -1} { + incr ididx + set ::adcConfiguration($name) [lindex $args $ididx] + } + } +} + + #--------------------------------------------------------------- # # The tdc1x90 command processes the creation and @@ -322,45 +458,25 @@ } -#-------------------------------------------------------------- -# -# Common code for CBLT readout chains: -# Parameters: -# name - module name. -# params - The full set of command arguments to the chain's config command. -# -# - Extract the chain name. -# - If the params contains -modules extract the next list item -# and use it as the value for the chain's chainOrder entry. -# -proc chain {name params} { - set modIndex [lsearch -exact $params "-modules"] - if {$modIndex != -1} { - incr modIndex - set ::chainOrder($name) [lindex $params $modIndex] - } -} + #--------------------------------------------------------------- # We need to use this command to fill in the chainOrder array of # the order of modules in the chain. This allows the stack command # to accurately figure out the module order in the presence of # chains that aggregate several V785 readout # - +# - Extract the chain name. +# - If the args contains -modules extract the next list item +# and use it as the value for the chain's chainOrder entry. +# proc caenchain args { set name [lindex $args 1] - chain $name $args - + set modIndex [lsearch -exact $args "-modules"] + if {$modIndex != -1} { + incr modIndex + set ::chainOrder($name) [lindex $args $modIndex] + } } -#-------------------------------------------------------------- -# -# define an madcchain command.. really this is identical -# to the caenchain command: -# -proc madcchain args { - set name [lindex $args 1] - chain $name $args -} #--------------------------------------------------------------- # # For each of the stacks, the stack command must create a @@ -420,10 +536,17 @@ proc v830 args { } +proc v1495sc args { +} - proc marker args { } proc sis3804 args { -} \ No newline at end of file +} + +proc addtcldriver name { + proc $name args {} +} + + Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl 2014-10-24 16:23:25 UTC (rev 2204) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl 2014-10-24 21:26:01 UTC (rev 2205) @@ -1,3 +1,6 @@ +package provide vmusbsetup 1.0 +package require vmusbconstants +package require vmusbconfigfile # # Setup SpecTcl's unpacking. # This script sets up SpecTcl's auto unpack system for data @@ -50,30 +53,18 @@ } -puts "In SpecTcl Setup" +#puts "In SpecTcl Setup" +# +#set here [file dirname [info script]] +#source [file join $here configFile.tcl] -set here [file dirname [info script]] -source [file join $here configFile.tcl] +#puts "configFile sourced" -puts "configFile sourced" - configClear -puts "Configuration cleared" -if {[catch {configRead [file join ~ config daqconfig.tcl]} msg]} { - puts "Error in configuration file read: $msg" -} -puts "Configuration read" -set channelCount($typeCAEN) 4096 -set channelCount($typeHYTEC) 8192 -set channelCount($typeMADC32) 2048; # Currently only 12 chans. -set channelCount($typeTDC1x90) 16384; # for now this is the # of channels in a tdc spec -set channelCount($typeV977) 16; # for a bit mask spec -set channelCount($typeMase) 8192; # Spectrum channels for MASE. - #----------------------------------------------------------------------------- # Creates a 1-d spectrum. # @@ -83,7 +74,23 @@ set high [expr $channels-1] spectrum $paramname 1 $paramname [list [list $low $high $channels]] + treeparameter -create $paramname $low $high $channels ""; # we don't know the units. } +## +# createFreezeButton +# +# When the first v1729 is seen in the stack, the freeze button is created: +# +proc createFreezeButton {} { + if {![winfo exists .freeze]} { + set freezeFadcSpectra 0 + checkbutton .freeze -text "Freeze fadc spectra"\ + -variable freezeFadcSpectra \ + -onvalue 1 -offvalue 0 + pack .freeze + + } +} #---------------------------------------------------------------------------- @@ -150,6 +157,7 @@ parameter $pname $baseparam incr baseparam spectrum $pname 1 $pname "{[list $low $hi $chans]}" + treeparameter -create $pname $low $hi $chans "" } } @@ -186,6 +194,7 @@ # and the spectrum , a 16 bit bitmask spectrum. spectrum $parameterName b $parameterName {{0 15 16}} + treeparameter -create $parameterName 0 15 16 "" return $param } @@ -235,16 +244,266 @@ parameter $parameterName $param incr param makeSpectrum $parameterName $channels + } } } return $param } +#--------------------------------------------------------------------------- +# +# Build channel maps for the V1729 +# In this case, the channels are really place holders for +# spectra. +# parameters: +# param - Number of first available parametr. +# name - Name of the module we are managing. +# Returns: +# next available parameter number. +# +proc buildV1729Map {param name} { + global v1729postTriggers; # Post trigger value for time reorder. + global adcChannels; # Has parameter names. + # Make a parameter and 2048 2K spectra for each parameter. + + foreach paramName $adcChannels($name) { + parameter $paramName $param + for {set i 0} {$i < 2048} {incr i} { + set spectrumName [format %04d.%s $i $paramName] + spectrum $spectrumName 1 $paramName {{0 2047 2048}} + } + incr param + } + paramMap $name $::typeV1729 $v1729postTriggers($name) $adcChannels($name) + return $param +} + +# +# Hinp's unpacker takes a base name from +# adcChannels and takes the chip mapping from +# HINPChips +# +proc buildHINPMap {param module} { + set basename $::adcChannels($module) + set chipMap $::HINPChips($module) + set chanSize $::channelCount($::typeHINP) + incr chanSize -1 + set channels $::channelCount($::typeHINP) + + paramMap $basename $::typeHINP 0 [list] + foreach chip $chipMap { + for {set i 0} {$i < 16} {incr i} { + set EParamName \ + [format "%s.e.%02d.%02d" $basename $chip $i] + set TParamName \ + [format "%s.t.%02d.%02d" $basename $chip $i] + parameter $EParamName $param + incr param + parameter $TParamName $param + incr param + + spectrum $EParamName 1 $EParamName "{0 $chanSize $channels}" + spectrum $TParamName 1 $TParamName "{0 $chanSize $channels}" + + } + } + return $param +} + +# +# PSD's unpacker takes a base name from +# adcChannels and takes the chip mapping from +# PSDChips +# +proc buildPSDMap {param module} { + set basename $::adcChannels($module) + set chipMap $::PSDChips($module) + set chanSize $::channelCount($::typePSD) + incr chanSize -1 + set channels $::channelCount($::typePSD) + + paramMap $basename $::typePSD 0 [list] + foreach chip $chipMap { + for {set i 0} {$i < 16} {incr i} { + set AParamName \ + [format "%s.a.%02d.%02d" $basename $chip $i] + set BParamName \ + [format "%s.b.%02d.%02d" $basename $chip $i] + set CParamName \ + [format "%s.c.%02d.%02d" $basename $chip $i] + set TParamName \ + [format "%s.t.%02d.%02d" $basename $chip $i] + parameter $AParamName $param + incr param + parameter $BParamName $param + incr param + parameter $CParamName $param + incr param + parameter $TParamName $param + incr param + + spectrum $AParamName 1 $AParamName "{0 $chanSize $channels}" + spectrum $BParamName 1 $BParamName "{0 $chanSize $channels}" + spectrum $CParamName 1 $CParamName "{0 $chanSize $channels}" + spectrum $TParamName 1 $TParamName "{0 $chanSize $channels}" + + } + } + return $param +} #---------------------------------------------------------------------------- -# Build the channel maps, spectcl parameters and raw spectra from +# +# Build channels and maps for a CAEN Dual range module. +# the adc parameters give the base names for parameters .h and .l for +# high and low ranges respectively. +# Parameters: +# param - First parameter number to use. +# name - Name of the module. +# Returns: +# next unused parameter number. +# +proc buildCAENDualMap {param name} { + set vsn $::adcConfiguration($name) + set resolution $::channelCount($::typeCAEN) + set channels $::adcChannels($name) + + set parameterList [list] + + + + foreach parameter $channels { + parameter $parameter.h $param + makeSpectrum $parameter.h $resolution + lappend parameterList $parameter.h + incr param + + parameter $parameter.l $param + makeSpectrum $parameter.l $resolution + lappend parameterList $parameter.l + incr param + } + paramMap $name $::typeCAEN $vsn $parameterList + + return $param +} +#-------------------------------------------------------------------------- +# +# build spectra and channel maps for MADC32's the only hink here is that +# if it's set the madcResolutions($name) array element overrides +# channelCount($typeMADC32). +# +# Parameters: +# param - First free parameter. +# name - module name. +# Returns: +# next available parameter. +# +proc buildMADC32Map {param name} { + array set resolutions [list 2k 2048 4k 4096 4khires 4096 \ + 8k 8192 8khires 8192] + set resolution $::channelCount($::typeMADC32); # default resolution. + + if {[array names ::madcResolutions $name] ne ""} { + set resolution $resolutions($::madcResolutions($name)) + } + return [makeParamsSpectraAndMap $param $name $::typeMADC32 $::adcChannels($name) $resolution ] +} + +## +# makeMtdcParametersAndSpectra +# Creates the extra spectra associated with an MTDC32. +# Given a basename these are: +# * basename.time.0-(maxhits-1) +# * basename.timePs.0-(maxhits-1) +# * basename.eventCorr.0-(maxhits-1) +# +# @param param - first free parameter number. +# @param channels - base names of the parameters/spectra. +# @param maxhits - Depth of each tree param/spectrum 'array'. +# @param low - Spectrum axis low limit. +# @param high - Spectrum axis high limit. +# @param chans - number of channels in a spectrum. +# +# @note low high chans apply to the timePs spectrum. all others go from some (hopefully well) chose +# fixed limits. +# +proc makeMtdcParametersAndSpectra {param channels maxhits low hi chans} { + foreach name $channels { + if {$name ne ""} { + set param [makeMtdcParamSet $param $name $maxhits $low $hi $chans] + } + } + return $param +} +## +# makeMtdcParamSet +# See MakeMtdcParametersAndSpectra above. +# This does that for a single parameter basename. +# +proc makeMtdcParamSet {param baseName maxhits low hi chans} { + foreach typeName [list time timePs eventCorr] aSpecs [list {0 65536 256} [list $low $hi $chans] {0 65536 256}] { + for {set hit 0} {$hit < $maxhits} {incr hit} { + set fullName [format %s.%s.%d $baseName $typeName $hit] + parameter $fullName $param + incr param + spectrum $fullName 1 $fullName [list $aSpecs] + sbind $fullName + } + } + return $param +} + +#------------------------------------------------------------------ +# +# Build a simple parameter/spectrum set and channel maps: +# +# Parameters: +# param - first free parameter. +# name - Name of module. +# type - Module type. +# channels - Names of channels. +# resolution - Spectrum channel count. +# +proc makeParamsSpectraAndMap {param name type channels resolution} { + set vsn $::adcConfiguration($name) + + + # Make the parameters and spectra: + + foreach parameter $channels { + parameter $parameter $param + incr param + makeSpectrum $parameter $resolution + } + paramMap $name $type $vsn $channels + return $param + +} +#-------------------------------------------------------------------------- +# build a set of parameters not in the map and spectra for each that have +# arbitrary axis definitions: +# +# @param param first free parameter number. +# @param pnames list of parameter names. +# @param low low axis limit +# @param hi high axis limit. +# @param chans Number of channels. +# @return next free parameter number. +# +proc makeParamsAndSpectra {param pnames low hi chans} { + foreach p $pnames { + parameter $pname $param + incr param + spectrum $p 1 $p [list [list $low $hi $chans]] + } + return $param +} + +#---------------------------------------------------------------------------- +# build the channel maps, spectcl parameters and raw spectra from # the adcConfigurtion, readoutDeviceType and adcChannels information. -# This will all be driven by the adcCahnnels array. +# This will all be driven by the adcChannels array. # # Parameters: # param - the number of the first parameter. @@ -266,22 +525,36 @@ } elseif {$::readoutDeviceType($module) eq $::typeMase} { puts "MASE module" set param [buildMaseMap $param $module] + } elseif {$::readoutDeviceType($module) eq $::typeCAENDual} { + set param [buildCAENDualMap $param $module] + } elseif {$::readoutDeviceType($module) eq $::typeHINP} { + set param [buildHINPMap $param $module] + } elseif {$::readoutDeviceType($module) eq $::typePSD} { + set param [buildPSDMap $param $module] + } elseif {$::readoutDeviceType($module) eq $::typeMADC32} { + set param [buildMADC32Map $param $module] + } elseif {$::readoutDeviceType($module) eq $::typeV1729} { + set param [buildV1729Map $param $module] + createFreezeButton + } else { + set vsn $::adcConfiguration($module) set type $::readoutDeviceType($module) set resolution $::channelCount($type) set channels $::adcChannels($module) - - # Make the parameters and spectra: - - foreach parameter $channels { - if {$parameter ne ""} { - parameter $parameter $param - incr param - makeSpectrum $parameter $resolution - } + + set param [makeParamsSpectraAndMap $param $module $type $channels $resolution] + + # MTDC32's get more stuff: + + if {$type == $::typeMTDC32} { + puts "MTDC32 - special parameters and spectra" + makeMtdcParametersAndSpectra \ + $param $channels \ + $::MTDCMaxHits($module) $::MTDCLowLim($module) $::MTDCHiLim($module) $::MTDCChans($module) } - paramMap $module $type $vsn $channels + } } } @@ -310,14 +583,21 @@ # Setup SpecTcl # +proc vmusbConfig filename { + configRead $filename -puts "Building channel maps" -buildChannelMaps 20 -puts "Building stack maps" + puts "Building channel maps" + catch {buildChannelMaps 20} msg + puts $msg -buildStackMaps -puts "Binding spectra to Xamine" + puts "Building stack maps" + + catch {buildStackMaps} msg + puts $msg -sbind -all + puts "Binding spectra to Xamine" + + sbind -all +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-10-31 17:43:49
|
Revision: 2208 http://sourceforge.net/p/nsclspectcl/code/2208 Author: ron-fox Date: 2014-10-31 17:43:42 +0000 (Fri, 31 Oct 2014) Log Message: ----------- More development Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-31 17:43:42 UTC (rev 2208) @@ -67,6 +67,7 @@ linkExtraData(pMap); defineTreeParams(pMap); m_MappingInfo.push_back(pMap); + } // @@ -91,7 +92,6 @@ 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_timePs[ch][h] = hits[i].s_timePs; pD->s_eventCorr[ch][h] = hits[i].s_eventCorr; hitcount[ch]++; } @@ -101,6 +101,46 @@ return offset; } +/*-------------------------------------------------------------------------------- + * Methods not involved in event unpacking: + */ + +/** + * getModuleIds + * Return module ID list. + * + * @return std::vector<unsigned int> + */ +std::vector<unsigned int> +CMTDC32Unpacker::getModuleIds() +{ + std::vector<unsigned int> result; + for (int i = 0; i < m_MappingInfo.size(); i++) { + result.push_back(m_MappingInfo[i]->vsn); + } + return result; +} + +/** + * getRawHits + * Returns a reference to the vector with the raw hits for a tdc module + * + * @param id - The id of the tdc (Vsn). + * @return std::vector<hitInfo>& + * @throw std::string if there is no matching id. + */ +std::vector<CMTDC32Unpacker::hitInfo>& +CMTDC32Unpacker::getRawHits(unsigned moduleId) +{ + for (int i = 0 ; i < m_MappingInfo.size(); i++) { + if (moduleId == m_MappingInfo[i]->vsn) { + pExtraData p = reinterpret_cast<pExtraData>(m_MappingInfo[i]->extraData); + return p->s_hits; + } + } + throw std::string("No such module id in CMTDC32Unpacker::getRawHits"); +} + /*------------------------------------------------------------------------------------- * Helpers */ @@ -142,12 +182,6 @@ name += ".time"; pD->s_time[i].Initialize(name, 0.0, INT_MAX, "channels", maxHits, 0 ); - // Calibrated time uses low/hi - - name = baseName; - name+= ".timePs"; - pD->s_timePs[i].Initialize(name, low, hi, "Picoseconds", maxHits, 0); - // Synch info 0-MAXINT name = baseName; @@ -258,12 +292,11 @@ uint64_t topTime = MTDC::getData30(datum); rawTime |= (topTime << 16); - double timePs = (double)rawTime * psPerChan; hitInfo hit; - hit.s_channel = ch; - hit.s_rawTime = rawTime; - hit.s_timePs = timePs; - hit.s_eventCorr = syncInfo; + hit.s_channel = ch; + hit.s_rawTime = rawTime; + hit.s_timeCalibration = psPerChan; + hit.s_eventCorr = syncInfo; hits.push_back(hit); } else { @@ -271,18 +304,18 @@ // until the end of the event: hitInfo hit; - hit.s_channel = ch; - hit.s_rawTime = rawTime; - hit.s_timePs = (double)rawTime * psPerChan; + hit.s_channel = ch; + hit.s_rawTime = rawTime; + hit.s_timeCalibration = psPerChan; newHits.push_back(hit); // deal with data until we get something different. while (MTDC::isData(datum)) { hitInfo hit; - hit.s_channel =ch; - hit.s_rawTime = MTDC::time16(datum); - hit.s_timePs = (double)(hit.s_rawTime) * psPerChan; + hit.s_channel =ch; + hit.s_rawTime = MTDC::time16(datum); + hit.s_timeCalibration = (double)(hit.s_rawTime) * psPerChan; newHits.push_back(hit); offset +=2; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-31 17:43:42 UTC (rev 2208) @@ -21,6 +21,8 @@ * @brief Unpacker for Mesytec TDCs. * @author Ron Fox <fo...@ns...> */ +#ifndef _MTDC32UNPACKER_H +#define _MTDC32UNPACKER_H // Base class include @@ -46,7 +48,14 @@ #endif #endif +#ifndef __STL_MAP +#include <map> +#ifndef __STL_MAP +#define __STL_MAP +#endif +#endif + /** * @class CMTDC32Unpacker * This class is responsible for npacking the Mesytec MTDC32 32/34 channel TDC. @@ -90,9 +99,9 @@ typedef struct _hitInfo { unsigned s_channel; uint64_t s_rawTime; - double s_timePs; + double s_timeCalibration; uint32_t s_eventCorr; - _hitInfo() : s_channel(0), s_rawTime(0), s_timePs(0.0), s_eventCorr(0.0) {} + _hitInfo() : s_channel(0), s_rawTime(0), s_timeCalibration(0.0), s_eventCorr(0.0) {} } hitInfo; // _extraData used to construct the tree parameter arrays as well as to @@ -110,6 +119,7 @@ } ExtraData, *pExtraData; static std::vector<CParamMapCommand::AdcMapping*> m_MappingInfo; + // Canonicals: @@ -128,7 +138,8 @@ // methods to get at the raw unpacking: public: - std::vector<hitInfo>& getRawHits(unsigned moduleId); + static std::vector<unsigned int> getModuleIds(); + static std::vector<hitInfo>& getRawHits(unsigned moduleId); private: void defineTreeParams(CParamMapCommand::AdcMapping* pMap); @@ -143,4 +154,6 @@ int getTclIntElement(std::string name, std::string index, std::string doing) const; void throwError(std::string formatString, std::string substString) const; + }; +#endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-10-31 17:43:42 UTC (rev 2208) @@ -36,6 +36,7 @@ using namespace std; static const uint32_t WRAPADD(0x40000000); // Amount to add for a timestamp wrap. +static const uint64_t TDCWRAPADD(0x400000000000); // TDC time wrap amount. /* compute factorial function used in ynf calculations */ @@ -73,8 +74,10 @@ m_ROIS("multiplicity.ROIS", false), m_moduleIds("madcIds", false), m_timestamp("timestamp"), + m_highPstamp("timestampPS"), m_moduleID("moduleID"), m_bankNo("bankNo"), + m_matchTolerance("multiplicity.matchTolerance", 16, "ticks"), m_currentCycle(0), m_initialized(false) { @@ -109,6 +112,7 @@ establishTraces(*pInterp); + return kfTRUE; } catch(...) { @@ -167,6 +171,19 @@ m_Histogram.clear(); delete []m_currentCycle; + // Clear the TDC fragment queues in case there's something left over from last + // time around: + + TDCFragments::iterator p = m_tdcFragments.begin(); + while (p != m_tdcFragments.end()) { + p->second.clear(); // clear each vector. + + p++; + } + m_tdcFragments.clear(); + m_tdcWraps.clear(); + + m_currentCycleNumber = 0; m_currentCycle = new uint32_t[(int)((double)m_bins)]; memset(m_currentCycle, 0, m_bins * sizeof(uint32_t)); @@ -290,6 +307,23 @@ OnBegin(rAnalyzer, rDecoder); } + // First add the TDC data to our internal fragment queues. This + // ensures we can match up data from the MADC32 with the MTDC32 + // in order to produce a high precision time. + + std::vector<unsigned int> tdcIds = CMTDC32Unpacker::getModuleIds(); + for (int i =0; i < tdcIds.size(); i++) { + std::vector<CMTDC32Unpacker::hitInfo>& hits(CMTDC32Unpacker::getRawHits(tdcIds[i])); + if (hits.size()) { + std::list<CMTDC32Unpacker::hitInfo>& frags(m_tdcFragments[tdcIds[i]]); + frags.insert(frags.end(), hits.begin(), hits.end()); + } + } + + + + + // In order to process we need to have: // - A timestamp. // - A module id @@ -310,6 +344,16 @@ double rawTimestamp = (double)(m_timestamp); + // Now find the TDC fragment that matches with the MADC32 data we have. + // and set the highPstamp parameter associated with this event. + // this also means deal with the potential wrap. + // For matching we can only look at the bottom 16 bits of the raw timestamp. + + uint16_t madcTimestamp = ((uint32_t)(m_timestamp)) & 0xffff; + computeHighPrecisionTimestamp(madcTimestamp); + dropExtraMatchingFragments(madcTimestamp); + + pbankQueue pQueue = findQueue(module, bank); double timestamp = rawTimestamp + pQueue->s_wrapAdd; // Add all the wraps into the timestamp @@ -398,6 +442,7 @@ cyclesFile << "set multiplicity.mintime " << m_minTime.getValue() << std::endl; cyclesFile << "set multiplicity.frequency " << m_frequency.getValue() << std::endl; cyclesFile << "set multiplicity.cycleCount " << m_cycleCount.getValue() << std::endl; + cyclesFile << "set multiplicity.matchTolerance" << m_matchTolerance.getValue() << std::endl; // The gate names also get written to be complete. // The assumption is that multiplicity.ROIS is an array with contiguous integer indices @@ -462,6 +507,7 @@ Tcl_TraceVar(pInterp, "multiplicity.frequency", flags, CMultiplicity::varModified, this); Tcl_TraceVar(pInterp, "multiplicity.cycleCount", flags, CMultiplicity::varModified, this); Tcl_TraceVar(pInterp, "multiplicity.ROIS", flags | TCL_TRACE_UNSETS, CMultiplicity::varModified, this); + Tcl_TraceVar(pInterp, "multiplicity.matchTolerance", flags, CMultiplicity::varModified, this); } /** @@ -1235,3 +1281,92 @@ } +/** + * computeHighPrecisionTimestamp + * Figures out: + * * Which TDC fragment corresponds to this event. + * * What the full value of its raw calibrated timestamp is. + * * Sets the m_higPstamp value accordingly. + * @param madcStamp - Low 16 bits of the MADC timestamp we need to match. + * @note If there is no match we complain to the console but just leave + * m_higPstamp undefined. + * @note Bookkeeping needed to manage the wrap of the raw hit time is managed + * here too. + */ +void +CMultiplicity::computeHighPrecisionTimestamp(uint16_t madcStamp) +{ + unsigned tolerance = m_matchTolerance; + + TDCFragments::iterator p = m_tdcFragments.begin(); + while(p != m_tdcFragments.end()) { + if (!p->second.empty()) { + if(matchedTime(madcStamp, p->second.front(), tolerance)) { + + unsigned id = p->first; + unsigned ch = p->second.front().s_channel; + uint64_t rawTime = p->second.front().s_rawTime; + double calibration = p->second.front().s_timeCalibration; + + // Compute a channel identifier: + + unsigned channelIdent = id*34 + ch; // 34 because gates can click too. + TDCWrapTracker& tracker(m_tdcWraps[channelIdent]); + if (tracker.s_lastStamp > rawTime) { + tracker.s_wrapAdd += TDCWRAPADD; + } + // Adjust the wrap stuff. + + tracker.s_lastStamp = rawTime; + rawTime += tracker.s_wrapAdd; + + m_highPstamp = rawTime * calibration; // Time in picoseconds. + + p->second.pop_front(); + return; // Got one, done. + } + } + p++; + } + std::cerr << "Unable to find a matching TDC fragment!!\n"; +} +/** + * matchedTime + * @param adcStamp The MADC timestamp to match with. + * @param hit The MTDC hit info to check against. + * @param tolerance The allowed tolerancde in the match. + * + * @return bool - indicating match or not. + * + * @note due to the slight differences in start time, + * we allow differences in either direction. + */ +bool +CMultiplicity::matchedTime(uint16_t adcTime, CMTDC32Unpacker::hitInfo& hit, unsigned tolerance) +{ + uint16_t hitTime = hit.s_eventCorr; + if ((adcTime - hitTime) < tolerance) return true; + if ((hitTime - adcTime) < tolerance) return true; + + return false; +} +/** + * dropExtraMatchingFragments + * If there are other fragments that match this timestamp we get rid of them + * since the MADC gate widths are set so that there should be only one. + * @param adcTime -- The ADC time against which matching fragments get dropped. + */ +void +CMultiplicity::dropExtraMatchingFragments(uint16_t adcTime) +{ + TDCFragments::iterator p = m_tdcFragments.begin(); + while (p != m_tdcFragments.end()) { + // drop fragments until the queue is either empty or there's a non match: + + while(!p->second.empty() && matchedTime(adcTime, p->second.front(), m_matchTolerance)) { + p->second.pop_front(); + } + + p++; + } +} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-10-31 17:43:42 UTC (rev 2208) @@ -47,6 +47,20 @@ #endif #endif +#ifndef __STL_LIST +#include <list> +#ifndef __STL_LIST +#define __STL_LIST +#endif +#endif + +#ifndef __STL_MAP +#include <map> +#ifndef __STL_MAP +#define __STL_MAP +#endif +#endif + #ifndef __STL_STRING #incldue <string> #ifndef __STL_STRING @@ -70,7 +84,11 @@ #endif #endif +#ifndef _MTDC32UNPACKER_H +#include "CMTDC32Unpacker.h" +#endif + class CTCLInterpreter; class CGateContainer; class fstream; @@ -79,6 +97,7 @@ Assumptions: - Data from only one module is present in the event, which implies: - There's only a unique timestamp. + - There's only one matching hit in the TDC(s). Several tree parameters steer this: - 'bins' - (integer, no units) Number of bins in a cycle - 'minTime' - (floating nanoseconds) Minimum time per bin (defines the length of the cycle. @@ -124,7 +143,17 @@ {} } bankQueue, *pbankQueue; + typedef struct _TDCWrapTracker { + uint64_t s_lastStamp; + uint64_t s_wrapAdd; + _TDCWrapTracker() : s_lastStamp(0), s_wrapAdd(0) {} + } TDCWrapTracker, *pTDCWrapTracker; + typedef std::map<unsigned int, std::list<CMTDC32Unpacker::hitInfo> > TDCFragments; + typedef std::map<unsigned int, TDCWrapTracker> TDCWrapTrackers; + + + // Local data: private: CTreeVariable m_bins; @@ -134,8 +163,10 @@ CTCLVariable m_ROIS; CTCLVariable m_moduleIds; CTreeParameter m_timestamp; // The event parameter holding the timestamp. + CTreeParameter m_highPstamp; // The associated high precision timestamp in ps (created). CTreeParameter m_moduleID; // The module we are unpacking. CTreeParameter m_bankNo; + CTreeVariable m_matchTolerance; std::vector<CGateContainer*> m_Gates; uint32_t m_currentCycleNumber; @@ -145,8 +176,13 @@ bool m_initialized; // True if the run was initialized. + // MTDC Raw hit fragments map indexed by module id. + TDCFragments m_tdcFragments; + TDCWrapTrackers m_tdcWraps; + + // Canonicals public: CMultiplicity(); @@ -210,8 +246,10 @@ void processFragmentQueues(); void flushFragmentQueues(); void histogramFragment(pEventFragment pFrag); + void computeHighPrecisionTimestamp(uint16_t madcStamp); + bool matchedTime(uint16_t adcTime, CMTDC32Unpacker::hitInfo& hit, unsigned tolerance); + void dropExtraMatchingFragments(uint16_t adcTime); - }; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-10-31 17:43:42 UTC (rev 2208) @@ -103,7 +103,7 @@ CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); - // RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); + RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); // RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/configFile.tcl 2014-10-31 17:43:42 UTC (rev 2208) @@ -325,6 +325,7 @@ } } + #-------------------------------------------------------------- # mtdc - for the mtdc32 # @@ -477,6 +478,14 @@ set ::chainOrder($name) [lindex $args $modIndex] } } + +## +# Really the same as caenchain: +# +proc madcchain args { + caenchain {*}$args +} + #--------------------------------------------------------------- # # For each of the stacks, the stack command must create a Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl 2014-10-31 17:39:58 UTC (rev 2207) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl 2014-10-31 17:43:42 UTC (rev 2208) @@ -442,7 +442,7 @@ # This does that for a single parameter basename. # proc makeMtdcParamSet {param baseName maxhits low hi chans} { - foreach typeName [list time timePs eventCorr] aSpecs [list {0 65536 256} [list $low $hi $chans] {0 65536 256}] { + foreach typeName [list time eventCorr] aSpecs [list {0 65536 256} [list $low $hi $chans] {0 65536 256}] { for {set hit 0} {$hit < $maxhits} {incr hit} { set fullName [format %s.%s.%d $baseName $typeName $hit] parameter $fullName $param This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-10-31 22:32:14
|
Revision: 2209 http://sourceforge.net/p/nsclspectcl/code/2209 Author: ron-fox Date: 2014-10-31 22:32:09 +0000 (Fri, 31 Oct 2014) Log Message: ----------- I have a plan for event building...began implementing it. Committing CMultiplicity though I probably should not yet. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h branches/LLNLMadcChainSpecTcl-mtdcdev/mesytecmaps.h Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-10-31 22:32:09 UTC (rev 2209) @@ -0,0 +1,138 @@ +/****************************************************************************** +* +* 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 CEventBuilder.cpp + * @brief Event processor implementation + * @author Ron Fox <ro...@ca...> + */ + + + +#include "CEventBuilder.h" + +#include "mesytecmaps.h" // Defines relationships between channels. + + +/** + * constructor + * Pretty much initializes the tree parameter/variables: + */ + +CEventBuilder::CEventBuilder() : + m_buildWindow("evb.buildWindow", 16, "ticks"), + m_timestamp("timestamp"), + m_highPTimestamp("timestampPS"), + m_moduleID("moduleID"), + m_bankNo("bankNo"), + m_fInitialized(false) +{} +CEventBuilder::~CEventBuilder() {} + +/** + * OnBegin + * Called at the begin run + * * Clear the queues. + * + * @param rAnalzyer - reference to the controlling analyzer. + * @param rDecoder - reference to the decoder. + * + * @return Bool_t kfTRUE to continue processing. + */ +Bool_t +CEventBuilder::OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) +{ + for (int i =0; i < 34; i++) { + m_tdcHits[i].clear(); + } + for (int m = 0; m < 3; m++) { + for (int i =0; i < 32; i++) { + m_adcHits[i][m].clear(); + } + } + buildParameterMaps(); + m_fInitialized = true; +} + +/** + * operator() + * queues the data we have and attempts to build an event. + * + * @param pEvent - Raw event which we don't use. + * @param rEvent - Unpacked event which we do use. + * @param rAnalzyer - reference to the controlling analyzer. + * @param rDecoder - reference to the decoder. + * + * @note input data comes from the accumulated hits from the CMADC32Unpacker and the + * CMTDC32Unpacker. + */ +Bool_t +CEventBuilder:: operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + if (!m_fInitialized) { + OnBegin(rAnalyzer, rDecoder); + } + + // The logic here is very straightforward. + + queueEvent(); + if (buildEvent(rEvent)) { + return kfTRUE; + } else { + return kfFALSE; + } +} +/*------------------------------------------------------------------------------------ + * Utilities (private + */ + +/** + * queueEvent + * Takes the fragments from the CMADC32 and CMTDC32 Unpackers and puts them + * in the appropriate queues. + * Once done the fragment arrays for these unpackers are cleared. + */ +void +CEventBuilder::queueEvent() +{ + // The MADCs first: + + 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) { // only build using used parameters. + 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; + if(m_tdcParameters[ch] > 0) { + m_tdcHits[ch].push_back(mtdcHits[i]); + } + } + + CMTDC32Unpacker::clearAccumulatedHits(); +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-10-31 22:32:09 UTC (rev 2209) @@ -0,0 +1,131 @@ +/****************************************************************************** +* +* 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 CEventBuilder.h + * @brief Event processor to build events very specific to LLNL Neutrons program. + * @author Ron Fox <ro...@ca...> + */ + + +#ifndef __CEVENTBUILDER_H +#define __CEVENTBUILDER_H +#include <config.h> + +#ifndef __EVENTPROCESSOR_H +#include <EventProcessor.h> +#endif + +#ifndef __STL_LIST +#include <list> +#ifndef __STL_LIST +#define __STL_LIST +#endif +#endif + +#ifndef __STL_UTILITY +#include <utility> +#ifndef __STL_UTILITY +#define __STL_UTILITY +#endif +#endif + +#include "CMTDC32Unpacker.h" +#include "CMADC32Unpacker.h" +#include <TreeParameter.h> // Both tree parameters and tree variables. + + +/** + * @class CEventBuilder + * The purpose of this class is to build queues of event fragments and build them into + * cohesive events. If no event can be built, kfFalse is returned which aborts the event + * processing pipeline. If an event can be built it is marshalled into the appropriate + * tree parameters and kfTrue is returned allowing the next stages of the pipeline to run. + * + * Key features: + * * This is very specific to the LLNL MTDC32 neutrons application. + * * There is a queue per MTDC channel. + * * MADC Channels are in pairs one for an energy and one for a TAC + * * MTDC CHannels are one per energy/TAC pair. + * * Only 1/2 of the MADC channels are used...giving only 24 MTDC channels in use. + * * Event building knows the correspondence in a hardwared map that's internal to the implementation file. + * * queues are lists that are cleared in both OnBegin and OnEnd. + * * MADC lists are in an array indexed by module id and channel number. + * * MTDC lists are in an array indexed by channel number. + * * Implementation assumes there's only one of these. + */ +class CEventBuilder : public CEventProcessor +{ +private: + typedef std::list<CMTDC32Unpacker::hitInfo> TdcQueue; + typedef std::list<CMADC32Unpacker::hitInfo> AdcQueue; + + // information about wrapping the actual raw high resolution times: + + typedef struct _WrapTrack { + uint32_t m_lastStamp; + uint64_t m_wrapAdjust; + } WrapTrack; + + // Data: + +private: + TdcQueue m_tdcHits[34]; // Could be up to 34 channels. + AdcQueue m_adcHits[32][3]; // 3 modules with up to 32 channels depending on cabling. + CTreeVariable m_buildWindow; // Time ticks in the build window. + CTreeParameter m_timestamp; // Output tree parameter for the timestamp. + CTreeParameter m_highPTimestamp; // High precision timing from the TDC. + CTreeParameter m_moduleID; // ID of the ADC module in the built event. + CTreeParameter m_bankNo; // Bank number of the ADC module in the built event + + int m_adcParameters[32][3]; // Parameter numbers for the madc32. + int m_tdcParameters[34]; // ditto for the TDC. + bool m_fInitialized; + + // canonicals: +public: + CEventBuilder(); + virtual ~CEventBuilder(); + + // Event processor implementation: + +public: + virtual Bool_t OnBegin(CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Begin Run. + virtual Bool_t operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); + + + // Private Utilities: +private: + void queueEvent(); + bool buildEvent(CEvent& rEvent); + + void buildParameterMaps(); + + std::pair<int, int> adcQueuesForTdc(int tdcChannel); + int tdcQueueForAdc(int module, int channel); + int tacFromE(int module, int channel); + int eFromTac(int module, int channel); + void setAdcParameter(CMADC32Unpacker::hitInfo hit); + void setTdcParameter(CMTDC32Unpacker::hitInfo hit); + +}; + +#endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp 2014-10-31 22:32:09 UTC (rev 2209) @@ -57,6 +57,8 @@ static const uint32_t TRAILER_COUNTMASK(0x3fffffff); // trigger count or timestamp counter. +CMADC32Unpacker::hits CMADC32Unpacker::m_accumulatedHits; + ///////////////////////////////////////////////////////////////////////////// // Canonical functions. // @@ -143,6 +145,8 @@ unsigned long datum = getLong(event, offset); longsRead++; offset += 2; + hits eventHits; // Hits to be added to the accumulated hits: + while (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_DATA) { bool overflow = (datum & DATA_ISOVERFLOW) != 0; if (!overflow) { @@ -153,6 +157,8 @@ if (id != -1) { rEvent[id] = value; } + hitInfo hit = {id, channel, value, 0}; // Don't yet know the timestamp: + eventHits.push_back(hit); } datum = getLong(event, offset); longsRead++; @@ -167,9 +173,18 @@ 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 { @@ -188,3 +203,20 @@ } return offset; } + +/** + * @return reference to the accumulated hits array: + */ +CMADC32Unpacker::hits& +CMADC32Unpacker::getAccumulatedHits() +{ + return m_accumulatedHits; +} +/** + * Clear the accumulated hits: + */ +void +CMADC32Unpacker::clearAccumulatedHits() +{ + m_accumulatedHits.clear(); +} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.h 2014-10-31 22:32:09 UTC (rev 2209) @@ -21,6 +21,15 @@ #include "CModuleUnpacker.h" #endif +#ifndef __STL_VECTOR +#include <vector> +#ifndef __STL_VECTOR +#define __STL_VECTOR +#endif +#endif + +#include <stdint.h> + class CTreeParameter; /*! This module is responsible for unpacking the Mesytec MADC-32 32 channel ADC. @@ -37,10 +46,22 @@ */ class CMADC32Unpacker : public CModuleUnpacker { +public: + typedef struct _hitInfo { + unsigned s_moduleId; + unsigned s_channel; + uint32_t s_energy; + uint32_t s_eventCorr; + } hitInfo, *pHitInfo; + typedef std::vector<hitInfo> hits; + private: CTreeParameter& m_timestamp; // Parameter holding the timestamp. CTreeParameter& m_moduleID; // Parameter holding the module ID of the current event CTreeParameter& m_bankNo; // Parameter holding the bank number of the module for the current event. + + static hits m_accumulatedHits; + // canonicals: public: CMADC32Unpacker(); @@ -54,6 +75,8 @@ unsigned int offset, CParamMapCommand::AdcMapping* pMap); + static hits& getAccumulatedHits(); + static void clearAccumulatedHits(); }; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-10-31 22:32:09 UTC (rev 2209) @@ -39,7 +39,7 @@ #include <TreeParameter.h> #include <limits.h> -std::vector<CParamMapCommand::AdcMapping* > CMTDC32Unpacker::m_MappingInfo; +std::vector<CMTDC32Unpacker::hitInfo> CMTDC32Unpacker::m_accumulatedHits; CMTDC32Unpacker::CMTDC32Unpacker() {} CMTDC32Unpacker::~CMTDC32Unpacker() {} @@ -66,16 +66,17 @@ if(!pMap->extraData) { linkExtraData(pMap); defineTreeParams(pMap); - m_MappingInfo.push_back(pMap); } // pExtraData pD = reinterpret_cast<pExtraData>(pMap->extraData); - std::vector<hitInfo>& hits(pD->s_hits); - hits.clear(); + std::vector<hitInfo> hits; - while(moreData(getLong(event, offset), pMap)) { + // Only do one event so that data can be pushed through the event + // builder. + + if (moreData(getLong(event, offset), pMap)) { offset = unpackMTDC32Event(hits, event, offset); } // If our last word was 0xffffffff need to skip it too: @@ -97,7 +98,10 @@ } } + // Add the hits to the accumulated hits: + m_accumulatedHits.insert(m_accumulatedHits.end(), hits.begin(), hits.end()); + return offset; } @@ -106,41 +110,22 @@ */ /** - * getModuleIds - * Return module ID list. - * - * @return std::vector<unsigned int> + * getAccumulatedHits + * @return reference to m_accumulatedHits */ -std::vector<unsigned int> -CMTDC32Unpacker::getModuleIds() +std::vector<CMTDC32Unpacker::hitInfo>& +CMTDC32Unpacker::getAccumulatedHits() { - std::vector<unsigned int> result; - for (int i = 0; i < m_MappingInfo.size(); i++) { - result.push_back(m_MappingInfo[i]->vsn); - } - return result; + return m_accumulatedHits; } -/** - * getRawHits - * Returns a reference to the vector with the raw hits for a tdc module - * - * @param id - The id of the tdc (Vsn). - * @return std::vector<hitInfo>& - * @throw std::string if there is no matching id. - */ -std::vector<CMTDC32Unpacker::hitInfo>& -CMTDC32Unpacker::getRawHits(unsigned moduleId) +void +CMTDC32Unpacker::clearAccumulatedHits() { - for (int i = 0 ; i < m_MappingInfo.size(); i++) { - if (moduleId == m_MappingInfo[i]->vsn) { - pExtraData p = reinterpret_cast<pExtraData>(m_MappingInfo[i]->extraData); - return p->s_hits; - } - } - throw std::string("No such module id in CMTDC32Unpacker::getRawHits"); + m_accumulatedHits.clear(); } + /*------------------------------------------------------------------------------------- * Helpers */ Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.h 2014-10-31 22:32:09 UTC (rev 2209) @@ -97,6 +97,7 @@ // Information for a tdc hit - across all MTDC32's in the setup. typedef struct _hitInfo { + unsigned s_module; unsigned s_channel; uint64_t s_rawTime; double s_timeCalibration; @@ -112,15 +113,15 @@ unsigned s_maxHits; float s_lowLim; float s_hiLim; - std::vector<hitInfo> s_hits; // Raw hit information if that's better for later bits of the event pipeline. CTreeParameterArray s_time[34]; CTreeParameterArray s_timePs[34]; CTreeParameterArray s_eventCorr[34]; } ExtraData, *pExtraData; - static std::vector<CParamMapCommand::AdcMapping*> m_MappingInfo; - + private: + static std::vector<hitInfo> m_accumulatedHits; + // Canonicals: public: @@ -138,8 +139,8 @@ // methods to get at the raw unpacking: public: - static std::vector<unsigned int> getModuleIds(); - static std::vector<hitInfo>& getRawHits(unsigned moduleId); + static std::vector<hitInfo>& getAccumulatedHits(); + static void clearAccumulatedHits(); private: void defineTreeParams(CParamMapCommand::AdcMapping* pMap); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-10-31 22:32:09 UTC (rev 2209) @@ -133,9 +133,12 @@ */ Bool_t -CMultiplicity:: OnBegin(CAnalyzer& rAnalyzer, +CMultiplicity::OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { + m_eventCounter = 0; + + // Locate the gates and get pointers to their // containers so that we can check them in the event processor: @@ -256,6 +259,8 @@ m_initialized = false; + // + } /*! @@ -306,6 +311,7 @@ if (!m_initialized) { OnBegin(rAnalyzer, rDecoder); } + m_eventCounter++; // First add the TDC data to our internal fragment queues. This // ensures we can match up data from the MADC32 with the MTDC32 @@ -442,7 +448,7 @@ cyclesFile << "set multiplicity.mintime " << m_minTime.getValue() << std::endl; cyclesFile << "set multiplicity.frequency " << m_frequency.getValue() << std::endl; cyclesFile << "set multiplicity.cycleCount " << m_cycleCount.getValue() << std::endl; - cyclesFile << "set multiplicity.matchTolerance" << m_matchTolerance.getValue() << std::endl; + cyclesFile << "set multiplicity.matchTolerance " << m_matchTolerance.getValue() << std::endl; // The gate names also get written to be complete. // The assumption is that multiplicity.ROIS is an array with contiguous integer indices @@ -1328,7 +1334,7 @@ } p++; } - std::cerr << "Unable to find a matching TDC fragment!!\n"; + std::cerr << "Unable to find a matching TDC fragment event number: " << m_eventCounter << std::endl; } /** * matchedTime @@ -1348,6 +1354,16 @@ if ((adcTime - hitTime) < tolerance) return true; if ((hitTime - adcTime) < tolerance) return true; + // Its also possible the larger time has wrapped relative to the smaller time: + + uint32_t wrapped = adcTime; + wrapped += 0x10000; + if ((wrapped - hitTime) < tolerance) return true; + + wrapped = hitTime; + wrapped += 0x10000; + if ((wrapped - adcTime) < tolerance) return true; + return false; } /** Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-10-31 22:32:09 UTC (rev 2209) @@ -181,8 +181,12 @@ TDCFragments m_tdcFragments; TDCWrapTrackers m_tdcWraps; + // event counter...for debugging. + unsigned m_eventCounter; + + // Canonicals public: CMultiplicity(); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-10-31 17:43:42 UTC (rev 2208) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-10-31 22:32:09 UTC (rev 2209) @@ -27,10 +27,11 @@ CRateProcessor.o CRateList.o CRateCommand.o CFitButton.o \ CStackMapCommand.o CModuleUnpacker.o C785Unpacker.o CNADC2530Unpacker.o \ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ - CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ + CV1x90Unpacker.o CV977Unpacker.o CMASE.o \ CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ CY2fCommand.o CFitY2FCommand.o CY3fCommand.o CFitY3FCommand.o MTDCHelpers.o \ - CMTDC32Unpacker.o CHINP.o CPSD.o CV1729Unpacker.o + CMTDC32Unpacker.o CHINP.o CPSD.o CV1729Unpacker.o CEventBuilder.o \ + CMultiplicity.o # # Finally the makefile targets. Added: branches/LLNLMadcChainSpecTcl-mtdcdev/mesytecmaps.h =================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-11-07 15:14:36
|
Revision: 2210 http://sourceforge.net/p/nsclspectcl/code/2210 Author: ron-fox Date: 2014-11-07 15:14:22 +0000 (Fri, 07 Nov 2014) Log Message: ----------- First clean compilation of complete CEventBuilder.{cpp,h} Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-10-31 22:32:09 UTC (rev 2209) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-07 15:14:22 UTC (rev 2210) @@ -23,9 +23,18 @@ #include "CEventBuilder.h" -#include "mesytecmaps.h" // Defines relationships between channels. +#include <Event.h> +#include "CParamMapCommand.h" +#include <fstream> + +// Unpacker codes. + +static const int MADC32Unpacker(2); +static const int MTDC32Unpacker(10); +static const std::string relationshipFilename("mesytecrelationships.txt"); + /** * constructor * Pretty much initializes the tree parameter/variables: @@ -56,10 +65,14 @@ { for (int i =0; i < 34; i++) { m_tdcHits[i].clear(); + m_tdcWrapping[i].s_lastStamp = 0; + m_tdcWrapping[i].s_wrapAdjust = 0; } for (int m = 0; m < 3; m++) { - for (int i =0; i < 32; i++) { + 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; } } buildParameterMaps(); @@ -91,7 +104,9 @@ // The logic here is very straightforward. queueEvent(); - if (buildEvent(rEvent)) { + buildEvents(); + + if (outputEvent(rEvent)) { return kfTRUE; } else { return kfFALSE; @@ -136,3 +151,473 @@ CMTDC32Unpacker::clearAccumulatedHits(); } +/** + * buildEvents + * For each time event at the front of a time queue, we will check the front of + * the corresponding MADC queues (TAC and E) for matching events. + * If one or more of the matching MADC queues is empty it's not big deal, + * that means that the match has not yet been processed from the buffer. + * If, however, there are events at the front of the corresponding queues that don't + * match in time we have a problem. See matchOrRecover for more. + * Correctly built events are added to the m_builtEventQueue from which they can be output. + * @note - all events that can be built will be built, though, given the structure of the event data + * I imagine that atmost one can be built at a time. + */ +void +CEventBuilder::buildEvents() +{ + 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); + } + + } + } +} +/** + * outputEvent + * If there's at least one event in the m_builtEvents queue emit it to the + * next stage of processing. + * + * @param rEvent - the unpacked event. + * @return bool - true if an event was emitted. + * + * @param note - the tree parameters are also filled in too. + */ +bool +CEventBuilder::outputEvent(CEvent& rEvent) +{ + 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; + + paramId = m_adcParameters[event.s_MADCTiming.s_channel][event.s_MADCTiming.s_moduleId]; + rEvent[paramId] = event.s_MADCTiming.s_energy; + + paramId = m_tdcParameters[event.s_MTDCTiming.s_channel]; + rEvent[paramId] = event.s_MTDCTiming.s_rawTime; + + // Now the tree parameters; We als handle correcting for time wraps in the MADC and + // in the MTDC times as well as computing the actual MTDC timestamp in picoseconds. + + m_timestamp = computeAdcTimestamp(event); + m_highPTimestamp = computeTdcTimestamp(event); + m_moduleID = event.s_Energy.s_moduleId; + m_bankNo = (event.s_Energy.s_channel < 16) ? 0 : 1; + + // Indicate that we did build an event. + + return true; + + + } else { + return false; + } +} + +/** + * 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. + * + * 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. + * + * @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. + * + */ +void +CEventBuilder::matchOrRecover(std::pair<int, int> equeue, std::pair <int, int> tacqueue, int mtdcqueue) +{ + bool done = false; + while(!done) { + // To continue there must still be elements in all queues: + + if ((!m_adcHits[equeue.first][equeue.second].empty()) && (!m_adcHits[tacqueue.first][tacqueue.second].empty()) && + (!m_tdcHits[mtdcqueue].empty())) { + // Let's pull out references to the hits: + + CMADC32Unpacker::hitInfo& eHit(m_adcHits[equeue.first][equeue.second].front()); + CMADC32Unpacker::hitInfo& tacHit(m_adcHits[tacqueue.first][tacqueue.second].front()); + CMTDC32Unpacker::hitInfo& tdcHit(m_tdcHits[mtdcqueue].front()); + + if(matchingHits(eHit, tacHit, tdcHit)) { + BuiltEvent e = {eHit, tacHit, tdcHit}; + m_builtEvents.push_back(e); + m_adcHits[equeue.first][equeue.second].pop_front(); + m_adcHits[tacqueue.first][tacqueue.second].pop_front(); + m_tdcHits[mtdcqueue].pop_front(); + } else { + // Recover from mismatch: + + 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. + + } + + } else { + 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. + * + * @param ehit - The MADC32 energy hit. + * @param tachit - The MADC32 TAC hit. + * @param tdchit - The MTDC32 timing hit. + * + * @return bool true if these three hits match, false otherwise. + */ +bool +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: + + 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: + + if ((madcStamp - tdcStamp) < tolerance) return true; + if ((tdcStamp - madcStamp) < tolerance) return true; + + // 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; + } else { + return false; + } + // If we fall here, there's no match: + + return false; +} +/** + * recoverMADCQueues + * 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 + * is a match or one of the queues is empty. + * + * @param equeue - Specifies the energy queue. + * @param tacqueue - Specifies the TAC queue. + */ +void +CEventBuilder::recoverMADCQueues(std::pair<int, int> equeue, std::pair <int, int> tacqueue) +{ + // 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: + + if (e.front().s_eventCorr == tac.front().s_eventCorr) { + e.pop_front(); + tac.pop_front(); + return; + } + // NO match in the front so drop oldest elements until we can get a match or one of the queues + // emptied: + + 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' + * Given an ADC hit compute its timestamp: + * - If the raw timestampt value is less than the last one, + * the wrap must be adjusted up. + * - Add the current wrap value to the raw timestamp. + * + * @param event - A built event. Note that the ADC's by nature must have + * the same timestamp. + * @return uint64_t the full computed timestamp. + */ +uint64_t +CEventBuilder::computeAdcTimestamp(CEventBuilder::BuiltEvent& event) +{ + // Use the energy event: + + uint64_t rawTimestamp = event.s_Energy.s_eventCorr; + unsigned module = event.s_Energy.s_moduleId; + unsigned bank = event.s_Energy.s_channel/2; // 0 or 1. + + 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_lastStamp = rawTimestamp; + return rawTimestamp + m_adcWrapping[bank][module].s_wrapAdjust; + +} +/** + * computeTdcTimestamp + * Same as above but for a TDC timestamp. + * + * @param event - a built event. + * @return double - the final timeatamp in picoseconds from the zero time. + */ +double +CEventBuilder::computeTdcTimestamp(CEventBuilder::BuiltEvent& event) +{ + uint64_t rawTimestamp = event.s_MTDCTiming.s_rawTime; + unsigned channel = event.s_MTDCTiming.s_channel; + + if (rawTimestamp < m_tdcWrapping[channel].s_lastStamp) { + m_tdcWrapping[channel].s_wrapAdjust += 0x400000000000; + } + rawTimestamp += m_tdcWrapping[channel].s_wrapAdjust; // full wraw timestamp. + + return (static_cast<double>(rawTimestamp) * event.s_MTDCTiming.s_timeCalibration); +} +/** + * adcQueuesForTdc + * Given a TDC channel number returns the the corresponding ADC queues. + * This is just a pair of simple lookups: + * + * @param tdcChannel - The TDC channel number. + * @return std::pair<std::pair<int, int> std::pair<int, int> > - Specifies in order the + * energy and TAC queues that correspond to the specified TDC. For each + * element, the .first item is the madc channel number and the .second + * the module number. + */ +std::pair<std::pair<int, int>, std::pair<int, int> > +CEventBuilder:: adcQueuesForTdc(int tdcChannel) +{ + std::pair<std::pair<int, int>, std::pair<int, int> > result; + result.first = std::pair<int, int>(m_EFromTDC[tdcChannel]); + result.second = std::pair<int, int>(m_TACFromTDC[tdcChannel]); + + return result; +} +/** + * tdcQeueuForAdc + * tdcQueueForAdc + * Given and ADC queue specification (TAC or E) figures out the + * corresponding TDC queue. + * + * @param module MADC Module + * @param channel MADC CHannel + * @return int - TDC channel number (queue number). + * + */ +int +CEventBuilder::tdcQueueForAdc(int module, int channel) +{ + return m_TDCFromMADC[channel][module]; +} + +/** + * tacFromE + * Looks up the TAC MADC queue spec from an E MADC queue spec. + * + * @param module - MADC module. + * @param chan - MADC Channel + * @return std::pair<int, int> The channel, module number of the corresponding + * MADC channel. + */ +std::pair<int, int> +CEventBuilder::tacFromE(int module, int channel) +{ + return m_tacFromE[channel][module]; +} +/** + * eFromTac + * Looks of the MADC queue for an E corresponding to a TAC. + * + * @param module - the module number. + * @param channel - the channel. + * @return std::pair<int, int> - queue spec. + */ +std::pair<int, int> +CEventBuilder::eFromTac(int module, int channel) +{ + return m_eFromTAC[channel][module]; +} + + +/** + * buildParameterMaps + * Build all of the map arrays: + * - m_adcParameters - The parameter ids for each madc parameter. + * - m_tdcParameters - The parameter ids for each TDC parameter. + * - m_EFromTDC - TDC -> MADC E map. + * - m_TACFromTDC - TDC -> MADC TAC map. + * - m_TDCFromMADC - MADC -> TDC map. + * - m_tacFromE - MADC E -> TAC map. + * - m_eFromTAC - MADC TAC -> E Map. + */ +void +CEventBuilder::buildParameterMaps() +{ + // Iterate throught the parameter maps and transfer the information for the MADC and MTDC maps: + + CParamMapCommand::ParameterMap& map(CParamMapCommand::getMap()); + CParamMapCommand::ParameterMapIterator p = map.begin(); + while (p != map.end()) { + CParamMapCommand::AdcMapping* pMapping = &(p->second); + + // Madc32 module: + + if (pMapping->type == MADC32Unpacker) { + int module = pMapping->vsn; // Require vsn to be 0,1, 2 + for (int i = 0; i < 32; i++) { + m_adcParameters[i][module] = pMapping->map[i]; + } + } + // MTDC32 module: + + if (pMapping->type == MTDC32Unpacker) { + for (int i = 0; i < 32; i++) { + m_tdcParameters[i] = pMapping->map[i]; + } + } + + p++; + } + // Open Read the module/channel relationships and fill them in: + + readRelationships(); + +} + +/** + * readRelationships + * Reads the file that defines the relationships between MADC and TDC channels. + * + * This file has three sections: + * + * MTDC -> E/TAC: + * This section consists of 5 numbers per line, 34 lines. The first number is + * an MTDC Channel number. The next pair are the module/channel of the E ADC + * the pair following that are the module/channel of the TAC ADC. + * If there is no correspondence both values should be -1. + * + * MADC -> TDC + * This section consists of 3*32 lines. Each line consists of 3 numbers. + * The first two numbers are an MADC module and channel. The third number + * is the TDC channel that is linked to that MADC channel. -1 means there is no + * linkage. + * + * E <-> TAC + * This section contains lines to the eof each line is 4 numbgers the first two numbers + * are a module/channel for an E madc channel. + * The second pair the module/channel for the corresponding TAC channel. + * The section terminates with a sentinell record that has -1 for the first value. + * + * + * @note - there's no error checking at all here!?! + * + */ +void +CEventBuilder::readRelationships() +{ + std::ifstream in(relationshipFilename.c_str()); + + + // MTC -> E/TAC + + for (int i =0; i < 34; i++) { + int mtdc, Emodule, Echan, Tmodule, Tchan; + + in >> mtdc >> Emodule >> Echan >> Tmodule >>Tchan; + m_EFromTDC[mtdc] = std::pair<int, int>(Echan, Emodule); + m_TACFromTDC[mtdc] = std::pair<int, int>(Tchan, Tmodule); + } + // MADC -> TDC + + for (int i =0; i < 3*32; i++) { + int module, chan, tdc; + in >> module >> chan >> tdc; + m_TDCFromMADC[chan][module] = tdc; + } + // E <-> TAC + + // Init all items to no correspondence: + + std::pair<int, int> no(-1, -1); + for (int m = 0; m < 3; m++) { + for (int c = 0; c < 32; c++) { + m_tacFromE[c][m] = no; + m_eFromTAC[c][m] = no; + } + } + while(1) { + int emodule, echan, tmodule, tchan; + + in >> emodule >> echan >> tmodule >> tchan; + if (emodule == -1) break; // End sentinell. + m_tacFromE[echan][emodule] = std::pair<int, int>(tchan, tmodule); + m_eFromTAC[tchan][tmodule] = std::pair<int, int>(tmodule, tchan); + + } + +} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-10-31 22:32:09 UTC (rev 2209) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-11-07 15:14:22 UTC (rev 2210) @@ -73,29 +73,61 @@ private: typedef std::list<CMTDC32Unpacker::hitInfo> TdcQueue; typedef std::list<CMADC32Unpacker::hitInfo> AdcQueue; - + + // Events get build into an output queue that contains the two ADC and + // the one TDC that + + typedef struct _builtEvent { + CMADC32Unpacker::hitInfo s_Energy; + CMADC32Unpacker::hitInfo s_MADCTiming; + CMTDC32Unpacker::hitInfo s_MTDCTiming; + } BuiltEvent, *pBuiltEvent; + + + typedef std::list<BuiltEvent> OutputEventQueue; + + + // information about wrapping the actual raw high resolution times: typedef struct _WrapTrack { - uint32_t m_lastStamp; - uint64_t m_wrapAdjust; + uint32_t s_lastStamp; + uint64_t s_wrapAdjust; } WrapTrack; // Data: private: TdcQueue m_tdcHits[34]; // Could be up to 34 channels. - AdcQueue m_adcHits[32][3]; // 3 modules with up to 32 channels depending on cabling. + AdcQueue m_adcHits[32][3]; // 3 modules with 32 chans. + OutputEventQueue m_builtEvents; // Fully built events. + CTreeVariable m_buildWindow; // Time ticks in the build window. CTreeParameter m_timestamp; // Output tree parameter for the timestamp. CTreeParameter m_highPTimestamp; // High precision timing from the TDC. CTreeParameter m_moduleID; // ID of the ADC module in the built event. CTreeParameter m_bankNo; // Bank number of the ADC module in the built event + + WrapTrack m_adcWrapping[2][3]; /* Each adc has 2 banks each with a common stamp. */ + WrapTrack m_tdcWrapping[34]; /* 34 channels...due to ordering each with independent stamp. */ + bool m_fInitialized; + + + // Parameter number maps: int m_adcParameters[32][3]; // Parameter numbers for the madc32. int m_tdcParameters[34]; // ditto for the TDC. - bool m_fInitialized; + + // Maps from one device to the other: + std::pair<int, int> m_EFromTDC[34]; + int m_TDCFromMADC[32][3]; + + std::pair<int, int> m_TACFromTDC[34]; + std::pair<int, int> m_tacFromE[32][3]; + std::pair<int, int> m_eFromTAC[32][3]; + + // canonicals: public: CEventBuilder(); @@ -114,18 +146,33 @@ // Private Utilities: private: + + // Related to event building: + void queueEvent(); - bool buildEvent(CEvent& rEvent); + 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); + + // Not directly related t event building. + + uint64_t computeAdcTimestamp(BuiltEvent& event); + double computeTdcTimestamp(BuiltEvent& event); + + void buildParameterMaps(); + void readRelationships(); - std::pair<int, int> adcQueuesForTdc(int tdcChannel); + std::pair<std::pair<int, int>, std::pair<int, int> > adcQueuesForTdc(int tdcChannel); int tdcQueueForAdc(int module, int channel); - int tacFromE(int module, int channel); - int eFromTac(int module, int channel); - void setAdcParameter(CMADC32Unpacker::hitInfo hit); - void setTdcParameter(CMTDC32Unpacker::hitInfo hit); + std::pair<int, int> tacFromE(int module, int channel); + std::pair<int, int> eFromTac(int module, int channel); + + }; #endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-11-07 19:03:44
|
Revision: 2211 http://sourceforge.net/p/nsclspectcl/code/2211 Author: ron-fox Date: 2014-11-07 19:03:35 +0000 (Fri, 07 Nov 2014) Log Message: ----------- * Final debugging of the event builder. * Revert multiplicity * Add event builder to the analysis pipeline -- it feeds the multiplicity calculator. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-07 19:03:35 UTC (rev 2211) @@ -77,6 +77,14 @@ } buildParameterMaps(); m_fInitialized = true; + + + // Clear the built queue too: + + m_builtEvents.clear(); + + + } /** @@ -131,7 +139,8 @@ 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) { // only build using used parameters. + 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]); } } @@ -144,7 +153,8 @@ for (int i =0; i < mtdcHits.size(); i++) { int ch = mtdcHits[i].s_channel; - if(m_tdcParameters[ch] > 0) { + 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]); } } @@ -221,8 +231,12 @@ m_timestamp = computeAdcTimestamp(event); m_highPTimestamp = computeTdcTimestamp(event); m_moduleID = event.s_Energy.s_moduleId; - m_bankNo = (event.s_Energy.s_channel < 16) ? 0 : 1; + m_bankNo = event.s_Energy.s_moduleId*2 + (event.s_Energy.s_channel < 16) ? 0 : 1; + // remove the event from the queue: + + m_builtEvents.pop_front(); + // Indicate that we did build an event. return true; @@ -264,7 +278,8 @@ * @param mtdcqueue - Identifies the mtdc queue involved. * */ -void + +void CEventBuilder::matchOrRecover(std::pair<int, int> equeue, std::pair <int, int> tacqueue, int mtdcqueue) { bool done = false; @@ -284,7 +299,8 @@ m_builtEvents.push_back(e); m_adcHits[equeue.first][equeue.second].pop_front(); m_adcHits[tacqueue.first][tacqueue.second].pop_front(); - m_tdcHits[mtdcqueue].pop_front(); + m_tdcHits[mtdcqueue].pop_front(); + } else { // Recover from mismatch: @@ -300,6 +316,7 @@ done = true; // Can't build if there's an empty queue. } } + } @@ -520,6 +537,18 @@ { // Iterate throught the parameter maps and transfer the information for the MADC and MTDC maps: + // Initialize the parameter maps to undefined: + + for (int m = 0; m < 3; m++) { + for (int i =0; i < 32; i++) { + m_adcParameters[i][m] = -1; + } + } + for (int i =0; i < 34; i++) { + m_tdcParameters[i] = -1; + } + + CParamMapCommand::ParameterMap& map(CParamMapCommand::getMap()); CParamMapCommand::ParameterMapIterator p = map.begin(); while (p != map.end()) { @@ -536,7 +565,7 @@ // MTDC32 module: if (pMapping->type == MTDC32Unpacker) { - for (int i = 0; i < 32; i++) { + for (int i = 0; i < 34; i++) { m_tdcParameters[i] = pMapping->map[i]; } } @@ -605,7 +634,7 @@ std::pair<int, int> no(-1, -1); for (int m = 0; m < 3; m++) { - for (int c = 0; c < 32; c++) { + for (int c = 0; c < 32; c++) {\ m_tacFromE[c][m] = no; m_eFromTAC[c][m] = no; } @@ -616,7 +645,7 @@ in >> emodule >> echan >> tmodule >> tchan; if (emodule == -1) break; // End sentinell. m_tacFromE[echan][emodule] = std::pair<int, int>(tchan, tmodule); - m_eFromTAC[tchan][tmodule] = std::pair<int, int>(tmodule, tchan); + m_eFromTAC[tchan][tmodule] = std::pair<int, int>(echan, emodule); } Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-11-07 19:03:35 UTC (rev 2211) @@ -108,7 +108,7 @@ CTreeParameter m_moduleID; // ID of the ADC module in the built event. CTreeParameter m_bankNo; // Bank number of the ADC module in the built event - WrapTrack m_adcWrapping[2][3]; /* Each adc has 2 banks each with a common stamp. */ + WrapTrack m_adcWrapping[2][3]; /* Each adc has 2 banks each with a common stamp. */ WrapTrack m_tdcWrapping[34]; /* 34 channels...due to ordering each with independent stamp. */ bool m_fInitialized; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMADC32Unpacker.cpp 2014-11-07 19:03:35 UTC (rev 2211) @@ -157,7 +157,7 @@ if (id != -1) { rEvent[id] = value; } - hitInfo hit = {id, channel, value, 0}; // Don't yet know the timestamp: + hitInfo hit = {pMap->vsn, channel, value, 0}; // Don't yet know the timestamp: eventHits.push_back(hit); } datum = getLong(event, offset); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-11-07 19:03:35 UTC (rev 2211) @@ -36,7 +36,6 @@ using namespace std; static const uint32_t WRAPADD(0x40000000); // Amount to add for a timestamp wrap. -static const uint64_t TDCWRAPADD(0x400000000000); // TDC time wrap amount. /* compute factorial function used in ynf calculations */ @@ -74,10 +73,8 @@ m_ROIS("multiplicity.ROIS", false), m_moduleIds("madcIds", false), m_timestamp("timestamp"), - m_highPstamp("timestampPS"), m_moduleID("moduleID"), m_bankNo("bankNo"), - m_matchTolerance("multiplicity.matchTolerance", 16, "ticks"), m_currentCycle(0), m_initialized(false) { @@ -112,7 +109,6 @@ establishTraces(*pInterp); - return kfTRUE; } catch(...) { @@ -133,12 +129,9 @@ */ Bool_t -CMultiplicity::OnBegin(CAnalyzer& rAnalyzer, +CMultiplicity:: OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { - m_eventCounter = 0; - - // Locate the gates and get pointers to their // containers so that we can check them in the event processor: @@ -174,19 +167,6 @@ m_Histogram.clear(); delete []m_currentCycle; - // Clear the TDC fragment queues in case there's something left over from last - // time around: - - TDCFragments::iterator p = m_tdcFragments.begin(); - while (p != m_tdcFragments.end()) { - p->second.clear(); // clear each vector. - - p++; - } - m_tdcFragments.clear(); - m_tdcWraps.clear(); - - m_currentCycleNumber = 0; m_currentCycle = new uint32_t[(int)((double)m_bins)]; memset(m_currentCycle, 0, m_bins * sizeof(uint32_t)); @@ -259,8 +239,6 @@ m_initialized = false; - // - } /*! @@ -311,25 +289,7 @@ if (!m_initialized) { OnBegin(rAnalyzer, rDecoder); } - m_eventCounter++; - // First add the TDC data to our internal fragment queues. This - // ensures we can match up data from the MADC32 with the MTDC32 - // in order to produce a high precision time. - - std::vector<unsigned int> tdcIds = CMTDC32Unpacker::getModuleIds(); - for (int i =0; i < tdcIds.size(); i++) { - std::vector<CMTDC32Unpacker::hitInfo>& hits(CMTDC32Unpacker::getRawHits(tdcIds[i])); - if (hits.size()) { - std::list<CMTDC32Unpacker::hitInfo>& frags(m_tdcFragments[tdcIds[i]]); - frags.insert(frags.end(), hits.begin(), hits.end()); - } - } - - - - - // In order to process we need to have: // - A timestamp. // - A module id @@ -350,16 +310,6 @@ double rawTimestamp = (double)(m_timestamp); - // Now find the TDC fragment that matches with the MADC32 data we have. - // and set the highPstamp parameter associated with this event. - // this also means deal with the potential wrap. - // For matching we can only look at the bottom 16 bits of the raw timestamp. - - uint16_t madcTimestamp = ((uint32_t)(m_timestamp)) & 0xffff; - computeHighPrecisionTimestamp(madcTimestamp); - dropExtraMatchingFragments(madcTimestamp); - - pbankQueue pQueue = findQueue(module, bank); double timestamp = rawTimestamp + pQueue->s_wrapAdd; // Add all the wraps into the timestamp @@ -448,7 +398,6 @@ cyclesFile << "set multiplicity.mintime " << m_minTime.getValue() << std::endl; cyclesFile << "set multiplicity.frequency " << m_frequency.getValue() << std::endl; cyclesFile << "set multiplicity.cycleCount " << m_cycleCount.getValue() << std::endl; - cyclesFile << "set multiplicity.matchTolerance " << m_matchTolerance.getValue() << std::endl; // The gate names also get written to be complete. // The assumption is that multiplicity.ROIS is an array with contiguous integer indices @@ -513,7 +462,6 @@ Tcl_TraceVar(pInterp, "multiplicity.frequency", flags, CMultiplicity::varModified, this); Tcl_TraceVar(pInterp, "multiplicity.cycleCount", flags, CMultiplicity::varModified, this); Tcl_TraceVar(pInterp, "multiplicity.ROIS", flags | TCL_TRACE_UNSETS, CMultiplicity::varModified, this); - Tcl_TraceVar(pInterp, "multiplicity.matchTolerance", flags, CMultiplicity::varModified, this); } /** @@ -1287,102 +1235,3 @@ } -/** - * computeHighPrecisionTimestamp - * Figures out: - * * Which TDC fragment corresponds to this event. - * * What the full value of its raw calibrated timestamp is. - * * Sets the m_higPstamp value accordingly. - * @param madcStamp - Low 16 bits of the MADC timestamp we need to match. - * @note If there is no match we complain to the console but just leave - * m_higPstamp undefined. - * @note Bookkeeping needed to manage the wrap of the raw hit time is managed - * here too. - */ -void -CMultiplicity::computeHighPrecisionTimestamp(uint16_t madcStamp) -{ - unsigned tolerance = m_matchTolerance; - - TDCFragments::iterator p = m_tdcFragments.begin(); - while(p != m_tdcFragments.end()) { - if (!p->second.empty()) { - if(matchedTime(madcStamp, p->second.front(), tolerance)) { - - unsigned id = p->first; - unsigned ch = p->second.front().s_channel; - uint64_t rawTime = p->second.front().s_rawTime; - double calibration = p->second.front().s_timeCalibration; - - // Compute a channel identifier: - - unsigned channelIdent = id*34 + ch; // 34 because gates can click too. - TDCWrapTracker& tracker(m_tdcWraps[channelIdent]); - if (tracker.s_lastStamp > rawTime) { - tracker.s_wrapAdd += TDCWRAPADD; - } - // Adjust the wrap stuff. - - tracker.s_lastStamp = rawTime; - rawTime += tracker.s_wrapAdd; - - m_highPstamp = rawTime * calibration; // Time in picoseconds. - - p->second.pop_front(); - return; // Got one, done. - } - } - p++; - } - std::cerr << "Unable to find a matching TDC fragment event number: " << m_eventCounter << std::endl; -} -/** - * matchedTime - * @param adcStamp The MADC timestamp to match with. - * @param hit The MTDC hit info to check against. - * @param tolerance The allowed tolerancde in the match. - * - * @return bool - indicating match or not. - * - * @note due to the slight differences in start time, - * we allow differences in either direction. - */ -bool -CMultiplicity::matchedTime(uint16_t adcTime, CMTDC32Unpacker::hitInfo& hit, unsigned tolerance) -{ - uint16_t hitTime = hit.s_eventCorr; - if ((adcTime - hitTime) < tolerance) return true; - if ((hitTime - adcTime) < tolerance) return true; - - // Its also possible the larger time has wrapped relative to the smaller time: - - uint32_t wrapped = adcTime; - wrapped += 0x10000; - if ((wrapped - hitTime) < tolerance) return true; - - wrapped = hitTime; - wrapped += 0x10000; - if ((wrapped - adcTime) < tolerance) return true; - - return false; -} -/** - * dropExtraMatchingFragments - * If there are other fragments that match this timestamp we get rid of them - * since the MADC gate widths are set so that there should be only one. - * @param adcTime -- The ADC time against which matching fragments get dropped. - */ -void -CMultiplicity::dropExtraMatchingFragments(uint16_t adcTime) -{ - TDCFragments::iterator p = m_tdcFragments.begin(); - while (p != m_tdcFragments.end()) { - // drop fragments until the queue is either empty or there's a non match: - - while(!p->second.empty() && matchedTime(adcTime, p->second.front(), m_matchTolerance)) { - p->second.pop_front(); - } - - p++; - } -} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-11-07 19:03:35 UTC (rev 2211) @@ -47,20 +47,6 @@ #endif #endif -#ifndef __STL_LIST -#include <list> -#ifndef __STL_LIST -#define __STL_LIST -#endif -#endif - -#ifndef __STL_MAP -#include <map> -#ifndef __STL_MAP -#define __STL_MAP -#endif -#endif - #ifndef __STL_STRING #incldue <string> #ifndef __STL_STRING @@ -84,11 +70,7 @@ #endif #endif -#ifndef _MTDC32UNPACKER_H -#include "CMTDC32Unpacker.h" -#endif - class CTCLInterpreter; class CGateContainer; class fstream; @@ -97,7 +79,6 @@ Assumptions: - Data from only one module is present in the event, which implies: - There's only a unique timestamp. - - There's only one matching hit in the TDC(s). Several tree parameters steer this: - 'bins' - (integer, no units) Number of bins in a cycle - 'minTime' - (floating nanoseconds) Minimum time per bin (defines the length of the cycle. @@ -143,17 +124,7 @@ {} } bankQueue, *pbankQueue; - typedef struct _TDCWrapTracker { - uint64_t s_lastStamp; - uint64_t s_wrapAdd; - _TDCWrapTracker() : s_lastStamp(0), s_wrapAdd(0) {} - } TDCWrapTracker, *pTDCWrapTracker; - typedef std::map<unsigned int, std::list<CMTDC32Unpacker::hitInfo> > TDCFragments; - typedef std::map<unsigned int, TDCWrapTracker> TDCWrapTrackers; - - - // Local data: private: CTreeVariable m_bins; @@ -163,10 +134,8 @@ CTCLVariable m_ROIS; CTCLVariable m_moduleIds; CTreeParameter m_timestamp; // The event parameter holding the timestamp. - CTreeParameter m_highPstamp; // The associated high precision timestamp in ps (created). CTreeParameter m_moduleID; // The module we are unpacking. CTreeParameter m_bankNo; - CTreeVariable m_matchTolerance; std::vector<CGateContainer*> m_Gates; uint32_t m_currentCycleNumber; @@ -176,17 +145,8 @@ bool m_initialized; // True if the run was initialized. - // MTDC Raw hit fragments map indexed by module id. - TDCFragments m_tdcFragments; - TDCWrapTrackers m_tdcWraps; - // event counter...for debugging. - - unsigned m_eventCounter; - - - // Canonicals public: CMultiplicity(); @@ -250,10 +210,8 @@ void processFragmentQueues(); void flushFragmentQueues(); void histogramFragment(pEventFragment pFrag); - void computeHighPrecisionTimestamp(uint16_t madcStamp); - bool matchedTime(uint16_t adcTime, CMTDC32Unpacker::hitInfo& hit, unsigned tolerance); - void dropExtraMatchingFragments(uint16_t adcTime); + }; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-11-07 19:03:35 UTC (rev 2211) @@ -28,11 +28,11 @@ CStackMapCommand.o CModuleUnpacker.o C785Unpacker.o CNADC2530Unpacker.o \ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o \ - CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ CY2fCommand.o CFitY2FCommand.o CY3fCommand.o CFitY3FCommand.o MTDCHelpers.o \ CMTDC32Unpacker.o CHINP.o CPSD.o CV1729Unpacker.o CEventBuilder.o \ - CMultiplicity.o + CMultiplicity.o CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o + # # Finally the makefile targets. # Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-07 15:14:22 UTC (rev 2210) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-07 19:03:35 UTC (rev 2211) @@ -45,6 +45,7 @@ #include "CFitY2FCommand.h" #include "CY3fCommand.h" #include "CFitY3FCommand.h" +#include "CEventBuilder.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -103,7 +104,8 @@ CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); - RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); + RegisterEventProcessor(*(new CEventBuilder), "eventBuilder"); + // RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); // 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...> - 2014-11-07 21:01:48
|
Revision: 2212 http://sourceforge.net/p/nsclspectcl/code/2212 Author: ron-fox Date: 2014-11-07 21:01:35 +0000 (Fri, 07 Nov 2014) Log Message: ----------- * Multiplicity is working with MTDC data and that enables all the rest of the dependent stuff to work as well. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-07 19:03:35 UTC (rev 2211) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-07 21:01:35 UTC (rev 2212) @@ -227,11 +227,13 @@ // Now the tree parameters; We als handle correcting for time wraps in the MADC and // in the MTDC times as well as computing the actual MTDC timestamp in picoseconds. + // 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); m_highPTimestamp = computeTdcTimestamp(event); m_moduleID = event.s_Energy.s_moduleId; - m_bankNo = event.s_Energy.s_moduleId*2 + (event.s_Energy.s_channel < 16) ? 0 : 1; + m_bankNo = event.s_Energy.s_channel; // remove the event from the queue: @@ -422,11 +424,12 @@ uint64_t CEventBuilder::computeAdcTimestamp(CEventBuilder::BuiltEvent& event) { - // Use the energy event: + // Use the energy part of the event: + uint64_t rawTimestamp = event.s_Energy.s_eventCorr; unsigned module = event.s_Energy.s_moduleId; - unsigned bank = event.s_Energy.s_channel/2; // 0 or 1. + unsigned bank = event.s_Energy.s_channel/2; if (rawTimestamp < m_adcWrapping[bank][module].s_lastStamp) { m_adcWrapping[bank][module].s_wrapAdjust += 0x100000000; // we wrapped 2^32 up. Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-11-07 19:03:35 UTC (rev 2211) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-11-07 21:01:35 UTC (rev 2212) @@ -29,7 +29,7 @@ #include <sys/stat.h> #include <sys/types.h> -#include <fstream> +#include <iostream> #include <stdio.h> #include <assert.h> @@ -73,6 +73,7 @@ m_ROIS("multiplicity.ROIS", false), m_moduleIds("madcIds", false), m_timestamp("timestamp"), + m_highPTimestamp("timestampPS"), m_moduleID("moduleID"), m_bankNo("bankNo"), m_currentCycle(0), @@ -177,20 +178,25 @@ StringArray ids; moduleIds.Split(ids); - // Each module id gets a pair of fragment queues, one for each bank. + // Each module id gets a bank for every E channel + // for (int i =0; i < ids.size(); i++) { int id = atoi(ids[i].c_str()); - - bankQueue bank; - bank.s_moduleId = id; - bank.s_bankNumber = 0; - bank.s_firstTimestamp = bank.s_lastTimestamp = bank.s_wrapAdd = bank.s_currentCycle = 0.0; - bank.s_firstEvent = true; + for(int b = 0; b < 4; b+=2) { - m_fragmentQueues.push_back(bank); - bank.s_bankNumber = 1; - m_fragmentQueues.push_back(bank); + + bankQueue bank; + bank.s_moduleId = id; + bank.s_bankNumber = b; // E's in the bottom bank of the MADC. + bank.s_firstTimestamp = 0.0; + bank.s_lastTimestamp = 0.0; + 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); + } } m_initialized=true; @@ -308,36 +314,40 @@ unsigned module = (unsigned)((double)(m_moduleID)); unsigned bank = (unsigned)((double)(m_bankNo)); double rawTimestamp = (double)(m_timestamp); + double highPTimestamp = m_highPTimestamp; // TDC timestamp. pbankQueue pQueue = findQueue(module, bank); - double timestamp = rawTimestamp + pQueue->s_wrapAdd; // Add all the wraps into the timestamp + if(!pQueue) { + std::cerr << "Cound not find a queue for module: " << module << " bank: " << bank << std::endl; + return kfFALSE; // Abort event processing. + } - // Wrap again? + double nsPerTick = 1000.0*1000.0/m_frequency; // (1000usec/ms, 1000ns/usec)/ms^-1 -> ns. + double highPStampNs = highPTimestamp / 1000.0; /// 1000ps/ns. + double timestamp = rawTimestamp; - if (timestamp < pQueue->s_lastTimestamp) { - timestamp += WRAPADD; - pQueue->s_wrapAdd += WRAPADD; - } - pQueue->s_lastTimestamp = timestamp; - // If first event, save that sort of stuff too: if (pQueue->s_firstEvent) { - pQueue->s_firstTimestamp = timestamp; + pQueue->s_firstTimestamp = highPStampNs; pQueue->s_firstEvent = false; } // Figure out the cycle and bin: - double nsPerTick = 1000.0*1000.0/m_frequency; // (1000usec/ms, 1000ns/usec)/ms^-1 -> ns. - double fullBin = (timestamp*nsPerTick)/m_minTime; + + // double fullBin = (timestamp*nsPerTick)/m_minTime; + double fullBin = (highPStampNs)/m_minTime; unsigned cycle = fullBin/m_bins; unsigned bin = fullBin - (cycle*m_bins); pQueue->s_currentCycle = cycle; // Figure out the number of neutrons. If there aren't any, no need to go any further. - + // Note in this implementation the number is 0 or 1 as we only allow one MADC/MTDC match + // through at a time...the assumption is that if there's more than one hit in an event their TDC + // timing may be different...and we care about the high precision timing. + // unsigned neutrons = 0; for(int i =0; i < m_Gates.size(); i++) { CGateContainer& rGate(*m_Gates[i]); @@ -352,8 +362,11 @@ cycle, bin, neutrons }; pQueue->s_fragments.push_back(frag); + pQueue->s_lastTimestamp = highPStampNs; // remember the last timestamp. - // Process event queues: + // Process event queues + // Note that the processing is done so that there's a total ordering of fragment + // processing over all possible hits. processFragmentQueues(); } Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-11-07 19:03:35 UTC (rev 2211) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.h 2014-11-07 21:01:35 UTC (rev 2212) @@ -77,8 +77,16 @@ /*! Event processor to handle the multiplicity calculations. Assumptions: - - Data from only one module is present in the event, which implies: - - There's only a unique timestamp. + - Data from only one module channel pair, and one MTDC32 channel is present in the event, which implies: + - There's only a unique timestamp, and a unique high precision timestamp. + - The event builder has already set the following parameters: + * timestamp - The low precision timestamp from the MADC32 event. + * timestampPS - The high precision timestamp from the MTDC32 hit - converted to picoseconds. + * moduleID - The id of the MADC moudule that contributed the event. + * bankNo - A bank number that contributed the MADC part of the event.In this implementation, + since each MADC channel pair has a separate time we're going to use as the bank number + the channel of the E MADC channel. + Several tree parameters steer this: - 'bins' - (integer, no units) Number of bins in a cycle - 'minTime' - (floating nanoseconds) Minimum time per bin (defines the length of the cycle. @@ -102,12 +110,15 @@ typedef std::list<eventFragment> fragmentQueue; typedef fragmentQueue::iterator *pFragmentQueueElement; + + + typedef struct _bankQueue { uint32_t s_moduleId; uint32_t s_bankNumber; double s_firstTimestamp; double s_lastTimestamp; - double s_wrapAdd; + // double s_wrapAdd; // Wrapping is handled by the event processor. unsigned s_currentCycle; fragmentQueue s_fragments; bool s_firstEvent; @@ -117,7 +128,6 @@ s_bankNumber(rhs.s_bankNumber), s_firstTimestamp(rhs.s_firstTimestamp), s_lastTimestamp(rhs.s_lastTimestamp), - s_wrapAdd(rhs.s_wrapAdd), s_currentCycle(rhs.s_currentCycle), s_fragments(rhs.s_fragments), /* construct copy not just bitwise. */ s_firstEvent(rhs.s_firstEvent) @@ -134,6 +144,7 @@ CTCLVariable m_ROIS; CTCLVariable m_moduleIds; CTreeParameter m_timestamp; // The event parameter holding the timestamp. + CTreeParameter m_highPTimestamp; CTreeParameter m_moduleID; // The module we are unpacking. CTreeParameter m_bankNo; std::vector<CGateContainer*> m_Gates; Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-07 19:03:35 UTC (rev 2211) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-07 21:01:35 UTC (rev 2212) @@ -105,7 +105,7 @@ { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); RegisterEventProcessor(*(new CEventBuilder), "eventBuilder"); - // RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); + RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); // RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl 2014-11-07 19:03:35 UTC (rev 2211) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/spectclSetup.tcl 2014-11-07 21:01:35 UTC (rev 2212) @@ -123,7 +123,6 @@ # next free parameter number. # proc buildV1x90Maps {baseparam name} { - puts "BuildV1x90Maps" set tdcInfo $::CAENV1x90($name) set tdcRes $::V1x90Windows($name) set vsn $::adcConfiguration($name) @@ -135,12 +134,10 @@ set offset [lindex $tdcRes 1] set res [lindex $tdcRes 2] - puts "List : $tdcRes" set low $offset set hi [expr $offset + $width - 1.0] set chans [expr int($width/$res)] - puts "Spectrum: $low $hi $chans" # Pull out the stuff we need from the CAENV1x90 list: @@ -219,13 +216,11 @@ # proc buildMaseMap {param module} { - puts "In Mase" set basename $::adcChannels($module) set cobcount $::maseCOBCount($module) set chblist $::maseCHBCounts($module) set channels $::channelCount($::typeMase) - puts "$basename : $cobcount $chblist $channels" # We're going to be a bit tricky; The parameter map will be named by the # parameter _basename_ that will allow the unpacker to locate the parameter @@ -407,7 +402,9 @@ if {[array names ::madcResolutions $name] ne ""} { set resolution $resolutions($::madcResolutions($name)) } - return [makeParamsSpectraAndMap $param $name $::typeMADC32 $::adcChannels($name) $resolution ] + set param [makeParamsSpectraAndMap $param $name $::typeMADC32 $::adcChannels($name) $resolution ] + return $param + } ## @@ -429,6 +426,7 @@ # fixed limits. # proc makeMtdcParametersAndSpectra {param channels maxhits low hi chans} { + foreach name $channels { if {$name ne ""} { set param [makeMtdcParamSet $param $name $maxhits $low $hi $chans] @@ -472,9 +470,11 @@ # Make the parameters and spectra: foreach parameter $channels { - parameter $parameter $param - incr param - makeSpectrum $parameter $resolution + if {$parameter ne ""} { + parameter $parameter $param + incr param + makeSpectrum $parameter $resolution + } } paramMap $name $type $vsn $channels return $param @@ -509,21 +509,17 @@ # param - the number of the first parameter. proc buildChannelMaps param { - puts "Building channel maps" foreach module [array names ::adcChannels] { - puts "Processing $module" if {$::readoutDeviceType($module) eq $::typeTDC1x90} { - puts "V1x90 $module" set param [buildV1x90Maps $param $module] } elseif {$::readoutDeviceType($module) eq $::typeV977} { - puts "V977 $module" set param [buildv977Map $param $module] # Give SpecTcl the parameter map for the module: } elseif {$::readoutDeviceType($module) eq $::typeMase} { - puts "MASE module" + set param [buildMaseMap $param $module] } elseif {$::readoutDeviceType($module) eq $::typeCAENDual} { set param [buildCAENDualMap $param $module] @@ -549,7 +545,6 @@ # MTDC32's get more stuff: if {$type == $::typeMTDC32} { - puts "MTDC32 - special parameters and spectra" makeMtdcParametersAndSpectra \ $param $channels \ $::MTDCMaxHits($module) $::MTDCLowLim($module) $::MTDCHiLim($module) $::MTDCChans($module) @@ -566,13 +561,11 @@ # The assumption is that stack 1 is a scaler stack always if used at all. # proc buildStackMaps {} { - puts "In buildStackMaps!!" foreach stack [array names ::stackNumber] { set stackno $::stackNumber($stack) if {$stackno != 1} { - puts "Stackmap for $stack : $stackno list: $::stackOrder($stack)" stackMap $stackno $::stackOrder($stack) } } @@ -586,16 +579,13 @@ proc vmusbConfig filename { configRead $filename - puts "Building channel maps" catch {buildChannelMaps 20} msg puts $msg - puts "Building stack maps" catch {buildStackMaps} msg puts $msg - puts "Binding spectra to Xamine" sbind -all } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-11-14 21:17:05
|
Revision: 2215 http://sourceforge.net/p/nsclspectcl/code/2215 Author: ron-fox Date: 2014-11-14 21:16:55 +0000 (Fri, 14 Nov 2014) Log Message: ----------- * Ensured that CMTDC32Unpacker also provided module id. * Added CTimeParameters that produces what's needed for waterfall and cumulative histograms. * Fixed error in handling time wrapping in CEventBuilder. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-14 20:04:20 UTC (rev 2214) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-14 21:16:55 UTC (rev 2215) @@ -43,7 +43,7 @@ CEventBuilder::CEventBuilder() : m_buildWindow("evb.buildWindow", 16, "ticks"), m_timestamp("timestamp"), - m_highPTimestamp("timestampPS"), + m_highPTimestamp("timestampPS", "ps"), m_moduleID("moduleID"), m_bankNo("bankNo"), m_fInitialized(false) @@ -454,8 +454,10 @@ if (rawTimestamp < m_tdcWrapping[channel].s_lastStamp) { m_tdcWrapping[channel].s_wrapAdjust += 0x400000000000; } + m_tdcWrapping[channel].s_lastStamp = rawTimestamp; rawTimestamp += m_tdcWrapping[channel].s_wrapAdjust; // full wraw timestamp. + return (static_cast<double>(rawTimestamp) * event.s_MTDCTiming.s_timeCalibration); } /** Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-11-14 20:04:20 UTC (rev 2214) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32Unpacker.cpp 2014-11-14 21:16:55 UTC (rev 2215) @@ -240,6 +240,7 @@ } unsigned words = MTDC::wordCount(header); float psPerChan = MTDC::psPerChannel(MTDC::resolution(header)); // for calibrated times. + unsigned id = MTDC::id(header); offset+= 2; // Now the body of the event; each timestamp has its own sync data while @@ -279,6 +280,7 @@ hitInfo hit; hit.s_channel = ch; + hit.s_module = id; hit.s_rawTime = rawTime; hit.s_timeCalibration = psPerChan; hit.s_eventCorr = syncInfo; @@ -289,6 +291,7 @@ // until the end of the event: hitInfo hit; + hit.s_module = id; hit.s_channel = ch; hit.s_rawTime = rawTime; hit.s_timeCalibration = psPerChan; Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2014-11-14 21:16:55 UTC (rev 2215) @@ -0,0 +1,338 @@ +/****************************************************************************** +* +* 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 CTimeParameters.cpp + * @brief Event processor to build various time parameters. + * @author Ron Fox <ro...@ca...> + */ +#include <config.h> +#include "CTimeParameters.h" +#include <SpecTcl.h> +#include <GateContainer.h> +#include <TCLInterpreter.h> +#include <math.h> +#include <SpectrumS.h> +#include <SpectrumFactory.h> // For next id. +#include <vector> +#include <stdint.h> + + +/** + * @class CSpectrumAbsStrip + * This helper class is sort of a strip chart spectrum. Where a + * strip chart spectrum acts by incrementing the channel that is current in time, + * the AbsStrip sets the channel at the current time to the y parameter. + * This is used to provide the cumulative counts spectrum. We are going to + * register the spectra with the histogrammer and bind it in the + * CTimeParameters constructor. + * @note - this spectrum must not be modified as doing so will replace it with an + * ordinary strip chart spectrum. + */ +class CSpectrumAbsStrip : public CSpectrumS +{ + // Canonicals: +public: + CSpectrumAbsStrip(const STD(string)& rName, + UInt_t nId, + const CParameter& rParameters, + const CParameter& nChannel, + UInt_t nChannels, + Float_t fLow, + Float_t fHigh); + + virtual void Increment (const CEvent& rE); +}; +/** + * construct CSpectrumAbsStrip: + * + * @param rName - name of the spectrum. + * @param id - Unique integer id of the spectrum. + * @param yparm - Parameter on the y axis. + * @param xparm - Parameter on the y axis (time). + * @param nChannels - Number of histogram bins. + * @param low - Initial spectrum low t limit. + * @param hi - Initial spectrum high t limit. + */ +CSpectrumAbsStrip::CSpectrumAbsStrip(const STD(string)& rName, + UInt_t nId, + const CParameter& rParameters, + const CParameter& nChannel, + UInt_t nChannels, + Float_t fLow, + Float_t fHigh) : + CSpectrumS(rName, nId, rParameters, nChannel, nChannels, fLow, fHigh) {} + +void +CSpectrumAbsStrip::Increment(const CEvent& rEvent) +{ + std::vector<unsigned> ids ; + GetParameterIds(ids); + int timeId = ids[0]; + int yId = ids[1]; + + CEvent& rE(const_cast<CEvent&>(rEvent)); + CParameterValue& rTime(rE[timeId]); + CParameterValue& rParam(rE[yId]); + int nOffset = getOffset(); + int nChannels = getChannels(); + + if(rTime.isValid() && rParam.isValid()) { // Only increment if params present. + int64_t nChannel = ParameterToAxis(0, rTime)- nOffset; + + int64_t shift = nChannel; + if (nChannel >= nChannels ) { + shift = static_cast<int64_t>(nChannel + (.25 * nChannels) - nChannels); + ShiftDataDown(shift); + nOffset = static_cast<int>(nOffset + shift); + nChannel = nChannel - shift; + }else if (nChannel < 0) { + ShiftDataUp(nChannel); + nOffset =nOffset + nChannel; + nChannel = 0; + } + UInt_t* p = (UInt_t*)getStorage(); + assert(p != (UInt_t*)kpNULL); // Spectrum storage must exist!! + int value = rParam; + p[nChannel] = value; // Set the channel to the current value. + } +} + + + +/** + * constructor + * - Initialize the regular variables. + * - Create the tree parameters. + * - Create/initialize the CTCLVariables. + * - Null out the gate containers for now (They'll get set by OnBegin(). + */ + +CTimeParameters::CTimeParameters() : + m_t0(0.0), + m_lastTime(0.0), + m_lastTimeGated(0.0), + m_runTimeNs("Time.Run-Time-ns", "ns"), + m_runTimeS("Time.Run-Time-s", "sec"), + m_HaveEvent("Time.HaveEvent", "1/0"), + m_EventCount("Time.TotalEvents", "counts"), + m_HaveGatedEvent("Time.HaveGatedEvent", "1/0"), + m_GatedEventCount("Time.TotalGatedEvents", "counts"), + m_deltaTns("Time.dt-ns", "ns"), + m_deltaTGatedns("Time.dt-ns-gated", "ns"), + m_logDtns("Time.logdt"), + m_logDtGatedns("Time.logdt-gated"), + + m_highPTimestamp("timestampPS"), + + m_haveEventGateName("event-gate", kfFALSE), + m_deltaTGateName("dt-gate", kfFALSE), + + m_defaultGateContainer("My True gate", 9999, m_defaultGate), + + m_fInitialized(false) +{ + // Bind the interpreter to the variables. + + SpecTcl* api = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = api->getInterpreter(); + m_haveEventGateName.Bind(pInterp); + m_deltaTGateName.Bind(pInterp); + + // Bind the tree parametesr so that the so that they have ids + // needed to make spectra below (note if this causes problems we can just + // use the api to make parameters with the right characterstics so that the + // trees will get bound later. + + CTreeParameter::BindParameters(); + + // Create our spectra: + + CSpectrumFactory fact; + SpecTcl* pApi = SpecTcl::getInstance(); + + + // Ungated cumulative count spectra. + + m_CumulativeSec = new CSpectrumAbsStrip("CumulativeCounts.sec", + fact.NextId(), + *(pApi->FindParameter("Time.TotalEvents")), + *(pApi->FindParameter("Time.Run-Time-s")), + 3600, 0.0, 3599.0); // Cumulative counts bins 1sec wide for last hr. + pApi->AddSpectrum(*m_CumulativeSec); + + m_CumulativeNs = new CSpectrumAbsStrip("CumulativeCounts.nsec", + fact.NextId(), + *(pApi->FindParameter("Time.TotalEvents")), + *(pApi->FindParameter("Time.Run-Time-ns")), + 10000, 0.0, 10000000.0); // last 10ms in usec buckets. + pApi->AddSpectrum(*m_CumulativeNs); + + // The gated spectra. Note that what's gated are changes in the y parameter value...so we don't + // actually apply a gate to the spectrum itself. + // + + m_CumulativeGatedSec = new CSpectrumAbsStrip("CumulativeCounts.sec-gated", + fact.NextId(), + *(pApi->FindParameter("Time.TotalGatedEvents")), + *(pApi->FindParameter("Time.Run-Time-s")), + 3600, 0.0, 3599.0); + pApi->AddSpectrum(*m_CumulativeGatedSec); + + m_CumulativeGatedNs = new CSpectrumAbsStrip("CumulativeCounts.ns-gated", + fact.NextId(), + *(pApi->FindParameter("Time.TotalGatedEvents")), + *(pApi->FindParameter("Time.Run-Time-ns")), + 10000, 0.0, 10000000.0); + pApi->AddSpectrum(*m_CumulativeGatedNs); + + + +} + +CTimeParameters::~CTimeParameters() {} + +/** + * OnBegin + * OnBegin will try to get/update the values of the gate containers. + * This is done by: + * - Initializing them both to point to the default get container. + * - If the tcl variable has a value and if it corresponds to a gate, + * updating the appropriate container to point to the requested gate. + * + * @param rAnalyzer - Reference to the analyzer that will be controlling our actions. + * @param rDecoder - reference to the buffer decoder. + */ +Bool_t +CTimeParameters::OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) +{ + SpecTcl* pApi = SpecTcl::getInstance(); + + // the have event gate: + + m_haveEventGate = &m_defaultGateContainer; + m_deltaTGate = &m_defaultGateContainer; + + + const char* pValue = m_haveEventGateName.Get(); + if (pValue) { + CGateContainer* pGate = pApi->FindGate(pValue); + if (pGate) { + m_haveEventGate = pGate; + } + } + + // The delta t gate. + + pValue = m_deltaTGateName.Get(); + if (pValue) { + CGateContainer* pGate = pApi->FindGate(pValue); + if (pGate) { + m_deltaTGate = pGate; + } + } + + // Counts of events: + + m_totalEvents = 0; + m_totalGatedEvents = 0; + + // A new run is starting so flag the lasts and t0 as uninitialized: + + m_t0 = 0.0; + m_lastTime = (0.0); + m_lastTimeGated = (0.0); + + m_fInitialized = true; // We're initialized. + + return kfTRUE; + +} +/** + * operator() + * Produce the time parameters from the input parameter. + * - Ensure that we are initialized in case we joined in the middle + * of a run. + * - If this is the first event, remember the time as T0 and the last times for both + * gated and ungated events. + * - Compute the parameters (if necessary conditionalized on the gates. + * + * @param pEvent - Pointer to the raw event (unused) + * @param rEvent - Output/unpacked event ..used to check gates. + * @param rAnalyzer - References the analyzer that is controlling the playback. + * @param rDecoder - References the buffer decoder that understands the high level format + * of the data. + * @return kfTRUE - Indicating success...as there are no failure conditions. + */ +Bool_t +CTimeParameters::operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + if (!m_fInitialized) OnBegin(rAnalyzer, rDecoder); + + // Set the initial times if they are 0.0: + + double hpTs = m_highPTimestamp; + if (m_t0 == 0.0) { + m_t0 = hpTs; + m_lastTime = hpTs; + m_lastTimeGated = hpTs; + } + + // 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_runTimeS = m_runTimeNs / 1.0e9; // 10^9 ns in a second. + + m_HaveEvent = 1; + m_totalEvents = m_totalEvents + 1; + m_EventCount = m_totalEvents; + if ((*m_haveEventGate)(rEvent)) { + m_HaveGatedEvent = 1; + m_totalGatedEvents = m_totalGatedEvents+1; + } + m_GatedEventCount = m_totalGatedEvents; // Always set it even if it didn't change. + + // 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; + m_lastTime = m_highPTimestamp; + + if (m_deltaTns > 0.0) { + m_logDtns = log10(m_deltaTns); + } else { + m_logDtns = .1; // standard fudge for 0/negative log values. + } + + if ((*m_deltaTGate)(rEvent)) { + m_deltaTGatedns = (m_highPTimestamp - m_lastTimeGated)/1000.0; + m_lastTimeGated = m_highPTimestamp; + + if (m_deltaTGatedns > 0.0) { + m_logDtGatedns = log10(m_deltaTGatedns); + } else { + m_logDtGatedns = 0.0; + } + } + + return kfTRUE; +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.h 2014-11-14 21:16:55 UTC (rev 2215) @@ -0,0 +1,129 @@ +/****************************************************************************** +* +* 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 CTimeParameters.h + * @brief Event processor to build various time parameters. + * @author Ron Fox <ro...@ca...> + */ + +#ifndef __CTIMEPARAMETERS_H +#define __CTIMEPARAMETERS_H + +#include <EventProcessor.h> +#include <TreeParameter.h> +#include <TCLVariable.h> +#include <TrueGate.h> +#include <GateContainer.h> + + +class CSpectrum; + +/** + * @class CTimeParameters + * This event processor is intended to run after the event builder. + * It produces the following parameters: + * - Time into run in ns. + * - Time into run in s. + * - Event present + * - Event present and satisfying a gate. + * - Time since last event in ns + * - Time since last event in ns satisfying a gate. + * - Log of time since last event in ns. + * - Log of time sincde last event in ns gated (same gate as time since last event). + * + * Note that normally the gates above are OR's of regions of interests, but they can, in fact be arbitrary. + */ + +class CTimeParameters : public CEventProcessor +{ +private: + // variables for time differences (including the start time). + + double m_t0; // Time of first MTDC event in ns. + double m_lastTime; // Time of last event in ns. + double m_lastTimeGated; // Time of last event in the gate. + + double m_totalEvents; + double m_totalGatedEvents; + + // Parameters we will produce. + + CTreeParameter m_runTimeNs; // Run time in nanoseconds + CTreeParameter m_runTimeS; // Run time in seconds. + CTreeParameter m_HaveEvent; // Have an event (1). + CTreeParameter m_EventCount; // Total number of events. + CTreeParameter m_HaveGatedEvent; // Have an event that satisfies a gate. + CTreeParameter m_GatedEventCount; // Total number of events in the gate. + CTreeParameter m_deltaTns; // Time since last event in ns. + CTreeParameter m_deltaTGatedns; // Ns since last time that made the gate. + CTreeParameter m_logDtns; // Log of delta t. + CTreeParameter m_logDtGatedns; // Log of dt in gates. + + // Input parameters: + + CTreeParameter m_highPTimestamp; // Everything is based on the high precision timestamp. + + // Variables that steer the computation: + + CTCLVariable m_haveEventGateName; + CTCLVariable m_deltaTGateName; + + + // Handles for gates. + + CGateContainer* m_haveEventGate; + CGateContainer* m_deltaTGate; + + CTrueGate m_defaultGate; + CGateContainer m_defaultGateContainer; + + // Spectra for the cumulative counts vs. time: + + + CSpectrum* m_CumulativeSec; + CSpectrum* m_CumulativeNs; + CSpectrum* m_CumulativeGatedSec; + CSpectrum* m_CumulativeGatedNs; + + // Internal state + + bool m_fInitialized; + // canonicals: +public: + CTimeParameters(); + virtual ~CTimeParameters(); + + // Methods that define an event processor: + + // Functions: + + + virtual Bool_t OnBegin(CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Begin Run and initializer. + + virtual Bool_t operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Physics Event. + + + +}; + +#endif + Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-11-14 20:04:20 UTC (rev 2214) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-11-14 21:16:55 UTC (rev 2215) @@ -30,7 +30,8 @@ CV1x90Unpacker.o CV977Unpacker.o CMASE.o \ 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 + CMultiplicity.o CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ + CTimeParameters.o # @@ -74,6 +75,9 @@ C785Unpacker.o: /usr/include/stdint.h /usr/include/features.h CCbarCommand.o: CCbarCommand.h CMultiplicity.h /usr/include/stdint.h CCbarCommand.o: /usr/include/features.h +CEventBuilder.o: CEventBuilder.h CMTDC32Unpacker.h CModuleUnpacker.h +CEventBuilder.o: CParamMapCommand.h /usr/include/stdint.h +CEventBuilder.o: /usr/include/features.h CMADC32Unpacker.h CFitButton.o: CFitButton.h CFitY2FCommand.o: CFitY2FCommand.h /usr/include/gsl/gsl_rng.h CFitY2FCommand.o: /usr/include/stdlib.h /usr/include/features.h @@ -211,8 +215,8 @@ CHINP.o: /usr/include/wchar.h CLLNLUnpacker.o: CLLNLUnpacker.h /usr/include/stdint.h CLLNLUnpacker.o: /usr/include/features.h CParamMapCommand.h -CMADC32Unpacker.o: CMADC32Unpacker.h CModuleUnpacker.h CParamMapCommand.h -CMADC32Unpacker.o: /usr/include/stdint.h /usr/include/features.h +CMADC32Unpacker.o: CMADC32Unpacker.h /usr/include/stdint.h +CMADC32Unpacker.o: /usr/include/features.h CMASE.o: CMASE.h CModuleUnpacker.h CParamMapCommand.h /usr/include/stdint.h CMASE.o: /usr/include/features.h /usr/include/string.h /usr/include/xlocale.h CMASE.o: /usr/include/stdio.h /usr/include/libio.h /usr/include/_G_config.h @@ -254,6 +258,8 @@ CStackUnpacker.o: CMADC32Unpacker.h CV1x90Unpacker.h CV977Unpacker.h CStackUnpacker.o: CStackMapCommand.h CMASE.h CHINP.h CPSD.h CV1729Unpacker.h CStackUnpacker.o: CMTDC32Unpacker.h +CTimeParameters.o: CTimeParameters.h /usr/include/math.h +CTimeParameters.o: /usr/include/features.h CTotalMultCmd.o: CTotalMultCmd.h CMultiplicity.h /usr/include/stdint.h CTotalMultCmd.o: /usr/include/features.h CV1729Unpacker.o: CV1729Unpacker.h /usr/include/stdint.h @@ -339,3 +345,5 @@ MySpecTclApp.o: /usr/include/limits.h /usr/include/gsl/gsl_precision.h MySpecTclApp.o: /usr/include/gsl/gsl_nan.h /usr/include/gsl/gsl_pow_int.h MySpecTclApp.o: /usr/include/gsl/gsl_minmax.h CY3fCommand.h CFitY3FCommand.h +MySpecTclApp.o: CEventBuilder.h CMTDC32Unpacker.h CModuleUnpacker.h +MySpecTclApp.o: CMADC32Unpacker.h CTimeParameters.h Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-14 20:04:20 UTC (rev 2214) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-14 21:16:55 UTC (rev 2215) @@ -46,6 +46,7 @@ #include "CY3fCommand.h" #include "CFitY3FCommand.h" #include "CEventBuilder.h" +#include "CTimeParameters.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -106,6 +107,7 @@ RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); RegisterEventProcessor(*(new CEventBuilder), "eventBuilder"); RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); + RegisterEventProcessor(*(new CTimeParameters), "Time-parameters"); // 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...> - 2014-11-21 16:11:53
|
Revision: 2217 http://sourceforge.net/p/nsclspectcl/code/2217 Author: ron-fox Date: 2014-11-21 16:11:45 +0000 (Fri, 21 Nov 2014) Log Message: ----------- Get interval plotting to work with log X axis. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2014-11-21 15:17:30 UTC (rev 2216) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2014-11-21 16:11:45 UTC (rev 2217) @@ -30,6 +30,7 @@ #include <SpectrumFactory.h> // For next id. #include <vector> #include <stdint.h> +#include <Spectrum1DL.h> /** @@ -201,7 +202,23 @@ pApi->AddSpectrum(*m_CumulativeGatedNs); + // Make the time intervalanalysis histograms gated and not the range is 0 - 9 (1e9 ns) + // binned in .01 steps so 900 channels. + + CSpectrum1DL* pUngatedTimeInterval = new CSpectrum1DL("Time-interval-analysis", + fact.NextId(), + *(pApi->FindParameter("Time.logdt")), + 900, 0.0, 9.0); + pApi->AddSpectrum(*pUngatedTimeInterval); + + CSpectrum1DL* pGatedTimeInterval = new CSpectrum1DL("Time-interval-analysis-gated", + fact.NextId(), + *(pApi->FindParameter("Time.logdt-gated")), + 900, 0.0, 9.0); + pApi->AddSpectrum(*pGatedTimeInterval); + + } CTimeParameters::~CTimeParameters() {} @@ -320,7 +337,7 @@ if (m_deltaTns > 0.0) { m_logDtns = log10(m_deltaTns); } else { - m_logDtns = .1; // standard fudge for 0/negative log values. + m_logDtns = .01; // standard fudge for 0/negative log values. } if ((*m_deltaTGate)(rEvent)) { @@ -330,7 +347,7 @@ if (m_deltaTGatedns > 0.0) { m_logDtGatedns = log10(m_deltaTGatedns); } else { - m_logDtGatedns = 0.0; + m_logDtGatedns = 0.01; } } Added: branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-11-21 16:11:45 UTC (rev 2217) @@ -0,0 +1,84 @@ +## +# package to plot the time interval analysis spectra +# Note, this requires an up to date version of plotchart +# which is included in the plotchart subdirectory here. + +lappend auto_path [file join [file dirname [info script]] plotchart] +package require Plotchart 2.3.1 + +source plotLog.tcl + +toplevel .plots +lappend IntervalCanvases [canvas .plots.ungated -width 700 -height 200] +lappend IntervalCanvases [canvas .plots.gated -width 700 -height 200] + + +foreach canvas $IntervalCanvases { + pack $canvas -fill both -expand 1 +} + +set IntervalSpectra [list Time-interval-analysis Time-interval-analysis-gated] +set IntervalPlots [list]; # Initially there are no plots. + +## +# Auto re-scheduled plot of the interval spectra. +# @param ms - Number of ms between updates. +# +proc plotIntervalSpectra {ms} { + global IntervalPlots + global IntervalSpectra + global IntervalCanvases + + # Destroy all of the plotchart objects + + foreach plot $IntervalPlots { + $plot deletedata + Plotchart::eraseplot $plot + } + set IntervalPlots [list] + + # Plot the spectra: + + foreach spectrum $IntervalSpectra canvas $IntervalCanvases { + lappend IntervalPlots [plotSpectrum $spectrum $canvas] + } + + # reschedule: + + after $ms [list plotIntervalSpectra $ms] +} +## +# Plot one of the interval spectra: +# - Get its axis specifications +# - Get the data and turn them into series lists. +# - Invoke plotLog to finish the job. +# +# @param name -spectrum name. +# @param canvas - canvas in which to plot. +# @return plotchart plot handle. +# +proc plotSpectrum {name canvas} { + set specification [lindex [spectrum -list $name] 0] + set axisSpecs [lindex $specification 4] + set xAxisSpec [lindex $axisSpecs 0] + set low [lindex $xAxisSpec 0] + set hi [lindex $xAxisSpec 1] + set channels [lindex $xAxisSpec 2] + + puts $name + puts $xAxisSpec + puts $low + puts $hi + puts $channels + + set xcoords [list] + set ycoords [list] + for {set i 0} {$i < $channels} {incr i} { + lappend xcoords $i + lappend ycoords [channel -get $name $i] + } + + return [plotLog $canvas $name $low $hi $xcoords $ycoords] +} + +plotIntervalSpectra 5000; # Every 5000 miliseconds (5 seconds) \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2014-11-21 15:17:30 UTC (rev 2216) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2014-11-21 16:11:45 UTC (rev 2217) @@ -1,4 +1,4 @@ -package require Plotchart +package require Plotchart 2.3.1 ## # plotLog @@ -18,7 +18,7 @@ # proc plotLog {canvas title low hi xvalues yvalues} { set ySpec [Plotchart::determineScale 0 [expr max([join $yvalues , ]) ]] - set xSpec [list 0.01 1.0e$hi] + set xSpec [list 0.01 1.0e[expr int($hi)]] puts $ySpec puts $xSpec This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-11-21 16:13:10
|
Revision: 2218 http://sourceforge.net/p/nsclspectcl/code/2218 Author: ron-fox Date: 2014-11-21 16:13:05 +0000 (Fri, 21 Nov 2014) Log Message: ----------- Add plotchart 2.3 to the distro Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/pkgIndex.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plot3d.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotanim.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotannot.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotbind.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotbusiness.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotchart.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotcombined.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotconfig.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotcontour.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotgantt.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotobject.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotpack.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotpriv.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotscada.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotspecial.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotstatustimeline.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plottable.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/scaling.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/xyplot.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-11-21 16:11:45 UTC (rev 2217) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-11-21 16:13:05 UTC (rev 2218) @@ -9,6 +9,7 @@ source plotLog.tcl toplevel .plots +wm title .plots {Time interval plots} lappend IntervalCanvases [canvas .plots.ungated -width 700 -height 200] lappend IntervalCanvases [canvas .plots.gated -width 700 -height 200] Added: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/pkgIndex.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/pkgIndex.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/pkgIndex.tcl 2014-11-21 16:13:05 UTC (rev 2218) @@ -0,0 +1,7 @@ +if {![package vsatisfies [package provide Tcl] 8.5]} { + # PRAGMA: returnok + return +} +package ifneeded Plotchart 2.3.1 [list source [file join $dir plotchart.tcl]] +package ifneeded xyplot 1.0.1 [list source [file join $dir xyplot.tcl]] +package ifneeded plotanim 0.2 [list source [file join $dir plotanim.tcl]] Property changes on: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/pkgIndex.tcl ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plot3d.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plot3d.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plot3d.tcl 2014-11-21 16:13:05 UTC (rev 2218) @@ -0,0 +1,412 @@ +# plot3d.tcl -- +# Facilities to draw simple 3D plots in a dedicated canvas +# +# Note: +# This source file contains the private functions for 3D plotting. +# It is the companion of "plotchart.tcl" +# + +# Draw3DAxes -- +# Draw the axes in a 3D plot +# Arguments: +# w Name of the canvas +# xmin Minimum x coordinate +# xmax Maximum x coordinate +# xstep Step size +# ymin Minimum y coordinate +# ymax Maximum y coordinate +# ystep Step size +# zmin Minimum z coordinate +# zmax Maximum z coordinate +# zstep Step size +# names List of labels for the x-axis (optional) +# Result: +# None +# Note: +# To keep the axes in positive orientation, the x-axis appears +# on the right-hand side and the y-axis appears in front. +# This may not be the most "intuitive" presentation though. +# +# If the step for the x-axis is zero or negative, it is not +# drawn - adopted from Keith Vetter's extension. +# +# Side effects: +# Axes drawn in canvas +# +proc ::Plotchart::Draw3DAxes { w xmin ymin zmin + xmax ymax zmax + xstep ystep zstep + {names {}} } { + variable scaling + + $w delete axis3d + + # + # Create the support lines first + # + foreach {pxxmin pyxmin} [coords3DToPixel $w $scaling($w,xmin) $scaling($w,ymin) $scaling($w,zmin)] {break} + foreach {pxxmax pyxmax} [coords3DToPixel $w $scaling($w,xmax) $scaling($w,ymin) $scaling($w,zmin)] {break} + foreach {pxymax pyymax} [coords3DToPixel $w $scaling($w,xmax) $scaling($w,ymax) $scaling($w,zmin)] {break} + foreach {pxzmax pyzmax} [coords3DToPixel $w $scaling($w,xmax) $scaling($w,ymin) $scaling($w,zmax)] {break} + foreach {pxzmx2 pyzmx2} [coords3DToPixel $w $scaling($w,xmin) $scaling($w,ymin) $scaling($w,zmax)] {break} + foreach {pxymx2 pyymx2} [coords3DToPixel $w $scaling($w,xmin) $scaling($w,ymax) $scaling($w,zmin)] {break} + foreach {pxzymx pyzymx} [coords3DToPixel $w $scaling($w,xmax) $scaling($w,ymax) $scaling($w,zmax)] {break} + + if { $xstep > 0 } { + $w create line $pxxmax $pyxmax $pxxmin $pyxmin -fill black -tag axis3d + $w create line $pxxmax $pyxmax $pxymax $pyymax -fill black -tag axis3d + $w create line $pxymax $pyymax $pxymx2 $pyymx2 -fill black -tag axis3d + $w create line $pxzmax $pyzmax $pxzymx $pyzymx -fill black -tag axis3d + $w create line $pxxmax $pyxmax $pxzmax $pyzmax -fill black -tag axis3d + $w create line $pxzmax $pyzmax $pxzmx2 $pyzmx2 -fill black -tag axis3d + $w create line $pxymax $pyymax $pxzymx $pyzymx -fill black -tag axis3d + } + $w create line $pxxmin $pyxmin $pxymx2 $pyymx2 -fill black -tag axis3d + $w create line $pxxmin $pyxmin $pxzmx2 $pyzmx2 -fill black -tag axis3d + + # + # Numbers to the z-axis + # + set z $zmin + while { $z < $zmax+0.5*$zstep } { + foreach {xcrd ycrd} [coords3DToPixel $w $xmin $ymin $z] {break} + set xcrd2 [expr {$xcrd-3}] + set xcrd3 [expr {$xcrd-5}] + + $w create line $xcrd2 $ycrd $xcrd $ycrd -tag axis3d + $w create text $xcrd3 $ycrd -text $z -tag axis3d -anchor e + set z [expr {$z+$zstep}] + } + + # + # Numbers or labels to the x-axis (shown on the right!) + # + if { $xstep > 0 } { + if { $names eq "" } { + set x $xmin + while { $x < $xmax+0.5*$xstep } { + foreach {xcrd ycrd} [coords3DToPixel $w $x $ymax $zmin] {break} + set xcrd2 [expr {$xcrd+4}] + set xcrd3 [expr {$xcrd+6}] + + $w create line $xcrd2 $ycrd $xcrd $ycrd -tag axis3d + $w create text $xcrd3 $ycrd -text $x -tag axis3d -anchor w + set x [expr {$x+$xstep}] + } + } else { + set x [expr {$xmin+0.5*$xstep}] + foreach label $names { + foreach {xcrd ycrd} [coords3DToPixel $w $x $ymax $zmin] {break} + set xcrd2 [expr {$xcrd+6}] + + $w create text $xcrd2 $ycrd -text $label -tag axis3d -anchor w + set x [expr {$x+$xstep}] + } + } + } + + # + # Numbers to the y-axis (shown in front!) + # + set y $ymin + while { $y < $ymax+0.5*$ystep } { + foreach {xcrd ycrd} [coords3DToPixel $w $xmin $y $zmin] {break} + set ycrd2 [expr {$ycrd+3}] + set ycrd3 [expr {$ycrd+5}] + + $w create line $xcrd $ycrd2 $xcrd $ycrd -tag axis3d + $w create text $xcrd $ycrd3 -text $y -tag axis3d -anchor n + set y [expr {$y+$ystep}] + } + + set scaling($w,xstep) $xstep + set scaling($w,ystep) $ystep + set scaling($w,zstep) $zstep + + # + # Set the default grid size + # + GridSize3D $w 10 10 +} + +# GridSize3D -- +# Set the grid size for a 3D function plot +# Arguments: +# w Name of the canvas +# nxcells Number of cells in x-direction +# nycells Number of cells in y-direction +# Result: +# None +# Side effect: +# Store the grid sizes in the private array +# +proc ::Plotchart::GridSize3D { w nxcells nycells } { + variable scaling + + set scaling($w,nxcells) $nxcells + set scaling($w,nycells) $nycells +} + +# Draw3DFunction -- +# Plot a function of x and y +# Arguments: +# w Name of the canvas +# function Name of a procedure implementing the function +# Result: +# None +# Side effect: +# The plot of the function - given the grid +# +proc ::Plotchart::Draw3DFunction { w function } { + variable scaling + + set nxcells $scaling($w,nxcells) + set nycells $scaling($w,nycells) + set xmin $scaling($w,xmin) + set xmax $scaling($w,xmax) + set ymin $scaling($w,ymin) + set ymax $scaling($w,ymax) + set dx [expr {($xmax-$xmin)/double($nxcells)}] + set dy [expr {($ymax-$ymin)/double($nycells)}] + + foreach {fill border} $scaling($w,colours) {break} + + # + # Draw the quadrangles making up the plot in the right order: + # first y from minimum to maximum + # then x from maximum to minimum + # + for { set j 0 } { $j < $nycells } { incr j } { + set y1 [expr {$ymin + $dy*$j}] + set y2 [expr {$y1 + $dy}] + for { set i $nxcells } { $i > 0 } { incr i -1 } { + set x2 [expr {$xmin + $dx*$i}] + set x1 [expr {$x2 - $dx}] + + set z11 [$function $x1 $y1] + set z12 [$function $x1 $y2] + set z21 [$function $x2 $y1] + set z22 [$function $x2 $y2] + + foreach {px11 py11} [coords3DToPixel $w $x1 $y1 $z11] {break} + foreach {px12 py12} [coords3DToPixel $w $x1 $y2 $z12] {break} + foreach {px21 py21} [coords3DToPixel $w $x2 $y1 $z21] {break} + foreach {px22 py22} [coords3DToPixel $w $x2 $y2 $z22] {break} + + $w create polygon $px11 $py11 $px21 $py21 $px22 $py22 \ + $px12 $py12 $px11 $py11 \ + -fill $fill -outline $border -tags data + } + } +} + +# Draw3DData -- +# Plot a matrix of data as a function of x and y +# Arguments: +# w Name of the canvas +# data Nested list of data in the form of a matrix +# Result: +# None +# Side effect: +# The plot of the data +# +proc ::Plotchart::Draw3DData { w data } { + variable scaling + + set nxcells [llength [lindex $data 0]] + set nycells [llength $data] + incr nxcells -1 + incr nycells -1 + + set xmin $scaling($w,xmin) + set xmax $scaling($w,xmax) + set ymin $scaling($w,ymin) + set ymax $scaling($w,ymax) + set dx [expr {($xmax-$xmin)/double($nxcells)}] + set dy [expr {($ymax-$ymin)/double($nycells)}] + + foreach {fill border} $scaling($w,colours) {break} + + # + # Draw the quadrangles making up the data in the right order: + # first y from minimum to maximum + # then x from maximum to minimum + # + for { set j 0 } { $j < $nycells } { incr j } { + set z1data [lindex $data $j] + set z2data [lindex $data [expr {$j+1}]] + set y1 [expr {$ymin + $dy*$j}] + set y2 [expr {$y1 + $dy}] + for { set i $nxcells } { $i > 0 } { incr i -1 } { + set x2 [expr {$xmin + $dx*$i}] + set x1 [expr {$x2 - $dx}] + + set z11 [lindex $z1data [expr {$i-1}]] + set z21 [lindex $z1data $i ] + set z12 [lindex $z2data [expr {$i-1}]] + set z22 [lindex $z2data $i ] + + foreach {px11 py11} [coords3DToPixel $w $x1 $y1 $z11] {break} + foreach {px12 py12} [coords3DToPixel $w $x1 $y2 $z12] {break} + foreach {px21 py21} [coords3DToPixel $w $x2 $y1 $z21] {break} + foreach {px22 py22} [coords3DToPixel $w $x2 $y2 $z22] {break} + + $w create polygon $px11 $py11 $px21 $py21 $px22 $py22 \ + $px12 $py12 $px11 $py11 \ + -fill $fill -outline $border -tags data + } + } +} + +# InterpolateData3D -- +# Interpolate and plot a function of x and y based on a grid of data +# Arguments: +# w Name of the canvas +# data Nested list of data in the form of a matrix +# cont Contour levels +# Result: +# None +# Side effect: +# The plot of the function - given the grid of data +# +proc ::Plotchart::InterpolateData3D { w data cont } { + variable scaling + + # + # Store the scale values + # + set s(xmin) $scaling($w,xmin) + set s(xmax) $scaling($w,xmax) + set s(ymin) $scaling($w,ymin) + set s(ymax) $scaling($w,ymax) + set s(nx) [expr {[llength [lindex $data 0]] - 1}] + set s(ny) [expr {[llength $data] - 1}] + + Draw3DFunctionContour $w InterpolateData3DXY $cont +} + +# InterpolateData3DXY -- +# Interpolate the data and return the value +# Arguments: +# x X-coordinate +# y Y-coordinate +# Result: +# None +# Side effect: +# The plot of the function - given the grid of data +# +proc ::Plotchart::InterpolateData3DXY { x y } { + upvar 2 data data + upvar 2 s s + + set x [expr {$s(nx) * ($x - $s(xmin)) / ($s(xmax) - $s(xmin))}] + set y [expr {$s(ny) * ($y - $s(ymin)) / ($s(ymax) - $s(ymin))}] + + set ix1 [expr {int($x)}] + set ix2 [expr {$ix1 + 1}] + set iy1 [expr {int($y)}] + set iy2 [expr {$iy1 + 1}] + + if {$ix2 > $s(nx)-1 } { + set ix2 $ix1 + } + if {$iy2 > $s(ny)-1 } { + set iy2 $iy1 + } + + set wx [expr {$x - $ix1}] + set wy [expr {$y - $iy1}] + + set z11 [lindex $data $iy1 $ix1] + set z12 [lindex $data $iy1 $ix2] + set z21 [lindex $data $iy2 $ix1] + set z22 [lindex $data $iy2 $ix2] + + return [expr {$z11 + $wx * ($z12 - $z11) + $wy * ($z21 - $z11) + + $wx * $wy * ($z22 + $z11 - $z12 - $z21)}] +} + +# Draw3DRibbon -- +# Plot yz-data as a 3D ribbon +# +# Arguments: +# w Widget to draw in +# yzData List of duples, each of which is y,z pair +# (y is left-to-right, z is up-and-down, x is front-to-back). +# +# Note: +# Contributed by Keith Vetter (see the Wiki) +# +proc ::Plotchart::Draw3DRibbon { w yzData } { variable scaling + + set nxcells 1 + set nycells [llength $yzData] + incr nxcells -1 + incr nycells -1 + + set x1 $scaling($w,xmin) + set x2 [expr {($scaling($w,xmax) - $x1)/10.0}] + + foreach {fill border} $scaling($w,colours) {break} + + # + # Draw the quadrangles making up the data in the right order: + # first y from minimum to maximum + # then x from maximum to minimum + # + for { set j 0 } { $j < $nycells } { incr j } { + set jj [expr {$j+1}] + set y1 [lindex $yzData $j 0] + set y2 [lindex $yzData $jj 0] + set z1 [lindex $yzData $j 1] + set z2 [lindex $yzData $jj 1] + + foreach {px11 py11} [::Plotchart::coords3DToPixel $w $x1 $y1 $z1] break + foreach {px12 py12} [::Plotchart::coords3DToPixel $w $x1 $y2 $z2] break + foreach {px21 py21} [::Plotchart::coords3DToPixel $w $x2 $y1 $z1] break + foreach {px22 py22} [::Plotchart::coords3DToPixel $w $x2 $y2 $z2] break + $w create polygon $px11 $py11 $px21 $py21 $px22 $py22 \ + $px12 $py12 $px11 $py11 \ + -fill $fill -outline $border -tags data + } +} + +# Draw3DLineFrom3Dcoordinates -- +# Plot a line in the three-dimensional axis system +# Arguments: +# w Name of the canvas +# data List of xyz-coordinates +# colour The colour to use +# Result: +# None +# Side effect: +# The projected line +# +proc ::Plotchart::Draw3DLineFrom3Dcoordinates { w data colour } { + variable scaling + + set xmin $scaling($w,xmin) + set xmax $scaling($w,xmax) + set xprev {} + + set coords {} + set colours {} + foreach {x y z} $data { + foreach {px py} [coords3DToPixel $w $x $y $z] {break} + + lappend coords $px $py + + if { $xprev == {} } { + set xprev $x + } + set factor [expr {0.5*(2.0*$xmax-$xprev-$x)/($xmax-$xmin)}] + + lappend colours [GreyColour $colour $factor] + set xprev $x + } + + foreach {xb yb} [lrange $coords 0 end-2] {xe ye} [lrange $coords 2 end] c [lrange $colours 0 end-1] { + $w create line $xb $yb $xe $ye -fill $c -tags line + } +} + Property changes on: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plot3d.tcl ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotanim.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotanim.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotanim.tcl 2014-11-21 16:13:05 UTC (rev 2218) @@ -0,0 +1,607 @@ +package require Tk 8.5 +package require Plotchart +package provide plotanim 0.2 + +# +# This package is based on Arjen Markus' wiki page +# http://wiki.tcl.tk/21580 (Creating Mathematical Animations) +# and integrated into Plotchart by Torsten Berg +# + +# +# the following objects are supported: +# point = an invisible dot +# dot = a dot +# circle = a cirle with center point and radius +# line = a line with starting and ending point +# rectangle = a rectangle with lower left and upper right corner +# + +namespace eval ::Plotchart::anim { + # + # this array holds all information on the objects + # on the canvas created with this package: + variable item + # + # w = path to canvas + # + # item(w,type,<name>) = canvas item type of the item named <name> + # item($w,id,<name>) = the canvas item id of the item named <name> + # item($w,data,<name>) = configuration data of the canvas item named <name> + # item($w,track,<point>) = coordinates and configuration of a line tracking + # the movement of point <point> + # + # this array holds one element for each canvas, + # and is used to stop and restart animations (via the 'pause' command): + variable delayOver + # + # register the anim command for the plotchart package: +# variable ::Plotchart::config +# variable ::Plotchart::methodProc +# foreach type $config(charttypes) { +# set methodProc($type,anim) ::Plotchart::anim::animHandler +# } +} + + +# pause -- +# Pause the program for a given amount of time +# +# Arguments: +# w path to the canvas +# delay Delay in ms +# +# Result: +# None +# +# Side effects: +# Program pauses, but any GUI is still active, screen updates occur +# +proc ::Plotchart::anim::pause {w delay} { + variable delayOver + after $delay [list set ::Plotchart::anim::delayOver($w) 1] + vwait ::Plotchart::anim::delayOver($w) +} + + +# create -- +# Create an item on the canvas (type is fixed) +# +# Arguments: +# w path to the canvas +# name Name of the item +# itemdata Data for the item +# +# Result: +# None +# +# Side effects: +# An item with the given name now exists and is possibly visible +# +proc ::Plotchart::anim::create {w name itemdata} { + variable item + + set item($w,type,$name) [lindex $itemdata 0] + switch -- $item($w,type,$name) { + "point" { # Nothing to do } + "dot" { set item($w,id,$name) [$w create oval 0 0 0 0] } + "circle" { set item($w,id,$name) [$w create oval 0 0 0 0] } + "line" { set item($w,id,$name) [$w create line 0 0 0 0] } + "rectangle" {set item($w,id,$name) [$w create rectangle 0 0 0 0]} + } + + if { $item($w,type,$name) != "point" } { + $w itemconfig $item($w,id,$name) {*}[lindex $itemdata end] + } + #$w itemconfigure -tags $name + ::Plotchart::anim::update $w $name {*}$itemdata +} + + +# update -- +# Update the properties of an item +# +# Arguments: +# w path to the canvas +# name Name of the item +# args Data for the item +# +# Result: +# None +# +# Side effects: +# The item has updated properties +# +proc ::Plotchart::anim::update {w name args} { + variable item + + set type $item($w,type,$name) + + if { $type != [lindex $args 0] } { + return -code error "Item $name and given data are incompatible!" + } + + set item($w,data,$name) [lrange $args 1 end] + + UpdateCoords $w $name [lrange $item($w,data,$name) 0 end-1] +} + + +# UpdateCoords -- +# Update the canvas coordinates of an item +# +# Arguments: +# w path to the canvas +# name Name of the item +# coords World coordinates for the item +# base the base of the given coords, +# can be either 'pixel' or 'coord' (the default) +# +# Result: +# None +# +# Side effects: +# The item is updated on the screen +# +proc ::Plotchart::anim::UpdateCoords {w name coords {base coord}} { + variable item + variable ::Plotchart::scaling + + switch -- $item($w,type,$name) { + "point" { + # Not visible + } + "dot" { + if {$base eq "coord"} { + lassign $coords x y + lassign [::Plotchart::coordsToPixel $w $x $y] px py + } else { + lassign $coords px py + } + set xd1 [expr {$px - 3}] + set yd1 [expr {$py - 3}] + set xd2 [expr {$px + 3}] + set yd2 [expr {$py + 3}] + $w coords $item($w,id,$name) $xd1 $yd1 $xd2 $yd2 + } + "circle" { + set r "" + if {$base eq "coord"} { + lassign $coords x y r + lassign [::Plotchart::coordsToPixel $w $x $y] px py + } else { + lassign $coords px py + } + if { $r == "" } {set r [lindex $item($w,data,$name) 2]} + set rad [expr {$scaling($w,xfactor)*$r}] + set xd1 [expr {$px - $rad}] + set yd1 [expr {$py - $rad}] + set xd2 [expr {$px + $rad}] + set yd2 [expr {$py + $rad}] + $w coords $item($w,id,$name) $xd1 $yd1 $xd2 $yd2 + } + "line" - "rectangle" { + if {$base eq "coord"} { + lassign $coords x1 y1 x2 y2 + lassign [::Plotchart::coordsToPixel $w $x1 $y1] px1 py1 + lassign [::Plotchart::coordsToPixel $w $x2 $y2] px2 py2 + } else { + lassign $coords px1 py1 px2 py2 + } + $w coords $item($w,id,$name) $px1 $py1 $px2 $py2 + } + } +} + + +# point, dot, circle, line, rectangle -- +# Prepare the item data for an (invisible) point or some other canvas item +# +# Arguments: +# args Such things as x-coordinate/y-coordinate but also -fill colour +# +# Result: +# Item data for [create] or [update] +# +# Note: +# The extra arguments are only used in the [create] procedure +# +# point, dot: +# The first argment can be the name of a point or a pair of +# coordinates. The rest is used as attributes +# +# circle: +# The first argment can be the name of a point or a pair of +# coordinates. The second must be the radius, the rest is used as +# attributes +# +# line: +# The first and second argments can be the name of a point or a pair +# of coordinates. The rest is used as attributes. +# +# rectanlge: +# the first and second argments can be the name of a point or a pair +# of coordinates. The rest is used as attributes. +# +proc ::Plotchart::anim::point {w first args} { + variable item + + if { [llength $first] == 2 } { + return [concat point $first [list $args]] + } else { + return [concat point [lrange $item($w,data,$first) 0 1] [list $args]] + } +} + +proc ::Plotchart::anim::circle {w first rad args} { + variable item + + if { [llength $first] == 2 } { + return [concat circle $first $rad [list $args]] + } else { + return [concat circle [lrange $item($w,data,$first) 0 1] $rad [list $args]] + } +} + +proc ::Plotchart::anim::dot {w first args} { + variable item + + if { [llength $first] == 2 } { + return [concat dot $first [list $args]] + } else { + return [concat dot [lrange $item($w,data,$first) 0 1] [list $args]] + } +} + +proc ::Plotchart::anim::line {w first second args} { + variable item + + if { [llength $first] == 1 } { + set first [lrange $item($w,data,$first) 0 1] + } + if { [llength $second] == 1 } { + set second [lrange $item($w,data,$second) 0 1] + } + return [concat line $first $second [list $args]] +} + +proc ::Plotchart::anim::rectangle {w first second args} { + variable item + if {[llength $first] == 1} { + set first [lrange $item($w,data,$first) 0 1] + } + if {[llength $second] == 1} { + set first [lrange $item($w,data,$second) 0 1] + } + return [concat rectangle $first $second [list $args]] +} + + +# coords -- +# Return the current coords of an item +# +# Arguments: +# w path to the canvas +# name name of the item +# +# Return: +# List of coordinates/radius in the same order a during creation +# +# Side effects: +# None +# +proc ::Plotchart::anim::coords {w name} { + variable item + switch -- $item($w,type,$name) { + "point" - "dot" - "circle" {set last 1} + "line" - "rectangle" {set last 3} + } + return [lrange $item($w,data,$name) 0 $last] +} + + +# add -- +# Translate a point over a given vector and return the coordinates +# +# Arguments: +# w path to the canvas +# point Point (name or coordinate pair) +# vector Vector (name or coordinate pair) +# +# Result: +# New coordinate pair +# +proc ::Plotchart::anim::add {w point vector} { + variable item + + if { [llength $point] == 1 } { + set point [lrange $item($w,data,$point) 0 1] + } + if { [llength $vector] == 1 } { + set vector [lrange $item($w,data,$vector) 0 1] + } + foreach {xb yb} $point {xe ye} $vector { + set xn [expr {$xb+$xe}] + set yn [expr {$yb+$ye}] + break + } + return [list $xn $yn] +} + + +# track -- +# Track a point +# +# Arguments: +# w path to the canvas +# cmd Command in question (start, next or stop) +# point Name (!) of the point to track +# args Extra attributes (for colour and such) +# +# Result: +# None +# +# Side effect: +# A line connecting the dots is drawn +# +proc ::Plotchart::anim::track {w cmd point args} { + variable item + + set xp [lindex $item($w,data,$point) 0] + set yp [lindex $item($w,data,$point) 1] + lassign [::Plotchart::coordsToPixel $w $xp $yp] xp yp + + switch -- $cmd { + "start" { + set item($w,track,$point) [$w create line $xp $yp $xp $yp {*}$args] + } + "next" { + set coords [$w coords $item($w,track,$point)] + lappend coords $xp $yp + $w coords $item($w,track,$point) $coords + } + "stop" { + unset item($w,track,$point) + } + } +} + + +# rotate -- +# Rotate one or more item over a given angle and update the coordinates +# +# Arguments: +# w path to canvas +# items List of items +# centre Centre of rotation (name or coordinate pair) +# angle Angle (in radians) +# +# Result: +# New coordinate pair +# +proc ::Plotchart::anim::rotate {w items centre angle} { + variable item + + if { [llength $centre] == 1 } {set centre [lrange $item($w,data,$centre) 0 1]} + lassign $centre xr yr + set cosa [expr {cos($angle)}] + set sina [expr {sin($angle)}] + + foreach name $items { + switch -- $item($w,type,$name) { + "point" - "dot" - "circle" {set last 1} + "line" - "rectangle" {set last 3} + } + set coords [lrange $item($w,data,$name) 0 $last] + set newcoords {} + foreach {xc yc} $coords { + set xn [expr {$xr + $cosa * ($xc-$xr) - $sina*($yc-$yr)}] + set yn [expr {$yr + $sina * ($xc-$xr) + $cosa*($yc-$yr)}] + lappend newcoords $xn $yn + } + set item($w,data,$name) [lreplace $item($w,data,$name) 0 $last {*}$newcoords] + UpdateCoords $w $name $newcoords + } +} + + +# translate -- +# Translate one or more item over a given vector and update the coordinates +# +# Arguments: +# w path to canvas +# items List of items +# vector Vector (name or coordinate pair) +# +# Result: +# New coordinate pair +# +proc ::Plotchart::anim::translate {w items vector} { + variable item + + if { [llength $vector] == 1 } { + set vector [lrange $item($w,data,$vector) 0 1] + } + lassign $vector xv yv + + foreach name $items { + switch -- $item($w,type,$name) { + "point" - "dot" - "circle" {set last 1} + "line" - "rectangle" {set last 3} + } + + set coords [lrange $item($w,data,$name) 0 $last] + set newcoords {} + + foreach {xc yc} $coords { + set xn [expr {$xc + $xv}] + set yn [expr {$yc + $yv}] + lappend newcoords $xn $yn + } + + set item($w,data,$name) [lreplace $item($w,data,$name) 0 $last {*}$newcoords] + UpdateCoords $w $name $newcoords + } +} + + +# morph -- +# change the look of one or more items +# +# Arguments: +# w path to canvas +# items List of items +# shift a list of x y pairs giving the relative shift of the item coordinates +# args additional options: +# -scaling pixel|coord whether the shift is given in pixel space or coordinate space +# +# Result: +# New coordinate pair(s) +# +proc ::Plotchart::anim::morph {w items shift args} { + variable item + variable ::Plotchart::scaling + + array set options {-scaling coord} + array set options $args + foreach name $items { + # calculate the shift in the coordinates + # depending on the base scale: + if {$options(-scaling) eq "pixel"} { + set dshift [list] + foreach {x y} $shift { + set dx [expr {$scaling($w,xfactor)/double($x)}] + set dy [expr {$scaling($w,yfactor)/double($y)}] + lappend dshift $dx $dy + } + set shift $dshift + } elseif {$options(-scaling) eq "coord"} { + # nothing needed here ... + } else { + return -code error "unknown -scaling: $options(-scaling)" + } + + # how many coords to read: + switch -- $item($w,type,$name) { + "point" - "dot" - "circle" {set last 1} + "line" - "rectangle" {set last 3} + } + set coords [lrange $item($w,data,$name) 0 $last] + set newcoords {} + + switch $item($w,type,$name) { + dot - point { + return -code error "a $item($w,type,$name) cannot be morphed" + } + circle { + lassign $coords x y + lassign $shift dx dy + set x [expr {$x + $dx}] + set y [expr {$y + $dy}] + set newcoords $x $y + } + line - rectangle { + lassign $coords x0 y0 x1 y1 + lassign $shift dx0 dy0 dx1 dy1 + set x0 [expr {$x0 + $dx0}] + set x1 [expr {$x1 + $dx1}] + set y0 [expr {$y0 + $dy0}] + set y1 [expr {$y1 + $dy1}] + set newcoords [list $x0 $y0 $x1 $y1] + } + } + set item($w,data,$name) [lreplace $item($w,data,$name) 0 $last {*}$newcoords] + UpdateCoords $w $name $newcoords $options(-scaling) + } +} + +# id -- +# Return the canvas id of an item in order to manipulate it with ordinary canvas commands +# +# Arguments: +# w path to the canvas widget +# name Name of the item +# +# Result: +# The canvas id of the item +# +proc ::Plotchart::anim::id {w name} { + variable item + return $item($w,id,$name) +} + +# animate -- +# Animate some canvas items following a user-defined specification +# +# Arguments: +# w path to the canvas +# args Arguments defining the animation +# +# -duration the duration of the complete animation in ms +# -body a script defining what to animate and how to do so +# +# The body consists of normal Tcl/Plotchart/Plotchart::anim commands +# plus some commands only available within this procedure -body. These can be +# +# morphto item first second +# item name of the item to be morphed +# first, second coordinates/radius, or a point name, to morph to +# (in same order as during item creation) +# +# translateto item first, second +# item name of the item to be translated +# first, second coordinates/radius, or a point name, to translate to +# (in same order as during item creation) +# +# Results: +# None +# +# Side effects: +# some canvas items are animated +# +proc ::Plotchart::anim::animate {w args} { + variable item + array set options {-body {} -duration 1000 -pause 20} + array set options $args + + set stepCount [expr {$options(-duration)/$options(-pause)}] + # translate points into coordinates + # and reorganize body: + set body $options(-body) + set newBody [list] + while {[llength $body]>0} { + set cmd [lindex $body 0] + switch $cmd { + morphto { + set body [lassign $body cmd name first second] + set shiftList [list] + switch $item($w,type,$name) { + circle {} + line - rectangle { + if {[llength $first] == 2} {set newCoords $first} else {set newCoords [coords $first]} + if {[llength $second] == 2} {lappend newCoords {*}$second} else {lappend newCoords {*}[coords $second]} + foreach start [lrange $item($w,data,$name) 0 3] end $newCoords { + lappend shiftList [expr {double($end-$start)/$stepCount}] + } + } + default {return -code error "no such item type: $item($w,type,$name)"} + } + lappend newBody [list morph $w $name $shiftList -scaling coord] + } + default { + #while [info complete ] + set body [lrange $body 1 end] + } + } + } + +# puts "newBody=$newBody ($stepCount steps)" + # do the animation: + for {set step 1} {$step <= $stepCount} {incr step} { + foreach element $newBody { + {*}$element + } + pause $w $options(-pause) + } + +} \ No newline at end of file Property changes on: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotanim.tcl ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotannot.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotannot.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotannot.tcl 2014-11-21 16:13:05 UTC (rev 2218) @@ -0,0 +1,450 @@ +# plotannot.tcl -- +# Facilities for annotating charts +# +# Note: +# This source file contains such functions as to draw a +# balloon text in an xy-graph. +# It is the companion of "plotchart.tcl" +# + +# +# Static data +# +namespace eval ::Plotchart { + # Index, three pairs of scale factors to determine xy-coordinates + set BalloonDir(north-west) {0 0 1 -2 -2 1 0} + set BalloonDir(north) {1 -1 0 0 -3 1 0} + set BalloonDir(north-east) {2 -1 0 2 -2 0 1} + set BalloonDir(east) {3 0 -1 3 0 0 1} + set BalloonDir(south-east) {4 0 -1 2 2 -1 0} + set BalloonDir(south) {5 1 0 0 3 -1 0} + set BalloonDir(south-west) {6 1 0 -2 2 0 -1} + set BalloonDir(west) {7 0 1 -3 0 0 -1} + + set TextDir(centre) c + set TextDir(center) c + set TextDir(c) c + set TextDir(west) w + set TextDir(w) w + set TextDir(north-west) nw + set TextDir(nw) nw + set TextDir(north) n + set TextDir(n) n + set TextDir(north-east) ew + set TextDir(ne) ew + set TextDir(east) e + set TextDir(e) e + set TextDir(south-west) nw + set TextDir(sw) sw + set TextDir(south) s + set TextDir(s) s + set TextDir(south-east) ew + set TextDir(east) e +} + +# DefaultBalloon -- +# Set the default properties of balloon text and other types of annotation +# Arguments: +# w Name of the canvas +# Result: +# None +# Side effects: +# Stores the default settings +# +proc ::Plotchart::DefaultBalloon { w } { + variable settings + + foreach {option value} {font fixed + margin 5 + textcolour black + justify left + arrowsize 5 + background white + outline black + rimwidth 1} { + set settings($w,balloon$option) $value + } + foreach {option value} {font fixed + colour black + justify left} { + set settings($w,text$option) $value + } +} + +# ConfigBalloon -- +# Configure the properties of balloon text +# Arguments: +# w Name of the canvas +# args List of arguments +# Result: +# None +# Side effects: +# Stores the new settings for the next balloon text +# +proc ::Plotchart::ConfigBalloon { w args } { + variable settings + + foreach {option value} $args { + set option [string range $option 1 end] + switch -- $option { + "font" - + "margin" - + "textcolour" - + "justify" - + "arrowsize" - + "background" - + "outline" - + "rimwidth" { + set settings($w,balloon$option) $value + } + "textcolor" { + set settings($w,balloontextcolour) $value + } + } + } +} + +# ConfigPlainText -- +# Configure the properties of plain text +# Arguments: +# w Name of the canvas +# args List of arguments +# Result: +# None +# Side effects: +# Stores the new settings for the next plain text +# +proc ::Plotchart::ConfigPlainText { w args } { + variable settings + + foreach {option value} $args { + set option [string range $option 1 end] + switch -- $option { + "font" - + "textcolour" - + "justify" { + set settings($w,text$option) $value + } + "textcolor" { + set settings($w,textcolour) $value + } + "textfont" { + # Ugly hack! + set settings($w,$option) $value + } + } + } +} + +# DrawBalloon -- +# Plot a balloon text in a chart +# Arguments: +# w Name of the canvas +# x X-coordinate of the point the arrow points to +# y Y-coordinate of the point the arrow points to +# text Text in the balloon +# dir Direction of the arrow (north, north-east, ...) +# Result: +# None +# Side effects: +# Text and polygon drawn in the chart +# +proc ::Plotchart::DrawBalloon { w x y text dir } { + variable settings + variable BalloonDir + + # + # Create the item and then determine the coordinates + # of the frame around the text + # + set item [$w create text 0 0 -text $text -tag BalloonText \ + -font $settings($w,balloonfont) -fill $settings($w,balloontextcolour) \ + -justify $settings($w,balloonjustify)] + + if { ![info exists BalloonDir($dir)] } { + set dir south-east + } + + foreach {xmin ymin xmax ymax} [$w bbox $item] {break} + + set xmin [expr {$xmin-$settings($w,balloonmargin)}] + set xmax [expr {$xmax+$settings($w,balloonmargin)}] + set ymin [expr {$ymin-$settings($w,balloonmargin)}] + set ymax [expr {$ymax+$settings($w,balloonmargin)}] + + set xcentr [expr {($xmin+$xmax)/2}] + set ycentr [expr {($ymin+$ymax)/2}] + set coords [list $xmin $ymin \ + $xcentr $ymin \ + $xmax $ymin \ + $xmax $ycentr \ + $xmax $ymax \ + $xcentr $ymax \ + $xmin $ymax \ + $xmin $ycentr ] + + set idx [lindex $BalloonDir($dir) 0] + set scales [lrange $BalloonDir($dir) 1 end] + + set factor $settings($w,balloonarrowsize) + set extraCoords {} + + set xbase [lindex $coords [expr {2*$idx}]] + set ybase [lindex $coords [expr {2*$idx+1}]] + + foreach {xscale yscale} $scales { + set xnew [expr {$xbase+$xscale*$factor}] + set ynew [expr {$ybase+$yscale*$factor}] + lappend extraCoords $xnew $ynew + } + + # + # Insert the extra coordinates + # + set coords [eval lreplace [list $coords] [expr {2*$idx}] [expr {2*$idx+1}] \ + $extraCoords] + + set xpoint [lindex $coords [expr {2*$idx+2}]] + set ypoint [lindex $coords [expr {2*$idx+3}]] + + set poly [$w create polygon $coords -tag BalloonFrame \ + -fill $settings($w,balloonbackground) \ + -width $settings($w,balloonrimwidth) \ + -outline $settings($w,balloonoutline)] + + # + # Position the two items + # + foreach {xtarget ytarget} [coordsToPixel $w $x $y] {break} + set dx [expr {$xtarget-$xpoint}] + set dy [expr {$ytarget-$ypoint}] + $w move $item $dx $dy + $w move $poly $dx $dy + $w raise BalloonFrame + $w raise BalloonText +} + +# DrawPlainText -- +# Plot plain text in a chart +# Arguments: +# w Name of the canvas +# x X-coordinate of the point the text is positioned to +# y Y-coordinate of the point the text is positioned to +# text Text to be drawn +# anchor Anchor position (north, north-east, ..., defaults to centre) +# Result: +# None +# Side effects: +# Text drawn in the chart +# +proc ::Plotchart::DrawPlainText { w x y text {anchor centre} } { + variable settings + variable TextDir + + foreach {xtext ytext} [coordsToPixel $w $x $y] {break} + + if { [info exists TextDir($anchor)] } { + set anchor $TextDir($anchor) + } else { + set anchor c + } + + $w create text $xtext $ytext -text $text -tag PlainText \ + -font $settings($w,textfont) -fill $settings($w,textcolour) \ + -justify $settings($w,textjustify) -anchor $anchor + + $w raise PlainText +} + +# DrawTimeBalloon -- +# Plot a balloon text in a TXPlot +# Arguments: +# w Name of the canvas +# time Time-coordinate of the point the arrow points to +# y Y-coordinate of the point the arrow points to +# text Text in the balloon +# dir Direction of the arrow (north, north-east, ...) +# Result: +# None +# Side effects: +# Text and polygon drawn in the chart +# +proc ::Plotchart::DrawTimeBalloon { w time y text dir } { + + DrawBalloon $w [clock scan $time] $y $text $dir +} + +# DrawTimePlainText -- +# Plot plain text in a TXPlot +# Arguments: +# w Name of the canvas +# time Time-coordinate of the point the text is positioned to +# y Y-coordinate of the point the text is positioned to +# text Text to be drawn +# anchor Anchor position (north, north-east, ..., defaults to centre) +# Result: +# None +# Side effects: +# Text drawn in the chart +# +proc ::Plotchart::DrawTimePlainText { w time y text {anchor centre} } { + + DrawPlainText $w [clock scan $time] $y $text $anchor +} + +# BrightenColour -- +# Compute a brighter colour +# Arguments: +# color Original colour +# intensity Colour to interpolate with +# factor Factor by which to brighten the colour +# Result: +# New colour +# Note: +# Adapted from R. Suchenwirths Wiki page on 3D bars +# +proc ::Plotchart::BrightenColour {color intensity factor} { + foreach i {r g b} n [winfo rgb . $color] d [winfo rgb . $intensity] f [winfo rgb . white] { + #checker exclude warnVarRef + set $i [expr {int(255.*($n+($d-$n)*$factor)/$f)}] + } + #checker exclude warnUndefinedVar + format #%02x%02x%02x $r $g $b +} + +# DrawGradientBackground -- +# Add a gradient background to the plot +# Arguments: +# w Name of the canvas +# colour Main colour +# dir Direction of the gradient (left-right, top-down, +# bottom-up, right-left) +# intensity Brighten (white) or darken (black) the colours +# rect (Optional) coordinates of the rectangle to be filled +# Result: +# None +# Side effects: +# Gradient background drawn in the chart +# +proc ::Plotchart::DrawGradientBackground { w colour dir intensity {rect {}} } { + variable scaling + + set pxmin $scaling($w,pxmin) + set pxmax $scaling($w,pxmax) + set pymin $scaling($w,pymin) + set pymax $scaling($w,pymax) + + if { $rect != {} } { + foreach {rxmin rymin rxmax rymax} $rect {break} + } else { + set rxmin $pxmin + set rxmax $pxmax + set rymin $pymin + set rymax $pymax + } + + switch -- $dir { + "left-right" { + set dir h + set first 0.0 + set last 1.0 + set fac [expr {($pxmax-$pxmin)/50.0}] + } + "right-left" { + set dir h + set first 1.0 + set last 0.0 + set fac [expr {($pxmax-$pxmin)/50.0}] + } + "top-down" { + set dir v + set first 0.0 + set last 1.0 + set fac [expr {($pymin-$pymax)/50.0}] + } + "bottom-up" { + set dir v + set first 1.0 + set last 0.0 + set fac [expr {($pymin-$pymax)/50.0}] + } + default { + set dir v + set first 0.0 + set last 1.0 + set fac [expr {($pymin-$pymax)/50.0}] + } + } + + if { $dir == "h" } { + set x2 $rxmin + set y1 $rymin + set y2 $rymax + } else { + set y2 $rymax + set x1 $rxmin + set x2 $rxmax + } + + set n 50 + if { $dir == "h" } { + set nmax [expr {ceil($n*($rxmax-$rxmin)/double($pxmax-$pxmin))}] + } else { + set nmax [expr {ceil($n*($rymin-$rymax)/double($pymin-$pymax))}] + } + for { set i 0 } { $i < $nmax } { incr i } { + set factor [expr {($first*$i+$last*($n-$i-1))/double($n)}] + set gcolour [BrightenColour $colour $intensity $factor] + + if { $dir == "h" } { + set x1 $x2 + set x2 [expr {$rxmin+($i+1)*$fac}] + if { $i == $nmax-1 } { + set x2 $rxmax + } + } else { + set y1 $y2 + set y2 [expr {$rymax+($i+1)*$fac}] + if { $i == $nmax-1 } { + set y2 $rymin + } + } + + $w create rectangle $x1 $y1 $x2 $y2 -fill $gcolour -outline $gcolour -tag {data background} + } + + $w lower data + $w lower background +} + +# DrawImageBackground -- +# Add an image (tilde) to the background to the plot +# Arguments: +# w Name of the canvas +# colour Main colour +# image Name of the image +# Result: +# None +# Side effects: +# Image appears in the plot area, tiled if needed +# +proc ::Plotchart::DrawImageBackground { w image } { + variable scaling + + set pxmin $scaling($w,pxmin) + set pxmax $scaling($w,pxmax) + set pymin $scaling($w,pymin) + set pymax $scaling($w,pymax) + + set iwidth [image width $image] + set iheight [image height $image] + + for { set y $pymax } { $y > $pymin } { set y [expr {$y-$iheight}] } { + for { set x $pxmin } { $x < $pxmax } { incr x $iwidth } { + $w create image $x $y -image $image -anchor sw -tags {data background} + } + } + + $w lower data + $w lower background +} Property changes on: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotannot.tcl ___________________________________________________________________ Added: svn:executable ## -0,0 +1 ## +* \ No newline at end of property Added: branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotchart/plotaxis.tcl 2014-11-21 16:13:05 UTC (rev 2218) @@ -0,0 +1,2061 @@ +# plotaxis.tcl -- +# Facilities to draw simple plots in a dedicated canvas +# +# Note: +# This source file contains the functions for drawing the axes +# and the legend. It is the companion of "plotchart.tcl" +# + +# FormatNumber -- +# Format a number (either as double or as integer) +# Arguments: +# format Format string +# number Number to be formatted +# Result: +# String containing the formatted number +# Note: +# This procedure tries to format the string as a double first, +# but to allow formats like %x, it also tries it that way. +# +proc ::Plotchart::FormatNumber { format number } { + + if { [catch { + set string [format $format $number] + } msg1] } { + if { [catch { + set string [format $format [expr {int($number)}]] + } msg2] } { + set string [format $format $number] ;# To get the original message + } + } + + return $string +} + +# Ceil, Floor -- +# Compute ceil and floor in an absolute sense +# +# Arguments: +# value Extreme value to "round" +# step Step to use for rounding +# +proc ::Plotchart::Floor {value step} { + + if { $step eq "" } { + return $value + } + + if { $value > 0.0 } { + set result [expr {floor(($value+0.0)/$step) * $step}] + } else { + set result [expr {ceil(($value+0.0)/$step) * $step}] + } + + return $result +} +proc ::Plotchart::Ceil {value step} { + + if { $step eq "" } { + return $value + } + + if { $value > 0.0 } { + set result [expr {ceil(($value+0.0)/$step) * $step}] + } else { + set result [expr {floor(($value+0.0)/$step) * $step}] + } + + return $result +} + +# DrawYaxis -- +# Draw the y-axis +# Arguments: +# w Name of the canvas +# ymin Minimum y coordinate +# ymax Maximum y coordinate +# ystep Step size +# args Options (currently: -ylabels list) +# Result: +# None +# Side effects: +# Axis drawn in canvas +# +proc ::Plotchart::DrawYaxis { w ymin ymax ydelt args} { + variable scaling + variable config + + set scaling($w,ydelt) $ydelt + + $w delete "yaxis && $w" + + set linecolor $config($w,leftaxis,color) + set textcolor $config($w,leftaxis,textcolor) + set textfont $config($w,leftaxis,font) + set ticklength $config($w,leftaxis,ticklength) + set thickness $config($w,leftaxis,thickness) + set labeloffset $config($w,leftaxis,labeloffset) + set offtick [expr {($ticklength > 0)? $ticklength+$labeloffset : $labeloffset}] + + if { $config($w,leftaxis,showaxle) } { + $w create line $scaling($w,pxmin) $scaling($w,pymin) \ + $scaling($w,pxmin) $scaling($w,pymax) \ + -fill $linecolor -tag [list yaxis $w] -width $thickness + } + + set format $config($w,leftaxis,format) + if { [info exists scaling($w,-format,y)] } { + set format $scaling($w,-format,y) + } + + if { $ymax > $ymin } { + set y [Ceil $ymin $ydelt] + set ym [Floor $ymax $ydelt] + set yt $y + } else { + set y [Floor $ymax $ydelt] + set ym [Ceil $ymin $ydelt] + set yt $ym + } + + set scaling($w,yaxis) {} + + set ys {} + set yts {} + set ybackup {} + set numeric 1 + + if { $ydelt eq {} } { + + foreach {arg val} $args { + switch -exact -- $arg { + -ylabels { + set ys $val + set ydbackup [expr {($scaling($w,ymax)-$scaling($w,ymin))/([llength $val]-1.0)}] + set yb $scaling($w,ymin) + + foreach yval $val { + if { [string is double $yval] } { + lappend yts [expr {$yval+0.0}] + } else { + set numeric 0 + lappend yts $yval + } + lappend ybackup $yb + set yb [expr {$yb + $ydbackup}] + } + + set scaling($w,ydelt) $ys + } + default { + error "Argument $arg not recognized" + } + } + } + } else { + set scaling($w,ydelt) $ydelt + while { $y < $ym+0.0001*abs($ydelt) } { + lappend ys $y + lappend yts $yt + set y [expr {$y+abs($ydelt)}] + set yt [expr {$yt+$ydelt}] + if { abs($y) < 0.5*abs($ydelt) } { + set yt 0.0 + } + } + set dyminor [expr {$ydelt/($config($w,leftaxis,minorticks)+1.0)}] + } + + foreach y $ys yt $yts yb $ybackup { + + if { $numeric } { + foreach {xcrd ycrd} [coordsToPixel $w $scaling($w,xmin) $yt] {break} + } else { + foreach {xcrd ycrd} [coordsToPixel $w $scaling($w,xmin) $yb] {break} + } + set xcrd2 [expr {$xcrd-$ticklength}] + set xcrd3 [expr {$xcrd-$offtick}] + + if { $ycrd >= $scaling($w,pymin)-1 && $ycrd <= $scaling($w,pymax)+1 } { + lappend scaling($w,yaxis) $ycrd + + # + # Use the default format %.12g - this is equivalent to setting + # tcl_precision to 12 - to solve overly precise labels in Tcl 8.5 + # + if { [string is double $yt] } { + set ylabel [format "%.12g" $yt] + if { $format != "" } { + set ylabel [FormatNumber $format $y] + } + } else { + set ylabel $yt + } + $w create line $xcrd2 $ycrd $xcrd $ycrd -tag [list yaxis $w] -fill $linecolor + + if { $config($w,leftaxis,shownumbers) } { + $w create text $xcrd3 $ycrd -text $ylabel -tag [list yaxis $w] -anchor e \ + -fill $textcolor -font $textfont + } + + if { $ydelt != {} && $numeric && $yt < $ym } { + for {set i 1} {$i <= $config($w,leftaxis,minorticks)} {incr i} { + set xcrd4 [expr {$xcrd-$ticklength*0.6}] + set yminor [expr {$yt + $i * $dyminor}] + foreach {xcrd ycrd4} [coordsToPixel $w $scaling($w,xmin) $yminor] {break} + $w create line $xcrd4 $ycrd4 $xcrd $ycrd4 -tag [list yaxis $w] -fill $linecolor + } + } + } + } +} + +# DrawRightaxis -- +# Draw the y-axis on the right-hand side +# Arguments: +# w Name of the canvas +# ymin Minimum y coordinate +# ymax Maximum y coordinate +# ystep Step size +# args Options (currently: -ylabels list) +# Result: +# None +# Side effects: +# Axis drawn in canvas +# +proc ::Plotchart::DrawRightaxis { w ymin ymax ydelt args } { + variable scaling + variable config + + set scaling($w,ydelt) $ydelt + + $w delete "raxis && $w" + + set linecolor $config($w,rightaxis,color) + set textcolor $config($w,rightaxis,textcolor) + set textfont $config($w,rightaxis,font) + set thickness $config($w,rightaxis,thickness) + set ticklength $config($w,rightaxis,ticklength) + set labeloffset $config($w,leftaxis,labeloffset) + set offtick [expr {($ticklength > 0)? $ticklength+$labeloffset : $labeloffset}] + + if { $config($w,rightaxis,showaxle) } { + $w create line $scaling($w,pxmax) $scaling($w,pymin) \ + $scaling($w,pxmax) $scaling($w,pymax) \ + -fill $linecolor -tag [list raxis $w] -width $thickness + } + + set format $config($w,rightaxis,format) + if { [info exists scaling($w,-format,y)] } { + set format $scaling($w,-format,y) + } + + if { $ymax > $ymin } { + set y [Ceil $ymin $ydelt] + set ym [Floor $ymax $ydelt] + set yt $y + } else { + set y [Floor $ymax $ydelt] + set ym [Ceil $ymin $ydelt] + set yt $ym + } + + set scaling($w,yaxis) {} + + set ys {} + set yts {} + set ybackup {} + set numeric 1 + + if { $ydelt eq {} } { + + foreach {arg val} $args { + switch -exact -- $arg { + -ylabels { + set ys $val + set ydbackup [expr {($scaling($w,ymax)-$scaling($w,ymin))/([llength $val]-1.0)}] + set yb $scaling($w,ymin) + + foreach yval $val { + if { [string is double $yval] } { + lappend yts [expr {$yval+0.0}] + } else { + set numeric 0 + lappend yts $yval + } + lappend ybackup $yb + set yb [expr {$yb + $ydbackup}] + } + + set scaling($w,ydelt) $ys + } + default { + error "Argument $arg not recognized" + } + } + } + } else { + set scaling($w,ydelt) $ydelt + while { $y < $ym+0.0001*abs($ydelt) } { + lappend ys $y + lappend yts $yt + set y [expr {$y+abs($ydelt)}] + set yt [expr {$yt+$ydelt}] + if { abs($y) < 0.5*abs($ydelt) } { + set yt 0.0 + } + } + set dyminor [expr {$ydelt/($config($w,rightaxis,minorticks)+1.0)}] + } + + + foreach y $ys yt $yts yb $ybackup { + + if { $numeric } { + foreach {xcrd ycrd} [coordsToPixel $w $scaling($w,xmax) $yt] {break} + } else { + foreach {xcrd ycrd} [coordsToPixel $w $scaling($w,xmax) $yb] {break} + } + set xcrd2 [expr {$xcrd+$ticklength}] + set xcrd3 [expr {$xcrd+$offtick}] + + if { $ycrd >= $scaling($w,pymin)-1 && $ycrd <= $scaling($w,pymax)+1 } { + lappend scaling($w,yaxis) $ycrd + + # + # Use the default format %.12g - this is equivalent to setting + # tcl_precision to 12 - to solve overly precise labels in Tcl 8.5 + # + if { [string is double $yt] } { + set ylabel [format "%.12g" $yt] + if { $format != "" } { + set ylabel [FormatNumber $format $y] + } + } else { + set ylabel $yt + } + $w create line $xcrd2 $ycrd $xcrd $ycrd -tag [list raxis $w] -fill $linecolor + + if { $config($w,leftaxis,shownumbers) } { + $w create text $xcrd3 $ycrd -text $ylabel -tag [list raxis $w] -anchor w \ + -fill $textcolor -font $textfont + } + + if { $ydelt != {} && $numeric && $yt < $ym } { + for {set i 1} {$i <= $config($w,rightaxis,minorticks)} {incr i} { + set xcrd4 [expr {$xcrd+$ticklength*0.6}] + set yminor [expr {$yt + $i * $dyminor}] + foreach {xcrd ycrd4} [coordsToPixel $w $scaling($w,xmax) $yminor] {break} + $w create line $xcrd4 $ycrd4 $xcrd $ycrd4 -tag [list raxis $w] -fill $linecolor + } + } + } + } +} + +# DrawLogYaxis -- +# Draw the logarithmic y-axis +# Arguments: +# w Name of the canvas +# ymin Minimum y coordinate +# ymax Maximum y coordinate +# ystep Step size +# Result: +# None +# Side effects: +# Axis drawn in canvas +# +proc ::Plotchart::DrawLogYaxis { w ymin ymax ydelt } { + variable scaling + variable config + + set scaling($w,ydelt) $ydelt + + $w delete "yaxis && $w" + + set linecolor $config($w,leftaxis,color) + set textcolor $config($w,leftaxis,textcolor) + set textfont $config($w,leftaxis,font) + set thickness $config($w,leftaxis,thickness) + set ticklength $config($w,leftaxis,ticklength) + set labeloffset $config($w,leftaxis,labeloffset) + set offtick [expr {($ticklength > 0)? $ticklength+$labeloffset : $labeloffset}] + + if { $config($w,leftaxis,showax... [truncated message content] |
From: <ro...@us...> - 2014-11-21 16:22:28
|
Revision: 2219 http://sourceforge.net/p/nsclspectcl/code/2219 Author: ron-fox Date: 2014-11-21 16:22:21 +0000 (Fri, 21 Nov 2014) Log Message: ----------- Integrate the interval spectrum plotter with SpecTclRC.tcl and some fine tuning of those scripts. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-11-21 16:13:05 UTC (rev 2218) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-11-21 16:22:21 UTC (rev 2219) @@ -80,3 +80,6 @@ splash::progress $splash {SpecTcl ready for use} 1 splash::config $splash -delay 2000 + + +source plotIntervalSpectra.tcl \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-11-21 16:13:05 UTC (rev 2218) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-11-21 16:22:21 UTC (rev 2219) @@ -9,9 +9,9 @@ source plotLog.tcl toplevel .plots -wm title .plots {Time interval plots} -lappend IntervalCanvases [canvas .plots.ungated -width 700 -height 200] -lappend IntervalCanvases [canvas .plots.gated -width 700 -height 200] +wm title .plots {Time interval plots} +lappend IntervalCanvases [canvas .plots.ungated -width 800 -height 300] +lappend IntervalCanvases [canvas .plots.gated -width 800 -height 300] foreach canvas $IntervalCanvases { @@ -66,12 +66,8 @@ set hi [lindex $xAxisSpec 1] set channels [lindex $xAxisSpec 2] - puts $name - puts $xAxisSpec - puts $low - puts $hi - puts $channels + set xcoords [list] set ycoords [list] for {set i 0} {$i < $channels} {incr i} { Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2014-11-21 16:13:05 UTC (rev 2218) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2014-11-21 16:22:21 UTC (rev 2219) @@ -20,8 +20,6 @@ set ySpec [Plotchart::determineScale 0 [expr max([join $yvalues , ]) ]] set xSpec [list 0.01 1.0e[expr int($hi)]] - puts $ySpec - puts $xSpec set plot [::Plotchart::createLogXYPlot $canvas $xSpec $ySpec ] $plot xconfig -format %.0E This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-12-05 11:33:31
|
Revision: 2220 http://sourceforge.net/p/nsclspectcl/code/2220 Author: ron-fox Date: 2014-12-05 11:33:21 +0000 (Fri, 05 Dec 2014) Log Message: ----------- Get the fie writer working and fix an error in the event builder output Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CCFileWriter.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CCFileWriter.h Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CCFileWriter.cpp =================================================================== Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CCFileWriter.h =================================================================== Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-11-21 16:22:21 UTC (rev 2219) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-12-05 11:33:21 UTC (rev 2220) @@ -46,6 +46,7 @@ m_highPTimestamp("timestampPS", "ps"), m_moduleID("moduleID"), m_bankNo("bankNo"), + m_Energy("Energy"), m_fInitialized(false) {} CEventBuilder::~CEventBuilder() {} @@ -234,7 +235,9 @@ 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; + // remove the event from the queue: m_builtEvents.pop_front(); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-11-21 16:22:21 UTC (rev 2219) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.h 2014-12-05 11:33:21 UTC (rev 2220) @@ -107,6 +107,7 @@ CTreeParameter m_highPTimestamp; // High precision timing from the TDC. CTreeParameter m_moduleID; // ID of the ADC module in the built event. CTreeParameter m_bankNo; // Bank number of the ADC module in the built event + CTreeParameter m_Energy; // Raw energy value of the event. WrapTrack m_adcWrapping[2][3]; /* Each adc has 2 banks each with a common stamp. */ WrapTrack m_tdcWrapping[34]; /* 34 channels...due to ordering each with independent stamp. */ Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-11-21 16:22:21 UTC (rev 2219) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/Makefile 2014-12-05 11:33:21 UTC (rev 2220) @@ -31,7 +31,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 + CTimeParameters.o CFileWriter.o # Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-11-21 16:22:21 UTC (rev 2219) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-12-05 11:33:21 UTC (rev 2220) @@ -47,6 +47,7 @@ #include "CFitY3FCommand.h" #include "CEventBuilder.h" #include "CTimeParameters.h" +#include "CFileWriter.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -108,6 +109,7 @@ RegisterEventProcessor(*(new CEventBuilder), "eventBuilder"); RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); RegisterEventProcessor(*(new CTimeParameters), "Time-parameters"); + RegisterEventProcessor(*(new CFileWriter), "file-writer"); // 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...> - 2014-12-05 12:25:20
|
Revision: 2221 http://sourceforge.net/p/nsclspectcl/code/2221 Author: ron-fox Date: 2014-12-05 12:25:12 +0000 (Fri, 05 Dec 2014) Log Message: ----------- * Comment the sync loss correction coded in the event builder better. * Small cleanups in the multiplicity code: - Correct the timing for the output data offset/end times. - Remove dead code/constants. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-12-05 11:33:21 UTC (rev 2220) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CEventBuilder.cpp 2014-12-05 12:25:12 UTC (rev 2221) @@ -389,15 +389,19 @@ 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: + // 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(); tac.pop_front(); return; } - // NO match in the front so drop oldest elements until we can get a match or one of the queues - // emptied: + // 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. Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-12-05 11:33:21 UTC (rev 2220) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMultiplicity.cpp 2014-12-05 12:25:12 UTC (rev 2221) @@ -323,7 +323,6 @@ return kfFALSE; // Abort event processing. } - double nsPerTick = 1000.0*1000.0/m_frequency; // (1000usec/ms, 1000ns/usec)/ms^-1 -> ns. double highPStampNs = highPTimestamp / 1000.0; /// 1000ps/ns. double timestamp = rawTimestamp; @@ -337,7 +336,6 @@ // Figure out the cycle and bin: - // double fullBin = (timestamp*nsPerTick)/m_minTime; double fullBin = (highPStampNs)/m_minTime; unsigned cycle = fullBin/m_bins; unsigned bin = fullBin - (cycle*m_bins); @@ -858,15 +856,15 @@ double CMultiplicity::startDelay() { - double firstTimestamp = 1.0e06; // Likely to be less than this. + double firstTimestamp = 1.0e20; // Likely to be less than this. for (int i =0; i < m_fragmentQueues.size(); i++) { double aFirst = m_fragmentQueues[i].s_firstTimestamp; if (aFirst < firstTimestamp) firstTimestamp = aFirst; } - double startDelayus = firstTimestamp/m_frequency; // Milliseconds. - startDelayus *= 1000; // Microseconds. + double startDelayus = firstTimestamp/(1000); // Microseconds + return startDelayus; } /** @@ -882,8 +880,8 @@ double aLast = m_fragmentQueues[i].s_lastTimestamp; if (aLast > lasttime) lasttime = aLast; } - - lasttime = (lasttime /m_frequency) * 1000; // last time in usec. + // lasttime is in nanoseconds at this point + lasttime = (lasttime / 1000); // last time in usec. return (lasttime)/1.0e6; // Result in seconds. } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-12-05 21:47:35
|
Revision: 2223 http://sourceforge.net/p/nsclspectcl/code/2223 Author: ron-fox Date: 2014-12-05 21:47:31 +0000 (Fri, 05 Dec 2014) Log Message: ----------- * Add dialog wrapper widget (stolen from ReadoutGui in nscldaq-11.0 * Add widgets to set multiplicity parameters. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/dialogwrapper.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl Added: branches/LLNLMadcChainSpecTcl-mtdcdev/dialogwrapper.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/dialogwrapper.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/dialogwrapper.tcl 2014-12-05 21:47:31 UTC (rev 2223) @@ -0,0 +1,194 @@ +# 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 DataSourceUI.tcl +# @brief GUI for selecting data sources for the experiment. +# @author Ron Fox <fo...@ns...> + +package require snit +package require Tk +package provide DialogWrapper 1.0 + +## +# DialogWrapper +# Wraps a widget in a dialog container this includes: +# * OK/Cancel buttons located below the widget. +# * Method to become application modal. +# * Delegation of all unrecognized options and methods to the contained +# widget. +# OPTIONS +# -form - Sets the widget that will appear in the control area. +# -showcancel - Determines if the widget displays the cancel button. If +# false, only the Ok button is displayed. +# METHODS +# controlarea - Returns the parent that should be used when creating the +# -form widget. +# modal - grabs events and blocks until either OK or Cancel is clicked. +# Returns either Ok, Cancel or Destroyed to indicate what +# caused the exit from modality. +# +snit::widgetadaptor DialogWrapper { + component controlarea; # The wrapped widget. + + option -form -default "" -configuremethod _setControlArea + option -showcancel -default true -configuremethod _showCancelConfig + delegate option * to controlarea + delegate method * to controlarea + + variable action ""; # Will contain the event that ended modality. + + ## + # constructor + # lays out the generic shape of the dialog and fills in the + # action area. The dialog is of the form: + # + # +-----------------------------------+ + # | frame into which controlarea | (control area) + # | is put | + # +-----------------------------------+ + # | [OK] [Cancel] | (action area). + # +-----------------------------------+ + # + constructor args { + installhull using ttk::frame + + ttk::frame $win.controlframe -relief groove -borderwidth 2 + ttk::frame $win.actionframe + ttk::button $win.actionframe.ok -text Ok + ttk::button $win.actionframe.cancel -text Cancel + + grid $win.actionframe.ok $win.actionframe.cancel + grid $win.controlframe -sticky nsew + grid $win.actionframe + + grid rowconfigure $win 0 -weight 1 + grid columnconfigure $win 0 -weight 1 + grid rowconfigure $win.controlframe 0 -weight 1 + grid columnconfigure $win.controlframe 0 -weight 1 + + $self configurelist $args + } + ## + # destructor + # Ensure there are no callback handlers left: + # + destructor { + catch {$win.actionframe.ok configure -command [list]} + catch {$win.actionframe.cancel configure -command [list]} + catch {$win bind <Destroy> [list]} + + } + #-------------------------------------------------------------------------de + # Public methods + + ## + # controlarea + # + # @return widget path - the parent of any -form widget. + # + method controlarea {} { + return $win.controlframe + } + ## + # modal + # Enters the modal state: + # * Adds handlers for the buttons and destroy event. + # * grabs events to $win + # * vwaits on the action var. + # * When the vwait finishes, kills off the handlers. + # * Returns the contents of the action variable which will have been + # set by the action handler that fired. + # + # @return string the action that ended the wait + # * Ok - the Ok button was clicked. + # * Cancel - the Cancel button was clicked. + # * Destroy - The widget is being destroyed. + # + method modal {} { + $win.actionframe.ok configure -command [mymethod _setAction Ok] + $win.actionframe.cancel configure -command [mymethod _setAction Cancel] + bind $win <Destroy> [mymethod _setAction Destroyed] + + # Here's the modal section. + + grab set $win + vwait [myvar action] + catch {grab release $win}; # catch in case we're being destroyed. + + # Catches here in case the windows being configured have been + # destroyed... + + catch {$win.actionframe.ok configure -command [list]} + catch {$win.actionframe.cancle configure -command [list]} + catch {bind $win <Destroy> [list]} + + if {[info exists action]} { + return $action + } else { + return "Destroyed"; # Destruction too far in process + } + } + + #------------------------------------------------------------------------- + # Configuration handlers: + + ## + # _setControlArea + # + # Option handler for the -form configuration option. This sets the + # widget that will be contained in the control area. + # + # @param optname - Name of the option being configured (-form) + # @param widget - Widget path to the object that should be pasted into the form. + # + # @note - The form is installed as the controlarea component so that options + # and methods can be delegated to it. + # + method _setControlArea {optname widget} { + install controlarea using set widget + grid $widget -in $win.controlframe -sticky nsew + + set options($optname) $widget + } + ## + # _showCancelConfig + # Modify the value of the -showcancel option. + # + # @param optname - option name. + # @param value - new value. + # + method _showCancelConfig {optname value} { + set old $options($optname) + set options($optname $value) + + if {$old != $value} { + if {$value} { + grid $win.actionframe.cancel -row 0 -column 1 + } else { + grid forget $win.actionframe.cancel + } + } + } + #--------------------------------------------------------------------------- + # Private action handlers. + + ## + # _setAction + # Set the action variable to a specific value. + # + method _setAction value { + set action $value + } +} Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-05 14:59:12 UTC (rev 2222) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-05 21:47:31 UTC (rev 2223) @@ -11,7 +11,7 @@ # @file eventbuilderui.tcl # @brief Graphical user interface for the event builder. # @author Ron Fox (rfo...@gm...) - +package provide EvbUI 1.0 package require Tk package require snit @@ -29,10 +29,11 @@ snit::widgetadaptor EvbUI { component spinbox - option -value -default 0 -configuremethod _set + option -value -default 0 -configuremethod _set -cgetmethod _get option -command -default [list] delegate option -increment to spinbox + delegate option -from to spinbox ## # constructor @@ -70,10 +71,16 @@ error "-value must be an integer >= 0 was $optval" } $spinbox set $optval - set options($optname) $optval $self _dispatch } ## + # _get + # Return the current value of the spin box: + # + method _get {optname} { + return [$spinbox get] + } + ## # _inc # Called in response to the increment event. Increment the value of the # entry. @@ -95,7 +102,8 @@ method _dec {} { set value [$spinbox get] incr value -1 - if {$value >= 0} { + set low [$spinbox cget -from] + if {$value >= $low} { $spinbox set $value $self _dispatch } else { Added: branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2014-12-05 21:47:31 UTC (rev 2223) @@ -0,0 +1,448 @@ +# +#****************************************************************************** +# +# Via Vetraia, 11 - 55049 - Viareggio ITALY +# +390594388398 - www.caen.it +# +#***************************************************************************//** +# + +## +# @file multiplicityUI.tcl +# @brief Provide user interface to control the multiplicity spectrum calculator. +# @author Ron Fox (rfo...@gm...) +# +package provide multiplicityUI 1.0 +package require Tk +package require snit +package require EvbUI +package require DialogWrapper + + +## +# @class MultiplictyUI +# Main user interface for the multiplicity user interface. +# We provide the ability to control: +# - multiplicity.bins - Number of bins in the multiplicity 'spectrum.' +# - multiplicty.mintime - Time width of the multiplicity spectrum bins in ns. +# - multiplicityROIS - An array of regions of interest (gates) that +# define which events are gammas. +# +# OPTIONS +# * -bins - Current bin count +# * -binwidth - Width of multiplicity bins. +# * -madcs - List of MADC ids (should be 0,1,2 normally). +# * -rois - List of gate names that define what a gamma is. +# * -command - Script invoked when something changed...anything. +# * -addcommand - Script invoked by add button. +# +# LAYOUT: +# +----------------------------------------------------------+ +# | Binning: Bins: [ ^V] Bin Width(ns): [ ^V] | +# | | +# | madcIds: | +# | [ ^V] [Add] [ ] | +# | [ ] | +# | Regions of interest: | +# | [Add...] [ ] | +# | [ ] | +# +----------------------------------------------------------+ +# +# A bit on the user interface: +# * The bins and bin width spinbox just invoke the command +# method for every change. +# * The [Add] button in madcIds adds the number in the madcIds +# spinbox to the list of ids at the right...unless that madc is +# already in that list in which case the bell rings.k +# * Double clicking an madc id in the list box will remove it from the list. +# * Both of the two changes in madcids described above result in a +# -command dispatch. +# * The [Add...] button in the regions of interest invokes the -addcommand +# script which is supposed to return a list of items to add to the +# listbox, -command is invoked if that list is non-empty. +# * Double clicking an element of the ROI listbox removes that item +# from the list and invokes -command. +# +snit::widgetadaptor MultiplicityUI { + component bins + component binwidths + + component madcid + component madcidlist + component addmadcid + + component addgate + component gatelist + + option -bins -configuremethod [list _setSpinbox bins] \ + -cgetmethod [list _getSpinbox bins] + option -binwidth -configuremethod [list _setSpinbox binwidths] \ + -cgetmethod [list _getSpinbox binwidths] + + option -madcs -configuremethod [list _setListbox madcidlist] \ + -cgetmethod [list _getListbox madcidlist] + + option -rois -configuremethod [list _setListbox gatelist] \ + -cgetmethod [list _getListbox gatelist] + + option -command + option -addcommand + + ## + # constructor + # - Install a ttk::frame as the hull. + # - Create widgets and install components. + # - Layout the widgets + # - Set up internal event handlers. + # - Process configuration parameters. + # + constructor args { + installhull using ttk::frame + + # Create/layout the binning frame: + + set binning [ttk::labelframe $win.binning -text Binning] + ttk::label $binning.binslabel -text {Bins: } + install bins using EvbUI $binning.bins -from 1 \ + -command [mymethod _dispatch -command] + ttk::label $binning.binwidlabel -text {Bin width (ns): } + install binwidths using EvbUI $binning.width -from 1 \ + -command [mymethod _dispatch -command] + + + grid $binning.binslabel $bins $binning.binwidlabel $binwidths -sticky w \ + -padx 3 + grid $binning -sticky ew + + # Create the ROI frame: + + set rois [ttk::labelframe $win.rois -text ROIS] + install addgate using ttk::button $rois.add -text {Add ...} \ + -command [mymethod _dispatchAdd] + install gatelist using listbox $rois.gatelist -selectmode multiple \ + -yscrollcommand [list $rois.sb set] + ttk::scrollbar $rois.sb -command [list $gatelist yview] -orient vertical + bind $gatelist <Double-1> [mymethod _removeGates] + + grid $addgate $gatelist -sticky ew -padx 3 + grid $rois.sb -row 0 -column 2 -sticky nsw + grid $rois -sticky ew + + + # Create/layout the ids frame: + + set ids [ttk::labelframe $win.ids -text {MADC Ids}] + install madcid using EvbUI $ids.madid -from 0 + install addmadcid using ttk::button $ids.add -text {Add} \ + -command [mymethod _addId] + install madcidlist using listbox $ids.madcidlist -selectmode multiple \ + -yscrollcommand [list $ids.sb set] + ttk::scrollbar $ids.sb -orient vertical -command [list $madcidlist yview] + + bind $madcidlist <Double-1> [mymethod _removeIds] + + grid $madcid $addmadcid $madcidlist -sticky w -padx 3 + grid $ids.sb -row 0 -column 3 -sticky nsw + grid $ids -sticky ew + + $self configurelist $args + } + + + ## + # _dispatch + # Dispatches to a script at the top level. + # + # @param optname - Option that is holding the script. + # @return the return value of the script else empty if there is no script. + # + method _dispatch optname { + set script $options($optname) + if {$script ne ""} { + return [uplevel #0 $script] + } else { + return "" + } + } + ## + # _dispatchAdd + # Dispatches the -add option. The script is supposed to produce + # a (possibily empty) list of gate names to add to the list box. + # + method _dispatchAdd {} { + set script $options(-addcommand) + if {$script ne ""} { + set list [$self _dispatch -addcommand] + if {[llength $list] > 0} { + $gatelist insert end {*}$list + $self _dispatch -command + } + } + } + ## + # _removeGates + # + # Remove gates from the regions of interest list. + # The gates removed are the ones selected in the ROI listbox. + # after all gates are removed, the -command script is dispatched. + # If no gates are selected, this is a no-op. + # + method _removeGates {} { + set selectedGates [$gatelist curselection] + if {[llength $selectedGates] == 0} { + return; # Empty list is no-op. + } + + + # We need to remove them in decreasing index order so that + # indices don't get invalidated: + + set selectedGates [lsort -decreasing -integer $selectedGates] + foreach gate $selectedGates { + $gatelist delete $gate + } + # Run the user script: + + $self _dispatch -command + } + ## + # _addId + # If the current value of the spinbox is not in the id list, + # it is added. If it already is, this method is a no-op. + # If an id is added, the -command script is invoked. + # + method _addId {} { + set id [$madcid cget -value] + set ids [$madcidlist get 0 end] + if {$id ni $ids} { + $madcidlist insert end $id + $self _dispatch -command + } + } + ## + # _removeIds + # Removes any ids that are selected in the MADC id list. + # If none are selecdted then this is a no-op. + # If ids are removed, the -command script is invoked. + # + method _removeIds {} { + set selectedIds [$madcidlist curselection] + if {[llength $selectedIds] > 0} { + set selectedIds [lsort -decreasing -integer $selectedIds] + foreach id $selectedIds { + $madcidlist delete $id + } + $self _dispatch -command + } + } + ## + # _setSpinbox + # Set the contents of a spin box to a configuration. + # + # @param compname -name of the component to affect. + # @param optname -Option name (ignored). + # @param optvalue -New value for component + # + method _setSpinbox {compname optname optvalue} { + [set $compname] configure -value $optvalue + } + ## + # _getSpinbox + # Return the contents of a spinbox from a cget. + # + # @param compname - component name + # @param optname - Option name (ignored) + # @return int - value of listbox. + # + method _getSpinbox {compname optname} { + return "[[set $compname] cget -value]" + } + ## + # _setListbox + # Set the contents of a list box from a configuration parameter. + # + # @param compname - name of the component list box. + # @param optname - name of the option being configured (ignored). + # @param optval - new value (list of listbox items). + # + method _setListbox {compname optname optval} { + [set $compname] delete 0 end + foreach item $optval { + [set $compname] insert end $item + } + } + ## + # _getListbox + # Returns the contents of a list box via a cget. + # + # @param compname - name of the component list box. + # @param optname - Name of the option being cget-ed ignored. + # + # @return list of values from the listbox. + # + method _getListbox {compname optname} { + return [[set $compname] get 0 end] + } +} + + +## +# @class ListChooser +# Megawidget that allows you to move items between a pair of lists. +# +# OPTIONS +# * -leftcontents - set/get contents of left listbox. +# * -rightcontents - set/get contents of right listbox. +# +# Double clicking in one listbox moves the selection to the other listbox. +# +snit::widgetadaptor ListChooser { + component left + component right + + option -leftcontents \ + -configuremethod [list _setListbox left] \ + -cgetmethod [list _getListbox left] + + option -rightcontents \ + -configuremethod [list _setListbox right] \ + -cgetmethod [list _getListbox right] + + ## + # constructor + # - Install a ttk::frame as the hull. + # - Create and layout the widgets. + # - Set bindings on the Double-1 button for both lists. + # - Configure via the args. + # + constructor args { + installhull using ttk::frame + + install left using listbox $win.left \ + -yscrollcommand [list $win.lsb set] + ttk::scrollbar $win.lsb -command [list $left yview] + + install right using listbox $win.right \ + -yscrollcommand [list $win.rsb set] + ttk::scrollbar $win.rsb -command [list $right yview] + + grid $left $win.lsb $right $win.rsb -sticky nswe + + bind $left <Double-1> [mymethod _transfer $left $right] + bind $right <Double-1> [mymethod _transfer $right $left] + + $self configurelist $args + } + + ## + # _setListbox + # configuremethod that sets a specific listbox component + # given a configuration option + # + # @param compname - Name of the component to modify. + # @param optname - Name of the option being configured. + # @param optval - New value for the option. + # + method _setListbox {compname optname optval} { + [set $compname] delete 0 end + [set $compname] insert end {*}$optval + } + ## + # _getListbox + # cget method to get the contents of a listbox. + # + # @param compname - component name. + # @param optname - Option being cgotten. + # @return list - elements in the listbox. + # + method _getListbox {compname optname} { + return [[set $compname] get 0 end] + } + ## + # _transfer + # Method to transfer the selected widget from one + # component to another. + # + # @param from - name of the component from which items are + # being transferred. + # @param to - Destination components for the transfered items. + # + method _transfer {from to} { + set selection [$from curselection] + set insorder [lsort -increasing -integer $selection] + + # Insert elements into target in the order in which they + # appear in the sourcde: + + foreach id $insorder { + set text [$from get $id] + $to insert end $text + } + # Remove elements from source in reverse order so the + # indices don't invalidate: + + set delorder [lsort -decreasing -integer $selection] + foreach id $delorder { + $from delete $id + } + } +} +## +# @class ListChooserDialog +# +# Dialog that encpasulates a ListChooser and assumes that the +# items in the right box are the chosen ones. +# +# OPTIONS +# -choices - List of of choosable items. +# -chosen - List of items chosen. +# +snit::widgetadaptor ListChooserDialog { + component wrapper + component lists + + delegate option -choices to lists as -leftcontents + delegate option -chosen to lists as -rightcontents + + delegate method * to wrapper + + ## + # Constructor + # - Install a toplevel as hull. + # - install the wrapper + # - install the form (lists) + # - layout the wrapper in the toplevel. + # - configure + constructor args { + installhull using toplevel + install wrapper using DialogWrapper $win.wrapper + install lists using ListChooser [$wrapper controlarea].lists + + pack $lists -fill both -expand 1 + pack $wrapper -fill both -expand 1 + + $self configurelist $args + } +} + +## +# chooseFromList +# Uses a list chooseer dialog to choose elements from a list modally: +# +# @param choices - the choices to select from. +# @return list - the selected items. +# +proc chooseFromList choices { + ListChooserDialog .listchooser -choices $choices + set result [.listchooser modal] + if {$result eq "Ok"} { + set chosen [.listchooser cget -chosen] + destroy .listchooser + return $chosen + } else { + destroy .listchooser + return [list] + } + + +} \ 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...> - 2014-12-12 12:08:21
|
Revision: 2224 http://sourceforge.net/p/nsclspectcl/code/2224 Author: ron-fox Date: 2014-12-12 12:08:13 +0000 (Fri, 12 Dec 2014) Log Message: ----------- Fix issues with scaling on time interval plots. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2014-12-05 21:47:31 UTC (rev 2223) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CTimeParameters.cpp 2014-12-12 12:08:13 UTC (rev 2224) @@ -202,20 +202,20 @@ pApi->AddSpectrum(*m_CumulativeGatedNs); - // Make the time intervalanalysis histograms gated and not the range is 0 - 9 (1e9 ns) - // binned in .01 steps so 900 channels. + // Make the time intervalanalysis histograms gated and not the range is =3 - 9 (1e9 ns) + // binned in .01 steps so 1200 channels. CSpectrum1DL* pUngatedTimeInterval = new CSpectrum1DL("Time-interval-analysis", fact.NextId(), *(pApi->FindParameter("Time.logdt")), - 900, 0.0, 9.0); + 1200, -3, 9.0); pApi->AddSpectrum(*pUngatedTimeInterval); CSpectrum1DL* pGatedTimeInterval = new CSpectrum1DL("Time-interval-analysis-gated", fact.NextId(), *(pApi->FindParameter("Time.logdt-gated")), - 900, 0.0, 9.0); + 1200, -3, 9.0); pApi->AddSpectrum(*pGatedTimeInterval); Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-12-05 21:47:31 UTC (rev 2223) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotIntervalSpectra.tcl 2014-12-12 12:08:13 UTC (rev 2224) @@ -66,16 +66,18 @@ set hi [lindex $xAxisSpec 1] set channels [lindex $xAxisSpec 2] + set range [expr {$hi - $low}] - set xcoords [list] set ycoords [list] for {set i 0} {$i < $channels} {incr i} { - lappend xcoords $i + set x [expr {pow(10,double(($i)*$range)/$channels + $low)}] + lappend xcoords $x lappend ycoords [channel -get $name $i] + } return [plotLog $canvas $name $low $hi $xcoords $ycoords] + } - plotIntervalSpectra 5000; # Every 5000 miliseconds (5 seconds) \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2014-12-05 21:47:31 UTC (rev 2223) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/plotLog.tcl 2014-12-12 12:08:13 UTC (rev 2224) @@ -18,7 +18,7 @@ # proc plotLog {canvas title low hi xvalues yvalues} { set ySpec [Plotchart::determineScale 0 [expr max([join $yvalues , ]) ]] - set xSpec [list 0.01 1.0e[expr int($hi)]] + set xSpec [list 1.0e[expr int($low)] 1.0e[expr int($hi)]] set plot [::Plotchart::createLogXYPlot $canvas $xSpec $ySpec ] @@ -32,5 +32,4 @@ return $plot - } \ 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...> - 2014-12-12 20:13:08
|
Revision: 2225 http://sourceforge.net/p/nsclspectcl/code/2225 Author: ron-fox Date: 2014-12-12 20:13:05 +0000 (Fri, 12 Dec 2014) Log Message: ----------- Progress on the user interface for LLNL neutron parameter management. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-12 12:08:13 UTC (rev 2224) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-12 20:13:05 UTC (rev 2225) @@ -34,6 +34,7 @@ delegate option -increment to spinbox delegate option -from to spinbox + ## # constructor Added: branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl 2014-12-12 20:13:05 UTC (rev 2225) @@ -0,0 +1,439 @@ +# +#****************************************************************************** +# +# Via Vetraia, 11 - 55049 - Viareggio ITALY +# +390594388398 - www.caen.it +# +#***************************************************************************//** +# + +## +# @file xmbgui.tcl +# @brief Graphical user interface to control writing XMB output files. +# @author Ron Fox (rfo...@gm...) + + + +package provide xmbGUI 1.0 +package require Tk +package require snit +package require DialogWrapper + + + + + +## +# @class chooser +# Produce a list box from which a single element can be chosen. +# Intended to be wrapped into a dialog. +# +# OPTIONS +# - -choices - Choices to display in the list box. +# - -choice - Text of the current choice. +# +snit::widgetadaptor chooser { + component list + + option -choices -default [list] -configuremethod _setChoices + option -choice -default "" -cgetmethod _getChoice -readonly 1 + + ## + # constructor + # - Create the list box + # - Create the scrollbar. + # - layout the widgets. + # - Process command line configuration options. + # + constructor args { + installhull using ttk::frame + + install list using listbox $win.list -yscrollcommand [list $win.sb set] \ + -selectmode single + ttk::scrollbar $win.sb -orient vertical -command [list $list yview] + + grid $list $win.sb -sticky nsew + + $self configurelist $args + } + + + ## + # _setChoices + # - Clear the list box + # - Add the choices from the configuration list to the listbox. + # - Set the option value for cget. + # + # @param optname - name of option being configured. + # @param optval - list of items to put in the listbox. + # + method _setChoices {optname optval} { + $list delete 0 end + foreach item $optval { + $list insert end $item + } + set options($optname) $optval + } + ## + # _getChoice + # Return the currently selected item or "" if nothing is selected. + # + # @param optname - name of the option being cgotten for this. + # + method _getChoice optname { + set selindex [$list curselection] + if {$selindex eq ""} { + return "" + } else { + return [$list get $selindex] + } + } + +} + +## +# @class choiceDialog +# chooser wrapped in a dialogwrapper. +# +snit::widgetadaptor choiceDialog { + component wrapper + component list + + delegate option -choices to list + delegate option -choice to list + delegate option * to wrapper + delegate method * to wrapper + + ## + # constructor + # - hull is a top level. + # - wrapper is a DialogWrapper whose form is the + # a chooser. + # + constructor args { + installhull using toplevel + install wrapper using DialogWrapper $win.wrap + + set formFrame [$wrapper controlarea] + install list using chooser $formFrame.form + pack $formFrame.form + pack $win.wrap + + $self configurelist $args + + } +} +## +# chooseListItem +# Proc to tie together the choiceDialog +# @param widget - toplevel widget to create with the dialog. +# @param choices - the choices to select from +# @return string - empty if no choice was made or the item chosen. +# +proc chooseListItem {widget choices} { + choiceDialog $widget -choices $choices + set result [$widget modal] + if {$result eq "Ok"} { + set selection [$widget cget -choice] + destroy $widget + return $selection + } else { + destroy $widget + return "" + } +} + +## +# @class xmbUI +# +# LAYOUT: +# +----------------------------------------------------------------------+ +# | [ ] Enable XMB output file | +# +----------------------------------------------------------------------+ +# | Calibration coefficients: | +# | ADC Channel Offset Linear Quadratic | +# | [ ^V] [ ^V] [ ] [ ] [ ] [Set] | +# +----------------------------------------------------------------------+ +# | XMB Gates | +# | [PID]V [Choose...] Gate Name | +# +----------------------------------------------------------------------+ +# +# OPTIONS +# +# - -enablewrite - Value of the XMB enable widget. +# - -enablecmd - Callback when the enable state changes. +# - -nadcs - number of adcs (upper limit of adc spinbox is -nadcs -1). +# - -adc - adc number +# - -channel - channel number. +# - -offset - offset value (get/set). +# - -linear - Linear coefficient. +# - -quadratic - Quadratic coefficent. +# - -chchangecmd - Callback invoked when the ADC or Channel values change. +# - -calibcmd - Callback invoked when the set button of the calibration widget is invoked. +# - -pid - Currently selected PID ("") if none. +# - -pids - List of values in the PID pulldown. +# - -pidgate - Name of the PID Gate +# - -gates - List of gate names. +# - -pidcmd - Callback when a pid is chosen from the PID gates pulldown. +# - -choosecmd - Callback when gates are about to be selected...allows -gates to be updated. +# - -pidgatecmd - Callback when a pid gate is selected. +# +snit::widgetadaptor xmbUI { + option -enablewrite -default 0 + option -enablecmd -default [list] + option -nadcs -default 3 -configuremethod [list _setTo calframe .adc] + option -adc -default 0 -configuremethod [list _setSpin calframe .adc] + option -channel -default 0 -configuremethod [list _setSpin calframe .ch] + option -offset -default 0.0 -configuremethod [list _setEntry calframe .off] + option -linear -default 1.0 -configuremethod [list _setEntry calframe .lin] + option -quadratic -default 0.0 -configuremethod [list _setEntry calframe .quad] + option -chchangecmd -default [list] + option -calibcmd -default [list] + option -pid -default [list] + option -pids -default [list {LS Gamma} {LS Fast Neutron}] -configuremethod [list _setPids] + option -pidgate -default "" + option -gates -default [list] + option -pidcmd -default [list] + option -choosecmd -default [list] + option -pidgatecmd -default [list] + + variable fenable + variable calframe + variable gateframe + + ## + # constructor + # * Install a ttk::frame as the top level. + # * Build and layout the widgets. + # * Associate actions with command callbacks. + # * Process configuration parameters. + # + # @param args[in] - Configuration option list + constructor args { + installhull using ttk::frame + + + # Enable/disable write controls: + + set fenable [ttk::labelframe $win.enable -text {Enable}] + ttk::checkbutton $fenable.enable -text {Enable XMB Output file} \ + -onvalue 1 -offvalue 0 -variable ${selfns}::options(-enablewrite) \ + -command [mymethod _dispatch -enablecmd] + + grid $fenable.enable -sticky w + grid $fenable -sticky nsew + + # Calibration coefficient controls: + + set calframe [ttk::labelframe $win.calibrations -text {Calibration Coefficients}] + ttk::label $calframe.adcl -text ADC + ttk::label $calframe.chanl -text Channel + ttk::label $calframe.offl -text Offset + ttk::label $calframe.linl -text Linear + ttk::label $calframe.quadl -text Quadratic + + ttk::spinbox $calframe.adc -from 0 -to [expr {$options(-nadcs) -1}] \ + -validate key -validatecommand [mymethod _validate %W %P] \ + -command [mymethod _dispatch -chchangecmd] + ttk::spinbox $calframe.ch -from 0 -to 31 \ + -validate key -validatecommand [mymethod _validate %W %P] \ + -command [mymethod _dispatch -chchangecmd] + ttk::entry $calframe.off -textvariable ${selfns}::options(-offset) \ + -validate key -validatecommand [mymethod _rvalidate %P] + ttk::entry $calframe.lin -textvariable ${selfns}::options(-linear) \ + -validate key -validatecommand [mymethod _rvalidate %P] + ttk::entry $calframe.quad -textvariable ${selfns}::options(-quadratic) \ + -validate key -validatecommand [mymethod _rvalidate %P] + ttk::button $calframe.set -text {Set} -command [mymethod _dispatch -calibcmd] + + grid $calframe.adcl $calframe.chanl $calframe.offl $calframe.linl $calframe.quadl -sticky w + grid $calframe.adc $calframe.ch $calframe.off $calframe.lin $calframe.quad $calframe.set -sticky w + grid $calframe -sticky nsew + + set gateframe [ttk::labelframe $win.gateframe -text {PID Gates}] + ttk::menubutton $gateframe.pidsel -text PID + ttk::button $gateframe.gatesel -text {Choose...} -command [mymethod _chooseGate] + ttk::label $gateframe.gatename -textvariable ${selfns}::options(-pidgate) + + grid $gateframe.pidsel $gateframe.gatesel $gateframe.gatename -sticky w + grid $gateframe -sticky nsew + + $self configurelist $args + + } + #---------------------------------------------------------------------------------- + # Configuration getters/setters: + # + + ## + # _setTo + # Use a configuration item to set the -to parameter of a spinbox (ttk or tk) + # + # @param frame - name of the variable that has the frame. + # @param widget - widget name with in the frame. + # @param optname - Name of the configuration option. + # @param optval - new value proposed for the configuration option + # + method _setTo {frame widget optname optval} { + set frameFullname ${selfns}::$frame + set widget [set $frameFullname]$widget + + $widget configure -to [expr {$optval -1}] + + set options($optname) $optval + } + + ## + # _setSpin + # Set the contents of a widget compatible with a spinbox. + # from a configuration attempt. The value is validated againt an integer + # in the widgets -from/-to range. + # + # @param frame - contains the name of the frame variable. + # @param widget - name of the widget. + # @param optname - name of the option being set + # @param optval - new proposed option value + # + method _setSpin {frame widget optname optval} { + set frameFullname ${selfns}::$frame + set widget [set $frameFullname]$widget + + # Validate the proposal: + + if {![string is integer $optval]} { + error "Spin box must be set to an integer" + } + if {($optval < [$widget cget -from]) || ($optval > [$widget cget -to])} { + error "spinbox value out of -from /-to range" + } + $widget set $optval + set options($optname) $optval + } + ## + # _setEntry + # Set the contents of an entry widget from an option configuration. + # The proposed value must be a valid floating point number. + # + # @param frame - Contains the name of the variable that holds the frame containing the entry. + # @param widget - Contains the end part of the widget name. + # @param optname - Name of the configuration option being set. + # @param optval - Proposed option value. + # + proc _setEntry {frame widget optname optval} { + set frameFullname ${selfns}::$frame + set widget [set $frameFullname]$widget + + if {![string is double $optval]} { + error "Value must be a valid number" + } + $widget delete 0 end + $widget insert end $opval + + set options($optname) $optval + } + + ## + # _setPids + # Configuration method to set the list of PID selections that can be made in the + # pull down menu in the gateframe + # Invoking this will destroy any previous menu and build a new one. + # The menu will be stocked with command items that set the pid and invoke the -pidcmd + # when clicked. + # + # @param optname - name of the option being configured. + # @param optval - new proposed value...a list. + # + method _setPids {optname optval} { + destroy $win.pidmenu + menu $win.pidmenu + $gateframe.pidsel configure -menu $win.pidmenu + foreach pid $optval { + $win.pidmenu add command -command [mymethod _setSelectedPid $pid] -label $pid + } + set options($optname) $optval + } + #---------------------------------------------------------------------------------- + # private methods + # + + ## + # _chooseGate + # Chooses a gate for the PID + # - No op of there is not PID selected. + # - Invoke the -choosecmd callback to update the -gates list. + # - Use the chooser to select one of the gates. + # - If a gate was selected, put its name in -pidgate and invoke -pidgatecmd + # + method _chooseGate {} { + if {$options(-pid) ne ""} { + $self _dispatch -choosecmd + set gate [chooseListItem $win.prompter $options(-gates)] + if {$gate ne ""} { + set options(-pidgate) $gate + $self _dispatch -pidgatecmd + } + } + } + + ## + # _setSelectedPid + # Called when the menu of pids is chooses one: + # - Set the pid option with the label of the selected one. + # - Invoke the -pidcmd option if it was set. + # + # @param pid - name of the pid that was selected. + # + method _setSelectedPid {pid} { + set options(-pid) $pid + $self _dispatch -pidcmd + $gateframe.pidsel configure -text $pid + } + + ## + # _dispatch + # Dispatch to a specific callback. The only substitution is %W for the widget. + # callbacks that require information about the widget state must interrogate the widget + # for that information. + # @param optname - Name of the optino being called e.g. -enablecmd + # + method _dispatch optname { + set command $options($optname) + if {$command ne ""} { + set command [string map [list %W $win] $command] + uplevel #0 $command + } + } + + ## + # _validate + # Validate that an entry change is still an integer: + # + # @param w - widget being validated. + # @param p - proposed new value. + # + method _validate {w p} { + set from [$w cget -from] + set to [$w cget -to] + if {[string is integer $p] && ($p >= $from) && ($p <= $to)} { + return 1 + } else { + bell + return 0 + } + } + ## + # _rvalidate + # Validate that an entry change is still a real: + # + # @param p - proposed new value. + # + method _rvalidate p { + if {[string is double $p]} { + return 1 + } else { + bell + return 0 + } + } + +} \ 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...> - 2014-12-12 21:24:43
|
Revision: 2226 http://sourceforge.net/p/nsclspectcl/code/2226 Author: ron-fox Date: 2014-12-12 21:24:35 +0000 (Fri, 12 Dec 2014) Log Message: ----------- Hook in the event builder parameters to SpecTcl. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/pkgIndex.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-12-12 20:13:05 UTC (rev 2225) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/MySpecTclApp.cpp 2014-12-12 21:24:35 UTC (rev 2226) @@ -234,10 +234,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 2014-12-12 20:13:05 UTC (rev 2225) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/SpecTclRC.tcl 2014-12-12 21:24:35 UTC (rev 2226) @@ -77,6 +77,10 @@ vmusbConfig $file +splash::progress $splash {Building LLNL Neutrons parameter GUI} + +source [file join $here llnlui.tcl] + splash::progress $splash {SpecTcl ready for use} 1 splash::config $splash -delay 2000 Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-12 20:13:05 UTC (rev 2225) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-12 21:24:35 UTC (rev 2226) @@ -48,7 +48,8 @@ install spinbox using ttk::spinbox $win.spinner \ -validate key -validatecommand [mymethod _validate %P] \ - -from 0 -to 0; # -from/-to set so built in won't inc/dec. + -command [mymethod _dispatch] \ + -from 0 -to 0 ; # -from/-to set so built in won't inc/dec. grid $spinbox -sticky ewn bind $spinbox <<Increment>> [mymethod _inc] @@ -140,7 +141,11 @@ set script $options(-command) if {$script ne ""} { set script [string map [list %V [$spinbox get]] $script] - uplevel #0 $script + if {[catch {uplevel #0 $script} msg]} { + puts "$script failed: $msg" + puts $::errorInfo + } + } } } \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-12 21:24:35 UTC (rev 2226) @@ -0,0 +1,79 @@ +# +#****************************************************************************** +# +# Via Vetraia, 11 - 55049 - Viareggio ITALY +# +390594388398 - www.caen.it +# +#***************************************************************************//** +# + +## +# @file llnlui.tcl +# @brief Parameter management for the LLNL neutrons with mtdc32 module. +# @author Ron Fox (rfo...@gm...) + + +## +# This file contains Tcl/Tk code that provides convenient parameter management for the +# llnl neutrons system augmented with the MTDC32. +# + +lappend auto_path [file dirname [info script]] + +package provide lnlui 1.0 +package require Tk +package require DialogWrapper +package require EvbUI +package require multiplicityUI +package require xmbGUI + +# Set up the base interface. + +toplevel .llnlparameters +set llnlNotebook [ttk::notebook .llnlparameters.notebook] + + +EvbUI $llnlNotebook.evb +$llnlNotebook add $llnlNotebook.evb -text {Event Builder} + +MultiplicityUI $llnlNotebook.mult +$llnlNotebook add $llnlNotebook.mult -text {Multiplicity} + +xmbUI $llnlNotebook.xmb +$llnlNotebook add $llnlNotebook.xmb -text {XMB output file} + + +pack $llnlNotebook -expand 1 -fill both + + +# Set up the menu so we can save/restore the settings: + +set llnlMenu [menu .llnlparameters.menu -tearoff 0] +set llnlFileMenu [menu $llnlMenu.file -tearoff 0] + +$llnlMenu add cascade -label File -menu $llnlFileMenu + +$llnlFileMenu add command -label {Save...} +$llnlFileMenu add command -label {Restore...} + +.llnlparameters configure -menu $llnlMenu + +## +# updateTreeVar +# Update the value of a tree variable: +# +# @param name -name of the tree variable. +# @param value - new value. +# @note traces for the treevariable are fired: +# +proc updateTreeVar {name value} { + + treevariable -set $name $value + treevariable -firetraces $name +} +## +# Set up and handle actions for the event builder controller: +# +$llnlNotebook.evb configure -value [expr int(${evb.buildWindow})] +$llnlNotebook.evb configure -command {updateTreeVar evb.buildWindow [expr int(%V)]} + Added: branches/LLNLMadcChainSpecTcl-mtdcdev/pkgIndex.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/pkgIndex.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/pkgIndex.tcl 2014-12-12 21:24:35 UTC (rev 2226) @@ -0,0 +1,18 @@ +# Tcl package index file, version 1.1 +# This file is generated by the "pkg_mkIndex" command +# and sourced either when an application starts up or +# by a "package unknown" script. It invokes the +# "package ifneeded" command to set up package-related +# information so that packages will be loaded automatically +# in response to "package require" commands. When this +# script is sourced, the variable $dir must contain the +# full path name of this file's directory. + +package ifneeded vmusbconfigfile 1.0 [list source [file join $dir configFile.tcl]] +package ifneeded vmusbconstants 1.0 [list source [file join $dir constants.tcl]] +package ifneeded vmusbsetup 1.0 [list source [file join $dir spectclSetup.tcl]] +package ifneeded llnlui 1.0 [list source [file join $dir llnlui.tcl]] +package ifneeded xmbGUI 1.0 [list source [file join $dir xmbgui.tcl]] +package ifneeded DialogWrapper 1.0 [list source [file join $dir dialogwrapper.tcl]] +package ifneeded multiplicityUI 1.0 [list source [file join $dir multiplicityUI.tcl]] +package ifneeded EvbUI 1.0 [list source [file join $dir eventbuildergui.tcl]] This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-12-12 22:38:15
|
Revision: 2227 http://sourceforge.net/p/nsclspectcl/code/2227 Author: ron-fox Date: 2014-12-12 22:38:08 +0000 (Fri, 12 Dec 2014) Log Message: ----------- Hooked in multiplicity tree variables for cycle specifications. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-12 21:24:35 UTC (rev 2226) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-12 22:38:08 UTC (rev 2227) @@ -48,7 +48,6 @@ install spinbox using ttk::spinbox $win.spinner \ -validate key -validatecommand [mymethod _validate %P] \ - -command [mymethod _dispatch] \ -from 0 -to 0 ; # -from/-to set so built in won't inc/dec. grid $spinbox -sticky ewn @@ -69,10 +68,14 @@ # @param optval - new value. # method _set {optname optval} { - if {![string is integer -strict $optval] && ($optval >= 0)} { - error "-value must be an integer >= 0 was $optval" + set from [$spinbox cget -to] + if {![string is integer -strict $optval] || ($optval < $from)} { + error "-value must be an integer >= $from was $optval" } $spinbox set $optval + if {$optval > [$spinbox cget -to]} { + $spinbox configure -to $optval + } $self _dispatch } ## @@ -103,14 +106,20 @@ # method _dec {} { set value [$spinbox get] + if {$value > [$spinbox cget -to]} { + $spinbox configure -to $value + } + set initialValue $value incr value -1 set low [$spinbox cget -from] if {$value >= $low} { $spinbox set $value $self _dispatch + } else { bell } + $spinbox set $initialValue } ## # _validate @@ -122,7 +131,8 @@ # @return boolean true if validates false otherwise. # method _validate {proposed} { - if {[string is integer -strict $proposed] && ($proposed >= 0)} { + set from [$spinbox cget -from] + if {[string is integer -strict $proposed] && ($proposed >= $from)} { after 10 [mymethod _dispatch]; # After in case event propagation is needed. return true Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-12 21:24:35 UTC (rev 2226) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-12 22:38:08 UTC (rev 2227) @@ -72,8 +72,34 @@ treevariable -firetraces $name } ## -# Set up and handle actions for the event builder controller: +# Set up and handle actions for the event builder UI: # $llnlNotebook.evb configure -value [expr int(${evb.buildWindow})] $llnlNotebook.evb configure -command {updateTreeVar evb.buildWindow [expr int(%V)]} + +## +# set up and handle actions for the multiplicty UI: +# + +proc multCommand {widget} { + + treevariable -set multiplicity.bins [$widget cget -bins] + treevariable -set multiplicity.cycleCount [$widget cget -cycles] + treevariable -set multiplicity.mintime [$widget cget -mintime] + + treevariable -firetraces multiplicity.* +} + + +# Load the interface from the initial values: + +# binning: + +$llnlNotebook.mult configure -bins [expr int(${multiplicity.bins})] +$llnlNotebook.mult configure -cycles [expr int(${multiplicity.cycleCount})] +$llnlNotebook.mult configure -mintime [expr int(${multiplicity.mintime})] + +# Connect the command processor now that the interface is loaded. + +$llnlNotebook.mult configure -command [list multCommand $llnlNotebook.mult] Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2014-12-12 21:24:35 UTC (rev 2226) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2014-12-12 22:38:08 UTC (rev 2227) @@ -65,7 +65,8 @@ # snit::widgetadaptor MultiplicityUI { component bins - component binwidths + component mintime + component cycles component madcid component madcidlist @@ -76,9 +77,11 @@ option -bins -configuremethod [list _setSpinbox bins] \ -cgetmethod [list _getSpinbox bins] - option -binwidth -configuremethod [list _setSpinbox binwidths] \ - -cgetmethod [list _getSpinbox binwidths] - + option -mintime -configuremethod [list _setSpinbox mintime] \ + -cgetmethod [list _getSpinbox mintime] + option -cycles -configuremethod [list _setSpinbox cycles] \ + -cgetmethod [list _getSpinbox cycles] + option -madcs -configuremethod [list _setListbox madcidlist] \ -cgetmethod [list _getListbox madcidlist] @@ -105,13 +108,16 @@ ttk::label $binning.binslabel -text {Bins: } install bins using EvbUI $binning.bins -from 1 \ -command [mymethod _dispatch -command] - ttk::label $binning.binwidlabel -text {Bin width (ns): } - install binwidths using EvbUI $binning.width -from 1 \ + ttk::label $binning.mintimelabel -text {Min. time (ns)} + install mintime using EvbUI $binning.mintime -from 0 \ -command [mymethod _dispatch -command] + ttk::label $binning.cyclabel -text {Cycles} + install cycles using EvbUI $binning.cycles -from 1 \ + -command [mymethod _dispatch -command] - - grid $binning.binslabel $bins $binning.binwidlabel $binwidths -sticky w \ - -padx 3 + + grid $binning.binslabel $bins $binning.mintimelabel $mintime $binning.cyclabel $binning.cycles \ + -sticky w -padx 3 grid $binning -sticky ew # Create the ROI frame: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-12-19 12:12:54
|
Revision: 2228 http://sourceforge.net/p/nsclspectcl/code/2228 Author: ron-fox Date: 2014-12-19 12:12:46 +0000 (Fri, 19 Dec 2014) Log Message: ----------- Hook up the rest of the multiplicity controls Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-12 22:38:08 UTC (rev 2227) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-19 12:12:46 UTC (rev 2228) @@ -84,11 +84,29 @@ proc multCommand {widget} { + # update Binning/cycles: + treevariable -set multiplicity.bins [$widget cget -bins] treevariable -set multiplicity.cycleCount [$widget cget -cycles] treevariable -set multiplicity.mintime [$widget cget -mintime] treevariable -firetraces multiplicity.* + + # Update ::multiplicityROIS(n) + + set rois [$widget cget -rois] + catch {unset ::multiplicity.ROIS} + + set i 0 + foreach roi $rois { + set ::multiplicity.ROIS($i) $roi + + incr i + } + # Update the mesytec ids: + + set ::madcIds [$widget cget -madcs] + } @@ -100,6 +118,45 @@ $llnlNotebook.mult configure -cycles [expr int(${multiplicity.cycleCount})] $llnlNotebook.mult configure -mintime [expr int(${multiplicity.mintime})] + +# Rois: + +set rois [list] +foreach idx [lsort -increasing -integer [array names multiplicity.ROIS]] { + + lappend rois [set multiplicity.ROIS($idx)] +} +$llnlNotebook.mult configure -rois $rois + +# Mesytec ADC ids: + +$llnlNotebook.mult configure -madcs $madcIds + + # Connect the command processor now that the interface is loaded. -$llnlNotebook.mult configure -command [list multCommand $llnlNotebook.mult] +$llnlNotebook.mult configure -command [list multCommand $llnlNotebook.mult] \ + -addcommand chooseGate + +# Handle a request to choose a gate: + +proc chooseGate {} { + set gates [gate -list] + + # No point in doing anything if there are no gates: + + if {[llength $gates] == 0} { + return [list] + } + + # Extract the names of the gates + + set gateNames [list] + foreach gate $gates { + lappend gateNames [lindex $gate 0] + } + + set chosen [chooseFromList $gateNames] + return $chosen + +} \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2014-12-12 22:38:08 UTC (rev 2227) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2014-12-19 12:12:46 UTC (rev 2228) @@ -32,7 +32,7 @@ # * -bins - Current bin count # * -binwidth - Width of multiplicity bins. # * -madcs - List of MADC ids (should be 0,1,2 normally). -# * -rois - List of gate names that define what a gamma is. +# * -rois - List of gate names that define what a neutron is. # * -command - Script invoked when something changed...anything. # * -addcommand - Script invoked by add button. # This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2014-12-19 14:43:21
|
Revision: 2229 http://sourceforge.net/p/nsclspectcl/code/2229 Author: ron-fox Date: 2014-12-19 14:43:18 +0000 (Fri, 19 Dec 2014) Log Message: ----------- Hook up the XMB controls to the llnlui. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-19 12:12:46 UTC (rev 2228) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-19 14:43:18 UTC (rev 2229) @@ -159,4 +159,124 @@ set chosen [chooseFromList $gateNames] return $chosen -} \ No newline at end of file +} + +## +# Hook in the xmb management interface. + +# The enable flag: + +proc updateXmbEnable widget { + set ::xmb.enable [$widget cget -enablewrite] +} +$llnlNotebook.xmb configure -enablewrite ${xmb.enable} -enablecmd [list updateXmbEnable $llnlNotebook.xmb] + +# The energy calibrations: + +proc chIndex widget { + set adc [$widget cget -adc] + set chan [$widget cget -channel] + set index [expr {$adc*32 + $chan}] + + return [format "%02d" $index] +} + +proc loadChannelCalibration widget { + set index [chIndex $widget] + + + set const [set ::xmb.offsets.$index] + set slope [set ::xmb.slopes.$index] + set quadcoef [set ::xmb.quadcoef.$index] + + $widget configure -offset $const -linear $slope -quadratic $quadcoef +} + +proc updateCalibration widget { + set index [chIndex $widget] + + + treevariable -set xmb.offsets.$index [$widget cget -offset] + treevariable -set xmb.slopes.$index [$widget cget -linear] + treevariable -set xmb.quadcoef.$index [$widget cget -quadratic] + +} + +$llnlNotebook.xmb configure -nadcs 3 -adc 0 -channel 0 \ + -chchangecmd [list loadChannelCalibration $llnlNotebook.xmb] -calibcmd [list updateCalibration $llnlNotebook.xmb] + + +# The PID gates We're only going to support xmb.lsfn and xmb.lsg (liquid scintillator fast neutron and gamma.). + + + + +array set GateNames {Neutrons xmb.lsfn Gammas xmb.lsg} + +# Initialize to not having a gate. + +foreach gate [array names GateNames] { + gate -delete $GateNames($gate) +} + +# Provide the list of gates to the widget. + +proc updateGateList {widget} { + set exemptGates [list] + foreach name [array names ::GateNames] { + lappend exemptGates $::GateNames($name) + } + + set gates [list] + + foreach gate [gate -list] { + set name [lindex $gate 0] + if {$name ni $exemptGates} { + lappend gates $name + } + } + $widget configure -gates $gates +} + +# If the current (new) PID selected has a gate give its name. +# Note the gate defined through this UI is just an and gate of a single +# actual gate...this is because we don't really have gate aliases in SpecTcl. +# Special cases: +# - If the gate is a F gate, it is blank. +# - If the gate is other than an and gate The full gate definition is given. +# +proc updateUIGate widget { + set pid [$widget cget -pid] + if {$pid eq ""} { + $widget configure -pidgate "" + } else { + set srcGate $::GateNames($pid) + set gateDef [lindex [gate -list $srcGate] 0] + set gateType [lindex $gateDef 2] + if {$gateType eq "*"} { + set tgtGate [lindex $gateDef 3] + } elseif {$gateType eq "F"} { + set tgtGate "" + } else { + set tgtGate $gateDef + } + $widget configure -pidgate $tgtGate + } +} + +# A new gate was chosen for a PID - set the gate definition + +proc chooseUIGate widget { + set name [$widget cget -pidgate] + set pid [$widget cget -pid] + + set sourceGate $::GateNames($pid) + gate $sourceGate * $name +} + +# Attach the procs etc. + +$llnlNotebook.xmb configure -pids [array names GateNames] \ + -choosecmd [list updateGateList $llnlNotebook.xmb] \ + -pidcmd [list updateUIGate $llnlNotebook.xmb] \ + -pidgatecmd [list chooseUIGate $llnlNotebook.xmb] \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl 2014-12-19 12:12:46 UTC (rev 2228) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/xmbgui.tcl 2014-12-19 14:43:18 UTC (rev 2229) @@ -234,10 +234,12 @@ ttk::spinbox $calframe.adc -from 0 -to [expr {$options(-nadcs) -1}] \ -validate key -validatecommand [mymethod _validate %W %P] \ - -command [mymethod _dispatch -chchangecmd] + -command [mymethod _dispatch -chchangecmd] \ + -textvariable ${selfns}::options(-adc) ttk::spinbox $calframe.ch -from 0 -to 31 \ -validate key -validatecommand [mymethod _validate %W %P] \ - -command [mymethod _dispatch -chchangecmd] + -command [mymethod _dispatch -chchangecmd] \ + -textvariable ${selfns}::options(-channel) ttk::entry $calframe.off -textvariable ${selfns}::options(-offset) \ -validate key -validatecommand [mymethod _rvalidate %P] ttk::entry $calframe.lin -textvariable ${selfns}::options(-linear) \ @@ -319,7 +321,7 @@ # @param optname - Name of the configuration option being set. # @param optval - Proposed option value. # - proc _setEntry {frame widget optname optval} { + method _setEntry {frame widget optname optval} { set frameFullname ${selfns}::$frame set widget [set $frameFullname]$widget @@ -327,7 +329,7 @@ error "Value must be a valid number" } $widget delete 0 end - $widget insert end $opval + $widget insert end $optval set options($optname) $optval } @@ -401,6 +403,7 @@ if {$command ne ""} { set command [string map [list %W $win] $command] uplevel #0 $command + } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-01-02 18:04:32
|
Revision: 2232 http://sourceforge.net/p/nsclspectcl/code/2232 Author: ron-fox Date: 2015-01-02 18:04:23 +0000 (Fri, 02 Jan 2015) Log Message: ----------- Commits prior to installation on the LLNL prod system Modified Paths: -------------- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.cpp 2015-01-02 18:04:23 UTC (rev 2232) @@ -0,0 +1,369 @@ +/****************************************************************************** +* +* 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 CFileWriter.h + * @brief Event processor to write CC-XMB output files. + * @author Ron Fox <ro...@ca...> + */ + +#include <config.h> +#include "CFileWriter.h" +#include <GateContainer.h> +#include <FalseGate.h> +#include <SpecTcl.h> +#include <string> +#include <iostream> +#include <fstream> +#include <stdio.h> +#include <stdint.h> +#include <unistd.h> + +static const char* gateNames[] = { + "xmb.gamma-block-gamma", + "xmb.gamma-bloock-muon", + "xmb.muon-panel-gamma", + "xmb.muon-panel-muon", + "xmb.lsg", + "xmb.lsfn", + "xmb.lsm", + "xmb.he3-det-thermal-neut", + "xmb.he3-pulse-thermal-neut", + "xmb.bf-unknown-det-gamma", + 0 // End of array sentinel. +}; + +/** + * constructor + * Build the tree variables, tree parameters and the initial gates. + */ +CFileWriter::CFileWriter() : + m_enable("xmb.enable", 0.0, "flag"), + 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_moduleId("moduleID"), + m_bankNo("bankNo"), + m_energy("Energy"), + m_mustEnd(false) +{ + // Build the gate vectors and their corresponding pid values. + // These are new gates that are added to SpecTcl that are initialized + // as false gates. + + SpecTcl* pApi = SpecTcl::getInstance(); + int pid = 1; + const char** ppGateNames = gateNames; + while(*ppGateNames) { + CGate* pGate = pApi->CreateFalseGate(); + pApi->AddGate(*ppGateNames, pGate); + m_gates.push_back( (pApi->FindGate(*ppGateNames))); + m_pids.push_back(pid); + + ppGateNames++; + pid++; + } + CTreeVariable::BindVariables(*(pApi->getInterpreter())); + +} +CFileWriter::~CFileWriter() {} // to define the vtable. +/** + * OnBegin + * Begin run actions these only occur if m_enabled is non zero. + * - get the run number. + * - get the title. + * - construct an open the binary file as run-%04d-xmb.bin + * + * @param rAnalyzer - reference to the analyzer that is controlling the run. + * @param rDecoder - reference to the high level decoder. + * + * @return Bool_t - kfTrue on success else an error message on stderr and kfFalse. + */ +Bool_t +CFileWriter:: OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) +{ + if (m_enable != 0.0) { + m_runNumber = rDecoder.getRun(); + m_title = rDecoder.getTitle(); + + char fileName[1000]; + sprintf(fileName, "run-%04d-xmb.bin", m_runNumber); + m_binaryOutput.open(fileName); + if(m_binaryOutput.fail()) { + std::cerr << "Failed to open the xmb binary output file: " << fileName << std::endl; + return kfFALSE; + } + m_mustEnd = true; // Need to make headers and close files. + m_eventCount = 0; + + } + return kfTRUE; +} +/** + * operator() + * Called for each event. + * - figure out the correct pid based on the gates. + * - Compute the time in seconds, the detector number and the energy. + * - write all of those to file. + * - If the write fails object on stderr. + * + * @param pEvent - Pointer to the raw event. + * @param rEvent - Pointer to the flattened unpacked event (we'll use tree parameters). + * @param rAnalyzer - Refers to the analyzer that is controlling the playback/analysis flow + * @param rDecoder - Refers to the buffer decoder object. + * @return Bool_t - kfTRUE on success kfFALSE on error. + */ +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)) { + pid = m_pids[i]; + break; + } + } + m_eventCount++; + double time = m_timestamp/1.0e9; // Time in seconds. + uint16_t detno = m_moduleId*m_bankNo; + float energy = m_energy* (m_energy * m_quadcoef[detno] + m_slopes[detno]) + m_offsets[detno]; + + // Would love to put all of this in a struct, however structs can be padded so we must + // write like this: + + m_binaryOutput.write(reinterpret_cast<const char*>(&time), sizeof(double)); + m_binaryOutput.write(reinterpret_cast<const char*>(&detno), sizeof(uint16_t)); + m_binaryOutput.write(reinterpret_cast<const char*>(&pid), sizeof(uint16_t)); + m_binaryOutput.write(reinterpret_cast<const char*>(&m_energy), sizeof(float)); + + if (m_binaryOutput.fail()) { + std::cerr << " Event write failed. " << std::endl; + return kfFALSE; + } + } + return kfTRUE; +} + +/** + * OnEnd + * Called at the end of a run. Only does stuff if m_enabled and m_mustEnd + * - close the binary file. + * - open the header file and write the header. + * - close the header file. + * - append the binary file to the header file with the shell cat command + * - the .bin file is removed. + * - set m_mustEnd -> false. + * The header/final file is named: run-%04d-xmb.evt + * + * @param rAnalyzer - the analyzer running the show. + * @param rDecoder - the decoder that understands the overall shape of events. + * @return Bool_t - kfTRUE - success, kfFALSE - on ERROR with an error message -> stdout. + */ +Bool_t +CFileWriter::OnEnd(CAnalyzer& rAnalyzer, CBufferDecoder& rBuffer) +{ + if (m_enable != 0.0) { + m_mustEnd = false; // closed binary regardless. + m_binaryOutput.close(); + char finalFilename[1000]; + sprintf(finalFilename, "run-%04d-xmb.evt", m_runNumber); + std::ofstream finalFile(finalFilename); + if (finalFile.fail()) { + std::cerr << "Unable to open final output file: " << finalFilename << std::endl; + return kfFALSE; + } + + finalFile << "<?xml version='1.0' />\n"; + finalFile << "<xmb>\n"; + finalFile << "<versionNumber>1.0</versionNumber> \n"; + if (finalFile.fail()) { + finalFile.close(); + std::cerr << "Failed writing initial tags in xml header of " << finalFilename << std::endl; + return kfFALSE; + } + + // Data structure section + + dataStruct(finalFile); + if (finalFile.fail()) { + finalFile.close(); + std::cerr << "Failed during write of <binaryDataSTructure> tag and body\n"; + return kfFALSE; + } + // Particle lookup table + + particleLut(finalFile); + if (finalFile.fail()) { + finalFile.close(); + std::cerr << "Failed during write of <particleLut> tag and body\n"; + return kfFALSE; + } + + // Number of events. + + numEvt(finalFile); + if (finalFile.fail()) { + finalFile.close(); + std::cerr << "Failed during write of <nEvents> tag and body\n"; + return kfFALSE; + } + + + + // Experiment info: + + expInfo(finalFile); + if (finalFile.fail()) { + finalFile.close(); + std::cerr << "Failed during write of <experiment> tag and body\n"; + return kfFALSE; + } + // close the xml header + + finalFile << "</xmb>\n"; + if (finalFile.fail()) { + finalFile.close(); + std::cerr << "Failed to write closing </xmb> tag in " << finalFilename << std::endl; + return kfFALSE; + } + + // Close the file append the binary file and destroy the binary only part. + + finalFile.close(); + char binaryFilename[1000]; + sprintf(binaryFilename, "run-%04d-xmb.bin", m_runNumber); + + char command[2000]; + sprintf(command, "cat %s >> %s", binaryFilename, finalFilename); + system(command); + // unlink(binaryFilename); + + + } + return kfTRUE; +} + +/** + * numEvt + * Write the number of events xml tag. + * The form of this is <nEvents>count</nEventgs> + * + * @param out - ofstream reference to where we are writing data. + */ +void +CFileWriter::numEvt(std::ofstream& out) +{ + out << "<nEvents>"; + out << m_eventCount; + out << "</nEvents>\n"; + + +} +/** + * OnEventSourceEOF + * Called when there's an EOF on the input file. If the file needs closing we call + * OnEnd (assuming that this file was not properly ended). + * + */ +Bool_t +CFileWriter::OnEventSourceEOF() +{ + if ((m_enable != 0.0) && m_mustEnd) { + SpecTcl* pApi = SpecTcl::getInstance(); + CAnalyzer& analyzer(*(pApi->GetAnalyzer())); + CBufferDecoder& decoder(*(analyzer.getDecoder())); + return OnEnd(analyzer, decoder); + } else { + return kfTRUE; + } +} + + +/** + * dataStruct + * Writes the tagset that define the structure of the data that are being written to disk. + * @param out - reference to the output file (ostream). + */ +void +CFileWriter::dataStruct(std::ofstream& out) +{ + out << "<binaryDataStructure> \n\ + <field> \n\ + <name>arrivalTime (sec)</name> \n\ + <dataType>double</dataType> \n\ + <bytes>8</bytes> \n\ + </field> \n\ + <field> \n\ + <name>channel</name> \n\ + <dataType>unsigned short</dataType> \n\ + <bytes>2</bytes> \n\ + </field> \n\ + <field> \n\ + <name>particleID</name> \n\ + <dataType>unsigned short</dataType> \n\ + <bytes>2</bytes> \n\ + </field> \n\ + <field> \n\ + <name>energy [keV-ee]</name> \n\ + <dataType>float</dataType> \n\ + <bytes>4</bytes> \n\ + </field> \n\ + </binaryDataStructure>\n"; + + +} +/** + * particleLut + * Write the particle lookup table tag/body. + * @param out - reference to the output file (ostream). + */ +void +CFileWriter::particleLut(std::ofstream& out) +{ + out << "<particleLUT> \n\ + <particleTypeEntry Name='Gamma Block Gamma' particleID='1'/> \n\ + <particleTypeEntry Name='Gamma Block Muon' particleID='2'/> \n\ + <particleTypeEntry Name='Muon Panel Gamma' particleID='3'/> \n\ + <particleTypeEntry Name='Muon Panel Muon' particleID='4'/> \n\ + <particleTypeEntry Name='Liquid Scintillator Gamma' particleID='5'/> \n\ + <particleTypeEntry Name='Liquid Scintillator Fast Neutron' particleID='6'/> \n\ + <particleTypeEntry Name='Liquid Scintillator Muon' particleID='7'/> \n\ + <particleTypeEntry Name='He3 TTL Detector Thermal Neutron' particleID='8'/> \n\ + <particleTypeEntry Name='He3 sampled pulse Thermal Neutron' particleID='9'/> \n\ + <particleTypeEntry Name='BF - unknown detector gamma' particleID='10'/> \n\ + <particleTypeEntry Name='External Trigger - meaning uncertain' particleID='11'/> \n\ + </particleLUT> \n"; +} +/** + * expInfo + * + * Writes all the experiment information, run number, title (as experiment name). etc. + * + * @param out - Reference to the output file. + */ +void +CFileWriter::expInfo(std::ofstream& out) +{ + out << "<experiment>\n"; + out << " <runNumber>" << m_runNumber << "</runNumber>\n"; + out << " <expName>" << m_title << "</expname>\n"; + out << "</experiment>\n"; +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CFileWriter.h 2015-01-02 18:04:23 UTC (rev 2232) @@ -0,0 +1,122 @@ +/****************************************************************************** +* +* 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 CFileWriter.h + * @brief Event processor to write CC-XMB output files. + * @author Ron Fox <ro...@ca...> + */ + +#ifndef _CFILEWRITER_H +#define _CFILEWRITER_H + +#include <config.h> +#include <EventProcessor.h> +#include <TreeParameter.h> +#include <vector> +#include <string> +#include <fstream> + + +class CGateContainer; + +/** + * @class CFileWriter + * This class is an event processor that can write the CC-XMB output file. + * Note that an entire run must be read before the header can be written. + * The strategy is therefore to write the binary part of the file + * and then, onEnd or endFile, write the header and join the two bits together. + * + * Several treevariables and gates are used to guide the processor: + * - xmb.enable - non-zero prior to the begin run to enable the output file + * if zero, this entire event processor does nothing. + * - xmb.offsets.n - Offsets for detector n's energy calibration. + * - xmb.slopes.n - Slopes for detector n's enegy calibration. + * + * The following (non overlapping) gates can be defined in order to detect specific particle types: + * - xmb.gamma-block-gamma - PID type 1 Gamma Block gamma. + * - xmb.gamma-block-muon - PID type 2 Gamma block Muon. + * - xmb.muon-panel-gamma - PID type 3 Muon panel gamma + * - xmb.muon-panel-muon - PID type 4 Muon panel muon. + * - xmb.lsg - PID type 5 LIquid scintillator gamma + * - xmb.lsfn - PID type 6 Liquid scintillator fast neutron. + * - xmb.lsm - PID type 7 liquid scintallator muon. + * - xmb.he3-det-thermal-neut - PID type 8 3He TTL Detector thermal neutron. + * - xmb.he3-pulse-thermal-neut - PID type 9 3He sampled pulse thermal neutron. + * - xmb.bf-unknown-det-gamma - PID 10 BF unknown detector gamma. + * - Anything that does not make one of these gates is thrown in as an External Trigger + * meaning uncertain. + * + * All gates are initialized to false gates so that no particle identification is made. + * All unidentified particles are identified as type 11 - External Trigger - meaning uncertain. + * If gates overlap, the actual identification of the particle type is not well behaved!!! + */ +class CFileWriter : public CEventProcessor +{ +private: + CTreeVariable m_enable; + CTreeVariableArray m_offsets; + CTreeVariableArray m_slopes; + CTreeVariableArray m_quadcoef; + + std::vector<CGateContainer*> m_gates; + std::vector<int> m_pids; + + // Input parameters for each event. + + CTreeParameter m_timestamp; + CTreeParameter m_moduleId; + CTreeParameter m_bankNo; + CTreeParameter m_energy; + + + static const int m_defaultPID = 11; /* Meaning uncertain. */ + + bool m_mustEnd; + + // Stuff we need in the middle of the run: + + std::ofstream m_binaryOutput; + int m_runNumber; + std::string m_title; + unsigned m_eventCount; + +public: + CFileWriter(); + virtual ~CFileWriter(); // to create the virtual table. + + // Implementations of the interface methods usedd by this event processor. + + virtual Bool_t operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Physics Event. + + virtual Bool_t OnBegin(CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Begin Run. + virtual Bool_t OnEnd(CAnalyzer& rAnalyzer, + CBufferDecoder& rBuffer); // End Run. + virtual Bool_t OnEventSourceEOF(); + +private: + void numEvt(std::ofstream& out); + void dataStruct(std::ofstream& out); + void particleLut(std::ofstream& out); + void expInfo(std::ofstream& out); + +}; + +#endif Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2014-12-26 23:09:20 UTC (rev 2231) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/eventbuildergui.tcl 2015-01-02 18:04:23 UTC (rev 2232) @@ -30,7 +30,8 @@ component spinbox option -value -default 0 -configuremethod _set -cgetmethod _get - option -command -default [list] + option -command -default [list] + option -text -default "" delegate option -increment to spinbox delegate option -from to spinbox @@ -45,11 +46,13 @@ # constructor args { installhull using ttk::frame + + ttk::label $win.label -textvariable ${selfns}::options(-text) install spinbox using ttk::spinbox $win.spinner \ -validate key -validatecommand [mymethod _validate %P] \ -from 0 -to 0 ; # -from/-to set so built in won't inc/dec. - grid $spinbox -sticky ewn + grid $win.label $spinbox -sticky ewn -padx 3 bind $spinbox <<Increment>> [mymethod _inc] bind $spinbox <<Decrement>> [mymethod _dec] Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2014-12-26 23:09:20 UTC (rev 2231) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/llnlui.tcl 2015-01-02 18:04:23 UTC (rev 2232) @@ -33,7 +33,7 @@ set llnlNotebook [ttk::notebook .llnlparameters.notebook] -EvbUI $llnlNotebook.evb +EvbUI $llnlNotebook.evb -text {Coincidence interval (ticks)} $llnlNotebook add $llnlNotebook.evb -text {Event Builder} MultiplicityUI $llnlNotebook.mult Modified: branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2014-12-26 23:09:20 UTC (rev 2231) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/multiplicityUI.tcl 2015-01-02 18:04:23 UTC (rev 2232) @@ -108,7 +108,7 @@ ttk::label $binning.binslabel -text {Bins: } install bins using EvbUI $binning.bins -from 1 \ -command [mymethod _dispatch -command] - ttk::label $binning.mintimelabel -text {Min. time (ns)} + ttk::label $binning.mintimelabel -text {Bin width (ns)} install mintime using EvbUI $binning.mintime -from 0 \ -command [mymethod _dispatch -command] ttk::label $binning.cyclabel -text {Cycles} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-01-02 18:07:18
|
Revision: 2233 http://sourceforge.net/p/nsclspectcl/code/2233 Author: ron-fox Date: 2015-01-02 18:07:15 +0000 (Fri, 02 Jan 2015) Log Message: ----------- Add missing files Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.h branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.h branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.cpp branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.h Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.cpp 2015-01-02 18:07:15 UTC (rev 2233) @@ -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/LLNLMadcChainSpecTcl-mtdcdev/CHINP.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CHINP.h 2015-01-02 18:07:15 UTC (rev 2233) @@ -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/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CMTDC32.cpp 2015-01-02 18:07:15 UTC (rev 2233) @@ -0,0 +1 @@ +CC Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.cpp 2015-01-02 18:07:15 UTC (rev 2233) @@ -0,0 +1,173 @@ +#include <config.h> +#include "CPSD.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; + +CPSD::CPSD() {} +CPSD::~CPSD() {} + +/* +** 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 tag Chipid (8bits) 0 (1bit) (channel# 4bits) +** Aadc(32), BADC(32), CADC(32), Time(32) +** ... +** Note that when processing ADC/TDC data +** If we run off the end of the event, we just silently stop +** processing. +** new code for Unified (16-bit) event format with time stamp 1/7/2011 +** +*/ +unsigned int +CPSD::operator()(CEvent& rEvent, + vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + CTreeParameterArray*** myParameters = getTree(pMap, rEvent); + + uint32_t channelId, timeStamp[2], channelCount; + uint32_t wordCount = getLong(event, offset); + offset+=2; + // + // Word counts > 4095 are error indicators.. + // just skip the data the VMUSB can't help but read + // + // mask off the upper 16-bit field + wordCount &= 0xffff; + if (wordCount >4095) { + // if (wordCount >20) { + cerr << "Got an error report from " << pMap->name << " " + << hex << wordCount << dec << endl; + wordCount &= 0xfff; + offset += wordCount*2 +1; + return offset; + } + // word count must be evenly divisible by 5 + // loop through the groups of 5 words per hit channel + channelCount = event[offset]; + offset += 1; + // printf("word count is %d, channelCount is %d\n",wordCount,channelCount); + timeStamp[0] = getLong(event, offset); + offset+=2; + timeStamp[1] = getLong(event, offset); + offset+=2; + for (int i =0; i < channelCount/5; i++) { + // get channel tag + channelId = event[offset]; + // printf("Channel ID = %x\n",channelId); + offset +=1; + // now pick up analog data + uint32_t a = event[offset] & 0xfff; + offset += 1; + uint32_t b = event[offset] & 0xfff; + offset += 1; + uint32_t c = event[offset] & 0xfff; + offset += 1; + uint32_t time = event[offset] & 0xfff; + offset += 1; + + uint32_t channel = channelId & 0x07; + uint32_t chip = (channelId >> 5) & 0xff; + // printf("chip %d chan %d A %d B %d C %d Time %d\n",chip, channel,a,b,c,time); + CTreeParameterArray** pChipTree = myParameters[chip-1]; + CTreeParameterArray* pAs = pChipTree[0]; + CTreeParameterArray* pBs = pChipTree[1]; + CTreeParameterArray* pCs = pChipTree[2]; + CTreeParameterArray* pTs = pChipTree[3]; + + (*pAs)[channel] = a; + (*pBs)[channel] = b; + (*pCs)[channel] = c; + (*pTs)[channel] = time; + } + // printf("offset at end = %d\n",offset); + // figure out how much garbage to gobble from end of event + if ((offset & 0x0001) == 0) { + offset +=2; + } else { + offset += 3; + } + // printf("final offset = %d\n",offset); + + 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*** +CPSD::getTree(CParamMapCommand::AdcMapping* pMap, + CEvent& rEvent) +{ + if (!pMap->extraData) { + SpecTcl* api = SpecTcl::getInstance(); + CTCLInterpreter *pInterp = api->getInterpreter(); + string baseName = pMap->name; + CTCLVariable PSDChips(pInterp, "PSDChips",false); + + const char* pChipList = + PSDChips.Get(TCL_GLOBAL_ONLY, + const_cast<char*>(baseName.c_str())); + if (!pChipList) { + cerr << "PSDChips("<< 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 A,B,C and T tree parameter + // arrays. + + cerr << "PSD GetTree, chips.size = " << chips.size() << endl; + for (int i =0; i < chips.size(); i++) { + char chipNumber[100]; + sprintf(chipNumber, "%02d", atoi(chips[i].c_str())); + CTreeParameterArray** teArray = new CTreeParameterArray*[4]; + chipArray[i] = teArray; + string aBaseName = baseName; + aBaseName += ".a."; + aBaseName += chipNumber; + teArray[0] = new CTreeParameterArray(aBaseName, + 14, 16, 0); + string bBaseName = baseName; + bBaseName += ".b."; + bBaseName += chipNumber; + teArray[1] = new CTreeParameterArray(bBaseName, + 14, 16, 0); + string cBaseName = baseName; + cBaseName += ".c."; + cBaseName += chipNumber; + teArray[2] = new CTreeParameterArray(cBaseName, + 14, 16, 0); + string tBaseName = baseName; + tBaseName += ".t."; + tBaseName += chipNumber; + teArray[3] = new CTreeParameterArray(tBaseName, + 14, 16, 0); + } + + CTreeParameter::BindParameters(); + CTreeParameter::setEvent(rEvent); + } + return reinterpret_cast<CTreeParameterArray***>(pMap->extraData); +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CPSD.h 2015-01-02 18:07:15 UTC (rev 2233) @@ -0,0 +1,35 @@ +/*! + Unpacker for XLM/PSD ADC version +*/ +#ifndef __CPSD_H +#define __CPSD_H + +#ifndef __CMODULEUNPACKER_H +#include "CModuleUnpacker.h" +#endif + +class CTreeParameterArray; + +class CPSD : public CModuleUnpacker +{ +public: + // Canonicals: + + CPSD(); + virtual ~CPSD(); + + // 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/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.cpp 2015-01-02 18:07:15 UTC (rev 2233) @@ -0,0 +1,252 @@ +/* + 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 "CV1729Unpacker.h" +#include <Event.h> +#include <stdint.h> +#include <Spectrum.h> +#include <Parameter.h> +#include <SpecTcl.h> +#include <stdio.h> +#include <string.h> +#include <TCLInterpreter.h> +#include <tcl.h> + + +#include <string> + +using namespace std; + +static const int numSamples = 2048; // That's how many we care about..that's the spectrum width. +static const int numCells = 128*20; +static const int channelOrder[4] = {2,3,0,1}; + +static int freeze; // if non zero, creating new waveforms is disabled. +static bool first = true; + + + + + +// Taken a word at a time, here's the order of the channels +// in the data: +// + + +/** + * Static local function binds the freeze variable to the Tcl Variable: + * freezeFadcSpectra.. and sets it to false. + */ +static void bindVariable() +{ + SpecTcl* pApi = SpecTcl::getInstance(); + + // Do this old school because I'm lazy: + + CTCLInterpreter* pInterp = pApi->getInterpreter(); + Tcl_Interp* pActualInterp = pInterp->getInterpreter(); + Tcl_LinkVar(pActualInterp, "freezeFadcSpectra", reinterpret_cast<char*>(&freeze), TCL_LINK_INT); + freeze = 0; +} + +///////////////////////////////////////////////////////////////////// +// Canonicals.. + +/*! + Construction is a no-op. + +*/ +CV1729Unpacker::CV1729Unpacker() {} + +/*! + Destruction is a no-op. +*/ +CV1729Unpacker::~CV1729Unpacker() {} + + + + +////////////////////////////////////////////////////////////////////// +// Virtual function overrides. + +/** + * Perform the unpack. The data format is as follows: + * +------------------------------------+ + * | Interrupt register. (32) | + * +------------------------------------+ + * | Trigger column number (32) | + * +------------------------------------+ + * | Digitizer data as defined in | + * | 4.7 of the manual. | + * \ / + * / \ + * +------------------------------------+ + * + * The interrupt register is 1 if there is data worth looking at. + * It is not clear to me yet what the digitizer data looks like if there + * is not data. + * + * @param rEvent - The output event (ignored by this unpacker). + * @param event - Raw data from the VM-USB + * @param offset - Where in event our data starts. + * @param pMap - adc mapping structure that describes this device. + * we care about a couple of things. + * - Using the rEvent indices to locate our parameter base name. + * - Using the parameter basenames to find all 2048 spectra associated + * with each used channel. + * - Using the parammap 'virtual slot' element determine which channels will actually + * provide data. + * @return unsigned int + * @retval Value of offset for next part of the event. + * + */ +unsigned int +CV1729Unpacker::operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap) +{ + if (first) { + bindVariable(); + first = false; + } + + Info& info = *(findSpectra(*pMap)); + + // get the two header words: + + uint32_t irqRegister = event[offset++]; offset++; + uint32_t triggerCol = event[offset++]; offset++; + + + irqRegister &= 1; + triggerCol &= 0x7f; + if(irqRegister && !freeze) { + + int sampleBegin = offset + 3*4; // Skip the header. + int sampleEnd = sampleBegin + 128*20*4; // Just off the end of the sample block. + // Get our spectra: + + next(info); // advance to next spectrum: + CSpectrum* pSpectra[4]; + for (int i = 0; i < 4; i++) { + if (info.s_spectrumIndex < 2048) { + pSpectra[i] = info.s_Spectra[i][info.s_spectrumIndex]; + if (pSpectra[i]) { + pSpectra[i]->Clear(); + } + } + else { + pSpectra[i] = 0; + } + } + // Adapted from V1729.c generously handed to me for examination by CAEN + // Thanks Massimo. + // + int end_cell = (20*(128 - triggerCol + pMap->vsn +1 ) ) % numCells; + for (UInt_t i = 0; i < numSamples; i++) { + UInt_t j = (2560 + i + end_cell) % numCells; + for (int d = 0; d < 4; d++) { + int ch = channelOrder[d]; + int data = event[sampleBegin + 4*j + d]; + if (pSpectra[ch]) { + pSpectra[ch]->set(&i, data); + } + } + } + } + if(freeze) { + info.s_spectrumIndex = 2047; // reset next spectrum to 0. + } + + offset += 128*20*4; // Sample data... + offset += 3*4; // Header data... + offset += 2*2; // trailer data. + + return offset; // Next chunk of data. +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// Private utilities: +// + +/** + * locate the pInfo for our mapping element or create it if it does not exist. + * @param rMap - Reference to the map. + * @return pInfo + * @retval pointer to the info. + */ +CV1729Unpacker::pInfo +CV1729Unpacker::findSpectra(CParamMapCommand::AdcMapping& rMap) +{ + SpecTcl* pApi = SpecTcl::getInstance(); + + if (! rMap.extraData) { + pInfo pSpectra = new Info; + + + pSpectra->s_spectrumIndex = -1; // start with the first (assuming unpack starts with a next()). + + + // Looping over the channels: + + for (int chan = 0; chan < 4; chan++) { + // Null the spectrum pointers: + + for (int spec = 0; spec < 2048; spec++) { + pSpectra->s_Spectra[chan][spec] = 0; + } + + // If the parameter is defined and we can track down its name + // ..and we can track down the spectra associated with it, put pointers to + // them into the struct. + + if (rMap.map[chan] != -1) { + CParameter* pParam = pApi->FindParameter(rMap.map[chan]); + if (pParam) { + string baseName = pParam->getName(); + for (int i = 0; i < 2048; i++) { + char spectrumName[2048]; + snprintf(spectrumName, sizeof(spectrumName), "%04d.%s",i, baseName.c_str()); + CSpectrum* pSpec = pApi->FindSpectrum(spectrumName); + pSpectra->s_Spectra[chan][i] = pSpec; // Correct thing to do even if there's no match. + } + + } + } + } + + rMap.extraData = pSpectra; + + } + + return reinterpret_cast<pInfo>(rMap.extraData); +} +/** + * Manages the spectrumIndex in the info struct; Moves to the next spectrum + * - Increments s_spectrumIndex + * - If s_spectrumIndex >= 2048 clears all spectra and sets itself to 0. + * + * @param rInfo - reference to the rInfo variable. + */ +void +CV1729Unpacker::next(CV1729Unpacker::Info& rInfo) +{ + rInfo.s_spectrumIndex++; + rInfo.s_spectrumIndex = rInfo.s_spectrumIndex % 2048; + + +} Added: branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.h (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/CV1729Unpacker.h 2015-01-02 18:07:15 UTC (rev 2233) @@ -0,0 +1,70 @@ +/* + 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 __CV1729UNPACKER_H +#define __CV1729UNPACKER_H + +#ifndef __CMODULEUNPACKER_H +#include "CModuleUnpacker.h" +#endif + + +class CSpectrum; + +/*! + This unpacker is responsible for unpacking + data from CAEN V1729 FADC waveform digitizers. + Each defined channel is mapped to a set of pre-created + 2k spectra. waveforms get put into each spectrum until all spectra + are used up at which point the spectra are all cleared and our antics start + all over again. The slot in the parameterm ap that's normally reserved for a virtual slot + instead contains the mask of channels in use by this module. + + A current restriction is that the number of columns read is always 256. +*/ +class CV1729Unpacker : public CModuleUnpacker +{ + // private data structures: +private: + typedef struct _info { + int s_spectrumIndex; // Which spectrum to fill next. + CSpectrum* s_Spectra[4][2048]; // Spectrum pointers for each channel. + } Info, *pInfo; + +public: + // Canonicals: + + CV1729Unpacker(); + virtual ~CV1729Unpacker(); + + // The unpacker entry: + +public: + virtual unsigned int operator()(CEvent& rEvent, + std::vector<unsigned short>& event, + unsigned int offset, + CParamMapCommand::AdcMapping* pMap); + + // Private utilities: + +private: + + pInfo findSpectra(CParamMapCommand::AdcMapping& rMap); + void next(Info& rInfo); + +}; + +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2015-01-02 18:08:05
|
Revision: 2234 http://sourceforge.net/p/nsclspectcl/code/2234 Author: ron-fox Date: 2015-01-02 18:07:51 +0000 (Fri, 02 Jan 2015) Log Message: ----------- add missing files Added Paths: ----------- branches/LLNLMadcChainSpecTcl-mtdcdev/atest.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/constants.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/llnlsavetest.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/rois.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/rontest.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/testDriver.tcl branches/LLNLMadcChainSpecTcl-mtdcdev/testing-setup.tcl Added: branches/LLNLMadcChainSpecTcl-mtdcdev/atest.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/atest.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/atest.tcl 2015-01-02 18:07:51 UTC (rev 2234) @@ -0,0 +1,2 @@ +lappend auto_path /usr/opt/spectcl/3.4/TclLibs +source /usr/opt/spectcl/3.4/Script/tkcon.tcl Added: branches/LLNLMadcChainSpecTcl-mtdcdev/constants.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/constants.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/constants.tcl 2015-01-02 18:07:51 UTC (rev 2234) @@ -0,0 +1,26 @@ +package provide vmusbconstants 1.0 + +# Define the device types so the decoder can be selected: + +set typeCAEN 0; # CAEN V775,785,792,862 +set typeHYTEC 1; # Hytec NADC 2530. +set typeMADC32 2; # Mesytec MADC 32. +set typeTDC1x90 3; # CAEN V1x90. +set typeV977 4; # CAEN V977 input register. +set typeMase 5; # MASE XLM subsystem. +set typeCAENDual 6; # CAEN dual range modules. +set typeHINP 7; # HINP XLM module. +set typePSD 8; # PSD XLM module. +set typeV1729 9; # CAEN V1729 FADC. +set typeMTDC32 10; # Mesytec MTDC32. + +set channelCount($typeCAEN) 4096 +set channelCount($typeHYTEC) 8192 +set channelCount($typeMADC32) 4096; # Currently only 12 chans. +set channelCount($typeTDC1x90) 16384; # for now this is the # of channels in a tdc spec +set channelCount($typeV977) 16; # for a bit mask spec +set channelCount($typeMase) 8192; # Spectrum channels for MASE. +set channelCount($typeHINP) 16384; # Num channels in a default HINP spectrum. +set channelCount($typePSD) 8192; # Num channels in a default PSD spectrum. +set channelCount($typeV1729) 8192; # Waveform count. +set channelCount($typeMTDC32) 65535; # Not really too sure about this...but we'll be doing specials. \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl-mtdcdev/failsafe.tcl 2015-01-02 18:07:51 UTC (rev 2234) @@ -0,0 +1,1226 @@ +# SpecTclGUI save file created Fri Dec 19 09:39:50 EST 2014 +# SpecTclGui Version: 1.0 +# Author: Ron Fox (fo...@ns...) + +#New Tree Parameters: + +catch {treeparameter -create e.01 0 4095 4096 {}} +catch {treeparameter -create e.02 0 4095 4096 {}} +catch {treeparameter -create e.03 0 4095 4096 {}} +catch {treeparameter -create e.04 0 4095 4096 {}} +catch {treeparameter -create e.05 0 4095 4096 {}} +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 t.01 0 4095 4096 {}} +catch {treeparameter -create t.02 0 4095 4096 {}} +catch {treeparameter -create t.03 0 4095 4096 {}} +catch {treeparameter -create t.04 0 4095 4096 {}} +catch {treeparameter -create t.05 0 4095 4096 {}} +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 tdc.chan00 0 65534 65535 {}} +catch {treeparameter -create tdc.chan01 0 65534 65535 {}} +catch {treeparameter -create tdc.chan02 0 65534 65535 {}} +catch {treeparameter -create tdc.chan03 0 65534 65535 {}} +catch {treeparameter -create tdc.chan04 0 65534 65535 {}} +catch {treeparameter -create tdc.chan05 0 65534 65535 {}} +catch {treeparameter -create tdc.chan06 0 65534 65535 {}} +catch {treeparameter -create tdc.chan07 0 65534 65535 {}} +catch {treeparameter -create tdc.chan08 0 65534 65535 {}} +catch {treeparameter -create tdc.chan09 0 65534 65535 {}} +catch {treeparameter -create tdc.chan10 0 65534 65535 {}} +catch {treeparameter -create tdc.chan11 0 65534 65535 {}} +catch {treeparameter -create tdc.chan12 0 65534 65535 {}} +catch {treeparameter -create tdc.chan13 0 65534 65535 {}} +catch {treeparameter -create tdc.chan14 0 65534 65535 {}} +catch {treeparameter -create tdc.chan15 0 65534 65535 {}} +catch {treeparameter -create tdc.chan16 0 65534 65535 {}} +catch {treeparameter -create tdc.chan17 0 65534 65535 {}} +catch {treeparameter -create tdc.chan18 0 65534 65535 {}} +catch {treeparameter -create tdc.chan19 0 65534 65535 {}} +catch {treeparameter -create tdc.chan20 0 65534 65535 {}} +catch {treeparameter -create tdc.chan21 0 65534 65535 {}} +catch {treeparameter -create tdc.chan22 0 65534 65535 {}} +catch {treeparameter -create tdc.chan23 0 65534 65535 {}} +catch {treeparameter -create tdc.chan24 0 65534 65535 {}} +catch {treeparameter -create tdc.chan25 0 65534 65535 {}} +catch {treeparameter -create tdc.chan26 0 65534 65535 {}} +catch {treeparameter -create tdc.chan27 0 65534 65535 {}} +catch {treeparameter -create tdc.chan28 0 65534 65535 {}} +catch {treeparameter -create tdc.chan29 0 65534 65535 {}} +catch {treeparameter -create tdc.chan30 0 65534 65535 {}} +catch {treeparameter -create tdc.chan31 0 65534 65535 {}} +catch {treeparameter -create tdc.chan32 0 65534 65535 {}} +catch {treeparameter -create tdc.chan33 0 65534 65535 {}} + +#Modified Tree Parameters: + + +# Pseudo parameter definitions + + +# Tree variable definitions: + +treevariable -set evb.buildWindow 16 ticks +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.quadcoef.00 0 {} +treevariable -set xmb.quadcoef.01 0 {} +treevariable -set xmb.quadcoef.02 0 {} +treevariable -set xmb.quadcoef.03 0 {} +treevariable -set xmb.quadcoef.04 0 {} +treevariable -set xmb.quadcoef.05 0 {} +treevariable -set xmb.quadcoef.06 0 {} +treevariable -set xmb.quadcoef.07 0 {} +treevariable -set xmb.quadcoef.08 0 {} +treevariable -set xmb.quadcoef.09 0 {} +treevariable -set xmb.quadcoef.10 0 {} +treevariable -set xmb.quadcoef.11 0 {} +treevariable -set xmb.quadcoef.12 0 {} +treevariable -set xmb.quadcoef.13 0 {} +treevariable -set xmb.quadcoef.14 0 {} +treevariable -set xmb.quadcoef.15 0 {} +treevariable -set xmb.quadcoef.16 0 {} +treevariable -set xmb.quadcoef.17 0 {} +treevariable -set xmb.quadcoef.18 0 {} +treevariable -set xmb.quadcoef.19 0 {} +treevariable -set xmb.quadcoef.20 0 {} +treevariable -set xmb.quadcoef.21 0 {} +treevariable -set xmb.quadcoef.22 0 {} +treevariable -set xmb.quadcoef.23 0 {} +treevariable -set xmb.quadcoef.24 0 {} +treevariable -set xmb.quadcoef.25 0 {} +treevariable -set xmb.quadcoef.26 0 {} +treevariable -set xmb.quadcoef.27 0 {} +treevariable -set xmb.quadcoef.28 0 {} +treevariable -set xmb.quadcoef.29 0 {} +treevariable -set xmb.quadcoef.30 0 {} +treevariable -set xmb.quadcoef.31 0 {} +treevariable -set xmb.quadcoef.32 0 {} +treevariable -set xmb.quadcoef.33 0 {} +treevariable -set xmb.quadcoef.34 0 {} +treevariable -set xmb.quadcoef.35 0 {} +treevariable -set xmb.quadcoef.36 0 {} +treevariable -set xmb.quadcoef.37 0 {} +treevariable -set xmb.quadcoef.38 0 {} +treevariable -set xmb.quadcoef.39 0 {} +treevariable -set xmb.quadcoef.40 0 {} +treevariable -set xmb.quadcoef.41 0 {} +treevariable -set xmb.quadcoef.42 0 {} +treevariable -set xmb.quadcoef.43 0 {} +treevariable -set xmb.quadcoef.44 0 {} +treevariable -set xmb.quadcoef.45 0 {} +treevariable -set xmb.quadcoef.46 0 {} +treevariable -set xmb.quadcoef.47 0 {} +treevariable -set xmb.quadcoef.48 0 {} +treevariable -set xmb.quadcoef.49 0 {} +treevariable -set xmb.quadcoef.50 0 {} +treevariable -set xmb.quadcoef.51 0 {} +treevariable -set xmb.quadcoef.52 0 {} +treevariable -set xmb.quadcoef.53 0 {} +treevariable -set xmb.quadcoef.54 0 {} +treevariable -set xmb.quadcoef.55 0 {} +treevariable -set xmb.quadcoef.56 0 {} +treevariable -set xmb.quadcoef.57 0 {} +treevariable -set xmb.quadcoef.58 0 {} +treevariable -set xmb.quadcoef.59 0 {} +treevariable -set xmb.quadcoef.60 0 {} +treevariable -set xmb.quadcoef.61 0 {} +treevariable -set xmb.quadcoef.62 0 {} +treevariable -set xmb.quadcoef.63 0 {} +treevariable -set xmb.quadcoef.64 0 {} +treevariable -set xmb.quadcoef.65 0 {} +treevariable -set xmb.quadcoef.66 0 {} +treevariable -set xmb.quadcoef.67 0 {} +treevariable -set xmb.quadcoef.68 0 {} +treevariable -set xmb.quadcoef.69 0 {} +treevariable -set xmb.quadcoef.70 0 {} +treevariable -set xmb.quadcoef.71 0 {} +treevariable -set xmb.quadcoef.72 0 {} +treevariable -set xmb.quadcoef.73 0 {} +treevariable -set xmb.quadcoef.74 0 {} +treevariable -set xmb.quadcoef.75 0 {} +treevariable -set xmb.quadcoef.76 0 {} +treevariable -set xmb.quadcoef.77 0 {} +treevariable -set xmb.quadcoef.78 0 {} +treevariable -set xmb.quadcoef.79 0 {} +treevariable -set xmb.quadcoef.80 0 {} +treevariable -set xmb.quadcoef.81 0 {} +treevariable -set xmb.quadcoef.82 0 {} +treevariable -set xmb.quadcoef.83 0 {} +treevariable -set xmb.quadcoef.84 0 {} +treevariable -set xmb.quadcoef.85 0 {} +treevariable -set xmb.quadcoef.86 0 {} +treevariable -set xmb.quadcoef.87 0 {} +treevariable -set xmb.quadcoef.88 0 {} +treevariable -set xmb.quadcoef.89 0 {} +treevariable -set xmb.quadcoef.90 0 {} +treevariable -set xmb.quadcoef.91 0 {} +treevariable -set xmb.quadcoef.92 0 {} +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 +treevariable -set xmb.slopes.83 1 KeV/Chan +treevariable -set xmb.slopes.84 1 KeV/Chan +treevariable -set xmb.slopes.85 1 KeV/Chan +treevariable -set xmb.slopes.86 1 KeV/Chan +treevariable -set xmb.slopes.87 1 KeV/Chan +treevariable -set xmb.slopes.88 1 KeV/Chan +treevariable -set xmb.slopes.89 1 KeV/Chan +treevariable -set xmb.slopes.90 1 KeV/Chan +treevariable -set xmb.slopes.91 1 KeV/Chan +treevariable -set xmb.slopes.92 1 KeV/Chan +treevariable -set xmb.slopes.93 1 KeV/Chan +treevariable -set xmb.slopes.94 1 KeV/Chan +treevariable -set xmb.slopes.95 1 KeV/Chan + +# Spectrum Definitions + +catch {spectrum -delete 2} +spectrum 2 2 {madc.00 madc.02} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} long +catch {spectrum -delete 2.1} +spectrum 2.1 2 {e.01 t.01} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} long +catch {spectrum -delete 2.2} +spectrum 2.2 2 {e.02 t.02} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} long +catch {spectrum -delete CumulativeCounts.ns-gated} +spectrum CumulativeCounts.ns-gated S {Time.Run-Time-ns Time.TotalGatedEvents} {{0.000000 10000000.000000 10000}} long +catch {spectrum -delete CumulativeCounts.nsec} +spectrum CumulativeCounts.nsec S {Time.Run-Time-ns Time.TotalEvents} {{0.000000 10000000.000000 10000}} long +catch {spectrum -delete CumulativeCounts.sec} +spectrum CumulativeCounts.sec S {Time.Run-Time-s Time.TotalEvents} {{0.000000 3599.000000 3600}} long +catch {spectrum -delete CumulativeCounts.sec-gated} +spectrum CumulativeCounts.sec-gated S {Time.Run-Time-s Time.TotalGatedEvents} {{0.000000 3599.000000 3600}} long +catch {spectrum -delete Time-interval-analysis} +spectrum Time-interval-analysis 1 Time.logdt {{0.000000 9.000000 900}} long +catch {spectrum -delete Time-interval-analysis-gated} +spectrum Time-interval-analysis-gated 1 Time.logdt-gated {{0.000000 9.000000 900}} long +catch {spectrum -delete e.01} +spectrum e.01 1 e.01 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.02} +spectrum e.02 1 e.02 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.03} +spectrum e.03 1 e.03 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.04} +spectrum e.04 1 e.04 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.05} +spectrum e.05 1 e.05 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.06} +spectrum e.06 1 e.06 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.07} +spectrum e.07 1 e.07 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e.08} +spectrum e.08 1 e.08 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete e1v21} +spectrum e1v21 2 {e.01 t.01} {{0.000000 4095.000000 256} {0.000000 4095.000000 256}} long +catch {spectrum -delete madc.00} +spectrum madc.00 1 madc.00 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.01} +spectrum madc.01 1 madc.01 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.02} +spectrum madc.02 1 madc.02 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.03} +spectrum madc.03 1 madc.03 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.04} +spectrum madc.04 1 madc.04 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.05} +spectrum madc.05 1 madc.05 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.06} +spectrum madc.06 1 madc.06 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.07} +spectrum madc.07 1 madc.07 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.08} +spectrum madc.08 1 madc.08 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.09} +spectrum madc.09 1 madc.09 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.10} +spectrum madc.10 1 madc.10 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.11} +spectrum madc.11 1 madc.11 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.12} +spectrum madc.12 1 madc.12 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.13} +spectrum madc.13 1 madc.13 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.14} +spectrum madc.14 1 madc.14 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.15} +spectrum madc.15 1 madc.15 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.16} +spectrum madc.16 1 madc.16 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.17} +spectrum madc.17 1 madc.17 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.18} +spectrum madc.18 1 madc.18 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.19} +spectrum madc.19 1 madc.19 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.20} +spectrum madc.20 1 madc.20 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.21} +spectrum madc.21 1 madc.21 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.22} +spectrum madc.22 1 madc.22 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.23} +spectrum madc.23 1 madc.23 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.24} +spectrum madc.24 1 madc.24 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.25} +spectrum madc.25 1 madc.25 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.26} +spectrum madc.26 1 madc.26 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.27} +spectrum madc.27 1 madc.27 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.28} +spectrum madc.28 1 madc.28 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.29} +spectrum madc.29 1 madc.29 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.30} +spectrum madc.30 1 madc.30 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.31} +spectrum madc.31 1 madc.31 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete madc.timestamp} +spectrum madc.timestamp 1 madc.timestamp {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.01} +spectrum t.01 1 t.01 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.02} +spectrum t.02 1 t.02 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.03} +spectrum t.03 1 t.03 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.04} +spectrum t.04 1 t.04 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.05} +spectrum t.05 1 t.05 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.06} +spectrum t.06 1 t.06 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.07} +spectrum t.07 1 t.07 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete t.08} +spectrum t.08 1 t.08 {{0.000000 4095.000000 4096}} long +catch {spectrum -delete tdc.chan00} +spectrum tdc.chan00 1 tdc.chan00 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan00..0} +spectrum tdc.chan00..0 1 tdc.chan00..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan00..1} +spectrum tdc.chan00..1 1 tdc.chan00..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan00..2} +spectrum tdc.chan00..2 1 tdc.chan00..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan00.eventCorr.0} +spectrum tdc.chan00.eventCorr.0 1 tdc.chan00.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan00.eventCorr.1} +spectrum tdc.chan00.eventCorr.1 1 tdc.chan00.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan00.eventCorr.2} +spectrum tdc.chan00.eventCorr.2 1 tdc.chan00.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan00.time.0} +spectrum tdc.chan00.time.0 1 tdc.chan00.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan00.time.1} +spectrum tdc.chan00.time.1 1 tdc.chan00.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan00.time.2} +spectrum tdc.chan00.time.2 1 tdc.chan00.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan01} +spectrum tdc.chan01 1 tdc.chan01 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan01..0} +spectrum tdc.chan01..0 1 tdc.chan01..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan01..1} +spectrum tdc.chan01..1 1 tdc.chan01..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan01..2} +spectrum tdc.chan01..2 1 tdc.chan01..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan01.eventCorr.0} +spectrum tdc.chan01.eventCorr.0 1 tdc.chan01.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan01.eventCorr.1} +spectrum tdc.chan01.eventCorr.1 1 tdc.chan01.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan01.eventCorr.2} +spectrum tdc.chan01.eventCorr.2 1 tdc.chan01.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan01.time.0} +spectrum tdc.chan01.time.0 1 tdc.chan01.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan01.time.1} +spectrum tdc.chan01.time.1 1 tdc.chan01.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan01.time.2} +spectrum tdc.chan01.time.2 1 tdc.chan01.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan02} +spectrum tdc.chan02 1 tdc.chan02 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan02..0} +spectrum tdc.chan02..0 1 tdc.chan02..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan02..1} +spectrum tdc.chan02..1 1 tdc.chan02..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan02..2} +spectrum tdc.chan02..2 1 tdc.chan02..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan02.eventCorr.0} +spectrum tdc.chan02.eventCorr.0 1 tdc.chan02.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan02.eventCorr.1} +spectrum tdc.chan02.eventCorr.1 1 tdc.chan02.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan02.eventCorr.2} +spectrum tdc.chan02.eventCorr.2 1 tdc.chan02.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan02.time.0} +spectrum tdc.chan02.time.0 1 tdc.chan02.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan02.time.1} +spectrum tdc.chan02.time.1 1 tdc.chan02.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan02.time.2} +spectrum tdc.chan02.time.2 1 tdc.chan02.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan03} +spectrum tdc.chan03 1 tdc.chan03 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan03..0} +spectrum tdc.chan03..0 1 tdc.chan03..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan03..1} +spectrum tdc.chan03..1 1 tdc.chan03..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan03..2} +spectrum tdc.chan03..2 1 tdc.chan03..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan03.eventCorr.0} +spectrum tdc.chan03.eventCorr.0 1 tdc.chan03.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan03.eventCorr.1} +spectrum tdc.chan03.eventCorr.1 1 tdc.chan03.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan03.eventCorr.2} +spectrum tdc.chan03.eventCorr.2 1 tdc.chan03.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan03.time.0} +spectrum tdc.chan03.time.0 1 tdc.chan03.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan03.time.1} +spectrum tdc.chan03.time.1 1 tdc.chan03.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan03.time.2} +spectrum tdc.chan03.time.2 1 tdc.chan03.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan04} +spectrum tdc.chan04 1 tdc.chan04 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan04..0} +spectrum tdc.chan04..0 1 tdc.chan04..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan04..1} +spectrum tdc.chan04..1 1 tdc.chan04..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan04..2} +spectrum tdc.chan04..2 1 tdc.chan04..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan04.eventCorr.0} +spectrum tdc.chan04.eventCorr.0 1 tdc.chan04.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan04.eventCorr.1} +spectrum tdc.chan04.eventCorr.1 1 tdc.chan04.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan04.eventCorr.2} +spectrum tdc.chan04.eventCorr.2 1 tdc.chan04.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan04.time.0} +spectrum tdc.chan04.time.0 1 tdc.chan04.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan04.time.1} +spectrum tdc.chan04.time.1 1 tdc.chan04.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan04.time.2} +spectrum tdc.chan04.time.2 1 tdc.chan04.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan05} +spectrum tdc.chan05 1 tdc.chan05 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan05..0} +spectrum tdc.chan05..0 1 tdc.chan05..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan05..1} +spectrum tdc.chan05..1 1 tdc.chan05..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan05..2} +spectrum tdc.chan05..2 1 tdc.chan05..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan05.eventCorr.0} +spectrum tdc.chan05.eventCorr.0 1 tdc.chan05.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan05.eventCorr.1} +spectrum tdc.chan05.eventCorr.1 1 tdc.chan05.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan05.eventCorr.2} +spectrum tdc.chan05.eventCorr.2 1 tdc.chan05.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan05.time.0} +spectrum tdc.chan05.time.0 1 tdc.chan05.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan05.time.1} +spectrum tdc.chan05.time.1 1 tdc.chan05.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan05.time.2} +spectrum tdc.chan05.time.2 1 tdc.chan05.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan06} +spectrum tdc.chan06 1 tdc.chan06 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan06..0} +spectrum tdc.chan06..0 1 tdc.chan06..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan06..1} +spectrum tdc.chan06..1 1 tdc.chan06..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan06..2} +spectrum tdc.chan06..2 1 tdc.chan06..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan06.eventCorr.0} +spectrum tdc.chan06.eventCorr.0 1 tdc.chan06.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan06.eventCorr.1} +spectrum tdc.chan06.eventCorr.1 1 tdc.chan06.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan06.eventCorr.2} +spectrum tdc.chan06.eventCorr.2 1 tdc.chan06.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan06.time.0} +spectrum tdc.chan06.time.0 1 tdc.chan06.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan06.time.1} +spectrum tdc.chan06.time.1 1 tdc.chan06.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan06.time.2} +spectrum tdc.chan06.time.2 1 tdc.chan06.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan07} +spectrum tdc.chan07 1 tdc.chan07 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan07..0} +spectrum tdc.chan07..0 1 tdc.chan07..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan07..1} +spectrum tdc.chan07..1 1 tdc.chan07..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan07..2} +spectrum tdc.chan07..2 1 tdc.chan07..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan07.eventCorr.0} +spectrum tdc.chan07.eventCorr.0 1 tdc.chan07.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan07.eventCorr.1} +spectrum tdc.chan07.eventCorr.1 1 tdc.chan07.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan07.eventCorr.2} +spectrum tdc.chan07.eventCorr.2 1 tdc.chan07.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan07.time.0} +spectrum tdc.chan07.time.0 1 tdc.chan07.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan07.time.1} +spectrum tdc.chan07.time.1 1 tdc.chan07.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan07.time.2} +spectrum tdc.chan07.time.2 1 tdc.chan07.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan08} +spectrum tdc.chan08 1 tdc.chan08 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan08..0} +spectrum tdc.chan08..0 1 tdc.chan08..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan08..1} +spectrum tdc.chan08..1 1 tdc.chan08..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan08..2} +spectrum tdc.chan08..2 1 tdc.chan08..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan08.eventCorr.0} +spectrum tdc.chan08.eventCorr.0 1 tdc.chan08.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan08.eventCorr.1} +spectrum tdc.chan08.eventCorr.1 1 tdc.chan08.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan08.eventCorr.2} +spectrum tdc.chan08.eventCorr.2 1 tdc.chan08.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan08.time.0} +spectrum tdc.chan08.time.0 1 tdc.chan08.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan08.time.1} +spectrum tdc.chan08.time.1 1 tdc.chan08.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan08.time.2} +spectrum tdc.chan08.time.2 1 tdc.chan08.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan09} +spectrum tdc.chan09 1 tdc.chan09 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan09..0} +spectrum tdc.chan09..0 1 tdc.chan09..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan09..1} +spectrum tdc.chan09..1 1 tdc.chan09..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan09..2} +spectrum tdc.chan09..2 1 tdc.chan09..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan09.eventCorr.0} +spectrum tdc.chan09.eventCorr.0 1 tdc.chan09.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan09.eventCorr.1} +spectrum tdc.chan09.eventCorr.1 1 tdc.chan09.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan09.eventCorr.2} +spectrum tdc.chan09.eventCorr.2 1 tdc.chan09.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan09.time.0} +spectrum tdc.chan09.time.0 1 tdc.chan09.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan09.time.1} +spectrum tdc.chan09.time.1 1 tdc.chan09.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan09.time.2} +spectrum tdc.chan09.time.2 1 tdc.chan09.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan10} +spectrum tdc.chan10 1 tdc.chan10 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan10..0} +spectrum tdc.chan10..0 1 tdc.chan10..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan10..1} +spectrum tdc.chan10..1 1 tdc.chan10..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan10..2} +spectrum tdc.chan10..2 1 tdc.chan10..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan10.eventCorr.0} +spectrum tdc.chan10.eventCorr.0 1 tdc.chan10.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan10.eventCorr.1} +spectrum tdc.chan10.eventCorr.1 1 tdc.chan10.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan10.eventCorr.2} +spectrum tdc.chan10.eventCorr.2 1 tdc.chan10.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan10.time.0} +spectrum tdc.chan10.time.0 1 tdc.chan10.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan10.time.1} +spectrum tdc.chan10.time.1 1 tdc.chan10.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan10.time.2} +spectrum tdc.chan10.time.2 1 tdc.chan10.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan11} +spectrum tdc.chan11 1 tdc.chan11 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan11..0} +spectrum tdc.chan11..0 1 tdc.chan11..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan11..1} +spectrum tdc.chan11..1 1 tdc.chan11..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan11..2} +spectrum tdc.chan11..2 1 tdc.chan11..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan11.eventCorr.0} +spectrum tdc.chan11.eventCorr.0 1 tdc.chan11.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan11.eventCorr.1} +spectrum tdc.chan11.eventCorr.1 1 tdc.chan11.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan11.eventCorr.2} +spectrum tdc.chan11.eventCorr.2 1 tdc.chan11.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan11.time.0} +spectrum tdc.chan11.time.0 1 tdc.chan11.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan11.time.1} +spectrum tdc.chan11.time.1 1 tdc.chan11.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan11.time.2} +spectrum tdc.chan11.time.2 1 tdc.chan11.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan12} +spectrum tdc.chan12 1 tdc.chan12 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan12..0} +spectrum tdc.chan12..0 1 tdc.chan12..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan12..1} +spectrum tdc.chan12..1 1 tdc.chan12..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan12..2} +spectrum tdc.chan12..2 1 tdc.chan12..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan12.eventCorr.0} +spectrum tdc.chan12.eventCorr.0 1 tdc.chan12.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan12.eventCorr.1} +spectrum tdc.chan12.eventCorr.1 1 tdc.chan12.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan12.eventCorr.2} +spectrum tdc.chan12.eventCorr.2 1 tdc.chan12.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan12.time.0} +spectrum tdc.chan12.time.0 1 tdc.chan12.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan12.time.1} +spectrum tdc.chan12.time.1 1 tdc.chan12.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan12.time.2} +spectrum tdc.chan12.time.2 1 tdc.chan12.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan13} +spectrum tdc.chan13 1 tdc.chan13 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan13..0} +spectrum tdc.chan13..0 1 tdc.chan13..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan13..1} +spectrum tdc.chan13..1 1 tdc.chan13..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan13..2} +spectrum tdc.chan13..2 1 tdc.chan13..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan13.eventCorr.0} +spectrum tdc.chan13.eventCorr.0 1 tdc.chan13.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan13.eventCorr.1} +spectrum tdc.chan13.eventCorr.1 1 tdc.chan13.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan13.eventCorr.2} +spectrum tdc.chan13.eventCorr.2 1 tdc.chan13.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan13.time.0} +spectrum tdc.chan13.time.0 1 tdc.chan13.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan13.time.1} +spectrum tdc.chan13.time.1 1 tdc.chan13.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan13.time.2} +spectrum tdc.chan13.time.2 1 tdc.chan13.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan14} +spectrum tdc.chan14 1 tdc.chan14 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan14..0} +spectrum tdc.chan14..0 1 tdc.chan14..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan14..1} +spectrum tdc.chan14..1 1 tdc.chan14..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan14..2} +spectrum tdc.chan14..2 1 tdc.chan14..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan14.eventCorr.0} +spectrum tdc.chan14.eventCorr.0 1 tdc.chan14.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan14.eventCorr.1} +spectrum tdc.chan14.eventCorr.1 1 tdc.chan14.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan14.eventCorr.2} +spectrum tdc.chan14.eventCorr.2 1 tdc.chan14.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan14.time.0} +spectrum tdc.chan14.time.0 1 tdc.chan14.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan14.time.1} +spectrum tdc.chan14.time.1 1 tdc.chan14.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan14.time.2} +spectrum tdc.chan14.time.2 1 tdc.chan14.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan15} +spectrum tdc.chan15 1 tdc.chan15 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan15..0} +spectrum tdc.chan15..0 1 tdc.chan15..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan15..1} +spectrum tdc.chan15..1 1 tdc.chan15..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan15..2} +spectrum tdc.chan15..2 1 tdc.chan15..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan15.eventCorr.0} +spectrum tdc.chan15.eventCorr.0 1 tdc.chan15.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan15.eventCorr.1} +spectrum tdc.chan15.eventCorr.1 1 tdc.chan15.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan15.eventCorr.2} +spectrum tdc.chan15.eventCorr.2 1 tdc.chan15.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan15.time.0} +spectrum tdc.chan15.time.0 1 tdc.chan15.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan15.time.1} +spectrum tdc.chan15.time.1 1 tdc.chan15.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan15.time.2} +spectrum tdc.chan15.time.2 1 tdc.chan15.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan16} +spectrum tdc.chan16 1 tdc.chan16 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan16..0} +spectrum tdc.chan16..0 1 tdc.chan16..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan16..1} +spectrum tdc.chan16..1 1 tdc.chan16..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan16..2} +spectrum tdc.chan16..2 1 tdc.chan16..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan16.eventCorr.0} +spectrum tdc.chan16.eventCorr.0 1 tdc.chan16.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan16.eventCorr.1} +spectrum tdc.chan16.eventCorr.1 1 tdc.chan16.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan16.eventCorr.2} +spectrum tdc.chan16.eventCorr.2 1 tdc.chan16.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan16.time.0} +spectrum tdc.chan16.time.0 1 tdc.chan16.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan16.time.1} +spectrum tdc.chan16.time.1 1 tdc.chan16.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan16.time.2} +spectrum tdc.chan16.time.2 1 tdc.chan16.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan17} +spectrum tdc.chan17 1 tdc.chan17 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan17..0} +spectrum tdc.chan17..0 1 tdc.chan17..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan17..1} +spectrum tdc.chan17..1 1 tdc.chan17..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan17..2} +spectrum tdc.chan17..2 1 tdc.chan17..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan17.eventCorr.0} +spectrum tdc.chan17.eventCorr.0 1 tdc.chan17.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan17.eventCorr.1} +spectrum tdc.chan17.eventCorr.1 1 tdc.chan17.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan17.eventCorr.2} +spectrum tdc.chan17.eventCorr.2 1 tdc.chan17.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan17.time.0} +spectrum tdc.chan17.time.0 1 tdc.chan17.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan17.time.1} +spectrum tdc.chan17.time.1 1 tdc.chan17.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan17.time.2} +spectrum tdc.chan17.time.2 1 tdc.chan17.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan18} +spectrum tdc.chan18 1 tdc.chan18 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan18..0} +spectrum tdc.chan18..0 1 tdc.chan18..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan18..1} +spectrum tdc.chan18..1 1 tdc.chan18..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan18..2} +spectrum tdc.chan18..2 1 tdc.chan18..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan18.eventCorr.0} +spectrum tdc.chan18.eventCorr.0 1 tdc.chan18.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan18.eventCorr.1} +spectrum tdc.chan18.eventCorr.1 1 tdc.chan18.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan18.eventCorr.2} +spectrum tdc.chan18.eventCorr.2 1 tdc.chan18.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan18.time.0} +spectrum tdc.chan18.time.0 1 tdc.chan18.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan18.time.1} +spectrum tdc.chan18.time.1 1 tdc.chan18.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan18.time.2} +spectrum tdc.chan18.time.2 1 tdc.chan18.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan19} +spectrum tdc.chan19 1 tdc.chan19 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan19..0} +spectrum tdc.chan19..0 1 tdc.chan19..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan19..1} +spectrum tdc.chan19..1 1 tdc.chan19..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan19..2} +spectrum tdc.chan19..2 1 tdc.chan19..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan19.eventCorr.0} +spectrum tdc.chan19.eventCorr.0 1 tdc.chan19.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan19.eventCorr.1} +spectrum tdc.chan19.eventCorr.1 1 tdc.chan19.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan19.eventCorr.2} +spectrum tdc.chan19.eventCorr.2 1 tdc.chan19.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan19.time.0} +spectrum tdc.chan19.time.0 1 tdc.chan19.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan19.time.1} +spectrum tdc.chan19.time.1 1 tdc.chan19.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan19.time.2} +spectrum tdc.chan19.time.2 1 tdc.chan19.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan20} +spectrum tdc.chan20 1 tdc.chan20 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan20..0} +spectrum tdc.chan20..0 1 tdc.chan20..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan20..1} +spectrum tdc.chan20..1 1 tdc.chan20..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan20..2} +spectrum tdc.chan20..2 1 tdc.chan20..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan20.eventCorr.0} +spectrum tdc.chan20.eventCorr.0 1 tdc.chan20.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan20.eventCorr.1} +spectrum tdc.chan20.eventCorr.1 1 tdc.chan20.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan20.eventCorr.2} +spectrum tdc.chan20.eventCorr.2 1 tdc.chan20.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan20.time.0} +spectrum tdc.chan20.time.0 1 tdc.chan20.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan20.time.1} +spectrum tdc.chan20.time.1 1 tdc.chan20.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan20.time.2} +spectrum tdc.chan20.time.2 1 tdc.chan20.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan21} +spectrum tdc.chan21 1 tdc.chan21 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan21..0} +spectrum tdc.chan21..0 1 tdc.chan21..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan21..1} +spectrum tdc.chan21..1 1 tdc.chan21..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan21..2} +spectrum tdc.chan21..2 1 tdc.chan21..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan21.eventCorr.0} +spectrum tdc.chan21.eventCorr.0 1 tdc.chan21.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan21.eventCorr.1} +spectrum tdc.chan21.eventCorr.1 1 tdc.chan21.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan21.eventCorr.2} +spectrum tdc.chan21.eventCorr.2 1 tdc.chan21.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan21.time.0} +spectrum tdc.chan21.time.0 1 tdc.chan21.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan21.time.1} +spectrum tdc.chan21.time.1 1 tdc.chan21.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan21.time.2} +spectrum tdc.chan21.time.2 1 tdc.chan21.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan22} +spectrum tdc.chan22 1 tdc.chan22 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan22..0} +spectrum tdc.chan22..0 1 tdc.chan22..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan22..1} +spectrum tdc.chan22..1 1 tdc.chan22..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan22..2} +spectrum tdc.chan22..2 1 tdc.chan22..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan22.eventCorr.0} +spectrum tdc.chan22.eventCorr.0 1 tdc.chan22.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan22.eventCorr.1} +spectrum tdc.chan22.eventCorr.1 1 tdc.chan22.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan22.eventCorr.2} +spectrum tdc.chan22.eventCorr.2 1 tdc.chan22.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan22.time.0} +spectrum tdc.chan22.time.0 1 tdc.chan22.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan22.time.1} +spectrum tdc.chan22.time.1 1 tdc.chan22.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan22.time.2} +spectrum tdc.chan22.time.2 1 tdc.chan22.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan23} +spectrum tdc.chan23 1 tdc.chan23 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan23..0} +spectrum tdc.chan23..0 1 tdc.chan23..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan23..1} +spectrum tdc.chan23..1 1 tdc.chan23..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan23..2} +spectrum tdc.chan23..2 1 tdc.chan23..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan23.eventCorr.0} +spectrum tdc.chan23.eventCorr.0 1 tdc.chan23.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan23.eventCorr.1} +spectrum tdc.chan23.eventCorr.1 1 tdc.chan23.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan23.eventCorr.2} +spectrum tdc.chan23.eventCorr.2 1 tdc.chan23.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan23.time.0} +spectrum tdc.chan23.time.0 1 tdc.chan23.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan23.time.1} +spectrum tdc.chan23.time.1 1 tdc.chan23.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan23.time.2} +spectrum tdc.chan23.time.2 1 tdc.chan23.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan24} +spectrum tdc.chan24 1 tdc.chan24 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan24..0} +spectrum tdc.chan24..0 1 tdc.chan24..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan24..1} +spectrum tdc.chan24..1 1 tdc.chan24..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan24..2} +spectrum tdc.chan24..2 1 tdc.chan24..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan24.eventCorr.0} +spectrum tdc.chan24.eventCorr.0 1 tdc.chan24.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan24.eventCorr.1} +spectrum tdc.chan24.eventCorr.1 1 tdc.chan24.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan24.eventCorr.2} +spectrum tdc.chan24.eventCorr.2 1 tdc.chan24.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan24.time.0} +spectrum tdc.chan24.time.0 1 tdc.chan24.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan24.time.1} +spectrum tdc.chan24.time.1 1 tdc.chan24.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan24.time.2} +spectrum tdc.chan24.time.2 1 tdc.chan24.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan25} +spectrum tdc.chan25 1 tdc.chan25 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan25..0} +spectrum tdc.chan25..0 1 tdc.chan25..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan25..1} +spectrum tdc.chan25..1 1 tdc.chan25..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan25..2} +spectrum tdc.chan25..2 1 tdc.chan25..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan25.eventCorr.0} +spectrum tdc.chan25.eventCorr.0 1 tdc.chan25.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan25.eventCorr.1} +spectrum tdc.chan25.eventCorr.1 1 tdc.chan25.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan25.eventCorr.2} +spectrum tdc.chan25.eventCorr.2 1 tdc.chan25.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan25.time.0} +spectrum tdc.chan25.time.0 1 tdc.chan25.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan25.time.1} +spectrum tdc.chan25.time.1 1 tdc.chan25.time.1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan25.time.2} +spectrum tdc.chan25.time.2 1 tdc.chan25.time.2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan26} +spectrum tdc.chan26 1 tdc.chan26 {{0.000000 65534.000000 65535}} long +catch {spectrum -delete tdc.chan26..0} +spectrum tdc.chan26..0 1 tdc.chan26..0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan26..1} +spectrum tdc.chan26..1 1 tdc.chan26..1 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan26..2} +spectrum tdc.chan26..2 1 tdc.chan26..2 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan26.eventCorr.0} +spectrum tdc.chan26.eventCorr.0 1 tdc.chan26.eventCorr.0 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan26.eventCorr.1} +spectrum tdc.chan26.eventCorr.1 1 tdc.chan26.eventCorr.1 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan26.eventCorr.2} +spectrum tdc.chan26.eventCorr.2 1 tdc.chan26.eventCorr.2 {{0.000000 199999995904.000000 2048}} long +catch {spectrum -delete tdc.chan26.time.0} +spectrum tdc.chan26.time.0 1 tdc.chan26.time.0 {{0.000000 65536.000000 256}} long +catch {spectrum -delete tdc.chan26.time.1} +spectrum tdc.chan26.time.1 1 tdc.chan26.time.1 {{0.000000 65536.000000 256}... [truncated message content] |