From: hadaq Date: Mon, 11 May 2015 09:37:15 +0000 (+0200) Subject: changes from DIRC beamtime X-Git-Url: https://jspc29.x-matter.uni-frankfurt.de/git/?a=commitdiff_plain;h=41e8e55adc0d3bd3acd2ac5bb27ce6e89ac804f0;p=daqtools.git changes from DIRC beamtime --- diff --git a/dmon/code/Dmon.pm b/dmon/code/Dmon.pm index 1dd1dfe..0676fb4 100644 --- a/dmon/code/Dmon.pm +++ b/dmon/code/Dmon.pm @@ -6,7 +6,7 @@ use strict; use HADES::TrbNet; use Time::HiRes qq|usleep|; -print STDERR "Script started at ".strftime("%d.%m.%y %H:%M:%S", localtime()).".\n"; +#print STDERR "Script started at ".strftime("%d.%m.%y %H:%M:%S", localtime()).".\n"; @@ -305,7 +305,7 @@ sub PadiwaSendCmd { if (trb_strerror() =~ "no endpoint has been reached") {return -1;} if (trb_strerror() ne "No Error") { - usleep 1E5; + usleep 3E4; if($errcnt >= 12) { return "SPI still blocked\n"; } diff --git a/dmon/scripts/ChanDb_discdirc.pm b/dmon/scripts/ChanDb_discdirc.pm new file mode 100644 index 0000000..bdb85ab --- /dev/null +++ b/dmon/scripts/ChanDb_discdirc.pm @@ -0,0 +1,692 @@ +package ChanDb_discdirc; + +our $chanDb = { + + + '1' => { + '0.00' => { + 'fpga' => 8231, + 'chan' => 16 + }, + '8.40' => { + 'fpga' => 8230, + 'chan' => 48 + }, + '9.60' => { + 'fpga' => 8230, + 'chan' => 46 + }, + '12.90' => { + 'chan' => 39, + 'fpga' => 8230 + }, + '3.60' => { + 'chan' => 8, + 'fpga' => 8231 + }, + '16.20' => { + 'fpga' => 8230, + 'chan' => 15 + }, + '9.00' => { + 'chan' => 3, + 'fpga' => 8230 + }, + '15.90' => { + 'chan' => 16, + 'fpga' => 8230 + }, + '15.30' => { + 'chan' => 35, + 'fpga' => 8230 + }, + '8.70' => { + 'chan' => 4, + 'fpga' => 8230 + }, + '1.80' => { + 'fpga' => 8230, + 'chan' => 23 + }, + '6.60' => { + 'chan' => 31, + 'fpga' => 8230 + }, + '1.50' => { + 'chan' => 24, + 'fpga' => 8230 + }, + '0.90' => { + 'fpga' => 8231, + 'chan' => 11 + }, + '12.60' => { + 'chan' => 9, + 'fpga' => 8230 + }, + '11.70' => { + 'chan' => 41, + 'fpga' => 8230 + }, + '17.70' => { + 'chan' => 38, + 'fpga' => 8229 + }, + '1.20' => { + 'fpga' => 8231, + 'chan' => 12 + }, + '3.30' => { + 'chan' => 7, + 'fpga' => 8231 + }, + '6.90' => { + 'chan' => 1, + 'fpga' => 8231 + }, + '15.00' => { + 'chan' => 13, + 'fpga' => 8230 + }, + '12.00' => { + 'fpga' => 8230, + 'chan' => 42 + }, + '2.10' => { + 'fpga' => 8231, + 'chan' => 9 + }, + '17.40' => { + 'fpga' => 8229, + 'chan' => 33 + }, + '0.30' => { + 'fpga' => 8230, + 'chan' => 22 + }, + '3.00' => { + 'fpga' => 8230, + 'chan' => 25 + }, + '14.10' => { + 'fpga' => 8230, + 'chan' => 37 + }, + '15.60' => { + 'chan' => 36, + 'fpga' => 8230 + }, + '7.50' => { + 'chan' => 2, + 'fpga' => 8230 + }, + '10.20' => { + 'fpga' => 8230, + 'chan' => 5 + }, + '10.50' => { + 'fpga' => 8230, + 'chan' => 43 + }, + '4.20' => { + 'chan' => 27, + 'fpga' => 8230 + }, + '2.70' => { + 'chan' => 26, + 'fpga' => 8230 + }, + '8.10' => { + 'chan' => 47, + 'fpga' => 8230 + }, + '6.30' => { + 'chan' => 32, + 'fpga' => 8230 + }, + '9.30' => { + 'fpga' => 8230, + 'chan' => 45 + }, + '18.60' => { + 'chan' => 35, + 'fpga' => 8229 + }, + '4.80' => { + 'fpga' => 8231, + 'chan' => 6 + }, + '5.10' => { + 'fpga' => 8230, + 'chan' => 30 + }, + '19.20' => { + 'fpga' => 8229, + 'chan' => 39 + }, + '13.80' => { + 'chan' => 11, + 'fpga' => 8230 + }, + '7.80' => { + 'fpga' => 8230, + 'chan' => 1 + }, + '9.90' => { + 'fpga' => 8230, + 'chan' => 6 + }, + '18.90' => { + 'fpga' => 8229, + 'chan' => 40 + }, + '13.20' => { + 'fpga' => 8230, + 'chan' => 40 + }, + '18.30' => { + 'chan' => 36, + 'fpga' => 8229 + }, + '14.70' => { + 'fpga' => 8230, + 'chan' => 14 + }, + '16.50' => { + 'fpga' => 8230, + 'chan' => 33 + }, + '14.40' => { + 'fpga' => 8230, + 'chan' => 38 + }, + '10.80' => { + 'chan' => 44, + 'fpga' => 8230 + }, + '13.50' => { + 'chan' => 12, + 'fpga' => 8230 + }, + '17.10' => { + 'fpga' => 8229, + 'chan' => 34 + }, + '11.10' => { + 'chan' => 8, + 'fpga' => 8230 + }, + '16.80' => { + 'fpga' => 8230, + 'chan' => 34 + }, + '5.70' => { + 'fpga' => 8231, + 'chan' => 3 + }, + '2.40' => { + 'chan' => 10, + 'fpga' => 8231 + }, + '12.30' => { + 'fpga' => 8230, + 'chan' => 10 + }, + '18.00' => { + 'chan' => 37, + 'fpga' => 8229 + }, + '3.90' => { + 'chan' => 28, + 'fpga' => 8230 + }, + '0.60' => { + 'fpga' => 8230, + 'chan' => 21 + }, + '7.20' => { + 'fpga' => 8231, + 'chan' => 2 + }, + '6.00' => { + 'chan' => 4, + 'fpga' => 8231 + }, + '5.40' => { + 'fpga' => 8230, + 'chan' => 29 + }, + '4.50' => { + 'fpga' => 8231, + 'chan' => 5 + }, + '11.40' => { + 'chan' => 7, + 'fpga' => 8230 + } + }, + '0' => { + '18.5' => { + 'chan' => 30, + 'fpga' => 8229 + }, + '37.5' => { + 'chan' => 16, + 'fpga' => 8229 + }, + '11' => { + 'chan' => 6, + 'fpga' => 8228 + }, + '10' => { + 'fpga' => 8228, + 'chan' => 8 + }, + '9' => { + 'chan' => 34, + 'fpga' => 8228 + }, + '7.5' => { + 'chan' => 37, + 'fpga' => 8228 + }, + '35.5' => { + 'fpga' => 8229, + 'chan' => 12 + }, + '26.5' => { + 'fpga' => 8228, + 'chan' => 19 + }, + '23.5' => { + 'fpga' => 8228, + 'chan' => 25 + }, + '1.5' => { + 'chan' => 1, + 'fpga' => 8228 + }, + '36.5' => { + 'fpga' => 8229, + 'chan' => 14 + }, + '13' => { + 'chan' => 19, + 'fpga' => 8229 + }, + '29.5' => { + 'chan' => 13, + 'fpga' => 8228 + }, + '1' => { + 'chan' => 2, + 'fpga' => 8228 + }, + '19.5' => { + 'chan' => 32, + 'fpga' => 8229 + }, + '29' => { + 'chan' => 14, + 'fpga' => 8228 + }, + '3' => { + 'fpga' => 8228, + 'chan' => 46 + }, + '0' => { + 'fpga' => 8228, + 'chan' => 4 + }, + '30.5' => { + 'fpga' => 8229, + 'chan' => 2 + }, + '22.5' => { + 'chan' => 27, + 'fpga' => 8228 + }, + '16.5' => { + 'chan' => 26, + 'fpga' => 8229 + }, + '17' => { + 'chan' => 27, + 'fpga' => 8229 + }, + '2' => { + 'chan' => 48, + 'fpga' => 8228 + }, + '21.5' => { + 'fpga' => 8228, + 'chan' => 29 + }, + '37' => { + 'fpga' => 8229, + 'chan' => 15 + }, + '27.5' => { + 'chan' => 17, + 'fpga' => 8228 + }, + '23' => { + 'chan' => 26, + 'fpga' => 8228 + }, + '4.5' => { + 'chan' => 43, + 'fpga' => 8228 + }, + '28' => { + 'chan' => 16, + 'fpga' => 8228 + }, + '27' => { + 'fpga' => 8228, + 'chan' => 18 + }, + '15' => { + 'fpga' => 8229, + 'chan' => 23 + }, + '7' => { + 'chan' => 38, + 'fpga' => 8228 + }, + '5' => { + 'chan' => 42, + 'fpga' => 8228 + }, + '13.5' => { + 'chan' => 20, + 'fpga' => 8229 + }, + '20' => { + 'fpga' => 8228, + 'chan' => 32 + }, + '4' => { + 'fpga' => 8228, + 'chan' => 44 + }, + '10.5' => { + 'chan' => 7, + 'fpga' => 8228 + }, + '31' => { + 'chan' => 3, + 'fpga' => 8229 + }, + '18' => { + 'chan' => 29, + 'fpga' => 8229 + }, + '31.5' => { + 'fpga' => 8229, + 'chan' => 4 + }, + '39.5' => { + 'chan' => 9, + 'fpga' => 8228 + }, + '9.5' => { + 'chan' => 33, + 'fpga' => 8228 + }, + '34.5' => { + 'chan' => 10, + 'fpga' => 8229 + }, + '24' => { + 'fpga' => 8228, + 'chan' => 24 + }, + '8' => { + 'chan' => 36, + 'fpga' => 8228 + }, + '33' => { + 'chan' => 7, + 'fpga' => 8229 + }, + '12.5' => { + 'chan' => 18, + 'fpga' => 8229 + }, + '25.5' => { + 'fpga' => 8228, + 'chan' => 21 + }, + '20.5' => { + 'chan' => 31, + 'fpga' => 8228 + }, + '36' => { + 'fpga' => 8229, + 'chan' => 13 + }, + '2.5' => { + 'chan' => 47, + 'fpga' => 8228 + }, + '26' => { + 'chan' => 20, + 'fpga' => 8228 + }, + '6.5' => { + 'chan' => 39, + 'fpga' => 8228 + }, + '38.5' => { + 'chan' => 11, + 'fpga' => 8228 + }, + '32.5' => { + 'chan' => 6, + 'fpga' => 8229 + }, + '21' => { + 'fpga' => 8228, + 'chan' => 30 + }, + '25' => { + 'chan' => 22, + 'fpga' => 8228 + }, + '19' => { + 'fpga' => 8229, + 'chan' => 31 + }, + '5.5' => { + 'chan' => 41, + 'fpga' => 8228 + }, + '14.5' => { + 'fpga' => 8229, + 'chan' => 22 + }, + '3.5' => { + 'chan' => 45, + 'fpga' => 8228 + }, + '17.5' => { + 'fpga' => 8229, + 'chan' => 28 + }, + '16' => { + 'fpga' => 8229, + 'chan' => 25 + }, + '33.5' => { + 'fpga' => 8229, + 'chan' => 8 + }, + '35' => { + 'fpga' => 8229, + 'chan' => 11 + }, + '0.5' => { + 'fpga' => 8228, + 'chan' => 3 + }, + '30' => { + 'chan' => 1, + 'fpga' => 8229 + }, + '22' => { + 'chan' => 28, + 'fpga' => 8228 + }, + '38' => { + 'chan' => 12, + 'fpga' => 8228 + }, + '39' => { + 'chan' => 10, + 'fpga' => 8228 + }, + '34' => { + 'fpga' => 8229, + 'chan' => 9 + }, + '32' => { + 'chan' => 5, + 'fpga' => 8229 + }, + '8.5' => { + 'chan' => 35, + 'fpga' => 8228 + }, + '12' => { + 'fpga' => 8229, + 'chan' => 17 + }, + '6' => { + 'fpga' => 8228, + 'chan' => 40 + }, + '14' => { + 'chan' => 21, + 'fpga' => 8229 + }, + '28.5' => { + 'fpga' => 8228, + 'chan' => 15 + }, + '11.5' => { + 'chan' => 5, + 'fpga' => 8228 + }, + '24.5' => { + 'fpga' => 8228, + 'chan' => 23 + }, + '15.5' => { + 'fpga' => 8229, + 'chan' => 24 + } + }, + '2' => { + '4.50' => { + 'chan' => 21, + 'fpga' => 8232 + }, + '5.40' => { + 'chan' => 13, + 'fpga' => 8232 + }, + '6.00' => { + 'fpga' => 8232, + 'chan' => 20 + }, + '6.90' => { + 'fpga' => 8232, + 'chan' => 17 + }, + '7.20' => { + 'fpga' => 8232, + 'chan' => 18 + }, + '5.10' => { + 'chan' => 14, + 'fpga' => 8232 + }, + '4.80' => { + 'fpga' => 8232, + 'chan' => 22 + }, + '3.30' => { + 'fpga' => 8232, + 'chan' => 23 + }, + '1.20' => { + 'chan' => 28, + 'fpga' => 8232 + }, + '0.60' => { + 'fpga' => 8232, + 'chan' => 5 + }, + '3.90' => { + 'fpga' => 8232, + 'chan' => 12 + }, + '6.30' => { + 'chan' => 16, + 'fpga' => 8232 + }, + '2.70' => { + 'fpga' => 8232, + 'chan' => 10 + }, + '2.40' => { + 'fpga' => 8232, + 'chan' => 26 + }, + '5.70' => { + 'chan' => 19, + 'fpga' => 8232 + }, + '4.20' => { + 'chan' => 11, + 'fpga' => 8232 + }, + '3.60' => { + 'chan' => 24, + 'fpga' => 8232 + }, + '0.90' => { + 'chan' => 27, + 'fpga' => 8232 + }, + '6.60' => { + 'chan' => 15, + 'fpga' => 8232 + }, + '1.50' => { + 'chan' => 8, + 'fpga' => 8232 + }, + '3.00' => { + 'fpga' => 8232, + 'chan' => 9 + }, + '1.80' => { + 'fpga' => 8232, + 'chan' => 7 + }, + '0.30' => { + 'chan' => 6, + 'fpga' => 8232 + }, + '2.10' => { + 'chan' => 25, + 'fpga' => 8232 + }, + '0.00' => { + 'fpga' => 8232, + 'chan' => 32 + } + } + }; diff --git a/dmon/scripts/dmon_heatmapdirc.pl b/dmon/scripts/dmon_heatmapdirc.pl new file mode 100755 index 0000000..39d3852 --- /dev/null +++ b/dmon/scripts/dmon_heatmapdirc.pl @@ -0,0 +1,348 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use POSIX qw(strftime ceil floor); +use FileHandle; +use lib "./code"; +use lib "./scripts"; +use lib "../tools"; +use lib "../users/gsi_dirc"; +use lib "../perllibs/"; +use HADES::TrbNet; +use Time::HiRes qw(usleep); +use List::Util qw[min max]; +use Dmon; +# use HPlot; +use Data::Dumper; +use ChanDb; +use GD::Simple; + +my %config = Dmon::StartUp(); + + + +##################### draw channel mapping once ################### +eval { + + + my $str = Dmon::MakeTitle(12,12,"ChannelMapDirc",0); + $str .= qq@
@; + $str .= Dmon::MakeFooter(); + Dmon::WriteFile("ChannelMapDirc",$str); + + my $pmt_rows = @{$ChanDb::chanDb}; + my $pmt_cols = @{$ChanDb::chanDb->[0]}; + print "found $pmt_rows pmt rows and $pmt_cols pmt columns\n"; + + my $plot_filename = Dmon::DMONDIR."ChannelMapDirc.png"; + + my $padding_left = 60; + my $padding_top = 40; + my $pixel_size = 15; + my $pmt_spacing_x = 60; + my $pmt_spacing_y = 35; + + + #decide FPGA colors + my $fpga_colors; + for my $pmt_i (0..($pmt_rows-1)) { + for my $pmt_j (0..($pmt_cols-1)) { + my $pmt_lookup = $ChanDb::chanDb->[$pmt_i]->[$pmt_j]; + for my $px_i (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[0]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + my $padiwa = $pixel_info->{padiwa}; + $fpga_colors->{$fpga} = []; + } + } + } + my @keys = sort keys %$fpga_colors; + my $count=0; + + for my $fpga (@keys) { + my $hue = ($count/(@keys-1)); + my @color = GD::Simple->HSVtoRGB((floor($hue*255) % 256),255-160*($count%2),255); + $fpga_colors->{$fpga} = \@color; + $count++; + } + #finished with FPGA colors + + my $img = GD::Simple->new(1024,600); + my $offset_x; + my $offset_y; + + for my $pmt_i (0..($pmt_rows-1)) { + $offset_y = $padding_top + $pmt_i*($pmt_spacing_y + 8*$pixel_size); + for my $pmt_j (0..($pmt_cols-1)) { + $offset_x = $padding_left + $pmt_j*($pmt_spacing_x + 8*$pixel_size); + my $pmt_lookup = $ChanDb::chanDb->[$pmt_i]->[$pmt_j]; + my $mcp_id = $pmt_lookup->[0]->[0]->{mcp}; + $img->moveTo($offset_x,$offset_y-10); + $img->string($mcp_id); + my $last_fpga=-1; + for my $px_i (0..7) { + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + my $padiwa = $pixel_info->{padiwa}; + + $img->bgcolor(@{$fpga_colors->{$fpga}}); + $img->fgcolor('black'); + my $tlx =$offset_x + $px_j*$pixel_size; + my $tly =$offset_y + $px_i*$pixel_size; + my $brx = $tlx + $pixel_size; + my $bry = $tly + $pixel_size; + $img->rectangle($tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + + $img->moveTo($tlx+3,$tly+$pixel_size); + $img->string(sprintf("%02d",$channel)); + + if($last_fpga != $fpga){ + $img->moveTo($tlx-40,$tly+$pixel_size); + $img->string(sprintf("0x%x",$fpga)); + $img->fgcolor(@{$fpga_colors->{$fpga}}); + $img->moveTo($tlx-40,$tly+$pixel_size); + $img->lineTo($tlx-5,$tly+$pixel_size); + } + + $last_fpga = $fpga; + } + } + } + } + + open my $out, '>', $plot_filename or die; + binmode $out; + print $out $img->png; +}; +##################### finished drawing channel mapping ################### + + + +my $str = Dmon::MakeTitle(9,10,"HeatmapDirc",0); + $str .= qq@
@; + $str .= Dmon::MakeFooter(); +Dmon::WriteFile("HeatmapDirc",$str); + + +my $old; +my $oldtime = time(); +my $time = time(); +my $diff; + + +my $pmt_rows = @{$ChanDb::chanDb}; +my $pmt_cols = @{$ChanDb::chanDb->[0]}; +print "found $pmt_rows pmt rows and $pmt_cols pmt columns\n"; + +my $plot_filename = Dmon::DMONDIR."HeatmapDirc".".png"; + +my $padding_left = 20; +my $padding_top = 40; +my $pixel_size = 10; +my $pmt_spacing_x = 40; +my $pmt_spacing_y = 35; + +# upper limit for high end of color scale +my $max_count_uclamp = $config{HeatmapDirc}->{max_count_uclamp}||100000; +# lower limit for high end of color scale +my $max_count_lclamp = $config{HeatmapDirc}->{max_count_lclamp}||10; +my $gliding_average_steps = $config{HeatmapDirc}->{normalization_inertia}; +my $instantaneous_normalization = $config{HeatmapDirc}->{instant_normalization}; +my $overscale_factor = 1.1; + +my $legend_length = 560; +my $legend_segments = 128; +my $leg_seg_width = ceil($legend_length/$legend_segments); + +my $new_max = 0; +# my $new_min = 0; +my $max_count=0; +my $min_count=0; + + +while (1) { + my $o = trb_register_read_mem($config{PadiwaBroadcastAddress},0xc000,0,49); + +# print Dumper $o; + + my $sum = 0; + if (defined $old) { + foreach my $b (keys %$o) { + for my $v (0..49) { + my $tdiff = time() - $oldtime; + my $vdiff = (($o->{$b}->[$v]||0)&0xffffff) - (($old->{$b}->[$v]||0)&0xffffff); + if ($vdiff < 0) { $vdiff += 2**24;} + $diff->{$b}->[$v] = $vdiff/($tdiff|1); + } + } + + + if ($instantaneous_normalization) { + $max_count = 0; + + for my $pmt_i (0..($pmt_rows-1)) { + for my $pmt_j (0..($pmt_cols-1)) { + my $pmt_lookup = $ChanDb::chanDb->[$pmt_i]->[$pmt_j]; + for my $px_i (0..7) { + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + my $val = $diff->{$fpga}->[$channel] || 0; + $max_count = max($max_count,$val); + } + } + } + } + + $max_count = min($max_count,$max_count_uclamp); + $max_count = max($max_count,$max_count_lclamp); + } else { + $new_max = min($new_max*$overscale_factor,$max_count_uclamp); + # exponential gliding average + $max_count = floor(($max_count*($gliding_average_steps-1) + $new_max)/$gliding_average_steps); + $max_count = max($max_count,$max_count_lclamp); + $new_max = 0; + } + + + + +# $new_min = $max_count_clamp; +# print "max: $max_count min: $min_count\n"; + my $count_range = $max_count-$min_count; + + my $img = GD::Simple->new(640,480); + my $offset_x; + my $offset_y; + + for my $pmt_i (0..($pmt_rows-1)) { + $offset_y = $padding_top + $pmt_i*($pmt_spacing_y + 8*$pixel_size); + for my $pmt_j (0..($pmt_cols-1)) { + $offset_x = $padding_left + $pmt_j*($pmt_spacing_x + 8*$pixel_size); + + my $pmt_lookup = $ChanDb::chanDb->[$pmt_i]->[$pmt_j]; + + my $mcp_id = $pmt_lookup->[0]->[0]->{mcp}; + $img->moveTo($offset_x,$offset_y-10); + $img->string($mcp_id); + + for my $px_i (0..7) { +# print "\n"; + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + + my $val = $diff->{$fpga}->[$channel]; + unless(defined($diff->{$fpga}->[$channel])){ + print STDERR "cannot get data from FPGA ".sprintf("%x",$fpga) + .", channel $channel\n"; + } + $new_max = max($val,$new_max); +# $new_min = min($val,$new_min); + $sum += $diff->{$fpga}->[$channel]; + my $val_in_range = min(max($val,$min_count),$max_count)-$min_count; + if(defined($diff->{$fpga}->[$channel])){ + $img->bgcolor(false_color($val_in_range/$count_range)); + } else { + $img->bgcolor('black'); + } + $img->fgcolor('black'); + my $tlx =$offset_x + $px_j*$pixel_size; + my $tly =$offset_y + $px_i*$pixel_size; + my $brx = $tlx + $pixel_size; + my $bry = $tly + $pixel_size; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + } + } + } + } + +# print "new max: $new_max, :new_min: $new_min\n"; + + #now drawing the legend + $offset_x = $padding_left; + $offset_y = $padding_top + $pmt_rows*($pmt_spacing_y + 8*$pixel_size); + + #calculate relevant decimal power + my $dpwr = floor(log($count_range)/log(10)); + if (($count_range/10**$dpwr)<=2) { + $dpwr--; + } + +# print "dpwr: $dpwr\n"; + + my $last_integer=-1; + for my $leg_seg (0..($legend_segments-1)){ + my $val = $leg_seg/$legend_segments*$count_range+$min_count; + my @color = false_color($leg_seg/$legend_segments); + $img->bgcolor(@color); + $img->fgcolor(@color); + my $tlx =$offset_x + $leg_seg*$leg_seg_width; + my $tly =$offset_y; + my $brx = $tlx + $leg_seg_width; + my $bry = $tly + $pixel_size; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + + #distribute nice numbers along the rainbow + my $cur_integer = floor($val/(10**$dpwr)); + if ($cur_integer != $last_integer) { +# unless($leg_seg % $legend_stepping) { + $img->moveTo($tlx,$tly-8); + $img->fgcolor('black'); + $img->string(kilomega($cur_integer*10**$dpwr)); + } + $last_integer=$cur_integer; + } + + $offset_x = $padding_left; + $offset_y += 25; + $img->moveTo($offset_x,$offset_y); + $img->fgcolor('black'); + $img->string(strftime("%H:%M:%S", localtime())); + + open my $out, '>', $plot_filename or die; + binmode $out; + print $out $img->png; + } + my $status = Dmon::OK; + my $title = "Dirc Heatmap"; + my $value = Dmon::SciNotation($sum); + my $longtext = "See plot"; + Dmon::WriteQALog($config{flog},"heatmapdirc",5,$status,$title,$value,$longtext,'1-HeatmapDirc'); + $old = $o; + $oldtime = time(); + sleep(1); +} + +sub false_color { + my $val = $_[0]; # has to be normalized + my $hue = 170*(1-$val); + return GD::Simple->HSVtoRGB($hue,255,255); +} + + +sub kilomega { + my $val = $_[0]; + my $num; + if($val/1e9 >= 1){ + my $a = sprintf("%1.1fG",$val/1e9); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e6 >= 1){ + my $a = sprintf("%1.1fM",$val/1e6); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e3 >= 1){ + my $a = sprintf("%1.1fk",$val/1e3); + $a =~ s/\.0//; + return $a; + } else { + return sprintf("%d",$val); + } +} \ No newline at end of file diff --git a/dmon/scripts/dmon_heatmapdiscdirc.pl b/dmon/scripts/dmon_heatmapdiscdirc.pl new file mode 100755 index 0000000..11df705 --- /dev/null +++ b/dmon/scripts/dmon_heatmapdiscdirc.pl @@ -0,0 +1,233 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use POSIX qw(strftime ceil floor); +use FileHandle; +use lib "./code"; +use lib "./scripts"; +use lib "../tools"; +use lib "../users/gsi_dirc"; +use HADES::TrbNet; +use Time::HiRes qw(usleep); +use List::Util qw[min max]; +use Dmon; +# use HPlot; +use Data::Dumper; +use ChanDb_discdirc; +use GD::Simple; + +my %config = Dmon::StartUp(); + +my $chanDb = $ChanDb_discdirc::chanDb; + +my $str = Dmon::MakeTitle(9,14,"HeatmapDiscDirc",0); + $str .= qq@
@; + $str .= Dmon::MakeFooter(); +Dmon::WriteFile("HeatmapDiscDirc",$str); + + +my $old; +my $oldtime = time(); +my $time = time(); +my $diff; + + + +my $plot_filename = Dmon::DMONDIR."HeatmapDiscDirc".".png"; + +my $padding_left = 20; +my $padding_top = 40; +# my $pixel_size = 10; +# my $pmt_spacing_x = 40; +# my $pmt_spacing_y = 35; +my $strip_length = 180; + +my $px_per_mm = 10; + +# upper limit for high end of color scale +my $max_count_uclamp = $config{HeatmapDiscDirc}->{max_count_uclamp}||100000; +# lower limit for high end of color scale +my $max_count_lclamp = $config{HeatmapDiscDirc}->{max_count_lclamp}||10; +my $gliding_average_steps = $config{HeatmapDiscDirc}->{normalization_inertia}; +my $instantaneous_normalization = $config{HeatmapDiscDirc}->{instant_normalization}; +my $overscale_factor = 1.1; + +my $legend_length = 560; +my $legend_segments = 128; +my $leg_seg_width = ceil($legend_length/$legend_segments); + +my $new_max = 0; +my $max_count=0; +my $min_count=0; + +my $max_y_pos; + +while (1) { + my $o = trb_register_read_mem($config{PadiwaBroadcastAddress},0xc000,0,49); + +# print Dumper $o; + + my $sum = 0; + if (defined $old) { + foreach my $b (keys %$o) { + for my $v (0..49) { + my $tdiff = time() - $oldtime; + my $vdiff = (($o->{$b}->[$v]||0)&0xffffff) - (($old->{$b}->[$v]||0)&0xffffff); + if ($vdiff < 0) { $vdiff += 2**24;} + $diff->{$b}->[$v] = $vdiff/($tdiff|1); + } + } + + + + + if ($instantaneous_normalization) { + $max_count = 0; + + for my $col (0..2) { + for my $ypos (sort keys %{$chanDb->{$col}}) { + my $fpga = $chanDb->{$col}->{$ypos}->{fpga}; + my $channel = $chanDb->{$col}->{$ypos}->{chan}; + my $val = $diff->{$fpga}->[$channel]; + $max_count = max($max_count,$val); + } + } + $max_count = min($max_count,$max_count_uclamp); + $max_count = max($max_count,$max_count_lclamp); + } else { + $new_max = min($new_max*$overscale_factor,$max_count_uclamp); + # exponential gliding average + $max_count = floor(($max_count*($gliding_average_steps-1) + $new_max)/$gliding_average_steps); + $max_count = max($max_count,$max_count_lclamp); + $new_max = 0; + } + + my $count_range = $max_count-$min_count; + + + my $img = GD::Simple->new(640,640); + my $offset_x; + my $offset_y; + + $offset_y = $padding_top; + + for my $col (0..2) { + my $strip_width; + if ($col == 0){ + $strip_width = 0.5; + } else { + $strip_width = 0.3; + } + + $offset_x = $padding_left + $col*$strip_length; + for my $ypos (sort keys %{$chanDb->{$col}}) { + my $fpga = $chanDb->{$col}->{$ypos}->{fpga}; + my $channel = $chanDb->{$col}->{$ypos}->{chan}; + + my $val = $diff->{$fpga}->[$channel]; + unless(defined($val)){ + print STDERR "cannot get data from FPGA ".sprintf("%x",$fpga) + .", channel $channel\n"; + } + $new_max = max($val,$new_max); + $sum += $diff->{$fpga}->[$channel]; + my $val_in_range = min(max($val,$min_count),$max_count)-$min_count; + if(defined($val)){ + $img->bgcolor(false_color($val_in_range/$count_range)); + } else { + $img->bgcolor('black'); + } + $img->fgcolor('black'); + my $tlx =$offset_x + $strip_width*$col; + my $tly =$offset_y + $ypos*$px_per_mm; + my $brx = $tlx + $strip_length; + my $bry = $tly + $strip_width*$px_per_mm; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + $max_y_pos = max($max_y_pos,$ypos); + } + + } + + + #now drawing the legend + $offset_x = $padding_left; + $offset_y = $padding_top + $max_y_pos*$px_per_mm +30 ; + + #calculate relevant decimal power + my $dpwr = floor(log($count_range)/log(10)); + if (($count_range/10**$dpwr)<=2) { + $dpwr--; + } + +# print "dpwr: $dpwr\n"; + + my $last_integer=-1; + for my $leg_seg (0..($legend_segments-1)){ + my $val = $leg_seg/$legend_segments*$count_range+$min_count; + my @color = false_color($leg_seg/$legend_segments); + $img->bgcolor(@color); + $img->fgcolor(@color); + my $tlx =$offset_x + $leg_seg*$leg_seg_width; + my $tly =$offset_y; + my $brx = $tlx + $leg_seg_width; + my $bry = $tly + 10; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + + #distribute nice numbers along the rainbow + my $cur_integer = floor($val/(10**$dpwr)); + if ($cur_integer != $last_integer) { +# unless($leg_seg % $legend_stepping) { + $img->moveTo($tlx,$tly-8); + $img->fgcolor('black'); + $img->string(kilomega($cur_integer*10**$dpwr)); + } + $last_integer=$cur_integer; + } + + $offset_x = $padding_left; + $offset_y += 25; + $img->moveTo($offset_x,$offset_y); + $img->fgcolor('black'); + $img->string(strftime("%H:%M:%S", localtime())); + + open my $out, '>', $plot_filename or die; + binmode $out; + print $out $img->png; + } + my $status = Dmon::OK; + my $title = "DiscDirc"; + my $value = Dmon::SciNotation($sum); + my $longtext = "See plot"; + Dmon::WriteQALog($config{flog},"heatmapdiscdirc",5,$status,$title,$value,$longtext,'1-HeatmapDiscDirc'); + $old = $o; + $oldtime = time(); + sleep(1); +} + +sub false_color { + my $val = $_[0]; # has to be normalized + my $hue = 170*(1-$val); + return GD::Simple->HSVtoRGB($hue,255,255); +} + + +sub kilomega { + my $val = $_[0]; + my $num; + if($val/1e9 >= 1){ + my $a = sprintf("%1.1fG",$val/1e9); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e6 >= 1){ + my $a = sprintf("%1.1fM",$val/1e6); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e3 >= 1){ + my $a = sprintf("%1.1fk",$val/1e3); + $a =~ s/\.0//; + return $a; + } else { + return sprintf("%d",$val); + } +} \ No newline at end of file diff --git a/dmon/scripts/dmon_heatmapflash.pl b/dmon/scripts/dmon_heatmapflash.pl new file mode 100755 index 0000000..15ef47f --- /dev/null +++ b/dmon/scripts/dmon_heatmapflash.pl @@ -0,0 +1,272 @@ +#!/usr/bin/perl -w + +use warnings; +use strict; +use POSIX qw(strftime ceil floor); +use FileHandle; +use lib "./code"; +use lib "../tools"; +use lib "../users/gsi_dirc"; +use HADES::TrbNet; +use Time::HiRes qw(usleep); +use List::Util qw[min max]; +use Dmon; +# use HPlot; +use Data::Dumper; +# use ChanDb; +use GD::Simple; +use List::Util qw[min max]; + +my %config = Dmon::StartUp(); + +# define the channel mapping for both detectors + +my $chanDb; +my $detector=0; +for my $fpga (0x2020,0x2023) { + print "fpga:$fpga detector:$detector\n"; + my $chan = 1; + for my $i (0..3) { + for my $j (0..7){ + $chanDb->[$detector]->[0]->[$i]->[$j] = { + fpga => $fpga, + chan => $chan + }; + $chan+=2; + } + } + $detector++; +} + +# print Dumper $chanDb; + + + + +my $str = Dmon::MakeTitle(5,7,"HeatmapFlash",0); + $str .= qq@
@; + $str .= Dmon::MakeFooter(); +Dmon::WriteFile("HeatmapFlash",$str); + + +my $old; +my $oldtime = time(); +my $time = time(); +my $diff; + + +my $pmt_rows = 2; +my $pmt_cols = 1; +print "found $pmt_rows pmt rows and $pmt_cols pmt columns\n"; + +my $plot_filename = Dmon::DMONDIR."HeatmapFlash".".png"; + +my $padding_left = 20; +my $padding_top = 40; +my $pixel_size = 20; +my $pmt_spacing = 35; + +# upper limit for high end of color scale +my $max_count_uclamp = $config{HeatmapFlash}->{max_count_uclamp}||100000; +# lower limit for high end of color scale +my $max_count_lclamp = $config{HeatmapFlash}->{max_count_lclamp}||10; +my $gliding_average_steps = $config{HeatmapFlash}->{normalization_inertia}; +my $instantaneous_normalization = $config{HeatmapFlash}->{instant_normalization}; +my $overscale_factor = 1.1; + +my $legend_length = 250; +my $legend_segments = 128; +my $leg_seg_width = ceil($legend_length/$legend_segments); + +my $new_max = 0; +# my $new_min = 0; +my $max_count=0; +my $min_count=0; + + +while (1) { + my $o = trb_register_read_mem(0xfe48,0xc000,0,65); + +# print Dumper $o; + + my $sum = 0; + if (defined $old) { + foreach my $b (keys %$o) { + for my $v (0..65) { + my $tdiff = time() - $oldtime; + my $vdiff = (($o->{$b}->[$v]||0)&0xffffff) - (($old->{$b}->[$v]||0)&0xffffff); + if ($vdiff < 0) { $vdiff += 2**24;} + $diff->{$b}->[$v] = $vdiff/($tdiff|1); + } + } + + if ($instantaneous_normalization) { + $max_count = 0; + for my $pmt_i (0..($pmt_rows-1)) { + for my $pmt_j (0..($pmt_cols-1)) { + my $pmt_lookup = $chanDb->[$pmt_i]->[$pmt_j]; + + for my $px_i (0..3) { + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + my $val = $diff->{$fpga}->[$channel] || 0; + $max_count = max($max_count,$val); + } + } + } + } + $max_count = min($max_count,$max_count_uclamp); + $max_count = max($max_count,$max_count_lclamp); + } else { + $new_max = min($new_max*$overscale_factor,$max_count_uclamp); + # exponential gliding average + $max_count = floor(($max_count*($gliding_average_steps-1) + $new_max)/$gliding_average_steps); + $max_count = max($max_count,$max_count_lclamp); + $new_max = 0; + } + + + my $count_range = $max_count-$min_count; + + + + + my $img = GD::Simple->new(380,480); + my $offset_x; + my $offset_y; + + for my $pmt_i (0..($pmt_rows-1)) { + $offset_y = $padding_top + $pmt_i*($pmt_spacing + 4*$pixel_size); + for my $pmt_j (0..($pmt_cols-1)) { + $offset_x = $padding_left + $pmt_j*($pmt_spacing + 8*$pixel_size); + + my $pmt_lookup = $chanDb->[$pmt_i]->[$pmt_j]; + + my $fpga_addr = $pmt_lookup->[0]->[0]->{fpga}; +# print "FPGA: $fpga_addr\n"; + $img->moveTo($offset_x,$offset_y-8); + $img->string(sprintf("FPGA 0x%x",$fpga_addr)); + + for my $px_i (0..3) { +# print "\n"; + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + + my $val = $diff->{$fpga}->[$channel] || 0; + unless(defined($diff->{$fpga}->[$channel])){ + print STDERR "cannot get data from FPGA ".sprintf("%x",$fpga) + .", channel $channel\n"; + } + + +# print "$val "; + +# if ($px_i == 0 && $px_j == 0) { +# print "\n"; +# $val= 220; +# } + $new_max = max($val,$new_max); +# $new_min = min($val,$new_min); + $sum += $val; + my $val_in_range = min(max($val,$min_count),$max_count)-$min_count; + if(defined($diff->{$fpga}->[$channel])){ + $img->bgcolor(false_color($val_in_range/$count_range)); + } else { + $img->bgcolor('black'); + } + $img->fgcolor('black'); + my $tlx =$offset_x + $px_j*$pixel_size; + my $tly =$offset_y + $px_i*$pixel_size; + my $brx = $tlx + $pixel_size; + my $bry = $tly + $pixel_size; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + } + } + } + } + +# print "new max: $new_max, :new_min: $new_min\n"; + + #now drawing the legend + $offset_x = $padding_left; + $offset_y = $padding_top + $pmt_rows*($pmt_spacing + 4*$pixel_size); + + #calculate relevant decimal power + my $dpwr = floor(log($count_range)/log(10)); + if (($count_range/10**$dpwr)<=1.2) { + $dpwr--; + } + +# print "dpwr: $dpwr\n"; + + my $last_integer=-1; + for my $leg_seg (0..($legend_segments-1)){ + my $val = $leg_seg/$legend_segments*$count_range+$min_count; + my @color = false_color($leg_seg/$legend_segments); + $img->bgcolor(@color); + $img->fgcolor(@color); + my $tlx =$offset_x + $leg_seg*$leg_seg_width; + my $tly =$offset_y; + my $brx = $tlx + $leg_seg_width; + my $bry = $tly + 10; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + + #distribute nice numbers along the rainbow + my $cur_integer = floor($val/(10**$dpwr)); + if ($cur_integer != $last_integer) { +# unless($leg_seg % $legend_stepping) { + $img->moveTo($tlx,$tly-8); + $img->fgcolor('black'); + $img->string(kilomega($cur_integer*10**$dpwr)); + } + $last_integer=$cur_integer; + } + + $offset_x = $padding_left; + $offset_y += 30; + $img->moveTo($offset_x,$offset_y); + $img->fgcolor('black'); + $img->string(strftime("%H:%M:%S", localtime())); + + open my $out, '>', $plot_filename or die; + binmode $out; + print $out $img->png; + } + my $status = Dmon::OK; + my $title = "Flash Heatmap"; + my $value = Dmon::SciNotation($sum); + my $longtext = "See plot"; + Dmon::WriteQALog($config{flog},"heatmapflash",5,$status,$title,$value,$longtext,'1-HeatmapFlash'); + $old = $o; + $oldtime = time(); + sleep(1); +} + +sub false_color { + my $val = $_[0]; # has to be normalized + my $hue = 170*(1-$val); + return GD::Simple->HSVtoRGB($hue,255,255); +} +sub kilomega { + my $val = $_[0]; + my $num; + if($val/1e9 >= 1){ + my $a = sprintf("%1.1fG",$val/1e9); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e6 >= 1){ + my $a = sprintf("%1.1fM",$val/1e6); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e3 >= 1){ + my $a = sprintf("%1.1fk",$val/1e3); + $a =~ s/\.0//; + return $a; + } else { + return sprintf("%d",$val); + } +} diff --git a/dmon/scripts/dmon_numfee.pl b/dmon/scripts/dmon_numfee.pl index 50c8151..26f7179 100755 --- a/dmon/scripts/dmon_numfee.pl +++ b/dmon/scripts/dmon_numfee.pl @@ -21,6 +21,18 @@ while(1) { my $status = Dmon::GetQAState('above',$num,($config{NumberOfFpga},$config{NumberOfFpga}-1,$config{NumberOfFpga}-2)); + foreach my $b (@{$config{'PadiwaTrbAddresses'}}) { + if(! defined $r->{$b}) {$longtext .= sprintf(", 0x%04x",$b);} + } + foreach my $b (@{$config{'HubTrbAddresses'}}) { + if(! defined $r->{$b}) {$longtext .= sprintf(", 0x%04x",$b);} + } + foreach my $b (@{$config{'OtherTrbAddresses'}}) { + if(! defined $r->{$b}) {$longtext .= sprintf(", 0x%04x",$b);} + } + + + Dmon::WriteQALog($flog,"numfee",20,$status,$title,$value,$longtext); sleep(10); diff --git a/dmon/scripts/dmon_padiwatemp.pl b/dmon/scripts/dmon_padiwatemp.pl index 8166ff7..c8a196d 100755 --- a/dmon/scripts/dmon_padiwatemp.pl +++ b/dmon/scripts/dmon_padiwatemp.pl @@ -10,10 +10,18 @@ use Data::Dumper; my %config = Dmon::StartUp(); +my $PadiwaNumber = 0; +foreach my $b (@{$config{PadiwaChainMask}}) { + $PadiwaNumber++ if($b & 0x1); + $PadiwaNumber++ if($b & 0x2); + $PadiwaNumber++ if($b & 0x4); + $PadiwaNumber++ if($b & 0x8); + } + HPlot::PlotInit({ name => "PadiwaTemp", file => Dmon::DMONDIR."PadiwaTemp", - entries => scalar @{$config{PadiwaTrbAdresses}}, + entries => $PadiwaNumber, type => HPlot::TYPE_HISTORY, output => HPlot::OUT_PNG, xlabel => "Board", @@ -38,42 +46,56 @@ while(1) { my $i = -1; my $notonline = ""; my $notonlinecnt = 0; - - foreach my $b (@{$config{PadiwaTrbAdresses}}) { - $i++; - my $r = Dmon::PadiwaSendCmd(0x10040000,$b,0); - unless (defined $r) { - $notonline .= sprintf(" %04x",$b); - $notonlinecnt++; - next; - } - my $temp = (($r->{$b} & 0xFFF))/16; - unless ($temp < 10 || $temp > 90) { - if ($max < $temp) { - $max = $temp; - $maxboard = $b; +# Dmon::PadiwaSendCmd(0x10800001,$config{PadiwaBroadcastAddress},0); +# Dmon::PadiwaSendCmd(0x10800001,$config{PadiwaBroadcastAddress},1); +# Dmon::PadiwaSendCmd(0x10800001,$config{PadiwaBroadcastAddress},2); +# Dmon::PadiwaSendCmd(0x10800000,$config{PadiwaBroadcastAddress},0); +# Dmon::PadiwaSendCmd(0x10800000,$config{PadiwaBroadcastAddress},1); +# Dmon::PadiwaSendCmd(0x10800000,$config{PadiwaBroadcastAddress},2); +# sleep(2); + foreach(my $in = 0; $in < scalar @{$config{PadiwaTrbAddresses}}; $in++) { + my $b = $config{PadiwaTrbAddresses}[$in]; + foreach my $chain (0..3) { + next unless ($config{PadiwaChainMask}->[$in]&(1<<$chain)); + $i++; + my $r = Dmon::PadiwaSendCmd(0x10040000,$b,$chain); + unless (defined $r) { + $notonline .= sprintf(" %04x",$b.'.'.$chain); + $notonlinecnt++; + next; } - if ($min > $temp) { - $min = $temp; - $minboard = $b; + my $temp = (($r->{$b} & 0xFFF))/16; + unless ($temp < 10 || $temp > 90) { + if ($max < $temp) { + $max = $temp; + $maxboard = $b.'.'.$chain; + } + if ($min > $temp) { + $min = $temp; + $minboard = $b.'.'.$chain; + } + HPlot::PlotFill('PadiwaTemp',$temp,$i); + } + else { + my $t = Dmon::PadiwaSendCmd(0x10010000,$b,$chain); + HPlot::PlotFill('PadiwaTemp',10,$i); + #print Dumper $t; + if(($t & 0xFF) != 0x28) { + $notonline .= sprintf(" %04x.%1i",$b,$chain); + $notonlinecnt++; + } } - HPlot::PlotFill('PadiwaTemp',$temp,$i); } - else { - HPlot::PlotFill('PadiwaTemp',10,$i); - $notonline .= sprintf(" %04x",$b); - $notonlinecnt++; - } } my $title = "Temperature"; my $value = sprintf("%.1f",$max); my $longtext = sprintf("Maximum: %.1f on board 0x%04x
Minimum: %.1f on board 0x%04x",$max,$maxboard,$min,$minboard); - my $status = Dmon::GetQAState('below',$max,(50,60,70)); + my $status = Dmon::GetQAState('below',$max,(65,70,75)); Dmon::WriteQALog($config{flog},"padiwatemp",30,$status,$title,$value,$longtext,"10-PadiwaTemp"); $title = "Online"; - $value = sprintf("%i / %i",(scalar @{$config{PadiwaTrbAdresses}})-$notonlinecnt,scalar @{$config{PadiwaTrbAdresses}}); + $value = sprintf("%i / %i",$PadiwaNumber-$notonlinecnt,$PadiwaNumber); $longtext = "Boards not reacting:".$notonline; $status = Dmon::GetQAState('below',$notonlinecnt,(0,1,4)); Dmon::WriteQALog($config{flog},"padiwaonline",30,$status,$title,$value,$longtext,"10-PadiwaOnline"); diff --git a/dmon/scripts/dmon_trgerrors.pl b/dmon/scripts/dmon_trgerrors.pl new file mode 100755 index 0000000..50c6d40 --- /dev/null +++ b/dmon/scripts/dmon_trgerrors.pl @@ -0,0 +1,47 @@ +#!/usr/bin/perl -w + +use warnings; +use POSIX qw(strftime); +use FileHandle; +use HADES::TrbNet; +use Time::HiRes qw(usleep); +use Dmon; +use Data::Dumper; + + +my %config = Dmon::StartUp(); + +my $curr, my $old; + + +while(1) { + my $errors = 0; + my $sig1 = trb_register_read(0xffff,0x6); + my $sig2 = trb_register_read(0xffff,0x7); + my $diff; + + if(defined $old) { + foreach my $b (keys $sig1) { + $curr->[0]->{$b} = ($sig1->{$b} & 0xffff); + $curr->[1]->{$b} = (($sig1->{$b}>>16) & 0xffff); + $curr->[2]->{$b} = ($sig2->{$b} & 0xffff); + $curr->[3]->{$b} = (($sig2->{$b}>>16) & 0xffff); + + $errors += $curr->[0]->{$b} - $old->[0]->{$b}; + $errors += $curr->[1]->{$b} - $old->[1]->{$b}; + $errors += $curr->[2]->{$b} - $old->[2]->{$b}; + $errors += $curr->[3]->{$b} - $old->[3]->{$b}; + + } + } + + + + my $longtext = "Number of errors with trigger reported: ".$errors; + my $status = Dmon::GetQAState('below',$errors,(0,10,20)); + my $title = "Trg Errors"; + Dmon::WriteQALog($config{flog},"trgerrors",10,$status,$title,$errors,$longtext); + + $old = $curr; + sleep 1; + } diff --git a/thresholds/thresholds_automatic.pl b/thresholds/thresholds_automatic.pl index 0775a31..58bcb47 100755 --- a/thresholds/thresholds_automatic.pl +++ b/thresholds/thresholds_automatic.pl @@ -30,7 +30,7 @@ my $USE_LOCK = 0; my $hitregister = 0xc001; -my @valid_interval = (0x8000, 0x9000); +my @valid_interval = (0x5000, 0xc000); my $interval_step = ($valid_interval[1] - $valid_interval[0])/2; my $start_value = int ( ($valid_interval[1] + $valid_interval[0])/2 ); diff --git a/thresholds/thresholds_automatic_jan.pl b/thresholds/thresholds_automatic_jan.pl index 5bee92f..087e7d8 100755 --- a/thresholds/thresholds_automatic_jan.pl +++ b/thresholds/thresholds_automatic_jan.pl @@ -227,7 +227,7 @@ foreach my $i (reverse (0..3)) { my $str; -$logger_data->info("\t".time); +# $logger_data->info("\t".time); foreach my $i (0..15) { $logger_data->info(sprintf "endpoint: 0x%04x, chain: %02d, channel: %2d threshold: 0x%04x, uid: %s", $endpoint, $chain, $i, $best_thresh[$i]||$current_thresh[$i], $uid ); } diff --git a/thresholds/thresholds_compare_dirc.pl b/thresholds/thresholds_compare_dirc.pl new file mode 100755 index 0000000..e5d5db4 --- /dev/null +++ b/thresholds/thresholds_compare_dirc.pl @@ -0,0 +1,376 @@ +#!/usr/bin/perl -w + +use lib "../perllibs/"; + +use warnings; +use strict; +use POSIX qw(strftime floor ceil); +use FileHandle; +use HPlot; +use Data::Dumper; +# use ChannelMapping; +use lib "../dmon/scripts/"; +use ChanDb; +use List::Util qw[min max]; +use GD::Simple; + +my $fn1 = $ARGV[0]; + +die(" +usage: thresholds_compare.pl file1 [file2|'-'] [range_L] [range_U] +omit file2 (by writing a '-') to get abs value, include for file1-file2 +unless range_L and range_U values are set, the color scale +will be adjusted automatically +") if (not(defined($fn1)) or ($fn1 eq "--help")); + +my $fn2; +$fn2 = $ARGV[1] unless ($ARGV[1] eq "-"); +my $range_l = $ARGV[2]; +my $range_u = $ARGV[3]; + + + +# my $plot2 = (); +# $plot2->{name} = "HeatmapRich"; +# $plot2->{file} = "thresh_heatmap"; +# $plot2->{entries} = $ChannelMapping::chanmap->{xsize}+1; +# $plot2->{curves} = $ChannelMapping::chanmap->{ysize}+1; +# $plot2->{type} = HPlot::TYPE_HEATMAP; +# $plot2->{output} = HPlot::OUT_PNG; +# $plot2->{zlabel} = "Hitrate"; +# $plot2->{sizex} = 700; +# $plot2->{sizey} = 650; +# $plot2->{nokey} = 1; +# $plot2->{buffer} = 0; +# $plot2->{xmin} = 0.5; +# $plot2->{xmax} = $ChannelMapping::chanmap->{xsize}+0.5; +# $plot2->{ymin} = 0.5; +# $plot2->{ymax} = $ChannelMapping::chanmap->{ysize}+0.5; +# $plot2->{cbmin} = "-400<*" if $fn2; +# $plot2->{cbmax} = "*<" . ($fn2 ? '400' : '45000'); +# $plot2->{showvalues} = 0; +# $plot2->{xlabel} = "column"; +# $plot2->{ylabel} = "row"; +# $plot2->{addCmd} = "set lmargin at screen 0.07\nset rmargin at screen 0.85\nset bmargin at screen 0.07\nset tmargin at screen 0.95";# . ($fn2 ? "": "\n set logscale cb"); +# $plot2->{palette} = "defined ( 0 0 0 1, 0.5 1 1 1, 1 1 0 0 )" if $fn2; +# +# HPlot::PlotInit($plot2); + +sub readSettings { + my $fn = shift; + open(my $fh, $fn) || die "could not open file '$fn'"; + my @f = <$fh>; + close $fh; + + my %thresholds = (); + my $count=0; + foreach my $cl (@f) { + (my $ep, my $chain, my $channel, my $thresh, my $uid) = + $cl =~ /endpoint:\s+(\w+), chain:\s+(\d+), channel:\s+(\d+) threshold:\s+(\w+), uid: (\w+)/; + next unless defined $ep; + $thresholds{hex($ep) .":". (int($channel)+ 16* int($chain)+1 )} = hex $thresh; + } + + return %thresholds; +} + +# load files + +# my $totalsize = ($ChannelMapping::chanmap->{xsize}*$ChannelMapping::chanmap->{ysize}); + my %threshs1 = readSettings($fn1); +# print "WARNING: Expected ".$totalsize." settings in $fn1. Got " . scalar(keys %threshs1) unless scalar(keys %threshs1) == $totalsize; + + my %threshs2 = (); + if ($fn2) { + %threshs2 = readSettings($fn2); +# print "WARNING: Expected ".$totalsize." settings in $fn2. Got " . scalar(keys %threshs2) unless scalar(keys %threshs2) == $totalsize; + } else { + for my $key (keys %threshs1) { + $threshs2{$key} = 0; + } +# $fn2 = 'n/a'; + } + + +# # plot heatmap w/ HPLOT +# # plot heatmap +# for my $x (1..$ChannelMapping::chanmap->{xsize}) { +# for my $y (1..$ChannelMapping::chanmap->{ysize}) { +# my $fpga = $ChannelMapping::chanmap->{fpga}->[$x]->[$y]; +# my $channel = ($ChannelMapping::chanmap->{chan}->[$x]->[$y]-1)/2; +# +# unless (defined $threshs1{$fpga.":".$channel}) { +# printf("endpoint 0x%04x, channel %d (%d:%d) not found in $fn1", $fpga, $channel, $fpga, $channel); +# next; +# } +# +# my $value = $threshs1{$fpga.":".$channel}; +# if ($fn2) { +# if (defined $threshs2{$fpga.":".$channel}) { +# $value -= $threshs2{$fpga.":".$channel}; +# } else { +# printf("endpoint 0x%04x, channel %d (%d:%d) not found in $fn2", $fpga, $channel, $fpga, $channel); +# } +# } +# +# HPlot::PlotFill('HeatmapRich',$value,$x,$y); +# } +# } +# HPlot::PlotDraw('HeatmapRich'); +# +# # end of plot heatmap w/ HPLOT + +# plot heatmap with GD + +my $pmt_rows = @{$ChanDb::chanDb}; +my $pmt_cols = @{$ChanDb::chanDb->[0]}; +print "found $pmt_rows pmt rows and $pmt_cols pmt columns\n"; + +my $plot_filename = "./thresh_heatmap.png"; + +my $padding_left = 20; +my $padding_top = 40; +my $pixel_size = 10; +my $pmt_spacing_x = 40; +my $pmt_spacing_y = 35; + +my $legend_length = 500; +my $legend_segments = 256; +my $leg_seg_width = ceil($legend_length/$legend_segments); + +my $max_count=0; +my $min_count=0; + +my $symmetric_scale=0; + + +# find max counts + for my $pmt_i (0..($pmt_rows-1)) { + for my $pmt_j (0..($pmt_cols-1)) { + my $pmt_lookup = $ChanDb::chanDb->[$pmt_i]->[$pmt_j]; + for my $px_i (0..7) { + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + my $val = $threshs1{$fpga.":".$channel}||0; + if ($fn2) { + if (defined $threshs2{$fpga.":".$channel}) { + $val -= $threshs2{$fpga.":".$channel}; + } else { + printf("endpoint 0x%04x, channel %d (%d:%d) not found in $fn2\n", $fpga, $channel, $fpga, $channel); + } + } + $max_count = max($max_count,$val); + $min_count = min($min_count,$val); + } + } + } + } + + if ($min_count < 0){ + $symmetric_scale = 1; + } + if ($symmetric_scale) { + my $max_amplitude = max(abs($max_count),abs($min_count)); + $min_count = -$max_amplitude; + $max_count = $max_amplitude; + } + + $min_count = $range_l if (defined($range_l)); + $max_count = $range_u if (defined($range_u)); + + + my $count_range = $max_count-$min_count; + + my $img = GD::Simple->new(640,480); + my $offset_x; + my $offset_y; + + for my $pmt_i (0..($pmt_rows-1)) { + $offset_y = $padding_top + $pmt_i*($pmt_spacing_y + 8*$pixel_size); + for my $pmt_j (0..($pmt_cols-1)) { + $offset_x = $padding_left + $pmt_j*($pmt_spacing_x + 8*$pixel_size); + + my $pmt_lookup = $ChanDb::chanDb->[$pmt_i]->[$pmt_j]; + + my $mcp_id = $pmt_lookup->[0]->[0]->{mcp}; + $img->moveTo($offset_x,$offset_y-10); + $img->string($mcp_id); + + for my $px_i (0..7) { +# print "\n"; + for my $px_j (0..7) { + my $pixel_info = $pmt_lookup->[$px_i]->[$px_j]; + my $fpga = $pixel_info->{fpga}; + my $channel = $pixel_info->{chan}; + + + my $val = $threshs1{$fpga.":".$channel}; + if ($fn2) { + if (defined $threshs2{$fpga.":".$channel}) { + $val -= $threshs2{$fpga.":".$channel}; + } else { + printf("endpoint 0x%04x, channel %d (%d:%d) not found in $fn2\n", $fpga, $channel, $fpga, $channel); + } + } + my $val_in_range = min(max($val,$min_count),$max_count)-$min_count; + if(defined($val)){ + $img->bgcolor(false_color($val_in_range/$count_range)); + } else { + $img->bgcolor('black'); + } + $img->fgcolor('black'); + my $tlx =$offset_x + $px_j*$pixel_size; + my $tly =$offset_y + $px_i*$pixel_size; + my $brx = $tlx + $pixel_size; + my $bry = $tly + $pixel_size; + $img->rectangle($tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + } + } + } + } + +# print "new max: $new_max, :new_min: $new_min\n"; + + #now drawing the legend + $offset_x = $padding_left; + $offset_y = $padding_top + $pmt_rows*($pmt_spacing_y + 8*$pixel_size); + + #calculate relevant decimal power + my $dpwr = floor(log($count_range)/log(10)); + if (($count_range/10**$dpwr)<=2) { + $dpwr--; + } + +# print "dpwr: $dpwr\n"; + + my $last_integer=undef; + for my $leg_seg (0..($legend_segments-1)){ + my $val = $leg_seg/$legend_segments*$count_range+$min_count; + my @color = false_color($leg_seg/$legend_segments); + $img->bgcolor(@color); + $img->fgcolor(@color); + my $tlx =$offset_x + $leg_seg*$leg_seg_width; + my $tly =$offset_y; + my $brx = $tlx + $leg_seg_width; + my $bry = $tly + $pixel_size; + $img->rectangle( $tlx,$tly,$brx,$bry); # (top_left_x, top_left_y, bottom_right_x, bottom_right_y) + + #distribute nice numbers along the rainbow + my $cur_integer = floor($val/(10**$dpwr)); + if (defined($last_integer) and ($cur_integer != $last_integer)) { +# unless($leg_seg % $legend_stepping) { + $img->moveTo($tlx,$tly-8); + $img->fgcolor('black'); + $img->string(kilomega($cur_integer*10**$dpwr)); + $img->moveTo($tlx,$tly-4); + $img->lineTo($tlx,$tly-8); + } + $last_integer=$cur_integer; + } + + + # print file name + $offset_x = $padding_left; + $offset_y += 25; + $img->moveTo($offset_x,$offset_y); + $img->fgcolor('black'); + $img->string(strftime("%H:%M:%S", localtime())); + $offset_y += 20; + $offset_x += 10; + $img->moveTo($offset_x,$offset_y); + $img->string($fn1); + if(defined($fn2)){ + $offset_y += 12; + $offset_x = $padding_left; + $img->moveTo($offset_x,$offset_y); + $img->string("-"); + $offset_x += 10; + $img->moveTo($offset_x,$offset_y); + $img->string($fn2); + } + + + open my $out, '>', $plot_filename or die; + binmode $out; + print $out $img->png; +# end of plot heatmap with GD + + +# plot histogram + my @values = (); + + open DATA, ">", "/tmp/thresh_diff.dat"; + for my $key (keys %threshs1) { + print DATA $threshs1{$key} . " " . $threshs2{$key} . "\n"; + push @values, $threshs1{$key}; + push @values, $threshs2{$key}; + } + close DATA; + + @values = sort @values; + + my $min = $values[int($#values * 0.02)]; + my $max = $values[int($#values * 0.92)]; + my $range = $max-$min; + + $min -= $range * 0.1; + $max += $range * 0.1; + + + open GNUPLOT, '|gnuplot'; + print GNUPLOT <HSVtoRGB($hue,255,255); +} + + +sub kilomega { + my $val = $_[0]; + my $num; + if($val/1e9 >= 1){ + my $a = sprintf("%1.1fG",$val/1e9); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e6 >= 1){ + my $a = sprintf("%1.1fM",$val/1e6); + $a =~ s/\.0//; + return $a; + } elsif ($val/1e3 >= 1){ + my $a = sprintf("%1.1fk",$val/1e3); + $a =~ s/\.0//; + return $a; + } else { + return sprintf("%d",$val); + } +} \ No newline at end of file diff --git a/tools/padiwa.pl b/tools/padiwa.pl index e9fccf9..2e60bc8 100755 --- a/tools/padiwa.pl +++ b/tools/padiwa.pl @@ -5,6 +5,8 @@ use Time::HiRes qw( usleep ); use Data::Dumper; use HADES::TrbNet; use Date::Format; +use Dmon; + if(!defined $ENV{'DAQOPSERVER'}) { die "DAQOPSERVER not set in environment"; @@ -73,12 +75,13 @@ sub sendcmd16 { sub sendcmd { my ($cmd) = @_; - my $c = [$cmd,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1<<$chain,1]; - trb_register_write_mem($board,0xd400,0,$c,scalar @{$c}); + return Dmon::PadiwaSendCmd($cmd,$board,$chain); +# my $c = [$cmd,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1<<$chain,1]; +# trb_register_write_mem($board,0xd400,0,$c,scalar @{$c}); # trb_register_write($board,0xd410,1<<$chain) or die "trb_register_write: ", trb_strerror(); # trb_register_write($board,0xd411,1); - usleep(1000); - return trb_register_read($board,0xd412); +# usleep(1000); +# return trb_register_read($board,0xd412); } diff --git a/users/gsi_dirc/ChannelMapping.pm b/users/gsi_dirc/ChannelMapping.pm new file mode 100644 index 0000000..755a4e3 --- /dev/null +++ b/users/gsi_dirc/ChannelMapping.pm @@ -0,0 +1,2064 @@ + + +package ChannelMapping; +use warnings; +use strict; + +our $chanmap; +$chanmap->{xsize} = 40; +$chanmap->{ysize} = 24; + +$chanmap->{fpga}->[0]->[0]=0x2003; +$chanmap->{chan}->[0]->[0]=48; +$chanmap->{fpga}->[0]->[1]=0x2003; +$chanmap->{chan}->[0]->[1]=46; +$chanmap->{fpga}->[0]->[2]=0x2003; +$chanmap->{chan}->[0]->[2]=44; +$chanmap->{fpga}->[0]->[3]=0x2003; +$chanmap->{chan}->[0]->[3]=42; +$chanmap->{fpga}->[0]->[4]=0x2003; +$chanmap->{chan}->[0]->[4]=40; +$chanmap->{fpga}->[0]->[5]=0x2003; +$chanmap->{chan}->[0]->[5]=38; +$chanmap->{fpga}->[0]->[6]=0x2003; +$chanmap->{chan}->[0]->[6]=36; +$chanmap->{fpga}->[0]->[7]=0x2003; +$chanmap->{chan}->[0]->[7]=34; + +$chanmap->{fpga}->[1]->[0]=0x2003; +$chanmap->{chan}->[1]->[0]=47; +$chanmap->{fpga}->[1]->[1]=0x2003; +$chanmap->{chan}->[1]->[1]=45; +$chanmap->{fpga}->[1]->[2]=0x2003; +$chanmap->{chan}->[1]->[2]=43; +$chanmap->{fpga}->[1]->[3]=0x2003; +$chanmap->{chan}->[1]->[3]=41; +$chanmap->{fpga}->[1]->[4]=0x2003; +$chanmap->{chan}->[1]->[4]=39; +$chanmap->{fpga}->[1]->[5]=0x2003; +$chanmap->{chan}->[1]->[5]=37; +$chanmap->{fpga}->[1]->[6]=0x2003; +$chanmap->{chan}->[1]->[6]=35; +$chanmap->{fpga}->[1]->[7]=0x2003; +$chanmap->{chan}->[1]->[7]=33; + +$chanmap->{fpga}->[2]->[0]=0x2003; +$chanmap->{chan}->[2]->[0]=32; +$chanmap->{fpga}->[2]->[1]=0x2003; +$chanmap->{chan}->[2]->[1]=30; +$chanmap->{fpga}->[2]->[2]=0x2003; +$chanmap->{chan}->[2]->[2]=28; +$chanmap->{fpga}->[2]->[3]=0x2003; +$chanmap->{chan}->[2]->[3]=26; +$chanmap->{fpga}->[2]->[4]=0x2003; +$chanmap->{chan}->[2]->[4]=24; +$chanmap->{fpga}->[2]->[5]=0x2003; +$chanmap->{chan}->[2]->[5]=22; +$chanmap->{fpga}->[2]->[6]=0x2003; +$chanmap->{chan}->[2]->[6]=20; +$chanmap->{fpga}->[2]->[7]=0x2003; +$chanmap->{chan}->[2]->[7]=18; + +$chanmap->{fpga}->[3]->[0]=0x2003; +$chanmap->{chan}->[3]->[0]=31; +$chanmap->{fpga}->[3]->[1]=0x2003; +$chanmap->{chan}->[3]->[1]=29; +$chanmap->{fpga}->[3]->[2]=0x2003; +$chanmap->{chan}->[3]->[2]=27; +$chanmap->{fpga}->[3]->[3]=0x2003; +$chanmap->{chan}->[3]->[3]=25; +$chanmap->{fpga}->[3]->[4]=0x2003; +$chanmap->{chan}->[3]->[4]=23; +$chanmap->{fpga}->[3]->[5]=0x2003; +$chanmap->{chan}->[3]->[5]=21; +$chanmap->{fpga}->[3]->[6]=0x2003; +$chanmap->{chan}->[3]->[6]=19; +$chanmap->{fpga}->[3]->[7]=0x2003; +$chanmap->{chan}->[3]->[7]=17; + +$chanmap->{fpga}->[4]->[0]=0x2003; +$chanmap->{chan}->[4]->[0]=16; +$chanmap->{fpga}->[4]->[1]=0x2003; +$chanmap->{chan}->[4]->[1]=14; +$chanmap->{fpga}->[4]->[2]=0x2003; +$chanmap->{chan}->[4]->[2]=12; +$chanmap->{fpga}->[4]->[3]=0x2003; +$chanmap->{chan}->[4]->[3]=10; +$chanmap->{fpga}->[4]->[4]=0x2003; +$chanmap->{chan}->[4]->[4]=8; +$chanmap->{fpga}->[4]->[5]=0x2003; +$chanmap->{chan}->[4]->[5]=6; +$chanmap->{fpga}->[4]->[6]=0x2003; +$chanmap->{chan}->[4]->[6]=4; +$chanmap->{fpga}->[4]->[7]=0x2003; +$chanmap->{chan}->[4]->[7]=2; + +$chanmap->{fpga}->[5]->[0]=0x2003; +$chanmap->{chan}->[5]->[0]=15; +$chanmap->{fpga}->[5]->[1]=0x2003; +$chanmap->{chan}->[5]->[1]=13; +$chanmap->{fpga}->[5]->[2]=0x2003; +$chanmap->{chan}->[5]->[2]=11; +$chanmap->{fpga}->[5]->[3]=0x2003; +$chanmap->{chan}->[5]->[3]=9; +$chanmap->{fpga}->[5]->[4]=0x2003; +$chanmap->{chan}->[5]->[4]=7; +$chanmap->{fpga}->[5]->[5]=0x2003; +$chanmap->{chan}->[5]->[5]=5; +$chanmap->{fpga}->[5]->[6]=0x2003; +$chanmap->{chan}->[5]->[6]=3; +$chanmap->{fpga}->[5]->[7]=0x2003; +$chanmap->{chan}->[5]->[7]=1; + +$chanmap->{fpga}->[6]->[0]=0x2002; +$chanmap->{chan}->[6]->[0]=48; +$chanmap->{fpga}->[6]->[1]=0x2002; +$chanmap->{chan}->[6]->[1]=46; +$chanmap->{fpga}->[6]->[2]=0x2002; +$chanmap->{chan}->[6]->[2]=44; +$chanmap->{fpga}->[6]->[3]=0x2002; +$chanmap->{chan}->[6]->[3]=42; +$chanmap->{fpga}->[6]->[4]=0x2002; +$chanmap->{chan}->[6]->[4]=40; +$chanmap->{fpga}->[6]->[5]=0x2002; +$chanmap->{chan}->[6]->[5]=38; +$chanmap->{fpga}->[6]->[6]=0x2002; +$chanmap->{chan}->[6]->[6]=36; +$chanmap->{fpga}->[6]->[7]=0x2002; +$chanmap->{chan}->[6]->[7]=34; + +$chanmap->{fpga}->[7]->[0]=0x2002; +$chanmap->{chan}->[7]->[0]=47; +$chanmap->{fpga}->[7]->[1]=0x2002; +$chanmap->{chan}->[7]->[1]=45; +$chanmap->{fpga}->[7]->[2]=0x2002; +$chanmap->{chan}->[7]->[2]=43; +$chanmap->{fpga}->[7]->[3]=0x2002; +$chanmap->{chan}->[7]->[3]=41; +$chanmap->{fpga}->[7]->[4]=0x2002; +$chanmap->{chan}->[7]->[4]=39; +$chanmap->{fpga}->[7]->[5]=0x2002; +$chanmap->{chan}->[7]->[5]=37; +$chanmap->{fpga}->[7]->[6]=0x2002; +$chanmap->{chan}->[7]->[6]=35; +$chanmap->{fpga}->[7]->[7]=0x2002; +$chanmap->{chan}->[7]->[7]=33; + + +$chanmap->{fpga}->[8]->[0]=0x2002; +$chanmap->{chan}->[8]->[0]=32; +$chanmap->{fpga}->[8]->[1]=0x2002; +$chanmap->{chan}->[8]->[1]=30; +$chanmap->{fpga}->[8]->[2]=0x2002; +$chanmap->{chan}->[8]->[2]=28; +$chanmap->{fpga}->[8]->[3]=0x2002; +$chanmap->{chan}->[8]->[3]=26; +$chanmap->{fpga}->[8]->[4]=0x2002; +$chanmap->{chan}->[8]->[4]=24; +$chanmap->{fpga}->[8]->[5]=0x2002; +$chanmap->{chan}->[8]->[5]=22; +$chanmap->{fpga}->[8]->[6]=0x2002; +$chanmap->{chan}->[8]->[6]=20; +$chanmap->{fpga}->[8]->[7]=0x2002; +$chanmap->{chan}->[8]->[7]=18; + +$chanmap->{fpga}->[9]->[0]=0x2002; +$chanmap->{chan}->[9]->[0]=31; +$chanmap->{fpga}->[9]->[1]=0x2002; +$chanmap->{chan}->[9]->[1]=29; +$chanmap->{fpga}->[9]->[2]=0x2002; +$chanmap->{chan}->[9]->[2]=27; +$chanmap->{fpga}->[9]->[3]=0x2002; +$chanmap->{chan}->[9]->[3]=25; +$chanmap->{fpga}->[9]->[4]=0x2002; +$chanmap->{chan}->[9]->[4]=23; +$chanmap->{fpga}->[9]->[5]=0x2002; +$chanmap->{chan}->[9]->[5]=21; +$chanmap->{fpga}->[9]->[6]=0x2002; +$chanmap->{chan}->[9]->[6]=19; +$chanmap->{fpga}->[9]->[7]=0x2002; +$chanmap->{chan}->[9]->[7]=17; + +$chanmap->{fpga}->[10]->[0]=0x2002; +$chanmap->{chan}->[10]->[0]=16; +$chanmap->{fpga}->[10]->[1]=0x2002; +$chanmap->{chan}->[10]->[1]=14; +$chanmap->{fpga}->[10]->[2]=0x2002; +$chanmap->{chan}->[10]->[2]=12; +$chanmap->{fpga}->[10]->[3]=0x2002; +$chanmap->{chan}->[10]->[3]=10; +$chanmap->{fpga}->[10]->[4]=0x2002; +$chanmap->{chan}->[10]->[4]=8; +$chanmap->{fpga}->[10]->[5]=0x2002; +$chanmap->{chan}->[10]->[5]=6; +$chanmap->{fpga}->[10]->[6]=0x2002; +$chanmap->{chan}->[10]->[6]=4; +$chanmap->{fpga}->[10]->[7]=0x2002; +$chanmap->{chan}->[10]->[7]=2; + +$chanmap->{fpga}->[11]->[0]=0x2002; +$chanmap->{chan}->[11]->[0]=15; +$chanmap->{fpga}->[11]->[1]=0x2002; +$chanmap->{chan}->[11]->[1]=13; +$chanmap->{fpga}->[11]->[2]=0x2002; +$chanmap->{chan}->[11]->[2]=11; +$chanmap->{fpga}->[11]->[3]=0x2002; +$chanmap->{chan}->[11]->[3]=9; +$chanmap->{fpga}->[11]->[4]=0x2002; +$chanmap->{chan}->[11]->[4]=7; +$chanmap->{fpga}->[11]->[5]=0x2002; +$chanmap->{chan}->[11]->[5]=5; +$chanmap->{fpga}->[11]->[6]=0x2002; +$chanmap->{chan}->[11]->[6]=3; +$chanmap->{fpga}->[11]->[7]=0x2002; +$chanmap->{chan}->[11]->[7]=1; + +$chanmap->{fpga}->[12]->[0]=0x2001; +$chanmap->{chan}->[12]->[0]=48; +$chanmap->{fpga}->[12]->[1]=0x2001; +$chanmap->{chan}->[12]->[1]=46; +$chanmap->{fpga}->[12]->[2]=0x2001; +$chanmap->{chan}->[12]->[2]=44; +$chanmap->{fpga}->[12]->[3]=0x2001; +$chanmap->{chan}->[12]->[3]=42; +$chanmap->{fpga}->[12]->[4]=0x2001; +$chanmap->{chan}->[12]->[4]=40; +$chanmap->{fpga}->[12]->[5]=0x2001; +$chanmap->{chan}->[12]->[5]=38; +$chanmap->{fpga}->[12]->[6]=0x2001; +$chanmap->{chan}->[12]->[6]=36; +$chanmap->{fpga}->[12]->[7]=0x2001; +$chanmap->{chan}->[12]->[7]=34; + +$chanmap->{fpga}->[13]->[0]=0x2001; +$chanmap->{chan}->[13]->[0]=47; +$chanmap->{fpga}->[13]->[1]=0x2001; +$chanmap->{chan}->[13]->[1]=45; +$chanmap->{fpga}->[13]->[2]=0x2001; +$chanmap->{chan}->[13]->[2]=43; +$chanmap->{fpga}->[13]->[3]=0x2001; +$chanmap->{chan}->[13]->[3]=41; +$chanmap->{fpga}->[13]->[4]=0x2001; +$chanmap->{chan}->[13]->[4]=39; +$chanmap->{fpga}->[13]->[5]=0x2001; +$chanmap->{chan}->[13]->[5]=37; +$chanmap->{fpga}->[13]->[6]=0x2001; +$chanmap->{chan}->[13]->[6]=35; +$chanmap->{fpga}->[13]->[7]=0x2001; +$chanmap->{chan}->[13]->[7]=33; + +$chanmap->{fpga}->[14]->[0]=0x2001; +$chanmap->{chan}->[14]->[0]=32; +$chanmap->{fpga}->[14]->[1]=0x2001; +$chanmap->{chan}->[14]->[1]=30; +$chanmap->{fpga}->[14]->[2]=0x2001; +$chanmap->{chan}->[14]->[2]=28; +$chanmap->{fpga}->[14]->[3]=0x2001; +$chanmap->{chan}->[14]->[3]=26; +$chanmap->{fpga}->[14]->[4]=0x2001; +$chanmap->{chan}->[14]->[4]=24; +$chanmap->{fpga}->[14]->[5]=0x2001; +$chanmap->{chan}->[14]->[5]=22; +$chanmap->{fpga}->[14]->[6]=0x2001; +$chanmap->{chan}->[14]->[6]=20; +$chanmap->{fpga}->[14]->[7]=0x2001; +$chanmap->{chan}->[14]->[7]=18; + +$chanmap->{fpga}->[15]->[0]=0x2001; +$chanmap->{chan}->[15]->[0]=31; +$chanmap->{fpga}->[15]->[1]=0x2001; +$chanmap->{chan}->[15]->[1]=29; +$chanmap->{fpga}->[15]->[2]=0x2001; +$chanmap->{chan}->[15]->[2]=27; +$chanmap->{fpga}->[15]->[3]=0x2001; +$chanmap->{chan}->[15]->[3]=25; +$chanmap->{fpga}->[15]->[4]=0x2001; +$chanmap->{chan}->[15]->[4]=23; +$chanmap->{fpga}->[15]->[5]=0x2001; +$chanmap->{chan}->[15]->[5]=21; +$chanmap->{fpga}->[15]->[6]=0x2001; +$chanmap->{chan}->[15]->[6]=19; +$chanmap->{fpga}->[15]->[7]=0x2001; +$chanmap->{chan}->[15]->[7]=17; + + +$chanmap->{fpga}->[16]->[0]=0x2001; +$chanmap->{chan}->[16]->[0]=16; +$chanmap->{fpga}->[16]->[1]=0x2001; +$chanmap->{chan}->[16]->[1]=14; +$chanmap->{fpga}->[16]->[2]=0x2001; +$chanmap->{chan}->[16]->[2]=12; +$chanmap->{fpga}->[16]->[3]=0x2001; +$chanmap->{chan}->[16]->[3]=10; +$chanmap->{fpga}->[16]->[4]=0x2001; +$chanmap->{chan}->[16]->[4]=8; +$chanmap->{fpga}->[16]->[5]=0x2001; +$chanmap->{chan}->[16]->[5]=6; +$chanmap->{fpga}->[16]->[6]=0x2001; +$chanmap->{chan}->[16]->[6]=4; +$chanmap->{fpga}->[16]->[7]=0x2001; +$chanmap->{chan}->[16]->[7]=2; + +$chanmap->{fpga}->[17]->[0]=0x2001; +$chanmap->{chan}->[17]->[0]=15; +$chanmap->{fpga}->[17]->[1]=0x2001; +$chanmap->{chan}->[17]->[1]=13; +$chanmap->{fpga}->[17]->[2]=0x2001; +$chanmap->{chan}->[17]->[2]=11; +$chanmap->{fpga}->[17]->[3]=0x2001; +$chanmap->{chan}->[17]->[3]=9; +$chanmap->{fpga}->[17]->[4]=0x2001; +$chanmap->{chan}->[17]->[4]=7; +$chanmap->{fpga}->[17]->[5]=0x2001; +$chanmap->{chan}->[17]->[5]=5; +$chanmap->{fpga}->[17]->[6]=0x2001; +$chanmap->{chan}->[17]->[6]=3; +$chanmap->{fpga}->[17]->[7]=0x2001; +$chanmap->{chan}->[17]->[7]=1; + +$chanmap->{fpga}->[18]->[0]=0x2000; +$chanmap->{chan}->[18]->[0]=48; +$chanmap->{fpga}->[18]->[1]=0x2000; +$chanmap->{chan}->[18]->[1]=46; +$chanmap->{fpga}->[18]->[2]=0x2000; +$chanmap->{chan}->[18]->[2]=44; +$chanmap->{fpga}->[18]->[3]=0x2000; +$chanmap->{chan}->[18]->[3]=42; +$chanmap->{fpga}->[18]->[4]=0x2000; +$chanmap->{chan}->[18]->[4]=40; +$chanmap->{fpga}->[18]->[5]=0x2000; +$chanmap->{chan}->[18]->[5]=38; +$chanmap->{fpga}->[18]->[6]=0x2000; +$chanmap->{chan}->[18]->[6]=36; +$chanmap->{fpga}->[18]->[7]=0x2000; +$chanmap->{chan}->[18]->[7]=34; + +$chanmap->{fpga}->[19]->[0]=0x2000; +$chanmap->{chan}->[19]->[0]=47; +$chanmap->{fpga}->[19]->[1]=0x2000; +$chanmap->{chan}->[19]->[1]=45; +$chanmap->{fpga}->[19]->[2]=0x2000; +$chanmap->{chan}->[19]->[2]=43; +$chanmap->{fpga}->[19]->[3]=0x2000; +$chanmap->{chan}->[19]->[3]=41; +$chanmap->{fpga}->[19]->[4]=0x2000; +$chanmap->{chan}->[19]->[4]=39; +$chanmap->{fpga}->[19]->[5]=0x2000; +$chanmap->{chan}->[19]->[5]=37; +$chanmap->{fpga}->[19]->[6]=0x2000; +$chanmap->{chan}->[19]->[6]=35; +$chanmap->{fpga}->[19]->[7]=0x2000; +$chanmap->{chan}->[19]->[7]=33; + +$chanmap->{fpga}->[20]->[0]=0x2000; +$chanmap->{chan}->[20]->[0]=32; +$chanmap->{fpga}->[20]->[1]=0x2000; +$chanmap->{chan}->[20]->[1]=30; +$chanmap->{fpga}->[20]->[2]=0x2000; +$chanmap->{chan}->[20]->[2]=28; +$chanmap->{fpga}->[20]->[3]=0x2000; +$chanmap->{chan}->[20]->[3]=26; +$chanmap->{fpga}->[20]->[4]=0x2000; +$chanmap->{chan}->[20]->[4]=24; +$chanmap->{fpga}->[20]->[5]=0x2000; +$chanmap->{chan}->[20]->[5]=22; +$chanmap->{fpga}->[20]->[6]=0x2000; +$chanmap->{chan}->[20]->[6]=20; +$chanmap->{fpga}->[20]->[7]=0x2000; +$chanmap->{chan}->[20]->[7]=18; + +$chanmap->{fpga}->[21]->[0]=0x2000; +$chanmap->{chan}->[21]->[0]=31; +$chanmap->{fpga}->[21]->[1]=0x2000; +$chanmap->{chan}->[21]->[1]=29; +$chanmap->{fpga}->[21]->[2]=0x2000; +$chanmap->{chan}->[21]->[2]=27; +$chanmap->{fpga}->[21]->[3]=0x2000; +$chanmap->{chan}->[21]->[3]=25; +$chanmap->{fpga}->[21]->[4]=0x2000; +$chanmap->{chan}->[21]->[4]=23; +$chanmap->{fpga}->[21]->[5]=0x2000; +$chanmap->{chan}->[21]->[5]=21; +$chanmap->{fpga}->[21]->[6]=0x2000; +$chanmap->{chan}->[21]->[6]=19; +$chanmap->{fpga}->[21]->[7]=0x2000; +$chanmap->{chan}->[21]->[7]=17; + +$chanmap->{fpga}->[22]->[0]=0x2000; +$chanmap->{chan}->[22]->[0]=16; +$chanmap->{fpga}->[22]->[1]=0x2000; +$chanmap->{chan}->[22]->[1]=14; +$chanmap->{fpga}->[22]->[2]=0x2000; +$chanmap->{chan}->[22]->[2]=12; +$chanmap->{fpga}->[22]->[3]=0x2000; +$chanmap->{chan}->[22]->[3]=10; +$chanmap->{fpga}->[22]->[4]=0x2000; +$chanmap->{chan}->[22]->[4]=8; +$chanmap->{fpga}->[22]->[5]=0x2000; +$chanmap->{chan}->[22]->[5]=6; +$chanmap->{fpga}->[22]->[6]=0x2000; +$chanmap->{chan}->[22]->[6]=4; +$chanmap->{fpga}->[22]->[7]=0x2000; +$chanmap->{chan}->[22]->[7]=2; + +$chanmap->{fpga}->[23]->[0]=0x2000; +$chanmap->{chan}->[23]->[0]=15; +$chanmap->{fpga}->[23]->[1]=0x2000; +$chanmap->{chan}->[23]->[1]=13; +$chanmap->{fpga}->[23]->[2]=0x2000; +$chanmap->{chan}->[23]->[2]=11; +$chanmap->{fpga}->[23]->[3]=0x2000; +$chanmap->{chan}->[23]->[3]=9; +$chanmap->{fpga}->[23]->[4]=0x2000; +$chanmap->{chan}->[23]->[4]=7; +$chanmap->{fpga}->[23]->[5]=0x2000; +$chanmap->{chan}->[23]->[5]=5; +$chanmap->{fpga}->[23]->[6]=0x2000; +$chanmap->{chan}->[23]->[6]=3; +$chanmap->{fpga}->[23]->[7]=0x2000; +$chanmap->{chan}->[23]->[7]=1; + + +$chanmap->{fpga}->[0]->[8]=0x2007; +$chanmap->{chan}->[0]->[8]=48; +$chanmap->{fpga}->[0]->[9]=0x2007; +$chanmap->{chan}->[0]->[9]=46; +$chanmap->{fpga}->[0]->[10]=0x2007; +$chanmap->{chan}->[0]->[10]=44; +$chanmap->{fpga}->[0]->[11]=0x2007; +$chanmap->{chan}->[0]->[11]=42; +$chanmap->{fpga}->[0]->[12]=0x2007; +$chanmap->{chan}->[0]->[12]=40; +$chanmap->{fpga}->[0]->[13]=0x2007; +$chanmap->{chan}->[0]->[13]=38; +$chanmap->{fpga}->[0]->[14]=0x2007; +$chanmap->{chan}->[0]->[14]=36; +$chanmap->{fpga}->[0]->[15]=0x2007; +$chanmap->{chan}->[0]->[15]=34; + +$chanmap->{fpga}->[1]->[8]=0x2007; +$chanmap->{chan}->[1]->[8]=47; +$chanmap->{fpga}->[1]->[9]=0x2007; +$chanmap->{chan}->[1]->[9]=45; +$chanmap->{fpga}->[1]->[10]=0x2007; +$chanmap->{chan}->[1]->[10]=43; +$chanmap->{fpga}->[1]->[11]=0x2007; +$chanmap->{chan}->[1]->[11]=41; +$chanmap->{fpga}->[1]->[12]=0x2007; +$chanmap->{chan}->[1]->[12]=39; +$chanmap->{fpga}->[1]->[13]=0x2007; +$chanmap->{chan}->[1]->[13]=37; +$chanmap->{fpga}->[1]->[14]=0x2007; +$chanmap->{chan}->[1]->[14]=35; +$chanmap->{fpga}->[1]->[15]=0x2007; +$chanmap->{chan}->[1]->[15]=33; + +$chanmap->{fpga}->[2]->[8]=0x2007; +$chanmap->{chan}->[2]->[8]=32; +$chanmap->{fpga}->[2]->[9]=0x2007; +$chanmap->{chan}->[2]->[9]=30; +$chanmap->{fpga}->[2]->[10]=0x2007; +$chanmap->{chan}->[2]->[10]=28; +$chanmap->{fpga}->[2]->[11]=0x2007; +$chanmap->{chan}->[2]->[11]=26; +$chanmap->{fpga}->[2]->[12]=0x2007; +$chanmap->{chan}->[2]->[12]=24; +$chanmap->{fpga}->[2]->[13]=0x2007; +$chanmap->{chan}->[2]->[13]=22; +$chanmap->{fpga}->[2]->[14]=0x2007; +$chanmap->{chan}->[2]->[14]=20; +$chanmap->{fpga}->[2]->[15]=0x2007; +$chanmap->{chan}->[2]->[15]=18; + +$chanmap->{fpga}->[3]->[8]=0x2007; +$chanmap->{chan}->[3]->[8]=31; +$chanmap->{fpga}->[3]->[9]=0x2007; +$chanmap->{chan}->[3]->[9]=29; +$chanmap->{fpga}->[3]->[10]=0x2007; +$chanmap->{chan}->[3]->[10]=27; +$chanmap->{fpga}->[3]->[11]=0x2007; +$chanmap->{chan}->[3]->[11]=25; +$chanmap->{fpga}->[3]->[12]=0x2007; +$chanmap->{chan}->[3]->[12]=23; +$chanmap->{fpga}->[3]->[13]=0x2007; +$chanmap->{chan}->[3]->[13]=21; +$chanmap->{fpga}->[3]->[14]=0x2007; +$chanmap->{chan}->[3]->[14]=19; +$chanmap->{fpga}->[3]->[15]=0x2007; +$chanmap->{chan}->[3]->[15]=17; + +$chanmap->{fpga}->[4]->[8]=0x2007; +$chanmap->{chan}->[4]->[8]=16; +$chanmap->{fpga}->[4]->[9]=0x2007; +$chanmap->{chan}->[4]->[9]=14; +$chanmap->{fpga}->[4]->[10]=0x2007; +$chanmap->{chan}->[4]->[10]=12; +$chanmap->{fpga}->[4]->[11]=0x2007; +$chanmap->{chan}->[4]->[11]=10; +$chanmap->{fpga}->[4]->[12]=0x2007; +$chanmap->{chan}->[4]->[12]=8; +$chanmap->{fpga}->[4]->[13]=0x2007; +$chanmap->{chan}->[4]->[13]=6; +$chanmap->{fpga}->[4]->[14]=0x2007; +$chanmap->{chan}->[4]->[14]=4; +$chanmap->{fpga}->[4]->[15]=0x2007; +$chanmap->{chan}->[4]->[15]=2; + +$chanmap->{fpga}->[5]->[8]=0x2007; +$chanmap->{chan}->[5]->[8]=15; +$chanmap->{fpga}->[5]->[9]=0x2007; +$chanmap->{chan}->[5]->[9]=13; +$chanmap->{fpga}->[5]->[10]=0x2007; +$chanmap->{chan}->[5]->[10]=11; +$chanmap->{fpga}->[5]->[11]=0x2007; +$chanmap->{chan}->[5]->[11]=9; +$chanmap->{fpga}->[5]->[12]=0x2007; +$chanmap->{chan}->[5]->[12]=7; +$chanmap->{fpga}->[5]->[13]=0x2007; +$chanmap->{chan}->[5]->[13]=5; +$chanmap->{fpga}->[5]->[14]=0x2007; +$chanmap->{chan}->[5]->[14]=3; +$chanmap->{fpga}->[5]->[15]=0x2007; +$chanmap->{chan}->[5]->[15]=1; + +$chanmap->{fpga}->[6]->[8]=0x2006; +$chanmap->{chan}->[6]->[8]=48; +$chanmap->{fpga}->[6]->[9]=0x2006; +$chanmap->{chan}->[6]->[9]=46; +$chanmap->{fpga}->[6]->[10]=0x2006; +$chanmap->{chan}->[6]->[10]=44; +$chanmap->{fpga}->[6]->[11]=0x2006; +$chanmap->{chan}->[6]->[11]=42; +$chanmap->{fpga}->[6]->[12]=0x2006; +$chanmap->{chan}->[6]->[12]=40; +$chanmap->{fpga}->[6]->[13]=0x2006; +$chanmap->{chan}->[6]->[13]=38; +$chanmap->{fpga}->[6]->[14]=0x2006; +$chanmap->{chan}->[6]->[14]=36; +$chanmap->{fpga}->[6]->[15]=0x2006; +$chanmap->{chan}->[6]->[15]=34; + +$chanmap->{fpga}->[7]->[8]=0x2006; +$chanmap->{chan}->[7]->[8]=47; +$chanmap->{fpga}->[7]->[9]=0x2006; +$chanmap->{chan}->[7]->[9]=45; +$chanmap->{fpga}->[7]->[10]=0x2006; +$chanmap->{chan}->[7]->[10]=43; +$chanmap->{fpga}->[7]->[11]=0x2006; +$chanmap->{chan}->[7]->[11]=41; +$chanmap->{fpga}->[7]->[12]=0x2006; +$chanmap->{chan}->[7]->[12]=39; +$chanmap->{fpga}->[7]->[13]=0x2006; +$chanmap->{chan}->[7]->[13]=37; +$chanmap->{fpga}->[7]->[14]=0x2006; +$chanmap->{chan}->[7]->[14]=35; +$chanmap->{fpga}->[7]->[15]=0x2006; +$chanmap->{chan}->[7]->[15]=33; + + +$chanmap->{fpga}->[8]->[8]=0x2006; +$chanmap->{chan}->[8]->[8]=32; +$chanmap->{fpga}->[8]->[9]=0x2006; +$chanmap->{chan}->[8]->[9]=30; +$chanmap->{fpga}->[8]->[10]=0x2006; +$chanmap->{chan}->[8]->[10]=28; +$chanmap->{fpga}->[8]->[11]=0x2006; +$chanmap->{chan}->[8]->[11]=26; +$chanmap->{fpga}->[8]->[12]=0x2006; +$chanmap->{chan}->[8]->[12]=24; +$chanmap->{fpga}->[8]->[13]=0x2006; +$chanmap->{chan}->[8]->[13]=22; +$chanmap->{fpga}->[8]->[14]=0x2006; +$chanmap->{chan}->[8]->[14]=20; +$chanmap->{fpga}->[8]->[15]=0x2006; +$chanmap->{chan}->[8]->[15]=18; + +$chanmap->{fpga}->[9]->[8]=0x2006; +$chanmap->{chan}->[9]->[8]=31; +$chanmap->{fpga}->[9]->[9]=0x2006; +$chanmap->{chan}->[9]->[9]=29; +$chanmap->{fpga}->[9]->[10]=0x2006; +$chanmap->{chan}->[9]->[10]=27; +$chanmap->{fpga}->[9]->[11]=0x2006; +$chanmap->{chan}->[9]->[11]=25; +$chanmap->{fpga}->[9]->[12]=0x2006; +$chanmap->{chan}->[9]->[12]=23; +$chanmap->{fpga}->[9]->[13]=0x2006; +$chanmap->{chan}->[9]->[13]=21; +$chanmap->{fpga}->[9]->[14]=0x2006; +$chanmap->{chan}->[9]->[14]=19; +$chanmap->{fpga}->[9]->[15]=0x2006; +$chanmap->{chan}->[9]->[15]=17; + +$chanmap->{fpga}->[10]->[8]=0x2006; +$chanmap->{chan}->[10]->[8]=16; +$chanmap->{fpga}->[10]->[9]=0x2006; +$chanmap->{chan}->[10]->[9]=14; +$chanmap->{fpga}->[10]->[10]=0x2006; +$chanmap->{chan}->[10]->[10]=12; +$chanmap->{fpga}->[10]->[11]=0x2006; +$chanmap->{chan}->[10]->[11]=10; +$chanmap->{fpga}->[10]->[12]=0x2006; +$chanmap->{chan}->[10]->[12]=8; +$chanmap->{fpga}->[10]->[13]=0x2006; +$chanmap->{chan}->[10]->[13]=6; +$chanmap->{fpga}->[10]->[14]=0x2006; +$chanmap->{chan}->[10]->[14]=4; +$chanmap->{fpga}->[10]->[15]=0x2006; +$chanmap->{chan}->[10]->[15]=2; + +$chanmap->{fpga}->[11]->[8]=0x2006; +$chanmap->{chan}->[11]->[8]=15; +$chanmap->{fpga}->[11]->[9]=0x2006; +$chanmap->{chan}->[11]->[9]=13; +$chanmap->{fpga}->[11]->[10]=0x2006; +$chanmap->{chan}->[11]->[10]=11; +$chanmap->{fpga}->[11]->[11]=0x2006; +$chanmap->{chan}->[11]->[11]=9; +$chanmap->{fpga}->[11]->[12]=0x2006; +$chanmap->{chan}->[11]->[12]=7; +$chanmap->{fpga}->[11]->[13]=0x2006; +$chanmap->{chan}->[11]->[13]=5; +$chanmap->{fpga}->[11]->[14]=0x2006; +$chanmap->{chan}->[11]->[14]=3; +$chanmap->{fpga}->[11]->[15]=0x2006; +$chanmap->{chan}->[11]->[15]=1; + +$chanmap->{fpga}->[12]->[8]=0x2005; +$chanmap->{chan}->[12]->[8]=48; +$chanmap->{fpga}->[12]->[9]=0x2005; +$chanmap->{chan}->[12]->[9]=46; +$chanmap->{fpga}->[12]->[10]=0x2005; +$chanmap->{chan}->[12]->[10]=44; +$chanmap->{fpga}->[12]->[11]=0x2005; +$chanmap->{chan}->[12]->[11]=42; +$chanmap->{fpga}->[12]->[12]=0x2005; +$chanmap->{chan}->[12]->[12]=40; +$chanmap->{fpga}->[12]->[13]=0x2005; +$chanmap->{chan}->[12]->[13]=38; +$chanmap->{fpga}->[12]->[14]=0x2005; +$chanmap->{chan}->[12]->[14]=36; +$chanmap->{fpga}->[12]->[15]=0x2005; +$chanmap->{chan}->[12]->[15]=34; + +$chanmap->{fpga}->[13]->[8]=0x2005; +$chanmap->{chan}->[13]->[8]=47; +$chanmap->{fpga}->[13]->[9]=0x2005; +$chanmap->{chan}->[13]->[9]=45; +$chanmap->{fpga}->[13]->[10]=0x2005; +$chanmap->{chan}->[13]->[10]=43; +$chanmap->{fpga}->[13]->[11]=0x2005; +$chanmap->{chan}->[13]->[11]=41; +$chanmap->{fpga}->[13]->[12]=0x2005; +$chanmap->{chan}->[13]->[12]=39; +$chanmap->{fpga}->[13]->[13]=0x2005; +$chanmap->{chan}->[13]->[13]=37; +$chanmap->{fpga}->[13]->[14]=0x2005; +$chanmap->{chan}->[13]->[14]=35; +$chanmap->{fpga}->[13]->[15]=0x2005; +$chanmap->{chan}->[13]->[15]=33; + +$chanmap->{fpga}->[14]->[8]=0x2005; +$chanmap->{chan}->[14]->[8]=32; +$chanmap->{fpga}->[14]->[9]=0x2005; +$chanmap->{chan}->[14]->[9]=30; +$chanmap->{fpga}->[14]->[10]=0x2005; +$chanmap->{chan}->[14]->[10]=28; +$chanmap->{fpga}->[14]->[11]=0x2005; +$chanmap->{chan}->[14]->[11]=26; +$chanmap->{fpga}->[14]->[12]=0x2005; +$chanmap->{chan}->[14]->[12]=24; +$chanmap->{fpga}->[14]->[13]=0x2005; +$chanmap->{chan}->[14]->[13]=22; +$chanmap->{fpga}->[14]->[14]=0x2005; +$chanmap->{chan}->[14]->[14]=20; +$chanmap->{fpga}->[14]->[15]=0x2005; +$chanmap->{chan}->[14]->[15]=18; + +$chanmap->{fpga}->[15]->[8]=0x2005; +$chanmap->{chan}->[15]->[8]=31; +$chanmap->{fpga}->[15]->[9]=0x2005; +$chanmap->{chan}->[15]->[9]=29; +$chanmap->{fpga}->[15]->[10]=0x2005; +$chanmap->{chan}->[15]->[10]=27; +$chanmap->{fpga}->[15]->[11]=0x2005; +$chanmap->{chan}->[15]->[11]=25; +$chanmap->{fpga}->[15]->[12]=0x2005; +$chanmap->{chan}->[15]->[12]=23; +$chanmap->{fpga}->[15]->[13]=0x2005; +$chanmap->{chan}->[15]->[13]=21; +$chanmap->{fpga}->[15]->[14]=0x2005; +$chanmap->{chan}->[15]->[14]=19; +$chanmap->{fpga}->[15]->[15]=0x2005; +$chanmap->{chan}->[15]->[15]=17; + + +$chanmap->{fpga}->[16]->[8]=0x2005; +$chanmap->{chan}->[16]->[8]=16; +$chanmap->{fpga}->[16]->[9]=0x2005; +$chanmap->{chan}->[16]->[9]=14; +$chanmap->{fpga}->[16]->[10]=0x2005; +$chanmap->{chan}->[16]->[10]=12; +$chanmap->{fpga}->[16]->[11]=0x2005; +$chanmap->{chan}->[16]->[11]=10; +$chanmap->{fpga}->[16]->[12]=0x2005; +$chanmap->{chan}->[16]->[12]=8; +$chanmap->{fpga}->[16]->[13]=0x2005; +$chanmap->{chan}->[16]->[13]=6; +$chanmap->{fpga}->[16]->[14]=0x2005; +$chanmap->{chan}->[16]->[14]=4; +$chanmap->{fpga}->[16]->[15]=0x2005; +$chanmap->{chan}->[16]->[15]=2; + +$chanmap->{fpga}->[17]->[8]=0x2005; +$chanmap->{chan}->[17]->[8]=15; +$chanmap->{fpga}->[17]->[9]=0x2005; +$chanmap->{chan}->[17]->[9]=13; +$chanmap->{fpga}->[17]->[10]=0x2005; +$chanmap->{chan}->[17]->[10]=11; +$chanmap->{fpga}->[17]->[11]=0x2005; +$chanmap->{chan}->[17]->[11]=9; +$chanmap->{fpga}->[17]->[12]=0x2005; +$chanmap->{chan}->[17]->[12]=7; +$chanmap->{fpga}->[17]->[13]=0x2005; +$chanmap->{chan}->[17]->[13]=5; +$chanmap->{fpga}->[17]->[14]=0x2005; +$chanmap->{chan}->[17]->[14]=3; +$chanmap->{fpga}->[17]->[15]=0x2005; +$chanmap->{chan}->[17]->[15]=1; + +$chanmap->{fpga}->[18]->[8]=0x2004; +$chanmap->{chan}->[18]->[8]=48; +$chanmap->{fpga}->[18]->[9]=0x2004; +$chanmap->{chan}->[18]->[9]=46; +$chanmap->{fpga}->[18]->[10]=0x2004; +$chanmap->{chan}->[18]->[10]=44; +$chanmap->{fpga}->[18]->[11]=0x2004; +$chanmap->{chan}->[18]->[11]=42; +$chanmap->{fpga}->[18]->[12]=0x2004; +$chanmap->{chan}->[18]->[12]=40; +$chanmap->{fpga}->[18]->[13]=0x2004; +$chanmap->{chan}->[18]->[13]=38; +$chanmap->{fpga}->[18]->[14]=0x2004; +$chanmap->{chan}->[18]->[14]=36; +$chanmap->{fpga}->[18]->[15]=0x2004; +$chanmap->{chan}->[18]->[15]=34; + +$chanmap->{fpga}->[19]->[8]=0x2004; +$chanmap->{chan}->[19]->[8]=47; +$chanmap->{fpga}->[19]->[9]=0x2004; +$chanmap->{chan}->[19]->[9]=45; +$chanmap->{fpga}->[19]->[10]=0x2004; +$chanmap->{chan}->[19]->[10]=43; +$chanmap->{fpga}->[19]->[11]=0x2004; +$chanmap->{chan}->[19]->[11]=41; +$chanmap->{fpga}->[19]->[12]=0x2004; +$chanmap->{chan}->[19]->[12]=39; +$chanmap->{fpga}->[19]->[13]=0x2004; +$chanmap->{chan}->[19]->[13]=37; +$chanmap->{fpga}->[19]->[14]=0x2004; +$chanmap->{chan}->[19]->[14]=35; +$chanmap->{fpga}->[19]->[15]=0x2004; +$chanmap->{chan}->[19]->[15]=33; + +$chanmap->{fpga}->[20]->[8]=0x2004; +$chanmap->{chan}->[20]->[8]=32; +$chanmap->{fpga}->[20]->[9]=0x2004; +$chanmap->{chan}->[20]->[9]=30; +$chanmap->{fpga}->[20]->[10]=0x2004; +$chanmap->{chan}->[20]->[10]=28; +$chanmap->{fpga}->[20]->[11]=0x2004; +$chanmap->{chan}->[20]->[11]=26; +$chanmap->{fpga}->[20]->[12]=0x2004; +$chanmap->{chan}->[20]->[12]=24; +$chanmap->{fpga}->[20]->[13]=0x2004; +$chanmap->{chan}->[20]->[13]=22; +$chanmap->{fpga}->[20]->[14]=0x2004; +$chanmap->{chan}->[20]->[14]=20; +$chanmap->{fpga}->[20]->[15]=0x2004; +$chanmap->{chan}->[20]->[15]=18; + +$chanmap->{fpga}->[21]->[8]=0x2004; +$chanmap->{chan}->[21]->[8]=31; +$chanmap->{fpga}->[21]->[9]=0x2004; +$chanmap->{chan}->[21]->[9]=29; +$chanmap->{fpga}->[21]->[10]=0x2004; +$chanmap->{chan}->[21]->[10]=27; +$chanmap->{fpga}->[21]->[11]=0x2004; +$chanmap->{chan}->[21]->[11]=25; +$chanmap->{fpga}->[21]->[12]=0x2004; +$chanmap->{chan}->[21]->[12]=23; +$chanmap->{fpga}->[21]->[13]=0x2004; +$chanmap->{chan}->[21]->[13]=21; +$chanmap->{fpga}->[21]->[14]=0x2004; +$chanmap->{chan}->[21]->[14]=19; +$chanmap->{fpga}->[21]->[15]=0x2004; +$chanmap->{chan}->[21]->[15]=17; + +$chanmap->{fpga}->[22]->[8]=0x2004; +$chanmap->{chan}->[22]->[8]=16; +$chanmap->{fpga}->[22]->[9]=0x2004; +$chanmap->{chan}->[22]->[9]=14; +$chanmap->{fpga}->[22]->[10]=0x2004; +$chanmap->{chan}->[22]->[10]=12; +$chanmap->{fpga}->[22]->[11]=0x2004; +$chanmap->{chan}->[22]->[11]=10; +$chanmap->{fpga}->[22]->[12]=0x2004; +$chanmap->{chan}->[22]->[12]=8; +$chanmap->{fpga}->[22]->[13]=0x2004; +$chanmap->{chan}->[22]->[13]=6; +$chanmap->{fpga}->[22]->[14]=0x2004; +$chanmap->{chan}->[22]->[14]=4; +$chanmap->{fpga}->[22]->[15]=0x2004; +$chanmap->{chan}->[22]->[15]=2; + +$chanmap->{fpga}->[23]->[8]=0x2004; +$chanmap->{chan}->[23]->[8]=15; +$chanmap->{fpga}->[23]->[9]=0x2004; +$chanmap->{chan}->[23]->[9]=13; +$chanmap->{fpga}->[23]->[10]=0x2004; +$chanmap->{chan}->[23]->[10]=11; +$chanmap->{fpga}->[23]->[11]=0x2004; +$chanmap->{chan}->[23]->[11]=9; +$chanmap->{fpga}->[23]->[12]=0x2004; +$chanmap->{chan}->[23]->[12]=7; +$chanmap->{fpga}->[23]->[13]=0x2004; +$chanmap->{chan}->[23]->[13]=5; +$chanmap->{fpga}->[23]->[14]=0x2004; +$chanmap->{chan}->[23]->[14]=3; +$chanmap->{fpga}->[23]->[15]=0x2004; +$chanmap->{chan}->[23]->[15]=1; + + +$chanmap->{fpga}->[0]->[16]=0x200b; +$chanmap->{chan}->[0]->[16]=48; +$chanmap->{fpga}->[0]->[17]=0x200b; +$chanmap->{chan}->[0]->[17]=46; +$chanmap->{fpga}->[0]->[18]=0x200b; +$chanmap->{chan}->[0]->[18]=44; +$chanmap->{fpga}->[0]->[19]=0x200b; +$chanmap->{chan}->[0]->[19]=42; +$chanmap->{fpga}->[0]->[20]=0x200b; +$chanmap->{chan}->[0]->[20]=40; +$chanmap->{fpga}->[0]->[21]=0x200b; +$chanmap->{chan}->[0]->[21]=38; +$chanmap->{fpga}->[0]->[22]=0x200b; +$chanmap->{chan}->[0]->[22]=36; +$chanmap->{fpga}->[0]->[23]=0x200b; +$chanmap->{chan}->[0]->[23]=34; + +$chanmap->{fpga}->[1]->[16]=0x200b; +$chanmap->{chan}->[1]->[16]=47; +$chanmap->{fpga}->[1]->[17]=0x200b; +$chanmap->{chan}->[1]->[17]=45; +$chanmap->{fpga}->[1]->[18]=0x200b; +$chanmap->{chan}->[1]->[18]=43; +$chanmap->{fpga}->[1]->[19]=0x200b; +$chanmap->{chan}->[1]->[19]=41; +$chanmap->{fpga}->[1]->[20]=0x200b; +$chanmap->{chan}->[1]->[20]=39; +$chanmap->{fpga}->[1]->[21]=0x200b; +$chanmap->{chan}->[1]->[21]=37; +$chanmap->{fpga}->[1]->[22]=0x200b; +$chanmap->{chan}->[1]->[22]=35; +$chanmap->{fpga}->[1]->[23]=0x200b; +$chanmap->{chan}->[1]->[23]=33; + +$chanmap->{fpga}->[2]->[16]=0x200b; +$chanmap->{chan}->[2]->[16]=32; +$chanmap->{fpga}->[2]->[17]=0x200b; +$chanmap->{chan}->[2]->[17]=30; +$chanmap->{fpga}->[2]->[18]=0x200b; +$chanmap->{chan}->[2]->[18]=28; +$chanmap->{fpga}->[2]->[19]=0x200b; +$chanmap->{chan}->[2]->[19]=26; +$chanmap->{fpga}->[2]->[20]=0x200b; +$chanmap->{chan}->[2]->[20]=24; +$chanmap->{fpga}->[2]->[21]=0x200b; +$chanmap->{chan}->[2]->[21]=22; +$chanmap->{fpga}->[2]->[22]=0x200b; +$chanmap->{chan}->[2]->[22]=20; +$chanmap->{fpga}->[2]->[23]=0x200b; +$chanmap->{chan}->[2]->[23]=18; + +$chanmap->{fpga}->[3]->[16]=0x200b; +$chanmap->{chan}->[3]->[16]=31; +$chanmap->{fpga}->[3]->[17]=0x200b; +$chanmap->{chan}->[3]->[17]=29; +$chanmap->{fpga}->[3]->[18]=0x200b; +$chanmap->{chan}->[3]->[18]=27; +$chanmap->{fpga}->[3]->[19]=0x200b; +$chanmap->{chan}->[3]->[19]=25; +$chanmap->{fpga}->[3]->[20]=0x200b; +$chanmap->{chan}->[3]->[20]=23; +$chanmap->{fpga}->[3]->[21]=0x200b; +$chanmap->{chan}->[3]->[21]=21; +$chanmap->{fpga}->[3]->[22]=0x200b; +$chanmap->{chan}->[3]->[22]=19; +$chanmap->{fpga}->[3]->[23]=0x200b; +$chanmap->{chan}->[3]->[23]=17; + +$chanmap->{fpga}->[4]->[16]=0x200b; +$chanmap->{chan}->[4]->[16]=16; +$chanmap->{fpga}->[4]->[17]=0x200b; +$chanmap->{chan}->[4]->[17]=14; +$chanmap->{fpga}->[4]->[18]=0x200b; +$chanmap->{chan}->[4]->[18]=12; +$chanmap->{fpga}->[4]->[19]=0x200b; +$chanmap->{chan}->[4]->[19]=10; +$chanmap->{fpga}->[4]->[20]=0x200b; +$chanmap->{chan}->[4]->[20]=8; +$chanmap->{fpga}->[4]->[21]=0x200b; +$chanmap->{chan}->[4]->[21]=6; +$chanmap->{fpga}->[4]->[22]=0x200b; +$chanmap->{chan}->[4]->[22]=4; +$chanmap->{fpga}->[4]->[23]=0x200b; +$chanmap->{chan}->[4]->[23]=2; + +$chanmap->{fpga}->[5]->[16]=0x200b; +$chanmap->{chan}->[5]->[16]=15; +$chanmap->{fpga}->[5]->[17]=0x200b; +$chanmap->{chan}->[5]->[17]=13; +$chanmap->{fpga}->[5]->[18]=0x200b; +$chanmap->{chan}->[5]->[18]=11; +$chanmap->{fpga}->[5]->[19]=0x200b; +$chanmap->{chan}->[5]->[19]=9; +$chanmap->{fpga}->[5]->[20]=0x200b; +$chanmap->{chan}->[5]->[20]=7; +$chanmap->{fpga}->[5]->[21]=0x200b; +$chanmap->{chan}->[5]->[21]=5; +$chanmap->{fpga}->[5]->[22]=0x200b; +$chanmap->{chan}->[5]->[22]=3; +$chanmap->{fpga}->[5]->[23]=0x200b; +$chanmap->{chan}->[5]->[23]=1; + +$chanmap->{fpga}->[6]->[16]=0x200a; +$chanmap->{chan}->[6]->[16]=48; +$chanmap->{fpga}->[6]->[17]=0x200a; +$chanmap->{chan}->[6]->[17]=46; +$chanmap->{fpga}->[6]->[18]=0x200a; +$chanmap->{chan}->[6]->[18]=44; +$chanmap->{fpga}->[6]->[19]=0x200a; +$chanmap->{chan}->[6]->[19]=42; +$chanmap->{fpga}->[6]->[20]=0x200a; +$chanmap->{chan}->[6]->[20]=40; +$chanmap->{fpga}->[6]->[21]=0x200a; +$chanmap->{chan}->[6]->[21]=38; +$chanmap->{fpga}->[6]->[22]=0x200a; +$chanmap->{chan}->[6]->[22]=36; +$chanmap->{fpga}->[6]->[23]=0x200a; +$chanmap->{chan}->[6]->[23]=34; + +$chanmap->{fpga}->[7]->[16]=0x200a; +$chanmap->{chan}->[7]->[16]=47; +$chanmap->{fpga}->[7]->[17]=0x200a; +$chanmap->{chan}->[7]->[17]=45; +$chanmap->{fpga}->[7]->[18]=0x200a; +$chanmap->{chan}->[7]->[18]=43; +$chanmap->{fpga}->[7]->[19]=0x200a; +$chanmap->{chan}->[7]->[19]=41; +$chanmap->{fpga}->[7]->[20]=0x200a; +$chanmap->{chan}->[7]->[20]=39; +$chanmap->{fpga}->[7]->[21]=0x200a; +$chanmap->{chan}->[7]->[21]=37; +$chanmap->{fpga}->[7]->[22]=0x200a; +$chanmap->{chan}->[7]->[22]=35; +$chanmap->{fpga}->[7]->[23]=0x200a; +$chanmap->{chan}->[7]->[23]=33; + + +$chanmap->{fpga}->[8]->[16]=0x200a; +$chanmap->{chan}->[8]->[16]=32; +$chanmap->{fpga}->[8]->[17]=0x200a; +$chanmap->{chan}->[8]->[17]=30; +$chanmap->{fpga}->[8]->[18]=0x200a; +$chanmap->{chan}->[8]->[18]=28; +$chanmap->{fpga}->[8]->[19]=0x200a; +$chanmap->{chan}->[8]->[19]=26; +$chanmap->{fpga}->[8]->[20]=0x200a; +$chanmap->{chan}->[8]->[20]=24; +$chanmap->{fpga}->[8]->[21]=0x200a; +$chanmap->{chan}->[8]->[21]=22; +$chanmap->{fpga}->[8]->[22]=0x200a; +$chanmap->{chan}->[8]->[22]=20; +$chanmap->{fpga}->[8]->[23]=0x200a; +$chanmap->{chan}->[8]->[23]=18; + +$chanmap->{fpga}->[9]->[16]=0x200a; +$chanmap->{chan}->[9]->[16]=31; +$chanmap->{fpga}->[9]->[17]=0x200a; +$chanmap->{chan}->[9]->[17]=29; +$chanmap->{fpga}->[9]->[18]=0x200a; +$chanmap->{chan}->[9]->[18]=27; +$chanmap->{fpga}->[9]->[19]=0x200a; +$chanmap->{chan}->[9]->[19]=25; +$chanmap->{fpga}->[9]->[20]=0x200a; +$chanmap->{chan}->[9]->[20]=23; +$chanmap->{fpga}->[9]->[21]=0x200a; +$chanmap->{chan}->[9]->[21]=21; +$chanmap->{fpga}->[9]->[22]=0x200a; +$chanmap->{chan}->[9]->[22]=19; +$chanmap->{fpga}->[9]->[23]=0x200a; +$chanmap->{chan}->[9]->[23]=17; + +$chanmap->{fpga}->[10]->[16]=0x200a; +$chanmap->{chan}->[10]->[16]=16; +$chanmap->{fpga}->[10]->[17]=0x200a; +$chanmap->{chan}->[10]->[17]=14; +$chanmap->{fpga}->[10]->[18]=0x200a; +$chanmap->{chan}->[10]->[18]=12; +$chanmap->{fpga}->[10]->[19]=0x200a; +$chanmap->{chan}->[10]->[19]=10; +$chanmap->{fpga}->[10]->[20]=0x200a; +$chanmap->{chan}->[10]->[20]=8; +$chanmap->{fpga}->[10]->[21]=0x200a; +$chanmap->{chan}->[10]->[21]=6; +$chanmap->{fpga}->[10]->[22]=0x200a; +$chanmap->{chan}->[10]->[22]=4; +$chanmap->{fpga}->[10]->[23]=0x200a; +$chanmap->{chan}->[10]->[23]=2; + +$chanmap->{fpga}->[11]->[16]=0x200a; +$chanmap->{chan}->[11]->[16]=15; +$chanmap->{fpga}->[11]->[17]=0x200a; +$chanmap->{chan}->[11]->[17]=13; +$chanmap->{fpga}->[11]->[18]=0x200a; +$chanmap->{chan}->[11]->[18]=11; +$chanmap->{fpga}->[11]->[19]=0x200a; +$chanmap->{chan}->[11]->[19]=9; +$chanmap->{fpga}->[11]->[20]=0x200a; +$chanmap->{chan}->[11]->[20]=7; +$chanmap->{fpga}->[11]->[21]=0x200a; +$chanmap->{chan}->[11]->[21]=5; +$chanmap->{fpga}->[11]->[22]=0x200a; +$chanmap->{chan}->[11]->[22]=3; +$chanmap->{fpga}->[11]->[23]=0x200a; +$chanmap->{chan}->[11]->[23]=1; + +$chanmap->{fpga}->[12]->[16]=0x2009; +$chanmap->{chan}->[12]->[16]=48; +$chanmap->{fpga}->[12]->[17]=0x2009; +$chanmap->{chan}->[12]->[17]=46; +$chanmap->{fpga}->[12]->[18]=0x2009; +$chanmap->{chan}->[12]->[18]=44; +$chanmap->{fpga}->[12]->[19]=0x2009; +$chanmap->{chan}->[12]->[19]=42; +$chanmap->{fpga}->[12]->[20]=0x2009; +$chanmap->{chan}->[12]->[20]=40; +$chanmap->{fpga}->[12]->[21]=0x2009; +$chanmap->{chan}->[12]->[21]=38; +$chanmap->{fpga}->[12]->[22]=0x2009; +$chanmap->{chan}->[12]->[22]=36; +$chanmap->{fpga}->[12]->[23]=0x2009; +$chanmap->{chan}->[12]->[23]=34; + +$chanmap->{fpga}->[13]->[16]=0x2009; +$chanmap->{chan}->[13]->[16]=47; +$chanmap->{fpga}->[13]->[17]=0x2009; +$chanmap->{chan}->[13]->[17]=45; +$chanmap->{fpga}->[13]->[18]=0x2009; +$chanmap->{chan}->[13]->[18]=43; +$chanmap->{fpga}->[13]->[19]=0x2009; +$chanmap->{chan}->[13]->[19]=41; +$chanmap->{fpga}->[13]->[20]=0x2009; +$chanmap->{chan}->[13]->[20]=39; +$chanmap->{fpga}->[13]->[21]=0x2009; +$chanmap->{chan}->[13]->[21]=37; +$chanmap->{fpga}->[13]->[22]=0x2009; +$chanmap->{chan}->[13]->[22]=35; +$chanmap->{fpga}->[13]->[23]=0x2009; +$chanmap->{chan}->[13]->[23]=33; + +$chanmap->{fpga}->[14]->[16]=0x2009; +$chanmap->{chan}->[14]->[16]=32; +$chanmap->{fpga}->[14]->[17]=0x2009; +$chanmap->{chan}->[14]->[17]=30; +$chanmap->{fpga}->[14]->[18]=0x2009; +$chanmap->{chan}->[14]->[18]=28; +$chanmap->{fpga}->[14]->[19]=0x2009; +$chanmap->{chan}->[14]->[19]=26; +$chanmap->{fpga}->[14]->[20]=0x2009; +$chanmap->{chan}->[14]->[20]=24; +$chanmap->{fpga}->[14]->[21]=0x2009; +$chanmap->{chan}->[14]->[21]=22; +$chanmap->{fpga}->[14]->[22]=0x2009; +$chanmap->{chan}->[14]->[22]=20; +$chanmap->{fpga}->[14]->[23]=0x2009; +$chanmap->{chan}->[14]->[23]=18; + +$chanmap->{fpga}->[15]->[16]=0x2009; +$chanmap->{chan}->[15]->[16]=31; +$chanmap->{fpga}->[15]->[17]=0x2009; +$chanmap->{chan}->[15]->[17]=29; +$chanmap->{fpga}->[15]->[18]=0x2009; +$chanmap->{chan}->[15]->[18]=27; +$chanmap->{fpga}->[15]->[19]=0x2009; +$chanmap->{chan}->[15]->[19]=25; +$chanmap->{fpga}->[15]->[20]=0x2009; +$chanmap->{chan}->[15]->[20]=23; +$chanmap->{fpga}->[15]->[21]=0x2009; +$chanmap->{chan}->[15]->[21]=21; +$chanmap->{fpga}->[15]->[22]=0x2009; +$chanmap->{chan}->[15]->[22]=19; +$chanmap->{fpga}->[15]->[23]=0x2009; +$chanmap->{chan}->[15]->[23]=17; + + +$chanmap->{fpga}->[16]->[16]=0x2009; +$chanmap->{chan}->[16]->[16]=16; +$chanmap->{fpga}->[16]->[17]=0x2009; +$chanmap->{chan}->[16]->[17]=14; +$chanmap->{fpga}->[16]->[18]=0x2009; +$chanmap->{chan}->[16]->[18]=12; +$chanmap->{fpga}->[16]->[19]=0x2009; +$chanmap->{chan}->[16]->[19]=10; +$chanmap->{fpga}->[16]->[20]=0x2009; +$chanmap->{chan}->[16]->[20]=8; +$chanmap->{fpga}->[16]->[21]=0x2009; +$chanmap->{chan}->[16]->[21]=6; +$chanmap->{fpga}->[16]->[22]=0x2009; +$chanmap->{chan}->[16]->[22]=4; +$chanmap->{fpga}->[16]->[23]=0x2009; +$chanmap->{chan}->[16]->[23]=2; + +$chanmap->{fpga}->[17]->[16]=0x2009; +$chanmap->{chan}->[17]->[16]=15; +$chanmap->{fpga}->[17]->[17]=0x2009; +$chanmap->{chan}->[17]->[17]=13; +$chanmap->{fpga}->[17]->[18]=0x2009; +$chanmap->{chan}->[17]->[18]=11; +$chanmap->{fpga}->[17]->[19]=0x2009; +$chanmap->{chan}->[17]->[19]=9; +$chanmap->{fpga}->[17]->[20]=0x2009; +$chanmap->{chan}->[17]->[20]=7; +$chanmap->{fpga}->[17]->[21]=0x2009; +$chanmap->{chan}->[17]->[21]=5; +$chanmap->{fpga}->[17]->[22]=0x2009; +$chanmap->{chan}->[17]->[22]=3; +$chanmap->{fpga}->[17]->[23]=0x2009; +$chanmap->{chan}->[17]->[23]=1; + +$chanmap->{fpga}->[18]->[16]=0x2008; +$chanmap->{chan}->[18]->[16]=48; +$chanmap->{fpga}->[18]->[17]=0x2008; +$chanmap->{chan}->[18]->[17]=46; +$chanmap->{fpga}->[18]->[18]=0x2008; +$chanmap->{chan}->[18]->[18]=44; +$chanmap->{fpga}->[18]->[19]=0x2008; +$chanmap->{chan}->[18]->[19]=42; +$chanmap->{fpga}->[18]->[20]=0x2008; +$chanmap->{chan}->[18]->[20]=40; +$chanmap->{fpga}->[18]->[21]=0x2008; +$chanmap->{chan}->[18]->[21]=38; +$chanmap->{fpga}->[18]->[22]=0x2008; +$chanmap->{chan}->[18]->[22]=36; +$chanmap->{fpga}->[18]->[23]=0x2008; +$chanmap->{chan}->[18]->[23]=34; + +$chanmap->{fpga}->[19]->[16]=0x2008; +$chanmap->{chan}->[19]->[16]=47; +$chanmap->{fpga}->[19]->[17]=0x2008; +$chanmap->{chan}->[19]->[17]=45; +$chanmap->{fpga}->[19]->[18]=0x2008; +$chanmap->{chan}->[19]->[18]=43; +$chanmap->{fpga}->[19]->[19]=0x2008; +$chanmap->{chan}->[19]->[19]=41; +$chanmap->{fpga}->[19]->[20]=0x2008; +$chanmap->{chan}->[19]->[20]=39; +$chanmap->{fpga}->[19]->[21]=0x2008; +$chanmap->{chan}->[19]->[21]=37; +$chanmap->{fpga}->[19]->[22]=0x2008; +$chanmap->{chan}->[19]->[22]=35; +$chanmap->{fpga}->[19]->[23]=0x2008; +$chanmap->{chan}->[19]->[23]=33; + +$chanmap->{fpga}->[20]->[16]=0x2008; +$chanmap->{chan}->[20]->[16]=32; +$chanmap->{fpga}->[20]->[17]=0x2008; +$chanmap->{chan}->[20]->[17]=30; +$chanmap->{fpga}->[20]->[18]=0x2008; +$chanmap->{chan}->[20]->[18]=28; +$chanmap->{fpga}->[20]->[19]=0x2008; +$chanmap->{chan}->[20]->[19]=26; +$chanmap->{fpga}->[20]->[20]=0x2008; +$chanmap->{chan}->[20]->[20]=24; +$chanmap->{fpga}->[20]->[21]=0x2008; +$chanmap->{chan}->[20]->[21]=22; +$chanmap->{fpga}->[20]->[22]=0x2008; +$chanmap->{chan}->[20]->[22]=20; +$chanmap->{fpga}->[20]->[23]=0x2008; +$chanmap->{chan}->[20]->[23]=18; + +$chanmap->{fpga}->[21]->[16]=0x2008; +$chanmap->{chan}->[21]->[16]=31; +$chanmap->{fpga}->[21]->[17]=0x2008; +$chanmap->{chan}->[21]->[17]=29; +$chanmap->{fpga}->[21]->[18]=0x2008; +$chanmap->{chan}->[21]->[18]=27; +$chanmap->{fpga}->[21]->[19]=0x2008; +$chanmap->{chan}->[21]->[19]=25; +$chanmap->{fpga}->[21]->[20]=0x2008; +$chanmap->{chan}->[21]->[20]=23; +$chanmap->{fpga}->[21]->[21]=0x2008; +$chanmap->{chan}->[21]->[21]=21; +$chanmap->{fpga}->[21]->[22]=0x2008; +$chanmap->{chan}->[21]->[22]=19; +$chanmap->{fpga}->[21]->[23]=0x2008; +$chanmap->{chan}->[21]->[23]=17; + +$chanmap->{fpga}->[22]->[16]=0x2008; +$chanmap->{chan}->[22]->[16]=16; +$chanmap->{fpga}->[22]->[17]=0x2008; +$chanmap->{chan}->[22]->[17]=14; +$chanmap->{fpga}->[22]->[18]=0x2008; +$chanmap->{chan}->[22]->[18]=12; +$chanmap->{fpga}->[22]->[19]=0x2008; +$chanmap->{chan}->[22]->[19]=10; +$chanmap->{fpga}->[22]->[20]=0x2008; +$chanmap->{chan}->[22]->[20]=8; +$chanmap->{fpga}->[22]->[21]=0x2008; +$chanmap->{chan}->[22]->[21]=6; +$chanmap->{fpga}->[22]->[22]=0x2008; +$chanmap->{chan}->[22]->[22]=4; +$chanmap->{fpga}->[22]->[23]=0x2008; +$chanmap->{chan}->[22]->[23]=2; + +$chanmap->{fpga}->[23]->[16]=0x2008; +$chanmap->{chan}->[23]->[16]=15; +$chanmap->{fpga}->[23]->[17]=0x2008; +$chanmap->{chan}->[23]->[17]=13; +$chanmap->{fpga}->[23]->[18]=0x2008; +$chanmap->{chan}->[23]->[18]=11; +$chanmap->{fpga}->[23]->[19]=0x2008; +$chanmap->{chan}->[23]->[19]=9; +$chanmap->{fpga}->[23]->[20]=0x2008; +$chanmap->{chan}->[23]->[20]=7; +$chanmap->{fpga}->[23]->[21]=0x2008; +$chanmap->{chan}->[23]->[21]=5; +$chanmap->{fpga}->[23]->[22]=0x2008; +$chanmap->{chan}->[23]->[22]=3; +$chanmap->{fpga}->[23]->[23]=0x2008; +$chanmap->{chan}->[23]->[23]=1; + + +$chanmap->{fpga}->[0]->[24]=0x200f; +$chanmap->{chan}->[0]->[24]=48; +$chanmap->{fpga}->[0]->[25]=0x200f; +$chanmap->{chan}->[0]->[25]=46; +$chanmap->{fpga}->[0]->[26]=0x200f; +$chanmap->{chan}->[0]->[26]=44; +$chanmap->{fpga}->[0]->[27]=0x200f; +$chanmap->{chan}->[0]->[27]=42; +$chanmap->{fpga}->[0]->[28]=0x200f; +$chanmap->{chan}->[0]->[28]=40; +$chanmap->{fpga}->[0]->[29]=0x200f; +$chanmap->{chan}->[0]->[29]=38; +$chanmap->{fpga}->[0]->[30]=0x200f; +$chanmap->{chan}->[0]->[30]=36; +$chanmap->{fpga}->[0]->[31]=0x200f; +$chanmap->{chan}->[0]->[31]=34; + +$chanmap->{fpga}->[1]->[24]=0x200f; +$chanmap->{chan}->[1]->[24]=47; +$chanmap->{fpga}->[1]->[25]=0x200f; +$chanmap->{chan}->[1]->[25]=45; +$chanmap->{fpga}->[1]->[26]=0x200f; +$chanmap->{chan}->[1]->[26]=43; +$chanmap->{fpga}->[1]->[27]=0x200f; +$chanmap->{chan}->[1]->[27]=41; +$chanmap->{fpga}->[1]->[28]=0x200f; +$chanmap->{chan}->[1]->[28]=39; +$chanmap->{fpga}->[1]->[29]=0x200f; +$chanmap->{chan}->[1]->[29]=37; +$chanmap->{fpga}->[1]->[30]=0x200f; +$chanmap->{chan}->[1]->[30]=35; +$chanmap->{fpga}->[1]->[31]=0x200f; +$chanmap->{chan}->[1]->[31]=33; + +$chanmap->{fpga}->[2]->[24]=0x200f; +$chanmap->{chan}->[2]->[24]=32; +$chanmap->{fpga}->[2]->[25]=0x200f; +$chanmap->{chan}->[2]->[25]=30; +$chanmap->{fpga}->[2]->[26]=0x200f; +$chanmap->{chan}->[2]->[26]=28; +$chanmap->{fpga}->[2]->[27]=0x200f; +$chanmap->{chan}->[2]->[27]=26; +$chanmap->{fpga}->[2]->[28]=0x200f; +$chanmap->{chan}->[2]->[28]=24; +$chanmap->{fpga}->[2]->[29]=0x200f; +$chanmap->{chan}->[2]->[29]=22; +$chanmap->{fpga}->[2]->[30]=0x200f; +$chanmap->{chan}->[2]->[30]=20; +$chanmap->{fpga}->[2]->[31]=0x200f; +$chanmap->{chan}->[2]->[31]=18; + +$chanmap->{fpga}->[3]->[24]=0x200f; +$chanmap->{chan}->[3]->[24]=31; +$chanmap->{fpga}->[3]->[25]=0x200f; +$chanmap->{chan}->[3]->[25]=29; +$chanmap->{fpga}->[3]->[26]=0x200f; +$chanmap->{chan}->[3]->[26]=27; +$chanmap->{fpga}->[3]->[27]=0x200f; +$chanmap->{chan}->[3]->[27]=25; +$chanmap->{fpga}->[3]->[28]=0x200f; +$chanmap->{chan}->[3]->[28]=23; +$chanmap->{fpga}->[3]->[29]=0x200f; +$chanmap->{chan}->[3]->[29]=21; +$chanmap->{fpga}->[3]->[30]=0x200f; +$chanmap->{chan}->[3]->[30]=19; +$chanmap->{fpga}->[3]->[31]=0x200f; +$chanmap->{chan}->[3]->[31]=17; + +$chanmap->{fpga}->[4]->[24]=0x200f; +$chanmap->{chan}->[4]->[24]=16; +$chanmap->{fpga}->[4]->[25]=0x200f; +$chanmap->{chan}->[4]->[25]=14; +$chanmap->{fpga}->[4]->[26]=0x200f; +$chanmap->{chan}->[4]->[26]=12; +$chanmap->{fpga}->[4]->[27]=0x200f; +$chanmap->{chan}->[4]->[27]=10; +$chanmap->{fpga}->[4]->[28]=0x200f; +$chanmap->{chan}->[4]->[28]=8; +$chanmap->{fpga}->[4]->[29]=0x200f; +$chanmap->{chan}->[4]->[29]=6; +$chanmap->{fpga}->[4]->[30]=0x200f; +$chanmap->{chan}->[4]->[30]=4; +$chanmap->{fpga}->[4]->[31]=0x200f; +$chanmap->{chan}->[4]->[31]=2; + +$chanmap->{fpga}->[5]->[24]=0x200f; +$chanmap->{chan}->[5]->[24]=15; +$chanmap->{fpga}->[5]->[25]=0x200f; +$chanmap->{chan}->[5]->[25]=13; +$chanmap->{fpga}->[5]->[26]=0x200f; +$chanmap->{chan}->[5]->[26]=11; +$chanmap->{fpga}->[5]->[27]=0x200f; +$chanmap->{chan}->[5]->[27]=9; +$chanmap->{fpga}->[5]->[28]=0x200f; +$chanmap->{chan}->[5]->[28]=7; +$chanmap->{fpga}->[5]->[29]=0x200f; +$chanmap->{chan}->[5]->[29]=5; +$chanmap->{fpga}->[5]->[30]=0x200f; +$chanmap->{chan}->[5]->[30]=3; +$chanmap->{fpga}->[5]->[31]=0x200f; +$chanmap->{chan}->[5]->[31]=1; + +$chanmap->{fpga}->[6]->[24]=0x200e; +$chanmap->{chan}->[6]->[24]=48; +$chanmap->{fpga}->[6]->[25]=0x200e; +$chanmap->{chan}->[6]->[25]=46; +$chanmap->{fpga}->[6]->[26]=0x200e; +$chanmap->{chan}->[6]->[26]=44; +$chanmap->{fpga}->[6]->[27]=0x200e; +$chanmap->{chan}->[6]->[27]=42; +$chanmap->{fpga}->[6]->[28]=0x200e; +$chanmap->{chan}->[6]->[28]=40; +$chanmap->{fpga}->[6]->[29]=0x200e; +$chanmap->{chan}->[6]->[29]=38; +$chanmap->{fpga}->[6]->[30]=0x200e; +$chanmap->{chan}->[6]->[30]=36; +$chanmap->{fpga}->[6]->[31]=0x200e; +$chanmap->{chan}->[6]->[31]=34; + +$chanmap->{fpga}->[7]->[24]=0x200e; +$chanmap->{chan}->[7]->[24]=47; +$chanmap->{fpga}->[7]->[25]=0x200e; +$chanmap->{chan}->[7]->[25]=45; +$chanmap->{fpga}->[7]->[26]=0x200e; +$chanmap->{chan}->[7]->[26]=43; +$chanmap->{fpga}->[7]->[27]=0x200e; +$chanmap->{chan}->[7]->[27]=41; +$chanmap->{fpga}->[7]->[28]=0x200e; +$chanmap->{chan}->[7]->[28]=39; +$chanmap->{fpga}->[7]->[29]=0x200e; +$chanmap->{chan}->[7]->[29]=37; +$chanmap->{fpga}->[7]->[30]=0x200e; +$chanmap->{chan}->[7]->[30]=35; +$chanmap->{fpga}->[7]->[31]=0x200e; +$chanmap->{chan}->[7]->[31]=33; + + +$chanmap->{fpga}->[8]->[24]=0x200e; +$chanmap->{chan}->[8]->[24]=32; +$chanmap->{fpga}->[8]->[25]=0x200e; +$chanmap->{chan}->[8]->[25]=30; +$chanmap->{fpga}->[8]->[26]=0x200e; +$chanmap->{chan}->[8]->[26]=28; +$chanmap->{fpga}->[8]->[27]=0x200e; +$chanmap->{chan}->[8]->[27]=26; +$chanmap->{fpga}->[8]->[28]=0x200e; +$chanmap->{chan}->[8]->[28]=24; +$chanmap->{fpga}->[8]->[29]=0x200e; +$chanmap->{chan}->[8]->[29]=22; +$chanmap->{fpga}->[8]->[30]=0x200e; +$chanmap->{chan}->[8]->[30]=20; +$chanmap->{fpga}->[8]->[31]=0x200e; +$chanmap->{chan}->[8]->[31]=18; + +$chanmap->{fpga}->[9]->[24]=0x200e; +$chanmap->{chan}->[9]->[24]=31; +$chanmap->{fpga}->[9]->[25]=0x200e; +$chanmap->{chan}->[9]->[25]=29; +$chanmap->{fpga}->[9]->[26]=0x200e; +$chanmap->{chan}->[9]->[26]=27; +$chanmap->{fpga}->[9]->[27]=0x200e; +$chanmap->{chan}->[9]->[27]=25; +$chanmap->{fpga}->[9]->[28]=0x200e; +$chanmap->{chan}->[9]->[28]=23; +$chanmap->{fpga}->[9]->[29]=0x200e; +$chanmap->{chan}->[9]->[29]=21; +$chanmap->{fpga}->[9]->[30]=0x200e; +$chanmap->{chan}->[9]->[30]=19; +$chanmap->{fpga}->[9]->[31]=0x200e; +$chanmap->{chan}->[9]->[31]=17; + +$chanmap->{fpga}->[10]->[24]=0x200e; +$chanmap->{chan}->[10]->[24]=16; +$chanmap->{fpga}->[10]->[25]=0x200e; +$chanmap->{chan}->[10]->[25]=14; +$chanmap->{fpga}->[10]->[26]=0x200e; +$chanmap->{chan}->[10]->[26]=12; +$chanmap->{fpga}->[10]->[27]=0x200e; +$chanmap->{chan}->[10]->[27]=10; +$chanmap->{fpga}->[10]->[28]=0x200e; +$chanmap->{chan}->[10]->[28]=8; +$chanmap->{fpga}->[10]->[29]=0x200e; +$chanmap->{chan}->[10]->[29]=6; +$chanmap->{fpga}->[10]->[30]=0x200e; +$chanmap->{chan}->[10]->[30]=4; +$chanmap->{fpga}->[10]->[31]=0x200e; +$chanmap->{chan}->[10]->[31]=2; + +$chanmap->{fpga}->[11]->[24]=0x200e; +$chanmap->{chan}->[11]->[24]=15; +$chanmap->{fpga}->[11]->[25]=0x200e; +$chanmap->{chan}->[11]->[25]=13; +$chanmap->{fpga}->[11]->[26]=0x200e; +$chanmap->{chan}->[11]->[26]=11; +$chanmap->{fpga}->[11]->[27]=0x200e; +$chanmap->{chan}->[11]->[27]=9; +$chanmap->{fpga}->[11]->[28]=0x200e; +$chanmap->{chan}->[11]->[28]=7; +$chanmap->{fpga}->[11]->[29]=0x200e; +$chanmap->{chan}->[11]->[29]=5; +$chanmap->{fpga}->[11]->[30]=0x200e; +$chanmap->{chan}->[11]->[30]=3; +$chanmap->{fpga}->[11]->[31]=0x200e; +$chanmap->{chan}->[11]->[31]=1; + +$chanmap->{fpga}->[12]->[24]=0x200d; +$chanmap->{chan}->[12]->[24]=48; +$chanmap->{fpga}->[12]->[25]=0x200d; +$chanmap->{chan}->[12]->[25]=46; +$chanmap->{fpga}->[12]->[26]=0x200d; +$chanmap->{chan}->[12]->[26]=44; +$chanmap->{fpga}->[12]->[27]=0x200d; +$chanmap->{chan}->[12]->[27]=42; +$chanmap->{fpga}->[12]->[28]=0x200d; +$chanmap->{chan}->[12]->[28]=40; +$chanmap->{fpga}->[12]->[29]=0x200d; +$chanmap->{chan}->[12]->[29]=38; +$chanmap->{fpga}->[12]->[30]=0x200d; +$chanmap->{chan}->[12]->[30]=36; +$chanmap->{fpga}->[12]->[31]=0x200d; +$chanmap->{chan}->[12]->[31]=34; + +$chanmap->{fpga}->[13]->[24]=0x200d; +$chanmap->{chan}->[13]->[24]=47; +$chanmap->{fpga}->[13]->[25]=0x200d; +$chanmap->{chan}->[13]->[25]=45; +$chanmap->{fpga}->[13]->[26]=0x200d; +$chanmap->{chan}->[13]->[26]=43; +$chanmap->{fpga}->[13]->[27]=0x200d; +$chanmap->{chan}->[13]->[27]=41; +$chanmap->{fpga}->[13]->[28]=0x200d; +$chanmap->{chan}->[13]->[28]=39; +$chanmap->{fpga}->[13]->[29]=0x200d; +$chanmap->{chan}->[13]->[29]=37; +$chanmap->{fpga}->[13]->[30]=0x200d; +$chanmap->{chan}->[13]->[30]=35; +$chanmap->{fpga}->[13]->[31]=0x200d; +$chanmap->{chan}->[13]->[31]=33; + +$chanmap->{fpga}->[14]->[24]=0x200d; +$chanmap->{chan}->[14]->[24]=32; +$chanmap->{fpga}->[14]->[25]=0x200d; +$chanmap->{chan}->[14]->[25]=30; +$chanmap->{fpga}->[14]->[26]=0x200d; +$chanmap->{chan}->[14]->[26]=28; +$chanmap->{fpga}->[14]->[27]=0x200d; +$chanmap->{chan}->[14]->[27]=26; +$chanmap->{fpga}->[14]->[28]=0x200d; +$chanmap->{chan}->[14]->[28]=24; +$chanmap->{fpga}->[14]->[29]=0x200d; +$chanmap->{chan}->[14]->[29]=22; +$chanmap->{fpga}->[14]->[30]=0x200d; +$chanmap->{chan}->[14]->[30]=20; +$chanmap->{fpga}->[14]->[31]=0x200d; +$chanmap->{chan}->[14]->[31]=18; + +$chanmap->{fpga}->[15]->[24]=0x200d; +$chanmap->{chan}->[15]->[24]=31; +$chanmap->{fpga}->[15]->[25]=0x200d; +$chanmap->{chan}->[15]->[25]=29; +$chanmap->{fpga}->[15]->[26]=0x200d; +$chanmap->{chan}->[15]->[26]=27; +$chanmap->{fpga}->[15]->[27]=0x200d; +$chanmap->{chan}->[15]->[27]=25; +$chanmap->{fpga}->[15]->[28]=0x200d; +$chanmap->{chan}->[15]->[28]=23; +$chanmap->{fpga}->[15]->[29]=0x200d; +$chanmap->{chan}->[15]->[29]=21; +$chanmap->{fpga}->[15]->[30]=0x200d; +$chanmap->{chan}->[15]->[30]=19; +$chanmap->{fpga}->[15]->[31]=0x200d; +$chanmap->{chan}->[15]->[31]=17; + + +$chanmap->{fpga}->[16]->[24]=0x200d; +$chanmap->{chan}->[16]->[24]=16; +$chanmap->{fpga}->[16]->[25]=0x200d; +$chanmap->{chan}->[16]->[25]=14; +$chanmap->{fpga}->[16]->[26]=0x200d; +$chanmap->{chan}->[16]->[26]=12; +$chanmap->{fpga}->[16]->[27]=0x200d; +$chanmap->{chan}->[16]->[27]=10; +$chanmap->{fpga}->[16]->[28]=0x200d; +$chanmap->{chan}->[16]->[28]=8; +$chanmap->{fpga}->[16]->[29]=0x200d; +$chanmap->{chan}->[16]->[29]=6; +$chanmap->{fpga}->[16]->[30]=0x200d; +$chanmap->{chan}->[16]->[30]=4; +$chanmap->{fpga}->[16]->[31]=0x200d; +$chanmap->{chan}->[16]->[31]=2; + +$chanmap->{fpga}->[17]->[24]=0x200d; +$chanmap->{chan}->[17]->[24]=15; +$chanmap->{fpga}->[17]->[25]=0x200d; +$chanmap->{chan}->[17]->[25]=13; +$chanmap->{fpga}->[17]->[26]=0x200d; +$chanmap->{chan}->[17]->[26]=11; +$chanmap->{fpga}->[17]->[27]=0x200d; +$chanmap->{chan}->[17]->[27]=9; +$chanmap->{fpga}->[17]->[28]=0x200d; +$chanmap->{chan}->[17]->[28]=7; +$chanmap->{fpga}->[17]->[29]=0x200d; +$chanmap->{chan}->[17]->[29]=5; +$chanmap->{fpga}->[17]->[30]=0x200d; +$chanmap->{chan}->[17]->[30]=3; +$chanmap->{fpga}->[17]->[31]=0x200d; +$chanmap->{chan}->[17]->[31]=1; + +$chanmap->{fpga}->[18]->[24]=0x200c; +$chanmap->{chan}->[18]->[24]=48; +$chanmap->{fpga}->[18]->[25]=0x200c; +$chanmap->{chan}->[18]->[25]=46; +$chanmap->{fpga}->[18]->[26]=0x200c; +$chanmap->{chan}->[18]->[26]=44; +$chanmap->{fpga}->[18]->[27]=0x200c; +$chanmap->{chan}->[18]->[27]=42; +$chanmap->{fpga}->[18]->[28]=0x200c; +$chanmap->{chan}->[18]->[28]=40; +$chanmap->{fpga}->[18]->[29]=0x200c; +$chanmap->{chan}->[18]->[29]=38; +$chanmap->{fpga}->[18]->[30]=0x200c; +$chanmap->{chan}->[18]->[30]=36; +$chanmap->{fpga}->[18]->[31]=0x200c; +$chanmap->{chan}->[18]->[31]=34; + +$chanmap->{fpga}->[19]->[24]=0x200c; +$chanmap->{chan}->[19]->[24]=47; +$chanmap->{fpga}->[19]->[25]=0x200c; +$chanmap->{chan}->[19]->[25]=45; +$chanmap->{fpga}->[19]->[26]=0x200c; +$chanmap->{chan}->[19]->[26]=43; +$chanmap->{fpga}->[19]->[27]=0x200c; +$chanmap->{chan}->[19]->[27]=41; +$chanmap->{fpga}->[19]->[28]=0x200c; +$chanmap->{chan}->[19]->[28]=39; +$chanmap->{fpga}->[19]->[29]=0x200c; +$chanmap->{chan}->[19]->[29]=37; +$chanmap->{fpga}->[19]->[30]=0x200c; +$chanmap->{chan}->[19]->[30]=35; +$chanmap->{fpga}->[19]->[31]=0x200c; +$chanmap->{chan}->[19]->[31]=33; + +$chanmap->{fpga}->[20]->[24]=0x200c; +$chanmap->{chan}->[20]->[24]=32; +$chanmap->{fpga}->[20]->[25]=0x200c; +$chanmap->{chan}->[20]->[25]=30; +$chanmap->{fpga}->[20]->[26]=0x200c; +$chanmap->{chan}->[20]->[26]=28; +$chanmap->{fpga}->[20]->[27]=0x200c; +$chanmap->{chan}->[20]->[27]=26; +$chanmap->{fpga}->[20]->[28]=0x200c; +$chanmap->{chan}->[20]->[28]=24; +$chanmap->{fpga}->[20]->[29]=0x200c; +$chanmap->{chan}->[20]->[29]=22; +$chanmap->{fpga}->[20]->[30]=0x200c; +$chanmap->{chan}->[20]->[30]=20; +$chanmap->{fpga}->[20]->[31]=0x200c; +$chanmap->{chan}->[20]->[31]=18; + +$chanmap->{fpga}->[21]->[24]=0x200c; +$chanmap->{chan}->[21]->[24]=31; +$chanmap->{fpga}->[21]->[25]=0x200c; +$chanmap->{chan}->[21]->[25]=29; +$chanmap->{fpga}->[21]->[26]=0x200c; +$chanmap->{chan}->[21]->[26]=27; +$chanmap->{fpga}->[21]->[27]=0x200c; +$chanmap->{chan}->[21]->[27]=25; +$chanmap->{fpga}->[21]->[28]=0x200c; +$chanmap->{chan}->[21]->[28]=23; +$chanmap->{fpga}->[21]->[29]=0x200c; +$chanmap->{chan}->[21]->[29]=21; +$chanmap->{fpga}->[21]->[30]=0x200c; +$chanmap->{chan}->[21]->[30]=19; +$chanmap->{fpga}->[21]->[31]=0x200c; +$chanmap->{chan}->[21]->[31]=17; + +$chanmap->{fpga}->[22]->[24]=0x200c; +$chanmap->{chan}->[22]->[24]=16; +$chanmap->{fpga}->[22]->[25]=0x200c; +$chanmap->{chan}->[22]->[25]=14; +$chanmap->{fpga}->[22]->[26]=0x200c; +$chanmap->{chan}->[22]->[26]=12; +$chanmap->{fpga}->[22]->[27]=0x200c; +$chanmap->{chan}->[22]->[27]=10; +$chanmap->{fpga}->[22]->[28]=0x200c; +$chanmap->{chan}->[22]->[28]=8; +$chanmap->{fpga}->[22]->[29]=0x200c; +$chanmap->{chan}->[22]->[29]=6; +$chanmap->{fpga}->[22]->[30]=0x200c; +$chanmap->{chan}->[22]->[30]=4; +$chanmap->{fpga}->[22]->[31]=0x200c; +$chanmap->{chan}->[22]->[31]=2; + +$chanmap->{fpga}->[23]->[24]=0x200c; +$chanmap->{chan}->[23]->[24]=15; +$chanmap->{fpga}->[23]->[25]=0x200c; +$chanmap->{chan}->[23]->[25]=13; +$chanmap->{fpga}->[23]->[26]=0x200c; +$chanmap->{chan}->[23]->[26]=11; +$chanmap->{fpga}->[23]->[27]=0x200c; +$chanmap->{chan}->[23]->[27]=9; +$chanmap->{fpga}->[23]->[28]=0x200c; +$chanmap->{chan}->[23]->[28]=7; +$chanmap->{fpga}->[23]->[29]=0x200c; +$chanmap->{chan}->[23]->[29]=5; +$chanmap->{fpga}->[23]->[30]=0x200c; +$chanmap->{chan}->[23]->[30]=3; +$chanmap->{fpga}->[23]->[31]=0x200c; +$chanmap->{chan}->[23]->[31]=1; + + +$chanmap->{fpga}->[0]->[32]=0x2013; +$chanmap->{chan}->[0]->[32]=48; +$chanmap->{fpga}->[0]->[33]=0x2013; +$chanmap->{chan}->[0]->[33]=46; +$chanmap->{fpga}->[0]->[34]=0x2013; +$chanmap->{chan}->[0]->[34]=44; +$chanmap->{fpga}->[0]->[35]=0x2013; +$chanmap->{chan}->[0]->[35]=42; +$chanmap->{fpga}->[0]->[36]=0x2013; +$chanmap->{chan}->[0]->[36]=40; +$chanmap->{fpga}->[0]->[37]=0x2013; +$chanmap->{chan}->[0]->[37]=38; +$chanmap->{fpga}->[0]->[38]=0x2013; +$chanmap->{chan}->[0]->[38]=36; +$chanmap->{fpga}->[0]->[39]=0x2013; +$chanmap->{chan}->[0]->[39]=34; + +$chanmap->{fpga}->[1]->[32]=0x2013; +$chanmap->{chan}->[1]->[32]=47; +$chanmap->{fpga}->[1]->[33]=0x2013; +$chanmap->{chan}->[1]->[33]=45; +$chanmap->{fpga}->[1]->[34]=0x2013; +$chanmap->{chan}->[1]->[34]=43; +$chanmap->{fpga}->[1]->[35]=0x2013; +$chanmap->{chan}->[1]->[35]=41; +$chanmap->{fpga}->[1]->[36]=0x2013; +$chanmap->{chan}->[1]->[36]=39; +$chanmap->{fpga}->[1]->[37]=0x2013; +$chanmap->{chan}->[1]->[37]=37; +$chanmap->{fpga}->[1]->[38]=0x2013; +$chanmap->{chan}->[1]->[38]=35; +$chanmap->{fpga}->[1]->[39]=0x2013; +$chanmap->{chan}->[1]->[39]=33; + +$chanmap->{fpga}->[2]->[32]=0x2013; +$chanmap->{chan}->[2]->[32]=32; +$chanmap->{fpga}->[2]->[33]=0x2013; +$chanmap->{chan}->[2]->[33]=30; +$chanmap->{fpga}->[2]->[34]=0x2013; +$chanmap->{chan}->[2]->[34]=28; +$chanmap->{fpga}->[2]->[35]=0x2013; +$chanmap->{chan}->[2]->[35]=26; +$chanmap->{fpga}->[2]->[36]=0x2013; +$chanmap->{chan}->[2]->[36]=24; +$chanmap->{fpga}->[2]->[37]=0x2013; +$chanmap->{chan}->[2]->[37]=22; +$chanmap->{fpga}->[2]->[38]=0x2013; +$chanmap->{chan}->[2]->[38]=20; +$chanmap->{fpga}->[2]->[39]=0x2013; +$chanmap->{chan}->[2]->[39]=18; + +$chanmap->{fpga}->[3]->[32]=0x2013; +$chanmap->{chan}->[3]->[32]=31; +$chanmap->{fpga}->[3]->[33]=0x2013; +$chanmap->{chan}->[3]->[33]=29; +$chanmap->{fpga}->[3]->[34]=0x2013; +$chanmap->{chan}->[3]->[34]=27; +$chanmap->{fpga}->[3]->[35]=0x2013; +$chanmap->{chan}->[3]->[35]=25; +$chanmap->{fpga}->[3]->[36]=0x2013; +$chanmap->{chan}->[3]->[36]=23; +$chanmap->{fpga}->[3]->[37]=0x2013; +$chanmap->{chan}->[3]->[37]=21; +$chanmap->{fpga}->[3]->[38]=0x2013; +$chanmap->{chan}->[3]->[38]=19; +$chanmap->{fpga}->[3]->[39]=0x2013; +$chanmap->{chan}->[3]->[39]=17; + +$chanmap->{fpga}->[4]->[32]=0x2013; +$chanmap->{chan}->[4]->[32]=16; +$chanmap->{fpga}->[4]->[33]=0x2013; +$chanmap->{chan}->[4]->[33]=14; +$chanmap->{fpga}->[4]->[34]=0x2013; +$chanmap->{chan}->[4]->[34]=12; +$chanmap->{fpga}->[4]->[35]=0x2013; +$chanmap->{chan}->[4]->[35]=10; +$chanmap->{fpga}->[4]->[36]=0x2013; +$chanmap->{chan}->[4]->[36]=8; +$chanmap->{fpga}->[4]->[37]=0x2013; +$chanmap->{chan}->[4]->[37]=6; +$chanmap->{fpga}->[4]->[38]=0x2013; +$chanmap->{chan}->[4]->[38]=4; +$chanmap->{fpga}->[4]->[39]=0x2013; +$chanmap->{chan}->[4]->[39]=2; + +$chanmap->{fpga}->[5]->[32]=0x2013; +$chanmap->{chan}->[5]->[32]=15; +$chanmap->{fpga}->[5]->[33]=0x2013; +$chanmap->{chan}->[5]->[33]=13; +$chanmap->{fpga}->[5]->[34]=0x2013; +$chanmap->{chan}->[5]->[34]=11; +$chanmap->{fpga}->[5]->[35]=0x2013; +$chanmap->{chan}->[5]->[35]=9; +$chanmap->{fpga}->[5]->[36]=0x2013; +$chanmap->{chan}->[5]->[36]=7; +$chanmap->{fpga}->[5]->[37]=0x2013; +$chanmap->{chan}->[5]->[37]=5; +$chanmap->{fpga}->[5]->[38]=0x2013; +$chanmap->{chan}->[5]->[38]=3; +$chanmap->{fpga}->[5]->[39]=0x2013; +$chanmap->{chan}->[5]->[39]=1; + +$chanmap->{fpga}->[6]->[32]=0x2012; +$chanmap->{chan}->[6]->[32]=48; +$chanmap->{fpga}->[6]->[33]=0x2012; +$chanmap->{chan}->[6]->[33]=46; +$chanmap->{fpga}->[6]->[34]=0x2012; +$chanmap->{chan}->[6]->[34]=44; +$chanmap->{fpga}->[6]->[35]=0x2012; +$chanmap->{chan}->[6]->[35]=42; +$chanmap->{fpga}->[6]->[36]=0x2012; +$chanmap->{chan}->[6]->[36]=40; +$chanmap->{fpga}->[6]->[37]=0x2012; +$chanmap->{chan}->[6]->[37]=38; +$chanmap->{fpga}->[6]->[38]=0x2012; +$chanmap->{chan}->[6]->[38]=36; +$chanmap->{fpga}->[6]->[39]=0x2012; +$chanmap->{chan}->[6]->[39]=34; + +$chanmap->{fpga}->[7]->[32]=0x2012; +$chanmap->{chan}->[7]->[32]=47; +$chanmap->{fpga}->[7]->[33]=0x2012; +$chanmap->{chan}->[7]->[33]=45; +$chanmap->{fpga}->[7]->[34]=0x2012; +$chanmap->{chan}->[7]->[34]=43; +$chanmap->{fpga}->[7]->[35]=0x2012; +$chanmap->{chan}->[7]->[35]=41; +$chanmap->{fpga}->[7]->[36]=0x2012; +$chanmap->{chan}->[7]->[36]=39; +$chanmap->{fpga}->[7]->[37]=0x2012; +$chanmap->{chan}->[7]->[37]=37; +$chanmap->{fpga}->[7]->[38]=0x2012; +$chanmap->{chan}->[7]->[38]=35; +$chanmap->{fpga}->[7]->[39]=0x2012; +$chanmap->{chan}->[7]->[39]=33; + + +$chanmap->{fpga}->[8]->[32]=0x2012; +$chanmap->{chan}->[8]->[32]=32; +$chanmap->{fpga}->[8]->[33]=0x2012; +$chanmap->{chan}->[8]->[33]=30; +$chanmap->{fpga}->[8]->[34]=0x2012; +$chanmap->{chan}->[8]->[34]=28; +$chanmap->{fpga}->[8]->[35]=0x2012; +$chanmap->{chan}->[8]->[35]=26; +$chanmap->{fpga}->[8]->[36]=0x2012; +$chanmap->{chan}->[8]->[36]=24; +$chanmap->{fpga}->[8]->[37]=0x2012; +$chanmap->{chan}->[8]->[37]=22; +$chanmap->{fpga}->[8]->[38]=0x2012; +$chanmap->{chan}->[8]->[38]=20; +$chanmap->{fpga}->[8]->[39]=0x2012; +$chanmap->{chan}->[8]->[39]=18; + +$chanmap->{fpga}->[9]->[32]=0x2012; +$chanmap->{chan}->[9]->[32]=31; +$chanmap->{fpga}->[9]->[33]=0x2012; +$chanmap->{chan}->[9]->[33]=29; +$chanmap->{fpga}->[9]->[34]=0x2012; +$chanmap->{chan}->[9]->[34]=27; +$chanmap->{fpga}->[9]->[35]=0x2012; +$chanmap->{chan}->[9]->[35]=25; +$chanmap->{fpga}->[9]->[36]=0x2012; +$chanmap->{chan}->[9]->[36]=23; +$chanmap->{fpga}->[9]->[37]=0x2012; +$chanmap->{chan}->[9]->[37]=21; +$chanmap->{fpga}->[9]->[38]=0x2012; +$chanmap->{chan}->[9]->[38]=19; +$chanmap->{fpga}->[9]->[39]=0x2012; +$chanmap->{chan}->[9]->[39]=17; + +$chanmap->{fpga}->[10]->[32]=0x2012; +$chanmap->{chan}->[10]->[32]=16; +$chanmap->{fpga}->[10]->[33]=0x2012; +$chanmap->{chan}->[10]->[33]=14; +$chanmap->{fpga}->[10]->[34]=0x2012; +$chanmap->{chan}->[10]->[34]=12; +$chanmap->{fpga}->[10]->[35]=0x2012; +$chanmap->{chan}->[10]->[35]=10; +$chanmap->{fpga}->[10]->[36]=0x2012; +$chanmap->{chan}->[10]->[36]=8; +$chanmap->{fpga}->[10]->[37]=0x2012; +$chanmap->{chan}->[10]->[37]=6; +$chanmap->{fpga}->[10]->[38]=0x2012; +$chanmap->{chan}->[10]->[38]=4; +$chanmap->{fpga}->[10]->[39]=0x2012; +$chanmap->{chan}->[10]->[39]=2; + +$chanmap->{fpga}->[11]->[32]=0x2012; +$chanmap->{chan}->[11]->[32]=15; +$chanmap->{fpga}->[11]->[33]=0x2012; +$chanmap->{chan}->[11]->[33]=13; +$chanmap->{fpga}->[11]->[34]=0x2012; +$chanmap->{chan}->[11]->[34]=11; +$chanmap->{fpga}->[11]->[35]=0x2012; +$chanmap->{chan}->[11]->[35]=9; +$chanmap->{fpga}->[11]->[36]=0x2012; +$chanmap->{chan}->[11]->[36]=7; +$chanmap->{fpga}->[11]->[37]=0x2012; +$chanmap->{chan}->[11]->[37]=5; +$chanmap->{fpga}->[11]->[38]=0x2012; +$chanmap->{chan}->[11]->[38]=3; +$chanmap->{fpga}->[11]->[39]=0x2012; +$chanmap->{chan}->[11]->[39]=1; + +$chanmap->{fpga}->[12]->[32]=0x2011; +$chanmap->{chan}->[12]->[32]=48; +$chanmap->{fpga}->[12]->[33]=0x2011; +$chanmap->{chan}->[12]->[33]=46; +$chanmap->{fpga}->[12]->[34]=0x2011; +$chanmap->{chan}->[12]->[34]=44; +$chanmap->{fpga}->[12]->[35]=0x2011; +$chanmap->{chan}->[12]->[35]=42; +$chanmap->{fpga}->[12]->[36]=0x2011; +$chanmap->{chan}->[12]->[36]=40; +$chanmap->{fpga}->[12]->[37]=0x2011; +$chanmap->{chan}->[12]->[37]=38; +$chanmap->{fpga}->[12]->[38]=0x2011; +$chanmap->{chan}->[12]->[38]=36; +$chanmap->{fpga}->[12]->[39]=0x2011; +$chanmap->{chan}->[12]->[39]=34; + +$chanmap->{fpga}->[13]->[32]=0x2011; +$chanmap->{chan}->[13]->[32]=47; +$chanmap->{fpga}->[13]->[33]=0x2011; +$chanmap->{chan}->[13]->[33]=45; +$chanmap->{fpga}->[13]->[34]=0x2011; +$chanmap->{chan}->[13]->[34]=43; +$chanmap->{fpga}->[13]->[35]=0x2011; +$chanmap->{chan}->[13]->[35]=41; +$chanmap->{fpga}->[13]->[36]=0x2011; +$chanmap->{chan}->[13]->[36]=39; +$chanmap->{fpga}->[13]->[37]=0x2011; +$chanmap->{chan}->[13]->[37]=37; +$chanmap->{fpga}->[13]->[38]=0x2011; +$chanmap->{chan}->[13]->[38]=35; +$chanmap->{fpga}->[13]->[39]=0x2011; +$chanmap->{chan}->[13]->[39]=33; + +$chanmap->{fpga}->[14]->[32]=0x2011; +$chanmap->{chan}->[14]->[32]=32; +$chanmap->{fpga}->[14]->[33]=0x2011; +$chanmap->{chan}->[14]->[33]=30; +$chanmap->{fpga}->[14]->[34]=0x2011; +$chanmap->{chan}->[14]->[34]=28; +$chanmap->{fpga}->[14]->[35]=0x2011; +$chanmap->{chan}->[14]->[35]=26; +$chanmap->{fpga}->[14]->[36]=0x2011; +$chanmap->{chan}->[14]->[36]=24; +$chanmap->{fpga}->[14]->[37]=0x2011; +$chanmap->{chan}->[14]->[37]=22; +$chanmap->{fpga}->[14]->[38]=0x2011; +$chanmap->{chan}->[14]->[38]=20; +$chanmap->{fpga}->[14]->[39]=0x2011; +$chanmap->{chan}->[14]->[39]=18; + +$chanmap->{fpga}->[15]->[32]=0x2011; +$chanmap->{chan}->[15]->[32]=31; +$chanmap->{fpga}->[15]->[33]=0x2011; +$chanmap->{chan}->[15]->[33]=29; +$chanmap->{fpga}->[15]->[34]=0x2011; +$chanmap->{chan}->[15]->[34]=27; +$chanmap->{fpga}->[15]->[35]=0x2011; +$chanmap->{chan}->[15]->[35]=25; +$chanmap->{fpga}->[15]->[36]=0x2011; +$chanmap->{chan}->[15]->[36]=23; +$chanmap->{fpga}->[15]->[37]=0x2011; +$chanmap->{chan}->[15]->[37]=21; +$chanmap->{fpga}->[15]->[38]=0x2011; +$chanmap->{chan}->[15]->[38]=19; +$chanmap->{fpga}->[15]->[39]=0x2011; +$chanmap->{chan}->[15]->[39]=17; + + +$chanmap->{fpga}->[16]->[32]=0x2011; +$chanmap->{chan}->[16]->[32]=16; +$chanmap->{fpga}->[16]->[33]=0x2011; +$chanmap->{chan}->[16]->[33]=14; +$chanmap->{fpga}->[16]->[34]=0x2011; +$chanmap->{chan}->[16]->[34]=12; +$chanmap->{fpga}->[16]->[35]=0x2011; +$chanmap->{chan}->[16]->[35]=10; +$chanmap->{fpga}->[16]->[36]=0x2011; +$chanmap->{chan}->[16]->[36]=8; +$chanmap->{fpga}->[16]->[37]=0x2011; +$chanmap->{chan}->[16]->[37]=6; +$chanmap->{fpga}->[16]->[38]=0x2011; +$chanmap->{chan}->[16]->[38]=4; +$chanmap->{fpga}->[16]->[39]=0x2011; +$chanmap->{chan}->[16]->[39]=2; + +$chanmap->{fpga}->[17]->[32]=0x2011; +$chanmap->{chan}->[17]->[32]=15; +$chanmap->{fpga}->[17]->[33]=0x2011; +$chanmap->{chan}->[17]->[33]=13; +$chanmap->{fpga}->[17]->[34]=0x2011; +$chanmap->{chan}->[17]->[34]=11; +$chanmap->{fpga}->[17]->[35]=0x2011; +$chanmap->{chan}->[17]->[35]=9; +$chanmap->{fpga}->[17]->[36]=0x2011; +$chanmap->{chan}->[17]->[36]=7; +$chanmap->{fpga}->[17]->[37]=0x2011; +$chanmap->{chan}->[17]->[37]=5; +$chanmap->{fpga}->[17]->[38]=0x2011; +$chanmap->{chan}->[17]->[38]=3; +$chanmap->{fpga}->[17]->[39]=0x2011; +$chanmap->{chan}->[17]->[39]=1; + +$chanmap->{fpga}->[18]->[32]=0x2010; +$chanmap->{chan}->[18]->[32]=48; +$chanmap->{fpga}->[18]->[33]=0x2010; +$chanmap->{chan}->[18]->[33]=46; +$chanmap->{fpga}->[18]->[34]=0x2010; +$chanmap->{chan}->[18]->[34]=44; +$chanmap->{fpga}->[18]->[35]=0x2010; +$chanmap->{chan}->[18]->[35]=42; +$chanmap->{fpga}->[18]->[36]=0x2010; +$chanmap->{chan}->[18]->[36]=40; +$chanmap->{fpga}->[18]->[37]=0x2010; +$chanmap->{chan}->[18]->[37]=38; +$chanmap->{fpga}->[18]->[38]=0x2010; +$chanmap->{chan}->[18]->[38]=36; +$chanmap->{fpga}->[18]->[39]=0x2010; +$chanmap->{chan}->[18]->[39]=34; + +$chanmap->{fpga}->[19]->[32]=0x2010; +$chanmap->{chan}->[19]->[32]=47; +$chanmap->{fpga}->[19]->[33]=0x2010; +$chanmap->{chan}->[19]->[33]=45; +$chanmap->{fpga}->[19]->[34]=0x2010; +$chanmap->{chan}->[19]->[34]=43; +$chanmap->{fpga}->[19]->[35]=0x2010; +$chanmap->{chan}->[19]->[35]=41; +$chanmap->{fpga}->[19]->[36]=0x2010; +$chanmap->{chan}->[19]->[36]=39; +$chanmap->{fpga}->[19]->[37]=0x2010; +$chanmap->{chan}->[19]->[37]=37; +$chanmap->{fpga}->[19]->[38]=0x2010; +$chanmap->{chan}->[19]->[38]=35; +$chanmap->{fpga}->[19]->[39]=0x2010; +$chanmap->{chan}->[19]->[39]=33; + +$chanmap->{fpga}->[20]->[32]=0x2010; +$chanmap->{chan}->[20]->[32]=32; +$chanmap->{fpga}->[20]->[33]=0x2010; +$chanmap->{chan}->[20]->[33]=30; +$chanmap->{fpga}->[20]->[34]=0x2010; +$chanmap->{chan}->[20]->[34]=28; +$chanmap->{fpga}->[20]->[35]=0x2010; +$chanmap->{chan}->[20]->[35]=26; +$chanmap->{fpga}->[20]->[36]=0x2010; +$chanmap->{chan}->[20]->[36]=24; +$chanmap->{fpga}->[20]->[37]=0x2010; +$chanmap->{chan}->[20]->[37]=22; +$chanmap->{fpga}->[20]->[38]=0x2010; +$chanmap->{chan}->[20]->[38]=20; +$chanmap->{fpga}->[20]->[39]=0x2010; +$chanmap->{chan}->[20]->[39]=18; + +$chanmap->{fpga}->[21]->[32]=0x2010; +$chanmap->{chan}->[21]->[32]=31; +$chanmap->{fpga}->[21]->[33]=0x2010; +$chanmap->{chan}->[21]->[33]=29; +$chanmap->{fpga}->[21]->[34]=0x2010; +$chanmap->{chan}->[21]->[34]=27; +$chanmap->{fpga}->[21]->[35]=0x2010; +$chanmap->{chan}->[21]->[35]=25; +$chanmap->{fpga}->[21]->[36]=0x2010; +$chanmap->{chan}->[21]->[36]=23; +$chanmap->{fpga}->[21]->[37]=0x2010; +$chanmap->{chan}->[21]->[37]=21; +$chanmap->{fpga}->[21]->[38]=0x2010; +$chanmap->{chan}->[21]->[38]=19; +$chanmap->{fpga}->[21]->[39]=0x2010; +$chanmap->{chan}->[21]->[39]=17; + +$chanmap->{fpga}->[22]->[32]=0x2010; +$chanmap->{chan}->[22]->[32]=16; +$chanmap->{fpga}->[22]->[33]=0x2010; +$chanmap->{chan}->[22]->[33]=14; +$chanmap->{fpga}->[22]->[34]=0x2010; +$chanmap->{chan}->[22]->[34]=12; +$chanmap->{fpga}->[22]->[35]=0x2010; +$chanmap->{chan}->[22]->[35]=10; +$chanmap->{fpga}->[22]->[36]=0x2010; +$chanmap->{chan}->[22]->[36]=8; +$chanmap->{fpga}->[22]->[37]=0x2010; +$chanmap->{chan}->[22]->[37]=6; +$chanmap->{fpga}->[22]->[38]=0x2010; +$chanmap->{chan}->[22]->[38]=4; +$chanmap->{fpga}->[22]->[39]=0x2010; +$chanmap->{chan}->[22]->[39]=2; + +$chanmap->{fpga}->[23]->[32]=0x2010; +$chanmap->{chan}->[23]->[32]=15; +$chanmap->{fpga}->[23]->[33]=0x2010; +$chanmap->{chan}->[23]->[33]=13; +$chanmap->{fpga}->[23]->[34]=0x2010; +$chanmap->{chan}->[23]->[34]=11; +$chanmap->{fpga}->[23]->[35]=0x2010; +$chanmap->{chan}->[23]->[35]=9; +$chanmap->{fpga}->[23]->[36]=0x2010; +$chanmap->{chan}->[23]->[36]=7; +$chanmap->{fpga}->[23]->[37]=0x2010; +$chanmap->{chan}->[23]->[37]=5; +$chanmap->{fpga}->[23]->[38]=0x2010; +$chanmap->{chan}->[23]->[38]=3; +$chanmap->{fpga}->[23]->[39]=0x2010; +$chanmap->{chan}->[23]->[39]=1; + diff --git a/users/gsi_dirc/addresses_trb3.db b/users/gsi_dirc/addresses_trb3.db index ee9456a..fe452f4 100644 --- a/users/gsi_dirc/addresses_trb3.db +++ b/users/gsi_dirc/addresses_trb3.db @@ -23,11 +23,17 @@ 0x2007 99 3 0x8001 99 5 -0x2008 78 0 -0x2009 78 1 -0x200a 78 2 -0x200b 78 3 -0x8002 78 5 +#0x2008 78 0 +#0x2009 78 1 +#0x200a 78 2 +#0x200b 78 3 +#0x8002 78 5 +0x2008 73 0 +0x2009 73 1 +0x200a 73 2 +0x200b 73 3 +0x8002 73 5 + 0x200c 74 0 0x200d 74 1 @@ -84,4 +90,9 @@ 0x202a 77 2 0x202b 77 3 0x800a 77 5 - +#AUX +0x202c 57 0 +0x202d 57 1 +0x202e 57 2 +0x202f 57 3 +0x800b 57 5 diff --git a/users/gsi_dirc/barreloff.pl b/users/gsi_dirc/barreloff.pl new file mode 100644 index 0000000..b2e2ea9 --- /dev/null +++ b/users/gsi_dirc/barreloff.pl @@ -0,0 +1,7 @@ +#!/usr/bin/perl + + +foreach my $i (0x2000..0x2013) { + system("trbcmd w $i 0xc802 0"); + system("trbcmd w $i 0xc803 0"); + } diff --git a/users/gsi_dirc/check_ping.pl b/users/gsi_dirc/check_ping.pl index cd20621..cc33663 100755 --- a/users/gsi_dirc/check_ping.pl +++ b/users/gsi_dirc/check_ping.pl @@ -5,12 +5,12 @@ use strict; use Parallel::ForkManager; use Net::Ping; -my @trbs = (56, 72, 99, 78, 74, 104, 97, 83, 89, 111, 13, 77, 57); +my @trbs = (56, 72, 99, 73, 74, 104, 97, 83, 89, 111, 13, 77, 57); my $map = { 0 => { trb => 72, sys => "MCP 00"}, 1 => { trb => 99, sys => "MCP 01"}, - 2 => { trb => 78, sys => "MCP 02"}, + 2 => { trb => 73, sys => "MCP 02"}, 3 => { trb => 74, sys => "MCP 03"}, 4 => { trb => 104, sys => "MCP 04"}, 5 => { trb => 97, sys => "TOF 1"}, diff --git a/users/gsi_dirc/dmon_config.pl b/users/gsi_dirc/dmon_config.pl new file mode 100755 index 0000000..64e2602 --- /dev/null +++ b/users/gsi_dirc/dmon_config.pl @@ -0,0 +1,126 @@ +#This a an example configuration file. Copy this file to your user directory and give +#start.pl a link to this file as first argument. + +#Scripts to start & order of icons in the Overview +activeScripts => [['time','ping','-','-','daqop'], + ['numfee','temperature','reftime','trgerrors','-'], + ['beamintensity','beammonitors','-','-','-'], + ['trgrate','datarate','deadtime','-','-'], + ['padiwatemp','padiwaonline','-','-','-'], + ['heatmapdirc','heatmapflash','heatmapdiscdirc','-','-'], + ['evtbnetmem','eb2','eb3','-','-'], + ], + +#Names to be shown in left column of Overview (max 4 letters!) +qaNames => ['sys','main','beam','rate','Pdwa','Heat','EB'], + +#Expected number of FPGAs in system +NumberOfFpga => 58, +NumberOfPadiwa => 87, + +#The address of the individual boards +CtsAddress => 0x7999, +PadiwaBroadcastAddress => 0xfe4c, + +PadiwaTrbAddresses => [0x2000,0x2001,0x2002,0x2003,0x2004,0x2005,0x2006,0x2007, + 0x2008,0x2009,0x200a,0x200b,0x200c,0x200d,0x200e,0x200f, + 0x2010,0x2011,0x2012,0x2013,0x2014,0x2015,0x2016,0x2018, + 0x2019,0x201a,0x201c,0x2024,0x2025,0x2026,0x2027,0x2028], +PadiwaChainMask => [0x0007,0x0007,0x0007,0x0007,0x0007,0x0007,0x0007,0x0007, + 0x0007,0x0007,0x0007,0x0007,0x0007,0x0007,0x0007,0x0007, + 0x0007,0x0007,0x0007,0x0007,0x0001,0x0003,0x0003,0x0001, + 0x0003,0x0003,0x0003,0x0007,0x0007,0x0007,0x0007,0x0007], + +#0x2020,0x2023, no padiwa +#,0x201d,0x201e,0x201f off +#0x2029,0x202a,0x202b,0x202c,0x202d,0x202e,0x202f +OtherTrbAddresses => [0x7999,0x2020,0x2023,0x202c,0x202d], + + + +HubTrbAddresses => [0x8100,0x8101,0x8102,0x8103,0x8000,0X8001,0x8002,0x8003,0x8004,0x8005,0x8006,0x8007,0x8008,0x8009,0x800a,0x800b], + + +#Addresses of all TDCs. Either single or broadcast addresses +TdcAddress => [0xfe4c,0xfe48,0xfe4a], + +#IPs of all devices which should react on a ping +TrbIP => [ + "192.168.0.72", + "192.168.0.99", + "192.168.0.73", + "192.168.0.74", + "192.168.0.104", + "192.168.0.97", + "192.168.0.83", + "192.168.0.89", + "192.168.0.111", + "192.168.0.13", + "192.168.0.77", + "192.168.0.56" +], + +#Channel to read spill intensity from. Give limit for off-spill detection +BeamTRB => 0x202c, +BeamChan => 0xc001, +SpillThreshold => 50, + +#Name detectors +BeamDetectorsTrb => [0x202c,0x202c,0x202c,0x2014,0x2018], +BeamDetectorsChan => [0xc001,0xc005,0xc003,0xc001,0xc001], +BeamDetectorsName => ['Trig1','Trig2','Laser1','MCP1','MCP2'], +#BeamDetectorsTrb => [0x0110, 0x0110, 0x0111,0x0110,0x0111,0x0110,0x0113,0x0111,0x0110], +#BeamDetectorsChan => [0xc001, 0xc003, 0xc001,0xc009,0xc005,0xc00b,0xc009,0xc009,0xc005], +#BeamDetectorsName => ['Fngr_d', 'Lead_d', 'C1', 'C1_d', 'C2', 'C2_d', 'Lead1', 'Lead2', 'Hodo'], + +#User directory +UserDirectory => '/home/hadaq/trbsoft/daqtools/users/gsi_dirc/', +#PowerSupScript => 'measure_powers.sh' # relative to user dir + +#BarrelDirc Heatmap settings +HeatmapDirc => { + # upper limit for high end of color scale + max_count_uclamp => 100000, + # lower limit for high end of color scale + max_count_lclamp => 10, + + # when set to 1 normalization of color scale is instantaneous, + # when set to 0, normalization has "inertia" + instant_normalization => 1, + + # the inertia of the adaption of the color scale in the unit of 1/(gliding average weight) + normalization_inertia => 3 +}, + +HeatmapFlash => { + # upper limit for high end of color scale + max_count_uclamp => 200000, + # lower limit for high end of color scale + max_count_lclamp => 10, + + # when set to 1 normalization of color scale is instantaneous, + # when set to 0, normalization has "inertia" + instant_normalization => 1, + + # the inertia of the adaption of the color scale in the unit of 1/(gliding average weight) + normalization_inertia => 3 +}, + +HeatmapDiscDirc => { + # upper limit for high end of color scale + max_count_uclamp => 100000, + # lower limit for high end of color scale + max_count_lclamp => 30, + + # when set to 1 normalization of color scale is instantaneous, + # when set to 0, normalization has "inertia" + instant_normalization => 1, + + # the inertia of the adaption of the color scale in the unit of 1/(gliding average weight) + normalization_inertia => 3 +}, + +EvtbNetmem => { + shm_string => "test" +} + diff --git a/users/gsi_dirc/dmon_restart.pl b/users/gsi_dirc/dmon_restart.pl new file mode 100755 index 0000000..2620a7c --- /dev/null +++ b/users/gsi_dirc/dmon_restart.pl @@ -0,0 +1,5 @@ +#!/bin/bash + +cd ../../dmon +./stop.pl +./start.pl ../users/gsi_dirc/dmon_config.pl diff --git a/users/gsi_dirc/makethresholds.sh b/users/gsi_dirc/makethresholds.sh new file mode 100755 index 0000000..4358c78 --- /dev/null +++ b/users/gsi_dirc/makethresholds.sh @@ -0,0 +1,39 @@ +#!/bin/bash +rm padiwa_threshold_results.log +# ./write_thresholds.pl thresh/dummythresholds.thr -o 0 +trbcmd setbit 0x7999 0xa00c 0x80000000 + +./run_thresh_on_system.pl --endpoints=0x2000..0x2013\ + --chains=0..2 --offset=0 --polarity 1 --tool ./thresholds_new.pl + +export TIMEST=`date +%Y%m%d%H%M` + +mv padiwa_threshold_results.log thresh/$TIMEST.thr + +./write_thresholds.pl thresh/$TIMEST.thr -o 0 +trbcmd clearbit 0x7999 0xa00c 0x80000000 + + + + + + +# ./run_thresh_on_system.pl \ +# --endpoints=0x0013,0x0021,0x0033,0x0041,0x0053,0x0061,0x0073,0x0081,0x0093,0x00a1,0x00b3,0x00c1,0x00d3,0x00e1,0x00f3,0x0101 \ +# --32channel --chains=0 --offset=0 --polarity 1 +# ./write_thresholds.pl thresh/dummythresholds.thr -o 0 +# ./run_thresh_on_system.pl \ +# --endpoints=0x0012,0x0020,0x0032,0x0040,0x0052,0x0060,0x0072,0x0080,0x0092,0x00a0,0x00b2,0x00c0,0x00d2,0x00e0,0x00f2,0x0100 \ +# --32channel --chains=0 --offset=0 --polarity 1 +# ./write_thresholds.pl thresh/dummythresholds.thr -o 0 +# ./run_thresh_on_system.pl \ +# --endpoints=0x0011,0x0023,0x0031,0x0043,0x0051,0x0063,0x0071,0x0083,0x0091,0x00a3,0x00b1,0x00c3,0x00d1,0x00e3,0x00f1,0x0103 \ +# --32channel --chains=0 --offset=0 --polarity 1 +# ./write_thresholds.pl thresh/dummythresholds.thr -o 0 +# ./run_thresh_on_system.pl \ +# --endpoints=0x0010,0x0022,0x0030,0x0042,0x0050,0x0062,0x0070,0x0082,0x0090,0x00a2,0x00b0,0x00c2,0x00d0,0x00e2,0x00f0,0x0102 \ +# --32channel --chains=0 --offset=0 --polarity 1 + +# +# ./run_thresh_on_system.pl --endpoints=0x0010-0x0013,0x0020-0x0023,0x0030-0x0033,0x0040-0x0043,0x0050-0x0053,0x0060-0x0063,0x0070-0x0073,0x0080-0x0083,0x0090-0x0093,0x00a0-0x00a3,0x00b0-0x00b3,0x00c0-0x00c3,0x00d0-0x00d3,0x00e0-0x00e3,0x00f0-0x00f3,0x0100-0x0103\ +# --32channel --chains=0 --offset=0 --polarity 0 --tool ./thresholds_automatic.pl diff --git a/users/gsi_dirc/register_config_tdc.db b/users/gsi_dirc/register_config_tdc.db index eeb6234..8f5ddf1 100644 --- a/users/gsi_dirc/register_config_tdc.db +++ b/users/gsi_dirc/register_config_tdc.db @@ -35,6 +35,12 @@ 0x201f 0 0x00000000 0x00000000 #DISC DIRC -# 0x2029 0 0x00000000 0x00000000 -# 0x202a 0 0x00000000 0x00000000 -# 0x202b 0 0x00000000 0x00000000 + 0x2029 0 0x00000000 0x00000000 + 0x202a 0 0x00000000 0x00000000 + 0x202b 0 0x00000000 0x00000000 + +# AUX + 0x202c 0 0xffffffff 0x00000000 + 0x202d 0 0xffffffff 0x00000000 + 0x202e 0 0x00000000 0x00000000 + 0x202f 0 0x00000000 0x00000000 diff --git a/users/gsi_dirc/register_configgbe.db b/users/gsi_dirc/register_configgbe.db index d111505..af8961d 100755 --- a/users/gsi_dirc/register_configgbe.db +++ b/users/gsi_dirc/register_configgbe.db @@ -21,9 +21,9 @@ 0x8006 0 0x8006 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 0x8007 0 0x8007 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 0x8008 0 0x8008 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 -# 0x8009 0 0x8009 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 -# 0x8010 0 0x8010 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 -# 0x8011 0 0x8011 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 + 0x8009 0 0x8009 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 + 0x800a 0 0x800a 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 + 0x800b 0 0x800b 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 # 0x8012 0 0x8012 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 # 0x8013 0 0x8013 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 # 0x8014 0 0x8014 0x00020001 0x00030064 0x1DE8 0x578 1 0 1 1 0x0 diff --git a/users/gsi_dirc/register_configgbe_ip.db b/users/gsi_dirc/register_configgbe_ip.db index 96037fb..e665b27 100755 --- a/users/gsi_dirc/register_configgbe_ip.db +++ b/users/gsi_dirc/register_configgbe_ip.db @@ -28,34 +28,19 @@ # Hub # Type # C0 # C1 # C2 # C3 # C4 # C5 # C6 # C7 # C8 # ######################################################################################################################################## - 0x7999 0 0x1e04f330 0x000e 0xc0a80003 0xc34f 0xdead8000 0x001b 0xc0a80000 0xc350 0x0578 - 0x8000 0 0x1e04f330 0x000e 0xc0a80003 0xc350 0xdead8001 0x001b 0xc0a80001 0xc351 0x0578 - 0x8001 0 0x1e04f330 0x000e 0xc0a80003 0xc351 0xdead8002 0x001b 0xc0a80002 0xc352 0x0578 - 0x8002 0 0x1e04f330 0x000e 0xc0a80003 0xc352 0xdead8003 0x001b 0xc0a80003 0xc353 0x0578 - 0x8003 0 0x1e04f330 0x000e 0xc0a80003 0xc353 0xdead8004 0x001b 0xc0a80004 0xc354 0x0578 - 0x8004 0 0x1e04f330 0x000e 0xc0a80003 0xc354 0xdead8005 0x001b 0xc0a80005 0xc355 0x0578 - 0x8005 0 0x1e04f330 0x000e 0xc0a80003 0xc355 0xdead8006 0x001b 0xc0a80006 0xc356 0x0578 - 0x8006 0 0x1e04f330 0x000e 0xc0a80003 0xc356 0xdead8007 0x001b 0xc0a80007 0xc357 0x0578 - 0x8007 0 0x1e04f330 0x000e 0xc0a80003 0xc357 0xdead8008 0x001b 0xc0a80008 0xc358 0x0578 - 0x8008 0 0x1e04f330 0x000e 0xc0a80003 0xc358 0xdead8009 0x001b 0xc0a80009 0xc359 0x0578 -# 0x8009 0 0x1e04f330 0x000e 0xc0a80003 0xc359 0xdead8010 0x001b 0xc0a80010 0xc35a 0x0578 -# 0x8010 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc35b 0xdead8011 0x001b 0xc0a80011 0xc35b 0x0578 -# 0x8011 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc35c 0xdead8012 0x001b 0xc0a80012 0xc35c 0x0578 -# 0x8012 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc35d 0xdead8013 0x001b 0xc0a80013 0xc35d 0x0578 -# 0x8013 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc35e 0xdead8014 0x001b 0xc0a80014 0xc35e 0x0578 -# 0x8014 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc35f 0xdead8015 0x001b 0xc0a80015 0xc35f 0x0578 -# 0x8015 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc360 0xdead8016 0x001b 0xc0a80016 0xc360 0x0578 -# 0x8016 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc361 0xdead8017 0x001b 0xc0a80017 0xc361 0x0578 -# 0x8017 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc362 0xdead8018 0x001b 0xc0a80018 0xc362 0x0578 -# 0x8018 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc363 0xdead8019 0x001b 0xc0a80019 0xc363 0x0578 -# 0x8019 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc364 0xdead8020 0x001b 0xc0a80020 0xc364 0x0578 -# 0x8020 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc365 0xdead8021 0x001b 0xc0a80021 0xc365 0x0578 -# 0x8021 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc366 0xdead8022 0x001b 0xc0a80022 0xc366 0x0578 -#0x8022 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc367 0xdead8023 0x001b 0xc0a80023 0xc367 0x0578 -#0x8023 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc368 0xdead8024 0x001b 0xc0a80024 0xc368 0x0578 -#0x8024 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc369 0xdead8025 0x001b 0xc0a80025 0xc369 0x0578 -#0x8025 0 0x7a0b83ca 0x0cc4 0xc0a80002 0xc36a 0xdead8026 0x001b 0xc0a80026 0xc36a 0x00cc4 - + 0x7999 0 0x1e04f330 0x000e 0xc0a80003 0xc34f 0xdead7fff 0x001b 0xc0a80000 0xc350 0x0578 + 0x8000 0 0x1e04f330 0x000e 0xc0a80003 0xc350 0xdead8000 0x001b 0xc0a80001 0xc351 0x0578 + 0x8001 0 0x1e04f330 0x000e 0xc0a80003 0xc351 0xdead8001 0x001b 0xc0a80002 0xc352 0x0578 + 0x8002 0 0x1e04f330 0x000e 0xc0a80003 0xc352 0xdead8002 0x001b 0xc0a80003 0xc353 0x0578 + 0x8003 0 0x1e04f330 0x000e 0xc0a80003 0xc353 0xdead8003 0x001b 0xc0a80004 0xc354 0x0578 + 0x8004 0 0x1e04f330 0x000e 0xc0a80003 0xc354 0xdead8004 0x001b 0xc0a80005 0xc355 0x0578 + 0x8005 0 0x1e04f330 0x000e 0xc0a80003 0xc355 0xdead8005 0x001b 0xc0a80006 0xc356 0x0578 + 0x8006 0 0x1e04f330 0x000e 0xc0a80003 0xc356 0xdead8006 0x001b 0xc0a80007 0xc357 0x0578 + 0x8007 0 0x1e04f330 0x000e 0xc0a80003 0xc357 0xdead8007 0x001b 0xc0a80008 0xc358 0x0578 + 0x8008 0 0x1e04f330 0x000e 0xc0a80003 0xc358 0xdead8008 0x001b 0xc0a80009 0xc359 0x0578 + 0x8009 0 0x1e04f330 0x000e 0xc0a80003 0xc359 0xdead8009 0x001b 0xc0a8000a 0xc35a 0x0578 + 0x800a 0 0x1e04f330 0x000e 0xc0a80003 0xc35a 0xdead800a 0x001b 0xc0a8000b 0xc35b 0x0578 + 0x800b 0 0x1e04f330 0x000e 0xc0a80003 0xc35b 0xdead800b 0x001b 0xc0a8000c 0xc35c 0x0578 # 0x7999 0 0x1e04f330 0x000e 0xc0a80002 0xc350 0xdead8000 0x001b 0xc0a80000 0xc350 0x0578 # 0x8000 0 0x1e04f330 0x000e 0xc0a80002 0xc351 0xdead8001 0x001b 0xc0a80001 0xc351 0x0578 diff --git a/users/gsi_dirc/start_readout.pl b/users/gsi_dirc/start_readout.pl index 87fac05..a75a216 100755 --- a/users/gsi_dirc/start_readout.pl +++ b/users/gsi_dirc/start_readout.pl @@ -7,12 +7,14 @@ my $help = ""; my $dataPath = "/d/may2015/"; my $label = "test"; my $time = -1; +my $name = "cc"; my $c; my $result = GetOptions ( "h|help" => \$help, "t|time=i" => \$time, "l|label=s" => \$label, + "n|filename=s" => \$name, "p|path=s" => \$dataPath ); @@ -32,14 +34,14 @@ $c=qq|pkill -f "daq_evtbuild -S $label"|; qx($c); # if any, kill existing daq_ev $c=qq|pkill -f "daq_netmem -S $label"|; qx($c); # if any, kill existing daq_netmem -$c=qq|xterm -geometry 122x15-0+0 -e bash -c 'daq_evtbuild -S $label -m 10 -x cc -d file -o $dataPath'|; -#$c=qq|xterm -geometry 122x16-0+0 -e bash -c 'daq_evtbuild -S $label -m 23 -x cc -d file -o $dataPath'|; +$c=qq|xterm -geometry 122x15-0+0 -e bash -c 'daq_evtbuild -S $label -m 13 -x $name --filesize 512 -d file -o $dataPath'|; +#$c=qq|xterm -geometry 122x16-0+0 -e bash -c 'daq_evtbuild -S $label -m 23 -x $name -d file -o $dataPath'|; #print $c; system("$c &"); sleep 1; -$c=qq"xterm -geometry 82x35-0+210 -e bash -c 'daq_netmem -S $label -m 10 -i UDP:127.0.0.1:49999 -i UDP:127.0.0.1:50000 -i UDP:127.0.0.1:50001 -i UDP:127.0.0.1:50002 -i UDP:127.0.0.1:50003 -i UDP:127.0.0.1:50004 -i UDP:127.0.0.1:50005 -i UDP:127.0.0.1:50006 -i UDP:127.0.0.1:50007 -i UDP:127.0.0.1:50008 '"; +$c=qq"xterm -geometry 82x45-0+210 -e bash -c 'daq_netmem -S $label -m 13 -i UDP:127.0.0.1:49999 -i UDP:127.0.0.1:50000 -i UDP:127.0.0.1:50001 -i UDP:127.0.0.1:50002 -i UDP:127.0.0.1:50003 -i UDP:127.0.0.1:50004 -i UDP:127.0.0.1:50005 -i UDP:127.0.0.1:50006 -i UDP:127.0.0.1:50007 -i UDP:127.0.0.1:50008 -i UDP:127.0.0.1:50009 -i UDP:127.0.0.1:50010 -i UDP:127.0.0.1:50011'"; diff --git a/users/gsi_dirc/startup.sh b/users/gsi_dirc/startup.sh index 721cb3b..a011125 100755 --- a/users/gsi_dirc/startup.sh +++ b/users/gsi_dirc/startup.sh @@ -49,20 +49,32 @@ trbcmd w 0xfe4c 0xc800 0x00002000 ## Triggered mode #trbcmd w 0xfe4c 0xc800 0x00000001 ## logic analyser control register #trbcmd w 0xfe4c 0xc800 0x00001001 ## 2014-10-02 disable the "triggered mode" -trbcmd w 0xfe4c 0xc801 0x80620062 ## triggerwindow +/-490ns ;5ns granularity +trbcmd w 0xfe4c 0xc801 0x80c600c6 ## triggerwindow +/-990ns ;5ns granularity #trbcmd w 0xfe4c 0xc801 0x801e001e ## triggerwindow +/-150ns ;5ns granularity # Default TDC-channel enable for all channels trbcmd w 0xfe4c 0xc802 0xffffffff ## channel 01-32 enable trbcmd w 0xfe4c 0xc803 0x0000ffff ## channel 33-64 enable -#trbcmd w 0xfe4c 0xc804 0x0000007c ## data transfer limit +trbcmd w 0xfe4c 0xc804 0x0000007c ## data transfer limit # special Matthias TDCs trbcmd w 0xfe48 0xc800 0x00002000 ## Triggered mode -trbcmd w 0xfe48 0xc801 0x80620062 ## triggerwindow +/-490ns ;5ns granularity +trbcmd w 0xfe48 0xc801 0x80c600c6 ## triggerwindow +/-990ns ;5ns granularity trbcmd w 0xfe48 0xc802 0xffffffff ## channel 01-32 enable trbcmd w 0xfe48 0xc803 0xffffffff ## channel 33-64 enable +trbcmd w 0xfe48 0xc804 0x0000007c ## data transfer limit + + +# AUX TDCs +trbcmd w 0xfe4a 0xc800 0x00002000 ## Triggered mode +trbcmd w 0xfe4a 0xc801 0x80c600c6 ## triggerwindow +/-990ns ;5ns granularity +trbcmd w 0xfe4a 0xc802 0x00000000 ## channel 33-64 enable +trbcmd w 0x202c 0xc802 0xffffffff ## channel 01-32 enable +trbcmd w 0x202d 0xc802 0xffffffff ## channel 01-32 enable +trbcmd w 0xfe4a 0xc803 0x00000000 ## channel 33-64 enable +trbcmd w 0xfe4a 0xc804 0x0000007c ## data transfer limit + ~/trbsoft/daqtools/tools/loadregisterdb.pl register_config_tdc.db @@ -100,6 +112,7 @@ trbcmd i 0xffff | wc -l # Barrel DIRC prepare_padiwas_invert_leds.pl --endpoints=0x2000-0x2013 --chains=0..2 --invert=0xffff --stretch=0x0000 +padiwa_led_off.pl # Beam prepare_padiwas_invert_leds.pl --endpoints=0x2014-0x201f --chains=0..2 --invert=0xffff @@ -124,7 +137,14 @@ cd ~/trbsoft/daqtools/thresholds/ ## 2015 ./load_thresh_mcptof.sh 1500 1500 1500 1500 -./write_thresholds.pl padiwa_threshold_results_mcp_tof.log -o 0x2000 >> /dev/null # =14.5mV after amp +#MCP-TOF, SciTils +./write_thresholds.pl mcptof_mcpout_zero.log -o 2000 >> /dev/null # =14 mV after amp +./write_thresholds.pl mcptof_pixels_zero.log -o 2000 >> /dev/null # =14 mV after amp +./write_thresholds.pl mcptof_scitil_zero.log -o 2000 >> /dev/null # =20 mV after amp +./write_thresholds.pl mcptof_hodo_zero.log -o 1000 >> /dev/null # =7 mV after amp + +## Barrel DIRC +./write_thresholds.pl ~/trbsoft/daqtools/users/gsi_dirc/thresh/201505101447.thr -o 600 >> /dev/null # 1.5mV at plug cd - @@ -137,5 +157,9 @@ trbcmd w 0x7999 0xa150 0x10000 # pulser enable #trbcmd setbit 0x7999 0xa101 0x2 -# enable multiplexer 2 -trbcmd setbit 0x7999 0xa101 0x40 +# enable multiplexer 0 +trbcmd setbit 0x7999 0xa101 0x10 + +trbcmd w 0x7999 0xa150 0x270f #1kHz pulser +trbcmd w 0x7999 0xa151 0x05f5e100 #1Hz pulser +trbcmd loadbit 0x7999 0xa158 0x00000f00 0x00000d00 #Pulser 1 is calibration diff --git a/users/gsi_dirc/write_thresholds.pl b/users/gsi_dirc/write_thresholds.pl new file mode 120000 index 0000000..25f7de0 --- /dev/null +++ b/users/gsi_dirc/write_thresholds.pl @@ -0,0 +1 @@ +../../thresholds/write_thresholds.pl \ No newline at end of file