| 1 | C -+-+-+-+-+ \ e H A E S A C . F T \ e -+-+-+-+-+\r |
| 2 | C\r |
| 3 | C * UP 20-MAY-83 INSERT DOCUMENTATION\r |
| 4 | C * UP 13-JUL-83 IMPROVED SEARCH ALGORITHM\r |
| 5 | C\r |
| 6 | C SCAN THE EOG SPECTRUM TO FETCH THE SACCADES\r |
| 7 | C THE EOG SPECTRUM IS STORED ON CHANNEL 0!\r |
| 8 | C\r |
| 9 | SUBROUTINE SACCAD (STARTW,ENDW,THRL,THRU,SACBEG,SACEND,\r |
| 10 | * SACAMP,NXTSAC,ERR)\r |
| 11 | C\r |
| 12 | C STARTW ANFANG DES ZU DURCHSUCHENDEN FENSTERS\r |
| 13 | C ENDW ENDE DES FENSTERS\r |
| 14 | C THRL UNTERE SCHWELLE FUER FIR/DFIR FUNKTION\r |
| 15 | C THRU OBERE SCHWELLE\r |
| 16 | C SACBEG ZEITPUNKT DES BEGINS EINER RASCHEN PHASE\r |
| 17 | C SACCEND ZEITPUNKT DES ENDES EINER SACCADE\r |
| 18 | C SACAMP AMPLITUDE DER RASCHEN PHASE\r |
| 19 | C NXTSAC VON HIER AB WIRD NACH DER NAECHSTEN R.P. GESUCHT\r |
| 20 | C ERR FEHLER RUECKSPRUNG CODE\r |
| 21 | C 1 KEINE SACCADE MEHR GEFUNDEN\r |
| 22 | C 2 KEIN ENDE GEFUNDEN\r |
| 23 | C 3 KEIN ENDE GEFUNDEN\r |
| 24 | C\r |
| 25 | C INPUT PARAMETERS ARE\r |
| 26 | C\r |
| 27 | INTEGER STARTW,ENDW\r |
| 28 | REAL THRL,THRU\r |
| 29 | C\r |
| 30 | C OUTPUT PARAMETERS ARE\r |
| 31 | C\r |
| 32 | REAL SACAMP\r |
| 33 | INTEGER NXTSAC,ERR,SACBEG,SACEND\r |
| 34 | C\r |
| 35 | C\r |
| 36 | INCLUDE HAEBUF.FI\r |
| 37 | INCLUDE HAECEO.FI\r |
| 38 | INCLUDE HABRK.FI\r |
| 39 | C\r |
| 40 | \fC\r |
| 41 | C FOLGENDE SUCHSCHRITTE\r |
| 42 | C1. DO 20 I=STARTW,ENDW\r |
| 43 | C BESTIMME SACCADEN ANFANGSZEITPUNKT UND DIE ART DER RASCHEN PHASE\r |
| 44 | C IF DFIR(I) THEN TIME1:=I ; \ BEGINN DER RASCHEN PHASE \\r |
| 45 | C \ RICHTUNG DER RASCHEN PHASE := IF FIR(I) < 0 THEN AUF PHASE ELSE AB PHASE \\r |
| 46 | C ELSE DFIR(I) NICHT GEFUNDEN FEHLER #1 FI \r |
| 47 | C\r |
| 48 | C2. DO 33 I=TIME1,ENDW\r |
| 49 | C SOLANGE DFIR(I) BESTIMME MAXIMUM VON FIR(I) : AMP1:=MAX(ABS(FIR)) ;\r |
| 50 | C TIME2 := I AN DER STELLE AMP1 \ KORREKTUR DER ANFANGSZEIT SACBEG: \\r |
| 51 | C \ AN DER STELLE DES EXTREMWERTES VOM EOG NEHME DEN ANFANG DER R.P. AN \\r |
| 52 | C IF I=ENDW FEHLER # 2 \ DA KEIN SACCADENENDE GEFUNDEN\\r |
| 53 | C ELSE TIME3:= I FI\r |
| 54 | C\r |
| 55 | C3. DO 50 I=TIME3,TIME3+10\r |
| 56 | C \ SUCHE IN DEN NAECHSTEN 10 MESSWERTEN DANN DFIR(I) \\r |
| 57 | C IF I=TIME3+10 THEN TIME4:=1 ; FEHLER # 3 ELSE\r |
| 58 | C TIME4:=I FI\r |
| 59 | C\r |
| 60 | C4. DO 60 I=TIME4,ENDW\r |
| 61 | C \ SUCHE STELLE DES EXTREMWERTES VOM EOG UND NEHME DORT ENDE DER R.P. AN \\r |
| 62 | C TIME5:=SACEND:=I \ AND DER STELLE DES MAXIMUMS \\r |
| 63 | C\r |
| 64 | C5. AUSGABE AUF DRUCKER:\r |
| 65 | C SACBEG, SACEND-SACBEG, -Y(SACBEG)+Y(SACEND),CH2(SACBEG)\r |
| 66 | C\r |
| 67 | \fC\r |
| 68 | REAL ATHRL,ATHRU,SAC,SAC1,SAC2,SAC3,SAC4\r |
| 69 | INTEGER I,TIME(5)\r |
| 70 | * ,HOME,EOGCHN @ ASSIGNED GOTO, CHANNEL NUMBER FOR THE EOG SPECTRUM \r |
| 71 | C\r |
| 72 | C STATEMENT FUNCTIONS ARE:\r |
| 73 | C\r |
| 74 | BETW(AP0,BP0,CP0)=AP0.LE.BP0.AND.BP0.LT.CP0\r |
| 75 | LOGICAL BETW\r |
| 76 | FIR(IP0)=-XYSAM(IP0-4,EOGCHN)-XYSAM(IP0-3,EOGCHN)+\r |
| 77 | * XYSAM(IP0-1,EOGCHN)+2*XYSAM(IP0,EOGCHN)+XYSAM(IP0+1,EOGCHN)-\r |
| 78 | * XYSAM(IP0+3,EOGCHN)-XYSAM(IP0+4,EOGCHN) @ SAMCNT FINITE IMPULSE RESPONSE FILTER\r |
| 79 | C\r |
| 80 | DFIR(IP2)=.NOT.BETW(ATHRL,FIR(IP2),ATHRU)\r |
| 81 | LOGICAL DFIR\r |
| 82 | C\r |
| 83 | DATA EOGCHN /0/ @ CHANNEL # FOR THE EOG\r |
| 84 | C\r |
| 85 | ATHRL=THRL @ COMPILER ERROR IN STATEMENT FUNCTION\r |
| 86 | ATHRU=THRU\r |
| 87 | ERR=0\r |
| 88 | SACAMP=0\r |
| 89 | C\r |
| 90 | DO 20 I=STARTW,ENDW\r |
| 91 | IF(DFIR(I)) GOTO 30\r |
| 92 | 20 CONTINUE\r |
| 93 | ERR=1 @ NO SACCADE FOUND\r |
| 94 | NXTSAC=ENDW\r |
| 95 | SACBEG=ENDW\r |
| 96 | SACEND=ENDW\r |
| 97 | RETURN\r |
| 98 | C\r |
| 99 | 30 TIME(1)=I @ TIME1 COMPUTED\r |
| 100 | AMP1=-1\r |
| 101 | TIME(2)=0\r |
| 102 | DO 33 I=TIME(1),ENDW\r |
| 103 | IF (.NOT.DFIR(I)) GOTO 35\r |
| 104 | TE1=ABS(XYSAM(I,EOGCHN)) @ SEARCH FOR MIN/MAX OF EOG\r |
| 105 | TIME(2)=NCOND(TE1.GE.AMP1,I,TIME(2)) @ AND THIS POINTS TO THE BEGINNING OF THE SACCADE\r |
| 106 | 33 AMP1=AMAX1(AMP1,TE1)\r |
| 107 | 35 CONTINUE @ TIME 2 COMPUTED\r |
| 108 | TIME(3)=I @ TIME 3 COMPUTED\r |
| 109 | C\r |
| 110 | DO 50 I=TIME(3),TIME(3)+10\r |
| 111 | IF (DFIR(I)) GOTO 53\r |
| 112 | 50 CONTINUE\r |
| 113 | ERR=3\r |
| 114 | SACBEG=STARTW\r |
| 115 | SACEND=TIME(3)+10\r |
| 116 | NXTSAC=TIME(1)+15\r |
| 117 | RETURN\r |
| 118 | 53 TIME(4)=I @ TIME 4 COMPUTED\r |
| 119 | C\r |
| 120 | AMP2=-1\r |
| 121 | TIME(5)=0\r |
| 122 | DO 60 I=TIME(4),ENDW\r |
| 123 | IF (.NOT.DFIR(I)) GOTO 65\r |
| 124 | TE1=ABS(XYSAM(I,EOGCHN)) @ SEARCH FOR MIN/MAX OF EOG\r |
| 125 | TIME(5)=NCOND(TE1.GE.AMP2,I,TIME(5)) @ AND THIS POINTS TO THE END OF THE SACCADE\r |
| 126 | 60 AMP2=AMAX1(AMP2,TE1)\r |
| 127 | 65 CONTINUE @ TIME 5 COMPUTED\r |
| 128 | C\r |
| 129 | C\r |
| 130 | NXTSAC=I\r |
| 131 | SACBEG=TIME(2)\r |
| 132 | SACEND=TIME(5)\r |
| 133 | SAC=XYSAM(SACEND,EOGCHN)\r |
| 134 | SAC3=SAC\r |
| 135 | ASSIGN 70 TO HOME\r |
| 136 | GOTO 100\r |
| 137 | 70 SAC1=SAC\r |
| 138 | SAC=XYSAM(SACBEG,EOGCHN)\r |
| 139 | SAC4=SAC\r |
| 140 | ASSIGN 71 TO HOME\r |
| 141 | GOTO 100\r |
| 142 | 71 SAC2=SAC\r |
| 143 | SACAMP=SAC1-SAC2\r |
| 144 | CX WRITE (3,4711) SAC1,SAC2,SAC3,SAC4\r |
| 145 | 4711 FORMAT (6H --- ,1P,4E11.3)\r |
| 146 | RETURN\r |
| 147 | C\r |
| 148 | C INTERNAL SUBROUTINE\r |
| 149 | C\r |
| 150 | 100 DO 110 I=1,8 @ CALIBRATE FOR NEGATIVE ANGLE\r |
| 151 | IF (SAC.GE.I*5.*EICH(1,I)+CALIBR) GOTO 120\r |
| 152 | 110 CONTINUE\r |
| 153 | I=8\r |
| 154 | 120 IF (I.EQ.1) GOTO 130 @ BETWEEN 0 AND +40 DEG, CONTINUE SEARCH\r |
| 155 | SAC=(SAC-CALIBR)/ABS(EICH(1,I))\r |
| 156 | GOTO HOME\r |
| 157 | 130 I=I+1\r |
| 158 | IF (SAC.LE.CALIBR) GOTO 120 @ 0 DEGREES\r |
| 159 | DO 140 I=2,8\r |
| 160 | IF (SAC.LE.I*5.*EICH(2,I)+CALIBR) GOTO 150\r |
| 161 | 140 CONTINUE\r |
| 162 | I=8\r |
| 163 | 150 SAC=(SAC-CALIBR)/EICH(2,I)\r |
| 164 | GOTO HOME\r |
| 165 | C\r |
| 166 | END\r |
| 167 | \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\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 |