[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