function ret = angularDistributionFunction(this, theta)
    %This function calculate the angle distribution of atoms coming out
    %from a single channel.
    
    KnudsenNumber = this.MeanFreePath/this.NozzleLength;

    alpha = 0.5 - (3*this.Beta^2)^-1 * ...
        ((1 - (2*this.Beta^3) + ((2*this.Beta^2) - 1) * sqrt(1+this.Beta^2)) / ...
        (sqrt(1+this.Beta^2) - (this.Beta^2 * asinh((this.Beta^2)^-1))));
    
    eta0 = alpha;
    eta1 = 1 - alpha;
    
    delta = (eta0./sqrt(2*KnudsenNumber*(eta1-eta0)))./sqrt(cos(theta));
    
    F = 2/sqrt(pi)* (1-eta1)/eta0 * delta.* exp( -(delta*eta1/eta0).^2 );
    q = this.Beta^-1 * tan(theta);
    R = acos(q) - (q .* sqrt(1-q.^2));
    
    if abs(q) >= 1 
        t = linspace(0,1,10000);
        S = sum(sqrt(1-t.^2).* ( erf(delta.*(1 + (t.*(eta1-eta0)./(q.*eta0)) ))-erf(delta)))*(t(2)-t(1));
        if S == 0 || isnan(S)
            ret = eta0*cos(theta);
        else
            ret = eta0*cos(theta)+ 2/sqrt(pi)*eta0*cos(theta) * (exp(delta.^2)/delta) * S;
        end
    else
        t = linspace(0,q,10000);
        S = sum(sqrt(1-t.^2).* ( erf(delta.*(1 + (t.*(eta1-eta0)./(q.*eta0)) ))-erf(delta)))*(t(2)-t(1));
        if isnan(S)
            S=0;
        end
        ret = 2/sqrt(pi)*eta0*cos(theta)*(exp(delta.^2)/delta) * (R./2*(erf(delta*eta1/eta0)-erf(delta)+F)+S)+eta0*cos(theta);
    end
end