Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
Y
yafits
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
Caillat Michel
yafits
Commits
60172e8e
Commit
60172e8e
authored
6 years ago
by
Caillat Michel
Browse files
Options
Downloads
Patches
Plain Diff
Fixed the last (?) bugs
parent
787fd591
Branches
Branches containing commit
No related tags found
No related merge requests found
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
yafitss/DataBlock.py
+73
-32
73 additions, 32 deletions
yafitss/DataBlock.py
yafitss/dataManager_michel_new.py
+86
-57
86 additions, 57 deletions
yafitss/dataManager_michel_new.py
yafitss/serverWsgi.michel.new.py
+37
-23
37 additions, 23 deletions
yafitss/serverWsgi.michel.new.py
with
196 additions
and
112 deletions
yafitss/DataBlock.py
+
73
−
32
View file @
60172e8e
...
...
@@ -24,6 +24,12 @@ import dask.array as da
import
traceback
from
datetime
import
datetime
import
os
from
matplotlib
import
pyplot
as
pp
def
cmap2palette
(
palette_name
):
x
=
pp
.
get_cmap
(
palette_name
)
return
[
tuple
(
map
(
lambda
x
:
int
(
round
(
x
*
255
)),
x
(
i
)[
0
:
3
]))
for
i
in
range
(
x
.
N
)]
class
DataBlock
:
# What is the FITS files root directory
...
...
@@ -32,8 +38,44 @@ class DataBlock:
# What is the PNG files root directory
__PNGFilePrefix
=
""
# What are the palette names
__palette_names
=
[
"
Greys
"
,
"
RdYlBu
"
,
"
hsv
"
,
"
gist_ncar
"
,
"
gist_rainbow
"
,
"
gist_gray
"
,
"
Spectral
"
,
"
jet
"
,
"
plasma
"
,
"
inferno
"
,
"
magma
"
,
"
afmhot
"
,
"
gist_heat
"
]
__palette
=
{
palette_name
:
cmap2palette
(
palette_name
)
for
palette_name
in
__palette_names
}
__default_palette_name
=
"
gist_rainbow
"
# What are the transformation names ?
__transformation_names
=
[
"
minmax
"
,
"
percent98
"
]
__default_transformation_name
=
"
minmax
"
# What are the video mode names ?
__video_mode_names
=
[
"
direct
"
,
"
inverse
"
]
__default_video_mode_name
=
"
direct
"
# What are the rendering capabilities ?
__renderingCapabilities
=
{
"
itts
"
:
__transformation_names
,
"
default_itt_index
"
:
0
,
"
luts
"
:
__palette_names
,
"
default_lut_index
"
:
2
,
"
vmodes
"
:
__video_mode_names
,
"
default_vmode_index
"
:
0
}
#===========================================================================
# Class methods - Setters and getters
@classmethod
def
getPaletteFromName
(
cls
,
name
):
return
DataBlock
.
__palette
[
name
]
if
name
in
DataBlock
.
__palette_names
else
DataBlock
.
__palette
[
DataBlock
.
__default_palette_name
]
@classmethod
def
getDefaultPaletteName
(
cls
):
return
DataBlock
.
__default_palette_name
@classmethod
def
getDefaults
(
cls
):
return
(
DataBlock
.
__default_palette_name
,
DataBlock
.
__default_transformation_name
,
DataBlock
.
__default_video_mode_name
)
@classmethod
def
setFITSFilePrefix
(
cls
,
FITSFilePrefix
):
...
...
@@ -51,6 +93,10 @@ class DataBlock:
def
getPNGFilePrefix
(
cls
):
return
DataBlock
.
__PNGFilePrefix
@classmethod
def
getRenderingCapabilities
(
cls
):
return
DataBlock
.
__renderingCapabilities
#===========================================================================
# CTOR
#
...
...
@@ -68,14 +114,16 @@ class DataBlock:
self
.
__cdelt
=
None
self
.
__timestamp
=
None
# the last time a method was called on self
self
.
__logger
.
debug
(
"
A DataBlock has been just built
"
)
#===========================================================================
#
# Public setters
#
# Set a timestamp on self
def
setTimestamp
(
self
,
timestamp
):
self
.
__timestamp
=
timestamp
def
setTimestamp
(
self
):
self
.
__timestamp
=
datetime
.
now
()
#
# Given a FITS file path :
...
...
@@ -205,15 +253,15 @@ class DataBlock:
return
result
def
__getSumOverSliceRectArea_0
(
self
,
sliceIndex
,
RAPix0
=
None
,
RAPix1
=
None
,
DECPix0
=
None
,
DECPix1
=
None
):
self
.
__logger
.
debug
(
"
__getSumO
n
SliceRectArea_0 : entering
"
)
self
.
__logger
.
debug
(
"
__getSumO
ver
SliceRectArea_0 : entering
"
)
with_dask
=
True
if
with_dask
:
x
=
(
dask
.
array
.
nansum
(
self
.
__data
[
sliceIndex
,
DECPix0
:
DECPix1
,
RAPix0
:
RAPix1
])
/
self
.
__convert
*
self
.
__cdelt
).
compute
().
tolist
()
else
:
x
=
np
.
nansum
(
self
.
__data
[
sliceIndex
,
DECPix0
:
DECPix1
,
RAPix0
:
RAPix1
])
/
self
.
__convert
*
self
.
__cdelt
self
.
__logger
.
debug
(
"
__getSumO
n
SliceRectArea__0 : exiting
"
)
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
x
}
self
.
__logger
.
debug
(
"
__getSumO
ver
SliceRectArea__0 : exiting
"
)
return
x
def
__getAverage_0
(
self
,
step
,
startZ
=
None
,
endZ
=
None
,
startY
=
None
,
endY
=
None
,
startX
=
None
,
endX
=
None
):
self
.
__logger
.
debug
(
"
__getAverage_0 : entering
"
)
...
...
@@ -279,19 +327,19 @@ class DataBlock:
def
__getPercentile
(
self
,
a
,
percent
):
return
np
.
nanpercentile
(
a
,
percent
)
def
__convertOneSlice2PNG
(
self
,
PNGPath
,
sliceIndex
,
sliceData
,
transformation_name
=
__default_transformation_name
,
palette_name
=
__default_palette_name
,
video_mode_name
=
__default_
video_mode_name
):
def
__convertOneSlice2PNG
(
self
,
PNGPath
,
sliceIndex
,
sliceData
,
transformation_name
,
palette_name
,
video_mode_name
):
self
.
__logger
.
debug
(
"
__convertOneSlice2PNG : entering
"
)
self
.
__logger
.
debug
(
"
__convertOneSlice2PNG : exiting
"
)
return
self
.
__convertOneSlice2PNG_0
(
PNGPath
,
sliceIndex
,
sliceData
,
transformation_name
,
palette_name
,
video_mode_name
)
def
__convertOneSlice2PNG_0
(
self
,
PNGPath
,
sliceData
,
transformation_name
=
__default_transformation_name
,
palette_name
=
__default_palette_name
,
video_mode_name
=
__default_
video_mode_name
):
def
__convertOneSlice2PNG_0
(
self
,
PNGPath
,
sliceData
,
transformation_name
,
palette_name
,
video_mode_name
):
self
.
__logger
.
debug
(
"
__convertOneSlice2PNG_0 : entering
"
)
img_f
=
np
.
zeros
((
sliceData
.
shape
[
1
],
sliceData
.
shape
[
0
]),
dtype
=
np
.
float32
)
img_i
=
np
.
zeros
((
sliceData
.
shape
[
1
],
sliceData
.
shape
[
0
]),
dtype
=
np
.
uint8
)
data_steps
=
{}
palette
=
getPaletteFromName
(
palette_name
)
palette
=
DataBlock
.
getPaletteFromName
(
palette_name
)
N
=
len
(
palette
)
if
transformation_name
==
"
percent98
"
:
self
.
__logger
.
debug
(
"
A
'
%s
'
transformation will be applied
"
%
transformation_name
)
...
...
@@ -365,7 +413,7 @@ class DataBlock:
self
.
__logger
.
debug
(
"
__convertOneSlice2PNG_0 : exiting
"
)
return
data_steps
def
__convertSummedSliceRange2PNG
(
self
,
sliceIndex0
,
sliceIndex1
,
sliceData
,
transformation_name
=
__default_transformation_name
,
palette_name
=
__default_palette_name
,
video_mode_name
=
__default_
video_mode_name
):
def
__convertSummedSliceRange2PNG
(
self
,
sliceIndex0
,
sliceIndex1
,
sliceData
,
transformation_name
,
palette_name
,
video_mode_name
):
self
.
__logger
.
debug
(
"
__convertSummedSliceRange2PNG : entering
"
)
PNGPath
=
"
%s/%d-%d.%s.%s.%s.png
"
%
(
self
.
__PNGDir
,
sliceIndex0
,
sliceIndex1
,
transformation_name
,
palette_name
,
video_mode_name
)
...
...
@@ -486,22 +534,16 @@ class DataBlock:
# Public getters and accessors.
#
def
getTimestamp
(
self
):
return
self
.
timestamp
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
self
.
__
timestamp
}
def
getHeader
(
self
):
return
self
.
__header
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
json
.
dumps
(
dict
(
self
.
__header
))}
def
getDimensions
(
self
):
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
self
.
__data
.
shape
}
def
getSlice
(
self
,
sliceNumb
,
step
,
relFITSFilePath
):
def
getSlice
(
self
,
sliceNumb
,
step
):
self
.
__logger
.
debug
(
"
getSlice : entering
"
)
try
:
sliceNumb
=
int
(
sliceNumb
)
except
TypeError
:
sliceNumb
=
0
self
.
__logger
.
debug
(
"
Getting slice: %d of %s with shape %r
"
%
(
sliceNumb
,
self
.
__data
.
shape
))
numDimensions
=
len
(
self
.
__data
.
shape
)
...
...
@@ -514,12 +556,8 @@ class DataBlock:
result
=
self
.
__data
[
sliceNumb
,
0
:
self
.
__data
.
shape
[
1
]:
step
,
0
:
self
.
__data
.
shape
[
2
]:
step
]
else
:
self
.
__logger
.
debug
(
"
Can
'
t process data with such a shape : %r
"
%
self
.
__data
.
shape
);
# if res :
# self.sliceStats[sliceNumb] = {"min": np.nanmin(res), "max": np.nanmax(res)}
result
[
np
.
isnan
(
res
)]
=
None
self
.
__logger
.
debug
(
"
getSlice : exiting
"
)
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
result
.
tolist
()}
def
getFreq
(
self
,
x
=
None
,
y
=
None
,
startZ
=
None
,
endZ
=
None
):
...
...
@@ -557,8 +595,7 @@ class DataBlock:
return
result
def
getAverageSpectrum
(
self
,
startY
=
None
,
endY
=
None
,
startX
=
None
,
endX
=
None
,
retFITS
=
False
):
self
.
__logger
.
debug
(
"
Getting frequency average.
"
)
self
.
__logger
.
debug
(
"
getAverageSpectrum : entering
"
)
startZ
=
0
endZ
=
self
.
__data
.
shape
[
0
]
if
startX
==
None
:
...
...
@@ -580,8 +617,9 @@ class DataBlock:
if
with_dask
:
averageSpectrum
=
(
dask
.
array
.
nansum
(
self
.
__data
[:,
startY
:
endY
,
startX
:
endX
],
(
1
,
2
))
/
self
.
__convert
*
self
.
__cdelt
).
compute
().
tolist
()
else
:
averageSpectrum
=
np
.
nansum
(
self
.
__data
[:,
startY
:
endY
,
startX
:
endX
],
(
1
,
2
))
/
self
.
__convert
*
self
.
__cdelt
averageSpectrum
=
np
.
nansum
(
self
.
__data
[:,
startY
:
endY
,
startX
:
endX
],
(
1
,
2
))
/
self
.
__convert
*
self
.
__cdel
self
.
__logger
.
debug
(
f
"
Returning an averageSpectrum of
{
len
(
averageSpectrum
)
}
values.
"
)
self
.
__logger
.
debug
(
averageSpectrum
)
if
retFITS
:
crds
=
self
.
__getFreqsAtiRAiDEC
(
startX
,
startY
)
averageSpectrumFits
=
self
.
__createFITSSpectrumFromData
(
crds
,
self
.
__header
[
"
CUNIT3
"
],
averageSpectrum
,
"
Jy
"
)
...
...
@@ -589,14 +627,17 @@ class DataBlock:
else
:
result
=
{
"
averageSpectrum
"
:
averageSpectrum
,
"
averageSpectrumFits
"
:
None
}
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
result
}
#.tolist()}
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
result
}
self
.
__logger
.
debug
(
f
"
***
{
result
}
"
)
self
.
__logger
.
debug
(
"
getAverageSpectrum : exiting
"
)
return
result
def
getSumOverSliceRectArea
(
self
,
sliceIndex
,
RAPix0
=
None
,
RAPix1
=
None
,
DECPix0
=
None
,
DECPix1
=
None
):
self
.
__logger
.
debug
(
"
getSumOnSliceRectArea : entering
"
)
if
(
len
(
self
.
__data
.
shape
)
==
2
and
sliceIndex
>=
1
)
or
(
len
(
self
.
__data
.
shape
)
==
3
and
sliceIndex
>=
self
.
__data
.
shape
[
0
]):
result
=
{
"
status
"
:
False
,
"
message
"
:
"
Invalid slice index
'
%d
'
.
"
%
(
sliceIndex
),
"
result
"
:
None
}
else
:
result
=
self
.
__getSumOverSliceRectArea_0
(
sliceIndex
,
RAPix0
,
RAPix1
,
DECPix0
,
DECPix1
)
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
self
.
__getSumOverSliceRectArea_0
(
sliceIndex
,
RAPix0
,
RAPix1
,
DECPix0
,
DECPix1
)
}
self
.
__logger
.
debug
(
"
getSumOnSliceRectArea : exiting
"
)
return
result
...
...
@@ -610,8 +651,8 @@ class DataBlock:
def
getOneSliceAsPNG
(
self
,
sliceIndex
,
transformation_name
,
palette_name
,
video_mode_name
):
self
.
__logger
.
debug
(
"
getOneSliceAsPNG : entering.
"
)
self
.
__logger
.
debug
(
"
Video mode name = %s
"
%
video_mode_name
)
self
.
__logger
.
debug
(
"
sliceIndex = %r
, relFITSFilePath = %r
"
%
(
sliceIndex
,
relFITSFilePath
))
relPNGFileDir
=
(
'
.
'
).
join
(
relFITSFilePath
.
split
(
'
.
'
)[:
-
1
])
self
.
__logger
.
debug
(
"
sliceIndex = %r
"
%
(
sliceIndex
))
relPNGFileDir
=
(
'
.
'
).
join
(
self
.
__
relFITSFilePath
.
split
(
'
.
'
)[:
-
1
])
absPNGFileDir
=
DataBlock
.
getPNGFilePrefix
()
+
"
/
"
+
relPNGFileDir
transformation_name
=
self
.
__getForcedTransformationName
(
transformation_name
)
...
...
@@ -720,7 +761,7 @@ class DataBlock:
squaredData
=
self
.
__squareSliceData
(
summedSliceRangeData
)
data_steps
=
self
.
__convertSummedSliceRange2PNG
(
sliceIndex0
,
sliceIndex1
,
squaredData
,
transformation_name
,
palette_name
,
video_mode_name
)
h
=
self
.
__header
[
self
.
__relFITSFilePath
]
h
=
self
.
__header
if
"
CDELT1
"
in
h
and
"
CDELT2
"
in
h
:
x
=
{
"
BITPIX
"
:
h
[
"
BITPIX
"
],
"
NAXIS1
"
:
squaredData
.
shape
[
0
],
...
...
@@ -830,7 +871,7 @@ class DataBlock:
result
=
[]
for
i
in
range
(
start
,
end
,
step
):
self
.
__logger
.
debug
(
"
i: %d
"
%
i
)
result
.
append
(
self
.
degToHMSDMS
(
0
,
i
,
relFITSFilePath
).
split
(
"
"
)[
1
])
result
.
append
(
self
.
degToHMSDMS
(
0
,
i
).
split
(
"
"
)[
1
])
self
.
__logger
.
debug
(
"
rangeToDMS : exiting
"
)
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
result
}
#
...
...
This diff is collapsed.
Click to expand it.
yafitss/dataManager_michel_new.py
+
86
−
57
View file @
60172e8e
...
...
@@ -24,10 +24,10 @@ import dask.array as da
import
traceback
import
DataBlock
from
DataBlock
import
DataBlock
mpl
.
use
(
'
Agg
'
)
# to avoid problem when DISPLAY isn't defined.
from
matplotlib
import
pyplot
as
pp
#
from matplotlib import pyplot as pp
DataRoot
=
"
dataroot
"
FITSFilePrefix
=
DataRoot
+
'
/FITS/
'
...
...
@@ -44,42 +44,40 @@ DataBlock.setFITSFilePrefix(FITSFilePrefix)
DataBlock
.
setPNGFilePrefix
(
PNGFilePrefix
)
def
__cmap2palette
(
name
):
x
=
pp
.
get_cmap
(
palette_name
)
return
[
tuple
(
map
(
lambda
x
:
int
(
round
(
x
*
255
)),
x
(
i
)[
0
:
3
]))
for
i
in
range
(
x
.
N
)]
__palette_names
=
[
"
Greys
"
,
"
RdYlBu
"
,
"
hsv
"
,
"
gist_ncar
"
,
"
gist_rainbow
"
,
"
gist_gray
"
,
"
Spectral
"
,
"
jet
"
,
"
plasma
"
,
"
inferno
"
,
"
magma
"
,
"
afmhot
"
,
"
gist_heat
"
]
__palette
=
dict
()
for
palette_name
in
__palette_names
:
__palette
[
palette_name
]
=
__cmap2palette
(
palette_name
)
__default_palette_name
=
"
Greys
"
def
getPaletteFromName
(
name
):
return
__palette
[
name
]
if
name
in
__palette_names
else
__palette
[
__default_palette_name
]
__transformation_names
=
[
"
minmax
"
,
"
percent98
"
]
__video_mode_names
=
[
"
direct
"
,
"
inverse
"
]
def
getRenderingCapabilities
():
return
{
"
itts
"
:
__transformation_names
,
"
default_itt_index
"
:
0
,
"
luts
"
:
__palette_names
,
"
default_lut_index
"
:
2
,
"
vmodes
"
:
__video_mode_names
,
"
default_vmode_index
"
:
0
}
#
def __cmap2palette (name):
#
x = pp.get_cmap(palette_name)
#
return [tuple(map(lambda x: int(round(x*255)), x(i)[0:3])) for i in range(x.N)]
#
#
__palette_names = ["Greys", "RdYlBu", "hsv", "gist_ncar", "gist_rainbow", "gist_gray", "Spectral", "jet", "plasma", "inferno", "magma", "afmhot", "gist_heat"]
#
__palette = dict()
#
for palette_name in __palette_names:
#
__palette[palette_name] = __cmap2palette(palette_name)
#
#
__default_palette_name = "Greys"
#
#
def getPaletteFromName (name ):
#
return __palette[name] if name in __palette_names else __palette[__default_palette_name]
#
#
__transformation_names = ["minmax", "percent98"]
#
#
__video_mode_names = ["direct", "inverse"]
#
#
def getRenderingCapabilities():
#
return {
#
"itts" : __transformation_names,
#
"default_itt_index" : 0,
#
"luts" : __palette_names,
#
"default_lut_index" : 2,
#
"vmodes" : __video_mode_names,
#
"default_vmode_index" : 0
#
}
#
#
# An implementation of the class used in the serverWsgi-ish server.
#
class
DataManagerImpl
:
__default_palette_name
=
"
gist_rainbow
"
__default_transformation_name
=
"
minmax
"
__default_video_mode_name
=
"
direct
"
__default_palette_name
,
__default_transformation_name
,
__default_video_mode_name
=
DataBlock
.
getDefaults
()
#===========================================================================
# Private methods
...
...
@@ -89,11 +87,15 @@ class DataManagerImpl :
# memory. If yes update the corresponding DataBlock's timestamp.
def
__checkPresence
(
self
,
relFITSFilePath
):
self
.
__logger
.
debug
(
"
__checkPresence : entering
"
)
result
=
{
"
status
"
:
True
,
"
message
"
:
''
,
"
result
"
:
None
}
if
relFITSFilePath
in
self
.
__dataBlocks
:
self
.
__dataBlocks
[
relFITSFilePath
].
setTimestamp
(
datetime
.
now
())
return
{
status
:
True
,
message
:
''
,
result
:
''
}
self
.
__dataBlocks
[
relFITSFilePath
].
setTimestamp
()
else
:
return
{
status
:
True
,
message
:
'
FITS file
"
{relFITSFilePath}
"
is not present in memory. Call
"
setData
"
first
'
}
result
=
{
"
status
"
:
False
,
"
message
"
:
f
'
FITS file
"
{
relFITSFilePath
}
"
is not present in memory. Call
"
setData
"
first
'
}
self
.
__logger
.
debug
(
"
__checkPresence : exiting
"
)
return
result
def
__convert_size
(
self
,
size_bytes
):
if
size_bytes
==
0
:
...
...
@@ -140,7 +142,7 @@ class DataManagerImpl :
# Return the keys of the dataBlocks dictionary as if it was ordered by timestamp ( asc or desc)
#
def
__getKeysOrderedByTimestamp
(
self
,
reverse
=
True
):
return
[
x
[
0
]
for
x
in
sorted
({
x
:
self
.
__dataBlocks
[
x
][
"
timestamp
"
]
for
x
in
self
.
__dataBlocks
.
keys
()}.
items
(),
key
=
lambda
kv
[
1
],
reverse
)]
return
[
x
[
0
]
for
x
in
sorted
({
x
:
self
.
__dataBlocks
[
x
][
"
timestamp
"
]
for
x
in
self
.
__dataBlocks
.
keys
()}.
items
(),
key
=
lambda
kv
:
kv
[
1
],
reverse
=
reverse
)]
#===========================================================================
# Public methods.
...
...
@@ -152,6 +154,7 @@ class DataManagerImpl :
self
.
__dataBlocks
=
dict
()
self
.
__logger
=
logger
self
.
__logger
.
debug
(
f
"
An instance of DataManagerImpl is created
"
)
#===========================================================================
# THE data selector.
...
...
@@ -161,13 +164,14 @@ class DataManagerImpl :
#
def
setData
(
self
,
relFITSFilePath
):
self
.
__logger
.
debug
(
"
setData : entering
"
)
absFITSFilePath
=
DataBlock
.
getFITSFilePrefix
()
+
relFITSFilePath
self
.
__logger
.
debug
(
f
"
relFITSFilePath =
{
relFITSFilePath
}
"
)
result
=
None
if
relFITSFilePath
in
self
.
__dataBlock
:
if
relFITSFilePath
in
self
.
__dataBlock
s
:
self
.
__logger
.
debug
(
"
File already opened: %s
"
%
relFITSFilePath
)
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
json
.
dumps
(
dict
(
self
.
__dataBlock
[
relFITSFilePath
].
header
()))}
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
json
.
dumps
(
dict
(
self
.
__dataBlock
s
[
relFITSFilePath
].
header
()))}
else
:
db
=
DataBlock
(
logger
)
self
.
__logger
.
debug
(
f
"
loading
{
relFITSFilePath
}
"
)
db
=
DataBlock
(
self
.
__logger
)
result
=
db
.
setData
(
relFITSFilePath
)
if
(
result
[
"
status
"
]):
self
.
__dataBlocks
[
relFITSFilePath
]
=
db
...
...
@@ -188,13 +192,45 @@ class DataManagerImpl :
#===========================================================================
# Getters on a DataBlock identified by its relFITSFilePath ( i.e. the dictionary keys in __dataBlocks )
#
def
getHeader
(
self
,
relFITSFilePath
):
self
.
__logger
.
debug
(
"
getHeader : entering
"
)
def
getDimensions
(
self
,
relFITSFilePath
,
sessionID
):
self
.
__logger
.
debug
(
"
getDimensions : entering
"
);
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
getDimensions
()
self
.
__logger
.
debug
(
"
getDimensions : exiting
"
);
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
result
}
def
getSlice
(
self
,
sliceNumb
,
step
,
relFITSFilePath
):
self
.
__logger
.
debug
(
"
getSlice : entering
"
)
if
result
[
"
status
"
]:
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
getSlice
(
sliceNumb
,
step
)
self
.
__logger
.
debug
(
"
getSlice : entering
"
)
return
result
def
getFreq
(
self
,
relFITSFilePath
,
x
=
None
,
y
=
None
,
startZ
=
None
,
endZ
=
None
):
# y x ou x y
self
.
__logger
.
debug
(
"
getFreq : entering
"
)
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
json
.
dumps
(
dict
(
self
.
__dataBlocks
[
relFITSFilePath
].
getHeader
()))}
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
getFreq
(
x
,
y
,
startZ
,
endZ
)
self
.
__logger
.
debug
(
"
getFreq : exiting
"
)
return
result
def
getAverageSpectrum
(
self
,
relFITSFilePath
,
startY
=
None
,
endY
=
None
,
startX
=
None
,
endX
=
None
,
retFITS
=
False
):
self
.
__logger
.
debug
(
"
getAverageSpectrum : entering
"
)
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
getAverageSpectrum
(
startY
,
endY
,
startX
,
endX
)
self
.
__logger
.
debug
(
f
"
**
{
result
}
"
)
self
.
__logger
.
debug
(
"
getAverageSpectrum : exiting
"
)
return
result
def
getHeader
(
self
,
relFITSFilePath
):
self
.
__logger
.
debug
(
"
getHeader : entering
"
)
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
getHeader
()
self
.
__logger
.
debug
(
"
getHeader : exiting
"
)
self
.
__logger
.
debug
(
"
About to return %r
"
%
result
)
return
result
...
...
@@ -240,18 +276,11 @@ class DataManagerImpl :
self
.
__logger
.
debug
(
"
getPixelValueAtiFreqiRAiDEC : exiting
"
)
return
result
def
getAverageSpectrum
(
self
,
relFITSFilePath
,
startY
=
None
,
endY
=
None
,
startX
=
None
,
endX
=
None
,
retFITS
=
False
):
self
.
__logger
.
debug
(
"
Getting frequency average.
"
)
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
self
.
__data
[
relFITSFilePath
].
getAverageSpectrum
(
startY
,
endY
,
startX
,
sliceIndex
,
retFITS
)
return
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
result
}
def
getSumOverSliceRectArea
(
self
,
relFITSFilePath
,
sliceIndex
,
RAPix0
=
None
,
RAPix1
=
None
,
DECPix0
=
None
,
DECPix1
=
None
):
self
.
__logger
.
debug
(
"
getSumOnSliceRectArea : entering
"
)
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
get
PixelValueAtiFreqiRAiDEC
(
iFreq
,
iRA
,
iDEC
)
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
get
SumOverSliceRectArea
(
sliceIndex
,
RAPix0
,
RAPix1
,
DECPix0
,
DECPix1
)
self
.
__logger
.
debug
(
"
getSumOnSliceRectArea : exiting
"
)
return
result
...
...
@@ -268,7 +297,7 @@ class DataManagerImpl :
self
.
__logger
.
debug
(
"
sliceIndex = %r, relFITSFilePath = %r
"
%
(
sliceIndex
,
relFITSFilePath
))
result
=
self
.
__checkPresence
(
relFITSFilePath
)
if
result
[
"
status
"
]:
result
=
__dataBlocks
[
relFITSFilePath
].
getOneSliceAsPNG
(
sliceIndex
,
transformation_name
,
palette_name
,
video_mode_name
)
result
=
self
.
__dataBlocks
[
relFITSFilePath
].
getOneSliceAsPNG
(
sliceIndex
,
transformation_name
,
palette_name
,
video_mode_name
)
self
.
__logger
.
debug
(
"
getOneSliceAsPNG : exiting.
"
)
return
result
...
...
@@ -319,7 +348,7 @@ class DataManagerImpl :
#
def
renderingCapabilities
(
self
)
:
self
.
__logger
.
debug
(
"
renderingCapabilities: entering
"
)
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
getRenderingCapabilities
()}
result
=
{
"
status
"
:
True
,
"
message
"
:
""
,
"
result
"
:
DataBlock
.
getRenderingCapabilities
()}
self
.
__logger
.
debug
(
"
renderingCapabilities: exiting
"
)
return
result
...
...
@@ -330,8 +359,8 @@ class DataManagerImpl :
keys
=
self
.
__getKeysOrderedByTimestamp
(
reverse
)
result
=
[
{
"
path
"
:
key
,
"
lastAccess
"
:
datetime
.
frometimestamp
(
self
.
__dataBlocks
[
key
].
getTimestamp
()).
strftime
(
"
%m/%d/%Y, %H:%M:%S
"
)
}
,
"
size
"
:
self
.
__convert_size
(
os
.
path
.
getsize
(
FITSFilePrefix
+
"
/
"
+
key
))
"
lastAccess
"
:
datetime
.
frometimestamp
(
self
.
__dataBlocks
[
key
].
getTimestamp
()).
strftime
(
"
%m/%d/%Y, %H:%M:%S
"
),
"
size
"
:
self
.
__convert_size
(
os
.
path
.
getsize
(
FITSFilePrefix
+
"
/
"
+
key
))
}
]
return
{
"
status
"
:
True
,
message
:
""
,
"
result
"
:
result
}
...
...
This diff is collapsed.
Click to expand it.
yafitss/serverWsgi.michel.new.py
+
37
−
23
View file @
60172e8e
...
...
@@ -25,7 +25,7 @@ baseUrl = "/artemix"
logger
=
None
dm
=
None
import
dataManager_michel
as
dataManager
import
dataManager_michel
_new
as
dataManager
#####################################################################
# #
...
...
@@ -139,7 +139,7 @@ def degToHMSDMS():
dec
=
getFloatValue
(
request
.
GET
[
'
dec
'
])
sessionID
=
request
.
GET
[
'
sessionID
'
]
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
degToHMSDMS
(
ra
,
dec
,
fileName
,
sessionID
))
return
json
.
dumps
(
dm
.
degToHMSDMS
(
ra
,
dec
,
fileName
))
"""
...
...
@@ -158,7 +158,7 @@ def rangeToHMS():
step
=
getIntValue
(
request
.
GET
[
'
step
'
])
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
rangeToHMS
(
start
,
end
,
step
,
fileName
,
sessionID
))
return
json
.
dumps
(
dm
.
rangeToHMS
(
start
,
end
,
step
,
fileName
))
"""
Given a FITS filename and an interval of positive integers values and
...
...
@@ -176,7 +176,7 @@ def rangeToDMS():
step
=
getIntValue
(
request
.
GET
[
'
step
'
])
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
rangeToDMS
(
start
,
end
,
step
,
fileName
,
sessionID
))
return
json
.
dumps
(
dm
.
rangeToDMS
(
start
,
end
,
step
,
fileName
))
"""
Given fileName read corresponding the FITS file in memory
...
...
@@ -185,10 +185,13 @@ def rangeToDMS():
@route
(
baseUrl
+
'
/setData
'
,
name
=
'
setData
'
,
method
=
'
GET
'
)
@enable_cors
def
setData
():
fileName
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
logger
.
debug
(
"
setData : entering
"
)
relFITSFilePath
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
sessionID
=
request
.
GET
[
'
sessionID
'
]
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
setData
(
fileName
,
sessionID
))
result
=
dm
.
setData
(
relFITSFilePath
)
logger
.
debug
(
"
setData : exiting
"
)
return
json
.
dumps
(
result
)
"""
Given filename return the shape of the data cube contained
...
...
@@ -202,7 +205,7 @@ def getDimensions():
sessionID
=
request
.
GET
[
'
sessionID
'
]
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
getDimensions
(
fileName
,
sessionID
))
return
json
.
dumps
(
dm
.
getDimensions
(
fileName
))
"""
Given a multidimensional array l
...
...
@@ -246,13 +249,16 @@ def getPixelValueAtiFreqiRAiDEC():
@route
(
baseUrl
+
'
/getSlice
'
,
name
=
'
getSlice
'
,
method
=
'
GET
'
)
@enable_cors
def
getSlice
():
logger
.
debug
(
"
getSlice - wrapper : entering
"
)
fileName
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
relFITSFilePath
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
sessionID
=
request
.
GET
[
'
sessionID
'
]
sliceNumb
=
int
(
request
.
GET
[
'
sliceNumb
'
])
step
=
int
(
request
.
GET
[
'
step
'
])
result
=
dm
.
getSlice
(
sliceNumb
,
step
,
fileName
,
sessionID
)
result
=
dm
.
getSlice
(
sliceNumb
,
step
,
relFITSFilePath
)
response
.
content_type
=
"
application/json; charset=utf-8
"
logger
.
debug
(
"
getSlice - wrapper : exiting
"
)
return
json
.
dumps
(
result
)
"""
...
...
@@ -263,16 +269,19 @@ def getSlice():
@route
(
baseUrl
+
'
/getFreq
'
,
name
=
'
getFreq
'
,
method
=
'
GET
'
)
@enable_cors
def
getFreq
():
logger
.
debug
(
"
getFreq - wrapper : entering
"
)
fileName
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
relFITSFilePath
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
sessionID
=
request
.
GET
[
'
sessionID
'
]
x
=
getIntValue
(
request
.
GET
[
'
x
'
])
y
=
getIntValue
(
request
.
GET
[
'
y
'
])
startZ
=
getIntValue
(
request
.
GET
[
'
startZ
'
])
endZ
=
getIntValue
(
request
.
GET
[
'
endZ
'
])
response
.
content_type
=
"
application/json; charset=utf-8
"
result
=
json
.
dumps
(
dm
.
getFreq
(
relFITSFilePath
,
x
,
y
,
startZ
,
endZ
))
logger
.
debug
(
"
getFreq - wrapper : exiting
"
)
return
json
.
dumps
(
dm
.
getFreq
(
fileName
,
sessionID
,
x
,
y
,
startZ
,
endZ
))
return
result
"""
Given two pairs -- startX,endX and startY,endY -- defining a rectangular area the RAxDEC plane
...
...
@@ -291,6 +300,7 @@ def getFreq():
@route
(
baseUrl
+
'
/getAverageSpectrum
'
,
name
=
'
getAverageSpectrum
'
,
method
=
'
GET
'
)
@enable_cors
def
getAverageSpectrum
():
logger
.
debug
(
"
getAverageSpectrum - wrapper : entering
"
)
relFITSFilePath
=
rebuildFilename
(
request
.
GET
[
'
relFITSFilePath
'
])
sessionID
=
request
.
GET
[
'
sessionID
'
]
...
...
@@ -301,8 +311,10 @@ def getAverageSpectrum():
endX
=
getIntValue
(
request
.
GET
[
'
endX
'
])
retFITS
=
getBoolValue
(
request
.
GET
[
'
retFITS
'
])
response
.
content_type
=
"
application/json; charset=utf-8
"
result
=
json
.
dumps
(
dm
.
getAverageSpectrum
(
relFITSFilePath
,
startY
,
endY
,
startX
,
endX
,
retFITS
))
logger
.
debug
(
f
"
*
{
result
}
"
)
logger
.
debug
(
"
getAverageSpectrum - wrapper : exiting
"
)
result
=
json
.
dumps
(
dm
.
getAverageSpectrum
(
relFITSFilePath
,
sessionID
,
startY
,
endY
,
startX
,
endX
,
retFITS
))
return
result
"""
...
...
@@ -324,7 +336,7 @@ def getSumOverSliceRectArea():
sliceIndex
=
getIntValue
(
request
.
GET
[
'
sliceIndex
'
])
response
.
content_type
=
"
application/json; charset=utf-8
"
result
=
json
.
dumps
(
dm
.
getSumOverSliceRectArea
(
relFITSFilePath
,
sessionID
,
sliceIndex
,
RAPix0
,
RAPix1
,
DECPix0
,
DECPix1
))
result
=
json
.
dumps
(
dm
.
getSumOverSliceRectArea
(
relFITSFilePath
,
sliceIndex
,
RAPix0
,
RAPix1
,
DECPix0
,
DECPix1
))
return
result
"""
...
...
@@ -346,7 +358,7 @@ def getAverage():
endX
=
getIntValue
(
request
.
GET
[
'
endX
'
])
startZ
=
getIntValue
(
request
.
GET
[
'
startZ
'
])
endZ
=
getIntValue
(
request
.
GET
[
'
endZ
'
])
result
=
dm
.
getAverage
(
fileName
,
sessionID
,
step
,
startZ
,
endZ
,
startY
,
endY
,
startX
,
endX
)
result
=
dm
.
getAverage
(
fileName
,
step
,
startZ
,
endZ
,
startY
,
endY
,
startX
,
endX
)
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
result
)
...
...
@@ -375,11 +387,15 @@ def createFits():
@route
(
baseUrl
+
'
/getHeader
'
,
name
=
'
getHeader
'
,
method
=
'
GET
'
)
@enable_cors
def
getHeader
():
fileName
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
global
logger
global
dm
logger
.
debug
(
"
getHeader : entering
"
)
relFITSFilePath
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
logger
.
debug
(
f
"
relFITSFilePath =
{
relFITSFilePath
}
"
)
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
getHeader
(
fileName
))
result
=
json
.
dumps
(
dm
.
getHeader
(
relFITSFilePath
))
logger
.
debug
(
"
getHeader : exiting
"
)
return
result
"""
Given fileName
...
...
@@ -390,11 +406,9 @@ def getHeader():
@enable_cors
def
RADECRangeInDegrees
():
fileName
=
rebuildFilename
(
request
.
GET
[
'
fileName
'
])
sessionID
=
request
.
GET
[
'
sessionID
'
]
response
.
content_type
=
"
application/json; charset=utf-8
"
return
json
.
dumps
(
dm
.
RADECRangeInDegrees
(
fileName
,
sessionID
))
return
json
.
dumps
(
dm
.
RADECRangeInDegrees
(
fileName
))
"""
Given relFITSFilePath and sliceIndex
...
...
@@ -421,7 +435,7 @@ def getOneSliceAsPNG():
lutName
=
body
[
'
lutName
'
]
vmName
=
body
[
'
vmName
'
]
sessionID
=
getIntValue
(
body
[
'
sessionID
'
])
ret
=
dm
.
getOneSliceAsPNG
(
sessionID
,
sliceIndex
,
relFITSFilePath
,
ittName
,
lutName
,
vmName
)
ret
=
dm
.
getOneSliceAsPNG
(
sliceIndex
,
relFITSFilePath
,
ittName
,
lutName
,
vmName
)
except
Exception
as
e
:
exc_type
,
exc_value
,
exc_traceback
=
sys
.
exc_info
()
traceback
.
print_exc
()
...
...
@@ -454,7 +468,7 @@ def getSummedSliceRangeAsPNG():
lutName
=
body
[
'
lutName
'
]
vmName
=
body
[
'
vmName
'
]
sessionID
=
getIntValue
(
body
[
'
sessionID
'
])
ret
=
dm
.
getSummedSliceRangeAsPNG
(
sessionID
,
sliceIndex0
,
sliceIndex1
,
relFITSFilePath
,
ittName
,
lutName
,
vmName
);
ret
=
dm
.
getSummedSliceRangeAsPNG
(
sliceIndex0
,
sliceIndex1
,
relFITSFilePath
,
ittName
,
lutName
,
vmName
);
except
Exception
as
e
:
exc_type
,
exc_value
,
exc_traceback
=
sys
.
exc_info
()
message
=
"
%s ! %s
"
%
(
type
(
e
),
""
.
join
(
traceback
.
format_list
(
traceback
.
extract_tb
(
exc_traceback
))))
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment