Zum Inhaltsverzeichnis
Zurück zu Kapitel 8

A Gemeinsame Datenstruktur von SED und TRACKFIT

A.1 Die Variablen

In der Datenstruktur von SED und TRACKFIT sollen sowohl die Kombination von Kathodenhits und Anodenhits als auch die jeweilige Zugehörigkeit zu Segmenten und Tracks abgelegt werden. Normale Felder, die über die Hitnummer indiziert werden, sind nicht brauchbar, da bei fast jeder Zuordnung Mehrdeutigkeiten bestehen. Sinnvoller ist eine verkettete Liste. Da diese Datenstruktur aber in FORTRAN nicht existiert, mußte sie in normalen Feldern nachgebildet werden. Anstatt Adressen als Zeiger auf die nächste Struktur zu nehmen, werden hier die Feldindizes benutzt.
Zur Verdeutlichung der Datenstruktur siehe Abb. A.1. Dort sind links die Anoden, rechts die Kathoden und in der Mitte eine Kombination von beiden, hier HIT genannt, dargestellt. Ein Hit ist eindeutig bestimmt durch die Angabe des Anodenhits, des Kathodenhits und der Segmente, zu denen er gehört. Es würde also auch genügen, vier Felder zu benutzen, in denen diese Informationen abgespeichert werden. Allerdings wäre es dann sehr aufwendig, z.B. alle Hits zu suchen, die den Anodenhit 3 enthalten. Um dies zu erleichtern, werden die Felder MARK_DC1A (Anoden) und MARK_DC1C (Kathoden) benutzt. In der Abb A.1 sieht man, daß der Anodenhit 1 zu Hit 1 gehört, Anodenhit 2 zu Hit 2. Da eine Anode aber in mehreren Hits sein kann, reicht dies noch nicht aus. Zu jedem Hit wird noch abgespeichert, welcher andere Hit den gleichen Anodenhit enthält (MARK_ANO). Man erhält eine Kette von Hits, die beliebig erweiterbar ist. Beim letzten Hit in der Kette wird die Nummer des Anodenhits eingetragen, außerdem wird Bit 15 gesetzt, um ihn als letzten zu markieren. Das gleiche gilt entsprechend für die Kathoden, die entsprechenden Felder sind MARK_DC1C und MARK_CAT. Das Bit 14 von MARK_CAT wird von SELECT_HIT gesetzt, wenn eine Kathoden/Anoden-Kombination aufgelöst wird. So ist es später möglich, durch einfaches Löschen von Bit 14 wieder den alten Zustand zu erhalten.

Abb. A.1. Schematisches Diagramm zur Erklärung der MARK-Felder. Die linke Spalte entspricht MARK_DC1A bzw. MARK_DC2. Die rechte entspricht MARK_DC1C, und die mittlere den Feldern MARK_ANO, MARK_CAT und MARK_SEG. Für weitere Erklärungen s. Text. Ein gesetztes Bit 15 ist durch einen Stern gekennzeichnet.
Bei DC2 Hits gibt es nur Anodenhits, man braucht also nur MARK_DC2 und MARK_ANO. Da das Feld MARK_CAT aber für alle Hits existiert, kann es benutzt werden, um DC2/Hits als solche zu kennzeichnen. MARK_CAT wird für DC2 Hits auf $C000.  gesetzt.
Das letzte Feld ist das MARK_SEG. In ihm sind die Nummern des Anoden- und Kathodensegments Die Tracker ordnen zuerst die Anoden- und Kathodenhits einzeln in Segmente. Diese werden dann später zusammengefügt. enthalten. Das höherwertige Byte enthält die Nummer des Kathodensegments und das niederwertige die des Anodensegments. (MARK_SEG = 256*K_SEG + A_SEG). Die Segmentnummern können aus jeweils zwei verschiedenen Bänken kommen. Die Anodensegmente können aus der 3SEG oder der RSEG sein, die Kathodensegmente aus der 3SEG oder der TSEG. Um diese auseinander halten zu können, werden die Nummern der RSEG und TSEG um 64 erhöht, also das Bit 6 bzw. 14 wird gesetzt. In jeder Bank können maximal 63 Segmente enthalten sein. Die noch unbenutzten Bits 7 und 15 werden von der Routine SELECT_HIT benutzt, um Hits aus einem Segment zu entfernen, ohne die Information zu verlieren, zu welchem Segment der Hit gehörte.
Die Zugehörigkeit der Anoden- und Kathodensegmente zu den Turns ist in dem Feld SEG_OF_TURNS abgespeichert.
Bei der Ausführung der Routine fill_mark können verschiedene Fehler auftreten. Da aber nicht jeder Fehler dazu führt, daß das Event gar nicht bearbeitet werden kann, reicht es nicht, die Routine abzubrechen und eine Fehlernummer zurückzugeben. fill_mark versucht, soviel wie möglich einzulesen. Da dabei auch mehrere Fehler auftreten können, wird zur Fehlerrückgabe eine Variable (MARK_ERROR ) benutzt, in der jedes Bit einer Fehlerart entspricht.
Bit Fehlerart
0 Fehler beim Lesen der HSEG-Bank (READ_HSEG)
1 Fehler beim Lesen der CSEG-Bank (READ_CSEG): entweder existiert keine CSEG-Bank, oder sie enthält zu viele Segmente.
2 TSEG-Bank existiert nicht.
3 Fehler beim Lesen der 3SEG-Bank (READ_3SEG_AC)
4 Fehler beim Lesen der RSEG-Bank (READ_RSEG)
5 Die gewünschte Helix ist nicht vorhanden
6 Datenmodus Der Datenmodus gibt an, aus welchen Bänken die Hits und Segmente sind. Er entspricht etwa den Bits 6 und 14 in MARK_SEG. 0 in der CSEG-Bank.
7 verschiedene Datenmodi in der CSEG. Dies ist bei der heutigen CSEG unmöglich, könnte aber in einer späteren Version erlaubt sein.
8 Es ist nicht klar, ob die Kathodenhits aus der 3SEG oder der TSEG-Bank genommen werden müssen. Dies wird entweder manuell durch Wahl des Trackers (Aachen oder PSI ) oder automatisch aus der CSEG-Bank ermittelt.
9 Der Fehler ist so schwerwiegend, daß nicht eingelesen werden konnte. 

Im TRACKFIT (BATCH/Betrieb) wird bei jedem Fehler mit dem Fit des Events aufgehört; im SED wird nur bei gesetztem Bit 9 abgebrochen. Sonst wird bei jeder einzelnen Routine entschieden, ob sie bei den aufgetretenen Fehlern sinnvoll ist. Das Einzeichnen oder gar Fitten eines Tracks ist z.B. nicht möglich, wenn es keine CSEG gibt.
MARK_VALID zeigt an, ob die Daten in den MARK/Feldern gültig sind.
Zu einem Event können mehrere Helices bestehen. Diese können von verschiedenen Trackern sein. Mit der Variablen TRACKER wird angegeben, ob die erste Helix des Aachen/Trackers (TRACKER=1), die erste des PSI/Trackers (TRACKER=2) oder eine bestimmte Helix (TRACKER=3, HELIX_MARK= Nummer der Helix) verwendet werden soll.
Um den Umgang mit den MARK/Feldern zu vereinfachen, gibt es zwei Hilfsfunktionen.

A.2 ELECTRODE_OF_HIT

Beschreibung Diese INTEGER*2 Funktion gibt die Anoden-bzw. Kathodenhitnummer zurück. 
Aufruf E=ELECTRODE_OF_HIT( ELECTRODE , HIT )
Parameter HIT: Die Hitnummer
ELECTRODE: 1: Anode
2: Kathode
Ergebnis E: Nummer des Anoden- bzw. Kathodenhits. Ist die Kathode deselektiert (SELECT_HIT), so wird die Kathodennummer mit negativem Vorzeichen zurückgegeben.

A.3 HIT_OF_TURN

Beschreibung Diese LOGICAL Funktion gibt zurück, ob ein Hit zu einem Turn gehört oder nicht. 
Aufruf H = HIT_OF_TURN(HIT,TYPE,BOTH,TURN)
Parameter HIT: Die Hitnummer
TURN: Die Turnnummer
BOTH: TRUE: Kathoden- und Anodensegment müssen übereinstimmen.
FALSE: Nur eines der Segmente muß übereinstimmen, s. TYPE.
TYPE: Wenn BOTH=FALSE, dann gibt TYPE an, ob Anoden- oder Kathodensegment überprüft werden soll:
1: Anodensegment
2: Kathodensegment
Ergebnis H: TRUE wenn der Hit zum Turn gehört.
FALSE wenn der Hit nicht zum Turn gehört.

Weiter zum Anhang B
Zum Inhaltsverzeichnis