package Madel; use Exporter; @ISA = qw(Exporter); #公開したいサブルーチン @EXPORT = qw(); use strict; use File::Basename; use Deps; use Utils; use Sci::Science; use ProgVars; #use Crystal::MyUtility; use Crystal::Crystal; use Crystal::AtomType; use Crystal::AtomSite; use Crystal::CIF; #=============================================== # スクリプト大域変数 #=============================================== my $LF = "
\n"; my $DirectorySeparator = "\\"; #=============================================== # パス(読み込みDB) # Web関係変数 # CGI の仮想パス # プログラム名 #=============================================== my $Program = basename($0); my $ProgramDir = ProgVars->ProgramDir(); my $LDDir = ProgVars->LDDir(); my $MXDDir = ProgVars->MXDDir(); my $MXDOrtoDir = ProgVars->MXDOrtoDir(); my $MXDExecDir = ProgVars->MXDExecDir(); my $SX1DBPath = ProgVars->SX1DBPath(); BEGIN { } sub new { my ($module) = @_; my $this = {}; bless $this; return $this; } sub DESTROY { my $this = shift; } sub SetSampleName { my ($this, $name) = @_; return $this->{'SampleName'} = $name; } sub SampleName { my ($this) = @_; return $this->{'SampleName'}; } sub GetBusingParameter { my ($this,$atomname) = @_; unless(open(IN, "<$SX1DBPath")) { print "Error in MXD.pm::GetBusingParameter: " ."Can not read DB [$SX1DBPath].
\n"; return (''); } ; while() { my ($name, $mass, $charge, $ai, $bi, $ci, $rad) = split(/\s+/, $_); #print "name: $name, $atomname ($mass, $charge, $ai, $bi)
\n"; if(uc $name eq uc $atomname) { return ($mass, $charge, $ai, $bi, $ci, $rad); } } close(IN); return (''); } sub MakeInputFile { my ($this, $Crystal, $fname, $IonRadius, $Grange, $pModifiedParams) = @_; my $OutFile = "$fname.pme"; my $out = JFile->new($OutFile, 'w'); if(!$out) { print "Can't write to $OutFile.\n\n"; return; } print "IonRadius=$IonRadius\n"; print "Grange=$Grange\n"; my $SPG = $Crystal->GetCSpaceGroup(); my $SPGName = $Crystal->SPGName(); # $SPGName =~ s/[\s']//g; #print OUT "$SPGName\n"; my @SymmetryOperation = $SPG->ExpandSymmetryOperation(); my $nSymmetryOperation = @SymmetryOperation; print "nSymmetry=$nSymmetryOperation\n"; my @AtomTypeList = $Crystal->GetCAtomTypeList(); my $nAtomType = @AtomTypeList; print "nAtom=$nAtomType\n"; my ($a,$b,$c,$alpha,$beta,$gamma) = $Crystal->LatticeParametersByOutputMode(0); my @AsymmetricAtomSiteList = $Crystal->GetCAsymmetricAtomSiteList(); my $nAsymmetricAtomSite = @AsymmetricAtomSiteList; print "nAsymmetricAtomSite=$nAsymmetricAtomSite\n"; my @ExpandedAtomSiteList = $Crystal->GetCExpandedAtomSiteList(); # my @ExpandedAtomSiteList = $Crystal->GetCExpandedAtomSiteListByOutputMode(); my $nExpandedAtomSite = @ExpandedAtomSiteList; print "nExpandedAtomSite=$nExpandedAtomSite\n"; #O2 Si1 $out->print("$fname\n"); # 1.20 4.00 # Ion radius, max Ghkl in k space $out->printf(" %4.2f %5.2f\n", $IonRadius, $Grange); # 6 2 0 # nSymmetry except inversion, nAsymmetric sites, Inversion (0: non-centrosym, 1: centrosym) $out->printf("%3d%3d %d\n", 1, $nExpandedAtomSite, 0); # 4.9210 4.9210 5.4160 90.000 90.000 120.000 $out->printf(" %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f\n", $a, $b, $c, $alpha, $beta, $gamma); # 0.000000 1 0 0.000000 2 0 0.000000 3 0 $out->print(" 0.000000 1 0 0.000000 2 0 0.000000 3 0\n"); #Si1 4.0000 1.0000 0.5302 0.0000 0.3330 #O1 -2.0000 1.0000 0.4151 0.1476 0.1194 for(my $i = 0 ; $i < $nExpandedAtomSite ; $i++) { my $atom = $ExpandedAtomSiteList[$i]; my $atomname0 = $atom->AtomName(); my $atomname = $atom->AtomNameOnly(); my $iAtom = $Crystal->FindiAtomType($atomname); my $occ = $atom->Occupancy(); my ($x, $y, $z) = $atom->Position(1); # my $mult = $atom->Multiplicity(); # $mult = 1 if($IsExpandCoordinate or $IsChooseRandomly); my $charge0 = $atom->Charge(); my ($Mass, $charge, $ai, $bi, $ci, $rad) = $this->GetBusingParameter($atomname); # $Mass = AtomType::GetAtomInformationByKey($atomname, "原子量") if($Mass eq ''); # $Mass =~ s/\(.*?\)//g; # $Mass = eval($Mass); # $ai = 0.9 if($ai == 0); # $bi = 0.08 if($bi == 0); # $ci = 0.0 if($ci eq ''); my ($zc, $sign) = ($charge0 =~ /([\d\.]+)([+\-])/); if($sign eq '-') { $charge0 = -$zc; } $charge = $charge0 if($charge0 ne ''); my $iMP; if($pModifiedParams) { for(my $j = 0 ; $j < @$pModifiedParams ; $j++) { if($atomname eq $pModifiedParams->[$j]{Name}) { $iMP = $j; last; } } #print "$atomname => index of Bader charge atom: $iMP\n"; } if(defined $iMP) { my $p = $pModifiedParams->[$iMP]; if(defined $p->{Charge}) { $charge = $p->{Charge}; } if(defined $p->{ai}) { $ai = $p->{ai}; } if(defined $p->{bi}) { $bi = $p->{bi}; } if(defined $p->{ci}) { $ci = $p->{ci}; } if(defined $p->{rad}) { $rad = $p->{rad}; } } #Si1 4.0000 1.0000 0.5302 0.0000 0.3330 $out->printf("%-10s %7.4f %8.4f %8.4f %8.4f %8.4f\n", $atomname0, $charge, $occ, $x, $y, $z); } close(OUT); return 1; } # for(my $i = 0 ; $i < $nSymmetryOperation ; $i++) { # my $SymOp = $SymmetryOperation[$i]; # Utils::DelSpace($SymOp); # # my @SymOpXYZ = split(/,\s*/, $SymOp); # my @XMatrix = SpaceGroup::SymOpToMatrix($SymOpXYZ[0]); # my @YMatrix = SpaceGroup::SymOpToMatrix($SymOpXYZ[1]); # my @ZMatrix = SpaceGroup::SymOpToMatrix($SymOpXYZ[2]); # printf OUT "%7.4f %7.4f %7.4f %7.4f %7.4f %7.4f " # ."%7.4f %7.4f %7.4f\n", # $XMatrix[0], $XMatrix[1], $XMatrix[2], # $YMatrix[0], $YMatrix[1], $YMatrix[2], # $ZMatrix[0], $ZMatrix[1], $ZMatrix[2]; # printf OUT "%7.4f %7.4f %7.4f\n", # eval($XMatrix[3]), eval($YMatrix[3]), # eval($ZMatrix[3]); # } 1;