--- /dev/null
+##################################################
+## get minimal distro from cloud ##
+##################################################
+
+FROM opensuse/leap:15.0
+
+
+
+##################################################
+## prerequisites ##
+##################################################
+
+### install system packages with opensuse package manager
+RUN zypper ref && zypper --non-interactive in \
+ wget curl \
+ tar zlib \
+ cmake gcc gcc-c++ \
+ libX11-devel libXext-devel libXft-devel libXpm-devel\
+ git subversion \
+ libqt4-devel\
+ git bash cmake gcc-c++ gcc binutils \
+ xorg-x11-libX11-devel xorg-x11-libXpm-devel xorg-x11-devel \
+ xorg-x11-proto-devel xorg-x11-libXext-devel \
+ gcc-fortran libopenssl-devel \
+ pcre-devel Mesa glew-devel pkg-config libmysqlclient-devel \
+ fftw3-devel libcfitsio-devel graphviz-devel \
+ libdns_sd avahi-compat-mDNSResponder-devel openldap2-devel \
+ python-devel libxml2-devel krb5-devel gsl-devel libqt4-devel \
+ glu-devel \
+ xterm screen xvfb-run x11vnc openbox \
+ boost-devel \
+ vim \
+ dhcp-server\
+ rpcbind \
+ gnuplot \
+ ImageMagick \
+ perl-XML-LibXML \
+ glibc-locale \
+ tmux \
+ xorg-x11-Xvnc \
+ emacs \
+ htop \
+ ncdu \
+ psmisc \
+ python-pip \
+ firefox \
+ lxpanel \
+ libtirpc-devel \
+ perl-File-chdir \
+ perl-TimeDate \
+ gzip \
+ tig
+
+
+### install perl modules from cpan ###
+RUN cpan Data::TreeDumper CGI::Carp
+
+### install python modules from pip ###
+RUN pip install --upgrade pip && pip install prettytable python2-pythondialog
+
+
+
+##################################################
+## select stable repositories ##
+##################################################
+
+### stable versions of git/svn repos to checkout ###
+
+#ENV TRBNET_COMMIT=master
+
+ENV TRBNET_COMMIT=02cf41a486d64bc894986fe87c174bfe1b07fc9b
+# newest version of trbnettools does not work with this system ... revert to older commit ###
+# has something to do with commit 0cd022a9b0bda2213989eef118a1dda077794ba9
+# 2019-01-24 00:17 Michael Traxler ---- added -ltirpc in Makesfiles for a working RPC implementation, mt
+# commit breaks rpc communication
+
+
+##################################################
+
+
+#ENV DAQTOOLS_COMMIT=master
+
+ENV DAQTOOLS_COMMIT=4840d304ad9cce93ffe972ef8cff4c325d7ac198
+# newest commit from 2018-02-28
+
+
+##################################################
+
+#ENV DABC_TRB3_REV=HEAD
+
+ENV DABC_TRB3_REV=4242
+# newest commit from 2018-02-28
+
+
+##################################################
+## Go4 + dabc + root ##
+##################################################
+
+### check out revision 4242, newest revision from today 2019-02-28 ###
+RUN svn checkout -r $DABC_TRB3_REV https://subversion.gsi.de/dabc/trb3
+
+RUN cd /trb3; make -j2; make_exit_value=$?; \
+ echo -e "\n\n---- display make log: ----\n\n"; \
+ cat $(find . -iname "makelog.txt"); \
+ $( exit $make_exit_value )
+
+
+
+##################################################
+## trbnet ##
+##################################################
+
+
+
+RUN git clone git://jspc29.x-matter.uni-frankfurt.de/projects/trbnettools.git &&\
+ cd /trbnettools &&\
+ git checkout $TRBNET_COMMIT &&\
+ cd /trbnettools/libtrbnet_perl && \
+ perl Makefile.PL && \
+ cd /trbnettools && \
+ make clean && \
+ make TRB3=1 && \
+ make TRB3=1 install && \
+ echo "/trbnettools/liblocal" >> /etc/ld.so.conf.d/trbnet.conf && \
+ ldconfig -v
+
+ENV PATH=$PATH:/trbnettools/bin
+
+
+
+
+##################################################
+## daqtools ##
+##################################################
+
+RUN git clone git://jspc29.x-matter.uni-frankfurt.de/projects/daqtools.git && \
+ cd /daqtools && \
+### check out newest commit 4840d3... as today: 2019-02-28 ###
+ git checkout $DAQTOOLS_COMMIT && \
+ cd /daqtools/xml-db && \
+ ./xml-db.pl
+
+### replace httpi with a modified version, because the httpi in daqtools won't run as root
+COPY build_files/httpi /daqtools/web/httpi
+
+
+
+
--- /dev/null
+
+name=$(basename $(pwd))
+
+docker build -t $name . || exit
+
+
--- /dev/null
+
+name=$(basename $(pwd))
+
+docker build -t $name . || exit
+
+docker run --net host -v $(pwd)/conf:/conf -v $(pwd)/workdir:/workdir --rm -it \
+--name $name \
+$name /workdir/start.sh
+
--- /dev/null
+
+name=$(basename $(pwd))
+
+docker build -t $name . || exit
+
+docker run --net host -v $(pwd)/conf:/conf -v $(pwd)/workdir:/workdir --rm -it \
+--name $name \
+$name /bin/bash
+
--- /dev/null
+#!/usr/bin/perl
+use POSIX qw(SIGALRM SIGTERM sigaction);
+
+use lib "./";
+use lib "./include";
+use Digest::SHA::PurePerl qw(sha1_base64);
+
+
+$VERSION = "1.7 (Demonic/Linux)";
+
+# HTTPi Hypertext Tiny Truncated Process Implementation
+# Copyright 1999-2010 Cameron Kaiser and Contributors # All rights reserved
+# Please read LICENSE # Do not strip this copyright message.
+
+###############################################################
+# WHITE HATS ONLY BELOW THIS POINT -- SEE DOCUMENTATION FIRST #
+###############################################################
+
+%system_content_types =
+ ("html" => "text/html",
+ "htm" => "text/html",
+ "txt" => "text/plain",
+ "xml" => "text/xml",
+ "xsl" => "text/xml",
+ "xhtml" => "application/xhtml+xml",
+ "css" => "text/css",
+ "gif" => "image/gif",
+ "jpeg" => "image/jpeg",
+ "jpg" => "image/jpeg",
+ "bmp" => "image/bmp",
+ "png" => "image/png",
+ "tif" => "image/tiff",
+ "tiff" => "image/tiff",
+ "ico" => "image/x-icon",
+ "svg" => "image/svg+xml",
+ "svgz" => "image/svg+xml",
+ "wbmp" => "image/vnd.wap.wbmp",
+ "wbm" => "image/vnd.wap.wbmp",
+ "xbm" => "image/x-xbitmap",
+ "mp3" => "audio/x-mpeg",
+ "wma" => "audio/x-ms-wma",
+ "wav" => "audio/x-wav",
+ "au" => "audio/basic",
+ "aif" => "audio/x-aiff",
+ "aiff" => "audio/x-aiff",
+ "ogg" => "audio/x-ogg",
+ "oga" => "audio/x-ogg",
+ "mid" => "audio/midi",
+ "wma" => "audio/x-ms-wma",
+ "mpeg" => "video/mpeg",
+ "mpg" => "video/mpeg",
+ "aac" => "audio/aac",
+ "ogv" => "video/x-ogg",
+ "ogx" => "application/x-ogg",
+ "avi" => "video/x-msvideo",
+ "wmv" => "video/x-ms-wmv",
+ "asf" => "video/x-ms-asf",
+ "mov" => "video/quicktime",
+ "mp4" => "video/mp4",
+ "rv" => "video/vnd.m-realvideo",
+ "rm" => "application/vnd.m-realmedia",
+ "ra" => "audio/vnd.m-realaudio",
+ "ram" => "audio/vnd.m-realaudio",
+ "pdf" => "application/pdf",
+ "fdf" => "application/vnd.fdf",
+ "class" => "application/octet-stream",
+ "jar" => "application/octet-stream",
+ "js" => "application/x-javascript",
+ "lnk" => "application/x-hyperlink",
+ "prg" => "application/x-c64-prg-binary",
+ "d64" => "application/x-c64-disk-image",
+ "tar" => "application/x-tar",
+ "sit" => "application/x-stuffit",
+ "Z" => "application/x-compress",
+ "gz" => "application/x-gzip",
+ "dmg" => "application/octet-stream",
+ "img" => "application/octet-stream",
+ "lzh" => "application/octet-stream",
+ "lha" => "application/octet-stream",
+ "exe" => "application/octet-stream",
+ "com" => "application/octet-stream",
+ "zip" => "application/x-zip-compressed",
+ "hqx" => "application/x-binhex",
+ "swf" => "x-shockwave-flash",
+ "flv" => "video/x-flv",
+
+ "bin" => "application/octet-stream");
+
+# comment in to enable logs
+#$logfile = "./access.log";
+$path = "./htdocs";
+$sockaddr = 'S n a4 x8';
+
+$server_host = $ARGV[0];
+$server_port = $ARGV[1];
+
+die("$0 [host] [port] required. got >$server_host< >$server_port<") unless ($server_host and $server_port);
+
+%content_types =
+ ("html" => "text/html",
+ "htm" => "text/html",
+ "shtml" => "text/html"
+ );
+%restrictions = (
+ "/nw" => "^10\.##^Mozilla#MSIE",
+ "/status" => "####voyeur:daNrZR3TcSwD2",
+ "/" => "###(NPBot|WebZIP|HTTrack|eCatch|Offline Explorer|UdmSearch|WebCopier|internetseer|MSIECrawler|SuperBot|LinkWalker|Tutorial Crawler|WebReaper)",
+ );
+ # See documentation for interpreting this string.
+
+$headers = <<"EOF";
+Server: TRB3-DAQ based on HTTPi/$VERSION
+MIME-Version: 1.0
+EOF
+
+
+%content_types = (%system_content_types, %content_types);
+undef %system_content_types;
+
+#if ($pid = fork()) { exit; }
+$0 = "dhttpi: binding port ...";
+$bindthis = pack($sockaddr, 2, $server_port, pack('C4', 0, 0, 0, 0));
+socket(S, 2, 1, 6);
+setsockopt(S, 1, 2, 1);
+bind(S, $bindthis) || die("$0: while binding port $server_port:\n\"$!\"\n");
+listen(S, 128);
+$0 = "dhttpi: connected and waiting ANY:$server_port";
+
+$statiosuptime = time();
+
+sub sock_to_host {
+ return ($cache_hn, $cache_port, $cache_ip)
+ if (length($cache_ip));
+
+ return (undef, undef, undef) if (!$sock);
+ my($AFC, $cache_port, $thataddr, $zero) = unpack($sockaddr, $sock);
+ $cache_ip = join('.', unpack("C4", $thataddr));
+ $cache_hn =
+ gethostbyaddr($thataddr, 2) ||
+ $cache_ip;
+ return ($cache_hn, $cache_port, $cache_ip);
+}
+
+
+sub htsponse {
+ ($currentcode, $currentstring) = (@_);
+ return if (0+$httpver < 1);
+ my($what) = <<"EOF";
+HTTP/$httpver $currentcode $currentstring
+${headers}Date: $rfcdate
+EOF
+ $what =~ s/\n/\r\n/g;
+ print STDOUT $what;
+ &hthead("Connection: close") if (0+$httpver > 1);
+}
+
+sub hthead {
+ my($header, $term) = (@_);
+ return if (0+$httpver < 1);
+ print STDOUT "$header\r\n" , ($term) ? "\r\n" : "";
+}
+
+sub htcontent {
+ my($what, $ctype, $mode) = (@_);
+ ($contentlength) = $mode || length($what);
+ &hthead("Content-Length: $contentlength");
+ &hthead("Content-Type: $ctype", 1);
+ return if ($method eq 'HEAD' || $mode);
+ print STDOUT $what;
+}
+
+sub log {
+ if ($logfile && open(J, ">>$logfile")) {
+ my $q = $address . (($variables) ? "?$variables" : "");
+ $contentlength += 0;
+ $contentlength = 0 if ($method eq 'HEAD');
+ my ($hostname, $port, $ip) = &sock_to_host();
+ $hostname ||= "-";
+ $httpuser ||= "-";
+ print J <<"EOF";
+$hostname - $httpuser [$date] "$method $q HTTP/$httpver" $currentcode $contentlength "$httpref" "$httpua"
+EOF
+ close(J);
+ }
+}
+
+
+sub bye { exit; }
+sub byebye { kill(9,$secondary_pid) if ($secondary_pid); exit; }
+
+sub dead {
+ &htsponse(500, "Server Error");
+ &hterror("Server Error", <<"EOF");
+The server cannot comply with your request for resource <tt>$::address</tt>.
+Please attempt to notify the administrators.
+<p>Useful(?) debugging information:
+<pre>
+@_
+</pre>
+EOF
+ &log; exit;
+}
+
+sub defaultsignals {
+ $SIG{'__DIE__'} = \&dead;
+ sigaction SIGALRM, new POSIX::SigAction \&bye
+ or die "sigalrm failed: $!\n";
+ sigaction SIGTERM, new POSIX::SigAction \&byebye
+ or die "sigterm failed: $!\n";
+}
+&defaultsignals;
+
+sub alarmsignals {
+ undef $SIG{'__DIE__'};
+ sigaction SIGALRM, new POSIX::SigAction sub { die; }
+ or die "sigalrm failed: $!\n";
+}
+
+sub master {
+ $0 = "dhttpi: handling request";
+$sock = getpeername(STDIN);
+$rfcdate = &rfctime(scalar gmtime, 1);
+$date = scalar localtime;
+($dow, $mon, $dt, $tm, $yr) = ($date =~
+ m/(...) (...) (..) (..:..:..) (....)/);
+$dt += 0;
+$dt = substr("0$dt", length("0$dt") - 2, 2);
+$date = "$dt/$mon/$yr:$tm +0000";
+
+select(STDOUT); $|=1; $address = 0;
+alarm 5;
+while (<STDIN>) {
+ if(/^([A-Z]+)\s+([^\s]+)\s+([^\s\r\l\n]*)/) {
+ $method = $1;
+ $address = $2;
+ $httpver = $3;
+ $httpref = '';
+ $httpua = '';
+ $httpver = ($httpver =~ m#HTTP/([0-9]\.[0-9]+)#) ?
+ ($1) : (0.9);
+ $address =~ s#^http://[^/]+/#/#;
+ $0 = $execstring = "dhttpi: $method $address $httpver";
+ next unless ($httpver < 1);
+ } else {
+ s/[\r\l\n\s]+$//;
+ (/^Host:\s+(.+)/i) && ($httphost = substr($1, 0, 255))
+ && ($httphost =~ s/:\d+$//);
+ (/^Referer:\s+(.+)/i) && ($httpref = substr($1, 0, 1024));
+ (/^User-agent:\s+(.+)/i) && ($httpua = substr($1, 0, 1024));
+ (/^Content-length:\s+(\d+)/i) &&
+ ($ENV{'CONTENT_LENGTH'} = $httpcl = 0+$1);
+ (/^Content-type:\s+(.+)/i) &&
+ ($ENV{'CONTENT_TYPE'} = $httpct = substr($1, 0, 255));
+ (/^Expect:\s+/) && ($expect = 1);
+ (/^Cookie:\s+(.+)/i) &&
+ ($ENV{'HTTP_COOKIE'} = substr($1, 0, 16384));
+ (/^Authorization:\s+Basic (.+)/i) &&
+ ($httprawu = substr($1, 0, 1024));
+ (/^Range:\s+(.+)/i) &&
+ ($ENV{'CONTENT_RANGE'} = substr($1, 0, 255));
+ (/^If-Modified-Since:\s+(.+)/i) &&
+ ($modsince = $ENV{'HTTP_IF_MODIFIED_SINCE'} =
+ substr($1, 0, 255));
+ (/^Accept:\s+(.+)/i) &&
+ ($ENV{'HTTP_ACCEPT'} = substr($1, 0, 255));
+ (/^Accept-([a-zA-Z0-9]+):\s+(.+)/i) &&
+ ($ENV{'HTTP_ACCEPT_'.uc(substr($1, 0, 16))} =
+ substr($2, 0, 255));
+ (/^X-Requested-With:\s+(.+)/i) &&
+ ($ENV{'HTTP_X_REQUESTED_WITH'} = substr($1, 0, 1024));
+
+ (/^Origin:\s+(.+)/i) &&
+ ($ENV{'HTTP_ORIGIN'} = substr($1, 0, 1024));
+ (/^Upgrade:\s+(.+)/i) &&
+ ($ENV{'HTTP_UPGRADE'} = substr($1, 0, 1024));
+ (/^Sec-WebSocket-Protocol:\s+(.+)/i) &&
+ ($ENV{'WEBSOCKET_PROTOCOL'} = substr($1, 0, 1024));
+ (/^Sec-WebSocket-Version:\s+(-?\d+)/i) &&
+ ($ENV{'WEBSOCKET_VERSION'} = substr($1, 0, 8));
+ (/^Sec-WebSocket-Extensions:\s+(-?\d+)/i) &&
+ ($ENV{'WEBSOCKET_EXTENSIONS'} = substr($1, 0, 1024));
+ (/^Sec-WebSocket-Key:\s+(\S+)/i) &&
+ ($ENV{'WEBSOCKET_KEY'} = substr($1, 0, 1024));
+
+ next unless (/^$/);
+ }
+ if ($expect) {
+ &htsponse(417, "Expectation Failed");
+ &hterror("Expectation Failed",
+ "The server does not support this method.");
+ &log; exit;
+ }
+ if (!length($address) || (0+$httpver > 1 && !$httphost)) {
+ &htsponse(400, "Bad Request");
+ &hterror("Bad Request",
+ "The server cannot understand your request.");
+ &log; exit;
+ }
+ if ($method !~ /^(GET|HEAD|POST)$/) {
+ &htsponse(501, "Not Implemented");
+ &hterror("Not Implemented",
+ "Only GET, HEAD and POST are supported.");
+ &log; exit;
+ }
+
+
+ if ($ENV{'HTTP_UPGRADE'} eq 'websocket') {
+ if ($method ne "GET" || !$ENV{'WEBSOCKET_KEY'}) {
+ &htsponse(400, "Bad request");
+ &hterror("Bad request",
+ "Illegal websocket opening handshake");
+ &log; exit;
+ }
+
+ $ENV{'WEBSOCKET_ACCEPT'} =
+ sha1_base64($ENV{'WEBSOCKET_KEY'} . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11") . "=";
+
+
+ }
+
+
+
+ ($address, $variables) = split(/\?/, $address);
+ $address =~ s/%([0-9a-fA-F]{2})/pack("H2", $1)/eg;
+ $address=~ s#^/?#/#;
+ 1 while $address =~ s#/\.(/|$)#\1#;
+ 1 while $address =~ s#/[^/]*/\.\.(/|$)#\1#;
+ 1 while $address =~ s#^/\.\.(/|$)#\1#;
+ $fail = 0;
+ J: foreach(sort { length $a <=> length $b }
+ keys %restrictions) {
+ next if ($address !~ /^$_/);
+ ($allowip, $denyip, $allowua, $denyua, $auser) =
+ split(/#/, $restrictions{$_});
+ if ($allowip || $denyip) {
+ ($hostname, $port, $ip) = &sock_to_host();
+ ($allowip && $ip !~ /$allowip/) && ($fail = 1,
+ last J);
+ ($denyip && $ip =~ /$denyip/) && ($fail = 1,
+ last J);
+ }
+ ($allowua && $httpua !~ /$allowua/) &&
+ ($fail = 2, last J);
+ ($denyua && $httpua =~ /$denyua/) &&
+ ($fail = 2, last J);
+ }
+ if ($fail) {
+ &htsponse(403, "Forbidden");
+ if ($fail == 1) {
+ &hterror("Forbidden (Client Disallowed)", <<"EOF");
+Your network address (<i>$ip</i>) is not allowed to access this resource.
+EOF
+ &log; exit;
+ } else {
+ &hterror("Forbidden (Browser Disallowed)", <<"EOF");
+The browser you are using (<i>$httpua</i>) is not capable of or
+is not allowed access to this resource.
+EOF
+ &log; exit;
+ }
+ }
+ if ($auser) {
+ $httprawu =~ tr#A-Za-z0-9+/##cd;
+ $httprawu =~ tr#A-Za-z0-9+/# -_#;
+ $httprawu = unpack("u", pack("c", 32+0.75*length($httprawu))
+ . $httprawu);
+ ($httpuser, $httppw) = split(/:/, $httprawu);
+ $fail = 1;
+ foreach $user (split(/,/, $auser)) {
+ ($user, $pw) = split(/:/, $user);
+ ($fail = 0, last) if ($user eq $httpuser &&
+ crypt($httppw, substr($pw, 0, 2)) eq $pw);
+ }
+ if ($fail) {
+ $httpuser = '';
+ &htsponse(401, "Authorization Required");
+ &hthead("WWW-Authenticate: Basic realm=\"$address\"");
+ &hterror("Authorization Required", <<"EOF");
+You must provide a username and password to use this resource. Either you
+entered this information incorrectly, or your browser does not know how to
+present the credentials required.
+EOF
+ &log; exit;
+ }
+ }
+
+ alarm 0;
+
+
+
+
+ $raddress = "$path$address"
+ ;
+ 1 while ($raddress =~ s#//#/#);
+ &hterror301("http://$server_host:$server_port$address/")
+ if ($address !~ m#/$# && -d $raddress);
+ $raddress = (-r "${raddress}index.shtml") ?
+ "${raddress}index.shtml" : "${raddress}index.html"
+ if (-d $raddress);
+ IRED: ($hostname, $port, $ip) = &sock_to_host();
+ if(!sysopen(S, $raddress, 0)) { &hterror404; } else {
+ if ((-x $raddress)
+ ) {
+ $currentcode = 100; &nsecmodel;
+ $ENV{'REQUEST_METHOD'} = $method;
+ $ENV{'SERVER_NAME'} = $server_host;
+ $ENV{'SERVER_PROTOCOL'} = "HTTP/$httpver";
+ $ENV{'SERVER_SOFTWARE'} = "HTTPi/$VERSION";
+ $ENV{'SERVER_PORT'} = "$server_port";
+ $ENV{'SERVER_URL'} = "http://$server_host:$server_port/";
+ $ENV{'SCRIPT_FILENAME'} = $raddress;
+ $ENV{'SCRIPT_NAME'} = $address;
+ $ENV{'REMOTE_HOST'} = $hostname;
+ $ENV{'REMOTE_ADDR'} = $ip;
+ $ENV{'REMOTE_PORT'} = $port;
+ $ENV{'QUERY_STRING'} = $variables;
+ $ENV{'HTTP_USER_AGENT'} = $httpua;
+ $ENV{'HTTP_REFERER'} = $httpref;
+ undef $pid;
+ if ($pid = fork()) { kill 15, $$; exit; }
+ elsif (!defined($pid)) {
+ die
+ "temporary(?) fork error, please retry request: $!\n";
+ } else {
+ require $raddress;
+ exit;
+ }
+ }
+ ($x,$x,$x,$x,$x,$x,$x,$length,$x,$mtime) = stat(S);
+ $ctype = 0;
+ foreach(keys %content_types) {
+ if ($raddress =~ /\.$_$/i) {
+ $ctype = $content_types{$_};
+ }
+ }
+ $mtime = &rfctime($mtime);
+SERVEIT:
+ if ($mtime eq $modsince) {
+ &htsponse(304, "Not Modified");
+ &hthead("Last-Modified: $mtime", 1);
+ &log; exit;
+ }
+ $ctype ||= 'text/plain';
+ if ($pid = fork()) { kill 15, $$; exit; }
+ $contentlength ||= $length;
+ &htsponse(200, "OK");
+ &hthead("Last-Modified: $mtime");
+ &htcontent("", $ctype, $length);
+ &nsecmodel;
+ $bytecount = 0;
+ unless ($method eq 'HEAD') {
+ while(!eof(S)) {
+ read(S, $q, 32768);
+ print STDOUT $q;
+ $bytecount += 32768;
+ $0 = $execstring .
+ " ($bytecount bytes sent)";
+ }
+ }
+ alarm 0;
+ }
+ exit;
+}
+
+exit;
+}
+
+
+sub nsecmodel {
+ &log;
+ ($x,$x,$x,$x,$uid,$gid) = stat(S);
+ #(!$uid || !$gid || $uid < 2 ) &&
+# die "resource is root-owned, secured or not stat-able\n";
+# if (!$<) {
+# ($) = "$gid $gid") || die "can't set egid to $gid";
+# ($> = $uid) || die "can't set euid to $uid";
+# ($( = "$gid $gid") || die "can't set rgid to $gid";
+# ($< = $uid) || die "can't set ruid to $uid";
+# }
+}
+
+sub rfctime {
+ my $mtime = shift;
+ $mtime = (scalar gmtime $mtime) if (!(shift));
+ my ($dow, $mon, $dt, $tm, $yr) =
+ ($mtime =~ m/(...) (...) (..) (..:..:..) (....)/);
+ $dt += 0; $yr += 0;
+ return "$dow, $dt $mon $yr $tm GMT";
+}
+
+sub hterror {
+ my($errstr, @expl) = (@_);
+ &htcontent(<<"EOF", "text/html");
+<html>
+<body>
+<h1>$errstr</h1>
+@expl
+<hr>
+<address><a href = "http://httpi.floodgap.com/">httpi/$VERSION</a>
+by Cameron Kaiser</address>
+</body>
+</html>
+EOF
+ }
+
+sub hterror404 {
+ &htsponse(404, "Not Found");
+ &hterror("Not Found",
+ "The resource <tt>$address</tt> was not found on this system.");
+ &log; exit;
+}
+
+sub hterror301 {
+ &htsponse(301, "Moved Permanently");
+ &hthead("Location: @_");
+ &hterror("Resource Moved Permanently",
+ "This resource has moved <a href = \"@_\">here</a>.");
+ &log; exit;
+}
+
+
+$0 = "dhttpi: on ANY:$server_port, ready!";
+$master_pid = $$;
+for (;;) {
+ if ($secondary_pid = fork()) {
+ waitpid($secondary_pid, 0);
+ $0 = "dhttpi: on ANY:$server_port, last request " .
+ scalar localtime;
+ } else {
+ $0 = "dhttpi (child of $master_pid): waiting for connect";
+ $addr=accept(NS,S);
+ open(STDIN, "<&NS");
+ open(STDOUT, ">&NS");
+ &defaultsignals;
+ &master;
+ exit;
+ }
+}
--- /dev/null
+#!/bin/bash
+
+
+trbcmd s 0x7100000390255228 0x00 0x0350
+trbcmd s 0x8c0000039025fa28 0x01 0x0351
+trbcmd s 0xb00000039053e328 0x02 0x0352
+trbcmd s 0x790000039053dc28 0x03 0x0353
+trbcmd s 0x920000039053d928 0x05 0xc035
+echo "FPGAs after addressing"
+trbcmd i 0xffff
--- /dev/null
+#!/bin/bash
+
+cd /conf
+
+
+
+echo "configure container"
+
+export TRB3_PORT=35
+export DAQOPSERVER=localhost:$TRB3_PORT
+export TRB3_SERVER=192.168.4.240
+export CTS_GUI_PORT=1148
+export CTS_ENDPOINT=0xc035
+export DISPLAY=:2 # go4 window will be sent to $DISPLAY, if provide_vnc == yes , then it will be this x11 display
+
+export PULSER=192.168.103.74
+
+> conf_log.txt
+
+provide_dhcp=yes
+#edit conf/dhcpd.conf, enter your trb3 MAC address ###
+provide_trbnetd=yes
+
+provide_cts_gui=yes
+
+provide_vnc=yes
+vnc_password=
+vnc_port=5902
+vnc_geometry=1500x1024
+
+
+# tmux new-session -d -s x11vnc -n x11vnc "x11vnc -forever -create -rfbport 5902 #(nopasswd)"
+
+# set paths for go4/dabc/stream
+. /trb3/trb3login
+
+
+
+### no need to touch the rest of the file ###
+
+ echo ... >> conf_log.txt
+ echo DAQOPSERVER=$DAQOPSERVER >> conf_log.txt
+ echo >> conf_log.txt
+
+if [ $provide_dhcp == "yes" ]; then
+ echo starting dhcp server
+ cp dhcpd.conf /etc/dhcpd.conf
+ > /tmp/dhcp_leasefile
+ dhcpd -lf /tmp/dhcp_leasefile
+ echo ... >> conf_log.txt
+ echo dhcp server started >> conf_log.txt
+ echo using config file /conf/dhcpd.conf >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+if [ $provide_trbnetd == "yes" ]; then
+ trbnetd -i $TRB3_PORT
+ echo ... >> conf_log.txt
+ echo started trbnetd >> conf_log.txt
+ echo TRB3_SERVER=$TRB3_SERVER >> conf_log.txt
+ echo port $TRB3_PORT >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+if [ $provide_cts_gui == "yes" ]; then
+# screen -S cts_gui -d -m ./start_cts_gui.sh
+ tmux new-session -d -s cts_gui -n cts_gui "cd /daqtools/web; perl ./cts_gui --endpoint $CTS_ENDPOINT --quiet --noopenxterm --port $CTS_GUI_PORT"
+# tmux new-window -t main:1 -n "cts_gui" "cd /daqtools/web; perl ./cts_gui --endpoint $CTS_ENDPOINT --quiet --noopenxterm --port $CTS_GUI_PORT"
+ echo ... >> conf_log.txt
+ echo started cts_gui with following parameters:>> conf_log.txt
+ echo --endpoint $CTS_ENDPOINT >> conf_log.txt
+ echo --port $CTS_GUI_PORT >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+if [ $provide_vnc == "yes" ]; then
+ mkdir -p $HOME/.vnc/
+ echo $vnc_password | vncpasswd -f > $HOME/.vnc/passwd
+ tmux new-session -d -s vnc -n vnc "echo starting vnc server on port $vnc_port for display $DISPLAY; vncserver $DISPLAY -rfbauth $HOME/.vnc/passwd -rfbport $vnc_port -geometry $vnc_geometry ;/bin/bash"
+
+ echo ... >> conf_log.txt
+ echo "started vnc server (e.g. for Go4 window)" >> conf_log.txt
+ echo port=$vnc_port >> conf_log.txt
+ echo DISPLAY=$DISPLAY >> conf_log.txt
+ echo password=$vnc_password >> conf_log.txt
+ echo >> conf_log.txt
+ echo connect with: vncviewer localhost:$vnc_port >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+./addresses.sh
+
+/daqtools/tools/loadregisterdb.pl register_configgbe.db
+/daqtools/tools/loadregisterdb.pl register_configgbe_ip.db
+sleep 1
+./conf_cts.sh
+./conf_tdcs.sh
+
+
+echo "done"
--- /dev/null
+#!/bin/bash
+
+# CTS Configuration dump
+# generated: 2019-02-05 15:10
+# CTS Compile time: 2019-01-21 14:47
+#
+# trbcmd Dev. Reg. Value
+trbcmd setbit 0xc035 0xa00c 0x80000000 # Disable all triggers
+trbcmd w 0xc035 0xa008 0xffffffff # cts_fsm_limits: ro=65535, td=65535
+trbcmd w 0xc035 0xa009 0x00000001 # cts_readout_config:
+ # channel_cnt=false, idle_dead_cnt=false, input_cnt=true
+ # timestamp=false, trg_cnt=false
+trbcmd w 0xc035 0xa00c 0x80000400 # cts_throttle: enable=true, stop=false, threshold=0
+trbcmd w 0xc035 0xa00d 0x00000001 # cts_eventbuilder:
+ # cal_eb=0, mask=0000 0000 0000 0001, rr_interval=0
+ # use_cal_eb=false
+trbcmd w 0xc035 0xa101 0xffff0400 # trg_channel_mask: edge=1111 1111 1111 1111, mask=0000 0100 0000 0000
+trbcmd w 0xc035 0xa124 0x00000000 # trg_input_config0: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa125 0x00000000 # trg_input_config1: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa126 0x00000000 # trg_input_config2: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa127 0x00000000 # trg_input_config3: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa128 0x00000000 # trg_input_config4: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa129 0x00000000 # trg_input_config5: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa12a 0x00000000 # trg_input_config6: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa13b 0x000f0000 # trg_coin_config0:
+ # coin_mask=0000 0000, inhibit_mask=0000 0000
+ # window=15
+trbcmd w 0xc035 0xa13c 0x000f0000 # trg_coin_config1:
+ # coin_mask=0000 0000, inhibit_mask=0000 0000
+ # window=15
+trbcmd w 0xc035 0xa13e 0x00000000 # trg_input_mux0: input=extclk[0]
+trbcmd w 0xc035 0xa13f 0x00000001 # trg_input_mux1: input=extclk[1]
+trbcmd w 0xc035 0xa140 0x00000002 # trg_input_mux2: input=trgext[2]
+trbcmd w 0xc035 0xa141 0x00000003 # trg_input_mux3: input=trgext[3]
+trbcmd w 0xc035 0xa142 0x00000004 # trg_input_mux4: input=jeclin[0]
+trbcmd w 0xc035 0xa143 0x00000005 # trg_input_mux5: input=jeclin[1]
+trbcmd w 0xc035 0xa144 0x00000006 # trg_input_mux6: input=jeclin[2]
+trbcmd w 0xc035 0xa146 0x00000000 # trg_addon_output_mux0: input=itc[0]
+trbcmd w 0xc035 0xa147 0x00000001 # trg_addon_output_mux1: input=itc[1]
+trbcmd w 0xc035 0xa148 0x00000002 # trg_addon_output_mux2: input=itc[2]
+trbcmd w 0xc035 0xa149 0x00000003 # trg_addon_output_mux3: input=itc[3]
+trbcmd w 0xc035 0xa14a 0x00000004 # trg_addon_output_mux4: input=itc[4]
+trbcmd w 0xc035 0xa14b 0x00000005 # trg_addon_output_mux5: input=itc[5]
+trbcmd w 0xc035 0xa14c 0x00000006 # trg_addon_output_mux6: input=itc[6]
+trbcmd w 0xc035 0xa14d 0x00000007 # trg_addon_output_mux7: input=itc[7]
+trbcmd w 0xc035 0xa14f 0x00010000 # trg_periph_config0: mask=0001 0000 0000 0000 0000
+trbcmd w 0xc035 0xa150 0x00000000 # trg_periph_config1: mask=0000 0000 0000 0000 0000
+trbcmd w 0xc035 0xa151 0x00000000 # trg_periph_config2: mask=0000 0000 0000 0000 0000
+trbcmd w 0xc035 0xa152 0x00000000 # trg_periph_config3: mask=0000 0000 0000 0000 0000
+trbcmd w 0xc035 0xa154 0x000061a7 # trg_pulser_config0: low_duration=24999
+trbcmd w 0xc035 0xa155 0x00000003 # trg_pulser_config1: low_duration=3
+trbcmd w 0xc035 0xa157 0x00000000 # trg_random_pulser_config0: threshold=0
+trbcmd w 0xc035 0xa159 0x1111111d # _trg_trigger_types0:
+ # type0=0xd_tdc_calibration_trigger, type1=0x1_physics_trigger
+ # type2=0x1_physics_trigger, type3=0x1_physics_trigger
+ # type4=0x1_physics_trigger, type5=0x1_physics_trigger
+ # type6=0x1_physics_trigger, type7=0x1_physics_trigger
+trbcmd w 0xc035 0xa15a 0x11111111 # _trg_trigger_types1:
+ # type10=0x1_physics_trigger, type11=0x1_physics_trigger
+ # type12=0x1_physics_trigger, type13=0x1_physics_trigger
+ # type14=0x1_physics_trigger, type15=0x1_physics_trigger
+ # type8=0x1_physics_trigger, type9=0x1_physics_trigger
+trbcmd clearbit 0xc035 0xa00c 0x80000000 # Enable all triggers
+
--- /dev/null
+...
+DAQOPSERVER=localhost:35
+
+...
+dhcp server started
+using config file /conf/dhcpd.conf
+
+...
+started trbnetd
+TRB3_SERVER=192.168.4.240
+port 35
+
+...
+started cts_gui with following parameters:
+--endpoint 0xc035
+--port 1148
+
+...
+started vnc server (e.g. for Go4 window)
+port=5902
+DISPLAY=:2
+password=
+
+connect with: vncviewer localhost:5902
+
--- /dev/null
+#!/bin/bash
+
+
+
+### all tdcs ###
+
+for TDC in 0x0350 0x0351 0x0352 0x0353; do
+
+ # invert the first 32 channels
+ trbcmd w $TDC 0xc805 0xFFFFFFFF
+
+ # enable trigger windows +-1000 ns
+ trbcmd w $TDC 0xc801 0x80c800c8
+
+ # set channel ringbuffer size
+ trbcmd w $TDC 0xc804 10
+
+done
+
+
+### tdcs with pasttrec attached ###
+
+for TDC in 0x0350 0x0351; do
+
+ # enable the first 16 channels (CONN1)
+ trbcmd setbit $TDC 0xc802 0x0000FFFF
+
+ # enable the second 16 channels (CONN2)
+ trbcmd setbit $TDC 0xc802 0xFFFF0000
+
+done
+
+
+### reference time TDC ###
+
+for TDC in 0x0353; do
+
+ # non- invert the first channel
+ trbcmd clearbit $TDC 0xc805 0x1
+
+ # enable the first channel
+ trbcmd setbit $TDC 0xc802 0x1
+
+ # enable Florian's trigger Logic
+ trbcmd setbit $TDC 0xe000 0x1
+ # enable edge detect
+ trbcmd setbit $TDC 0xe008 0x1
+ # merge outputs
+ trbcmd setbit $TDC 0xe018 0x1
+ # delay 0 cycles
+ trbcmd setbit $TDC 0xe100 0x0
+ # stretcher on, five cycles
+ #trbcmd setbit $TDC 0xe200 0x10005
+
+done
--- /dev/null
+
+shared-network em1 {
+ subnet 192.168.4.0 netmask 255.255.255.0 {
+ option subnet-mask 255.255.255.0;
+ option broadcast-address 192.168.4.255;
+ option routers 192.168.4.254;
+ #option domain-name-servers 141.2.242.36;
+ #option domain-name "x-matter.uni-frankfurt.de";
+ default-lease-time 86400;
+ max-lease-time 172800;
+ }
+}
+ host trb3_148 { hardware ethernet 02:00:f8:00:be:30; fixed-address 192.168.4.240;}
+ host trb3_148_new { hardware ethernet da:7a:37:0e:f4:30; fixed-address 192.168.4.240;}
+ host trb3_148_old { hardware ethernet 02:00:be:30:f4:0e; fixed-address 192.168.4.240;}
+ host trb3_35 { hardware ethernet da:7a:33:90:53:d9; fixed-address 192.168.4.240;}
--- /dev/null
+
+
+
+!Register table
+# Type # C0 # C1 # C2 # C3 # C4 # C5 # C6 # C7 # C8 # C9 #
+###################################################################################################
+ 0 0x8300 0x8305 0x8307 0x8308 0x830b
+ 1 0x8301 0x8302 0x8304 0x8309 0x830c 0x830e 0x830f 0x8310
+
+
+!Value table
+# SubEvtId UseGbE MultiQueue Trig. Num. InclTrgType
+# Hub # Type # C0 # C1 # C2 # C3 # C4 #
+##################################################################################
+ 0xc035 0 0xc035 1 0 0xffffff 1
+
+
+
+#These values to not need to be written - for completeness only
+# SubEvtDec QueDec FrameSize RX enable SubEvtSize Evt/Queue QueueClose MaxQueueSize
+# Hub # Type # C0 # C1 # C2 # C3 # C4 # C5 # C6 # C7 #
+##########################################################################################################################
+# 0xff7f 1 0x00020001 0x00030062 0x578 1 59800 200 32000 60000
--- /dev/null
+###########################################################################################
+#Eventbuilders:
+# EB 0: hadespc001 eth1 ports 50000 - 50099
+
+!Register table
+# Type # C0 # C1 # C2 # C3 # C4 #
+#######################################################
+#new memory locations
+ 0 0x8100 0x8101 0x8102 0x8103 0x8107
+ 1 0x8110 0x8111 0x8112 0x8113 0x8117
+ 2 0x8120 0x8121 0x8122 0x8123 0x8127
+ 3 0x8130 0x8131 0x8132 0x8133 0x8137
+ 4 0x8140 0x8141 0x8142 0x8143 0x8147
+ 5 0x8150 0x8151 0x8152 0x8153 0x8157
+ 6 0x8160 0x8161 0x8162 0x8163 0x8167
+ 7 0x8170 0x8171 0x8172 0x8173 0x8177
+ 8 0x8180 0x8181 0x8182 0x8183 0x8187
+ 9 0x8190 0x8191 0x8192 0x8193 0x8197
+ 10 0x81A0 0x81A1 0x81A2 0x81A3 0x81A7
+ 11 0x81B0 0x81B1 0x81B2 0x81B3 0x81B7
+ 12 0x81C0 0x81C1 0x81C2 0x81C3 0x81C7
+ 13 0x81D0 0x81D1 0x81D2 0x81D3 0x81D7
+ 14 0x81E0 0x81E1 0x81E2 0x81E3 0x81E7
+ 15 0x81F0 0x81F1 0x81F2 0x81F3 0x81F7
+
+!Value table
+# Dest MAC Dest MAC Dest IP Dest Port Src Port
+# Hub # Type # C0 # C1 # C2 # C3 # C4 #
+####################################################################################
+
+ 0xc035 0 0xBB61482F 0xECF4 0xc0a804fe 50002 0xc350
+
+
+
--- /dev/null
+#!/bin/bash
+
+trbcmd reload 0x0350
+trbcmd reload 0x0351
+trbcmd reload 0x0352
+trbcmd reload 0x0353
+trbcmd reload 0xc035
+
+sleep 4
+
+./addresses.sh
--- /dev/null
+<?xml version="1.0"?>
+
+<!--
+This is example file how HADAQ event building should be configured in DABC.
+Event building process implemented in Combiner module of hadaq::CombinerModule class.
+Module can have several inputs, each with separate port number for receiving data
+from TRB boards. For every input one could configure only UDP port number - host name is ignored.
+First output of combiner module reserved for the connection to the MBS transmitter module.
+Second output can be use to store data in hld files.
+To enable HLD file storage one should specify NumOutputs for Combiner module
+and provide hld file name for Output1 port
+
+ <NumOutputs value="2"/>
+ <OutputPort name="Output1" url="hld://dabc.hld?maxsize=2000"/>
+
+File name fill be extended according to HADAQ naming convetion.
+
+Optionally one can enable MBS transmitter module, which converts HLD to LMD format.
+To enable transmitter, one should specify auto="true" in configuration which says DABC
+to automatically create module when starting application.
+First output of the module reserved for stream server, second output can be used to
+store data in lmd files.
+
+By default, HTTP server is enabled. Do disable it, remove <HttpServer> section or
+put <HttpServer name="http" auto="false">. One could change http port number.
+When dabc runs, in any browser address like
+http://your_dabc_host_name:8090 can be opened. At the moment http server provides:
+ - ratemeters from EventBuilder and Transmitter
+ - log fields
+ - commands to start/stop hld and lmd files from browser
+
+It is also possible to attach go4 analysis to that server, that also histograms
+from online analysis will appear. For that one should specify
+"-dabc your_dabc_host_name" argument when starting analysis. Like:
+ [shell] go4analysis -stream dabc_node -dabc dabc_node
+When launching analysis from the gui, extra arguments "-dabc your_dabc_host_name"
+should be specified.
+
+There is well-known problem with using VNC viewer and mbs stream server.
+Both by default are using port 6002. One could change port number for stream server.
+Just set other number in configuration of output port of transmitter module, for instance
+ <OutputPort name="Output0" url="mbs://Stream:6789"/>
+In this case one should specify that port number when starting go4 analysis like:
+ [shell] go4analysis -stream dabc_node:6789 -dabc dabc_node:4444
+When starting analysis from the go4 gui, one should specify stream server with port number too.
+
+-->
+
+<dabc version="2">
+ <Context host="localhost" name="EventBuilder">
+ <Run>
+ <lib value="libDabcMbs.so"/>
+ <lib value="libDabcHadaq.so"/>
+ <lib value="libDabcHttp.so"/>
+ <lib value="libDabcStream.so"/>
+ <logfile value="hadaqevtbuild.log"/>
+ <loglevel value="-1"/>
+ <loglimit value="1000"/>
+ <control value="true"/>
+ <threads_layout value="balanced"/>
+ </Run>
+
+ <HttpServer name="http" port="8091"/>
+
+ <!-- If uncommented, all internal manager structures will be published in the web server -->
+ <!-- Publisher name="publ" manager="true"/ -->
+
+ <!-- If uncommented, profiling will be enabled for all threads -->
+ <!-- Thread name="*" publ="true" prof="true"/ -->
+
+ <MemoryPool name="Pool">
+ <BufferSize value="2000000"/>
+ <NumBuffers value="1000"/>
+ </MemoryPool>
+
+ <!-- these are default parameters for TDC calibration modules -->
+ <Module name="Input*TdcCal">
+ <InputPort name="Input*" queue="30"/>
+
+ <FineMin value="31"/>
+ <FineMax value="515"/>
+ <NumChannels value="33"/>
+ <EdgeMask value="2"/> <!-- 1: only leading edge 2:leading/trailing individual 3:statistics from leading used 4:statistics merged -->
+ <HistFilling value="4"/>
+ <CalibrFile value="/workdir/tdc_calib"/> <!-- local/-->
+ <!--DisableCalibrationFor value="0"/-->
+ <Auto value="100000"/>
+
+ <!-- TRB value="0x8010"/-->
+ <!-- HUB value="0x9000"/-->
+ <!-- TDC value="[0x8a00,0x8a01,0x8a02,0x8a03]"/-->
+ <Dummy value="true"/>
+ </Module>
+
+
+ <Module name="Combiner" class="hadaq::CombinerModule">
+ <!-- these parameters will force to create inputs/outputs of module -->
+ <NumInputs value="1"/>
+ <NumOutputs value="2"/>
+
+ <InputPort name="Input0" url="hadaq://host:50002" urlopt1=""/>
+<!-- <InputPort name="Input0" url="hadaq://host:50061" urlopt1=""/> -->
+ <!-- <InputPort name="Input1" url="hadaq://host:50008" urlopt1=""/> -->
+ <!-- <InputPort name="Input2" url="hadaq://host:50084" urlopt1=""/> -->
+ <!-- <InputPort name="Input3" url="hadaq://host:50158" urlopt1=""/> -->
+
+
+ <!-- <InputPort name="Input4" url="hadaq://host:10104" urlopt1="trb=0x8030&tdc=[0x3030,0x3031,0x3032,0x3033]&dummy"/> -->
+ <!-- <InputPort name="Input5" url="hadaq://host:10105" urlopt1="trb=0x8040&tdc=[0x3040,0x3041,0x3042,0x3043]&dummy"/> -->
+
+ <!-- <InputPort name="Input0" url="hadaq://host:50021" urlopt1="trb=0x8000&hub=0x8100&tdc=[0xC000,0xC001,0xC003]&dummy"/> -->
+ <!-- <InputPort name="Input1" url="hadaq://host:50094" urlopt1="trb=0x8003&tdc=[0xC00C,0xC00D,0xC00E,0xC00F]&dummy"/> -->
+ <!-- <InputPort name="Input2" url="hadaq://host:50096" urlopt1="trb=0x8002&tdc=[0xC008,0xC009,0xC00A,0xC00B]&dummy"/> -->
+ <!-- <InputPort name="Input3" url="hadaq://host:10104" urlopt1="trb=0x8030&tdc=[0x3030,0x3031,0x3032,0x3033]&dummy"/> -->
+ <!-- <InputPort name="Input4" url="hadaq://host:10105" urlopt1="trb=0x8040&tdc=[0x3040,0x3041,0x3042,0x3043]&dummy"/> -->
+
+ <!-- <InputPort name="Input*" queue="30"
+ urlopt="udpbuf=20000&mtu=64512&flush=3.0&observer=false&debug&resort"/>
+ -->
+
+ <InputPort name="Input*" queue="30" urlopt="udpbuf=400000&mtu=64512&flush=1&observer=false&debug"/>
+
+ <ExtraDebug value="false"/>
+
+ <!-- this is stream server for online monitoring, normally always on -->
+ <OutputPort name="Output0" url="mbs://Stream:6789?iter=hadaq_iter&subid=0x1f"/>
+
+ <!-- this is example of HLD file storage - local and RFIO -->
+ <OutputPort name="Output1" url="hld:///tmp/TDC_data.hld?maxsize=2000"/>
+ <!--OutputPort name="Output1" url="hld:///linev/path/dabc.hld?maxsize=1900&rfio"/-->
+
+ <DoShmControl value="false"/>
+ <FlushTimeout value="1.0"/>
+ <BuildDropTimeout value="1000"/>
+
+ <!-- take event sequence number from vulom/roc sync message at cts -->
+ <UseSyncSequenceNumber value="false"/>
+ <SyncSubeventId value="0x8000"/>
+ <SyncTriggerMask value="0x01"/>
+ <PrintSync value="false"/>
+ <FlushBySync value="false"/>
+
+ <!--TriggerNumRange: defines when trigger sequence number wraps. only 16 bit for HADES EBs, 24 bit for trb3! -->
+ <TriggerNumRange value="0x10000"/>
+
+ <!--AccountLostEventDiff: if true, missing trigger sequence number are added as lost events to stats. Disabled for multiple event builder mode! -->
+ <AccountLostEventDiff value="true"/>
+
+ <!-- rate meters configuration -->
+ <HadaqData width="4" prec="2" low="0" up="10" debug="1"/>
+ <HadaqEvents width="5" prec="1" low="0" up="1000" debug="1"/>
+ <HadaqDroppedData width="5" prec="3" low="0" up="1" debug="1"/>
+ <HadaqLostEvents width="4" prec="2" low="0" up="100" debug="1"/>
+ </Module>
+
+ <!-- Uncomment to see terminal output like old event builder -->
+ <Module name="Term" class="hadaq::TerminalModule" period="0.3" clear="false"/>
+
+ </Context>
+
+</dabc>
--- /dev/null
+// this is example for
+
+
+#include <stdlib.h>
+
+void first()
+{
+ //base::ProcMgr::instance()->SetRawAnalysis(true);
+ base::ProcMgr::instance()->SetTriggeredAnalysis(true);
+
+ // all new instances get this value
+ base::ProcMgr::instance()->SetHistFilling(4);
+
+ // this limits used for liner calibrations when nothing else is available
+ hadaq::TdcMessage::SetFineLimits(10, 510);
+
+ // default channel numbers and edges mask
+ hadaq::TrbProcessor::SetDefaults(33, 0x2);
+// hadaq::TdcProcessor::SetDefaults(1000);
+ //hadaq::TdcProcessor::DisableCalibrationFor(0,8);
+ // [min..max] range for TDC ids
+ //hadaq::TrbProcessor::SetTDCRange(0x610, 0x613);
+ hadaq::TrbProcessor::SetTDCRange(0x0350, 0x0353);
+
+ // configure ToT calibration parameters
+ // first - minimal number of counts in ToT histogram
+ // second - maximal RMS value
+ hadaq::TdcProcessor::SetToTCalibr(100, 0.2);
+
+ //hadaq::T
+ // [min..max] range for HUB ids
+ hadaq::TrbProcessor::SetHUBRange(0xc001, 0xcfff);
+
+ // when first argument true - TRB/TDC will be created on-the-fly
+ // second parameter is function name, called after elements are created
+ hadaq::HldProcessor* hld = new hadaq::HldProcessor(true, "after_create");
+
+ const char* calname = getenv("CALNAME");
+ if ((calname==0) || (*calname==0)) calname = "test_";
+ const char* calmode = getenv("CALMODE");
+ int cnt = (calmode && *calmode) ? atoi(calmode) : 0;
+ const char* caltrig = getenv("CALTRIG");
+ unsigned trig = (caltrig && *caltrig) ? atoi(caltrig) : 0x0;
+ const char* uset = getenv("USETEMP");
+ unsigned use_temp = 0; // 0x80000000;
+ if ((uset!=0) && (*uset!=0) && (strcmp(uset,"1")==0)) use_temp = 0x80000000;
+
+ printf("HLD configure calibration calfile:%s cnt:%d trig:%X temp:%X\n", calname, cnt, trig, use_temp);
+
+ // first parameter if filename prefix for calibration files
+ // and calibration mode (empty string - no file I/O)
+ // second parameter is hits count for autocalibration
+ // 0 - only load calibration
+ // -1 - accumulate data and store calibrations only at the end
+ // >0 - automatic calibration after N hits in each active channel
+ // third parameter is trigger type mask used for calibration
+ // (1 << 0xD) - special 0XD trigger with internal pulser, used also for TOT calibration
+ // 0x3FFF - all kinds of trigger types will be used for calibration (excluding 0xE and 0xF)
+ // 0x80000000 in mask enables usage of temperature correction
+// hld->ConfigureCalibration(calname, cnt, /*(1 << trig) | use_temp*/ 0x3fff);
+ hld->ConfigureCalibration("test_", -1, (1 << 0xD));
+
+
+ // only accept trigger type 0x1 when storing file
+ //new hadaq::HldFilter(0x0);
+
+ // create ROOT file store
+// base::ProcMgr::instance()->CreateStore("td.root");
+
+ // 0 - disable store
+ // 1 - std::vector<hadaq::TdcMessageExt> - includes original TDC message
+ // 2 - std::vector<hadaq::MessageFloat> - compact form, without channel 0, stamp as float (relative to ch0)
+ // 3 - std::vector<hadaq::MessageDouble> - compact form, with channel 0, absolute time stamp as double
+ base::ProcMgr::instance()->SetStoreKind(1);
+
+}
+
+// extern "C" required by DABC to find function from compiled code
+
+extern "C" void after_create(hadaq::HldProcessor* hld)
+{
+ printf("Called after all sub-components are created\n");
+
+ if (hld==0) return;
+
+ for (unsigned k=0;k<hld->NumberOfTRB();k++) {
+ hadaq::TrbProcessor* trb = hld->GetTRB(k);
+ if (trb==0) continue;
+ printf("Configure %s!\n", trb->GetName());
+ trb->SetPrintErrors(10);
+ }
+
+ unsigned firsttdc = 0;
+
+ for (unsigned k=0;k<hld->NumberOfTDC();k++) {
+ hadaq::TdcProcessor* tdc = hld->GetTDC(k);
+ if (tdc==0) continue;
+
+ if (firsttdc == 0) firsttdc = tdc->GetID();
+
+ printf("Configure %s!\n", tdc->GetName());
+
+ // try to build abs time difference between 0 channels
+ // if (tdc->GetID() != firsttdc)
+ // tdc->SetRefChannel(0, 0, (0x70000 | firsttdc), 6000, -20., 20.);
+
+ tdc->SetUseLastHit(false);
+
+ // tdc->DisableCalibrationFor(0);
+
+ // if (tdc->GetID() == 0x1130);
+
+ for (int n=1;n<49;++n)
+ tdc->SetRefChannel(n,0, 0xffff, 6000, -200, 200); // LED DIFF
+ }
+}
+
+
--- /dev/null
+// Automatically generated startup script
+// Do not change it!
+
+go4->SetMainWindowState(4,"000000ff00000000fd000000020000000000000125000002e8fc0200000001fb0000001600420072006f00770073006500720044006f0063006b0100000073000002e80000007a00ffffff000000030000063c00000082fc0100000001fc000000000000063c0000003d00fffffffa000000000200000003fb00000016004c006f00670049006e0066006f0044006f0063006b0100000000ffffffff0000005300fffffffb0000001a004d006200730056006900650077006500720044006f0063006b0000000000ffffffff0000006500fffffffb0000001e0044004100420043004d006f006e00690074006f00720044006f0063006b0000000279000000ce000000000000000000000511000002e800000004000000040000000800000008fc0000000800000002000000040000001600460069006c00650054006f006f006c0042006100720100000000ffffffff0000000000000000000000160047006f00340054006f006f006c00730042006100720100000106ffffffff00000000000000000000001e0041006e0061006c00790073006900730054006f006f006c004200610072010000024a0000025800000000000000000000001a0044006900760069006400650050006100640044006f0063006b0000000395000000e40000000000000000000000020000000000000002000000020000002400420072006f0077007300650072004f007000740069006f006e00730044006f0063006b01000000000000010200000000000000000000001e0044007200610077004f007000740069006f006e00730044006f0063006b01000001020000037e00000000000000000000000200000002000000240048006900730044007200610077004f007000740069006f006e00730044006f0063006b0000000000000001290000000000000000000000180047006f0034005300740079006c00650044006f0063006b0000000000000004b10000000000000000000000020000000200000020005300630061006c0065004f007000740069006f006e00730044006f0063006b0000000000000004b100000000000000000000002c0041006e0061006c00790073006900730043006f006d006d0061006e00640054006f006f006c0042006100720100000000ffffffff0000000000000000000000030000000000000003000000010000001e0043006f006d006d0061006e0064004c0069006e00650044006f0063006b0000000000000004b1000000000000000000000003000000010000001c00540072006500650056006900650077006500720044006f0063006b0000000000000004b10000000000000000");
+go4->SetMainWindowGeometry(4,"01d9d0cb00010000000000140000000c000006570000042d00000018000000240000065300000429000000000000");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqgif.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqico.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqjpeg.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqmng.so");
+go4->LoadLibrary("/usr/lib64/libmng.so.1");
+go4->LoadLibrary("/usr/lib64/liblcms.so.1");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqsvg.so");
+go4->LoadLibrary("/usr/lib64/libQtSvg.so.4");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqtga.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqtiff.so");
+go4->LoadLibrary("/lib64/libnss_mdns_minimal.so.2");
+go4->LoadLibrary("/lib64/libnss_dns.so.2");
+go4->LoadLibrary("/lib64/libresolv.so.2");
+
+go4->LaunchAnalysis("MyAnalysis", ".", "", "localhost", Go4_sh, Go4_qt, Go4_lib);
+go4->WaitAnalysis(300);
+
+// configuration of analysis
+go4->AnalysisAutoSave("Go4AutoSave.root", 500, 5, kTRUE, kFALSE);
+go4->AnalysisConfigName("Go4AnalysisPrefs.root");
+
+// step Analysis
+go4->ConfigStep("Analysis", kTRUE, kTRUE, kFALSE);
+go4->StepMbsStreamSource("Analysis", "localhost:6789", 1);
+go4->StepFileStore("Analysis", "NoOutputDefined", kTRUE, 32000, 99, 5, 10000);
+
+go4->SubmitAnalysisConfig(20);
+
+go4->SetAnalysisConfigMode(-1);
+go4->SetAnalysisTerminalMode(1);
+
+go4->StartAnalysis();
+
+// in some analysis one requires to wait several seconds before new histograms appears
+// go4->Wait(1);
+go4->RefreshNamesList();
+
--- /dev/null
+#include <stdio.h>
+#include <iostream>
+#include <fstream>
+#include <map>
+
+#include "TTree.h"
+#include "TFile.h"
+#include "TSystem.h"
+#include "TString.h"
+#include "TH1.h"
+#include "TH2.h"
+#include "TCanvas.h"
+#include "TGo4AnalysisObjectManager.h"
+
+
+#include "base/EventProc.h"
+#include "base/Event.h"
+#include "hadaq/TdcSubEvent.h"
+
+#define CHANNELS 33
+#define REFCHAN 0
+// #define REFCHAN_B 0
+
+#define VERBOSE 0
+#define TAKE_FIRST_HIT 1
+
+
+
+// Muentz-Torte
+#define t1_L -400 // EE
+#define t1_R 400 // EE
+#define tot_L -10 // EE
+#define tot_R 1000 // EE
+
+#define ref_channel_offset -75 //ns fine measured ref channel relative to coarse measured cts trigger channel
+//#define ref_channel_offset 0 //ns fine measured ref channel relative to coarse measured cts trigger channel
+
+// in the first iteration, scanning through data in the coincidence window, rejecting hits (fuzzy edges)
+
+//#define spike_rejection 90 //ns for ASD8 0x72 (25000) with LASER
+// #define spike_rejection 90 //ns for PASTTREC pt10 // for t1 calibration
+//#define spike_rejection 60 //ns for PASTTREC pt10
+// #define spike_rejection 45 //ns for PASTTREC with all the nice filters
+// #define spike_rejection 90 //ns for PASTTREC pt15
+//#define spike_rejection 100 //ns for PASTTREC pt20
+// #define spike_rejection 30 //ns for ASD8 0xA9
+// #define spike_rejection 60 //ns for ASD8 0x72
+// #define spike_rejection 75 //ns for ASD8 0x52
+//#define spike_rejection 47 //ns for ASD8 thr 37000 with LASER
+// #define spike_rejection 90 //ns for PASTTREC pt20 with LASER
+//#define spike_rejection 90 //ns for PASTTREC pt20 with Fe55
+
+#define spike_rejection 30
+#define spike_rejection_refchan 10
+
+#define individual_spike_rejection 0
+
+//#define ref_spike_rejection 100
+
+
+//#define t1_accept_L (-250 + ref_channel_offset) //ns // GSI Dlab
+//#define t1_accept_L (-1000000 + ref_channel_offset) //ns // HZDR fe55
+#define t1_accept_L (-2000 + ref_channel_offset) //ns // EE
+//#define t1_accept_L (-150 + ref_channel_offset) //ns // Muentz-Torte
+//#define t1_accept_R (100 + ref_channel_offset)//ns // GSI Dlab
+//#define t1_accept_R (1000000 + ref_channel_offset)//ns // HZDR fe55
+#define t1_accept_R (2000 + ref_channel_offset)//ns // EE
+// #define t1_accept_R (-130 + ref_channel_offset)//ns // Muentz-Torte
+// #define t1_accept_R (-90 + ref_channel_offset)//ns // ASD8 with thr 0x52
+
+#define fish_proj_cut 20
+
+
+
+// real cuts on selected data
+
+#define max_tot 1000000 // Muentz-Torte
+#define t1_cut_L -2000
+#define t1_cut_R 2000
+
+
+// #define coincidence_rejection 7
+#define accept_hits_per_layer 20
+
+#define enable_coincidence_rejection 0
+
+#define enable_single_hits 0
+#define enable_one_hit_per_layer 1
+#define enable_two_to_one_hits 0
+
+
+
+// TFile* tree_out;
+std::map<std::string,int> trig_no;
+std::map<std::string,TTree*> data_tree;
+Bool_t write_tree = false;
+
+
+
+Bool_t file_exists(TString fname){
+
+ fstream src_file(fname.Data());
+ return src_file.good();
+}
+
+TString from_env(TString env_var,TString default_val){
+ if(gSystem->Getenv(env_var)){
+ return gSystem->Getenv(env_var);
+ }
+ return default_val;
+}
+
+
+
+class SecondProc : public base::EventProc {
+ protected:
+
+ std::string fTdcId; //!< tdc id where channels will be selected
+
+ double fHits[8]; //!< 8 channel, abstract hits
+
+ base::H1handle hNumHits; //!< histogram with hits number
+// base::H2handle h2D;
+
+// base::H1handle totCh1; //!< histogram with hits number
+// base::H1handle totCh2; //!< histogram with hits number
+
+
+ base::H1handle tot_h[CHANNELS];
+ base::H1handle tot_untrig_h[CHANNELS];
+ base::H1handle t1_h[CHANNELS];
+ base::H1handle potato_h[CHANNELS];
+ base::H1handle meta_potato_h;
+ base::H1handle meta_t1_h;
+ base::H1handle meta_tot_h;
+ base::H1handle meta_tot_2d;
+ base::H1handle meta_t1_2d;
+ base::H1handle coinc_matrix;
+// base::H1handle meta_fish;
+// base::H1handle meta_fish_proj;
+// base::H1handle fishes[FISHES];
+// base::H1handle fish_proj[FISHES];
+ base::H1handle efficiency_h;
+ base::H1handle ref_counts_h;
+ base::H1handle dut_counts_h;
+
+
+ int entry_chan;
+ int entry_ref_chan;
+ double entry_t1;
+ double entry_tot;
+
+
+
+
+
+// int evt_no;
+
+ public:
+ SecondProc(const char* procname, const char* _tdcid) :
+ base::EventProc(procname),
+ fTdcId(_tdcid),
+ hNumHits(0)
+ {
+ printf("Create %s for %s\n", GetName(), fTdcId.c_str());
+
+ hNumHits = MakeH1("FineAll","Fine all", 1020, 0, 1020, "fine");
+// h2D = MakeH2("h2d","title", 100, -20, 20, 100, -20,20,"x;y");
+// totCh1 = MakeH1("totCh1","totCh1", 20000, -200, 200, "ns");
+// totCh2 = MakeH1("totCh2","totCh2", 20000, -200, 200, "ns");
+
+
+ if(from_env("tree_out","false") == "true"){
+ write_tree = true;
+ }
+
+ trig_no[fTdcId] = 0;
+ data_tree[fTdcId] = new TTree((TString) fTdcId,"data recorded");
+ data_tree[fTdcId]->Branch("trig_no",&trig_no[fTdcId]);
+ data_tree[fTdcId]->Branch("t1",&entry_t1);
+ data_tree[fTdcId]->Branch("tot",&entry_tot);
+ data_tree[fTdcId]->Branch("chan",&entry_chan);
+ data_tree[fTdcId]->Branch("ref_chan",&entry_ref_chan);
+
+
+ for( unsigned i=0; i<CHANNELS; i++ ) {
+ char chno[16];
+ sprintf(chno,"Ch%02d_t1",i);
+ t1_h[i] = MakeH1(chno,chno, 2000, t1_L, t1_R, "ns");
+ sprintf(chno,"Ch%02d_tot",i);
+ tot_h[i] = MakeH1(chno,chno, 4000, tot_L, tot_R, "ns");
+ sprintf(chno,"Ch%02d_tot_untrig",i);
+ tot_untrig_h[i] = MakeH1(chno,chno, 4000, tot_L, tot_R, "ns");
+ sprintf(chno,"Ch%02d_potato",i);
+ potato_h[i] = MakeH2(chno,chno,500,t1_L,t1_R,500, tot_L, tot_R, "t1 (ns);tot (ns)");
+ }
+
+ meta_t1_h = MakeH1("meta_t1","meta_t1", 2000, t1_L, t1_R, "ns");
+ meta_t1_2d = MakeH2("meta_t1_2d","meta_t1_2d", 2000, t1_L, t1_R,CHANNELS-1,0.5,CHANNELS-0.5, "ns;channel#");
+ meta_tot_h = MakeH1("meta_tot","meta_tot", 4000, tot_L, tot_R, "ns");
+ meta_tot_2d = MakeH2("meta_tot_2d","meta_tot_2d", 2000, tot_L, tot_R,CHANNELS-1,0.5,CHANNELS-0.5, "ns;channel#");
+ meta_potato_h = MakeH2("meta_potato","meta_potato",500,t1_L,t1_R,500, tot_L, tot_R, "t1 (ns);tot (ns)");
+
+// evt_no = 0;
+
+// ref_counts_h = MakeH1("ref_counts","ref_counts", CHANNELS -1, 0.5, CHANNELS-0.5, "channel #");
+// dut_counts_h = MakeH1("dut_counts","dut_counts", CHANNELS -1, 0.5, CHANNELS-0.5, "channel #");
+ efficiency_h = MakeH1("efficiency","efficiency", CHANNELS -1, 0.5, CHANNELS-0.5, "channel #;kind:F");
+ ((TH1F*) efficiency_h)->SetDrawOption("P0");
+ ((TH1F*) efficiency_h)->SetMarkerStyle(22);
+ ((TH1F*) efficiency_h)->GetXaxis()->SetNdivisions(55);
+
+ coinc_matrix = MakeH2("coinc_matrix","coinc_matrix",12,-2.5,9.5,10,15-0.5,24+0.5, "channels 0-7;channels 16-23");
+ //meta_fish = MakeH2("meta_fish","meta_fish",250,-300,200,200,-100,100, "T_A+T_B;T_B-T_A");
+
+ //meta_fish_proj = MakeH1("meta_fish_proj","meta_fish_proj",250,-300,200, "T_A+T_B;counts");
+
+
+
+ // enable storing already in constructor
+ SetStoreEnabled();
+ }
+
+ virtual void UserPostLoop(void) {
+
+ static Int_t was_called_before = 0;
+
+ cout << "--- User Post Loop " << fTdcId << endl;
+// TFile* tree_out = new TFile( Form("tree_out_%s.root",fTdcId.c_str()) ,"RECREATE");
+
+ if(from_env("tree_out","false") == "true"){
+
+ cout << "write tree_out.root" << endl;
+ TFile* tree_out;
+
+
+ if(was_called_before){
+ tree_out = new TFile("tree_out.root","UPDATE");
+ } else {
+ tree_out = new TFile("tree_out.root","RECREATE");
+ }
+ tree_out->cd();
+ data_tree[fTdcId]->Write();
+ tree_out->Write();
+ tree_out->Close();
+ delete tree_out;
+ }
+ was_called_before ++;
+ }
+
+
+ virtual void CreateBranch(TTree* t)
+ {
+ // only called when tree is created in first.C
+ // one can ignore
+ t->Branch(GetName(), fHits, "hits[8]/D");
+ }
+
+ virtual bool Process(base::Event* ev)
+ {
+// printf("### DEBUG ###\n");
+ for (unsigned n=0;n<8;n++) fHits[n] = 0.;
+
+ hadaq::TdcSubEvent* sub =
+ dynamic_cast<hadaq::TdcSubEvent*> (ev->GetSubEvent(fTdcId));
+
+ if(VERBOSE) cout<< "tdc: " << fTdcId << " evt no: " << trig_no[fTdcId] << endl;
+ if (sub==0) return false;
+
+// printf("%s process sub %d %s\n", GetName(), sub->Size(), fTdcId.c_str());
+
+
+ static float effective_spike_rejection = from_env("spike_rejection", TString::Itoa(spike_rejection,10) ).Atof();
+
+
+// static int ref_counts[CHANNELS];
+// static int dut_counts[CHANNELS];
+// static bool is_dut[CHANNELS];
+
+
+ // this is only run once --
+ static bool is_initialized=false;
+ if(not(is_initialized)){
+ for( int i = 0; i<31; i++){
+// ref_counts[i] = 0;
+// dut_counts[i] = 0;
+// is_dut[i] = false;
+// if((overlaps[i][0] >= 0) && (overlaps[i][1] >= 0)){
+// is_dut[i] = true;
+// }
+ }
+
+
+
+
+ is_initialized = true;
+ }
+ // ------
+
+ double num(0), ch0tm(0), ch1tm(0), ch2tm(0), ch3tm(0);
+ double t1_candidate[CHANNELS];
+ double t2_candidate[CHANNELS];
+ double t1[CHANNELS];
+ double t2[CHANNELS];
+ bool got_rising[CHANNELS];
+ bool got_falling[CHANNELS];
+ bool got_real_hit[CHANNELS];
+ double tot[CHANNELS];
+ for (unsigned i=0; i<CHANNELS; i++) {
+ got_rising[i] = false;
+ got_falling[i] = false;
+ got_real_hit[i] = false;
+ }
+
+
+ for (unsigned cnt=0;cnt<sub->Size();cnt++) {
+ const hadaq::TdcMessageExt& ext = sub->msg(cnt);
+
+ unsigned chid = ( ext.msg().getHitChannel() );
+ bool rising = ext.msg().isHitRisingEdge(); // use this line for rising edge first/positive pulses
+
+ if (chid==0) {
+ ch0tm = ext.GetGlobalTime();
+ got_real_hit[chid] = true;
+ t1[chid] = 0;
+ tot[chid] = 100e-9;
+ continue;
+
+ }
+
+
+ // full time
+ double tm = ext.GetGlobalTime();
+ if((chid) >= CHANNELS) {continue;} // channel out of range of analysis
+ if(rising){
+
+
+ if( !(TAKE_FIRST_HIT && got_real_hit[chid]) ){ // block subsequent hits if TAKE_FIRST_HIT setting is active
+ if((( ((tm)*1e9) > t1_accept_L) && (((tm)*1e9) < t1_accept_R )) ) { // this condition sets another coincidence window, except for REFCHAN_A
+ got_rising[chid] = true;
+ got_falling[chid] = false;
+ t1_candidate[chid] = tm;
+ }
+ }
+ }else{ // if falling edge
+// printf("got falling edge, ch %d\n",(chid));
+ if(got_rising[chid]){
+ if(not(got_falling[chid])){
+ got_falling[chid] = true;
+ t2_candidate[chid] = tm;
+ Double_t candidate_tot_ns = (t2_candidate[chid] - t1_candidate[chid])*1e9;
+
+ if( candidate_tot_ns > effective_spike_rejection || (chid==REFCHAN || candidate_tot_ns > spike_rejection_refchan) ){
+ // hit is long enough not to be rejected
+ t1[chid] = t1_candidate[chid];
+ t2[chid] = t2_candidate[chid];
+ tot[chid] = t2[chid] - t1[chid];
+ got_real_hit[chid] = true;
+
+ // fill untriggered tot histogram
+ FillH1(tot_untrig_h[chid],tot[chid]*1e9);
+ }
+// printf("got hit, ch %d, tot = %f ns\n",(chid), tot[chid]*1e9);
+ }
+ }
+ }
+
+ }
+
+
+
+ for( unsigned i=0; i<CHANNELS; i++ ) {
+ if(got_real_hit[i]){
+
+// if(got_real_hit[REFCHAN_A] || got_real_hit[REFCHAN_B] || REFCHAN_A == -1 || REFCHAN_B == -1){ // t1 information only makes sense if you have
+ // a hit in the reference channel
+ double t1_vs_ref = (t1[i] -t1[REFCHAN])*1e9 ;
+ if( (t1_vs_ref > t1_cut_L) && (t1_vs_ref < t1_cut_R) && (tot[i]*1e9 < max_tot) ) {
+
+ // fill histograms
+ FillH1(tot_h[i],tot[i]*1e9);
+ FillH2(potato_h[i],t1_vs_ref ,tot[i]*1e9);
+ FillH1(t1_h[i],t1_vs_ref ); // without cuts
+// if(t1_vs_ref < -200 && tot[i]*1e9 > 0 ) FillH1(t1_h[i],t1_vs_ref ); // with noise rejecting cuts
+ // if( tot[i]*1e9 > 50 ) FillH1(t1_h[i],t1_vs_ref ); // with noise rejecting cuts
+
+
+ if( i != 0 ) {
+ FillH2(meta_potato_h,t1_vs_ref,tot[i]*1e9);
+ FillH1(meta_tot_h,tot[i]*1e9);
+ FillH1(meta_t1_h,t1_vs_ref );
+ FillH2(meta_tot_2d,tot[i]*1e9,i);
+ FillH2(meta_t1_2d,t1_vs_ref,i);
+ entry_chan = i;
+ entry_t1 = t1_vs_ref;
+ entry_tot = tot[i]*1e9;
+ if(write_tree){
+ data_tree[fTdcId]->Fill();
+ }
+ }
+
+ // efficiency estimation ... this cell, cell #i, is a reference detector
+// ref_counts[i]++; // count up reference counts
+// FillH1(counts_h,i-0.5);
+ }
+ }
+ }
+
+
+
+ for (int i = 1 ; i<CHANNELS; i++) {
+ // ((TH1F*) efficiency_h)->SetBinContent(i,((float) (((TH1F*) t1_h[i])->GetEntries()) )/((float) (((TH1F*) t1_h[0])->GetEntries())));
+ ((TH1F*) efficiency_h)->SetBinContent(i,((float) (((TH1F*) t1_h[i])->Integral()) )/ 600. ); // fixed numer of pulses sent for each channel
+ // ((TH1F*) efficiency_h)->SetBinContent(i,((float) (((TH1F*) t1_h[i])->Integral()) )/((float) (((TH1F*) tot_h[i])->Integral()))); ; // normalize by number of signals in same channel without couts, as for almost each trigger a noise signal is measured
+ }
+
+
+
+
+// if(got_real_hit[0]){
+// FillH1(totCh1,tot[0]*1e9);
+// }
+// if(got_real_hit[1]){
+// FillH1(totCh2,tot[1]*1e9);ref_counts[i]
+// }
+
+// FillH1(hNumHits, num);
+
+
+// draw_and_save((TH2F*) meta_fish, "meta_fish","./","colz");
+
+// tree_out->cd();
+// data_tree[fTdcId]->Write();
+ trig_no[fTdcId]++;
+
+ return true;
+ }
+
+
+};
+
+
+void second()
+{
+ //hadaq::TdcProcessor::SetDefaults(700);
+// tree_out = new TFile("./tree_out.root","RECREATE");
+// new SecondProc("Sec_1130", "TDC_1130");
+// new SecondProc("Sec_0352", "TDC_0353");
+ new SecondProc("Sec_0350", "TDC_0350");
+ new SecondProc("Sec_0353", "TDC_0353");
+// tree_out->Write();
+// tree_out->Close();
+}
+
--- /dev/null
+#!/bin/bash
+
+echo "container started"
+
+echo "create main tmux session"
+
+echo "run /conf/conf.sh"
+. /conf/conf.sh
+
+cd /workdir
+tmux new -d -s main
+
+
+
+tmux link-window -s cts_gui:cts_gui -t main
+tmux link-window -s vnc:vnc -t main
+
+
+tmux new-window -t main -n "dabc" "dabc_exe TdcEventBuilder_noHLD.xml;/bin/bash"
+
+
+#tmux new-window -t main -n "go4" "rm *.root; go4 0350_meta.hotstart;/bin/bash"
+tmux new-window -t main -n "go4_ana" "rm *.root; tree_out=false go4analysis -stream localhost:6790 -http localhost:8080;/bin/bash"
+
+# tmux new-window -t main -n "htop" "htop;/bin/bash"
+tmux new-window -t main -n "info" "cat /conf/conf_log.txt; cat info.txt; /bin/bash"
+tmux new-window -t main -n "PT_ctrl" "cd /workdir/pasttrec_ctrl; /bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "x11_apps" "lxpanel& sleep 10; firefox localhost:8080& /bin/bash"
+tmux select-window -t main:info
+
+
+tmux a -t main
+
+
+
+
+echo "drop user to shell"
+/bin/bash
+
+echo "terminate container"
--- /dev/null
+FROM opensuse:42.3
+
+
+##################################################
+## Go4 + dabc + root ##
+##################################################
+
+
+
+RUN zypper ref
+
+RUN zypper --non-interactive in \
+ wget curl \
+ tar zlib \
+ cmake gcc gcc-c++ \
+ libX11-devel libXext-devel libXft-devel libXpm-devel\
+ git subversion \
+ libqt4-devel\
+ git bash cmake gcc-c++ gcc binutils \
+ xorg-x11-libX11-devel xorg-x11-libXpm-devel xorg-x11-devel \
+ xorg-x11-proto-devel xorg-x11-libXext-devel \
+ gcc-fortran libopenssl-devel \
+ pcre-devel Mesa glew-devel pkg-config libmysqlclient-devel \
+ fftw3-devel libcfitsio-devel graphviz-devel \
+ libdns_sd avahi-compat-mDNSResponder-devel openldap2-devel \
+ python-devel libxml2-devel krb5-devel gsl-devel libqt4-devel \
+ glu-devel \
+ xterm screen xvfb-run x11vnc openbox \
+ boost-devel
+
+RUN svn co https://subversion.gsi.de/dabc/trb3
+
+RUN cd trb3; make -j4; cat $(find . -iname "makelog.txt")
+### root, go4, dabc and stream are successfully installed!
+
+
+
+
+##################################################
+## trbnet + daqtools ##
+##################################################
+
+
+RUN zypper --non-interactive in \
+ vim \
+ dhcp-server\
+ rpcbind \
+ gnuplot \
+ ImageMagick \
+ perl-XML-LibXML \
+ glibc-locale \
+ tmux \
+ xorg-x11-Xvnc \
+ emacs \
+ htop \
+ ncdu \
+ psmisc \
+ python-jsonpath-rw \
+ python-pip
+
+RUN pip install --upgrade pip; pip install pandas
+
+RUN cpan Data::TreeDumper Date::Format File::chdir
+
+RUN zypper --non-interactive in \
+ libtirpc-devel
+
+RUN git clone git://jspc29.x-matter.uni-frankfurt.de/projects/trbnettools.git;\
+ cd /trbnettools; \
+ git checkout 02cf
+
+
+RUN cd /trbnettools/libtrbnet_perl; \
+ perl Makefile.PL; \
+ cd /trbnettools; \
+ make clean;
+
+RUN cd /trbnettools; \
+ make TRB3=1
+
+RUN cd /trbnettools; \
+ make TRB3=1 install
+
+RUN echo "/trbnettools/liblocal" >> /etc/ld.so.conf.d/trbnet.conf;\
+ ldconfig -v
+
+ENV PATH=$PATH:/trbnettools/bin
+
+RUN git clone git://jspc29.x-matter.uni-frankfurt.de/projects/daqtools.git
+
+RUN cd daqtools/xml-db; \
+ ./xml-db.pl
+
+##################################################
+## patches + misc ##
+##################################################
+
+### replace httpi with a modified version, because the httpi in daqtools won't run as root
+COPY build_files/httpi /daqtools/web/httpi
+
+RUN . /trb3/trb3login
+
+RUN cd /trb3/; . /trb3/trb3login; make -j4 update
+
+## 2019-02-11 - - fix strange dabc error
+RUN cd /trb3/; . /trb3/trb3login; make -j4 update
+
+RUN zypper --non-interactive in \
+ firefox \
+ lxpanel
+
+RUN pip install prettytable python2-pythondialog
--- /dev/null
+
+name=$(basename $(pwd))
+
+docker build -t $name . || exit
+
+
--- /dev/null
+
+name=$(basename $(pwd))
+
+docker build -t $name . || exit
+
+docker run --net host -v $(pwd)/conf:/conf -v $(pwd)/workdir:/workdir --rm -it \
+--name $name \
+$name /workdir/start.sh
+
--- /dev/null
+
+name=$(basename $(pwd))
+
+docker build -t $name . || exit
+
+docker run --net host -v $(pwd)/conf:/conf -v $(pwd)/workdir:/workdir --rm -it \
+--name $name \
+$name /bin/bash
+
--- /dev/null
+#!/usr/bin/perl
+use POSIX qw(SIGALRM SIGTERM sigaction);
+
+use lib "./";
+use lib "./include";
+use Digest::SHA::PurePerl qw(sha1_base64);
+
+
+$VERSION = "1.7 (Demonic/Linux)";
+
+# HTTPi Hypertext Tiny Truncated Process Implementation
+# Copyright 1999-2010 Cameron Kaiser and Contributors # All rights reserved
+# Please read LICENSE # Do not strip this copyright message.
+
+###############################################################
+# WHITE HATS ONLY BELOW THIS POINT -- SEE DOCUMENTATION FIRST #
+###############################################################
+
+%system_content_types =
+ ("html" => "text/html",
+ "htm" => "text/html",
+ "txt" => "text/plain",
+ "xml" => "text/xml",
+ "xsl" => "text/xml",
+ "xhtml" => "application/xhtml+xml",
+ "css" => "text/css",
+ "gif" => "image/gif",
+ "jpeg" => "image/jpeg",
+ "jpg" => "image/jpeg",
+ "bmp" => "image/bmp",
+ "png" => "image/png",
+ "tif" => "image/tiff",
+ "tiff" => "image/tiff",
+ "ico" => "image/x-icon",
+ "svg" => "image/svg+xml",
+ "svgz" => "image/svg+xml",
+ "wbmp" => "image/vnd.wap.wbmp",
+ "wbm" => "image/vnd.wap.wbmp",
+ "xbm" => "image/x-xbitmap",
+ "mp3" => "audio/x-mpeg",
+ "wma" => "audio/x-ms-wma",
+ "wav" => "audio/x-wav",
+ "au" => "audio/basic",
+ "aif" => "audio/x-aiff",
+ "aiff" => "audio/x-aiff",
+ "ogg" => "audio/x-ogg",
+ "oga" => "audio/x-ogg",
+ "mid" => "audio/midi",
+ "wma" => "audio/x-ms-wma",
+ "mpeg" => "video/mpeg",
+ "mpg" => "video/mpeg",
+ "aac" => "audio/aac",
+ "ogv" => "video/x-ogg",
+ "ogx" => "application/x-ogg",
+ "avi" => "video/x-msvideo",
+ "wmv" => "video/x-ms-wmv",
+ "asf" => "video/x-ms-asf",
+ "mov" => "video/quicktime",
+ "mp4" => "video/mp4",
+ "rv" => "video/vnd.m-realvideo",
+ "rm" => "application/vnd.m-realmedia",
+ "ra" => "audio/vnd.m-realaudio",
+ "ram" => "audio/vnd.m-realaudio",
+ "pdf" => "application/pdf",
+ "fdf" => "application/vnd.fdf",
+ "class" => "application/octet-stream",
+ "jar" => "application/octet-stream",
+ "js" => "application/x-javascript",
+ "lnk" => "application/x-hyperlink",
+ "prg" => "application/x-c64-prg-binary",
+ "d64" => "application/x-c64-disk-image",
+ "tar" => "application/x-tar",
+ "sit" => "application/x-stuffit",
+ "Z" => "application/x-compress",
+ "gz" => "application/x-gzip",
+ "dmg" => "application/octet-stream",
+ "img" => "application/octet-stream",
+ "lzh" => "application/octet-stream",
+ "lha" => "application/octet-stream",
+ "exe" => "application/octet-stream",
+ "com" => "application/octet-stream",
+ "zip" => "application/x-zip-compressed",
+ "hqx" => "application/x-binhex",
+ "swf" => "x-shockwave-flash",
+ "flv" => "video/x-flv",
+
+ "bin" => "application/octet-stream");
+
+# comment in to enable logs
+#$logfile = "./access.log";
+$path = "./htdocs";
+$sockaddr = 'S n a4 x8';
+
+$server_host = $ARGV[0];
+$server_port = $ARGV[1];
+
+die("$0 [host] [port] required. got >$server_host< >$server_port<") unless ($server_host and $server_port);
+
+%content_types =
+ ("html" => "text/html",
+ "htm" => "text/html",
+ "shtml" => "text/html"
+ );
+%restrictions = (
+ "/nw" => "^10\.##^Mozilla#MSIE",
+ "/status" => "####voyeur:daNrZR3TcSwD2",
+ "/" => "###(NPBot|WebZIP|HTTrack|eCatch|Offline Explorer|UdmSearch|WebCopier|internetseer|MSIECrawler|SuperBot|LinkWalker|Tutorial Crawler|WebReaper)",
+ );
+ # See documentation for interpreting this string.
+
+$headers = <<"EOF";
+Server: TRB3-DAQ based on HTTPi/$VERSION
+MIME-Version: 1.0
+EOF
+
+
+%content_types = (%system_content_types, %content_types);
+undef %system_content_types;
+
+#if ($pid = fork()) { exit; }
+$0 = "dhttpi: binding port ...";
+$bindthis = pack($sockaddr, 2, $server_port, pack('C4', 0, 0, 0, 0));
+socket(S, 2, 1, 6);
+setsockopt(S, 1, 2, 1);
+bind(S, $bindthis) || die("$0: while binding port $server_port:\n\"$!\"\n");
+listen(S, 128);
+$0 = "dhttpi: connected and waiting ANY:$server_port";
+
+$statiosuptime = time();
+
+sub sock_to_host {
+ return ($cache_hn, $cache_port, $cache_ip)
+ if (length($cache_ip));
+
+ return (undef, undef, undef) if (!$sock);
+ my($AFC, $cache_port, $thataddr, $zero) = unpack($sockaddr, $sock);
+ $cache_ip = join('.', unpack("C4", $thataddr));
+ $cache_hn =
+ gethostbyaddr($thataddr, 2) ||
+ $cache_ip;
+ return ($cache_hn, $cache_port, $cache_ip);
+}
+
+
+sub htsponse {
+ ($currentcode, $currentstring) = (@_);
+ return if (0+$httpver < 1);
+ my($what) = <<"EOF";
+HTTP/$httpver $currentcode $currentstring
+${headers}Date: $rfcdate
+EOF
+ $what =~ s/\n/\r\n/g;
+ print STDOUT $what;
+ &hthead("Connection: close") if (0+$httpver > 1);
+}
+
+sub hthead {
+ my($header, $term) = (@_);
+ return if (0+$httpver < 1);
+ print STDOUT "$header\r\n" , ($term) ? "\r\n" : "";
+}
+
+sub htcontent {
+ my($what, $ctype, $mode) = (@_);
+ ($contentlength) = $mode || length($what);
+ &hthead("Content-Length: $contentlength");
+ &hthead("Content-Type: $ctype", 1);
+ return if ($method eq 'HEAD' || $mode);
+ print STDOUT $what;
+}
+
+sub log {
+ if ($logfile && open(J, ">>$logfile")) {
+ my $q = $address . (($variables) ? "?$variables" : "");
+ $contentlength += 0;
+ $contentlength = 0 if ($method eq 'HEAD');
+ my ($hostname, $port, $ip) = &sock_to_host();
+ $hostname ||= "-";
+ $httpuser ||= "-";
+ print J <<"EOF";
+$hostname - $httpuser [$date] "$method $q HTTP/$httpver" $currentcode $contentlength "$httpref" "$httpua"
+EOF
+ close(J);
+ }
+}
+
+
+sub bye { exit; }
+sub byebye { kill(9,$secondary_pid) if ($secondary_pid); exit; }
+
+sub dead {
+ &htsponse(500, "Server Error");
+ &hterror("Server Error", <<"EOF");
+The server cannot comply with your request for resource <tt>$::address</tt>.
+Please attempt to notify the administrators.
+<p>Useful(?) debugging information:
+<pre>
+@_
+</pre>
+EOF
+ &log; exit;
+}
+
+sub defaultsignals {
+ $SIG{'__DIE__'} = \&dead;
+ sigaction SIGALRM, new POSIX::SigAction \&bye
+ or die "sigalrm failed: $!\n";
+ sigaction SIGTERM, new POSIX::SigAction \&byebye
+ or die "sigterm failed: $!\n";
+}
+&defaultsignals;
+
+sub alarmsignals {
+ undef $SIG{'__DIE__'};
+ sigaction SIGALRM, new POSIX::SigAction sub { die; }
+ or die "sigalrm failed: $!\n";
+}
+
+sub master {
+ $0 = "dhttpi: handling request";
+$sock = getpeername(STDIN);
+$rfcdate = &rfctime(scalar gmtime, 1);
+$date = scalar localtime;
+($dow, $mon, $dt, $tm, $yr) = ($date =~
+ m/(...) (...) (..) (..:..:..) (....)/);
+$dt += 0;
+$dt = substr("0$dt", length("0$dt") - 2, 2);
+$date = "$dt/$mon/$yr:$tm +0000";
+
+select(STDOUT); $|=1; $address = 0;
+alarm 5;
+while (<STDIN>) {
+ if(/^([A-Z]+)\s+([^\s]+)\s+([^\s\r\l\n]*)/) {
+ $method = $1;
+ $address = $2;
+ $httpver = $3;
+ $httpref = '';
+ $httpua = '';
+ $httpver = ($httpver =~ m#HTTP/([0-9]\.[0-9]+)#) ?
+ ($1) : (0.9);
+ $address =~ s#^http://[^/]+/#/#;
+ $0 = $execstring = "dhttpi: $method $address $httpver";
+ next unless ($httpver < 1);
+ } else {
+ s/[\r\l\n\s]+$//;
+ (/^Host:\s+(.+)/i) && ($httphost = substr($1, 0, 255))
+ && ($httphost =~ s/:\d+$//);
+ (/^Referer:\s+(.+)/i) && ($httpref = substr($1, 0, 1024));
+ (/^User-agent:\s+(.+)/i) && ($httpua = substr($1, 0, 1024));
+ (/^Content-length:\s+(\d+)/i) &&
+ ($ENV{'CONTENT_LENGTH'} = $httpcl = 0+$1);
+ (/^Content-type:\s+(.+)/i) &&
+ ($ENV{'CONTENT_TYPE'} = $httpct = substr($1, 0, 255));
+ (/^Expect:\s+/) && ($expect = 1);
+ (/^Cookie:\s+(.+)/i) &&
+ ($ENV{'HTTP_COOKIE'} = substr($1, 0, 16384));
+ (/^Authorization:\s+Basic (.+)/i) &&
+ ($httprawu = substr($1, 0, 1024));
+ (/^Range:\s+(.+)/i) &&
+ ($ENV{'CONTENT_RANGE'} = substr($1, 0, 255));
+ (/^If-Modified-Since:\s+(.+)/i) &&
+ ($modsince = $ENV{'HTTP_IF_MODIFIED_SINCE'} =
+ substr($1, 0, 255));
+ (/^Accept:\s+(.+)/i) &&
+ ($ENV{'HTTP_ACCEPT'} = substr($1, 0, 255));
+ (/^Accept-([a-zA-Z0-9]+):\s+(.+)/i) &&
+ ($ENV{'HTTP_ACCEPT_'.uc(substr($1, 0, 16))} =
+ substr($2, 0, 255));
+ (/^X-Requested-With:\s+(.+)/i) &&
+ ($ENV{'HTTP_X_REQUESTED_WITH'} = substr($1, 0, 1024));
+
+ (/^Origin:\s+(.+)/i) &&
+ ($ENV{'HTTP_ORIGIN'} = substr($1, 0, 1024));
+ (/^Upgrade:\s+(.+)/i) &&
+ ($ENV{'HTTP_UPGRADE'} = substr($1, 0, 1024));
+ (/^Sec-WebSocket-Protocol:\s+(.+)/i) &&
+ ($ENV{'WEBSOCKET_PROTOCOL'} = substr($1, 0, 1024));
+ (/^Sec-WebSocket-Version:\s+(-?\d+)/i) &&
+ ($ENV{'WEBSOCKET_VERSION'} = substr($1, 0, 8));
+ (/^Sec-WebSocket-Extensions:\s+(-?\d+)/i) &&
+ ($ENV{'WEBSOCKET_EXTENSIONS'} = substr($1, 0, 1024));
+ (/^Sec-WebSocket-Key:\s+(\S+)/i) &&
+ ($ENV{'WEBSOCKET_KEY'} = substr($1, 0, 1024));
+
+ next unless (/^$/);
+ }
+ if ($expect) {
+ &htsponse(417, "Expectation Failed");
+ &hterror("Expectation Failed",
+ "The server does not support this method.");
+ &log; exit;
+ }
+ if (!length($address) || (0+$httpver > 1 && !$httphost)) {
+ &htsponse(400, "Bad Request");
+ &hterror("Bad Request",
+ "The server cannot understand your request.");
+ &log; exit;
+ }
+ if ($method !~ /^(GET|HEAD|POST)$/) {
+ &htsponse(501, "Not Implemented");
+ &hterror("Not Implemented",
+ "Only GET, HEAD and POST are supported.");
+ &log; exit;
+ }
+
+
+ if ($ENV{'HTTP_UPGRADE'} eq 'websocket') {
+ if ($method ne "GET" || !$ENV{'WEBSOCKET_KEY'}) {
+ &htsponse(400, "Bad request");
+ &hterror("Bad request",
+ "Illegal websocket opening handshake");
+ &log; exit;
+ }
+
+ $ENV{'WEBSOCKET_ACCEPT'} =
+ sha1_base64($ENV{'WEBSOCKET_KEY'} . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11") . "=";
+
+
+ }
+
+
+
+ ($address, $variables) = split(/\?/, $address);
+ $address =~ s/%([0-9a-fA-F]{2})/pack("H2", $1)/eg;
+ $address=~ s#^/?#/#;
+ 1 while $address =~ s#/\.(/|$)#\1#;
+ 1 while $address =~ s#/[^/]*/\.\.(/|$)#\1#;
+ 1 while $address =~ s#^/\.\.(/|$)#\1#;
+ $fail = 0;
+ J: foreach(sort { length $a <=> length $b }
+ keys %restrictions) {
+ next if ($address !~ /^$_/);
+ ($allowip, $denyip, $allowua, $denyua, $auser) =
+ split(/#/, $restrictions{$_});
+ if ($allowip || $denyip) {
+ ($hostname, $port, $ip) = &sock_to_host();
+ ($allowip && $ip !~ /$allowip/) && ($fail = 1,
+ last J);
+ ($denyip && $ip =~ /$denyip/) && ($fail = 1,
+ last J);
+ }
+ ($allowua && $httpua !~ /$allowua/) &&
+ ($fail = 2, last J);
+ ($denyua && $httpua =~ /$denyua/) &&
+ ($fail = 2, last J);
+ }
+ if ($fail) {
+ &htsponse(403, "Forbidden");
+ if ($fail == 1) {
+ &hterror("Forbidden (Client Disallowed)", <<"EOF");
+Your network address (<i>$ip</i>) is not allowed to access this resource.
+EOF
+ &log; exit;
+ } else {
+ &hterror("Forbidden (Browser Disallowed)", <<"EOF");
+The browser you are using (<i>$httpua</i>) is not capable of or
+is not allowed access to this resource.
+EOF
+ &log; exit;
+ }
+ }
+ if ($auser) {
+ $httprawu =~ tr#A-Za-z0-9+/##cd;
+ $httprawu =~ tr#A-Za-z0-9+/# -_#;
+ $httprawu = unpack("u", pack("c", 32+0.75*length($httprawu))
+ . $httprawu);
+ ($httpuser, $httppw) = split(/:/, $httprawu);
+ $fail = 1;
+ foreach $user (split(/,/, $auser)) {
+ ($user, $pw) = split(/:/, $user);
+ ($fail = 0, last) if ($user eq $httpuser &&
+ crypt($httppw, substr($pw, 0, 2)) eq $pw);
+ }
+ if ($fail) {
+ $httpuser = '';
+ &htsponse(401, "Authorization Required");
+ &hthead("WWW-Authenticate: Basic realm=\"$address\"");
+ &hterror("Authorization Required", <<"EOF");
+You must provide a username and password to use this resource. Either you
+entered this information incorrectly, or your browser does not know how to
+present the credentials required.
+EOF
+ &log; exit;
+ }
+ }
+
+ alarm 0;
+
+
+
+
+ $raddress = "$path$address"
+ ;
+ 1 while ($raddress =~ s#//#/#);
+ &hterror301("http://$server_host:$server_port$address/")
+ if ($address !~ m#/$# && -d $raddress);
+ $raddress = (-r "${raddress}index.shtml") ?
+ "${raddress}index.shtml" : "${raddress}index.html"
+ if (-d $raddress);
+ IRED: ($hostname, $port, $ip) = &sock_to_host();
+ if(!sysopen(S, $raddress, 0)) { &hterror404; } else {
+ if ((-x $raddress)
+ ) {
+ $currentcode = 100; &nsecmodel;
+ $ENV{'REQUEST_METHOD'} = $method;
+ $ENV{'SERVER_NAME'} = $server_host;
+ $ENV{'SERVER_PROTOCOL'} = "HTTP/$httpver";
+ $ENV{'SERVER_SOFTWARE'} = "HTTPi/$VERSION";
+ $ENV{'SERVER_PORT'} = "$server_port";
+ $ENV{'SERVER_URL'} = "http://$server_host:$server_port/";
+ $ENV{'SCRIPT_FILENAME'} = $raddress;
+ $ENV{'SCRIPT_NAME'} = $address;
+ $ENV{'REMOTE_HOST'} = $hostname;
+ $ENV{'REMOTE_ADDR'} = $ip;
+ $ENV{'REMOTE_PORT'} = $port;
+ $ENV{'QUERY_STRING'} = $variables;
+ $ENV{'HTTP_USER_AGENT'} = $httpua;
+ $ENV{'HTTP_REFERER'} = $httpref;
+ undef $pid;
+ if ($pid = fork()) { kill 15, $$; exit; }
+ elsif (!defined($pid)) {
+ die
+ "temporary(?) fork error, please retry request: $!\n";
+ } else {
+ require $raddress;
+ exit;
+ }
+ }
+ ($x,$x,$x,$x,$x,$x,$x,$length,$x,$mtime) = stat(S);
+ $ctype = 0;
+ foreach(keys %content_types) {
+ if ($raddress =~ /\.$_$/i) {
+ $ctype = $content_types{$_};
+ }
+ }
+ $mtime = &rfctime($mtime);
+SERVEIT:
+ if ($mtime eq $modsince) {
+ &htsponse(304, "Not Modified");
+ &hthead("Last-Modified: $mtime", 1);
+ &log; exit;
+ }
+ $ctype ||= 'text/plain';
+ if ($pid = fork()) { kill 15, $$; exit; }
+ $contentlength ||= $length;
+ &htsponse(200, "OK");
+ &hthead("Last-Modified: $mtime");
+ &htcontent("", $ctype, $length);
+ &nsecmodel;
+ $bytecount = 0;
+ unless ($method eq 'HEAD') {
+ while(!eof(S)) {
+ read(S, $q, 32768);
+ print STDOUT $q;
+ $bytecount += 32768;
+ $0 = $execstring .
+ " ($bytecount bytes sent)";
+ }
+ }
+ alarm 0;
+ }
+ exit;
+}
+
+exit;
+}
+
+
+sub nsecmodel {
+ &log;
+ ($x,$x,$x,$x,$uid,$gid) = stat(S);
+ #(!$uid || !$gid || $uid < 2 ) &&
+# die "resource is root-owned, secured or not stat-able\n";
+# if (!$<) {
+# ($) = "$gid $gid") || die "can't set egid to $gid";
+# ($> = $uid) || die "can't set euid to $uid";
+# ($( = "$gid $gid") || die "can't set rgid to $gid";
+# ($< = $uid) || die "can't set ruid to $uid";
+# }
+}
+
+sub rfctime {
+ my $mtime = shift;
+ $mtime = (scalar gmtime $mtime) if (!(shift));
+ my ($dow, $mon, $dt, $tm, $yr) =
+ ($mtime =~ m/(...) (...) (..) (..:..:..) (....)/);
+ $dt += 0; $yr += 0;
+ return "$dow, $dt $mon $yr $tm GMT";
+}
+
+sub hterror {
+ my($errstr, @expl) = (@_);
+ &htcontent(<<"EOF", "text/html");
+<html>
+<body>
+<h1>$errstr</h1>
+@expl
+<hr>
+<address><a href = "http://httpi.floodgap.com/">httpi/$VERSION</a>
+by Cameron Kaiser</address>
+</body>
+</html>
+EOF
+ }
+
+sub hterror404 {
+ &htsponse(404, "Not Found");
+ &hterror("Not Found",
+ "The resource <tt>$address</tt> was not found on this system.");
+ &log; exit;
+}
+
+sub hterror301 {
+ &htsponse(301, "Moved Permanently");
+ &hthead("Location: @_");
+ &hterror("Resource Moved Permanently",
+ "This resource has moved <a href = \"@_\">here</a>.");
+ &log; exit;
+}
+
+
+$0 = "dhttpi: on ANY:$server_port, ready!";
+$master_pid = $$;
+for (;;) {
+ if ($secondary_pid = fork()) {
+ waitpid($secondary_pid, 0);
+ $0 = "dhttpi: on ANY:$server_port, last request " .
+ scalar localtime;
+ } else {
+ $0 = "dhttpi (child of $master_pid): waiting for connect";
+ $addr=accept(NS,S);
+ open(STDIN, "<&NS");
+ open(STDOUT, ">&NS");
+ &defaultsignals;
+ &master;
+ exit;
+ }
+}
--- /dev/null
+#!/bin/bash
+
+
+trbcmd s 0x7100000390255228 0x00 0x0350
+trbcmd s 0x8c0000039025fa28 0x01 0x0351
+trbcmd s 0xb00000039053e328 0x02 0x0352
+trbcmd s 0x790000039053dc28 0x03 0x0353
+trbcmd s 0x920000039053d928 0x05 0xc035
+echo "FPGAs after addressing"
+trbcmd i 0xffff
--- /dev/null
+#!/bin/bash
+
+cd /conf
+
+
+
+echo "configure container"
+
+export TRB3_PORT=35
+export DAQOPSERVER=localhost:$TRB3_PORT
+export TRB3_SERVER=192.168.4.240
+export CTS_GUI_PORT=1148
+export CTS_ENDPOINT=0xc035
+export DISPLAY=:2 # go4 window will be sent to $DISPLAY, if provide_vnc == yes , then it will be this x11 display
+
+export PULSER=192.168.103.74
+
+> conf_log.txt
+
+provide_dhcp=yes
+#edit conf/dhcpd.conf, enter your trb3 MAC address ###
+provide_trbnetd=yes
+
+provide_cts_gui=yes
+
+provide_vnc=yes
+vnc_password=
+vnc_port=5902
+vnc_geometry=1500x1024
+
+
+# tmux new-session -d -s x11vnc -n x11vnc "x11vnc -forever -create -rfbport 5902 #(nopasswd)"
+
+# set paths for go4/dabc/stream
+. /trb3/trb3login
+
+
+
+### no need to touch the rest of the file ###
+
+ echo ... >> conf_log.txt
+ echo DAQOPSERVER=$DAQOPSERVER >> conf_log.txt
+ echo >> conf_log.txt
+
+if [ $provide_dhcp == "yes" ]; then
+ echo starting dhcp server
+ cp dhcpd.conf /etc/dhcpd.conf
+ > /tmp/dhcp_leasefile
+ dhcpd -lf /tmp/dhcp_leasefile
+ echo ... >> conf_log.txt
+ echo dhcp server started >> conf_log.txt
+ echo using config file /conf/dhcpd.conf >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+if [ $provide_trbnetd == "yes" ]; then
+ trbnetd -i $TRB3_PORT
+ echo ... >> conf_log.txt
+ echo started trbnetd >> conf_log.txt
+ echo TRB3_SERVER=$TRB3_SERVER >> conf_log.txt
+ echo port $TRB3_PORT >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+if [ $provide_cts_gui == "yes" ]; then
+# screen -S cts_gui -d -m ./start_cts_gui.sh
+ tmux new-session -d -s cts_gui -n cts_gui "cd /daqtools/web; perl ./cts_gui --endpoint $CTS_ENDPOINT --quiet --noopenxterm --port $CTS_GUI_PORT"
+# tmux new-window -t main:1 -n "cts_gui" "cd /daqtools/web; perl ./cts_gui --endpoint $CTS_ENDPOINT --quiet --noopenxterm --port $CTS_GUI_PORT"
+ echo ... >> conf_log.txt
+ echo started cts_gui with following parameters:>> conf_log.txt
+ echo --endpoint $CTS_ENDPOINT >> conf_log.txt
+ echo --port $CTS_GUI_PORT >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+if [ $provide_vnc == "yes" ]; then
+ mkdir -p $HOME/.vnc/
+ echo $vnc_password | vncpasswd -f > $HOME/.vnc/passwd
+ tmux new-session -d -s vnc -n vnc "echo starting vnc server on port $vnc_port for display $DISPLAY; vncserver $DISPLAY -rfbauth $HOME/.vnc/passwd -rfbport $vnc_port -geometry $vnc_geometry ;/bin/bash"
+
+ echo ... >> conf_log.txt
+ echo "started vnc server (e.g. for Go4 window)" >> conf_log.txt
+ echo port=$vnc_port >> conf_log.txt
+ echo DISPLAY=$DISPLAY >> conf_log.txt
+ echo password=$vnc_password >> conf_log.txt
+ echo >> conf_log.txt
+ echo connect with: vncviewer localhost:$vnc_port >> conf_log.txt
+ echo >> conf_log.txt
+fi
+
+./addresses.sh
+
+/daqtools/tools/loadregisterdb.pl register_configgbe.db
+/daqtools/tools/loadregisterdb.pl register_configgbe_ip.db
+sleep 1
+./conf_cts.sh
+./conf_tdcs.sh
+
+
+echo "done"
--- /dev/null
+#!/bin/bash
+
+# CTS Configuration dump
+# generated: 2019-02-05 15:10
+# CTS Compile time: 2019-01-21 14:47
+#
+# trbcmd Dev. Reg. Value
+trbcmd setbit 0xc035 0xa00c 0x80000000 # Disable all triggers
+trbcmd w 0xc035 0xa008 0xffffffff # cts_fsm_limits: ro=65535, td=65535
+trbcmd w 0xc035 0xa009 0x00000001 # cts_readout_config:
+ # channel_cnt=false, idle_dead_cnt=false, input_cnt=true
+ # timestamp=false, trg_cnt=false
+trbcmd w 0xc035 0xa00c 0x80000400 # cts_throttle: enable=true, stop=false, threshold=0
+trbcmd w 0xc035 0xa00d 0x00000001 # cts_eventbuilder:
+ # cal_eb=0, mask=0000 0000 0000 0001, rr_interval=0
+ # use_cal_eb=false
+trbcmd w 0xc035 0xa101 0xffff0400 # trg_channel_mask: edge=1111 1111 1111 1111, mask=0000 0100 0000 0000
+trbcmd w 0xc035 0xa124 0x00000000 # trg_input_config0: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa125 0x00000000 # trg_input_config1: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa126 0x00000000 # trg_input_config2: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa127 0x00000000 # trg_input_config3: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa128 0x00000000 # trg_input_config4: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa129 0x00000000 # trg_input_config5: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa12a 0x00000000 # trg_input_config6: delay=0, invert=false, override=off, spike_rej=0
+trbcmd w 0xc035 0xa13b 0x000f0000 # trg_coin_config0:
+ # coin_mask=0000 0000, inhibit_mask=0000 0000
+ # window=15
+trbcmd w 0xc035 0xa13c 0x000f0000 # trg_coin_config1:
+ # coin_mask=0000 0000, inhibit_mask=0000 0000
+ # window=15
+trbcmd w 0xc035 0xa13e 0x00000000 # trg_input_mux0: input=extclk[0]
+trbcmd w 0xc035 0xa13f 0x00000001 # trg_input_mux1: input=extclk[1]
+trbcmd w 0xc035 0xa140 0x00000002 # trg_input_mux2: input=trgext[2]
+trbcmd w 0xc035 0xa141 0x00000003 # trg_input_mux3: input=trgext[3]
+trbcmd w 0xc035 0xa142 0x00000004 # trg_input_mux4: input=jeclin[0]
+trbcmd w 0xc035 0xa143 0x00000005 # trg_input_mux5: input=jeclin[1]
+trbcmd w 0xc035 0xa144 0x00000006 # trg_input_mux6: input=jeclin[2]
+trbcmd w 0xc035 0xa146 0x00000000 # trg_addon_output_mux0: input=itc[0]
+trbcmd w 0xc035 0xa147 0x00000001 # trg_addon_output_mux1: input=itc[1]
+trbcmd w 0xc035 0xa148 0x00000002 # trg_addon_output_mux2: input=itc[2]
+trbcmd w 0xc035 0xa149 0x00000003 # trg_addon_output_mux3: input=itc[3]
+trbcmd w 0xc035 0xa14a 0x00000004 # trg_addon_output_mux4: input=itc[4]
+trbcmd w 0xc035 0xa14b 0x00000005 # trg_addon_output_mux5: input=itc[5]
+trbcmd w 0xc035 0xa14c 0x00000006 # trg_addon_output_mux6: input=itc[6]
+trbcmd w 0xc035 0xa14d 0x00000007 # trg_addon_output_mux7: input=itc[7]
+trbcmd w 0xc035 0xa14f 0x00010000 # trg_periph_config0: mask=0001 0000 0000 0000 0000
+trbcmd w 0xc035 0xa150 0x00000000 # trg_periph_config1: mask=0000 0000 0000 0000 0000
+trbcmd w 0xc035 0xa151 0x00000000 # trg_periph_config2: mask=0000 0000 0000 0000 0000
+trbcmd w 0xc035 0xa152 0x00000000 # trg_periph_config3: mask=0000 0000 0000 0000 0000
+trbcmd w 0xc035 0xa154 0x000061a7 # trg_pulser_config0: low_duration=24999
+trbcmd w 0xc035 0xa155 0x00000003 # trg_pulser_config1: low_duration=3
+trbcmd w 0xc035 0xa157 0x00000000 # trg_random_pulser_config0: threshold=0
+trbcmd w 0xc035 0xa159 0x1111111d # _trg_trigger_types0:
+ # type0=0xd_tdc_calibration_trigger, type1=0x1_physics_trigger
+ # type2=0x1_physics_trigger, type3=0x1_physics_trigger
+ # type4=0x1_physics_trigger, type5=0x1_physics_trigger
+ # type6=0x1_physics_trigger, type7=0x1_physics_trigger
+trbcmd w 0xc035 0xa15a 0x11111111 # _trg_trigger_types1:
+ # type10=0x1_physics_trigger, type11=0x1_physics_trigger
+ # type12=0x1_physics_trigger, type13=0x1_physics_trigger
+ # type14=0x1_physics_trigger, type15=0x1_physics_trigger
+ # type8=0x1_physics_trigger, type9=0x1_physics_trigger
+trbcmd clearbit 0xc035 0xa00c 0x80000000 # Enable all triggers
+
--- /dev/null
+...
+DAQOPSERVER=localhost:35
+
+...
+dhcp server started
+using config file /conf/dhcpd.conf
+
+...
+started trbnetd
+TRB3_SERVER=192.168.4.240
+port 35
+
+...
+started cts_gui with following parameters:
+--endpoint 0xc035
+--port 1148
+
+...
+started vnc server (e.g. for Go4 window)
+port=5902
+DISPLAY=:2
+password=
+
+connect with: vncviewer localhost:5902
+
--- /dev/null
+#!/bin/bash
+
+
+
+### all tdcs ###
+
+for TDC in 0x0350 0x0351 0x0352 0x0353; do
+
+ # invert the first 32 channels
+ trbcmd w $TDC 0xc805 0xFFFFFFFF
+
+ # enable trigger windows +-1000 ns
+ trbcmd w $TDC 0xc801 0x80c800c8
+
+ # set channel ringbuffer size
+ trbcmd w $TDC 0xc804 10
+
+done
+
+
+### tdcs with pasttrec attached ###
+
+for TDC in 0x0350 0x0351; do
+
+ # enable the first 16 channels (CONN1)
+ trbcmd setbit $TDC 0xc802 0x0000FFFF
+
+ # enable the second 16 channels (CONN2)
+ trbcmd setbit $TDC 0xc802 0xFFFF0000
+
+done
+
+
+### reference time TDC ###
+
+for TDC in 0x0353; do
+
+ # non- invert the first channel
+ trbcmd clearbit $TDC 0xc805 0x1
+
+ # enable the first channel
+ trbcmd setbit $TDC 0xc802 0x1
+
+ # enable Florian's trigger Logic
+ trbcmd setbit $TDC 0xe000 0x1
+ # enable edge detect
+ trbcmd setbit $TDC 0xe008 0x1
+ # merge outputs
+ trbcmd setbit $TDC 0xe018 0x1
+ # delay 0 cycles
+ trbcmd setbit $TDC 0xe100 0x0
+ # stretcher on, five cycles
+ #trbcmd setbit $TDC 0xe200 0x10005
+
+done
--- /dev/null
+
+shared-network em1 {
+ subnet 192.168.4.0 netmask 255.255.255.0 {
+ option subnet-mask 255.255.255.0;
+ option broadcast-address 192.168.4.255;
+ option routers 192.168.4.254;
+ #option domain-name-servers 141.2.242.36;
+ #option domain-name "x-matter.uni-frankfurt.de";
+ default-lease-time 86400;
+ max-lease-time 172800;
+ }
+}
+ host trb3_148 { hardware ethernet 02:00:f8:00:be:30; fixed-address 192.168.4.240;}
+ host trb3_148_new { hardware ethernet da:7a:37:0e:f4:30; fixed-address 192.168.4.240;}
+ host trb3_148_old { hardware ethernet 02:00:be:30:f4:0e; fixed-address 192.168.4.240;}
+ host trb3_35 { hardware ethernet da:7a:33:90:53:d9; fixed-address 192.168.4.240;}
--- /dev/null
+
+
+
+!Register table
+# Type # C0 # C1 # C2 # C3 # C4 # C5 # C6 # C7 # C8 # C9 #
+###################################################################################################
+ 0 0x8300 0x8305 0x8307 0x8308 0x830b
+ 1 0x8301 0x8302 0x8304 0x8309 0x830c 0x830e 0x830f 0x8310
+
+
+!Value table
+# SubEvtId UseGbE MultiQueue Trig. Num. InclTrgType
+# Hub # Type # C0 # C1 # C2 # C3 # C4 #
+##################################################################################
+ 0xc035 0 0xc035 1 0 0xffffff 1
+
+
+
+#These values to not need to be written - for completeness only
+# SubEvtDec QueDec FrameSize RX enable SubEvtSize Evt/Queue QueueClose MaxQueueSize
+# Hub # Type # C0 # C1 # C2 # C3 # C4 # C5 # C6 # C7 #
+##########################################################################################################################
+# 0xff7f 1 0x00020001 0x00030062 0x578 1 59800 200 32000 60000
--- /dev/null
+###########################################################################################
+#Eventbuilders:
+# EB 0: hadespc001 eth1 ports 50000 - 50099
+
+!Register table
+# Type # C0 # C1 # C2 # C3 # C4 #
+#######################################################
+#new memory locations
+ 0 0x8100 0x8101 0x8102 0x8103 0x8107
+ 1 0x8110 0x8111 0x8112 0x8113 0x8117
+ 2 0x8120 0x8121 0x8122 0x8123 0x8127
+ 3 0x8130 0x8131 0x8132 0x8133 0x8137
+ 4 0x8140 0x8141 0x8142 0x8143 0x8147
+ 5 0x8150 0x8151 0x8152 0x8153 0x8157
+ 6 0x8160 0x8161 0x8162 0x8163 0x8167
+ 7 0x8170 0x8171 0x8172 0x8173 0x8177
+ 8 0x8180 0x8181 0x8182 0x8183 0x8187
+ 9 0x8190 0x8191 0x8192 0x8193 0x8197
+ 10 0x81A0 0x81A1 0x81A2 0x81A3 0x81A7
+ 11 0x81B0 0x81B1 0x81B2 0x81B3 0x81B7
+ 12 0x81C0 0x81C1 0x81C2 0x81C3 0x81C7
+ 13 0x81D0 0x81D1 0x81D2 0x81D3 0x81D7
+ 14 0x81E0 0x81E1 0x81E2 0x81E3 0x81E7
+ 15 0x81F0 0x81F1 0x81F2 0x81F3 0x81F7
+
+!Value table
+# Dest MAC Dest MAC Dest IP Dest Port Src Port
+# Hub # Type # C0 # C1 # C2 # C3 # C4 #
+####################################################################################
+
+ 0xc035 0 0xBB61482F 0xECF4 0xc0a804fe 50002 0xc350
+
+
+
--- /dev/null
+#!/bin/bash
+
+trbcmd reload 0x0350
+trbcmd reload 0x0351
+trbcmd reload 0x0352
+trbcmd reload 0x0353
+trbcmd reload 0xc035
+
+sleep 4
+
+./addresses.sh
--- /dev/null
+<?xml version="1.0"?>
+
+<!--
+This is example file how HADAQ event building should be configured in DABC.
+Event building process implemented in Combiner module of hadaq::CombinerModule class.
+Module can have several inputs, each with separate port number for receiving data
+from TRB boards. For every input one could configure only UDP port number - host name is ignored.
+First output of combiner module reserved for the connection to the MBS transmitter module.
+Second output can be use to store data in hld files.
+To enable HLD file storage one should specify NumOutputs for Combiner module
+and provide hld file name for Output1 port
+
+ <NumOutputs value="2"/>
+ <OutputPort name="Output1" url="hld://dabc.hld?maxsize=2000"/>
+
+File name fill be extended according to HADAQ naming convetion.
+
+Optionally one can enable MBS transmitter module, which converts HLD to LMD format.
+To enable transmitter, one should specify auto="true" in configuration which says DABC
+to automatically create module when starting application.
+First output of the module reserved for stream server, second output can be used to
+store data in lmd files.
+
+By default, HTTP server is enabled. Do disable it, remove <HttpServer> section or
+put <HttpServer name="http" auto="false">. One could change http port number.
+When dabc runs, in any browser address like
+http://your_dabc_host_name:8090 can be opened. At the moment http server provides:
+ - ratemeters from EventBuilder and Transmitter
+ - log fields
+ - commands to start/stop hld and lmd files from browser
+
+It is also possible to attach go4 analysis to that server, that also histograms
+from online analysis will appear. For that one should specify
+"-dabc your_dabc_host_name" argument when starting analysis. Like:
+ [shell] go4analysis -stream dabc_node -dabc dabc_node
+When launching analysis from the gui, extra arguments "-dabc your_dabc_host_name"
+should be specified.
+
+There is well-known problem with using VNC viewer and mbs stream server.
+Both by default are using port 6002. One could change port number for stream server.
+Just set other number in configuration of output port of transmitter module, for instance
+ <OutputPort name="Output0" url="mbs://Stream:6789"/>
+In this case one should specify that port number when starting go4 analysis like:
+ [shell] go4analysis -stream dabc_node:6789 -dabc dabc_node:4444
+When starting analysis from the go4 gui, one should specify stream server with port number too.
+
+-->
+
+<dabc version="2">
+ <Context host="localhost" name="EventBuilder">
+ <Run>
+ <lib value="libDabcMbs.so"/>
+ <lib value="libDabcHadaq.so"/>
+ <lib value="libDabcHttp.so"/>
+ <lib value="libDabcStream.so"/>
+ <logfile value="hadaqevtbuild.log"/>
+ <loglevel value="-1"/>
+ <loglimit value="1000"/>
+ <control value="true"/>
+ <threads_layout value="balanced"/>
+ </Run>
+
+ <HttpServer name="http" port="8091"/>
+
+ <!-- If uncommented, all internal manager structures will be published in the web server -->
+ <!-- Publisher name="publ" manager="true"/ -->
+
+ <!-- If uncommented, profiling will be enabled for all threads -->
+ <!-- Thread name="*" publ="true" prof="true"/ -->
+
+ <MemoryPool name="Pool">
+ <BufferSize value="2000000"/>
+ <NumBuffers value="1000"/>
+ </MemoryPool>
+
+ <!-- these are default parameters for TDC calibration modules -->
+ <Module name="Input*TdcCal">
+ <InputPort name="Input*" queue="30"/>
+
+ <FineMin value="31"/>
+ <FineMax value="515"/>
+ <NumChannels value="33"/>
+ <EdgeMask value="2"/> <!-- 1: only leading edge 2:leading/trailing individual 3:statistics from leading used 4:statistics merged -->
+ <HistFilling value="4"/>
+ <CalibrFile value="/workdir/tdc_calib"/> <!-- local/-->
+ <!--DisableCalibrationFor value="0"/-->
+ <Auto value="100000"/>
+
+ <!-- TRB value="0x8010"/-->
+ <!-- HUB value="0x9000"/-->
+ <!-- TDC value="[0x8a00,0x8a01,0x8a02,0x8a03]"/-->
+ <Dummy value="true"/>
+ </Module>
+
+
+ <Module name="Combiner" class="hadaq::CombinerModule">
+ <!-- these parameters will force to create inputs/outputs of module -->
+ <NumInputs value="1"/>
+ <NumOutputs value="2"/>
+
+ <InputPort name="Input0" url="hadaq://host:50002" urlopt1=""/>
+<!-- <InputPort name="Input0" url="hadaq://host:50061" urlopt1=""/> -->
+ <!-- <InputPort name="Input1" url="hadaq://host:50008" urlopt1=""/> -->
+ <!-- <InputPort name="Input2" url="hadaq://host:50084" urlopt1=""/> -->
+ <!-- <InputPort name="Input3" url="hadaq://host:50158" urlopt1=""/> -->
+
+
+ <!-- <InputPort name="Input4" url="hadaq://host:10104" urlopt1="trb=0x8030&tdc=[0x3030,0x3031,0x3032,0x3033]&dummy"/> -->
+ <!-- <InputPort name="Input5" url="hadaq://host:10105" urlopt1="trb=0x8040&tdc=[0x3040,0x3041,0x3042,0x3043]&dummy"/> -->
+
+ <!-- <InputPort name="Input0" url="hadaq://host:50021" urlopt1="trb=0x8000&hub=0x8100&tdc=[0xC000,0xC001,0xC003]&dummy"/> -->
+ <!-- <InputPort name="Input1" url="hadaq://host:50094" urlopt1="trb=0x8003&tdc=[0xC00C,0xC00D,0xC00E,0xC00F]&dummy"/> -->
+ <!-- <InputPort name="Input2" url="hadaq://host:50096" urlopt1="trb=0x8002&tdc=[0xC008,0xC009,0xC00A,0xC00B]&dummy"/> -->
+ <!-- <InputPort name="Input3" url="hadaq://host:10104" urlopt1="trb=0x8030&tdc=[0x3030,0x3031,0x3032,0x3033]&dummy"/> -->
+ <!-- <InputPort name="Input4" url="hadaq://host:10105" urlopt1="trb=0x8040&tdc=[0x3040,0x3041,0x3042,0x3043]&dummy"/> -->
+
+ <!-- <InputPort name="Input*" queue="30"
+ urlopt="udpbuf=20000&mtu=64512&flush=3.0&observer=false&debug&resort"/>
+ -->
+
+ <InputPort name="Input*" queue="30" urlopt="udpbuf=400000&mtu=64512&flush=1&observer=false&debug"/>
+
+ <ExtraDebug value="false"/>
+
+ <!-- this is stream server for online monitoring, normally always on -->
+ <OutputPort name="Output0" url="mbs://Stream:6789?iter=hadaq_iter&subid=0x1f"/>
+
+ <!-- this is example of HLD file storage - local and RFIO -->
+ <OutputPort name="Output1" url="hld:///tmp/TDC_data.hld?maxsize=2000"/>
+ <!--OutputPort name="Output1" url="hld:///linev/path/dabc.hld?maxsize=1900&rfio"/-->
+
+ <DoShmControl value="false"/>
+ <FlushTimeout value="1.0"/>
+ <BuildDropTimeout value="1000"/>
+
+ <!-- take event sequence number from vulom/roc sync message at cts -->
+ <UseSyncSequenceNumber value="false"/>
+ <SyncSubeventId value="0x8000"/>
+ <SyncTriggerMask value="0x01"/>
+ <PrintSync value="false"/>
+ <FlushBySync value="false"/>
+
+ <!--TriggerNumRange: defines when trigger sequence number wraps. only 16 bit for HADES EBs, 24 bit for trb3! -->
+ <TriggerNumRange value="0x10000"/>
+
+ <!--AccountLostEventDiff: if true, missing trigger sequence number are added as lost events to stats. Disabled for multiple event builder mode! -->
+ <AccountLostEventDiff value="true"/>
+
+ <!-- rate meters configuration -->
+ <HadaqData width="4" prec="2" low="0" up="10" debug="1"/>
+ <HadaqEvents width="5" prec="1" low="0" up="1000" debug="1"/>
+ <HadaqDroppedData width="5" prec="3" low="0" up="1" debug="1"/>
+ <HadaqLostEvents width="4" prec="2" low="0" up="100" debug="1"/>
+ </Module>
+
+ <!-- Uncomment to see terminal output like old event builder -->
+ <Module name="Term" class="hadaq::TerminalModule" period="0.3" clear="false"/>
+
+ </Context>
+
+</dabc>
--- /dev/null
+// this is example for
+
+
+#include <stdlib.h>
+
+void first()
+{
+ //base::ProcMgr::instance()->SetRawAnalysis(true);
+ base::ProcMgr::instance()->SetTriggeredAnalysis(true);
+
+ // all new instances get this value
+ base::ProcMgr::instance()->SetHistFilling(4);
+
+ // this limits used for liner calibrations when nothing else is available
+ hadaq::TdcMessage::SetFineLimits(10, 510);
+
+ // default channel numbers and edges mask
+ hadaq::TrbProcessor::SetDefaults(33, 0x2);
+// hadaq::TdcProcessor::SetDefaults(1000);
+ //hadaq::TdcProcessor::DisableCalibrationFor(0,8);
+ // [min..max] range for TDC ids
+ //hadaq::TrbProcessor::SetTDCRange(0x610, 0x613);
+ hadaq::TrbProcessor::SetTDCRange(0x0350, 0x0353);
+
+ // configure ToT calibration parameters
+ // first - minimal number of counts in ToT histogram
+ // second - maximal RMS value
+ hadaq::TdcProcessor::SetToTCalibr(100, 0.2);
+
+ //hadaq::T
+ // [min..max] range for HUB ids
+ hadaq::TrbProcessor::SetHUBRange(0xc001, 0xcfff);
+
+ // when first argument true - TRB/TDC will be created on-the-fly
+ // second parameter is function name, called after elements are created
+ hadaq::HldProcessor* hld = new hadaq::HldProcessor(true, "after_create");
+
+ const char* calname = getenv("CALNAME");
+ if ((calname==0) || (*calname==0)) calname = "test_";
+ const char* calmode = getenv("CALMODE");
+ int cnt = (calmode && *calmode) ? atoi(calmode) : 0;
+ const char* caltrig = getenv("CALTRIG");
+ unsigned trig = (caltrig && *caltrig) ? atoi(caltrig) : 0x0;
+ const char* uset = getenv("USETEMP");
+ unsigned use_temp = 0; // 0x80000000;
+ if ((uset!=0) && (*uset!=0) && (strcmp(uset,"1")==0)) use_temp = 0x80000000;
+
+ printf("HLD configure calibration calfile:%s cnt:%d trig:%X temp:%X\n", calname, cnt, trig, use_temp);
+
+ // first parameter if filename prefix for calibration files
+ // and calibration mode (empty string - no file I/O)
+ // second parameter is hits count for autocalibration
+ // 0 - only load calibration
+ // -1 - accumulate data and store calibrations only at the end
+ // >0 - automatic calibration after N hits in each active channel
+ // third parameter is trigger type mask used for calibration
+ // (1 << 0xD) - special 0XD trigger with internal pulser, used also for TOT calibration
+ // 0x3FFF - all kinds of trigger types will be used for calibration (excluding 0xE and 0xF)
+ // 0x80000000 in mask enables usage of temperature correction
+// hld->ConfigureCalibration(calname, cnt, /*(1 << trig) | use_temp*/ 0x3fff);
+ hld->ConfigureCalibration("test_", -1, (1 << 0xD));
+
+
+ // only accept trigger type 0x1 when storing file
+ //new hadaq::HldFilter(0x0);
+
+ // create ROOT file store
+// base::ProcMgr::instance()->CreateStore("td.root");
+
+ // 0 - disable store
+ // 1 - std::vector<hadaq::TdcMessageExt> - includes original TDC message
+ // 2 - std::vector<hadaq::MessageFloat> - compact form, without channel 0, stamp as float (relative to ch0)
+ // 3 - std::vector<hadaq::MessageDouble> - compact form, with channel 0, absolute time stamp as double
+ base::ProcMgr::instance()->SetStoreKind(1);
+
+}
+
+// extern "C" required by DABC to find function from compiled code
+
+extern "C" void after_create(hadaq::HldProcessor* hld)
+{
+ printf("Called after all sub-components are created\n");
+
+ if (hld==0) return;
+
+ for (unsigned k=0;k<hld->NumberOfTRB();k++) {
+ hadaq::TrbProcessor* trb = hld->GetTRB(k);
+ if (trb==0) continue;
+ printf("Configure %s!\n", trb->GetName());
+ trb->SetPrintErrors(10);
+ }
+
+ unsigned firsttdc = 0;
+
+ for (unsigned k=0;k<hld->NumberOfTDC();k++) {
+ hadaq::TdcProcessor* tdc = hld->GetTDC(k);
+ if (tdc==0) continue;
+
+ if (firsttdc == 0) firsttdc = tdc->GetID();
+
+ printf("Configure %s!\n", tdc->GetName());
+
+ // try to build abs time difference between 0 channels
+ // if (tdc->GetID() != firsttdc)
+ // tdc->SetRefChannel(0, 0, (0x70000 | firsttdc), 6000, -20., 20.);
+
+ tdc->SetUseLastHit(false);
+
+ // tdc->DisableCalibrationFor(0);
+
+ // if (tdc->GetID() == 0x1130);
+
+ for (int n=1;n<49;++n)
+ tdc->SetRefChannel(n,0, 0xffff, 6000, -200, 200); // LED DIFF
+ }
+}
+
+
--- /dev/null
+// Automatically generated startup script
+// Do not change it!
+
+go4->SetMainWindowState(4,"000000ff00000000fd000000020000000000000125000002e8fc0200000001fb0000001600420072006f00770073006500720044006f0063006b0100000073000002e80000007a00ffffff000000030000063c00000082fc0100000001fc000000000000063c0000003d00fffffffa000000000200000003fb00000016004c006f00670049006e0066006f0044006f0063006b0100000000ffffffff0000005300fffffffb0000001a004d006200730056006900650077006500720044006f0063006b0000000000ffffffff0000006500fffffffb0000001e0044004100420043004d006f006e00690074006f00720044006f0063006b0000000279000000ce000000000000000000000511000002e800000004000000040000000800000008fc0000000800000002000000040000001600460069006c00650054006f006f006c0042006100720100000000ffffffff0000000000000000000000160047006f00340054006f006f006c00730042006100720100000106ffffffff00000000000000000000001e0041006e0061006c00790073006900730054006f006f006c004200610072010000024a0000025800000000000000000000001a0044006900760069006400650050006100640044006f0063006b0000000395000000e40000000000000000000000020000000000000002000000020000002400420072006f0077007300650072004f007000740069006f006e00730044006f0063006b01000000000000010200000000000000000000001e0044007200610077004f007000740069006f006e00730044006f0063006b01000001020000037e00000000000000000000000200000002000000240048006900730044007200610077004f007000740069006f006e00730044006f0063006b0000000000000001290000000000000000000000180047006f0034005300740079006c00650044006f0063006b0000000000000004b10000000000000000000000020000000200000020005300630061006c0065004f007000740069006f006e00730044006f0063006b0000000000000004b100000000000000000000002c0041006e0061006c00790073006900730043006f006d006d0061006e00640054006f006f006c0042006100720100000000ffffffff0000000000000000000000030000000000000003000000010000001e0043006f006d006d0061006e0064004c0069006e00650044006f0063006b0000000000000004b1000000000000000000000003000000010000001c00540072006500650056006900650077006500720044006f0063006b0000000000000004b10000000000000000");
+go4->SetMainWindowGeometry(4,"01d9d0cb00010000000000140000000c000006570000042d00000018000000240000065300000429000000000000");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqgif.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqico.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqjpeg.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqmng.so");
+go4->LoadLibrary("/usr/lib64/libmng.so.1");
+go4->LoadLibrary("/usr/lib64/liblcms.so.1");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqsvg.so");
+go4->LoadLibrary("/usr/lib64/libQtSvg.so.4");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqtga.so");
+go4->LoadLibrary("/usr/lib64/qt4/plugins/imageformats/libqtiff.so");
+go4->LoadLibrary("/lib64/libnss_mdns_minimal.so.2");
+go4->LoadLibrary("/lib64/libnss_dns.so.2");
+go4->LoadLibrary("/lib64/libresolv.so.2");
+
+go4->LaunchAnalysis("MyAnalysis", ".", "", "localhost", Go4_sh, Go4_qt, Go4_lib);
+go4->WaitAnalysis(300);
+
+// configuration of analysis
+go4->AnalysisAutoSave("Go4AutoSave.root", 500, 5, kTRUE, kFALSE);
+go4->AnalysisConfigName("Go4AnalysisPrefs.root");
+
+// step Analysis
+go4->ConfigStep("Analysis", kTRUE, kTRUE, kFALSE);
+go4->StepMbsStreamSource("Analysis", "localhost:6789", 1);
+go4->StepFileStore("Analysis", "NoOutputDefined", kTRUE, 32000, 99, 5, 10000);
+
+go4->SubmitAnalysisConfig(20);
+
+go4->SetAnalysisConfigMode(-1);
+go4->SetAnalysisTerminalMode(1);
+
+go4->StartAnalysis();
+
+// in some analysis one requires to wait several seconds before new histograms appears
+// go4->Wait(1);
+go4->RefreshNamesList();
+
--- /dev/null
+#include <stdio.h>
+#include <iostream>
+#include <fstream>
+#include <map>
+
+#include "TTree.h"
+#include "TFile.h"
+#include "TSystem.h"
+#include "TString.h"
+#include "TH1.h"
+#include "TH2.h"
+#include "TCanvas.h"
+#include "TGo4AnalysisObjectManager.h"
+
+
+#include "base/EventProc.h"
+#include "base/Event.h"
+#include "hadaq/TdcSubEvent.h"
+
+#define CHANNELS 33
+#define REFCHAN 0
+// #define REFCHAN_B 0
+
+#define VERBOSE 0
+#define TAKE_FIRST_HIT 1
+
+
+
+// Muentz-Torte
+#define t1_L -400 // EE
+#define t1_R 400 // EE
+#define tot_L -10 // EE
+#define tot_R 1000 // EE
+
+#define ref_channel_offset -75 //ns fine measured ref channel relative to coarse measured cts trigger channel
+//#define ref_channel_offset 0 //ns fine measured ref channel relative to coarse measured cts trigger channel
+
+// in the first iteration, scanning through data in the coincidence window, rejecting hits (fuzzy edges)
+
+//#define spike_rejection 90 //ns for ASD8 0x72 (25000) with LASER
+// #define spike_rejection 90 //ns for PASTTREC pt10 // for t1 calibration
+//#define spike_rejection 60 //ns for PASTTREC pt10
+// #define spike_rejection 45 //ns for PASTTREC with all the nice filters
+// #define spike_rejection 90 //ns for PASTTREC pt15
+//#define spike_rejection 100 //ns for PASTTREC pt20
+// #define spike_rejection 30 //ns for ASD8 0xA9
+// #define spike_rejection 60 //ns for ASD8 0x72
+// #define spike_rejection 75 //ns for ASD8 0x52
+//#define spike_rejection 47 //ns for ASD8 thr 37000 with LASER
+// #define spike_rejection 90 //ns for PASTTREC pt20 with LASER
+//#define spike_rejection 90 //ns for PASTTREC pt20 with Fe55
+
+#define spike_rejection 30
+#define spike_rejection_refchan 10
+
+#define individual_spike_rejection 0
+
+//#define ref_spike_rejection 100
+
+
+//#define t1_accept_L (-250 + ref_channel_offset) //ns // GSI Dlab
+//#define t1_accept_L (-1000000 + ref_channel_offset) //ns // HZDR fe55
+#define t1_accept_L (-2000 + ref_channel_offset) //ns // EE
+//#define t1_accept_L (-150 + ref_channel_offset) //ns // Muentz-Torte
+//#define t1_accept_R (100 + ref_channel_offset)//ns // GSI Dlab
+//#define t1_accept_R (1000000 + ref_channel_offset)//ns // HZDR fe55
+#define t1_accept_R (2000 + ref_channel_offset)//ns // EE
+// #define t1_accept_R (-130 + ref_channel_offset)//ns // Muentz-Torte
+// #define t1_accept_R (-90 + ref_channel_offset)//ns // ASD8 with thr 0x52
+
+#define fish_proj_cut 20
+
+
+
+// real cuts on selected data
+
+#define max_tot 1000000 // Muentz-Torte
+#define t1_cut_L -2000
+#define t1_cut_R 2000
+
+
+// #define coincidence_rejection 7
+#define accept_hits_per_layer 20
+
+#define enable_coincidence_rejection 0
+
+#define enable_single_hits 0
+#define enable_one_hit_per_layer 1
+#define enable_two_to_one_hits 0
+
+
+
+// TFile* tree_out;
+std::map<std::string,int> trig_no;
+std::map<std::string,TTree*> data_tree;
+Bool_t write_tree = false;
+
+
+
+Bool_t file_exists(TString fname){
+
+ fstream src_file(fname.Data());
+ return src_file.good();
+}
+
+TString from_env(TString env_var,TString default_val){
+ if(gSystem->Getenv(env_var)){
+ return gSystem->Getenv(env_var);
+ }
+ return default_val;
+}
+
+
+
+class SecondProc : public base::EventProc {
+ protected:
+
+ std::string fTdcId; //!< tdc id where channels will be selected
+
+ double fHits[8]; //!< 8 channel, abstract hits
+
+ base::H1handle hNumHits; //!< histogram with hits number
+// base::H2handle h2D;
+
+// base::H1handle totCh1; //!< histogram with hits number
+// base::H1handle totCh2; //!< histogram with hits number
+
+
+ base::H1handle tot_h[CHANNELS];
+ base::H1handle tot_untrig_h[CHANNELS];
+ base::H1handle t1_h[CHANNELS];
+ base::H1handle potato_h[CHANNELS];
+ base::H1handle meta_potato_h;
+ base::H1handle meta_t1_h;
+ base::H1handle meta_tot_h;
+ base::H1handle meta_tot_2d;
+ base::H1handle meta_t1_2d;
+ base::H1handle coinc_matrix;
+// base::H1handle meta_fish;
+// base::H1handle meta_fish_proj;
+// base::H1handle fishes[FISHES];
+// base::H1handle fish_proj[FISHES];
+ base::H1handle efficiency_h;
+ base::H1handle ref_counts_h;
+ base::H1handle dut_counts_h;
+
+
+ int entry_chan;
+ int entry_ref_chan;
+ double entry_t1;
+ double entry_tot;
+
+
+
+
+
+// int evt_no;
+
+ public:
+ SecondProc(const char* procname, const char* _tdcid) :
+ base::EventProc(procname),
+ fTdcId(_tdcid),
+ hNumHits(0)
+ {
+ printf("Create %s for %s\n", GetName(), fTdcId.c_str());
+
+ hNumHits = MakeH1("FineAll","Fine all", 1020, 0, 1020, "fine");
+// h2D = MakeH2("h2d","title", 100, -20, 20, 100, -20,20,"x;y");
+// totCh1 = MakeH1("totCh1","totCh1", 20000, -200, 200, "ns");
+// totCh2 = MakeH1("totCh2","totCh2", 20000, -200, 200, "ns");
+
+
+ if(from_env("tree_out","false") == "true"){
+ write_tree = true;
+ }
+
+ trig_no[fTdcId] = 0;
+ data_tree[fTdcId] = new TTree((TString) fTdcId,"data recorded");
+ data_tree[fTdcId]->Branch("trig_no",&trig_no[fTdcId]);
+ data_tree[fTdcId]->Branch("t1",&entry_t1);
+ data_tree[fTdcId]->Branch("tot",&entry_tot);
+ data_tree[fTdcId]->Branch("chan",&entry_chan);
+ data_tree[fTdcId]->Branch("ref_chan",&entry_ref_chan);
+
+
+ for( unsigned i=0; i<CHANNELS; i++ ) {
+ char chno[16];
+ sprintf(chno,"Ch%02d_t1",i);
+ t1_h[i] = MakeH1(chno,chno, 2000, t1_L, t1_R, "ns");
+ sprintf(chno,"Ch%02d_tot",i);
+ tot_h[i] = MakeH1(chno,chno, 4000, tot_L, tot_R, "ns");
+ sprintf(chno,"Ch%02d_tot_untrig",i);
+ tot_untrig_h[i] = MakeH1(chno,chno, 4000, tot_L, tot_R, "ns");
+ sprintf(chno,"Ch%02d_potato",i);
+ potato_h[i] = MakeH2(chno,chno,500,t1_L,t1_R,500, tot_L, tot_R, "t1 (ns);tot (ns)");
+ }
+
+ meta_t1_h = MakeH1("meta_t1","meta_t1", 2000, t1_L, t1_R, "ns");
+ meta_t1_2d = MakeH2("meta_t1_2d","meta_t1_2d", 2000, t1_L, t1_R,CHANNELS-1,0.5,CHANNELS-0.5, "ns;channel#");
+ meta_tot_h = MakeH1("meta_tot","meta_tot", 4000, tot_L, tot_R, "ns");
+ meta_tot_2d = MakeH2("meta_tot_2d","meta_tot_2d", 2000, tot_L, tot_R,CHANNELS-1,0.5,CHANNELS-0.5, "ns;channel#");
+ meta_potato_h = MakeH2("meta_potato","meta_potato",500,t1_L,t1_R,500, tot_L, tot_R, "t1 (ns);tot (ns)");
+
+// evt_no = 0;
+
+// ref_counts_h = MakeH1("ref_counts","ref_counts", CHANNELS -1, 0.5, CHANNELS-0.5, "channel #");
+// dut_counts_h = MakeH1("dut_counts","dut_counts", CHANNELS -1, 0.5, CHANNELS-0.5, "channel #");
+ efficiency_h = MakeH1("efficiency","efficiency", CHANNELS -1, 0.5, CHANNELS-0.5, "channel #;kind:F");
+ ((TH1F*) efficiency_h)->SetDrawOption("P0");
+ ((TH1F*) efficiency_h)->SetMarkerStyle(22);
+ ((TH1F*) efficiency_h)->GetXaxis()->SetNdivisions(55);
+
+ coinc_matrix = MakeH2("coinc_matrix","coinc_matrix",12,-2.5,9.5,10,15-0.5,24+0.5, "channels 0-7;channels 16-23");
+ //meta_fish = MakeH2("meta_fish","meta_fish",250,-300,200,200,-100,100, "T_A+T_B;T_B-T_A");
+
+ //meta_fish_proj = MakeH1("meta_fish_proj","meta_fish_proj",250,-300,200, "T_A+T_B;counts");
+
+
+
+ // enable storing already in constructor
+ SetStoreEnabled();
+ }
+
+ virtual void UserPostLoop(void) {
+
+ static Int_t was_called_before = 0;
+
+ cout << "--- User Post Loop " << fTdcId << endl;
+// TFile* tree_out = new TFile( Form("tree_out_%s.root",fTdcId.c_str()) ,"RECREATE");
+
+ if(from_env("tree_out","false") == "true"){
+
+ cout << "write tree_out.root" << endl;
+ TFile* tree_out;
+
+
+ if(was_called_before){
+ tree_out = new TFile("tree_out.root","UPDATE");
+ } else {
+ tree_out = new TFile("tree_out.root","RECREATE");
+ }
+ tree_out->cd();
+ data_tree[fTdcId]->Write();
+ tree_out->Write();
+ tree_out->Close();
+ delete tree_out;
+ }
+ was_called_before ++;
+ }
+
+
+ virtual void CreateBranch(TTree* t)
+ {
+ // only called when tree is created in first.C
+ // one can ignore
+ t->Branch(GetName(), fHits, "hits[8]/D");
+ }
+
+ virtual bool Process(base::Event* ev)
+ {
+// printf("### DEBUG ###\n");
+ for (unsigned n=0;n<8;n++) fHits[n] = 0.;
+
+ hadaq::TdcSubEvent* sub =
+ dynamic_cast<hadaq::TdcSubEvent*> (ev->GetSubEvent(fTdcId));
+
+ if(VERBOSE) cout<< "tdc: " << fTdcId << " evt no: " << trig_no[fTdcId] << endl;
+ if (sub==0) return false;
+
+// printf("%s process sub %d %s\n", GetName(), sub->Size(), fTdcId.c_str());
+
+
+ static float effective_spike_rejection = from_env("spike_rejection", TString::Itoa(spike_rejection,10) ).Atof();
+
+
+// static int ref_counts[CHANNELS];
+// static int dut_counts[CHANNELS];
+// static bool is_dut[CHANNELS];
+
+
+ // this is only run once --
+ static bool is_initialized=false;
+ if(not(is_initialized)){
+ for( int i = 0; i<31; i++){
+// ref_counts[i] = 0;
+// dut_counts[i] = 0;
+// is_dut[i] = false;
+// if((overlaps[i][0] >= 0) && (overlaps[i][1] >= 0)){
+// is_dut[i] = true;
+// }
+ }
+
+
+
+
+ is_initialized = true;
+ }
+ // ------
+
+ double num(0), ch0tm(0), ch1tm(0), ch2tm(0), ch3tm(0);
+ double t1_candidate[CHANNELS];
+ double t2_candidate[CHANNELS];
+ double t1[CHANNELS];
+ double t2[CHANNELS];
+ bool got_rising[CHANNELS];
+ bool got_falling[CHANNELS];
+ bool got_real_hit[CHANNELS];
+ double tot[CHANNELS];
+ for (unsigned i=0; i<CHANNELS; i++) {
+ got_rising[i] = false;
+ got_falling[i] = false;
+ got_real_hit[i] = false;
+ }
+
+
+ for (unsigned cnt=0;cnt<sub->Size();cnt++) {
+ const hadaq::TdcMessageExt& ext = sub->msg(cnt);
+
+ unsigned chid = ( ext.msg().getHitChannel() );
+ bool rising = ext.msg().isHitRisingEdge(); // use this line for rising edge first/positive pulses
+
+ if (chid==0) {
+ ch0tm = ext.GetGlobalTime();
+ got_real_hit[chid] = true;
+ t1[chid] = 0;
+ tot[chid] = 100e-9;
+ continue;
+
+ }
+
+
+ // full time
+ double tm = ext.GetGlobalTime();
+ if((chid) >= CHANNELS) {continue;} // channel out of range of analysis
+ if(rising){
+
+
+ if( !(TAKE_FIRST_HIT && got_real_hit[chid]) ){ // block subsequent hits if TAKE_FIRST_HIT setting is active
+ if((( ((tm)*1e9) > t1_accept_L) && (((tm)*1e9) < t1_accept_R )) ) { // this condition sets another coincidence window, except for REFCHAN_A
+ got_rising[chid] = true;
+ got_falling[chid] = false;
+ t1_candidate[chid] = tm;
+ }
+ }
+ }else{ // if falling edge
+// printf("got falling edge, ch %d\n",(chid));
+ if(got_rising[chid]){
+ if(not(got_falling[chid])){
+ got_falling[chid] = true;
+ t2_candidate[chid] = tm;
+ Double_t candidate_tot_ns = (t2_candidate[chid] - t1_candidate[chid])*1e9;
+
+ if( candidate_tot_ns > effective_spike_rejection || (chid==REFCHAN || candidate_tot_ns > spike_rejection_refchan) ){
+ // hit is long enough not to be rejected
+ t1[chid] = t1_candidate[chid];
+ t2[chid] = t2_candidate[chid];
+ tot[chid] = t2[chid] - t1[chid];
+ got_real_hit[chid] = true;
+
+ // fill untriggered tot histogram
+ FillH1(tot_untrig_h[chid],tot[chid]*1e9);
+ }
+// printf("got hit, ch %d, tot = %f ns\n",(chid), tot[chid]*1e9);
+ }
+ }
+ }
+
+ }
+
+
+
+ for( unsigned i=0; i<CHANNELS; i++ ) {
+ if(got_real_hit[i]){
+
+// if(got_real_hit[REFCHAN_A] || got_real_hit[REFCHAN_B] || REFCHAN_A == -1 || REFCHAN_B == -1){ // t1 information only makes sense if you have
+ // a hit in the reference channel
+ double t1_vs_ref = (t1[i] -t1[REFCHAN])*1e9 ;
+ if( (t1_vs_ref > t1_cut_L) && (t1_vs_ref < t1_cut_R) && (tot[i]*1e9 < max_tot) ) {
+
+ // fill histograms
+ FillH1(tot_h[i],tot[i]*1e9);
+ FillH2(potato_h[i],t1_vs_ref ,tot[i]*1e9);
+ FillH1(t1_h[i],t1_vs_ref ); // without cuts
+// if(t1_vs_ref < -200 && tot[i]*1e9 > 0 ) FillH1(t1_h[i],t1_vs_ref ); // with noise rejecting cuts
+ // if( tot[i]*1e9 > 50 ) FillH1(t1_h[i],t1_vs_ref ); // with noise rejecting cuts
+
+
+ if( i != 0 ) {
+ FillH2(meta_potato_h,t1_vs_ref,tot[i]*1e9);
+ FillH1(meta_tot_h,tot[i]*1e9);
+ FillH1(meta_t1_h,t1_vs_ref );
+ FillH2(meta_tot_2d,tot[i]*1e9,i);
+ FillH2(meta_t1_2d,t1_vs_ref,i);
+ entry_chan = i;
+ entry_t1 = t1_vs_ref;
+ entry_tot = tot[i]*1e9;
+ if(write_tree){
+ data_tree[fTdcId]->Fill();
+ }
+ }
+
+ // efficiency estimation ... this cell, cell #i, is a reference detector
+// ref_counts[i]++; // count up reference counts
+// FillH1(counts_h,i-0.5);
+ }
+ }
+ }
+
+
+
+ for (int i = 1 ; i<CHANNELS; i++) {
+ // ((TH1F*) efficiency_h)->SetBinContent(i,((float) (((TH1F*) t1_h[i])->GetEntries()) )/((float) (((TH1F*) t1_h[0])->GetEntries())));
+ ((TH1F*) efficiency_h)->SetBinContent(i,((float) (((TH1F*) t1_h[i])->Integral()) )/ 600. ); // fixed numer of pulses sent for each channel
+ // ((TH1F*) efficiency_h)->SetBinContent(i,((float) (((TH1F*) t1_h[i])->Integral()) )/((float) (((TH1F*) tot_h[i])->Integral()))); ; // normalize by number of signals in same channel without couts, as for almost each trigger a noise signal is measured
+ }
+
+
+
+
+// if(got_real_hit[0]){
+// FillH1(totCh1,tot[0]*1e9);
+// }
+// if(got_real_hit[1]){
+// FillH1(totCh2,tot[1]*1e9);ref_counts[i]
+// }
+
+// FillH1(hNumHits, num);
+
+
+// draw_and_save((TH2F*) meta_fish, "meta_fish","./","colz");
+
+// tree_out->cd();
+// data_tree[fTdcId]->Write();
+ trig_no[fTdcId]++;
+
+ return true;
+ }
+
+
+};
+
+
+void second()
+{
+ //hadaq::TdcProcessor::SetDefaults(700);
+// tree_out = new TFile("./tree_out.root","RECREATE");
+// new SecondProc("Sec_1130", "TDC_1130");
+// new SecondProc("Sec_0352", "TDC_0353");
+ new SecondProc("Sec_0350", "TDC_0350");
+ new SecondProc("Sec_0353", "TDC_0353");
+// tree_out->Write();
+// tree_out->Close();
+}
+
--- /dev/null
+#!/bin/bash
+
+echo "container started"
+
+echo "create main tmux session"
+
+echo "run /conf/conf.sh"
+. /conf/conf.sh
+
+cd /workdir
+tmux new -d -s main
+
+
+
+tmux link-window -s cts_gui:cts_gui -t main
+tmux link-window -s vnc:vnc -t main
+
+
+tmux new-window -t main -n "dabc" "dabc_exe TdcEventBuilder_noHLD.xml;/bin/bash"
+
+
+#tmux new-window -t main -n "go4" "rm *.root; go4 0350_meta.hotstart;/bin/bash"
+tmux new-window -t main -n "go4_ana" "rm *.root; tree_out=false go4analysis -stream localhost:6790 -http localhost:8080;/bin/bash"
+
+# tmux new-window -t main -n "htop" "htop;/bin/bash"
+tmux new-window -t main -n "info" "cat /conf/conf_log.txt; cat info.txt; /bin/bash"
+tmux new-window -t main -n "PT_ctrl" "cd /workdir/pasttrec_ctrl; /bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "new" "/bin/bash"
+tmux new-window -t main -n "x11_apps" "lxpanel& sleep 10; firefox localhost:8080& /bin/bash"
+tmux select-window -t main:info
+
+
+tmux a -t main
+
+
+
+
+echo "drop user to shell"
+/bin/bash
+
+echo "terminate container"