Perl Script: Cmin
This is a simple perl script
that will take a CHARMm energy minimisation request issued by
Swiss-PdbViewer and process it. It requires that you have previously
modified your .cshrc login script to include this
In any case, do not forget to alter the paths (displayed in red) to point at the proper location on your
system.
#!/usr/central/bin/perl # split PDB file from CHARMM command file # and preform the requested job # # version 1.0 # NG/97 $charmbase = $ENV{"CHARMHOME"}; # ------------------------------------- # -------- retrieve arguments --------- # ------------------------------------- if ($#ARGV == -1) { print "v1.0 usage: Cmin [-r] filename\n"; exit; } while ($#ARGV > 0) { if ($ARGV[0] eq "-r") { $cleanup++; shift(@ARGV); } } $pdbfile = @ARGV[0]; # ----------------------------------------- # -------- prepare some filenames --------- # ----------------------------------------- ($minifile) = split(/\./,$pdbfile); $charmoutfile = $minifile . "_E.pdb"; $charmresult = $$.".charmm"; $infile = $$.".pdb"; $commandfile = $$.".cmd"; $tmpfile = $$.".tmp"; # --------------------------------------------------------------- # ------ Create an input file with proper line terminators ------ # ------ (for mac translate CR in LF; for pc remove CR) ------ # --------------------------------------------------------------- # ---- figure out which kind of file we deal with --- open (IN,"<$pdbfile") or die "** ERROR: file $pdbfile doesn't exist\n"; (@line) = split '', <IN>; $nbchar = $#line; if ($nbchar > 200) { $nbchar = 200; } for ($i=0; $i <= $nbchar; $i++) { if ($line[$i] eq "\n") { $lf = 1; } elsif ($line[$i] eq "\r") { $cr = 1; } } close IN; # ----- do the appropriate conversion --- open (IN,"<$pdbfile") or die; open (TMP,">$tmpfile") or die; while(<IN>) { if ($cr && $lf) { ~ s/[\r]//; } else { ~ tr/[\r]/[\n]/; } print TMP $_; } close TMP; close IN; if (-e "%$pdbfile") { unlink "%$pdbfile"; } # ----------------------------------------------------------------------- # ------- Split input file in PDB and CHARMm command file --------- # ----------------------------------------------------------------------- open (TMP,"<$tmpfile") or die; open (PDB,">$infile") or die; open (CHARMM,">$commandfile") or die; while(<TMP>) { print PDB $_; if (substr($_,0,3) eq "END") { while(<TMP>) { $TAG = substr($_,0,3); $top = index($_,"_TOP"); $prm = index($_,"_PRM"); if ($top != -1) {$TAG = "_TP"; $linestart = substr($_,0,$top);} if ($prm != -1) {$TAG = "_PR"; $linestart = substr($_,0,$prm);} if ($TAG eq "_I_") { print CHARMM "\"".$infile."\n"; } elsif ($TAG eq "_O_") { print CHARMM "\"".$charmresult."\n";} elsif ($TAG eq "_TP") { print CHARMM $linestart."\"".$charmbase."/top.inp\n";} elsif ($TAG eq "_PR") { print CHARMM $linestart."\"".$charmbase."/param.inp\n";} else { print CHARMM $_; } } } } close CHARMM; close PDB; close TMP; # ---------------------------------------------------- # -------- launch CHARMM and collect results --------- # ---------------------------------------------------- print "** MINIMIZING **\n"; open (CHARMOUT,">$charmoutfile") or die; open (CHARMM, "charmm < $commandfile |"); while(<CHARMM>) { $linestart = substr($_,0,4); # if (($linestart eq "MINI") || ($linestart eq "CONJ") || ($linestart eq "ABNR") || ($linestart eq " ---")) if (($linestart eq "MINI") || ($linestart eq " ---")) { print CHARMOUT "//".$_; } } close CHARMM; # --------------------------------------- # -------- Prepare a nice PDB file ------ # --------------------------------------- open(PDB, "<$charmresult"); while(<PDB>) { if (substr($_,0,4) eq "ATOM") { print CHARMOUT substr($_,0,21); print CHARMOUT substr($_,73,1); print CHARMOUT substr($_,22,44)."\n"; } } print CHARMOUT "END\n"; close PDB; close CHARMOUT; # ----------------------------- # --------- clean up ---------- # ----------------------------- if (-e "fort.1") { system("\\rm fort.1"); } if ($cleanup) { system("\\rm $$.*"); } exit;