Пример #1
0
    data_plot_dr.axes[3][0].set_title(r"IFN$\alpha$ 2019-02-14 data")
    data_plot_dr.axes[3][1].set_title(r"IFN$\beta$ 2019-02-14 data")

    dr_fig, dr_axes = data_plot_dr.show_figure(save_flag=False)
    dr_fig.set_size_inches(10.5, 28.5)
    dr_fig.savefig('results/GAB_NewData/compare_data_dr.pdf')

    # -------------------------
    # Time courses
    # -------------------------
    alpha_palette_new = sns.color_palette("Reds", 8)
    beta_palette_new = sns.color_palette("Greens", 8)
    alpha_palette_old = sns.color_palette("Reds", 8)
    beta_palette_old = sns.color_palette("Greens", 8)

    data_plot_tc = TimecoursePlot((4, 2))
    alpha_mask = [0]
    beta_mask = [0]
    # Add data
    # Alpha
    # alpha_doses_20190214
    for idx, d in enumerate(alpha_doses):
        # Optional mask:
        if d not in alpha_mask:
            atc = IfnData('custom', df=newdata_4.data_set.loc['Alpha', d, :])
            data_plot_tc.add_trajectory(atc,
                                        'scatter',
                                        alpha_palette_new[idx], (3, 0),
                                        label='Alpha ' + str(d))
            data_plot_tc.add_trajectory(atc,
                                        'plot',
Пример #2
0
    for j in range(len(doses_alpha)):
        alpha_IfnData_objects.append(
            IfnData('custom',
                    df=alpha_time_courses[j],
                    conditions={'Alpha': {
                        'Ib': 0
                    }}))
    for j in range(len(doses_beta)):
        beta_IfnData_objects.append(
            IfnData('custom',
                    df=beta_time_courses[j],
                    conditions={'Beta': {
                        'Ia': 0
                    }}))
    # Generate plot
    time_course_paper_fig = TimecoursePlot((1, 2))
    alpha_mask = [0]
    beta_mask = [0]

    # Add fits
    for j, dose in enumerate(doses_alpha):
        if dose not in alpha_mask:
            time_course_paper_fig.add_trajectory(alpha_IfnData_objects[j],
                                                 'plot', alpha_palette[j],
                                                 (0, 0))
    for j, dose in enumerate(doses_beta):
        if dose not in beta_mask:
            time_course_paper_fig.add_trajectory(beta_IfnData_objects[j],
                                                 'plot', beta_palette[j],
                                                 (0, 1))
    # Add data
Пример #3
0
    for j in range(5):
        alpha_IfnData_objects.append(
            IfnData('custom',
                    df=alpha_time_courses[j],
                    conditions={'Alpha': {
                        'Ib': 0
                    }}))
    for j in range(5):
        beta_IfnData_objects.append(
            IfnData('custom',
                    df=beta_time_courses[j],
                    conditions={'Beta': {
                        'Ia': 0
                    }}))
    # Generate plot
    new_fit = TimecoursePlot((1, 2))
    alpha_mask = []
    beta_mask = []

    # Add fits
    for j, dose in enumerate([10, 90, 600, 4000, 8000]):
        if dose not in alpha_mask:
            new_fit.add_trajectory(alpha_IfnData_objects[j],
                                   'plot',
                                   alpha_palette[j], (0, 0),
                                   label='Alpha ' + str(dose))
    for j, dose in enumerate([10, 90, 600, 2000, 11000]):
        if dose not in beta_mask:
            new_fit.add_trajectory(beta_IfnData_objects[j],
                                   'plot',
                                   beta_palette[j], (0, 1),
Пример #4
0
                    }}))
        beta_IfnData_objects_int.append(
            IfnData('custom',
                    df=beta_time_courses_int[j],
                    conditions={'Beta': {
                        'Ia': 0
                    }}))
        beta_IfnData_objects_rec.append(
            IfnData('custom',
                    df=beta_time_courses_rec[j],
                    conditions={'Beta': {
                        'Ia': 0
                    }}))

    # Generate plot
    tc_plot = TimecoursePlot((3, 2))

    # Add fits
    for j, dose in enumerate(alpha_doses):
        if dose not in alpha_mask:
            tc_plot.add_trajectory(alpha_IfnData_objects[j],
                                   'plot',
                                   alpha_palette[j], (0, 0),
                                   label='Alpha ' + str(dose),
                                   linewidth=2.0)
            tc_plot.add_trajectory(alpha_IfnData_objects_int[j],
                                   'plot',
                                   alpha_palette[j], (1, 0),
                                   label='Alpha ' + str(dose),
                                   linewidth=2.0)
            tc_plot.add_trajectory(alpha_IfnData_objects_rec[j],
Пример #5
0
 beta_IfnData_objects = []
 for j in range(7):
     alpha_IfnData_objects.append(
         IfnData('custom',
                 df=alpha_time_courses[j],
                 conditions={'Alpha': {
                     'Ib': 0
                 }}))
     beta_IfnData_objects.append(
         IfnData('custom',
                 df=beta_time_courses[j],
                 conditions={'Beta': {
                     'Ia': 0
                 }}))
 # Generate plot
 new_fit = TimecoursePlot((1, 2))
 alpha_mask = [5, 50, 250]
 beta_mask = [0.1, 5, 200]
 # Add fits
 for j, dose in enumerate([5, 50, 250, 500, 5000, 25000, 50000]):
     if dose not in alpha_mask:
         new_fit.add_trajectory(alpha_IfnData_objects[j],
                                'plot',
                                alpha_palette[j + 2], (0, 0),
                                label='Alpha ' + str(dose))
 for j, dose in enumerate([0.1, 1, 5, 10, 100, 200, 1000]):
     if dose not in beta_mask:
         new_fit.add_trajectory(beta_IfnData_objects[j],
                                'plot',
                                beta_palette[j + 2], (0, 1),
                                label='Beta ' + str(dose))
Пример #6
0
def experimental_panel(cell_densities,
                       IFNAlpha_panel,
                       IFNBeta_panel,
                       times,
                       IFN_in_concentration=True):
    # ----------
    # Run model
    # ----------
    predictions = run_smooth_trajectories(cell_densities, IFNAlpha_panel,
                                          IFNBeta_panel, times)
    # -------------------------------
    # Plot model dose response curves
    # -------------------------------
    alpha_palette = sns.color_palette("deep", 6)
    beta_palette = sns.color_palette("deep", 6)

    # pSTAT plot
    STAT_plot = TimecoursePlot((len(IFNAlpha_panel), 2))
    for dose_idx, dose in enumerate(IFNAlpha_panel):
        color_counter = -1
        for density_idx, density in enumerate(cell_densities):
            color_counter += 1
            STAT_plot.add_trajectory(
                predictions[density][0],
                'plot',
                '-',
                subplot_idx=(dose_idx, 0),
                label=r'IFN$\alpha$ at {}$\times 10^6$ cells/mL'.format(
                    cell_densities[density_idx] / 1E9),
                doseslice=dose,
                dose_species='Alpha',
                color=alpha_palette[color_counter],
                linewidth=2)
    for dose_idx, dose in enumerate(IFNBeta_panel):
        color_counter = -1
        for density_idx, density in enumerate(cell_densities):
            color_counter += 1
            STAT_plot.add_trajectory(
                predictions[density][1],
                'plot',
                '-',
                subplot_idx=(dose_idx, 1),
                label=r'IFN$\beta$ at {}$\times 10^6$ cells/mL'.format(
                    cell_densities[density_idx] / 1E9),
                doseslice=dose,
                dose_species='Beta',
                color=beta_palette[color_counter],
                linewidth=2)
    fig, axes = STAT_plot.show_figure()
    for i in range(len(IFNAlpha_panel)):
        axes[i][0].set_title(r'IFN$\alpha$ at {} pM'.format(IFNAlpha_panel[i]))
        axes[i][1].set_title(r'IFN$\beta$ at {} pM'.format(IFNBeta_panel[i]))
    fig.set_size_inches(12, 9)
    fig.tight_layout()
    fig.savefig('varying_reaction_volume_STATtc.pdf')

    # Free extracellular IFN plot
    IFN_plot = TimecoursePlot((len(IFNAlpha_panel), 2))
    for ax in IFN_plot.axes.flat:
        ax.set_yscale('log')
    for i in range(len(IFNAlpha_panel)):
        if IFN_in_concentration:
            IFN_plot.axes[i][0].set_ylim(bottom=1E-3,
                                         top=max(IFNAlpha_panel) * 1E-2)
            IFN_plot.axes[i][1].set_ylim(bottom=1E-3,
                                         top=max(IFNBeta_panel) * 1E-2)
        else:
            IFN_plot.axes[i][0].set_ylim(bottom=1,
                                         top=max(IFNAlpha_panel) * 10**-12 *
                                         max(volume_panel) * 6.022E23)
            IFN_plot.axes[i][1].set_ylim(bottom=1,
                                         top=max(IFNBeta_panel) * 10**-12 *
                                         max(volume_panel) * 6.022E23)

    # Add fits
    for dose_idx, dose in enumerate(IFNAlpha_panel):
        color_counter = -1
        for density_idx, density in enumerate(cell_densities):
            color_counter += 1
            IFN_plot.add_trajectory(predictions[density][2],
                                    'plot',
                                    '-',
                                    subplot_idx=(dose_idx, 0),
                                    label=r'{}$\times 10^6$ cells/mL'.format(
                                        cell_densities[density_idx] / 1E9),
                                    doseslice=dose,
                                    dose_species='Alpha',
                                    color=alpha_palette[color_counter],
                                    linewidth=2)
    for dose_idx, dose in enumerate(IFNBeta_panel):
        color_counter = -1
        for density_idx, density in enumerate(cell_densities):
            color_counter += 1
            IFN_plot.add_trajectory(predictions[density][3],
                                    'plot',
                                    '-',
                                    subplot_idx=(dose_idx, 1),
                                    label=r'{}$\times 10^6$ cells/mL'.format(
                                        cell_densities[density_idx] / 1E9),
                                    doseslice=dose,
                                    dose_species='Beta',
                                    color=beta_palette[color_counter],
                                    linewidth=2)
    fig, axes = IFN_plot.show_figure()
    for i in range(len(IFNAlpha_panel)):
        axes[i][0].set_title(r'IFN$\alpha$ at {} pM'.format(IFNAlpha_panel[i]))
        axes[i][0].set_ylabel(r'Free IFN$\alpha$ (nM)')
        axes[i][1].set_title(r'IFN$\beta$ at {} pM'.format(IFNBeta_panel[i]))
        axes[i][1].set_ylabel(r'Free IFN$\beta$ (nM)')

    fig.set_size_inches(16, 12)
    fig.tight_layout()
    fig.savefig('varying_reaction_volume_IFNtc.pdf')
Пример #7
0
def testing_specific_values():
    volEC1 = 1 / (25E9)
    volEC2 = 1E-5
    # --------------------
    # Set up Model
    # --------------------
    # Parameters found by stepwise fitting GAB mean data
    # Note: can remove multiplicative factors on all K1, K2, K4 and still get very good fit to data (worst is 5 min beta)
    initial_parameters = {
        'k_a1': 4.98E-14 * 2,
        'k_a2': 8.30e-13 * 2,
        'k_d4': 0.006 * 3.8,
        'kpu': 0.00095,
        'ka2': 4.98e-13 * 2.45,
        'kd4': 0.3 * 2.867,
        'kint_a': 0.000124,
        'kint_b': 0.00086,
        'krec_a1': 0.0028,
        'krec_a2': 0.01,
        'krec_b1': 0.005,
        'krec_b2': 0.05
    }
    dual_parameters = {
        'kint_a': 0.00052,
        'kSOCSon': 6e-07,
        'kint_b': 0.00052,
        'krec_a1': 0.001,
        'krec_a2': 0.1,
        'krec_b1': 0.005,
        'krec_b2': 0.05
    }
    scale_factor = 1.227

    Mixed_Model = DualMixedPopulation('Mixed_IFN_ppCompatible', 0.8, 0.2)
    Mixed_Model.model_1.set_parameters(initial_parameters)
    Mixed_Model.model_1.set_parameters(dual_parameters)
    Mixed_Model.model_1.set_parameters({'R1': 12000.0, 'R2': 1511.1})
    Mixed_Model.model_2.set_parameters(initial_parameters)
    Mixed_Model.model_2.set_parameters(dual_parameters)
    Mixed_Model.model_2.set_parameters({'R1': 6755.56, 'R2': 1511.1})

    # ---------------------------------
    # Make theory dose response curves
    # ---------------------------------
    # Make predictions
    times = np.arange(0, 120, 0.5)  # [2.5, 5.0, 7.5, 10.0, 20.0, 60.0]
    alpha_doses_20190108 = [0, 10, 100, 300, 1000, 3000, 10000, 100000]
    beta_doses_20190108 = [0, 0.2, 6, 20, 60, 200, 600, 2000]

    # 1 uL
    ka1 = Mixed_Model.model_1.parameters['ka1']
    ka2 = Mixed_Model.model_1.parameters['ka2']
    k_a1 = Mixed_Model.model_1.parameters['k_a1']
    k_a2 = Mixed_Model.model_1.parameters['k_a2']
    Mixed_Model.set_global_parameters({
        'volEC': volEC1,
        'ka1': ka1 * 1E-5 / volEC1,
        'ka2': ka2 * 1E-5 / volEC1,
        'k_a1': k_a1 * 1E-5 / volEC1,
        'k_a2': k_a2 * 1E-5 / volEC1
    })
    dradf = Mixed_Model.mixed_dose_response(times,
                                            'TotalpSTAT',
                                            'Ia',
                                            list(logspace(1, 5.2)),
                                            parameters={'Ib': 0},
                                            sf=scale_factor)
    drbdf = Mixed_Model.mixed_dose_response(times,
                                            'TotalpSTAT',
                                            'Ib',
                                            list(logspace(-1, 4)),
                                            parameters={'Ia': 0},
                                            sf=scale_factor)

    dra15uL = IfnData('custom', df=dradf, conditions={'Alpha': {'Ib': 0}})
    drb15uL = IfnData('custom', df=drbdf, conditions={'Beta': {'Ia': 0}})

    # 1 mL
    Mixed_Model.set_global_parameters({
        'volEC': volEC2,
        'ka1': ka1 * 1E-5 / volEC2,
        'ka2': ka2 * 1E-5 / volEC2,
        'k_a1': k_a1 * 1E-5 / volEC2,
        'k_a2': k_a2 * 1E-5 / volEC2
    })
    dradf = Mixed_Model.mixed_dose_response(times,
                                            'TotalpSTAT',
                                            'Ia',
                                            list(logspace(1, 5.2)),
                                            parameters={'Ib': 0},
                                            sf=scale_factor)
    drbdf = Mixed_Model.mixed_dose_response(times,
                                            'TotalpSTAT',
                                            'Ib',
                                            list(logspace(-1, 4)),
                                            parameters={'Ia': 0},
                                            sf=scale_factor)

    dra5mL = IfnData('custom', df=dradf, conditions={'Alpha': {'Ib': 0}})
    drb5mL = IfnData('custom', df=drbdf, conditions={'Beta': {'Ia': 0}})

    # -------------------------------
    # Plot model dose response curves
    # -------------------------------
    alpha_palette = sns.color_palette("deep", 6)
    beta_palette = sns.color_palette("deep", 6)

    new_fit = DoseresponsePlot((2, 2))

    alpha_mask = [2.5, 5.0, 10.0, 20.0, 60.0]
    beta_mask = [2.5, 5.0, 10.0, 20.0, 60.0]
    # Add fits
    color_counter = -1
    for idx, t in enumerate(times):
        if t in alpha_mask:
            color_counter += 1
            new_fit.add_trajectory(dra15uL,
                                   t,
                                   'plot',
                                   alpha_palette[color_counter], (0, 0),
                                   'Alpha',
                                   label=str(t) + ' min',
                                   linewidth=2)
            new_fit.add_trajectory(dra5mL,
                                   t,
                                   'plot',
                                   alpha_palette[color_counter], (1, 0),
                                   'Alpha',
                                   label=str(t) + ' min',
                                   linewidth=2)

        if t in beta_mask:
            new_fit.add_trajectory(drb15uL,
                                   t,
                                   'plot',
                                   beta_palette[color_counter], (0, 1),
                                   'Beta',
                                   label=str(t) + ' min',
                                   linewidth=2)
            new_fit.add_trajectory(drb5mL,
                                   t,
                                   'plot',
                                   beta_palette[color_counter], (1, 1),
                                   'Beta',
                                   label=str(t) + ' min',
                                   linewidth=2)

    dr_fig, dr_axes = new_fit.show_figure()
    dr_axes[0][0].set_title(r'IFN$\alpha$ at {} L'.format(volEC1))
    dr_axes[0][1].set_title(r'IFN$\beta$ at {} L'.format(volEC1))
    dr_axes[1][0].set_title(r'IFN$\alpha$ at {} L'.format(volEC2))
    dr_axes[1][1].set_title(r'IFN$\beta$ at {} L'.format(volEC2))
    dr_fig.tight_layout()
    dr_fig.savefig('varying_reaction_volume_dr.pdf')

    # -------------------------------
    # Plot model dose response curves
    # -------------------------------
    tc_figure = TimecoursePlot((1, 2))

    alpha_testdose = list(logspace(1, 5.2))[24]
    beta_testdose = list(logspace(-1, 4))[17]
    print("Using {} for IFNalpha".format(alpha_testdose))
    print("Using {} for IFNbeta".format(beta_testdose))

    tc_figure.add_trajectory(dra15uL,
                             'plot',
                             '-',
                             subplot_idx=(0, 0),
                             label=r'IFN$\alpha$ at {} L'.format(volEC1),
                             doseslice=alpha_testdose,
                             dose_species='Alpha',
                             color=alpha_palette[1])
    tc_figure.add_trajectory(dra5mL,
                             'plot',
                             '-',
                             subplot_idx=(0, 0),
                             label=r'IFN$\alpha$ at {} L'.format(volEC2),
                             doseslice=alpha_testdose,
                             dose_species='Alpha',
                             color=alpha_palette[4])

    tc_figure.add_trajectory(drb15uL,
                             'plot',
                             '-',
                             subplot_idx=(0, 1),
                             label=r'IFN$\beta$ at {} L'.format(volEC1),
                             doseslice=beta_testdose,
                             dose_species='Beta',
                             color=beta_palette[0])
    tc_figure.add_trajectory(drb5mL,
                             'plot',
                             '-',
                             subplot_idx=(0, 1),
                             label=r'IFN$\beta$ at {} L'.format(volEC2),
                             doseslice=beta_testdose,
                             dose_species='Beta',
                             color=beta_palette[2])
    tc_figure.show_figure(save_flag=True,
                          save_dir='varying_reaction_volume_tc.pdf')

    # ------------------------------------
    # Now let's quickly look at IFN levels
    # ------------------------------------
    # 1 uL
    Mixed_Model.set_global_parameters({
        'volEC': volEC1,
        'ka1': ka1 * 1E-5 / volEC1,
        'ka2': ka2 * 1E-5 / volEC1,
        'k_a1': k_a1 * 1E-5 / volEC1,
        'k_a2': k_a2 * 1E-5 / volEC1
    })
    dradf = Mixed_Model.mixed_dose_response(times,
                                            'Free_Ia',
                                            'Ia',
                                            list(logspace(1, 5.2)),
                                            parameters={'Ib': 0},
                                            sf=scale_factor)
    drbdf = Mixed_Model.mixed_dose_response(times,
                                            'Free_Ib',
                                            'Ib',
                                            list(logspace(-1, 4)),
                                            parameters={'Ia': 0},
                                            sf=scale_factor)

    dra15uL = IfnData('custom', df=dradf, conditions={'Alpha': {'Ib': 0}})
    drb15uL = IfnData('custom', df=drbdf, conditions={'Beta': {'Ia': 0}})

    # 1 mL
    Mixed_Model.set_global_parameters({
        'volEC': volEC2,
        'ka1': ka1 * 1E-5 / volEC2,
        'ka2': ka2 * 1E-5 / volEC2,
        'k_a1': k_a1 * 1E-5 / volEC2,
        'k_a2': k_a2 * 1E-5 / volEC2
    })
    dradf = Mixed_Model.mixed_dose_response(times,
                                            'Free_Ia',
                                            'Ia',
                                            list(logspace(1, 5.2)),
                                            parameters={'Ib': 0},
                                            sf=scale_factor)
    drbdf = Mixed_Model.mixed_dose_response(times,
                                            'Free_Ib',
                                            'Ib',
                                            list(logspace(-1, 4)),
                                            parameters={'Ia': 0},
                                            sf=scale_factor)

    dra5mL = IfnData('custom', df=dradf, conditions={'Alpha': {'Ib': 0}})
    drb5mL = IfnData('custom', df=drbdf, conditions={'Beta': {'Ia': 0}})

    tc_figure = TimecoursePlot((1, 2))

    tc_figure.add_trajectory(dra15uL,
                             'plot',
                             '-',
                             subplot_idx=(0, 0),
                             label=r'IFN$\alpha$ at {} L'.format(volEC1),
                             doseslice=alpha_testdose,
                             dose_species='Alpha',
                             color=alpha_palette[1])
    tc_figure.add_trajectory(dra5mL,
                             'plot',
                             '-',
                             subplot_idx=(0, 0),
                             label=r'IFN$\alpha$ at {} L'.format(volEC2),
                             doseslice=alpha_testdose,
                             dose_species='Alpha',
                             color=alpha_palette[4])

    tc_figure.add_trajectory(drb15uL,
                             'plot',
                             '-',
                             subplot_idx=(0, 1),
                             label=r'IFN$\beta$ at {} L'.format(volEC1),
                             doseslice=beta_testdose,
                             dose_species='Beta',
                             color=beta_palette[0])
    tc_figure.add_trajectory(drb5mL,
                             'plot',
                             '-',
                             subplot_idx=(0, 1),
                             label=r'IFN$\beta$ at {} L'.format(volEC2),
                             doseslice=beta_testdose,
                             dose_species='Beta',
                             color=beta_palette[2])
    for ax in tc_figure.axes.flatten():
        ax.set_yscale('log')
    ifn_fig, ifn_axes = tc_figure.show_figure()
    ifn_axes[0].set_ylabel('IFN-alpha2')
    ifn_axes[1].set_ylabel('IFN-beta')
    ifn_fig.savefig('varying_reaction_volume_tc_IFN.pdf')
Пример #8
0
def timecourse_figure():
    # Get experimental data
    newdata_1 = IfnData("20190108_pSTAT1_IFN_Bcell")
    newdata_2 = IfnData("20190119_pSTAT1_IFN_Bcell")
    newdata_3 = IfnData("20190121_pSTAT1_IFN_Bcell")
    newdata_4 = IfnData("20190214_pSTAT1_IFN_Bcell")

    # Aligned data, to get scale factors for each data set
    alignment = DataAlignment()
    alignment.add_data([newdata_4, newdata_3, newdata_2, newdata_1])
    alignment.align()
    alignment.get_scaled_data()
    mean_data = alignment.summarize_data()

    # Plot
    green = sns.color_palette("deep")[2]
    red = sns.color_palette("deep")[3]
    light_green = sns.color_palette("pastel")[2]
    light_red = sns.color_palette("pastel")[3]
    plot = TimecoursePlot((1, 1))
    plot.add_trajectory(mean_data,
                        'errorbar',
                        'o--', (0, 0),
                        label=r'10 pM IFN$\alpha$2',
                        color=light_red,
                        dose_species='Alpha',
                        doseslice=10.0,
                        alpha=0.5)
    plot.add_trajectory(mean_data,
                        'errorbar',
                        'o--', (0, 0),
                        label=r'6 pM IFN$\beta$',
                        color=light_green,
                        dose_species='Beta',
                        doseslice=6.0,
                        alpha=0.5)
    plot.add_trajectory(mean_data,
                        'errorbar',
                        'o-', (0, 0),
                        label=r'3000 pM IFN$\alpha$2',
                        color=red,
                        dose_species='Alpha',
                        doseslice=3000.0)
    plot.add_trajectory(mean_data,
                        'errorbar',
                        'o-', (0, 0),
                        label=r'2000 pM IFN$\beta$',
                        color=green,
                        dose_species='Beta',
                        doseslice=2000.0)
    fname = os.path.join(os.getcwd(), 'results', 'Figures', 'Figure_4',
                         'Timecourse.pdf')
    plot.axes.set_ylabel('pSTAT1 (MFI)')
    plot.show_figure(show_flag=False, save_flag=True, save_dir=fname)
Пример #9
0
    # -------------------------------
    # Plot alignment of Time Course
    # -------------------------------
    species = alignment.scaled_data[0].get_dose_species()
    #   Make subtitles
    recorded_doses = alignment.scaled_data[0].get_doses()
    num_doses = len(recorded_doses[species[0]])
    titles = [species[0], species[1]]
    titles[0] += "\r\n\r\n{} pM".format(recorded_doses[species[0]][0])
    titles[1] += "\r\n\r\n{} pM".format(recorded_doses[species[1]][0])
    for d in range(1, num_doses):
        for s in species:
            titles.append(str(recorded_doses[s][d]) + ' pM')

    # Add fits
    tc_plot = TimecoursePlot((num_doses, len(species)))
    for i in range(num_doses):
        for j in range(len(species)):
            tc_plot.axes[i][j].set_title(titles[i * len(species) + j])

    for d_idx, dataset in enumerate(alignment.scaled_data):
        colour_palette = sns.color_palette(clist[d_idx], 1)
        for spec_idx, spec in enumerate(species):
            for dose_idx, dose in enumerate(recorded_doses[spec]):
                dose_dataset = pd.concat([dataset.data_set.loc[spec, dose, :]],
                                         keys=[spec],
                                         names=['Dose_Species'])
                dose_IfnData = IfnData('custom',
                                       df=dose_dataset,
                                       conditions=dataset.conditions)
                tc_plot.add_trajectory(dose_IfnData,