티스토리 뷰

https://github.com/luost26/diffab/issues/21#issuecomment-2350808489

 

在运行sabdab.py代码,发生报错 · Issue #21 · luost26/diffab

在运行sabdab.py代码,发生报错,请问该如何解决呀 第一个错误:报ValueError: invalid literal for int() with base 10: 'V'异常, 第二个错误如图,请教这两个问题都是怎么合理解决的呀

github.com

DiffAb 학습을 위해서 train 코드를 돌려보았는데 전처리과정에서 다음과 같은 에러가 나온다.

File "train.py", line 55, in <module>
    train_dataset = get_dataset(config.dataset.train)
  File "/data/project/diffab/diffab/datasets/_base.py", line 35, in get_dataset
    return _DATASET_DICT[cfg.type](cfg, transform=transform) 
  File "/data/project/diffab/diffab/datasets/sabdab.py", line 582, in get_sabdab_dataset
    return SAbDabDataset(
  File "/data/project/diffab/diffab/datasets/sabdab.py", line 270, in __init__
    self._load_structures(reset)
  File "/data/project/diffab/diffab/datasets/sabdab.py", line 347, in _load_structures
    self._preprocess_structures()
  File "/data/project/diffab/diffab/datasets/sabdab.py", line 393, in _preprocess_structures
    data_list = joblib.Parallel(n_jobs = 1, #n_jobs = max(joblib.cpu_count() // 2, 1), 
  File "/home/.local/lib/python3.8/site-packages/joblib/parallel.py", line 1918, in __call__
    return output if self.return_generator else list(output)
  File "/home/.local/lib/python3.8/site-packages/joblib/parallel.py", line 1847, in _get_sequential_output
    res = func(*args, **kwargs)
  File "/data/project/diffab/diffab/datasets/sabdab.py", line 176, in preprocess_sabdab_structure
    model = parser.get_structure(id, pdb_path)[0]
  File "/home/.conda/envs/diffab_hr/lib/python3.8/site-packages/Bio/PDB/PDBParser.py", line 100, in get_structure
    self._parse(lines)
  File "/home/.conda/envs/diffab_hr/lib/python3.8/site-packages/Bio/PDB/PDBParser.py", line 123, in _parse
    self.trailer = self._parse_coordinates(coords_trailer)
  File "/home/.conda/envs/diffab_hr/lib/python3.8/site-packages/Bio/PDB/PDBParser.py", line 199, in _parse_coordinates
    resseq = int(line[22:26].split()[0])  # sequence identifier
ValueError: invalid literal for int() with base 10: 'X'

 

[원인]

원인은 PDB의 parser 기능과 잘못된 PDB파일에 있다.

잘못(?)된 PDB 파일의 예시

PDB를 Parsing해서 structure data를 불러오는 PDB.PDBParser의 get_structure함수에는 다음과 같은 코드가 들어있다.

resseq = int(line[22:26].split()[0])  # sequence identifier

이 코드는 PDB파일의 22번째~26번째 컬럼의 값을 가져와서 split하고, 그 첫번째 값을 resseq이라는 변수에 저장하라는 코드이다.눈치가 빠른 사람들은 바로 느낌이 올텐데, 올려둔 PDB 예시를보면 ATOM 뒤에 99999가 넘어가면서 100000으로 컬럼이 한칸 밀려버린다.

따라서 원래같으면 71이 저장되어야 할 코드에 'X'와 '7' 이 들어가게 된다.

resseq은 변수명에서도 직관적으로 알 수 있지만, X 같은 string이 아니라 int형의 값이어야한다. (당연하다, 변수에 저장되는 우항 자체가 int()로 감싸져있는데 string을 input하면 에러가 날 수 밖에 없다)

 

[해결방법]

PDB파일의 ATOM 뒤 index값이 99999가 넘어가는 데이터는 Drop해서 버리도록 하자. 비정상적으로 긴 데이터로 크게 누락되는 데이터가 많지 않을 것이다.

만약 그게 싫다면 .conda/envs/$ENV_NAME/lib/python3.8/site-packages/Bio/PDB/PDBParser.py을 직접 수정해서 예외처리가 가능하도록 해야하는데 나는 그런 끔찍한 디버깅까지 하고싶지는 않다.

댓글