3
4[\                 @   s2   d Z ddlZddlZddlmZ G dd dZdS )u  
This class calculates all the risk related with the cardiovascular system.
This is based on the article:

    D’Agostino, R. B., Vasan, R. S., Pencina, M. J., Wolf, P. A., Cobain,
    M., & Massaro, J. M. General cardiovascular risk profile for use in
    primary care the Framingham heart study. Circulation [Internet]. 2008;
    117: 743-53. Doi: https://doi.org/10.1161/CIRCULATIONAHA.107.699579

@author: Vertigo Biosystems
    N)expc               @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/S )0CardiovascularRiskc             C   sT   |j j| _|j j| _|jj| _|jj| _|jj| _|jj	| _	|j j
| _
|j j| _d S )N)	analyticscholesterolcholesterol_hdlanthropometryagesexhereditary_pathologiesdiabetes	lifestylesmokersbp_treatedsbp)selfhealth_info r   W/var/www/vitahealth/hygea.vitahealth/riskmap/src/vbs_riskmap/risk/CardiovascularRisk.py__init__   s    






zCardiovascularRisk.__init__c             C   s0   | j dk	r(| j dkrdS | j dkr,dS ndS dS )aN  
        This function runs a basic data for de baseline 10-year survival.

        This test is based on the Cox-formula article that can be found in
        documentation

        Parameters
        ----------
        self: sex

        Returns
        -------
        baseline_risk: int
        baseline 10-years survival

        NFgbg?MgKu?)r	   )r   r   r   r    baseline_survival_cardiovascular%   s    


z3CardiovascularRisk.baseline_survival_cardiovascularc       
      C   s  | j dk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| j dkob| j dkrtj	ddd(ddd	d
g}tj	ddd)ddddg}tj
| j tj
| jtj
| jg}| jdkr|jd |jtj
| j n|jtj
| j |jd |j| j |j| j tj	dddddddg}tj	dddddd d!g}| jd"krjt|| }t|| }n.| jd#krt|| }t|| }ntd$t|| }d%| j |  }	|	d& }	nd}	tjd't|	  |	S )*a  
        This function runs a basic test for cardiovascular risks.

        TBased on the original test made in the Cox.article.
        More information in the documentation.

        Parameters
        ----------
        self: age (between 30 and 75 years old), cholesterol, cholesterol_hdl,
              sex, sbp, sbp_treated, smoker, diabetes.

        Returns
        -------
        risk: float
        final risk

        N   K   gwkF}@gB>٬?gc?gvݰ?g%1 ?go?gAH0[?gwb֋@gS:X?g_?g@g	@g%@M-[?g|~!?Tr   g+@g|?5^@g&@gBfj@gȘ?gCiq?gp=
ף?gq@gAf@gn@g(\@gT?gcZB>?gUN@?r   r   z"Sex must be M (male) or F (female)   d   z2CardiovascularRisk: cox_cardiovascular_risk_test: gcg_)r   r   r	   r   r   r   r   r   nparraylogappendsum
ValueErrorr   r   loggingdebugstr)
r   Zmale_ErCZ
female_ErCZrisk_factorZmean_risk_factor_values_maleZmean_risk_factor_values_femaleZfirst_coefficientZsecond_coefficientexponentriskr   r   r   risk_cox_cardiovascular_test>   sL    






z/CardiovascularRisk.risk_cox_cardiovascular_testc             C   s   | j tddkrdS | j tddkr(dS | j tddkr<dS | j tddkrPd	S | j tdd
krddS | j td
dkrxdS | j tddkrdS | j tddkrdS | j tddkrdS | j dkrdS dS )aS  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for age.

        Parameters
        ----------
        self: age

        Returns
        -------
        punctuation: int
        final punctuation for age in women

        r   #   r   (      -      2      7      <      A   	   F   
   r         N)r   range)r   r   r   r   punctuation_age_female   s(    
z)CardiovascularRisk.punctuation_age_femalec             C   s\   | j dkrd	S | j tddkr"d
S | j tddkr6dS | j tddkrJdS | j dkrXdS dS )ak  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for HDL.

        Parameters
        ----------
        self: cholesterol_hdl

        Returns
        -------
        punctuation: int
        final punctuation for cholesterol_hdl in women

        r1   r*   r-   r   r+   r   r(   N)r   r9   )r   r   r   r   punctuation_hdl_female   s    

z)CardiovascularRisk.punctuation_hdl_femalec             C   s\   | j dkrdS | j tddkr"dS | j tddkr6dS | j tddkrJdS | j dkrXd	S d
S )ap  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for colesterol total.

        Parameters
        ----------
        self: cholesterol

        Returns
        -------
        punctuation: int
        final punctuation for cholesterol in women

           r      r         i  r,   r.   N)r   r9   )r   r   r   r   punctuation_cholesterol_female   s    

z1CardiovascularRisk.punctuation_cholesterol_femalec             C   sp   | j dkrdS | j tddkr"dS | j tddkr6dS | j tddkrJdS | j tdd	kr^d
S | j d	krldS dS )aj  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for non treated sbp.

        Parameters
        ----------
        self: sbp

        Returns
        -------
        punctuation: int
        final punctuation for non treated sbpin women

        x   rA      r      r      r*   r>   r,   r.   N)r   r9   )r   r   r   r   "punctuation_non_treated_sbp_female   s    

z5CardiovascularRisk.punctuation_non_treated_sbp_femalec             C   sp   | j dkrdS | j tddkr"dS | j tddkr6dS | j tddkrJdS | j tdd	kr^d
S | j d	krldS dS )ac  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for treated sbp.

        Parameters
        ----------
        self: sbp

        Returns
        -------
        punctuation: int
        final punctuation for treated sbp in women

        rC   r   rD   r*   rE   rA   rF   r.   r>      r0   Nr<   )r   r9   )r   r   r   r   punctuation_treated_sbp_female  s    

z1CardiovascularRisk.punctuation_treated_sbp_femalec             C   s   | j dkrdS dS dS )a]  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for smoker.

        Parameters
        ----------
        self: smoker

        Returns
        -------
        punctuation: int
        final punctuation for smoking in women

        TrA   r   N)r   )r   r   r   r   punctuation_smoker_female&  s    
z,CardiovascularRisk.punctuation_smoker_femalec             C   s   | j dkrdS dS dS )ab  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for diabetic.

        Parameters
        ----------
        self: diabetes

        Returns
        -------
        punctuation: int
        final punctuation for diabetic in women

        Tr,   r   N)r   )r   r   r   r   punctuation_diabetic_female<  s    
z.CardiovascularRisk.punctuation_diabetic_femalec             C   s2  |d.krdS |d/krdS |dkr$dS |dkr0dS |dkr<dS |dkrHd	S |d
krTdS |dkr`dS |dkrldS |dkrxdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |d k rd!S |d"k rd#S |d$k rd%S |d&krd'S |d(krd)S |d*kr d+S |d,kr.d-S d S )0Nr*   r   g      ?r   g333333?g      ?g333333?rA   g       @r,   g333333@r.   gffffff@rI   gffffff
@r0   g333333@r2   g      @r4   g333333@r6   g333333@r7   g333333@r8   g333333!@   g      $@   gffffff'@   gffffff+@   g/@   g     2@   g     5@   g8@   g     <@   r   r;   r<   r   )r   punctuationr   r   r   convert_calculation_femaleR  s`    






z-CardiovascularRisk.convert_calculation_femalec             C   s   |dk rdS |dkrdS |dkr$dS |dkr0dS |dkr<d	S |d
krHdS |dkrTdS |dkr`dS |dkrldS |dkrxdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS d S ) Nr   z<30   r*   "   rA   $   r,   '   r.   *   rI   r+   r0   0   r2   3   r4   r/   r6   ;   r7   @   r8   D   rM   I   rN   O   rO   z>80r   )r   rV   r   r   r   heart_age_female  s@    z#CardiovascularRisk.heart_age_femalec             C   s   | j tddkrdS | j tddkr(dS | j tddkr<dS | j tddkrPdS | j tdd	krdd
S | j td	dkrxdS | j tddkrdS | j tddkrdS | j tddkrdS | j dkrdS d S )Nr   r(   r)   r*   r+   r.   r-   rI   r/   r2   r1   r6   r3   r7   r5   r8   r   rN   rO   )r   r9   )r   r   r   r   punctuation_age_male  s(    
z'CardiovascularRisk.punctuation_age_malec             C   s\   | j dkrd	S | j tddkr"d
S | j tddkr6dS | j tddkrJdS | j dkrXdS dS )ai  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for HDL.

        Parameters
        ----------
        self: cholesterol_hdl

        Returns
        -------
        punctuation: int
        final punctuation for cholesterol_hdl in men

        r1   r*   r-   r   r+   r   r(   Nr;   r<   )r   r9   )r   r   r   r   punctuation_hdl_male  s    

z'CardiovascularRisk.punctuation_hdl_malec             C   s\   | j dkrdS | j tddkr"dS | j tddkr6dS | j tddkrJdS | j dkrXd	S d
S )an  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for colesterol total.

        Parameters
        ----------
        self: cholesterol

        Returns
        -------
        punctuation: int
        final punctuation for cholesterol in men

        r>   r   r?   r   r@   r*   i  rA   r,   N)r   r9   )r   r   r   r   punctuation_cholesterol_male  s    

z/CardiovascularRisk.punctuation_cholesterol_malec             C   s\   | j dkrd
S | j tddkr"dS | j tddkr6dS | j tddkrJdS | j dkrXdS d	S )ah  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for non treated sbp.

        Parameters
        ----------
        self: sbp

        Returns
        -------
        punctuation: int
        final punctuation for non treated sbpin men

        rC   r*   rD   r   rE   r   r>   rA   Nr;   )r   r9   )r   r   r   r    punctuation_non_treated_sbp_male  s    

z3CardiovascularRisk.punctuation_non_treated_sbp_malec             C   s\   | j dkrdS | j tddkr"dS | j tddkr6dS | j tddkrJdS | j dkrXd	S d
S )aa  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for treated sbp.

        Parameters
        ----------
        self: sbp

        Returns
        -------
        punctuation: int
        final punctuation for treated sbp in men

        rC   r   rD   r*   rE   rA   r>   r,   r.   N)r   r9   )r   r   r   r   punctuation_treated_sbp_male  s    

z/CardiovascularRisk.punctuation_treated_sbp_malec             C   s   | j dkrdS dS dS )a[  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for smoker.

        Parameters
        ----------
        self: smoker

        Returns
        -------
        punctuation: int
        final punctuation for smoking in men

        Tr,   r   N)r   )r   r   r   r   punctuation_smoker_male/  s    
z*CardiovascularRisk.punctuation_smoker_malec             C   s   | j dkrdS dS dS )a`  
        This function compute the punctuation for point-based framingham test
        in cardivascular risk.

        Based on the punctuation given in the paper for diabetic.

        Parameters
        ----------
        self: diabetes

        Returns
        -------
        punctuation: int
        final punctuation for diabetic in men

        TrA   r   N)r   )r   r   r   r   punctuation_diabetic_maleE  s    
z,CardiovascularRisk.punctuation_diabetic_malec             C   s  |d)krdS |d*krdS |d+kr$dS |dkr0dS |dkr<dS |dkrHd	S |dkrTd
S |dkr`dS |dkrldS |dkrxdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dk rd S |d!k rd"S |d#k rd$S |d%krd&S |d'krd(S d S ),NrA   r   r*   g?gffffff?r   g?gffffff?gffffff@gffffff@r,   gffffff
@r.   g333333@rI   g@r0   gffffff@r2   g@r4   g@r6   g"@r7   gffffff&@r8   gffffff*@rM   g333333/@rN   gffffff2@rO   g5@rP   gL9@rQ   gffffff=@rR   r   rG   r;   r<   r   )r   rV   r   r   r   convert_calculation_male[  sX    




z+CardiovascularRisk.convert_calculation_malec             C   s   |dk rdS |dkrdS |dkr$dS |dkr0dS |dkr<d	S |d
krHdS |dkrTdS |dkr`dS |dkrldS |dkrxdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |dkrdS |d krd!S |d"krd#S |d$k rd%S d S )&Nr   z<30r   r       r*   rY   rA   rZ   r,   &   r.   r)   rI   r\   r0   r+   r2   r]   r4   r^   r6   6   r7   9   r8   r1   rM   r`   rN   ra   rO   H   rP   L   rQ   z>80r   )r   rV   r   r   r   heart_age_male  sL    
z!CardiovascularRisk.heart_age_malec             C   sF  | j dk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdkob| jdkr,| jdkrvd}nd}| jdkr| j | j	  | j
  | j |  | j | j  | j  | j  }| j|}nX| jdkr0| j | j  | j  | j |  | j | j  | j  | j  }| j|}nd}tjd	t|  |S )
z
        Calculates the framingham test

        Inputs: cholesterol, cholesterol_hdl, age, sex, diabetes, smoker,
                sbp, sbp_treated
        Outputs: risk

        Nr   r   Tr   r   r   r   z*CardiovascularRisk: risk_framingham_test: )r   r   r   r	   r   r   r   r   r:   r=   rB   rH   rJ   rK   rL   rW   re   rf   rg   rh   ri   rj   rk   rl   r"   r#   r$   )r   sbp_aux_non_treatmentrV   r&   r   r   r   risk_framingham_test  s(    	

8
8
z'CardiovascularRisk.risk_framingham_testc             C   sF  | j dk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdk	ob| jdkob| jdkr,| jdkrvd}nd}| jdkr| j | j	  | j
  | j |  | j | j  | j  | j  }| j|}nX| jdkr0| j | j  | j  | j |  | j | j  | j  | j  }| j|}nd}tjd	t|  |S )
z
        Calculates "the heart age"

        Inputs: cholesterol, cholesterol_hdl, age (between 30 and 75 years
                old), sex, diabetes, smoker, sbp, sbp_treated

        Outputs: heart_age

        Nr   r   Tr   r   r   r   z%CardiovascularRisk: risk_heart_age : )r   r   r   r	   r   r   r   r   r:   r=   rB   rH   rJ   rK   rL   rd   re   rf   rg   rh   ri   rj   rk   rs   r"   r#   r$   )r   rt   rV   	heart_ager   r   r   risk_heart_age  s(    


8
8
z!CardiovascularRisk.risk_heart_ageN)__name__
__module____qualname__r   r   r'   r:   r=   rB   rH   rJ   rK   rL   rW   rd   re   rf   rg   rh   ri   rj   rk   rl   rs   ru   rw   r   r   r   r   r      s.   N&2$.(2r   )__doc__r"   numpyr   mathr   r   r   r   r   r   <module>   s   