4 swap_sample_wells.pl - a script to swap samples in genotyping plates
8 perl swap_sample_wells.pl -h host -D database [-t] -f file -p PW
10 The file should have the following columns, tab delimited, no header:
12 sample_stock_uniquename old_well new_well
16 iita-mas-ng-me-0011_G11 G11 H12
19 The script will try to change the well location in the uniquename as well as the properties col_number, row_number, and plot_number (which contains the well location, such as H12)
23 Lukas Mueller and Guillaume Bauchet
33 use Bio
::Chado
::Schema
;
34 use SGN
::Model
::Cvterm
;
36 our ($opt_H, $opt_D, $opt_p, $opt_f, $opt_t);
42 print STDERR
"Connecting to database...\n";
43 my $dsn = 'dbi:Pg:database='.$opt_D.";host=".$opt_H.";port=5432";
45 my $dbh = DBI
->connect($dsn, "postgres", $pw);
47 print STDERR
"Connecting to DBI schema...\n";
48 my $schema = Bio
::Chado
::Schema
->connect($dsn, "postgres", $pw);
53 open(my $F, "<", $file) || die "Can't open file $file.\n";
55 my $guard = $schema->txn_scope_guard();
57 my $col_number = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'col_number', 'stock_property')->cvterm_id();
58 my $row_number = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'row_number', 'stock_property')->cvterm_id();
59 my $plot_number = SGN
::Model
::Cvterm
-> get_cvterm_row
($schema,'plot number', 'stock_property')->cvterm_id();
60 my $tissue_sample = SGN
::Model
::Cvterm
->get_cvterm_row($schema, 'tissue_sample', 'stock_type')->cvterm_id();
64 my($sample_stock_id, $old_well, $new_well) = split /\t/;
66 print STDERR
"Working on sample '$sample_stock_id'...\n";
68 my $old_row = $old_well;
69 $old_row =~ s/(\w).*/$1/;
71 my $old_col = $old_well;
72 $old_col =~ s/.*(\d+)/$1/;
74 my $new_row = $new_well;
75 $new_row =~ s/(\w).*/$1/;
77 my $new_col = $new_well;
78 $new_col =~ s/.*(\d+)/$1/;
80 my $rs = $schema->resultset("Stock::Stock")->search( { uniquename
=> $sample_stock_id });
82 if ($rs->count() < 1) {
83 print STDERR
"Sample $sample_stock_id does not exist! Skipping...\n";
86 elsif ($rs->count() > 1) {
87 print STDERR
"Warning! Several samples named $sample_stock_id exist in the database!\n";
90 my $row = $rs->next();
91 my $uniquename = $row->uniquename();
92 my $old_uniquename = $uniquename;
93 my $stock_id = $row->stock_id();
95 print STDERR
"Fixing stock name...\n";
97 print STDERR
"Old uniquename: $uniquename\n";
98 $uniquename =~ s/$old_well/\_N\_$new_well/;
101 print STDERR
"New uniquename: $uniquename\n";
102 $row->update( { uniquename
=> $uniquename, name
=> $uniquename });
105 print STDERR
"Fixing col location...\n";
107 $rs = $schema->resultset("Stock::Stockprop")->search( { stock_id
=> $stock_id, type_id
=> $col_number, value
=> $old_col });
109 if ($rs->count() > 1) {
110 print STDERR
"More than one col number associated with sample $old_uniquename\n";
112 elsif ($rs->count() < 1) {
113 print STDERR
"No col number $old_col associated with sample $old_uniquename\n";
118 $row->update( { value
=> $new_col });
121 print STDERR
"Fixing row number...\n";
122 $rs = $schema->resultset("Stock::Stockprop")->search( { stock_id
=> $stock_id, type_id
=> $row_number, value
=> $old_row });
124 if ($rs->count() > 1) {
125 print STDERR
"More than one row number associated with sample $old_uniquename\n";
127 elsif ($rs->count() < 1) {
128 print STDERR
"No row number $old_row associated with sample $old_uniquename\n";
134 $row->update( { value
=> $new_row});
136 print STDERR
"Fixing well number...\n";
138 $rs = $schema->resultset("Stock::Stockprop")->search( { stock_id
=> $stock_id, type_id
=> $plot_number, value
=> $old_well });
141 if ($rs->count() > 1) {
142 die "More than one well number associated with sample $old_uniquename\n";
144 elsif ($rs->count() < 1) {
145 die "No well number $old_well associated with sample $old_uniquename\n";
150 $row->update( { value
=> $new_well });
152 print STDERR
"Moved sample $old_uniquename ($old_well, $old_row, $old_col) to new location $uniquename ($new_well, $new_row, $new_col).\n\n";
155 print STDERR
"Committing changes... ";
157 if (!$opt_t ) { $guard->commit();}
158 else { $guard->rollback(); }
160 print STDERR
"Done!\n";