IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Apr 19, 2013, 3:39:39 PM (13 years ago)
Author:
eugene
Message:

merged from trunk

Location:
branches/eam_branches/ipp-20130307/pstamp/scripts
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/eam_branches/ipp-20130307/pstamp/scripts

  • branches/eam_branches/ipp-20130307/pstamp/scripts/pstampparse.pl

    r34447 r35412  
    2727my $outdir;
    2828my $product;
    29 my $label;
     29my $label = "";
    3030my $save_temps;
    3131my $no_update;
     
    5757    die "outdir is required"  if !$outdir;
    5858    die "product is required"  if !$product;
     59} else {
     60    $req_id = 0;
     61    $outdir = "nowhere";
     62    $product = "dummy";
    5963}
    6064
     
    8387$pstamptool .= " -dbserver $dbserver" if $dbserver;
    8488
    85 # list_job is a deugging mode
    86 $no_update = 1 if $mode eq "list_job";
     89# If $mode is not queue_job we are using a debugging mode
     90# do not update the database
     91$no_update = 1 if $mode ne "queue_job";
    8792
    8893my $mdcParser = PS::IPP::Metadata::Config->new; # Parser for metadata config files
    8994
    9095#
    91 # get the data from the extension header
     96# Read the keywords from the extension header
    9297#
    9398my $fields_output;
    9499{
    95     my $command = "echo $request_file_name | $fields -x 0 EXTNAME EXTVER REQ_NAME ACTION USER EMAIL";
     100    my $command = "echo $request_file_name | $fields -x 0 EXTNAME EXTVER REQ_NAME ACTION EMAIL";
    96101    my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
    97102        run(command => $command, verbose => $verbose);
    98     # fields doesn't return zero when it succeeds
    99     #unless ($success) {
    100     #    print STDERR @$stderr_buf;
    101     #}
     103
     104    # note fields doesn't return zero when it succeeds.
    102105    $fields_output = join "", @$stdout_buf;
    103106}
    104 my (undef, $extname, $extver, $req_name, $action, $username, $email) = split " ", $fields_output;
     107my (undef, $extname, $extver, $req_name, $action, $email) = split " ", $fields_output;
    105108
    106109# make sure the file contains what we are expecting
    107 # This program shouldn't have been run if the request file is bogus.
    108 # No need to notify the client
    109 my_die("$request_file_name is not a PS1_PS_REQEST", $PS_EXIT_PROG_ERROR) if $extname ne "PS1_PS_REQUEST";
    110 my_die("REQ_NAME not found in $request_file_name", $PS_EXIT_PROG_ERROR)  if (!$req_name);
    111 my_die("wrong EXTVER $extver found in $request_file_name", $PS_EXIT_PROG_ERROR) if ($extver ne "1" and $extver ne "2");
    112 
     110# pstamp_parser_run.pl would not have run this program unless the request file was ok
     111my_die("$request_file_name does not contain EXTNAME\n", $PS_EXIT_PROG_ERROR) if !$extname;
     112my_die("$request_file_name is not a PS1_PS_REQUEST\n", $PS_EXIT_PROG_ERROR) if $extname ne "PS1_PS_REQUEST";
     113my_die("REQ_NAME not found in $request_file_name\n", $PS_EXIT_PROG_ERROR)  if (!$req_name);
     114my_die("wrong EXTVER $extver found in $request_file_name\n", $PS_EXIT_PROG_ERROR) if ($extver ne "1" and $extver ne "2");
     115
     116if ($extver >= 2) {
     117    # We have a version 2 file. Require that the new keywords be supplied.
     118    my_die("action not supplied in version $extver request file $request_file_name\n", $PSTAMP_INVALID_REQUEST) unless defined $action;
     119
     120    my_die("invalid action: $action supplied in version $extver request file $request_file_name\n", $PSTAMP_INVALID_REQUEST) unless (uc($action) eq 'PROCESS' or uc($action) eq 'PREVIEW');
     121
     122    my_die("email not supplied in version $extver request file $request_file_name\n", $PSTAMP_INVALID_REQUEST) unless $email;
     123    # XXX check for "valid" $email
     124} else {
     125    # for version 1 file the action is process and email is not used
     126    $action = 'PROCESS';
     127    $email = 'null';
     128}
     129
     130print "Request Header Keywords EXTVER: $extver REQ_NAME: $req_name ACTION: $action EMAIL: $email\n";
    113131
    114132# check for duplicate request name
     
    161179    # the output data store's product name
    162180    my $command = "$pstamptool -updatereq -req_id $req_id  -set_name $req_name";
     181    $command .= " -set_username $email" if $email ne 'null';
    163182    $command .= " -set_outProduct $product";
    164183    $command .= " -set_label $label" if $label_changed;
     
    174193
    175194#
    176 # now convert the request table to an array of metadata config docs
     195# now convert the request table to an array of metadatas
    177196#
    178197
     
    191210    my $dtime_request_file = gettimeofday() - $start_request_file;
    192211    print "Time to read and parse request file: $dtime_request_file\n";
    193 
    194 }
    195 
    196 #
    197 # Loop over rows in the request file collecting consecutive rows that have the "same images of interest"
    198 # in the sense that their selection parameters will yield the same "Runs".
    199 # Process the groups of rows together to reduce lookup time and to potentially make multiple
    200 # stamps from the same ppstamp process.
    201 #
    202 my @rowList;
     212}
     213
     214my $nRows = scalar @$rows;
     215print "\n$nRows rows read from request file\n";
     216
     217
    203218my $num_jobs = 0;
    204219my $imageList;
    205220my $stage;
    206 my $need_magic;
    207221foreach my $row (@$rows) {
    208     # santiy check the paramaters
     222
     223    if ($label eq 'WEB.UP' and ($nRows > 500 or $num_jobs > 500) and $req_id and !$no_update) {
     224        # this is a big request and it came from the upload page and doesn't have a specific label assigned
     225        # change it to the generic one that has lower with lower priority
     226        $label = 'WEB.BIG';
     227        print "\nChanging label for big WEB.UP request to $label\n";
     228
     229        my $command = "$pstamptool -updatereq -req_id $req_id  -set_label $label";
     230        my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) =
     231            run(command => $command, verbose => $verbose);
     232        unless ($success) {
     233            my_die("$command failed", $PS_EXIT_UNKNOWN_ERROR);
     234        }
     235    }
     236
     237    # validate the paramaters
    209238    if (!checkRow($row)) {
    210239        # when it enconters an error checkRow adds a fake job with an appropriate error code to the database
     
    216245    $row->{error_code} = 0;
    217246
    218     if (scalar @rowList == 0) {
    219         push @rowList, $row;
    220         next;
    221     }
    222 
    223     my $firstRow = $rowList[0];
    224     if (same_images_of_interest($firstRow, $row)) {
    225         # add this row to the list and move on
    226         push @rowList, $row;
    227         next;
    228     }
    229 
    230     # the images of interest for this new row doesn't match the list.
    231     # process the list ...
    232     $num_jobs += processRows($action, \@rowList);
    233 
    234     # and reset the list to contain just the new row
    235     @rowList = ($row);
    236 }
    237 
    238 # out of rows process the list
    239 if (scalar @rowList > 0) {
    240     $num_jobs += processRows($action, \@rowList);
     247    $num_jobs += processRow($action, $row);
    241248}
    242249
     
    252259    my $row = shift;
    253260
     261    # check validity of the paramters in a request specification
    254262    # If we encounter an error for a particular row add a job with the proper fault code.
     263    # also adjust some paramterers like filter and set defaults for some others
    255264
    256265    my $stage = $row->{IMG_TYPE};
     
    284293    }
    285294
    286 
    287295    my $component = $row->{COMPONENT};
    288296    if (!defined $component or (lc($component) eq "null") or (lc($component) eq "all")) {
     
    314322        return 0;
    315323    }
     324
     325    my $fwhm_min = $row->{FWHM_MIN};
     326    if (!defined $fwhm_min) {
     327        $row->{FWHM_MIN} = 0;
     328    } elsif (!validNumber($fwhm_min)) {
     329        print STDERR "$fwhm_min is not a valid FWHM_MIN\n";
     330        insertFakeJobForRow($row, 1, $PSTAMP_INVALID_REQUEST);
     331        return 0;
     332    }
     333    my $fwhm_max = $row->{FWHM_MAX};
     334    if (!defined $fwhm_max) {
     335        $row->{FWHM_MAX} = 0;
     336    } elsif (!validNumber($fwhm_max)) {
     337        print STDERR "$fwhm_max is not a valid FWHM_MAX\n";
     338        insertFakeJobForRow($row, 1, $PSTAMP_INVALID_REQUEST);
     339        return 0;
     340    }
     341
    316342    my $data_group = $row->{DATA_GROUP};
    317343    if (!defined $data_group) {
     
    363389    }
    364390
    365     # $mode list_uri is a debugging mode (it may used by the http interface)
    366     # if this happens just croak
    367    # my_die("job_type is list_uri but mode is $mode", $PS_EXIT_PROG_ERROR) if ($job_type eq "list_uri") and ($mode ne "list_uri");
    368 
    369 
    370391    if ($req_type eq "bycoord") {
    371392        if (!$skycenter) {
     
    384405    }
    385406
     407
    386408    return 1;
    387409}
     
    392414
    393415    $num_jobs = 1;
     416    return $num_jobs;
     417}
     418
     419sub processRow {
     420    my $action  = shift;
     421    my $row     = shift;
     422
     423    my $num_jobs = 0;
     424
     425    my $project  = $row->{PROJECT};
     426
     427    # note: resolve_project avoids running pstamptool every time by remembering the
     428    # last project resolved
     429    my $proj_hash = resolve_project($ipprc, $project, $dbname, $dbserver);
     430    if (!$proj_hash) {
     431        insertFakeJobForRow($row, 1, $PSTAMP_UNKNOWN_PROJECT);
     432        $num_jobs++;
     433        return $num_jobs;
     434    }
     435    my $image_db   = $proj_hash->{dbname};
     436    my $camera     = $proj_hash->{camera};
     437
     438    my $req_type    = $row->{REQ_TYPE};
     439    my $rownum      = $row->{ROWNUM};
     440
     441    # Since user can get unmagicked data "by coordinate" requests can go back in time
     442    # to dredge unusable data from the "dark days"...
     443    if ($req_type eq 'bycoord' and $row->{IMG_TYPE} ne 'stack' and $row->{MJD_MIN} == 0) {
     444        # ... so unless the user sets mjd_min clamp it to 2009-04-01
     445        # XXX: This value should live in the pstampProject table not be hardcoded here
     446        $row->{MJD_MIN} = 54922;
     447    }
     448
     449    if (($req_type eq 'byskycell') or ($req_type eq 'bycoord')) {
     450        # avoid error from print below if $id isn't needed
     451        $row->{ID} = "" if !$row->{ID};
     452    }
     453   
     454    # Call PS::IPP::PStamp::Job locate_images subroutine to get the images for this
     455    # request specification. An array reference is returned.
     456    my $start_locate = gettimeofday();
     457
     458    print "\nCalling new_locate_images for row: $rownum\n";
     459
     460    $imageList = locate_images_for_row($ipprc, $image_db, $camera, $row, $verbose);
     461
     462    my $dtime_locate = gettimeofday() - $start_locate;
     463    print "Time to locate_images for row $rownum $dtime_locate\n";
     464
     465    my @rowList = ($row);
     466    $num_jobs += queueJobs($action, \@rowList, $imageList);
     467
     468    # if this row slipped through without a job being added add one.
     469    if ($row->{job_num} == 0) {
     470        print "row $row->{ROWNUM} produced no jobs\n";
     471        print STDERR "row $row->{ROWNUM} produced no jobs\n";
     472        my $error_code = $row->{error_code};
     473        $error_code =  $PSTAMP_NO_IMAGE_MATCH if !$error_code;
     474        insertFakeJobForRow($row, ++$row->{job_num}, $error_code);
     475    }
     476
    394477    return $num_jobs;
    395478}
     
    401484
    402485    if ($action eq 'LIST') {
     486        # LIST is not allowed by caller. Can't get here.
    403487        return list_targets($rowList);
    404488    }
     
    420504    }
    421505    my $req_type  = $row->{REQ_TYPE};
    422     $stage        = $row->{IMG_TYPE};
     506    my $stage     = $row->{IMG_TYPE};
    423507    my $id        = $row->{ID};
    424508    my $component = $row->{COMPONENT};
     
    436520    my $image_db   = $proj_hash->{dbname};
    437521    my $camera     = $proj_hash->{camera};
    438     $need_magic    = $proj_hash->{need_magic};
     522    my $need_magic    = $proj_hash->{need_magic};
    439523    # Since user can get unmagicked data "by coordinate" requests can go back in time
    440524    # to dredge unusable data from the "dark days"...
     
    496580    # information required is contained there
    497581
    498     $imageList = locate_images($ipprc, $image_db, \@rowList, $req_type, $stage, $id, $tess_id, $component,
     582    $imageList = locate_images($ipprc, $image_db, $rowList, $req_type, $stage, $id, $tess_id, $component,
    499583                $option_mask, $need_magic, $mjd_min, $mjd_max, $filter, $data_group, $verbose);
    500584
     
    506590    $row->{need_magic} = $need_magic;
    507591
    508     $num_jobs += queueJobs($mode, \@rowList, $imageList);
     592    $num_jobs += queueJobs($action, $rowList, $imageList);
    509593
    510594    # if a row slipped through with no jobs add a faulted one
    511     foreach my $row (@rowList) {
     595    foreach my $row (@$rowList) {
    512596        if ($row->{job_num} == 0) {
    513597            print "row $row->{ROWNUM} produced no jobs\n";
     
    528612    my $image = shift;
    529613    my $need_magic = shift;
    530     my $mode = shift;
     614    my $action = shift;
    531615
    532616    my $rownum = $row->{ROWNUM};
     
    611695    write_params($output_base, $image);
    612696
    613     my $newState = "run";
     697    my $newState = $action eq 'PROCESS' ? "run" : "parsed";
    614698    my $fault = 0;
    615699    my $dep_id;
    616700
    617     queueUpdatesIfNeeded($stage, $image, $option_mask, \$newState, \$fault, \$dep_id);
     701    queueUpdatesIfNeeded($action, $stage, $image, $option_mask, \$newState, \$fault, \$dep_id);
    618702
    619703    my $command = "$pstamptool -addjob  -req_id $req_id -job_type $row->{JOB_TYPE}"
     
    644728sub queueJobs
    645729{
    646     my $mode = shift;
     730    my $action = shift;
    647731    my $rowList = shift;
    648732    my $imageList = shift;
    649733
    650     my $firstRow = $rowList[0];
     734    my $firstRow = $rowList->[0];
    651735    my $stage    = $firstRow->{IMG_TYPE};
    652736    my $job_type = $firstRow->{JOB_TYPE};
     
    656740
    657741    if ($mode eq "list_uri") {
     742        $num_jobs = $imageList ? scalar @$imageList : 0;
     743        print "List of $num_jobs Images selected for row: $firstRow->{ROWNUM}\n";
    658744        foreach my $image (@$imageList) {
    659745            print "$image->{image}\n";
     746            ++$firstRow->{job_num};
    660747        }
    661748    } elsif ($job_type eq "get_image") {
     
    664751        my_die( "error: unexpected number of rows for get_image request: $n", $PS_EXIT_PROG_ERROR) if $n != 1;
    665752
    666         $num_jobs = queueGetImageJobs($firstRow, $imageList, $stage, $need_magic, $mode);
     753        $num_jobs = queueGetImageJobs($firstRow, $imageList, $stage, $need_magic, $action);
    667754
    668755    } else {
     
    692779                my $row = $rowList->[$i];
    693780
    694                 $num_jobs += queueJobForImage($row, $stage, $image, $need_magic, $mode);
     781                $num_jobs += queueJobForImage($row, $stage, $image, $need_magic, $action);
    695782            }
    696783        }
     
    706793    my $stage = shift;
    707794    my $need_magic = shift;
    708     my $mode = shift;
     795    my $action = shift;
    709796
    710797    my $num_jobs = 0;
     
    753840        write_params($output_base, $image);
    754841
    755         my $newState = "run";
     842        my $newState = $action eq 'PROCESS' ? "run" : "parsed";
    756843        my $fault = 0;
    757844        my $dep_id;
    758845
    759         queueUpdatesIfNeeded($stage, $image, $option_mask, \$newState, \$fault, \$dep_id);
     846        queueUpdatesIfNeeded($action, $stage, $image, $option_mask, \$newState, \$fault, \$dep_id);
    760847
    761848        $num_jobs++;
     
    899986sub get_dependent
    900987{
    901     my ($r_jobState, $r_fault, $r_dep_id, $imagedb, $state, $stage, $stage_id, $component, $need_magic) = @_;
     988    my ($action, $r_jobState, $r_fault, $r_dep_id, $imagedb, $state, $stage, $stage_id, $component, $need_magic) = @_;
    902989
    903990    # chipRun's can be in full state if destreaking is necessary
     
    9181005    my $command = "$pstamptool -getdependent -stage $stage -stage_id $stage_id -imagedb $imagedb -component $component -outdir $outdir";
    9191006    $command .= " -need_magic" if $need_magic;
    920 
    921     # compute rlabel for the run.
    922     # XXX: This bit of policy shouldn't be buried so deeply in the code
    923     # For now use one that implies 'postage stamp server' 'update' 'request_label"
    924     my $rlabel = "ps_ud_" . $label if $label;
    925     $command .= " -rlabel $rlabel" if $rlabel;
     1007    $command .= ' -hold' if $action eq 'PREVIEW';
     1008
     1009    if ($label) {
     1010        # compute rlabel for the run.
     1011        # XXX: This bit of policy shouldn't be buried so deeply in the code
     1012        # For now use one that implies 'postage stamp server' 'update' 'request_label"
     1013        my $rlabel = "ps_ud_" . $label;
     1014        $command .= " -rlabel $rlabel";
     1015    }
    9261016
    9271017    if (!$no_update) {
     
    9311021            my $fault = $error_code >> 8;
    9321022            print STDERR "$command failed with fault $fault\n";
    933             if ($fault < 10) {
     1023            if ($fault < $PSTAMP_FIRST_ERROR_CODE) {
    9341024                # pstamptool returns an error if an existing depenent is faulted
    935                 # Set the object to not available even if the fault < 10
     1025                # Set the object to not available even if the fault < $PSTAMP_FIRST_ERROR_CODE
    9361026                # which is nominally a recoverable error in order to keep
    9371027                # the request from faulting (which can be very expensive if
     
    9391029                $fault = $PSTAMP_NOT_AVAILABLE
    9401030            }
    941             if ($fault >= 10) {
     1031            if ($fault >= $PSTAMP_FIRST_ERROR_CODE) {
    9421032                $$r_dep_id = 0;
    9431033                $$r_fault = $fault;
     
    9671057
    9681058sub queueUpdatesIfNeeded {
     1059    my $action = shift;
    9691060    my $stage = shift;
    9701061    my $image = shift;
     
    9731064    my $r_fault = shift;
    9741065    my $r_dep_id = shift;
     1066
     1067    my $need_magic = 0;
    9751068
    9761069    if ($stage ne 'raw') {
     
    10161109                    # set up to queue an update run
    10171110                    my $require_magic = ($need_magic or $image->{magicked});
    1018                     get_dependent(\$$r_newState, \$$r_fault, $r_dep_id, $image->{imagedb},
     1111                    get_dependent($action, \$$r_newState, \$$r_fault, $r_dep_id, $image->{imagedb},
    10191112                        $run_state, $stage, $image->{stage_id}, $image->{component}, $require_magic );
    10201113                }
     
    10701163    my $fault = shift;
    10711164
    1072     carp $msg;
     1165    print STDERR $msg;
    10731166
    10741167    # we don't fault the request here pstamp_parser_run.pl handles that if necessary
Note: See TracChangeset for help on using the changeset viewer.