Re: [AMBER] pytraj distance image

From: Antoine MARION <>
Date: Tue, 26 Feb 2019 13:29:02 +0300

Dear Hai,

Thanks a lot for your prompt answers and interest.
Sharing the files I am working on won’t be possible, but I can try to be more explicit.

I initially wrote a long email with details of my trials and ran a final one which actually changes my question. I’ll try to summarize it.

The box is a truncated octahedron with the following dimensions as read from my initial structure:
73.9541653 73.9541653 73.9541653 109.4712190 109.4712190 109.4712190

Here is the result of “print traj” for a trajectory loaded with “pt.iterload()":
pytraj.TrajectoryIterator, 50 frames:
Size: 0.000000 (GB)
<Topology: 41210 atoms, 10153 residues, 10135 mols, PBC with box type = truncoct>

With cpptraj:
distance .573 .284 out dist.dat
result: 38.94 …
This is the result I would expect from visual inspection of the structures.

With pytraj, I initially wanted to use the an array to define the mask, because I will have many to compute at the same time and this will potentially change from one system to another. Here is what I did:
traj = pt.iterload(traj_file, parm_file)
dist = pt.distance(traj, top =, mask = [[572, 283]], image = True)
result: 73.14 …
This seems way too large, especially considering the dimensions of the box.

Now if I load the trajectory with pt.load() instead of pt.iterload() (which won’t be convenient for huge trajectories, right?), I get the same result as cpptraj:
traj = pt.load(traj_file, parm_file)
traj = pt.autoimage(traj)
dist = pt.distance(traj, top =, mask = [[572, 283]], image = True)
result: 38.94 …

I also tried your suggestion with pt.compute(), without imaging first, and this gives the expected result:
traj = pt.iterload(traj_file, parm_file)
dist = pt.compute(“distance .573 .284”, traj)
result: 38.94 …

But finally, I tried another way to define the mask with the pt.distance command and this surprisingly (or not) gave me the result I am looking for:
traj = pt.iterload(traj_file, parm_file)
dist = pt.distance(traj, top =, mask = "@573 @284”, image = True)
result: 38.94 …

So here is a better statement of my new issue:
 [[572, 283]] and ".573 .284” are not equivalent in the pt.distance() command regarding imaging. But as you can see above, on an imaged trajectory, both give the same result.
Notice that mask = ".573 .284” and mask = ["@573 @284”] yield the same result (if that can help).
And similarly, mask = [572, 283] and mask = [[572, 283]] are also equivalent.

The usage with a mask defined as an array of atom indices (with potentially many pairs) would be more convenient for me, although I could find an easy way to work with the masks defined as strings. I might have done something wrong with it, or misunderstood its usage.

I hope I was clear enough. Don’t hesitate to ask for more details.
If needed, I will try to prepare a sample system to better illustrate the issue.

For future, would it be more convenient for you if I open a thread directly on GitHub or on this mailing list?

Thanks again for your help.

All the best,

> On 26 Feb 2019, at 02:47, Hai Nguyen <> wrote:
> On Mon, Feb 25, 2019 at 10:54 AM Antoine MARION <> wrote:
>> Dear Amber Community,
>> However, I faced a first little issue when calculating distances with
>> PBCs: i.e., minimum image is not applied and the “image” option seems to be
>> ignored.
> Hi again, I've double-checked pytraj's code and ran some tests and its code
> seems to work fine.
> Could you please send me (may be offline):
> - small trajectory + its topology file (prefer non-confidential files).
> - your exact command
> - your expectation (why you think the minimum image is not applied (e.g: by
> comparing to cpptraj or by visualizing? ...).
> Thanks.
> Hai
> _______________________________________________
> AMBER mailing list

AMBER mailing list
Received on Tue Feb 26 2019 - 02:30:01 PST
Custom Search