diff --git a/schainpy/model/graphics/jroplot_base.py b/schainpy/model/graphics/jroplot_base.py index 436b480..d5015ec 100644 --- a/schainpy/model/graphics/jroplot_base.py +++ b/schainpy/model/graphics/jroplot_base.py @@ -259,6 +259,11 @@ class Plot(Operation): self.t_units = kwargs.get('t_units', "h_m") self.selectedHeightsList = kwargs.get('selectedHeightsList', []) self.extFile = kwargs.get('filename', None) + self.bFieldList = kwargs.get('bField', []) + self.celestialList = kwargs.get('celestial', []) + + if isinstance(self.bFieldList, int): + self.bFieldList = [self.bFieldList] if isinstance(self.selectedHeightsList, int): self.selectedHeightsList = [self.selectedHeightsList] diff --git a/schainpy/model/graphics/jroplot_spectra.py b/schainpy/model/graphics/jroplot_spectra.py index e1b7d9e..8a435d0 100644 --- a/schainpy/model/graphics/jroplot_spectra.py +++ b/schainpy/model/graphics/jroplot_spectra.py @@ -13,6 +13,10 @@ from schainpy.model.graphics.jroplot_base import Plot, plt, log from itertools import combinations from matplotlib.ticker import LinearLocator +from schainpy.model.utils.BField import BField +from scipy.interpolate import splrep +from scipy.interpolate import splev + from matplotlib import __version__ as plt_version if plt_version >='3.3.4': @@ -67,6 +71,7 @@ class SpectraPlot(Plot): norm = dataOut.nProfiles * dataOut.max_nIncohInt * dataOut.nCohInt * dataOut.windowOfFilter noise = 10*numpy.log10(dataOut.getNoise()/norm) + z = numpy.zeros((dataOut.nChannels, dataOut.nFFTPoints, dataOut.nHeights)) for ch in range(dataOut.nChannels): @@ -1478,7 +1483,7 @@ class RTIMapPlot(Plot): Plot for RTI data ''' - CODE = 'rti_map' + CODE = 'rti_skymap' plot_type = 'scatter' titles = None @@ -1494,19 +1499,29 @@ class RTIMapPlot(Plot): fullDcosy = None fullDcosy = None hindex = [] + mapFile = False + ##### BField #### + flagBField = False + dcosxB = [] + dcosyB = [] + Bmarker = ['+','*','D','x','s','>','o','^'] + + def setup(self): self.xaxis = 'Range (Km)' - self.nplots = len(self.selectedHeightsList) - self.nrows = int(numpy.ceil(self.nplots/2)) - self.ncols = int(numpy.ceil(self.nplots/self.nrows)) + if len(self.selectedHeightsList) > 0: + self.nplots = len(self.selectedHeightsList) + else: + self.nplots = 4 + self.ncols = int(numpy.ceil(self.nplots/2)) + self.nrows = int(numpy.ceil(self.nplots/self.ncols)) self.ylabel = 'dcosy' self.xlabel = 'dcosx' - self.titles = ['Height {:.2f} km '.format(i)+" " for i in self.selectedHeightsList] self.colorbar = True - self.width = 14 - self.height = 10 + self.width = 6 + 4.1*self.nrows + self.height = 3 + 3.5*self.ncols if self.extFile!=None: @@ -1516,9 +1531,13 @@ class RTIMapPlot(Plot): full_elev = pointings[:,2] self.fullDcosx = numpy.cos(numpy.radians(full_elev))*numpy.sin(numpy.radians(full_azi)) self.fullDcosy = numpy.cos(numpy.radians(full_elev))*numpy.cos(numpy.radians(full_azi)) + mapFile = True except Exception as e: + self.extFile = None print(e) + + def update_list(self,dataOut): if len(self.channelList) == 0: @@ -1533,22 +1552,59 @@ class RTIMapPlot(Plot): self.dcosx = numpy.cos(e)*numpy.sin(a) self.dcosy = numpy.cos(e)*numpy.cos(a) + if len(self.bFieldList)>0: + datetObj = datetime.datetime.fromtimestamp(dataOut.utctime) + doy = datetObj.timetuple().tm_yday + year = datetObj.year + # self.dcosxB, self.dcosyB + ObjB = BField(year=year,doy=doy,site=2,heights=self.bFieldList) + [dcos, alpha, nlon, nlat] = ObjB.getBField() + + alpha_location = numpy.zeros((nlon,2,len(self.bFieldList))) + for ih in range(len(self.bFieldList)): + alpha_location[:,0,ih] = dcos[:,0,ih,0] + for ilon in numpy.arange(nlon): + myx = (alpha[ilon,:,ih])[::-1] + myy = (dcos[ilon,:,ih,0])[::-1] + tck = splrep(myx,myy,s=0) + mydcosx = splev(ObjB.alpha_i,tck,der=0) + + myx = (alpha[ilon,:,ih])[::-1] + myy = (dcos[ilon,:,ih,1])[::-1] + tck = splrep(myx,myy,s=0) + mydcosy = splev(ObjB.alpha_i,tck,der=0) + alpha_location[ilon,:,ih] = numpy.array([mydcosx, mydcosy]) + self.dcosxB.append(alpha_location[:,0,ih]) + self.dcosyB.append(alpha_location[:,1,ih]) + self.flagBField = True + + if len(self.celestialList)>0: + #getBField(self.bFieldList, date) + #pass = kwargs.get('celestial', []) + pass + + + def update(self, dataOut): if len(self.channelList) == 0: self.update_list(dataOut) - if len(self.selectedHeightsList)>0 and not self.flag_setIndex: - - for sel_height in self.selectedHeightsList: - index_list = numpy.where(self.heights >= sel_height) - index_list = index_list[0] - self.hindex.append(index_list[0]) + if not self.flag_setIndex: + if len(self.selectedHeightsList)>0: + for sel_height in self.selectedHeightsList: + index_list = numpy.where(self.heights >= sel_height) + index_list = index_list[0] + self.hindex.append(index_list[0]) + # else: + # k = len(self.heights) + # self.hindex.append(int(k/2)) self.flag_setIndex = True + data = {} meta = {} - data['rti_map'] = dataOut.getPower() + data['rti_skymap'] = dataOut.getPower() norm = dataOut.nProfiles * dataOut.max_nIncohInt * dataOut.nCohInt * dataOut.windowOfFilter noise = 10*numpy.log10(dataOut.getNoise()/norm) data['noise'] = noise @@ -1560,21 +1616,22 @@ class RTIMapPlot(Plot): ###### self.x = self.dcosx self.y = self.dcosy - self.z = self.data[-1]['rti_map'] + self.z = self.data[-1]['rti_skymap'] self.z = numpy.array(self.z, dtype=float) #print("inde x1 ", self.height_index) if len(self.hindex) > 0: index = self.hindex else: - index = numpy.arange(0, len(self.z), int((len(self.z))/10)) - #print("inde x2 ", index, self.axes) - + index = numpy.arange(0, len(self.heights), int((len(self.heights))/4.2)) + + #print(index) + self.titles = ['Height {:.2f} km '.format(self.heights[i])+" " for i in index] for n, ax in enumerate(self.axes): if ax.firsttime: - + self.xmax = self.xmax if self.xmax else numpy.nanmax(self.x) self.xmin = self.xmin if self.xmin else numpy.nanmin(self.x) @@ -1586,26 +1643,43 @@ class RTIMapPlot(Plot): if self.extFile!=None: - ax.scatter(self.fullDcosx, self.fullDcosy, marker="+") + ax.scatter(self.fullDcosx, self.fullDcosy, marker="+", s=20) #print(self.fullDcosx) pass - #ax.plt = ax.plot(x, z[n, :, index].T) + ax.plt = ax.scatter(self.x, self.y, c=self.z[:,index[n]], cmap = 'jet',vmin = self.zmin, - s=80, marker="s", vmax = self.zmax) - + s=60, marker="s", vmax = self.zmax) - #labels = ['Range = {:2.1f}km'.format(y[i]) for i in index] - #self.figures[0].legend(ax.plt, labels, loc='center right', prop={'size': 8}) ax.minorticks_on() ax.grid(which='major', axis='both') ax.grid(which='minor', axis='x') + + if self.flagBField : + + for ih in range(len(self.bFieldList)): + label = str(self.bFieldList[ih]) + ' km' + ax.plot(self.dcosxB[ih], self.dcosyB[ih], color='k', marker=self.Bmarker[ih % 8], + label=label, linestyle='--', ms=4.0,lw=0.5) + handles, labels = ax.get_legend_handles_labels() + a = -0.05 + b = 1.15 - 1.19*(self.nrows) + self.axes[0].legend(handles,labels, bbox_to_anchor=(a,b), prop={'size': (5.8+ 1.1*self.nplots)}, title='B Field ⊥') + else: + ax.plt = ax.scatter(self.x, self.y, c=self.z[:,index[n]], cmap = 'jet',vmin = self.zmin, s=80, marker="s", vmax = self.zmax) + if self.flagBField : + for ih in range(len(self.bFieldList)): + ax.plot (self.dcosxB[ih], self.dcosyB[ih], color='k', marker=self.Bmarker[ih % 8], + linestyle='--', ms=4.0,lw=0.5) + + # handles, labels = ax.get_legend_handles_labels() + # a = -0.05 + # b = 1.15 - 1.19*(self.nrows) + # self.axes[0].legend(handles,labels, bbox_to_anchor=(a,b), prop={'size': (5.8+ 1.1*self.nplots)}, title='B Field ⊥') - #self.titles.append('CH {}'.format(self.channelList[n])) - #plt.suptitle(self.maintitle, fontsize=10) diff --git a/schainpy/model/utils/BField.py b/schainpy/model/utils/BField.py index 1192da5..d8d7671 100644 --- a/schainpy/model/utils/BField.py +++ b/schainpy/model/utils/BField.py @@ -1,6 +1,14 @@ +""" -from .jroutils_ftp import * -from .jroutils_publish import * +Converted to Object-oriented Programming by Freddy Galindo, ROJ, 07 October 2009. +Added to signal Chain by Joab Apaza, ROJ, Jun 2023. +""" + +import numpy +import time +import os +from scipy.special import lpmn +from schainpy.model.utils import Astro_Coords class BField(): def __init__(self,year=None,doy=None,site=1,heights=None,alpha_i=90): @@ -68,9 +76,25 @@ class BField(): elif self.site==1: title_site = 'Jicamarca' coord_site = [-76-52./60.,-11-57/60.,0.5] - # theta = (45+5.35)*numpy.pi/180. # (50.35 and 1.46 from Fleish Thesis) - # delta = -1.46*numpy.pi/180 - #AMISR + heta = (45+5.35)*numpy.pi/180. # (50.35 and 1.46 from Fleish Thesis) + delta = -1.46*numpy.pi/180 + + + x_ant1 = numpy.roll(self.rotvector(self.rotvector(x_ant,1,delta),3,theta),1) + y_ant1 = numpy.roll(self.rotvector(self.rotvector(y_ant,1,delta),3,theta),1) + z_ant1 = numpy.roll(self.rotvector(self.rotvector(z_ant,1,delta),3,theta),1) + + ang0 = -1*coord_site[0]*numpy.pi/180. + ang1 = coord_site[1]*numpy.pi/180. + x_ant = self.rotvector(self.rotvector(x_ant1,2,ang1),3,ang0) + y_ant = self.rotvector(self.rotvector(y_ant1,2,ang1),3,ang0) + z_ant = self.rotvector(self.rotvector(z_ant1,2,ang1),3,ang0) + + elif self.site==2: #AMISR + title_site = 'AMISR 14' + + coord_site = [-76.874913, -11.953371, 0.52984] + theta = (0.0977)*numpy.pi/180. # 0.0977 delta = 0.110*numpy.pi/180 # 0.11 @@ -310,7 +334,7 @@ class BField(): c = numpy.cos((90 - latitude[ii])*numpy.pi/180.) # Legendre functions p(n,m|c) - [p,dp]= scipy.special.lpmn(maxcoef+1,maxcoef+1,c) + [p,dp]= lpmn(maxcoef+1,maxcoef+1,c) p = p[:,:-1].transpose() s = numpy.sqrt((1. - c)*(1 + c)) diff --git a/schainpy/model/utils/TimeTools.py b/schainpy/model/utils/TimeTools.py new file mode 100755 index 0000000..1750f48 --- /dev/null +++ b/schainpy/model/utils/TimeTools.py @@ -0,0 +1,430 @@ +""" +The TIME_CONVERSIONS.py module gathers classes and functions for time system transformations +(e.g. between seconds from 1970 to datetime format). + +MODULES CALLED: +NUMPY, TIME, DATETIME, CALENDAR + +MODIFICATION HISTORY: +Created by Ing. Freddy Galindo (frederickgalindo@gmail.com). ROJ Aug 13, 2009. +""" + +import numpy +import time +from datetime import datetime as dt +import calendar + +class Time: + """ + time(year,month,dom,hour,min,secs) + + An object represents a date and time of certain event.. + + Parameters + ---------- + YEAR = Number of the desired year. Year must be valid values from the civil calendar. + Years B.C.E must be represented as negative integers. Years in the common era are repre- + sented as positive integers. In particular, note that there is no year 0 in the civil + calendar. 1 B.C.E. (-1) is followed by 1 C.E. (1). + + MONTH = Number of desired month (1=Jan, ..., 12=December). + + DOM = Number of day of the month. + + HOUR = Number of the hour of the day. By default hour=0 + + MINS = Number of the minute of the hour. By default min=0 + + SECS = Number of the second of the minute. By default secs=0. + + Examples + -------- + time_info = time(2008,9,30,12,30,00) + + time_info = time(2008,9,30) + """ + + def __init__(self, year=None, month=None, dom=None, hour=0, mins=0, secs=0): + # If one the first three inputs are not defined, it takes the current date. + date = time.localtime() + if year==None:year=date[0] + if month==None:month=date[1] + if dom==None:dom=date[2] + + # Converting to arrays + year = numpy.array([year]); month = numpy.array([month]); dom = numpy.array([dom]) + hour = numpy.array([hour]); mins = numpy.array([mins]); secs = numpy.array([secs]) + + # Defining time information object. + self.year = numpy.atleast_1d(year) + self.month = numpy.atleast_1d(month) + self.dom = numpy.atleast_1d(dom) + self.hour = numpy.atleast_1d(hour) + self.mins = numpy.atleast_1d(mins) + self.secs = numpy.atleast_1d(secs) + + def change2julday(self): + """ + Converts a datetime to Julian days. + """ + + # Defining constants + greg = 2299171 # incorrect Julian day for Oct, 25, 1582. + min_calendar = -4716 + max_calendar = 5000000 + + min_year = numpy.nanmin(self.year) + max_year = numpy.nanmax(self.year) + if (min_yearmax_calendar): + print ("Value of Julian date is out of allowed range") + return -1 + + noyear = numpy.sum(self.year==0) + if noyear>0: + print ("There is no year zero in the civil calendar") + return -1 + + # Knowing if the year is less than 0. + bc = self.year<0 + + # Knowing if the month is less than March. + inJanFeb = self.month<=2 + + jy = self.year + bc - inJanFeb + jm = self.month + (1 + 12*inJanFeb) + + # Computing Julian days. + jul= numpy.floor(365.25*jy) + numpy.floor(30.6001*jm) + (self.dom+1720995.0) + + # Test whether to change to Gregorian Calendar + if numpy.min(jul) >= greg: + ja = numpy.int32(0.01*jy) + jul = jul + 2 - ja + numpy.int32(0.25*ja) + else: + gregchange = numpy.where(jul >= greg) + if gregchange[0].size>0: + ja = numpy.int32(0.01 + jy[gregchange]) + jy[gregchange] = jy[gregchange] + 2 - ja + numpy.int32(0.25*ja) + + # Determining machine-specific parameters affecting floating-point. + eps = 0.0 # Replace this line for a function to get precision. + eps = abs(jul)*0.0 > eps + + jul = jul + (self.hour/24. -0.5) + (self.mins/1440.) + (self.secs/86400.) + eps + + return jul[0] + + def change2secs(self): + """ + Converts datetime to number of seconds respect to 1970. + """ + + dtime = dt(self.year[0], self.month[0], self.dom[0]) + return (dtime-dt(1970, 1, 1)).total_seconds() + + year = self.year + if year.size>1: year = year[0] + + month = self.month + if month.size>1: month = month[0] + + dom = self.dom + if dom.size>1: dom = dom[0] + + # Resizing hour, mins and secs if it was necessary. + hour = self.hour + if hour.size>1:hour = hour[0] + if hour.size==1:hour = numpy.resize(hour,year.size) + + mins = self.mins + if mins.size>1:mins = mins[0] + if mins.size==1:mins = numpy.resize(mins,year.size) + + secs = self.secs + if secs.size>1:secs = secs[0] + if secs.size==1:secs = numpy.resize(secs,year.size) + + # Using time.mktime to compute seconds respect to 1970. + secs1970 = numpy.zeros(year.size) + for ii in numpy.arange(year.size): + secs1970[ii] = time.mktime((int(year[ii]),int(month[ii]),int(dom[ii]),\ + int(hour[ii]),int(mins[ii]),int(secs[ii]),0,0,0)) + + secs1970 = numpy.int32(secs1970 - time.timezone) + + return secs1970 + + def change2strdate(self,mode=1): + """ + change2strdate method converts a date and time of certain event to date string. The + string format is like localtime (e.g. Fri Oct 9 15:00:19 2009). + + Parameters + ---------- + None. + + Return + ------ + + Modification History + -------------------- + Created by Freddy R. Galindo, ROJ, 09 October 2009. + + """ + + secs = numpy.atleast_1d(self.change2secs()) + strdate = [] + for ii in numpy.arange(numpy.size(secs)): + secs_tmp = time.localtime(secs[ii] + time.timezone) + if mode==1: + strdate.append(time.strftime("%d-%b-%Y (%j) %H:%M:%S",secs_tmp)) + elif mode==2: + strdate.append(time.strftime("%d-%b-%Y (%j)",secs_tmp)) + + strdate = numpy.array(strdate) + + return strdate + + +class Secs: + """ + secs(secs): + + An object represents the number of seconds respect to 1970. + + Parameters + ---------- + + SECS = A scalar or array giving the number of seconds respect to 1970. + + Example: + -------- + secs_info = secs(1251241373) + + secs_info = secs([1251241373,1251241383,1251241393]) + """ + def __init__(self,secs): + self.secs = secs + + def change2julday(self): + """ + Convert seconds from 1970 to Julian days. + """ + + secs_1970 = time(1970,1,1,0,0,0).change2julday() + + julian = self.secs/86400.0 + secs_1970 + + return julian + + def change2time(self): + """ + Converts seconds from 1970 to datetime. + """ + + secs1970 = numpy.atleast_1d(self.secs) + + datetime = numpy.zeros((9,secs1970.size)) + for ii in numpy.arange(secs1970.size): + tuple = time.gmtime(secs1970[ii]) + datetime[0,ii] = tuple[0] + datetime[1,ii] = tuple[1] + datetime[2,ii] = tuple[2] + datetime[3,ii] = tuple[3] + datetime[4,ii] = tuple[4] + datetime[5,ii] = tuple[5] + datetime[6,ii] = tuple[6] + datetime[7,ii] = tuple[7] + datetime[8,ii] = tuple[8] + + datetime = numpy.int32(datetime) + + return datetime + + +class Julian: + """ + julian(julian): + + An object represents julian days. + + Parameters + ---------- + + JULIAN = A scalar or array giving the julina days. + + Example: + -------- + julian_info = julian(2454740) + + julian_info = julian([2454740,2454760,2454780]) + """ + def __init__(self,julian): + self.julian = numpy.atleast_1d(julian) + + def change2time(self): + """ + change2time method converts from julian day to calendar date and time. + + Return + ------ + year = An array giving the year of the desired julian day. + month = An array giving the month of the desired julian day. + dom = An array giving the day of the desired julian day. + hour = An array giving the hour of the desired julian day. + mins = An array giving the minute of the desired julian day. + secs = An array giving the second of the desired julian day. + + Examples + -------- + >> jd = 2455119.0 + >> [yy,mo,dd,hh,mi,ss] = TimeTools.julian(jd).change2time() + >> print [yy,mo,dd,hh,mi,ss] + [2009] [10] [ 14.] [ 12.] [ 0.] [ 0.] + + Modification history + -------------------- + Translated from "Numerical Recipies in C", by William H. Press, Brian P. Flannery, + Saul A. Teukolsky, and William T. Vetterling. Cambridge University Press, 1988. + Converted to Python by Freddy R. Galindo, ROJ, 06 October 2009. + """ + + min_julian = -1095 + max_julian = 1827933925 + if (numpy.min(self.julian) < min_julian) or (numpy.max(self.julian) > max_julian): + print ('Value of Julian date is out of allowed range.') + return None + + # Beginning of Gregorian calendar + igreg = 2299161 + julLong = numpy.floor(self.julian + 0.5) + minJul = numpy.min(julLong) + + if (minJul >= igreg): + # All are Gregorian + jalpha = numpy.int32(((julLong - 1867216) - 0.25)/36524.25) + ja = julLong + 1 + jalpha - numpy.int32(0.25*jalpha) + else: + ja = julLong + gregChange = numpy.where(julLong >= igreg) + if gregChange[0].size>0: + jalpha = numpy.int32(((julLong[gregChange]-1867216) - 0.25)/36524.25) + ja[gregChange] = julLong[gregChange]+1+jalpha-numpy.int32(0.25*jalpha) + + # clear memory. + jalpha = -1 + + jb = ja + 1524 + jc = numpy.int32(6680. + ((jb-2439870)-122.1)/365.25) + jd = numpy.int32(365.*jc + (0.25*jc)) + je = numpy.int32((jb - jd)/30.6001) + + dom = jb - jd - numpy.int32(30.6001*je) + month = je - 1 + month = ((month - 1) % 12) + 1 + month = numpy.atleast_1d(month) + year = jc - 4715 + year = year - (month > 2)*1 + year = year - (year <= 0)*1 + year = numpy.atleast_1d(year) + + # Getting hours, minutes, seconds + fraction = self.julian + 0.5 - julLong + eps_0 = dom*0.0 + 1.0e-12 + eps_1 = 1.0e-12*numpy.abs(julLong) + eps = (eps_0>eps_1)*eps_0 + (eps_0<=eps_1)*eps_1 + + hour_0 = dom*0 + 23 + hour_2 = dom*0 + 0 + hour_1 = numpy.floor(fraction*24.0 + eps) + hour = ((hour_1>hour_0)*23) + ((hour_1<=hour_0)*hour_1) + hour = ((hour_1=hour_2)*hour_1) + + fraction = fraction - (hour/24.0) + mins_0 = dom*0 + 59 + mins_2 = dom*0 + 0 + mins_1 = numpy.floor(fraction*1440.0 + eps) + mins = ((mins_1>mins_0)*59) + ((mins_1<=mins_0)*mins_1) + mins = ((mins_1=mins_2)*mins_1) + + secs_2 = dom*0 + 0 + secs_1 = (fraction - mins/1440.0)*86400.0 + secs = ((secs_1=secs_2)*secs_1) + + return year,month,dom,hour,mins,secs + + def change2secs(self): + """ + Converts from Julian days to seconds from 1970. + """ + + jul_1970 = Time(1970,1,1,0,0,0).change2julday() + + secs = numpy.int32((self.julian - jul_1970)*86400) + + return secs + + def change2lst(self,longitude=-76.874369): + """ + CT2LST converts from local civil time to local mean sideral time + + longitude = The longitude in degrees (east of Greenwich) of the place for which + the local sideral time is desired, scalar. The Greenwich mean sideral time (GMST) + can be found by setting longitude=0. + """ + + # Useful constants, see Meus, p. 84 + c = numpy.array([280.46061837, 360.98564736629, 0.000387933, 38710000.0]) + jd2000 = 2451545.0 + t0 = self.julian - jd2000 + t = t0/36525. + + # Computing GST in seconds + theta = c[0] + (c[1]*t0) + (t**2)*(c[2]-t/c[3]) + + # Computing LST in hours + lst = (theta + longitude)/15.0 + neg = numpy.where(lst < 0.0) + if neg[0].size>0:lst[neg] = 24.0 + (lst[neg] % 24) + lst = lst % 24.0 + + return lst + + +class date2doy: + def __init__(self,year,month,day): + self.year = year + self.month = month + self.day = day + + def change2doy(self): + if calendar.isleap(self.year) == True: + tfactor = 1 + else: + tfactor = 2 + + day = self.day + month = self.month + + doy = numpy.floor((275*month)/9.0) - (tfactor*numpy.floor((month+9)/12.0)) + day - 30 + + return numpy.int32(doy) + + +class Doy2Date: + def __init__(self,year,doy): + self.year = year + self.doy = doy + + def change2date(self): + months = numpy.arange(12) + 1 + + first_dem = date2doy(self.year,months,1) + first_dem = first_dem.change2doy() + + imm = numpy.where((self.doy - first_dem) > 0) + + month = imm[0].size + dom = self.doy -first_dem[month - 1] + 1 + + return month, dom diff --git a/schainpy/model/utils/igrf13coeffs.txt b/schainpy/model/utils/igrf13coeffs.txt new file mode 100755 index 0000000..9b362e0 --- /dev/null +++ b/schainpy/model/utils/igrf13coeffs.txt @@ -0,0 +1,199 @@ +# 13th Generation International Geomagnetic Reference Field Schmidt semi-normalised spherical harmonic coefficients, degree n=1,13 +# in units nanoTesla for IGRF and definitive DGRF main-field models (degree n=1,8 nanoTesla/year for secular variation (SV)) +c/s deg ord IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF IGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF DGRF IGRF SV +g/h n m 1900.0 1905.0 1910.0 1915.0 1920.0 1925.0 1930.0 1935.0 1940.0 1945.0 1950.0 1955.0 1960.0 1965.0 1970.0 1975.0 1980.0 1985.0 1990.0 1995.0 2000.0 2005.0 2010.0 2015.0 2020.0 2020-25 +g 1 0 -31543 -31464 -31354 -31212 -31060 -30926 -30805 -30715 -30654 -30594 -30554 -30500 -30421 -30334 -30220 -30100 -29992 -29873 -29775 -29692 -29619.4 -29554.63 -29496.57 -29441.46 -29404.8 5.7 +g 1 1 -2298 -2298 -2297 -2306 -2317 -2318 -2316 -2306 -2292 -2285 -2250 -2215 -2169 -2119 -2068 -2013 -1956 -1905 -1848 -1784 -1728.2 -1669.05 -1586.42 -1501.77 -1450.9 7.4 +h 1 1 5922 5909 5898 5875 5845 5817 5808 5812 5821 5810 5815 5820 5791 5776 5737 5675 5604 5500 5406 5306 5186.1 5077.99 4944.26 4795.99 4652.5 -25.9 +g 2 0 -677 -728 -769 -802 -839 -893 -951 -1018 -1106 -1244 -1341 -1440 -1555 -1662 -1781 -1902 -1997 -2072 -2131 -2200 -2267.7 -2337.24 -2396.06 -2445.88 -2499.6 -11.0 +g 2 1 2905 2928 2948 2956 2959 2969 2980 2984 2981 2990 2998 3003 3002 2997 3000 3010 3027 3044 3059 3070 3068.4 3047.69 3026.34 3012.20 2982.0 -7.0 +h 2 1 -1061 -1086 -1128 -1191 -1259 -1334 -1424 -1520 -1614 -1702 -1810 -1898 -1967 -2016 -2047 -2067 -2129 -2197 -2279 -2366 -2481.6 -2594.50 -2708.54 -2845.41 -2991.6 -30.2 +g 2 2 924 1041 1176 1309 1407 1471 1517 1550 1566 1578 1576 1581 1590 1594 1611 1632 1663 1687 1686 1681 1670.9 1657.76 1668.17 1676.35 1677.0 -2.1 +h 2 2 1121 1065 1000 917 823 728 644 586 528 477 381 291 206 114 25 -68 -200 -306 -373 -413 -458.0 -515.43 -575.73 -642.17 -734.6 -22.4 +g 3 0 1022 1037 1058 1084 1111 1140 1172 1206 1240 1282 1297 1302 1302 1297 1287 1276 1281 1296 1314 1335 1339.6 1336.30 1339.85 1350.33 1363.2 2.2 +g 3 1 -1469 -1494 -1524 -1559 -1600 -1645 -1692 -1740 -1790 -1834 -1889 -1944 -1992 -2038 -2091 -2144 -2180 -2208 -2239 -2267 -2288.0 -2305.83 -2326.54 -2352.26 -2381.2 -5.9 +h 3 1 -330 -357 -389 -421 -445 -462 -480 -494 -499 -499 -476 -462 -414 -404 -366 -333 -336 -310 -284 -262 -227.6 -198.86 -160.40 -115.29 -82.1 6.0 +g 3 2 1256 1239 1223 1212 1205 1202 1205 1215 1232 1255 1274 1288 1289 1292 1278 1260 1251 1247 1248 1249 1252.1 1246.39 1232.10 1225.85 1236.2 3.1 +h 3 2 3 34 62 84 103 119 133 146 163 186 206 216 224 240 251 262 271 284 293 302 293.4 269.72 251.75 245.04 241.9 -1.1 +g 3 3 572 635 705 778 839 881 907 918 916 913 896 882 878 856 838 830 833 829 802 759 714.5 672.51 633.73 581.69 525.7 -12.0 +h 3 3 523 480 425 360 293 229 166 101 43 -11 -46 -83 -130 -165 -196 -223 -252 -297 -352 -427 -491.1 -524.72 -537.03 -538.70 -543.4 0.5 +g 4 0 876 880 884 887 889 891 896 903 914 944 954 958 957 957 952 946 938 936 939 940 932.3 920.55 912.66 907.42 903.0 -1.2 +g 4 1 628 643 660 678 695 711 727 744 762 776 792 796 800 804 800 791 782 780 780 780 786.8 797.96 808.97 813.68 809.5 -1.6 +h 4 1 195 203 211 218 220 216 205 188 169 144 136 133 135 148 167 191 212 232 247 262 272.6 282.07 286.48 283.54 281.9 -0.1 +g 4 2 660 653 644 631 616 601 584 565 550 544 528 510 504 479 461 438 398 361 325 290 250.0 210.65 166.58 120.49 86.3 -5.9 +h 4 2 -69 -77 -90 -109 -134 -163 -195 -226 -252 -276 -278 -274 -278 -269 -266 -265 -257 -249 -240 -236 -231.9 -225.23 -211.03 -188.43 -158.4 6.5 +g 4 3 -361 -380 -400 -416 -424 -426 -422 -415 -405 -421 -408 -397 -394 -390 -395 -405 -419 -424 -423 -418 -403.0 -379.86 -356.83 -334.85 -309.4 5.2 +h 4 3 -210 -201 -189 -173 -153 -130 -109 -90 -72 -55 -37 -23 3 13 26 39 53 69 84 97 119.8 145.15 164.46 180.95 199.7 3.6 +g 4 4 134 146 160 178 199 217 234 249 265 304 303 290 269 252 234 216 199 170 141 122 111.3 100.00 89.40 70.38 48.0 -5.1 +h 4 4 -75 -65 -55 -51 -57 -70 -90 -114 -141 -178 -210 -230 -255 -269 -279 -288 -297 -297 -299 -306 -303.8 -305.36 -309.72 -329.23 -349.7 -5.0 +g 5 0 -184 -192 -201 -211 -221 -230 -237 -241 -241 -253 -240 -229 -222 -219 -216 -218 -218 -214 -214 -214 -218.8 -227.00 -230.87 -232.91 -234.3 -0.3 +g 5 1 328 328 327 327 326 326 327 329 334 346 349 360 362 358 359 356 357 355 353 352 351.4 354.41 357.29 360.14 363.2 0.5 +h 5 1 -210 -193 -172 -148 -122 -96 -72 -51 -33 -12 3 15 16 19 26 31 46 47 46 46 43.8 42.72 44.58 46.98 47.7 0.0 +g 5 2 264 259 253 245 236 226 218 211 208 194 211 230 242 254 262 264 261 253 245 235 222.3 208.95 200.26 192.35 187.8 -0.6 +h 5 2 53 56 57 58 58 58 60 64 71 95 103 110 125 128 139 148 150 150 154 165 171.9 180.25 189.01 196.98 208.3 2.5 +g 5 3 5 -1 -9 -16 -23 -28 -32 -33 -33 -20 -20 -23 -26 -31 -42 -59 -74 -93 -109 -118 -130.4 -136.54 -141.05 -140.94 -140.7 0.2 +h 5 3 -33 -32 -33 -34 -38 -44 -53 -64 -75 -67 -87 -98 -117 -126 -139 -152 -151 -154 -153 -143 -133.1 -123.45 -118.06 -119.14 -121.2 -0.6 +g 5 4 -86 -93 -102 -111 -119 -125 -131 -136 -141 -142 -147 -152 -156 -157 -160 -159 -162 -164 -165 -166 -168.6 -168.05 -163.17 -157.40 -151.2 1.3 +h 5 4 -124 -125 -126 -126 -125 -122 -118 -115 -113 -119 -122 -121 -114 -97 -91 -83 -78 -75 -69 -55 -39.3 -19.57 -0.01 15.98 32.3 3.0 +g 5 5 -16 -26 -38 -51 -62 -69 -74 -76 -76 -82 -76 -69 -63 -62 -56 -49 -48 -46 -36 -17 -12.9 -13.55 -8.03 4.30 13.5 0.9 +h 5 5 3 11 21 32 43 51 58 64 69 82 80 78 81 81 83 88 92 95 97 107 106.3 103.85 101.04 100.12 98.9 0.3 +g 6 0 63 62 62 61 61 61 60 59 57 59 54 47 46 45 43 45 48 53 61 68 72.3 73.60 72.78 69.55 66.0 -0.5 +g 6 1 61 60 58 57 55 54 53 53 54 57 57 57 58 61 64 66 66 65 65 67 68.2 69.56 68.69 67.57 65.5 -0.3 +h 6 1 -9 -7 -5 -2 0 3 4 4 4 6 -1 -9 -10 -11 -12 -13 -15 -16 -16 -17 -17.4 -20.33 -20.90 -20.61 -19.1 0.0 +g 6 2 -11 -11 -11 -10 -10 -9 -9 -8 -7 6 4 3 1 8 15 28 42 51 59 68 74.2 76.74 75.92 72.79 72.9 0.4 +h 6 2 83 86 89 93 96 99 102 104 105 100 99 96 99 100 100 99 93 88 82 72 63.7 54.75 44.18 33.30 25.1 -1.6 +g 6 3 -217 -221 -224 -228 -233 -238 -242 -246 -249 -246 -247 -247 -237 -228 -212 -198 -192 -185 -178 -170 -160.9 -151.34 -141.40 -129.85 -121.5 1.3 +h 6 3 2 4 5 8 11 14 19 25 33 16 33 48 60 68 72 75 71 69 69 67 65.1 63.63 61.54 58.74 52.8 -1.3 +g 6 4 -58 -57 -54 -51 -46 -40 -32 -25 -18 -25 -16 -8 -1 4 2 1 4 4 3 -1 -5.9 -14.58 -22.83 -28.93 -36.2 -1.4 +h 6 4 -35 -32 -29 -26 -22 -18 -16 -15 -15 -9 -12 -16 -20 -32 -37 -41 -43 -48 -52 -58 -61.2 -63.53 -66.26 -66.64 -64.5 0.8 +g 6 5 59 57 54 49 44 39 32 25 18 21 12 7 -2 1 3 6 14 16 18 19 16.9 14.58 13.10 13.14 13.5 0.0 +h 6 5 36 32 28 23 18 13 8 4 0 -16 -12 -12 -11 -8 -6 -4 -2 -1 1 1 0.7 0.24 3.02 7.35 8.9 0.0 +g 6 6 -90 -92 -95 -98 -101 -103 -104 -106 -107 -104 -105 -107 -113 -111 -112 -111 -108 -102 -96 -93 -90.4 -86.36 -78.09 -70.85 -64.7 0.9 +h 6 6 -69 -67 -65 -62 -57 -52 -46 -40 -33 -39 -30 -24 -17 -7 1 11 17 21 24 36 43.8 50.94 55.40 62.41 68.1 1.0 +g 7 0 70 70 71 72 73 73 74 74 74 70 65 65 67 75 72 71 72 74 77 77 79.0 79.88 80.44 81.29 80.6 -0.1 +g 7 1 -55 -54 -54 -54 -54 -54 -54 -53 -53 -40 -55 -56 -56 -57 -57 -56 -59 -62 -64 -72 -74.0 -74.46 -75.00 -75.99 -76.7 -0.2 +h 7 1 -45 -46 -47 -48 -49 -50 -51 -52 -52 -45 -35 -50 -55 -61 -70 -77 -82 -83 -80 -69 -64.6 -61.14 -57.80 -54.27 -51.5 0.6 +g 7 2 0 0 1 2 2 3 4 4 4 0 2 2 5 4 1 1 2 3 2 1 0.0 -1.65 -4.55 -6.79 -8.2 0.0 +h 7 2 -13 -14 -14 -14 -14 -14 -15 -17 -18 -18 -17 -24 -28 -27 -27 -26 -27 -27 -26 -25 -24.2 -22.57 -21.20 -19.53 -16.9 0.6 +g 7 3 34 33 32 31 29 27 25 23 20 0 1 10 15 13 14 16 21 24 26 28 33.3 38.73 45.24 51.82 56.5 0.7 +h 7 3 -10 -11 -12 -12 -13 -14 -14 -14 -14 2 0 -4 -6 -2 -4 -5 -5 -2 0 4 6.2 6.82 6.54 5.59 2.2 -0.8 +g 7 4 -41 -41 -40 -38 -37 -35 -34 -33 -31 -29 -40 -32 -32 -26 -22 -14 -12 -6 -1 5 9.1 12.30 14.00 15.07 15.8 0.1 +h 7 4 -1 0 1 2 4 5 6 7 7 6 10 8 7 6 8 10 16 20 21 24 24.0 25.35 24.96 24.45 23.5 -0.2 +g 7 5 -21 -20 -19 -18 -16 -14 -12 -11 -9 -10 -7 -11 -7 -6 -2 0 1 4 5 4 6.9 9.37 10.46 9.32 6.4 -0.5 +h 7 5 28 28 28 28 28 29 29 29 29 28 36 28 23 26 23 22 18 17 17 17 14.8 10.93 7.03 3.27 -2.2 -1.1 +g 7 6 18 18 18 19 19 19 18 18 17 15 5 9 17 13 13 12 11 10 9 8 7.3 5.42 1.64 -2.88 -7.2 -0.8 +h 7 6 -12 -12 -13 -15 -16 -17 -18 -19 -20 -17 -18 -20 -18 -23 -23 -23 -23 -23 -23 -24 -25.4 -26.32 -27.61 -27.50 -27.2 0.1 +g 7 7 6 6 6 6 6 6 6 6 5 29 19 18 8 1 -2 -5 -2 0 0 -2 -1.2 1.94 4.92 6.61 9.8 0.8 +h 7 7 -22 -22 -22 -22 -22 -21 -20 -19 -19 -22 -16 -18 -17 -12 -11 -12 -10 -7 -4 -6 -5.8 -4.64 -3.28 -2.32 -1.8 0.3 +g 8 0 11 11 11 11 11 11 11 11 11 13 22 11 15 13 14 14 18 21 23 25 24.4 24.80 24.41 23.98 23.7 0.0 +g 8 1 8 8 8 8 7 7 7 7 7 7 15 9 6 5 6 6 6 6 5 6 6.6 7.62 8.21 8.89 9.7 0.1 +h 8 1 8 8 8 8 8 8 8 8 8 12 5 10 11 7 7 6 7 8 10 11 11.9 11.20 10.84 10.04 8.4 -0.2 +g 8 2 -4 -4 -4 -4 -3 -3 -3 -3 -3 -8 -4 -6 -4 -4 -2 -1 0 0 -1 -6 -9.2 -11.73 -14.50 -16.78 -17.6 -0.1 +h 8 2 -14 -15 -15 -15 -15 -15 -15 -15 -14 -21 -22 -15 -14 -12 -15 -16 -18 -19 -19 -21 -21.5 -20.88 -20.03 -18.26 -15.3 0.6 +g 8 3 -9 -9 -9 -9 -9 -9 -9 -9 -10 -5 -1 -14 -11 -14 -13 -12 -11 -11 -10 -9 -7.9 -6.88 -5.59 -3.16 -0.5 0.4 +h 8 3 7 7 6 6 6 6 5 5 5 -12 0 5 7 9 6 4 4 5 6 8 8.5 9.83 11.83 13.18 12.8 -0.2 +g 8 4 1 1 1 2 2 2 2 1 1 9 11 6 2 0 -3 -8 -7 -9 -12 -14 -16.6 -18.11 -19.34 -20.56 -21.1 -0.1 +h 8 4 -13 -13 -13 -13 -14 -14 -14 -15 -15 -7 -21 -23 -18 -16 -17 -19 -22 -23 -22 -23 -21.5 -19.71 -17.41 -14.60 -11.7 0.5 +g 8 5 2 2 2 3 4 4 5 6 6 7 15 10 10 8 5 4 4 4 3 9 9.1 10.17 11.61 13.33 15.3 0.4 +h 8 5 5 5 5 5 5 5 5 5 5 2 -8 3 4 4 6 6 9 11 12 15 15.5 16.22 16.71 16.16 14.9 -0.3 +g 8 6 -9 -8 -8 -8 -7 -7 -6 -6 -5 -10 -13 -7 -5 -1 0 0 3 4 4 6 7.0 9.36 10.85 11.76 13.7 0.3 +h 8 6 16 16 16 16 17 17 18 18 19 18 17 23 23 24 21 18 16 14 12 11 8.9 7.61 6.96 5.69 3.6 -0.4 +g 8 7 5 5 5 6 6 7 8 8 9 7 5 6 10 11 11 10 6 4 2 -5 -7.9 -11.25 -14.05 -15.98 -16.5 -0.1 +h 8 7 -5 -5 -5 -5 -5 -5 -5 -5 -5 3 -4 -4 1 -3 -6 -10 -13 -15 -16 -16 -14.9 -12.76 -10.74 -9.10 -6.9 0.5 +g 8 8 8 8 8 8 8 8 8 7 7 2 -1 9 8 4 3 1 -1 -4 -6 -7 -7.0 -4.87 -3.54 -2.02 -0.3 0.4 +h 8 8 -18 -18 -18 -18 -19 -19 -19 -19 -19 -11 -17 -13 -20 -17 -16 -17 -15 -11 -10 -4 -2.1 -0.06 1.64 2.26 2.8 0.0 +g 9 0 8 8 8 8 8 8 8 8 8 5 3 4 4 8 8 7 5 5 4 4 5.0 5.58 5.50 5.33 5.0 0.0 +g 9 1 10 10 10 10 10 10 10 10 10 -21 -7 9 6 10 10 10 10 10 9 9 9.4 9.76 9.45 8.83 8.4 0.0 +h 9 1 -20 -20 -20 -20 -20 -20 -20 -20 -21 -27 -24 -11 -18 -22 -21 -21 -21 -21 -20 -20 -19.7 -20.11 -20.54 -21.77 -23.4 0.0 +g 9 2 1 1 1 1 1 1 1 1 1 1 -1 -4 0 2 2 2 1 1 1 3 3.0 3.58 3.45 3.02 2.9 0.0 +h 9 2 14 14 14 14 14 14 14 15 15 17 19 12 12 15 16 16 16 15 15 15 13.4 12.69 11.51 10.76 11.0 0.0 +g 9 3 -11 -11 -11 -11 -11 -11 -12 -12 -12 -11 -25 -5 -9 -13 -12 -12 -12 -12 -12 -10 -8.4 -6.94 -5.27 -3.22 -1.5 0.0 +h 9 3 5 5 5 5 5 5 5 5 5 29 12 7 2 7 6 7 9 9 11 12 12.5 12.67 12.75 11.74 9.8 0.0 +g 9 4 12 12 12 12 12 12 12 11 11 3 10 2 1 10 10 10 9 9 9 8 6.3 5.01 3.13 0.67 -1.1 0.0 +h 9 4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -9 2 6 0 -4 -4 -4 -5 -6 -7 -6 -6.2 -6.72 -7.14 -6.74 -5.1 0.0 +g 9 5 1 1 1 1 1 1 1 1 1 16 5 4 4 -1 -1 -1 -3 -3 -4 -8 -8.9 -10.76 -12.38 -13.20 -13.2 0.0 +h 9 5 -2 -2 -2 -2 -2 -2 -2 -3 -3 4 2 -2 -3 -5 -5 -5 -6 -6 -7 -8 -8.4 -8.16 -7.42 -6.88 -6.3 0.0 +g 9 6 -2 -2 -2 -2 -2 -2 -2 -2 -2 -3 -5 1 -1 -1 0 -1 -1 -1 -2 -1 -1.5 -1.25 -0.76 -0.10 1.1 0.0 +h 9 6 8 8 8 8 9 9 9 9 9 9 8 10 9 10 10 10 9 9 9 8 8.4 8.10 7.97 7.79 7.8 0.0 +g 9 7 2 2 2 2 2 2 3 3 3 -4 -2 2 -2 5 3 4 7 7 7 10 9.3 8.76 8.43 8.68 8.8 0.0 +h 9 7 10 10 10 10 10 10 10 11 11 6 8 7 8 10 11 11 10 9 8 5 3.8 2.92 2.14 1.04 0.4 0.0 +g 9 8 -1 0 0 0 0 0 0 0 1 -3 3 2 3 1 1 1 2 1 1 -2 -4.3 -6.66 -8.42 -9.06 -9.3 0.0 +h 9 8 -2 -2 -2 -2 -2 -2 -2 -2 -2 1 -11 -6 0 -4 -2 -3 -6 -7 -7 -8 -8.2 -7.73 -6.08 -3.89 -1.4 0.0 +g 9 9 -1 -1 -1 -1 -1 -1 -2 -2 -2 -4 8 5 -1 -2 -1 -2 -5 -5 -6 -8 -8.2 -9.22 -10.08 -10.54 -11.9 0.0 +h 9 9 2 2 2 2 2 2 2 2 2 8 -7 5 5 1 1 1 2 2 2 3 4.8 6.01 7.01 8.44 9.6 0.0 +g 10 0 -3 -3 -3 -3 -3 -3 -3 -3 -3 -3 -8 -3 1 -2 -3 -3 -4 -4 -3 -3 -2.6 -2.17 -1.94 -2.01 -1.9 0.0 +g 10 1 -4 -4 -4 -4 -4 -4 -4 -4 -4 11 4 -5 -3 -3 -3 -3 -4 -4 -4 -6 -6.0 -6.12 -6.24 -6.26 -6.2 0.0 +h 10 1 2 2 2 2 2 2 2 2 2 5 13 -4 4 2 1 1 1 1 2 1 1.7 2.19 2.73 3.28 3.4 0.0 +g 10 2 2 2 2 2 2 2 2 2 2 1 -1 -1 4 2 2 2 2 3 2 2 1.7 1.42 0.89 0.17 -0.1 0.0 +h 10 2 1 1 1 1 1 1 1 1 1 1 -2 0 1 1 1 1 0 0 1 0 0.0 0.10 -0.10 -0.40 -0.2 0.0 +g 10 3 -5 -5 -5 -5 -5 -5 -5 -5 -5 2 13 2 0 -5 -5 -5 -5 -5 -5 -4 -3.1 -2.35 -1.07 0.55 1.7 0.0 +h 10 3 2 2 2 2 2 2 2 2 2 -20 -10 -8 0 2 3 3 3 3 3 4 4.0 4.46 4.71 4.55 3.6 0.0 +g 10 4 -2 -2 -2 -2 -2 -2 -2 -2 -2 -5 -4 -3 -1 -2 -1 -2 -2 -2 -2 -1 -0.5 -0.15 -0.16 -0.55 -0.9 0.0 +h 10 4 6 6 6 6 6 6 6 6 6 -1 2 -2 2 6 4 4 6 6 6 5 4.9 4.76 4.44 4.40 4.8 0.0 +g 10 5 6 6 6 6 6 6 6 6 6 -1 4 7 4 4 6 5 5 5 4 4 3.7 3.06 2.45 1.70 0.7 0.0 +h 10 5 -4 -4 -4 -4 -4 -4 -4 -4 -4 -6 -3 -4 -5 -4 -4 -4 -4 -4 -4 -5 -5.9 -6.58 -7.22 -7.92 -8.6 0.0 +g 10 6 4 4 4 4 4 4 4 4 4 8 12 4 6 4 4 4 3 3 3 2 1.0 0.29 -0.33 -0.67 -0.9 0.0 +h 10 6 0 0 0 0 0 0 0 0 0 6 6 1 1 0 0 -1 0 0 0 -1 -1.2 -1.01 -0.96 -0.61 -0.1 0.0 +g 10 7 0 0 0 0 0 0 0 0 0 -1 3 -2 1 0 1 1 1 1 1 2 2.0 2.06 2.13 2.13 1.9 0.0 +h 10 7 -2 -2 -2 -2 -2 -2 -2 -1 -1 -4 -3 -3 -1 -2 -1 -1 -1 -1 -2 -2 -2.9 -3.47 -3.95 -4.16 -4.3 0.0 +g 10 8 2 2 2 1 1 1 1 2 2 -3 2 6 -1 2 0 0 2 2 3 5 4.2 3.77 3.09 2.33 1.4 0.0 +h 10 8 4 4 4 4 4 4 4 4 4 -2 6 7 6 3 3 3 4 4 3 1 0.2 -0.86 -1.99 -2.85 -3.4 0.0 +g 10 9 2 2 2 2 3 3 3 3 3 5 10 -2 2 2 3 3 3 3 3 1 0.3 -0.21 -1.03 -1.80 -2.4 0.0 +h 10 9 0 0 0 0 0 0 0 0 0 0 11 -1 0 0 1 1 0 0 -1 -2 -2.2 -2.31 -1.97 -1.12 -0.1 0.0 +g 10 10 0 0 0 0 0 0 0 0 0 -2 3 0 0 0 -1 -1 0 0 0 0 -1.1 -2.09 -2.80 -3.59 -3.8 0.0 +h 10 10 -6 -6 -6 -6 -6 -6 -6 -6 -6 -2 8 -3 -7 -6 -4 -5 -6 -6 -6 -7 -7.4 -7.93 -8.31 -8.72 -8.8 0.0 +g 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.7 2.95 3.05 3.00 3.0 0.0 +g 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.7 -1.60 -1.48 -1.40 -1.4 0.0 +h 11 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.26 0.13 0.00 0.0 0.0 +g 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.88 -2.03 -2.30 -2.5 0.0 +h 11 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.44 1.67 2.11 2.5 0.0 +g 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.5 1.44 1.65 2.08 2.3 0.0 +h 11 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.77 -0.66 -0.60 -0.6 0.0 +g 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.31 -0.51 -0.79 -0.9 0.0 +h 11 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.27 -1.76 -1.05 -0.4 0.0 +g 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.29 0.54 0.58 0.3 0.0 +h 11 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.90 0.85 0.76 0.6 0.0 +g 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.79 -0.79 -0.70 -0.7 0.0 +h 11 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.7 -0.58 -0.39 -0.20 -0.2 0.0 +g 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.53 0.37 0.14 -0.1 0.0 +h 11 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.8 -2.69 -2.51 -2.12 -1.7 0.0 +g 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.7 1.80 1.79 1.70 1.4 0.0 +h 11 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.08 -1.27 -1.44 -1.6 0.0 +g 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.16 0.12 -0.22 -0.6 0.0 +h 11 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.2 -1.58 -2.11 -2.57 -3.0 0.0 +g 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.2 0.96 0.75 0.44 0.2 0.0 +h 11 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.9 -1.90 -1.94 -2.01 -2.0 0.0 +g 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4.0 3.99 3.75 3.49 3.1 0.0 +h 11 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -1.39 -1.86 -2.34 -2.6 0.0 +g 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.2 -2.15 -2.12 -2.09 -2.0 0.0 +g 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.29 -0.21 -0.16 -0.1 0.0 +h 12 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.55 -0.87 -1.08 -1.2 0.0 +g 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.21 0.30 0.46 0.5 0.0 +h 12 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.23 0.27 0.37 0.5 0.0 +g 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.89 1.04 1.23 1.3 0.0 +h 12 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2.5 2.38 2.13 1.75 1.4 0.0 +g 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.38 -0.63 -0.89 -1.2 0.0 +h 12 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -2.6 -2.63 -2.49 -2.19 -1.8 0.0 +g 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.9 0.96 0.95 0.85 0.7 0.0 +h 12 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.61 0.49 0.27 0.1 0.0 +g 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.30 -0.11 0.10 0.3 0.0 +h 12 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.40 0.59 0.72 0.8 0.0 +g 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.46 0.52 0.54 0.5 0.0 +h 12 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.01 0.00 -0.09 -0.2 0.0 +g 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.3 -0.35 -0.39 -0.37 -0.3 0.0 +h 12 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 0.02 0.13 0.29 0.6 0.0 +g 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.36 -0.37 -0.43 -0.5 0.0 +h 12 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.28 0.27 0.23 0.2 0.0 +g 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 0.08 0.21 0.22 0.1 0.0 +h 12 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.87 -0.86 -0.89 -0.9 0.0 +g 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.49 -0.77 -0.94 -1.1 0.0 +h 12 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.34 -0.23 -0.16 0.0 0.0 +g 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.08 0.04 -0.03 -0.3 0.0 +h 12 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.8 0.88 0.87 0.72 0.5 0.0 +g 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.16 -0.09 -0.02 0.1 0.0 +g 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.88 -0.89 -0.92 -0.9 0.0 +h 13 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.76 -0.87 -0.88 -0.9 0.0 +g 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.30 0.31 0.42 0.5 0.0 +h 13 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0.33 0.30 0.49 0.6 0.0 +g 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 0.28 0.42 0.63 0.7 0.0 +h 13 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.8 1.72 1.66 1.56 1.4 0.0 +g 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.43 -0.45 -0.42 -0.3 0.0 +h 13 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.54 -0.59 -0.50 -0.4 0.0 +g 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1.3 1.18 1.08 0.96 0.8 0.0 +h 13 5 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -1.0 -1.07 -1.14 -1.24 -1.3 0.0 +g 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.37 -0.31 -0.19 0.0 0.0 +h 13 6 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.04 -0.07 -0.10 -0.1 0.0 +g 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.75 0.78 0.81 0.8 0.0 +h 13 7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.7 0.63 0.54 0.42 0.3 0.0 +g 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.4 -0.26 -0.18 -0.13 0.0 0.0 +h 13 8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.21 0.10 -0.04 -0.1 0.0 +g 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.35 0.38 0.38 0.4 0.0 +h 13 9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.6 0.53 0.49 0.48 0.5 0.0 +g 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.1 -0.05 0.02 0.08 0.1 0.0 +h 13 10 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.3 0.38 0.44 0.48 0.5 0.0 +g 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.4 0.41 0.42 0.46 0.5 0.0 +h 13 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.2 -0.22 -0.25 -0.30 -0.4 0.0 +g 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0 -0.10 -0.26 -0.35 -0.5 0.0 +h 13 12 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.5 -0.57 -0.53 -0.43 -0.4 0.0 +g 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.1 -0.18 -0.26 -0.36 -0.4 0.0 +h 13 13 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 -0.9 -0.82 -0.79 -0.71 -0.6 0.0