[cig-commits] r11326 - in cs/portal/trunk/seismo/SeismoWebPortal: . templates/SeismoWebPortal
leif at geodynamics.org
leif at geodynamics.org
Tue Mar 4 20:41:09 PST 2008
Author: leif
Date: 2008-03-04 20:41:09 -0800 (Tue, 04 Mar 2008)
New Revision: 11326
Added:
cs/portal/trunk/seismo/SeismoWebPortal/gmt.py
Modified:
cs/portal/trunk/seismo/SeismoWebPortal/models.py
cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html
cs/portal/trunk/seismo/SeismoWebPortal/urls.py
cs/portal/trunk/seismo/SeismoWebPortal/views.py
Log:
Generate our own beachballs using GMT. Also, fixed a grammatical typo
that Sue pointed out.
Added: cs/portal/trunk/seismo/SeismoWebPortal/gmt.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/gmt.py (rev 0)
+++ cs/portal/trunk/seismo/SeismoWebPortal/gmt.py 2008-03-05 04:41:09 UTC (rev 11326)
@@ -0,0 +1,59 @@
+
+
+import os
+import shutil
+
+from os.path import join
+from popen2 import Popen3
+from tempfile import mkdtemp, TemporaryFile
+from django.http import Http404
+
+
+gmt_bin = "/home/leif/opt/gmt/bin"
+
+
+def psmeca(cmt):
+
+ # Create a temporary directory and 'cd' there, so that '.gmt*'
+ # files get cleaned-up.
+ owd = os.getcwd()
+ workdir = mkdtemp()
+ os.chdir(workdir)
+ os.putenv("LD_LIBRARY_PATH", "/home/leif/opt/netCDF/lib")
+
+ # Spawn 'psmeca' to draw the beachball.
+ child = Popen3([join(gmt_bin, "psmeca"), '-R0/10/0/10', '-Jx1', '-G255/0/0', '-M', '-Sm1.7', '-L2', '-K', '-V', '-P'])
+ print >>child.tochild, "3 5 0 %f %f %f %f %f %f 1 0 0" % (
+ cmt.Mrr, cmt.Mtt, cmt.Mpp, cmt.Mrt, cmt.Mrp, cmt.Mtp)
+ child.tochild.close()
+
+ os.chdir(owd)
+
+ # Direct the PostScript output to a file.
+ ps = join(workdir, "beachball.ps")
+ stream = open(join(workdir, ps), 'w')
+ shutil.copyfileobj(child.fromchild, stream)
+ stream.close()
+ status = child.wait()
+ if not (os.WIFEXITED(status) and os.WEXITSTATUS(status) == 0):
+ raise Http404
+
+ # Convert the PostScript to a GIF file.
+ gif = join(workdir, "beachball.gif")
+ spawn("/usr/bin/convert",
+ '+antialias',
+ '-fill', '#00F', '-draw', 'color 0,0 floodfill', '-transparent', '#00F',
+ '-trim', '+repage',
+ ps, gif)
+
+ gif = open(gif, 'r')
+ shutil.rmtree(workdir)
+
+ return gif
+
+
+def spawn(*argv):
+ status = os.spawnvp(os.P_WAIT, argv[0], argv)
+ if status != 0:
+ raise Http404("%s: exit %d" % (argv[0], status))
+ return
Modified: cs/portal/trunk/seismo/SeismoWebPortal/models.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/models.py 2008-03-04 22:41:13 UTC (rev 11325)
+++ cs/portal/trunk/seismo/SeismoWebPortal/models.py 2008-03-05 04:41:09 UTC (rev 11326)
@@ -124,20 +124,9 @@
from math import log10
return 2.0 * (log10(self.scalarSeismicMoment()) - 16.1)/3.0
- def beachballUrl(self):
- mt = dict(
- mrr = "%.2f" % (self.Mrr * 1.0e-26),
- mtt = "%.2f" % (self.Mtt * 1.0e-26),
- mpp = "%.2f" % (self.Mpp * 1.0e-26),
- mrt = "%.2f" % (self.Mrt * 1.0e-26),
- mrp = "%.2f" % (self.Mrp * 1.0e-26),
- mtp = "%.2f" % (self.Mtp * 1.0e-26),
- )
- return "http://www.seismology.harvard.edu/cgi-bin/webCMTgif/form?mrr=%(mrr)s&mtt=%(mtt)s&mpp=%(mpp)s&mrt=%(mrt)s&mrp=%(mrp)s&mtp=%(mtp)s" % mt
-
def beachball(self):
- src = self.beachballUrl()
- return """<img class=beachball width=49 height=49 src="%s">""" % src
+ src = "/specfem3dglobe/events/sources/%d/beachball.gif" % self.id
+ return """<img class=beachball src="%s">""" % src
def cmtSolution(self):
from cmt import CMTSolution
Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html 2008-03-04 22:41:13 UTC (rev 11325)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/event_detail.html 2008-03-05 04:41:09 UTC (rev 11326)
@@ -1,5 +1,5 @@
-{% extends "SeismoWebPortal/objects.html" %}
+{% extends "SeismoWebPortal/events.html" %}
{% block content %}
Modified: cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html 2008-03-04 22:41:13 UTC (rev 11325)
+++ cs/portal/trunk/seismo/SeismoWebPortal/templates/SeismoWebPortal/home.html 2008-03-05 04:41:09 UTC (rev 11326)
@@ -16,7 +16,7 @@
<h3>quick start</h3>
-<p>To set-up a new simulation, proceed as follows:
+<p>To set up a new simulation, proceed as follows:
<ol>
<li>Click "Simulations".
Modified: cs/portal/trunk/seismo/SeismoWebPortal/urls.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/urls.py 2008-03-04 22:41:13 UTC (rev 11325)
+++ cs/portal/trunk/seismo/SeismoWebPortal/urls.py 2008-03-05 04:41:09 UTC (rev 11326)
@@ -174,11 +174,12 @@
(r'^events/sources/(?P<object_id>\d+)/edit/$', 'django.views.generic.create_update.update_object', source_create_update_args),
(r'^events/sources/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', source_delete_args),
(r'^events/sources/(?P<object_id>\d+)/CMTSOLUTION\.txt$', 'SeismoWebPortal.views.cmtsolution_txt'),
- (r'^events/sources/(?P<object_id>\d+)/beachball\.gif$', 'SeismoWebPortal.views.beachball_gif'),
+ (r'^events/sources/(?P<source_id>\d+)/beachball\.gif$', 'SeismoWebPortal.views.beachball_gif'),
(r'^events/(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', event_detail_args),
(r'^events/(?P<object_id>\d+)/edit/$', 'SeismoWebPortal.views.manipulate_event', dict(action='edit')),
(r'^events/(?P<object_id>\d+)/delete/$', 'django.views.generic.create_update.delete_object', event_delete_args),
(r'^events/(?P<object_id>\d+)/CMTSOLUTION\.txt$','SeismoWebPortal.views.event_detail_cmtsolution_txt'),
+ (r'^events/(?P<event_id>\d+)/beachball\.gif$', 'SeismoWebPortal.views.beachball_gif'),
(r'^events/(?P<object_id>\d+)/gearth\.kml$','SeismoWebPortal.views.event_detail_gearth'),
# stations
Modified: cs/portal/trunk/seismo/SeismoWebPortal/views.py
===================================================================
--- cs/portal/trunk/seismo/SeismoWebPortal/views.py 2008-03-04 22:41:13 UTC (rev 11325)
+++ cs/portal/trunk/seismo/SeismoWebPortal/views.py 2008-03-05 04:41:09 UTC (rev 11326)
@@ -741,10 +741,23 @@
extra_context = {'name': event.name},
)
-def beachball_gif(request, object_id):
- from models import Source
- source = get_object_or_404(Source, id=object_id)
- return HttpResponseRedirect(source.beachballUrl())
+def beachball_gif(request, event_id=None, source_id=None):
+ from models import Event, Source
+ from gmt import psmeca
+ import shutil
+
+ if event_id:
+ event = get_object_or_404(Event, id=event_id)
+ source = event.singleSource
+ if not Source:
+ raise Http404
+ else:
+ source = get_object_or_404(Source, id=source_id)
+ stream = psmeca(source)
+ response = HttpResponse(mimetype='image/gif')
+ shutil.copyfileobj(stream, response)
+ stream.close()
+ return response
def cmtsolution_txt(request, object_id):
from models import Source
More information about the cig-commits
mailing list