From: <ro...@us...> - 2010-12-11 00:33:55
|
Revision: 1738 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1738&view=rev Author: ron-fox Date: 2010-12-11 00:33:49 +0000 (Sat, 11 Dec 2010) Log Message: ----------- Add support for XLM/HINP combination. Modified Paths: -------------- trunk/VMUSBSpecTcl/CStackUnpacker.cpp trunk/VMUSBSpecTcl/Makefile trunk/VMUSBSpecTcl/configFile.tcl trunk/VMUSBSpecTcl/spectclSetup.tcl Added Paths: ----------- trunk/VMUSBSpecTcl/CHINP.cpp trunk/VMUSBSpecTcl/CHINP.h Added: trunk/VMUSBSpecTcl/CHINP.cpp =================================================================== --- trunk/VMUSBSpecTcl/CHINP.cpp (rev 0) +++ trunk/VMUSBSpecTcl/CHINP.cpp 2010-12-11 00:33:49 UTC (rev 1738) @@ -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: trunk/VMUSBSpecTcl/CHINP.h =================================================================== --- trunk/VMUSBSpecTcl/CHINP.h (rev 0) +++ trunk/VMUSBSpecTcl/CHINP.h 2010-12-11 00:33:49 UTC (rev 1738) @@ -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 Modified: trunk/VMUSBSpecTcl/CStackUnpacker.cpp =================================================================== --- trunk/VMUSBSpecTcl/CStackUnpacker.cpp 2010-11-24 10:53:37 UTC (rev 1737) +++ trunk/VMUSBSpecTcl/CStackUnpacker.cpp 2010-12-11 00:33:49 UTC (rev 1738) @@ -24,6 +24,7 @@ #include "CParamMapCommand.h" #include "CStackMapCommand.h" #include "CMASE.h" +#include "CHINP.h" #include <Event.h> #include <TCLAnalyzer.h> @@ -51,6 +52,7 @@ static CV1x90Unpacker unpackV1x90; static CV977Unpacker unpackV977; static CMASE unpackMase; +static CHINP unpackHINP; // table of unpackers for each type of module. @@ -61,7 +63,9 @@ &unpackMADC32, &unpackV1x90, &unpackV977, - &unpackMase + &unpackMase, + &unpack785, // CAEN Dual range placeholder + &unpackHINP }; ////////////////////////////////////////////////////////////////////////////////// Modified: trunk/VMUSBSpecTcl/Makefile =================================================================== --- trunk/VMUSBSpecTcl/Makefile 2010-11-24 10:53:37 UTC (rev 1737) +++ trunk/VMUSBSpecTcl/Makefile 2010-12-11 00:33:49 UTC (rev 1738) @@ -1,4 +1,4 @@ -INSTDIR=/usr/opt/spectcl/3.3pre7 +INSTDIR=/usr/opt/spectcl/current # Skeleton makefile for 3.3 @@ -29,7 +29,7 @@ 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 + CV1x90Unpacker.o CV977Unpacker.o CMASE.o CHINP.o # Modified: trunk/VMUSBSpecTcl/configFile.tcl =================================================================== --- trunk/VMUSBSpecTcl/configFile.tcl 2010-11-24 10:53:37 UTC (rev 1737) +++ trunk/VMUSBSpecTcl/configFile.tcl 2010-12-11 00:33:49 UTC (rev 1738) @@ -49,6 +49,7 @@ 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. # We create as well spectra for each single parameter, and corresponding # pairs of n's. @@ -129,6 +130,20 @@ 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 + } +} #------------------------------------------------------------------- # # caenv965 Process the caenv956 command which handles CAEN Modified: trunk/VMUSBSpecTcl/spectclSetup.tcl =================================================================== --- trunk/VMUSBSpecTcl/spectclSetup.tcl 2010-11-24 10:53:37 UTC (rev 1737) +++ trunk/VMUSBSpecTcl/spectclSetup.tcl 2010-12-11 00:33:49 UTC (rev 1738) @@ -61,7 +61,7 @@ puts "Configuration cleared" -if {[catch {configRead [file join $here daqconfig.tcl]} msg]} { +if {[catch {configRead [file join ~ config daqconfig.tcl]} msg]} { puts "Error in configuration file read: $msg" } @@ -73,6 +73,7 @@ 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; # No channels in a default HINP spectrum. #----------------------------------------------------------------------------- # Creates a 1-d spectrum. @@ -240,6 +241,37 @@ } 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 +} #---------------------------------------------------------------------------- # # Build channels and maps for a CAEN Dual range module. @@ -258,6 +290,8 @@ set parameterList [list] + + foreach parameter $channels { parameter $parameter.h $param makeSpectrum $parameter.h $resolution @@ -273,6 +307,7 @@ return $param } + #---------------------------------------------------------------------------- # Build the channel maps, spectcl parameters and raw spectra from # the adcConfigurtion, readoutDeviceType and adcChannels information. @@ -300,6 +335,8 @@ 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] } else { set vsn $::adcConfiguration($module) set type $::readoutDeviceType($module) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |