% ------------------------------------------------------------------------
% Copyright (C) 2008-2010
% Bruce Bassett Yabebal Fantaye  Renee Hlozek  Jacques Kotze
%
%
%
% This file is part of Fisher4Cast.
%
% Fisher4Cast is free software: you can redistribute it and/or modify
% it under the terms of the Berkeley Software Distribution (BSD) license.
%
% Fisher4Cast is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% BSD license for more details.
% ------------------------------------------------------------------------
%
% This function calculates the Fisher derivatives for the Hubble parameter
% H(a). It is named fisher_deriv_1.m as it is labelled by the first index of the vector of observables in the input structure
% It is used in FM_run.m to create a general Fisher Matrix of the (input.num_observables) observables, with
% an additional prior matrix (input.prior).
% 
% It expects as input:
%   data - a vector of length of the number of data points (in the
%           cosmological example this is the number of redshift bins.) 

%   base_values - a vector of length of the numbers of parameters 
%                    you are interested in, whose values are specified by
%                    the input.fiducial.model
% It returns:
%   deriv_mat - a matrix of Fisher derivatives ordered by the fiducial base
%               vector, evaluated at the data points
%   h         - the function value evaluated at the data points    

function [deriv_mat, h] = FM_analytic_deriv_1(data, base_values);
double all;
global input;
z = data(:); % making sure that the data is a column
base = base_values;% taking the base input model

% taking the values for the base model from the input model
h0 = base(1); 
om = base(2);
ok = base(3);
w0 = base(4);
wa = base(5);

if ok ==0
    aval = 1;
else
    aval = 1/h0.*(sqrt(1./ok)); % calculating the radius of curvature
end
%--------------------------------------------------------------------------
% f and its derivatives
f = CPL(z, aval,  w0, wa); % taking the function for f as the CPL parameterisation w = w0 +wa z/(1+z)
dfdw0 = f.*3.*log(1+z); % the f derivative wrt w0
dfdwa = f.*3.*(log(1+z) - z./(1+z)); % the f derivative wrt wa
%--------------------------------------------------------------------------
e = E(z, aval, h0, om, ok, w0, wa); % the function for E(z)
h = h0.*e; % calculating the Hubble parameter

%--------------------------------------------------------------------------
% The Fisher derivatives
dhdho = e;
dhdho./h;
dhdom = h0./(2.*e).*((1+z).^(3) - f) ;
dhdom./h;
dhdok = h0./(2.*e).*(-f + +(1+z).^2);
dhdw0 = h0./(2.*e).*((1-om-ok).*dfdw0);
dhdwa = h0./(2.*e).*((1-om-ok).*dfdwa);

% Saving the derivatives into a matrix to be returned
deriv_mat = [dhdho, dhdom, dhdok, dhdw0, dhdwa];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% EXTERNAL FUNCTIONS
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function  e = E(z, aval, h0, om, ok, w0, wa);
f = CPL(z, aval, w0, wa);
e = sqrt(om.*(1+z).^(3) + (1-om-ok).*f + ok.*(1+z).^(2));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function fcpl = CPL(z, aval, w0, wa);
fcpl = (1+z).^(3.*(1+w0+wa)).*exp(-3.*wa.*(z.*(1+z).^(-1) ));