From d340e81b8c94b59e1b3cf370bb8463f78165808b Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 07:03:25 -1000 Subject: [PATCH 1/8] Fixed rewrite sciImageList bug --- .../ndmapperDownloader.py | 14 ++- build/lib/nifty/pipeline/nifsPipeline.py | 3 +- .../pipeline/objectoriented/getConfig.py | 12 -- .../nifty/pipeline/steps/nifsFluxCalibrate.py | 27 +++-- build/lib/nifty/pipeline/steps/nifsSort.py | 6 +- .../lib/nifty/pipeline/steps/nifsTelluric.py | 81 ++++++++++++- build/lib/nifty/runtimeData/config.cfg | 74 ------------ ...hl => nifty4gemini-1.0b9-py2-none-any.whl} | Bin 149043 -> 149002 bytes nifty/pipeline/steps/nifsSort.py | 2 +- nifty4gemini.egg-info/PKG-INFO | 109 ------------------ nifty4gemini.egg-info/SOURCES.txt | 39 ------- nifty4gemini.egg-info/dependency_links.txt | 1 - nifty4gemini.egg-info/top_level.txt | 1 - setup.py | 2 +- 14 files changed, 114 insertions(+), 257 deletions(-) delete mode 100644 build/lib/nifty/runtimeData/config.cfg rename dist/{nifty4gemini-1.0b7-py2-none-any.whl => nifty4gemini-1.0b9-py2-none-any.whl} (70%) delete mode 100644 nifty4gemini.egg-info/PKG-INFO delete mode 100644 nifty4gemini.egg-info/SOURCES.txt delete mode 100644 nifty4gemini.egg-info/dependency_links.txt delete mode 100644 nifty4gemini.egg-info/top_level.txt diff --git a/build/lib/nifty/pipeline/downloadFromGeminiPublicArchive/ndmapperDownloader.py b/build/lib/nifty/pipeline/downloadFromGeminiPublicArchive/ndmapperDownloader.py index 9744293..7a8bcbd 100644 --- a/build/lib/nifty/pipeline/downloadFromGeminiPublicArchive/ndmapperDownloader.py +++ b/build/lib/nifty/pipeline/downloadFromGeminiPublicArchive/ndmapperDownloader.py @@ -38,7 +38,7 @@ import tarfile import hashlib -def download_query_gemini(query, dirname=''): +def download_query_gemini(query, dirname='', cookieName=''): """ Perform a user-specified Gemini science archive query and save the files returned to a specified directory. @@ -67,10 +67,18 @@ def download_query_gemini(query, dirname=''): checksum_fn = 'md5sums.txt' aux_fn = [checksum_fn, 'README.txt'] + # Perform Web query and download the tar file to a StringIO file object # in memory, passing through any HTTP errors. - with closing(urllib2.urlopen(query)) as fileobj: - fobj_buff = StringIO(fileobj.read()) + # Added by ncomeau: support for proprietary downloads + if cookieName: + opener = urllib2.build_opener() + opener.addheaders.append(('Cookie', 'gemini_archive_session={}'.format(cookieName))) + with closing(opener.open(query)) as fileobj: + fobj_buff = StringIO(fileobj.read()) + else: + with closing(urllib2.urlopen(query)) as fileobj: + fobj_buff = StringIO(fileobj.read()) # Open the in-memory tar file & extract its contents. with tarfile.open(fileobj=fobj_buff) as tar_obj: diff --git a/build/lib/nifty/pipeline/nifsPipeline.py b/build/lib/nifty/pipeline/nifsPipeline.py index 37cefd2..8fdd451 100644 --- a/build/lib/nifty/pipeline/nifsPipeline.py +++ b/build/lib/nifty/pipeline/nifsPipeline.py @@ -73,7 +73,7 @@ # + # -# Welcome to Nifty. +# Welcome to Nifty! # The current version: # TODO(nat): fix this to import the version from setup.py. @@ -214,7 +214,6 @@ def start(args): if manualMode: a = raw_input('About to enter nifsReduce to reduce science.') nifsReduce.start('Science') - if telluricCorrection: if manualMode: a = raw_input('About to enter nifsTelluric to make and create telluric corrected cubes.') diff --git a/build/lib/nifty/pipeline/objectoriented/getConfig.py b/build/lib/nifty/pipeline/objectoriented/getConfig.py index b5c6919..2964811 100644 --- a/build/lib/nifty/pipeline/objectoriented/getConfig.py +++ b/build/lib/nifty/pipeline/objectoriented/getConfig.py @@ -101,18 +101,6 @@ def makeConfig(self): self.config.write(self.outfile) logging.info("\nData reduction parameters for this reduction were copied from recipes/defaultConfig.cfg to ./config.cfg.") - if self.repeat: - logging.info("\nOverwriting ./config.cfg with saved config from most recent data reduction.") - if os.path.exists('./' + self.configFile): - os.remove('./' + self.configFile) - shutil.copy(self.RUNTIME_DATA_PATH + self.configFile, './' + self.configFile) - - # Print data reduction parameters for a user's peace-of-mind. - logging.info("\nSaving data reduction parameters.") - if os.path.exists(self.RUNTIME_DATA_PATH + self.configFile): - os.remove(self.RUNTIME_DATA_PATH + self.configFile) - shutil.copy('./' + self.configFile, self.RUNTIME_DATA_PATH + self.configFile) - # TODO(nat): fix this. It isn't recursively printing the dictionaries of values. logging.info("\nParameters for this data reduction as read from ./config.cfg:\n") with open(self.configFile) as self.config_file: diff --git a/build/lib/nifty/pipeline/steps/nifsFluxCalibrate.py b/build/lib/nifty/pipeline/steps/nifsFluxCalibrate.py index 3e77fac..fcfa3f0 100644 --- a/build/lib/nifty/pipeline/steps/nifsFluxCalibrate.py +++ b/build/lib/nifty/pipeline/steps/nifsFluxCalibrate.py @@ -18,14 +18,15 @@ def run(): """ # Store current working directory for later use. path = os.getcwd() - + import pdb; pdb.set_trace() + # Set up the logging file. + log = os.getcwd()+'/Nifty.log' # Set up iraf iraf.gemini() - iraf.unlearn("gemini") + #iraf.unlearn("gemini") + #iraf.unlearn(iraf.gemini,iraf.gemtools,iraf.gnirs,iraf.nifs,iraf.imcopy) - # Set up the logging file. - log = os.getcwd()+'/Nifty.log' logging.info('\n#################################################') logging.info('# #') @@ -305,13 +306,25 @@ def scaleBlackBody(rawFrame, log, over): if os.path.exists("5_scaledBBody"+rawFrame+".fits"): if over: os.remove("5_scaledBBody"+rawFrame+".fits") - iraf.imarith(operand1="3_BBody"+rawFrame, op="*", operand2=bbodyScaleFactor, result="5_scaledBBody"+rawFrame,title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + # A bug involving iraf.gemini() causes imarith to fail here. Use astropy unless you fixed it. + #iraf.imarith(operand1="3_BBody"+rawFrame, op="*", operand2=bbodyScaleFactor, result="5_scaledBBody"+rawFrame,title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + operand1 = astropy.io.fits.open("3_BBody"+rawFrame+".fits")[0].data + operand2 = bbodyScaleFactor + multiplied = operand1 * operand2 + hdu = astropy.io.fits.PrimaryHDU(multiplied) + hdu.writeto("5_scaledBBody"+rawFrame+".fits") + logging.info("\nCreated a scaled blackbody, 5_scaledBBody{}.fits".format(rawFrame)) else: logging.info("\nOutput exists and -over not set - skipping production of scaled black body") else: - iraf.imarith(operand1="3_BBody"+rawFrame, op="*", operand2=bbodyScaleFactor, result="5_scaledBBody"+rawFrame,title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') - logging.info("\nCreated a scaled blackbody, 5_scaledBBody{}.fits".format(rawFrame)) + # A bug involving iraf.gemini() causes imarith to fail here. Use astropy unless you fixed it. + #iraf.imarith(operand1="3_BBody"+rawFrame, op="*", operand2=bbodyScaleFactor, result="5_scaledBBody"+rawFrame,title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + operand1 = astropy.io.fits.open("3_BBody"+rawFrame+".fits")[0].data + operand2 = bbodyScaleFactor + multiplied = operand1 * operand2 + hdu = astropy.io.fits.PrimaryHDU(multiplied) + hdu.writeto("5_scaledBBody"+rawFrame+".fits") # We now have a scaled blackbody, scaledBlackBody.fits def multiplyByBlackBody(rawFrame, log, over): diff --git a/build/lib/nifty/pipeline/steps/nifsSort.py b/build/lib/nifty/pipeline/steps/nifsSort.py index 6758056..5ef1b65 100644 --- a/build/lib/nifty/pipeline/steps/nifsSort.py +++ b/build/lib/nifty/pipeline/steps/nifsSort.py @@ -127,6 +127,7 @@ def start(): sortConfig = options['sortConfig'] rawPath = sortConfig['rawPath'] program = sortConfig['program'] + proprietaryCookie = sortConfig['proprietaryCookie'] skyThreshold = sortConfig['skyThreshold'] sortTellurics = sortConfig['sortTellurics'] telluricTimeThreshold = sortConfig['telluricTimeThreshold'] @@ -145,7 +146,10 @@ def start(): os.mkdir('./rawData') logging.info('\nDownloading data from Gemini public archive to ./rawData. This will take a few minutes.') logging.info('\nURL used for the download: \n' + str(url)) - download_query_gemini(url, './rawData') + if proprietaryCookie: + download_query_gemini(url, './rawData', proprietaryCookie) + else: + download_query_gemini(url, './rawData') rawPath = os.getcwd()+'/rawData' diff --git a/build/lib/nifty/pipeline/steps/nifsTelluric.py b/build/lib/nifty/pipeline/steps/nifsTelluric.py index f0803cc..8637d42 100644 --- a/build/lib/nifty/pipeline/steps/nifsTelluric.py +++ b/build/lib/nifty/pipeline/steps/nifsTelluric.py @@ -51,6 +51,20 @@ def run(): standardStarRA = telluricCorrectionConfig['standardStarRA'] standardStarDec = telluricCorrectionConfig['standardStarDec'] + # TESTING IRAF + iraf.gemini() + #iraf.gemtools() + #iraf.gnirs() + #iraf.nifs() + + #iraf.unlearn(iraf.gemini,iraf.gemtools,iraf.gnirs,iraf.nifs) + + #iraf.set(stdimage='imt2048') + #iraf.nsheaders("nifs", logfile=log) + #user_clobber=iraf.envget("clobber") + #iraf.reset(clobber='yes') + + for scienceDirectory in scienceDirectoryList: try: os.chdir(scienceDirectory + '/products_telluric_corrected') @@ -478,18 +492,44 @@ def divideByContinuum(rawFrame, log, over): if os.path.exists("3_chtel"+rawFrame+'.fits'): if over: os.remove("3_chtel"+rawFrame+'.fits') - iraf.imarith("1_htel"+rawFrame+'.fits', "/", "2_fit"+rawFrame+'.fits', result="3_chtel"+rawFrame+'.fits',title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + #iraf.imarith("1_htel"+rawFrame+'.fits', "/", "2_fit"+rawFrame+'.fits', result="3_chtel"+rawFrame+'.fits',title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + operand1 = astropy.io.fits.open("1_htel"+rawFrame+'.fits')[0].data + operand2 = astropy.io.fits.open("2_fit"+rawFrame+'.fits')[0].data + header = astropy.io.fits.open("1_htel"+rawFrame+'.fits')[0].header + multiplied = np.array(operand1, copy=True) + for i in range(len(multiplied)): + if operand2[i] != 0: + multiplied[i] = operand1[i] / operand2[i] + else: + multiplied[i] = 0.0 + hdu = astropy.io.fits.PrimaryHDU(multiplied) + hdu.header = header + hdu.writeto("3_chtel"+rawFrame+".fits") + logging.info("\nDivided telluric correction by continuum") else: logging.info("\nOutput exists and -over not set - skipping division by continuum") else: - iraf.imarith('1_htel'+rawFrame+'.fits', "/", '2_fit'+rawFrame+'.fits', result='3_chtel'+rawFrame+'.fits',title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + #iraf.imarith('1_htel'+rawFrame+'.fits', "/", '2_fit'+rawFrame+'.fits', result='3_chtel'+rawFrame+'.fits',title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') + operand1 = astropy.io.fits.open("1_htel"+rawFrame+'.fits')[0].data + operand2 = astropy.io.fits.open("2_fit"+rawFrame+'.fits')[0].data + header = astropy.io.fits.open("1_htel"+rawFrame+'.fits')[0].header + multiplied = np.array(operand1, copy=True) + for i in range(len(multiplied)): + if operand2[i] != 0: + multiplied[i] = operand1[i] / operand2[i] + else: + multiplied[i] = 0.0 + hdu = astropy.io.fits.PrimaryHDU(multiplied) + hdu.header = header + hdu.writeto("3_chtel"+rawFrame+".fits") + logging.info("\nDivided telluric correction by continuum") def get1dSpecFromCube(rawFrame, log, over): """ Turn a cube into a 1D spec, used to find shift and scale values of telluric spectrum. Currently: Extracts 1D spectra from center of cube. """ - cube = astropy.io.fits.open('../products_uncorrected/ctfbrsn'+rawFrame+'.fits') + cube = astropy.io.fits.open('ctfbrsn'+rawFrame+'.fits') cubeheader = cube[1].header cubeslice = cube[1].data[:,30,30] # Create a PrimaryHDU object to encapsulate the data and header. @@ -684,12 +724,41 @@ def vega(rawFrame, grating, hLineInter, log, over): if os.path.exists("final_tel_no_hLines_no_norm.fits"): if over: - os.remove("final_tel_no_hLines_no_norm.fits") - iraf.imarith(operand1="1_htel" + rawFrame, op='/', operand2=norm, result='final_tel_no_hLines_no_norm', title='', divzero=0.0, hparams='', pixtype='', calctype='', verbose='yes', noact='no', mode='al') + # Subtle bugs in iraf mean imarith doesn't work. So we use an astropy/numpy solution. + # Open the image and the scalar we will be dividing it by. + operand1 = astropy.io.fits.open("1_htel" + rawFrame+'.fits')[0].data + operand2 = float(norm) + # Create a new data array + multiplied = np.array(operand1, copy=True) + # Don't forget to include the original header! If you don't later IRAF tasks get confused. + header = astropy.io.fits.open("1_htel" + rawFrame+'.fits')[0].header + for i in range(len(multiplied)): + if operand2 != 0: + multiplied[i] = operand1[i] / operand2 + else: + multiplied[i] = 1 + # Set the data and header of the in-memory image + hdu = astropy.io.fits.PrimaryHDU(multiplied) + hdu.header = header + # Finally, write the new image to a new .fits file. It only has one extension; zero, with a header and data. + hdu.writeto('final_tel_no_hLines_no_norm.fits') + #iraf.imarith(operand1="1_htel" + rawFrame, op='/', operand2=norm, result='final_tel_no_hLines_no_norm', title='', divzero=0.0, hparams='', pixtype='', calctype='', verbose='yes', noact='no', mode='al') else: logging.info("Output file exists and -over not set - skipping H line normalization correction") else: - iraf.imarith(operand1="1_htel" + rawFrame, op='/', operand2=norm, result='final_tel_no_hLines_no_norm', title='', divzero=0.0, hparams='', pixtype='', calctype='', verbose='yes', noact='no', mode='al') + #iraf.imarith(operand1="1_htel" + rawFrame, op='/', operand2=norm, result='final_tel_no_hLines_no_norm', title='', divzero=0.0, hparams='', pixtype='', calctype='', verbose='yes', noact='no', mode='al') + operand1 = astropy.io.fits.open("1_htel" + rawFrame+'.fits')[0].data + operand2 = float(norm) + multiplied = np.array(operand1, copy=True) + header = astropy.io.fits.open("1_htel" + rawFrame+'.fits')[0].header + for i in range(len(multiplied)): + if operand2 != 0: + multiplied[i] = operand1[i] / operand2 + else: + multiplied[i] = 1 + hdu = astropy.io.fits.PrimaryHDU(multiplied) + hdu.header = header + hdu.writeto('final_tel_no_hLines_no_norm.fits') if os.path.exists('final_tel_no_hLines_no_norm.fits'): os.remove("1_htel" + rawFrame + ".fits") diff --git a/build/lib/nifty/runtimeData/config.cfg b/build/lib/nifty/runtimeData/config.cfg deleted file mode 100644 index 4898799..0000000 --- a/build/lib/nifty/runtimeData/config.cfg +++ /dev/null @@ -1,74 +0,0 @@ -# Nifty configuration file. -# -# Each section lists parameters required by a pipeline step. - -manualMode = False -over = False -oneDExtraction = True -extractionXC = 15.0 -extractionYC = 33.0 -extractionRadius = 2.5 -scienceDirectoryList = ['/Users/nat/tests/core/linearPipelineTest/HD141004/20100401/K/obs107'] -telluricDirectoryList = ['/Users/nat/tests/core/linearPipelineTest/HD141004/20100401/K/Tellurics/obs109'] -calibrationDirectoryList = ['/Users/nat/tests/core/linearPipelineTest/HD141004/20100401/Calibrations_K'] - -[nifsPipelineConfig] -sort = True -calibrationReduction = True -telluricReduction = True -scienceReduction = True -telluricCorrection = False -fluxCalibration = False -merge = False - -telluricCorrectionMethod = 'gnirs' -fluxCalibrationMethod = 'gnirs' -mergeMethod = 'default' - -[sortConfig] -rawPath = '/Users/nat/data/TUTORIAL' -program = '' -skyThreshold = 2.0 -sortTellurics = True -telluricTimeThreshold = 5400 - -[calibrationReductionConfig] -baselineCalibrationStart = 1 -baselineCalibrationStop = 4 - -[telluricReductionConfig] -telStart = 1 -telStop = 5 -telluricSkySubtraction = True - -[scienceReductionConfig] -sciStart = 1 -sciStop = 5 -scienceSkySubtraction = True - -[telluricCorrectionConfig] -telluricCorrectionStart = 1 -telluricCorrectionStop = 9 -hLineMethod = 'vega' -hLineInter = False -continuumInter = False -telluricInter = False -tempInter = False -standardStarSpecTemperature = '' -standardStarMagnitude = '' -standardStarRA = '' -standardStarDec = '' -standardStarBand = '' - -[fluxCalbrationConfig] -fluxCalibrationStart = 1 -fluxCalibrationStop = 6 - -[mergeConfig] -mergeUncorrectedCubes = True -mergeTelluricCorrectedCubes = True -mergeTelCorAndFluxCalibratedCubes = True -use_pq_offsets = True -im3dtran = True - -# Good luck with your Science! diff --git a/dist/nifty4gemini-1.0b7-py2-none-any.whl b/dist/nifty4gemini-1.0b9-py2-none-any.whl similarity index 70% rename from dist/nifty4gemini-1.0b7-py2-none-any.whl rename to dist/nifty4gemini-1.0b9-py2-none-any.whl index 6acb1ac68d09a919e526238074edc925368bbcb0..16496a921fc3b7a0c10251d7cb9cf2df377d22e8 100644 GIT binary patch delta 37223 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 delta 37307 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

Q>t;o9Lv1jY$JoU* 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. - - This is a new data reduction Python pipeline that uses Astroconda and the Gemini - IRAF Package to reduce NIFS data. It offers a complete data reduction process from - sorting the data to producing a final flux calibrated and wavelength calibrated - combined cube with the full S/N for a science target. - - This pipeline is open source but is not supported by Gemini Observatory. - - Any feedback and comments (mbusserolle@gemini.edu) are welcome! - - Copyright - --------- - - For more details, please read the LICENSE. - - - How to Submit Bugs and Requests - ------------------------------- - - Very important: **do not submit a Gemini help desk ticket!** - - If you want to report a problem, use the `Gemini Data Reduction Forum thread `_ - or create an issue in this repo. - - Installation - ============ - - Pre-Requisites - -------------- - Make sure you have the latest version of Gemini Astroconda installed, have activated an Astroconda environment and have set up PYRAF. - You can find instructions for installing Astroconda `here `_. PYRAF can be set up by running the mkiraf command - in your "~/iraf" directory. - - Installing - ---------- - From PyPi.org: - - .. code-block:: text - - pip install Nifty4NIFS - - Installing in Editable Mode - --------------------------- - If you want to edit the Nifty source code, it's recommended to install Nifty in editable Mode. First obtain the Nifty source code. You - can do this by downloading and unpacking the latest release or cloning this github repository. - - Once you have the source code, change to the top level of the source code directory (you should see the setup.py file). Run: - - .. code-block:: text - - pip install -e . - - to install Nifty in editable mode. Now you can edit your copy of the Nifty source code and run it without having to reinstall every time. - - Quick Start - =========== - - To run Nifty, getting data reduction parameters from an interactive input session: - - .. code-block:: text - - runNifty nifsPipeline -i - - To run Nifty in full-automatic mode with default input parameters, provide the -f flag - and a full local path to the raw data or a Gemini Program ID string (Eg: GN-2013A-Q-62). - - .. code-block:: text - - runNifty nifsPipeline -f - -Keywords: Gemini NIFS nifs pipeline reduction data IRAF iraf PYRAF pyraf astronomy integral field spectroscopy ifs ifu -Platform: UNKNOWN -Classifier: Development Status :: 4 - Beta -Classifier: Environment :: MacOS X -Classifier: Intended Audience :: Science/Research -Classifier: Intended Audience :: Education -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: MacOS -Classifier: Programming Language :: Python :: 2.7 -Classifier: Topic :: Scientific/Engineering :: Astronomy -Classifier: Topic :: Scientific/Engineering :: Physics -Requires-Python: ~=2.7 diff --git a/nifty4gemini.egg-info/SOURCES.txt b/nifty4gemini.egg-info/SOURCES.txt deleted file mode 100644 index e8c9566..0000000 --- a/nifty4gemini.egg-info/SOURCES.txt +++ /dev/null @@ -1,39 +0,0 @@ -README.rst -nifty/__init__.py -nifty/pipeline/__init__.py -nifty/pipeline/nifsLowMemoryPipeline.py -nifty/pipeline/nifsPipeline.py -nifty/pipeline/nifsUtils.py -nifty/pipeline/configobj/__init__.py -nifty/pipeline/configobj/configobj.py -nifty/pipeline/downloadFromGeminiPublicArchive/__init__.py -nifty/pipeline/downloadFromGeminiPublicArchive/ndmapperDownloader.py -nifty/pipeline/objectoriented/OOnifsBaseline.py -nifty/pipeline/objectoriented/__init__.py -nifty/pipeline/objectoriented/getConfig.py -nifty/pipeline/objectoriented/routine.py -nifty/pipeline/objectoriented/step.py -nifty/pipeline/objectoriented/subroutine.py -nifty/pipeline/steps/__init__.py -nifty/pipeline/steps/nifsBaselineCalibration.py -nifty/pipeline/steps/nifsFluxCalibrate.py -nifty/pipeline/steps/nifsMerge.py -nifty/pipeline/steps/nifsReduce.py -nifty/pipeline/steps/nifsSort.py -nifty/pipeline/steps/nifsTelluric.py -nifty/pipeline/steps/routines/__init__.py -nifty/pipeline/steps/routines/nifsMakeTelluric.py -nifty/recipes/__init__.py -nifty/recipes/defaultConfig.cfg -nifty/runtimeData/__init__.py -nifty/runtimeData/config.cfg -nifty/runtimeData/h_ar.dat -nifty/runtimeData/j_ar.dat -nifty/runtimeData/k_ar.dat -nifty/runtimeData/new_starstemp.txt -nifty/runtimeData/vega_ext.fits -nifty4gemini.egg-info/PKG-INFO -nifty4gemini.egg-info/SOURCES.txt -nifty4gemini.egg-info/dependency_links.txt -nifty4gemini.egg-info/top_level.txt -scripts/runNifty \ No newline at end of file diff --git a/nifty4gemini.egg-info/dependency_links.txt b/nifty4gemini.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/nifty4gemini.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/nifty4gemini.egg-info/top_level.txt b/nifty4gemini.egg-info/top_level.txt deleted file mode 100644 index 6c25b24..0000000 --- a/nifty4gemini.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -nifty diff --git a/setup.py b/setup.py index 1a2bd22..fca1de2 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ setup( name=NAME, - version="1.0b9", + version="1.0b10", author='mbusserolle', author_email='mbussero@gemini.edu', description='The Gemini NIFS data reduction pipeline.', From c1d36704baf77b30d0b11e0f34807d49e305803e Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 12:13:48 -1000 Subject: [PATCH 2/8] Badge updates; can now differentiate instruments --- README.rst | 3 +- build/lib/nifty/pipeline/steps/nifsSort.py | 2 +- ...l => nifty4gemini-1.0b10-py2-none-any.whl} | Bin 149002 -> 149017 bytes docs/nifty/introduction.rst | 52 ++++++++- nifty/pipeline/steps/nifsFluxCalibrate.py | 1 - nifty/pipeline/steps/nifsMerge.py | 47 +++++--- nifty/pipeline/steps/nifsReduce.py | 23 ++-- nifty/pipeline/steps/nifsSort.py | 16 ++- nifty/pipeline/steps/nifsTelluric.py | 11 +- nifty4gemini.egg-info/PKG-INFO | 109 ++++++++++++++++++ nifty4gemini.egg-info/SOURCES.txt | 38 ++++++ nifty4gemini.egg-info/dependency_links.txt | 1 + nifty4gemini.egg-info/top_level.txt | 1 + 13 files changed, 270 insertions(+), 34 deletions(-) rename dist/{nifty4gemini-1.0b9-py2-none-any.whl => nifty4gemini-1.0b10-py2-none-any.whl} (95%) create mode 100644 nifty4gemini.egg-info/PKG-INFO create mode 100644 nifty4gemini.egg-info/SOURCES.txt create mode 100644 nifty4gemini.egg-info/dependency_links.txt create mode 100644 nifty4gemini.egg-info/top_level.txt diff --git a/README.rst b/README.rst index e4d021b..a69fdea 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,7 @@ Nifty ===== - +.. image:: https://badge.fury.io/py/nifty4gemini.svg + :target: https://badge.fury.io/py/nifty4gemini .. image:: https://zenodo.org/badge/93109208.svg :alt: DOI of the latest release. See releases. :target: https://zenodo.org/record/852696#.WaWmr5PyhMA diff --git a/build/lib/nifty/pipeline/steps/nifsSort.py b/build/lib/nifty/pipeline/steps/nifsSort.py index 5ef1b65..22ef547 100644 --- a/build/lib/nifty/pipeline/steps/nifsSort.py +++ b/build/lib/nifty/pipeline/steps/nifsSort.py @@ -1406,7 +1406,7 @@ def matchTellurics(telDirList, obsDirList, telluricTimeThreshold): logging.info("#####################################################################") logging.info("#####################################################################\n") - rewriteSciImageList(2.0, Science) + rewriteSciImageList(2.0, "Science") try: sciImageList = open('scienceFrameList', "r").readlines() logging.info("\nSucceeded; a science frame list exists in " + str(os.getcwd())) diff --git a/dist/nifty4gemini-1.0b9-py2-none-any.whl b/dist/nifty4gemini-1.0b10-py2-none-any.whl similarity index 95% rename from dist/nifty4gemini-1.0b9-py2-none-any.whl rename to dist/nifty4gemini-1.0b10-py2-none-any.whl index 16496a921fc3b7a0c10251d7cb9cf2df377d22e8..30b9bf76147338a5d8934de2f5d28379cc65529a 100644 GIT binary patch delta 4017 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ℜ6UA}a8abHWWa`8f z)1%sbWT#Y`7O*0nbL-<2D^;jXt0^PrTJAQBJcqje;3)xWxBUiTEWi9w-kwPh{BH65 zQL|*4pOG@$IlQg4IANqqjF`Fa(E_5~edY~Wktfk*6LDTWh6g;Wj@<0)Yus+1qv)uz z?;OIoD`jD*me%tQwJsCVa+P(h49q}EFP9_tgu}#=c44uTUFJjzcPY{1dmDjyF&mBw zgcX`M9_(+Uh`ZGEmks#pnBCljhuEv5Dw?=+jmpfaKgF&b_>YvFXak znphGzEdBD3fP`l1Y0+c!d&cbVc0&56{Chx(r(8K5@;WG7rY9KF8O+MScWqVHH<9x;vPO)oq=$k&~o&|dK~7C zo-Fa=(k-v3UD}^s6|c?r)jTy;V<~a2VXd%Lr`-)U$99$WSh?vNP902>N4Hv0$2ViC zf>{>Tw&u5m@3y=M7<;Bi@#b)IJ`6HrB+YiRt<=SQVVugF?;h?8wm zJV`LBfvnn7ev$ZE%PmUhz6Sv}_V|~mi2M*=Q*7(;^Gc1D9R@NRrhKz{q2&r?oj%%f zqnR>1yzwKJJ@?YWILU|>;y5a*rfWM#oKUV2WUWxVULFfUDlQ2$*HGG| znrA8u!F_Wg$#o$0a=A}#v0!H)HDvfic9wo+v1EGN{=SZmUO5ADta{(|fxrUTD|}#KV@ud zwWJO%hfa$>dxKy0NkzHkN>^C79!FkN4=*Dvxv+DCiBr`+X865wR?c-5rRh!v>$9^j z92kTmP)A^SZxPuV+^T7pXJ%Q4Ka1B5hZ>S6k zZk9or!5Kw>9L&`K*rCK=vj%V#&%FW)dbHtm9GZYEUd7+N*$SM%Qxj+PuKY{zQWLm{ zhr;~TtHR&}fEG@`U;o#TSv`~*H2FDX()MeJ6MU)#kjwrF?Qlo&uWK`;i4FK8W8grK zoBF5qUx)|NY6IK=jstN}#|#>3{}ujsu=_iFVF*m{&*5>H$NMX@-{I&VtF!Q*t!sZ< ze@CT%tgrvWs;&dD{+ji7aQer3Q{>OHCh7nj7C-CpJJS4PjlB3rtGKO`m$#UctG%0q cv5uC3v9=+c;3o<~1aNl|4xEvSI3|YtA8s$__5c6? delta 4029 zcmZ{nbyQSa8^&kOkV=Pi4H6C@Eh*jI!WD*)mPSBw=tfF8AP5L3B@H4a9U`C-A}F1M z#DLQEq3hmt*S#P2oVC~5d#~qt_PgJI&hKQz6onpnh>nXIr~5#@ z&x@dE!v%u4uZ5gB?`Q`%rQ+~W&bfzRZ8t`9KZwdxN%Diyh^~A25`%)CZ_d_@^xjJF z-L0sf|J-q)miDP$ow?-6NUai0BDl6O?)nl#VPMecMBvw69J)2AV{i~2sZ`ZRt0Xdg zl(fIG?7_p+fc*o-75MJ>kH)Y-bxZe*rg?Dsb$`c1d9=y0k0-i2Zn$Pt8B-m~b*GZm zU2Z0#vUUeK>@ue-E<)PH6j0VMskiSp!K6~tWaz$Gm3_WtTzgyRo6h=sf}?<`#_Il# zwuZ0FmXTKh%5N{PZR4s)3-!YhlklF>!*5zK&8;}8#XqS~U^QKUS^^Mo?cgexsY#ti zM2AetvxVYj(H2RbItYK3Rv78>qPBI9@McgSHG8S;<2YyWt&F?p{gzDKl0L4OKK=Wu z9})%$SrIiViG&6)Z}TOzoQt6h5tAZjX_KAq`qE32aqq@#H&g7>T!Sdn^#|DGh^8lK zL36_VmGAv1q~)ijP_Y8qQmW4$Ka%@jxt!9pAr2O~O?p$h?UoCRB|;@qz$Y(Wuh@2521;;O zykINLv+AXP)c-;P88rB4$m}bh=Zti$Ig5biHe2v<3SZeJaD%y~#oWM`)+ZIqAZNo>BPy~3R62CQ^D*Es+7OBY5AW1XS|Zr;+~ z^#d{uqU+81n_r2yc5blq=APgLEQU`D?*hmx6{IMo5$FPCD_0O1q+w7$)v=nIPa<}O z=6e={<~F7T>!`^6Nf&&Lh9`pU3>Bha7-TXb7rj-)Y~v2dolEPe!>}kI z5YRvdpsGhagl4{A7iJPv&zf7?W5R+!SnwebP6!0z;$Zv0SIExB*}=tuhyNy@m00~c z10ap{TTJTl7@d!OAtr!8xGxohG711~y%QWL!~X5C`>fYS20$QvFbD+k9}Z4{9hL@b z03A311t=X@&Ivd}*+BXmz$?^i>ed2Al&nuJa(8_1hO{iYcSp)~VAU+QVuXmcRxmMw zZ0Atm@#=?4)4@%2Y0H--LlhlZIi0|~pCzp}k@oZF)D8N!G}VVPPZIZZiAxSz)dIvXvYnh zK`~%AH;@G-0j+odZ(PxRUleLwvwnsLfB{fPaDf*vf{N6O^8sT}=p;xY0ED7`U7P&* ziP__e@;Heg5Y|h}yJ_v<`GCj4#nzQqPf=c5PoXYN)ib~ETEsrXr*kY*4J+ej?0gbA zW*IUSx=@x34p~61_3e_M4cNHu;#%S(V;!)v+`!Q=v50T__AqFA@#DUEBQ{NSurcb> z`N+qiIhE1WaN$Q8QdB=`bW^dlh%{uT%k=8^Al~%OI|6dryUbLpNYl+R2g1%mGf#V*&2=fAMoB zZ>k!s;z2`R;=3YnjGPk&67cbc@KH95*S-3juC}|U^hg^XU}gQ_;5HTgO02w!7HP+m z@YE=4oo1cb&ii~R47n_HZ86d1b?I>-IVM%Q#&yjVui{L&yO-BD8a#T1-y35 z{n2m79nS)T0(Zm0y3*bU6K^iA#t+ro#4HRVUaL>j7u;)-Rf+A8vOS=BF_Rr{esCjr zem`6izt4WGtBP(LTQRxUU}Z?&J&{Y6J9}D}$aV>cWm#oi;Lgva+!LD z3k{3k5to6{E~X>cy%Q$})7ZOk7m_RIPo*N6>f1^Q=&&RxJB1l|7uSSDOR|!gk(jci z{3^GiPL0Vj_7r8ev}Gw&bn|D)le4okrek_-{-T{qVvFfp+6dfMd~L=W8V)!=fuQD8 zHigRIINQ|b;mz8Pxz&0BOAmA>EB*09I0|uN?4iHD?_P8a&&KuH8!xgD^C<#Zfg+pk zITI5->_h8XW>ve*2_(Eg^H7q^@R_3n1Tsr6T8#(cXsSy7K%7d6=D-&wD>5GJ|%H6@~b)y3+wEB6E8 z$Ut%`#&d77!WdMDgfnr@$6JIP7Np0Wib&J=#B^24i1PE1$@b98D9$&H3!O552B?u8At^`+Cu!5NhljM#$%!Fn-;Y-qBu_ zy&R`Q(t~sE+^v(X7D6@5JEV$T6RU_)ak?B#F>i`r!!(JNm$Rym-+Ff9l?=H8P)Qh? z`eiMU_jWX+V{65p2$CSh;?;Cex^BuDf%ujE0Zrp@VX+)kNkT{V``N|3daP{6e*9xk zIZ^L!90`K<8=JRpo_=X-#?ga>&D>ch7yJ=+#zr)IJi7%nIB5r!tmrs&{V`$kS>p#= zOjKE$DczRw(2*aCYc5!FDl9v>n^%QI{YcH}jY&)!n|a#&H&^m;5l*`%tyx1cT}8?r zn@`4xmLX+QD4v>=h#2z%ulwIu%EyXX*X^c)Ys-C;_721i_NJbUSGd)RR7bH~-*(6# zOh1L$Eo1ux9{HpPqC^=dwSKijDti)J^D8H!~Rk7 z0Kj23j4nWRCrVekEzs#1Zv;uX&wO^B&)_px?A>@j)Qbn7K8)LnJ>3rOSv`GSn^>%R z&s9qYz5kUUw$*}Ve@zbK9DURr)>-;;yKzx753Xo@_koXz;#A2HC7wZOzb9dm{+FLs zGeadH=e;I3iEw7sWzUF!VEgIo8zQRS3jQ_HP8thKmZO=m^7L9Y0XYh%3M3_Dk;qBY z)l8eZ7}TO*b$*ePa=`+E(k{HKYK#gYaoDDQ5`t-^HFzQyfVnS&XwON4!6}i_Ze#+N9lx^Vm)?a})fQ2k-K_ zTJg@fNu->7`;|EQw(eHae&><)B5m7j-F@EfkH)vQZjehx4)C)3jamUyqkIBKRnH0| z69kJr9V?$Oj3%7IGe{rVwk8ETuiUW!#ypc4J{T*8$;7ogWXAHr?G5xi3-v5FHfB}7 zbK4qWFji=Z@UtI@t&n=87*L8s_>Z3{@R|%@4iG*BnPmYg5F-s>fhjV8F!UP8Bnz;B z=wEa5Uvnh%BN!wLC_(YTZdpJB=3WK`lPjR)U~U=oD)>wcAOV}opd^GB-^$-lK}h*u zim5Uv9_S|rAYfh + in " + does not have a scienceFrameList.") + I am trying to rewrite it with zero point offsets. + + ##################################################################### + ##################################################################### + +Solution: + +- Change the skyThreshold parameter (given in arc seconds) and re-run sort. + +If the sorting script does not create a skyFrameList in the object or telluric observation +directories this means that the offsets between sky frames and object frames were different +than expected. A skyFrameList can be manually created and saved in the appropriate directory, or +the skyThreshold parameter modified. + +Telluric and Science Frame Matching + +Relevant warning: + +..code-block:: text + + ##################################################################### + + WARNING in sort: no tellurics data found for science " + in " to something new. nifsBaselineCalibration.py -------------------------- diff --git a/nifty/pipeline/steps/nifsFluxCalibrate.py b/nifty/pipeline/steps/nifsFluxCalibrate.py index fcfa3f0..410249e 100644 --- a/nifty/pipeline/steps/nifsFluxCalibrate.py +++ b/nifty/pipeline/steps/nifsFluxCalibrate.py @@ -18,7 +18,6 @@ def run(): """ # Store current working directory for later use. path = os.getcwd() - import pdb; pdb.set_trace() # Set up the logging file. log = os.getcwd()+'/Nifty.log' # Set up iraf diff --git a/nifty/pipeline/steps/nifsMerge.py b/nifty/pipeline/steps/nifsMerge.py index a135f83..904a78c 100644 --- a/nifty/pipeline/steps/nifsMerge.py +++ b/nifty/pipeline/steps/nifsMerge.py @@ -83,22 +83,43 @@ def run(): scienceDirectoryList = config['scienceDirectoryList'] # Read baselineCalibrationReduction specfic config. mergeConfig = config['mergeConfig'] - mergeUncorrectedCubes = mergeConfig['mergeUncorrectedCubes'] - mergeTelluricCorrectedCubes = mergeConfig['mergeTelluricCorrectedCubes'] - mergeTelCorAndFluxCalibratedCubes = mergeConfig['mergeTelCorAndFluxCalibratedCubes'] + start = mergeConfig['mergeStart'] + stop = mergeConfig['mergeStop'] use_pq_offsets = mergeConfig['use_pq_offsets'] im3dtran = mergeConfig['im3dtran'] - # There are three types of merging to choose from. You can: - # Merge uncorrected cubes. These have the "ctfbrsn" prefix. - if mergeUncorrectedCubes: - mergeCubes(scienceDirectoryList, "uncorrected", use_pq_offsets, im3dtran, over) - # Merge telluric corrected cubes. These have the "actfbrsn" prefix. - if mergeTelluricCorrectedCubes: - mergeCubes(scienceDirectoryList, "telluricCorrected", use_pq_offsets, im3dtran, over) - # Merge telluric corrected AND flux calibrated cubes. These have the "factfbrsn" prefix. - if mergeTelCorAndFluxCalibratedCubes: - mergeCubes(scienceDirectoryList, "telCorAndFluxCalibrated", use_pq_offsets, im3dtran, over) + valindex = start + while valindex <= stop: + # There are three types of merging to choose from. You can: + + if valindex == 1: + # Merge uncorrected cubes. These have the "ctfbrsn" prefix. + mergeCubes(scienceDirectoryList, "uncorrected", use_pq_offsets, im3dtran, over) + logging.info("\n##############################################################################") + logging.info("") + logging.info(" STEP 1 - Merge Uncorrected Cubes - COMPLETED ") + logging.info("") + logging.info("##############################################################################\n") + + if valindex == 2: + # Merge telluric corrected cubes. These have the "actfbrsn" prefix. + mergeCubes(scienceDirectoryList, "telluricCorrected", use_pq_offsets, im3dtran, over) + logging.info("\n##############################################################################") + logging.info("") + logging.info(" STEP 2 - Merge Telluric Corrected Cubes - COMPLETED ") + logging.info("") + logging.info("##############################################################################\n") + + if valindex == 3: + # Merge telluric corrected AND flux calibrated cubes. These have the "factfbrsn" prefix. + mergeCubes(scienceDirectoryList, "telCorAndFluxCalibrated", use_pq_offsets, im3dtran, over) + logging.info("\n##############################################################################") + logging.info("") + logging.info(" STEP 3 - Merge Telluric Corrected and Flux Calibrated Cubes - COMPLETED ") + logging.info("") + logging.info("##############################################################################\n") + + valindex += 1 def mergeCubes(obsDirList, cubeType, use_pq_offsets, im3dtran, over=""): """MERGE diff --git a/nifty/pipeline/steps/nifsReduce.py b/nifty/pipeline/steps/nifsReduce.py index b3091fe..2fa0522 100644 --- a/nifty/pipeline/steps/nifsReduce.py +++ b/nifty/pipeline/steps/nifsReduce.py @@ -440,16 +440,19 @@ def start(kind, telluricDirectoryList="", scienceDirectoryList=""): copyToScience = True if copyToScience: # Copy final extracted results to science directory. - with open("scienceMatchedTellsList", "r") as f: - lines = f.readlines() - lines = [x.strip() for x in lines] - - for i in range(len(lines)): - if "obs" in lines[i]: - k = 1 - while i+k != len(lines) and "obs" not in lines[i+k]: - copyResultsToScience("gxtfbrsn"+tellist[0]+".fits", "0_tel"+lines[i+k]+".fits", over) - k+=1 + try: + with open("scienceMatchedTellsList", "r") as f: + lines = f.readlines() + lines = [x.strip() for x in lines] + + for i in range(len(lines)): + if "obs" in lines[i]: + k = 1 + while i+k != len(lines) and "obs" not in lines[i+k]: + copyResultsToScience("gxtfbrsn"+tellist[0]+".fits", "0_tel"+lines[i+k]+".fits", over) + k+=1 + except IOError: + logging.info("\nNo scienceMatchedTellsList found in "+ os.getcwd() +" . Skipping copy of extracted spectra to science directory.") logging.info("\n##############################################################################") logging.info("") diff --git a/nifty/pipeline/steps/nifsSort.py b/nifty/pipeline/steps/nifsSort.py index 22ef547..4f02c9b 100644 --- a/nifty/pipeline/steps/nifsSort.py +++ b/nifty/pipeline/steps/nifsSort.py @@ -293,11 +293,15 @@ def makePythonLists(rawPath, skyThreshold): header = astropy.io.fits.open(entry) # Store information in variables. + instrument = header[0].header['INSTRUME'] + if instrument != 'NIFS': + # Only grab frames belonging to NIFS raw data! + continue obstype = header[0].header['OBSTYPE'].strip() ID = header[0].header['OBSID'] date = header[0].header[ 'DATE'].replace('-','') - aper = header[0].header['APERTURE'] obsclass = header[0].header['OBSCLASS'] + aper = header[0].header['APERTURE'] # If object name isn't alphanumeric, make it alphanumeric. objname = header[0].header['OBJECT'] objname = re.sub('[^a-zA-Z0-9\n\.]', '', objname) @@ -385,6 +389,11 @@ def makePythonLists(rawPath, skyThreshold): for i in range(len(rawfiles)): header = astropy.io.fits.open(rawfiles[i]) + # Store information in variables. + instrument = header[0].header['INSTRUME'] + if instrument != 'NIFS': + # Only grab frames belonging to NIFS raw data! + continue date = header[0].header['DATE'].replace('-','') obsclass = header[0].header['OBSCLASS'] obj = header[0].header['OBJECT'] @@ -405,6 +414,11 @@ def makePythonLists(rawPath, skyThreshold): n = 0 for flat in flatlist: header = astropy.io.fits.open(flat) + # Store information in variables. + instrument = header[0].header['INSTRUME'] + if instrument != 'NIFS': + # Only grab frames belonging to NIFS raw data! + continue obsid = header[0].header['OBSID'] date = header[0].header['DATE'].replace('-','') # Make sure no duplicate dates are being entered. diff --git a/nifty/pipeline/steps/nifsTelluric.py b/nifty/pipeline/steps/nifsTelluric.py index 8637d42..c6368c5 100644 --- a/nifty/pipeline/steps/nifsTelluric.py +++ b/nifty/pipeline/steps/nifsTelluric.py @@ -266,8 +266,15 @@ def getStandardInfo(rawFrame, standardStarMagnitude, standardStarSpecTemperature start_name='http://simbad.u-strasbg.fr/simbad/sim-coo?Coord=' end_name = '&submit=submit%20query&Radius.unit=arcsec&Radius=10' www_page = start_name+coordinates+end_name - f = urllib.urlopen(www_page) - html2 = f.read() + #f = urllib.urlopen(www_page) + while True: + try: + with urllib.urlopen(www_page) as f: + html2 = f.read() + break + except IOError: + logging.info("\nFailed to open SIMBAD; retrying.") + pass html2 = html2.replace(' ','') search_error = str(html2.split('\n')) #Exit if the lookup found nothing. diff --git a/nifty4gemini.egg-info/PKG-INFO b/nifty4gemini.egg-info/PKG-INFO new file mode 100644 index 0000000..c294024 --- /dev/null +++ b/nifty4gemini.egg-info/PKG-INFO @@ -0,0 +1,109 @@ +Metadata-Version: 1.2 +Name: nifty4gemini +Version: 1.0b10 +Summary: The Gemini NIFS data reduction pipeline. +Home-page: http://www.gemini.edu +Author: mbusserolle +Author-email: mbussero@gemini.edu +License: MIT +Description: Nifty + ===== + + .. image:: https://zenodo.org/badge/93109208.svg + :alt: DOI of the latest release. See releases. + :target: https://zenodo.org/record/852696#.WaWmr5PyhMA + .. image:: https://readthedocs.org/projects/nifty4gemini/badge/?version=latest + :alt: Nifty's documentation, hosted on ReadtheDocs. + :target: http://nifty4gemini.readthedocs.io/en/latest/ + .. image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat + :alt: Nifty uses Astropy! Here is a link to the project webpage: + :target: http://www.astropy.org/ + + *Now in Beta status! Please let us know of any bugs you find on the issues page.* + + A Python Data Reduction Pipeline for the Gemini-North Near-Infrared Integral + Field Spectrometer (NIFS). + + Full documentation: `ReadTheDocs `_. + + This is a new data reduction Python pipeline that uses Astroconda and the Gemini + IRAF Package to reduce NIFS data. It offers a complete data reduction process from + sorting the data to producing a final flux calibrated and wavelength calibrated + combined cube with the full S/N for a science target. + + This pipeline is open source but is not supported by Gemini Observatory. + + Any feedback and comments (mbusserolle@gemini.edu) are welcome! + + Copyright + --------- + + For more details, please read the LICENSE. + + + How to Submit Bugs and Requests + ------------------------------- + + Very important: **do not submit a Gemini help desk ticket!** + + If you want to report a problem, use the `Gemini Data Reduction Forum thread `_ + or create an issue in this repo. + + Installation + ============ + + Pre-Requisites + -------------- + Make sure you have the latest version of Gemini Astroconda installed, have activated an Astroconda environment and have set up PYRAF. + You can find instructions for installing Astroconda `here `_. PYRAF can be set up by running the mkiraf command + in your "~/iraf" directory. + + Installing + ---------- + From PyPi.org: + + .. code-block:: text + + pip install Nifty4NIFS + + Installing in Editable Mode + --------------------------- + If you want to edit the Nifty source code, it's recommended to install Nifty in editable Mode. First obtain the Nifty source code. You + can do this by downloading and unpacking the latest release or cloning this github repository. + + Once you have the source code, change to the top level of the source code directory (you should see the setup.py file). Run: + + .. code-block:: text + + pip install -e . + + to install Nifty in editable mode. Now you can edit your copy of the Nifty source code and run it without having to reinstall every time. + + Quick Start + =========== + + To run Nifty, getting data reduction parameters from an interactive input session: + + .. code-block:: text + + runNifty nifsPipeline -i + + To run Nifty in full-automatic mode with default input parameters, provide the -f flag + and a full local path to the raw data or a Gemini Program ID string (Eg: GN-2013A-Q-62). + + .. code-block:: text + + runNifty nifsPipeline -f + +Keywords: Gemini NIFS nifs pipeline reduction data IRAF iraf PYRAF pyraf astronomy integral field spectroscopy ifs ifu +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: MacOS X +Classifier: Intended Audience :: Science/Research +Classifier: Intended Audience :: Education +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: MacOS +Classifier: Programming Language :: Python :: 2.7 +Classifier: Topic :: Scientific/Engineering :: Astronomy +Classifier: Topic :: Scientific/Engineering :: Physics +Requires-Python: ~=2.7 diff --git a/nifty4gemini.egg-info/SOURCES.txt b/nifty4gemini.egg-info/SOURCES.txt new file mode 100644 index 0000000..81d4451 --- /dev/null +++ b/nifty4gemini.egg-info/SOURCES.txt @@ -0,0 +1,38 @@ +README.rst +nifty/__init__.py +nifty/pipeline/__init__.py +nifty/pipeline/nifsLowMemoryPipeline.py +nifty/pipeline/nifsPipeline.py +nifty/pipeline/nifsUtils.py +nifty/pipeline/configobj/__init__.py +nifty/pipeline/configobj/configobj.py +nifty/pipeline/downloadFromGeminiPublicArchive/__init__.py +nifty/pipeline/downloadFromGeminiPublicArchive/ndmapperDownloader.py +nifty/pipeline/objectoriented/OOnifsBaseline.py +nifty/pipeline/objectoriented/__init__.py +nifty/pipeline/objectoriented/getConfig.py +nifty/pipeline/objectoriented/routine.py +nifty/pipeline/objectoriented/step.py +nifty/pipeline/objectoriented/subroutine.py +nifty/pipeline/steps/__init__.py +nifty/pipeline/steps/nifsBaselineCalibration.py +nifty/pipeline/steps/nifsFluxCalibrate.py +nifty/pipeline/steps/nifsMerge.py +nifty/pipeline/steps/nifsReduce.py +nifty/pipeline/steps/nifsSort.py +nifty/pipeline/steps/nifsTelluric.py +nifty/pipeline/steps/routines/__init__.py +nifty/pipeline/steps/routines/nifsMakeTelluric.py +nifty/recipes/__init__.py +nifty/recipes/defaultConfig.cfg +nifty/runtimeData/__init__.py +nifty/runtimeData/h_ar.dat +nifty/runtimeData/j_ar.dat +nifty/runtimeData/k_ar.dat +nifty/runtimeData/new_starstemp.txt +nifty/runtimeData/vega_ext.fits +nifty4gemini.egg-info/PKG-INFO +nifty4gemini.egg-info/SOURCES.txt +nifty4gemini.egg-info/dependency_links.txt +nifty4gemini.egg-info/top_level.txt +scripts/runNifty \ No newline at end of file diff --git a/nifty4gemini.egg-info/dependency_links.txt b/nifty4gemini.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/nifty4gemini.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/nifty4gemini.egg-info/top_level.txt b/nifty4gemini.egg-info/top_level.txt new file mode 100644 index 0000000..6c25b24 --- /dev/null +++ b/nifty4gemini.egg-info/top_level.txt @@ -0,0 +1 @@ +nifty From bd846570e3bd1d7659b72f2226278a71ba587dc9 Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 12:20:23 -1000 Subject: [PATCH 3/8] Minor badge updates --- README.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.rst b/README.rst index a69fdea..80004a1 100644 --- a/README.rst +++ b/README.rst @@ -1,6 +1,7 @@ Nifty ===== .. image:: https://badge.fury.io/py/nifty4gemini.svg + :alt: Available on PyPi. :target: https://badge.fury.io/py/nifty4gemini .. image:: https://zenodo.org/badge/93109208.svg :alt: DOI of the latest release. See releases. @@ -8,6 +9,11 @@ Nifty .. image:: https://readthedocs.org/projects/nifty4gemini/badge/?version=latest :alt: Nifty's documentation, hosted on ReadtheDocs. :target: http://nifty4gemini.readthedocs.io/en/latest/ + + .. image:: https://img.shields.io/badge/License-MIT-yellow.svg + :alt: MIT license. + :target: https://opensource.org/licenses/MIT + .. image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat :alt: Nifty uses Astropy! Here is a link to the project webpage: :target: http://www.astropy.org/ From addc93d809469c1688367a8bec27c412bb232c60 Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 12:24:14 -1000 Subject: [PATCH 4/8] Even more minor badge updates --- README.rst | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 80004a1..a8e8768 100644 --- a/README.rst +++ b/README.rst @@ -9,11 +9,12 @@ Nifty .. image:: https://readthedocs.org/projects/nifty4gemini/badge/?version=latest :alt: Nifty's documentation, hosted on ReadtheDocs. :target: http://nifty4gemini.readthedocs.io/en/latest/ - - .. image:: https://img.shields.io/badge/License-MIT-yellow.svg - :alt: MIT license. - :target: https://opensource.org/licenses/MIT - +.. image:: https://img.shields.io/badge/License-MIT-yellow.svg + :alt: MIT license. + :target: https://opensource.org/licenses/MIT +.. image:: https://badges.frapsoft.com/os/v2/open-source.svg?v=103 + :alt: Nifty is open-source. + :target: https://github.com/ellerbrock/open-source-badges/ .. image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat :alt: Nifty uses Astropy! Here is a link to the project webpage: :target: http://www.astropy.org/ From aafd6a8920da2a9f6071bd34ae5d90fe947dcdf6 Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 12:26:07 -1000 Subject: [PATCH 5/8] Tweaking badges --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index a8e8768..8154975 100644 --- a/README.rst +++ b/README.rst @@ -3,12 +3,12 @@ Nifty .. image:: https://badge.fury.io/py/nifty4gemini.svg :alt: Available on PyPi. :target: https://badge.fury.io/py/nifty4gemini -.. image:: https://zenodo.org/badge/93109208.svg - :alt: DOI of the latest release. See releases. - :target: https://zenodo.org/record/852696#.WaWmr5PyhMA .. image:: https://readthedocs.org/projects/nifty4gemini/badge/?version=latest :alt: Nifty's documentation, hosted on ReadtheDocs. :target: http://nifty4gemini.readthedocs.io/en/latest/ +.. image:: https://zenodo.org/badge/93109208.svg + :alt: DOI of the latest release. See releases. + :target: https://zenodo.org/record/852696#.WaWmr5PyhMA .. image:: https://img.shields.io/badge/License-MIT-yellow.svg :alt: MIT license. :target: https://opensource.org/licenses/MIT From 4107cc154bdc5235c1feb886f62317c5d9644fa6 Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 12:26:49 -1000 Subject: [PATCH 6/8] Tweaking some more --- README.rst | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.rst b/README.rst index 8154975..e35453d 100644 --- a/README.rst +++ b/README.rst @@ -12,9 +12,6 @@ Nifty .. image:: https://img.shields.io/badge/License-MIT-yellow.svg :alt: MIT license. :target: https://opensource.org/licenses/MIT -.. image:: https://badges.frapsoft.com/os/v2/open-source.svg?v=103 - :alt: Nifty is open-source. - :target: https://github.com/ellerbrock/open-source-badges/ .. image:: http://img.shields.io/badge/powered%20by-AstroPy-orange.svg?style=flat :alt: Nifty uses Astropy! Here is a link to the project webpage: :target: http://www.astropy.org/ From a09535798999f76a6503aec054c6d405ee1441a1 Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 15:00:52 -1000 Subject: [PATCH 7/8] Resolved issue #3 in Github --- docs/index.rst | 2 ++ nifty/pipeline/steps/nifsTelluric.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/docs/index.rst b/docs/index.rst index f620412..4e68f0e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -8,6 +8,8 @@ Welcome to Nifty's documentation! Nifty is a full-featured Gemini NIFS data reduction pipeline and data reduction package. +This is a test. + ===================== Package Documentation ===================== diff --git a/nifty/pipeline/steps/nifsTelluric.py b/nifty/pipeline/steps/nifsTelluric.py index c6368c5..dcce79b 100644 --- a/nifty/pipeline/steps/nifsTelluric.py +++ b/nifty/pipeline/steps/nifsTelluric.py @@ -499,6 +499,7 @@ def divideByContinuum(rawFrame, log, over): if os.path.exists("3_chtel"+rawFrame+'.fits'): if over: os.remove("3_chtel"+rawFrame+'.fits') + # This is related to issue #3 #iraf.imarith("1_htel"+rawFrame+'.fits', "/", "2_fit"+rawFrame+'.fits', result="3_chtel"+rawFrame+'.fits',title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') operand1 = astropy.io.fits.open("1_htel"+rawFrame+'.fits')[0].data operand2 = astropy.io.fits.open("2_fit"+rawFrame+'.fits')[0].data @@ -516,6 +517,7 @@ def divideByContinuum(rawFrame, log, over): else: logging.info("\nOutput exists and -over not set - skipping division by continuum") else: + # This is related to issue #3 #iraf.imarith('1_htel'+rawFrame+'.fits', "/", '2_fit'+rawFrame+'.fits', result='3_chtel'+rawFrame+'.fits',title='',divzero=0.0,hparams='',pixtype='',calctype='',verbose='no',noact='no',mode='al') operand1 = astropy.io.fits.open("1_htel"+rawFrame+'.fits')[0].data operand2 = astropy.io.fits.open("2_fit"+rawFrame+'.fits')[0].data From 6630f463803fbe94f04d96213aaa3536fccc16ea Mon Sep 17 00:00:00 2001 From: mrlb05 Date: Tue, 19 Sep 2017 15:17:22 -1000 Subject: [PATCH 8/8] Minor changes --- setup.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index fca1de2..c9fb88a 100644 --- a/setup.py +++ b/setup.py @@ -22,10 +22,10 @@ setup( name=NAME, - version="1.0b10", + version="1.0b11", author='mbusserolle', author_email='mbussero@gemini.edu', - description='The Gemini NIFS data reduction pipeline.', + description='Gemini Instruments Data Reduction Framework.', long_description = README_TEXT, url='http://www.gemini.edu', license='MIT',