Hey Mike,
Sorry for taking a million years to respond.
On Fri, Jun 24, 2011 at 10:12 AM, Tallhamer, Mike <
mike.tallha...@usoncology.com> wrote:
> Anthony,
>
> It won't be in any source that you have because I'm trying to create it.
>
> per my email below...
>
> >I have added the following code to the atom.py file...
> >
> > class LinkAtom(Atom):
> > """
> > Defines an atom of type ``link``.
> >
> > The item size is the *maximum* length in characters of strings.
> > """
> > kind = 'link'
> > itemsize = property(
> > lambda self: self.dtype.base.itemsize,
> > None, None, "Size in bytes of a sigle item in the atom." )
> > type = 'string'
> > _defvalue = ''
> >
> > def __init__(self, itemsize, shape=(), dflt=_defvalue):
> > if not hasattr(itemsize, '__int__') or int(itemsize) < 0:
> > raise ValueError( "invalid item size for kind ``%s``: %r; "
> > "it must be a positive integer"
> > % ('string', itemsize) )
> > Atom.__init__(self, 'S%d' % itemsize, shape, dflt)
>
> I was told this is how you create a new Atom class and by extension a new
> Column class via some pytables automagic class generation (not very pythonic
> in mho).
There is a from_atom() method
http://www.pytables.org/docs/manual/ch04.html#ColClassDescr
> What I'm trying to accomplish is to implement a table with a custom column
> type that that "points" to another node (e.g. like an EArray or VLArray) via
> an internal path to the actual object in the file. Right now I have to store
> the path as a string then search the table to retrieve the path which I then
> use to go and get the data array. I would like to add some type checking in
> the tableExtension.Row.__getitem__() method that simply checks for a LinkCol
> type (just like a StringCol holding my text path) and then returns the
> actual hdf5 node represented by the path instead of the path itself. In this
> way I can get all of the nice features of an indexed Table when it comes to
> searching for values within the records but can also retrieve large variable
> length datasets associated with each of the records.
>
Right, the basic idea makes sense. Like Josh said, though, it would help if
we could do this through a branch or a pull request. It also might make
more sense to try to use the HDF5 links rather than paths. These, which are
effectively pointers, would have a consistent size (unlike strings).
However, truth be told I don't have a lot of experience with them myself.
Though I would certainly be happy to take a look.
Be Well
Anthony
>
> Thanks,
> Mike
>
> Message: 1
> Date: Wed, 22 Jun 2011 20:20:02 -0500
> From: Anthony Scopatz <scop...@gmail.com>
> Subject: Re: [Pytables-users] Create new Atom Class
> To: Discussion list for PyTables
> <pytables-users@lists.sourceforge.net>
> Message-ID: <banlktin7qgyf4cduou4dtyolzfg7qv2...@mail.gmail.com>
> Content-Type: text/plain; charset="iso-8859-1"
>
> Hey Mike,
>
> Hmmm I don't see LinkAtom or LinkCol anywhere in my source.
> Can you try to determine which file they are coming from. What
> does type(LinkAtom) say?
>
> Be Well
> Anthony
>
> On Wed, Jun 22, 2011 at 6:41 PM, Tallhamer, Mike <
> mike.tallha...@usoncology.com> wrote:
>
> > Here is some additional information on the issue...
> >
> > I see that if I type the following in ipython...
> >
> > [1] import tables
> >
> > I do get access to tables.LinkAtom and tables.LinkCol
> >
> > If I type...
> >
> > [2] from tables import *
> >
> > Neither LinkAtom or LinkCol are available. Furthermore, if I use
> > tables.LinkCol in an IsDescription class and try to assign a string to
> > it I get a TypeError like the one below.
> >
> > In [3]: class Test(IsDescription):
> > ...: name = StringCol(100)
> > ...: link_col = tables.LinkCol(100)
> > ...:
> > ...:
> >
> > In [4]: h5file = openFile('mytables.h5','w')
> >
> > In [5]: h5file.createTable('/', 'Test', Test, title='Test Table')
> >
> > ------------------------------------------------------------------------
> > ---
> > TypeError Traceback (most recent call
> > last)
> >
> > C:\tmp\<ipython console> in <module>()
> >
> > C:\Python27\lib\site-packages\tables\file.pyc in createTable(self,
> > where, name,
> > description, title, filters, expectedrows, chunkshape, byteorder,
> > createparents)
> > 772 description=description, title=title,
> > 773 filters=filters, expectedrows=expectedrows,
> > --> 774 chunkshape=chunkshape, byteorder=byteorder)
> > 775
> > 776
> >
> > C:\Python27\lib\site-packages\tables\table.pyc in __init__(self,
> > parentNode, name, description, title, filters, expectedrows, chunkshape,
> > byteorder, _log)
> > 590
> > 591 super(Table, self).__init__(parentNode, name, new,
> > filters,
> > --> 592 byteorder, _log)
> > 593
> > 594
> >
> > C:\Python27\lib\site-packages\tables\leaf.pyc in __init__(self,
> > parentNode, name, new, filters, byteorder, _log)
> > 289 # is a lazy property that automatically handles their
> > loading.
> >
> > 290
> > --> 291 super(Leaf, self).__init__(parentNode, name, _log)
> > 292
> > 293
> >
> > C:\Python27\lib\site-packages\tables\node.pyc in __init__(self,
> > parentNode, name, _log)
> > 294 # Create or open the node and get its object ID.
> >
> > 295 if new:
> > --> 296 self._v_objectID = self._g_create()
> > 297 else:
> > 298 self._v_objectID = self._g_open()
> >
> > C:\Python27\lib\site-packages\tables\table.pyc in _g_create(self)
> > 745 # set because it is needed for setting attributes
> > afterwards.
> >
> > 746 self._v_objectID = self._createTable(
> > --> 747 self._v_new_title, self.filters.complib or '',
> > obversion )
> > 748 self._v_recarray = None # not useful anymore
> > 749 self._rabyteorder = None # not useful anymore
> >
> > C:\Python27\lib\site-packages\tables\tableExtension.pyd in
> > tables.tableExtension.Table._createTable
> > (tables\tableExtension.c:1822)()
> >
> > C:\Python27\lib\site-packages\tables\utilsExtension.pyd in
> > tables.utilsExtension.createNestedType (tables\utilsExtension.c:7912)()
> >
> > C:\Python27\lib\site-packages\tables\utilsExtension.pyd in
> > tables.utilsExtension.AtomToHDF5Type (tables\utilsExtension.c:5703)()
> >
> > TypeError: Invalid type for atom LinkCol(itemsize=100, shape=(),
> > dflt='', pos=0)
> >
> >
> >
> > Any thoughts or ideas?
> >
> > -Mike
> >
> >
> >
> > -----Original Message-----
> >
> > I would like to create my own atom class but appear to be doing
> > something wrong. I basically just need a StringAtom but want to define a
> > new class with a new PyTables 'kind' of 'link' instead of 'string.'
> >
> > I have added the following code to the atom.py file...
> >
> > class LinkAtom(Atom):
> > """
> > Defines an atom of type ``link``.
> >
> > The item size is the *maximum* length in characters of strings.
> > """
> > kind = 'link'
> > itemsize = property(
> > lambda self: self.dtype.base.itemsize,
> > None, None, "Size in bytes of a sigle item in the atom." )
> > type = 'string'
> > _defvalue = ''
> >
> > def __init__(self, itemsize, shape=(), dflt=_defvalue):
> > if not hasattr(itemsize, '__int__') or int(itemsize) < 0:
> > raise ValueError( "invalid item size for kind ``%s``: %r; "
> > "it must be a positive integer"
> > % ('string', itemsize) )
> > Atom.__init__(self, 'S%d' % itemsize, shape, dflt)
> >
> >
> > However, when I run ipython and import tables a LinkAtom and by
> > extension a LinkCol is not created. Can someone tell me what I'm doing
> > wrong? This method of generating class in PyTables doesn't seen to be
> > very intuitive and/or pythonic.
> >
> > -Mike
> </pre>The contents of this electronic mail message and any attachments are
> confidential, possibly privileged and intended for the addressee(s)
> only.<br>Only the addressee(s) may read, disseminate, retain or otherwise
> use this message. If received in error, please immediately inform the sender
> and then delete this message without disclosing its contents to
> anyone.</pre>
>
>
> ------------------------------------------------------------------------------
> All the data continuously generated in your IT infrastructure contains a
> definitive record of customers, application performance, security
> threats, fraudulent activity and more. Splunk takes this data and makes
> sense of it. Business sense. IT sense. Common sense..
> http://p.sf.net/sfu/splunk-d2d-c1
> _______________________________________________
> Pytables-users mailing list
> Pytables-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/pytables-users
>
>
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense..
http://p.sf.net/sfu/splunk-d2d-c1
_______________________________________________
Pytables-users mailing list
Pytables-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/pytables-users