Perl-pomoć

poruka: 11
|
čitano: 2.879
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
13 godina
neaktivan
offline
Perl-pomoć

Pozdrav,

zanima me sljedeće (pokušat ću objasnit najbolje šta mogu):

recimo da imam 4 sekvence različitih slova. Želim usporediti prvo slovo prve sekvence (1,1) s prvim slovom druge (2,1), prvo slovo treće (3,1) s prvim četvte (4,1) i tako kroz cijeli niz. Zatim (1,1) i (3,1), (2,1) i (4,1)....(indekse bi promjenila, znam da idu od nule, ali recimo da moja matrica tako na papiru izgleda :))



Da li je to moguće napraviti ako napravim matricu (array of arrays?) [4 x i], tj, da li je moguće kreirati subroutine koja bi kao argument primala 2 varijable i-tog retka i j-tog stupca, usporedila ih i vratila mi true/false.

Znači li to da onda moram imati i više brojača (ako su npr elementi 1. i 3. reda isti, prvi brojač++, ako su el. 1. i 2. isti drugi brojač++) ?

Dakle, da li je to izvedivo, ili moram smislit nešto drugo? {#}



Hvala 

 
0 0 hvala 0
17 godina
neaktivan
offline
Re: Perl-pomoć

Izvedivo je bez problema. Možeš li malo bolje pojasniti sam problem?

Ovak kak je sad opisano nije problem riješiti, ali nije jasno je su li sekvence iste veličine?

I bi li ih se možda bolje moglo predstaviti kao string a ne array?

 

 

13 godina
neaktivan
offline
Re: Perl-pomoć

mogu, naravno {#} 

Vidim i ja da nisam to baš najbolje objasnila:

 

recimo da imam 4 sekvence:

 

seq A =  S P S Y T F F

seq B =  S S S T T F /

seq C =  S F S S T S Y

seq D =  S Y Y S T S Y

 

uzmimo 6. stupac:

 

ako je elemnt na (1,6) jednak elementu na (2,6)

i element (3,6) jednak (4,6)

brojač1++

 

ako je elemnt na (1,6) jednak elementu na (3,6)

 i element (2,6) jednak (4,6)

brojač2++

 

ako je elemnt na (1,6) jednak elementu na (4,6)

 i element (2,6) jednak (3,6)

brojač3++

 

else

ništa se ne događa i ide na sljedeći stupac

 

 

Dakle imam 3 brojača, svaki predstavlja jednu mogućnost:

brojač1 je (AB)(BC)

brojač2 je (AC)(BD)

brojač3 je (AD)(BC)

 

U ovom slučaju, povećat će se brojač1

 

Ukoliko su svi elementi stupca jednaki ili jedan član fali (mislim da je to odgovor na pitanje 'jesu li sve sekvence iste duljine' :) )- stupac se je 'uninformative' i ne treba vršiti usporedbu.

Kako da to naznačim? Da li da dodam još nešto u if-elsif-else petlju? Ako ostavim petlju ovako kako je za prvi stupac će mi se sva tri brojača povećat za jedan, jel tako?

 

 

 

 

 

Poruka je uređivana zadnji put pet 11.11.2011 19:59 (copycat).
17 godina
neaktivan
offline
Re: Perl-pomoć

Mali ispravak - ak sam dobro pohvatal brojače, onda je brojač1 (AB)(CD), zar ne?

U principu ako su sekvence ovako male, i ako želiš naći koje dvije su jednake, onda bi ti bilo lakše uspoređivati stringove.

Npr.

# originalna sekvenca
my @seq_a = qw(S P S Y T F F);
my @seq_c = qw(S F S S T S Y);

# generiramo stringove
my $seq_a = join '', @seq_a;
my $seq_c = join '', @seq_c;

if ($seq_a eq $seq_c) {
  print "Isti su\n";
}

Ako taj način ipak nije dobar iz nekog razloga, onda je ovaj tvoj algoritam gore dovoljan, ali mi se čini da je previše kompliciranja za relativno jednostavnu stvar, ne?

13 godina
neaktivan
offline
Re: Perl-pomoć

Je, u pravu si, prvi je (AB)(CD). Sorry :)

 

Ne znam koliko su duge sekvence,imam 100 fileova, svaki sa po 4 sekvence. Nisam ih otvarala sve, ali mislim da ne moraju biti iste dužine.

Kada ih učitam moram ih 'parse-ati'  da dobijem 'aligned sequence' (unaprijed se ispričavam na ovako trapavim izrazima, ne znam bolje :) )

 

Time se mislim baviti kasnije, za sada pokušavam pronaći algoritam koji bi brojao ovo sve što sam navela i testirati na nekoj kratkoj sekvenci (kao ova u primjeru), pa ako radi na njoj, valjda će i na nekoj većoj. Programming hint koji sam dobila kaže da se svaka pozicija (dakle svaki stupac) promatra zasebno i da bi bilo pametno napisati subroutine za to.

 

Ako sam dobro shvatila, kod koji si ti napisao gleda da li su sekvence 100% jednake? 

Stvar je u tome da znam da sekvence nikada neće biti 100% jednake, pa stoga pokušavam naći poziciju(stupac) koji će odgovarati jednome od brojača (problem je iz biologije. Imam četiri redosljeda aminokiselina i želim vidjeti koji od tri stabla (brojači 1 2 3 u primjeru) je ispravan i to u biti moj algoritam pokušava napraviti. Riječ je o principu parsimonije (parsimony) ali bitno pojednostavljeno).

Kasnije ću te brojače dalje uspoređivati i to je u biti glavni dio outputa.

 

 

 

Poruka je uređivana zadnji put pet 11.11.2011 20:49 (copycat).
17 godina
neaktivan
offline
Re: Perl-pomoć

Hm, teško mi je uhvatiti neku širu sliku. Je li pokušavaš odrediti koja je sekvenca u fajlu najduža, a da sve ostale sekvence počinju s istom? Odnosno, zanima li te najveći zajednički podniz u svakom fajlu?

Čini mi se da bi se tvoj problem relativno lako mogao rješiti. Možeš poslati par tih fajlova na uvid? I kaj točno treba izvaditi iz svakog fajla?

(Nekak mi se čini da cijeli problem ima veze s biologijom, al možda se varam :)).

 

 

 

13 godina
neaktivan
offline
Re: Perl-pomoć

Editirala sam post :)

 

fajlovi su .fasta format ako to pomaže

Poruka je uređivana zadnji put pet 11.11.2011 20:58 (copycat).
17 godina
neaktivan
offline
Re: Perl-pomoć
copycat kaže...

Editirala sam post :)

 

fajlovi su .fasta format ako to pomaže

Fasta, da, riječ mi je bila na vrhu jezika, bio sam siguran da se o tome radi. Da, moj kod gore provjerava 100% istovjetnost, jer sam mislio da se to traži.

Kak se točno provjerava ispravnost aminokiseline u ovom slučaju?

Znači, imam 4 redka zapisa i moram skužiti koji je ispravan po nekom kriteriju?

 

(Usput, ako programiraš u Perlu, postoji dosta modula na CPAN-u koji vjerojatno već rade to kaj vam treba, osim ako je u pitanju provjeriti tko zna ovo isprogramirati, a tko ne.)

 

 

Edit: slično pitanje: http://biostar.stackexchange.com/questions/1423/how-to-parse-fasta-files-in-perl

Poruka je uređivana zadnji put pet 11.11.2011 21:35 (Black Deus Typhon).
13 godina
neaktivan
offline
Re: Perl-pomoć

Provjerava se ispravnost stabla. Sekvence su sve 'ispravne', ali želimo odrediti koje su vrste 'srodnije'. Pravo stablo bi uključivalo i udaljenosti i još štošta, ali naš primjer je jednostavan :).

 

Kako znamo koje je stablo ispravno? Najjednostavnije je izbrojati za svako stablo koliko je potrebno supstitucija. Budući da su supstitucije relativno rijetke, stablo koje će zahtjevati najmanje supstitucija najvjerojatnije je ispravno (parsimony).

 

Dakle, ako su sve 4 AK (aminokiseline) iste-nema supstitucije, ali stablo nam ništa ne govori, dakle--uninformative.

Isto tako, ako fali AK--uninformative.

 

 

Ovo dio puno jednostavnije izgleda nacrtano na papiru, a budući da to ne znam napraviti ovdje, morat ćeš mi vjerovat :) Znači, kad sam nacrtala sve moguće kombinacije zaključujem sljedeće:

 

- ako su sve AK različite, potrebne su tri (ili više) supstitucije koje mogu biti na različitim mjestima u (na) stablu. Dakle, opet ne znamo koje stablo bi tu bilo ispravno

- ako je jedna AK različita potrebna je jedna supstitucija, ali ona može biti bilo gdje i opet ne znamo koje stablo bi bilo ispravno

 

- slučaj koji sam navela u jednom od prethodnih postova: 2 para AK --jedno stablo će biti ispravno, dakle jedno će zahtjevati manji broj supstitucija od druga dva

 Primjer koji je gore spomenut:

 A   F

 B   F

 C   S

 D   S

 

Stablo1 (AB)(CD)--   (FF)(SS) kad to nacrtam vidim da je potrebna jedna supstitucija (FF)-supstitucija-(SS)

Stablo2 (AC)(BD)-    (FS)(FS) kad to nacrtam vidima da su potrebne dvije supstitucije koje mogu smjestit na dva različita mjesta

Stablo3 (AD)(BC)-    (FS)(FS) opet 2 supstitucije na dva mjesta

 

Kad nacrtam sve mogućnosti iz primjera koji sam navela, zaključujem da mi 6 pozicija (stupaca) ne govori koje stablo bi bilo najbolje. Jedino ova pozicija podupire prvi slučaj, dakle Stablo1.

 

Ja promatram 4 srodne vrse i imam sto gena (100 fasta fajlova). Moram provjerit alignment za svaki gen i odlučiti koje stablo (ako uopće ikoje) je najbolje i zatim zbrojiti 'pogotke' za svako stablo.  Kako bi izbjegli mogućnost da je neko stablo slučajno proglašeno najboljim, broj pogodaka za najbolje stablo mora biti veće od zbroja pogodaka za druga dva.

Nešto ovako: 6 pozicija kaže da je stablo1 najbolje, 1 pozicija za Stablo2, 2 pozicije za Stablo3 (u ovom primjeru sekvenca je bila duga 62 AK, 53 pozicije su bile uninformative, provjeravala sam 9 pozicija,tj.stupaca). 6>(1+2)- stablo 1 je pobjednik :). Da je kojim slučajem zboj bio veći- ne znamo koje je stablo pobjedilo :)

 

U CPAN-u ima puno toga na ovu temu, ali ovaj primjer je jako pojednostavljen. Da, poanta je vidjet tko će kako to napraviti, pa nam na žalost nije dozvoljeno uopće razgovarat o tome :). Također, koriste neki fancy software za provjeru sličnosti (www.turnitin.com), pa nije preporučljivo ni čupkati djelove koda okolo :)

 

Tek učim Perl, ali ako ovo uspijem izvest, mislim da bi mi se moglo svidit, pa nastavim :))

 

17 godina
neaktivan
offline
Re: Perl-pomoć

Čini se kao zanimljiv problem. Premalo znam o svemu tome da bih od prve skužio cijelu proceduru, ali na Perl pitanja ti mogu odgovoriti bez problema od prve.

 

Koliko sam shvatio, rutina prolazi kroz pojedina stabla znak po znak i provjera je su li potrebne supstitucije. Stablo koje ima najmanji broj wins?

 

To bi onda ovak moglo ispast:

 

#!perl

 

use strict;

use warnings;

 

# brojači

my %counters;

 

# recimo da smo učitali 4 sekvence i dobili ovakav podatak

my %sequences = (

 A => 'seq1',

 B => 'seq2',

 C => 'seq3',

 D => 'seq4',

);

 

for my $f (keys %sequences) {

  for my $s (keys %sequneces) {

    next if $f eq $s; # ne provjeravamo same sa sobom

    $counters{$f . $s} = magicna_rutina_koja_broji($f, $s);

  }

}

 

# e sad je lakše provjeriti kaj se je dogodilo s brojacima

# najmanji brojac:

my $min = (sort {$a <=> $b} keys %counters)[0];

print $min;

 

To je neki kostur kak bi to funkcioniralo...

 

Edit:

Ideja kako učitati sekvence u hash sa unique imenima:

 

# imena sekvenci, maksimalno 25 komada očigledno :)
my @names = ('A' .. 'Z');
my %sequences;
while (<>) {
  chomp;
  my ($i, $n) = each @names;
  $sequences{$n} = $_;
}

 

Anyway, ako imaš bilo kakvo pitanje oko sourca koji pišem, ne oskudijevaj sa zapitkivanjem :)

 

Poruka je uređivana zadnji put pet 11.11.2011 23:01 (Black Deus Typhon).
13 godina
neaktivan
offline
Re: Perl-pomoć

Odlično, puno ti hvala!

Moram priznati i da mi puno pomaže kad idem nekome objasniti problem, uvijek primjetim još nekoliko stvari koje nisam uzela u obzir prvi put.

Malo ću ovo prostudirati, sigurno ću se vratiti sa pitanjima :))

 

P.S. Stabla nam, u biti, predstavljaju brojači. To su one tri kombinacije (AB)(CD)... tako da rutina ide kroz prve članove (ne stabla..stabla nisu sekvence) sve četiri sekvence, uspoređuje ih na načine koje odgovaraju svakom stablu, pa onda kroz druge članove sekvence itd...

Ja sam iz crteža zaključila kada koje stablo pobjeđuje  i to sam postavila kao uvjete u petlju (ako su prvi elementi prvog i drugog retka isti te prvi elementi trećeg i četvrtog-stablo jedan je najbolje itd).  U prethodnom postu sam objasnila (koliko-toliko :) ) kako sam došla do toga kada koje stablo pobjeđuje (onda kada je potrebno najmanje supstitucija).

 

Pretpostavljam da ima i neki elegantniji način za to izvesti, za sad će poslužiti i ovaj početnički. :)

1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice