[Chimera-users] alter volume data with python

Tom Goddard goddard at cgl.ucsf.edu
Tue Feb 2 11:39:17 PST 2010


Hi Michael,

  Your code almost does the job.  The line

    H = em.full_matrix()

gets the actual data array that Chimera is using, not a copy of it.  So 
your loop is modifying the only copy of the data in memory.  But there 
is a problem with this.  Chimera currently does not support modifying 
map values that come from a file.  (It only reads parts of the map from 
the file on-demand, and later deletes them from memory when not needed.  
This caching can't handle modifying values.)  You have to make an 
in-memory copy of the map to do that.

  So do this.

    emc = em.writable_copy()
    H = emc.full_matrix()

    # Your thresholding code here.

    emc.data.values_changed()

That last "values_changed()" call will cause the graphics and histogram 
to update.  To save the map to a file:

    emc.write_file('newfile.mrc')

  The "vop" (volume operation ) command should do this simple 
thresholding though it currently doesn't.  I've added that to our 
feature request list.

    http://plato.cgl.ucsf.edu/trac/chimera/wiki/requests

    http://www.cgl.ucsf.edu/chimera/docs/UsersGuide/midas/vop.html

Elaine's tricky masking suggestion would probably work.  Make two 
contour surfaces (ctrl click on histogram to make second one.  Then use 
the mask command to zero everything outside of those.  Then use "vop 
scale" to shift the map as you have in your code.

  Tom


-------- Original Message --------
Subject: [Chimera-users] alter volume data with python
From: Michael Zimmermann <michaelz at iastate.edu>
To: chimera users <chimera-users at cgl.ucsf.edu>
Date: 2/1/10 6:26 PM
> Dear Chimera users,
>
> I cannot find a way to search the chimera-users archive, so I
> appologize if this has been asked already.  I wish to alter some
> volume data in specific ways; delete (zero out) all volume values that
> do not meet certain density criteria.  The following code modifies the
> matrix values, but I can't figure out how to update the map that is
> being displayed in the volume viewer.
>
> I would like to be able to do something like:
> opened[0].full_matrix = H
> Then I would only see the swath that I "selected" with the following code.
>
> # ------------------------------------------------------------------------
> source = '1R0A_antigen_6A_8s_0.425f_inv.mrc'
> opened = chimera.openModels.open(source)
> em = opened[0]
> H = em.full_matrix()
> s = H.shape
> for k in range(0,s[2]-1):
> 	for i in range(0,s[0]-1):
> 		for j in range(0,s[1]-1):
> 			if(H[i,j,k] >= -.28) and (H[i,j,k] <= -0.001):
> 				H[i,j,k] = H[i,j,k]+1
> 			else:
> 				H[i,j,k] = 0
>
> # ------------------------------------------------------------------------
>
> Thank you,
>
>   




More information about the Chimera-users mailing list