Skip to content

Commit

Permalink
Revert "Merge branch 'unstable' of /data/proj/SAF/GIT/mpop into unsta…
Browse files Browse the repository at this point in the history
…ble"

This reverts commit 4580927, reversing
changes made to 10ae683.
mraspaud committed Dec 6, 2011
1 parent b828432 commit 0ad9848
Showing 22 changed files with 412 additions and 2,325 deletions.
5 changes: 2 additions & 3 deletions etc/mpop.cfg.template
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
[projector]

area_file=areas.def
area_directory=
projections_directory=/var/tmp

[composites]
module=mpop.smhi_composites

[plugins]
dir=plugins, satin, satout
module=mpop.smhi_composites
284 changes: 0 additions & 284 deletions mpop/imageo/palettes.py
Original file line number Diff line number Diff line change
@@ -29,11 +29,6 @@

"""Palette holder module.
"""

import logging
LOG = logging.getLogger("palettes")


def tv_legend():
"""Palette for TV.
"""
@@ -129,285 +124,6 @@ def ctth_height():

return convert_palette(legend)

def chlorophyll_a():
"""Chlorophyll A colour palette for Modis and Meris
products.
"""
try:
from matplotlib.pylab import cm
legend = cm.spectral(range(256))
except ImportError:
LOG.info("No pylab installed. "+
"Will make the palette from hand")
legend = []
legend.append((0.000000, 0.000000, 0.000000))
legend.append((9.370604, 0.000000, 10.707827))
legend.append((18.741208, 0.000000, 21.415655))
legend.append((28.111812, 0.000000, 32.123482))
legend.append((37.482416, 0.000000, 42.831310))
legend.append((46.853020, 0.000000, 53.539137))
legend.append((56.223624, 0.000000, 64.246965))
legend.append((65.594227, 0.000000, 74.954792))
legend.append((74.964831, 0.000000, 85.662620))
legend.append((84.335435, 0.000000, 96.370447))
legend.append((93.706039, 0.000000, 107.078275))
legend.append((103.076643, 0.000000, 117.786102))
legend.append((112.447247, 0.000000, 128.493929))
legend.append((119.809506, 0.000000, 136.859608))
legend.append((121.146729, 0.000000, 138.198839))
legend.append((122.483953, 0.000000, 139.538071))
legend.append((123.821176, 0.000000, 140.877302))
legend.append((125.158400, 0.000000, 142.216533))
legend.append((126.495624, 0.000000, 143.555765))
legend.append((127.832847, 0.000000, 144.894996))
legend.append((129.170071, 0.000000, 146.234227))
legend.append((130.507294, 0.000000, 147.573459))
legend.append((131.844518, 0.000000, 148.912690))
legend.append((133.181741, 0.000000, 150.251922))
legend.append((134.518965, 0.000000, 151.591153))
legend.append((135.856188, 0.000000, 152.930384))
legend.append((131.170886, 0.000000, 154.269616))
legend.append((120.463059, 0.000000, 155.608847))
legend.append((109.755231, 0.000000, 156.948078))
legend.append((99.047404, 0.000000, 158.287310))
legend.append((88.339576, 0.000000, 159.626541))
legend.append((77.631749, 0.000000, 160.965773))
legend.append((66.923922, 0.000000, 162.305004))
legend.append((56.216094, 0.000000, 163.644235))
legend.append((45.508267, 0.000000, 164.983467))
legend.append((34.800439, 0.000000, 166.322698))
legend.append((24.092612, 0.000000, 167.661929))
legend.append((13.384784, 0.000000, 169.001161))
legend.append((2.676957, 0.000000, 170.340392))
legend.append((0.000000, 0.000000, 173.686965))
legend.append((0.000000, 0.000000, 177.702651))
legend.append((0.000000, 0.000000, 181.718337))
legend.append((0.000000, 0.000000, 185.734024))
legend.append((0.000000, 0.000000, 189.749710))
legend.append((0.000000, 0.000000, 193.765396))
legend.append((0.000000, 0.000000, 197.781082))
legend.append((0.000000, 0.000000, 201.796769))
legend.append((0.000000, 0.000000, 205.812455))
legend.append((0.000000, 0.000000, 209.828141))
legend.append((0.000000, 0.000000, 213.843827))
legend.append((0.000000, 0.000000, 217.859514))
legend.append((0.000000, 0.000000, 221.875200))
legend.append((0.000000, 9.370604, 221.875200))
legend.append((0.000000, 18.741208, 221.875200))
legend.append((0.000000, 28.111812, 221.875200))
legend.append((0.000000, 37.482416, 221.875200))
legend.append((0.000000, 46.853020, 221.875200))
legend.append((0.000000, 56.223624, 221.875200))
legend.append((0.000000, 65.594227, 221.875200))
legend.append((0.000000, 74.964831, 221.875200))
legend.append((0.000000, 84.335435, 221.875200))
legend.append((0.000000, 93.706039, 221.875200))
legend.append((0.000000, 103.076643, 221.875200))
legend.append((0.000000, 112.447247, 221.875200))
legend.append((0.000000, 120.144314, 221.875200))
legend.append((0.000000, 122.820769, 221.875200))
legend.append((0.000000, 125.497224, 221.875200))
legend.append((0.000000, 128.173678, 221.875200))
legend.append((0.000000, 130.850133, 221.875200))
legend.append((0.000000, 133.526588, 221.875200))
legend.append((0.000000, 136.203043, 221.875200))
legend.append((0.000000, 138.879498, 221.875200))
legend.append((0.000000, 141.555953, 221.875200))
legend.append((0.000000, 144.232408, 221.875200))
legend.append((0.000000, 146.908863, 221.875200))
legend.append((0.000000, 149.585318, 221.875200))
legend.append((0.000000, 152.261773, 221.875200))
legend.append((0.000000, 154.269616, 219.867357))
legend.append((0.000000, 155.608847, 215.851671))
legend.append((0.000000, 156.948078, 211.835984))
legend.append((0.000000, 158.287310, 207.820298))
legend.append((0.000000, 159.626541, 203.804612))
legend.append((0.000000, 160.965773, 199.788925))
legend.append((0.000000, 162.305004, 195.773239))
legend.append((0.000000, 163.644235, 191.757553))
legend.append((0.000000, 164.983467, 187.741867))
legend.append((0.000000, 166.322698, 183.726180))
legend.append((0.000000, 167.661929, 179.710494))
legend.append((0.000000, 169.001161, 175.694808))
legend.append((0.000000, 170.340392, 171.679122))
legend.append((0.000000, 170.675200, 168.666353))
legend.append((0.000000, 170.675200, 165.987890))
legend.append((0.000000, 170.675200, 163.309427))
legend.append((0.000000, 170.675200, 160.630965))
legend.append((0.000000, 170.675200, 157.952502))
legend.append((0.000000, 170.675200, 155.274039))
legend.append((0.000000, 170.675200, 152.595576))
legend.append((0.000000, 170.675200, 149.917114))
legend.append((0.000000, 170.675200, 147.238651))
legend.append((0.000000, 170.675200, 144.560188))
legend.append((0.000000, 170.675200, 141.881725))
legend.append((0.000000, 170.675200, 139.203263))
legend.append((0.000000, 170.675200, 136.524800))
legend.append((0.000000, 169.335969, 125.816973))
legend.append((0.000000, 167.996737, 115.109145))
legend.append((0.000000, 166.657506, 104.401318))
legend.append((0.000000, 165.318275, 93.693490))
legend.append((0.000000, 163.979043, 82.985663))
legend.append((0.000000, 162.639812, 72.277835))
legend.append((0.000000, 161.300580, 61.570008))
legend.append((0.000000, 159.961349, 50.862180))
legend.append((0.000000, 158.622118, 40.154353))
legend.append((0.000000, 157.282886, 29.446525))
legend.append((0.000000, 155.943655, 18.738698))
legend.append((0.000000, 154.604424, 8.030871))
legend.append((0.000000, 154.269114, 0.000000))
legend.append((0.000000, 156.945569, 0.000000))
legend.append((0.000000, 159.622024, 0.000000))
legend.append((0.000000, 162.298478, 0.000000))
legend.append((0.000000, 164.974933, 0.000000))
legend.append((0.000000, 167.651388, 0.000000))
legend.append((0.000000, 170.327843, 0.000000))
legend.append((0.000000, 173.004298, 0.000000))
legend.append((0.000000, 175.680753, 0.000000))
legend.append((0.000000, 178.357208, 0.000000))
legend.append((0.000000, 181.033663, 0.000000))
legend.append((0.000000, 183.710118, 0.000000))
legend.append((0.000000, 186.386573, 0.000000))
legend.append((0.000000, 189.064031, 0.000000))
legend.append((0.000000, 191.742494, 0.000000))
legend.append((0.000000, 194.420957, 0.000000))
legend.append((0.000000, 197.099420, 0.000000))
legend.append((0.000000, 199.777882, 0.000000))
legend.append((0.000000, 202.456345, 0.000000))
legend.append((0.000000, 205.134808, 0.000000))
legend.append((0.000000, 207.813271, 0.000000))
legend.append((0.000000, 210.491733, 0.000000))
legend.append((0.000000, 213.170196, 0.000000))
legend.append((0.000000, 215.848659, 0.000000))
legend.append((0.000000, 218.527122, 0.000000))
legend.append((0.000000, 221.205584, 0.000000))
legend.append((0.000000, 223.882541, 0.000000))
legend.append((0.000000, 226.558996, 0.000000))
legend.append((0.000000, 229.235451, 0.000000))
legend.append((0.000000, 231.911906, 0.000000))
legend.append((0.000000, 234.588361, 0.000000))
legend.append((0.000000, 237.264816, 0.000000))
legend.append((0.000000, 239.941271, 0.000000))
legend.append((0.000000, 242.617725, 0.000000))
legend.append((0.000000, 245.294180, 0.000000))
legend.append((0.000000, 247.970635, 0.000000))
legend.append((0.000000, 250.647090, 0.000000))
legend.append((0.000000, 253.323545, 0.000000))
legend.append((0.000000, 256.000000, 0.000000))
legend.append((14.723514, 256.000000, 0.000000))
legend.append((29.447027, 256.000000, 0.000000))
legend.append((44.170541, 256.000000, 0.000000))
legend.append((58.894055, 256.000000, 0.000000))
legend.append((73.617569, 256.000000, 0.000000))
legend.append((88.341082, 256.000000, 0.000000))
legend.append((103.064596, 256.000000, 0.000000))
legend.append((117.788110, 256.000000, 0.000000))
legend.append((132.511624, 256.000000, 0.000000))
legend.append((147.235137, 256.000000, 0.000000))
legend.append((161.958651, 256.000000, 0.000000))
legend.append((176.682165, 256.000000, 0.000000))
legend.append((188.728722, 255.665192, 0.000000))
legend.append((192.744408, 254.325961, 0.000000))
legend.append((196.760094, 252.986729, 0.000000))
legend.append((200.775780, 251.647498, 0.000000))
legend.append((204.791467, 250.308267, 0.000000))
legend.append((208.807153, 248.969035, 0.000000))
legend.append((212.822839, 247.629804, 0.000000))
legend.append((216.838525, 246.290573, 0.000000))
legend.append((220.854212, 244.951341, 0.000000))
legend.append((224.869898, 243.612110, 0.000000))
legend.append((228.885584, 242.272878, 0.000000))
legend.append((232.901271, 240.933647, 0.000000))
legend.append((236.916957, 239.594416, 0.000000))
legend.append((239.594416, 237.586573, 0.000000))
legend.append((240.933647, 234.910118, 0.000000))
legend.append((242.272878, 232.233663, 0.000000))
legend.append((243.612110, 229.557208, 0.000000))
legend.append((244.951341, 226.880753, 0.000000))
legend.append((246.290573, 224.204298, 0.000000))
legend.append((247.629804, 221.527843, 0.000000))
legend.append((248.969035, 218.851388, 0.000000))
legend.append((250.308267, 216.174933, 0.000000))
legend.append((251.647498, 213.498478, 0.000000))
legend.append((252.986729, 210.822024, 0.000000))
legend.append((254.325961, 208.145569, 0.000000))
legend.append((255.665192, 205.469114, 0.000000))
legend.append((256.000000, 201.788235, 0.000000))
legend.append((256.000000, 197.772549, 0.000000))
legend.append((256.000000, 193.756863, 0.000000))
legend.append((256.000000, 189.741176, 0.000000))
legend.append((256.000000, 185.725490, 0.000000))
legend.append((256.000000, 181.709804, 0.000000))
legend.append((256.000000, 177.694118, 0.000000))
legend.append((256.000000, 173.678431, 0.000000))
legend.append((256.000000, 169.662745, 0.000000))
legend.append((256.000000, 165.647059, 0.000000))
legend.append((256.000000, 161.631373, 0.000000))
legend.append((256.000000, 157.615686, 0.000000))
legend.append((256.000000, 153.600000, 0.000000))
legend.append((256.000000, 141.552941, 0.000000))
legend.append((256.000000, 129.505882, 0.000000))
legend.append((256.000000, 117.458824, 0.000000))
legend.append((256.000000, 105.411765, 0.000000))
legend.append((256.000000, 93.364706, 0.000000))
legend.append((256.000000, 81.317647, 0.000000))
legend.append((256.000000, 69.270588, 0.000000))
legend.append((256.000000, 57.223529, 0.000000))
legend.append((256.000000, 45.176471, 0.000000))
legend.append((256.000000, 33.129412, 0.000000))
legend.append((256.000000, 21.082353, 0.000000))
legend.append((256.000000, 9.035294, 0.000000))
legend.append((255.330886, 0.000000, 0.000000))
legend.append((252.654431, 0.000000, 0.000000))
legend.append((249.977976, 0.000000, 0.000000))
legend.append((247.301522, 0.000000, 0.000000))
legend.append((244.625067, 0.000000, 0.000000))
legend.append((241.948612, 0.000000, 0.000000))
legend.append((239.272157, 0.000000, 0.000000))
legend.append((236.595702, 0.000000, 0.000000))
legend.append((233.919247, 0.000000, 0.000000))
legend.append((231.242792, 0.000000, 0.000000))
legend.append((228.566337, 0.000000, 0.000000))
legend.append((225.889882, 0.000000, 0.000000))
legend.append((223.213427, 0.000000, 0.000000))
legend.append((221.205584, 0.000000, 0.000000))
legend.append((219.866353, 0.000000, 0.000000))
legend.append((218.527122, 0.000000, 0.000000))
legend.append((217.187890, 0.000000, 0.000000))
legend.append((215.848659, 0.000000, 0.000000))
legend.append((214.509427, 0.000000, 0.000000))
legend.append((213.170196, 0.000000, 0.000000))
legend.append((211.830965, 0.000000, 0.000000))
legend.append((210.491733, 0.000000, 0.000000))
legend.append((209.152502, 0.000000, 0.000000))
legend.append((207.813271, 0.000000, 0.000000))
legend.append((206.474039, 0.000000, 0.000000))
legend.append((205.134808, 0.000000, 0.000000))
legend.append((204.800000, 12.047059, 12.047059))
legend.append((204.800000, 28.109804, 28.109804))
legend.append((204.800000, 44.172549, 44.172549))
legend.append((204.800000, 60.235294, 60.235294))
legend.append((204.800000, 76.298039, 76.298039))
legend.append((204.800000, 92.360784, 92.360784))
legend.append((204.800000, 108.423529, 108.423529))
legend.append((204.800000, 124.486275, 124.486275))
legend.append((204.800000, 140.549020, 140.549020))
legend.append((204.800000, 156.611765, 156.611765))
legend.append((204.800000, 172.674510, 172.674510))
legend.append((204.800000, 188.737255, 188.737255))
legend.append((204.800000, 204.800000, 204.800000))

return convert_palette(legend)

palette = []
for i in range(256):
palette.append((legend[i,0],
legend[i,1],
legend[i,2]))

return palette


def convert_palette(palette):
"""Convert palette from [0,255] range to [0,1].
"""
97 changes: 96 additions & 1 deletion mpop/instruments/visir.py
Original file line number Diff line number Diff line change
@@ -23,7 +23,6 @@

"""This module defines the generic VISIR instrument class.
"""
from mpop.scene import SatelliteInstrumentScene
from mpop.imageo import geo_image
from mpop.compositer import Compositer

@@ -124,6 +123,101 @@ def airmass(self):

airmass.prerequisites = set([6.7, 7.3, 9.7, 10.8])


def vis06(self):
"""Make a black and white image of the VIS 0.635um channel.
"""
return self.channel_image(0.6)

vis06.prerequisites = set([0.635])

def ir108(self):
"""Make a black and white image of the IR 10.8um channel.
"""
self.check_channels(10.8)

img = geo_image.GeoImage(self[10.8].data,
self.area,
self.time_slot,
fill_value=0,
mode="L",
crange=(-70 + 273.15, 57.5 + 273.15))
img.enhance(inverse=True)
return img

ir108.prerequisites = set([10.8])

def wv_high(self):
"""Make a black and white image of the IR 6.7um channel."""
self.check_channels(6.7)

img = geo_image.GeoImage(self[6.7].data,
self.area,
self.time_slot,
fill_value=0,
mode="L")
img.enhance(inverse = True, stretch = "linear")
return img

wv_high.prerequisites = set([6.7])

def wv_low(self):
"""Make a black and white image of the IR 7.3um channel."""
self.check_channels(7.3)

img = geo_image.GeoImage(self[7.3].data,
self.area,
self.time_slot,
fill_value=0,
mode="L")
img.enhance(inverse = True, stretch = "linear")
return img

wv_low.prerequisites = set([7.3])

def green_snow(self):
"""Make a Green Snow RGB image composite.
"""
self.check_channels(0.85, 1.63, 10.8)

ch1 = self[1.63].check_range()
ch2 = self[0.85].check_range()
ch3 = -self[10.8].data

img = geo_image.GeoImage((ch1, ch2, ch3),
self.area,
self.time_slot,
fill_value=(0, 0, 0),
mode="RGB")

img.enhance(stretch = "crude")
img.enhance(gamma = 1.6)

return img

green_snow.prerequisites = set([0.85, 1.63, 10.8])

def red_snow(self):
"""Make a Red Snow RGB image composite.
"""
self.check_channels(0.635, 1.63, 10.8)

ch1 = self[0.635].check_range()
ch2 = self[1.63].check_range()
ch3 = -self[10.8].data

img = geo_image.GeoImage((ch1, ch2, ch3),
self.area,
self.time_slot,
fill_value=(0, 0, 0),
mode="RGB")

img.enhance(stretch = "crude")

return img

red_snow.prerequisites = set([0.635, 1.63, 10.8])

def convection(self):
"""Make a Severe Convection RGB image composite.
"""
@@ -171,6 +265,7 @@ def dust(self):

dust.prerequisites = set([8.7, 10.8, 12.0])


def ash(self):
"""Make a Ash RGB image composite.
"""
145 changes: 0 additions & 145 deletions mpop/plugin_base.py

This file was deleted.

11 changes: 0 additions & 11 deletions mpop/satin/aapp1b.py
Original file line number Diff line number Diff line change
@@ -36,17 +36,6 @@

from mpop import CONFIG_PATH
from mpop.satin.logger import LOG
from mpop.plugin_base import Reader

class Aapp1bReader(Reader):
"""Plugin for reading AAPP 1b format.
"""
pformat = "aapp1b"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)


# Using ahamap
11 changes: 0 additions & 11 deletions mpop/satin/eps1a.py
Original file line number Diff line number Diff line change
@@ -38,17 +38,6 @@
import mpop.satin.aapp1b

from mpop import CONFIG_PATH
from mpop.plugin_base import Reader

class Eps1aReader(Reader):
"""Plugin for reading EPS 1A format.
"""
pformat = "eps1a"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)

WORKING_DIR = "/tmp"

26 changes: 9 additions & 17 deletions mpop/satin/eps_avhrr.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2010, 2011.
# Copyright (c) 2010.

# SMHI,
# Folkborgsvägen 1,
@@ -718,9 +718,9 @@ def read(fdes):

cnt += 1

channels = channels[:, :cnt, :]
llats = llats[:cnt, :]
llons = llons[:cnt, :]
channels = channels[:, :cnt - 1, :]
llats = llats[:cnt - 1, :]
llons = llons[:cnt - 1, :]
calibrate(channels, info_giadr)
return channels, llats, llons, g3a, g3b, metadata["ORBIT_START"]

@@ -736,10 +736,9 @@ def read(fdes):

EPSILON = 0.001

def load(satscene, *args, **kwargs):
def load(satscene):
"""Read data from file and load it into *satscene*.
"""
del args, kwargs
"""
conf = ConfigParser()
conf.read(os.path.join(CONFIG_PATH, satscene.fullname + ".cfg"))
options = {}
@@ -786,17 +785,10 @@ def load_avhrr(satscene, options):
if g3b:
satscene["3B"] = channels[3, :, :]

satscene.lat = lats
satscene.lon = lons

satscene.orbit = str(int(orbit))

try:
from pyresample import geometry
satscene.area = geometry.SwathDefinition(lons=lons, lats=lats)
except ImportError:
satscene.area = None
satscene.lat = lats
satscene.lon = lons

satscene.orbit = str(int(orbit) + 1)

def get_lonlat(satscene, row, col):
try:
13 changes: 1 addition & 12 deletions mpop/satin/fy3_mersi_aggr1km.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2010, 2011.
# Copyright (c) 2010.

# SMHI,
# Folkborgsvägen 1,
@@ -34,17 +34,6 @@
import numpy as np

from mpop import BASE_PATH
from mpop.plugin_base import Reader

class FY3Reader(Reader):
"""Plugin for reading FY3 format.
"""
pformat = "fy3_mersi_aggr1km"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)


def load(satscene):
12 changes: 0 additions & 12 deletions mpop/satin/hrpt.py
Original file line number Diff line number Diff line change
@@ -38,18 +38,6 @@
from mpop.utils import ensure_dir
import mpop.satin.aapp1b
from mpop import CONFIG_PATH
from mpop.plugin_base import Reader
from mpop.satellites import PolarFactory

class HRPTReader(Reader):
"""Plugin for reading HRPT format.
"""
pformat = "hrpt"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)

from mpop.satellites import PolarFactory

1,418 changes: 0 additions & 1,418 deletions mpop/satin/meris_level2.py

This file was deleted.

228 changes: 110 additions & 118 deletions mpop/satin/mipp.py
Original file line number Diff line number Diff line change
@@ -29,14 +29,15 @@
"""Interface to Eumetcast level 1.5 HRIT/LRIT format. Uses the MIPP reader.
"""
import ConfigParser
import datetime
import os

import numpy as np
import xrit.sat
from xrit import CalibrationError, SatReaderError

from mpop import CONFIG_PATH
from mpop.satin.logger import LOG
from mpop.plugin_base import Reader

try:
# Work around for on demand import of pyresample. pyresample depends
@@ -49,127 +50,118 @@
LOG.warning("pyresample missing. Can only work in satellite projection")


class MippReader(Reader):
"""Reader for HRIT/LRIT data through mipp.
def load(satscene, calibrate=True, area_extent=None):
"""Read data from file and load it into *satscene*. The *calibrate*
argument is passed to mipp (should be 0 for off, 1 for default, and 2 for
radiances only).
"""
conf = ConfigParser.ConfigParser()
conf.read(os.path.join(CONFIG_PATH, satscene.fullname + ".cfg"))
options = {}
for option, value in conf.items(satscene.instrument_name + "-level2"):
options[option] = value

for section in conf.sections():
if(section.startswith(satscene.instrument_name) and
not (section == "satellite") and
not section[:-1].endswith("-level") and
not section.endswith("-granules")):
options[section] = conf.items(section)
CASES.get(satscene.instrument_name, load_generic)(satscene,
options,
calibrate,
area_extent)

def load_generic(satscene, options, calibrate=True, area_extent=None):
"""Read seviri data from file and load it into *satscene*.
"""
pformat = "mipp"
cases = {}

def load(self, channels_to_load, **kwargs):
"""Read data from file and load it into *self._scene*. The *calibrate*
argument is passed to mipp (should be 0 for off, 1 for default, and 2 for
radiances only).
"""
conf = ConfigParser.ConfigParser()
conf.read(os.path.join(CONFIG_PATH, self._scene.fullname + ".cfg"))
options = {}
for option, value in conf.items(self._scene.instrument_name + "-level2"):
options[option] = value

for section in conf.sections():
if(section.startswith(self._scene.instrument_name) and
not (section == "satellite") and
not section[:-1].endswith("-level") and
not section.endswith("-granules")):
options[section] = conf.items(section)
fun = self.cases.get(self._scene.instrument_name, self._load_generic)
fun(channels_to_load, options, **kwargs)

def _load_generic(self, channels_to_load, options, calibrate=True, area_extent=None):
"""Read seviri data from file and load it into *self._scene*.
"""
del options
os.environ["PPP_CONFIG_DIR"] = CONFIG_PATH

LOG.debug("Channels to load from %s: %s"%(self._scene.instrument_name,
channels_to_load))

# Compulsory global attribudes
self._scene.info["title"] = (self._scene.satname.capitalize() +
self._scene.number +
" satellite, " +
self._scene.instrument_name.capitalize() +
" instrument.")
self._scene.info["institution"] = "Original data disseminated by EumetCast."
self._scene.add_to_history("HRIT/LRIT data read by mipp/mpop.")
self._scene.info["references"] = "No reference."
self._scene.info["comments"] = "No comment."

from_area = False

if area_extent is None and self._scene.area is not None:
if not self._scene.area_def:
self._scene.area = get_area_def(self._scene.area_id)
area_extent = self._scene.area.area_extent
from_area = True

for chn in channels_to_load:
if from_area:
try:
metadata = xrit.sat.load(self._scene.fullname,
self._scene.time_slot,
chn,
only_metadata=True)
if(self._scene.area_def.proj_dict["proj"] != "geos" or
float(self._scene.area_def.proj_dict["lon_0"]) != metadata.sublon):
raise ValueError("Slicing area must be in "
"geos projection, and lon_0 should"
" match the"
" satellite's position.")
except SatReaderError:
# if channel can't be found, go on with next channel
continue
try:
image = xrit.sat.load(self._scene.fullname,
self._scene.time_slot,
chn,
mask=True,
calibrate=calibrate)
if area_extent:
metadata, data = image(area_extent)
else:
metadata, data = image()
except CalibrationError:
LOG.warning("Loading non calibrated data since calibration"
" failed.")
image = xrit.sat.load(self._scene.fullname,
self._scene.time_slot,
chn,
mask=True,
calibrate=False)
if area_extent:
metadata, data = image(area_extent)
else:
metadata, data = image()
os.environ["PPP_CONFIG_DIR"] = CONFIG_PATH

LOG.debug("Channels to load from %s: %s"%(satscene.instrument_name,
satscene.channels_to_load))

# Compulsory global attribudes
satscene.info["title"] = (satscene.satname.capitalize() + satscene.number +
" satellite, " +
satscene.instrument_name.capitalize() +
" instrument.")
satscene.info["institution"] = "Original data disseminated by EumetCast."
satscene.add_to_history("HRIT/LRIT data read by mipp/mpop.")
satscene.info["references"] = "No reference."
satscene.info["comments"] = "No comment."

from_area = False

if area_extent is None and satscene.area is not None:
if not satscene.area_def:
satscene.area = get_area_def(satscene.area_id)
area_extent = satscene.area.area_extent
from_area = True

for chn in satscene.channels_to_load:
if from_area:
try:
metadata = xrit.sat.load(satscene.fullname, satscene.time_slot,
chn, only_metadata=True)
if(satscene.area_def.proj_dict["proj"] != "geos" or
float(satscene.area_def.proj_dict["lon_0"]) != metadata.sublon):
raise ValueError("Slicing area must be in "
"geos projection, and lon_0 should match the"
" satellite's position.")
except SatReaderError:
# if channel can't be found, go on with next channel
continue

self._scene[chn] = data

self._scene[chn].info['units'] = metadata.calibration_unit

# Build an area on the fly from the mipp metadata
proj_params = getattr(metadata, "proj4_params").split(" ")
proj_dict = {}
for param in proj_params:
key, val = param.split("=")
proj_dict[key] = val

if is_pyresample_loaded:
# Build area_def on-the-fly
self._scene[chn].area = geometry.AreaDefinition(
self._scene.satname + self._scene.instrument_name +
str(metadata.area_extent) +
str(data.shape),
"On-the-fly area",
proj_dict["proj"],
proj_dict,
data.shape[1],
data.shape[0],
metadata.area_extent)
try:
image = xrit.sat.load(satscene.fullname,
satscene.time_slot,
chn,
mask=True,
calibrate=calibrate)
if area_extent:
metadata, data = image(area_extent)
else:
LOG.info("Could not build area, pyresample missing...")

metadata, data = image()
except CalibrationError:
LOG.warning("Loading non calibrated data since calibration failed.")
image = xrit.sat.load(satscene.fullname,
satscene.time_slot,
chn,
mask=True,
calibrate=False)
if area_extent:
metadata, data = image(area_extent)
else:
metadata, data = image()

except SatReaderError:
# if channel can't be found, go on with next channel
continue

satscene[chn] = data

satscene[chn].info['units'] = metadata.calibration_unit

# Build an area on the fly from the mipp metadata
proj_params = getattr(metadata, "proj4_params").split(" ")
proj_dict = {}
for param in proj_params:
key, val = param.split("=")
proj_dict[key] = val

if is_pyresample_loaded:
# Build area_def on-the-fly
satscene[chn].area = geometry.AreaDefinition(
satscene.satname + satscene.instrument_name +
str(metadata.area_extent) +
str(data.shape),
"On-the-fly area",
proj_dict["proj"],
proj_dict,
data.shape[1],
data.shape[0],
metadata.area_extent)
else:
LOG.info("Could not build area, pyresample missing...")

CASES = {}

75 changes: 15 additions & 60 deletions mpop/satin/modis_level2.py
Original file line number Diff line number Diff line change
@@ -28,7 +28,6 @@
"""Plugin for reading AQUA MODIS level 2 EOS HDF files downloaded from NASA FTP import
"""

import sys
import os.path
from ConfigParser import ConfigParser

@@ -39,17 +38,7 @@
from mpop import CONFIG_PATH
from mpop.satin.logger import LOG
import mpop.channel
from mpop.plugin_base import Reader

class ModisLevel2Reader(Reader):
"""Plugin for reading modis level2 format.
"""
pformat = "modis_level2"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)
#from mpop.projector import get_area_def

EOS_SATELLITE = {'aqua': 'eos2',
'modisa': 'eos2',
@@ -88,19 +77,6 @@ def load(self, *args, **kwargs):
# Geo-location - Longitude,latitude:
LONLAT = ['longitude', 'latitude']

# ------------------------------------------------------------------------
if sys.version_info < (2, 5):
import time
def strptime(string, fmt=None):
"""This function is available in the datetime module only
from Python >= 2.5.
"""

return datetime.datetime(*time.strptime(string, fmt)[:6])
else:
strptime = datetime.datetime.strptime



class ModisEosHdfLevel2(mpop.channel.GenericChannel):
"""NASA EOS-HDF Modis data struct"""
@@ -139,15 +115,8 @@ def read(self, filename, **kwargs):
from pyhdf.SD import SD
import datetime

del kwargs

LOG.info("*** >>> Read the hdf-eos file!")

if os.path.exists(filename):
root = SD(filename)
else:
LOG.info("No such file: " + str(filename))
raise IOError("File %s does not exist!" % (filename))
print "*** >>> Read the hdf-eos file!"
root = SD(filename)

# Get all the Attributes:
# Common Attributes, Data Time,
@@ -156,14 +125,14 @@ def read(self, filename, **kwargs):
self._eoshdf_info[key] = root.attributes()[key]

# Start Time - datetime object
starttime = strptime(self._eoshdf_info['Start Time'][0:13],
"%Y%j%H%M%S")
starttime = datetime.datetime.strptime(self._eoshdf_info['Start Time'][0:13],
"%Y%j%H%M%S")
msec = float(self._eoshdf_info['Start Time'][13:16])/1000.
self.starttime = starttime + datetime.timedelta(seconds=msec)

# End Time - datetime object
endtime = strptime(self._eoshdf_info['End Time'][0:13],
"%Y%j%H%M%S")
endtime = datetime.datetime.strptime(self._eoshdf_info['End Time'][0:13],
"%Y%j%H%M%S")
msec = float(self._eoshdf_info['End Time'][13:16])/1000.
self.endtime = endtime + datetime.timedelta(seconds=msec)

@@ -179,8 +148,6 @@ def read(self, filename, **kwargs):
self.shape = (self._eoshdf_info['Number of Scan Control Points'],
self._eoshdf_info['Number of Pixel Control Points'])

LOG.info("Orbit = " + str(self.orbit))

#try:
if 1:
value = root.select(self.name)
@@ -198,21 +165,21 @@ def read(self, filename, **kwargs):
# pass

root.end()
self.filled = True
self.filled= True


def project(self, coverage):
"""Remaps the Modis EOS-HDF level2 ocean products to cartographic
map-projection on a user defined area.
"""
LOG.info("Projecting product %s..."%(self.name))
print("Inside project...")

retv = ModisEosHdfLevel2(self.name)
retv.data = coverage.project_array(self.data)
retv.area = coverage.out_area
retv.shape = retv.data.shape
retv.resolution = self.resolution
retv.orbit = self.orbit
retv.satid = self.satid
retv.info = self.info
retv.filled = True
valid_min = retv.data.min()
@@ -239,8 +206,7 @@ def load(satscene, **kwargs):

pathname = os.path.join(options["dir"], options['filename'])
filename = satscene.time_slot.strftime(pathname)

globalinfo = {}

for prodname in GEO_PHYS_PRODUCTS:
if prodname in satscene.channels_to_load:

@@ -250,9 +216,6 @@ def load(satscene, **kwargs):
prod_chan.resolution = 1000.0
prod_chan.shape = prod_chan.data.shape

for key in prod_chan._eoshdf_info:
globalinfo[key] = prod_chan._eoshdf_info[key]

# All this for the netCDF writer:
prod_chan.info['var_name'] = prodname
prod_chan.info['var_data'] = prod_chan.data
@@ -273,8 +236,6 @@ def load(satscene, **kwargs):

LOG.info("Loading modis lvl2 product done")

#print "INFO: ",globalinfo

# Check if there are any bands to load:
channels_to_load = False
for bandname in CHANNELS:
@@ -283,15 +244,14 @@ def load(satscene, **kwargs):
break

if channels_to_load:
print "FILE: ", filename
eoshdf = SD(filename)
# Get all the Attributes:
# Common Attributes, Data Time,
# Data Structure and Scene Coordinates
info = {}
for key in eoshdf.attributes().keys():
info[key] = eoshdf.attributes()[key]
if key not in globalinfo:
globalinfo[key] = info[key]

dsets = eoshdf.datasets()
selected_dsets = []
@@ -320,21 +280,16 @@ def load(satscene, **kwargs):
LOG.info("Loading modis lvl2 Remote Sensing Reflectances done")
eoshdf.end()

#print "INFO: ",globalinfo

lat, lon = get_lat_lon(satscene, None)

from pyresample import geometry
satscene.area = geometry.SwathDefinition(lons=lon, lats=lat)
satscene.orbit = globalinfo['Orbit Number']
if satscene.orbit == -1:
LOG.info("Orbit number equals -1 in eos-hdf file. " +
"Setting it to 99999!")
satscene.orbit = 99999

LOG.info("Variant: " + satscene.variant)
LOG.info("Loading modis data done.")
print "Variant: ", satscene.variant
satscene.variant = 'regional' # Temporary fix!

LOG.info("Loading modis data done.")

def get_lonlat(satscene, row, col):
"""Estimate lon and lat.
22 changes: 4 additions & 18 deletions mpop/satin/msg_hdf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2010, 2011.
# Copyright (c) 2010.

# SMHI,
# Folkborgsvägen 1,
@@ -37,17 +37,6 @@
import glob
from mpop.utils import get_logger
from mpop.projector import get_area_def
from mpop.plugin_base import Reader

class MsgHdfReader(Reader):
"""Plugin for reading MSG HDF format.
"""
pformat = "msg_hdf"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)

LOG = get_logger('satin/msg_hdf')
COMPRESS_LVL = 6
@@ -1090,13 +1079,13 @@ def get_best_product(filename):
return msg_filename


def load(scene, *args, **kwargs):
def load(scene, **kwargs):
"""Load data into the *channels*. *Channels* is a list or a tuple
containing channels we will load data into. If None, all channels are
loaded.
"""

del args, kwargs
del kwargs

conf = ConfigParser.ConfigParser()
conf.read(os.path.join(CONFIG_PATH, scene.fullname+".cfg"))
@@ -1105,10 +1094,7 @@ def load(scene, *args, **kwargs):
filename = conf.get(scene.instrument_name+"-level3", "filename",
raw=True)
pathname = os.path.join(directory, filename)
try:
area_name = scene.area_id or scene.area.area_id
except AttributeError:
LOG.info("No area_id defined for this scene, can't load msg hdf's")
area_name = scene.area_id or scene.area.area_id

if "CTTH" in scene.channels_to_load:
filename = (scene.time_slot.strftime(pathname)
12 changes: 3 additions & 9 deletions mpop/satin/nwcsaf_pps.py
Original file line number Diff line number Diff line change
@@ -45,7 +45,6 @@
class PpsCloudType(mpop.channel.GenericChannel):
def __init__(self, resolution=None):
mpop.channel.GenericChannel.__init__(self, "CloudType")

self.filled = False
self.name = "CloudType"
self.resolution = resolution
@@ -112,8 +111,6 @@ def project(self, coverage):
LOG.info("Projecting product %s..."%(self.name))
retv = PpsCloudType(None)
retv.cloudtype = coverage.project_array(self.cloudtype)
retv.qualityflag = coverage.project_array(self.qualityflag)
retv.phaseflag = coverage.project_array(self.phaseflag)
retv.area = coverage.out_area
retv.shape = retv.shape
retv.resolution = self.resolution
@@ -202,16 +199,14 @@ def load(scene, **kwargs):
lonlat_dir = conf.get(scene.instrument_name+"-level3", "lonlat_dir")
lonlat_filename = conf.get(scene.instrument_name+"-level3", "lonlat_filename",
raw=True)

lonlat_tmpl = os.path.join(lonlat_dir, lonlat_filename)

area_name = "satproj"
filename_tmpl = (scene.time_slot.strftime(lonlat_tmpl)
%{"orbit": scene.orbit,
"area": area_name,
"satellite": scene.satname,
"number": scene.number})
"satellite": scene.satname})


file_list = glob.glob(filename_tmpl)
if len(file_list) > 1:
raise IOError("More than one Geolocation file matching!")
@@ -231,7 +226,6 @@ def load(scene, **kwargs):
%{"orbit": scene.orbit,
"area": area_name,
"satellite": scene.satname,
"number": scene.number,
"product": "ctth"})

file_list = glob.glob(filename_tmpl)
@@ -259,7 +253,6 @@ def load(scene, **kwargs):
%{"orbit": scene.orbit,
"area": area_name,
"satellite": scene.satname,
"number": scene.number,
"product": "cloudtype"})

file_list = glob.glob(filename_tmpl)
@@ -308,3 +301,4 @@ def get_lonlat(filename):

h5f.close()
return lons, lats

107 changes: 3 additions & 104 deletions mpop/satin/pps_hdf.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2010, 2011.
# Copyright (c) 2010.

# SMHI,
# Folkborgsvägen 1,
@@ -35,24 +35,10 @@
import mpop.channel
from mpop import CONFIG_PATH
from mpop.utils import get_logger
from mpop.plugin_base import Reader

class PpsHdfReader(Reader):
"""Plugin for reading PPS hdf format.
"""
pformat = "pps_hdf"

def load(self, *args, **kwargs):
"""Read data from file.
"""
load(self._scene, *args, **kwargs)

LOG = get_logger('satin/pps_hdf')

def pcs_def_from_region(region):
items = region.proj_dict.items()
return ' '.join([ t[0] + '=' + t[1] for t in items])

class PpsCloudType(mpop.channel.GenericChannel):
def __init__(self):
mpop.channel.GenericChannel.__init__(self, "CloudType")
@@ -84,43 +70,7 @@ def copy(self, other):
self.cloudtype = other.cloudtype
self.qualityflag = other.qualityflag
self.phaseflag = other.phaseflag

def project(self, coverage):
"""Remaps the cloudtype channel.
"""
import epshdf

LOG.info("Projecting channel %s..."%(self.name))

retv = PpsCloudType()

area = coverage.out_area
retv.region = epshdf.SafRegion()
retv.region.xsize = area.x_size
retv.region.ysize = area.y_size
retv.region.id = area.area_id
retv.region.pcs_id = area.proj_id
retv.region.pcs_def = pcs_def_from_region(area)
retv.region.area_extent = area.area_extent

retv.cloudtype_des = self.cloudtype_des
retv.cloudtype_lut = self.cloudtype_lut
retv.cloudtype = coverage.project_array(self.cloudtype)

retv.qualityflag_des = self.qualityflag_des
retv.qualityflag_lut = self.qualityflag_lut
retv.qualityflag = coverage.project_array(self.qualityflag)

retv.phaseflag_des = self.phaseflag_des
retv.phaseflag_lut = self.phaseflag_lut
retv.phaseflag = coverage.project_array(self.phaseflag)

retv.des = self.des
retv.sec_1970 = self.sec_1970
retv.satellite_id = self.satellite_id

return retv

def read(self, filename):
import epshdf
self.copy(epshdf.read_cloudtype(filename))
@@ -193,68 +143,17 @@ def copy(self, other):
self.c_nodata = other.c_nodata
self.processingflag = other.processingflag

def project(self, coverage):
"""Remaps the cloudtype channel.
"""
import epshdf

LOG.info("Projecting channel %s..."%(self.name))

retv = PpsCTTH()

area = coverage.out_area
retv.region = epshdf.SafRegion()
retv.region.xsize = area.x_size
retv.region.ysize = area.y_size
retv.region.id = area.area_id
retv.region.pcs_id = area.proj_id
retv.region.pcs_def = pcs_def_from_region(area)
retv.region.area_extent = area.area_extent

retv.ctt_des = self.ctt_des
retv.temperature = coverage.project_array(self.temperature)
retv.t_gain = self.t_gain
retv.t_intercept = self.t_intercept
retv.t_nodata = self.t_nodata

retv.ctp_des = self.ctp_des
retv.pressure = coverage.project_array(self.pressure)
retv.p_gain = self.p_gain
retv.p_intercept = self.p_intercept
retv.p_nodata = self.p_nodata

retv.cth_des = self.cth_des
retv.height = coverage.project_array(self.height)
retv.h_gain = self.h_gain
retv.h_intercept = self.h_intercept
retv.h_nodata = self.h_nodata

retv.cloudiness = coverage.project_array(self.cloudiness)
retv.c_nodata = self.c_nodata
retv.cloudiness_des = self.cloudiness_des

retv.processingflag = coverage.project_array(self.processingflag)
retv.processingflag_des = self.processingflag_des
retv.processingflag_lut = self.processingflag_lut


retv.des = self.des
retv.sec_1970 = self.sec_1970
retv.satellite_id = self.satellite_id

return retv

def read(self, filename):
import epshdf
self.copy(epshdf.read_cloudtop(filename))

def load(scene, *args, **kwargs):
def load(scene, **kwargs):
"""Load data into the *channels*. *Channels* is a list or a tuple
containing channels we will load data into. If None, all channels are
loaded.
"""

del args, kwargs
del kwargs

if("CTTH" not in scene.channels_to_load and
"CloudType" not in scene.channels_to_load):
3 changes: 1 addition & 2 deletions mpop/satin/test_mipp.py
Original file line number Diff line number Diff line change
@@ -34,7 +34,6 @@

import numpy as np
import xrit.sat
import pyresample.geometry

import mpop.satin.mipp
import mpop.scene
@@ -223,7 +222,7 @@ def setUp(self):
patch_configparser()
patch_satellite()
patch_mipp()

# def test_load(self):
# """Test the loading function.
# """
41 changes: 41 additions & 0 deletions mpop/satin/test_plugin.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2010.

# SMHI,
# Folkborgsvägen 1,
# Norrköping,
# Sweden

# Author(s):

# Martin Raspaud <martin.raspaud@smhi.se>

# This file is part of mpop.

# mpop is free software: you can redistribute it and/or modify it under the
# terms of the GNU General Public License as published by the Free Software
# Foundation, either version 3 of the License, or (at your option) any later
# version.

# mpop is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
# A PARTICULAR PURPOSE. See the GNU General Public License for more details.

# You should have received a copy of the GNU General Public License along with
# mpop. If not, see <http://www.gnu.org/licenses/>.

"""Module to test the plugin interface.
"""

import numpy as np

def get_lat_lon(*args, **kwargs):
"""Dummy get_lat_lon function.
"""
del args, kwargs
return (np.zeros((3, 3)), np.zeros((3, 3)))

def load(satscene):
"""Dummy load function.
"""
pass
213 changes: 123 additions & 90 deletions mpop/satin/thin_modis.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions mpop/saturn/runner.py
Original file line number Diff line number Diff line change
@@ -37,6 +37,7 @@
from mpop.saturn.tasklist import TaskList
from mpop.satellites import GenericFactory


LOG = logging.getLogger("runner")

def usage(scriptname):
1 change: 0 additions & 1 deletion mpop/scene.py
Original file line number Diff line number Diff line change
@@ -209,7 +209,6 @@ def __init__(self, time_slot=None, area_id=None, area=None,
conf.read(os.path.join(CONFIG_PATH, self.fullname+".cfg"))

for section in conf.sections():
# load channels from config file
if(not section[:-1].endswith("level") and
not section.endswith("granules") and
section.startswith(self.instrument_name)):
4 changes: 1 addition & 3 deletions mpop/test_scene.py
Original file line number Diff line number Diff line change
@@ -69,10 +69,8 @@ def read(self, *args, **kwargs):
def get(self, *args, **kwargs):
"""Dummy get method
"""
del kwargs
del args, kwargs
self = self
if args[1] == "dir":
return "satout"
return DUMMY_STRING

def sections(self):
8 changes: 2 additions & 6 deletions test/test_pp_core.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) 2010, 2011.
# Copyright (c) 2010.

# SMHI,
# Folkborgsvägen 1,
@@ -194,12 +194,8 @@ def read(self, *args, **kwargs):
def get(self, *args, **kwargs):
"""Dummy get method
"""
del kwargs
del args, kwargs
self = self

if args[1] == "dir":
return "satout"

return "test_plugin"

def sections(self):

0 comments on commit 0ad9848

Please sign in to comment.