--- /dev/null
+package MDC;
+
+use warnings;
+no warnings "portable";
+use FileHandle;
+use Getopt::Long;
+use Data::Dumper;
+
+
+###############################################################################
+#returns address of chip at (plane,sector,board,fpga)
+#fpga = 5 for OEP, 0..2 for TDC
+#all counting from 0
+###############################################################################
+sub get_address {
+ my ($p,$s,$b,$e) = @_;
+
+ if($e == 5) {
+ return 0x8000 + ($p<2?0x0e00:0x0f00) + ($p%2 ? $s*16+96 : $s*16) + $b;
+ }
+ else {
+ return ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + $e;
+ }
+ }
+
+###############################################################################
+#returns the position of chip with (address) as (plane,sector,board,fpga)
+#all counting from 0
+###############################################################################
+sub get_position {
+ my $addr = shift @_;
+ my ($p,$s,$b,$e);
+
+ if($addr > 0x8000) {
+ $e = 5;
+ $b = $addr & 0xf;
+ $s = (($addr>>4)&0xf)%6;
+ $p = (($addr>>8)==0x8e)?0:2;
+ $p += 1 if (($addr>>4)&0xf)>=6;
+ }
+ else {
+ $e = $addr & 0x3;
+ $b = ($addr>>4) & 0xf;
+ $s = (($addr>>8)&0xf)%6;
+ $p = (($addr>>12)==0x01)?0:2;
+ $p += 1 if (($addr>>8)&0xf)>=6;
+ }
+ return ($p,$s,$b,$e);
+ }
+
+###############################################################################
+#get the correct power channel for board with (address).
+#returns (hostname,board,output)
+###############################################################################
+sub get_power_channel {
+ my $addr = shift @_;
+ my ($p,$s,$b,$e) = get_position($addr);
+ my $id=-1;
+
+ open FILE, "../installation/powerdistributor_positions.db" or die $!."\npowerdistributor_positions.db not found.";
+ while (my $a = <FILE>) {
+ if(my @values = $a =~ /^\s*(\d)\s+(\d)\s+(\d+)/) {
+ my $pd_p = shift @values;
+ my $pd_s = shift @values;
+ $id = int(shift @values);
+ last if $p == $pd_p && $s == $pd_s;
+ }
+ }
+ close FILE;
+
+ my $hostname = sprintf("mdcpd%03x",$id);
+ $hostname = -1 if $id==-1;
+ return($hostname,int($b/4),$b%4);
+ }
+
+1;
+
+
+__END__
+
+
+###############################################################################
+#Addressing scheme
+###############################################################################
+
+ OEP FPGA:
+
+ 1 digit: 8 (as for all hubs)
+ 2 digit: e/f (inner/outer MDC)
+ 3 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4)
+ 4 digit: 0..f (MBO number)
+
+TDC FPGA:
+
+ 1 digit: 1/2 (inner/outer MDC)
+ 2 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4)
+ 3 digit: 0..f (MBO number)
+ 4 digit: 0..2 (FPGA number)
+
+Hub FPGA:
+
+ 1 digit: 8 (as for all hubs)
+ 2 digit: 5
+ 3 digit: 0..b (crate number, 0..5 inner MDC, 6..b outer MDC sectors)
+ 4 digit FPGA number in crate (0:master & Subevent ID)
use FileHandle;
use Getopt::Long;
use Data::Dumper;
+use lib '.';
+use MDC;
my $DEBUG = 0; #print debug messages
my $str;
- my $addr = 0x8000 + ($p<2?0x0e00:0x0f00) + ($p%2 ? $s*16+96 : $s*16) + $b;
+ my $addr;
+ $addr = MDC::get_address($p,$s,$b,5);
$str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],5);
- $addr = ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + 0;
+ $addr = MDC::get_address($p,$s,$b,0);
$str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],0);
- $addr = ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + 1;
+ $addr = MDC::get_address($p,$s,$b,1);
$str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],1);
if($longs->[$p][$s][$b]) {
- $addr = ($p<2?0x1000:0x2000) + ($p%2 ? $s*256+6*256 : $s*256) + $b*16 + 2;
+ $addr = MDC::get_address($p,$s,$b,2);
$str .= sprintf(" 0x%04x %03i %i\n",$addr,$boards->[$p][$s][$b],2);
};
__END__
-
-
-###############################################################################
-#Addressing scheme
-###############################################################################
-
- OEP FPGA:
-
- 1 digit: 8 (as for all hubs)
- 2 digit: e/f (inner/outer MDC)
- 3 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4)
- 4 digit: 0..f (MBO number)
-
-TDC FPGA:
-
- 1 digit: 1/2 (inner/outer MDC)
- 2 digit: 0..b (chamber number, 0..5 for MDC1/3 6..B for MDC2/4)
- 3 digit: 0..f (MBO number)
- 4 digit: 0..2 (FPGA number)
-
-Hub FPGA:
-
- 1 digit: 8 (as for all hubs)
- 2 digit: 5
- 3 digit: 0..b (crate number, 0..5 inner MDC, 6..b outer MDC sectors)
- 4 digit FPGA number in crate (0:master & Subevent ID)