From: <ro...@us...> - 2010-08-19 09:48:10
|
Revision: 1710 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1710&view=rev Author: ron-fox Date: 2010-08-19 09:48:03 +0000 (Thu, 19 Aug 2010) Log Message: ----------- - Delete typo-d filenames. - Get the stack unpacker modified for use with super-events. - Make the MADC32.cpp unpacker a bit more tolerant of some of the weird data conditions I've seen:missing trailers, data that have 0xffff in top 6 bits etc. - Get raw parameter spectra and the 2-ds working. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp branches/LLNLMadcChainSpecTcl/CStackUnpacker.cpp branches/LLNLMadcChainSpecTcl/CStackUnpacker.h branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl/configFile.tcl branches/LLNLMadcChainSpecTcl/spectclSetup.tcl Removed Paths: ------------- branches/LLNLMadcChainSpecTcl/CRateEventProcssor.cpp branches/LLNLMadcChainSpecTcl/CRateEventProcssor.h Modified: branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp 2010-08-18 12:28:05 UTC (rev 1709) +++ branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp 2010-08-19 09:48:03 UTC (rev 1710) @@ -154,19 +154,15 @@ // The datum should be the trailer.. verify this.. If so, // then save the count field ans parameter 32. + uint32_t timestamp; if (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_TRAILER) { - uint32_t value = datum & TRAILER_COUNTMASK; - int id = pMap->map[32]; - if (id != -1) { - rEvent[id] = value; - } + timestamp = datum & TRAILER_COUNTMASK; } else { - longsRead--; // Really should not happen!! - } - - // There will be a 0xffffffff longword for the BERR at the end of the - // readout. + // Sometimes I see wonky events...missing trailers... data with the top 1/2 filled with only 1's. + // I'm going to pop an exeption out so that the caller can move on to the next event/supervevent - return offset + 2; + throw string("MADC Unpacker did not see a trailer at the end of an MADC32 event"); + } + return offset; } Deleted: branches/LLNLMadcChainSpecTcl/CRateEventProcssor.cpp =================================================================== Deleted: branches/LLNLMadcChainSpecTcl/CRateEventProcssor.h =================================================================== Modified: branches/LLNLMadcChainSpecTcl/CStackUnpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CStackUnpacker.cpp 2010-08-18 12:28:05 UTC (rev 1709) +++ branches/LLNLMadcChainSpecTcl/CStackUnpacker.cpp 2010-08-19 09:48:03 UTC (rev 1710) @@ -69,7 +69,12 @@ // The ones we have ar no-ops. -CStackUnpacker::CStackUnpacker() {} +CStackUnpacker::CStackUnpacker() : + m_state(CStackUnpacker::Initial), + m_size(0), + m_offset(0) +{ +} CStackUnpacker::~CStackUnpacker() {} @@ -104,56 +109,97 @@ { CTclAnalyzer& analyzer(dynamic_cast<CTclAnalyzer&>(rAnalyzer)); TranslatorPointer<UShort_t> p(*(rDecoder.getBufferTranslator()), pEvent); - vector<uint16_t> event; StackInfo info; - info = assembleEvent(p, event); - int stackId = info.s_stackNumber; - analyzer.SetEventSize((info.s_stackSize)*sizeof(uint16_t)); // +1 for the header. + switch (m_state) { + case Initial: // Need to fetch a new event from the data... + info = assembleEvent(p, m_event); + m_offset = 0; + m_size = info.s_stackSize; + m_state = Internal; + m_stack = info.s_stackNumber; + case Internal: + unpackEvent(rEvent); + break; + default: + throw string("Invalid state in CStackUnpacker::operator()"); + } - // Get our stack map: - const CStackMapCommand::stackMap& myMap(CStackMapCommand::getMap(stackId)); + // What we do now depends on whether or not there is data left in the megaevent: + // note that m_size includes the header which is not in the megaevent: - // Unpack each module in the stack: + if (m_offset < (m_size-1)) { + // More data in superevent; stay in the internal state.. - unsigned int offset = 0; + analyzer.entityNotDone(); + analyzer.SetEventSize(0); + } + else { + // No data left in the superevent, transition to the Initial state: + analyzer.SetEventSize(m_size*sizeof(uint16_t)); + m_state = Initial; + } + return kfTRUE; - for (int i = 0; i < myMap.size(); i++) { - CParamMapCommand::AdcMapping* pMap = myMap[i]; - int moduleType = pMap->type; - CModuleUnpacker* pUnpacker = m_unpackers[moduleType]; - offset = (*pUnpacker)(rEvent, event, offset, pMap); - } +} +/** + ** Unpack a single module: + ** Parameters: + ** rEvent - Reference to the event 'vector' we are filling with parameters. + ** Implicit Inputs: + ** m_event - Current superevent (vector<uint16_t>). + ** m_offset - offset into the current superevent + ** m_stack - Our stack number. + ** The stack maps. + ** + ** We are actually going to iterate over all modules unless we run out of data first. + */ +void +CStackUnpacker::unpackEvent(CEvent& rEvent) +{ + // The stackmap command contains data structures that map the event parameters to + // parameter ids in the rEvent: - // Burn up any remaining 0xfff's at the end of the event: - - while(offset < event.size()) { - if (event[offset] == 0xffff) { - offset++; + try { + const CStackMapCommand::stackMap& myMap(CStackMapCommand::getMap(m_stack)); + + // Give each module a chance: + + size_t offset = m_offset; + for (int i =0; i < myMap.size(); i++) { + CParamMapCommand::AdcMapping* pMap = myMap[i]; + int moduleType = pMap->type; + CModuleUnpacker* pUnpacker = m_unpackers[moduleType]; + m_offset = (*pUnpacker)(rEvent, m_event, m_offset, pMap); + + // Done if we finished with the available data too: + + + + if(m_offset >= (m_size - 1)) break; } - else { - break; + if (offset == m_offset) { + cerr << "Processing the event did not result in progress through the buffer\n"; + cerr << "skipping on to the next superevent\n"; + m_offset = m_size; } } + catch(string msg) { + cerr << "Event unpacker found an unrecoverable problem: " + << msg << endl; + cerr << "skipping on to the next superevent\n"; + m_offset = m_size; + } - // Something went wrong if we didn't burn up the entire event: +} - if (offset != event.size()) { - cerr << "**WARNING** Event not entirely decoded by unpackers\n"; - cerr << " Event will not be histogrammed, proceeding with next event\n"; - return kfFALSE; - } - - - return kfTRUE; -} ////////////////////////////////////////////////////////////////////////////////// // Utilties @@ -170,6 +216,9 @@ bool done = false; int stackId = -1; size_t totalSize = 0; + uint16_t datum; + event.clear(); + while(!done) { // Decode the header: @@ -186,12 +235,19 @@ // Append the fragment to the event vector for (int i=0; i < fragmentSize; i++) { - uint16_t datum = *p; ++p; + datum = *p; ++p; event.push_back(datum); } totalSize += fragmentSize; // Words in the fragment... } - + + // The event is terminated with the 0xffffffff of the BERR.. + // remove that from the assembled event: + + if (datum == 0xffff) { + event.pop_back(); + event.pop_back(); + } result.s_stackNumber = stackId; result.s_stackSize = totalSize; return result; Modified: branches/LLNLMadcChainSpecTcl/CStackUnpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CStackUnpacker.h 2010-08-18 12:28:05 UTC (rev 1709) +++ branches/LLNLMadcChainSpecTcl/CStackUnpacker.h 2010-08-19 09:48:03 UTC (rev 1710) @@ -83,10 +83,26 @@ size_t s_stackSize; } StackInfo; + typedef enum _UnpackState { + Initial, + Internal, + } UnpackState; + // static data: static CModuleUnpacker* m_unpackers[]; + + // Per object data (though likely there's only one instance of that). + // These data keep track of the fact that we are dealing with megaevents + // of multiple singles events. + + UnpackState m_state; // Unpacking state (need data or processing data) + std::vector<uint16_t> m_event; // mega event data. + size_t m_size; // Total size of the mega-event in words. + size_t m_offset; // Current location in the mega event. + int m_stack; // stack nmber. + // Canonicals: public: CStackUnpacker(); @@ -105,6 +121,7 @@ // Utilties: private: + void unpackEvent(CEvent& rEvent); static StackInfo assembleEvent(TranslatorPointer<UShort_t>& p, std::vector<uint16_t>& event); }; Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-08-18 12:28:05 UTC (rev 1709) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-08-19 09:48:03 UTC (rev 1710) @@ -1,281 +1,18 @@ -# /* -# GNU GENERAL PUBLIC LICENSE -# Version 2, June 1991 -# -# Copyright (C) 1989, 1991 Free Software Foundation, Inc. -# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# Everyone is permitted to copy and distribute verbatim copies -# of this license document, but changing it is not allowed. -# -# Preamble -# -# The licenses for most software are designed to take away your -# freedom to share and change it. By contrast, the GNU General Public -# License is intended to guarantee your freedom to share and change free -# software--to make sure the software is free for all its users. This -# General Public License applies to most of the Free Software -# Foundation's software and to any other program whose authors commit to -# using it. (Some other Free Software Foundation software is covered by -# the GNU Library General Public License instead.) You can apply it to -# your programs, too. -# -# When we speak of free software, we are referring to freedom, not -# price. Our General Public Licenses are designed to make sure that you -# have the freedom to distribute copies of free software (and charge for -# this service if you wish), that you receive source code or can get it -# if you want it, that you can change the software or use pieces of it -# in new free programs; and that you know you can do these things. -# -# To protect your rights, we need to make restrictions that forbid -# anyone to deny you these rights or to ask you to surrender the rights. -# These restrictions translate to certain responsibilities for you if you -# distribute copies of the software, or if you modify it. -# -# For example, if you distribute copies of such a program, whether -# gratis or for a fee, you must give the recipients all the rights that -# you have. You must make sure that they, too, receive or can get the -# source code. And you must show them these terms so they know their -# rights. -# -# We protect your rights with two steps: (1) copyright the software, and -# (2) offer you this license which gives you legal permission to copy, -# distribute and/or modify the software. -# -# Also, for each author's protection and ours, we want to make certain -# that everyone understands that there is no warranty for this free -# software. If the software is modified by someone else and passed on, we -# want its recipients to know that what they have is not the original, so -# that any problems introduced by others will not reflect on the original -# authors' reputations. -# -# Finally, any free program is threatened constantly by software -# patents. We wish to avoid the danger that redistributors of a free -# program will individually obtain patent licenses, in effect making the -# program proprietary. To prevent this, we have made it clear that any -# patent must be licensed for everyone's free use or not licensed at all. -# -# The precise terms and conditions for copying, distribution and -# modification follow. -# -# GNU GENERAL PUBLIC LICENSE -# TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION -# -# 0. This License applies to any program or other work which contains -# a notice placed by the copyright holder saying it may be distributed -# under the terms of this General Public License. The "Program", below, -# refers to any such program or work, and a "work based on the Program" -# means either the Program or any derivative work under copyright law: -# that is to say, a work containing the Program or a portion of it, -# either verbatim or with modifications and/or translated into another -# language. (Hereinafter, translation is included without limitation in -# the term "modification".) Each licensee is addressed as "you". -# -# Activities other than copying, distribution and modification are not -# covered by this License; they are outside its scope. The act of -# running the Program is not restricted, and the output from the Program -# is covered only if its contents constitute a work based on the -# Program (independent of having been made by running the Program). -# Whether that is true depends on what the Program does. -# -# 1. You may copy and distribute verbatim copies of the Program's -# source code as you receive it, in any medium, provided that you -# conspicuously and appropriately publish on each copy an appropriate -# copyright notice and disclaimer of warranty; keep intact all the -# notices that refer to this License and to the absence of any warranty; -# and give any other recipients of the Program a copy of this License -# along with the Program. -# -# You may charge a fee for the physical act of transferring a copy, and -# you may at your option offer warranty protection in exchange for a fee. -# -# 2. You may modify your copy or copies of the Program or any portion -# of it, thus forming a work based on the Program, and copy and -# distribute such modifications or work under the terms of Section 1 -# above, provided that you also meet all of these conditions: -# -# a) You must cause the modified files to carry prominent notices -# stating that you changed the files and the date of any change. -# -# b) You must cause any work that you distribute or publish, that in -# whole or in part contains or is derived from the Program or any -# part thereof, to be licensed as a whole at no charge to all third -# parties under the terms of this License. -# -# c) If the modified program normally reads commands interactively -# when run, you must cause it, when started running for such -# interactive use in the most ordinary way, to print or display an -# announcement including an appropriate copyright notice and a -# notice that there is no warranty (or else, saying that you provide -# a warranty) and that users may redistribute the program under -# these conditions, and telling the user how to view a copy of this -# License. (Exception: if the Program itself is interactive but -# does not normally print such an announcement, your work based on -# the Program is not required to print an announcement.) -# -# These requirements apply to the modified work as a whole. If -# identifiable sections of that work are not derived from the Program, -# and can be reasonably considered independent and separate works in -# themselves, then this License, and its terms, do not apply to those -# sections when you distribute them as separate works. But when you -# distribute the same sections as part of a whole which is a work based -# on the Program, the distribution of the whole must be on the terms of -# this License, whose permissions for other licensees extend to the -# entire whole, and thus to each and every part regardless of who wrote it. -# -# Thus, it is not the intent of this section to claim rights or contest -# your rights to work written entirely by you; rather, the intent is to -# exercise the right to control the distribution of derivative or -# collective works based on the Program. -# -# In addition, mere aggregation of another work not based on the Program -# with the Program (or with a work based on the Program) on a volume of -# a storage or distribution medium does not bring the other work under -# the scope of this License. -# -# 3. You may copy and distribute the Program (or a work based on it, -# under Section 2) in object code or executable form under the terms of -# Sections 1 and 2 above provided that you also do one of the following: -# -# a) Accompany it with the complete corresponding machine-readable -# source code, which must be distributed under the terms of Sections -# 1 and 2 above on a medium customarily used for software interchange; or, -# -# b) Accompany it with a written offer, valid for at least three -# years, to give any third party, for a charge no more than your -# cost of physically performing source distribution, a complete -# machine-readable copy of the corresponding source code, to be -# distributed under the terms of Sections 1 and 2 above on a medium -# customarily used for software interchange; or, -# -# c) Accompany it with the information you received as to the offer -# to distribute corresponding source code. (This alternative is -# allowed only for noncommercial distribution and only if you -# received the program in object code or executable form with such -# an offer, in accord with Subsection b above.) -# -# The source code for a work means the preferred form of the work for -# making modifications to it. For an executable work, complete source -# code means all the source code for all modules it contains, plus any -# associated interface definition files, plus the scripts used to -# control compilation and installation of the executable. However, as a -# special exception, the source code distributed need not include -# anything that is normally distributed (in either source or binary -# form) with the major components (compiler, kernel, and so on) of the -# operating system on which the executable runs, unless that component -# itself accompanies the executable. -# -# If distribution of executable or object code is made by offering -# access to copy from a designated place, then offering equivalent -# access to copy the source code from the same place counts as -# distribution of the source code, even though third parties are not -# compelled to copy the source along with the object code. -# -# 4. You may not copy, modify, sublicense, or distribute the Program -# except as expressly provided under this License. Any attempt -# otherwise to copy, modify, sublicense or distribute the Program is -# void, and will automatically terminate your rights under this License. -# However, parties who have received copies, or rights, from you under -# this License will not have their licenses terminated so long as such -# parties remain in full compliance. -# -# 5. You are not required to accept this License, since you have not -# signed it. However, nothing else grants you permission to modify or -# distribute the Program or its derivative works. These actions are -# prohibited by law if you do not accept this License. Therefore, by -# modifying or distributing the Program (or any work based on the -# Program), you indicate your acceptance of this License to do so, and -# all its terms and conditions for copying, distributing or modifying -# the Program or works based on it. -# -# 6. Each time you redistribute the Program (or any work based on the -# Program), the recipient automatically receives a license from the -# original licensor to copy, distribute or modify the Program subject to -# these terms and conditions. You may not impose any further -# restrictions on the recipients' exercise of the rights granted herein. -# You are not responsible for enforcing compliance by third parties to -# this License. -# -# 7. If, as a consequence of a court judgment or allegation of patent -# infringement or for any other reason (not limited to patent issues), -# conditions are imposed on you (whether by court order, agreement or -# otherwise) that contradict the conditions of this License, they do not -# excuse you from the conditions of this License. If you cannot -# distribute so as to satisfy simultaneously your obligations under this -# License and any other pertinent obligations, then as a consequence you -# may not distribute the Program at all. For example, if a patent -# license would not permit royalty-free redistribution of the Program by -# all those who receive copies directly or indirectly through you, then -# the only way you could satisfy both it and this License would be to -# refrain entirely from distribution of the Program. -# -# If any portion of this section is held invalid or unenforceable under -# any particular circumstance, the balance of the section is intended to -# apply and the section as a whole is intended to apply in other -# circumstances. -# -# It is not the purpose of this section to induce you to infringe any -# patents or other property right claims or to contest validity of any -# such claims; this section has the sole purpose of protecting the -# integrity of the free software distribution system, which is -# implemented by public license practices. Many people have made -# generous contributions to the wide range of software distributed -# through that system in reliance on consistent application of that -# system; it is up to the author/donor to decide if he or she is willing -# to distribute software through any other system and a licensee cannot -# impose that choice. -# -# This section is intended to make thoroughly clear what is believed to -# be a consequence of the rest of this License. -# -# 8. If the distribution and/or use of the Program is restricted in -# certain countries either by patents or by copyrighted interfaces, the -# original copyright holder who places the Program under this License -# may add an explicit geographical distribution limitation excluding -# those countries, so that distribution is permitted only in or among -# countries not thus excluded. In such case, this License incorporates -# the limitation as if written in the body of this License. -# -# 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. -# -# Each version is given a distinguishing version number. If the Program -# specifies a version number of this License which applies to it and "any -# later version", you have the option of following the terms and conditions -# either of that version or of any later version published by the Free Software -# Foundation. If the Program does not specify a version number of this License, -# you may choose any version ever published by the Free Software Foundation. -# -# 10. If you wish to incorporate parts of the Program into other free -# programs whose distribution conditions are different, write to the author to -# ask for permission. For software which is copyrighted by the Free Software -# Foundation, write to the Free Software Foundation; we sometimes make -# exceptions for this. Our decision will be guided by the two goals of -# preserving the free status of all derivatives of our free software and of -# promoting the sharing and reuse of software generally. -# -# NO WARRANTY -# -# 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR -# THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -# OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE -# THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, -# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -# FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND -# PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, -# YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. -# -# 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -# WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -# REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -# INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -# OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO -# LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR -# THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -# EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -# DAMAGES. -# -# END OF TERMS AND CONDITIONS -# */ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + # (C) Copyright Michigan State University 2014, All rights reserved # # @@ -321,8 +58,25 @@ puts "Sourcing histogram config file" -source [file join ~ config spectclSetup.tcl] +set here [file dirname [info script]] +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 + + puts "spectrum 2d.$enum 2 [list $ename $tname] {{0 8192 512} {0 8192 512}}" + spectrum 2d.$enum 2 [list $ename $tname] {{0 8192 512} {0 8192 512}}} + +} + +sbind -all + .gui.b update \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl/configFile.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/configFile.tcl 2010-08-18 12:28:05 UTC (rev 1709) +++ branches/LLNLMadcChainSpecTcl/configFile.tcl 2010-08-19 09:48:03 UTC (rev 1710) @@ -315,25 +315,45 @@ } - +#-------------------------------------------------------------- +# +# 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] - set modIndex [lsearch -exact $args "-modules"] - if {$modIndex != -1} { - incr modIndex - set ::chainOrder($name) [lindex $args $modIndex] - } + chain $name $args + } +#-------------------------------------------------------------- +# +# 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 Modified: branches/LLNLMadcChainSpecTcl/spectclSetup.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/spectclSetup.tcl 2010-08-18 12:28:05 UTC (rev 1709) +++ branches/LLNLMadcChainSpecTcl/spectclSetup.tcl 2010-08-19 09:48:03 UTC (rev 1710) @@ -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" } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-08-19 10:57:21
|
Revision: 1711 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1711&view=rev Author: ron-fox Date: 2010-08-19 10:57:15 +0000 (Thu, 19 Aug 2010) Log Message: ----------- Looks like all is working again. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2010-08-19 09:48:03 UTC (rev 1710) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2010-08-19 10:57:15 UTC (rev 1711) @@ -94,6 +94,7 @@ CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); + RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); // RegisterEventProcessor(*(new CRateEventProcessor), "rate-stripchart"); } @@ -214,6 +215,11 @@ { CTclGrammerApp::SelectDisplayer(nDisplaySize, rHistogrammer); + CXamineEventHandler* pEventHandler = getXamineEvents(); + CButtonBoxSetup* pSetup = new CButtonBoxSetup; + pEventHandler->addRestartHandler(*pSetup); + + (*pSetup)(); // Get it set up the first time. @@ -299,8 +305,9 @@ CMySpecTclApp::AddCommands(CTCLInterpreter& rInterp) { CTclGrammerApp::AddCommands(rInterp); - new CParamMapCommand(rInterp); - new CStackMapCommand(rInterp); + new CParamMapCommand(rInterp); // Map parameters for a stack. + new CStackMapCommand(rInterp); // Map stacks -> parameters. + new CRateCommand(rInterp); // Allow computation of spectrum increment rates. } Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-08-19 09:48:03 UTC (rev 1710) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-08-19 10:57:15 UTC (rev 1711) @@ -72,11 +72,53 @@ set enum [lindex [split $ename .] 1] set tname t.$enum - puts "spectrum 2d.$enum 2 [list $ename $tname] {{0 8192 512} {0 8192 512}}" - spectrum 2d.$enum 2 [list $ename $tname] {{0 8192 512} {0 8192 512}}} - + spectrum 2d.$enum 2 [list $ename $tname] {{0 8192 512} {0 8192 512}} } sbind -all -.gui.b update \ No newline at end of file +.gui.b update + +# +# Integrate the scaler display: +# +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 " +set here [file dirname [info script]] +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" + +# +# Load the figure of merit tcl code: +# +puts -nownewline "Loading FOM Tcl Scripts " +source [file join $here fom.tcl] +puts Done \ 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...> - 2010-09-15 10:16:48
|
Revision: 1714 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1714&view=rev Author: ron-fox Date: 2010-09-15 10:16:41 +0000 (Wed, 15 Sep 2010) Log Message: ----------- Initial version as is after final testing/acceptance. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CRateCommand.cpp branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp branches/LLNLMadcChainSpecTcl/CRateProcessor.h branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl/ratesGui.tcl branches/LLNLMadcChainSpecTcl/spectclSetup.tcl Modified: branches/LLNLMadcChainSpecTcl/CRateCommand.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CRateCommand.cpp 2010-09-06 09:30:07 UTC (rev 1713) +++ branches/LLNLMadcChainSpecTcl/CRateCommand.cpp 2010-09-15 10:16:41 UTC (rev 1714) @@ -22,7 +22,7 @@ #include "CRateList.h" #include "CRateProcessor.h" - +#include <iostream> #include <stdint.h> #ifdef HAVE_STD_NAMESPACE @@ -263,8 +263,13 @@ result += element; + + i++; } + string sresult = result; + // cerr << "Rate list returning '" << sresult << "'\n"; + interp.setResult(result); return TCL_OK; } Modified: branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp 2010-09-06 09:30:07 UTC (rev 1713) +++ branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp 2010-09-15 10:16:41 UTC (rev 1714) @@ -108,7 +108,7 @@ /*! Return the total counts value. */ -uint64_t +uint32_t CRateProcessor::getTotals() const { return m_totalCounts; @@ -116,7 +116,7 @@ /*! Return the increments value. */ -uint64_t +uint32_t CRateProcessor::getIncrements() const { return m_increments; @@ -179,7 +179,7 @@ // Now sum based on the spectrum dimensionality: UInt_t numDims = m_pSpectrum->Dimensionality(); - uint64_t sum; + uint32_t sum; if (numDims == 1) { sum = sum1d(); @@ -252,11 +252,11 @@ } /* Update the rates for a 1-d spectrum. */ -uint64_t +uint32_t CRateProcessor::sum1d() { UInt_t dim = m_pSpectrum->Dimension(0); - uint64_t sum = 0; + uint32_t sum = 0; for(UInt_t i =0; i < dim; i++) { sum += (*m_pSpectrum)[&i]; @@ -265,12 +265,12 @@ } /* Update rates for 2-d spectrum */ -uint64_t +uint32_t CRateProcessor::sum2d() { UInt_t dimx = m_pSpectrum->Dimension(0); UInt_t dimy = m_pSpectrum->Dimension(1); - uint64_t sum = 0; + uint32_t sum = 0; for (int y = 0; y < dimy; y++) { for(int x = 0; x < dimx; x++) { UInt_t indices[2]; Modified: branches/LLNLMadcChainSpecTcl/CRateProcessor.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CRateProcessor.h 2010-09-06 09:30:07 UTC (rev 1713) +++ branches/LLNLMadcChainSpecTcl/CRateProcessor.h 2010-09-15 10:16:41 UTC (rev 1714) @@ -53,8 +53,8 @@ { private: CSpectrum* m_pSpectrum; - uint64_t m_totalCounts; - uint64_t m_increments; + uint32_t m_totalCounts; + uint32_t m_increments; public: // Construtors and cannonicals. @@ -69,8 +69,8 @@ // Selectors CSpectrum* getSpectrum(); - uint64_t getTotals() const; - uint64_t getIncrements() const; + uint32_t getTotals() const; + uint32_t getIncrements() const; // Virtual function overrides: @@ -83,8 +83,8 @@ void disable(); void adjustSpectrum(); void clear(); - uint64_t sum1d(); - uint64_t sum2d(); + uint32_t sum1d(); + uint32_t sum2d(); }; Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-09-06 09:30:07 UTC (rev 1713) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-09-15 10:16:41 UTC (rev 1714) @@ -52,13 +52,15 @@ set llnlSpecTcl [file dirname $argv0] lappend auto_path $llnlSpecTcl +set here $llnlSpecTcl + puts "done" tk appname SpecTcl-[exec hostname]-[pid] puts "Sourcing histogram config file" -set here [file dirname [info script]] + source [file join $here spectclSetup.tcl] puts "done" @@ -72,15 +74,16 @@ set enum [lindex [split $ename .] 1] set tname t.$enum - spectrum 2d.$enum 2 [list $ename $tname] {{0 8192 512} {0 8192 512}} + spectrum 2d.$enum 2 [list $ename $tname] {{0 4095 512} {0 4095 512}} } + sbind -all .gui.b update # -# Integrate the scaler display: + # puts -nonewline "Starting scaler display.." set scalerWin [toplevel .scalers] @@ -95,7 +98,7 @@ # puts -nonewline "Adding rates GUI " -set here [file dirname [info script]] +puts "Loading scripts from $here" source [file join $here ratesGui.tcl] puts Done. @@ -119,6 +122,6 @@ # # Load the figure of merit tcl code: # -puts -nownewline "Loading FOM Tcl Scripts " +puts -nonewline "Loading FOM Tcl Scripts " source [file join $here fom.tcl] puts Done \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl/ratesGui.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/ratesGui.tcl 2010-09-06 09:30:07 UTC (rev 1713) +++ branches/LLNLMadcChainSpecTcl/ratesGui.tcl 2010-09-15 10:16:41 UTC (rev 1714) @@ -558,7 +558,6 @@ set rates [expr $rates*$LastSequence/$BuffersAnalyzed] set totals [expr $totals*$LastSequence/$BuffersAnalyzed] - set totalCounts [expr $totalCounts + $totals] set totalRates [expr $totalRates + $rates] Modified: branches/LLNLMadcChainSpecTcl/spectclSetup.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/spectclSetup.tcl 2010-09-06 09:30:07 UTC (rev 1713) +++ branches/LLNLMadcChainSpecTcl/spectclSetup.tcl 2010-09-15 10:16:41 UTC (rev 1714) @@ -69,7 +69,7 @@ set channelCount($typeCAEN) 4096 set channelCount($typeHYTEC) 8192 -set channelCount($typeMADC32) 4096; # Currently only 12 chans. +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. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-10-15 11:11:10
|
Revision: 1721 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1721&view=rev Author: ron-fox Date: 2010-10-15 11:11:04 +0000 (Fri, 15 Oct 2010) Log Message: ----------- First reasonable results from multiplicity software. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h Modified: branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp 2010-09-26 13:48:49 UTC (rev 1720) +++ branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp 2010-10-15 11:11:04 UTC (rev 1721) @@ -15,6 +15,7 @@ */ #include <config.h> #include "CMADC32Unpacker.h" +#include <TreeParameter.h> #include <Event.h> #include <stdint.h> @@ -61,10 +62,12 @@ // /*! - Constrution is a no-op. + Constrution just initializes the tree parameter that lets us find the timestamp. */ -CMADC32Unpacker::CMADC32Unpacker() +CMADC32Unpacker::CMADC32Unpacker() : + m_timestamp(*(new CTreeParameter("timestamp"))) { + } /*! @@ -151,18 +154,29 @@ longsRead++; offset += 2; } - // The datum should be the trailer.. verify this.. If so, - // then save the count field ans parameter 32. + // The timestamp should be in the trailer. If so then + // set it. There will only be a single tiemstamp per event as we ensure that we + // only analyze one module/event in each superevent by breaking out at the first non-event + // Events that don't have a trailer won't get a timestamp. uint32_t timestamp; if (((datum & ALL_TYPEMASK) >> ALL_TYPESHFT) == TYPE_TRAILER) { timestamp = datum & TRAILER_COUNTMASK; + m_timestamp = timestamp; } else { // Sometimes I see wonky events...missing trailers... data with the top 1/2 filled with only 1's. - // I'm going to pop an exeption out so that the caller can move on to the next event/supervevent + // I'm going to pop an exeption out so that the caller can move on to the next event/supervevent, + // If this is not just another header. If it's another header I'll assume the trailer is just + // missing. - throw string("MADC Unpacker did not see a trailer at the end of an MADC32 event"); + if ((datum & ALL_TYPEMASK >> ALL_TYPESHFT) == TYPE_HEADER) { + return offset - 2; // Put the header back in the event for then ext call... + } + else { + + throw string("MADC Unpacker did not see a trailer at the end of an MADC32 event"); + } } return offset; } Modified: branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h 2010-09-26 13:48:49 UTC (rev 1720) +++ branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h 2010-10-15 11:11:04 UTC (rev 1721) @@ -21,7 +21,7 @@ #include "CModuleUnpacker.h" #endif - +class CTreeParameter; /*! This module is responsible for unpacking the Mesytec MADC-32 32 channel ADC. These modules have a virtual slot number. It is therefore possible to @@ -37,6 +37,8 @@ */ class CMADC32Unpacker : public CModuleUnpacker { +private: + CTreeParameter& m_timestamp; // Parameter holding the timestamp. // canonicals: public: CMADC32Unpacker(); Added: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-10-15 11:11:04 UTC (rev 1721) @@ -0,0 +1,665 @@ +/* + 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 "CMultiplicity.h" +#include <SpecTcl.h> +#include <TCLInterpreter.h> +#include <fstream> +#include <string> +#include <stdlib.h> +#include <unistd.h> +#include <time.h> +#include <sys/stat.h> +#include <sys/types.h> + +#include <fstream> +#include <stdio.h> + +using namespace std; + +/*! + Construction builds the tree parameters and what we can of the CTCLVariable. +*/ +CMultiplicity::CMultiplicity() : + m_bins("multiplicity.bins", 512, "bins"), + m_minTime("multiplicity.mintime", 100, "ns"), + m_frequency("multiplicity.frequency", 16.0e3, "KHz"), + m_cycleCount("multiplicity.cycleCount", 100, "cycles"), + m_ROIS("multiplicity.ROIS", false), + m_timestamp("timestamp"), + m_tZeroSet(false), + m_tLast(0) +{ + CTreeParameter::BindParameters(); // Make sure timestamp is bound (maybe I don't need this)? +} + +/*! + When we are attached to SpecTcl we need to ensure that + 1. The Tree variables get bound so that + 2. We can load them from the saved file if it exists. + 3. We can establish a write trace to maintain the saved file on changes. + + @param rAnalyzer references the TCL analyzer that is associated with the anaklysis case. + @return Bool_t + @retval kfTRUE - Success. + @retval kfFALSE - Some error occured. +*/ +Bool_t +CMultiplicity::OnAttach(CAnalyzer& rAnalyzer) +{ + try { + // Bind my tree variables so I can do what follows: + + SpecTcl* pApi = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = pApi->getInterpreter(); + CTreeVariable::BindVariables(*pInterp); + + m_ROIS.Bind(*pInterp); + + readTreeVariables(*pInterp); + + establishTraces(*pInterp); + + return kfTRUE; + } + catch(...) { + std::cerr << "CMultiplicity::OnAttach exception caught\n"; + return kfFALSE; // Report errors as attach failure for now. + } +} + +/*! + - Initialize the state system so that we are awaiting the t=0 timestamp. + - Pre-compute the ticks/bin + - Pre-compute the ticks per cycle. + - Obtain the gate object pointers... yelling about any that don't really exist. + +Parametrs are ignored but: + @return Bool_t + @retval kfTRUE - This unconditionally works. + +*/ +Bool_t +CMultiplicity:: OnBegin(CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + m_tZeroSet = false; + + m_ticksPerBin = (m_bins * m_frequency)/1.0e6; + m_ticksPerCycle = m_ticksPerBin * m_bins; + + SpecTcl* pApi = SpecTcl::getInstance(); + + bool done = false; + int i = 0; + while(!done) { + char index[100]; + sprintf(index, "%d", i); + const char* pGateName = m_ROIS.Get(TCL_GLOBAL_ONLY, index); + if (pGateName) { + CGateContainer* pGate = pApi->FindGate(string(pGateName)); + if (!pGate) { + cerr << "Unable to locate ROI named " << pGateName << " Ignored for multiplicity calculations\n"; + } + else { + m_Gates.push_back(pGate); + } + } + else { + done = true; // no more ROI names. + } + i++; + } + return kfTRUE; +} + +/*! + Handle end of run buffers. In this case we need to + - Write out the multiplicity data in the form required by Phil, + - release the resources allocated by the initialization/accumulatioon + of these histograms. + + @param rAnalyzer - ignored. + @param rBuffer - reference to the buffer decoder. This is used to generate the filename. + + @return Bool_t + @retval kfTRUE unconditionally as there's no reason I can think of we should + end the pipeline if we have errors. +*/ +Bool_t +CMultiplicity::OnEnd(CAnalyzer& rAnalyzer, + CBufferDecoder& rBuffer) +{ + + // Get the output filename. + + unsigned int run = rBuffer.getRun(); + string title = rBuffer.getTitle(); + string filename = multiplicityFilename(run); + + // Write the data + + writeMultiplicityData(filename, title); + + // Cleanup for next time around: + + m_Gates.clear(); // Need to repopulate this on the next begin run. + for (int i = 0; i < m_Multiplicities.size(); i++) { + free(m_Multiplicities[i]); + } + m_Multiplicities.clear(); + +} + +/*! + Process other buffer types... we are going to process a special user define buffer + that indicates skips in time. +*/ +Bool_t +CMultiplicity::OnOther(UInt_t nType, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + //TODO: The whole buffer skip thingy. + + +} + +/*! + Process an Event; If no events have been seen, the base timestamp must be set. + The event structure is such that there will always be a timestamp for an event. + The gates in m_Gates are evaluated and the trues are counted to give the number of neutrons. + The timestamp is converted into a cycle number and bin, and the appropriate bin in the histogram + is incremented appropriately (allocated if needed). + + @param pEvent - Raw event -- ignored. + @param rEvent - Unpacked event. This is what we use under the assumption a prior event processor + has already unpacked the data. + + All other parameters are ignored. + + @return Bool_t + @retval kfTRUE - Success + @retval kfFALSE - Failure... this will typically be due to an inability to allocated storage. + +*/ +Bool_t +CMultiplicity::operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder) +{ + if (m_timestamp.isValid()) { // In case there's un-stamped or empty event. + + // Figure out the stamp relative to the first event and then calculate the + // cycle number/bin. + + double stamp = m_timestamp; + + if(!m_tZeroSet) { + m_tZero = stamp; + m_tZeroSet = true; + } + stamp = stamp - m_tZero; // TODO: Deal with timestamp wraps. + m_tLast = stamp; // Last timestamp received. + + int cycle = static_cast<int>(stamp/m_ticksPerCycle); // Cycle number. + int bin = static_cast<int>(stamp/m_ticksPerBin); // Absolute bin number. + bin -= cycle*m_bins; // Bin relative to cycle. + + // The neutron multiplicity is just the number of gates that are true for this + // event: + + int multiplicity = 0; + for (int i =0; i < m_Gates.size(); i++) { + CGateContainer* pGate = m_Gates[i]; + if ( (*pGate)->inGate(rEvent)) { + multiplicity++; + } + + } + if (cycle >= m_Multiplicities.size()) { + expandMultiplicities(cycle); + } + uint32_t* pCycleData = m_Multiplicities[cycle]; + pCycleData[bin] += multiplicity; + + + } + return kfTRUE; + +} +////////////////////////////////////////////////////////////////////////////// +// +// Utilities: + +/** + * Save the values of the tree variables in a file. + * The variables are written as a Tcl script so this really just involves interpreting that script. + * Notes: + * - We're going to assume the presence of the HOME environement variable. + * - The file is hard coded as $HOME/.cycles + * - Errors are thrown as exceptions. + */ + void + CMultiplicity::saveTreeVariables() +{ + double treeValue; + std::string gateName; + std::string filename = cycleFilename(); + + // Open the file and throw on error (e.g. .cycles protected or HOME not writable??). + + std::fstream cyclesFile(filename.c_str(), std::fstream::out); + if (cyclesFile.fail()) { + throw "Unable to open ~/.cycles file\n"; + } + + // Start writing: + + // Tree variables: + + cyclesFile << "set multiplicity.bins " << m_bins.getValue() << std::endl; + 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; + + // The gate names also get written to be complete. + // The assumption is that multiplicity.ROIS is an array with contiguous integer indices + // e.g. 0,1...last...we're going to keep on iterating on the indices until we dont' get + // a value. This allows the user to define an arbitrary number of neutron gates in the case that + // the detector array grows or shrinks. + // + int index = 0; // Starting index. + char cIndex[100]; // textual version of index. + bool done = false; + + // prior to writing the variables the array is unset so that there are no lingering values in case + // the array shrinks: + + cyclesFile << "catch {unset multiplicity.ROIS}\n"; + + while(!done) { + sprintf(cIndex, "%d", index); + const char* value = m_ROIS.Get(TCL_GLOBAL_ONLY, cIndex); + if(value) { + cyclesFile << "set multiplicity.ROIS(" << cIndex << ") " << value << std::endl; + } + else { + done = true; + } + index++; + } + // Close the file: + + cyclesFile.close(); + +} +/** + * Read the tree variables, and gate names from file. + * - If there is no ~/.cycles file, this is a no-op. + * - The cycles file is a Tcl script it is just interpreted. + * - Any errors in interpreting the cycles file are passed to the caller as exceptions. + * @param rInter - Reference to the object encapsulated Tcl interpreter. + */ +void +CMultiplicity::readTreeVariables(CTCLInterpreter& rInterp) +{ + std::string cyclesFile = cycleFilename(); + if (!access(cyclesFile.c_str(), R_OK)) { + + rInterp.EvalFile(cyclesFile); + } + +} + +/** + * Establishes the write traces on our variables. A single write trace will do because + * the only thing it will do is establish object context and invoke saveTreeVariables. + */ +void +CMultiplicity:: establishTraces(CTCLInterpreter& rInterp) +{ + Tcl_Interp* pInterp = rInterp.getInterpreter(); + int flags = TCL_TRACE_WRITES | TCL_GLOBAL_ONLY; + Tcl_TraceVar(pInterp, "multiplicity.bins", flags, CMultiplicity::varModified, this); + Tcl_TraceVar(pInterp, "multiplicity.mintime", flags, CMultiplicity::varModified, this); + Tcl_TraceVar(pInterp, "multiplicity.frequency", flags, CMultiplicity::varModified, this); + Tcl_TraceVar(pInterp, "multiplicity.cyclecount", flags, CMultiplicity::varModified, this); + Tcl_TraceVar(pInterp, "multiplicity.ROIS", flags, CMultiplicity::varModified, this); +} + +/** + * Called when any write trace on the variable is called. If the input flags are not indicating + * The interpreter or trace is being destroyed, the variables will be written to file. + * @param clientData - Actually a pointer to a CMultiplicity object. + * @param interp - Pointer to the Tcl_Interp of the interpreter in which the set happened. + * @param name1 - Name of the variable being modified. + * @param name2 - If the variable is an array, index of the variable being modified. + * @param flags - Trace flags, where TCL_TRACE_DESTROYED and TCL_INTERP_DESTROYED are important to us. + */ +char* +CMultiplicity::varModified(ClientData clientData, + Tcl_Interp* pInterp, + const char* name1, + const char* name2, + int flags) + +{ + try { + CMultiplicity* pObject = reinterpret_cast<CMultiplicity*>(clientData); + pObject->saveTreeVariables(); + } + catch (...) { + return const_cast<char*>("Write to ~/.cycles failed\n"); + } + return reinterpret_cast<char*>(0); +} +/** + * Compute the name of the cycles . file. + * - If $HOME is not definedan exception is thrown. + */ +std::string +CMultiplicity::cycleFilename() +{ + std::string filename; + const char* pHome; + + // Construct and open the file the filename: + + pHome = getenv("HOME"); + if (!pHome) { + throw "HOME Env. variable does not exist!!!\n"; + } + filename = pHome; + filename += "/"; + filename += ".cycles"; + + return filename; +} +/** + * Called to expand the multiplicities histogram array so that the specified cycle can fit. + * @param cycle - The largest cycle the histograms must hold. + * Note: for now the histograms are just expanded large enough to hold the specified cycle + * rather than expanding ahead. The assumption is that the cycle time is such that, + * modulo skips, there will always be quite a few events in each cycle. + */ +void +CMultiplicity::expandMultiplicities(int cycle) +{ + while (m_Multiplicities.size() <= cycle) { + uint32_t* pCycle = reinterpret_cast<uint32_t*>(calloc(m_bins, sizeof(uint32_t))); + m_Multiplicities.push_back(pCycle); // TODO: Handle calloc failure. + } +} +/** + * Called to get the name of the multiplicity file. This will be stored in + * $HOME/multiplicitydata/run-%04d.multiplicity + * @param run - Run number of the run for which we need the filename. + * @return std::string + * @retval full, absolute path to the file. + */ +string +CMultiplicity::multiplicityFilename(int run) +{ + string result; + + // Figure out the directory path: + + const char* home = getenv("HOME"); + if (!home) { + home = "/tmp"; // This has to exist even if HOME does not. + } + result = home; + result += "/multiplicitydata/"; + + // Ensurethe directory exists: + + mkdir(result.c_str(), 0777); // let umask determine the permissions. TODO: handle mkdir failures. + + + // Figure out the filename, append it to the path and return the whole mess to the + // caller. + + char filename[100]; + sprintf(filename, "run-%04d.multiplicity", run); + result += filename; + + + return result; + +} +/** + * Write the multiplicity data to file in the format specified by LLNL + * This data consists of three sections, each written separately: + * - Header that describes the run conditions for the most part. + * - Summary that descdribes the average count rates for various chunks of information. + * - Counter data for each time width in a cycle. + * - Comment section (we'll figure out how to put the title in here. + * @param filename - Name of the file to write. + * @param comment - Comment string written at the bottom of the file. + */ +void +CMultiplicity::writeMultiplicityData(string filename, string comment) +{ + + std::fstream f(filename.c_str(), ios_base::out); // TODO: handle open failure. + + writeHeader(f, filename); + writeSummary(f); + for(int i = 0; i < m_bins; i++) { + writeGate(f, i); + } + writeComment(f, comment); +} + +/** + * Write the header of the multiplicity file. This consists of the data and time the + * data are being written, the file in whih the data are being written. + * The time/date used will be 'now'. + * @param f - fstream& that is the open file being written to. + * @param filename - Full path to the filename being written. + */ +void +CMultiplicity::writeHeader(std::fstream& f, string filename) +{ + // Figure out the date/time string: + + char timeStamp[100]; + struct tm brokenDownTime; + time_t epochTime; + + time(&epochTime); + localtime_r(&epochTime, &brokenDownTime); + + strftime(timeStamp, sizeof(timeStamp), + "%D, %R:%S, data stored", + &brokenDownTime); + + f << timeStamp <<endl; + f << filename << endl <<endl; + + +} +/** + * Write the summary part of the file header. + * - Mode line which is constant. + * - Start delay which is the number of microseconds represented by the' + * time of the first event. + * - Width of bins. + * - Number of bins in a cycle + * - Total number of cycles memorized. + * - Total run time in seconds + * - Average count rate for a full cycle. + * - Average count rate for the first 20 bins in a cycle. + * @param f - fstream& that is open on the output file. + */ +void +CMultiplicity::writeSummary(std::fstream& out) +{ + double startDelayms = m_tZero / m_frequency; + double runLengthms = (m_tLast - m_tZero) / m_frequency; + + // Now we can write the stuff that does not require looking through the multiplicity data: + + out << "**** Counter Setup ****\n"; + out << "mode = Neutron Generator-2A\t(Feynman Variance Analysis)\n"; + out << endl; + + out << startDelayms/1000.0 << ",\t\tstart delay (microseconds)\n"; + out << ((double)m_minTime/1000.0) << ",\t\tbin width (microseconds)\n"; + out << (int)((double)m_bins) << ",\t\tbins\n"; + out << m_Multiplicities.size() << ",\t\ttotal number of cyclees\n"; + out << endl; + + + double runLengthSec = runLengthms/1000.0; + double binWidthSec = m_minTime / 1.0e9; + + + // Incorrect text but correct computation: + + out << "Total Run Time = (Cycle Duration) X (Bin Width) X (Total Cycle Count) = Time in seconds\n"; + out << "Total Run Time = (" + << m_bins << ") X " + << binWidthSec << " X " + << m_Multiplicities.size() << " = " + << m_bins * binWidthSec * m_Multiplicities.size() << " seconds\n"; + out << "\n\n"; + + out << "Average count rate for the largest gate (" + << (m_bins*m_minTime)*1000 << " microsseconds)\n\n"; + + // Need to sum total counts and counts in first 20 bins + // There's an implicit assumption that there are at least 20 bins in a cycle. + + int totalCounts = 0; + int total20 = 0; + for (int i =0; i < m_Multiplicities.size(); i++) { + uint32_t* pCycle = m_Multiplicities[i]; + + // first 20bins + int j = 0; + for(; j < 20; j++) { + totalCounts += *pCycle; + total20 += *pCycle; + pCycle++; + } + for (; j < (int)m_bins; j++) { + totalCounts += *pCycle; + pCycle++; + } + } + double averageRate = (double)totalCounts/runLengthSec; + double averageRate20 = (double)total20/runLengthSec; + + out << "Average Count Rate = Total Count (gate " << (int)((double)m_bins) + << " / Total Run Time (sec)\n"; + out << "Average Count Rate = " << totalCounts << " / " + << (double)runLengthSec << " = " << averageRate << endl; + + out << "Average Count Rate for the twentieth gate ( " + << (double)m_minTime * 20.0 * 1000.0 << " microseconds)\n\n"; + + out << "Average Count Rate = Total Count (gate 20) / Total Run Time (sec)\n"; + out << "Average Count Rate = " << total20 << " / " + << (double)runLengthSec << " = " << averageRate20 << endl <<endl; + +} +/** + * Write the data for a gate to the output file. Each gate consists of + * a short header indicating how many multiplets we are writing, the gate number + * the gate-width (microseconds) + * this is followed by a table of multiplet number and occurence counts.. + * as well as the number of counts seen in that gate over the entire run. + * @param out - Reference to the fstream on which the data are to be written + * @param gate - Number of bins in the gate. + */ +void +CMultiplicity::writeGate(std::fstream& out, int gate) +{ + float gateWidthUsec = m_minTime * gate * 1000.0; // minTime is nsec but gateWidth is in microseconds. + + vector<int> cycleHistogram; + int totalCounts = 0; + + + // Compute the multiplicity histogram for this gate: + + for (int i =0; i < m_Multiplicities.size(); i++) { + uint32_t* pCycle = m_Multiplicities[i]; + + int gateSum = 0; + for (int j = 0; j < gate; j++) { + totalCounts += *pCycle; + gateSum += *pCycle++; + + } + if (cycleHistogram.size() <= gateSum) expandHistogram(cycleHistogram, gateSum); + cycleHistogram[gateSum]++; + } + int multipletCount = cycleHistogram.size(); + if (multipletCount < 40) multipletCount = 40; + + // Write the header: + + out << "***** Counter Data *****\n\n"; + out << multipletCount << ",\t\tTotal number of multplet entries\n"; + out << gate << ",\t\tgate\n"; + out << gateWidthUsec << ",\t\tgate-width (microseconds)\n\n"; + + + // write the data + + out << "Multiplet No.,\tData\n\n"; + for (int i =0; i < multipletCount; i++) { + int value = 0; + if (i < cycleHistogram.size()) value = cycleHistogram[i]; + + out << i << ",\t\t" << value << endl; + } + out << endl; + + // Write the sum: + + out << "Sum counts = \t" << totalCounts << endl << endl << endl; +} + +/** + * Expands a vector so that it can hold a specific max index. + * @param histogram - vector<int>& to expand. + * @param size - largest index the vector should hold when we are done. + * the vector is zero filled. + */ +void +CMultiplicity::expandHistogram(vector<int>& histogram, int size) +{ + while(size >= histogram.size()) histogram.push_back(0); +} +/** + * Write the comment part of the multiplicity output file. + * @param f - Reference to fstream open on output file. + * @param comment - Comment to write to the comment segment of the output file. + */ +void +CMultiplicity::writeComment(std::fstream& f, string comment) +{ + f << endl << endl << endl; + f << "*****User comments*****\n"; + f << "\t" << comment; + +} Added: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-10-15 11:11:04 UTC (rev 1721) @@ -0,0 +1,145 @@ +/* + 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 __CMULTIPLICITY_H +#define __CMULTIPLICITY_H + +#ifndef __EVENTPROCESSOR_H +#include <EventProcessor.h> +#endif + + +#ifndef __TREEPARAMETER_H +#include <TreeParameter.h> +#endif + +#ifndef __TCLVARIABLE_H +#include <TCLVariable.h> +#endif + + +#ifndef __TCL_H +#include <tcl.h> +#ifndef __TCL_H +#define __TCL_H +#endif +#endif + + +#ifndef __STL_VECTOR +#include <vector> +#ifndef __STL_VECTOR +#define __STL_VECTOR +#endif +#endif + +#ifndef __STL_STRING +#incldue <string> +#ifndef __STL_STRING +#define __STL_STRING +#endif +#endif + +#ifndef __CRTL_STDINT_H +#include <stdint.h> +#ifndef __CRTL_STDINT_H +#define __CRTL_STDINT_H +#endif +#endif + + +class CTCLInterpreter; +class CGateContainer; +class fstream; +/*! + 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. + 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. + - 'frequency' - (floating Khz) Frequency of the timestamp timebase pulser. + - 'cycleCount' - (integer) Number of cycles that must be accepted prior to allowing data to skip. + - 'ROIs' - Array of 24 strings that are the names of the gates that define what a neutron is. +*/ +class CMultiplicity : public CEventProcessor +{ + + // Local data: +private: + CTreeVariable m_bins; + CTreeVariable m_minTime; + CTreeVariable m_frequency; + CTreeVariable m_cycleCount; + CTCLVariable m_ROIS; + CTreeParameter m_timestamp; // The event parameter holding the timestamp. + std::vector<CGateContainer*> m_Gates; + bool m_tZeroSet; // True if first event seen to set time zero + int m_tZero; // Timestamp value at t==0. + int m_tLast; // Last timestamp. + double m_ticksPerBin; // Floating to avoid potential aliasing in case of non-conformalism + double m_ticksPerCycle; + std::vector<uint32_t*> m_Multiplicities; // Multiplicity histograms. + + + + + // Canonicals +public: + CMultiplicity(); + + // Interface definitions: +public: + virtual Bool_t OnAttach(CAnalyzer& rAnalyzer); // Called on registration. + virtual Bool_t OnBegin(CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Begin Run. + virtual Bool_t OnEnd(CAnalyzer& rAnalyzer, + CBufferDecoder& rBuffer); // End Run. + virtual Bool_t OnOther(UInt_t nType, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); // Unrecognized buftype. + + virtual Bool_t operator()(const Address_t pEvent, + CEvent& rEvent, + CAnalyzer& rAnalyzer, + CBufferDecoder& rDecoder); + // Utitities: +private: + void saveTreeVariables(); + void readTreeVariables(CTCLInterpreter& rInterp); + void establishTraces(CTCLInterpreter& rInterp); + void expandMultiplicities(int cycle); + void writeHeader(std::fstream& out, std::string filename); + void writeSummary(std::fstream& out); + void writeMultiplicityData(std::string filename, std::string comment); + void writeGate(std::fstream& f, int gate); + void writeComment(std::fstream& f, std::string comment); + + static char* varModified(ClientData clientData, + Tcl_Interp* pInterp, + const char* name1, + const char* name2, + int flags); + static std::string cycleFilename(); + static std::string multiplicityFilename(int run); + static void expandHistogram(std::vector<int>& histogram, int size); + +}; + + +#endif Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2010-09-26 13:48:49 UTC (rev 1720) +++ branches/LLNLMadcChainSpecTcl/Makefile 2010-10-15 11:11:04 UTC (rev 1721) @@ -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 CMultiplicity.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2010-09-26 13:48:49 UTC (rev 1720) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2010-10-15 11:11:04 UTC (rev 1721) @@ -33,6 +33,7 @@ #include "CParamMapCommand.h" #include "CStackMapCommand.h" #include "CStackUnpacker.h" +#include "CMultiplicity.h" #include "CRateCommand.h" #include "CRateEventProcessor.h" #include "CFitButton.h" @@ -94,7 +95,10 @@ CMySpecTclApp::CreateAnalysisPipeline(CAnalyzer& rAnalyzer) { RegisterEventProcessor(*(new CStackUnpacker), "adc-data"); + RegisterEventProcessor(*(new CMultiplicity), "Multiplicity"); RegisterEventProcessor(*(new CScalerProcessor), "Scalers"); + + // RegisterEventProcessor(*(new CRateEventProcessor), "rate-stripchart"); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-10-28 10:00:23
|
Revision: 1722 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1722&view=rev Author: ron-fox Date: 2010-10-28 10:00:16 +0000 (Thu, 28 Oct 2010) Log Message: ----------- First shot at getting the multiplicity output file right. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp branches/LLNLMadcChainSpecTcl/CRateProcessor.h branches/LLNLMadcChainSpecTcl/Makefile Modified: branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.cpp 2010-10-28 10:00:16 UTC (rev 1722) @@ -65,7 +65,9 @@ Constrution just initializes the tree parameter that lets us find the timestamp. */ CMADC32Unpacker::CMADC32Unpacker() : - m_timestamp(*(new CTreeParameter("timestamp"))) + m_timestamp(*(new CTreeParameter("timestamp"))), + m_moduleID(*(new CTreeParameter("moduleID"))), + m_bankNo(*(new CTreeParameter("bankNo"))) { } @@ -131,6 +133,7 @@ int id = (header & HDR_IDMASK) >> HDR_IDSHFT; if (id != pMap->vsn) return offset; + m_moduleID = id; // Save it for the multiplicity unpacker. // We've established this is our data. // We're going to use the trailer to terminate so we don't need the @@ -144,6 +147,7 @@ bool overflow = (datum & DATA_ISOVERFLOW) != 0; if (!overflow) { int channel = (datum & DATA_CHANNELMASK) >> DATA_CHANNELSHFT; + m_bankNo = channel/16; // Bank number within the ADC (each bank is a separate 'module'). int value = datum & DATA_VALUEMASK; int id = pMap->map[channel]; if (id != -1) { @@ -163,6 +167,10 @@ 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 { // Sometimes I see wonky events...missing trailers... data with the top 1/2 filled with only 1's. Modified: branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/CMADC32Unpacker.h 2010-10-28 10:00:16 UTC (rev 1722) @@ -39,6 +39,8 @@ { 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. // canonicals: public: CMADC32Unpacker(); Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-10-28 10:00:16 UTC (rev 1722) @@ -17,6 +17,8 @@ #include <config.h> #include "CMultiplicity.h" #include <SpecTcl.h> +#include <GateContainer.h> +#include <Gate.h> #include <TCLInterpreter.h> #include <fstream> #include <string> @@ -28,9 +30,12 @@ #include <fstream> #include <stdio.h> +#include <assert.h> using namespace std; +static const uint32_t WRAPADD(0x40000000); // Amount to add for a timestamp wrap. + /*! Construction builds the tree parameters and what we can of the CTCLVariable. */ @@ -41,10 +46,9 @@ m_cycleCount("multiplicity.cycleCount", 100, "cycles"), m_ROIS("multiplicity.ROIS", false), m_timestamp("timestamp"), - m_tZeroSet(false), - m_tLast(0) + m_moduleID("moduleID"), + m_bankNo("bankNo") { - CTreeParameter::BindParameters(); // Make sure timestamp is bound (maybe I don't need this)? } /*! @@ -61,13 +65,14 @@ Bool_t CMultiplicity::OnAttach(CAnalyzer& rAnalyzer) { + try { // Bind my tree variables so I can do what follows: SpecTcl* pApi = SpecTcl::getInstance(); CTCLInterpreter* pInterp = pApi->getInterpreter(); CTreeVariable::BindVariables(*pInterp); - + CTreeParameter::BindParameters(); // Bind the tree parameters too... m_ROIS.Bind(*pInterp); readTreeVariables(*pInterp); @@ -97,10 +102,10 @@ CMultiplicity:: OnBegin(CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { - m_tZeroSet = false; + // Locate the gates and get pointers to their + // containers so that we can check them in the event processor: - m_ticksPerBin = (m_bins * m_frequency)/1.0e6; - m_ticksPerCycle = m_ticksPerBin * m_bins; + m_Gates.clear(); SpecTcl* pApi = SpecTcl::getInstance(); @@ -124,9 +129,23 @@ } i++; } + // + // Clear/release the various data that we will use to accumulate multiplicities and multiplicity + // sums: + // + + for (pCurrentCycle p = m_currentCycles.begin(); + p != m_currentCycles.end(); + p++) { + pModuleData pData = p->second; + delete []pData->s_pThisCycle; + delete p->second; + } + m_currentCycles.clear(); + m_Histogram.clear(); + return kfTRUE; } - /*! Handle end of run buffers. In this case we need to - Write out the multiplicity data in the form required by Phil, @@ -144,6 +163,7 @@ CMultiplicity::OnEnd(CAnalyzer& rAnalyzer, CBufferDecoder& rBuffer) { + if (m_Gates.size() == 0) return kfTRUE; // Get the output filename. @@ -151,18 +171,14 @@ string title = rBuffer.getTitle(); string filename = multiplicityFilename(run); - // Write the data + // Write the data... but only bother if there are gates: - writeMultiplicityData(filename, title); + if (m_Gates.size()) { - // Cleanup for next time around: - - m_Gates.clear(); // Need to repopulate this on the next begin run. - for (int i = 0; i < m_Multiplicities.size(); i++) { - free(m_Multiplicities[i]); + writeMultiplicityData(filename, title); } - m_Multiplicities.clear(); + } /*! @@ -203,43 +219,79 @@ CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { - if (m_timestamp.isValid()) { // In case there's un-stamped or empty event. - // Figure out the stamp relative to the first event and then calculate the - // cycle number/bin. + // In order to process we need to have: + // - A timestamp. + // - A module id + // - A non zero count of gates: + // - double stamp = m_timestamp; + if (!m_timestamp.isValid() || + !m_moduleID.isValid() || !m_bankNo.isValid() || + (m_Gates.size() == 0)) return kfTRUE; - if(!m_tZeroSet) { - m_tZero = stamp; - m_tZeroSet = true; - } - stamp = stamp - m_tZero; // TODO: Deal with timestamp wraps. - m_tLast = stamp; // Last timestamp received. + // The unit that contributes data is the bank. We're going to + // construct a 'fake' module Id from the module id and the bank + // if we don't do that we can have cases where out of order data + // for them module fools the timestamp wrap logic. - int cycle = static_cast<int>(stamp/m_ticksPerCycle); // Cycle number. - int bin = static_cast<int>(stamp/m_ticksPerBin); // Absolute bin number. - bin -= cycle*m_bins; // Bin relative to cycle. + unsigned id = m_moduleID * 256 + m_bankNo; - // The neutron multiplicity is just the number of gates that are true for this - // event: + // If necessary, create the ModuleData for this module: - int multiplicity = 0; - for (int i =0; i < m_Gates.size(); i++) { - CGateContainer* pGate = m_Gates[i]; - if ( (*pGate)->inGate(rEvent)) { - multiplicity++; - } - - } - if (cycle >= m_Multiplicities.size()) { - expandMultiplicities(cycle); - } - uint32_t* pCycleData = m_Multiplicities[cycle]; - pCycleData[bin] += multiplicity; - + if (m_currentCycles.find(id) == m_currentCycles.end()) { + createCurrentCycle(id, (double)m_timestamp); } + + + pModuleData pCycle = m_currentCycles[id]; + + // Figure out our actual timestamp..and if necessary adjust for wrapping: + + double rawTimestamp = m_timestamp; + double timestamp = rawTimestamp + pCycle->s_wrapAdd; + if (timestamp < pCycle->s_lastTimestamp) { + pCycle->s_wrapAdd += WRAPADD; + timestamp += WRAPADD; + } + pCycle->s_lastTimestamp = timestamp; + + // - Figure out the timestamp in ns, + // - Figure out the cycle number + // - Figure out the bin number: + + double timestampNs = timestamp / (m_frequency); // This is ms. + timestampNs = timestampNs * 1.0e6; // This is nsec. + double fullbins = timestampNs/m_minTime; // The full bin number (cycle*bins+bin-in-cycle) + unsigned cycle = static_cast<unsigned>(fullbins/m_bins); + unsigned bin = static_cast<unsigned>(fullbins - (cycle * m_bins)); + + if (bin >= m_bins) { + cerr << "Error: Bin number won't fit in cycle: " << (double)m_bins << " <= " << bin <<endl; + cerr << "Ignoring this event for multiplicity processing\n"; + return kfTRUE; + } + + // If necessary dump the current cycle to the histograms: + // If the first neutron is not in cycle0 ..no matter, we're just going + // to dump zeros in any event. + // + if (cycle != pCycle->s_currentCycle) { + dumpCycle(pCycle); + pCycle->s_currentCycle = cycle; + } + + // Now figure out the multiplicity and increment the appropriate time bin: + + unsigned multiplicity = 0; + for (int i =0; i < m_Gates.size(); i++) { + if ((*m_Gates[i])->inGate(rEvent)) multiplicity++; + } + pCycle->s_pThisCycle[bin] += multiplicity; + + + return kfTRUE; } @@ -391,22 +443,8 @@ return filename; } + /** - * Called to expand the multiplicities histogram array so that the specified cycle can fit. - * @param cycle - The largest cycle the histograms must hold. - * Note: for now the histograms are just expanded large enough to hold the specified cycle - * rather than expanding ahead. The assumption is that the cycle time is such that, - * modulo skips, there will always be quite a few events in each cycle. - */ -void -CMultiplicity::expandMultiplicities(int cycle) -{ - while (m_Multiplicities.size() <= cycle) { - uint32_t* pCycle = reinterpret_cast<uint32_t*>(calloc(m_bins, sizeof(uint32_t))); - m_Multiplicities.push_back(pCycle); // TODO: Handle calloc failure. - } -} -/** * Called to get the name of the multiplicity file. This will be stored in * $HOME/multiplicitydata/run-%04d.multiplicity * @param run - Run number of the run for which we need the filename. @@ -439,7 +477,6 @@ sprintf(filename, "run-%04d.multiplicity", run); result += filename; - return result; } @@ -511,23 +548,23 @@ void CMultiplicity::writeSummary(std::fstream& out) { - double startDelayms = m_tZero / m_frequency; - double runLengthms = (m_tLast - m_tZero) / m_frequency; + double startDelayuSec = startDelay(); + double runLengthSec = runLength(); + unsigned cycles = runCycles(); // Now we can write the stuff that does not require looking through the multiplicity data: - out << "**** Counter Setup ****\n"; + out << "**** Counter Setup ****\n\n"; out << "mode = Neutron Generator-2A\t(Feynman Variance Analysis)\n"; out << endl; - out << startDelayms/1000.0 << ",\t\tstart delay (microseconds)\n"; - out << ((double)m_minTime/1000.0) << ",\t\tbin width (microseconds)\n"; + out << startDelayuSec << ",\t\tstart delay (microseconds)\n"; + out << ((double)m_minTime/1000.0) << ",\t\tbin width (microseconds)\n"; out << (int)((double)m_bins) << ",\t\tbins\n"; - out << m_Multiplicities.size() << ",\t\ttotal number of cyclees\n"; + out << cycles << ",\t\ttotal number of cyclees\n"; out << endl; - double runLengthSec = runLengthms/1000.0; double binWidthSec = m_minTime / 1.0e9; @@ -537,8 +574,8 @@ out << "Total Run Time = (" << m_bins << ") X " << binWidthSec << " X " - << m_Multiplicities.size() << " = " - << m_bins * binWidthSec * m_Multiplicities.size() << " seconds\n"; + << cycles << " = " + << m_bins * binWidthSec * cycles << " seconds\n"; out << "\n\n"; out << "Average count rate for the largest gate (" @@ -549,28 +586,26 @@ int totalCounts = 0; int total20 = 0; - for (int i =0; i < m_Multiplicities.size(); i++) { - uint32_t* pCycle = m_Multiplicities[i]; + - // first 20bins - int j = 0; - for(; j < 20; j++) { - totalCounts += *pCycle; - total20 += *pCycle; - pCycle++; + size_t lastgate = m_bins-1; + if (lastgate >= m_Histogram.size()) lastgate = m_Histogram.size() - 1; + for(int i =1; i < m_Histogram[lastgate].size(); i++) { + totalCounts += i * m_Histogram[lastgate][i]; + } + if (lastgate > 19) { + for (int i =1; i < m_Histogram[19].size(); i++) { + total20 += i* m_Histogram[19][i]; } - for (; j < (int)m_bins; j++) { - totalCounts += *pCycle; - pCycle++; - } } + double averageRate = (double)totalCounts/runLengthSec; double averageRate20 = (double)total20/runLengthSec; - out << "Average Count Rate = Total Count (gate " << (int)((double)m_bins) + out << "Average Count Rate = Total Count (gate " << (int)((double)lastgate + 1) // Number gates from 1. << " / Total Run Time (sec)\n"; out << "Average Count Rate = " << totalCounts << " / " - << (double)runLengthSec << " = " << averageRate << endl; + << (double)runLengthSec << " = " << averageRate << endl << endl; out << "Average Count Rate for the twentieth gate ( " << (double)m_minTime * 20.0 * 1000.0 << " microseconds)\n\n"; @@ -592,44 +627,37 @@ void CMultiplicity::writeGate(std::fstream& out, int gate) { - float gateWidthUsec = m_minTime * gate * 1000.0; // minTime is nsec but gateWidth is in microseconds. + float gateWidthUsec = (m_minTime * (gate+1))/1000; // m_minTime in ns and first gate is gate# 0. - vector<int> cycleHistogram; int totalCounts = 0; - // Compute the multiplicity histogram for this gate: + // Figure out how many cycles we need to output. + // minimum of 40 maximum of the last multiplicity + 10(?). - for (int i =0; i < m_Multiplicities.size(); i++) { - uint32_t* pCycle = m_Multiplicities[i]; - - int gateSum = 0; - for (int j = 0; j < gate; j++) { - totalCounts += *pCycle; - gateSum += *pCycle++; - - } - if (cycleHistogram.size() <= gateSum) expandHistogram(cycleHistogram, gateSum); - cycleHistogram[gateSum]++; + size_t num = m_Histogram[gate].size(); + if (num < 40) { + num = 40; + } + else { + num = num + 10; } - int multipletCount = cycleHistogram.size(); - if (multipletCount < 40) multipletCount = 40; - // Write the header: + out << "***** Counter Data *****\n\n"; - out << multipletCount << ",\t\tTotal number of multplet entries\n"; - out << gate << ",\t\tgate\n"; + out << num << ",\t\tTotal number of multplet entries\n"; + out << gate+1 << ",\t\tgate\n"; out << gateWidthUsec << ",\t\tgate-width (microseconds)\n\n"; + out << "Multiplet No.,\tData\n\n"; - // write the data - - out << "Multiplet No.,\tData\n\n"; - for (int i =0; i < multipletCount; i++) { + for (int i =0; i < num; i++) { int value = 0; - if (i < cycleHistogram.size()) value = cycleHistogram[i]; - + if (i < m_Histogram[gate].size()) { + value = m_Histogram[gate][i]; + } + totalCounts += i*value; out << i << ",\t\t" << value << endl; } out << endl; @@ -640,15 +668,47 @@ } /** - * Expands a vector so that it can hold a specific max index. - * @param histogram - vector<int>& to expand. - * @param size - largest index the vector should hold when we are done. - * the vector is zero filled. + * Expands the m_Histogram vector so that it can hold a specific multiplicity value: + * @param gate - The gate we need to expand the outer vector to. + * @param multiplicity - The multiplicity level the inner vector must hold. + * + * @note - In expanding the outer histogram, we're going to ensure that the inner histograms + * of each expansion have mutiplicity + 1 bins.. this probably saves effort later. */ void -CMultiplicity::expandHistogram(vector<int>& histogram, int size) +CMultiplicity::expandHistogram(int gate, int multiplicity) + { - while(size >= histogram.size()) histogram.push_back(0); + if (m_Histogram.size() <= gate+1) { + // Need to expand the outer histogram. + + vector<unsigned> inner; + for (int i = 0; i <= multiplicity+1; i++) { + inner.push_back(0); + } + for (int i = m_Histogram.size(); i <= gate+1; i++) { + m_Histogram.push_back(inner); + } + + // Make sure we got this right: + + assert(gate <= m_Histogram.size()); + assert(multiplicity <= m_Histogram[multiplicity].size()); + return; + } + // Only may need to expand the inner histogram. + // + // the for loop below short circuits if there's nothing to do: + // + for (int i = m_Histogram[gate].size(); i <= multiplicity+1; i++) { + m_Histogram[gate].push_back(0); + } + // Make sure we got this right:' + + assert(gate <= m_Histogram.size()); + assert(multiplicity <= m_Histogram[multiplicity].size()); + + } /** * Write the comment part of the multiplicity output file. @@ -658,8 +718,108 @@ void CMultiplicity::writeComment(std::fstream& f, string comment) { - f << endl << endl << endl; + f << endl; f << "*****User comments*****\n"; - f << "\t" << comment; + f << "\t" << comment << endl; } +/** + * Create cycle data for a module. There's sort of an assumption that the first event for a module will + * come in before the timestamp wraps. Not quite sure what else I could do other than + * that ..or maybe see what the biggest wrap countis in all the other module data. + * @param id - The module id for which we are creating data. + * @param initialStamp - The innitial timestamp. + * + * @note - we require the copy constructor of ModuleData to be shallow as we will be + * allocating a pointer we just want copied into the map. + */ +void +CMultiplicity::createCurrentCycle(unsigned id, double initialStamp) +{ + + pModuleData pModule = new ModuleData; + pModule->s_moduleId = id; + pModule->s_lastTimestamp = initialStamp; + pModule->s_firstTimestamp = initialStamp; + pModule->s_wrapAdd = 0.0; + pModule->s_currentCycle = 0; + pModule->s_pThisCycle = 0; + + size_t bins = static_cast<size_t>((double)(m_bins)); + + pModule->s_pThisCycle = new uint32_t[bins]; + memset(pModule->s_pThisCycle, 0, bins*sizeof(uint32_t)); + + m_currentCycles[id] = pModule; // copy construction. +} +/** + Dump the current cycle to the histograms. This means + - computing the multiplcities for each gate and incrementing the appropriate bin of each histogram. + - Clearing the multiplicity data in the cycle. + @param pCycle - Iterator that 'points' to the cycle to dump. + +*/ +void +CMultiplicity::dumpCycle(pModuleData pCycle) +{ + int neutrons = 0; + for (int i =0; i < m_bins; i++) { // At each step we have the sum for a gate. + neutrons += pCycle->s_pThisCycle[i]; + expandHistogram(i, neutrons); + m_Histogram[i][neutrons]++; + } + + memset(pCycle->s_pThisCycle, 0, m_bins*sizeof(uint32_t)); +} +/** + * To get the start delay, we need to determine the smallest of the s_firstTimestamp entries + * in the module data records we accumulated through this run: + * that values is then converted to microseconds. + */ +double +CMultiplicity::startDelay() +{ + double firstTimestamp = 1.0e06; // Likely to be less than this. + for(pCurrentCycle p = m_currentCycles.begin(); p != m_currentCycles.end(); p++) { + + pModuleData pData = p->second; + if (pData->s_firstTimestamp < firstTimestamp) firstTimestamp = pData->s_firstTimestamp; + } + double startDelayus = firstTimestamp/m_frequency; // Milliseconds. + startDelayus *= 1000; // Microseconds. + return startDelayus; +} +/** + * To get the run length we need the start delay and the largest time. + * The difference is then converted to seconds. + */ +double +CMultiplicity::runLength() +{ + double minTime = startDelay() /1.0e6; // start delay in microseconds convferted to seconds. + + double lasttime = 0.0; + for(pCurrentCycle p = m_currentCycles.begin(); p != m_currentCycles.end(); p++) { + + pModuleData pData = p->second; + if (pData->s_lastTimestamp > lasttime) lasttime = pData->s_lastTimestamp; + } + lasttime = (lasttime /m_frequency) * 1000; // last time in usec. + + return (lasttime - minTime)/1.0e6; // Result in seconds. +} +/** + * The numbers of cycles in a run is the largest value of s_currentCycle in the + * module data we've accumulated this run. + */ +unsigned +CMultiplicity::runCycles() +{ + unsigned cycles = 0; + for(pCurrentCycle p = m_currentCycles.begin(); p != m_currentCycles.end(); p++) { + + pModuleData pData = p->second; + if (pData->s_currentCycle > cycles) cycles = pData->s_currentCycle; + } + return cycles; +} Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-10-28 10:00:16 UTC (rev 1722) @@ -61,7 +61,14 @@ #endif #endif +#ifndef __STL_MAP +#include <map> +#ifndef __STL_MAP +#define __STL_MAP +#endif +#endif + class CTCLInterpreter; class CGateContainer; class fstream; @@ -79,7 +86,21 @@ */ class CMultiplicity : public CEventProcessor { + // Internal data structures: +private: + typedef struct _moduleData { + unsigned s_moduleId; // Makes it easier with gdb maybe. + double s_lastTimestamp; + double s_firstTimestamp; + double s_wrapAdd; + unsigned s_currentCycle; + uint32_t* s_pThisCycle; + + } ModuleData, *pModuleData; + + typedef std::map<unsigned, ModuleData*> CurrentCycle; + typedef CurrentCycle::iterator pCurrentCycle; // Local data: private: CTreeVariable m_bins; @@ -88,17 +109,16 @@ CTreeVariable m_cycleCount; CTCLVariable m_ROIS; CTreeParameter m_timestamp; // The event parameter holding the timestamp. + CTreeParameter m_moduleID; // The module we are unpacking. + CTreeParameter m_bankNo; std::vector<CGateContainer*> m_Gates; - bool m_tZeroSet; // True if first event seen to set time zero - int m_tZero; // Timestamp value at t==0. - int m_tLast; // Last timestamp. - double m_ticksPerBin; // Floating to avoid potential aliasing in case of non-conformalism - double m_ticksPerCycle; - std::vector<uint32_t*> m_Multiplicities; // Multiplicity histograms. + CurrentCycle m_currentCycles; + std::vector<std::vector<unsigned> > m_Histogram; // The histogram of multiplicities through the run. + // Canonicals public: CMultiplicity(); @@ -123,13 +143,11 @@ void saveTreeVariables(); void readTreeVariables(CTCLInterpreter& rInterp); void establishTraces(CTCLInterpreter& rInterp); - void expandMultiplicities(int cycle); void writeHeader(std::fstream& out, std::string filename); void writeSummary(std::fstream& out); void writeMultiplicityData(std::string filename, std::string comment); void writeGate(std::fstream& f, int gate); void writeComment(std::fstream& f, std::string comment); - static char* varModified(ClientData clientData, Tcl_Interp* pInterp, const char* name1, @@ -137,7 +155,12 @@ int flags); static std::string cycleFilename(); static std::string multiplicityFilename(int run); - static void expandHistogram(std::vector<int>& histogram, int size); + void expandHistogram(int gate, int multiplicity); + void createCurrentCycle(unsigned id, double initialStamp); + void dumpCycle(pModuleData pCycle); + double startDelay(); + double runLength(); + unsigned runCycles(); }; Modified: branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/CRateProcessor.cpp 2010-10-28 10:00:16 UTC (rev 1722) @@ -40,7 +40,8 @@ CRateProcessor::CRateProcessor(CSpectrum& spectrum) : m_pSpectrum(&spectrum), m_totalCounts(0), - m_increments(0) + m_increments(0), + m_SpectrumName(spectrum.getName()) {} /*! @@ -222,23 +223,19 @@ SpecTcl& api(*(SpecTcl::getInstance())); - string spectrumName = m_pSpectrum->getName(); - CSpectrum* match = api.FindSpectrum(spectrumName); + CSpectrum* m_pSpectrum = api.FindSpectrum(m_SpectrumName); // If the spectrum is gone, mark ourselves for deletion and disable // by setting the spectrum to null. - if (!match) { + if (!m_pSpectrum) { disable(); return; } - // If the spectrum changed, then update our pointer. - // and reset the counters: - if (match != m_pSpectrum) { - m_pSpectrum = match; - clear(); - } + clear(); // Reset our counters. + + } /* Modified: branches/LLNLMadcChainSpecTcl/CRateProcessor.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CRateProcessor.h 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/CRateProcessor.h 2010-10-28 10:00:16 UTC (rev 1722) @@ -29,6 +29,12 @@ #endif #endif +#ifndef __STL_STRING +#include <string> +#ifndef __STL_STRING +#define __STL_STRING +#endif +#endif // forward classes: @@ -55,6 +61,7 @@ CSpectrum* m_pSpectrum; uint32_t m_totalCounts; uint32_t m_increments; + std::string m_SpectrumName; public: // Construtors and cannonicals. Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2010-10-15 11:11:04 UTC (rev 1721) +++ branches/LLNLMadcChainSpecTcl/Makefile 2010-10-28 10:00:16 UTC (rev 1722) @@ -56,74 +56,106 @@ C785Unpacker.o: C785Unpacker.h CModuleUnpacker.h CParamMapCommand.h C785Unpacker.o: /usr/include/stdint.h /usr/include/features.h -C785Unpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -C785Unpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -C785Unpacker.o: /usr/include/bits/wchar.h +C785Unpacker.o: /usr/include/bits/predefs.h /usr/include/sys/cdefs.h +C785Unpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h +C785Unpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h CFitButton.o: CFitButton.h CLLNLUnpacker.o: CLLNLUnpacker.h /usr/include/stdint.h -CLLNLUnpacker.o: /usr/include/features.h /usr/include/sys/cdefs.h -CLLNLUnpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -CLLNLUnpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h -CLLNLUnpacker.o: CParamMapCommand.h +CLLNLUnpacker.o: /usr/include/features.h /usr/include/bits/predefs.h +CLLNLUnpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CLLNLUnpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CLLNLUnpacker.o: /usr/include/bits/wchar.h CParamMapCommand.h CMADC32Unpacker.o: CMADC32Unpacker.h CModuleUnpacker.h CParamMapCommand.h CMADC32Unpacker.o: /usr/include/stdint.h /usr/include/features.h -CMADC32Unpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -CMADC32Unpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -CMADC32Unpacker.o: /usr/include/bits/wchar.h +CMADC32Unpacker.o: /usr/include/bits/predefs.h /usr/include/sys/cdefs.h +CMADC32Unpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h +CMADC32Unpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h +CMASE.o: CMASE.h CModuleUnpacker.h CParamMapCommand.h /usr/include/stdint.h +CMASE.o: /usr/include/features.h /usr/include/bits/predefs.h +CMASE.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CMASE.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CMASE.o: /usr/include/bits/wchar.h /usr/include/string.h +CMASE.o: /usr/include/xlocale.h /usr/include/stdio.h +CMASE.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h +CMASE.o: /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h +CMASE.o: /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h CModuleUnpacker.o: CModuleUnpacker.h CParamMapCommand.h +CMultiplicity.o: CMultiplicity.h /usr/include/stdint.h +CMultiplicity.o: /usr/include/features.h /usr/include/bits/predefs.h +CMultiplicity.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CMultiplicity.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CMultiplicity.o: /usr/include/bits/wchar.h /usr/include/stdlib.h +CMultiplicity.o: /usr/include/sys/types.h /usr/include/bits/types.h +CMultiplicity.o: /usr/include/bits/typesizes.h /usr/include/time.h +CMultiplicity.o: /usr/include/endian.h /usr/include/bits/endian.h +CMultiplicity.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h +CMultiplicity.o: /usr/include/bits/select.h /usr/include/bits/sigset.h +CMultiplicity.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h +CMultiplicity.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h +CMultiplicity.o: /usr/include/unistd.h /usr/include/bits/posix_opt.h +CMultiplicity.o: /usr/include/bits/confname.h /usr/include/getopt.h +CMultiplicity.o: /usr/include/sys/stat.h /usr/include/bits/stat.h +CMultiplicity.o: /usr/include/stdio.h /usr/include/libio.h +CMultiplicity.o: /usr/include/_G_config.h /usr/include/wchar.h +CMultiplicity.o: /usr/include/bits/stdio_lim.h +CMultiplicity.o: /usr/include/bits/sys_errlist.h /usr/include/assert.h CNADC2530Unpacker.o: CNADC2530Unpacker.h CModuleUnpacker.h CParamMapCommand.h CNADC2530Unpacker.o: /usr/include/stdint.h /usr/include/features.h -CNADC2530Unpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -CNADC2530Unpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -CNADC2530Unpacker.o: /usr/include/bits/wchar.h +CNADC2530Unpacker.o: /usr/include/bits/predefs.h /usr/include/sys/cdefs.h +CNADC2530Unpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h +CNADC2530Unpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h CParamMapCommand.o: CParamMapCommand.h CRateCommand.o: CRateCommand.h CRateList.h CRateProcessor.h CRateCommand.o: /usr/include/stdint.h /usr/include/features.h -CRateCommand.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h -CRateCommand.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h -CRateCommand.o: /usr/include/bits/wchar.h +CRateCommand.o: /usr/include/bits/predefs.h /usr/include/sys/cdefs.h +CRateCommand.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h +CRateCommand.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h CRateEventProcessor.o: CRateEventProcessor.h /usr/include/stdint.h -CRateEventProcessor.o: /usr/include/features.h /usr/include/sys/cdefs.h -CRateEventProcessor.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -CRateEventProcessor.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h -CRateEventProcessor.o: /usr/include/stdlib.h /usr/include/sys/types.h -CRateEventProcessor.o: /usr/include/bits/types.h +CRateEventProcessor.o: /usr/include/features.h /usr/include/bits/predefs.h +CRateEventProcessor.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CRateEventProcessor.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CRateEventProcessor.o: /usr/include/bits/wchar.h /usr/include/stdlib.h +CRateEventProcessor.o: /usr/include/sys/types.h /usr/include/bits/types.h CRateEventProcessor.o: /usr/include/bits/typesizes.h /usr/include/time.h CRateEventProcessor.o: /usr/include/endian.h /usr/include/bits/endian.h -CRateEventProcessor.o: /usr/include/sys/select.h /usr/include/bits/select.h -CRateEventProcessor.o: /usr/include/bits/sigset.h /usr/include/bits/time.h -CRateEventProcessor.o: /usr/include/sys/sysmacros.h +CRateEventProcessor.o: /usr/include/bits/byteswap.h /usr/include/sys/select.h +CRateEventProcessor.o: /usr/include/bits/select.h /usr/include/bits/sigset.h +CRateEventProcessor.o: /usr/include/bits/time.h /usr/include/sys/sysmacros.h CRateEventProcessor.o: /usr/include/bits/pthreadtypes.h /usr/include/alloca.h CRateList.o: CRateList.h CRateProcessor.o: CRateProcessor.h /usr/include/stdint.h -CRateProcessor.o: /usr/include/features.h /usr/include/sys/cdefs.h -CRateProcessor.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -CRateProcessor.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h -CRateProcessor.o: CRateList.h +CRateProcessor.o: /usr/include/features.h /usr/include/bits/predefs.h +CRateProcessor.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CRateProcessor.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CRateProcessor.o: /usr/include/bits/wchar.h CRateList.h CStackMapCommand.o: CStackMapCommand.h CParamMapCommand.h CStackUnpacker.o: CStackUnpacker.h /usr/include/stdint.h -CStackUnpacker.o: /usr/include/features.h /usr/include/sys/cdefs.h -CStackUnpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -CStackUnpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h -CStackUnpacker.o: CModuleUnpacker.h CParamMapCommand.h C785Unpacker.h -CStackUnpacker.o: CNADC2530Unpacker.h CMADC32Unpacker.h CV1x90Unpacker.h -CStackUnpacker.o: CV977Unpacker.h CStackMapCommand.h +CStackUnpacker.o: /usr/include/features.h /usr/include/bits/predefs.h +CStackUnpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CStackUnpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CStackUnpacker.o: /usr/include/bits/wchar.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 CV1x90Unpacker.o: CV1x90Unpacker.h /usr/include/stdint.h -CV1x90Unpacker.o: /usr/include/features.h /usr/include/sys/cdefs.h -CV1x90Unpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -CV1x90Unpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h -CV1x90Unpacker.o: /usr/include/string.h /usr/include/stdio.h +CV1x90Unpacker.o: /usr/include/features.h /usr/include/bits/predefs.h +CV1x90Unpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CV1x90Unpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CV1x90Unpacker.o: /usr/include/bits/wchar.h /usr/include/string.h +CV1x90Unpacker.o: /usr/include/xlocale.h /usr/include/stdio.h CV1x90Unpacker.o: /usr/include/bits/types.h /usr/include/bits/typesizes.h CV1x90Unpacker.o: /usr/include/libio.h /usr/include/_G_config.h CV1x90Unpacker.o: /usr/include/wchar.h /usr/include/bits/stdio_lim.h CV1x90Unpacker.o: /usr/include/bits/sys_errlist.h CV977Unpacker.o: CV977Unpacker.h /usr/include/stdint.h -CV977Unpacker.o: /usr/include/features.h /usr/include/sys/cdefs.h -CV977Unpacker.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -CV977Unpacker.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h +CV977Unpacker.o: /usr/include/features.h /usr/include/bits/predefs.h +CV977Unpacker.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +CV977Unpacker.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +CV977Unpacker.o: /usr/include/bits/wchar.h MySpecTclApp.o: MySpecTclApp.h CParamMapCommand.h CStackMapCommand.h MySpecTclApp.o: CStackUnpacker.h /usr/include/stdint.h -MySpecTclApp.o: /usr/include/features.h /usr/include/sys/cdefs.h -MySpecTclApp.o: /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h -MySpecTclApp.o: /usr/include/gnu/stubs-32.h /usr/include/bits/wchar.h -MySpecTclApp.o: CRateCommand.h CRateEventProcessor.h CFitButton.h +MySpecTclApp.o: /usr/include/features.h /usr/include/bits/predefs.h +MySpecTclApp.o: /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h +MySpecTclApp.o: /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h +MySpecTclApp.o: /usr/include/bits/wchar.h CMultiplicity.h CRateCommand.h +MySpecTclApp.o: CRateEventProcessor.h CFitButton.h This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-10-28 12:32:48
|
Revision: 1723 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1723&view=rev Author: ron-fox Date: 2010-10-28 12:32:41 +0000 (Thu, 28 Oct 2010) Log Message: ----------- - First shot at gettin the GUI to work. - Fix a typo on the vars traced by the multiplicity processor. - Needed to trace ROI unsets to fully save/restore the state. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl/multiplicityGates.html branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-10-28 10:00:16 UTC (rev 1722) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-10-28 12:32:41 UTC (rev 1723) @@ -8,7 +8,7 @@ http://www.gnu.org/licenses/gpl.txt Author: - Ron Fox + RonFox NSCL Michigan State University East Lansing, MI 48824-1321 @@ -391,8 +391,8 @@ Tcl_TraceVar(pInterp, "multiplicity.bins", flags, CMultiplicity::varModified, this); Tcl_TraceVar(pInterp, "multiplicity.mintime", flags, CMultiplicity::varModified, this); Tcl_TraceVar(pInterp, "multiplicity.frequency", flags, CMultiplicity::varModified, this); - Tcl_TraceVar(pInterp, "multiplicity.cyclecount", flags, CMultiplicity::varModified, this); - Tcl_TraceVar(pInterp, "multiplicity.ROIS", 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); } /** Added: branches/LLNLMadcChainSpecTcl/multiplicityGates.html =================================================================== --- branches/LLNLMadcChainSpecTcl/multiplicityGates.html (rev 0) +++ branches/LLNLMadcChainSpecTcl/multiplicityGates.html 2010-10-28 12:32:41 UTC (rev 1723) @@ -0,0 +1,50 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> + <head> + <title>Multiplicity gate user interface help</title> + </head> + + <body> + <h1>How to use the neutron gate chooser:</h1> + <p> + The neutron gate chooser allows you to specify the set of gates that + define what a neutron is for the purposes of the neutron multiplicity + event processor. The GUI itself is a window that contains three sections. +<ul> + <li>At the top left is a folder GUI browser for gates. This browser lists + all of the gates that are not currently selected as neutron gates. + </li> + <li>At the top right is a list of the gates that are currently selected + as neutron gates </li> + <li>At the bottom is a strip of buttons that perform various actions</li> +</ul> +</p> + <p> + Double clicking in either the browser or the selected gate list transfers + the gate under the pointer to the other control. Thus double clicking + on a gate in the browser window adds the gate to the list of neutron + gates you are building, while double clocking a gate in the "Selected + gates" list box removes that gate from the list of neutron gates you are building. + </p> + <p> + The buttons in the bottom strip perform actions as follows: + <ul> + <li>The <b>OK</b> button accepts the list of neutron gates you have + built, and dismisses the GUI prompter. The new list takes effect at + the beginning of the next run. The list is saved to a file (~/.cycles) + where it is loaded automatically when SpecTcl starts.</li> + + <li>The <b>Cancel</b> button dismisses the window but makes no changes + to the list of gates used by the multiplicity event processor + </li> + <li>The <b>Help</b> button displays this help message</li> + </ul> + </p> + <hr> + <address><a href="mailto:fo...@ns...">Ron Fox</a></address> +<!-- Created: Thu Oct 28 07:54:29 EDT 2010 --> +<!-- hhmts start --> +Last modified: Thu Oct 28 08:10:23 EDT 2010 +<!-- hhmts end --> + </body> +</html> Added: branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl 2010-10-28 12:32:41 UTC (rev 1723) @@ -0,0 +1,268 @@ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + + + +# This file contains a user interface for selecting the set of gates that +# define what a neutron is. These gates are used by the multiplicity +# event processor to count neutrons for each timestamp. The neutron +# gates are stored in the global array multiplicty.ROIS with numeric indices +# that are consecutively numbered. +# +# +# The user interface will have the following form: +# +# +-------------------------------------------------------------------+ +# | +-----------------------+ +------------------+ | +# | | Gate browser | | list of gates | | +# | | (folder GUI) | | selected by user| | +# | | dbl click adds to rt | | dbl click removes| | +# | +-----------------------+ +------------------+ | +# | [OK] [CANCEL] [HELP] | +# +-------------------------------------------------------------------+ +# +# + +package require Tk +package require snit +package require browser +package require BWidget + +# +# The widget that prompts for the neutron gates: +# +# OPTIONS: +# -okcommand list - list is a script to run when ok is clicked. +# -cancelcommand list - list is a script to run when cancel is clicked. +# -helpcommand list - list is a script to run when help is clicked. +# COMMANDS +# get - Returns the list of currently selected gates. +# +snit::widget NeutronGates { + option -okcommand {} + option -cancelcommand {} + option -helpcommand {} + + constructor {args} { + global multiplicity.ROIS + + $self configurelist $args + + # Create the user interface and lay it out: + + # work area with the browser and gate list: + + label $win.browserlbl -text {Choose gates} + label $win.filler -text { } + label $win.gateslbl -text {Selected gates} + + + listbox $win.gates -width 20 -height 24 \ + -yscrollcommand [list $win.gatescroll set] + + # Stock the list box with the current gates + # NOTE: What to do about gates that don't exist (yet?). + + foreach index [lsort -integer [array names multiplicity.ROIS]] { + $win.gates insert end [set multiplicity.ROIS($index)] + } + + + browser $win.browser -restrict gates -detail false \ + -filtergates [mymethod gateFilter] \ + -showcolumns [list type] \ + -gatescript [mymethod addGate] + + scrollbar $win.gatescroll -orient vertical \ + -command [list $win.gates yview] + + # Now the action area: + + frame $win.actions; # OK and cancel are close together. in a frame + + button $win.actions.ok -text {Ok} -command [mymethod onOk] + button $win.actions.cancel -text {Cancel} -command [mymethod onCancel] + button $win.help -text {Help} -command [mymethod onHelp] + + # Lay out the widgets. + + grid $win.browserlbl $win.filler $win.gateslbl + + grid $win.browser -row 1 -column 0 + grid $win.gates -sticky nse -row 1 -column 2 + grid $win.gatescroll -row 1 -column 3 -sticky nsw + + grid $win.actions.ok $win.actions.cancel + + grid $win.actions -sticky w + grid $win.help -row 2 -column 2 -sticky e; # UI Guidelines put help way right. + + # Bind a double click event to the list box which removes the element + # under the pointer. + + bind $win.gates <Double-1> [mymethod removeGate %x %y] + + + } + #-------------------------------------------------------------------------- + # 'Public' methods: (widget commands) + # + + + # Return the list of gates that have been selected to the caller. + # + method get {} { + return [$win.gates get 0 end] + } + + + #--------------------------------------------------------------------------- + # 'Private' methods: + # + + # Gate filter. Restrict the browser to only contain the set of gates that are not in + # the list box already. + # Parameters: + # gate-description - Description of the gate to list. + # Return (bool) + # true - It's ok to add the gate to the browser. + # false - Don't list the gate in the brwoser. + + method gateFilter {desc} { + set name [lindex $desc 0] + set listboxNames [$win.gates get 0 end] + return [expr {[lsearch $listboxNames $name] == -1}] + } + + # Gate double click handler. This function + # - Adds the clicked gate to the bottom of the listbox. + # - Forces a browser refesh, which in turn will remove the gate from the browser + # due to the filter. + # Parameters: + # path - Path that was clicked on. + # + method addGate {path} { + + # We need to strip off the Gates. from the path: + # Taking a bit of precaution in case the gate name itself has .'s in it. + + set pathList [split $path .] + set pathList [lrange $pathList 1 end] + set gateName [join $pathList .] + + $win.gates insert end $gateName + $win.browser update + } + # Listbox double click method. This removes the gate under the cursor + # from the listbox.. + # Parameters + # x,y - Coordinates of the click. + method removeGate {x y} { + set index [$win.gates index @$x,$y] + if {$index == -1} {return} + + $win.gates delete $index + $win.browser update + } + # common code to dispatch to a script option if it is not null. + + method dispatch option { + if {$options($option) ne ""} { + set command $options($option) + uplevel #0 $command + } + } + + # process the ok button click. If the option -okcommand is set, + # the list it points to is run at the global level. + # otherwise nothing happens. + # This impementation choice separates the UI from the policy of + # how the button affects the gui e.g. destroys it? it's container? + # + method onOk {} { + $self dispatch -okcommand + } + # Process the cancel command. + # + method onCancel {} { + $self dispatch -cancelcommand + } + # Process the help button. + + method onHelp {} { + $self dispatch -helpcommand + } +} +# +# OK processor which updates the multiplicity gate list +# and destroy the widget. +# We assume the browser is the .b component of $widget. +# +proc updateMultiplicityGates {widget} { + global multiplicity.ROIS + + set gates [$widget.b get] + + + # Create the new gate list + + set g 0 + foreach gate $gates { + set multiplicity.ROIS($g) $gate + incr g + } + while {[array names multiplicity.ROIS $g] ne ""} { + unset multiplicity.ROIS($g) + incr g + } + + + + # Destroy the gui (it's an Ok after all). + + destroy $widget +} + +proc helpMultiplicity {widget} { + set helpdir [file dirname [info script]] + + if {![winfo exists $widget.help]} { + iwidgets::hyperhelp $widget.help -helpdir $helpdir -topics multiplicityGates + $widget.help showtopic multiplicityGates + + } + wm withdraw $widget.help + wm deiconify $widget.help +} + +# +# Call this to initiate the prompter (e.g. bind this to a menu item or a button +# +proc promptMultiplicityGates {top} { + + # Only make 1: + + if {[winfo exists $top]} { + return + } + + toplevel $top + NeutronGates $top.b -okcommand [list updateMultiplicityGates $top] \ + -cancelcommand [list destroy $top] \ + -helpcommand [list helpMultiplicity $top] + pack $top.b + + +} + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-11-08 11:44:01
|
Revision: 1724 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1724&view=rev Author: ron-fox Date: 2010-11-08 11:43:54 +0000 (Mon, 08 Nov 2010) Log Message: ----------- - Changes to configFile.tcl to support the neutron gate selection GUI. - Complete rewrite of CMultiplicity.cpp Do 'event building' like multiplicity computation. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h branches/LLNLMadcChainSpecTcl/configFile.tcl Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-10-28 12:32:41 UTC (rev 1723) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-11-08 11:43:54 UTC (rev 1724) @@ -20,6 +20,7 @@ #include <GateContainer.h> #include <Gate.h> #include <TCLInterpreter.h> +#include <TCLList.h> #include <fstream> #include <string> #include <stdlib.h> @@ -45,6 +46,7 @@ m_frequency("multiplicity.frequency", 16.0e3, "KHz"), m_cycleCount("multiplicity.cycleCount", 100, "cycles"), m_ROIS("multiplicity.ROIS", false), + m_moduleIds("madcIds", false), m_timestamp("timestamp"), m_moduleID("moduleID"), m_bankNo("bankNo") @@ -74,6 +76,7 @@ CTreeVariable::BindVariables(*pInterp); CTreeParameter::BindParameters(); // Bind the tree parameters too... m_ROIS.Bind(*pInterp); + m_moduleIds.Bind(*pInterp); readTreeVariables(*pInterp); @@ -107,10 +110,10 @@ m_Gates.clear(); - SpecTcl* pApi = SpecTcl::getInstance(); - - bool done = false; - int i = 0; + SpecTcl* pApi = SpecTcl::getInstance(); + CTCLInterpreter* pInterp = pApi->getInterpreter(); + bool done = false; + int i = 0; while(!done) { char index[100]; sprintf(index, "%d", i); @@ -134,16 +137,33 @@ // sums: // - for (pCurrentCycle p = m_currentCycles.begin(); - p != m_currentCycles.end(); - p++) { - pModuleData pData = p->second; - delete []pData->s_pThisCycle; - delete p->second; - } - m_currentCycles.clear(); + m_currentCycleNumber = 0; + m_currentCycle = new uint32_t[(int)((double)m_bins)]; + memset(m_currentCycle, 0, m_bins * sizeof(uint32_t)); m_Histogram.clear(); + // Set up the fragment queues: + + CTCLList moduleIds(pInterp, m_moduleIds.Get()); + StringArray ids; + moduleIds.Split(ids); + + // Each module id gets a pair of fragment queues, one for each bank. + + 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; + + m_fragmentQueues.push_back(bank); + bank.s_bankNumber = 1; + m_fragmentQueues.push_back(bank); + } + return kfTRUE; } /*! @@ -165,18 +185,30 @@ { if (m_Gates.size() == 0) return kfTRUE; + flushFragmentQueues(); + // Get the output filename. unsigned int run = rBuffer.getRun(); string title = rBuffer.getTitle(); string filename = multiplicityFilename(run); - // Write the data... but only bother if there are gates: + // flush the current cycle and write the data... but only bother if there are gates: + + string comment = title; + char firstTimeComment[80]; + + double firstNeutron = startDelay(); + sprintf(firstTimeComment, "\r\nFirst neutron at %f uSec\r\n", firstNeutron); + comment += firstTimeComment; + writeMultiplicityData(filename, comment); + - if (m_Gates.size()) { + // Cleanup data: - writeMultiplicityData(filename, title); - } + m_fragmentQueues.clear(); // All the fragment queues must be empty by definition. + m_Histogram.clear(); + delete []m_currentCycle; } @@ -235,60 +267,59 @@ // if we don't do that we can have cases where out of order data // for them module fools the timestamp wrap logic. - unsigned id = m_moduleID * 256 + m_bankNo; + unsigned module = (unsigned)((double)(m_moduleID)); + unsigned bank = (unsigned)((double)(m_bankNo)); + double rawTimestamp = (double)(m_timestamp); - // If necessary, create the ModuleData for this module: + pbankQueue pQueue = findQueue(module, bank); + double timestamp = rawTimestamp + pQueue->s_wrapAdd; // Add all the wraps into the timestamp - if (m_currentCycles.find(id) == m_currentCycles.end()) { - createCurrentCycle(id, (double)m_timestamp); + // Wrap again? + + if (timestamp < pQueue->s_lastTimestamp) { + timestamp += WRAPADD; + pQueue->s_wrapAdd += WRAPADD; } + pQueue->s_lastTimestamp = timestamp; + // If first event, save that sort of stuff too: - pModuleData pCycle = m_currentCycles[id]; + if (pQueue->s_firstEvent) { + pQueue->s_firstTimestamp = timestamp; + pQueue->s_firstEvent = false; + } + + // Figure out the cycle and bin: - // Figure out our actual timestamp..and if necessary adjust for wrapping: + double nsPerTick = 1000.0*1000.0/m_frequency; // (1000usec/ms, 1000ns/usec)/ms^-1 -> ns. + double fullBin = (timestamp*nsPerTick)/m_minTime; + unsigned cycle = fullBin/m_bins; + unsigned bin = fullBin - (cycle*m_bins); + pQueue->s_currentCycle = cycle; - double rawTimestamp = m_timestamp; - double timestamp = rawTimestamp + pCycle->s_wrapAdd; - if (timestamp < pCycle->s_lastTimestamp) { - pCycle->s_wrapAdd += WRAPADD; - timestamp += WRAPADD; + // Figure out the number of neutrons. If there aren't any, no need to go any further. + + unsigned neutrons = 0; + for(int i =0; i < m_Gates.size(); i++) { + CGateContainer& rGate(*m_Gates[i]); + if (rGate->inGate(rEvent)) neutrons++; } - pCycle->s_lastTimestamp = timestamp; - // - Figure out the timestamp in ns, - // - Figure out the cycle number - // - Figure out the bin number: + if (neutrons > 0) { + + // Build a fragmnt and insert it in the queue. - double timestampNs = timestamp / (m_frequency); // This is ms. - timestampNs = timestampNs * 1.0e6; // This is nsec. - double fullbins = timestampNs/m_minTime; // The full bin number (cycle*bins+bin-in-cycle) - unsigned cycle = static_cast<unsigned>(fullbins/m_bins); - unsigned bin = static_cast<unsigned>(fullbins - (cycle * m_bins)); + eventFragment frag = { + cycle, bin, neutrons + }; + pQueue->s_fragments.push_back(frag); - if (bin >= m_bins) { - cerr << "Error: Bin number won't fit in cycle: " << (double)m_bins << " <= " << bin <<endl; - cerr << "Ignoring this event for multiplicity processing\n"; - return kfTRUE; - } + // Process event queues: - // If necessary dump the current cycle to the histograms: - // If the first neutron is not in cycle0 ..no matter, we're just going - // to dump zeros in any event. - // - if (cycle != pCycle->s_currentCycle) { - dumpCycle(pCycle); - pCycle->s_currentCycle = cycle; + processFragmentQueues(); } - // Now figure out the multiplicity and increment the appropriate time bin: - - unsigned multiplicity = 0; - for (int i =0; i < m_Gates.size(); i++) { - if ((*m_Gates[i])->inGate(rEvent)) multiplicity++; - } - pCycle->s_pThisCycle[bin] += multiplicity; @@ -473,8 +504,18 @@ // Figure out the filename, append it to the path and return the whole mess to the // caller. + + time_t ticks; + struct tm timeStruct; + char formattedTime[20]; + time(&ticks); + + memcpy(&timeStruct, localtime(&ticks), sizeof(struct tm)); + strftime(formattedTime, sizeof(formattedTime), + "%m%d%Y_%H%M%S", &timeStruct); + char filename[100]; - sprintf(filename, "run-%04d.multiplicity", run); + sprintf(filename, "%s-run%04d-2A.log", formattedTime, run); result += filename; return result; @@ -527,10 +568,16 @@ "%D, %R:%S, data stored", &brokenDownTime); - f << timeStamp <<endl; - f << filename << endl <<endl; + // The filename must have '/'s replaced by '\'s. + size_t slash; + while ((slash = filename.find("/")) != string::npos) { + filename.replace(slash, 1, "\\"); + } + f << timeStamp <<"\r\n"; + f << filename << "\r\n" <<"\r\n"; + } /** * Write the summary part of the file header. @@ -548,21 +595,21 @@ void CMultiplicity::writeSummary(std::fstream& out) { - double startDelayuSec = startDelay(); + double startDelayuSec = 1; double runLengthSec = runLength(); unsigned cycles = runCycles(); // Now we can write the stuff that does not require looking through the multiplicity data: - out << "**** Counter Setup ****\n\n"; - out << "mode = Neutron Generator-2A\t(Feynman Variance Analysis)\n"; - out << endl; + out << "**** Counter Setup ****\r\n\r\n"; + out << "mode = Neutron Generator-2A\t(Feynman Variance Analysis)\r\n"; + out << "\r\n"; - out << startDelayuSec << ",\t\tstart delay (microseconds)\n"; - out << ((double)m_minTime/1000.0) << ",\t\tbin width (microseconds)\n"; - out << (int)((double)m_bins) << ",\t\tbins\n"; - out << cycles << ",\t\ttotal number of cyclees\n"; - out << endl; + out << startDelayuSec << ",\t\tstart delay (microseconds) \r\n"; + out << ((double)m_minTime/1000.0) << ",\t\tbin width (microseconds)\r\n"; + out << (int)((double)m_bins) << ",\t\tbins\r\n"; + out << cycles << ",\t\ttotal number of cyclees\r\n"; + out << "\r\n"; double binWidthSec = m_minTime / 1.0e9; @@ -570,16 +617,16 @@ // Incorrect text but correct computation: - out << "Total Run Time = (Cycle Duration) X (Bin Width) X (Total Cycle Count) = Time in seconds\n"; + out << "Total Run Time = (Cycle Duration) X (Bin Width) X (Total Cycle Count) = Time in seconds\r\n"; out << "Total Run Time = (" << m_bins << ") X " << binWidthSec << " X " << cycles << " = " - << m_bins * binWidthSec * cycles << " seconds\n"; + << m_bins * binWidthSec * cycles << " seconds\r\n"; out << "\n\n"; out << "Average count rate for the largest gate (" - << (m_bins*m_minTime)*1000 << " microsseconds)\n\n"; + << (m_bins*m_minTime)*1000 << " microsseconds)\r\n\r\n"; // Need to sum total counts and counts in first 20 bins // There's an implicit assumption that there are at least 20 bins in a cycle. @@ -603,16 +650,16 @@ double averageRate20 = (double)total20/runLengthSec; out << "Average Count Rate = Total Count (gate " << (int)((double)lastgate + 1) // Number gates from 1. - << " / Total Run Time (sec)\n"; + << " / Total Run Time (sec)\r\n"; out << "Average Count Rate = " << totalCounts << " / " - << (double)runLengthSec << " = " << averageRate << endl << endl; + << (double)runLengthSec << " = " << averageRate << "\r\n" << "\r\n"; out << "Average Count Rate for the twentieth gate ( " - << (double)m_minTime * 20.0 * 1000.0 << " microseconds)\n\n"; + << (double)m_minTime * 20.0 * 1000.0 << " microseconds)\r\n\r\n"; - out << "Average Count Rate = Total Count (gate 20) / Total Run Time (sec)\n"; + out << "Average Count Rate = Total Count (gate 20) / Total Run Time (sec)\r\n"; out << "Average Count Rate = " << total20 << " / " - << (double)runLengthSec << " = " << averageRate20 << endl <<endl; + << (double)runLengthSec << " = " << averageRate20 << "\r\n" <<"\r\n"; } /** @@ -646,10 +693,10 @@ out << "***** Counter Data *****\n\n"; - out << num << ",\t\tTotal number of multplet entries\n"; - out << gate+1 << ",\t\tgate\n"; - out << gateWidthUsec << ",\t\tgate-width (microseconds)\n\n"; - out << "Multiplet No.,\tData\n\n"; + out << num << ",\t\tTotal number of multplet entries\r\n"; + out << gate+1 << ",\t\tgate\r\n"; + out << gateWidthUsec << ",\t\tgate-width (microseconds)\r\n\r\n"; + out << "Multiplet No.,\tData\r\n\r\n"; for (int i =0; i < num; i++) { @@ -658,13 +705,13 @@ value = m_Histogram[gate][i]; } totalCounts += i*value; - out << i << ",\t\t" << value << endl; + out << i << ",\t\t" << value << "\r\n"; } - out << endl; + out << "\r\n"; // Write the sum: - out << "Sum counts = \t" << totalCounts << endl << endl << endl; + out << "Sum counts = \t" << totalCounts << "\r\n" << "\r\n" << "\r\n"; } /** @@ -718,58 +765,39 @@ void CMultiplicity::writeComment(std::fstream& f, string comment) { - f << endl; - f << "*****User comments*****\n"; - f << "\t" << comment << endl; + f << "\r\n"; + f << "*****User comments*****\r\n"; + f << "\t" << comment << "\r\n"; } -/** - * Create cycle data for a module. There's sort of an assumption that the first event for a module will - * come in before the timestamp wraps. Not quite sure what else I could do other than - * that ..or maybe see what the biggest wrap countis in all the other module data. - * @param id - The module id for which we are creating data. - * @param initialStamp - The innitial timestamp. - * - * @note - we require the copy constructor of ModuleData to be shallow as we will be - * allocating a pointer we just want copied into the map. - */ -void -CMultiplicity::createCurrentCycle(unsigned id, double initialStamp) -{ - - pModuleData pModule = new ModuleData; - pModule->s_moduleId = id; - pModule->s_lastTimestamp = initialStamp; - pModule->s_firstTimestamp = initialStamp; - pModule->s_wrapAdd = 0.0; - pModule->s_currentCycle = 0; - pModule->s_pThisCycle = 0; - size_t bins = static_cast<size_t>((double)(m_bins)); - - pModule->s_pThisCycle = new uint32_t[bins]; - memset(pModule->s_pThisCycle, 0, bins*sizeof(uint32_t)); - - m_currentCycles[id] = pModule; // copy construction. -} /** Dump the current cycle to the histograms. This means - computing the multiplcities for each gate and incrementing the appropriate bin of each histogram. - - Clearing the multiplicity data in the cycle. - @param pCycle - Iterator that 'points' to the cycle to dump. - + - If there are skipped cycles, incrementing the zeros for each bin for skipped cycle + @param nextCycle - Number of the next cycle. This allows correct handling of cycles with no neutrons. */ void -CMultiplicity::dumpCycle(pModuleData pCycle) +CMultiplicity::dumpCycle(unsigned nextCycle) { int neutrons = 0; for (int i =0; i < m_bins; i++) { // At each step we have the sum for a gate. - neutrons += pCycle->s_pThisCycle[i]; + neutrons += m_currentCycle[i]; expandHistogram(i, neutrons); m_Histogram[i][neutrons]++; } + m_currentCycleNumber++; // We at least go to the next cycle - memset(pCycle->s_pThisCycle, 0, m_bins*sizeof(uint32_t)); + // Add in zeros for the skipped cycles: + + uint32_t missedCycles = nextCycle - m_currentCycleNumber; + for (int i=0; i < m_bins; i++) { + expandHistogram(i, 0); + m_Histogram[i][0] += missedCycles; + } + m_currentCycleNumber = nextCycle; + + memset(m_currentCycle, 0, m_bins*sizeof(uint32_t)); } /** * To get the start delay, we need to determine the smallest of the s_firstTimestamp entries @@ -780,33 +808,33 @@ CMultiplicity::startDelay() { double firstTimestamp = 1.0e06; // Likely to be less than this. - for(pCurrentCycle p = m_currentCycles.begin(); p != m_currentCycles.end(); p++) { + for (int i =0; i < m_fragmentQueues.size(); i++) { + double aFirst = m_fragmentQueues[i].s_firstTimestamp; + if (aFirst < firstTimestamp) firstTimestamp = aFirst; + } - pModuleData pData = p->second; - if (pData->s_firstTimestamp < firstTimestamp) firstTimestamp = pData->s_firstTimestamp; - } + double startDelayus = firstTimestamp/m_frequency; // Milliseconds. startDelayus *= 1000; // Microseconds. return startDelayus; } /** - * To get the run length we need the start delay and the largest time. + * To get the run length we need the largest timestamp. * The difference is then converted to seconds. */ double CMultiplicity::runLength() { - double minTime = startDelay() /1.0e6; // start delay in microseconds convferted to seconds. double lasttime = 0.0; - for(pCurrentCycle p = m_currentCycles.begin(); p != m_currentCycles.end(); p++) { + for (int i = 0; i < m_fragmentQueues.size(); i++) { + double aLast = m_fragmentQueues[i].s_lastTimestamp; + if (aLast > lasttime) lasttime = aLast; + } - pModuleData pData = p->second; - if (pData->s_lastTimestamp > lasttime) lasttime = pData->s_lastTimestamp; - } lasttime = (lasttime /m_frequency) * 1000; // last time in usec. - return (lasttime - minTime)/1.0e6; // Result in seconds. + return (lasttime)/1.0e6; // Result in seconds. } /** * The numbers of cycles in a run is the largest value of s_currentCycle in the @@ -815,11 +843,152 @@ unsigned CMultiplicity::runCycles() { - unsigned cycles = 0; - for(pCurrentCycle p = m_currentCycles.begin(); p != m_currentCycles.end(); p++) { - pModuleData pData = p->second; - if (pData->s_currentCycle > cycles) cycles = pData->s_currentCycle; + return m_currentCycleNumber; +} + +/////////////////////////////////////////////////////////////////////////////////////////////// +// Fragment queue processing. +// + +/** + * Determine if all fragment queues are non-empty. + * @return bool + * @retval true - All queues have at least one fragment. + * @retval false - At least one queue is empty. + */ +bool +CMultiplicity::noQueueEmpty() +{ + for (int i =0; i < m_fragmentQueues.size(); i++) { + if(m_fragmentQueues[i].s_fragments.empty()) return false; } - return cycles; + return true; } +/** + * Detmerine if all queues are empty. + * @return bool + * @retval true - All fragment queues are empty. + * @retval false - Some queue has data. + */ +bool +CMultiplicity::allQueuesEmpty() +{ + for (int i =0; i < m_fragmentQueues.size(); i++) { + if (!m_fragmentQueues[i].s_fragments.empty()) return false; + } + return true; +} +/** + * Given a module number and a bank, returns the fragment queue for that module chunk + * @param module - Module id number. + * @param bank - Bank number of module. + * @return pbankQueue + * @retval NULL - not found. + * @retval Pointer to the bank queue that has fragments for the specified module id and bank. + */ +CMultiplicity::pbankQueue +CMultiplicity::findQueue(unsigned module, unsigned bank) +{ + for (int i =0; i < m_fragmentQueues.size(); i++) { + pbankQueue pQueue = &(m_fragmentQueues[i]); + if ((pQueue->s_moduleId == module) && + (pQueue->s_bankNumber == bank)) return pQueue; + } + return reinterpret_cast<pbankQueue>(NULL); +} +/** + * Locates the oldest event fragment, removes it from its queue and returns it to the + * caller. + * @return eventFragment + * @retval Contents of the oldest event fragment. + * @throw string It is up to the caller to ensure that at least one of the event queues has data + * If that's not the case a string exception will be thrown. + */ +CMultiplicity::eventFragment +CMultiplicity::oldestFragment() +{ + unsigned minCycle; + unsigned minBin; + pbankQueue pMinQueue(0); + + for(int i = 0; i < m_fragmentQueues.size(); i++) { + pbankQueue pQueue = &(m_fragmentQueues[i]); + if (!pQueue->s_fragments.empty()) { + pEventFragment pFrag = &(pQueue->s_fragments.front()); + if (!pMinQueue) { // nothing to compare with: + pMinQueue = pQueue; + minCycle = pFrag->s_cycle; + minBin = pFrag->s_bin; + } + else { + // Already have one: + + if ((pFrag->s_cycle < minCycle) || + ((pFrag->s_cycle == minCycle) && (pFrag->s_bin < minBin))) { + // New minimum: + + pMinQueue = pQueue; + minCycle = pFrag->s_cycle; + minBin = pFrag->s_bin; + } + + } + } + } + + if (!pMinQueue) { + // Precondition violation - must be at least one nonempty queue: + + throw string("CMultiplicity::oldestFragment - precondition violated; all event queues are empty"); + } + else { + eventFragment result = pMinQueue->s_fragments.front(); + pMinQueue->s_fragments.pop_front(); + return result; + } + +} +/** + * Process the fragment queus in normal operation. Normal operation requires that all fragmebnt + * queues have at least one fragment. + */ +void +CMultiplicity::processFragmentQueues() +{ + while (noQueueEmpty()) { + eventFragment frag = oldestFragment(); + histogramFragment(&frag); + } +} +/** + * Process the fragment queues until they are all empty. This is done at the end fo the + * run to count those last set of neutrons. + */ +void +CMultiplicity::flushFragmentQueues() +{ + while(!allQueuesEmpty()) { + eventFragment frag = oldestFragment(); + histogramFragment(&frag); + } +} +/** + * Histogram the fragment... if necessary the fragment is dumped + * to the final histogram. + * @param pFrag - Pointer to the event fragment + */ +void +CMultiplicity::histogramFragment(pEventFragment pFrag) +{ + unsigned cycle = pFrag->s_cycle; + unsigned bin = pFrag->s_bin; + unsigned count = pFrag->s_multiplicity; + + // If necessary flush the current cycle: + + if (cycle != m_currentCycleNumber) { + dumpCycle(cycle); // Should be > but maybe cycles can wrap(?) + } + m_currentCycle[bin] += count; // Add to the neutron count for this bin. +} Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-10-28 12:32:41 UTC (rev 1723) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-11-08 11:43:54 UTC (rev 1724) @@ -61,10 +61,12 @@ #endif #endif -#ifndef __STL_MAP -#include <map> -#ifndef __STL_MAP -#define __STL_MAP + + +#ifndef __STL_LIST +#include <list> +#ifndef __STL_LIST +#define __STL_LIST #endif #endif @@ -89,18 +91,40 @@ // Internal data structures: private: - typedef struct _moduleData { - unsigned s_moduleId; // Makes it easier with gdb maybe. - double s_lastTimestamp; - double s_firstTimestamp; - double s_wrapAdd; - unsigned s_currentCycle; - uint32_t* s_pThisCycle; - } ModuleData, *pModuleData; - typedef std::map<unsigned, ModuleData*> CurrentCycle; - typedef CurrentCycle::iterator pCurrentCycle; + typedef struct _eventFragment { + uint32_t s_cycle; + uint32_t s_bin; + unsigned s_multiplicity; + } eventFragment, *pEventFragment; + + 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; + unsigned s_currentCycle; + fragmentQueue s_fragments; + bool s_firstEvent; + _bankQueue() {} /* default constructor is uninitialized. */ + _bankQueue(const _bankQueue& rhs) : + s_moduleId(rhs.s_moduleId), + 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) + {} + } bankQueue, *pbankQueue; + + // Local data: private: CTreeVariable m_bins; @@ -108,11 +132,15 @@ CTreeVariable m_frequency; CTreeVariable m_cycleCount; CTCLVariable m_ROIS; + CTCLVariable m_moduleIds; CTreeParameter m_timestamp; // The event parameter holding the timestamp. CTreeParameter m_moduleID; // The module we are unpacking. CTreeParameter m_bankNo; std::vector<CGateContainer*> m_Gates; - CurrentCycle m_currentCycles; + + uint32_t m_currentCycleNumber; + uint32_t* m_currentCycle; + std::vector<bankQueue> m_fragmentQueues; std::vector<std::vector<unsigned> > m_Histogram; // The histogram of multiplicities through the run. @@ -156,12 +184,20 @@ static std::string cycleFilename(); static std::string multiplicityFilename(int run); void expandHistogram(int gate, int multiplicity); - void createCurrentCycle(unsigned id, double initialStamp); - void dumpCycle(pModuleData pCycle); + + void dumpCycle(unsigned nextCycle); double startDelay(); double runLength(); unsigned runCycles(); + bool noQueueEmpty(); + bool allQueuesEmpty(); + pbankQueue findQueue(unsigned module, unsigned bank); + eventFragment oldestFragment(); + void processFragmentQueues(); + void flushFragmentQueues(); + void histogramFragment(pEventFragment pFrag); + }; Modified: branches/LLNLMadcChainSpecTcl/configFile.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/configFile.tcl 2010-10-28 12:32:41 UTC (rev 1723) +++ branches/LLNLMadcChainSpecTcl/configFile.tcl 2010-11-08 11:43:54 UTC (rev 1724) @@ -49,6 +49,12 @@ 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. @@ -191,7 +197,6 @@ 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. @@ -199,7 +204,9 @@ set ididx [lsearch -exact $args "-id"] if {$ididx != -1} { incr ididx - set ::adcConfiguration($name) [lindex $args $ididx] + set id [lindex $args $ididx] + set ::adcConfiguration($name) $id + lappend ::madcIds $id } } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-11-11 10:37:17
|
Revision: 1729 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1729&view=rev Author: ron-fox Date: 2010-11-11 10:37:11 +0000 (Thu, 11 Nov 2010) Log Message: ----------- - Fix directory issue in locating help for multiplicity gates dialog. - installer Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl/install.sh Added: branches/LLNLMadcChainSpecTcl/install.sh =================================================================== --- branches/LLNLMadcChainSpecTcl/install.sh (rev 0) +++ branches/LLNLMadcChainSpecTcl/install.sh 2010-11-11 10:37:11 UTC (rev 1729) @@ -0,0 +1,23 @@ +#!/bin/bash + +# +# Installer for version 2 of LLNLMADC SpecTcl. +# This version supports computation of neutron multiplicities. +# +# The installer assumes version 1 is installed +# as /usr/opt/llnlSpecTcl +# +# This will be mv'd to llnlSpecTcl-v1.0 +# We will install ourselves in llnlSpecTcl-v2.0 +# We will link llnlSpecTcl to llnlSpecTcl-v2.0 + +# +# Build on target system: +# + +make && \ +mv /usr/opt/spectcl/llnlSpecTcl /usr/opt/spectcl/llnlSpecTcl-v1.0 && \ +install -d -m 0755 /usr/opt/spectcl/llnlSpecTcl-v2.0 && \ +install -m 0755 * /usr/opt/spectcl/llnlSpecTcl-v2.0 && \ +ln -s /usr/opt/spectcl/llnlSpecTcl-v2.0 /usr/opt/spectcl/llnlSpecTcl + Property changes on: branches/LLNLMadcChainSpecTcl/install.sh ___________________________________________________________________ Added: svn:executable + * Modified: branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl 2010-11-11 10:11:14 UTC (rev 1728) +++ branches/LLNLMadcChainSpecTcl/multiplicityGates.tcl 2010-11-11 10:37:11 UTC (rev 1729) @@ -235,7 +235,7 @@ } proc helpMultiplicity {widget} { - set helpdir [file dirname [info script]] + set helpdir $::llnlSpecTcl if {![winfo exists $widget.help]} { iwidgets::hyperhelp $widget.help -helpdir $helpdir -topics multiplicityGates This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-24 11:12:56
|
Revision: 1739 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1739&view=rev Author: ron-fox Date: 2010-12-24 11:12:49 +0000 (Fri, 24 Dec 2010) Log Message: ----------- Got this working I think. Added Paths: ----------- branches/LLNLMadcChainSpecTcl/filesource/ branches/LLNLMadcChainSpecTcl/filesource/CApplication.cpp branches/LLNLMadcChainSpecTcl/filesource/CApplication.h branches/LLNLMadcChainSpecTcl/filesource/Makefile branches/LLNLMadcChainSpecTcl/filesource/filesource.cpp branches/LLNLMadcChainSpecTcl/filesource/options.ggo Added: branches/LLNLMadcChainSpecTcl/filesource/CApplication.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/CApplication.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/CApplication.cpp 2010-12-24 11:12:49 UTC (rev 1739) @@ -0,0 +1,381 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + 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 "CApplication.h" +#include "options.h" +#include <iostream> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> +#include <string.h> +#include <stdlib.h> +#include <stdint.h> +#include <buftypes.h> +#include <buffer.h> + + +using namespace std; + + +/** + * Constructor for the application. We are supposed to + * Fish out the data from the options struct into our member data + * The assumption is that the input file parameter will have lifetime + * at least as long as the operator() lifetime. + * @param argInfo - Results of the parameter parse. + * + */ +CApplication::CApplication(gengetopt_args_info& argInfo) : + m_pEventFile(argInfo.input_arg), + m_skipSeconds(argInfo.skip_arg*60), + m_bufferSize(argInfo.buffersize_arg) +{ + if(argInfo.duration_given) { + m_durationSeconds = 60*argInfo.duration_arg; + } + else { + // If not given the number of minutes is close enough to maxint we'd better not + // mulitply: + m_durationSeconds = argInfo.duration_arg; + } + m_lastTime = m_skipSeconds + m_durationSeconds; + +} +/* STUB */ +int +CApplication::operator()() +{ + cerr << "input file: " << m_pEventFile << endl; + cerr << "Buffer size: " << m_bufferSize << endl; + cerr << "skip: " << m_skipSeconds << " seconds\n"; + cerr << "analyze: " << m_durationSeconds << " seconds\n"; + + // Open the event file and exit on error. + + int fd = openFile(); + if (fd < 0) { + int error = errno; + cerr << "Failed to open event file: " << m_pEventFile << " : " << strerror(error) << endl; + return EXIT_FAILURE; + } + m_fd = fd; + // The Begin run buffer is always output to the user: + + outputBeginBuffer(); + + // See how many seconds are in the total file If the begin time is greater than the + // end time, then just output the end of run buffer and exit with success. + + unsigned int runDuration = totalDuration(); + if (runDuration < m_skipSeconds) { + outputEndBuffer(); + return EXIT_SUCCESS; + } + if (runDuration <= m_lastTime) { + m_lastTime = runDuration; // can't go past this time. + } + + // Pass only scaler buffers through to the user until we get one that is + // at the beginning of where we want to outupt data: + + rewind(); + locateData(); + + // Then pass the data on to the client: [outputs the end of run buffer if needed]. + + outputData(); + + return 0; +} + + + +///////////////////////////////////////////////////////////////////////////////////// + + +/** + * Open the event file. + * @return >= 0 - Unix file descriptor open on the event file. + ** @return < 0 - error with message in errno. + */ + +int +CApplication::openFile() { + int fd = open(m_pEventFile, O_RDONLY); + return fd; +} + +/** + ** Send the begin run buffer to the user. + ** - rewind the file + ** - read the buffer from the file. + ** - output the buffer to stdout. + */ +void +CApplication::outputBeginBuffer() +{ + rewind(); + + uint8_t* buffer = new uint8_t[m_bufferSize]; + + readABuffer(buffer); + writeABuffer(buffer); + + delete []buffer; +} +/** + ** Seed the end of run buffer... this is m_bufferSize bytes back from the end of file + */ +void +CApplication::seekEndRun() +{ + off_t offset = m_bufferSize; + offset = -offset; + + off_t status = lseek(m_fd, offset, SEEK_END); + if (status == -1) { + perror("Seek of end run buffer failed"); + exit(EXIT_FAILURE); + } + + +} +/** + ** Rewind the file to the first buffer: + */ +void +CApplication::rewind() +{ + off_t zero = 0; + + off_t status = lseek(m_fd, zero, SEEK_SET); + if (status == -1) { + perror ("Rewind failed"); + exit(EXIT_FAILURE); + } + +} +/** + ** Determine the total duration of the run. + ** - seek the last buffer of the file. + ** - read it + ** - If it is an end run buffer we can get the time from that. + ** - If it is not an end of run buffer emit a warning and seek backwards a buffer at a time + ** - until we come to a scaler buffer...use that last scaler buffer as the end of run + ** time. + */ +unsigned int +CApplication::totalDuration() +{ + seekEndRun(); + uint8_t* buffer = new uint8_t[m_bufferSize]; + readABuffer(buffer); + bheader* pHeader = reinterpret_cast<bheader*>(buffer); + + // If it's a begin run buffer our work is almost done: + + if (pHeader->type == ENDRUNBF) { + pHeader++; // Point to the body. + ctlbody* pBody = reinterpret_cast<ctlbody*>(pHeader); + delete []buffer; + return pBody->sortim; + } + // Last buffer is not an end run..so we need to look for the last scaler buffer + // failing that, we have no duration as the begin run buffer is at t=0. + // + cerr << "Warning run has no end of run buffer, seeking for he last scaler buffer\n"; + + + unsigned int totalDuration = 0; + off_t seekOffset = m_bufferSize; + seekOffset = 2*(-seekOffset); // seeking backwards by 2 buffers. + pHeader--; // Point back to the beginning of buffer. + while(true) { + off_t newOffset = lseek(m_fd, seekOffset, SEEK_CUR); + if (newOffset == 0) { + break; // Beginning of file. + } + readABuffer(buffer); + if (pHeader->type == SCALERBF) { // Found the last scaler buffer. + pHeader++; // Point to body. + sclbody* pBody = reinterpret_cast<sclbody*>(pHeader); + totalDuration = pBody->etime; // This is the time at which the scaler buffer went out. + break; + } + + } + + + delete []buffer; + return totalDuration; +} + + +/** + ** Locate the start of the data we want.. this will be the data buffer after + ** the scaler buffer with a timestamp that is <= our skip seconds. + ** In order to keep the rates etc. display up to date, we will output any scaler buffers we + ** have to stdout. + ** The caller musth ave ensured we will actually find such a time. + */ +void +CApplication::locateData() +{ + uint8_t* pBuffer = new uint8_t[m_bufferSize]; + bheader* pHeader = reinterpret_cast<bheader*>(pBuffer); + sclbody* pBody = reinterpret_cast<sclbody*>(pHeader+1); + + rewind(); // Start at the beginning. + + while(1) { + readABuffer(pBuffer); + if (pHeader->type == SCALERBF) { + writeABuffer(pBuffer); + if (pBody->etime >= m_skipSeconds) { + break; + } + } + } + + delete []pBuffer; +} +/** + ** Read/write data to output until we come across a buffer that has a time in it + ** (scaler buffer or control buffer) and that time is >= m_lastTime. + */ +void +CApplication::outputData() +{ + uint8_t* pBuffer = new uint8_t[m_bufferSize]; + bheader* pHeader = reinterpret_cast<bheader*>(pBuffer); + ctlbody* pControl= reinterpret_cast<ctlbody*>(pHeader+1); + sclbody* pScaler = reinterpret_cast<sclbody*>(pControl); + while (1) { + readABuffer(pBuffer); + writeABuffer(pBuffer); + + // Deal with special case processing to see if it's time to stop: + + if (pHeader->type == SCALERBF) { + if (pScaler->etime >= m_lastTime) { + outputEndBuffer(); // output the end run buffer. + break; + } + } + if ((pHeader->type == ENDRUNBF) || + (pHeader->type == PAUSEBF) || + (pHeader->type == RESUMEBF)) { + if (pControl->sortim >= m_lastTime) { + if (pHeader->type != ENDRUNBF) { + outputEndBuffer(); + } + break; + } + } + } + + delete []pBuffer; +} +/** + ** Output the last databuffer...if it is the end of run buffer. + ** if not this does nothing + */ +void +CApplication::outputEndBuffer() +{ + uint8_t* pBuffer = new uint8_t[m_bufferSize]; + bheader* pHeader = reinterpret_cast<bheader*>(pBuffer); + seekEndRun(); + + readABuffer(pBuffer); + if (pHeader->type == ENDRUNBF) { + writeABuffer(pBuffer); + } +} +/** + ** Reads a buffer from the input file. This deals with all the sorts of things + ** that may cause a buffer to be incompletely read: + ** - Signals that may require a retry. + ** - Incomplete reads due to buffering (read remainder until done) + ** - End file conditions (exit with an error!!). + */ +void +CApplication::readABuffer(void* pBuffer) +{ + size_t bytesRemaining = m_bufferSize; + uint8_t* d = reinterpret_cast<uint8_t*>(pBuffer); + + while (bytesRemaining) { + ssize_t nRead = read(m_fd, d, bytesRemaining); + + // check for unexpected eof: + + if (nRead == 0) { + cerr << "Unexpected end of file!!\n"; + exit(EXIT_FAILURE); + } + // Check for errors that can't be recovered: + // all others are like no data transferred... + if (nRead < 0) { + if( (errno != EAGAIN) && + (errno != EWOULDBLOCK) && + (errno != EINTR)) { + perror("Error on input file read"); + exit(EXIT_FAILURE); + } + } + else { + // Normal read: + + bytesRemaining -= nRead; + d += nRead; + } + + } + +} +/** + ** Write a buffer to stdout (STDOUT_FILENO) + ** All the various vagaries of write are handled where errors cause + ** exit with stderr message and retries/continuations are transparently handled. + */ +void +CApplication::writeABuffer(void* pBuffer) +{ + size_t bytesRemaining = m_bufferSize; + uint8_t* s = reinterpret_cast<uint8_t*>(pBuffer); + + while(bytesRemaining) { + ssize_t nRead = write(STDOUT_FILENO, s, bytesRemaining); + + // Exit on the various errors that can't be retried. + + if(nRead <= 0) { + if( (errno != EAGAIN) && + (errno != EWOULDBLOCK) && + (errno != EINTR)) { + perror("Unable to write to stdout...exiting: "); + exit(EXIT_FAILURE); + } + } + else { + // Handle normal termination + + bytesRemaining -= nRead; + s += nRead; + } + } +} Added: branches/LLNLMadcChainSpecTcl/filesource/CApplication.h =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/CApplication.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/CApplication.h 2010-12-24 11:12:49 UTC (rev 1739) @@ -0,0 +1,68 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + 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 __CAPPLICATION_H +#define __CAPPLICATION_H + +// forward definitions + +struct gengetopt_args_info; + +/** + * This class provides the application class/object for the + * filesource command. + */ +class CApplication +{ + /** Member data */ + + const char* m_pEventFile; + unsigned int m_skipSeconds; + unsigned int m_durationSeconds; + unsigned long m_lastTime; + unsigned int m_bufferSize; + unsigned int m_fd; + + + /** Constructors and other canonicals: */ + + +public: + CApplication(gengetopt_args_info& argInfo); + + + /** Public operations */ +public: + + int operator()(); + + /** private utilties: */ + +private: + int openFile(); + void outputBeginBuffer(); + void seekEndRun(); + void rewind(); + unsigned int totalDuration(); + void locateData(); + void outputData(); + void outputEndBuffer(); + + void readABuffer(void* pBuffer); + void writeABuffer(void* pBuffer); +}; +#endif Added: branches/LLNLMadcChainSpecTcl/filesource/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/Makefile (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/Makefile 2010-12-24 11:12:49 UTC (rev 1739) @@ -0,0 +1,15 @@ +DAQ_ROOT=/usr/opt/daq/current + +CXXFLAGS+=-I$(DAQ_ROOT)/include -g + + +filesource: filesource.o CApplication.o options.o + $(CXX) $(CXXFLAGS) -I/usr/opt/daq/current/include -o $@ $^ + +options.c: options.ggo + gengetopt --input=options.ggo --file-name=options + + +clean: + rm -f *.o + rm -f optinos.h options.c \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl/filesource/filesource.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/filesource.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/filesource.cpp 2010-12-24 11:12:49 UTC (rev 1739) @@ -0,0 +1,48 @@ +/* + This software is Copyright by the Board of Trustees of Michigan + State University (c) Copyright 2008 + + 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 "options.h" +#include <stdlib.h> +#include "CApplication.h" + +/** + ** This program provides a file data source that can be attached to SpecTcl + ** The data source is suitable for a pipe data source as it sends buffers + ** out stdout. + ** The following command line switches are available: + ** --input - Specifies the input event file (required) + ** --skip - Specifies the number of minutes of event data to skip (optional default 0) + ** --duration - Specfies the number of minutes to analyze (optional, default 1e9 seconds). + ** --buffersize - Specifies the size of the event file buffer (optional defaults to 26656). + */ +int main(int argc, char** argv) +{ + /* Parse the input parameters and fail with a usage output if that fails: */ + + struct gengetopt_args_info parsedArgs; + if(cmdline_parser(argc, argv, &parsedArgs)) { + cmdline_parser_print_help(); + exit(EXIT_FAILURE); + } + else { + CApplication app(parsedArgs); + exit(app()); + } + + +} Added: branches/LLNLMadcChainSpecTcl/filesource/options.ggo =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/options.ggo (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/options.ggo 2010-12-24 11:12:49 UTC (rev 1739) @@ -0,0 +1,10 @@ +package "filesource" +version "1.0" +purpose "Analyze event data starting from a specific point " + +option "skip" s "Number of minutes to skip" int optional default="0" +option "duration" d "Number of minutes to analyze" int optional default="1000000000" +option "buffersize" b "Bytes in each buffer" int optional default="26656" +option "input" i "Input event file" string required + + \ 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...> - 2010-12-24 13:34:11
|
Revision: 1742 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1742&view=rev Author: ron-fox Date: 2010-12-24 13:34:05 +0000 (Fri, 24 Dec 2010) Log Message: ----------- Add file segment data source Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl/VERSION Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-12-24 13:33:04 UTC (rev 1741) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-12-24 13:34:05 UTC (rev 1742) @@ -49,7 +49,8 @@ m_moduleIds("madcIds", false), m_timestamp("timestamp"), m_moduleID("moduleID"), - m_bankNo("bankNo") + m_bankNo("bankNo"), + m_initialized(false) { } @@ -163,6 +164,7 @@ bank.s_bankNumber = 1; m_fragmentQueues.push_back(bank); } + m_initialized=true; return kfTRUE; } @@ -209,8 +211,8 @@ m_fragmentQueues.clear(); // All the fragment queues must be empty by definition. m_Histogram.clear(); delete []m_currentCycle; + m_initialized = false; - } /*! @@ -222,6 +224,11 @@ CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { + + if(!m_initialized) { + OnBegin(rAnalyzer, rDecoder); + } + //TODO: The whole buffer skip thingy. @@ -251,6 +258,9 @@ CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder) { + if (!m_initialized) { + OnBegin(rAnalyzer, rDecoder); + } // In order to process we need to have: // - A timestamp. Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-12-24 13:33:04 UTC (rev 1741) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-12-24 13:34:05 UTC (rev 1742) @@ -143,10 +143,10 @@ std::vector<bankQueue> m_fragmentQueues; std::vector<std::vector<unsigned> > m_Histogram; // The histogram of multiplicities through the run. + bool m_initialized; // True if the run was initialized. - // Canonicals public: CMultiplicity(); Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-24 13:33:04 UTC (rev 1741) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-24 13:34:05 UTC (rev 1742) @@ -143,3 +143,8 @@ source [file join $here fom.tcl] puts Done + +puts -nonewline "Loading the file segment data source" + +source [file join $here filesource fsGui.tcl] +addFsGuiMenuElement Modified: branches/LLNLMadcChainSpecTcl/VERSION =================================================================== --- branches/LLNLMadcChainSpecTcl/VERSION 2010-12-24 13:33:04 UTC (rev 1741) +++ branches/LLNLMadcChainSpecTcl/VERSION 2010-12-24 13:34:05 UTC (rev 1742) @@ -3,4 +3,7 @@ Version 2.0 of Neutrons - Create multiplicity output files. -Version 2.0_1 of Neurons - Fix error in assert in expand histogram. \ No newline at end of file +Version 2.0_1 of Neutrons - Fix error in assert in expand histogram. + +Version 2.1 of Neutrons - add filesegment data source. + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-24 14:36:12
|
Revision: 1743 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1743&view=rev Author: ron-fox Date: 2010-12-24 14:36:05 +0000 (Fri, 24 Dec 2010) Log Message: ----------- Build unsampled source successfully. Added Paths: ----------- branches/LLNLMadcChainSpecTcl/onlinesource/ branches/LLNLMadcChainSpecTcl/onlinesource/Makefile branches/LLNLMadcChainSpecTcl/onlinesource/spectcldaq.cpp Added: branches/LLNLMadcChainSpecTcl/onlinesource/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/onlinesource/Makefile (rev 0) +++ branches/LLNLMadcChainSpecTcl/onlinesource/Makefile 2010-12-24 14:36:05 UTC (rev 1743) @@ -0,0 +1,12 @@ +DAQDIR=/usr/opt/daq/current +SPDAQCC=$(shell /usr/opt/spectrodaq/bin/spectrodaq-conf --cflags) +SPDAQLD=$(shell /usr/opt/spectrodaq/bin/spectrodaq-conf --libs) + +CXXFLAGS+=-g $(SPDAQCC) +CXXFLAGS+=-I$(DAQDIR)/include -pthreads + +LDFLAGS+=-L$(DAQDIR)/lib -lLicense -lException -Wl,"-rpath=$(DAQDIR)/lib" +LDFLAGS+=$(SPDAQLD) + +spectcldaq: spectcldaq.o + $(CXX) -g -o spectcldaq spectcldaq.o $(LDFLAGS) \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl/onlinesource/spectcldaq.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/onlinesource/spectcldaq.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/onlinesource/spectcldaq.cpp 2010-12-24 14:36:05 UTC (rev 1743) @@ -0,0 +1,201 @@ +/* + 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 +*/ + +static const char* Copyright= "(C) Copyright Michigan State University 2002, All rights reserved"; + +#include <config.h> +#include <stdlib.h> +#include <stdio.h> +#include <Iostream.h> +#include <Iomanip.h> +#include <buftypes.h> +#include <buffer.h> +#include <assert.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <CopyrightNotice.h> + +#ifdef HAVE_STD_NAMESPACE +using namespace std; +#endif + + +#ifndef SPECTRODAQ_H +#include <spectrodaq.h> +#endif + +static const int NOTRANSFERDELAY(10*1000); // Delay time before write retry if EAGAIN. + +// How big a buffer do we want? + +#define BUFLEN 0 + +int Write(int fd, void* pBuffer, size_t nLength) +{ + char* p = (char*) pBuffer; + size_t nBytes = 0; + size_t nResid = nLength; + while(nBytes != nLength){ + int nWritten = write(fd, p, nResid); + if(nWritten < 0) { + if(errno == EAGAIN) { // Blocked. + if(nBytes == 0) { // Nothing written yet + return nLength; // Don't transfer to client. + } else { // Something written + // so write the rest. + usleep(NOTRANSFERDELAY); + } + } + else { // Not due to blocking... + return -1; // Real errors -> exit. + } + } + else if(nWritten == 0) { + return -1; // should not happen! + } + else { + // If control is here, nBytes > 1 + + nBytes += nWritten; + p += nWritten; + nResid -= nWritten; + } + } + return nBytes; // All bytes written. +} + +//===================================================================== +// +// CopyOut - Copy a bunch of data out of a word buffer. +// +void CopyOut(void* pDest, DAQWordBufferPtr pSrc, unsigned int nWds) +{ + pSrc.CopyOut(pDest, 0, nWds); // This should be more efficient... +} + + +/*===================================================================*/ +class DAQBuff : public DAQROCNode { + int operator()(int argc,char **argv) { + int j; + DAQWordBuffer bbuf(BUFLEN); + DAQURL sinkurl("TCP://localhost:2602/"); + long sinkid; + + // Print out copyright information: + + CopyrightNotice::Notice(cerr, argv[0], "2.0", "2002"); + CopyrightNotice::AuthorCredit(cerr, argv[0], + "Ron Fox", "Eric Kasten", NULL); + + // In case we're running spectrodaq on something other than + // the default URL. + if (argc > 1) { + cerr << "Using URL: " << argv[1] << endl; + sinkurl = argv[1]; + } + + // Tag this buffer so we know what type of buffer to receive. + bbuf.SetTag(2); + bbuf.SetMask(2); + + // Add a sink for this tag + + sinkid = daq_link_mgr.AddSink(sinkurl,2, ALLBITS_MASK, COS_RELIABLE); + if(sinkid <= 0) { + cerr << "Failed to add unreliable sink\n"; + exit(-1); + } + cerr << "Added reliable sink " << sinkid << endl; + sinkid = daq_link_mgr.AddSink(sinkurl,3, ALLBITS_MASK, COS_RELIABLE); + + + // If the sinkid == 0, then the AddSink failed. + cerr << "Added Reliable Sink Id " << sinkid << endl; + if (sinkid <= 0) { + cerr << "Failed to add a sink." << endl; + exit(-1); + } + + // receive buffers and put them out to stdout (normally a pipe to + // SpecTcl. + // + + // Set stdout to non blocking mode: + + int fd = fileno(stdout); + int flags = fcntl(fd, F_GETFL, 0); + if(flags == -1) { + cerr << "Failed to read initial stdout flag set " << strerror(errno) << endl; + exit(-1); + } + + flags |= O_NONBLOCK; + int stat = fcntl(fd, F_SETFL, flags); + if(stat == -1) { + cerr << "Failed to set stdout to nonblocking mode " << strerror(errno) << endl; + } + + while(1) { + + + + // Accept a buffer (with wait). + SetProcessTitle("spectcldaq - Accepting"); + do { + bbuf.SetTag(2); + bbuf.SetMask(2); + bbuf.Accept(NULL); + } while(bbuf.GetLen() == 0); + SetProcessTitle("spectcldaq - Copying"); + + DAQWordBufferPtr pBuf = &bbuf; + + int nLength = bbuf.GetLen(); + short* pLocalBuffer = new short[nLength]; + + CopyOut(pLocalBuffer, pBuf, bbuf.GetLen()); + + bbuf.Release(); // Implicitly sets buffers size to 0 + // avoiding Spectrodaq deadlocks. + + // From now on we can operate on the local copy of the buffer. + + { + char buffer[100]; + sprintf(buffer, "spectcldaq - piping fd=%d", fileno(stdout)); + DAQString process(buffer); + SetProcessTitle(process); + } + if(Write(fileno(stdout), pLocalBuffer, nLength*sizeof(short)) <= 0) + exit(0); + delete []pLocalBuffer; + } + + //sleep(10); + // Delete the sink. + daq_link_mgr.DeleteSink(sinkid); + } +}; + +DAQBuff mydaq; + + + + Property changes on: branches/LLNLMadcChainSpecTcl/onlinesource/spectcldaq.cpp ___________________________________________________________________ Added: svn:executable + * This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-24 15:10:30
|
Revision: 1744 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1744&view=rev Author: ron-fox Date: 2010-12-24 15:10:23 +0000 (Fri, 24 Dec 2010) Log Message: ----------- Fiddle the installation to make it a bit easier to deal ith. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl/filesource/Makefile branches/LLNLMadcChainSpecTcl/install.sh branches/LLNLMadcChainSpecTcl/onlinesource/Makefile Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2010-12-24 14:36:05 UTC (rev 1743) +++ branches/LLNLMadcChainSpecTcl/Makefile 2010-12-24 15:10:23 UTC (rev 1744) @@ -35,15 +35,22 @@ # # Finally the makefile targets. # +all: SpecTcl fsgui online - SpecTcl: $(OBJECTS) $(CXXLD) -o SpecTcl $(OBJECTS) $(USERLDFLAGS) \ $(LDFLAGS) +fsgui: + (cd filesource; make) +online: + (cd onlinesource; make) + clean: rm -f $(OBJECTS) SpecTcl + (cd filesource; make clean) + (cd onlinesource; make clean) depend: makedepend $(USERCXXFLAGS) *.cpp *.c @@ -52,6 +59,14 @@ echo "make - Build customized SpecTcl" echo "make clean - Remove objects from previous builds" echo "make depend - Add dependencies to the Makefile. " + +install: + install -m 0755 -d $(DEST) + -install -m 0755 * $(DEST) + (cd filesource; make install DEST=$(DEST)/filesource) + (cd onlinesource; make install DEST=$(DEST)/onlinesource) + + # DO NOT DELETE C785Unpacker.o: C785Unpacker.h CModuleUnpacker.h CParamMapCommand.h Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-24 14:36:05 UTC (rev 1743) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-24 15:10:23 UTC (rev 1744) @@ -148,3 +148,9 @@ 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 \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl/filesource/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/Makefile 2010-12-24 14:36:05 UTC (rev 1743) +++ branches/LLNLMadcChainSpecTcl/filesource/Makefile 2010-12-24 15:10:23 UTC (rev 1744) @@ -12,4 +12,8 @@ clean: rm -f *.o - rm -f optinos.h options.c \ No newline at end of file + + +install: + install -d -m 0755 $(DEST) + install -m 0755 * $(DEST) \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl/install.sh =================================================================== --- branches/LLNLMadcChainSpecTcl/install.sh 2010-12-24 14:36:05 UTC (rev 1743) +++ branches/LLNLMadcChainSpecTcl/install.sh 2010-12-24 15:10:23 UTC (rev 1744) @@ -15,9 +15,13 @@ # Build on target system: # -make && \ -install -d -m 0755 /usr/opt/spectcl/llnlSpecTcl-v2.0_1 && \ -install -m 0755 * /usr/opt/spectcl/llnlSpecTcl-v2.0_1 && \ -rm /usr/opt/spectcl/llnlSpecTcl && -ln -s /usr/opt/spectcl/llnlSpecTcl-v2.0_1 /usr/opt/spectcl/llnlSpecTcl +version=llnlSpecTcl-v2.2 +rm -f /usr/opt/spectcl/$version.saved +mv /usr/opt/spectcl/$version /usr/opt/spectcl/$version.saved + +make && \ +make install DEST=/usr/opt/spectcl/$version && \ +rm -f /usr/opt/spectcl/llnlSpecTcl && \ +ln -s /usr/opt/spectcl/$version /usr/opt/spectcl/llnlSpecTcl + Modified: branches/LLNLMadcChainSpecTcl/onlinesource/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/onlinesource/Makefile 2010-12-24 14:36:05 UTC (rev 1743) +++ branches/LLNLMadcChainSpecTcl/onlinesource/Makefile 2010-12-24 15:10:23 UTC (rev 1744) @@ -3,10 +3,17 @@ SPDAQLD=$(shell /usr/opt/spectrodaq/bin/spectrodaq-conf --libs) CXXFLAGS+=-g $(SPDAQCC) -CXXFLAGS+=-I$(DAQDIR)/include -pthreads +CXXFLAGS+=-I$(DAQDIR)/include -pthread LDFLAGS+=-L$(DAQDIR)/lib -lLicense -lException -Wl,"-rpath=$(DAQDIR)/lib" LDFLAGS+=$(SPDAQLD) spectcldaq: spectcldaq.o - $(CXX) -g -o spectcldaq spectcldaq.o $(LDFLAGS) \ No newline at end of file + $(CXX) -g -o spectcldaq spectcldaq.o $(LDFLAGS) + +clean: + rm -f spectcldaq.o spectcldaq + +install: + install -d -m 0755 $(DEST) + install -m 0755 * $(DEST) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-27 10:32:49
|
Revision: 1745 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1745&view=rev Author: ron-fox Date: 2010-12-27 10:32:40 +0000 (Mon, 27 Dec 2010) Log Message: ----------- Commit stuff that's been omitted.. options gets committed in case we need to operate on systems without gengetopt. Added Paths: ----------- branches/LLNLMadcChainSpecTcl/filesource/fsGui.html branches/LLNLMadcChainSpecTcl/filesource/options.c branches/LLNLMadcChainSpecTcl/filesource/options.h branches/LLNLMadcChainSpecTcl/onlinesource/datasource.tcl Added: branches/LLNLMadcChainSpecTcl/filesource/fsGui.html =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/fsGui.html (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/fsGui.html 2010-12-27 10:32:40 UTC (rev 1745) @@ -0,0 +1,53 @@ +<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> +<html> + <head> + <title>File segment help</title> + </head> + + <body> + <h1>File segment data source</h1> + <p> + This dialog allows you to select an event file and a segment of time + within that file to analyze. + </p> + <p> + The top part of the dialog is a file chooser. Use it to select +the event file you want to analyze. +</p> +<p> + The middle part of the dialog contains several controls. + The checkboxes to the left of the entries allow you to enable or disable + the entry of the number of minutes to skip or the duration of the + analysis. + </p> +<p> + The entries themselves are only enabled when the corresponding checkbox + is also enabled. Enter the number of minutes into the run at which you + want analysis to start, and the number of minutes of data to analyze. If + the skip value is disabled, analysis starts at the beginning of the run. + If the duration value is disabled, analysis will continue to the end of + the run. +</p> +<p> + The spinbox allows you to set the buffersize. This will be initially + stocked with the default buffersize you selected when you edited your + preferences. Typically you won't have to change this. +</p> +<p> + The bottom of the dialog contains three buttons: + <ul> + <li>OK - accepts the file and settings you have selected and starts + analysis. The dialog is dismissed</li> + <li>Cancel - dismisses the dialog without taking any actions.</li> + <li>Help - displays this information.</li> + </ul> +</p> + + <hr> + <address><a href="mailto:fo...@ns...">Ron Fox</a></address> +<!-- Created: Fri Dec 24 08:18:55 EST 2010 --> +<!-- hhmts start --> +Last modified: Fri Dec 24 08:27:11 EST 2010 +<!-- hhmts end --> + </body> +</html> Added: branches/LLNLMadcChainSpecTcl/filesource/options.c =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/options.c (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/options.c 2010-12-27 10:32:40 UTC (rev 1745) @@ -0,0 +1,609 @@ +/* + File autogenerated by gengetopt version 2.22.2 + generated with the following command: + gengetopt --input=options.ggo --file-name=options + + The developers of gengetopt consider the fixed text that goes in all + gengetopt output files to be in the public domain: + we make no copyright claims on it. +*/ + +/* If we use autoconf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#ifndef FIX_UNUSED +#define FIX_UNUSED(X) (void) (X) /* avoid warnings for unused params */ +#endif + +#include "getopt.h" + +#include "options.h" + +const char *gengetopt_args_info_purpose = "Analyze event data starting from a specific point "; + +const char *gengetopt_args_info_usage = "Usage: filesource [OPTIONS]..."; + +const char *gengetopt_args_info_description = ""; + +const char *gengetopt_args_info_help[] = { + " -h, --help Print help and exit", + " -V, --version Print version and exit", + " -s, --skip=INT Number of minutes to skip (default=`0')", + " -d, --duration=INT Number of minutes to analyze (default=`1000000000')", + " -b, --buffersize=INT Bytes in each buffer (default=`26656')", + " -i, --input=STRING Input event file", + 0 +}; + +typedef enum {ARG_NO + , ARG_STRING + , ARG_INT +} cmdline_parser_arg_type; + +static +void clear_given (struct gengetopt_args_info *args_info); +static +void clear_args (struct gengetopt_args_info *args_info); + +static int +cmdline_parser_internal (int argc, char * const *argv, struct gengetopt_args_info *args_info, + struct cmdline_parser_params *params, const char *additional_error); + +static int +cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error); + +static char * +gengetopt_strdup (const char *s); + +static +void clear_given (struct gengetopt_args_info *args_info) +{ + args_info->help_given = 0 ; + args_info->version_given = 0 ; + args_info->skip_given = 0 ; + args_info->duration_given = 0 ; + args_info->buffersize_given = 0 ; + args_info->input_given = 0 ; +} + +static +void clear_args (struct gengetopt_args_info *args_info) +{ + FIX_UNUSED (args_info); + args_info->skip_arg = 0; + args_info->skip_orig = NULL; + args_info->duration_arg = 1000000000; + args_info->duration_orig = NULL; + args_info->buffersize_arg = 26656; + args_info->buffersize_orig = NULL; + args_info->input_arg = NULL; + args_info->input_orig = NULL; + +} + +static +void init_args_info(struct gengetopt_args_info *args_info) +{ + + + args_info->help_help = gengetopt_args_info_help[0] ; + args_info->version_help = gengetopt_args_info_help[1] ; + args_info->skip_help = gengetopt_args_info_help[2] ; + args_info->duration_help = gengetopt_args_info_help[3] ; + args_info->buffersize_help = gengetopt_args_info_help[4] ; + args_info->input_help = gengetopt_args_info_help[5] ; + +} + +void +cmdline_parser_print_version (void) +{ + printf ("%s %s\n", + (strlen(CMDLINE_PARSER_PACKAGE_NAME) ? CMDLINE_PARSER_PACKAGE_NAME : CMDLINE_PARSER_PACKAGE), + CMDLINE_PARSER_VERSION); +} + +static void print_help_common(void) { + cmdline_parser_print_version (); + + if (strlen(gengetopt_args_info_purpose) > 0) + printf("\n%s\n", gengetopt_args_info_purpose); + + if (strlen(gengetopt_args_info_usage) > 0) + printf("\n%s\n", gengetopt_args_info_usage); + + printf("\n"); + + if (strlen(gengetopt_args_info_description) > 0) + printf("%s\n\n", gengetopt_args_info_description); +} + +void +cmdline_parser_print_help (void) +{ + int i = 0; + print_help_common(); + while (gengetopt_args_info_help[i]) + printf("%s\n", gengetopt_args_info_help[i++]); +} + +void +cmdline_parser_init (struct gengetopt_args_info *args_info) +{ + clear_given (args_info); + clear_args (args_info); + init_args_info (args_info); +} + +void +cmdline_parser_params_init(struct cmdline_parser_params *params) +{ + if (params) + { + params->override = 0; + params->initialize = 1; + params->check_required = 1; + params->check_ambiguity = 0; + params->print_errors = 1; + } +} + +struct cmdline_parser_params * +cmdline_parser_params_create(void) +{ + struct cmdline_parser_params *params = + (struct cmdline_parser_params *)malloc(sizeof(struct cmdline_parser_params)); + cmdline_parser_params_init(params); + return params; +} + +static void +free_string_field (char **s) +{ + if (*s) + { + free (*s); + *s = 0; + } +} + + +static void +cmdline_parser_release (struct gengetopt_args_info *args_info) +{ + + free_string_field (&(args_info->skip_orig)); + free_string_field (&(args_info->duration_orig)); + free_string_field (&(args_info->buffersize_orig)); + free_string_field (&(args_info->input_arg)); + free_string_field (&(args_info->input_orig)); + + + + clear_given (args_info); +} + + +static void +write_into_file(FILE *outfile, const char *opt, const char *arg, const char *values[]) +{ + FIX_UNUSED (values); + if (arg) { + fprintf(outfile, "%s=\"%s\"\n", opt, arg); + } else { + fprintf(outfile, "%s\n", opt); + } +} + + +int +cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info) +{ + int i = 0; + + if (!outfile) + { + fprintf (stderr, "%s: cannot dump options to stream\n", CMDLINE_PARSER_PACKAGE); + return EXIT_FAILURE; + } + + if (args_info->help_given) + write_into_file(outfile, "help", 0, 0 ); + if (args_info->version_given) + write_into_file(outfile, "version", 0, 0 ); + if (args_info->skip_given) + write_into_file(outfile, "skip", args_info->skip_orig, 0); + if (args_info->duration_given) + write_into_file(outfile, "duration", args_info->duration_orig, 0); + if (args_info->buffersize_given) + write_into_file(outfile, "buffersize", args_info->buffersize_orig, 0); + if (args_info->input_given) + write_into_file(outfile, "input", args_info->input_orig, 0); + + + i = EXIT_SUCCESS; + return i; +} + +int +cmdline_parser_file_save(const char *filename, struct gengetopt_args_info *args_info) +{ + FILE *outfile; + int i = 0; + + outfile = fopen(filename, "w"); + + if (!outfile) + { + fprintf (stderr, "%s: cannot open file for writing: %s\n", CMDLINE_PARSER_PACKAGE, filename); + return EXIT_FAILURE; + } + + i = cmdline_parser_dump(outfile, args_info); + fclose (outfile); + + return i; +} + +void +cmdline_parser_free (struct gengetopt_args_info *args_info) +{ + cmdline_parser_release (args_info); +} + +/** @brief replacement of strdup, which is not standard */ +char * +gengetopt_strdup (const char *s) +{ + char *result = 0; + if (!s) + return result; + + result = (char*)malloc(strlen(s) + 1); + if (result == (char*)0) + return (char*)0; + strcpy(result, s); + return result; +} + +int +cmdline_parser (int argc, char * const *argv, struct gengetopt_args_info *args_info) +{ + return cmdline_parser2 (argc, argv, args_info, 0, 1, 1); +} + +int +cmdline_parser_ext (int argc, char * const *argv, struct gengetopt_args_info *args_info, + struct cmdline_parser_params *params) +{ + int result; + result = cmdline_parser_internal (argc, argv, args_info, params, 0); + + if (result == EXIT_FAILURE) + { + cmdline_parser_free (args_info); + exit (EXIT_FAILURE); + } + + return result; +} + +int +cmdline_parser2 (int argc, char * const *argv, struct gengetopt_args_info *args_info, int override, int initialize, int check_required) +{ + int result; + struct cmdline_parser_params params; + + params.override = override; + params.initialize = initialize; + params.check_required = check_required; + params.check_ambiguity = 0; + params.print_errors = 1; + + result = cmdline_parser_internal (argc, argv, args_info, ¶ms, 0); + + if (result == EXIT_FAILURE) + { + cmdline_parser_free (args_info); + exit (EXIT_FAILURE); + } + + return result; +} + +int +cmdline_parser_required (struct gengetopt_args_info *args_info, const char *prog_name) +{ + int result = EXIT_SUCCESS; + + if (cmdline_parser_required2(args_info, prog_name, 0) > 0) + result = EXIT_FAILURE; + + if (result == EXIT_FAILURE) + { + cmdline_parser_free (args_info); + exit (EXIT_FAILURE); + } + + return result; +} + +int +cmdline_parser_required2 (struct gengetopt_args_info *args_info, const char *prog_name, const char *additional_error) +{ + FIX_UNUSED (additional_error); + int error = 0; + + /* checks for required options */ + if (! args_info->input_given) + { + fprintf (stderr, "%s: '--input' ('-i') option required%s\n", prog_name, (additional_error ? additional_error : "")); + error = 1; + } + + + /* checks for dependences among options */ + + return error; +} + + +static char *package_name = 0; + +/** + * @brief updates an option + * @param field the generic pointer to the field to update + * @param orig_field the pointer to the orig field + * @param field_given the pointer to the number of occurrence of this option + * @param prev_given the pointer to the number of occurrence already seen + * @param value the argument for this option (if null no arg was specified) + * @param possible_values the possible values for this option (if specified) + * @param default_value the default value (in case the option only accepts fixed values) + * @param arg_type the type of this option + * @param check_ambiguity @see cmdline_parser_params.check_ambiguity + * @param override @see cmdline_parser_params.override + * @param no_free whether to free a possible previous value + * @param multiple_option whether this is a multiple option + * @param long_opt the corresponding long option + * @param short_opt the corresponding short option (or '-' if none) + * @param additional_error possible further error specification + */ +static +int update_arg(void *field, char **orig_field, + unsigned int *field_given, unsigned int *prev_given, + char *value, const char *possible_values[], + const char *default_value, + cmdline_parser_arg_type arg_type, + int check_ambiguity, int override, + int no_free, int multiple_option, + const char *long_opt, char short_opt, + const char *additional_error) +{ + FIX_UNUSED (field); + char *stop_char = 0; + const char *val = value; + int found; + char **string_field; + + stop_char = 0; + found = 0; + + if (!multiple_option && prev_given && (*prev_given || (check_ambiguity && *field_given))) + { + if (short_opt != '-') + fprintf (stderr, "%s: `--%s' (`-%c') option given more than once%s\n", + package_name, long_opt, short_opt, + (additional_error ? additional_error : "")); + else + fprintf (stderr, "%s: `--%s' option given more than once%s\n", + package_name, long_opt, + (additional_error ? additional_error : "")); + return 1; /* failure */ + } + + FIX_UNUSED (default_value); + + if (field_given && *field_given && ! override) + return 0; + if (prev_given) + (*prev_given)++; + if (field_given) + (*field_given)++; + if (possible_values) + val = possible_values[found]; + + switch(arg_type) { + case ARG_INT: + if (val) *((int *)field) = strtol (val, &stop_char, 0); + break; + case ARG_STRING: + if (val) { + string_field = (char **)field; + if (!no_free && *string_field) + free (*string_field); /* free previous string */ + *string_field = gengetopt_strdup (val); + } + break; + default: + break; + }; + + /* check numeric conversion */ + switch(arg_type) { + case ARG_INT: + if (val && !(stop_char && *stop_char == '\0')) { + fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val); + return 1; /* failure */ + } + break; + default: + ; + }; + + /* store the original value */ + switch(arg_type) { + case ARG_NO: + break; + default: + if (value && orig_field) { + if (no_free) { + *orig_field = value; + } else { + if (*orig_field) + free (*orig_field); /* free previous string */ + *orig_field = gengetopt_strdup (value); + } + } + }; + + return 0; /* OK */ +} + + +int +cmdline_parser_internal ( + int argc, char * const *argv, struct gengetopt_args_info *args_info, + struct cmdline_parser_params *params, const char *additional_error) +{ + int c; /* Character of the parsed option. */ + + int error = 0; + struct gengetopt_args_info local_args_info; + + int override; + int initialize; + int check_required; + int check_ambiguity; + + package_name = argv[0]; + + override = params->override; + initialize = params->initialize; + check_required = params->check_required; + check_ambiguity = params->check_ambiguity; + + if (initialize) + cmdline_parser_init (args_info); + + cmdline_parser_init (&local_args_info); + + optarg = 0; + optind = 0; + opterr = params->print_errors; + optopt = '?'; + + while (1) + { + int option_index = 0; + + static struct option long_options[] = { + { "help", 0, NULL, 'h' }, + { "version", 0, NULL, 'V' }, + { "skip", 1, NULL, 's' }, + { "duration", 1, NULL, 'd' }, + { "buffersize", 1, NULL, 'b' }, + { "input", 1, NULL, 'i' }, + { 0, 0, 0, 0 } + }; + + c = getopt_long (argc, argv, "hVs:d:b:i:", long_options, &option_index); + + if (c == -1) break; /* Exit from `while (1)' loop. */ + + switch (c) + { + case 'h': /* Print help and exit. */ + cmdline_parser_print_help (); + cmdline_parser_free (&local_args_info); + exit (EXIT_SUCCESS); + + case 'V': /* Print version and exit. */ + cmdline_parser_print_version (); + cmdline_parser_free (&local_args_info); + exit (EXIT_SUCCESS); + + case 's': /* Number of minutes to skip. */ + + + if (update_arg( (void *)&(args_info->skip_arg), + &(args_info->skip_orig), &(args_info->skip_given), + &(local_args_info.skip_given), optarg, 0, "0", ARG_INT, + check_ambiguity, override, 0, 0, + "skip", 's', + additional_error)) + goto failure; + + break; + case 'd': /* Number of minutes to analyze. */ + + + if (update_arg( (void *)&(args_info->duration_arg), + &(args_info->duration_orig), &(args_info->duration_given), + &(local_args_info.duration_given), optarg, 0, "1000000000", ARG_INT, + check_ambiguity, override, 0, 0, + "duration", 'd', + additional_error)) + goto failure; + + break; + case 'b': /* Bytes in each buffer. */ + + + if (update_arg( (void *)&(args_info->buffersize_arg), + &(args_info->buffersize_orig), &(args_info->buffersize_given), + &(local_args_info.buffersize_given), optarg, 0, "26656", ARG_INT, + check_ambiguity, override, 0, 0, + "buffersize", 'b', + additional_error)) + goto failure; + + break; + case 'i': /* Input event file. */ + + + if (update_arg( (void *)&(args_info->input_arg), + &(args_info->input_orig), &(args_info->input_given), + &(local_args_info.input_given), optarg, 0, 0, ARG_STRING, + check_ambiguity, override, 0, 0, + "input", 'i', + additional_error)) + goto failure; + + break; + + case 0: /* Long option with no short option */ + case '?': /* Invalid option. */ + /* `getopt_long' already printed an error message. */ + goto failure; + + default: /* bug: option not considered. */ + fprintf (stderr, "%s: option unknown: %c%s\n", CMDLINE_PARSER_PACKAGE, c, (additional_error ? additional_error : "")); + abort (); + } /* switch */ + } /* while */ + + + + if (check_required) + { + error += cmdline_parser_required2 (args_info, argv[0], additional_error); + } + + cmdline_parser_release (&local_args_info); + + if ( error ) + return (EXIT_FAILURE); + + return 0; + +failure: + + cmdline_parser_release (&local_args_info); + return (EXIT_FAILURE); +} Added: branches/LLNLMadcChainSpecTcl/filesource/options.h =================================================================== --- branches/LLNLMadcChainSpecTcl/filesource/options.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/filesource/options.h 2010-12-27 10:32:40 UTC (rev 1745) @@ -0,0 +1,187 @@ +/** @file options.h + * @brief The header file for the command line option parser + * generated by GNU Gengetopt version 2.22.2 + * http://www.gnu.org/software/gengetopt. + * DO NOT modify this file, since it can be overwritten + * @author GNU Gengetopt by Lorenzo Bettini */ + +#ifndef OPTIONS_H +#define OPTIONS_H + +/* If we use autoconf. */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdio.h> /* for FILE */ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifndef CMDLINE_PARSER_PACKAGE +/** @brief the program name (used for printing errors) */ +#define CMDLINE_PARSER_PACKAGE "filesource" +#endif + +#ifndef CMDLINE_PARSER_PACKAGE_NAME +/** @brief the complete program name (used for help and version) */ +#define CMDLINE_PARSER_PACKAGE_NAME "filesource" +#endif + +#ifndef CMDLINE_PARSER_VERSION +/** @brief the program version */ +#define CMDLINE_PARSER_VERSION "1.0" +#endif + +/** @brief Where the command line options are stored */ +struct gengetopt_args_info +{ + const char *help_help; /**< @brief Print help and exit help description. */ + const char *version_help; /**< @brief Print version and exit help description. */ + int skip_arg; /**< @brief Number of minutes to skip (default='0'). */ + char * skip_orig; /**< @brief Number of minutes to skip original value given at command line. */ + const char *skip_help; /**< @brief Number of minutes to skip help description. */ + int duration_arg; /**< @brief Number of minutes to analyze (default='1000000000'). */ + char * duration_orig; /**< @brief Number of minutes to analyze original value given at command line. */ + const char *duration_help; /**< @brief Number of minutes to analyze help description. */ + int buffersize_arg; /**< @brief Bytes in each buffer (default='26656'). */ + char * buffersize_orig; /**< @brief Bytes in each buffer original value given at command line. */ + const char *buffersize_help; /**< @brief Bytes in each buffer help description. */ + char * input_arg; /**< @brief Input event file. */ + char * input_orig; /**< @brief Input event file original value given at command line. */ + const char *input_help; /**< @brief Input event file help description. */ + + unsigned int help_given ; /**< @brief Whether help was given. */ + unsigned int version_given ; /**< @brief Whether version was given. */ + unsigned int skip_given ; /**< @brief Whether skip was given. */ + unsigned int duration_given ; /**< @brief Whether duration was given. */ + unsigned int buffersize_given ; /**< @brief Whether buffersize was given. */ + unsigned int input_given ; /**< @brief Whether input was given. */ + +} ; + +/** @brief The additional parameters to pass to parser functions */ +struct cmdline_parser_params +{ + int override; /**< @brief whether to override possibly already present options (default 0) */ + int initialize; /**< @brief whether to initialize the option structure gengetopt_args_info (default 1) */ + int check_required; /**< @brief whether to check that all required options were provided (default 1) */ + int check_ambiguity; /**< @brief whether to check for options already specified in the option structure gengetopt_args_info (default 0) */ + int print_errors; /**< @brief whether getopt_long should print an error message for a bad option (default 1) */ +} ; + +/** @brief the purpose string of the program */ +extern const char *gengetopt_args_info_purpose; +/** @brief the usage string of the program */ +extern const char *gengetopt_args_info_usage; +/** @brief all the lines making the help output */ +extern const char *gengetopt_args_info_help[]; + +/** + * The command line parser + * @param argc the number of command line options + * @param argv the command line options + * @param args_info the structure where option information will be stored + * @return 0 if everything went fine, NON 0 if an error took place + */ +int cmdline_parser (int argc, char * const *argv, + struct gengetopt_args_info *args_info); + +/** + * The command line parser (version with additional parameters - deprecated) + * @param argc the number of command line options + * @param argv the command line options + * @param args_info the structure where option information will be stored + * @param override whether to override possibly already present options + * @param initialize whether to initialize the option structure my_args_info + * @param check_required whether to check that all required options were provided + * @return 0 if everything went fine, NON 0 if an error took place + * @deprecated use cmdline_parser_ext() instead + */ +int cmdline_parser2 (int argc, char * const *argv, + struct gengetopt_args_info *args_info, + int override, int initialize, int check_required); + +/** + * The command line parser (version with additional parameters) + * @param argc the number of command line options + * @param argv the command line options + * @param args_info the structure where option information will be stored + * @param params additional parameters for the parser + * @return 0 if everything went fine, NON 0 if an error took place + */ +int cmdline_parser_ext (int argc, char * const *argv, + struct gengetopt_args_info *args_info, + struct cmdline_parser_params *params); + +/** + * Save the contents of the option struct into an already open FILE stream. + * @param outfile the stream where to dump options + * @param args_info the option struct to dump + * @return 0 if everything went fine, NON 0 if an error took place + */ +int cmdline_parser_dump(FILE *outfile, + struct gengetopt_args_info *args_info); + +/** + * Save the contents of the option struct into a (text) file. + * This file can be read by the config file parser (if generated by gengetopt) + * @param filename the file where to save + * @param args_info the option struct to save + * @return 0 if everything went fine, NON 0 if an error took place + */ +int cmdline_parser_file_save(const char *filename, + struct gengetopt_args_info *args_info); + +/** + * Print the help + */ +void cmdline_parser_print_help(void); +/** + * Print the version + */ +void cmdline_parser_print_version(void); + +/** + * Initializes all the fields a cmdline_parser_params structure + * to their default values + * @param params the structure to initialize + */ +void cmdline_parser_params_init(struct cmdline_parser_params *params); + +/** + * Allocates dynamically a cmdline_parser_params structure and initializes + * all its fields to their default values + * @return the created and initialized cmdline_parser_params structure + */ +struct cmdline_parser_params *cmdline_parser_params_create(void); + +/** + * Initializes the passed gengetopt_args_info structure's fields + * (also set default values for options that have a default) + * @param args_info the structure to initialize + */ +void cmdline_parser_init (struct gengetopt_args_info *args_info); +/** + * Deallocates the string fields of the gengetopt_args_info structure + * (but does not deallocate the structure itself) + * @param args_info the structure to deallocate + */ +void cmdline_parser_free (struct gengetopt_args_info *args_info); + +/** + * Checks that all the required options were specified + * @param args_info the structure to check + * @param prog_name the name of the program that will be used to print + * possible errors + * @return + */ +int cmdline_parser_required (struct gengetopt_args_info *args_info, + const char *prog_name); + + +#ifdef __cplusplus +} +#endif /* __cplusplus */ +#endif /* OPTIONS_H */ Added: branches/LLNLMadcChainSpecTcl/onlinesource/datasource.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/onlinesource/datasource.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/onlinesource/datasource.tcl 2010-12-27 10:32:40 UTC (rev 1745) @@ -0,0 +1,86 @@ +# +# 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 +# +package provide datasource 1.0 +package require snit +package require Iwidgets +package require guiutilities +# +# Namespace to hold some of the configuration entries. +# +namespace eval datasourcens { + variable daqroot [list /usr/opt/daq/current /usr/opt/daq/8.1 /usr/opt/daq/8.0 /usr/opt/daq]; # Where the DAQ software is installed. + variable lasthost localhost; # Most recent online host. + variable lastformat nscl + variable lasteventfile {} + variable lastpipecommand {} + variable lastpipeargs {} + variable lastrunlist {} + variable runlistFiles {} + variable warnedFilters 0 + variable lastFilterFile {} + variable actualSpecTclDaq {} + variable here [file normalize [file dirname [info script]]] +} + +# datasourcens::findSpecTclDaq +# Locate the atual spectcldaq file. We try for it in the +# nscldaq roots described by daqroot, and if we can't find +# it there, we ask the user to browse for it. +# +proc datasourcens::findSpecTclDaq {} { + set datasourcens::actualSpecTclDaq [file join $datasourcens::here spectcldaq] + return $datasourcens::actualSpecTclDaq + + + +} +# +# attachOnline +# Attach to an online data source. +# datasourcens::daqroot is assumed to hold the installation +# root of an nscldaq installation and the bin subdir of that +# will have spectcldaq which is a pipe data source to the online system. +# We need to pop up a dialog to request the node from which we take data. +# +proc datasourcens::attachOnline {} { + hostprompt .hostprompt -host $::datasourcens::lasthost \ + -format $::datasourcens::lastformat \ + -buffersize $::GuiPrefs::preferences(defaultBuffersize) + .hostprompt modal + if {[winfo exists .hostprompt]} { + set host [.hostprompt cget -host] + + if {$host != ""} { + set format [.hostprompt cget -format] + + set ::datasourcens::lasthost $host + set ::datasourcens::lastformat $format + set size [.hostprompt cget -buffersize] + + set helper [datasourcens::findSpecTclDaq]; # [.hostprompt onlinehelper $host] + + catch stop + attach -format $format -size $size -pipe $helper tcp://$host:2602/ + set ::GuiPrefs::preferences(defaultBuffersize) $size + start + } + destroy .hostprompt + } +} + +proc nosampleSource {} { + .topmenu.source add command -label {Online unsampled} -command datasourcens::attachOnline +} This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-27 11:40:28
|
Revision: 1746 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1746&view=rev Author: ron-fox Date: 2010-12-27 11:40:22 +0000 (Mon, 27 Dec 2010) Log Message: ----------- Got this working Added Paths: ----------- branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp branches/LLNLMadcChainSpecTcl/CTotalMultCmd.h Added: branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp 2010-12-27 11:40:22 UTC (rev 1746) @@ -0,0 +1,79 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CTotalMultCmd.h" +#include <SpecTcl.h> +#include <TCLObject.h> +#include "CMultiplicity.h" +#include <TCLInterpreter.h> +#include <vector> + +using namespace std; + +/** + ** construction -- use the base class to register us as the command totalmult + ** @param interp - reference to the interpreter that we will be registered on. + */ +CTotalMultCmd::CTotalMultCmd(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, "totalmult", true) {} + +/** + ** Destruction is taken care of by the base class and the virutal-ness of this destructor. + */ +CTotalMultCmd::~CTotalMultCmd() {} + +/** + ** Execute the command + ** - ensure there are no extraneous command line arguments. + ** - get the SpecTcl API object. + ** - locate and cast the multiplicity event processor. + ** - Fish out the total multiplicity vector and marshall it as a list. + ** - set the command result and return. + ** @param interp - References the interpreter that is running our command. + ** @param objv - Vector of encapsulated Tcl_Obj*'s that is our parameter list. + ** @return int + ** @retval TCL_OK - Correct completion. + ** @retval TCL_ERROR - failed completion. + */ +int +CTotalMultCmd::operator()(CTCLInterpreter& interp, + vector<CTCLObject>& objv) +{ + if (objv.size() != 1) { + interp.setResult("totalmult - should not have any command arguments"); + return TCL_ERROR; + } + SpecTcl* pApi = SpecTcl::getInstance(); + CTclAnalyzer::EventProcessorIterator p = pApi->FindEventProcessor("Multiplicity"); + if (p == pApi->ProcessingPipelineEnd()) { + interp.setResult("totalmult - Failed to find the multiplicity event processor!"); + return TCL_ERROR; + } + + CMultiplicity *pEp = dynamic_cast<CMultiplicity*>(p->second); + + vector<unsigned> mult = pEp->getMultiplicityTotals(); + + CTCLObject result; + result.Bind(interp); + for (int i =0; i < mult.size(); i++) { + result += (double)mult[i]; + } + interp.setResult(result); + + return TCL_OK; +} Added: branches/LLNLMadcChainSpecTcl/CTotalMultCmd.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CTotalMultCmd.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/CTotalMultCmd.h 2010-12-27 11:40:22 UTC (rev 1746) @@ -0,0 +1,49 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CTOTALMULTCMD_H +#define __CTOTALMULTCMD_H + + +#ifndef _TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + +/** + ** The class below provides a command that returns as a list the + ** current multiplicity totals. These can then be plotted using + ** e.g. gnuplot. + */ + +class CTotalMultCmd : public CTCLObjectProcessor +{ + /* Canonicals */ +public: + CTotalMultCmd(CTCLInterpreter& interp); + virtual ~CTotalMultCmd(); +private: + CTotalMultCmd(const CTotalMultCmd&); + CTotalMultCmd& operator=(const CTotalMultCmd&); + int operator==(const CTotalMultCmd&) const; + int operator!=(const CTotalMultCmd&) const; + + /** implement the base class interface that makes us a command processor */ + +public: + int operator()(CTCLInterpreter& interp, + STD(vector)<CTCLObject>& objv); +}; +#endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-27 11:40:51
|
Revision: 1747 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1747&view=rev Author: ron-fox Date: 2010-12-27 11:40:44 +0000 (Mon, 27 Dec 2010) Log Message: ----------- Added ability to get total multiplicity array. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-12-27 11:40:22 UTC (rev 1746) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-12-27 11:40:44 UTC (rev 1747) @@ -50,6 +50,7 @@ m_timestamp("timestamp"), m_moduleID("moduleID"), m_bankNo("bankNo"), + m_currentCycle(0), m_initialized(false) { } @@ -137,11 +138,13 @@ // Clear/release the various data that we will use to accumulate multiplicities and multiplicity // sums: // + m_fragmentQueues.clear(); // All the fragment queues must be empty by definition. + m_Histogram.clear(); + delete []m_currentCycle; m_currentCycleNumber = 0; m_currentCycle = new uint32_t[(int)((double)m_bins)]; memset(m_currentCycle, 0, m_bins * sizeof(uint32_t)); - m_Histogram.clear(); // Set up the fragment queues: @@ -206,11 +209,9 @@ writeMultiplicityData(filename, comment); - // Cleanup data: + // Cleanup data-- done in begin so that we can fish out data between runs if needed. - m_fragmentQueues.clear(); // All the fragment queues must be empty by definition. - m_Histogram.clear(); - delete []m_currentCycle; + m_initialized = false; } @@ -1002,3 +1003,27 @@ } m_currentCycle[bin] += count; // Add to the neutron count for this bin. } +/*--------------------------------------------------------------------------- +** Query functions, used by plotting e.g. +----------------------------------------------------------------------------*/ +/* +** Return a multiplicity histogram. +** e.g. total number of zeroes, 1's two's etc. in the histogram. +** @return vector<unsigned> +*/ +vector<unsigned> +CMultiplicity::getMultiplicityTotals() +{ + vector<unsigned> result; + for(int i =0; i < m_Histogram.size(); i++) { + for(int j = 0; j < m_Histogram[i].size(); j++) { + unsigned neutrons = m_Histogram[i][j]; + while (result.size() <= j) { + result.push_back(0); + } + result[j] += neutrons; + } + } + + return result; +} Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-12-27 11:40:22 UTC (rev 1746) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-12-27 11:40:44 UTC (rev 1747) @@ -166,6 +166,12 @@ CEvent& rEvent, CAnalyzer& rAnalyzer, CBufferDecoder& rDecoder); + /** + ** Query functions. - These functions allow you to fish out + */ + + std::vector<unsigned> getMultiplicityTotals(); + // Utitities: private: void saveTreeVariables(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2010-12-27 12:54:00
|
Revision: 1749 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1749&view=rev Author: ron-fox Date: 2010-12-27 12:53:53 +0000 (Mon, 27 Dec 2010) Log Message: ----------- Multiplicity plot Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.h branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2010-12-27 11:41:04 UTC (rev 1748) +++ branches/LLNLMadcChainSpecTcl/Makefile 2010-12-27 12:53:53 UTC (rev 1749) @@ -29,7 +29,8 @@ 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 CMultiplicity.o \ + CTotalMultCmd.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.h =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.h 2010-12-27 11:41:04 UTC (rev 1748) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.h 2010-12-27 12:53:53 UTC (rev 1749) @@ -306,6 +306,7 @@ #include "TclGrammerApp.h" #endif + class CMySpecTclApp : public CTclGrammerApp { public: // Constructors: Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-27 11:41:04 UTC (rev 1748) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-27 12:53:53 UTC (rev 1749) @@ -127,7 +127,7 @@ # Put this is on the button bar.. # button .multgates -text {Neutron Gates} -command [list promptMultiplicityGates .mult] -pack .multgates +pack .multgates -fill x -expand 1 # # And the gates menu: # @@ -153,4 +153,14 @@ puts -nonewline "Loading unsampled event source" source [file join $here onlinesource datasource.tcl] nosampleSource +puts done + +# +# Add plotting: +# + +puts -nonewline "Adding plotting interface.." +source [file join $here plotTotalMult.tcl] +button .ptotal -text {TotalMult} -command [list totalMultiplicity .tm] +pack .ptotal -fill x -expand 1 puts done \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl 2010-12-27 12:53:53 UTC (rev 1749) @@ -0,0 +1,175 @@ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + + +package require Tk +package require snit + +# +# This file contains code that allows the value from totalmult to be plotted via gnuplot. +# +# The following dialog controls the plot +# +# +-----------------------------------------+ +# | [ ] Log scale | +# | ( ) View ( ) Postscript | +# | X title [Neutrons ] | +# | Y title [Frequency ] | +# | Title [Total multiplicity] | +# +-----------------------------------------+ +# | [PLOT] [CANCEL] | +# +-----------------------------------------+ +# +# +# +# Defaults are held in typevariables. + + +snit::widget totalMultiplicity { + hulltype toplevel + # + # This holds the defaults between invocations + # + typevariable defaultLogScale 0 + typevariable defaultPostscript 0 + typevariable defaultXtitle {Number of neutrons} + typevariable defaultYtitle {Frequency} + typevariable defaultTitle {Neutron multiplicity} + + # The following will be used for the same during the life of the dialog + + variable logScale + variable postscript + variable Xtitle + variable Ytitle + variable title + + constructor args { + # + # build the widgets: + # + set work [ttk::frame $win.work] + + ttk::checkbutton $work.log -text {Log Scale} -variable [myvar logScale] + ttk::radiobutton $work.screen -text {View} -variable [myvar postscript] -value 0 + ttk::radiobutton $work.postscript -text {Postscript} -variable [myvar postscript] -value 1 + ttk::label $work.xtitlel -text {X title} + ttk::entry $work.xtitle -textvariable [myvar Xtitle] -width 20 + ttk::label $work.ytitlel -text {Y title} + ttk::entry $work.ytitle -textvariable [myvar Ytitle] -width 20 + ttk::label $work.titlel -text {Title} + ttk::entry $work.title -textvariable [myvar title] -width 20 + + ttk::frame $win.actions -relief groove -borderwidth 3 + ttk::button $win.actions.plot -text {Plot} -command [mymethod plot] + ttk::button $win.actions.cancel -text {Cancel} -command [mymethod cancel] + + # + # Layout: + # + + grid $work.log -sticky w + grid $work.screen $work.postscript -sticky w + grid $work.xtitlel $work.xtitle -sticky w + grid $work.ytitlel $work.ytitle -sticky w + grid $work.titlel $work.title -sticky w + + grid $work -sticky ew + + grid $win.actions.plot -sticky w + grid $win.actions.cancel -sticky e -row 0 -column 1 + + grid $win.actions -sticky ew + + + #Load the defaults + + set logScale $defaultLogScale + set postscript $defaultPostscript + set Xtitle $defaultXtitle + set Ytitle $defaultYtitle + set title $defaultTitle + } + + # Cancel just destroys us. + + method cancel {} { + destroy $win + } + + # Plot the multiplicity + # this means + # - creating the data file from the totalmult command result. + # - firing up gnuplot on a pipe. + # - figuring out the script to feed it. + # - Updating the default values. + # - destroying ourself + # + method plot {} { + set mult [totalmult] + set dataFile [exec mktemp] + set df [open $dataFile w] + set n 0 + foreach value $mult { + puts $df "$n $value" + incr n + } + close $df + + set gp [open |gnuplot w] + + if {$postscript} { + set outputFile [tk_getSaveFile \ + -defaultextension .ps \ + -title {Output file} \ + -filetypes { + {{Postscript} {.ps} } + {{All files} * } + } + ] + # + # An emtpy filename means he wants to reconsider the settings: + + if {$outputFile eq ""} return + puts $gp "set size 1.0, 0.6" + puts $gp "set terminal postscript portrait enhanced mono dashed lw 1 'Helvetica' 14" + puts $gp "set output '$outputFile'" + } + + puts $gp "set title '$title'" + puts $gp "set xlabel '$Xtitle'" + puts $gp "set ylabel '$Ytitle'" + if {$logScale} { + puts $gp "set logscale y" + } + puts $gp "plot '$dataFile' with linespoints" + puts $gp "pause mouse button3 'Click right mouse button in window to close'" + flush $gp + fconfigure $gp -blocking 0 + close $gp + + if {$postscript} { + exec gv $outputFile & + } + + set defaultLogScale $logScale + set defaultPostscript $postscript + set defaultXtitle $Xtitle + set defaultYtitle $Ytitle + set defaultTitle $title + + destroy $win + } + +} \ 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...> - 2010-12-27 15:18:11
|
Revision: 1750 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1750&view=rev Author: ron-fox Date: 2010-12-27 15:18:04 +0000 (Mon, 27 Dec 2010) Log Message: ----------- Mult vs. bin plotting done. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl/CGetMultCmd.cpp branches/LLNLMadcChainSpecTcl/CGetMultCmd.h branches/LLNLMadcChainSpecTcl/plotMultBins.tcl Added: branches/LLNLMadcChainSpecTcl/CGetMultCmd.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CGetMultCmd.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/CGetMultCmd.cpp 2010-12-27 15:18:04 UTC (rev 1750) @@ -0,0 +1,93 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CGetMultCmd.h" +#include <SpecTcl.h> +#include <TCLObject.h> +#include "CMultiplicity.h" +#include <TCLInterpreter.h> +#include <vector> + +using namespace std; + +/** + ** construction -- use the base class to register us as the command totalmult + ** @param interp - reference to the interpreter that we will be registered on. + */ +CGetMultCmd::CGetMultCmd(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, "getmult", true) {} + +/** + ** Destruction is all handled by the base class. + */ +CGetMultCmd::~CGetMultCmd() {} + +/** + ** execute the command... we need a single + ** integer parameter. The desired multiplicity. + ** @param interp - The interpreter executing this command. + ** @param objv - Vector of encapsulated Tcl_Obj* objects that make up our command line. + ** @return int + ** @retval TCL_OK - Correct execution. + ** @retval TCL_ERROR - execution failed in some way. + */ + +int +CGetMultCmd::operator()(CTCLInterpreter& interp, + vector<CTCLObject>& objv) +{ + // Should be one integer parameter only: + + if (objv.size() != 2) { + interp.setResult("getmult - wrong number of parameters"); + return TCL_ERROR; + } + objv[1].Bind(interp); + int multiplicity; + try { + multiplicity = objv[1]; + } + catch(...) { + interp.setResult("getmult - non integer parameter!"); + return TCL_ERROR; + } + + /** We need to get and cast the event processor so we can fish the data from it */ + + SpecTcl* pApi = SpecTcl::getInstance(); + CTclAnalyzer::EventProcessorIterator p = pApi->FindEventProcessor("Multiplicity"); + + if (p == pApi->ProcessingPipelineEnd()) { + interp.setResult("getmult - failed to find the multiplicity event processor"); + return TCL_ERROR; + } + + CMultiplicity* pEp = dynamic_cast<CMultiplicity*>(p->second); + vector<unsigned> info = pEp->getSpecificMultiplicity(multiplicity); + + // Marshall info into a list...set it as the result and return TCL_OK: + + CTCLObject result; + result.Bind(interp); + + for(int i =0; i < info.size(); i++) { + result += (double)info[i]; + } + interp.setResult(result); + return TCL_OK; + +} Added: branches/LLNLMadcChainSpecTcl/CGetMultCmd.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CGetMultCmd.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/CGetMultCmd.h 2010-12-27 15:18:04 UTC (rev 1750) @@ -0,0 +1,54 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CGETMULTCMD_H +#define __CGETMULTCMD_H + +#ifndef _TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + +/** + ** The class below provides a command that returns as a list the + ** number of occurences of a specific multiplicity as a function of cycle number. + ** \verbatim + ** Usage: + ** getmult n + ** Where: + ** n is the desired multiplicity. + ** + */ +class CGetMultCmd : public CTCLObjectProcessor +{ + /* canonicals */ +public: + CGetMultCmd(CTCLInterpreter& interp); + virtual ~CGetMultCmd(); + +private: + CGetMultCmd(const CGetMultCmd&); + CGetMultCmd& operator=(const CGetMultCmd&); + int operator==(const CGetMultCmd&) const; + int operator!=(const CGetMultCmd&) const; + + /** Implement the base class interface that makes us a command processor */ + +public: + int operator()(CTCLInterpreter& interp, + STD(vector)<CTCLObject>& objv); +}; + +#endif Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-12-27 12:53:53 UTC (rev 1749) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2010-12-27 15:18:04 UTC (rev 1750) @@ -989,6 +989,8 @@ * to the final histogram. * @param pFrag - Pointer to the event fragment */ + +static int debugcount = 0; void CMultiplicity::histogramFragment(pEventFragment pFrag) { @@ -999,6 +1001,7 @@ // If necessary flush the current cycle: if (cycle != m_currentCycleNumber) { + debugcount++; dumpCycle(cycle); // Should be > but maybe cycles can wrap(?) } m_currentCycle[bin] += count; // Add to the neutron count for this bin. @@ -1006,7 +1009,7 @@ /*--------------------------------------------------------------------------- ** Query functions, used by plotting e.g. ----------------------------------------------------------------------------*/ -/* +/** ** Return a multiplicity histogram. ** e.g. total number of zeroes, 1's two's etc. in the histogram. ** @return vector<unsigned> @@ -1027,3 +1030,20 @@ return result; } + +/** + ** return frequency as a function of cycle for a specified multiplicity. + ** @param n - Number of neutrons. + */ +vector<unsigned> +CMultiplicity::getSpecificMultiplicity(int n) +{ + vector <unsigned> result; + for (int bin = 0; bin < m_Histogram.size(); bin++) { + result.push_back(0); + if(m_Histogram[bin].size() > n) { // If we have an element it might be nonzero: + result[bin] = m_Histogram[bin][n]; + } + } + return result; +} Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-12-27 12:53:53 UTC (rev 1749) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2010-12-27 15:18:04 UTC (rev 1750) @@ -171,6 +171,7 @@ */ std::vector<unsigned> getMultiplicityTotals(); + std::vector<unsigned> getSpecificMultiplicity(int n); // Utitities: private: Modified: branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp 2010-12-27 12:53:53 UTC (rev 1749) +++ branches/LLNLMadcChainSpecTcl/CTotalMultCmd.cpp 2010-12-27 15:18:04 UTC (rev 1750) @@ -64,7 +64,7 @@ return TCL_ERROR; } - CMultiplicity *pEp = dynamic_cast<CMultiplicity*>(p->second); + CMultiplicity* pEp = dynamic_cast<CMultiplicity*>(p->second); vector<unsigned> mult = pEp->getMultiplicityTotals(); @@ -75,5 +75,6 @@ } interp.setResult(result); + return TCL_OK; } Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2010-12-27 12:53:53 UTC (rev 1749) +++ branches/LLNLMadcChainSpecTcl/Makefile 2010-12-27 15:18:04 UTC (rev 1750) @@ -30,7 +30,7 @@ CStackMapCommand.o CModuleUnpacker.o C785Unpacker.o CNADC2530Unpacker.o \ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ - CTotalMultCmd.o + CTotalMultCmd.o CGetMultCmd.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2010-12-27 12:53:53 UTC (rev 1749) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2010-12-27 15:18:04 UTC (rev 1750) @@ -38,6 +38,7 @@ #include "CRateEventProcessor.h" #include "CFitButton.h" #include "CTotalMultCmd.h" +#include "CGetMultCmd.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -313,7 +314,8 @@ new CParamMapCommand(rInterp); // Map parameters for a stack. new CStackMapCommand(rInterp); // Map stacks -> parameters. new CRateCommand(rInterp); // Allow computation of spectrum increment rates. - new CTotalMultCmd(rInterp); + new CTotalMultCmd(rInterp); // Get total multiplicity histogram. + new CGetMultCmd(rInterp); // Get individual multiplicity as function of cycles. } // Function: Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-27 12:53:53 UTC (rev 1749) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2010-12-27 15:18:04 UTC (rev 1750) @@ -163,4 +163,9 @@ 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 + puts done \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl/plotMultBins.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotMultBins.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/plotMultBins.tcl 2010-12-27 15:18:04 UTC (rev 1750) @@ -0,0 +1,178 @@ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + + +package require Tk +package require snit + +# +# Provides a UI and code to plot specific multiplicities as a function +# of bin. +# + +# +# The UI looks like: +# +# +-------------------------------------------------+ +# | [num]^ - Multiplicity | +# | ( ) view ( ) Postscript | +# | X title [Bin number] | +# | Y Title [Frequency ] | +# | Title [%d multiplicity by bin] | +# +-------------------------------------------------+ +# |[Plot] [Cancel] | +# +-------------------------------------------------+ +# +# + +snit::widget plotMultBins { + hulltype toplevel + + # + # This holds the defaults between invocations + # + typevariable defaultMult 1 + typevariable defaultLogScale 0 + typevariable defaultPostscript 0 + typevariable defaultXtitle {Bin number} + typevariable defaultYtitle {Frequency} + typevariable defaultTitle {Multiplicity %d by bin} + + # The following will be used for the same during the life of the dialog + + variable multiplicity + variable logScale + variable postscript + variable Xtitle + variable Ytitle + variable title + + constructor args { + # + # Build the widgets + # + set work [ttk::frame $win.work] + + spinbox $work.mult -textvariable [myvar multiplicity] \ + -from 0 -to 100 + ttk::label $work.multl -text {Multiplicity} + ttk::checkbutton $work.log -text {Log Scale} -variable [myvar logScale] + ttk::radiobutton $work.screen -text {View} -variable [myvar postscript] -value 0 + ttk::radiobutton $work.postscript -text {Postscript} -variable [myvar postscript] -value 1 + ttk::label $work.xtitlel -text {X title} + ttk::entry $work.xtitle -textvariable [myvar Xtitle] -width 20 + ttk::label $work.ytitlel -text {Y title} + ttk::entry $work.ytitle -textvariable [myvar Ytitle] -width 20 + ttk::label $work.titlel -text {Title} + ttk::entry $work.title -textvariable [myvar title] -width 20 + + ttk::frame $win.actions -relief groove -borderwidth 3 + ttk::button $win.actions.plot -text {Plot} -command [mymethod plot] + ttk::button $win.actions.cancel -text {Cancel} -command [mymethod cancel] + + # + # Layout: + # + + grid $work.mult $work.multl -sticky w + grid $work.log -sticky w + grid $work.screen $work.postscript -sticky w + grid $work.xtitlel $work.xtitle -sticky w + grid $work.ytitlel $work.ytitle -sticky w + grid $work.titlel $work.title -sticky w + + grid $work -sticky ew + + grid $win.actions.plot -sticky w + grid $win.actions.cancel -sticky e -row 0 -column 1 + + grid $win.actions -sticky ew + + + #Load the defaults + + set logScale $defaultLogScale + set postscript $defaultPostscript + set Xtitle $defaultXtitle + set Ytitle $defaultYtitle + set title $defaultTitle + set multiplicity $defaultMult + } + + # + # Cancel just kills the widget: + # + method cancel {} { + destroy $win + } + # Plot plots and then destroys the widget. + # + method plot {} { + set data [getmult $multiplicity] + set dataFile [exec mktemp] + set df [open $dataFile w] + set n 0 + set plotTitle [format $title $multiplicity] + foreach value $data { + puts $df "$n $value" + incr n + } + close $df + + set gp [open |gnuplot w] + + if {$postscript} { + set outputFile [tk_getSaveFile \ + -defaultextension .ps \ + -title {Output file} \ + -filetypes { + {{Postscript} {.ps} } + {{All files} * } + } + ] + # + # An emtpy filename means he wants to reconsider the settings: + + if {$outputFile eq ""} return + puts $gp "set size 1.0, 0.6" + puts $gp "set terminal postscript portrait enhanced mono dashed lw 1 'Helvetica' 14" + puts $gp "set output '$outputFile'" + } + + puts $gp "set title '$plotTitle'" + puts $gp "set xlabel '$Xtitle'" + puts $gp "set ylabel '$Ytitle'" + if {$logScale} { + puts $gp "set logscale y" + } + puts $gp "plot '$dataFile' with linespoints" + puts $gp "pause mouse button3 'Click right mouse button in window to close'" + flush $gp + fconfigure $gp -blocking 0 + close $gp + + if {$postscript} { + exec gv $outputFile & + } + + set defaultLogScale $logScale + set defaultPostscript $postscript + set defaultXtitle $Xtitle + set defaultYtitle $Ytitle + set defaultTitle $title + set defaultMult $multiplicity + + destroy $win + } +} \ 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...> - 2011-01-14 12:08:13
|
Revision: 1787 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1787&view=rev Author: ron-fox Date: 2011-01-14 12:08:06 +0000 (Fri, 14 Jan 2011) Log Message: ----------- - Fix error in CMultiplicity - onOther was not returning a defined value. - Add exit to the end of gnuplot scripts. - Add plot specific multiplicity value - Fix initial rates.tcl to include spectra that exist. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl/plotMultBins.tcl branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl branches/LLNLMadcChainSpecTcl/rates.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.cpp branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.h branches/LLNLMadcChainSpecTcl/plotGateMult.tcl Added: branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.cpp 2011-01-14 12:08:06 UTC (rev 1787) @@ -0,0 +1,93 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CGetGateMultCmd.h" +#include <SpecTcl.h> +#include <TCLObject.h> +#include "CMultiplicity.h" +#include <TCLInterpreter.h> +#include <vector> + +using namespace std; + +/** + ** construction -- use the base class to register us as the command totalmult + ** @param interp - reference to the interpreter that we will be registered on. + */ +CGetGateMultCmd::CGetGateMultCmd(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, "gatemult", true) {} + +/** + ** Destruction is all handled by the base class. + */ +CGetGateMultCmd::~CGetGateMultCmd() {} + +/** + ** execute the command... we need a single + ** integer parameter. The desired multiplicity. + ** @param interp - The interpreter executing this command. + ** @param objv - Vector of encapsulated Tcl_Obj* objects that make up our command line. + ** @return int + ** @retval TCL_OK - Correct execution. + ** @retval TCL_ERROR - execution failed in some way. + */ + +int +CGetGateMultCmd::operator()(CTCLInterpreter& interp, + vector<CTCLObject>& objv) +{ + // Should be one integer parameter only: + + if (objv.size() != 2) { + interp.setResult("getmult - wrong number of parameters"); + return TCL_ERROR; + } + objv[1].Bind(interp); + int gate; + try { + gate = objv[1]; + } + catch(...) { + interp.setResult("getmult - non integer parameter!"); + return TCL_ERROR; + } + + /** We need to get and cast the event processor so we can fish the data from it */ + + SpecTcl* pApi = SpecTcl::getInstance(); + CTclAnalyzer::EventProcessorIterator p = pApi->FindEventProcessor("Multiplicity"); + + if (p == pApi->ProcessingPipelineEnd()) { + interp.setResult("getmult - failed to find the multiplicity event processor"); + return TCL_ERROR; + } + + CMultiplicity* pEp = dynamic_cast<CMultiplicity*>(p->second); + vector<unsigned> info = pEp->getGateMultiplicities(gate); + + // Marshall info into a list...set it as the result and return TCL_OK: + + CTCLObject result; + result.Bind(interp); + + for(int i =0; i < info.size(); i++) { + result += (double)info[i]; + } + interp.setResult(result); + return TCL_OK; + +} Added: branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/CGetGateMultCmd.h 2011-01-14 12:08:06 UTC (rev 1787) @@ -0,0 +1,54 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CGETGATEMULTCMD_H +#define __CGETGATEMULTCMD_H + +#ifndef _TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + +/** + ** The class below provides a command that returns as a list the + ** number of occurences of a specific multiplicity as a function of cycle number. + ** \verbatim + ** Usage: + ** getmult n + ** Where: + ** n is the desired multiplicity. + ** + */ +class CGetGateMultCmd : public CTCLObjectProcessor +{ + /* canonicals */ +public: + CGetGateMultCmd(CTCLInterpreter& interp); + virtual ~CGetGateMultCmd(); + +private: + CGetGateMultCmd(const CGetGateMultCmd&); + CGetGateMultCmd& operator=(const CGetGateMultCmd&); + int operator==(const CGetGateMultCmd&) const; + int operator!=(const CGetGateMultCmd&) const; + + /** Implement the base class interface that makes us a command processor */ + +public: + int operator()(CTCLInterpreter& interp, + STD(vector)<CTCLObject>& objv); +}; + +#endif Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-14 12:08:06 UTC (rev 1787) @@ -232,6 +232,8 @@ //TODO: The whole buffer skip thingy. + return kfTRUE; + } @@ -1030,6 +1032,22 @@ return result; } +/** + ** Return, for a given gate, the multiplicity histogram. + ** @param gate - gate number. + ** @return vector<unsigned> + */ +vector<unsigned> +CMultiplicity::getGateMultiplicities(int gate) +{ + vector<unsigned> result; + if (gate < m_Histogram.size()) { + for (int n = 0; n < m_Histogram[gate].size(); n++) { + result.push_back(m_Histogram[gate][n]); + } + } + return result; +} /** ** return frequency as a function of cycle for a specified multiplicity. Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2011-01-14 12:08:06 UTC (rev 1787) @@ -171,6 +171,7 @@ */ std::vector<unsigned> getMultiplicityTotals(); + std::vector<unsigned> getGateMultiplicities(int gate); std::vector<unsigned> getSpecificMultiplicity(int n); // Utitities: Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/Makefile 2011-01-14 12:08:06 UTC (rev 1787) @@ -30,7 +30,7 @@ CStackMapCommand.o CModuleUnpacker.o C785Unpacker.o CNADC2530Unpacker.o \ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ - CTotalMultCmd.o CGetMultCmd.o + CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-01-14 12:08:06 UTC (rev 1787) @@ -39,7 +39,9 @@ #include "CFitButton.h" #include "CTotalMultCmd.h" #include "CGetMultCmd.h" +#include "CGetGateMultCmd.h" + #ifdef HAVE_STD_NAMESPACE using namespace std; #endif @@ -316,6 +318,7 @@ new CRateCommand(rInterp); // Allow computation of spectrum increment rates. new CTotalMultCmd(rInterp); // Get total multiplicity histogram. new CGetMultCmd(rInterp); // Get individual multiplicity as function of cycles. + new CGetGateMultCmd(rInterp); } // Function: Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2011-01-14 12:08:06 UTC (rev 1787) @@ -168,4 +168,9 @@ 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 + + puts done \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl/plotGateMult.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotGateMult.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/plotGateMult.tcl 2011-01-14 12:08:06 UTC (rev 1787) @@ -0,0 +1,241 @@ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + + +package require Tk +package require snit + + +# This file contains code to plot the multiplicity histogram for a single +# time gate. +# +# The following control panel controls the plot: +# +# +-------------------------------------------------------------+ +# | [ ] log Scale | +# | ( ) View ( ) Postscript | +# | XTitle [Neutrons ] | +# | YTitle [Frequency ] | +# | Title [Multiplicity in gate %d] | +# | [nnn] ^V Gate | +# +-------------------------------------------------------------+ +# | [Plot] [Cancel] | +# +-------------------------------------------------------------+ +# +# Defaults are held in typevariables. + +snit::widget gateMultiplicity { + hulltype toplevel + # + # Default values for 'stuff' + # + typevariable defaultLogScale 0 + typevariable defaultPostscript 0 + typevariable defaultXtitle {Neutrons} + typevariable defaultYtitle {Frequency} + typevariable defaultTitle {Multiplicity in gate %d} + typevariable lastGateNumber 1 + + # The following hold the actual values through the life of the dialog + + variable logScale + variable postscript + variable Xtitle + variable Ytitle + variable title + variable gateNumber + + constructor args { + global multiplicity.bins + set gates ${multiplicity.bins} + + # + # Build the widgets: + # + + set work [ttk::frame $win.work -relief groove -borderwidth 3]; # Top frame with work controls + set action [ttk::frame $win.action]; # Bottom frame with action buttons. + + # Work area controls. + + ttk::checkbutton $work.log -text {Log Scale} -variable [myvar logScale] + ttk::radiobutton $work.screen -text {View} -variable [myvar postscript] -value 0 + ttk::radiobutton $work.postscript -text {Postscript} -variable [myvar postscript] -value 1 + ttk::label $work.xtitlel -text {X title} + ttk::entry $work.xtitle -textvariable [myvar Xtitle] + ttk::label $work.ytitlel -text {Y title} + ttk::entry $work.ytitle -textvariable [myvar Ytitle] + ttk::label $work.titlel -text {Plot Title} + ttk::entry $work.title -textvariable [myvar title] + spinbox $work.gate -from 1 -to $gates -increment 1 -wrap 1 -width 4 \ + -textvariable [myvar gateNumber] + ttk::label $work.gatel -text {Gate number} + + # Action area controls: + + ttk::button $action.plot -text {Plot} -command [mymethod plot] + ttk::button $action.cancel -text {Cancel} -command [mymethod cancel] + + # Layout the widgets + + grid $work.log -sticky w + grid $work.screen $work.postscript -sticky w + grid $work.xtitlel $work.xtitle -sticky w + grid $work.ytitlel $work.ytitle -sticky w + grid $work.titlel $work.title -sticky w + grid $work.gate $work.gatel -sticky w + + grid $action.plot $action.cancel + + grid $work -sticky ew + grid $action -sticky ew + + # Apply the defaults + + set logScale $defaultLogScale + set postscript $defaultPostscript + set Xtitle $defaultXtitle + set Ytitle $defaultYtitle + set title $defaultTitle + set gateNumber $lastGateNumber + + } + #------------------------- Action methods ------------------------------------- + + # + # cancel - called when the cancel action area button is clicked. + # $win is destroyed and no changes made to the typevariables. + # + method cancel {} { + after 100 [list destroy $win]; # Done to allow us exit before destruction. + } + # + # plot - Called when the Plot action area button is clicked. + # Validate the spinbox gate number. + # If the gate number is valid, create the plot. + # Update the typevariables from the widget values so that the next invocation will + # use current values as defaults. + # + method plot {} { + if {[$self validGate]} { + $self gnuPlot + $self updateDefaults + $self cancel; # Plot kills us. + } else { + tk_messageBox -icon error -parent $win -title {bad gate} \ + -message {Invalid gate number value} -type ok + } + } + #------------------------ utility methods ------------------------------------ + + # + # Determines if the gate value spinbox is valid + # The gate number must be a strict integer between + # 1 and multiplicity.bins inclusive. + # + method validGate {} { + global multiplicity.bins + set maxGate ${multiplicity.bins} + + if {![string is integer -strict $gateNumber]} { + return 0 + } + if {($gateNumber <1) || ($gateNumber > $maxGate) } { + return 0 + } + return 1 + } + # + # Open a pipe to GNU Plot and plot the data as specified by our member variables. + # The only special thing we do is to encode the title via format so that the + # gate number appears in the overall plot title. + # + # Assumptions: + # - gnuplot is in path. + # - the gatemult command will get the multiplicity information for a specified gate + # (numbered [0 - multiplicity.bins-1]). + method gnuPlot {} { + set gate $gateNumber + incr gate -1; # transform from human -> computer numbering. + + # Get the plot data and construct the title. + + set multInfo [gatemult $gate] + set plotTitle [format $title $gateNumber] + + # Construct the output file from the data: + + set dataFile [exec mktemp] + set df [open $dataFile w] + set mult 0 + foreach frequency $multInfo { + puts $df "$mult $frequency" + incr mult + } + close $df + + # Open Gnu plot on a pipe and tell it what to do: + # note that if we're making postscript we need to prompt for the + # output file and set the appropriate paramters in gnuplot for postscript + # output to that file: + + set gp [open |gnuplot w] + if {$postscript} { + set outputFile [tk_getSaveFile \ + -defaultextension .ps \ + -title {Output file} \ + -filetypes { + {{Postscript} {.ps} } + {{All files} * } + } + ] + # + # An emtpy filename means he wants to reconsider the settings: + + if {$outputFile eq ""} return + puts $gp "set size 1.0, 0.6" + puts $gp "set terminal postscript portrait enhanced mono dashed lw 1 'Helvetica' 14" + puts $gp "set output '$outputFile'" + } + puts $gp "set title '$plotTitle'" + puts $gp "set xlabel '$Xtitle'" + puts $gp "set ylabel '$Ytitle'" + if {$logScale} { + puts $gp "set logscale y" + } + puts $gp "plot '$dataFile' with linespoints" + puts $gp "pause mouse button3 'Click right mouse button in window to close'" + puts $gp "exit" + flush $gp + fconfigure $gp -blocking 0; # otherwise the close will hang until gnuplot exits. + close $gp + + if {$postscript} { + exec gv $outputFile & + } + + + + + } + method updateDefaults {} { + set defaultLogScale $logScale + set defaultPostscript $postscript + set defaultXtitle $Xtitle + set defaultYtitle $Ytitle + set defaultTitle $title + set lastGateNumber $lastGateNumber + } +} + Modified: branches/LLNLMadcChainSpecTcl/plotMultBins.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotMultBins.tcl 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/plotMultBins.tcl 2011-01-14 12:08:06 UTC (rev 1787) @@ -158,6 +158,7 @@ } puts $gp "plot '$dataFile' with linespoints" puts $gp "pause mouse button3 'Click right mouse button in window to close'" + puts $gp "exit" flush $gp fconfigure $gp -blocking 0 close $gp Modified: branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/plotTotalMult.tcl 2011-01-14 12:08:06 UTC (rev 1787) @@ -155,6 +155,7 @@ } puts $gp "plot '$dataFile' with linespoints" puts $gp "pause mouse button3 'Click right mouse button in window to close'" + puts $gp "exit" flush $gp fconfigure $gp -blocking 0 close $gp Modified: branches/LLNLMadcChainSpecTcl/rates.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/rates.tcl 2011-01-10 23:16:41 UTC (rev 1786) +++ branches/LLNLMadcChainSpecTcl/rates.tcl 2011-01-14 12:08:06 UTC (rev 1787) @@ -1,3 +1,3 @@ -rate create tdc.E.00 -rate create tdc.E.01 -rate create tdc.E.08 +rate create e.01 +rate create e.02 +rate create e.08 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2011-01-17 11:22:45
|
Revision: 1789 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1789&view=rev Author: ron-fox Date: 2011-01-17 11:22:39 +0000 (Mon, 17 Jan 2011) Log Message: ----------- Good compile on cbar and y2f computation. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-17 10:29:47 UTC (rev 1788) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-17 11:22:39 UTC (rev 1789) @@ -37,6 +37,22 @@ static const uint32_t WRAPADD(0x40000000); // Amount to add for a timestamp wrap. +/* compute factorial function used in ynf calculations */ + +static inline double +factorial(int n) +{ + if (n <= 1) { + return 1; // All the special cases for our purposes + } + double product = 1; + for (int i =2; i <= n; i++) { + product *= i; + } + return product; + +} + /*! Construction builds the tree parameters and what we can of the CTCLVariable. */ @@ -1070,3 +1086,49 @@ } return result; } +/** + ** compute the CBAR. For a given gate this is a weighted sum of the + ** multiplicities by the multiplicities dividec by the total number of events. + ** Raw data easily comes from the output of getGateMultiplicities. + ** @param gate - Number of the gate for which we want this value. + ** @return double + ** @retval cbar for the given gate. + */ +double +CMultiplicity::cbar(int gate) +{ + vector<unsigned> multiplicities = getGateMultiplicities(gate); + + double nbks = 0.0; + double numerator = 0.0; + for (int i =1; i < multiplicities.size(); i++) { + nbks += multiplicities[i]; + numerator += i*multiplicities[i]; + } + double cbar = numerator/nbks; // Really the centroid of the multiplicity distribution. + return cbar; +} + +/** + ** Calclate the y2f or the feynman variance of the multiplicity for gate n + ** @param gate - Gate number for which to calculate the y2f + ** @return double + ** @retval y2f. + */ +double +CMultiplicity::y2f(int gate) +{ + double cb = cbar(gate); + double pairs = 0.0; + if (cb == 0.0) return 0.0; // special case. + + vector<unsigned> mult = getGateMultiplicities(gate); + + + for (int i = 0; i < mult.size(); i++) { + double coef = factorial(i)/2*(factorial(i-2)); // for our purposes factorial won't be too big. + pairs += coef*mult[i]; + } + double result = (pairs - 0.5*cb*cb)/cb; + return result; +} Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2011-01-17 10:29:47 UTC (rev 1788) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2011-01-17 11:22:39 UTC (rev 1789) @@ -173,6 +173,8 @@ std::vector<unsigned> getMultiplicityTotals(); std::vector<unsigned> getGateMultiplicities(int gate); std::vector<unsigned> getSpecificMultiplicity(int n); + double cbar(int gate); + double y2f(int gate); // Utitities: private: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2011-01-17 11:54:55
|
Revision: 1790 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1790&view=rev Author: ron-fox Date: 2011-01-17 11:54:48 +0000 (Mon, 17 Jan 2011) Log Message: ----------- cbar command now works.. Templ;ates for y2f exist but must still be written. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp Added Paths: ----------- branches/LLNLMadcChainSpecTcl/CCbarCommand.cpp branches/LLNLMadcChainSpecTcl/CCbarCommand.h branches/LLNLMadcChainSpecTcl/CY2fCommand.cpp branches/LLNLMadcChainSpecTcl/CY2fCommand.h Added: branches/LLNLMadcChainSpecTcl/CCbarCommand.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CCbarCommand.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/CCbarCommand.cpp 2011-01-17 11:54:48 UTC (rev 1790) @@ -0,0 +1,84 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#include <config.h> +#include "CCbarCommand.h" +#include <SpecTcl.h> +#include <TCLObject.h> +#include "CMultiplicity.h" +#include <TCLInterpreter.h> +#include <vector> + +using namespace std; + +/** + ** construction -- use the base class to register us as the command totalmult + ** @param interp - reference to the interpreter that we will be registered on. + */ +CCbarCommand::CCbarCommand(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, "cbar", true) {} +/** + ** Destruction is all handled by the base class. + */ +CCbarCommand::~CCbarCommand() {} + +/** + ** execute the command... we need a single + ** integer parameter. The desired multiplicity. + ** @param interp - The interpreter executing this command. + ** @param objv - Vector of encapsulated Tcl_Obj* objects that make up our command line. + ** @return int + ** @retval TCL_OK - Correct execution. + ** @retval TCL_ERROR - execution failed in some way. + */ + +int +CCbarCommand::operator()(CTCLInterpreter& interp, + vector<CTCLObject>& objv) +{ + // There should be a single integer parameter. + + if (objv.size() != 2) { + interp.setResult("cbar - wrong number of parameters"); + return TCL_ERROR; + } + objv[1].Bind(interp); + int gate; + try { + gate = objv[1]; + } + catch(...) { + interp.setResult("cbar - gate number must be an integer"); + return TCL_ERROR; + } + /** We need to get and cast the event processor so we can fish the data from it */ + + SpecTcl* pApi = SpecTcl::getInstance(); + CTclAnalyzer::EventProcessorIterator p = pApi->FindEventProcessor("Multiplicity"); + + if (p == pApi->ProcessingPipelineEnd()) { + interp.setResult("getmult - failed to find the multiplicity event processor"); + return TCL_ERROR; + } + + CMultiplicity* pEp = dynamic_cast<CMultiplicity*>(p->second); + + CTCLObject result; + result.Bind(interp); + result = pEp->cbar(gate); + interp.setResult(result); + return TCL_OK; +} Added: branches/LLNLMadcChainSpecTcl/CCbarCommand.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CCbarCommand.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/CCbarCommand.h 2011-01-17 11:54:48 UTC (rev 1790) @@ -0,0 +1,54 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#ifndef __CCBARCOMMAND_H +#define __CCBARCOMMAND_H + +#ifndef _TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + +/** + ** The class below provides a comman to access the CMultiplicity event processor's + ** cbar function. That function returns the centroid of the multiplicity + ** distribution for a given gate. + ** Therefore the invocation is: + ** \verbatim + ** cbar n + ** \endverbatim + ** To get the CBAR for gate n. + */ +class CCbarCommand : public CTCLObjectProcessor +{ + /* canonicals */ +public: + CCbarCommand(CTCLInterpreter& interp); + virtual ~CCbarCommand(); + +private: + CCbarCommand(const CCbarCommand&); + CCbarCommand& operator=(const CCbarCommand&); + int operator==(const CCbarCommand&) const; + int operator!=(const CCbarCommand&) const; + + /** Implement the base class interface that makes us a command processor */ + +public: + int operator()(CTCLInterpreter& interp, + STD(vector)<CTCLObject>& objv); +}; + + +#endif Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-17 11:22:39 UTC (rev 1789) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-17 11:54:48 UTC (rev 1790) @@ -1105,6 +1105,7 @@ nbks += multiplicities[i]; numerator += i*multiplicities[i]; } + if (nbks == 0.0) return 0.0; double cbar = numerator/nbks; // Really the centroid of the multiplicity distribution. return cbar; } Added: branches/LLNLMadcChainSpecTcl/CY2fCommand.cpp =================================================================== Added: branches/LLNLMadcChainSpecTcl/CY2fCommand.h =================================================================== Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2011-01-17 11:22:39 UTC (rev 1789) +++ branches/LLNLMadcChainSpecTcl/Makefile 2011-01-17 11:54:48 UTC (rev 1790) @@ -30,7 +30,7 @@ CStackMapCommand.o CModuleUnpacker.o C785Unpacker.o CNADC2530Unpacker.o \ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ - CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o + CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-01-17 11:22:39 UTC (rev 1789) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-01-17 11:54:48 UTC (rev 1790) @@ -40,8 +40,8 @@ #include "CTotalMultCmd.h" #include "CGetMultCmd.h" #include "CGetGateMultCmd.h" +#include "CCbarCommand.h" - #ifdef HAVE_STD_NAMESPACE using namespace std; #endif @@ -319,6 +319,7 @@ new CTotalMultCmd(rInterp); // Get total multiplicity histogram. new CGetMultCmd(rInterp); // Get individual multiplicity as function of cycles. new CGetGateMultCmd(rInterp); + new CCbarCommand(rInterp); } // Function: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2011-01-19 10:36:20
|
Revision: 1792 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1792&view=rev Author: ron-fox Date: 2011-01-19 10:36:13 +0000 (Wed, 19 Jan 2011) Log Message: ----------- Add fitting to plotCBar and add a button for it in the button bar. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl/plotCbar.tcl Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2011-01-18 11:01:38 UTC (rev 1791) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2011-01-19 10:36:13 UTC (rev 1792) @@ -160,6 +160,10 @@ # 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 @@ -167,10 +171,13 @@ 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 puts done \ No newline at end of file Added: branches/LLNLMadcChainSpecTcl/plotCbar.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotCbar.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/plotCbar.tcl 2011-01-19 10:36:13 UTC (rev 1792) @@ -0,0 +1,215 @@ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + + +package require Tk +package require snit + + +# +# Code to plot CBAR as a function of time gate. +# +# The following control panel controls the plot: +# +# +--------------------------------------------------------------+ +# | [ ] Log Scale | +# | ( ) View ( ) Postscript | +# | XTitle [Gate ] | +# | YTitle [CBar ] | +# | Title [CBar v Gate ] | +# +--------------------------------------------------------------+ +# | [ Plot ] [ Cancel ] | +# +--------------------------------------------------------------+ + +snit::widget Cbar { + hulltype toplevel + # + # Default values for 'stuff' + # + typevariable defaultLogScale 0 + typevariable defaultPostscript 0 + typevariable defaultXtitle {Gate} + typevariable defaultYtitle {Cbar} + typevariable defaultTitle {Cbar vs. Gate} + + + # The following hold the actual values through the life of the dialog + + variable logScale + variable postscript + variable Xtitle + variable Ytitle + variable title + + + constructor args { + + + # + # Build the widgets: + # + + set work [ttk::frame $win.work -relief groove -borderwidth 3]; # Top frame with work controls + set action [ttk::frame $win.action]; # Bottom frame with action buttons. + + # Work area controls. + + ttk::checkbutton $work.log -text {Log Scale} -variable [myvar logScale] + ttk::radiobutton $work.screen -text {View} -variable [myvar postscript] -value 0 + ttk::radiobutton $work.postscript -text {Postscript} -variable [myvar postscript] -value 1 + ttk::label $work.xtitlel -text {X title} + ttk::entry $work.xtitle -textvariable [myvar Xtitle] + ttk::label $work.ytitlel -text {Y title} + ttk::entry $work.ytitle -textvariable [myvar Ytitle] + ttk::label $work.titlel -text {Plot Title} + ttk::entry $work.title -textvariable [myvar title] + + # Action area controls: + + ttk::button $action.plot -text {Plot} -command [mymethod plot] + ttk::button $action.cancel -text {Cancel} -command [mymethod cancel] + + # Layout the widgets + + grid $work.log -sticky w + grid $work.screen $work.postscript -sticky w + grid $work.xtitlel $work.xtitle -sticky w + grid $work.ytitlel $work.ytitle -sticky w + grid $work.titlel $work.title -sticky w + + grid $action.plot $action.cancel + + grid $work -sticky ew + grid $action -sticky ew + + # Apply the defaults + + set logScale $defaultLogScale + set postscript $defaultPostscript + set Xtitle $defaultXtitle + set Ytitle $defaultYtitle + set title $defaultTitle + + } + #------------------------- Action methods ------------------------------------- + + # + # cancel - called when the cancel action area button is clicked. + # $win is destroyed and no changes made to the typevariables. + # + method cancel {} { + after 100 [list destroy $win]; # Done to allow us exit before destruction. + } + # + # plot - Called when the plot button is clicked. A GNU Plot session is + # created and controlled via a pipe to plot the data + # + method plot {} { + $self gnuPlot + $self updateDefaults + $self cancel; # Kill the widget after the plot is done. + } + + #------------------------ Private methods --------------------------------- + + # Make the last set of values sticky to the next invocation + # + method updateDefaults {} { + set defaultLogScale $logScale + set defaultPostscript $postscript + set defaultXtitle $Xtitle + set defaultYtitle $Ytitle + set defaultTitle $title + + } + # + # Actually plot the data. + # + method gnuPlot {} { + set gateCount ${::multiplicity.bins}; # This many gates need plotting. + + # Create the data file: + + set dataFile [exec mktemp] + set df [open $dataFile w] + set sumxy 0.0 + set sumx2 0.0 + for {set i 0} {$i < $gateCount} {incr i} { + set y [cbar $i] + puts $df $y + set sumxy [expr {$sumxy + $i*$y}] + set sumx2 [expr {$sumx2 + $i*$i}] + } + close $df + + # now the fit: + + if {$sumx2 != 0.0} { + set m [expr {$sumxy/$sumx2}] + } else { + set m 0.0 + } + set fitFile [exec mktemp] + set fitf [open $fitFile w] + for {set i 0} {$i < $gateCount} {incr i} { + puts $fitf [expr {$i*$m}] + } + close $fitf + + # Open the gnu plot and tell it what to do: + # note that if we're making postscript we need to prompt for the + # output file and set the appropriate paramters in gnuplot for postscript + # output to that file: + + set gp [open |gnuplot w] + + if {$postscript} { + set outputFile [tk_getSaveFile \ + -defaultextension .ps \ + -title {Output file} \ + -filetypes { + {{Postscript} {.ps} } + {{All files} * } + } + ] + # + # An emtpy filename means he wants to reconsider the settings: + + if {$outputFile eq ""} return + puts $gp "set size 1.0, 0.6" + puts $gp "set terminal postscript portrait enhanced mono dashed lw 1 'Helvetica' 14" + puts $gp "set output '$outputFile'" + } + puts $gp "set title '$title : Fit slope $m'" + puts $gp "set xlabel '$Xtitle'" + puts $gp "set ylabel '$Ytitle'" + if {$logScale} { + puts $gp "set logscale y" + } + puts $gp "set key off" + puts $gp "plot '$dataFile' with points 3 7, '$fitFile' with points 1 22"; # blue solid circles + puts $gp "pause mouse button3 'Click right mouse button in window to close'" + puts $gp "exit" + flush $gp + fconfigure $gp -blocking 0; # otherwise the close will hang until gnuplot exits. + close $gp + + if {$postscript} { + exec gv $outputFile & + } + + + } + +} \ 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...> - 2011-01-19 22:06:41
|
Revision: 1793 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1793&view=rev Author: ron-fox Date: 2011-01-19 22:06:35 +0000 (Wed, 19 Jan 2011) Log Message: ----------- Fix normalization computatino. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/CMultiplicity.h branches/LLNLMadcChainSpecTcl/CY2fCommand.cpp branches/LLNLMadcChainSpecTcl/CY2fCommand.h branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-19 10:36:13 UTC (rev 1792) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-19 22:06:35 UTC (rev 1793) @@ -1087,6 +1087,22 @@ return result; } /** + ** Compute the normalization value nbks + ** @param gate gate in which to compute this. + ** @return double + */ +double +CMultiplicity::nbks(int gate) +{ + double norm = 0.0; + vector<unsigned> multiplicities = getGateMultiplicities(gate); + for (int i =0; i < multiplicities.size(); i++) { + norm += multiplicities[i]; + } + return norm; +} + +/** ** compute the CBAR. For a given gate this is a weighted sum of the ** multiplicities by the multiplicities dividec by the total number of events. ** Raw data easily comes from the output of getGateMultiplicities. @@ -1099,14 +1115,13 @@ { vector<unsigned> multiplicities = getGateMultiplicities(gate); - double nbks = 0.0; + double norm = nbks(gate); double numerator = 0.0; for (int i =1; i < multiplicities.size(); i++) { - nbks += multiplicities[i]; numerator += i*multiplicities[i]; } - if (nbks == 0.0) return 0.0; - double cbar = numerator/nbks; // Really the centroid of the multiplicity distribution. + if (norm == 0.0) return 0.0; + double cbar = numerator/norm; // Really the centroid of the multiplicity distribution. return cbar; } Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2011-01-19 10:36:13 UTC (rev 1792) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.h 2011-01-19 22:06:35 UTC (rev 1793) @@ -173,6 +173,7 @@ std::vector<unsigned> getMultiplicityTotals(); std::vector<unsigned> getGateMultiplicities(int gate); std::vector<unsigned> getSpecificMultiplicity(int n); + double nbks(int gate); double cbar(int gate); double y2f(int gate); Modified: branches/LLNLMadcChainSpecTcl/CY2fCommand.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CY2fCommand.cpp 2011-01-19 10:36:13 UTC (rev 1792) +++ branches/LLNLMadcChainSpecTcl/CY2fCommand.cpp 2011-01-19 22:06:35 UTC (rev 1793) @@ -0,0 +1,83 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <config.h> +#include "CY2fCommand.h" +#include <SpecTcl.h> +#include <TCLObject.h> +#include "CMultiplicity.h" +#include <TCLInterpreter.h> +#include <vector> + +using namespace std; + +/** + ** construction -- use the base class to register us as the command totalmult + ** @param interp - reference to the interpreter that we will be registered on. + */ +CY2fCommand::CY2fCommand(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, "y2f", true) {} +/** + ** Destruction is all handled by the base class. + */ +CY2fCommand::~CY2fCommand() {} + +/** + ** execute the command... we need a single + ** integer parameter. The desired multiplicity. + ** @param interp - The interpreter executing this command. + ** @param objv - Vector of encapsulated Tcl_Obj* objects that make up our command line. + ** @return int + ** @retval TCL_OK - Correct execution. + ** @retval TCL_ERROR - execution failed in some way. + */ + +int +CY2fCommand::operator()(CTCLInterpreter& interp, + vector<CTCLObject>& objv) +{ + // There should be a single integer parameter. + + if (objv.size() != 2) { + interp.setResult("y2f - wrong number of parameters"); + return TCL_ERROR; + } + objv[1].Bind(interp); + int gate; + try { + gate = objv[1]; + } + catch(...) { + interp.setResult("y2f - gate number must be an integer"); + return TCL_ERROR; + } + /** We need to get and cast the event processor so we can fish the data from it */ + + SpecTcl* pApi = SpecTcl::getInstance(); + CTclAnalyzer::EventProcessorIterator p = pApi->FindEventProcessor("Multiplicity"); + + if (p == pApi->ProcessingPipelineEnd()) { + interp.setResult("getmult - failed to find the multiplicity event processor"); + return TCL_ERROR; + } + + CMultiplicity* pEp = dynamic_cast<CMultiplicity*>(p->second); + + CTCLObject result; + result.Bind(interp); + result = pEp->y2f(gate); + interp.setResult(result); + return TCL_OK; +} Modified: branches/LLNLMadcChainSpecTcl/CY2fCommand.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CY2fCommand.h 2011-01-19 10:36:13 UTC (rev 1792) +++ branches/LLNLMadcChainSpecTcl/CY2fCommand.h 2011-01-19 22:06:35 UTC (rev 1793) @@ -0,0 +1,55 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CY2FCOMMAND_H +#define __CY2FCOMMAND_H + + +#ifndef _TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + +/** + ** The class below provides a comman to access the CMultiplicity event processor's + ** y2f function. That function returns the Feynman pair correlation for a specific gate + ** Therefore the invocation is: + ** \verbatim + ** y2f n + ** \endverbatim + ** To get the y2f for gate n. + */ +class CY2fCommand : public CTCLObjectProcessor +{ + /* canonicals */ +public: + CY2fCommand(CTCLInterpreter& interp); + virtual ~CY2fCommand(); + +private: + CY2fCommand(const CY2fCommand&); + CY2fCommand& operator=(const CY2fCommand&); + int operator==(const CY2fCommand&) const; + int operator!=(const CY2fCommand&) const; + + /** Implement the base class interface that makes us a command processor */ + +public: + int operator()(CTCLInterpreter& interp, + STD(vector)<CTCLObject>& objv); +}; + + +#endif Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2011-01-19 10:36:13 UTC (rev 1792) +++ branches/LLNLMadcChainSpecTcl/Makefile 2011-01-19 22:06:35 UTC (rev 1793) @@ -30,7 +30,8 @@ CStackMapCommand.o CModuleUnpacker.o C785Unpacker.o CNADC2530Unpacker.o \ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ - CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o + CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ + CY2fCommand.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-01-19 10:36:13 UTC (rev 1792) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-01-19 22:06:35 UTC (rev 1793) @@ -41,6 +41,7 @@ #include "CGetMultCmd.h" #include "CGetGateMultCmd.h" #include "CCbarCommand.h" +#include "CY2fCommand.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -320,6 +321,7 @@ new CGetMultCmd(rInterp); // Get individual multiplicity as function of cycles. new CGetGateMultCmd(rInterp); new CCbarCommand(rInterp); + new CY2fCommand(rInterp); } // Function: This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2011-01-21 11:10:53
|
Revision: 1794 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1794&view=rev Author: ron-fox Date: 2011-01-21 11:10:47 +0000 (Fri, 21 Jan 2011) Log Message: ----------- I think we have the CBAR plot the way Phil wants it now. Also simplified the y2f computation to line us up for y3f etc. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/plotCbar.tcl Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-19 22:06:35 UTC (rev 1793) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-01-21 11:10:47 UTC (rev 1794) @@ -52,6 +52,13 @@ return product; } +/* compute (n m) binomial: n!/m!(n-m)! */ +/* The assumption is that n,m are small enough factorials won't blow up.. */ +static inline double +binomial(int n, int m) +{ + return factorial(n)/(factorial(m)*factorial(n-m)); +} /*! Construction builds the tree parameters and what we can of the CTCLVariable. @@ -1142,7 +1149,7 @@ for (int i = 0; i < mult.size(); i++) { - double coef = factorial(i)/2*(factorial(i-2)); // for our purposes factorial won't be too big. + double coef = binomial(i,2); pairs += coef*mult[i]; } double result = (pairs - 0.5*cb*cb)/cb; Modified: branches/LLNLMadcChainSpecTcl/plotCbar.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotCbar.tcl 2011-01-19 22:06:35 UTC (rev 1793) +++ branches/LLNLMadcChainSpecTcl/plotCbar.tcl 2011-01-21 11:10:47 UTC (rev 1794) @@ -166,6 +166,7 @@ puts $fitf [expr {$i*$m}] } close $fitf + set rate [expr $m*1.0e6] # Open the gnu plot and tell it what to do: # note that if we're making postscript we need to prompt for the @@ -191,14 +192,28 @@ puts $gp "set terminal postscript portrait enhanced mono dashed lw 1 'Helvetica' 14" puts $gp "set output '$outputFile'" } - puts $gp "set title '$title : Fit slope $m'" + puts $gp "set title '$title'" puts $gp "set xlabel '$Xtitle'" puts $gp "set ylabel '$Ytitle'" if {$logScale} { puts $gp "set logscale y" } puts $gp "set key off" - puts $gp "plot '$dataFile' with points 3 7, '$fitFile' with points 1 22"; # blue solid circles + + # Labels in the plot frame: + + set labelBase [expr $i*$m*9/10] + set labelX [expr $gateCount/10] + set labelIncr [expr $i*$m/20] + puts $gp "set label \"Count rate [format %7.5e $rate]\" at $labelX,$labelBase left" + set labelBase [expr $labelBase + $labelIncr] + puts $gp "set label \"[$self dataSourceLabel]\" at $labelX,$labelBase left" + + # End of the plot frame labels + + puts $gp "plot '$dataFile' with points 3 7, '$fitFile' with lines 1"; # blue solid circles, red lines. + + puts $gp "pause mouse button3 'Click right mouse button in window to close'" puts $gp "exit" flush $gp @@ -211,5 +226,17 @@ } + # + # This method determines the data source label for the plot + # + method dataSourceLabel {} { + set rawSource [attach -list] + set type [lindex $rawSource 0] + if {$type eq "File:"} { + return [file tail [lindex $rawSource 1]] + } else { + return "Online" + } + } } \ 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...> - 2011-02-15 11:41:38
|
Revision: 1804 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1804&view=rev Author: ron-fox Date: 2011-02-15 11:41:31 +0000 (Tue, 15 Feb 2011) Log Message: ----------- Maybe got y2f fitting working(?!?) not sure. Modified Paths: -------------- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp branches/LLNLMadcChainSpecTcl/Makefile branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl branches/LLNLMadcChainSpecTcl/install.sh branches/LLNLMadcChainSpecTcl/plotCbar.tcl Added Paths: ----------- branches/LLNLMadcChainSpecTcl/CFitY2FCommand.cpp branches/LLNLMadcChainSpecTcl/CFitY2FCommand.h Added: branches/LLNLMadcChainSpecTcl/CFitY2FCommand.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CFitY2FCommand.cpp (rev 0) +++ branches/LLNLMadcChainSpecTcl/CFitY2FCommand.cpp 2011-02-15 11:41:31 UTC (rev 1804) @@ -0,0 +1,410 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ +#include <config.h> +#include "CFitY2FCommand.h" +#include <TCLInterpreter.h> +#include <TCLObject.h> +#include <TCLException.h> +#include <math.h> +#include <limits> +#include <iostream> + +static const int KINDEX = 0; +static const int LAMBDAINDEX = 1; + +/*------------------------------- Canonicals ---------------------------------*/ + +/** + ** Create and register the command.. This is all courtesy of the base + ** Class: + ** @param interp - CTCLInterpreter that encapsulates the Tcl interpreter on which + ** this command is registered and will be run + */ +CFitY2FCommand::CFitY2FCommand(CTCLInterpreter& interp) : + CTCLObjectProcessor(interp, "fity2f", true) +{} + +/** + ** The destructor relies on chaining into the base class destructor as well + */ +CFitY2FCommand::~CFitY2FCommand() +{ +} + +/*--------------------------- Methods -------------------------------------*/ + +/** + ** Receives control when the command is executed. + ** - Ensure we have sufficient paramters (one in addition to the command word). + ** - Marshall the points into the correct shape from the list. + ** - Set up the marquard fit engine in gsl + ** - Iterate on the fit until its either clear we are not converging or + ** the parameters have settled to pretty much their final values. + ** - Marshal the fit parameter values back out of the fit to an appropriately shaped list. + ** - Return TCL_OK. Fit failure is detected by sending back an empty list, not by + ** TCL_ERROR ..which is reserved for bad usage. It is an 'ok' but disappointing + ** result for the fit to not converge. + ** @param interp - The CTCLInterpreter wrapped Tcl interpreter that is running the command. + ** @param objv - std::vector of CTCLObject encapsulated Tcl_Obj's that make up the + ** command words (the command keyword is element 0). + ** @return int + ** @retval TCL_OK - The command was started ok and the fit was run. If the fit converged result is + ** a two element list of K and Lambda in that order. If the fit did not converge, + ** the result is empty. + ** @retval TCL_ERROR - The command did not get so far as to run the fit engine. + */ +int +CFitY2FCommand::operator()(CTCLInterpreter& interp, + std::vector<CTCLObject>& objv) +{ + // Most of the functions we call will throw exception to centralize error handling. + + pDataPoint pRawData(0); + + try { + if (objv.size() != 2) { + throw std::string("fity2f - incorrect number of command line parameters"); + } + objv[1].Bind(interp); // Need this bound to an interpreter. + size_t nPts = objv[1].llength(); // Need number of data points. + pRawData = marshallRawData(objv[1]); // and need them in C++/C usable form. + + // Initialize a solver for levenberg-marquardt minimization, there are npts observed data points + // and 2 fit parameters, K and lambda. + + const gsl_multifit_fdfsolver_type* pSolverType = gsl_multifit_fdfsolver_lmsder; + gsl_multifit_fdfsolver* pSolver = gsl_multifit_fdfsolver_alloc(pSolverType, + nPts, + 2); + gsl_multifit_function_fdf f; + + // make the fit state: + + fitState fittingState = {nPts, pRawData}; + + // Fill in the struct that drivers the solver: + + f.f = fx; + f.df = dfx; + f.fdf = fxdx; + f.n = nPts; + f.p = 2; + f.params = &fittingState; + + // Get some initial values for the data fit parameters: + + gsl_vector* guess = gsl_vector_alloc(2); + initialValues(guess, &fittingState); + + gsl_multifit_fdfsolver_set(pSolver, &f, guess); + + // Iterate until we get convergence or until the maximum iteration count is + // exceeded. + + int status; + for (int i =0; i < 500; i++) { + status = gsl_multifit_fdfsolver_iterate(pSolver); + if ((status != 0) && (status != GSL_CONTINUE)) { + std::cerr << "Some problem reported from solver?\n"; + std::cerr << "Iteration count: " << i << std::endl; + break; // Problem in fit. + } + status = gsl_multifit_test_delta(pSolver->dx, pSolver->x, 1.0e-8, 1.0e-8); + if (status != GSL_CONTINUE) { + std::cerr << "I think this means fit converged\n"; + std::cerr << "Iterations: " << i+1 << std::endl; + std::cerr << "Status: " << status << std::endl; + break; + } + } + + // Get the fit parameters, free the storage and + // figure out what to return.. + + double k = gsl_vector_get(pSolver->x, KINDEX); + double lambda = gsl_vector_get(pSolver->x, LAMBDAINDEX); + delete []pRawData; + gsl_multifit_fdfsolver_free(pSolver); + gsl_vector_free(guess); + + if (status == 0) { // Fit converted with no errors. + std::cerr << "Fit K: " << k << " Fit lambda: " << lambda << std::endl; + CTCLObject result; + result.Bind(interp); + result += k; + result += lambda; + interp.setResult(result); + return TCL_OK; + } + if (status != 0) { + std::cerr << "Nonzero status: " << status << std::endl; + } + else { + std::cerr << "Max iteration count exceeded I think\n"; + } + + return TCL_OK; + + } + + catch (std::string msg) { + interp.setResult(msg); + delete []pRawData; + return TCL_ERROR; + } + catch (CTCLException& failure) { + interp.setResult(failure.ReasonText()); + delete []pRawData; + return TCL_ERROR; + } + return TCL_OK; +} + + +/*--------------------------- Utility methods ------------------------*/ + +/** + ** + ** Make some guesses about K and lambda. + ** - K is the asymptotic value so we guess the Y value of the last point. + ** - Lambda for lack of a better way to get this, I'm going to estimate the + ** The range of y values divided by the time range. + ** + ** All of these are just starting points for the fit anyway. + ** @param guess - pointer to a gsl_vector into which the initial guess will be put. + ** @param pState- The fit state which contains the number of points and their values. + */ +void +CFitY2FCommand::initialValues(gsl_vector* guess, pFitState pState) +{ + + double smallest = std::numeric_limits<double>::max(); + double largest = std::numeric_limits<double>::min(); + + int npts = pState->n; + for (int i= 0; i < npts; i++) { + double y = pState->pts[i].y; + if (y > largest) largest = y;; + if ((y > 0.0) && (y < smallest)) smallest = y; + } + double trange = pState->pts[npts-1].x; + double lambda = 1.0; // (largest - smallest)/trange; + + std::cerr << "K guess: " << largest << " lambda guess: " << lambda << std::endl; + gsl_vector_set(guess, KINDEX, largest); + gsl_vector_set(guess, LAMBDAINDEX, lambda); +} +/** + ** Marshall the raw input data into an array of pDataPoint + ** @param pointlist - A CTCLObject encapsulated Tcl_Obj that is the + ** list of points in [list [list x y]...] form + ** @return pDataPoint + ** @retval a dynamically allocated array of DataPoint with the list marshalled into it. + ** @note it's going to be up to the caller to use llength to figure out how many points + ** I'mgoing to give you. + */ +CFitY2FCommand::pDataPoint +CFitY2FCommand::marshallRawData(CTCLObject& pointlist) +{ + size_t nPoints = pointlist.llength(); + pDataPoint pPoints = new DataPoint[nPoints]; + + // Any error will throw an exception which we will catch, delete the pPoints data + // and rethrow: + + try { + for (int i = 0; i < nPoints; i++) { + CTCLObject point = pointlist.lindex(i); + if (point.llength() != 2) { + throw std::string("One of the data points in the input list for fity2f did not have 2 elements"); + } + pPoints[i].x = point.lindex(0); + pPoints[i].y = point.lindex(1); + } + return pPoints; + } + catch (...) { + delete []pPoints; + throw; + + } +} + + +/** + ** Evaluate a fit candidate y2f at a point x gtiven a specific k/lambda: + ** @param k - Scale factor. + ** @param lambda - Time constantr + ** @param x - Data point (actually a time gate). + ** @return double + ** @retval function evaluated at that point. + ** @note if lambda*t = 0 we return K + */ +double +CFitY2FCommand::y2fEval(double k, double lambda, double x) +{ + double lambdaX = lambda*x; + if (lambdaX == 0.0) { + return 0.0; + } + + return k*(1.0 - (1.0 - exp(-lambdaX))/lambdaX); +} +/** + ** Evaluate a fit candidate's derivative with respect to the + ** fit parameter k (part of Jacobian computation). + ** @param lambda - Current value of lambda (time constant) to use. + ** @param x - x at which to evaluate the deriviative. + ** @return double + ** @retval value of d(y2f)/dk [x] + ** @note if lambad*t == 0 we return 1.0 + */ +double +CFitY2FCommand::dk(double lambda, double x) +{ + double lambdaX = lambda*x; + + if (lambdaX == 0.0) { + return 1.0; + } + return (1.0 - (1.0 - exp(-lambdaX))/lambdaX); +} +/** + ** Eavluate a fit candidate's derivative with respect to the + ** fit parameter lambda (part of Jacobian computation). + ** @param k - Scale factor. + ** @param lambda - Time constant to use + ** @param x - X (time) at which to evaluate the derivative. + ** @return double + ** @retval d(y2f)/dlambda [x] + ** @note if lambda*t = 0, return k + ** @note if lambda = 0, return 0.0? + */ +double +CFitY2FCommand::dlambda(double k, double lambda, double x) +{ + + // Edge cases when the computation will give NaN's: + + if (lambda == 0.0) { + std::cerr << "Zero\n"; + return 0.0; + } + double lambdaX = lambda*x; + if (lambdaX == 0.0) { + std::cerr << "K\n"; + return k; + } + + + double elt = exp(-lambdaX); + double result = (elt-1.0)/(lambda*lambda*x) + elt/lambda; + + return result; + + +} +/** + ** For a given candidate fit f(x) calculates the value of f(x[i]) - y[i] that is + ** the residual of the candidate function and the actual data point y value. + ** @param x - Pointer to the gsl_vector that contains the current fit parameters. + ** The KINDEX element is the scale factor for the current iteration and + ** LAMBDAINDEX is the time constant for the current iteration. + ** @param params - The fit parameter structure (actually a pFitState) + ** @param f - gsl_vetor into which we will put the residuals. + ** @return int + ** @retval GSL_SUCCESS + ** + */ +int +CFitY2FCommand::fx(const gsl_vector* x, void* params, gsl_vector* f) +{ + // Fetch the fit state: + + pFitState pState = reinterpret_cast<pFitState>(params); + pDataPoint pts = pState->pts; + int npts = pState->n; + + // Fit parameters for the current iteration: + + double k = gsl_vector_get(x, KINDEX); + double lambda = gsl_vector_get(x, LAMBDAINDEX); + + // Calculate the residuals.: + + for (int i =0; i < npts; i++) { + double yi = y2fEval(k, lambda, pts[i].x); + gsl_vector_set(f, i, (yi - pts[i].y)); // Unweighted residuals... + } + return GSL_SUCCESS; +} +/** + ** For a given candidate fit parameter set calculates the Jacobian + ** matrix. This matrix is used by the l-m algorithm, along with the + ** residuals is used to inform the next guess for the fit parameters. + ** + ** @param x - gsl_vector* containing the fit parameter values for the current + ** iteration: + ** The KINDEX element is the scale factor for the current iteration and + ** LAMBDAINDEX is the time constant for the current iteration. + ** @param params- Actually a pState, pointer to the fit state we need to compute what + ** the l-m solver needs. + ** @param J - Jacobian we will fill in i,KINDEX will be d(y2f)/dk [xi]) + ** i, LAMBDAINDEXl will be d(y2f)/dlambda [xi] + ** we don't do any weighting (e.g. weight is 1.0). + ** @return int + ** @retval GSL_SUCCESS + */ +int +CFitY2FCommand::dfx(const gsl_vector* x, void* params, gsl_matrix* J) +{ + // Fetch the fit state: + + pFitState pState = reinterpret_cast<pFitState>(params); + int npts = pState->n; + pDataPoint pts = pState->pts; + + // Fetch the current iteration's fit parameters: + + double k = gsl_vector_get(x, KINDEX); + double lambda = gsl_vector_get(x, LAMBDAINDEX); + + for (int i =0; i < npts; i++) { + double x = pts[i].x; + gsl_matrix_set(J, i, KINDEX, dk(lambda, x)); + gsl_matrix_set(J, i, LAMBDAINDEX, dlambda(k, lambda, x)); + } + return GSL_SUCCESS; +} +/* +** Perform the user computations for a single iteration of the +** l-m algorithm, specifically, calculate the residuals at each point +** and the Jacobian matrix: +** @param x - gsl_vector* containing the guesses for the current iteration. +** @param params - actually a pState pointer to the user state information for this fit. +** @param f - gsl_vector* [output] into which the residuals will be stored. +** @param J = gsl_matrix [output] into which the Jacobian will be stored. +** @return int +** @retval GSL_SUCCESS +**/ +int +CFitY2FCommand::fxdx(const gsl_vector* x, void* params, gsl_vector* f, gsl_matrix* J) +{ + fx(x, params, f); + dfx(x, params, J); + + return GSL_SUCCESS; +} Added: branches/LLNLMadcChainSpecTcl/CFitY2FCommand.h =================================================================== --- branches/LLNLMadcChainSpecTcl/CFitY2FCommand.h (rev 0) +++ branches/LLNLMadcChainSpecTcl/CFitY2FCommand.h 2011-02-15 11:41:31 UTC (rev 1804) @@ -0,0 +1,107 @@ +/* + 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: + RonFox + NSCL + Michigan State University + East Lansing, MI 48824-1321 +*/ + +#ifndef __CFITY2FCOMMAND_H +#define __CFITY2FCOMMAND_H + + + +#ifndef _TCLOBJECTPROCESSOR_H +#include <TCLObjectProcessor.h> +#endif + + +#ifndef __GSL_FIT_STUFF +#include <gsl/gsl_rng.h> +#include <gsl/gsl_randist.h> +#include <gsl/gsl_vector.h> +#include <gsl/gsl_blas.h> +#include <gsl/gsl_multifit_nlin.h> +#ifndef __GSL_FIT_STUFF +#define __GLS_FIT_STUFF +#endif +#endif + +/** + ** The class below implements the y2f fit process. It does this by providing a Tcl + ** command that can accept the input points and produce output fit points. + ** The points are fit using GSL's Marquart minimization fitting functions. + ** The functional form used is + ** K(1-(1-exp(-lambda*t))/(lambda*t)) + ** Where the desired parameters are K the scale factor and lambda the decay time. + ** constant. + ** + ** The command syntax is: + \verbatim + + fity2f points + +\endverbatim + ** Where: + ** - points is a Tcl list of two element lists of the form [list time data-point] + ** - The command returns an empty list if the fit does not converge + ** - The command returns a two element list of the form [list K lambda] + ** if successful. + */ +class CFitY2FCommand : public CTCLObjectProcessor +{ + //lLocal data type: + typedef struct _point_ { + double x; + double y; + } DataPoint, *pDataPoint; + + typedef struct _fitState { + int n; /* Number of measurements */ + pDataPoint pts; /* Raw data points. */ + } fitState, *pFitState; + + // Canonicals +public: + CFitY2FCommand(CTCLInterpreter& interp); + virtual ~CFitY2FCommand(); +private: + CFitY2FCommand(const CFitY2FCommand&); + CFitY2FCommand& operator=(const CFitY2FCommand&); + int operator==(const CFitY2FCommand&) const; + int operator!=(const CFitY2FCommand&) const; + + /** Implement the base class interface that makes us a command processor */ + +public: + int operator()(CTCLInterpreter& interp, + std::vector<CTCLObject>& objv); + + // Utilities: + +private: + pDataPoint marshallRawData(CTCLObject& pointlist); + void initialValues(gsl_vector* guess, pFitState pState); + + // Primitive functions: + + static double y2fEval(double k, double lamda, double x); /* Function at point X for k, lambda */ + static double dk(double lambda, double x); /* df/dk at point x for k,lambda */ + static double dlambda(double k, double lambda, double x); /* df/dlambda @x for k, lambda */ + + // Next layer up.. gsl level functions: + + static int fx(const gsl_vector* x, void* params, gsl_vector* f); /* Calculate f(x) for each pooint x. */ + static int dfx(const gsl_vector* x, void* params, gsl_matrix* J); /* Jacobian for current parameters */ + static int fxdx(const gsl_vector* x, void* params, gsl_vector*f, gsl_matrix* J); /* invoker for fx/dfx */ +}; + +#endif Modified: branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-02-11 21:44:06 UTC (rev 1803) +++ branches/LLNLMadcChainSpecTcl/CMultiplicity.cpp 2011-02-15 11:41:31 UTC (rev 1804) @@ -1064,6 +1064,10 @@ CMultiplicity::getGateMultiplicities(int gate) { vector<unsigned> result; + if (gate < m_Histogram.size()) result = m_Histogram[gate]; + return result; + + if (gate < m_Histogram.size()) { for (int bin = 0; bin < gate; bin++) { // sum over previous bins to make the gate width. for (int n = 0; n < m_Histogram[bin].size(); n++) { @@ -1131,7 +1135,7 @@ double cbar = numerator/norm; // Really the centroid of the multiplicity distribution. return cbar; } - + /** ** Calclate the y2f or the feynman variance of the multiplicity for gate n ** @param gate - Gate number for which to calculate the y2f @@ -1145,13 +1149,16 @@ double pairs = 0.0; if (cb == 0.0) return 0.0; // special case. + + vector<unsigned> mult = getGateMultiplicities(gate); - for (int i = 0; i < mult.size(); i++) { + for (int i = 2; i < mult.size(); i++) { double coef = binomial(i,2); pairs += coef*mult[i]; } - double result = (pairs - 0.5*cb*cb)/cb; + + double result = (pairs/(cb*nbks(gate)) - 0.5*cb); return result; } Modified: branches/LLNLMadcChainSpecTcl/Makefile =================================================================== --- branches/LLNLMadcChainSpecTcl/Makefile 2011-02-11 21:44:06 UTC (rev 1803) +++ branches/LLNLMadcChainSpecTcl/Makefile 2011-02-15 11:41:31 UTC (rev 1804) @@ -31,7 +31,7 @@ CStackUnpacker.o CMADC32Unpacker.o CRateEventProcessor.o \ CV1x90Unpacker.o CV977Unpacker.o CMASE.o CMultiplicity.o \ CTotalMultCmd.o CGetMultCmd.o CGetGateMultCmd.o CCbarCommand.o \ - CY2fCommand.o + CY2fCommand.o CFitY2FCommand.o # Modified: branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp =================================================================== --- branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-02-11 21:44:06 UTC (rev 1803) +++ branches/LLNLMadcChainSpecTcl/MySpecTclApp.cpp 2011-02-15 11:41:31 UTC (rev 1804) @@ -42,6 +42,7 @@ #include "CGetGateMultCmd.h" #include "CCbarCommand.h" #include "CY2fCommand.h" +#include "CFitY2FCommand.h" #ifdef HAVE_STD_NAMESPACE using namespace std; @@ -322,6 +323,7 @@ new CGetGateMultCmd(rInterp); new CCbarCommand(rInterp); new CY2fCommand(rInterp); + new CFitY2FCommand(rInterp); } // Function: Modified: branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2011-02-11 21:44:06 UTC (rev 1803) +++ branches/LLNLMadcChainSpecTcl/SpecTclRC.tcl 2011-02-15 11:41:31 UTC (rev 1804) @@ -180,4 +180,7 @@ 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 puts done \ No newline at end of file Modified: branches/LLNLMadcChainSpecTcl/install.sh =================================================================== --- branches/LLNLMadcChainSpecTcl/install.sh 2011-02-11 21:44:06 UTC (rev 1803) +++ branches/LLNLMadcChainSpecTcl/install.sh 2011-02-15 11:41:31 UTC (rev 1804) @@ -16,10 +16,12 @@ # version=llnlSpecTcl-v2.2 +# +# Get rid of any prior version. +# +rm -f /usr/opt/spectcl/$version +#mv /usr/opt/spectcl/$version /usr/opt/spectcl/$version.saved -rm -f /usr/opt/spectcl/$version.saved -mv /usr/opt/spectcl/$version /usr/opt/spectcl/$version.saved - make && \ make install DEST=/usr/opt/spectcl/$version && \ rm -f /usr/opt/spectcl/llnlSpecTcl && \ Modified: branches/LLNLMadcChainSpecTcl/plotCbar.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/plotCbar.tcl 2011-02-11 21:44:06 UTC (rev 1803) +++ branches/LLNLMadcChainSpecTcl/plotCbar.tcl 2011-02-15 11:41:31 UTC (rev 1804) @@ -39,7 +39,7 @@ # typevariable defaultLogScale 0 typevariable defaultPostscript 0 - typevariable defaultXtitle {Gate} + typevariable defaultXtitle {Gate uSec} typevariable defaultYtitle {Cbar} typevariable defaultTitle {Cbar vs. Gate} @@ -138,6 +138,9 @@ # method gnuPlot {} { set gateCount ${::multiplicity.bins}; # This many gates need plotting. + set binWidth ${::multiplicity.mintime} + set binWidth [expr $binWidth/1000.0]; # in microseconds. + puts $binWidth # Create the data file: @@ -147,9 +150,10 @@ set sumx2 0.0 for {set i 0} {$i < $gateCount} {incr i} { set y [cbar $i] - puts $df $y - set sumxy [expr {$sumxy + $i*$y}] - set sumx2 [expr {$sumx2 + $i*$i}] + set x [expr $binWidth*$i] + puts $df "$x $y" + set sumxy [expr {$sumxy + $x*$y}] + set sumx2 [expr {$sumx2 + $x*$x}] } close $df @@ -163,7 +167,8 @@ set fitFile [exec mktemp] set fitf [open $fitFile w] for {set i 0} {$i < $gateCount} {incr i} { - puts $fitf [expr {$i*$m}] + set x [expr $binWidth*$i] + puts $fitf "$x [expr {$x*$m}]" } close $fitf set rate [expr $m*1.0e6] @@ -202,9 +207,9 @@ # Labels in the plot frame: - set labelBase [expr $i*$m*9/10] - set labelX [expr $gateCount/10] - set labelIncr [expr $i*$m/20] + set labelBase [expr $x*$m*9/10] + set labelX [expr $binWidth*$gateCount/10] + set labelIncr [expr $x*$m/20] puts $gp "set label \"Count rate [format %7.5e $rate]\" at $labelX,$labelBase left" set labelBase [expr $labelBase + $labelIncr] puts $gp "set label \"[$self dataSourceLabel]\" at $labelX,$labelBase left" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ro...@us...> - 2011-03-09 00:08:14
|
Revision: 1818 http://nsclspectcl.svn.sourceforge.net/nsclspectcl/?rev=1818&view=rev Author: ron-fox Date: 2011-03-09 00:08:06 +0000 (Wed, 09 Mar 2011) Log Message: ----------- Mainly to add ploty2f and the init file. Added Paths: ----------- branches/LLNLMadcChainSpecTcl/24Dets4KEnergyTimeE.tcl branches/LLNLMadcChainSpecTcl/24DetsRates.tcl branches/LLNLMadcChainSpecTcl/SpecTclInit.tcl branches/LLNLMadcChainSpecTcl/failsafe.tcl branches/LLNLMadcChainSpecTcl/neutrongates.tcl branches/LLNLMadcChainSpecTcl/ngatesall.tcl branches/LLNLMadcChainSpecTcl/ploty2f.tcl branches/LLNLMadcChainSpecTcl/run15gates.tcl Added: branches/LLNLMadcChainSpecTcl/24Dets4KEnergyTimeE.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/24Dets4KEnergyTimeE.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/24Dets4KEnergyTimeE.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1,270 @@ +# SpecTclGUI save file created Thu Sep 16 16:59:08 EDT 2010 +# SpecTclGui Version: 1.0 +# Author: Ron Fox (fo...@ns...) + +#New Tree Parameters: + + +#Modified Tree Parameters: + + +# Pseudo parameter definitions + + +# Tree variable definitions: + + +# Spectrum Definitions + +catch {spectrum -delete 2d.01} +spectrum 2d.01 2 {e.01 t.01} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.02} +spectrum 2d.02 2 {e.02 t.02} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.03} +spectrum 2d.03 2 {e.03 t.03} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.04} +spectrum 2d.04 2 {e.04 t.04} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.05} +spectrum 2d.05 2 {e.05 t.05} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.06} +spectrum 2d.06 2 {e.06 t.06} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.07} +spectrum 2d.07 2 {e.07 t.07} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.08} +spectrum 2d.08 2 {e.08 t.08} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.09} +spectrum 2d.09 2 {e.09 t.09} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.10} +spectrum 2d.10 2 {e.10 t.10} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.11} +spectrum 2d.11 2 {e.11 t.11} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.12} +spectrum 2d.12 2 {e.12 t.12} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.13} +spectrum 2d.13 2 {e.13 t.13} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.14} +spectrum 2d.14 2 {e.14 t.14} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.15} +spectrum 2d.15 2 {e.15 t.15} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.16} +spectrum 2d.16 2 {e.16 t.16} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.17} +spectrum 2d.17 2 {e.17 t.17} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.18} +spectrum 2d.18 2 {e.18 t.18} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.19} +spectrum 2d.19 2 {e.19 t.19} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.20} +spectrum 2d.20 2 {e.20 t.20} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.21} +spectrum 2d.21 2 {e.21 t.21} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.22} +spectrum 2d.22 2 {e.22 t.22} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.23} +spectrum 2d.23 2 {e.23 t.23} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.24} +spectrum 2d.24 2 {e.24 t.24} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} + +catch {spectrum -delete SQNeutrons.Det1} +spectrum SQNeutrons.Det1 2 {e.01 t.01} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det2} +spectrum SQNeutrons.Det2 2 {e.02 t.02} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det3} +spectrum SQNeutrons.Det3 2 {e.03 t.03} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det4} +spectrum SQNeutrons.Det4 2 {e.04 t.04} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det5} +spectrum SQNeutrons.Det5 2 {e.05 t.05} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det6} +spectrum SQNeutrons.Det6 2 {e.06 t.06} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det7} +spectrum SQNeutrons.Det7 2 {e.07 t.07} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det8} +spectrum SQNeutrons.Det8 2 {e.08 t.08} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det9} +spectrum SQNeutrons.Det9 2 {e.09 t.09} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det10} +spectrum SQNeutrons.Det10 2 {e.10 t.10} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det11} +spectrum SQNeutrons.Det11 2 {e.11 t.11} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det12} +spectrum SQNeutrons.Det12 2 {e.12 t.12} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det13} +spectrum SQNeutrons.Det13 2 {e.13 t.13} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det14} +spectrum SQNeutrons.Det14 2 {e.14 t.14} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det15} +spectrum SQNeutrons.Det15 2 {e.15 t.15} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det16} +spectrum SQNeutrons.Det16 2 {e.16 t.16} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det17} +spectrum SQNeutrons.Det17 2 {e.17 t.17} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det18} +spectrum SQNeutrons.Det18 2 {e.18 t.18} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det19} +spectrum SQNeutrons.Det19 2 {e.19 t.19} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det20} +spectrum SQNeutrons.Det20 2 {e.20 t.20} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det21} +spectrum SQNeutrons.Det21 2 {e.21 t.21} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det22} +spectrum SQNeutrons.Det22 2 {e.22 t.22} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det23} +spectrum SQNeutrons.Det23 2 {e.23 t.23} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det24} +spectrum SQNeutrons.Det24 2 {e.24 t.24} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} + +catch {spectrum -delete e.01} +spectrum e.01 1 e.01 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.02} +spectrum e.02 1 e.02 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.03} +spectrum e.03 1 e.03 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.04} +spectrum e.04 1 e.04 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.05} +spectrum e.05 1 e.05 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.06} +spectrum e.06 1 e.06 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.07} +spectrum e.07 1 e.07 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.08} +spectrum e.08 1 e.08 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.09} +spectrum e.09 1 e.09 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.10} +spectrum e.10 1 e.10 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.11} +spectrum e.11 1 e.11 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.12} +spectrum e.12 1 e.12 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.13} +spectrum e.13 1 e.13 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.14} +spectrum e.14 1 e.14 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.15} +spectrum e.15 1 e.15 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.16} +spectrum e.16 1 e.16 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.17} +spectrum e.17 1 e.17 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.18} +spectrum e.18 1 e.18 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.19} +spectrum e.19 1 e.19 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.20} +spectrum e.20 1 e.20 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.21} +spectrum e.21 1 e.21 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.22} +spectrum e.22 1 e.22 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.23} +spectrum e.23 1 e.23 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.24} +spectrum e.24 1 e.24 {{0.000000 4096.000000 4096}} + +catch {spectrum -delete t.01} +spectrum t.01 1 t.01 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.02} +spectrum t.02 1 t.02 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.03} +spectrum t.03 1 t.03 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.04} +spectrum t.04 1 t.04 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.05} +spectrum t.05 1 t.05 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.06} +spectrum t.06 1 t.06 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.07} +spectrum t.07 1 t.07 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.08} +spectrum t.08 1 t.08 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.09} +spectrum t.09 1 t.09 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.10} +spectrum t.10 1 t.10 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.11} +spectrum t.11 1 t.11 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.12} +spectrum t.12 1 t.12 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.13} +spectrum t.13 1 t.13 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.14} +spectrum t.14 1 t.14 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.15} +spectrum t.15 1 t.15 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.16} +spectrum t.16 1 t.16 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.17} +spectrum t.17 1 t.17 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.18} +spectrum t.18 1 t.18 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.19} +spectrum t.19 1 t.19 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.20} +spectrum t.20 1 t.20 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.21} +spectrum t.21 1 t.21 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.22} +spectrum t.22 1 t.22 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.23} +spectrum t.23 1 t.23 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.24} +spectrum t.24 1 t.24 {{0.000000 4096.000000 4096}} + +# Gate definitions in reverse dependency order + +gate SQNeutrons.Det1 c {e.01 t.01 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det2 c {e.02 t.02 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det3 c {e.03 t.03 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det4 c {e.04 t.04 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det5 c {e.05 t.05 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det6 c {e.06 t.06 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det7 c {e.07 t.07 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det8 c {e.08 t.08 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det9 c {e.09 t.09 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det10 c {e.10 t.10 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det11 c {e.11 t.11 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det12 c {e.12 t.12 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det13 c {e.13 t.13 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det14 c {e.14 t.14 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det15 c {e.15 t.15 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det16 c {e.16 t.16 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det17 c {e.17 t.17 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det18 c {e.18 t.18 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det19 c {e.19 t.19 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det20 c {e.20 t.20 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det21 c {e.21 t.21 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det22 c {e.22 t.22 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det23 c {e.23 t.23 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det24 c {e.24 t.24 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} + +# Gate Applications: + +apply SQNeutrons.Det1 SQNeutrons.Det1 +apply SQNeutrons.Det2 SQNeutrons.Det2 +apply SQNeutrons.Det3 SQNeutrons.Det3 +apply SQNeutrons.Det4 SQNeutrons.Det4 +apply SQNeutrons.Det5 SQNeutrons.Det5 +apply SQNeutrons.Det6 SQNeutrons.Det6 +apply SQNeutrons.Det7 SQNeutrons.Det7 +apply SQNeutrons.Det8 SQNeutrons.Det8 +apply SQNeutrons.Det9 SQNeutrons.Det9 +apply SQNeutrons.Det10 SQNeutrons.Det10 +apply SQNeutrons.Det11 SQNeutrons.Det11 +apply SQNeutrons.Det12 SQNeutrons.Det12 +apply SQNeutrons.Det13 SQNeutrons.Det13 +apply SQNeutrons.Det14 SQNeutrons.Det14 +apply SQNeutrons.Det15 SQNeutrons.Det15 +apply SQNeutrons.Det16 SQNeutrons.Det16 +apply SQNeutrons.Det17 SQNeutrons.Det17 +apply SQNeutrons.Det18 SQNeutrons.Det18 +apply SQNeutrons.Det19 SQNeutrons.Det19 +apply SQNeutrons.Det20 SQNeutrons.Det20 +apply SQNeutrons.Det21 SQNeutrons.Det21 +apply SQNeutrons.Det22 SQNeutrons.Det22 +apply SQNeutrons.Det23 SQNeutrons.Det23 +apply SQNeutrons.Det24 SQNeutrons.Det24 + +# filter definitions: ALL FILTERS ARE DISABLED!!!!!!! + Property changes on: branches/LLNLMadcChainSpecTcl/24Dets4KEnergyTimeE.tcl ___________________________________________________________________ Added: svn:executable + * Added: branches/LLNLMadcChainSpecTcl/24DetsRates.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/24DetsRates.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/24DetsRates.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1,25 @@ +rate create SQNeutrons.Det1 +rate create SQNeutrons.Det2 +rate create SQNeutrons.Det3 +rate create SQNeutrons.Det4 +rate create SQNeutrons.Det5 +rate create SQNeutrons.Det6 +rate create SQNeutrons.Det7 +rate create SQNeutrons.Det8 +rate create SQNeutrons.Det9 +rate create SQNeutrons.Det10 +rate create SQNeutrons.Det11 +rate create SQNeutrons.Det12 +rate create SQNeutrons.Det13 +rate create SQNeutrons.Det14 +rate create SQNeutrons.Det15 +rate create SQNeutrons.Det16 +rate create SQNeutrons.Det17 +rate create SQNeutrons.Det18 +rate create SQNeutrons.Det19 +rate create SQNeutrons.Det20 +rate create SQNeutrons.Det21 +rate create SQNeutrons.Det22 +rate create SQNeutrons.Det23 +rate create SQNeutrons.Det24 + Property changes on: branches/LLNLMadcChainSpecTcl/24DetsRates.tcl ___________________________________________________________________ Added: svn:executable + * Added: branches/LLNLMadcChainSpecTcl/SpecTclInit.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/SpecTclInit.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/SpecTclInit.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1 @@ +set DisplayMegabytes 250 Property changes on: branches/LLNLMadcChainSpecTcl/SpecTclInit.tcl ___________________________________________________________________ Added: svn:executable + * Added: branches/LLNLMadcChainSpecTcl/failsafe.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/failsafe.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/failsafe.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1,267 @@ +# SpecTclGUI save file created Wed Feb 16 05:15:16 EST 2011 +# SpecTclGui Version: 1.0 +# Author: Ron Fox (fo...@ns...) + +#New Tree Parameters: + + +#Modified Tree Parameters: + + +# Pseudo parameter definitions + + +# Tree variable definitions: + + +# Spectrum Definitions + +catch {spectrum -delete 2d.01} +spectrum 2d.01 2 {e.01 t.01} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.02} +spectrum 2d.02 2 {e.02 t.02} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.03} +spectrum 2d.03 2 {e.03 t.03} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.04} +spectrum 2d.04 2 {e.04 t.04} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.05} +spectrum 2d.05 2 {e.05 t.05} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.06} +spectrum 2d.06 2 {e.06 t.06} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.07} +spectrum 2d.07 2 {e.07 t.07} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.08} +spectrum 2d.08 2 {e.08 t.08} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.09} +spectrum 2d.09 2 {e.09 t.09} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.10} +spectrum 2d.10 2 {e.10 t.10} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.11} +spectrum 2d.11 2 {e.11 t.11} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.12} +spectrum 2d.12 2 {e.12 t.12} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.13} +spectrum 2d.13 2 {e.13 t.13} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.14} +spectrum 2d.14 2 {e.14 t.14} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.15} +spectrum 2d.15 2 {e.15 t.15} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.16} +spectrum 2d.16 2 {e.16 t.16} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.17} +spectrum 2d.17 2 {e.17 t.17} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.18} +spectrum 2d.18 2 {e.18 t.18} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.19} +spectrum 2d.19 2 {e.19 t.19} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.20} +spectrum 2d.20 2 {e.20 t.20} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.21} +spectrum 2d.21 2 {e.21 t.21} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.22} +spectrum 2d.22 2 {e.22 t.22} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.23} +spectrum 2d.23 2 {e.23 t.23} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.24} +spectrum 2d.24 2 {e.24 t.24} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete SQNeutrons.Det1} +spectrum SQNeutrons.Det1 2 {e.01 t.01} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det10} +spectrum SQNeutrons.Det10 2 {e.10 t.10} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det11} +spectrum SQNeutrons.Det11 2 {e.11 t.11} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det12} +spectrum SQNeutrons.Det12 2 {e.12 t.12} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det13} +spectrum SQNeutrons.Det13 2 {e.13 t.13} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det14} +spectrum SQNeutrons.Det14 2 {e.14 t.14} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det15} +spectrum SQNeutrons.Det15 2 {e.15 t.15} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det16} +spectrum SQNeutrons.Det16 2 {e.16 t.16} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det17} +spectrum SQNeutrons.Det17 2 {e.17 t.17} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det18} +spectrum SQNeutrons.Det18 2 {e.18 t.18} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det19} +spectrum SQNeutrons.Det19 2 {e.19 t.19} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det2} +spectrum SQNeutrons.Det2 2 {e.02 t.02} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det20} +spectrum SQNeutrons.Det20 2 {e.20 t.20} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det21} +spectrum SQNeutrons.Det21 2 {e.21 t.21} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det22} +spectrum SQNeutrons.Det22 2 {e.22 t.22} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det23} +spectrum SQNeutrons.Det23 2 {e.23 t.23} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det24} +spectrum SQNeutrons.Det24 2 {e.24 t.24} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det3} +spectrum SQNeutrons.Det3 2 {e.03 t.03} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det4} +spectrum SQNeutrons.Det4 2 {e.04 t.04} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det5} +spectrum SQNeutrons.Det5 2 {e.05 t.05} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det6} +spectrum SQNeutrons.Det6 2 {e.06 t.06} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det7} +spectrum SQNeutrons.Det7 2 {e.07 t.07} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det8} +spectrum SQNeutrons.Det8 2 {e.08 t.08} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete SQNeutrons.Det9} +spectrum SQNeutrons.Det9 2 {e.09 t.09} {{0.000000 4095.000000 1024} {0.000000 4095.000000 1024}} +catch {spectrum -delete e.01} +spectrum e.01 1 e.01 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.02} +spectrum e.02 1 e.02 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.03} +spectrum e.03 1 e.03 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.04} +spectrum e.04 1 e.04 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.05} +spectrum e.05 1 e.05 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.06} +spectrum e.06 1 e.06 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.07} +spectrum e.07 1 e.07 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.08} +spectrum e.08 1 e.08 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.09} +spectrum e.09 1 e.09 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.10} +spectrum e.10 1 e.10 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.11} +spectrum e.11 1 e.11 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.12} +spectrum e.12 1 e.12 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.13} +spectrum e.13 1 e.13 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.14} +spectrum e.14 1 e.14 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.15} +spectrum e.15 1 e.15 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.16} +spectrum e.16 1 e.16 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.17} +spectrum e.17 1 e.17 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.18} +spectrum e.18 1 e.18 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.19} +spectrum e.19 1 e.19 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.20} +spectrum e.20 1 e.20 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.21} +spectrum e.21 1 e.21 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.22} +spectrum e.22 1 e.22 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.23} +spectrum e.23 1 e.23 {{0.000000 4096.000000 4096}} +catch {spectrum -delete e.24} +spectrum e.24 1 e.24 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.01} +spectrum t.01 1 t.01 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.02} +spectrum t.02 1 t.02 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.03} +spectrum t.03 1 t.03 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.04} +spectrum t.04 1 t.04 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.05} +spectrum t.05 1 t.05 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.06} +spectrum t.06 1 t.06 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.07} +spectrum t.07 1 t.07 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.08} +spectrum t.08 1 t.08 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.09} +spectrum t.09 1 t.09 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.10} +spectrum t.10 1 t.10 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.11} +spectrum t.11 1 t.11 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.12} +spectrum t.12 1 t.12 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.13} +spectrum t.13 1 t.13 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.14} +spectrum t.14 1 t.14 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.15} +spectrum t.15 1 t.15 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.16} +spectrum t.16 1 t.16 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.17} +spectrum t.17 1 t.17 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.18} +spectrum t.18 1 t.18 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.19} +spectrum t.19 1 t.19 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.20} +spectrum t.20 1 t.20 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.21} +spectrum t.21 1 t.21 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.22} +spectrum t.22 1 t.22 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.23} +spectrum t.23 1 t.23 {{0.000000 4096.000000 4096}} +catch {spectrum -delete t.24} +spectrum t.24 1 t.24 {{0.000000 4096.000000 4096}} + +# Gate definitions in reverse dependency order + +gate SQNeutrons.Det1 c {e.01 t.01 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det10 c {e.10 t.10 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det11 c {e.11 t.11 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det12 c {e.12 t.12 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det13 c {e.13 t.13 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det14 c {e.14 t.14 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det15 c {e.15 t.15 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det16 c {e.16 t.16 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det17 c {e.17 t.17 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det18 c {e.18 t.18 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det19 c {e.19 t.19 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det2 c {e.02 t.02 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det20 c {e.20 t.20 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det21 c {e.21 t.21 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det22 c {e.22 t.22 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det23 c {e.23 t.23 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det24 c {e.24 t.24 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det3 c {e.03 t.03 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det4 c {e.04 t.04 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det5 c {e.05 t.05 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det6 c {e.06 t.06 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det7 c {e.07 t.07 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det8 c {e.08 t.08 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} +gate SQNeutrons.Det9 c {e.09 t.09 {{10.000000 974.000000} {4095.000000 974.000000} {4095.000000 4095.000000} {10.000000 4095.000000}}} + +# Gate Applications: + +apply SQNeutrons.Det1 SQNeutrons.Det1 +apply SQNeutrons.Det10 SQNeutrons.Det10 +apply SQNeutrons.Det11 SQNeutrons.Det11 +apply SQNeutrons.Det12 SQNeutrons.Det12 +apply SQNeutrons.Det13 SQNeutrons.Det13 +apply SQNeutrons.Det14 SQNeutrons.Det14 +apply SQNeutrons.Det15 SQNeutrons.Det15 +apply SQNeutrons.Det16 SQNeutrons.Det16 +apply SQNeutrons.Det17 SQNeutrons.Det17 +apply SQNeutrons.Det18 SQNeutrons.Det18 +apply SQNeutrons.Det19 SQNeutrons.Det19 +apply SQNeutrons.Det2 SQNeutrons.Det2 +apply SQNeutrons.Det20 SQNeutrons.Det20 +apply SQNeutrons.Det21 SQNeutrons.Det21 +apply SQNeutrons.Det22 SQNeutrons.Det22 +apply SQNeutrons.Det23 SQNeutrons.Det23 +apply SQNeutrons.Det24 SQNeutrons.Det24 +apply SQNeutrons.Det3 SQNeutrons.Det3 +apply SQNeutrons.Det4 SQNeutrons.Det4 +apply SQNeutrons.Det5 SQNeutrons.Det5 +apply SQNeutrons.Det6 SQNeutrons.Det6 +apply SQNeutrons.Det7 SQNeutrons.Det7 +apply SQNeutrons.Det8 SQNeutrons.Det8 +apply SQNeutrons.Det9 SQNeutrons.Det9 + +# filter definitions: ALL FILTERS ARE DISABLED!!!!!!! + Added: branches/LLNLMadcChainSpecTcl/neutrongates.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/neutrongates.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/neutrongates.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1,51 @@ +# SpecTclGUI save file created Fri Oct 15 05:42:51 EDT 2010 +# SpecTclGui Version: 1.0 +# Author: Ron Fox (fo...@ns...) + +#New Tree Parameters: + + +#Modified Tree Parameters: + + +# Pseudo parameter definitions + + +# Tree variable definitions: + + +# Spectrum Definitions + + +# Gate definitions in reverse dependency order + +gate n1 c {e.01 t.01 {{48.082191 3221.506836} {24.041096 1642.808228} {416.712341 977.671204} {1354.315063 745.273987} {1755.000000 1041.780762} {785.342468 1755.000000} {392.671234 2283.904053}}} +gate n10 c {e.10 t.10 {{104.178085 2900.958984} {905.547974 2524.315186} {1979.383545 2283.904053} {2492.260254 2203.767090} {3141.369873 2155.684814} {2692.602783 2468.219238} {2171.712402 2644.520508} {881.506836 2957.054688} {416.712341 3429.863037} {272.465759 3734.383545} {160.273972 3846.575439}}} +gate n11 c {e.11 t.11 {{48.082191 2900.958984} {585.000000 2460.205566} {1554.657593 2123.630127} {2219.794434 2155.684814} {1755.000000 2644.520508} {1194.041138 2997.123291} {833.424683 3293.630127} {264.452057 3646.232910} {128.219177 3782.465820}}} +gate n12 c {e.12 t.12 {{200.342468 2756.712402} {1145.958862 2428.150635} {1923.287720 2524.315186} {2700.616455 2620.479492} {1923.287720 3021.164307} {1202.054810 3317.671143} {921.575317 3429.863037} {240.410965 3686.301270} {64.109589 3750.410889}}} +gate n13 c {e.13 t.13 {{104.178085 3053.219238} {897.534241 2460.205566} {1859.178101 2139.657471} {1859.178101 2564.383545} {985.684937 3173.424561} {601.027405 3413.835693} {432.739716 3550.068604} {240.410965 3694.315186} {144.246582 3774.452148}}} +gate n14 c {e.14 t.14 {{184.315063 3029.177979} {625.068481 2668.561523} {1570.684937 2227.808105} {2251.849365 1995.411011} {2243.835693 2388.082275} {1650.821899 2500.273926} {1370.342407 2788.767090} {841.438354 3285.616455} {384.657532 3582.123291} {224.383560 3670.273926}}} +gate n15 c {e.15 t.15 {{96.164383 2973.082275} {945.616455 2460.205566} {1995.411011 2259.863037} {2468.219238 2340.000000} {2612.465820 2444.177979} {1410.411011 3061.232910} {913.561646 3285.616455} {536.917786 3526.027344} {280.479462 3726.369873} {200.342468 3774.452148}}} +gate n16 c {e.16 t.16 {{112.191780 2828.835693} {1186.027344 2179.726074} {2251.849365 2155.684814} {2123.630127 2468.219238} {1330.273926 3013.150635} {865.479431 3173.424561} {649.109619 3309.657471} {240.410965 3582.123291} {136.232880 3686.301270}}} +gate n17 c {e.17 t.17 {{80.136986 2340.000000} {488.835602 2139.657471} {1530.616455 1859.178101} {1073.835571 2412.123291} {296.506836 2756.712402} {128.219177 2957.054688} {96.164383 3021.164307}}} +gate n18 c {e.18 t.18 {{96.164383 2412.123291} {568.972595 2003.424683} {1322.260254 1827.123291} {1073.835571 2139.657471} {560.958923 2556.369873} {168.287674 2997.123291} {48.082191 3277.602783}}} +gate n19 c {e.19 t.19 {{88.150688 2612.465820} {552.945190 2267.876709} {985.684937 2171.712402} {857.465759 2500.273926} {512.876709 2876.917725} {96.164383 3774.452148} {96.164383 3774.452148} {48.082191 3726.369873}}} +gate n2 c {e.02 t.02 {{56.095890 3862.602783} {416.712341 3277.602783} {1121.917847 2740.684814} {2035.479492 2524.315186} {2820.822021 2724.657471} {1755.000000 3437.876709} {745.273987 3806.506836} {440.753418 3894.657471}}} +gate n20 c {e.20 t.20 {{48.082191 2957.054688} {288.493164 2708.630127} {993.698608 2444.177979} {1426.438354 2532.328857} {1490.547974 2724.657471} {969.657532 2900.958984} {817.397278 3021.164307} {408.698639 3373.767090} {312.534241 3461.917725} {136.232880 3806.506836} {128.219177 3814.520508}}} +gate n21 c {e.21 t.21 {{120.205482 2764.726074} {873.493164 2500.273926} {1418.424683 2388.082275} {649.109619 2876.917725} {392.671234 3085.273926} {184.315063 3261.575439} {128.219177 3341.712402} {88.150688 3646.232910}}} +gate n22 c {e.22 t.22 {{48.082191 2876.917725} {817.397278 2315.958984} {1706.917847 2107.602783} {1178.013672 2604.452148} {713.219177 2989.109619} {424.726013 3229.520508} {256.438354 3461.917725} {136.232880 3614.177979} {56.095890 3726.369873}}} +gate n23 c {e.23 t.23 {{112.191780 2957.054688} {729.246582 2532.328857} {1514.588989 2340.000000} {1955.342407 2340.000000} {1418.424683 2868.904053} {945.616455 3173.424561} {681.164368 3341.712402} {504.863007 3461.917725} {240.410965 3694.315186} {192.328766 3718.356201} {168.287674 3734.383545}}} +gate n24 c {e.24 t.24 {{104.178085 3045.205566} {320.547943 2652.534180} {857.465759 2436.164307} {1282.191772 2348.013672} {1081.849365 2700.616455} {576.986328 3221.506836} {280.479462 3598.150635} {184.315063 3718.356201} {144.246582 3790.479492}}} +gate n3 c {e.03 t.03 {{64.109589 3934.726074} {96.164383 3085.273926} {416.712341 2844.863037} {1498.561646 2564.383545} {1979.383545 2636.506836} {2315.958984 2884.931396} {1234.109619 3109.315186}}} +gate n4 c {e.04 t.04 {{120.205482 3253.561523} {264.452057 2957.054688} {609.041077 2620.479492} {1290.205444 2460.205566} {1867.191772 2428.150635} {2452.191895 2468.219238} {977.671204 3229.520508} {264.452057 3662.260254} {160.273972 3782.465820}}} +gate n5 c {e.05 t.05 {{112.191780 2828.835693} {633.082214 2588.424561} {1674.863037 2580.410889} {2572.397217 2460.205566} {1907.260254 2884.931396} {1322.260254 3133.356201} {200.342468 3878.630127} {104.178085 3926.712402}}} +gate n6 c {e.06 t.06 {{248.424652 2724.657471} {913.561646 2340.000000} {1578.698608 2259.863037} {2091.575439 2147.671143} {1626.780762 2412.123291} {1266.164429 2652.534180} {881.506836 2925.000000} {432.739716 3197.465820} {280.479462 3782.465820} {120.205482 3574.109619}}} +gate n7 c {e.07 t.07 {{72.123291 2965.068604} {560.958923 2428.150635} {1618.767090 2299.931396} {1995.411011 2340.000000} {1410.411011 2604.452148} {1041.780762 2756.712402} {785.342468 3021.164307} {568.972595 3229.520508} {480.821930 3309.657471} {376.643829 3429.863037} {256.438354 3542.054688} {176.301376 3606.164307} {128.219177 3638.219238}}} +gate n8 c {e.08 t.08 {{160.273972 2812.808105} {593.013672 2468.219238} {1266.164429 2468.219238} {1570.684937 2476.232910} {1803.082153 2516.301270} {1963.356201 2532.328857} {1987.397217 2556.369873} {2548.356201 2644.520508} {2251.849365 2908.972656} {1650.821899 3085.273926} {1234.109619 3237.534180} {1001.712341 3317.671143} {641.095886 3526.027344} {472.808228 3614.177979} {224.383560 3758.424561} {200.342468 3774.452148}}} +gate n9 c {e.09 t.09 {{96.164383 2941.027344} {697.191772 2524.315186} {1178.013672 2388.082275} {1610.753418 2291.917725} {2059.520508 2243.835693} {2556.369873 2388.082275} {1987.397217 2612.465820} {1306.232910 2820.822021} {985.684937 3013.150635} {512.876709 3429.863037} {296.506836 3614.177979} {240.410965 3662.260254}}} + +# Gate Applications: + + +# filter definitions: ALL FILTERS ARE DISABLED!!!!!!! + Added: branches/LLNLMadcChainSpecTcl/ngatesall.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/ngatesall.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/ngatesall.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1,195 @@ +# SpecTclGUI save file created Wed Oct 20 06:39:12 EDT 2010 +# SpecTclGui Version: 1.0 +# Author: Ron Fox (fo...@ns...) + +#New Tree Parameters: + + +#Modified Tree Parameters: + + +# Pseudo parameter definitions + + +# Tree variable definitions: + + +# Spectrum Definitions + +catch {spectrum -delete 2d.01} +spectrum 2d.01 2 {e.01 t.01} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.02} +spectrum 2d.02 2 {e.02 t.02} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.03} +spectrum 2d.03 2 {e.03 t.03} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.04} +spectrum 2d.04 2 {e.04 t.04} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.05} +spectrum 2d.05 2 {e.05 t.05} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.06} +spectrum 2d.06 2 {e.06 t.06} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.07} +spectrum 2d.07 2 {e.07 t.07} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.08} +spectrum 2d.08 2 {e.08 t.08} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.09} +spectrum 2d.09 2 {e.09 t.09} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.10} +spectrum 2d.10 2 {e.10 t.10} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.11} +spectrum 2d.11 2 {e.11 t.11} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.12} +spectrum 2d.12 2 {e.12 t.12} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.13} +spectrum 2d.13 2 {e.13 t.13} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.14} +spectrum 2d.14 2 {e.14 t.14} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.15} +spectrum 2d.15 2 {e.15 t.15} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.16} +spectrum 2d.16 2 {e.16 t.16} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.17} +spectrum 2d.17 2 {e.17 t.17} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.18} +spectrum 2d.18 2 {e.18 t.18} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.19} +spectrum 2d.19 2 {e.19 t.19} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.20} +spectrum 2d.20 2 {e.20 t.20} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.21} +spectrum 2d.21 2 {e.21 t.21} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.22} +spectrum 2d.22 2 {e.22 t.22} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.23} +spectrum 2d.23 2 {e.23 t.23} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete 2d.24} +spectrum 2d.24 2 {e.24 t.24} {{0.000000 4095.000000 512} {0.000000 4095.000000 512}} +catch {spectrum -delete e.01} +spectrum e.01 1 e.01 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.02} +spectrum e.02 1 e.02 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.03} +spectrum e.03 1 e.03 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.04} +spectrum e.04 1 e.04 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.05} +spectrum e.05 1 e.05 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.06} +spectrum e.06 1 e.06 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.07} +spectrum e.07 1 e.07 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.08} +spectrum e.08 1 e.08 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.09} +spectrum e.09 1 e.09 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.10} +spectrum e.10 1 e.10 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.11} +spectrum e.11 1 e.11 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.12} +spectrum e.12 1 e.12 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.13} +spectrum e.13 1 e.13 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.14} +spectrum e.14 1 e.14 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.15} +spectrum e.15 1 e.15 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.16} +spectrum e.16 1 e.16 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.17} +spectrum e.17 1 e.17 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.18} +spectrum e.18 1 e.18 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.19} +spectrum e.19 1 e.19 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.20} +spectrum e.20 1 e.20 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.21} +spectrum e.21 1 e.21 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.22} +spectrum e.22 1 e.22 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.23} +spectrum e.23 1 e.23 {{0.000000 2047.000000 2048}} +catch {spectrum -delete e.24} +spectrum e.24 1 e.24 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.01} +spectrum t.01 1 t.01 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.02} +spectrum t.02 1 t.02 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.03} +spectrum t.03 1 t.03 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.04} +spectrum t.04 1 t.04 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.05} +spectrum t.05 1 t.05 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.06} +spectrum t.06 1 t.06 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.07} +spectrum t.07 1 t.07 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.08} +spectrum t.08 1 t.08 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.09} +spectrum t.09 1 t.09 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.10} +spectrum t.10 1 t.10 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.11} +spectrum t.11 1 t.11 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.12} +spectrum t.12 1 t.12 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.13} +spectrum t.13 1 t.13 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.14} +spectrum t.14 1 t.14 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.15} +spectrum t.15 1 t.15 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.16} +spectrum t.16 1 t.16 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.17} +spectrum t.17 1 t.17 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.18} +spectrum t.18 1 t.18 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.19} +spectrum t.19 1 t.19 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.20} +spectrum t.20 1 t.20 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.21} +spectrum t.21 1 t.21 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.22} +spectrum t.22 1 t.22 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.23} +spectrum t.23 1 t.23 {{0.000000 2047.000000 2048}} +catch {spectrum -delete t.24} +spectrum t.24 1 t.24 {{0.000000 2047.000000 2048}} + +# Gate definitions in reverse dependency order + +gate n1 c {e.01 t.01 {{48.082191 3221.506836} {24.041096 1642.808228} {416.712341 977.671204} {1354.315063 745.273987} {1755.000000 1041.780762} {785.342468 1755.000000} {392.671234 2283.904053}}} +gate n10 c {e.10 t.10 {{104.178085 2900.958984} {905.547974 2524.315186} {1979.383545 2283.904053} {2492.260254 2203.767090} {3141.369873 2155.684814} {2692.602783 2468.219238} {2171.712402 2644.520508} {881.506836 2957.054688} {416.712341 3429.863037} {272.465759 3734.383545} {160.273972 3846.575439}}} +gate n11 c {e.11 t.11 {{48.082191 2900.958984} {585.000000 2460.205566} {1554.657593 2123.630127} {2219.794434 2155.684814} {1755.000000 2644.520508} {1194.041138 2997.123291} {833.424683 3293.630127} {264.452057 3646.232910} {128.219177 3782.465820}}} +gate n12 c {e.12 t.12 {{200.342468 2756.712402} {1145.958862 2428.150635} {1923.287720 2524.315186} {2700.616455 2620.479492} {1923.287720 3021.164307} {1202.054810 3317.671143} {921.575317 3429.863037} {240.410965 3686.301270} {64.109589 3750.410889}}} +gate n13 c {e.13 t.13 {{104.178085 3053.219238} {897.534241 2460.205566} {1859.178101 2139.657471} {1859.178101 2564.383545} {985.684937 3173.424561} {601.027405 3413.835693} {432.739716 3550.068604} {240.410965 3694.315186} {144.246582 3774.452148}}} +gate n14 c {e.14 t.14 {{184.315063 3029.177979} {625.068481 2668.561523} {1570.684937 2227.808105} {2251.849365 1995.411011} {2243.835693 2388.082275} {1650.821899 2500.273926} {1370.342407 2788.767090} {841.438354 3285.616455} {384.657532 3582.123291} {224.383560 3670.273926}}} +gate n15 c {e.15 t.15 {{96.164383 2973.082275} {945.616455 2460.205566} {1995.411011 2259.863037} {2468.219238 2340.000000} {2612.465820 2444.177979} {1410.411011 3061.232910} {913.561646 3285.616455} {536.917786 3526.027344} {280.479462 3726.369873} {200.342468 3774.452148}}} +gate n16 c {e.16 t.16 {{112.191780 2828.835693} {1186.027344 2179.726074} {2251.849365 2155.684814} {2123.630127 2468.219238} {1330.273926 3013.150635} {865.479431 3173.424561} {649.109619 3309.657471} {240.410965 3582.123291} {136.232880 3686.301270}}} +gate n17 c {e.17 t.17 {{80.136986 2340.000000} {488.835602 2139.657471} {1530.616455 1859.178101} {1073.835571 2412.123291} {296.506836 2756.712402} {128.219177 2957.054688} {96.164383 3021.164307}}} +gate n18 c {e.18 t.18 {{96.164383 2412.123291} {568.972595 2003.424683} {1322.260254 1827.123291} {1073.835571 2139.657471} {560.958923 2556.369873} {168.287674 2997.123291} {48.082191 3277.602783}}} +gate n19 c {e.19 t.19 {{88.150688 2612.465820} {552.945190 2267.876709} {985.684937 2171.712402} {857.465759 2500.273926} {512.876709 2876.917725} {96.164383 3774.452148} {96.164383 3774.452148} {48.082191 3726.369873}}} +gate n2 c {e.02 t.02 {{56.095890 3862.602783} {416.712341 3277.602783} {1121.917847 2740.684814} {2035.479492 2524.315186} {2820.822021 2724.657471} {1755.000000 3437.876709} {745.273987 3806.506836} {440.753418 3894.657471}}} +gate n20 c {e.20 t.20 {{48.082191 2957.054688} {288.493164 2708.630127} {993.698608 2444.177979} {1426.438354 2532.328857} {1490.547974 2724.657471} {969.657532 2900.958984} {817.397278 3021.164307} {408.698639 3373.767090} {312.534241 3461.917725} {136.232880 3806.506836} {128.219177 3814.520508}}} +gate n21 c {e.21 t.21 {{120.205482 2764.726074} {873.493164 2500.273926} {1418.424683 2388.082275} {649.109619 2876.917725} {392.671234 3085.273926} {184.315063 3261.575439} {128.219177 3341.712402} {88.150688 3646.232910}}} +gate n22 c {e.22 t.22 {{48.082191 2876.917725} {817.397278 2315.958984} {1706.917847 2107.602783} {1178.013672 2604.452148} {713.219177 2989.109619} {424.726013 3229.520508} {256.438354 3461.917725} {136.232880 3614.177979} {56.095890 3726.369873}}} +gate n23 c {e.23 t.23 {{112.191780 2957.054688} {729.246582 2532.328857} {1514.588989 2340.000000} {1955.342407 2340.000000} {1418.424683 2868.904053} {945.616455 3173.424561} {681.164368 3341.712402} {504.863007 3461.917725} {240.410965 3694.315186} {192.328766 3718.356201} {168.287674 3734.383545}}} +gate n24 c {e.24 t.24 {{104.178085 3045.205566} {320.547943 2652.534180} {857.465759 2436.164307} {1282.191772 2348.013672} {1081.849365 2700.616455} {576.986328 3221.506836} {280.479462 3598.150635} {184.315063 3718.356201} {144.246582 3790.479492}}} +gate n3 c {e.03 t.03 {{64.109589 3934.726074} {96.164383 3085.273926} {416.712341 2844.863037} {1498.561646 2564.383545} {1979.383545 2636.506836} {2315.958984 2884.931396} {1234.109619 3109.315186}}} +gate n4 c {e.04 t.04 {{120.205482 3253.561523} {264.452057 2957.054688} {609.041077 2620.479492} {1290.205444 2460.205566} {1867.191772 2428.150635} {2452.191895 2468.219238} {977.671204 3229.520508} {264.452057 3662.260254} {160.273972 3782.465820}}} +gate n5 c {e.05 t.05 {{112.191780 2828.835693} {633.082214 2588.424561} {1674.863037 2580.410889} {2572.397217 2460.205566} {1907.260254 2884.931396} {1322.260254 3133.356201} {200.342468 3878.630127} {104.178085 3926.712402}}} +gate n6 c {e.06 t.06 {{248.424652 2724.657471} {913.561646 2340.000000} {1578.698608 2259.863037} {2091.575439 2147.671143} {1626.780762 2412.123291} {1266.164429 2652.534180} {881.506836 2925.000000} {432.739716 3197.465820} {280.479462 3782.465820} {120.205482 3574.109619}}} +gate n7 c {e.07 t.07 {{72.123291 2965.068604} {560.958923 2428.150635} {1618.767090 2299.931396} {1995.411011 2340.000000} {1410.411011 2604.452148} {1041.780762 2756.712402} {785.342468 3021.164307} {568.972595 3229.520508} {480.821930 3309.657471} {376.643829 3429.863037} {256.438354 3542.054688} {176.301376 3606.164307} {128.219177 3638.219238}}} +gate n8 c {e.08 t.08 {{160.273972 2812.808105} {593.013672 2468.219238} {1266.164429 2468.219238} {1570.684937 2476.232910} {1803.082153 2516.301270} {1963.356201 2532.328857} {1987.397217 2556.369873} {2548.356201 2644.520508} {2251.849365 2908.972656} {1650.821899 3085.273926} {1234.109619 3237.534180} {1001.712341 3317.671143} {641.095886 3526.027344} {472.808228 3614.177979} {224.383560 3758.424561} {200.342468 3774.452148}}} +gate n9 c {e.09 t.09 {{96.164383 2941.027344} {697.191772 2524.315186} {1178.013672 2388.082275} {1610.753418 2291.917725} {2059.520508 2243.835693} {2556.369873 2388.082275} {1987.397217 2612.465820} {1306.232910 2820.822021} {985.684937 3013.150635} {512.876709 3429.863037} {296.506836 3614.177979} {240.410965 3662.260254}}} + +# Gate Applications: + + +# filter definitions: ALL FILTERS ARE DISABLED!!!!!!! + Added: branches/LLNLMadcChainSpecTcl/ploty2f.tcl =================================================================== --- branches/LLNLMadcChainSpecTcl/ploty2f.tcl (rev 0) +++ branches/LLNLMadcChainSpecTcl/ploty2f.tcl 2011-03-09 00:08:06 UTC (rev 1818) @@ -0,0 +1,315 @@ +# This software is Copyright by the Board of Trustees of Michigan +# State University (c) Copyright 2009. +# +# 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 + + +package require Tk +package require snit + + +# +# Code to plot y2f as a function of time gate. +# +# The following control panel controls the plot: +# +# +--------------------------------------------------------------+ +# | [ ] Log Scale | +# | ( ) View ( ) Postscript | +# | XTitle [Gate ] | +# | YTitle [Y2f ] | +# | Title [Y2f v Gate ] | +# +--------------------------------------------------------------+ +# | [ Plot ] [ Cancel ] | +# +--------------------------------------------------------------+ + +snit::widget Y2f { + hulltype toplevel + # + # Default values for 'stuff' + # + typevariable defaultLogScale 0 + typevariable defaultPostscript 0 + typevariable defaultXtitle {Gate} + typevariable defaultYtitle {Y2f} + typevariable defaultTitle {Y2f vs. Gate} + + + # The following hold the actual values through the life of the dialog + + variable logScale + variable postscript + variable Xtitle + variable Ytitle + variable title + + # + # Fit results : + # + + variable K; # units are counts [unit-less] + variable Lambda; # units will be 1/useconds... I think sinceinput time is useconds. + + constructor args { + + + # + # Build the widgets: + # + + set work [ttk::frame $win.work -relief groove -borderwidth 3]; # Top frame with work controls + set action [ttk::frame $win.action]; # Bottom frame with action buttons. + + # Work area controls. + + ttk::checkbutton $work.log -text {Log Scale} -variable [myvar logScale] + ttk::radiobutton $work.screen -text {View} -variable [myvar postscript] -value 0 + ttk::radiobutton $work.postscript -text {Postscript} -variable [myvar postscript] -value 1 + ttk::label $work.xtitlel -text {X title} + ttk::entry $work.xtitle -textvariable [myvar Xtitle] + ttk::label $work.ytitlel -text {Y title} + ttk::entry $work.ytitle -textvariable [myvar Ytitle] + ttk::label $work.titlel -text {Plot Title} + ttk::entry $work.title -textvariable [myvar title] + + # Action area controls: + + ttk::button $action.plot -text {Plot} -command [mymethod plot] + ttk::button $action.cancel -text {Cancel} -command [mymethod cancel] + + # Layout the widgets + + grid $work.log -sticky w + grid $work.screen $work.postscript -sticky w + grid $work.xtitlel $work.xtitle -sticky w + grid $work.ytitlel $work.ytitle -sticky w + grid $work.titlel $work.title -sticky w + + grid $action.plot $action.cancel + + grid $work -sticky ew + grid $action -sticky ew + + # Apply the defaults + + set logScale $defaultLogScale + set postscript $defaultPostscript + set Xtitle $defaultXtitle + set Ytitle $defaultYtitle + set title $defaultTitle + + } + #------------------------- Action methods ------------------------------------- + + # + # cancel - called when the cancel action area button is clicked. + # $win is destroyed and no changes made to the typevariables. + # + method cancel {} { + after 100 [list destroy $win]; # Done to allow us exit before destruction. + } + # + # plot - Called when the plot button is clicked. A GNU Plot session is + # created and controlled via a pipe to plot the data + # + method plot {} { + $self gnuPlot + $self updateDefaults + $self cancel; # Kill the widget after the plot is done. + } + + #------------------------ Private methods --------------------------------- + + # Make the last set of values sticky to the next invocation + # + method updateDefaults {} { + set defaultLogScale $logScale + set defaultPostscript $postscript + set defaultXtitle $Xtitle + set defaultYtitle $Ytitle + set defaultTitle $title + + } + # + # Actually plot the data. + # + method gnuPlot {} { + set gateCount ${::multiplicity.bins}; # This many gates need plotting. + set binWidth ${::multiplicity.mintime}; # Width of each bin in nsec. + + set binWidth [expr $binWidth/1000.0]; # With in usec. + + # Create the data file: + + set dataFile [exec mktemp] + set df [open $dataFile w] + + set fitInput [list]; # Build up list of points for the fit: + for {set i 0} {$i < $gateCount} {incr i} { + set y [y2f $i] + set t [expr $binWidth * ($i + 1)]; # t in usec. + set ty [list $t $y] + puts $df $ty + lappend fitInput $ty + } + + close $df + + # now the fit: + + set fitPoints [$self computeFit $fitInput] + set fitDone 0 + if {[llength $fitPoints] != 0} { + set fitDone 1 + set fitFile [exec mktemp] + set ff [open $fitFile w] + foreach point $fitPoints { + puts $ff $point + } + } + close $ff + + # Open the gnu plot and tell it what to do: + # note that if we're making postscript we need to prompt for the + # output file and set the appropriate paramters in gnuplot for postscript + # output to that file: + + set gp [open |gnuplot w] + + if {$postscript} { + set outputFile [tk_getSaveFile \ + -defaultextension .ps \ + -title {Output file} \ + -filetypes { + {{Postscript} {.ps} } + {{All files} * } + } + ] + # + # An emtpy filename means he wants to reconsider the settings: + + if {$outputFile eq ""} return + puts $gp "set size 1.0, 0.6" + puts $gp "set terminal postscript portrait enhanced mono dashed lw 1 'Helvetica' 14" + puts $gp "set output '$outputFile'" + } + puts $gp "set title '$title'" + puts $gp "set xlabel '$Xtitle'" + puts $gp "set ylabel '$Ytitle'" + if {$logScale} { + puts $gp "set logscale y" + } + puts $gp "set key off" + + # Labels in the plot frame: + + + set labelBase [expr $y... [truncated message content] |