; PRO AVE_EEG, NOPRINT=noprint, EPS=eps, LINE=line, NOLOG=nolog, ; NODELTA=nodelta, ERROR=err, BATCH=batch, $ ; TEST=test, TO_MENU=to_menu ;=============================================================================== ; (c) 1992 - khd c/o FU BERLIN. A l l r i g h t s r e s e r v e d. || ; ** No part of this software package may be reproduced, transmitted, || ; 1997 transcribed, stored in a retrieval system, or translated into || ; any form by any means without the w r i t t e n permission of || ; Karl-Heinz Dittberner-FU BERLIN, Arnimallee 22, D-1000 Berlin 33 || ;=============================================================================== ; PRO:AVE_EEG.PRO K.-H. Dittberner - 25.FEB.1992 ; V 03.20 P 476/37 - 28.AUG.1997 ; ; IDL(V3.0)-Routine: Mitteln von EEG-Signale (Averaging of Evoked Potentials): ; Berechnung und Ausgabe von gemittelten Einzel- und/oder ; Differenz-Potentialen zwischen den Ableitungselektroden ; (locations) mit der Option ; des Mittelns von Potentialen aus zufallsausgewaehlten ; Stichproben ("random shuffling"). ; ; HINWEISE: o Beschreibung dieses Programms: "wdv-notes" Nr.102. ; o Die Unterscheidung der Projekte erfolgt in der ; externen Prozedur SET_USER_PARAMS.PRO (P 476/83). ; o Bei n Elektroden ist die Zahl der moeglichen ; Kombinationen von Differenz-Potentialen ; C(n) = n!/[2!(n-2)!], d.h. bei n=6 gilt: C(6) = 15. ; o Dieses Programm erzeugt etliche Ausgabe-Dateien ; (Grafik und Daten) unterschiedlicher Groesse. Jeder ; Anwender von AVE_EEG m u s s deshalb v o r h e r ; pruefen, ob fuer diese Dateien noch ausreichend Platz ; auf den Platten vorhanden ist. Sonst bricht IDL beim ; Erreichen der persoenlichen Diskquota den Lauf von ; AVE_EEG mit einem I/O-Fehler ab ! ; ; INPUT: Die Originaldaten sind aequidistant abgetastete EEG- ; Signale in Text-Dateien mit besonderer Struktur ("EVP- ; Daten File"), die auf der HP-1000 produziert worden sind. ; OUTPUT: Bildschirmgrafik unter DECwindows (X-Windows) oder Post- ; Script-Datei zum Direktdruck (wahlweise EPS-Datei). In ; den Plots wird wahlweise die Standardabweichung s oder ; der Fehler des Mittelwertes e multipliziert mit einem ; anzugebenden Faktor t (1.0 < t < 10.0) ausgegeben. ; Die berechneten Daten werden in einer Datei vom Typ .TXT ; im aktuellen Verzeichnis (default directory) auf der ; Platte gespeichert. Diese Datei kann von AVE_EEG.PRO, ; z.B. zum nachtraeglichen Druck, wieder gelesen werden. ; ; VAR: Wichtige Variablen in diesem Programm sind: ; ; nx = Anzahl der abgetasteten Werte je EEG-Potential. ; sp = 1D-Array mit allen EEG-Potentialen der Datei. ; name = 1D-Array mit den Kurznamen aller Potentiale der Datei in ; folgender Form: PPVVSE ; mit: PP = Projekt-Bezeichnung = const. ; VV = Nr. der Versuchsperson. ; S = Reizart (auch "Kategorie"): ; N, O, P, Q. ; E = Nr. der Elektrode: [0..5]. ; n_pot = Gesamtanzahl der Potentiale, die in der Originaldatei ; enthalten sind. ; n_vpn = Anzahl der Versuche/Versuchspersonen. ; n_cat = Anzahl der Reizarten (stimulus or categories). ; n_loc = Anzahl der Ableitungsorte (locations) oder Elektroden. ; locs = String-Array mit der Bezeichnung der Ableitungsorte. ; cats = String-Array mit Bezeichnung der Reizarten (categories). ; ; KEYWORDS: ; ; /BATCH = Batch-Betrieb (nur) fuer den Zweig "Random Shuffling" ; (Punkt 10), wobei automatisch /NOPRINT gesetzt wird. ; Die Parameterversorgung erfolgt ueber VAX/VMS-Logicals ; mit: > DEFINE AVE_EEG_parameter wert ; /ERROR = Statt der Standardabweichungen s (mittlere Fehler der ; Einzelwerte) werden die Fehler der Mittelwerte e in ; den Plots als duenne (+/-) Kurven ausgegeben; wobei ; Standardabweichung: s = SQRT(S/(n-1)) ; mit: S = SUM(x^2) - n*(M^2), ; Mittelwert: M = SUM(x/n), ; Fehler von M: e = s/SQRT(n), ; Vertrauensbereich: dM = t*e mit t=f(n,P). ; Default-Einstellung ist: Ausgabe von s. ; /EPS = Die Ausgabe erfolgt als Encapsulated PostScript-File ; zum Import in andere Applikationen; z.B. in den Page- ; Maker via IfPnet. ; /LINE = Unter dem Menue-Punkt 1 soll jeweils der LineStyle fuer ; die Overplots erfragt werden. ; /NODELTA = In den Plots werden weder Standardabweichungen s noch ; die Fehler der Mittelwerte e eingezeichnet. ; /NOPRINT = Die PostScript-File wird zunaechst nicht gedruckt. Sie ; steht unter dem Namen "dateiname.PS" fuer einen spae- ; teren Druck im aktuellen Verzeichnis zur Verfuegung. ; /NOLOG = Es werden keine Zwischeninfos ausgegeben. ; /TEST = Nur (!) zum Testen und Debuggen dieses Programms. ; /TO_MENU = Ermoeglicht fuer Testzwecke den Restart des bereits ; geladenen Programms direkt beim Haupt-Menue. ;=============================================================================== ; Quelle: Programm Merkposten: o ; "plot122.pro;1" o Pkt.9: Projekt-Unterscheidung ? ; vom 3/2/92 von o On_Error, 2 aktivieren ? ; A. W. Przybyszewski. o ; WDV-Projekt: C92 249 o UP "READ_FILENAME" verwenden. ; o Ruecks. von /EPS klaeren. ; Aufruf: > SET DEFAULT directory o Menue-Pkt.6: Animation ? ; > IDL o UP "MARK_KEYWORD" einfuehren ? ; > Ave_EEG [,/...] o UP "POTENTIAL" verwenden. ; o UP "Ask_t" einfuehren ? ; o UP "Simp_Stat" verwenden ? ; o Klein/Gross bei: s | d | j ? ; o "DATEN-ENDE" abfangen ? ; o UP "DISK_CHECK" einfuehren ? ;=============================================================================== ; Liste der verwendeten IDL-Programme der Abt. Wiss. Datenverarbeitung am IFP: ; ; o Ask P 476/10 Befragung des Benutzer mit Ja/Nein-Verzweigung. ; o Common_DEVI P 476/91 Def. gemeinsamer Datenbereich f. Device-Parameter. ; o Common_EEGS P 476/49 Def. gemeinsamer Datenbereich f. EEG's. ; o Common_PLOTS P 476/92 Def. gemeinsamer Datenbereich f. Plot-Parameter. ; o Create_Legende P 476/87 Erzeugen einer speziellen Zusatz-Legende. ; o Defined P 476/18 Feststellen, ob eine Variable definiert ist. ; o Display_Pot P 476/85 Bildschirm-Ausgabe eines (EEG-) Potentials. ; o EEG_Diffs P 476/89 Bildung von bestimmten Potential-Differenzen. ; o F_Element P 476/33 Extrahieren von Teilen aus einer Zeichenkette. ; o Get_EEG_Data P 476/34 Lesen strukturierter EEG-Daten (Potentiale). ; o Get_Number P 476/50 Eingabe einer Zahl mit Pruefung der Wertegrenzen. ; o Get_PlotRange P 476/56 Abfrage der Werte fuer die Plotbereiche. ; o Get_Reply P 476/51 Eingabe einer Antwort mit Pruefung d. Gueltigkeit. ; o Get_Sample P 476/39 Ziehen einer Stichprobe (1 Param.gleichverteilt). ; o Lotto P 476/35 Erzeugen einer Zufallszahlenfolge "n aus m". ; o Potential P 476/90 Extrahieren eines (EEG-)Potentials aus dem Vektor. ; o Print_Plot P 476/2 PostScript-Ausgabe einer Grafik-Datei. ; o Print_Pot P 476/52 PostScript-Ausgabe eines (EEG-) Potentials. ; o Random_Shuff P 476/84 Mitteln zufallsausgewaehlter EEG-Potentiale. ; o Read_FileName P 476/30 Eingabe einer Dateibezeichnung mit Pruefung. ; o Set_User_Params P 476/83 Benutzerspezifische Parameter einstellen. ; o Simp_Stat P 476/40 Einfache Statistikberechnungen. ; o TEK_Colors P 476/96 Laden der Tektronix-Farbtabelle (32 Farben). ; o VarType P 476/79 Feststellen des Typs einer Variablen. ; o Write_EEG_Data P 476/86 Schreiben von EEG-Potentialen in eine Datei. ;=============================================================================== ; Aenderungen: [Ab 25/2/92-khd] => V 01.0: ; - Diverse Tests von Aenderungen, Korrekturen und totalen ; Umstrukturierungen an der Vorlage "plot122.pro" ; von Przybyszewski vom 3/2/92; dieses ======> AVE_EEG.PRO. ; - Diverse Fehlermoeglichkeiten abgefangen; sicher nicht alle. ; - UP "GET_NUMBER" zur Zahleneingabe mit Check der Wertegrenzen ; eingefuehrt. ; - UP "GET_DATA" zum Lesen einer Daten-File mit besonderer ; Struktur eingefuehrt. ; [10/3/92-khd] => V01.1: (Experimentalfassung => SEIDLER) ; - Pkt.7: Die fehlende Fehlerberechnung und Ausgabe bei ; "single" zugefuegt. ; - Pkt.7: Keyword /EPS eingefuehrt, da nun mit dem neuen ; DECprint-System des HAIRclusters wieder eine direkte ; PostScript-Ausgabe (Druck) moeglich ist. ; - Pkt.7: Keyword /ERROR eingefuehrt. ; [26/3/92-khd] => V01.2: (Experimentalfassung => SEIDLER) ; - Alles: Generell fuer Druck Yrange=[10,-10] => [20,-20]. ; - Pkt.0: UP "WRITE_DATA" eingefuehrt. ; - Pkt.0: UP "PRINT_POTENTIAL" eingefuehrt mit Kw. /NOCLOSE. ; - Pkt.3: CONST fuer Plots/Drucke zugefuegt. ; - Pkt.5: Keyword /TEST eingefuehrt. ; - Pkt.9: "Mittelwerte von Potential-Differenzen ueber alle ; Versuchspersonen" neu eingefuehrt. ; - Pkt.12: Sub-Menue fuer Set/Reset Keywords eingefuehrt. ; [6/4/92-khd] => V01.3: (Experimentalfassung => SEIDLER) ; - Alles: Alle "single" EEG-Potentiale nunmehr negativ ; ausgegeben (mit Minuszeichen vor der VAR). ; - Pkt.0: UP "GET_DATA" und "WRITE_DATA" so modifiziert, dass ; auch Datenfiles vom Filestrukturtyp "mean" mit Stan- ; dardabweichungen od. Fehlern gelesen werden koennen. ; - Pkt.5: VAR t eingefuehrt als Faktor fuers Plotten der ; Standardabweichung oder des Fehlers. ; - Pkt.7: Bei "differences" Einfuehrung von "AutoJump". ; [10/4/92-khd] => V01.4: (Experimentalfassung => SEIDLER) ; - Alles: Den nunmehr ueberfluessigen Code entfernt. ; - Pkt.9: Code fuer Schleife ueber alle Versuchspersonen. ; - Pkt.9: Mittelwerte werden in der Datei nunmehr immer nega- ; tiv ausgegeben; ausdrueckl. Wunsch von H. Seidler!!! ; [13/4/92-khd] => V01.5: (Copy => AG GRUE + SEIDLER) ; - Alles: Start der Erweiterung fuer verschiedene Projekte. ; - Alles: Kommentierung ergaenzt und erweitert. ; - Div.: Weitere Read => Get_Number umgestellt. ; - Menus: Verriegelung der Benutzung von Menue-Punkten. ; - Pkt.0: Im UP "PRINT_POTENTIAL" Keyword /NOPRINT zugefuegt. ; - Pkt.4: Im Sub-Menue die Modifikationsmoeglichkeit vom ; Keyword /NOPRINT zugefuegt. ; [4/5/92-khd] => V01.6: (Copy => SEIDLER) ; - Div.: An einigen Stellen "Notausgaenge" => Menu zugefuegt. ; - Pkt.0: Im UP "GET_NUMBER" Pruefung auf Zahl zugefuegt. ; - Pkt.0: UP "DISPLAY_POTENTIAL" neu eingefuehrt. ; - Pkt.0: UP "GET_SAMPLE" fuer das "random shuffling" sowie ; UP "GET_PLOTRANGE" mit COMMON PLOTS zugefuegt. ; - Pkt.1: COMMON PLOTS fuer Plot-Parameter neu eingefuehrt. ; - Pkt.5: Zusaetzlich VAR job eingefuehrt. ; - Pkt.10: "Mittelwerte von zufallsausgewaehlten Potentialen" ; neu eingefuehrt. ; - Pkt.12: Moeglichkeit des Aendern des Plotranges zugefuegt. ; - Pkt.14: I/O-Fehlerbehandlung geaendert; Goto => Menu. ; [8/5/92-khd] => V02.7: ; - Alles: R e l e a s e ===> 2. ; - Alles: Kommentierung ergaenzt. ; - Pkt.0: UP "GET_SAMPLE" ausgelagert => P 476/39. ; - Pkt.1: Boolean Data_Read in Abhaengigkeit von der Existenz ; von Daten in sp gesetzt. ; - Pkt.2: Neues Keyword /TO_MENU implementiert. ; - Pkt.10: Code fuers "Random Shuffling" zugefuegt. ; - Pkt.10: Das Mitteln kann nunmehr fuer alle moeglichen ; Potential-Differenzen o d e r einzeln fuer die ; verschiedenen Ableitungsorte erfolgen. ; - Pkt.10: Ausgabe von Warnhinweisen zugefuegt. ; - Pkt.14: RETURN deaktiviert wg. der interaktiven Modifika- ; tionsmoeglichkeit. ; [11/5/92-khd] => V02.8: ; - Alles: Den COMMON-Bereich EEGS neu arrangiert. ; - Alles: COMMON-Bereich DEVI fuer Devices eingefuehrt. ; - Pkt.0: UP "WRITE_DATA" modifiziert wg. Open und Close. ; - Pkt.0: UP "GET_PROJECT" zugefuegt. ; - Pkt.5: Frage "Is original data file from HP-1000?" umge- ; stellt auf Struktur vom Typ "EVP-Daten File". ; - Pkt.10: Schreiben der Ergebnisse in eine grosse File einge- ; fuehrt (big_file). ; [13/5/92-khd] => V02.9: (Copy => AG GRUE + SEIDLER + PRZY) ; - Pkt.7: U.a. umgestellt auf Verwendung ... ; - Pkt.9: ... vom neuen UP "SIMP_STAT" (P476/40). ; - Pkt.10: Speichern aller gemittelten Einzelpotentiale mit ; Fehlern fuer weitere Verrechnung zugefuegt. ; - Pkt.10: Ausgabe der max. Potential-Amplitude auf den Plots. ; - Pkt.10: Nunmehr Verwendung vom UP "SIMP_STAT" (P476/40). ; [17/7/92-khd] => V02.10: (Copy => FUHRY) ; - Alles: Im COMMON EEGS die VAR fileTypus eingefuehrt. ; - Pkt.0: UP "ORD" neu eingefuehrt. ; - Pkt.5: Daten fuer neue Projekte EF + KI zugefuegt. ; - Pkt.11: Fuer eine evtl. Erweiterung vorbereitet. ; [20/7/92-khd] => V02.11: ; - Pkt.0: UP "GET_DATA" entfernt, da ... ; - Pkt.5: Lesen der Daten auf externe Prozedur "GET_EEG_DATA" ; (P476/34) umgestellt. ; - Pkt.5: Defaultwerte fuer Projekte eingefuehrt. ; - Pkt.5: Neue VAR cato fuer Kurzbezeichnung der Reizarten ; (categories) eingefuehrt. ; - Pkt.5: Daten fuer neue Projekte HL + HR zugefuegt. ; [24/7/92-khd] => V02.12: (Copy => SEIDLER + FUHRY) ; - Pkt.0: Im UP "PRINT_POTENTIAL" Eingabe von "/" abgefangen. ; - Pkt.0: UP "GET_PROJECT" wesentlich erweitert (structure). ; - Pkt.1: Ermittlung des aktuellen Users zugefuegt wg. der ; Unterscheidung bei den Projekten. ; - Pkt.4: Menue-Punkt 3 vorerst ausgeblendet. ; - Pkt.5: Endgueltige Umstellung auf die (neue) Frage nach ; dem File-Typus. Das externe UP "GET_EEG_DATA" ist ; in der V01.4 entsprechend umgestellt. ; - Pkt.5: Daten fuer weitere Projekte zugefuegt: ; AF, AG, AN, BF, CF, FF, FM, IA, IL. ; - Pkt.5: Einfuehrung von Projekt-Sonderfaellen in Abhaengig- ; keit vom aktuellen Benutzer. ; - Pkt.5: VAR n_dif wird nunmehr mit Gamma-Fktn. berechnet. ; - Pkt.6: Neues Keyword LINE zur Abfrage des LineStyle. ; - Pkt.6: Bei /LINE Abfrage des LineStyles nun auch beim ; 1. Potential; UP "DISPLAY_POTENTIAL" und ; UP "PRINT_POTENTIAL" entsprechend angepasst. ; - Pkt.12: Sub-Menue um Set/Reset Keyword /LINE erweitert. ; - Pkt.13: Nachfrage beim QUIT eingefuehrt. ; [28/7/92-khd] => V02.13: ; - Pkt.0: Im UP "DISPLAY_POTENTIAL" + "PRINT_POTENTIAL" neues ; Keyword /NODELTA implementiert. ; - Pkt.0: Neues UP "PRINT_LEGENDE" eingefuehrt. ; - Pkt.5: Workaround fuer "ORI" ist wg. UP "GET_EEG_DATA" ; V 01.7 obsolet; daher getilgt. ; - Pkt.5: Sonderfall Datei-Typ "AVE" behandelt. ; - Pkt.5: Projekt EF (von FUHRY) um 4. Categorie erweitert. ; - Pkt.10: Vor dem Verlagern ins UP "PRINT_LEGENDE" den Algo- ; rithmus der Ausgabe der verwendeten Stichprobe ; geaendert (nli=4 oder nli=8). ; [12/8/92-khd] => V02.14: ; - Alles: Zum Start reicht nunmehr aus: .SIZE 22000 4000 ; - Alles: Weitere Read,... auf das neue UP "GET_NUMBER" ; (P 476/50) umgestellt. ; - Alles: Alle Read,..., ans auf das neue UP "GET_REPLY" ; (P 476/51) umgestellt. ; - Alles: Alle indexbezogenen Eingaben von /Integer => /Long. ; - Alles: Obsoletes Keyword /PS getilgt. ; - Pkt.0: UP "GET_NUMBER" um Default-Wert ergaenzt und als ; externe Funktion ausgelagert (P 476/50). ; - Pkt.0: UP "GET_PLOTRANGE" als externe Funktion ausgelagert ; (P 476/56); Code hier geloescht. ; - Pkt.0: Das UP "PRINT_LEGENDE" ins externe UP "PRINT_POT" ; (P 476/56) integriert; Code hier geloescht. ; - Pkt.0: Obsoletes UP "PRINT_POTENTIAL" getilgt. ; - Pkt.0: UP "ASK_LINESTYLE" eingefuehrt. ; - Pkt.4: Aenderung des Sub-Menues wg. Keyword-Markierung; ; fuer /LINE + /NODELTA + /TEST + /ERR + /NOPRINT. ; - Pkt.5: Warnhinweis beim Lesen von "ORI"-Dateien zugefuegt. ; - Pkt.6: UP "PRINT_POTENTIAL" tw. durch neues externes ; UP "PRINT_POT" (P 476/52) ersetzt. ; - Pkt.7: Einrichten des 'Defaultierens'. ; - Pkt.7: Umstellung auf externes UP "PRINT_POT". ; - Pkt.7: Moegliche Bereichsueberschreitung beim "Single-Jump" ; abgefangen. ; - Pkt.7: Bei /LINE erfolgt nun Abfrage des LineStyles. ; - Pkt.8: Obsoleten Code (Relikt vom "plot122.pro") entfernt. ; - Pkt.9: Ausgabe der Legenden auf das externe UP "PRINT_POT" ; umgestellt. ; - Pkt.9: Bei /LINE erfolgt nun Abfrage des LineStyles. ; - Pkt.10: Ausgabe der Legenden auf das externe UP "PRINT_POT" ; umgestellt. ; - Pkt.10: Grand Average vorbereitet. ; [28/8/92-khd] => V02.15: ; - Alles: Common-Bereich PLOTS um VAR thick + linst erweitert. ; - Pkt.0: UP "CREATE_LEGENDE" eingefuehrt. ; - Pkt.0: UP "PRINT_CLOSE" eingefuehrt. ; - Pkt.0: Im UP "WRITE_DATA" den Common-Bereich EEGS sowie das ; Keyword /RANDOM zugefuegt und behandelt, da dieses ; fuer das Programm WAVE_EEG.PRO erforderlich ist. ; - Pkt.0: Im UP "DISPLAY_POTENTIAL" farbige Ausgabe des Fehler- ; bandes zugefuegt mit Color=2 = Rot (bei TEK_Color). ; - Pkt.4: Aenderung des Sub-Menues wg. Keyword-Marke zu /EPS. ; - Pkt.4: Color-Table geaendert von LoadCT,0 => TEK_Color. ; - Pkt.4 Bereich des Faktors t von .. 3.3 => .. 10.0 erhoeht. ; - Pkt.6: Ausgabe der Potential-Namen zugefuegt. ; - Pkt.7: Im "Single"-Zweig Ausgabe der Legenden + Potential- ; Namen zugefuegt. ; - Pkt.9: Ausgabe der Potential-Namen zugefuegt. ; - Pkt.10: Grand Average ueber alle Zuege implementiert. ; - Pkt.10: Bezeichnung "Random_ ..." der Ausgabe-Dateien ; geaendert => "Random_nr_ ...". ; - Pkt.10: Ausgabe des Grand Average in eine Datei ; "GRANDAVE_RANDOM_..." implementiert. ; - Pkt.10: Numerische Ungenauigkeit bei der Berechnung des ; Grand Average beseitigt. ; - Pkt.12: Sub-Menue um eindeutiges "Return..." ergaenzt. ; [12/9/92-khd] => V02.16: ; - Vorne: CopyRight-Notiz zugefuegt. ; - Alles: Neues Keyword /BATCH eingefuehrt. ; - Pkt.0: Im UP "DISPLAY_POTENTIAL" den Common-Bereich DEVI ; (bereits mit VAR Batch_Job) zugefuegt. ; - Pkt.0: UP "GET_FROM_VMS" wg. Batch-Betrieb eingefuehrt. ; - Pkt.1: Beim Common-Bereich DEVI neue VAR Batch_Job. ; - Pkt.1: Ausgabe eines Hinweises zum Plattenplatz zugefuegt. ; - Pkt.2: Batch-Betrieb vorbereitet mit /NOPRINT. ; - Pkt.4: Am Beginn bei Batch-Betriebs ===> Punkt 5. ; - Pkt.5: Beim Projekt "KI" Definition der VAR locs zugefuegt. ; - Pkt.5: Am Schluss bei Batch-Betrieb ===> Punkt 10. ; - Pkt.5: Auf die Batch-Option umgestellt. ; - Pkt.10: Den Sonderfall "1 Zug" beim Grand Average ; beruecksichtigt. ; - Pkt.10: Am Schluss bei Batch-Betrieb ===> Exit von IDL. ; - Pkt.10: Auf die Batch-Option umgestellt. ; [15/9/92-khd] => V02.16b: (Copy => AG GRUE, FUHRY, DK, SEIDLER) ; - Alles: Kommentierung ergaenzt. ; - Pkt.7: Im Single-Zweig Aufruf von "Print_Close" zugefuegt. ; [26/10/92-khd] => V02.16c: ; - Pkt.9: Bei der Dateiausgabe mit WRITE_DATA das Minuszeichen ; vor ps.m entfernt wg. der Kompatibilaet. ; - Pkt.10: Bei der Dateiausgabe mit WRITE_DATA das Minuszeichen ; vor ps.m und gave entfernt wg. der Kompatibilaet. ; [3/11/92-khd] => V02.16d: ; - Pkt.5: Daten fuer neue Projekte EP, ES, HA, HF zugefuegt. ; - Pkt.5: Parameter fuer Projekte von Fr. HEUSSER zugefuegt. ; - Pkt.6: Vorbereitung der Moeglichkeit des Plottens der Stan- ; dardabweichung bei Daten vom Typ "AVE" (Nur im ; Single-Zweig!). ; [10/11/92-khd] => V02.16e,f + V02.17: ; - Pkt.0: Verlagern von DISPLAY_POTENTIAL => externes UP ; DISPLAY_POT.PRO (P 476/85). Aufrufe geaendert! ; - Pkt.0: Verlagern von WRITE_DATA => externes UP ; WRITE_EEG_DATA.PRO (P 476/86). Aufrufe geaendert! ; - Pkt.0: Verlagern von CREATE_LEGENDE => externes UP ; CREATE_LEGENDE.PRO (P 476/87). ; - Pkt.5: Abspaltung einer externen Prozedur SET_USER_PARAMS ; .PRO (P476/83). Den enstsprechenden Code getilgt. ; - Pkt.6: Moeglichkeit des Plottens der Standardabweichung ; bei Daten vom Typ "AVE" im Single-Zweig zugefuegt. ; [11/11/92-khd] => V02.17a: ; - Pkt.10: Verlagern des Haupt-Codes => externe Prozedur ; RANDOM_SHUFF.PRO (P 476/84). Code hier getilgt. ; [12/11/92-khd] => V02.17b: ; - Pkt.5: Die gesamte Projekt-Unterscheidung => ext. Prozedur ; SET_USER_PARAMS.PRO (P 476/83) verlagert. ; [1/12/92-khd] => V02.17c: ; - Alles: Bei allen Aufrufen von WRITE_EEG_DATA das neue Key- ; word /ADDPARAMS zugefuegt. Damit werden nun immmer ; in der 1. Zeile der Ausgabe-Dateien die Parameter ; zur Weiterverwendung ausgegeben. ; - Pkt.3: Text x_Titel geaendert. ; - Pkt.4: Neuen Menue-Punkt "Differences of locations & cate- ; gories" eingefuehrt. ; - Pkt.5: Bei der Projekt-Unterscheidung verbleibt der Fall ; "XX" (Datei-Typ "AVE") hier. ; - Pkt.6: Faktor t beim Plot der Standardabweichung zugefuegt. ; - Pkt.8: Neuer Punkt "Bildung von Potential-Differenzen nach ; bestimmten Kriterien (locations oder categories). ; [3/12/92-khd] => V02.17d,e: ; - Pkt.8: Aufruf des neuen EEG_DIFFS.PRO (P 476/89) zugefuegt. ; - Pkt.10: Aufruf von RANDOM_SHUFF geaendert (Parameter). ; [8/12/92-khd] => V02.17f: ; - Pkt.1: Common EEGS um folgende 7 VARs erweitert: ; anzahl, n_vpn, n_cat, n_loc, n_dif, t, proj. ; Dieses auch in 9 weiteren zugehoerigen Routinen des ; AVE_EEG-Pakets erledigt. ; - Pkt.8: Aufruf von EEG_DIFFS entsprechend angepasst. ; - Pkt.10: Aufruf von RANDOM_SHUFF entsprechend angepasst. ; [9/12/92-khd] => V02.18: ; - Pkt.5: Den Sonderfall "XX" (Dateityp "AVE") nunmehr voll- ; staendig behandelt. ; - Pkt.6: Im Fall "AVE" wird nun ggf. der Fehler verwendet. ; - Pkt.8: Nach Aufruf von EEG_DIFFS muss jump_max aktualisiert ; werden. ; [14/12/92-khd] => V02.18a,b: ; - Pkt.5: Nunmehr wird SET_USER_PARAMS immer aufgerufen, auch ; beim Dateityp "AVE". ; - Pkt.6: Beim Fall "AVE" ist die Multiplikation mit t falsch. ; [16/12/92-khd] => V02.18c: ; - Pkt.5: Die letzte Aenderung des Aufrufs von SET_USER_PARAMS ; vorerst deaktiviert. Zunaechst muss in dem UP die ; Struktur geaendert werden. ; - Pkt.12: Das SubMenue bleibt nunmehr solange stehen, bis ; "Return to ..." angeklickt wird. ; [18/12/92-khd] => V02.18d: ; - Alles: Neues UP "POTENTIAL" eingefuehrt. ; [8/1/93-khd] => V02.18e: ; - Pkt.1: Alle COMMONs auf externe Prozeduren mit Include, ; d.h. mit @Common_... (muss am Zeilenanfang stehen!) ; umgestellt. Damit gibt's nun nur noch eine Stelle, ; an der ggf. die Common-Bereiche geaendert werden ; muessen bzw. koennen. - IDL ist schon sehr gut !!! ; [13/1/93-khd] => V02.18f: ; - Pkt.3: Text von x_Titel nochmals geaendert (kuerzer!). ; [21/2/93-fuhry] => V02.18g: ; - Pkt.0: Neues UP "ASK_LINETHICK" eingefuehrt. ; - Pkt.5: Beim Setzen der Default-Werte des Plotranges den ; Sonderfall FUHRY eingefuehrt. ; - Pkt.6: Abfrage der Linienstaerke zugefuegt. ; [18/3/93-khd] => V02.19: ; - Pkt.0: Im UP "ASK_LINETHICK" die VAR linth => thick umge- ; stellt, die bereits im Common PLOTS dafuer vorge- ; sehen war. Damit wird PRINT_POT automatisch richtig ; informiert. ; - Pkt.4: Die Groesse des Windows fuer die Grafikausgaben ; relativiert wg. der Benutzung von Ave_EEG via MacX ; auf dem WDVMAC. Absolutangaben sind ungeeignet! ; [31/3/93-khd] => V02.19a: ; - Alles: Beginn der Anpassung ===> IDL V 3.0. ; - Pkt.4: Berechnung der Windowgroesse verbessert. ; - Pkt.4: UP TEK_COLOR vorerst deaktiviert wg. IDL 3.0, da ; hierbei die Menues schwarz werden. ; [1/4/93-khd] => V02.19b: ; - Pkt.4: UP TEK_COLOR durch P476/96 TEK_COLORS ersetzt. Damit ; verschwindet das Problem mit dem schwarzen Hinter- ; grund von WMENU's unter IDL 3.0. ; [17/6/93-khd] => V02.19c: ; - Pkt.4: Bei wiederholten Aufrufen von Ave_EEG wird das Plot- ; Fenster staendig verkleinert. Deshalb vorerst wieder ; auf absolute Fenstergroesse umgestellt, da die IDL ; System-Variablen !D.X_Size und !D.Y_Size nicht hal- ; ten, was sie laut Manual versprechen! ; [6/7/93-khd] => V02.19d: ; - Pkt.5: Hier den Sonderfall CASE SEECK ... behandelt, da ; fuer die Publikation "WaveMeth" nur noch AVE-Files ; vorliegen (betr. die Ergaenzungen). ; [7/2/94-khd] => V02.19e: ; - Pkt.0: In Function Get_Project StrUpCase(...) zugefuegt. ; [28/8/97-khd] => V03.20: ; - Alles: R e l e a s e ===> 3, was V02.19e entspricht. ;=============================================================================== ; 0. Definition von Hilfs-Routinen: ;=============================================================================== ; FUNCTION GET_PROJECT, string ; Ermitteln der Kurzbezeichnung On_Error, 2 ; des aktuellen Projekts. ; z.B.: string = "AU10N3" project = { Kennung, PP: " ", $ ; Bezeichnung des Projekts. VV: 0, $ ; Nr. der Versuchsperson. S: " ", $ ; Stimulusart (categorie). E: 0 } ; Elektrode, Ableitort (location). project.PP = StrUpCase(StrMID(string,0,2)) ; z.B.: "AU" project.VV = Fix(StrMID(string,2,2)) ; z.B.: 10 project.S = StrUpCase(StrMID(string,4,1)) ; z.B.: "N" project.E = Fix(StrMID(string,5,1)) ; z.B.: 3 Return, project ; Komplette Struktur uebergeben. END ;_______________________________________________________________________________ FUNCTION ORD, element, var ; Ermitteln der Ordnungsnummer eines On_Error, 2 ; Elements in einem Feld. i=0L Repeat Begin If (var(i) eq element) $ then Return, i $ else i = i + 1 EndRep Until (N_Elements(var) eq i) Return, i = -1L ; Element ist nicht enthalten. END ;_______________________________________________________________________________ FUNCTION ASK_LINESTYLE, LINE=line ; Erfragen der Nummer des On_Error, 2 ; LineStyles. If Keyword_Set(line) $ then linst = Get_Number("* Which linestyle do you want?", $ 0, 5, 0, /Integer) $ else linst = 0 ; Default: Ausgezogene Linie. Return, linst END ;_______________________________________________________________________________ FUNCTION ASK_LINETHICK, LINE=line ; Erfragen der Linienstaerke. On_Error, 2 If Keyword_Set(line) $ then thick = Get_Number("* Which thickness of line do you want?", $ 1, 6, 3, /Integer) $ else thick = 3 ; Default Return, thick END ;_______________________________________________________________________________ PRO PRINT_CLOSE, file, EPS=eps, NOPRINT=noprint On_Error, 2 @Common_DEVI ; Include P 476/91. If Keyword_Set(eps) $ then Device, /Close_File $ ; Schliessen der EPS-File. else If Keyword_Set(noprint) $ then Print_Plot, file, /NoPrint $ else Print_Plot, file ; Direkte Druckausgabe. Set_Plot, OldDevice ; Auf Monitor umschalten. END ;_______________________________________________________________________________ PRO GET_FROM_VMS, nx, fileTypus, t, file, move, Use_Diff On_Error, 2 ; Lesen der Parameter-Definitionen ; aus der LNM$PROCESS_TABLE des nx = GetEnv ("AVE_EEG_NX") ; aktuellen Benutzers. fileTypus = GetEnv ("AVE_EEG_FILETYPUS") t = GetEnv ("AVE_EEG_T") file = GetEnv ("AVE_EEG_FILE") move = GetEnv ("AVE_EEG_MOVES") Use_Diff = GetEnv ("AVE_EEG_USE_DIFF") If (nx eq "") Or (fileTypus eq "") Or (t eq "") Or $ (file eq "") Or (move eq "") Or (Use_Diff eq "") $ then Begin Message, "Parameter not defined by user." Exit ; IDL wieder verlassen. Endif nx = Long(nx) t = Float(t) move = Long(move) If (Use_Diff eq '0') then Use_Diff=0 else Use_Diff=1 END ;=============================================================================== ; PRO AVE_EEG, NOPRINT=noprint, EPS=eps, LINE=line, NOLOG=nolog, $ NODELTA=nodelta, ERROR=err, BATCH=batch, $ TEST=test, TO_MENU=to_menu ;=============================================================================== ; 1. Prolog, Typdeklarationen, Variablen und Konstanten: ;=============================================================================== ; ;;On_Error, 2 ; Return => Ruf. Programm. On_IOerror, IO_Error ; Siehe Pkt.13. @Common_EEGS ; Include P 476/49. @Common_DEVI ; Include P 476/91. @Common_PLOTS ; Include P 476/92. Print, "" Print, "************** AVE_EEG: Averaging Evoked Potentials V 2.0.19e **************" Print, "" Print, "|| R e m e m b e r ," Print, "|| there will be a lot of disk space needed in the" Print, "|| current directory when producing all the output" Print, "|| files (graphics & datas)." Print, "|| It's a very good idea, cleaning up the current" Print, "|| directory before using AVE_EEG. ---- D'accord ?" Print, "" file = "" rand = 50 ; Rand fuer (DEC-)Window in Pixel. w0 = 10 ; Fuer Bezugskoo. des (DEC-)Windows. wxori = 640 wyori = 512 Mark = "#" ; Marke fuer gesetztes Keyword. NoMark = " " ; Marke fuer nicht ges. Keyword. t$ = 1.0 ; Faktor fuer stdev/error. ok = "" & titl = "" ; Typ-Deklaration. answer = "" & ans = "" ; Typ-Deklaration. fileTypus = "" ; Typ-Deklaration. User = GetEnv("CURR_USER") ; Akt. User ag. LNM$PROCESS_TABLE ; ermitteln. ;;If (User eq "DIT") then User="FUHRY" ; Alias-Eintrag (zum Testen). If (N_Elements(sp) ne 0) then Data_Read=1 else Data_Read=0 ; Boolean. ; ;=============================================================================== ; 2. Behandlung der Keywords (Default-Werte): ;=============================================================================== ; If Not Keyword_Set(err) then err = 0 If Not Keyword_Set(nodelta) then nodelta = 0 else nodelta = 1 If Keyword_Set(batch) then Batch_Job = 1 else Batch_Job = 0 If Keyword_Set(batch) then noprint = 1 If Keyword_Set(to_menu) then Goto, Window_Control ; ;=============================================================================== ; 3. Setzen von Parametern fuer die Ausgaben: ;=============================================================================== ; ;;!X.Charsize = 0.9 & !Y.Charsize = 0.9 !X.Ticklen = -0.02 & !Y.Ticklen = -0.02 ;;!X.Ticks = 2 & !Y.Ticks = 3 ;;!X.Minor = 4 & !Y.Minor = 3 Titel1 = "EEG Potential: " ; Konstanten fuer Plots: Titel2 = "Averaged EEG Potential: " Titel3 = "Grand Averaged EEG Potential: " x_Titel = "time after stimulus change [ms]" y_Titel = "amplitude [uV]" ; ;=============================================================================== ; 4. Window- und Menue-Steuerung: ;=============================================================================== ; If Keyword_Set(batch) then Goto, Read_Data ; Direkt ===> Punkt 5. Window_Control: Window_Titel = "E E G Plots" Menu_Titel = "Menu AVE_EEG" ;;Show_Status wx = Float(2*256 + 3*rand) wy = Float(2*192 + 3*rand) wx = Fix(wx * wxori/1024.) ; Groesse des (DEC-)Windows wy = Fix(wy * wyori/864.) ; = Fenster auf dem Schirm. Window, Xpos=w0, Ypos=2*w0, $ ; Das neue Fenster erzeugen. Xsize=wx, Ysize=wy, $ Title=Window_Titel, Retain=2, /Free TEK_Colors ; 32 Tektronix Farben (P 476/96). Window1 = !D.Window Num_Menu= 10 ; Daten fuer das Haupt-Menue: menu = StrArr(Num_Menu) menu(0) = "Read EEG data file" menu(1) = "Plot & Print" menu(2) = "Averaging EEG signals by numbers" menu(3) = "Differences of locations & categories" menu(4) = "Averaging potential diff's over persons" menu(5) = "Perform random shuffling" menu(6) = " ( reserved )" menu(7) = "Set/Reset parameters or keywords" menu(Num_Menu-2) = "" ; Bleibt immer frei. menu(Num_Menu-1) = "Quit - Return to IDL" Num_Subm= 19 ; Daten fuer das Sub-Menue: subm = StrArr(Num_Subm) subm_0 = " Plot with stdev" subm_1 = " Plot with error" subm(2) = " Change stdev/error factor..." subm(3) = " Change X-axis range..." subm(4) = " Change Y-axis range..." subm(5) = " " subm_6 = " Print plots" subm_7 = " No printing of plots" subm(8) = " " subm_9 = " EPS output" subm_10 = " PS output" subm(11)= " " subm_12 = " Keyword /NODELTA" subm_13 = " Keyword /LINE" subm(14)= " " subm(15)= " " subm_16 = " Keyword /TEST" subm(17)= " " subm(18)= " Return to Main Menu" ; Status von Keywords markieren: If Keyword_Set(err) $ then Begin ; /ERR subm(0) = NoMark + subm_0 subm(1) = Mark + subm_1 Endif $ else Begin subm(0) = Mark + subm_0 subm(1) = NoMark + subm_1 Endelse If Keyword_Set(noprint) $ then Begin ; /NOPRINT subm(6) = NoMark + subm_6 subm(7) = Mark + subm_7 Endif $ else Begin subm(6) = Mark + subm_6 subm(7) = NoMark + subm_7 Endelse If Keyword_Set(eps) $ then Begin ; /EPS subm(9) = Mark + subm_9 subm(10) = NoMark + subm_10 Endif $ else Begin subm(9) = NoMark + subm_9 subm(10) = Mark + subm_10 Endelse If Keyword_Set(nodelta) $ ; /NODELTA then subm(12) = Mark + subm_12 $ else subm(12) = NoMark + subm_12 If Keyword_Set(line) $ ; /LINE then subm(13) = Mark + subm_13 $ else subm(13) = NoMark + subm_13 If Keyword_Set(test) $ ; /TEST then subm(16) = Mark + subm_16 $ else subm(16) = NoMark + subm_16 ;_______________________________________________________________________________ While(1) Do Begin ; Start der grossen Menue-Schleife. Menu: CASE Wmenu(menu) OF ; Schluss ==> Pkt.13. ; ;=============================================================================== ; 5. EEG-Daten einlesen: Menue-Punkt 0 ;=============================================================================== ; 0: Begin Read_Data: nx = 180. If Keyword_Set(test) $ then Begin nx = 200. fileTypus = "EVP" file = "DEMO:AUALAS" ; Test-Daten fuer EVP-Filestruktur. job = "AUALAS" Goto, Check_File Endif If Keyword_Set(batch) $ then Begin Get_From_VMS, nx, fileTypus, t, file, move, Use_Diff Goto, Make_Job Endif nx = Get_Number("* How many sample points has each potential?", $ 100, 300, 200, /Long) fileTypus = Get_Reply("* Enter type of data file (EVP,AVE,ORI)", $ "EVP|AVE|ORI", "EVP", /NoCase) t = Get_Number("* Enter factor for plotting stdev/error (1.0..10.0)", $ 1.0, 10.0, t$, /Real) Ask_File: Read, "* Enter data file name (program adds .TXT) > ", file Make_Job: file = StrUpcase(file) If (file eq "") then Goto, Menu job = F_Element(1, ":", file) ; Evtl. vorhand. Device entfernen. If (job eq ":") then job = file Check_File: filNam = file + ".TXT" answer = FindFile(filNam) ; Ist File vorhanden ? If (answer(0) eq "") $ then Begin Message, "Data file doesn't exist, try again!", /Continue If Keyword_Set(batch) $ then Exit else Goto, Ask_File Endif Get_EEG_Data, filNam ; Daten laufen via COMMON EEGS! Data_Read = 1 ; Boolean => True. CASE fileTypus Of "AVE": Begin temp = name(0) ; Namen vorerst aufheben. name(0) = "XX00X9" ; Ist das gut ??? <<<<<<<<<<<<<<<< Print, " n_vpn = ", n_vpn Print, " n_cat = ", n_cat Print, " n_loc = ", n_loc EndCase "ORI": Begin Print, "****************************************" Print, "* Use menu ***Plot & Print*** only ! *" Print, "****************************************" Print, "" EndCase Else: Begin Endcase ENDCASE proj = Get_Project(name(0)) ; Alle Projekt-Kennungen ermitteln. cato = ["N", "O", "P", "Q"] ; Kurznamen der Reizarten. ;; xr_lo$ = -200. & xr_hi$ = 800. ; Min. und Max. Werte ;; yr_lo$ = -100. & yr_hi$ = 100. ; fuer den Plotrange. ;; xplotr = [-200.,800.] ; Die Default-Einstellung ;; yplotr = [20.,-20.] ; des Plotranges. CASE user Of ; Behandlung von Sonderfaellen. "FUHRY": Begin xr_lo$ = -200. & xr_hi$ = 800. ; Min. und Max. Werte yr_lo$ = -100. & yr_hi$ = 100. ; fuer den Plotrange. xplotr = [-100.,400.] ; Die Default-Einstellung yplotr = [40.,-40.] ; des Plotranges. End "SEECK": Begin xr_lo$ = -100. & xr_hi$ = 800. ; Min. und Max. Werte yr_lo$ = -100. & yr_hi$ = 100. ; fuer den Plotrange. xplotr = [-100.,800.] ; Die Default-Einstellung yplotr = [20.,-20.] ; des Plotranges. End ELSE: Begin xr_lo$ = -300. & xr_hi$ = 900. ; Min. und Max. Werte yr_lo$ = -100. & yr_hi$ = 100. ; fuer den Plotrange. xplotr = [-200.,800.] ; Die Default-Einstellung yplotr = [20.,-20.] ; des Plotranges. End ENDCASE ; Die Parameterbeschreibung der Projekte (Projekt-Unterscheidung) erfolgt ; nunmehr nur noch in der externen Prozedur PRO:SET_USER_PARAMS.PRO. Hier ; werden im folgenden nur besondere Faelle behandelt: CASE proj.PP Of ; Besondere Projekte: ; =================== "XX": Begin ; Datei-Typ "AVE". name(0) = temp locs = Replicate("$", n_loc) ; Vorerst ein $-Zeichen als cats = Replicate("$", n_cat) ; Filler verwendet. <<<<<<<< End Else: Begin ; Projekt-Unterscheidung: ; ====================== Set_User_Params, user, proj, $ ; Eingefuehrt ab V02.16e - 9/11/92 locs, cats, $ xplotr, yplotr End ENDCASE ;; Set_User_Params, user, proj, $ ; Eingefuehrt ab V02.16e - 9/11/92 ;; locs, cats, $ ;; xplotr, yplotr n_cat = N_Elements(cats) ; Anzahl der Reizarten (categories). n_loc = N_Elements(locs) ; Anzahl der Ableitorte (locations). n_vpn = n_pot/(n_loc*n_cat) ; Anzahl der Versuchspersonen. jump_max = n_loc * n_cat ; Max. moeglicher Sprung. If (n_loc lt 2) then n_dif = 0 ; Anzahl der maximal moeglichen If (n_loc ge 2) $ ; Differenz-Potentiale. then n_dif = Fix(Gamma(n_loc+1)/Gamma(n_loc-1)/2.) xax = Findgen(points)*tsamp-tvor ; x-Achse fuer die Plots. jump$ = jump_max ; Default-Werte: nave$ = "--" ans$s = "s" ans$j = "j" If Keyword_Set(batch) then Goto, Random_Shuffle ; Direkt ==> Punkt 10. ENDCASE ; ;=============================================================================== ; 6. Ausgabe von Einzelpotentialen: Menue-Punkt 1 ;=============================================================================== ; 1: Begin If Not Data_Read $ then Begin Message, "No datas are read.", /Continue Goto, Menu Endif num0=0 & num1=0 & deltasp=0. ans = "" Ask_PlotStyle_1: ans = Get_Reply("* Do you want to plot single (s) or difference (d)?", $ "s|d", ans$s) & ans$s = ans CASE ans Of "s": Begin num0 = Get_Number("* Which potential do you want to plot?", $ 1, n_pot, /Long) If (fileTypus eq "AVE") $ then Begin If Ask("* Plot with deviations ?",/ENG) $ then If Keyword_Set(err) $ then Begin deltasp = dev((num0-1)*nx:(num0*nx-1)) deltasp = deltasp/ Sqrt(anzahl) Endif $ else deltasp = dev((num0-1)*nx:(num0*nx-1)) Endif contents = name(num0-1) sp1=sp((num0-1)*nx:(num0*nx-1)) time = SysTime(0) ; Zeitpkt. der Berechnung. EndCase "d": Begin num0 = Get_Number("* Which potential in difference do you want first?", $ 1, n_pot, /Long) num1 = Get_Number("* Which potential do you want as second?", $ 1, n_pot, /Long) contents = name(num0-1) + "-" + name(num1-1) sp1=sp((num0-1)*nx:(num0*nx-1)) - $ sp((num1-1)*nx:(num1*nx-1)) time = SysTime(0) ; Zeitpkt. der Berechnung. EndCase "": Goto, Menu ; = Notausgang! Else: Begin Message, "Isn't correct, try again!", /Continue Goto, Ask_PlotStyle_1 EndCase ENDCASE linst = Ask_LineStyle(Line=line) thick = Ask_LineThick(Line=line) ; Die Linienstaerke. Display_Pot, xax, -sp1, t*deltasp, x_Titel, y_Titel, linst num1=0 & i_num=0 O_Plot: If Ask("* Do you want an overplot ?", /ENG) $ then Begin Ask_PlotStyle_2: ans = Get_Reply("* Do you want to plot single (s) or difference (d)?", $ "s|d", ans$s) & ans$s = ans CASE ans Of "s": Begin num0 = Get_Number("* Which potential do you want to plot?",$ 1, n_pot, /Long) contents = [contents, name(num0-1)] sp2=sp((num0-1)*nx:(num0*nx-1)) time = SysTime(0) ; Zeitpkt. der Berechnung. EndCase "d": Begin num0 = Get_Number("* Which potential in difference do you want first?",$ 1, n_pot, /Long) num1 = Get_Number("* Which potential do you want as second?",$ 1, n_pot, /Long) contents = [contents, name(num0-1) + "-" + name(num1-1)] sp2=sp((num0-1)*nx:(num0*nx-1)) - $ sp((num1-1)*nx:(num1*nx-1)) time = SysTime(0) ; Zeitpkt. der Berechnung. EndCase "": Goto, Menu ; = Notausgang! Else: Begin Message, "Isn't correct, try again!", /Continue Goto, Ask_PlotStyle_2 EndCase ENDCASE i_num=i_num+1 If Keyword_Set(line) $ then linr = Get_Number("* Which linestyle do you want?", $ 0, 5, 0, /Integer) $ else linr = i_num Oplot, xax, -sp2, LineStyle=linr, Thick=3 If (i_num eq 1) then sp3=sp2 else sp3=[sp3,sp2] linst = [linst, linr] Goto, O_Plot Endif ; Overplot. If Ask("* Do you want to print the plots ?", /ENG) $ then Begin ; Druckausgabe: contents = ["Potentials drawn:", contents] Print_Pot, xax, -sp1, t*deltasp, linst(0), Titel1, x_Titel, $ y_Titel,"", "", contents, $ NoPrint=noprint, EPS=eps, NoDelta=nodelta, /NoClose For i=0,i_num-1 Do Begin Oplot, xax, -sp3(i*nx:(i+1)*nx-1), $ LineStyle=linst(i+1), Thick=3 EndFor Print_Close, file, EPS=eps, NOPRINT=noprint Endif ENDCASE ; ;=============================================================================== ; 7. Mittelwerte von ausgewaehlten Potentialen: Menue-Punkt 2 ;=============================================================================== ; 2: Begin If Not Data_Read $ then Begin Message, "No datas are read.", /Continue Goto, Menu Endif spa = Replicate(0.0,nx) spa_sum = Replicate(0.0,nx) nave = Get_Number("* How many persons do you want to average?", $ 2, n_vpn, nave$, /Long) nave$ = nave Ask_AveStyle_1: ans = Get_Reply("* Do you want averaging single (s) or difference (d)?", $ "s|d", ans$s) & ans$s = ans CASE ans Of "s": Begin ;---------------------- Single ----------------- ans = "" Ask_Method: ans = Get_Reply("* Do you want auto-jump (j) or step (s)?", $ "j|s", ans$j) & ans$j = ans CASE ans Of "j": Begin ;---------- Begin Jump ---------- fnum=1 & jump=1 fnum = Get_Number("* Enter number of 1. potential", $ 1, n_pot, /Long) jump = Get_Number("* Enter number of jump", $ 1, jump_max, jump$, /Long) jump$=jump If (jump*(nave-1)+fnum gt n_pot) $ then Begin Print, "* Numbers out of range, try again!" Goto, Ask_Method Endif For i=1,nave Do Begin If (i eq 1) then num=fnum else num=num+jump Print, "Name of potential: ", name(num-1) If (i eq 1) then contents = name(num-1) $ else contents = [contents, name(num-1)] sp_a = sp((num-1)*nx:num*nx-1) spa = spa + sp_a/nave spa_sum = spa_sum + sp_a^2 Endfor EndCase ;---------- End Jump ------------ "s": Begin ;---------- Begin Step ---------- For i=1,nave Do Begin ans = "" num = Get_Number("* Which potential do you want to average?", $ 1, n_pot, /Long) Print, "Name of potential: ", name(num-1) If (i eq 1) then contents = name(num-1) $ else contents = [contents, name(num-1)] sp_a = sp((num-1)*nx:num*nx-1) spa = spa + sp_a/nave spa_sum = spa_sum + sp_a^2 Endfor EndCase ;---------- End Step ------------ "": Goto, Menu ; = Notausgang! Else: Begin Message, "Isn't correct, try again!", /Continue Goto, Ask_Method EndCase ENDCASE ; ans ; Berechnung von Mittelwerten und Fehlern: ; In der VAR spa steht bereits das mittlere Potential. spa_sum = spa_sum - nave*(spa^2) spa_dev = Sqrt(spa_sum/(nave-1)) ; Standardabweichungen. spa_err = spa_dev/Sqrt(nave) ; Fehler der Mittelwerte. time = SysTime(0) ; Zeitpkt. der Berechnung. Wset, Window1 linst = Ask_LineStyle(Line=line) If Not Keyword_Set(err) $ then Display_Pot, xax, -spa, t*spa_dev, $ x_Titel, y_Titel, linst, NoDelta=nodelta $ else Display_Pot, xax, -spa, t*spa_err, $ x_Titel, y_Titel, linst, NoDelta=nodelta If Ask("* Do you want to store the result?", /ENG) $ then Begin Read,"* Enter file name (program adds .TXT) > ", file Write_EEG_Data, file, nave, spa, spa_dev, /AddParams Endif If Ask("* Do you want to print?",/ENG) $ then Begin ; Druckausgabe: Leg = Create_Legende(t, 0, ERR=err) contents = ["Samples used:", contents] If Not Keyword_Set(err) $ then Print_Pot, xax, -spa, t*spa_dev, linst, Titel2, $ x_Titel, y_Titel, "", Leg, contents, $ NoPrint=noprint, EPS=eps, $ NoDelta=nodelta, /NoClose $ else Print_Pot, xax, -spa, t*spa_err, linst, Titel2, $ x_Titel, y_Titel, "", Leg, contents, $ NoPrint=noprint, EPS=eps, $ NoDelta=nodelta, /NoClose Print_Close, file, EPS=eps, NOPRINT=noprint Endif EndCase ;---------------------- End Single ------------- ;_______________________________________________________________________________ "d": Begin ;---------------------- Differences ------------ AutoJump = 0 i_vpn = 0 Repeat Begin i_vpn = i_vpn + 1 If AutoJump $ then Begin num0 = num0 + jump num1 = num1 + jump Endif $ else Begin num0 = Get_Number("* Which potential in difference do you want first?",$ 1, n_pot, /Long) num1 = Get_Number("* Which potential do you want as second?",$ 1, n_pot, /Long) Endelse sp1=sp((num0-1)*nx:(num0*nx-1)) -$ sp((num1-1)*nx:(num1*nx-1)) If (i_vpn eq 1) then pot=[sp1] else pot=[[pot],[sp1]] If Not AutoJump $ then Begin If Ask("* Do you want computing by auto-jump?",/ENG) $ then AutoJump=1 else AutoJump=0 If AutoJump $ then Begin jump = Get_Number("* Enter number of jump", $ 1, jump_max, jump$, /Long) jump$=jump Endif Endif Print, "Number: ", i_vpn, " ", name(num0-1), " - ", name(num1-1) If (i_vpn eq 1) $ then contents = name(num0-1) + "-" + name(num1-1) $ else contents = [contents, name(num0-1) + "-" + name(num1-1)] EndRep Until (i_vpn eq nave) ps = Simp_Stat(pot) & time = SysTime(0) Wset, Window1 linst = Ask_LineStyle(Line=line) If Not Keyword_Set(err) $ then Display_Pot, xax, -ps.m, t*ps.sd, $ x_Titel, y_Titel, linst, NoDelta=nodelta $ else Display_Pot, xax, -ps.m, t*ps.se, $ x_Titel, y_Titel, linst, NoDelta=nodelta If Ask("* Do you want to store the result?", /ENG) $ then Begin Read,"* Enter file name (program adds .TXT) > ", file Write_EEG_Data, file, ps.n, ps.m, ps.sd, /AddParams Endif If Ask("* Do you want to print?", /ENG) $ then Begin ; Druckausgabe: Leg = Create_Legende(t, ps.amp, ERR=err) contents = ["Samples used:", contents] If Not Keyword_Set(err) $ then Print_Pot, xax, -ps.m, t*ps.sd, linst, Titel2, $ x_Titel, y_Titel, "", Leg, contents, $ NoPrint=noprint, EPS=eps, $ NoDelta=nodelta, /NoClose $ else Print_Pot, xax, -ps.m, t*ps.se, linst, Titel2, $ x_Titel, y_Titel, "", Leg, contents, $ NoPrint=noprint, EPS=eps, $ NoDelta=nodelta, /NoClose Print_Close, file, EPS=eps, NOPRINT=noprint Endif EndCase ;---------------------- End Differences -------- Else: Begin Message, "Isn't correct, try again!", /Continue Goto, Ask_AveStyle_1 EndCase ENDCASE ; ans ENDCASE ; ;=============================================================================== ; 8. Bildung von Potential-Differenzen nach ; bestimmten Kriterien (locations oder categories): Menue-Punkt 3 ;=============================================================================== ; 3: Begin If Not Data_Read $ then Begin Message, "No datas are read.", /Continue Goto, Menu Endif EEG_Diffs, n_vpn, locs, cats jump_max = n_loc * n_cat ; Das muss hier aktualisiert jump$ = jump_max ; werden. Print, "" ENDCASE ; ;=============================================================================== ; 9. Mittelwerte von Potential-Differenzen ueber alle Vpn: Menue-Punkt 4 ;=============================================================================== ; 4: Begin If Not Data_Read $ then Begin Message, "No datas are read.", /Continue Goto, Menu Endif cat = "" nave = Get_Number("* How many persons do you want to average?", $ 2, n_vpn, /Long) Ask_Stimulus: Read, "* Which kind of stimulus/categorie? > ", cat cat = StrUpcase(cat) CASE cat Of ; Reihenfolge in der Datei: "N": rs=0 ; o Gesicht ohne Augen, "O": rs=1 ; o Augen horizontal, "P": rs=2 ; o Augen vertikal, "Q": rs=3 ; o Vollstaendiges Gesicht. "": Goto, Menu ; = Notausgang! Else: Begin Message, "Not defined stimulus/categorie, try again!", /Continue Goto, Ask_Stimulus EndCase ENDCASE ;cat linst = Ask_LineStyle(Line=line) For num0=1, n_loc Do Begin For num1=num0+1, n_loc Do Begin file = cats(rs) + "_" + locs(num0-1) + "-" + locs(num1-1) Print, file i_vpn = 0 j = 0 Repeat Begin i_vpn = i_vpn + 1 sp1=sp((num0+rs+j-1)*nx:((num0+rs+j)*nx-1)) -$ sp((num1+rs+j-1)*nx:((num1+rs+j)*nx-1)) If (i_vpn eq 1) then pot=[sp1] else pot=[[pot],[sp1]] If Not Keyword_Set(nolog) then $ Print, "Number: ", i_vpn, " ", name(num0+rs*n_loc+j-1), $ " - ", name(num1+rs*n_loc+j-1) If (i_vpn eq 1) $ then contents = name(num0+rs*n_loc+j-1) + "-" + $ name(num1+rs*n_loc+j-1) $ else contents = [contents, name(num0+rs*n_loc+j-1) + "-" + $ name(num1+rs*n_loc+j-1)] j = n_loc * n_cat * i_vpn EndRep Until (i_vpn eq nave) ps = Simp_Stat(pot) & time = SysTime(0) Wset, Window1 If Not Keyword_Set(err) $ then Display_Pot, xax, -ps.m, t*ps.sd, $ x_Titel, y_Titel, linst, NoDelta=nodelta $ else Display_Pot, xax, -ps.m, t*ps.se, $ x_Titel, y_Titel, linst, NoDelta=nodelta Write_EEG_Data, file, ps.n, ps.m, ps.sd, /AddParams SubTit = "Mean of " + StrCompress(ps.n,/Remove) + " persons." Leg = Create_Legende(t, ps.amp, ERR=err) contents = ["Samples used:", contents] If Not Keyword_Set(err) $ then Print_Pot, xax, -ps.m, t*ps.sd, linst, Titel2, $ x_Titel, y_Titel, SubTit, Leg, contents, $ NoPrint=noprint, EPS=eps, File=file, $ NoDelta=nodelta, /NoClose $ else Print_Pot, xax, -ps.m, t*ps.se, linst, Titel2, $ x_Titel, y_Titel, SubTit, Leg, contents, $ NoPrint=noprint, EPS=eps, File=file, $ NoDelta=nodelta, /NoClose Print_Close, file, EPS=eps, NOPRINT=noprint Print, "" EndFor EndFor ENDCASE ; ;=============================================================================== ; 10. Mittelwerte von zufallsausgewaehlten Potentialen: Menue-Punkt 5 ;=============================================================================== ; 5: Begin Random_Shuffle: If Not Data_Read $ then Begin Message, "No datas are read.", /Continue Goto, Menu EndIf nave = n_vpn ; Die Anzahl ist bekannt! If Keyword_Set(batch) then Goto, Do_Random_Shuffling move = Get_Number("* Enter number of moves (1..60)", $ 1, 60, 1, /Long) ; Anzahl der Zuege/Stichproben. If Ask("* Do you want averaging of potential diffs ?", /ENG) $ then Use_Diff=1 else Use_Diff=0 ; Boolean. If Not Keyword_Set(eps) And Not Keyword_Set(noprint) And (move gt 2) $ then Begin If Use_Diff $ then no_plots = StrCompress(Fix(n_dif*move),/Remove_All) $ else no_plots = StrCompress(Fix(n_loc*move),/Remove_All) Print, "* That will produce a total of ", no_plots, " plots!" If Ask("* Do you really want to print?", /ENG) $ then Begin noprint=0 & subm(6)=Mark+subm_6 & subm(7)=NoMark+subm_7 Endif $ else Begin noprint=1 & subm(7)=Mark+subm_7 & subm(6)=NoMark+subm_6 Endelse EndIf Do_Random_Shuffling: Random_Shuff, move, nave, locs, NoPrint=noprint, NoDelta=nodelta, $ NoLog=nolog, Use_Diff=Use_Diff, $ Error=err, EPS=eps Print, "* All sample parameters are written to the IDL journal file." Print, "* ==========================================================" Print, "" If Keyword_Set(batch) then Exit ; IDL sofort verlassen. ENDCASE ; Zum Haupt-Menue. ; ;=============================================================================== ; 11. (Reserviert fuer Animation!) Menue-Punkt 6 ;=============================================================================== ; 6: Begin Print, "* Nothing implemented !" ENDCASE ; ;=============================================================================== ; 12. Sub-Menue "Set/Reset von Keywords": Menue-Punkt 7 ;=============================================================================== ; 7: Begin Stay_in_SubMenu = 1 While(Stay_in_SubMenu) Do Begin Sub_Menu: CASE Wmenu(subm) OF ; Bedeutungen siehe Pkt.4. 0: Begin err = 0 subm(0) = Mark + subm_0 & subm(1) = NoMark + subm_1 End 1: Begin err = 1 subm(0) = NoMark + subm_0 & subm(1) = Mark + subm_1 End 2: t = Get_Number("* Enter factor for plotting stdev/error", 1., 10.0, t$) 3: If Data_Read then Get_PlotRange, /Xrange 4: If Data_Read then Get_PlotRange, /Yrange 5: Print, "* Nothing implemented !" 6: Begin noprint = 0 subm(6) = Mark + subm_6 & subm(7) = NoMark + subm_7 End 7: Begin noprint = 1 subm(6) = NoMark + subm_6 & subm(7) = Mark + subm_7 End 8: Print, "* Nothing implemented !" 9: Begin eps = 1 subm(9) = Mark + subm_9 & subm(10) = NoMark + subm_10 End 10: Begin eps = 0 subm(9) = NoMark + subm_9 & subm(10) = Mark + subm_10 End 11: Print, "* Nothing implemented !" 12: Begin If Keyword_Set(nodelta) $ then Begin nodelta = 0 & subm(12) = NoMark + subm_12 Endif $ else Begin nodelta = 1 & subm(12) = Mark + subm_12 Endelse End 13: Begin If Keyword_Set(line) $ then Begin line = 0 & subm(13) = NoMark + subm_13 Endif $ else Begin line = 1 & subm(13) = Mark + subm_13 Endelse End 14: Print, "* Nothing implemented !" 15: Print, "* Nothing implemented !" 16: Begin If Keyword_Set(test) $ then Begin test = 0 & subm(16) = NoMark + subm_16 Endif $ else Begin test = 1 & subm(16) = Mark + subm_16 Endelse End 17: Print, "* Nothing implemented !" 18: Stay_in_SubMenu = 0 ; Damit SubMenu verlassen wird. ENDCASE ; Ende von CASE Wmenu. EndWhile ENDCASE ; Ende vom Hauptmenue-Pkt.7. ; ;=============================================================================== ; 13. Abschluss des Haupt-Menues: ;=============================================================================== ; Num_Menu-2: Print, "* Nothing implemented !" Num_Menu-1: Begin Print, "" If Ask("* Do you really want to QUIT AVE_EEG?",/ENG) $ then Goto, Finis else Goto, Menu Finis: WDelete, Window1 ; Fenster loeschen. Print, "* Remember, real programmers can write C in any language !" Stop, "* A l l i s d o n e !!!" ; Return zum interakt. IDL. ENDCASE ENDCASE ; Ende von CASE Wmenu (siehe Pkt.4). ENDWHILE ; Ende der grossen Menue-Schleife, GOTO, Ende ; die unter Pkt.4 beginnt. ; ;=============================================================================== ; 14. Fehlerbehandlung und Schluss: ;=============================================================================== ; IO_Error: Print, !Err_String Goto, Menu ; Zurueck zum Haupt-Menue. Ende: END ;===============================================================================