create a multi data type structure in Julia

265 views
Skip to first unread message

alex codoreanu

unread,
Feb 1, 2015, 3:35:53 AM2/1/15
to julia...@googlegroups.com
Hi all,

I'm a new Julia user and I'm starting to write a high-level multi data type fits file reader and writer akin to IDL's mwrfits/mrdfits. I got most of the dynamics figured out by I can't quite make a custom structure. For example, I would like something like:

element = {name::string, lambda::[float_array, 5000 elements], flux::[float_array, 5000 elements]}

structure = replicate(element, 500)

where structure inherits the members of element and can be called,

structure[1].name = the name of element 1
strucutre[1].lambda[1] = the first lambda element of the first structure


Thanks !!!

Milan Bouchet-Valat

unread,
Feb 1, 2015, 4:07:51 AM2/1/15
to julia...@googlegroups.com
Looks like a composite type would work:

type Element
name::UTF8String
lambda::Vector{Float64}
flux::Vector{Float64}
end



Regards

alex codoreanu

unread,
Feb 1, 2015, 4:24:59 AM2/1/15
to julia...@googlegroups.com
Thanks Milan, 

I defined Element as you suggested and created

data=(Element, 2)


but 

julia> data[1].lambda=[1., 2.0]

ERROR: type DataType has no field lambda


Now that I have the structure data how do I access the branch members?

Milan Bouchet-Valat

unread,
Feb 1, 2015, 4:57:23 AM2/1/15
to julia...@googlegroups.com
Le dimanche 01 février 2015 à 01:24 -0800, alex codoreanu a écrit :
> Thanks Milan,
>
>
> I defined Element as you suggested and created
>
>
> data=(Element, 2)
What is this line supposed to do? All it does now is assign a tuple
containing the Element type, and the integer value 2.

If you want to create an Element instance, you should do e.g.:
element = Element("a name", [1, 2], [2, 3])

and then to create a list holding two Elements, and fill the first value
with the just created element:
data = Vector(Element, 2)
data[1] = element

Accessing members:
data[1].lambda


Regards

alex codoreanu

unread,
Feb 1, 2015, 5:56:28 AM2/1/15
to julia...@googlegroups.com
That worked but I had to use:

data = Array(Element, 2) 

Thanks for the info!

Tim Holy

unread,
Feb 1, 2015, 6:33:47 AM2/1/15
to julia...@googlegroups.com
Have you seen
https://github.com/JuliaAstro/FITSIO.jl

Off-topic, but it would be awesome to have FITS integrated into Images.jl. I
could help with the integration, but it is pretty well documented:
https://github.com/timholy/Images.jl/blob/master/doc/extendingIO.md
Further discussion could happen at
https://github.com/JuliaAstro/FITSIO.jl/issues/18

--Tim

alex codoreanu

unread,
Feb 2, 2015, 11:07:43 AM2/2/15
to julia...@googlegroups.com
Hi Tim,

I am actually trying to use the low-level functionality provided in FITSIO.jl to write a higher-level function that can deal with fits files with an unknown number of columns and a mix of datatypes. 

Fingers crossed!

alex codoreanu

unread,
Feb 4, 2015, 3:49:27 PM2/4/15
to julia...@googlegroups.com
What I ended up implementing is a dict that can be dynamical created. Here's the code for it but the dict member are blank initialised. 

# names of parameters to be based to make_dictionary
ttype_names_final = {
 "LAMBDA"       
 "EW"           
 "SIGMA1_RESULT"
 "SIGMA3_RESULT"}

   @eval  function $(symbol(string("make_dictionary")))()
                    new_dict = Dict{Symbol,Any}()
                     println("making new dictionary")
      
                    # create new dictionary with each field empty
                     for sym in ttype_names_final
                       new_dict[symbol(sym)] = []
                    end

                      return new_dict
      end


a = make_dictionary()

making new dictionary

Dict{Symbol,Any} with 4 entries:

  :EW            => None[]

  :LAMBDA        => None[]

  :SIGMA1_RESULT => None[]

  :SIGMA3_RESULT => None[]

Reply all
Reply to author
Forward
0 new messages