-
Notifications
You must be signed in to change notification settings - Fork 0
/
E05_provvisorioColab
270 lines (203 loc) · 8.4 KB
/
E05_provvisorioColab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
# -*- coding: utf-8 -*-
"""MCF_E05.ipynb
Automatically generated by Colab.
Original file is located at
https://colab.research.google.com/drive/1j3A_Meqh_6ceUHJMcqcMDi1b_xaAPsrd
#MCF_E05: Funzioni, Moduli e Classi
"""
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
"""##Esercizio 0 - Funzioni e Moduli
Creare il file python somme.py in cui vanno definite due funzioni:
- una funzione che restituisca la somma dei primi n numeri naturali, con n da passare tramite un argomento;
- una funzione che restituisca la somma delle radici dei primi n numeri naturali, con n da passare tramite un argomento.
Creare uno script python che importi il modulo somme appena creato e ne utilizzi le funzioni
Esaminare la cartella di lavoro
"""
#MODULO: somme.py
#Funzione 1
def somman(x):
sum=0
for i in range (0,x+1):
sum-sum+i
return sum
#Funzione 2
def sommasqrt(x):
sum=0
for i in range (0, x+1):
sum=sum+np.sqrt(i)
return sum
#Funzione 3
def sommaprodotto(x):
s=0
p=1
for i in range(1, x+1):
s=s+i
p=p*i
return s, p
#Funzione 4
def geometrica(x, alpha=1):
sum=0
for i in range (1, x+1):
sum=sum+pow(i, alpha)
return sum
#ESERCIZIO 0_uso_somme.py
import somme as s
print('Somma dei primi n naturali')
n=input('-> Inserisca il numero naturale: ')
sum=s.somman(int (n))
print('Risultato: ', sum)
m=input('-> Inserisca il numero naturale: ')
rad=s.sommasqrt(int(m))
print('Risultato: ',rad)
"""##Esercizio 1 - Moduli e Funzioni con argomenti
Modificare il file somme.py aggiungendo:
- una funzione che restituisca la somma e il prodotto dei primi n numeri naturali, con n da passare tramite un argomento;
- una funzione che restituisca, con n da passare tramite un argomento e da passare tramite keyword (kwargs), con valore di default pari a 1.
Modificare lo script python che importa il modulo somme in modo da utilizzare le funzioni appena create.
"""
#ESERCIZIO 1_uso_somme_nuovo.py
print('Somma e prodotto dei primi n naturali')
n=input('-> Inserisca il numero naturale: ')
ss=s.sommaprodotto(int(n))
print('Somma: {}, Prodotto: {}'.format(ss[0], ss[1]))
print('\n Serie speciale')
m=input('-> Inserisca il numero naturale: ')
a=input('-> Inserisca la potenza costante: ')
gg=s.geometrica(int(m))
gg1=s.geometrica(int(m), int(a))
print('Risultato di default (potenza 1): ', gg)
print('Risultato: ', gg1)
"""##Esercizio 2 - Classi
Esempio di esperimento scientifico con struttura modulare (https://www.km3net.org/). image.png
###Accesso ai Dati
Per il terzo esercizio utilizzeremo dei dati che possono essere scaricati tramite lo script get_data.py del pacchetto get-mcf-data.
###Scaricare i dati
Spostarsi nella cartella del pacchetto get-mcf-data e, dopo ave adattato le opzioni necessarie come il percorso, eseguire un comando come di seguito:
python3 get_data.py --year 2023 --exn 5 --outdir percrso/cartella/esercitazione
Il file di dati scaricati dovrebbero essere:
hit_times_M0.csv
hit_times_M1.csv
hit_times_M2.csv
hit_times_M3.csv
###Contenuto File
I file rappresentano i dati relativi a un (fittizio) rivelatore con sensori per fotoni organizzato in 4 moduli, ognuno contenenete 5 sensori.
- Ogni file corrisponde ai dati di un modulo.
- Ogni riga del file contiene l'informazione su un sensore che è stato colpito (Hit).
Per ogni Hit viene riportata:
identificatore del modulo [0-3];
identificatore del sensore [0-4];
distanza temporale in ns dall'inizio della presa dati.
- Gli Hit sono ordinati temporalmente all'interno di ciascun file.
I dati rappresentano un secondo di acquisizione dati.
###Geometria Rivelatore
Le posizioni esatte di moduli e sensori sono fornite di seguito:
Coordinate centro Moduli [m] \\
xmod = [-5, 5, -5, 5] \\
ymod = [ 5, 5, -5, -5]
Coordinate dei Sensori rispetto al centro del Modulo [m] \\
xdet = [-2.5, 2.5, 0, -2.5, 2.5] \\
ydet = [ 2.5, 2.5, 0, -2.5, -2.5]
###Eventi
Si può considerare il rivelatore parte di un esperimento che che sfrutta la luce Cerenkov per studuare Eventi relativi ad un fenomeno di interesse.
Ad ogni Evento un cono di luce Cerenkov investe i sensori o una parte di essi. I sensori registrano il tempo a cui i fotoni Cerenkov vengono rivelati.
Dal punto di vista del nostro rivelatore, un Evento corrisponde ad un insieme di Hit ed alcune informazioni accessorie.
Gli Hit apparteneti allo stesso evento saranno presumibilmente raggruppati nel tempo mentre Hit apparteneti ad eventi diversi mostreranno una separazione temporale maggiore.
###Attività Richieste
####Passo 1:
Creare uno script python che esegua le seguenti operazioni:
- Legga uno o più file di input;
- Produca un istogramma dei tempi per uno dei moduli (file);
- Produca un istogramma delle differenze di tempi () fra Hit consecutivi per uno dei moduli; \\
(SUGGERIMENTO: usare il ';')
- Interpretare il grafico risultante.
####Passo 2:
- Creare il file reco.py che definisca la classe Hit.
- Un oggetto di tipo Hit deve contenere informazioni su:
Id Modulo; \\
Id Sensore; \\
Time Stamp rivelazione.
- Oggetti di tipo Hit devono essere ordinabili in base al Time Stamp ed eventualmente in base alla Id del Modulo e del Sensore.
####Passo 3:
- Creare uno script python che svolga le seguenti operazioni:
- Importi il modulo reco;
- Legga i file di dati e, per ognuno di essi, produca un array di reco.Hit; \\
(SUGGERIMENTO: creare un funzione da richiamare per ogni file;)
- Produca un array che corrisponda alla conbinazione, ordinata temporalmente, di tutti i reco.Hit;
- Produca un istogramma dei () fra reco.Hit consecutivi; \\
(SUGGERIMENTO: valutare l'utilizzo dell' overloading degli operatori + o - (__add__, __sub__))
Come stabilire la finestra temporale da applicare ai che permetta di raggruppare gli Hit dello stesso evento ma separi quelii apparteneti ad eventi differenti? \\
OPZIONALE: Pensare a come dovrebbe essere strutturata una eventuale classe Event per descrivere l'evento fisico come osservato dal rivelatore (quindi basata suglli Hit).
"""
#ESERCIZIO_PASSO1 2_rivelatore_p1.py
#Leggo i dati csv
tab0=pd.read_csv('hit_times_MO.csv')
tab1=pd.read_csv('hit_times_M1.csv')
tab2=pd.read_csv('hit_times_M2.csv')
tab3=pd.read_csv('hit_times_M3.csv')
#Scelgo di istogrammare il modulo 0 (-5, 5: alto, sinistra)
t0=tab0['hit_time']
n, bis, p = plt.hist(t0, bins=60, color='orchid', edgecolor='darkorchid')
plt.title('Istogramma tempi - Modulo 0')
plt.xlabel('Valori estratti')
plt.show()
#Istogramma con differenza dei tempi
dt0=np.diff(t0)
mask_zeri=dt0>0
n, bis, p=plt.hist(np.log10(dt0[mask_zeri]), bins=60, color='teal', edgecolor='black')
plt.title('Istogramma delta-tempi - Modulo 0')
plt.xlabel('Valori estratti')
plt.show()
#MODULO_PASSO2 reco.py
class Hit():
def __init__(self, modulo, sensore, tempo):
self.id_module=modulo
self.id_sensor=sensore
self.time_stamp=tempo
def __repr__(self):
return 'Modulo: {:}, Sensore: {:}, Time Stamp: {:}'.format(self.id_module, self.id_sensor, self.time_stamp)
def __str__(self):
return 'Modulo: {:}, Sensore: {:}, Time Stamp: {:}'.format(self.id_module, self.id_sensor, self.time_stamp)
def __lt__(self, other):
if(self.time_stamp!=other.time_stamp):
return self.time_stamp<other.time_stamp
elif(self.id_module!=other.id_module):
return self.id_module<other.id_module
else:
return self.id_sensor<other.id_sensor
def __sub__(self, other):
return abs(self.time_stamp-other.time_stamp)
#ESERCIZIO_PASSO3 2_rivelatore_p3.py
import reco as rc
#Leggo i dati csv
tab0=pd.read_csv('hit_times_MO.csv')
tab1=pd.read_csv('hit_times_M1.csv')
tab2=pd.read_csv('hit_times_M2.csv')
tab3=pd.read_csv('hit_times_M3.csv')
#Array di Hit per ogni file
def record(tab):
records=np.empty(0)
for i in range (0, len(tab['mod_id']-1)):
add=rc.Hit(tab['mod_id'][i], tab['det_id'][i], tab['hit_time'][i])
records=np.append(records, add)
return records
records_0=record(tab0)
records_1=record(tab1)
records_2=record(tab2)
records_3=record(tab3)
#Riordino in base al tempo
records=np.array([records_0, records_1, records_2, records_3])
print(records)
records=np.sort(records, kind='mergesort')
print(records)
#Estraggo delta_t di reco consecutivi: 2 e 3
delta_t23=np.empty(0)
for i in range(0, len(records_0)-1):
delta_t23=np.append(delta_t23, records_2-records_3)
print(delta_t23)
#Faccio istogramma con delta_t di reco consecutivi: 2 e 3
n, bis, p=plt.hist(delta_t23, bins=60, color='coral', edgecolor='red')
plt.title('Istogramma delta-tempi - Moduli 2-3')
plt.xlabel('Valori estratti')
plt.show()