HiSPARC / sapphire

SAPPHiRE, a framework for HiSPARC
https://docs.hisparc.nl/sapphire/
GNU General Public License v3.0
7 stars 9 forks source link

ReconstructESDCoincidences - ValueError: invalid literal for int() with base 10: b'/s501' #184

Closed deKeijzer closed 6 years ago

deKeijzer commented 6 years ago

Beste,

De functie ReconstructESDCoincidences in analysis.reconstructions geeft mij de volgende error:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
c:\program files\python36\lib\site-packages\sapphire\analysis\reconstructions.py in __init__(self, data, coincidences_group, overwrite, progress, verbose, destination, cluster, force_fresh, force_stale)
    371                 self.cluster = self.data.get_node_attr(self.coincidences_group,
--> 372                                                        'cluster')
    373                 if self.verbose:

c:\program files\python36\lib\site-packages\tables\file.py in get_node_attr(self, where, attrname, name)
   1775         obj = self.get_node(where, name=name)
-> 1776         return obj._f_getattr(attrname)
   1777 

c:\program files\python36\lib\site-packages\tables\node.py in _f_getattr(self, name)
    886 
--> 887         return getattr(self._v_attrs, name)
    888 

c:\program files\python36\lib\site-packages\tables\attributeset.py in __getattr__(self, name)
    291             raise AttributeError("Attribute '%s' does not exist in node: "
--> 292                                  "'%s'" % (name, self._v__nodepath))
    293 

AttributeError: Attribute 'cluster' does not exist in node: '/coincidences'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-4-c17a1da2436e> in <module>()
----> 1 rec = s.analysis.reconstructions.ReconstructESDCoincidences(data, verbose=True, overwrite=True)

c:\program files\python36\lib\site-packages\sapphire\analysis\reconstructions.py in __init__(self, data, coincidences_group, overwrite, progress, verbose, destination, cluster, force_fresh, force_stale)
    374                     print('Read cluster %s from datafile.' % self.cluster)
    375             except AttributeError:
--> 376                 s_active = self._get_active_stations()
    377                 self.cluster = HiSPARCStations(s_active,
    378                                                force_fresh=force_fresh,

c:\program files\python36\lib\site-packages\sapphire\analysis\reconstructions.py in _get_active_stations(self)
    540             if not station_event_table.nrows:
    541                 continue
--> 542             active_stations.append(int(s_path.split(b'station_')[-1]))
    543 
    544         return active_stations

ValueError: invalid literal for int() with base 10: b'/s501'

Voor zover ik in de documentatie heb gekeken (http://docs.hisparc.nl/sapphire/analysis/reconstructions.html#module-sapphire.analysis.reconstructions) zie ik geen fout met mijn gebruik van de betreffende functie, of zie ik iets over het hoofd?

De gebruikte code is als volgt:

import tables
import datetime
import sapphire as s
import os

global data

#STATIONS = [2003, 2004, 2005, 2002] # Nijmegen
STATIONS = [501, 502, 503]
START = datetime.datetime(2014, 1, 1)
END = datetime.datetime(2014, 1, 2)
N = 4
file_name = 'data'
DATAFILE = 'data\\download\\'+file_name+'.h5'
overwrite = True

try:
    data.close()
    print('Data file closed')
except:
    print('Could not close data file')
    pass

if __name__ == '__main__':
    if overwrite:
        try:
            os.remove(DATAFILE)
            print('Deleted data file')
        except:
            print('Could not delete data file')
            pass
    station_groups = ['/s%d' % u for u in STATIONS]

    data = tables.open_file(DATAFILE, 'a')
    for station, group in zip(STATIONS, station_groups):
        s.download_data(data, group, station, START, END)

def refresh_data():
    global data
    data.flush()
    data.close()
    data = tables.open_file(DATAFILE, 'a')

print('----- READY -----')

with s.CoincidencesESD(DATAFILE, '/coincidences', station_groups, overwrite=True) as coin:
    coin.search_coincidences(window=5000) # window – the coincidence time window in nanoseconds. All events with delta t’s smaller than this window will be considered a coincidence.
    coin.store_coincidences(STATIONS)

print('Number of coincidences: %s' % len(data.root.coincidences.coincidences))

#refresh_data()

rec = s.analysis.reconstructions.ReconstructESDCoincidences(data, verbose=True, overwrite=True)

Bij de Laatste regel gaat het fout.

tomkooij commented 6 years ago

Hallo Brian,

ReconstructESDCoincidences verwacht ESD coincidences als invoer (datafile).

In jouw code download je ESD events en bepaal je de coincidences. Dit gebeurt ook automatisch in de ESD. Gebruik download_coincidences.

Zie deze notebook als voorbeeld: https://nbviewer.jupyter.org/url/docs.hisparc.nl/infopakket/notebooks/04_richting_cluster.ipynb

Het kan overigens wel op jouw manier, maar ik denk dat bovenstaande eenvoudiger is. Ik help je graag verder.

deKeijzer commented 6 years ago

Hallo Tom,

Dat is een snel antwoord! Het is juist mijn bedoeling om op deze manier (uiteindelijk) hoek reconstructies te maken van de coïncidenties. Dit zodat ik de 'coincidence time window' zelf kan aanpassen n.a.v. de gekozen stations, bij bijvoorbeeld grote afstanden. Welke functie moet ik gebruiken voor de reconstructie van de coïncidenties?

Edit: Het hele doel hiervan is om van zo ver mogelijk terug data te downloaden en coïncidenties te vinden tussen stations die ver uit elkaar liggen. Dit om mogelijk de ursa major hotspot van >57 EeV zichtbaar te maken, voor meer info zie link. Na veel gebruik van download_coincidences heb ik gemerkt dat de functie niet altijd even betrouwbaar is. Soms lijkt het er op dat hij een time-out geeft, terwijl er voorheen met dezelfde instellingen wel succesvol coïncidenties zijn gedownload. Verder is de time window ook een reden om het op deze manier te doen.

In ieder geval bedankt voor het willen helpen 👍 .

153957 commented 6 years ago

@deKeijzer Een paar lees tips, @SBeijen een LiO bij HiSPARC heeft hier ook onderzoek naar gedaan: Hier zijn haar verslagen in het LiO jaarverslag: Hoofdstuk 3 - Het hisparc-netwerk: Geschikt voor de zoektocht naar UHE- CR’s? Hoofdstuk 2 - Een hotspot voor UHECRs: Zichtbaar met HiSPARC? En hier de poster daarvan En hier het NTvN artikel

En de code die zij gebruikt heeft voor haar analyses. De code is helaas niet super duidelijk, maar er is wel veel commentaar, dus misschien kan je wel begrijpen wat alles doet): https://github.com/HiSPARC/hotspot

153957 commented 6 years ago

Over jouw code, pas deze regel aan: station_groups = ['/s%d' % u for u in STATIONS] Naar: station_groups = ['/station_%d' % u for u in STATIONS] Dan zou het weer moeten werken. De code is nu nogal strikt in hoe die verwacht dat de stations groepen heten. Dat komt dus door de regel waar het fout gaat, daar wordt het pad naar het station gesplit op 'station_', dat deel kan nog wel verbetering gebruiken: active_stations.append(int(s_path.split(b'station_')[-1])).

deKeijzer commented 6 years ago

Bedankt voor de behulpzaamheid @153957, de code werkt inmiddels. Dit verslag was ik nog niet eerder tegen gekomen, tijd om weer wat te lezen.