From ee7252413ce6d26947f4c6a726cb6caeee10f23b Mon Sep 17 00:00:00 2001 From: "hadaq@CountingHouse" Date: Tue, 14 May 2013 16:52:34 +0200 Subject: [PATCH] added files for Hmon --- hmon/HPlot.pm | 160 +++ hmon/Hmon.pm | 339 +++++++ hmon/Perl2Epics.pm | 156 +++ hmon/QA.pm | 262 +++++ hmon/background.png | Bin 0 -> 1809 bytes hmon/doc.cgi | 92 ++ hmon/editlogfiles.pl | 75 ++ hmon/files | 1 + hmon/get.cgi | 71 ++ hmon/getpic.cgi | 16 + hmon/getqa.cgi | 57 ++ hmon/hmon_busy.pl | 18 + hmon/hmon_busyhist.pl | 16 + hmon/hmon_datarate.pl | 21 + hmon/hmon_eb_rate.pl | 118 +++ hmon/hmon_endpoints.pl | 283 ++++++ hmon/hmon_eventrate.pl | 41 + hmon/hmon_filllevel.pl | 52 + hmon/hmon_gberate.pl | 18 + hmon/hmon_hadplot.sh | 1455 +++++++++++++++++++++++++++ hmon/hmon_hadplotnew.sh | 1449 ++++++++++++++++++++++++++ hmon/hmon_logerrors.pl | 150 +++ hmon/hmon_logmissingmbo.pl | 74 ++ hmon/hmon_mdc_busy.pl | 80 ++ hmon/hmon_mdc_invaliddatamode.pl | 42 + hmon/hmon_mdc_linkerr.pl | 53 + hmon/hmon_mdc_plotmissingboards.pl | 54 + hmon/hmon_mdc_rate.pl | 69 ++ hmon/hmon_mdc_ratecheck.pl | 73 ++ hmon/hmon_mdc_retr.pl | 110 ++ hmon/hmon_mdc_temp.pl | 76 ++ hmon/hmon_mdc_tokenmiss.pl | 77 ++ hmon/hmon_mdc_voltage.pl | 68 ++ hmon/hmon_mdchv_plottemplate.pl | 43 + hmon/hmon_muxhist.pl | 76 ++ hmon/hmon_muxhist_ratio.pl | 105 ++ hmon/hmon_onlineqa.pl | 50 + hmon/hmon_permanent_tail | Bin 0 -> 64568 bytes hmon/hmon_rate2.pl | 107 ++ hmon/hmon_readoutstuck.pl | 71 ++ hmon/hmon_rich_apvs.pl | 128 +++ hmon/hmon_rsync | Bin 0 -> 461368 bytes hmon/hmon_shower.pl | 129 +++ hmon/hmon_spill.pl | 130 +++ hmon/hmon_ssh | Bin 0 -> 453328 bytes hmon/hmon_starthist.pl | 107 ++ hmon/hmon_startmon.pl | 496 +++++++++ hmon/hmon_tail | Bin 0 -> 64568 bytes hmon/hmon_timeout.pl | 74 ++ hmon/hmon_trbtdc.pl | 68 ++ hmon/hmon_trgerr.pl | 119 +++ hmon/hmon_trgsource.pl | 264 +++++ hmon/hmon_vetohist.pl | 45 + hmon/hplottest.pl | 29 + hmon/icingadaemon.pl | 61 ++ hmon/icingadaemon.sh | 3 + hmon/index.cgi | 129 +++ hmon/indexstyles.css | 178 ++++ hmon/mdc.png | Bin 0 -> 200 bytes hmon/monitor.cgi | 170 ++++ hmon/monitor2.cgi | 166 +++ hmon/monitorold.cgi | 131 +++ hmon/permanent/HPlot.pm | 1 + hmon/permanent/Hmon.pm | 1 + hmon/permanent/Perl2Epics.pm | 1 + hmon/permanent/QA.pm | 1 + hmon/permanent/hmon_archiver.pl | 93 ++ hmon/permanent/hmon_archiveveto.pl | 17 + hmon/permanent/hmon_cpu.pl | 114 +++ hmon/permanent/hmon_eb_run.pl | 238 +++++ hmon/permanent/hmon_ebdiskfill.pl | 80 ++ hmon/permanent/hmon_eberrbits.pl | 147 +++ hmon/permanent/hmon_hldlastfiles.pl | 31 + hmon/permanent/hmon_hub.pl | 741 ++++++++++++++ hmon/permanent/hmon_icinga.pl | 208 ++++ hmon/permanent/hmon_logfile.pl | 91 ++ hmon/permanent/hmon_magnet.pl | 224 +++++ hmon/permanent/hmon_mdchv.pl | 124 +++ hmon/permanent/hmon_mdclv.pl | 43 + hmon/permanent/hmon_mdcpressure.pl | 134 +++ hmon/permanent/hmon_permanent_tail | 1 + hmon/permanent/hmon_qa.pl | 100 ++ hmon/permanent/hmon_qaplots.pl | 92 ++ hmon/permanent/hmon_richhv.pl | 141 +++ hmon/permanent/hmon_spill.pl | 86 ++ hmon/permanent/hmon_time.pl | 24 + hmon/permanent/hmon_trbnet.pl | 69 ++ hmon/permanent/hmon_vertexplots.pl | 64 ++ hmon/speakdaemon.pl | 46 + hmon/start.sh | 89 ++ hmon/stop.sh | 14 + hmon/stopall.sh | 25 + hmon/styles.css | 456 +++++++++ hmon/trbcmd.cgi | 66 ++ hmon/vertex.cgi | 73 ++ 95 files changed, 12140 insertions(+) create mode 100644 hmon/HPlot.pm create mode 100644 hmon/Hmon.pm create mode 100644 hmon/Perl2Epics.pm create mode 100644 hmon/QA.pm create mode 100755 hmon/background.png create mode 100755 hmon/doc.cgi create mode 100755 hmon/editlogfiles.pl create mode 120000 hmon/files create mode 100755 hmon/get.cgi create mode 100755 hmon/getpic.cgi create mode 100755 hmon/getqa.cgi create mode 100755 hmon/hmon_busy.pl create mode 100755 hmon/hmon_busyhist.pl create mode 100755 hmon/hmon_datarate.pl create mode 100755 hmon/hmon_eb_rate.pl create mode 100755 hmon/hmon_endpoints.pl create mode 100755 hmon/hmon_eventrate.pl create mode 100755 hmon/hmon_filllevel.pl create mode 100755 hmon/hmon_gberate.pl create mode 100755 hmon/hmon_hadplot.sh create mode 100755 hmon/hmon_hadplotnew.sh create mode 100755 hmon/hmon_logerrors.pl create mode 100755 hmon/hmon_logmissingmbo.pl create mode 100755 hmon/hmon_mdc_busy.pl create mode 100755 hmon/hmon_mdc_invaliddatamode.pl create mode 100755 hmon/hmon_mdc_linkerr.pl create mode 100755 hmon/hmon_mdc_plotmissingboards.pl create mode 100755 hmon/hmon_mdc_rate.pl create mode 100755 hmon/hmon_mdc_ratecheck.pl create mode 100755 hmon/hmon_mdc_retr.pl create mode 100755 hmon/hmon_mdc_temp.pl create mode 100755 hmon/hmon_mdc_tokenmiss.pl create mode 100755 hmon/hmon_mdc_voltage.pl create mode 100755 hmon/hmon_mdchv_plottemplate.pl create mode 100755 hmon/hmon_muxhist.pl create mode 100755 hmon/hmon_muxhist_ratio.pl create mode 100755 hmon/hmon_onlineqa.pl create mode 100755 hmon/hmon_permanent_tail create mode 100755 hmon/hmon_rate2.pl create mode 100755 hmon/hmon_readoutstuck.pl create mode 100755 hmon/hmon_rich_apvs.pl create mode 100755 hmon/hmon_rsync create mode 100755 hmon/hmon_shower.pl create mode 100755 hmon/hmon_spill.pl create mode 100755 hmon/hmon_ssh create mode 100755 hmon/hmon_starthist.pl create mode 100755 hmon/hmon_startmon.pl create mode 100755 hmon/hmon_tail create mode 100755 hmon/hmon_timeout.pl create mode 100755 hmon/hmon_trbtdc.pl create mode 100755 hmon/hmon_trgerr.pl create mode 100755 hmon/hmon_trgsource.pl create mode 100755 hmon/hmon_vetohist.pl create mode 100755 hmon/hplottest.pl create mode 100755 hmon/icingadaemon.pl create mode 100755 hmon/icingadaemon.sh create mode 100755 hmon/index.cgi create mode 100644 hmon/indexstyles.css create mode 100644 hmon/mdc.png create mode 100755 hmon/monitor.cgi create mode 100755 hmon/monitor2.cgi create mode 100755 hmon/monitorold.cgi create mode 120000 hmon/permanent/HPlot.pm create mode 120000 hmon/permanent/Hmon.pm create mode 120000 hmon/permanent/Perl2Epics.pm create mode 120000 hmon/permanent/QA.pm create mode 100644 hmon/permanent/hmon_archiver.pl create mode 100644 hmon/permanent/hmon_archiveveto.pl create mode 100755 hmon/permanent/hmon_cpu.pl create mode 100755 hmon/permanent/hmon_eb_run.pl create mode 100755 hmon/permanent/hmon_ebdiskfill.pl create mode 100755 hmon/permanent/hmon_eberrbits.pl create mode 100755 hmon/permanent/hmon_hldlastfiles.pl create mode 100755 hmon/permanent/hmon_hub.pl create mode 100755 hmon/permanent/hmon_icinga.pl create mode 100755 hmon/permanent/hmon_logfile.pl create mode 100644 hmon/permanent/hmon_magnet.pl create mode 100644 hmon/permanent/hmon_mdchv.pl create mode 100755 hmon/permanent/hmon_mdclv.pl create mode 100755 hmon/permanent/hmon_mdcpressure.pl create mode 120000 hmon/permanent/hmon_permanent_tail create mode 100755 hmon/permanent/hmon_qa.pl create mode 100755 hmon/permanent/hmon_qaplots.pl create mode 100755 hmon/permanent/hmon_richhv.pl create mode 100755 hmon/permanent/hmon_spill.pl create mode 100755 hmon/permanent/hmon_time.pl create mode 100755 hmon/permanent/hmon_trbnet.pl create mode 100755 hmon/permanent/hmon_vertexplots.pl create mode 100755 hmon/speakdaemon.pl create mode 100755 hmon/start.sh create mode 100755 hmon/stop.sh create mode 100755 hmon/stopall.sh create mode 100644 hmon/styles.css create mode 100755 hmon/trbcmd.cgi create mode 100644 hmon/vertex.cgi diff --git a/hmon/HPlot.pm b/hmon/HPlot.pm new file mode 100644 index 0000000..0b4798e --- /dev/null +++ b/hmon/HPlot.pm @@ -0,0 +1,160 @@ +package HPlot; +use POSIX qw/floor ceil strftime/; +use Data::Dumper; +use warnings; +use strict; +use FileHandle; + +my $p; + +use constant {TYPE_HISTORY => 1}; + +use constant {OUT_PNG => 1, + OUT_SVG => 2, #n/a + OUT_SCREEN => 3}; #n/a + +my @color= ('#2222dd','#dd2222','#22dd22','#dd8822','#dd22dd','#22dddd'); + +sub plot_write { + my ($file,$str,$no) = @_; + return unless $str; + if($no || 0) { + print $file $str; + } + else { + print $file $str."\n"; + } + } + + +sub makeTimeString{ + return strftime("set label 100 \"%H:%M:%S\" at screen 0.02,0.02 left tc rgb \"#000044\" font \"monospace,8\"\n", localtime()) + } + + +sub PlotInit { + my ($c) = @_; + + my $name = $c->{name}; + + my $fn = "gnuplot"; + my $fh = new FileHandle ("|$fn") or die "error: no gnuplot"; + $fh->autoflush(1); + + + + $p->{$name} = $c; + $p->{$name}->{fh} = $fh; + $p->{$name}->{run} = 0; + $p->{$name}->{sizex} = $p->{$name}->{sizex} || 600 ; + $p->{$name}->{sizey} = $p->{$name}->{sizey} || 400 ; + $p->{$name}->{file} = $p->{$name}->{file} || "dummy" ; + $p->{$name}->{curves} = $p->{$name}->{curves} || 1 ; + $p->{$name}->{xscale} = $p->{$name}->{xscale} || 1; + $p->{$name}->{type} or die "No plot type specified"; + $p->{$name}->{output} or die "No destination specified"; + + @color = @{$p->{$name}->{colors}} if($p->{$name}->{colors}); + + foreach my $i (0..($c->{entries}-1)) { + for my $j (0..($c->{curves}-1)) { + push(@{$p->{$name}->{value}->[$j]},0) ; + } + } + + if($p->{$name}->{output} == OUT_PNG) { + $p->{$name}->{file} or die "No filename specified"; + plot_write($fh,"set term png size ".$p->{$name}->{sizex}.",".$p->{$name}->{sizey}." font \"monospace,8\""); + plot_write($fh,"set out \"".$p->{$name}->{file}.".png\""); + } + elsif($p->{$name}->{output} == OUT_SCREEN) { + plot_write($fh,"set term x11 size ".$p->{$name}->{sizex}.",".$p->{$name}->{sizey}); + } + else { + die "Output mode not supported yet"; + } + + if ($p->{$name}->{nokey}) { + plot_write($fh,"unset key"); + } + + + plot_write($fh,"set xlabel \"".$p->{$name}->{xlabel}."\"") if $p->{$name}->{xlabel}; + plot_write($fh,"set ylabel \"".$p->{$name}->{ylabel}."\"") if $p->{$name}->{ylabel}; + + if(defined $p->{$name}->{ymin} && defined $p->{$name}->{ymax}) { + plot_write($fh,"set yrange [".$p->{$name}->{ymin}.":".$p->{$name}->{ymax}."]"); + } + elsif(defined $p->{$name}->{ymax}) { + plot_write($fh,"set yrange [:".$p->{$name}->{ymax}."]"); + } + elsif(defined $p->{$name}->{ymin}) { + plot_write($fh,"set yrange [".$p->{$name}->{ymin}.":]"); + } + + if($p->{$name}->{type} == TYPE_HISTORY) { + if($p->{$name}->{fill}) { + plot_write($fh,"set style fill solid 1.00"); + } + else { + plot_write($fh,"set style fill solid 0"); + } + plot_write($fh,"set boxwidth 2 absolute"); + plot_write($fh,"set autoscale fix"); + plot_write($fh,"set xtics autofreq"); #$p->{$name}->{entries} + plot_write($fh,"set grid"); +# plot_write($fh,"set style fill solid 1.0"); + plot_write($fh,"plot ",1); + for(my $j=0; $j<$p->{$name}->{curves};$j++) { + if($p->{$name}->{fill}) { + plot_write($fh,"'-' using 1:2 with filledcurves x1 lt rgb \"$color[$j]\" title \"".($p->{$name}->{titles}->[$j] || "$j")."\" ",1); + } + elsif($p->{$name}->{dots}) { + plot_write($fh,"'-' using 1:2 with points pointsize 0.6 pointtype 2 lt rgb \"$color[$j]\" title \"".($p->{$name}->{titles}->[$j] || "$j")."\" ",1); + } + else { + plot_write($fh,"'-' using 1:2 with lines lt rgb \"$color[$j]\" title \"".($p->{$name}->{titles}->[$j] || "$j")."\" ",1); + } + plot_write($fh,', ',1) unless ($j+1==$p->{$name}->{curves}); + } + plot_write($fh," "); + } + else { + die "Plot type not supported"; + } + + } + + +sub PlotDraw { + my($name) = @_; + if($p->{$name}->{run}>=1) { + plot_write($p->{$name}->{fh},"set out \"".$p->{$name}->{file}.".png\""); + plot_write($p->{$name}->{fh},makeTimeString()); + plot_write($p->{$name}->{fh},"replot"); + } + for(my $j=0; $j<$p->{$name}->{curves}; $j++) { + for(my $i=0; $i< scalar @{$p->{$name}->{value}->[$j]}; $i++) { + plot_write($p->{$name}->{fh},(($i-$p->{$name}->{entries})/$p->{$name}->{xscale})." ".$p->{$name}->{value}->[$j]->[$i]) unless $p->{$name}->{countup}; + plot_write($p->{$name}->{fh},($i/$p->{$name}->{xscale})." ".$p->{$name}->{value}->[$j]->[$i]) if $p->{$name}->{countup}; +# print $j." ".$i." ".$p->{$name}->{entries}." ".$p->{$name}->{xscale}." ".$p->{$name}->{value}->[$j]->[$i]."\n"; + } + plot_write($p->{$name}->{fh},"e"); + } + $p->{$name}->{run}++; + } + + +sub PlotAdd { + my($name,$value,$curve) = @_; + $curve = 0 unless $curve; + + if($p->{$name}->{type} == TYPE_HISTORY) { + push(@{$p->{$name}->{value}->[$curve]},$value||0); + shift(@{$p->{$name}->{value}->[$curve]}); + } + + } + + +1; \ No newline at end of file diff --git a/hmon/Hmon.pm b/hmon/Hmon.pm new file mode 100644 index 0000000..eeafa32 --- /dev/null +++ b/hmon/Hmon.pm @@ -0,0 +1,339 @@ +package Hmon; +use POSIX qw/floor ceil strftime/; +use Data::Dumper; +use warnings; +use strict; + +use constant HMONDIR => "/home/hadaq/trbsoft/daq/tools/hmon/"; + +our %hublist; +our $r_hublist = \%hublist; + +print STDERR "Script started at ".strftime("%d.%m.%y %H:%M:%S", localtime()).".\n"; + +############################################################################### +# Make Title & Footer +############################################################################### +sub MakeTitle { + my ($width,$height,$title,$time,$error) = @_; + my $str; + $time = 1 unless defined $time; + $str = "
\n"; + if ($time) { + $str .= "
".strftime("%H:%M:%S", localtime())."
\n"; + } + if (defined $error && $error ne "") { + $str .= "
$error
\n"; + } + $str .= "

$title

"; + return $str; +} + +sub MakeFooter { + my $str; + $str = "
\n"; + return $str; +} + +sub AddStyle { + return ""; +} + +############################################################################### +# Local Logfile +############################################################################### +sub OpenLogfile { + return 0; +# my $fh; +# open($fh, ">>",HMONDIR."/files/locallog"); +# $fh->autoflush(1); +# return $fh; +} + +sub WriteLog { + return 0; +# my ($fh,$title,$format,@vars) = @_; +# # $format =~ s/\s/\t/g; +# if ($fh == 0) { +# $fh = OpenLogfile(); +# } +# my $tmp = sprintf("%s\t%i\t".$format."\n",$title,time(),@vars); +# print $fh $tmp; +} + + +############################################ +# Write to File +############################################ +sub WriteFile { + my ($name,$str) = @_; + open FH,"> ".Hmon::HMONDIR."files/$name.htt"; + print FH $str; + close FH; +} + +############################################ +# Nettrace DB +############################################ +sub TraceDBLoad { + open FILE, "; + close FILE; +} + +sub TraceDBGet { + my ($addr, $port) = @_; + if (defined $r_hublist->{$addr}->{$port}) { + return $r_hublist->{$addr}->{$port}; + } + else { + return 0; + } +} + + +############################################################################### +# Voice Synthesis +############################################################################### +my $speaklog; +sub Speak { + my ($id,$str) = @_; +# print "$id $str $speaklog->{$id}\n"; + if (!defined $speaklog->{$id} || $speaklog->{$id} < time()-120) { +# my $cmd = "ssh hades30 'espeak -ven-male2 -s 120 -g 1 \"$str\" ' 2>/dev/null"; + my $fh; + open($fh, ">>",Hmon::HMONDIR."/files/speaklog"); + $fh->autoflush(1); + print $fh $str."\n"; + $speaklog->{$id} = time(); + close($fh); + } + } + +############################################################################### +# Calculate Colors +############################################################################### +sub findcolor { + my ($v,$min,$max,$lg) = @_; + my ($r,$g,$b); + $v = 0 unless defined $v; + $v = log($v) if $v && $lg; + $min = log($min) if $min && $lg; + $max = log($max) if $max && $lg; + $max = 1 unless $max; + + my $step = (($max-$min)/655); + + + if ($v == 0) { + $r = 220; + $g = 220; + $b = 220; + } else { + $v -= $min; + $v = $v/$step if $step; + if ($v<156) { + $r = 0; + $g = $v+100; + $b = 0; + } elsif ($v<412) { + $v -= 156; + $r = $v; + $g = 255; + $b = 0; + } else { + $v -= 412; + $r = 255; + $g = 255-$v; + $b = 0; + } + } + + my $ret = sprintf("#%02x%02x%02x",$r%256,$g%256,$b%256); + + return $ret; +} + +############################################################################### +# Make a nice colored drawing of MDC +############################################################################### +sub DrawMDC { + my ($plane,$sector,$color,$val) = @_; + my $str; + $str .= "\n"; + if ($plane == 0) { + $str .= "\n"; + } elsif ($plane == 1) { + $str .= "
{12} title=\"$val->{12}\">C{13} title=\"$val->{13}\">D\n"; + $str .= "
{10} title=\"$val->{10}\">A{11} title=\"$val->{11}\">B\n"; + $str .= "
{2} title=\"$val->{2}\">2$sector{7} title=\"$val->{7}\">7\n"; + $str .= "
{4} title=\"$val->{4}\">4{1} title=\"$val->{1}\">1{6} title=\"$val->{6}\">6{9} title=\"$val->{9}\">9\n"; + $str .= "
{3} title=\"$val->{3}\">3{0} title=\"$val->{0}\">0{5} title=\"$val->{5}\">5{8} title=\"$val->{8}\">8
{14} title=\"$val->{14}\">E{15} title=\"$val->{15}\">F\n"; + $str .= "
{12} title=\"$val->{12}\">C{13} title=\"$val->{13}\">D\n"; + $str .= "
{5} title=\"$val->{5}\">5$sector{11} title=\"$val->{11}\">B\n"; + $str .= "
{4} title=\"$val->{4}\">4{10} title=\"$val->{10}\">A\n"; + $str .= "
{3} title=\"$val->{3}\">3{1} title=\"$val->{1}\">1{7} title=\"$val->{7}\">7{9} title=\"$val->{9}\">9\n"; + $str .= "
{2} title=\"$val->{2}\">2{0} title=\"$val->{0}\">0{6} title=\"$val->{6}\">6{8} title=\"$val->{8}\">8\n"; + # $str .= "
{1} title=\"$val->{1}\">1{7} title=\"$val->{7}\">7\n"; + # $str .= "
{0} title=\"$val->{0}\">0{6} title=\"$val->{6}\">6\n"; + } else { + $str .= "
{12} title=\"$val->{12}\">C{13} title=\"$val->{13}\">D{14} title=\"$val->{14}\">E{15} title=\"$val->{15}\">F\n"; + $str .= "
{5} title=\"$val->{5}\">5{11} title=\"$val->{11}\">B\n"; + $str .= "
{4} title=\"$val->{4}\">4$sector{10} title=\"$val->{10}\">A\n"; + $str .= "
{3} title=\"$val->{3}\">3{9} title=\"$val->{9}\">9\n"; + $str .= "
{2} title=\"$val->{2}\">2{8} title=\"$val->{8}\">8\n"; + $str .= "
{1} title=\"$val->{1}\">1{7} title=\"$val->{7}\">7\n"; + $str .= "
{0} title=\"$val->{0}\">0{6} title=\"$val->{6}\">6\n"; + } + $str .= "
\n"; + return $str; +} + +############################################################################### +# Draw Scale +############################################################################### +sub DrawScale { + my ($min,$max,$steps) = @_; + my $str; + # print "$min $max $steps\n"; + return "" if $max == $min; + $str .= ""; + $str .= sprintf("
",Hmon::findcolor(0,0,$steps,0)); + return $str.="
" if $max == $min; + $str .= sprintf("%#2.3G",$min); + for (my $i = 1;$i<$steps;$i++) { + # my $j = ($max-$min)/$steps*$i; + $str .= sprintf("",Hmon::findcolor($i,0,$steps,0)); + } + $str .= sprintf("%#2.3G",$max); + $str .= "\n"; + # $str .= ""; + # $str .= sprintf("
%2.1G%2.1G%2.1G\n",$min+($max-$min)/4,$min+($max-$min)*2/4,$min+($max-$min)*3/4); + # $str .= "
\n"; + + return $str; +} + +############################################################################### +# Makes Diffs to last stored value. +# Loops over last plane/sector/board +############################################################################### +sub MakeDifferences { + my ($store, $laststore, $limit) = @_; + my $values = {}; + for (my $l = 0; $l < 4;$l++) { + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $values->{$l}->{$s}->{$b} = 0; + if (exists $store->{$l}->{$s}->{$b} && exists $laststore->{$l}->{$s}->{$b}) { + # if ($store->{$l}->{$s}->{$b} < $laststore->{$l}->{$s}->{$b}) { + # $values->{$l}->{$s}->{$b} = ($store->{$l}->{$s}->{$b} - $laststore->{$l}->{$s}->{$b}) & 0xFFFFFFFF ; + # } + # else { + $values->{$l}->{$s}->{$b} = ($store->{$l}->{$s}->{$b} - $laststore->{$l}->{$s}->{$b}) ; # & 0xFFFFFFFF + while ($values->{$l}->{$s}->{$b} < 0) { + $values->{$l}->{$s}->{$b} = ($values->{$l}->{$s}->{$b} + $limit); + } # & 0xFFFFFFFF + # } + } + } + } + } + return $values; +} + +############################################################################### +# Find min/max +############################################################################### +sub MakeMinMax3 { + my ($values,$d1,$d2,$d3,$ignore) = @_; + $ignore = 1 unless defined $ignore; + my $max = 0; + my $min = 2**32; + my $avg = 0; + my $num = 0; + for (my $l = 0; $l < $d1;$l++) { + for (my $s = 0; $s < $d2;$s++) { + for (my $b=0;$b<$d3;$b++) { + if (! exists $values->{$l}->{$s}->{$b}) { + $values->{$l}->{$s}->{$b} = 0; + } else { + $num++; + $avg += $values->{$l}->{$s}->{$b}; + } + if ($max < $values->{$l}->{$s}->{$b}) { + $max = $values->{$l}->{$s}->{$b}; + } + if ($min > $values->{$l}->{$s}->{$b} && ($values->{$l}->{$s}->{$b} != 0 || !$ignore)) { + $min = $values->{$l}->{$s}->{$b}; + } + } + } + } + $avg /= ($num || 1); + return ($min,$max,$avg); +} + +sub MakeMinMax2 { + my ($values, $d1, $d2, $ignore) = @_; + $ignore = 1 unless defined $ignore; + my $max = 0; + my $min = 2**32; + my $avg = 0; + my $num = 0; + # print Dumper $values; + for (my $l = 0; $l < $d1;$l++) { + for (my $s = 0; $s < $d2;$s++) { + if (! exists $values->{$l}->{$s}) { + $values->{$l}->{$s} = 0; + } else { + $num++; + $avg += $values->{$l}->{$s}; + } + if ($max < $values->{$l}->{$s}) { + $max = $values->{$l}->{$s}; + } + if ($min > $values->{$l}->{$s} && ($values->{$l}->{$s} != 0 || !$ignore)) { + $min = $values->{$l}->{$s}; + } + } + } + $avg /= $num; + return ($min,$max,$avg); +} + +sub MakeMinMax1 { + my ($values,$d1,$ignore) = @_; + $ignore = 1 unless defined $ignore; + my $max = 0; + my $min = 2**32; + for (my $l = 0; $l < $d1;$l++) { + if (! exists $values->{$l}) { + $values->{$l} = 0; + } + if ($max < $values->{$l}) { + $max = $values->{$l}; + } + if ($min > $values->{$l} && ($values->{$l} != 0 || !$ignore)) { + $min = $values->{$l}; + } + } + return ($min,$max); +} + +sub qxtimeout { + my ($cmd, $time) = @_; + my @out; + $SIG{ALRM} = sub { $out[0] = "qxtimeout"; die }; + $SIG{CHLD} = "IGNORE"; + eval { + alarm($time); + @out = qx($cmd); + alarm(0); + }; + return @out; +} + +1; +__END__ diff --git a/hmon/Perl2Epics.pm b/hmon/Perl2Epics.pm new file mode 100644 index 0000000..c886dbd --- /dev/null +++ b/hmon/Perl2Epics.pm @@ -0,0 +1,156 @@ +package Perl2Epics; +use warnings; +use strict; +use Data::Dumper; +# use Hmon; + +use lib '/home/scs/EPICS/gcc-4.4/EPICS-3.14.12.2_linux-x86_64/base/' . '/lib/perl'; +use CA; + +$ENV{EPICS_CA_AUTO_ADDR_LIST} = 'YES'; +$ENV{EPICS_CA_ADDR_LIST} = "192.168.100.11 192.168.100.12 192.168.100.13 192.168.100.14 192.168.100.15 localhost"; + + +my $EpicsValues = {}; +my $EpicsStore = {}; +my @EpicsChans = (); +my $EpicsNames = {}; +my $errcnt = {}; + +sub callback { + my ($chan, $status, $data) = @_; +# print Dumper $data; + if ($status) { + printf "%-30s %s\n", $chan->name, $status; + } + else { +# print $chan->name . ": $data->{value}\n"; +# print scalar @{$EpicsStore->{$chan->name}->{tme}}."\n"; + if(scalar @{$EpicsStore->{$chan->name}->{tme}} > 10) { + shift @{$EpicsStore->{$chan->name}->{tme}}; + shift @{$EpicsStore->{$chan->name}->{val}}; + } + push(@{$EpicsStore->{$chan->name}->{tme}}, $data->{stamp}); + push(@{$EpicsStore->{$chan->name}->{val}}, $data->{value}); + $EpicsValues->{$chan->name}->{tme} = $data->{stamp}; + $EpicsValues->{$chan->name}->{val} = $data->{value}; + } +} + + +sub Connect { + my ($title,$varname,$type,$wait) = @_; + # push(@EpicsChans,CA->new($name)); + # $EpicsChans[-1]->create_subscription('v', \&callback, 'DBR_TIME_DOUBLE'); + ## print $varname."\n"; + $type = 'DBR_TIME_DOUBLE' unless defined $type; + $EpicsStore->{$varname}->{tme} = []; + $EpicsStore->{$varname}->{val} = []; + $EpicsNames->{$title} = $varname; + $errcnt->{$varname} = 0; + my $success; + eval { + my $c = CA->new($varname); + CA->pend_io($wait || 0.05); + $c->create_subscription('v', \&callback, $type); +# $c->get_callback(\&callback, $type, 1); + $EpicsStore->{$varname}->{ca} = $c; + $success = $c->is_connected(); + }; + +return ($success); +} + +sub Update { + CA->pend_event($_[0]); + } + + +sub GetAll { + my $store = {}; + my $time; + my $val; + + Update(0.001); + + foreach my $el (keys %{$EpicsNames}) { + my $varname = $EpicsNames->{$el}; + my $ca = $EpicsStore->{$varname}->{ca}; + my $r = $ca->is_connected() if(defined $ca); + my $success = 1; + if(!$r && (!defined $errcnt->{$el} || $errcnt->{$el} < 20)) { + $success = Connect($el, $varname); + $errcnt->{$el}++; + } + + if(!$success) { + $time = -1; + $val = 0; + } + elsif (scalar @{$EpicsStore->{$varname}->{tme}} > 0) { + $errcnt->{$el}-=.3 if ($errcnt->{$el}||0) >= 0; + $time = (@{$EpicsStore->{$varname}->{tme}})[-1]; + $val = (@{$EpicsStore->{$varname}->{val}})[-1]; + } + else { + $time = $EpicsStore->{$varname}->{lasttime}; + $val = $EpicsStore->{$varname}->{lastval}; + } + $store->{$el}->{tme} = $time; + $store->{$el}->{val} = $val; + $EpicsStore->{$varname}->{lasttime} = $time; + $EpicsStore->{$varname}->{lastval} = $val; + } + + return $store; + } + + + + + +sub Get { + my ($title,$latest) = @_; + my $varname = $EpicsNames->{$title}; + my $time; + my $val; +# print $varname; + + my $c = $EpicsStore->{$varname}->{ca}; + my $r = $c->is_connected() if(defined $c); + + my $success = 1; + if(!$r) { + $success = Connect($title, $varname); + } + + if(!$success) { + return (-1, 0); + } + + + Update(0.00001); + + if (scalar @{$EpicsStore->{$varname}->{tme}} > 0) { + if(defined $latest && $latest == 1) { + $time = (@{$EpicsStore->{$varname}->{tme}})[-1]; + $val = (@{$EpicsStore->{$varname}->{val}})[-1]; + } + else { #if (scalar @{$EpicsStore->{$varname}->{tme}} > 1) + $time = shift (@{$EpicsStore->{$varname}->{tme}}); + $val = shift (@{$EpicsStore->{$varname}->{val}}); + } + } + else { + $time = $EpicsStore->{$varname}->{lasttime}; + $val = $EpicsStore->{$varname}->{lastval}; + } + $EpicsStore->{$varname}->{lasttime} = $time; + $EpicsStore->{$varname}->{lastval} = $val; + $time = $time || -1; + $val = $val || 0; + return ($time,$val); + } + +1; +__END__ diff --git a/hmon/QA.pm b/hmon/QA.pm new file mode 100644 index 0000000..3978841 --- /dev/null +++ b/hmon/QA.pm @@ -0,0 +1,262 @@ +package QA; + +use Hmon; +############################################################################### +# Screen Configuration +############################################################################### +# List of categories & names +our $cats = {'main'=>"Main", + 'daq'=>"DAQ", + 'trg'=>"Trig", + 'server'=>"Srv", + 'eb'=>"EB", + 'mdc'=>"MDC", + 'endp'=>"Endp", + 'feeerr'=>"Fee", + 'other'=>"Other"}; + +# Order of categories +our $entries->{'cats'} = ["main", + "daq", + "trg", + "server", + "eb", + "mdc", + "endp", + "feeerr", + "other"]; + +# Order of entries in each cat +$entries->{'main'} = ['time', 'rate','onlineqa']; +$entries->{'daq'} = ['trbnet', 'timeouts', 'busy','readout']; +$entries->{'trg'} = ['spill', 'source', 'accepted', 'ptrate', 'start']; +$entries->{'server'} = ['fill', 'cpu', 'icinga', 'etrax', 'pwrsup']; +$entries->{'eb'} = ['run', 'rate','bytes', 'lostevt', 'errbits']; +$entries->{'mdc'} = ['token', 'blocked', 'temp', 'linkqual', 'voltage']; +$entries->{'endp'} = ['mdc', 'rich', 'tof', 'rpc', 'other']; +$entries->{'feeerr'} = ['rich', 'trb', 'feeerr','trginp','trgqual']; +$entries->{'other'} = ['magnet','speech','shower','rich','mdcinvalid']; + + +our $QAServer = "hades33"; + +############################################################################### +# Thresholds +############################################################################### +# #MDC Temperatures +# use constant {MdcTempOk => 78, MdcTempWarn => 85, MdcTempErr => 90}; +# +# #MDC locked OEP +# use constant {MdcLockOk => 0, MdcLockWarn => 3, MdcLockErr => 5}; +# +# #MDC OEP Numbers +# use constant {MdcOepOk => 326}; +# use constant {MdcOepWarn => MdcOepOk-2}; +# use constant {MdcOepErr => MdcOepOk-4}; +# +# #Frontend errors +# use constant { FeeErrOk => 0, FeeErrWarn => 2, FeeErrErr => 5}; + +our @FeeErrLimits = (0, 5, 10); +our @MdcOepLimits = (372, 372-1, 372-3); +our @MdcVoltageLimits = (50, 60, 100); +our @MdcLockLimits = (0, 3, 5); +our @MdcTempLimits = (78, 85, 90); +our @TrgErrLimits = (100, 1000, 10000); +our @CPULimits = (95, 100, 100); +our @TimeoutLimits = (0, 0, 1); +our @LinkErrLimits = (50, 500, 1000); +our @MdcEndpMissingLimits = (0, 0, 1); +our @RichEndpMissingLimits = (0, 0, 0); +our @TofEndpMissingLimits = (0, 0, 0); +our @RpcEndpMissingLimits = (0, 0, 0); +our @OtherEndpMissingLimits = (0, 0, 0); +our @EBDeltaRateLimits = (10, 15, 25); +our $TrgCheckPolarity = 1; +our @Eventsbroken = (.5,5,10); +our @MdcTokenMissLimits = (10,50,100); + + +our @LimitTriggerPerSpill = (1000, 0, 0); +our $AcceleratorCycle = 12; +use constant {CTSAddress => 0x0003}; + +############################################################################### +# Missing Boards +############################################################################### + +our @mdc_boards_removed =(0x2233); +our @mdc_chambers_removed =(); +our @rich_boards_removed =(); +our @tof_boards_removed =(); +our @rpc_boards_removed =(); +our @other_boards_removed =(); + + +############################################################################### +# Error Levels +############################################################################### +use constant { + SCRIPTERROR => -1, + NA => 0, + OK => 10, + NOTE => 20, + NOTE_2 => 22, + WARN => 40, + WARN_2 => 42, + ERROR => 70, + ERROR_2 => 72, + LETHAL => 100, + FATAL => 100 +}; + +############################################################################### +# Functions +############################################################################### + + +############################################ +# Opens QA Logfile and gives back a filehandle +sub OpenQAFile { + my $fh; + open($fh, ">>",Hmon::HMONDIR."/files/qalog"); + $fh->autoflush(1); + return $fh; +} + + + +############################################ +# Writes an entry to the QA file. Arguments: +# $fh file handle of logfile +# $cat category of entry +# $entry name of entry +# $ttl time the entry is valid (in seconds) +# $status Status, one of the constants defined above +# $title First line of monitor entry +# $value Second line of monitor entry +# $longtext Long description text (PopUp) +sub WriteQALog { + my ($fh, $category, $entry, $ttl, $status, $title, $value, $longtext) = @_; + my $close = 0; + my $tmp = time()."\t$category\t$entry\t$ttl\t$status\t$title\t$value\t$longtext\n"; + + if ($fh eq "remote") { + system("ssh $QAServer \"echo '$tmp' >> /home/hadaq/trbsoft/daq/tools/hmon/files/qalog\""); + return; + } + + # $format =~ s/\s/\t/g; + if ($fh == 0) { + $fh = OpenQAfile(); + $close = 1; + } + + print $fh $tmp; + close $fh if($close); +} + +############################################ +# Returns the appropriate status flag (simplified). Arguments: +# $mode how to determine status, supported: "below","above" +# $val the value +# @limits Array with limits +sub GetQAState { + my ($mode, $val, @limits) = @_; + my ($ok, $warn, $err) = @limits; + if (!defined($val)) { + return NA; + } + if ($val eq "err") { + return SCRIPTERROR; + } + if ($_[0] eq 'below') { + if ($val <= $ok) { + return OK; + } + if ($val <= $warn) { + return WARN; + } + if ($val <= $err) { + return ERROR; + } + if ($val > $err) { + return FATAL; + } + } elsif ($_[0] eq 'above') { + if ($val >= $ok) { + return OK; + } + if ($val >= $warn) { + return WARN; + } + if ($val >= $err) { + return ERROR; + } + if ($val < $err) { + return FATAL; + } + } elsif ($_[0] eq 'inside') { + if (abs($val) <= $ok) { + return OK; + } + if (abs($val) <= $warn) { + return WARN; + } + if (abs($val) <= $err) { + return ERROR; + } + return FATAL; + } + return SCRIPTERROR; +} + +############################################ +#Returns a string matching the given severity level +sub LevelName { + my ($level) = @_; + if ($level == SCRIPTERROR) { + return "Script Error"; + } + if ($level == NA) { + return "Not available"; + } + if ($level < NOTE ) { + return "OK"; + } + if ($level < WARN ) { + return "Note"; + } + if ($level < ERROR ) { + return "Warning"; + } + if ($level < FATAL ) { + return "Error"; + } + return "Severe Error"; + } + +############################################ +# Tries to nicely format an integer +sub SciNotation { + my $v = shift; + return "undef" if (!defined $v); + return "0" if $v == 0; +# print $v."\n"; + if(abs($v) >= 1) { + return sprintf("%i", $v) if (abs($v) < 1000) ; + return sprintf("%.1fk", $v / 1000.) if (abs($v) < 20000) ; + return sprintf("%ik", $v / 1000.) if (abs($v) < 1E6) ; + return sprintf("%.1fM", $v / 1000000.) if (abs($v) < 20E6) ; + return sprintf("%iM", $v / 1000000.) if (abs($v) < 1E9) ; + return sprintf("%i",$v); + } + else { + return sprintf("%in", $v*1E9) if (abs($v) < 1E-6) ; + return sprintf("%iu", $v*1E6) if (abs($v) < 1E-3) ; + return sprintf("%.1fm", $v*1E3); + } +} + +1; +__END__ diff --git a/hmon/background.png b/hmon/background.png new file mode 100755 index 0000000000000000000000000000000000000000..d17851da02107caaaee4a78deaaea5f003ca85a2 GIT binary patch literal 1809 zcmV+s2k!WZP)00001b5ch_0Itp) z=>Px#7*I@9McwZIrMAbm$JnX5%fi#-+3Nex;PLPG|M;IA761SM0d!JMQvg8b*k%9# z00Cl4M??UK1szBL000SaNLh0L04^f{04^f|c%?sf00007bV*G`2iyV=5jzrDWMcII z00w1AL_t(&-tAdSd#g4O70Fl$KDu2Iu;ZQ8VJaGJY@+$R73Cv+Z?3^vA(w3~j` z!Z8>QGiT13ksYP(>%Q*mKU_&QJ*vJ0)eO_4^b26gbFU|dVHR$0#`-nNCV7P_Dx%>= zsK+otG2ga%zdp^!gkXYVaw^Ce zFzT*O&=BiprUDMqG_O}D*jS1tYb5fLx_ZA(qa!C5Y-Xo}Tx1qsBeUne*e5kjl2eX~ zaJWjN97l2Rfj!Ze7xVuZTAG-7e;2+BOAHa)G2Q2$<=}3?vH&f4-GD3G_}76N$5>M#ostoTc8y z$5q=Z;|MYsBLyA16Y)9ngYAT^I8!}<^%FoL^m)dL3#n(e#wGz=HY|W`LhlnN!1@f< z)INA;09gPWDr7B`i0;}L1$d@g*vnYnm=VU33O_&x9m^tyi^#Xs%OnF8AxDvoOJk6l zs^N{4>Px8SagB|k#h6Bk0&>h5q-{7OWtULT60L_60SJWQk?|3S0Doj@)v_zcNn>jy!!Mwm!h8W(gi$rPL=4N#(58O=lT ztn#JdNaHFoqz3C>h=+fsgky}92b)Z{RppP9#)ZP-NE*xiH;S@Gc<$PgxjENxT;rmI zFhwi5Sl5^>`ap$+XMe5jl-`P_W9G4X?)s-dum{`5x^?AqU08?__5`#aQnoF;jH!|V zY-}5&YvcSR*4`kv)iP9k$RqdYRF8NDwO`pbrVhrzF%1FVjcHS3Na>Ru@H;Z z+C6As8->$`Wx5+gq_9pts3I%({>;o@-P!gf{VDlPWouz%z8^dMLAaGCs| z5z+7@)5`j1#6;fS-k5?|w!}>o-XTU8 zC2x9Q+1`Wo7B$O4FOnZLVEM4JB94-Tt#ftA7~HGhz1x71sW?CNRs*#MW)6i}QY8l_U4=YFVL|zE32tIjIq~sflO3dp>nE(F7A$Eg=INOH zK!0%eRFY$h6$(9s&o$FOhBBV)wJJ(hcPKq<(I)uN@ZoShGFQ08%P;(H6;K4zr|lR+ zepjIMacwUB&PNyTt&te*Herk<+f8+OVEeFk?1CNZU9dvh24B4X`eVN%vmvC07>wlo zpSS!-fzzX#qDHs>I26M3?5MmQE6C>?ztq6(STBdmsQbFF|IhM+@TPUg`U=*K>rZq%(hVXG=7Iec5pwQ@WkUG@Jiq1k0<3JR_`aI#p16ab1a&Z^pc&yqRWdp7TrF> z0*eLBDptCubdQzIu@Zhe?Oe^wy$H#`lFkN8DIIVj+3Uaf<>=8rwWUe z9BCquLZ|CkRG`2yAy`xi)GlE~PqbLK#Co`ng)e3Am^kSnX1*dnmg`u$6|8Q8r5C*2 zMC*Q}yPHH=+j^{Qspl|OcN!~@0$OP}tn9cKeiy7mQzoCEpHvk3^G)9K(TAM+{OtT0 zI^m9!A$>dEFF$-`-DmAru>MW%@9Vzq>&EpD>mMA-kzV8T00000NkvXXu0mjfZtiu| literal 0 HcmV?d00001 diff --git a/hmon/doc.cgi b/hmon/doc.cgi new file mode 100755 index 0000000..9a14ab9 --- /dev/null +++ b/hmon/doc.cgi @@ -0,0 +1,92 @@ +#!/usr/bin/perl -w +use strict; +use warnings; + +use constant { + SCRIPTERROR => -1, + NA => 0, + OK => 10, + NOTE => 20, + NOTE_2 => 22, + WARN => 40, + WARN_2 => 42, + ERROR => 70, + ERROR_2 => 72, + LETHAL => 100, + FATAL => 100 +}; + + +my @args = split('-',$ENV{'QUERY_STRING'}); +my ($class,$entry) = @args; + +print "Content-type: text/html\r\n\r\n"; + +my $out = qq~ + + + +Tactical Overview Documentation + + + + + + +
+
+

Tactical Overview Guide

+
+
+
+
+
+
Status:
+~; + + +unless (defined $class && defined $entry) { + $out .= "

This script should not be called directly, but only with correct options.

"; + goto END; + } + + + my $MYF; + my $str = ""; + open ($MYF, ""; + goto END; + }; + $out .= $_ while (<$MYF>); + +END: + +$out .= qq$ + + + + +$; + +print $out; diff --git a/hmon/editlogfiles.pl b/hmon/editlogfiles.pl new file mode 100755 index 0000000..45413ec --- /dev/null +++ b/hmon/editlogfiles.pl @@ -0,0 +1,75 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use Data::Dumper; +# use Hmon; +# use QA; +# use Perl2Epics; +use HADES::TrbNet; + +my $pathtoarchive = "/home/hadaq/trbsoft/daq/tools/hmon/archive"; + +my $cmd = "ls $pathtoarchive/*/logfile.htm"; +my @files = qx($cmd); + +foreach my $f (@files) { + my ($fin,$fout); + chop $f; + print $f."\n"; + open($fin,"<",$f) or die "can't open file"; + chop $f; chop $f; chop $f; + open($fout,">",$f."ht"); + + my @lines = <$fin>; + foreach my $l (@lines) { + + $l =~ s//\n/gi; + $l =~ s##\n#gi; + print $fout $l."\n" ; + } + close($fin); + close($fout); + } + +my $cmd = "ls $pathtoarchive/*/logfile.ht"; +my @files = qx($cmd); + +my $store; +my $fout; +open($fout,">","$pathtoarchive/logfile.htm"); +print $fout "\n"; + +foreach my $f (@files) { + my $fin; + chop $f; +# print $f."\n"; + open($fin,"<",$f) or die "can't open file"; + my @lines = <$fin>; + + foreach my $l (@lines) { + next if ($l =~ m#<.*div#); + next if ($l =~ m#<.*table#); + next if ($l =~ m#Online QA#); + next if ($l =~ m#EVTBLD#); + next if ($l =~ m#NETMEM#); + next if ($l =~ m#30 boards complain#); + next if ($l =~ m#Eventbuilders#); + #next if ($l =~ m#Included#); + #next if ($l =~ m#Power#); + next if ($l =~ m#counter mismatch#); + #next if ($l =~ m#Timeouts found#); + next if ($l =~ m#0x2\w\w\w missing#); + next if ($l =~ m#Load thresh#); +# next if ($l =~ m#Trigger#); + next if ($l =~ m#DAQ is going#); + $l =~ s#>9.Apr#>09.Apr#; + if(!(defined $store->{$l}) && $l =~ m#^# ) { + $store->{$l}=1; + print $fout $l; + } + } + } + $cmd = "sort $pathtoarchive/logfile.htm >$pathtoarchive/logfile2.htm"; + system($cmd); diff --git a/hmon/files b/hmon/files new file mode 120000 index 0000000..83f9da1 --- /dev/null +++ b/hmon/files @@ -0,0 +1 @@ +/dev/shm/hmon \ No newline at end of file diff --git a/hmon/get.cgi b/hmon/get.cgi new file mode 100755 index 0000000..b730787 --- /dev/null +++ b/hmon/get.cgi @@ -0,0 +1,71 @@ +#!/usr/bin/perl +use warnings; +use strict; +use Data::Dumper; +use MIME::Base64; + +print "Expires: Thu, 01 Dec 1994 16:00:00 GMT\r\n"; +print "Content-type: text/html\r\n\r\n"; + +my @args = split('-',$ENV{'QUERY_STRING'}); + +sub addpng { + my ($file) = @_; + my $out = "data:image/png;base64,"; + open (my $fh, "<$file"); + + local $/; + my $bin = <$fh>; + $fh->close(); + $/='\n'; + $out .= encode_base64($bin); + chomp $out; + return $out; + } + +sub addfile { + my ($file,$strip) = @_; + my $MYF; + $strip = 0 unless defined $strip; + my $str = ""; + open ($MYF, "<$file") or return ""; + while (<$MYF>){ +# print $_; + if ($_ =~ m%ADDFILE\s([/\w]*).svg%) { + $str .= addfile("$1.svg",1); + } + elsif ($_ =~ m!^(.*)\%ADDPNG\s+(.+)\%(.*)$!) { + $str .= $1; + $str .= addpng($2); + $str .= $3; + } + else { + $_ =~ s/\t*/ /; + if($_ =~ m/^$/) {next;} + if($strip==1) { + $_ =~ s/\n"; + +my @args = split('-',$ENV{'QUERY_STRING'}); +my $query = $ENV{'QUERY_STRING'}; + +unless( $query =~ m/^\w+-\w+$/) { + print "Invalid Query.\n"; + exit; + } + +sub LevelName { + my ($level) = @_; + if ($level == -1) { return "Script Error"; } + if ($level == 0) { return "Not available"; } + if ($level < 20 ) { return "OK"; } + if ($level < 40 ) { return "Note"; } + if ($level < 70 ) { return "Warning"; } + if ($level < 100 ) { return "Error"; } + return "Severe Error"; + } + +my $out = ""; +my $MYF; +open ($MYF, "){ + if($_ =~ m/$query/i) { +# print $_."
"; + $out .= "
Entry$query - "; + $_ =~ m/class="(\d+)/; + $out .= LevelName($1); + $_ =~ m/alt=".+\((\d\d:\d\d:\d\d)\)/; + $out .= " @ ".$1; + + $_ =~ m$>(.+)
(.+)$; + $out .= "
Short$1 - $2"; + + $_ =~ m$alt=".+<br />(.+)"\sonmouseover$; + my $s = $1; + $s =~ s$\s-\s$
$gi; + $out .= "
Msg
"; + $out .= $s; + $out .= "
"; + } + } + +#
#EB running
active: 0/1
+ +close $MYF; +print $out; + diff --git a/hmon/hmon_busy.pl b/hmon/hmon_busy.pl new file mode 100755 index 0000000..5f074ca --- /dev/null +++ b/hmon/hmon_busy.pl @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use Hmon; + +my $str; + + + $str = Hmon::MakeTitle(5,6,"Busy Times",0); +# $str .= "\"Sorry,\n"; + $str .= "\n"; +# $str .= "\n#ADDFILE files/busy.svg\n"; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("busy",$str); + + +qx(./hmon_hadplot.sh -d 500 -output "PNG.files/busy.380.265" busyrate); + + diff --git a/hmon/hmon_busyhist.pl b/hmon/hmon_busyhist.pl new file mode 100755 index 0000000..e53a07a --- /dev/null +++ b/hmon/hmon_busyhist.pl @@ -0,0 +1,16 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use Hmon; + +my $str = ""; + +$str = Hmon::MakeTitle(8,6,"Busy Times",0); +# $str .= "\n#ADDFILE files/busyhist.svg\n"; +$str .= "\n"; +$str .= Hmon::MakeFooter(); +Hmon::WriteFile("busyhist",$str); + + +qx(./hmon_hadplot.sh -d 100 -o 10 -n 300 -output "PNG.files/busyhist.620.265" busytime); diff --git a/hmon/hmon_datarate.pl b/hmon/hmon_datarate.pl new file mode 100755 index 0000000..96dde09 --- /dev/null +++ b/hmon/hmon_datarate.pl @@ -0,0 +1,21 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Hmon; + +my $str = ""; + + +$str = Hmon::MakeTitle(9,6,"Data Rates",0); +#$str .= "\n#ADDFILE files/eventratehist.svg\n"; +$str .= "\n"; +$str .= Hmon::MakeFooter(); +Hmon::WriteFile("datarate",$str); + + + + + qx(./hmon_hadplot.sh -d 1000 -n 600 -ytitle "MByte/s" -output "PNG.files/datarate.700.265" datarate); + + diff --git a/hmon/hmon_eb_rate.pl b/hmon/hmon_eb_rate.pl new file mode 100755 index 0000000..7c32bbc --- /dev/null +++ b/hmon/hmon_eb_rate.pl @@ -0,0 +1,118 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use Data::Dumper; +use Hmon; +use QA; +use Perl2Epics; +use HADES::TrbNet; + +my $SLEEP_TIME = 0.5; # in seconds +my $NUM_AVERAGES = 10; +my $offset = 2; +my $last_rate_endp = 0; +my $opt_addr = 3; #CTS +my $error_ctr = 0; +my $error_limit = 3; + +trb_init_ports() or die trb_strerror(); + +my $flog = QA::OpenQAFile(); + +for (my $i = 0; $i <= 15; $i++) { + my $s = sprintf("HAD:eb%02i", $i + 1); + Perl2Epics::Connect("ebrate$i", $s.":evtCRate"); + Perl2Epics::Connect("ebstat$i", $s.":status"); +} +#Perl2Epics::Connect("totalEvts","HAD:eb:totalEvtsComp"); + +while (1) { + + # 0x03 => CTS + # my $rh_result = trb_register_read(QA::CTSAddress, 0xa0f0) + # or sleep 5 and next; + # my $sentmask = ($rh_result->{QA::CTSAddress} || 0) & 0xFFFF; + + # 0x3000 => ?? + my $actmask = 0; + my $evtrate_eb_tot = 0; + my $evtrate_endp_tot = 0; + my $ctr = 0; + my $starttime = time(); + my $data; + my $last_spill_on = 0; + my $spill_on = 0; + my $use_spill_detect = 0; + + while (($ctr < ($NUM_AVERAGES + $offset)) && (!($last_spill_on == 1 && $spill_on == 0) || $use_spill_detect == 0)) { + my $rh_result = trb_register_read(0x2, 0x1) or sleep 5 and next; + my $rate_endp = ($rh_result->{0x2} & 0xffff); + if ($ctr < $NUM_AVERAGES) { + $evtrate_endp_tot += + $rate_endp >= $last_rate_endp ? $rate_endp - $last_rate_endp + : ($rate_endp + 2**16) - $last_rate_endp; + } + if ($ctr >= $offset) { + $data = Perl2Epics::GetAll(); + my $i = 0; + for ($i = 0; $i <= 15; $i++) { + $evtrate_eb_tot += $data->{"ebrate$i"}->{val} || 0; + if ($data->{"ebstat$i"}->{val}) { + $actmask |= (1 << $i); + } + } + } + $last_rate_endp = $rate_endp; + + ###cancel integration when spill break is detected + my @result = trb_register_read_c($opt_addr, 0xa002 ); + $last_spill_on = $spill_on; + $spill_on = !(($result[1] & 0x10) >> 4); + + usleep($SLEEP_TIME * 1e6); + $ctr++; + } + + my $tottime = time() - $starttime; + my $rate_eb = $evtrate_eb_tot / $ctr; + my $rate_eb_str = sprintf "%.1f", $rate_eb; + my $rate_endp = $evtrate_endp_tot / $tottime; + my $rate_endp_str = sprintf "%.1f", $rate_endp; + my $diff = $rate_eb - $rate_endp; + my $diff_str = sprintf "%d", $diff; + my $diff_p = $diff / ($rate_endp || 1) * 100; + my $diff_p_str = sprintf "%d", $diff_p; + if (! $rate_endp) { + $evtrate_endp_tot, $diff_p_str = "---"; + } + + my $limit = $diff / sqrt($rate_endp || 1); + my $status = QA::GetQAState('inside', $limit, @QA::EBDeltaRateLimits); + if ($rate_endp < 50) { + $status = QA::OK; + } + if (! $actmask) { + $status = QA::WARN_2; + $diff_p_str = "---"; + $rate_eb_str = "EB is stopped"; + } + if (($status >= QA::ERROR) && ($error_ctr < $error_limit)) { + $error_ctr++; + $status = QA::OK; + } else { + $error_ctr = 0; + } + my $title = "ΔRate EB-CTS"; + my $shorttext = "$diff_str ($diff_p_str%)"; + my $longtext = "CurrentRate CTS: $rate_endp_str - Rate Eventbuilders: $rate_eb_str - ΔRate: $diff_str ($diff_p_str%)"; + $longtext = " $longtext ErrorCtr: $error_ctr" if ($error_ctr > 0); + QA::WriteQALog($flog, "eb", "rate", $SLEEP_TIME * $ctr * 2, + $status, $title, $shorttext, $longtext); + if ($status >= QA::ERROR) { + my $speakermsg = "CTS and Eventbuilder rate differ by "; + my $pmesg = sprintf "%d", abs($diff_p); + Hmon::Speak('dataloss', "Eventbuilder and CTS rate differ by $pmesg per cent") + } +} diff --git a/hmon/hmon_endpoints.pl b/hmon/hmon_endpoints.pl new file mode 100755 index 0000000..dca2e69 --- /dev/null +++ b/hmon/hmon_endpoints.pl @@ -0,0 +1,283 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use POSIX qw(strftime); +use FileHandle; +use Hmon; +use QA; +use Getopt::Long; +use Data::Dumper; + +use HADES::TrbNet; + +trb_init_ports() or die trb_strerror(); +my $flog = QA::OpenQAFile(); +my $waittime = 15; +my $loggerperiod = 12; #times 5 seconds sleep +my $timecnt; + +while(1) { + my @result = trb_register_read_c(0xffff, 0x0) or sleep 5 and next; + + ####config + my @all_boards =(); + my @mdc_boards =( + ###OEPS + # 0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2017,0x2018,0x2019,0x201a, + # 0x201b,0x201c,0x201d,0x2020,0x2021,0x2022,0x2023,0x2024,0x2025,0x2026,0x2027, + # 0x2028,0x2029,0x202a,0x202b,0x202c,0x202d,0x2030,0x2031,0x2032,0x2033,0x2034, + # 0x2035,0x2036,0x2037,0x2038,0x2039,0x203a,0x203b,0x203c,0x203d,0x2040,0x2041, + # 0x2042,0x2043,0x2044,0x2045,0x2046,0x2047,0x2048,0x2049,0x204a,0x204b,0x204c, + # 0x204d,0x2050,0x2051,0x2052,0x2053,0x2054,0x2055,0x2056,0x2057,0x2058,0x2059, + # 0x205a,0x205b,0x205c,0x205d,0x2100,0x2101,0x2102,0x2103,0x2104,0x2105,0x2106, + # 0x2107,0x2108,0x2109,0x210a,0x210b,0x210c,0x210d,0x210e,0x210f,0x2110,0x2111, + # 0x2112,0x2113,0x2114,0x2115,0x2116,0x2117,0x2118,0x2119,0x211a,0x211b,0x211c, + # 0x211d,0x211e,0x211f,0x2120,0x2121,0x2122,0x2123,0x2124,0x2125,0x2126,0x2127, + # 0x2128,0x2129,0x212a,0x212b,0x212c,0x212d,0x212e,0x212f,0x2130,0x2131,0x2132, + # 0x2133,0x2134,0x2135,0x2136,0x2137,0x2139,0x213a,0x213b,0x213c,0x213d,0x213e, + # 0x213f,0x2140,0x2141,0x2142,0x2143,0x2144,0x2145,0x2146,0x2147,0x2148,0x2149, + # 0x214a,0x214b,0x214c,0x214d,0x214e,0x214f,0x2150,0x2151,0x2152,0x2153,0x2154, + # 0x2155,0x2156,0x2157,0x2158,0x2159,0x215a,0x215b,0x215c,0x215d,0x215e,0x215f, + # 0x2200,0x2201,0x2202,0x2203,0x2204,0x2205,0x2206,0x2207,0x2208,0x2209,0x220a, + # 0x220b,0x220c,0x220d,0x220e,0x220f,0x2220,0x2221,0x2222,0x2223,0x2224,0x2225, + # 0x2226,0x2227,0x2228,0x2229,0x222a,0x222b,0x222c,0x222d,0x222e,0x222f,0x2240, + # 0x2241,0x2242,0x2243,0x2244,0x2245,0x2246,0x2247,0x2248,0x2249,0x224a,0x224b, + # 0x224c,0x224d,0x224e,0x224f,0x2250,0x2251,0x2252,0x2253,0x2254,0x2255,0x2256, + # 0x2257,0x2258,0x2259,0x225a,0x225b,0x225c,0x225d,0x225e,0x225f,0x2300,0x2301, + # 0x2302,0x2303,0x2304,0x2305,0x2306,0x2307,0x2308,0x2309,0x230a,0x230b,0x230c, + # 0x230d,0x230e,0x230f,0x2320,0x2321,0x2322,0x2323,0x2324,0x2325,0x2326,0x2327, + # 0x2328,0x2329,0x232a,0x232b,0x232c,0x232d,0x232e,0x232f,0x2340,0x2341,0x2342, + # 0x2343,0x2344,0x2345,0x2346,0x2347,0x2348,0x2349,0x234a,0x234c,0x234d,0x234e, + # 0x234f,0x2350,0x2351,0x2352,0x2353,0x2354,0x2355,0x2356,0x2357,0x2358,0x2359, + # 0x235a,0x235b,0x235c,0x235d,0x235e,0x235f, + # ###MDC Concentrator + 0x1000,0x1001,0x1002,0x1003,0x1004,0x1010,0x1011,0x1012,0x1013,0x1014,0x1020, + 0x1021,0x1022,0x1023,0x1024,0x1030,0x1031,0x1032,0x1033,0x1034,0x1040,0x1041,0x1042,0x1043,0x1044,0x1050, + 0x1051,0x1052,0x1053,0x1054,0x1100,0x1101,0x1102,0x1103,0x1104,0x1120,0x1121, + 0x1122,0x1123,0x1124,0x1140,0x1131,0x1132,0x1133,0x1134,0x1140,0x1141,0x1142,0x1143,0x1144,0x1150,0x1151,0x1152, + 0x1153,0x1154, + ### + 0x8100,0x8101,0x8110,0x8111 + ); + + foreach my $p (0..3) { + foreach my $s (0..5) { + foreach my $m (0..15) { + next if($p==0 && $m >=14); + my $address = 0x2000 + $p*0x100 + $s*0x10 + $m; + push (@mdc_boards, $address); + } + } + } + + foreach my $mdc_sec (@QA::mdc_chambers_removed) { + foreach my $m (0..15) { + next if($mdc_sec<0x10 && $m >=14); + my $address = 0x2000 + $mdc_sec*0x10 + $m; + push (@QA::mdc_boards_removed, $address); + } + } + + my @rich_boards =(0x3000,0x3001,0x3002,0x3003,0x3004,0x3010,0x3011,0x3012,0x3013,0x3014,0x3020, + 0x3021,0x3022,0x3023,0x3024,0x3030,0x3031,0x3032,0x3033,0x3034,0x3040,0x3041, + 0x3042,0x3043,0x3044,0x3050,0x3051,0x3052,0x3053,0x3054,0x8300,0x8301,0x8310, + 0x8311,0x8320,0x8321); + + + my @tof_boards =(0x4c00,0x4c10,0x4c20,0x4c30,0x4c31,0x4c40,0x4c50,0x8600,0x8601); + + my @rpc_boards =(0x4800,0x4801,0x4802,0x4803,0x4810,0x4811,0x4812,0x4813,0x4820,0x4821,0x4822, + 0x4823,0x4830,0x4831,0x4832,0x4833,0x4840,0x4841,0x4842,0x4843,0x4850,0x4851, + 0x4852,0x4853,0x8400,0x8401,0x8410,0x8411); + + my @other_boards =( + #shower + 0x3200,0x3201,0x3202,0x3210,0x3211,0x3212,0x3220,0x3221,0x3222,0x3230,0x3231,0x3232,0x3240,0x3241,0x3242, + 0x3250,0x3251,0x3252, + #shower-hub + 0x8500,0x8501, + #cts + 0x0002,0x0003, + #central hub + 0x8000,0x8001, + #start/veto + 0x4000, + #start/veto hub + 0x8800,0x8801, + #fw + 0x4400,0x4410,0x4420, + #fw hub + 0x8700,0x8701 + ); + + ###strip the register value + for (my $k = 0; $k < scalar @result; $k += 2) { + push @all_boards, $result[$k]; + } + + ###mdc + my(%mdc_mask, @mdc_results); + $mdc_results[$_] = [] foreach (0 .. 7); + foreach my $element (@all_boards) { $mdc_mask{$element} |= 1 } + foreach my $element (@mdc_boards) { $mdc_mask{$element} |= 2 } + foreach my $element (@QA::mdc_boards_removed) { $mdc_mask{$element} |= 4 } + foreach my $element (keys %mdc_mask) { + push @{$mdc_results[0]}, sprintf("0x%x",$element); + push @{$mdc_results[$mdc_mask{$element}]}, sprintf("0x%x",$element); + } + + my $num_mdc_missing = (scalar @{$mdc_results[2]}); + my $num_mdc_mistake = (scalar @{$mdc_results[4]}); + my @sorted_mdc_results = sort @{$mdc_results[2]}; + + my $title = "MDC system"; + my $value = "OK"; + if ($num_mdc_missing > 0) {$value = "$num_mdc_missing missing";} + if ($num_mdc_mistake > 0) {$value = "Check Script";} + my $longtext = ""; + if ($num_mdc_missing > 0) {$longtext = "Endp @sorted_mdc_results missing"}; + if ($num_mdc_mistake > 0) {$longtext .= " Endp @{$mdc_results[4]} not known";} + + + my $qastate = QA::GetQAState('below',$num_mdc_missing,@QA::MdcEndpMissingLimits); + Hmon::Speak('mdcmiss',"$num_mdc_missing MDC Frontends missing") if($qastate > 60); + QA::WriteQALog($flog,"endp","mdc",$waittime,$qastate,$title,$value,$longtext); + if($qastate > 60) { + system("logger -p local1.info -t DAQ Endp \\ $longtext") unless (($timecnt->{mdc}++)%$loggerperiod); + } + else {$timecnt->{mdc} = 0;} + + ###rich + my(%rich_mask, @rich_results); + $rich_results[$_] = [] foreach (0 .. 7); + foreach my $element (@all_boards) { $rich_mask{$element} |= 1 } + foreach my $element (@rich_boards) { $rich_mask{$element} |= 2 } + foreach my $element (@QA::rich_boards_removed) { $rich_mask{$element} |= 4 } + foreach my $element (keys %rich_mask) { + push @{$rich_results[0]}, sprintf("0x%x",$element); + push @{$rich_results[$rich_mask{$element}]}, sprintf("0x%x",$element); + } + + my $num_rich_missing = (scalar @{$rich_results[2]}); + my $num_rich_mistake = (scalar @{$rich_results[4]}); + my @sorted_rich_results = sort @{$rich_results[2]}; + + my $rich_title = "RICH system"; + my $rich_value = "OK"; + if ($num_rich_missing > 0) {$rich_value = "$num_rich_missing missing";} + if ($num_rich_mistake > 0) {$rich_value = "Check Script";} + my $rich_longtext = ""; + if ($num_rich_missing > 0) {$rich_longtext = "Endp @sorted_rich_results missing"}; + if ($num_rich_mistake > 0) {$rich_longtext .= " Endp @{$rich_results[4]} not known";} + + $qastate = QA::GetQAState('below',$num_rich_missing,@QA::RichEndpMissingLimits); + Hmon::Speak('richmiss',"$num_rich_missing Rich Frontends missing") if($qastate > 60); + QA::WriteQALog($flog,"endp","rich",$waittime,$qastate, + $rich_title,$rich_value,$rich_longtext); + if($qastate > 60) { + system("logger -p local1.info -t DAQ Endp \\ $rich_longtext") unless (($timecnt->{rich}++)%$loggerperiod); + } + else {$timecnt->{rich} = 0;} + + + ###tof + my(%tof_mask, @tof_results); + $tof_results[$_] = [] foreach (0 .. 7); + foreach my $element (@all_boards) { $tof_mask{$element} |= 1 } + foreach my $element (@tof_boards) { $tof_mask{$element} |= 2 } + foreach my $element (@QA::tof_boards_removed) { $tof_mask{$element} |= 4 } + foreach my $element (keys %tof_mask) { + push @{$tof_results[0]}, sprintf("0x%x",$element); + push @{$tof_results[$tof_mask{$element}]}, sprintf("0x%x",$element); + } + + my $num_tof_missing = (scalar @{$tof_results[2]}); + my $num_tof_mistake = (scalar @{$tof_results[4]}); + my @sorted_tof_results = sort @{$tof_results[2]}; + + my $tof_title = "TOF system"; + my $tof_value = "OK"; + if ($num_tof_missing > 0) {$tof_value = "$num_tof_missing missing";} + if ($num_tof_mistake > 0) {$tof_value = "Check Script";} + my $tof_longtext = ""; + #if ($num_tof_missing > 0) {$tof_longtext = "Endp @{$tof_results[2]} missing"}; + if ($num_tof_missing > 0) {$tof_longtext = "Endp @sorted_tof_results missing"}; + if ($num_tof_mistake > 0) {$tof_longtext .= " Endp @{$tof_results[4]} not known";} + + $qastate = QA::GetQAState('below',$num_tof_missing,@QA::TofEndpMissingLimits); + Hmon::Speak('tofmiss',"$num_tof_missing Tof Frontends missing") if($qastate > 60); + QA::WriteQALog($flog,"endp","tof",$waittime,$qastate, + $tof_title,$tof_value,$tof_longtext); + if($qastate > 60) { + system("logger -p local1.info -t DAQ Endp \\ $tof_longtext") unless (($timecnt->{tof}++)%$loggerperiod); + } + else {$timecnt->{tof} = 0;} + + + ###rpc + my(%rpc_mask, @rpc_results); + $rpc_results[$_] = [] foreach (0 .. 7); + foreach my $element (@all_boards) { $rpc_mask{$element} |= 1 } + foreach my $element (@rpc_boards) { $rpc_mask{$element} |= 2 } + foreach my $element (@QA::rpc_boards_removed) { $rpc_mask{$element} |= 4 } + foreach my $element (keys %rpc_mask) { + push @{$rpc_results[0]}, sprintf("0x%x",$element); + push @{$rpc_results[$rpc_mask{$element}]}, sprintf("0x%x",$element); + } + + my $num_rpc_missing = (scalar @{$rpc_results[2]}); + my $num_rpc_mistake = (scalar @{$rpc_results[4]}); + my @sorted_rpc_results = sort @{$rpc_results[2]}; + + my $rpc_title = "RPC system"; + my $rpc_value = "OK"; + if ($num_rpc_missing > 0) {$rpc_value = "$num_rpc_missing missing";} + if ($num_rpc_mistake > 0) {$rpc_value = "Check Script";} + my $rpc_longtext = ""; + if ($num_rpc_missing > 0) {$rpc_longtext = "Endp @sorted_rpc_results missing"}; + if ($num_rpc_mistake > 0) {$rpc_longtext .= " Endp @{$rpc_results[4]} not known";} + + $qastate = QA::GetQAState('below',$num_rpc_missing,@QA::RpcEndpMissingLimits); + Hmon::Speak('rpcmiss',"$num_rpc_missing RPC Frontends missing") if($qastate > 60); + QA::WriteQALog($flog,"endp","rpc",$waittime,$qastate, + $rpc_title,$rpc_value,$rpc_longtext); + if($qastate > 60) { + system("logger -p local1.info -t DAQ Endp \\ $rpc_longtext") unless (($timecnt->{rpc}++)%$loggerperiod); + } + + ###other + my(%other_mask, @other_results); + $other_results[$_] = [] foreach (0 .. 7); + foreach my $element (@all_boards) { $other_mask{$element} |= 1 } + foreach my $element (@other_boards) { $other_mask{$element} |= 2 } + foreach my $element (@QA::other_boards_removed) { $other_mask{$element} |= 4 } + foreach my $element (keys %other_mask) { + push @{$other_results[0]}, sprintf("0x%x",$element); + push @{$other_results[$other_mask{$element}]}, sprintf("0x%x",$element); + } + + my $num_other_missing = (scalar @{$other_results[2]}); + my $num_other_mistake = (scalar @{$other_results[4]}); + my @sorted_other_results = sort @{$other_results[2]}; + + my $other_title = "Sh/FW/S/V/CTS"; + my $other_value = "OK"; + if ($num_other_missing > 0) {$other_value = "$num_other_missing missing";} + if ($num_other_mistake > 0) {$other_value = "Check Script";} + my $other_longtext = ""; + if ($num_other_missing > 0) {$other_longtext = "Endp @sorted_other_results missing"}; + if ($num_other_mistake > 0) {$other_longtext .= " Endp @{$other_results[4]} not known";} + + + $qastate = QA::GetQAState('below',$num_other_missing,@QA::OtherEndpMissingLimits); + Hmon::Speak('othermiss',"$num_other_missing Frontends missing") if($qastate > 60); + QA::WriteQALog($flog,"endp","other",$waittime,$qastate, + $other_title,$other_value,$other_longtext); + if($qastate > 60) { + system("logger -p local1.info -t DAQ Endp \\ $other_longtext") unless (($timecnt->{oth}++)%$loggerperiod); + } + else {$timecnt->{oth} = 0;} + + sleep(5); +} diff --git a/hmon/hmon_eventrate.pl b/hmon/hmon_eventrate.pl new file mode 100755 index 0000000..bf45792 --- /dev/null +++ b/hmon/hmon_eventrate.pl @@ -0,0 +1,41 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Hmon; + +my $str = ""; + + +$str = Hmon::MakeTitle(9,8,"Event Rates",0); +#$str .= "\n#ADDFILE files/eventratehist.svg\n"; +$str .= "\n"; +$str .= Hmon::MakeFooter(); +Hmon::WriteFile("eventrate",$str); + +$str = Hmon::MakeTitle(9,7,"Event Rates",0); +#$str .= "\n#ADDFILE files/eventratehist.svg\n"; +$str .= "\n"; +$str .= Hmon::MakeFooter(); +Hmon::WriteFile("eventratelong",$str); + +$str = Hmon::MakeTitle(9,8,"Event Rates",0); +#$str .= "\n#ADDFILE files/eventratehist.svg\n"; +$str .= "\n"; +$str .= Hmon::MakeFooter(); +Hmon::WriteFile("eventrateshort",$str); + +my $f = fork(); +if($f) { + qx(./hmon_hadplotnew.sh -d 50 -o 20 -n 1200 -yscale 1000 -yoverflow 65.536 -ytitle "Event Rate [kHz]" -xtitle "" -output "PNG.files/eventratehist.700.365" eventrate); + } +else { + my $g = fork(); + if($g) { + qx(./hmon_hadplotnew.sh -d 400 -o 5 -n 1500 -yscale 1000 -yoverflow 65.536 -ytitle "Event Rate [kHz]" -xtitle "" -output "PNG.files/eventratehistlong.700.315" eventrate); + } + else{ + qx(./hmon_hadplotnew.sh -d 10 -o 50 -n 1000 -yscale 1000 -yoverflow 65.536 -ytitle "Event Rate [kHz]" -xtitle "" -output "PNG.files/eventratehistshort.700.365" eventrate); + } + } + diff --git a/hmon/hmon_filllevel.pl b/hmon/hmon_filllevel.pl new file mode 100755 index 0000000..527d45c --- /dev/null +++ b/hmon/hmon_filllevel.pl @@ -0,0 +1,52 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HADES::TrbNet; + +trb_init_ports() or die trb_strerror(); + +my $fqa = QA::OpenQAFile(); + +while (1) { + my $msg = ""; + my $cnt = 0; + + + my $data_oep = trb_register_read(0xfffd, 0x7100) or sleep 5 and next; + my $data_shw = trb_register_read_mem(0xfff7, 0x7100,0,6) or sleep 5 and next; + my $data_trb = trb_register_read(0xffef, 0x7100) or sleep 5 and next; + my $data_lvl1 = trb_register_read(0x3000, 0x1) or sleep 5 and next; + +# print Dumper $data_trb; + + my $maxoep = 0; + foreach my $o (values %$data_oep) { + if (($o & 0xFFFF ) > $maxoep) { + $maxoep = $o & 0xFFFF; + } + } + + my $maxshw = 0; + foreach my $o (values %$data_shw) { + for my $i (0..5) { + if (($o->[$i] & 0xFFFF) > $maxshw) { + $maxshw = $o->[$i] & 0xFFFF; + } + } + } + + my $maxtrb = 0; + my $i = 0; + foreach my $o (values %$data_trb) { + if (($o & 0xFFFF) > $maxtrb) { + $maxtrb = $o & 0xFFFF; + } + } + +# print("$maxoep, $maxshw, $maxtrb\n"); + + sleep(10); + } \ No newline at end of file diff --git a/hmon/hmon_gberate.pl b/hmon/hmon_gberate.pl new file mode 100755 index 0000000..5128499 --- /dev/null +++ b/hmon/hmon_gberate.pl @@ -0,0 +1,18 @@ +#!/usr/bin/perl -w + +use Hmon; + +my $str; + + $str = Hmon::MakeTitle(6,6,"GbE Data Rates",0); +# $str .= "\n"; +# $str .= "\n#ADDFILE files/gberate.svg\n"; + $str .= "\n"; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("GbeRate",$str); + + +system('./hmon_hadplot.sh -yscale 1024 -yoverflow 4096 -ytitle "Data Rate [MiB]" -ymax 52 -output "PNG.files/gberate.460.265" gberate &'); + + +# diff --git a/hmon/hmon_hadplot.sh b/hmon/hmon_hadplot.sh new file mode 100755 index 0000000..d1e9277 --- /dev/null +++ b/hmon/hmon_hadplot.sh @@ -0,0 +1,1455 @@ +#!/usr/bin/perl -w +use warnings; + +use FileHandle; +use Time::HiRes qw( gettimeofday usleep time ); +use Getopt::Long; +use Data::Dumper; +use POSIX qw/floor strftime/; + +use constant AXISISTIME => 1; +use constant AXISISNOTIME => 0; +use constant DIFFY => 1; +use constant DIFFX => 1; +use constant NODIFFY => 0; +use constant NODIFFX => 0; +use constant NODELAY => 0; +use constant NO => 0; +use constant YES => 1; +use constant NONEWLINE => 1; + +my $GPbuffer = ""; +my $buffercount = 0; + +my $windowtitle = ""; #Global var to store real name of GUI window + +my $PlotBuffer = {}; +my $PlotBufferCnt = 0; + +my @PlotBufArr = (); + +#my @color = ("#1155bb","#bb1111","#999900","#660000","#006633","#990066","#6633CC","#00CCCC"); +my @color = ("#2222dd","#880000","#00cc00","#ee00dd","#ffcc00","#00cc88","#6633CC","#00CCCC"); +our $write2file = ""; +our $plotendedbefore = 0; + + + +################################################# +# Variables... +################################################# +my $delay = 1000; +my $samples = 100; +my $downscale = 1; +# my $system = 0; +my $address = []; +my $register = []; +my $regoffset = []; +my $regwidth = []; +my $title = []; +my $timeref = []; +my $geom = "700x400"; +my $style = 0; +my $nametmp = ""; +my $regamount = []; +my $xscale = []; +my $yscale = []; +my $xtitle = ""; +my $ytitle = ""; +my $windowname = "No Name"; +my $xistime = AXISISNOTIME; +my $xoverflow = []; +my $yoverflow = []; +my $ydiff = 0; +my $outputcfg = ""; +my $name = "HadPlot"; +my $key ; +my $curvestyle= 'points'; #points, steps, histo or histostacked +my $xticks = 0; #show labels on x-axis +my $yticks = 1; #show labels on y-axis +my $plotoption= ""; #string with additional gnuplot commands +my $curveoption= []; #options for plot command +my $xgrid = 1; +my $ygrid = 1; +my $ymax; +my $ymin; +my $xmin; +my $xmax; + +GetOptions('d=i' => \$delay, + 'n=i' => \$samples, + 'o=i' => \$downscale, + 'a=s' => $address, + 'r=s' => $register, + 'w=i' => $regwidth, + 'p=i' => $regoffset, + 't=s' => $title, + 'm=i' => $regamount, + 'g=s' => \$geom, + 'z=i' => \$style, + 'output=s' => \$outputcfg, + 'windowname=s' => \$windowname, + 'xscale=f' => $xscale, + 'yscale=f' => $yscale, + 'xtitle=s' => \$xtitle, + 'ytitle=s' => \$ytitle, + 'xistime!' => \$xistime, + 'timeref=s' => $timeref, + 'xoverflow=f' => $xoverflow, + 'yoverflow=f' => $yoverflow, + 'ydiff!' => \$ydiff, + 'name=s' => \$name, + 'key!' => \$key, + 'xticks!' => \$xticks, + 'yticks!' => \$yticks, + 'xgrid!' => \$xgrid, + 'ygrid!' => \$ygrid, + 'ymax=i' => \$ymax, + 'ymin=i' => \$ymin, + 'xmax=i' => \$xmax, + 'xmin=i' => \$xmin, + 'curvestyle=s' => \$curvestyle, + 'curveoption=s'=> $curveoption, + 'plotoption=s' => \$plotoption + ); + +for(my $i=0;$i<16;$i++) { + $regoffset->[$i] = 0 unless defined $regoffset->[$i]; + $regwidth->[$i] = 32 unless defined $regwidth->[$i]; + $xoverflow->[$i] = 2**20 unless defined $xoverflow->[$i]; + $yoverflow->[$i] = 2**32 unless defined $yoverflow->[$i]; + $xscale->[$i] = 1 unless defined $xscale->[$i]; + $yscale->[$i] = 1 unless defined $yscale->[$i]; + $title->[$i] = "" unless defined $title->[$i]; + $curveoption->[$i] = "" unless defined $curveoption->[$i]; + } + +for(my $i=0;$i < scalar @{$address};$i++) { + if(!defined($title->[$i])) { + $title->[$i] = hex($address->[$i])." $register->[$i] $regoffset->[$i]..".($regoffset->[$i]+$regwidth->[$i]-1); + } + } + + +$delay *= 1000; +if($style == 1) {$curvestyle="points"; $xticks=1;} +if($style == 2) {$curvestyle="histo"; $xticks=0;} +if($style == 3) {$curvestyle="histo"; $xticks=1;} +if($style == 4) {$curvestyle="histostacked"; $xticks=0;} +if($style == 5) {$curvestyle="histostacked"; $xticks=1;} + + + +#Open Gnuplot +our $fh; +my $fn = "gnuplot -geometry $geom -bg 'ghost white'"; +$fh = new FileHandle ("|$fn") or die "error: no gnuplot"; +$fh->autoflush(1); + + +sub makeTimeString{ + return strftime("set label 100 \"%H:%M:%S\" at screen 0.02,0.02 left tc rgb \"#000044\" font \"monospace,8\"\n", localtime()) + } + +################################################# +# When exiting, close Gnuplot window +################################################# +sub finish { + print $fh "exit;\n"; + close $fh; + exit; +} + +$SIG{INT} = \&finish; +$SIG{PIPE} = \&finish; + + + +my $last_wakeup; + +sub max { + my $a = shift; + my $b = shift; + return $a > $b ? $a : $b; + } + +sub min { + my $a = shift; + my $b = shift; + return $a < $b ? $a : $b; + } + +sub usleep_total { + my $delay = shift; + if(defined $last_wakeup) { + my $time = time(); +# printf "%.0f\n",$delay-($time-$last_wakeup)*1E6; + usleep(max(0,$delay-($time-$last_wakeup)*1E6)); + } + else { + usleep($delay); + } + $last_wakeup = time(); + return $last_wakeup; + } + + +################################################# +# Write to gnuplot +################################################# +sub plot_write { + my ($str,$no) = @_; + if(defined($no) && $no) { + print $fh $str; +# print $str; + } + else { + print $fh $str."\n"; +# print $str."\n"; + } + } + +sub plot_add { + my ($x,$y) = @_; + $x = $x || $PlotBufferCnt; + $PlotBufArr[$PlotBufferCnt]->{x} = $x; + $PlotBufArr[$PlotBufferCnt]->{y} = $y; + + $PlotBufferCnt++; +# $PlotBuffer->{$x} = $y; +# print $x." ".$y."\n"; + } + +sub plot_end { + my ($single) = @_; + for(my $i = 0;$i{y}."\n"; + } + else { + print $fh $PlotBufArr[$i]->{x}." ".$PlotBufArr[$i]->{y}."\n"; + } + } +# foreach my $line (sort keys %{$PlotBuffer}) { +# if($single) { +# print $fh $PlotBuffer->{$line}."\n"; +# # print "plot_end: ".$PlotBuffer->{$line}."\n"; +# } +# else { +# print $fh $line." ".$PlotBuffer->{$line}."\n"; +# # print "plot_end: ".$line." ".$PlotBuffer->{$line}."\n"; +# } +# } + @PlotBufArr = (); + $PlotBuffer = {}; + $PlotBufferCnt = 0; + print $fh "e\n"; + $plotendedbefore = 1 unless $plotendedbefore; + } + + +sub plot_reset { + if($write2file eq ""){ + system("xwininfo -name '$windowtitle' >/dev/null 2>/dev/null"); + #print $?."\n"; + if($? != 0) { + usleep(1E5); + system("xwininfo -name '$windowtitle' >/dev/null 2>/dev/null"); + if($? != 0) { + finish(); + } + } + if ($plotendedbefore != 0) { + $plotendedbefore = 0; +# my $datestring = makeTimeString(); + print $fh makeTimeString(); + print $fh "replot\n"; + } + } + else { + if ($plotendedbefore != 0) { + system("mv $write2file.tmp $write2file"); + plot_write("set out \"$write2file.tmp\"\n"); + $plotendedbefore = 0; +# my $datestring = makeTimeString(); + print $fh makeTimeString(); + print $fh "replot\n"; + +# print "reset\n"; + } + } + } + +sub plot_finished { + my ($store) = @_; + if($write2file ne "") { + if(defined $store) { + if($store->{"initing"} != 2 and $store->{"iteration"} % $store->{"downscale"} == 0) { +# system("mv $write2file.tmp $write2file"); + } + } + else { + if($write2file ne "") { +# system("mv $write2file.tmp $write2file"); + } + } + } + } + +sub plot_init { + my ($xtics) = @_; + $windowtitle = $name ." - ".$windowname; + if ($outputcfg =~ m$PNG.([/\w]*).(\d+).(\d+)$) { + print "Writing PNG to file $1\n"; + $write2file = $1.".png"; + plot_write("set term png size $2,$3 font \"monospace,8\""); + plot_write("set out \"$write2file.tmp\""); + } + elsif ($outputcfg =~ m$SVG.([/\w]*).(\d+).(\d+)$) { + print "Writing SVG to file $1\n"; + $write2file = $1.".svg"; + plot_write("set term svg size ".($2*2).",".($3*2)." dynamic font \"monospace,18\" lw 1.5 \n"); + plot_write("set out \"$write2file.tmp\"\n"); + } + else { + plot_write("set term x11 title '$windowtitle'"); + } + plot_write("set grid"); + plot_write("set xlabel \"$xtitle\""); + plot_write("set ylabel \"$ytitle\""); + + plot_write(makeTimeString()); + + if(defined $xtics) { + plot_write("set xtics $xtics\n"); + } + if(defined $xmin && defined $xmax) { + plot_write("set xrange [$xmin:$xmax]"); + } + if(defined $ymin && defined $ymax) { + plot_write("set yrange [$ymin:$ymax]"); + } + elsif(defined $ymax) { + plot_write("set yrange [:$ymax]"); + } + elsif(defined $ymin) { + plot_write("set yrange [$ymin:]"); + } + if (!defined $key || $key == 0) { + plot_write("unset key"); + } + if($xgrid == 0) { + plot_write("set grid noxtics"); + } + if($ygrid == 0) { + plot_write("set grid noytics"); + } + if($plotoption ne "") { + plot_write($plotoption); + } + } + +sub plot_sleep { + my ($delay) = @_; + my $t = usleep_total($delay); + plot_reset(); + return $t; + } + +sub plot_end_sleep { + my ($delay,$single) = @_; + plot_end($single); + return plot_sleep($delay); + } + +sub plot_storage_end_sleep { + my ($store, $single) = @_; + my $delay = $store->{"delay"}; + my $t; + if($store->{"initing"} == 0) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + plot_end($single); + $t = usleep_total($delay); + plot_reset(); + } + else { + $t = usleep_total($delay); + } + } + return $t; + } + +sub plot_storage_sleep { + my ($store,$noreset) = @_; + my $t; + my $delay = $store->{"delay"}; + #print $store->{"initing"}.$store->{"iteration"}.$store->{"downscale"}."\n"; + if($store->{"initing"} != 2) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + $t = usleep_total($delay); + plot_storage_reset() unless $noreset; + } + else { + $t = usleep_total($delay); + } + } + return $t; + } + +sub plot_storage_reset { + my ($store) = @_; + if(defined $store->{"initing"} && $store->{"initing"} != 2) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + plot_reset(); + } + } + } + +sub plot_storage_end { + my ($store) = @_; + if($store->{"initing"} == 0) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + plot_end(); + } + } + } + +################################################# +# Writes a new value pair to storage +################################################# +sub store_push { + my ($storage,$x,$y,$divtime) = @_; + my $xval = $x; + my $yval = $y; + my $curtime = time(); + + if ($storage->{"initing"} != 2) { + if (scalar(@{$storage->{"datax"}}) == $storage->{"size"}) { + my $tmp = shift(@{$storage->{"datax"}}); + my $tmpy = shift(@{$storage->{"datay"}}); + $storage->{"totalx"} -= $tmp; +# if($storage->{"initing"} == 0 && (($tmpy <= $storage->{"miny"}) || ($tmpy >= $storage->{"maxy"}))) { +# store_calc_range($storage); +# } + } + if($storage->{"diffx"}) { + if(defined($storage->{"xmax"}) && $x < $storage->{"lastx"}) { + $xval = ($x - $storage->{"lastx"} + $storage->{"xmax"}); + } + else { + $xval = ($x - $storage->{"lastx"}); + } + if(defined($storage->{"last_push"}) && $storage->{"last_push"} != 0) { + while (floor($xval/$storage->{"xmax"}) < floor(($curtime - $storage->{"last_push"})/($storage->{"xmax"}/1E6))){ + $xval += $storage->{"xmax"}; + } + } + } + if($storage->{"diffy"}) { + $yval = $y - $storage->{"lasty"}; + if(defined($storage->{"ymax"}) && $y < $storage->{"lasty"}) { + while($yval < 0) { + $yval += $storage->{"ymax"}; + } + } + if($divtime) { + $yval /= ($xval?$xval:1)/1000000; + } + } + + + if($storage->{"initing"} == 1) { + $storage->{"initing"} = 0; + for(my $i = $storage->{"size"}-1; $i>0; $i--) { + push(@{$storage->{"datax"}},$storage->{"delay"}); + push(@{$storage->{"datay"}},$yval); + $storage->{"totalx"} += $storage->{"delay"}; + } + } + + push(@{$storage->{"datax"}},$xval?$xval:0); + push(@{$storage->{"datay"}},$yval?$yval:0); + $storage->{"totalx"} += $xval?$xval:0; + } + else { + $storage->{"initing"} = 1; + } + + $storage->{"last_push"} = $curtime; + $storage->{"lasty"} = $y; + $storage->{"lastx"} = $x; + } + +################################################# +# Writes storage contents to stream +################################################# +sub store_print { + my $str = ""; + my ($storage) = @_; + if($storage->{"initing"} != 2) { + if($storage->{"iteration"} % $storage->{"downscale"} == 0) { + my $xcnt = - $storage->{"totalx"} /1000000.0; + for (my $i = 0; $i < $storage->{"size"}; $i++) { + my $xval = $storage->{"datax"}->[$i]; #${}[] + my $yval = $storage->{"datay"}->[$i]; + $xval = 0 unless defined($xval); + $yval = 0 unless defined($yval); + $xcnt += $xval/1000000.0; +# $str .= $xcnt." ".$yval."\n"; + $str .= sprintf "%.3f %.2f\n", $xcnt,$yval; + #plot_write($xcnt/1000000.0." ".$yval); + } + plot_write($str,1); +# print $str; + plot_end(1); + } + $storage->{"iteration"}++; + } + } + + +################################################# +# Initialize storage +################################################# +sub store_init { + my ($storage,$size,$diffx,$diffy,$delay,$downscale,$xmax,$ymax) = @_; + + $storage->{"datax"} = []; + $storage->{"datay"} = []; + $storage->{"size"} = $size; + $storage->{"diffx"} = $diffx; + $storage->{"diffy"} = $diffy; + $storage->{"delay"} = $delay; + $storage->{"downscale"} = $downscale; + $storage->{"initing"} = 2; + $storage->{"iteration"} = 0; + $storage->{"totalx"} = 0; + $storage->{"xmax"} = $xmax; + $storage->{"ymax"} = $ymax; + $storage->{"maxy"} = 0; + $storage->{"miny"} = 1E100; + $storage->{"last_push"} = 0; + $storage->{"last_sleep"} = 0; + } + +################################################# +# Help Message +################################################# +sub help { + print <[$i])) || ($title->[$i] eq "")) { +# $title->[$i] = hex($address->[$i])." ".$register->[$i]." ".$regoff->[$i]."..".($regoff->[$i]+$regwidth->[$i]-1); +# } + if (!(defined $regamount->[$i])) { + $regamount->[$i] = 1; + } + } + $ymin = $regoff->[0]; + $ymax = $regoff->[0]+$regwidth->[0]; + plot_init(256); +# if ($style == 0) { +# plot_write("plot",1); +# for(my $i = 0; $i[$i]\" ",1); +# plot_write(", ",1) unless $i == scalar(@{$address})-1; +# } +# plot_write(""); +# } +# elsif($style == 1) { + plot_write("set xtics rotate by 90 offset .7,-2 scale 0 "); + plot_write("set style fill solid 1.00 border -1"); + plot_write("set boxwidth 1 absolute"); + plot_write("unset key"); + plot_write('set format x "%x"'); + plot_write("plot ",1); + for(my $i = 0; $i[$i]\" ",1); #using 2:xticlabels(1) + plot_write(", ",1) unless $i == scalar(@{$address})-1; + } + plot_write(""); +# } + while(1) { + for(my $i = 0; $i[$i] == 1) { + $c = "trbcmd r $address->[$i] $register->[$i] | sort"; + } + else { + $c = "trbcmd rm $address->[$i] $register->[$i] $regamount->[$i] 0"; + } + my @out = qx($c); + my $addr = undef; + my $cnt = 0; + foreach my $s (@out) { + if($s =~ /^H:\s*0x(\w\w\w\w)/) { + $addr = $1; + } + if($s =~ /^0x(\w\w\w\w)\s*0x(\w{8})/) { + $addr = hex($1) if($regamount->[$i] == 1); + if ($regamount->[$i] == 1) { plot_add($addr,-1); } + else { plot_add("\"$addr.$1\"",-1); } + for(my $j = $regoff->[$i]; $j < $regoff->[$i] + $regwidth->[$i];$j++) { + if(hex($2) & (1<<$j)) { + if ($regamount->[$i] == 1) { plot_add("$addr",$j); } + else { plot_add("\"$addr.$1\"",$j); } + } + } + $cnt++; + } + } + plot_end(1); + } + plot_sleep($delay); + } + } + + + +################################################# +# Generic Register differences +################################################# +sub genreg { + my %oldvals; + + plot_init(undef); + + if($xticks) { + plot_write("set xtics rotate by 90 offset .7,-1.7 scale .7 "); + } + if($curvestyle eq "histo") { + plot_write("set style fill solid 1.00 border -1"); + plot_write("set boxwidth 2 absolute"); + } + elsif($curvestyle eq "histostacked") { + plot_write("set style fill solid 1.00 border -1"); + plot_write("set style histogram rowstacked"); + plot_write("set boxwidth 1 absolute"); + plot_write("set key outside") unless defined $key && $key==0; + plot_write("set autoscale xfix "); + } + + plot_write("plot",1); + for(my $i = 0; $i[$i]\" ",NONEWLINE); + } + elsif ($curvestyle eq "steps") { + plot_write("with histeps title \"$title->[$i]\" ",NONEWLINE); + } + else { + plot_write("with points pt 5 title \"$title->[$i]\" ",NONEWLINE); + } + plot_write(" ".$curveoption->[$i],NONEWLINE); + plot_write(", ",NONEWLINE) unless $i == scalar(@{$address})-1; + } + plot_write(""); + + + while(1) { + for(my $i = 0; $i[$i]) || $regamount->[$i] == 1) { + $c = "trbcmd r $address->[$i] $register->[$i] | sort"; + } + else { + $c = "trbcmd rm $address->[$i] $register->[$i] $regamount->[$i] 0"; + } + my @out = qx($c); + my $addr = undef; + foreach my $s (@out) { + if($s =~ /^H:\s*0x(\w\w\w\w)/) { + $addr = $1; + $cnt = -1; + } + if($s =~ /^0x(\w{4})\s*0x(\w{8})/) { + my $tmp = (hex($2)>>$regoffset->[$i])&(2**$regwidth->[$i]-1); + my $val = 0; + my $board = $1; + if(defined $addr) {$board = $addr;} + $cnt++; + my $reg = $1; + if($ydiff) { + if(defined $oldvals{$i}->{$board.$reg}) { + if ($oldvals{$i}->{$board.$reg} > $tmp) { + $val = $tmp - $oldvals{$i}->{$board.$reg} + 2**$regwidth->[$i]; + } + else { + $val = $tmp - $oldvals{$i}->{$board.$reg}; + } + } + $oldvals{$i}->{$board.$reg} = $tmp; + } + else { + $val = $tmp; + } + if($xticks) { + if (!(defined $regamount->[$i]) || $regamount->[$i] == 1) { + plot_add("\"$board\"",$val/($yscale->[$i]||1)); + } + else { + plot_add("\"$board.$reg\"",$val/($yscale->[$i]||1)); + } + } + else { + plot_add("",$val/($yscale->[$i]||1)); + } + } + } + plot_end(!$xticks); + } + plot_sleep($delay); + } + } + +################################################# +# Generic Histogram +################################################# +sub genhist { + my %storearr; + my %oldvals; +# $xtitle = "Time [s]" unless $xtitle ne ""; + plot_init(); + plot_write("set autoscale fix"); + plot_write("plot",1); + $diff = 0 unless defined($diff); + for(my $i = 0; $i[$i],$yoverflow->[$i]); + plot_write("'-' with lines title \"$title->[$i]\" ",1); + plot_write(", ",1) unless $i == scalar(@{$address})-1; + } + plot_write(""); + + while(1) { + my $a, my $s, my $t; + my $val = 0 , my $time; + plot_storage_reset($storearr{0}); + for(my $i = 0; $i>($regoffset->[$i]))&(2**($regwidth->[$i])-1)); + $time = hex($t)*16; + } + } + store_push($storearr{$i},$time/$xscale->[$i],$val/($yscale->[$i]||1),AXISISTIME); + store_print($storearr{$i}); + } + plot_storage_sleep($storearr{0}); + plot_finished($storearr{0}); + } + } + +################################################# +# Deadtime histogram +################################################# +sub deadtimehist2 { + my %values, my %lastvalues, my %diffvalues; + my @keys = ("33","34","36","31","38","37","3b","35"); + my @keys2 = ("43","44","46","41","48","47","4b","45"); + my @names = ("MDC12","MDC34","TOF","RPC","RICH","SHW","Start","FW"); + my %storearr; + + if ($style != 0) { + for(my $i= 0; $i < scalar(@keys); $i++) { + $storearr{$keys[$i]} = {}; + store_init($storearr{$keys[$i]},$samples,0,0,$delay*.0,$downscale,2**32,2**32); + } + for(my $i= 0; $i < scalar(@keys2); $i++) { + $storearr{$keys2[$i]} = {}; + store_init($storearr{$keys2[$i]},$samples,0,0,$delay*.0,$downscale,2**32,2**32); + } + } + + plot_init(); + plot_write("set key left top Left"); + plot_write("set autoscale fix"); + plot_write("set yrange [-1:101]"); + + if ($style != 0) { + plot_write("plot ",1); + plot_write("\"-\" title \"MDC12\" with lines,",1); + plot_write("\"-\" title \"MDC34\" with lines,",1); + plot_write("\"-\" title \"TOF\" with lines,",1); + plot_write("\"-\" title \"RPC\" with lines,",1); + plot_write("\"-\" title \"RICH\" with lines,",1); + plot_write("\"-\" title \"SHW\" with lines,",1); + plot_write("\"-\" title \"Start\" with lines,",1); + plot_write("\"-\" title \"FW\" with lines"); + } + else { + plot_write("set style fill solid 1.00 border -1"); + plot_write("set grid noxtics ytics"); + plot_write("set boxwidth 2 absolute"); + plot_write("set xtics ('MDC12' 0,'MDC34' 1,'TOF' 2, 'RPC' 3, 'RICH' 4, 'SHW' 5, 'Start' 6, 'FW' 7) offset 2,0 scale 0"); + plot_write("set style histogram title offset character 0, 0, 0"); + plot_write("set style data histograms"); + plot_write("plot \"-\" title 'incl. busy' lt rgb \"#1155bb\", \"-\" title 'excl. busy' lt rgb \"#bb1111\""); + } + my $cmd = sprintf("trbcmd -n-1 -s%d rmt 0x8001 0x4031 31 0",$delay/1000); + if($style != 0) { + $cmd = sprintf("trbcmd -n-1 -s%d rmt 0x8001 0x4031 12 0",$delay/1000); + } + open(FTRB, "$cmd|"); + + while(my $a = ) { + if($a =~ /^0x\w{2}(\w{2})\s*0x(\w{8})\s*0x(\w{4})/) { + $values{$1} = hex($2); + $values{"50"} = hex($3)*16; + } + if ($a eq "---\n") { + $diffvalues{"50"} = 1E6; + if (defined $lastvalues{"50"}) { + if ($values{"50"} > $lastvalues{"50"}) { + $diffvalues{"50"} = $values{"50"} - $lastvalues{"50"}; + } + else { + $diffvalues{"50"} = $values{"50"} - $lastvalues{"50"} + 2**20; + } + } + #$diffvalues{"50"} = $values{"50"} - $lastvalues{"50"} if defined $lastvalues{"50"}; + my $time = $diffvalues{"50"}; + foreach my $key (keys %values) { + next unless hex($key)<0x50; + $diffvalues{$key} = 0; + if (defined $lastvalues{$key}) { + if ($values{$key} >= $lastvalues{$key}) { + $diffvalues{$key} = $values{$key} - $lastvalues{$key}; + } + else { + $diffvalues{$key} = $values{$key} - $lastvalues{$key} + 2**32; + } + } + $diffvalues{$key} /= $time if $time; + #print $key." ".$values{$key}." ".$lastvalues{$key}." ".$diffvalues{$key}."\n"; + } + #print "=====\n"; + $diffvalues{"31"} = max($diffvalues{"31"},$diffvalues{"32"}); + $diffvalues{"38"} = max(max($diffvalues{"38"},$diffvalues{"39"}),$diffvalues{"3a"}); + if ($style == 0) { + $diffvalues{"41"} = max($diffvalues{"41"},$diffvalues{"42"}); + $diffvalues{"48"} = max(max($diffvalues{"48"},$diffvalues{"49"}),$diffvalues{"4a"}); + } + %lastvalues = %values; + if($style != 0) { + plot_storage_reset($storearr{$keys[0]}); + for(my $i= 0; $i < scalar(@keys); $i++) { + store_push($storearr{$keys[$i]},$time,$diffvalues{$keys[$i]},0); + store_print($storearr{$keys[$i]}); + } + plot_storage_sleep($storearr{$keys[0]},1); + plot_finished($storearr{$keys[0]}); + } + else { + plot_reset(); + for(my $i= 0; $i < scalar(@keys); $i++) { + plot_add("",$diffvalues{$keys[$i]}); #"\"".$names[$i]."\"", + } + plot_end(1); + for(my $i= 0; $i < scalar(@keys2); $i++) { + plot_add("",$diffvalues{$keys2[$i]}); #"\"".$names[$i]."\"", + } + plot_end(1); + plot_finished(); + } + } + } + } + + +################################################# +# Select Operation +################################################# + +if(!(defined $ARGV[0]) || $ARGV[0] =~ /help/) {help(); exit;} + +if($ARGV[0] =~ /oep5V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8010,0x8011]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [.5,.5]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["5.8V input","5V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oep3.3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8012,0x8013]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["3.8V input","3.3V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oep1.2V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8014,0x8015]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["1.8V input","1.2V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oep3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8016,0x8017]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["+3V input","-3V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oepminmaxp3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x801e,0x801e]; + $regwidth = [12,12]; + $regoffset = [0,16]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["+3V minimum","+3V maximum"]; + genreg(); + } + +if($ARGV[0] =~ /oepminmaxn3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x801f,0x801f]; + $regwidth = [12,12]; + $regoffset = [0,16]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["-3V minimum","-3V maximum"]; + genreg(); + } + +if($ARGV[0] =~ /oepminmax5Vin/) { + $address = [0xfffd,0xfffd,0xfffd]; + $register = [0x8018,0x8018,0x8010]; + $regwidth = [12,12,12]; + $regoffset = [0,16,0]; + $yscale = [.5,.5,.5]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["5Vin minimum","5Vin maximum","5Vin"]; + genreg(); + } + +if($ARGV[0] =~ /oeptemp/) { + oeptemp(($delay)?$delay:5000000,[$name." - OEP Temperature"]); + } + + +if($ARGV[0] =~ /rpcdatarate/) { + $delay = 1000000 unless $delay; + $xticks = 1 ; + $xtitle = "Sender ((Sector mod 3)*4+TRB)"; + $ytitle = "Data Words /1024"; + $windowname = "Data Words sent by RPC"; + $curvestyle = "histo"; + $key = YES; + $ydiff = DIFFY; + $ymin = 0; + $yscale = [512,512]; + $address = [0x8401,0x8411]; + $register = [0x4001,0x4001]; + $regamount = [12,12]; + $title = ["Sector 0,1,2","Sector 3,4,5"]; + $regoffset = [0,0]; + $regwidth = [32,32]; + genreg(); + } + +#hadplot -a 2 -r 1 -p 0 -w 16 -d 5 -o 200 -n 1000 -yoverflow 65536 genhistdiff + +if($ARGV[0] =~ /eventratehighres/) { + $delay = 5000 ; #unless $delay; + $samples = 1000; # unless $samples; + $downscale = 200;# unless $downscale; +# $style = 0 unless $style; + $windowname = "Eventrate High Resolution"; + $xistime = AXISISTIME; + $ydiff = DIFFY; + $xoverflow = [2**20]; + $title = ["Event rate"]; + $address = [0x2]; + $register = [0x1]; + $regoffset = [0]; + $regwidth = [16]; + $yoverflow = [65536]; + genhist(); + } + + +if($ARGV[0] =~ /eventrate/) { + $address = [0x2]; + $register = [0x1]; + $regwidth = [16]; + $regoffset = [0]; + $timeref = [0x2]; + $delay = 100000 unless $delay; + $samples = 500 unless $samples; + $downscale = 10 unless $downscale; + $windowname = "Event rate history"; + $key = NO; + $ytitle = "Event rate [Hz]" if $ytitle eq ""; + $xistime = AXISISTIME; + $ydiff = DIFFY; + $xoverflow = [2**20]; + $yoverflow = [2**16] unless $yoverflow->[0] != 2**32; + genhist(); + } + +if($ARGV[0] =~ /datarate/) { + $address = [0xff7f]; + $register = [0x83f3]; + $regwidth = [32]; + $regoffset = [0]; + $timeref = [0x8000]; + $delay = 100000 unless $delay; + $samples = 500 unless $samples; + $downscale = 5 unless $downscale; + $windowname = "Total data rate history"; + $xtitle = "Time [s]" unless defined $xtitle; + $ytitle = "Data rate [MiByte]" unless defined $ytitle; + $xistime = AXISISTIME; + $ydiff = DIFFY; + $xoverflow = [2**20]; + $yoverflow = [2**12]; + $yscale = [2**20]; + $key = NO; + genhist(); + } + +if($ARGV[0] =~ /busytime/) { + $delay = 100000 unless $delay; + $samples = 100 unless $samples; + $downscale = 5 unless $downscale; + $style = 1; + $windowname = "Busytime history"; + deadtimehist2(); + } + +if($ARGV[0] =~ /busy/) { + $delay = 100000 unless $delay; + $style = 0; + $windowname = "Busy time"; + deadtimehist2(); + } + +if($ARGV[0] =~ /oepspikehist/) { + $delay = 100000 unless $delay; + $samples = 1000 unless $samples; + $downscale = 10 unless $downscale; +# $style = 0 unless $style; + $windowname = "OEP CMS Spikes"; + $ydiff = DIFFY; + $title = ["OEP CMS Spikes"]; + $address = [0xfffd]; + $register = [7]; + $regoffset = [0]; + $regwidth = [16]; + genhist(); + } + +if($ARGV[0] =~ /oepretrhist/) { + $delay = 500000 unless $delay; + $samples = 600 unless $samples; + $downscale = 2 unless $downscale; + $style = 0 unless $style; + $windowname = "OEP Retransmissions"; + $ydiff = DIFFY; + $title = ["Retransmit Received","Retransmit Sent"]; + $address = [0xfffd,0xfffd]; + $register = [4,4]; + $regoffset = [16,24]; + $regwidth = [8,8]; + genhist(); + } + +if($ARGV[0] =~ /oeptokenmisshist/) { + $delay = 500000 unless $delay; + $samples = 2000 unless $samples; + $downscale = 4 unless $downscale; + $style = 0 unless $style; + $windowname = "OEP Token Missing"; + $ydiff = DIFFY; + $title = ["Missing Tokens"]; + $address = [0xfffd]; + $register = [0x9101]; + $regoffset = [0]; + $regwidth = [24]; + genhist(); + } + + +if($ARGV[0] =~ /oeptrgerrhist/) { + $delay = 500000 unless $delay; + $samples = 2000 unless $samples; + $downscale = 2 unless $downscale; + $style = 0 unless $style; + $windowname = "OEP CMS Errors"; + $ydiff = DIFFY; + $title = ["Spikes","Spurious","Invalid","Multiple"]; + $address = [0xfffd,0xfffd,0xfffd,0xfffd]; + $register = [7,7,6,6]; + $regoffset = [0,16,0,16]; + $regwidth = [16,16,16,16]; + genhist(); + } + + +if($ARGV[0] =~ /histdiff/) { + $delay = 1000000 unless $delay; + $samples = 200 unless $samples; + $downscale = 1 unless $downscale; + $style = 0 unless $style; + $ydiff = DIFFY; + genhist(); + } + +if($ARGV[0] =~ /hist/) { + $delay = 1000000 unless $delay; + $samples = 200 unless $samples; + $downscale = 1 unless $downscale; + $style = 0 unless $style; + $ydiff = NODIFFY; + genhist(); + } + +if($ARGV[0] =~ /oepworktime/) { + $delay = 1000000 unless $delay; + $curvestyle = "histostacked"; + $xticks = 0 unless $xticks; + $ymax = $delay*1.1/1000; + $yscale = [1000]; + $xtitle = "OEP"; + $ytitle = "Time [ms]"; + $windowname = "OEP Trigger Handling Times"; + $ydiff = DIFFY; + $title = ["Readout","Waiting","Initialization","Calibration","Idle"]; + $address = [0xfffd,0xfffd,0xfffd,0xfffd,0xfffd]; + $register = [0x9113,0x9114,0x9111,0x9112,0x9110]; + $regoffset = [0,0,0,0,0]; + $regwidth = [32,32,32,32,32]; + genreg(); + } + +if($ARGV[0] =~ /gberate/) { + $delay = 1000000 unless $delay; + $curvestyle = "histostacked"; + $xticks = 1 unless $xticks; + $xtitle = "Sender"; + $ytitle = "Data Rate (kiB)" if $ytitle eq ""; + $windowname = "Gbe Data Rate"; + $key = NO; + $ydiff = DIFFY; + $xgrid = NO; + $address = [0xff7f]; + $register = [0x83f3]; + $regoffset = [10]; + $regwidth = [22]; + genreg(); + } + +if($ARGV[0] =~ /oepwords/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Sender"; + $ytitle = "Data Words"; + $windowname = "Data Words sent by OEP"; + $yscale = [1]; + $key = NO; + $ydiff = DIFFY; + $address = [0xfffd]; + $register = [0x910B]; + $regoffset = [0]; + $regwidth = [32]; + genreg(); + } + + +if($ARGV[0] =~ /mdcchan/) { + $delay = 1000000 unless $delay; + $xticks = 1; + $xtitle = "Sender"; + $ytitle = "Data Words"; + $windowname = "Data words per TDC channel"; + $yscale = [1]; + $key = NO; + $ydiff = NODIFFY; + if ($ARGV[0] =~ /diff/) { + $ydiff = DIFFY; + } + $address = [$address->[0]?$address->[0]:0xfffd]; + $register = [0xc088]; + $regamount = [96]; + $regoffset = [0]; + $regwidth = [32]; + genreg(); + } + + +if($ARGV[0] =~ /regdiff/) { + $delay = 1000000 unless $delay; +# $xticks = 1 unless $xticks; + $ydiff = DIFFY; +# $key = NO unless defined $key; + $windowname = "General Plot" unless $windowname; + genreg(); + } + +if($ARGV[0] =~ /reg/) { + $delay = 1000000 unless $delay; +# $xticks = 1 unless $xticks; + $ydiff = NODIFFY; +# $key = NO unless defined $key; + $windowname = "General Plot" unless $windowname; + genreg(); + } + +if($ARGV[0] =~ /oeptrgerr/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "# of errors"; + $windowname = "OEP CMS Errors"; + $key = YES; + $ydiff = NODIFFY; + $title = ["Spikes","Spurious","Invalid","Multiple"]; + $address = [0xfffd,0xfffd,0xfffd,0xfffd]; + $register = [7,7,6,6]; + $regoffset = [0,16,0,16]; + $regwidth = [16,16,16,16]; + genreg(); + } + +if($ARGV[0] =~ /oepfill/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "Words in Buffer"; + $windowname = "OEP Buffer Fill Level"; + $key = NO; + $ydiff = NODIFFY; + $address = [0xfffd]; + $register = [0x7100]; + $regoffset = [0]; + $regwidth = [16]; + genreg(); + } + +if($ARGV[0] =~ /showerfill/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "Words in Buffer"; + $windowname = "Shower Data Buffer Fill Level"; + $key = $key || NO; + $ydiff = NODIFFY; + $address = [0xfff7,0xfff7,0xfff7,0xfff7,0xfff7,0xfff7]; + $register = [0x7100,0x7101,0x7102,0x7103,0x7104,0x7105]; + $regoffset = [0,0,0,0,0,0]; + $regwidth = [16,16,16,16,16,16]; + genreg(); + } + +if($ARGV[0] =~ /filllevel/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "Words in Buffer"; + $windowname = "Front-end Data Buffer Fill Level"; + $key = NO; + $ydiff = NODIFFY; + $address = [0xffff,0xffff,0xffff,0xffff,0xffff,0xffff]; + $register = [0x7100,0x7101,0x7102,0x7103,0x7104,0x7105]; + $regoffset = [0,0,0,0,0,0]; + $regwidth = [16,16,16,16,16,16]; + genreg(); + } + +if($ARGV[0] =~ /oepretr/) { + $delay = 1000000 unless $delay; + $windowname = "OEP Retransmissions"; + $key = YES; + $ydiff = NODIFFY; + $title = ["Retransmit Received","Retransmit Sent"]; + $address = [0xfffd,0xfffd]; + $register = [4,4]; + $regoffset = [16,24]; + $regwidth = [8,8]; + genreg(); + } + +if($ARGV[0] =~ /timecmslvl1/) { + $delay = 1000000 unless $delay; + $windowname = "Trigger Delay"; + $key = NO; + $ydiff = NODIFFY; + $ytitle = "Time between CMS and LVL1 [10ns]"; + $address = [0xfffd]; + $register = [2]; + $regoffset = [16]; + $regwidth = [11]; + genreg(); + } + +if($ARGV[0] =~ /oeptokenmiss/) { + $delay = 1000000 unless $delay; + $windowname = "OEP Token Missing"; + $key = NO; + $ydiff = NODIFFY; + $ytitle = "# of missing token"; + $address = [0xfffd]; + $register = [0x9101]; + $regoffset = [0]; + $regwidth = [24]; + genreg(); + } + +if($ARGV[0] =~ /slowcontrolrate/) { + $delay = 1000000 unless $delay; + $samples = 240 unless $samples; + $downscale = 1 unless $downscale; + $style = 0 unless $style; + $windowname = "Slow Control Data Rate"; + $ydiff = DIFFY; + $ytitle = "Slow Control Data / kByte/s"; + $address = [0x8000]; + $register = [0x4012]; + $regoffset = [0]; + $regwidth = [32]; + $yscale = [102.4]; + genhist(); + } + + + +if($ARGV[0] =~ /commonstatus/) { + bitmap(($delay)?$delay:1000000,[0xffff],[0],[1],[0],[20],["Common Status Bits"],0,$name." - Common Status Bit"); + } +if($ARGV[0] =~ /genbit/ || $ARGV[0] =~ /bitmap/) { + bitmap(($delay)?$delay:1000000,$address,$register,$regamount,$regoffset,$regwidth,$title,$style,$name." - ".$windowname); + } + diff --git a/hmon/hmon_hadplotnew.sh b/hmon/hmon_hadplotnew.sh new file mode 100755 index 0000000..f5f571a --- /dev/null +++ b/hmon/hmon_hadplotnew.sh @@ -0,0 +1,1449 @@ +#!/usr/bin/perl -w +use warnings; + +use FileHandle; +use Time::HiRes qw( gettimeofday usleep time ); +use Getopt::Long; +use Data::Dumper; +use POSIX qw/floor strftime/; +use HADES::TrbNet; + +use constant AXISISTIME => 1; +use constant AXISISNOTIME => 0; +use constant DIFFY => 1; +use constant DIFFX => 1; +use constant NODIFFY => 0; +use constant NODIFFX => 0; +use constant NODELAY => 0; +use constant NO => 0; +use constant YES => 1; +use constant NONEWLINE => 1; + +my $GPbuffer = ""; +my $buffercount = 0; + +my $windowtitle = ""; #Global var to store real name of GUI window + +my $PlotBuffer = {}; +my $PlotBufferCnt = 0; + +my @PlotBufArr = (); + +#my @color = ("#1155bb","#bb1111","#999900","#660000","#006633","#990066","#6633CC","#00CCCC"); +my @color = ("#2222dd","#880000","#00cc00","#ee00dd","#ffcc00","#00cc88","#6633CC","#00CCCC"); +our $write2file = ""; +our $plotendedbefore = 0; + +trb_init_ports() or die trb_strerror(); + +################################################# +# Variables... +################################################# +my $delay = 1000; +my $samples = 100; +my $downscale = 1; +# my $system = 0; +my $address = []; +my $register = []; +my $regoffset = []; +my $regwidth = []; +my $title = []; +my $timeref = []; +my $geom = "700x400"; +my $style = 0; +my $nametmp = ""; +my $regamount = []; +my $xscale = []; +my $yscale = []; +my $xtitle = ""; +my $ytitle = ""; +my $windowname = "No Name"; +my $xistime = AXISISNOTIME; +my $xoverflow = []; +my $yoverflow = []; +my $ydiff = 0; +my $outputcfg = ""; +my $name = "HadPlot"; +my $key ; +my $curvestyle= 'points'; #points, steps, histo or histostacked +my $xticks = 0; #show labels on x-axis +my $yticks = 1; #show labels on y-axis +my $plotoption= ""; #string with additional gnuplot commands +my $curveoption= []; #options for plot command +my $xgrid = 1; +my $ygrid = 1; +my $ymax; +my $ymin; +my $xmin; +my $xmax; + +GetOptions('d=f' => \$delay, + 'n=i' => \$samples, + 'o=i' => \$downscale, + 'a=s' => $address, + 'r=s' => $register, + 'w=i' => $regwidth, + 'p=i' => $regoffset, + 't=s' => $title, + 'm=i' => $regamount, + 'g=s' => \$geom, + 'z=i' => \$style, + 'output=s' => \$outputcfg, + 'windowname=s' => \$windowname, + 'xscale=f' => $xscale, + 'yscale=f' => $yscale, + 'xtitle=s' => \$xtitle, + 'ytitle=s' => \$ytitle, + 'xistime!' => \$xistime, + 'timeref=s' => $timeref, + 'xoverflow=f' => $xoverflow, + 'yoverflow=f' => $yoverflow, + 'ydiff!' => \$ydiff, + 'name=s' => \$name, + 'key!' => \$key, + 'xticks!' => \$xticks, + 'yticks!' => \$yticks, + 'xgrid!' => \$xgrid, + 'ygrid!' => \$ygrid, + 'ymax=i' => \$ymax, + 'ymin=i' => \$ymin, + 'xmax=i' => \$xmax, + 'xmin=i' => \$xmin, + 'curvestyle=s' => \$curvestyle, + 'curveoption=s'=> $curveoption, + 'plotoption=s' => \$plotoption + ); + +for(my $i=0;$i<16;$i++) { + $regoffset->[$i] = 0 unless defined $regoffset->[$i]; + $regwidth->[$i] = 32 unless defined $regwidth->[$i]; + $xoverflow->[$i] = 2**20 unless defined $xoverflow->[$i]; + $yoverflow->[$i] = 2**32 unless defined $yoverflow->[$i]; + $xscale->[$i] = 1 unless defined $xscale->[$i]; + $yscale->[$i] = 1 unless defined $yscale->[$i]; + $title->[$i] = "" unless defined $title->[$i]; + $curveoption->[$i] = "" unless defined $curveoption->[$i]; + } + +for(my $i=0;$i < scalar @{$address};$i++) { + if(!defined($title->[$i])) { + $title->[$i] = hex($address->[$i])." $register->[$i] $regoffset->[$i]..".($regoffset->[$i]+$regwidth->[$i]-1); + } + } + + +$delay *= 1000; +if($style == 1) {$curvestyle="points"; $xticks=1;} +if($style == 2) {$curvestyle="histo"; $xticks=0;} +if($style == 3) {$curvestyle="histo"; $xticks=1;} +if($style == 4) {$curvestyle="histostacked"; $xticks=0;} +if($style == 5) {$curvestyle="histostacked"; $xticks=1;} + +for(my $k = 0; $k < scalar @$address; $k++) { + $address->[$k] = hex($address->[$k]); + $register->[$k] = hex($register->[$k]); + } + +#Open Gnuplot +our $fh; +my $fn = "gnuplot -geometry $geom -bg 'ghost white'"; +$fh = new FileHandle ("|$fn") or die "error: no gnuplot"; +$fh->autoflush(1); + +sub makeTimeString{ + return strftime("set label 100 \"%H:%M:%S\" at screen 0.92,0.02 left tc rgb \"#000044\" font \"monospace,8\"\n", localtime()) + } + +################################################# +# When exiting, close Gnuplot window +################################################# +sub finish { + print $fh "exit;\n"; + close $fh; + exit; +} + +$SIG{INT} = \&finish; +$SIG{PIPE} = \&finish; + + + +my $last_wakeup; + +sub max { + my $a = shift; + my $b = shift; + return $a > $b ? $a : $b; + } + +sub min { + my $a = shift; + my $b = shift; + return $a < $b ? $a : $b; + } + +sub usleep_total { + my $delay = shift; + if(defined $last_wakeup) { + my $time = time(); +# printf "%.0f\n",$delay-($time-$last_wakeup)*1E6; + usleep(max(0,$delay-($time-$last_wakeup)*1E6)); + } + else { + usleep($delay); + } + $last_wakeup = time(); + return $last_wakeup; + } + + +################################################# +# Write to gnuplot +################################################# +sub plot_write { + my ($str,$no) = @_; + if(defined($no) && $no) { + print $fh $str; +# print $str; + } + else { + print $fh $str."\n"; +# print $str."\n"; + } + } + +sub plot_add { + my ($x,$y) = @_; + $x = $x || $PlotBufferCnt; + $PlotBufArr[$PlotBufferCnt]->{x} = $x; + $PlotBufArr[$PlotBufferCnt]->{y} = $y; + + $PlotBufferCnt++; +# $PlotBuffer->{$x} = $y; +# print $x." ".$y."\n"; + } + +sub plot_end { + my ($single) = @_; + for(my $i = 0;$i{y}."\n"; + } + else { + print $fh $PlotBufArr[$i]->{x}." ".$PlotBufArr[$i]->{y}."\n"; + } + } +# foreach my $line (sort keys %{$PlotBuffer}) { +# if($single) { +# print $fh $PlotBuffer->{$line}."\n"; +# # print "plot_end: ".$PlotBuffer->{$line}."\n"; +# } +# else { +# print $fh $line." ".$PlotBuffer->{$line}."\n"; +# # print "plot_end: ".$line." ".$PlotBuffer->{$line}."\n"; +# } +# } + @PlotBufArr = (); + $PlotBuffer = {}; + $PlotBufferCnt = 0; + print $fh "e\n"; + $plotendedbefore = 1 unless $plotendedbefore; + } + + +sub plot_reset { + if($write2file eq ""){ + system("xwininfo -name '$windowtitle' >/dev/null 2>/dev/null"); + #print $?."\n"; + if($? != 0) { + usleep(1E5); + system("xwininfo -name '$windowtitle' >/dev/null 2>/dev/null"); + if($? != 0) { + finish(); + } + } + if ($plotendedbefore != 0) { + $plotendedbefore = 0; + print $fh makeTimeString(); + print $fh "replot\n"; + } + } + else { + if ($plotendedbefore != 0) { + system("mv $write2file.tmp $write2file"); + plot_write("set out \"$write2file.tmp\"\n"); + $plotendedbefore = 0; + print $fh makeTimeString(); + print $fh "replot\n"; +# print "reset\n"; + } + } + } + +sub plot_finished { + my ($store) = @_; + if($write2file ne "") { + if(defined $store) { + if($store->{"initing"} != 2 and $store->{"iteration"} % $store->{"downscale"} == 0) { +# system("mv $write2file.tmp $write2file"); + } + } + else { + if($write2file ne "") { +# system("mv $write2file.tmp $write2file"); + } + } + } + } + +sub plot_init { + my ($xtics) = @_; + $windowtitle = $name ." - ".$windowname; + if ($outputcfg =~ m$PNG.([/\w]*).(\d+).(\d+)$) { + print "Writing PNG to file $1\n"; + $write2file = $1.".png"; + plot_write("set term png size $2,$3 font \"monospace,8\""); + plot_write("set out \"$write2file.tmp\""); + } + elsif ($outputcfg =~ m$SVG.([/\w]*).(\d+).(\d+)$) { + print "Writing SVG to file $1\n"; + $write2file = $1.".svg"; + plot_write("set term svg size ".($2*2).",".($3*2)." dynamic font \"monospace,18\" lw 1.5 \n"); + plot_write("set out \"$write2file.tmp\"\n"); + } + else { + plot_write("set term x11 title '$windowtitle'"); + } + plot_write("set grid"); + plot_write("set xlabel \"$xtitle\""); + plot_write("set ylabel \"$ytitle\""); + if(defined $xtics) { + plot_write("set xtics $xtics\n"); + } + if(defined $xmin && defined $xmax) { + plot_write("set xrange [$xmin:$xmax]"); + } + if(defined $ymin && defined $ymax) { + plot_write("set yrange [$ymin:$ymax]"); + } + elsif(defined $ymax) { + plot_write("set yrange [:$ymax]"); + } + elsif(defined $ymin) { + plot_write("set yrange [$ymin:]"); + } + if (!defined $key || $key == 0) { + plot_write("unset key"); + } + if($xgrid == 0) { + plot_write("set grid noxtics"); + } + if($ygrid == 0) { + plot_write("set grid noytics"); + } + if($plotoption ne "") { + plot_write($plotoption); + } + } + +sub plot_sleep { + my ($delay) = @_; + my $t = usleep_total($delay); + plot_reset(); + return $t; + } + +sub plot_end_sleep { + my ($delay,$single) = @_; + plot_end($single); + return plot_sleep($delay); + } + +sub plot_storage_end_sleep { + my ($store, $single) = @_; + my $delay = $store->{"delay"}; + my $t; + if($store->{"initing"} == 0) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + plot_end($single); + $t = usleep_total($delay); + plot_reset(); + } + else { + $t = usleep_total($delay); + } + } + return $t; + } + +sub plot_storage_sleep { + my ($store,$noreset) = @_; + my $t; + my $delay = $store->{"delay"}; + #print $store->{"initing"}.$store->{"iteration"}.$store->{"downscale"}."\n"; + if($store->{"initing"} != 2) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + $t = usleep_total($delay); + plot_storage_reset() unless $noreset; + } + else { + $t = usleep_total($delay); + } + } + return $t; + } + +sub plot_storage_reset { + my ($store) = @_; + if(defined $store->{"initing"} && $store->{"initing"} != 2) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + plot_reset(); + } + } + } + +sub plot_storage_end { + my ($store) = @_; + if($store->{"initing"} == 0) { + if($store->{"iteration"} % $store->{"downscale"} == 0) { + plot_end(); + } + } + } + +################################################# +# Writes a new value pair to storage +################################################# +sub store_push { + my ($storage,$x,$y,$divtime) = @_; + my $xval = $x; + my $yval = $y; + my $curtime = time(); + + if ($storage->{"initing"} != 2) { + if (scalar(@{$storage->{"datax"}}) == $storage->{"size"}) { + my $tmp = shift(@{$storage->{"datax"}}); + my $tmpy = shift(@{$storage->{"datay"}}); + $storage->{"totalx"} -= $tmp; +# if($storage->{"initing"} == 0 && (($tmpy <= $storage->{"miny"}) || ($tmpy >= $storage->{"maxy"}))) { +# store_calc_range($storage); +# } + } + if($storage->{"diffx"}) { + if(defined($storage->{"xmax"}) && $x < $storage->{"lastx"}) { + $xval = ($x - $storage->{"lastx"} + $storage->{"xmax"}); + } + else { + $xval = ($x - $storage->{"lastx"}); + } + if(defined($storage->{"last_push"}) && $storage->{"last_push"} != 0) { + while (floor($xval/$storage->{"xmax"}) < floor(($curtime - $storage->{"last_push"})/($storage->{"xmax"}/1E6))){ + $xval += $storage->{"xmax"}; + } + } + } + if($storage->{"diffy"}) { + $yval = $y - $storage->{"lasty"}; + if(defined($storage->{"ymax"}) && $y < $storage->{"lasty"}) { + while($yval < 0) { + $yval += $storage->{"ymax"}; + } + } + if($divtime) { + $yval /= ($xval?$xval:1)/1000000; + } + } + + + if($storage->{"initing"} == 1) { + $storage->{"initing"} = 0; + for(my $i = $storage->{"size"}-1; $i>0; $i--) { + push(@{$storage->{"datax"}},$storage->{"delay"}); + push(@{$storage->{"datay"}},$yval); + $storage->{"totalx"} += $storage->{"delay"}; + } + } + + push(@{$storage->{"datax"}},$xval?$xval:0); + push(@{$storage->{"datay"}},$yval?$yval:0); + $storage->{"totalx"} += $xval?$xval:0; + } + else { + $storage->{"initing"} = 1; + } + + $storage->{"last_push"} = $curtime; + $storage->{"lasty"} = $y; + $storage->{"lastx"} = $x; + } + +################################################# +# Writes storage contents to stream +################################################# +sub store_print { + my $str = ""; + my ($storage) = @_; + if($storage->{"initing"} != 2) { + if($storage->{"iteration"} % $storage->{"downscale"} == 0) { + my $xcnt = - $storage->{"totalx"} /1000000.0; + for (my $i = 0; $i < $storage->{"size"}; $i++) { + my $xval = $storage->{"datax"}->[$i]; #${}[] + my $yval = $storage->{"datay"}->[$i]; + $xval = 0 unless defined($xval); + $yval = 0 unless defined($yval); + $xcnt += $xval/1000000.0; +# $str .= $xcnt." ".$yval."\n"; + $str .= sprintf "%.3f %.2f\n", $xcnt,$yval; + #plot_write($xcnt/1000000.0." ".$yval); + } + plot_write($str,1); +# print $str; + plot_end(1); + } + $storage->{"iteration"}++; + } + } + + +################################################# +# Initialize storage +################################################# +sub store_init { + my ($storage,$size,$diffx,$diffy,$delay,$downscale,$xmax,$ymax) = @_; + + $storage->{"datax"} = []; + $storage->{"datay"} = []; + $storage->{"size"} = $size; + $storage->{"diffx"} = $diffx; + $storage->{"diffy"} = $diffy; + $storage->{"delay"} = $delay; + $storage->{"downscale"} = $downscale; + $storage->{"initing"} = 2; + $storage->{"iteration"} = 0; + $storage->{"totalx"} = 0; + $storage->{"xmax"} = $xmax; + $storage->{"ymax"} = $ymax; + $storage->{"maxy"} = 0; + $storage->{"miny"} = 1E100; + $storage->{"last_push"} = 0; + $storage->{"last_sleep"} = 0; + } + +################################################# +# Help Message +################################################# +sub help { + print <[$i])) || ($title->[$i] eq "")) { +# $title->[$i] = hex($address->[$i])." ".$register->[$i]." ".$regoff->[$i]."..".($regoff->[$i]+$regwidth->[$i]-1); +# } + if (!(defined $regamount->[$i])) { + $regamount->[$i] = 1; + } + } + $ymin = $regoff->[0]; + $ymax = $regoff->[0]+$regwidth->[0]; + plot_init(256); +# if ($style == 0) { +# plot_write("plot",1); +# for(my $i = 0; $i[$i]\" ",1); +# plot_write(", ",1) unless $i == scalar(@{$address})-1; +# } +# plot_write(""); +# } +# elsif($style == 1) { + plot_write("set xtics rotate by 90 offset .7,-2 scale 0 "); + plot_write("set style fill solid 1.00 border -1"); + plot_write("set boxwidth 1 absolute"); + plot_write("unset key"); + plot_write('set format x "%x"'); + plot_write("plot ",1); + for(my $i = 0; $i[$i]\" ",1); #using 2:xticlabels(1) + plot_write(", ",1) unless $i == scalar(@{$address})-1; + } + plot_write(""); +# } + while(1) { + for(my $i = 0; $i[$i] == 1) { + $c = "trbcmd r $address->[$i] $register->[$i] | sort"; + } + else { + $c = "trbcmd rm $address->[$i] $register->[$i] $regamount->[$i] 0"; + } + my @out = qx($c); + my $addr = undef; + my $cnt = 0; + foreach my $s (@out) { + if($s =~ /^H:\s*0x(\w\w\w\w)/) { + $addr = $1; + } + if($s =~ /^0x(\w\w\w\w)\s*0x(\w{8})/) { + $addr = hex($1) if($regamount->[$i] == 1); + if ($regamount->[$i] == 1) { plot_add($addr,-1); } + else { plot_add("\"$addr.$1\"",-1); } + for(my $j = $regoff->[$i]; $j < $regoff->[$i] + $regwidth->[$i];$j++) { + if(hex($2) & (1<<$j)) { + if ($regamount->[$i] == 1) { plot_add("$addr",$j); } + else { plot_add("\"$addr.$1\"",$j); } + } + } + $cnt++; + } + } + plot_end(1); + } + plot_sleep($delay); + } + } + + + +################################################# +# Generic Register differences +################################################# +sub genreg { + my %oldvals; + + plot_init(undef); + + if($xticks) { + plot_write("set xtics rotate by 90 offset .7,-1.7 scale .7 "); + } + if($curvestyle eq "histo") { + plot_write("set style fill solid 1.00 border -1"); + plot_write("set boxwidth 2 absolute"); + } + elsif($curvestyle eq "histostacked") { + plot_write("set style fill solid 1.00 border -1"); + plot_write("set style histogram rowstacked"); + plot_write("set boxwidth 1 absolute"); + plot_write("set key outside") unless defined $key && $key==0; + plot_write("set autoscale xfix "); + } + + plot_write("plot",1); + for(my $i = 0; $i[$i]\" ",NONEWLINE); + } + elsif ($curvestyle eq "steps") { + plot_write("with histeps title \"$title->[$i]\" ",NONEWLINE); + } + else { + plot_write("with points pt 5 title \"$title->[$i]\" ",NONEWLINE); + } + plot_write(" ".$curveoption->[$i],NONEWLINE); + plot_write(", ",NONEWLINE) unless $i == scalar(@{$address})-1; + } + plot_write(""); + + + while(1) { + for(my $i = 0; $i[$i]) || $regamount->[$i] == 1) { +# $c = "trbcmd r $address->[$i] $register->[$i] | sort"; + $c = trb_register_read(($address->[$i]),($register->[$i])); + foreach my $s (keys $c) { + $c->{$s}=[$c->{$s}]; + } + } + else { +# $c = "trbcmd rm $address->[$i] $register->[$i] $regamount->[$i] 0"; + $c = trb_register_read_mem(($address->[$i]),($register->[$i]),0,$regamount->[$i]); + print Dumper $c; + } +# my @out = qx($c); + foreach my $s (sort keys $c) { + for(my $r = 0; $r < scalar @{$c->{$s}};$r++) { + my $tmp = ($c->{$s}->[$r]>>$regoffset->[$i])&(2**$regwidth->[$i]-1); + my $val = $tmp; + my $board = sprintf("%04x",$s); + if($ydiff) { + if(defined $oldvals{$i}->{$board.($r+$register->[$i])}) { + if ($oldvals{$i}->{$board.($r+$register->[$i])} > $tmp) { + $val = $tmp - $oldvals{$i}->{$board.($r+$register->[$i])} + 2**$regwidth->[$i]; + } + else { + $val = $tmp - $oldvals{$i}->{$board.($r+$register->[$i])}; + } + } + $oldvals{$i}->{$board.($r+$register->[$i])} = $tmp; + } + + if($xticks) { + if (!(defined $regamount->[$i]) || $regamount->[$i] == 1) { + plot_add("\"$board\"",$val/$yscale->[$i]); + } + else { + plot_add("\"$board.($r+$register->[$i])\"",$val/$yscale->[$i]); + } + } + else { + plot_add("",$val/$yscale->[$i]); + } + } + } + plot_end(!$xticks); + } + plot_sleep($delay); + } + } + +################################################# +# Generic Histogram +################################################# +sub genhist { + my %storearr; + my %oldvals; +# $xtitle = "Time [s]" unless $xtitle ne ""; + plot_init(); + plot_write("set autoscale fix"); + plot_write("plot",1); + $diff = 0 unless defined($diff); + for(my $i = 0; $i[$i],$yoverflow->[$i]); + plot_write("'-' with lines title \"$title->[$i]\" ",1); + plot_write(", ",1) unless $i == scalar(@{$address})-1; + } + plot_write(""); + + while(1) { + my $a, my $s, my $t; + my $val = 0 , my $time; + plot_storage_reset($storearr{0}); + for(my $i = 0; $i[$i], $register->[$i]) or sleep 1 and print "Error\n" and next; + foreach my $o (sort keys $c) { +# if (($a,$s,$t) = $o =~ /^0x(\w{4})\s*0x(\w{8})\s*0x(\w{4})/) { + + $val += (($c->{$o}->{'value'}->[0]>>($regoffset->[$i]))&(2**($regwidth->[$i])-1)); + $time = $c->{$o}->{'time'}->[0]*16; +# } + } + store_push($storearr{$i},$time/$xscale->[$i],$val/$yscale->[$i],AXISISTIME); + store_print($storearr{$i}); + } + plot_storage_sleep($storearr{0}); + plot_finished($storearr{0}); + } + } + +################################################# +# Deadtime histogram +################################################# +sub deadtimehist2 { + my %values, my %lastvalues, my %diffvalues; + my @keys = ("33","34","36","31","38","37","3b","35"); + my @keys2 = ("43","44","46","41","48","47","4b","45"); + my @names = ("MDC12","MDC34","TOF","RPC","RICH","SHW","Start","FW"); + my %storearr; + + if ($style != 0) { + for(my $i= 0; $i < scalar(@keys); $i++) { + $storearr{$keys[$i]} = {}; + store_init($storearr{$keys[$i]},$samples,0,0,$delay*.0,$downscale,2**32,2**32); + } + for(my $i= 0; $i < scalar(@keys2); $i++) { + $storearr{$keys2[$i]} = {}; + store_init($storearr{$keys2[$i]},$samples,0,0,$delay*.0,$downscale,2**32,2**32); + } + } + + plot_init(); + plot_write("set key left top Left"); + plot_write("set autoscale fix"); + plot_write("set yrange [-1:101]"); + + if ($style != 0) { + plot_write("plot ",1); + plot_write("\"-\" title \"MDC12\" with lines,",1); + plot_write("\"-\" title \"MDC34\" with lines,",1); + plot_write("\"-\" title \"TOF\" with lines,",1); + plot_write("\"-\" title \"RPC\" with lines,",1); + plot_write("\"-\" title \"RICH\" with lines,",1); + plot_write("\"-\" title \"SHW\" with lines,",1); + plot_write("\"-\" title \"Start\" with lines,",1); + plot_write("\"-\" title \"FW\" with lines"); + } + else { + plot_write("set style fill solid 1.00 border -1"); + plot_write("set grid noxtics ytics"); + plot_write("set boxwidth 2 absolute"); + plot_write("set xtics ('MDC12' 0,'MDC34' 1,'TOF' 2, 'RPC' 3, 'RICH' 4, 'SHW' 5, 'Start' 6, 'FW' 7) offset 2,0 scale 0"); + plot_write("set style histogram title offset character 0, 0, 0"); + plot_write("set style data histograms"); + plot_write("plot \"-\" title 'incl. busy' lt rgb \"#1155bb\", \"-\" title 'excl. busy' lt rgb \"#bb1111\""); + } + my $cmd = sprintf("trbcmd -n-1 -s%d rmt 0x8001 0x4031 31 0",$delay/1000); + if($style != 0) { + $cmd = sprintf("trbcmd -n-1 -s%d rmt 0x8001 0x4031 12 0",$delay/1000); + } + open(FTRB, "$cmd|"); + + while(my $a = ) { + if($a =~ /^0x\w{2}(\w{2})\s*0x(\w{8})\s*0x(\w{4})/) { + $values{$1} = hex($2); + $values{"50"} = hex($3)*16; + } + if ($a eq "---\n") { + $diffvalues{"50"} = 1E6; + if (defined $lastvalues{"50"}) { + if ($values{"50"} > $lastvalues{"50"}) { + $diffvalues{"50"} = $values{"50"} - $lastvalues{"50"}; + } + else { + $diffvalues{"50"} = $values{"50"} - $lastvalues{"50"} + 2**20; + } + } + #$diffvalues{"50"} = $values{"50"} - $lastvalues{"50"} if defined $lastvalues{"50"}; + my $time = $diffvalues{"50"}; + foreach my $key (keys %values) { + next unless hex($key)<0x50; + $diffvalues{$key} = 0; + if (defined $lastvalues{$key}) { + if ($values{$key} >= $lastvalues{$key}) { + $diffvalues{$key} = $values{$key} - $lastvalues{$key}; + } + else { + $diffvalues{$key} = $values{$key} - $lastvalues{$key} + 2**32; + } + } + $diffvalues{$key} /= $time if $time; + #print $key." ".$values{$key}." ".$lastvalues{$key}." ".$diffvalues{$key}."\n"; + } + #print "=====\n"; + $diffvalues{"31"} = max($diffvalues{"31"},$diffvalues{"32"}); + $diffvalues{"38"} = max(max($diffvalues{"38"},$diffvalues{"39"}),$diffvalues{"3a"}); + if ($style == 0) { + $diffvalues{"41"} = max($diffvalues{"41"},$diffvalues{"42"}); + $diffvalues{"48"} = max(max($diffvalues{"48"},$diffvalues{"49"}),$diffvalues{"4a"}); + } + %lastvalues = %values; + if($style != 0) { + plot_storage_reset($storearr{$keys[0]}); + for(my $i= 0; $i < scalar(@keys); $i++) { + store_push($storearr{$keys[$i]},$time,$diffvalues{$keys[$i]},0); + store_print($storearr{$keys[$i]}); + } + plot_storage_sleep($storearr{$keys[0]},1); + plot_finished($storearr{$keys[0]}); + } + else { + plot_reset(); + for(my $i= 0; $i < scalar(@keys); $i++) { + plot_add("",$diffvalues{$keys[$i]}); #"\"".$names[$i]."\"", + } + plot_end(1); + for(my $i= 0; $i < scalar(@keys2); $i++) { + plot_add("",$diffvalues{$keys2[$i]}); #"\"".$names[$i]."\"", + } + plot_end(1); + plot_finished(); + } + } + } + } + + +################################################# +# Select Operation +################################################# + +if(!(defined $ARGV[0]) || $ARGV[0] =~ /help/) {help(); exit;} + +if($ARGV[0] =~ /oep5V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8010,0x8011]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [.5,.5]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["5.8V input","5V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oep3.3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8012,0x8013]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["3.8V input","3.3V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oep1.2V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8014,0x8015]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["1.8V input","1.2V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oep3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x8016,0x8017]; + $regwidth = [12,12]; + $regoffset = [0,0]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["+3V input","-3V reg."]; + genreg(); + } + +if($ARGV[0] =~ /oepminmaxp3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x801e,0x801e]; + $regwidth = [12,12]; + $regoffset = [0,16]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["+3V minimum","+3V maximum"]; + genreg(); + } + +if($ARGV[0] =~ /oepminmaxn3V/) { + $address = [0xfffd,0xfffd]; + $register = [0x801f,0x801f]; + $regwidth = [12,12]; + $regoffset = [0,16]; + $yscale = [1,1]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["-3V minimum","-3V maximum"]; + genreg(); + } + +if($ARGV[0] =~ /oepminmax5Vin/) { + $address = [0xfffd,0xfffd,0xfffd]; + $register = [0x8018,0x8018,0x8010]; + $regwidth = [12,12,12]; + $regoffset = [0,16,0]; + $yscale = [.5,.5,.5]; + $xtitle = "Board"; + $ytitle = "Voltage [mV]"; + $key = YES; + $windowname = "OEP Voltages"; + $title = ["5Vin minimum","5Vin maximum","5Vin"]; + genreg(); + } + +if($ARGV[0] =~ /oeptemp/) { + oeptemp(($delay)?$delay:5000000,[$name." - OEP Temperature"]); + } + + +if($ARGV[0] =~ /rpcdatarate/) { + $delay = 1000000 unless $delay; + $xticks = 1 ; + $xtitle = "Sender ((Sector mod 3)*4+TRB)"; + $ytitle = "Data Words /1024"; + $windowname = "Data Words sent by RPC"; + $curvestyle = "histo"; + $key = YES; + $ydiff = DIFFY; + $ymin = 0; + $yscale = [512,512]; + $address = [0x8401,0x8411]; + $register = [0x4001,0x4001]; + $regamount = [12,12]; + $title = ["Sector 0,1,2","Sector 3,4,5"]; + $regoffset = [0,0]; + $regwidth = [32,32]; + genreg(); + } + +#hadplot -a 2 -r 1 -p 0 -w 16 -d 5 -o 200 -n 1000 -yoverflow 65536 genhistdiff + + +if($ARGV[0] =~ /slowcontrolrate/) { + $delay = 1000000 unless $delay; + $samples = 240 unless $samples; + $downscale = 1 unless $downscale; + $style = 0 unless $style; + $windowname = "Slow Control Data Rate"; + $ydiff = DIFFY; + $ytitle = "Slow Control Data / kByte/s"; + $address = [0x8000]; + $register = [0x4012]; + $regoffset = [0]; + $regwidth = [32]; + $yscale = [102.4]; + genhist(); + } + +if($ARGV[0] =~ /eventratehighres/) { + $delay = 5000 ; #unless $delay; + $samples = 1000; # unless $samples; + $downscale = 200;# unless $downscale; +# $style = 0 unless $style; + $windowname = "Eventrate High Resolution"; + $xistime = AXISISTIME; + $ydiff = DIFFY; + $xoverflow = [2**20]; + $title = ["Event rate"]; + $address = [0x2]; + $register = [0x1]; + $regoffset = [0]; + $regwidth = [16]; + $yoverflow = [65536]; + genhist(); + } + + +if($ARGV[0] =~ /eventrate/) { + $address = [0x2]; + $register = [0x1]; + $regwidth = [16]; + $regoffset = [0]; + $timeref = [0x2]; + $delay = 100000 unless $delay; + $samples = 500 unless $samples; + $downscale = 10 unless $downscale; + $windowname = "Event rate history"; + $key = NO; + $ytitle = "Event rate [Hz]" if $ytitle eq ""; + $xistime = AXISISTIME; + $ydiff = DIFFY; + $xoverflow = [2**20]; + $yoverflow = [2**16] unless $yoverflow->[0] != 2**32; + genhist(); + } + +if($ARGV[0] =~ /datarate/) { + $address = [0xff7f]; + $register = [0x83f3]; + $regwidth = [32]; + $regoffset = [0]; + $timeref = [0x8000]; + $delay = 100000 unless $delay; + $samples = 500 unless $samples; + $downscale = 5 unless $downscale; + $windowname = "Total data rate history"; + $xtitle = "Time [s]" unless defined $xtitle; + $ytitle = "Data rate [MiByte]" unless defined $ytitle; + $xistime = AXISISTIME; + $ydiff = DIFFY; + $xoverflow = [2**20]; + $yoverflow = [2**12]; + $yscale = [2**20]; + $key = NO; + genhist(); + } + +if($ARGV[0] =~ /busytime/) { + $delay = 100000 unless $delay; + $samples = 100 unless $samples; + $downscale = 5 unless $downscale; + $style = 1; + $windowname = "Busytime history"; + deadtimehist2(); + } + +if($ARGV[0] =~ /busy/) { + $delay = 100000 unless $delay; + $style = 0; + $windowname = "Busy time"; + deadtimehist2(); + } + +if($ARGV[0] =~ /oepspikehist/) { + $delay = 100000 unless $delay; + $samples = 1000 unless $samples; + $downscale = 10 unless $downscale; +# $style = 0 unless $style; + $windowname = "OEP CMS Spikes"; + $ydiff = DIFFY; + $title = ["OEP CMS Spikes"]; + $address = [0xfffd]; + $register = [7]; + $regoffset = [0]; + $regwidth = [16]; + genhist(); + } + +if($ARGV[0] =~ /oepretrhist/) { + $delay = 500000 unless $delay; + $samples = 600 unless $samples; + $downscale = 2 unless $downscale; + $style = 0 unless $style; + $windowname = "OEP Retransmissions"; + $ydiff = DIFFY; + $title = ["Retransmit Received","Retransmit Sent"]; + $address = [0xfffd,0xfffd]; + $register = [4,4]; + $regoffset = [16,24]; + $regwidth = [8,8]; + genhist(); + } + +if($ARGV[0] =~ /oeptokenmisshist/) { + $delay = 500000 unless $delay; + $samples = 2000 unless $samples; + $downscale = 4 unless $downscale; + $style = 0 unless $style; + $windowname = "OEP Token Missing"; + $ydiff = DIFFY; + $title = ["Missing Tokens"]; + $address = [0xfffd]; + $register = [0x9101]; + $regoffset = [0]; + $regwidth = [24]; + genhist(); + } + + +if($ARGV[0] =~ /oeptrgerrhist/) { + $delay = 500000 unless $delay; + $samples = 2000 unless $samples; + $downscale = 2 unless $downscale; + $style = 0 unless $style; + $windowname = "OEP CMS Errors"; + $ydiff = DIFFY; + $title = ["Spikes","Spurious","Invalid","Multiple"]; + $address = [0xfffd,0xfffd,0xfffd,0xfffd]; + $register = [7,7,6,6]; + $regoffset = [0,16,0,16]; + $regwidth = [16,16,16,16]; + genhist(); + } + + +if($ARGV[0] =~ /histdiff/) { + $delay = 1000000 unless $delay; + $samples = 200 unless $samples; + $downscale = 1 unless $downscale; + $style = 0 unless $style; + $ydiff = DIFFY; + genhist(); + } + +if($ARGV[0] =~ /hist/) { + $delay = 1000000 unless $delay; + $samples = 200 unless $samples; + $downscale = 1 unless $downscale; + $style = 0 unless $style; + $ydiff = NODIFFY; + genhist(); + } + +if($ARGV[0] =~ /oepworktime/) { + $delay = 1000000 unless $delay; + $curvestyle = "histostacked"; + $xticks = 0 unless $xticks; + $ymax = $delay*1.1/1000; + $yscale = [1000]; + $xtitle = "OEP"; + $ytitle = "Time [ms]"; + $windowname = "OEP Trigger Handling Times"; + $ydiff = DIFFY; + $title = ["Readout","Waiting","Initialization","Calibration","Idle"]; + $address = [0xfffd,0xfffd,0xfffd,0xfffd,0xfffd]; + $register = [0x9113,0x9114,0x9111,0x9112,0x9110]; + $regoffset = [0,0,0,0,0]; + $regwidth = [32,32,32,32,32]; + genreg(); + } + +if($ARGV[0] =~ /gberate/) { + $delay = 1000000 unless $delay; + $curvestyle = "histostacked"; + $xticks = 1 unless $xticks; + $xtitle = "Sender"; + $ytitle = "Data Rate (kiB)" if $ytitle eq ""; + $windowname = "Gbe Data Rate"; + $key = NO; + $ydiff = DIFFY; + $xgrid = NO; + $address = [0xff7f]; + $register = [0x83f3]; + $regoffset = [10]; + $regwidth = [22]; + genreg(); + } + +if($ARGV[0] =~ /oepwords/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Sender"; + $ytitle = "Data Words"; + $windowname = "Data Words sent by OEP"; + $yscale = [1]; + $key = NO; + $ydiff = DIFFY; + $address = [0xfffd]; + $register = [0x910B]; + $regoffset = [0]; + $regwidth = [32]; + genreg(); + } + + +if($ARGV[0] =~ /mdcchan/) { + $delay = 1000000 unless $delay; + $xticks = 1; + $xtitle = "Sender"; + $ytitle = "Data Words"; + $windowname = "Data words per TDC channel"; + $yscale = [1]; + $key = NO; + $ydiff = NODIFFY; + if ($ARGV[0] =~ /diff/) { + $ydiff = DIFFY; + } + $address = [$address->[0]?$address->[0]:0xfffd]; + $register = [0xc088]; + $regamount = [96]; + $regoffset = [0]; + $regwidth = [32]; + genreg(); + } + + +if($ARGV[0] =~ /regdiff/) { + $delay = 1000000 unless $delay; +# $xticks = 1 unless $xticks; + $ydiff = DIFFY; +# $key = NO unless defined $key; + $windowname = "General Plot" unless $windowname; + genreg(); + } + +if($ARGV[0] =~ /reg/) { + $delay = 1000000 unless $delay; +# $xticks = 1 unless $xticks; + $ydiff = NODIFFY; +# $key = NO unless defined $key; + $windowname = "General Plot" unless $windowname; + genreg(); + } + +if($ARGV[0] =~ /oeptrgerr/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "# of errors"; + $windowname = "OEP CMS Errors"; + $key = YES; + $ydiff = NODIFFY; + $title = ["Spikes","Spurious","Invalid","Multiple"]; + $address = [0xfffd,0xfffd,0xfffd,0xfffd]; + $register = [7,7,6,6]; + $regoffset = [0,16,0,16]; + $regwidth = [16,16,16,16]; + genreg(); + } + +if($ARGV[0] =~ /oepfill/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "Words in Buffer"; + $windowname = "OEP Buffer Fill Level"; + $key = NO; + $ydiff = NODIFFY; + $address = [0xfffd]; + $register = [0x7100]; + $regoffset = [0]; + $regwidth = [16]; + genreg(); + } + +if($ARGV[0] =~ /showerfill/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "Words in Buffer"; + $windowname = "Shower Data Buffer Fill Level"; + $key = $key || NO; + $ydiff = NODIFFY; + $address = [0xfff7,0xfff7,0xfff7,0xfff7,0xfff7,0xfff7]; + $register = [0x7100,0x7101,0x7102,0x7103,0x7104,0x7105]; + $regoffset = [0,0,0,0,0,0]; + $regwidth = [16,16,16,16,16,16]; + genreg(); + } + +if($ARGV[0] =~ /filllevel/) { + $delay = 1000000 unless $delay; + $xticks = 1 unless defined $xticks; + $xtitle = "Board"; + $ytitle = "Words in Buffer"; + $windowname = "Front-end Data Buffer Fill Level"; + $key = NO; + $ydiff = NODIFFY; + $address = [0xffff,0xffff,0xffff,0xffff,0xffff,0xffff]; + $register = [0x7100,0x7101,0x7102,0x7103,0x7104,0x7105]; + $regoffset = [0,0,0,0,0,0]; + $regwidth = [16,16,16,16,16,16]; + genreg(); + } + +if($ARGV[0] =~ /oepretr/) { + $delay = 1000000 unless $delay; + $windowname = "OEP Retransmissions"; + $key = YES; + $ydiff = NODIFFY; + $title = ["Retransmit Received","Retransmit Sent"]; + $address = [0xfffd,0xfffd]; + $register = [4,4]; + $regoffset = [16,24]; + $regwidth = [8,8]; + genreg(); + } + +if($ARGV[0] =~ /timecmslvl1/) { + $delay = 1000000 unless $delay; + $windowname = "Trigger Delay"; + $key = NO; + $ydiff = NODIFFY; + $ytitle = "Time between CMS and LVL1 [10ns]"; + $address = [0xfffd]; + $register = [2]; + $regoffset = [16]; + $regwidth = [11]; + genreg(); + } + +if($ARGV[0] =~ /oeptokenmiss/) { + $delay = 1000000 unless $delay; + $windowname = "OEP Token Missing"; + $key = NO; + $ydiff = NODIFFY; + $ytitle = "# of missing token"; + $address = [0xfffd]; + $register = [0x9101]; + $regoffset = [0]; + $regwidth = [24]; + genreg(); + } + + + + +if($ARGV[0] =~ /commonstatus/) { + bitmap(($delay)?$delay:1000000,[0xffff],[0],[1],[0],[20],["Common Status Bits"],0,$name." - Common Status Bit"); + } +if($ARGV[0] =~ /genbit/ || $ARGV[0] =~ /bitmap/) { + bitmap(($delay)?$delay:1000000,$address,$register,$regamount,$regoffset,$regwidth,$title,$style,$name." - ".$windowname); + } + diff --git a/hmon/hmon_logerrors.pl b/hmon/hmon_logerrors.pl new file mode 100755 index 0000000..bf8b569 --- /dev/null +++ b/hmon/hmon_logerrors.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use POSIX qw(floor); +use FileHandle; +use Hmon; +use QA; +use Getopt::Long; +use Data::Dumper; +use HADES::TrbNet; + +my @bitnames = ("serious error","error","warning","note","LVL1 counter mismatch","IPU counter mismatch", + "frontend not configured","frontend error","timing trigger missing / spike / multiple","Event not found", + "data missing","severe data buffer problem","broken event","timing trigger input error", + "SEU detected","link error","Bit16","Bit17","Bit18","Bit19"); +my @severity = ('E','E','W','I','E','E', + 'E','I','W','E', + 'E','E','W','E', + 'W','I','I','I','I','I'); + +my @lvl1bits = ("0","1","2","3","spike on CMS","missing CMS","spurious signal on CMS","CMS wrong polarity","8","9","10","11","12", + "multiple CMS","14","15","16"); +my @lvl1severity = ('I','I','I','I','I','E','I','E','I','I','I','I','I','I','I','I','I'); +my @lvl1list = (0,0,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0); + +my $flog = Hmon::OpenLogfile(); +my $fqa = QA::OpenQAFile(); + +trb_init_ports() or die "could not reach trbnet-daemon.", trb_strerror(); + +my $rh_all; + + trb_register_write(0xffff,0x20,0x10); + sleep(1); + +my $feeerrinmdc = 0; + +while (1) { + + + my $errfnd = 0; + my $store = {}; + my $store2 = {}; + my $feeerrcnt = 0; + my $trginperr = 0; + my $feeerrlist = ""; + my $trginperrlist = ""; + my $feeerrinrich = 0; + + #Parse CSR0 contents + $rh_all = trb_register_read(0xffff, 0x0000) or sleep 5 and next; + + foreach my $board (sort keys %$rh_all) { + my $val = $rh_all->{$board}; + + for (my $b=0;$b<20; $b++) { + if ($val & (1<<$b) && $b != 13) { + if ($b == 6 || ($b == 7 && $board > 0x2400)) {#no frontend error from MDC here + $feeerrcnt++; + $feeerrlist .= sprintf("%04x ",$board); + $feeerrinmdc+=3 if $board < 0x2400; + $feeerrinrich=1 if $board >= 0x3000 && $board < 0x3200; + } + $store->{$b}->{$board}=1; + } + } + } + + + + #Parse CSR2 contents (MDC only at the moment) + $rh_all = trb_register_read(0xffff, 2) or sleep 5 and next; + + foreach my $board (sort {$a <=> $b} keys %$rh_all) { + my $val = $rh_all->{$board}; + for (my $b=0; $b < 20; $b++) { + if ($val & (1<<$b) ) { + $store2->{$b}->{$board}=1; + if($b == 7) { + $trginperrlist = "Wrong trigger polarity: " if $trginperrlist eq ""; + $trginperrlist .= sprintf("%04x, ",$board); + $trginperr++; + } + } + } + } + + + #Print errors from CSR0 + for (my $b = 0; $b <20; $b++) { + my $count = scalar keys %{$store->{$b}}; + if ($count) { + # $errfnd = 1; + my $msg = sprintf("\t%3d ",$count); + my $t = 0; + $msg .= "boards complain: " if $count > 1; + $msg .= "board complains: " if $count == 1; + $msg .= "$bitnames[$b]:"; + foreach my $s (sort keys %{$store->{$b}}) { + if (($b != 8) && ($b != 7 || $s > 0x2400)) { #no bit 8 + $msg .= sprintf(" %04x",$s); + $t = 1; + } + } + system("logger -p local1.info -t DAQ StatWatch \\<".$severity[$b]."\\> $msg") if $t; + } + } + + #Print errors from CSR2 + foreach my $b (5,6,7,13) { + my $count = scalar keys %{$store2->{$b}}; + if ($count) { + # $errfnd = 1; + my $msg = sprintf("\t%3d ",$count); + $msg .= "boards complain: " if $count > 1; + $msg .= "board complains: " if $count == 1; + $msg .= "$lvl1bits[$b]:"; + if ($lvl1list[$b]) { + foreach my $s (sort keys %{$store2->{$b}}) { + $msg .= sprintf(" %04x",$s); + } + } + system("logger -p local1.info -t DAQ StatWatch \\<".$lvl1severity[$b]."\\> $msg"); + } + } + + my $qastate = QA::GetQAState('below',$feeerrcnt,@QA::FeeErrLimits); + $feeerrcnt = "" if $feeerrcnt == 0; + $qastate = QA::ERROR if ($feeerrinmdc >= 4 || $feeerrinrich); + Hmon::Speak("feeerr","Rich front-end error") if $feeerrinrich; + Hmon::Speak("feeerr","MDC front-end error") if $feeerrinmdc >= 4; + QA::WriteQALog($fqa, "feeerr", "feeerr" , 30, $qastate, "FEE Error", "$feeerrcnt", + "Boards with an Front-end Error: $feeerrlist"); + + chop $trginperrlist; chop $trginperrlist; + $trginperrlist = "No trigger input errors found." if($trginperrlist eq ""); + my $value = ""; + $value = "$trginperr errors" if $trginperr; + + QA::WriteQALog($fqa, "feeerr", "trginp", 60, $trginperr?QA::ERROR:QA::OK, "Trg. Inputs",$value ,$trginperrlist); + + #Clean up and sleep (also needed at start-up) + trb_register_write(0xffff,0x20,0x10); + + $feeerrinmdc--; + $feeerrinmdc = 0 unless ($feeerrcnt); + sleep(15); + + } diff --git a/hmon/hmon_logmissingmbo.pl b/hmon/hmon_logmissingmbo.pl new file mode 100755 index 0000000..b9b3f2d --- /dev/null +++ b/hmon/hmon_logmissingmbo.pl @@ -0,0 +1,74 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; + +use POSIX qw(floor); +use FileHandle; +use Hmon; +use QA; +use Getopt::Long; +use Data::Dumper; + +use HADES::TrbNet; + +my $store = {}; +my $tmpstore = {}; +my $flag = {}; +my $msg = ""; +my $boardstring = ""; +my $numboards = -1; +my $log = ""; + +my $flog = Hmon::OpenLogfile(); +my $fqa = QA::OpenQAFile(); + +trb_init_ports() or die "could not reach trbnet-daemon.", trb_strerror(); + + +#Watch Reserve line from MBO +my $rh_mbo; +while (1) { + $rh_mbo = trb_register_read(0xfffd, 0xe403) or sleep 5 and next; + + foreach my $board (keys %$rh_mbo) { + my $val = ($rh_mbo->{$board} >> 31) & 0x1; + + if ($val) { + $store->{$board}++; + } else { + $store->{$board} = $store->{$board}?-400:0; + $flag->{$board} = 0; + } + } + + $boardstring = " "; + foreach my $a (sort keys %$store) { + if ($store->{$a} >= 30) { + $boardstring .= sprintf("%04x ", $a); + $store->{$a} = -1010; + $flag->{$a} = 1; + } + } + if ($boardstring ne " ") { +# $msg = sprintf(" MDC \\ MBO %s might be locked up", $boardstring); + $msg = " MDC \\ MBO " . $boardstring . " might be locked up"; + + $log = $boardstring; + system("logger -p local1.info -t DAQ '".$msg."'"); +# Hmon::WriteLog($flog, "MBO-blocked", "MBO that might be locked: %s", $boardstring); + } + + if (++$numboards == 0) { + foreach my $f (%{$flag}) { + $numboards++ if (defined $flag->{$f} && $flag->{$f} != 0); + } + my $qastate = QA::GetQAState('below', $numboards, @QA::MdcLockLimits); +# QA::WriteQALog($fqa, "mdc", "blocked", 15, $qastate, "MBO Locked", "$numboards", +# "MBO that are locked: $numboards - " . $log); + $numboards = -10; + } + + sleep 1; +} + diff --git a/hmon/hmon_mdc_busy.pl b/hmon/hmon_mdc_busy.pl new file mode 100755 index 0000000..5e4023d --- /dev/null +++ b/hmon/hmon_mdc_busy.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; +use HADES::TrbNet; + + +my @str; + +my %laststore; +my $values = {}; +my $color = {}; +my $raw = {}; +my $val; +my $max; +my $min; +my $avg; +my $mean; + +my $flog = Hmon::OpenLogfile(); +my $fqa = QA::OpenQAFile(); + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_mdc_busy = trb_register_read(0xfffd, 0x9113) or sleep 5 and next; + + my $numboards = 0; + my %store; + foreach my $board (sort {$a <=> $b} keys %$rh_mdc_busy) { + my $id_0 = ($board >> 8) & 0xf; + my $id_1 = ($board >> 4) & 0xf; + my $id_2 = ($board >> 0) & 0xf; + $store{$id_0}->{$id_1}->{$id_2} = $rh_mdc_busy->{$board}; + $numboards++ if ($id_0 != 0xf); + } + + $values = Hmon::MakeDifferences(\%store, \%laststore, 2**31*2); + $max = 1.1E6; + $min = 0; + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Busy times (normalized to 100%)"); + for (my $l = 0; $l < 4; $l++) { + $str[0][$l] = + Hmon::MakeTitle(9, 3, "MDC $l Busy times (normalized to 100%)"); + $str[1][$l] = ""; + for (my $s = 0; $s < 6; $s++) { + for (my $b = 0; $b < 16; $b++) { + $color->{$b} = sprintf("style=\"background:%4s;\"", + Hmon::findcolor($values->{$l}->{$s}->{$b}, + $min, $max, 0)); + $raw->{$b} = sprintf("%.2f%%", $values->{$l}->{$s}->{$b} / 10000); + } + $str[1][$l] .= Hmon::DrawMDC($l, $s, $color, $raw); + } + $str[2][$l] = Hmon::DrawScale(0, 100, 40); + $str[2][$l] .= Hmon::MakeFooter(); + } + Hmon::WriteFile("MDCBusy", + $str[0][4]."

".$str[1][0].$str[1][1]."

". + $str[1][2]."

".$str[1][3].$str[2][0]); + + ($min, $max, $avg, $mean) = Hmon::MakeMinMax3($values, 4, 6, 16, 1); +# Hmon::WriteLog($flog, "MDC BusyTime", +# "Busy Times: min. %.2f%% - max. %.2f%% - Ø %.2f%%", +# $min / 10000, $max / 10000, $avg / 10000); + +# my $qastate = QA::GetQAState('above', $numboards, @QA::MdcOepLimits); +# QA::WriteQALog($fqa, "mdc", "oeps", 20, $qastate, +# "OEP present", "$numboards / " . $QA::MdcOepLimits[0], ""); + + %laststore = %store; + sleep 1; +} + diff --git a/hmon/hmon_mdc_invaliddatamode.pl b/hmon/hmon_mdc_invaliddatamode.pl new file mode 100755 index 0000000..0f23f19 --- /dev/null +++ b/hmon/hmon_mdc_invaliddatamode.pl @@ -0,0 +1,42 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use HADES::TrbNet; +use Hmon; +use QA; + + +trb_init_ports() or die trb_strerror(); +my $fqa = QA::OpenQAFile(); + + +my $cnt = 0; + +while (1) { + my $rh_status = trb_register_read(0xfffd, 0x22) or sleep 5 and next; + my $cnt = 0; + my $boardlist = ""; + foreach my $o (sort keys $rh_status) { + if ($rh_status->{$o} & (1 << 30)) { + $boardlist .= sprintf("%04x, ",$o); + $cnt++; + } + } + + my $qastate = QA::OK; + my $status = ""; + my $longmsg = "No OEP is out-of-order and sending the invalid data flag due to low HV"; + + + chop $boardlist; chop $boardlist; + $qastate = QA::WARN_2 if $cnt; + $status = "$cnt" if $cnt; + $longmsg = "Boards sending the out-of-order flag: $boardlist" if $cnt; + + QA::WriteQALog($fqa, "other", "mdcinvalid", 20, $qastate,"MDC HV", $status,$longmsg); + sleep(5); + } \ No newline at end of file diff --git a/hmon/hmon_mdc_linkerr.pl b/hmon/hmon_mdc_linkerr.pl new file mode 100755 index 0000000..41ef6ed --- /dev/null +++ b/hmon/hmon_mdc_linkerr.pl @@ -0,0 +1,53 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; + +my %laststore; +my $totalsum = 0; +use HADES::TrbNet; +use Hmon; +use QA; + +my $fqa = QA::OpenQAFile(); + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_mdc_link = trb_register_read(0xfffd, 0x4) or sleep 5 and next; + + my %store; + foreach my $board (sort {$a <=> $b} keys %$rh_mdc_link) { + $store{$board} = ((($rh_mdc_link->{$board} >> 24) & 0xff) + + (($rh_mdc_link->{$board} >> 16) & 0xff)); + } + + my $sum = 0; + if (%laststore) { + foreach my $c (keys %store) { + if (!defined $laststore{$c}) { + # new endpoint appeared + next; + } + if ($store{$c} - $laststore{$c} < 0) { + $sum += $store{$c} - $laststore{$c} + 256; + } else { + $sum += $store{$c} - $laststore{$c}; + } + } + $totalsum += $sum; + my $value = ""; + $value = $sum . " Errors" if $sum; + my $qastate = QA::GetQAState('below', $sum, @QA::LinkErrLimits); + QA::WriteQALog($fqa, "mdc", "linkqual", 20, $qastate, + "Link Errors", $value, + $sum . " errors in last second. $totalsum in total."); + } + + %laststore = %store; + sleep 1; +} diff --git a/hmon/hmon_mdc_plotmissingboards.pl b/hmon/hmon_mdc_plotmissingboards.pl new file mode 100755 index 0000000..99a2731 --- /dev/null +++ b/hmon/hmon_mdc_plotmissingboards.pl @@ -0,0 +1,54 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use List::Util 'max'; +use QA; +use Hmon; + + +my @str; + +my $color = {}; +my $raw = {}; +my ($max,$min); +my $lasttime = 0; +my $store = {}; + + my @out = qx(ssh lxhadesdaq cat /home/hadeslog/messages | grep 'Endp 0x\\w\\w\\w\\w missing' | grep -v 2006 | grep -v 2022 | grep -v 2358); + + + foreach my $s ( @out) { + my ($h,$m,$s,$id_0,$id_1,$id_2) = $s =~ m/(\d\d):(\d\d):(\d\d) .* Endp 0x2(\w)(\w)(\w) missing/; + my $time = ($h||0)*3600+($m||0)*60+($s||0); + if(defined $id_0 && defined $id_1 && defined $id_2 && $time>$lasttime+70) { + $id_2 = hex($id_2); + $store->{$id_0}->{$id_1}->{$id_2}++; + } + $lasttime = $time; + } + + ($min,$max) = Hmon::MakeMinMax3($store, 4, 6, 16); + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Failures"); + for (my $l = 0; $l < 4;$l++) { + $str[0][$l] = Hmon::MakeTitle(9, 3, "MDC $l Failures"); + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color->{$b} = sprintf("style=\"background:%4s;\"",Hmon::findcolor($store->{$l}->{$s}->{$b},$min,$max,0)); + $raw->{$b} = sprintf("%.1f",$store->{$l}->{$s}->{$b}); + } + $str[1][$l] .= Hmon::DrawMDC($l,$s,$color,$raw); + } + $str[2][$l] = Hmon::DrawScale($min,$max,42); + $str[2][$l] .= Hmon::MakeFooter(); + # Hmon::WriteFile("MDC".$l."Temperature",$str[0][$l].$str[1][$l].$str[2][$l]); + } + Hmon::WriteFile("MDCFailure",$str[0][4]."

".$str[1][0].$str[1][1]."

".$str[1][2]."

".$str[1][3].$str[2][0]); + + + diff --git a/hmon/hmon_mdc_rate.pl b/hmon/hmon_mdc_rate.pl new file mode 100755 index 0000000..2735e02 --- /dev/null +++ b/hmon/hmon_mdc_rate.pl @@ -0,0 +1,69 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use HADES::TrbNet; + +my %laststore; +my $color = {}; +my $raw = {}; +my $val; +my $max; +my $min; +my $avg; +my $lastevents=0; +use Hmon; +my $flog = Hmon::OpenLogfile(); + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_mdc_rates = trb_register_read(0xfffd, 0x910b) or sleep 5 and next; + my $events = trb_register_read(0x0002,1) or sleep 1 and next; + + my %store; + foreach my $board (sort {$a <=> $b} keys %$rh_mdc_rates) { + my $id_0 = ($board >> 8) & 0xf; + my $id_1 = ($board >> 4) & 0xf; + my $id_2 = ($board >> 0) & 0xf; + $store{$id_0}->{$id_1}->{$id_2} = $rh_mdc_rates->{$board}; + } + $events = ($events->{2}&0xffff); + my $rate = ($events || 0) - ($lastevents ||0); + if ($rate < 0) {$rate += 2**16;} + if ($rate == 0) {$rate = 1;} + $lastevents = $events; + + my @str; + my $values = {}; + $values = Hmon::MakeDifferences(\%store, \%laststore, 2**31*2); + ($min,$max,$avg) = Hmon::MakeMinMax3($values, 4, 6, 16, 0); + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Rates (log-scale, all MBO)"); + for (my $l = 0; $l < 4;$l++) { + $str[0][$l] = Hmon::MakeTitle(9, 3, "MDC $l Rates (log-scale, all MBO)"); + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color->{$b} = sprintf("style=\"background:%4s;\"", + Hmon::findcolor($values->{$l}->{$s}->{$b}, + 0, $max, 1)); + $raw->{$b} = sprintf("%.2g / %.1f per event", $values->{$l}->{$s}->{$b},$values->{$l}->{$s}->{$b}/$rate); + } + $str[1][$l] .= Hmon::DrawMDC($l, $s, $color, $raw); + } + $str[2][$l] = Hmon::DrawScale($min, $max, 40); + $str[2][$l] .= Hmon::MakeFooter(); + } + + Hmon::WriteFile("MDCRates", + $str[0][4]."

".$str[1][0].$str[1][1]."

". + $str[1][2]."

".$str[1][3].$str[2][0]); +# Hmon::WriteLog($flog, "MDC Rates", "Data Rates (words/s): min. %i - max. %i - Ø %i", $min, $max, $avg); + + %laststore = %store; + sleep 1; +} + diff --git a/hmon/hmon_mdc_ratecheck.pl b/hmon/hmon_mdc_ratecheck.pl new file mode 100755 index 0000000..409b80f --- /dev/null +++ b/hmon/hmon_mdc_ratecheck.pl @@ -0,0 +1,73 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use HADES::TrbNet; +use Hmon; +use QA; + +my $laststore; +my $values; +my ($sum,$num,$avg); +my $flog = Hmon::OpenLogfile(); +my $evtnum = 0; +my $rate = 0; +my $iteration = 0; + +trb_init_ports() or die trb_strerror(); +my $fqa = QA::OpenQAFile(); + +while (1) { + $sum = 0; + $num = 0; + my $error = 0; + my $boardlist = ""; + $values = (); + + my $rh_mdc_rates = trb_register_read(0xfffd, 0x910b) or sleep 5 and next; + my $rh_evts = trb_register_read(0x0002, 0x0001) or sleep 5 and next; + + foreach my $v (sort keys $rh_mdc_rates) { + $values->{$v} = ($rh_mdc_rates->{$v} || 0) - ($laststore->{$v} || $rh_mdc_rates->{$v} || 0); + $laststore->{$v} = $rh_mdc_rates->{$v}; + $sum += $values->{$v}; + $num++; + } + $rate = (($rh_evts->{2} || 0) & 0xffff) - $evtnum; + while ($rate < 0) {$rate += 2**16;} + $evtnum = (($rh_evts->{2} || 0) & 0xffff); + + + +# print $iteration."\n"; + if($iteration) { + $avg = $sum / ($num || $sum); +# print $rate." ".$num." ".$sum." ".$avg."\n"; + + + if($rate > 1000 && $avg > 1000) { + foreach my $v (sort keys $values) { +# print($v." ".$values->{$v}."\n"); + if($values->{$v} == 0) { + $error++; + $boardlist .= sprintf("%04x, ",$v); + } + } + } + chop $boardlist; chop $boardlist; + my $qastate = QA::OK; + my $status = ""; + $qastate = QA::ERROR if($error); + $status = $error." errors" if $error; + my $longmsg = sprintf("All MDC motherboard deliver data - Avg. number of words per second: %i - Avg number of words per event: %i",$avg,$avg/($rate || 1)); + $longmsg = "MDC motherboards not delivering data: $boardlist" if $error; + QA::WriteQALog($fqa, "mdc", "blocked", 20, $qastate,"MBO w/o data", $status,$longmsg); + } + else { + $iteration = 1; + } + sleep 10; + } \ No newline at end of file diff --git a/hmon/hmon_mdc_retr.pl b/hmon/hmon_mdc_retr.pl new file mode 100755 index 0000000..a1a723b --- /dev/null +++ b/hmon/hmon_mdc_retr.pl @@ -0,0 +1,110 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Data::Dumper; +use HADES::TrbNet; +use Hmon; + +my %laststore_lo; +my %laststore_hi; + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_mdc_retr = trb_register_read(0xfffd, 0x04) or sleep 5 and next; + + my %store_lo; + my %store_hi; + foreach my $board (keys %$rh_mdc_retr) { + my $l = ($board >> 8) & 0xf; + my $s = ($board >> 4) & 0xf; + my $b = ($board >> 0) & 0xf; + $store_lo{$l}->{$s}->{$b} = ($rh_mdc_retr->{$board} >> 16) & 0xff; + $store_hi{$l}->{$s}->{$b} = ($rh_mdc_retr->{$board} >> 24) & 0xff; + } + + my $ref_lo = Hmon::MakeDifferences(\%store_lo, \%laststore_lo, 2**8); + my $ref_hi = Hmon::MakeDifferences(\%store_hi, \%laststore_hi, 2**8); + + %laststore_lo = %store_lo; + %laststore_hi = %store_hi; + + my %store; + my %store2; + + for (my $l = 0; $l < 4; $l++) { + for (my $s = 0; $s < 6; $s++) { + for (my $b = 0; $b < 16; $b++) { + $store2{$l}->{$s}->{$b} = ($store_lo{$l}->{$s}->{$b}||0) + ($store_hi{$l}->{$s}->{$b}||0); + if (defined $ref_lo->{$l}->{$s}->{$b}) { + $store{$l}->{$s}->{$b} = $ref_lo->{$l}->{$s}->{$b} + $ref_hi->{$l}->{$s}->{$b}; + } + else { + $store{$l}->{$s}->{$b} = 0; + } + } + } + } + + my @str; + my %color; + my %raw; + my $max; + my $min; + ($min, $max) = Hmon::MakeMinMax3(\%store, 4, 6, 16, 0); + if ($min == 0 && $max == 0) { + $max = 1; + } + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Retransmission Rate "); + for (my $l = 0; $l < 4; $l++) { + $str[0][$l] = Hmon::MakeTitle(9, 3, "MDC $l Retransmission Rate "); + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color{$b} = sprintf("style=\"background:%4s;\"", + Hmon::findcolor($store{$l}->{$s}->{$b}, + $min, $max,0)); + $raw{$b} = sprintf("%.2g", $store{$l}->{$s}->{$b}); + } + $str[1][$l] .= Hmon::DrawMDC($l, $s, \%color, \%raw); + } + $str[2][$l] = Hmon::DrawScale($min, $max, 40); + $str[2][$l] .= "\n"; + } + + Hmon::WriteFile("MDCRetransmissionRate", + $str[0][4]."

".$str[1][0].$str[1][1]."

". + $str[1][2]."

".$str[1][3].$str[2][0]); + + + ($min, $max) = Hmon::MakeMinMax3(\%store, 4, 6, 16, 0); + if ($min == 0 && $max == 0) { + $max = 1; + } + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Retransmission Total "); + for (my $l = 0; $l < 4; $l++) { + $str[0][$l] = Hmon::MakeTitle(9, 3, "MDC $l Retransmission Total "); + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color{$b} = sprintf("style=\"background:%4s;\"", + Hmon::findcolor($store2{$l}->{$s}->{$b}, + $min, $max,0)); + $raw{$b} = sprintf("%.2g", $store2{$l}->{$s}->{$b}); + } + $str[1][$l] .= Hmon::DrawMDC($l, $s, \%color, \%raw); + } + $str[2][$l] = Hmon::DrawScale($min, $max, 40); + $str[2][$l] .= "\n"; + } + + Hmon::WriteFile("MDCRetransmission", + $str[0][4]."

".$str[1][0].$str[1][1]."

". + $str[1][2]."

".$str[1][3].$str[2][0]); + + + sleep 1; +} + + diff --git a/hmon/hmon_mdc_temp.pl b/hmon/hmon_mdc_temp.pl new file mode 100755 index 0000000..87e9f1a --- /dev/null +++ b/hmon/hmon_mdc_temp.pl @@ -0,0 +1,76 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use List::Util 'max'; +use QA; + +use Hmon; +my $flog = Hmon::OpenLogfile(); +my $fqa = QA::OpenQAFile(); + +use HADES::TrbNet; + +my @str; + +my $store = {}; +my $laststore = {}; +my $values = {}; +my $color = {}; +my $raw = {}; +my $val; +my ($max,$min,$avg,$mean); + +trb_init_ports() or die trb_strerror(); + + +while (1) { + my $rh_mdc_temp; + $rh_mdc_temp = trb_register_read(0xfffd, 0x0) or sleep 5 and next; + + foreach my $board (sort {$a <=> $b} keys %$rh_mdc_temp) { + my $id_0 = ($board >> 8) & 0x0f; + my $id_1 = ($board >> 4) & 0x0f; + my $id_2 = ($board >> 0) & 0x0f; + $store->{$id_0}->{$id_1}->{$id_2} = + (($rh_mdc_temp->{$board} >> 20) & 0xfff) / 16; + # printf "temp: %x %x %x\n", $id_0, $id_1, $id_2; + # printf "temp: %x\n", $store->{$id_0}->{$id_1}->{$id_2}; + } + + ($min,$max) = Hmon::MakeMinMax3($store, 4, 6, 16); + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Temperatures"); + for (my $l = 0; $l < 4;$l++) { + $str[0][$l] = Hmon::MakeTitle(9, 3, "MDC $l Temperatures"); + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color->{$b} = sprintf("style=\"background:%4s;\"",Hmon::findcolor($store->{$l}->{$s}->{$b},$min,$max,0)); + $raw->{$b} = sprintf("%.1f",$store->{$l}->{$s}->{$b}); + } + $str[1][$l] .= Hmon::DrawMDC($l,$s,$color,$raw); + } + $str[2][$l] = Hmon::DrawScale($min,$max,42); + $str[2][$l] .= Hmon::MakeFooter(); + # Hmon::WriteFile("MDC".$l."Temperature",$str[0][$l].$str[1][$l].$str[2][$l]); + } + Hmon::WriteFile("MDCTemperature",$str[0][4]."

".$str[1][0].$str[1][1]."

".$str[1][2]."

".$str[1][3].$str[2][0]); + + my @mint; my @maxt; + for (my $i = 0; $i<4; $i++) { + ($mint[$i],$maxt[$i],$avg,$mean) = Hmon::MakeMinMax2(\%{$store->{$i}},6,16,1); + Hmon::WriteLog($flog, "MDC $i Temp","Temperatures, Sector %i: min. %.1f°C - max. %.1f°C - Ø %.1f°C",$i,$min,$max,$avg); + } + + my $qastate = QA::GetQAState('below', max(@maxt), @QA::MdcTempLimits); + my $str = sprintf("%i/%i/%i/%i", $maxt[0], $maxt[1], $maxt[2], $maxt[3]); + QA::WriteQALog($fqa,"mdc","temp", 40, $qastate, "Temperature", $str, + "Max. temperature in each plane of MDC are " . $str); + $store = {}; + + sleep 20; +} diff --git a/hmon/hmon_mdc_tokenmiss.pl b/hmon/hmon_mdc_tokenmiss.pl new file mode 100755 index 0000000..ddda5a0 --- /dev/null +++ b/hmon/hmon_mdc_tokenmiss.pl @@ -0,0 +1,77 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use HADES::TrbNet; + + +my %laststore; +my $color = {}; +my $raw = {}; +my $val; +my $max; +my $min; +my $avg; + +use Hmon; +use QA; +my $flog = QA::OpenQAFile(); + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_mdc_tokenmiss = trb_register_read(0xfffd, 0x9101) or sleep 5 and next; + my $totalsum = 0; + my %store; + foreach my $board (sort {$a <=> $b} keys %$rh_mdc_tokenmiss) { + my $id_0 = ($board >> 8) & 0xf; + my $id_1 = ($board >> 4) & 0xf; + my $id_2 = ($board >> 0) & 0xf; + $store{$id_0}->{$id_1}->{$id_2} = $rh_mdc_tokenmiss->{$board}; + $totalsum += $rh_mdc_tokenmiss->{$board}; + } + + my @str; + my $values = {}; + my $sum = 0; + my $totalsum = 0; + my $r_store = \%store; + $values = Hmon::MakeDifferences($r_store, \%laststore, 2**31*2); + ($min,$max,$avg) = Hmon::MakeMinMax3($r_store, 4, 6, 16, 0); + $str[0][4] = Hmon::MakeTitle(9, 10, "MDC Missing Tokens"); + for (my $l = 0; $l < 4;$l++) { + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color->{$b} = sprintf("style=\"background:%4s;\"", + Hmon::findcolor($r_store->{$l}->{$s}->{$b}, + 0, $max, 1)); + $raw->{$b} = sprintf("%i", $r_store->{$l}->{$s}->{$b}); + $totalsum += $r_store->{$l}->{$s}->{$b}; + $sum += $values->{$l}->{$s}->{$b}; + } + $str[1][$l] .= Hmon::DrawMDC($l, $s, $color, $raw); + } + $str[2][$l] = Hmon::DrawScale($min, $max, 40); + $str[2][$l] .= Hmon::MakeFooter(); + } + + + + Hmon::WriteFile("MDCTokenMiss", + $str[0][4]."

".$str[1][0].$str[1][1]."

". + $str[1][2]."

".$str[1][3].$str[2][0]); + + my $qastate = QA::GetQAState('below', $sum, @QA::MdcTokenMissLimits); +# QA::WriteQALog($fqa, "mdc", "oeps", 20, $qastate, +# "OEP present", "$numboards / " . $QA::MdcOepLimits[0], ""); + + QA::WriteQALog($flog,"mdc","token",20,$qastate,"MBO Reinit",($sum || 0)."","Missing Tokens / MBO Reinitializations during last second: $sum - Total number of reinits: $totalsum"); + + %laststore = %store; + sleep 1; +} + diff --git a/hmon/hmon_mdc_voltage.pl b/hmon/hmon_mdc_voltage.pl new file mode 100755 index 0000000..93c4787 --- /dev/null +++ b/hmon/hmon_mdc_voltage.pl @@ -0,0 +1,68 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use POSIX qw(strftime); +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; +use HADES::TrbNet; + +my $store = {}; +my $msg = ""; +my $low = 0; +my $high = 0; +my $status = ""; + +my @names = qw(5.8V 5V 3.8V 3.3V 1.8V 1.2V 3V -3V); +my @minimum = (5.5, 4.75, 3.5, 3.15, 1.4, 1.15, 2.90, -3.05); +my @maximum = (6.1, 5.1, 4.0, 3.4, 2.0, 1.25, 3.10, -2.95); + + +my $fqa = QA::OpenQAFile(); +my $qastate; + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_volt = trb_register_read_mem(0xfffd, 0x8010, 0, 8) or sleep 5 and next; + + foreach my $board (sort {$a <=> $b} keys %$rh_volt) { + my $reg_address = 0; + foreach my $val (@{$rh_volt->{$board}}) { + if ($reg_address < 2) { + $store->{$reg_address}->{$board} = $val * 2; + } elsif ($reg_address == 7) { + $store->{$reg_address}->{$board} = -$val; + } else { + $store->{$reg_address}->{$board} = $val; + } + if ($store->{$reg_address}->{$board} > $maximum[$reg_address] * 1000) { + my $boardstr = sprintf("%04x",$board); + $msg .= " $boardstr $names[$reg_address] high (".sprintf("%.2fV),",$store->{$reg_address}->{$board}/1000.); + $high++; + } + if ($store->{$reg_address}->{$board} < $minimum[$reg_address] * 1000) { + my $boardstr = sprintf("%04x",$board); + $msg .= " $boardstr $names[$reg_address] low (".sprintf("%.2fV),",$store->{$reg_address}->{$board}/1000.); + $low++; + } + $reg_address++; + } + } + + $status = $high + $low . " warnings"; + my $qastate = QA::GetQAState('below', $high + $low, @QA::MdcVoltageLimits); + QA::WriteQALog($fqa, "mdc", "voltage", 30, $qastate,"Voltages", $status,$msg); + + $qastate = QA::OK; + $msg = ""; + $low = 0; + $high = 0; + $status = ""; + + sleep 15; +} diff --git a/hmon/hmon_mdchv_plottemplate.pl b/hmon/hmon_mdchv_plottemplate.pl new file mode 100755 index 0000000..c580a24 --- /dev/null +++ b/hmon/hmon_mdchv_plottemplate.pl @@ -0,0 +1,43 @@ +#!/usr/bin/perl -w +use strict; +use warnings; +use POSIX qw(strftime); +use Hmon; + + + +my $title = qq$ + + + + + + Hmon MDC HV Trends + + +

+

Hmon MDC HV Trends

+
+
+ $; + +my $foot = qq$ + + + $; + +my $out = $title; + +foreach my $i (0..3) { + $out .= "

Plane ".($i+1)."

"; + $out .= qq%Sector 1

%; + $out .= qq%Sector 2

%; + $out .= qq%Sector 3

%; + $out .= qq%Sector 4

%; + $out .= qq%Sector 5

%; + $out .= qq%Sector 6

%; + } + +my $fh; +open ($fh,"> ".Hmon::HMONDIR."/files/MDCHVtrends.htm") or die; +print $fh $out; diff --git a/hmon/hmon_muxhist.pl b/hmon/hmon_muxhist.pl new file mode 100755 index 0000000..13631bb --- /dev/null +++ b/hmon/hmon_muxhist.pl @@ -0,0 +1,76 @@ +#!/usr/bin/perl -w + +use Hmon; +use QA; +use HADES::TrbNet; + +trb_init_ports() or die("could not connect to trbnetd"); + + +my $str; + +my $plots = fork(); + + +if($plots) { + while(1) { + $str = Hmon::MakeTitle(10,12,"Mux Histogram",0); + my $binning = trb_register_read(3,0xa0c8) or sleep 5 and next; + my $offset = trb_register_read(3,0xa0c6) or sleep 5 and next; + my $source = trb_register_read(3,0xa0c2) or sleep 5 and next; + + $binning = QA::SciNotation($binning->{3}*100E-9); + $offset = QA::SciNotation($offset->{3}*100E-9); + + my @src; + $src[0] = $source->{3} & 0xFF; + $src[1] = ($source->{3} & 0xFF00) >> 8; + + foreach my $i (0..1) { + if ($src[$i] <= 7) {$src[$i] = "Start ".($src[$i]+1)." after edge detect";} + elsif($src[$i] <= 15) {$src[$i] = "Veto ".($src[$i]-7)." after edge detect";} + elsif($src[$i] <= 21) {$src[$i] = "TOF ".($src[$i]-15)." after edge detect";} + elsif($src[$i] <= 27) {$src[$i] = "RPC ".($src[$i]-21)." after edge detect";} + elsif($src[$i] <= 35) {$src[$i] = "PT ".($src[$i]-27)." after edge detect";} + + elsif($src[$i] <= 43) {$src[$i] = "Start ".($src[$i]-35)." after delay";} + elsif($src[$i] <= 51) {$src[$i] = "Veto ".($src[$i]-43)." after delay";} + elsif($src[$i] <= 57) {$src[$i] = "TOF ".($src[$i]-51)." after delay";} + elsif($src[$i] <= 63) {$src[$i] = "RPC ".($src[$i]-57)." after delay";} + elsif($src[$i] <= 71) {$src[$i] = "PT ".($src[$i]-63)." after delay";} + + elsif($src[$i] <= 77) {$src[$i] = "Sectorwise Mult. ".($src[$i]-71);} + elsif($src[$i] <= 78) {$src[$i] = "Sectorwise Mult. 2 no neighbor";} + elsif($src[$i] <= 79) {$src[$i] = "Sectorwise Mult. 3 no neighbor";} + elsif($src[$i] <= 80) {$src[$i] = "Sectorwise Mult. 2 opposite";} + + elsif($src[$i] <= 87) {$src[$i] = "Wrong setting";} + elsif($src[$i] <= 93) {$src[$i] = "TOF ".($src[$i]-87)." after width";} + elsif($src[$i] <= 99) {$src[$i] = "RPC ".($src[$i]-93)." after width";} + elsif($src[$i] <= 107){$src[$i] = "PT ".($src[$i]-99)." after width";} + elsif($src[$i] <= 126){$src[$i] = "Wrong setting";} + + elsif($src[$i] <= 127){$src[$i] = "Start for coincidence";} + elsif($src[$i] <= 128){$src[$i] = "Veto for anti-coincidence";} + elsif($src[$i] <= 129){$src[$i] = "Anti-coincidence";} + else {$src[$i] = "Wrong setting";} + + } + + + $str .= qq@Source A: @.$src[0].qq@, Source B: @.$src[1].qq@
Offset: $offset@.qq@s - Binning: $binning@.qq@s@; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("Muxhist",$str); + sleep(5); + } + } + +else { + qx(./hmon_hadplot.sh -d 3000 \\ + -a 0x0003 -r 41216 -m 500 -p 0 -w 32 -t "A" \\ + -a 0x0003 -r 41716 -m 500 -p 0 -w 32 -t "B" \\ + -output "PNG.files/muxhist.760.530" -curvestyle steps -key genreg 2>/dev/null & + + ); + } + diff --git a/hmon/hmon_muxhist_ratio.pl b/hmon/hmon_muxhist_ratio.pl new file mode 100755 index 0000000..e7a1e0c --- /dev/null +++ b/hmon/hmon_muxhist_ratio.pl @@ -0,0 +1,105 @@ +#!/usr/bin/perl -w +use strict; +use warnings; +use Time::HiRes qw( gettimeofday usleep time ); +use POSIX qw(strftime); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; +use Perl2Epics; +use HADES::TrbNet; +use HPlot; + + +my @names = qw( reflowPressureAthm reflowPressureCompr reflowInO2 reflowRatioCO2 opensysFreshARGON opensysFreshCO2 reflowFreshArgon reflowFreshIsob pipePressureIsoB ); +my @names2 = qw(waage_1_net waage_2_net); +my @names3 = qw(targetVakPressure); +trb_init_ports() or die("could not connect to trbnetd"); + +my $plot = (); +$plot->{name} = "MuxRatio"; +$plot->{file} = "files/CtsMuxRatio"; +$plot->{entries} = 440; +$plot->{type} = HPlot::TYPE_HISTORY; +$plot->{output} = HPlot::OUT_PNG; +$plot->{titles}->[0] = ""; +$plot->{titles}->[1] = ""; +$plot->{xlabel} = "Bins"; +$plot->{ylabel} = "Ratio Source B / Source A"; +$plot->{sizex} = 630; +$plot->{sizey} = 330; +$plot->{curves} = 1; +$plot->{countup} = 1; +$plot->{nokey} = 1; + +HPlot::PlotInit($plot); + + + +while(1) { + +my $str = Hmon::MakeTitle(8,8,"CTS Mux Histogram Ration",0); + my $binning = trb_register_read(3,0xa0c8) or sleep 5 and next; + my $offset = trb_register_read(3,0xa0c6) or sleep 5 and next; + my $source = trb_register_read(3,0xa0c2) or sleep 5 and next; + + $binning = QA::SciNotation($binning->{3}*100E-9); + $offset = QA::SciNotation($offset->{3}*100E-9); + + my @src; + $src[0] = $source->{3} & 0xFF; + $src[1] = ($source->{3} & 0xFF00) >> 8; + + foreach my $i (0..1) { + if ($src[$i] <= 7) {$src[$i] = "Start ".($src[$i]+1)." after edge detect";} + elsif($src[$i] <= 15) {$src[$i] = "Veto ".($src[$i]-7)." after edge detect";} + elsif($src[$i] <= 21) {$src[$i] = "TOF ".($src[$i]-15)." after edge detect";} + elsif($src[$i] <= 27) {$src[$i] = "RPC ".($src[$i]-21)." after edge detect";} + elsif($src[$i] <= 35) {$src[$i] = "PT ".($src[$i]-27)." after edge detect";} + + elsif($src[$i] <= 43) {$src[$i] = "Start ".($src[$i]-35)." after delay";} + elsif($src[$i] <= 51) {$src[$i] = "Veto ".($src[$i]-43)." after delay";} + elsif($src[$i] <= 57) {$src[$i] = "TOF ".($src[$i]-51)." after delay";} + elsif($src[$i] <= 63) {$src[$i] = "RPC ".($src[$i]-57)." after delay";} + elsif($src[$i] <= 71) {$src[$i] = "PT ".($src[$i]-63)." after delay";} + + elsif($src[$i] <= 77) {$src[$i] = "Sectorwise Mult. ".($src[$i]-71);} + elsif($src[$i] <= 78) {$src[$i] = "Sectorwise Mult. 2 no neighbor";} + elsif($src[$i] <= 79) {$src[$i] = "Sectorwise Mult. 3 no neighbor";} + elsif($src[$i] <= 80) {$src[$i] = "Sectorwise Mult. 2 opposite";} + + elsif($src[$i] <= 87) {$src[$i] = "Wrong setting";} + elsif($src[$i] <= 93) {$src[$i] = "TOF ".($src[$i]-87)." after width";} + elsif($src[$i] <= 99) {$src[$i] = "RPC ".($src[$i]-93)." after width";} + elsif($src[$i] <= 107){$src[$i] = "PT ".($src[$i]-99)." after width";} + elsif($src[$i] <= 126){$src[$i] = "Wrong setting";} + + elsif($src[$i] <= 127){$src[$i] = "Start for coincidence";} + elsif($src[$i] <= 128){$src[$i] = "Veto for anti-coincidence";} + elsif($src[$i] <= 129){$src[$i] = "Anti-coincidence";} + else {$src[$i] = "Wrong setting";} + + } + + + $str .= qq@Source A: @.$src[0].qq@, Source B: @.$src[1].qq@
Offset: $offset@.qq@s - Binning: $binning@."s (20 bins skipped at beginning of spill)"; + +$str .= qq@@; +$str .= Hmon::MakeFooter(); +Hmon::WriteFile("CtsMuxRatio",$str); + + + + my $mux1 = trb_register_read_mem(3,41236,0,460) or sleep 5 and next; + my $mux2 = trb_register_read_mem(3,41736,0,460) or sleep 5 and next; + + for(my $i=0;$i<440;$i++){ + my $e = $mux2->{3}->[$i]/($mux1->{3}->[$i] || 1); + HPlot::PlotAdd("MuxRatio",$e); + } + + HPlot::PlotDraw("MuxRatio"); + sleep(3); + } diff --git a/hmon/hmon_onlineqa.pl b/hmon/hmon_onlineqa.pl new file mode 100755 index 0000000..ab93187 --- /dev/null +++ b/hmon/hmon_onlineqa.pl @@ -0,0 +1,50 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; + + +my $fqa = QA::OpenQAFile(); +my $timecnt = 0; +my $qastate = QA::OK; + + +while (1) { + my $title = "Online QA"; + my $longmsg = "The QA server process is running."; + my $msg = ""; + + + my $cmd = "ssh lxhadeb06 'pgrep -fl \"hadesonlineserver.exe .* 9876\"' 0 && $out[0] =~ /hadesonlineserver.exe .* 9876/) { + $qastate = QA::ERROR; + $msg = "Not found"; + $longmsg = "The online QA server process could not be found."; + } + + QA::WriteQALog($fqa, "main", "onlineqa", 40, $qastate, $title, $msg, $longmsg); + + + if ($qastate > 60 && !($timecnt++ % 20)) { +# system("logger -p local1.info -t DAQ 'Hmon Online QA Server not found'"); + Hmon::Speak("qa","QA server crashed."); + $qastate = QA::WARN_2; + $timecnt = -4; + } + + + sleep 9; +} diff --git a/hmon/hmon_permanent_tail b/hmon/hmon_permanent_tail new file mode 100755 index 0000000000000000000000000000000000000000..a561bcd3914febd93d5df8f2a436a32724bda358 GIT binary patch literal 64568 zcmeFad3;nw_BVVxB+#gMqoM{CiP~tQEQu^8LbMw?a2q-jWswma!WLjyO}a^3Y3y#u zowhYP=*;+=an#Wn*Krw#L3BbENWc+Aa6xf2;&v|q*%SgOdB5MPdy@;2-}^kz`##TK zPv_Hpt4^J&I(6#QsZ*z_Zk81WN2R!2iv3AZu2UGx^LhnH{whl4_abV+@|5n1SLvf% ztaJq=4PUQF;Zug}XRB4T{d8M+UGPlBH!np3@>0AaU_URCV8wpg6!OXXIzC=2D4&Br zlTrJrD47Dle5AE_kBH(~A_DevpH=AN-DJ9*kK{4mMl0V&E1&&rwg|JIcKg^iekWM% zn~>r~jBzg?ieLP8Jc-Ls@zOBQ9QjOU_X0Wi1yRYcO&wV&i~PmP3KKkeVy^; zWs83MX*E|FxM1Flp@Ro5nALy5yhY*4{*`${`wtyFpnUOwt3|uhK?re2-!M^-Wb-i- zG1A-#t1%?jbZqn zfiLkd#`ijWd*gc}zS;Ql(*xf^e1rHF;ah<3P57RTFF#}P%@ZL->5JzGe8=EB!Gh)D zc^bagT5&!swkSCW`|!PjKD~x1R;$V-&tO;7k5o zjW0js(*S%gXXJnK^WVwC=_pHelxNEW`-Gnh@ zxp-b`CpeyznL+qoiSH16FTFC-4FY{;A5j zwv&2Sbb?>q34DDg@V|6Y{(YU`FY1K;i#jPs>jb{4lX5QTq+X8oQ}IXZ1i!Kq{7IeA z6YB*3{Z7iC)CvCYJ1PInPT-$+QhrG%_~&$j|JP3NcXmQ&WheNrc2fS`o!}qn1mD*Q z{_~yS16|3)_vFu@PRjXHC-6fk;8f#%Kj5d5pRS$IGq4l*>Q2h}MAko!}4cq~2I3_5QMxa^CC&e;mp`l|28elX9N!1irnK@*e{HELct6 zgC)qRD7L*aK=jK6O6>s&r|rZ~n}t95Bz(^6EJw58HvS$9zxX8lVWRwWrFp%V#VWKP z#An*HISUsrnpPf~UKW}*O@TQ)lh*H0rL=TGxO}cs9x9u;>Fv|X z7EY^}9-0ZFW-pjMGo;KbuMkuzWwWO*Kov?UGKNaamFY7Um!Xc?mGeT%!r2Q+3Lb)_ z`STVmP?nS}o>Mk`;k0>+mZBY@d0@bz=?iD0=IQ0-v%v^a?X+n#L$@!PJqbPgWNv8I;&4b=P(FM1e1QS(m(Eq zWgg%oJJ67$lB`uq=b@F0mC}l`c_Ff^bjj>RRzZThr(kUPT=a!xZ|SVXz;CZ@`m9-2 zf0oW%6k4Fnfap*-W-VSgecmFgk`Cbkiz#B$rcp*Mffb0NLuO4|fbIv+*!IOsXO{_< zP?XSH;RWdG(Co5B(}A=k94hZ96|7)GNVp{ec5qs07@`73R!*Nb9dv=y{1LJdE}N~O zj&e#4I(*v9#Y=84n>S}}NEsarj2JoX>H&iW3~mqSI)X#mp&h_M?Xar{P|;&m*4bYd zM@p&{PJ{K|8NLl?nOy~zoht?FGdtCOcKaEGDIL&MQIpHUf~vuKqpOmRC%^oJdd^*^(oh>)Q$G%Wd}ajWA>-k0q2^|{%mx>i)|pDTO4qEJ4e*Qoba0*__iJ=++KGxIb&Z5A7VYoey~584mhT=_D_}rZqF4= z%yGb3hyBTOz{zX-<8{F8wJ6gx2i%_12rqWPxvsT8lO1sSB zT;hO3klH_$4!CpO9dW?bc5Fqda=>j_W^%Oy?z9Vj=YTuyug4wma~$PAp71Mc)KY;nMyK921UxYI|{?10m^V}A?>-1cQMZJz^9 zf0g}db-?M*YX9sn5kbn1)4$?&z%vDg{7HAfFLA PmpW@Jt8%G6y`%0rxoIISzPV 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 literal 0 HcmV?d00001 diff --git a/hmon/hmon_rate2.pl b/hmon/hmon_rate2.pl new file mode 100755 index 0000000..fb07e15 --- /dev/null +++ b/hmon/hmon_rate2.pl @@ -0,0 +1,107 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Hmon; +use HADES::TrbNet; + +trb_init_ports() or die trb_strerror(); + +my $flog = Hmon::OpenLogfile(); + +while (1) { + my $rh_rate; + $rh_rate = trb_register_read_mem(0x0003, 0xa001, 0, 0xff) or sleep 5 and next; + + my %store; + foreach my $board (sort {$a <=> $b} keys %$rh_rate) { + my $ctr = 0xa001; + foreach my $val (@{$rh_rate->{$board}}) { + $store{$ctr} = $val; + $ctr++; + } + } + + my $ena = $store{0xa0c3} + $store{0xa0c4} * 2**32; + my $eno = $store{0xa0c7}; + my $str = ""; + + $str = Hmon::MakeTitle(12, 5, "CTS Rates", 1, ""); + $str .= "\n"; + $str .= "
12345678\n"; + $str .= "
Start in"; + + my $i; + foreach $i (0, 1, 2, 3, 4, 5, 6, 7) { + $str .= sprintf("%d", ($ena & ( 1<< $i)) ? "on" : "off", + $store{0xa008+$i}); + } + $str .= "
Veto in"; + foreach $i (8, 9, 10, 11, 12, 13, 14, 15) { + $str .= sprintf("%d", ($ena & (1 << $i)) ? "on" : "off", + $store{0xa008+$i}); + } + + $str .= "
TOF in"; + foreach $i (16, 17, 18, 19, 20, 21) { + $str .= sprintf("%d", ($ena & (1 << $i)) ? "on" : "off", + $store{0xa008+$i}); + } + $str .= "----"; + $str .= "
RPC in"; + foreach $i (22, 23, 24, 25, 26, 27) { + $str .= sprintf("%d", ($ena & (1 << $i)) ? "on" : "off", + $store{0xa008+$i}); + } + $str .= "----"; + $str .= "
Mult out"; + foreach $i (2, 3, 4, 5, 6, 7) { + $str .= sprintf("%d", ($eno & (1<<($i))) ? "on" : "off", + $store{0xa03f+$i}); + } + $str .= "----"; + + $str .= "
PT in"; + foreach $i (28, 29, 30, 31, 32, 33, 34, 35) { + $str .= sprintf("%d", ($ena & (1 << $i)) ? "on" : "off", + $store{0xa008+$i}); + } + $str .= "
PT dsc"; + foreach $i (11, 12, 13, 14, 15, 16, 17, 18) { + $str .= sprintf("%d","on",$store{0xa02c+$i}); + } + $str .= "
PT coin"; + foreach $i (9,10,11, 12, 13, 14, 15, 16) { + $str .= sprintf("%d","on",$store{0xa052+$i}); + } + $str .= "
PT out"; + foreach $i (11, 12, 13, 14, 15, 16, 17, 18) { + $str .= sprintf("%d", ($eno & (1 << $i)) ? "on" : "off", + $store{0xa03f+$i}); + } + $str .= "
Pulser"; + $str .= sprintf("%d", ($store{0xa0e3}) ? "on" : "off", + ($store{0xa0e3}) ? 1/$store{0xa0e3} * 2E8 : 0); + $str .= "--"; + $str .= sprintf("MDC Calib.", + ($store{0xa0c0} &0x20) ? "on" : "off"); + $str .= sprintf("SHW Calib.", + ($store{0xa0c0} &0x100) ? "on" : "off"); + $str .= sprintf("SHW Ped.", + ($store{0xa0c0} & 0x80) ? "off" : "on"); + $str .= sprintf("Status", + ($store{0xa0c0}& 0x200)?"on":"off"); + $str .= "----"; + $str .= "
Out"; + $str .= sprintf("%d", + ($store{0xa001}) ? "on" : "off", $store{0xa001}); + $str .= "
\n"; + $str .= Hmon::MakeFooter(); + + Hmon::WriteFile("CTSRates", $str); + + + sleep 1; +} + + diff --git a/hmon/hmon_readoutstuck.pl b/hmon/hmon_readoutstuck.pl new file mode 100755 index 0000000..01bf99d --- /dev/null +++ b/hmon/hmon_readoutstuck.pl @@ -0,0 +1,71 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use HADES::TrbNet; +use Hmon; +use QA; + +my $evtnum = 0; +my $rate = 0; + +trb_init_ports() or die trb_strerror(); +my $fqa = QA::OpenQAFile(); +Hmon::TraceDBLoad(); + +sub isFeeHub { + my $h = shift; + my $hubs = "3200 3210 3220 3230 3240 3250 8301 8311 8321 8401 8411 8601 8701 8801"; + my $hs = sprintf("%04x",$h); +# print $h."\n"; + if (index($hubs,$hs) != -1) { + return 1; + } + if ($h > 0x1000 && $h < 0x1200 && $h%16) { + return 1; + } + return 0; +} + + +while (1) { + my $boardlist = ""; + my $rh_status = trb_register_read(0x0003, 0xa0f8) or sleep 5 and next; + my $rh_evts = trb_register_read(0x0002, 0x0001) or sleep 5 and next; + + $rate = (($rh_evts->{2} || 0) & 0xffff) - $evtnum; + while ($rate < 0) {$rate += 2**16;} + $evtnum = ($rh_evts->{2} || 0) & 0xffff; + + my $qastate = QA::OK; + my $status = ""; + my $longmsg = "Read-out has no error"; + + if($rate == 0 && ($rh_status->{3} & (1 << 31)) && ($rh_status->{3} & 0x3ff00000)) { + my $rh_hubs = trb_register_read(0xfffe,0x81) or sleep 5 and next; + foreach my $h (sort keys $rh_hubs) { + if($rh_hubs->{$h} != 0) { +# $boardlist .= sprintf("%04x, ",$h); + if (isFeeHub($h)) { + for (my $i=0; $i<12; $i++) { + if ($rh_hubs->{$h} & (1<<$i)) { + $boardlist .= sprintf("%04x (%04x-%i), ",Hmon::TraceDBGet($h,$i-1),$h,($i-1));# + } + } + } + } + } + } + + chop $boardlist; chop $boardlist; + $qastate = QA::ERROR if $boardlist ne ""; + $status = "Waiting" if $boardlist ne ""; + $longmsg = "Read-out seems to be stuck. Hubs waiting for read-out: $boardlist" if $boardlist ne ""; + + QA::WriteQALog($fqa, "daq", "readout", 30, $qastate,"Read-out", $status,$longmsg); +# print $qastate." ".$status." ".$longmsg."\n"; + sleep(5); + } \ No newline at end of file diff --git a/hmon/hmon_rich_apvs.pl b/hmon/hmon_rich_apvs.pl new file mode 100755 index 0000000..ed26d6b --- /dev/null +++ b/hmon/hmon_rich_apvs.pl @@ -0,0 +1,128 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use QA; +use Data::Dumper; +use HADES::TrbNet; + +my $SLEEP_TIME = 10; +my $flog = QA::OpenQAFile(); + +trb_init_ports() or die trb_strerror(); + +while (1) { + + # Default Output Values + my $title = "Rich APVs"; + my $shorttext = ""; + my $longtext = " - all APV Sync-Bits are set," . + " - all Trigger- and IPU-Counters are in Sync"; + my $status = QA::OK; + + # Check APV Sync-Bits and config + my $rh_apv = trb_register_read_mem(0xfffb, 0xb000, 0, 15) + or sleep $SLEEP_TIME and next; + + # Check APV Sync-Bits + my $num_sync_error = 0; + my $sync_error_msg; + + foreach my $board (sort {$a <=> $b} keys %$rh_apv) { + my $apv_list_sync; + my $apv_ctr = 0; + + foreach my $val (@{$rh_apv->{$board}}) { + # Sync Status, error if not in sync (Bit31==1) and activated (Bit29==0) + if (!(((($val >> 29) & 0x7) == 0x4) || + ((($val >> 29) & 0x7) == 0x1))) { + $num_sync_error++; + if (!defined $apv_list_sync) { + $apv_list_sync = $apv_ctr; + } else { + $apv_list_sync = $apv_list_sync . ", " . $apv_ctr; + } + } + $apv_ctr++; + } + if (defined $apv_list_sync) { + $sync_error_msg = $sync_error_msg . + sprintf " - 0x%04x: %s", $board, $apv_list_sync; + } + } + + # CheckTrigger and IPU Counters + $rh_apv = trb_register_read(0xfffb, 0x80) + or sleep $SLEEP_TIME and next; + + my $trigger_error_msg; + my $ipu_error_msg; + my $num_trigger_error = 0; + my $num_ipu_error = 0; + + my $trigger_counter; + my $ipu_counter; + foreach my $board (sort {$a <=> $b} keys %$rh_apv) { + my $trigger_ctr = $rh_apv->{$board} & 0xffff; + my $ipu_ctr = ($rh_apv->{$board} >> 16) & 0xffff; + + if (!defined $trigger_counter) { + $trigger_counter = $trigger_ctr; + } + if (!defined $ipu_counter) { + $ipu_counter = $ipu_ctr; + } + + # Trigger Counter + if ($trigger_ctr != $trigger_counter) { + $num_trigger_error++; + if (!defined $trigger_error_msg) { + $trigger_error_msg = $trigger_error_msg . sprintf " 0x%04x", $board; + } else { + $trigger_error_msg = $trigger_error_msg . sprintf ", 0x%04x", $board; + } + } + + # IPU Counter + if ($trigger_ctr != $trigger_counter) { + $num_ipu_error++; + if (!defined $ipu_error_msg) { + $ipu_error_msg = $ipu_error_msg . sprintf " 0x%04x", $board; + } else { + $ipu_error_msg = $ipu_error_msg . sprintf ", 0x%04x", $board; + } + } + } + + # Create Output Messages + if (($num_sync_error > 0) || + ($num_ipu_error > 0) || + ($num_trigger_error > 0)) { + $shorttext = "Errors: '"; + $shorttext = $shorttext . ($num_sync_error > 0 ? "S" : "_"); + $shorttext = $shorttext . ($num_trigger_error > 0 ? "T" : "_"); + $shorttext = $shorttext . ($num_ipu_error > 0 ? "I" : "_"); + $shorttext = $shorttext . "'"; + + $longtext = "Errors on: - "; + $longtext = $longtext . + ($num_sync_error > 0 ? + $num_sync_error . " APV_SYNC: " . $sync_error_msg . " - " + : ""); + $longtext = $longtext . + ($num_ipu_error > 0 ? + $num_ipu_error . " ADCM_IPU: " . $ipu_error_msg . " - " + : ""); + $longtext = $longtext . + ($num_trigger_error > 0 ? + $num_trigger_error . " ADCM_Trig: " .$trigger_error_msg . " - " + : ""); + + $status = QA::FATAL; + } + + QA::WriteQALog($flog, "feeerr", "rich", $SLEEP_TIME * 2, + $status, $title, $shorttext, $longtext); + + sleep $SLEEP_TIME; +} diff --git a/hmon/hmon_rsync b/hmon/hmon_rsync new file mode 100755 index 0000000000000000000000000000000000000000..fa2f609cb5035de92641ae7b78aba181bcf34359 GIT binary patch literal 461368 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ʊ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 S55AA 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

CYOAZ~Nohf6=O6AIH{zIVAs( z#kce8EB_}wd|&w-v-q~3zWp;H`Q29i+W!0eS?l5Z@|$V(U)#Qqzs{;(oA1kSUr76% zA?<(M;`_=ZnQx_z(v>w>=L0uFVVB8oJ^f4PBTIan|DuPl^J-oGA3XeCE5Ek=Qy%`q z9{x)n{ujw#Bo3vpeS`el!L{3i?VD|8(DKLT+Z=m;e@Olz^6OIc=er^8KO2(&9Qh03 zkEh7(>_%o;_q*&eJne}*)5HIrhkuoaKkDJv@_2Gjisku2$nrTIlD~%I$&XAbwMfL3 zHTb2F_9sH}GdQ1D(zEMJ(|7SIi*FyVeEw_v3f&>PvIgf`_U-=V^X;u3zS?u~(;<)N zb3)qx0>{IWuFq%Nr!67^xBH`OSLH`6zTF-)+{LexUyA^n@2k59E_4*$awG1eY~>k%kD2e z|Lyv+`F2~f%VrHOxh25e*C{SpHSydy7TW`c~YK32r@4s*(S%{ z`S?#3X1B$Ki%QCt++1FnyNCb=h}@gg?GMr-M_mt&2Rkkt8(m!N-g|dvZWt*TJ4J53!J7oOHr~F#V z+BdQ(7c=}C%H5P_Qr<@S?UZ{d&!*f*`Q4QJDZh{MZpsTN@1+se=?Z!2cFaO}Lsv`v*O&y)>oi(+Qg67uFhW55dLFctx3ggrej6bmY(srbXHBG_p=otvd(HZW)lKz?tCESax~9Fo<{lG6_t(~e zCQ&6FSP6WpS>Id-KQ_R+v0B^F5hSaiCCInp;zy zhNQ*rMOn8%`mdgwinyaV!-?tkb*)2Mmo!n8(y-0lN*V6Jd zzOLt>c#0R`dXCk8t$xV${TS9Z(D=IkgW_Q}P&dB1bt8793^l&4523g>-!L_gntl!q zlmg|FO5^K#6Nc6I=co*W!S`aGhdJu}kOi26} zQ|dp}k+s;7vefvxK82#LPoe2+e9eES6JOW6P}KD?B)%-o;l`KObfitHeO)g^@mhr0 zo7TJPiuWPRjz9X0AuE~stS*}3NF&bajd)by^{DX)q`PcZpTrZ|K#rXf`#P4VP ze#YO+;}2-T79}b?haJhOrmyRuR6JwyU&xB#VJP1IwH^Huac%!~eVOiWoA_4wN#EY?gw09NF3QRv7`G&V}7?YeJv*qbGaf<_RuhQGX5K#2#y%}FUzQuCjbBd literal 0 HcmV?d00001 diff --git a/hmon/hmon_shower.pl b/hmon/hmon_shower.pl new file mode 100755 index 0000000..a88af02 --- /dev/null +++ b/hmon/hmon_shower.pl @@ -0,0 +1,129 @@ +#!/usr/bin/perl -w + +#use warnings; +#use strict; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; + +my %laststore; +my $totalsum = 0; +use HADES::TrbNet; +use Hmon; +use QA; +use Perl2Epics; + +my $fqa = QA::OpenQAFile(); + +trb_init_ports() or die trb_strerror(); + +my %values; +my $sum = 0; + +my $alertCtr = 0; + + +for (my $s = 1; $s < 7; $s++) { + for (my $c = 0; $c < 3; $c++) { + Perl2Epics::Connect($s.$c, "HAD:SHWR:HV:S".$s.":C".$c.":imon"); + } +} + +while (1) { + + # get data from epics + my $data = Perl2Epics::GetAll(); + + my $setAlert = 0; + + # analyze data from TrbNet + my $bytes_sent = trb_register_read(0xff7f, 0x83f3) or sleep 5 and next; + my $configuration = trb_register_read(0xfff7, 0xc0) or sleep 5 and next; + + foreach my $board (sort {$a <=> $b} keys %$bytes_sent) { + my $hexval = sprintf("%x", $board); + my @a = split("", $hexval); + if($a[0] == "3" && $a[1] == "2") { + $values{$board}->{"bytes"} = %$bytes_sent->{$board} - $values{$board}->{"prev_bytes"} if defined %$bytes_sent->{$board}; + $values{$board}->{"prev_bytes"} = %$bytes_sent->{$board}; + + $sum += $values{$board}->{"bytes"}; + } + } + + foreach my $board (sort {$a <=> $b} keys %values) { + next if !defined $values{$board}->{"bytes"}; + + if ((($values{$board}->{"bytes"} > (($sum / 6) + (($sum / 6) * 0.4))) || ($values{$board}->{"bytes"} < (($sum / 6) - (($sum / 6) * 0.4)))) && $values{$board}->{"bytes"} != 0 && $sum > 25000) { + $setAlert = 1; + + } + } + + my $pattern = 0; + my $threshold = 0; + my $patternSum = 0; + my $thresholdSum = 0; + foreach my $board (keys %$configuration) { + $pattern = sprintf("%x", ((%$configuration->{$board} & 0xf0) >> 4)); + $threshold = sprintf("%x", (%$configuration->{$board} & 0xf)); + $patternSum += $pattern; + $thresholdSum += $threshold; + } + if ($patternSum / 12 != $pattern || $thresholdSum / 12 != $threshold) { + $setAlert = 2; + } + + + $sum = 0; + + #analyze data from EPICS + my $iSum = 0; + foreach my $n (%$data) { + if (defined %$data->{$n}->{"val"}) { + $iSum += %$data->{$n}->{"val"}; + } + } + + foreach my $n (%$data) { + if (defined %$data->{$n}->{"val"}) { + if (%$data->{$n}->{"val"} > ($iSum / 18) + 0.5) { + $setAlert = 3; + } + } + } + + #display results + + + my $message = ""; + foreach my $board (sort {$a <=> $b} keys %values) { + next if !defined $values{$board}->{"bytes"}; + $message .= "0x".sprintf("%x", $board); + $message .= ": ".(int ($values{$board}->{"bytes"} / 1000))."kB - "; + } + + $message .= " Sampling pattern set to: ".$pattern." - "; + $message .= " Global threshold set to: ".$threshold." - "; + + if ($setAlert != 0) { $alertCtr++; } + + if ($setAlert == 0) { + #print Dumper $message; + QA::WriteQALog($fqa, "other", "shower", 20, QA::OK, "Shower", "OK", "Proper operation - Data rates: - ".$message); + + $alertCtr = 0; + } + elsif ($setAlert == 1 && $alertCtr > 9) { + QA::WriteQALog($fqa, "other", "shower", 20, QA::WARN, "Shower", "Data rates", "Excessive amount of data generated by one or more of the sectors - ".$message); + } + elsif ($setAlert == 2 && $alertCtr > 9) { + QA::WriteQALog($fqa, "other", "shower", 20, QA::ERROR, "shower", "Configuration error", "There is a missmatch in the sampling pattern or thresholds configuration between Addon boards - ".$message); + } + elsif ($setAlert == 3 && $alertCtr > 2) { + QA::WriteQALog($fqa, "other", "shower", 20, QA::WARN, "shower", "Current problem", "There is a problem with currents one module."); + } + + sleep 1; +} diff --git a/hmon/hmon_spill.pl b/hmon/hmon_spill.pl new file mode 100755 index 0000000..1e4823f --- /dev/null +++ b/hmon/hmon_spill.pl @@ -0,0 +1,130 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HADES::TrbNet; +use HPlot; + +my $lastspill = 1; +my $evtrate = 0; +my $events = 0; +my $spilllength = 0; +my $lastres = 0; +my $outofspill = 0; +my @spills; +my $spillavgshort = 0; +my $spillavglong = 0; +my $errtime = 0; + + +my $plot = (); +$plot->{name} = "EvtsPerSpill"; +$plot->{file} = "files/EvtsPerSpill"; +$plot->{entries} = 40; +$plot->{type} = HPlot::TYPE_HISTORY; +$plot->{output} = HPlot::OUT_PNG; +$plot->{titles}->[0] = ""; +$plot->{xlabel} = "Spill Number"; +$plot->{ylabel} = "Recorded Events / Spill (1000)"; +$plot->{sizex} = 630; +$plot->{sizey} = 220; +$plot->{nokey} = 1; +HPlot::PlotInit($plot); +my $str = Hmon::MakeTitle(8,5,"Recorded Events per Spill (1000)",0); + $str .= qq@@; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("EvtsPerSpill",$str); + +my $fqa = QA::OpenQAFile() or die "No connection to QA Logfile"; + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $trbneterr = 0; + my $rh_result = trb_register_read(QA::CTSAddress, 0xa002) or $trbneterr = 1; #sleep 5 and next; + my $stopped = trb_register_read(0x3,0xa0c0) or sleep 5 and next; + $stopped = ($stopped->{3} || 0) & 0x400; + + $lastspill = $outofspill; + $outofspill = ($rh_result->{QA::CTSAddress} || 0) & 0x10; + $spilllength++ ; #if($outofspill); + $rh_result = trb_register_read(0x3000, 0x01) or $trbneterr = 1; #sleep 5 and next; + # 0x3000 => a reliable guy to ask about rates + + if($trbneterr == 0) { + my $res = $rh_result->{0x3000} & 0xffff; + $evtrate = $res >= $lastres ? $res - $lastres : ($res + 2**16) - $lastres; + $events += $evtrate; + + # When end of spill is detected... + my $qastate; + my $qashort; + my $qalong; + + + + if ($outofspill && !$lastspill) { + push(@spills, $events); + shift(@spills) if scalar @spills > 50; + + $spillavglong = 0; + $spillavglong += $_ for @spills; + $spillavglong /= scalar @spills; + + $spillavgshort = 0; + for ( my $i=-1; $i>=-10; $i--) { + $spillavgshort += $spills[$i] || 0; + } + $spillavgshort /= (scalar @spills < 10)?(scalar @spills):10; + + $qashort = QA::SciNotation($events)." (".$spilllength."s)"; + $qastate = QA::GetQAState('above', "$events", @QA::LimitTriggerPerSpill); + $qalong = sprintf("current spill: %s - 10-spill avg. %s - 50-spill avg. %s - Spill length %is", + QA::SciNotation($events), + QA::SciNotation($spillavgshort), + QA::SciNotation($spillavglong), + $spilllength); + QA::WriteQALog($fqa,"trg", "spill", 30, $qastate, "Spill Sum", + $qashort, $qalong); + HPlot::PlotAdd("EvtsPerSpill",$events/1E3); + HPlot::PlotDraw("EvtsPerSpill"); + $events = 0; + $spilllength = 0; + } elsif ($spilllength > 20) { + QA::WriteQALog($fqa, "trg", "spill", 30, QA::NOTE, "Spill Sum", + "No Spills", "No Spills detected at the moment"); + } + + $qashort = sprintf(" %i ", $evtrate); + $qastate = QA::OK; + + ################Remove after comics or adjust! + if (($evtrate <= 200 || $evtrate >= 50000) && $errtime<20){ + $errtime++; + } + elsif ($errtime > 1) { + $errtime--; + } + $qastate = QA::WARN if $errtime > 10; + ##################### + + $qastate = QA::ERROR if $evtrate <= 1 && $stopped == 0; + $qastate = QA::WARN_2 if $stopped; + + $qalong = sprintf("current: %i Events/second", $evtrate); + QA::WriteQALog($fqa, "main", "rate", 5, $qastate, "Current Rate", + $qashort, $qalong); + + $lastres = $res; + sleep(1); + } else { + QA::WriteQALog($fqa, "main", "rate", 30, QA::ERROR, "Current Rate", "N/A", "N/A"); + QA::WriteQALog($fqa,"trg", "spill", 30, QA::ERROR, "Spill Sum","N/A", "N/A"); + $events = 0; + $spilllength = 0; + sleep(10); + } +} diff --git a/hmon/hmon_ssh b/hmon/hmon_ssh new file mode 100755 index 0000000000000000000000000000000000000000..56a097b83091032b0e8ae4d32c70e79509c166a8 GIT binary patch literal 453328 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 z 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%0A^n&$`eb2$^-P8JV|} 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
] : Address of the board (default: 0x0099). + [-v|--verb] : More verbouse. + +EOF +} + +sub convertHistograms + { + foreach my $rh_memaddr (sort keys %$reg_href) { + if (defined $reg_href->{$rh_memaddr}->{'memaddr'}) { + $reg_href->{$rh_memaddr}->{'value'} = 0; + for (my $i=$reg_href->{$rh_memaddr}->{'memaddr'}+1; $i<=( $reg_href->{$rh_memaddr}->{'range'} + + $reg_href->{$rh_memaddr}->{'memaddr'}); $i++) { + #print $i . " " . $histograms[$i] . "\n"; + if (defined $histograms[$i]) { + $reg_href->{$rh_memaddr}->{'value'} += $histograms[$i]; + } + } + #if ($rh_memaddr eq "start_y_total") {print $rh_memaddr . ":" . $reg_href->{$rh_memaddr}->{'value'} . "\n";} + } + } + } + +sub convertNumber { + my $text = $_[0]; + $text =~ s/(^[-+]?\d+?(?=(?>(?:\d{3})+)(?!\d))|\G\d{3}(?=\d))/$1,/g; + return $text; +} + +sub getSumTotal + { + my $sum_total = 0; + foreach my $rh_address (sort keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'total'} && defined $reg_href->{$rh_address}->{'value'}) { + $sum_total += $reg_href->{$rh_address}->{'value'}; + } + } + return $sum_total; + } + +sub getSumTotalStart + { + my $sum_total = 0; + foreach my $rh_address (sort keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'start'} && defined $reg_href->{$rh_address}->{'value'}) { + $sum_total += $reg_href->{$rh_address}->{'value'}; + } + } + return $sum_total; + } + +sub getSumTotalVeto + { + my $sum_total = 0; + foreach my $rh_address (sort keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'veto'} && defined $reg_href->{$rh_address}->{'value'}) { + $sum_total += $reg_href->{$rh_address}->{'value'}; + } + } + return $sum_total; + } diff --git a/hmon/hmon_tail b/hmon/hmon_tail new file mode 100755 index 0000000000000000000000000000000000000000..a561bcd3914febd93d5df8f2a436a32724bda358 GIT binary patch literal 64568 zcmeFad3;nw_BVVxB+#gMqoM{CiP~tQEQu^8LbMw?a2q-jWswma!WLjyO}a^3Y3y#u zowhYP=*;+=an#Wn*Krw#L3BbENWc+Aa6xf2;&v|q*%SgOdB5MPdy@;2-}^kz`##TK zPv_Hpt4^J&I(6#QsZ*z_Zk81WN2R!2iv3AZu2UGx^LhnH{whl4_abV+@|5n1SLvf% ztaJq=4PUQF;Zug}XRB4T{d8M+UGPlBH!np3@>0AaU_URCV8wpg6!OXXIzC=2D4&Br zlTrJrD47Dle5AE_kBH(~A_DevpH=AN-DJ9*kK{4mMl0V&E1&&rwg|JIcKg^iekWM% zn~>r~jBzg?ieLP8Jc-Ls@zOBQ9QjOU_X0Wi1yRYcO&wV&i~PmP3KKkeVy^; zWs83MX*E|FxM1Flp@Ro5nALy5yhY*4{*`${`wtyFpnUOwt3|uhK?re2-!M^-Wb-i- zG1A-#t1%?jbZqn zfiLkd#`ijWd*gc}zS;Ql(*xf^e1rHF;ah<3P57RTFF#}P%@ZL->5JzGe8=EB!Gh)D zc^bagT5&!swkSCW`|!PjKD~x1R;$V-&tO;7k5o zjW0js(*S%gXXJnK^WVwC=_pHelxNEW`-Gnh@ zxp-b`CpeyznL+qoiSH16FTFC-4FY{;A5j zwv&2Sbb?>q34DDg@V|6Y{(YU`FY1K;i#jPs>jb{4lX5QTq+X8oQ}IXZ1i!Kq{7IeA z6YB*3{Z7iC)CvCYJ1PInPT-$+QhrG%_~&$j|JP3NcXmQ&WheNrc2fS`o!}qn1mD*Q z{_~yS16|3)_vFu@PRjXHC-6fk;8f#%Kj5d5pRS$IGq4l*>Q2h}MAko!}4cq~2I3_5QMxa^CC&e;mp`l|28elX9N!1irnK@*e{HELct6 zgC)qRD7L*aK=jK6O6>s&r|rZ~n}t95Bz(^6EJw58HvS$9zxX8lVWRwWrFp%V#VWKP z#An*HISUsrnpPf~UKW}*O@TQ)lh*H0rL=TGxO}cs9x9u;>Fv|X z7EY^}9-0ZFW-pjMGo;KbuMkuzWwWO*Kov?UGKNaamFY7Um!Xc?mGeT%!r2Q+3Lb)_ z`STVmP?nS}o>Mk`;k0>+mZBY@d0@bz=?iD0=IQ0-v%v^a?X+n#L$@!PJqbPgWNv8I;&4b=P(FM1e1QS(m(Eq zWgg%oJJ67$lB`uq=b@F0mC}l`c_Ff^bjj>RRzZThr(kUPT=a!xZ|SVXz;CZ@`m9-2 zf0oW%6k4Fnfap*-W-VSgecmFgk`Cbkiz#B$rcp*Mffb0NLuO4|fbIv+*!IOsXO{_< zP?XSH;RWdG(Co5B(}A=k94hZ96|7)GNVp{ec5qs07@`73R!*Nb9dv=y{1LJdE}N~O zj&e#4I(*v9#Y=84n>S}}NEsarj2JoX>H&iW3~mqSI)X#mp&h_M?Xar{P|;&m*4bYd zM@p&{PJ{K|8NLl?nOy~zoht?FGdtCOcKaEGDIL&MQIpHUf~vuKqpOmRC%^oJdd^*^(oh>)Q$G%Wd}ajWA>-k0q2^|{%mx>i)|pDTO4qEJ4e*Qoba0*__iJ=++KGxIb&Z5A7VYoey~584mhT=_D_}rZqF4= z%yGb3hyBTOz{zX-<8{F8wJ6gx2i%_12rqWPxvsT8lO1sSB zT;hO3klH_$4!CpO9dW?bc5Fqda=>j_W^%Oy?z9Vj=YTuyug4wma~$PAp71Mc)KY;nMyK921UxYI|{?10m^V}A?>-1cQMZJz^9 zf0g}db-?M*YX9sn5kbn1)4$?&z%vDg{7HAfFLA PmpW@Jt8%G6y`%0rxoIISzPV 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 literal 0 HcmV?d00001 diff --git a/hmon/hmon_timeout.pl b/hmon/hmon_timeout.pl new file mode 100755 index 0000000..fc0878d --- /dev/null +++ b/hmon/hmon_timeout.pl @@ -0,0 +1,74 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HADES::TrbNet; + +trb_init_ports() or die trb_strerror(); +Hmon::TraceDBLoad(); + +my $fqa = QA::OpenQAFile(); +my $logcnt = 0; + +while (1) { + my $msg = ""; + my $msg2 = ""; + my $cnt = 0; + my $cnt2 = 0; + my $boardlist1 = ""; + my $boardlist2 = ""; + + my $rh_hubs = trb_register_read(0xfffe, 0x8b) + or sleep 5 and next; + + foreach my $board (sort {$a <=> $b} keys %$rh_hubs) { + if (($rh_hubs->{$board} & 0xffff) != 0x0000) { + $msg .= ", " if $msg ne ""; + $msg .= sprintf("%04x-%04x (",$board,$rh_hubs->{$board} & 0xffff); + foreach my $i (1..8) { + if ($rh_hubs->{$board} & (1<<$i)) { + $msg .= sprintf("0x%04x ",Hmon::TraceDBGet($board,$i)); + $boardlist1 .= sprintf("%04X, ",Hmon::TraceDBGet($board,$i)); + } + } + $msg .= ")"; + $cnt++; + } + if ((($rh_hubs->{$board}>>16) & 0xffff) != 0x0000 && $board > 0x1000 && $board < 0x1200 && $board%16) { + $msg2 .= ", " if $msg2 ne ""; + $msg2 .= sprintf("%04x-%04x (",$board,$rh_hubs->{$board}>>16 & 0xffff); + foreach my $i (1..8) { + if ($rh_hubs->{$board} & (1<<($i+16))) { + $msg2 .= sprintf(" %04x",Hmon::TraceDBGet($board,$i)); + $boardlist2 .= sprintf("%04X, ",Hmon::TraceDBGet($board,$i)); + } + } + $msg2 .= " )"; + $cnt2++; + } + } + + $boardlist1 =~ s/(\w)(\w)/$1 $2 /gi; + $boardlist2 =~ s/(\w)(\w)/$1 $2 /gi; + + + $msg =~ s/\s+\)/\)/; $msg =~ s/\(\s+/\(/; + $msg2 =~ s/\s+\)/\)/; $msg2 =~ s/\(\s+/\(/; + my $status = "on ".($cnt+$cnt2)." boards"; + my $qastate = QA::GetQAState('below', $cnt+$cnt2, @QA::TimeoutLimits); + if($boardlist1 ne "") { + Hmon::Speak($boardlist1,"$cnt Frontend had a timeout: $boardlist1 "); + } + if($boardlist2 ne "" && $boardlist1 eq "" ) { + Hmon::Speak("timeout","$cnt2 Frontend disabled after a timeout: $boardlist2"); + } + + QA::WriteQALog($fqa, "daq", "timeouts", 20, $qastate, "Timeouts", + $status, "Timeouts " . $status ." - Timeouts: $cnt. $msg - Ports off due to earlier timeouts: $cnt2. $msg2"); + system("logger -p local1.info -t DAQ 'Hmon Timeouts found: $msg'") + if $msg ne "" && $logcnt++ < 50; + + sleep 3; +} diff --git a/hmon/hmon_trbtdc.pl b/hmon/hmon_trbtdc.pl new file mode 100755 index 0000000..ece8425 --- /dev/null +++ b/hmon/hmon_trbtdc.pl @@ -0,0 +1,68 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HADES::TrbNet; + +trb_init_ports() or die trb_strerror(); + +my $fqa = QA::OpenQAFile(); +my $logcnt = 0; +my $timecnt = 0; + +while (1) { + my $rpc = trb_register_read(0xffdf,0xa001) or sleep 5 and next; + my $tof = trb_register_read(0xffef,0xa001) or sleep 5 and next; + my $errcnt = 0; + my $errcnt2 = 0; + my $title = "TRB TDC"; + my $longmsg = ""; + my $longmsg2 = ""; + my $msg = ""; + my $qastate = QA::OK; + + + foreach my $b (sort keys %$rpc) { + my $t = ($rpc->{$b} >> 8) & 0xF; + if($t) { + $errcnt++; + $longmsg .= sprintf("%04x, ",$b); + } + $t = ($rpc->{$b} >> 4) & 0xF; + if($t) { + $errcnt2++; + $longmsg2 .= sprintf("%04x, ",$b); + } + } + + foreach my $b (sort keys %$tof) { + my $t = ($tof->{$b} >> 8) & 0xF; + if($t) { + $errcnt++; + $longmsg .= sprintf("%04x, ",$b); + } + } + + my $errors = $errcnt + $errcnt2; + + $longmsg = "none" unless $errcnt; + $longmsg2 = "none " unless $errcnt2; + $longmsg = "TDC out of sync on TRBs: ".$longmsg." - Reference time missing on TRBs: ".$longmsg2; + chop $longmsg;chop $longmsg; + + + $msg = "$errors errors" if $errors; + $qastate = QA::ERROR if $errors; + QA::WriteQALog($fqa, "feeerr", "trb", 10, $qastate, $title, $msg, $longmsg); + + + if ($qastate > 60 && $timecnt++%40==0) { + system("logger -p local1.info -t DAQ 'Hmon TRB TDC $longmsg'"); + } + + + + sleep 3; +} diff --git a/hmon/hmon_trgerr.pl b/hmon/hmon_trgerr.pl new file mode 100755 index 0000000..0b65f39 --- /dev/null +++ b/hmon/hmon_trgerr.pl @@ -0,0 +1,119 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HADES::TrbNet; + +my %laststore2; +my $allboards; +my $fqa = QA::OpenQAFile(); + +trb_init_ports() or die trb_strerror(); + +while (1) { + my $rh_trigErr = trb_register_read(0xffff, 0x06) or sleep 5 and next; + my $rh_trigErr2 = trb_register_read(0xffff, 0x07) or sleep 5 and next; + + my %store; + my %store2; + my $boards = {}; + my $boardstring = ""; + foreach my $board (sort {$a <=> $b} keys %$rh_trigErr) { + my $id = ($board >> 8) & 0xff; + my $id_0 = ($board >> 12) & 0x0f; + my $id_1 = ($board >> 8) & 0x0f; + my $id_2 = ($board >> 4) & 0x0f; + my $id_3 = ($board >> 0) & 0x0f; + my $val = ((($rh_trigErr->{$board} >> 16) & 0xffff) + + ($rh_trigErr->{$board} & 0xffff)); + if ($id_0 == 0x2) { + $store{$id_1}->{$id_2}->{$id_3} += $val; + } + $boards->{$board} = $val; + $allboards->{$board} = $val; + $store2{$id} += $val; + } + + foreach my $board (sort {$a <=> $b} keys %$rh_trigErr2) { + my $id = ($board >> 8) & 0xff; + my $id_0 = ($board >> 12) & 0x0f; + my $id_1 = ($board >> 8) & 0x0f; + my $id_2 = ($board >> 4) & 0x0f; + my $id_3 = ($board >> 0) & 0x0f; + my $val = ((($rh_trigErr2->{$board} >> 16) & 0xffff) + + ($rh_trigErr2->{$board} & 0xffff)); + if ($id_0 == 0x2) { + $store{$id_1}->{$id_2}->{$id_3} += $val; + } +# $boards->{$board} += $val if $val && defined $laststore2{$id}; + $boards->{$board} += $val; + $allboards->{$board} += $val; + $store2{$id} += $val; + } + + #Clean-up by compare to former values + foreach my $b (keys %$boards) { + if(! defined $allboards->{$b} || ($boards->{$b} - $allboards->{$b}) == 0) { + $boards->{$b} = 0; + } + } + + my @str; + my %color; + my %raw; + my $max; + my $min; + + ($min, $max) = Hmon::MakeMinMax3(\%store, 4, 6, 16); + $str[0][4] = Hmon::MakeTitle(9,10,"MDC Trigger Errors "); + for (my $l = 0; $l < 4; $l++) { + $str[1][$l] = ""; + for (my $s = 0; $s < 6;$s++) { + for (my $b = 0; $b < 16; $b++) { + $color{$b} = sprintf("style=\"background:%4s;\"", + Hmon::findcolor($store{$l}->{$s}->{$b}, + $min, $max, 0)); + $raw{$b} = sprintf("%i", $store{$l}->{$s}->{$b}); + } + $str[1][$l] .= Hmon::DrawMDC($l, $s, \%color, \%raw); + } + $str[2][$l] = Hmon::DrawScale($min, $max, 40); + $str[2][$l] .= "\n"; + } + + my $sum = 0; + my $totalsum = 0; + if (%laststore2) { + foreach my $c (keys %store2) { + my $diff = $store2{$c} - ($laststore2{$c} || $store2{$c}); + while ($diff < 0) { + $diff += 2**16; + } + $sum += $diff; + $totalsum += $store2{$c}; + } + foreach my $c (sort keys %$boards) { + $boardstring .= sprintf("0x%04x, ",$c) if ($boards->{$c}); + } + chop $boardstring; chop $boardstring; + my $qastate = QA::GetQAState('below', $sum, @QA::TrgErrLimits); + my $qash = ""; + $qash = sprintf("%u Errors", $sum) if $sum; + my $qalg = sprintf("%u errors in last second - %u errors in total", + $sum, $totalsum); + QA::WriteQALog($fqa, "feeerr", "trgqual", 20, $qastate, + "Trigger", $qash, $qalg." - Boards: ".$boardstring); + } + + Hmon::WriteFile("MDCTriggerError", + $str[0][4]."

".$str[1][0].$str[1][1]."

". + $str[1][2]."

".$str[1][3].$str[2][0]); + + %laststore2 = %store2; + sleep 1; +} + + diff --git a/hmon/hmon_trgsource.pl b/hmon/hmon_trgsource.pl new file mode 100755 index 0000000..5cc8ccc --- /dev/null +++ b/hmon/hmon_trgsource.pl @@ -0,0 +1,264 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HADES::TrbNet; +use HPlot; + +trb_init_ports() or die trb_strerror(); + +my $fqa = QA::OpenQAFile(); +my $logcnt = 0; + +#0 a0c5 gating disable (9 + 8) +#2 a0c7 output enable (2 + 9 + 8) +#4,5,6 a0c9 - a0cb downscaling (2 + 9 + 8, 4bit each) +#30 a0e3 pulser + +#0 temp array for downscaling + +my @names= qw(S1 S2 S3 S4 S5 S6 S2N S3N S2O); +my @lnames= qw(SectorwiseMult1 SectorwiseMult2 SectorwiseMult3 +SectorwiseMult4 SectorwiseMult5 SectorwiseMult6 SectorwiseMult2NoNeighbour +SectorwiseMult3NoNeighbour SectorwiseMult2Opposite); + +my @ptnames= qw(M2 M5 M20 PT4 PT5 FW PT7 PT8); +my @ptlnames= qw(PT1/M2 PT2/M5 PT3/M20 PT4 PT5 PT6/ForwardWall PT7 PT8); + +my $lastlongmsg = ""; +my $spillsum = 0; +my $lastspillsum = 0; +my $outofspill = 0; +my $lastoutofspill = 1; +my $lastaccpt3; +my $pt3sum =0; +my $accpt3sum; +my $totalpt3; +my $totalstart; +my $totalpt3overstart; + +my $plot = (); +$plot->{name} = "StartCountSpills"; +$plot->{file} = "files/StartCountSpills"; +$plot->{entries} = 40; +$plot->{type} = HPlot::TYPE_HISTORY; +$plot->{output} = HPlot::OUT_PNG; +$plot->{titles}->[0] = ""; +$plot->{xlabel} = "Spill Number"; +$plot->{ylabel} = "Start Counts / Mcnt"; +$plot->{sizex} = 630; +$plot->{sizey} = 220; +$plot->{nokey} = 1; +HPlot::PlotInit($plot); +my $str = Hmon::MakeTitle(8,5,"Start Counts per Spill (millions)",0); + $str .= qq@@; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("StartCountSpill",$str); + + + +my $plot2 = (); +$plot2->{name} = "Pt3AcceptRatio"; +$plot2->{file} = "files/Pt3AcceptRatio"; +$plot2->{entries} = 40; +$plot2->{type} = HPlot::TYPE_HISTORY; +$plot2->{output} = HPlot::OUT_PNG; +$plot2->{titles}->[0] = ""; +$plot2->{xlabel} = "Spill Number"; +$plot2->{ylabel} = "accepted PT3 Ratio"; +$plot2->{sizex} = 630; +$plot2->{sizey} = 220; +$plot2->{nokey} = 1; +HPlot::PlotInit($plot2); + $str = Hmon::MakeTitle(8,5,"PT3 accepted over total PT3 per spill (%)",0); + $str .= qq@@; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("Pt3AcceptRatio",$str); + + +while (1) { + my $qastate = QA::OK; + my $rg = {}; + my $rh = trb_register_read_mem(0x3,0xa0c5, 0, 31) or sleep 5 and next; + my $rStat = trb_register_read_mem(0x3,0xa000, 0, 0x66) or sleep 5 and next; + my $stopped = trb_register_read(0x3,0xa0c0) or sleep 5 and next; + my $polarity = trb_register_read_mem(0x3,0xa002,0,2) or sleep 5 and next; + + $lastoutofspill = $outofspill; + $outofspill = ($rStat->{0x3}->[2] || 0) & 0x10; + + $rh->{3}->[0] <<= 2; #shift to align with outputs + $rh->{3}->[30] = 200000000/($rh->{3}->[30] || 1) if $rh->{3}->[30]; + +#Decode downscaling + for (my $i = 0; $i<8; $i++) { + $rg->{0}->[$i] = 2**((($rh->{3}->[4]||0) >> $i*4) & 0xF); + $rg->{0}->[$i+8] = 2**((($rh->{3}->[5]||0) >> $i*4) & 0xF); + $rg->{0}->[$i+16] = 2**((($rh->{3}->[6]||0) >> $i*4) & 0xF); + } + +#Pulser? + my $longmsg = "Active Trigger sources: "; + my $msg = ""; + my $accmsg = ""; + my $acclmsg = ""; + my $trgprov = 0; + my $trgacc = 0; + + if($rh->{3}->[30]) { + $qastate = QA::NOTE; + $msg .= sprintf("%sHz ",QA::SciNotation($rh->{3}->[30])); + $longmsg .= sprintf("Pulser %sHz - ",QA::SciNotation($rh->{3}->[30])); + } + +#scan multiplicity outputs + for(my $i=0;$i<9;$i++) { + if($rh->{3}->[2] & (1<<($i+2))) { + if($rg->{0}->[$i+2] != 1) { + $msg .= sprintf("%s/%i ",$names[$i],$rg->{0}->[$i+2] || 1); + $longmsg .= sprintf("%s (%s) / dsc %i - ",$names[$i],$lnames[$i],$rg->{0}->[$i+2] || 1); + } + else { + $msg .= sprintf("%s ",$names[$i]); + $longmsg .= sprintf("%s (%s) - ",$names[$i],$lnames[$i]); + } + $trgprov += $rStat->{3}->[$i+0+0x52]; + $trgacc += $rStat->{3}->[$i+2+19+0x2c]; + $acclmsg .= sprintf("%s %i/%i %.1f%% - ", + $lnames[$i], + $rStat->{3}->[$i+2+19+0x2c], + $rStat->{3}->[$i+0+0x52], + $rStat->{3}->[$i+2+19+0x2c]/($rStat->{3}->[$i+0+0x52]||1)*100); + } + } + +#scan PT outputs + for(my $i=0;$i<8;$i++) { + if($rh->{3}->[2] & (1<<($i+11))) { + if($rg->{0}->[$i+11] != 1) { + $msg .= sprintf("%s/%i%s ",$ptnames[$i],$rg->{0}->[$i+11] || 1,($rh->{3}->[0] & (1<<($i+11))?'':'C')); + $longmsg .= sprintf("%s / dsc %i %s - ",$ptlnames[$i],$rg->{0}->[$i+11] || 1,($rh->{3}->[0] & (1<<($i+11))?'':'with coincidence')); + } + else { + $msg .= sprintf("%s%s ",$ptnames[$i],($rh->{3}->[0] & (1<<($i+11))?'':'C')); + $longmsg .= sprintf("%s%s - ",$ptlnames[$i],($rh->{3}->[0] & (1<<($i+11))?'':'with coincidence')); + } + $trgprov += $rStat->{3}->[$i+9+0x52]; + $trgacc += $rStat->{3}->[$i+11+19+0x2c]; + $acclmsg .= sprintf("%s %i / %i %.1f%% - ", + $ptlnames[$i], + $rStat->{3}->[$i+11+19+0x2c], + $rStat->{3}->[$i+9+0x52], + $rStat->{3}->[$i+11+19+0x2c]/($rStat->{3}->[$i+9+0x52]||1)*100); + } + } + chop $longmsg foreach (0..2); + chop $msg; + chop $acclmsg foreach (0..2); + +my $longmsgcheck = $longmsg; + +#Input polarity wrong? + if($QA::TrgCheckPolarity && (($polarity->{3}->[1] & 0x7fffffff) || $polarity->{3}->[0] & 0x1e0)) { + $qastate = QA::WARN; + $longmsg .= " - Signal polarity wrong on inputs "; + foreach my $i(0..30) { + if($polarity->{3}->[1] & (1<<$i)) { + $longmsg .= "Start ".($i+1) if $i<8; + $longmsg .= "Veto ".($i-7) if $i<16 && $i>=8; + $longmsg .= "TOF ".($i-15) if $i<22 && $i>=16; + $longmsg .= "RPC ".($i-21) if $i<28 && $i>=22; + $longmsg .= "PT ".($i-27) if $i<32 && $i>=28; + $longmsg .= ", "; + } + } + foreach my $i(5..8) { + if($polarity->{3}->[0] & (1<<$i)) { + $longmsg .= "PT ".$i; + $longmsg .= ", "; + } + } + chop $longmsg foreach(0..1); + } + +#Trigger stopped by register? + if($stopped->{3} & 0x400) { + $msg = "Stopped"; + $qastate = QA::WARN_2; + $longmsg = "TriggerStat have been stopped - ". $longmsg; + } + + + if($outofspill && !$lastoutofspill ) { + $lastaccpt3 = $pt3sum / ($accpt3sum||1)*100; + HPlot::PlotAdd("Pt3AcceptRatio",$lastaccpt3); + HPlot::PlotDraw("Pt3AcceptRatio"); + $pt3sum = 0; + $accpt3sum = 0; + } + else { + $pt3sum += $rStat->{3}->[0x4c] || 0; + $accpt3sum += $rStat->{3}->[0x39] || 0; #was 0x5D + } + $accmsg = sprintf("%i%% / %i%%", $rStat->{3}->[0x4c]/($rStat->{3}->[0x39]||1)*100, $lastaccpt3 || 0); + my $qastateacc = QA::OK; + + QA::WriteQALog($fqa, "trg", "source", 10, $qastate, "Trigger Source", $msg, $longmsg); + QA::WriteQALog($fqa, "trg", "accepted", 10, $qastateacc, "Accept. PT3", $accmsg, $acclmsg); + + my $qastatept = QA::OK; + my $ptoverStattart = $rStat->{3}->[0x26]/($rStat->{3}->[0x2c] || 1)*100; + if ($ptoverStattart > 100) {$ptoverStattart = 100;} +###################################### +## QA check for PT3/Start rate + if ($ptoverStattart > 100 || $ptoverStattart < 0) { + $qastatept = QA::WARN; + } +###################################### + my $ptmsg = ""; + $ptmsg = sprintf("%s/s / %1.2f%%",QA::SciNotation($rStat->{3}->[0x26]),$ptoverStattart) if $ptoverStattart<=10; + $ptmsg = sprintf("%i/s / %1.1f%%",$rStat->{3}->[0x26],$ptoverStattart) if $ptoverStattart> 10; + my $ptlongmsg = sprintf("PT3 counts per second: %i - PT3 / Start: %1.2f%%", $rStat->{3}->[0x26], $ptoverStattart); + QA::WriteQALog($fqa, "trg", "ptrate", 10, $qastatept, "PT3 / Start", $ptmsg, $ptlongmsg); + + + my $startsum = 0; + my $qastatstart = QA::OK; + my $startmsg = ""; + my $startlongmsg = ""; + + foreach my $i (0..7) { + $startsum += $rStat->{3}->[$i+0x8] ; + } + $spillsum += $startsum; +###################################### +## QA check for spill sum on Start + if ($lastspillsum < 0 || $lastspillsum > 50000000) { + $qastatstart = QA::WARN; + } +###################################### + if($outofspill && !$lastoutofspill ) { + $lastspillsum = $spillsum; + HPlot::PlotAdd("StartCountSpills",$spillsum/1E6); + HPlot::PlotDraw("StartCountSpills"); + $spillsum = 0; + } + $startmsg = sprintf("%s / %s",QA::SciNotation($startsum),QA::SciNotation($lastspillsum)); + $startlongmsg = sprintf("Start counts per second %s/s - Start counts per spill %s",QA::SciNotation($startsum),QA::SciNotation($lastspillsum)); + QA::WriteQALog($fqa, "trg", "start", 10, $qastatstart, "Start Count", $startmsg, $startlongmsg); + + + + + if ($lastlongmsg ne $longmsgcheck && $longmsg ne "") { + system("logger -p local1.info -t DAQ 'Hmon $longmsg'"); + } + + + $lastlongmsg = $longmsgcheck; + + + sleep 1; +} diff --git a/hmon/hmon_vetohist.pl b/hmon/hmon_vetohist.pl new file mode 100755 index 0000000..d034c31 --- /dev/null +++ b/hmon/hmon_vetohist.pl @@ -0,0 +1,45 @@ +#!/usr/bin/perl -w + +use Hmon; +use QA; +use HADES::TrbNet; + +trb_init_ports() or die("could not connect to trbnetd"); + + +my $str; + +my $plots = fork(); + + +if($plots) { + while(1) { + $str = Hmon::MakeTitle(10,11,"Veto Histogram",0); + my $binning = trb_register_read(3,0xa0c8) or sleep 5 and next; + my $offset = trb_register_read(3,0xa0c6) or sleep 5 and next; + $binning = QA::SciNotation($binning->{3}*100E-9); + $offset = QA::SciNotation($offset->{3}*100E-9); + + + $str .= qq@Offset: @.$offset.qq@s - Binning: @.$binning.qq@s@; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("Vetohist",$str); + sleep(5); + } + } + +else { + qx(./hmon_hadplot.sh -d 3000 \\ + -a 0x0003 -r 50216 -m 500 -p 0 -w 32 -t "1" \\ + -a 0x0003 -r 50716 -m 500 -p 0 -w 32 -t "2" \\ + -a 0x0003 -r 51216 -m 500 -p 0 -w 32 -t "3" \\ + -a 0x0003 -r 51716 -m 500 -p 0 -w 32 -t "4" \\ + -a 0x0003 -r 52216 -m 500 -p 0 -w 32 -t "5" \\ + -a 0x0003 -r 52716 -m 500 -p 0 -w 32 -t "6" \\ + -a 0x0003 -r 53216 -m 500 -p 0 -w 32 -t "7" \\ + -a 0x0003 -r 53716 -m 500 -p 0 -w 32 -t "8" \\ + -output "PNG.files/vetohist.760.490" -curvestyle steps -key genreg 2>/dev/null & + + ); + } + diff --git a/hmon/hplottest.pl b/hmon/hplottest.pl new file mode 100755 index 0000000..ca9bd85 --- /dev/null +++ b/hmon/hplottest.pl @@ -0,0 +1,29 @@ +#!/usr/bin/perl -w +use warnings; +use strict; +use Data::Dumper; +use Hmon; +use QA; +use HPlot; + + +my $plot = (); +$plot->{name} = "Testplot"; +$plot->{file} = "Testplot"; +$plot->{entries} = 50; +$plot->{type} = HPlot::TYPE_HISTORY; +$plot->{output} = HPlot::OUT_PNG; +$plot->{titles}->[0] = "Curve 1"; + + +HPlot::PlotInit($plot); +HPlot::PlotAdd("Testplot",50); +HPlot::PlotAdd("Testplot",30); +HPlot::PlotAdd("Testplot",40); +HPlot::PlotAdd("Testplot",20); +HPlot::PlotAdd("Testplot",45); + +HPlot::PlotDraw("Testplot"); +sleep 1; +HPlot::PlotDraw("Testplot"); +# print Dumper $HPlot::p; \ No newline at end of file diff --git a/hmon/icingadaemon.pl b/hmon/icingadaemon.pl new file mode 100755 index 0000000..551b4f2 --- /dev/null +++ b/hmon/icingadaemon.pl @@ -0,0 +1,61 @@ +#!/usr/bin/perl -w + +use strict; +use warnings; +use IO::Socket::INET; + + +my ($socket,$client_socket); +my ($peeraddress,$peerport); + +$socket = new IO::Socket::INET ( + #LocalHost => '127.0.0.1', + LocalPort => '12345', + Proto => 'tcp', + Listen => 5, + Reuse => 1 + ) or die "ERROR in Socket Creation $!\n"; + +my $date = localtime; +print "SERVER started at $ date and is waiting for client\n"; + +while(1) +{ + + while ($client_socket = $socket->accept()) { + + my $pid = fork(); + if ($pid == 0) { + # Child process + + + $peeraddress = $client_socket->peerhost(); + $peerport = $client_socket->peerport(); + $date = localtime; + + print "Accepted New Client Connection From : $peeraddress, $peerport, child created at $date\n"; + + + while (<$client_socket>) { + if ($_ gt "secreticinga") { + + my $command = "/bin/ls -rtl --time-style=+\'\%c \' /var/lib/icinga/status.dat"; + #print $command . "\n"; + my $result = qx($command); + + if (defined $result) { + print $client_socket $result; + } else { + print $client_socket "\n"; + } + } else { + print "got nonsense: $_ \n"; + } + } + $date = localtime; + print "End of child at $date\n"; + } #end if ($pid == 0) + } +} + +$socket->close(); diff --git a/hmon/icingadaemon.sh b/hmon/icingadaemon.sh new file mode 100755 index 0000000..5671bc4 --- /dev/null +++ b/hmon/icingadaemon.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +while true; do /home/hadaq/trbsoft/daq/tools/hmon/icingadaemon.pl; sleep 10; done diff --git a/hmon/index.cgi b/hmon/index.cgi new file mode 100755 index 0000000..ec6c16f --- /dev/null +++ b/hmon/index.cgi @@ -0,0 +1,129 @@ +#!/usr/bin/perl -w +use CGI::Carp qw(fatalsToBrowser); + + +print "Content-type: text/html\r\n\r\n"; + + +print qq$ + + +Monitoring Main Control Interface + + + + + +

+

HADES DAQ Monitoring

+
+
+ + + +
+ + + + + + + + + + + + + + + + + +$; + + +print "

All available options

    \n"; +my @o = qx(ls -1 files/*.htt); +foreach my $a (@o) { + if ($a =~ m%files/(\w+).htt%) { + print "
  • $1
  • \n"; + } + } +print "

\n"; + + +print qq$ +

Help

+To select the information you want to have, specify any number of the options listed below, separated with '-' after the \"monitor.cgi?\".

+

  • The first option for monitor.cgi may be a number specifying the update rate in seconds.
  • +
  • The first or second option may be \"window\" to open the information in a pop-up with no toolbars and proper sizes. Note that only the first information box is used to determine the size - i.e. if there are two boxes to be shown, you have to resize the window by hand. One remark: to work properly, you have to set all dom.disable_window_open* options in about:config to false.
  • +
  • Everything is tested in the latest version (5 and above, not 2 or 3!) of the Firefox browser - there will be no support for any other kind of html-viewer.
  • +
+
Hints
+
  • Window background will turn red if no update is possible.
  • +
  • If you see a message "Server Error", press F5.
  • +
  • If you want to stop updating, press Esc.
  • +
  • To restart updating, press F5.
  • +
  • Zoom in and out with Ctrl++ and Ctrl+-, normal zoom with Ctrl+0.
  • +
+ +
Examples
+ + + + +$; diff --git a/hmon/indexstyles.css b/hmon/indexstyles.css new file mode 100644 index 0000000..32e5f02 --- /dev/null +++ b/hmon/indexstyles.css @@ -0,0 +1,178 @@ + + +body.index { + overflow:auto; + font-size:13px; + font-family:sans-serif; + background: right bottom url('background.png') no-repeat fixed #def; + line-height:150%; + + } + +body.index h1 { + color:white; + font-size:25px; + background:#346; + margin:-8px; + width:470px; + box-shadow:0px 0px 4px 4px #346;/*, inset 3px 3px 3px 3px #eee, inset -3px -3px 3px 3px #eee;*/ + padding:20px 10px 15px 10px; + } + +body.index h2 { + color:white; + font-size:20px; + background:#346; + margin:8px -8px 10px -8px; + padding:0 10px 10px 10px; + box-shadow:0px 0px 4px 4px #346;/*, inset 3px 3px 3px 3px #eee, inset -3px -3px 3px 3px #eee;*/ + width:470px; + +} + +body.index h3 { + font-weight:bold; + font-size:18px; + display:block; + margin:30px 0 20px 0; + } + +body.index h4 { + clear:both; + font-weight:bold; + font-size:16px; + margin:30px 0 20px 0; + } + + + +body.index div h4 { +/* text-align:center; */ + clear:both; + font-weight:bold; + font-size:15px; + margin:0px 0 0 0; + } + +body.index div ul{ + margin:0 20px 0 20px; + width:300px; + margin-bottom:0px; + padding-left:13px; + } + +body.index ul{ + margin:0 20px 0 20px; + margin-bottom:0px; + padding-left:13px; + } + + +body.index li { + list-style-type: square; + } + + +body>div, .logos { + float:left; + margin: 0px 8px 12px 8px; + padding: 0 0 0 0 ; + + text-align:center; + box-shadow:0px 0px 4px 4px #eef8ff;/*, inset 3px 3px 3px 3px #eee, inset -3px -3px 3px 3px #eee;*/ + border-radius: 5px 5px 5px 5px; + background:#eef8ff; + overflow-y:auto; +} + +div.linkbox { + text-align:left; + width:350px; + margin:10px; + } + +div.linkbox h4{ + text-align:left; +} + +div.linkbox li { + list-style: none; +} + +li a{ + text-decoration: none; + color:#346; + font-weight:bold; +} + +li a:hover{ + text-decoration: none; + color:#fa0; + font-weight:bold; +} + + +ul.optionlist li { + width:300px; + float:left; + list-style:none; + } + + + +div.button { + position:absolute; + background:#def; + box-shadow:0px 0px 4px 4px #def;/*, inset 3px 3px 3px 3px #eee, inset -3px -3px 3px 3px #eee;*/ + top:0px; + height:16px; + cursor:pointer; + font-size:12px; + border-width:0 1px 1px 1px; + border-radius:0 0 0 5px; + color:black; +} + +div#status { +/* float:right; */ + margin:-20px 15px 10px 15px; + padding:10px; + width:600px; + box-shadow:0px 0px 4px 4px #346; + font-family: monospace; + color:white; + background:#346; + border-radius:0 0 5px 5px; +} + +#status table { + vertical-align:top; + text-align:left; + width:550px; +} + +#status td, #status th { + vertical-align:top; +} + +#info { + text-align:left; + float:left; + margin:0; + width:480px; + background:transparent; +} + +dt { + font-weight:bold; +} + + + +.bgn {background:#0d0;color:#000;} +.bye {background:#ff2;color:#000;} +.bor {background:#fa0;color:#000;} +.brd, .brdb {background:#f00;} +.bgr {background:#000;color:#aaa !important;color:#fff;} +.bwh {background:#eee;color:#000;} +.bmg {background:#f0a ;color:#000;} \ No newline at end of file diff --git a/hmon/mdc.png b/hmon/mdc.png new file mode 100644 index 0000000000000000000000000000000000000000..fefb00c466f3aec4e6534abbd6101b8b63c03e9b GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^azHH32qYMtoj(NvX{M4OzhDMN#wmZ-0ePGS9+AZi z40_5S%viD1z6>asmB-?c*ezy+LUItHBKbLh*2~7Z#OGj-0 literal 0 HcmV?d00001 diff --git a/hmon/monitor.cgi b/hmon/monitor.cgi new file mode 100755 index 0000000..296fbb9 --- /dev/null +++ b/hmon/monitor.cgi @@ -0,0 +1,170 @@ +#!/usr/bin/perl -w +use strict; +use warnings; +use CGI::Carp qw(fatalsToBrowser); +print "Content-type: text/html\r\n\r\n"; + +my $out; + +my $delay = 10; +my @args = split('-',$ENV{'QUERY_STRING'}); + + if ($args[0] =~ m/^(\d+\.?\d?)$/) { + $delay = $1; + } + + if( $ENV{'QUERY_STRING'} =~ m/window-/ ) { + my $newurl = "monitor.cgi?"; + $newurl .= $ENV{'QUERY_STRING'}; + $newurl =~ s/window-//; + $newurl =~ /(-|^|\?)(\w+)$/; + open(my $MYF,"; + close($MYF); + $str =~ /width(\d+)\sheight(\d+)/; + my $width = 80*$1-8; + my $height = 50*$2-8; + $out = qq$ + + +Hmon + + + + + +#; + + } else { + + $out = qq$ + + + + + +Hmon $.$ENV{'QUERY_STRING'}.qq$ + + +
 close 
+
stop
+
 bigger 
+ +
+$; + + + +$out .= qq$$; + } +$out .= qq$ + + +$; + +print $out; + diff --git a/hmon/monitor2.cgi b/hmon/monitor2.cgi new file mode 100755 index 0000000..9d2fdaf --- /dev/null +++ b/hmon/monitor2.cgi @@ -0,0 +1,166 @@ +#!/usr/bin/perl -w +use strict; +use warnings; + +print "Content-type: text/html\r\n\r\n"; + +my @o; +my $out; + +sub addfile { + my ($file,$strip) = @_; + my $MYF; + $strip = 0 unless defined $strip; + my $str = ""; + open ($MYF, "<$file") or return $str; + while (<$MYF>){ + if ($_ =~ m%ADDFILE\s([/\w]*).svg%) { + $str .= addfile("$1.svg",1); + } + else { + $_ =~ s/\t*/ /; + if($_ =~ m/^$/) {next;} + if($strip) { + $_ =~ s/; + close($MYF); + $str =~ /width(\d+)\sheight(\d+)/; + my $width = 80*$1-8; + my $height = 50*$2-8; + $out = qq$ + + +Hmon + + + + + +Opening Window.$; + + } else { + + $out = qq$ + + + + + +Hmon $.$ENV{'QUERY_STRING'}.qq$ + + +
 close 
+
 stop 
+
+$; + + + +$out .= qq$$; + } +$out .= qq$ + + +$; + +print $out; + diff --git a/hmon/monitorold.cgi b/hmon/monitorold.cgi new file mode 100755 index 0000000..167a94e --- /dev/null +++ b/hmon/monitorold.cgi @@ -0,0 +1,131 @@ +#!/usr/bin/perl -w +use strict; +use warnings; + +print "Content-type: text/html\r\n\r\n"; + +my @o; +my $out; + +sub addfile { + my ($file,$strip) = @_; + my $MYF; + $strip = 0 unless defined $strip; + my $str = ""; + open ($MYF, "<$file") or return $str; + while (<$MYF>){ + if ($_ =~ m%ADDFILE\s([/\w]*).svg%) { + $str .= addfile("$1.svg",1); + } + else { + $_ =~ s/\t*/ /; + if($_ =~ m/^$/) {next;} + if($strip) { + $_ =~ s/; + close($MYF); + $str =~ /width(\d+)\sheight(\d+)/; + my $width = 80*$1-8; + my $height = 50*$2-8; + $out = qq$ + + +Hmon + + + + + +Opening Window.$; + + } else { + + $out = qq$ + + + + + +Hmon $.$ENV{'QUERY_STRING'}.qq$ + + +
 close 
+
 stop 
+
+$; + + $out .= addfile("files/note.htt"); + foreach my $arg (@args) { + if ($arg =~ m/(\w+)/) { + $out .= addfile("files/$1.htt"); + } + } + + $out .= qq$
+\n"; + } +$out .= qq$ + + +$; + +print $out; + diff --git a/hmon/permanent/HPlot.pm b/hmon/permanent/HPlot.pm new file mode 120000 index 0000000..29834ae --- /dev/null +++ b/hmon/permanent/HPlot.pm @@ -0,0 +1 @@ +../HPlot.pm \ No newline at end of file diff --git a/hmon/permanent/Hmon.pm b/hmon/permanent/Hmon.pm new file mode 120000 index 0000000..231efd1 --- /dev/null +++ b/hmon/permanent/Hmon.pm @@ -0,0 +1 @@ +../Hmon.pm \ No newline at end of file diff --git a/hmon/permanent/Perl2Epics.pm b/hmon/permanent/Perl2Epics.pm new file mode 120000 index 0000000..8ef3298 --- /dev/null +++ b/hmon/permanent/Perl2Epics.pm @@ -0,0 +1 @@ +../Perl2Epics.pm \ No newline at end of file diff --git a/hmon/permanent/QA.pm b/hmon/permanent/QA.pm new file mode 120000 index 0000000..03c2367 --- /dev/null +++ b/hmon/permanent/QA.pm @@ -0,0 +1 @@ +../QA.pm \ No newline at end of file diff --git a/hmon/permanent/hmon_archiver.pl b/hmon/permanent/hmon_archiver.pl new file mode 100644 index 0000000..8bbbc51 --- /dev/null +++ b/hmon/permanent/hmon_archiver.pl @@ -0,0 +1,93 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use POSIX qw(strftime); +use Data::Dumper; + +my $header = qq@ + + + + + + + + + + +
 close 
+
stop
+
 bigger 
+ +
+@; + + +my $footer = "
"; + +while(1) { + my $time = strftime("%Y%m%d%H%M",localtime()); +# my $time = "201204111356"; + + system("mkdir /home/hadaq/trbsoft/daq/tools/hmon/archive/$time"); + system("cp /home/hadaq/trbsoft/daq/tools/hmon/files/*.htt /home/hadaq/trbsoft/daq/tools/hmon/files/*.png /home/hadaq/trbsoft/daq/tools/hmon/archive/$time"); + system("mkdir /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/files"); + system("mv /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/*.png /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/files/"); + + my @files = qx(ls /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/*.htt); + foreach my $f (@files) { + my @n = split('/',$f); + my $newf = $n[-1]; + chop $n[-1]; + chop $newf;chop $newf; + $newf .='m'; +# print $newf."\n"; + my $fh; + open($fh,'>',"/home/hadaq/trbsoft/daq/tools/hmon/archive/$time/$newf"); + print $fh $header; + my @g = qx(cat /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/$n[-1]); + foreach my $h (@g) { + if($h =~ m!^(.*)\%ADDPNG\s+(.+)\%(.*)$!) { + print $fh $1.$2.$3; + } + else { + print $fh $h; + } + } + + + + print $fh $footer; + close($fh); + + } + system("mv /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/*.htt /home/hadaq/trbsoft/daq/tools/hmon/archive/$time/files/"); + + sleep(590); + } + \ No newline at end of file diff --git a/hmon/permanent/hmon_archiveveto.pl b/hmon/permanent/hmon_archiveveto.pl new file mode 100644 index 0000000..af07bfd --- /dev/null +++ b/hmon/permanent/hmon_archiveveto.pl @@ -0,0 +1,17 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use POSIX qw(strftime); +use Data::Dumper; + + +while(1) { + my $time = strftime("%Y%m%d%H%M%S",localtime()); +# my $time = "201204111356"; + + system("cp /home/hadaq/trbsoft/daq/tools/hmon/files/vetohist.png /home/hadaq/trbsoft/daq/tools/hmon/archive/veto_$time.png"); + + sleep(30); + } + \ No newline at end of file diff --git a/hmon/permanent/hmon_cpu.pl b/hmon/permanent/hmon_cpu.pl new file mode 100755 index 0000000..919e6d9 --- /dev/null +++ b/hmon/permanent/hmon_cpu.pl @@ -0,0 +1,114 @@ +#!/usr/bin/perl + +use warnings; +use strict; + +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Clone qw(clone); +use Hmon; +use QA; + +my $store = {}; +my $laststore = {}; +my $values = {}; +my $color = {}; +my $str; +my ($sys,$io,$irq,$busy); + + + +my $fqa = QA::OpenQAFile(); + +# user: normal processes executing in user mode +# nice: niced processes executing in user mode +# system: processes executing in kernel mode +# idle: twiddling thumbs +# iowait: waiting for I/O to complete +# irq: servicing interrupts +# softirq: servicing softirqs + +my @srv = qw(lxhadeb01 lxhadeb02 lxhadeb03 lxhadeb04 lxhadeb05 lxhadeb06 lxhadesdaq hadesdaq01 hadesdaq02 hades30 hades31 hades33); + + +my $template .= "\n\n
"; +for(my $d=1;$d<=16;$d++) { + $template .= "$d"; + } + +while(1) { + $laststore = clone($store); + $store = {}; + for(my $n=0;$n< scalar @srv;$n++) { + my @out = Hmon::qxtimeout("ssh $srv[$n] \"cat /proc/stat \" 7) { + $store->{$n}->{$1}->{"user"} = $s[1]; + $store->{$n}->{$1}->{"nice"} = $s[2]; + $store->{$n}->{$1}->{"sys"} = $s[3]; + $store->{$n}->{$1}->{"idle"} = $s[4]; + $store->{$n}->{$1}->{"io"} = $s[5]; + $store->{$n}->{$1}->{"irq"} = $s[6]; + $store->{$n}->{$1}->{"sirq"} = $s[7]; + $store->{$n}->{$1}->{"tot"} = $s[1]+$s[2]+$s[3]+$s[4]+$s[5]+$s[6]+$s[7]; + } + } + } + } + + my $max = 0; + my $maxstr = ""; + my $busystr = ""; + if (defined $laststore->{0}->{0}->{'idle'}) { + $str = Hmon::MakeTitle(7,7,"Server CPU Usage"); + $str .= $template; + for(my $s = 0; $s < scalar @srv; $s++) { + $str .= "\n
$srv[$s]"; + for(my $c = 0; $c < 32; $c++) { + if (defined $laststore->{$s}->{$c}->{'idle'} && defined $store->{$s}->{$c}->{'idle'}) { + my $this = $store->{$s}->{$c}; + my $last = $laststore->{$s}->{$c}; + if ($this->{'tot'} != $last->{'tot'}) { + $busy = 100-100*($this->{'idle'}-$last->{'idle'})/($this->{'tot'}-$last->{'tot'}); + $sys = 100*($this->{'sys'}-$last->{'sys'})/($this->{'tot'}-$last->{'tot'}); + $io = 100*($this->{'io'}-$last->{'io'})/($this->{'tot'}-$last->{'tot'}); + $irq = 100*($this->{'irq'}-$last->{'irq'}+$this->{'sirq'}-$last->{'sirq'})/($this->{'tot'}-$last->{'tot'}); + } + else { + $busy = 0; + } + $str .= "%2i",Hmon::findcolor($busy||.001,0,100,0),$busy); + if($s>0 && $s<5 && $max < $busy && $c>=2 && $c<=11) { + $max = $busy; + $maxstr = sprintf("%d%%",$max); + $busystr = sprintf("Max. Load: %.1f%% on %s CPU %d (sys %.1f, wait %.1f, irq %.1f)",$max,$srv[$s],$c,$sys,$io,$irq); + } + + if($c%16==15 && defined $store->{$s}->{$c+1}->{'idle'}) { + $str .= "
"; + } + } + else { + #$str .= ""; + next; + } + } + } + $str .= "
\n"; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("EBCPU",$str); + my $qastate = QA::GetQAState('below',$max,@QA::CPULimits); + QA::WriteQALog($fqa,"server","cpu",40,$qastate,"Max. CPU",$maxstr,$busystr); + sleep 10; + } + else { + sleep 1; + } + + } \ No newline at end of file diff --git a/hmon/permanent/hmon_eb_run.pl b/hmon/permanent/hmon_eb_run.pl new file mode 100755 index 0000000..5c55c42 --- /dev/null +++ b/hmon/permanent/hmon_eb_run.pl @@ -0,0 +1,238 @@ +#!/usr/bin/perl -w +use strict; +use warnings; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; +use Perl2Epics; +use HADES::TrbNet; + +my $store = {}; +my @time; +my @state; +my @rate; +my @disc; +my $mismatchfound_sa = -10; +my $mismatchfound_sr = -10; +my $events = 0; +my @evtrates = (0,0,0); +my @ebrates = (); +my ($oldsumtype1,$oldsumtype9,$oldsumtypeE) = (0,0,0); +my ($cnterrtype9,$cnterrtypeE) = (50,50); +my $lasttotalbytes = 21; + +sub cntbits32 { + return (unpack('%32b*', pack('i',$_[0]))); + } + +my $connect_status = &trb_init_ports(); +if(!$connect_status) { + die("could not connect to trbnetd"); +} + +my $fqa = QA::OpenQAFile(); + +for(my $i = 0; $i<=15; $i++) { + my $s = sprintf("HAD:eb%02i",$i+1); + Perl2Epics::Connect("ebstat$i",$s.":status"); + Perl2Epics::Connect("ebrate$i",$s.":evtCRate"); + Perl2Epics::Connect("ebdisc$i",$s.":evtDRate"); + Perl2Epics::Connect("ebbyte$i",$s.":byteWRate"); + Perl2Epics::Connect("eb$i"."type1", $s.":trigtype:1"); + Perl2Epics::Connect("eb$i"."type9", $s.":trigtype:9"); + Perl2Epics::Connect("eb$i"."typeE", $s.":trigtype:E"); + } +Perl2Epics::Connect("totalEvts","HAD:eb:totalEvtsComp"); +Perl2Epics::Connect("prefix","HAD:eb01:prefix",'DBR_TIME_STRING'); + +my $spilllength = 0; + +while(1) { + my $totalrate = 0; + my $totalbytes = 0; + my $totaldiscarded = 0; + my $ioc = 0; + my $actmask = 0; + my $recvmask = 0; + my $qastate = QA::OK; + my $qamsg = ""; + my $evtrate = 0; + my $qastatedisc = QA::OK; + my $qamsgdisc = ""; + my $evtavgspill, my $evtavg3; + my $byteavg3, my $byteavgspill; + my $ebavgrate = 0; + my $trbneterr = 0; + my $sumtype1 = 0; + my $sumtype9 = 0; + my $sumtypeE = 0; + my ($ratetype1,$ratetype9,$ratetypeE) = (0,0,0); + + # 0x03 => CTS + my $rh_result = trb_register_read(QA::CTSAddress, 0xa0f0) or $trbneterr = 1; # or sleep 5 and next; + my $sentmask = ($rh_result->{QA::CTSAddress} || 0) & 0xFFFF; + + + # 0x3000 => ?? + $rh_result = trb_register_read(0x3000, 0x1) or $trbneterr = 1; + my $res = ($rh_result->{0x3000} || 0) & 0xFFFF; + + $evtrate = $res - ($events || $res); + $evtrate += 2**16 if $evtrate < 0; + $events = $res; + pop(@evtrates) if scalar @evtrates >= $QA::AcceleratorCycle * 2; + unshift(@evtrates,$evtrate); + $evtavg3 = $evtrates[0] + $evtrates[1] + $evtrates[2]; + $evtavg3 /= 3; + $evtavgspill += $_ for @evtrates; + $evtavgspill /= scalar @evtrates; + + my $data = Perl2Epics::GetAll(); + for(my $i = 0; $i<=15; $i++) { + $totalrate += $data->{"ebrate$i"}->{val} || 0; + $totaldiscarded += $data->{"ebdisc$i"}->{val} || 0; + $totalbytes += $data->{"ebbyte$i"}->{val} || 0; + + $sumtype1 += $data->{"eb$i"."type1"}->{val} || 0; + $sumtype9 += $data->{"eb$i"."type9"}->{val} || 0; + $sumtypeE += $data->{"eb$i"."typeE"}->{val} || 0; + + if(($data->{"ebdisc$i"}->{val} || 0) > 5) { + $qamsgdisc .= " - " unless $qamsgdisc eq ""; + $qamsgdisc .= "EB".($i+1)." ".$data->{"ebdisc$i"}->{val}." events"; + } + + if ($data->{"ebstat$i"}->{val}) { + $actmask |= (1<<$i); + if ($data->{"ebrate$i"}->{val} > 0) { + $recvmask |= (1<<$i); + } + } + } + pop(@ebrates) if scalar @ebrates >= $QA::AcceleratorCycle * 2; + unshift(@ebrates,$totalrate); + $ebavgrate += $_ for @ebrates; + $ebavgrate /= scalar @ebrates; + + my $act = cntbits32($actmask); + my $sent = cntbits32($sentmask); + my $recv = cntbits32($recvmask); + my $mismatch_sr = 0; + my $mismatch_sa = 0; + for(my $i=0;$i<16;$i++) { + $mismatch_sr |= (1<<$i) if ($sentmask & (1<<$i)) && !($recvmask & (1<<$i)); + $mismatch_sa |= (1<<$i) if ($sentmask & (1<<$i)) && !($actmask & (1<<$i)); + } +# printf ("actmask: %08X, recvmask: %04X, sentmask: %04X, mismatch_sr: %04X, mismatch_sa: %04X\n", +# ,$actmask,$recvmask,$sentmask,$mismatch_sr,$mismatch_sa); + +#Mismatch between selected EB in CTS and EB receiving data + if($mismatch_sr != 0) { + if ($evtrate > $act*32) { + my $str = ""; + for(my $i = 0; $i < 16; $i++) { + if ($mismatch_sr & (1<<$i)) { + $str .= ", " if $str ne ""; + $str .= $i+1; + } + } + if ($mismatchfound_sr++ >= 0 && $trbneterr == 0) { + system("logger -p local1.info -t DAQ 'EB Data is sent to EB $str but not received'") unless $mismatchfound_sr % 240; + $qastate = QA::ERROR; + $qamsg .= "Data is sent to EB $str but not received. "; + } + } + } + else { + $mismatchfound_sr = -10; + } + + +#Mismatch between selected EB in CTS and running EB processes + if($mismatch_sa != 0) { + my $str = ""; + for(my $i = 0; $i < 16; $i++) { + if ($mismatch_sa & (1<<$i)) { + $str .= ", " if $str ne ""; + $str .= $i+1; + } + } + if ($mismatchfound_sa++ >= 0 && $trbneterr == 0) { + system("logger -p local1.info -t DAQ 'EB Data is sent to not running EB $str'") unless $mismatchfound_sa % 60; + $qastate = QA::ERROR; + $qamsg .= "Data is sent to not running EB $str. "; + } + } + else { + $mismatchfound_sa = -10; + } + if($trbneterr) { + $qamsg .= "TrbNet Error - no information available."; + $qastate = QA::ERROR; + } + if ($qamsg eq "") {$qamsg = "No error found";} + if ($qastate == QA::OK) { + $qamsg .= sprintf(". Total rate: %i, 2-spill average: %i, total per EB: %i", $totalrate,$ebavgrate,$totalrate/($recv || $totalrate || 1)); + } + + $qamsgdisc = "Discarded events: $totaldiscarded - ".$qamsgdisc; + + + my $qatitle = "#EB running"; + $qatitle = "EB stopped" if ($act == 0) ; + Hmon::Speak('ebrun',$qamsg) if $qastate > 60; + QA::WriteQALog($fqa, "eb", "run", 10, $qastate, $qatitle, + "act: $recv/$sent (".$data->{"prefix"}->{val}.")", $qamsg); +# if ($totalrate) { + $qastatedisc = QA::GetQAState('below',$totaldiscarded/($totalrate || $totaldiscarded || 1),(0.001,0.01,0.1)); +# } +# else { +# $qastatedisc = QA::NA; +# } + + my $totallost = $evtavgspill - $totalrate; + my $s = sprintf("%5d",$totaldiscarded); + QA::WriteQALog($fqa, "eb", "lostevt", 10, $qastatedisc, + "#Evt Discarded", $s, $qamsgdisc); + + $ratetype1 = $sumtype1 - $oldsumtype1 unless ($oldsumtype1 > $sumtype1); + $ratetype9 = $sumtype9 - $oldsumtype9 unless ($oldsumtype9 > $sumtype9); + $ratetypeE = $sumtypeE - $oldsumtypeE unless ($oldsumtypeE > $sumtypeE); + + $cnterrtype9 += -0.8+$ratetype9 if $evtrate > $act*32; + $cnterrtypeE += -0.8+$ratetypeE if $evtrate > $act*32; + if($oldsumtype1 > $sumtype1) { + $cnterrtype9 = 50; + $cnterrtypeE = 50; + } + + + $qastate = QA::OK; +# $qastate = QA::WARN if $ebavgrate <= 0; + my $evtavgshort = sprintf("%i MB - %i kB",$totalbytes/1024,$totalbytes/($totalrate || $totalbytes || 1)); + my $evtavglong = sprintf("%i MB/s - %i kB/evt - %i Evt/EB/s",$totalbytes/1024,$totalbytes/($totalrate || $totalbytes || 1),$totalrate/($recv || $totalrate || 1)); + $evtavglong .= sprintf(" - MDC Calib Evt: %i (%i/s) - Status Evt: %i (%i/s)", + $sumtype9,$ratetype9,$sumtypeE,$ratetypeE); + + if($cnterrtypeE < 30 || $cnterrtype9 < 30) { + $qastate = QA::WARN_2; + $evtavglong .= " - Number of special triggers is not correct (debug $cnterrtype9 $cnterrtypeE)"; + } + if($totalbytes < 20 && $lasttotalbytes <20) { + $qastate = QA::WARN_2; + } + + if($trbneterr == 0) { + QA::WriteQALog($fqa,"eb","bytes",5,$qastate,"Data Rate",$evtavgshort,$evtavglong); + } + else { + QA::WriteQALog($fqa,"eb","bytes",30,QA::NA,"Data Rate","N/A","N/A"); + } + + ($oldsumtype1,$oldsumtype9,$oldsumtypeE) = ($sumtype1,$sumtype9,$sumtypeE); + $lasttotalbytes = $totalbytes; + usleep(990000); + } diff --git a/hmon/permanent/hmon_ebdiskfill.pl b/hmon/permanent/hmon_ebdiskfill.pl new file mode 100755 index 0000000..26a96b5 --- /dev/null +++ b/hmon/permanent/hmon_ebdiskfill.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl -w +use warnings; +use strict; + +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; + +my $store = {}; +my $laststore = {}; +my $values = {}; +my $color = {}; +my $raw = {}; +my $val; +my $max; +my $maxb; +my $maxqa; +my $fqa = QA::OpenQAFile(); + + + +$max = 0; +my $str; +while (1) { + $maxqa = 0; + $str = Hmon::MakeTitle(8,3,"Eventbuilder Disk Fill Level"); + $str .= "\n
"; + for (my $d=1;$d<=22;$d++) { + $str .= "$d"; + } + for (my $n=1;$n<=5;$n++) { + my @out = Hmon::qxtimeout("ssh lxhadeb0$n \"df -h \"",10); + foreach my $a (@out) { + if ($a =~ /(\d*)\%\s*\/data(\d\d)/) { + $store->{$n}->{$2} = $1; + # print $a." $1 $2\n"; + if ($1 > $max) { + $max = $1; $maxb = "$1% on lxhadeb$n Disk $2"; + } + if ($1 > $maxqa) { + $maxqa = $1; + } + } + } + $str .= "\n
lxhadeb$n"; + for (my $d=1;$d<=22;$d++) { + my $id = $d; + $id = '0'.$d if $d<10; + $store->{$n}->{$id} = 0 unless exists $store->{$n}->{$id}; + $str .= "%2i",Hmon::findcolor($store->{$n}->{$id},0,100,0),$store->{$n}->{$id}); + } + + } + $str .= "
\n"; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("EBDisks",$str); + if ($max <= 95) { + } elsif ($max<=98) { + system("logger -p local1.info -t DAQ 'EBdisk Eventbuilder ".$maxb." exceeds $max% fill level.'"); + $max = 120; + } elsif ($max<=100) { + system("logger -p local1.info -t DAQ 'EBdisk Eventbuilder ".$maxb." exceeds $max% fill level.'"); + $max = 120; + } elsif ($max > 101) { + $max--; + } #20*300s break between messages + else { + $max = 0; + } + + my $qastate = QA::GetQAState('below',$max,95,98,99); + QA::WriteQALog($fqa,"server","fill",1000,$qastate,"Disk Level","$maxqa%","$maxb"); + + + sleep 30; +} diff --git a/hmon/permanent/hmon_eberrbits.pl b/hmon/permanent/hmon_eberrbits.pl new file mode 100755 index 0000000..3586e46 --- /dev/null +++ b/hmon/permanent/hmon_eberrbits.pl @@ -0,0 +1,147 @@ +#!/usr/bin/perl -w +use strict; +use warnings; +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; +use Perl2Epics; +use HADES::TrbNet; + +my $timer = 0; +my $flog = QA::OpenQAFile(); + +# my $connect_status = &trb_init_ports(); +# if(!$connect_status) { +# die("could not connect to trbnetd"); +# } + +my $sources = {50000 => "CTS/Start", + 50003 => "RICH 1/2", + 50004 => "RICH 3/4", + 50005 => "RICH 5/6", + 50006 => "RPC 1/2/3", + 50007 => "RPC 4/5/6", + 50008 => "Shower", + 50009 => "TOF", + 50010 => "FWall", + 50011 => "CTS/Start", + 50016 => "MDC 1/2 1000", + 50017 => "MDC 1/2 1010", + 50018 => "MDC 1/2 1020", + 50019 => "MDC 1/2 1030", + 50020 => "MDC 1/2 1040", + 50021 => "MDC 1/2 1050", + 50022 => "MDC 3/4 sec.1", + 50023 => "MDC 3/4 sec.2", + 50024 => "MDC 3/4 sec.3", + 50025 => "MDC 3/4 sec.4", + 50026 => "MDC 3/4 sec.5", + 50027 => "MDC 3/4 sec.6", + 50028 => "MDC Test", + 50032 => "Shower sec.1", + 50033 => "Shower sec.2", + 50034 => "Shower sec.3", + 50035 => "Shower sec.4", + 50036 => "Shower sec.5", + 50037 => "Shower sec.6", + }; + +my @bits = qw(OK Collision WordMissing ChecksumMismatch DontUnderstand BufferMismatch AnswerMissing 7 8 9 10 11 12 13 14 15 + EventNumberMismatch TriggerCodeMismatch WrongLength AnswerMissing NotFound PartiallyMissing SevereProblem BrokenEvent EthernetLinkError SubEventBufferFull EthernetError TimingTriggerError 28 29 30 31); + + +Perl2Epics::Connect("streams","HAD:eb01:nrOfMsgs"); +foreach my $i (0 .. 20) { + Perl2Epics::Connect("stream".($i),"HAD:eb01:portnr1:".($i)); + Perl2Epics::Connect("stream".($i+21),"HAD:eb01:portnr2:".($i+21)); + } +foreach my $i (1 .. 16) { + my $t = sprintf("%02i",$i); + foreach my $s (0 .. 4) { + Perl2Epics::Connect("eb".$i."stat$s","HAD:eb$t:stat:errBitStat$s"); + Perl2Epics::Connect("eb".$i."pat$s","HAD:eb$t:stat:errBitPtrn$s"); + } + } + + + +sleep(2); + +while(1) { + my $data = Perl2Epics::GetAll(); + + my $store = {}; + #$store->{all}->{$bit} + #$store->{$stream}->{$bit} + + my $streams = $data->{"streams"}->{val} || 0; + + foreach my $eb (1 .. 16) { + foreach my $stream (0 .. $streams-1) { + my $currentstream = ($data->{"stream".($stream)}->{val} || 0); +# print $currentstream." ".$stream."\n"; + foreach my $pat (0 .. 4) { + my $currentpattern = $data->{"eb".$eb."pat".$pat}->{val} || 0; + foreach my $bit (0 .. 31) { + if($currentpattern & (1<<$bit)) { + my $currentvalue = $data->{"eb".$eb."stat".$pat}->{val}[$stream] || 0; + if($currentvalue) { + $store->{$currentstream}->{$bit}+= $currentvalue; + } + $store->{all}->{$bit} += $currentvalue; + } + } + } + } + } +# print Dumper $store; + +# my $str = Hmon::MakeTitle(10, 23, "MDC HV", 1, ""); +my $longstring = ""; +my $qastate = QA::OK; +my $value = ""; +my $brokenevents = 0; +my $maxperc = 0; +my $sumperc = 0; +my $errcnt = 0; + + foreach my $k (sort keys %$store) { + if ($k ne "all") { + foreach my $b (sort keys %{$store->{$k}}) { + if(($b != 0)) { + my $perc = $store->{$k}->{$b}/($store->{$k}->{0} || $store->{$k}->{$b} || 1)*100; + $maxperc = $perc if $perc > $maxperc; + $sumperc += $perc; + my $ts = sprintf("%s has %i events (%.2f%%) with %s - ", + $sources->{$k}, + $store->{$k}->{$b}, + $perc, + @bits[$b]); + $longstring .= $ts; + + $brokenevents += $store->{$k}->{$b}; + } + } + } + } + $value = sprintf("%s (%.1f%%)",QA::SciNotation($brokenevents), $sumperc); + + $longstring = "Total Events in file: ".($store->{50010}->{0} || "")." - ". + "Events with errors: ".$value." - ". + $longstring; + chop $longstring;chop $longstring;chop $longstring; + + $qastate = QA::GetQAState('below', $sumperc, @QA::Eventsbroken); + + QA::WriteQALog($flog, "eb", "errbits", 10, + $qastate, "#Evt w/ errors", $value, $longstring); + + system("logger -p local1.info -t DAQ 'EB Events with set error-bits written to file: $longstring'") if ($qastate > 60 && !($timer++%60)); + $timer = 0 if $qastate <= 60; + Hmon::Speak("Eventbuilder receive events with set error bits") if $brokenevents > 1000 && $qastate >= 60; + sleep(1); + } + diff --git a/hmon/permanent/hmon_hldlastfiles.pl b/hmon/permanent/hmon_hldlastfiles.pl new file mode 100755 index 0000000..e71dc17 --- /dev/null +++ b/hmon/permanent/hmon_hldlastfiles.pl @@ -0,0 +1,31 @@ +#!/usr/bin/perl -w +use warnings; +use strict; + +use Time::HiRes qw( gettimeofday usleep time ); +use FileHandle; +use Data::Dumper; +use POSIX qw/floor ceil/; +use Hmon; +use QA; + + +while(1) { + my $out = Hmon::MakeTitle(6,7,"Last *.hld files"); + $out .= "
 ";
+  foreach my $i (5,2,3,4) {
+    my $server = sprintf("lxhadeb%02i",$i);
+    $out .= "$server\n";
+    my $cmd = "ssh $server \"ls -rtlh /data*/data/*.hld | tail -n4\"";
+    my @a = qx($cmd);
+    foreach my $s (@a) {
+      $s =~ s/-rw-r--r-- 1 hadaq hades//;
+      $out .= $s;
+      }
+    }
+    $out .= "
"; + $out .= Hmon::MakeFooter(); + Hmon::WriteFile("hldlast",$out); + + sleep(10); + } \ No newline at end of file diff --git a/hmon/permanent/hmon_hub.pl b/hmon/permanent/hmon_hub.pl new file mode 100755 index 0000000..aedf721 --- /dev/null +++ b/hmon/permanent/hmon_hub.pl @@ -0,0 +1,741 @@ +#!/usr/bin/perl -w +#-d:DProf +use Hmon; +use QA; + +use English; +use strict; +use Getopt::Long; +use Data::Dumper; +use File::stat; +use FileHandle; +use List::MoreUtils qw(any apply uniq); +use List::Util 'max'; + +use Time::HiRes qw( time alarm sleep ); +use Term::ANSIColor qw(:constants); +use Term::ReadKey; + +# require Term::Cap; +require POSIX; + +use POSIX qw(strftime); +use threads; +use threads::shared; +use IO::Socket; + +#use Term::ANSIColor qw(uncolor); +#print uncolor ('01;31'), "\n"; + +#$Term::ANSIColor::AUTORESET++; # reset color after each print +#$SIG{INT} = sub { print RESET; print "\n"; exit; }; # reset color after Ctrl-C + +#- POSIX signal handlers: see signal(7) or kill(1) for available signals +foreach my $signal ( qw(HUP INT QUIT ILL ABRT FPE SEGV TERM USR1 USR2) ) { + $SIG{$signal} = sub { &finishAndExit( $signal ); }; +} + +my $fqa = QA::OpenQAFile(); +Hmon::TraceDBLoad(); + + +#- Definitions for missing boards +my $boards_check_time = 1; +my $busy_check_time = 1; +my $time_old = 0; +my @daq_boards_list = (); +my @missBoards = (); +my $opt_help = 0; +my $opt_syslog = "on"; +my $opt_miss = "on"; +my $opt_debug = 0; +my $longmsg = 0; +my $maxpercent = 0; + +$SIG{USR1} = \&finishAndExit; + +GetOptions ('h|help' => \$opt_help, + 'o|board=f' => \$boards_check_time, + 'b|busy=f' => \$busy_check_time, + 's|syslog=s' => \$opt_syslog, + 'm|miss=s' => \$opt_miss, + 'd|debug' => \$opt_debug); + +if ( $opt_help ) { + &help(); + exit(0); +} + +#- Vars for TCP client +my $ExitCode : shared = -1; +my $ServStatus : shared = "OK"; +my $Logger : shared = 1; + +$Logger = 0 unless(lc($opt_syslog) eq "on"); + +#-------- Start status server thread +threads->new( \&statusClient ) if(lc($opt_syslog) eq "on"); + +#- Definitions for hubs +my $msg = "OK"; +my %hub_hash; +my $hub_href = \%hub_hash; +my @status_base = qw(f e d c b a 9 8 7 6 5 4 3 2 1 0); + +#- Definitions for logging +my $log_statMsg_done = 0; +my $log_missBrds_done = 0; +my $msgtimer = 1; + +# system("clear"); + +#- Get terminal's output speed +# my $termios = new POSIX::Termios; +# $termios->getattr; +# my $ospeed = $termios->getospeed; + +#- Get a reference to a terminal object +# my $terminal = Tgetent Term::Cap { TERM => undef, OSPEED => $ospeed }; +# $terminal->Trequire(qw/ce ku kd/); + +#- When the string reaches the terminal boundary +# it should not go to next line! +# my $word_wrap_off = "\e[?7l"; +# print $word_wrap_off; + +#- Move the cursor to 0:0 +# my $row0 = 0; +# my $col0 = 0; + +while (1) { + + # $terminal->Tgoto('cm', $col0, $row0, *STDOUT); + # $terminal->Tputs('cd',1, *STDOUT); # clear screen to the end + + &display($hub_href); + + $msg = "OK"; + if ($opt_miss eq "on") { + &getMissingBoards(); + } + + %hub_hash = (); + next if(&getDataFromTRBNet($hub_href)); + &calcBusy($hub_href); +} + +&finishAndExit(0); + +exit(0); + +###################### END OF MAIN ####################### + +sub help() + { + print "\n"; + print << 'EOF'; +mon_hub.pl + + This script monitors busy time of Hubs as well as + missing boards. + +Usage: + + Command line: mon_hub.pl + [-h|--help] : Show this help. + [-o|--board

t34uwDbO3WB#!9<@+D|VDyR4|M9Z6x8^=N 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."\n"; + $binning = $binning->{3}*100E-9; +# print $binning."\n"; + $binning = QA::SciNotation($binning); +# print $binning."\n"; + $offset = QA::SciNotation($offset->{3}*100E-9); + my $selx = "err"; + my $sely = "err"; + $selx = "X 0-7" if ($select->{3} & 0x3) == 0; + $selx = "X 4-11" if ($select->{3} & 0x3) == 1; + $selx = "X 8-15" if ($select->{3} & 0x3) == 2; + $sely = "Y 0-7" if ($select->{3} & 0xC) == 0; + $sely = "Y 4-11" if ($select->{3} & 0xC) == 4; + $sely = "Y 8-15" if ($select->{3} & 0xC) == 8; + + + + $str = Hmon::MakeTitle(10,16,"Start Histogram",0); + $str .= qq@ + Offset: @.$offset.qq@s - Binning: @.$binning.qq@s - Inputs: $selx, $sely +
+ + @; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("Starthist",$str); + + $str = Hmon::MakeTitle(10,16,"Start Histogram",0); + $str .= qq@ + Offset: @.$offset.qq@s - Binning: @.$binning.qq@s - Inputs: $selx, $sely +
+ + @; + $str .= Hmon::MakeFooter(); + Hmon::WriteFile("StarthistStacked",$str); + + sleep(5); + } + } +else { + qx(./hmon_hadplot.sh -d 3000 \\ + -a 0x0003 -r 42216 -m 500 -p 0 -w 32 -t "X 1" \\ + -a 0x0003 -r 42716 -m 500 -p 0 -w 32 -t "X 2" \\ + -a 0x0003 -r 43216 -m 500 -p 0 -w 32 -t "X 3" \\ + -a 0x0003 -r 43716 -m 500 -p 0 -w 32 -t "X 4" \\ + -a 0x0003 -r 44216 -m 500 -p 0 -w 32 -t "X 5" \\ + -a 0x0003 -r 44716 -m 500 -p 0 -w 32 -t "X 6" \\ + -a 0x0003 -r 45216 -m 500 -p 0 -w 32 -t "X 7" \\ + -a 0x0003 -r 45716 -m 500 -p 0 -w 32 -t "X 8" \\ + -output "PNG.files/starthistx0.760.365" -curvestyle steps -key genreg 2>/dev/null & + +./hmon_hadplot.sh -d 3000 \\ + -a 0x0003 -r 46216 -m 500 -p 0 -w 32 -t "Y 1" \\ + -a 0x0003 -r 46716 -m 500 -p 0 -w 32 -t "Y 2" \\ + -a 0x0003 -r 47216 -m 500 -p 0 -w 32 -t "Y 3" \\ + -a 0x0003 -r 47716 -m 500 -p 0 -w 32 -t "Y 4" \\ + -a 0x0003 -r 48216 -m 500 -p 0 -w 32 -t "Y 5" \\ + -a 0x0003 -r 48716 -m 500 -p 0 -w 32 -t "Y 6" \\ + -a 0x0003 -r 49216 -m 500 -p 0 -w 32 -t "Y 7" \\ + -a 0x0003 -r 49716 -m 500 -p 0 -w 32 -t "Y 8" \\ +-output "PNG.files/starthisty0.760.365" -curvestyle steps -key genreg 2>/dev/null & + +./hmon_hadplot.sh -d 3000 \\ + -a 0x0003 -r 42216 -m 500 -p 0 -w 32 -t "X 1" \\ + -a 0x0003 -r 42716 -m 500 -p 0 -w 32 -t "X 2" \\ + -a 0x0003 -r 43216 -m 500 -p 0 -w 32 -t "X 3" \\ + -a 0x0003 -r 43716 -m 500 -p 0 -w 32 -t "X 4" \\ + -a 0x0003 -r 44216 -m 500 -p 0 -w 32 -t "X 5" \\ + -a 0x0003 -r 44716 -m 500 -p 0 -w 32 -t "X 6" \\ + -a 0x0003 -r 45216 -m 500 -p 0 -w 32 -t "X 7" \\ + -a 0x0003 -r 45716 -m 500 -p 0 -w 32 -t "X 8" \\ + -output "PNG.files/starthiststackedx0.760.365" -curvestyle histostacked -key genreg 2>/dev/null & + +./hmon_hadplot.sh -d 3000 \\ + -a 0x0003 -r 46216 -m 500 -p 0 -w 32 -t "Y 1" \\ + -a 0x0003 -r 46716 -m 500 -p 0 -w 32 -t "Y 2" \\ + -a 0x0003 -r 47216 -m 500 -p 0 -w 32 -t "Y 3" \\ + -a 0x0003 -r 47716 -m 500 -p 0 -w 32 -t "Y 4" \\ + -a 0x0003 -r 48216 -m 500 -p 0 -w 32 -t "Y 5" \\ + -a 0x0003 -r 48716 -m 500 -p 0 -w 32 -t "Y 6" \\ + -a 0x0003 -r 49216 -m 500 -p 0 -w 32 -t "Y 7" \\ + -a 0x0003 -r 49716 -m 500 -p 0 -w 32 -t "Y 8" \\ +-output "PNG.files/starthiststackedy0.760.365" -curvestyle histostacked -key genreg 2>/dev/null & + + ); + } + diff --git a/hmon/hmon_startmon.pl b/hmon/hmon_startmon.pl new file mode 100755 index 0000000..23d9318 --- /dev/null +++ b/hmon/hmon_startmon.pl @@ -0,0 +1,496 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use Hmon; +use HADES::TrbNet; +use Getopt::Long; +use Data::Dumper; + + +#- the command line option flags +my $opt_help = 0; +my $opt_etrax = "etraxp058"; +my $opt_addr = 3; #CTS +my $opt_verb = 0; +my $opt_type = "dec"; +my $opt_fpga = 0; + +GetOptions ('h|help' => \$opt_help, + 'e|etrax=s' => \$opt_etrax, + 'v|verb' => \$opt_verb, + 't|type=s' => \$opt_type, + 'a|addr=s' => \$opt_addr, + 'f|fpga' => \$opt_fpga); + +if( $opt_help ) { + &help(); + exit(0); +} + + +trb_init_ports() or die trb_strerror(); + +#- List of registers to read +my %reg_list = ( + 'start_x_h_ch01' => { 'text' => 'Start x Ch1', 'memaddr' => 0*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_g_ch02' => { 'text' => 'Start x Ch2', 'memaddr' => 1*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_f_ch03' => { 'text' => 'Start x Ch3', 'memaddr' => 2*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_e_ch04' => { 'text' => 'Start x Ch4', 'memaddr' => 3*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_d_ch05' => { 'text' => 'Start x Ch5', 'memaddr' => 4*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_c_ch06' => { 'text' => 'Start x Ch6', 'memaddr' => 5*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_b_ch07' => { 'text' => 'Start x Ch7', 'memaddr' => 6*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_a_ch08' => { 'text' => 'Start x Ch8', 'memaddr' => 7*500, 'range' => 500, 'hstart' => 1, 'print' => -6 }, + 'start_x_total' => { 'text' => 'Start x Sum', 'memaddr' => 0*500, 'range' => 8*500, 'print' => -5 }, + 'start_y_h_ch01' => { 'text' => 'Start y Ch1', 'memaddr' => 8*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_g_ch02' => { 'text' => 'Start y Ch2', 'memaddr' => 9*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_f_ch03' => { 'text' => 'Start y Ch3', 'memaddr' => 10*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_e_ch04' => { 'text' => 'Start y Ch4', 'memaddr' => 11*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_d_ch05' => { 'text' => 'Start y Ch5', 'memaddr' => 12*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_c_ch06' => { 'text' => 'Start y Ch6', 'memaddr' => 13*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_b_ch07' => { 'text' => 'Start y Ch7', 'memaddr' => 14*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_a_ch08' => { 'text' => 'Start y Ch8', 'memaddr' => 15*500, 'range' => 500, 'hstart' => 1, 'print' => -4 }, + 'start_y_total' => { 'text' => 'Start y Sum', 'memaddr' => 8*500, 'range' => 8*500, 'print' => -3 }, + 'veto_ch1' => { 'text' => 'Veto Ch1', 'memaddr' => 16*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch2' => { 'text' => 'Veto Ch2', 'memaddr' => 17*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch3' => { 'text' => 'Veto Ch3', 'memaddr' => 18*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch4' => { 'text' => 'Veto Ch4', 'memaddr' => 19*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch5' => { 'text' => 'Veto Ch5', 'memaddr' => 20*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch6' => { 'text' => 'Veto Ch6', 'memaddr' => 21*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch7' => { 'text' => 'Veto Ch7', 'memaddr' => 22*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_ch8' => { 'text' => 'Veto Ch8', 'memaddr' => 23*500, 'range' => 500, , 'hveto' => 1, 'print' => -2 }, + 'veto_total' => { 'text' => 'Veto Sum', 'memaddr' => 16*500, 'range' => 8*500, 'print' => -1 }, + # Scaler Delay (PT1, PT2, PT3) + 'SD_PT1' => { 'addr' => 0xa024, 'print' => 3 }, + 'SD_PT2' => { 'addr' => 0xa025, 'print' => 3 }, + 'SD_PT3' => { 'addr' => 0xa026, 'print' => 3 }, + # Scaler C (PT1, PT2, PT3) + 'SC_PT1' => { 'addr' => 0xa05b, 'print' => 4 }, + 'SC_PT2' => { 'addr' => 0xa05c, 'print' => 4 }, + 'SC_PT3' => { 'addr' => 0xa05d, 'print' => 4 }, + # Scaler Out (PT1, PT2, PT3) + 'SO_PT1' => { 'addr' => 0xa04a, 'print' => 5 }, + 'SO_PT2' => { 'addr' => 0xa04b, 'print' => 5 }, + 'SO_PT3' => { 'addr' => 0xa04c, 'print' => 5 }, + # Scalers + 'Start_1' => { 'addr' => 0xa008, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_2' => { 'addr' => 0xa009, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_3' => { 'addr' => 0xa00a, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_4' => { 'addr' => 0xa00b, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_5' => { 'addr' => 0xa00c, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_6' => { 'addr' => 0xa00d, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_7' => { 'addr' => 0xa00e, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Start_8' => { 'addr' => 0xa00f, 'start' => 1, 'total' => 1, 'print' => 6 }, + 'Veto_1' => { 'addr' => 0xa010, 'veto' => 1, 'total' => 1 }, + 'Veto_2' => { 'addr' => 0xa011, 'veto' => 1, 'total' => 1 }, + 'Veto_3' => { 'addr' => 0xa012, 'veto' => 1, 'total' => 1 }, + 'Veto_4' => { 'addr' => 0xa013, 'veto' => 1, 'total' => 1 }, + 'Veto_5' => { 'addr' => 0xa014, 'veto' => 1, 'total' => 1 }, + 'Veto_6' => { 'addr' => 0xa015, 'veto' => 1, 'total' => 1 }, + 'Veto_7' => { 'addr' => 0xa016, 'veto' => 1, 'total' => 1 }, + 'Veto_8' => { 'addr' => 0xa017, 'veto' => 1, 'total' => 1 }, + + # placeholders + 'Total' => { 'value' => 0, 'print' => 8 }, + 'Total_Start' => { 'value' => 0, 'print' => 8 }, + 'Total_Veto' => { 'value' => 0, 'print' => 8 }, + 'PT1/Total_Start' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'SD_PT1', 'ratio2' => 'Total_Start'}, + 'PT1/Total_Veto' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'SD_PT1', 'ratio2' => 'Total_Veto'}, + 'PT2/Total_Start' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'SD_PT2', 'ratio2' => 'Total_Start'}, + 'PT2/Total_Veto' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'SD_PT2', 'ratio2' => 'Total_Veto'}, + 'PT3/Total_Start' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'SD_PT3', 'ratio2' => 'Total_Start'}, + 'PT3/Total_Veto' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'SD_PT3', 'ratio2' => 'Total_Veto'}, + 'Total_Start/Total_Veto' => { 'value' => 0, 'print' => 9 , 'ratio1' => 'Total_Start', 'ratio2' => 'Total_Veto'} + ); + + +#thershold in +- percentage +my $yellow_threshold = 0.20; +my $red_threshold = 0.40; + + +my $reg_href = \%reg_list; +my $nrOfchannels = scalar keys %reg_list; +my @histograms; + +#$reg_href->{'ch1'}->{'value'} = 1; + +my $flog = Hmon::OpenLogfile(); +my $last_spill_on = 0; + +while (1) { + my @result; + + foreach my $rh_address (keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'addr'}) { + +# print "going to read register " . $reg_href->{$rh_address}->{'addr'} . " at " . $opt_addr . "\n"; + @result = trb_register_read_c($opt_addr, $reg_href->{$rh_address}->{'addr'} ) or sleep 5 and next; +# print $result[1] . "\n"; + $reg_href->{$rh_address}->{'value'} = $result[1]; + } + } + + foreach my $rh_address (keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'value'}) { + if (!defined $reg_href->{$rh_address}->{'memaddr'} && + !defined $reg_href->{$rh_address}->{'ratio1'}) { + $reg_href->{$rh_address}->{'spill_value'} += $reg_href->{$rh_address}->{'value'}; + } else { + $reg_href->{$rh_address}->{'spill_value'} = $reg_href->{$rh_address}->{'value'}; + } + } + } + + @result = trb_register_read_c($opt_addr, 0xa002 ); + my $spill_on = 0; + if (defined $result[1]) { + $spill_on = !(($result[1] & 0x10) >> 4); + } + my $end_spill = 0; + if ($last_spill_on == 1 && $spill_on == 0) { + #end of spill, simple edge logic + $end_spill = 1; + foreach my $rh_address (keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'last_spill_value'}) { + $reg_href->{$rh_address}->{'lastlast_spill_value'} = $reg_href->{$rh_address}->{'last_spill_value'}; + } + if (defined $reg_href->{$rh_address}->{'spill_value'}) { + $reg_href->{$rh_address}->{'last_spill_value'} = $reg_href->{$rh_address}->{'spill_value'}; + $reg_href->{$rh_address}->{'spill_value'} = 0; + } + } + } + + + $last_spill_on = $spill_on; + + #read histograms + undef @histograms; + @histograms = trb_register_read_mem_c($opt_addr, 0xa100 + 2*500, 0, 24*500); + #print Dumper @histograms; + &convertHistograms(); + + my $str = ""; + $reg_href->{'Total'}->{'value'} = getSumTotal(); + $reg_href->{'Total_Start'}->{'value'} = getSumTotalStart(); + $reg_href->{'Total_Veto'}->{'value'} = getSumTotalVeto(); + + $str = Hmon::MakeTitle(14, 14, "Start Monitor", 1, ""); + $str .= "\n"; #outer frame + $str .= "\n"; + + #Jureks Veto "GUI" -> no dynamic content possible + $str .= "\n"; + + if ($spill_on == 0) { + $str .= ""; + } + + $str .= "
Summary from histogramsScalersVeto
"; + $str .= "\n"; + $str .= "\n"; + + + foreach my $m (-6..-1) { + my $maximum = 0; + + foreach my $rh_address (sort keys %$reg_href) { + if ((defined $reg_href->{$rh_address}->{'print'}) && ($reg_href->{$rh_address}->{'print'} == $m) ) { + ####$reg_href->{$rh_address}->{'last_spill_value'} = 1; + if (defined $reg_href->{$rh_address}->{'last_spill_value'} && $reg_href->{$rh_address}->{'last_spill_value'}>$maximum) { + $maximum = $reg_href->{$rh_address}->{'last_spill_value'}; + } + } + } + + if (!defined $maximum) {$maximum=0.00001;} + + foreach my $rh_address (sort keys %$reg_href) { + if ((defined $reg_href->{$rh_address}->{'print'}) && ($reg_href->{$rh_address}->{'print'} == $m) ) { + if (defined $reg_href->{$rh_address}->{'text'}) { + $str .= "\n"; + } + } + $str .= "\n"; + } + $str .= "
Last spillL.b.o. spill
" . $reg_href->{$rh_address}->{'text'} . " "; + } else { + $str .= "
" . $rh_address . " "; + } + + + if (defined $reg_href->{$rh_address}->{'last_spill_value'}) { + $str .= convertNumber($reg_href->{$rh_address}->{'last_spill_value'}); + if ($maximum > 0) { + $str .= "
"; + } else { + $str .= "
"; + } + } else {$str .= "---";} + if (defined $reg_href->{$rh_address}->{'lastlast_spill_value'} && defined $reg_href->{$rh_address}->{'last_spill_value'}) { + if ($reg_href->{$rh_address}->{'last_spill_value'} > 0) { + if (($reg_href->{$rh_address}->{'lastlast_spill_value'} / $reg_href->{$rh_address}->{'last_spill_value'}) > (1.0 + $red_threshold) || + ($reg_href->{$rh_address}->{'lastlast_spill_value'} / $reg_href->{$rh_address}->{'last_spill_value'}) < (1.0 - $red_threshold)) { + $str .= "
"; + } elsif (($reg_href->{$rh_address}->{'lastlast_spill_value'} / $reg_href->{$rh_address}->{'last_spill_value'}) > (1.0 + $yellow_threshold) || + ($reg_href->{$rh_address}->{'lastlast_spill_value'} / $reg_href->{$rh_address}->{'last_spill_value'}) < (1.0 - $yellow_threshold)) { + $str .= " "; + } else {$str .= " ";} + $str .= convertNumber($reg_href->{$rh_address}->{'lastlast_spill_value'}); + } else {$str .= " 0";} + } else {$str .= " ---";} + + +# if (defined $reg_href->{$rh_address}->{'value'}) { +# $str .= $reg_href->{$rh_address}->{'value'}; +# } +# if (defined $reg_href->{$rh_address}->{'last_spill_value'} && defined $reg_href->{$rh_address}->{'value'} && $reg_href->{$rh_address}->{'value'} > 0) { +# if (($reg_href->{$rh_address}->{'last_spill_value'} / $reg_href->{$rh_address}->{'value'}) > (1.0 + $red_threshold) || +# ($reg_href->{$rh_address}->{'last_spill_value'} / $reg_href->{$rh_address}->{'value'}) < (1.0 - $red_threshold)) { +# $str .= " "; +# } elsif (($reg_href->{$rh_address}->{'last_spill_value'} / $reg_href->{$rh_address}->{'value'}) > (1.0 + $yellow_threshold) || +# ($reg_href->{$rh_address}->{'last_spill_value'} / $reg_href->{$rh_address}->{'value'}) < (1.0 - $yellow_threshold)) { +# $str .= " "; +# } else {$str .= " ";} +# $str .= $reg_href->{$rh_address}->{'last_spill_value'}; +# } else {$str .= " ";} + + $str .= "
\n"; + $str .= "
\n"; + + ###recalc ratios + foreach my $rh_address (sort keys %$reg_href) { + if (defined $reg_href->{$rh_address}->{'ratio1'}) { + if ((defined $reg_href->{$reg_href->{$rh_address}->{'ratio2'}}->{'value'}) + && ($reg_href->{$reg_href->{$rh_address}->{'ratio2'}}->{'value'}>0)) { + $reg_href->{$rh_address}->{'value'} = sprintf ("%.4f", + $reg_href->{$reg_href->{$rh_address}->{'ratio1'}}->{'value'} / + $reg_href->{$reg_href->{$rh_address}->{'ratio2'}}->{'value'}); + } else { + $reg_href->{$rh_address}->{'value'} = "---"; + } + if ((defined $reg_href->{$reg_href->{$rh_address}->{'ratio2'}}->{'spill_value'}) + && ($reg_href->{$reg_href->{$rh_address}->{'ratio2'}}->{'spill_value'}>0)) { + $reg_href->{$rh_address}->{'spill_value'} = sprintf ("%.4f", + $reg_href->{$reg_href->{$rh_address}->{'ratio1'}}->{'spill_value'} / + $reg_href->{$reg_href->{$rh_address}->{'ratio2'}}->{'spill_value'}); + } else { + $reg_href->{$rh_address}->{'spill_value'} = "---"; + } + + } + } + + foreach my $m (1..9) { + foreach my $rh_address (sort keys %$reg_href) { + if ((defined $reg_href->{$rh_address}->{'print'}) && ($reg_href->{$rh_address}->{'print'} == $m) ) { + + + $str .= "\n"; + } + } + $str .= "\n"; + } + + $str .= "
Current valueCurrent spillLast spill
" . $rh_address . " "; + if (defined $reg_href->{$rh_address}->{'value'}) { + $str .= convertNumber($reg_href->{$rh_address}->{'value'}); + } + $str .= " "; + if (defined $reg_href->{$rh_address}->{'spill_value'}) { + $str .= convertNumber($reg_href->{$rh_address}->{'spill_value'}); + } + $str .= " "; + if (defined $reg_href->{$rh_address}->{'last_spill_value'}) { + $str .= convertNumber($reg_href->{$rh_address}->{'last_spill_value'}); + } + $str .= "
"; + $str .= "\n"; + $str .= ""; + ########## + $str .= "\n"; + $str .= ""; + ########## + $str .= "\n"; + ######################## + $str .= "\n"; + $str .= ""; + ######################## + $str .= "\n"; + $str .= ""; + ######################## + + + $str .= "
"; + if (defined $reg_href->{'Veto_5'}->{'value'}) { + $str .= $reg_href->{'Veto_5'}->{'value'} . "
ch5
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_5'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + } + $str .= "
\n"; + $str .= " \n"; + if (defined $reg_href->{'Veto_6'}->{'value'}) { + $str .= $reg_href->{'Veto_6'}->{'value'} . "
ch6
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_6'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + } + $str .= "
"; + $str .= " \n"; + if (defined $reg_href->{'Veto_1'}->{'value'}) { + $str .= $reg_href->{'Veto_1'}->{'value'} . "
ch1
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_1'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + } + $str .= "
\n"; + $str .= "
\n"; + if (defined $reg_href->{'Veto_4'}->{'value'}) { + $str .= $reg_href->{'Veto_4'}->{'value'} . "
ch4
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_4'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + + } + $str .= "
\n"; + if (defined $reg_href->{'Veto_2'}->{'value'}) { + $str .= $reg_href->{'Veto_2'}->{'value'} . "
ch2
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_2'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + + } + $str .= "
"; + $str .= " \n"; + if (defined $reg_href->{'Veto_3'}->{'value'}) { + $str .= $reg_href->{'Veto_3'}->{'value'} . "
ch3
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_3'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + + } + $str .= "
\n"; + $str .= "
"; + if (defined $reg_href->{'Veto_8'}->{'value'}) { + $str .= $reg_href->{'Veto_8'}->{'value'} . "
ch8
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_8'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + + } + $str .= "
\n"; + $str .= " \n"; + if (defined $reg_href->{'Veto_7'}->{'value'}) { + $str .= $reg_href->{'Veto_7'}->{'value'} . "
ch7
"; + if (defined $reg_href->{'Total_Veto'}->{'value'} && $reg_href->{'Total_Veto'}->{'value'}>0) { + $str .= sprintf("%.0f",100*$reg_href->{'Veto_7'}->{'value'}/$reg_href->{'Total_Veto'}->{'value'}) . "%"; + $str .= "
{'value'}/$reg_href->{'Total_Veto'}->{'value'} . + "px;height:8px;background-color:red;'>
"; + } else {$str .= "---";} + + } + $str .= "
"; + + #end GUI + + $str .= "
Spill Off
\n"; + + $str .= Hmon::MakeFooter(); + + Hmon::WriteFile("StartMon", $str); + + + sleep 1; +} + +sub help() +{ + print "\n"; + print << 'EOF'; +command_display.pl + +Usage: + + Command line: command_client.pl + [-h|--help] : Show this help. + [-e|--etrax ] : Etrax board name. + [-t|--type ] : Print values of registers in dec(%) or absolute (default: dec). + [-f|--fpga] : Program FPGA before reading registers. + [-a|--addr