Seite 1 von 3

Verfasst: Montag 16. März 2009, 18:35
von martina
Hi @ all,

hier nochmals mein Code, den ich bis jetzt versucht habe zu ändern,jedoch treten noch folgende Probleme aus:

1.Es wird die Sequenz eingelesen, gespeichert. Auch anhand des xdom-files wird
start,end herausgesucht und mittels print kann ich mir diese ausgeben lassen,jedoch
werden die Sequenzen nicht in das output file egschrieben.
2. Ebenfalls habe ich noch das Problem,dass er nachdem keine weiteren start und
stops im xdom file sind, nicht ein neues fasta-file mit neuer seuqenz aus dem ordner
nimmt,sondern immernoch die gleiche sequenz hat. Dies müßte ja etwas mit der
Beendigung der Schleife zu tun haben,würde ich denken. Habe schon hin und her
probiert,jedoch weiß ich nicht mehr was ich ändern muß, um den gewünschten Erfolg
zu erhalten :(

Wie gesagt,aber es funktioniert jedoch schon mehr als gedacht.
Nochmals mein Code,sorry :-(

Code: Alles auswählen

def sequence(file):
    seq=""
    file=open(file)
    for line in file:
        if ">" in line:
            continue
        print 'in sequence'
        print seq
        seq+=line.replace("\n","")
    return seq

def domains(fname,seq):
            output=open(fname+"._0.1.pfam.10.fa",'w')
            file=open(fname)   
            print file,"file"
            print seq ,"seq in dom"
            for line in file:
                if ">" in line:
                    continue
            print 'in domains'
            start=int(line.split()[0])
            end=int(line.split()[1])
            name=line.split()[2]
            test=seq[(start)-1:end]
            print test,"domain"
            output.write(">"+name+"\n"+test+"\n")

#main

x=os.listdir('.')

for file in x:
    if file.endswith("fasta"):
        seq=sequence(file)
        fname=file.split('.')[0]
        for fname in x:
           if fname.endswith(".xdom"):
               file=open(fname)
               domains(fname,seq)

Verfasst: Montag 16. März 2009, 19:51
von Hyperion
Also in Zeile 36 überschreibst Du ja "fname", was Du in Zeile 35 angelegt hast? Was willst Du damit beabsichtigen?

Wieso testest Du das ganze nicht einfach erst einmal mit zwei Dateien? Damit wirst Du die "parsing" Probleme schneller finden. Der Rest ist doch bloßes iterieren.

Letzteres kann man doch testen (bzw. sich eine Funktion schreiben, die genau die Pärchen zusammenstellt), ohne dass die Dateien geöffnet werden müssen usw.

Wenn beides passt, montierst Du es einfach zusammen.

Evtl. könntest Du noch einmal posten, wie denn diese Dateien aufgebuat sind, also sample Dateien. Sollten diese länger sein, packe sie in paste.pocoo.org.

Ach ja, Du überschreibst das Built-in "file" - das macht hier vermutlich nichts, sollte man aber besser nicht tun!

Verfasst: Montag 16. März 2009, 20:14
von martina
Hi,
habe meine Testdateien schon auf 2 begrenzt, um Fehler zu finden.

hatte das file überschrieben, da ich dachte man kann die gleiche Variable nicht doppelt verwenden?! ODer gilt dies nicht für file, da es fesgelegt ist bei Python das somit immer die jeweilige Datei gemeint ist? Dies wurde mir so angetragen, das es sonst nicht funktionieren würde,da man den vorherigen namen des files nicht mehr im Spreicher hätte? Hatte es nämlich ansonsten auch zu Beginn mit 'file' in beiden Schleifen.

Um die das jeweilige Pärchen zu finden, muß ich einfach Teile aus meinen Code verwenden,oder? Da ich ja schon die beiden passenden Pärchen versuche zu finden bzw es auch gefunden wird.

Dumme Frage,aber wie stelle ich die Files auf paste.pocoo.org.? habe so etwas noch nie gemacht. sorry.

Vielen Dank für die Hilfe
MArtina

Verfasst: Montag 16. März 2009, 20:20
von martina
HAb es online gestellt,
hoffe du kannst darauf zugreifen?

http://paste.pocoo.org./show/108201/

Martina

Verfasst: Montag 16. März 2009, 20:25
von Hyperion
martina hat geschrieben:Hi,
habe meine Testdateien schon auf 2 begrenzt, um Fehler zu finden.
Ja, aber ich würde die Probleme dennoch anders angehen! Zum Parsen zwei fest definierte Datein (+ ggf. eine neue Output Datei), zum Pärchen finden ruhig in den Original-Ordner gehen und dort Suchen.
hatte das file überschrieben, da ich dachte man kann die gleiche Variable nicht doppelt verwenden?! ODer gilt dies nicht für file, da es fesgelegt ist bei Python das somit immer die jeweilige Datei gemeint ist? Dies wurde mir so angetragen, das es sonst nicht funktionieren würde,da man den vorherigen namen des files nicht mehr im Spreicher hätte? Hatte es nämlich ansonsten auch zu Beginn mit 'file' in beiden Schleifen.
Nein, Du verstehst das falsch. Wähle für file einfach einen anderen Bezeichner! Du findest hier ...
http://docs.python.org/library/functions.html
... nämlich eine Built-in Funktion, die file() heißt! So etwas kann zu Problemen führen.
Um die das jeweilige Pärchen zu finden, muß ich einfach Teile aus meinen Code verwenden,oder? Da ich ja schon die beiden passenden Pärchen versuche zu finden bzw es auch gefunden wird.
k.A. - ich habe mir diesen Code nicht so genau angeguckt - aber es sieht nicht grad sauber aus! Klappt es denn? Wenn Du das nur mit 2 Dateien testest, sagt das ja nicht grad viel darüber aus ;-)
Dumme Frage,aber wie stelle ich die Files auf paste.pocoo.org.? habe so etwas noch nie gemacht. sorry.
Du siehst doch ein großes Eingabefeld. Dort kopierst Du Deinen Code / Datei usw. rein. Darunter hast Du noch eine Auswahlbox, mit der Du ggf. das Highlighting einstellen kannst (z.B. bei Python Quelltest). Wenn Du das Markup nicht kennst, dann ist "Text" (voreingestellt!) die richtige Wahl. Danach klickst Du auf "paste".

So schwer ist das doch nicht ;-)

Verfasst: Montag 16. März 2009, 20:41
von Hyperion
martina hat geschrieben:HAb es online gestellt,
hoffe du kannst darauf zugreifen?

http://paste.pocoo.org./show/108201/

Martina
Ok, welche der beiden Dateien ist denn das nun? Und wie hängen diese zusammen? Sorry aber Deine bisherigen Erklärungen sind zu wirr, um es zu kapieren, was da genau passiren soll!

Zeige doch mal anhand der Dateien (und deren Namen), wie was zusammenhängt, woraus wann was abgeleitet und was überhaupt geändert oder neu generiert werden soll!

Verfasst: Montag 16. März 2009, 20:56
von martina
Sorry,

also das was nach >Ory_cbl5_fasta wäre dann Datei Ory_cbl5.fasta in meinem Bsp.
alles was nach >Ory_cbl5_xdom steht wäre Datei Ory_cbl5._0.1.pfam.10.xdom
mit den anderen beiden Bsp genauso.

in meinem Code funktioniert es bis jetzt so.
Die zb Sequenz aus Ory_cbl5.fasta wird eingelesen und als 'seq' abgespeichert.
Durch splitten des namens wird die dazugehörige xdom-Datei im Ordner gesucht.
Anschließend wird Ory_cbl5._0.1.pfam.10.xdom geöffnet und Zeile für Zeile gesplittet(man erhätl start,end und name) und die Sequenz für die jeweilige Zeile in ein output file namens Ory_cbl5._0.1.pfam.10.xdom._0.1.pfam.10.fa abgespeichert.

Nun bin ich so weit,dass auch die jeweiligen Sequenzteile(dh wenn in xdom 3 zeilen sind mit start,end und name) in das zugehörige outputfile geschrieben wird.
Jedoch, wie schon gesagt ändert er die Sequenz bzw das fasta file nicht, um dann das dazugehörige xdom file zu öffnen.
dh er öffnet und merkt sich die Sequenz für Ory_cbl5.fasta, aber sucht die zugehörigen start und ends für alle xdom-files (hier Pop_cbl10._0.1.pfam.10.xdom._0.1.pfam.10.xdom, und Ory_cbl5._0.1.pfam.10.xdom._0.1.pfam.10.xdom)

Aber es müßte ja so funktionieren, daß für Pop...xdom auch nur die Pop...fasta verwendet wird und deren resultierenden Sequenz.

War das besser verständlich? Sorry, geb mir Mühe es nicht allzu verwirrend zu beschreiben :oops:

Martina

Verfasst: Montag 16. März 2009, 21:15
von Hyperion
Ja, schon besser - aber noch nicht perfekt ;-)

Also ich sage jetzt einmal, was ich bisher verstanden habe:
- Du hast jeweils 2 Dateien (eine mit "_xdom" und eine mit "_fasta"), die "zusammengehören".

- Du willst jeweils die Dateien eines Pärchens einlesen und bei der "_xdom" Datei diese Zeilenweise auslesen, so dass Du auf jede Zeile einzeln zugreifen kannst.

- Es soll eine neue Datei geschrieben werden.

Was ich noch nicht kapiert habe:
- Ist der Dateiname der "neuen" Datei willkürlich?

- Wie genau soll die "neue" Datei aussehen? Was soll da reingeschrieben werden? Wie hängt "das" mit den beiden zuvor geöffneten Dateien zusammen?

Bitte beschreibe nicht, was Dein Code bisher macht, sondern was Du erreichen willst!

Verfasst: Montag 16. März 2009, 21:27
von martina
Ok, geb mir Mühe :)

ja genau die Sachen hattest du richtig verstanden.

Der Name der neuen Datei ist nicht willkürlich,sondern er hat die Endung des xdom-files+fa dh als Bsp Ory_cbl5._0.1.pfam.10.xdom._0.1.pfam.10.fa ist auch so im integriert Code und funktioniert. Ist vielleicht etwas verwirrend, aber günstig für mich,da dann vorherige Aktionen sofort ersichtlich sind für mich.

diese Datei soll folgendermaßen aussehen:
>PF00036
FKLYDLRQTGFIERHELKEMVLALLDESD
>PF00036
EMIVDRTFDQADTKGDERIDQEEWNEFVK
>PF00036
DLTMVFPSFVIHSEVSEADMVA


nach dem'>' ist der 'name' (3.Spalte in xdom) der jeweiligen Zeile des xdom files und in der nächsten Zeile die Sequenz der jeweiligen start(1.Spalte) und endpunkte(2.Spalte) aus dem xdom-file.


nochmal zum aussehen des xdom's:
>name(spielt aber keine Rolle zum Auslesen)
start end name
start end name
...
Weshalb öffen ich die Dateien?
Ich muß die Dateien xxx.fasta und xxx.xdom doch öffnen, um zu 'wissen' von welchem start bis welchem Endpunkt ich aus der Sequenz(fasta) raussuchen muß und den dazugehörigen Namen zu erfahren.

Verfasst: Montag 16. März 2009, 22:27
von Hyperion
Ok, jetzt hab ich es verstanden. Wie ich vermutete sind das zunächst einmal gut zwei Probleme, die man leicht getrennt angehen kann!

1.) Parsing Probleme lösen
2.) Pärchen finden

So, ich versuche mich mal an ersterem.

Verfasst: Montag 16. März 2009, 22:40
von martina
Hi,
also da sich mein Code ein wenig verändert hat,poste ich ihn nochmal.
Hoffe ist nicht zuviel.

Code: Alles auswählen

def sequence(f):
  4     seq=""
  5     f=open(f)
  6     for line in f:
  7         if ">" in line:
  8             continue
  9         print 'in sequence'
 10         seq+=line.replace("\n","")
 11     return seq
 12     
 13 def domains(fname,seq):
 14     output=open(fname+".fa",'w')
 15     f=open(fname)   
 16     print output
 17     for line in f:
 18         if ">" in line:
 19             continue
 20         print 'in domains'
 21         start=int(line.split()[0])
 22         end=int(line.split()[1])
 23         name=line.split()[2]
 24         test=seq[(start)-1:end]
 25         output.write(">"+name+"\n"+test+"\n")
 26     return test
 27     
 28 #main
 29 
 30 x=os.listdir('.')
 31 
 32 for f in x:
 33     if f.endswith("fasta"):
 34         seq=sequence(f)
 35         fname=f.split('.')[0]
 36         print"erstes",fname
 37     for fname in x:
 38         print "fname",fname
 39         if fname.endswith(".xdom"):
 40             print fname,"xdom"
 41             test=domains(fname,seq)


Verfasst: Montag 16. März 2009, 23:57
von Hyperion
So, hier mal mein Ergebnis:
http://paste.pocoo.org/show/108242/

Es fehlt das Rausfinden der "fasta"-Dateien - aber das bekommste sicherlich hin :-)

Ansonsten sollte das so tun. Du musst nur beachten, ob die Zeilenumbrüche in den xdom Dateien so korrekt rausgefiltert werden (Zählen die mit oder nicht?). Ich habe immer noch ein "\r" in den Sequenzen. Das wird wohl an den Windows-Zeilenumbrüchen liegen könnte ich mir vorstellen. Da musst Du eben noch ein wenig experimentieren.

Verfasst: Dienstag 17. März 2009, 00:01
von martina
Hi,

vielen Dank für die schnelle Antwort und Deine Mühen.

Werde es gleich mal ausprobieren :)

Nochmals vielen lieben Dank und schönen Abend noch
MArtina

Verfasst: Dienstag 17. März 2009, 00:26
von martina
Hi,
also wie gesagt,bin sehr dankbar für Deine Hilfe, muß aber nochmal nachfragen, da es mir etwas schwer fällt 'fremden' Code zu lesen.

habe jetzt in die def main folgendes reingetan,

Code: Alles auswählen

  x=os.listdir('.')
 60     for fname in x:
 61         if fname.endswith("fasta"):

aber es gibt einen Fehler in Zeile 17 bei def get_sequence
with open(u"%s.xdom" % fname, "r") as data:

zuerst würde mich interessieren, was das 'u' in der Klammer bedeutet?

Desweiteren habe ich die RegExps noch nie benutzt :oops:

Scheint als ob es doch nicht so einfach für mich ist,den Code noch zu vervollständigen :roll:

Werd noch versuchen ein wenig rumzubasteln*gg

Martina

Verfasst: Dienstag 17. März 2009, 00:40
von Hyperion
martina hat geschrieben:Hi,
also wie gesagt,bin sehr dankbar für Deine Hilfe, muß aber nochmal nachfragen, da es mir etwas schwer fällt 'fremden' Code zu lesen.
er ist ja auch nicht perfekt kommentiert ;-)
aber es gibt einen Fehler in Zeile 17 bei def get_sequence
Welchen denn?
zuerst würde mich interessieren, was das 'u' in der Klammer bedeutet?
Das deklariert den String nur als "unicode"-String. Mehr zu dieser Problematik findest Du hier in zig Threads :-D
Desweiteren habe ich die RegExps noch nie benutzt :oops:
Macht nichts - ich nutze sie auch nicht oft, aber manchmal sind sie eben hilfreich.
Scheint als ob es doch nicht so einfach für mich ist,den Code noch zu vervollständigen :roll:
Hm ... wo genau hapert es denn? Imho war das ja erst einmal nur das Finden aller ".fasta" Dateien und das Abarbeiten meines Codes in einer Schleife.

Ok, vorher würde ich den Rest einmal mit vorhandenen Files testen ... we ich das hier ja auch gemacht habe.

Poste doch mal exakt den Fehler!

Verfasst: Dienstag 17. März 2009, 00:47
von martina
Also wie vorher gepostet,hab ich nur den Dreizeiler eingefügt,mehr nicht.

Wenn ich versuche zu starten kommt folgender Fehler:

Hyp.py:17: Warning: 'with' will become a reserved keyword in Python 2.6
File "Hyp.py", line 17
with open(u"%s.xdom" % fname, "r") as data:
^
SyntaxError: invalid syntax

Eventuell unterschieldiche Pythonversionen?

Danke trotzdem für die Hilfe und die Kommentare sind auhc nicht so schlecht :wink:
Es liegt sicher auch viel daran,wie gut man Code versteht. Naja und zugegeben...bin nicht ganz so erfahren damit :( leider

Verfasst: Dienstag 17. März 2009, 00:50
von Hyperion
Ach so .. welche Python Version nutzt Du? Ich habe das für 2.6 implementiert. Wenn Du 2.5 nutzt kannst du das mit folgendem Hook zum Laufen bringen:

Code: Alles auswählen

from __future__ import with_statement 

Verfasst: Dienstag 17. März 2009, 00:59
von martina
Jupp genau,hattest Recht,danke.

Hab wie gesagt dies eingefügt in die def main:

Code: Alles auswählen

 x=os.listdir('.')
 61     for fasta in x:
 62         if fasta.endswith("fasta"):
 63             print fasta
jedoch bekomme ich dann diesen Fehler. Werde nur nicht schlau aus der Namensvergabe.
Da Du in def get_sequence fname übergibts.Also muß ich den Filenamen vorher anpassen?

Pop_cbl10.fasta --> habe mir nur den namen des jeweiligen files ausgeben lassen
Traceback (most recent call last):
File "Hyp.py", line 73, in <module>
main()
File "Hyp.py", line 65, in main
seq = get_domains(fasta)
File "Hyp.py", line 35, in get_domains
seq = get_sequences(fname=xdom_fname)
File "Hyp.py", line 17, in get_sequences
with open(u"%s.xdom" % fname, "r") as data:
IOError: [Errno 2] No such file or directory: u'gi.xdom'

Verfasst: Dienstag 17. März 2009, 01:07
von Hyperion
martina hat geschrieben: jedoch bekomme ich dann diesen Fehler. Werde nur nicht schlau aus der Namensvergabe.
Da Du in def get_sequence fname übergibts.Also muß ich den Filenamen vorher anpassen?
Nein, den lese ich doch aus der "fasta"-Datein den zeilen 32 & 33 aus! Evtl. passt der RegExp da nicht. ich würde mir mal an der Stelle angucken, wie der Dateiname da aussieht (print!) Ich hab mich beim RegExpr an Deinem Bsp. orientiert - da kann schnell was schief laufen, wenn da Zeichen drin stehen, die ich nicht matche.

Verfasst: Dienstag 17. März 2009, 01:50
von martina
Ah,ja nun hab ich es.
Also der Name,welcher gleich ist zwischen beiden Dateien steht nicht in der Datei,sondern ist der Dateiname-mein Fehler.

Hoffe ich kann was finden,wie man die RegExp auf den Dateiname anwendet.

Danke jedenfalls nochmal für die schnelle und super Hilfe.

Martina