[gmx-users] for help about reading xtc file

Mark Abraham mark.j.abraham at gmail.com
Fri Aug 16 19:41:26 CEST 2013


It can be done either way. Whether to do it is up to you. The compiler
is obviously reporting that your attempt to duplicate the code wasn't
far-reaching enough. I suggest that extending the interface in the
header file to return the position, and also to seek to a given
position is a much better approach than duplication. Now your new code
can work where the opaque structs are not intended to be opaque... If
it works well, you can contribute it back for others. But a crude hack
will stay un-reused :-)

Mark

On Fri, Aug 16, 2013 at 7:02 PM, Xu, Yechuan <y.xu at neu.edu> wrote:
> If the xdrfile library can't do what I want, writing out
> the frames is an alternative. I know that the MDAnalysis
> has modified the xdrfile library to do seeking xtc file.
> But it seems that they do a python wrapper.
>
> Thanks,
> YC
>
> On Aug 16, 2013, at 12:35 PM, Mark Abraham wrote:
>
>> That's only worth bothering with if you'll do that re-read several
>> times. Is writing out the frame(s) of interest a better solution?
>>
>> Mark
>>
>> On Fri, Aug 16, 2013 at 6:25 PM, Xu, Yechuan <y.xu at neu.edu> wrote:
>>> Yes, I realized that it is a opaque structure.
>>> I just want to read a certain frame from the
>>> xtc file. For example, last time I read the xtc
>>> file to a certain frame, I want to recorde the
>>> position and next time I can read the xtc file
>>> from there, not from beginning.
>>>
>>> Did anybody do that?
>>>
>>> Thanks,
>>> YC
>>>
>>> On Aug 16, 2013, at 4:39 AM, Mark Abraham wrote:
>>>
>>>> On Thu, Aug 15, 2013 at 11:33 PM, Xu, Yechuan <y.xu at neu.edu> wrote:
>>>>> Thank you for your reply. after I read the xdrfile.c,
>>>>>
>>>>> I changed the sentence as
>>>>> pos=xdr_getpos((XDR*) (xtc->xdr));
>>>>>
>>>>> like that in the file of xdrfile.c. I also copy the definition
>>>>> for XDR and xdr_op to my own code.
>>>>
>>>> You can see those functions, but the fact that there's an opaque
>>>> struct is a clue you're not supposed to want to use them. Your code
>>>> has already read the frame using the public interface in
>>>> xdrfile_xtc.h. What else are you trying to achieve?
>>>>
>>>> Mark
>>>>
>>>>> But I still got the errors:
>>>>> seekxtc.c:61:33: error: dereferencing pointer to incomplete type
>>>>>      pos=xdr_getpos((XDR *)(xtc->xdr));
>>>>>                                                       ^
>>>>>
>>>>> here are my code:
>>>>> #include <stdio.h>
>>>>> #include <stdlib.h>
>>>>> #include <math.h>
>>>>> #include <xdrfile_xtc.h>
>>>>>
>>>>> enum xdr_op
>>>>> {
>>>>>  XDR_ENCODE = 0,
>>>>>  XDR_DECODE = 1,
>>>>>  XDR_FREE   = 2
>>>>> };
>>>>>
>>>>> typedef struct XDR XDR;
>>>>>
>>>>> struct XDR
>>>>> {
>>>>>  enum xdr_op x_op;
>>>>>  struct xdr_ops
>>>>>  {
>>>>>     int (*x_getlong) (XDR *__xdrs, int32_t *__lp);
>>>>>     int (*x_putlong) (XDR *__xdrs, int32_t *__lp);
>>>>>     int (*x_getbytes) (XDR *__xdrs, char *__addr, unsigned int __len);
>>>>>     int (*x_putbytes) (XDR *__xdrs, char *__addr, unsigned int __len);
>>>>>     /* two next routines are not 64-bit IO safe - don't use! */
>>>>>     unsigned int (*x_getpostn) (XDR *__xdrs);
>>>>>     int (*x_setpostn) (XDR *__xdrs, unsigned int __pos);
>>>>>     void (*x_destroy) (XDR *__xdrs);
>>>>>  }
>>>>>  *x_ops;
>>>>>  char *x_private;
>>>>> };
>>>>>
>>>>>
>>>>> int main(int argc, char *argv[])
>>>>> {
>>>>>  int i;
>>>>>  int step, read_return, result;
>>>>>  int natoms;
>>>>>  float time,prec=1000.;
>>>>>  matrix box;
>>>>>  rvec *x;
>>>>>  XDRFILE *xtc;
>>>>>  char *fname;
>>>>>  unsigned int pos;
>>>>>
>>>>>  printf("begin, argc=%d\n",argc);
>>>>>  if(argc==2){
>>>>>     fname=argv[1];
>>>>>  }
>>>>>
>>>>>  xtc=xdrfile_open (fname,"r");
>>>>>  read_xtc_natoms (fname,&natoms);
>>>>>  printf("number of atoms: %d\n",natoms);
>>>>>
>>>>>  x = calloc(natoms, sizeof (x[0]));
>>>>>
>>>>>  while(1){
>>>>>     read_return=read_xtc(xtc,natoms,&step,&time,box,x,&prec);
>>>>>     if (read_return!=0) break;
>>>>>
>>>>>     pos=xdr_getpos((XDR *)(xtc->xdr));
>>>>>     printf("%d\n",pos);
>>>>>
>>>>>  }
>>>>>
>>>>>  xdrfile_close (xtc);
>>>>> }
>>>>> Thanks,
>>>>> YC
>>>>>
>>>>>
>>>>> On Aug 15, 2013, at 3:09 PM, Mark Abraham wrote:
>>>>>
>>>>>> Right, because a pointer to an XDRFILE is neither a struct nor a union
>>>>>> :-) Look at how these routines are used, and consult the header files
>>>>>> for the right types to give them.
>>>>>>
>>>>>> Mark
>>>>>>
>>>>>> On Thu, Aug 15, 2013 at 7:29 PM, Xu, Yechuan <y.xu at neu.edu> wrote:
>>>>>>> Hi Everyone,
>>>>>>>
>>>>>>> I want to read a certain frame in a xtc file. How can I do that?
>>>>>>> I see there are xdr_getpos() and xdr_setpos(). How should I use
>>>>>>> these functions?
>>>>>>>
>>>>>>> I tried:
>>>>>>>
>>>>>>> XDRFILE *xtc;
>>>>>>> unsigned int pos;
>>>>>>>
>>>>>>> pos=xdr_getpos(xtc.xdr);
>>>>>>>
>>>>>>> but I got:
>>>>>>> error: request for member ‘xdr’ in something not a structure or union
>>>>>>>
>>>>>>> Thanks in advance.
>>>>>>> YC--
>>>>>>> gmx-users mailing list    gmx-users at gromacs.org
>>>>>>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>>>>>>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>>>>>>> * Please don't post (un)subscribe requests to the list. Use the
>>>>>>> www interface or send it to gmx-users-request at gromacs.org.
>>>>>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>>>>>> --
>>>>>> gmx-users mailing list    gmx-users at gromacs.org
>>>>>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>>>>>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>>>>>> * Please don't post (un)subscribe requests to the list. Use the
>>>>>> www interface or send it to gmx-users-request at gromacs.org.
>>>>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>>>>>
>>>>> --
>>>>> gmx-users mailing list    gmx-users at gromacs.org
>>>>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>>>>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>>>>> * Please don't post (un)subscribe requests to the list. Use the
>>>>> www interface or send it to gmx-users-request at gromacs.org.
>>>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>>>> --
>>>> gmx-users mailing list    gmx-users at gromacs.org
>>>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>>>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>>>> * Please don't post (un)subscribe requests to the list. Use the
>>>> www interface or send it to gmx-users-request at gromacs.org.
>>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>>>
>>> --
>>> gmx-users mailing list    gmx-users at gromacs.org
>>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>>> * Please don't post (un)subscribe requests to the list. Use the
>>> www interface or send it to gmx-users-request at gromacs.org.
>>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>> --
>> gmx-users mailing list    gmx-users at gromacs.org
>> http://lists.gromacs.org/mailman/listinfo/gmx-users
>> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
>> * Please don't post (un)subscribe requests to the list. Use the
>> www interface or send it to gmx-users-request at gromacs.org.
>> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists
>
> --
> gmx-users mailing list    gmx-users at gromacs.org
> http://lists.gromacs.org/mailman/listinfo/gmx-users
> * Please search the archive at http://www.gromacs.org/Support/Mailing_Lists/Search before posting!
> * Please don't post (un)subscribe requests to the list. Use the
> www interface or send it to gmx-users-request at gromacs.org.
> * Can't post? Read http://www.gromacs.org/Support/Mailing_Lists



More information about the gromacs.org_gmx-users mailing list