UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn

Pagina creata da Vanessa Rossini
 
CONTINUA A LEGGERE
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
UNIVERSITÀ DEGLI STUDI DI
             TRIESTE
    Dipartimento di Ingegneria e Architettura

 Laurea Triennale in Ingegneria Informatica ed
                  Elettronica

 Studio preliminare per l’ottimizzazione di
algoritmi per l’analisi di dati del Cherenkov
             Telescope Array

                  20 novembre 2019
           Laureando          Relatore
      Matteo Scorcia          Prof. Francesco Longo

                              Correlatore
                              Dott. Thomas Gasparetto

              Anno Accademico 2018/2019
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
Alla mia cara famiglia, ed ai miei cari amici.
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
Elenco delle figure

 1.1   Rendering di come sarà l’array di telescopi nel sito                   dell’emi-
       sfero Sud[1]. . . . . . . . . . . . . . . . . . . . . . .              . . . . . .             1
 1.2   Come CTA rileva la luce Cherenkov[1]. . . . . . . .                    . . . . . .             2
 1.3   Prototipo di fotomoltiplicatore al silicio[2]. . . . . .               . . . . . .             3
 1.4   Linea temporale dello sviluppo di CTA[3]. . . . . .                    . . . . . .             4

 2.1   Logo di ctapipe[4]. . . . . . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .    6
 2.2   Esempio di ”Issue” ancora aperto. . . . .      .   .   .   .   .   .   .   .   .   .   .   .    7
 2.3   GitHub Issues aperti[5]. . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .    8
 2.4   Pulse time issue[5]. . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .    9
 2.5   Struttura dei dati inerenti ad un evento.      .   .   .   .   .   .   .   .   .   .   .   .   11
 2.6   Evento dopo la calibrazione. . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   12

 3.1   Esempio di geometria di una camera LST. . . . . . . . . . . .                                  13
 3.2   Esempio di immagini estratte da ogni evento per ogni telescopio.                               15
 3.3   Esempio di informazioni MonteCarlo. . . . . . . . . . . . . . .                                15
 3.4   Esempio di immagine senza Background Noise. . . . . . . . .                                    16
 3.5   Esempio di immagine con Background Noise. . . . . . . . . .                                    17

 4.1   Workflow dell’algoritmo tailcuts_clean. . . . . . .                    . . . . . .             19
 4.2   Parametrizzazione ellittica. . . . . . . . . . . . . .                 . . . . . .             21
 4.3   Ricostruzione del punto di origine dello sciame date                   le imma-
       gini rilevate da 4 telescopi[6]. . . . . . . . . . . . .               . . . . . .             22

 5.1   Esempio di ellisse con asse maggiore che interseca il centro
       della camera. . . . . . . . . . . . . . . . . . . . . . . . . . . .                            24
 5.2   Workflow semplificato del processo per il calcolo del ”numbers
       of different pixels”. . . . . . . . . . . . . . . . . . . . . . . . .                          29
 5.3   Esempio di ellisse con asse maggiore che non interseca il centro
       della camera. . . . . . . . . . . . . . . . . . . . . . . . . . . .                            30
 5.4   Suddivisione finale dei dati. . . . . . . . . . . . . . . . . . . .                            33
 5.5   Caricamento dei dati di un evento memorizzato precedente-
       mente in un file ”.npz”. . . . . . . . . . . . . . . . . . . . . . .                           35

                                      i
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
ELENCO DELLE FIGURE

6.1   Immagine con rumore. . . . . . . . . . . . . .    . . . . . . .   .   .   37
6.2   Immagine pulita con parametri standard. . .       . . . . . . .   .   .   38
6.3   Immagine pulita con parametri ottimizzati. .      . . . . . . .   .   .   38
6.4   Sistema per la predizione dei parametri ottimi    di cleaning.    .   .   39
6.5   Training del sistema di predizione. . . . . . .   . . . . . . .   .   .   40

7.1   Output generato dagli script, divisione dei dati ottenuti prima
      per range energetico, poi per tipo di telescopio. . . . . . . . .         42

                                                                                ii
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
Indice

Introduzione                                                                                        v

1 Il Progetto Cherenkov Telescope Array (CTA)                                                        1
  1.1 Il concetto dietro CTA . . . . . . . . . . . . . . .              .   .   .   .   .   .   .    1
  1.2 Perché nasce il progetto CTA . . . . . . . . . . .                .   .   .   .   .   .   .    2
  1.3 Descrizione dei telescopi . . . . . . . . . . . . . .             .   .   .   .   .   .   .    3
       1.3.1 I diversi tipi di telescopi . . . . . . . . . .            .   .   .   .   .   .   .    3
  1.4 Stato dell’arte del progetto CTA . . . . . . . . .                .   .   .   .   .   .   .    4
  1.5 Simulazioni Monte Carlo . . . . . . . . . . . . . .               .   .   .   .   .   .   .    4
       1.5.1 Simtel file (Simulation telescope array file)              .   .   .   .   .   .   .    5

2 ctapipe                                                                                            6
  2.1 Principali tecnologie utilizzate in ctapipe   .   .   .   .   .   .   .   .   .   .   .   .    6
      2.1.1 GitHub . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .    6
      2.1.2 Python . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .    7
      2.1.3 Numpy, Astropy, matplotlib . . .        .   .   .   .   .   .   .   .   .   .   .   .    7
  2.2 Stato dell’arte di ctapipe . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .    8
      2.2.1 Il framework . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .    8
      2.2.2 Esempio di codice - Containers .        .   .   .   .   .   .   .   .   .   .   .   .    9

3 Imaging degli eventi con ctapipe                                     13
  3.1 Gestione degli eventi in ctapipe . . . . . . . . . . . . . . . . 14
      3.1.1 Immagini senza Background Noise . . . . . . . . . . . 15
      3.1.2 Immagini con Background Noise . . . . . . . . . . . . 16

4 Image Cleaning                                                                                    18
  4.1 Algoritmo per l’image cleaning - tailcuts clean . . .                 .   .   .   .   .   .   18
      4.1.1 Problema del fissare parametri del cleaning                     .   .   .   .   .   .   20
  4.2 Hillas Parametrization . . . . . . . . . . . . . . . .                .   .   .   .   .   .   20
  4.3 Perché serve l’image cleaning . . . . . . . . . . . .                 .   .   .   .   .   .   22

5 Ottimizzare parametri del cleaning                                    23
  5.1 Parametri di qualità per l’ottimizzazione . . . . . . . . . . . . 23
      5.1.1 Parametro di qualità: closest approach . . . . . . . . . 24

                                     iii
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
INDICE

         5.1.2   Parametro di qualità: likelihood function . . . . . . .         26
         5.1.3   Parametro di qualità: numbers of different pixels . . .         26
         5.1.4   Diverse scelte di parametri di cleaning per la stessa
                 immagine . . . . . . . . . . . . . . . . . . . . . . . . .      28
   5.2   Come implementare l’ottimizzazione dei parametri . . . . . .            31
   5.3   Dati finali . . . . . . . . . . . . . . . . . . . . . . . . . . . . .   33
         5.3.1 Esempio di visualizzazione dei dati memorizzati . . . .           34

6 Discussione dei risultati ottenuti                                         36
  6.1 Comparazione del cleaning tra parametri fissati e parametri
      ottimizzati . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
  6.2 Possibili utilizzi dei risultati trovati . . . . . . . . . . . . . . . 37
      6.2.1 Metodo di utilizzo - Machine Learning . . . . . . . . . 39
      6.2.2 Metodo di utilizzo - Benchmarking . . . . . . . . . . . 40

7 Conclusioni                                                                    41

                                                                                 iv
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
Introduzione

In questa tesi è riportata l’esperienza di tirocinio presso i laboratori dell’Isti-
tuto Nazionale di Fisica Nucleare (INFN) sezione di Trieste, Area di Ricerca.
Il lavoro svolto durante il tirocinio è stato mirato ad ottenere dei risultati
sull’ottimizzazione dei parametri di cleaning di un algoritmo (”tailcuts clea-
ning”) che serve appunto a pulire delle immagini da un rumore di fondo. Un
raggio gamma ad altissima energia, a contatto con l’atmosfera produce uno
sciame di particelle cariche che viene rilevato da una serie di telescopi che
catturerà l’immagine di cui si farà il cleaning del rumore. I parametri di
cleaning usati fin’ora, sono dei parametri fissi che vengono distinti solo dal
tipo di telescopio.
Questo è un metodo non ottimale dal momento che per ogni immagine, un
ricercatore deve provare in modo empirico a settare dei parametri che effet-
tivamente siano adeguati alla pulizia dell’immagine singola. Questa è stata
una delle motivazioni principali della ricerca svolta durante il tirocinio. Inol-
tre, trovando questi parametri si può creare un ”benchmarking” per vedere
come cambiano i parametri di cleaning ottimali in base ad informazioni come
l’energia dell’evento che ha generato lo sciame, così da poter trovare corre-
lazioni non ovvie ad una prima analisi tra i parametri di cleaning e l’evento
stesso.
Il ciclo di vita del software realizzato è un susseguirsi di proposte da par-
te dello studente, implementazioni, considerazioni sull’implementazione da
parte del relatore e correlatore, modifiche.
I primi capitoli sono introduttivi al progetto generale CTA ed al software
ctapipe, poi si inizia ad entrare sempre più nello specifico sulla tematica
dell’image cleaning e del suo stato dell’arte.
Infine gli ultimi capitolo descrivono le soluzioni trovate assieme ad una descri-
zione in linguaggio naturale delle procedure ottenute (con qualche accenno
a pseudocodice e codice vero e proprio) per implementare tali soluzioni.

                                        v
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
Capitolo 1

Il Progetto Cherenkov
Telescope Array (CTA)

L’osservatorio CTA, è composto da due array di telescopi. Il primo posto nel-
l’emisfero Nord (La Palma, isola della Spagna), il secondo posto nell’emisfero
Sud (Atacama, Deserto del Chile, in Figura 1.1).

Figura 1.1: Rendering di come sarà l’array di telescopi nel sito dell’emisfero
Sud[1].

1.1    Il concetto dietro CTA
Radiazione elettromagnetica ad altissima energia (Very High-Energy, detta
anche VHE) raggiunge la terra, portando con sé informazioni sui fenomeni
più energetici dell’Universo[8].
Questa Radiazione viene rivelata grazie agli ”Imaging Air Cherenkov Te-
lescopes” (IACTs), cioè dei telescopi che utilizzano le radiazioni Cheren-
kov generate dallo sciame di particelle cariche causato dai raggi gamma ad
alta energia (VHE) che interagiscono con l’atmosfera terrestre[9]. Esempi
di IACTs attualmente operativi sono: H.E.S.S. (High Energy Stereoscopic
System)[10], VERITAS (Very Energetic Radiation Imaging Telescope Array
System)[11], MAGIC (Major Atmospheric Gamma Imaging Cherenkov)[12].

                                      1
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
CAPITOLO 1. IL PROGETTO CHERENKOV TELESCOPE ARRAY
                          (CTA)

             Figura 1.2: Come CTA rileva la luce Cherenkov[1].

Il progetto CTA, propone di utilizzare questo stesso sistema di ricezione
dei raggi gamma, facendo un imaging stereoscopico simultaneo di ciascuno
sciame di particelle con più telescopi, per poi ricostruire le proprietà del rag-
gio gamma originario che ha interagito con l’atmosfera a partire da queste
immagini (vedi Figura 1.2)[8].

1.2     Perché nasce il progetto CTA
Gli attuali IACTs esistenti, lavorano con sensibilità e risoluzione angolare e
range energetico minori di quanto riuscirà a raggiungere CTA. Con esso, si
vuole riuscire a rilevare raggi gamma che vanno dai 20 GeV fino ai 300 TeV.
    Le migliorie rispetto ai telescopi esistenti sono le seguenti [8] :

   • Sensitività

   • Risoluzione angolare

   • Risoluzione temporale

   • Area di raccolta dei raggi gamma

   • Range energetico di rilevazione dei raggi gamma

                                                                               2
UNIVERSITÀ DEGLI STUDI DI TRIESTE - Infn
CAPITOLO 1. IL PROGETTO CHERENKOV TELESCOPE ARRAY
                          (CTA)

           Figura 1.3: Prototipo di fotomoltiplicatore al silicio[2].

   Il progetto CTA, infatti, ha lo scopo di perseguire ricerche scientifiche
quali [8] :

   • Rilevare galassie attive con un flusso di raggi gamma che attualmente
     non è possibile osservare

   • Studio dei buchi neri al loro centro

   • Studio della storia della formazione stellare dell’Universo

   • Studio sulla natura della materia oscura

   • Studio delle sorgenti dei raggi gamma nel piano galattico

   • Studio sulla violazione della prorietà d’invarianza di Lorentz

1.3     Descrizione dei telescopi
Le camere montate sui telescopi devono poter captare la luce blu genera-
ta dall’effetto Cherenkov con un durata minore di qualche miliardesimo di
secondo. Proprio per la natura effimera di questo evento, i telescopi sono do-
tati di specchi ad alta riflettività che convogliano la luce direttamente nelle
camere che avranno una risposta estremamente veloce per catturare l’effetto.
La luce catturata dalle camere (tramite dei fotomoltiplicatori e/o fotomol-
tiplicatori al silicio) (vedi Figura 1.3), viene poi digitalizzata e trasmessa al
sistema di acquisizione dati[2].

1.3.1    I diversi tipi di telescopi
Per coprire i requisiti dello spettro di energia rilevabile prefissati da CTA,
sono necessari tre classi di telescopi:

                                                                               3
CAPITOLO 1. IL PROGETTO CHERENKOV TELESCOPE ARRAY
                          (CTA)

           Figura 1.4: Linea temporale dello sviluppo di CTA[3].

   • LST (Large Sized Telescope).
     Sono i telescopi con gli specchi più grandi e rilevano energie tra i 20 ed
     i 150 GeV, molto veloci a riposizionarsi[13].

   • MST (Medium Sized Telescope).
     Sono i telescopi che rilevano energie tra i 5 ed i 150 TeV, servono
     soprattutto a fare profonde analisi del cielo in cerca di sorgenti di raggi
     gamma[14].

   • SST (Small Sized Telescope).
     Sono i telescopi con gli specchi più piccoli ma anche quelli più nume-
     rosi, servono soprattutto alla rilevazione di alte energie grazie alla loro
     altissima sensitività (range energetico fino a 300 TeV)[15].

1.4    Stato dell’arte del progetto CTA
Al momento, sono stati costruiti prototipi dei tre tipi di telescopi: SST, MST
ed LST. Il progetto CTA è ancora nella fase di pre-costruzione, ma come si
vede in Figura 1.4, si sta avviando la pre-produzione.

1.5    Simulazioni Monte Carlo
Essendo i telescopi ancora in fase di costruzione, le informazioni sui raggi
gamma che dovrebbero essere captate da quest ultimi, vengono ad essere
simulate così da avere comunque dei dati su cui lavorare per lo sviluppo
del software ctapipe, e per la ricerca sulle migliori prestazioni ottenibili da

                                                                              4
CAPITOLO 1. IL PROGETTO CHERENKOV TELESCOPE ARRAY
                          (CTA)

diverse strategie di puntamento dei telescopi. Questi dati, sono delle simu-
lazioni che riproducono l’impatto dei raggi gamma nell’atmosfera terrestre
e il conseguente sciame di particelle. Per il progetto CTA, è stato scelto il
generatore di sciami denominato CORSIKA. Esso, codice open source usato
ampiamente da tutti Gli IACTs arrays, rappresenta lo standard nella comu-
nità della fisica delle astroparticelle. Il flusso di fotoni Cherenkov simulato da
CORSIKA viene raccolto per ogni posizione e tipologia dei telescopi predefi-
nita. La simulazione di questi eventi, richiede un’enorme quantità di spazio
su disco ed un’enorme quantità di tempo di CPU (in una giornata si comple-
ta una simulazione dell’ordine di qualche TeraByte). Per questo motivo si
è deciso di utilizzare 14 centri distribuiti per la computazione e memorizza-
zione delle simulazioni. La simulazione di solito, viene direttamente passata
ad un simulatore di array di telescopi (creando così dei file di tipo .simtel),
reiterando il processo variando dettagli implementativi dei telescopi oppure
variando il background dato dal cielo notturno, così da poter vedere anche
quale configurazione produce risultati migliori rispetto alla stessa rilevazio-
ne di uno sciame. Tutte le simulazioni finite poi, sono memorizzate e rese
accessibili da remoto ai membri del progetto CTA[16].

1.5.1    Simtel file (Simulation telescope array file)
Per memorizzare queste informazioni, si è creato un formato proprietario di
CTA chiamato .simtel che, rappresenta un numero molto alto di ”eventi”
(sciami e relativi effetti Cherenkov, generati da una particella, che hanno
innescato la rilevazione da parte di uno o più telescopi.) nello stesso file.
Questi file .simtel vengono poi letti grazie ad un implementazione in Python3
del formato dati EventIO, denominato ”pyeventio”[17].
Nei capitoli successivi si descriverà come vengono utilizzati questi simtel file,
come funziona e com’è strutturato il software ctapipe.

                                                                                5
Capitolo 2

ctapipe

ctapipe è un framework per l’elaborazione dei dati di CTA. Correntemen-
te alla versione 0.7.0, viene sviluppato e modificato molto frequentemente
per esplorare varie possibilità di utilizzo di tecnologie diverse e di diverse
implementazioni delle classi che compongono la parte di API.

                       Figura 2.1: Logo di ctapipe[4].

2.1     Principali tecnologie utilizzate in ctapipe
2.1.1   GitHub
Questa continua evoluzione, è possibile grazie alla piattaforma online per il
controllo di versione del software ”GitHub”, la quale permette di lavorare
da remoto al codice di ctapipe, modificandolo e richiedendo in un secondo
momento l’effettiva applicazione delle modifiche dopo una revisione di un
gruppo di utenti selezionato. GitHub permette inoltre, di lavorare anche
su ”branch” diversi così da poter avere modifiche parallele che non vanno
in conflitto tra di loro. Ultimo ma non meno importante, è la possibilità
di pubblicare ”Issues” (vedi Figura 2.2), dei report su un problema dove
gli utenti che lavorano al progetto possono discutere e trovare soluzioni al
problema stesso.

                                      6
CAPITOLO 2. CTAPIPE

               Figura 2.2: Esempio di ”Issue” ancora aperto.

2.1.2   Python
Tutto il framework ctapipe è scritto in Python3 (con compatibilità del co-
dice dalla versione Python 3.6 in poi). La ragione principale è la vasta
documentazione del linguaggio, la grandissima comunità che lavora ai pro-
blemi ogni giorno, la popolarità riscontrata nella comunità dei fisici, ma
soprattutto alla grande intellegibilità del codice da parte di esterni.

2.1.3   Numpy, Astropy, matplotlib
Funzionalità principali di Numpy usate [18] :

   • Supporto a strutture dati come matrici e array multidimensionali

   • Vasta gamma di funzioni matematiche per queste strutture dati

   Funzionalità principali di Astropy usate [19] :

   • Conversione di unità e quantità fisiche

   • Definizione di costanti astronomiche

   • Definizione di coordinate celesti

   Funzionalità principali di Matplotlib usate [20] :

   • Plotting di istogrammi, immagini, figure geometriche

                                                                        7
CAPITOLO 2. CTAPIPE

                     Figura 2.3: GitHub Issues aperti[5].

2.2     Stato dell’arte di ctapipe
Il framework ctapipe, anche se funzionante (ma non efficiente) in quasi la
sua totalità, è ancora pieno di ”Issues” che devono essere risolti come si può
vedere in Figura 2.3
     I tipi di ”Issues” possono essere i più disparati, da problemi legati alla
strumentazione a problemi di design del software, da problemi di ottimiz-
zazione a semplici domande su come utilizzare al meglio delle funzioni già
implementate.
     Per esempio, in Figura 2.4 si può vedere come ci si è accorti, lavorando
ad un altra parte di ctapipe, che una scala dei tempi che dovrebbe essere in
nanosecondi, viene invece ad essere implementata in un’unità di misura che
non è stata moltiplicata per la frequenza di clock dei telescopi.
Questo ha portato ad avere una scala che, per gli LST che lavorano ad alte
frequenze (GHz), sembra essere in nanosecondi, ma per gli SST che lavorano
anche con frequenze di 250MHz, questa scala è erronea[21].

2.2.1    Il framework
ctapipe è appunto un framework, e come tale si propone di essere la strut-
tura intermedia che aiuta il fisico o sviluppatore che deve utilizzare i dati
raccolti dalle camere (eventi codificati in simtel files che saranno creati o da
simulazioni o dai telescopi reali una volta avviata la produzione) mettendo a

                                                                              8
CAPITOLO 2. CTAPIPE

                       Figura 2.4: Pulse time issue[5].

disposizione di questi ultimi, degli strumenti di analisi degli eventi, display
delle immagini di un evento, pulizia dell’immagine o ”image cleaning” da
qualsiasi rumore di fondo (per esempio il bagliore residuo generato dal cielo
notturno), di acquisizione corretta dei dati del simtel file, la ricostruzione
stereoscopica dell’evento dalle immagini dei telescopi.

2.2.2     Esempio di codice - Containers
Una parte molto importante di ctapipe sono i ”containers”, cioè le struttu-
re dati create appunto per contenere dati eterogenei. Il codice seguente è
l’implementazione di un container di ”HillasParameters”.
class HillasParametersContainer(Container):
    container_prefix = ’hillas’

    intensity = Field(nan, ’total intensity (size)’)

    x =   Field(nan, ’centroid x coordinate’)
    y =   Field(nan, ’centroid x coordinate’)
    r =   Field(nan, ’radial coordinate of centroid’)
    phi   = Field(nan, ’polar coordinate of centroid’, unit=u.deg)

    length = Field(nan, ’RMS spread along the major-axis’)
    width = Field(nan, ’RMS spread along the minor-axis’)
    psi = Field(nan, ’rotation angle of ellipse’, unit=u.deg)

    skewness = Field(nan, ’measure of the asymmetry’)
    kurtosis = Field(nan, ’measure of the tailedness’)

   La struttura è molto semplice, c’è un prefisso per identificare il container
ed una serie di oggetti di tipo Field.

                                                                             9
CAPITOLO 2. CTAPIPE

Il codice seguente è l’implementazione della classe Field in ctapipe.
class Field:
    """
    Class for storing data in ‘Containers‘.

    Parameters
    ----------
    default:
        default value of the item (this will be set when the
            ‘Container‘
        is constructed, as well as when ‘Container.reset()‘ is called
    description: str
        Help text associated with the item
    unit: ‘astropy.units.Quantity‘
        unit to convert to when writing output, or None for no
            conversion
    ucd: str
        universal content descriptor (see Virtual Observatory
            standards)
    """

    def __init__(self, default, description="", unit=None,
        ucd=None):
        self.default = default
        self.description = description
        self.unit = unit
        self.ucd = ucd

    def __repr__(self):
        desc = f’{self.description}’
        if self.unit is not None:
            desc += f’ [{self.unit}]’
        return desc

Come si può notare, il metodo ”__init__” che viene richiamato nel Contai-
ner per istanziare un campo prende semplicemente come parametri obbliga-
tori un oggetto di default che verrà inizializzato al momento della creazione
del container e una descrizione del campo.
I tipi di Containers sono molti, ma fondamentalmente hanno tutti la stes-
sa struttura. Questa struttura semplice e lineare è alla base di tutte le
informazioni che è possibile raccogliere da un evento di un simtel file.
class DataContainer(Container):
    """ Top-level container for all event information """

    event_type = Field(’data’, "Event type")
    r0 = Field(R0Container(), "Raw Data")
    r1 = Field(R1Container(), "R1 Calibrated Data")

                                                                          10
CAPITOLO 2. CTAPIPE

            Figura 2.5: Struttura dei dati inerenti ad un evento.

    dl0 = Field(DL0Container(), "DL0 Data Volume Reduced Data")
    dl1 = Field(DL1Container(), "DL1 Calibrated image")
    dl2 = Field(ReconstructedContainer(), "Reconstructed Shower
        Information")
    mc = Field(MCEventContainer(), "Monte-Carlo data")
    mcheader = Field(MCHeaderContainer(), "Monte-Carlo run header
        data")
    trig = Field(CentralTriggerContainer(), "central trigger
        information")
    count = Field(0, "number of events processed")
    inst = Field(InstrumentContainer(), "instrumental information
        (deprecated")
    pointing = Field(Map(TelescopePointingContainer),
                   ’Telescope pointing positions’)

    Questo codice rappresenta il container che viene creato quando si carica
in memoria un evento da un simtel file. L’unica cosa che cambia a livello
concettuale rispetto al container prima mostrato, è la funzione ”Map()” pre-
sente nel campo ”pointing”. Questa funzione semplicemente serve per creare
un dizionario di sub-containers (in questo caso il sub-container è ”Telesco-
pePointingContainer”) così da poter avere dei campi in un container che
puntano ad un set di sub-containers. Gli altri campi hanno la sola parti-
colarità di essere dei container a loro volta, e questo permette di avere dei
dati che hanno una struttura autoesplicativa. Questo significa che si può
”navigare tra i dati” guardando cosa sono i dati stessi (Figura 2.5):
    Allo stato attuale, quando un ”DataContainer” viene creato, gli unici dati
presenti sono quelli nei Fields ”r0” ed ”r1”.

                                                                           11
CAPITOLO 2. CTAPIPE

                  Figura 2.6: Evento dopo la calibrazione.

Il metodo ”CameraCalibrator()” si occupa di simulare tutta la catena di pro-
cessi per la calibrazione della camera che servono per ricavare i Fields ”dl0”
(una riduzione del volume dei dati rispetto ”r1”) e ”dl1” (una calibrazione
dei dati presenti in ”dl0”). Questo processo, verrà effettuato dali telescopi
quando saranno operativi e quindi il metodo ”CameraCalibrator()” risulterà
deprecato. Il Field ”dl2” serve per memorizzare i dati riguardanti ricostru-
zioni spaziali ed energetiche dello sciame di particelle rispetto alle diverse
informazioni dei diversi telescopi che hanno rilevato l’evento (Figura 2.6).

                                                                           12
Capitolo 3

Imaging degli eventi con
ctapipe

Quando un telescopio rileva un evento, cioè ne cattura lo sciame di particelle
tramite la camera, quello che arriva a ctapipe in input è un file .simtel
che verrà poi gestito da opportune librerie per estrarre i dati in maniera ef-
ficiente e collocarli in un container di tipo ”DataContainer” per ogni evento.
L’immagine che il telescopio rileva viene rappresentata in ctapipe tramite
un oggetto ”numpy.ndarray” che rappresenta per ogni posizione di un pixel
la quantità di carica rilevata dalla camera del telescopio.
La geometria della camera del telescopio (che può essere esagonale oppure
rettangolare) è rappresentata da un oggetto di tipo ”CameraGeometry” (ve-
di Figura 3.1). Questo oggetto contiene informazioni sulla forma dei pixel
(esagonali o rettangolari), la posizione dei pixel sulla camera e la matrice dei
pixel adiacenti denominata ”neighbour_matrix” (Figura 3.1).

           Figura 3.1: Esempio di geometria di una camera LST.

                                      13
CAPITOLO 3. IMAGING DEGLI EVENTI CON CTAPIPE

3.1    Gestione degli eventi in ctapipe
Gli eventi in ctapipe vengono caricati da un file .simtel nell’oggetto ”events”
che contiene un numero non definito a priori di oggetti di tipo ”DataCon-
tainer” non calibrati che rappresentano ognuno un evento diverso. Questa
procedura è ottenuta dal seguente codice:
input_url = find_in_path(’file simtel compresso (xxxx.simtel.gz)’,
                       ’path assoluto del simtel file’)
events = event_source(input_url)

   Una generale procedura utilizzata per entrare volta per volta, in ogni
evento di un simtel file, e calibrare evento per evento, è la seguente:
input_url =
    find_in_path(’gamma_20deg_0deg_run101___cta-prod3-lapalma3-2147m-LaPalma.simtel.gz’,
                       ’/home/matteo/ctasoft/resources’)
events = event_source(input_url, max_events=1)
calibrator = CameraCalibrator()

for event in events:
   calibrator(event)

   A questo punto nel ciclo for si può estrarre tutta l’informazione che si
vuole dall’evento corrente, per esempio si può estrarre l’immagine dello scia-
me vista dal telescopio selezionato per ogni telescopio triggerato da un evento
(Figura 3.2):
from ctapipe.io import event_source
from ctapipe.calib import CameraCalibrator
from ctapipe.utils.datasets import find_in_path

input_url =
    find_in_path(’gamma_20deg_0deg_run101___cta-prod3-lapalma3-2147m-LaPalma.simtel.gz’,
                       ’/home/matteo/ctasoft/resources’)
events = event_source(input_url, max_events=1)
calibrator = CameraCalibrator()

for event in events:
   calibrator(event)

        for telescope_id, dl1 in event.dl1.tel.items():
         image = dl1.image
         print(’telescope_id:’, telescope_id, ’image type:’,
             type(image), ’array: ’, image)

                                                                            14
CAPITOLO 3. IMAGING DEGLI EVENTI CON CTAPIPE

Figura 3.2: Esempio di immagini estratte da ogni evento per ogni telescopio.

             Figura 3.3: Esempio di informazioni MonteCarlo.

3.1.1    Immagini senza Background Noise
Essendo i simtel file ancora delle simulazioni attuate da CORSIKA, possiamo
conoscere a priori anche delle informazioni che negli eventi reali non sarebbe
possible avere; queste informazioni sono contenute nel campo ”mc” di un
”Datacontainer”.
Nell’evento rilevato dal telescopio, sarà presente un rumore di fondo, che
può essere dovuto a raggi cosmici, muoni, oppure dal ”Night Sky Backround”
(NSB) che può causare la rilevazione casuale di immagini. Solitamente questo
rumore di fondo ha una distribuzione uniforme nel campo visivo utile del
telescopio[22].
Il campo ”mc” (Monte Carlo) ha informazioni riguardanti l’evento che si
rileverebbe senza nessun rumore di fondo (Figura 3.3). Queste informazioni
sono pertanto relative al raggio gamma che genera lo sciame di particelle.
Tra questi dati, c’è anche l’immagine che vedrebbe il telescopio se non ci fosse
nient’altro che lo sciame di particelle generato dal raggio gamma (Figura 3.4):
telescope_id = 2
camera = event.inst.subarray.tels[telescope_id].camera

                                                                             15
CAPITOLO 3. IMAGING DEGLI EVENTI CON CTAPIPE

        Figura 3.4: Esempio di immagine senza Background Noise.

fig, axs = plt.subplots(1, 1, figsize=(10, 6))
d1 = CameraDisplay(camera, ax=axs)

axs.set_title(’Ground_Truth ’ + camera.cam_id)
d1.image = event.mc.tel[telescope_id].photo_electron_image
d1.add_colorbar()
plt.show()
plt.close(fig)

    Questa informazione è molto utile soprattutto per avere un riferimento
di cosa dovrà dare in output un algoritmo di cleaning dell’immagine di uno
sciame affetta da rumore di fondo.

3.1.2   Immagini con Background Noise
L’immagine dopo la calibrazione della camera, cioè l’immagine che si ot-
terrà da un telescopio dopo la rilevazione dell’evento, è allocata nel campo
”dl1” del ”DataContainer”. Come già detto, questo campo attualmente viene
riempito dal metodo CameraCalibrator(), che ha lo scopo di simulare tutta
la catena di processi per arrivare dal campo ”r1” al campo ”dl1”. Nel Field
”dl1”, sarà presente un oggetto di tipo numpy.ndarray denominato ”image”,
che rappresenta proprio l’immagine calibrata; dove ogni posizione dell’ar-
ray rappresenta univocamente un pixel della camera e il valore dell’elemento
dell’array rappresenta il numero di conteggi di fotoni (Figura 3.5):
telescope_id = 2
camera = event.inst.subarray.tels[telescope_id].camera

                                                                         16
CAPITOLO 3. IMAGING DEGLI EVENTI CON CTAPIPE

        Figura 3.5: Esempio di immagine con Background Noise.

fig, axs = plt.subplots(1, 1, figsize=(10, 6))
d1 = CameraDisplay(camera, ax=axs)

axs.set_title(’Camera: ’ + camera.cam_id)
d1.image = event.dl1.tel[telescope_id].image
d1.add_colorbar()
plt.show()
plt.close(fig)

                                                                17
Capitolo 4

Image Cleaning

Quando l’immagine di un evento viene catturata dalla camera di un telesco-
pio, si catturerà inevitabilmente anche del rumore di fondo come spiegato nel
precedente capitolo. Per ovviare a questo problema, sono stati pensati diver-
si algoritmi che hanno l’obiettivo di eliminare il rumore di fondo lasciando
intatto lo sciame generato dall’evento.

4.1    Algoritmo per l’image cleaning - tailcuts clean
L’algoritmo più basilare ma anche quello che sta alla base di tutti gli altri
algoritmi di cleaning è denominato ”tailcuts_clean”:
def tailcuts_clean(geom, image, picture_thresh=7,
    boundary_thresh=5, keep_isolated_pixels=False,
    min_number_picture_neighbors=0):

    pixels_above_picture = image >= picture_thresh

    if keep_isolated_pixels or min_number_picture_neighbors == 0:
        pixels_in_picture = pixels_above_picture
    else:
        number_of_neighbors_above_picture =
            geom.neighbor_matrix_sparse.dot(
            pixels_above_picture.view(np.byte)
        )
        pixels_in_picture = pixels_above_picture & (
            number_of_neighbors_above_picture >=
                min_number_picture_neighbors
        )

    pixels_above_boundary = image >= boundary_thresh

                                     18
CAPITOLO 4. IMAGE CLEANING

        Figura 4.1: Workflow dell’algoritmo tailcuts_clean.

pixels_with_picture_neighbors =
    geom.neighbor_matrix_sparse.dot(pixels_in_picture)
if keep_isolated_pixels:
    return (
        pixels_above_boundary & pixels_with_picture_neighbors
    ) | pixels_in_picture
else:
    pixels_with_boundary_neighbors =
        geom.neighbor_matrix_sparse.dot(
        pixels_above_boundary
    )
    return (pixels_above_boundary &
        pixels_with_picture_neighbors) | (
        pixels_in_picture & pixels_with_boundary_neighbors
    )

Parametri di input (Workflow in Figura 4.1):

• geom: oggetto ”CameraGeometry”, definisce la geometria della camera.
• image: oggetto ”numpy.ndarray”, è l’immagine che va ripulita dal ru-
  more.
• picture_threshold: float, i pixel che hanno valori più piccoli di questa
  soglia vengono scartati (settati a 0).
• boundary thresh: float, i pixel adiacenti ad un pixel che ha superato
  la ”picture_threshold” e che hanno valore più alto di questa soglia
  vengono conservati, gli altri vengono scartati.
• keep_isolated_pixels: boolean, se questo valore è ”True” tutti i pi-
  xels che hanno superato la ”picture_threshold” vengono conservati, se
  questo valore è ”False” allora i pixels vengono conservati solo se i pi-
  xels sopravvissuti alla ”picture_threshold” hanno dei pixel adiacenti
  sopravvissuti alla ”boundary_thresh”.

                                                                       19
CAPITOLO 4. IMAGE CLEANING

   • min_number_picture_neighbors: non ha nessun effetto se ”keep_isolated_pixels”
     ha il valore ”True”. Serve per definire il numero minimo di pixels
     adiacenti che deve avere un pixel per sopravvivere al cleaning.

4.1.1    Problema del fissare parametri del cleaning
Come abbiamo già visto, ci sono dei parametri nell’algoritmo ”tailcuts clean”
che vanno fissati: il modo in cui decidere quali valori dare a questi parametri,
è stato deciso da terzi in modo arbitrario facendo una stima di quali sono i
parametri che andrebbero bene per qualche evento, distinguendo anche per
tipo di telescopio. Ovviamente questo è un primo approccio, ed i parametri
scelti sono stati fissati in questo modo solo per dare una referenza di quale
valore questi parametri potrebbero avere per qualche evento registrato.
    Di seguito un esempio di come sono stati scelti i parametri ”picture_threshold”,
”boundary_thresh”, ”min_number_picture_neighbors”:
...
# unoptimized cleaning levels, copied from
# https://github.com/tudo-astroparticlephysics/cta_preprocessing
cleaning_level = {
    ’LSTCam’: (3.5, 7.5, 2), # ?? (3, 6) for Abelardo...
    ’FlashCam’: (4, 8, 2), # there is some scaling missing?
    ’ASTRICam’: (5, 7, 2),
}
...

    In questo snapshot di codice si è creato un dizionario dove ogni elemen-
to ha la seguente sintassi: ” : (,
, )”. La scelta dei pa-
rametri non è dettata da nessun procedimento logico ma soltanto da osser-
vazioni empiriche da parte di altri ricercatori.
Per questo motivo, uno dei principali obbiettivi del tirocinio è stato pro-
prio quello di trovare un modo per ottenere dei parametri che abbiano una
relazione logica con l’immagine da pulire dal rumore.

4.2     Hillas Parametrization
Il seguente codice è l’implementazione in ctapipe di un algoritmo per estrar-
re da un’immagine ripulita dal rumore di fondo i ”parametri di Hillas”. Questi
parametri non sono altro che una modo per rappresentare matematicamente
lo sciame di particelle gamma che ha sempre una forma ovale e può quin-
di essere descritto da un’ellisse. L’algoritmo come parametri formali ha un
oggetto di tipo ”numpy.ndarray” che rappresenta un’immagine a cui è stato
applicato un algoritmo di cleaning (”image”), e un oggetto di tipo ”Came-

                                                                            20
CAPITOLO 4. IMAGE CLEANING

                    Figura 4.2: Parametrizzazione ellittica.

raGeometry” che definisce la geometria della camera del telescopio che ha
rilevato l’immagine di cui si è fatto il cleaning (”geom”).
def hillas_parameters(geom, image):

   .
   .
   .

    return HillasParametersContainer(
        x=u.Quantity(cog_x, unit),
        y=u.Quantity(cog_y, unit),
        r=u.Quantity(cog_r, unit),
        phi=Angle(cog_phi, unit=u.rad),
        intensity=size,
        length=u.Quantity(length, unit),
        width=u.Quantity(width, unit),
        psi=Angle(psi, unit=u.rad),
        skewness=skewness_long,
        kurtosis=kurtosis_long,
    )

    Di seguito il codice per fare visualizzarre l’ellisse parametrizzata dai valori
ottenuti dal metodo ”hillas_parameters” (Figura 4.2):

                                                                                21
CAPITOLO 4. IMAGE CLEANING

Figura 4.3: Ricostruzione del punto di origine dello sciame date le immagini
rilevate da 4 telescopi[6].

hillas_containers = {}
hillas_c = hillas_parameters(camera[clean], d1.image[clean])
hillas_containers[telescope_id] = hillas_c

fig, axs = plt.subplots(1, 1, figsize=(10, 6))
d3 = CameraDisplay(camera, ax=axs)

axs.set_title(’Hillas parameters display: ’)
d3.image = cleaned_image
d3.add_colorbar()
d3.overlay_moments(hillas_containers[telescope_id], color="red",
    with_label=False, lw=2, keep_old=True)
plt.show()
plt.close(fig)

4.3    Perché serve l’image cleaning
Ci sono diversi motivi per cui l’image cleaning è un processo necessario,
primo tra tutti, la ricostruzione stereoscopica dello sciame di particelle che
avviene tramite i ”parametri di Hillas”, e per ricavare questa ricostruzione
servono le varie immagini catturate dai vari telescopi che hanno rilevato
l’evento (Esempio in Figura 4.3). Ci sono poi altre ricostruzioni di diversa
natura, come la ricostruzione energetica di un evento che richiede comunque
una descrizione dello sciame di particelle non affetto da rumore.

                                                                           22
Capitolo 5

Ottimizzare parametri del
cleaning

In questo capitolo si analizzeranno tutti i parametri utilizzati (creati duran-
te il tirocino) negli script realizzati durante il tirocinio per determinare la
qualità dell’algoritmo ”tailcuts clean” su un’immagine, fissati i parametri di
cleaning.

5.1    Parametri di qualità per l’ottimizzazione
Il cleaning è il processo effettuato subito prima del ”Hillas parametrization”
(approssimazione dello sciame con un’ellisse), quindi è ragionevole pensa-
re che se la parametrizzazione dell’ellisse è un algoritmo completo che non
subirà ulteriori modifiche (ed è questo il caso), allora si può utilizzare pro-
prio l’ellisse che approssima lo sciame pulito dal rumore. Usando l’ellisse
di un’immagine però, stiamo assumendo che la dipendenza della qualità di
un cleaning dalla sua approssimazione ellittica non sia un problema per il
semplice fatto che l’algoritmo per l’approssimazione ellittica non cambierà.
Un altro dato molto importante che è ragionevole usare per determinare la
qualità di un cleaning, è sicuramente l’immagine che vedrebbe il telescopio se
non ci fosse nient’altro che lo sciame di particelle generato dal raggio gamma
(immagine che d’ora in avanti verra identificata come ”ground_truth”).
Ultima informazione importante per i parametri di qualità è che gli eventi
estratti dai file simtel simulati con CORSIKA, hanno tutti la particolarità
di essere centrati rispetto ai telescopi; ogni sciame dovrà avere l’ellisse che
lo approssima con l’asse maggiore che interseca esattamente il centro della
camera (Figura 5.1).
Questo significa che più l’ellisse che approssima lo sciame dopo il clea-
ning ha un’asse maggiore distante dal centro (questa distanza viene spesso
denominata ”closest approach”).

                                      23
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

Figura 5.1: Esempio di ellisse con asse maggiore che interseca il centro della
camera.

5.1.1   Parametro di qualità: closest approach
La distanza definita come ”closest approach” è il parametro principale che
indica la qualità dalla parametrizzazione ellittica di un’immagine di un’even-
to estratto da un simtel file simulato.
Il calcolo del closest approach è definito dal seguente codice:
def closest_distance(center, line):
    """
    find the minimum distance between a set of points(line) and a
        point(center)

    Parameters
    ----------

    center :
        reference point

    line :
        a numpy array

    Returns
    -------

                                                                           24
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

    distance:
        minimum distance

    """
    distance = cdist([center], line).min()
    return distance

def closest_approach_distance(hillas_container):
    """
    find the closest distance between the straight line
    corresponding to the major axis of an ellipse and the center of
        an image(cameraGeometry like)

    Parameters
    ----------

    hillas_container :
        dictionary with telescope IDs as key and
        HillasParametersContainer instances as values

    Returns
    -------

    close_dist:
        the closest approach calculated in meters

    """
    length = np.linspace(-1, 1, 30)
    length = u.Quantity(length, u.m, copy=False)

    y = hillas_container.y + length * np.sin(hillas_container.psi)
    x = hillas_container.x + length * np.cos(hillas_container.psi)

    center = (0, 0)

    line = np.array([x, y])
    line = line.T

    closest_approach = closest_distance(center, line)
    closest_approach = u.Quantity(closest_approach, u.m)

    return closest_approach

     L’esatta definizione di questo parametro è la seguente:
il closest approach è la distanza minima calcolata dal centro della camera ed
il prolungamento infinito dell’asse maggiore dell’ellisse

                                                                          25
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

5.1.2   Parametro di qualità: likelihood function
Il parametro ”likelihood function” è una funzione che esprime la differenza
in termini di cariche nell’immagine ”ground truth” e l’immagine pulita con
un certo set di parametri fissato:
def likelihood_function(event, cleaned_image, telescope_id):
    """
    returns a number that has to be compared with another
        likelihood to find which image has a better approximation of
    the ground truth image after the cleaning

   Parameters
   ----------

   event :
       calibrated event

   cleaned_image :
       dictionary with telescope IDs as key and
       HillasParametersContainer instances as values

   telescope_id:
       unique number for the identification of a telescope

   Returns
   -------
   likelihood:
       a scalar number that represent the sum of all the
           differences between ground truth and cleaned image

   """
   ground_truth_image =
       event.mc.tel[telescope_id].photo_electron_image

   diff = np.abs(cleaned_image - ground_truth_image)
   likelihood = diff.sum()

   return likelihood

    L’esatta definizione
              P          di questo parametro è la seguente:
likelihood = i |(pixel_immagine_pulita)i −(pixel_immagine_ground_truth)i |

5.1.3   Parametro di qualità: numbers of different pixels
Questo parametro è quello meno intuitivo ma anche il più significativo sulle
differenze tra il ground truth e l’immagine pulita.
Per prima cosa si fa il cleaning dell’immmagine ground truth con gli stes-

                                                                         26
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

si parametri utilizzati nel cleaning dell’immagine con rumore, dopodichè si
calcola lo XOR tra le due maschere booleane restituite dal cleaning delle
rispettive immagini e si conta il numero di valori rimasti a ”True”:
def numbers_of_different_pixels(camera, event, cleaned_image,
    telescope_id, picture, boundary, min_neighbors):
    """
    find a quality parameter that is the representation of the
        number of pixels survived in cleaned image but
    not in cleaned ground truth image or vice versa.
    The cleaned ground truth is needed to have a logic correlation
        (independence from noise) between the 2 images that
    has to be compared.

   Parameters
   ----------

   camera:
       Camera geometry information

   picture:
       picture threshold for the tailcuts cleaning

   boundary:
       boundary threshold for the tailcuts cleaning

   min_neighbors:
       minimum number of neighbors in the picture for the tailcuts
           cleaning

   event :
       calibrated event

   cleaned_image :
       dictionary with telescope IDs as key and
       HillasParametersContainer instances as values

   telescope_id:
       unique number for the identification of a telescope

   Returns
   -------
   number_difference_pixels_survived:
       a scalar number that represent the counting of all the
           pixels that are in the cleaned image or
       in the cleaned ground truth BUT not in both of them

   """
   ground_truth_image =

                                                                        27
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

        event.mc.tel[telescope_id].photo_electron_image

    clean = tailcuts_clean(
        camera,
        ground_truth_image,
        boundary_thresh=boundary,
        picture_thresh=picture,
        min_number_picture_neighbors=min_neighbors
    )
    cleaned_ground_truth = ground_truth_image.copy()
    cleaned_ground_truth[~clean] = 0.0

    pixels_survived_image_cleaning = cleaned_image > 0
    pixels_survived_ground_truth_cleaning = cleaned_ground_truth > 0

    difference_pixels_survived =
        np.logical_xor(pixels_survived_image_cleaning,
        pixels_survived_ground_truth_cleaning)
    number_difference_pixels_survived =
        np.count_nonzero(difference_pixels_survived)

    return number_difference_pixels_survived

     Il cleaning del ground truth serve per togliere tutte quelle particelle isola-
te che fanno parte dello sciame ma che non interessano la parametrizzazione
ellittica (questo perché interessa soprattutto il cluster principale dello scia-
me).
Quest parametro definisce il numero di pixels che sono sopravvissuti ad
il cleaning dell’immagine oppure al cleaning del ground truth ma non ad
entrambi (Illustrazione del processo in Figura 5.2).

5.1.4    Diverse scelte di parametri di cleaning per la stessa
         immagine
L’image cleaning può pregiudicare la parametrizzazione ellittica dello sciame.
Questo significa che un cleaning con parametri sbagliati porta ad avere una
parametrizzazione ellittica sbagliata. L’esempio riportato in Figura 5.1 ha i
seguenti parametri:

   • picture threshold = 2.5

   • boundary threshold = 5

   • min number picture neighbors = 2

     Verrà ora riproposto lo stesso sciame con parametri di cleaning apposita-
mente sbagliati per constatare quanto questi cambino la parametrizzazione
ellittica (Figura 5.3):

                                                                                28
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

Figura 5.2: Workflow semplificato del processo per il calcolo del ”numbers of
different pixels”.

   • picture threshold = 2

   • boundary threshold = 5

   • min number picture neighbors = 2

                                                                          29
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

Figura 5.3: Esempio di ellisse con asse maggiore che non interseca il centro
della camera.

    In Figura 5.3 si può notare come un piccolissimo cambiamento del ”pic-
ture threshold” è bastato per rendere assolutamente errata l’ellisse che do-
vrebbe approssimare lo sciame. Un fatto noto ma non dimostrato ancora dai
ricercatori che utilizzano ctapipe, è che la parametrizzazione del cleaning,
per avere dei risultati accettabili, dovrebbe avere un ”picture threshold” che
è un valore che fluttua attorno alla metà del valore del ”boundary threshold”
(per esempio se il picture threshold è 10, il boundary threshold potrebbe
essere 20 come 19.5 come 19.75).
Questo non vuol dire che non si potrebbero avere dei cleaning di un’immagine
accettabili con valori che non sono uno il doppio dell’altro, ma sicuramente
adottando questa regola, si riuscirà ad ottenere un risultato accettabile ite-
rando un numero finito di volte sui parametri del cleaning.
D’ora in avanti si farà uso di questa regola per trovare dei parametri di
cleaning accettabili:
def create_possible_parameters():
    """
    compute all the possible cleaning levels and
    does the storage in a numpy array.

    Parameters
    ----------

                                                                           30
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

    Returns
    -------

    possible_cleaning_levels:
        array with all the possible cleaning levels chosen

    """
    # cleaning levels with minimum neighbors set to 0
    picture_range = np.arange(1, 10, 0.25, dtype=np.float32)
    boundary_range = np.arange(2, 20, 0.5, dtype=np.float32)
    min_neighbors_range = np.zeros(len(picture_range), dtype=np.int)
    possible_cleaning_levels_0 = np.c_[picture_range,
        boundary_range, min_neighbors_range]

    # cleaning levels with minimum neighbors set to 1
    min_neighbors_range = np.ones(len(picture_range), dtype=np.int)
    possible_cleaning_levels_1 = np.c_[picture_range,
        boundary_range, min_neighbors_range]

    # cleaning levels with minimum neighbors set to 2
    min_neighbors_range = np.multiply(min_neighbors_range, 2,
        dtype=np.int)
    possible_cleaning_levels_2 = np.c_[picture_range,
        boundary_range, min_neighbors_range]

    # cleaning levels with minimum neighbors set to 3
    min_neighbors_range = np.ones(len(picture_range), dtype=np.int)
    min_neighbors_range = np.multiply(min_neighbors_range, 3)
    possible_cleaning_levels_3 = np.c_[picture_range,
        boundary_range, min_neighbors_range]

    possible_cleaning_levels =
        np.append(possible_cleaning_levels_0,
        possible_cleaning_levels_1, axis=0)
    possible_cleaning_levels = np.append(possible_cleaning_levels,
        possible_cleaning_levels_2, axis=0)
    possible_cleaning_levels = np.append(possible_cleaning_levels,
        possible_cleaning_levels_3, axis=0)

    return possible_cleaning_levels

5.2    Come implementare l’ottimizzazione dei para-
       metri
Il primo problema da affrontare è sicuramente come definire un processo di
ricerca del cleaning più acccettabile.
Dopo varie discussioni e vari tentativi si è arrivati alla conclusione che il

                                                                          31
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

modo più facile da implementare ma che porta ad un buon risultato in tem-
pi ragionevoli (nell’ordine di 14 secondi per un evento che ha 30 immagini)
è un’iterazione di diversi parametri di cleaning per ogni sciame rilevato da
un telescopio di ogni evento che verrano poi confrontati tra loro per trovare
il set di parametri che minimizza le tre funzioni che determinano la quali-
tà di un cleaning. Di seguito uno pseudocodice per comprendere il work-
flow del processo (https://github.com/MatteoScorcia/cta-benchmarks/
blob/master/Preparation/parameters_search/tests/param_cleaning_per_
event_image.ipynb):

   • Creazione set di tutti i possibili parametri

   • Loading del simtelfile

   • Iterazione su ogni evento

   • Calibrazione dell’evento corrente

   • Iterazione su ogni immagine rilevata per l’evento corrente

   • Iterazione su ogni possibile cleaning per l’immagine corrente

   • Calcolo del parametro di qualità ”closest approach distance” per i
     parametri di cleaning correnti

   • Calcolo del parametro di qualità ”likelihood function” per i parametri
     di cleaning correnti

   • Calcolo del parametro di qualità ”numbers of different pixels” per i
     parametri del cleaning correnti

   • Confronto i parametri di qualità del cleaning corrente con quelli del
     cleaning precedente

   • Scelta dei parametri di cleaning che hanno i parametri di qualità mi-
     gliori tra i due confrontati

   • A fine dell’iterazione degli eventi creazione di un file compresso dove si
     inserisce in ogni riga «tipo di telescopio>, ,
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

                  Figura 5.4: Suddivisione finale dei dati.

di suddividere i dati in base all’energia dell’evento. (https://github.com/
MatteoScorcia/cta-benchmarks/blob/master/Preparation/parameters_
search/tests/param_cleaning_per_event_cam_energybin.ipynb) I ran-
ge energetici sono definiti in questo modo:

def create_energy_bin_array(minimum=1, maximum=1300, num_bins=10):

    energy_bin = np.logspace(np.log10(minimum), np.log10(maximum),
        num_bins)
    energy_bin = np.around(energy_bin, 2)
    energy_bin = u.Quantity(energy_bin, u.GeV)

    return energy_bin

   Quindi ci sono 10 segmenti che suddividono l’energia da 1 GeV a 1300
GeV, in modo logaritmico per avere i segmenti con alta energia più grandi
(questo perché ci si aspetta di avere molti più eventi ad alta energia che a
bassa energia).
Per ogni segmento del range energetico si crea una cartella in cui verranno
memorizzati i dati per tipo di camera.

5.3    Dati finali
I dati finali raccolti quindi, sono dei file compressi di tipo ”.npz” (compres-
sione del modulo ”numpy”) suddivisi come in Figura 5.4.
    I dati quindi vengono suddivisi nel seguente modo:

                                                                            33
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

  output (folder)
     event_cam (folder)
        file contenente i dati suddivisi solo per immagine
        file contenente i soli dati delle camere di tipo ”FlashCam”
        file contenente i soli dati delle camere di tipo ”LSTCam”
        file contenente i soli dati delle camere di tipo ”NectarCam”
        file contenente i soli dati delle camere di tipo ”SCTCam”
     event_cam_energybin (folder)
        primo segmento del range energetico (folder)
           file contenente i dati delle camere di tipo ”FlashCam”
           con energia degli eventi nel segmento corrente
           file contenente i dati delle camere di tipo ”LSTCam” con
           energia degli eventi nel segmento corrente
           file contenente i dati delle camere di tipo ”NectarCam”
           con energia degli eventi nel segmento corrente
           file contenente i dati delle camere di tipo ”SCTCam” con
           energia degli eventi nel segmento corrente
        .
        .
        .
        ultimo segmento del range energetico (folder)
           file contenente i dati delle camere di tipo ”FlashCam”
           con energia degli eventi nel segmento corrente
           file contenente i dati delle camere di tipo ”LSTCam” con
           energia degli eventi nel segmento corrente
           file contenente i dati delle camere di tipo ”NectarCam”
           con energia degli eventi nel segmento corrente
           file contenente i dati delle camere di tipo ”SCTCam” con
           energia degli eventi nel segmento corrente

5.3.1    Esempio di visualizzazione dei dati memorizzati
In Figura 5.5 un’esempio di come potrebbe essere un file memorizzato di cui
si è poi fatto il loading in un secondo momento. Il file caricato contiene tutti
i dati calcolati per ogni immagine di ogni evento letto in modo sequenziale
dal primo fino all’ultimo (il formato dati è quello illustrato nella sezione 5.2).

                                                                               34
CAPITOLO 5. OTTIMIZZARE PARAMETRI DEL CLEANING

Figura 5.5: Caricamento dei dati di un evento memorizzato precedentemente
in un file ”.npz”.

                                                                      35
Capitolo 6

Discussione dei risultati
ottenuti

In questo capitolo si discuterà su quali sono e soprattutto su come verranno
utilizzati i risultati trovati durante il tirocinio.

6.1    Comparazione del cleaning tra parametri fissati
       e parametri ottimizzati
Per mostrare i risultati di un’ottimizzazione prendiamo in considerazione
un’immagine da pulire (Figura 6.1).
    i parametri che si dovrebbero usare sarebbero i seguenti:

   • picture threshold = 3.5

   • boundary threshold = 7.5

   • min number neighbours = 2

   In Figura 6.2 l’immagine pulita.
   Dove i valori dei parametri di qualità sono i seguenti:
ground truth difference: 206.18165264115387
closest approach: 0.12064042781505235 m
number different pixels: 5

   Usando invece i parametri ottimizzati calcolati dallo script:

   • picture threshold = 9

   • boundary threshold = 18

   • min number neighbours = 3

                                     36
CAPITOLO 6. DISCUSSIONE DEI RISULTATI OTTENUTI

   In Figura 6.3 l’immagine pulita.
   Dove i valori dei parametri di qualità sono i seguenti:
ground truth difference: 280.80540532704117
closest approach: 0.04652706142336392 m
numbers different pixels: 2

    Ovviamente essendo il cleaning con i parametri ottimizzati più restrittivo,
toglie più informazione e proprio per questo il primo parametro (ground truth
difference) risulta più grande nel secondo caso.
Come si può vedere invece, gli altri due parametri hanno subito un netto
miglioramento.

6.2    Possibili utilizzi dei risultati trovati
Il problema principale del cleaning attuale, è che per ogni immagine bisogna
controllare che i parametri di cleaning diano risultati accettabili. Questo
ovviamente dovrebbe essere un processo da automatizzare perché anche es-
sendo ctapipe designato per il ”post hoc analysis”, c’è comunque una mole
che si aggira intorno al TeraByte per simtel file.
Avere dei parametri di cleaning fissi come allo stato attuale è impensabile ed
è per questo che un primo utilizzo dei dati trovati, potrebbe essere quello di
creare un cleaning che si adatta all’immagine presentata. Questo può essere

                     Figura 6.1: Immagine con rumore.

                                                                            37
Puoi anche leggere