Changeset 29893 for trunk/ippScripts/scripts/chip_imfile.pl
- Timestamp:
- Dec 1, 2010, 12:49:23 PM (15 years ago)
- File:
-
- 1 edited
-
trunk/ippScripts/scripts/chip_imfile.pl (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ippScripts/scripts/chip_imfile.pl
r28899 r29893 66 66 67 67 pod2usage( -msg => "Unknown option: @ARGV", -exitval => 2 ) if @ARGV; 68 pod2usage( -msg => "Required options: --exp_id --chip_id --chip_imfile_id --class_id --uri --camera --outroot --run-state ",68 pod2usage( -msg => "Required options: --exp_id --chip_id --chip_imfile_id --class_id --uri --camera --outroot --run-state --dbname", 69 69 -exitval => 3) unless 70 70 defined $exp_id and … … 75 75 defined $camera and 76 76 defined $outroot and 77 defined $dbname and 77 78 defined $run_state; 78 79 79 80 my_die ("$run_state is an invalid value for run-state", $exp_id, $chip_id, $class_id, $PS_EXIT_PROG_ERROR) unless ($run_state eq 'new' or $run_state eq 'update'); 80 81 81 my $ipprc = PS::IPP::Config->new( $camera ) or my_die( "Unable to set up", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR ); # IPP configuration 82 83 my $logDest = $ipprc->filename("LOG.IMFILE", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 84 $logDest .= ".update" if $run_state eq "update"; 82 my $ipprc = PS::IPP::Config->new( $camera ) or my_die( "Unable to set up", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR ); 83 84 my $neb; 85 if (file_scheme($outroot) eq 'neb') { 86 $neb = $ipprc->nebulous(); 87 } 88 89 my ($logDest, $traceDest); 90 if ($run_state eq 'new') { 91 $logDest = prepare_output("LOG.IMFILE", $outroot, $class_id, 0); 92 $traceDest = prepare_output("TRACE.IMFILE", $outroot, $class_id, 1); 93 } else { 94 $logDest = prepare_output("LOG.IMFILE.UPDATE", $outroot, $class_id, 1); 95 $traceDest = prepare_output("TRACE.IMFILE.UPDATE", $outroot, $class_id, 1); 96 } 85 97 86 98 if ($redirect) { … … 90 102 print STDOUT "FULL COMMAND: $0 @ARGS\n\n"; 91 103 } 104 92 105 93 106 # Recipes to use based on reduction class … … 114 127 115 128 ## these names are used in ppImage, and thus may be URIs 116 my $outputImage = $ipprc->filename("PPIMAGE.CHIP", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 117 my $outputMask = $ipprc->filename("PPIMAGE.CHIP.MASK", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 118 my $outputWeight = $ipprc->filename("PPIMAGE.CHIP.VARIANCE", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 119 my $outputBin1 = $ipprc->filename("PPIMAGE.BIN1", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 120 my $outputBin2 = $ipprc->filename("PPIMAGE.BIN2", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 121 my $outputStats = $ipprc->filename("PPIMAGE.STATS", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 122 my $traceDest = $ipprc->filename("TRACE.IMFILE", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 123 my $configuration = $ipprc->filename("PPIMAGE.CONFIG", $outroot, $class_id) or &my_die("Missing entry from camera config", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 124 125 if ($run_state eq 'update') { 126 $outputStats .= '.update'; 127 $traceDest .= '.update'; 129 my $outputImage = prepare_output("PPIMAGE.CHIP", $outroot, $class_id, 1 ); 130 my $outputMask = prepare_output("PPIMAGE.CHIP.MASK", $outroot, $class_id, 1); 131 my $outputWeight = prepare_output("PPIMAGE.CHIP.VARIANCE", $outroot, $class_id, 1); 132 my $pattern = prepare_output("PPIMAGE.PATTERN", $outroot, $class_id, 1); 133 my $backmdl = prepare_output("PSPHOT.BACKMDL", $outroot, $class_id, 1); 134 135 my $configuration; 136 my $outputSources; 137 my $outputPsf; 138 my $outputStats; 139 my $outputBin1; 140 my $outputBin2; 141 my $dump_config = 1; 142 my $do_binned_images = 1; 143 if ($run_state eq 'new') { 144 # prepare the files that are only created for a new run 145 $configuration = prepare_output("PPIMAGE.CONFIG", $outroot, $class_id, 1); 146 $outputStats = prepare_output("PPIMAGE.STATS", $outroot, $class_id, 1); 147 } else { 148 $configuration = $ipprc->filename('PPIMAGE.CONFIG', $outroot, $class_id) 149 or &my_die("Missing entry from camera config: PPIMAGE.CONFIG", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 150 if ($ipprc->file_exists($configuration)) { 151 $dump_config = 0; 152 } else { 153 print STDERR "WARNING: Config dump file $configuration is missing. Using current recipes and file rules.\n"; 154 155 # XXX: should we create a new config dump file? 156 # I vote yes but only if we can distingusing between temporarily unavailable and GONE. 157 my $gone = 0; 158 if (storage_object_exists($configuration, \$gone)) { 159 if ($gone) { 160 rename_gone_file($configuration); 161 $configuration = prepare_output('PPIMAGE.CONFIG', $outroot, $class_id, 1); 162 # if we dump the config we need to insure that the config dump represents 163 # the full processing 164 } else { 165 # file is temporarily not available. Don't dump config. 166 $dump_config = 0; 167 } 168 } 169 } 170 128 171 # make sure that any lingering destreak backup files are gone 129 172 $ipprc->delete_destreak_backup_file($outputImage) … … 134 177 or &my_die("failed to delete existing destreak backup weight file", $exp_id, $chip_id, $class_id, $PS_EXIT_UNKNOWN_ERROR); 135 178 } 179 if ($do_binned_images) { 180 $outputBin1 = prepare_output("PPIMAGE.BIN1", $outroot, $class_id, 1); 181 $outputBin2 = prepare_output("PPIMAGE.BIN2", $outroot, $class_id, 1); 182 } 136 183 137 184 my $cmdflags; … … 152 199 my $recipeData = $mdcParser->parse(join "", @$stdout_buf) or 153 200 &my_die("Unable to parse metadata config doc", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR); 201 202 my $do_photom = metadataLookupBool($recipeData, 'PHOTOM'); 203 if ($do_photom and ($run_state eq 'update')) { 204 # If previous photometry outputs are ok skip running photometry 205 if ($dump_config || rerun_photometry($outroot, $class_id)) { 206 carp "Will rerun photometry\n"; 207 } else { 208 $do_photom = 0; 209 } 210 } 211 if ($do_photom) { 212 $outputSources = prepare_output("PSPHOT.OUTPUT", $outroot, $class_id, 1); 213 $outputPsf = prepare_output("PSPHOT.PSF.SAVE", $outroot, $class_id, 1); 214 } 215 154 216 155 217 ## XXX make the feature more general? … … 357 419 } 358 420 421 $command = "$ppImage -file $uri $outroot"; 422 if ($dump_config) { 423 $command .= " -recipe PPIMAGE $recipe_ppImage"; 424 $command .= " -dumpconfig $configuration"; 425 } else { 426 $command .= " -ipprc $configuration"; 427 } 428 if ($do_photom) { 429 $command .= " -recipe PSPHOT $recipe_psphot"; 430 } else { 431 $command .= " -Db PPIMAGE:PHOTOM FALSE"; 432 } 359 433 if ($run_state eq "new") { 360 $command = "$ppImage -file $uri $outroot";361 $command .= " -recipe PPIMAGE $recipe_ppImage";362 $command .= " -recipe PSPHOT $recipe_psphot";363 $command .= " -threads $threads" if defined $threads;364 $command .= " -dbname $dbname" if defined $dbname;365 $command .= " -image_id $chip_imfile_id" if defined $chip_imfile_id;366 $command .= " -source_id $source_id" if defined $source_id;367 $command .= " -dumpconfig $configuration";368 $command .= " -tracedest $traceDest -log $logDest";369 $do_stats = 1;370 } else {371 $command = "$ppImage -file $uri $outroot";372 $command .= " -ipprc $configuration";373 $command .= " -threads $threads" if defined $threads;374 $command .= " -dbname $dbname" if defined $dbname;375 $command .= " -image_id $chip_imfile_id" if defined $chip_imfile_id;376 $command .= " -source_id $source_id" if defined $source_id;377 $command .= " -tracedest $traceDest -log $logDest";378 $command .= " -Db PPIMAGE:PHOTOM FALSE";379 }380 if ($do_stats) {381 434 $command .= " -recipe PPSTATS CHIPSTATS"; 382 435 $command .= " -stats $outputStats"; 383 } 436 $do_stats = 1; 437 } 438 if (!$do_binned_images) { 439 $command .= " -Db PPIMAGE:BIN1.FITS FALSE -Db PPIMAGE:BIN2.FITS FALSE"; 440 } 441 $command .= " -threads $threads" if defined $threads; 442 $command .= " -image_id $chip_imfile_id" if defined $chip_imfile_id; 443 $command .= " -source_id $source_id" if defined $source_id; 444 $command .= " -tracedest $traceDest -log $logDest"; 445 $command .= " -dbname $dbname" if defined $dbname; 384 446 385 447 ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = … … 394 456 my $outputMaskExpect = metadataLookupBool($recipeData, 'CHIP.MASK.FITS'); 395 457 my $outputWeightExpect = metadataLookupBool($recipeData, 'CHIP.VARIANCE.FITS'); 458 my $outputBackmdlExpect = metadataLookupBool($recipeData, 'BACKGROUND'); 459 my $outputPatternExpect = (metadataLookupBool($recipeData, 'PATTERN.ROW') or metadataLookupBool($recipeData, 'PATTERN.CELL')) ; 396 460 397 461 my $quality; # Quality flag … … 416 480 417 481 if (!$quality) { 418 &my_die("Couldn't find expected output file: $outputImage\n", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless !$outputImageExpect or $ipprc->file_exists($outputImage); 419 &my_die("Couldn't find expected output file: $outputMask\n", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless !$outputMaskExpect or $ipprc->file_exists($outputMask); 420 &my_die("Couldn't find expected output file: $outputWeight\n", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless !$outputWeightExpect or $ipprc->file_exists($outputWeight); 421 &my_die("Couldn't find expected output file: $outputBin1\n", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless $ipprc->file_exists($outputBin1); 422 &my_die("Couldn't find expected output file: $outputBin2\n", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless $ipprc->file_exists($outputBin2); 423 if ($run_state eq 'new') { 424 &my_die("Couldn't find expected output file: $configuration", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless $ipprc->file_exists($configuration); 425 } 426 } 427 482 my $replicateImages = 0; 483 check_output($outputImage, $replicateImages) if $outputImageExpect; 484 check_output($outputMask, $replicateImages) if $outputMaskExpect; 485 check_output($outputWeight, $replicateImages) if $outputWeightExpect; 486 if ($do_binned_images) { 487 check_output($outputBin1, 1); 488 check_output($outputBin2, 1); 489 } 490 check_output($configuration, 1) if $dump_config; 491 check_output($backmdl, 1) if $outputBackmdlExpect; 492 check_output($pattern, 1) if $outputPatternExpect; 493 if ($do_photom) { 494 check_output($outputSources, 1); 495 check_output($outputPsf, 1); 496 } 497 # XXX: Do we want to replicate the stats, logs, trace file? 498 } 428 499 } 429 500 … … 462 533 } 463 534 535 exit 0; 536 537 # check whether psphot outputs should be regenerated. 538 # Whether we need to or not is a somewhat complicated question. 539 sub rerun_photometry 540 { 541 my $outroot = shift; 542 my $class_id = shift; 543 my $outputSources = $ipprc->filename('PSPHOT.OUTPUT', $outroot, $class_id) 544 or &my_die("Missing entry from camera config: PSPHOT.OUTPUT", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 545 546 my $make_sources = 0; 547 my $sources_available = 0; 548 if ($ipprc->file_exists($outputSources)) { 549 $sources_available = 1; 550 } else { 551 carp "WARNING: photometry sources file $outputSources is not available"; 552 my $gone; 553 if (storage_object_exists($outputSources, \$gone)) { 554 # check whether the file is permanantely or temporarily gone 555 if ($gone) { 556 carp "WARNING: photometry sources storage object exists but all instances are permanently gone"; 557 rename_gone_file($outputSources); 558 $make_sources = 1; 559 } 560 } else { 561 # storage object must have been deleted 562 $make_sources = 1; 563 } 564 } 565 566 my $make_psf = 0; 567 my $psf_available = 0; 568 my $outputPsf = $ipprc->filename("PSPHOT.PSF.SAVE", $outroot, $class_id) 569 or &my_die("Missing entry from camera config: PSPHOT.PSF.SAVE", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 570 if ($ipprc->file_exists($outputPsf)) { 571 $psf_available = 1; 572 } else { 573 carp "PSF file $outputPsf is missing"; 574 my $gone = 0; 575 if (storage_object_exists($outputPsf, \$gone)) { 576 # object exists, but no instances are available. If they are permanently gone 577 # rename the storage object 578 if ($gone) { 579 carp "WARNING: PSF storage object exists but all instances are permanently gone"; 580 rename_gone_file($outputPsf); 581 $make_psf = 1; 582 } 583 } else { 584 $make_psf = 1; 585 } 586 } 587 588 if ($sources_available && $psf_available) { 589 return 0; 590 } 591 592 # if either of the files are gone rerun photometry unless the other file is temporarily not available 593 594 if (!$sources_available && !$make_sources) { 595 # destreak will die if the sources is not available 596 &my_die("PSPHOT.SOURCES is missing but we cannot regenerate it", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR); 597 } 598 if (!$psf_available && !$make_psf) { 599 # warp updates need the psf file 600 &my_die("PSPHOT.PSF.SAVE is missing but we cannot regenerate it", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR); 601 } 602 603 return $make_psf || $make_sources; 604 } 605 606 # subroutine to check the status of a nebulous file. Used to distinguish between a storage object that 607 # does not exist and one that all of the instances have been lost. 608 # XXXX This should be implemented properly in Nebulous 609 # For now uses Bill's script 'whichnode' which queries the nebulous database directly 610 611 my $whichnode; 612 sub storage_object_exists 613 { 614 my $file = shift; 615 my $ref_all_gone = shift; 616 617 my $exists = $neb->storage_object_exists($file); 618 if (!$exists) { 619 return 0; 620 } 621 622 if (!$whichnode) { 623 $whichnode = can_run('whichnode') or 624 &my_die("Can't find whichnode", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 625 } 626 627 my $command = "$whichnode $file"; 628 629 my ( $success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 630 run(command => $command, verbose => $verbose); 631 unless ($success) { 632 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 633 &my_die("Unable to perform whichnode: $error_code", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 634 } 635 636 my @lines = split "\n", (join "", @$stdout_buf); 637 638 if (scalar @lines == 0) { 639 # no output the file is really and truely gone 640 # XXX: this is now caught above 641 print STDERR "storage object for $file does not exist\n"; 642 return 0; 643 } 644 645 my $numGone = 0; 646 my $numNotGone = 0; 647 foreach my $line (@lines) { 648 chomp $line; 649 650 # output lines are either 651 # "volume available" 652 # or 653 # "volume not available" 654 655 my ($volume, $answer, undef) = split " ", $line; 656 # our hack is if the volume has an X in the name it's gone 657 if ($volume =~ /X/) { 658 print STDERR "$file is on $volume which is gone\n"; 659 $numGone++; 660 } elsif ($answer eq 'available') { 661 $numNotGone++; 662 } elsif ($answer eq 'not') { 663 print STDERR "$file is on $volume which is not available\n"; 664 $numNotGone++; 665 } else { 666 print STDERR "unexpected output from whichnode: $line\n"; 667 } 668 } 669 # if there are any instances that are not on a gone volume set all_gone to 0 670 if ($numNotGone == 0 and $numGone > 0) { 671 $$ref_all_gone = 1; 672 } else { 673 $$ref_all_gone = 0; 674 } 675 676 # storage object exists so return true 677 return 1; 678 } 679 sub rename_gone_file 680 { 681 # check whether the only instance of file is on a lost volume 682 # XXX: we don't have a proper interface for this. 683 # For now try to use Bill's hack: the script 'whichnode' 684 685 my $file = shift; 686 $neb->move($file, "$file.gone") or 687 &my_die("failed to rename: $file", $exp_id, $chip_id, $class_id, $PS_EXIT_CONFIG_ERROR); 688 } 689 690 # Prepare to write to an output file 691 # Lookup the filename in the rules. 692 # Make sure that if file exists and is a nebulous file that there is only one instance 693 # Deal with files that have been lost. 694 sub prepare_output 695 { 696 my $filerule = shift; 697 my $outroot = shift; 698 my $class_id = shift; 699 my $delete = shift; 700 $delete = 0 if !defined $delete; 701 702 my $error; 703 my $output = $ipprc->prepare_output($filerule, $outroot, $class_id, $delete, \$error) 704 or &my_die("failed to prepare output file for: $filerule", $exp_id, $chip_id, $class_id, $error); 705 return $output; 706 } 707 708 sub check_output 709 { 710 my $file = shift; 711 my $replicate = shift; 712 713 if (!defined $file) { 714 return; 715 } 716 717 &my_die("Couldn't find expected output file: $file", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR) unless $ipprc->file_exists($file); 718 719 if ($replicate and (file_scheme($file) eq 'neb')) { 720 $ipprc->replicate_file($file) or &my_die("failed to replicate: $file\n", $exp_id, $chip_id, $class_id, $PS_EXIT_SYS_ERROR); 721 } 722 } 464 723 465 724 sub my_die
Note:
See TracChangeset
for help on using the changeset viewer.
