<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Getting Started
Before starting here, all the instructions on the installation page should be completed! 
Here you will learn how to
Step1:  Load Exo Dict for Specific Planet
To start, load in a blank exoplanet dictionary with empty keys. You will fill these out for yourself in the next step.
Step2:  Edit exoplanet observation inputs
Editting each keys are annoying. But, do this carefully or it could result in nonsense runs
Step3:  Edit exoplanet inputs using one of  three options
1) user specified
2) constant value
3) select from grid
1) Edit exoplanet planet inputs if using your own model
Step4:  2) Users can also add in a constant temperature or a constant transit depth
Step5:  3) Select from grid
NOTE
Step6:  Load in instrument dictionary (OPTIONAL)
Step 2 is optional because PandExo has the functionality to automatically load in instrument dictionaries. Skip this if you plan on observing with one of the following and want to use the subarray with the smallest frame time and the readout mode with 1 frame/1 group (standard)
Step7:  Don't know what instrument options there are?
Step8:  Adjusting the Background Level
You may want to think about adjusting the background level of your observation, based on the position of your target. PandExo two options and three levels for the position
Step9:  Running NIRISS SOSS Order 2
PandExo only will extract a single order at a time. By default, it is set to extract Order 1. Below you can see how to extract the second order. 
NOTE! Users should be careful with this calculation. Saturation will be limited by the first order. Therefore, I suggest running one calculation with ngroup='optmize' for Order 1. This will give you an idea of a good number of groups to use. Then, you can use that in this order 2 calculation.
Step10:  Running PandExo
You have four options for running PandExo. All of them are accessed through attribute jdi.run_pandexo. See examples below. 
jdi.run_pandexo(exo, inst, param_space = 0, param_range = 0,save_file = True,
                            output_path=os.getcwd(), output_file = '')
Option 1- Run single instrument mode, single planet
If you forget which instruments are available run jdi.print_isntruments() and pick one
Step11:  Option 2- Run single instrument mode (with user dict), single planet
This is the same thing as option 1 but instead of feeding it a list of keys, you can feed it a instrument dictionary (this is for users who wanted to simulate something NOT pre defined within pandexo)
Step12:  Option 3- Run several modes, single planet
Use several modes from print_isntruments() options.
Step13:  Option 4- Run single mode, several planet cases
Use a single modes from print_isntruments() options. But explore parameter space with respect to any parameter in the exo dict. The example below shows how to loop over several planet models
You can loop through anything in the exoplanet dictionary. It will be planet, star or observation followed by whatever you want to loop through in that set. 
i.e. planet+exopath, star+temp, star+metal, star+logg, observation+sat_level.. etc
<ASSISTANT_TASK:>
Python Code:
import warnings
warnings.filterwarnings('ignore')
import pandexo.engine.justdoit as jdi 
import numpy as np
import os
Explanation: Getting Started
Before starting here, all the instructions on the installation page should be completed! 
Here you will learn how to: 
set planet and star properties using exomast
run default instrument modes 
adjust instrument modes 
run pandexo
End of explanation
exo_dict = jdi.load_exo_dict('HD 189733 b')
Explanation: Load Exo Dict for Specific Planet
To start, load in a blank exoplanet dictionary with empty keys. You will fill these out for yourself in the next step.
End of explanation
exo_dict['observation']['sat_level'] = 80    #saturation level in percent of full well 
exo_dict['observation']['sat_unit'] = '%'
exo_dict['observation']['noccultations'] = 2 #number of transits 
exo_dict['observation']['R'] = None          #fixed binning. I usually suggest ZERO binning.. you can always bin later 
                                             #without having to redo the calcualtion
exo_dict['observation']['baseline_unit'] = 'total'  #Defines how you specify out of transit observing time
                                                    #'frac' : fraction of time in transit versus out = in/out 
                                                    #'total' : total observing time (seconds)
exo_dict['observation']['baseline'] = 4.0*60.0*60.0 #in accordance with what was specified above (total observing time)
exo_dict['observation']['noise_floor'] = 0   #this can be a fixed level or it can be a filepath 
                                             #to a wavelength dependent noise floor solution (units are ppm)
Explanation: Edit exoplanet observation inputs
Editting each keys are annoying. But, do this carefully or it could result in nonsense runs
End of explanation
exo_dict['planet']['type'] ='user'                       #tells pandexo you are uploading your own spectrum
exo_dict['planet']['exopath'] = 'wasp12b.txt'
exo_dict['planet']['w_unit'] = 'cm'                      #other options include "um","nm" ,"Angs", "sec" (for phase curves)
exo_dict['planet']['f_unit'] = 'rp^2/r*^2'               #other options are 'fp/f*' 
Explanation: Edit exoplanet inputs using one of  three options
1) user specified
2) constant value
3) select from grid
1) Edit exoplanet planet inputs if using your own model
End of explanation
exo_dict['planet']['type'] = 'constant'                  #tells pandexo you want a fixed transit depth
exo_dict['planet']['f_unit'] = 'rp^2/r*^2'        #this is what you would do for primary transit 
#ORRRRR....
#if you wanted to instead to secondary transit at constant temperature 
exo_dict['planet']['f_unit'] = 'fp/f*' 
exo_dict['planet']['temp'] = 1000
Explanation: 2) Users can also add in a constant temperature or a constant transit depth
End of explanation
exo_dict['planet']['type'] = 'grid'                #tells pandexo you want to pull from the grid
exo_dict['planet']['temp'] = 1000                 #grid: 500, 750, 1000, 1250, 1500, 1750, 2000, 2250, 2500
exo_dict['planet']['chem'] = 'noTiO'              #options: 'noTiO' and 'eqchem', noTiO is chemical eq. without TiO
exo_dict['planet']['cloud'] = 'ray10'               #options: nothing: '0', 
Explanation: 3) Select from grid
NOTE: Currently only the fortney grid for hot Jupiters from Fortney+2010 is supported. Holler though, if you want another grid supported
End of explanation
#jdi.print_instruments()
result = jdi.run_pandexo(exo_dict,['NIRCam F322W2'])
inst_dict = jdi.load_mode_dict('NIRSpec G140H')
#loading in instrument dictionaries allow you to personalize some of  
#the fields that are predefined in the templates. The templates have 
#the subbarays with the lowest frame times and the readmodes with 1 frame per group. 
#if that is not what you want. change these fields
#Try printing this out to get a feel for how it is structured: 
print(inst_dict['configuration'])
#Another way to display this is to print out the keys 
inst_dict.keys()
Explanation: Load in instrument dictionary (OPTIONAL)
Step 2 is optional because PandExo has the functionality to automatically load in instrument dictionaries. Skip this if you plan on observing with one of the following and want to use the subarray with the smallest frame time and the readout mode with 1 frame/1 group (standard): 
- NIRCam F444W
- NIRSpec Prism
- NIRSpec G395M
- NIRSpec G395H
- NIRSpec G235H
- NIRSpec G235M
- NIRCam F322W
- NIRSpec G140M
- NIRSpec G140H
- MIRI LRS
- NIRISS SOSS
End of explanation
print("SUBARRAYS")
print(jdi.subarrays('nirspec'))
print("FILTERS")
print(jdi.filters('nircam'))
print("DISPERSERS")
print(jdi.dispersers('nirspec'))
#you can try personalizing some of these fields
inst_dict["configuration"]["detector"]["ngroup"] = 'optimize'   #running "optimize" will select the maximum 
                                                                #possible groups before saturation. 
                                                                #You can also write in any integer between 2-65536
inst_dict["configuration"]["detector"]["subarray"] = 'substrip256'   #change the subbaray
Explanation: Don't know what instrument options there are?
End of explanation
inst_dict['background'] = 'ecliptic'
inst_dict['background_level'] = 'high'
Explanation: Adjusting the Background Level
You may want to think about adjusting the background level of your observation, based on the position of your target. PandExo two options and three levels for the position: 
ecliptic or minzodi 
low, medium, high
End of explanation
inst_dict = jdi.load_mode_dict('NIRISS SOSS')
inst_dict['strategy']['order'] = 2
inst_dict['configuration']['detector']['subarray'] = 'substrip256'
ngroup_from_order1_run = 2
inst_dict["configuration"]["detector"]["ngroup"] = ngroup_from_order1_run
Explanation: Running NIRISS SOSS Order 2
PandExo only will extract a single order at a time. By default, it is set to extract Order 1. Below you can see how to extract the second order. 
NOTE! Users should be careful with this calculation. Saturation will be limited by the first order. Therefore, I suggest running one calculation with ngroup='optmize' for Order 1. This will give you an idea of a good number of groups to use. Then, you can use that in this order 2 calculation.
End of explanation
jdi.print_instruments()
result = jdi.run_pandexo(exo_dict,['NIRCam F322W2'])
Explanation: Running PandExo
You have four options for running PandExo. All of them are accessed through attribute jdi.run_pandexo. See examples below. 
jdi.run_pandexo(exo, inst, param_space = 0, param_range = 0,save_file = True,
                            output_path=os.getcwd(), output_file = '')
Option 1- Run single instrument mode, single planet
If you forget which instruments are available run jdi.print_isntruments() and pick one
End of explanation
inst_dict = jdi.load_mode_dict('NIRSpec G395M')
#personalize subarray
inst_dict["configuration"]["detector"]["subarray"] = 'sub2048'
result = jdi.run_pandexo(exo_dict, inst_dict)
np.mea(result['FinalSpectrum']['spectrum_w_rand'])
Explanation: Option 2- Run single instrument mode (with user dict), single planet
This is the same thing as option 1 but instead of feeding it a list of keys, you can feed it a instrument dictionary (this is for users who wanted to simulate something NOT pre defined within pandexo)
End of explanation
#choose select 
result = jdi.run_pandexo(exo_dict,['NIRSpec G140M','NIRSpec G235M','NIRSpec G395M'],
               output_file='three_nirspec_modes.p')
#run all 
#result = jdi.run_pandexo(exo_dict, ['RUN ALL'], save_file = False)
Explanation: Option 3- Run several modes, single planet
Use several modes from print_isntruments() options.
End of explanation
#looping over different exoplanet models 
jdi.run_pandexo(exo_dict, ['NIRCam F444W'], param_space = 'planet+exopath',
                param_range = os.listdir('/path/to/location/of/models'),
               output_path = '/path/to/output/simulations')
#looping over different stellar temperatures 
jdi.run_pandexo(exo_dict, ['NIRCam F444W'], param_space = 'star+temp',
                param_range = np.linspace(5000,8000,2),
               output_path = '/path/to/output/simulations')
#looping over different saturation levels
jdi.run_pandexo(exo_dict, ['NIRCam F444W'], param_space = 'observation+sat_level',
                param_range = np.linspace(.5,1,5),
               output_path = '/path/to/output/simulations')
Explanation: Option 4- Run single mode, several planet cases
Use a single modes from print_isntruments() options. But explore parameter space with respect to any parameter in the exo dict. The example below shows how to loop over several planet models
You can loop through anything in the exoplanet dictionary. It will be planet, star or observation followed by whatever you want to loop through in that set. 
i.e. planet+exopath, star+temp, star+metal, star+logg, observation+sat_level.. etc
End of explanation
<END_TASK>