Ejemplo n.º 1
0
from bokeh.plotting import figure, output_file, save
from scipy import integrate
import requests
from bokeh.plotting import figure, output_file, show
from QuerySingleOSC import querry_single_osc
from UpdateTitle import update_title
from BlackbodyFunction import blackbody
from QueryDistance import querry_distance
from bokeh.models.sources import AjaxDataSource
from bokeh import events
import pandas as pd

photometry_time, photometry_mag, photometry_sigma, photometry_band, detection = querry_single_osc(
    "DES17C1ffz")

lumdist, redshift = querry_distance("DES17C1ffz")

N = 200
t_original = np.linspace(0, 100, N)
t = t_original
M = 5 * (1.989 * (10**33))
f = 0.5
k = 0.25
v = 12 * (10**8)
tn = 8.8
B = 13.8
c = 3 * (10**10)
E = 3.9 * (10**10)
td = (((2 * k * M) / (B * c * v))**(1. / 2.)) / 60. / 60. / 24.
integrand = (t / td) * (np.exp(t**2 / td**2)) * (np.exp(-t / tn))
my_int = integrate.cumtrapz(t, integrand, initial=0)
Ejemplo n.º 2
0
def index():
    photometry_time, photometry_mag, photometry_sigma, photometry_band, detection = querry_single_osc(
        "DES17C1ffz")

    lumdist, redshift = querry_distance("DES17C1ffz")

    N = 200
    t_original = np.linspace(0, 100, N)
    t = t_original
    M = 5 * (1.989 * (10**33))
    f = 0.5
    k = 0.25
    v = 12 * (10**8)
    tn = 8.8
    B = 13.8
    c = 3 * (10**10)
    E = 3.9 * (10**10)
    td = (((2 * k * M) / (B * c * v))**(1. / 2.)) / 60. / 60. / 24.
    integrand = (t / td) * (np.exp(t**2 / td**2)) * (np.exp(-t / tn))
    my_int = integrate.cumtrapz(t, integrand, initial=0)
    L = ((2 * M * f) /
         (td * 24 * 60 * 60)) * (np.exp(-t**2) / td**2) * E * my_int

    source = ColumnDataSource(
        data=dict(x=t, y=L, yB=L, yr=L, yi=L, yV=L, yU=L))

    callback2 = CustomJS(args=dict(source=source),
                         code="""
    	var request = new XMLHttpRequest();
    	request.open('GET', 'https://astrocats.space/api/DES17C1ffz/lumdist+redshift');
    	console.log(request);

    	""")
    callback = CustomJS(args=dict(source=source),
                        code="""

    function numerically_integrate(a, b, dx, f,td) {
        
        // calculate the number of trapezoids
        n = (b - a) / dx;
        
        // define the variable for area
        Area = 0;
        
        //loop to calculate the area of each trapezoid and sum.
        for (i = 1; i <= n; i++) {
            //the x locations of the left and right side of each trapezpoid
            x0 = a + (i-1)*dx;
            x1 = a + i*dx;
            
            // the area of each trapezoid
            Ai = dx * (f(x0,td) + f(x1,td))/ 2.;
            
            // cumulatively sum the areas
            Area = Area + Ai    
            
        } 
        return Area;
    }


    //define function to be integrated
    function f1(x,td){
        return x / td * Math.exp(Math.pow(x/td,2)) * Math.exp(-x/8.77);
    }

    function f2(x,td){
        return x / td * Math.exp(Math.pow(x/td,2)) * Math.exp(-x/111);
    }

    dx = 0.5;       // width of the trapezoids

    var tni = 8.8;
    var tco = 111.3;
    var epni = 3.9e10;
    var epco = 6.8e9;
    var beta = 13.8;
    var c = 1.0e10;
    var msol = 2e33;
    var m = mej.value;
    m = m * msol;
    var wav = 6e-5;
    var mni = fni.value;
    mni = mni * m;
    var T = T.value;
    var v = vej.value;
    v = v * Math.pow (10,5);
    var k = k.value;
    var td = Math.sqrt(2. * k * m / (beta * c * v)) / 86400;
    var data = source.data;
    var xstop = 0.0;
    x = data['x']
    y = data['y']
    console.log(x);
    console.log(y);
    var distance = distance.value * 3e24;
    var redshift = redshift.value;
    redshift = parseFloat(redshift);
    for (j = 0; j < x.length; j++) {
        xstop = j * dx;
        int1 = numerically_integrate(0,xstop,dx,f1,td);
        int2 = numerically_integrate(0,xstop,dx,f2,td);
        factor = 2 * mni / td * Math.exp(-Math.pow(xstop/td,2));
        L = factor * ((epni-epco) * int1 + epco * int2) / (4.*3.14*Math.pow(distance,2));
        y[j] = -2.5 * Math.log10(L*wav/c)-48.3;
        x[j] = (dx*(1+redshift)) * j + T;
    }
    source.change.emit();
    """)

    plot = figure(
        plot_height=400,
        plot_width=400,
        title="Super cool blackbody curve thing",
        tools="crosshair,pan,reset,save,wheel_zoom",
        x_range=[np.min(photometry_time) - 20,
                 np.max(photometry_time) + 100],
        y_range=[np.max(photometry_mag),
                 np.min(photometry_mag)])

    plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
    #plot.line('x', 'yB', source=source, line_width=3, line_alpha=0.6, color="pink")
    #plot.line('x', 'yr', source=source, line_width=3, line_alpha=0.6, color="orange")
    #plot.line('x', 'yi', source=source, line_width=3, line_alpha=0.6, color="blue")
    #plot.line('x', 'yV', source=source, line_width=3, line_alpha=0.6, color="turquoise")
    #plot.line('x', 'yU', source=source, line_width=3, line_alpha=0.6, color="purple")

    arrayoftimes = np.array(photometry_time)

    text = TextInput(title="title", value='my parabola', callback=callback2)
    lumdist_input = TextInput(title="title", value=str(lumdist))
    redshift_input = TextInput(title="title", value=str(redshift))

    M_slider = Slider(start=0.1,
                      end=10,
                      value=1,
                      step=.1,
                      title="Ejecta Mass",
                      callback=callback)
    f_slider = Slider(start=0.01,
                      end=1.0,
                      value=0.1,
                      step=.01,
                      title="Nickel Fraction",
                      callback=callback)
    v_slider = Slider(start=5000,
                      end=20000,
                      value=10000,
                      step=1000,
                      title="Ejecta Velocity",
                      callback=callback)
    k_slider = Slider(start=0.1,
                      end=0.4,
                      value=0.2,
                      step=.01,
                      title="Opacity",
                      callback=callback)
    T_slider = Slider(title="Time",
                      value=arrayoftimes.min() - 10,
                      start=arrayoftimes.min() - 10,
                      end=arrayoftimes.max() + 10,
                      step=10,
                      callback=callback)

    callback.args["mej"] = M_slider
    callback.args["fni"] = f_slider
    callback.args["vej"] = v_slider
    callback.args["k"] = k_slider
    callback.args["T"] = T_slider

    callback.args["distance"] = lumdist_input
    callback.args["redshift"] = redshift_input

    count = 0
    for x in photometry_time:
        if photometry_band[count] == "r":
            plot.circle(x,
                        photometry_mag[count],
                        size=5,
                        color="orange",
                        alpha=0.5)
        elif photometry_band[count] == "i":
            plot.circle(x,
                        photometry_mag[count],
                        size=5,
                        color="blue",
                        alpha=0.5)
        elif photometry_band[count] == "g":
            plot.circle(x,
                        photometry_mag[count],
                        size=5,
                        color="turquoise",
                        alpha=0.5)
        elif photometry_band[count] == "z":
            plot.circle(x,
                        photometry_mag[count],
                        size=5,
                        color="purple",
                        alpha=0.5)
        elif photometry_band[count] == "B":
            plot.circle(x,
                        photometry_mag[count],
                        size=5,
                        color="pink",
                        alpha=0.5)
        count += 1

    text.on_change('value', update_title)

    def update_data(attrname, old, new):

        # Get the current slider values
        M = M_slider.value * 2.e33
        f = f_slider.value
        v = v_slider.value * 1.e5
        k = k_slider.value
        t = t_original
        tn = 8.8
        B = 13.8
        c = 3 * (10**10)
        E = 3.9 * (10**10)
        td = (((2. * k * M) / (B * c * v))**(1. / 2.)) / 60. / 60. / 24.
        integrand = (t / td) * (np.exp(t**2 / td**2)) * (np.exp(-t / tn))
        my_int = integrate.cumtrapz(integrand, t, initial=0)
        L = ((2. * M * f) / (td)) * (np.exp((-t**2) / td**2)) * E * my_int
        magnitude = -2.5 * np.log10(L / 4e33) + 4.3
        radii = v * t * 24 * 60 * 60
        temperature = (L / (4 * np.pi * (radii**2) * (5.67 * 10**-5)))**0.25
        county = 0
        wavelength = 5 * 10**-5
        wavelength_B = 4.45 * 10**-5
        wavelength_r = 6.58 * 10**-5
        wavelength_i = 8.06 * 10**-5
        wavelength_V = 5.51 * 10**-5
        wavelength_U = 3.65 * 10**-5
        distance = lumdist * (3 * 10**24)
        luminosityblackbody = blackbody(
            radii, temperature, 5. *
            (10**-5) * np.ones(len(radii))) * wavelength**2 / c / distance**2
        luminosityblackbody_B = blackbody(
            radii, temperature, 5. *
            (10**-5) * np.ones(len(radii))) * wavelength_B**2 / c / distance**2
        luminosityblackbody_r = blackbody(
            radii, temperature, 5. *
            (10**-5) * np.ones(len(radii))) * wavelength_r**2 / c / distance**2
        luminosityblackbody_i = blackbody(
            radii, temperature, 5. *
            (10**-5) * np.ones(len(radii))) * wavelength_i**2 / c / distance**2
        luminosityblackbody_V = blackbody(
            radii, temperature, 5. *
            (10**-5) * np.ones(len(radii))) * wavelength_V**2 / c / distance**2
        luminosityblackbody_U = blackbody(
            radii, temperature, 5. *
            (10**-5) * np.ones(len(radii))) * wavelength_U**2 / c / distance**2
        magblackbody = -2.5 * np.log10(luminosityblackbody) - 48.6
        magblackbody_B = -2.5 * np.log10(luminosityblackbody_B) - 48.6
        magblackbody_r = -2.5 * np.log10(luminosityblackbody_r) - 48.6
        magblackbody_i = -2.5 * np.log10(luminosityblackbody_i) - 48.6
        magblackbody_V = -2.5 * np.log10(luminosityblackbody_V) - 48.6
        magblackbody_U = -2.5 * np.log10(luminosityblackbody_U) - 48.6
        # Generate the new curve
        L = ((2. * M * f) / (td)) * (np.exp((-t**2) / td**2)) * E * my_int
        magnitude = -2.5 * np.log10(L / 4e33) + 4.3

        source.data = dict(x=t * (1. + redshift) + T_slider.value,
                           y=magblackbody,
                           yB=magblackbody_B,
                           yr=magblackbody_r,
                           yi=magblackbody_i,
                           yV=magblackbody_V,
                           yU=magblackbody_U)

    #for w in [M_slider,f_slider,v_slider, k_slider, T_slider]:
    #    w.on_change('value', update_data)

    # Set up layouts and add to document
    inputs = widgetbox(text, M_slider, f_slider, v_slider, k_slider, T_slider)
    layout = row(
        plot,
        inputs,
    )

    output_file("NewBokeh.html")

    script, div = components(plot)
    return render_template("blah.html", script=script, div=div)
    show(layout)