#======================================================== # GeneralFileFormat #======================================================== package GeneralFileFormat; use Exporter; @ISA = qw(Exporter); #公開したいサブルーチン @EXPORT = qw(); #use strict; #use MyTk::TkRietan; #use MyTk::TkDVXa; #use MyTk::TkWIEN2k; #use MyTk::TkVASP; #use MyTk::TkCASTEP; #use MyTk::TkCRYSTAL06; #use MyTk::TkGaussian; #use MyTk::TkGULP; #use MyTk::TkRINT2000; #use MyTk::TkGeneralDataFile; #nouse MyTk::TkRietan; #============================================================ # モジュール内大域変数 #============================================================ my @Libs; #============================================================ # 一般関数 #============================================================ #===================================================== # Tkライブラリィで使われている関数 (Obsolete) #===================================================== sub LoadTkPlotModules { my ($pPathArray, $pLoadedModules) = @_; my @PathArray = @$pPathArray; my $DirSep = Deps::DirSep(); my $IsError = 0; for(my $i = 0 ; $i < @PathArray ; $i++) { my $lib = $PathArray[$i]; $lib =~ s/::/$DirSep/g; my $path; for(my $j = 0 ; $j < @INC ; $j++) { my $inc = $INC[$j]; $path = Deps::MakePath($inc, "$lib.pm"); last if(-f $path); } if(-f $path) { print "Load TkPlot Module: $path\n"; require $path if(!$pLoadedModules->{$lib}); push(@Libs, $lib) } else { print "Error in LoadTkPlotModules: Can not load $path\n"; $IsError++; } } return undef if($IsError); return 1; } sub CheckFileType { my ($path) = @_; my $Debug = 1; print "In GeneralFileFormat::CheckFileType\n" if($Debug); for(my $i = 0 ; $i < @Libs ; $i++) { my $lib = $Libs[$i]; my ($ClassName) = ($lib =~ /Tk(.*)$/i); #print "Lib: $lib\n"; next unless($ClassName); my $TkClassName = "Tk$ClassName"; #use "$lib/$TkClassName"; # my $func = $ClassName . "::CheckFileType"; my $func = $TkClassName . "::CheckFileType"; my $FileType; if(defined $func) { print "GeneralFileFormat::CheckFileType: Call [$func]\n"; $FileType = eval('&$func($path)'); } else { print "GeneralFileFormat::CheckFileType: [$func] is not defined\n"; } $FileType = 'unknown' unless($FileType); print " FileType: $FileType\n"; if($FileType ne 'unknown') { #print " Found in $TkClassName\n" if($Debug); return new $TkClassName; } } return undef; #これ以降は、以前のルーチン #使わない if(WIEN2k::CheckFileType($path)) { print "Check WIEN2k\n" if($Debug); return new TkWIEN2k; } elsif(Rietan::CheckFileType($path)) { print "Check Rietan\n" if($Debug); return new TkRietan; } return undef; } #===================================================== # Crystalライブラリィで使われている関数 (Obsolete) #===================================================== sub GuessFileFormat { my ($infile) = @_; #ファイル名を(ベース名, ディレクトリ名, 拡張子)に分解 my @filenames = fileparse($infile, "\.[^\.]+"); #print "filenames: $filenames[0] : $filenames[1] : $filenames[2]
\n"; return "CIF" if($filenames[2] =~ /^\.cif$/i); return "GULP Input" if($filenames[2] =~ /^\.glp$/i); return "GULP MD History" if($filenames[2] =~ /^\.his$/i); return "K.exe Input" if($filenames[2] =~ /^\.kin/i); return "K.exe Output" if($filenames[2] =~ /^\.kout/i); return "Rietan Input" if($filenames[2] =~ /^\.ins/i); return "Rietan Intensity" if($filenames[2] =~ /^\.int/i); my $linecount = 0; my $IsGULP = 0; my $nGULPSeparator = 0; return "Read failed" unless(open(IN,"<$infile")); while() { $linecount++; $nGULPSeparator++ if($_ =~ /^\*{80}/); $IsGULP = 1 if($nGULPSeparator == 1 and $_ =~ /^\*\s+GENERAL\s+UTILITY\s+LATTICE\s+PROGRAM/i); #print "$linecount: $nGULPSeperator: $IsGULP$LF"; if($IsGULP and $nGULPSeparator == 2) { if($_ =~ /^\*\s+opti(mise)?\s/i) { close(IN); return "GULP Output opti"; } elsif($_ =~ /^\*\s+fit\s/i) { close(IN); return "GULP Output fit"; } elsif($_ =~ /^\*\s+md\s/i) { close(IN); return "GULP Output md"; } } } close(IN); return "unknown"; } 1;