package MakeMOSImage; use strict; use English; use Carp; use vars qw(@ISA $VERSION $name $author $date $version @instList $numberOfStreams); @ISA = qw(Module); use ModuleResources; use ModuleUtil; use Astro::FITS::CFITSIO qw(TRUE FALSE); # Declare identity, version, author, date, etc. $name = __PACKAGE__; $VERSION = '2.15'; $version = $VERSION; $author = 'Richard West,Dean Hinshaw,Duncan John Fyfe,Ian Stewart,Duncan Law-Green,Eduardo Ojero, Ed Chapin'; $date = '2013-06-11'; # # ChangeLog # ========= # # Version 2.15 - 2013-06-11 (EC) # ------------ # # + Merge changes from SOC version. # # version 2.14 - 2012-05-03 DLG # ------------ # # + Modify examineGTI to use optimised GTI where found # # version 2.13 - 2012-05-03 DLG # ------------ # # + Eliminate use of GIF bitmaps # # version 2.12 - 2012-03-08 DLG # ------------ # # + Generate band-8 non-vig exposure map # # version 2.11 - 2012-02-29 DLG # ------------ # # + Generate band 8 image event list # # version 2.10 - 2011-06-30 DLG # ------------ # # + Add call to etruecolor to generate 3-band colour images # # version 2.09.1 - 2011-08-09 EOP # -------------- # # + Replace GIF by PNG to avoid crash on 64-bit. # # version 2.09 - 2006-09-20 # ------------ # # + Record EXPOSURE of band 8 image and state of flarescreening in the database. # # version 2.08 - 2006-01-20 DJF # ------------ # # + Moved isEmageEmpty code to common module library ModuleUtil. # # version 2.07 - 2005-11-22 IMS # ------------ # + Oops, was making the gif of exposure map band 8 (new in version 2.04) but neglected to carry on and make the png. # # version 2.06 - 2005-11-16 IMS # ------------ # + Incorporated DJF's shortened intermediate file names. # # version 2.05 - 2005-11-02 DJF # ------------ # + Only pass band 1-5 pimin + pimax to non-vig exp amp eepmap call. # it fails if you pass it too many pimin and not enough images # # version 2.04 - 2005-11-02 IMS # ------------ # # + Shortened the content string (thus the name) of the non-vig exposure map. # + Non-vig exp maps now only made for bands 1-5 (no longer for 8). # + FOV intermediate image is no longer made as there does not seem to be a use for it. # + Now makes band 8 exposure map PNG product. # # version 2.03 - 2005-09-23 IMS # ------------ # # + In the subroutine examineGTI, the reference $flareScreen rather than its value ${$flareScreen} was being tested. This resulted in (for example) event-filtering by empty flare GTI files. This is now fixed (I hope). # # version 2.02 - 2005-08-15 RGW # ------------ # # + reinstated filtered image event list # + module was choosing not to create PNGs even though the full-band # image contained events # # version 2.01 - 2005-06-06 IMS # ------------ # # + FLAG selection #XMMEA_EM replaced by explicit '(FLAG & 0x766ba000)==0'. At present they are the same, but XMMEA_EM is subject to change, and it seems to me better to retain control of this area. # + Band 8 flag selection now identical to other bands, except OUT_OF_FOV bit not tested. # + Test for empty band!=8 image now done in same way as for band 8 # (ie, uses fimgstat call within subroutine isImageEmpty). The # additional filtered image event list is then not necessary and is # no longer made. # + Non-vignetted exposure map is now also made (as an intermediate file). This is to accommodate new esplinemap call in module ExpDetect-2.01. # # version 2.00 - 2005-05-09 DJF # ------------ # # + Add explicit perl module headers. Previously these were supplied # at compile time. This will make debugging and extending the modules # through additional perl libraries easier. # # + Code layout made more uniform with perltidy # + Standerdized date format (ccyy-mm-dd) # + Standerdized author list to use comma separator # + Make use of perl $VERSION magic. Now $Version = version = '' ## # Version 1.11 - 06Apr2004 (DJF) # ------------ # # + Fixed exposure map creation. Were creating for bands 1,2,3,5,6,8 # rather than 1,2,3,4,5,8 # # Version 1.10 - 29March2004 (DJF) # ------------ # # + Added fix for bad order return of search results from database. # # Version 1.09 - 29March2004 (DJF) # ------------ # # + Moved exposure map file 'creation' to afterempty image tests. # Otherwise we get spurious entries in ppssumm # # Version 1.08 - 03March2004 (DJF) # ------------ # # + Oops, one too few $ in dereference of $flareGTI # # Version 1.07 - 03March2004 (DJF) # ------------ # # + Dereference $flareGTI to get filename in expression. # # # Version 1.06 - 03March2004 (DJF) # ------------ # # + Re-added omitted flare screening GTI filter expression. # # Version 1.05 - 03March2004 (DJF) # ------------ # # + Changed from using energyBands to new energyband(band,bound) function # in ModuleResources. # # Version 1.04 - 02March2004 (DJF) # ------------ # # + Removed superfluous addattribute of BKGDSCRN to band8fov image. # + Correction to energy band selection. Was returning index, low value # rather than low,high value # # Version 1.03 - 18Feb2004 (DJF) # ------------ # # + Addition of BKGDSCRN attribute to some images. Had been lost during re-arrangement. # # Version 1.02 - 12Feb2004 (DJF) # ------------ # # + Use new PCMS function gtiTimeThreshold() to return threshold # # Version 1.01 - 14Jan2004 (DJF) # ------------ # # + Small Flare GTI filtering moved to MOSEvents module. We need only # check the availability and ONTIME here. # # Version 1.00 - 2003-09-05 (DJF) # # + Forked MakeImage v1.63 into MakeMOSImage and MakePNImage. This should # simplify the module, make it more readable and easier to see what selection # expressions are used for a given instrument and band. # + Removed pn specific conditions # + Cosmetic changes to make code more readable # + Reordered per band processing to remove unnecessary band 8 tests # + Sort on bands to ensure they are always processed in the same order. # + Added extra info() lines to log reason for exit # + Moved flare screening test into a subroutine # + Moved empty image test into a subroutine # # MakeImage ChangeLog # # Version 1.63 - 2003-09-05 (DJF) # ------------ # # + Add test for image (max-min) > 1 to overcome bug in implot where image # has too small a range of values. # # Version 1.62 - 2003-06-30 (DJF) # ------------ # # + Give fimgstat all of its parameters # # Version 1.61 - 2003-06-30 (DJF) # ------------ # # + Add mode parameter to fimgstat. # # Version 1.60 - 2003-06-27 (DJF) # ------------ # # + Use ftool fimgstat to determine if images are # empty or not before calling implot. # # Version 1.59 - 2003-06-25 (DJF) # ------------ # # + Added PATTERN<=12 selection for MOS images across all bands # # Version 1.58 - 2002-12-13 (DJF) # ------------ # # + Only take copy of un-filtered flare GTI if it exists # # Version 1.57 - 2002-12-13 (DJF) # ------------ # # + implot parameter changes. Merged plotfile/Device # # Version 1.56 - 2002-12-11 (DJF) # ------------ # # + Change implot parameter withsrclistset to withsrclisttab (SAS 5.4) # # Version 1.55 - 2002-11-04 (DJF) # ------------ # # + Remove PNG plot of flare background timeseries # # Version 1.54 - 2002-11-01 (DJF) # ------------ # # + returned OUT_OF_FOV filter to band 8 fov images # # Version 1.53 - 2002-10-18 (DJF) # ------------ # # Changed copy of pre-flare screened event list to use newFile not findFile # # Version 1.52 - 2002-10-18 (DJF) # ------------ # # fix parameters for flare background plot GIFtoPNG call # # Version 1.51 - 2002-10-18 (DJF) # ------------ # # change fplot yparm from COUNT to COUNTS. # # Version 1.50 - 2002-10-18 (DJF) # ------------ # # Test for flare background content was looking for cwrong extension name. # changed to 'RATE' # # Version 1.49 - 2002-09-16 (DJF) # ------------ # # + Added plot of flare background timeseries product. # + Test whether short GTI removal leaves an empty GTI table. # do not apply flare screening if this occurs. # + readjusted flags. # # Version 1.48 - 2002-09-16 (DJF) # ------------ # # + Replaced missing pn event selection flags # # Version 1.47 - 2002-09-16 (DJF) # ------------ # # + Fixed pn band 8 image name. Added axtra comments for debugging. # # Version 1.46 - 2002-07-23 (DJF) # ------------ # # + Fixed unmatched parentheses in selection expression # # Version 1.45 - 2002-07-19 (DJF) # ------------ # # + More debugging # # Version 1.44 - 2002-07-19 (DJF) # ------------ # # + More debugging # # Version 1.43 - 2002-07-19 (DJF) # ------------ # # + More debugging # # Version 1.42 - 2002-07-11 (DJF) # ------------ # # + Added debugging statements # # Version 1.41 - 2002-07-05 (DJF) # ------------ # # + Removed debugging statement # # Version 1.40 - 2002-07-05 (DJF) # ------------ # # + Changed pn selection flags to use #XMMEA_EP + OUT_OF_FOV # + Rearanged code to make it easier to read # # Version 1.39 - 2002-07-01 (DJF) # ------------ # # + Added #XMMEA_EM filtering to EMOS Band 1-5 images # # Version 1.38 - 2002-06-10 (DJF) # ------------ # # + Shorten name of intermediate image event lists to # accomodate a bug in esplinemap. # # Version 1.37 - 2002-04-26 (DH) # ------------ # # + CLOSE_TO_ONBOARD_BAD flag changed to what it should be, ie. # CLOSE_TO_ONBOARD_BADPIX. # # Version 1.36 - 2002-04-09 (DH) # ------------ # # + Move the test on empty images, so that eexpmap does not # get run when images are empty. # # Version 1.35 - 2002-03-28 (DH) # ------------ # # + The BKGDSCRN keyword was not getting written to all images # in all cases. # # Version 1.34 - 2002-03-15 (DH) # ------------ # # + Apply attitude GTI to event lists when making images. # # Version 1.38 - 2002-06-10 (DJF) # ------------ # # + Shorten name of intermediate image event lists to # accomodate a bug in esplinemap. # # Version 1.37 - 2002-04-26 (DH) # ------------ # # + CLOSE_TO_ONBOARD_BAD flag changed to what it should be, ie. # CLOSE_TO_ONBOARD_BADPIX. # # Version 1.36 - 2002-04-09 (DH) # ------------ # # + Move the test on empty images, so that eexpmap does not # get run when images are empty. # # Version 1.35 - 2002-03-28 (DH) # ------------ # # + The BKGDSCRN keyword was not getting written to all images # in all cases. # # Version 1.34 - 2002-03-15 (DH) # ------------ # # + Apply attitude GTI to event lists when making images. # Version 1.38 - 2002-06-10 (DJF) # ------------ # # + Shorten name of intermediate image event lists to # accomodate a bug in esplinemap. # # Version 1.37 - 2002-04-26 (DH) # ------------ # # + CLOSE_TO_ONBOARD_BAD flag changed to what it should be, ie. # CLOSE_TO_ONBOARD_BADPIX. # # Version 1.36 - 2002-04-09 (DH) # ------------ # # + Move the test on empty images, so that eexpmap does not # get run when images are empty. # # Version 1.35 - 2002-03-28 (DH) # ------------ # # + The BKGDSCRN keyword was not getting written to all images # in all cases. # # Version 1.34 - 2002-03-15 (DH) # ------------ # # + Apply attitude GTI to event lists when making images. # # Version 1.33 - 2002-03-15 (DH) # ------------ # # + Add CLOSE_TO_CCD_WINDOW and CLOSE_TO_ONBOARD_BAD to list of # exluded pn flags. # # Version 1.32 - 2002-03-12 (DH) # ------------ # # + BKGDSCRN keyword now always written (either T or F). Comment # fixed. # # Version 1.31 - 2002-03-06 (DH) # ------------ # # + For now, set the OUT_OF_FOV flag for pn using the explicit value # of 0x10000, due to a bug in epevents. # # Version 1.30 - 2002-03-01 (DH) # ------------ # # + Fix bug which application of flags to pn fov image. # # Version 1.29 - 2002-02-25 (DH) # ------------ # # + Don't apply the FLAG filter if the flag mask is zero when making # the image for mosaicing. # + Fix bug in evselect call for filtering out flare GTIs of less than # 100 seconds. # # Version 1.28 - 2002-02-08 (DH) # ------------ # # + New method for specifying bitmask filters for event lists, in order # to make it more clear which flags are being used. # + Remove GTIs from the flare screening GTI list which have a duration of # less than 100 seconds. # + Add keyword BKGDSCRN to images where flare GTI was applied. # # Version 1.27 - 2001-11-07 (DH) # ------------ # # + Change the way that the selection criteria in 1.26 are implemented. Now # test on the band number, and apply the selection only to the appropriate # bands. Makes for a cleaner data subspace. # # Version 1.26 - 2001-11-06 (DH) # ------------ # # + Add selection criteria for PN images, which deselects ON_OFFSET_COLUMN for # PI less than 500:(PI>=500 || (PI<500 && FLAG & 0x8 == 0)) # # Version 1.25 - 2001-11-05 (DH) # ------------ # # + Check for the creation of empty images, and if there are any, return ignore. # # Version 1.24 - 2001-10-31 (DH) # ------------ # # + Gti time threshold cut now gotten from pcms configuration # parameter GtiTimeThreshold. # # Version 1.23 - 2001-10-25 (DJF) # ------------ # # + Fix test on flag expression to allow hex characters ie \d => [\da-fA-F] # # Version 1.22 - 2001-10-22 (DJF) # ------------ # # + Set badclean=0 for eexpmap on MOS. Suggested by JB. # # # Version 1.21 - 2001-10-02 (DH) # ------------ # # + Combine FLAG filters and combine PI filters so as to produce # a more compact data subspace in the image products. # + Get total flare GTI time by reading the new ONTIME keyword. # # Version 1.20 - 2001-10-01 (DH) # ------------ # # + New pattern and flag cuts for pn images, PATTERN<=12 and # FLAG < 131072. # + Change energy band cut expression from PI<$pihi to PI<=$pihi. # # Version 1.19 - 2001-08-21 (DJF) # ------------ # # + Set flarescreening GTI threshold to 1000s # # Version 1.18 - 2001-08-16 (DJF) # ------------ # # + Re-enable minimum good time cut off for testing purposes. # # Version 1.17 - 2001-07-05 (DJF) # ------------ # # + Clean up after flare screen GTI minimum good time cut off testing # # # Version 1.16 - 2001-07-05 (DJF) # ------------ # # + Testing Added flare screen GTI minimum good time cut off # # Version 1.15 - 2001-07-05 (DJF) # ------------ # # + Added flare screen GTI minimum good time cut off # # Version 1.14 - 2001-07-03 (DJF) # ------------ # # + Corrected new version date above # # Version 1.13 - 2001-07-02 (DJF) # ------------ # # + Added Generate log message when flare screening GTI not used. # # Version 1.12 - 2001-07-02 (DJF) # ------------ # # + Added test for empty flareGTI extension. # # Version 1.11 - 2001-06-07 (DH) # ------------ # # + Set ignore flag if imaging event list is empty. # # Version 1.10 - 2001-05-22 (DH) # ------------ # # + Combine all filter flags into one filter expression, so that # the DataSubspace in evselect does not run into a problem with # too many filters of too may components. # # Version 1.09 - 2001-05-21 (DH) # ------------ # # + Exclude CLOSE_TO_CCD_WINDOW events from pn images. # # Version 1.08 - 2001-05-03 (DH) # ------------ # # + Energy band ranges now stored as pipeline parameters, # gotten via call to new energyBands() function. # + Exclude out of FOV events from pn images used in emosaic. # # Version 1.07 - 2001-04-17 (DH) # ------------ # # + Fix problem introduced in 1.06, which was causing evselect # to not write data subspace information. # # Version 1.06 - 2001-04-17 (DH) # ------------ # # + Exclude ON_OFFSET_COLUMN events from pn images. # # Version 1.05 - 2001-03-30 (DH) # ------------ # # + Change value of eexpmap parameter 'attrebin' from 60 to 2. # # Version 1.04 - 2001-03-16 (DH) # ------------ # # + Print out version number in performAction() for # tracking purposes. # # Version 1.03 - 2001-01-31 (DH) # ------------ # # + Make special band 8 images for use in emosaic (ImageMerge module). # # Version 1.01 - 2000-11-30 (DH) # ------------ # # + First production version. # my %Flags = ( 'emos1' => { 'default' => '(FLAG & 0x766ba000)==0' , '8' => '(FLAG & 0x766aa000)==0' , '8fov' => '(FLAG & 0x766ba000)==0' } , 'emos2' => { 'default' => '(FLAG & 0x766ba000)==0' , '8' => '(FLAG & 0x766aa000)==0' , '8fov' => '(FLAG & 0x766ba000)==0' } ); # Declare list of instruments this module is interested in @instList = qw(emos1 emos2); # Number of streams sub numberOfStreams { return numberOfExposures(); } # Rules method sub evaluateRules { # Ignore conditions return ignore() if ignored( module => 'MOSEvents' ); # Start conditions start() if complete( module => 'MOSEvents' ); } # Action method sub performAction { info("Module version number: $version"); my ( @ebandlo, @ebandhi ); my @expr = ("(PATTERN<=12)"); # Find exposure ID my $exp_id = exposureID( instrument => thisInstrument , stream => thisStream ); my $content = "EPIC MOS imaging mode event list"; # Find imaging event file for this exposure my $evFile = findFile( class => 'product' , instrument => thisInstrument , exp_id => $exp_id , content => $content ); if ( !$evFile ) { info("No imaging mode event list available for this instrument." ); return success(); } # Test the event list contains something usable. if ( numberFITSRows( file => $evFile, extension => 'EVENTS' ) == 0 ) { info( "Event list is empty, ignore the rest of the processing for this exposure." ); return ignore(); } # Find spacecraft attitude file my $attFile = findFile( class => 'product' , instrument => 'all' , content => 'Attitude time series' , required => 'true' ); # Find attitude GTI my $attGTIFile = findFile( class => 'intermediate' , instrument => 'all' , content => 'Attitude GTI' ); # Attach attitude GTI, if it exists push( @expr, "GTI($attGTIFile, TIME)" ) if $attGTIFile; # Find flare GTI my $flareGTI; my $flareScreen = 0; # Examine GTIs to decide if flare screening should be applied. # add to the selection expression if so. &examineGTI( $exp_id, \$flareGTI, \$flareScreen, \@expr ); # Loop through each energy band, creating the image, test if the image is empty my $empty_image = 0; my $imFile; foreach my $band ( 1, 2, 3, 4, 5, 8 ) { info("Band: $band"); my ( $pilo, $pihi, @locexpr, @options, $filteredList ); # Figure out PI limits for this energy band $pilo = energyBand( $band, 0 ); $pihi = energyBand( $band, 1 ); push( @ebandlo, $pilo ); push( @ebandhi, $pihi ); push( @locexpr, "(PI in ($pilo:$pihi])" ); my $whichband = exists( $Flags{ thisInstrument() }{"$band"} ) ? $band : 'default'; if ( $Flags{ thisInstrument() }{"$whichband"} ) { push( @locexpr, $Flags{ thisInstrument() }{"$whichband"} ); } map { info("expr = $_"); } @expr; map { info("locexpr = $_"); } @locexpr; # Create raw photon image my $imgFile = newFile( class => 'product' , instrument => thisInstrument , exp_id => $exp_id , band => $band , content => 'EPIC image' ); if ( $band == 8 ) { # Keep a record of the filename for use with eexpmap later $imFile = $imgFile; $filteredList = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , band => $band , content => 'image event list' ); doCommand( 'evselect', table => "${evFile}:EVENTS" , imageset => $imgFile , xcolumn => 'X' , ycolumn => 'Y' , withimageset => 'Y' , imagebinning => 'binSize' , ximagebinsize => 80 , yimagebinsize => 80 # , squarepixels => 'true' , expression => join( ' && ', ( @expr, @locexpr ) ) , imagedatatype => 'Int32' , withimagedatatype => 'true' , writedss => 'true' , updateexposure => 'true' , keepfilteroutput => 'true' , withfilteredset => 'true' , filteredset => $filteredList ) or return exception(); # Record the band 8 EXPOSURE value in the database my @opt = ( file => $imgFile , extension => 'PRIMARY' , keyword => 'EXPOSURE' ) ; if ( hasFITSKeyword( @opt ) ) { my $exposure = readFITSKeyword( @opt ); setExposureProperty( instrument => thisInstrument , exp_id => $exp_id , name => 'exposure' , value => $exposure ); } my $imgStat = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , format => "ASCII" , band => $band , content => "Filtered image statistics" ); if ( ! &ModuleUtil::isImageEmpty( $imgFile , $imgStat ) ) { &band8fov( $exp_id, $band, $imgFile, $evFile , join( ' && ' , ( @expr, @locexpr , $Flags{ thisInstrument() }{'8fov'} ) ) , $flareScreen ); } else { $empty_image = 1; info("Image $imgFile is empty."); } } else { $filteredList = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , band => $band , content => 'image event list' ); doCommand( 'evselect', table => "${evFile}:EVENTS" , imageset => $imgFile , xcolumn => 'X' , ycolumn => 'Y' , withimageset => 'Y' , imagebinning => 'binSize' , ximagebinsize => 80 , yimagebinsize => 80 # , squarepixels => 'true' , expression => join( ' && ', ( @expr, @locexpr ) ) , imagedatatype => 'Int32' , withimagedatatype => 'true' , writedss => 'true' , updateexposure => 'true' , keepfilteroutput => 'Y' # , keepfilteroutput => 'no' , withfilteredset => 'Y' , filteredset => $filteredList ) or return exception(); # Test filtered list for emptyness # if ( # ( defined $filteredList ) # && numberFITSRows( # file => $filteredList # , extension => 'EVENTS' # ) == 0 # ) # { # $empty_image = 1; # info("Filtered set $filteredList is empty."); # } my $imgStat = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , format => "ASCII" , band => $band , content => "Filtered image statistics" ); if ( &ModuleUtil::isImageEmpty( $imgFile , $imgStat ) ) { $empty_image = 1; info("Image $imgFile is empty."); } } # end if $band == 8 doCommand( 'addattribute', set => "${imgFile}:PRIMARY" , attributename => 'BKGDSCRN' , attributetype => 'boolean' , booleanvalue => $flareScreen ? 'T' : 'F' , attributecomment => "\"\\\"Was background screening of the eventlist applied?\\\"\"" ) or return exception(); } #foreach band # Stop processing this exposure (ie. don't do source detection) if # there were any empty images if ($empty_image) { info('Ignoring further processing due to empty images.'); return ignore(); } # create exposure map files my (@expmap, @nonVigExpMap); foreach my $b ( 1, 2, 3, 4, 5, 8 ) { # Add to list of exposure maps my $expFile = newFile( class => 'product' , instrument => thisInstrument , exp_id => $exp_id , band => $b , content => 'EPIC exposure map' ); push( @expmap, $expFile ); #next if ($b eq '8'); # only need nonvigs for bands 1-5. # Add to list of exposure maps my $nonVigExpFile = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , band => $b , content => 'non-vig exposure map' ); push( @nonVigExpMap, $nonVigExpFile ); } # Run exposure map task to generate all exposure maps in parallel # We do this outside the above loop so the empty image tests # can have effect. if ( fileExists( file => $imFile ) ) { doCommand( 'eexpmap', imageset => $imFile , eventset => $evFile , attitudeset => $attFile , attrebin => 2 , expimageset => [@expmap] , pimin => [@ebandlo] , pimax => [@ebandhi] , withvignetting => 'yes' ) or return exception(); doCommand( 'eexpmap', imageset => $imFile , eventset => $evFile , attitudeset => $attFile , attrebin => 2 , expimageset => [@nonVigExpMap] , pimin => [@ebandlo] , pimax => [@ebandhi] , withvignetting => 'no' ) or return exception(); } my $expFile = findFile( class => 'product' , instrument => thisInstrument , exp_id => $exp_id , band => 8 , content => 'EPIC exposure map' ); return success() if (!$expFile); my $gifFile = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , band => 8 , content => 'exposure map' , format => 'GIF' ); my $pngFile = newFile( class => 'product' , instrument => thisInstrument , exp_id => $exp_id , band => 8 , content => 'EPIC exposure map' , format => 'PNG' ); doCommand( 'implot', set => $expFile , device => "$pngFile/PNG" , withsrclisttab => 'no' ) or return exception(); # GIFtoPNG( # source => $gifFile # , destination => $pngFile # ) # or return exception(); return success(); } sub examineGTI { my ( $exp_id, $flareGTI, $flareScreen, $expr ) = @_; my $standardFlareGTI = findFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , content => 'flare GTI' ); my $optFlareGTI = findFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , content => 'Optimised flare GTI' ); if ( fileExists( file => $optFlareGTI) ) { ${$flareGTI} = $optFlareGTI; } else { ${$flareGTI} = $standardFlareGTI; } ${$flareScreen} = 0; if ( fileExists( file => ${$flareGTI} ) ) { # Filter GTI, do we have ONTIME > total threshold ? if ( numberFITSRows( file => ${$flareGTI} , extension => 'STDGTI' ) > 0 ) { # GTI time intervals # Setting $GTI_time_threshold = 0 will turn off GTI cut off my $GTI_time = 0; my $GTI_time_threshold = gtiTimeThreshold(); info( "GTI total time interval threshold is $GTI_time_threshold." ); if ($GTI_time_threshold) { $GTI_time = readFITSKeyword( file => ${$flareGTI} , extension => "STDGTI" , keyword => "ONTIME" ); info( "Flare screening GTI total time interval is $GTI_time /s." ); } ${$flareScreen} = ( $GTI_time > $GTI_time_threshold ) || !$GTI_time_threshold; } else { info("Flare screening GTI too short or empty."); } } else { info("Flare screening GTI unavailable."); } if (${$flareScreen}) { push( @{$expr}, "GTI(" . ${$flareGTI} . ",TIME)" ); ppd( id => '000019'); setExposureProperty( instrument => thisInstrument , exp_id => $exp_id , name => 'flarescreened' , value => 0+TRUE ); } else { info("Flare screening will not be applied."); ppd( id => '000020'); setExposureProperty( instrument => thisInstrument , exp_id => $exp_id , name => 'flarescreened' , value => FALSE ); } } sub band8fov { my ( $exp_id, $band, $imgFile, $evFile, $expression, $flareScreen ) = @_; my $gifFile = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , band => $band , content => 'image' , format => 'GIF' ); my $pngFile = newFile( class => 'product' , instrument => thisInstrument , exp_id => $exp_id , band => $band , content => 'EPIC image' , format => 'PNG' ); doCommand( 'implot', set => $imgFile , device => "$pngFile/PNG" , withsrclisttab => 'no' ) or return exception(); # # Convert to PNG format # GIFtoPNG( # source => $gifFile # , destination => $pngFile # ) # or return exception(); # Generate truecolor image FITS my $trueColor = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , format => 'FIT' , content => 'Truecolor count rate image' ); doCommand( 'etruecolor' , tablelist => "${evFile}:EVENTS" , fileset => $trueColor ) or return exception(); # Generate truecolor image PPM bitmap my $trueColorPPM = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , format => 'PPM' , content => 'Truecolor RGB bitmap' ); my $trueColorRGB = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , format => 'FIT' , content => 'Truecolor RGB image' ); doCommand( 'etruecolor' , tablelist => "${evFile}:EVENTS" , ppmfile => $trueColorPPM , colorset => $trueColorRGB , outputchoice => 'ppmfile' ) or return exception(); return; # The following does not seem to be used any more, so the routine now returns beforehand. # IMS 2005-11-02 my $fovFile = newFile( class => 'intermediate' , instrument => thisInstrument , exp_id => $exp_id , band => $band , content => 'fov image' ); doCommand( 'evselect' ,, table => "${evFile}:EVENTS" , imageset => $fovFile , xcolumn => 'X' , ycolumn => 'Y' , withimageset => 'Y' , imagebinning => 'binSize' , ximagebinsize => 80 , yimagebinsize => 80 , squarepixels => 'true' , expression => $expression , imagedatatype => 'Int32' , withimagedatatype => 'true' , writedss => 'true' , updateexposure => 'true' , keepfilteroutput => 'false' ) or return exception(); } 1;