/accelometer_metadata_creator.py
https://gitlab.com/heavelock/metadata_creator · Python · 198 lines · 127 code · 35 blank · 36 comment · 30 complexity · 8964cda1aa3179553d4cddbc9610e47b MD5 · raw file
- from bs4 import BeautifulSoup
- import scipy.io
- import os
- import obspy
- from datetime import datetime, timedelta
- # Parsowanie pliku xml z metadanymi
- def parse_event_names(file):
- soup = BeautifulSoup(open(file), 'lxml-xml')
- parsed_meta = {}
- for ev in soup.find_all('event'):
- parsed_meta[str(ev.file.contents[0])] = ev['id']
- return parsed_meta
- # parsowanie katalogu
- def parse_catalog(file):
- mat = scipy.io.loadmat(file)
- for key in mat.keys():
- if key[0:2] != '__':
- break
- cata_len = len(mat[key][0][0][2])
- catalog = {}
- for subcat in mat[key][0]:
- catalog[subcat[0][0].lower()] = [subcat[2][i][0] for i in range(cata_len)]
- return catalog
- def write_metadata_file(meta_file, description, starttime, endtime, event_id):
- # Zapis do pliku
- meta_file.write('<metadata>' + "\n")
- meta_file.write(' <item name="episodeName" isRequired="true" minLength="10"/>' + "\n")
- meta_file.write(' <item name="episodeCode" isRequired="true" minLength="2"/>' + "\n")
- meta_file.write(
- ' <item name="episodeOwner" isRequired="true" enum="["IGF PAS", "KWSA", "GIG","GFZ", "VAST"]"/>' + "\n")
- meta_file.write(description + "\n")
- meta_file.write(' <item name="text" isRequired="true"/>' + "\n")
- meta_file.write(
- ' <item name="country" isRequired="true" enum="["Poland", "Germany", "Vietnam"]"/>' + "\n")
- meta_file.write(
- ' <item name="region" enum="["Upper Silesia", "Gross Schoenebeck", "Legnica-Glogow Copper District", "Niedzica", "Quang Nam Province"]"/>' + "\n")
- meta_file.write(
- ' <item name="positionType" isRequired="true" enum="["point", "polygon"]"/>' + "\n")
- meta_file.write(
- ' <item name="coordinateSystem" isRequired="true" enum="["LOCAL:POL001", "WGS-84"]"/>' + "\n")
- meta_file.write(' <item name="longitude" isRequired="true"/>' + "\n")
- meta_file.write(' <item name="latitude" isRequired="true"/>' + "\n")
- meta_file.write(starttime + "\n")
- meta_file.write(endtime + "\n")
- meta_file.write(event_id + "\n")
- meta_file.write(' <item name="itemType" readOnly="true"/>' + "\n")
- meta_file.write(' <item name="name" readOnly="true"/>' + "\n")
- meta_file.write(' <item name="path" readOnly="true"/>' + "\n")
- meta_file.write(
- ' <item name="dataType" enum="[" ", "Accelerogram Miniseed Signal", "Accelerogram Seed Signal", "Air Quality", "Air Stations", "Atmospheric Pressure", "Bottomhole Pressure", "Catalog", "Chemical Water Properties - site visit", "Cumulative Injection", "Episode Image", "Episode Logo", "Episode XML", "Faults", "Flowback Bottomhole Pressure", "Flowback Rate", "Flowback Volume", "Geoarea", "Ground Motion Catalog", "Ground Motion Network", "Injection Rate", "Injection Volume", "Mining Front Advance", "Mining Polygon Advance", "Miniseed Signal", "Mine Area", "Physical Water Properties - site visit", "Physicochemical Water Properties", "Physicochemical Water Properties - site visit", "Powerplant Position", "Proppant Concentration", "Radon 222 Concentration", "Ray Tracing Angles", "Seed Signal", "Seismic Network", "Shapefile", "Shear Wave Velocity", "Shoreline", "Steam production", "Velocity Model", "Water Lab Analyses", "Water Level", "Water Stations", "Water Volume", "Well Path", "Well Position", "Wellhead Pressure"]"/>' + "\n")
- meta_file.write(
- ' <item name="impactingFactor" isRequired="true" enum="["underground mining", "geothermal energy production", "reservoir impoundment"]"/>' + "\n")
- meta_file.write(
- ' <item name="type" enum="["data relevant for the considered hazards", "seismic", "water quality", "air quality", "satellite", "industrial", "geodata"]"/>' + "\n")
- meta_file.write(' <item name="auxiliary" enum="["1"]"/>' + "\n")
- meta_file.write(
- ' <item name="allowedDownload" isRequired="true" enum="["SHEER", "EPOS-IP", "all", "affiliated"]"/>' + "\n")
- meta_file.write(
- ' <item name="allowedVisibility" isRequired="true" enum="["SHEER", "EPOS-IP", "all", "affiliated"]"/>' + "\n")
- meta_file.write(' <item name="dataPolicy" isRequired="true"/>' + "\n")
- meta_file.write('</metadata>' + "\n")
- if __name__ == "__main__":
- ## Wszystkie inputy za jednym razem
- # Podaj sciezke do katalogu roboczego
- working_directory = input('Podaj sciezke gdzie znajduja sie wszystkie pliki.' + '\n')
- # Sprawdzenie czy podana lokalizacja folderu roboczego istnieje, jesli nie, próba wykonania skryptu w obecnej lokalizacji
- if os.path.isdir(working_directory):
- # Zmiana folderu roboczego
- os.chdir(working_directory)
- else:
- # Wypisz w konsoli komunikat
- print('Podana lokalizacja nie jest poprawna, sprobuje wykonac skrypt w lokalizacji gdzie znajdujde sie plik skryptu.')
- # Numer pierwszego sygnalu
- first_signal_no = 0
- # Numer ostatniego sygnalu
- last_signal_no = 9999999
- #Prealokacja zmiennej dla katalogu seismo
- catalog_name = ''
- i = 0
- # Petla sprawdzajaca czy podany plik katalogu istnieje
- while not os.path.exists(catalog_name):
- # Podaj nazwe piku z katalogiem
- catalog_name = input('Podaj pelna nazwe pliku z katalogiem.' + '\n')
- # Jesli podanie nazwy zostalo pominiete, znajdz plik w folderze roboczym
- if catalog_name == '':
- catalog_name = [f for f in os.listdir() if f[-12:].lower() == '_catalog.mat'][0]
- i += 1
- if i == 10:
- raise ValueError(
- 'Nie udalo Ci sie podac poprawnej nazwy katalogu az 10 razy, w podanym folderze tez nie ma tego pliku.'
- ' Sprawdz czy wszystko jest ok.')
- # Prealokacja zmiennej dla katalogu seismo
- acc_catalog_name = ''
- i = 0
- # Petla sprawdzajaca czy podany plik katalogu istnieje
- while not os.path.exists(acc_catalog_name):
- # Podaj nazwe piku z katalogiem
- acc_catalog_name = input('Podaj pelna nazwe pliku z ground motion katalogiem.' + '\n')
- # Jesli podanie nazwy zostalo pominiete, znajdz plik w folderze roboczym
- if acc_catalog_name == '':
- acc_catalog_name = [f for f in os.listdir() if f[-14:].lower() == '_gmcatalog.mat'][0]
- i += 1
- if i == 10:
- raise ValueError(
- 'Nie udalo Ci sie podac poprawnej nazwy ground motion katalogu az 10 razy, w podanym folderze tez nie ma tego pliku.'
- ' Sprawdz czy wszystko jest ok.')
- # Podaj nazwe publikacji w CIBIS
- try:
- cibis_publication_no = int(input('Podaj numer publikacji CIBIS.' + '\n'))
- except ValueError:
- cibis_publication_no = 1
- print('Podana wartosc nie jest liczba. Wartosc ustawiona na 1.')
- # Parsowanie catalogu
- parsed_catalog = parse_catalog(catalog_name)
- acc_parsed_catalog = parse_catalog(acc_catalog_name)
- #Prealokacja zmiennej dla typu magnitudy
- magnitude_type = None
- #Petla sprawdzajaca czy typ magnitudy jest poprawnie wpisanyw
- while not magnitude_type in ('ml','mw'):
- magnitude_type = input('Wykorzystac mw czy ml? Wpisz mw lub ml.' + '\n')
- try:
- parsed_catalog[magnitude_type]
- except KeyError:
- print('W katalogu nie ma magnitudy ', magnitude_type,
- '. Spróbuję ustawić magnitudę mw, jeśli program się wysypie to sprawdź katalog. ')
- magnitude_type = 'mw'
- # Lista plikow seed w katalogu, zawężona do plikow o numerach wiekszych lub rownych numerowi poczatkowemu i
- # mniejszych lub rownych numerowi koncowemu
- file_list = [f for f in os.listdir() if f[-5:] == '.seed' and
- int(f[-11:-5]) >= first_signal_no and
- int(f[-11:-5]) <= last_signal_no]
- for file in file_list:
- # Przeczytaj plik seed
- seed_file = obspy.read(file)
- # Tworzenie pliku metadanych
- metadata_file = open(''.join([file, '_', str(cibis_publication_no), '.metadata']), mode='w')
- # Uzyskanie earthquake id z XMLa
- earthquake_id = acc_parsed_catalog['eid'][[ i for i,rid in enumerate(acc_parsed_catalog['rid']) if rid[0][:-5] == file[:-5]][0]][0]
- # Pobierz magnitude z katalogu
- magnitude = parsed_catalog[magnitude_type][parsed_catalog['id'].index(earthquake_id)]
- # Pobierz date z katalogu, format matlabowy
- matlab_datenum = parsed_catalog['time'][parsed_catalog['id'].index(earthquake_id)]
- # Skonwertuj date z formatu matlabowego na pythonowy
- date_of_eq = datetime.fromordinal(int(matlab_datenum)) + timedelta(days=matlab_datenum%1) - timedelta(days = 366)
- if magnitude_type == 'ml':
- description_magnitude_type = ' with ML='
- else:
- description_magnitude_type = ' with Mw='
- # Stworz linijke description
- description = ''.join([' <item name="description">','Signal of event (trigger accelerogram) which occurred on ',
- date_of_eq.strftime('%Y-%b-%d %X'), description_magnitude_type,
- str(magnitude), ' (eventID=', earthquake_id, ')', '</item>'])
- # Stworz linijke starttime
- starttime = ''.join([' <item name="start">',seed_file[0].stats.starttime.strftime('%Y%m%d%H%M%S.3Z'),'</item>'])
- # Stworz linijke endtime
- endtime = ''.join([' <item name="end">', seed_file[0].stats.endtime.strftime('%Y%m%d%H%M%S.3Z'), '</item>'])
- # Stworz linijke event_id
- event_id = ''.join([' <item name="eventID">',earthquake_id,'</item>'])
- # Zapisz wszystko do pliku
- write_metadata_file(metadata_file,description,starttime,endtime,event_id)
- #Zamknij plik
- metadata_file.close()
- input('Udalo sie! Wcisnij enter aby zamknac okno.')