| 1 | C -+-+-+-+-+ \ e H A E N Y A . F T \ e -+-+-+-+-+\r |
| 2 | C\r |
| 3 | C * UP 1-OCT-82\r |
| 4 | C * UP 3-NOV-82\r |
| 5 | C * UP 26-NOV-82\r |
| 6 | C * UP 12-JAN-83\r |
| 7 | C * UP 25-APR-83\r |
| 8 | C * UP 26-APR-83 CREATES HAENYA FROM HAESPL\r |
| 9 | C * UP 28-APR-83\r |
| 10 | C * UP 2-MAY-83\r |
| 11 | C * UP 3-MAY-83\r |
| 12 | C * UP 5-MAY-83\r |
| 13 | C * UP 10-MAY-83\r |
| 14 | C * UP 20-NOV-83\r |
| 15 | C * UP 7-DEC-83 DEBUGGING\r |
| 16 | C * UP 8-DEC-83 DEBUGGING\r |
| 17 | C * UP 15-DEC-83 REARANGEMENT OF DATA CHANNELS ON OUTPUT PLOT\r |
| 18 | C * UP 19-DEC-83 DEBUGGING\r |
| 19 | C * UP 25-JAN-84 INSERTS NORMALISATION FACTORS INTO PLOT\r |
| 20 | C * UP 26-APR-84 INSERTS SPECIAL CH2 HANDLING ( TURN TABLE)\r |
| 21 | C * UP 26-JAN-84 OPTION '+' ASKS FOR CALIBRATION & NORMALISATION VECTOR\r |
| 22 | C * UP 28-MAY-84 SACCADE DIRECTION SEPARATION INTO L/R\r |
| 23 | C * UP 30-NOV-84 SOME NEW ENHANCEMENTS FOR I/O AND PLOTTER\r |
| 24 | C * UP 10-DEC-84 ONLE ONE NORMALISATION FACTOR FOR EACH CHANNEL\r |
| 25 | C * UP 27-SEP-85 INSERTS STRIGG CHANNELS\r |
| 26 | C * UP 19-NOV-85 REMOVES SOME BUGS\r |
| 27 | C * UP 2-DEC-85 CORRECT HANDLING FOR TRIGGER CHANNELS\r |
| 28 | |
| 29 | C PLOT THE DATA POINTS AND THE SUMM OF CH0 AND CH1\r |
| 30 | C\r |
| 31 | SUBROUTINE NYADD\r |
| 32 | INCLUDE HAEPTI.FI\r |
| 33 | INCLUDE HAEBUF.FI\r |
| 34 | INCLUDE HAEGSA.FI\r |
| 35 | INCLUDE HAETTY.FI\r |
| 36 | INCLUDE HABRK.FI\r |
| 37 | INCLUDE HAECSZ.FI\r |
| 38 | INCLUDE HAEHAS.FI\r |
| 39 | INCLUDE HAECNY.FI\r |
| 40 | INCLUDE HAECTR.FI\r |
| 41 | INCLUDE HAPPEN.FI\r |
| 42 | REAL XYSAM,COND,NYXYSM\r |
| 43 | LOGICAL BETW\r |
| 44 | INTEGER NCOND,TOASCI,IXTA,FLD\r |
| 45 | EXTERNAL XYSAM,NCOND,COND,TOASCI,BETW,NYXYSM,IXTA,FLD\r |
| 46 | C\r |
| 47 | \fC\r |
| 48 | LOGICAL TIMABZ,TIMORD, @ ABZISSE / ORDINATE IS TIME SCALE\r |
| 49 | * ABISMI, @ IF THE ABZISSA SCALE EXCEEDS 5 MINUTES THEN .TRUE. ELSE .FALSE.\r |
| 50 | * BOTH,L1,ADPLT,TRGPLT @ PLOT MIN&MAX OF SOME Y POINTS, WE ARE PLOTTING A/D CHANNELS, WE ARE PLOTTING STRIG CHANNELS\r |
| 51 | INTEGER I,K,K1,J,PENPOS,MSG,\r |
| 52 | * CO, @ CHANNEL OF ORDINATE\r |
| 53 | * PLBEG,PLEND, @ START/END OF TIME SCALE\r |
| 54 | * NUMCN, @ NUMBER OF CHANNELS TO SCAN (NO MEANING IF TIMABZ IS SET .FALSE.)\r |
| 55 | * EXPAND @ IF THE TIME SCALE .LE. 5 SECONDS THEN WE MARK EACH 1/10 SECOND ELSE EACH SECOND\r |
| 56 | * ,TS1 @ HOLDS END OF TIME SCALE\r |
| 57 | * ,REARAN(8) @ REARANGE VECTOR\r |
| 58 | * ,NORMSG (1) @ MESSAGE FOR CALIBRATION FACTORS\r |
| 59 | REAL TEMSET, @ DIFFERENCE PLOTTER 0,0 AND PICTURE 0,0 (NO MEANING IF TIMABZ IS SET TO .FALSE.)\r |
| 60 | * LEFT,RIGHT,UP,DOWN, @ PLOT SCALES ABZISSE/ ORDINATE\r |
| 61 | * TE1,TE2,TE3, @ TEMPS\r |
| 62 | * X,Y,YFMIN,YFMAX, @ USED TO COMPRESS PLOT OUTPUT\r |
| 63 | * OLDX @ USED TO COMPRESS PLOT OUTPUT\r |
| 64 | * ,OMAX,OMIN @ MAXIMUM AND MINIMUM OF ORDINATE DATA\r |
| 65 | INTEGER TEXT0(4) @ DIMENSION OF THE TIME AXIS (MIN OR SEC)\r |
| 66 | * ,TEXT1(2) @ MSG FOR FORMAT 3 OUTPUT\r |
| 67 | DATA CA,CO,NUMCN,STEP,NUMTRI,ALLCHS /0,8,2,3,0,2/\r |
| 68 | * ,TEXT1 /'A/D','TRG'/\r |
| 69 | * ,TEXT0 /'TIME [MIN] TIME [SEC]'/\r |
| 70 | * ,REARAN /2,5,4,1,0,3,6,7/ @ PERMUTATION: NUMBER OF PLOT ^ CHANNEL\r |
| 71 | * ,NORMSG /'GRAD'/\r |
| 72 | C SIGNAL NAME CHANNEL NUMBER COMMENT\r |
| 73 | C CH0 A/D 0 NYSTAGMUS\r |
| 74 | C CH1 A/D 1 HEAD\r |
| 75 | C CH2 A/D 2 TABLE\r |
| 76 | C TRG 1 SPIKE 3 NEURON SPIKES\r |
| 77 | C ADD 0 4 COMPUTED FROM NYSTAGMUS+HEAD\r |
| 78 | C ADD 1 5 COMPUTED NYSTAGMUS+HEAD+TABLE\r |
| 79 | C\r |
| 80 | C\r |
| 81 | C STATEMENT FUNCTIONS ARE:\r |
| 82 | C\r |
| 83 | BOX(AP1)=AMAX1(AMIN1(AP1,UP-DOWN),-.01)\r |
| 84 | XF(IP1)=XYSAM(IP1,CA)-LEFT @ RETURNS THE VALUE OF THE ABZISSA WITH CORRECT OFFSET\r |
| 85 | YF(IP1)=NYXYSM(IP1,CO)-DOWN @ RETURNS THE VALUES OF THE ORDINATE WITH THE CORRECT OFFSET\r |
| 86 | DEFALT(I1,I2)=NCOND(I1.EQ.1H ,I2,IXTA(FLD(0,6,I1))-48) @ RETURNS DEFAULT VALUES\r |
| 87 | C\r |
| 88 | \f IF (SAMCNT.EQ.0) RETURN @ NO SAMPLE, NOTHING TO DO\r |
| 89 | C \r |
| 90 | C COMPUTE THE DEFAULT VALUES FOR THE PLOT\r |
| 91 | C\r |
| 92 | IF (OPTION.EQ.11) GOTO 15 @ SP- SKIPS QUESTIONS AND TAKES THE LAST VALUES USED\r |
| 93 | NUMCN=CHNLS-COSTRT+2 @ ALL CHANNELS TO PLOT\r |
| 94 | NYAFIL=0 @ NO FILTER FOR TABLE POSITION\r |
| 95 | IF (OPTION.EQ.12) GOTO 62\r |
| 96 | CALL ASKHIM (2) @ SP* DOES NOT ASK SCILLY QUESTIONS\r |
| 97 | WRITE (TTO,1) CA,COSTRT,STEP @ READ CHANNEL ## (COSTRT SET TO 0 ALLWAYS)!\r |
| 98 | READ (TTI,2) I,J,K @ AND STEP INCREMENTS\r |
| 99 | IF BREAK(11) RETURN\r |
| 100 | CA=DEFALT(I,CA)\r |
| 101 | COSTRT=0 @ CAUSED BY REARANGE VECTOR, I DON'T KNOW HOW TO DO BETTER????\r |
| 102 | STEP=NCOND(K,K,STEP) @ CA,CO, STEP DEFAULTS FOR BLANK INPUT\r |
| 103 | 62 CONTINUE\r |
| 104 | TIMABZ=CA.GT.7 @ ABZISSE IS THE TIME SCALE\r |
| 105 | TIMORD=COSTRT.GT.7 @ ORDINATE IS THE TIME SCALE\r |
| 106 | IF (.NOT.TIMABZ) GOTO 15 @ ABZISSA IS NO TIME SCALE: ONLY TWO CHANNELS (CO,CO+1) TO PLOT\r |
| 107 | NUMCN=MIN0(NUMCN,CHNLS+1-COSTRT) @ COMPUTE CORRECT NUMBER OF CHANNELS\r |
| 108 | IF (OPTION.EQ.12) GOTO 61\r |
| 109 | WRITE (TTO,3) TEXT1(1),NUMCN @ READ THE NUMBER OF CHANNELS TO SCAN\r |
| 110 | READ (TTI,2) I\r |
| 111 | I=DEFALT(I,NUMCN) @ FOR BLANK INPUT DEFAULT IS NUMCN\r |
| 112 | NUMCN=MIN0(CHNLS+STRIGS-COSTRT+1,NCOND(I,I,NUMCN)) @ NO INPUT MEANS CHNLS-CO\r |
| 113 | ALLCHS=NUMCN+NUMTRI @ NUMBER OF A/D AND STRIGG CHANNELS TO PLOT\r |
| 114 | C\r |
| 115 | C ASK FOR NUMBER OF STRIGG CHANNELS TO PLOT\r |
| 116 | C\r |
| 117 | IF (STRIGS.EQ.0) GOTO 11 @ NO STRIGS, NO QUESTIONS\r |
| 118 | NUMTRI=STRIGS @ INSERT DEFAULT VALUE\r |
| 119 | WRITE (TTO,3) TEXT1(2),NUMTRI @ READ THE NUMBER OF STRIGG CHANNELS TO SCAN\r |
| 120 | READ (TTI,2) I\r |
| 121 | I=DEFALT(I,NUMTRI) @ BLANK INPUTS DEFAULTS TO NUMTRI\r |
| 122 | NUMTRI=MIN0(STRIGS,MAX0(0,I)) @ INSERT CORRECT VALUE\r |
| 123 | ALLCHS=MIN0(NUMCN+NUMTRI,8) @ ONLY 8 CHANNELS ALLOWED\r |
| 124 | 11 CONTINUE\r |
| 125 | 61 CONTINUE\r |
| 126 | C\r |
| 127 | C ASK FOR SCALE OF THE ORDINATE (MINIMUM AND MAXIMUM)\r |
| 128 | C\r |
| 129 | DO 80 K=COSTRT+1,NUMCN+COSTRT+NUMTRI\r |
| 130 | K1=K+1\r |
| 131 | ADPLT=K.LT.CHNLS @ QUESTIONS FOR A/D CHANNEL TO PLOT\r |
| 132 | TRGPLT=BETW(CHNLS,K,CHNLS+STRIGS) @ FOR SCHMITT TRIGGER CHNNELS\r |
| 133 | I=NCOND(ADPLT,'A/D',TRGPLT,'TRG','ADD') @ COMPUTE CORRECT TEXT\r |
| 134 | WRITE (TTO,5) I,K,ORDMAX(K1) @ READ THE MAXIMUM\r |
| 135 | READ (TTI,7) TE1\r |
| 136 | ORDMAX(K1)=COND(TE1,TE1,ORDMAX(K1))\r |
| 137 | IF (BREAK(11)) RETURN\r |
| 138 | WRITE (TTO,6) I,K,ORDMIN(K1) @ READ THE MINIMUM\r |
| 139 | READ (TTI,7) TE1\r |
| 140 | ORDMIN(K1)=COND(TE1,TE1,ORDMIN(K1))\r |
| 141 | IF (BREAK(11)) RETURN\r |
| 142 | IF (TRGPLT) GOTO 80 @ NO NORMALISATION FOR TRIGGER CHANNELS\r |
| 143 | WRITE (TTO,8) NORMSG(1),NORM(K1) @ READ THE CALIBRATION FACTOR\r |
| 144 | READ (TTI,7) TE1\r |
| 145 | NORM(K1)=COND(TE1,TE1,NORM(K1)) @ +1 HERE SINCE REARAN'S CH # IS FORM 0 TO 7 AND NORM FROM 1 TO 8!\r |
| 146 | 80 CONTINUE\r |
| 147 | \fC\r |
| 148 | C AND HERE WE ASK FOR TABLE POSITION HANDLING (REAL,FILTER,POLYNOM)\r |
| 149 | C NYAFIL: DETERMINE DESIRED FILTER\r |
| 150 | C NO FILTER: 0\r |
| 151 | C 11 POINT FILTER:1\r |
| 152 | C LINE: 2\r |
| 153 | C 3 POINT FILTER: 3\r |
| 154 | C\r |
| 155 | C\r |
| 156 | WRITE (TTO,104) NYAFIL,TABDIR @ WELCHES FILTER FUER TISCHPOSITION?\r |
| 157 | READ (TTI,105) NYAFIL,TABDIR\r |
| 158 | IF (NYAFIL.LE.0) GOTO 82 @ 0: KEINE BEHANDLUNG\r |
| 159 | IF (NYAFIL.EQ.2) GOTO 125 @ 2: GERADE DURCH STUETZPUNKTE\r |
| 160 | NYAFIL=MIN0(NYAFIL,3) @ 1: 11 POL FILTER, 3: 3 POL FILTER\r |
| 161 | GOTO 82\r |
| 162 | C\r |
| 163 | 125 CONTINUE @ LESE STUETZPUNKTE FUER GERADE EIN\r |
| 164 | CALL MOVE (-16,-10,SMOTAB)\r |
| 165 | DO 110 I=1,8\r |
| 166 | 111 WRITE (TTO,101) I\r |
| 167 | READ (TTI,102) SMOTAB(1,I) @ UNTERER STUETZPUNKT\r |
| 168 | IF (I.EQ.1) GOTO 112\r |
| 169 | IF (SMOTAB(1,I).LT.SMOTAB(2,I-1)) GOTO 120\r |
| 170 | 112 IF (SMOTAB(1,I).LT.0) GOTO 111 @ FEHLERHAFTE EINGABE\r |
| 171 | 113 WRITE (TTO,103)\r |
| 172 | READ (TTI,102) SMOTAB(2,I) @ OBERER STUETZPUNKT\r |
| 173 | IF (SMOTAB(2,I).LE.SMOTAB(1,I)) GOTO 113\r |
| 174 | 110 CONTINUE\r |
| 175 | GOTO 122\r |
| 176 | 120 DO 121 J=I,8\r |
| 177 | SMOTAB(1,J)=-10\r |
| 178 | 121 SMOTAB(2,J)=-10\r |
| 179 | 122 CONTINUE\r |
| 180 | DO 130 I=1,8\r |
| 181 | SMOTAB(1,I)=SMOTAB(1,I)*SAMRAT+.5 @ CONVERT TO INDICES AND ROUND\r |
| 182 | SMOTAB(2,I)=SMOTAB(2,I)*SAMRAT+.5\r |
| 183 | IF (SMOTAB(1,I).LT.0) GOTO 140\r |
| 184 | SMOTBL(1,I)=(XYSAM(INT(SMOTAB(2,I)),2)-\r |
| 185 | * XYSAM(INT(SMOTAB(1,I)),2))\r |
| 186 | * / (SMOTAB(2,I)-SMOTAB(1,I)) @ STEIGUNG\r |
| 187 | 130 SMOTBL(2,I)=XYSAM(INT(SMOTAB(1,I)),2)-\r |
| 188 | * SMOTBL(1,I)*(SMOTAB(1,I)-.5)\r |
| 189 | 140 CONTINUE\r |
| 190 | 101 FORMAT (' STUETZPUNKT PAAR NR.:',I2,/\r |
| 191 | * ' UNTERER STUETZPUNKT IN SEC (F6.0)? ',$)\r |
| 192 | 102 FORMAT (F6.0)\r |
| 193 | 103 FORMAT (' OBERER STUETZPUNKT ? ',$)\r |
| 194 | 104 FORMAT (' TISCH: FILTER 0/1/2/3, DREHRICHTUNG L/R/* (I1,A1) ',\r |
| 195 | * I1,A1,' ?',$)\r |
| 196 | 105 FORMAT (I1,A1)\r |
| 197 | C\r |
| 198 | C\r |
| 199 | 82 CONTINUE\r |
| 200 | 15 CONTINUE\r |
| 201 | \fC\r |
| 202 | C COMPUTE THE SCALING LIMITS\r |
| 203 | C\r |
| 204 | S0=BEGIN*SAMRAT @ HERE WE START THE OUTPUT PLOT\r |
| 205 | S1=ENDS*SAMRAT @ AND HERE WE END THE PLOT\r |
| 206 | TS1=S1 @ END OF TIME SCALE\r |
| 207 | C PLBEG HOLDS THE FIRST SECOND OF THE TIME SCALE (LEFTMOST )\r |
| 208 | C PLEND HOLDS THE LAST SECOND OF THE TIME SCALE ( RIGHTMOST DOT)\r |
| 209 | C TS1 HOLDS FACTOR FOR TIME SCALE (PLEND*SAMRAT)\r |
| 210 | C S0 HOLDS THE STARTING INDEX OF DATA TO PLOT ( PLBEG*SAMRAT)\r |
| 211 | C S1 HOLDS THE INDEX OF LAST DATA POINT (MIN0(SAMCNT,TS1))\r |
| 212 | PLBEG=BEGIN\r |
| 213 | PLEND=ENDS\r |
| 214 | C\r |
| 215 | IF (S1.LE.SAMCNT) GOTO 17 @ IF THE INTERVALL TO PLOT EXCEEDS THE\r |
| 216 | TE1=SAMCNT-1/SAMRAT @ DATA POINTS THEN\r |
| 217 | TE2=S1/SAMRAT\r |
| 218 | WRITE (TTO,4) TE1,TE2 @ WE PRINT THE OVERFLOW MSG AND\r |
| 219 | S1=SAMCNT @ INSERT THE CORRECT PLEND VALUE\r |
| 220 | 17 CONTINUE @ INTERVALL OK, COMPUTE UPPER AND LOWER MARGIN OF PLOT DATA\r |
| 221 | RIGHT=COND(TIMABZ,FLOAT(TS1),512.) @ ABZISSE MARGIN EITHER TIME OR 10 BIT CONVERTER\r |
| 222 | LEFT =COND(TIMABZ,FLOAT(S0),-512.)\r |
| 223 | UP =COND(TIMORD,FLOAT(TS1),512.) @ ORDINATE MARGIN\r |
| 224 | DOWN =COND(TIMORD,FLOAT(S0),-512.)\r |
| 225 | IF BREAK(11) RETURN @ USER GETS RID OF PRGRM\r |
| 226 | CALL STPLT @ START THE PLOTTER ( CALL PLOTS)\r |
| 227 | CALL XYPLOT (XOFSET,YOFSET,-PENUP) @ DRIVE PEN TO PICTURE ZERO\r |
| 228 | C\r |
| 229 | C MAIN PLOT LOOP\r |
| 230 | C\r |
| 231 | C LOOP TO PLOT EACH CHANNEL WITH CORRECT OFFSET, FACTOR AND SCALE\r |
| 232 | C TEMSET HOLDS THE ORIGIN FOR EACH CHANNEL\r |
| 233 | C TEMSET=0 PLOT ONE CHANNEL/TIME OR X/Y\r |
| 234 | C TEMSET=YLEN/NUMCN FOR MORE THAN ONE CHANNEL\r |
| 235 | C THE TEMSET ORIGIN OFFSET IS RESET AT THE END OF THE LOOP ( ST. 25)\r |
| 236 | C\r |
| 237 | C\r |
| 238 | TEMSET=0\r |
| 239 | DO 20 K=1,NCOND(TIMABZ,ALLCHS,1) @ SCAN NUMCN CHANNELS WITH INDEX K FROM 1 TO NUMCN\r |
| 240 | CO=REARAN(K) @ REARANGEMENT OF GRAPHICS\r |
| 241 | K1=CO+1 @ INDEX TO ORDMIN/MAX SINCE CO STARTS WITH 0\r |
| 242 | CXCX IF (CO.LT.COSTRT) GOTO 20 @ COMPUTE ONLY DESIRED CHNNELS\r |
| 243 | C\r |
| 244 | C HERE WE COMPUTE THE ACTUAL CHANNEL NUMBER:\r |
| 245 | C EITHER A/D CO TO NUMCN-1 (0 TO CHNLS-1) OR\r |
| 246 | C TRIGG EVENT FROM CHNLS TO CHNLS+STRIGS-1\r |
| 247 | C\r |
| 248 | C ADPLT IS SET TRUE FOR A/D CHANNELS TO SCAN\r |
| 249 | C STEPSIZE IS THE INCREMENT FOR THE SCAN;\r |
| 250 | C FOR A/D CHANNELS THE MAXIMUM VALUE OF THE SPECIFIED: STEP OR\r |
| 251 | C IF LOWER SAMPLE FREQUENCY THAN MAXRAT THE PACK-VALUE.\r |
| 252 | C FOR TRIGG EVENT CHANNELS STEP MUST ALLWAYS BE 1!\r |
| 253 | C\r |
| 254 | TRGPLT=BETW(CHNLS,CO,CHNLS+STRIGS) @ WE ARE PLOTTING SCHMITT TRIGGER CHANNELS\r |
| 255 | ADPLT=CO.LT.CHNLS @ WE ARE PLOTTING A/D CHANNELS\r |
| 256 | STEPS=NCOND(ADPLT,MAX0(STEP,PACK(CO+1)),\r |
| 257 | * TRGPLT,1,MAX0(STEP,PACK(1),PACK(2),PACK(3))) @ COMPUTE STEPSIZE FOR SCAN\r |
| 258 | C\r |
| 259 | C HERE WE DECIDE : X OVER Y PLOT \r |
| 260 | C OR X OVER TIME\r |
| 261 | C\r |
| 262 | IF ( .NOT.TIMABZ) GOTO 51\r |
| 263 | C\r |
| 264 | C X OVER TIME\r |
| 265 | C \r |
| 266 | C IF THERE IS MORE THAN ONE CHANNEL WE HAVE TO PREPARE A LOT OF SMALL\r |
| 267 | C Y - AXIS FOR EACH CHANNEL TO SCAN. SO WE SET A TEMPORARY Y OFFSET CALLED TEMSET\r |
| 268 | TEMSET=FLOAT(ALLCHS-K)*(YLEN-ALLCHS*.5+.5)/\r |
| 269 | * FLOAT(ALLCHS)+(ALLCHS-K)*.5 @ TEMPORARY Y OFFSET\r |
| 270 | CALL XYPLOT (0,TEMSET,-PENUP) @ SWITCH TO CORRECT PART OF PICTURE\r |
| 271 | C\r |
| 272 | C COMPUTE THE FACTOR TO GET A PRETTY PLOT\r |
| 273 | C\r |
| 274 | UP=ORDMAX(K1)\r |
| 275 | DOWN=ORDMIN(K1) @ INSERT THE DEFAULT SCALING LIMITS\r |
| 276 | IF (UP.LE.DOWN) GOTO 51 @ AUTOMATIC SCALING DESIRED\r |
| 277 | OMAX=UP\r |
| 278 | OMIN=DOWN\r |
| 279 | GOTO 51 @ SCALING ALREADY DONE\r |
| 280 | \fC HERE WE DO AUTOMATIC SCALING\r |
| 281 | C\r |
| 282 | 21 CONTINUE\r |
| 283 | OMAX=-99999.\r |
| 284 | OMIN=-OMAX\r |
| 285 | DO 50 J=S0,S1,STEPS @ FETCH MIN & MAX OF THE DATA\r |
| 286 | IF (BREAK(11)) GOTO 25 @ IF THE USER GETS RID OF PLOT THEN WE EXIT VIA 25\r |
| 287 | TE1=NYXYSM(J,CO) @ DATA POINT --> TE1\r |
| 288 | OMAX=AMAX1(OMAX,TE1) @ MAXIMUM --> OMAX\r |
| 289 | 50 OMIN=AMIN1(OMIN,TE1) @ MINIMUM --> OMIN\r |
| 290 | C\r |
| 291 | IF (UP .GT. DOWN-1.) GOTO 52 @ IF OMAX.EQ.OMIN THEN WE MAKE A FIXED SCALE\r |
| 292 | C FIXED SCALE IF POSSIBLE:\r |
| 293 | IF (OMIN.GE.OMAX-(DOWN-UP)) GOTO 53 @ MAKE A FIXED SCALE AT 53\r |
| 294 | DOWN=OMIN @ DIFFERENCE BETWEEN MIN AND MAX EXCEEDS THE FIX SCALE LENGTH, SO WE TAKE DEFAULT VALUES\r |
| 295 | UP=OMAX @ ELSE DOWN=UP-(OMIN-OMAX) (FIXED DIFFERENCE SCALE)\r |
| 296 | GOTO 51 @ WORK DONE\r |
| 297 | C FIXED SCALE POSSIBLE, MAKE IT AND CENTER THE PLOT\r |
| 298 | 53 TE1=OMIN-((DOWN-UP)-(OMAX-OMIN))*.5\r |
| 299 | UP=TE1+DOWN-UP @ UPPER LIMIT\r |
| 300 | DOWN=TE1 @ WE SHIFT THE LINE INTO THE CENTER\r |
| 301 | GOTO 51 @ FIXED DIFFERENCE SCALE DONE\r |
| 302 | C AUTOMATIC SCALE BUT WITH INCREMENTAL STEPPED LIMITS\r |
| 303 | C\r |
| 304 | 52 CONTINUE\r |
| 305 | DOWN=COND(OMIN.LT.-500.,OMIN,OMIN.LT.-250.,-500.,\r |
| 306 | * OMIN.LT.0,-250.,OMIN.LT.250.,0, 250.) @ MAKE 250 STEPS INCREMENT\r |
| 307 | UP=COND(OMAX.GT.500.,OMAX,OMAX.GT.250.,500.,\r |
| 308 | * OMAX.GT.0,250.,OMAX.GT.-250.,0, -250.) @ 250 STEPS INCREMENT\r |
| 309 | C\r |
| 310 | UP=COND(DOWN.GE.UP,DOWN+255.,UP) @ SOMETIMES IT WILL HAPPEN: UP=DOWN\r |
| 311 | 51 CONTINUE @ HERE WE COMPUTE THE FACTOR FOR ONE LINE\r |
| 312 | WRITE(0,4711) RIGHT,LEFT,ALLCHS,UP,DOWN\r |
| 313 | 4711 FORMAT(5I7)\r |
| 314 | IF (TIMABZ) CALL FACTOR (XLEN/(RIGHT-LEFT),\r |
| 315 | * (YLEN-ALLCHS*.5+.5)/FLOAT(ALLCHS)/(UP-DOWN))\r |
| 316 | IF (.NOT.TIMABZ) CALL FACTOR (AMIN1(XLEN,YLEN)/(RIGHT-LEFT),\r |
| 317 | * AMIN1(XLEN,YLEN)/(UP-DOWN))\r |
| 318 | IF BREAK(11) GOTO 25 @ USER GETS RID OF PRGRM\r |
| 319 | \fC HERE WE COMPRESS ( TO SAVE PLOTTER TIME) AND PLOT THE DATA POINTS\r |
| 320 | C\r |
| 321 | CALL WHERE (TE1,TE1,TE1,TE2) @ FETCH THE X FACTOR --> TE1\r |
| 322 | YFMIN=9999.\r |
| 323 | YFMAX=-YFMIN @ PREP TEMPS TO FETCH THE MIN/MAX OF THE ORDINATE POINTS\r |
| 324 | BOTH=.FALSE.\r |
| 325 | C\r |
| 326 | OLDX=XF(S0)-0.4/TE1*XLEN\r |
| 327 | PENPOS=PENUP\r |
| 328 | L1=.FALSE. @ L1 HOLDS: YF(I) INSIDE LOWER/UPPER LIMIT OF PLOT\r |
| 329 | C\r |
| 330 | C IF THERE IS A X MOVEMENT LESS THAN .3 MM THEN WE DO NOT PLOT THE\r |
| 331 | C POINT. WE FETCH THE MIN/MAX OF Y AND PLOT A LINE FROM MIN TO MAX AT THIS X LOCATION.\r |
| 332 | C THIS IS TO COMPRESS USELESS OUTPUT TO THE PLOTTER.\r |
| 333 | C\r |
| 334 | DO 10 I=S0,S1,STEPS @ HERE WE PLOT THE DATA POINTS ONE BY ONE \r |
| 335 | X=XF(I) @ TEMP TO SAVE COMPUTING TIME\r |
| 336 | 75 Y=YF(I) @ TEMP\r |
| 337 | IF BREAK(11) GOTO 25 @ USER GETS RID OF PROGRAM\r |
| 338 | IF(.NOT.TRGPLT)\r |
| 339 | * PENPOS=NCOND(BETW(-.1,Y,UP-DOWN).OR.L1,PENPOS,PENUP) @ WE DO NOT PLOT ANY POINTS EXCEEDING THE UPPER/LOWER LIMIT\r |
| 340 | IF (ABS(OLDX-X)*TE1.GE.0.35/XLEN) GOTO 71 @ PLOT THIS POINT\r |
| 341 | IF(TRGPLT) GOTO 74 @ TRIGGER EVENTS WITHOUT ANY COMPRESSION!\r |
| 342 | YFMIN=AMIN1(Y,YFMIN) @ NO X MOVEMENT, GET THE MIN Y VALUE\r |
| 343 | YFMAX=AMAX1(Y,YFMAX) @ FETCH THE MAX Y VALUE\r |
| 344 | BOTH=.TRUE. @ TWO Y POINTS TO PLOT!! (MIN & MAX)\r |
| 345 | GOTO 10 @ WITH THE NEXT REAL X MOVEMENT\r |
| 346 | C\r |
| 347 | 74 CALL XYPLOT(X,BOX(-DOWN),PENPOS) @ DELTA SPIKE FOR TRIGGER CHANNEL\r |
| 348 | 71 IF (BOTH) GOTO 72 @ IF THERE ARE TWO POINTS TO PLOT THEN GO 72 ELSE\r |
| 349 | CALL XYPLOT (X,BOX(Y),PENPOS) @ WE PLOT THIS ONE AND PRESS IT INTO U/L LIMITS\r |
| 350 | IF(TRGPLT)\r |
| 351 | * CALL XYPLOT(X,BOX(-DOWN),PENPOS) @ DELTA SPIKE FOR TRIGGER CHANNEL\r |
| 352 | GO TO 73\r |
| 353 | 72 CALL XYPLOT (X,BOX(YFMIN),PENPOS) @ UPPER AND LOWER Y VALUE TO PLOT\r |
| 354 | CALL XYPLOT (X,BOX(YFMAX),PENPOS)\r |
| 355 | YFMIN=9999. @ SET UP NEW MIN/MAX FETCH CYCLE\r |
| 356 | YFMAX=-YFMIN\r |
| 357 | BOTH =.FALSE. @ CLEAR UPPER/LOWER FLAG\r |
| 358 | 73 CONTINUE\r |
| 359 | OLDX=X @ SAVE LAST X VALUE\r |
| 360 | L1=BETW(-.1,Y,UP-DOWN) @ L1:= Y INSIDE U/L LIMITS!\r |
| 361 | PENPOS=PENDWN\r |
| 362 | IF (NXTBIT.GE.0) GOTO 10 @ NO MORE SPIKES IN THIS TRIGG TIME WORD, SKIP TO 10\r |
| 363 | X=X+(XF(I+1)-XF(I))/TTRGW @ COMPUTE NEW X FOR MULTIPLE SPIKE EVENTS\r |
| 364 | GOTO 75 @ REPEAT FOR NEXT SPIKE IN THIS TIME WORD\r |
| 365 | 10 CONTINUE\r |
| 366 | IF (.NOT. TIMABZ) GOTO 25 @ WORK DONE FOR X-Y GRAPHICS\r |
| 367 | C\r |
| 368 | C MAKE A SCALE FOR THE ORDINATE ( INPUT VOLTAGE )\r |
| 369 | C\r |
| 370 | CALL WHERE (TE1,TE1,TE1,TE2)\r |
| 371 | C HERE WE WRITE THE CALIBRATION AND NORMALISATION FACTOR ONTO THE RIGHT SIDE\r |
| 372 | CALL FACTOR (1.,1.) @ RESET TO THE NORMAL FACTOR FOR SYMBOL\r |
| 373 | CALL NUMBER (XLEN+YN,TE2*(UP-DOWN)/2.-1.2*YN\r |
| 374 | * ,YN*.8,NORM(CO+1),90.,2)\r |
| 375 | C\r |
| 376 | CALL FACTOR (1.,TE2)\r |
| 377 | CALL XYPLOT (-.5,0,-PENUP)\r |
| 378 | PENPOS=PENUP\r |
| 379 | DO 55 I=0,10\r |
| 380 | TE1=DOWN+I*(UP-DOWN)/10.\r |
| 381 | CALL XYPLOT (0,TE1-DOWN,PENPOS)\r |
| 382 | PENPOS=PENDWN\r |
| 383 | J=MOD(I,5)\r |
| 384 | TE3=COND(J.EQ.0,-.5,-.3)\r |
| 385 | CALL XYPLOT (TE3,TE1-DOWN,PENDWN)\r |
| 386 | CALL XYPLOT (0,TE1-DOWN,PENDWN)\r |
| 387 | IF (MOD(I,10).NE.0) GOTO 55\r |
| 388 | CALL FACTOR (1.,1.) @ WRITE LOWER AND UPPER LIMIT ONTO THE\r |
| 389 | CALL NUMBER (-XOFSET+2.*YZ,(TE1-DOWN)*TE2-YN*.38,YN*.75,TE1,0,\r |
| 390 | * -1) @ AXIS\r |
| 391 | CALL FACTOR (1.,TE2)\r |
| 392 | CALL XYPLOT (0,TE1-DOWN,PENUP)\r |
| 393 | 55 CONTINUE\r |
| 394 | CALL XYPLOT (.5,0,-PENUP)\r |
| 395 | CALL FACTOR (1.,1.)\r |
| 396 | CALL SYMBOL (-XOFSET+YZ,\r |
| 397 | * AMAX1(0.,((YLEN-ALLCHS*.5)/ALLCHS-4.*YZ))*.5,YZ,\r |
| 398 | * NCOND(ADPLT,'CH ',TRGPLT,'TRG','ADD'),90.,3)\r |
| 399 | CALL NUMBER (999.,999.,YZ,\r |
| 400 | * NCOND(ADPLT,CO,TRGPLT,CO-CHNLS+1,CO-STRIGS-CHNLS),90.,-1) @ AD CHANNEL # : 0 .. CHNLS, TRG CHAN#: 1 .. STRIGS\r |
| 401 | IF(.NOT.TRGPLT)\r |
| 402 | * CALL SYMBOL (-XOFSET+YZ+1.2*YN,YLEN/NUMCN*.33-YZ,YN*.8\r |
| 403 | * ,'[DEG]',90.,5) @ A/D CHANNELS, SO WE PLOT DEGREES\r |
| 404 | C\r |
| 405 | C\r |
| 406 | CO=CO+1 @ HERE WE INCREMENT THE CHANNEL NUMBER\r |
| 407 | 25 CALL FACTOR (1.,1.)\r |
| 408 | CALL XYPLOT (0.,-TEMSET,-PENUP) @ RESET CORRECT ORIGIN OF DIAGRAM\r |
| 409 | IF BREAK(11) GOTO 40\r |
| 410 | 20 CONTINUE\r |
| 411 | \fC\r |
| 412 | C IF ABZISSA IS TIME SCALE THEN DRAW A TIME SCALE\r |
| 413 | C\r |
| 414 | IF (.NOT.TIMABZ) GOTO 40\r |
| 415 | CALL FACTOR (XLEN/(PLEND-PLBEG),1.)\r |
| 416 | CALL XYPLOT (0.,-.5,-PENUP)\r |
| 417 | C HERE WE PLOT THE LITTLE BAR INDICATING A SECOND OR MINUTE\r |
| 418 | ABISMI=PLEND-PLBEG.GT.300 @ ABZISSE EXCEEDS 5 MINUTES SO WE DRAW A MINUTE SCALING\r |
| 419 | EXPAND=NCOND(PLEND-PLBEG.LE.5,10,1) @ IF THE TIME SCALE IS .LE. 5 SECONDS THEN WE MARK EACH 1/10 SEC\r |
| 420 | C @ REMEMBER : IF (ABISMI) EXPAND=.FALSE. FOR CORRECT ACTION \r |
| 421 | DO 30 I=PLBEG*EXPAND,PLEND*EXPAND @ 1 SEC INCREMENTS\r |
| 422 | TE1=I-PLBEG*EXPAND\r |
| 423 | CALL XYPLOT (TE1/EXPAND,0,PENDWN)\r |
| 424 | IF (.NOT.ABISMI) TE2=COND(MOD(I,10).EQ.0,-.7, MOD(I,5).EQ.0,-.5,\r |
| 425 | * -.3)\r |
| 426 | IF (ABISMI) TE2=COND(MOD(I,600).EQ.0,-.7,\r |
| 427 | * MOD(I,300).EQ.0,-.5, MOD(I,60).EQ.0,-.3)\r |
| 428 | CALL XYPLOT (TE1/EXPAND,TE2,PENDWN) @ HERE WE PLOT THE SMALL BAR\r |
| 429 | CALL XYPLOT (TE1/EXPAND,0,PENDWN)\r |
| 430 | C HERE WE COMPUTE WHERE TO WRITE A NUMBER ONTO THE TIME AXIS\r |
| 431 | TE2=PLEND-PLBEG @ COMPUTE THE SIZE OF THE TIME AXIS\r |
| 432 | IF (.NOT.ABISMI) GOTO 31 @ IF WE PLOT A SECONDS AXIS THEN GOTO 31\r |
| 433 | IF (MOD(I,\r |
| 434 | * NCOND(TE2.GT.5400,1800,TE2.GE.1800,600,TE2.GT.900,300,\r |
| 435 | * TE2.GT.300,120,60)).GT.0) GOTO 30 @ COMPUTE THE MINUTE WHERE TO PLOT THE NUMBER\r |
| 436 | GOTO 32\r |
| 437 | 31 IF (MOD(I,NCOND(TE2.GT.180,30,TE2.GT.60,20,TE2.GT.30,10,\r |
| 438 | * TE2.GT.10,5,TE2.GT.5,2,10)).GT.0) @ WE ASSUME: TE2.LE.5 THEN EXPAND:=10 ELSE EXPAND:=1 !!!\r |
| 439 | * GOTO 30\r |
| 440 | C\r |
| 441 | C HERE WE PLOT THE NUMBER ONTO THE AXIS\r |
| 442 | C\r |
| 443 | 32 CONTINUE\r |
| 444 | CALL WHERE (TE2,TE2,TE2,TE3) @ GET THE X FACTOR\r |
| 445 | CALL FACTOR (1.,1.) @ RESET TO THE NORMAL FACTOR FOR SYMBOL\r |
| 446 | CALL NUMBER (TE1/EXPAND*TE2-INT(ALOG10(AMAX0(COND(ABISMI,\r |
| 447 | * I/60.,I/EXPAND),1))+.01)\r |
| 448 | * *YN/2.-YN*.3,\r |
| 449 | * -1.3,YN,COND(ABISMI,I/60.,I/EXPAND),0,-1)\r |
| 450 | CALL FACTOR (TE2,TE3)\r |
| 451 | CALL XYPLOT (TE1/EXPAND,0,PENUP)\r |
| 452 | CALL XYPLOT (TE1/EXPAND,0,PENDWN)\r |
| 453 | I=NCOND(ABISMI,MIN0(I+59,PLEND-1),I) @ MINUTE SCALE HAS 60 SEC INCREMENT\r |
| 454 | \r |
| 455 | 30 CONTINUE\r |
| 456 | CALL FACTOR (1.,1.)\r |
| 457 | CALL XYPLOT (0,.5,-PENUP)\r |
| 458 | CALL SYMBOL (XLEN/1.5,-YOFSET,YZ,TEXT0(NCOND(ABISMI,1,3)),0,10)\r |
| 459 | C\r |
| 460 | C\r |
| 461 | 40 CALL FACTOR (1.,1.)\r |
| 462 | IF (BREAK(11)) GOTO 60 @ USER SWITCHED OFF THE PLOTTER\r |
| 463 | CALL LABPLT (0,-YOFSET,PLEND)\r |
| 464 | IF (BREAK(11)) GOTO 60\r |
| 465 | CALL SYMBOL (YZ,YLEN+YZ,YZ,LABEL,0,MIN0(42,LABCNT*6)) @ PLOT 42 CHARACTERS INTO THE FIRST LINE OF LABEL\r |
| 466 | IF (LABCNT.GT.7)\r |
| 467 | * CALL SYMBOL (YZ,YLEN,YZ,LABEL(8),0,LABCNT*6-42) @ AND THE REMAINING INTO THE NEXT LINE\r |
| 468 | 60 CONTINUE\r |
| 469 | CALL XYPLOT (38.,25.,PENUP)\r |
| 470 | CALL EXPLT\r |
| 471 | RETURN\r |
| 472 | 1 FORMAT (' KANAL ABZISSE/ORDINATE (ZEITBASIS=8), SCHRITTWEITE',\r |
| 473 | * ' (2I1,I3) (',\r |
| 474 | * 2I1,I3,')? ',$)\r |
| 475 | 2 FORMAT (2A1,I3)\r |
| 476 | 3 FORMAT (' ANZAHL DER DARZUSTELLENDEN ',A3,' KANAELE (I1) (',I1,\r |
| 477 | * ') ? ',$)\r |
| 478 | 4 FORMAT (' NUR FUER',F6.1,' SEK. MESSDATEN JEDOCH',F6.1,\r |
| 479 | * ' SEC. ANGEFORDERT. ')\r |
| 480 | 5 FORMAT (' ORDINATEN MAXIMUM FUER ',A3,' KANAL',\r |
| 481 | * I2,' (',F5.0,')?',$)\r |
| 482 | 6 FORMAT (' " " MINIMUM " ',A3,' " " ',\r |
| 483 | * I2,' (',F5.0,')?',$)\r |
| 484 | 7 FORMAT (F5.0)\r |
| 485 | 8 FORMAT (' FAKTOR FUER ',A5,14X,'(',F5.3,')?',$)\r |
| 486 | 9 FORMAT (' ABZISSEN/ ORDINATEN KANAL ODER SCHRITTWEITE ',\r |
| 487 | * ' FEHLERHAFT: ',3I4)\r |
| 488 | END\r |
| 489 | \1a\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 |