Source code for modest.plots.montecarloplots2

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import moment
# from .. setupfunctions import montecarlo
from .. utils.spacegeometry import sigmaDeltaT_Theoretical

[docs]def stdMean(vals): return np.abs(np.mean(vals)) + np.std(vals)
[docs]def meanError(vals): return np.mean(np.abs(vals))
[docs]def varVar(vals): variance = np.var(vals) fourthCentral = moment(vals,4) number = len(vals) varianceVariance = (fourthCentral - (np.power(variance,2)*(number-3))/(number-1))/number return varianceVariance
[docs]def stdStd(vals): return np.sqrt(varVar(vals))
[docs]def uniformStdDev(pulsarPeriod): return pulsarPeriod/np.sqrt(12)
[docs]def plotMCResults( resultsDict, abscissaDict, ordinateDict, ureg, plotType='line', axis=None, includeOnly=None, color=None, lineStyle='-', marker='o', markerSize=2, includeErrorBars=False ): if axis is None: myFig = plt.figure() axis = plt.gca() abscissaUnits=None ordinateUnits=None abscissaOrdinateValues ={} abscissaKeyList = None abscissaKeyList = abscissaDict['key'].split('.') for result in resultsDict: includeCurrent = False if not includeOnly: includeCurrent = True else: includeArray = [] for criteria in includeOnly: includeParam = result for key in criteria[0]: includeParam = includeParam[key] includeParam = includeParam['value'] if includeParam == criteria[1]: includeArray.append(True) else: includeArray.append(False) includeCurrent = np.all(includeArray) if includeCurrent: abscissaValue = result['parameters'] for abscissaKey in abscissaKeyList: abscissaValue = abscissaValue[abscissaKey] while 'value' not in abscissaValue: abscissaValue = abscissaValue[next(iter(abscissaValue))] abscissaUnits = abscissaValue['unit'] abscissaValue = abscissaValue['value'] if 'key' in ordinateDict: ordinateValue = result['results'][ordinateDict['key']] elif ordinateDict['function'] == 'sigmaDeltaT_Theoretical': pulsarPeriod = ( result['results']['pulsarPeriod']['value'] * ureg(result['results']['pulsarPeriod']['unit']) ).to(ureg.seconds).magnitude pulsarFlux = ( result['results']['pulsarFlux']['value'] ) backgroundCountRate = result['results']['backgroundCountRate']['value'] pulsedFraction = resultsDict[0]['results']['pulsedFraction']['value'] pulsarFWHM = resultsDict[0]['results']['pulsarFWHM']['value'] runtime = ( resultsDict[0]['parameters']['simulation']['runtime']['value'] * ureg(resultsDict[0]['parameters']['simulation']['runtime']['unit']) ).to(ureg.seconds).magnitude ordinateValue = { 'value': sigmaDeltaT_Theoretical( pulsarPeriod, pulsarFlux, pulsedFraction, pulsarFWHM, 1, runtime, backgroundFlux=backgroundCountRate ), 'unit': 'seconds' } if abscissaValue in abscissaOrdinateValues: abscissaOrdinateValues[abscissaValue].append(ordinateValue['value']) else: abscissaOrdinateValues[abscissaValue] = [ordinateValue['value']] if 'label' not in ordinateDict: ordinateDict['label'] = ordinateValue['comment'] ordinateUnits = ordinateValue['unit'] errorBars = [] if 'function' in ordinateDict: for abscissa, ordinate in abscissaOrdinateValues.items(): if ordinateDict['function'] == 'std + mean': # print(np.std(ordinate)) if includeErrorBars: myStdStd = stdStd(ordinate) errorBars += [myStdStd*3] ordinate = np.std(ordinate) + np.abs(np.mean(ordinate)) elif ordinateDict['function'] == 'uniformStdDev': ordinate = np.mean([uniformStdDev(subValue) for subValue in ordinate]) elif ordinateDict['function'] == 'sigmaDeltaT_Theoretical': ordinate = np.mean(ordinate) else: ordinate = getattr(np,ordinateDict['function'])(ordinate) abscissaOrdinateValues[abscissa] = ordinate abscissaOrdinateList = [(abscissa, ordinate) for abscissa, ordinate in abscissaOrdinateValues.items()] abscissaOrdinateList.sort() abscissaList = [abscissa for abscissa, ordinate in abscissaOrdinateList] ordinateList = [ordinate for abscissa, ordinate in abscissaOrdinateList] print(ordinateDict['label']) # print(abscissaList) # print(ordinateList) if plotType == 'line': if color: myLine = axis.plot(abscissaList, ordinateList, color=color,lw=4, ls=lineStyle, marker=marker, ms=markerSize) if errorBars: axis.errorbar(abscissaList,ordinateList,yerr=errorBars) else: myLine = axis.plot(abscissaList, ordinateList) myLabel = ordinateDict['label'] elif plotType == 'scatter': for counter in range(len(abscissaList)): abscissaList[counter] = np.ones(len(ordinateList[counter])) * abscissaList[counter] for subAbscissa, subOrdinate in zip(abscissaList, ordinateList): myLine = axis.scatter(subAbscissa, subOrdinate, color=color, marker=marker, s=markerSize) myLabel = ordinateDict['label'] return { 'line': myLine, 'label': myLabel, 'axis': axis, 'abscissaUnits': abscissaUnits, 'ordinateUnits': ordinateUnits }