File Coverage

blib/lib/HackaMol/Roles/PdbRole.pm
Criterion Covered Total %
statement 22 23 95.6
branch 5 8 62.5
condition n/a
subroutine 5 5 100.0
pod 2 2 100.0
total 34 38 89.4


line stmt bran cond sub pod time code
1             $HackaMol::Roles::PdbRole::VERSION = '0.052';
2             #ABSTRACT: PdbRole of lazy attributes for HackaMol atoms
3             use Moose::Role;
4 19     19   13157 use Carp;
  19         50  
  19         144  
5 19     19   87919  
  19         48  
  19         12600  
6              
7             has 'record_name', is => 'rw', isa => 'Str', lazy => 1, default => 'HETATM';
8             has 'occ', is => 'rw', isa => 'Num', lazy => 1, default => 1.0;
9             has 'bfact', is => 'rw', isa => 'Num', lazy => 1, default => 20.0;
10             # b_iso
11             # b_aniso (vector) would be better here
12             has 'bfp', is => 'rw', isa => 'Num' ; # bfactor profile
13             # (10.1016/j.jmb.2015.09.024)
14             has 'resname', is => 'rw', isa => 'Str', lazy => 1, default => 'UNK';
15             # cif label_asym_id
16             has 'chain', is => 'rw', isa => 'Str', lazy => 1, default => ' ';
17             # cif label_alt_id
18             has 'altloc', is => 'rw', isa => 'Str', lazy => 1, default => ' ';
19             has 'icode', is => 'rw', isa => 'Str', lazy => 1, default => ' ';
20             has 'pdbid', is => 'rw', isa => 'Str', lazy => 1, default => ' ';
21             # cif label_seq_id
22             has 'segid', is => 'rw', isa => 'Str', lazy => 1, default => ' ';
23             has 'iatom', is => 'rw', isa => 'Int', lazy => 1, default => 0;
24             has 'resid', is => 'rw', isa => 'Str', lazy => 1, default => 1;
25             has 'serial', is => 'rw', isa => 'Int', lazy => 1, default => 1;
26             has 'sasa', is => 'rw', isa => 'Num', lazy => 1, default => 0.0;
27             has 'model_num', is => 'rw', isa => 'Num'; # cif
28             has 'auth_seq_id', is => 'rw', isa => 'Int'; # cif, -> author fudged resid
29             has 'auth_comp_id', is => 'rw', isa => 'Str'; # cif, -> author fudged resname
30             has 'auth_asym_id', is => 'rw', isa => 'Str'; # cif
31             has 'auth_atom_id', is => 'rw', isa => 'Str'; # cif -> author fudged name
32             has 'entity_id', is => 'rw', isa => 'Int'; # cif, e.g. virus, main chains of 1 entity
33             has 'pdb_formal_charge', is => 'rw', isa => 'Num'; # cif, e.g. virus, main chains of 1 entity
34              
35             my %aa321 = (
36             ALA=>'A', ARG=>'R', ASN=>'N', ASP=>'D', CYS=>'C',
37             GLU=>'E', GLN=>'Q', GLY=>'G', HIS=>'H', ILE=>'I',
38             LEU=>'L', LYS=>'K', MET=>'M', PHE=>'F', PRO=>'P',
39             SER=>'S', THR=>'T', TRP=>'W', TYR=>'Y', VAL=>'V',
40             SEC=>'U',
41             );
42              
43             my $self = shift;
44             my $x_flag = shift;
45 43     43 1 266 $x_flag = 1 unless defined($x_flag);
46 43         52  
47 43 50       74 my $resname = uc($self->resname);
48            
49 43         874 unless ( exists($aa321{$resname}) ){
50             carp "PDBRole> residue $resname name has no 1 letter code";
51 43 100       89 return ('X') if $x_flag;
52 1         21 return ("($resname)");
53 1 50       502 }
54 0         0 return ($aa321{$resname});
55             }
56 42         138 #following map lifted from Bio::PDB::Structure::Atom
57              
58             my %pdb_atom_names = (
59             'C' => ' C ',
60             'C1' => ' C1 ',
61             'C1A' => ' C1A',
62             'C1B' => ' C1B',
63             'C1C' => ' C1C',
64             'C1D' => ' C1D',
65             'C2' => ' C2 ',
66             'C2A' => ' C2A',
67             'C2B' => ' C2B',
68             'C2C' => ' C2C',
69             'C2D' => ' C2D',
70             'C3' => ' C3 ',
71             'C3A' => ' C3A',
72             'C3B' => ' C3B',
73             'C3C' => ' C3C',
74             'C3D' => ' C3D',
75             'C4' => ' C4 ',
76             'C4A' => ' C4A',
77             'C4A' => ' C4A',
78             'C4B' => ' C4B',
79             'C4C' => ' C4C',
80             'C4D' => ' C4D',
81             'C5' => ' C5 ',
82             'C6' => ' C6 ',
83             'CA' => ' CA ',
84             'CAA' => ' CAA',
85             'CAB' => ' CAB',
86             'CAC' => ' CAC',
87             'CAD' => ' CAD',
88             'CB' => ' CB ',
89             'CBA' => ' CBA',
90             'CBB' => ' CBB',
91             'CBC' => ' CBC',
92             'CBD' => ' CBD',
93             'CD' => ' CD ',
94             'CD1' => ' CD1',
95             'CD2' => ' CD2',
96             'CE' => ' CE ',
97             'CE1' => ' CE1',
98             'CE2' => ' CE2',
99             'CE3' => ' CE3',
100             'CG' => ' CG ',
101             'CG1' => ' CG1',
102             'CG2' => ' CG2',
103             'CGA' => ' CGA',
104             'CGD' => ' CGD',
105             'CH2' => ' CH2',
106             'CHA' => ' CHA',
107             'CHB' => ' CHB',
108             'CHC' => ' CHC',
109             'CHD' => ' CHD',
110             'CMA' => ' CMA',
111             'CMB' => ' CMB',
112             'CMC' => ' CMC',
113             'CMD' => ' CMD',
114             'CZ' => ' CZ ',
115             'CZ2' => ' CZ2',
116             'CZ3' => ' CZ3',
117             'FE' => 'FE ',
118             'H' => ' H ',
119             'HA' => ' HA ',
120             'HB' => ' HB ',
121             'HG' => ' HG ',
122             'HE' => ' HE ',
123             'HZ' => ' HZ ',
124             'HH' => ' HH ',
125             '1H' => '1H ',
126             '2H' => '2H ',
127             '3H' => '3H ',
128             '1HA' => '1HA ',
129             '1HB' => '1HB ',
130             '1HD' => '1HD ',
131             '1HE' => '1HE ',
132             '1HG' => '1HG ',
133             '1HZ' => '1HZ ',
134             '2HA' => '2HA ',
135             '2HB' => '2HB ',
136             '2HD' => '2HD ',
137             '2HE' => '2HE ',
138             '2HG' => '2HG ',
139             '1HZ' => '1HZ ',
140             '2HZ' => '2HZ ',
141             '3HB' => '3HB ',
142             '3HE' => '3HE ',
143             '3HZ' => '3HZ ',
144             'N' => ' N ',
145             'NA' => ' NA ',
146             'NB' => ' NB ',
147             'NC' => ' NC ',
148             'ND' => ' ND ',
149             'N A' => ' N A',
150             'N B' => ' N B',
151             'N C' => ' N C',
152             'N D' => ' N D',
153             'N1' => ' N1 ',
154             'N2' => ' N2 ',
155             'N3' => ' N3 ',
156             'ND1' => ' ND1',
157             'ND2' => ' ND2',
158             'NE' => ' NE ',
159             'NE1' => ' NE1',
160             'NE2' => ' NE2',
161             'NH1' => ' NH1',
162             'NH2' => ' NH2',
163             'NZ' => ' NZ ',
164             'O' => ' O ',
165             'O1' => ' O1 ',
166             'O1A' => ' O1A',
167             'O1D' => ' O1D',
168             'O2' => ' O2 ',
169             'O2A' => ' O2A',
170             'O2D' => ' O2D',
171             'O3' => ' O3 ',
172             'O4' => ' O4 ',
173             'O5' => ' O5 ',
174             'O6' => ' O6 ',
175             'OD1' => ' OD1',
176             'OD2' => ' OD2',
177             'OE1' => ' OE1',
178             'OE2' => ' OE2',
179             'OG' => ' OG ',
180             'OG1' => ' OG1',
181             'OH' => ' OH ',
182             'OXT' => ' OXT',
183             'S' => ' S ',
184             'SD' => ' SD ',
185             'SG' => ' SG '
186             );
187              
188             my $self = shift;
189             my $name = $self->name;
190             if(exists($pdb_atom_names{$self->name})){
191 5     5 1 21 $self->name($pdb_atom_names{$self->name});
192 5         104 }
193 5 50       97 return $name;
194 5         106 }
195              
196 5         10 no Moose::Role;
197             1;
198              
199 19     19   153 # added attributes for parsing a PDB file
  19         76  
  19         104  
200             # Histidine 64 for Human Carbonic Anhydrase II from pdbid: 2CBA
201             #some lines for reference that did not translate well into POD
202             #my $lines_H64_2cba = '
203             # 1 2 3 4 5 6 7 8
204             #12345678901234567890123456789012345678901234567890123456789012345678901234567890
205             #ATOM 504 N HIS A 64 -0.822 -1.995 6.439 1.00 10.63 N
206             #ATOM 505 CA HIS A 64 -0.847 -2.773 7.721 1.00 10.22 C
207             #ATOM 506 C HIS A 64 -2.270 -3.278 7.949 1.00 9.51 C
208             #ATOM 507 O HIS A 64 -2.449 -4.225 8.736 1.00 11.94 O
209             #ATOM 508 CB AHIS A 64 -0.335 -2.173 8.991 0.70 10.98 C
210             #ATOM 509 CB BHIS A 64 -0.409 -1.888 8.917 0.20 9.21 C
211             #ATOM 510 CG AHIS A 64 -0.736 -0.782 9.258 0.70 12.16 C
212             #ATOM 511 CG BHIS A 64 0.714 -0.964 8.521 0.20 8.70 C
213             #ATOM 512 ND1AHIS A 64 -1.795 -0.353 10.014 0.70 14.34 N
214             #ATOM 513 ND1BHIS A 64 0.513 0.338 8.162 0.20 8.57 N
215             #ATOM 514 CD2AHIS A 64 -0.117 0.344 8.805 0.70 12.79 C
216             #ATOM 515 CD2BHIS A 64 2.037 -1.198 8.364 0.20 8.90 C
217             #ATOM 516 CE1AHIS A 64 -1.809 0.971 10.061 0.70 13.80 C
218             #ATOM 517 CE1BHIS A 64 1.691 0.868 7.814 0.20 8.65 C
219             #ATOM 518 NE2AHIS A 64 -0.844 1.403 9.281 0.70 15.45 N
220             #ATOM 519 NE2BHIS A 64 2.615 -0.026 7.936 0.20 6.94 N
221             #';
222             #
223             #my $ATOM_record_format = '
224             #Record Format: http://www.wwpdb.org/documentation/format23/sect9.html
225             #COLUMNS DATA TYPE FIELD DEFINITION
226             #------------------------------------------------------
227             # 1 - 6 Record name "ATOM "
228             # 7 - 11 Integer serial Atom serial number.
229             #13 - 16 Atom name Atom name.
230             #17 Character altLoc Alternate location indicator.
231             #18 - 20 Residue name resName Residue name.
232             #22 Character chainID Chain identifier.
233             #23 - 26 Integer resSeq Residue sequence number.
234             #27 AChar iCode Code for insertion of residues.
235             #31 - 38 Real(8.3) x Orthogonal coordinates for X in
236             # Angstroms
237             #39 - 46 Real(8.3) y Orthogonal coordinates for Y in
238             # Angstroms
239             #47 - 54 Real(8.3) z Orthogonal coordinates for Z in
240             # Angstroms
241             #55 - 60 Real(6.2) occupancy Occupancy.
242             #61 - 66 Real(6.2) tempFactor Temperature factor.
243             #77 - 78 LString(2) element Element symbol, right-justified.
244             #79 - 80 LString(2) charge Charge on the atom.
245             #';
246             #
247             # we will add support for reading two code chains using column 21
248             #
249              
250              
251             =pod
252              
253             =head1 NAME
254              
255             HackaMol::Roles::PdbRole - PdbRole of lazy attributes for HackaMol atoms
256              
257             =head1 VERSION
258              
259             version 0.052
260              
261             =head1 SYNOPSIS
262              
263             use HackaMol::Atom;
264              
265             my $atom = Atom->new(Z=>6);
266              
267             print $atom->$_ foreach ( qw(
268             record_name
269             serial
270             occ
271             bfact
272             resname
273             chain
274             altloc
275             resid
276             iatom
277             pdbid
278             segid
279             )
280             );
281            
282             foreach my $resn (qw(TRP TYR GLN ASN ETC)){
283             $atom->resname($resn);
284             print $atom->aa321;
285             }
286              
287             =head1 DESCRIPTION
288              
289             PdbRole provides atom attributes for PDB parsing. All attributes are 'rw' and
290             lazy, so they will not contaminate the namespace unless called upon. The
291             functionality of the PdbRole may be extended in the future. An extension
292             (HackaMolX::PDB or HackaMol::X::PDB) will be released soon.
293              
294             =head1 METHODS
295              
296             =head2 pdb_rename
297              
298             no arguments. Returns the current name. Renames the atom based on names used by the PDB (if exists). This is useful for programs that render the secondary structure of molecules.
299              
300             =head2 aa321
301              
302             returns 1 letter code for amino acid. Generated from resname attribute. throws a warning and returns 'X' if residue name is unrecognized.
303              
304             =head1 ATTRIBUTES
305              
306             =head2 record_name
307              
308             pdb cols 1-6: ATOM|HETATM. default = 'HETATM'
309              
310             =head2 serial
311              
312             pdb cols 7-11: index. default = 0
313              
314             =head2 occ
315              
316             pdb cols 55-60: occupancy. range 0 to 1. default = 1.0 (all there)
317              
318             =head2 bfact
319              
320             pdb cols 61-66: temperature factor. see Willis and Pryor. default = 20.0
321              
322             =head2 altloc
323              
324             pdb col 17. is AHIS and BHIS above. default = ' '
325              
326             =head2 resname
327              
328             pdb cols 18-20: residue name. defaults to 'ALA'
329              
330             =head2 chain
331              
332             pdb cols 22. protein chain. cols 22 is the pdb specification cols 21-22 is supported by hackamol
333             default = ' '
334              
335             =head2 resid
336              
337             pdb cols 23-26. residue index. PDB calls is resSeq, but resid is more familiar
338             (to me). default = 64
339              
340             =head2 icode
341              
342             pdb cols 27. see code comments or
343             L<http://www.wwpdb.org/documentation/format23/sect9.html>
344              
345             =head2 pdbid
346              
347             a place to store which PDB it came from
348              
349             =head2 segid
350              
351             a CHARMMish parameter that may not belong here. default = 'TIP3'
352              
353             =head2 iatom
354              
355             this is a place for the actual index. Segid does not have to start from 0 (cut
356             and paste as above, etc).
357              
358             =head2 sasa
359              
360             Solvent accessible surface area; isa 'Num'. A place for storing results from such calculations.
361              
362             =head1 SEE ALSO
363              
364             =over 4
365              
366             =item *
367              
368             L<http://www.pdb.org>
369              
370             =item *
371              
372             L<Bio::PDB::Structure::Atom>
373              
374             =back
375              
376             =head1 AUTHOR
377              
378             Demian Riccardi <demianriccardi@gmail.com>
379              
380             =head1 COPYRIGHT AND LICENSE
381              
382             This software is copyright (c) 2017 by Demian Riccardi.
383              
384             This is free software; you can redistribute it and/or modify it under
385             the same terms as the Perl 5 programming language system itself.
386              
387             =cut