#!/usr/bin/perl -w # new_target foo # creates a new target directory (named after the first argument), # copies Makefile and other reused files from starter-directory # and replaces all occurences of the pseudotarget XXX0000 # by the real target, # subroutine prototypes sub print_usage(); sub make_directories ($); sub run_prog($;$); $casp7 = "/projects/compbio/experiments/protein-predict/casp7"; $starter = "$casp7/starter-directory"; $verbose=0; @files_to_copy= ("Makefile" ); { ($new_target) = @ARGV; if ($#ARGV !=0 || !defined($new_target) || length($new_target)<4 ) { print_usage(); exit(1); } $lc_new_target=lc($new_target); $uc_new_target=uc($new_target); $new_dir = "$casp7/$uc_new_target"; make_directories($new_dir); make_directories("$new_dir/decoys"); run_prog("fixmode $new_dir", "couldn't run fixmode"); for $file (@files_to_copy) { $to_read = "$starter/$file"; open (IN, "< $to_read") || die "Can't read file \"$to_read\"\n"; $to_write = "$new_dir/$file"; open(OUT, "> $to_write") || die "Can't write file \"$to_write\"\n"; while () { s/XXX0000/$uc_new_target/go; s/xxx0000/$lc_new_target/go; print OUT $_; } close IN; close OUT; chmod 0664, $to_write; } system "date > $new_dir/README"; system "echo $uc_new_target >> $new_dir/README"; } sub print_usage() { print STDERR "new-target foo\n" . " creates a new subdireactory $casp7/foo\n" . " and populates it with files from $starter\n" ; } # make all directories along path to specified directory # THIS SHOULD PROBABLY BE REPLACED # by standard mkpath() from File::Path, # but we found the group setting to be useful on our system. sub make_directories ($) { my ($dir) = @_; my $groups = `groups`; my $in_protein_group = ($groups =~ /protein/ ); @pieces = split /\//, $dir; for (my $i = 0; $i <=$#pieces; $i++) { my $path = join ('/', @pieces[0 .. $i]); next if $path eq ""; if (! -d $path) { mkdir $path, 0775; chmod 0775, $path; if ($in_protein_group ) { run_prog("chgrp protein $path", "chgrp failed"); } } } } # # run_prog(cmd, [errmsg]) # # Run a command using system. Exit if the command fails. An optional # error message for failure maybe specified or one will be generated. # sub run_prog($;$) { my($cmd,$errmsg) = @_; if ($::verbose) { print STDERR "\n\n@@@@ $cmd\n"; } if (system($cmd) != 0) { if (!defined($errmsg)) { $errmsg = "command failed: $cmd"; } die($errmsg); } }