! ! ! ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ! ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ! ! ! %CONTROL K'001001' ! ! %BEGIN ! ! ! !J.C.A. STARTED 10:11:76 !T.P.L LAST UPDATE 25:08:81 11:30 - FILE MEANS ! FOR ARTE MK 7.0 UPTO 128 SCRIPTS ! --- STACK 15000, STREAMS 4 --- ! ######################################################## ! # # ! # ANALYSIS OF A.R.T.E. RUN-LOGS # ! # # ! ######################################################## !ANALYSES LOG FILE PRODUCED DURING RUNS OF ARTE MK 7.0 !PROVIDES DISTRIBUTIONS OF RESPONSE AND THINK TIMES !AND ALSO USER WAIT TIMES (FOR ARTE CHECK OUT) !AS HISTOGRAMS (USING EXT RT 'HIST') !CORRECTED VERSION SO THAT ALL OF THE HISTOGRAM IS PRINTED !USES W.S.C.'S PATENT DOUBLE ARITHMETIC PACKAGE !ALSO DISTRIBUTIONS OF CHARACTER I/O !MANY MODS TO TRY TO MAKE IT ALL WORK WITH LARGE L-D FILES ! --- COMPLEX CONDITIONS ARE VERY SUSPECT WITH CURRENT COMPLIER ! --- (13/3/78) THEREFORE THEY ARE BEING ERADICATED IN FAVOUR ! --- OF LESS ELEGANT BUT SAFER ALTERNATIVES. ! ! INPUT: ! STREAM 0 COMMAND STREAM ! STREAM 1 DATA LOG FROM STIMULATOR RUN ! ! OUTPUT: ! STREAM 1 RESULTS SUMMARY ! STREAM 2 EXPANDED DATA LOG ! !MODE=4: ! READS FIRST 'FIXSKIP' SECONDS OF INPUT FILE AND THROWS IT AWAY ! THEN ANALYSES THE NEXT 'FIXTIME' SECONDS OF INPUT FILE AND DUMPS DATA ! CURRENTLY FIXSKIP=8 MINUTES (WARM UP TIME IN EXPERIMENT ! CURRENTLY FIXTIME=30 MINUTES (MEASUREMENT WINDOW IN EXPERIMENT ! ! ! !************************************************************************** %OWNSTRING(11) NN=' NORMALISED' %OWNSTRING(20) YAXIS='RESPONSE FREQUENCY' %OWNSTRING(60) RSP1TITLE='REACTION TIME (TILL FIRST REPLY)' %OWNSTRING(60) RSP0TITLE='RESPONSE TIME (TILL PROMPT)' %OWNSTRING(60) USRDTITLE='USER WAIT TIME' ! %OWNSTRING(12) %ARRAY WHENCE(1:3)=%C 'FROM ', 'ON WAY', 'TO '; ! %OWNSTRING(64) TITLE='A.R.T.E. LOG ANALYSIS - VERSION 7.0 (25/08/81)' %OWNSTRING(16) CHAR PROMPT="CHARS PER UNIT: " %OWNSTRING(20) NORM PROMPT="UNITS PER 1/10 SEC: " %OWNSTRING(11) PROMPT0="ARTE VRSN: " %OWNSTRING(64) PROMPT1='GIVE MODE: ALL DATA=1, EXPAND LOG=2, SUMMARY=3' %OWNSTRING(10) PROMPT2=', FIXED=4' ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %CONSTINTEGER GREATEST=32767; !LARGEST POSSIBLE NUMBER(16 BITS) %CONSTINTEGER PERSEC=10; !TICKS PER SECOND %CONSTINTEGER DISTMAX=200; !MAX VALUE OF RESPONSE RANGE %CONSTINTEGER RECTYPMAX=3; !TYPES OF INPUT RECORD %CONSTINTEGER NORM FACTOR=200; !MAX VALUE OF NORMALISED GRAPH %CONSTINTEGER SP=0 %CONSTINTEGER GAP=1 %CONSTINTEGER START=0 %CONSTINTEGER QUANTUM=1000; !FOR DOUBLE WORD ARITHMETIC ! %CONSTINTEGER ADD=0 %CONSTINTEGER SUBTRACT=1 %CONSTINTEGER MULTIPLY=2 %CONSTINTEGER DIVIDE=3 ! %INTEGER FIXSKIP; !8 MINUTES IN SEC TICKS %INTEGER FIXTIME; !30 MINUTES IN SEC TICKS %CONSTINTEGER FIXRECS=32760 %CONSTINTEGER TIMEMASK1=K'077777' %CONSTINTEGER TIMEMASK=K'077777' ! %CONSTINTEGER NULL=0 %CONSTINTEGER SYSWAIT=1 ;!PROCESS WAITING ON SYSTEM REPLY %CONSTINTEGER USERWAIT=2 ;!PROCESS WAITING ON USER INPUT %CONSTINTEGER RECDATA=3 ! %CONSTINTEGER LINESPEED=1; !LINE SPEED IN CHARS PER TICK %CONSTINTEGER PROCS=128 ! %CONSTINTEGER EOF=4 ! %CONSTBYTEINTEGER END CHAR='+' %CONSTBYTEINTEGER START SYMB='*' %CONSTINTEGER MTEXTL=200 ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %OWNBYTEINTEGERARRAY XAXISU(1:20)='U','S','E','R',' ','D', 'E','L','A','Y',' ','S','E','C','S',' '(5); ! %OWNBYTEINTEGERARRAY XAXIS1(1:20)='R','E','A','C','T','I','O','N', ' ','1','/','1','0',' ','S','E','C','S',' '(2); ! %OWNBYTEINTEGERARRAY XAXIS0(1:20)='R','E','S','P','O','N','S','E',%C ' ','S','E','C','O','N','D','S',' '(4); ! ! %OWNINTEGERARRAY DISTRSP0(0:DISTMAX) %OWNINTEGERARRAY DISTRSP1(0:DISTMAX) %OWNINTEGERARRAY USERDEL(0:DISTMAX) ! %OWNINTEGERARRAY RECTYP(1:RECTYPMAX) ! %OWNBYTEINTEGERARRAY THIS RUN(0:100) %OWNINTEGERARRAY TEXT(0:MTEXTL) ! %OWNINTEGER INITIALISED='N' ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %OWNINTEGER THTCP,THTCHIN,THTCHOUT %OWNINTEGER THTTNK,THTRSPRESPNS %OWNINTEGER THTRSPRESPNS1,THHOLDTIME,TRSPRESPNS1,HOLDTIME %OWNINTEGER H,MODE,GRAPHS %OWNINTEGER TINTERACT1,THINK %OWNINTEGER T THINK,TCHARSIN,TCHARSOUT,TTCP,TRSPRESPNS,TINTERACTS %OWNINTEGER TIME,DIRECTION,TT,LENGTH, XLENGTH %OWNINTEGER MAX TIME,MAX RECORDS,THIS VCNSL,F,TOTAL %OWNINTEGER LASTIME %OWNINTEGER ZERO TIME %OWNINTEGER SKIPTIME %OWNINTEGER NTIME,RECS,MINS10 %OWNINTEGER THDUMMY,DUMMY,THBASETIME,BASETIME %OWNINTEGER THCLOCK,CLOCK %OWNINTEGER BASERECS,THBASERECS %OWNINTEGER CHARTIME=0 %OWNINTEGER NORMTIME=1 ! ! !++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %RECORDFORMAT STATE(%INTEGER TIME1,TIME2,STATUS,CHARSIN,CHARSOUT,%C THTCP,THCHIN,THCHOUT,THRSPRESPNS,THRSPRESPNS1,THTHINK,%C INTERACT,INTERACT1,RSPRESPNS,RSPRESPNS1,THINK,TCPD,THR,R,THRB,RB) ! ! %RECORD(STATE) %ARRAY PLIST(0:PROCS) ! ! %OWNINTEGERARRAY CHARSIN(0:PROCS) ! ! %RECORD(STATE) %NAME STAT ! ! !+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ! ! %EXTERNALROUTINESPEC HIST(%INTEGERARRAYNAME HST,%C %INTEGER LEN,START,ST,GAP,SP,%C %STRINGNAME TITLE,YAXIS,%BYTEINTEGERARRAYNAME XAXIS) ! %EXTERNALROUTINESPEC PRINTD(%INTEGER N1,N2,SP,DEC) ! %EXTERNALROUTINESPEC AVAR(%INTEGERARRAYNAME NUM,%C %INTEGER N,START,OP,VAL,GAP) ! %EXTERNALROUTINESPEC ARITH(%INTEGERNAME N1,N2,%INTEGER BY1,BY2,OP) ! ! ! ! !***************************************************************************** !************************************************************************** ! %ROUTINE PRINT TITLE !*** DUMPS HEADER INFORMATION ON RESULTS FILES %INTEGER F ! PRINT SYMBOL(12); !THROW A PAGE PRINTSTRING(TITLE) NEWLINES(2) %IF THISRUN(0)<1 %THEN %RETURN %CYCLE F=1,1,THIS RUN(0) PRINTSYMBOL(THIS RUN(F)) %REPEAT NEWLINE ! %END ;!RT PRINT TITLE %ROUTINE FIND(%INTEGER SYMB) ! !SKIPS ALL SYMBOLS UNTIL FINDS 'SYMB' ! SKIP SYMBOL %WHILE NEXT SYMBOL#SYMB ! %END ;!RT FIND ! ! !**************************************************************************** ! ! %ROUTINE CHECK OVER(%INTEGERNAME THOU,UNITS) ! !CHECKS UNITS HAVE NOT OVERFLOWED INTO THE THOU PARTITION !IF DECREMENTS UNITS AND INCREMENTS THOU'S ACCORDINGLY ! ! %WHILE UNITS>=QUANTUM %THEN UNITS=UNITS-QUANTUM %AND THOU=THOU+1 ! %END ;!RT CHECK OVER ! ! ! %ROUTINE CONVERT(%INTEGER X) ! ! A VERY DIRTY BIT OF WORK WITH SIDE EFFECTS ! TAKES X AND CONVERTS IT TO A WSC DOUBLE ARITHMETIC VALUE IN THDUMMY AND DUMMY ! ! THDUMMY=0 DUMMY=X CHECK OVER(THDUMMY,DUMMY) ! %END ;!RT CONVERT ! ! ! !*************************************************************************** ! ! %ROUTINE GET NUMBS(%INTEGERARRAYNAME AA,%INTEGER UPTO,NORM) ! ! FOR FINDING OUT THE NUMBER OF RESPONSES COMING THRU ! IN LESS THAN SOME SPECIFIED TIME ! %INTEGER F,DUM,THDUM ! ! DUM=0; THDUM=0 %CYCLE F=0,1,UPTO DUM=DUM+AA(F) CHECK OVER(THDUM,DUM) %REPEAT ! PRINTD(THDUM,DUM,11,0) ARITH(THDUM,DUM,0,100,MULTIPLY) ARITH(THDUM,DUM,0,NORM,DIVIDE) PRINTD(THDUM,DUM,14,0) NEWLINE ! %END ;!RT GET NUMBS ! ! ! %ROUTINE NORM(%INTEGERARRAYNAME AA,%INTEGER LOW,HIGH) ! !NORMALISES THE VALUES IN AA TO RANGE 0 -> NORMFACTOR ! ! %INTEGER F,TAL,THDUM,DUM ! ! THDUM=0 TAL=0 %CYCLE F=LOW,1,HIGH TAL=TAL+AA(F) %REPEAT ! %IF TAL=0 %THEN %RETURN ! %CYCLE F=LOW,1,HIGH DUM=AA(F) CHECK OVER(THDUM,DUM) ARITH(THDUM,DUM,0,NORMFACTOR,MULTIPLY) ARITH(THDUM,DUM,0,TAL,DIVIDE) AA(F)=DUM+QUANTUM*THDUM %REPEAT ! %END ;!RT NORMALISE ! ! !**************************************************************************** ! ! %ROUTINE PRINT PROC(%INTEGER PROC) !*** PRINTS OUT INFORMATION ON THIS PROCESS FROM PROCESS LIST %RECORD(STATE) %NAME THIS %INTEGER INTER,CONVERS %ROUTINE DIV WRITE(%INTEGER TH,UN,BY,SPS) ! !*** DIVIDES DOUBLE WORD 'TH'&'UN' BY 'BY' AND PRINTS WITH 'SPS' SPACES ARITH(TH,UN,0,BY,DIVIDE) %UNLESS BY=0 PRINTD(TH,UN,SPS,0) ! %END ;!RT DIV WRITE ! ! ! ! ! ! THIS==PLIST(PROC) INTER=THIS_INTERACT1 ;!NUMBER OF INTERACTIONS CONVERS=THIS_INTERACT; !NUMBER OF COMPLETIONS %IF INTER=0 %THEN %RETURN ! PRINTSTRING('VIRT CNSL') WRITE(PROC,4); NEWLINE ! PRINTSTRING('COMPLETIONS') WRITE(CONVERS,14); SPACES(5) PRINTSTRING('INTERACTIONS ') WRITE(INTER,9); NEWLINE ! PRINTSTRING('CHARS IN '); PRINTD(THIS_THCHIN,THIS_CHARSIN,17,0) PRINTSTRING(' CHARS OUT '); PRINTD(THIS_THCHOUT,THIS_CHARSOUT,13,0) NEWLINE ! PRINTSTRING('IN PER LINE '); DIV WRITE(THIS_THCHIN,THIS_CHARSIN,INTER,14) PRINTSTRING(' OUT PER INTER '); DIV WRITE(THIS_THCHOUT,THIS_CHARSOUT,INTER,9) NEWLINE ! PRINTSTRING(' TOTAL RESPONSE '); PRINTD(THIS_THRSPRESPNS,THIS_RSPRESPNS,10,0) PRINTSTRING(' AV RESPONSE '); DIV WRITE(THIS_THRSPRESPNS,THIS_RSPRESPNS,INTER,11) NEWLINE ! PRINTSTRING(' TOTAL REACTION '); PRINTD(THIS_THRSPRESPNS1,THIS_RSPRESPNS1,9,0) PRINTSTRING(' AV REACTION '); DIV WRITE(THIS_THRSPRESPNS1,THIS_RSPRESPNS1,INTER,10) NEWLINE ! PRINTSTRING(' USER DELAY '); PRINTD(THIS_THTHINK,THIS_THINK,14,0) PRINTSTRING(' AV USER DELAY '); DIV WRITE(THIS_THTHINK,THIS_THINK,INTER,9) NEWLINE ! ! PRINTSTRING(' TCP DELAY '); ! PRINTD(THIS_THTCP,THIS_TCPD,15,0) ! PRINTSTRING(' AV TCP DELAY '); ! DIV WRITE(THIS_THTCP,THIS_TCPD,INTER,10) ! NEWLINE ! ! PRINTSTRING('REQUIRED LINE DELAYS OUT ') ! THDUMMY=THIS_THCHOUT ! DUMMY=THIS_CHARSOUT ! ARITH(THDUMMY,DUMMY,0,LINESPEED,DIVIDE) ! PRINTD(THDUMMY,DUMMY,13,0) ! !CHECK ADEQUATE DELAYS HAVE BEEN IMPOSED ! ! %IF THDUMMY>THIS_THTCP %OR (THDUMMY=THIS_THTCP %AND %C ! DUMMY>THIS_TCPD) %THEN PRINTSTRING(' <---------') ! NEWLINE ! %IF MINS10=0 %THEN ->MISSRT; !<10 MINS IN FILE ! PRINTSTRING('COMPLETION RATE (PER MINUTE)') ! CONVERT(THIS_INTERACT) ARITH(THDUMMY,DUMMY,0,MINS10,DIVIDE) ARITH(THDUMMY,DUMMY,0,10,MULTIPLY); !PRINTD ALWAYS DISPLAYS 2 PLACES PRINTD(THDUMMY,DUMMY,9,1) ! ! NEWLINE PRINTSTRING('INTERACTION RATE (PER MINUTE)') CONVERT(THIS_INTERACT1) ARITH(THDUMMY,DUMMY,0,MINS10,DIVIDE) ARITH(THDUMMY,DUMMY,0,10,MULTIPLY) PRINTD(THDUMMY,DUMMY,8,1) NEWLINE MISSRT: PRINTSTRING('TOTAL RUN TIME(SECS) ') DUMMY=ZEROTIME; THDUMMY=0 CHECK OVER(THDUMMY,DUMMY) ARITH(THDUMMY,DUMMY,THIS_THR,THIS_R,ADD) ARITH(THDUMMY,DUMMY,THIS_THRB,THIS_RB,SUBTRACT) ARITH(THDUMMY,DUMMY,0,ZEROTIME,SUBTRACT) ARITH(THDUMMY,DUMMY,0,10,MULTIPLY) PRINTD(THDUMMY,DUMMY,9,1) NEWLINES(2) ! %END ;!RT PRINT PROC ! ! !***************************************************************************** ! ! %ROUTINE PRINT TIME(%INTEGER TIME) !*** TAKES 'TIME' AS CLOCK TICKS AND PRINTS AS MINUTES,SECONDS,TICKS %INTEGER TICKS IN MIN,THDUM,DUM,THMIN,MIN TICKS IN MIN=PERSEC*60; !TICKS IN A MINUTE !*** GET CURRENT TIME %IF THBASETIME=0 %THEN %START %IF BASETIME=0 %THEN TIME=TIME-ZEROTIME %FINISH THDUM=0; DUM=TIME CHECK OVER(THDUM,DUM) ARITH(THDUM,DUM,THBASETIME,BASETIME,ADD) !*** GET MINUTES THMIN=THDUM; MIN=DUM ARITH(THMIN,MIN,0,TICKS IN MIN,DIVIDE) PRINTD(THMIN,MIN,3,0) PRINTSYMBOL(':') ARITH(THMIN,MIN,0,TICKS IN MIN,MULTIPLY) ARITH(THDUM,DUM,THMIN,MIN,SUBTRACT) ARITH(THDUM,DUM,0,PER SEC,MULTIPLY) PRINTD(THDUM,DUM,5,1) %END ;!PRINT TIME !************************************************************************** %ROUTINE ADJUST(%INTEGERNAME TIME,CHARSIN) ! FRO ARTE MK.4 REMOVES CHAR INPUT TIME FROM REACTION & RESPONSE DUMX: TIME=TIME-(CHARSIN*CHARTIME)//NORMTIME %IF TIME<0 %THEN TIME=0 %END ;!RT ADJUST %ROUTINE REINITIALISE !*** CLEARS ALL ARRAYS OUT TO ZERO !*** CLEARS STATUS VECTORS FOR ALL VIRTUAL CONSOLES OUT TO ZERO %INTEGER HOLD,F %CYCLE F=0,1,MTEXTL TEXT(F)=0 %REPEAT %CYCLE F=0,1,DISTMAX USERDEL(F)=0 DISTRSP1(F)=0 DISTRSP0(F)=0 %REPEAT %CYCLE F=0,1,PROCS HOLD=PLIST(F)_STATUS PLIST(F)=0 PLIST(F)_STATUS=HOLD %REPEAT %CYCLE F=1,1,RECTYPMAX RECTYP(F)=0 %REPEAT THBASERECS=0; BASERECS=0 RECS=0 INITIALISED='Y' %END ;!RT REINITIALISE !*************************************************************************** THDUMMY=0; DUMMY=0; MINS10=0 THBASETIME=0; BASETIME=0; LASTIME=0 SKIP TIME=0 TIME=0; %CYCLE F=0,1,PROCS CHARSIN(F)=0 PLIST(F)_STATUS=NULL %REPEAT REINITIALISE !*** TELL WHO WE ARE PRINTSTRING(TITLE) NEWLINE !*** FIND OUT WHICH ARTE WAS USED F = 7 ! PRINTSTRING(PROMPT0) ! NEWLINE ! READ(F) ! %IF F=4 %THEN %START !ARTE MK. 4 MUST ADJUST FOR TYPE IN TIME BEING TIMED FROM BEFORE CHAR TYPED ! PROMPT(CHAR PROMPT) ! READ(CHARTIME) ! PROMPT(NORM PROMPT) ! READ(NORM TIME) ! %IF NORMTIME<=0 %THEN PRINTSTRING("???") %AND NEWLINE %AND %STOP ! %FINISH !*** FIND OUT WHICH MODE PRINTSTRING(PROMPT1) PRINTSTRING(PROMPT2) NEWLINE READ(MODE) SELECT INPUT(3); SELECT OUTPUT(3); SPACES(10); NEWLINES(2); SELECT INPUT(0); SELECT OUTPUT(0) !*** GET PARAMETERS FOR THIS RUN %IF MODE=4 %THEN %START PRINTSTRING('START ANAL IN SECONDS : ');NEWLINE;READ(FIXSKIP) PRINTSTRING('LENGTH OF ANAL IN SECONDS : ');NEWLINE;READ(FIXTIME) !*** FIXED FORMAT - NO LOG EXPANSION,FIXED TIME,FIXED NUMBER OF RECORDS GRAPHS='N' MAX RECORDS=-1 MAX TIME=FIX TIME*PERSEC SKIP TIME=FIXSKIP*PERSEC; !TIME TO BE SKIPPED BEFORE GETTING DATA INITIALISED='N' MODE=3; !OTHERWISE SAME AS MODE=3 %FINISH %ELSE %START !*** ANY PARAMETER SET TO -1 MEANS MAXIMUM AVAILABLE TO BE GIVEN %IF MODE=2 %THEN %START !*** PRINT LOG ON ALL VCNSLS OR ONLY ONE PRINTSTRING('VIRT CNSL: ') NEWLINE READ(THIS VCNSL); ! = -1 MEANS ALL VCNSLS %FINISH ! ! PRINTSTRING('MAX RECORDS: ') NEWLINE READ(MAX RECORDS) ! PRINTSTRING('MAX TIME (IN 1/10 SECONDS): ') NEWLINE READ(MAX TIME) ! ! PRINTSTRING('GRAPHS ? (YES=1): ') ! NEWLINE ! READ(GRAPHS) ! %IF GRAPHS=1 %THEN GRAPHS='Y' %ELSE GRAPHS='N' GRAPHS='N' ! PRINTSTRING('SKIP FIRST 8 MINS ? (YES=1): ') ! NEWLINE ! READ(SKIPTIME) SKIPTIME=0 %IF SKIPTIME=1 %THEN SKIPTIME=FIXSKIP*PERSEC %AND INITIALISED='N' %C %ELSE SKIPTIME=0 %FINISH !*** GET TITLE FOR THIS LOG FROM USER PRINTSTRING('TITLE: ') NEWLINE ! !*** READ IN TITLE FOR THIS RUN %WHILE NEXT SYMBOL#NL %THEN SKIP SYMBOL SKIP SYMBOL %CYCLE F=1,1,100 READ SYMBOL(H) THIS RUN(F)=H %IF H=NL %THEN %EXIT %REPEAT THIS RUN(0)=F !*** PUT TITLES ON OUTPUT FILES SELECT OUTPUT(1) PRINT TITLE %IF MODE=2 %THEN %START SELECT OUTPUT(2) PRINT TITLE %FINISH SELECT INPUT(1) !***************************************************************************** !*** FIND AND SKIP TITLE LINE IN DATA LOG FIND(START SYMB) %CYCLE SELECT OUTPUT(0) READ SYMBOL(F) PRINT SYMBOL(F) SELECT OUTPUT(1) PRINT SYMBOL(F) %IF MODE=2 %THEN %START SELECT OUTPUT(2) PRINT SYMBOL(F) %FINISH ! %IF F=NL %THEN %EXIT %REPEAT %IF MODE#2 %THEN SELECT OUTPUT(1) %ELSE SELECT OUTPUT(2) ! ! !************************************************************************** !*** MAIN LOOP !*** READ IN AND ANALYSE EACH LINE OF THE LOG %CYCLE !*** READ LINE IN READ(TIME) %IF TIME=0 %THEN TIME=LASTIME; !ERROR IN TCPX91 TIME=TIME&TIMEMASK1 RECS=RECS+1 %IF RECS<0 %THEN %START !*** OVERFLOW CONVERT(GREATEST) ARITH(THBASERECS,BASERECS,THDUMMY,DUMMY,ADD) RECS=1 %FINISH %ELSE %START %IF RECS=1 %THEN %START !*** RECORD TIME OF FIRST TRANSACTION ZERO TIME=TIME LASTIME=TIME %FINISH %FINISH ! ! NTIME=(TIME-ZEROTIME)&TIMEMASK ! %IF NTIME>SKIPTIME %THEN %START %IF INITIALISED='N' %THEN %START !*** HAVE JUST GONE OVER 'SKIPTIME'S' WORTH OF FILE THROW EVERYTHING !*** GATHERED SO FAR AWAY (IS ALL WARM UP DATA) REINITIALISE SKIPTIME=GREATEST ZERO TIME=TIME ! BASETIME=0; THBASETIME=0 %FINISH %FINISH !*** CHECK FOR CLOCK OVERFLOWS %IF TIMERECTYPMAX %THEN %START MODE=2 THIS VCNSL=-1 SELECT OUTPUT(0) %FINISH ! ! RECTYP(DIRECTION)=RECTYP(DIRECTION)+1 ! READ(TT) READ(LENGTH) %IF LENGTH#0 %THEN %START !*** READ IN TEXT OF MESSAGE PASSED SKIP SYMBOL; !ALWAYS A SPACE AT START %IF LENGTH > 2000 %START SELECT OUTPUT(0) PRINTSTRING("LENGTH ERROR IN FILE ") MODE = 2; THIS VCNSL = -1 LENGTH = 90 %FINISH X LENGTH = LENGTH %IF LENGTH > 90 %THEN XLENGTH = 90 %CYCLE F=1,1,XLENGTH READ SYMBOL(TEXT(F)) %EXIT %IF TEXT(F)<0 %OR TEXT(F)&X'FF' = 4 %REPEAT %FINISH !*** CHECK VIRTUAL TELETYPE IS IN RANGE %IF TT<0 %OR TT>PROCS %THEN %START SELECT OUTPUT(0) MODE=2 THIS VCNSL=-1 %FINISH !*** IF REQUIRE EXPANDED VERSION OF LOG THE PRINT IT %IF MODE=2 %AND (THIS VCNSL=TT %OR THIS VCNSL=-1) %THEN %START PRINT TIME(TIME) SPACES(2) ! PRINTSTRING(WHENCE(DIRECTION)) WRITE(TT,2) %IF LENGTH>0 %THEN %START ! SPACES(2) ! %CYCLE F=1,1,X LENGTH PRINT SYMBOL(TEXT(F)) %IF TEXT(F)>=32 %OR TEXT(F) = NL %REPEAT %IF TEXT(F)#NL %THEN NEWLINE %FINISH %ELSE NEWLINE ! %FINISH ! ! !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !*** ANALYSE AND STORE DATA !&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& !*** GET PROCESS LIST ENTRY FOR THIS CONSOLE ! STAT==PLIST(TT) ! !*** UPDATE TIME THIS SCRIPT HAS BEEN OBSERVED FOR ! THCLOCK=0 CLOCK=TIME CHECK OVER(THCLOCK,CLOCK) ARITH(THCLOCK,CLOCK,THBASETIME,BASETIME,ADD) STAT_THR=THCLOCK STAT_R=CLOCK %IF STAT_RB=0 %THEN %START STAT_THRB=THCLOCK STAT_RB=CLOCK %FINISH %IF DIRECTION=1 %THEN %START !*** MESSAGE GOING TO EMAS CHARSIN(TT)=CHARSIN(TT)+LENGTH STAT_CHARS IN=STAT_CHARS IN+LENGTH CHECK OVER(STAT_THCHIN,STAT_CHARSIN) %IF STAT_STATUS=USERWAIT %THEN %START HOLDTIME=(TIME-STAT_TIME1)&TIMEMASK STAT_THINK=STAT_THINK+HOLDTIME CHECK OVER(STAT_THTHINK,STAT_THINK) HOLDTIME=HOLDTIME//PERSEC; !TO SECONDS %IF HOLDTIME>DISTMAX %THEN HOLDTIME=DISTMAX USERDEL(HOLDTIME)=USERDEL(HOLDTIME)+1 ! %FINISH ! STAT_TIME1=TIME STAT_STATUS=SYSWAIT %FINISH ! ! %IF DIRECTION=2 %THEN %START !*** MESSAGE ON WAY BACK TO CONSOLE - HAS REACHED TCP STAT_CHARSOUT=STAT_CHARSOUT+LENGTH CHECK OVER(STAT_THCHOUT,STAT_CHARSOUT) ! %IF STAT_STATUS=SYSWAIT %THEN %START STAT_TIME2=TIME; !TIME OF FIRT TO TCP HOLDTIME=(TIME-STAT_TIME1-LENGTH//120)&TIMEMASK ADJUST(HOLDTIME,CHARSIN(TT)) STAT_RSPRESPNS1=STAT_RSPRESPNS1+HOLDTIME CHECK OVER(STAT_THRSPRESPNS1,STAT_RSPRESPNS1) %IF HOLDTIME>DISTMAX %THEN HOLDTIME=DISTMAX DISTRSP1(HOLDTIME)=DISTRSP1(HOLDTIME)+1 STAT_INTERACT1=STAT_INTERACT1+1; !COUNT NUMBER OF INTERACT %FINISH ! %IF STAT_STATUS=NULL %OR STAT_STATUS=USERWAIT %THEN %START ! UPTO TCPX95 FIRST MESSAGE SEEN FOR EACH VIRTUAL CONSOLE IS ! AN 'ON THE WAY' SAYING 'HOST:' ! MUST COUNT THIS TO GET INTERACTION COUNT RIGHT STAT_TIME2=TIME STAT_INTERACT1=STAT_INTERACT1+1 %FINISH ! STAT_STATUS=RECDATA %FINISH ! ! %IF DIRECTION=3 %THEN %START !*** MESSAGE TO CONSOLE HAS FINISHED TYPING STAT_CHARSOUT = STAT_CHARSOUT+LENGTH CHECK OVER(STAT_THCHOUT, STAT_CHARSOUT); ! MK.6 (OLD LOGS ONLY) %IF STAT_STATUS=SYSWAIT %OR STAT_STATUS=RECDATA %C %THEN %START ! HOLDTIME=(TIME-STAT_TIME1)&TIMEMASK ADJUST(HOLDTIME,CHARSIN(TT)) CHARSIN(TT)=0 STAT_RSPRESPNS=STAT_RSPRESPNS+HOLDTIME CHECK OVER(STAT_THRSPRESPNS,STAT_RSPRESPNS) HOLDTIME=HOLDTIME//PERSEC; !BACK TO SECONDS %IF HOLDTIME>DISTMAX %THEN HOLDTIME=DISTMAX DISTRSP0(HOLDTIME)=DISTRSP0(HOLDTIME)+1 ! %IF STAT_STATUS=RECDATA %C %THEN STAT_TCPD=STAT_TCPD+(TIME-STAT_TIME2)&TIMEMASK CHECK OVER(STAT_THTCP,STAT_TCPD) STAT_INTERACT=STAT_INTERACT+1 ! %IF STAT_STATUS=SYSWAIT %THEN %START !*** FIRST RESPONSE IS A PROMPT (DISCONNECTS) DISTRSP1(HOLDTIME)=DISTRSP1(HOLDTIME)+1 STAT_INTERACT1=STAT_INTERACT1+1 HOLDTIME=(TIME-STAT_TIME1-LENGTH//120)&TIMEMASK ADJUST(HOLDTIME,CHARSIN(TT)) STAT_RSPRESPNS1=STAT_RSPRESPNS1+HOLDTIME CHECK OVER(STAT_THRSPRESPNS1,STAT_RSPRESPNS1) %FINISH ! %FINISH ! STAT_TIME1=TIME STAT_STATUS=USERWAIT %FINISH ! XXY: %IF NEXT SYMBOL=NL %THEN SKIP SYMBOL %AND -> XXY %IF NEXT SYMBOL = ' ' %THEN SKIPSYMBOL %AND -> XXY ! ! %IF NEXT SYMBOL=EOF %THEN %EXIT ;!END OF FILE ! %IF MAX RECORDS#-1 %THEN %START %IF RECS>=MAX RECORDS %THEN %EXIT %FINISH ! %IF MAX TIME#-1 %THEN %START %IF NTIME>=MAX TIME %THEN %EXIT %FINISH ! ! %REPEAT ! ! !*************************************************************************** !*** PRINT RESULTS NTIME=TIME %IF THBASETIME=0 %THEN %START %IF BASETIME=0 %THEN NTIME=NTIME-ZEROTIME %FINISH CONVERT(NTIME) ARITH(THDUMMY,DUMMY,THBASETIME,BASETIME,ADD) NTIME=PERSEC*600 ARITH(THDUMMY,DUMMY,0,NTIME,DIVIDE) MINS10=THDUMMY*1000+DUMMY ;!10-MINUTES SLOTS ! ! ! %IF MODE =2 %THEN SELECT OUTPUT(1) ! ! NEWLINE PRINTSTRING(' INTERACTIONS ARE STIMULUS-FIRST RESPONSE PAIRS') NEWLINE PRINTSTRING(' COMPLETIONS ARE STIMULUS-PROMPT PAIRS') NEWLINE PRINTSTRING(' ALL TIMINGS IN 1/10 SECOND TICKS') NEWLINE PRINTSTRING(' RESPONSE IS TIME FROM STIMULUS TILL NEXT PROMPT') NEWLINE PRINTSTRING(' REACTION IS TIME FROM STIMULUS TILL 1ST CHAR BACK') NEWLINE ! NEWLINE ! PRINTSTRING(' CURRENT LINE SPEED FOR ALL CONSOLES IS') ! WRITE(LINESPEED,0) ! PRINTSTRING(' CHARACTERS PER TICK') NEWLINES(4) ! ! %IF MODE#3 %THEN %START !*** PRINT OUT INFORMATION ON ALL VIRTUAL CONSOLES %CYCLE F=0,1,PROCS STAT==PLIST(F) %IF STAT_STATUS#0 %THEN PRINT PROC(F) %REPEAT ! %FINISH !*** GET TOTAL NUMBER OF REACTIONS SEEN TOTAL=0 %CYCLE F=0,1,DISTMAX TOTAL=TOTAL+DISTRSP1(F) %REPEAT PRINT TITLE SPACES(25) PRINTSTRING('REACTION TIME INFORMATION') NEWLINES(2) PRINTSTRING('TOTAL REACTIONS') WRITE(TOTAL,6); NEWLINES(2) ! PRINTSTRING(' CLASS COUNT PERCENTAGE') NEWLINES(2) ! PRINTSTRING(' REACTIONS < 1/10 SECOND ') GET NUMBS(DISTRSP1,0,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 1/5 SECOND ') GET NUMBS(DISTRSP1,1,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 1/2 SECOND ') GET NUMBS(DISTRSP1,5,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 1 SECOND ') GET NUMBS(DISTRSP1,10,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 1.5 SECONDS ') GET NUMBS(DISTRSP1,15,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 2 SECONDS ') GET NUMBS(DISTRSP1,20,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 3 SECONDS ') GET NUMBS(DISTRSP1,30,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 4 SECONDS ') GET NUMBS(DISTRSP1,40,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 5 SECONDS ') GET NUMBS(DISTRSP1,50,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 10 SECONDS ') GET NUMBS(DISTRSP1,100,TOTAL) NEWLINE ! PRINTSTRING(' REACTIONS < 15 SECONDS ') GET NUMBS(DISTRSP1,150,TOTAL) NEWLINE PRINTSTRING(' REACTIONS < 20 SECONDS ') GET NUMBS(DISTRSP1,199,TOTAL) NEWLINE ! ! ! %IF GRAPHS='N' %THEN ->SUMMARY ! ! IF REQUIRED ! PRINT HISTOGRAMS OF RESPONSE TIMES ! REACTION TIMES FIRST ! ! HIST(DISTRSP1,DISTMAX+1,START,START,GAP,SP,RSP1TITLE,YAXIS,XAXIS1) NEWLINE PRINTSTRING('RAW DATA') NEWLINES(2) AVAR(DISTRSP1,DISTMAX+1,START,4,START,GAP) NEWLINES(2) ! ! NORM(DISTRSP1,0,DISTMAX) RSP1TITLE=RSP1TITLE.NN HIST(DISTRSP1,DISTMAX+1,START,START,GAP,SP,RSP1TITLE,YAXIS,XAXIS1) NEWLINE ! PRINTSTRING('NORMALISED RANGE 0 -') WRITE(NORM FACTOR,0) NEWLINES(2) !*** NOW TIME TILL PROMPT RECEIVED BY USER HIST(DISTRSP0,DISTMAX+1,START,START,GAP,SP,RSP0TITLE,YAXIS,XAXIS0) NEWLINE PRINTSTRING('RAW DATA') NEWLINES(2) AVAR(DISTRSP0,DISTMAX+1,START,4,START,GAP) NEWLINES(2) ! NORM(DISTRSP0,0,DISTMAX) RSP0TITLE=RSP0TITLE.NN HIST(DISTRSP0,DISTMAX+1,START,START,GAP,SP,RSP0TITLE,YAXIS,XAXIS0) NEWLINE ! PRINTSTRING('NORMALISED RANGE 0 -') WRITE(NORM FACTOR,0) NEWLINE !*** HISTOGRAMS OF USER DELAY TIMES HIST(USERDEL,DISTMAX+1,START,START,GAP,SP,USRDTITLE,YAXIS,XAXISU) NEWLINE PRINTSTRING('RAW DATA') NEWLINES(2) AVAR(USERDEL,DISTMAX+1,START,4,START,GAP) NEWLINES(2) ! NORM(USERDEL,0,DISTMAX) USRDTITLE=USRDTITLE.NN HIST(USERDEL,DISTMAX+1,START,START,GAP,SP,USRDTITLE,YAXIS,XAXISU) NEWLINE ! PRINTSTRING('NORMALISED RANGE 0 -') WRITE(NORMFACTOR,0) NEWLINE SUMMARY: !*** COMPILE SUMMARY INFORMATION PRINT TITLE SPACES(25) PRINTSTRING('SUMMARY INFORMATION') NEWLINES(2) ! PRINTSTRING('RECORDS PROCESSED') CONVERT(RECS) ARITH(THBASERECS,BASERECS,THDUMMY,DUMMY,ADD) PRINTD(THBASERECS,BASERECS,11,0) NEWLINE ! PRINTSTRING('TIME COVERED') H=TIME %IF THBASETIME=0 %THEN %START %IF BASETIME=0 %THEN H=H-ZERO TIME %FINISH CONVERT(H) ARITH(THDUMMY,DUMMY,THBASETIME,BASETIME,ADD) ARITH(THDUMMY,DUMMY,0,10,MULTIPLY) PRINTD(THDUMMY,DUMMY,16,1) PRINTSTRING(' SECONDS - ') PRINT TIME(TIME); !AS MINUTES,SECONDS,TICKS NEWLINES(2) ! ! PRINTSTRING('DISTRIBUTION OF RECORD TYPES') ! NEWLINE ! %CYCLE F=1,1,RECTYPMAX ! PRINTSTRING(WHENCE(F)) ! WRITE(RECTYP(F),10) ! NEWLINE ! %REPEAT ! ! PRINTSTRING('PACKETS PER COMPLETION (OUTWARD FROM TARGET)') ! F=RECTYP(2)+RECTYP(3) ! H=RECTYP(3) ! WRITE(F//H,6) ! NEWLINES(2) !*** GET TOTALS OVER ALL VIRTUAL CONSOLES THTCP=0; THTRSPRESPNS1=0; THTTNK=0; THTRSPRESPNS=0 TRSPRESPNS1=0 THTCHIN=0; THTCHOUT=0 TCHARSIN=0; TCHARSOUT=0 TRSPRESPNS=0; TTCP=0; TTHINK=0 TINTERACT1=0; TINTERACTS=0 ! H=0 ! %CYCLE F=0,1,PROCS STAT==PLIST(F) TINTERACT1=TINTERACT1+STAT_INTERACT1 TINTERACTS=TINTERACTS+STAT_INTERACT H=H+1 %IF STAT_INTERACT#0 ! TRSPRESPNS1=TRSPRESPNS1+STAT_RSPRESPNS1 CHECK OVER(THTRSPRESPNS1,TRSPRESPNS1) THTRSPRESPNS1=THTRSPRESPNS1+STAT_THRSPRESPNS1 ! TRSPRESPNS=TRSPRESPNS+STAT_RSPRESPNS CHECK OVER(THTRSPRESPNS,TRSPRESPNS) THTRSPRESPNS=THTRSPRESPNS+STAT_THRSPRESPNS ! TTHINK=TTHINK+STAT_THINK CHECKOVER(THTTNK,TTHINK) THTTNK=THTTNK+STAT_THTHINK ! TTCP=TTCP+STAT_TCPD THTCP=THTCP+STAT_THTCP CHECK OVER(THTCP,TTCP) ! TCHARSIN=TCHARSIN+STAT_CHARSIN THTCHIN=THTCHIN+STAT_THCHIN CHECK OVER(THTCHIN,TCHARSIN) ! TCHARSOUT=TCHARSOUT+STAT_CHARSOUT THTCHOUT=THTCHOUT+STAT_THCHOUT CHECK OVER(THTCHOUT,TCHARSOUT) ! PRINT PROC(F) %UNLESS MODE = 3 ! %REPEAT ! PRINTSTRING('DISTINCT VIRTUAL CONSOLES') WRITE(H,6); NEWLINES(2) ! ! PRINTSTRING('STATISTICS OVER ALL VIRTUAL CONSOLES') NEWLINE ! STAT==PLIST(0) STAT_THCHIN=THTCHIN STAT_THCHOUT=THTCHOUT STAT_THRSPRESPNS1=THTRSPRESPNS1 STAT_THRSPRESPNS=THTRSPRESPNS STAT_THTHINK=THTTNK STAT_THTCP=THTCP STAT_RSPRESPNS1=TRSPRESPNS1 STAT_INTERACT1=TINTERACT1 STAT_INTERACT=TINTERACTS; STAT_RSPRESPNS=TRSPRESPNS STAT_THINK=TTHINK; STAT_TCPD=TTCP STAT_CHARSIN=TCHARSIN; STAT_CHARSOUT=TCHARSOUT ! PRINT PROC(0) ! ! !************************************************************************** ! ! ! ! ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ! ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ALOG ! ! %ENDOFPROGRAM !