#!/usr/bin/perl -w #============================================================ # draft targets for PSI2 centers # Jinfeng Liu 04/26/2006 #=============================================================== use Getopt::Long; # default options $opt_help = ''; $name_scr = $0; $name_scr =~ s/.*\///g; @centers = qw(jcsg mcsg nesg nysgxrc); @centers_psi = qw(psi jcsg mcsg nesg nysgxrc); $random_seed = 10000; %init_selected = ( 'jcsg' => 271, 'mcsg' => 332, 'nesg' => 337, 'nysgxrc' => 329, ); $max_target = 400; $jcsg_extra_round = 35; %file_in = ( 'psi' => 'psi.list', 'jcsg' => 'jcsg.list', 'mcsg' => 'mcsg.list', 'nesg' => 'nesg.list', 'nysgxrc' => 'nysgxrc.list', ); %file_out = ( 'jcsg' => 'jcsg_out.list', 'mcsg' => 'mcsg_out.list', 'nesg' => 'nesg_out.list', 'nysgxrc' => 'nysgxrc_out.list', ); $file_log = 'draft.log'; $opt_random = 1; # randomly determine center order at each round $Lok = GetOptions ( 'l=s' => \$file_log, 'psi=s' => \$file_in{psi}, 'jcsg=s' => \$file_in{jcsg}, 'mcsg=s' => \$file_in{mcsg}, 'nesg=s' => \$file_in{nesg}, 'nysgxrc=s' => \$file_in{nysgxrc}, 'ojcsg=s' => \$file_out{jcsg}, 'omcsg=s' => \$file_out{mcsg}, 'onesg=s' => \$file_out{nesg}, 'onysgxrc=s' => \$file_out{nysgxrc}, 'random!' => \$opt_random, 's=f' => \$random_seed, 'help' => \$opt_help, ); if ( ! $Lok ) { print STDERR "*** ERROR: Invalid arguments found, -h for help\n"; &usage(); exit(1); } if ( $opt_help ) { &usage(); exit(1); } srand $random_seed; foreach $center ( @centers_psi ) { if ( ! $file_in{$center} ) { print STDERR "*** ERROR: input file for $center not specified\n"; &usage(); exit(1); } if ( ! -s $file_in{$center} ) { print STDERR "*** ERROR: input file '$file_in{$center}' not found, exiting..\n"; &usage(); exit(1); } } open (LOG,"> $file_log") or die "cannot write to log file $file_log:$!"; print LOG "----------Before draft-------------\n"; foreach $center ( @centers ) { print LOG "$center\t: ",$init_selected{$center},"\n"; } print LOG "\n----------Input-------------\n"; print STDERR "----------Input-------------\n"; %total_selected = %init_selected; # ------------------------ # read the input files # ------------------------ foreach $center ( @centers_psi ) { $list{$center} = &read_input($file_in{$center}); print LOG "$center\t: ",scalar @{$list{$center}},"\n"; print STDERR "$center\t: ",scalar @{$list{$center}},"\n"; } # build id->center hash print LOG "\n----------Draft-------------\n\n"; # reset array index counter foreach $center ( @centers_psi ) { $index{$center} = 0; $max_index{$center} = scalar (@{$list{$center}}) - 1; } # --------------------------------- # drafting # --------------------------------- print LOG "total number of targets=",$max_index{psi}+1,"\n"; $round = 0; $selected_total = 0; while ( 1 ) { @centers_pick = (); @centers_done = (); foreach $center ( @centers ) { if ( $index{$center} <= $max_index{$center} and $total_selected{$center} < $max_target ) { push @centers_pick,$center; } else { push @centers_done,$center; } } if ( @centers_done ) { print LOG "\n*** after round $round: ", join(',',@centers_done), " have selected max=$max_target targets or have no more targets in list\n"; } last if ( ! @centers_pick ); $round++; print LOG "\nround $round\n"; &random_permute_array(\@centers_pick) if ( $opt_random ); foreach $center ( @centers_pick ) { print LOG "$center\t: "; $selected = 0; while ( $index{$center} <= $max_index{$center} ) { $pick = $list{$center}[$index{$center}]; # skip if selected by others if ( $id2center{$pick} ) { print LOG "$pick selected by ",$id2center{$pick},","; $index{$center}++; next; } # pick the target $id2center{$pick} = $center; push @{$outlist{$center}},$pick; $index{$center}++; print LOG " *SELECT $pick\n"; $selected++; $selected_total++; $total_selected{$center}++; # jcsg has some extra rounds if ( $center eq 'jcsg' and $round <= $jcsg_extra_round ) { print LOG "\t: " if ( $selected == 1 ); last if ( $selected == 2); } else { last if ( $selected ); } } if ( ! $selected ) { print LOG " no more targets in list, *PASS\n"; } } } # remaining targets, random pick @remaining = (); foreach $id ( @{$list{psi}} ) { if ( ! $id2center{$id} ) { push @remaining,$id; } } if ( @remaining ) { print LOG "\n",scalar(@remaining), " targets are not selected by all\n"; } # write the output list print LOG "\n\n-------- Output -----------\n"; print STDERR "\n\n-------- Output -----------\n"; foreach $center ( @centers ) { $fh_out = "OUT_$center"; open ($fh_out,"> ".$file_out{$center}) or die "cannot write output file for $center\n"; foreach $id ( @{$outlist{$center}} ) { print $fh_out "$id\n"; } close $fh_out; print LOG "$center\t: selected=",scalar @{$outlist{$center}}, ", original=",$init_selected{$center}, ", total=",$total_selected{$center},"\n"; print STDERR "$center\t: selected=",scalar @{$outlist{$center}}, ", original=",$init_selected{$center}, ", total=",$total_selected{$center},"\n"; } print LOG "total\t: selected=",$selected_total,"\n", "unselected\t: ",scalar(@remaining),"\n"; print STDERR "total\t: selected=",$selected_total,"\n", "unselected\t: ",scalar(@remaining),"\n"; close LOG; exit; sub read_input { my ( $file ) = @_; my ( $fh,$line ); my $list = [ ]; open ($fh,$file) or die "cannot open $file:$!"; while ( $line=<$fh> ) { $line =~ s/\s+//g; next if ( $line =~ /^$/ ); if ( $line !~ /^BIG/ ) { print STDERR "$file: line=$line, not a valid BIG id\n"; next; } push @$list,$line; } close $fh; return $list; } sub random_permute_array { my $array = shift; my $i; for ($i = @$array; --$i; ) { my $j = int rand ($i+1); next if $i == $j; @$array[$i,$j] = @$array[$j,$i]; } } sub usage { print STDERR "$name_scr: draft targets for PSI2 centers\n", "Usage: $name_scr [options] \n", " Opt: -h print this help\n", " -(no)random randomly determine the order of centers at each round\n", " (default=random)\n", " -l output log file (default=$file_log)\n", " -psi input psi2 list file (default=$file_in{psi})\n", " -jcsg input jcsg list file (default=$file_in{jcsg})\n", " -mcsg input mcsg list file (default=$file_in{mcsg})\n", " -nesg input nesg list file (default=$file_in{nesg})\n", " -nysgxrc input nysgxrc list file (default=$file_in{nysgxrc})\n", " -ojcsg output jcsg list file (default=$file_out{jcsg})\n", " -omcsg output mcsg list file (default=$file_out{mcsg})\n", " -onesg output nesg list file (default=$file_out{nesg})\n", " -onysgxrc output nysgxrc list file (default=$file_out{nysgxrc})\n"; }