- Timestamp:
- Nov 8, 2011, 2:44:12 PM (15 years ago)
- Location:
- branches/eam_branches/ipp-20110906
- Files:
-
- 2 edited
-
. (modified) (1 prop)
-
ippScripts/scripts/lap_science.pl (modified) (22 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/eam_branches/ipp-20110906
- Property svn:mergeinfo changed
-
branches/eam_branches/ipp-20110906/ippScripts/scripts/lap_science.pl
r32195 r32630 27 27 my ( $camera, $dbname); 28 28 my ( $lap_id ); 29 my ( $queue_list ); 29 30 my ( $chip_mode, $monitor_mode, $cleanup_mode); 30 31 … … 44 45 45 46 'lap_id=s' => \$lap_id, 47 'queue_list=s' => \$queue_list, 46 48 47 49 'chip_mode' => \$chip_mode, … … 200 202 return($exposure); 201 203 } 204 205 sub remake_this_exposure_by_update { 206 my $exposure = shift; 207 208 my @utctime = gmtime(); 209 $utctime[5] += 1900; 210 $utctime[4] += 1; 211 212 my $label = $exposure->{label}; 213 214 my $date = sprintf("%4d%02d%02d",$utctime[5],$utctime[4],$utctime[3]); 215 my $workdir_date = sprintf("%4d/%02d/%02d",$utctime[5],$utctime[4],$utctime[3]); 216 my $workdir = "neb://\@HOST\@.0/${dbname}/${label}/${workdir_date}"; 217 my $data_group = "${label}.${date}"; 218 219 my $chiptool_info_cmd = "chiptool -listrun -exp_id $exposure->{exp_id} -chip_id $exposure->{chip_id} "; 220 $chiptool_info_cmd .= " -dbname $dbname " if defined $dbname; 221 222 my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 223 run(command => $chiptool_info_cmd, verbose => $verbose); 224 unless ($success) { 225 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 226 &my_die("Unable to perform chiptool -listrun: $error_code", $exposure->{exp_id}, $data_group); 227 } 228 my $chips = $mdcParser->parse_list(join "", @$stdout_buf) or 229 &my_die("Unable to parse metadata from chiptool -listrun", $exposure->{exp_id}, $data_group); 230 # There should be only one. 231 my $chip = ${ $chips }[0]; 232 my $chip_magicDS_id = 0; 233 if ($chip) { 234 $chip_magicDS_id = $chip->{magic_ds_id}; 235 } 236 if ($chip_magicDS_id == 0) { 237 # return(&remake_this_exposure($exposure)); 238 } 239 240 my $warptool_info_cmd = "warptool -listrun -exp_id $exposure->{exp_id} -chip_id $exposure->{chip_id} "; 241 $warptool_info_cmd .= " -dbname $dbname " if defined $dbname; 242 ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 243 run(command => $warptool_info_cmd, verbose => $verbose); 244 unless ($success) { 245 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 246 &my_die("Unable to perform warptool -listrun: $error_code", $exposure->{exp_id}, $data_group); 247 } 248 my $warps = $mdcParser->parse_list(join "", @$stdout_buf) or 249 &my_die("Unable to parse metadata from warptool -listrun", $exposure->{exp_id}, $data_group); 250 # There should be only one. 251 my $warp = ${ $warps }[0]; 252 my $warp_id = 0; 253 if ($warp) { 254 $warp_id = $warp->{warp_id}; 255 } 256 else { 257 $exposure->{data_state} = 'drop'; 258 return($exposure); 259 } 260 if ($warp_id == 0) { 261 # Handle this correctly. Probably want to drop the exposure here. 262 $exposure->{data_state} = 'drop'; 263 return($exposure); 264 } 265 266 if (($chip->{state} eq 'goto_cleaned')|| 267 ($warp->{state} eq 'goto_cleaned')|| 268 ($chip->{dsRun_state} eq 'goto_cleaned')) { 269 $exposure->{data_state} = 'pending_update'; 270 &update_this_exposure($exposure); 271 return($exposure); 272 } 273 274 275 my $chiptool_update_cmd = "chiptool -setimfiletoupdate -chip_id $exposure->{chip_id} -set_label $label"; 276 $chiptool_update_cmd .= " -dbname $dbname " if defined $dbname; 277 my $magicDS_update_cmd = "magicdstool -setfiletoupdate -magic_ds_id $chip_magicDS_id -set_label $label"; 278 $magicDS_update_cmd .= " -dbname $dbname " if defined $dbname; 279 my $warptool_update_cmd = "warptool -setskyfiletoupdate -warp_id $warp_id -set_label $label"; 280 $warptool_update_cmd .= " -dbname $dbname " if defined $dbname; 281 282 ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 283 run(command => $chiptool_update_cmd, verbose => $verbose); 284 unless ($success) { 285 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 286 &my_die("Unable to perform chiptool -setimfiletoupdate: $error_code", $exposure->{exp_id}, $data_group); 287 } 288 if ($chip_magicDS_id != 0) { 289 ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 290 run(command => $magicDS_update_cmd, verbose => $verbose); 291 unless ($success) { 292 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 293 &my_die("Unable to perform magicdstool -setfiletoupdate: $error_code", $exposure->{exp_id}, $data_group); 294 } 295 } 296 297 ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 298 run(command => $warptool_update_cmd, verbose => $verbose); 299 unless ($success) { 300 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 301 &my_die("Unable to perform warptool -setskyfiletoupdate: $error_code", $exposure->{exp_id}, $data_group); 302 } 303 304 $exposure->{active} = 1; 305 return($exposure); 306 } 307 308 sub determine_if_can_update { 309 my $exposure = shift; 310 311 if (S64_IS_NOT_NULL($exposure->{chip_id})) { 312 if (($exposure->{chip_state} eq 'cleaned')|| 313 ($exposure->{chip_state} eq 'goto_cleaned')|| 314 ($exposure->{chip_state} eq 'error_cleaned')) { 315 return(1); 316 } 317 } 318 319 return(0); 320 } 321 202 322 203 323 # This is the "user level" subroutine. … … 240 360 my $comment = $exposure->{comment}; 241 361 242 # This is a hack to fix old exposures that have no object. 362 my $updateable = determine_if_can_update($exposure); 363 364 # This is a hack to fix old exposures that have no usable object/comment data. 243 365 unless(defined($comment)) { 244 366 $comment = ''; … … 247 369 if ($comment =~ /3pi_/) { 248 370 $object = $comment; 249 $object =~ s/^.*?(3pi_\d\d_\d\d\d\d).*?$/ $1/;371 $object =~ s/^.*?(3pi_\d\d_\d\d\d\d).*?$/F1 $1/; 250 372 } 251 373 elsif ($comment =~ / ps1_/) { 252 374 $object = $comment; 253 $object =~ s/^.*?(ps1_\d\d_\d\d\d\d).*$/$1/; 254 } 255 else { 256 $exposure->{data_state} = 'new'; 375 $object =~ s/^.*?(ps1_\d\d_\d\d\d\d).*$/F2 $1/; 376 } 377 elsif ($comment =~ /ThreePi.*3pi_/) { 378 $object = $comment; 379 $object =~ s/^ThreePi . (\S+? 3pi_\d\d_\d\d\d\d) .*$/F3 $1/; 380 } 381 elsif ($comment =~ /ThreePi.*ps1_/) { 382 $object = $comment; 383 $object =~ s/^ThreePi . (\S+? ps1_\d\d_\d\d\d\d) .*$/F4 $1/; 384 } 385 elsif ($comment =~ /ThreePi /) { 386 $object = $comment; 387 $object =~ s/^ThreePi . (\S+? \d\d\d\d) .*$/F5 $1/; 388 } 389 elsif (($comment =~ /focus/i)|| 390 ($comment =~ /test/i)|| 391 ($comment =~ /hyster/i)|| 392 ($comment =~ /dither/i)|| 393 ($comment =~ /camera/i) 394 ){ 395 # This is junk that shouldn't exist. 396 $object = 'DROP'; 397 $exposure->{data_state} = 'drop'; 257 398 $exposure->{pairwise} = 0; 258 $exposure->{private} = 1; 259 $exposure->{pair_id} = 9223372036854775807; 260 update_this_exposure($exposure); 261 $exposure = remake_this_exposure($exposure); 262 $counter++; 399 $exposure->{pair_id} = 9223372036854775807; 400 $exposure->{active} = 0; 401 &update_this_exposure($exposure); 402 $counter++; # To ensure everyone else is consistent 263 403 next; 264 404 } 265 405 } 266 406 407 # Determine the current state of chipRuns for these exposures, and update/remake as needed. 267 408 if (S64_IS_NOT_NULL($chip_id)) { # We already have a defined chip_id 268 409 if (($pairwise) && !($pair_id)) { … … 270 411 &my_die("Exposure $exp_id for $lap_id is declared pairwise without a defined pair", $lap_id); 271 412 } 413 $exposure->{data_state} = 'exists'; 414 if ($updateable) { # We know about this run, but the data needs to be regenerated. 415 $exposure->{data_state} = 'update'; 416 $exposure = remake_this_exposure_by_update($exposure); 417 } 418 &update_this_exposure($exposure); 272 419 $matching{$object}{$comment} = $exp_id; 273 420 $indexing{$exp_id} = $counter; 274 421 $counter++; 275 next;276 422 } 277 423 else { # We do not already have a chip_id. 278 424 # Make a chipRun, and update the exposure. 425 $exposure->{data_state} = 'run'; 279 426 $exposure = remake_this_exposure($exposure); 280 281 427 # Save our information for diff pairing. 428 &update_this_exposure($exposure); 282 429 $matching{$object}{$comment} = $exp_id; 283 430 $indexing{$exp_id} = $counter; 284 431 $counter++; 285 432 } 433 286 434 if ($verbose) { 287 435 print "ZZ: $exp_id $object $comment $matching{$object}{$comment}\n"; … … 296 444 print "$object $comment $matching{$object}{$comment} $indexing{$matching{$object}{$comment}} $exp_ids_to_diff[-1]\n"; 297 445 } 298 @exp_ids_to_diff = sort { $indexing{$a} <=> $indexing{$b} } @exp_ids_to_diff; 446 @exp_ids_to_diff = sort { $indexing{$a} <=> $indexing{$b} } @exp_ids_to_diff; # This is effectively a sort by dateobs. 299 447 300 448 if (( $#exp_ids_to_diff + 1) % 2 != 0) { # We have an odd number of exposures, even after comment filtering … … 309 457 my $exp_B = ${ $exposures }[$indexing{$exp_id_B}]; 310 458 print "$exp_A $exp_B $exp_id_A $exp_id_B $indexing{$exp_id_A} $indexing{$exp_id_B}\n"; 311 $exp_A->{pairwise} = 1; 312 $exp_A->{private} = 0; 313 $exp_A->{pair_id} = $exp_B->{chip_id}; 314 315 $exp_B->{pairwise} = 1; 316 $exp_B->{private} = 0; 317 $exp_B->{pair_id} = $exp_A->{chip_id}; 318 319 if ($verbose) { 320 print "LAP_DIFFS: $object: $exp_A->{exp_id} and $exp_B->{exp_id} are a pair\n"; 459 if ($exp_A->{diff_id} == $exp_B->{diff_id}) { 460 $exp_A->{pairwise} = 1; 461 $exp_A->{pair_id} = $exp_B->{chip_id}; 462 463 $exp_B->{pairwise} = 1; 464 $exp_B->{pair_id} = $exp_A->{chip_id}; 465 if ($verbose) { 466 print "LAP_DIFFS: $object: $exp_A->{exp_id} and $exp_B->{exp_id} are a pair\n"; 467 } 468 } 469 else { 470 $exp_A->{pairwise} = 0; 471 $exp_B->{pairwise} = 0; 321 472 } 322 473 } … … 331 482 $exposure->{pairwise} = 0; # We marked it for pairwise diffs, but didn't match it. Probably an error. 332 483 } 333 if (!($exposure->{pairwise})) { 334 $exposure->{private} = 1; # If this isn't being pairwise diffed, it needs to be private 335 } 336 484 337 485 update_this_exposure($exposure); 338 486 } … … 457 605 # Things I want to know before I'm through 458 606 # my $needs_qstack = 0; 459 my $needs_something_remade = 0; 460 my $needs_something_private = 0; 607 my $needs_something_remade = 0; # I never need something remade, because we're committed to one-exp=one-chip 608 my $needs_something_private = 0; # I never need something private, as that is calculated by the difference engine. 461 609 # my $can_qstack = 0; 462 610 my $have_diff = 0; … … 480 628 else { # We claimed to be pairwise, but do not have a valid pair_id. 481 629 $exposure->{pairwise} = 0; 482 $exposure->{private} = 1;483 630 &update_this_exposure($exposure); 484 631 } … … 487 634 if ($exposure->{data_state} eq 'drop') { # This exposure is impossible, so fudge the counts so we get through. 488 635 $are_warped++; 489 # $can_qstack ++;490 636 $can_diff ++; 491 637 $have_diff ++; 492 638 $are_magicked ++; 493 # $can_fstack ++; 639 next; 640 } 641 642 if ($exposure->{data_state} eq 'pending_update') { 643 $exposure->{data_state} = 'update'; 644 $exposure = &remake_this_exposure_by_update($exposure); 645 &update_this_exposure($exposure); 494 646 next; 495 647 } 496 648 497 649 if ($exposure->{private}) { # I've declared this exposure private to this lapRun. 498 # $needs_qstack++;499 650 push @lonely_exposures, $exposure; 500 # $lonely_exposures++;501 651 } 502 652 503 if ($exposure->{needs_remade}) { # This does the check that private = false for other lapRun504 $needs_something_remade = 1;505 $exposure = remake_this_exposure($exposure);506 }653 # if ($exposure->{needs_remade}) { # This does the check that private = false for other lapRun 654 # $needs_something_remade = 1; 655 # $exposure = remake_this_exposure($exposure); 656 # } 507 657 # Do quality checks here 508 658 my $is_bad_quality = 0; … … 536 686 ($exposure->{diffRun_state} eq 'full')) { 537 687 $are_warped++; 538 # $needs_qstack++;539 $needs_something_private = 1;540 688 if ($companion) { 541 $companion->{private} = 1;542 689 $companion->{pairwise} = 0; 543 690 &update_this_exposure($companion); 544 push @lonely_exposures, $companion; 545 # $lonely_exposures++; 546 } 547 $exposure->{private} = 1; 691 # push @lonely_exposures, $companion; 692 } 548 693 $exposure->{pairwise} = 0; 549 694 } 550 695 $exposure->{data_state} = 'drop'; 551 696 &update_this_exposure($exposure); 697 next; 552 698 } 553 699 … … 558 704 # $can_qstack ++; 559 705 $can_diff ++; 560 } 561 if (($exposure->{magicked}&& 562 &S64_IS_NOT_NULL($exposure->{magicked}))) { # This exposure has been magicked, so it is through with diff. 563 $are_magicked++; 564 # $can_fstack ++; 706 $exposure->{data_state} = 'to_diff'; 565 707 } 566 708 if (($exposure->{diff_id})&&(&S64_IS_NOT_NULL($exposure->{diff_id}))) { 567 709 $have_diff ++; 568 } 710 $exposure->{data_state} = 'to_magic'; 711 } 712 if (($exposure->{magicked})&& 713 ($exposure->{warpRun_state})&& 714 ($exposure->{warpRun_state} eq 'full')&& 715 (&S64_IS_NOT_NULL($exposure->{magicked}))) { # This exposure has been magicked, so it is through with diff. 716 $are_magicked++; 717 $exposure->{data_state} = 'full'; 718 # $can_fstack ++; 719 } 720 &update_this_exposure($exposure); 569 721 } 570 722 … … 575 727 print "STATUS: HAVE_FSTACK: $have_fstack\n"; 576 728 577 # print "STATUS: NEEDS_QSTACK: $needs_qstack\n";578 729 print "STATUS: NEEDS_REMADE: $needs_something_remade\n"; 579 730 print "STATUS: NEEDS PRIVATIZE: $needs_something_private\n"; 580 731 print "STATUS: ARE WARPED: $are_warped\n"; 581 732 print "STATUS: ARE MAGICKED: $are_magicked\n"; 582 # print "STATUS: CAN_QSTACK: $can_qstack\n";583 733 print "STATUS: CAN_DIFF: $can_diff\n"; 584 734 print "STATUS: HAVE_DIFF: $have_diff\n"; 585 # print "STATUS: CAN_FSTACK: $can_fstack\n";586 735 587 736 print "STATUS: TOTAL_EXPOSURES: $total_exposures\n"; … … 924 1073 next; 925 1074 } 926 if ($exposure->{diff_id}&&S64_IS_NOT_NULL($exposure->{diff_id})) { # Not sure how this would happen, but still. ##This happens when we inherit a complete exposure.1075 if ($exposure->{diff_id}&&S64_IS_NOT_NULL($exposure->{diff_id})) { # This happens when we inherit a complete exposure. 927 1076 next; 928 1077 } … … 964 1113 } 965 1114 else { # warp-qstack 1115 # We need to decide if we can make a warp-stack diff: 1116 if (&can_warp_stack_diff_be_made($exposure)) { 966 1117 # next; 967 1118 # $command .= '-pretend'; 968 $command .= " -definewarpstack -available -good_frac 0.2 "; 969 $command .= " -warp_id $exposure->{warp_id} -stack_label ${label} "; 970 $already_queued{$exposure->{warp_id}} = 1; 1119 $command .= " -definewarpstack -available -good_frac 0.2 "; 1120 $command .= " -warp_id $exposure->{warp_id} -stack_label ${label} "; 1121 $already_queued{$exposure->{warp_id}} = 1; 1122 $exposure->{private} = 0; 1123 &update_this_exposure($exposure); 1124 } 1125 else { 1126 $exposure->{private} = 1; 1127 $exposure->{data_state} = 'drop'; 1128 $already_queued{$exposure->{warp_id}} = 1; 1129 &update_this_exposure($exposure); 1130 next; 1131 } 971 1132 } 972 1133 … … 1006 1167 } 1007 1168 1169 sub can_warp_stack_diff_be_made { 1170 my $exposure = shift; 1171 my $lap_id = $exposure->{lap_id}; 1172 my $warp_id = $exposure->{warp_id}; 1173 1174 my $command = "$laptool -diffcheck -lap_id $lap_id -warp_id $warp_id"; 1175 $command .= " -dbname $dbname " if defined $dbname; 1176 1177 my ($success, $error_code, $full_buf, $stdout_buf, $stderr_buf ) = 1178 run(command => $command, verbose => $verbose); 1179 unless ($success) { 1180 $error_code = (($error_code >> 8) or $PS_EXIT_PROG_ERROR); 1181 &my_die("Unable to perform laptool -diffcheck: $error_code", $lap_id, $warp_id); 1182 } 1183 if (@$stdout_buf == 0) { 1184 return(0); 1185 } 1186 my $skycells = $mdcParser->parse_list(join "", @$stdout_buf) or 1187 &my_die("Unable to parse metadata from laptool -diffcheck", $lap_id, $warp_id); 1188 foreach my $skycell (@$skycells) { 1189 unless (defined($skycell->{stack_state})) { 1190 return(0); 1191 } 1192 if ($skycell->{stack_state} ne 'full') { 1193 return(0); 1194 } 1195 if ($skycell->{warp_state} ne 'full') { 1196 return(0); 1197 } 1198 unless (S64_IS_NOT_NULL($skycell->{stack_id})) { 1199 return(0); 1200 } 1201 } 1202 return(1); 1203 } 1204 1205 1008 1206 # Deactivate all exposures in this run. 1009 1207 sub deactivate_exposures { 1010 1208 my $exposures = shift; 1011 1209 foreach my $exposure (@$exposures) { 1012 $exposure->{active} = 0; 1013 update_this_exposure($exposure); 1210 if ($exposure->{private} == 1) { # This can probably be relaxed since we can update an undestreaked warp. 1211 $exposure->{active} = 1; 1212 } 1213 else { 1214 $exposure->{active} = 0; 1215 } 1216 update_this_exposure($exposure); 1014 1217 } 1015 1218 } … … 1022 1225 sub cleanup_mode { 1023 1226 my $lap_id = shift; 1227 1228 if (defined($queue_list)) { 1229 my $successful = 1; 1230 open(Q,$queue_list) or ($successful = 0); 1231 if ($successful == 1) { 1232 while(<Q>) { 1233 chomp; 1234 my $cmd = $_; 1235 my ($projection_cell,$seq_id,$filter,$label); 1236 $projection_cell = $cmd; 1237 $projection_cell =~ s/.*?-projection_cell (skycell.\w+?) .*/$1/; 1238 $seq_id = $cmd; 1239 $seq_id =~ s/.*-seq_id (\d+?) .*/$1/; 1240 $filter = $cmd; 1241 $filter =~ s/.*-filter (\w\.00000) .*/$1/; 1242 if ($filter =~ /\s+?/) { 1243 $filter =~ s/.*-filter (\w\.00000)$/$1/; 1244 } 1245 $label = $cmd; 1246 $label =~ s/.*-label (.+?) .*/$1/; 1247 1248 my $response; 1249 chomp($response = 1250 `laptool -dbname gpc1 -listrun -projection_cell $projection_cell -seq_id $seq_id -filter $filter -label $label -simple`); 1251 my $state = (split /\s+/, $response)[5]; 1252 1253 unless (defined($state)) { 1254 if ($verbose) { 1255 print "Queuing: $cmd\n"; 1256 } 1257 system($cmd); 1258 1259 my $i = 0; 1260 do { 1261 sleep(5); 1262 chomp($response = 1263 `laptool -dbname gpc1 -listrun -projection_cell $projection_cell -seq_id $seq_id -filter $filter -label $label -simple`); 1264 $state = (split /\s+/, $response)[5]; 1265 $i++; 1266 unless(defined($state)) { 1267 $successful = 0; 1268 } 1269 } while (($state ne 'run')&&($i < 20)&&($successful)); 1270 last; 1271 } 1272 } 1273 close(Q); 1274 } 1275 } 1276 1024 1277 my $command = "$laptool -inactiveexp -lap_id $lap_id "; 1025 1278 $command .= " -dbname $dbname " if defined $dbname; … … 1043 1296 'warptool -dbname @DBNAME@ -updaterun -set_state goto_cleaned -set_label goto_cleaned -label @LABEL@ -warp_id @WARP_ID@', 1044 1297 'difftool -dbname @DBNAME@ -updaterun -set_state goto_cleaned -set_label goto_cleaned -label @LABEL@ -diff_id @DIFF_ID@', 1298 'magictool -dbname @DBNAME@ -updaterun -set_state full -set_label @LABEL@.old -magic_id @MAGIC_ID@', 1045 1299 'magicdstool -dbname @DBNAME@ -updaterun -set_state goto_cleaned -state full -set_label goto_cleaned -stage chip -stage_id @CHIP_ID@', 1046 1300 'magicdstool -dbname @DBNAME@ -updaterun -set_state goto_cleaned -state full -set_label goto_cleaned -stage warp -stage_id @WARP_ID@', 1047 1301 'magicdstool -dbname @DBNAME@ -updaterun -set_state goto_cleaned -state full -set_label goto_cleaned -stage diff -stage_id @DIFF_ID@'); 1302 1048 1303 foreach my $exposure (@$exposures) { 1049 1304 if ($exposure->{is_in_use}) { … … 1072 1327 if (S64_IS_NOT_NULL($exposure->{diff_id})) { 1073 1328 $command =~ s/\@DIFF_ID\@/$exposure->{diff_id}/; 1329 } 1330 else { 1331 next; 1332 } 1333 } 1334 if ($command =~ /\@MAGIC_ID\@/) { 1335 if ((S64_IS_NOT_NULL($exposure->{magicked}))&& 1336 ($exposure->{magicked} > 0)) { 1337 $command =~ s/\@MAGIC_ID\@/$exposure->{magicked}/; 1074 1338 } 1075 1339 else { … … 1139 1403 &my_die("Unable to perform laptool -updaterun: $error_code", $lap_id); 1140 1404 } 1141 1405 return(0); 1142 1406 } 1143 1407
Note:
See TracChangeset
for help on using the changeset viewer.
