irfpy.vels.scidata
¶
The module provide access data through the official ELS data set for VEX.
See step by step tutorial for data analysis.
Todo
More user-oriented data analysis explanation should be here.
Todo
Class relation figure to be added in the document. This is a model of implementation of data accessor.
Todo
Consider the mixature of ELS 128 energy mode and 32 energy mode. This may influence the basic implementaion, thus, this change might be implemented as scidata2 module.
- Data getter:
Simple methods to get data.
get_countdata()
,get_count()
,get_def()
,get_dnf()
andget_psd()
is implemented. Partly supports 32 energy step mode. But all the returned values are matrix of 128 elements, which means that the user must reshape the data manually into 32 element array.Note
It is important to know what time of the data is returned. If user specified the time of t, then the returned data is at the time t0, where t0 is the latest time satisfying t0 < t.
Thus, if you give time in the data gap between observation sessions, then the returned time is the last data of the previous observation session. User should be careful on this behaviour.
Introduced from v4.2.3a6.
- Observation time getter:
Obtain the time of the observation. Each 4s time returned.
get_obstime()
.
- Single matlab file:
A single file of the ELS matlab-formatted file is expressed by
ElsCountFile
. Each single file contains 1 hour data of ELS.
- Matlab data base:
An aggregation of the ELS matlab-formatted file is called data base. The data base is implemented in
ElsCountFileDB
. The methodElsCountFileDB.get_filename()
returns the filename that includes the data of the specified time.Note
This is not for user functionality. Document to be removed.
- Default Matlab data base:
The method
get_defaultdb()
will return the default data base specifieid in.irfpyrc
.Note
This is not for user functionality. Document revised to adopt to the user oriented way.
ELS data at a time:
ElsCountData
is a record of the data. It is produced from single matlab file with specification of the time using the methodElsCountFile.get_elscountdata()
Simple accessor isget_countdata()
function.
- class irfpy.vels.scidata.ElsCountData(t, count, level, level_time=None)[source]¶
Bases:
object
ELS count data at a specified time (4-s data with full energy scan). No interpretation.
ELS data consists of the following information.
- Start time (
starttime
) The start time of the observation.
datetime.datetime
instance.- Energy spectra (
count
) The energy spectra as (nE, nA) array, where nE is the energy step and nA is the anode size.
- HV levels (
level
) HV levels to calculate the energy more precisely than the prediction.
None
is also allowed.None
may happen at the boundary of the data files.
This class is for raw, non-interpreted data. Non-interpreted data means that the mode is unknown. Therefore, this class can represent both E128 mode and E32 mode, but the four E32 mode data is stacked into one
ElsCountData
object. This calss does not support the energy table.It is recommended to use the interpreted data (
ElsCountDataE128
andElsCountDataE32
) for data analysis- get_count()[source]¶
Return the count rate data.
- Returns
The count rate of ELS
- Return type
numpy.array
with (128, 16) shape.
- get_energy(elsmode=None)[source]¶
Return the energy table that is calculated from TM level.
- Parameters
elsmode – ELS mode to interpret this data. See
ElsCountData.get_tm_level()
for details.- Returns
Energy table in electron volts.
- Return type
numpy.array
of (128, 16) shape
Warning
It is not recommended to use this method for data analysis. Use
irfpy.vels.energy.get_default_table_128()
andirfpy.vels.energy.get_default_table_32()
.
- get_tm_level(elsmode=None)[source]¶
Return the TM level in the data.
- Parameters
elsmode – ELS mode to interpret this data. If
None
is specified, the ELS mode is guessed by guess_mode. When guessing failed, default mode (irfpy.vels.mode.MODE_E128
) is used. If you want to explicitly specify the mode, you can use eitherirfpy.vels.mode.MODE_E128
ofirfpy.vels.mode.MODE_E32
.irfpy.vels.mode.MODE_UNKNOWN
will be interpreted as the default, i.e.irfpy.vels.mode.MODE_E128
.- Returns
TM level. Low power supply corresponding to negative values as well as the trick implied in
irfpy.vels.bible.energy.tm2ref()
method.
- guess_mode()[source]¶
Guess the mode.
- Returns
Mode instance
- Return type
An ELS mode constant defined in
irfpy.vels.mode
.
Guess the mode from the HV level. See
irfpy.vels.mode.guess_mode_from_level()
.
- Start time (
- irfpy.vels.scidata.interpret_rawdata(elsdata, elsmode=None)[source]¶
Interpret the data, and return the interpreted data.
The data is interpreted
- Parameters
elsmode – ELS mode to interpret this data. See
ElsCountData.get_tm_level()
for details.elsdata – An object of
ElsCountData
.
- Returns
A tuple. Either a tuple of 1-size
irfpy.vels.ElsCountDataE128
object or a tuple of 4-sizeirfpy.vels.ElsCountDataE32
objects.
- class irfpy.vels.scidata.ElsCountDataE128(t, count, level)[source]¶
Bases:
irfpy.vels.scidata.ElsCountData
ELS count data at a specific time (4-s resolution) of E128 mode.
As the entry of matlab file has not analyzed, this is still under notimplemented
ELS data consists of the following information.
- Start time (
starttime
) The start time of the observation.
datetime.datetime
instance.- Energy spectra (
count
) The energy spectra as (nE, nA) array, where nE is the energy step and nA is the anode size.
- HV levels (
level
) HV levels to calculate the energy more precisely than the prediction.
None
is also allowed.None
may happen at the boundary of the data files.
This class is for E128 mode data.
- guess_mode()[source]¶
Return the mode of the object. It is always
irfpy.vels.mode.MODE_E128
.- Returns
:irfpy.vels.mode.MODE_E128` always
- Start time (
- class irfpy.vels.scidata.ElsCountDataE32(t, count, level)[source]¶
Bases:
irfpy.vels.scidata.ElsCountData
The class is ELS count data for 32 energy step mode.
- guess_mode()[source]¶
Guess the mode.
- Returns
Mode instance
- Return type
An ELS mode constant defined in
irfpy.vels.mode
.
Guess the mode from the HV level. See
irfpy.vels.mode.guess_mode_from_level()
.
- class irfpy.vels.scidata.ElsCountFile(filename)[source]¶
Bases:
object
Class for a single ELS count rate file.
- Parameters
filename – File name of ELS count rate file. ELS count rate file is in matlab format.
Normally this is to reading the file, the instance should be regarded as immutable.
>>> filename = ElsCountFile.get_sample_filename() >>> elsfile = ElsCountFile(filename)
- get_elscountdata(t, level_file=None)[source]¶
Pick the data of specified time
- Parameters
t (
datetime.datetime
) – Time.level_file – It specifies an instance of
ElsCountFile
from which the level data will be read. As default (None), the level data is read from self, however, there may have a case level data is stored different file (normally the file before).
- Returns
The corresponding
ElsCountData
.- Return type
>>> countfile = ElsCountFile(ElsCountFile.get_sample_filename()) >>> els = countfile.get_elscountdata(datetime.datetime(2006, 12, 6, 8, 0, 0)) >>> print(els.starttime) 2006-12-06 07:59:57.845000
- get_leveltime()[source]¶
Return the level time list.
- Returns
Level time list of
datetime.datetime
instance- Return type
list
ofdatetime.datetime
.
>>> elsfile = ElsCountFile(ElsCountFile.get_sample_filename()) >>> timelist = elsfile.get_leveltime() >>> print(len(timelist)) 112 >>> print(timelist[0].strftime('%FT%T')) 2006-12-06T07:00:11 >>> print(timelist[-1].strftime('%FT%T')) 2006-12-06T07:59:41
- get_obstime()[source]¶
Return the observation time list.
- Returns
Observation time list of
datetime.datetime
instance- Return type
list
ofdatetime.datetime
>>> elsfile = ElsCountFile(ElsCountFile.get_sample_filename()) >>> timelist = elsfile.get_obstime() >>> print(len(timelist)) 783 >>> print(timelist[0].strftime('%FT%T')) 2006-12-06T07:00:03 >>> print(timelist[-1].strftime('%FT%T')) 2006-12-06T07:59:57
- get_timerange(start_offset=0, stop_offset=0)[source]¶
Return the time range of the observation.
- Returns
Range of data file time as a list of
datetime.datetime
instances.
[t0 +
start_offset
, t1 +stop_offset
] is returned, where t0 is the start time (the time of the first packet) and t1 is the end time (the time of the last packet). This means that the end time t1 does not agree with the end of the observation time. The end of the observation time is the end time plus data acquisition time (4 sec, typically). Specifyingstop_offset
will compensate this issue.- Parameters
start_offset – Offset in seconds to be added to the start time.
stop_offset – Offset in seconds to be added to the stop time.
>>> elscnt = ElsCountFile(ElsCountFile.get_sample_filename())
>>> print(elscnt.get_timerange()) [datetime.datetime(2006, 12, 6, 7, 0, 3, 612000), datetime.datetime(2006, 12, 6, 7, 59, 57, 845000)] >>> print(elscnt.get_timerange(stop_offset=4)) [datetime.datetime(2006, 12, 6, 7, 0, 3, 612000), datetime.datetime(2006, 12, 6, 8, 0, 1, 845000)]
- class irfpy.vels.scidata.ElsCountFileDB(rootfolder, enable_cache=True)[source]¶
Bases:
object
Class for ELS count data base.
- Parameters
rootfolder – Root folder.
Data base is assumed to have a strucuture like
<rootfolder> -+- 200512 -+- 20051209130000.mat | +- 20051209140000.mat | +- ... | +- 200601 -+- 20060108100000.mat | +- 20060108110000.mat | +- ... | +- ...
The data base is regularly produced in spaghetti, and in this case the
<rootfolder>
is/venus/elsdata/
.For quick search, each file is assumed to contain the data from the exact seconds to exactly one hour. This means that
20060108110000.mat
is assumed contain data between 2006-01-08T11:00:00 and 2006-01-08T12:00:00.Initiate ElsCountFileDB.
- Parameters
rootfolder – The root folder.
enable_cache – Enable cache. ~50% performance up according to
scidata_test2.py
.
- get_filename_fromdb(t)[source]¶
Return the file name registered in the data base.
No clever check will be done as
get_filename()
. Just return the file name registered in the data base.
- get_filename(t, offset=4)[source]¶
Return the filename of the Matlab data file.
- Parameters
t (
datetime.datetime
) – Timeoffset – It is deprecated, and it does not offer anything. From version 4.2.3a6.
If the given time is not in the data base, i.e. no observation considering offset, DataNotInDbError is raised.
- irfpy.vels.scidata.get_defaultdb(enable_cache=True)[source]¶
This is an easy-accessor for
ElsCountFileDB.get_defaultdb()
.
- irfpy.vels.scidata.get_countdata(t)[source]¶
Return the count data as an array of (
datetime
,ElsCountData
instance).Returns count rate data as an array of the real observation time and
ElsCountData
instance. The returned data time, t0, should satisfy t0 <= t where t is the specified time is the specified time. The t0 is the real observation data time that contains the data obtained at t.- Parameters
t (
datetime.datetime
) – Time- Returns
An array of observation time and corresponding
ElsCountData
instance.
If no data found, DataNotInDbError is raised.
- irfpy.vels.scidata.get_count(t)[source]¶
Return the ELS count data at the specified time, t.
- Parameters
t (
datetime.datetime
.) – Time- Returns
An array of the observation time and corresponding numpy array with (128, 16) shape.
Return the ELS count rate date as numpy.array type with (128, 16) shape.
>>> t0 = datetime.datetime(2006, 12, 5, 8) >>> t, els = get_count(t0) >>> print(t) # This may fail if data base changed. 2006-12-05 07:59:59.821000 >>> print(els.shape) # This may fail if data base changed. (128, 16) >>> print(els.max()) # This may fail if data base changed. 25.0
- irfpy.vels.scidata.get_cps(t)[source]¶
Return the ELS count rate data at the time t.
- Parameters
t (
datetime.datetime
.) – Time- Returns
An array of the observation time and corresponding numpy array with (128, 16) shape.
- irfpy.vels.scidata.get_dnf(t, energy_table=None)[source]¶
Return the ELS differential number flux.
- Parameters
t (
datetime.datetime
) – Timeenergy_table – Energy table used for the calculation. Allowed are
None
,"default"
,"defaultE128"
,"defaultE32"
,"data"
, ornumpy.array
with (nE, ) or (nE, nD) shape.
- Returns
List of the observation time t0 (including data on t), energy table, and its DNF.
- Rtypes
(t0, etbl, dnf) where t0 is
datetime.datetime
, etbl isnumpy.array
with (nE, nD) shape in the unit of eV, and dnf isnumpy.array
with (nE, nD) shape in the unit of /eV cm2 sr s.
Energy table is not trivial for ELS, so the function support several ways of using energy table.
energy_table keyword
Table used
None
“default” or “defaultE128”Default table by
irfpy.vels.energy.get_default_table_128()
.“defaultE32”
Default table by
irfpy.vels.energy.get_default_table_32_as_128()
.“data”
Guessed from the data obtained. See
ElsCountData.guess_mode()
numpy.array
with (nE,) shapeUsed the given table itself. No anode dependence (repeated nD times)
numpy.array
with (nE, nD) shapeUsed the given table itself.
- irfpy.vels.scidata.get_def(t, **args)[source]¶
Return the ELS differential energy flux in the unit of eV/eV cm2 sr s.
For details see
get_dnf()
.
- irfpy.vels.scidata.get_def2(t, **args)[source]¶
Return the ELS differential energy flux in the unit of eV/eV cm2 sr s.
See details also in
get_dnf()
.
- irfpy.vels.scidata.get_psd(t, energy_table=None)[source]¶
Return the ELS velocity distribution functions, in the unit of s3/cm6.
For details see
get_dnf()
.
- irfpy.vels.scidata.get_obstime(t0, t1)[source]¶
Get the obseration times (4-s resolution).
- Parameters
t0 (
datetime.datetime
) – Start timet1 (
datetime.datetime
) – Start time
- Returns
List of
datetime.datetime
.
The following tests shows simple samples of using
get_obstime()
. This is based on database on 110704, so tests may be failed according to the change in the database.>>> t0 = datetime.datetime(2006, 12, 5) >>> t1 = datetime.datetime(2006, 12, 6)
>>> t = get_obstime(t0, t1) >>> print(len(t)) # Database change may cause fails of the test. 3619 >>> print(t[0]) # Database change may cause fails of the test. 2006-12-05 05:17:27.936000 >>> print(t[-1]) # Database change may cause fails of the test. 2006-12-05 09:54:25.980000
- irfpy.vels.scidata.get_counts(t0, t1)[source]¶
Return the counts between the given time period.
- Parameters
t0 – Start time.
t1 – End time
- Returns
An array with a shape of (128, 16, N), where N is the number of data (time).
>>> t0 = datetime.datetime(2006, 12, 5, 6, 10) >>> t1 = datetime.datetime(2006, 12, 5, 6, 15) >>> tlist, elsdat = get_counts(t0, t1)
>>> print(len(tlist)) 65
>>> print(elsdat.shape) (128, 16, 65)
>>> print(elsdat.max()) 44.0