Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
## PR laborator


**Săptămâna:** `1` *(ex.: 1, 2, 3…)*
**Folder lab:** `labs/NN_topic` *(ex.: labs/01_intro&databases)*
**GitHub handle:** `<handle>`
Expand Down
7 changes: 6 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -53,5 +53,10 @@ build/
!data/sample/
!data/sample/**
data/sample/data_generation_notes.md
<<<<<<< HEAD

assigments/
data/work/olezhka0809/lab01/my_tp53_dr_protein.fasta

=======
data/work/olezhka0809/lab01/my_tp53_dr_protein.fasta
>>>>>>> faf072e (Lab 2: Create subbmissions folder and add specific files for user olezhka0809)
109 changes: 37 additions & 72 deletions labs/01_intro&databases/data/brca1.gb
Original file line number Diff line number Diff line change
@@ -1,84 +1,49 @@
LOCUS NC_060941 84276897 bp DNA linear CON 06-AUG-2025
DEFINITION Homo sapiens isolate CHM13 chromosome 17, alternate assembly
T2T-CHM13v2.0.
ACCESSION NC_060941
VERSION NC_060941.1
DBLINK BioProject: PRJNA807723
BioSample: SAMN03255769
Assembly: GCF_009914755.1
KEYWORDS RefSeq.
LOCUS PX436992 350 bp DNA linear PRI 07-OCT-2025
DEFINITION Homo sapiens isolate AB17 BRCA1 protein (BRCA1) gene, partial cds.
ACCESSION PX436992
VERSION PX436992.1
KEYWORDS .
SOURCE Homo sapiens (human)
ORGANISM Homo sapiens
Eukaryota; Metazoa; Chordata; Craniata; Vertebrata; Euteleostomi;
Mammalia; Eutheria; Euarchontoglires; Primates; Haplorrhini;
Catarrhini; Hominidae; Homo.
REFERENCE 1 (bases 1 to 84276897)
AUTHORS Nurk,S., Koren,S., Rhie,A., Rautiainen,M., Bzikadze,A.V.,
Mikheenko,A., Vollger,M.R., Altemose,N., Uralsky,L., Gershman,A.,
Aganezov,S., Hoyt,S.J., Diekhans,M., Logsdon,G.A., Alonge,M.,
Antonarakis,S.E., Borchers,M., Bouffard,G.G., Brooks,S.Y.,
Caldas,G.V., Chen,N.C., Cheng,H., Chin,C.S., Chow,W., de Lima,L.G.,
Dishuck,P.C., Durbin,R., Dvorkina,T., Fiddes,I.T., Formenti,G.,
Fulton,R.S., Fungtammasan,A., Garrison,E., Grady,P.G.S.,
Graves-Lindsay,T.A., Hall,I.M., Hansen,N.F., Hartley,G.A.,
Haukness,M., Howe,K., Hunkapiller,M.W., Jain,C., Jain,M.,
Jarvis,E.D., Kerpedjiev,P., Kirsche,M., Kolmogorov,M., Korlach,J.,
Kremitzki,M., Li,H., Maduro,V.V., Marschall,T., McCartney,A.M.,
McDaniel,J., Miller,D.E., Mullikin,J.C., Myers,E.W., Olson,N.D.,
Paten,B., Peluso,P., Pevzner,P.A., Porubsky,D., Potapova,T.,
Rogaev,E.I., Rosenfeld,J.A., Salzberg,S.L., Schneider,V.A.,
Sedlazeck,F.J., Shafin,K., Shew,C.J., Shumate,A., Sims,Y.,
Smit,A.F.A., Soto,D.C., Sovic,I., Storer,J.M., Streets,A.,
Sullivan,B.A., Thibaud-Nissen,F., Torrance,J., Wagner,J.,
Walenz,B.P., Wenger,A., Wood,J.M.D., Xiao,C., Yan,S.M., Young,A.C.,
Zarate,S., Surti,U., McCoy,R.C., Dennis,M.Y., Alexandrov,I.A.,
Gerton,J.L., O'Neill,R.J., Timp,W., Zook,J.M., Schatz,M.C.,
Eichler,E.E., Miga,K.H. and Phillippy,A.M.
TITLE The complete sequence of a human genome
JOURNAL Science 376 (6588), 44-53 (2022)
PUBMED 35357919
COMMENT REFSEQ INFORMATION: The reference sequence is identical to
CP068261.2.
Assembly name: T2T-CHM13v2.0
The genomic sequence for this RefSeq record is from the
whole-genome assembly released by the T2T Consortium on 2022/01/24.

##Genome-Assembly-Data-START##
Assembly Provider :: T2T Consortium
Assembly Date :: 23-APR-2021
Assembly Method :: T2T assembly pipeline + rDNA (see
manuscript for details) v. 04/23/2021
Assembly Name :: T2T-CHM13v2.0
Genome Representation :: Full
Expected Final Version :: No
Genome Coverage :: 30.0x
Sequencing Technology :: PacBio Sequel II HiFi; Oxford Nanopore
MinION; Illumina NovaSeq
##Genome-Assembly-Data-END##

##Genome-Annotation-Data-START##
Annotation Provider :: NCBI RefSeq
Annotation Status :: Updated annotation
Annotation Name :: GCF_009914755.1-RS_2025_08
Annotation Pipeline :: NCBI eukaryotic genome annotation
pipeline
Annotation Software Version :: 10.4
Annotation Method :: Best-placed RefSeq; Gnomon;
RefSeqFE; cmsearch; tRNAscan-SE
Features Annotated :: Gene; mRNA; CDS; ncRNA
Annotation Date :: 08/01/2025
##Genome-Annotation-Data-END##
REFERENCE 1 (bases 1 to 350)
AUTHORS Abbas,A.F., Al-Shawi,A.A. and Ali,D.S.
TITLE Direct Submission
JOURNAL Submitted (27-SEP-2025) Department of Chemistry, University of
Basrah, Dur Al Thabat, Al Zubair, Basrah +964, Iraq
COMMENT ##Assembly-Data-START##
Sequencing Technology :: Sanger dideoxy sequencing
##Assembly-Data-END##
FEATURES Location/Qualifiers
source 1..84276897
source 1..350
/organism="Homo sapiens"
/mol_type="genomic DNA"
/isolate="CHM13"
/isolate="AB17"
/db_xref="taxon:9606"
/chromosome="17"
/sex="female"
/cell_line="CHM13htert"
/tissue_type="hydatidiform mole"
/note="haploid cell line"
CONTIG join(NW_025804937.1:1..84276897)
/geo_loc_name="Iraq: Basrah"
/collection_date="2025-04-01"
/collected_by="Ali Falih Abbas"
gene <1..>350
/gene="BRCA1"
mRNA <30..>113
/gene="BRCA1"
/product="BRCA1 protein"
CDS <30..>113
/gene="BRCA1"
/note="breast cancer 1, early onset"
/codon_start=1
/product="BRCA1 protein"
/protein_id="YAW76721.1"
/translation="HDFEVRGDVVNGRNHQGPKRARESQDRK"
ORIGIN
1 cctgatgggt tgtgtttggt ttctttcagc atgattttga agtcagagga gatgtggtca
61 atggaagaaa ccaccaaggt ccaaagcgag caagagaatc ccaggacaga aaggtaaagc
121 tccctccctc aagttgacaa aaatctcacc ccaccactct gtattccact cccctttgca
181 gagatgggcc gcttcatttt gtaagactta ttacatacat acacagtgct agatactttc
241 acacaggttc ttttttcact cttccatccc aaccacataa ataagtattg tctctacttt
301 atgaatgata aaactaagag atttagagag gctgtgtatt ggggattccc
//

1 change: 1 addition & 0 deletions labs/01_intro&databases/roster/handles.csv
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ Iorga Razvan,razvan-vlad
Coroiu Samuel,coroiusamy
Simandan Petra-Ariana,numipasaaa
Stana Andrei,StanaAndrei
Garnautan Oleg,olezhka0809
239 changes: 239 additions & 0 deletions labs/01_intro&databases/submissions/olezhka0809/ex01_multifasta_gc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,239 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Exercițiu (Lab 1): Descărcare FASTA + calcul GC

Scop:
1) Descărcați un fișier FASTA de la NCBI (nucleotide sau proteină).
2) Salvați fișierul local în data/work/<handle>/lab01/ (NU îl urcați pe git).
3) Calculați fracția GC pentru fiecare înregistrare din fișier.

Instrucțiuni:
- Rulați scriptul cu argumentele necesare (exemple):
python ex01_multifasta_gc.py --email student@example.com \
--query "TP53[Gene] AND Homo sapiens[Organism]" \
--retmax 3 \
--out data/work/<handle>/lab01/my_tp53.fa

python ex01_multifasta_gc.py --email student@example.com \
--accession NM_000546 \
--out data/work/<handle>/lab01/nm000546.fa

- Pași de completat:
1) Configurați Entrez cu email (și api_key opțional).
2) Dacă primiți accession → descărcați acel record cu efetch.
3) Dacă primiți query → faceți esearch pentru IdList, apoi efetch pentru acele ID-uri.
4) Scrieți rezultatele în fișierul dat prin --out.
5) Citiți fișierul FASTA local și calculați GC pentru fiecare secvență.
6) Afișați rezultatele pe ecran: <id>\tGC=<valoare cu 3 zecimale>.
"""

import argparse
from pathlib import Path
import sys

from Bio import SeqIO
from Bio import Entrez


def gc_fraction(seq: str) -> float:
"""Fracție GC pentru o secvență; robust la litere mici/mari și non-ATGC."""
s = seq.upper()
atgc = [c for c in s if c in ("A", "T", "G", "C")]
if not atgc:
return 0.0
g = atgc.count("G")
c = atgc.count("C")
return (g + c) / float(len(atgc))


def download_fasta(email: str, out_path: Path, query: str = None,
accession: str = None, db: str = "nuccore",
retmax: int = 3, api_key: str = None) -> int:
"""
Descarcă secvențe FASTA din NCBI folosind Entrez.

Args:
email: Email obligatoriu pentru NCBI
out_path: Path pentru fișierul de output
query: Query de căutare (ex: "TP53[Gene] AND Homo sapiens[Organism]")
accession: Accession number specific (ex: NM_000546)
db: Baza de date NCBI (nuccore sau protein)
retmax: Număr maxim de rezultate
api_key: API key NCBI (opțional, pentru rate limiting mai bun)

Returns:
Numărul de înregistrări descărcate
"""
# Configurare Entrez
Entrez.email = email
if api_key:
Entrez.api_key = api_key

try:
# Caz 1: Descărcare direct prin accession number
if accession:
print(f"[info] Descărcare accession: {accession} din {db}")
handle = Entrez.efetch(
db=db,
id=accession,
rettype="fasta",
retmode="text"
)
fasta_data = handle.read()
handle.close()

# Scriere în fișier
with open(out_path, "w") as f:
f.write(fasta_data)

# Numără înregistrările
num_records = fasta_data.count(">")
return num_records

# Caz 2: Căutare cu query și descărcare rezultate
elif query:
print(f"[info] Căutare query: '{query}' în {db}")

# Pasul 1: esearch pentru a obține lista de ID-uri
search_handle = Entrez.esearch(
db=db,
term=query,
retmax=retmax,
usehistory="y"
)
search_results = Entrez.read(search_handle)
search_handle.close()

id_list = search_results.get("IdList", [])
count = int(search_results.get("Count", 0))

print(f"[info] Găsite {count} rezultate, se descarcă primele {len(id_list)}")

if not id_list:
print("[warning] Nu s-au găsit rezultate pentru acest query!")
# Creează fișier gol
out_path.touch()
return 0

# Pasul 2: efetch pentru a descărca secvențele
fetch_handle = Entrez.efetch(
db=db,
id=",".join(id_list),
rettype="fasta",
retmode="text"
)
fasta_data = fetch_handle.read()
fetch_handle.close()

# Scriere în fișier
with open(out_path, "w") as f:
f.write(fasta_data)

return len(id_list)

else:
print("[error] Trebuie să furnizați --query sau --accession!", file=sys.stderr)
sys.exit(1)

except Exception as e:
print(f"[error] Eroare la descărcarea din NCBI: {e}", file=sys.stderr)
sys.exit(1)


def main():
ap = argparse.ArgumentParser(
description="Descarcă secvențe FASTA din NCBI și calculează conținutul GC",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Exemple de utilizare:

# Descărcare prin query
python ex01_multifasta_gc.py --email student@example.com \
--query "TP53[Gene] AND Homo sapiens[Organism]" \
--retmax 3 \
--out data/work/olezhka0809/lab01/my_tp53.fa

# Descărcare prin accession
python ex01_multifasta_gc.py --email student@example.com \
--accession NM_000546 \
--out data/work/olezhka0809/lab01/nm000546.fa

# Descărcare proteine
python ex01_multifasta_gc.py --email student@example.com \
--query "TP53[Gene] AND Homo sapiens[Organism]" \
--db protein \
--retmax 5 \
--out data/work/olezhka0809/lab01/tp53_proteins.fa
"""
)

ap.add_argument("--email", required=True, help="Email obligatoriu pentru NCBI Entrez")
ap.add_argument("--api_key", help="NCBI API key (opțional)")
ap.add_argument("--query", help="Ex: 'TP53[Gene] AND Homo sapiens[Organism]'")
ap.add_argument("--accession", help="Ex: NM_000546")
ap.add_argument("--db", default="nuccore", choices=["nuccore", "protein"])
ap.add_argument("--retmax", type=int, default=3)
ap.add_argument("--out", required=True, help="Fișier FASTA de ieșire")
args = ap.parse_args()

# Validare: trebuie să avem query SAU accession
if not args.query and not args.accession:
print("[error] Trebuie să furnizați --query sau --accession!", file=sys.stderr)
ap.print_help()
sys.exit(1)

out_path = Path(args.out)
out_path.parent.mkdir(parents=True, exist_ok=True)

print("=" * 80)
print("NCBI FASTA DOWNLOADER & GC CALCULATOR")
print("=" * 80)

# Pasul 1: Descărcare din NCBI
n = download_fasta(
args.email,
out_path,
query=args.query,
accession=args.accession,
db=args.db,
retmax=args.retmax,
api_key=args.api_key
)
print(f"[ok] Am scris {n} înregistrări în: {out_path}")

# Pasul 2: Citire fișier FASTA local
if not out_path.exists() or out_path.stat().st_size == 0:
print("[warning] Fișierul este gol sau nu există!")
return

print("\n" + "=" * 80)
print("CALCUL CONȚINUT GC")
print("=" * 80)

records = SeqIO.parse(out_path, "fasta")

# Pasul 3: Calculare și afișare GC pentru fiecare secvență
total_records = 0
total_gc = 0.0

for rec in records:
gc = gc_fraction(str(rec.seq))
total_gc += gc
total_records += 1

print(f"{rec.id}\tGC={gc:.3f}\tLen={len(rec.seq)}")

# Statistici finale
if total_records > 0:
avg_gc = total_gc / total_records
print("\n" + "-" * 80)
print(f"Total secvențe: {total_records}")
print(f"GC mediu: {avg_gc:.3f}")
print("=" * 80)
else:
print("[warning] Nu s-au găsit secvențe în fișier!")


if __name__ == "__main__":
main()
Loading