<div dir="ltr">Hi Noel,<div><br></div><div>I think you've summed up the state of MVTFs quite well.  It is correct that currently you can not simultaneously render two fields with two different colormaps, and it is also correct that somewhere along the way MVTFs went haywire.  I'll put this on my fix todo-list though I'm not sure when I'll be able to address it.  </div>

<div><br></div><div>As for blending two renders together, I had done something like this a long time ago by reading in two .png's and combining them like so: <a href="http://paste.yt-project.org/show/2120/">http://paste.yt-project.org/show/2120/</a>.  This is a fairly old script, but you can get the idea of what it is trying to do by putting one image in front of the other. Since the introduction of grey_opacity, there is a fourth (alpha) channel, so you could even blend two images according to fairly standard methods: go to the Alpha blending section of <a href="http://en.wikipedia.org/wiki/Alpha_compositing">http://en.wikipedia.org/wiki/Alpha_compositing</a>.  We use this for blending grid and domain lines.</div>

<div><br></div><div>I've assigned the issue to me, but if anyone else wants to take a crack at fixing the grey_opacity issue in MVTF, go for it.  I expect to have time sometime in the next week, but I'm in the process of finding a place to live so my schedule is fairly unknown.</div>

<div><br></div><div>Best,</div><div>Sam</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Aug 2, 2013 at 10:05 AM, Noel Scudder <span dir="ltr"><<a href="mailto:noel.scudder@stonybrook.edu" target="_blank">noel.scudder@stonybrook.edu</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Hi Stella and Cameron,</div><div><br></div>Great, this looks like an easy solution. I'll have to try this out soon. Thanks for your feedback!<span class="HOEnZb"><font color="#888888"><div>

<br></div></font></span><div><span class="HOEnZb"><font color="#888888">-Noel</font></span><div><div class="h5"><br><br><div class="gmail_quote">On Thu, Aug 1, 2013 at 5:13 PM, Stella Offner <span dir="ltr"><<a href="mailto:offner@gmail.com" target="_blank">offner@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Noel,<div><br></div><div>That sounds like a lot of fun! I've been making crude bivariate volume renderings simply by adding the snapshots together:</div>


<div><div><br></div><div>vals = cam.snapshot()</div></div><div>
<div>vals2 = cam2.snapshot()</div><div>valssum = vals+vals2</div>write_bitmap(valssum, imfile)</div><div><br></div><div>This seems to work ok if the transfer functions are not overlapping too much. Sometimes some weighting is required in the addition to avoid changing the colors too much. The MultiVariateTransferFunction will be great improvement on this.</div>



<div><br></div><div>Cheers,</div><div>Stella</div><div><div><div><br><div class="gmail_quote">On Thu, Aug 1, 2013 at 4:53 PM, Noel Scudder <span dir="ltr"><<a href="mailto:noel.scudder@stonybrook.edu" target="_blank">noel.scudder@stonybrook.edu</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>Hi all,</div><div><br></div><div>Over the past few days I've been investigating the MultiVariateTransferFunction and receiving feedback from Matt. Since it needs some updating and the documentation is so vague, I thought I'd try to outline the basic flow and idea of an MVTF (thanks to Matt for his outline), address a couple problems that have been noticed, and give an example script with images. Please feel free to correct my mistakes, ask questions, and add your own knowledge!</div>




<div><br></div><div>The code for the MVTF is in yt/visualization/volume_rendering/transfer_functions.py . It's also useful to check out the Planck and Color Transfer Functions in the same file.</div><div><br></div><div>




With a CTF, you are limited to one field, which is linked identically to each of the RGB color channels and an alpha channel. However, an MVTF allows you to set up different fields that control each channel and each channel's opacity through the use of standard Transfer Functions. For instance, I could link the red color channel and the red alpha channel to Density, the blue and blue alpha channels to Temperature, and the green and green alpha channels to Kinetic Energy.</div>




<div>It is important to note that only *one* field (and associated transfer function) may be linked to any channel. This limits the number of variables one can conceivably include to three. </div><div><br></div><div>When an MVTF is created, it sets up a few variables:</div>




<div><br></div><div>n_field_tables</div><div>tables</div><div>field_ids</div><div>weight_field_ids</div><div>field_table_ids</div><div>weight_table_ids</div><div>grad_field</div><div>light_source_v</div><div><br></div><div>




The important ones here are tables, field_ids, weight_field_ids, field_table_ids, and weight_table_ids.</div><div>After creating your MVTF, the first thing you must do is create a TransferFunction, which has some range and number of bins. This can then be added as a "table" to your MVTF using add_field_table, which accepts the table, the field_id used for interpolating on the x-axis of this table, a weight_field_id, and/or a weight_table id.</div>




<div>The field_id is *not* the field index you get from pf.h.field_indexes . Here, the field_id actually specifies the index of a certain field in the field list you supply to the camera object. For instance, if I gave the camera </div>




<div><br></div><div>fields=['density', 'Temp']</div><div><br></div><div>I would have previously called add_field_table using a field_id of 0 for the TransferFunctions I wanted for density, and using a field_id of 1 for the TransferFunctions I wanted for temperature.</div>




<div>The same specification with the field_id goes for weight_field_id, which is used if the field itself should be a weighting factor for the emission/absorption (although this does not do scaling, so you will likely need to supply a pre-scaled field).</div>




<div>By supplying a weight_table_id, you are taking the results of interpolation along the x-axis to get a y value from *another* field table and using that as a weight.<br></div><div><br></div><div>*Apparently density is typically logged by default. If you want to use it as a weight, you probably want it un-logged.</div>




<div><br></div><div>At this point you have added all of your field tables. The second step is to link the field tables to the channels you want. Right now, all you have is a set of "tables," TransferFunctions that describe how to get a value out as a combination of:</div>




<div><br></div><div>1) The y-value interpolated along the x-axis defined by the table</div><div>2) The weighting from a given field</div><div>3) The weighting from a given field_table (i.e., if you had some scaling that was a function of temperature)</div>




<div><br></div><div>On its own, a table will do nothing--you must link it to a channel. These are, in order, RGB and aR, aG, aB. You use the link_channels function for this purpose, for instance linking table 0 to channel 0 (R). When linking channels, there are a couple things to keep in mind. The two arguments you supply are the  table_id and the channel, both <i>integers </i>(seems like a common theme for MVTF stuff :-) ). The channel can be integers 0-5, assigned in the order above. The table_id is a bit more nebulous: a table_id is assigned to a table when it is created, meaning that the first table you create using add_field_table will have a table_id of 0, the next will have a table_id of 1, and so on. Although you cannot link more than one table to a channel, you can have more than one channel linked to a single table--simply supply a list in place of an integer for the channel argument.</div>




<div><br></div><div>Finally, don't leave your TransferFunctions empty! Add some gaussians, keeping in mind the channel and field each TF uses. After that your MVTF will be ready, and you can supply it to the camera object like any other transfer function and take a snapshot. </div>




<div><br></div><div>Here's a example script: <a href="http://pastebin.com/NC4pHPR7" target="_blank">http://pastebin.com/NC4pHPR7</a></div><div><br></div><div>Which creates this image: <a href="http://i.imgur.com/EKv943G.png" target="_blank">http://i.imgur.com/EKv943G.png</a></div>




<div><br></div><div>The main problem I've been noticing is with the grey_opacity, which was already discussed--apparently the MVTF was never updated after opaque volume rendering was implemented. Although by default an MVTF doesn't have a grey_opacity attribute and yt will complain about this, you can placate the beast by supplying </div>




<div><br></div><div>mv.grey_opacity=False</div><div><br></div><div>anyway. If you set grey_opacity to True, however, odd things will happen, which I suspect is simply due to the MVTF not having been updated for opaque rendering yet: <a href="http://i.imgur.com/rrOnbgy.png" target="_blank">http://i.imgur.com/rrOnbgy.png</a></div>




<div>I think that about sums up my two cents on the MVTF.</div><div><br></div><div><br></div><div>Finally, my original desire was to have two different ColorTransferFunctions with two different fields rendered by one camera at once. In other words, simultaneously render two different colormaps applied to two different fields. Right now this isn't possible in yt (although Matt thinks it may be somewhat straightforward to implement), so I came up with a makeshift way, where I render one TF for the first field without a background and the second TF for the second field <i>with</i> a background, and then overlay them using ImageMagick:</div>




<div><br></div><div>im.write_png('transparent_temp.png', background=None)</div><div>...</div><div>im2.write_png('dens_and_background.png')</div>os.system('composite transparent_temp.png dens_and_background.png multi.png')<div>




<br></div><div>However, it's expensive, and it goes outside yt. Does anyone know if there's a way to combine these images without leaving yt?</div><div><br></div><div>Thanks for reading!</div><div><br></div><div>



-Noel<br>
<div><br><div class="gmail_quote">On Tue, Jul 30, 2013 at 1:03 PM, Sam Skillman <span dir="ltr"><<a href="mailto:samskillman@gmail.com" target="_blank">samskillman@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




<p dir="ltr">Hi all, <br>
The multivariate tf could use both some updating and documentation. I'm offline for the next few days but if it hasn't been fixed by next week I can take a look.</p><span><font color="#888888">
<p dir="ltr">Sam</p>
</font></span><div class="gmail_quote"><div><div>On Jul 30, 2013 8:40 AM, "Nathan Goldbaum" <<a href="mailto:nathan12343@gmail.com" target="_blank">nathan12343@gmail.com</a>> wrote:<br type="attribution">




</div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>
Hi Noel,<div><br></div><div>I believe this is a bug that needs to be fixed.  It seems MultiVariateTransferFunction was never updated after opaque volume rendering was added.</div><div><br></div><div>Can you please open a new issue about this? <span></span></div>






<div><br></div><div>Nathan<br><br>On Tuesday, July 30, 2013, Noel Scudder  wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi all,<div><br></div><div>I'm attempting to visualize multiple variables in the same volume rendering. For instance, I'd like to show some density surfaces of a star and then get temperature overlayed to show hotspots. I found the MultiVariateTransferFunction, but it is unfortunately not particularly well documented yet, and I'm being repeatedly thwarted. I'm not sure if I've set it up correctly, or how to go from the transfer function to an image. Here's my current script, using just one variable for now:</div>







<div><br></div><div>#----------------------------------</div><div>from yt.mods import *</div><div>pf = load('plt00100')</div><div><div><br></div><div>#<some constants></div><div>        </div><div>pf.h</div>







<div>pf.field_info['density'].take_log=True</div><div><br></div><div>mv = MultiVariateTransferFunction()</div><div>        </div><div>tf = TransferFunction((mi-1, ma+1), nbins=1.0e6)</div></div><div>tf.add_gaussian(np.log10(9.0e5), 0.01, 1.0)</div>







<div><br></div><div>mv.add_field_table(tf, 0)</div><div>mv.link_channels(0, [0,1,2,3])</div><div><br></div><div>c = [5.0e9, 5.0e9, 5.0e9]</div><div>L = [0.15, 1.0, 0.40]</div><div>W = wi*0.7</div><div>Nvec = 1024</div><div>







<br></div><div><div>cam = pf.h.camera(c, L, W, (Nvec,Nvec), transfer_function = mv,</div><div>                             fields=['density'], pf=pf, no_ghost=True)</div></div><div><br></div><div>im = cam.snapshot(num_threads=4)</div>







<div><br></div><div>im.write_png('plt00100.png' )</div><div>#----------------------------------</div><div><br></div><div>I checked to make sure density is indeed my 0-index field. I get the following error after ray casting:</div>







<div><br></div><div><div>Traceback (most recent call last):</div><div>  File "<stdin>", line 1, in <module></div><div>  File "multivol.py", line 153, in <module></div><div>    im = cam.snapshot(num_threads=4)</div>







<div>  File "/home/noel/shocks/yt-x86_64/src/yt-hg/yt/visualization/volume_rendering/camera.py", line 742, in snapshot</div><div>    image, sampler),</div><div>  File "/home/noel/shocks/yt-x86_64/src/yt-hg/yt/visualization/volume_rendering/camera.py", line 632, in _render</div>







<div>    image = self.finalize_image(image)</div><div>  File "/home/noel/shocks/yt-x86_64/src/yt-hg/yt/visualization/volume_rendering/camera.py", line 611, in finalize_image</div><div>    if self.transfer_function.grey_opacity is False:</div>







<div>AttributeError: 'MultiVariateTransferFunction' object has no attribute 'grey_opacity'</div></div><div><br></div><div><br></div><div>Can I not use snapshot in this case, or is something else the matter entirely?</div>







<div><br></div><div>Thanks,</div><div>Noel Scudder</div>
</blockquote></div>
<br></div></div><div>_______________________________________________<br>
yt-users mailing list<br>
<a href="mailto:yt-users@lists.spacepope.org" target="_blank">yt-users@lists.spacepope.org</a><br>
<a href="http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org</a><br>
<br></div></blockquote></div>
<br>_______________________________________________<br>
yt-users mailing list<br>
<a href="mailto:yt-users@lists.spacepope.org" target="_blank">yt-users@lists.spacepope.org</a><br>
<a href="http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org</a><br>
<br></blockquote></div><br></div></div>
<br>_______________________________________________<br>
yt-users mailing list<br>
<a href="mailto:yt-users@lists.spacepope.org" target="_blank">yt-users@lists.spacepope.org</a><br>
<a href="http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org</a><br>
<br></blockquote></div><br></div>
</div></div><br>_______________________________________________<br>
yt-users mailing list<br>
<a href="mailto:yt-users@lists.spacepope.org" target="_blank">yt-users@lists.spacepope.org</a><br>
<a href="http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org</a><br>
<br></blockquote></div><br></div></div></div>
<br>_______________________________________________<br>
yt-users mailing list<br>
<a href="mailto:yt-users@lists.spacepope.org">yt-users@lists.spacepope.org</a><br>
<a href="http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org" target="_blank">http://lists.spacepope.org/listinfo.cgi/yt-users-spacepope.org</a><br>
<br></blockquote></div><br></div>