diff --git a/examples/mapedit_rasterbcm.pl b/examples/mapedit_rasterbcm.pl new file mode 100644 index 0000000000000000000000000000000000000000..f83b00ed30d187bc7e96606d58b6694f5b8867c5 --- /dev/null +++ b/examples/mapedit_rasterbcm.pl @@ -0,0 +1,154 @@ +#!/usr/bin/perl + +# Rewrite a Hall C style MAP file so that the Raster and BPM +# are separate detector types instead of being part of the +# MISC detector +# +# 08.04.2014 (saw) Modify just raster entries for now + +use POSIX qw(strftime); + +$RASTERID=18; +$BCMID=19; +$SWAPRASTERXY=1; + +$thedate = strftime( '%b %e, %Y', localtime ); + +$ifile = $ARGV[0]; +$ofile = $ARGV[1]; + +open(IFILE,"<$ifile"); +open(OFILE,">$ofile"); + +print OFILE "! $ofile Automatically generated $thedate\n"; +print OFILE "! from $ifile by $0\n"; + +# Insert comments defining the raster and BCM detector IDS +$ininiddefs=0; +while(<IFILE>) { + chomp; + $line = $_; + if($line=~/_ID/) { + $iniddefs=1; + } elsif ($iniddefs) { + if(not $line=~/_ID/ and not $line=~/:/) { + print OFILE "! RASTER_ID=$RASTERID ADC\n"; + print OFILE "! BCM_ID=$RASTERID ADC\n"; + print OFILE "$line\n"; + last; + } + } + print OFILE "$line\n"; +} + +# Copy the rest of the file, looking for the specific channels to +# edit +$detector=0; +while(<IFILE>) { + chomp; + $line = $_; + + if($line=~/^\s*DETECTOR=\s*(\d*)/i) { + $detector=$1; + print "$detector\n"; + print OFILE "$line\n"; + } elsif ($line=~/^\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*),\s*(\d*)\s*(.*)/) { + $comment = $5; + $channel = $1; + $plane = $2; + $element = $3; + $signal = $4; + if($comment=~"Fast Raster") { + $signal = -1; + if($comment=~"X-sync") { + $signal = 0; + } elsif ($comment=~"X-signal") { + $signal = 1; + } elsif ($comment=~"Y-sync") { + $signal = 2; + } elsif ($comment=~"Y-signal") { + $signal = 3; + } + if($signal>=0) { + if ($SWAPRASTERXY) { + $signal = ($signal+2) % 4; + } + print OFILE "detector=$RASTERID ! RASTER\n"; + print OFILE "!$line\n"; + print OFILE "$channel, 1, 1, $signal $comment\n"; + print OFILE "detector=$detector ! RASTER\n"; + } else { + print OFILE "$line\n"; + } + } else { + print OFILE "$line\n"; + } + } else { + print OFILE "$line\n"; + } +} +exit; + +%crates=(); + +$crate = 0; +$nsubadd = 0; +$bsub = 0; +$modtype = 0; +$slot = 0; +while(<>) { + $line=chomp; + if($line=/^\s*ROC=\s*(\d*)/i) { + $i++; + $crate = $1; + if(not $crates{$crate}) { + $slotlist={}; + $crates{$crate} = $slotlist; + } + $modtype = 0; + $slot = 0; + } elsif ($line=/^\s*nsubadd=\s*(\d*)/i) { + $nsubadd = $1; + $modtype = 0; + } elsif ($line=/^\s*bsub=\s*(\d*)/i) { + $bsub = $1; + $modtype = 0; + } elsif ($line=/^\s*slot=\s*(\d*)/i) { + $slot = $1; + $modtype = 0; + } elsif ($line=/^\s*(\d*)\s*,\s*(\d*)\s*,\s*(\d*)/) { + if($modtype == 0) { # Slot not yet registered + if($nsubadd == 96) { + $modtype = 1877; + } elsif($nsubadd == 64) { + if($bsub == 16) { + $modtype = 1875; + } elsif($bsub == 17) { + $modtype = 1881; + } + } + if($modtype == 0) { + print "Unknown module Crate $crate, Slot $slot\n"; + } + $crates{$crate}{$slot} = $modtype; + # print "$crate $slot $modtype\n"; + } + } +} +print "# Hall C Crate map\n"; +foreach $crate (sort {$a <=> $b} keys %crates) { + print "==== Crate $crate type fastbus\n"; + print "# slot model clear header mask nchan ndata\n"; + foreach $slot (sort {$a <=> $b} keys %{ $crates{$crate}}) { + $modtype = $crates{$crate}{$slot}; + if($modtype == 1877) { + $ndata = 256; + } else { + $ndata = 64; + } + printf " %2d %d 1 0x0 0x0 %3d %d\n" + ,$slot,$modtype,$nsubadd, $ndata; + } +} + +