Tutorial load data Janus¶

I dati, a parte un primo header innocuo, che comunque inizia sempre con //, sono costituiti da blocchi omologhi e contigui, il cui inizio è

Board 0
TS=79663.288 us
TrgID=0
CH          Cnt
00          2762
01          3366
02          3475

e la fine è

60          2110
61          2203
62          2395
63          2116
----------------------------------

quindi subito dopo attacca un nuovo blocco identico

ATTENZIONE: MANCA IL CANALE 28

Questo script funziona facendo il parsing del file linea per linea, dando per scontato che la struttura a blocchi sia garantita, e che il bug del canale 28 sia onnipresente, in poche parole che ci siano sempre 63 canali

Traccia Parsing:

  • Se trova una riga che inizia con TS si memorizza il corrispondente tempo
  • Se trova una riga che inizia con CH, sa che dovrà leggersi le successive 63 righe
  • Se ha letto 63 righe, torna silente fino al prossimo CH. Evetuali TS sono sempre intercettati

Variabili:

  • le "liste" contengono le info relative a ciascun blocco di uno stesso file (l'unico indice ritorna il numero progressivo del blocco)
  • le "listone" contengono le info relative a ciascun file. L'indice si riferisce al "numero di file", in qualsiasi ordine lui se li carichi
In [1]:
import numpy as np
import os
import time
In [2]:
t = time.time()

# Complessivo di tutti i files
listonaTS = []
listonaCnt = []

dataIncoming = False
cntRow = 0

# Ciclo su tutti i files che ho messo nella cartella "data"
for myFile in os.scandir(r".\data"):
    
    if myFile.name.split(".")[-1] != "txt": continue
    
    # Per ciascun file
    listaTS = [] # Vettore che conterrà i TS
    listaCnt = [] # Vettore che contiene i vettori dei conteggi per ciascun file
    
    # Apro il file in questione
    with open(myFile) as f:
        
        # Ciascun blocco
        tmpListaCnt = []
        
        for myLine in f:
                        
            # Se sono ad un TS mi memorizzo il tempo
            if myLine[:3] == "TS=":
                myTS = myLine.split("=")[1].split(" ")[0]
                listaTS.append(float(myTS))
                
            # Se trovo un CH so che devo leggere 64 righe complessive
            if myLine[:2] == "CH":
                dataIncoming = True
                cntRow = 0
                continue
            
            # Se il blocco prima mi ha comunicato che sono in arrivo dati
            if dataIncoming & (cntRow >= 0) & (cntRow <= 63):
                #print(cntRow, myLine)
                
                myCnt = myLine.split("\t")[-1]
                tmpListaCnt.append(int(myCnt))
                
            cntRow += 1
            
            # Se ho letto 63 righe, è finita la pacchia
            # ATTENZIONE, MANCA IL CANALE 28
            if cntRow == 63:
                dataIncoming = False
                listaCnt.append(np.array(tmpListaCnt).copy())
                tmpListaCnt = []
                
    # File finito: mi esporto le cose di interesse come vettori numpy per comodità
    listaTS = np.array(listaTS)
    listaCnt = np.array(listaCnt)
    
    listonaTS.append(listaTS.copy())
    listonaCnt.append(listaCnt.copy())
                
            
print(f"Elapsed time: {time.time()-t:.2f} s")
        
Elapsed time: 3.02 s

Esempio di accesso alla info: il primo indice di una listona è relativo al file, il secondo al blocco

In [3]:
idxFile = 0
idxBlocco = 1
listonaCnt[idxFile][idxBlocco]
Out[3]:
array([2724, 3337, 3356, 2221, 3319, 4495, 4318, 2967, 5941, 6486, 2084,
       2318, 5050, 3581, 2246, 3126, 3105, 2400, 2629, 2007, 2950, 3073,
       1846, 2715, 2525, 2763, 3253, 3365, 3331,    0, 2473, 2789, 2514,
       2718, 2613, 3519, 3630, 2630, 2284, 3055, 2265, 2445, 3029, 5222,
       3225, 2483, 2249, 2248, 2612, 8517, 1841, 3167, 3066, 3441, 2336,
       3042, 2300, 2641, 2596, 2150, 2185, 2456, 2192])
In [4]:
type(listonaCnt[idxFile][idxBlocco])
Out[4]:
numpy.ndarray
In [5]:
# I 63 canali di questo blocco relativo a questo file
listonaCnt[idxFile][idxBlocco].shape
Out[5]:
(63,)
In [6]:
# Tutti i blocchi di questo file
listonaCnt[idxFile].shape
Out[6]:
(3600, 63)
In [7]:
type(listonaTS[idxFile])
Out[7]:
numpy.ndarray
In [8]:
# I 3600 tempi di questo file
listonaTS[idxFile].shape
Out[8]:
(3600,)
In [ ]: