home *** CD-ROM | disk | FTP | other *** search
Wrap
1 'Program NMR4--Part 4 of NMRCALC 10 DEFINT I-N 15 'COMMON IPFLAG,IREAD,FF$ 16 OPEN "scratch.nmr" FOR INPUT AS #1 17 INPUT #1, IPFLAG: INPUT #1, IREAD: LINE INPUT #1, FF$ 18 CLOSE 1 30 SCREEN 0,0,0:COLOR 14,4,1:KEY OFF: CLS 40 DIM BC(7),FZ(8),SLINES(3003,2) 50 DIM PM(7,7),SH(7) 60 DIM SF(128,7),E(35),A(35,35) 70 THRESHOLD1 = 0: THRESHOLD2 = 0 90 ON ERROR GOTO 60000 100 CLS:PRINT:PRINT"Display routine for frequencies and intensities.":PRINT 110 PRINT:PRINT"This is in a menu format; to get menu, press 'M' in command mode.":PRINT:BEEP:PRINT"NOTE: IT IS NECESSARY TO READ IN THE LINES VIA THE 'R' COMMAND IF AUTO-READ":PRINT" NOT IN EFFECT!": GOSUB 63999 120 IF IREAD=1 THEN BF = 0: GOSUB 5100 200 CLS:PRINT:PRINT"Command ('M' for menu): ";:GOSUB 500 210 IF P$ = "E" THEN GOSUB 1000 215 IF P$ = "W" THEN GOSUB 900: CHAIN "nmr6" 220 IF P$ = "L" THEN GOSUB 3000 225 IF P$ = "T" THEN GOSUB 19000 230 IF P$ = "M" THEN GOSUB 2000 240 IF P$ = "D" THEN GOSUB 4000 250 IF P$ = "R" THEN GOSUB 5000 260 IF P$ = "S" THEN GOSUB 20000 270 IF P$ <> "Q" THEN 280 275 CLS: PRINT: PRINT"Returning control to system.": PRINT: END 280 IF P$ = "U" THEN GOSUB 6000 290 IF P$ = "C" THEN GOSUB 10000 300 IF P$ = "P" THEN GOSUB 900: CHAIN "nmr5" 310 IF P$ = "V" THEN GOSUB 14000 320 IF P$ = "F" THEN GOSUB 16000 330 IF P$ = "Z" THEN LPRINT CHR$(12); 340 IF P$ = "A" THEN GOSUB 18000 390 GOTO 200 500 P$ = INKEY$: IF P$ = "" THEN 500 510 IF ASC(P$) > 90 THEN P$ = CHR$(ASC(P$) - 32) 520 PRINT P$ 530 RETURN 800 PRINT:PRINT"Do you desire printed output? "; 810 A$ = INKEY$: IF A$ = "" THEN 810 820 IF ASC(A$) > 90 THEN A$ = CHR$(ASC(A$) - 32) 830 PRINT A$ 840 IF A$ = "Y" THEN IPRINT = 1 ELSE IF A$ = "N" THEN IPRINT = 0 ELSE BEEP: GOTO 800 850 RETURN 900 OPEN "scratch.nmr" FOR OUTPUT AS #1 901 PRINT #1, IPFLAG: PRINT #1, IREAD: PRINT #1, FF$ 902 RETURN 1000 CLS:PRINT:PRINT"Returning to main I/O routine.":PRINT 1010 CHAIN "nmr1" 2000 CLS:PRINT:PRINT"Command menu:":PRINT 2005 PRINT "'A'--Alter status of auto-read option." 2010 PRINT "'C'--Display a particular line." 2020 PRINT "'D'--Display spectrum parameters." 2030 PRINT "'E'--Exit back to main I/O routine." 2035 PRINT "'F'--Check status and/or alter state of pause flag." 2040 PRINT "'L'--Display spectral lines." 2050 PRINT "'M'--Display this menu." 2055 PRINT "'P'--Exit to plotting routines." 2060 PRINT "'Q'--Quit and return to system control." 2070 PRINT "'R'--Read needed data from disk (allows resetting of file name)." 2080 PRINT "'S'--Sort lines by frequency." 2085 PRINT "'T'--Enter intensity thresholds for line printing." 2090 PRINT "'U'--Retrieve lines from disk (to get back unsorted lines)." 2100 PRINT "'V'--Print eigenvalues and eigenvectors." 2102 PRINT "'W'--Exit to energy level (or Fz) plotting routines." 2105 PRINT "'Z'--Form feed to printer." 2110 PRINT:INPUT"Hit return to continue. ",A$: RETURN 3000 CLS:PRINT:PRINT"Ready to display spectrum lines. To abort, hit 'Q' during pause message.":PRINT 3005 GOSUB 800: IF IPRINT=1 THEN LPRINT:LPRINT:LPRINT"Calculated lines of spectrum.":LPRINT 3010 PRINT: PRINT NS;"nuclei":PRINT NF;"spin functions":PRINT NL;"spectrum lines": PRINT 3011 IF THRESHOLD1=0 AND THRESHOLD2=0 THEN 3015 3012 PRINT"Lower threshold: ",THRESHOLD1 3013 PRINT"Upper threshold: ",THRESHOLD2 3015 IF IPRINT=1 THEN LPRINT NS;"nuclei":LPRINT NF;"spin functions":LPRINT NL;"spectrum lines":LPRINT 3016 IF THRESHOLD1=0 AND THRESHOLD2=0 THEN 3020 3017 IF IPRINT=1 THEN LPRINT"Lower threshold: ",THRESHOLD1 3018 IF IPRINT=1 THEN LPRINT"Upper threshold: ",THRESHOLD2 3020 IC = 0: GOSUB 63999 3025 A$ = " " 3030 FOR I = 1 TO NL STEP 15 3035 IF LEFT$(A$,1) = "q" OR LEFT$(A$,1) = "Q" THEN A$ = "Q" 3036 IF A$ = "Q" THEN 3050 3040 GOSUB 3900 3050 K = I + 14: IF K > NL THEN K = NL 3060 FOR J = I TO K 3061 IF THRESHOLD1 = 0 AND THRESHOLD2 = 0 THEN 3069 3062 SLINE = SLINES(J,2) 3063 IF SLINE < THRESHOLD1 THEN 3410 3064 IF SLINE > THRESHOLD2 THEN 3410 3069 IF A$ = "Q" THEN 3410 3070 SL = SLINES(J,0): SM = 1000*(SL - INT(SL)): SL = INT(SL): SM = INT(SM+.1) 3090 PRINT USING "###";SL;:PRINT">";:PRINT USING "###";SM; 3095 IF IPRINT=1 THEN LPRINT USING "###";SM;:LPRINT">";:LPRINT USING "###";SL; 3100 F = SLINES(J,1) 3110 PRINT TAB(8); 3115 IF IPRINT=1 THEN LPRINT TAB(8); 3160 PRINT USING "#####.##";F;:PRINT TAB(20); 3165 IF IPRINT=1 THEN LPRINT USING "#####.##";F;:LPRINT TAB(20); 3170 F = SLINES(J,2): IF F > .00001 THEN IC = IC + 1 3200 PRINT USING "##.#####";F; 3205 IF IPRINT=1 THEN LPRINT USING "##.#####";F; 3400 PRINT TAB(35);: PRINT USING "####"; J 3405 IF IPRINT=1 THEN LPRINT TAB(35);:LPRINT USING "####"; J 3410 NEXT 3415 IF A$ = "Q" THEN 3430 3420 GOSUB 63999 3430 NEXT 3435 IF A$ = "Q" THEN PRINT: PRINT"Printing routine aborted. Partial results follow--" 3440 PRINT:PRINT"Sum of intensities:";:PRINT USING "###.#####";TI 3445 PRINT 3450 PRINT IC;"lines have intensity > 0.00001":PRINT 3460 PRINT"Printing of line intensities completed.": GOTO 63999 3900 CLS:PRINT:PRINT" Trans";TAB(11);"Freq";TAB(20);"Intensity";TAB(35);"Line#" 3902 IF I>1 THEN 3910 3905 IF IPRINT=1 THEN LPRINT:LPRINT:LPRINT" Trans";TAB(11);"Freq";TAB(20);"Intensity";TAB(35);"Line#" 3910 PRINT "-------";TAB(11);"----"; TAB(20);"---------";TAB(35);"-----" 3912 IF I>1 THEN 3920 3915 IF IPRINT=1 THEN LPRINT "-------";TAB(11);"----"; TAB(20);"---------";TAB(35);"-----" 3920 RETURN 4000 CLS:PRINT:PRINT"Spectral parameters:":PRINT:PRINT 4002 GOSUB 800 4004 CLS:PRINT:PRINT"Chemical shifts:" 4005 IF IPRINT=1 THEN LPRINT:LPRINT:LPRINT"Spectral parameters and other input data for this data set:":LPRINT 4006 IF IPRINT=1 THEN LPRINT:LPRINT"Chemical shift information:" 4010 PRINT:PRINT"Spectrometer frequency: ";FR;" MHz" 4015 IF IPRINT = 1 THEN LPRINT:LPRINT"Spectrometer frequency: ";FR;" MHz" 4020 PRINT:PRINT:PRINT" #";TAB(12);"ppm";TAB(24);"Hz":PRINT"--";TAB(12);"---"; TAB(22);"------" 4025 IF IPRINT=1 THEN LPRINT:LPRINT:LPRINT" #";TAB(12);"ppm";TAB(24);"Hz":LPRINT"--";TAB(12);"---"; TAB(22);"------" 4030 FOR I = 1 TO NS 4040 PRINT I;TAB(10);:PRINT USING "##.###";SH(I);:PRINT TAB(21);: PRINT USING "####.##";PM(I,I) 4045 IF IPRINT=1 THEN LPRINT I;TAB(10);:LPRINT USING "##.###";SH(I);:LPRINT TAB(21);:LPRINT USING "####.##";PM(I,I) 4050 NEXT 4060 GOSUB 63999 4070 CLS:PRINT:PRINT"Coupling constants:":PRINT 4075 IF IPRINT=1 THEN LPRINT:LPRINT:LPRINT"Coupling constants:":LPRINT 4080 PRINT " # ";TAB(6); 4082 IF IPRINT=1 THEN LPRINT " # ";TAB(6); 4084 FOR I = 1 TO NS: PRINT USING " # ";I; 4086 IF IPRINT=1 THEN LPRINT USING " # ";I; 4088 NEXT 4090 PRINT:PRINT TAB(6); 4092 IF IPRINT=1 THEN LPRINT: LPRINT TAB(6); 4094 FOR I = 1 TO NS: PRINT" ---------"; 4096 IF IPRINT=1 THEN LPRINT" ---------"; 4098 NEXT 4100 PRINT 4102 IF IPRINT=1 THEN LPRINT 4104 FOR I = 1 TO NS 4106 PRINT USING " #";I;:PRINT TAB(6); 4108 IF IPRINT=1 THEN LPRINT USING " #";I;:LPRINT TAB(6); 4110 FOR J = 1 TO NS 4112 IF I=J THEN PRINT" ------"; ELSE PRINT USING "#######.##";PM(I,J); 4114 IF I=J AND IPRINT=1 THEN LPRINT" ------"; 4116 IF I<>J AND IPRINT=1 THEN LPRINT USING "#######.##"; PM(I,J); 4118 NEXT 4120 IF IPRINT=1 THEN LPRINT 4122 PRINT 4124 NEXT 4140 PRINT:PRINT"Listing of parameters completed.":GOTO 63999 5000 CLS:PRINT:PRINT"Ready to retrieve information from disk.":PRINT 5005 BF = 0 5010 PRINT"Do you need to specify the data set name? ";:GOSUB 500 5012 IF P$ = "Y" THEN 5020 ELSE IF P$ = "N" THEN 5100 ELSE BEEP: GOTO 5010 5020 PRINT:INPUT"Enter data set name: ",FF$ 5100 PRINT:PRINT"Now reading in the following:":PRINT 5110 DF$ = FF$ + ".0": PRINT TAB(5);DF$ 5120 OPEN DF$ FOR INPUT AS 1 5130 INPUT #1,NS: INPUT #1,FR 5140 FOR I = 1 TO NS: INPUT #1,SH(I): INPUT #1,PM(I,I): NEXT 5150 FOR I = 1 TO NS-1: FOR J = I+1 TO NS: INPUT #1, PM(I,J): PM(J,I) = PM(I,J): NEXT:NEXT 5151 NF = 2^NS 5155 FOR I = 1 TO NF: FOR J = 1 TO NS: INPUT #1,SF(I,J): NEXT:NEXT 5160 CLOSE 1 5170 DF$ = FF$ + ".inf":PRINT TAB(5);DF$ 5180 OPEN DF$ FOR INPUT AS 1 5190 INPUT #1,NS: INPUT #1,NF 5200 FOR I = 0 TO NS: INPUT #1,BC(I): NEXT 5210 FOR I = 1 TO NS + 1: INPUT #1, FZ(I): NEXT 5220 CLOSE 1 5230 NL = 0 5240 FOR I = 1 TO NS: NL = NL + BC(I-1)*BC(I): NEXT 5250 DF$ = FF$ + ".lin":PRINT TAB(5);DF$ 5260 OPEN DF$ FOR INPUT AS 1 5270 TI = 0 5280 FOR I = 1 TO NL 5290 INPUT #1,SLINES(I,0) 5300 INPUT #1,SLINES(I,1): INPUT #1,SLINES(I,2) 5310 TI = TI + SLINES(I,2): NEXT 5320 CLOSE 1 5330 IF BF <> 0 THEN RETURN 5340 PRINT:PRINT"Reading from disk completed.":PRINT: GOTO 63999 6000 CLS:PRINT:PRINT"Ready to retrieve lines from disk. If unsorted lines remain on disk, this is":PRINT" the same as unsorting.":PRINT 6010 BF=1: GOSUB 63999 6020 DF$ = FF$ + ".lin": PRINT "Retrieving ";DF$ 6030 GOSUB 5260 6040 BF = 0 6050 PRINT:PRINT"Retrieval completed.":GOTO 63999 10000 CLS:PRINT:PRINT"Routine to display particular lines." 10010 PRINT:PRINT"Note that values are not rounded off in this routine--you are not getting":PRINT" results in a tabular form!":PRINT 10020 PRINT"Submenu of three commands:":PRINT 10030 PRINT TAB(5);"'N'--Display by current line number." 10040 PRINT TAB(5);"'T'--Select by transition indices." 10050 PRINT TAB(5);"'Q'--Exit from this routine.":GOSUB 63999 10055 CLS:PRINT:PRINT"Sub-command (N, T, or Q): ";: GOSUB 500 10060 GOSUB 63999 10070 IF P$ = "N" THEN GOSUB 10100 10080 IF P$ = "T" THEN GOSUB 10500 10090 IF P$ = "Q" THEN 200 ELSE 10055 10100 CLS:PRINT:PRINT"Printing individual lines. To exit, hit <Return>.":PRINT 10110 PRINT: INPUT"Enter line number: ",I 10120 IF I = 0 THEN 10055 10130 IF I > 0 AND I <= NL THEN 10150 10140 BEEP: PRINT"Illegal value! Try again!": GOTO 10110 10150 PRINT "Transition: "; 10160 SL = SLINES(I,0): SM = 1000*(SL - INT(SL)): SL = INT(SL): SM = INT(SM+.1) 10170 PRINT SL;">";SM 10180 PRINT "Frequency =";SLINES(I,1) 10190 PRINT "Intensity =";SLINES(I,2): GOTO 10110 10500 CLS:PRINT:PRINT"Examine lines by transition numbers.":PRINT 10510 PRINT "Enter the individual functions numbers as requested. Terminate by entering":PRINT" a <Return> for either. Order of entry is unimportant.":PRINT 10520 GOSUB 63999 10530 CLS:PRINT 10540 PRINT:INPUT"Enter index #1: ",L 10550 IF L = 0 THEN 10055 10560 IF L > 0 AND L <= NF THEN 10580 10570 BEEP:PRINT"Illegal index! Try again!": GOTO 10540 10580 INPUT"Enter index #2: ",M 10590 IF M = 0 THEN 10055 10600 IF M > 0 AND M <= NF THEN 10620 10610 BEEP:PRINT"Illegal index! Try again!": GOTO 10580 10620 IF L < M THEN TT = M + L/1000 ELSE TT = L + M/1000 10630 I = 1 10640 IF ABS(TT - SLINES(I,0)) < .00001 THEN 10700 10650 I = I + 1: IF I <= NL THEN 10640 10660 BEEP: PRINT "No such transition!": GOTO 10540 10700 PRINT:PRINT"Line number:";I 10710 PRINT "Frequency =";SLINES(I,1) 10720 PRINT "Intensity =";SLINES(I,2) 10730 PRINT: GOTO 10540 14000 CLS:PRINT:PRINT"Routine to display particular sub-block of eigenvalues and eigenvectors.":PRINT 14010 PRINT"Possible sub-blocks: 1 to";NS+1: PRINT 14015 GOSUB 800 14016 IF IPRINT=1 THEN LPRINT:LPRINT"Eigenvalues and eigenvectors:":LPRINT 14020 INPUT"Enter sub-block number (exit with <Return>): ",IB: PRINT: IF IB = 0 THEN RETURN 14030 LL = 1: IF IB > NS + 1 THEN BEEP: PRINT "Illegal value! Try again!": GOTO 14020 14035 IF IB = 1 THEN 14050 14040 FOR I = 1 TO IB - 1: LL = LL + BC(I-1): NEXT 14050 DF$ = FF$ + "." + RIGHT$(STR$(IB),LEN(STR$(IB))-1): OPEN DF$ FOR INPUT AS 1 14060 INPUT #1, N 14070 FOR I = 1 TO N: INPUT #1, E(I): NEXT 14080 IF N > 1 THEN 14090 14085 A(1,1) = 1: GOTO 14100 14090 FOR J = 1 TO N: FOR I = 1 TO N: INPUT #1, A(I,J): NEXT: NEXT 14100 CLOSE 1 14105 FOR KK = 1 TO N STEP 7 14110 CLS: PRINT: PRINT"Sub-block number";IB:PRINT:PRINT"Func";TAB(10); 14112 IF IPRINT=1 THEN LPRINT:LPRINT:LPRINT"Sub-block number";IB; 14113 IF IPRINT=1 AND KK > 1 THEN LPRINT"(continued)" ELSE IF IPRINT=1 THEN LPRINT 14114 IF IPRINT=1 THEN LPRINT:LPRINT"Func";TAB(10); 14115 IX = KK + 6: IF IX > N THEN IX = N 14120 FOR I = KK TO IX: NN = LL + I - 1 14125 PRINT USING " ### ";NN; 14126 IF IPRINT=1 THEN LPRINT USING " ### ";NN; 14127 NEXT 14130 PRINT: PRINT "----";TAB(10); 14131 IF IPRINT=1 THEN LPRINT:LPRINT "----";TAB(10); 14140 FOR I = KK TO IX: PRINT "-------- "; 14141 IF IPRINT=1 THEN LPRINT "-------- "; 14142 NEXT 14145 PRINT: IF IPRINT=1 THEN LPRINT 14150 FOR I = 1 TO N: II = LL + I - 1 14160 FOR J = 1 TO NS 14170 IF SF(II,J) > 0 THEN PRINT "+";: IF IPRINT=1 THEN LPRINT "+"; 14180 IF SF(II,J) < 0 THEN PRINT "-";: IF IPRINT=1 THEN LPRINT "-"; 14190 NEXT 14200 PRINT TAB(8);: IF IPRINT = 1 THEN LPRINT TAB(8); 14210 FOR J = KK TO IX 14220 A = A(I,J) 14230 PRINT USING "###.######";A;:IF IPRINT=1 THEN LPRINT USING "###.######";A; 14235 NEXT 14240 PRINT: IF IPRINT=1 THEN LPRINT 14245 NEXT 14250 PRINT TAB(10);: IF IPRINT=1 THEN LPRINT TAB(10); 14254 FOR I = KK TO IX: PRINT"-------- "; 14256 IF IPRINT=1 THEN LPRINT"-------- "; 14258 NEXT 14259 PRINT: IF IPRINT=1 THEN LPRINT 14260 PRINT"E-vals:";TAB(8);: IF IPRINT=1 THEN LPRINT"E-vals:";TAB(8); 14262 FOR I = KK TO IX: PRINT USING "#######.##";E(I); 14264 IF IPRINT=1 THEN LPRINT USING "#######.##";E(I); 14265 NEXT 14267 PRINT: IF IPRINT=1 THEN LPRINT 14270 GOSUB 63999 14275 NEXT 14290 CLS:PRINT: GOTO 14020 15000 CLS:PRINT:PRINT"Trans";TAB(10);"Freq";TAB(25);"Intensity" 15010 PRINT"-----";TAB(10);"----";TAB(25);"---------" 15020 RETURN 16000 CLS:PRINT:PRINT"Pause flag is currently "; 16010 IF IPFLAG = 1 THEN PRINT "ON." ELSE PRINT "OFF." 16020 PRINT:PRINT"Do you wish to alter the state of the pause flag? "; : GOSUB 500 16030 IF P$ = "N" THEN RETURN ELSE IF P$ <> "Y" THEN 16020 16040 IF IPFLAG = 0 THEN IPFLAG = 1 ELSE IPFLAG = 0 16050 RETURN 18000 CLS:PRINT:PRINT"Auto-read flag is currently "; 18010 IF IREAD = 0 THEN PRINT "OFF" ELSE PRINT "ON" 18020 PRINT:PRINT"Do you wish to alter its status? ";: GOSUB 500 18030 IF P$ = "N" THEN 63999 18040 IF P$ <> "Y" THEN BEEP: GOTO 18000 18050 IF IREAD = 0 THEN IREAD = 1 ELSE IREAD = 0 18060 GOTO 63999 19000 CLS:PRINT:PRINT"Routine for entering thresholds.":PRINT 19010 PRINT"Rules: Prints all lines between THRESHOLD1 & THRESHOLD2." 19020 PRINT" Set THRESHOLD1 for minimum intensity to print." 19030 PRINT" Set THRESHOLD2 for maximum intensity to print." 19040 PRINT 19050 PRINT" Set both = 0 to print all lines." 19060 PRINT" Set THRESHOLD2 = 0 to print all lines above THRESHOLD1." 19070 PRINT 19080 INPUT"Enter THRESHOLD1: ",THRESHOLD1 19090 INPUT"Enter THRESHOLD2: ",THRESHOLD2 19100 IF THRESHOLD1 > 0 AND THRESHOLD2 = 0 THEN THRESHOLD2 = 1.00001 19110 GOTO 63999 20000 CLS:PRINT:PRINT"Now sorting lines from highest to lowest frequencies (NMR convention).":PRINT 20005 FOR I = 1 TO NL - 1 20006 PRINT "."; 20010 SM = SLINES(I,1): IS = I 20020 FOR J = I + 1 TO NL 20030 IF SLINES(J,1) < SM THEN 20050 20040 IS = J: SM = SLINES(J,1) 20050 NEXT 20060 IF IS = I THEN 20100 20070 FOR K = 0 TO 2: SWAP SLINES(I,K),SLINES(IS,K): NEXT 20100 NEXT 20110 PRINT:PRINT"Sorting completed.": PRINT:PRINT"You now have the option of storing the sorted lines on the disk. Note that":PRINT" this destroys the unsorted lines and reduces the precision!":PRINT 20120 PRINT:PRINT"Put sorted lines on disk? ";: GOSUB 500 20130 IF P$ = "N" THEN 63999 20135 IF P$ <> "Y" THEN 20120 20140 PRINT:PRINT"Are you absolutely sure? ";: GOSUB 500 20142 IF P$ = "N" THEN 63999 20144 IF P$ <> "Y" THEN 20120 20150 PRINT:PRINT"Now replacing unsorted lines with sorted lines!":PRINT 20160 DF$ = FF$ + ".lin": OPEN DF$ FOR OUTPUT AS 2 20170 FOR I = 1 TO NL 20180 PRINT #2, CDBL(SLINES(I,0)) 20190 PRINT #2, CDBL(SLINES(I,1)) 20200 PRINT #2, CDBL(SLINES(I,2)) 20210 NEXT 20220 CLOSE 2 20230 PRINT:PRINT"Storage of sorted lines completed. Unsorted lines destroyed." : PRINT: GOTO 63999 60000 PRINT: BEEP: PRINT"Error encountered! Check that needed files have been read in!": GOSUB 63999 60010 CLOSE 1,2 60020 RESUME 100 63999 IF IPFLAG = 1 THEN RETURN ELSE PRINT:INPUT"Hit <Return> to continue.",A$: :RETURN