src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl 1.7

1.7 2009/04/22 23:57:17 tdreszer
Support for metadata setting from trackDb
Index: src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl,v
retrieving revision 1.6
retrieving revision 1.7
diff -b -B -U 4 -r1.6 -r1.7
--- src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl	20 Mar 2009 21:46:03 -0000	1.6
+++ src/hg/encode/encodeDownloadsPage/encodeDownloadsPage.pl	22 Apr 2009 23:57:17 -0000	1.7
@@ -92,19 +92,91 @@
     local *OUT_FILE = shift;
     my ($file,$size,$date,$releaseDate,$metaData) = @_;
 
     if($releaseDate && length($releaseDate) > 0) {
-        print OUT_FILE "<TR><TD align='left'>&nbsp;&nbsp;$releaseDate\n";
+        print OUT_FILE "<TR valign='top'><TD align='left'>&nbsp;&nbsp;$releaseDate\n";
     } else {
-        print OUT_FILE "<TR><TD align='left'>&nbsp;\n";
+        print OUT_FILE "<TR valign='top'><TD align='left'>&nbsp;\n";
     }
     print OUT_FILE "<TD><A type='application/zip' target='_blank' HREF=\"$file\">$file</A>\n";
     print OUT_FILE "<TD align='right'>&nbsp;&nbsp;$size<TD>&nbsp;&nbsp;$date&nbsp;&nbsp;\n";
     if($metaData && length($metaData) > 0) {
-        print OUT_FILE "<TD>$metaData\n";
+        print OUT_FILE "<TD nowrap>$metaData\n";
     }
     print OUT_FILE "</TR>\n";
 }
+
+sub metadataLineToArrays {
+# Creates pair of arrays that contain the settings in a metadata setting line (retains order)
+    my ($line) = @_;
+
+    my @tags;
+    my @vals;
+    my $tix = 0;
+    while($line && length($line)>0) {
+        my $tag;
+        my $val;
+        ( $tag,$line ) = split(/=/, $line,2);
+        $tag =~ s/\s+//g;
+        my @chars = split(//,$line);
+        if($chars[0] ne "\"") {
+            ( $val,$line ) = split(/\s+/, $line,2);
+        } else {
+            my $ix=1;
+            while($ix < length($line) && ($chars[$ix] ne '"' || $chars[$ix - 1] eq '\\')) {  # Find next " skipping escaped \"
+                $ix++;
+            }
+            if($ix < length($line)) {
+                $val  = substr($line,1,$ix - 1);
+                $line = substr($line,  $ix + 1);
+                $val  =~ s/\\"/\"/g;
+            } else {
+                $val = $line;
+                $line = "";
+            }
+        }
+        $tags[$tix  ] = $tag;
+        $vals[$tix++] = $val;
+    }
+    return ( \@tags, \@vals );
+}
+
+sub metadataArraysRemoveHash {
+# Removes members of has from metadata Arrays
+    my ($tagsRef,$valsRef,$removeRef) = @_;
+    my @tags = @{$tagsRef};
+    my @vals = @{$valsRef};
+    my %remove = %{$removeRef};
+
+    my @tagsOk;
+    my @valsOk;
+    my $nix = 0;
+    my $oix = 0;
+    while($tags[$oix]) {
+        if($remove{$tags[$oix]}) {
+            $oix++;
+        } else {
+            $tagsOk[$nix  ] = $tags[$oix  ];
+            $valsOk[$nix++] = $vals[$oix++];
+        }
+    }
+    return ( \@tagsOk, \@valsOk );
+}
+
+sub metadataArraysJoin {
+# Removes members of has from metadata Arrays
+    my ($tagsRef,$valsRef) = @_;
+    my @tags = @{$tagsRef};
+    my @vals = @{$valsRef};
+    my @meta;
+    my $tix = 0;
+    while($tags[$tix]) {
+        $meta[$tix] = join("=",($tags[$tix],$vals[$tix]));
+        $tix++;
+    }
+    return @meta;
+}
+
 ############################################################################
 # Main
 
 # Get ls -hog of directory ( working dir or -dir )
@@ -174,27 +246,32 @@
     my $results = $db->quickQuery("select type from trackDb where tableName = '$tableName'");
     if($results) {
         my ($type) = split(/\s+/, $results);    # White space
         $metaData{type} = $type;
+    } else {
+        if($dataType eq "fastq" || $dataType eq "tagAlign" || $dataType eq "csfasta" || $dataType eq "csqual") {
+            $metaData{type} = $dataType;
+        }
+    }
         $results = $db->quickQuery("select settings from trackDb where tableName = '$tableName'");
-#print OUT_FILE "Settings:$results\n";
-        if( $results ) {
-            my @settings = split(/\n/, $results); # New Line
-            while (@settings) {
-                my @pair = split(/\s+/, (shift @settings),3);
-#print OUT_FILE "Settings:". join('=',@pair) . "\n";
-                if($pair[0] eq "subTrack") {
-                    my $parentSettings = $db->quickQuery("select settings from trackDb where tableName = '$pair[1]'");
-                    if( $parentSettings ) {
-                        my @parent = split(/\n/, $parentSettings); # New Line
-                        while (@parent) {
-                            my @par = split(/\s+/, (shift @parent));
-                            if( $par[0] eq "wgEncode" ) {
-                                $typePrefix = "ENCODE ";
+    if(!$results) {
+        ### TODO: This needs to be replaced with a lookup of fileDb.ra
+        my $associatedTable = $tableName;
+        $associatedTable =~ s/RawData/RawSignal/    if $tableName =~ /RawData/;
+        $associatedTable =~ s/Alignments/RawSignal/ if $tableName =~ /Alignments/;
+        if($tableName ne $associatedTable) {
+            $results = $db->quickQuery("select settings from trackDb where tableName = '$associatedTable'");
+            if($results) {
+                $metaData{parent} = "RawData&rarr;RawSignal" if $tableName =~ /RawData/;
+                $metaData{parent} = "Alignments&rarr;RawSignal" if $tableName =~ /Alignments/;
                             }
                         }
                     }
-                } elsif($pair[0] eq "releaseDate") {
+    if( $results ) {
+        my @settings = split(/\n/, $results); # New Line
+        while (@settings) {
+            my @pair = split(/\s+/, (shift @settings),2);
+            if($pair[0] eq "releaseDate" && length($releaseDate) == 0) {
                     $releaseDate = $pair[1];
                 } elsif($pair[0] eq "dateSubmitted" && length($releaseDate) == 0) {
                     my ($YYYY,$MM,$DD) = split('-',$pair[1]);
                     $MM = $MM - 1;
@@ -202,15 +279,42 @@
                     $rMon = $rMon + 1;
                     $releaseDate = sprintf("%04d-%02d-%02d", (1900 + $rYear),$rMon,$rMDay);
                 } elsif($pair[0] eq "cell" || $pair[0] eq "antibody" || $pair[0] eq "promoter") {
                     $metaData{$pair[0]} = $pair[1];
+            } elsif($pair[0] eq "metadata") {
+                # Use metadata setting with priority  ### TODO Need to do this for files
+                my ( $tagRef, $valRef ) = metadataLineToArrays($pair[1]);
+                my @tags = @{$tagRef};
+                my @vals = @{$valRef};
+                my $tix = 0;
+                while($tags[$tix]) {
+                    if($tags[$tix] eq "dateUnrestricted") {
+                        $releaseDate = $vals[$tix];
+                    } elsif($tags[$tix] eq "dateSubmitted" && length($releaseDate) == 0) {
+                        my ($YYYY,$MM,$DD) = split('-',$vals[$tix]);
+                        $MM = $MM - 1;
+                        my (undef, undef, undef, $rMDay, $rMon, $rYear) = Encode::restrictionDate(timelocal(0,0,0,$DD,$MM,$YYYY));
+                        $rMon = $rMon + 1;
+                        $releaseDate = sprintf("%04d-%02d-%02d", (1900 + $rYear),$rMon,$rMDay);
                 }
+                    $tix++;
+                }
+                my %remove;
+                $remove{project}    = 1;
+                $remove{composite}  = 1;
+                $remove{fileName}    = 1;
+                $remove{dateSubmitted} = 1;
+                $remove{dateUnrestricted}  = 1;
+                ( $tagRef, $valRef ) =  metadataArraysRemoveHash( \@tags,\@vals,\%remove );
+                @tags = @{$tagRef};
+                @vals = @{$valRef};
+                my @metas = metadataArraysJoin( \@tags,\@vals );
+                $metaData{metadata} = join("; ", @metas);
             }
         }
     } else {
         if($dataType eq "fastq" || $dataType eq "tagAlign" || $dataType eq "csfasta" || $dataType eq "csqual") {
             $metaData{type} = $dataType;
-            $typePrefix = "ENCODE ";
             my ($YYYY,$MM,$DD) = split('-',$file[3]);
             $MM = $MM - 1;
             my (undef, undef, undef, $rMDay, $rMon, $rYear) = Encode::restrictionDate(timelocal(0,0,0,$DD,$MM,$YYYY));
             $rMon = $rMon + 1;
@@ -234,16 +338,24 @@
         }
     }
     my @tmp;
     if(my $type = $metaData{type}) {
-        push(@tmp, "${typePrefix}type: $type");
+        push(@tmp, "type: $type");
         delete $metaData{type};
     }
+    if($metaData{metadata}) {
+        if($metaData{parent}) {
+            push(@tmp, $metaData{parent});
+            delete $metaData{parent};
+        }
+        push(@tmp, $metaData{metadata});
+    } else {
     if(my $cell = $metaData{cell}) {
         push(@tmp, "cell: $cell");
         delete $metaData{cell};
     }
     push(@tmp, "$_: " . $metaData{$_}) for (sort keys %metaData);
+    }
     my $metaData = join("; ", @tmp);
     # Now file contains: [file without path] [tableName] [size] [date] [releaseDate] [fullpath/file]
     htmlTableRow(*OUT_FILE,$fileName,$file[2],$file[3],$releaseDate,$metaData);
 }