Questo esempio mostra come usare:
- strutture di dati
- allocazione dinamica della memoria
- liste "linkate" di strutture dati
- ricorsivita'
I files che compongono il programma sono disponibili dal file archivio
compresso tracks.tar.gz
(si ricorda che tale file puo' essere decompresso con il comando gunzip
tracks.tar.gz e quindi espanso con tar
xvf tracks.tar; oppure si possono eseguire le due operazioni
contemporaneamente con tar zxvf tracks.tar.gz).
L'espansione dell'archivio da' luogo ad una subdirectory Tracks/.
... Introduzione ...
L'esempio e' tratto da quanto succede in un esperimento di fisica delle particelle elementari.
Un acceleratore accelera due fasci di particelle (per esempio elettroni e positroni) in due direzioni opposte e li fa collidere. Quando un elettrone e un positrone interagiscono, possono semplicemente subire un urto elastico ed uscire in direzioni diverse, oppure possono "annichilarsi" e dare luogo ad una coppia di particelle diverse. Queste possono a loro volta decadere od interagire fra loro, producendo una cascata di particelle figlie. Pertanto, ad ogni interazione si puo' formare un numero variabile di particelle (da 2 a un centinaio). Per curiosita', cliccando qui si possono vedere diversi esempi di stati finali prodotti da interazioni (in gergo ``eventi'') elettrone-positrone.
Ogni particella carica, attraversando il rivelatore, urta gli atomi di materiale che esso contiene, creando coppie elettrone-ione. E' possibile misurare la posizione in cui tali coppie vengono create, e pertanto si puo' risalire al percorso di ciascuna particella. Solitamente il rivelatore e' immerso in un campo magnetico uniforme, cosicche' le particelle cariche seguono traiettorie elicoidali, in cui il raggio e il passo dell'elica dipendono dalla grandezza e dalla direzione della quantita' di moto.
Riassumendo:
Ogni interazione (in gergo: ``evento'')
puo' dare luogo ad un numero di particelle fortemente variabile. Ogni particella
carica viene osservata nel rivelatore come una ``traccia''
costituita da sequenza di punti di ionizzazione (``hits'',
in inglese ``urti'').
Descrizione del programma
Il programma costituisce un semplice esempio di analisi dati acquisiti in un esperimento di fisica delle particelle. Gli eventi vengono letti uno per uno da un file. Per ciascuno viene creata una banca dati adatta a contenere tutte le tracce dell'evento. A mano a mano che una traccia viene letta dal file, viene riservata memoria per immagazzinarvi tutte le informazioni. Finito di leggere tutto l'evento, viene eseguita una semplice analisi, il cui risultato viene scritto su un file di output, quindi la banca dati contenente tutto l'evento viene distrutta. Se esistono altri eventi tutta la procedura viene ripetuta, altrimenti il programma termina.
L'analisi eseguita su ogni evento consiste in:
Si fa uso di diverse strutture dati.
Ciascuna di queste e' dichiarata in un file con estensione .h,
insieme ai prototipi delle funzioni
definite su di essa; le implementazioni di tali
funzioni sono invece nel corrispondente file con estensione
.c.
Come utilizzare il programma
I files che compongono il programma sono disponibili dal file archivio compresso tracks.tar.gz (si ricorda che tale file puo' essere decompresso con il comando gunzip tracks.tar.gz e quindi espanso con tar xvf tracks.tar; oppure si possono eseguire le due operazioni contemporaneamente con tar zxvf tracks.tar.gz).
L'espansione dell'archivio da' luogo ad una subdirectory Tracks/
che contiene i seguenti files:
Makefile
README
analysis.c
analysis.h
event.c
event.h
event_io.c
event_io.h
generator.c
generator.h
point.c
point.h
randomizer.c
randomizer.h
track.c
track.h
Per creare gli eseguibili analysis
e generator basta usare il comando
make <nome-eseguibile>.Potete provare a questo punto a creare un file di dati di 10 eventi con il comando
./generator -n 10 -o run001.date ad analizzarlo con
./analysis run001.dat -o run001.procdControllate i files run001.dat e run001.procd: sono come vi aspettate?
Formato del file di dati
I dati da analizzare con il programma analysis possono essere creati con il programma generator, che li salva su disco in files formattati di tipo testo, con un formato del tipo:
Event <n>
Track <Px> <Py>
<Pz> <Ox> <Oy> <Oz> <charge> <Nhits> <chi2> <dE/dx>
Track <Px> <Py>
<Pz> <Ox> <Oy> <Oz> <charge> <Nhits> <chi2> <dE/dx>
:
:
:
:
:
Track <Px> <Py>
<Pz> <Ox> <Oy> <Oz> <charge> <Nhits> <chi2> <dE/dx>
EndOfEvt
Event <n>
Track <Px> <Py>
<Pz> <Ox> <Oy> <Oz> <charge> <Nhits> <chi2> <dE/dx>
:
:
:
:
:
Track <Px> <Py>
<Pz> <Ox> <Oy> <Oz> <charge> <Nhits> <chi2> <dE/dx>
EndOfEvt
Event <n>
Track <Px> <Py>
<Pz> <Ox> <Oy> <Oz> <charge> <Nhits> <chi2> <dE/dx>
:
:
:
:
:
EndOfEvt
Ogni evento inizia con l'intestazione Event
<n>, dove <n> e' il numero identificativo
dell'evento. Segue una lista di tutte le tracce osservate nell'evento.
Per ogni traccia c'e' una riga che inizia con Track,
poi sono indicate le componenti dell' impulso (<Px>, <Py>, <Pz>),
il punto di origine della traccia (<Ox>, <Oy>, <Oz>), la carica
elettrica <charge>, il numero di punti di ionizzazione <Nhits>, il
chi-quadro del fit della traccia attraverso tali punti (<chi2>) e infine
la perdita media di energia per ionizzazione per unita' di lunghezza <dE/dx>.
Ogni evento finisce con la riga EndOfEvt.