|
From: Leonhard H. <Leo...@ur...> - 2017-03-01 09:19:32
|
Hi Thomas,
Thank you for your answer! Your solution works great!
It's very handy to directly set RGB colors using alter!
Thanks for your help!
Best,
Leonhard
On 28.02.2017 16:41, Thomas Holder wrote:
> Hi Leonhard,
>
> Very interesting analysis. I'm wondering if this slowdown actually scales with number of objects or rather total number of atoms.
>
> If your color scheme lookup by (object, resi) key is fast in Python (let's say you have it all in a dictionary), then you can use cmd.alter() with a single pass, which probably will be faster than cmd.color() in multiple passes. Example:
>
> colors = {
> 'obj1': {
> 1: 0xFF0000,
> 2: 0x333300,
> 3: 0x000066,
> },
> 'obj2': {
> 1: 0x001234,
> 2: 0x121212,
> 3: 0x009900,
> },
> }
>
> cmd.alter('all', 'color = 0x40000000 | colors[model][resv]', space={'colors': colors})
> cmd.recolor()
>
> The magic number 040000000 is the cColor_TRGB_Bits mask which tells PyMOL that this is not a color index, but an RGB color.
>
> Instead of a dictionary lookup, you may also use a callback function.
>
> Check out these examples for alter with space argument:
> https://pymolwiki.org/index.php/Iterate#.22space.22_argument
>
> Cheers,
> Thomas
>
> On 28 Feb 2017, at 09:34, Leonhard Heizinger <Leo...@ur...> wrote:
>
>> Hi,
>> coloring a certain residue in an object takes about 4 ms when only one
>> object is loaded in PyMol:
>>
>> %time cmd.color("blue", "obj1of1 and resi 1")
>> CPU times: user 3.33 ms, sys: 0 ns, total: 3.33 ms
>> Wall time: 4.13 ms
>>
>> Performing the same operation when a lot of other objects (~300) are
>> loaded results in a highly increased execution time:
>>
>> %time cmd.color("blue", "obj1of300 and resi 1")
>> CPU times: user 243 ms, sys: 0 ns, total: 243 ms
>> Wall time: 234 ms
>>
>> This is 60-fold increment compared to a PyMol Session with only one
>> object loaded. All structures in this example have ~240 residues.
>>
>> Consequently, coloring each residue of 300 objects in an individual
>> color would take more then 4.5 hours on my machine. Of course this use
>> case is pretty unlikely.
>>
>> In my case I only have limited number of colors (255 colors gradient)
>> which each residue could obtain. So I'm thinking about executing
>> cmd.color for each color (255 times), which should be faster. However
>> I'd still prefer to apply cmd.color per residue, so I don't have to
>> define bulky selections per color.
>>
>> Is there some way to accomplish this in a reasonable amount of time?
>> Thanks!
>>
>> Best,
>>
>> Leonhard
|