IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Jun 24, 2010, 2:59:09 PM (16 years ago)
Author:
Paul Price
Message:

Merging trunk in advance of reintegrating into trunk.

Location:
branches/pap
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/pap

  • branches/pap/ippScripts/scripts/automate_stacks.pl

    r27938 r28484  
    1717my $missing_tools = 0;
    1818my $chiptool = can_run('chiptool') or (warn "Can't find chiptool" and $missing_tools = 1);
     19my $dqstatstool = can_run('dqstatstool') or (warn "Can't find dqstatstool" and $missing_tools = 1);
    1920my $warptool = can_run('warptool') or (warn "Can't find warptool" and $missing_tools = 1);
    2021my $stacktool= can_run('stacktool') or (warn "Can't find stacktool" and $missing_tools = 1);
    2122my $difftool = can_run('difftool') or (warn "Can't find difftool" and $missing_tools = 1);
     23my $dettool = can_run('dettool') or (warn "Can't find dettool" and $missing_tools = 1);
    2224my $ppConfigDump = can_run('ppConfigDump') or (warn "Can't find ppConfigDump" and $missing_tools = 1);
    2325my $mkBTpcontrol = can_run('make_burntool_pcontrol.pl') or (warn "Can't find make_burntool_pcontrol.pl" and $missing_tools = 1);
     
    2729    exit($PS_EXIT_CONFIG_ERROR);
    2830}
    29 
    30 # my @filter_list = ('g.00000','r.00000','i.00000','z.00000','y.00000');
    31 # my @target_list = ('CMB','M31','MD01','MD02','MD03','MD04','MD05','MD06','MD07','MD08','MD09','MD10',
    32 #                  'STS','SVS','SweetSpot','ThreePi');
    33 # my %tessID_list = ('CMB' => 'RINGS.V0', 'M31' => 'M31', 'MD01' => 'MD01', 'MD02' => 'MD02',
    34 #                  'MD03' => 'MD03', 'MD04' => 'MD04', 'MD05' => 'MD05', 'MD06' => 'MD06',
    35 #                  'MD07' => 'MD07', 'MD08' => 'MD08', 'MD09' => 'MD09', 'MD10' => 'MD10',
    36 #                  'STS' => 'STS', 'SVS' => 'RINGS.V0', 'SweetSpot' => 'RINGS.V0', 'ThreePi' => 'RINGS.V0');
    37 # my %comment_list = ('CMB' => 'CMB_Cold%', 'M31' => 'M31%', 'MD01' => 'MD01%', 'MD02' => 'MD02%',
    38 #                   'MD03' => 'MD03%', 'MD04' => 'MD04%', 'MD05' => 'MD05%', 'MD06' => 'MD06%',
    39 #                   'MD07' => 'MD07%', 'MD08' => 'MD08%', 'MD09' => 'MD09%', 'MD10' => 'MD10%',
    40 #                   'STS' => 'Stellar Transit%', 'SVS' => 'SVS%', 'SweetSpot' => 'Sweetspot%', 'ThreePi' => 'ThreePi%');
    41 # my %stackable_list = ('CMB' => 0, 'M31' => 1, 'MD01' => 1, 'MD02' => 1,
    42 #                   'MD03' => 1, 'MD04' => 1, 'MD05' => 1, 'MD06' => 1,
    43 #                   'MD07' => 1, 'MD08' => 1, 'MD09' => 1, 'MD10' => 1,
    44 #                   'STS' => 1, 'SVS' => 0, 'SweetSpot' => 0, 'ThreePi' => 0);
    45 # my $retention_time = 9000;  # days.
    46 
    4731
    4832my $db;
     
    5943my ( $check_registration, $define_burntool, $queue_burntool, $check_chips, $queue_chips);
    6044my ( $check_stacks, $queue_stacks, $check_diffs, $queue_diffs, $clean_old);
     45my ( $check_detrends, $queue_detrends, $check_dqstats, $queue_dqstats);
    6146
    6247GetOptions(
     
    8166    'check_stacks'         => \$check_stacks,
    8267    'queue_stacks'         => \$queue_stacks,
     68    'check_detrends'       => \$check_detrends,
     69    'queue_detrends'       => \$queue_detrends,
     70    'check_dqstats'        => \$check_dqstats,
     71    'queue_dqstats'        => \$queue_dqstats,
    8372    'check_diffs'          => \$check_diffs,
    8473    'queue_diffs'          => \$queue_diffs,
     
    10594           --check_stacks         Confirm that stacks can be built.
    10695           --queue_stacks         Issue stacktool commands to queue stacks.
     96           --check_detrends       Confirm that detrend verify runs can be built.
     97           --queue_detrends       Issue dettool commands to queue detrend verify runs.
     98           --check_dqstats        Confirm that dqstats tables can be built.
     99           --queue_dqstats        Issue dqstatstool commands to queue dqstat tables.
    107100           --check_diffs          Confirm that diffs can be done.
    108101           --queue_diffs          Issue difftool commands to queue diffs.
     
    115108          ) unless
    116109    defined $check_registration or defined $define_burntool or defined $queue_burntool or
    117     defined $queue_chips or defined $queue_stacks or
    118     defined $check_chips or defined $check_stacks or
     110    defined $queue_chips or defined $queue_stacks or $queue_detrends or $queue_dqstats or
     111    defined $check_chips or defined $check_stacks or $check_detrends or $check_dqstats or
    119112    defined $test_mode or defined $clean_old or defined $check_mode;
    120113
     
    126119my %object_list = ();
    127120my %comment_list= ();
     121my %cleanmods_list = ();
    128122my %stackable_list = ();
    129123my %reduction_class = ();
     124my @detrend_list = ();
     125my %dettype_list = ();
     126my %exptype_list = ();
     127my %refID_list = ();
     128my %refIter_list = ();
     129my %detfilter_list = ();
     130my %detmax_list = ();
    130131my %clean_commands = ();
    131132my %clean_retention = ();
    132133my %noclean_list = ();
     134my %clean_alternate = ();
    133135# Grab the configuration data.
    134136my $conf_cmd = "$ppConfigDump -dump-recipe NIGHTLY_SCIENCE -";
     
    137139unless ($success) {
    138140    $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
    139     &my_die("Unable to perform ppConfigDUmp: $error_code", $date, $PS_EXIT_SYS_ERROR);
     141    &my_die("Unable to perform ppConfigDump: $error_code", $date, $PS_EXIT_SYS_ERROR);
    140142}
    141143
     
    156158                $clean_retention{$this_mode} = ${ $mentry }{value};
    157159            }
     160            elsif (${ $mentry }{name} eq 'ALTERNATE_CMD') {
     161                $clean_alternate{$this_mode} = ${ $mentry }{value};
     162            }
    158163        }
    159164    }
    160 #    if (${ $entry }{name} eq 'RETENTION_TIME') {
    161 #        $retention_time = ${ $entry }{value};
    162 #    }
    163165    elsif (${ $entry }{name} eq 'FILTERS') {
    164166        push @filter_list, ${ $entry }{value};
     
    193195                $noclean_list{$this_target} = ${ $tentry }{value};
    194196            }
    195         }
    196     }
    197 }
    198 
    199 
    200 
     197            else {
     198                if (exists($clean_commands{ ${ $tentry }{name} })) {
     199                    $cleanmods_list{$this_target}{${ $tentry }{name} } = ${ $tentry }{value};
     200                }
     201            }
     202        }
     203    }
     204    elsif (${ $entry }{name} eq 'DETRENDS') {
     205        my @detrend_data = @{ ${ $entry }{value} };
     206        my $this_detrend = '';
     207        foreach my $dentry (@detrend_data) {
     208            if (${ $dentry }{name} eq 'NAME') {
     209                $this_detrend = ${ $dentry }{value};
     210                push @detrend_list, $this_detrend;
     211            }
     212            elsif (${ $dentry }{name} eq 'DETTYPE') {
     213                $dettype_list{$this_detrend} = ${ $dentry }{value};
     214            }
     215            elsif (${ $dentry }{name} eq 'EXPTYPE') {
     216                $exptype_list{$this_detrend} = ${ $dentry }{value};
     217            }
     218            elsif (${ $dentry }{name} eq 'REF_ID') {
     219                $refID_list{$this_detrend} = ${ $dentry }{value};
     220            }
     221            elsif (${ $dentry }{name} eq 'REF_ITER') {
     222                $refIter_list{$this_detrend} = ${ $dentry }{value};
     223            }
     224            elsif (${ $dentry }{name} eq 'FILTER') {
     225                $detfilter_list{$this_detrend} = ${ $dentry }{value};
     226            }
     227            elsif (${ $dentry }{name} eq 'MAX') {
     228                $detmax_list{$this_detrend} = ${ $dentry }{value};
     229            }
     230        }
     231    }           
     232}
    201233
    202234unless(defined($date)) {
     
    257289    unless (defined($test_mode) || defined($check_mode)) { exit(0); }
    258290}
     291if (defined($check_dqstats) || defined($test_mode)) {
     292    $metadata_out{nsState} = 'CHECKDQSTATS';
     293    &execute_dqstats($date,"pretend");
     294    return_metadata($date);
     295    unless (defined($test_mode) || defined($check_mode)) { exit(0); }
     296}
     297if (defined($queue_dqstats) || defined($test_mode)) {
     298    $metadata_out{nsState} = 'QUEUEDQSTATS';
     299    &execute_dqstats($date);
     300    return_metadata($date);
     301    unless (defined($test_mode)) { exit(0); }
     302}
     303if (defined($check_detrends) || defined($test_mode) || defined($check_mode)) {
     304    $metadata_out{nsState} = 'CHECKDETRENDS';
     305    &execute_detrends($date,"pretend");
     306    return_metadata($date);
     307    unless (defined($test_mode) || defined($check_mode)) { exit(0); }
     308}
     309if (defined($queue_detrends)) {
     310    $metadata_out{nsState} = 'QUEUEDETRENDS';
     311    &execute_detrends($date);
     312    return_metadata($date);
     313    exit(0);
     314}
    259315if (defined($define_burntool) || defined($test_mode)) {
    260316    $metadata_out{nsState} = 'QUEUEBURNING';
     
    347403        if ($summit_fault) {
    348404            print STDERR "check_summit_copy: $date $exp_name has summit_fault $summit_fault";
    349             if ($exp_type ne 'OBJECT') {
     405            if (($exp_type ne 'OBJECT')||($exp_name =~ /^c.*/)) {
    350406                print STDERR " (but I don't care).\n";
    351407            }
     
    357413        elsif (!$download_state or $download_state eq 'run') {
    358414            print STDERR "check_summit_copy: $date $exp_name has download_state $download_state";
    359             if ($exp_type ne 'OBJECT') {
     415            if (($exp_type ne 'OBJECT')||($exp_name =~ /^c.*/)) {
    360416                print STDERR " (but I don't care).\n";
    361417            }
     
    367423        elsif (!$new_state or $new_state eq 'run' ) {
    368424            print STDERR "check_summit_copy: $date $exp_name has new_state $new_state";
    369             if ($exp_type ne 'OBJECT') {
     425            if (($exp_type ne 'OBJECT')||($exp_name =~ /^c.*/)) {
    370426                print STDERR " (but I don't care).\n";
    371427            }
     
    498554
    499555    my $cmd = "$chiptool";
    500     $cmd .= ' -simple -dbname gpc1 -definebyquery -set_end_stage warp ';
     556    $cmd .= " -simple -dbname $dbname -definebyquery -set_end_stage warp ";
    501557    $cmd .= " -set_label $label ";
    502558    $cmd .= " -set_workdir $workdir -set_dist_group $dist_group ";
     
    612668
    613669#
     670# DQstats
     671################################################################################
     672
     673sub construct_dqstats_cmd {
     674    my $date = shift;
     675
     676    my $select = "-dateobs_end ${date}T23:59:59 ";
     677
     678    my $cmd = "$dqstatstool";
     679    $cmd .= " -simple -dbname $dbname -definebyquery ";
     680    $cmd .= " $select ";
     681    $cmd .= " -label %.nightlyscience ";
     682    $cmd .= " -set_label dqstats.nightlyscience ";
     683    if ($debug == 1) {
     684        $cmd .= ' -pretend ';
     685    }
     686    print STDERR "$cmd\n";
     687    return($cmd);
     688}
     689
     690sub pre_dqstats_queue {
     691    my $date = shift;
     692   
     693#     my $db = init_gpc_db();
     694#     my $trunc_date = $date; $trunc_date =~ s/-//g;
     695
     696#     my $where = " label LIKE '%.nightlyscience' AND data_group' ";
     697#     my $chip_sth = "SELECT * from chipRun WHERE (state = 'full' OR state = 'new' OR state = 'cleaned') AND $where ";
     698#     my $cam_sth = "SELECT * from camRun WHERE state = 'full' AND $where ";
     699
     700#     my $chip_ref = $db->selectall_arrayref( $chip_sth );
     701#     my $cam_ref = $db->selectall_arrayref( $cam_sth );
     702   
     703    my $command = construct_dqstats_cmd($date) . ' -pretend ';
     704    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     705        run ( command => $command, verbose => $verbose );
     706    unless ($success) {
     707        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
     708        &my_die("Unable to perform dqstatstool: $error_code",1,1,,$date, $PS_EXIT_SYS_ERROR);
     709    }
     710   
     711    my @input_exposures = split /\n/, (join '', @$stdout_buf);
     712
     713    return($#input_exposures + 1,1,1); # $#{ $chip_ref } + 1, $#{ $cam_ref } + 1);
     714}
     715 
     716sub dqstats_queue {
     717    my $date = shift;
     718
     719    my $command = construct_dqstats_cmd($date);
     720    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     721        run ( command => $command, verbose => $verbose );
     722    unless ($success) {
     723        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
     724        &my_die("Unable to perform dqstatstool: $error_code", 0,0,$date, $PS_EXIT_SYS_ERROR);
     725    }
     726    return(0);
     727
     728}
     729sub execute_dqstats {
     730    my $date = shift;
     731    my $pretend = shift;
     732    my ($Nexposures,$Nchips,$Ncams) = pre_dqstats_queue($date);
     733    if ($Nexposures == 0) {
     734        print STDERR "execute_dqstats: No exposures on date $date.\n";
     735    }
     736    elsif ($Ncams != $Nchips) {
     737        print STDERR "execute_dqstats: Not done processing data through camera stage.\n";
     738    }
     739    else {
     740        unless(defined($pretend)) {
     741            dqstats_queue($date);
     742        }
     743    }
     744}   
     745#
     746# Detrend verification
     747################################################################################
     748
     749sub construct_dettool_cmd {
     750    my $date = shift;
     751    my $target = shift;
     752
     753    my ($label,$workdir,$filter,$exp_type,$det_type,$ref_det_id,$ref_iter,$maxN) = get_dettool_parameters($date,$target);
     754   
     755    my $select = "-select_dateobs_begin ${date}T00:00:00 -select_dateobs_end ${date}T23:59:59 ";
     756    $date =~ s/-//g;
     757
     758    my $cmd = "$dettool";
     759#    $cmd .= " -pretend ";
     760    $cmd .= " -simple -dbname $dbname -definebyquery -det_type $det_type ";
     761    $cmd .= " -mode verify -ref_det_id $ref_det_id -ref_iter $ref_iter ";
     762    $cmd .= " $select ";
     763    $cmd .= " -inst $camera ";
     764    $cmd .= " -select_exp_type $exp_type ";
     765    $cmd .= " -select_filter $filter " if defined($filter);
     766    $cmd .= " -workdir $workdir ";
     767    $cmd .= " -label $label ";
     768    if ($maxN > 0) {
     769        $cmd .= " -random_subset -random_limit $maxN ";
     770    }
     771    if ($debug == 1) {
     772        $cmd .= ' -pretend ';
     773    }
     774    print STDERR "$cmd\n";
     775    return($cmd);
     776}   
     777
     778sub verify_uniqueness_detverify {
     779    my $date = shift;
     780    my $target = shift;
     781
     782    my ($label,$workdir,$filter,$exp_type,$det_type,$ref_det_id,$ref_iter,$maxN) = get_dettool_parameters($date,$target);
     783   
     784    my $db = init_gpc_db();
     785    my $sth = "SELECT * FROM detRun WHERE workdir = '$workdir' AND ref_det_id = $ref_det_id AND ref_iter = $ref_iter";
     786    my $data_ref = $db->selectall_arrayref( $sth );
     787
     788    return($#{ $data_ref } + 1);
     789}
     790
     791sub pre_detrend_queue {
     792    my $date = shift;
     793    my $target = shift;
     794   
     795    my $command = construct_dettool_cmd($date,$target) . ' -pretend ';
     796    my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     797        run ( command => $command, verbose => $verbose);
     798    unless ($success) {
     799        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
     800        &my_die("Unable to perform dettool: $error_code", 0,0, $date, $PS_EXIT_SYS_ERROR);
     801    }
     802   
     803    my @input_exposures = split /\n/, (join '', @$stdout_buf);
     804    return($#input_exposures + 1);
     805}
     806
     807sub detrend_queue {
     808    my $date = shift;
     809    my $target = shift;
     810   
     811    my $command = construct_dettool_cmd($date,$target);
     812    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     813        run ( command => $command, verbose => $verbose);
     814    unless ($success) {
     815        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
     816        &my_die("Unable to perform chiptool: $error_code", 0,0,$date, $PS_EXIT_SYS_ERROR);
     817    }
     818    $metadata_out{nsState} = 'DETREND_QUEUED';
     819    return(0);
     820
     821}
     822sub execute_detrends {
     823    my $date = shift;
     824    my $pretend = shift;
     825    my $exposures = 0;
     826    foreach my $target (@detrend_list) {
     827        my ($Nexposures) = pre_detrend_queue($date,$target);
     828        if ($Nexposures == 0) {
     829            print STDERR "execute_detrends: Target $target on $date had no exposures.\n";
     830            next;
     831        }
     832        $exposures++;
     833        unless(defined($pretend)) {
     834            detrend_queue($date,$target);
     835        }
     836    }
     837    if ($exposures == 0) {
     838        $metadata_out{nsState} = 'DETREND_DROP';
     839    }
     840    if (($metadata_out{nsState} eq 'CHECKDETRENDS') && ($exposures > 0)) {
     841        $metadata_out{nsState} eq 'QUEUE_DETRENDS';
     842    }
     843}
     844
     845#
    614846# Stacking
    615847################################################################################
     
    627859    my $cmd = "$stacktool";
    628860#    $cmd .= ' -pretend -simple -dbname gpc1 -definebyquery -min_new 4 ';  # Probably silly, but I want to be safe and not overwrite
    629     $cmd .= ' -simple -dbname gpc1 -definebyquery ';
     861    $cmd .= " -simple -dbname $dbname -definebyquery ";
    630862    $cmd .= " -set_label $label -select_label $label ";
    631863    $cmd .= " -set_workdir $workdir -set_dist_group $dist_group ";
     
    7681000
    7691001    my $command = $clean_commands{$mode};
    770     my $retention_time = $clean_retention{$mode};
     1002    my $retention_time;
     1003    if (exists($cleanmods_list{$target}{$mode})) {
     1004        $retention_time = $cleanmods_list{$target}{$mode};
     1005    }
     1006    else {
     1007        $retention_time = $clean_retention{$mode};
     1008    }
     1009    if ($retention_time <= 0) {
     1010        return("no clean","true");
     1011    }
    7711012
    7721013    my ($year,$month,$day) = split /-/,$date;
     
    7741015                               hour => 0, minute => 0, second => 0, nanosecond => 0,
    7751016                               time_zone => 'Pacific/Honolulu');
     1017       
    7761018    $dt->subtract(days => $retention_time);
    7771019    my $cleaning_date = $dt->ymd;
     
    7791021    my ($label,$workdir,$obs_mode,$object,$comment,$tess_id,$dist_group,$data_group,$reduction) = get_tool_parameters($cleaning_date,$target);
    7801022    my $args = $command;
    781     $args .= " -dbname gpc1 -updaterun -set_state goto_cleaned -state full -set_label goto_cleaned -label $label -data_group $data_group ";
     1023    if ((exists($clean_alternate{$mode})) && ($clean_alternate{$mode})) {
     1024        $args .= " -dbname $dbname -updaterun -set_state goto_cleaned -full -set_label goto_cleaned -time_stamp_end $cleaning_date ";
     1025    }
     1026    else {
     1027        $args .= " -dbname $dbname -updaterun -set_state goto_cleaned -state full -set_label goto_cleaned -label $label -data_group $data_group ";
     1028    }
    7821029    if ($debug == 1) {
    7831030        $args .= ' -pretend ';
     
    7901037    my $pretend = shift;
    7911038
    792     foreach my $mode (keys (%clean_commands)) {
    793         foreach my $target (@target_list) {
    794             if (exists($noclean_list{$target})) {
     1039    foreach my $mode (sort (keys (%clean_commands))) {
     1040        if ((exists($clean_alternate{$mode})) && ($clean_alternate{$mode})) {
     1041            my ($cleaning_date,$command) = construct_cleantool_args($date,"",$mode);
     1042            if ($cleaning_date eq 'no clean') {
    7951043                next;
    7961044            }
    797             my ($cleaning_date,$command) = construct_cleantool_args($date,$target,$mode);
    798 
    7991045            print STDERR "$command\n";
    8001046            if (!(defined($pretend) || $debug == 1)) {
     
    8081054            }
    8091055        }
     1056        else {
     1057            foreach my $target (@target_list) {
     1058                if (exists($noclean_list{$target})) {
     1059                    next;
     1060                }
     1061                my ($cleaning_date,$command) = construct_cleantool_args($date,$target,$mode);
     1062                if ($cleaning_date eq 'no clean') {
     1063                    next;
     1064                }               
     1065                print STDERR "$command\n";
     1066                if (!(defined($pretend) || $debug == 1)) {
     1067#           print STDERR "BEAR IS DRIVING!?\n";
     1068                    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     1069                        run ( command => $command, verbose => $verbose );
     1070                    unless ($success) {
     1071                        $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR);
     1072                        &my_die("Unable to perform stacktool: $error_code", 0,0,$date, $PS_EXIT_SYS_ERROR);
     1073                    }
     1074                }
     1075            }
     1076        }
    8101077    }
    8111078    return(0);
     
    8261093
    8271094    my $label = "${target}.nightlyscience";
    828     my $workdir = "neb://\@HOST\@.0/gpc1/${target}.nt/${workdir_date}";
     1095    my $workdir = "neb://\@HOST\@.0/${dbname}/${target}.nt/${workdir_date}";
    8291096    my $obs_mode = $obsmode_list{$target};
    8301097    my $object   = $object_list{$target};
     
    8371104}
    8381105
     1106sub get_dettool_parameters {
     1107    my $date = shift;
     1108    my $target = shift;
     1109    my $workdir_date = $date; $workdir_date =~ s%-%/%g;
     1110    my $trunc_date = $date; $trunc_date =~ s/-//g;
     1111
     1112    my $exp_type = $exptype_list{$target};
     1113    my $det_type = $dettype_list{$target};
     1114    my $ref_det_id = $refID_list{$target};
     1115    my $ref_iter = $refIter_list{$target};
     1116    my $det_filter = $detfilter_list{$target};
     1117    my $internal_filter;
     1118    if (defined($det_filter)) {
     1119        $internal_filter = $det_filter; $internal_filter =~ s/\..*//;
     1120        $internal_filter = '.' . $internal_filter;
     1121    }
     1122    else {
     1123        $internal_filter = '';
     1124    }
     1125    my $maxN = $detmax_list{$target};   
     1126   
     1127    my $lc_type = lc($exp_type);
     1128    my $label = "${lc_type}${internal_filter}.$trunc_date";
     1129    my $workdir = 'neb://@HOST@.0/' . $dbname . "/detverify.nt/${workdir_date}/${lc_type}${internal_filter}";
     1130    return($label,$workdir,$det_filter,$exp_type,$det_type,$ref_det_id,$ref_iter,$maxN);
     1131}
    8391132
    8401133sub init_gpc_db {
Note: See TracChangeset for help on using the changeset viewer.