o
    *j?                      @   sP  d dl Z d dlZd dlmZmZmZmZmZ d dlZd dl	Z
d dlZd dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZmZ d d	lmZ d d
lmZmZ d dlm Z  d dl!m"Z"m#Z# d dl$m%Z%m&Z&m'Z' d dl(m)Z) d dl*m+Z+ d dl,m-Z- e- Z.dgZ/dd Z0	 			dddZ1e j2e'j3ej3dG dd deZ4dS )    N)AnyDictListOptionalUnion)tensor_tree_map)	Pipelines)Model)model_config)proteinresidue_constants)UnifoldDatasetload_and_process)
OutputKeys)PipelineTensor)	PIPELINES)Preprocessorbuild_preprocessor)Fields
FrameworksTasks)device_placement)read_config)
get_loggerProteinStructurePipelinec                 C   sH   | dk rd}|S | dk rd}|S | dk rd}|S | dk r d}|S d	}|S )
Ni      i      i       i          )seq_len
chunk_sizer!   r!   x/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/pipelines/science/protein_structure_pipeline.pyautomatic_chunk_size    s   	r%   Fc           
      C   s   |sd }dg}|r|}n|}t tj|ddd  }|d u r2t| jd|d dd|||d	\}}	nt| jd|d dd|||d	\}}	t	|g}|S )	NAz
chains.txtzutf-8)encodingZpredictr   F)	configmodeseedZ	batch_idxZdata_idxZis_distillationsequence_idsZmonomer_feature_diruniprot_msa_dir)
openospathjoinreadlinesplitr   datar   Zcollater)
r(   Zdata_folderr*   is_multimeruse_uniprotsymmetry_groupr,   r+   batch_r!   r!   r$   load_feature_for_one_target.   sL   
r9   )module_namec                       s   e Zd Z	ddeeef dee f fddZdd Z	de
eef fd	d
Zde
eef de
eef fddZde
eef fddZ  ZS )r   Nmodelpreprocessorc                    sv   t  jd||d| t| jj| _t| jd d | _| jdd| _	|du r4| jj
}t|tj| _
| j  dS )a  Use `model` and `preprocessor` to create a protein structure pipeline for prediction.

        Args:
            model (str or Model): Supply either a local model dir which supported the protein structure task,
            or a model id from the model hub, or a torch model instance.
            preprocessor (Preprocessor): An optional preprocessor instance, please make sure the preprocessor fits for
            the model if supplied.

        Examples:
            >>> from modelscope.pipelines import pipeline
            >>> pipeline_ins = pipeline(task='protein-structure',
            >>>    model='DPTech/uni-fold-monomer')
            >>> protein = 'LILNLRGGAFVSNTQITMADKQKKFINEIQEGDLVRSYSITDETFQQNAVTSIVKHEADQLCQINFGKQHVVC'
            >>> print(pipeline_ins(protein))

        )r;   r<   pipeline
model_namepostprocessorNr!   )super__init__r   r;   Z	model_dircfgr
   r(   popr?   r<   r   r   Zscienceeval)selfr;   r<   kwargsZpreprocessor_cfg	__class__r!   r$   rA   d   s   z!ProteinStructurePipeline.__init__c                 K   s
   |||fS Nr!   )rE   Zpipeline_parametersr!   r!   r$   _sanitize_parameters   s   
z-ProteinStructurePipeline._sanitize_parametersreturnc              	   O   s   | di }| di }| di }| j|fi |}t| j| j% t  | j|fi |}W d    n1 s;w   Y  W d    n1 sJw   Y  | j|fi |}|S )Npreprocess_paramsforward_paramspostprocess_params)	get
preprocessr   Z	frameworkZdevice_nametorchno_gradforwardpostprocess)rE   inputargsrF   rL   rM   rN   outr!   r!   r$   _process_single   s   
z(ProteinStructurePipeline._process_singleinputsc              	   K   s  i }i }t j| jj|d }g }t| jd d D ]}td|fd }t| j	|||d |d | jj
d}	|	d jd	 }
t|
| jjj_t  d
d |	 D }	| |	}W d    n1 saw   Y  dd }tdd |	}	t||	}	tdd |d }t||}tdd |	}	tdd |}|d }t|}tj|d tjd	d}tj|	||d}| }t|||< |d r| jj
d u rtt|d ||< tt j||d d}|t| |t| W d    n1 sw   Y  qt !dt|  | jd d }| }|d }tt j||d}t"j#||dd W d    n	1 s.w   Y  |rgt !d t|  |d! }tt j||d}t"j#||dd W d    |S 1 sbw   Y  |S )"NZ	target_idr=   times*   i r4   )r4   r5   r6   Zaatypec                 S   s    i | ]\}}|t j|d dqS )zcuda:0)Zdevice)rQ   Z	as_tensor).0kvr!   r!   r$   
<dictcomp>   s    z4ProteinStructurePipeline.forward.<locals>.<dictcomp>c                 S   s$   | j tjks| j tjkr|  S | S rI   )ZdtyperQ   Zbfloat16Zhalffloatxr!   r!   r$   to_float   s   z2ProteinStructurePipeline.forward.<locals>.to_floatc                 S      | d S )N)r\   r   .r!   tr!   r!   r$   <lambda>       z2ProteinStructurePipeline.forward.<locals>.<lambda>c                 S   re   )N)r   .r!   rf   r!   r!   r$   rh      ri   r   c                 S      t |  S rI   nparraycpurb   r!   r!   r$   rh          c                 S   rj   rI   rk   rb   r!   r!   r$   rh      ro   plddt).N)Zaxis)featuresresultZ	b_factorsziptm+ptmz.pdbwzplddts:r>   z_plddt.json   )indentptmsz	_ptm.json)$r.   r/   r0   r<   Zoutput_dir_baserangerB   hashr9   r(   r6   shaper%   r;   globalsr#   rQ   rR   itemsr   rl   meanrepeatr   Zatom_type_numr   Zfrom_predictionstrr-   writeZto_pdbappendloggerinfojsondump)rE   rY   rM   Zplddtsrv   
output_dirZpdbsr*   Zcur_seedr7   r"   rW   rd   rp   Z
mean_plddtZplddt_b_factorsZcur_proteinZcur_save_namefr>   Z
score_nameZplddt_fnameZ	ptm_fnamer!   r!   r$   rS      s   




z ProteinStructurePipeline.forwardc                 K   s   |S rI   r!   )rE   rY   rN   r!   r!   r$   rT      s   z$ProteinStructurePipeline.postprocessrI   )__name__
__module____qualname__r   r	   r~   r   r   rA   rJ   r   r   rX   rS   r   rT   __classcell__r!   r!   rG   r$   r   `   s    


K)r   FFN)5r.   timetypingr   r   r   r   r   r   numpyrl   rQ   Zunicore.utilsr   Zmodelscope.metainfor   Zmodelscope.models.baser	   Z(modelscope.models.science.unifold.configr
   Z&modelscope.models.science.unifold.datar   r   Z)modelscope.models.science.unifold.datasetr   r   Zmodelscope.outputsr   Zmodelscope.pipelines.baser   r   Zmodelscope.pipelines.builderr   Zmodelscope.preprocessorsr   r   Zmodelscope.utils.constantr   r   r   Zmodelscope.utils.devicer   Zmodelscope.utils.hubr   Zmodelscope.utils.loggerr   r   __all__r%   r9   Zregister_moduleZprotein_structurer   r!   r!   r!   r$   <module>   s@   
2