Amber-MD / pytraj

Python interface of cpptraj
https://amber-md.github.io/pytraj
168 stars 38 forks source link

segmentation fault with writting ccp4 format #1280

Closed hainm closed 8 years ago

hainm commented 8 years ago
import pytraj as pt
from pytraj.core.c_core import Command
from pytraj import CpptrajState

# data is DatasetGridFloat
data = pt.io.read_data('fav8.guv.O.1.ccp4',
                       options='name MyCcp4')[0]

state = CpptrajState()

# add DatasetGridFloat to CpptrajState's DataSetList
state.data.add(dtype=data.dtype, name=data.key)

# add data to DataSet
state.data[0].data = data.values
print(state)

data = state.data[0]
print(data.key, data.dtype, data.values[0])

# create cpptraj command
filename = 'test.ccp4'
options = ''
line = ' '.join(('writedata', filename, data.key, options))
# line is: writedata test.ccp4 MyCcp4

# dispatch
pt._verbose()
with Command() as cm:
    cm.dispatch(state, line)
hainm commented 8 years ago

trace

Program received signal SIGSEGV, Segmentation fault.
0x00002aaaaeddeb2a in DataIO_CCP4::WriteSet3D(__gnu_cxx::__normal_iterator<DataSet* const*, std::vector<DataSet*, std::allocator<DataSet*> > > const&, CpptrajFile&) ()
   from /u1/haichit/pytraj_git/pytraj/cpptraj/lib/libcpptraj.so
(gdb) bt
#0  0x00002aaaaeddeb2a in DataIO_CCP4::WriteSet3D(__gnu_cxx::__normal_iterator<DataSet* const*, std::vector<DataSet*, std::allocator<DataSet*> > > const&, CpptrajFile&) ()
   from /u1/haichit/pytraj_git/pytraj/cpptraj/lib/libcpptraj.so
#1  0x00002aaaaeddf541 in DataIO_CCP4::WriteData(FileName const&, DataSetList const&) () from /u1/haichit/pytraj_git/pytraj/cpptraj/lib/libcpptraj.so
#2  0x00002aaaaedd8fe3 in DataFile::WriteDataOut() () from /u1/haichit/pytraj_git/pytraj/cpptraj/lib/libcpptraj.so
#3  0x00002aaaaee33ba8 in Exec_WriteDataFile::Execute(CpptrajState&, ArgList&) () from /u1/haichit/pytraj_git/pytraj/cpptraj/lib/libcpptraj.so
#4  0x00002aaaaeec0137 in Command::Dispatch(CpptrajState&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) () from /u1/haichit/pytraj_git/pytraj/cpptraj/lib/libcpptraj.so
#5  0x00002aaabdb1127f in __pyx_pf_6pytraj_4core_6c_core_7Command_12dispatch (__pyx_v_cls=0x2aaabdd56f40, __pyx_v_state=0x2aaaae9adbc8, __pyx_v_line=0x2aaabf7ce300) at pytraj/core/c_core.cpp:7999
#6  0x00002aaabdb10eb0 in __pyx_pw_6pytraj_4core_6c_core_7Command_13dispatch (__pyx_v_cls=0x2aaabdd56f40, __pyx_args=0x2aaaae9b26c8, __pyx_kwds=0x0) at pytraj/core/c_core.cpp:7950
#7  0x00002aaaaab6d1e1 in PyCFunction_Call (func=0x2aaabf7b6948, args=0x2aaaae9b26c8, kwds=<value optimized out>) at Objects/methodobject.c:98
#8  0x00002aaaaabf4482 in call_function (f=<value optimized out>, throwflag=<value optimized out>) at Python/ceval.c:4655
#9  PyEval_EvalFrameEx (f=<value optimized out>, throwflag=<value optimized out>) at Python/ceval.c:3185
#10 0x00002aaaaabf5349 in _PyEval_EvalCodeWithName (_co=<value optimized out>, globals=<value optimized out>, locals=<value optimized out>, args=<value optimized out>, argcount=0, kws=0x0, kwcount=0,
    defs=0x0, defcount=0, kwdefs=0x0, closure=0x0, name=0x0, qualname=0x0) at Python/ceval.c:3966
#11 0x00002aaaaabf54d8 in PyEval_EvalCodeEx (_co=<value optimized out>, globals=<value optimized out>, locals=<value optimized out>, args=<value optimized out>, argcount=<value optimized out>,
    kws=<value optimized out>, kwcount=0, defs=0x0, defcount=0, kwdefs=0x0, closure=0x0) at Python/ceval.c:3987
#12 0x00002aaaaabf551b in PyEval_EvalCode (co=<value optimized out>, globals=<value optimized out>, locals=<value optimized out>) at Python/ceval.c:777
#13 0x00002aaaaac1a750 in run_mod (fp=0x6dbf50, filename_str=<value optimized out>, start=<value optimized out>, globals=0x2aaaae648208, locals=0x2aaaae648208, closeit=<value optimized out>,
    flags=0x7fffffffe300) at Python/pythonrun.c:970
#14 PyRun_FileExFlags (fp=0x6dbf50, filename_str=<value optimized out>, start=<value optimized out>, globals=0x2aaaae648208, locals=0x2aaaae648208, closeit=<value optimized out>, flags=0x7fffffffe300)
    at Python/pythonrun.c:923
#15 0x00002aaaaac1bd23 in PyRun_SimpleFileExFlags (fp=0x6dbf50, filename=<value optimized out>, closeit=1, flags=0x7fffffffe300) at Python/pythonrun.c:396
#16 0x00002aaaaac36e97 in run_file (argc=<value optimized out>, argv=<value optimized out>) at Modules/main.c:318
#17 Py_Main (argc=<value optimized out>, argv=<value optimized out>) at Modules/main.c:769
#18 0x0000000000400add in main (argc=2, argv=0x7fffffffe478) at ./Programs/python.c:69
hainm commented 8 years ago

I do see the output test.ccp4 but it's empty.

drroe commented 8 years ago

@hainm you should compile with debug symbols on in libcpptraj.so as well so you can get exact line numbers.

hainm commented 8 years ago

@drroe uhm, I always forgot that. =)) thanks.

hainm commented 8 years ago

@drroe so I tracked down the issue. Here is the log

DataIO_CCP4::WriteSet3D (this=0xdb9f60, setIn=<value optimized out>, outfile=...) at 
DataIO_CCP4.cpp:223
223       Vec3 OXYZ = grid.GridOrigin();

So given that I have a 3D numpy array and I want to write that to ccp4 or dx, I need to explicitly call corresponding Allocate_... method (e.g. Allocate_N_C_D), right?

hainm commented 8 years ago

it's likely.

Example from DataIO_CCP4.cpp


  // Add grid data set. Default to float for now.
  DataSet* gridDS = datasetlist.AddSet( DataSet::GRID_FLT, dsname, "GRID" );
  if (gridDS == 0) return 1;
  DataSet_GridFlt& grid = static_cast<DataSet_GridFlt&>( *gridDS );
  // Allocate grid from dims and spacing. FIXME OK to assume zero origin?
  if (grid.Allocate_N_O_Box( buffer.i[7], buffer.i[8], buffer.i[9],
                             Vec3(0.0), Box(buffer.f + 10) ) != 0)
  {
    mprinterr("Error: Could not allocate grid.\n");
    return 1;
  }
drroe commented 8 years ago

Yes. All grid (i.e. DataSet_3D) classes need to be explicitly allocated, similar to DataSet_2D. Reason is unlike 1D data sets you can't just set up dimensions on the fly.

hainm commented 8 years ago

Thanks. I think I can close this issue now since I do not want to reimplement what cpptraj does.

(However I just added a method that uses cpptrajstate to convert file formats)