package EPICSources; use strict; use English; use Carp; use vars qw(@ISA $VERSION $name $author $date $version @instList $numberOfStreams); @ISA = qw(Module); use ModuleResources; use ModuleUtil; $name = __PACKAGE__; $VERSION = '0.15'; $version = $VERSION; $author = 'Anja Schroeder,Ian Stewart,Duncan John Fyfe, Duncan Law-Green'; $date = '2012-11-07'; # # ChangeLog # ========= # # # version 0.15 - 2014-02-28 (EOP) # ------------ # # + Following the recommendation in the SAS Users Guide and SAS threads, MOS # spectral products should be created after applying #XMMEA_EM flag # filtering. # NOTE: These flag masks are applied the same in EPICSourceProducts.pm # # version 0.14 - 2012-03-15 DLG # ------------ # # + esources mintotalcts 100. # # version 0.14 - 2012-03-15 DLG # ------------ # # + esources mintotalcts 300. Again. # # version 0.13 - 2012-03-13 DLG # ------------ # # + try reverting esources mintotalcts to 500 to avoid xspec spectral extraction failures # # version 0.12 - 2012-01-19 DLG # ------------ # # + Added Attitude GTI filtering to $specExpression and $timeExpression to # propagate to SSP spectra and time series # # version 0.11 - 2012-01-19 DLG # ------------ # # + Altered mintotalcts in esources from 500 to 300 to test optimised # faint source extraction # # version 0.10 - 2009-09-14 DLG # ------------ # # + Added test for MOS W6 and PN SW modes. Exclude these from SSP generation. # # version 0.09 - 2006-08-11 DJF # ------------ # # + Added a test for PN CCD in low gain mode. Exclude PN exposures where some CCDs are in low gain mode. # # version 0.08 - 2006-03-03 ACS # ------------ # + A couple of corrections to the perl code introduced by the changes the day before. # # version 0.07 - 2006-03-02 ACS # ------------ # + Added determination of minimum TSTART and maximum TSTOP of all valid exposures # and inserted them into each filtered event list for light curves # + Commented out selection by data mode ..Prime.. since FU imaging event lists # did not get filtered event lists. # # version 0.06 - 2005-12-02 IMS # ------------ # + Now really added --setflags=yes (d'oh!!) # # version 0.05 - 2005-12-01 IMS # ------------ # + Added --setflags=yes to esources call. This sets the SPECTRA and TSERIES flag columns of the srcmatch list to T for those sources selected for SSPs. # # version 0.04 - 2005-11-29 IMS # ------------ # + Changed the flag mask selections to those agreed upon. # # version 0.03 - 2005-10-14 IMS # ------------ # + Shortened the content string for the SSP source list # # version 0.02 - 2005-09-08 RGW # ------------ # # + exit gracefully if required source list doesn't exist # # version 0.01 - 2005-06-09 IMS # ------------ # # + First draft - ported from ACS script. # # Declare instruments of interest @instList = qw(all); # Number of Streams sub numberOfStreams { return 1; } # Rules evaluated to determine when this modules can run. sub evaluateRules { # If upstream module has been ignored, so if this one return ignore() if ignored( module => 'SrcMerge' , instrument => 'all' , stream => 1 ); # return start() if complete( module => 'SrcMerge' , instrument => 'all' , stream => 1 ) } # The guts of the module sub performAction { info("Module version number: $version"); # First fetch list of all suitable EPIC event lists (imaging, not cal. closed) # my (@eventListSets, $content, $timeExpression, $specExpression); my (@filteventListSets, $tlmin, $tlmax, @tmin, @tmax, @tmpmin, @tmpmax); # get attitude GTI file my $attGTIFile = findFile( class => 'intermediate' , instrument => 'all' , content => 'Attitude GTI' ); # add attitde GTI filtering if file exists my $attGTIExpr = ""; $attGTIExpr = "&>I($attGTIFile,TIME)" if $attGTIFile; foreach my $inst ( "emos1", "emos2", "epn" ) { if ($inst eq 'epn') { $content= "EPIC PN imaging mode event list"; $timeExpression # ="((PATTERN<=4)&&((FLAG & 0x2fb002c)==0)" ="((PATTERN<=4)&&((FLAG & 0xfffffef)==0)" ."&&(PI>=200)&&(PI<=12000))" .$attGTIExpr; $specExpression ="((PATTERN<=4)&&(FLAG==0)&&(PI>=200)&&(PI<=12000))" .$attGTIExpr; } else # mos { $content= "EPIC MOS imaging mode event list"; $timeExpression # ="((PATTERN<=12)&&((FLAG & 0x766b0000)==0)" ="((PATTERN<=12)&&((FLAG & 0x766ba000)==0)" ."&&(PI>=200)&&(PI<=12000))" .$attGTIExpr; # $specExpression = $timeExpression; $specExpression # ="((PATTERN<=12)&&((FLAG & 0xfffffeff)==0)" ="((PATTERN<=12)&&((FLAG & 0x766ba000)==0)" ."&&(PI>=200)&&(PI<=12000))" .$attGTIExpr; } foreach my $exp_id ( listExposures( instrument => $inst ) ) { # Find imaging event file for this exposure my $evFile=findFile( class => 'product' , instrument => $inst , exp_id => $exp_id , content => $content ); next if (! $evFile ); if ($inst eq 'epn') ## Select EPIC PN { my $lowgain = {}; ## Exclude PN CCD low gain mode from SSP generation if (my @lowgain = ModuleUtil::pnLowGainWarn($evFile , $lowgain) ) { info( 'Some CCD in low gain mode :' , join (' ,' , @lowgain) ); info( 'Excluding this exposure from source detection.' ); next; } ## Exclude PN SW mode from SSP generation my $submode = readFITSKeyword( file => $evFile , extension => 'EVENTS' , keyword => 'SUBMODE' ); # EC (14 Nov 2013): don't skip, at request of PR #if ($submode =~ /PrimeSmallWindow/) { # info ( 'PN PrimeSmallWindow mode detected: excluding from SSP. '); # next; #} } else { ## Select EPIC MOS ## Exclude MOS W6 mode from SSP generation my $submode = readFITSKeyword( file => $evFile , extension => 'EVENTS' , keyword => 'SUBMODE' ); if ($submode =~ /PrimePartialW6/) { info ( 'MOS PrimePartialW6 mode detected: excluding from SSP. '); next; } } # Check instrument filter my $filter = getExposureProperty( instrument => $inst , exp_id => $exp_id , name => 'filter' ); next if $filter =~ /Cal/; # Derive Tstart and Tstop times for time series $tlmin = readFITSKeyword( file => $evFile , extension => 'EVENTS' , keyword => 'TSTART' ); $tlmax = readFITSKeyword( file => $evFile , extension => 'EVENTS' , keyword => 'TSTOP' ); # Add to lists push @eventListSets, $evFile; push @tmin, $tlmin; push @tmax, $tlmax; my $forTimeFilteredEvList = newFile( class => 'intermediate' , instrument => $inst , exp_id => $exp_id , content => 'Event list for light curves' ); doCommand( 'evselect' , table => "${evFile}:EVENTS" , keepfilteroutput => 'yes' , withfilteredset => 'yes' , filteredset => $forTimeFilteredEvList , writedss => 'yes' , updateexposure => 'yes' , expression => $timeExpression , destruct => 'yes' ) or return exception(); push @filteventListSets, $forTimeFilteredEvList; my $forSpecFilteredEvList = newFile( class => 'intermediate' , instrument => $inst , exp_id => $exp_id , content => 'Event list for spectra' ); doCommand( 'evselect' , table => "${evFile}:EVENTS" , keepfilteroutput => 'yes' , withfilteredset => 'yes' , filteredset => $forSpecFilteredEvList , writedss => 'yes' , updateexposure => 'yes' , expression => $specExpression , destruct => 'yes' ) or return exception(); } # end loop over $exp_id } # end loop over $inst # Return immediately if there are no suitable exposures. unless (@eventListSets) { info("No suitable exposures found"); return success(); } # Determine min and max of all tstart and tstop times @tmpmin = sort(@tmin); @tmpmax = sort(@tmax); my $tminall = $tmpmin[0]; my $tmaxall = $tmpmax[$#tmpmax]; # Add TLMIN1 and TLMAX1 keywords doCommand('addattribute' ,set => [ @filteventListSets ] ,attributename => [qw(EVENTS:TLMIN1 EVENTS:TLMAX1)] ,attributetype => ['real ' , 'real'] ,realvalue => [ $tminall , $tmaxall ] ,attributecomment => [ 'Time series start' , 'Time series stop' ] ); # Generate Source list: my $srcmatchSrcFile = findFile( class => 'product' , instrument => 'epic' , content => 'EPIC summary source list' , format => 'FITS' ); return success() unless $srcmatchSrcFile; my $sspSrcFile = newFile( class => 'intermediate' , instrument => 'epic' # , content => 'Source list for source-specific products' , content => 'SSP source list' ); doCommand( 'esources' , eventsets => [@eventListSets] , srctab => "${srcmatchSrcFile}:SRCLIST" , outsrcset => $sspSrcFile , mintotalcts => 100 , mindetml => 15 , minmaskfrac => 0.5 , numhexchar => 3 , setflags => 'yes' ) or return exception(); return success(); } 1;