File Coverage

blib/lib/HackaMol/AtomGroup.pm
Criterion Covered Total %
statement 27 27 100.0
branch 2 2 100.0
condition n/a
subroutine 6 6 100.0
pod 1 1 100.0
total 36 36 100.0


line stmt bran cond sub pod time code
1             $HackaMol::AtomGroup::VERSION = '0.053';
2             #ABSTRACT: HackaMol AtomGroup class
3             use 5.008;
4 14     14   224426 use Moose;
  14         51  
5 14     14   539 use namespace::autoclean;
  14         323446  
  14         84  
6 14     14   84111 use Carp;
  14         84069  
  14         70  
7 14     14   1041 use MooseX::StrictConstructor;
  14         26  
  14         802  
8 14     14   6143  
  14         222716  
  14         63  
9             #use MooseX::Storage;
10             #with Storage( 'io' => 'StorableFile' ),
11             with 'HackaMol::Roles::NameRole',
12             'HackaMol::Roles::AtomGroupRole',
13             'HackaMol::Roles::SelectionRole';
14              
15              
16             #radius of gyration.
17             my $self = shift;
18             return (0) unless ( $self->count_atoms );
19 8     8 1 1921 my @atoms = $self->all_atoms;
20 8 100       303 my $com = $self->COM;
21 7         206 my $total_mass = $self->total_mass;
22 7         52 my @masses = map { $_->mass } @atoms;
23 7         40 my @dvec2 = map { $_ * $_ } map { $_->get_coords( $_->t ) - $com } @atoms;
24 7         36 my $sum = 0;
  3141         60030  
25 7         46 $sum += $masses[$_] * $dvec2[$_] foreach 0 .. $#dvec2;
  3141         3938  
  3141         62445  
26 7         323 return ( sqrt( $sum / $total_mass ) );
27 7         623 }
28 7         379  
29             __PACKAGE__->meta->make_immutable;
30              
31             1;
32              
33              
34             =pod
35              
36             =head1 NAME
37              
38             HackaMol::AtomGroup - HackaMol AtomGroup class
39              
40             =head1 VERSION
41              
42             version 0.053
43              
44             =head1 SYNOPSIS
45              
46             use HackaMol::AtomGroup;
47             use Math::Vector::Real;
48             use Math::Vector::Real::Random;
49              
50             my $radius = 16;
51             my $natoms = int(0.0334*($radius**3)*4*pi/3);
52              
53             my @atoms = map {Atom->new(Z => 8, charges=> [0], coords => [$_]) }
54             map {$_*$radius}
55             map {Math::Vector::Real->random_in_sphere(3)} 1 .. $natoms;
56              
57             my $group = AtomGroup->new(gname => 'biggroup', atoms=> [@atoms]);
58              
59             print $group->count_atoms . "\n";
60              
61             print $group->count_unique_atoms . "\n";
62              
63             print $group->Rg . "\n";
64              
65             my $numerical_error = $radius*sqrt($radius*3/5) - $group->Rg;
66              
67             =head1 DESCRIPTION
68              
69             The HackaMol AtomGroup class provides methods and attributes for groups of atoms.
70             Atom groupings can be defined to mimic conventional forcefields or manipulated to
71             generate novel analytical tools. For example, with a trajectory loaded, a dynamic
72             cluster of atoms can be placed in a group and monitored in time. Or, perhaps, track
73             regional charges of a quantum mechanical molecule with changes in configuration or
74             external field. The AtomGroup class consumes the AtomGroupRole and provides the
75             parent class for the Molecule class.
76              
77             =head1 METHODS
78              
79             =head2 Rg
80              
81             no arguments. returns the scalar radius of gyration for the group of atoms
82              
83             =head1 ATTRIBUTES
84              
85             =head2 name
86              
87             isa Str that is lazy and rw. useful for labeling, bookkeeping...
88              
89             =head1 SEE ALSO
90              
91             =over 4
92              
93             =item *
94              
95             L<HackaMol::Molecule>
96              
97             =item *
98              
99             L<HackaMol::AtomGroupRole>
100              
101             =back
102              
103             =head1 EXTENDS
104              
105             =over 4
106              
107             =item * L<Moose::Object>
108              
109             =back
110              
111             =head1 CONSUMES
112              
113             =over 4
114              
115             =item * L<HackaMol::Roles::AtomGroupRole>
116              
117             =item * L<HackaMol::Roles::NameRole>
118              
119             =item * L<HackaMol::Roles::NameRole|HackaMol::Roles::AtomGroupRole|HackaMol::Roles::SelectionRole>
120              
121             =item * L<HackaMol::Roles::SelectionRole>
122              
123             =back
124              
125             =head1 AUTHOR
126              
127             Demian Riccardi <demianriccardi@gmail.com>
128              
129             =head1 COPYRIGHT AND LICENSE
130              
131             This software is copyright (c) 2017 by Demian Riccardi.
132              
133             This is free software; you can redistribute it and/or modify it under
134             the same terms as the Perl 5 programming language system itself.
135              
136             =cut