Mercurial > repos > deepakjadmin > mayatool3_test3
diff mayachemtools/lib/MoleculeFileIO.pm @ 0:73ae111cf86f draft
Uploaded
author | deepakjadmin |
---|---|
date | Wed, 20 Jan 2016 11:55:01 -0500 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mayachemtools/lib/MoleculeFileIO.pm Wed Jan 20 11:55:01 2016 -0500 @@ -0,0 +1,371 @@ +package MoleculeFileIO; +# +# $RCSfile: MoleculeFileIO.pm,v $ +# $Date: 2015/02/28 20:47:18 $ +# $Revision: 1.32 $ +# +# Author: Manish Sud <msud@san.rr.com> +# +# Copyright (C) 2015 Manish Sud. All rights reserved. +# +# This file is part of MayaChemTools. +# +# MayaChemTools is free software; you can redistribute it and/or modify it under +# the terms of the GNU Lesser General Public License as published by the Free +# Software Foundation; either version 3 of the License, or (at your option) any +# later version. +# +# MayaChemTools is distributed in the hope that it will be useful, but without +# any warranty; without even the implied warranty of merchantability of fitness +# for a particular purpose. See the GNU Lesser General Public License for more +# details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or +# write to the Free Software Foundation Inc., 59 Temple Place, Suite 330, +# Boston, MA, 02111-1307, USA. +# + +use strict; +use Carp; +use Exporter; +use Scalar::Util (); +use FileIO::SDFileIO; +use FileIO::MDLMolFileIO; + +use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS); + +@ISA = qw(Exporter); +@EXPORT = qw(); +@EXPORT_OK = qw(IsSupportedMoleculeFileFormat); + +%EXPORT_TAGS = (all => [@EXPORT, @EXPORT_OK]); + +# Setup class variables... +my($ClassName); +_InitializeClass(); + +# Class constructor... +sub new { + my($Class, %NamesAndValues) = @_; + + # Initialize object... + my $This = {}; + bless $This, ref($Class) || $Class; + $This->_InitializeMoleculeFileIO(); + + $This->_InitializeMoleculeFileIOProperties(%NamesAndValues); + + return $This; +} + +# Initialize object data... +# +sub _InitializeMoleculeFileIO { + my($This) = @_; + + # Reference to specific FileIO object... + $This->{FileIORef} = ''; + + return $This; +} + +# Initialize class ... +sub _InitializeClass { + #Class name... + $ClassName = __PACKAGE__; + +} + +# Initialize object properties...... +# +sub _InitializeMoleculeFileIOProperties { + my($This, %NamesAndValues) = @_; + + if (!exists $NamesAndValues{Name}) { + croak "Error: ${ClassName}->New: Object can't be instantiated without specifying file name..."; + } + + if (!exists $NamesAndValues{Mode}) { + $NamesAndValues{Mode} = 'Read'; + } + + # Make sure its a supported format and intialize FileIO object reference... + $This->_SetFileIORef(%NamesAndValues); + + return $This; +} + +# Setup FileIO object reference... +sub _SetFileIORef { + my($This, %NamesAndValues) = @_; + my($Name, $Status, $Format, $IOPackageName); + + $Name = $NamesAndValues{Name}; + + ($Status, $Format, $IOPackageName) = $This->IsSupportedMoleculeFileFormat($Name); + if (!$Status) { + croak "Error: ${ClassName}->New: Object can't be instantiated: File format, $Name, is not supported: Currently supported file formats are: SDF, MDLMol..."; + } + + $This->{FileIORef} = ${IOPackageName}->new(%NamesAndValues); + + return $This; +} + +# Is it a supported file format? +# +# In scalar context only status is returned; otherwise, file format and file IO package name is also +# returned. +# +# Note: +# . To support additional file formats, this is the only method which needs to be changed. +# +# . Currently supported file formats are: +# +# SDF .sdf, .sd +# MDLMol .mol +# +sub IsSupportedMoleculeFileFormat { + my($FirstParameter, $SecondParameter) = @_; + my($This, $Name); + + if ((@_ == 2) && (_IsMoleculeFileIO($FirstParameter))) { + ($This, $Name) = ($FirstParameter, $SecondParameter); + } + else { + ($Name) = ($FirstParameter); + } + my($Status, $Format, $IOPackageName); + + $Status = 0; $Format = 'NotSupported'; $IOPackageName = 'Unknown'; + + FORMAT: { + if (FileIO::SDFileIO::IsSDFile($Name)) { $Status = 1; $Format = 'SDF'; $IOPackageName = 'FileIO::SDFileIO'; last FORMAT; } + if (FileIO::MDLMolFileIO::IsMDLMolFile($Name)) { $Status = 1; $Format = 'MDLMol'; $IOPackageName = 'FileIO::MDLMolFileIO'; last FORMAT; } + $Status = 0; $Format = 'NotSupported'; $IOPackageName = 'Unknown'; + } + + return wantarray ? ($Status, $Format, $IOPackageName) : $Status; +} + +# Prohibit file ref change... +# +sub SetFileIORef { + my($This, $Value) = @_; + + carp "Warning: ${ClassName}->SetFileIORef: Explicit setting of file ref is not supported..."; + + return $This; +} + +# Prohibit file name change... +# +sub SetName { + my($This, $Name) = @_; + + carp "Warning: ${ClassName}->SetName: Explicit setting of file name is not supported: It must be set during object instantiation..."; + + return $This; +} + +# Prohibit file mode change... +# +sub SetMode { + my($This, $Mode) = @_; + + carp "Warning: ${ClassName}->SetMode: Explicit setting of file mode is not supported: It must be set during object instantiation..."; + + return $This; +} + +# Open file in a specific mode; default mode is Read only. +# Supported mode values are: Read, Write, Append, <, >, >>, r, w, a +# +sub Open { + my($This, $Mode) = @_; + + return $This->{FileIORef}->Open($Mode); +} + +# close file... +sub Close { + my($This) = @_; + + return $This->{FileIORef}->Close(); +} + +# Read molecule string from file and return a molecule object... +sub ReadMolecule { + my($This) = @_; + + return $This->{FileIORef}->ReadMolecule(); +} + +# Retrieve molecule string from file... +sub ReadMoleculeString { + my($This) = @_; + + return $This->{FileIORef}->ReadMoleculeString(); +} + +# Write molecule using molecule object... +sub WriteMolecule { + my($This, $Molecule) = @_; + + return $This->{FileIORef}->WriteMolecule($Molecule); +} + +# Is it a MoleculeFileIO object? +sub _IsMoleculeFileIO { + my($Object) = @_; + + return (Scalar::Util::blessed($Object) && $Object->isa($ClassName)) ? 1 : 0; +} + +1; + +__END__ + +=head1 NAME + +MoleculeFileIO + +=head1 SYNOPSIS + +use MoleculeFileIO; + +use MoleculeFileIO qw(:all); + +=head1 DESCRIPTION + +B<MoleculeFileIO> class provides the following methods: + +new, Close, IsSupportedMoleculeFileFormat, Open, ReadMolecule, +ReadMoleculeString, WriteMolecule + +The following methods can also be used as functions: + +IsSupportedMoleculeFileFormat + +=head2 METHODS + +=over 4 + +=item B<new> + + $NewMoleculeFileIO = new MoleculeFileIO([%PropertyNameAndValues]); + +Using specified I<MoleculeFileIO> property names and values hash, B<new> method +creates a new object and returns a reference to newly created B<MoleculeFileIO> object. +By default, following properties are initialized: + + Name = "" + Mode = "" + FileIORef = "" + +Based on extension of specified file I<Name>, an input class is automatically associated to +provide molecule read and write methods. + +Examples: + + $Name = "Water.mol"; + $Mode = "Read"; + $MoleculeFileIO = new MoleculeFileIO('Name' => $Name, + 'Mode' => $Mode); + $MoleculeFileIO->Open(); + $Molecule = $MoleculeFileIO->ReadMolecule(); + $Molecule->DetectRings(); + print "$Molecule\n"; + $MoleculeFileIO->Close(); + + $MoleculeFileIO = new MoleculeFileIO('Name' => 'Sample1.sdf', + 'Mode' => 'Read'); + $MoleculeFileIO->Open(); + while ($Molecule = $MoleculeFileIO1->ReadMolecule()) { + $Molecule->DetectRings(); + print "$Molecule\n"; + + $DataLabelsAndValuesRef = + $Molecule->GetDataFieldLabelAndValues(); + for $DataLabel (sort keys %{$DataLabelsAndValuesRef} ) { + $DataValue = $DataLabelsAndValuesRef->{$DataLabel}; + print "<DataLabel: $DataLabel; DataValue: $DataValue>; "; + } + print "\n"; + } + $MoleculeFileIO->Close(); + +=item B<Close> + + $MoleculeFileIO->Close(); + +Closes an open file + +=item B<IsSupportedMoleculeFileFormat> + + $Status = $MoleculeFileIO->IsSupportedMoleculeFileFormat($Name); + $Status = MoleculeFileIO::IsSupportedMoleculeFileFormat($Name); + ($Status, $FormatType, $IOClassName) = + $MoleculeFileIO::IsSupportedMoleculeFileFormat($Name); + +Returns 1 or 0 based on whether input file I<Name> format is supported. In list context, +value of supported format type and name of associated IO class is also returned. + +File extension is used to determine file format. Currently, following file extensions are +supported: + + FileExts - FormatType - AssociatedIOClassName + + .mol - MDLMOL - MDLMolFileIO + .sdf, .sd - SDF - SDFileIO + +=item B<Open> + + $MoleculeFileIO->Open([$Mode]); + +Opens a file in a specified I<Mode>. Default mode value: I<Read>. Supported mode +values: + + Read, Write, Append, <, >, >>, r, w, or a + +=item B<ReadMolecule> + + $Molecule = $MoleculeFileIO->ReadMolecule(); + +Reads molecule data from the file and returns a I<Molecule> object. + +=item B<ReadMoleculeString> + + $MoleculeString = $MoleculeFileIO->ReadMoleculeString(); + +Reads molecule data from a file and returns a I<Molecule> string. + +=item B<WriteMolecule> + + $MoleculeFileIO->WriteMolecule(); + +Write molecule data to a file for a I<Molecule>. + +=back + +=head1 AUTHOR + +Manish Sud <msud@san.rr.com> + +=head1 SEE ALSO + +FileIO.pm, MDLMolFileIO.pm, SDFileIO.pm + +=head1 COPYRIGHT + +Copyright (C) 2015 Manish Sud. All rights reserved. + +This file is part of MayaChemTools. + +MayaChemTools is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or (at your option) +any later version. + +=cut