Awesome!  Thank you so much for your help -- I really appreciate it.

On Aug 6, 12:43 pm, Nikita Beloglazov <nikelandj...@gmail.com> wrote:
> Hi Dave,
> There are really 2 functions, -> and ->>
> First ->
> Sometimes you need to perform several functions on after another. You can
> write something like
> (func1 (func2 (func3 value)))
> But you also can write like:
> (-> value
>   (func3)
>   (func2)
>   (func1))
> It takes value, insert it into (func1) form as second element, so it will
> become (func3 value), evaluates it. Result of evaluation insert into
> (func2), evaluates it and etc.
> -> function inserts value as second element, e.g.  (form3 a b c) becomes
> (form3 value a b c)
> ->> function inserts value as last element, e.g. (form3 a b c)  becomes
> (form3 a b c value)
>
> (->> (read-lines pdb-file)
>        (map #(parse-line % chains))
>        (apply concat)))
> First it evaluates (read-lines pdb-file), let's name the result seq1
> Then it evaluates (map #(parse-line % chains) seq1) and we get seq2
> And finally it evaluates (apply concat seq2)
>
> Regards,
> Nikita Beloglazov
>
>
>
> On Fri, Aug 6, 2010 at 7:26 PM, Dave <david.dreisigme...@gmail.com> wrote:
> > Hi Nikita,
>
> > Your function works!  Could you explain the "->>" a bit?  Thanks, -
> > Dave
>
> > On Aug 5, 5:53 pm, Nikita Beloglazov <nikelandj...@gmail.com> wrote:
> > > See my variant of your application:
> >https://gist.github.com/efdb66487e899446332f
> > > I don't know if it works, because I can't test :(
>
> > > My thoughts about your example
> > > You shouldn't think about this procedure as about procedure where you use
> > > loop, like in other imperative languages with mutable data. As I
> > understand
> > > you tried something like:
>
> > > for every line in file do
> > >     if line matches then
> > >          convert line to coords
> > >          add coords to global variable hold-coords
> > >    end if
> > > end for
>
> > > But it's not the clojure way, I think clojure way is:
>
> > > get all lines as sequence
> > > convert every element of this sequence to vector of coords
> > > concat all vectors to one
>
> > > And in your example>dpa> (def y  [5 6 7]) (let [x (into y [2 3 4]) y x ]
> > y)
> > > >[5 6 7 2 3 4]
> > > >dpa> y
> > > >[5 6 7]
>
> > > When you use y in let, it introduce new local variable y, which "hides"
> > > global y
> > > It you want to use mutable data (I don't think it's good), you can use
> > atoms
> > > - it's special mmm... mechanism for mutable data:
>
> > > user> (def y (atom [1 2 3]))
> > > #'user/y
>
> > > user> @y
> > > [1 2
> > > 3]
>
> > > user> (swap! y into [4 5 6])
> > > [1 2 3 4 5
> > > 6]
>
> > > user> @y
> > > [1 2 3 4 5
> > > 6]
>
> > > Here you bind to variable y an atom with initial value - vector [1 2 3].
> > To
> > > get value of atom you use @ before the variable name: @y
> > > To change value you call (swap! atom func x y z). First it calculates new
> > > value like this: (func @atom x y z), in our example it will calculate
> > (into
> > > @y [4 5 6]). It returns vector [1 2 3 4 5 6], and this vector is set as
> > new
> > > value of y.
>
> > > Regards,
> > > Nikita Beloglazov
>
> > > On Thu, Aug 5, 2010 at 11:49 PM, Dave <david.dreisigme...@gmail.com>
> > wrote:
> > > > Thanks for the extra parentheses catch.  I just noticed that while
> > > > working on a different function (after hours of trying to figure it
> > > > out).
>
> > > > The program is reading in a pdb file line-by-line.  I only want the
> > > > xyz-coordinates of carbon atoms, avoiding any repeats when the
> > > > coordinate of an atom is uncertain.  Also, a protein may have multiple
> > > > sub-units, and the chains parameter can pick out the desired sub-
> > > > unit(s).  So I need to:
> > > > 1) make sure the line is long enough
> > > > 2) make sure I have an atom
> > > > 3) make sure it's not a repeated measurement
> > > > 4) make sure it's a C_{alpha} atom
> > > > If the current pdb-file line matches those criteria, I'll then put its
> > > > xyz-coordinates into the output matrix.
>
> > > > I tried this using let:
>
> > > > (defn process-dpa-file2
> > > >   "This makes the matrix of CA coordinates from a pdb file."
> > > >  [pdb-file chains]
> > > >  (def hold-coords [])
> > > >  (doseq [^String line (read-lines pdb-file)]
> > > >    ;; Make sure the file line is the correct length
> > > >    ;; We only want the atom entries
> > > >    ;; We don't want any repeated measurements for an atom
> > > >    ;; Is it a CA?
> > > >    ;; Are we using this chain?
> > > >    (if (and (= (.length line) 80)
> > > >             (= (str (.substring line 0 4) (.substring line 26 27)
> > > > (.substring line 13 15)) "ATOM CA")
> > > >             (substring? (.substring line 21 22) chains))
> > > >       ;; These are the CA coordinates
> > > >      (let [coords (into hold-coords [ (Double. (.substring line 30
> > > > 37))
> > > >                                        (Double. (.substring line 38
> > 45))
> > > >                                        (Double. (.substring line 46
> > 53))])
> > > >             hold-coords coords]))
> > > >    (matrix hold-coords 3)))
>
> > > > but the output gives:
>
> > > > dpa> (def my-mat (process-dpa-file2 "/Users/daviddreisigmeyer/MyStuff/
> > > > DPA_release_12-JUL-2010/1RD8.pdb" "A") )
> > > > #'dpa/my-mat
> > > > dpa> my-mat
> > > > nil
>
> > > > A simpler example:
>
> > > > dpa> (def y  [5 6 7]) (let [x (into y [2 3 4]) y x ] y)
> > > > [5 6 7 2 3 4]
> > > > dpa> y
> > > > [5 6 7]
>
> > > > So it seems that in process-dpa-file2 I have the coordinates of the
> > > > 1st carbon atom in hold-coords, and then the 2nd, the 3rd ... After
> > > > finding the 3rd carbon, I'd want:
>
> > > > hold-coords = [x1 y1 z1 x2 y2 z2 x3 y3 z3] (**)
>
> > > > but instead I get
>
> > > > hold-coords = [x3 y3 z3].  Any idea about how I could get (**)
> > > > instead?  Thanks! -Dave
>
> > > > On Aug 5, 2:46 pm, Nikita Beloglazov <nikelandj...@gmail.com> wrote:
> > > > > Hi, Dave
> > > > > Why do you use 2 parenthesis before "with-open" in the first variant?
> > > > > And, as I know, it's not good practice to use def inside functions.
> > Use
> > > > let
> > > > > instead.
> > > > > I also advice you to split your program to smaller functions.
> > > > > Can you describe, what your program must do? Because don't understand
> > :(
>
> > > > > On Thu, Aug 5, 2010 at 9:28 PM, Dave <david.dreisigme...@gmail.com>
> > > > wrote:
> > > > > > Hi,
>
> > > > > > I don't understand why this doesn't work:
>
> > > > > > (ns dpa
> > > > > >  (:gen-class)
> > > > > >  (:use [incanter.core :only ( matrix )]
> > > > > >        [clojure.core :only ( defn doseq line-seq println with-open
> > )]
> > > > > >        [clojure.contrib.string :only ( blank? substring? )]
> > > > > >  (:import (java.io BufferedReader FileReader)))
>
> > > > > > (defn process-dpa-file
> > > > > >  "This makes the matrix of CA coordinates from a pdb file."
> > > > > >  [pdb-file chains]
> > > > > >  (def hold-coords [])
> > > > > >  ((with-open [rdr (BufferedReader. (FileReader. pdb-file))]
> > > > > >      (doseq [^String line (line-seq rdr)]
> > > > > >    ;; Make sure the file line is the correct length
> > > > > >    ;; We only want the atom entries
> > > > > >    ;; We don't want any repeated measurements for an atom
> > > > > >    ;; Is it a CA?
> > > > > >    ;; Are we using this chain?
> > > > > >    (if (and (= (.length line) 80)
> > > > > >             (= (str (.substring line 0 4) (.substring line 26 27)
> > > > > > (.substring line 13 15)) "ATOM CA")
> > > > > >             (substring? (.substring line 21 22) chains))
> > > > > >      ;; This are the CA coordinates
> > > > > >      (def hold-coords (into hold-coords [ (Double. (.substring line
> > > > > > 30 37))
> > > > > >                                           (Double. (.substring line
> > 38
> > > > 45))
> > > > > >                                           (Double. (.substring line
> > 46
> > > > 53))
> > > > > > ] )))))
> > > > > >   (matrix hold-coords 3)))
>
> > > > > > dpa> (def my-mat (process-dpa-file
> > "/Users/daviddreisigmeyer/MyStuff/
> > > > > > DPA_release_12-JUL-2010/1RD8.pdb" "A") )
> > > > > > No message.
> > > > > >  [Thrown class java.lang.NullPointerException]
>
> > > > > > Restarts:
> > > > > >  0: [QUIT] Quit to the SLIME top level
>
> > > > > > Backtrace:
> > > > > >  0: dpa$process_dpa_file.invoke(NO_SOURCE_FILE:1)
> > > > > >  1: clojure.lang.AFn.applyToHelper(AFn.java:165)
> > > > > >  2: clojure.lang.AFn.applyTo(AFn.java:151)
> > > > > >  3: clojure.lang.Compiler$InvokeExpr.eval(Compiler.java:2901)
> > > > > >  4: clojure.lang.Compiler$DefExpr.eval(Compiler.java:361)
> > > > > >  5: clojure.lang.Compiler.eval(Compiler.java:5424)
> > > > > >  6: clojure.lang.Compiler.eval(Compiler.java:5386)
> > > > > >  7: clojure.core$eval.invoke(core.clj:2382)
> > > > > >  8: swank.commands.basic$eval_region.invoke(basic.clj:47)
> > > > > >  9: swank.commands.basic$eval_region.invoke(basic.clj:37)
> > > > > >  10:
> > swank.commands.basic$eval799$listener_eval__800.invoke(basic.clj:
> > > > > > 71)
> > > > > >  11: clojure.lang.Var.invoke(Var.java:365)
> > > > > >  12: dpa$eval9236.invoke(NO_SOURCE_FILE)
> > > > > >  13: clojure.lang.Compiler.eval(Compiler.java:5419)
> > > > > >  14: clojure.lang.Compiler.eval(Compiler.java:5386)
> > > > > >  15: clojure.core$eval.invoke(core.clj:2382)
> > > > > >  16: swank.core$eval_in_emacs_package.invoke(core.clj:90)
> > > > > >  17: swank.core$eval_for_emacs.invoke(core.clj:237)
> > > > > >  18: clojure.lang.Var.invoke(Var.java:373)
> > > > > >  19: clojure.lang.AFn.applyToHelper(AFn.java:169)
> > > > > >  20: clojure.lang.Var.applyTo(Var.java:482)
> > > > > >  21: clojure.core$apply.invoke(core.clj:540)
> > > > > >  22: swank.core$eval_from_control.invoke(core.clj:97)
> > > > > >  23: swank.core$eval_loop.invoke(core.clj:102)
> > > > > >  24:
> > swank.core$spawn_repl_thread$fn__484$fn__485.invoke(core.clj:307)
> > > > > >  25: clojure.lang.AFn.applyToHelper(AFn.java:159)
> > > > > >  26: clojure.lang.AFn.applyTo(AFn.java:151)
> > > > > >  27: clojure.core$apply.invoke(core.clj:540)
> > > > > >  28: swank.core$spawn_repl_thread$fn__484.doInvoke(core.clj:304)
> > > > > >  29: clojure.lang.RestFn.invoke(RestFn.java:398)
> > > > > >  30: clojure.lang.AFn.run(AFn.java:24)
> > > > > >  31: java.lang.Thread.run(Thread.java:637)
>
> > > > > > But, this does work:
>
> > > > > > (defn process-dpa-file
> > > > > >  "This makes the matrix of CA coordinates from a pdb...
>
> read more »

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to