chiark / gitweb /
realtime: movpos: debug output: exclude some more stuff from the default movpos output
[trains.git] / hostside / analyse-speeds
1 #!/bin/bash
2 usage () { cat <<END >&2; exit 1 \
3
4 usage: ./speeds-analyse <train>
5   reads: <train>-*.speeds
6   reads: <train>.manual
7   writes: <train>.speeds.ps
8   writes: <train>.speeds.record
9 END
10 }
11
12 set -e
13
14 test $# = 1 || usage
15 case "$1" in -*) usage ;; esac
16
17 train=$1; shift
18
19 o=$train.speeds
20
21 >$o.all.tmp
22
23 acceltime=100000
24 deceltime=30000
25
26 exec 3>$o.stopping.tmp
27 stops-from () {
28         printf >&3 '%d %d %s\n' $1 $(( $2 )) $3
29 }
30 . ../layout/ours.redacted.shellvars
31 . $train.manual
32 exec 3>&-
33
34 for f in address length nondetfore nondetrear acceltime deceltime; do
35 #                  [mm]   [mm]          [mm]    [ms]        [ms]
36         eval "v=\$$f"
37         if [ "x$v" = x ]; then echo >&2 "missing $train $f"; exit 1; fi
38 done
39
40 for f in $train-*.speeds; do
41         this="'$f'"
42         if head -1 $f | grep '^[A-Za-z]' >/dev/null; then
43                 this="$this using 2:3"
44         fi
45         each="$each, $this"
46         perl -pe 's/^[A-Za-z]\w*//' $f >>$o.all.tmp
47 done
48
49 gnuplot <<END
50 set pointsize 0.3
51 set terminal postscript
52 set key top left
53 set xrange [0:127]
54 set output '$o.ps.tmp'
55 set ylabel "speed [m/s]"
56 set xlabel "nmra speed step 1..126"
57 plot '$o.all.tmp' smooth sbezier notitle  $each
58 END
59
60 ed -s $o.ps.tmp <<END >/dev/null
61 /^%%Title/
62 s/\.tmp$//
63 w
64 END
65
66 max=`
67     sort -rnu $train.speeds.all.tmp |head -1 |awk '{print $1}'
68     case "${PIPESTATUS[*]}" in "0 0 0" | "141 0 0");;
69         *) echo >&2 "? ${PIPESTATUS[*]}"; exit 127;; esac
70 `
71
72 gnuplot <<END
73 set terminal table
74 set samples $max
75 set xrange [1:$max]
76 unset autoscale x
77 set output '$o.table.tmp'
78 plot '$o.all.tmp' smooth sbezier
79 END
80
81 sort -rn <$o.stopping.tmp >$o.stopping-sorted.tmp
82
83 perl <$o.stopping-sorted.tmp >$o.record.tmp -ne '
84  BEGIN {
85         $last_step= 127;
86         $last_stoptime= undef;
87
88         print   "train '$train' is '$address'".
89                 " '$nondetfore'".
90                 "+'$(( $length - $nondetfore - $nondetrear ))'".
91                 "+'$nondetrear'\n"
92                         or die $!;
93  }
94         die unless m/^(\d+)\s+(\d+)(?:\s+([-.0-9]+))?\s*$/;
95         ($step,$stopdist,$stoptime) = ($1,$2,$3);
96         die unless $step < $last_step;
97         if (defined $stoptime) {
98                 $stoptime= eval $stoptime; defined $stoptime or die "$@ ?";
99         } else {
100                 die unless $last_stoptime;
101                 $stoptime= $last_stoptime;
102         }
103         printf "train '$train' stops %3d: %4d %5d\n", $step,$stopdist,
104                 $stoptime*1000
105                         or die $!;
106         $last_step= $step;
107         $last_stoptime= $stoptime;
108 '
109
110 perl <$o.table.tmp >>$o.record.tmp -ne '
111  BEGIN {
112         use IO::Handle;
113         $nxt= 1;
114         $max= 0;
115         $speed[0]= 0;
116  }
117         next if m/^\#/; next unless m/\S/;
118         die unless m/^\s*(\d+)\s+([0-9.]+)\s/;
119         ($step,$speed) = ($1,$2);
120         die "$step $nxt" unless $step==$nxt;
121         if ($speed < $max) { push @decreases, $step; $speed= $max; }
122         $speed[$step]= $speed;
123         $max= $speed;
124         $nxt++;
125  END {
126         warn "warning: '$train': decreases at steps @decreases\n"
127                 if @decreases;
128         $steps= $nxt-1;
129         die "'$train': expected 126 steps, found $steps\n"
130                 unless $steps==126;
131         for ($step=1; $step<$nxt; $step++) {
132                 printf  "train %s step %d=%f\n",
133                         "'$train'", $step, $speed[$step]
134                                 or die $!;
135         }
136         STDOUT->error and die $!;
137         print "end\n" or die $!;
138  }
139 '
140
141 rm $o.{all,stopping,stopping-sorted}.tmp
142
143 for f in ps record; do
144         mv -f $o.$f.tmp $o.$f
145 done