pipeline/codes/target_therapy_fusion.pl

192 lines
6.3 KiB
Perl
Raw Permalink Normal View History

2023-11-01 10:09:29 +08:00
#!/usr/bin/env perl
use strict;
use warnings;
2023-11-29 15:13:30 +08:00
die "useage:perl $0 input output cancer_type" unless @ARGV == 3;
2023-11-01 10:09:29 +08:00
2023-11-29 15:13:30 +08:00
my ($input, $output, $cancer_type) = @ARGV;
2023-11-01 10:09:29 +08:00
2023-11-29 15:13:30 +08:00
my $database_path = defined $ENV{'DATABASE'} ? $ENV{'DATABASE'} : "/dataseq/jmdna/codes/reportbase";
print "Fusion药物注释使用路径$database_path\n";
open MUT, "$database_path/fusion.csv";
<MUT>;
my %mut;
while (<MUT>) {
my @line = split(/,/);
2023-12-29 10:11:01 +08:00
$mut{lc $line[1]}{lc $line[0]} = $line[2];
2023-11-01 10:09:29 +08:00
}
2023-11-29 15:13:30 +08:00
open THERAPY, "$database_path/targetTherapy.txt";
2023-11-01 10:09:29 +08:00
my $h1 = <THERAPY>;
chomp $h1;
my %therapy;
while (<THERAPY>) {
chomp;
my @line = split("\t");
2023-12-29 10:11:01 +08:00
push @{$therapy{lc $line[0]}{lc $line[1]}}, $_ if ($line[1] =~ /fusion/i and $line[9] ne 'D' and $line[2] !~ /Leukemia|Lymphoma|Myeloid/i);
2023-11-01 10:09:29 +08:00
}
##药物翻译信息
2023-11-29 15:13:30 +08:00
open DRUG, "$database_path/target_drug.txt";
2023-11-01 10:09:29 +08:00
my %drug;
<DRUG>;
while (<DRUG>) {
chomp;
my @line = split(/\t/);
next unless $line[1];
foreach my $drug (split(/\|/, $line[0])) {
$drug{lc $drug} = $line[1];
}
}
sub drug {
my $drugs = shift @_;
my @translation;
foreach my $drug (split(/,/, $drugs)) {
if ($drug =~ /\+/) {
my $plus;
foreach my $drug_c (split(/\s+\+\s+/, $drug)) {
my $new = (exists $drug{lc $drug_c}) ? $drug{lc $drug_c} : ($drug_c);
$plus .= " + $new";
}
$plus =~ s/^ \+ //;
push @translation, $plus;
}
else {
my $new = (exists $drug{lc $drug}) ? $drug{lc $drug} : ($drug);
push @translation, $new;
}
}
return (join(",", @translation));
}
2023-11-29 15:13:30 +08:00
open DIS, "$database_path/oncotree.cancertype.20230801.txt";
2023-11-01 10:09:29 +08:00
<DIS>;
my (%dis, @id, %dis2);
while (<DIS>) {
chomp;
my @line = split(/\t/);
$dis{lc $line[2]} = $line[3];
$dis{lc $line[4]} = $line[5];
push @{$dis2{$line[0]}}, lc $line[2];
push @{$dis2{$line[0]}}, lc $line[4];
push @id, $line[0];
}
foreach my $ID ($cancer_type) {
my @family;
my @ids = split("", $ID);
for (my $i = 1; $i < @ids; $i = $i + 2) {
push @family, join("", @ids[0 .. $i]);
}
push @family, (grep {/^$ID/} @id);
foreach my $t (@family) {
push @{$dis2{$ID}}, @{$dis2{$t}};
}
}
foreach my $key (keys(%dis2)) {
my %uniq;
@{$dis2{$key}} = grep {++$uniq{$_} < 2} @{$dis2{$key}};
}
2023-11-29 15:13:30 +08:00
open IN, "$input";
open POS, ">$output.pos.txt";
open NEG, ">$output.neg.txt";
open VUS, ">$output.vus.txt";
2023-11-01 10:09:29 +08:00
2023-11-29 15:13:30 +08:00
my $h2 = <IN>;
chomp $h2;
2024-02-21 11:26:35 +08:00
print POS $h2 . "\tOncogenic\t" . join("\t", (split("\t", $h1))[0 .. 9, 14]) . "\tLabel\tDrugCn\tIndication\treport_need_note\n";
2023-11-29 15:13:30 +08:00
print NEG $h2 . "\tOncogenic\n";
print VUS $h2 . "\tOncogenic\n";
my (@pos, @neg, @vus);
my @column_names = split('\t', $h2);
while (<IN>) {
chomp;
my @splitline = split(/\t/);
# 将数据与表头对应
my %record;
@record{@column_names} = @splitline;
2023-12-29 10:11:01 +08:00
if (not exists $mut{lc "$record{'FUSION'} Fusion"}{lc $record{'GENE1'}} and not exists $mut{lc "$record{'FUSION'} Fusion"}{lc $record{'GENE2'}}) {
2023-11-29 15:13:30 +08:00
push @vus, "$_\t.";
}
else {
2023-12-29 10:11:01 +08:00
my $gene = (keys %{$mut{lc "$record{'FUSION'} Fusion"}})[0];
my $sig = $mut{lc "$record{'FUSION'} Fusion"}{lc $gene};
2023-11-29 15:13:30 +08:00
if ($sig =~ /neutral/i) {
push @neg, "$_\t$sig";
2023-11-01 10:09:29 +08:00
}
2023-11-29 15:13:30 +08:00
else {
2023-12-29 10:11:01 +08:00
if (not exists $therapy{lc $gene}) {
2023-11-29 15:13:30 +08:00
push @vus, "$_\t$sig";
2023-11-01 10:09:29 +08:00
}
else {
2023-11-29 15:13:30 +08:00
my $bool = 0;
##
2023-12-29 10:11:01 +08:00
if (exists $therapy{lc $gene}{lc "$record{'FUSION'} Fusion"}) {
foreach my $entry (@{$therapy{lc $gene}{lc "$record{'FUSION'}Fusion"}}) {
2023-11-29 15:13:30 +08:00
my @line = split("\t", $entry);
2024-02-19 16:13:10 +08:00
if (!defined($line[16])) {
$line[16] = '';
}
2023-11-29 15:13:30 +08:00
if (($line[14] eq 'A') and (grep {lc $line[2] eq lc $_} @{$dis2{$cancer_type}})) {
2024-02-19 16:13:10 +08:00
push @pos, "$_\t$sig\t" . join("\t", @line[0 .. 9, 14]) . "\t适应症" . "\t" . &drug($line[3]) . "\t" . $dis{lc $line[2]} . "\t" . $line[16];
2023-11-29 15:13:30 +08:00
$bool = 1;
}
elsif (($line[14] eq 'A') and (grep {lc $line[2] ne lc $_} @{$dis2{$cancer_type}})) {
2024-02-19 16:13:10 +08:00
push @pos, "$_\t$sig\t" . join("\t", @line[0 .. 9, 14]) . "\t非适应症" . "\t" . &drug($line[3]) . "\t" . $dis{lc $line[2]} . "\t" . $line[16];
2023-11-29 15:13:30 +08:00
$bool = 1;
}
elsif (grep {lc $line[2] eq lc $_} @{$dis2{$cancer_type}}) {
2024-02-19 16:13:10 +08:00
push @pos, "$_\t$sig\t" . join("\t", @line[0 .. 9, 14]) . "\t\.\t" . &drug($line[3]) . "\t" . $dis{lc $line[2]} . "\t" . $line[16];
2023-11-29 15:13:30 +08:00
$bool = 1;
}
2023-11-01 10:09:29 +08:00
}
2023-11-29 15:13:30 +08:00
}
##
2023-12-29 10:11:01 +08:00
if (exists $therapy{lc $gene}{lc "Fusion"}) {
foreach my $entry (@{$therapy{lc $gene}{lc "Fusion"}}) {
2023-11-29 15:13:30 +08:00
my @line = split("\t", $entry);
if (($line[14] eq 'A') and (grep {lc $line[2] eq lc $_} @{$dis2{$cancer_type}})) {
2024-02-19 16:13:10 +08:00
push @pos, "$_\t$sig\t" . join("\t", @line[0 .. 9, 14]) . "\t适应症" . "\t" . &drug($line[3]) . "\t" . $dis{lc $line[2]} . "\t" . $line[16];
2023-11-29 15:13:30 +08:00
$bool = 1;
2023-11-01 10:09:29 +08:00
}
2023-11-29 15:13:30 +08:00
elsif (($line[14] eq 'A') and (grep {lc $line[2] ne lc $_} @{$dis2{$cancer_type}})) {
2024-02-19 16:13:10 +08:00
push @pos, "$_\t$sig\t" . join("\t", @line[0 .. 9, 14]) . "\t非适应症" . "\t" . &drug($line[3]) . "\t" . $dis{lc $line[2]} . "\t" . $line[16];
2023-11-29 15:13:30 +08:00
$bool = 1;
}
elsif (grep {lc $line[2] eq lc $_} @{$dis2{$cancer_type}}) {
2024-02-19 16:13:10 +08:00
push @pos, "$_\t$sig\t" . join("\t", @line[0 .. 9, 14]) . "\t\.\t" . &drug($line[3]) . "\t" . $dis{lc $line[2]} . "\t" . $line[16];
2023-11-29 15:13:30 +08:00
$bool = 1;
2023-11-01 10:09:29 +08:00
}
}
}
2023-11-29 15:13:30 +08:00
push @vus, "$_\t$sig" if $bool == 0;
2023-11-01 10:09:29 +08:00
}
}
}
2023-11-29 15:13:30 +08:00
}
2023-11-01 10:09:29 +08:00
2023-11-29 15:13:30 +08:00
if (@pos) {
2023-11-01 10:09:29 +08:00
2023-11-29 15:13:30 +08:00
print POS join("\n", @pos) . "\n";
2023-11-01 10:09:29 +08:00
}
2023-11-29 15:13:30 +08:00
if (@neg) {
2023-11-01 10:09:29 +08:00
2023-11-29 15:13:30 +08:00
print NEG join("\n", @neg) . "\n";
2023-11-01 10:09:29 +08:00
}
2023-11-29 15:13:30 +08:00
if (@vus) {
print VUS join("\n", @vus) . "\n";
}
2023-11-01 10:09:29 +08:00