Seite 2 von 3
Verfasst: Montag 16. März 2009, 20:41
von Hyperion
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
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
Scheint als ob es doch nicht so einfach für mich ist,den Code noch zu vervollständigen
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
Desweiteren habe ich die RegExps noch nie benutzt
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
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
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:
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
Verfasst: Dienstag 17. März 2009, 01:53
von Hyperion
martina hat geschrieben: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.
Also ist die erste Zeile in den "*.fasta" Dateien sinnlos? Ok, ich dachte darüber wird die Verbindung zur zugehörigen xdom-Datei gezogen! Wenn nicht, musst Du die am besten vor der get_domains() Funktion rausfinden und dieser dann einfach mit übergeben.
Aber siehst Du, genau solche Infos sind wichtig! (ich fragte ja vorhin mal, wo ist der Bezug)

Verfasst: Dienstag 17. März 2009, 02:06
von martina
Jupp,ok hab ich mich doch nicht richtig ausgedrückt.
Also wie ich das so mit der Zeit sehe,muß ich das dann wohl noch ganz schön versuchen azupassen,da die ganzen RegExp ja auf die erste Zeile angesetzt sind-da Du verstanden hatest,daß dort die Gemeinsamkeit liegt und nicht im Dateinamen.
Dann werde ich mir noch stark den Kopf zerbrechen müssen

,geht ja nicht so schnell bei mir.
Also dann danke für die Hilfe

Verfasst: Dienstag 17. März 2009, 02:10
von Hyperion
Kein Problem! Aber eigentlich ist es doch nicht so schlimm! Es ist ja nur die eine Stelle, die "weg" muss.
Code: Alles auswählen
def get_domains(fname, xdom_fname):
with open(fname, "r") as data:
metas = data.read()
# Nun den Namen nehmen, der übergeben wird
seq = get_sequences(fname=xdom_fname)
# Sequenzen finden
seq_parts = []
for lines in re.findall(PARAMS, metas):
start, end, seq_name = lines.split()
seq_parts.append(seq[int(start): int(end)])
return seq_name, seq_parts
Das sollte es doch sein.
Nun musst Du nur noch vorher eben den zugehörigen Dateinamen suchen und ihn an get_domians() mit übergeben.
Der Rest sollte dann weiterhin funzen!
Verfasst: Dienstag 17. März 2009, 02:48
von martina
Jetzt hab ich genau das gleiche Problem wie schon einmal zu Beginn mit meinen 'alten funktionen'
er kennt das line.split nicht:
Traceback (most recent call last):
File "Hyp.py", line 95, in <module>
main()
File "Hyp.py", line 87, in main
seq_name,seq_parts = get_domains(fname,xdom_fname)
File "Hyp.py", line 33, in get_domains
start, end, seq_name = lines.split()
ValueError: need more than 1 value to unpack
habe gerade auch noch gesehen, dass er die Sequenz dh ab der 2.Zeile im fasta(sieht zb so aus AJHENDJKKMBVDTESSC), garnicht die Sequenz nimmt,sondern stattdessen hat der den Inhalt des xdom-files.

Verfasst: Dienstag 17. März 2009, 03:54
von snafu
martina hat geschrieben:Jetzt hab ich genau das gleiche Problem wie schon einmal zu Beginn mit meinen 'alten funktionen'
er kennt das line.split nicht:
Da steht nicht, dass er es nicht kennt, sondern dass `split()` eine Sequenz mit 1 Wert erzeugt und du mehr Namen zum Binden vergibst als Werte zum Verteilen vorhanden sind. Python sagt dir normalerweise sehr genau was das Problem ist. Anstatt die Fehlermeldung umzudeuten, müsstest du vielmehr überlegen, warum hier nur 1 Wert übrig bleibt, obwohl du ja offenbar 3 Werte erwartest.