29
29
# @brief Plots a cross section between two @link common.Point Points @endlink.
30
30
#
31
31
# Generates a cross section that can either be saved as a file or displayed
32
- # to the user.
32
+ # to the user or differenced with another plot .
33
33
class CrossSection :
34
34
35
35
##
@@ -86,8 +86,15 @@ def __init__(self, startingpoint, endingpoint, meta={}):
86
86
self .floors = None
87
87
if 'vsfloor' in self .meta and 'vpfloor' in self .meta and 'densityfloor' in self .meta :
88
88
self .floors = self .meta ['vsfloor' ]+ "," + self .meta ['vpfloor' ]+ "," + self .meta ['densityfloor' ]
89
-
90
-
89
+
90
+ if 'scalemin' in self .meta and 'scalemax' in self .meta :
91
+ ## user supplied a fixed scale bounds
92
+ self .scalemin = float (self .meta ['scalemin' ])
93
+ self .scalemax = float (self .meta ['scalemax' ])
94
+ else :
95
+ self .scalemin = None
96
+ self .scalemax = None
97
+
91
98
## The CVM to use (must be installed with UCVM).
92
99
if 'cvm' in self .meta :
93
100
self .cvm = self .meta ['cvm' ]
@@ -147,7 +154,6 @@ def getplotvals(self, mproperty='vs'):
147
154
# print("total lat.."+ str(len(depth_list)))
148
155
149
156
u = UCVM (install_dir = self .installdir , config_file = self .configfile , z_range = self .z_range , floors = self .floors )
150
-
151
157
### MEI -- TODO, need to have separate routine that generates cross section datafile
152
158
if (self .datafile != None ) :
153
159
## Private number of x points.
@@ -157,10 +163,14 @@ def getplotvals(self, mproperty='vs'):
157
163
print ("\n Using -->" + self .datafile )
158
164
## print("expecting x "+str(self.num_x)+" y "+str(self.num_y))
159
165
160
- if self .datafile .rfind (".raw" ) != - 1 :
166
+
167
+ if self .datafile .rfind (".binary" ) != - 1 :
161
168
data = u .import_binary (self .datafile , self .num_x , self .num_y )
162
- else : ## ends in .bin
163
- data = u .import_np_float_array (self .datafile , self .num_x , self .num_y )
169
+ else :
170
+ if self .datafile .rfind (".raw" ) != - 1 :
171
+ data = u .import_raw_data (self .datafile , self .num_x , self .num_y )
172
+ else : ## with .bin file
173
+ data = u .import_np_float_array (self .datafile , self .num_x , self .num_y )
164
174
165
175
## this set of data is only for --datatype: either 'vs', 'vp', 'rho', or 'poisson'
166
176
## The 2D array of retrieved material properties.
@@ -178,6 +188,8 @@ def getplotvals(self, mproperty='vs'):
178
188
self .materialproperties [y ][x ].setProperty ('Poisson' ,tmp )
179
189
if (mproperty == 'vs' ):
180
190
self .materialproperties [y ][x ].setProperty ('Vs' ,tmp )
191
+
192
+ print ("\n Using --> " + self .datafile )
181
193
else :
182
194
data = u .query (point_list , self .cvm )
183
195
@@ -323,33 +335,43 @@ def plot(self) :
323
335
self .min_val = np .nanmin (newdatapoints )
324
336
self .mean_val = np .mean (newdatapoints )
325
337
326
- BOUNDS = u .makebounds ()
327
- TICKS = u .maketicks ()
338
+ # Set colormap and range
339
+ colormap = basemap .cm .GMT_seis
340
+
341
+ if self .scalemin != None and self .scalemax != None :
342
+ BOUNDS = u .makebounds (float (self .scalemin ), float (self .scalemax ), 5 )
343
+ TICKS = u .maketicks (float (self .scalemin ), float (self .scalemax ), 5 )
344
+ umax = round (self .scalemax )
345
+ umin = round (self .scalemin )
346
+ umean = round ((umax + umin )/ 2 )
347
+ else :
348
+ ## default BOUNDS are from 0 to 5
349
+ BOUNDS = u .makebounds ()
350
+ TICKS = u .maketicks ()
351
+ umax = round (self .max_val )
352
+ umin = round (self .min_val )
353
+ umean = round (self .mean_val )
328
354
329
355
if mproperty == "vp" :
330
356
BOUNDS = [bound * 1.7 for bound in BOUNDS ]
331
357
TICKS = [tick * 1.7 for tick in TICKS ]
332
358
333
- # Set default colormap and range
334
- colormap = basemap .cm .GMT_seis
335
- norm = mcolors .BoundaryNorm (BOUNDS , colormap .N )
336
-
337
- umax = round (self .max_val )
338
- if ( umax < 5 ) :
339
- umax = 5
340
- umin = round (self .min_val )
341
-
359
+ ## s, s_r 0,5 / scalemin,scalemax
360
+ ## sd umin,umax
361
+ ## b 0,5 / scalemin,scalemax
362
+ ## d, d_r 0,5 / scalemin,scalemax
363
+ ## dd umin,umax
342
364
if color_scale == "s" :
343
365
colormap = basemap .cm .GMT_seis
344
- norm = mcolors .Normalize (vmin = 0 ,vmax = umax )
366
+ norm = mcolors .Normalize (vmin = BOUNDS [ 0 ] ,vmax = BOUNDS [ len ( BOUNDS ) - 1 ] )
345
367
elif color_scale == "s_r" :
346
368
colormap = basemap .cm .GMT_seis_r
347
- norm = mcolors .Normalize (vmin = 0 ,vmax = umax )
369
+ norm = mcolors .Normalize (vmin = BOUNDS [ 0 ] ,vmax = BOUNDS [ len ( BOUNDS ) - 1 ] )
348
370
elif color_scale == "sd" :
349
- BOUNDS = u .makebounds (self .min_val , self .max_val , 5 , self .mean_val , substep = 5 )
350
371
colormap = basemap .cm .GMT_seis
351
- TICKS = u .maketicks (self .min_val , self .max_val , 5 )
352
- norm = mcolors .Normalize (vmin = self .min_val ,vmax = self .max_val )
372
+ BOUNDS = u .makebounds (umin , umax , 5 , umean , substep = 5 )
373
+ TICKS = u .maketicks (umin , umax , 5 )
374
+ norm = mcolors .Normalize (vmin = BOUNDS [0 ],vmax = BOUNDS [len (BOUNDS ) - 1 ])
353
375
elif color_scale == "b" :
354
376
C = []
355
377
for bound in BOUNDS :
@@ -366,13 +388,17 @@ def plot(self) :
366
388
colormap = pycvm_cmapDiscretize (basemap .cm .GMT_seis_r , len (BOUNDS ) - 1 )
367
389
norm = mcolors .BoundaryNorm (BOUNDS , colormap .N )
368
390
elif color_scale == 'dd' :
369
- BOUNDS = u .makebounds (self . min_val , self . max_val , 5 , self . mean_val , substep = 5 )
370
- TICKS = u .maketicks (self . min_val , self . max_val , 5 )
391
+ BOUNDS = u .makebounds (umin , umax , 5 , umean , substep = 5 )
392
+ TICKS = u .maketicks (umin , umax , 5 )
371
393
colormap = pycvm_cmapDiscretize (basemap .cm .GMT_seis , len (BOUNDS ) - 1 )
372
394
norm = mcolors .BoundaryNorm (BOUNDS , colormap .N )
373
395
else :
374
396
print ("ERROR: unknown option for colorscale." )
375
-
397
+
398
+ if 'difference' in self .meta :
399
+ bwr = cm .get_cmap ('bwr' )
400
+ colormap = pycvm_cmapDiscretize (bwr , len (BOUNDS ) - 1 )
401
+
376
402
377
403
## MEI, TODO this is a temporary way to generate an output of a cross_section input file
378
404
if ( self .datafile == None ):
@@ -412,7 +438,10 @@ def plot(self) :
412
438
if (mproperty .title () == "Density" ) :
413
439
cbar .set_label (mproperty .title () + " (g/cm^3)" )
414
440
else :
415
- cbar .set_label (mproperty .title () + " (km/s)" )
441
+ if 'difference' in self .meta :
442
+ cbar .set_label (mproperty .title () + " (km)" )
443
+ else :
444
+ cbar .set_label (mproperty .title () + " (km/s)" )
416
445
else :
417
446
cbar .set_label ("Poisson(Vs,Vp)" )
418
447
0 commit comments