From 6c6f7b46d2d04e8134e42f5dd0b2924b37596d08 Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 12 Sep 2024 16:24:16 -0400 Subject: [PATCH 01/62] Add primary pipeline for labeling subfigures. --- openpmcvl/process/subfigure_label.ipynb | 302 ++++++++++++++++++++++++ 1 file changed, 302 insertions(+) create mode 100644 openpmcvl/process/subfigure_label.ipynb diff --git a/openpmcvl/process/subfigure_label.ipynb b/openpmcvl/process/subfigure_label.ipynb new file mode 100644 index 0000000..cb7697a --- /dev/null +++ b/openpmcvl/process/subfigure_label.ipynb @@ -0,0 +1,302 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import torch\n", + "import torch\n", + "from torchvision import transforms\n", + "from transformers import BertTokenizer\n", + "from PIL import Image, ImageDraw\n", + "import matplotlib.pyplot as plt\n", + "\n", + "ROOT = f\"{os.getcwd()}/pmc_dataset/process\"\n", + "MODEL_DIR = f\"{ROOT}/log/checkpoint.pth\"\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", + "\n", + "os.chdir(ROOT)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import yaml\n", + "import torch\n", + "from skimage import io\n", + "import numpy as np\n", + "import cv2\n", + "from torch.autograd import Variable\n", + "from PIL import Image\n", + "import torch.nn.functional as F\n", + "import os\n", + "from tqdm import tqdm\n", + "import json\n", + "\n", + "from subfigure_ocr.models.yolov3 import *\n", + "from subfigure_ocr.models.network import *\n", + "from subfigure_ocr.separator import process" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "class classifier():\n", + " def __init__(self):\n", + " self.root = '/fs01/home/afallah/Multimodal/pmc_dataset/process/subfigure_ocr/'\n", + " configuration_file = self.root + \"config/yolov3_default_subfig.cfg\"\n", + " with open(configuration_file, 'r') as f:\n", + " configuration = yaml.load(f, Loader=yaml.FullLoader)\n", + "\n", + " self.image_size = configuration['TEST']['IMGSIZE']\n", + " self.nms_threshold = configuration['TEST']['NMSTHRE']\n", + " self.confidence_threshold = 0.0001\n", + " self.dtype = torch.cuda.FloatTensor\n", + " self.device = torch.device('cuda')\n", + "\n", + " object_detection_model = YOLOv3(configuration['MODEL'])\n", + " self.object_detection_model = self.load_model_from_checkpoint(object_detection_model, \"object_detection_model.pt\")\n", + " ## Load text recognition model\n", + " text_recognition_model = resnet152()\n", + " self.text_recognition_model = self.load_model_from_checkpoint(text_recognition_model, 'text_recognition_model.pt')\n", + "\n", + " self.object_detection_model.eval()\n", + " self.text_recognition_model.eval()\n", + "\n", + " def load_model_from_checkpoint(self, model, model_name):\n", + " \"\"\" load checkpoint weights into model \"\"\"\n", + " checkpoints_path = self.root + \"checkpoints/\"\n", + " checkpoint = checkpoints_path + model_name\n", + " model.load_state_dict(torch.load(checkpoint))\n", + " # model = nn.DataParallel(model)\n", + " model.to(self.device)\n", + " return model\n", + " \n", + " def detect_subfigure_boundaries(self, figure_path):\n", + " \"\"\" Detects the bounding boxes of subfigures in figure_path\n", + "\n", + " Args:\n", + " figure_path: A string, path to an image of a figure\n", + " from a scientific journal\n", + " Returns:\n", + " subfigure_info (list of lists): Each inner list is\n", + " x1, y1, x2, y2, confidence \n", + " \"\"\"\n", + "\n", + " ## Preprocess the figure for the models\n", + " img = io.imread(figure_path)\n", + " if len(np.shape(img)) == 2:\n", + " img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)\n", + " else:\n", + " img = cv2.cvtColor(img,cv2.COLOR_RGBA2RGB)\n", + "\n", + " img, info_img = process.preprocess(img, self.image_size, jitter=0)\n", + " img = np.transpose(img / 255., (2, 0, 1))\n", + " img = np.copy(img)\n", + " img = torch.from_numpy(img).float().unsqueeze(0)\n", + " img = Variable(img.type(self.dtype))\n", + "\n", + " img_raw = Image.open(figure_path).convert(\"RGB\")\n", + " width, height = img_raw.size\n", + "\n", + " ## Run model on figure\n", + " with torch.no_grad():\n", + " outputs = self.object_detection_model(img.to(self.device))\n", + " outputs = process.postprocess(outputs, dtype=self.dtype, \n", + " conf_thre=self.confidence_threshold, nms_thre=self.nms_threshold)\n", + "\n", + " ## Reformat model outputs to display bounding boxes in our desired format\n", + " ## List of lists where each inner list is [x1, y1, x2, y2, confidence]\n", + " subfigure_info = list()\n", + "\n", + " if outputs[0] is None:\n", + " return subfigure_info\n", + "\n", + " for x1, y1, x2, y2, conf, cls_conf, cls_pred in outputs[0]:\n", + " box = process.yolobox2label([y1.data.cpu().numpy(), x1.data.cpu().numpy(), y2.data.cpu().numpy(), x2.data.cpu().numpy()], info_img)\n", + " box[0] = int(min(max(box[0],0),width-1))\n", + " box[1] = int(min(max(box[1],0),height-1))\n", + " box[2] = int(min(max(box[2],0),width))\n", + " box[3] = int(min(max(box[3],0),height))\n", + " # ensures no extremely small (likely incorrect) boxes are counted\n", + " small_box_threshold = 5\n", + " if (box[2]-box[0] > small_box_threshold and \n", + " box[3]-box[1] > small_box_threshold):\n", + " box.append(\"%.3f\"%(cls_conf.item()))\n", + " subfigure_info.append(box)\n", + " return subfigure_info\n", + "\n", + " def detect_subfigure_labels(self, figure_path, subfigure_info):\n", + " \"\"\" Uses text recognition to read subfigure labels from figure_path\n", + " \n", + " Note: \n", + " To get sensible results, should be run only after\n", + " detect_subfigure_boundaries has been run\n", + " Args:\n", + " figure_path (str): A path to the image (.png, .jpg, or .gif)\n", + " file containing the article figure\n", + " subfigure_info (list of lists): Details about bounding boxes\n", + " of each subfigure from detect_subfigure_boundaries(). Each\n", + " inner list has format [x1, y1, x2, y2, confidence] where\n", + " x1, y1 are upper left bounding box coordinates as ints, \n", + " x2, y2, are lower right, and confidence the models confidence\n", + " Returns:\n", + " subfigure_info (list of tuples): Details about bounding boxes and \n", + " labels of each subfigure in figure. Tuples for each subfigure are\n", + " (x1, y1, x2, y2, label) where x1, y1 are upper left x and y coord\n", + " divided by image width/height and label is the an integer n \n", + " meaning the label is the nth letter\n", + " concate_img (np.ndarray): A numpy array representing the figure.\n", + " Used in classify_subfigures. Ideally this will be removed to \n", + " increase modularity. \n", + " \"\"\"\n", + " img_raw = Image.open(figure_path).convert(\"RGB\")\n", + " img_raw = img_raw.copy()\n", + " width, height = img_raw.size\n", + " binary_img = np.zeros((height,width,1))\n", + "\n", + " detected_label_and_bbox = None\n", + " max_confidence = 0.0\n", + " for subfigure in subfigure_info:\n", + " ## Preprocess the image for the model\n", + " bbox = tuple(subfigure[:4])\n", + " img_patch = img_raw.crop(bbox)\n", + " img_patch = np.array(img_patch)[:,:,::-1]\n", + " img_patch, _ = process.preprocess(img_patch, 28, jitter=0)\n", + " img_patch = np.transpose(img_patch / 255., (2, 0, 1))\n", + " img_patch = torch.from_numpy(img_patch).type(self.dtype).unsqueeze(0)\n", + "\n", + " ## Run model on figure\n", + " label_prediction = self.text_recognition_model(img_patch.to(self.device))\n", + " label_confidence = np.amax(F.softmax(label_prediction, dim=1).data.cpu().numpy())\n", + " x1,y1,x2,y2, box_confidence = subfigure\n", + " total_confidence = float(box_confidence)*label_confidence\n", + " if total_confidence < max_confidence:\n", + " continue\n", + " label_value = chr(label_prediction.argmax(dim=1).data.cpu().numpy()[0]+ord(\"a\"))\n", + " if label_value == \"z\":\n", + " continue\n", + " if (x2-x1) < 64 and (y2-y1)< 64:\n", + " detected_label_and_bbox = [label_value, x1,y1,x2,y2]\n", + " \n", + " return detected_label_and_bbox\n", + " \n", + " def run(self, figure_path):\n", + " subfigure_info = self.detect_subfigure_boundaries(figure_path)\n", + " subfigure_info = self.detect_subfigure_labels(figure_path, subfigure_info) \n", + "\n", + " return subfigure_info" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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", + "text/plain": [ + "" + ] + }, + "metadata": { + "image/jpeg": { + "width": 400 + } + }, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Cropped image dimensions: (300, 300)\n" + ] + } + ], + "source": [ + "from PIL import Image\n", + "from IPython.display import display, Image as IPImage\n", + "\n", + "# Load and crop image\n", + "image_path = \"/datasets/PMC-15M/figures/PMC517716_F1.jpg/1471-2407-4-58-1.jpg\"\n", + "img = Image.open(image_path)\n", + "crop_box = (0, 0, 300, 300) # (left, top, right, bottom)\n", + "cropped_img = img.crop(crop_box)\n", + "\n", + "# Save cropped image temporarily\n", + "crop_path = \"cropped_image.jpg\"\n", + "cropped_img.save(crop_path)\n", + "\n", + "# Display cropped image\n", + "display(IPImage(filename=crop_path, width=400)) # Adjust width as needed\n", + "print(f\"Cropped image dimensions: {cropped_img.size}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Process with model\n", + "model = classifier()" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model results: ['a', 11, 164, 24, 184]\n", + "Temporary file removed\n" + ] + } + ], + "source": [ + "results = model.run(crop_path)\n", + "print(\"Model results:\", results)\n", + "\n", + "# Clean up\n", + "import os\n", + "os.remove(crop_path)\n", + "print(\"Temporary file removed\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From a8b7354d28a83e08f90991191889394a04d0e01f Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 12 Sep 2024 17:45:29 -0400 Subject: [PATCH 02/62] Add init files. --- openpmcvl/__init__.py | 0 openpmcvl/models/__init__.py | 0 openpmcvl/utils/__init__.py | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 openpmcvl/__init__.py create mode 100644 openpmcvl/models/__init__.py create mode 100644 openpmcvl/utils/__init__.py diff --git a/openpmcvl/__init__.py b/openpmcvl/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/models/__init__.py b/openpmcvl/models/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/utils/__init__.py b/openpmcvl/utils/__init__.py new file mode 100644 index 0000000..e69de29 From f5cd900e78107ff711e4ebaffc49f7bf09bc55dd Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 12 Sep 2024 17:45:41 -0400 Subject: [PATCH 03/62] Add prompts directory. --- openpmcvl/prompts/__init__.py | 0 openpmcvl/prompts/subcaption_system_prompt.txt | 10 ++++++++++ 2 files changed, 10 insertions(+) create mode 100644 openpmcvl/prompts/__init__.py create mode 100644 openpmcvl/prompts/subcaption_system_prompt.txt diff --git a/openpmcvl/prompts/__init__.py b/openpmcvl/prompts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/prompts/subcaption_system_prompt.txt b/openpmcvl/prompts/subcaption_system_prompt.txt new file mode 100644 index 0000000..1180ca0 --- /dev/null +++ b/openpmcvl/prompts/subcaption_system_prompt.txt @@ -0,0 +1,10 @@ +Subfigure labels are letters referring to individual subfigures within a larger figure. +Check if the caption contains explicit subfigure label. +If not or there is only one subfigure, output "NO" and end the generation. +If yes, output "YES", then generate the subcaption of the subfigures according to the caption. +The output should use the template: + YES + Subfigure-A: ... + Subfigure-B: ... + ...... +The label should be removed from subcaption. \ No newline at end of file From f27b0e0a0b65a9f17eedfa5c40b41acdca20ab10 Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 12 Sep 2024 17:45:59 -0400 Subject: [PATCH 04/62] Add primary subcaption pipeline. --- openpmcvl/pipeline/__init__.py | 0 openpmcvl/pipeline/subcaption.py | 156 +++++++++++++++++++++++++++++++ openpmcvl/pipeline/subcaption.sh | 20 ++++ 3 files changed, 176 insertions(+) create mode 100644 openpmcvl/pipeline/__init__.py create mode 100644 openpmcvl/pipeline/subcaption.py create mode 100644 openpmcvl/pipeline/subcaption.sh diff --git a/openpmcvl/pipeline/__init__.py b/openpmcvl/pipeline/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/pipeline/subcaption.py b/openpmcvl/pipeline/subcaption.py new file mode 100644 index 0000000..32ffeaf --- /dev/null +++ b/openpmcvl/pipeline/subcaption.py @@ -0,0 +1,156 @@ +""" +File: subcaption.py +---------------------- +This script processes figure captions from a JSONL file, breaking them down into subcaptions +using a language model. It saves the results to a JSON file. +""" + +import re +import json +import argparse +from sys import stderr +from tqdm import tqdm +from typing import List, Dict, Any + +from openai import OpenAI + + +def load_dataset(file_path: str) -> List[Dict[str, Any]]: + """ + Load dataset from a JSONL file. + + Args: + file_path (str): Path to the input JSONL file. + + Returns: + List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. + """ + with open(file_path, 'r') as f: + return [json.loads(line) for line in f][20:23] + + +def process_caption(client: OpenAI, system_prompt: str, caption: str, model: str, max_tokens: int) -> str: + """ + Process a caption using the language model. + + Args: + client (OpenAI): OpenAI client instance. + system_prompt (str): System prompt for the language model. + caption (str): Caption to process. + model (str): Model directory being used. + max_tokens (int): Maximum number of tokens for the model response. + + Returns: + str: Processed caption from the language model. + """ + user_prompt = f"Caption: \n{caption}".strip() + + completion = client.chat.completions.create( + model=model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_prompt}, + ], + temperature=0, + max_tokens=max_tokens, + ) + + return completion.choices[0].message.content + + +def parse_subcaptions(output: str) -> Dict[str, str]: + """ + Parse the output from the language model into subcaptions. + + Args: + output (str): Output from the language model. + + Returns: + Dict[str, str]: Dictionary of subcaptions, where keys are subfigure labels and values are subcaptions. + """ + lines = output.strip().split('\n') + + if not lines[0].upper().startswith("YES"): + return {"Subfigure-A": '\n'.join(lines)} + + subcaptions = {} + current_key = None + current_value = [] + + for line in lines[1:]: # Skip the "YES" line + match = re.match(r'^Subfigure-([A-Z]):\s*(.*)', line) + + if match: + if current_key: + subcaptions[current_key] = ' '.join(current_value).strip() + current_key = f"Subfigure-{match.group(1)}" + current_value = [match.group(2)] + else: + if current_key: + current_value.append(line) + + if current_key: + subcaptions[current_key] = ' '.join(current_value).strip() + + return subcaptions + + +def main(args: argparse.Namespace) -> None: + """ + Main function to process captions and save results. + + Args: + args (argparse.Namespace): Command-line arguments. + """ + # Initialize OpenAI client + client = OpenAI(base_url=args.base_url, api_key="EMPTY") + + # Load dataset + dataset = load_dataset(args.input_file) + print(f"\nDataset size: {len(dataset)}") + + # Load system prompt + with open(args.system_prompt_file, 'r') as f: + system_prompt = f.read().strip() + + # Inference loop + results = [] + + for item in tqdm(dataset, desc="Processing captions", total=len(dataset), file=stderr): + caption = item['caption'] + + output = process_caption( + client=client, + system_prompt=system_prompt, + caption=caption, + model=args.model, + max_tokens=args.max_tokens + ) + subcaptions = parse_subcaptions(output) + + result = { + 'caption': caption, + 'num_subcaptions': len(subcaptions), + 'subcaptions': subcaptions, + 'output': output + } + results.append(result) + + with open(args.output_file, 'w') as f: + json.dump(results, f, indent=2) + + print(f"\nResults saved to {args.output_file}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Process captions into subcaptions") + + parser.add_argument("--input-file", required=True, help="Path to input JSONL file") + parser.add_argument("--output-file", required=True, help="Path to output JSON file") + parser.add_argument("--system-prompt-file", required=True, help="Path to system prompt file") + parser.add_argument("--base-url", default="http://gpu010:8080/v1", help="Base URL for OpenAI API") + parser.add_argument("--model", default="/model-weights/Meta-Llama-3.1-8B-Instruct", help="Model directory") + parser.add_argument("--max-tokens", type=int, default=500, help="Maximum number of tokens for API response") + + args = parser.parse_args() + main(args) diff --git a/openpmcvl/pipeline/subcaption.sh b/openpmcvl/pipeline/subcaption.sh new file mode 100644 index 0000000..4bf0d90 --- /dev/null +++ b/openpmcvl/pipeline/subcaption.sh @@ -0,0 +1,20 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --partition=cpu +#SBATCH --mem=32GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=subcaption +#SBATCH --output=%x-%j.out + +source /h/afallah/light/bin/activate + +cd /h/afallah/pmc-data-extraction + +stdbuf -oL -eL srun python3 openpmcvl/pipeline/subcaption.py \ + --input-file /datasets/PMC-15M/0.jsonl \ + --output-file /datasets/PMC-15M/experimental/0_subcaption.jsonl \ + --system-prompt-file openpmcvl/prompts/subcaption_system_prompt.txt \ + --base-url http://gpu010:8080/v1 \ + --model /model-weights/Meta-Llama-3.1-8B-Instruct \ + --max-tokens 500 \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file From ece305a381e724fd3bc0a29c8ac4227d4a4a693b Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 13 Sep 2024 13:59:46 -0400 Subject: [PATCH 05/62] Add subcaption pipeline. --- openpmcvl/pipeline/subcaption.py | 16 +++++++--------- openpmcvl/pipeline/subcaption.sh | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/openpmcvl/pipeline/subcaption.py b/openpmcvl/pipeline/subcaption.py index 32ffeaf..b9e8065 100644 --- a/openpmcvl/pipeline/subcaption.py +++ b/openpmcvl/pipeline/subcaption.py @@ -108,11 +108,11 @@ def main(args: argparse.Namespace) -> None: # Load dataset dataset = load_dataset(args.input_file) print(f"\nDataset size: {len(dataset)}") - + # Load system prompt with open(args.system_prompt_file, 'r') as f: system_prompt = f.read().strip() - + # Inference loop results = [] @@ -128,13 +128,11 @@ def main(args: argparse.Namespace) -> None: ) subcaptions = parse_subcaptions(output) - result = { - 'caption': caption, - 'num_subcaptions': len(subcaptions), - 'subcaptions': subcaptions, - 'output': output - } - results.append(result) + item['num_subcaptions'] = len(subcaptions) + item['subcaptions'] = subcaptions + item['llm_output'] = output + + results.append(item) with open(args.output_file, 'w') as f: json.dump(results, f, indent=2) diff --git a/openpmcvl/pipeline/subcaption.sh b/openpmcvl/pipeline/subcaption.sh index 4bf0d90..137d267 100644 --- a/openpmcvl/pipeline/subcaption.sh +++ b/openpmcvl/pipeline/subcaption.sh @@ -12,7 +12,7 @@ cd /h/afallah/pmc-data-extraction stdbuf -oL -eL srun python3 openpmcvl/pipeline/subcaption.py \ --input-file /datasets/PMC-15M/0.jsonl \ - --output-file /datasets/PMC-15M/experimental/0_subcaption.jsonl \ + --output-file /datasets/PMC-15M/experimental/0.jsonl \ --system-prompt-file openpmcvl/prompts/subcaption_system_prompt.txt \ --base-url http://gpu010:8080/v1 \ --model /model-weights/Meta-Llama-3.1-8B-Instruct \ From 9cf01acbf36601377dbbfcf044f8cb94fa8223d3 Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 13 Sep 2024 14:00:20 -0400 Subject: [PATCH 06/62] Add subfigure pipeline. --- openpmcvl/pipeline/subfigure.py | 133 ++++++++++++++++++++++++++++++++ openpmcvl/pipeline/subfigure.sh | 20 +++++ 2 files changed, 153 insertions(+) create mode 100644 openpmcvl/pipeline/subfigure.py create mode 100644 openpmcvl/pipeline/subfigure.sh diff --git a/openpmcvl/pipeline/subfigure.py b/openpmcvl/pipeline/subfigure.py new file mode 100644 index 0000000..57e14b0 --- /dev/null +++ b/openpmcvl/pipeline/subfigure.py @@ -0,0 +1,133 @@ +import os +import json +import argparse +from sys import stderr +from tqdm import tqdm +from typing import List, Dict, Any + +import torch +from torchvision import transforms +from PIL import Image + +from models.subfigure_detector import FigCap_Former + + +def load_dataset(file_path: str) -> List[Dict[str, Any]]: + """ + Load dataset from a JSONL file. + + Args: + file_path (str): Path to the input JSONL file. + + Returns: + List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. + """ + with open(file_path, 'r') as f: + return [json.loads(line) for line in f][23:25] + + +def process_image(image_path: str, transform: transforms.Compose) -> torch.Tensor: + """ + Process an image for model input. + + Args: + image_path (str): Path to the image file. + transform: Image transformation pipeline. + + Returns: + torch.Tensor: Processed image tensor. + """ + image = Image.open(image_path).convert('RGB') + return transform(image).unsqueeze(0) + + +def run_inference(model: torch.nn.Module, image_tensor: torch.Tensor, device: torch.device, detection_threshold: float) -> Dict[str, Any]: + """ + Run inference on an image using the FigCap_Former model. + + Args: + model (torch.nn.Module): The FigCap_Former model. + image_tensor (torch.Tensor): Processed image tensor. + device (torch.device): Device to run inference on. + detection_threshold (float): Threshold for positive detections. + + Returns: + Dict[str, Any]: Dictionary containing number of subfigures and bounding boxes. + """ + model.eval() + + with torch.no_grad(): + output_det_class, output_box, _ = model(image_tensor, None) + + positive_detections = output_det_class.squeeze() > detection_threshold + detected_boxes = output_box.squeeze()[positive_detections].tolist() + + return { + "num_subfigures": positive_detections.sum().item(), + "bounding_boxes": detected_boxes + } + + +def main(args: argparse.Namespace) -> None: + """ + Main function to process images and save results. + + Args: + args (argparse.Namespace): Command-line arguments. + """ + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + # Load model + checkpoint = torch.load(args.model_path, map_location=device) + model_state_dict = checkpoint['model_state_dict'] + model = FigCap_Former( + num_query=32, num_encoder_layers=4, num_decoder_layers=4, num_text_decoder_layers=4, + bert_path='bert-base-uncased', alignment_network=False, resnet_pretrained=False, + resnet=34, feature_dim=256, atten_head_num=8, text_atten_head_num=8, + mlp_ratio=4, dropout=0.0, activation='relu', + text_mlp_ratio=4, text_dropout=0.0, text_activation='relu' + ) + model.load_state_dict(model_state_dict, strict=False) + model.to(device) + + # Set up image transformation + image_transform = transforms.Compose([ + transforms.Resize((512, 512)), + transforms.ToTensor(), + transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + ]) + + # Load dataset + dataset = load_dataset(args.input_file) + print(f"\nDataset size: {len(dataset)}") + + # Process images + results = [] + + for item in tqdm(dataset, desc="Processing images", total=len(dataset), file=stderr): + image_path = os.path.join(args.data_root, "figures", item['media_name'], item['media_url'].split('/')[-1]) + image_tensor = process_image(image_path, image_transform).to(device) + + inference_result = run_inference(model, image_tensor, device, args.detection_threshold) + + item.update(inference_result) + results.append(item) + + # Save results + with open(args.output_file, 'w') as f: + json.dump(results, f, indent=2) + + print(f"\nResults saved to {args.output_file}") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Process images to detect subfigures") + + parser.add_argument("--input-file", required=True, help="Path to input JSONL file") + parser.add_argument("--output-file", required=True, help="Path to output JSON file") + parser.add_argument("--data-root", default="/datasets/PMC-15M", help="Root directory for dataset") + parser.add_argument("--model-path", required=True, help="Path to the model checkpoint") + parser.add_argument("--detection-threshold", type=float, default=0.6, help="Threshold for positive detections") + + args = parser.parse_args() + main(args) diff --git a/openpmcvl/pipeline/subfigure.sh b/openpmcvl/pipeline/subfigure.sh new file mode 100644 index 0000000..1d1a9ed --- /dev/null +++ b/openpmcvl/pipeline/subfigure.sh @@ -0,0 +1,20 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --gres=gpu:1 +#SBATCH --mem=32GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=subfigure +#SBATCH --output=%x-%j.out +#SBATCH --gres=gpu:1 + +source /h/afallah/light/bin/activate + +cd /h/afallah/pmc-data-extraction + +stdbuf -oL -eL srun python3 openpmcvl/pipeline/subfigure.py \ + --input-file /datasets/PMC-15M/experimental/0.jsonl \ + --output-file /datasets/PMC-15M/experimental/0.jsonl \ + --data-root /datasets/PMC-15M \ + --model-path openpmcvl/models/subfigure_detector.pth \ + --detection-threshold 0.6 \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file From e8bc0a2ec86e781a38714135230e5d14df436767 Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 13 Sep 2024 14:01:44 -0400 Subject: [PATCH 07/62] Add helper modules for loading trained models. --- openpmcvl/models/subfigure_detector.py | 189 ++++++++++++++++++++++++ openpmcvl/models/transformer_module.py | 192 +++++++++++++++++++++++++ 2 files changed, 381 insertions(+) create mode 100644 openpmcvl/models/subfigure_detector.py create mode 100644 openpmcvl/models/transformer_module.py diff --git a/openpmcvl/models/subfigure_detector.py b/openpmcvl/models/subfigure_detector.py new file mode 100644 index 0000000..3ced97c --- /dev/null +++ b/openpmcvl/models/subfigure_detector.py @@ -0,0 +1,189 @@ +from cgitb import text +import torch +import numpy as np +from pytorch_pretrained_bert.modeling import BertModel +from torch import nn +from torchvision import models, transforms +import math +# from torchsummary import summary +from transformer_module import * +from einops import repeat + + +class FigCap_Former(nn.Module): + def __init__(self, num_query=50, num_encoder_layers=6, num_decoder_layers=6, + feature_dim=256, atten_head_num=8, mlp_ratio=4, dropout=0.0, activation='relu', + alignment_network = True, + bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/PubMed_BERT', + num_text_decoder_layers=6, text_atten_head_num=8, text_mlp_ratio=4, text_dropout=0.0, text_activation='relu', + resnet=34, resnet_pretrained=False): + super().__init__() + # Followings are modules for fig detection + if resnet == 18: + self.img_embed = nn.Sequential(*list(models.resnet18(pretrained=resnet_pretrained).children())[:8]).cuda() + self.img_channel_squeeze = nn.Conv2d(512, feature_dim, 1) + elif resnet == 34: + self.img_embed = nn.Sequential(*list(models.resnet34(pretrained=resnet_pretrained).children())[:8]).cuda() + self.img_channel_squeeze = nn.Conv2d(512, feature_dim, 1) + elif resnet == 50: + self.img_embed = nn.Sequential(*list(models.resnet50(pretrained=resnet_pretrained).children())[:8]).cuda() + self.img_channel_squeeze = nn.Conv2d(2048, feature_dim, 1) + else: + print('ResNet Error: Unsupported Version ResNet%d' % resnet) + exit() + self.pos_embed = PositionEncoding(num_pos_feats=feature_dim) + + encoder_layer = TransformerEncoderLayer(feature_dim, atten_head_num, mlp_ratio*feature_dim, dropout, activation) + self.img_encoder = TransformerEncoder(encoder_layer, num_encoder_layers) + + self.query = nn.Parameter(torch.rand(num_query, feature_dim)) + decoder_layer = TransformerDecoderLayer(feature_dim, atten_head_num, mlp_ratio*feature_dim, dropout, activation) + self.img_decoder = TransformerDecoder(decoder_layer=decoder_layer, num_layers=num_decoder_layers) + + self.box_head = nn.Sequential( + nn.Linear(feature_dim, feature_dim), + nn.ReLU(inplace=True), + #nn.Dropout(p=dropout), + #nn.Linear(feature_dim, feature_dim), + #nn.ReLU(inplace=True), + nn.Linear(feature_dim, 4), + nn.Sigmoid() + ) + self.det_class_head = nn.Sequential( + nn.Linear(feature_dim, 1), + nn.Sigmoid() + ) + + # Followings are modules for fig-cap alignment + self.alignment_network = alignment_network # exclude alignment modules(BERT) to allow multi-gpu acceleration + if self.alignment_network: + self.text_embed = BertModel.from_pretrained(bert_path) + + self.text_channel_squeeze = nn.Sequential( + nn.Linear(768, 768), + nn.ReLU(inplace=True), + nn.Dropout(p=dropout), + nn.Linear(768, feature_dim), + nn.Dropout(p=dropout) + ) + + text_decoder_layer = TransformerDecoderLayer(feature_dim, text_atten_head_num, text_mlp_ratio*feature_dim, text_dropout, text_activation) + self.text_decoder = TransformerDecoder(decoder_layer=text_decoder_layer, num_layers=num_text_decoder_layers) + + self.simi_head = nn.Sequential( + nn.Linear(feature_dim*2, feature_dim), + nn.ReLU(inplace=True), + #nn.Dropout(p=dropout), + nn.Linear(feature_dim, feature_dim), + nn.ReLU(inplace=True), + #nn.Dropout(p=dropout), + nn.Linear(feature_dim, 1), + nn.Sigmoid() + ) + + self.img_proj = nn.Parameter(torch.rand(feature_dim, feature_dim)) + + def forward(self, images, texts): + """ + 1. Detect the subfigures (nonobject/object binary classification + box coordinates linear regression) + 2. Align captions to each of the detection output + + Args: + images (compound figure): shape (bs, c, h, w) + texts (caption tokens): shape (bs, max_length_in_this_batch) + + Returns: + output_det_class: tensor (bs, query_num, 1), 0~1 indicate subfigure or no-subfigure + output_box: tensor (bs, query_num, 4), prediction of [cx, cy, w, h] + similarity: tensor (bs, query_num, caption_length), 0~1 indicate belong or not belong to the subfigure + """ + # Img Embed + x = self.img_embed(images) # (bs, 2048, h/32, w/32) + x = self.img_channel_squeeze(x) # (bs, 256, h/32, w/32) + + pos = self.pos_embed(x.shape[0], x.shape[2], x.shape[3], x.device) # (bs, 256, h/32, w/32) + x = x + pos + x = x.view(x.shape[0], x.shape[1], -1) # (bs, 256, (w*h)/(32*32)) + x = x.transpose(1, 2) # (bs, (w*h)/(32*32), 256) + + # Detect + x = self.img_encoder(x) # (bs, (w*h)/(32*32), 256) + query = repeat(self.query, 'l d -> bs l d', bs=x.shape[0]) # (bs, 50, 256) + query, _ = self.img_decoder(x, query) # (bs, 50, 256) + + output_det_class = self.det_class_head(query) # (bs, 50, 1) + output_box = self.box_head(query) # (bs, 50, 4) + + # Text Embed + if self.alignment_network: + t = self.text_embed(texts)[0][-1] # (bs, l, 768) + t = self.text_channel_squeeze(t) # (bs, l, 256) + + # Align + query = query @ self.img_proj # (bs, 50, 256) + t, _ = self.text_decoder(query, t) # (bs, l, 256) + # t_proj = t_proj * self.txt_proj # (bs, l, 256) + + query = query.unsqueeze(2).repeat(1, 1, t.shape[1], 1) # (bs, 50, l, 256) + t = t.unsqueeze(1).repeat(1, query.shape[1], 1, 1) # (bs, 50, l, 256) + similarity = torch.cat((query, t), -1) # (bs, 50, l, 512) + similarity = self.simi_head(similarity).squeeze(-1) # (bs, 50, l) + else: + similarity = 0# torch.zeros(query.shape[0], query.shape[1], texts.shape[-1]).cuda() + + """ + cos = nn.CosineSimilarity(dim=3) + similarity = cos(t.unsqueeze(1).repeat(1, query.shape[1], 1, 1), query.unsqueeze(2).repeat(1, 1, t.shape[1], 1)) + similarity = similarity/2.0 + 0.5 # project to [0, 1], (bs, 50, l), cosine similarity + """ + + """ + # The following code may results in cosine similarity beyond [0, 1] + t = t/t.norm(dim=-1, keepdim=True) + query = query/query.norm(dim=-1, keepdim=True) + similarity2 = query @ t.transpose(1,2) # self.logit_scale.exp() * query @ t.transpose(1,2) # (bs, 50, l), cosine similarity + similarity2 = similarity2/2.0 + 0.5 # project to [0, 1] + """ + + return output_det_class, output_box, similarity + + +class PositionEncoding(nn.Module): + def __init__(self, normalize=True, scale=100.0, num_pos_feats=256, temperature=10000): + super().__init__() + self.num_pos_feats = num_pos_feats//2 + self.temperature = temperature + self.normalize = normalize + if scale is not None and normalize is False: + raise ValueError("normalize should be True if scale is passed") + if scale is None: + scale = 2 * math.pi + self.scale = scale + + def forward(self, bs, h, w, device): + # 输入是b,c,h,w + mask = torch.ones(bs, h, w, device=device) + # 因为图像是2d的,所以位置编码也分为x,y方向 + # 1 1 1 1 .. 2 2 2 2... 3 3 3... + y_embed = mask.cumsum(1, dtype=torch.float32) # (b, h, w) the 'y-index' of each position + # 1 2 3 4 ... 1 2 3 4... + x_embed = mask.cumsum(2, dtype=torch.float32) # (b, h, w) the 'x-index' of each position + if self.normalize: + eps = 1e-6 + y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale + x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale + + # num_pos_feats = 128 + # 0~127 self.num_pos_feats=128,因为前面输入向量是256,编码是一半sin,一半cos + dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=device) + dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) + + # 输出shape=b,h,w,128 + pos_x = x_embed[:, :, :, None] / dim_t + pos_y = y_embed[:, :, :, None] / dim_t + pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) + pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) + + pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) + # 每个特征图的xy位置都编码成256的向量,其中前128是y方向编码,而128是x方向编码 + return pos # (b,n=256,h,w) diff --git a/openpmcvl/models/transformer_module.py b/openpmcvl/models/transformer_module.py new file mode 100644 index 0000000..2e13a56 --- /dev/null +++ b/openpmcvl/models/transformer_module.py @@ -0,0 +1,192 @@ +import math +import torch +from torch import nn +import torch.nn.functional as F +import copy + +class MultiHeadAttention(nn.Module): + ''' Multi-Head Attention module ''' + + def __init__(self, n_head, d_model, d_k, d_v, dropout=0.1): + super().__init__() + + self.n_head = n_head + self.d_k = d_k + self.d_v = d_v + + self.w_qs = nn.Linear(d_model, n_head * d_k, bias=False) + self.w_ks = nn.Linear(d_model, n_head * d_k, bias=False) + self.w_vs = nn.Linear(d_model, n_head * d_v, bias=False) + self.fc = nn.Linear(n_head * d_v, d_model, bias=False) + + self.attention = ScaledDotProductAttention(temperature=d_k ** 0.5, attn_dropout=dropout) + + self.dropout = nn.Dropout(dropout) + self.layer_norm = nn.LayerNorm(d_model, eps=1e-6) + + + def forward(self, q, k, v, mask=None): + + residual = q + + q = self.layer_norm(q) + k = self.layer_norm(k) + v = self.layer_norm(v) + + d_k, d_v, n_head = self.d_k, self.d_v, self.n_head + sz_b, len_q, len_k, len_v = q.size(0), q.size(1), k.size(1), v.size(1) + + # Pass through the pre-attention projection: b x lq x (n*dv) + # Separate different heads: b x lq x n x dv + q = self.w_qs(q).view(sz_b, len_q, n_head, d_k) + k = self.w_ks(k).view(sz_b, len_k, n_head, d_k) + v = self.w_vs(v).view(sz_b, len_v, n_head, d_v) + + # Transpose for attention dot product: b x n x lq x dv + q, k, v = q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2) + + if mask is not None: + mask = mask.unsqueeze(1) # For head axis broadcasting. + + q, attn = self.attention(q, k, v, mask=mask) + + # Transpose to move the head dimension back: b x lq x n x dv + # Combine the last two dimensions to concatenate all the heads together: b x lq x (n*dv) + q = q.transpose(1, 2).contiguous().view(sz_b, len_q, -1) + q = self.dropout(self.fc(q)) + q += residual + + return q, attn + +class ScaledDotProductAttention(nn.Module): + ''' Scaled Dot-Product Attention ''' + + def __init__(self, temperature, attn_dropout=0.1): + super().__init__() + self.temperature = temperature + self.dropout = nn.Dropout(attn_dropout) + + def forward(self, q, k, v, mask=None): + + attn = torch.matmul(q / self.temperature, k.transpose(2, 3)) + + if mask is not None: + attn = attn.masked_fill(mask == 0, -1e9) + + attn = self.dropout(F.softmax(attn, dim=-1)) + output = torch.matmul(attn, v) + + return output, attn + +class TransformerEncoderLayer(nn.Module): + + def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu"): + super().__init__() + self.self_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) # 内含 norm + atten + dropout + residual + + # Implementation of Feedforward model + self.ffn = nn.Sequential( + nn.Linear(d_model, dim_feedforward), + _get_activation_md(activation), + nn.Dropout(dropout), + nn.Linear(dim_feedforward, d_model), + nn.Dropout(dropout) + ) + + self.norm = nn.LayerNorm(d_model) + + def forward(self, src): + + q = k = src + src = self.self_attn(q, k, src)[0] + + src2 = self.norm(src) + src2 = self.ffn(src2) + src = src + src2 + + return src + +class TransformerDecoderLayer(nn.Module): + + def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu"): + super().__init__() + + self.self_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) + + self.cross_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) + + self.ffn = nn.Sequential( + nn.Linear(d_model, dim_feedforward), + _get_activation_md(activation), + nn.Dropout(dropout), + nn.Linear(dim_feedforward, d_model), + nn.Dropout(dropout) + ) + + self.norm = nn.LayerNorm(d_model) + + def forward(self, tgt, memory): + + tgt = self.cross_attn(tgt, memory, memory)[0] + + tgt = self.self_attn(tgt, tgt, tgt)[0] + + tgt2 = self.norm(tgt) + tgt2 = self.ffn(tgt2) + tgt = tgt + tgt2 + + return tgt + +class TransformerEncoder(nn.Module): + def __init__(self, encoder_layer, num_layers): + super().__init__() + self.layers = _get_clones(encoder_layer, num_layers) + self.num_layers = num_layers + + def forward(self, src): + output = src + + for layer in self.layers: + output = layer(output) # (bs, patch_num, feature_dim) + + return output + +class TransformerDecoder(nn.Module): + def __init__(self, decoder_layer, num_layers): + super().__init__() + self.layers = _get_clones(decoder_layer, num_layers) + self.num_layers = num_layers + + def forward(self, encoder_memory, query, return_intermedia=False): + query_output = query + intermedia = [] + + for i in range(len(self.layers)): + query_output = self.layers[i](query_output, encoder_memory) # (bs, query_num, feature_dim) + if return_intermedia: + intermedia.append(query_output) + + return query_output, intermedia + +def _get_clones(module, N): + return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) + +def _get_activation_fn(activation): + """Return an activation function given a string""" + if activation == "relu": + return F.relu + if activation == "gelu": + return F.gelu + if activation == "glu": + return F.glu + raise RuntimeError(F"activation should be relu/gelu, not {activation}.") + +def _get_activation_md(activation): + """Return an activation function given a string""" + if activation == "relu": + return nn.ReLU() + if activation == "gelu": + return nn.GELU() + if activation == "glu": + return nn.GLU() + raise RuntimeError(F"activation should be relu/gelu, not {activation}.") From 3ee75256ae223c24858f6931bd4612e8fc6e4682 Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 19 Sep 2024 10:33:44 -0400 Subject: [PATCH 08/62] Fix import path. --- openpmcvl/models/subfigure_detector.py | 4 ++-- openpmcvl/pipeline/subfigure.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openpmcvl/models/subfigure_detector.py b/openpmcvl/models/subfigure_detector.py index 3ced97c..8eb60e7 100644 --- a/openpmcvl/models/subfigure_detector.py +++ b/openpmcvl/models/subfigure_detector.py @@ -6,14 +6,14 @@ from torchvision import models, transforms import math # from torchsummary import summary -from transformer_module import * +from openpmcvl.models.transformer_module import * from einops import repeat class FigCap_Former(nn.Module): def __init__(self, num_query=50, num_encoder_layers=6, num_decoder_layers=6, feature_dim=256, atten_head_num=8, mlp_ratio=4, dropout=0.0, activation='relu', - alignment_network = True, + alignment_network = False, bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/PubMed_BERT', num_text_decoder_layers=6, text_atten_head_num=8, text_mlp_ratio=4, text_dropout=0.0, text_activation='relu', resnet=34, resnet_pretrained=False): diff --git a/openpmcvl/pipeline/subfigure.py b/openpmcvl/pipeline/subfigure.py index 57e14b0..262af66 100644 --- a/openpmcvl/pipeline/subfigure.py +++ b/openpmcvl/pipeline/subfigure.py @@ -9,7 +9,7 @@ from torchvision import transforms from PIL import Image -from models.subfigure_detector import FigCap_Former +from openpmcvl.models.subfigure_detector import FigCap_Former def load_dataset(file_path: str) -> List[Dict[str, Any]]: @@ -23,7 +23,7 @@ def load_dataset(file_path: str) -> List[Dict[str, Any]]: List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. """ with open(file_path, 'r') as f: - return [json.loads(line) for line in f][23:25] + return [json.loads(line) for line in f][:50] def process_image(image_path: str, transform: transforms.Compose) -> torch.Tensor: From b8ee4ecd3b9919dd8d6a8a3d209ed8e75a95d0ef Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 19 Sep 2024 10:34:28 -0400 Subject: [PATCH 09/62] Add working revised pipeline for subfigure detection. --- openpmcvl/process/__init__.py | 0 .../playground_inference_detect_align.py | 474 ++++++++++++++++++ 2 files changed, 474 insertions(+) create mode 100644 openpmcvl/process/__init__.py create mode 100644 openpmcvl/process/playground_inference_detect_align.py diff --git a/openpmcvl/process/__init__.py b/openpmcvl/process/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/process/playground_inference_detect_align.py b/openpmcvl/process/playground_inference_detect_align.py new file mode 100644 index 0000000..c172141 --- /dev/null +++ b/openpmcvl/process/playground_inference_detect_align.py @@ -0,0 +1,474 @@ +""" +Inference % Evaluation functions of subfig detection, OR subfig detection & subfig-subcap token-wise align +""" + +import os +from tkinter import W +from regex import P +import torch +import argparse +from torch.utils.data import DataLoader +from tqdm import tqdm +from pathlib import Path +import random +import numpy as np +from datetime import datetime +from datetime import timedelta +from datetime import timezone +import json + +from torchvision import transforms +from torchvision import utils as vutils + +from openpmcvl.process.dataset_det_align import FigCap_Dataset, figcap_collate, Fig_Dataset, fig_collate, Fig_Separation_Dataset, fig_separation_collate +from openpmcvl.process.align_metric import SubfigureSubcaptionAlignmentMetric +from openpmcvl.process.detect_metric import calculate_mAP_voc12, box_cxcywh_to_xyxy, find_jaccard_overlap +from openpmcvl.process.visualization_tools import visualization, visualization_noComparision + +from matplotlib import pyplot as plt + +# Visualization the dataset +def inference(model, valSet, valLoader, save_path='./Inference', iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): + + # Subfig Subcap Metric + subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) + subcaption_metric.reset() + + Path(save_path).mkdir(parents=True, exist_ok=True) + + # validate one epoch + with torch.no_grad(): + model.eval() + for batch in tqdm(valLoader): + image = batch['image'].cuda() # (bs, 3, max_w, max_h) + # TRANSFORM + # image = image_transform(image) + # + caption = batch['caption'].cuda() # (bs, max_l) + subfigures = batch['subfigs'] + img_ids = batch['image_id'] # [bs] + original_hws = batch['original_hws'] # [bs * [2]] 没resize+pad前的hw + untokenized_caption = batch['untokenized_caption'] # [bs * 'string'] + output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) + cpu_output_box = output_box.cpu() + cpu_output_sim = output_sim.cpu() + cpu_output_det_class = output_det_class.cpu() + cpu_caption = caption.cpu() + + # evaluation detection(mAP) and alignment(f1) + filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False + index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) + for i in range(image.shape[0]): + # accumulate results as coco format + det_boxes=[cpu_output_box[i, filter_mask[i,:], :]] # [1 * (filter_pred_num, 4)] + # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() + det_scores=[cpu_output_det_class.squeeze()[i, filter_mask[i,:]]] # [1 * (filter_pred_num)] + det_labels=[torch.ones_like(det_scores[-1])] # [1 * (filter_pred_num)] all 1 + true_boxes=[subfigures[i][0]] # [1 * (subfig_num, 4)] + true_labels=[torch.ones(true_boxes[-1].shape[0])] # [1 * (subfig_num)] all 1 + true_difficulties=[torch.zeros_like(true_labels[-1])] # [1 * (subfig_num)] all zeros + + # calcualte mAP, recall, precision + mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) + + # accumulate results as subfig-subcap format + ls_caption = [valSet.id_to_token(cpu_caption[i].tolist())] # [1 * cap_len] before evaluation, convert ids to tokens + ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist()] # [1 * [filtered_query_num * [4]]], (cx, cy, w, h) + ls_gt_boxes = [subfigures[i][0].tolist()] # [bs * [subfigure * [4]]], (cx, cy, w, h) + filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False + pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption + ls_pred_tokens = [pred_tokens] # [1 * [filtered_query_num * [aligned_token_num]]] + filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False + gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption + ls_gt_tokens = [gt_tokens] # [1 * [subfig_num * [subcap_token_num]]] + # calculate mAP, recall, precision + match_matrix = subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, + gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) + f1, rcl, prec = subcaption_metric.get_metric(reset=True) + + img_path = [] + if config.name_by_f1: + img_path.append("%s/f1(%.2f)%s" % (save_path, f1, img_ids[i])) + elif config.name_by_mAP: + img_path.append("%s/mAP(%.2f)%s" % (save_path, mAP, img_ids[i])) + + visualization(image=image[i].cpu(), original_h=original_hws[i][0], original_w=original_hws[i][1], + pred_boxes=det_boxes[-1], pred_texts=pred_tokens, gt_boxes=true_boxes[-1], gt_texts=gt_tokens, match_matrix = match_matrix[-1], + cap=ls_caption[-1], untokenized_cap=untokenized_caption[i], path=img_path, mAP=mAP, f1=f1) + +# Evaluate det and align on the dataset +def evaluate(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): + + # Subfig Subcap Metric + subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) + subcaption_metric.reset() + + # validate one epoch + with torch.no_grad(): + model.eval() + det_boxes = [] + det_labels = [] + det_scores = [] + true_boxes = [] + true_labels = [] + true_difficulties = [] + for batch in tqdm(valLoader): + image = batch['image'].cuda() # (bs, 3, max_w, max_h) + caption = batch['caption'].cuda() # (bs, max_l) + subfigures = batch['subfigs'] + output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) + cpu_output_box = output_box.cpu() + cpu_output_sim = output_sim.cpu() + cpu_output_det_class = output_det_class.cpu() + + # accumulate results as coco format + filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False + for i in range(filter_index.shape[0]): + det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] + # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() + det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] + det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 + true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] + true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 + true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros + + # accumulate results as subfig-subcap format + cpu_caption = caption.cpu() + ls_caption = [valSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens + # + filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False + ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) + # + ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) + # + index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) + ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] + ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] + for i in range(image.shape[0]): + filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False + pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption + ls_pred_tokens.append(pred_tokens) + filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False + gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption + ls_gt_tokens.append(gt_tokens) + subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, + gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) + + gold_subfig_num = 0 + gold_subcap_num = 0 + for subfigs in true_boxes: + gold_subfig_num += len(subfigs) + for subcaps in true_boxes: + gold_subcap_num += len(subcaps) + print('evaluate on %d compound figures, total %d gold subfigs, %d gold subcaps' % (len(valSet), gold_subfig_num, gold_subcap_num)) + + + mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) + out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) + print(out_str) + f1, rcl, prec = subcaption_metric.get_metric(reset=True) + out_str = "f1:%.3f recall:%.3f precsision:%.3f" % (mAP, rcl, prec) + print(out_str) + return f1, rcl, prec, mAP, recall, precision + +# Evaluate det and align on the dataset +def evaluate_det(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5): + # validate one epoch + with torch.no_grad(): + model.eval() + det_boxes = [] + det_labels = [] + det_scores = [] + true_boxes = [] + true_labels = [] + true_difficulties = [] + for batch in tqdm(valLoader): + image = batch['image'].cuda() # (bs, 3, max_w, max_h) + caption = batch['caption'].cuda() # (bs, max_l) + subfigures = batch['subfigs'] + output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) + cpu_output_box = output_box.cpu() + # cpu_output_sim = output_sim.cpu() + cpu_output_det_class = output_det_class.cpu() + + # accumulate results as coco format + filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False + for i in range(filter_index.shape[0]): + det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] + # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() + det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] + det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 + true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] + true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 + true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros + + gold_subfig_num = 0 + for subfigs in true_boxes: + gold_subfig_num += len(subfigs) + print('evaluate on %d compound figures, total %d gold subfigs' % (len(valSet), gold_subfig_num)) + + mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) + out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) + print(out_str) + + return mAP, recall, precision + +# Separation compound figures +def separation(model, valLoader, save_path='./Segmentation', rcd_file='./Segmentation/separation.jsonl', score_threshold=0.75, nms_threshold=0.4): + + Path(save_path).mkdir(parents=True, exist_ok=True) + subfig_list = [] + subfig_count = 0 + + # validate one epoch + with torch.no_grad(): + model.eval() + try: + for batch in tqdm(valLoader): + image = batch['image'].cuda() # (bs, 3, max_h, max_w) + _, _, height, width = image.shape + caption = batch['caption'].cuda() # (bs, max_l) + img_ids = batch['image_id'] # [bs] + img_idxes = batch['image_index'] + original_images = batch['original_image'] # [bs * (3, h, w)] + unpadded_hws = batch['unpadded_hws'] # [bs * [2]] + output_det_class, output_box, _ = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) + cpu_output_box = output_box.cpu() + cpu_output_det_class = output_det_class.cpu() + filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False + for i in range(image.shape[0]): + det_boxes=cpu_output_box[i, filter_mask[i,:], :] # (filter_pred_num, 4) + det_scores=cpu_output_det_class.squeeze()[i, filter_mask[i,:]].numpy() # (filter_pred_num) + img_id = img_ids[i].split('.jpg')[0] # xxxx.jpg + img_idx = img_idxes[i] # x + unpadded_image = original_images[i] + original_h, original_w = unpadded_hws[i] + # 求scale + if original_h > original_w: + scale = original_h / 512 + else: + scale = original_w / 512 + # 非极大值抑制 + order = np.argsort(det_scores) + picked_bboxes = [] # [suppressed_num, 4] + picked_scores = [] # [suppressed_num] + while order.size > 0: + # 最大score的index + index = order[-1] + if order.size == 1: + picked_bboxes.append(det_boxes[index].tolist()) + picked_scores.append(det_scores[index]) + break + else: + iou_with_left = find_jaccard_overlap(box_cxcywh_to_xyxy(det_boxes[index]), box_cxcywh_to_xyxy(det_boxes[order[:-1]])).squeeze().numpy() # (left_bboxes_num) + left = np.where(iou_with_left < nms_threshold) # (left_bboxes_num) + order = order[left] # (new_filtered_num) + picked_bboxes.append(det_boxes[index].tolist()) + picked_scores.append(det_scores[index]) + # Crop and Save Image + for bbox, score in zip(picked_bboxes, picked_scores): + try: + subfig_path = '%s/%s_%d.jpg' % (save_path, img_id, subfig_count) + cx, cy, w, h = bbox + # 计算在原图中的bbox坐标 + x1 = round((cx - w/2)*width*scale) + x2 = round((cx + w/2)*width*scale) + y1 = round((cy - h/2)*height*scale) + y2 = round((cy + h/2)*height*scale) + # 纠正如果超出了compound figure的boundary + x1 = min(max(x1, 0), original_w-1) + x2 = min(max(x2, 0), original_w-1) + y1 = min(max(y1, 0), original_h-1) + y2 = min(max(y2, 0), original_h-1) + # 抠图 + subfig = unpadded_image[:, y1:y2, x1:x2] # (3, h, w) + subfig = subfig.to(torch.device('cpu')) + vutils.save_image(subfig, subfig_path) + # Record the Subfig Info in Jsonl file + subfig_list.append({'id':'%d.jpg'%subfig_count, 'source_fig_id':img_id, 'position':[(x1, y1), (x2, y2)], 'score':score.item()}) + subfig_count += 1 + except (ValueError): + print('Crop Error: [x1 x2 y1 y2]:[%.2f %.2f %.2f %.2f], w:%.2f, h:%.2f' % (x1, x2, y1, y2, original_w, original_h)) + + # 若中途报错,暂时保存现有的分割结果 + except Exception as e: + print(repr(e)) + print('Break at %s' % img_idx) + + f = open(rcd_file, 'a') + for line in subfig_list: + f.write(json.dumps(line)+'\n') + f.close() + +# grid search align +def grid_search(config, model, Set, Loader): + # 测试不同的confidence score,在recall和precision之间平衡 + for score_th in np.arange(0.3, 1.0, 0.05): + config.score_threshold = score_th + f1, rcl, prec, mAP, recall, precision = evaluate(model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) + out_str = "mAP:%.3f recall:%.3f precsision:%.3f f1:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision, f1, rcl, prec) + print(out_str) + if config.rcd_file: + with open(config.rcd_file, 'a') as f: + f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) + f.write('Results: mAP--%.3f recall--%.3f precision--%.3f f1--%.3f recall--%.3f precision--%.3f\n' % (mAP, recall, precision, f1, rcl, prec)) + f.write('\n\n') + f.close() + + if config.vis_path: + inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) + +# grid search detection +def grid_search_det(config, model, Set, Loader): + # 测试不同的confidence score,在recall和precision之间平衡 + for score_th in np.arange(0.3, 1.0, 0.05): + config.score_threshold = score_th + mAP, recall, precision = evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) + out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) + print(out_str) + if config.rcd_file: + with open(config.rcd_file, 'a') as f: + f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) + f.write('Results: mAP--%.3f recall--%.3f precision--%.3f' % (mAP, recall, precision)) + f.write('\n\n') + f.close() + # the inference function should be simplified for det only + if config.vis_path: + inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) + + +def str2bool(v): + return v.lower() in ('true') + + +def get_eval_args_parser(): + parser = argparse.ArgumentParser() + + # ----------------- Eval Config + + parser.add_argument('--checkpoint', default='/fs01/home/afallah/Multimodal/pmc_dataset/process/log/checkpoint.pth', help='checkpoint to load') + parser.add_argument('--eval_file', default='/datasets/PMC-15M/experimental/figures.jsonl', help='dataset for evaluation') + parser.add_argument('--img_root', default='/datasets/PMC-15M/figures', help='root path for figures') + parser.add_argument('--rcd_file', default='./Inference/separation.jsonl', help='file to record') + parser.add_argument('--vis_path', default='./Inference/visualizations', help='file to record the visualizations') + parser.add_argument('--save_path', default='./Inference', help='path to save the visualizations') + + parser.add_argument('--model', default='baseline', type=str, help='baseline') + parser.add_argument('--resnet', type=int, default=34) + parser.add_argument('--pretrained_bert', type=str, default='PubMed_BERT') + + parser.add_argument('--platform', type=str, default='DBCloud') + parser.add_argument('--gpu', type=str, default='1') + + parser.add_argument('--task', type=str, default='sep', help='det, det_grid_search, align, align_grid_search, sep') + + parser.add_argument('--normalization', type=str2bool, default=False) + parser.add_argument('--val_batch_size', type=int, default=16) + + parser.add_argument('--name_by_f1', type=str2bool, default=True, help='name the visualization by f1 score') + parser.add_argument('--name_by_mAP', type=str2bool, default=True, help='name the visualization by mAP score') + + # ----------------- Eval Hyperparameters + + parser.add_argument('--iou_threshold', default=0.75, type=float) + parser.add_argument('--score_threshold', default=0.5, type=float) + parser.add_argument('--similarity_threshold', default=0.5, type=float) + + # ----------------- Model Structure + parser.add_argument('--enc_layers', default=4, type=int, + help="Number of encoding layers in the transformer") + parser.add_argument('--dec_layers', default=4, type=int, + help="Number of decoding layers in the transformer") + parser.add_argument('--txt_dec_layers', default=4, type=int, + help="Number of decoding layers in the text transformer") + parser.add_argument('--mlp_ratio', default=4, type=int, + help="Intermediate size of the feedforward layers in the transformer blocks") + parser.add_argument('--hidden_dim', default=256, type=int, + help="Size of the embeddings (dimension of the transformer)") + parser.add_argument('--dropout', default=0.0, type=float, + help="Dropout applied in the transformer") + parser.add_argument('--nheads', default=8, type=int, + help="Number of attention heads inside the transformer's attentions") + parser.add_argument('--text_nheads', default=8, type=int, + help="Number of attention heads inside the transformer's attentions") + parser.add_argument('--num_queries', default=32, type=int, + help="Number of query slots") + + config = parser.parse_args() + return config + + +def prepare_model_and_dataset(config): + torch.multiprocessing.set_sharing_strategy('file_system') + + vocab_file = 'path to bert vocab.txt, needed to tokenize compound caption; not necessary for subfigure separation' + + if 'det' in config.task: + Set = Fig_Dataset(None, config.eval_file, config.img_root, vocab_file, config.normalization) + Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_collate) + if 'sep' in config.task: + Set = Fig_Separation_Dataset(None, config.eval_file, config.img_root, config.normalization) + Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_separation_collate) + else: + Set = FigCap_Dataset(None, config.eval_file, config.img_root, vocab_file, normalization=config.normalization) + Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=figcap_collate) + + if config.model == 'baseline': + # export PYTHONPATH=/fs01/home/afallah/pmc-data-extraction:$PYTHONPATH + from openpmcvl.models.subfigure_detector import FigCap_Former + else: + print('Unsupported Model Type %s' % config.model) + exit() + + + model = FigCap_Former(num_query=config.num_queries, + num_encoder_layers=config.enc_layers, + num_decoder_layers=config.dec_layers, + feature_dim=config.hidden_dim, + atten_head_num=config.nheads, + mlp_ratio=config.mlp_ratio, + dropout=config.dropout, + activation='relu', + bert_path = '', #'/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert, + num_text_decoder_layers=config.txt_dec_layers, + text_atten_head_num=config.text_nheads, + text_mlp_ratio=config.mlp_ratio, + text_dropout=config.dropout, + text_activation='relu', + resnet=config.resnet, + resnet_pretrained=False) + os.environ["CUDA_VISIBLE_DEVICES"] = config.gpu + # model = nn.DataParallel(model) + model.cuda() + + checkpoint = torch.load(config.checkpoint, map_location='cpu') + state_dict = checkpoint['model_state_dict'] + model_dict = model.state_dict() + model_checkpoint = {k: v for k, v in state_dict.items()} + model_dict.update(model_checkpoint) + model.load_state_dict(model_dict, strict=False) + + cp_mAP = checkpoint['val_mAP'] if 'val_mAP' in checkpoint else 0 + cp_f1 = checkpoint['val_f1'] if 'val_f1' in checkpoint else 0 + + print('Load checkpoint from %s, epoch %d, val_mAP %.2f, val_F1 %.2f' % \ + (config.checkpoint, checkpoint['epoch'], cp_mAP, cp_f1)) + + return model, Set, Loader + + +if __name__ == '__main__': + config = get_eval_args_parser() + model, Set, Loader = prepare_model_and_dataset(config) + if config.task == 'det': + evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) + elif config.task == 'det_grid_search': + grid_search_det(config, model, Set, Loader) + elif config.task == 'align': + evaluate(config, model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) + elif config.task == 'align_grid_search': + grid_search(config, model, Set, Loader) + elif config.task == "sep": + separation(model, Loader, config.save_path, config.rcd_file, config.score_threshold, nms_threshold=0.4) + else: + print('Undefined Evaluation Task') \ No newline at end of file From b7e12c8bd894b8d155df3e641cbd87783c0df48e Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 26 Sep 2024 11:02:54 -0400 Subject: [PATCH 10/62] Finalize subcaption pipeline. --- openpmcvl/pipeline/subcaption.py | 10 ++++++---- openpmcvl/pipeline/subcaption.sh | 6 +++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/openpmcvl/pipeline/subcaption.py b/openpmcvl/pipeline/subcaption.py index b9e8065..d4a4835 100644 --- a/openpmcvl/pipeline/subcaption.py +++ b/openpmcvl/pipeline/subcaption.py @@ -26,7 +26,7 @@ def load_dataset(file_path: str) -> List[Dict[str, Any]]: List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. """ with open(file_path, 'r') as f: - return [json.loads(line) for line in f][20:23] + return [json.loads(line) for line in f] def process_caption(client: OpenAI, system_prompt: str, caption: str, model: str, max_tokens: int) -> str: @@ -78,12 +78,12 @@ def parse_subcaptions(output: str) -> Dict[str, str]: current_value = [] for line in lines[1:]: # Skip the "YES" line - match = re.match(r'^Subfigure-([A-Z]):\s*(.*)', line) + match = re.match(r'^Subfigure-([A-Za-z]):\s*(.*)', line, re.IGNORECASE) if match: if current_key: subcaptions[current_key] = ' '.join(current_value).strip() - current_key = f"Subfigure-{match.group(1)}" + current_key = f"Subfigure-{match.group(1).upper()}" current_value = [match.group(2)] else: if current_key: @@ -135,7 +135,9 @@ def main(args: argparse.Namespace) -> None: results.append(item) with open(args.output_file, 'w') as f: - json.dump(results, f, indent=2) + for item in results: + json.dump(item, f) + f.write('\n') print(f"\nResults saved to {args.output_file}") diff --git a/openpmcvl/pipeline/subcaption.sh b/openpmcvl/pipeline/subcaption.sh index 137d267..d0b0d5c 100644 --- a/openpmcvl/pipeline/subcaption.sh +++ b/openpmcvl/pipeline/subcaption.sh @@ -11,10 +11,10 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction stdbuf -oL -eL srun python3 openpmcvl/pipeline/subcaption.py \ - --input-file /datasets/PMC-15M/0.jsonl \ - --output-file /datasets/PMC-15M/experimental/0.jsonl \ + --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ + --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ --system-prompt-file openpmcvl/prompts/subcaption_system_prompt.txt \ - --base-url http://gpu010:8080/v1 \ + --base-url http://gpu030:8080/v1 \ --model /model-weights/Meta-Llama-3.1-8B-Instruct \ --max-tokens 500 \ 2>&1 | tee -a %x-%j.out \ No newline at end of file From 5e1f371250bf38f09f85958fb8a80df76213fd37 Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 26 Sep 2024 11:03:27 -0400 Subject: [PATCH 11/62] Finalize subfigure separation pipeline. --- openpmcvl/pipeline/subfigure.py | 242 ++++++++++++++++++++------------ openpmcvl/pipeline/subfigure.sh | 15 +- 2 files changed, 162 insertions(+), 95 deletions(-) diff --git a/openpmcvl/pipeline/subfigure.py b/openpmcvl/pipeline/subfigure.py index 262af66..dea9bc6 100644 --- a/openpmcvl/pipeline/subfigure.py +++ b/openpmcvl/pipeline/subfigure.py @@ -1,71 +1,164 @@ import os import json import argparse -from sys import stderr -from tqdm import tqdm -from typing import List, Dict, Any +from pathlib import Path +from typing import Dict, List, Tuple, Any +import numpy as np import torch -from torchvision import transforms -from PIL import Image +from torch.utils.data import DataLoader +from tqdm import tqdm +from torchvision import utils as vutils +from openpmcvl.process.dataset_det_align import Fig_Separation_Dataset, fig_separation_collate from openpmcvl.models.subfigure_detector import FigCap_Former +from openpmcvl.process.detect_metric import box_cxcywh_to_xyxy, find_jaccard_overlap -def load_dataset(file_path: str) -> List[Dict[str, Any]]: +def load_dataset(eval_file: str, img_root: str, batch_size: int, num_workers: int) -> DataLoader: """ - Load dataset from a JSONL file. - + Prepares the dataset and returns a DataLoader. + Args: - file_path (str): Path to the input JSONL file. - + eval_file (str): Path to the evaluation dataset file + img_root (str): Root path for figures + batch_size (int): Batch size for the DataLoader + num_workers (int): Number of workers for the DataLoader + Returns: - List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. + DataLoader: Configured DataLoader for the separation dataset """ - with open(file_path, 'r') as f: - return [json.loads(line) for line in f][:50] + dataset = Fig_Separation_Dataset(None, eval_file, img_root, normalization=False) + print(f"\nDataset size: {len(dataset)}\n") + return DataLoader(dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers, collate_fn=fig_separation_collate) -def process_image(image_path: str, transform: transforms.Compose) -> torch.Tensor: +def load_model(checkpoint_path: str, device: torch.device) -> FigCap_Former: """ - Process an image for model input. - + Loads the FigCap_Former model from a checkpoint. + Args: - image_path (str): Path to the image file. - transform: Image transformation pipeline. - + checkpoint_path (str): Path to the model checkpoint + device (torch.device): Device to use for processing + Returns: - torch.Tensor: Processed image tensor. + FigCap_Former: Loaded model """ - image = Image.open(image_path).convert('RGB') - return transform(image).unsqueeze(0) + model = FigCap_Former( + num_query=32, num_encoder_layers=4, num_decoder_layers=4, num_text_decoder_layers=4, + bert_path='bert-base-uncased', alignment_network=False, resnet_pretrained=False, + resnet=34, feature_dim=256, atten_head_num=8, text_atten_head_num=8, + mlp_ratio=4, dropout=0.0, activation='relu', + text_mlp_ratio=4, text_dropout=0.0, text_activation='relu' + ) + checkpoint = torch.load(checkpoint_path, map_location='cpu') + model.load_state_dict(checkpoint['model_state_dict'], strict=False) + model.eval() + model.to(device) -def run_inference(model: torch.nn.Module, image_tensor: torch.Tensor, device: torch.device, detection_threshold: float) -> Dict[str, Any]: - """ - Run inference on an image using the FigCap_Former model. + return model - Args: - model (torch.nn.Module): The FigCap_Former model. - image_tensor (torch.Tensor): Processed image tensor. - device (torch.device): Device to run inference on. - detection_threshold (float): Threshold for positive detections. +def process_detections(det_boxes: torch.Tensor, det_scores: np.ndarray, nms_threshold: float) -> Tuple[List[List[float]], List[float]]: + """ + Processes detections using Non-Maximum Suppression (NMS). + + Args: + det_boxes (torch.Tensor): Detected bounding boxes + det_scores (np.ndarray): Confidence scores for detections + nms_threshold (float): IoU threshold for NMS + Returns: - Dict[str, Any]: Dictionary containing number of subfigures and bounding boxes. + Tuple[List[List[float]], List[float]]: Picked bounding boxes and their scores """ - model.eval() + order = np.argsort(det_scores) + picked_bboxes = [] + picked_scores = [] + while order.size > 0: + index = order[-1] + picked_bboxes.append(det_boxes[index].tolist()) + picked_scores.append(det_scores[index]) + if order.size == 1: + break + iou_with_left = find_jaccard_overlap(box_cxcywh_to_xyxy(det_boxes[index]), box_cxcywh_to_xyxy(det_boxes[order[:-1]])).squeeze().numpy() + left = np.where(iou_with_left < nms_threshold) + order = order[left] + return picked_bboxes, picked_scores + + +def separate_subfigures(model: FigCap_Former, loader: DataLoader, save_path: str, rcd_file: str, score_threshold: float, nms_threshold: float, device: torch.device) -> None: + """ + Separates compound figures into subfigures. + + Args: + model (FigCap_Former): Loaded model for subfigure detection + loader (DataLoader): DataLoader for the dataset + save_path (str): Path to save separated subfigures + rcd_file (str): File to record separation results + score_threshold (float): Confidence score threshold for detections + nms_threshold (float): IoU threshold for NMS + device (torch.device): Device to use for processing + """ + Path(save_path).mkdir(parents=True, exist_ok=True) + subfig_list = [] + subfig_count = 0 with torch.no_grad(): - output_det_class, output_box, _ = model(image_tensor, None) - - positive_detections = output_det_class.squeeze() > detection_threshold - detected_boxes = output_box.squeeze()[positive_detections].tolist() - - return { - "num_subfigures": positive_detections.sum().item(), - "bounding_boxes": detected_boxes - } + try: + for batch in tqdm(loader, desc='Separating subfigures', total=len(loader)): + image = batch['image'].to(device) + caption = batch['caption'].to(device) + img_ids = batch['image_id'] + original_images = batch['original_image'] + unpadded_hws = batch['unpadded_hws'] + + output_det_class, output_box, _ = model(image, caption) + + cpu_output_box = output_box.cpu() + cpu_output_det_class = output_det_class.cpu() + filter_mask = cpu_output_det_class.squeeze() > score_threshold + + for i in range(image.shape[0]): + det_boxes = cpu_output_box[i, filter_mask[i,:], :] + det_scores = cpu_output_det_class.squeeze()[i, filter_mask[i,:]].numpy() + img_id = img_ids[i].split('.jpg')[0] + unpadded_image = original_images[i] + original_h, original_w = unpadded_hws[i] + + scale = max(original_h, original_w) / 512 + + picked_bboxes, picked_scores = process_detections(det_boxes, det_scores, nms_threshold) + + for bbox, score in zip(picked_bboxes, picked_scores): + try: + subfig_path = f'{save_path}/{img_id}_{subfig_count}.jpg' + cx, cy, w, h = bbox + x1, x2 = [round((cx - w/2)*image.shape[3]*scale), round((cx + w/2)*image.shape[3]*scale)] + y1, y2 = [round((cy - h/2)*image.shape[2]*scale), round((cy + h/2)*image.shape[2]*scale)] + + x1, x2 = [max(0, min(x, original_w-1)) for x in [x1, x2]] + y1, y2 = [max(0, min(y, original_h-1)) for y in [y1, y2]] + + subfig = unpadded_image[:, y1:y2, x1:x2].to(torch.device('cpu')) + vutils.save_image(subfig, subfig_path) + + subfig_list.append({ + 'id': f'{subfig_count}.jpg', + 'source_fig_id': img_id, + 'position': [(x1, y1), (x2, y2)], + 'score': score.item(), + 'subfig_path': subfig_path + }) + subfig_count += 1 + except ValueError: + print(f'Crop Error: [x1 x2 y1 y2]:[{x1} {x2} {y1} {y2}], w:{original_w}, h:{original_h}') + except Exception as e: + print(f'Error occurred: {repr(e)}') + finally: + with open(rcd_file, 'a') as f: + for line in subfig_list: + f.write(json.dumps(line) + '\n') def main(args: argparse.Namespace) -> None: @@ -75,59 +168,28 @@ def main(args: argparse.Namespace) -> None: Args: args (argparse.Namespace): Command-line arguments. """ + os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - # Load model - checkpoint = torch.load(args.model_path, map_location=device) - model_state_dict = checkpoint['model_state_dict'] - model = FigCap_Former( - num_query=32, num_encoder_layers=4, num_decoder_layers=4, num_text_decoder_layers=4, - bert_path='bert-base-uncased', alignment_network=False, resnet_pretrained=False, - resnet=34, feature_dim=256, atten_head_num=8, text_atten_head_num=8, - mlp_ratio=4, dropout=0.0, activation='relu', - text_mlp_ratio=4, text_dropout=0.0, text_activation='relu' - ) - model.load_state_dict(model_state_dict, strict=False) - model.to(device) - - # Set up image transformation - image_transform = transforms.Compose([ - transforms.Resize((512, 512)), - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - - # Load dataset - dataset = load_dataset(args.input_file) - print(f"\nDataset size: {len(dataset)}") - - # Process images - results = [] - - for item in tqdm(dataset, desc="Processing images", total=len(dataset), file=stderr): - image_path = os.path.join(args.data_root, "figures", item['media_name'], item['media_url'].split('/')[-1]) - image_tensor = process_image(image_path, image_transform).to(device) - - inference_result = run_inference(model, image_tensor, device, args.detection_threshold) - - item.update(inference_result) - results.append(item) - - # Save results - with open(args.output_file, 'w') as f: - json.dump(results, f, indent=2) - - print(f"\nResults saved to {args.output_file}") + model = load_model(args.checkpoint, device) + dataloader = load_dataset(args.eval_file, args.img_root, args.batch_size, args.num_workers) + separate_subfigures(model, dataloader, args.save_path, args.rcd_file, args.score_threshold, args.nms_threshold, device) + print("\nSubfigure separation completed.\n") if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Process images to detect subfigures") - - parser.add_argument("--input-file", required=True, help="Path to input JSONL file") - parser.add_argument("--output-file", required=True, help="Path to output JSON file") - parser.add_argument("--data-root", default="/datasets/PMC-15M", help="Root directory for dataset") - parser.add_argument("--model-path", required=True, help="Path to the model checkpoint") - parser.add_argument("--detection-threshold", type=float, default=0.6, help="Threshold for positive detections") + parser = argparse.ArgumentParser(description="Subfigure Separation Script") + + parser.add_argument('--checkpoint', type=str, required=True, help='Path to model checkpoint') + parser.add_argument('--eval_file', type=str, required=True, help='Path to evaluation dataset file') + parser.add_argument('--img_root', type=str, required=True, help='Root path for figures') + parser.add_argument('--save_path', type=str, default='./Separation', help='Path to save separated subfigures') + parser.add_argument('--rcd_file', type=str, default='./Separation/separation.jsonl', help='File to record separation results') + parser.add_argument('--score_threshold', type=float, default=0.75, help='Confidence score threshold for detections') + parser.add_argument('--nms_threshold', type=float, default=0.4, help='IoU threshold for NMS') + parser.add_argument('--batch_size', type=int, default=16, help='Batch size for evaluation') + parser.add_argument('--num_workers', type=int, default=2, help='Number of workers for data loading') + parser.add_argument('--gpu', type=str, default='0', help='GPU to use') args = parser.parse_args() - main(args) + main(args) \ No newline at end of file diff --git a/openpmcvl/pipeline/subfigure.sh b/openpmcvl/pipeline/subfigure.sh index 1d1a9ed..d96f261 100644 --- a/openpmcvl/pipeline/subfigure.sh +++ b/openpmcvl/pipeline/subfigure.sh @@ -12,9 +12,14 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction stdbuf -oL -eL srun python3 openpmcvl/pipeline/subfigure.py \ - --input-file /datasets/PMC-15M/experimental/0.jsonl \ - --output-file /datasets/PMC-15M/experimental/0.jsonl \ - --data-root /datasets/PMC-15M \ - --model-path openpmcvl/models/subfigure_detector.pth \ - --detection-threshold 0.6 \ + --checkpoint openpmcvl/models/subfigure_detector.pth \ + --eval_file /datasets/PMC-15M/experimental/demo/demo.jsonl \ + --img_root /datasets/PMC-15M/experimental/demo/demo_figures \ + --save_path /datasets/PMC-15M/experimental/demo/demo_subfigures \ + --rcd_file /datasets/PMC-15M/experimental/demo/demo_subfigures.jsonl \ + --score_threshold 0.5 \ + --nms_threshold 0.4 \ + --batch_size 8 \ + --num_workers 4 \ + --gpu 0 2>&1 | tee -a %x-%j.out \ No newline at end of file From 80b77b2064684df333751563a527c570b4bad23d Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 26 Sep 2024 11:04:16 -0400 Subject: [PATCH 12/62] Add primary ocr pipeline. --- openpmcvl/pipeline/align.py | 89 +++++++++++++++++++++++++++++++++++++ openpmcvl/pipeline/align.sh | 17 +++++++ 2 files changed, 106 insertions(+) create mode 100644 openpmcvl/pipeline/align.py create mode 100644 openpmcvl/pipeline/align.sh diff --git a/openpmcvl/pipeline/align.py b/openpmcvl/pipeline/align.py new file mode 100644 index 0000000..82fa22b --- /dev/null +++ b/openpmcvl/pipeline/align.py @@ -0,0 +1,89 @@ +import argparse +import json +from pathlib import Path +from typing import List, Dict, Union + +from tqdm import tqdm +from openpmcvl.process.playground_subfigure_ocr import classifier + + +def load_dataset(file_path: str) -> List[Dict]: + """ + Load dataset from a JSONL file. + + Args: + file_path (str): Path to the JSONL file + + Returns: + List[Dict]: List of dictionaries containing the JSONL data + """ + with open(file_path, 'r') as f: + return [json.loads(line) for line in f] + +def update_dataset(data: List[Dict], file_path: str) -> None: + """ + Save dataset to a JSONL file. + + Args: + data (List[Dict]): List of dictionaries to save + file_path (str): Path to the output JSONL file + """ + with open(file_path, 'w') as f: + for item in data: + json.dump(item, f) + f.write('\n') + +def process_subfigure(model: classifier, subfig_data: Dict) -> Dict: + """ + Process a single subfigure using the OCR model. + + Args: + model (classifier): Initialized OCR model + subfig_data (Dict): Dictionary containing subfigure data + + Returns: + Dict: Updated subfigure data with OCR results + """ + image_path = subfig_data['subfig_path'] + ocr_result = model.run(image_path) + + if ocr_result: + label_letter, *label_position = ocr_result + subfig_data['label'] = f"Subfigure-{label_letter.upper()}" + subfig_data['label_position'] = label_position + else: + subfig_data['label'] = "" + subfig_data['label_position'] = [] + + return subfig_data + +def main(args: argparse.Namespace) -> None: + """ + Main function to process subfigures and update JSONL file. + + Args: + args (argparse.Namespace): Parsed command-line arguments + """ + # Load model and dataset + model = classifier() + dataset = load_dataset(args.dataset_path) + + # Process each subfigure + updated_data = [] + for item in tqdm(dataset, desc="Processing subfigures", total=len(dataset)): + updated_item = process_subfigure(model, item) + updated_data.append(updated_item) + + # Save updated data + update_dataset(updated_data, args.save_path) + print(f"\nUpdated data saved to {args.save_path}\n") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Subfigure OCR and Labeling") + + parser.add_argument('--dataset_path', type=str, required=True, help='Path to input JSONL file') + parser.add_argument('--save_path', type=str, required=True, help='Path to output JSONL file') + + args = parser.parse_args() + main(args) \ No newline at end of file diff --git a/openpmcvl/pipeline/align.sh b/openpmcvl/pipeline/align.sh new file mode 100644 index 0000000..e912a30 --- /dev/null +++ b/openpmcvl/pipeline/align.sh @@ -0,0 +1,17 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --gres=gpu:1 +#SBATCH --mem=32GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=subfigure +#SBATCH --output=%x-%j.out +#SBATCH --gres=gpu:1 + +source /h/afallah/light/bin/activate + +cd /h/afallah/pmc-data-extraction + +stdbuf -oL -eL srun python3 openpmcvl/pipeline/align.py \ + --dataset_path /datasets/PMC-15M/experimental/demo/demo_subfigures.jsonl \ + --save_path /datasets/PMC-15M/experimental/demo/demo_subfigures_labeled.jsonl \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file From 408ec79a07e0e90fb1fe22300bd6d5564e2197d2 Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 26 Sep 2024 11:04:42 -0400 Subject: [PATCH 13/62] Add playground code to use ocr pipeline. --- openpmcvl/process/playground_subfigure_ocr.py | 407 ++++++++++++++++++ 1 file changed, 407 insertions(+) create mode 100644 openpmcvl/process/playground_subfigure_ocr.py diff --git a/openpmcvl/process/playground_subfigure_ocr.py b/openpmcvl/process/playground_subfigure_ocr.py new file mode 100644 index 0000000..0454ced --- /dev/null +++ b/openpmcvl/process/playground_subfigure_ocr.py @@ -0,0 +1,407 @@ +""" +Pipeline to OCR the label of each subfig and align them with subcaptions +""" + +import yaml +import torch +from skimage import io +import numpy as np +import cv2 +from torch.autograd import Variable +from PIL import Image +import torch.nn.functional as F +import os +from tqdm import tqdm +import json + +from subfigure_ocr.models.yolov3 import * +from subfigure_ocr.models.network import * +from subfigure_ocr.separator import process + +SUBFIGURE_OCR_DIR = '/fs01/home/afallah/pmc-data-extraction/openpmcvl/process/subfigure_ocr' +INFERENCE_DIR = '/fs01/home/afallah/pmc-data-extraction/Inference' + +class classifier(): + def __init__(self): + # model_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/exsclaim/figures/' + configuration_file = f"{SUBFIGURE_OCR_DIR}/config/yolov3_default_subfig.cfg" + with open(configuration_file, 'r') as f: + configuration = yaml.load(f, Loader=yaml.FullLoader) + + self.image_size = configuration['TEST']['IMGSIZE'] + self.nms_threshold = configuration['TEST']['NMSTHRE'] + self.confidence_threshold = 0.0001 + self.dtype = torch.cuda.FloatTensor + self.device = torch.device('cuda') + + object_detection_model = YOLOv3(configuration['MODEL']) + self.object_detection_model = self.load_model_from_checkpoint(object_detection_model, "object_detection_model.pt") + ## Load text recognition model + text_recognition_model = resnet152() + self.text_recognition_model = self.load_model_from_checkpoint(text_recognition_model, 'text_recognition_model.pt') + + self.object_detection_model.eval() + self.text_recognition_model.eval() + + def load_model_from_checkpoint(self, model, model_name): + """ load checkpoint weights into model """ + checkpoints_path = f'{SUBFIGURE_OCR_DIR}/checkpoints/' #'/remote-home/zihengzhao/CompoundFigure/exsclaim/exsclaim/figures/checkpoints/' + checkpoint = checkpoints_path + model_name + model.load_state_dict(torch.load(checkpoint)) + # model = nn.DataParallel(model) + model.to(self.device) + return model + + def detect_subfigure_boundaries(self, figure_path): + """ Detects the bounding boxes of subfigures in figure_path + + Args: + figure_path: A string, path to an image of a figure + from a scientific journal + Returns: + subfigure_info (list of lists): Each inner list is + x1, y1, x2, y2, confidence + """ + + ## Preprocess the figure for the models + img = io.imread(figure_path) + if len(np.shape(img)) == 2: + img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB) + else: + img = cv2.cvtColor(img,cv2.COLOR_RGBA2RGB) + + img, info_img = process.preprocess(img, self.image_size, jitter=0) + img = np.transpose(img / 255., (2, 0, 1)) + img = np.copy(img) + img = torch.from_numpy(img).float().unsqueeze(0) + img = Variable(img.type(self.dtype)) + + img_raw = Image.open(figure_path).convert("RGB") + width, height = img_raw.size + + ## Run model on figure + with torch.no_grad(): + outputs = self.object_detection_model(img.to(self.device)) + outputs = process.postprocess(outputs, dtype=self.dtype, + conf_thre=self.confidence_threshold, nms_thre=self.nms_threshold) + + ## Reformat model outputs to display bounding boxes in our desired format + ## List of lists where each inner list is [x1, y1, x2, y2, confidence] + subfigure_info = list() + + if outputs[0] is None: + return subfigure_info + + for x1, y1, x2, y2, conf, cls_conf, cls_pred in outputs[0]: + box = process.yolobox2label([y1.data.cpu().numpy(), x1.data.cpu().numpy(), y2.data.cpu().numpy(), x2.data.cpu().numpy()], info_img) + box[0] = int(min(max(box[0],0),width-1)) + box[1] = int(min(max(box[1],0),height-1)) + box[2] = int(min(max(box[2],0),width)) + box[3] = int(min(max(box[3],0),height)) + # ensures no extremely small (likely incorrect) boxes are counted + small_box_threshold = 5 + if (box[2]-box[0] > small_box_threshold and + box[3]-box[1] > small_box_threshold): + box.append("%.3f"%(cls_conf.item())) + subfigure_info.append(box) + return subfigure_info + + def detect_subfigure_labels(self, figure_path, subfigure_info): + """ Uses text recognition to read subfigure labels from figure_path + + Note: + To get sensible results, should be run only after + detect_subfigure_boundaries has been run + Args: + figure_path (str): A path to the image (.png, .jpg, or .gif) + file containing the article figure + subfigure_info (list of lists): Details about bounding boxes + of each subfigure from detect_subfigure_boundaries(). Each + inner list has format [x1, y1, x2, y2, confidence] where + x1, y1 are upper left bounding box coordinates as ints, + x2, y2, are lower right, and confidence the models confidence + Returns: + subfigure_info (list of tuples): Details about bounding boxes and + labels of each subfigure in figure. Tuples for each subfigure are + (x1, y1, x2, y2, label) where x1, y1 are upper left x and y coord + divided by image width/height and label is the an integer n + meaning the label is the nth letter + concate_img (np.ndarray): A numpy array representing the figure. + Used in classify_subfigures. Ideally this will be removed to + increase modularity. + """ + img_raw = Image.open(figure_path).convert("RGB") + img_raw = img_raw.copy() + width, height = img_raw.size + binary_img = np.zeros((height,width,1)) + + detected_label_and_bbox = None + max_confidence = 0.0 + for subfigure in subfigure_info: + ## Preprocess the image for the model + bbox = tuple(subfigure[:4]) + img_patch = img_raw.crop(bbox) + img_patch = np.array(img_patch)[:,:,::-1] + img_patch, _ = process.preprocess(img_patch, 28, jitter=0) + img_patch = np.transpose(img_patch / 255., (2, 0, 1)) + img_patch = torch.from_numpy(img_patch).type(self.dtype).unsqueeze(0) + + ## Run model on figure + label_prediction = self.text_recognition_model(img_patch.to(self.device)) + label_confidence = np.amax(F.softmax(label_prediction, dim=1).data.cpu().numpy()) + x1,y1,x2,y2, box_confidence = subfigure + total_confidence = float(box_confidence)*label_confidence + if total_confidence < max_confidence: + continue + label_value = chr(label_prediction.argmax(dim=1).data.cpu().numpy()[0]+ord("a")) + if label_value == "z": + continue + # if (x2-x1) < 64 and (y2-y1)< 64: + detected_label_and_bbox = [label_value, x1,y1,x2,y2] + + return detected_label_and_bbox + + def run(self, figure_path): + subfigure_info = self.detect_subfigure_boundaries(figure_path) + subfigure_info = self.detect_subfigure_labels(figure_path, subfigure_info) + + return subfigure_info + + +def subfigure_ocr(): + """ + 提取subfigure的label信息 + """ + # 所有可以分出subcap的comfig + old_dict = {} + for i in range(10): + #TODO + file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_part_%d/exsclaim.json'%i + with open(file_path, 'r') as f: + old_dict.update(json.load(f)) + + f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4.jsonl') + lines = f.readlines() + data = [json.loads(line) for line in lines] + comfig_dict = {} + for datum in tqdm(data): + comfig_id = datum['id'] + comfig_dict[comfig_id] = {'h':datum['height'], 'w':datum['width']} + + model = classifier() + # root path to all subfigs + path = INFERENCE_DIR #'/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_subfigures/' + # all comfigs + f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl') + lines = f.readlines() + comfig = [json.loads(line) for line in lines] + new_dict = {} + # for datum in tqdm(comfig[:100000]): + for datum in tqdm(comfig): + comfig_id = datum['comfig_id'] + if not (comfig_id in old_dict): # 只ocr那些caption可以被打开的结果 + continue + comfig_h = comfig_dict[comfig_id]['h'] + comfig_w = comfig_dict[comfig_id]['w'] + # 记录每个comfig的subfig信息(包含OCR + master_images=[] + for subfig, locs, scores in zip(datum['subfig_ids'], datum['subfig_locs'], datum['subfig_scores']): + label_info = model.run(path+subfig) + if label_info: + x1, y1, x2, y2 = locs + x1 = round(x1 * comfig_w) + x2 = round(x2 * comfig_w) + y1 = round(y1 * comfig_h) + y2 = round(y2 * comfig_h) + w = x2 - x1 + h = y2 - y1 + geometry = [{'x':x1, 'y':y1}, {'x':x1, 'y':y2}, {'x':x2, 'y':y1}, {'x':x2, 'y':y2}] + label, label_x1, label_y1, label_x2, label_y2 = label_info + label_geometry = [{'x':label_x1+x1, 'y':label_y1+y1}, {'x':label_x1+x1, 'y':label_y2+y1}, {'x':label_x2+x1, 'y':label_y1+y1}, {'x':label_x2+x1, 'y':label_y2+y1}] + subfig_label = {"text":label, "geometry":label_geometry} + master_images.append({ + 'classification':subfig, + 'confidence':scores, + 'height':h, 'width':w, + 'geometry':geometry, + "subfigure_label":subfig_label, + "scale_bars":[], + "caption": [], + "keywords": [], + "general": []}) + new_dict[comfig_id] = old_dict[comfig_id] + new_dict[comfig_id]['master_images'] = master_images + + # '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_ocr_subfig.json' + with open(f'{INFERENCE_DIR}/pmc2exsclaim_ocr_subfig.json', 'w', encoding="utf-8") as f: + json.dump(new_dict, f, indent=3) + +# change this file path for different subcaption separation method +def subfigure_ocr_link_exsclaim_subcap(): + """ + ocr之后的subfigure和subcaption合并到同一个exsclaim中 + """ + def are_same_text(t1, t2, tokenizer): + if t1 == t2: + return True + if t1[:-1] == t2: + return True + if t1 == t2[:-1]: + return True + if tokenizer.tokenize(t1) == tokenizer.tokenize(t2): + return True + else: + return False + from transformers import AutoTokenizer + tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') + + file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' + with open(file_path, 'r') as f: + cap_dict = json.load(f) + + file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim_no_subcaps.json' + with open(file_path, 'r') as f: + data_dict = json.load(f) + + """ + check = {} + for pmc_id, datum in tqdm(data_dict.items()): + check[pmc_id] = datum + if len(check) > 2: + break + with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/check_before_link_subcaps.json', 'w', encoding="utf-8") as f: + json.dump(check, f, indent=3) + """ + + filtered_subcap = 0 + unfiltered_subcap = 0 + for pmc_id, datum in tqdm(data_dict.items()): + subcaps = [] + for subcap in cap_dict[pmc_id]['unassigned']['captions']: + if len(subcap["description"]) == 0: + # 没有 + continue + filtered_description = [] + for text in subcap["description"]: + # subcap中每一段不等于整个caption + if not are_same_text(text, datum['full_caption'], tokenizer): + filtered_description.append(text) + if len(filtered_description) == 0: + # 都过滤掉了 + continue + joint_subcap = " ".join(filtered_description) + if not are_same_text(joint_subcap, datum['full_caption'], tokenizer): + # subcap连在一起不等于整个caption + subcap["description"] = filtered_description + subcaps.append(subcap) + unfiltered_subcap += 1 + else: + filtered_subcap += 1 + data_dict[pmc_id]['unassigned']['captions'] = subcaps + + """ + check = {} + for pmc_id, datum in tqdm(data_dict.items()): + check[pmc_id] = datum + if len(check) > 2: + break + with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/check_after_link_subcaps.json', 'w', encoding="utf-8") as f: + json.dump(check, f, indent=3) + """ + + with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json', 'w', encoding="utf-8") as f: + json.dump(data_dict, f, indent=3) + +# 将/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json送入exsclaim的pipeline将subfig和subcap对齐 + +def ocr_replace_clip_alignment(): + """ + 将exsclaim输出的subfigure和subcaption对齐结果,替换掉CLIP的对齐结果 + """ + file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json' + with open(file_path, 'r') as f: + ocr_dict = json.load(f) + + file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' + with open(file_path, 'r') as f: + lines = f.readlines() + data = [json.loads(line) for line in lines] + + new_data = [] + missing_comfig = abandon_1 = abandon_2 = replace = 0 + for datum in tqdm(data): + comfig_id = datum['comfig_id'] + old_subfig_ids = datum['subfig_ids'] + old_subcaptions = datum['subcaptions'] + old_subcap_indexes = datum['subcap_indexes'] + old_subcap_scores = datum['subcap_scores'] + new_subfig_ids = [] + new_subcap_indexes = [] + new_subcap_scores = [] + if comfig_id not in ocr_dict: + missing_comfig += 1 + continue + ocr_results = ocr_dict[comfig_id] + for subfig in ocr_results['master_images']: + if len(subfig['caption']) > 0: + if subfig['classification'] not in old_subfig_ids: + print('Subfig ID not found Error : ', subfig['classification']) + abandon_1 += 1 + continue + subcaption = " ".join(subfig['caption']) + if subcaption not in old_subcaptions: + print('Caption not found Error : ', subfig['classification']) + print('Subcaption : %s'% subcaption) + for i, tmp in enumerate(old_subcaptions): + print('Subcaption Option %d : %s \n', (i,tmp)) + abandon_2 += 1 + continue + # 有ocr匹配的subcaption结果, 而且可以替换进来 + new_subfig_ids.append(subfig['classification']) + new_subcap_indexes.append(old_subcaptions.index(subcaption)) + new_subcap_scores.append(1.0) + replace += 1 + for idx, subfig in enumerate(old_subfig_ids): + if subfig in new_subfig_ids: + # 已经用ocr的匹配结果替换掉了 + continue + else: + new_subfig_ids.append(subfig) + new_subcap_indexes.append(old_subcap_indexes[idx]) + new_subcap_scores.append(old_subcap_scores[idx]) + datum['subfig_ids'] = new_subfig_ids + datum['subcap_indexes'] = new_subcap_indexes + datum['subcap_scores'] = new_subcap_scores + new_data.append(datum) + + print('Missing comfig in exsclaim:', missing_comfig) + print('Missing subfigure id:', abandon_1) + print('Missing subcaption:', abandon_2) + print('Successfully replace:', replace) + + f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(plus_ocr).jsonl', 'w') + for datum in tqdm(new_data): + f.write(json.dumps(datum)+'\n') + f.close() + + +# if __name__ == "__main__": +# file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' +# with open(file_path, 'r') as f: +# lines = f.readlines() +# data = [json.loads(line) for line in lines] + +# for datum in data: +# if datum['comfig_id'] == "PMC4608103_Fig2.jpg": +# for subcap in datum['subcaptions']: +# print(subcap, '\n') +# break + +# file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(new).jsonl' +# with open(file_path, 'r') as f: +# lines = f.readlines() +# data = [json.loads(line) for line in lines] + +# for datum in data: +# if datum['comfig_id'] == "PMC4608103_Fig2.jpg": +# print(datum['subcaption']) \ No newline at end of file From 6715d5d455fe95c499d30f34ff05009df3ea2316 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 7 Oct 2024 15:52:20 -0400 Subject: [PATCH 14/62] Add classification to subfigure pipeline. --- openpmcvl/pipeline/subfigure.py | 312 ++++++++++++++++++++++++-------- openpmcvl/pipeline/subfigure.sh | 3 +- 2 files changed, 238 insertions(+), 77 deletions(-) diff --git a/openpmcvl/pipeline/subfigure.py b/openpmcvl/pipeline/subfigure.py index dea9bc6..53519bd 100644 --- a/openpmcvl/pipeline/subfigure.py +++ b/openpmcvl/pipeline/subfigure.py @@ -6,53 +6,81 @@ import numpy as np import torch +import torch.nn as nn from torch.utils.data import DataLoader from tqdm import tqdm -from torchvision import utils as vutils +from torchvision import utils as vutils, models, transforms +from PIL import Image -from openpmcvl.process.dataset_det_align import Fig_Separation_Dataset, fig_separation_collate +from openpmcvl.process.dataset_det_align import ( + Fig_Separation_Dataset, + fig_separation_collate, +) from openpmcvl.models.subfigure_detector import FigCap_Former from openpmcvl.process.detect_metric import box_cxcywh_to_xyxy, find_jaccard_overlap +MEDICAL_CLASS = 15 +CLASSIFICATION_THRESHOLD = 4 -def load_dataset(eval_file: str, img_root: str, batch_size: int, num_workers: int) -> DataLoader: + +def load_dataset( + eval_file: str, img_root: str, batch_size: int, num_workers: int +) -> DataLoader: """ Prepares the dataset and returns a DataLoader. - + Args: eval_file (str): Path to the evaluation dataset file img_root (str): Root path for figures batch_size (int): Batch size for the DataLoader num_workers (int): Number of workers for the DataLoader - + Returns: DataLoader: Configured DataLoader for the separation dataset """ dataset = Fig_Separation_Dataset(None, eval_file, img_root, normalization=False) print(f"\nDataset size: {len(dataset)}\n") - return DataLoader(dataset, batch_size=batch_size, shuffle=False, num_workers=num_workers, collate_fn=fig_separation_collate) + return DataLoader( + dataset, + batch_size=batch_size, + shuffle=False, + num_workers=num_workers, + collate_fn=fig_separation_collate, + ) -def load_model(checkpoint_path: str, device: torch.device) -> FigCap_Former: +def load_separation_model(checkpoint_path: str, device: torch.device) -> FigCap_Former: """ Loads the FigCap_Former model from a checkpoint. - + Args: checkpoint_path (str): Path to the model checkpoint device (torch.device): Device to use for processing - + Returns: FigCap_Former: Loaded model """ model = FigCap_Former( - num_query=32, num_encoder_layers=4, num_decoder_layers=4, num_text_decoder_layers=4, - bert_path='bert-base-uncased', alignment_network=False, resnet_pretrained=False, - resnet=34, feature_dim=256, atten_head_num=8, text_atten_head_num=8, - mlp_ratio=4, dropout=0.0, activation='relu', - text_mlp_ratio=4, text_dropout=0.0, text_activation='relu' + num_query=32, + num_encoder_layers=4, + num_decoder_layers=4, + num_text_decoder_layers=4, + bert_path="bert-base-uncased", + alignment_network=False, + resnet_pretrained=False, + resnet=34, + feature_dim=256, + atten_head_num=8, + text_atten_head_num=8, + mlp_ratio=4, + dropout=0.0, + activation="relu", + text_mlp_ratio=4, + text_dropout=0.0, + text_activation="relu", ) - checkpoint = torch.load(checkpoint_path, map_location='cpu') - model.load_state_dict(checkpoint['model_state_dict'], strict=False) + checkpoint = torch.load(checkpoint_path, map_location="cpu") + model.load_state_dict(checkpoint["model_state_dict"], strict=False) model.eval() model.to(device) @@ -60,15 +88,17 @@ def load_model(checkpoint_path: str, device: torch.device) -> FigCap_Former: return model -def process_detections(det_boxes: torch.Tensor, det_scores: np.ndarray, nms_threshold: float) -> Tuple[List[List[float]], List[float]]: +def process_detections( + det_boxes: torch.Tensor, det_scores: np.ndarray, nms_threshold: float +) -> Tuple[List[List[float]], List[float]]: """ Processes detections using Non-Maximum Suppression (NMS). - + Args: det_boxes (torch.Tensor): Detected bounding boxes det_scores (np.ndarray): Confidence scores for detections nms_threshold (float): IoU threshold for NMS - + Returns: Tuple[List[List[float]], List[float]]: Picked bounding boxes and their scores """ @@ -81,18 +111,57 @@ def process_detections(det_boxes: torch.Tensor, det_scores: np.ndarray, nms_thre picked_scores.append(det_scores[index]) if order.size == 1: break - iou_with_left = find_jaccard_overlap(box_cxcywh_to_xyxy(det_boxes[index]), box_cxcywh_to_xyxy(det_boxes[order[:-1]])).squeeze().numpy() + iou_with_left = ( + find_jaccard_overlap( + box_cxcywh_to_xyxy(det_boxes[index]), + box_cxcywh_to_xyxy(det_boxes[order[:-1]]), + ) + .squeeze() + .numpy() + ) left = np.where(iou_with_left < nms_threshold) order = order[left] return picked_bboxes, picked_scores -def separate_subfigures(model: FigCap_Former, loader: DataLoader, save_path: str, rcd_file: str, score_threshold: float, nms_threshold: float, device: torch.device) -> None: +def load_classification_model(model_path: str, device: torch.device) -> nn.Module: """ - Separates compound figures into subfigures. - + Loads the figure classification model. + + Args: + model_path (str): Path to the classification model checkpoint + device (torch.device): Device to use for processing + + Returns: + nn.Module: Loaded classification model + """ + fig_model = models.resnext101_32x8d() + num_features = fig_model.fc.in_features + fc = list(fig_model.fc.children()) + fc.extend([nn.Linear(num_features, 28)]) + fig_model.fc = nn.Sequential(*fc) + fig_model = fig_model.to(device) + fig_model.load_state_dict(torch.load(model_path, map_location=device)) + fig_model.eval() + return fig_model + + +def separate_classify_subfigures( + model: FigCap_Former, + class_model: nn.Module, + loader: DataLoader, + save_path: str, + rcd_file: str, + score_threshold: float, + nms_threshold: float, + device: torch.device, +) -> None: + """ + Separates compound figures into subfigures and classifies them. + Args: model (FigCap_Former): Loaded model for subfigure detection + class_model (nn.Module): Loaded model for figure classification loader (DataLoader): DataLoader for the dataset save_path (str): Path to save separated subfigures rcd_file (str): File to record separation results @@ -104,61 +173,102 @@ def separate_subfigures(model: FigCap_Former, loader: DataLoader, save_path: str subfig_list = [] subfig_count = 0 + mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + fig_class_transform = transforms.Compose( + [ + transforms.Resize((384, 384), interpolation=Image.LANCZOS), + transforms.ToTensor(), + transforms.Normalize(*mean_std), + ] + ) + with torch.no_grad(): try: - for batch in tqdm(loader, desc='Separating subfigures', total=len(loader)): - image = batch['image'].to(device) - caption = batch['caption'].to(device) - img_ids = batch['image_id'] - original_images = batch['original_image'] - unpadded_hws = batch['unpadded_hws'] - + for batch in tqdm(loader, desc="Separating subfigures", total=len(loader)): + image = batch["image"].to(device) + caption = batch["caption"].to(device) + img_ids = batch["image_id"] + original_images = batch["original_image"] + unpadded_hws = batch["unpadded_hws"] + output_det_class, output_box, _ = model(image, caption) - + cpu_output_box = output_box.cpu() cpu_output_det_class = output_det_class.cpu() filter_mask = cpu_output_det_class.squeeze() > score_threshold for i in range(image.shape[0]): - det_boxes = cpu_output_box[i, filter_mask[i,:], :] - det_scores = cpu_output_det_class.squeeze()[i, filter_mask[i,:]].numpy() - img_id = img_ids[i].split('.jpg')[0] + det_boxes = cpu_output_box[i, filter_mask[i, :], :] + det_scores = cpu_output_det_class.squeeze()[ + i, filter_mask[i, :] + ].numpy() + img_id = img_ids[i].split(".jpg")[0] unpadded_image = original_images[i] original_h, original_w = unpadded_hws[i] - + scale = max(original_h, original_w) / 512 - - picked_bboxes, picked_scores = process_detections(det_boxes, det_scores, nms_threshold) - + + picked_bboxes, picked_scores = process_detections( + det_boxes, det_scores, nms_threshold + ) + for bbox, score in zip(picked_bboxes, picked_scores): try: - subfig_path = f'{save_path}/{img_id}_{subfig_count}.jpg' + subfig_path = f"{save_path}/{img_id}_{subfig_count}.jpg" cx, cy, w, h = bbox - x1, x2 = [round((cx - w/2)*image.shape[3]*scale), round((cx + w/2)*image.shape[3]*scale)] - y1, y2 = [round((cy - h/2)*image.shape[2]*scale), round((cy + h/2)*image.shape[2]*scale)] - - x1, x2 = [max(0, min(x, original_w-1)) for x in [x1, x2]] - y1, y2 = [max(0, min(y, original_h-1)) for y in [y1, y2]] - - subfig = unpadded_image[:, y1:y2, x1:x2].to(torch.device('cpu')) + x1, x2 = [ + round((cx - w / 2) * image.shape[3] * scale), + round((cx + w / 2) * image.shape[3] * scale), + ] + y1, y2 = [ + round((cy - h / 2) * image.shape[2] * scale), + round((cy + h / 2) * image.shape[2] * scale), + ] + + x1, x2 = [max(0, min(x, original_w - 1)) for x in [x1, x2]] + y1, y2 = [max(0, min(y, original_h - 1)) for y in [y1, y2]] + + subfig = unpadded_image[:, y1:y2, x1:x2].to( + torch.device("cpu") + ) vutils.save_image(subfig, subfig_path) - - subfig_list.append({ - 'id': f'{subfig_count}.jpg', - 'source_fig_id': img_id, - 'position': [(x1, y1), (x2, y2)], - 'score': score.item(), - 'subfig_path': subfig_path - }) + + # Perform classification + class_input = ( + fig_class_transform(transforms.ToPILImage()(subfig)) + .unsqueeze(0) + .to(device) + ) + fig_prediction = class_model(class_input) + + sorted_pred = torch.argsort( + fig_prediction[0].cpu(), descending=True + ) + medical_class_rank = (sorted_pred == MEDICAL_CLASS).nonzero().item() + is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD + + subfig_list.append( + { + "id": f"{subfig_count}.jpg", + "source_fig_id": img_id, + "position": [(x1, y1), (x2, y2)], + "score": score.item(), + "subfig_path": subfig_path, + "medical_class_rank": medical_class_rank, + "is_medical": is_medical, + } + ) subfig_count += 1 except ValueError: - print(f'Crop Error: [x1 x2 y1 y2]:[{x1} {x2} {y1} {y2}], w:{original_w}, h:{original_h}') + print( + f"Crop Error: [x1 x2 y1 y2]:[{x1} {x2} {y1} {y2}], w:{original_w}, h:{original_h}" + ) except Exception as e: - print(f'Error occurred: {repr(e)}') + print(f"Error occurred: {repr(e)}") finally: - with open(rcd_file, 'a') as f: + with open(rcd_file, "a") as f: for line in subfig_list: - f.write(json.dumps(line) + '\n') + f.write(json.dumps(line) + "\n") def main(args: argparse.Namespace) -> None: @@ -171,25 +281,75 @@ def main(args: argparse.Namespace) -> None: os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - model = load_model(args.checkpoint, device) - dataloader = load_dataset(args.eval_file, args.img_root, args.batch_size, args.num_workers) - separate_subfigures(model, dataloader, args.save_path, args.rcd_file, args.score_threshold, args.nms_threshold, device) - print("\nSubfigure separation completed.\n") + model = load_separation_model(args.separation_model, device) + class_model = load_classification_model(args.class_model, device) + dataloader = load_dataset( + args.eval_file, args.img_root, args.batch_size, args.num_workers + ) + separate_classify_subfigures( + model, + class_model, + dataloader, + args.save_path, + args.rcd_file, + args.score_threshold, + args.nms_threshold, + device, + ) + print("\nSubfigure separation and classification completed.\n") if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Subfigure Separation Script") - - parser.add_argument('--checkpoint', type=str, required=True, help='Path to model checkpoint') - parser.add_argument('--eval_file', type=str, required=True, help='Path to evaluation dataset file') - parser.add_argument('--img_root', type=str, required=True, help='Root path for figures') - parser.add_argument('--save_path', type=str, default='./Separation', help='Path to save separated subfigures') - parser.add_argument('--rcd_file', type=str, default='./Separation/separation.jsonl', help='File to record separation results') - parser.add_argument('--score_threshold', type=float, default=0.75, help='Confidence score threshold for detections') - parser.add_argument('--nms_threshold', type=float, default=0.4, help='IoU threshold for NMS') - parser.add_argument('--batch_size', type=int, default=16, help='Batch size for evaluation') - parser.add_argument('--num_workers', type=int, default=2, help='Number of workers for data loading') - parser.add_argument('--gpu', type=str, default='0', help='GPU to use') - + parser = argparse.ArgumentParser( + description="Subfigure Separation and Classification Script" + ) + + parser.add_argument( + "--separation_model", + type=str, + required=True, + help="Path to subfigure detection model checkpoint", + ) + parser.add_argument( + "--class_model", + type=str, + required=True, + help="Path to figure classification model checkpoint", + ) + parser.add_argument( + "--eval_file", type=str, required=True, help="Path to evaluation dataset file" + ) + parser.add_argument( + "--img_root", type=str, required=True, help="Root path for figures" + ) + parser.add_argument( + "--save_path", + type=str, + default="./Separation", + help="Path to save separated subfigures", + ) + parser.add_argument( + "--rcd_file", + type=str, + default="./Separation/separation.jsonl", + help="File to record separation results", + ) + parser.add_argument( + "--score_threshold", + type=float, + default=0.75, + help="Confidence score threshold for detections", + ) + parser.add_argument( + "--nms_threshold", type=float, default=0.4, help="IoU threshold for NMS" + ) + parser.add_argument( + "--batch_size", type=int, default=16, help="Batch size for evaluation" + ) + parser.add_argument( + "--num_workers", type=int, default=2, help="Number of workers for data loading" + ) + parser.add_argument("--gpu", type=str, default="0", help="GPU to use") + args = parser.parse_args() - main(args) \ No newline at end of file + main(args) diff --git a/openpmcvl/pipeline/subfigure.sh b/openpmcvl/pipeline/subfigure.sh index d96f261..23e2d08 100644 --- a/openpmcvl/pipeline/subfigure.sh +++ b/openpmcvl/pipeline/subfigure.sh @@ -12,7 +12,8 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction stdbuf -oL -eL srun python3 openpmcvl/pipeline/subfigure.py \ - --checkpoint openpmcvl/models/subfigure_detector.pth \ + --separation_model openpmcvl/models/subfigure_detector.pth \ + --class_model openpmcvl/models/resnext101_figure_class.pth \ --eval_file /datasets/PMC-15M/experimental/demo/demo.jsonl \ --img_root /datasets/PMC-15M/experimental/demo/demo_figures \ --save_path /datasets/PMC-15M/experimental/demo/demo_subfigures \ From cbc86e469add7505c16e94eff9048fc674aa20c4 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 7 Oct 2024 15:52:30 -0400 Subject: [PATCH 15/62] Update readme. --- openpmcvl/process/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openpmcvl/process/README.md b/openpmcvl/process/README.md index 3c82a81..b43a286 100644 --- a/openpmcvl/process/README.md +++ b/openpmcvl/process/README.md @@ -14,6 +14,8 @@ inference_det_align.py \ --img_root path_of_compound_figures \ # save all the figure in a folder --eval_file jsonl_file_of_all_the_samples_to_infer # refer to Fig_Separation_Dataset for the format of the jsonl file --checkpoint subfigure_detection.pth + +assign the collate fcn to the dataloader ``` filter out non-medical subfigure From 581f8e325b252235f0004fe9c97cf635e4794b99 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 7 Oct 2024 15:53:06 -0400 Subject: [PATCH 16/62] Revise prior code detecting subfigures. --- openpmcvl/process/dataset_det_align.py | 4 +- .../playground_inference_detect_align.py | 456 +++++++++--------- 2 files changed, 230 insertions(+), 230 deletions(-) diff --git a/openpmcvl/process/dataset_det_align.py b/openpmcvl/process/dataset_det_align.py index 7325aac..be4163f 100644 --- a/openpmcvl/process/dataset_det_align.py +++ b/openpmcvl/process/dataset_det_align.py @@ -541,7 +541,7 @@ def __init__(self, aug_param, filepath, image_root, normalization=False, start=0 f = open(filepath) lines = f.readlines() data = [json.loads(line) for line in lines] - data = data[start:end] + data = data[start:len(data)] anno_subfig_num = 0 filtered_compound_fig_num = 0 filtered_subfig_num = 0 @@ -555,7 +555,7 @@ def __init__(self, aug_param, filepath, image_root, normalization=False, start=0 # basic info of compound figure image_info = {} - image_info["path"] = image_root+'/'+datum["id"] + image_info["path"] = datum["image_path"] #image_root+'/'+datum["id"] image_info['id'] = datum["id"] image_info['index'] = count count += 1 diff --git a/openpmcvl/process/playground_inference_detect_align.py b/openpmcvl/process/playground_inference_detect_align.py index c172141..8997d34 100644 --- a/openpmcvl/process/playground_inference_detect_align.py +++ b/openpmcvl/process/playground_inference_detect_align.py @@ -28,190 +28,190 @@ from matplotlib import pyplot as plt # Visualization the dataset -def inference(model, valSet, valLoader, save_path='./Inference', iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - - # Subfig Subcap Metric - subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - subcaption_metric.reset() - - Path(save_path).mkdir(parents=True, exist_ok=True) - - # validate one epoch - with torch.no_grad(): - model.eval() - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - # TRANSFORM - # image = image_transform(image) - # - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - img_ids = batch['image_id'] # [bs] - original_hws = batch['original_hws'] # [bs * [2]] 没resize+pad前的hw - untokenized_caption = batch['untokenized_caption'] # [bs * 'string'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - cpu_caption = caption.cpu() - - # evaluation detection(mAP) and alignment(f1) - filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - for i in range(image.shape[0]): - # accumulate results as coco format - det_boxes=[cpu_output_box[i, filter_mask[i,:], :]] # [1 * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() - det_scores=[cpu_output_det_class.squeeze()[i, filter_mask[i,:]]] # [1 * (filter_pred_num)] - det_labels=[torch.ones_like(det_scores[-1])] # [1 * (filter_pred_num)] all 1 - true_boxes=[subfigures[i][0]] # [1 * (subfig_num, 4)] - true_labels=[torch.ones(true_boxes[-1].shape[0])] # [1 * (subfig_num)] all 1 - true_difficulties=[torch.zeros_like(true_labels[-1])] # [1 * (subfig_num)] all zeros +# def inference(model, valSet, valLoader, save_path='./Inference', iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): + +# # Subfig Subcap Metric +# subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) +# subcaption_metric.reset() + +# Path(save_path).mkdir(parents=True, exist_ok=True) + +# # validate one epoch +# with torch.no_grad(): +# model.eval() +# for batch in tqdm(valLoader): +# image = batch['image'].cuda() # (bs, 3, max_w, max_h) +# # TRANSFORM +# # image = image_transform(image) +# # +# caption = batch['caption'].cuda() # (bs, max_l) +# subfigures = batch['subfigs'] +# img_ids = batch['image_id'] # [bs] +# original_hws = batch['original_hws'] # [bs * [2]] 没resize+pad前的hw +# untokenized_caption = batch['untokenized_caption'] # [bs * 'string'] +# output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) +# cpu_output_box = output_box.cpu() +# cpu_output_sim = output_sim.cpu() +# cpu_output_det_class = output_det_class.cpu() +# cpu_caption = caption.cpu() + +# # evaluation detection(mAP) and alignment(f1) +# filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False +# index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) +# for i in range(image.shape[0]): +# # accumulate results as coco format +# det_boxes=[cpu_output_box[i, filter_mask[i,:], :]] # [1 * (filter_pred_num, 4)] +# # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() +# det_scores=[cpu_output_det_class.squeeze()[i, filter_mask[i,:]]] # [1 * (filter_pred_num)] +# det_labels=[torch.ones_like(det_scores[-1])] # [1 * (filter_pred_num)] all 1 +# true_boxes=[subfigures[i][0]] # [1 * (subfig_num, 4)] +# true_labels=[torch.ones(true_boxes[-1].shape[0])] # [1 * (subfig_num)] all 1 +# true_difficulties=[torch.zeros_like(true_labels[-1])] # [1 * (subfig_num)] all zeros - # calcualte mAP, recall, precision - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - - # accumulate results as subfig-subcap format - ls_caption = [valSet.id_to_token(cpu_caption[i].tolist())] # [1 * cap_len] before evaluation, convert ids to tokens - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist()] # [1 * [filtered_query_num * [4]]], (cx, cy, w, h) - ls_gt_boxes = [subfigures[i][0].tolist()] # [bs * [subfigure * [4]]], (cx, cy, w, h) - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens = [pred_tokens] # [1 * [filtered_query_num * [aligned_token_num]]] - filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens = [gt_tokens] # [1 * [subfig_num * [subcap_token_num]]] - # calculate mAP, recall, precision - match_matrix = subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - f1, rcl, prec = subcaption_metric.get_metric(reset=True) - - img_path = [] - if config.name_by_f1: - img_path.append("%s/f1(%.2f)%s" % (save_path, f1, img_ids[i])) - elif config.name_by_mAP: - img_path.append("%s/mAP(%.2f)%s" % (save_path, mAP, img_ids[i])) +# # calcualte mAP, recall, precision +# mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) + +# # accumulate results as subfig-subcap format +# ls_caption = [valSet.id_to_token(cpu_caption[i].tolist())] # [1 * cap_len] before evaluation, convert ids to tokens +# ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist()] # [1 * [filtered_query_num * [4]]], (cx, cy, w, h) +# ls_gt_boxes = [subfigures[i][0].tolist()] # [bs * [subfigure * [4]]], (cx, cy, w, h) +# filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False +# pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption +# ls_pred_tokens = [pred_tokens] # [1 * [filtered_query_num * [aligned_token_num]]] +# filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False +# gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption +# ls_gt_tokens = [gt_tokens] # [1 * [subfig_num * [subcap_token_num]]] +# # calculate mAP, recall, precision +# match_matrix = subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, +# gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) +# f1, rcl, prec = subcaption_metric.get_metric(reset=True) + +# img_path = [] +# if config.name_by_f1: +# img_path.append("%s/f1(%.2f)%s" % (save_path, f1, img_ids[i])) +# elif config.name_by_mAP: +# img_path.append("%s/mAP(%.2f)%s" % (save_path, mAP, img_ids[i])) - visualization(image=image[i].cpu(), original_h=original_hws[i][0], original_w=original_hws[i][1], - pred_boxes=det_boxes[-1], pred_texts=pred_tokens, gt_boxes=true_boxes[-1], gt_texts=gt_tokens, match_matrix = match_matrix[-1], - cap=ls_caption[-1], untokenized_cap=untokenized_caption[i], path=img_path, mAP=mAP, f1=f1) +# visualization(image=image[i].cpu(), original_h=original_hws[i][0], original_w=original_hws[i][1], +# pred_boxes=det_boxes[-1], pred_texts=pred_tokens, gt_boxes=true_boxes[-1], gt_texts=gt_tokens, match_matrix = match_matrix[-1], +# cap=ls_caption[-1], untokenized_cap=untokenized_caption[i], path=img_path, mAP=mAP, f1=f1) # Evaluate det and align on the dataset -def evaluate(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - - # Subfig Subcap Metric - subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - subcaption_metric.reset() - - # validate one epoch - with torch.no_grad(): - model.eval() - det_boxes = [] - det_labels = [] - det_scores = [] - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - - # accumulate results as coco format - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() - det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 - true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - - # accumulate results as subfig-subcap format - cpu_caption = caption.cpu() - ls_caption = [valSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens - # - filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) - # - ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) - # - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] - ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] - for i in range(image.shape[0]): - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens.append(pred_tokens) - filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens.append(gt_tokens) - subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - - gold_subfig_num = 0 - gold_subcap_num = 0 - for subfigs in true_boxes: - gold_subfig_num += len(subfigs) - for subcaps in true_boxes: - gold_subcap_num += len(subcaps) - print('evaluate on %d compound figures, total %d gold subfigs, %d gold subcaps' % (len(valSet), gold_subfig_num, gold_subcap_num)) - - - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) - print(out_str) - f1, rcl, prec = subcaption_metric.get_metric(reset=True) - out_str = "f1:%.3f recall:%.3f precsision:%.3f" % (mAP, rcl, prec) - print(out_str) - return f1, rcl, prec, mAP, recall, precision +# def evaluate(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): + +# # Subfig Subcap Metric +# subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) +# subcaption_metric.reset() + +# # validate one epoch +# with torch.no_grad(): +# model.eval() +# det_boxes = [] +# det_labels = [] +# det_scores = [] +# true_boxes = [] +# true_labels = [] +# true_difficulties = [] +# for batch in tqdm(valLoader): +# image = batch['image'].cuda() # (bs, 3, max_w, max_h) +# caption = batch['caption'].cuda() # (bs, max_l) +# subfigures = batch['subfigs'] +# output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) +# cpu_output_box = output_box.cpu() +# cpu_output_sim = output_sim.cpu() +# cpu_output_det_class = output_det_class.cpu() + +# # accumulate results as coco format +# filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False +# for i in range(filter_index.shape[0]): +# det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] +# # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() +# det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] +# det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 +# true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] +# true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 +# true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros + +# # accumulate results as subfig-subcap format +# cpu_caption = caption.cpu() +# ls_caption = [valSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens +# # +# filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False +# ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) +# # +# ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) +# # +# index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) +# ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] +# ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] +# for i in range(image.shape[0]): +# filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False +# pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption +# ls_pred_tokens.append(pred_tokens) +# filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False +# gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption +# ls_gt_tokens.append(gt_tokens) +# subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, +# gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) + +# gold_subfig_num = 0 +# gold_subcap_num = 0 +# for subfigs in true_boxes: +# gold_subfig_num += len(subfigs) +# for subcaps in true_boxes: +# gold_subcap_num += len(subcaps) +# print('evaluate on %d compound figures, total %d gold subfigs, %d gold subcaps' % (len(valSet), gold_subfig_num, gold_subcap_num)) + + +# mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) +# out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) +# print(out_str) +# f1, rcl, prec = subcaption_metric.get_metric(reset=True) +# out_str = "f1:%.3f recall:%.3f precsision:%.3f" % (mAP, rcl, prec) +# print(out_str) +# return f1, rcl, prec, mAP, recall, precision -# Evaluate det and align on the dataset -def evaluate_det(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5): - # validate one epoch - with torch.no_grad(): - model.eval() - det_boxes = [] - det_labels = [] - det_scores = [] - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - # cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - - # accumulate results as coco format - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() - det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 - true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - - gold_subfig_num = 0 - for subfigs in true_boxes: - gold_subfig_num += len(subfigs) - print('evaluate on %d compound figures, total %d gold subfigs' % (len(valSet), gold_subfig_num)) - - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) - print(out_str) - - return mAP, recall, precision +# # Evaluate det and align on the dataset +# def evaluate_det(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5): +# # validate one epoch +# with torch.no_grad(): +# model.eval() +# det_boxes = [] +# det_labels = [] +# det_scores = [] +# true_boxes = [] +# true_labels = [] +# true_difficulties = [] +# for batch in tqdm(valLoader): +# image = batch['image'].cuda() # (bs, 3, max_w, max_h) +# caption = batch['caption'].cuda() # (bs, max_l) +# subfigures = batch['subfigs'] +# output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) +# cpu_output_box = output_box.cpu() +# # cpu_output_sim = output_sim.cpu() +# cpu_output_det_class = output_det_class.cpu() + +# # accumulate results as coco format +# filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False +# for i in range(filter_index.shape[0]): +# det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] +# # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() +# det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] +# det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 +# true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] +# true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 +# true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros + +# gold_subfig_num = 0 +# for subfigs in true_boxes: +# gold_subfig_num += len(subfigs) +# print('evaluate on %d compound figures, total %d gold subfigs' % (len(valSet), gold_subfig_num)) + +# mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) +# out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) +# print(out_str) + +# return mAP, recall, precision # Separation compound figures def separation(model, valLoader, save_path='./Segmentation', rcd_file='./Segmentation/separation.jsonl', score_threshold=0.75, nms_threshold=0.4): @@ -301,40 +301,40 @@ def separation(model, valLoader, save_path='./Segmentation', rcd_file='./Segment f.close() # grid search align -def grid_search(config, model, Set, Loader): - # 测试不同的confidence score,在recall和precision之间平衡 - for score_th in np.arange(0.3, 1.0, 0.05): - config.score_threshold = score_th - f1, rcl, prec, mAP, recall, precision = evaluate(model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f f1:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision, f1, rcl, prec) - print(out_str) - if config.rcd_file: - with open(config.rcd_file, 'a') as f: - f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) - f.write('Results: mAP--%.3f recall--%.3f precision--%.3f f1--%.3f recall--%.3f precision--%.3f\n' % (mAP, recall, precision, f1, rcl, prec)) - f.write('\n\n') - f.close() +# def grid_search(config, model, Set, Loader): +# # 测试不同的confidence score,在recall和precision之间平衡 +# for score_th in np.arange(0.3, 1.0, 0.05): +# config.score_threshold = score_th +# f1, rcl, prec, mAP, recall, precision = evaluate(model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) +# out_str = "mAP:%.3f recall:%.3f precsision:%.3f f1:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision, f1, rcl, prec) +# print(out_str) +# if config.rcd_file: +# with open(config.rcd_file, 'a') as f: +# f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) +# f.write('Results: mAP--%.3f recall--%.3f precision--%.3f f1--%.3f recall--%.3f precision--%.3f\n' % (mAP, recall, precision, f1, rcl, prec)) +# f.write('\n\n') +# f.close() - if config.vis_path: - inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) - -# grid search detection -def grid_search_det(config, model, Set, Loader): - # 测试不同的confidence score,在recall和precision之间平衡 - for score_th in np.arange(0.3, 1.0, 0.05): - config.score_threshold = score_th - mAP, recall, precision = evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) - print(out_str) - if config.rcd_file: - with open(config.rcd_file, 'a') as f: - f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) - f.write('Results: mAP--%.3f recall--%.3f precision--%.3f' % (mAP, recall, precision)) - f.write('\n\n') - f.close() - # the inference function should be simplified for det only - if config.vis_path: - inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) +# if config.vis_path: +# inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) + +# # grid search detection +# def grid_search_det(config, model, Set, Loader): +# # 测试不同的confidence score,在recall和precision之间平衡 +# for score_th in np.arange(0.3, 1.0, 0.05): +# config.score_threshold = score_th +# mAP, recall, precision = evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) +# out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) +# print(out_str) +# if config.rcd_file: +# with open(config.rcd_file, 'a') as f: +# f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) +# f.write('Results: mAP--%.3f recall--%.3f precision--%.3f' % (mAP, recall, precision)) +# f.write('\n\n') +# f.close() +# # the inference function should be simplified for det only +# if config.vis_path: +# inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) def str2bool(v): @@ -401,17 +401,17 @@ def get_eval_args_parser(): def prepare_model_and_dataset(config): torch.multiprocessing.set_sharing_strategy('file_system') - vocab_file = 'path to bert vocab.txt, needed to tokenize compound caption; not necessary for subfigure separation' + # vocab_file = 'path to bert vocab.txt, needed to tokenize compound caption; not necessary for subfigure separation' - if 'det' in config.task: - Set = Fig_Dataset(None, config.eval_file, config.img_root, vocab_file, config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_collate) + # if 'det' in config.task: + # Set = Fig_Dataset(None, config.eval_file, config.img_root, vocab_file, config.normalization) + # Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_collate) if 'sep' in config.task: Set = Fig_Separation_Dataset(None, config.eval_file, config.img_root, config.normalization) Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_separation_collate) - else: - Set = FigCap_Dataset(None, config.eval_file, config.img_root, vocab_file, normalization=config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=figcap_collate) + # else: + # Set = FigCap_Dataset(None, config.eval_file, config.img_root, vocab_file, normalization=config.normalization) + # Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=figcap_collate) if config.model == 'baseline': # export PYTHONPATH=/fs01/home/afallah/pmc-data-extraction:$PYTHONPATH @@ -460,15 +460,15 @@ def prepare_model_and_dataset(config): if __name__ == '__main__': config = get_eval_args_parser() model, Set, Loader = prepare_model_and_dataset(config) - if config.task == 'det': - evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) - elif config.task == 'det_grid_search': - grid_search_det(config, model, Set, Loader) - elif config.task == 'align': - evaluate(config, model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) - elif config.task == 'align_grid_search': - grid_search(config, model, Set, Loader) - elif config.task == "sep": + # if config.task == 'det': + # evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) + # elif config.task == 'det_grid_search': + # grid_search_det(config, model, Set, Loader) + # elif config.task == 'align': + # evaluate(config, model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) + # elif config.task == 'align_grid_search': + # grid_search(config, model, Set, Loader) + if config.task == "sep": separation(model, Loader, config.save_path, config.rcd_file, config.score_threshold, nms_threshold=0.4) else: print('Undefined Evaluation Task') \ No newline at end of file From 1f4b0f6a87f43d96e0d632e86ef9d2f0451f87f0 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 7 Oct 2024 16:07:52 -0400 Subject: [PATCH 17/62] Move files to granular directory. --- openpmcvl/{models => granular}/__init__.py | 0 openpmcvl/{pipeline => granular/models}/__init__.py | 0 openpmcvl/{ => granular}/models/subfigure_detector.py | 2 +- openpmcvl/{ => granular}/models/transformer_module.py | 0 openpmcvl/{process => granular/pipeline}/__init__.py | 0 openpmcvl/{ => granular}/pipeline/align.py | 2 +- openpmcvl/{ => granular}/pipeline/align.sh | 0 openpmcvl/{ => granular}/pipeline/subcaption.py | 0 openpmcvl/{ => granular}/pipeline/subcaption.sh | 0 openpmcvl/{ => granular}/pipeline/subfigure.py | 6 +++--- openpmcvl/{ => granular}/pipeline/subfigure.sh | 0 openpmcvl/{ => granular}/process/GPTsubcap_postprocess.py | 0 openpmcvl/{ => granular}/process/LICENSE | 0 openpmcvl/{ => granular}/process/README.md | 0 .../{process/subfigure_ocr => granular/process}/__init__.py | 0 openpmcvl/{ => granular}/process/align_metric.py | 0 .../process/augmentation_parameters/color.jsonl | 0 .../process/augmentation_parameters/flip.jsonl | 0 .../process/augmentation_parameters/flip_color.jsonl | 0 .../process/augmentation_parameters/flip_color_grey.jsonl | 0 .../flip_color_grey_noise_blur.jsonl | 0 openpmcvl/{ => granular}/process/augmentation_tools.py | 0 .../process/chatgpt_subcaptions/chatgpt_subcaption.py | 0 openpmcvl/{ => granular}/process/data_preprocess.py | 0 openpmcvl/{ => granular}/process/dataset_clip_align.py | 0 openpmcvl/{ => granular}/process/dataset_det_align.py | 0 openpmcvl/{ => granular}/process/dataset_exsclaim.py | 0 openpmcvl/{ => granular}/process/detect_metric.py | 0 openpmcvl/{ => granular}/process/detr_code/backbone.py | 0 openpmcvl/{ => granular}/process/detr_code/detr.py | 0 openpmcvl/{ => granular}/process/detr_code/matcher.py | 0 openpmcvl/{ => granular}/process/detr_code/misc.py | 0 .../{ => granular}/process/detr_code/position_encoding.py | 0 openpmcvl/{ => granular}/process/detr_code/segmentation.py | 0 openpmcvl/{ => granular}/process/detr_code/transformer.py | 0 openpmcvl/{ => granular}/process/inference.py | 0 openpmcvl/{ => granular}/process/inference_clip_align.py | 0 openpmcvl/{ => granular}/process/inference_detect_align.py | 0 openpmcvl/{ => granular}/process/model_clip_align.py | 0 openpmcvl/{ => granular}/process/model_det_align.py | 0 openpmcvl/{ => granular}/process/playground.ipynb | 0 .../process/playground_inference_detect_align.py | 0 .../{ => granular}/process/playground_subfigure_ocr.py | 0 openpmcvl/{ => granular}/process/pmc_oa.py | 0 .../{ => granular}/process/sh_files/search_bert_layers.sh | 0 .../{ => granular}/process/sh_files/search_threshold.sh | 0 openpmcvl/{ => granular}/process/subcaption.ipynb | 0 openpmcvl/{ => granular}/process/subfigure.ipynb | 0 openpmcvl/{ => granular}/process/subfigure_classify.py | 0 openpmcvl/{ => granular}/process/subfigure_label.ipynb | 0 openpmcvl/{ => granular}/process/subfigure_ocr.py | 0 .../models => granular/process/subfigure_ocr}/__init__.py | 0 .../process/subfigure_ocr/config/scale_label_reader.json | 0 .../process/subfigure_ocr/config/yolov3_default_master.cfg | 0 .../process/subfigure_ocr/config/yolov3_default_subfig.cfg | 0 .../process/subfigure_ocr/models}/__init__.py | 0 .../{ => granular}/process/subfigure_ocr/models/crnn.py | 0 .../{ => granular}/process/subfigure_ocr/models/network.py | 0 .../process/subfigure_ocr/models/yolo_layer.py | 0 .../{ => granular}/process/subfigure_ocr/models/yolov3.py | 0 .../process/subfigure_ocr/scale}/__init__.py | 0 .../{ => granular}/process/subfigure_ocr/scale/coco_eval.py | 0 .../process/subfigure_ocr/scale/coco_utils.py | 0 .../{ => granular}/process/subfigure_ocr/scale/corpus.txt | 0 openpmcvl/{ => granular}/process/subfigure_ocr/scale/ctc.py | 0 .../{ => granular}/process/subfigure_ocr/scale/dataset.py | 0 .../{ => granular}/process/subfigure_ocr/scale/engine.py | 0 .../process/subfigure_ocr/scale/evaluate_scale.py | 0 .../process/subfigure_ocr/scale/label_reader_test.py | 0 openpmcvl/{ => granular}/process/subfigure_ocr/scale/lm.py | 0 .../{ => granular}/process/subfigure_ocr/scale/process.py | 0 .../process/subfigure_ocr/scale/scale_bar_model.py | 0 .../process/subfigure_ocr/scale/train_label_reader.py | 0 .../{ => granular}/process/subfigure_ocr/scale/utils.py | 0 .../process/subfigure_ocr/separator}/__init__.py | 0 .../process/subfigure_ocr/separator/process.py | 0 openpmcvl/{ => granular}/process/train_clip_align.py | 0 openpmcvl/{ => granular}/process/train_detect_align.py | 0 openpmcvl/{ => granular}/process/train_engine.py | 0 openpmcvl/{ => granular}/process/transformer_module.py | 0 openpmcvl/{ => granular}/process/visualization_tools.py | 0 openpmcvl/{utils => granular/prompts}/__init__.py | 0 .../{ => granular}/prompts/subcaption_system_prompt.txt | 0 openpmcvl/granular/utils/__init__.py | 0 openpmcvl/{ => granular}/utils/clean_by_format.py | 0 openpmcvl/{ => granular}/utils/compute_text_lengths.py | 0 openpmcvl/{ => granular}/utils/compute_text_lengths.slrm | 0 openpmcvl/{ => granular}/utils/create_captions_folder.py | 0 openpmcvl/{ => granular}/utils/dir_or_file.py | 0 openpmcvl/{ => granular}/utils/histogram_text_lengths.ipynb | 0 openpmcvl/{ => granular}/utils/run.slrm | 0 openpmcvl/{ => granular}/utils/train_test_split.py | 0 92 files changed, 5 insertions(+), 5 deletions(-) rename openpmcvl/{models => granular}/__init__.py (100%) rename openpmcvl/{pipeline => granular/models}/__init__.py (100%) rename openpmcvl/{ => granular}/models/subfigure_detector.py (99%) rename openpmcvl/{ => granular}/models/transformer_module.py (100%) rename openpmcvl/{process => granular/pipeline}/__init__.py (100%) rename openpmcvl/{ => granular}/pipeline/align.py (97%) rename openpmcvl/{ => granular}/pipeline/align.sh (100%) rename openpmcvl/{ => granular}/pipeline/subcaption.py (100%) rename openpmcvl/{ => granular}/pipeline/subcaption.sh (100%) rename openpmcvl/{ => granular}/pipeline/subfigure.py (98%) rename openpmcvl/{ => granular}/pipeline/subfigure.sh (100%) rename openpmcvl/{ => granular}/process/GPTsubcap_postprocess.py (100%) rename openpmcvl/{ => granular}/process/LICENSE (100%) rename openpmcvl/{ => granular}/process/README.md (100%) rename openpmcvl/{process/subfigure_ocr => granular/process}/__init__.py (100%) rename openpmcvl/{ => granular}/process/align_metric.py (100%) rename openpmcvl/{ => granular}/process/augmentation_parameters/color.jsonl (100%) rename openpmcvl/{ => granular}/process/augmentation_parameters/flip.jsonl (100%) rename openpmcvl/{ => granular}/process/augmentation_parameters/flip_color.jsonl (100%) rename openpmcvl/{ => granular}/process/augmentation_parameters/flip_color_grey.jsonl (100%) rename openpmcvl/{ => granular}/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl (100%) rename openpmcvl/{ => granular}/process/augmentation_tools.py (100%) rename openpmcvl/{ => granular}/process/chatgpt_subcaptions/chatgpt_subcaption.py (100%) rename openpmcvl/{ => granular}/process/data_preprocess.py (100%) rename openpmcvl/{ => granular}/process/dataset_clip_align.py (100%) rename openpmcvl/{ => granular}/process/dataset_det_align.py (100%) rename openpmcvl/{ => granular}/process/dataset_exsclaim.py (100%) rename openpmcvl/{ => granular}/process/detect_metric.py (100%) rename openpmcvl/{ => granular}/process/detr_code/backbone.py (100%) rename openpmcvl/{ => granular}/process/detr_code/detr.py (100%) rename openpmcvl/{ => granular}/process/detr_code/matcher.py (100%) rename openpmcvl/{ => granular}/process/detr_code/misc.py (100%) rename openpmcvl/{ => granular}/process/detr_code/position_encoding.py (100%) rename openpmcvl/{ => granular}/process/detr_code/segmentation.py (100%) rename openpmcvl/{ => granular}/process/detr_code/transformer.py (100%) rename openpmcvl/{ => granular}/process/inference.py (100%) rename openpmcvl/{ => granular}/process/inference_clip_align.py (100%) rename openpmcvl/{ => granular}/process/inference_detect_align.py (100%) rename openpmcvl/{ => granular}/process/model_clip_align.py (100%) rename openpmcvl/{ => granular}/process/model_det_align.py (100%) rename openpmcvl/{ => granular}/process/playground.ipynb (100%) rename openpmcvl/{ => granular}/process/playground_inference_detect_align.py (100%) rename openpmcvl/{ => granular}/process/playground_subfigure_ocr.py (100%) rename openpmcvl/{ => granular}/process/pmc_oa.py (100%) rename openpmcvl/{ => granular}/process/sh_files/search_bert_layers.sh (100%) rename openpmcvl/{ => granular}/process/sh_files/search_threshold.sh (100%) rename openpmcvl/{ => granular}/process/subcaption.ipynb (100%) rename openpmcvl/{ => granular}/process/subfigure.ipynb (100%) rename openpmcvl/{ => granular}/process/subfigure_classify.py (100%) rename openpmcvl/{ => granular}/process/subfigure_label.ipynb (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr.py (100%) rename openpmcvl/{process/subfigure_ocr/models => granular/process/subfigure_ocr}/__init__.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/config/scale_label_reader.json (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/config/yolov3_default_master.cfg (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/config/yolov3_default_subfig.cfg (100%) rename openpmcvl/{process/subfigure_ocr/scale => granular/process/subfigure_ocr/models}/__init__.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/models/crnn.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/models/network.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/models/yolo_layer.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/models/yolov3.py (100%) rename openpmcvl/{process/subfigure_ocr/separator => granular/process/subfigure_ocr/scale}/__init__.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/coco_eval.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/coco_utils.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/corpus.txt (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/ctc.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/dataset.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/engine.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/evaluate_scale.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/label_reader_test.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/lm.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/process.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/scale_bar_model.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/train_label_reader.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/scale/utils.py (100%) rename openpmcvl/{prompts => granular/process/subfigure_ocr/separator}/__init__.py (100%) rename openpmcvl/{ => granular}/process/subfigure_ocr/separator/process.py (100%) rename openpmcvl/{ => granular}/process/train_clip_align.py (100%) rename openpmcvl/{ => granular}/process/train_detect_align.py (100%) rename openpmcvl/{ => granular}/process/train_engine.py (100%) rename openpmcvl/{ => granular}/process/transformer_module.py (100%) rename openpmcvl/{ => granular}/process/visualization_tools.py (100%) rename openpmcvl/{utils => granular/prompts}/__init__.py (100%) rename openpmcvl/{ => granular}/prompts/subcaption_system_prompt.txt (100%) create mode 100644 openpmcvl/granular/utils/__init__.py rename openpmcvl/{ => granular}/utils/clean_by_format.py (100%) rename openpmcvl/{ => granular}/utils/compute_text_lengths.py (100%) rename openpmcvl/{ => granular}/utils/compute_text_lengths.slrm (100%) rename openpmcvl/{ => granular}/utils/create_captions_folder.py (100%) rename openpmcvl/{ => granular}/utils/dir_or_file.py (100%) rename openpmcvl/{ => granular}/utils/histogram_text_lengths.ipynb (100%) rename openpmcvl/{ => granular}/utils/run.slrm (100%) rename openpmcvl/{ => granular}/utils/train_test_split.py (100%) diff --git a/openpmcvl/models/__init__.py b/openpmcvl/granular/__init__.py similarity index 100% rename from openpmcvl/models/__init__.py rename to openpmcvl/granular/__init__.py diff --git a/openpmcvl/pipeline/__init__.py b/openpmcvl/granular/models/__init__.py similarity index 100% rename from openpmcvl/pipeline/__init__.py rename to openpmcvl/granular/models/__init__.py diff --git a/openpmcvl/models/subfigure_detector.py b/openpmcvl/granular/models/subfigure_detector.py similarity index 99% rename from openpmcvl/models/subfigure_detector.py rename to openpmcvl/granular/models/subfigure_detector.py index 8eb60e7..40fddfd 100644 --- a/openpmcvl/models/subfigure_detector.py +++ b/openpmcvl/granular/models/subfigure_detector.py @@ -6,7 +6,7 @@ from torchvision import models, transforms import math # from torchsummary import summary -from openpmcvl.models.transformer_module import * +from openpmcvl.granular.models.transformer_module import * from einops import repeat diff --git a/openpmcvl/models/transformer_module.py b/openpmcvl/granular/models/transformer_module.py similarity index 100% rename from openpmcvl/models/transformer_module.py rename to openpmcvl/granular/models/transformer_module.py diff --git a/openpmcvl/process/__init__.py b/openpmcvl/granular/pipeline/__init__.py similarity index 100% rename from openpmcvl/process/__init__.py rename to openpmcvl/granular/pipeline/__init__.py diff --git a/openpmcvl/pipeline/align.py b/openpmcvl/granular/pipeline/align.py similarity index 97% rename from openpmcvl/pipeline/align.py rename to openpmcvl/granular/pipeline/align.py index 82fa22b..754d9ed 100644 --- a/openpmcvl/pipeline/align.py +++ b/openpmcvl/granular/pipeline/align.py @@ -4,7 +4,7 @@ from typing import List, Dict, Union from tqdm import tqdm -from openpmcvl.process.playground_subfigure_ocr import classifier +from openpmcvl.granular.process.playground_subfigure_ocr import classifier def load_dataset(file_path: str) -> List[Dict]: diff --git a/openpmcvl/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh similarity index 100% rename from openpmcvl/pipeline/align.sh rename to openpmcvl/granular/pipeline/align.sh diff --git a/openpmcvl/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py similarity index 100% rename from openpmcvl/pipeline/subcaption.py rename to openpmcvl/granular/pipeline/subcaption.py diff --git a/openpmcvl/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh similarity index 100% rename from openpmcvl/pipeline/subcaption.sh rename to openpmcvl/granular/pipeline/subcaption.sh diff --git a/openpmcvl/pipeline/subfigure.py b/openpmcvl/granular/pipeline/subfigure.py similarity index 98% rename from openpmcvl/pipeline/subfigure.py rename to openpmcvl/granular/pipeline/subfigure.py index 53519bd..06713c4 100644 --- a/openpmcvl/pipeline/subfigure.py +++ b/openpmcvl/granular/pipeline/subfigure.py @@ -12,12 +12,12 @@ from torchvision import utils as vutils, models, transforms from PIL import Image -from openpmcvl.process.dataset_det_align import ( +from openpmcvl.granular.process.dataset_det_align import ( Fig_Separation_Dataset, fig_separation_collate, ) -from openpmcvl.models.subfigure_detector import FigCap_Former -from openpmcvl.process.detect_metric import box_cxcywh_to_xyxy, find_jaccard_overlap +from openpmcvl.granular.models.subfigure_detector import FigCap_Former +from openpmcvl.granular.process.detect_metric import box_cxcywh_to_xyxy, find_jaccard_overlap MEDICAL_CLASS = 15 CLASSIFICATION_THRESHOLD = 4 diff --git a/openpmcvl/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh similarity index 100% rename from openpmcvl/pipeline/subfigure.sh rename to openpmcvl/granular/pipeline/subfigure.sh diff --git a/openpmcvl/process/GPTsubcap_postprocess.py b/openpmcvl/granular/process/GPTsubcap_postprocess.py similarity index 100% rename from openpmcvl/process/GPTsubcap_postprocess.py rename to openpmcvl/granular/process/GPTsubcap_postprocess.py diff --git a/openpmcvl/process/LICENSE b/openpmcvl/granular/process/LICENSE similarity index 100% rename from openpmcvl/process/LICENSE rename to openpmcvl/granular/process/LICENSE diff --git a/openpmcvl/process/README.md b/openpmcvl/granular/process/README.md similarity index 100% rename from openpmcvl/process/README.md rename to openpmcvl/granular/process/README.md diff --git a/openpmcvl/process/subfigure_ocr/__init__.py b/openpmcvl/granular/process/__init__.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/__init__.py rename to openpmcvl/granular/process/__init__.py diff --git a/openpmcvl/process/align_metric.py b/openpmcvl/granular/process/align_metric.py similarity index 100% rename from openpmcvl/process/align_metric.py rename to openpmcvl/granular/process/align_metric.py diff --git a/openpmcvl/process/augmentation_parameters/color.jsonl b/openpmcvl/granular/process/augmentation_parameters/color.jsonl similarity index 100% rename from openpmcvl/process/augmentation_parameters/color.jsonl rename to openpmcvl/granular/process/augmentation_parameters/color.jsonl diff --git a/openpmcvl/process/augmentation_parameters/flip.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip.jsonl similarity index 100% rename from openpmcvl/process/augmentation_parameters/flip.jsonl rename to openpmcvl/granular/process/augmentation_parameters/flip.jsonl diff --git a/openpmcvl/process/augmentation_parameters/flip_color.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip_color.jsonl similarity index 100% rename from openpmcvl/process/augmentation_parameters/flip_color.jsonl rename to openpmcvl/granular/process/augmentation_parameters/flip_color.jsonl diff --git a/openpmcvl/process/augmentation_parameters/flip_color_grey.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip_color_grey.jsonl similarity index 100% rename from openpmcvl/process/augmentation_parameters/flip_color_grey.jsonl rename to openpmcvl/granular/process/augmentation_parameters/flip_color_grey.jsonl diff --git a/openpmcvl/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl similarity index 100% rename from openpmcvl/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl rename to openpmcvl/granular/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl diff --git a/openpmcvl/process/augmentation_tools.py b/openpmcvl/granular/process/augmentation_tools.py similarity index 100% rename from openpmcvl/process/augmentation_tools.py rename to openpmcvl/granular/process/augmentation_tools.py diff --git a/openpmcvl/process/chatgpt_subcaptions/chatgpt_subcaption.py b/openpmcvl/granular/process/chatgpt_subcaptions/chatgpt_subcaption.py similarity index 100% rename from openpmcvl/process/chatgpt_subcaptions/chatgpt_subcaption.py rename to openpmcvl/granular/process/chatgpt_subcaptions/chatgpt_subcaption.py diff --git a/openpmcvl/process/data_preprocess.py b/openpmcvl/granular/process/data_preprocess.py similarity index 100% rename from openpmcvl/process/data_preprocess.py rename to openpmcvl/granular/process/data_preprocess.py diff --git a/openpmcvl/process/dataset_clip_align.py b/openpmcvl/granular/process/dataset_clip_align.py similarity index 100% rename from openpmcvl/process/dataset_clip_align.py rename to openpmcvl/granular/process/dataset_clip_align.py diff --git a/openpmcvl/process/dataset_det_align.py b/openpmcvl/granular/process/dataset_det_align.py similarity index 100% rename from openpmcvl/process/dataset_det_align.py rename to openpmcvl/granular/process/dataset_det_align.py diff --git a/openpmcvl/process/dataset_exsclaim.py b/openpmcvl/granular/process/dataset_exsclaim.py similarity index 100% rename from openpmcvl/process/dataset_exsclaim.py rename to openpmcvl/granular/process/dataset_exsclaim.py diff --git a/openpmcvl/process/detect_metric.py b/openpmcvl/granular/process/detect_metric.py similarity index 100% rename from openpmcvl/process/detect_metric.py rename to openpmcvl/granular/process/detect_metric.py diff --git a/openpmcvl/process/detr_code/backbone.py b/openpmcvl/granular/process/detr_code/backbone.py similarity index 100% rename from openpmcvl/process/detr_code/backbone.py rename to openpmcvl/granular/process/detr_code/backbone.py diff --git a/openpmcvl/process/detr_code/detr.py b/openpmcvl/granular/process/detr_code/detr.py similarity index 100% rename from openpmcvl/process/detr_code/detr.py rename to openpmcvl/granular/process/detr_code/detr.py diff --git a/openpmcvl/process/detr_code/matcher.py b/openpmcvl/granular/process/detr_code/matcher.py similarity index 100% rename from openpmcvl/process/detr_code/matcher.py rename to openpmcvl/granular/process/detr_code/matcher.py diff --git a/openpmcvl/process/detr_code/misc.py b/openpmcvl/granular/process/detr_code/misc.py similarity index 100% rename from openpmcvl/process/detr_code/misc.py rename to openpmcvl/granular/process/detr_code/misc.py diff --git a/openpmcvl/process/detr_code/position_encoding.py b/openpmcvl/granular/process/detr_code/position_encoding.py similarity index 100% rename from openpmcvl/process/detr_code/position_encoding.py rename to openpmcvl/granular/process/detr_code/position_encoding.py diff --git a/openpmcvl/process/detr_code/segmentation.py b/openpmcvl/granular/process/detr_code/segmentation.py similarity index 100% rename from openpmcvl/process/detr_code/segmentation.py rename to openpmcvl/granular/process/detr_code/segmentation.py diff --git a/openpmcvl/process/detr_code/transformer.py b/openpmcvl/granular/process/detr_code/transformer.py similarity index 100% rename from openpmcvl/process/detr_code/transformer.py rename to openpmcvl/granular/process/detr_code/transformer.py diff --git a/openpmcvl/process/inference.py b/openpmcvl/granular/process/inference.py similarity index 100% rename from openpmcvl/process/inference.py rename to openpmcvl/granular/process/inference.py diff --git a/openpmcvl/process/inference_clip_align.py b/openpmcvl/granular/process/inference_clip_align.py similarity index 100% rename from openpmcvl/process/inference_clip_align.py rename to openpmcvl/granular/process/inference_clip_align.py diff --git a/openpmcvl/process/inference_detect_align.py b/openpmcvl/granular/process/inference_detect_align.py similarity index 100% rename from openpmcvl/process/inference_detect_align.py rename to openpmcvl/granular/process/inference_detect_align.py diff --git a/openpmcvl/process/model_clip_align.py b/openpmcvl/granular/process/model_clip_align.py similarity index 100% rename from openpmcvl/process/model_clip_align.py rename to openpmcvl/granular/process/model_clip_align.py diff --git a/openpmcvl/process/model_det_align.py b/openpmcvl/granular/process/model_det_align.py similarity index 100% rename from openpmcvl/process/model_det_align.py rename to openpmcvl/granular/process/model_det_align.py diff --git a/openpmcvl/process/playground.ipynb b/openpmcvl/granular/process/playground.ipynb similarity index 100% rename from openpmcvl/process/playground.ipynb rename to openpmcvl/granular/process/playground.ipynb diff --git a/openpmcvl/process/playground_inference_detect_align.py b/openpmcvl/granular/process/playground_inference_detect_align.py similarity index 100% rename from openpmcvl/process/playground_inference_detect_align.py rename to openpmcvl/granular/process/playground_inference_detect_align.py diff --git a/openpmcvl/process/playground_subfigure_ocr.py b/openpmcvl/granular/process/playground_subfigure_ocr.py similarity index 100% rename from openpmcvl/process/playground_subfigure_ocr.py rename to openpmcvl/granular/process/playground_subfigure_ocr.py diff --git a/openpmcvl/process/pmc_oa.py b/openpmcvl/granular/process/pmc_oa.py similarity index 100% rename from openpmcvl/process/pmc_oa.py rename to openpmcvl/granular/process/pmc_oa.py diff --git a/openpmcvl/process/sh_files/search_bert_layers.sh b/openpmcvl/granular/process/sh_files/search_bert_layers.sh similarity index 100% rename from openpmcvl/process/sh_files/search_bert_layers.sh rename to openpmcvl/granular/process/sh_files/search_bert_layers.sh diff --git a/openpmcvl/process/sh_files/search_threshold.sh b/openpmcvl/granular/process/sh_files/search_threshold.sh similarity index 100% rename from openpmcvl/process/sh_files/search_threshold.sh rename to openpmcvl/granular/process/sh_files/search_threshold.sh diff --git a/openpmcvl/process/subcaption.ipynb b/openpmcvl/granular/process/subcaption.ipynb similarity index 100% rename from openpmcvl/process/subcaption.ipynb rename to openpmcvl/granular/process/subcaption.ipynb diff --git a/openpmcvl/process/subfigure.ipynb b/openpmcvl/granular/process/subfigure.ipynb similarity index 100% rename from openpmcvl/process/subfigure.ipynb rename to openpmcvl/granular/process/subfigure.ipynb diff --git a/openpmcvl/process/subfigure_classify.py b/openpmcvl/granular/process/subfigure_classify.py similarity index 100% rename from openpmcvl/process/subfigure_classify.py rename to openpmcvl/granular/process/subfigure_classify.py diff --git a/openpmcvl/process/subfigure_label.ipynb b/openpmcvl/granular/process/subfigure_label.ipynb similarity index 100% rename from openpmcvl/process/subfigure_label.ipynb rename to openpmcvl/granular/process/subfigure_label.ipynb diff --git a/openpmcvl/process/subfigure_ocr.py b/openpmcvl/granular/process/subfigure_ocr.py similarity index 100% rename from openpmcvl/process/subfigure_ocr.py rename to openpmcvl/granular/process/subfigure_ocr.py diff --git a/openpmcvl/process/subfigure_ocr/models/__init__.py b/openpmcvl/granular/process/subfigure_ocr/__init__.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/models/__init__.py rename to openpmcvl/granular/process/subfigure_ocr/__init__.py diff --git a/openpmcvl/process/subfigure_ocr/config/scale_label_reader.json b/openpmcvl/granular/process/subfigure_ocr/config/scale_label_reader.json similarity index 100% rename from openpmcvl/process/subfigure_ocr/config/scale_label_reader.json rename to openpmcvl/granular/process/subfigure_ocr/config/scale_label_reader.json diff --git a/openpmcvl/process/subfigure_ocr/config/yolov3_default_master.cfg b/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_master.cfg similarity index 100% rename from openpmcvl/process/subfigure_ocr/config/yolov3_default_master.cfg rename to openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_master.cfg diff --git a/openpmcvl/process/subfigure_ocr/config/yolov3_default_subfig.cfg b/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_subfig.cfg similarity index 100% rename from openpmcvl/process/subfigure_ocr/config/yolov3_default_subfig.cfg rename to openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_subfig.cfg diff --git a/openpmcvl/process/subfigure_ocr/scale/__init__.py b/openpmcvl/granular/process/subfigure_ocr/models/__init__.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/__init__.py rename to openpmcvl/granular/process/subfigure_ocr/models/__init__.py diff --git a/openpmcvl/process/subfigure_ocr/models/crnn.py b/openpmcvl/granular/process/subfigure_ocr/models/crnn.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/models/crnn.py rename to openpmcvl/granular/process/subfigure_ocr/models/crnn.py diff --git a/openpmcvl/process/subfigure_ocr/models/network.py b/openpmcvl/granular/process/subfigure_ocr/models/network.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/models/network.py rename to openpmcvl/granular/process/subfigure_ocr/models/network.py diff --git a/openpmcvl/process/subfigure_ocr/models/yolo_layer.py b/openpmcvl/granular/process/subfigure_ocr/models/yolo_layer.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/models/yolo_layer.py rename to openpmcvl/granular/process/subfigure_ocr/models/yolo_layer.py diff --git a/openpmcvl/process/subfigure_ocr/models/yolov3.py b/openpmcvl/granular/process/subfigure_ocr/models/yolov3.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/models/yolov3.py rename to openpmcvl/granular/process/subfigure_ocr/models/yolov3.py diff --git a/openpmcvl/process/subfigure_ocr/separator/__init__.py b/openpmcvl/granular/process/subfigure_ocr/scale/__init__.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/separator/__init__.py rename to openpmcvl/granular/process/subfigure_ocr/scale/__init__.py diff --git a/openpmcvl/process/subfigure_ocr/scale/coco_eval.py b/openpmcvl/granular/process/subfigure_ocr/scale/coco_eval.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/coco_eval.py rename to openpmcvl/granular/process/subfigure_ocr/scale/coco_eval.py diff --git a/openpmcvl/process/subfigure_ocr/scale/coco_utils.py b/openpmcvl/granular/process/subfigure_ocr/scale/coco_utils.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/coco_utils.py rename to openpmcvl/granular/process/subfigure_ocr/scale/coco_utils.py diff --git a/openpmcvl/process/subfigure_ocr/scale/corpus.txt b/openpmcvl/granular/process/subfigure_ocr/scale/corpus.txt similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/corpus.txt rename to openpmcvl/granular/process/subfigure_ocr/scale/corpus.txt diff --git a/openpmcvl/process/subfigure_ocr/scale/ctc.py b/openpmcvl/granular/process/subfigure_ocr/scale/ctc.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/ctc.py rename to openpmcvl/granular/process/subfigure_ocr/scale/ctc.py diff --git a/openpmcvl/process/subfigure_ocr/scale/dataset.py b/openpmcvl/granular/process/subfigure_ocr/scale/dataset.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/dataset.py rename to openpmcvl/granular/process/subfigure_ocr/scale/dataset.py diff --git a/openpmcvl/process/subfigure_ocr/scale/engine.py b/openpmcvl/granular/process/subfigure_ocr/scale/engine.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/engine.py rename to openpmcvl/granular/process/subfigure_ocr/scale/engine.py diff --git a/openpmcvl/process/subfigure_ocr/scale/evaluate_scale.py b/openpmcvl/granular/process/subfigure_ocr/scale/evaluate_scale.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/evaluate_scale.py rename to openpmcvl/granular/process/subfigure_ocr/scale/evaluate_scale.py diff --git a/openpmcvl/process/subfigure_ocr/scale/label_reader_test.py b/openpmcvl/granular/process/subfigure_ocr/scale/label_reader_test.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/label_reader_test.py rename to openpmcvl/granular/process/subfigure_ocr/scale/label_reader_test.py diff --git a/openpmcvl/process/subfigure_ocr/scale/lm.py b/openpmcvl/granular/process/subfigure_ocr/scale/lm.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/lm.py rename to openpmcvl/granular/process/subfigure_ocr/scale/lm.py diff --git a/openpmcvl/process/subfigure_ocr/scale/process.py b/openpmcvl/granular/process/subfigure_ocr/scale/process.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/process.py rename to openpmcvl/granular/process/subfigure_ocr/scale/process.py diff --git a/openpmcvl/process/subfigure_ocr/scale/scale_bar_model.py b/openpmcvl/granular/process/subfigure_ocr/scale/scale_bar_model.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/scale_bar_model.py rename to openpmcvl/granular/process/subfigure_ocr/scale/scale_bar_model.py diff --git a/openpmcvl/process/subfigure_ocr/scale/train_label_reader.py b/openpmcvl/granular/process/subfigure_ocr/scale/train_label_reader.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/train_label_reader.py rename to openpmcvl/granular/process/subfigure_ocr/scale/train_label_reader.py diff --git a/openpmcvl/process/subfigure_ocr/scale/utils.py b/openpmcvl/granular/process/subfigure_ocr/scale/utils.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/scale/utils.py rename to openpmcvl/granular/process/subfigure_ocr/scale/utils.py diff --git a/openpmcvl/prompts/__init__.py b/openpmcvl/granular/process/subfigure_ocr/separator/__init__.py similarity index 100% rename from openpmcvl/prompts/__init__.py rename to openpmcvl/granular/process/subfigure_ocr/separator/__init__.py diff --git a/openpmcvl/process/subfigure_ocr/separator/process.py b/openpmcvl/granular/process/subfigure_ocr/separator/process.py similarity index 100% rename from openpmcvl/process/subfigure_ocr/separator/process.py rename to openpmcvl/granular/process/subfigure_ocr/separator/process.py diff --git a/openpmcvl/process/train_clip_align.py b/openpmcvl/granular/process/train_clip_align.py similarity index 100% rename from openpmcvl/process/train_clip_align.py rename to openpmcvl/granular/process/train_clip_align.py diff --git a/openpmcvl/process/train_detect_align.py b/openpmcvl/granular/process/train_detect_align.py similarity index 100% rename from openpmcvl/process/train_detect_align.py rename to openpmcvl/granular/process/train_detect_align.py diff --git a/openpmcvl/process/train_engine.py b/openpmcvl/granular/process/train_engine.py similarity index 100% rename from openpmcvl/process/train_engine.py rename to openpmcvl/granular/process/train_engine.py diff --git a/openpmcvl/process/transformer_module.py b/openpmcvl/granular/process/transformer_module.py similarity index 100% rename from openpmcvl/process/transformer_module.py rename to openpmcvl/granular/process/transformer_module.py diff --git a/openpmcvl/process/visualization_tools.py b/openpmcvl/granular/process/visualization_tools.py similarity index 100% rename from openpmcvl/process/visualization_tools.py rename to openpmcvl/granular/process/visualization_tools.py diff --git a/openpmcvl/utils/__init__.py b/openpmcvl/granular/prompts/__init__.py similarity index 100% rename from openpmcvl/utils/__init__.py rename to openpmcvl/granular/prompts/__init__.py diff --git a/openpmcvl/prompts/subcaption_system_prompt.txt b/openpmcvl/granular/prompts/subcaption_system_prompt.txt similarity index 100% rename from openpmcvl/prompts/subcaption_system_prompt.txt rename to openpmcvl/granular/prompts/subcaption_system_prompt.txt diff --git a/openpmcvl/granular/utils/__init__.py b/openpmcvl/granular/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/utils/clean_by_format.py b/openpmcvl/granular/utils/clean_by_format.py similarity index 100% rename from openpmcvl/utils/clean_by_format.py rename to openpmcvl/granular/utils/clean_by_format.py diff --git a/openpmcvl/utils/compute_text_lengths.py b/openpmcvl/granular/utils/compute_text_lengths.py similarity index 100% rename from openpmcvl/utils/compute_text_lengths.py rename to openpmcvl/granular/utils/compute_text_lengths.py diff --git a/openpmcvl/utils/compute_text_lengths.slrm b/openpmcvl/granular/utils/compute_text_lengths.slrm similarity index 100% rename from openpmcvl/utils/compute_text_lengths.slrm rename to openpmcvl/granular/utils/compute_text_lengths.slrm diff --git a/openpmcvl/utils/create_captions_folder.py b/openpmcvl/granular/utils/create_captions_folder.py similarity index 100% rename from openpmcvl/utils/create_captions_folder.py rename to openpmcvl/granular/utils/create_captions_folder.py diff --git a/openpmcvl/utils/dir_or_file.py b/openpmcvl/granular/utils/dir_or_file.py similarity index 100% rename from openpmcvl/utils/dir_or_file.py rename to openpmcvl/granular/utils/dir_or_file.py diff --git a/openpmcvl/utils/histogram_text_lengths.ipynb b/openpmcvl/granular/utils/histogram_text_lengths.ipynb similarity index 100% rename from openpmcvl/utils/histogram_text_lengths.ipynb rename to openpmcvl/granular/utils/histogram_text_lengths.ipynb diff --git a/openpmcvl/utils/run.slrm b/openpmcvl/granular/utils/run.slrm similarity index 100% rename from openpmcvl/utils/run.slrm rename to openpmcvl/granular/utils/run.slrm diff --git a/openpmcvl/utils/train_test_split.py b/openpmcvl/granular/utils/train_test_split.py similarity index 100% rename from openpmcvl/utils/train_test_split.py rename to openpmcvl/granular/utils/train_test_split.py From 60630bbaffec9c86b6e2630153b92383127b8902 Mon Sep 17 00:00:00 2001 From: afallah Date: Thu, 10 Oct 2024 09:14:14 -0400 Subject: [PATCH 18/62] Add preprocessing pipeline to prepare dataset and filter medical images. --- openpmcvl/granular/pipeline/preprocess.py | 156 ++++++++++++++++++++++ openpmcvl/granular/pipeline/preprocess.sh | 31 +++++ 2 files changed, 187 insertions(+) create mode 100644 openpmcvl/granular/pipeline/preprocess.py create mode 100644 openpmcvl/granular/pipeline/preprocess.sh diff --git a/openpmcvl/granular/pipeline/preprocess.py b/openpmcvl/granular/pipeline/preprocess.py new file mode 100644 index 0000000..261f0dd --- /dev/null +++ b/openpmcvl/granular/pipeline/preprocess.py @@ -0,0 +1,156 @@ +import os +import re +import argparse +from typing import List, Tuple +from tqdm import tqdm + +from PIL import Image +from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl + + +def get_image_dimensions(image_path: str) -> Tuple[int, int]: + """ + Get the width and height of an image. + + Args: + image_path (str): The path to the image file. + + Returns: + Tuple[int, int]: A tuple containing the width and height of the image. + + Raises: + IOError: If the image file cannot be opened or read. + """ + with Image.open(image_path) as img: + return img.size + + +def check_keywords(caption: str, keywords: List[str]) -> Tuple[List[str], bool]: + """ + Check for the presence of keywords in the caption. + + Args: + caption (str): The caption text to search in. + keywords (List[str]): A list of keywords to search for. + + Returns: + Tuple[List[str], bool]: A tuple containing: + - A list of found keywords. + - A boolean indicating whether any keywords were found. + """ + found_keywords = [ + kw + for kw in keywords + if re.search(r"\b" + re.escape(kw) + r"\b", caption, re.IGNORECASE) + ] + return found_keywords, bool(found_keywords) + + +def preprocess_data( + input_files: List[str], output_file: str, figure_root: str, keywords: List[str] +) -> None: + """ + Preprocess the input files and generate the output file. + + Args: + input_files (List[str]): List of input JSONL file paths. + output_file (str): Path to the output JSONL file. + figure_root (str): Root directory for figure images. + keywords (List[str]): List of keywords to search for in captions. + + Returns: + None + + Raises: + IOError: If there are issues reading input files or writing the output file. + """ + processed_data = [] + + for input_file in tqdm(input_files, desc="Processing files"): + data = load_dataset(input_file, num_datapoints=-1) + for item in tqdm(data, desc=f"Processing items in {input_file}", leave=False): + pmc_id = item["PMC_ID"] + media_id = item["media_id"] + image_name = os.path.basename(item["media_url"]) + image_path = f"{figure_root}/{pmc_id}_{media_id}.jpg/{image_name}" + + # Skip if image doesn't exist + if not os.path.exists(image_path): + if image_path.endswith(".jpg"): + print(f"Image not found: {image_path}") + continue + + try: + width, height = get_image_dimensions(image_path) + except Exception as e: + print(f"Error processing image {image_path}: {str(e)}") + continue + + found_keywords, has_keywords = check_keywords(item["caption"], keywords) + + processed_item = { + "id": f"{pmc_id}_{media_id}", + "PMC_ID": pmc_id, + "caption": item["caption"], + "image_path": image_path, + "width": width, + "height": height, + "media_id": media_id, + "media_url": item["media_url"], + "media_name": item["media_name"], + "keywords": found_keywords, + "is_medical": has_keywords, + } + processed_data.append(processed_item) + + save_jsonl(processed_data, output_file) + print(f"Processed data saved to {output_file}") + + +def main(): + """ + Main function to parse arguments and run the preprocessing pipeline. + + Args: + None + + Returns: + None + + Raises: + ArgumentError: If required arguments are missing or invalid. + """ + parser = argparse.ArgumentParser( + description="Preprocess JSONL files for figure caption analysis" + ) + parser.add_argument( + "--input_files", + type=str, + nargs="+", + required=True, + help="List of input JSONL files", + ) + parser.add_argument( + "--output_file", type=str, required=True, help="Path to the output JSONL file" + ) + parser.add_argument( + "--figure_root", + type=str, + required=True, + help="Root directory for figure images", + ) + parser.add_argument( + "--keywords", + type=str, + nargs="+", + default=["CT", "pathology", "radiology"], + help="Keywords to search for in captions", + ) + + args = parser.parse_args() + + preprocess_data(args.input_files, args.output_file, args.figure_root, args.keywords) + + +if __name__ == "__main__": + main() diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh new file mode 100644 index 0000000..f80e643 --- /dev/null +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -0,0 +1,31 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --partition=cpu +#SBATCH --mem=32GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=preprocess +#SBATCH --output=%x-%j.out + +source /h/afallah/light/bin/activate + +cd /h/afallah/pmc-data-extraction + +INPUT_DIR="/datasets/PMC-15M" +OUTPUT_FILE="/datasets/PMC-15M/granular/granular.jsonl" +FIGURE_ROOT="/datasets/PMC-15M/figures" + +# Specify which JSONL files to process (space-separated list of numbers) +JSONL_NUMBERS="0 1" + +# Construct INPUT_FILES string +INPUT_FILES="" +for num in $JSONL_NUMBERS; do + INPUT_FILES+="$INPUT_DIR/$num.jsonl " +done + +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ + --input_files $INPUT_FILES \ + --output_file $OUTPUT_FILE \ + --figure_root $FIGURE_ROOT \ + --keywords CT pathology radiology \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file From cbc76f1ef3a78466c0b45cdaa88c84ea21f58822 Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 11 Oct 2024 21:23:04 -0400 Subject: [PATCH 19/62] Enhance pipeline style. --- openpmcvl/granular/pipeline/align.sh | 6 +- openpmcvl/granular/pipeline/subcaption.py | 92 ++++++++++++----------- openpmcvl/granular/pipeline/subcaption.sh | 4 +- openpmcvl/granular/pipeline/subfigure.py | 36 +++++---- openpmcvl/granular/pipeline/subfigure.sh | 16 ++-- openpmcvl/granular/pipeline/utils.py | 26 +++++++ 6 files changed, 110 insertions(+), 70 deletions(-) create mode 100644 openpmcvl/granular/pipeline/utils.py diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index e912a30..7902d8c 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -11,7 +11,7 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction -stdbuf -oL -eL srun python3 openpmcvl/pipeline/align.py \ - --dataset_path /datasets/PMC-15M/experimental/demo/demo_subfigures.jsonl \ - --save_path /datasets/PMC-15M/experimental/demo/demo_subfigures_labeled.jsonl \ +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ + --dataset_path /datasets/PMC-15M/granular/subfigures2.jsonl \ + --save_path /datasets/PMC-15M/granular/subfigures_labeled2.jsonl \ 2>&1 | tee -a %x-%j.out \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py index d4a4835..0b8e387 100644 --- a/openpmcvl/granular/pipeline/subcaption.py +++ b/openpmcvl/granular/pipeline/subcaption.py @@ -10,26 +10,15 @@ import argparse from sys import stderr from tqdm import tqdm -from typing import List, Dict, Any +from typing import Dict from openai import OpenAI +from openpmcvl.granular.pipeline.utils import load_dataset -def load_dataset(file_path: str) -> List[Dict[str, Any]]: - """ - Load dataset from a JSONL file. - - Args: - file_path (str): Path to the input JSONL file. - - Returns: - List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. - """ - with open(file_path, 'r') as f: - return [json.loads(line) for line in f] - - -def process_caption(client: OpenAI, system_prompt: str, caption: str, model: str, max_tokens: int) -> str: +def process_caption( + client: OpenAI, system_prompt: str, caption: str, model: str, max_tokens: int +) -> str: """ Process a caption using the language model. @@ -44,7 +33,7 @@ def process_caption(client: OpenAI, system_prompt: str, caption: str, model: str str: Processed caption from the language model. """ user_prompt = f"Caption: \n{caption}".strip() - + completion = client.chat.completions.create( model=model, messages=[ @@ -54,7 +43,7 @@ def process_caption(client: OpenAI, system_prompt: str, caption: str, model: str temperature=0, max_tokens=max_tokens, ) - + return completion.choices[0].message.content @@ -68,30 +57,30 @@ def parse_subcaptions(output: str) -> Dict[str, str]: Returns: Dict[str, str]: Dictionary of subcaptions, where keys are subfigure labels and values are subcaptions. """ - lines = output.strip().split('\n') + lines = output.strip().split("\n") if not lines[0].upper().startswith("YES"): - return {"Subfigure-A": '\n'.join(lines)} - + return {"Subfigure-A": "\n".join(lines)} + subcaptions = {} current_key = None current_value = [] for line in lines[1:]: # Skip the "YES" line - match = re.match(r'^Subfigure-([A-Za-z]):\s*(.*)', line, re.IGNORECASE) + match = re.match(r"^Subfigure-([A-Za-z]):\s*(.*)", line, re.IGNORECASE) if match: if current_key: - subcaptions[current_key] = ' '.join(current_value).strip() + subcaptions[current_key] = " ".join(current_value).strip() current_key = f"Subfigure-{match.group(1).upper()}" current_value = [match.group(2)] else: if current_key: current_value.append(line) - + if current_key: - subcaptions[current_key] = ' '.join(current_value).strip() - + subcaptions[current_key] = " ".join(current_value).strip() + return subcaptions @@ -104,41 +93,43 @@ def main(args: argparse.Namespace) -> None: """ # Initialize OpenAI client client = OpenAI(base_url=args.base_url, api_key="EMPTY") - + # Load dataset dataset = load_dataset(args.input_file) print(f"\nDataset size: {len(dataset)}") # Load system prompt - with open(args.system_prompt_file, 'r') as f: + with open(args.system_prompt_file, "r") as f: system_prompt = f.read().strip() # Inference loop results = [] - for item in tqdm(dataset, desc="Processing captions", total=len(dataset), file=stderr): - caption = item['caption'] + for item in tqdm( + dataset, desc="Processing captions", total=len(dataset), file=stderr + ): + caption = item["caption"] output = process_caption( client=client, system_prompt=system_prompt, caption=caption, model=args.model, - max_tokens=args.max_tokens + max_tokens=args.max_tokens, ) subcaptions = parse_subcaptions(output) - - item['num_subcaptions'] = len(subcaptions) - item['subcaptions'] = subcaptions - item['llm_output'] = output + + item["num_subcaptions"] = len(subcaptions) + item["subcaptions"] = subcaptions + item["llm_output"] = output results.append(item) - - with open(args.output_file, 'w') as f: + + with open(args.output_file, "w") as f: for item in results: json.dump(item, f) - f.write('\n') - + f.write("\n") + print(f"\nResults saved to {args.output_file}") @@ -147,10 +138,23 @@ def main(args: argparse.Namespace) -> None: parser.add_argument("--input-file", required=True, help="Path to input JSONL file") parser.add_argument("--output-file", required=True, help="Path to output JSON file") - parser.add_argument("--system-prompt-file", required=True, help="Path to system prompt file") - parser.add_argument("--base-url", default="http://gpu010:8080/v1", help="Base URL for OpenAI API") - parser.add_argument("--model", default="/model-weights/Meta-Llama-3.1-8B-Instruct", help="Model directory") - parser.add_argument("--max-tokens", type=int, default=500, help="Maximum number of tokens for API response") - + parser.add_argument( + "--system-prompt-file", required=True, help="Path to system prompt file" + ) + parser.add_argument( + "--base-url", default="http://gpu010:8080/v1", help="Base URL for OpenAI API" + ) + parser.add_argument( + "--model", + default="/model-weights/Meta-Llama-3.1-8B-Instruct", + help="Model directory", + ) + parser.add_argument( + "--max-tokens", + type=int, + default=500, + help="Maximum number of tokens for API response", + ) + args = parser.parse_args() main(args) diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index d0b0d5c..b9c7347 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -10,10 +10,10 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction -stdbuf -oL -eL srun python3 openpmcvl/pipeline/subcaption.py \ +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ - --system-prompt-file openpmcvl/prompts/subcaption_system_prompt.txt \ + --system-prompt-file openpmcvl/granular/prompts/subcaption_system_prompt.txt \ --base-url http://gpu030:8080/v1 \ --model /model-weights/Meta-Llama-3.1-8B-Instruct \ --max-tokens 500 \ diff --git a/openpmcvl/granular/pipeline/subfigure.py b/openpmcvl/granular/pipeline/subfigure.py index 06713c4..2e13efc 100644 --- a/openpmcvl/granular/pipeline/subfigure.py +++ b/openpmcvl/granular/pipeline/subfigure.py @@ -17,7 +17,10 @@ fig_separation_collate, ) from openpmcvl.granular.models.subfigure_detector import FigCap_Former -from openpmcvl.granular.process.detect_metric import box_cxcywh_to_xyxy, find_jaccard_overlap +from openpmcvl.granular.process.detect_metric import ( + box_cxcywh_to_xyxy, + find_jaccard_overlap, +) MEDICAL_CLASS = 15 CLASSIFICATION_THRESHOLD = 4 @@ -186,12 +189,12 @@ def separate_classify_subfigures( try: for batch in tqdm(loader, desc="Separating subfigures", total=len(loader)): image = batch["image"].to(device) - caption = batch["caption"].to(device) + # caption = batch["caption"].to(device) img_ids = batch["image_id"] original_images = batch["original_image"] unpadded_hws = batch["unpadded_hws"] - output_det_class, output_box, _ = model(image, caption) + output_det_class, output_box, _ = model(image, None) cpu_output_box = output_box.cpu() cpu_output_det_class = output_det_class.cpu() @@ -216,15 +219,19 @@ def separate_classify_subfigures( try: subfig_path = f"{save_path}/{img_id}_{subfig_count}.jpg" cx, cy, w, h = bbox - x1, x2 = [ - round((cx - w / 2) * image.shape[3] * scale), - round((cx + w / 2) * image.shape[3] * scale), - ] - y1, y2 = [ - round((cy - h / 2) * image.shape[2] * scale), - round((cy + h / 2) * image.shape[2] * scale), - ] + # Calculate padding in terms of bounding box dimensions + pad_ratio = 0.03 + pad_w = w * pad_ratio + pad_h = h * pad_ratio + + # Adjust the coordinates with padding + x1 = round((cx - w / 2 - pad_w) * image.shape[3] * scale) + x2 = round((cx + w / 2 + pad_w) * image.shape[3] * scale) + y1 = round((cy - h / 2 - pad_h) * image.shape[2] * scale) + y2 = round((cy + h / 2 + pad_h) * image.shape[2] * scale) + + # Ensure the coordinates are within image boundaries x1, x2 = [max(0, min(x, original_w - 1)) for x in [x1, x2]] y1, y2 = [max(0, min(y, original_h - 1)) for y in [y1, y2]] @@ -244,13 +251,16 @@ def separate_classify_subfigures( sorted_pred = torch.argsort( fig_prediction[0].cpu(), descending=True ) - medical_class_rank = (sorted_pred == MEDICAL_CLASS).nonzero().item() - is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD + medical_class_rank = ( + (sorted_pred == MEDICAL_CLASS).nonzero().item() + ) + is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD subfig_list.append( { "id": f"{subfig_count}.jpg", "source_fig_id": img_id, + "media_name": f"{img_id}.jpg", "position": [(x1, y1), (x2, y2)], "score": score.item(), "subfig_path": subfig_path, diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index 23e2d08..9d5b05c 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -1,5 +1,5 @@ #!/bin/bash -#SBATCH -c 6 +#SBATCH -c 8 #SBATCH --gres=gpu:1 #SBATCH --mem=32GB #SBATCH --time=8:00:00 @@ -11,13 +11,13 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction -stdbuf -oL -eL srun python3 openpmcvl/pipeline/subfigure.py \ - --separation_model openpmcvl/models/subfigure_detector.pth \ - --class_model openpmcvl/models/resnext101_figure_class.pth \ - --eval_file /datasets/PMC-15M/experimental/demo/demo.jsonl \ - --img_root /datasets/PMC-15M/experimental/demo/demo_figures \ - --save_path /datasets/PMC-15M/experimental/demo/demo_subfigures \ - --rcd_file /datasets/PMC-15M/experimental/demo/demo_subfigures.jsonl \ +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ + --separation_model openpmcvl/granular/models/subfigure_detector.pth \ + --class_model openpmcvl/granular/models/resnext101_figure_class.pth \ + --eval_file /datasets/PMC-15M/granular/medical_granular.jsonl \ + --img_root /datasets/PMC-15M/figures \ + --save_path /datasets/PMC-15M/granular/subfigures2 \ + --rcd_file /datasets/PMC-15M/granular/subfigures2.jsonl \ --score_threshold 0.5 \ --nms_threshold 0.4 \ --batch_size 8 \ diff --git a/openpmcvl/granular/pipeline/utils.py b/openpmcvl/granular/pipeline/utils.py new file mode 100644 index 0000000..5aeff75 --- /dev/null +++ b/openpmcvl/granular/pipeline/utils.py @@ -0,0 +1,26 @@ +import json +from typing import Any, Dict, List + + +def load_dataset(file_path: str, num_datapoints: int = -1) -> List[Dict[str, Any]]: + """ + Load dataset from a JSONL file. + + Args: + file_path (str): Path to the input JSONL file. + num_datapoints (int): Number of datapoints to load. If -1, load all datapoints. + + Returns: + List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. + """ + with open(file_path, "r") as f: + dataset = [json.loads(line) for line in f] + return dataset[:num_datapoints] if num_datapoints > 0 else dataset + + +def save_jsonl(data: List[Dict[str, Any]], file_path: str) -> None: + """Save data to a JSONL file.""" + with open(file_path, "w") as f: + for item in data: + json.dump(item, f) + f.write("\n") From 4a8adc926dc8616cd1fdb8b0623224a4a785b461 Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 11 Oct 2024 21:23:28 -0400 Subject: [PATCH 20/62] Add modality classification script. --- openpmcvl/classification/__init__.py | 0 openpmcvl/classification/classifier.py | 113 +++++++++++++++++++++++++ openpmcvl/classification/classifier.sh | 21 +++++ 3 files changed, 134 insertions(+) create mode 100644 openpmcvl/classification/__init__.py create mode 100644 openpmcvl/classification/classifier.py create mode 100644 openpmcvl/classification/classifier.sh diff --git a/openpmcvl/classification/__init__.py b/openpmcvl/classification/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/openpmcvl/classification/classifier.py b/openpmcvl/classification/classifier.py new file mode 100644 index 0000000..a6a6b15 --- /dev/null +++ b/openpmcvl/classification/classifier.py @@ -0,0 +1,113 @@ +import argparse +import torch +from typing import List, Dict +from open_clip import create_model_from_pretrained, get_tokenizer + + +def load_biomedclip_model(device: torch.device) -> tuple: + """ + Load the BiomedCLIP model and tokenizer. + + Args: + device (torch.device): The device to load the model on. + + Returns: + tuple: A tuple containing the model and tokenizer. + """ + model, _ = create_model_from_pretrained( + "hf-hub:microsoft/BiomedCLIP-PubMedBERT_256-vit_base_patch16_224" + ) + tokenizer = get_tokenizer( + "hf-hub:microsoft/BiomedCLIP-PubMedBERT_256-vit_base_patch16_224" + ) + model.to(device) + model.eval() + return model, tokenizer + + +def get_keyword_embeddings( + model: torch.nn.Module, tokenizer: object, classes: List[str], device: torch.device +) -> torch.Tensor: + """ + Generate embeddings for the given classes using BiomedCLIP. + + Args: + model (torch.nn.Module): The BiomedCLIP model. + tokenizer (object): The BiomedCLIP tokenizer. + classes (List[str]): List of classes to embed. + device (torch.device): The device to perform computations on. + + Returns: + torch.Tensor: Tensor of keyword embeddings. + """ + template = "this is a photo of " + texts = tokenizer([template + k for k in classes], context_length=256).to(device) + with torch.no_grad(): + _, text_features, _ = model(None, texts) + return text_features + + +def classify_images( + image_embeddings: torch.Tensor, keyword_embeddings: torch.Tensor +) -> torch.Tensor: + """ + Classify images based on the closest keyword embedding. + + Args: + image_embeddings (torch.Tensor): Tensor of image embeddings. + keyword_embeddings (torch.Tensor): Tensor of keyword embeddings. + + Returns: + torch.Tensor: Tensor of classification indices. + """ + similarities = torch.matmul(image_embeddings, keyword_embeddings.t()) + return torch.argmax(similarities, dim=1) + + +def main(input_file: str, output_file: str, classes: List[str]): + """ + Main function to classify images using BiomedCLIP. + + Args: + input_file (str): Path to the input .pt file containing image embeddings. + output_file (str): Path to save the output .pt file with classifications. + classes (List[str]): List of classes to use for classification. + """ + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + model, tokenizer = load_biomedclip_model(device) + + keyword_embeddings = get_keyword_embeddings(model, tokenizer, classes, device) + + input_data = torch.load(input_file) + image_embeddings = input_data["rgb_embedding"].to(device) + + classifications = classify_images(image_embeddings, keyword_embeddings) + + input_data["class"] = classifications.cpu() + + torch.save(input_data, output_file) + print(f"Classifications saved to {output_file}.") + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="Classify images using BiomedCLIP") + parser.add_argument( + "input_file", + type=str, + help="Path to the input .pt file containing image embeddings", + ) + parser.add_argument( + "output_file", + type=str, + help="Path to save the output .pt file with classifications", + ) + parser.add_argument( + "--classes", + nargs="+", + default=["radiology", "pathology", "chest x-ray"], + help="List of classes to use for classification", + ) + + args = parser.parse_args() + + main(args.input_file, args.output_file, args.classes) diff --git a/openpmcvl/classification/classifier.sh b/openpmcvl/classification/classifier.sh new file mode 100644 index 0000000..531be91 --- /dev/null +++ b/openpmcvl/classification/classifier.sh @@ -0,0 +1,21 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --partition=t4v2 +#SBATCH --mem=32GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=classify_images +#SBATCH --output=%x-%j.out +#SBATCH --gres=gpu:1 + +source /h/afallah/light/bin/activate + +cd /h/afallah/pmc-data-extraction + +INPUT_FILE="openpmcvl/classification/embeddings.pt" +OUTPUT_FILE="openpmcvl/classification/classified.pt" + +stdbuf -oL -eL srun python3 openpmcvl/classification/classifier.py \ + $INPUT_FILE \ + $OUTPUT_FILE \ + --classes "radiology" "pathology" "chest x-ray" \ + 2>&1 | tee -a %x-%j.out From 6ae2b62aa3032753de21f03e24b3041a0682ad6a Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 11 Oct 2024 21:36:34 -0400 Subject: [PATCH 21/62] Complete the set of classes. --- openpmcvl/classification/classifier.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openpmcvl/classification/classifier.sh b/openpmcvl/classification/classifier.sh index 531be91..83b500c 100644 --- a/openpmcvl/classification/classifier.sh +++ b/openpmcvl/classification/classifier.sh @@ -17,5 +17,5 @@ OUTPUT_FILE="openpmcvl/classification/classified.pt" stdbuf -oL -eL srun python3 openpmcvl/classification/classifier.py \ $INPUT_FILE \ $OUTPUT_FILE \ - --classes "radiology" "pathology" "chest x-ray" \ - 2>&1 | tee -a %x-%j.out + --classes "radiology" "ultrasound" "magnetic_resonance" "computerized_tomography" "x-ray" "angiography" "pet" "visible_light_photography" "endoscopy" "electroencephalography" "electrocardiography" "electromyography" "microscopy" "gene_sequence" "chromatography" "chemical_structure" "mathematical_formula" "non-clinical_photos" "hand-drawn_sketches" \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file From 0a9fcbb80f8a67d3ee177c1825075a739b9e3be4 Mon Sep 17 00:00:00 2001 From: afallah Date: Fri, 11 Oct 2024 21:39:41 -0400 Subject: [PATCH 22/62] Update the set of keywords used for initial filtering of medical images. --- openpmcvl/granular/pipeline/preprocess.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index f80e643..6a1312d 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -27,5 +27,5 @@ stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ --input_files $INPUT_FILES \ --output_file $OUTPUT_FILE \ --figure_root $FIGURE_ROOT \ - --keywords CT pathology radiology \ + --keywords MRI fMRI CT CAT PET PET-MRI MEG EEG ultrasound X-ray Xray nuclear imaging tracer isotope scan positron EKG spectroscopy radiograph tomography endoscope endoscopy colonoscopy elastography ultrasonic ultrasonography echocardiogram endomicroscopy pancreatoscopy cholangioscopy enteroscopy retroscopy chromoendoscopy sigmoidoscopy cholangiography pancreatography cholangio-pancreatography esophagogastroduodenoscopy \ 2>&1 | tee -a %x-%j.out \ No newline at end of file From 57344edb4e0ee350b476f0739645b82edbca0047 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 13 Oct 2024 14:09:09 -0400 Subject: [PATCH 23/62] Increase preprocessing pipeline efficiency. --- openpmcvl/granular/pipeline/preprocess.py | 80 +++++++++++++++-------- openpmcvl/granular/pipeline/preprocess.sh | 14 ++-- 2 files changed, 58 insertions(+), 36 deletions(-) diff --git a/openpmcvl/granular/pipeline/preprocess.py b/openpmcvl/granular/pipeline/preprocess.py index 261f0dd..6d3e03b 100644 --- a/openpmcvl/granular/pipeline/preprocess.py +++ b/openpmcvl/granular/pipeline/preprocess.py @@ -38,10 +38,9 @@ def check_keywords(caption: str, keywords: List[str]) -> Tuple[List[str], bool]: - A list of found keywords. - A boolean indicating whether any keywords were found. """ + caption_lower = caption.lower() found_keywords = [ - kw - for kw in keywords - if re.search(r"\b" + re.escape(kw) + r"\b", caption, re.IGNORECASE) + kw for kw in keywords if f" {kw.lower()} " in f" {caption_lower} " ] return found_keywords, bool(found_keywords) @@ -64,20 +63,33 @@ def preprocess_data( Raises: IOError: If there are issues reading input files or writing the output file. """ - processed_data = [] + all_processed_data = [] + missing_figures = {} + output_dir = os.path.dirname(output_file) - for input_file in tqdm(input_files, desc="Processing files"): + for input_file in input_files: data = load_dataset(input_file, num_datapoints=-1) + processed_data = [] + missing_figures_count = 0 + for item in tqdm(data, desc=f"Processing items in {input_file}", leave=False): pmc_id = item["PMC_ID"] media_id = item["media_id"] - image_name = os.path.basename(item["media_url"]) - image_path = f"{figure_root}/{pmc_id}_{media_id}.jpg/{image_name}" + media_name = item["media_name"] + media_url = item["media_url"] + caption = item["caption"] + image_name = os.path.basename(media_url) + image_path = f"{figure_root}/{media_name}/{image_name}" + + # Check if image doesn't exist or is not a .jpg file + if not image_path.endswith(".jpg"): + continue - # Skip if image doesn't exist if not os.path.exists(image_path): - if image_path.endswith(".jpg"): - print(f"Image not found: {image_path}") + missing_figures_count += 1 + if input_file not in missing_figures: + missing_figures[input_file] = [] + missing_figures[input_file].append(image_path) continue try: @@ -86,40 +98,55 @@ def preprocess_data( print(f"Error processing image {image_path}: {str(e)}") continue - found_keywords, has_keywords = check_keywords(item["caption"], keywords) + found_keywords, has_keywords = check_keywords(caption, keywords) processed_item = { "id": f"{pmc_id}_{media_id}", "PMC_ID": pmc_id, - "caption": item["caption"], + "caption": caption, "image_path": image_path, "width": width, "height": height, "media_id": media_id, - "media_url": item["media_url"], - "media_name": item["media_name"], + "media_url": media_url, + "media_name": media_name, "keywords": found_keywords, "is_medical": has_keywords, } processed_data.append(processed_item) - save_jsonl(processed_data, output_file) - print(f"Processed data saved to {output_file}") + # Save processed data for this input file + input_filename = os.path.splitext(os.path.basename(input_file))[0] + temp_output_file = os.path.join(output_dir, f"{input_filename}_processed.jsonl") + save_jsonl(processed_data, temp_output_file) + print( + f"\nProcessed {len(processed_data)} items from {input_file}. Saved to {temp_output_file}" + f"\nTotal missing .jpg images in {input_file}: {missing_figures_count}\n" + ) + + all_processed_data.extend(processed_data) + + # Merge all processed data and save to the final output file + save_jsonl(all_processed_data, output_file) + print(f"All processed data merged and saved to {output_file}") + + # Save missing images to a separate JSONL file + missing_figures_file = os.path.join(output_dir, "missing_figures.jsonl") + save_jsonl(missing_figures, missing_figures_file) + print(f"Missing images information saved to {missing_figures_file}") -def main(): +def main(args: argparse.Namespace): """ Main function to parse arguments and run the preprocessing pipeline. Args: - None + args (argparse.Namespace): Command-line arguments. + """ + preprocess_data(args.input_files, args.output_file, args.figure_root, args.keywords) - Returns: - None - Raises: - ArgumentError: If required arguments are missing or invalid. - """ +if __name__ == "__main__": parser = argparse.ArgumentParser( description="Preprocess JSONL files for figure caption analysis" ) @@ -148,9 +175,4 @@ def main(): ) args = parser.parse_args() - - preprocess_data(args.input_files, args.output_file, args.figure_root, args.keywords) - - -if __name__ == "__main__": - main() + main(args) diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index 6a1312d..e51c34d 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -1,8 +1,8 @@ #!/bin/bash -#SBATCH -c 6 +#SBATCH -c 8 #SBATCH --partition=cpu -#SBATCH --mem=32GB -#SBATCH --time=8:00:00 +#SBATCH --mem=48GB +#SBATCH --time=12:00:00 #SBATCH --job-name=preprocess #SBATCH --output=%x-%j.out @@ -11,11 +11,11 @@ source /h/afallah/light/bin/activate cd /h/afallah/pmc-data-extraction INPUT_DIR="/datasets/PMC-15M" -OUTPUT_FILE="/datasets/PMC-15M/granular/granular.jsonl" +OUTPUT_FILE="/datasets/PMC-15M/granular/granular_meta.jsonl" FIGURE_ROOT="/datasets/PMC-15M/figures" -# Specify which JSONL files to process (space-separated list of numbers) -JSONL_NUMBERS="0 1" +# Specify which JSONL files to process +JSONL_NUMBERS="0 1 2 3 4 5 6 7 8 9 10 11" # Construct INPUT_FILES string INPUT_FILES="" @@ -27,5 +27,5 @@ stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ --input_files $INPUT_FILES \ --output_file $OUTPUT_FILE \ --figure_root $FIGURE_ROOT \ - --keywords MRI fMRI CT CAT PET PET-MRI MEG EEG ultrasound X-ray Xray nuclear imaging tracer isotope scan positron EKG spectroscopy radiograph tomography endoscope endoscopy colonoscopy elastography ultrasonic ultrasonography echocardiogram endomicroscopy pancreatoscopy cholangioscopy enteroscopy retroscopy chromoendoscopy sigmoidoscopy cholangiography pancreatography cholangio-pancreatography esophagogastroduodenoscopy \ + --keywords MRI fMRI CT CAT PET PET-MRI MEG EEG ultrasound X-ray Xray nuclear imaging tracer isotope scan positron EKG spectroscopy radiograph tomography endoscope endoscopy colonoscopy elastography ultrasonic ultrasonography echocardiogram endomicroscopy pancreatoscopy cholangioscopy enteroscopy retroscopy chromoendoscopy sigmoidoscopy cholangiography pancreatography cholangio-pancreatography esophagogastroduodenoscopy radiology pathology histopathology \ 2>&1 | tee -a %x-%j.out \ No newline at end of file From 9da89304454b2e0061af7c7df90f9f7cd5ed189b Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 13 Oct 2024 15:14:11 -0400 Subject: [PATCH 24/62] Use ProcessPoolExecutor for preprocessing dataset. --- openpmcvl/granular/pipeline/preprocess.py | 192 ++++++++++++++-------- openpmcvl/granular/pipeline/preprocess.sh | 4 +- 2 files changed, 125 insertions(+), 71 deletions(-) diff --git a/openpmcvl/granular/pipeline/preprocess.py b/openpmcvl/granular/pipeline/preprocess.py index 6d3e03b..c3ca1d1 100644 --- a/openpmcvl/granular/pipeline/preprocess.py +++ b/openpmcvl/granular/pipeline/preprocess.py @@ -1,10 +1,11 @@ import os -import re import argparse -from typing import List, Tuple -from tqdm import tqdm +from typing import List, Set, Tuple +from concurrent.futures import ProcessPoolExecutor, as_completed from PIL import Image +from tqdm import tqdm + from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl @@ -25,26 +26,109 @@ def get_image_dimensions(image_path: str) -> Tuple[int, int]: return img.size -def check_keywords(caption: str, keywords: List[str]) -> Tuple[List[str], bool]: +def check_keywords(caption: str, keywords: Set[str]) -> Tuple[List[str], bool]: """ Check for the presence of keywords in the caption. Args: caption (str): The caption text to search in. - keywords (List[str]): A list of keywords to search for. + keywords (Set[str]): A set of keywords to search for. Returns: Tuple[List[str], bool]: A tuple containing: - A list of found keywords. - A boolean indicating whether any keywords were found. """ - caption_lower = caption.lower() - found_keywords = [ - kw for kw in keywords if f" {kw.lower()} " in f" {caption_lower} " - ] + caption_words = set(caption.lower().split()) + found_keywords = list(keywords.intersection(caption_words)) return found_keywords, bool(found_keywords) +def process_single_file( + input_file: str, figure_root: str, keywords: Set[str], output_dir: str, position: int +) -> Tuple[List[dict], List[str], List[str]]: + """ + Process a single input file. + + Args: + input_file (str): Path to the input JSONL file. + figure_root (str): Root directory for figure images. + keywords (Set[str]): Set of keywords to search for in captions. + output_dir (str): Directory to save the processed file. + position (int): Position for the tqdm progress bar. + + Returns: + Tuple[List[dict], List[str], List[str]]: Processed data, missing figures, and messages. + """ + data = load_dataset(input_file, num_datapoints=-1) + processed_data = [] + missing_figures_count = 0 + missing_figures = [] + messages = [] + + # Use tqdm with position parameter + pbar = tqdm(data, desc=f"Processing {os.path.basename(input_file)}", + position=position, leave=True, ncols=100) + + for item in pbar: + pmc_id = item["PMC_ID"] + media_id = item["media_id"] + media_name = item["media_name"] + media_url = item["media_url"] + caption = item["caption"] + image_name = os.path.basename(media_url) + image_path = f"{figure_root}/{media_name}/{image_name}" + + # Check if image doesn't exist or is not a .jpg file + if not image_path.endswith(".jpg"): + continue + + if not os.path.exists(image_path): + missing_figures_count += 1 + missing_figures.append(image_path) + continue + + try: + width, height = get_image_dimensions(image_path) + except Exception as e: + msg = f"Error processing image {image_path}: {str(e)}" + messages.append(msg) + continue + + found_keywords, has_keywords = check_keywords(caption, keywords) + + processed_item = { + "id": f"{pmc_id}_{media_id}", + "PMC_ID": pmc_id, + "caption": caption, + "image_path": image_path, + "width": width, + "height": height, + "media_id": media_id, + "media_url": media_url, + "media_name": media_name, + "keywords": found_keywords, + "is_medical": has_keywords, + } + processed_data.append(processed_item) + + # Update pbar one last time to ensure it's at 100% + pbar.n = len(data) + pbar.refresh() + + # Save processed data for this input file + input_filename = os.path.splitext(os.path.basename(input_file))[0] + temp_output_file = os.path.join(output_dir, f"{input_filename}_processed.jsonl") + save_jsonl(processed_data, temp_output_file) + msg = ( + f"\nProcessed {len(processed_data)} items from {input_file}. Saved to {temp_output_file}" + f"\nTotal missing .jpg images in {input_file}: {missing_figures_count}\n" + ) + messages.append(msg) + + return processed_data, missing_figures, messages + + def preprocess_data( input_files: List[str], output_file: str, figure_root: str, keywords: List[str] ) -> None: @@ -59,72 +143,41 @@ def preprocess_data( Returns: None - - Raises: - IOError: If there are issues reading input files or writing the output file. """ all_processed_data = [] missing_figures = {} output_dir = os.path.dirname(output_file) + messages = [] + + # Create a ProcessPoolExecutor to process files in parallel + with ProcessPoolExecutor() as executor: + # Submit jobs with position parameter + future_to_file = { + executor.submit( + process_single_file, input_file, figure_root, keywords, output_dir, i + ): input_file + for i, input_file in enumerate(input_files) + } + + # Use tqdm to track overall progress + overall_pbar = tqdm(total=len(input_files), desc="Overall Progress", position=len(input_files), leave=True) + + for future in as_completed(future_to_file): + input_file = future_to_file[future] + try: + processed_data, missing_figs, msgs = future.result() + all_processed_data.extend(processed_data) + missing_figures[input_file] = missing_figs + messages.extend(msgs) + overall_pbar.update(1) + except Exception as exc: + print(f"\nException occurred while processing {input_file}: {exc}") - for input_file in input_files: - data = load_dataset(input_file, num_datapoints=-1) - processed_data = [] - missing_figures_count = 0 - - for item in tqdm(data, desc=f"Processing items in {input_file}", leave=False): - pmc_id = item["PMC_ID"] - media_id = item["media_id"] - media_name = item["media_name"] - media_url = item["media_url"] - caption = item["caption"] - image_name = os.path.basename(media_url) - image_path = f"{figure_root}/{media_name}/{image_name}" - - # Check if image doesn't exist or is not a .jpg file - if not image_path.endswith(".jpg"): - continue - - if not os.path.exists(image_path): - missing_figures_count += 1 - if input_file not in missing_figures: - missing_figures[input_file] = [] - missing_figures[input_file].append(image_path) - continue + overall_pbar.close() - try: - width, height = get_image_dimensions(image_path) - except Exception as e: - print(f"Error processing image {image_path}: {str(e)}") - continue - - found_keywords, has_keywords = check_keywords(caption, keywords) - - processed_item = { - "id": f"{pmc_id}_{media_id}", - "PMC_ID": pmc_id, - "caption": caption, - "image_path": image_path, - "width": width, - "height": height, - "media_id": media_id, - "media_url": media_url, - "media_name": media_name, - "keywords": found_keywords, - "is_medical": has_keywords, - } - processed_data.append(processed_item) - - # Save processed data for this input file - input_filename = os.path.splitext(os.path.basename(input_file))[0] - temp_output_file = os.path.join(output_dir, f"{input_filename}_processed.jsonl") - save_jsonl(processed_data, temp_output_file) - print( - f"\nProcessed {len(processed_data)} items from {input_file}. Saved to {temp_output_file}" - f"\nTotal missing .jpg images in {input_file}: {missing_figures_count}\n" - ) - - all_processed_data.extend(processed_data) + # Print all messages + for msg in messages: + print(msg) # Merge all processed data and save to the final output file save_jsonl(all_processed_data, output_file) @@ -175,4 +228,5 @@ def main(args: argparse.Namespace): ) args = parser.parse_args() + args.keywords = set(kw.lower() for kw in args.keywords) main(args) diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index e51c34d..57c2672 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -1,7 +1,7 @@ #!/bin/bash -#SBATCH -c 8 +#SBATCH -c 32 #SBATCH --partition=cpu -#SBATCH --mem=48GB +#SBATCH --mem=128GB #SBATCH --time=12:00:00 #SBATCH --job-name=preprocess #SBATCH --output=%x-%j.out From 2a700183c54493046ea30f33a405e863f02953c6 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 13 Oct 2024 15:14:40 -0400 Subject: [PATCH 25/62] Add pipeline to classify subfigures. --- openpmcvl/granular/pipeline/classify.py | 153 ++++++++++++++++++++++++ openpmcvl/granular/pipeline/classify.sh | 21 ++++ openpmcvl/granular/pipeline/utils.py | 71 ++++++++++- 3 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 openpmcvl/granular/pipeline/classify.py create mode 100644 openpmcvl/granular/pipeline/classify.sh diff --git a/openpmcvl/granular/pipeline/classify.py b/openpmcvl/granular/pipeline/classify.py new file mode 100644 index 0000000..6cdc9dc --- /dev/null +++ b/openpmcvl/granular/pipeline/classify.py @@ -0,0 +1,153 @@ +import argparse +import json +from PIL import Image +from typing import Any, Dict, List + +import torch +import torch.nn as nn +from torch.utils.data import Dataset, DataLoader +from torchvision import models, transforms +from tqdm import tqdm + +from openpmcvl.granular.pipeline.utils import load_dataset +from openpmcvl.granular.dataset.dataset import SubfigureDataset + +MEDICAL_CLASS = 15 +CLASSIFICATION_THRESHOLD = 4 + + +def load_classification_model(model_path: str, device: torch.device) -> nn.Module: + """ + Loads the figure classification model. + + Args: + model_path (str): Path to the classification model checkpoint + device (torch.device): Device to use for processing + + Returns: + nn.Module: Loaded classification model + """ + fig_model = models.resnext101_32x8d() + num_features = fig_model.fc.in_features + fc = list(fig_model.fc.children()) + fc.extend([nn.Linear(num_features, 28)]) + fig_model.fc = nn.Sequential(*fc) + fig_model = fig_model.to(device) + fig_model.load_state_dict(torch.load(model_path, map_location=device)) + fig_model.eval() + return fig_model + + +def classify_dataset( + model: torch.nn.Module, + data_list: List[Dict[str, Any]], + batch_size: int, + device: torch.device, + output_file: str, +): + """ + Classifies images in a dataset using the provided model and saves results to a new JSONL file. + + Args: + model (torch.nn.Module): The classification model. + data_list (List[Dict[str, Any]]): The dataset to classify. + batch_size (int): Batch size for processing. + device (torch.device): Device to use for processing. + output_file (str): Path to save the updated JSONL file with classification results. + + Returns: + None + """ + mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) + transform = transforms.Compose( + [ + transforms.Resize((384, 384), interpolation=Image.LANCZOS), + transforms.ToTensor(), + transforms.Normalize(*mean_std), + ] + ) + + dataset = SubfigureDataset(data_list, transform=transform) + dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=False) + + model.eval() + model.to(device) + + results = [] + + with torch.no_grad(): + for images, items in tqdm(dataloader, desc="Classifying"): + images = images.to(device) + + outputs = model(images) + + for output, item in zip(outputs, items): + sorted_pred = torch.argsort(output.cpu(), descending=True) + medical_class_rank = (sorted_pred == MEDICAL_CLASS).nonzero().item() + is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD + + # Update the item with the new keys + item["medical_class_rank"] = medical_class_rank + item["is_medical"] = is_medical + + # Append the updated item to results + results.append(item) + + # Save the updated items to a new JSONL file + with open(output_file, "w") as f: + for item in results: + f.write(json.dumps(item) + "\n") + + +def main(args: argparse.Namespace) -> None: + """ + Main function to run the image classification pipeline. + + This function loads the classification model, prepares the dataset, + and performs classification on the images, saving the results to a JSONL file. + + Args: + args (argparse.Namespace): Command-line arguments containing: + - model_path (str): Path to the classification model checkpoint + - dataset_path (str): Path to the dataset + - batch_size (int): Batch size for processing + - output_file (str): Path to save the JSONL file with classification results + + Returns: + None + """ + device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + + model = load_classification_model(args.model_path, device) + dataset = load_dataset(args.dataset_path) + + classify_dataset( + model, dataset, args.batch_size, device, args.dataset_path, args.output_file + ) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Classify images in a dataset and update JSONL file" + ) + parser.add_argument( + "--model_path", + type=str, + required=True, + help="Path to the classification model checkpoint", + ) + parser.add_argument( + "--dataset_path", type=str, required=True, help="Path to the dataset" + ) + parser.add_argument( + "--output_file", + type=str, + required=True, + help="Path to save the JSONL file with classification results", + ) + parser.add_argument( + "--batch_size", type=int, default=128, help="Batch size for processing" + ) + args = parser.parse_args() + + main(args) diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh new file mode 100644 index 0000000..8ff29e7 --- /dev/null +++ b/openpmcvl/granular/pipeline/classify.sh @@ -0,0 +1,21 @@ +#!/bin/bash +#SBATCH -c 8 +#SBATCH --gres=gpu:1 +#SBATCH --mem=48GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=classify +#SBATCH --output=%x-%j.out +#SBATCH --gres=gpu:1 + +source /h/afallah/light/bin/activate + +cd /h/afallah/pmc-data-extraction + +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ + --model_path openpmcvl/granular/models/resnext101_figure_class.pth \ + --dataset_path /datasets/PMC-15M/granular/subfigures.jsonl \ + --output_file /datasets/PMC-15M/granular/subfigures_classified.jsonl \ + --batch_size 128 \ + --num_workers 8 \ + --gpu 0 + 2>&1 | tee -a %x-%j.out \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/utils.py b/openpmcvl/granular/pipeline/utils.py index 5aeff75..0ff6f13 100644 --- a/openpmcvl/granular/pipeline/utils.py +++ b/openpmcvl/granular/pipeline/utils.py @@ -1,4 +1,5 @@ import json +import torch from typing import Any, Dict, List @@ -19,8 +20,76 @@ def load_dataset(file_path: str, num_datapoints: int = -1) -> List[Dict[str, Any def save_jsonl(data: List[Dict[str, Any]], file_path: str) -> None: - """Save data to a JSONL file.""" + """ + Save data to a JSONL (JSON Lines) file. + + This function takes a list of dictionaries and writes each dictionary as a separate JSON object + on a new line in the specified file. This format is known as JSONL (JSON Lines). + + Args: + data (List[Dict[str, Any]]): A list of dictionaries to be saved. Each dictionary + represents a single data point or record. + file_path (str): The path to the output file where the data will be saved. + """ with open(file_path, "w") as f: for item in data: json.dump(item, f) f.write("\n") + + +def box_cxcywh_to_xyxy(x): + """ + Convert bounding box coordinates from (center_x, center_y, width, height) to (x1, y1, x2, y2) format. + + Args: + x (torch.Tensor): Input tensor of shape (..., 4) containing bounding box coordinates in (cx, cy, w, h) format. + + Returns: + torch.Tensor: Tensor of shape (..., 4) containing bounding box coordinates in (x1, y1, x2, y2) format. + """ + x_c, y_c, w, h = x.unbind(-1) + b = [(x_c - 0.5 * w), (y_c - 0.5 * h), (x_c + 0.5 * w), (y_c + 0.5 * h)] + return torch.stack(b, dim=-1) + + +def find_intersection(set_1, set_2): + """ + Find the intersection of every box combination between two sets of boxes that are in boundary coordinates. + + Args: + set_1 (torch.Tensor): Set 1, a tensor of dimensions (n1, 4) -- (x1, y1, x2, y2) + set_2 (torch.Tensor): Set 2, a tensor of dimensions (n2, 4) + + Returns: + torch.Tensor: Intersection of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2) + """ + lower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0)) + upper_bounds = torch.min(set_1[:, 2:].unsqueeze(1), set_2[:, 2:].unsqueeze(0)) + intersection_dims = torch.clamp(upper_bounds - lower_bounds, min=0) + return intersection_dims[:, :, 0] * intersection_dims[:, :, 1] + + +def find_jaccard_overlap(set_1, set_2): + """ + Find the Jaccard Overlap (IoU) of every box combination between two sets of boxes that are in boundary coordinates. + + Args: + set_1 (torch.Tensor): Set 1, a tensor of dimensions (n1, 4) + set_2 (torch.Tensor): Set 2, a tensor of dimensions (n2, 4) + + Returns: + torch.Tensor: Jaccard Overlap of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2) + """ + if set_1.dim() == 1 and set_1.shape[0] == 4: + set_1 = set_1.unsqueeze(0) + if set_2.dim() == 1 and set_2.shape[0] == 4: + set_2 = set_2.unsqueeze(0) + + intersection = find_intersection(set_1, set_2) + + areas_set_1 = (set_1[:, 2] - set_1[:, 0]) * (set_1[:, 3] - set_1[:, 1]) + areas_set_2 = (set_2[:, 2] - set_2[:, 0]) * (set_2[:, 3] - set_2[:, 1]) + + union = areas_set_1.unsqueeze(1) + areas_set_2.unsqueeze(0) - intersection + + return intersection / union From a86a13e7863912a5f3eb06ef451b336092b6d229 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 13 Oct 2024 15:15:05 -0400 Subject: [PATCH 26/62] Refactor classification pipeline from separation pipeline. --- openpmcvl/granular/pipeline/subfigure.py | 123 +++++------------------ openpmcvl/granular/pipeline/subfigure.sh | 6 +- 2 files changed, 30 insertions(+), 99 deletions(-) diff --git a/openpmcvl/granular/pipeline/subfigure.py b/openpmcvl/granular/pipeline/subfigure.py index 2e13efc..f24056c 100644 --- a/openpmcvl/granular/pipeline/subfigure.py +++ b/openpmcvl/granular/pipeline/subfigure.py @@ -2,46 +2,39 @@ import json import argparse from pathlib import Path -from typing import Dict, List, Tuple, Any +from typing import List, Tuple import numpy as np import torch import torch.nn as nn from torch.utils.data import DataLoader from tqdm import tqdm -from torchvision import utils as vutils, models, transforms +from torchvision import utils as vutils from PIL import Image -from openpmcvl.granular.process.dataset_det_align import ( +from openpmcvl.granular.dataset.dataset import ( Fig_Separation_Dataset, fig_separation_collate, ) from openpmcvl.granular.models.subfigure_detector import FigCap_Former -from openpmcvl.granular.process.detect_metric import ( - box_cxcywh_to_xyxy, - find_jaccard_overlap, -) - -MEDICAL_CLASS = 15 -CLASSIFICATION_THRESHOLD = 4 +from openpmcvl.granular.pipeline.utils import box_cxcywh_to_xyxy, find_jaccard_overlap -def load_dataset( - eval_file: str, img_root: str, batch_size: int, num_workers: int -) -> DataLoader: +def load_dataset(eval_file: str, batch_size: int, num_workers: int) -> DataLoader: """ Prepares the dataset and returns a DataLoader. Args: eval_file (str): Path to the evaluation dataset file - img_root (str): Root path for figures batch_size (int): Batch size for the DataLoader num_workers (int): Number of workers for the DataLoader Returns: DataLoader: Configured DataLoader for the separation dataset """ - dataset = Fig_Separation_Dataset(None, eval_file, img_root, normalization=False) + dataset = Fig_Separation_Dataset( + filepath=eval_file, normalization=False, only_medical=True + ) print(f"\nDataset size: {len(dataset)}\n") return DataLoader( dataset, @@ -127,31 +120,8 @@ def process_detections( return picked_bboxes, picked_scores -def load_classification_model(model_path: str, device: torch.device) -> nn.Module: - """ - Loads the figure classification model. - - Args: - model_path (str): Path to the classification model checkpoint - device (torch.device): Device to use for processing - - Returns: - nn.Module: Loaded classification model - """ - fig_model = models.resnext101_32x8d() - num_features = fig_model.fc.in_features - fc = list(fig_model.fc.children()) - fc.extend([nn.Linear(num_features, 28)]) - fig_model.fc = nn.Sequential(*fc) - fig_model = fig_model.to(device) - fig_model.load_state_dict(torch.load(model_path, map_location=device)) - fig_model.eval() - return fig_model - - -def separate_classify_subfigures( +def separate_subfigures( model: FigCap_Former, - class_model: nn.Module, loader: DataLoader, save_path: str, rcd_file: str, @@ -164,7 +134,6 @@ def separate_classify_subfigures( Args: model (FigCap_Former): Loaded model for subfigure detection - class_model (nn.Module): Loaded model for figure classification loader (DataLoader): DataLoader for the dataset save_path (str): Path to save separated subfigures rcd_file (str): File to record separation results @@ -176,20 +145,12 @@ def separate_classify_subfigures( subfig_list = [] subfig_count = 0 - mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - fig_class_transform = transforms.Compose( - [ - transforms.Resize((384, 384), interpolation=Image.LANCZOS), - transforms.ToTensor(), - transforms.Normalize(*mean_std), - ] - ) - with torch.no_grad(): try: - for batch in tqdm(loader, desc="Separating subfigures", total=len(loader)): + for batch in tqdm( + loader, desc="Separating subfigures...", total=len(loader) + ): image = batch["image"].to(device) - # caption = batch["caption"].to(device) img_ids = batch["image_id"] original_images = batch["original_image"] unpadded_hws = batch["unpadded_hws"] @@ -240,32 +201,15 @@ def separate_classify_subfigures( ) vutils.save_image(subfig, subfig_path) - # Perform classification - class_input = ( - fig_class_transform(transforms.ToPILImage()(subfig)) - .unsqueeze(0) - .to(device) - ) - fig_prediction = class_model(class_input) - - sorted_pred = torch.argsort( - fig_prediction[0].cpu(), descending=True - ) - medical_class_rank = ( - (sorted_pred == MEDICAL_CLASS).nonzero().item() - ) - is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD - subfig_list.append( { - "id": f"{subfig_count}.jpg", + "id": f"{img_id}_{subfig_count}.jpg", "source_fig_id": img_id, + "PMC_ID": img_id.split("_")[0], "media_name": f"{img_id}.jpg", "position": [(x1, y1), (x2, y2)], "score": score.item(), "subfig_path": subfig_path, - "medical_class_rank": medical_class_rank, - "is_medical": is_medical, } ) subfig_count += 1 @@ -292,19 +236,15 @@ def main(args: argparse.Namespace) -> None: device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = load_separation_model(args.separation_model, device) - class_model = load_classification_model(args.class_model, device) - dataloader = load_dataset( - args.eval_file, args.img_root, args.batch_size, args.num_workers - ) - separate_classify_subfigures( - model, - class_model, - dataloader, - args.save_path, - args.rcd_file, - args.score_threshold, - args.nms_threshold, - device, + dataloader = load_dataset(args.eval_file, args.batch_size, args.num_workers) + separate_subfigures( + model=model, + loader=dataloader, + save_path=args.save_path, + rcd_file=args.rcd_file, + score_threshold=args.score_threshold, + nms_threshold=args.nms_threshold, + device=device, ) print("\nSubfigure separation and classification completed.\n") @@ -320,28 +260,19 @@ def main(args: argparse.Namespace) -> None: required=True, help="Path to subfigure detection model checkpoint", ) - parser.add_argument( - "--class_model", - type=str, - required=True, - help="Path to figure classification model checkpoint", - ) parser.add_argument( "--eval_file", type=str, required=True, help="Path to evaluation dataset file" ) - parser.add_argument( - "--img_root", type=str, required=True, help="Root path for figures" - ) parser.add_argument( "--save_path", type=str, - default="./Separation", + required=True, help="Path to save separated subfigures", ) parser.add_argument( "--rcd_file", type=str, - default="./Separation/separation.jsonl", + required=True, help="File to record separation results", ) parser.add_argument( @@ -354,10 +285,10 @@ def main(args: argparse.Namespace) -> None: "--nms_threshold", type=float, default=0.4, help="IoU threshold for NMS" ) parser.add_argument( - "--batch_size", type=int, default=16, help="Batch size for evaluation" + "--batch_size", type=int, default=128, help="Batch size for evaluation" ) parser.add_argument( - "--num_workers", type=int, default=2, help="Number of workers for data loading" + "--num_workers", type=int, default=8, help="Number of workers for data loading" ) parser.add_argument("--gpu", type=str, default="0", help="GPU to use") diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index 9d5b05c..e106328 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -14,10 +14,10 @@ cd /h/afallah/pmc-data-extraction stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ --separation_model openpmcvl/granular/models/subfigure_detector.pth \ --class_model openpmcvl/granular/models/resnext101_figure_class.pth \ - --eval_file /datasets/PMC-15M/granular/medical_granular.jsonl \ + --eval_file /datasets/PMC-15M/granular/granular_meta.jsonl \ --img_root /datasets/PMC-15M/figures \ - --save_path /datasets/PMC-15M/granular/subfigures2 \ - --rcd_file /datasets/PMC-15M/granular/subfigures2.jsonl \ + --save_path /datasets/PMC-15M/granular/subfigures \ + --rcd_file /datasets/PMC-15M/granular/subfigures.jsonl \ --score_threshold 0.5 \ --nms_threshold 0.4 \ --batch_size 8 \ From 5e7857e1658c3b650543b4a1aa5c16e826fa68ea Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:27:57 -0500 Subject: [PATCH 27/62] Remove dead code. --- .../granular/process/GPTsubcap_postprocess.py | 300 - openpmcvl/granular/process/LICENSE | 21 - openpmcvl/granular/process/README.md | 43 - openpmcvl/granular/process/__init__.py | 0 openpmcvl/granular/process/align_metric.py | 252 - .../augmentation_parameters/color.jsonl | 10 - .../augmentation_parameters/flip.jsonl | 13 - .../augmentation_parameters/flip_color.jsonl | 13 - .../flip_color_grey.jsonl | 13 - .../flip_color_grey_noise_blur.jsonl | 13 - .../granular/process/augmentation_tools.py | 118 - .../chatgpt_subcaptions/chatgpt_subcaption.py | 189 - openpmcvl/granular/process/data_preprocess.py | 1361 - .../granular/process/dataset_clip_align.py | 718 - .../granular/process/dataset_det_align.py | 696 - .../granular/process/dataset_exsclaim.py | 265 - openpmcvl/granular/process/detect_metric.py | 431 - .../granular/process/detr_code/backbone.py | 120 - openpmcvl/granular/process/detr_code/detr.py | 83 - .../granular/process/detr_code/matcher.py | 86 - openpmcvl/granular/process/detr_code/misc.py | 468 - .../process/detr_code/position_encoding.py | 89 - .../process/detr_code/segmentation.py | 363 - .../granular/process/detr_code/transformer.py | 297 - openpmcvl/granular/process/inference.py | 365 - .../granular/process/inference_clip_align.py | 215 - .../process/inference_detect_align.py | 472 - .../granular/process/model_clip_align.py | 345 - openpmcvl/granular/process/model_det_align.py | 212 - openpmcvl/granular/process/playground.ipynb | 4260 -- .../playground_inference_detect_align.py | 474 - .../process/playground_subfigure_ocr.py | 407 - openpmcvl/granular/process/pmc_oa.py | 139 - .../process/sh_files/search_bert_layers.sh | 5 - .../process/sh_files/search_threshold.sh | 10 - openpmcvl/granular/process/subcaption.ipynb | 174 - openpmcvl/granular/process/subfigure.ipynb | 319 - .../granular/process/subfigure_classify.py | 248 - .../granular/process/subfigure_label.ipynb | 302 - openpmcvl/granular/process/subfigure_ocr.py | 407 - .../process/subfigure_ocr/__init__.py | 0 .../config/scale_label_reader.json | 169 - .../config/yolov3_default_master.cfg | 34 - .../config/yolov3_default_subfig.cfg | 34 - .../process/subfigure_ocr/models/__init__.py | 0 .../process/subfigure_ocr/models/crnn.py | 182 - .../process/subfigure_ocr/models/network.py | 353 - .../subfigure_ocr/models/yolo_layer.py | 632 - .../process/subfigure_ocr/models/yolov3.py | 299 - .../process/subfigure_ocr/scale/__init__.py | 0 .../process/subfigure_ocr/scale/coco_eval.py | 381 - .../process/subfigure_ocr/scale/coco_utils.py | 253 - .../process/subfigure_ocr/scale/corpus.txt | 50000 ---------------- .../process/subfigure_ocr/scale/ctc.py | 241 - .../process/subfigure_ocr/scale/dataset.py | 287 - .../process/subfigure_ocr/scale/engine.py | 153 - .../subfigure_ocr/scale/evaluate_scale.py | 434 - .../subfigure_ocr/scale/label_reader_test.py | 197 - .../process/subfigure_ocr/scale/lm.py | 59 - .../process/subfigure_ocr/scale/process.py | 73 - .../subfigure_ocr/scale/scale_bar_model.py | 192 - .../subfigure_ocr/scale/train_label_reader.py | 433 - .../process/subfigure_ocr/scale/utils.py | 268 - .../subfigure_ocr/separator/__init__.py | 0 .../subfigure_ocr/separator/process.py | 239 - .../granular/process/train_clip_align.py | 267 - .../granular/process/train_detect_align.py | 389 - openpmcvl/granular/process/train_engine.py | 702 - .../granular/process/transformer_module.py | 192 - .../granular/process/visualization_tools.py | 381 - 70 files changed, 71160 deletions(-) delete mode 100644 openpmcvl/granular/process/GPTsubcap_postprocess.py delete mode 100644 openpmcvl/granular/process/LICENSE delete mode 100644 openpmcvl/granular/process/README.md delete mode 100644 openpmcvl/granular/process/__init__.py delete mode 100644 openpmcvl/granular/process/align_metric.py delete mode 100644 openpmcvl/granular/process/augmentation_parameters/color.jsonl delete mode 100644 openpmcvl/granular/process/augmentation_parameters/flip.jsonl delete mode 100644 openpmcvl/granular/process/augmentation_parameters/flip_color.jsonl delete mode 100644 openpmcvl/granular/process/augmentation_parameters/flip_color_grey.jsonl delete mode 100644 openpmcvl/granular/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl delete mode 100644 openpmcvl/granular/process/augmentation_tools.py delete mode 100644 openpmcvl/granular/process/chatgpt_subcaptions/chatgpt_subcaption.py delete mode 100644 openpmcvl/granular/process/data_preprocess.py delete mode 100644 openpmcvl/granular/process/dataset_clip_align.py delete mode 100644 openpmcvl/granular/process/dataset_det_align.py delete mode 100644 openpmcvl/granular/process/dataset_exsclaim.py delete mode 100644 openpmcvl/granular/process/detect_metric.py delete mode 100644 openpmcvl/granular/process/detr_code/backbone.py delete mode 100644 openpmcvl/granular/process/detr_code/detr.py delete mode 100644 openpmcvl/granular/process/detr_code/matcher.py delete mode 100644 openpmcvl/granular/process/detr_code/misc.py delete mode 100644 openpmcvl/granular/process/detr_code/position_encoding.py delete mode 100644 openpmcvl/granular/process/detr_code/segmentation.py delete mode 100644 openpmcvl/granular/process/detr_code/transformer.py delete mode 100644 openpmcvl/granular/process/inference.py delete mode 100644 openpmcvl/granular/process/inference_clip_align.py delete mode 100644 openpmcvl/granular/process/inference_detect_align.py delete mode 100644 openpmcvl/granular/process/model_clip_align.py delete mode 100644 openpmcvl/granular/process/model_det_align.py delete mode 100644 openpmcvl/granular/process/playground.ipynb delete mode 100644 openpmcvl/granular/process/playground_inference_detect_align.py delete mode 100644 openpmcvl/granular/process/playground_subfigure_ocr.py delete mode 100644 openpmcvl/granular/process/pmc_oa.py delete mode 100644 openpmcvl/granular/process/sh_files/search_bert_layers.sh delete mode 100644 openpmcvl/granular/process/sh_files/search_threshold.sh delete mode 100644 openpmcvl/granular/process/subcaption.ipynb delete mode 100644 openpmcvl/granular/process/subfigure.ipynb delete mode 100644 openpmcvl/granular/process/subfigure_classify.py delete mode 100644 openpmcvl/granular/process/subfigure_label.ipynb delete mode 100644 openpmcvl/granular/process/subfigure_ocr.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/__init__.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/config/scale_label_reader.json delete mode 100644 openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_master.cfg delete mode 100644 openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_subfig.cfg delete mode 100644 openpmcvl/granular/process/subfigure_ocr/models/__init__.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/models/crnn.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/models/network.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/models/yolo_layer.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/models/yolov3.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/__init__.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/coco_eval.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/coco_utils.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/corpus.txt delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/ctc.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/dataset.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/engine.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/evaluate_scale.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/label_reader_test.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/lm.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/process.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/scale_bar_model.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/train_label_reader.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/scale/utils.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/separator/__init__.py delete mode 100644 openpmcvl/granular/process/subfigure_ocr/separator/process.py delete mode 100644 openpmcvl/granular/process/train_clip_align.py delete mode 100644 openpmcvl/granular/process/train_detect_align.py delete mode 100644 openpmcvl/granular/process/train_engine.py delete mode 100644 openpmcvl/granular/process/transformer_module.py delete mode 100644 openpmcvl/granular/process/visualization_tools.py diff --git a/openpmcvl/granular/process/GPTsubcap_postprocess.py b/openpmcvl/granular/process/GPTsubcap_postprocess.py deleted file mode 100644 index a57a1d8..0000000 --- a/openpmcvl/granular/process/GPTsubcap_postprocess.py +++ /dev/null @@ -1,300 +0,0 @@ -import json -import os -from tqdm import tqdm -import jsonpickle - -# 把GPTsubcaption和OCRfigure放在一个exsclaim.json后,然后用exsclaim进行配对 - -def pair_GPTsubcap_with_OCRsubfig(): - """ - 将chatgpt并行分割的subcap和subfigOCR结果整理成exsclaim.json(并把ROCO过滤掉 - 然后用exscliam配对 - """ - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/chatgpt_subcaptions.json', 'r') as f: # chatgpt_subcaptions,已过滤roco - subcap_dict = json.load(f) # pmcid: {status:xxxx, caption:xxxx, subcaptions:{A:xxx, ....}} - - # OCR的结果 - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/subfigure_ocr_no_subcaps.json' # exsclaim subfigs ocr results,没过滤roco - with open(file_path, 'r') as f: - subfig_dict = json.load(f) - - # 填入chatgpt的结果 - new_subfig_dict = {} - for fig_id, data in subfig_dict.items(): - fig_id = fig_id[:-4] - # 如果pmcid对不上(why?可能是roco被过滤掉了,chatgpt版本的subcap是基于huggingface版本的,应该以它为准 - if fig_id not in subcap_dict: - continue - # 如果分不开,那么subcap直接置空 - if subcap_dict[fig_id]['status'] != 'Separable': - data['unassigned']['captions'] = [] - # 可以被分开 - else: - subcaptions = [] - for label, subcap in subcap_dict[fig_id]['subcaptions'].items(): - subcaptions.append({'label':label, 'description':[subcap], 'keywords':[], 'general':[]}) - data['unassigned']['captions'] = subcaptions - new_subfig_dict[fig_id] = data - - # 保存 - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json', 'w') as f: # 已经过滤了roco - json.dump(new_subfig_dict, f, indent=3) - -# 挑出所有nonROCO的subfig-->subfigure_v1.jsonl,和nonROCO的figure-->woROCO_fig_id_set.json -# OCR配对的结果-->(subfig-subcap-OCR)subfigure_v1.jsonl,顺便把noncompound figure-caption挑出来-->(noncompound)subfigure_v1.jsonl - -def update_subfigure_with_paired_GTPsubcap_OCRsubfig(): - """ - 配对后的subfig-subcap整理成规范格式; - 更新之前的subfig-subcap数据; - 顺便过滤掉ROCO(chatgpt的subcap是过滤好的; - 把noncompound figure-caption检测出来; - """ - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/aligned_GPTsubcap_OCRsubfig.json', 'r') as f: # EXSCLAIM处理过后的subcap-subfig pairs(已经过滤掉ROCO - data_dict = json.load(f) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigure_v0.jsonl', 'r') as f: # v0的subfig(基于EXSCLAIMsubcaps,有ROCO - subfig_data = [json.loads(line) for line in lines] - - # chatgpt+ocr的结果,先从exsclaim格式转成subfig:subcap的字典,woROCO - subfig_subcap_dict = {} # PMC8253756_Fig2_0.jpg:xxx - for _, datum in data_dict.items(): - for subfig in datum['master_images']: - if len(subfig['caption']) == 0: - continue - else: - subfig_id = subfig['classification'] - subfig_subcap_dict[subfig_id] = subfig['caption'][0] - print('%d chatgpt+ocr processed subfig-subcap pairs'%len(subfig_subcap_dict)) - - # 读取所有不在roco中的fig的id - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/intermediate_files/chatgpt_subcaptions.json', 'r') as f: # chatGPT输出的subcap结果,没有ROCO - none_roco_dict = json.load(f) - - # 查找字典,将subfigure中的subcaption更新一遍(有更新的单独保存 - chatgpt_ocr_subfigure = [] # 所有pair好的subfig-subcap - none_roco_subfigure = [] # 用pair好的subfig-subcap更新一下subfigure,同时滤掉roco,即包含了没有和subcap配上的subfig - roco_subfigs = 0 - no_roco_fig_set = set() - for datum in tqdm(subfig_data): - fig_id = datum['media_name'][:-4] - if fig_id not in none_roco_dict: - roco_subfigs += 1 - continue - else: - no_roco_fig_set.add(fig_id) - if datum['subfig_id'] in subfig_subcap_dict: - datum['subcaption'] = subfig_subcap_dict[datum['subfig_id']] - datum['subcap_score'] = 1.0 - chatgpt_ocr_subfigure.append(datum) - else: - # 没有match上的直接放弃 - # 如果之前有match上exsclaim-subcap,也直接放弃 - datum['subcaption'] = '' - datum['subcap_score'] = 0.0 - none_roco_subfigure.append(datum) - print('%d None ROCO SubFigures'%len(none_roco_subfigure)) - print('%d None ROCO Compound Figures'%len(no_roco_fig_set)) - print('%d subfigs are in ROCO'%roco_subfigs) - # chatgpt_ocr_subfigure和none_roco_subfigure分开保存 - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subset)subfigure_v1.jsonl', 'w') as f: - for datum in chatgpt_ocr_subfigure: - f.write(json.dumps(datum)+'\n') - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigure_v1.jsonl', 'w') as f: - for datum in none_roco_subfigure: - f.write(json.dumps(datum)+'\n') - # no_roco_fig_set也要保存 - json_data = jsonpickle.encode(no_roco_fig_set) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/woROCO_fig_id_set.json', 'w') as f: - json.dump(json_data, f, indent=3) - - # 读取fig信息,把noncompound过滤出来 - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/com2sub_v0.jsonl', 'r') as f: - lines = f.readlines() - fig_data = [json.loads(line) for line in lines] - noncom_fig_set = set() - for datum in tqdm(fig_data): - if len(datum['subfig_ids']) == 1: - # 这个subfig就是nonfig - fig_id = datum['fig_id'][:-4] - noncom_fig_set.add(fig_id) - print('%d compound figure has only one subfigure (include ROCO and None ROCO)' % len(noncom_fig_set)) - # nonfig_set也要保存 - json_data = jsonpickle.encode(noncom_fig_set) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/wROCO_nonecom_fig_id_set.json', 'w') as f: - json.dump(json_data, f, indent=3) - - # 对于每个subfig,如果没有subcap可以对上,但确定所在fig中只有这一个subfig&caption经过chatgpt判定为unseparable,则可判定是noncompound fig,这个subfig-caption质量也很高才对 - none_roco_noncompound_subfigure =[] - none_roco_noncompound_set = set() - for datum in tqdm(none_roco_subfigure): - fig_id = datum['media_name'][:-4] - if fig_id in noncom_fig_set and none_roco_dict[fig_id]['status']!='Separable': - # 直接让subcaption等于caption - datum['subcaption'] = datum['caption'] - datum['subcaption_score'] = 1.0 - none_roco_noncompound_set.add(fig_id) - none_roco_noncompound_subfigure.append(datum) - print('%d none compound figures (exclude roco)'%len(none_roco_noncompound_subfigure)) - # noncompoundfigure-fullcaption也要保存,可以视作,和subfig-subcap同样低噪声的一部分数据 - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(non-compound)subfigure_v1.jsonl', 'w') as f: - for datum in none_roco_noncompound_subfigure: - f.write(json.dumps(datum)+'\n') - # none_roco_noncompound_set也要保存 - json_data = jsonpickle.encode(none_roco_noncompound_set) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/woROCO_nonecom_fig_id_set.json', 'w') as f: - json.dump(json_data, f, indent=3) - -# 找到所有不可分的caption对应的subfigure,如果不是compoundfigure,那么把所有的subfigure都指向full caption - -def find_subfigure_with_unseparable_caption(): - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigure_v1.jsonl') as f: # all subfigures,woROCO - lines = f.readlines() - all_nonroco_subfig = [json.loads(line) for line in lines] - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/chatgpt_subcaptions.json', 'r') as f: # chatgpt_subcaptions,woROCO - subcap_dict = json.load(f) # pmcid: {status:xxxx, caption:xxxx, subcaptions:{A:xxx, ....}} - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/woROCO_nonecom_fig_id_set.json') as f: # noncompound figures,woROCO - noncompound_dict = jsonpickle.decode(f.read()) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/woROCO_fig_id_set.json') as f: # nonROCO - nonROCO_dict = jsonpickle.decode(f.read()) - - subfigure2fullcaption = [] # caption不可分且不是noncompound-figure的subfigures - for subfig in tqdm(all_nonroco_subfig): - fig_id = subfig['media_name'][:-4] - if fig_id not in subcap_dict: - print(fig_id) - print('is ROCO: ', fig_id not in nonROCO_dict) - continue - if subcap_dict[fig_id]['status'] !='Separable': # 找到所有,Unseparable - if fig_id not in noncompound_dict: # 而且不是noncompound figure - subfig['subcaption'] = subfig['caption'] # full caption描述对应了所有的subfigure - subfig['subcap_score'] = 1.0 - subfigure2fullcaption.append(subfig) - - print(len(subfigure2fullcaption)) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-fullcap)subfigure_v1.jsonl', 'w') as f: - for datum in subfigure2fullcaption: - f.write(json.dumps(datum)+'\n') - -# 找到所有caption可分,但是又没能用OCR对上的subfigure,整理一个subfigure--subfigure_info--all_subcap_in_this_figure的list出来 - -def find_subfig_subcap_cannotOCR(): - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigure_v1.jsonl') as f: # all subfigures,woROCO - lines = f.readlines() - all_nonroco_subfig = [json.loads(line) for line in lines] - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-subcap-ocr)subfigure_v1.jsonl') as f: # part3 - lines = f.readlines() - OCR_subfig = [json.loads(line)['subfig_id'] for line in lines] - OCR_subfig_set = set(OCR_subfig) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-fullcap)subfigure_v1.jsonl') as f: # part2 - lines = f.readlines() - cap2all_subfig = [json.loads(line)['subfig_id'] for line in lines] - cap2all_subfig_set = set(cap2all_subfig) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(noncompound)subfigure_v1.jsonl') as f: # part1 - lines = f.readlines() - noncompound_subfig = [json.loads(line)['subfig_id'] for line in lines] - noncompound_subfig_set = set(noncompound_subfig) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/chatgpt_subcaptions.json', 'r') as f: # chatgpt_subcaptions,woROCO - subcap_dict = json.load(f) # pmcid: {status:xxxx, caption:xxxx, subcaptions:{A:xxx, ....}} - - CLIP_Align_subfig = [] - for datum in tqdm(all_nonroco_subfig): - subfig_id = datum['subfig_id'] - if subfig_id not in OCR_subfig_set and subfig_id not in cap2all_subfig_set and subfig_id not in noncompound_subfig_set: - fig_id = datum['media_name'][:-4] - datum['subcaptions'] = subcap_dict[fig_id] - if datum['subcaption'] != '': - print(datum['subcaption']) - del datum['subcaption'] - del datum['subcap_score'] - CLIP_Align_subfig.append(datum) - - print(len(CLIP_Align_subfig)) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-subcap-CLIP)subfigure_v1.jsonl', 'w') as f: - for datum in CLIP_Align_subfig: - f.write(json.dumps(datum)+'\n') - -# V1版本对jsonl的字段重新规范化,参考README中的格式 - -def reformat_all_jsonl(): - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-subcap-clip)subfigure_v1.jsonl', 'r') as f: - lines = f.readlines() - clip_align = [json.loads(line) for line in lines] - new_clip_align = [] - for datum in tqdm(clip_align): - new_datum = {'subfigure':datum['subfig_id'], 'subfig_loc':datum['subfig_loc'], 'subfig_score':datum['subfig_score'], 'subcaption':datum['subcaption'], 'subcap_score':datum['subcap_score'], 'alignment_type':'CLIP', 'origin_figure':datum['media_name'], 'full_caption':datum['caption']} - new_clip_align.append(new_datum) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-subcap-CLIP)subfigure_v1.jsonl', 'a') as f: - for line in new_clip_align: - f.write(json.dumps(line)+'\n') - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-subcap-ocr)subfigure_v1.jsonl', 'r') as f: - lines = f.readlines() - ocr_align = [json.loads(line) for line in lines] - new_ocr_align = [] - for datum in tqdm(ocr_align): - new_datum = {'subfigure':datum['subfig_id'], 'subfig_loc':datum['subfig_loc'], 'subfig_score':datum['subfig_score'], 'subcaption':datum['subcaption'], 'subcap_score':datum['subcap_score'], 'alignment_type':'OCR', 'origin_figure':datum['media_name'], 'full_caption':datum['caption']} - new_ocr_align.append(new_datum) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-subcap-OCR)subfigure_v1.jsonl', 'a') as f: - for line in new_ocr_align: - f.write(json.dumps(line)+'\n') - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(noncompound)subfigure_v1.jsonl', 'r') as f: - lines = f.readlines() - noncompound = [json.loads(line) for line in lines] - new_noncompound = [] - for datum in tqdm(noncompound): - new_datum = {'subfigure':datum['subfig_id'], 'subfig_loc':datum['subfig_loc'], 'subfig_score':datum['subfig_score'], 'subcaption':datum['subcaption'], 'subcap_score':datum['subcap_score'], 'alignment_type':'nonCompound-figure', 'origin_figure':datum['media_name'], 'full_caption':datum['caption']} - new_noncompound.append(new_datum) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(nonCompound-figure)subfigure_v1.jsonl', 'a') as f: - for line in new_noncompound: - f.write(json.dumps(line)+'\n') - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(subfig-fullcap)subfigure_v1.jsonl', 'r') as f: - lines = f.readlines() - noncompound = [json.loads(line) for line in lines] - new_noncompound = [] - for datum in tqdm(noncompound): - new_datum = {'subfigure':datum['subfig_id'], 'subfig_loc':datum['subfig_loc'], 'subfig_score':datum['subfig_score'], 'subcaption':datum['subcaption'], 'subcap_score':datum['subcap_score'], 'alignment_type':'nonCompound-caption', 'origin_figure':datum['media_name'], 'full_caption':datum['caption']} - new_noncompound.append(new_datum) - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(nonCompound-caption)subfigure_v1.jsonl', 'a') as f: - for line in new_noncompound: - f.write(json.dumps(line)+'\n') - -def concat_all_jsonl(): - data = [] - for jsonl in [ - '(subfig-subcap-CLIP)subfigure_v1.jsonl', - '(subfig-subcap-OCR)subfigure_v1.jsonl', - '(nonCompound-caption)subfigure_v1.jsonl', - '(nonCompound-figure)subfigure_v1.jsonl' - ]: - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/'+jsonl, 'r') as f: - lines = f.readlines() - print(lines[0]) - data += [json.loads(line) for line in lines] - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigure_v2.jsonl', 'a') as f: - for datum in data: - f.write(json.dumps(datum)+'\n') - -if __name__ == "__main__": - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigure_v2.jsonl', 'r') as f: - lines = f.readlines() - data = [json.loads(line) for line in lines] - - new_data = [] - for datum in data: - new_datum = {'image':datum['subfigure'], 'caption':datum['subcaption'], 'alignment_type':datum['alignment_type'], 'alignment_score':datum['subcap_score']} - new_data.append(new_datum) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/pmc_oa.jsonl', 'w') as f: - for datum in new_data: - f.write(json.dumps(datum)+'\n') \ No newline at end of file diff --git a/openpmcvl/granular/process/LICENSE b/openpmcvl/granular/process/LICENSE deleted file mode 100644 index 6e94e13..0000000 --- a/openpmcvl/granular/process/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 赵子恒 - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/openpmcvl/granular/process/README.md b/openpmcvl/granular/process/README.md deleted file mode 100644 index b43a286..0000000 --- a/openpmcvl/granular/process/README.md +++ /dev/null @@ -1,43 +0,0 @@ -filter out non-medical figure - -``` -please refer to subfigure_classify.py -``` - -detect and separate subfigure - -``` -inference_det_align.py \ ---task 'separate' \ ---save_path path_to_save_subfigures \ ---rcd_file file_to_log_results \ ---img_root path_of_compound_figures \ # save all the figure in a folder ---eval_file jsonl_file_of_all_the_samples_to_infer # refer to Fig_Separation_Dataset for the format of the jsonl file ---checkpoint subfigure_detection.pth - -assign the collate fcn to the dataloader -``` - -filter out non-medical subfigure - -``` -please refer to subfigure_classify.py -``` - -detect and separate subcaption - -``` -please refer to chatgpt_subcaption.py (this is a py file converted from jupyter notebook on colab) -``` - -subfigure OCR - -``` -please refer to subfigure_ocr() in subfigure_ocr.py, its done using [exsclaim](https://github.com/MaterialEyes/exsclaim) -``` - -pair subfigure and subcaption - -``` -refer to GPTsubcap_postprocess -``` diff --git a/openpmcvl/granular/process/__init__.py b/openpmcvl/granular/process/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/process/align_metric.py b/openpmcvl/granular/process/align_metric.py deleted file mode 100644 index 41916fe..0000000 --- a/openpmcvl/granular/process/align_metric.py +++ /dev/null @@ -1,252 +0,0 @@ -import torch -from torchvision.ops.boxes import box_area -import torch.nn.functional as F -import numpy as np - -from typing import List - -def box_cxcywh_to_xyxy(x): - x_c, y_c, w, h = x.unbind(-1) - b = [(x_c - 0.5 * w), (y_c - 0.5 * h), - (x_c + 0.5 * w), (y_c + 0.5 * h)] - return torch.stack(b, dim=-1) - - -def box_xyxy_to_cxcywh(x): - x0, y0, x1, y1 = x.unbind(-1) - b = [(x0 + x1) / 2, (y0 + y1) / 2, - (x1 - x0), (y1 - y0)] - return torch.stack(b, dim=-1) - - -# modified from torchvision to also return the union -def box_iou(boxes1, boxes2): - area1 = box_area(boxes1) - area2 = box_area(boxes2) - - lt = torch.max(boxes1[:, None, :2], boxes2[:, :2]) # [N,M,2] - rb = torch.min(boxes1[:, None, 2:], boxes2[:, 2:]) # [N,M,2] - - wh = (rb - lt).clamp(min=0) # [N,M,2] - inter = wh[:, :, 0] * wh[:, :, 1] # [N,M] - - union = area1[:, None] + area2 - inter - - iou = inter / union - - return iou, union - - -def generalized_box_iou(boxes1, boxes2): - """ - Generalized IoU from https://giou.stanford.edu/ - - Calculate GIoU between box pairs - - Input boxes should be in [x0, y0, x1, y1] format - - Returns a [N, M] pairwise matrix, where N = len(boxes1) - and M = len(boxes2) - """ - # degenerate boxes gives inf / nan results - # so do an early check - assert (boxes1[:, 2:] >= boxes1[:, :2]).all() - assert (boxes2[:, 2:] >= boxes2[:, :2]).all() - iou, union = box_iou(boxes1, boxes2) - - lt = torch.min(boxes1[:, None, :2], boxes2[:, :2]) - rb = torch.max(boxes1[:, None, 2:], boxes2[:, 2:]) - - wh = (rb - lt).clamp(min=0) # [N,M,2] - area = wh[:, :, 0] * wh[:, :, 1] - - return iou - (area - union) / area - - -def pair_wise_bce(output, target): - """ - Calculate BCE between tensor pairs - - Args: - output & target (tensor): prob sequences with shape (N/M, *) - - Returns: - loss_martix: [N, M] pairwise matrix - """ - assert output.shape[1:] == target.shape[1:], "Cant Match Shape of Output, Target for Binary Cross Entrop Loss" - - loss_matrix = torch.zeros([output.shape[0], target.shape[0]]) - for i in range(output.shape[0]): - for j in range(target.shape[0]): - try: - loss_matrix[i, j] = F.binary_cross_entropy(output[i], target[j]) - except: - print(output[i]) - print(target[j]) - print(output[i]>=0) - print(output[i]<=1) - - return loss_matrix - - -def iou(box1, box2): - # Box1 and Box2 should be (x1, y1, x2, y2), 1 is the left top point, 2 is the right bottom point - if max(box1[0], box2[0]) > min(box1[2], box2[2]) or max(box1[1], box2[1]) > min(box1[3], box2[3]): - return 0 - intersect_box = [max(box1[0], box2[0]), max(box1[1], box2[1]), min(box1[2], box2[2]), min(box1[3], box2[3])] - intersect_area = (intersect_box[2]-intersect_box[0])*(intersect_box[3]-intersect_box[1]) - union_area = (box1[3]-box1[1])*(box1[2]-box1[0])+(box2[3]-box2[1])*(box2[2]-box2[0])-intersect_area - if union_area == 0: - return 0 - return intersect_area / union_area - - -class SubfigureSubcaptionAlignmentMetric(): - def __init__(self, iou_threshold: float): - self.iou_threshold = iou_threshold - self.reset() - - def update(self, - predicted_subfigures: List[List[List[float]]], # [bs * [num_gt * [4]]] - predicted_tokens: List[List[List[int]]], # [bs * [num_pred * [pred_cap_len]]] - gold_subfigures: List[List[List[float]]], # [bs * [num_gt * [4]]] - gold_tokens: List[List[List[int]]], # [bs * [num_gt * [gt_cap_len]]] - wordpieces: List[List[str]]): # [bs * [cap_len]] - - match_matrix = [] # [bs * [num_gt]] - - assert len(predicted_subfigures) == len(predicted_tokens) == len(gold_subfigures) == len(gold_tokens) == len(wordpieces) - - batch_size = len(wordpieces) - for i in range(batch_size): - match_idx = [] - # 对Predict Token过滤 - pred_filtered_tokens = [] - for subcaption in predicted_tokens[i]: - filtered_subcaption = [] - for t in subcaption: - if wordpieces[i][t][0] != "#" and wordpieces[i][t].isalnum() and (len(wordpieces[i][t]) > 0 or not wordpieces[i][t].isalpha()): - # if t not in common_wordpieces[i]: - filtered_subcaption.append(t) - pred_filtered_tokens.append(filtered_subcaption) # [num_pred * [pred_cap_len] - - # 对于每个GT Subfigure,找到与之最匹配的Predict Subfigure(没有则直接f1=0) - for k in range(len(gold_subfigures[i])): - max_iou = 0 - max_iou_index = None - for p in range(len(predicted_subfigures[i])): - iou_value = iou( - box_cxcywh_to_xyxy(torch.tensor(predicted_subfigures[i][p])), - box_cxcywh_to_xyxy(torch.tensor(gold_subfigures[i][k])) - ) - """ - print('Sample%d, GT%d:(%.2f, %.2f, %.2f, %.2f) Pred%d:(%.2f, %.2f, %.2f, %.2f), IOU%.1f' % (i, k, - gold_subfigures[i][k][0], gold_subfigures[i][k][1], gold_subfigures[i][k][2], gold_subfigures[i][k][3], - p, - predicted_subfigures[i][p][0], predicted_subfigures[i][p][1], predicted_subfigures[i][p][2], predicted_subfigures[i][p][3], - iou_value)) - """ - if iou_value > max_iou: - max_iou = iou_value - max_iou_index = p - if max_iou < self.iou_threshold: - self.f1s.append(0) - self.recall.append(0) - self.prec.append(0) - match_idx.append(-1) - continue - else: - match_idx.append(max_iou_index) - - # 对GT Token过滤 - gold_filtered_tokens = [] - for t in gold_tokens[i][k]: - if wordpieces[i][t][0] != "#" and wordpieces[i][t].isalnum() and (len(wordpieces[i][t]) > 0 or not wordpieces[i][t].isalpha()): - gold_filtered_tokens.append(t) - if len(gold_filtered_tokens) == 0: - continue - - # 最匹配的Predict Subfigure对应的Subcaption,与GT Subcaption计算F1 - matching_pred_tokens = pred_filtered_tokens[max_iou_index] - # print([wordpieces[i][ind] for ind in matching_pred_tokens]) - intersection = set(gold_filtered_tokens).intersection(set(matching_pred_tokens)) - recall = float(len(intersection))/float(len(gold_filtered_tokens)) - if recall == 0: - self.f1s.append(0) - self.recall.append(0) - self.prec.append(0) - continue - precision = float(len(intersection))/float(len(matching_pred_tokens)) - - self.recall.append(recall) - self.prec.append(precision) - self.f1s.append(2.0*precision*recall/(precision+recall)) - - match_matrix.append(match_idx) - - return match_matrix - - - - - def get_metric(self, reset: bool = False): - if len(self.f1s) == 0: - return 0.0, 0.0, 0.0 - - avg_f1 = np.mean(self.f1s) - avg_rcl = np.mean(self.recall) - avg_prec = np.mean(self.prec) - - if reset: - self.reset() - return avg_f1, avg_rcl, avg_prec - - def reset(self): - self.f1s = [] - self.recall = [] - self.prec = [] - - -if __name__=="__main__": - similarity_threshold = 0.5 - iou_threshold = 0.5 - from dataset import FigCap_Dataset, my_collate - from torch.utils.data import DataLoader - from tqdm import tqdm - val_file = '/remote-home/share/medical/public/MedICaT/subfig_subcap_val.jsonl' - img_root = '/remote-home/share/medical/public/MedICaT/release/figures' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/scibert/vocab.txt' - ValSet = FigCap_Dataset(val_file, img_root, vocab_file) - ValLoader = DataLoader(ValSet, batch_size=2, shuffle=False, num_workers=4, collate_fn=my_collate) - val_subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - val_subcaption_metric.reset() - for batch in tqdm(ValLoader): - image = batch['image']#.cuda() # (bs, 3, max_w, max_h) - caption = batch['caption']#.cuda() # (bs, max_l) - subfigures = batch['subfigs'] - # output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - # accumulate results as subfig-subcap format - cpu_caption = caption#.cpu() - ls_caption = [ValSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens - # - # filter_mask = output_det_class.squeeze() > config.score_threshold # [bs, query_num], True or False - # ls_pred_boxes = [output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) - # - ls_gt_boxes = [ls[1].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) - # - index_matrix = torch.arange(0, caption.shape[-1]) # [caption_length], (0, 1, 2 ...) - ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] - ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] - for i in range(image.shape[0]): - # filter_tmp = output_sim[i, filter_mask[i], :] > config.similarity_threshold # (filtered_query_num, caption_length) True or False - # pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - # ls_pred_tokens.append(pred_tokens) - filter_tmp = subfigures[i][2] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens.append(gt_tokens) - val_subcaption_metric.update(predicted_subfigures=ls_gt_boxes, predicted_tokens=ls_gt_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - - f1, rcl, prc = val_subcaption_metric.get_metric(reset=True) - - diff --git a/openpmcvl/granular/process/augmentation_parameters/color.jsonl b/openpmcvl/granular/process/augmentation_parameters/color.jsonl deleted file mode 100644 index 3ff2b8a..0000000 --- a/openpmcvl/granular/process/augmentation_parameters/color.jsonl +++ /dev/null @@ -1,10 +0,0 @@ -{ - "id" : "color_jitter_low", - "horizontal_flip_prob" : 0.0, - "vertical_flip_prob" : 0.0, - "brightness" : 0.1, - "contrast" : 0.1, - "saturation" : 0.1, - "gaussian_noise_prob" : 0.0, - "gaussian_blur_prob" : 0.0 -} \ No newline at end of file diff --git a/openpmcvl/granular/process/augmentation_parameters/flip.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip.jsonl deleted file mode 100644 index 2c783f8..0000000 --- a/openpmcvl/granular/process/augmentation_parameters/flip.jsonl +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id" : "flip", - "horizontal_flip_prob" : 0.5, - "vertical_flip_prob" : 0.5, - "colorjitter_prob" : 0.0, - "brightness" : 0.0, - "contrast" : 0.0, - "saturation" : 0.0, - "color_invert_prob" : 0.0, - "gray_scale_prob" : 0.0, - "gaussian_noise_prob" : 0.0, - "gaussian_blur_prob" : 0.0 -} \ No newline at end of file diff --git a/openpmcvl/granular/process/augmentation_parameters/flip_color.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip_color.jsonl deleted file mode 100644 index c8a7d8c..0000000 --- a/openpmcvl/granular/process/augmentation_parameters/flip_color.jsonl +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id" : "flip+color_jitter", - "horizontal_flip_prob" : 0.5, - "vertical_flip_prob" : 0.5, - "colorjitter_prob" : 0.5, - "brightness" : 0.1, - "contrast" : 0.1, - "saturation" : 0.1, - "color_invert_prob" : 0.0, - "gray_scale_prob" : 0.0, - "gaussian_noise_prob" : 0.0, - "gaussian_blur_prob" : 0.0 -} \ No newline at end of file diff --git a/openpmcvl/granular/process/augmentation_parameters/flip_color_grey.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip_color_grey.jsonl deleted file mode 100644 index 7350ac9..0000000 --- a/openpmcvl/granular/process/augmentation_parameters/flip_color_grey.jsonl +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id" : "flip+color+grey", - "horizontal_flip_prob" : 0.5, - "vertical_flip_prob" : 0.5, - "colorjitter_prob" : 0.5, - "brightness" : 0.1, - "contrast" : 0.1, - "saturation" : 0.1, - "color_invert_prob" : 0.1, - "gray_scale_prob" : 0.1, - "gaussian_noise_prob" : 0.0, - "gaussian_blur_prob" : 0.0 -} \ No newline at end of file diff --git a/openpmcvl/granular/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl b/openpmcvl/granular/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl deleted file mode 100644 index 9a59abc..0000000 --- a/openpmcvl/granular/process/augmentation_parameters/flip_color_grey_noise_blur.jsonl +++ /dev/null @@ -1,13 +0,0 @@ -{ - "id" : "flip+color+grey+noise+blur", - "horizontal_flip_prob" : 0.5, - "vertical_flip_prob" : 0.5, - "colorjitter_prob" : 0.1, - "brightness" : 0.1, - "contrast" : 0.1, - "saturation" : 0.1, - "color_invert_prob" : 0.1, - "gray_scale_prob" : 0.1, - "gaussian_noise_prob" : 0.1, - "gaussian_blur_prob" : 0.1 -} \ No newline at end of file diff --git a/openpmcvl/granular/process/augmentation_tools.py b/openpmcvl/granular/process/augmentation_tools.py deleted file mode 100644 index e4fd8d2..0000000 --- a/openpmcvl/granular/process/augmentation_tools.py +++ /dev/null @@ -1,118 +0,0 @@ -from random import choices -from torchvision import transforms -import torch - -class Augmentation_Tool(): - def __init__(self, aug_params): - super().__init__() - # aug param - if aug_params: - # flip - self.horizontal_flip_prob = aug_params['horizontal_flip_prob'] - self.vertical_flip_prob = aug_params['vertical_flip_prob'] - # color jitter - self.colorjitter_prob = aug_params['colorjitter_prob'] - self.brightness = aug_params['brightness'] - self.contrast = aug_params['contrast'] - self.saturation = aug_params['saturation'] - self.color_jitter = transforms.ColorJitter(self.brightness, self.contrast, self.saturation) - # noise and blur - self.gaussian_noise_prob = aug_params['gaussian_noise_prob'] - self.gaussian_blur_prob = aug_params['gaussian_blur_prob'] - self.gaussian_blur = transforms.GaussianBlur((5,5)) - # gray scale and color invert - self.gray_scale_prob = aug_params['gray_scale_prob'] - self.gray_converter = transforms.Grayscale(3) - self.color_inverter = transforms.RandomInvert(aug_params['color_invert_prob']) - else: - self.horizontal_flip_prob = self.vertical_flip_prob = 0.0 - self.colorjitter_prob = 0.0 - self.color_jitter = None - self.gaussian_noise_prob = self.gaussian_blur_prob = 0.0 - self.gaussian_blur = None - self.gray_scale_prob = 0.0 - self.gray_converter = None - self.color_inverter = transforms.RandomInvert(0.0) - - def __call__(self, unpadded_image, unnorm_bboxes): - unpadded_image, unnorm_bboxes = self.apply_horizontal_flip(unpadded_image, unnorm_bboxes) - unpadded_image, unnorm_bboxes = self.apply_vertical_flip(unpadded_image, unnorm_bboxes) - unpadded_image = self.apply_color_jit(unpadded_image) - unpadded_image = self.color_inverter(unpadded_image) - unpadded_image = self.apply_gray_scale(unpadded_image) - unpadded_image = self.apply_gaussian_noise(unpadded_image) - unpadded_image = self.apply_gaussian_blur(unpadded_image) - return unpadded_image, unnorm_bboxes - - def apply_horizontal_flip(self, image, bboxes): - """ - 此Aug函数应在getitem函数中调用 - - Args: - image (tensor): (3, h, w) - bboxes (list of [cx, cy, w, h]): unnormalized - """ - if choices([0, 1], weights=[1-self.horizontal_flip_prob, self.horizontal_flip_prob])[0]: - image = transforms.RandomHorizontalFlip(p=1)(image) - for bbox in bboxes: # cx, cy, w, h - bbox[0] = image.shape[-1]-bbox[0] - return image, bboxes - - def apply_vertical_flip(self, image, bboxes): - """ - 此Aug函数应在getitem函数中调用 - - Args: - image (tensor): - bboxes (list of [cx, cy, w, h]): unnormalized - """ - if choices([0, 1], weights=[1-self.horizontal_flip_prob, self.horizontal_flip_prob])[0]: - image = transforms.RandomVerticalFlip(p=1)(image) - for bbox in bboxes: # cx, cy, w, h - bbox[1] = image.shape[1]-bbox[1] - return image, bboxes - - def apply_color_jit(self, image): - """ - 此Aug函数应在getitem函数中调用 - - Args: - image (tensor): (3, h, w) - """ - if choices([0, 1], weights=[1-self.colorjitter_prob, self.colorjitter_prob])[0]: - image = self.color_jitter(image) - return image - - def apply_gaussian_blur(self, image): - """ - 此Aug函数应在getitem函数中调用 - - Args: - image (tensor): (3, h, w) - """ - if choices([0, 1], weights=[1-self.gaussian_blur_prob, self.gaussian_blur_prob])[0]: - image = self.gaussian_blur(image) - return image - - def apply_gray_scale(self, image): - """ - 此Aug函数应在getitem函数中调用 - - Args: - image (tensor): (3, h, w) - """ - if choices([0, 1], weights=[1-self.gray_scale_prob, self.gray_scale_prob])[0]: - image = self.gray_converter(image) - return image - - def apply_gaussian_noise(self, image, mean=0, std=0.1): - """ - 此Aug函数应在getitem函数中调用 - - Args: - image (tensor): (3, h, w) - """ - if choices([0, 1], weights=[1-self.gaussian_noise_prob, self.gaussian_noise_prob])[0]: - noise = torch.normal(mean,std,image.shape) - image = image+noise - return image \ No newline at end of file diff --git a/openpmcvl/granular/process/chatgpt_subcaptions/chatgpt_subcaption.py b/openpmcvl/granular/process/chatgpt_subcaptions/chatgpt_subcaption.py deleted file mode 100644 index 40fe354..0000000 --- a/openpmcvl/granular/process/chatgpt_subcaptions/chatgpt_subcaption.py +++ /dev/null @@ -1,189 +0,0 @@ -# -*- coding: utf-8 -*- -"""ChatGPT_SubCaption.ipynb - -Automatically generated by Colaboratory. - -Original file is located at - https://colab.research.google.com/drive/1miGiK-AOVHXFLH3_IyHH0aeKHBF3la_h -""" - -import openai -import argparse -import pandas as pd -from tqdm import tqdm -# import tiktoken -import os -import random -from tqdm import tqdm -# import ipdb -import pandas as pd -import re -import json -import argparse -from datasets import load_dataset, concatenate_datasets -import traceback -from pathlib import Path - -api_pool = [ - '...' -] - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument('--split', default=8, type=int) - parser.add_argument('--part', default=0, type=int) - parser.add_argument('--log_interval', default=100, type=int) - parser.add_argument('--unprocessed_data_path', default=None, type=str) - parser.add_argument('--processed_data_path', default=None, type=str) - args = parser.parse_args() - - openai.api_key = random.choice(api_pool) - template = \ - """ - Subfigure labels are letters referring to individual subfigures within a larger figure. - This is a caption:"%s" - Check if the caption contains explicit subfigure label. - If not, output "No." and end the generation. - If yes, output "Yes", then generate the subcaption of the subfigures according to the caption. - The output should use the template: Yes.\n Subfigure-A: ... \n Subfigure-B: ... \n ...... - The label should be removed from subcaption. - """ - - with open(args.unprocessed_data_path, 'r') as f: - lines = f.readlines() - dataset = [json.loads(line) for line in lines] - - # 分配任务 - part = args.part - length = int(len(dataset)/args.split)+1 - log_interval = args.log_interval # 每处理N个记录一次 - save_path = '/content/drive/MyDrive/zzh_files/subcaps_v0_split%d/result_%d.jsonl'%(args.split, part) - - # 读取已经处理一部分的结果,避免重复 - processed_data_path = args.processed_data_path if args.processed_data_path else save_path - processed_data = [] - if Path(processed_data_path).exists(): - with open(processed_data_path, 'r') as f: - lines = f.readlines() - processed_data = [json.loads(line) for line in lines] - processed_id = [] - yes_count = 0 - no_count = 0 - unformatted = 0 - for datum in processed_data: - processed_id.append(datum['comfig_id']) - if datum['status'] == 'Separable': - yes_count += 1 - elif datum['status'] == 'UnSeparable': - no_count += 1 - elif datum['status'] == 'Unformatted': - unformatted += 1 - - processed_queue = [] # 还没保存的结果 - found_start = False - for idx in tqdm(range(part*length, min((part+1)*length, len(dataset)))): - # for idx in tqdm(range(0, 1)): # To debug - if len(processed_queue) >= log_interval: - # 保存 - with open(save_path, 'a') as f: - for datum in processed_queue: - f.write(json.dumps(datum)+'\n') - processed_queue = [] - print('Log : %d processed, %d success, %d unseparable, %d unformatted'%(len(processed_id), yes_count, no_count, unformatted)) - - sample = dataset[idx] - comfig_id = sample['comfig_id'] - if (not found_start) and (comfig_id in processed_id): - continue - else: - found_start = True - - caption = sample['caption'] - # caption = 'No caption is found here.' # To debug - message = template % caption - message = [{"role": "system", "content": 'You are a helpful assistant.'}, - {"role": "user", "content": message}] - - # 如果request没有相应,持续重复 - while (1): - try: - response = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=message - ) - break - except: - tb_info = traceback.format_exc() - if 'You exceeded your current quota' in tb_info: - openai.api_key = random.choice(api_pool) - print('Retry') - - response = response["choices"][0]['message']["content"] - generate_time = 0 - # 多次生成得到规定格式 - while ('Yes.' not in response) and ('No.' not in response) and (generate_time < 5): - generate_time += 1 - while (1): - try: - response = openai.ChatCompletion.create( - model="gpt-3.5-turbo", - messages=message - ) - break - except: - tb_info = traceback.format_exc() - if 'You exceeded your current quota' in tb_info: - openai.api_key = random.choice(api_pool) - print('Retry') - response = response["choices"][0]['message']["content"] - # 判断 - if 'Yes.' not in response: - if 'No.' in response: - # 不可分 - no_count += 1 - # del sample['url_name'] - sample['status'] = 'UnSeparable' - # sample['comfig_id'] = comfig_id - processed_queue.append(sample) - processed_id.append(comfig_id) - continue - else: - # 有限次数内没有生成规定格式 - unformatted += 1 - # del sample['url_name'] - sample['status'] = 'Unformatted' - # sample['comfig_id'] = comfig_id - processed_queue.append(sample) - processed_id.append(comfig_id) - continue - else: - # 可分 - subcap_dict = {} - pattern = re.compile(r'Subfigure-[a-zA-Z]:.+') - matches = pattern.findall(response) - for subcap in matches: - label = subcap[10] # a-z or A-Z - content = subcap[12:-1] - subcap_dict[label] = content - if len(subcap_dict) == 0: - unformatted += 1 - # del sample['url_name'] - sample['status'] = 'Unformatted' - # sample['comfig_id'] = comfig_id - else: - yes_count += 1 - # del sample['url_name'] - sample['subcaptions'] = subcap_dict - sample['status'] = 'Separable' - # sample['comfig_id'] = comfig_id - processed_queue.append(sample) - processed_id.append(comfig_id) - - # 保存 - with open(save_path, 'a') as f: - for datum in processed_queue: - f.write(json.dumps(datum)+'\n') - processed_queue = [] - print('Log : %d processed, %d success, %d unseparable, %d unformatted'%(len(processed_id), yes_count, no_count, unformatted)) - - diff --git a/openpmcvl/granular/process/data_preprocess.py b/openpmcvl/granular/process/data_preprocess.py deleted file mode 100644 index 5a5e221..0000000 --- a/openpmcvl/granular/process/data_preprocess.py +++ /dev/null @@ -1,1361 +0,0 @@ -import os -from builtins import print -import json -import shutil -from PIL import Image -import numpy as np -from tqdm import tqdm -from matplotlib import pyplot as plt -from torchvision import transforms -import random -from pathlib import Path - -def reid_and_extract_subfigs_fromDETR(): - rename_dict = {} # {"xxxxxxx.png" : "index.png"} - - # For Train Set - - new_comfigs = [] # {除去pdf_hash和fig_uri} - new_subfigs = [] # {"id":"index-1.png", "h":x, "w":x, "subcaption_tokens":[{"text": "Figure", "start": 0, "end": 6, "id": 0}, ...], 'text':'xxxxxxxxxxx'} - - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/old/subfig_subcap_train.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - root_path = '/remote-home/share/medical/public/MedICaT/compound_figures/old/figures/' - target_path = '/remote-home/share/medical/public/MedICaT/compound_figures/figures/' - subfig_path = '/remote-home/share/medical/public/MedICaT/compound_figures/subfigures/' - for i, datum in enumerate(tqdm(data)): - # convert to new comfig id - old_id = datum["pdf_hash"]+"_"+datum["fig_uri"] - if old_id in rename_dict: - print('Repeated ID %s', old_id) - exit() - - # Read Image File - com_image = np.array(Image.open(root_path+old_id).convert('RGB')) - - # change comfig id in comfig_data.json - rename_dict[old_id] = str(len(rename_dict)) + '.png' - new_datum = {'id': str(len(rename_dict)) + '.png'} - new_datum.update(datum) - del new_datum['pdf_hash'] - del new_datum['fig_uri'] - del new_datum['fig_key'] - # change subfig id in comfig_data.json - id = 0 - tmp = [] - for subfigure in new_datum['subfigures']: - subfigure['id'] = str(len(rename_dict)) + '_' + str(id) + '.png' - tmp.append(subfigure) - - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = round(min(x)) - x2 = round(max(x)) - y1 = round(min(y)) - y2 = round(max(y)) - # 规范bbox - if y1 < 0: - print(y1) - y1 = 0 - if x1 < 0: - print(x1) - x1 = 0 - if x2 > new_datum['width']-1: - print(x2, '>', new_datum['width']-1) - x2 = new_datum['width']-1 - if y2 > new_datum['height']-1: - print(y2, '>', new_datum['height']-1) - y2 = new_datum['height']-1 - if x2 == x1 or y2 == y1: - continue - - # rcd the subfig basic info in subfig_data.json - new_subfig = {} - new_subfig['id'] = str(len(rename_dict)) + '_' + str(id) + '.png' - new_subfig['h'] = y2 - y1 - new_subfig['w'] = x2 - x1 - if new_datum['subcaptions']!= None and subfigure['label'] in new_datum['subcaptions']: - subcaption = new_datum['subcaptions'][subfigure['label']] # [3, 4, 5, 6 ......] - else: - subcaption = [] - new_subfig['subcaption_tokens'] = [ token for token in new_datum['tokens'] if token['id'] in subcaption ] - new_subfig['caption'] = new_datum['text'] - new_subfigs.append(new_subfig) - # extract the subfig and save it - # print(x1, x2, y1, y2) - sub_image = com_image[y1:y2, x1:x2] - # print(com_image.shape, sub_image.shape) - try: - sub_image = Image.fromarray(sub_image) - except: - print(x1, x2, y1, y2) - print(com_image.shape, sub_image.shape) - exit() - sub_image.save(subfig_path+new_subfig['id']) - - id += 1 - - new_datum['subfigures'] = tmp - new_comfigs.append(new_datum) - - # rename/move the comfig - # shutil.copyfile(root_path+old_id, target_path+str(len(rename_dict)) + '.png') - - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/reid_train.jsonl', "w") - for line in new_comfigs: - f.write(json.dumps(line)+'\n') - f.close() - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/reid_train_subfigs.jsonl', "w") - for line in new_subfigs: - f.write(json.dumps(line)+'\n') - f.close() - - # Repeat for Val Set - - new_comfigs = [] # {除去pdf_hash和fig_uri} - new_subfigs = [] # {"id":"index-1.png", "h":x, "w":x, "subcaption_tokens":[{"text": "Figure", "start": 0, "end": 6, "id": 0}, ...], 'text':'xxxxxxxxxxx'} - - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/old/subfig_subcap_val.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - root_path = '/remote-home/share/medical/public/MedICaT/compound_figures/old/figures/' - target_path = '/remote-home/share/medical/public/MedICaT/compound_figures/figures/' - subfig_path = '/remote-home/share/medical/public/MedICaT/compound_figures/subfigures/' - for i, datum in enumerate(data): - # convert to new comfig id - old_id = datum["pdf_hash"]+"_"+datum["fig_uri"] - if old_id in rename_dict: - print('Repeated ID %s', old_id) - exit() - - # Read Image File - com_image = np.array(Image.open(root_path+old_id).convert('RGB')) - - # change comfig id in comfig_data.json - rename_dict[old_id] = str(len(rename_dict)) + '.png' - new_datum = {'id': str(len(rename_dict)) + '.png'} - new_datum.update(datum) - del new_datum['pdf_hash'] - del new_datum['fig_uri'] - del new_datum['fig_key'] - # change subfig id in comfig_data.json - id = 0 - tmp = [] - for subfigure in new_datum['subfigures']: - subfigure['id'] = str(len(rename_dict)) + '_' + str(id) + '.png' - tmp.append(subfigure) - - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = round(min(x)) - x2 = round(max(x)) - y1 = round(min(y)) - y2 = round(max(y)) - # 规范bbox - if y1 < 0: - print(y1) - y1 = 0 - if x1 < 0: - print(x1) - x1 = 0 - if x2 > new_datum['width']-1: - print(x2, '>', new_datum['width']-1) - x2 = new_datum['width']-1 - if y2 > new_datum['height']-1: - print(y2, '>', new_datum['height']-1) - y2 = new_datum['height']-1 - if x2 == x1 or y2 == y1: - continue - - # rcd the subfig basic info in subfig_data.json - new_subfig = {} - new_subfig['id'] = str(len(rename_dict)) + '_' + str(id) + '.png' - new_subfig['h'] = y2 - y1 - new_subfig['w'] = x2 - x1 - if subfigure['label'] in new_datum['subcaptions']: - subcaption = new_datum['subcaptions'][subfigure['label']] # [3, 4, 5, 6 ......] - else: - subcaption = [] - new_subfig['subcaption_tokens'] = [ token for token in new_datum['tokens'] if token['id'] in subcaption ] - new_subfig['caption'] = new_datum['text'] - new_subfigs.append(new_subfig) - # extract the subfig and save it - # print(x1, x2, y1, y2) - sub_image = com_image[y1:y2, x1:x2] - # print(com_image.shape, sub_image.shape) - try: - sub_image = Image.fromarray(sub_image) - except: - print(x1, x2, y1, y2) - print(com_image.shape, sub_image.shape) - exit() - sub_image.save(subfig_path+new_subfig['id']) - - id += 1 - - new_datum['subfigures'] = tmp - new_comfigs.append(new_datum) - - # rename/move the comfig - # shutil.copyfile(root_path+old_id, target_path+str(len(rename_dict)) + '.png') - - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/reid_test.jsonl', "w") - for line in new_comfigs: - f.write(json.dumps(line)+'\n') - f.close() - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/reid_test_subfigs.jsonl', "w") - for line in new_subfigs: - f.write(json.dumps(line)+'\n') - f.close() - f = open('/remote-home/share/medical/public/MedICaT/compound_figures/convert_id_tab.jsonl', 'w') - f.write(json.dumps(rename_dict)+'\n') - - -def imageclef_xml_2_jsonl(): - comfig_dict = [] - subfig_dict = [] - id_convert_tab = {} # old_id : new_id - from xml.dom.minidom import parse - import xml.dom.minidom - xml_file = "/remote-home/share/medical/public/ImageCLEF2016/medtask/FigureSeparationTraining2016-GT.xml" - # xml_file = "/remote-home/share/medical/public/ImageCLEF2016/medtask/FigureSeparationTest2016GT.xml" - DOMTree = xml.dom.minidom.parse(xml_file) - doc = DOMTree.documentElement - annos = doc.getElementsByTagName("annotation") - comfig_count = 1 - # comfig_count = 6783 - for anno in annos: # a compound figure - print(comfig_count) - f = anno.getElementsByTagName("filename")[0].childNodes[0].data # old id - # convert to new id - id_convert_tab['%s.jpg'%f] = '%d.jpg'%comfig_count - a_comfig = {'id':'%d.jpg'%comfig_count} - # read images and record h w - comfig = np.array(Image.open('/remote-home/share/medical/public/ImageCLEF2016/medtask/FigureSeparationTraining2016/%s.jpg'%f)) - # comfig = np.array(Image.open('/remote-home/share/medical/public/ImageCLEF2016/medtask/FigureSeparationTest2016/%s.jpg'%f)) - try: - h, w, _ = comfig.shape - except: - h, w = comfig.shape - a_comfig['height'] = h - a_comfig['width'] = w - # copy to new id - # shutil.copyfile('/remote-home/share/medical/public/ImageCLEF2016/medtask/FigureSeparationTraining2016/%s.jpg'%f, '/remote-home/share/medical/public/ImageCLEF2016/medtask/new_id_comfigs/%d.jpg'%comfig_count) - # shutil.copyfile('/remote-home/share/medical/public/ImageCLEF2016/medtask/FigureSeparationTest2016/%s.jpg'%f, '/remote-home/share/medical/public/ImageCLEF2016/medtask/new_id_comfigs/%d.jpg'%comfig_count) - # crop subfigs - subfig_list = [] - bboxes = anno.getElementsByTagName("object") - subfig_count = 0 - for bbox in bboxes: # a subfig bbox - points = bbox.getElementsByTagName("point") - # id the subfig - a_subfig = {'id':"%d_%d.png"%(comfig_count, subfig_count)} - # read bbox - x_values = [] - y_values = [] - for point in points: # four points - x_values.append(int(point.getAttribute("x"))) - y_values.append(int(point.getAttribute("y"))) - x1 = min(x_values) - y1 = min(y_values) - x2 = max(x_values) - y2 = max(y_values) - a_subfig['height'] = y2 - y1 - a_subfig['width'] = x2 - x1 - # record the subfig - subfig_dict.append(a_subfig) - subfig_list.append({'id':"%d_%d.png"%(comfig_count, subfig_count), "points":[[x1, y1], [x1, y2], [x2, y1], [x2, y2]]}) - # crop and save - sub_image = comfig[y1:y2, x1:x2] - try: - sub_image = Image.fromarray(sub_image) - # sub_image.save('/remote-home/share/medical/public/ImageCLEF2016/medtask/new_id_subfigs/%d_%d.png'%(comfig_count, subfig_count)) - except: - print ("%d_%d.png"%(comfig_count, subfig_count)) - subfig_count += 1 - a_comfig['subfigures'] = subfig_list - comfig_count += 1 - comfig_dict.append(a_comfig) - # Save comfig_dict and subfig_dict and id convert dict - f = open('/remote-home/share/medical/public/ImageCLEF2016/medtask/train_comfigs.jsonl', "w") - for line in comfig_dict: - f.write(json.dumps(line)+'\n') - f.close() - f = open('/remote-home/share/medical/public/ImageCLEF2016/medtask/train_subfigs.jsonl', "w") - for line in subfig_dict: - f.write(json.dumps(line)+'\n') - f.close() - f = open('/remote-home/share/medical/public/ImageCLEF2016/medtask/convert_id_tab.jsonl', 'a') - f.write(json.dumps(id_convert_tab)+'\n') - f.close() - - -def prepare_pubmed_from_folder(): - """ - 将non-compound图片转化为medicat的json格式 - """ - data_list = [] - - root_path = '/remote-home/share/medical/public/PMC_OA/Evaluate_Compound_Separation/100_samples(NoneCompound)' - for path, dir_list, file_list in os.walk(root_path): - for image_file in file_list: - image = Image.open(os.path.join(root_path, image_file)).convert('RGB') - image = transforms.ToTensor()(image) - c, h, w = image.shape - data_list.append({"id":image_file, "height":h, "width":w, "subfigures":[{"id":'None', "points":[[0, 0], [w, h]]}]}) - - f = open('/remote-home/share/medical/public/PMC_OA/100_samples(NoneCompound).jsonl', 'w') - for line in data_list: - f.write(json.dumps(line)+'\n') - f.close() - - -def prepare_pubmed(): - """ - 将wcy和lwx爬取过滤的数据转化为medicat的json格式 - """ - caption_book = json.load(open('/remote-home/share/chaoyiwu/caption_T060_filtered_top4.json','r')) - total_num = len(caption_book) - data_list = [] - for index in tqdm(range(total_num)): - # index = random.randint(0, total_num) - data = caption_book[index] - image_path = data['image'] - image_id = image_path.split('/')[-1] - image = Image.open(image_path).convert('RGB') - image = transforms.ToTensor()(image) - # id: str - # h&w: int - c, h, w = image.shape - # {"id": "6783_1.png", "points": [[0, 0], [0, 481], [484, 0], [484, 481]]} - data_dict = {"id":image_id, "height":h, "width":w, "subfigures":[{"id":'None', "points":[[0, 0], [0, h], [w, 0], [w, h]]}]} - data_list.append(data_dict) - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4.jsonl', 'w') - for line in data_list: - f.write(json.dumps(line)+'\n') - f.close() - - -def prepare_labelme(): - """ - labelme标注的数据转化为medicat的json格式 - """ - data_list = [] - - root_path = '/remote-home/share/medical/public/PMC_OA/Test_Compound_Separation/(500 samples)caption_T060_filtered_top4_Annotation' - for path, dir_list, file_list in os.walk(root_path): - for anno_dict in file_list: - image_id = anno_dict.split('.json')[0] - # image_path = '/remote-home/zihengzhao/CompoundFigure/Dataset/(300 samples)caption_T060_filtered_top4/' + image_id + '.jpg' - caption_book = json.load(open(os.path.join(root_path, anno_dict),'r')) - h = caption_book['imageHeight'] - w = caption_book['imageWidth'] - - subfigure_list = [] - bboxes = caption_book['shapes'] - count = 0 - for bbox in bboxes: - xy_list = bbox['points'] - x1 = min(xy_list[0][0], xy_list[1][0]) - x2 = max(xy_list[0][0], xy_list[1][0]) - y1 = min(xy_list[0][1], xy_list[1][1]) - y2 = max(xy_list[0][1], xy_list[1][1]) - subfigure_list.append({"id":str(count), "points":[[x1, y1], [x1, y2], [x2, y1], [x2, y2]]}) - - data_list.append({"id":image_id+".jpg", "height":h, "width":w, "subfigures":subfigure_list}) - - f = open('/remote-home/share/medical/public/PMC_OA/Test_Compound_Separation/(500 samples)caption_T060_filtered_top4.jsonl', 'w') - for line in data_list: - f.write(json.dumps(line)+'\n') - f.close() - - -def select_separation_samples(sample_num=300): - """ - 从wcy和lwx爬取过滤的数据中随机抽取一些图像 - """ - caption_book = json.load(open('/remote-home/share/chaoyiwu/caption_T060_filtered_top4.json','r')) - save_path = '/remote-home/share/medical/public/PMC_OA/(300~600 samples)caption_T060_filtered_top4' - - from pathlib import Path - Path(save_path).mkdir(parents=True, exist_ok=True) - - total_num = len(caption_book) - selected_indexes = np.random.choice(total_num, sample_num, False) - for i in range(sample_num): - index = selected_indexes[i] - # index = random.randint(0, total_num) - data = caption_book[index] - image_path = data['image'] - image_id = image_path.split('/')[-1] - print('copy %s to %s' % (image_path, os.path.join(save_path, image_id))) - shutil.copy(image_path, os.path.join(save_path, image_id)) - - -def pair_compoundfigure2caption(): - """ - 将compound figure和caption一一对应起来 - """ - filepath = "/remote-home/share/medical/public/PMC_OA/pairs.jsonl" - f = open(filepath) - lines = f.readlines() - pmc_data = [json.loads(line) for line in lines] - processed_fig = [] - dict_lsit = [] - for datum in tqdm(pmc_data): - comfig_id = datum["media_name"] # PMC212319_Fig3 - if comfig_id in processed_fig: - continue - else: - processed_fig.append(comfig_id) - dict_lsit.append({'comfig_id':comfig_id, 'caption':datum['caption']}) - f = open('/remote-home/share/medical/public/PMC_OA/compoundfigure_pairs.jsonl', 'w') - for line in dict_lsit: - f.write(json.dumps(line)+'\n') - f.close() - - -def pmc2exsclaim(): - """ - 将caption_T060_filtered_top4中的compoundfigure--caption数据转为exsclaim的输入格式, 以便分割caption - 分成10份保存 - """ - filepath = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/' - f = open(filepath) - lines = f.readlines() - pmc_data = [json.loads(line) for line in lines] - random.shuffle(pmc_data) - for i in range(10): - start = i*(len(pmc_data)//10) - end = min(start+len(pmc_data)//10, len(pmc_data)) - fraction = pmc_data[start:end] - exsclaim_data = {} - for datum in tqdm(fraction): - pmc_id = datum['comfig_id'] - caption = datum['caption'] - tmp = { - "title": "None", - "article_url": "None", - "article_name": "None", - "full_caption": caption, - "caption_delimiter": "", - "figure_name": pmc_id, - "image_url": pmc_id, - "license": "None", - "open": True, - "figure_path": "/remote-home/share/medical/public/PMC_OA/figures/"+pmc_id, - "master_images": [], - "unassigned": { - "master_images": [], - "dependent_images": [], - "inset_images": [], - "subfigure_labels": [], - "scale_bar_labels": [], - "scale_bar_lines": [], - "captions": [] - } - } - exsclaim_data[pmc_id] = tmp - - Path("/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_part_%d"%i).mkdir() - with open("/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_part_%d/exsclaim.json"%i, 'w', encoding="utf-8") as f: - json.dump(exsclaim_data, f, indent=3) - - -def prepare_exsclaim_data(): - """ - 将subfig-subcap对齐后的exsclaim.json转化成规定的jsonl格式用于训练clip - - {"id": "1537.png", "text": "Fig...", "width": 850, "height": 644, - "subcaptions": {"1537_0.png": ['This...'], ...}, - "subfigures": [{"id": "1537_0.png", "label": "1537_0.png", "points":[[x1, y1],[x2, y2]]}, ...]} - """ - data_list = [] - - comfig_root_path = '/remote-home/share/medical/public/PMC_OA/figures/' - subfig_root_path = '/remote-home/share/medical/public/MedICaT/exsclaim_extracted/subfigures/' - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim/exsclaim.json' # result file path - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - full_caption = datum["full_caption"] - subfigure_list = [] - subcap_dict = {} - count = 0 - com_image = None - for subfigure in datum['master_images']: - # print(subfigure) - if "caption" in subfigure and len(subfigure['caption']) > 0: - # print(subfigure['caption']) - caption = ''.join(subfigure['caption']) - x1, y1 = subfigure['geometry'][0]['x'], subfigure['geometry'][0]['y'] - x2, y2 = subfigure['geometry'][3]['x'], subfigure['geometry'][3]['y'] - # print(x1, x2, y1, y2) - # print(w, h) - subfig_id = comfig_id.split('.jpg')[0] + '_' + str(count) + '.jpg' - subcap_dict[subfig_id] = caption - # Read Compound Image File - if count == 0: - com_image = np.array(Image.open(comfig_root_path+comfig_id).convert('RGB')) - h, w, _ = com_image.shape - try: - sub_image = com_image[y1:y2, x1:x2] - # print(com_image.shape, sub_image.shape) - sub_image = Image.fromarray(sub_image) - sub_image.save(subfig_root_path+subfig_id) - tmp_dict = {'id':subfig_id, 'label':subfig_id, 'points':[[x1, y1],[x2, y2]]} - subfigure_list.append(tmp_dict) - count += 1 - # print('yes') - except: - print(x1, x2, y1, y2) - print(com_image.shape, sub_image.shape) - continue - else: - continue - - if count == 0: - continue - else: - data_dict = {"id":comfig_id, "height":h, "width":w, "caption":full_caption, "subfigures":subfigure_list, "subcaptions":subcap_dict} - data_list.append(data_dict) - - print(data_list) - f = open('/remote-home/zihengzhao/CompoundFigure/exsclaim-data/data.jsonl', 'w') - for line in data_list: - f.write(json.dumps(line)+'\n') - f.close() - - -def divide_before_sep(): - """ - 将caption_T060_filtered_top4分成50份再分割 - """ - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - - for i in range(0, len(data), len(data)//50): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/%d.jsonl'%(i//(len(data)//50)), 'w') - for line in data[i : min(i+len(data)//50, len(data))]: - f.write(json.dumps(line)+'\n') - f.close() - print(i, min(i+len(data)//50, len(data))) - - -def search_division_by_figure_id(figure_id): - """ - 将caption_T060_filtered_top4分成50份后, 查找某一figure id在哪一份中 - """ - for i in range(51): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/%d.jsonl'%i) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - if datum['id'] == figure_id: - print('in %d.jsonl'%i) - exit() - else: - continue - - -def filter_unsep_figure(): - """ - 筛选caption_T060_filtered_top4被分成50份后, 每一份中尚未被sep的figure - """ - for i in tqdm(range(51)): - processed_data = [] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_%d.jsonl'%i) - lines = f.readlines() - processed_data += [json.loads(line)['image_id'] for line in lines] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v2_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v2_%d.jsonl'%i) - lines = f.readlines() - processed_data += [json.loads(line)['image_id'] for line in lines] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v3_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v3_%d.jsonl'%i) - lines = f.readlines() - processed_data += [json.loads(line)['image_id'] for line in lines] - - unprocessed_data = [] - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/%d.jsonl'%i) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - if datum['id'] in processed_data: - continue - else: - unprocessed_data.append(datum) - - if len(unprocessed_data) > 0: - print('unsep %d in %d' % (len(unprocessed_data), i)) - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/unsep_%d.jsonl'%i, 'w') - for line in unprocessed_data: - f.write(json.dumps(line)+'\n') - f.close() - - -def aggregate_sep_figure(): - """ - caption_T060_filtered_top4被分成50份分割后, 聚合分割结果 - """ - processed_data = [] - for i in tqdm(range(51)): - total_num = 7621 if i < 50 else 46 - tmp_data_count = [] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_%d.jsonl'%i) - lines = f.readlines() - tmp_data_count += [json.loads(line) for line in lines] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v2_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v2_%d.jsonl'%i) - lines = f.readlines() - tmp_data_count += [json.loads(line) for line in lines] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v3_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v3_%d.jsonl'%i) - lines = f.readlines() - tmp_data_count += [json.loads(line) for line in lines] - if len(tmp_data_count) == 7621 or len(tmp_data_count) == 46: - processed_data += tmp_data_count - else: - print('Not Aligned! Sep %d : Total %d'%(len(tmp_data_count), total_num)) - # 有重复的分割 - tmp_data_count = [] - tmp_comfig_count = [] - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_%d.jsonl'%i) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - if datum['image_id'] not in tmp_comfig_count: - tmp_comfig_count.append(datum['image_id']) - tmp_data_count.append(datum) - else: - continue - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v2_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v2_%d.jsonl'%i) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - if datum['image_id'] not in tmp_comfig_count: - tmp_comfig_count.append(datum['image_id']) - tmp_data_count.append(datum) - else: - continue - if Path('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v3_%d.jsonl'%i).exists(): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_sep/sep_results_v3_%d.jsonl'%i) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - if datum['image_id'] not in tmp_comfig_count: - tmp_comfig_count.append(datum['image_id']) - tmp_data_count.append(datum) - else: - continue - assert len(tmp_data_count) == 7621 or len(tmp_data_count) == 46, print(len(tmp_data_count)) - processed_data += tmp_data_count - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_result_v1.jsonl', 'w') - for line in processed_data: - f.write(json.dumps(line)+'\n') - f.close() - - -def aggregate_sep_caption(): - """ - caption_T060_filtered_top4被分成10份断句后, 聚合结果 - """ - aggregate_dict = {} - for i in tqdm(range(10)): - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_part_%d/exsclaim.json'%i - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - aggregate_dict[comfig_id] = datum - - f = open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v1.json', 'w') - f.write(json.dumps(aggregate_dict)) - f.close() - - -def reformat_sep_results_v0(): - """ - 将caption_T060_filtered_top4的分割结果(detr, v0)reformat成comfig--subfig_list的形式, - 并和exsclaim的分割结果拼起来 - """ - # 先统计每个comfig分出来的caption - comfig2subcaps = {} - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim/exsclaim.json' # result file path - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - cap_ls = [] - for cap in datum['unassigned']['captions']: - if len(cap['description']) > 0: - cap_ls += cap['description'] - for subfigure in datum['master_images']: - if "caption" in subfigure and len(subfigure['caption']) > 0: - cap_ls += subfigure['caption'] - if len(cap_ls) > 0: - comfig2subcaps[comfig_id] = cap_ls - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_result.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - reformat_results = [] # {comfig_id, subfig_ids:[...], subfig_locs:[...]} - cur_comfig_id = data[0]['source_fig_id']+'.jpg' - cur_comfig_dict = {'comfig_id':cur_comfig_id, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[]} - for datum in tqdm(data): - source_fig_id = datum['source_fig_id']+'.jpg' - if source_fig_id not in comfig2subcaps: - continue - if source_fig_id != cur_comfig_id: - if len(cur_comfig_dict['subfig_ids'])>0: - reformat_results.append(cur_comfig_dict) - cur_comfig_id = source_fig_id - cur_comfig_dict = {'comfig_id':cur_comfig_id, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'subcaps':comfig2subcaps[cur_comfig_id]} - cur_comfig_dict['subfig_ids'].append(datum['id']) - cur_comfig_dict['subfig_locs'].append(datum['position']) - cur_comfig_dict['subfig_scores'].append(datum['score']) - - if len(cur_comfig_dict['subfig_ids'])>0: - reformat_results.append(cur_comfig_dict) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_results_v0_com2sub.jsonl', 'w') - for line in reformat_results: - f.write(json.dumps(line)+'\n') - f.close() - - -def reformat_sep_results_v1(): - """ - 将caption_T060_filtered_top4的分割结果(fasterRCNN, v1)reformat成comfig--subfig_list的形式, 以及subfig--comfig--score--caption的形式 - 并和exsclaim的分割结果拼起来 - """ - # 先统计每个comfig分出来的caption - subcap_num = 0 - separable_comfig_num = 0 - comfig2subcaps = {} - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' # exsclaim分割的cap(没有分割subfig也没有对齐,所以都在unassign里) - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - cap_ls = [datum['full_caption']] # [caption, subcap1, ......] - for cap in datum['unassigned']['captions']: - if len(cap['description']) > 0: - cap_ls += cap['description'] - for subfigure in datum['master_images']: - if "caption" in subfigure and len(subfigure['caption']) > 0: - cap_ls += subfigure['caption'] - comfig2subcaps[comfig_id] = cap_ls - if len(cap_ls) > 1: - separable_comfig_num += 1 - subcap_num += (len(cap_ls) - 1) - - print('%d Separable Out of %d, Avg %.2f Subcaptions'%(separable_comfig_num, len(comfig2subcaps), subcap_num/separable_comfig_num)) - - exception = 0 - subfig_id = 0 - comfig_path = '/remote-home/share/medical/public/PMC_OA/figures' - subfig_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_result_v1' - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - reformat_comfig2subfig_results = [] # [ ... {comfig_id, subfig_ids:[...], subfig_locs:[...], subfig_scores:[...], subcaps:[...], caption} ... ] - reformat_subfig2comfig_results = [] # [ ... {subfig_id, comfig_id, subfig_loc:[...], subfig_score, caption} ... ] - for datum in tqdm(data): - comfig_id = datum['image_id'] - com_image = np.array(Image.open('%s/%s'%(comfig_path, comfig_id)).convert('RGB')) - h, w, _ = com_image.shape - comfig_dict = {'comfig_id':comfig_id, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'subcaps':comfig2subcaps[comfig_id][1:], 'caption':comfig2subcaps[comfig_id][0]} - for loc, score in zip(datum['predictions']['boxes'], datum['predictions']['scores']): # [x1 y1 x2 y2], 0.9 - # print(com_image.shape, sub_image.shape) - try: - x1, y1, x2, y2 = [int(pos) for pos in loc] - sub_image = com_image[y1:y2, x1:x2] - sub_image = Image.fromarray(sub_image) - sub_image.save('%s/%d.jpg'%(subfig_path, subfig_id)) - reformat_subfig2comfig_results.append({'subfig_id':'%d.jpg'%subfig_id, 'comfig_id':comfig_id, 'subfig_loc':[x1/w, y1/h, x2/w, y2/h], 'subfig_score':score, 'caption':comfig2subcaps[comfig_id][0]}) - comfig_dict['subfig_ids'].append('%d.jpg'%subfig_id) - comfig_dict['subfig_locs'].append([x1/w, y1/h, x2/w, y2/h]) - comfig_dict['subfig_scores'].append(score) - subfig_id += 1 - except: - print(x1, x2, y1, y2) - print(com_image.shape) - exception += 1 - - reformat_comfig2subfig_results.append(comfig_dict) - - print('Avg %d Subfigures, Abandon %d Subfigures'%(len(reformat_subfig2comfig_results)/len(reformat_comfig2subfig_results)), exception) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1_com2sub.jsonl', 'w') - for line in reformat_comfig2subfig_results: - f.write(json.dumps(line)+'\n') - f.close() - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1_sub2com.jsonl', 'w') - for line in reformat_subfig2comfig_results: - f.write(json.dumps(line)+'\n') - f.close() - - -def divide_before_extract_and_filter(): - """ - 将整合去重后的fasterRCNN分割结果分成10份以便并行提取subfig - """ - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - for i in range(0, len(data), len(data)//10): - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_filter/%d.jsonl'%(i//(len(data)//10)), 'w') - for line in data[i : min(i+len(data)//10, len(data))]: - f.write(json.dumps(line)+'\n') - f.close() - print(i, min(i+len(data)//10, len(data))) - - -def extract_reid_subfigs_fromFasterRCNN(part_id): - """ - 根据fasterRCNN的分割结果, 把subfig提取出来(并行10份) - """ - comfig_path = '/remote-home/share/medical/public/PMC_OA/figures' - subfig_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_result_v1' - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_before_extract_filter/%d.jsonl'%part_id) - lines = f.readlines() - data = [json.loads(line) for line in lines] - exception = 0 - subfig_id = 0 - reformat_subfig2comfig_results = [] # [ ... {subfig_id, comfig_id, subfig_loc:[...], subfig_score, caption} ... ] - for datum in tqdm(data): - comfig_id = datum['image_id'] - com_image = np.array(Image.open('%s/%s'%(comfig_path, comfig_id)).convert('RGB')) - h, w, _ = com_image.shape - for loc, score in zip(datum['predictions']['boxes'], datum['predictions']['scores']): # [x1 y1 x2 y2], 0.9 - # print(com_image.shape, sub_image.shape) - x1, y1, x2, y2 = [int(pos) for pos in loc] - x1 = max(x1, 0) - y1 = max(y1, 0) - x2 = min(w, x2) - y2 = min(h, y2) - if x1 == x2 or y1 == y2: - continue - if Path('%s/part_%d_%d.jpg'%(subfig_path, part_id, subfig_id)).exists(): - # 已经save过subfig了 - print('part_%d_%d.jpg'%(part_id, subfig_id)) - else: - sub_image = com_image[y1:y2, x1:x2] - sub_image = Image.fromarray(sub_image) - sub_image.save('%s/part_%d_%d.jpg'%(subfig_path, part_id, subfig_id)) - reformat_subfig2comfig_results.append({'subfig_id':'part_%d_%d.jpg'%(part_id, subfig_id), 'comfig_id':comfig_id, 'subfig_loc':[x1/w, y1/h, x2/w, y2/h], 'subfig_score':score}) - subfig_id += 1 - print('%d Compoundfigures Has %d Subfigures, Avg %.1f Subfigures, Abandon %d Subfigures'%(len(data), len(reformat_subfig2comfig_results), len(reformat_subfig2comfig_results)/len(data), exception)) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1_sub2com_unfiltered_part%d.jsonl'%part_id, 'w') - for line in reformat_subfig2comfig_results: - f.write(json.dumps(line)+'\n') - f.close() - - -def pair_subfig_and_loc_score(): - """ - 将v0的subfig&caption和subfig_loc, subfig_score配对起来, 得到每个(经过resnext过滤的)subfig的完整信息 - """ - comfig_hw_dict = {} - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4.jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - comfig_hw_dict[datum['id']] = [datum['height'], datum['width']] - - subfig_loc_score_dict = {} - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(score).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in tqdm(data): - comfig_id = datum['source_fig_id'] + '.jpg' - subfig_id = datum['source_fig_id'] + '_' + datum['id'] - locs = datum['position'] - x1, y1 = locs[0] - x2, y2 = locs[1] - h, w = comfig_hw_dict[comfig_id] - normed_locs_and_score = [x1/w, y1/h, x2/w, y2/h, datum['score']] - subfig_loc_score_dict[subfig_id] = normed_locs_and_score - - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(caption).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - new_data = [] - for datum in tqdm(data): - subfig_id = datum['image'].split('/')[-1] - normed_locs_and_score = subfig_loc_score_dict[subfig_id] - datum['subfig_loc'] = normed_locs_and_score[:4] - datum['subfig_score'] = normed_locs_and_score[-1] - new_data.append(datum) - - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com.jsonl' - f = open(path, 'w') - for datum in tqdm(new_data): - f.write(json.dumps(datum)+'\n') - - -def pair_comfig_and_subfig_subcap(): - """ - 聚合subfig的完整信息,得到comfig的完整信息:subfig的完整信息 + subcaptions - """ - - def are_same_text(t1, t2, tokenizer): - if t1 == t2: - return True - if t1[:-1] == t2: - return True - if t1 == t2[:-1]: - return True - if tokenizer.tokenize(t1) == tokenizer.tokenize(t2): - return True - else: - return False - - from transformers import AutoTokenizer - tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - # 加载所有的subcap,和comfig对上 - comfig2subcaps = {} - subcap_num = 0 - separable_comfig_num = 0 - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' # exsclaim分割的cap(没有分割subfig也没有对齐,所以都在unassign里) - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - cap_ls = [datum['full_caption']] # [caption, subcap1, ......] - for cap in datum['unassigned']['captions']: - if len(cap['description']) > 0: - for text in cap['description']: - if not are_same_text(text, datum['full_caption'], tokenizer): - cap_ls.append(text) - for subfigure in datum['master_images']: - if "caption" in subfigure and len(subfigure['caption']) > 0: - for text in subfigure['caption']: - if not are_same_text(text, datum['full_caption'], tokenizer): - cap_ls.append(text) - comfig2subcaps[comfig_id] = cap_ls - if len(cap_ls) > 1: - separable_comfig_num += 1 - subcap_num += (len(cap_ls) - 1) - print('%d Separable Out of %d, Avg %.2f Subcaptions'%(separable_comfig_num, len(comfig2subcaps), subcap_num/separable_comfig_num)) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2subcap.jsonl', 'w') as f: - for comfig, subcap_ls in comfig2subcaps.items(): - item = {'comfig_id':comfig, 'caption':subcap_ls[0], 'subcaptions':subcap_ls[1:]} - f.write(json.dumps(item) + '\n') - - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com.jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - new_data = [] # {comfig_id, subfig_ids:[...], subfig_locs:[...], subfig_scores:[...], caption, subcaptions:[...]} - cur_comfig_id = data[0]['media_name'] - subcaps = comfig2subcaps[cur_comfig_id][1:] if cur_comfig_id in comfig2subcaps else [] - cur_comfig_dict = {'comfig_id':cur_comfig_id, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'caption':data[0]['caption'], 'subcaptions':subcaps} - for datum in tqdm(data): - comfig_id = datum['media_name'] - if comfig_id != cur_comfig_id: - new_data.append(cur_comfig_dict) - cur_comfig_id = comfig_id - subcaps = comfig2subcaps[cur_comfig_id][1:] if cur_comfig_id in comfig2subcaps else [] - cur_comfig_dict = {'comfig_id':cur_comfig_id, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'caption':datum['caption'], 'subcaptions':subcaps} - cur_comfig_dict['subfig_ids'].append(datum['image'].split('/')[-1]) - cur_comfig_dict['subfig_locs'].append(datum['subfig_loc']) - cur_comfig_dict['subfig_scores'].append(datum['subfig_score']) - - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub.jsonl', 'w') as f: - for line in new_data: - f.write(json.dumps(line) + '\n') - - -def pair_subcap_and_subfig(): - """ - 将exsclaim的subcap和detr的分割subfig配对起来 - """ - #{ - # 'comfig_id':cur_comfig, - # 'subfig_ids':[], - # 'subfig_locs':[], - # 'subfig_scores':[], - # 'caption':'caption', - # 'subcaptions':['subcaps' ...] - # } - - # 加载所有的subcap,和comfig对上 - comfig2subcaps = {} - subcap_num = 0 - separable_comfig_num = 0 - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' # exsclaim分割的cap(没有分割subfig也没有对齐,所以都在unassign里) - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - cap_ls = [datum['full_caption']] # [caption, subcap1, ......] - for cap in datum['unassigned']['captions']: - if len(cap['description']) > 0: - cap_ls += cap['description'] - for subfigure in datum['master_images']: - if "caption" in subfigure and len(subfigure['caption']) > 0: - cap_ls += subfigure['caption'] - comfig2subcaps[comfig_id] = cap_ls - if len(cap_ls) > 1: - separable_comfig_num += 1 - subcap_num += (len(cap_ls) - 1) - print('%d Separable Out of %d, Avg %.2f Subcaptions'%(separable_comfig_num, len(comfig2subcaps), subcap_num/separable_comfig_num)) - - # 加载所有的comfig其他信息 - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - new_data = [] - for datum in data: - comfig_id = datum['comfig_id'] - subfig_ids_new = ['%s_%s'%(comfig_id[:-4], subfig) for subfig in datum['subfig_ids']] - datum['subfig_ids'] = subfig_ids_new - datum['full_caption'] = comfig2subcaps[comfig_id][0] - datum['sub_captions'] = comfig2subcaps[comfig_id][1:] - new_data.append(datum) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(caption).jsonl') - for line in new_data: - f.write(json.dumps(line)) - f.close() - - -def stat_subcap_subfig_pair(): - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - comfig_w_subfig = 0 - comfig_w_subcap = 0 - comfig_w_both = 0 - for datum in data: - if len(datum['subfig_ids']) > 0: - comfig_w_subfig += 1 - if len(datum['subcaptions']) > 0: - comfig_w_subcap += 1 - if len(datum['subfig_ids']) > 0 and len(datum['subcaptions']) > 0: - comfig_w_both += 1 - - print('%d Comfig has Subfigs, %d has Subcaptions, %d has Both'%(comfig_w_subfig, comfig_w_subcap, comfig_w_both)) - - from transformers import AutoTokenizer - tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(new).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - threshold = [0 for i in range(10)] - total_token_len = 0 - total_subcap_num = 0 - for datum in data: - if datum['subcaption'] != '': - total_token_len += len(tokenizer.tokenize(datum['subcaption'])) - total_subcap_num += 1 - for i in range(9, -1, -1): - if datum['subcap_score'] > i/10: - for j in range(i+1): - threshold[j] += 1 - break - for i in range(10): - print('threshold %f has %d'%((i)/10, threshold[i])) - - print('Avg %.2f Tokens'%(total_token_len/total_subcap_num)) - - -def aggregate_subcap_info(): - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/others/caption_T060_filtered_top4_sep_v0_sub2com(没有subcap).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - sub2com = {} - for datum in tqdm(data): - subfig_id = datum['image'].split('/')[-1] - datum['subfig_id'] = subfig_id - datum['subcaption'] = '' - datum['subcap_score'] = 0.0 - sub2com[subfig_id] = datum - - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/others/caption_T060_filtered_top4_sep_v0_subfig2subcap.jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in tqdm(data): - subfig_id = datum['subfig_id'] - sub2com[subfig_id]['subcaption'] = datum['subcaption'] - sub2com[subfig_id]['subcap_score'] = datum['confidence_score'] - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(new).jsonl', 'w') - for _, datum in tqdm(sub2com.items()): - f.write(json.dumps(datum)+'\n') - f.close() - - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/others/caption_T060_filtered_top4_sep_v0_com2sub(没有对齐subfig和subcap).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - new_data = [] - count_assigned_subcap = 0 - for datum in tqdm(data): - subcaps = datum['subcaptions'] - subcap_scores = [] - subcap_indexes = [] - for subfig_id in datum['subfig_ids']: - subcap = sub2com[subfig_id]['subcaption'] - subcap_scores.append(sub2com[subfig_id]['subcap_score']) - if subcap == "": - subcap_indexes.append(-1) - else: - subcap_indexes.append(subcaps.index(subcap)) - count_assigned_subcap += 1 - datum['subcap_indexes'] = subcap_indexes - datum['subcap_scores'] = subcap_scores - new_data.append(datum) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl', 'w') - for datum in tqdm(new_data): - f.write(json.dumps(datum)+'\n') - f.close() - - print('%d Assigned'%(count_assigned_subcap)) - - -def visualization_subfig_subcap_align(np_image, normed_subfig_locs, subfig_scores, subcaps, subcap_scores, subcap_indexes, full_caption, path): - """ - Visualization a compound figure inference result - - Args: - image tensor: (3, h, w) - original_h/w: scalar - boxes tensor or list of tensors: (pred_num, 4) / [pred_num, (4)], (x1, y1, x2, y2) ratio of the image - - path string: path to save the figure - """ - color_ls = ['red', 'darkred', 'lightcoral', 'orangered', 'sienna', 'sandybrown', - 'gold', 'olive', 'olivedrab', 'yellowgreen', 'darkseagreen', 'green', - 'lightseagreen', 'skyblue', 'steelblue', 'deepskyblue', 'dodgerblue', - 'blue', 'darkblue', 'blueviolet', 'violet'] - random.shuffle(color_ls) - - padded_h, padded_w, _ = np_image.shape - - fig = plt.figure(dpi=300)#, figsize=(5, 5*unpadded_h/unpadded_w)) - plt.subplots_adjust(hspace=0.05, wspace=0.05) - - ax = fig.add_subplot(3, 2, 1) - ax.imshow(np_image, interpolation=None) - plt.axis("off") - - subcaps_to_plot = [] - for i in range(len(normed_subfig_locs)): - x1 = (normed_subfig_locs[i][0]) * padded_w - y1 = (normed_subfig_locs[i][1]) * padded_h - rec_w = (normed_subfig_locs[i][2]-normed_subfig_locs[i][0]) * padded_w - rec_h = (normed_subfig_locs[i][3]-normed_subfig_locs[i][1]) * padded_h - if subcap_indexes[i]!=-1: - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor=color_ls[i%21], linewidth=1) # the same color as the matched gt - ax.add_patch(rect) - subcaps_to_plot.append('%d(%.2f):%s'%(i, subcap_scores[i], subcaps[subcap_indexes[i]])) # the same color as the matched gt - ax.text(x1+2, y1-2, '%.2f'%subfig_scores[i], wrap=True, color=color_ls[i%21],fontsize=10) - else: - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor='grey', linewidth=1) # the same color as the matched gt - ax.add_patch(rect) - - ax = fig.add_subplot(3, 2, 2) - plt.axis("off") - for i, cap in enumerate(subcaps_to_plot): - ax.text(0, i/len(subcaps_to_plot), cap, wrap=True, color=color_ls[i%21], fontsize=5) - - subcaps_to_plot = [] - for i in range(len(subcaps)): - if i not in subcap_indexes: - subcaps_to_plot.append(subcaps[i]) - - ax = fig.add_subplot(3, 2, 3) - plt.axis("off") - for i, cap in enumerate(subcaps_to_plot): - ax.text(0, i/len(subcaps_to_plot), cap, wrap=True, color='grey', fontsize=5) - - ax = fig.add_subplot(3, 2, 5) - ax.text(0, 0, full_caption, wrap=True, color='black',fontsize=8) - plt.axis("off") - - # plt.tight_layout() - plt.savefig(path) - plt.close() - - -def cherry_pick(): - """ - 找一些subcap-subfig对齐的sample - """ - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in tqdm(data[0:1000]): - if "PMC8253756_Fig2.jpg" == datum['comfig_id']: - for sub_cap in datum['subcaptions']: - print(sub_cap) - exit() - else: - continue - img = Image.open('/remote-home/share/medical/public/PMC_OA/figures/'+datum['comfig_id']).convert('RGB') - np_image = np.array(img) - normed_subfig_locs = datum['subfig_locs'] - subfig_scores = datum['subfig_scores'] - subcaps = datum['subcaptions'] - subcap_scores = datum['subcap_scores'] - subcap_indexes = datum['subcap_indexes'] - full_caption = datum['caption'] - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/挑图/%s'%datum['comfig_id'] - visualization_subfig_subcap_align(np_image, normed_subfig_locs, subfig_scores, subcaps, subcap_scores, subcap_indexes, full_caption, path) - - -def cherry_pick_forT060(): - """ - 找一些被T060过滤掉的nonmedical的sample - """ - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' - f = open(path) - lines = f.readlines() - filtered = [json.loads(line)['comfig_id'] for line in lines] - - path = '/remote-home/share/medical/public/PMC_OA/0.jsonl' - f = open(path) - lines = f.readlines() - data = [json.loads(line) for line in lines] - for datum in data: - if datum['media_name'] not in filtered: - print('filtered:', datum['media_name']) - shutil.copy('/remote-home/share/medical/public/PMC_OA/figures/'+datum['media_name'], '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/挑图(T060)/'+datum['media_name']) - else: - print(datum['media_name']) - - -def cherry_pick_forEXSCALIM(): - """ - 找一些subcap-subfig对齐的sample - """ - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json', 'r') as f: - exsclaim_data = json.load(f) - - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/挑图(subfig&subcap)' - picked_samples = {} - for root, dirs, files in os.walk(path, topdown=False): - for comfig in files: - picked_samples[comfig] = exsclaim_data[comfig] - - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_1000_samples/exsclaim.json', 'w') as f: - json.dump(picked_samples, f, indent=3) - - -def compare_EXSCLAIM_MedCLIP(): - """ - 在可视化我们的方法和EXSCLAIM之后,两张可视化拼在一起, - 对比我们的方法和EXSCLAIM的差距 - """ - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/挑图(subfig&subcap)/' - exsclaim_visual_root = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_1000_samples/visualization/' - for root, dirs, files in os.walk(path, topdown=False): - for comfig in tqdm(files): - save_path = "/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/挑图(subfig&subcap)/compare_visual/" + comfig - # concat image - our_img = Image.open(path+comfig) - w, h = our_img.size - exsclaim_img = Image.open(exsclaim_visual_root+comfig) - result = Image.new(our_img.mode, (w*2, h)) - result.paste(our_img, box=(0, 0)) - result.paste(exsclaim_img, box=(w, 0)) - result.save(save_path) - - -def statis_pmc_ids(): - """ - 统计PMC_id,也即所有爬到过的paper的数量 - """ - ids = [] - for i in range(10): - last_num = len(ids) - f = open('/remote-home/share/medical/public/PMC_OA/%d.jsonl'%i, 'r') - lines = f.readlines() - data = [json.loads(line) for line in lines] - last_pmc = data[0]['PMC_ID'] - for datum in data: - if datum['PMC_ID'] != last_pmc: - # a new id - ids.append(last_pmc) - last_pmc = datum['PMC_ID'] - ids.append(last_pmc) - print('in %d.jsonl, %d'%(i, len(ids)-last_num)) - print('total num %d'%len(ids)) - - -def statis_caption_length(): - """ - 所有subcap的长度和(不能打开的)caption的长度 - """ - from transformers import AutoTokenizer - tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(new).jsonl', 'r') - lines = f.readlines() - data = [json.loads(line) for line in lines] - subcap_num = 0 - subcap_len = 0 - cap_num = 0 - cap_len = 0 - for datum in tqdm(data): - if datum['subcaption'] != "": - subcap_len += len(tokenizer.tokenize(datum['subcaption'])) - subcap_num += 1 - else: - cap_len += len(tokenizer.tokenize(datum['caption'])) - cap_num += 1 - print('Avg Cap Len %.2f'%(cap_len/cap_num)) - print('Avg Subcap Len %.2f'%(subcap_len/subcap_num)) - - -def filter_medical_from_imageclef2016(): - """ - 将imageclef2016中的medical图像过滤出来 - """ - score_dict = {} - score_file = json.load(open('/remote-home/share/medical/public/ImageCLEF2016/medtask/filtered_diagnosis_comfig.json', 'r')) - for image_path in score_file.keys(): - image_id = image_path.split('/')[-1] - score_dict[image_id] = np.argmax(np.array(score_file[image_path])) - - f = open('/remote-home/share/medical/public/ImageCLEF2016/medtask/train_and_test_comfigs.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - filtered_data = [] - for datum in tqdm(data): - if score_dict[datum['id']] == 15: - shutil.copy(os.path.join('/remote-home/share/medical/public/ImageCLEF2016/medtask/new_id_comfigs', datum['id']), os.path.join('/remote-home/share/medical/public/MedICaT/compound_figures/comfig_with_imageclef2016', str(len(filtered_data) + 2119) + '.jpg')) - new_id_datum = datum - new_id_datum['id'] = str(len(filtered_data) + 2119) + '.jpg' - filtered_data.append(new_id_datum) - - f = open('/remote-home/share/medical/public/ImageCLEF2016/medtask/(filtered)train_and_test_comfigs.jsonl', "w") - for line in filtered_data: - f.write(json.dumps(line)+'\n') - f.close() - - - - -if __name__ == "__main__": - statis_caption_length() - - - - diff --git a/openpmcvl/granular/process/dataset_clip_align.py b/openpmcvl/granular/process/dataset_clip_align.py deleted file mode 100644 index 4f495d9..0000000 --- a/openpmcvl/granular/process/dataset_clip_align.py +++ /dev/null @@ -1,718 +0,0 @@ -from tqdm import tqdm -import torch -from torch.utils.data import Dataset -import json -from PIL import Image -from pytorch_pretrained_bert import BertTokenizer -import torch.nn.functional as F -from torchvision import transforms -from augmentation_tools import Augmentation_Tool -import numpy as np -from transformers import AutoTokenizer -import random - -def convert_to_wordpieces(tokenizer, tokens, subcaps): - """ - Tokenize the tokens accroding to the vocab of the pretrained bert, and re-index the subcaption spans - - Args: - tokenizer (BertTokenizer): pretrained tokenizer - tokens (list): a lits of tokens, e.g. ['This', 'is' ...] - subcaps (dict): a dict of subcaptions label and corresponding span, e.g. {'a':[1, 2, 3, 4] ...} - - Returns: - new tokens and new subcaps after - """ - # 首先,对token进行进一步细粒度的切分,例如lover-->lov+er,使得token符合vocab中的规范 - token_to_wordpiece_map = {} - new_tokens = [] - for index, token in enumerate(tokens): - token_to_wordpiece_map[index] = len(new_tokens) # 第i个token对应的起始wordpiece index - new_tokens += tokenizer.tokenize(token) # 第i个token分成的wordpiece - token_to_wordpiece_map[len(tokens)] = len(new_tokens) # 最后一个token无意义 - # 然后,根据更细的新“token”(又称wordpiece),重新划定token和span - new_subcaps = {} - for label in subcaps: - wordpieces_idx = [] - for idx in subcaps[label]: - wordpieces_idx += [tmp for tmp in range(token_to_wordpiece_map[idx], token_to_wordpiece_map[idx+1])] - new_subcaps[label] = wordpieces_idx - return new_tokens, new_subcaps - - -# 以subfig为单位读取subfig--[all subcap],V1版本处理使用 -class SentenceWise_Align_Dataset_Infer_V1(Dataset): - def __init__(self, filepath, input_size=224): - print('Sentence-Wise Align Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256, ......} - - self.tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - print("%d Subfigure" % len(lines)) - - abandon_count = 0 - for datum in tqdm(data): - """ - { - 'image_path': '/remote-home/.../PMC212319_Fig3_0.jpg', # subfigure path - 'full_caption': 'A. Real time image ...', # full caption - 'media_name': 'PMC212319_Fig3.jpg', # fig id - 'subfig_loc': [x1, y1, x2, y2], # normed to 0~1 - 'subfig_score': 0.9, # subfigure's detection confidence score - 'subfig': 'PMC212319_Fig3_0.jpg', - 'subcaptions': ['collected ...', ...] - } - """ - subcaptions = [] - untokenized_subcaptions = [] - for subcap_label, subcap in datum["subcaptions"]['subcaptions'].items(): # {A:xxx, B:xxx, ...} - subcap_token_ls = self.tokenizer.tokenize(subcap) - tmp = ['[CLS]'] + subcap_token_ls + ['[SEP]'] - tmp = torch.tensor(self.tokenizer.convert_tokens_to_ids(tmp)) - if tmp.shape[0] < 78 and tmp.shape[0] > 2: - pad = (0, 77-tmp.shape[0]) - tmp = F.pad(tmp, pad, 'constant', 0) # [subcap_num, (77)] - subcaptions.append(tmp) - untokenized_subcaptions.append(subcap) - elif tmp.shape[0] > 77: - tmp = tmp[:77] - subcaptions.append(tmp) - untokenized_subcaptions.append(subcap) - - if len(subcaptions) == 0: - if len(datum["subcaptions"]) > 0: - abandon_count += 1 - continue - - # quanlified train data - image_info = {} - image_info["path"] = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/subfigures/' + datum['subfig_id'] - image_info['tokenized_subcaptions'] = subcaptions # all the candidate subcaps, [subcap_num, tensor(77)] - image_info['untokenized_subcaptions'] = untokenized_subcaptions - del datum['subcaptions'] - image_info['subfigure_info'] = datum - - self.images.append(image_info) - - self.input_size = input_size - print('Keep %d Subfigures, %d are Aborted' % (len(self.images), abandon_count)) - - def __len__(self): - return len(self.images) - - def __getitem__(self, index): - unpadded_image = Image.open(self.images[index]['path']).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - - subcaptions = self.images[index]['tokenized_subcaptions'] # [subcap_num, tensor(77)] - subcaptions = torch.stack(subcaptions, dim=0) # (subcap_num, 77) - - untokenized_subcaptions = self.images[index]['untokenized_subcaptions'] # [subcap_num of strings] - subfigure_info = self.images[index]['subfigure_info'] - - return unpadded_image, subcaptions, untokenized_subcaptions, subfigure_info, self.input_size - -def sentencewise_align_collate_infer_v1(data): - """ - Pad input samples in a batch - - Args: - data : list of samples - - Returns: - a dictionary for batch input - """ - max_subcap_num = 0 # 先统计最大的subcap num - for unit in data: - _, subcaptions, _, _, _ = unit - if subcaptions.shape[0] > max_subcap_num: - max_subcap_num = subcaptions.shape[0] - - pad_imgs = [] - pad_subcaps = [] # (bs, subcap_num, 77) - untokenized_subcaption_ls = [] - nopad_subcap_idx_ls = [] # [bs] - subfigure_info_ls = [] - for unit in data: - unpadded_image, subcaptions, untokenized_subcaptions, subfigure_info, input_size = unit - untokenized_subcaption_ls.append(untokenized_subcaptions) - subfigure_info_ls.append(subfigure_info) - # bbox info - # resize+pad image - _, h, w = unpadded_image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size(512)以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成512x512 - pad_imgs.append(padded_img) - # padd subcaptions - pad = (0, 0, 0, max_subcap_num-subcaptions.shape[0]) - padded_subcap = F.pad(subcaptions, pad, 'constant', 0) # (max_subcap_num, 77) - pad_subcaps.append(padded_subcap) - nopad_subcap_idx_ls.append(subcaptions.shape[0]) - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_w, max_h) - pad_subcaps = torch.stack(pad_subcaps, dim=0) # (bs, subcap_num, 77) - - return {'image':pad_imgs, 'subcaptions':pad_subcaps, 'untokenized_subcaptions':untokenized_subcaption_ls, 'nopad_subcap_idx':nopad_subcap_idx_ls, 'subfigure_info':subfigure_info_ls} - - -########################################### 分割线:V0版本代码 before MICCAI - - -# 基于分割好的Subfig和Subcap,以figure为单位采样 -class SentenceWise_Align_Dataset_Infer(Dataset): - def __init__(self, filepath, image_root, input_size=224): - print('Sentence-Wise Align Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256, ......} - - self.tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - print("%d Compound Figure" % len(lines)) - - self.all_subcap_list = [] - abandon_count = 0 - for datum in tqdm(data): - #{ - # 'comfig_id':cur_comfig, - # 'subfig_ids':[], - # 'subfig_locs':[], - # 'subfig_scores':[], - # 'caption':'caption', - # 'subcaptions':['subcaps' ...] - # } - - # Don't include figures that don't have subfigures - if 'subfig_ids' not in datum or datum['subfig_ids']==None or len(datum['subfig_ids']) == 0: - print('No subfig but %d subcap'%len(datum["subcaptions"])) - continue - # Don't include figures that lack subcaptions (detection不需要这一步 - if "subcaptions" not in datum or datum["subcaptions"] == None or len(datum["subcaptions"]) == 0: - continue - - subcaptions = [] - untokenized_subcaptions = [] - for subcap in datum["subcaptions"]: - subcap_token_ls = self.tokenizer.tokenize(subcap) - tmp = ['[CLS]'] + subcap_token_ls + ['[SEP]'] - tmp = torch.tensor(self.tokenizer.convert_tokens_to_ids(tmp)) - if tmp.shape[0] < 78 and tmp.shape[0] > 2: - pad = (0, 77-tmp.shape[0]) - tmp = F.pad(tmp, pad, 'constant', 0) # [subcap_num, (77)] - subcaptions.append(tmp) - untokenized_subcaptions.append(subcap) - - if len(subcaptions) == 0: - if len(datum["subcaptions"]) > 0: - abandon_count += len(datum["subfig_ids"]) - continue - - # check every subfigure - for normed_subfig_loc, subfig_id, subfig_score in zip(datum["subfig_locs"],datum["subfig_ids"],datum["subfig_scores"]): - x1 = normed_subfig_loc[0] - x2 = normed_subfig_loc[2] - y1 = normed_subfig_loc[1] - y2 = normed_subfig_loc[3] - # quanlified train data - image_info = {} - image_info["path"] = image_root+'/'+subfig_id - image_info['id'] = subfig_id - image_info['subcaptions'] = subcaptions # all the candidate subcaps, [subcap_num, tensor(77)] - image_info['caption_string'] = untokenized_subcaptions - image_info['location'] = [x1, y1, x2, y2] - self.images.append(image_info) - - self.input_size = input_size - print('Keep %d Subfigures, %d are Aborted for Too Long Sucaps' % (len(self.images), abandon_count)) - - def __len__(self): - return len(self.images) - - def __getitem__(self, index): - unpadded_image = Image.open(self.images[index]['path']).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - - subcaptions = self.images[index]['subcaptions'] # [subcap_num, tensor(77)] - subcaptions = torch.stack(subcaptions, dim=0) # (subcap_num, 77) - - subcaption_strings = self.images[index]['caption_string'] # [subcap_num of strings] - subfig_id = self.images[index]['id'] - loc = self.images[index]['location'] - - return unpadded_image, loc, subcaptions, subfig_id, subcaption_strings, self.input_size - -def sentencewise_align_collate_infer(data): - """ - Pad input samples in a batch - - Args: - data : list of samples - - Returns: - a dictionary for batch input - """ - max_subcap_num = 0 # 先统计最大的subcap num - for unit in data: - unpadded_image, loc, subcaptions, image_id, caption_string, input_size = unit - if subcaptions.shape[0] > max_subcap_num: - max_subcap_num = subcaptions.shape[0] - - image_ids = [] # list of strings - image_captions = [] # [bs * [subcap_num * 'subcap']] - pad_imgs = [] - pad_subcaps = [] # (bs, subcap_num, 77) - nopad_subcap_idx = [] - locations = [] - for unit in data: - unpadded_image, loc, subcaptions, image_id, caption_string, input_size = unit - image_ids.append(image_id) - image_captions.append(caption_string) - # bbox info - locations.append(loc) - # resize+pad image - _, h, w = unpadded_image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size(512)以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成512x512 - pad_imgs.append(padded_img) - # padd subcaptions - pad = (0, 0, 0, max_subcap_num-subcaptions.shape[0]) - padded_subcap = F.pad(subcaptions, pad, 'constant', 0) # (max_subcap_num, 77) - pad_subcaps.append(padded_subcap) - nopad_subcap_idx.append(subcaptions.shape[0]) - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_w, max_h) - pad_subcaps = torch.stack(pad_subcaps, dim=0) # (bs, subcap_num, 77) - locations = torch.tensor(locations) # (bs, 4) - - return {'image':pad_imgs, 'location':locations, 'image_id':image_ids, 'subcaptions':pad_subcaps, 'untokenized_subcaptions':image_captions, 'nopad_subcap_idx':nopad_subcap_idx} - - -# 基于MediCAT数据集,以subfig为单位采样 -class SentenceWise_Align_Dataset(Dataset): - def __init__(self, aug_params, filepath, image_root, normalization=False, trainset_size_ratio=1.0, input_size=224, aug_ratio=0.0): - """ - Args: - aug_params (dict): Dict of augmentation params - filepath (str): Path to dataset file - image_root (str): Root path to all subfigures - normalization (bool, optional): Normalization option. Defaults to False. - trainset_size_ratio (float, optional): Train dataset size in an epoch. Defaults to 1.0, i.e. enumerate - input_size (int, optional): Input image size . Defaults to 512. - aug_ratio (float, optional): Random aug samples from other compoundfigures. Defaults to 0.0. - """ - print('Sentence-Wise Align Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256, ......} - - self.tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - if normalization: - self.image_transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - else: - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # aug param - self.aug_tool = Augmentation_Tool(aug_params) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - print("%d Compound Figure" % len(lines)) - - self.all_subcap_list = [] - abandon_count = 0 - for datum in tqdm(data): - # Don't include figures that don't have subfigures - if 'subfigures' not in datum or datum['subfigures']==None or len(datum['subfigures']) == 0: - continue - # Don't include figures that lack subcaptions (detection不需要这一步 - if "subcaptions" not in datum or datum["subcaptions"] == None or len(datum["subcaptions"]) == 0: - abandon_count += len(datum['subfigures']) - continue - - # caption tokenization - old_tokens = ["[CLS]"] + [token["text"] for token in datum["tokens"]] + ["[SEP]"] # list of ['CLS', 'This', 'figure' ...] - old_subcaps = {} # {'a':[0,1,2,3...], ...} - for subcap_key in datum["subcaptions"]: - old_subcaps[subcap_key] = [idx+1 for idx in datum["subcaptions"][subcap_key]] - tokens, subcaps = convert_to_wordpieces(self.tokenizer, old_tokens, old_subcaps) # tokenize后新的token和subcap spans - # group the subcaps - subcaps_token_ids = [] - subcap_dict = {} - subcap_global_idx_range = [len(self.all_subcap_list)] - for label, token_index in subcaps.items(): # 'a', [0, 1, 2 ......] - subcap_dict[label] = len(subcaps_token_ids) - tmp = ["[CLS]"] + [tokens[i] for i in token_index] + ["[SEP]"] # subcap span转成具体的tokens并加CLS和SEP - tmp = torch.tensor(self.tokenizer.convert_tokens_to_ids(tmp)) - pad = (0, 77-tmp.shape[0]) - subcaps_token_ids.append(F.pad(tmp, pad, 'constant', 0)) # [subcap_num, (77)] - self.all_subcap_list.append(F.pad(tmp, pad, 'constant', 0)) - # subcaps_token_ids = torch.stack(subcaps_token_ids, dim=0) # (subcap_num, 77) - subcap_global_idx_range.append(len(self.all_subcap_list)) - - # check every subfigure - width = datum['width'] - height = datum['height'] - for subfigure in datum["subfigures"]: - if subfigure["label"] in subcaps and len(subcaps[subfigure["label"]]) > 0 and len(subcaps[subfigure["label"]]) < 76: - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = min(x) - x2 = max(x) - y1 = min(y) - y2 = max(y) - # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - if y2 < 0 or x2 < 0 or x1 > datum['width'] or y1 > datum['height']: - print(image_info['id']) - continue - # 规范bbox - if y1 < 0: - y1 = 0 - if x1 < 0: - x1 = 0 - if x2 > datum['width']: - x2 = datum['width'] - if y2 > datum['height']: - y2 = datum['height'] - if x1 == x2 or y1 == y2: - continue - # quanlified train data - image_info = {} - image_info["path"] = image_root+'/'+subfigure["id"] - image_info['id'] = subfigure["id"] - image_info['subcap_global_idx_range'] = subcap_global_idx_range # indexes of the subcaps in whole dataset - image_info['subcap_gt_index'] = subcap_dict[subfigure["label"]] # index of the subcap in compound figure - image_info['subcaptions'] = subcaps_token_ids # all the candidate subcaps, [subcap_num, tensor(77)] - image_info['caption_string'] = datum['text'] - # image_info['caption_token'] = tokens # ['[CLS]', 'This', ... '[SEP]'] - # image_info['caption_input'] = token_ids # [2, 43, 59, .... 3, 3] - # image_info['subcaption'] = subcaps[subfigure["label"]] # [1,2,3,4 ...] - image_info['location'] = [x1/width, y1/height, x2/width, y2/height] - self.images.append(image_info) - - self.dataset_size = int(trainset_size_ratio * len(self.images)) # 一轮epoch中train sample的数目 - self.shuffle_index() - - self.input_size = input_size - self.aug_ratio = aug_ratio - - print('Abandon %d samples (excessive caption tokens), Keep %d samples' % (abandon_count, len(self.images))) - - def shuffle_index(self): - """ - when train dataset set to be smaller or larger than real dataset, need to randomly select a new set, - mapping the index to a real sample - - self.dataset_size (int) : size of train/val set - """ - if self.dataset_size < len(self.images): - self.index_map = np.random.choice(len(self.images), self.dataset_size, replace=False) - elif self.dataset_size == len(self.images): - self.index_map = np.arange(len(self.images)) - else: - self.index_map = np.concatenate(np.arange(len(self.images)), np.random.choice(len(self.images), self.dataset_size-len(self.images), replace=False)) - - def __len__(self): - return self.dataset_size - - def __getitem__(self, index): - index = self.index_map[index] # transfer to new sample index - - unpadded_image = Image.open(self.images[index]['path']).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - - unpadded_image, _ = self.aug_tool(unpadded_image, []) # tensor (3, h, w) - - subcaptions = self.images[index]['subcaptions'] # [subcap_num, tensor(77)] - real_subcap_num = len(subcaptions) - subcap_gt_index = self.images[index]['subcap_gt_index'] - subcap_global_idx_range = self.images[index]['subcap_global_idx_range'] - if self.aug_ratio > 0: - other_subcaps = random.choices([*range(0, subcap_global_idx_range[0])]+[*range(subcap_global_idx_range[1], len(self.all_subcap_list))], \ - k=round(self.aug_ratio*(subcap_global_idx_range[1]-subcap_global_idx_range[0]))) - else: - other_subcaps = [] - subcaptions += [self.all_subcap_list[idx] for idx in other_subcaps] # [50%subcap_num, tensor(77)] - subcaptions = torch.stack(subcaptions, dim=0) # (150%subcap_num, 77) - caption_string = self.images[index]['caption_string'] - image_id = self.images[index]['id'] - loc = self.images[index]['location'] - - return unpadded_image, loc, subcaptions, real_subcap_num, subcap_gt_index, image_id, caption_string, self.input_size - -def sentencewise_align_collate(data): - """ - Pad input samples in a batch - - Args: - data : list of samples - - Returns: - a dictionary for batch input - """ - max_subcap_num = 0 # 先统计最大的subcap num - for unit in data: - unpadded_image, loc, subcaptions, noaug_subcap_num, subcap_gt_index, image_id, caption_string, input_size = unit - if subcaptions.shape[0] > max_subcap_num: - max_subcap_num = subcaptions.shape[0] - - image_ids = [] # list of strings - image_captions = [] # list of strings - pad_imgs = [] - pad_subcaps = [] # (bs, subcap_num, 77) - subcaption_gts = [] # (bs, subcap_num) - nopad_subcap_idx = [] # list of int - noaug_subcap_idx = [] # list of int - locations = [] - for unit in data: - unpadded_image, loc, subcaptions, noaug_subcap_num, subcap_gt_index, image_id, caption_string, input_size = unit - image_ids.append(image_id) - image_captions.append(caption_string) - # bbox info - locations.append(loc) - # resize+pad image - _, h, w = unpadded_image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size(512)以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成512x512 - pad_imgs.append(padded_img) - # padd subcaptions - pad = (0, 0, 0, max_subcap_num-subcaptions.shape[0]) - padded_subcap = F.pad(subcaptions, pad, 'constant', 0) # (max_subcap_num, 77) - pad_subcaps.append(padded_subcap) - nopad_subcap_idx.append(subcaptions.shape[0]) - # hard samples and easy samples - noaug_subcap_idx.append(noaug_subcap_num) - # one-hot gt vector - tmp = torch.zeros(max_subcap_num) # (subcap_num) - tmp[subcap_gt_index] = 1 - subcaption_gts.append(tmp) - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_w, max_h) - subcaption_gts = torch.stack(subcaption_gts, dim=0) # (bs, subcap_num) - pad_subcaps = torch.stack(pad_subcaps, dim=0) # (bs, subcap_num, 77) - locations = torch.tensor(locations) # (bs, 4) - - return {'image':pad_imgs, 'location':locations, 'image_id':image_ids, 'subcaptions':pad_subcaps, 'subcaption_gts':subcaption_gts, 'untokenized_caption':image_captions, 'nopad_subcap_idx':nopad_subcap_idx, 'noaug_subcap_idx':noaug_subcap_idx} - - -# 基于MediCAT数据集,以compound figure为单位采样 -class Bidirection_SentenceWise_Align_Dataset(Dataset): - def __init__(self, aug_params, filepath, image_root, normalization=False, trainset_size_ratio=1.0, input_size=512): - print('Bidirection Sentence-Wise Align Dataset') - self.samples = [] # list of data samples(dict) - - self.tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - if normalization: - self.image_transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - else: - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # aug param - self.aug_tool = Augmentation_Tool(aug_params) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - print("%d Compound Figure" % len(lines)) - - for datum in tqdm(data): - # Don't include figures without subfigures - if 'subfigures' not in datum or datum['subfigures']==None or len(datum['subfigures']) == 0: - continue - # Don't include figures without subcaptions - if "subcaptions" not in datum or datum["subcaptions"] == None or len(datum["subcaptions"]) == 0: - continue - - # caption tokenization - old_tokens = ["[CLS]"] + [token["text"] for token in datum["tokens"]] + ["[SEP]"] # list of ['CLS', 'This', 'figure' ...] - old_subcaps = {} # {'a':[0,1,2,3...], ...} - for subcap_key in datum["subcaptions"]: - old_subcaps[subcap_key] = [idx+1 for idx in datum["subcaptions"][subcap_key]] - tokens, subcaps = convert_to_wordpieces(self.tokenizer, old_tokens, old_subcaps) # tokenize后新的token和subcap spans - # group the subcaps - subcaps_tensor_ls = [] # list of tensors(token ids of a subcap, int) - subcap_dict = {} # subcap label to tensor index in subcaps_tensor, e.g. 'a':0 - for label, token_index in subcaps.items(): # 'a', [0, 1, 2 ......] - subcap_dict[label] = len(subcaps_tensor_ls) - tmp = ["[CLS]"] + [tokens[i] for i in token_index] + ["[SEP]"] # subcap span转成具体的tokens并加CLS和SEP - tmp = torch.tensor(self.tokenizer.convert_tokens_to_ids(tmp)) # subcap tokens转id - pad = (0, 77-tmp.shape[0]) - tmp = F.pad(tmp, pad, 'constant', 0) - subcaps_tensor_ls.append(tmp) # pad to tensor of shape (77) - padded_subcaps = torch.stack(subcaps_tensor_ls, dim=0) # (num_subcap, 77) - - # check every subfigure - image_paths = [] # list of image paths(str) - image_ids = [] # list of image ids(str) - image_gt_subcap = [] # list of gt one-hot tensor - image_locations = [] # tensor shape (num_subfig, 4) - width = datum['width'] - height = datum['height'] - for subfigure in datum["subfigures"]: - if subfigure["label"] in subcaps and len(subcaps[subfigure["label"]]) > 0 and len(subcaps[subfigure["label"]]) < 76: - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = min(x) - x2 = max(x) - y1 = min(y) - y2 = max(y) - # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - if y2 < 0 or x2 < 0 or x1 > datum['width'] or y1 > datum['height']: - print(subfigure["id"]) - continue - # 规范bbox - if y1 < 0: - y1 = 0 - if x1 < 0: - x1 = 0 - if x2 > datum['width']: - x2 = datum['width'] - if y2 > datum['height']: - y2 = datum['height'] - if x1 == x2 or y1 == y2: - continue - - image_paths.append(image_root+'/'+subfigure["id"]) - image_ids.append(subfigure["id"]) - tmp_idx = subcap_dict[subfigure["label"]] - tmp_one_hot = torch.zeros(padded_subcaps.shape[0]) - tmp_one_hot[tmp_idx] = 1 - image_gt_subcap.append(tmp_one_hot) - image_locations.append([x1/width, y1/height, x2/width, y2/height]) - - if len(image_paths) > 0: - sample_info = {} - sample_info['img2cap_gt'] = torch.stack(image_gt_subcap, dim=0) # one-hot matrix (num_subfig, num_subcap) - sample_info['img_path'] = image_paths - sample_info['img_id'] = image_ids - sample_info['padded_subcap'] = padded_subcaps - sample_info['cap_str'] = datum['text'] - sample_info['img_loc'] = torch.tensor(image_locations) - self.samples.append(sample_info) - - self.dataset_size = int(trainset_size_ratio * len(self.samples)) # 一轮epoch中train sample的数目 - self.shuffle_index() - - self.input_size = input_size - - print('Keep %d Compound Figure' % (len(self.samples))) - - def shuffle_index(self): - """ - when train dataset set to be smaller or larger than real dataset, need to randomly select a new set, - mapping the index to a real sample - - self.dataset_size (int) : size of train/val set - """ - if self.dataset_size < len(self.samples): - self.index_map = np.random.choice(len(self.samples), self.dataset_size, replace=False) - elif self.dataset_size == len(self.samples): - self.index_map = np.arange(len(self.samples)) - else: - self.index_map = np.concatenate(np.arange(len(self.samples)), np.random.choice(len(self.samples), self.dataset_size-len(self.samples), replace=False)) - - def __len__(self): - return self.dataset_size - - def __getitem__(self, index): - index = self.index_map[index] # transfer to new sample index - - padded_img_ls = [] - for img_path in self.samples[index]['img_path']: - unpadded_image = Image.open(img_path).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - _, h, w = unpadded_image.shape - scale = min(self.input_size/h, self.input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size(224)以内 - resized_img, _ = self.aug_tool(resized_img, []) # augmentation - pad = (0, self.input_size-round(scale*w), 0, self.input_size-round(scale*h)) - padded_img_ls.append(F.pad(resized_img, pad, 'constant', 0)) # 对img加pad成224x224 - padded_img = torch.stack(padded_img_ls) # (num_subfig, 3, 224, 224) - - padded_subcap = self.samples[index]['padded_subcap'] # (num_sucap, 77) - img2cap_gt = self.samples[index]['img2cap_gt'] # (num_subfig, num_subcap) - img_loc = self.samples[index]['img_loc'] # (num_subfig, 4) - cap_str = self.samples[index]['cap_str'] # string - - return padded_img, img_loc, padded_subcap, img2cap_gt, cap_str - -def bidirection_sentencewise_align_collate(data): - """ - Stack captions and images in a batch - - Args: - data: a list of [padded_img, img_loc, padded_subcap, img2cap_gt, cap_str], refer to __getitem__() in OnlyCap_Dataset - - Returns: - images: tensor (bs, 3, max_h, max_w) - captions: tensor (bs, max_l) - subfigs: list of lists [ ... [box(tensor, (subfig_num, 4)), class(tensor, (subfig_num, 1)), alignment(tensor, (subfig_num, max_l))], ... ] - """ - img_split_idx = [] # num_subfig in each sample/compound-figure - cap_split_idx = [] # num_subcap in each sample/compound-figure - padded_img_ls = [] - padded_cap_ls = [] - loc_ls = [] - img2cap_gt_ls = [] - cap_str_ls = [] - for unit in data: - padded_img, img_loc, padded_subcap, img2cap_gt, cap_str = unit - img_split_idx.append(padded_img.shape[0]) - padded_img_ls.append(padded_img) - loc_ls.append(img_loc) - cap_split_idx.append(padded_subcap.shape[0]) - padded_cap_ls.append(padded_subcap) - cap_str_ls.append(cap_str) - img2cap_gt_ls.append(img2cap_gt) - # batch内的img和cap拼成一个matrix - padded_img = torch.cat(padded_img_ls, dim=0) # (bs*num_subimg, 3, max_w, max_h) - padded_cap = torch.cat(padded_cap_ls, dim=0) # (bs*num_subcap, 77) - loc = torch.cat(loc_ls, dim=0) # (bs*num_subimg, 4) - # 每个compound figure的gt matrix放在整个batch的大gt matrix的对角线上 - img2cap_gt_martix = torch.zeros(padded_img.shape[0], padded_cap.shape[0]) - i_cursor = 0 - t_cursor = 0 - for subfig_num, subcap_num, gt_matrix in zip(img_split_idx, cap_split_idx, img2cap_gt_ls): - img2cap_gt_martix[i_cursor:i_cursor+subfig_num, t_cursor:t_cursor+subcap_num] = gt_matrix - i_cursor += subfig_num - t_cursor += subcap_num - - return {'padded_img':padded_img, 'loc':loc, 'img_split_idx':img_split_idx, - 'padded_cap':padded_cap, 'cap_str_ls':cap_str_ls, 'cap_split_idx':cap_split_idx, - 'img2cap_gt_ls':img2cap_gt_martix} diff --git a/openpmcvl/granular/process/dataset_det_align.py b/openpmcvl/granular/process/dataset_det_align.py deleted file mode 100644 index be4163f..0000000 --- a/openpmcvl/granular/process/dataset_det_align.py +++ /dev/null @@ -1,696 +0,0 @@ -from tqdm import tqdm -import torch -from torch.utils.data import Dataset -import json -from PIL import Image -from pytorch_pretrained_bert import BertTokenizer -import torch.nn.functional as F -from torchvision import transforms -from augmentation_tools import Augmentation_Tool -import numpy as np - -def convert_to_wordpieces(tokenizer, tokens, subcaps): - """ - Tokenize the tokens accroding to the vocab of the pretrained bert, and re-index the subcaption spans - - Args: - tokenizer (BertTokenizer): pretrained tokenizer - tokens (list): a lits of tokens, e.g. ['This', 'is' ...] - subcaps (dict): a dict of subcaptions label and corresponding span, e.g. {'a':[1, 2, 3, 4] ...} - - Returns: - new tokens and new subcaps after - """ - # 首先,对token进行进一步细粒度的切分,例如lover-->lov+er,使得token符合vocab中的规范 - token_to_wordpiece_map = {} - new_tokens = [] - for index, token in enumerate(tokens): - token_to_wordpiece_map[index] = len(new_tokens) # 第i个token对应的起始wordpiece index - new_tokens += tokenizer.tokenize(token) # 第i个token分成的wordpiece - token_to_wordpiece_map[len(tokens)] = len(new_tokens) # 最后一个token无意义 - # 然后,根据更细的新“token”(又称wordpiece),重新划定token和span - new_subcaps = {} - for label in subcaps: - wordpieces_idx = [] - for idx in subcaps[label]: - wordpieces_idx += [tmp for tmp in range(token_to_wordpiece_map[idx], token_to_wordpiece_map[idx+1])] - new_subcaps[label] = wordpieces_idx - return new_tokens, new_subcaps - -################################ Compound Figures + Captions ################################ - -class FigCap_Dataset(Dataset): - def __init__(self, aug_params, filepath, image_root, vocab_file, normalization=False, trainset_size_ratio=1.0, input_size=512): - print('Fig Cap Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256} - self.subfig_bbox = [] # list [comfig_num, [subfig_num, [4]]] - self.subfig_token = [] # list [comfig_num, [subfig_num, [subcap_len]]] - self.captions = [] # list of [500, 3971, ...] i.e. token id in the vocab - - self.tokenizer = BertTokenizer(vocab_file=vocab_file, do_lower_case=True) - - if normalization: - self.image_transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - else: - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # aug param - self.aug_tool = Augmentation_Tool(aug_params) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - anno_subfig_num = 0 - filtered_compound_fig_num = 0 - filtered_subfig_num = 0 - filtered_token_num = 0 - print("%d Compound Figure" % len(lines)) - - #min_max = 10000 - #max_max = 0 - - for datum in tqdm(data): - # Don't include figures that don't have subfigures - if 'subfigures' not in datum or datum['subfigures']==None or len(datum['subfigures']) == 0: - continue - # Don't include figures that lack subcaptions (detection不需要这一步 - if "subcaptions" not in datum or datum["subcaptions"] == None or len(datum["subcaptions"]) == 0: - continue - # basic info of compound figure - image_info = {} - image_info["path"] = image_root+'/'+datum["id"] - image_info['id'] = datum["id"] - image_info["w"] = datum["width"] - image_info["h"] = datum["height"] - image_info['caption'] = datum['text'] - - """ - if image_info["w"] > image_info["h"]: - if min_max > image_info["w"]: - min_max = image_info["w"] - if max_max < image_info["w"]: - max_max = image_info["w"] - else: - if min_max > image_info["h"]: - min_max = image_info["h"] - if max_max < image_info["h"]: - max_max = image_info["h"] - """ - - # caption tokens - old_tokens = ["[CLS]"] + [token["text"] for token in datum["tokens"]] + ["[SEP]"] # list of ['CLS', 'This', 'figure' ...] - old_subcaps = {} # {'a':[0,1,2,3...], ...} - for subcap_key in datum["subcaptions"]: - old_subcaps[subcap_key] = [idx+1 for idx in datum["subcaptions"][subcap_key]] - tokens, subcaps = convert_to_wordpieces(self.tokenizer, old_tokens, old_subcaps) - token_ids = self.tokenizer.convert_tokens_to_ids(tokens) - # 这里len > 512直接扔掉是否合理?(detection不需要这一步,medicat没有这一步,少了一个sample - if len(token_ids) > 512: - print('abandon len(cap) > 512') - continue - - # subfigure and subcaption - subfig_list = [] # [subfignum, [4]] - subcap_list = [] # [subfignum, [subcap_len]] - for subfigure in datum["subfigures"]: - # (detection不需要这一步 - if subfigure["label"] in subcaps and len(subcaps[subfigure["label"]]) > 0 :# and len(subfigure['points'])==4: - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = min(x) - x2 = max(x) - y1 = min(y) - y2 = max(y) - # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - if y2 < 0 or x2 < 0 or x1 > datum['width'] or y1 > datum['height']: - print(image_info['id']) - continue - # 规范bbox - if y1 < 0: - y1 = 0 - if x1 < 0: - x1 = 0 - if x2 > datum['width']: - x2 = datum['width'] - if y2 > datum['height']: - y2 = datum['height'] - if x1 == x2 or y1 == y2: - continue - # subfig_subcap['label'] = subfigure["label"] - subfig_list.append([(x1+x2)/2, (y1+y2)/2, x2-x1, y2-y1]) - subcap_list.append(subcaps[subfigure["label"]]) - - anno_subfig_num += len(datum["subfigures"]) - if len(subfig_list) > 0: - self.images.append(image_info) - self.captions.append(token_ids) - self.subfig_bbox.append(subfig_list) - self.subfig_token.append(subcap_list) - filtered_subfig_num += len(subfig_list) - - filtered_compound_fig_num += 1 - - self.dataset_size = int(trainset_size_ratio * len(self.images)) # 一轮epoch中train sample的数目 - self.shuffle_index() - - self.input_size = input_size - - print('Filter %d Compound Figures'%filtered_compound_fig_num) - print('Total %d Subfig'%anno_subfig_num) - print('Filter %d Subfig'%filtered_subfig_num) - # print('Min Max', min_max) - # print('Max Max', max_max) - # print(filtered_token_num) - - def id_to_token(self, id_tensor): - return self.tokenizer.convert_ids_to_tokens(id_tensor) - - def shuffle_index(self): - """ - when train dataset set to be smaller or larger than real dataset, need to randomly select a new set, - mapping the index to a real sample - - self.dataset_size (int) : size of train/val set - """ - if self.dataset_size < len(self.images): - self.index_map = np.random.choice(len(self.images), self.dataset_size, replace=False) - elif self.dataset_size == len(self.images): - self.index_map = np.arange(len(self.images)) - else: - self.index_map = np.concatenate(np.arange(len(self.images)), np.random.choice(len(self.images), self.dataset_size-len(self.images), replace=False)) - - def __len__(self): - return self.dataset_size - - def __getitem__(self, index): - index = self.index_map[index] # transfer to new sample index - - unpadded_image = Image.open(self.images[index]['path']).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - - subcap_tokens = self.subfig_token[index] # [subfig_num, [subcap_len]] - unnorm_bboxes = self.subfig_bbox[index] # [subfig_num, [cx, cy, w, h]] - - unpadded_image, unnorm_bboxes = self.aug_tool(unpadded_image, unnorm_bboxes) # tensor (3, h, w), unnormalized [... [cx, cy, w, h], ...] - - return unpadded_image, unnorm_bboxes, subcap_tokens, torch.tensor(self.captions[index]).type(torch.IntTensor), self.images[index]['id'], self.images[index]['h'], self.images[index]['w'], self.images[index]['caption'], self.input_size - -def figcap_collate(data): - """ - 1. Padding captions and images in a batch - 2. Normalize box coordinates after padding - 3. Adjust subcap indexes after padding - - Args: - data: a list of [image(tensor), subfigures(list of dicts), caption(tensor)], refer to __getitem__() in FigCap_Dataset - - Returns: - images: tensor (bs, 3, max_h, max_w) - captions: tensor (bs, max_l) - subfigs: list of lists [ ... [box(tensor, (subfig_num, 4)), class(tensor, (subfig_num, 1)), alignment(tensor, (subfig_num, max_l))], ... ] - """ - image_ids = [] - image_hws = [] - image_captions = [] - max_l = 0 - for unit in data: - image, unnorm_bboxes, subcap_tokens, caption, image_id, original_h, original_w, untokenized_cap, input_size = unit - - image_ids.append(image_id) - image_hws.append([original_h, original_w]) - image_captions.append(untokenized_cap) - - cap_len = caption.shape[0] # 统计cap长度 - if cap_len > max_l: - max_l = cap_len - - pad_imgs = [] - pad_caps = [] - subfigures = [] - for unit in data: - image, unnorm_bboxes, subcap_tokens, caption, image_id, original_h, original_w, untokenized_cap, input_size = unit - - # resize+pad成512x512 - _, h, w = image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(image) # reize到input_size(512)以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成512x512 - pad_imgs.append(padded_img) - - for i in range(len(unnorm_bboxes)): - unnorm_bboxes[i] = [unnorm_bboxes[i][0]*scale/input_size, - unnorm_bboxes[i][1]*scale/input_size, - unnorm_bboxes[i][2]*scale/input_size, - unnorm_bboxes[i][3]*scale/input_size] # pad后normalize坐标(cx, cy, w, h) - pad = (0, max_l-caption.shape[0]) - pad_caps.append(F.pad(caption, pad, 'constant', 0)) # 对seq加[PAD], scibert的vocab中PAD的id是0 - - subfig_box = [] # (subfigure_num, 4) - subfig_tokens = [] # (subfigure_num, max_length_in_this_batch) - for subfig in unnorm_bboxes: - subfig_box.append(subfig) - for subcap in subcap_tokens: - tmp = torch.zeros(max_l) - tmp[subcap] = 1 - subfig_tokens.append(tmp) - subfig_box = torch.tensor(subfig_box) - subfig_tokens = torch.stack(subfig_tokens, dim=0) - subfigures.append([subfig_box, subfig_tokens]) - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_w, max_h) - pad_caps = torch.stack(pad_caps, dim=0) # (bs, max_cap_l) - - # To Continue - return {'image':pad_imgs, 'image_id':image_ids, 'original_hws':image_hws, 'caption':pad_caps, 'subfigs':subfigures, 'untokenized_caption':image_captions} - -################################ Compound Figures ################################ - -class Fig_Dataset(Dataset): - def __init__(self, aug_param, filepath, image_root, vocab_file, normalization=False, trainset_size_ratio=1.0, input_size=512): - print('Only Fig Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256} - self.subfigures = [] # list of [{'subfig_coord':[cx, cy, w, h], 'subcap_token_idx':[1,2,3...]}, ...] - self.captions = [] # list of [500, 3971, ...] i.e. token id in the vocab - - self.tokenizer = BertTokenizer(vocab_file=vocab_file, do_lower_case=True) - - # aug param - self.aug_tool = Augmentation_Tool(aug_param) - - if normalization: - self.image_transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - else: - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - anno_subfig_num = 0 - filtered_compound_fig_num = 0 - filtered_subfig_num = 0 - filtered_token_num = 0 - print("%d Compound Figure" % len(lines)) - for datum in tqdm(data): - # Don't include figures that don't have subfigures - if 'subfigures' not in datum or datum['subfigures']== None or len(datum['subfigures']) == 0: - continue - - # basic info of compound figure - image_info = {} - image_info["path"] = image_root+'/'+datum["id"] - image_info["image"] = Image.open(image_root+'/'+datum["id"]).convert('RGB') - image_info['id'] = datum["id"] - image_info["w"] = datum["width"] - image_info["h"] = datum["height"] - - # subfigure and subcaption - subfig_list = [] - for subfigure in datum["subfigures"]: - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = min(x) - x2 = max(x) - y1 = min(y) - y2 = max(y) - # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - if y2 < 0 or x2 < 0 or x1 > datum['width'] or y1 > datum['height']: - continue - # 规范bbox - if y1 < 0: - y1 = 0 - if x1 < 0: - x1 = 0 - if x2 > datum['width']: - x2 = datum['width'] - if y2 > datum['height']: - y2 = datum['height'] - # 过滤重合的bbox - if x1 == x2 or y1 == y2: - continue - # subfig_subcap['label'] = subfigure["label"] - subfig = [(x1+x2)/2, (y1+y2)/2, x2-x1, y2-y1] # [cx, cy, w, h] - subfig_list.append(subfig) - - anno_subfig_num += len(datum["subfigures"]) - if len(subfig_list) > 0: - self.images.append(image_info) - self.subfigures.append(subfig_list) # [comfigs, [subfigs, [4]]] - filtered_subfig_num += len(subfig_list) - - filtered_compound_fig_num += 1 - - self.dataset_size = int(trainset_size_ratio * len(self.images)) # 一轮epoch中train sample的数目 - self.shuffle_index() - - self.input_size = input_size - - print('Filter %d Compound Figures'%filtered_compound_fig_num) - print('Total %d Subfig'%anno_subfig_num) - print('Filter %d Subfig'%filtered_subfig_num) - - def id_to_token(self, id_tensor): - return self.tokenizer.convert_ids_to_tokens(id_tensor) - - def shuffle_index(self): - """ - when train dataset set to be smaller or larger than real dataset, need to randomly select a new set, - mapping the index to a real sample - - self.dataset_size (int) : size of train/val set - """ - if self.dataset_size < len(self.images): - self.index_map = np.random.choice(len(self.images), self.dataset_size, replace=False) - elif self.dataset_size == len(self.images): - self.index_map = np.arange(len(self.images)) - else: - self.index_map = np.concatenate(np.arange(len(self.images)), np.random.choice(len(self.images), self.dataset_size-len(self.images), replace=False)) - - def __len__(self): - return self.dataset_size - - def __getitem__(self, index): - index = self.index_map[index] # transfer to new sample index - - unpadded_image = self.images[index]['image'] - unpadded_image = self.image_transform(unpadded_image) - unnorm_bboxes = self.subfigures[index] # [subfig_num, [cx, cy, w, h]] - - for bbox in unnorm_bboxes: # subfig augmentation - cx, cy, w, h = bbox - x1 = int(cx - w/2) - x2 = int(cx + w/2) - y1 = int(cy - h/2) - y2 = int(cy + h/2) - subfig = unpadded_image[:, y1:y2, x1:x2] - subfig, _ = self.aug_tool(subfig, []) - unpadded_image[:, y1:y2, x1:x2] = subfig - - unpadded_image, unnorm_bboxes = self.aug_tool(unpadded_image, unnorm_bboxes) # tensor (3, h, w), unnormalized [... [cx, cy, w, h], ...] - - return unpadded_image, unnorm_bboxes, self.images[index]['h'], self.images[index]['w'], self.images[index]['id'], self.input_size - -def fig_collate(data): - """ - 1. Padding captions and images in a batch - 2. Normalize box coordinates after padding - - Args: - data: refer to __getitem__() in FigCap_Dataset - - Returns: - images: tensor (bs, 3, max_h, max_w) - captions: tensor (bs, max_l) - subfigs: list of lists [ ... [box(tensor, (subfig_num, 4)), alignment(tensor, (subfig_num, max_l))], ... ] - other info: ...... - """ - pad_imgs = [] - subfigs = [] - unpadded_hws = [] - image_ids = [] - untokenized_captions = [] - for sample in data: - unpadded_image, unnorm_bboxes, unpadded_h, unpadded_w, sample_id, input_size = sample - # image : tensor (3, h, w) - # bbox : unnormalized [subfig_num * [cx, cy, h, w]] - # original_hw / unpadded_hw : scalar, original h/w of the real images, or the unpadded h/w of the syn images - # id : image id or syn id - image_ids.append(sample_id) - unpadded_hws.append([unpadded_h, unpadded_w]) - untokenized_captions.append('[PAD]') - - _, h, w = unpadded_image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成input_sizexinput_size - pad_imgs.append(padded_img) - - subfig_box = [] # (subfigure_num, 4) - for bboxes in unnorm_bboxes: - subfig_box.append([bboxes[0]*scale/input_size, - bboxes[1]*scale/input_size, - bboxes[2]*scale/input_size, - bboxes[3]*scale/input_size]) # pad后normalize坐标(cx, cy, w, h) - subfig_box = torch.tensor(subfig_box) - subfigs.append([subfig_box, torch.zeros(len(subfig_box), 1)]) - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_w, max_h) - - return {'image':pad_imgs, 'subfigs':subfigs, - 'caption':torch.zeros([len(data), 1], dtype=torch.int32), - 'unpadded_hws':unpadded_hws, - 'image_id':image_ids, - 'untokenized_caption':untokenized_captions} - -def fig_detr_collate(data): - """ - 1. Padding captions and images in a batch - 2. Normalize box coordinates after padding - - Args: - data: refer to __getitem__() in FigCap_Dataset - - Returns: - images: tensor (bs, 3, max_h, max_w) - captions: tensor (bs, max_l) - subfigs: list of lists [ ... [box(tensor, (subfig_num, 4)), alignment(tensor, (subfig_num, max_l))], ... ] - other info: ...... - """ - pad_imgs = [] - subfigs = [] - unpadded_hws = [] - image_ids = [] - untokenized_captions = [] - input_size = data[0][-1] - image_mask = torch.zeros(len(data), input_size, input_size) - for i, sample in enumerate(data): - unpadded_image, unnorm_bboxes, unpadded_h, unpadded_w, sample_id, input_size = sample - # image : tensor (3, h, w) - # bbox : unnormalized [subfig_num * [cx, cy, h, w]] - # original_hw / unpadded_hw : scalar, original h/w of the real images, or the unpadded h/w of the syn images - # id : image id or syn id - image_ids.append(sample_id) - unpadded_hws.append([unpadded_h, unpadded_w]) - untokenized_captions.append('[PAD]') - - _, h, w = unpadded_image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) # (padding_left,padding_right, padding_top, padding_bottom) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成input_sizexinput_size - pad_imgs.append(padded_img) - image_mask[i, round(scale*h):, round(scale*w):] = 1 - - subfig_box = [] # (subfigure_num, 4) - for bboxes in unnorm_bboxes: - subfig_box.append([bboxes[0]*scale/input_size, - bboxes[1]*scale/input_size, - bboxes[2]*scale/input_size, - bboxes[3]*scale/input_size]) # pad后normalize坐标(cx, cy, w, h) - subfig_box = torch.tensor(subfig_box) - subfigs.append([subfig_box, torch.zeros(len(subfig_box), 1)]) - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_h, max_w) - - return {'image':pad_imgs, 'image_mask':image_mask, 'subfigs':subfigs, - 'caption':torch.zeros([len(data), 1], dtype=torch.int32), - 'unpadded_hws':unpadded_hws, - 'image_id':image_ids, - 'untokenized_caption':untokenized_captions} - - -################################ Compound Figures for Separation Inference ################################ - -class Fig_Separation_Dataset(Dataset): - def __init__(self, aug_param, filepath, image_root, normalization=False, start=0, end=-1, input_size=512): - print('Only Fig Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256} - # self.subfigures = [] # list of [{'subfig_coord':[cx, cy, w, h], 'subcap_token_idx':[1,2,3...]}, ...] - # self.captions = [] # list of [500, 3971, ...] i.e. token id in the vocab - - # aug param - self.aug_tool = Augmentation_Tool(aug_param) - - if normalization: - self.image_transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - else: - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # preprocessing - f = open(filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - data = data[start:len(data)] - anno_subfig_num = 0 - filtered_compound_fig_num = 0 - filtered_subfig_num = 0 - filtered_token_num = 0 - print("%d Compound Figure" % len(lines)) - count = start - for datum in tqdm(data): - # # Don't include figures that don't have subfigures - # if 'subfigures' not in datum or datum['subfigures']== None or len(datum['subfigures']) == 0: - # continue - - # basic info of compound figure - image_info = {} - image_info["path"] = datum["image_path"] #image_root+'/'+datum["id"] - image_info['id'] = datum["id"] - image_info['index'] = count - count += 1 - image_info["w"] = datum["width"] - image_info["h"] = datum["height"] - - self.images.append(image_info) - - # # subfigure and subcaption - # subfig_list = [] - # for subfigure in datum["subfigures"]: - # x = [point[0] for point in subfigure["points"]] - # y = [point[1] for point in subfigure["points"]] - # x1 = min(x) - # x2 = max(x) - # y1 = min(y) - # y2 = max(y) - # # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - # if y2 < 0 or x2 < 0 or x1 > datum['width'] or y1 > datum['height']: - # continue - # # 规范bbox - # if y1 < 0: - # y1 = 0 - # if x1 < 0: - # x1 = 0 - # if x2 > datum['width']: - # x2 = datum['width'] - # if y2 > datum['height']: - # y2 = datum['height'] - # # 过滤重合的bbox - # if x1 == x2 or y1 == y2: - # continue - # # subfig_subcap['label'] = subfigure["label"] - # subfig = [(x1+x2)/2, (y1+y2)/2, x2-x1, y2-y1] # [cx, cy, w, h] - # subfig_list.append(subfig) - - # anno_subfig_num += len(datum["subfigures"]) - # if len(subfig_list) > 0: - # self.images.append(image_info) - # self.subfigures.append(subfig_list) # [comfigs, [subfigs, [4]]] - # filtered_subfig_num += len(subfig_list) - - filtered_compound_fig_num += 1 - - self.input_size = input_size - - # print('Filter %d Compound Figures'%filtered_compound_fig_num) - # print('Total %d Subfig'%anno_subfig_num) - # print('Filter %d Subfig'%filtered_subfig_num) - - def __len__(self): - return len(self.images) - - def __getitem__(self, index): - unpadded_image = Image.open(self.images[index]['path']).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - - # unnorm_bboxes = self.subfigures[index] # [subfig_num, [cx, cy, w, h]] - - # for bbox in unnorm_bboxes: # subfig augmentation - # cx, cy, w, h = bbox - # x1 = int(cx - w/2) - # x2 = int(cx + w/2) - # y1 = int(cy - h/2) - # y2 = int(cy + h/2) - # subfig = unpadded_image[:, y1:y2, x1:x2] - # subfig, _ = self.aug_tool(subfig, []) - # unpadded_image[:, y1:y2, x1:x2] = subfig - - # unpadded_image, unnorm_bboxes = self.aug_tool(unpadded_image, unnorm_bboxes) # tensor (3, h, w), unnormalized [... [cx, cy, w, h], ...] - - # return unpadded_image, unnorm_bboxes, self.images[index]['h'], self.images[index]['w'], self.images[index]['id'], self.images[index]['index'], self.input_size - return unpadded_image, self.images[index]['h'], self.images[index]['w'], self.images[index]['id'], self.images[index]['index'], self.input_size - -def fig_separation_collate(data): - """ - 1. Padding captions and images in a batch - 2. Normalize box coordinates after padding - - Args: - data: refer to __getitem__() in FigCap_Dataset - - Returns: - images: tensor (bs, 3, max_h, max_w) - captions: tensor (bs, max_l) - # subfigs: list of lists [ ... [box(tensor, (subfig_num, 4)), alignment(tensor, (subfig_num, max_l))], ... ] - other info: ...... - """ - pad_imgs = [] - # subfigs = [] - unpadded_hws = [] - image_ids = [] - image_index = [] - untokenized_captions = [] - unpadded_images = [] - for sample in data: - # unpadded_image, unnorm_bboxes, unpadded_h, unpadded_w, sample_id, index, input_size = sample - unpadded_image, unpadded_h, unpadded_w, sample_id, index, input_size = sample - # image : tensor (3, h, w) - # bbox : unnormalized [subfig_num * [cx, cy, h, w]] - # original_hw / unpadded_hw : scalar, original h/w of the real images, or the unpadded h/w of the syn images - # id : image id or syn id - image_ids.append(sample_id) - image_index.append(index) - unpadded_hws.append([unpadded_h, unpadded_w]) - untokenized_captions.append('[PAD]') - - _, h, w = unpadded_image.shape - scale = min(input_size/h, input_size/w) - resize_transform = transforms.Resize([round(scale*h), round(scale*w)]) - resized_img = resize_transform(unpadded_image) # reize到input_size以内 - pad = (0, input_size-round(scale*w), 0, input_size-round(scale*h)) - padded_img = F.pad(resized_img, pad, 'constant', 0) # 对img加pad成input_sizexinput_size - pad_imgs.append(padded_img) - - # subfig_box = [] # (subfigure_num, 4) - # for bboxes in unnorm_bboxes: - # subfig_box.append([bboxes[0]*scale/input_size, - # bboxes[1]*scale/input_size, - # bboxes[2]*scale/input_size, - # bboxes[3]*scale/input_size]) # pad后normalize坐标(cx, cy, w, h) - # subfig_box = torch.tensor(subfig_box) - # subfigs.append([subfig_box, torch.zeros(len(subfig_box), 1)]) - - unpadded_images.append(unpadded_image) # [bs * (3, h, w)] - - pad_imgs = torch.stack(pad_imgs, dim=0) # (bs, 3, max_w, max_h) - - return {'image':pad_imgs, # 'subfigs':subfigs, - 'caption':torch.zeros([len(data), 1], dtype=torch.int32), - 'unpadded_hws':unpadded_hws, - 'image_id':image_ids, - 'image_index':image_index, - 'untokenized_caption':untokenized_captions, - 'original_image':unpadded_images} - - - \ No newline at end of file diff --git a/openpmcvl/granular/process/dataset_exsclaim.py b/openpmcvl/granular/process/dataset_exsclaim.py deleted file mode 100644 index afd8eda..0000000 --- a/openpmcvl/granular/process/dataset_exsclaim.py +++ /dev/null @@ -1,265 +0,0 @@ -""" -将Exsclaim配对的subfig-subcap用于训练Sentence-Wise Alignment -""" - -from tqdm import tqdm -import torch -from torch.utils.data import Dataset -import json -from PIL import Image -from pytorch_pretrained_bert import BertTokenizer -import torch.nn.functional as F -from torchvision import transforms -from augmentation_tools import Augmentation_Tool -import numpy as np -from transformers import AutoTokenizer -import random - -def convert_to_wordpieces(tokenizer, tokens, subcaps): - """ - Tokenize the tokens accroding to the vocab of the pretrained bert, and re-index the subcaption spans - - Args: - tokenizer (BertTokenizer): pretrained tokenizer - tokens (list): a lits of tokens, e.g. ['This', 'is' ...] - subcaps (dict): a dict of subcaptions label and corresponding span, e.g. {'a':[1, 2, 3, 4] ...} - - Returns: - new tokens and new subcaps after - """ - # 首先,对token进行进一步细粒度的切分,例如lover-->lov+er,使得token符合vocab中的规范 - token_to_wordpiece_map = {} - new_tokens = [] - for index, token in enumerate(tokens): - token_to_wordpiece_map[index] = len(new_tokens) # 第i个token对应的起始wordpiece index - new_tokens += tokenizer.tokenize(token) # 第i个token分成的wordpiece - token_to_wordpiece_map[len(tokens)] = len(new_tokens) # 最后一个token无意义 - # 然后,根据更细的新“token”(又称wordpiece),重新划定token和span - new_subcaps = {} - for label in subcaps: - wordpieces_idx = [] - for idx in subcaps[label]: - wordpieces_idx += [tmp for tmp in range(token_to_wordpiece_map[idx], token_to_wordpiece_map[idx+1])] - new_subcaps[label] = wordpieces_idx - return new_tokens, new_subcaps - -################################ Compound Figures + Captions ################################ - -class SentenceWise_Align_EM_Dataset(Dataset): - def __init__(self, aug_params, exsclaim_filepath, medicat_filepath, exsclaim_image_root, medicat_image_root, normalization=False, medicat_ratio=1.0, exsclaim_ratio=1.0, input_size=512, aug_ratio=0.0): - print('Sentence-Wise Align Dataset') - self.images = [] # list of {'path':'xxx/xxx.png', 'w':256, 'h':256, ......} - - self.tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - if normalization: - self.image_transform = transforms.Compose([ - transforms.ToTensor(), - transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) - ]) - else: - self.image_transform = transforms.Compose([ - transforms.ToTensor() - ]) - - # aug param - self.aug_tool = Augmentation_Tool(aug_params) - - self.all_subcap_list = [] - abandon_count = 0 - - # preprocessing - f = open(exsclaim_filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - print("%d Compound Figure" % len(lines)) - - avg_subcaps = 0 - for datum in tqdm(data): - # Don't include figures that don't have subfigures - if 'subfigures' not in datum or datum['subfigures']==None or len(datum['subfigures']) == 0: - continue - # Don't include figures that lack subcaptions (detection不需要这一步 - if "subcaptions" not in datum or datum["subcaptions"] == None or len(datum["subcaptions"]) == 0: - abandon_count += len(datum['subfigures']) - continue - - subcaptions = [] - subcap_dict = {} - start = len(self.all_subcap_list) - for subfig_id, subcap in datum["subcaptions"].items(): - subcap_token_ls = self.tokenizer.tokenize(subcap) - tmp = ['[CLS]'] + subcap_token_ls + ['[SEP]'] - tmp = torch.tensor(self.tokenizer.convert_tokens_to_ids(tmp)) - if tmp.shape[0] < 78 and tmp.shape[0] > 2: - pad = (0, 77-tmp.shape[0]) - tmp = F.pad(tmp, pad, 'constant', 0) # [subcap_num, (77)] - subcap_dict[subfig_id] = len(subcaptions) - subcaptions.append(tmp) - self.all_subcap_list.append(tmp) - else: - subcap_dict[subfig_id] = -1 - subcap_global_idx_range = [start, len(self.all_subcap_list)] - - avg_subcaps += len(subcaptions) - - # check every subfigure - width = datum['width'] - height = datum['height'] - for subfigure in datum["subfigures"]: - if subfigure["label"] in datum["subcaptions"] and subcap_dict[subfigure["label"]] != -1: - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = min(x) - x2 = max(x) - y1 = min(y) - y2 = max(y) - # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - if y2 < 0 or x2 < 0 or x1 > width or y1 > height: - print(image_info['id']) - continue - # 规范bbox - if y1 < 0: - y1 = 0 - if x1 < 0: - x1 = 0 - if x2 > width: - x2 = width - if y2 > height: - y2 = height - if x1 == x2 or y1 == y2: - continue - # quanlified train data - image_info = {} - image_info["path"] = exsclaim_image_root+'/'+subfigure["id"] - image_info['id'] = subfigure["id"] - image_info['subcap_global_idx_range'] = subcap_global_idx_range # indexes of the subcaps in whole dataset - image_info['subcap_gt_index'] = subcap_dict[subfigure["label"]] # index of the subcap in compound figure - image_info['subcaptions'] = subcaptions # all the candidate subcaps, [subcap_num, tensor(77)] - image_info['caption_string'] = datum['text'] if 'text' in datum else datum['caption'] - image_info['location'] = [x1/width, y1/height, x2/width, y2/height] - self.images.append(image_info) - - self.exsclaim_idx = len(self.images) - f = open(medicat_filepath) - lines = f.readlines() - data = [json.loads(line) for line in lines] - - for datum in tqdm(data): - # Don't include figures that don't have subfigures - if 'subfigures' not in datum or datum['subfigures']==None or len(datum['subfigures']) == 0: - continue - # Don't include figures that lack subcaptions (detection不需要这一步 - if "subcaptions" not in datum or datum["subcaptions"] == None or len(datum["subcaptions"]) == 0: - abandon_count += len(datum['subfigures']) - continue - - # caption tokenization - old_tokens = ["[CLS]"] + [token["text"] for token in datum["tokens"]] + ["[SEP]"] # list of ['CLS', 'This', 'figure' ...] - old_subcaps = {} # {'a':[0,1,2,3...], ...} - for subcap_key in datum["subcaptions"]: - old_subcaps[subcap_key] = [idx+1 for idx in datum["subcaptions"][subcap_key]] - tokens, subcaps = convert_to_wordpieces(self.tokenizer, old_tokens, old_subcaps) # tokenize后新的token和subcap spans - # group the subcaps - subcaptions = [] - subcap_dict = {} - subcap_global_idx_range = [len(self.all_subcap_list)] - for label, token_index in subcaps.items(): # 'a', [0, 1, 2 ......] - tmp = ["[CLS]"] + [tokens[i] for i in token_index] + ["[SEP]"] # subcap span转成具体的tokens并加CLS和SEP - tmp = torch.tensor(self.tokenizer.convert_tokens_to_ids(tmp)) - if tmp.shape[0] < 78 and tmp.shape[0] > 2: - pad = (0, 77-tmp.shape[0]) - tmp = F.pad(tmp, pad, 'constant', 0) # [subcap_num, (77)] - subcap_dict[label] = len(subcaptions) - subcaptions.append(tmp) # [subcap_num, (77)] - self.all_subcap_list.append(tmp) - else: - subcap_dict[label] = -1 - subcap_global_idx_range.append(len(self.all_subcap_list)) - - # check every subfigure - width = datum['width'] - height = datum['height'] - for subfigure in datum["subfigures"]: - if subfigure["label"] in datum["subcaptions"] and subcap_dict[subfigure["label"]] != -1: - x = [point[0] for point in subfigure["points"]] - y = [point[1] for point in subfigure["points"]] - x1 = min(x) - x2 = max(x) - y1 = min(y) - y2 = max(y) - # 过滤不在图中的bbox (medicat没有这一步,不过在数据集中没有发现不符合的subfig - if y2 < 0 or x2 < 0 or x1 > width or y1 > height: - print(image_info['id']) - continue - # 规范bbox - if y1 < 0: - y1 = 0 - if x1 < 0: - x1 = 0 - if x2 > width: - x2 = width - if y2 > height: - y2 = height - if x1 == x2 or y1 == y2: - continue - # quanlified train data - image_info = {} - image_info["path"] = medicat_image_root+'/'+subfigure["id"] - image_info['id'] = subfigure["id"] - image_info['subcap_global_idx_range'] = subcap_global_idx_range # indexes of the subcaps in whole dataset - image_info['subcap_gt_index'] = subcap_dict[subfigure["label"]] # index of the subcap in compound figure - image_info['subcaptions'] = subcaptions # all the candidate subcaps, [subcap_num, tensor(77)] - image_info['caption_string'] = datum['text'] if 'text' in datum else datum['caption'] - image_info['location'] = [x1/width, y1/height, x2/width, y2/height] - self.images.append(image_info) - - self.e_num = int(exsclaim_ratio*self.exsclaim_idx) # 一轮epoch中train sample的数目 - self.m_num = int(medicat_ratio*(len(self.images)-self.exsclaim_idx)) - - self.shuffle_index() - - self.input_size = input_size - self.aug_ratio = aug_ratio - - print('Abandon %d samples (excessive caption tokens), Keep %d samples' % (abandon_count, len(self.images))) - - def shuffle_index(self): - """ - when train dataset set to be smaller or larger than real dataset, need to randomly select a new set, - mapping the index to a real sample - - self.dataset_size (int) : size of train/val set - """ - e = np.random.choice(self.exsclaim_idx, self.e_num, replace=False) - m = np.random.choice((len(self.images)-self.exsclaim_idx), self.m_num, replace=False) + self.exsclaim_idx - self.index_map = np.concatenate((e, m), axis=0) - print(e.shape, m.shape) - - def __len__(self): - return self.e_num + self.m_num - - def __getitem__(self, index): - index = self.index_map[index] # transfer to new sample index - - unpadded_image = Image.open(self.images[index]['path']).convert('RGB') - unpadded_image = self.image_transform(unpadded_image) - - unpadded_image, _ = self.aug_tool(unpadded_image, []) # tensor (3, h, w) - - subcaptions = self.images[index]['subcaptions'] # [subcap_num, tensor(77)] - real_subcap_num = len(subcaptions) - subcap_gt_index = self.images[index]['subcap_gt_index'] - subcap_global_idx_range = self.images[index]['subcap_global_idx_range'] - if self.aug_ratio > 0.0: - other_subcaps = random.choices([*range(0, subcap_global_idx_range[0])]+[*range(subcap_global_idx_range[1], len(self.all_subcap_list))], \ - k=round(self.aug_ratio*(subcap_global_idx_range[1]-subcap_global_idx_range[0]))) - else: - other_subcaps = [] - subcaptions += [self.all_subcap_list[idx] for idx in other_subcaps] # [50%subcap_num, tensor(77)] - subcaptions = torch.stack(subcaptions, dim=0) # (150%subcap_num, 77) - caption_string = self.images[index]['caption_string'] - image_id = self.images[index]['id'] - loc = self.images[index]['location'] - - return unpadded_image, loc, subcaptions, real_subcap_num, subcap_gt_index, image_id, caption_string, self.input_size diff --git a/openpmcvl/granular/process/detect_metric.py b/openpmcvl/granular/process/detect_metric.py deleted file mode 100644 index bfca1cb..0000000 --- a/openpmcvl/granular/process/detect_metric.py +++ /dev/null @@ -1,431 +0,0 @@ -import torch -from align_metric import box_cxcywh_to_xyxy -from einops import repeat -import numpy as np -import matplotlib.pyplot as plt - -device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - -def side_loss(pred_bboxes, gt_bboxes, x1y1x2y2=True): - # Returns the IoU of pred_bboxes to gt_bboxes. pred_bboxes is (m, 4), gt_bboxes is (n, 4) - gt_bboxes = gt_bboxes.T - pred_bboxes = pred_bboxes.T - gt_num = gt_bboxes.shape[1] - pred_bboxes = repeat(pred_bboxes, 'x m -> x m n', n=gt_num) # (4, m, n) - - # Get the coordinates of bounding boxes - if x1y1x2y2: # x1, y1, x2, y2 = box1 - p_x1, p_y1, p_x2, p_y2 = pred_bboxes[0], pred_bboxes[1], pred_bboxes[2], pred_bboxes[3] # mxn - g_x1, g_y1, g_x2, g_y2 = gt_bboxes[0], gt_bboxes[1], gt_bboxes[2], gt_bboxes[3] # n - else: # transform from xywh to xyxy - p_x1, p_x2 = pred_bboxes[0] - pred_bboxes[2] / 2, pred_bboxes[0] + pred_bboxes[2] / 2 - p_y1, p_y2 = pred_bboxes[1] - pred_bboxes[3] / 2, pred_bboxes[1] + pred_bboxes[3] / 2 - g_x1, g_x2 = gt_bboxes[0] - gt_bboxes[2] / 2, gt_bboxes[0] + gt_bboxes[2] / 2 - g_y1, g_y2 = gt_bboxes[1] - gt_bboxes[3] / 2, gt_bboxes[1] + gt_bboxes[3] / 2 - - x1_loss = torch.max(torch.zeros((p_x1-g_x1).shape).to(g_x1.device), g_x1-p_x1) # mxn - y1_loss = torch.max(torch.zeros((p_y1-g_y1).shape).to(g_x1.device), g_y1-p_y1) - x2_loss = torch.max(torch.zeros((g_x2-p_x2).shape).to(g_x1.device), p_x2-g_x2) - y2_loss = torch.max(torch.zeros((g_y2-p_y2).shape).to(g_x1.device), p_y2-g_y2) - - side_loss = x1_loss+x2_loss+y1_loss+y2_loss # mxn - return side_loss - -def find_intersection(set_1, set_2): - """ - Find the intersection of every box combination between two sets of boxes that are in boundary coordinates. - - :param set_1: set 1, a tensor of dimensions (n1, 4) -- (x1, y1, x2, y2) - :param set_2: set 2, a tensor of dimensions (n2, 4) - :return: intersection of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2) - """ - - # (n1, 1, 2) (1, n2, 2) --> (n1, n2, 2) - - # PyTorch auto-broadcasts singleton dimensions - lower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0)) # (n1, n2, 2) - # print('lt') - # print(lower_bounds) - upper_bounds = torch.min(set_1[:, 2:].unsqueeze(1), set_2[:, 2:].unsqueeze(0)) # (n1, n2, 2) - # print('rb') - # print(upper_bounds) - intersection_dims = torch.clamp(upper_bounds - lower_bounds, min=0) # (n1, n2, 2) - # print(intersection_dims) - return intersection_dims[:, :, 0] * intersection_dims[:, :, 1] # (n1, n2) - -def find_jaccard_overlap(set_1, set_2): - """ - Find the Jaccard Overlap (IoU) of every box combination between two sets of boxes that are in boundary coordinates. - - :param set_1: set 1, a tensor of dimensions (n1, 4) - :param set_2: set 2, a tensor of dimensions (n2, 4) - :return: Jaccard Overlap of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2) - """ - if set_1.dim() == 1 and set_1.shape[0] == 4: - set_1 = set_1.unsqueeze(0) - if set_2.dim() == 1 and set_2.shape[0] == 4: - set_2 = set_2.unsqueeze(0) - - # Find intersections - intersection = find_intersection(set_1, set_2) # (n1, n2) - - # print('intersection') - # print(intersection) - - # Find areas of each box in both sets - areas_set_1 = (set_1[:, 2] - set_1[:, 0]) * (set_1[:, 3] - set_1[:, 1]) # (n1) - areas_set_2 = (set_2[:, 2] - set_2[:, 0]) * (set_2[:, 3] - set_2[:, 1]) # (n2) - - # Find the union - # PyTorch auto-broadcasts singleton dimensions - union = areas_set_1.unsqueeze(1) + areas_set_2.unsqueeze(0) - intersection # (n1, n2) - - # print('union') - # print(union) - - return intersection / union # (n1, n2) - -def calculate_mAP_voc07(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold): - """ - Calculate the Mean Average Precision (mAP) of detected objects. - - See https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173 for an explanation - - det_boxes: list of tensors, [bs * (num_pred, 4)], one tensor for each image containing detected objects' bounding boxes - det_labels: list of tensors, [bs * (num_pred)], one tensor for each image containing detected objects' labels - det_scores: list of tensors, [bs * (num_pred)], one tensor for each image containing detected objects' labels' scores - true_boxes: list of tensors, [bs * (num_gt, 4)], one tensor for each image containing actual objects' bounding boxes - true_labels: list of tensors, [bs * (num_gt)], one tensor for each image containing actual objects' labels - true_difficulties: list of tensors, [bs * (num_gt)], one tensor for each image containing actual objects' difficulty (0 or 1) - - return: list of average precisions for all classes, mean average precision (mAP) - """ - - assert len(det_boxes) == len(det_labels) == len(det_scores) == len(true_boxes) == len(true_labels) == len(true_difficulties) # these are all lists of tensors of the same length, i.e. number of images - n_classes = 2 # len(label_map) - - # Store all (true) objects in a single continuous tensor while keeping track of the image it is from - true_images = list() - for i in range(len(true_labels)): - true_images.extend([i] * true_labels[i].shape[0]) # [n_objects = bs * num_gt] - true_images = torch.LongTensor(true_images).to(device) # (n_objects), n_objects is the total no. of objects across all images - true_boxes = torch.cat(true_boxes, dim=0) # (n_objects, 4), true_box[i] indicate the image index of i-th object - true_labels = torch.cat(true_labels, dim=0) # (n_objects) - true_difficulties = torch.cat(true_difficulties, dim=0) # (n_objects) - - assert true_images.size(0) == true_boxes.size(0) == true_labels.size(0) - - # print('=='*10) - # print('true_images') - # print(true_images) - # print('true_boxes') - # print(true_boxes) - # print('true_labels') - # print(true_labels) - # print('true_difficulties') - # print(true_difficulties) - - # Store all detections in a single continuous tensor while keeping track of the image it is from - det_images = list() - for i in range(len(det_labels)): - det_images.extend([i] * det_labels[i].shape[0]) # [n_detections = bs * num_pred] - det_images = torch.LongTensor(det_images).to(device) # (n_detections) - det_boxes = torch.cat(det_boxes, dim=0) # (n_detections, 4) - det_labels = torch.cat(det_labels, dim=0) # (n_detections) - det_scores = torch.cat(det_scores, dim=0) # (n_detections) - - # print('=='*10) - # print('det_images') - # print(det_images) - # print('det_boxes') - # print(det_boxes) - # print('det_labels') - # print(det_labels) - # print('det_scores') - # print(det_scores) - - assert det_images.size(0) == det_boxes.size(0) == det_labels.size(0) == det_scores.size(0) - - # Calculate APs for each class (except background) - average_precisions = torch.zeros((n_classes - 1), dtype=torch.float) # (n_classes - 1) - for c in range(1, n_classes): - # Extract only objects with this class - true_class_images = true_images[true_labels == c] # (n_class_objects) - true_class_boxes = true_boxes[true_labels == c] # (n_class_objects, 4) - true_class_difficulties = true_difficulties[true_labels == c] # (n_class_objects) - n_easy_class_objects = (1 - true_class_difficulties).sum().item() # ignore difficult objects ? difficulty of this class - - # Keep track of which true objects with this class have already been 'detected' -- 重复匹配同一个true box的后续detect box会被算作False Positive - # So far, none - true_class_boxes_detected = torch.zeros((true_class_difficulties.size(0)), dtype=torch.uint8).to(device) # (n_class_objects) - - # Extract only detections with this class - det_class_images = det_images[det_labels == c] # (n_class_detections) - det_class_boxes = det_boxes[det_labels == c] # (n_class_detections, 4) - det_class_scores = det_scores[det_labels == c] # (n_class_detections) - n_class_detections = det_class_boxes.size(0) - if n_class_detections == 0: - cumul_recall = cumul_precision = torch.tensor([0.0]) - continue - - # Sort detections in decreasing order of confidence/scores -- 重复匹配同一个true box的后续detect box会被算作False Positive - det_class_scores, sort_ind = torch.sort(det_class_scores, dim=0, descending=True) # (n_class_detections) - det_class_images = det_class_images[sort_ind] # (n_class_detections) - det_class_boxes = det_class_boxes[sort_ind] # (n_class_detections, 4) - - # In the order of decreasing scores, check if true or false positive - true_positives = torch.zeros((n_class_detections), dtype=torch.float).to(device) # (n_class_detections) -- 每个detect box要么true_positive位置上是1,要么false_positive位置上是1 - false_positives = torch.zeros((n_class_detections), dtype=torch.float).to(device) # (n_class_detections) - for d in range(n_class_detections): - this_detection_box = det_class_boxes[d].unsqueeze(0) # (1, 4) - this_image = det_class_images[d] # (), scalar - - # Find objects in the same image with this class, their difficulties, and whether they have been detected before - object_boxes = true_class_boxes[true_class_images == this_image] # (n_class_objects_in_img, 4) - object_difficulties = true_class_difficulties[true_class_images == this_image] # (n_class_objects_in_img) - # If no such object in this image, then the detection is a false positive - if object_boxes.size(0) == 0: - false_positives[d] = 1 - continue - - # print('=='*10) - # print('this_detection_box') - # print(this_detection_box) - # print('this_image') - # print(this_image) - # print('object_boxes') - # print(object_boxes) - # print('object_difficulties') - # print(object_difficulties) - - # Find maximum overlap of this detection with objects in this image of this class - overlaps = find_jaccard_overlap(box_cxcywh_to_xyxy(this_detection_box), box_cxcywh_to_xyxy(object_boxes)) # (1, n_class_objects_in_img) - max_overlap, ind = torch.max(overlaps.squeeze(0), dim=0) # (), () - scalars - - # print('overlaps') - # print(overlaps) - # print('max_overlap & ind') - # print(max_overlap, ind) - - # 'ind' is the index of the object in these image-level tensors 'object_boxes', 'object_difficulties' - # In the original class-level tensors 'true_class_boxes', etc., 'ind' corresponds to object with index... - original_ind = torch.LongTensor(range(true_class_boxes.size(0)))[true_class_images == this_image][ind] # 与detected box overlap最大的true box在所有true box中的index - # We need 'original_ind' to update 'true_class_boxes_detected' - - # print(original_ind) - - # If the maximum overlap is greater than the threshold of 0.5, it's a match - if max_overlap.item() > iou_threshold: - # If the object it matched with is 'difficult', ignore it - if object_difficulties[ind] == 0: - # If this object has already not been detected, it's a true positive - if true_class_boxes_detected[original_ind] == 0: - true_positives[d] = 1 - true_class_boxes_detected[original_ind] = 1 # this object has now been detected/accounted for - # Otherwise, it's a false positive (since this object is already accounted for) - else: - false_positives[d] = 1 - # Otherwise, the detection occurs in a different location than the actual object, and is a false positive - else: - false_positives[d] = 1 - - # print('true_positives') - # print(true_positives) - # print('false_positives') - # print(false_positives) - - # Compute cumulative precision and recall at each detection in the order of decreasing scores - cumul_true_positives = torch.cumsum(true_positives, dim=0) # (n_class_detections) - cumul_false_positives = torch.cumsum(false_positives, dim=0) # (n_class_detections) - cumul_precision = cumul_true_positives / ( - cumul_true_positives + cumul_false_positives + 1e-10) # (n_class_detections) -- 更多的detect box一定会提升recall,但precision可能会下降或上升 - cumul_recall = cumul_true_positives / n_easy_class_objects # (n_class_detections) - - # Find the mean of the maximum of the precisions corresponding to recalls above the threshold 't' - recall_thresholds = torch.arange(start=0, end=1.1, step=.1).tolist() # (11) - precisions = torch.zeros((len(recall_thresholds)), dtype=torch.float).to(device) # (11) - for i, t in enumerate(recall_thresholds): - recalls_above_t = cumul_recall >= t # 需要多少个detect box来达到recall的阈值 - if recalls_above_t.any(): - precisions[i] = cumul_precision[recalls_above_t].max() # 在count这么多detect box时,最高的precision - else: - precisions[i] = 0. - average_precisions[c - 1] = precisions.mean() # c is in [1, n_classes - 1] - - # Calculate Mean Average Precision (mAP) - mean_average_precision = average_precisions.mean().item() - recall = cumul_recall[-1].item() - precision = cumul_precision[-1].item() - - return mean_average_precision, recall, precision - -def calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold=0.75, score_threshold=0.5, ap_curve_path=None): - """ - Calculate the Mean Average Precision (mAP) of detected objects. - 列出所有的detection bbox,按照得分从高到低排序,然后每个与gt bbox去匹配,匹配上算作true pos,否则是false pos(每个gt bbox不可被重复匹配); - 然后对true pos累积,可以得到recall增长的曲线;同时对false pos累计,可以得到prec变化的曲线; - 取每个true positive(recall值增长的点)对应的最大prec,计算AP折线图像下的面积; - - See https://zhuanlan.zhihu.com/p/70667071 for an explanation - - det_boxes: list of tensors, [bs * (num_pred, 4)], one tensor for each image containing detected objects' bounding boxes - det_labels: list of tensors, [bs * (num_pred)], one tensor for each image containing detected objects' labels - det_scores: list of tensors, [bs * (num_pred)], one tensor for each image containing detected objects' labels' scores - true_boxes: list of tensors, [bs * (num_gt, 4)], one tensor for each image containing actual objects' bounding boxes - true_labels: list of tensors, [bs * (num_gt)], one tensor for each image containing actual objects' labels - true_difficulties: list of tensors, [bs * (num_gt)], one tensor for each image containing actual objects' difficulty (0 or 1) - - return: list of average precisions for all classes, mean average precision (mAP) - """ - assert len(det_boxes) == len(det_labels) == len(det_scores) == len(true_boxes) == len(true_labels) == len(true_difficulties) # these are all lists of tensors of the same length, i.e. number of images - n_classes = 2 # len(label_map) - - # Store all (true) objects in a single continuous tensor while keeping track of the image it is from - true_images = list() - for i in range(len(true_labels)): - true_images.extend([i] * true_labels[i].shape[0]) # [n_objects = bs * num_gt] - true_images = torch.LongTensor(true_images).to(device) # (n_objects), n_objects is the total no. of objects across all images - true_boxes = torch.cat(true_boxes, dim=0) # (n_objects, 4), true_box[i] indicate the image index of i-th object - true_labels = torch.cat(true_labels, dim=0) # (n_objects) - true_difficulties = torch.cat(true_difficulties, dim=0) # (n_objects) - - assert true_images.size(0) == true_boxes.size(0) == true_labels.size(0) - - # Store all detections in a single continuous tensor while keeping track of the image it is from - det_images = list() - for i in range(len(det_labels)): - det_images.extend([i] * det_labels[i].shape[0]) # [n_detections = bs * num_pred] - det_images = torch.LongTensor(det_images).to(device) # (n_detections) - det_boxes = torch.cat(det_boxes, dim=0) # (n_detections, 4) - det_labels = torch.cat(det_labels, dim=0) # (n_detections) - det_scores = torch.cat(det_scores, dim=0) # (n_detections) - - assert det_images.size(0) == det_boxes.size(0) == det_labels.size(0) == det_scores.size(0) - - # Calculate APs for each class (except background) - average_precisions = torch.zeros((n_classes - 1), dtype=torch.float) # (n_classes - 1) - for c in range(1, n_classes): - # Extract only objects with this class (对于所有subfig默认都算作一类 - true_class_images = true_images[true_labels == c] # (n_class_objects) - true_class_boxes = true_boxes[true_labels == c] # (n_class_objects, 4) - true_class_difficulties = true_difficulties[true_labels == c] # (n_class_objects) - n_easy_class_objects = (1 - true_class_difficulties).sum().item() # ignore difficult objects ? difficulty of this class - - # Keep track of which true objects with this class have already been 'detected' -- 重复匹配同一个true box的后续detect box会被算作False Positive - # So far, none - true_class_boxes_detected = torch.zeros((true_class_difficulties.size(0)), dtype=torch.uint8).to(device) # (n_class_objects) - match_matrice = torch.ones(true_class_difficulties.size(0)) * -1 # WARNING 仅针对只有一类检测目标, 且输入bs为1的时候 - - # Extract only detections with this class - det_class_images = det_images[det_labels == c] # (n_class_detections) - det_class_boxes = det_boxes[det_labels == c] # (n_class_detections, 4) - det_class_scores = det_scores[det_labels == c] # (n_class_detections) - n_class_detections = det_class_boxes.size(0) - if n_class_detections == 0: - cumul_recall = cumul_precision = torch.tensor([0.0]) - continue - - # Sort detections in decreasing order of confidence/scores -- 重复匹配同一个true box的后续detect box会被算作False Positive - det_class_scores, sort_ind = torch.sort(det_class_scores, dim=0, descending=True) # (n_class_detections) - det_class_images = det_class_images[sort_ind] # (n_class_detections) - det_class_boxes = det_class_boxes[sort_ind] # (n_class_detections, 4) - - # In the order of decreasing scores, check if true or false positive - true_positives = np.zeros(n_class_detections) # (n_class_detections) -- 每个detect box要么true_positive位置上是1,要么false_positive位置上是1 - false_positives = np.zeros(n_class_detections) # (n_class_detections) - threshold_index = -1 - for d in range(n_class_detections): - this_detection_box = det_class_boxes[d].unsqueeze(0) # (1, 4) - this_image = det_class_images[d] # (), scalar - - # 标记score threshold所在的位置,用于找到这个点的recall和precision - if threshold_index == -1 and det_class_scores[d] < score_threshold: - threshold_index = d-1 - - # Find objects in the same image with this class, their difficulties, and whether they have been detected before - object_boxes = true_class_boxes[true_class_images == this_image] # (n_class_objects_in_img, 4) - object_difficulties = true_class_difficulties[true_class_images == this_image] # (n_class_objects_in_img) - # If no such object in this image, then the detection is a false positive - if object_boxes.size(0) == 0: - false_positives[d] = 1 - continue - - # Find maximum overlap of this detection with objects in this image of this class - overlaps = find_jaccard_overlap(box_cxcywh_to_xyxy(this_detection_box), box_cxcywh_to_xyxy(object_boxes)) # (1, n_class_objects_in_img) - max_overlap, ind = torch.max(overlaps.squeeze(0), dim=0) # (), () - scalars - - # 'ind' is the index of the object in these image-level tensors 'object_boxes', 'object_difficulties' - # In the original class-level tensors 'true_class_boxes', etc., 'ind' corresponds to object with index... - original_ind = torch.LongTensor(range(true_class_boxes.size(0)))[true_class_images == this_image][ind] # 与detected box overlap最大的true box在所有true box中的index - # We need 'original_ind' to update 'true_class_boxes_detected' - - # If the maximum overlap is greater than the threshold of 0.5, it's a match - if max_overlap.item() > iou_threshold: - # If the object it matched with is 'difficult', ignore it - if object_difficulties[ind] == 0: - # If this object has already not been detected, it's a true positive - if true_class_boxes_detected[original_ind] == 0: - true_positives[d] = 1 - true_class_boxes_detected[original_ind] = 1 # this object has now been detected/accounted for - match_matrice[original_ind] = d - # Otherwise, it's a false positive (since this object is already accounted for) - else: - false_positives[d] = 1 - # Otherwise, the detection occurs in a different location than the actual object, and is a false positive - else: - false_positives[d] = 1 - - # Compute cumulative precision and recall at each detection in the order of decreasing scores - cumul_true_positives = np.concatenate(([0.], np.cumsum(true_positives, axis=0))) # (n_class_detections) - cumul_false_positives = np.concatenate(([0.], np.cumsum(false_positives, axis=0))) # (n_class_detections) - cumul_precision = cumul_true_positives / ( - cumul_true_positives + cumul_false_positives + 1e-10) # (n_class_detections) -- 更多的detect box一定会提升recall,但precision可能会下降或上升 - cumul_recall = cumul_true_positives / n_easy_class_objects # (n_class_detections) - - # checkpoint recall and precision - checkpoint_recall = cumul_recall[threshold_index].item() - checkpoint_precision = cumul_precision[threshold_index].item() - print(threshold_index, checkpoint_recall, checkpoint_precision) - - # save fig - if ap_curve_path: - plt.scatter(cumul_recall, cumul_precision, s=5) - plt.savefig(ap_curve_path) - - for i in range(cumul_precision.shape[0]-1, 0, -1): # 每个recall值,都取右边最大的prec - cumul_precision[i-1] = max(cumul_precision[i-1], cumul_precision[i]) - - change_points = np.where(cumul_recall[1:]!=cumul_recall[:-1])[0] - - average_precisions[c - 1] = np.sum((cumul_recall[change_points+1]-cumul_recall[change_points])*cumul_precision[change_points+1]) - - # Calculate Mean Average Precision (mAP) - mean_average_precision = average_precisions.mean().item() - - return mean_average_precision, checkpoint_recall, checkpoint_precision, match_matrice.tolist() - -if __name__=="__main__": - from dataset import FigCap_Dataset, my_collate - from torch.utils.data import DataLoader - from tqdm import tqdm - val_file = '/remote-home/share/medical/public/MedICaT/subfig_subcap_val.jsonl' - img_root = '/remote-home/share/medical/public/MedICaT/release/figures' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/scibert/vocab.txt' - ValSet = FigCap_Dataset(val_file, img_root, vocab_file) - ValLoader = DataLoader(ValSet, batch_size=1, shuffle=False, num_workers=4, collate_fn=my_collate) - - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(ValLoader): - subfigures = batch['subfigs'] - for i in range(len(subfigures)): - true_boxes.append(subfigures[i][1]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - - # print(true_boxes) - # print(true_labels) - # print(true_difficulties) - mAP, recall, precision = calculate_mAP(true_boxes, true_labels, true_labels, true_boxes, true_labels, true_difficulties, 0.7) - print(mAP, recall, precision) diff --git a/openpmcvl/granular/process/detr_code/backbone.py b/openpmcvl/granular/process/detr_code/backbone.py deleted file mode 100644 index 048b913..0000000 --- a/openpmcvl/granular/process/detr_code/backbone.py +++ /dev/null @@ -1,120 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -Backbone modules. -""" -from collections import OrderedDict - -import torch -import torch.nn.functional as F -import torchvision -from torch import nn -from torchvision.models._utils import IntermediateLayerGetter -from typing import Dict, List - -from .misc import NestedTensor, is_main_process - -from .position_encoding import build_position_encoding - - -class FrozenBatchNorm2d(torch.nn.Module): - """ - BatchNorm2d where the batch statistics and the affine parameters are fixed. - - Copy-paste from torchvision.misc.ops with added eps before rqsrt, - without which any other models than torchvision.models.resnet[18,34,50,101] - produce nans. - """ - - def __init__(self, n): - super(FrozenBatchNorm2d, self).__init__() - self.register_buffer("weight", torch.ones(n)) - self.register_buffer("bias", torch.zeros(n)) - self.register_buffer("running_mean", torch.zeros(n)) - self.register_buffer("running_var", torch.ones(n)) - - def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, - missing_keys, unexpected_keys, error_msgs): - num_batches_tracked_key = prefix + 'num_batches_tracked' - if num_batches_tracked_key in state_dict: - del state_dict[num_batches_tracked_key] - - super(FrozenBatchNorm2d, self)._load_from_state_dict( - state_dict, prefix, local_metadata, strict, - missing_keys, unexpected_keys, error_msgs) - - def forward(self, x): - # move reshapes to the beginning - # to make it fuser-friendly - w = self.weight.reshape(1, -1, 1, 1) - b = self.bias.reshape(1, -1, 1, 1) - rv = self.running_var.reshape(1, -1, 1, 1) - rm = self.running_mean.reshape(1, -1, 1, 1) - eps = 1e-5 - scale = w * (rv + eps).rsqrt() - bias = b - rm * scale - return x * scale + bias - - -class BackboneBase(nn.Module): - - def __init__(self, backbone: nn.Module, train_backbone: bool, num_channels: int, return_interm_layers: bool): - super().__init__() - for name, parameter in backbone.named_parameters(): - if not train_backbone or 'layer2' not in name and 'layer3' not in name and 'layer4' not in name: - parameter.requires_grad_(False) - if return_interm_layers: - return_layers = {"layer1": "0", "layer2": "1", "layer3": "2", "layer4": "3"} - else: - return_layers = {'layer4': "0"} - self.body = IntermediateLayerGetter(backbone, return_layers=return_layers) - self.num_channels = num_channels - - def forward(self, input_list): - image, image_mask = input_list - xs = self.body(image) - out = {} - for name, x in xs.items(): - m = image_mask - assert m is not None - mask = F.interpolate(m[None].float(), size=x.shape[-2:]).to(torch.bool)[0] - out[name] = [x, mask] - return out - - -class Backbone(BackboneBase): - """ResNet backbone with frozen BatchNorm.""" - def __init__(self, name: str, - train_backbone: bool, - return_interm_layers: bool, - dilation: bool): - backbone = getattr(torchvision.models, name)( - replace_stride_with_dilation=[False, False, dilation], - pretrained=is_main_process(), norm_layer=FrozenBatchNorm2d) - num_channels = 512 if name in ('resnet18', 'resnet34') else 2048 - super().__init__(backbone, train_backbone, num_channels, return_interm_layers) - - -class Joiner(nn.Sequential): - def __init__(self, backbone, position_embedding): - super().__init__(backbone, position_embedding) - - def forward(self, input_list): - xs = self[0](input_list) - out: List[NestedTensor] = [] - pos = [] - for name, x in xs.items(): - out.append(x) - # position encoding - pos.append(self[1](x).to(x[0].dtype)) - - return out, pos - - -def build_backbone(args): - position_embedding = build_position_encoding(args) - train_backbone = args.train_backbone - return_interm_layers = args.return_interm_layers - backbone = Backbone(args.backbone, train_backbone, return_interm_layers, args.dilation) - model = Joiner(backbone, position_embedding) - model.num_channels = backbone.num_channels - return model diff --git a/openpmcvl/granular/process/detr_code/detr.py b/openpmcvl/granular/process/detr_code/detr.py deleted file mode 100644 index 0ec5bae..0000000 --- a/openpmcvl/granular/process/detr_code/detr.py +++ /dev/null @@ -1,83 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -DETR model and criterion classes. -""" -import torch -import torch.nn.functional as F -from torch import nn -from .misc import NestedTensor, nested_tensor_from_tensor_list - -class DETR(nn.Module): - """ This is the DETR module that performs object detection """ - def __init__(self, backbone, transformer, num_classes, num_queries, aux_loss=False): - """ Initializes the model. - Parameters: - backbone: torch module of the backbone to be used. See backbone.py - transformer: torch module of the transformer architecture. See transformer.py - num_classes: number of object classes - num_queries: number of object queries, ie detection slot. This is the maximal number of objects - DETR can detect in a single image. For COCO, we recommend 100 queries. - aux_loss: True if auxiliary decoding losses (loss at each decoder layer) are to be used. - """ - super().__init__() - self.num_queries = num_queries - self.transformer = transformer - hidden_dim = transformer.d_model - self.class_embed = nn.Linear(hidden_dim, num_classes + 1) - self.bbox_embed = MLP(hidden_dim, hidden_dim, 4, 3) - self.query_embed = nn.Embedding(num_queries, hidden_dim) - self.input_proj = nn.Conv2d(backbone.num_channels, hidden_dim, kernel_size=1) - self.backbone = backbone - self.aux_loss = aux_loss - - def forward(self, input_list): - """ The forward expects a NestedTensor, which consists of: - - samples.tensor: batched images, of shape [batch_size x 3 x H x W] - - samples.mask: a binary mask of shape [batch_size x H x W], containing 1 on padded pixels - - It returns a dict with the following elements: - - "pred_logits": the classification logits (including no-object) for all queries. - Shape= [batch_size x num_queries] - - "pred_boxes": The normalized boxes coordinates for all queries, represented as - (center_x, center_y, height, width). These values are normalized in [0, 1], - relative to the size of each individual image (disregarding possible padding). - See PostProcess for information on how to retrieve the unnormalized bounding box. - - "aux_outputs": Optional, only returned when auxilary losses are activated. It is a list of - dictionnaries containing the two above keys for each decoder layer. - """ - features, pos = self.backbone(input_list) - - src, mask = features[-1] - assert mask is not None - hs = self.transformer(self.input_proj(src), mask, self.query_embed.weight, pos[-1])[0] - - outputs_class = self.class_embed(hs).sigmoid() - outputs_coord = self.bbox_embed(hs).sigmoid() - # binary - pred_logits = outputs_class[-1][:, :, 0] - out = {'pred_logits': pred_logits, 'pred_boxes': outputs_coord[-1]} - if self.aux_loss: - out['aux_outputs'] = self._set_aux_loss(outputs_class, outputs_coord) - return out - - @torch.jit.unused - def _set_aux_loss(self, outputs_class, outputs_coord): - # this is a workaround to make torchscript happy, as torchscript - # doesn't support dictionary with non-homogeneous values, such - # as a dict having both a Tensor and a list. - return [{'pred_logits': a, 'pred_boxes': b} - for a, b in zip(outputs_class[:-1], outputs_coord[:-1])] - -class MLP(nn.Module): - """ Very simple multi-layer perceptron (also called FFN)""" - - def __init__(self, input_dim, hidden_dim, output_dim, num_layers): - super().__init__() - self.num_layers = num_layers - h = [hidden_dim] * (num_layers - 1) - self.layers = nn.ModuleList(nn.Linear(n, k) for n, k in zip([input_dim] + h, h + [output_dim])) - - def forward(self, x): - for i, layer in enumerate(self.layers): - x = F.relu(layer(x)) if i < self.num_layers - 1 else layer(x) - return x diff --git a/openpmcvl/granular/process/detr_code/matcher.py b/openpmcvl/granular/process/detr_code/matcher.py deleted file mode 100644 index 0c29147..0000000 --- a/openpmcvl/granular/process/detr_code/matcher.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -Modules to compute the matching cost and solve the corresponding LSAP. -""" -import torch -from scipy.optimize import linear_sum_assignment -from torch import nn - -from util.box_ops import box_cxcywh_to_xyxy, generalized_box_iou - - -class HungarianMatcher(nn.Module): - """This class computes an assignment between the targets and the predictions of the network - - For efficiency reasons, the targets don't include the no_object. Because of this, in general, - there are more predictions than targets. In this case, we do a 1-to-1 matching of the best predictions, - while the others are un-matched (and thus treated as non-objects). - """ - - def __init__(self, cost_class: float = 1, cost_bbox: float = 1, cost_giou: float = 1): - """Creates the matcher - - Params: - cost_class: This is the relative weight of the classification error in the matching cost - cost_bbox: This is the relative weight of the L1 error of the bounding box coordinates in the matching cost - cost_giou: This is the relative weight of the giou loss of the bounding box in the matching cost - """ - super().__init__() - self.cost_class = cost_class - self.cost_bbox = cost_bbox - self.cost_giou = cost_giou - assert cost_class != 0 or cost_bbox != 0 or cost_giou != 0, "all costs cant be 0" - - @torch.no_grad() - def forward(self, outputs, targets): - """ Performs the matching - - Params: - outputs: This is a dict that contains at least these entries: - "pred_logits": Tensor of dim [batch_size, num_queries, num_classes] with the classification logits - "pred_boxes": Tensor of dim [batch_size, num_queries, 4] with the predicted box coordinates - - targets: This is a list of targets (len(targets) = batch_size), where each target is a dict containing: - "labels": Tensor of dim [num_target_boxes] (where num_target_boxes is the number of ground-truth - objects in the target) containing the class labels - "boxes": Tensor of dim [num_target_boxes, 4] containing the target box coordinates - - Returns: - A list of size batch_size, containing tuples of (index_i, index_j) where: - - index_i is the indices of the selected predictions (in order) - - index_j is the indices of the corresponding selected targets (in order) - For each batch element, it holds: - len(index_i) = len(index_j) = min(num_queries, num_target_boxes) - """ - bs, num_queries = outputs["pred_logits"].shape[:2] - - # We flatten to compute the cost matrices in a batch - out_prob = outputs["pred_logits"].flatten(0, 1).softmax(-1) # [batch_size * num_queries, num_classes] - out_bbox = outputs["pred_boxes"].flatten(0, 1) # [batch_size * num_queries, 4] - - # Also concat the target labels and boxes - tgt_ids = torch.cat([v["labels"] for v in targets]) - tgt_bbox = torch.cat([v["boxes"] for v in targets]) - - # Compute the classification cost. Contrary to the loss, we don't use the NLL, - # but approximate it in 1 - proba[target class]. - # The 1 is a constant that doesn't change the matching, it can be ommitted. - cost_class = -out_prob[:, tgt_ids] - - # Compute the L1 cost between boxes - cost_bbox = torch.cdist(out_bbox, tgt_bbox, p=1) - - # Compute the giou cost betwen boxes - cost_giou = -generalized_box_iou(box_cxcywh_to_xyxy(out_bbox), box_cxcywh_to_xyxy(tgt_bbox)) - - # Final cost matrix - C = self.cost_bbox * cost_bbox + self.cost_class * cost_class + self.cost_giou * cost_giou - C = C.view(bs, num_queries, -1).cpu() - - sizes = [len(v["boxes"]) for v in targets] - indices = [linear_sum_assignment(c[i]) for i, c in enumerate(C.split(sizes, -1))] - return [(torch.as_tensor(i, dtype=torch.int64), torch.as_tensor(j, dtype=torch.int64)) for i, j in indices] - - -def build_matcher(args): - return HungarianMatcher(cost_class=args.set_cost_class, cost_bbox=args.set_cost_bbox, cost_giou=args.set_cost_giou) diff --git a/openpmcvl/granular/process/detr_code/misc.py b/openpmcvl/granular/process/detr_code/misc.py deleted file mode 100644 index dfa9fb5..0000000 --- a/openpmcvl/granular/process/detr_code/misc.py +++ /dev/null @@ -1,468 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -Misc functions, including distributed helpers. - -Mostly copy-paste from torchvision references. -""" -import os -import subprocess -import time -from collections import defaultdict, deque -import datetime -import pickle -from packaging import version -from typing import Optional, List - -import torch -import torch.distributed as dist -from torch import Tensor - -# needed due to empty tensor bug in pytorch and torchvision 0.5 -import torchvision -if version.parse(torchvision.__version__) < version.parse('0.7'): - from torchvision.ops import _new_empty_tensor - from torchvision.ops.misc import _output_size - - -class SmoothedValue(object): - """Track a series of values and provide access to smoothed values over a - window or the global series average. - """ - - def __init__(self, window_size=20, fmt=None): - if fmt is None: - fmt = "{median:.4f} ({global_avg:.4f})" - self.deque = deque(maxlen=window_size) - self.total = 0.0 - self.count = 0 - self.fmt = fmt - - def update(self, value, n=1): - self.deque.append(value) - self.count += n - self.total += value * n - - def synchronize_between_processes(self): - """ - Warning: does not synchronize the deque! - """ - if not is_dist_avail_and_initialized(): - return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') - dist.barrier() - dist.all_reduce(t) - t = t.tolist() - self.count = int(t[0]) - self.total = t[1] - - @property - def median(self): - d = torch.tensor(list(self.deque)) - return d.median().item() - - @property - def avg(self): - d = torch.tensor(list(self.deque), dtype=torch.float32) - return d.mean().item() - - @property - def global_avg(self): - return self.total / self.count - - @property - def max(self): - return max(self.deque) - - @property - def value(self): - return self.deque[-1] - - def __str__(self): - return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value) - - -def all_gather(data): - """ - Run all_gather on arbitrary picklable data (not necessarily tensors) - Args: - data: any picklable object - Returns: - list[data]: list of data gathered from each rank - """ - world_size = get_world_size() - if world_size == 1: - return [data] - - # serialized to a Tensor - buffer = pickle.dumps(data) - storage = torch.ByteStorage.from_buffer(buffer) - tensor = torch.ByteTensor(storage).to("cuda") - - # obtain Tensor size of each rank - local_size = torch.tensor([tensor.numel()], device="cuda") - size_list = [torch.tensor([0], device="cuda") for _ in range(world_size)] - dist.all_gather(size_list, local_size) - size_list = [int(size.item()) for size in size_list] - max_size = max(size_list) - - # receiving Tensor from all ranks - # we pad the tensor because torch all_gather does not support - # gathering tensors of different shapes - tensor_list = [] - for _ in size_list: - tensor_list.append(torch.empty((max_size,), dtype=torch.uint8, device="cuda")) - if local_size != max_size: - padding = torch.empty(size=(max_size - local_size,), dtype=torch.uint8, device="cuda") - tensor = torch.cat((tensor, padding), dim=0) - dist.all_gather(tensor_list, tensor) - - data_list = [] - for size, tensor in zip(size_list, tensor_list): - buffer = tensor.cpu().numpy().tobytes()[:size] - data_list.append(pickle.loads(buffer)) - - return data_list - - -def reduce_dict(input_dict, average=True): - """ - Args: - input_dict (dict): all the values will be reduced - average (bool): whether to do average or sum - Reduce the values in the dictionary from all processes so that all processes - have the averaged results. Returns a dict with the same fields as - input_dict, after reduction. - """ - world_size = get_world_size() - if world_size < 2: - return input_dict - with torch.no_grad(): - names = [] - values = [] - # sort the keys so that they are consistent across processes - for k in sorted(input_dict.keys()): - names.append(k) - values.append(input_dict[k]) - values = torch.stack(values, dim=0) - dist.all_reduce(values) - if average: - values /= world_size - reduced_dict = {k: v for k, v in zip(names, values)} - return reduced_dict - - -class MetricLogger(object): - def __init__(self, delimiter="\t"): - self.meters = defaultdict(SmoothedValue) - self.delimiter = delimiter - - def update(self, **kwargs): - for k, v in kwargs.items(): - if isinstance(v, torch.Tensor): - v = v.item() - assert isinstance(v, (float, int)) - self.meters[k].update(v) - - def __getattr__(self, attr): - if attr in self.meters: - return self.meters[attr] - if attr in self.__dict__: - return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) - - def __str__(self): - loss_str = [] - for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) - return self.delimiter.join(loss_str) - - def synchronize_between_processes(self): - for meter in self.meters.values(): - meter.synchronize_between_processes() - - def add_meter(self, name, meter): - self.meters[name] = meter - - def log_every(self, iterable, print_freq, header=None): - i = 0 - if not header: - header = '' - start_time = time.time() - end = time.time() - iter_time = SmoothedValue(fmt='{avg:.4f}') - data_time = SmoothedValue(fmt='{avg:.4f}') - space_fmt = ':' + str(len(str(len(iterable)))) + 'd' - if torch.cuda.is_available(): - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}', - 'max mem: {memory:.0f}' - ]) - else: - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}' - ]) - MB = 1024.0 * 1024.0 - for obj in iterable: - data_time.update(time.time() - end) - yield obj - iter_time.update(time.time() - end) - if i % print_freq == 0 or i == len(iterable) - 1: - eta_seconds = iter_time.global_avg * (len(iterable) - i) - eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) - if torch.cuda.is_available(): - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB)) - else: - print(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time))) - i += 1 - end = time.time() - total_time = time.time() - start_time - total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print('{} Total time: {} ({:.4f} s / it)'.format( - header, total_time_str, total_time / len(iterable))) - - -def get_sha(): - cwd = os.path.dirname(os.path.abspath(__file__)) - - def _run(command): - return subprocess.check_output(command, cwd=cwd).decode('ascii').strip() - sha = 'N/A' - diff = "clean" - branch = 'N/A' - try: - sha = _run(['git', 'rev-parse', 'HEAD']) - subprocess.check_output(['git', 'diff'], cwd=cwd) - diff = _run(['git', 'diff-index', 'HEAD']) - diff = "has uncommited changes" if diff else "clean" - branch = _run(['git', 'rev-parse', '--abbrev-ref', 'HEAD']) - except Exception: - pass - message = f"sha: {sha}, status: {diff}, branch: {branch}" - return message - - -def collate_fn(batch): - batch = list(zip(*batch)) - batch[0] = nested_tensor_from_tensor_list(batch[0]) - return tuple(batch) - - -def _max_by_axis(the_list): - # type: (List[List[int]]) -> List[int] - maxes = the_list[0] - for sublist in the_list[1:]: - for index, item in enumerate(sublist): - maxes[index] = max(maxes[index], item) - return maxes - - -class NestedTensor(object): - def __init__(self, tensors, mask: Optional[Tensor]): - self.tensors = tensors - self.mask = mask - - def to(self, device): - # type: (Device) -> NestedTensor # noqa - cast_tensor = self.tensors.to(device) - mask = self.mask - if mask is not None: - assert mask is not None - cast_mask = mask.to(device) - else: - cast_mask = None - return NestedTensor(cast_tensor, cast_mask) - - def decompose(self): - return self.tensors, self.mask - - def __repr__(self): - return str(self.tensors) - - -def nested_tensor_from_tensor_list(tensor_list: List[Tensor]): - # TODO make this more general - if tensor_list[0].ndim == 3: - if torchvision._is_tracing(): - # nested_tensor_from_tensor_list() does not export well to ONNX - # call _onnx_nested_tensor_from_tensor_list() instead - return _onnx_nested_tensor_from_tensor_list(tensor_list) - - # TODO make it support different-sized images - max_size = _max_by_axis([list(img.shape) for img in tensor_list]) - # min_size = tuple(min(s) for s in zip(*[img.shape for img in tensor_list])) - batch_shape = [len(tensor_list)] + max_size - b, c, h, w = batch_shape - dtype = tensor_list[0].dtype - device = tensor_list[0].device - tensor = torch.zeros(batch_shape, dtype=dtype, device=device) - mask = torch.ones((b, h, w), dtype=torch.bool, device=device) - for img, pad_img, m in zip(tensor_list, tensor, mask): - pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img) - m[: img.shape[1], :img.shape[2]] = False - else: - raise ValueError('not supported') - return NestedTensor(tensor, mask) - - -# _onnx_nested_tensor_from_tensor_list() is an implementation of -# nested_tensor_from_tensor_list() that is supported by ONNX tracing. -@torch.jit.unused -def _onnx_nested_tensor_from_tensor_list(tensor_list: List[Tensor]) -> NestedTensor: - max_size = [] - for i in range(tensor_list[0].dim()): - max_size_i = torch.max(torch.stack([img.shape[i] for img in tensor_list]).to(torch.float32)).to(torch.int64) - max_size.append(max_size_i) - max_size = tuple(max_size) - - # work around for - # pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img) - # m[: img.shape[1], :img.shape[2]] = False - # which is not yet supported in onnx - padded_imgs = [] - padded_masks = [] - for img in tensor_list: - padding = [(s1 - s2) for s1, s2 in zip(max_size, tuple(img.shape))] - padded_img = torch.nn.functional.pad(img, (0, padding[2], 0, padding[1], 0, padding[0])) - padded_imgs.append(padded_img) - - m = torch.zeros_like(img[0], dtype=torch.int, device=img.device) - padded_mask = torch.nn.functional.pad(m, (0, padding[2], 0, padding[1]), "constant", 1) - padded_masks.append(padded_mask.to(torch.bool)) - - tensor = torch.stack(padded_imgs) - mask = torch.stack(padded_masks) - - return NestedTensor(tensor, mask=mask) - - -def setup_for_distributed(is_master): - """ - This function disables printing when not in master process - """ - import builtins as __builtin__ - builtin_print = __builtin__.print - - def print(*args, **kwargs): - force = kwargs.pop('force', False) - if is_master or force: - builtin_print(*args, **kwargs) - - __builtin__.print = print - - -def is_dist_avail_and_initialized(): - if not dist.is_available(): - return False - if not dist.is_initialized(): - return False - return True - - -def get_world_size(): - if not is_dist_avail_and_initialized(): - return 1 - return dist.get_world_size() - - -def get_rank(): - if not is_dist_avail_and_initialized(): - return 0 - return dist.get_rank() - - -def is_main_process(): - return get_rank() == 0 - - -def save_on_master(*args, **kwargs): - if is_main_process(): - torch.save(*args, **kwargs) - - -def init_distributed_mode(args): - if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: - args.rank = int(os.environ["RANK"]) - args.world_size = int(os.environ['WORLD_SIZE']) - args.gpu = int(os.environ['LOCAL_RANK']) - elif 'SLURM_PROCID' in os.environ: - args.rank = int(os.environ['SLURM_PROCID']) - args.gpu = args.rank % torch.cuda.device_count() - else: - print('Not using distributed mode') - args.distributed = False - return - - args.distributed = True - - torch.cuda.set_device(args.gpu) - args.dist_backend = 'nccl' - print('| distributed init (rank {}): {}'.format( - args.rank, args.dist_url), flush=True) - torch.distributed.init_process_group(backend=args.dist_backend, init_method=args.dist_url, - world_size=args.world_size, rank=args.rank) - torch.distributed.barrier() - setup_for_distributed(args.rank == 0) - - -@torch.no_grad() -def accuracy(output, target, topk=(1,)): - """Computes the precision@k for the specified values of k""" - if target.numel() == 0: - return [torch.zeros([], device=output.device)] - maxk = max(topk) - batch_size = target.size(0) - - _, pred = output.topk(maxk, 1, True, True) - pred = pred.t() - correct = pred.eq(target.view(1, -1).expand_as(pred)) - - res = [] - for k in topk: - correct_k = correct[:k].view(-1).float().sum(0) - res.append(correct_k.mul_(100.0 / batch_size)) - return res - - -def interpolate(input, size=None, scale_factor=None, mode="nearest", align_corners=None): - # type: (Tensor, Optional[List[int]], Optional[float], str, Optional[bool]) -> Tensor - """ - Equivalent to nn.functional.interpolate, but with support for empty batch sizes. - This will eventually be supported natively by PyTorch, and this - class can go away. - """ - if version.parse(torchvision.__version__) < version.parse('0.7'): - if input.numel() > 0: - return torch.nn.functional.interpolate( - input, size, scale_factor, mode, align_corners - ) - - output_shape = _output_size(2, input, size, scale_factor) - output_shape = list(input.shape[:-2]) + list(output_shape) - return _new_empty_tensor(input, output_shape) - else: - return torchvision.ops.misc.interpolate(input, size, scale_factor, mode, align_corners) diff --git a/openpmcvl/granular/process/detr_code/position_encoding.py b/openpmcvl/granular/process/detr_code/position_encoding.py deleted file mode 100644 index b84f0a2..0000000 --- a/openpmcvl/granular/process/detr_code/position_encoding.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -Various positional encodings for the transformer. -""" -import math -import torch -from torch import nn - -from .misc import NestedTensor - - -class PositionEmbeddingSine(nn.Module): - """ - This is a more standard version of the position embedding, very similar to the one - used by the Attention is all you need paper, generalized to work on images. - """ - def __init__(self, num_pos_feats=64, temperature=10000, normalize=False, scale=None): - super().__init__() - self.num_pos_feats = num_pos_feats - self.temperature = temperature - self.normalize = normalize - if scale is not None and normalize is False: - raise ValueError("normalize should be True if scale is passed") - if scale is None: - scale = 2 * math.pi - self.scale = scale - - def forward(self, input_list): - x = input_list[0] - mask = input_list[1] - assert mask is not None - not_mask = ~mask - y_embed = not_mask.cumsum(1, dtype=torch.float32) - x_embed = not_mask.cumsum(2, dtype=torch.float32) - if self.normalize: - eps = 1e-6 - y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale - x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale - - dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) - dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) - - pos_x = x_embed[:, :, :, None] / dim_t - pos_y = y_embed[:, :, :, None] / dim_t - pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) - pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) - pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) - return pos - - -class PositionEmbeddingLearned(nn.Module): - """ - Absolute pos embedding, learned. - """ - def __init__(self, num_pos_feats=256): - super().__init__() - self.row_embed = nn.Embedding(50, num_pos_feats) - self.col_embed = nn.Embedding(50, num_pos_feats) - self.reset_parameters() - - def reset_parameters(self): - nn.init.uniform_(self.row_embed.weight) - nn.init.uniform_(self.col_embed.weight) - - def forward(self, tensor_list: NestedTensor): - x = tensor_list.tensors - h, w = x.shape[-2:] - i = torch.arange(w, device=x.device) - j = torch.arange(h, device=x.device) - x_emb = self.col_embed(i) - y_emb = self.row_embed(j) - pos = torch.cat([ - x_emb.unsqueeze(0).repeat(h, 1, 1), - y_emb.unsqueeze(1).repeat(1, w, 1), - ], dim=-1).permute(2, 0, 1).unsqueeze(0).repeat(x.shape[0], 1, 1, 1) - return pos - - -def build_position_encoding(args): - N_steps = args.hidden_dim // 2 - if args.position_embedding in ('v2', 'sine'): - # TODO find a better way of exposing other arguments - position_embedding = PositionEmbeddingSine(N_steps, normalize=True) - elif args.position_embedding in ('v3', 'learned'): - position_embedding = PositionEmbeddingLearned(N_steps) - else: - raise ValueError(f"not supported {args.position_embedding}") - - return position_embedding diff --git a/openpmcvl/granular/process/detr_code/segmentation.py b/openpmcvl/granular/process/detr_code/segmentation.py deleted file mode 100644 index 01faa88..0000000 --- a/openpmcvl/granular/process/detr_code/segmentation.py +++ /dev/null @@ -1,363 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -This file provides the definition of the convolutional heads used to predict masks, as well as the losses -""" -import io -from collections import defaultdict -from typing import List, Optional - -import torch -import torch.nn as nn -import torch.nn.functional as F -from torch import Tensor -from PIL import Image - -import util.box_ops as box_ops -from util.misc import NestedTensor, interpolate, nested_tensor_from_tensor_list - -try: - from panopticapi.utils import id2rgb, rgb2id -except ImportError: - pass - - -class DETRsegm(nn.Module): - def __init__(self, detr, freeze_detr=False): - super().__init__() - self.detr = detr - - if freeze_detr: - for p in self.parameters(): - p.requires_grad_(False) - - hidden_dim, nheads = detr.transformer.d_model, detr.transformer.nhead - self.bbox_attention = MHAttentionMap(hidden_dim, hidden_dim, nheads, dropout=0.0) - self.mask_head = MaskHeadSmallConv(hidden_dim + nheads, [1024, 512, 256], hidden_dim) - - def forward(self, samples: NestedTensor): - if isinstance(samples, (list, torch.Tensor)): - samples = nested_tensor_from_tensor_list(samples) - features, pos = self.detr.backbone(samples) - - bs = features[-1].tensors.shape[0] - - src, mask = features[-1].decompose() - assert mask is not None - src_proj = self.detr.input_proj(src) - hs, memory = self.detr.transformer(src_proj, mask, self.detr.query_embed.weight, pos[-1]) - - outputs_class = self.detr.class_embed(hs) - outputs_coord = self.detr.bbox_embed(hs).sigmoid() - out = {"pred_logits": outputs_class[-1], "pred_boxes": outputs_coord[-1]} - if self.detr.aux_loss: - out['aux_outputs'] = self.detr._set_aux_loss(outputs_class, outputs_coord) - - # FIXME h_boxes takes the last one computed, keep this in mind - bbox_mask = self.bbox_attention(hs[-1], memory, mask=mask) - - seg_masks = self.mask_head(src_proj, bbox_mask, [features[2].tensors, features[1].tensors, features[0].tensors]) - outputs_seg_masks = seg_masks.view(bs, self.detr.num_queries, seg_masks.shape[-2], seg_masks.shape[-1]) - - out["pred_masks"] = outputs_seg_masks - return out - - -def _expand(tensor, length: int): - return tensor.unsqueeze(1).repeat(1, int(length), 1, 1, 1).flatten(0, 1) - - -class MaskHeadSmallConv(nn.Module): - """ - Simple convolutional head, using group norm. - Upsampling is done using a FPN approach - """ - - def __init__(self, dim, fpn_dims, context_dim): - super().__init__() - - inter_dims = [dim, context_dim // 2, context_dim // 4, context_dim // 8, context_dim // 16, context_dim // 64] - self.lay1 = torch.nn.Conv2d(dim, dim, 3, padding=1) - self.gn1 = torch.nn.GroupNorm(8, dim) - self.lay2 = torch.nn.Conv2d(dim, inter_dims[1], 3, padding=1) - self.gn2 = torch.nn.GroupNorm(8, inter_dims[1]) - self.lay3 = torch.nn.Conv2d(inter_dims[1], inter_dims[2], 3, padding=1) - self.gn3 = torch.nn.GroupNorm(8, inter_dims[2]) - self.lay4 = torch.nn.Conv2d(inter_dims[2], inter_dims[3], 3, padding=1) - self.gn4 = torch.nn.GroupNorm(8, inter_dims[3]) - self.lay5 = torch.nn.Conv2d(inter_dims[3], inter_dims[4], 3, padding=1) - self.gn5 = torch.nn.GroupNorm(8, inter_dims[4]) - self.out_lay = torch.nn.Conv2d(inter_dims[4], 1, 3, padding=1) - - self.dim = dim - - self.adapter1 = torch.nn.Conv2d(fpn_dims[0], inter_dims[1], 1) - self.adapter2 = torch.nn.Conv2d(fpn_dims[1], inter_dims[2], 1) - self.adapter3 = torch.nn.Conv2d(fpn_dims[2], inter_dims[3], 1) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - nn.init.kaiming_uniform_(m.weight, a=1) - nn.init.constant_(m.bias, 0) - - def forward(self, x: Tensor, bbox_mask: Tensor, fpns: List[Tensor]): - x = torch.cat([_expand(x, bbox_mask.shape[1]), bbox_mask.flatten(0, 1)], 1) - - x = self.lay1(x) - x = self.gn1(x) - x = F.relu(x) - x = self.lay2(x) - x = self.gn2(x) - x = F.relu(x) - - cur_fpn = self.adapter1(fpns[0]) - if cur_fpn.size(0) != x.size(0): - cur_fpn = _expand(cur_fpn, x.size(0) // cur_fpn.size(0)) - x = cur_fpn + F.interpolate(x, size=cur_fpn.shape[-2:], mode="nearest") - x = self.lay3(x) - x = self.gn3(x) - x = F.relu(x) - - cur_fpn = self.adapter2(fpns[1]) - if cur_fpn.size(0) != x.size(0): - cur_fpn = _expand(cur_fpn, x.size(0) // cur_fpn.size(0)) - x = cur_fpn + F.interpolate(x, size=cur_fpn.shape[-2:], mode="nearest") - x = self.lay4(x) - x = self.gn4(x) - x = F.relu(x) - - cur_fpn = self.adapter3(fpns[2]) - if cur_fpn.size(0) != x.size(0): - cur_fpn = _expand(cur_fpn, x.size(0) // cur_fpn.size(0)) - x = cur_fpn + F.interpolate(x, size=cur_fpn.shape[-2:], mode="nearest") - x = self.lay5(x) - x = self.gn5(x) - x = F.relu(x) - - x = self.out_lay(x) - return x - - -class MHAttentionMap(nn.Module): - """This is a 2D attention module, which only returns the attention softmax (no multiplication by value)""" - - def __init__(self, query_dim, hidden_dim, num_heads, dropout=0.0, bias=True): - super().__init__() - self.num_heads = num_heads - self.hidden_dim = hidden_dim - self.dropout = nn.Dropout(dropout) - - self.q_linear = nn.Linear(query_dim, hidden_dim, bias=bias) - self.k_linear = nn.Linear(query_dim, hidden_dim, bias=bias) - - nn.init.zeros_(self.k_linear.bias) - nn.init.zeros_(self.q_linear.bias) - nn.init.xavier_uniform_(self.k_linear.weight) - nn.init.xavier_uniform_(self.q_linear.weight) - self.normalize_fact = float(hidden_dim / self.num_heads) ** -0.5 - - def forward(self, q, k, mask: Optional[Tensor] = None): - q = self.q_linear(q) - k = F.conv2d(k, self.k_linear.weight.unsqueeze(-1).unsqueeze(-1), self.k_linear.bias) - qh = q.view(q.shape[0], q.shape[1], self.num_heads, self.hidden_dim // self.num_heads) - kh = k.view(k.shape[0], self.num_heads, self.hidden_dim // self.num_heads, k.shape[-2], k.shape[-1]) - weights = torch.einsum("bqnc,bnchw->bqnhw", qh * self.normalize_fact, kh) - - if mask is not None: - weights.masked_fill_(mask.unsqueeze(1).unsqueeze(1), float("-inf")) - weights = F.softmax(weights.flatten(2), dim=-1).view(weights.size()) - weights = self.dropout(weights) - return weights - - -def dice_loss(inputs, targets, num_boxes): - """ - Compute the DICE loss, similar to generalized IOU for masks - Args: - inputs: A float tensor of arbitrary shape. - The predictions for each example. - targets: A float tensor with the same shape as inputs. Stores the binary - classification label for each element in inputs - (0 for the negative class and 1 for the positive class). - """ - inputs = inputs.sigmoid() - inputs = inputs.flatten(1) - numerator = 2 * (inputs * targets).sum(1) - denominator = inputs.sum(-1) + targets.sum(-1) - loss = 1 - (numerator + 1) / (denominator + 1) - return loss.sum() / num_boxes - - -def sigmoid_focal_loss(inputs, targets, num_boxes, alpha: float = 0.25, gamma: float = 2): - """ - Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002. - Args: - inputs: A float tensor of arbitrary shape. - The predictions for each example. - targets: A float tensor with the same shape as inputs. Stores the binary - classification label for each element in inputs - (0 for the negative class and 1 for the positive class). - alpha: (optional) Weighting factor in range (0,1) to balance - positive vs negative examples. Default = -1 (no weighting). - gamma: Exponent of the modulating factor (1 - p_t) to - balance easy vs hard examples. - Returns: - Loss tensor - """ - prob = inputs.sigmoid() - ce_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction="none") - p_t = prob * targets + (1 - prob) * (1 - targets) - loss = ce_loss * ((1 - p_t) ** gamma) - - if alpha >= 0: - alpha_t = alpha * targets + (1 - alpha) * (1 - targets) - loss = alpha_t * loss - - return loss.mean(1).sum() / num_boxes - - -class PostProcessSegm(nn.Module): - def __init__(self, threshold=0.5): - super().__init__() - self.threshold = threshold - - @torch.no_grad() - def forward(self, results, outputs, orig_target_sizes, max_target_sizes): - assert len(orig_target_sizes) == len(max_target_sizes) - max_h, max_w = max_target_sizes.max(0)[0].tolist() - outputs_masks = outputs["pred_masks"].squeeze(2) - outputs_masks = F.interpolate(outputs_masks, size=(max_h, max_w), mode="bilinear", align_corners=False) - outputs_masks = (outputs_masks.sigmoid() > self.threshold).cpu() - - for i, (cur_mask, t, tt) in enumerate(zip(outputs_masks, max_target_sizes, orig_target_sizes)): - img_h, img_w = t[0], t[1] - results[i]["masks"] = cur_mask[:, :img_h, :img_w].unsqueeze(1) - results[i]["masks"] = F.interpolate( - results[i]["masks"].float(), size=tuple(tt.tolist()), mode="nearest" - ).byte() - - return results - - -class PostProcessPanoptic(nn.Module): - """This class converts the output of the model to the final panoptic result, in the format expected by the - coco panoptic API """ - - def __init__(self, is_thing_map, threshold=0.85): - """ - Parameters: - is_thing_map: This is a whose keys are the class ids, and the values a boolean indicating whether - the class is a thing (True) or a stuff (False) class - threshold: confidence threshold: segments with confidence lower than this will be deleted - """ - super().__init__() - self.threshold = threshold - self.is_thing_map = is_thing_map - - def forward(self, outputs, processed_sizes, target_sizes=None): - """ This function computes the panoptic prediction from the model's predictions. - Parameters: - outputs: This is a dict coming directly from the model. See the model doc for the content. - processed_sizes: This is a list of tuples (or torch tensors) of sizes of the images that were passed to the - model, ie the size after data augmentation but before batching. - target_sizes: This is a list of tuples (or torch tensors) corresponding to the requested final size - of each prediction. If left to None, it will default to the processed_sizes - """ - if target_sizes is None: - target_sizes = processed_sizes - assert len(processed_sizes) == len(target_sizes) - out_logits, raw_masks, raw_boxes = outputs["pred_logits"], outputs["pred_masks"], outputs["pred_boxes"] - assert len(out_logits) == len(raw_masks) == len(target_sizes) - preds = [] - - def to_tuple(tup): - if isinstance(tup, tuple): - return tup - return tuple(tup.cpu().tolist()) - - for cur_logits, cur_masks, cur_boxes, size, target_size in zip( - out_logits, raw_masks, raw_boxes, processed_sizes, target_sizes - ): - # we filter empty queries and detection below threshold - scores, labels = cur_logits.softmax(-1).max(-1) - keep = labels.ne(outputs["pred_logits"].shape[-1] - 1) & (scores > self.threshold) - cur_scores, cur_classes = cur_logits.softmax(-1).max(-1) - cur_scores = cur_scores[keep] - cur_classes = cur_classes[keep] - cur_masks = cur_masks[keep] - cur_masks = interpolate(cur_masks[:, None], to_tuple(size), mode="bilinear").squeeze(1) - cur_boxes = box_ops.box_cxcywh_to_xyxy(cur_boxes[keep]) - - h, w = cur_masks.shape[-2:] - assert len(cur_boxes) == len(cur_classes) - - # It may be that we have several predicted masks for the same stuff class. - # In the following, we track the list of masks ids for each stuff class (they are merged later on) - cur_masks = cur_masks.flatten(1) - stuff_equiv_classes = defaultdict(lambda: []) - for k, label in enumerate(cur_classes): - if not self.is_thing_map[label.item()]: - stuff_equiv_classes[label.item()].append(k) - - def get_ids_area(masks, scores, dedup=False): - # This helper function creates the final panoptic segmentation image - # It also returns the area of the masks that appears on the image - - m_id = masks.transpose(0, 1).softmax(-1) - - if m_id.shape[-1] == 0: - # We didn't detect any mask :( - m_id = torch.zeros((h, w), dtype=torch.long, device=m_id.device) - else: - m_id = m_id.argmax(-1).view(h, w) - - if dedup: - # Merge the masks corresponding to the same stuff class - for equiv in stuff_equiv_classes.values(): - if len(equiv) > 1: - for eq_id in equiv: - m_id.masked_fill_(m_id.eq(eq_id), equiv[0]) - - final_h, final_w = to_tuple(target_size) - - seg_img = Image.fromarray(id2rgb(m_id.view(h, w).cpu().numpy())) - seg_img = seg_img.resize(size=(final_w, final_h), resample=Image.NEAREST) - - np_seg_img = ( - torch.ByteTensor(torch.ByteStorage.from_buffer(seg_img.tobytes())).view(final_h, final_w, 3).numpy() - ) - m_id = torch.from_numpy(rgb2id(np_seg_img)) - - area = [] - for i in range(len(scores)): - area.append(m_id.eq(i).sum().item()) - return area, seg_img - - area, seg_img = get_ids_area(cur_masks, cur_scores, dedup=True) - if cur_classes.numel() > 0: - # We know filter empty masks as long as we find some - while True: - filtered_small = torch.as_tensor( - [area[i] <= 4 for i, c in enumerate(cur_classes)], dtype=torch.bool, device=keep.device - ) - if filtered_small.any().item(): - cur_scores = cur_scores[~filtered_small] - cur_classes = cur_classes[~filtered_small] - cur_masks = cur_masks[~filtered_small] - area, seg_img = get_ids_area(cur_masks, cur_scores) - else: - break - - else: - cur_classes = torch.ones(1, dtype=torch.long, device=cur_classes.device) - - segments_info = [] - for i, a in enumerate(area): - cat = cur_classes[i].item() - segments_info.append({"id": i, "isthing": self.is_thing_map[cat], "category_id": cat, "area": a}) - del cur_classes - - with io.BytesIO() as out: - seg_img.save(out, format="PNG") - predictions = {"png_string": out.getvalue(), "segments_info": segments_info} - preds.append(predictions) - return preds diff --git a/openpmcvl/granular/process/detr_code/transformer.py b/openpmcvl/granular/process/detr_code/transformer.py deleted file mode 100644 index dcd5367..0000000 --- a/openpmcvl/granular/process/detr_code/transformer.py +++ /dev/null @@ -1,297 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -""" -DETR Transformer class. - -Copy-paste from torch.nn.Transformer with modifications: - * positional encodings are passed in MHattention - * extra LN at the end of encoder is removed - * decoder returns a stack of activations from all decoding layers -""" -import copy -from typing import Optional, List - -import torch -import torch.nn.functional as F -from torch import nn, Tensor - - -class Transformer(nn.Module): - - def __init__(self, d_model=512, nhead=8, num_encoder_layers=6, - num_decoder_layers=6, dim_feedforward=2048, dropout=0.1, - activation="relu", normalize_before=False, - return_intermediate_dec=False): - super().__init__() - - encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, - dropout, activation, normalize_before) - encoder_norm = nn.LayerNorm(d_model) if normalize_before else None - self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers, encoder_norm) - - decoder_layer = TransformerDecoderLayer(d_model, nhead, dim_feedforward, - dropout, activation, normalize_before) - decoder_norm = nn.LayerNorm(d_model) - self.decoder = TransformerDecoder(decoder_layer, num_decoder_layers, decoder_norm, - return_intermediate=return_intermediate_dec) - - self._reset_parameters() - - self.d_model = d_model - self.nhead = nhead - - def _reset_parameters(self): - for p in self.parameters(): - if p.dim() > 1: - nn.init.xavier_uniform_(p) - - def forward(self, src, mask, query_embed, pos_embed): - # flatten NxCxHxW to HWxNxC - bs, c, h, w = src.shape - src = src.flatten(2).permute(2, 0, 1) - pos_embed = pos_embed.flatten(2).permute(2, 0, 1) - query_embed = query_embed.unsqueeze(1).repeat(1, bs, 1) - mask = mask.flatten(1) - - tgt = torch.zeros_like(query_embed) - memory = self.encoder(src, src_key_padding_mask=mask, pos=pos_embed) - hs = self.decoder(tgt, memory, memory_key_padding_mask=mask, - pos=pos_embed, query_pos=query_embed) - return hs.transpose(1, 2), memory.permute(1, 2, 0).view(bs, c, h, w) - - -class TransformerEncoder(nn.Module): - - def __init__(self, encoder_layer, num_layers, norm=None): - super().__init__() - self.layers = _get_clones(encoder_layer, num_layers) - self.num_layers = num_layers - self.norm = norm - - def forward(self, src, - mask: Optional[Tensor] = None, - src_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None): - output = src - - for layer in self.layers: - output = layer(output, src_mask=mask, - src_key_padding_mask=src_key_padding_mask, pos=pos) - - if self.norm is not None: - output = self.norm(output) - - return output - - -class TransformerDecoder(nn.Module): - - def __init__(self, decoder_layer, num_layers, norm=None, return_intermediate=False): - super().__init__() - self.layers = _get_clones(decoder_layer, num_layers) - self.num_layers = num_layers - self.norm = norm - self.return_intermediate = return_intermediate - - def forward(self, tgt, memory, - tgt_mask: Optional[Tensor] = None, - memory_mask: Optional[Tensor] = None, - tgt_key_padding_mask: Optional[Tensor] = None, - memory_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None, - query_pos: Optional[Tensor] = None): - output = tgt - - intermediate = [] - - for layer in self.layers: - output = layer(output, memory, tgt_mask=tgt_mask, - memory_mask=memory_mask, - tgt_key_padding_mask=tgt_key_padding_mask, - memory_key_padding_mask=memory_key_padding_mask, - pos=pos, query_pos=query_pos) - if self.return_intermediate: - intermediate.append(self.norm(output)) - - if self.norm is not None: - output = self.norm(output) - if self.return_intermediate: - intermediate.pop() - intermediate.append(output) - - if self.return_intermediate: - return torch.stack(intermediate) - - return output.unsqueeze(0) - - -class TransformerEncoderLayer(nn.Module): - - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, - activation="relu", normalize_before=False): - super().__init__() - self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout) - # Implementation of Feedforward model - self.linear1 = nn.Linear(d_model, dim_feedforward) - self.dropout = nn.Dropout(dropout) - self.linear2 = nn.Linear(dim_feedforward, d_model) - - self.norm1 = nn.LayerNorm(d_model) - self.norm2 = nn.LayerNorm(d_model) - self.dropout1 = nn.Dropout(dropout) - self.dropout2 = nn.Dropout(dropout) - - self.activation = _get_activation_fn(activation) - self.normalize_before = normalize_before - - def with_pos_embed(self, tensor, pos: Optional[Tensor]): - return tensor if pos is None else tensor + pos - - def forward_post(self, - src, - src_mask: Optional[Tensor] = None, - src_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None): - q = k = self.with_pos_embed(src, pos) - src2 = self.self_attn(q, k, value=src, attn_mask=src_mask, - key_padding_mask=src_key_padding_mask)[0] - src = src + self.dropout1(src2) - src = self.norm1(src) - src2 = self.linear2(self.dropout(self.activation(self.linear1(src)))) - src = src + self.dropout2(src2) - src = self.norm2(src) - return src - - def forward_pre(self, src, - src_mask: Optional[Tensor] = None, - src_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None): - src2 = self.norm1(src) - q = k = self.with_pos_embed(src2, pos) - src2 = self.self_attn(q, k, value=src2, attn_mask=src_mask, - key_padding_mask=src_key_padding_mask)[0] - src = src + self.dropout1(src2) - src2 = self.norm2(src) - src2 = self.linear2(self.dropout(self.activation(self.linear1(src2)))) - src = src + self.dropout2(src2) - return src - - def forward(self, src, - src_mask: Optional[Tensor] = None, - src_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None): - if self.normalize_before: - return self.forward_pre(src, src_mask, src_key_padding_mask, pos) - return self.forward_post(src, src_mask, src_key_padding_mask, pos) - - -class TransformerDecoderLayer(nn.Module): - - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, - activation="relu", normalize_before=False): - super().__init__() - self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout) - self.multihead_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout) - # Implementation of Feedforward model - self.linear1 = nn.Linear(d_model, dim_feedforward) - self.dropout = nn.Dropout(dropout) - self.linear2 = nn.Linear(dim_feedforward, d_model) - - self.norm1 = nn.LayerNorm(d_model) - self.norm2 = nn.LayerNorm(d_model) - self.norm3 = nn.LayerNorm(d_model) - self.dropout1 = nn.Dropout(dropout) - self.dropout2 = nn.Dropout(dropout) - self.dropout3 = nn.Dropout(dropout) - - self.activation = _get_activation_fn(activation) - self.normalize_before = normalize_before - - def with_pos_embed(self, tensor, pos: Optional[Tensor]): - return tensor if pos is None else tensor + pos - - def forward_post(self, tgt, memory, - tgt_mask: Optional[Tensor] = None, - memory_mask: Optional[Tensor] = None, - tgt_key_padding_mask: Optional[Tensor] = None, - memory_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None, - query_pos: Optional[Tensor] = None): - q = k = self.with_pos_embed(tgt, query_pos) - tgt2 = self.self_attn(q, k, value=tgt, attn_mask=tgt_mask, - key_padding_mask=tgt_key_padding_mask)[0] - tgt = tgt + self.dropout1(tgt2) - tgt = self.norm1(tgt) - tgt2 = self.multihead_attn(query=self.with_pos_embed(tgt, query_pos), - key=self.with_pos_embed(memory, pos), - value=memory, attn_mask=memory_mask, - key_padding_mask=memory_key_padding_mask)[0] - tgt = tgt + self.dropout2(tgt2) - tgt = self.norm2(tgt) - tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt)))) - tgt = tgt + self.dropout3(tgt2) - tgt = self.norm3(tgt) - return tgt - - def forward_pre(self, tgt, memory, - tgt_mask: Optional[Tensor] = None, - memory_mask: Optional[Tensor] = None, - tgt_key_padding_mask: Optional[Tensor] = None, - memory_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None, - query_pos: Optional[Tensor] = None): - tgt2 = self.norm1(tgt) - q = k = self.with_pos_embed(tgt2, query_pos) - tgt2 = self.self_attn(q, k, value=tgt2, attn_mask=tgt_mask, - key_padding_mask=tgt_key_padding_mask)[0] - tgt = tgt + self.dropout1(tgt2) - tgt2 = self.norm2(tgt) - tgt2 = self.multihead_attn(query=self.with_pos_embed(tgt2, query_pos), - key=self.with_pos_embed(memory, pos), - value=memory, attn_mask=memory_mask, - key_padding_mask=memory_key_padding_mask)[0] - tgt = tgt + self.dropout2(tgt2) - tgt2 = self.norm3(tgt) - tgt2 = self.linear2(self.dropout(self.activation(self.linear1(tgt2)))) - tgt = tgt + self.dropout3(tgt2) - return tgt - - def forward(self, tgt, memory, - tgt_mask: Optional[Tensor] = None, - memory_mask: Optional[Tensor] = None, - tgt_key_padding_mask: Optional[Tensor] = None, - memory_key_padding_mask: Optional[Tensor] = None, - pos: Optional[Tensor] = None, - query_pos: Optional[Tensor] = None): - if self.normalize_before: - return self.forward_pre(tgt, memory, tgt_mask, memory_mask, - tgt_key_padding_mask, memory_key_padding_mask, pos, query_pos) - return self.forward_post(tgt, memory, tgt_mask, memory_mask, - tgt_key_padding_mask, memory_key_padding_mask, pos, query_pos) - - -def _get_clones(module, N): - return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) - - -def build_transformer(args): - return Transformer( - d_model=args.hidden_dim, - dropout=args.dropout, - nhead=args.nheads, - dim_feedforward=args.dim_feedforward, - num_encoder_layers=args.enc_layers, - num_decoder_layers=args.dec_layers, - normalize_before=args.pre_norm, - return_intermediate_dec=True, - ) - - -def _get_activation_fn(activation): - """Return an activation function given a string""" - if activation == "relu": - return F.relu - if activation == "gelu": - return F.gelu - if activation == "glu": - return F.glu - raise RuntimeError(F"activation should be relu/gelu, not {activation}.") diff --git a/openpmcvl/granular/process/inference.py b/openpmcvl/granular/process/inference.py deleted file mode 100644 index 0cab45b..0000000 --- a/openpmcvl/granular/process/inference.py +++ /dev/null @@ -1,365 +0,0 @@ -import os -from tkinter import W -from regex import P -import torch -import argparse -from torch.utils.data import DataLoader -from tqdm import tqdm -from pathlib import Path -import torch.nn as nn -from datetime import datetime -from datetime import timedelta -from datetime import timezone -import json - -from dataset_code.dataset_det_align import FigCap_Dataset, figcap_collate, Fig_Dataset, fig_collate -from dataset_code.dataset_ours_syn import Synthetic_Dataset -from dataset_code.dataset_reallayout_syn import Real_Layout_Synthetic_Dataset -from dataset_code.simcfs_reimp import SimCFS_Dataset -from align_metric import SubfigureSubcaptionAlignmentMetric -from detect_metric import calculate_mAP, calculate_mAP_voc12 -from visualization_tools import visualization, visualization_noComparision - -from matplotlib import pyplot as plt - -def contain(name, key_words_list): - for keys in key_words_list: - if keys in name: - return True - return False - -# Visualization the dataset -def inference(model, valSet, valLoader, save_path='./Inference', iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - - # Subfig Subcap Metric - subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - subcaption_metric.reset() - - Path(save_path).mkdir(parents=True, exist_ok=True) - - # validate one epoch - with torch.no_grad(): - model.eval() - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - img_ids = batch['image_id'] # [bs] - unpadded_hws = batch['unpadded_hws'] # [bs * [2]] 没resize+pad前的hw - untokenized_caption = batch['untokenized_caption'] # [bs * 'string'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - cpu_caption = caption.cpu() - - # evaluation detection(mAP) and alignment(f1) - filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - for i in range(image.shape[0]): - # accumulate results as coco format - det_boxes=[cpu_output_box[i, filter_mask[i,:], :]] # [1 * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP() - det_scores=[cpu_output_det_class.squeeze()[i, filter_mask[i,:]]] # [1 * (filter_pred_num)] - det_labels=[torch.ones_like(det_scores[-1])] # [1 * (filter_pred_num)] all 1 - true_boxes=[subfigures[i][0]] # [1 * (subfig_num, 4)] - true_labels=[torch.ones(true_boxes[-1].shape[0])] # [1 * (subfig_num)] all 1 - true_difficulties=[torch.zeros_like(true_labels[-1])] # [1 * (subfig_num)] all zeros - - # calcualte mAP, recall, precision - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - - # accumulate results as subfig-subcap format - ls_caption = [valSet.id_to_token(cpu_caption[i].tolist())] # [1 * cap_len] before evaluation, convert ids to tokens - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist()] # [1 * [filtered_query_num * [4]]], (cx, cy, w, h) - ls_gt_boxes = [subfigures[i][0].tolist()] # [bs * [subfigure * [4]]], (cx, cy, w, h) - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens = [pred_tokens] # [1 * [filtered_query_num * [aligned_token_num]]] - filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens = [gt_tokens] # [1 * [subfig_num * [subcap_token_num]]] - # calculate mAP, recall, precision - match_matrix = subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - # [num_gt] index of the best matched prediction, -1 if not matched - f1, rcl, prec = subcaption_metric.get_metric(reset=True) - - img_path = None - if config.name_by_f1: - img_path = "%s/f1(%.2f)%s" % (save_path, f1, img_ids[i]) - elif config.name_by_mAP: - img_path = "%s/mAP(%.2f)%s" % (save_path, mAP, img_ids[i]) - - visualization(image=image[i].cpu(), original_h=unpadded_hws[i][0], original_w=unpadded_hws[i][1], - pred_boxes=det_boxes[-1], pred_texts=pred_tokens, gt_boxes=true_boxes[-1], gt_texts=gt_tokens, match_matrix = match_matrix[-1], - cap=ls_caption[-1], untokenized_cap=untokenized_caption[i], path=img_path, mAP=mAP, f1=f1) - -# Evaluate det and align on the dataset -def evaluate(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - - # Subfig Subcap Metric - subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - subcaption_metric.reset() - - # validate one epoch - with torch.no_grad(): - model.eval() - det_boxes = [] - det_labels = [] - det_scores = [] - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - - # accumulate results as coco format - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP() - det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 - true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - - # accumulate results as subfig-subcap format - cpu_caption = caption.cpu() - ls_caption = [valSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens - # - filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) - # - ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) - # - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] - ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] - for i in range(image.shape[0]): - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens.append(pred_tokens) - filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens.append(gt_tokens) - subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - - gold_subfig_num = 0 - gold_subcap_num = 0 - for subfigs in true_boxes: - gold_subfig_num += len(subfigs) - for subcaps in true_boxes: - gold_subcap_num += len(subcaps) - print('evaluate on %d compound figures, total %d gold subfigs, %d gold subcaps' % (len(valSet), gold_subfig_num, gold_subcap_num)) - - - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - f1, rcl, prec = subcaption_metric.get_metric(reset=True) - - return f1, rcl, prec, mAP, recall, precision - - -def str2bool(v): - return v.lower() in ('true') - -def get_eval_args_parser(): - parser = argparse.ArgumentParser() - - # ----------------- Eval Config - parser.add_argument('--checkpoint', default=None, help='checkpoint to load') - parser.add_argument('--eval_file', default='/remote-home/share/medical/public/MedICaT/compound_figures/reid_test.jsonl', help='dataset for evaluation') - parser.add_argument('--rcd_file', default=None, help='file to record') - parser.add_argument('--vis_path', default=None, help='file to record the visualizations') - - parser.add_argument('--model', type=str, default='baseline') - parser.add_argument('--resnet', type=int, default=34) - parser.add_argument('--pretrained_bert', type=str, default='PubMed_BERT') - - parser.add_argument('--gpu', type=str, default='0') - - # ----------------- Dataset - parser.add_argument('--benchmark', type=str, default='medicat') - parser.add_argument('--dataset', type=str, default='None', help = "ours_syn, real_layout, simcfs, real_det, real_align") - parser.add_argument('--synthetic_params', type=str, default='synthetic/parameters/baseline.jsonl') - parser.add_argument('--aug_params', type=str, default=None) - parser.add_argument('--normalization', type=str2bool, default=False) - parser.add_argument('--val_batch_size', type=int, default=64) - - parser.add_argument('--name_by_f1', type=str2bool, default=True, help='name the visualization by f1 score') - parser.add_argument('--name_by_mAP', type=str2bool, default=True, help='name the visualization by f1 score') - - # ----------------- Eval Hyperparameters - parser.add_argument('--iou_threshold', default=0.75, type=float) - parser.add_argument('--score_threshold', default=0.5, type=float) - parser.add_argument('--similarity_threshold', default=0.5, type=float) - - # ----------------- Model Structure - parser.add_argument('--enc_layers', default=4, type=int, - help="Number of encoding layers in the transformer") - parser.add_argument('--dec_layers', default=4, type=int, - help="Number of decoding layers in the transformer") - parser.add_argument('--txt_dec_layers', default=4, type=int, - help="Number of decoding layers in the text transformer") - parser.add_argument('--mlp_ratio', default=4, type=int, - help="Intermediate size of the feedforward layers in the transformer blocks") - parser.add_argument('--hidden_dim', default=256, type=int, - help="Size of the embeddings (dimension of the transformer)") - parser.add_argument('--dropout', default=0.0, type=float, - help="Dropout applied in the transformer") - parser.add_argument('--nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--text_nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--num_queries', default=32, type=int, - help="Number of query slots") - - config = parser.parse_args() - return config - -def main(config): - torch.multiprocessing.set_sharing_strategy('file_system') - - if config.benchmark == 'medicat': - img_root = '/remote-home/share/medical/public/MedICaT/compound_figures/figures' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert+'/vocab.txt' - elif config.benchmark == 'imageclef': - img_root = '/remote-home/share/medical/public/ImageCLEF2016/medtask/new_id_comfigs' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert+'/vocab.txt' - elif config.benchmark == 'our_downloads': - img_root = '/remote-home/share/medical/public/PMC_OA/figures' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert+'/vocab.txt' - - if config.dataset == 'ours_syn': - with open(config.synthetic_params) as f: - param = json.load(f) - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - else: - aug_param = None - Set = Synthetic_Dataset(param, aug_param, epoch_maximum=600) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=fig_collate) - elif config.dataset == 'real_layout': - with open(config.synthetic_params) as f: - param = json.load(f) - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - else: - aug_param = None - Set = Real_Layout_Synthetic_Dataset(config.eval_file, img_root, param, aug_param) - Loader = DataLoader(Set, batch_size=config.batch_size, shuffle=False, num_workers=8, collate_fn=fig_collate) - elif config.dataset == 'simcfs': - with open(config.synthetic_params) as f: - param = json.load(f) - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - else: - aug_param = None - Set = SimCFS_Dataset(config.eval_file, img_root, param, aug_param) - Loader = DataLoader(Set, batch_size=config.batch_size, shuffle=False, num_workers=8, collate_fn=fig_collate) - elif config.dataset == 'real_det': - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - else: - aug_param = None - Set = Fig_Dataset(aug_param, config.eval_file, img_root, vocab_file, config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=fig_collate) - elif config.dataset == 'real_align': - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - else: - aug_param = None - Set = FigCap_Dataset(aug_param, config.eval_file, img_root, vocab_file, normalization=config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=figcap_collate) - else: - print('Unregconized Dataset Type % s' % config.dataset) - exit() - - if config.model == 'baseline': - from model import FigCap_Former - else: - print('Unsupported Model Type %s' % config.model) - exit() - - if config.dataset in ["ours_syn", "real_layout", "simcfs", "real_det"]: - alignment_network = False - elif config.dataset == "real_align": - alignment_network = True - else: - print('Unregconized Dataset Type % s' % config.dataset) - exit() - - model = FigCap_Former(num_query=config.num_queries, - num_encoder_layers=config.enc_layers, - num_decoder_layers=config.dec_layers, - feature_dim=config.hidden_dim, - atten_head_num=config.nheads, - mlp_ratio=config.mlp_ratio, - dropout=config.dropout, - activation='relu', - alignment_network = alignment_network, - bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert, - num_text_decoder_layers=config.txt_dec_layers, - text_atten_head_num=config.text_nheads, - text_mlp_ratio=config.mlp_ratio, - text_dropout=config.dropout, - text_activation='relu', - resnet=config.resnet, - resnet_pretrained=False) - - checkpoint = torch.load(config.checkpoint, map_location='cpu') - state_dict = checkpoint['model_state_dict'] - model_dict = model.state_dict() - new_state_dict = {} - for k, v in state_dict.items() : - if k[:6] == 'module': - new_state_dict[k[7:]] = v - else: - new_state_dict[k] = v - model_checkpoint = {k: v for k, v in new_state_dict.items() if not contain(k, ['text_embed', 'text_channel_squeeze', 'text_decoder', 'simi_head', 'img_proj'])} - model_dict.update(model_checkpoint) - model.load_state_dict(model_dict) - - os.environ['CUDA_VISIBLE_DEVICES'] = config.gpu - device = torch.device('cuda') - model = nn.DataParallel(model) - model.to(device) - - print('Load checkpoint from %s, epoch %d, trn_mAP %.2f, trn_F1 %.2f, val_mAP %.2f, val_F1 %.2f' % \ - (config.checkpoint, checkpoint['epoch'], checkpoint['train_mAP'], checkpoint['train_f1'], checkpoint['val_mAP'], checkpoint['val_f1'])) - - f1, rcl, prec, mAP, recall, precision = evaluate(model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f f1:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision, f1, rcl, prec) - print(out_str) - - if config.vis_path: - inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) - if config.rcd_file: - with open(config.rcd_file, 'a') as f: - SHA_TZ = timezone(timedelta(hours=8), name='Asia/Shanghai') - utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) - beijing_now = utc_now.astimezone(SHA_TZ) # 北京时间 - f.write('Time: %d.%d.%d--%d:%d\n' % (beijing_now.year, beijing_now.month, beijing_now.day, beijing_now.hour, beijing_now.minute)) - f.write('Load checkpoint from: %s\n' % (config.checkpoint)) - f.write('Evaluate on: %s\n' % config.eval_file) - f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) - f.write('Results: mAP--%.3f recall--%.3f precision--%.3f f1--%.3f recall--%.3f precision--%.3f\n' % (mAP, recall, precision, f1, rcl, prec)) - f.write('\n\n') - f.close() - -if __name__ == '__main__': - config = get_eval_args_parser() - main(config) \ No newline at end of file diff --git a/openpmcvl/granular/process/inference_clip_align.py b/openpmcvl/granular/process/inference_clip_align.py deleted file mode 100644 index f96b149..0000000 --- a/openpmcvl/granular/process/inference_clip_align.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -Infer and Eval function of subfig-subcap sentencewise alignment (finetune PMC-CLIP-Beta based on MediCAT) -""" - -import torch -import argparse -from torch.utils.data import DataLoader -from tqdm import tqdm -import torch.nn as nn -import json - -from model_clip_align import SentenceWise_Align_Former, SentenceWise_Align_Former_V1 -from dataset_code.dataset_clip_align import SentenceWise_Align_Dataset, sentencewise_align_collate, SentenceWise_Align_Dataset_Infer, sentencewise_align_collate_infer, SentenceWise_Align_Dataset_Infer_V1, sentencewise_align_collate_infer_v1 - -def contain(name, key_words_list): - for keys in key_words_list: - if keys in name: - return True - return False - -# 使用CLIP计算subfig--[all subcap]的相似度,V1版本处理使用 -def inference_v1(model, valLoader): - # validate one epoch - with torch.no_grad(): - model.eval() - subfig_subcap_ls = [] - count = 0 - for batch in tqdm(valLoader): - # forward pass - images = batch['image'].cuda() # (bs, 3, max_w, max_h) - subcaptions = batch['subcaptions'].cuda() # (bs, subcap_num, 77) - untokenized_subcaption = batch['untokenized_subcaptions'] # [bs, [sub_cap_num]] - nopad_subcap_idx = batch['nopad_subcap_idx'] # [bs] - subfigure_info = batch['subfigure_info'] # [bs * {comfig_id:xxx, subfig_loc:xxx, ......}] - - output_sim = model(images, subcaptions) - - for i in range(images.shape[0]): - tmp_sim = output_sim[i, :nopad_subcap_idx[i]] - # print(tmp_sim) - # if torch.max(tmp_sim) > confidence_threshold: - index = torch.argmax(tmp_sim).item() - confid = torch.max(tmp_sim).item() - # print(index) - # subfig_id = image_ids[i] - # print(image_ids) - - subcap_text = untokenized_subcaption[i][index] - # print(untokenized_subcaption[i]) - - subfigure_info[i]['subcaption'] = subcap_text - subfigure_info[i]['subcap_score'] = confid - - subfig_subcap_ls.append(subfigure_info[i]) - if len(subfig_subcap_ls) >= 5000: - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(after)(subfig-subcap-CLIP)subfigure_v1.jsonl', 'a') as f: - for line in subfig_subcap_ls: - f.write(json.dumps(line) + '\n') - count += len(subfig_subcap_ls) - print('Checkpoint : %d'%count) - subfig_subcap_ls = [] - - if len(subfig_subcap_ls) > 0: - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/DETR_sep/(after)(subfig-subcap-CLIP)subfigure_v1.jsonl', 'a') as f: - for line in subfig_subcap_ls: - f.write(json.dumps(line) + '\n') - count += len(subfig_subcap_ls) - - return count - - -########################################### 分割线:V0版本代码 before MICCAI - - -# Evaluate sentence-wise align on the dataset -def evaluate(model, valLoader, confidence_threshold=0.5): - # validate one epoch - with torch.no_grad(): - model.eval() - hit = 0 - miss = 0 - not_confid = 0 - random_guess_acc_ls = [] - for batch in tqdm(valLoader): - # forward pass - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - subcaptions = batch['subcaptions'].cuda() # (bs, subcap_num, 77) - location = batch['location'].cuda() # (bs, 4) - gt = batch['subcaption_gts'].cuda() # (bs, subcap_num) - # noaug_subcap_idx = batch['noaug_subcap_idx'] # [bs] - nopad_subcap_idx = batch['nopad_subcap_idx'] # [bs] - - output_sim = model(image, subcaptions, location) - - for i in range(image.shape[0]): - tmp_sim = output_sim[i, :nopad_subcap_idx[i]] - tmp_gt_sim = gt[i, :nopad_subcap_idx[i]] - if torch.max(tmp_sim) > confidence_threshold: - if torch.argmax(tmp_sim) == torch.argmax(tmp_gt_sim): - hit += 1 - else: - miss += 1 - else: - not_confid += 1 - - val_acc = hit/(hit+miss) - - return val_acc, (hit+miss)/(hit+miss+not_confid) - -def inference(model, valLoader): - # validate one epoch - with torch.no_grad(): - model.eval() - subfig_subcap_ls = [] - count = 0 - for batch in tqdm(valLoader): - # forward pass - images = batch['image'].cuda() # (bs, 3, max_w, max_h) - subcaptions = batch['subcaptions'].cuda() # (bs, subcap_num, 77) - locations = batch['location'].cuda() # (bs, 4) - image_ids = batch['image_id'] - untokenized_subcaption = batch['untokenized_subcaptions'] # [bs, [sub_cap_num]] - nopad_subcap_idx = batch['nopad_subcap_idx'] # [bs] - - output_sim = model(images, subcaptions, locations) - - for i in range(images.shape[0]): - tmp_sim = output_sim[i, :nopad_subcap_idx[i]] - # print(tmp_sim) - # if torch.max(tmp_sim) > confidence_threshold: - index = torch.argmax(tmp_sim).item() - confid = torch.max(tmp_sim).item() - # print(index) - subfig_id = image_ids[i] - # print(image_ids) - subcap_text = untokenized_subcaption[i][index] - # print(untokenized_subcaption[i]) - subfig_subcap_ls.append({'subfig_id':subfig_id, 'subcaption':subcap_text, 'confidence_score':confid}) - if len(subfig_subcap_ls) >= 5000: - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_subfig2subcap.jsonl', 'a') as f: - for line in subfig_subcap_ls: - f.write(json.dumps(line) + '\n') - count += len(subfig_subcap_ls) - print('Checkpoint : %d'%count) - subfig_subcap_ls = [] - - if len(subfig_subcap_ls) > 0: - with open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_subfig2subcap.jsonl', 'a') as f: - for line in subfig_subcap_ls: - f.write(json.dumps(line) + '\n') - count += len(subfig_subcap_ls) - - return count - -def str2bool(v): - return v.lower() in ('true') - -def get_eval_args_parser(): - parser = argparse.ArgumentParser() - - # ----------------- Eval Config - parser.add_argument('--checkpoint', default=None, help='checkpoint to load') - parser.add_argument('--eval_file', default=None, help='dataset for evaluation') - parser.add_argument('--task', type=str, default='evaluate') - - # ----------------- Dataset - parser.add_argument('--normalization', type=str2bool, default=False) - parser.add_argument('--val_batch_size', type=int, default=40) - parser.add_argument('--input_size', type=int, default=224) - - # ----------------- Eval Hyperparameters - parser.add_argument('--confidence_threshold', default=0.8, type=float) - - config = parser.parse_args() - return config - -def main(config): - torch.multiprocessing.set_sharing_strategy('file_system') - - model = SentenceWise_Align_Former_V1() if config.task == 'infer_v1' else SentenceWise_Align_Former() - device = torch.device('cuda') - model = nn.DataParallel(model) - model.to(device) - - if config.checkpoint: - checkpoint = torch.load(config.checkpoint, map_location='cpu') - model.load_state_dict(checkpoint['model_state_dict']) - print('Load checkpoint from %s, Epoch %d' % (config.checkpoint, int(checkpoint['epoch']))) - - ############# 对齐subcap和subfig - if config.task == 'infer_v1': - ValSet = SentenceWise_Align_Dataset_Infer_V1(config.eval_file, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=sentencewise_align_collate_infer_v1) - confid_num = inference_v1(model, ValLoader) - print("%d Confidence Subfigures Out of %d Subfigures" % (confid_num, len(ValSet))) - exit() - elif config.task == 'infer': - test_img_root = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_subfigures' - ValSet = SentenceWise_Align_Dataset_Infer(config.eval_file, test_img_root, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=sentencewise_align_collate_infer) - confid_num = inference(model, ValLoader) - print("%d Confidence Subfigures Out of %d Subfigures" % (confid_num, len(ValSet))) - exit() - ############# 在MediCAT上验证对齐的性能 - elif config.task == 'evaluate': - test_img_root = '/remote-home/share/medical/public/MedICaT/compound_figures/subfigures' - ValSet = SentenceWise_Align_Dataset(None, config.eval_file, test_img_root, config.normalization, input_size=config.input_size, mode='Test') - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=sentencewise_align_collate) - acc, confi_ratio = evaluate(model, ValLoader, confidence_threshold=config.confidence_threshold) - print('Confident threshold %.2f : hit acc %.2f, confident ratio %.2f' % (config.confidence_threshold, acc, confi_ratio)) - exit() - -if __name__ == '__main__': - config = get_eval_args_parser() - main(config) \ No newline at end of file diff --git a/openpmcvl/granular/process/inference_detect_align.py b/openpmcvl/granular/process/inference_detect_align.py deleted file mode 100644 index 37d3df5..0000000 --- a/openpmcvl/granular/process/inference_detect_align.py +++ /dev/null @@ -1,472 +0,0 @@ -""" -Inference % Evaluation functions of subfig detection, OR subfig detection & subfig-subcap token-wise align -""" - -import os -from tkinter import W -from regex import P -import torch -import argparse -from torch.utils.data import DataLoader -from tqdm import tqdm -from pathlib import Path -import random -import numpy as np -from datetime import datetime -from datetime import timedelta -from datetime import timezone -import json - -from torchvision import transforms -from torchvision import utils as vutils - -from dataset_code.dataset_det_align import FigCap_Dataset, figcap_collate, Fig_Dataset, fig_collate, Fig_Separation_Dataset, fig_separation_collate -from align_metric import SubfigureSubcaptionAlignmentMetric -from detect_metric import calculate_mAP_voc12, box_cxcywh_to_xyxy, find_jaccard_overlap -from visualization_tools import visualization, visualization_noComparision - -from matplotlib import pyplot as plt - -# Visualization the dataset -def inference(model, valSet, valLoader, save_path='./Inference', iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - - # Subfig Subcap Metric - subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - subcaption_metric.reset() - - Path(save_path).mkdir(parents=True, exist_ok=True) - - # validate one epoch - with torch.no_grad(): - model.eval() - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - # TRANSFORM - # image = image_transform(image) - # - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - img_ids = batch['image_id'] # [bs] - original_hws = batch['original_hws'] # [bs * [2]] 没resize+pad前的hw - untokenized_caption = batch['untokenized_caption'] # [bs * 'string'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - cpu_caption = caption.cpu() - - # evaluation detection(mAP) and alignment(f1) - filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - for i in range(image.shape[0]): - # accumulate results as coco format - det_boxes=[cpu_output_box[i, filter_mask[i,:], :]] # [1 * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() - det_scores=[cpu_output_det_class.squeeze()[i, filter_mask[i,:]]] # [1 * (filter_pred_num)] - det_labels=[torch.ones_like(det_scores[-1])] # [1 * (filter_pred_num)] all 1 - true_boxes=[subfigures[i][0]] # [1 * (subfig_num, 4)] - true_labels=[torch.ones(true_boxes[-1].shape[0])] # [1 * (subfig_num)] all 1 - true_difficulties=[torch.zeros_like(true_labels[-1])] # [1 * (subfig_num)] all zeros - - # calcualte mAP, recall, precision - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - - # accumulate results as subfig-subcap format - ls_caption = [valSet.id_to_token(cpu_caption[i].tolist())] # [1 * cap_len] before evaluation, convert ids to tokens - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist()] # [1 * [filtered_query_num * [4]]], (cx, cy, w, h) - ls_gt_boxes = [subfigures[i][0].tolist()] # [bs * [subfigure * [4]]], (cx, cy, w, h) - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens = [pred_tokens] # [1 * [filtered_query_num * [aligned_token_num]]] - filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens = [gt_tokens] # [1 * [subfig_num * [subcap_token_num]]] - # calculate mAP, recall, precision - match_matrix = subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - f1, rcl, prec = subcaption_metric.get_metric(reset=True) - - img_path = [] - if config.name_by_f1: - img_path.append("%s/f1(%.2f)%s" % (save_path, f1, img_ids[i])) - elif config.name_by_mAP: - img_path.append("%s/mAP(%.2f)%s" % (save_path, mAP, img_ids[i])) - - visualization(image=image[i].cpu(), original_h=original_hws[i][0], original_w=original_hws[i][1], - pred_boxes=det_boxes[-1], pred_texts=pred_tokens, gt_boxes=true_boxes[-1], gt_texts=gt_tokens, match_matrix = match_matrix[-1], - cap=ls_caption[-1], untokenized_cap=untokenized_caption[i], path=img_path, mAP=mAP, f1=f1) - -# Evaluate det and align on the dataset -def evaluate(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - - # Subfig Subcap Metric - subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) - subcaption_metric.reset() - - # validate one epoch - with torch.no_grad(): - model.eval() - det_boxes = [] - det_labels = [] - det_scores = [] - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - - # accumulate results as coco format - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() - det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 - true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - - # accumulate results as subfig-subcap format - cpu_caption = caption.cpu() - ls_caption = [valSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens - # - filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) - # - ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) - # - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] - ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] - for i in range(image.shape[0]): - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens.append(pred_tokens) - filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens.append(gt_tokens) - subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - - gold_subfig_num = 0 - gold_subcap_num = 0 - for subfigs in true_boxes: - gold_subfig_num += len(subfigs) - for subcaps in true_boxes: - gold_subcap_num += len(subcaps) - print('evaluate on %d compound figures, total %d gold subfigs, %d gold subcaps' % (len(valSet), gold_subfig_num, gold_subcap_num)) - - - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) - print(out_str) - f1, rcl, prec = subcaption_metric.get_metric(reset=True) - out_str = "f1:%.3f recall:%.3f precsision:%.3f" % (mAP, rcl, prec) - print(out_str) - return f1, rcl, prec, mAP, recall, precision - -# Evaluate det and align on the dataset -def evaluate_det(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5): - # validate one epoch - with torch.no_grad(): - model.eval() - det_boxes = [] - det_labels = [] - det_scores = [] - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - # cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - - # accumulate results as coco format - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() - det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 - true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - - gold_subfig_num = 0 - for subfigs in true_boxes: - gold_subfig_num += len(subfigs) - print('evaluate on %d compound figures, total %d gold subfigs' % (len(valSet), gold_subfig_num)) - - mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) - print(out_str) - - return mAP, recall, precision - -# Separation compound figures -def separation(model, valLoader, save_path='./Segmentation', rcd_file='./Segmentation/separation.jsonl', score_threshold=0.75, nms_threshold=0.4): - - Path(save_path).mkdir(parents=True, exist_ok=True) - subfig_list = [] - subfig_count = 0 - - # validate one epoch - with torch.no_grad(): - model.eval() - try: - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_h, max_w) - _, _, height, width = image.shape - caption = batch['caption'].cuda() # (bs, max_l) - img_ids = batch['image_id'] # [bs] - img_idxes = batch['image_index'] - original_images = batch['original_image'] # [bs * (3, h, w)] - unpadded_hws = batch['unpadded_hws'] # [bs * [2]] - output_det_class, output_box, _ = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_det_class = output_det_class.cpu() - filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False - for i in range(image.shape[0]): - det_boxes=cpu_output_box[i, filter_mask[i,:], :] # (filter_pred_num, 4) - det_scores=cpu_output_det_class.squeeze()[i, filter_mask[i,:]].numpy() # (filter_pred_num) - img_id = img_ids[i].split('.jpg')[0] # xxxx.jpg - img_idx = img_idxes[i] # x - unpadded_image = original_images[i] - original_h, original_w = unpadded_hws[i] - # 求scale - if original_h > original_w: - scale = original_h / 512 - else: - scale = original_w / 512 - # 非极大值抑制 - order = np.argsort(det_scores) - picked_bboxes = [] # [suppressed_num, 4] - picked_scores = [] # [suppressed_num] - while order.size > 0: - # 最大score的index - index = order[-1] - if order.size == 1: - picked_bboxes.append(det_boxes[index].tolist()) - picked_scores.append(det_scores[index]) - break - else: - iou_with_left = find_jaccard_overlap(box_cxcywh_to_xyxy(det_boxes[index]), box_cxcywh_to_xyxy(det_boxes[order[:-1]])).squeeze().numpy() # (left_bboxes_num) - left = np.where(iou_with_left < nms_threshold) # (left_bboxes_num) - order = order[left] # (new_filtered_num) - picked_bboxes.append(det_boxes[index].tolist()) - picked_scores.append(det_scores[index]) - # Crop and Save Image - for bbox, score in zip(picked_bboxes, picked_scores): - try: - subfig_path = '%s/%s_%d.jpg' % (save_path, img_id, subfig_count) - cx, cy, w, h = bbox - # 计算在原图中的bbox坐标 - x1 = round((cx - w/2)*width*scale) - x2 = round((cx + w/2)*width*scale) - y1 = round((cy - h/2)*height*scale) - y2 = round((cy + h/2)*height*scale) - # 纠正如果超出了compound figure的boundary - x1 = min(max(x1, 0), original_w-1) - x2 = min(max(x2, 0), original_w-1) - y1 = min(max(y1, 0), original_h-1) - y2 = min(max(y2, 0), original_h-1) - # 抠图 - subfig = unpadded_image[:, y1:y2, x1:x2] # (3, h, w) - subfig = subfig.to(torch.device('cpu')) - vutils.save_image(subfig, subfig_path) - # Record the Subfig Info in Jsonl file - subfig_list.append({'id':'%d.jpg'%subfig_count, 'source_fig_id':img_id, 'position':[(x1, y1), (x2, y2)], 'score':score.item()}) - subfig_count += 1 - except (ValueError): - print('Crop Error: [x1 x2 y1 y2]:[%.2f %.2f %.2f %.2f], w:%.2f, h:%.2f' % (x1, x2, y1, y2, original_w, original_h)) - - # 若中途报错,暂时保存现有的分割结果 - except Exception as e: - print(repr(e)) - print('Break at %s' % img_idx) - - f = open(rcd_file, 'a') - for line in subfig_list: - f.write(json.dumps(line)+'\n') - f.close() - -# grid search align -def grid_search(config, model, Set, Loader): - # 测试不同的confidence score,在recall和precision之间平衡 - for score_th in np.arange(0.3, 1.0, 0.05): - config.score_threshold = score_th - f1, rcl, prec, mAP, recall, precision = evaluate(model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f f1:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision, f1, rcl, prec) - print(out_str) - if config.rcd_file: - with open(config.rcd_file, 'a') as f: - f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) - f.write('Results: mAP--%.3f recall--%.3f precision--%.3f f1--%.3f recall--%.3f precision--%.3f\n' % (mAP, recall, precision, f1, rcl, prec)) - f.write('\n\n') - f.close() - - if config.vis_path: - inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) - -# grid search detection -def grid_search_det(config, model, Set, Loader): - # 测试不同的confidence score,在recall和precision之间平衡 - for score_th in np.arange(0.3, 1.0, 0.05): - config.score_threshold = score_th - mAP, recall, precision = evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) - out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) - print(out_str) - if config.rcd_file: - with open(config.rcd_file, 'a') as f: - f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) - f.write('Results: mAP--%.3f recall--%.3f precision--%.3f' % (mAP, recall, precision)) - f.write('\n\n') - f.close() - # the inference function should be simplified for det only - if config.vis_path: - inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) - - -def str2bool(v): - return v.lower() in ('true') - - -def get_eval_args_parser(): - parser = argparse.ArgumentParser() - - # ----------------- Eval Config - - parser.add_argument('--checkpoint', default=None, help='checkpoint to load') - parser.add_argument('--eval_file', default='/remote-home/share/medical/public/MedICaT/compound_figures/reid_test.jsonl', help='dataset for evaluation') - parser.add_argument('--img_root', default='/remote-home/share/medical/public/MedICaT/compound_figures/figures', help='root path for figures') - parser.add_argument('--rcd_file', default=None, help='file to record') - parser.add_argument('--vis_path', default=None, help='file to record the visualizations') - - parser.add_argument('--model', default='baseline', type=str, help='baseline') - parser.add_argument('--resnet', type=int, default=34) - parser.add_argument('--pretrained_bert', type=str, default='PubMed_BERT') - - parser.add_argument('--platform', type=str, default='DBCloud') - parser.add_argument('--gpu', type=str, default='0') - - parser.add_argument('--task', type=str, default='det', help='det, det_grid_search, align, align_grid_search, sep') - - parser.add_argument('--normalization', type=str2bool, default=False) - parser.add_argument('--val_batch_size', type=int, default=64) - - parser.add_argument('--name_by_f1', type=str2bool, default=True, help='name the visualization by f1 score') - parser.add_argument('--name_by_mAP', type=str2bool, default=True, help='name the visualization by mAP score') - - # ----------------- Eval Hyperparameters - - parser.add_argument('--iou_threshold', default=0.75, type=float) - parser.add_argument('--score_threshold', default=0.5, type=float) - parser.add_argument('--similarity_threshold', default=0.5, type=float) - - # ----------------- Model Structure - parser.add_argument('--enc_layers', default=4, type=int, - help="Number of encoding layers in the transformer") - parser.add_argument('--dec_layers', default=4, type=int, - help="Number of decoding layers in the transformer") - parser.add_argument('--txt_dec_layers', default=4, type=int, - help="Number of decoding layers in the text transformer") - parser.add_argument('--mlp_ratio', default=4, type=int, - help="Intermediate size of the feedforward layers in the transformer blocks") - parser.add_argument('--hidden_dim', default=256, type=int, - help="Size of the embeddings (dimension of the transformer)") - parser.add_argument('--dropout', default=0.0, type=float, - help="Dropout applied in the transformer") - parser.add_argument('--nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--text_nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--num_queries', default=32, type=int, - help="Number of query slots") - - config = parser.parse_args() - return config - - -def prepare_model_and_dataset(config): - torch.multiprocessing.set_sharing_strategy('file_system') - - vocab_file = 'path to bert vocab.txt, needed to tokenize compound caption; not necessary for subfigure separation' - - if 'det' in config.task: - Set = Fig_Dataset(None, config.eval_file, config.img_root, vocab_file, config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=fig_collate) - if 'separate' in config.task: - Set = Fig_Separation_Dataset(None, config.eval_file, config.img_root, config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=fig_separation_collate) - else: - Set = FigCap_Dataset(None, config.eval_file, config.img_root, vocab_file, normalization=config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=8, collate_fn=figcap_collate) - - if config.model == 'baseline': - from model import FigCap_Former - else: - print('Unsupported Model Type %s' % config.model) - exit() - - - model = FigCap_Former(num_query=config.num_queries, - num_encoder_layers=config.enc_layers, - num_decoder_layers=config.dec_layers, - feature_dim=config.hidden_dim, - atten_head_num=config.nheads, - mlp_ratio=config.mlp_ratio, - dropout=config.dropout, - activation='relu', - bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert, - num_text_decoder_layers=config.txt_dec_layers, - text_atten_head_num=config.text_nheads, - text_mlp_ratio=config.mlp_ratio, - text_dropout=config.dropout, - text_activation='relu', - resnet=config.resnet, - resnet_pretrained=False) - os.environ["CUDA_VISIBLE_DEVICES"] = config.gpu - # model = nn.DataParallel(model) - model.cuda() - - checkpoint = torch.load(config.checkpoint, map_location='cpu') - state_dict = checkpoint['model_state_dict'] - model_dict = model.state_dict() - model_checkpoint = {k: v for k, v in state_dict.items()} - model_dict.update(model_checkpoint) - model.load_state_dict(model_dict) - - cp_mAP = checkpoint['val_mAP'] if 'val_mAP' in checkpoint else 0 - cp_f1 = checkpoint['val_f1'] if 'val_f1' in checkpoint else 0 - - print('Load checkpoint from %s, epoch %d, val_mAP %.2f, val_F1 %.2f' % \ - (config.checkpoint, checkpoint['epoch'], cp_mAP, cp_f1)) - - return model, Set, Loader - - -if __name__ == '__main__': - config = get_eval_args_parser() - model, Set, Loader = prepare_model_and_dataset(config) - if config.task == 'det': - evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) - elif config.task == 'det_grid_search': - grid_search_det(config, model, Set, Loader) - elif config.task == 'align': - evaluate(config, model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) - elif config.task == 'align_grid_search': - grid_search(config, model, Set, Loader) - elif config.task == "sep": - separation(model, Loader, config.save_path, config.rcd_file, config.score_threshold, nms_threshold=0.4) - else: - print('Undefined Evaluation Task') \ No newline at end of file diff --git a/openpmcvl/granular/process/model_clip_align.py b/openpmcvl/granular/process/model_clip_align.py deleted file mode 100644 index b3ab3e2..0000000 --- a/openpmcvl/granular/process/model_clip_align.py +++ /dev/null @@ -1,345 +0,0 @@ -from cgitb import text -import torch -import numpy as np -# from pytorch_pretrained_bert.modeling import BertModel -from torch import nn -from torchvision import models, transforms -import math -# from torchsummary import summary -from transformer_module import * -from einops import repeat -# from clip_code.clip_module import ModifiedResNet -import torch.nn.functional as F - -# 直接zero-shot用CLIP计算image和text的相似度(不考虑position),V1版本使用代码 -class SentenceWise_Align_Former_V1(nn.Module): - def __init__(self): - super().__init__() - - EXTRACT_DIR = '/remote-home/share/weixionglin/medclip/vlp/open_clip/src/extract_component/extracted' - - img_checkpoint_path = f"{EXTRACT_DIR}/2023_06_29-08_02_01-model_CLIP-RN50-p_amp/ImageEncoder.bin" - self.img_encoder = torch.load(img_checkpoint_path) - - text_checkpoint_path = f'{EXTRACT_DIR}/2023_06_29-07_58_12-model_CLIP-RN50-p_amp/TextEncoder.bin' - self.text_encoder = torch.load(text_checkpoint_path) - self.text_proj = torch.load(f'{EXTRACT_DIR}/2023_06_29-07_58_12-model_CLIP-RN50-p_amp/text_projection.bin') - - def forward(self, images, texts): - """ - Assign Img(Subfigure) to the Subcaption (img2txt - - Args: - images (subfigure): shape (bs, c, h, w) - texts (subcaption tokens): shape (bs, subcap_num, max_len) - - Returns: - similarity: list of tensor (bs, subcap_num), image's similarity to each subcaption(one positive, N negative) - """ - - # Img Embed - img_feature = self.img_encoder(images)['image_features'] # (bs, 768) - - img_feature = F.normalize(img_feature, dim=-1) - - # Text Embed - texts = torch.reshape(texts, (-1, texts.shape[-1])) # (bs*subcap_num, 77) - txt_feature = self.text_encoder(texts)['pooler_output'] # (bs*subcap_num, 768) - txt_feature = txt_feature @ self.text_proj - - txt_feature = F.normalize(txt_feature, dim=-1) - txt_feature = torch.reshape(txt_feature, (img_feature.shape[0], -1, txt_feature.shape[-1])) # (bs, subcap_num, 768) - - # Img Similarity to Each Subcap - cos_simi = torch.bmm(txt_feature, img_feature.unsqueeze(-1)) # (bs, subcap_num, 1) bmm requires 3D input (bs, h, w) - cos_simi = (cos_simi + 1)/2 - - return cos_simi.squeeze(-1) - - -########################################### 分割线:V0版本代码 before MICCAI - - -class SentenceWise_Align_Former(nn.Module): - def __init__(self): - super().__init__() - img_checkpoint_path = "./clip_code/extracted/2022_12_30-05_55_11-model_RN50_PubmedBERT_MLMG-p_amp/ImageEncoder.bin" - self.img_encoder = torch.load(img_checkpoint_path) - - text_checkpoint_path = "./clip_code/extracted/2022_12_30-05_50_30-model_RN50_PubmedBERT_MLMG-p_amp/TextEncoder.bin" - self.text_encoder = torch.load(text_checkpoint_path) - - self.bbox_embed = nn.Sequential( - nn.Linear(4, 768), - nn.ReLU(inplace=True), - ) - - def forward(self, images, texts, location): - """ - Assign Img(Subfigure) to the Subcaption (img2txt - - Args: - images (subfigure): shape (bs, c, h, w) - texts (subcaption tokens): shape (bs, subcap_num, max_len) - location (subfigure bbox location): shape (bs, 4) - - Returns: - similarity: list of tensor (bs, subcap_num), image's similarity to each subcaption(one positive, N negative) - """ - - # Img Embed - img_feature = self.img_encoder(images) # (bs, 768) - loc_feature = self.bbox_embed(location) # (bs, 768) - img_feature = F.normalize(img_feature+loc_feature, dim=-1) - - # Text Embed - texts = torch.reshape(texts, (-1, texts.shape[-1])) # (bs*subcap_num, 77) - txt_feature = self.text_encoder(texts)['pooler_output'] # (bs*subcap_num, 768) - txt_feature = F.normalize(txt_feature, dim=-1) - txt_feature = torch.reshape(txt_feature, (img_feature.shape[0], -1, txt_feature.shape[-1])) # (bs, subcap_num, 768) - - # Img Similarity to Each Subcap - cos_simi = torch.bmm(txt_feature, img_feature.unsqueeze(-1)) # (bs, subcap_num, 1) bmm requires 3D input (bs, h, w) - cos_simi = (cos_simi + 1)/2 - - return cos_simi.squeeze(-1) - - -class SentenceWise_Align_Former_Softmax(nn.Module): - def __init__(self): - super().__init__() - img_checkpoint_path = "./clip_code/extracted/2022_12_30-05_55_11-model_RN50_PubmedBERT_MLMG-p_amp/ImageEncoder.bin" - self.img_encoder = torch.load(img_checkpoint_path) - - text_checkpoint_path = "./clip_code/extracted/2022_12_30-05_50_30-model_RN50_PubmedBERT_MLMG-p_amp/TextEncoder.bin" - self.text_encoder = torch.load(text_checkpoint_path) - - self.bbox_embed = nn.Sequential( - nn.Linear(4, 768), - nn.ReLU(inplace=True), - ) - - def forward(self, images, texts, location): - """ - Align Img(Subfigure) with Subcaptions (img2txt - - Args: - images (subfigure): shape (bs, c, h, w) - texts (subcaption tokens): shape (bs, subcap_num, max_len) - location (subfigure bbox location): shape (bs, 4) - - Returns: - similarity: list of tensor (bs, subcap_num), image's similarity to each subcaption(one positive, N negative) - """ - - # Img Embed - img_feature = self.img_encoder(images) # (bs, 768) - loc_feature = self.bbox_embed(location) # (bs, 768) - img_feature = F.normalize(img_feature+loc_feature, dim=-1) - - # Text Embed - txt_feature = self.text_encoder(texts)['pooler_output'] # (bs, subcap_num, 768) - txt_feature = F.normalize(txt_feature, dim=-1) - - # Img Similarity to Each Subcap - cos_simi = torch.bmm(txt_feature, img_feature.unsqueeze(-1)) # (bs, subcap_num) - cos_simi = F.softmax(cos_simi, dim=1) - - return cos_simi.squeeze() - - -class SentenceWise_Align_Former_SCA(nn.Module): - def __init__(self): - super().__init__() - self.img_encoder = ModifiedResNet( - layers=[3,4,6,3], - output_dim=768, - heads=8, - image_size=224, - width=64 - ) - - bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/PubMed_BERT' - self.text_encoder = BertModel.from_pretrained(bert_path) - self.text_projection = nn.Parameter(torch.rand(768, 768)) - - def forward(self, images, texts, location): - """ - Align Img(Subfigure) with Subcaptions (img2txt - - Args: - images (subfigure): shape (bs, c, h, w) - texts (subcaption tokens): shape [bs * (subcap_num, max_len)] - location (subfigure bbox location): shape (bs, 4) - - Returns: - similarity: list of tensor [bs * (subcap_num)], image's similarity to each subcaption(one positive, N negative) - """ - - # Img Embed - img_feature = self.img_encoder(images)[0] # (bs, 768) - img_feature = F.normalize(img_feature, dim=-1) - - # Text Embed - cursor = 0 - index_range = [] # [[0,2], [2, 10], ......] - for sample in texts: - index_range.append([cursor, cursor+sample.shape[0]]) - cursor += sample.shape[0] - flatten_texts = torch.cat(texts, dim=0).cuda() # (bs*subcap_num, max_length_in_this_batch) - txt_feature = self.text_encoder(flatten_texts)[0][-1][:, 0, :] # (bs*subcap_num, 768) 取CLS对应的Feature - - txt_feature = txt_feature @ self.text_projection # (bs*subcap_num, 768) - - txt_feature = F.normalize(txt_feature, dim=-1) - unflatten_txt_feature = [] - for r in index_range: - unflatten_txt_feature.append(txt_feature[r[0]:r[1], :]) # [bs * (subcap_num, 768)] - - # Img Similarity to Each Subcap - cos_simi = [] - for i in range(img_feature.shape[0]): - cos_simi.append((unflatten_txt_feature[i] @ img_feature[i] + 1)/2) # [bs * (subcap_num)] - - return cos_simi - - -class SentenceWise_Align_Former_Bidirection(nn.Module): - def __init__(self): - super().__init__() - img_checkpoint_path = "/remote-home/share/weixionglin/checkpoint_demo/extracted/2022_12_30-05_55_11-model_RN50_PubmedBERT_MLMG-p_amp/ImageEncoder.bin" - self.img_encoder = torch.load(img_checkpoint_path) - - text_checkpoint_path = "/remote-home/share/weixionglin/checkpoint_demo/extracted/2022_12_30-05_50_30-model_RN50_PubmedBERT_MLMG-p_amp/TextEncoder.bin" - self.text_encoder = torch.load(text_checkpoint_path) - - def forward(self, img, cap): - """ - Contrast subfigs and subcaps within the same compound figure - - Args: - img (subfigure): shape (bs*subfig_num, c, h, w) - cap (subcaption tokens): shape (bs*subcap_num, 77) - - Returns: - similarity: list of tensor [bs * (num_subfig, num_subcap)] - """ - - # Img Embed - img_feature = self.img_encoder(img) # (bs*subfig_num, 768) - img_feature = F.normalize(img_feature, dim=-1) - # img_feature_ls = torch.split(img_feature, img_split_idx, dim=0) - - # Text Embed - txt_feature = self.text_encoder(cap)['pooler_output'] # (bs*subcap_num, 768) - txt_feature = F.normalize(txt_feature, dim=-1) - # txt_feature_ls = torch.split(txt_feature, cap_split_idx, dim=0) - - # Img Similarity to Each Subcap - cos_simi = (img_feature @ txt_feature.T + 1)/2 - - return cos_simi - - -class SentenceWise_Align_Former_Bidirection_Softmax(nn.Module): - def __init__(self): - super().__init__() - img_checkpoint_path = "/remote-home/share/weixionglin/checkpoint_demo/extracted/2022_12_30-05_55_11-model_RN50_PubmedBERT_MLMG-p_amp/ImageEncoder.bin" - self.img_encoder = torch.load(img_checkpoint_path) - - text_checkpoint_path = "/remote-home/share/weixionglin/checkpoint_demo/extracted/2022_12_30-05_50_30-model_RN50_PubmedBERT_MLMG-p_amp/TextEncoder.bin" - self.text_encoder = torch.load(text_checkpoint_path) - - def forward(self, img, cap): - """ - Contrast subfigs and subcaps within the same compound figure - - Args: - img (subfigure): shape (bs*subfig_num, c, h, w) - cap (subcaption tokens): shape (bs*subcap_num, 77) - - Returns: - similarity: list of tensor [bs * (num_subfig, num_subcap)] - """ - - # Img Embed - img_feature = self.img_encoder(img) # (bs*subfig_num, 768) - img_feature = F.normalize(img_feature, dim=-1) - # img_feature_ls = torch.split(img_feature, img_split_idx, dim=0) - - # Text Embed - txt_feature = self.text_encoder(cap)['pooler_output'] # (bs*subcap_num, 768) - txt_feature = F.normalize(txt_feature, dim=-1) - # txt_feature_ls = torch.split(txt_feature, cap_split_idx, dim=0) - - # Img Similarity to Each Subcap - cos_simi = F.softmax(img_feature @ txt_feature.T, dim=1) - - return cos_simi - - -class PositionEncoding(nn.Module): - def __init__(self, normalize=True, scale=100.0, num_pos_feats=256, temperature=10000): - super().__init__() - self.num_pos_feats = num_pos_feats//2 - self.temperature = temperature - self.normalize = normalize - if scale is not None and normalize is False: - raise ValueError("normalize should be True if scale is passed") - if scale is None: - scale = 2 * math.pi - self.scale = scale - - def forward(self, bs, h, w, device): - # 输入是b,c,h,w - mask = torch.ones(bs, h, w, device=device) - # 因为图像是2d的,所以位置编码也分为x,y方向 - # 1 1 1 1 .. 2 2 2 2... 3 3 3... - y_embed = mask.cumsum(1, dtype=torch.float32) # (b, h, w) the 'y-index' of each position - # 1 2 3 4 ... 1 2 3 4... - x_embed = mask.cumsum(2, dtype=torch.float32) # (b, h, w) the 'x-index' of each position - if self.normalize: - eps = 1e-6 - y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale - x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale - - # num_pos_feats = 128 - # 0~127 self.num_pos_feats=128,因为前面输入向量是256,编码是一半sin,一半cos - dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=device) - dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) - - # 输出shape=b,h,w,128 - pos_x = x_embed[:, :, :, None] / dim_t - pos_y = y_embed[:, :, :, None] / dim_t - pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) - pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) - - pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) - # 每个特征图的xy位置都编码成256的向量,其中前128是y方向编码,而128是x方向编码 - return pos # (b,n=256,h,w) - - -if __name__ == '__main__': - device = torch.device('cuda') - model = FigCap_Former() - # model = nn.DataParallel(model) - model.to(device) - img = torch.rand(4, 3, 128, 128).to(device) - text = torch.randint(1, 30000, (4, 100)).to(device) - a, b, c = model(img, text) - print(a.shape) - print(a[0,0,0]) - print(b.shape) - print(c.shape) - print(c[0,0,0]) - """ - print(resnet) - print(summary(resnet, (3, 128, 128))) - x = torch.ones(4, 3, 128, 128).cuda() - print(x.shape) - y = resnet(x) - print(y.shape) - - x = torch.ones(1, 3, 4, 4) - print(pe(x)) - """ \ No newline at end of file diff --git a/openpmcvl/granular/process/model_det_align.py b/openpmcvl/granular/process/model_det_align.py deleted file mode 100644 index 9523001..0000000 --- a/openpmcvl/granular/process/model_det_align.py +++ /dev/null @@ -1,212 +0,0 @@ -from cgitb import text -import torch -import numpy as np -from pytorch_pretrained_bert.modeling import BertModel -from torch import nn -from torchvision import models, transforms -import math -# from torchsummary import summary -from transformer_module import * -from einops import repeat - -class FigCap_Former(nn.Module): - def __init__(self, num_query=50, num_encoder_layers=6, num_decoder_layers=6, - feature_dim=256, atten_head_num=8, mlp_ratio=4, dropout=0.0, activation='relu', - alignment_network = True, - bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/PubMed_BERT', - num_text_decoder_layers=6, text_atten_head_num=8, text_mlp_ratio=4, text_dropout=0.0, text_activation='relu', - resnet=34, resnet_pretrained=False): - super().__init__() - # Followings are modules for fig detection - if resnet == 18: - self.img_embed = nn.Sequential(*list(models.resnet18(pretrained=resnet_pretrained).children())[:8]).cuda() - self.img_channel_squeeze = nn.Conv2d(512, feature_dim, 1) - elif resnet == 34: - self.img_embed = nn.Sequential(*list(models.resnet34(pretrained=resnet_pretrained).children())[:8]).cuda() - self.img_channel_squeeze = nn.Conv2d(512, feature_dim, 1) - elif resnet == 50: - self.img_embed = nn.Sequential(*list(models.resnet50(pretrained=resnet_pretrained).children())[:8]).cuda() - self.img_channel_squeeze = nn.Conv2d(2048, feature_dim, 1) - else: - print('ResNet Error: Unsupported Version ResNet%d' % resnet) - exit() - self.pos_embed = PositionEncoding(num_pos_feats=feature_dim) - - encoder_layer = TransformerEncoderLayer(feature_dim, atten_head_num, mlp_ratio*feature_dim, dropout, activation) - self.img_encoder = TransformerEncoder(encoder_layer, num_encoder_layers) - - self.query = nn.Parameter(torch.rand(num_query, feature_dim)) - decoder_layer = TransformerDecoderLayer(feature_dim, atten_head_num, mlp_ratio*feature_dim, dropout, activation) - self.img_decoder = TransformerDecoder(decoder_layer=decoder_layer, num_layers=num_decoder_layers) - - self.box_head = nn.Sequential( - nn.Linear(feature_dim, feature_dim), - nn.ReLU(inplace=True), - #nn.Dropout(p=dropout), - #nn.Linear(feature_dim, feature_dim), - #nn.ReLU(inplace=True), - nn.Linear(feature_dim, 4), - nn.Sigmoid() - ) - self.det_class_head = nn.Sequential( - nn.Linear(feature_dim, 1), - nn.Sigmoid() - ) - - # Followings are modules for fig-cap alignment - self.alignment_network = alignment_network # exclude alignment modules(BERT) to allow multi-gpu acceleration - if self.alignment_network: - self.text_embed = BertModel.from_pretrained(bert_path) - - self.text_channel_squeeze = nn.Sequential( - nn.Linear(768, 768), - nn.ReLU(inplace=True), - nn.Dropout(p=dropout), - nn.Linear(768, feature_dim), - nn.Dropout(p=dropout) - ) - - text_decoder_layer = TransformerDecoderLayer(feature_dim, text_atten_head_num, text_mlp_ratio*feature_dim, text_dropout, text_activation) - self.text_decoder = TransformerDecoder(decoder_layer=text_decoder_layer, num_layers=num_text_decoder_layers) - - self.simi_head = nn.Sequential( - nn.Linear(feature_dim*2, feature_dim), - nn.ReLU(inplace=True), - #nn.Dropout(p=dropout), - nn.Linear(feature_dim, feature_dim), - nn.ReLU(inplace=True), - #nn.Dropout(p=dropout), - nn.Linear(feature_dim, 1), - nn.Sigmoid() - ) - - self.img_proj = nn.Parameter(torch.rand(feature_dim, feature_dim)) - - def forward(self, images, texts): - """ - 1. Detect the subfigures (nonobject/object binary classification + box coordinates linear regression) - 2. Align captions to each of the detection output - - Args: - images (compound figure): shape (bs, c, h, w) - texts (caption tokens): shape (bs, max_length_in_this_batch) - - Returns: - output_det_class: tensor (bs, query_num, 1), 0~1 indicate subfigure or no-subfigure - output_box: tensor (bs, query_num, 4), prediction of [cx, cy, w, h] - similarity: tensor (bs, query_num, caption_length), 0~1 indicate belong or not belong to the subfigure - """ - # Img Embed - x = self.img_embed(images) # (bs, 2048, h/32, w/32) - x = self.img_channel_squeeze(x) # (bs, 256, h/32, w/32) - - pos = self.pos_embed(x.shape[0], x.shape[2], x.shape[3], x.device) # (bs, 256, h/32, w/32) - x = x + pos - x = x.view(x.shape[0], x.shape[1], -1) # (bs, 256, (w*h)/(32*32)) - x = x.transpose(1, 2) # (bs, (w*h)/(32*32), 256) - - # Detect - x = self.img_encoder(x) # (bs, (w*h)/(32*32), 256) - query = repeat(self.query, 'l d -> bs l d', bs=x.shape[0]) # (bs, 50, 256) - query, _ = self.img_decoder(x, query) # (bs, 50, 256) - - output_det_class = self.det_class_head(query) # (bs, 50, 1) - output_box = self.box_head(query) # (bs, 50, 4) - - # Text Embed - if self.alignment_network: - t = self.text_embed(texts)[0][-1] # (bs, l, 768) - t = self.text_channel_squeeze(t) # (bs, l, 256) - - # Align - query = query @ self.img_proj # (bs, 50, 256) - t, _ = self.text_decoder(query, t) # (bs, l, 256) - # t_proj = t_proj * self.txt_proj # (bs, l, 256) - - query = query.unsqueeze(2).repeat(1, 1, t.shape[1], 1) # (bs, 50, l, 256) - t = t.unsqueeze(1).repeat(1, query.shape[1], 1, 1) # (bs, 50, l, 256) - similarity = torch.cat((query, t), -1) # (bs, 50, l, 512) - similarity = self.simi_head(similarity).squeeze(-1) # (bs, 50, l) - else: - similarity = torch.zeros(query.shape[0], query.shape[1], texts.shape[-1]).cuda() - - """ - cos = nn.CosineSimilarity(dim=3) - similarity = cos(t.unsqueeze(1).repeat(1, query.shape[1], 1, 1), query.unsqueeze(2).repeat(1, 1, t.shape[1], 1)) - similarity = similarity/2.0 + 0.5 # project to [0, 1], (bs, 50, l), cosine similarity - """ - - """ - # The following code may results in cosine similarity beyond [0, 1] - t = t/t.norm(dim=-1, keepdim=True) - query = query/query.norm(dim=-1, keepdim=True) - similarity2 = query @ t.transpose(1,2) # self.logit_scale.exp() * query @ t.transpose(1,2) # (bs, 50, l), cosine similarity - similarity2 = similarity2/2.0 + 0.5 # project to [0, 1] - """ - - return output_det_class, output_box, similarity - -class PositionEncoding(nn.Module): - def __init__(self, normalize=True, scale=100.0, num_pos_feats=256, temperature=10000): - super().__init__() - self.num_pos_feats = num_pos_feats//2 - self.temperature = temperature - self.normalize = normalize - if scale is not None and normalize is False: - raise ValueError("normalize should be True if scale is passed") - if scale is None: - scale = 2 * math.pi - self.scale = scale - - def forward(self, bs, h, w, device): - # 输入是b,c,h,w - mask = torch.ones(bs, h, w, device=device) - # 因为图像是2d的,所以位置编码也分为x,y方向 - # 1 1 1 1 .. 2 2 2 2... 3 3 3... - y_embed = mask.cumsum(1, dtype=torch.float32) # (b, h, w) the 'y-index' of each position - # 1 2 3 4 ... 1 2 3 4... - x_embed = mask.cumsum(2, dtype=torch.float32) # (b, h, w) the 'x-index' of each position - if self.normalize: - eps = 1e-6 - y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale - x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale - - # num_pos_feats = 128 - # 0~127 self.num_pos_feats=128,因为前面输入向量是256,编码是一半sin,一半cos - dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=device) - dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) - - # 输出shape=b,h,w,128 - pos_x = x_embed[:, :, :, None] / dim_t - pos_y = y_embed[:, :, :, None] / dim_t - pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) - pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) - - pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) - # 每个特征图的xy位置都编码成256的向量,其中前128是y方向编码,而128是x方向编码 - return pos # (b,n=256,h,w) - -if __name__ == '__main__': - device = torch.device('cuda') - model = FigCap_Former() - # model = nn.DataParallel(model) - model.to(device) - img = torch.rand(4, 3, 128, 128).to(device) - text = torch.randint(1, 30000, (4, 100)).to(device) - a, b, c = model(img, text) - print(a.shape) - print(a[0,0,0]) - print(b.shape) - print(c.shape) - print(c[0,0,0]) - """ - print(resnet) - print(summary(resnet, (3, 128, 128))) - x = torch.ones(4, 3, 128, 128).cuda() - print(x.shape) - y = resnet(x) - print(y.shape) - - x = torch.ones(1, 3, 4, 4) - print(pe(x)) - """ \ No newline at end of file diff --git a/openpmcvl/granular/process/playground.ipynb b/openpmcvl/granular/process/playground.ipynb deleted file mode 100644 index cc4e7d7..0000000 --- a/openpmcvl/granular/process/playground.ipynb +++ /dev/null @@ -1,4260 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import re\n", - "from string import ascii_uppercase, ascii_lowercase\n", - "from typing import List, Dict, Tuple\n", - "\n", - "DATA_ROOT = '/datasets/PMC-15M'\n", - "SAMPLE_DATA = f'{DATA_ROOT}/0.jsonl'" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/fs01/home/afallah/light/lib/python3.10/site-packages/spacy/pipeline/entityruler.py:390: UserWarning: [W036] The component 'entity_ruler' does not have any patterns defined.\n", - " warnings.warn(Warnings.W036.format(name=self.name))\n", - "/fs01/home/afallah/light/lib/python3.10/site-packages/spacy/pipeline/entityruler.py:390: UserWarning: [W036] The component 'entity_ruler' does not have any patterns defined.\n", - " warnings.warn(Warnings.W036.format(name=self.name))\n", - "/fs01/home/afallah/light/lib/python3.10/site-packages/spacy/pipeline/entityruler.py:390: UserWarning: [W036] The component 'entity_ruler' does not have any patterns defined.\n", - " warnings.warn(Warnings.W036.format(name=self.name))\n", - "/fs01/home/afallah/light/lib/python3.10/site-packages/spacy/pipeline/entityruler.py:390: UserWarning: [W036] The component 'entity_ruler' does not have any patterns defined.\n", - " warnings.warn(Warnings.W036.format(name=self.name))\n", - "/fs01/home/afallah/light/lib/python3.10/site-packages/spacy/pipeline/entityruler.py:390: UserWarning: [W036] The component 'entity_ruler' does not have any patterns defined.\n", - " warnings.warn(Warnings.W036.format(name=self.name))\n", - "/fs01/home/afallah/light/lib/python3.10/site-packages/spacy/pipeline/entityruler.py:390: UserWarning: [W036] The component 'entity_ruler' does not have any patterns defined.\n", - " warnings.warn(Warnings.W036.format(name=self.name))\n" - ] - }, - { - "data": { - "text/plain": [ - "{'A': {'description': [], 'keywords': [], 'general': []},\n", - " 'B': {'description': ['First part.'], 'keywords': [], 'general': []},\n", - " 'C': {'description': ['Second part.'], 'keywords': [], 'general': []},\n", - " 'D': {'description': ['Third part.'], 'keywords': [], 'general': []}}" - ] - }, - "execution_count": 31, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from exsclaim.tool import CaptionDistributor\n", - "from exsclaim import caption\n", - "\n", - "def split_caption(caption_text):\n", - " # Create a minimal search query\n", - " search_query = {\n", - " \"name\": \"caption_split\",\n", - " \"query\": {}, # Empty query since we're not searching for specific keywords\n", - " \"logging\": [] # No logging for simplicity\n", - " }\n", - "\n", - " # Initialize the CaptionDistributor\n", - " distributor = CaptionDistributor(search_query)\n", - "\n", - " # Load the model\n", - " model = distributor._load_model()\n", - "\n", - " # Find the delimiter\n", - " delimiter = caption.find_subfigure_delimiter(model, caption_text)\n", - "\n", - " # Get the subfigure tokens\n", - " subfigure_tokens = caption.get_subfigure_tokens(model, caption_text)\n", - "\n", - " # Get the caption dictionary\n", - " caption_dict = caption.associate_caption_text(model, caption_text, search_query['query'])\n", - "\n", - " return delimiter, subfigure_tokens, caption_dict\n", - "\n", - "# Usage\n", - "caption_text = \"Your caption text here. (A-B) First part. (C) Second part. (D) Third part.\"\n", - "delimiter, subfigure_tokens, caption_dict = split_caption(caption_text)\n", - "\n", - "caption_dict" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "9568\n" - ] - }, - { - "data": { - "text/plain": [ - "{'PMC_ID': 'PMC193607',\n", - " 'media_id': 'pbio-0000031-g001',\n", - " 'caption': 'Electron micrograph of Proteobacteria in eukaryotic cell',\n", - " 'media_url': 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC193607/bin/pbio.0000031.g001.jpg',\n", - " 'media_name': 'PMC193607_pbio-0000031-g001.jpg'}" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Load sample jsonl file\n", - "with open(SAMPLE_DATA, 'r') as f:\n", - " dataset = [eval(line) for line in f]\n", - "\n", - "print(len(dataset)); dataset[23]" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 \n", - " Parasite Culturing and Data Characteristics of the P. falciparum IDC Transcriptome Analysis(A) Giemsa stains of the major morphological stages throughout the IDC are shown with the percent representation of ring-, trophozoite-, or schizont-stage parasites at every timepoint. The 2-h invasion window during the initiation of the bioreactor culture is indicated (gray area).(B–D) Example expression profiles for three genes, encoding EBA175, DHFR-TS, and ASL, are shown with a loess fit of the data (red line).(E) MAL6P1.147, the largest predicted ORF in the Plasmodium genome, is represented by 14 unique DNA oligonucleotide elements. The location of each of the oligonucleotide elements within the predicted ORF and the corresponding individual expression profiles are indicated (oligo 1–14). A red/green colorimetric representation of the gene expression ratios for each oligonucleotide is shown below the graph. The pairwise Pearson correlation for these expression profiles is 0.98 ± 0.02.(F) The percentage of the power in the maximum frequency of the FFT power spectrum was used as an indicator of periodicity. A histogram of these values reveals a strong bias toward single-frequency expression profiles, indicating that the majority of P. falciparum genes are regulated in a simple periodic manner. This bias is eliminated when the percent power was recalculated using random permutations of the same dataset (inset). For reference, the locations of EBA175 (peak B), DHFR-TS (peak C), and ASL (peak D) are shown.\n", - "1 \n", - " Overview of the P. falciparum IDC Transcriptome(A) A phaseogram of the IDC transcriptome was created by ordering the transcriptional profiles for 2,712 genes by phase of expression along the y-axis. The characteristic stages of intraerythrocytic parasite morphology are shown on the left, aligned with the corresponding phase of peak gene expression.(B–M) The temporal ordering of biochemical processes and functions is shown on the right. Each graph corresponds to the average expression profile for the genes in each set and the mean peak-to-trough amplitude is shown in parentheses.\n", - "3 \n", - " Temporal Distribution of the Apicoplast-Targeted Proteins and P. falciparum Proteases, Potential Antimalarial Drug Candidates(A) The expression profiles of all putative plastid-targeted genes represented on our microarray are shown. The yellow box encompasses a highly synchronized group of genes, which are in-phase with plastid genome expression. The average expression profile for this in-phase group of genes is shown and includes most of the known apicoplast-targeted genes as well as many hypothetical genes. For reference, the average expression profile for the plastid genome is shown (dashed gray line).(B) Proteases represent an attractive target for chemotherapeutic development. The broad range of temporal expression for various classes of proteases and their putative functions are displayed.Abbreviations: HAP, histo-aspartyl protease (PM III); Clp, caseineolytic protease; sub1, 2, subtilisin-like protease 1 and 2.\n", - "11 \n", - " Rescuing Molecular Oscillations within the LNvs Is Not Sufficient to Rescue Locomotor Activity RhythmsThe rescued mutant genotype is y w;pdf–GAL4;UAS–CYC,cyc01/cyc01. The flies were entrained in standard LD conditions and timepoints taken. Molecular oscillations were examined by whole-mount in situ hybridization of the tim gene. Double staining with a Pdf probe was used to label the LNvs neuronal group.(A and B) These show representative duplicate experiments. No tim mRNA signal is detectable in the dorsal region of the brain. The lower arrows point to the s-LNvs and the upper arrows to the l-LNvs. (A) Brain taken at timepoint ZT3. Panels shown from left to right are Pdf (green, FITC labeled), tim (red, Cy3 labeled), and an image overlay. (B) Brain taken at timepoint ZT15. Panels shown from left to right are Pdf (green, FITC labeled), tim (red, Cy3 labeled), and an image overlay.(C) The double-plotted actograms of rescue mutant and control flies in a standard LD:DD behavior assay. The colors on the background indicate the lighting conditions of the behavior monitors (white, lights on; light blue, lights off). In the actogram, the average locomotor activity of the group of flies is plotted as a function of time. The left panel shows the actogram of the rescued mutant flies (y w;pdf–GAL4/+;UAS–CYC,cyc01/cyc01, n = 30). RI (rhythm index; Levine et al. 2002a) = 0.14. The right panel shows the actogram for the rescued wild-type (control) flies (y w;pdf–GAL4/+;UAS–CYC/+, n = 32, RI = 0.61).\n", - "12 \n", - " All Brain Clock Neuronal Groups Maintain Robust Oscillations of tim RNA Levels in DDWild-type flies were entrained for at least 3 days and then released into DD. tim RNA was assayed at trough (left panels) and peak (right panels) timepoints by whole-mount in situ hybridization. Wild-type flies in LD (A) were compared with the eighth day of DD (B). On the eighth day of DD, the locomotor activities of the fly population were still in close synchrony, without any obvious phase spreading (data not shown). Left panels, brains at ZT3 (A) or CT3 (B); right panels, brains from ZT15 (A) or CT15 (B). Both (A) and (B) are representative of three replicate experiments.\n", - "13 \n", - " Molecular Oscillations of tim RNA Damp in DD in the Pdf01 Mutant\n", - "tim RNA oscillations were examined in the Pdf01 mutant under both LD (A) and different days in DD ([B] and [C]), by whole-mount in situ hybridization. (A), (B), and (C) are representative images from replicas of three experiments.(A) The left panel is from ZT3, and the right panel is from ZT15. A normal tim oscillation profile is observed compared to that of wild-type (see Figure 2A).(B) Brains from the Pdf01 mutant in the first day of DD. Left panel, CT3; right panel, CT15. Oscillations are comparable to those in LD.(C) Brains taken in the fourth day of DD. Six timepoints were taken throughout the circadian day. The sequence of panels from left to right is CT2, 6, 10, 14, 18, and 20, respectively. Wild-type brains (top row) were assayed in parallel with those from the Pdf01 mutant (bottom row). See text for details.(D) Quantification of (C). Relative intensities are taken from normalized mean pixel intensities. Different clock neuronal groups were quantified independently and compared between wild-type (blue curves) and Pdf01 mutant (purple curves). The panels from left to right are quantification of tim RNA oscillation in the DNs, in the LNds, and in the LNvs. Reduced cycling amplitude and a significant advanced phase were observed in the fourth day of DD. See text for details.\n", - "15 \n", - " A PDF Peptide Binds to Many Cells, Including Several Clock Neuronal GroupsIn vitro biontinylated PDF peptide was used to visualize the peptide binding locations (middle panels, with Cy3) in the brain (see Materials and Methods for details). We used membrane-bound GFP (green panels on the left) to label specific circadian neurons as well as their projections (right panels show the overlay of both channels).(A) The brain is from flies with labeled LNvs (y w,UAS–mCD8iGFP;pdf–GAL4). Numerous cells at the periphery of the medulla have the vast majority of the bound PDF peptide signal within the brain. This region receives widespread dendritic arborizations from the l-LNvs.(B) Bound PDF peptide was also detected on the surface of LNvs at a lower intensity. LNv cell bodies were labeled using UAS–mCD8iGFP;pdf–GAL4. Since the signal from the Cy3 channel was much weaker than the GFP signal, we reduced the output gain from the GFP channel. Sequential scanning was used to prevent cross-talk between the two channels.(C) y w,UAS–mCD8iGFP;tim–GAL4/+ flies were used to label all circadian neurons. In the dorsal region shown in this series, the arrow points to a group of DN3 neurons.\n", - "16 \n", - " Number of Genes and Species within the Gene Families(A) Distribution of the number of genes contained in the homolog families.(B) Number of orphan genes in each species in parentheses. Abbreviations: Ba, Buchnera aphidicola; Ec, Escherichia coli; Hi, Haemophilus influenzae; Pa, Pseudomonas aeruginosa; Pm, Pasteurella multocida; St, Salmonella typhimurium; Vc, Vibrio cholerae; Wb, Wigglesworthia brevipalpis; Xa, Xanthomonas axonopodis; Xc, Xanthomonas campestris; Xf, Xylella fastidiosa; Yp CO92, Yersinia pestis CO_92; Yp KIM, Yersinia pestis KIM.(C) Distribution of the number of species contained in the homolog families.\n", - "19 \n", - " Phylogenies for the Laterally Transferred Genes(A) ML trees obtained for BioB (left) and MviN (right). (B) NJ trees obtained for BioB (left) and MviN (right). Abbreviations: Pf, Pseudomonas fluorescens; Pp, Pseudomonas putida; Ps, Pseudomonas syringae. Other species abbreviations as in Figure 1.\n", - "32 \n", - " In Vivo Recombination Activities on Hybrid 12-RSSs with Nonamer Point Mutations or with the Anticonsensus SpacerThe plots, error bars, and values listed below each sample represent the averages of three experiments. Note that all recombination efficiencies presented in this figure were obtained from transfections/PCRs that were completely independent from those shown in Figure 2. Abbreviations are identical to those used in Figure 2.(A) N(2) or N(4) denotes point substitution of the consensus nucleotide at the second or fourth position of the nonamer, respectively.(B) Sac indicates substrates that contain an anticonsensus 12-RSS spacer.\n", - "34 \n", - " In Vitro Binding(A) Binding assays were performed using the 5′-end-labeled 12-RSS substrates indicated above the lanes. Each reaction contained identical amounts of DNA substrate. Owing to differences in the end-labeling efficiencies, the quantitation (shown in [B]) is required to make quantitative comparisons. The gels shown here correspond to Experiment 3.(B) The relative amount of substrate in the shifted complex was determined. The binding efficiencies from three independent experiments were calculated relative to the binding seen for Jβ2.2 oligonucleotides (which were arbitrarily set to 1). The average value is displayed below the chart.\n", - "36 \n", - " Theoretical Predictions of RSS QualitiesThe average recombination/cleavage efficiencies obtained in the in vivo experiments (A) and in vitro assays (B) are plotted against the RIC scores for the 12-RSS in the respective recombination substrates. Note that the values obtained from the in vitro cleavage assays were normalized to account for differences in the detection range of individual experiments.\n", - "41 \n", - " Kinetics of β-Catenin Degradation: Simulation and Experimental Results(A) Simulated timecourses of β-catenin degradation. The straight line for t < 0 corresponds to the reference state of β-catenin using the parameters given in the legends of Table 1 and 2. In vitro conditions are simulated by switching off synthesis of β-catenin and axin (ν\n", - "12 = 0, ν\n", - "14 = 0 for t ≥ 0). Curve a: reference case (no addition of further compounds); curve b: addition of 0.2 nM axin; curve c: addition of 1 μM activated Dsh (deactivation of Dsh was neglected, k\n", - "2 = 0); curve d: inhibition of GSK3β (simulated by setting k\n", - "4 = 0, k\n", - "9 = 0); curve e: addition of 1μM TCF. Addition of compounds (axin, Dsh, TCF) and inhibition of GSK3β was performed at t = 0.(B) Experimental timecourse of β-catenin degradation in Xenopus egg extracts in the presence of buffer (curve a′), axin (curve b′: 10 nM), Dsh (curve c′: 1 μM), Li+ (curve d′: 25 mM), or Tcf3 (curve e′: 1 μM).\n", - "42 \n", - " Preincubation of Dsh in Xenopus Egg Extracts Abolishes the Lag in Dsh ActivityLabeled β-catenin was incubated in Xenopus extracts on ice 30 min prior to (B) or 30 min after (A) the extract had been preincubated with 1 μM Dsh. No degradation of the labeled β-catenin was detected while the reactions were on ice. The reactions were started by shifting to 20°C.\n", - "43 \n", - " The Effect of Dsh versus Axin or GSK3β on the Half-Life of β-Catenin in Xenopus Extracts(A and B) Predicted effects of Dsh, axin, and GSK3β on the half-life of β-catenin degradation. The half-lives are calculated from simulated degradation curves. Data are plotted as function of added Dsh (logarithmic scale) for various concentrations of axin (A) and GSK3β (B).(C and D) Measured effects of Dsh, axin, and GSK3β on the half-life of β-catenin degradation. Stimulation of β-catenin degradation by axin occurs throughout the range of Dsh concentrations tested. (C) Axin increases the rate of β-catenin degradation even in the absence of added Dsh. (D) Stimulation of β-catenin degradation by GSK3β is detected only at high concentrations of Dsh. No effects of GSK3β on β-catenin degradation can be detected at less than 30 nM added Dsh. There is a disparity between the concentrations of axin in the experimental and theoretical curves. We assume that this is most likely due to the specific activity of the expressed axin protein.\n", - "46 \n", - " Effects of Increasing Axin Concentration on β-Catenin Degradation(A) Effect of axin concentration on β-catenin half-life. Curve a: reference case (K\n", - "18, K\n", - "19 > 1 nM, ordered mechanism); curve b: K\n", - "18 = 1 nM, K\n", - "19 > 1 nM; curve c: K\n", - "18 > 1 nM, K\n", - "19 = 1 nM; curve d: K\n", - "18 = 1 nM.(B) High concentration of axin inhibits β-catenin degradation in Xenopus egg extracts. Labeled β-catenin was incubated in Xenopus extracts in the absence (0 nM) or presence of moderate (10 nM) and high (300 nM) concentrations of axin. Moderate concentrations of axin greatly accelerate, whereas high concentrations inhibit β-catenin degradation.\n", - "48 \n", - " Effects of the Alternative β-Catenin Degradation Pathway and of Axin Degradation at Low Concentrations of APC(A) The alternative β-catenin degradation pathway (axin independent) can have profound effects on β-catenin levels at low APC concentrations. Variations of β-catenin and axin resulting from changes in APC concentration were calculated from the standard stimulated state. Relative variations were plotted since variation in the share of alternative degradation (1%, 5%, and 10%) results in changes of the standard stimulated state (all parameters are constant). β-Catenin and axin levels for varying contributions of the alternative degradation pathway are as follows: 1.5%, β-catenin 178 nM, axin 0.00728 nM; 5%, β-catenin 151 nM, axin 0.00679 nM; 10%, β-catenin 125 nM, axin 0.00629 nM.(B) Inhibition of axin degradation reduces β-catenin concentration after loss of APC. Plotted is the concentration of a potential proteasome inhibitor I (scaled to its inhibition constant, K\n", - "I) necessary to reduce β-catenin concentration to its original level, depending on the concentration of APC.\n", - "49 \n", - " Comparison of Different RNAi Experiments of Chromosome I Using Wild-Type Bristol N2 and rrf-3\n", - "Differences between different laboratories or investigators and between experiments done within the same laboratory and by the same investigators are observed. Ovals represent the amount of bacterial clones that gave an RNAi phenotype in an experiment. Areas that overlap represent clones for which in both experiments an RNAi phenotype was detected. Differences and overlap between an RNAi experiment done with the rrf-3 mutant strain and the data obtained by Fraser et al. (2000) done with the standard laboratory strain, Bristol N2 (A); N2 and rrf-3 tested at the same time within our laboratory (B); experiments done with N2 in two different laboratories: this study (‘NL') and Fraser et al. (2000) (C); two experiments done with the same strain, rrf-3, within our laboratory (D).\n", - "52 \n", - " V(D)J Recombination Takes Place within the BCR and TCR Loci(A) Schematic of a receptor locus.V, D, and J segments are found just upstream of the constant region. (B) A cartoon view of a VJ recombination reaction. V segments (red) are flanked by RSSs with 12 bp-long spacers (green), while the J segments are flanked by RSS with 23 bp-long spacers (orange). Breaks are introduced directly between the heptamer and the coding sequence, and a CJ is formed between a V and a J segment, while the RSS ends are put together to form an SJ within a circular DNA that is later lost. Symbols: P, promoter; E, enhancer.\n", - "58 \n", - " Genes with Haplotypes Associated with Type 2 DiabetesGenomic organization with exons (black boxes or vertical lines) and with genotyped SNPs and SNPs utilised in the haplotype reconstructions (in blue boxes) is shown. The most common haplotypes with population prevalence greater than 5% in the control population are shown, and the measure of LD (r2) is shown for a subset of the SNPs. (A) ABCC8–KCNJ11. (B) HNF4A. (C) INSR.\n", - "60 \n", - " Expression of Three Transcription Factors during Early Bacteriocyte Development(A) Drawings of some stages of pea aphid embryonic development, approximately to scale. Embryos develop viviparously within a follicular epithelium of the ovariole (data not shown). For a complete description, see Miura et al. (2003). Bacteria are transferred at stage 7. Embryos are labeled with bacteria (b), head (h), thoracic (t), and abdominal (a) regions. The three thoracic segments (t1, t2, t2) and germ cells (gc) are indicated in the stage 14 embryo.(B) A drawing of a stage 7 embryo illustrates transovarial transfer of the bacteria (red arrowhead) to the embryo and the presumptive bacteriocyte nuclei (arrow).(C) Confocal micrograph of a stage 6 embryo stained with anti-Dll antibody (red, indicated by arrow). Anti-Dll labels syncytial nuclei (presumptive bacteriocyte nuclei) in the posterior of the embryo.(D) Confocal micrograph of stage 7 embryo stained with anti-Dll and FP6.87 antibodies. Soon after the bacteria begin to invade the embryo, we observe staining with the FP6.87 antibody localized to the nucleoli (blue), which recognizes both Ubx and Abd-A in diverse arthropods, in the same nuclei that are already expressing Dll (red). The region outlined with a broken white box is enlarged in (D′) to show the bacteria, and only the green channel is shown in monochrome. The red arrow indicates one bacterium.(E and F) In these two panels of the same focal plane from the same stage 9 embryo, Ubx/Abd-A staining (blue) is observed throughout the entire nucleus of all nuclei that also express Dll (red).(G) Confocal micrograph of a stage 8 embryo stained with anti-En (yellow). As the transfer of bacteria (arrowhead) is being completed, the bacteriocyte nuclei begin to express En (yellow, indicated with arrow).In (C)–(G), confocal micrographs show only one focal plane of the embryo, so not all bacteriocyte nuclei in each embryo can be seen. In all figures, F-actin is stained with phalloidin (green). Embryos in all figures, except Figure 2, are oriented with anterior of the entire embryo (towards the germarium) to the left.\n", - "61 \n", - " The Second Wave of Bacteriocyte DeterminationIn (A)–(D), the embryos, which are normally folded in upon themselves in a pretzel shape within the ovariole (Miura et al. 2003), have been dissected flat, stained with anti-Dll antibody (red) and phalloidin (green), and examined with a confocal microscope.(A) Dll expression (red) in a stage 14 embryo is detected in the labrum (La) and all developing limbs on the ventral surface except the mandibular segment (Mn). (Other abbreviations: An, antenna; Mx, maxilla; Lb, labium; T1, T2, T3, first, second, and third thoracic leg, respectively.) The dorsal surface of the abdomen of the same embryo is shown illustrating Dll expression in the original bacteriocytes (white arrow) and in a more posterior population of nuclei or cells (blue arrow). Germ cells (gc) are labeled.(B) Dll expression is first observed in the new bacteriocyte nuclei at stage 13.(C) By stage 15, many of the new bacteriocytes have migrated to and begun intercalating between the original bacteriocytes.(D) By stage 16, all of the new bacteriocytes have intercalated between the original bacteriocytes.(E) The migration of the new bacteriocytes is seen in a confocal section of an undissected stage 14 embryo.Embryos in (A)–(D) are oriented with the anterior of the germband towards the left.\n", - "62 \n", - " Elimination of B. aphidicola by Treatment with Antibiotics Has No Effect on the Determination and Maintenance of the Bacteriocyte Cell Fate in A. pisum\n", - "(A–C) Confocal micrographs of control embryos stained with anti-Dll antibody (red) show expression of Dll, as described in Figure 1. Enlarged views of the bacteria within the broken white boxes in each embryo are shown in (A′)–(C′).(D–F) Embryos within aposymbiotic aphids at comparable stages as the controls in (A)–(C) express Dll in bacteriocyte nuclei. No bacteria are observed within these embryos, as seen in the enlarged views of (D′)–(F′).\n", - "63 \n", - " Expression of Dll in Bacteriocytes and the Pattern of Bacteriocyte Development Are Conserved in Parthenogenetic Females of P. spyrothecae\n", - "Confocal micrographs of P. spyrothecae parthenogenetic embryos stained with anti-Dll antibody (red).(A) Dll is first detected in stage 6 embryos in one or two nuclei posterior to the cellular blastoderm (arrow).(B) By stage 8, the bacteria have been transferred to and entirely fill the embryo (red arrowhead). The Dll-expressing nuclei (arrow) have become highly polyploid.(C and D) At stage 12, only the original bacteriocyte nuclei are observed expressing Dll (white arrow), but by stage 14 (D) additional nuclei (blue arrow) closely apposed to the dorsal germband express Dll.(E) By stage 15, these new nuclei surround the original bacteriocyte, and at later stages the bacteria are divided into individual cells.\n", - "64 \n", - " Bacteriocytes Are Retained in One Species That Has Evolutionarily Lost Bacteria, but Not in Males of Another Species That Do Not Inherit Bacteria(A and B) Confocal micrographs of embryos of T. styraci stained with anti-Dll antibody (red). In T. styraci, in which B. aphidicola has been evolutionarily lost (Fukatsu and Ishikawa 1992a), embryos still contain nuclei that express Dll in the correct time and place to be bacteriocyte nuclei. (A) Dll expression is first detected in posterior nuclei at blastoderm at approximately stage 6 (arrow). (B) By stage 14, the original nuclei have divided once or twice and become polyploid (original bacteriocytes), and new cells begin to express Dll (new bacteriocytes; blue arrow) and migrate towards the original bacteriocytes.(C–F) Confocal micrographs of embryos of P. spyrothecae stained with anti-Dll antibody (red). (C) Stage 16 male embryos of P. spyrothecae do not contain B. aphidicola, and no Dll-expressing cells are observed in the expected location for bacteriocytes. We believe that the cells in this location are sperm (marked with an asterisk). Sexual female embryos within the same ovary do contain Dll-expressing original and new bacteriocyte nuclei (white and blue arrows, respectively). (D and E) Transient expression of Dll in putative bacteriocytes is observed in stage 7 male embryos (arrow in male embryo of [D]), but this expression does not persist into stage 10 male embryos (E), where no Dll-expressing nuclei are observed. By contrast, stage 6 female embryos (D) contain polyploid Dll-expressing nuclei (arrow in female embryo of [D]). The sex of each embryo could be determined because males develop synchronously and earlier than females (Lampel 1958, 1968). (F) In stage 14 male embryos, we observe transient Dll expression in nuclei (blue arrow) adjacent to the germ cells (gc) in the correct location to be the second wave of bacteriocyte nuclei. This Dll expression does not persist (see stage 16 male in [C]), and the fate of the cells is unknown.\n", - "67 \n", - " Biochemistry and Histology of Different Skin Types(A) Activation of the melanocortin 1 receptor (MC1R) promotes the synthesis of eumelanin at the expense of pheomelanin, although oxidation of tyrosine by tyrosinase (TYR) is required for synthesis of both pigment types. The membrane-associated transport protein (MATP) and the pink-eyed dilution protein (P) are melanosomal membrane components that contribute to the extent of pigment synthesis within melanosomes. (B) There is a gradient of melanosome size and number in dark, intermediate, and light skin; in addition, melanosomes of dark skin are more widely dispersed. This diagram is based on one published by Sturm et al. (1998) and summarizes data from Szabo et al. (1969), Toda et al. (1972), and Konrad and Wolff (1973) based on individuals whose recent ancestors were from Africa, Asia, or Europe.\n", - "68 \n", - " Relationship of Skin Color to Latitude(A) A traditional skin color map based on the data of Biasutti. Reproduced from http://anthro.palomar.edu/vary/ with permission from Dennis O'Neil.\n", - "Erratum note: The source of this image was incorrectly acknowledged. Corrected 12/19/03.\n", - "(B) Summary of 102 skin reflectance samples for males as a function of latitude, redrawn from Relethford (1997).\n", - "74 \n", - " Crystal Structure of AfJAMM(A) On the left, the AfJAMM protomer is presented. The amino and carboxyl termini are marked by N and C. The catalytic zinc atom is depicted as a gray sphere. The zinc ligands (H67, H69, and D80) are colored in green. Secondary structure elements are numbered α1–α2 and β1–β8. The amino acids that mark the beginning and end of the disordered loop (P41–M60) are labeled. On the right, the crystal structure of the cytidine deaminase protomer is shown in the same orientation as AfJAMM to highlight the fold likeness as well as the similarly situated zinc-binding sites. The zinc ligands (C53, C86, and C89) are colored in green.(B) The dimer in the asymmetric unit of AfJAMM crystals. The side view is obtained by rotating the monomer in (A) by 90° as indicated by the quarter-arrow around the y-axis. The gold protomer is related to the green protomer by a 180° rotation around the crystallographic c-axis (shown as a black bar in the side view) and a translation of 3.38 Å.\n", - "75 \n", - " Metalloprotease-Like Active Site of AfJAMM(A) The active site of AfJAMM is shown centered around the catalytic zinc ion, which is represented as a dark gray sphere surrounded by anomalous cross Fourier difference density (contoured at 9.5 σ) colored in red. The aqua ligand, which lies at 2.9 Å from the zinc, is shown as a red sphere surrounded by purple density (contoured at 3 σ) of an Fobs – Fcalc map, in which the aqua ligand was omitted from the calculation. Residues that underlie isopeptide bond cleavage are shown in green. The carboxylate oxygen atoms of D80 lie 2.2 Å from the zinc. The Nɛ2 atoms of H67 and H69 lie 2.1 Å from the zinc. The carboxylate oxygen atoms of E22 lie 3.2–3.5 Å from the aqua ligand and 4.5–5.0 Å from the zinc. Ancillary active site residues and the backbone (ribbon diagram) are shown in grey. The disulfide bond that links C74 to C95 is shown in yellow. The JAMM motif is shown in the upper lefthand corner for reference.(B) Superimposition of active site residues in ScNP, thermolysin, and AfJAMM. AfJAMM is in green, ScNP in blue, and thermolysin in red. For clarity only, the sidechains from the residues that bind the zinc or aqua ligands are shown in their entirety. In addition, atoms that stabilize the putative tetrahedral intermediate are shown. These include Oγ of S77 in AfJAMM, Oη of Y95 in ScNP, and the Nɛ2 of H231 in thermolysin.\n", - "76 \n", - " Mutations in the JAMM Motif of Csn5 Abrogate the Deneddylating Activity of the CSN(A) Mutations in the glutamic acid (E56A) that positions the aqua ligand and in the proposed catalytic serine (S128A) of Csn5 disrupt deneddylation of Cul1 by CSN but have no effect on assembly with Csn1. A csn5Δ strain of S. pombe was transformed with an empty pREP-41 plasmid (lane 1) or with the plasmid encoding FLAG tagged: Csn5 (lane 2), Csn5E56A (lane 3), or Csn5S128A (lane 4). Whole-cell lysates were used for Western blot analysis with anti-Cul1 antibodies (top gel) and anti-FLAG antibodies (second from top). A strain with a myc13-tagged Csn1 was transformed with the above plasmids, and whole-cell lysates were used for Western blot analysis. Antibodies to the Myc tag were used to detect Csn1myc13 (third from top), and were used to pull down Csn1myc13 and subsequently blot with anti-FLAG antibodies to detect coprecipitated Csn5 mutant proteins (bottom gel).(B) Mutations in the JAMM motif display a modest dominant-negative phenotype. Western blot analysis of crude cell lysates was performed as described in (A).(C) Selected JAMM motifs from proteins of diverse functions. The canonical JAMM motif residues are highlighted in green. The conserved proline is highlighted in blue, and semiconserved cysteine is highlighted in yellow.\n", - "77 \n", - " Using Expression Data to Identify and Refine Sequence-Based Functional Assignments(A) Starting from a set of coexpressed genes (yellow dots in left box) associated with a particular function in organism A, we first identify the homologues in organism B using BLAST (middle box). Only some of these homologues are coexpressed while others are not (blue dots). The signature algorithm selects this coexpressed subset and adds further genes (light yellow) that were not identified based on sequence, but share similar expression profiles (right box).(B) The 15 coexpressed genes associated with heat shock in yeast (center) have eight homologues in E. coli (left) and 14 in C. elegans (right). Among the ten genes whose expression profiles are the most similar to these homologues (bottom), many are known to be associated with heat-shock response (boldface).(C) For each of the six organisms, the distribution of the Z-scores for the average gene–gene correlation of all the “homologue modules” (see Materials and Methods) obtained from the yeast modules is shown (top). Rejecting the homologues that are not coexpressed gives rise to the “purified modules,” whose Z-scores generally are larger (except for the yeast modules, which contain only coexpressed genes from the beginning). Adding further coexpressed genes yields the “refined modules,” which have significantly larger Z-scores (bottom).\n", - "78 \n", - " Regulatory Relations between ModulesA selection of eight transcription modules whose function is known in yeast was used to generate the corresponding (refined) homologue modules in the other five organisms. Each module is associated with a “condition profile” generated by the signature algorithm based on the expression data.(A) Correlations between these profiles were calculated for all pairs of modules in each organism. Note that for E. coli there is no proteasome and that the mitochondrial ribosomal proteins (MRPs) correspond to ribosomal genes. Modules are represented by circles (legend). Significantly correlated or significantly anticorrelated modules are connected by colored lines indicating their correlation (color bar). Positively correlated modules are placed close to each other, while a large distance reflects anticorrelation. See Figure S11 for a numerical tabulation of all pairwise correlations.(B and C) Correlations between pairs of modules according to the cell-cycle data as a function their correlation in the full data. Each circle corresponds to a pair of S. cerevisiae modules (B) or human modules (C).(D) To check the sensitivity of our results with respect to the size of the dataset, we reevaluated the correlations between the sets of conditions for randomly selected subsets of the data. Shown are the mean and standard deviation of the correlation coefficient between the heat-shock and protein-synthesis modules as a function of the fraction of removed conditions (see Figures S4 and S5 for correlations between other module pairs).\n", - "80 \n", - " Global Properties of Transcription Networks(A) The number of genes n(k) with connectivity k is plotted as a function of k (see Materials and Methods). For each of the six organisms n(k) is distributed as a power-law, n(k) ∼ k\n", - "−γ, with similar exponents γ ≈ 1.1–1.8 (see Figure S13).(B) The fraction of lethal genes is shown as a function of k for S. cerevisiae, E. coli, and C. elegans. The control (gray line) is obtained from 10,000 random choices for the lethal genes (preserving their total number). The dashed lines indicate standard deviations.(C) The fraction of genes with at least one yeast homologue is shown as a function of k for all six organisms. Control (gray) as in (B).(D) Z-score quantifying the deviation of the number of connections between genes with connectivities k and k′ from that expected by randomly rewired networks (see Maslov and Sneppen 2002). Note that connections between genes of similar connectivity are enhanced (red regions), while those between highly and weakly connected genes are suppressed (blue).(E) The clustering coefficient C is plotted against k. Each dot corresponds to a single gene and is colored according to the transcription module it is associated with (see also Figure 2). Note that genes associated with the same module correspond to a specific band in the k–C plane. Several genes with high connectivity belong to more than one module (green dots superimposed on orange ones).\n", - "81 \n", - " Caspase Activity Is Required for Spermatid Individualization(A–C) Testis of different genotypes were visualized with antibodies specific for activated Drice (green). (A) Wild-type testis. Active DRICE is present in multiple elongated cysts. Cystic bulges (cb) and waste bags (wb) are indicated by arrows. (B and C) Testes from β2tub-DIAP1 and β2tub-p35 males, respectively. Active DRICE is present in elongated cysts, but cystic bulges and waste bags are reduced in number and size.(D–F) Phalloidin-stained investment cones from testes of different genotypes (red). Spermatid axonemes in (D)–(F) are highlighted by the AXO49 antibody, which recognizes polyglycylated β2tub (Bressac et al. 1995) (blue). (D) In wild-type testes, investment cones move as a coordinated group. (E and F) Coordinated investment cone movement is disrupted in cysts from β2tub-DIAP1 and β2tub-p35 males, respectively.(G–L) EM sections of elongated cysts of different genotypes. (G) A cyst from a wild-type male that has undergone individualization. The boxed region is shown at higher magnification in (J), along with the locations of the major mitochondrial derivative (mj), minor mitochondrial derivative (mi), and axoneme (ax). A single spermatid unit is outlined with a dashed line. (H and I) In cysts from β2tub-DIAP1 and β2tub-p35 males, respectively, many spermatid units are present in a common cytoplasm that contains organelles, often including an enlarged minor mitochondrial derivative. Boxed regions of β2tub-DIAP1 and β2tub-p35 cysts shown in (H) and (I) are shown at higher magnification in (K) and (L), respectively. Several examples of multiple spermatids present in a common cytoplasm are outlined by the dashed line in (K) and (L). Scale bar for EM micrographs = 1 μm.\n", - "83 \n", - " DRONC Activation Occurs in Association with Individualization Complexes and Is ARK-Dependent(A and B) Wild-type testis stained for active DRICE (green), phalloidin-stained filamentous actin (red), and TOTO-3-stained DNA (blue). (A) Active DRICE is present throughout the length of cysts undergoing individualization. (B) Higher magnification of the testis in (A). The arrowhead points to a cyst in which the individualization complex has assembled around the spermatid nuclei, but DRICE activation has not occurred. The arrow points to a neighboring cyst in which the individualization complex has just begun to move away from the spermatid nuclei. Active DRICE is now present throughout the length of this cyst, indicating that DRICE activation within a cyst occurs rapidly and globally.(C) Active DRONC (green) is initially present in a punctate pattern, apical to the individualization complex (red) at the base of the testis (arrowheads). The individualization complex then moves through the region containing active DRONC (arrow).(D) Subsequently, active DRONC is found associated with the trailing edge of the individualization complex as it moves apical within the cyst. A higher magnification view of active DRONC staining in the left-most cyst is shown in the inset.(E and F) Active DRONC is eliminated in cysts from β2tub-Ark-RNAi and β2tub-Dn-DRONC testis, respectively.\n", - "84 \n", - " HID, dFADD, and DREDD Participate in Individualization(A) HID protein (green) is concentrated in the region of the cystic bulge, which is marked by the presence of the phalloidin-stained individualization complex (red).(B) HID immunoreactivity is absent in testis from hid 05014/H99 flies.(C) Active DRONC (green) is associated with the trailing edge of the individualization complex in a wild-type cyst.(D) Active DRONC is absent from the individualization complex in cysts from hid 05014/H99 males.(E) EM section from hid 05014/H99 testis. Essentially all spermatids have failed to individualize.(F) Higher magnification view of boxed area in (E). Multiple spermatid units sharing a common cytoplasm are outlined by the dashed line.(G) Representative EM section of cyst from dFadd f02804/dFadd f02804 testis. Essentially all spermatids have failed to individualize.(H) EM section of cyst from Dredd B118/Dredd B118 testis in which individualization has failed to occur. In some other cysts from this same male, individualization proceeded apparently normally (data not shown).\n", - "85 \n", - " The bln1 P-Element Insertion, Which Inhibits Cyt-c-d Expression, Results in Pleiotropic Defects in Spermatogenesis(A) Genomic organization of the cyt-c-d region. Upper half of the panel illustrates the structure of the region, as described by Arama et al. (2003). The lower half of the panel indicates the relative locations of several other genes in the region, as annotated by the Berkeley Drosophila Genome Project (http://flybase.bio.indiana.edu/search/) as of August 2002. The bln1 P element is inserted within the cyt-c-d transcription unit. This P element is also inserted within the transcription unit of a second gene, CR31808-RA (RE70695). Both of these genes and the bln1 P element reside within the intron of a third gene, CG31782.(B and D) Wild-type and bln1 testis, respectively, stained with anti-active DRICE antibodies. Active DRICE immunoreactivity is eliminated in bln1 testis, as described in Arama et al. (2003).(C and E) Wild-type and bln1 testis, respectively, stained with AXO49 antibodies (blue), which recognize polyglycylated β2tub present in axonemal microtubules, and phalloidin (red). Polyglycylation occurs prior to individualization (Bressac et al. 1995). Axonemes of elongated cysts from wild-type flies stain with AXO49 (C), while those from bln1 males do not (E).(F–I) EMs of cysts of different developmental stages from wild-type (F and G) and bln1 (H) testis. (F) Wild-type cyst prior to individualization. Note the structures of the major and minor mitochondrial derivatives, in particular the fact that the major mitochondrial derivative is increased in size and is electron dense. (G) Wild-type cyst following individualization. (H) Representative example of the most mature cysts found in bln1 testis. Note the dramatically increased cell size and the lack of differentiation of the major and mitochondrial derivatives, as compared to wild-type.\n", - "86 \n", - " \n", - "driceless Males Lack Active Drice Staining and Show Defects in Individualization(A) Testis from driceless male stained with active DRICE. Active DRICE staining is eliminated.(B) Elongated cysts from driceless male. AXO49 staining (blue) outlines the location of three cystic bulges. Individualization complexes (arrows) are marked with phalloidin (red).(C) Example of a cyst from a driceless male in which individualization has proceeded normally.(D) Example of a cyst from a driceless male in which individualization has failed to occur.(E) Boxed area in (D) shown at higher magnification. A region in which individualization has failed is outlined with a dashed line.\n", - "87 \n", - " Active DRICE Is Eliminated from the Cytoplasm of Wild-Type Spermatids Following Passage of the Individualization Complex, but Not from Spermatids in Which Caspase Activity Has Been Inhibited(A) Cystic bulge from a wild-type cyst stained with active DRICE (red). The cystic bulge (arrowhead) is moving to the left. Active DRICE staining is absent in areas of the spermatid bundle that the individualization complex has passed through and in which excess cytoplasm has been eliminated (arrow).(B) Cystic bulge from a β2tub-p35 cyst. The cystic bulge (arrowhead) is decreased in size, and active DRICE is present in areas of the spermatid bundle through which the individualization complex has moved (arrows). These observations suggest caspase inhibition results in at least a partial failure to eliminate excess cytoplasm, but that this is not necessarily associated with lack of movement of the individualization complex.\n", - "91 \n", - " Identification and Annotation of a Common Serum Response in Fibroblasts(A) The fibroblast common serum response. Genes with expression changes that demonstrate coordinate induction or repression by serum in fibroblasts from ten anatomic sites are shown. Each row represents a gene; each column represents a sample. The level of expression of each gene in each sample, relative to the mean level of expression of that gene across all the samples, is represented using a red–green color scale as shown in the key; gray indicates missing data. Representative genes with probable function in cell cycle progression (orange), matrix remodeling (blue), cytoskeletal rearrangement (red), and cell–cell signaling (black) are highlighted by colored text on the right. Three fetal lung fibroblast samples, cultured in low serum, which showed the most divergent expression patterns among these samples (in part due to altered regulation of lipid biosynthetic genes [Chang et al. 2002]), are indicated by blue branches.(B) Identification of cell cycle-regulated genes in the common serum response signature. The expression pattern of each of the genes in (A) during HeLa cell cycle over 46 h after synchronization by double thymidine block is shown (Whitfield et al. 2002). Transit of cells through S and M phases during the timecourse, verified by flow cytometry, is indicated below. Approximately one-quarter of genes demonstrate a periodic expression patterns and are therefore operationally annotated as cell cycle genes; the remainder of the genes are used in further analyses to define the CSR.(C) Validation of annotation by temporal expression profiles. Timecourse of gene expression changes in a foreskin fibroblast culture after shifting from 0.1% to 10% FBS is shown. Global gene expression patterns were determined using cDNA microarrays containing 36,000 genes; genes whose transcript levels changed by at least 3-fold during the timecourse and those in (A) are displayed. The cell cycle genes identified in the analysis illustrated in (B) were found to have a distinct temporal expression pattern with coordinate upregulation at 12 h.\n", - "93 \n", - " Context, Stability, and Prognostic Value of Fibroblast CSR in Breast Cancer(A) Expression patterns of CSR genes in a group of breast carcinomas and normal breast tissue previously described in Perou et al. (2000). Genes and samples were organized by hierarchical clustering. The serum response of each gene is indicated on the right bar (red shows induced; green shows repressed by serum). Note the biphasic pattern of expression that allows each tumor sample to be classified as “activated” or “quiescent” based on the expression of the CSR genes. The previously identified tumor phenotype (color code) and p53 status (solid black box shows mutated; white box shows wild-type) are shown. Pairs of tumor samples from the same patient, obtained before and after surgery and chemotherapy, are connected by black lines under the dendrogram. Two primary tumor–lymph node metastasis pairs from the same patient are connected by purple lines.(B) Kaplan–Meier survival curves for the two classes of tumors. Tumors with serum-activated CSR signature had worse disease-specific survival and relapse-free survival compared to tumors with quiescent CSR signature. Similar results were obtained whether performing classification using all breast tumors in this dataset or just the 58 tumors from the same clinical trial (Sorlie et al. 2001).\n", - "94 \n", - " Prognostic Value of Fibroblast CSR in Epithelial TumorsKaplan–Meier survival curves of tumors stratified into two classes using the fibroblast CSR are shown for stage I and IIA breast cancer (van 't Veer et al. 2002) (A), stage I and II lung adenocarcinoma (Bhattacharjee et al. 2001) (B), lung adenocarcinoma of all stages (Garber et al. 2001) (C), and stage III gastric carcinoma (Leung et al. 2002) (D).\n", - "99 \n", - " Dorsoventral Skin Characteristics(A) Skin slices from animals of different age and genotype demonstrate similar patterns of hair-length variation along the dorsoventral axis (scale bar = 1 cm).(B) Enlarged area from (A), demonstrating the transition in hair length and color in at/at mice (scale bar = 0.375 cm).(C) Proportional hair length for (A) plotted as a function of relative position along the dorsoventral axis.(D) Hair length plotted as a function of absolute position along the dorsoventral axis for 8-wk-old BA strain mice.(E) Proportion of zigzag hairs (± SEM) differs slightly between dorsum and ventrum of inbred mice (p < 0.0001, χ2 test, n = 1,958, 1,477, 1,579, 1,502).(F) Differences in dorsal and ventral skin development at P4.5 (scale bar = 1 mm, upper; 200 μm, lower).(G) Differences in hair melanin content and DOPA staining for dorsum (d), flank (f), and ventrum (v) in ae/ae and at/at mice. The upper panel also demonstrates a cream-colored appearance of the at/at ventrum. The middle panel shows representative awls (scale bar = 100 μm). The lower panel shows DOPA-stained dermis (scale bar = 200 μm).\n", - "100 \n", - " The deH Pigmentation Phenotype(A) 10-wk-old deH/deH and nonmutant animals on a at background. A thin stripe of yellow hair normally separates the dorsal black hairs from the ventral cream hairs. In deH, the yellow stripe is extended dorsally, and the boundary between the yellow and the black hairs is fuzzier.(B) Skin slices taken from 1.5-mo-old deH/deH and nonmutant littermates (scale bar = 0.5 cm).(C) Proportion of total skin area as determined by observation of pelts taken from the interlimb region. The proportion occupied by the yellow lateral compartment (± SEM) differs between mutant and nonmutant littermate flanks (p < 0.0005, paired t-test, n = 6 pairs). There is also (data not shown) a small increase in the proportion of total skin area occupied by the ventral cream-colored compartment, 47.9 % in mutant compared to 37.8% in nonmutant (p < 0.005, paired t-test, n = 6 pairs).(D) On an ae/ae background, the extent of dorsal skin pigmentation is reduced in deH/deH neonates (P3.5).(E) Hair length in a representative pair of 1.5-mo-old deH/deH and nonmutant littermates, averaged over three skin slices at different rostrocaudal levels, and plotted as a function of the absolute distance from middorsum or the percentage of total slice length.\n", - "101 \n", - " Molecular Genetics of deH and Tbx15\n", - "(A) Genetic and physical map, as described in the text. Markers M1 to M3 are SSCP markers generated from a BAC contig of the region; marker M4 is STS 16.MMHAP32FLF1 and was also used as an SSCP marker. M2 and M3, which flank the Tbx15 and M6pr-ps on the UCSC genome browser map and lie 634 kb apart, were nonrecombinant with deH in 2340 meioses.(B) The deH mutation is a deletion that starts in Tbx15 intron 1 and ends in the M6pr-ps.(C) Sequence of deletion breakpoints.(D) Diagram of Tbx15LacZ allele constructed by gene targeting. As described in the text, this allele is predicted to give rise to a protein truncated after approximately 154 codons and is lacking critical residues of the T box. Heterozygotes for the targeted allele exhibit normal size, morphology, and hair-color patterns, but homozygotes and Tbx15LacZ/deH compound heterozygotes are identical to deH homozygotes.\n", - "102 \n", - " Developmental Expression of Tbx15\n", - "(A) At E12.5, transverse sections at different levels show expression in head mesenchyme (a and b); myotome, occipital, and periocular mesenchyme (b); palatal shelf, cervical sclerotome, and nasal cartilage (c); maxillary and mandibular processes (d); limbs (e); and myotome and lateral mesenchyme (e and f) (scale bars = 500 μm).(B) Transverse sections through the flank at different times show expression in lateral mesenchyme (E11.5), expanding dorsally at E12.5, and both ventrally and dorsally at E13.5, detectable in loose mesenchyme underlying the dermis and the abdominal and subcutaneous muscles (scale bar = 500 μm). At P3.5, Tbx15 is expressed in the entire dermis and is most strongly expressed in dermal sheaths (scale bar = 200 μm).\n", - "104 \n", - " Effect of deH on Agouti ExpressionComparable sections from at/at; deH/deH and at/at; +/+ littermates.(A) At E14.5, deH/deH embryos have a smaller body cavity and loose skin within which Agouti expression appears to be shifted dorsally, as marked by arrows (scale bars = 500 μm).(B) At P4.5, Agouti expression in both dorsal and ventral skin is similar in deH/deH compared to nonmutant, but in the midflank region, there is increased Agouti expression in deH/deH, especially in the upper dermis (scale bars = 200 μm). Sections shown are representative of two mutant and two nonmutant samples examined at each time.\n", - "106 \n", - " Comparison of the Dorsoventral at/at Pigmentation Boundary to the Lateral Somitic Frontier(A) Dorsoventral slices of skin from at the midtrunk region prepared such that the dorsal midline lies in the center of the slice. Sections were taken at P1.5 (a) or P4.5 (b–e) from at/at or R26R/+; Tg.Hoxb6-Cre/+ mice (the latter were stained with X-Gal), as described in Materials and Methods. For purposes of comparison, images were proportionally scaled. The boundary of X-Gal staining marks dermis derived from lateral plate versus dermis derived from mesoderm (the lateral somitic frontier) and lies more dorsal than the at/at pigmentation boundary.(B) Quantitation of mean (± SEM) dorsal pigmentation area (n = 5) and somite-derived dermis area (n = 3) shows a significant difference (p < 0.005, t-test).(C) RNA in situ hybridization showing that Tbx15 expression at E11.5 is complementary to En1 expression on the flank (scale bars = 200 μm). The arrow indicates the boundary between the expression domains of the two genes.\n", - "107 \n", - " Model for Acquisition of Dorsoventral Patterning in the Trunk and the Role of Tbx15\n", - "(A) A tricolor pigmentation pattern is generated by the combination of distinct mechanisms that affect distribution of Agouti mRNA and histochemical staining for melanocytes; effects of the latter mechanism by itself are evident in ae/ae mice (see Figure 1). In at/at mice, reduced hair melanocyte activity and high levels of Agouti mRNA in the ventrum lead to a cream color; as melanocyte activity gradually increases towards the dorsum, a lateral stripe is apparent on the flank. The distributions of Agouti mRNA and histochemical staining for melanocytes are both affected by Tbx15 and are externally evident by a widening of the lateral stripe and an increased proportion of total skin occupied by the cream-colored area.(B) The lateral yellow stripe in at/at mice lies at the same level as the limb dorsoventral boundary. As described in the text, we propose that distinct dorsoventral compartments in ectoderm of the trunk provide an instructional cue to the mesoderm, leading to expression of Tbx15 in dorsal trunk mesenchyme and acquisition of dorsal dermis character. In the absence of Tbx15, dorsal mesenchyme assumes ventral characteristics instead.\n", - "108 \n", - " Sequence Analysis of spect cDNA(A) Nucleotide sequence of spect cDNA (top lane) and the deduced amino acid sequence (bottom lane) are shown. The predicted N-terminal signal sequence is underlined. The numbers indicate positions of the nucleotides starting from the 5′ end. The asterisks indicate the termination codon.(B) A comparison of deduced amino acid sequences of P. berghei spect (top) and P. falciparum spect (bottom). Gaps are introduced to obtain optical matching by using GENETIX-MAC software. Asterisks or dots show conserved or similar residues, respectively. The amino acid numbers from the first Met residue are shown on the left of each line.\n", - "109 \n", - " SPECT Is a Microneme Protein Specifically Produced in the Liver-Infective Sporozoite Stage(A) Indirect immunofluorescence microscopy of all four invasive forms of the malarial parasite (indicated over the panel). Parasites were stained with primary antibodies against SPECT, followed by FITC-conjugated secondary antibodies. SPECT was detected only in the salivary gland sporozoite, the liver-infective stage. The corresponding phase-contrast or DAPI-stained image (Phase or DAPI) is shown under each image. Scale bars, 5 μm(B) Western blot analysis of SPECT production in the midgut sporozoite (M) and the salivary gland sporozoite (S). Lysate of 500,000 sporozoites was loaded onto each lane and detected with the same antibody used in (A). SPECT was detected as a single band of 22 kDa (arrowhead) only in the salivary gland sporozoite.(C) Immunoelectron microscopy of sporozoites in the salivary gland. Ultrathin sections of a mosquito salivary gland infected with sporozoites were incubated with the same antibody used in (A) followed by secondary antibodies conjugated with gold particles (15 nm). Particles were localized to micronemes (Mn) but not to rhoptories (Rh). Axial (inset) and vertical images are shown. Scale bars, 0.5 μm.\n", - "110 \n", - " Targeted Disruption of the spect Gene(A) Schematic representation of targeted disruption of the spect gene. The targeting vector (top) containing a selectable marker gene is integrated into the spect gene locus (middle) by double crossover. This recombination event resulted in the disruption of the spect gene and confers pyrimethamine resistance to disruptants (bottom).(B) Genomic Southern blot hybridization of wild-type (WT) and spect(−) populations. Genomic DNA isolated from the respective parasite populations was digested with EcoT22I and hybridized with the probe indicated in (A) by a solid bar. By integration of the targeting construct, the size of detected fragments was decreased from 1.9 kbp to 1.2 kbp. The result is shown for two independently prepared populations, spect(−)1 and spect(−)2.(C) Immunofluorescence microscopy of the wild-type (WT) and spect(−) parasite. Sporozoites were collected from the salivary gland and stained with primary antibody against SPECT followed by FITC-conjugated secondary antibodies. The apical end of each sporozoite is indicated by an arrowhead.\n", - "111 \n", - " Targeted Disruption of spect Results in Reduction of Sporozoite Infectivity to the Liver(A) The salivary gland sporozoites of each parasite population were injected intravenously into five rats. The parasitemia of each rat was checked by a Giemsa-stained blood smear after inoculation on the days indicated. The average parasitemia after inoculation of 30,000 sporozoites was significantly low in disruptant populations, whereas their growth rates in the blood were essentially the same as the wild-type. The numbers of parasites inoculated were as follows: 30,000 spect(−)1 (open circles), 30,000 spect(−)2 (open triangles), 30,000 wild-type (filled circles), and 3,000 wild-type (filled squares). Values shown represent the mean parasitemia (± SEM) of five rats.(B) The salivary gland sporozoites (500,000) of wild-type or spect-disrupted parasites were inoculated intravenously into 3-wk-old rats. After 24 h, the livers were fixed with paraformaldehyde and frozen. The number of EEFs on each cryostat sections was estimated by indirect immunofluorescence analysis using anti-CS antiserum. Values shown represent the mean number of EEFs per square millimeter (± SEM) of at least three rats.\n", - "112 \n", - " \n", - "spect Disruption Results in Loss of Cell-Passage Activity of the Sporozoite(A) spect disruption does not affect sporozoite ability to infect hepatocytes. (Top panel) Comparison of EEF numbers between disruptants (spect(−)) and wild-type (WT) parasites. Salivary gland sporozoites were added to HepG2 cells and cultured for 48 h. EEFs formed were counted after immunofluorescence staining with an antiserum against CS protein. (Bottom panels) Representative fluorescence stained images.(B) Sporozoites lacking SPECT cannot traverse HeLa cells. (Top) Comparison of cell-passage activity between disruptants and wild-type parasites. Salivary gland sporozoites were added to HeLa cells and incubated for 1 h with FITC-conjugated dextran (1 mg/ml). Cell-passage activity was estimated by the number of cells wounded by sporozoite passage, which were identified by cytosolic labeling with FITC-conjugated dextran. (Bottom) Representative fluorescence stained images. All data are mean numbers of EEFs or FITC-positive cells in a one-fifth area of an 8-well chamber slide with standard errors for at least three independent experiments.\n", - "113 \n", - " Restoration of spect(−) Sporozoite Infectivity in Kupffer Cell-Depleted Rats(A) Liposome-encapsulated Cl2MDP (filled points) or PBS (open) was injected intravenously into rats. After 48 h, 30,000 sporozoites of spect(−)1 (circles), spect(−)2 (triangles), or wild-type (squares) populations were inoculated intravenously. Parasitemia of each rat was checked by Giemsa-stained blood smears after inoculation on the days indicated. Values shown represent the mean parasitemia (± SEM) of five rats.(B) Salivary gland sporozoites (500,000) of each parasite population were inoculated intravenously into Kupffer cell-depleted rats. After 24 h, the livers were fixed with paraformaldehyde and frozen. The number of EEFs on each cryostat section was estimated by indirect immunofluorescence analysis using anti-CS antiserum. Values shown represent the mean number of EEFs per square millimeter (± SEM) of at least three rats.\n", - "115 \n", - " Results of the Pilot Study in Human and MouseThe percentage of OR genes from each family is given for the entire repertoire (filled bars) and a sample of 100 genes amplified using PC1 and PC2 degenerate primers (open bars). (A) OR genes in human. (B) OR genes in mouse. None of the differences between the full repertoires and the samples are significant at the 5% level. Only full-length OR genes (larger than 850 bp) were considered.\n", - "118 \n", - " DOCK2, ELMO1, and Rac Are Abundant Nef-Associated Proteins in T Cells(A) Schematic representation of epitope-tagged HIV-1 Nef (NA7-hf). The structured regions of Nef are boxed and the disordered regions, as determined by X-ray crystallography and NMR studies, are shown by a thin line. The locations of the N-terminal myristoyl moiety, prolines P72 and P75 in the PP-II helix, arginine R106, leucines L164 and L165 (LL164), and the C-terminal HA-FLAG epitopes are indicated.(B) DOCK2, ELMO1, and Rac2 specifically copurify with HIV-1 Nef from Jurkat T cells. Jurkat T cells (1.8 ×1010) stably expressing NA7-hf (lane 3) or control Jurkat cells (lane 2) were subjected to the two-step immunopurification procedure described in the text (see Materials and Methods). Polypeptides present in purified immune complexes were resolved by SDS-PAGE and analyzed by LC/MS/MS. We identified 58 DOCK2-specific peptides covering 869 out of 1830 total amino acid residues (47.5% coverage, expectation value 6.0 × 10–130), 10 ELMO1-specific peptides covering 122 out of 727 total amino acid residues (16.8% coverage, expectation value 1.0 × 10−10), and three Rac-specific (two of which were Rac2-specific) peptides covering 26 out of 192 total amino acid residues (13.5% coverage, expectation value 4.6 × 10−4). Bands corresponding to DOCK2, ELMO1, Rac2 and their predicted molecular weights, NA7-hf Nef, and the FLAG peptide used for elution are indicated.\n", - "119 \n", - " Lentiviral Nef Binds the DOCK2–ELMO1–Rac Complex(A) HIV-1 Nef binds the DOCK2–ELMO1–Rac2 complex. His-DOCK2, Myc-ELMO1, and Myc-Rac2 alone (lanes 1, 3, and 5) or together with NA7-hf Nef (lanes 2, 4, and 6) were transiently expressed in HEK 293 cells as indicated. DOCK2 was precipitated from extracts (lanes 1 and 2) with Ni–NTA resin (lanes 3 and 4). Nef–DOCK2 was then precipitated with anti-FLAG affinity gel (lanes 5 and 6), and the epitope-tagged proteins were detected by immunoblotting and visualized by enhanced chemiluminescence.(B) Rac1 associates with HIV-1 Nef. Nef and associated proteins were isolated from extracts of HEK 293 cells transiently expressing DOCK2, ELMO1, and Rac1 either alone (lanes 1 and 4), with NA7-hf (lanes 2 and 5), or with a Nef variant containing a disrupted myristoylation signal (lanes 3 and 6). Nef and associated proteins were detected in anti-FLAG immunoprecipitates (lanes 1–3) and in extracts (lanes 4–6) by immunoblotting.(C) The interaction with DOCK2, ELMO1, and Rac2 is a conserved function of lentiviral Nef proteins. The ability of selected hf-tagged HIV-1 (lanes 1–3 and 5) and SIV mac239 (lane 4) Nef proteins to bind DOCK2, ELMO1, and Rac2 was determined as described in the legend to (B) above. The protein band in (C) indicated by the asterisk is the heavy chain of anti-FLAG mAb.\n", - "120 \n", - " Nef Activates Rac in Resting CD4+ T Lymphocytes(A) HIV-1 Nef activates Rac in Jurkat T cells. Jurkat T cells (lane 1) were transduced with a control empty vector (FUGW; lane 2) or the same vector expressing HIV-1 NA7 Nef (FUGWCNA7; lane 3). RacGTP was precipitated from cell extracts with recombinant PAK1 PBD–GST. PBD–GST bound RacGTP (top), total Rac present in extracts (middle), and Nef (bottom) were detected by immunoblotting.(B) Flow cytometric analysis of Gag and CD4 expression in resting CD4+ T lymphocytes transduced with HIV-1 derived vectors in the presence of IL-7. Percentages of cells productively infected with nef-deleted H-Δ vector (boxed area in middle panel) or with HIV-1 NA7 nef containing H-NA7 vector (right panel) are shown. Results obtained with uninfected control CD4+ T cells cultured in the presence of IL-7 are also shown (left panel).(C) HIV-1 Nef specifically activates Rac in resting primary CD4+ T lymphocytes. RacGTP and CDC42GTP were precipitated with PAK1 PBD–GST from extracts prepared from CD4+ T lymphocytes transduced with HIV-1 derived vectors, shown in (B), and analyzed as described in (A).\n", - "121 \n", - " ELMO1 and DOCK2 Mediate Rac Activation by HIV-1 Nef(A) ELMO1 is required for Rac activation by Nef in NS1 cells. RacGTP and total Rac in the extracts prepared from ELMO1-deficient NS1 cells (lanes 1 and 2) and ELMO1-expressing NS1 cells (lanes 3 and 4) following transduction with a lentiviral vector expressing HIV-1 Nef (lanes 2 and 4) or a control empty vector (lanes 1 and 3) were visualized as described in the legend to Figure 3.(B) Nef activates Rac through DOCK2 and ELMO1 in HEK 293 cells. RacGTP and total Rac in the extracts prepared from HEK 293 cells coexpressing the indicated proteins were visualized as described above.\n", - "122 \n", - " Nef Potentiates Rac Activation through Association with DOCK2–ELMO1(A and B) Myristoylation signal, P72,P75, and R106 in Nef are required for Rac activation. RacGTP and total Rac in the extracts prepared from Jurkat T cells transduced with lentiviral vectors expressing no Nef (−) or the indicated Nef proteins (A) and HEK 293 cells transiently coexpressing the indicated Nef mutants together with DOCK2, ELMO1, and Rac2 (B) were visualized as described in the legend to Figure 3 and quantified by direct imaging of chemiluminescent signals. The fraction of total Rac present in the extracts that was PBD–GST bound is shown in the histograms. Data in the histogram shown in (B) are averages of three independent experiments and error bars represent two standard deviations.(C) Myristoylation signal, P72,P75, and R106 in Nef are required for association with DOCK2, ELMO1, and Rac2. The ability of selected Nef mutants to associate with DOCK2, ELMO1, and Rac2 was determined as described in Figure 2.\n", - "124 \n", - " Nef Disrupts T Cell Migration to SDF-1(A) Migration of cell populations shown in (B) expressing GFP (open circle), ectopic CXCR4, and GFP (filled circle), HIV-1 NA7 Nef and GFP (open box), HIV-1 NA7 Nef, ectopic CXCR4 and GFP (filled box) to SDF-1 was measured in transwell assays.(B) Transient expression of ectopic CXCR4 restores CXCR4 levels on the surface of Nef-expressing cells. Flow cytometric analysis of Jurkat T cells transiently expressing GFP (panel 1) or HIV-1 NA7 Nef and GFP (panel 2) and together with ectopic CXCR4 (panels 3 and 4, respectively).\n", - "125 \n", - " Nef Disrupts Chemotaxis by Activating Rac through DOCK2–ELMO1(A and B) Jurkat T cells expressing wild-type or mutant HIV-1 Nef proteins and GFP reporter were used in transwell chemotaxis assays with SDF-1. Percentage of migrated cells expressing GFP alone (open circle), or together with HIV-1 NA7 (open square), NA7(G2\n", - "∇\n", - "HA) (open diamond), NA7(P72A,P75A) (open triangle), NA7(R106A) (filled circle), and NA7(LL164AA) (filled triangle) is shown as a function of GFP fluorescence intensity in (A) and in (B) for the single GFP fluorescence intensity interval indicated by the shaded rectangle in (A).(C) Constitutively active Rac GTPases disrupt lymphocyte migration to SDF-1. Migration of Jurkat T cells transiently expressing wild-type (Rac1, Rac2), constitutively active (Rac1G12V, Rac2G12V), or as a control HIV-1 Nef were also measured. Data shown are averages of three independent experiments and error bars represent two standard deviations.\n", - "126 \n", - " HIV-1 Nef Disrupts CCR5-Mediated Migration(A) HIV-1 Nef does not downregulate CCR5. Flow cytometric analysis of CCR5 and GFP in Jurkat T cells transiently expressing GFP alone (panel 1) or CCR5 and GFP in the absence (panel 2) and presence (panel 3) of HIV-1 Nef. Histograms of CCR5 expression for cell populations within a single GFP fluorescence intensity interval indicated by the rectangle in panel 1 are shown in panels 4 to 6, respectively.(B) Percentage of cells migrated to MIP-1β and expressing GFP alone (open circle), GFP and CCR5 (open triangle), or GFP, CCR5 and HIV-1 Nef (filled triangle) is shown as a function of GFP fluorescence intensity.\n", - "133 \n", - " Measurement of Dissociation Constants and Correlation with SPOT Intensities(A) Dissociation constants were measured with a BIAcoreX instrument as described in the Materials and Methods. The experiments with the Abp1 SH3 domain were carried out in triplicate.(B) Normalized BLU intensities plotted as a function of the log of the dissociation constant.\n", - "134 \n", - " Inferred Protein Interaction Networks(A) Protein interaction network mediated by the SH3 domains of the proteins characterized in this study. The SH3-containing proteins are represented as blue dots, while the prey partner proteins are represented as black dots. The interactions mediated by each SH3 are represented in a different color, and the edge thicknesses are proportional to the BLU intensity of the corresponding interaction, according to the scale described in Figure 3.(B) The graph represents the interaction network mediated by the SH3 domains of Rvs167, Ysc84, Yfr024c, Abp1, Myo5, Sho1, Boi1, and Boi2 as determined by the two-hybrid approach (Tong et al. 2002). The interactions (edges) that were confirmed by our WISE method (BLU value higher than 25K) are colored in red or magenta. The interactions in magenta, differently from the ones in red, were not correctly inferred by the phage display approach. The interaction in orange was inferred by the phage display approach, but not confirmed by the WISE method. The network was visualized by the Pajek package (http://vlado.fmf.uni-lj.si/pub/networks/pajek/).\n", - "135 \n", - " Characterization of Abp1 Ligands(A) The dissociation constants of the 11 peptides that bound most efficiently to the Abp1 SH3 domain in the SPOT synthesis assay were measured by BIAcore experiments. (See also Table S1.) The results of the experiments for the peptides with the highest affinity are reported here.(B) The genes encoding the putative Abp1 ligands (Prk1, Yir003w, Scp1, and Ynl094w) were modified by the TAP technology to produce tagged proteins. A strain expressing the “tapped” Bmh1 protein is used as a control. Yeast extracts encoding the tagged proteins were used in pulldown experiments in the presence of 100 μg of GST–Abp1 SH3 or GST alone as a negative control. The “Ext.” lane was loaded with 1/20 of the extract used in the pulldown experiment.(C) The same extracts were affinity-purified on an IgG affinity resin and then the affinity tag, protein A, released by cutting with the TEV protease. The proteins that were copurified with the “tapped” baits were revealed with an anti-Abp1 serum.\n", - "138 \n", - " Similarity between a Gene Network Acting as an Evolutionary Buffer and a Gene Network Regulating Neuronal Ion Channel Expression(A) Each gene (horizontal arrow) is regulated by the products of the other genes by means of upstream enhancer elements (boxes). The strength and direction of regulation (depicted as different colour saturation levels) are a function of both the upstream element and the abundance of its corresponding gene product.(B) A similar representation of a putative network for activity-dependent ion channel regulation in a neuron in which Ca2+ concentration acts as a feedback mechanism.(C) The mechanism of ion channel compensation in a neuron. The activity of the neuron is dependent upon its synaptic inputs and the suite of ion channels it expresses. Mutation of a gene encoding an ion channel leads to a change in the properties of that channel (depicted as a change in colour saturation) and hence to an increase in activity and internal Ca2+ (purple). These changes induce a compensatory increase in the expression of another ion channel (red) to restore the original level of activity.\n", - "139 \n", - " Recruitment of RPA to a DSB in the Absence of DNA RepairA strain deleted for donors (yXW1), thus incapable of repairing a DSB by gene conversion, was pregrown in YP–lactate medium, and 2% galactose was added to the culture to induce a DSB at MAT. DNA was extracted at intervals after HO cutting, to which polyclonal antibody against Rfa1 was applied to immunoprecipitate RPA-bound chromatin. Another set of DNA samples were taken at the same time for Southern blot analysis.(A) Map of MAT showing the locations of the HO-cut site as well as the StyI restriction sites and the primers (P1 and P2), 189 bp to 483 bp distal to the DSB, used to PCR-amplify RPA-associated MAT DNA from the immunoprecipitated extract. Purified genomic DNA was digested with StyI, separated on a 1.4% native gel, and probed with a 32P-labeled MAT distal fragment to monitor the appearance of the HO-cut fragment (see Materials and Methods). The 1-h timepoint represents 1 h after galactose induction of the HO endonuclease.(B) PCR-amplified RPA-bound MAT DNA in a wild-type strain (yXW1). As controls, primers to an independent locus, ARG5,6 (see Materials and Methods), were used to amplify DNA from the immunoprecipitated chromatin. PCR samples were run on ethidium bromide-stained gels (reverse images are shown). Quantitated signals were graphed for the wild-type strain. IP represents ratio of the MAT IP signal to ARG5,6 IP signal. Error bars show one standard deviation.(C) RPA-bound chromatin was PCR-amplified from sites located proximal and distal to the DSB and then quantitated and graphed as described in (B). The DSB is shown at 0 bp.(D) Effect of formaldehyde cross-linking on RPA binding to ssDNA. In both the noncross-linked samples and the cross-linked samples, 4 ng of single-stranded heterologous β-lactamase (AMP) gene DNA was added during the extract preparation step of ChIP. The amount of input genomic and heterologous DNA was measured by PCR primers specific to the ARG5,6 locus and to the AMP sequence, respectively. RPA-associated ARG5,6 and AMP DNA were analyzed from the IP samples. PCR samples were run on ethidium bromide-stained gels (reverse images are shown).\n", - "141 \n", - " Localization of RPA and Rad51 to HML and MAT during DSB-Induced Gene ConversionA strain carrying an HMLα donor (yXW2), thus able to repair the DSB at MAT by gene conversion, was treated with 2% galactose to induce HO endonuclease and then with 2% glucose after 1 h to repress further HO expression. DNA extracted at intervals after HO cutting was split. One half was applied with antibody against Rfa1 to immunoprecipitate RPA-associated DNA, while the other half was applied with anti-Rad51 antibody to immunoprecipitate Rad51-bound chromatin. Another set of DNA samples were taken at the same time for Southern blot analysis.(A) Diagram of MAT and HML showing the locations of the primers, 189 bp to 483 bp distal to the DSB at MAT (P1 and P2) and 189 bp to 467 bp from the uncleaved HO recognition site at HML (P1 and P3), used to PCR-amplify RPA- and Rad51-associated MAT and HML DNA from the immunoprecipitated extract.(B) Purified genomic DNA was digested with StyI, separated on a 1.4% native gel, and probed with a 32P-labeled MAT distal fragment to monitor the appearance of the HO-cut fragment and the repaired product Yα (see Figure 1A; see Materials and Methods). The arrowhead indicates the switched product Yα. RPA- and Rad51-bound MAT and HML DNA were PCR-amplified with primers P1 and P2 and with P1 and P3, respectively. Samples were run on ethidium bromide-stained gels.(C and D) Reverse images are shown for RPA ChIP (C) and Rad51 ChIP (D). DNA signals were quantitated and graphed as described in Figure 2. Error bars show one standard deviation.\n", - "143 \n", - " \n", - "rfa1-t11 Was Not Able to Associate with the Donor Sequence during Gene ConversionThe wild-type strain carrying the HMLα donor (yXW2) and an isogenic strain carrying the rfa1-t11 mutation (yXW3) were treated with 2% galactose to induce HO endonuclease and then with 2% glucose after 1 h to repress further HO expression. DNA extracted at intervals after HO cutting was split. One half was applied with antibody against Rfa1 to immunoprecipitate RPA-associated DNA, while the other half was applied with anti-Rad51 antibody to immunoprecipitate Rad51-bound chromatin. Another set of DNA samples was taken at the same time for Southern blot analysis.(A) Purified genomic DNA was digested with StyI, separated on a 1.4% native gel, and probed with a 32P-labeled MAT distal fragment to monitor the appearance of the HO-cut fragment and the repaired product Yα (see Figure 1A; see Materials and Methods). Arrowheads indicate the switched product Yα.(B) RPA-bound MAT and HML DNA was PCR-amplified with primers P1 and P2 and with P1 and P3, respectively (see Figure 4A). Samples were run on ethidium bromide-stained gels (reverse images are shown). DNA signals were quantitated and graphed as described in Figure 1.\n", - "144 \n", - " \n", - "rfa1-t11 Mutation Does Not Affect the Recruitment of Itself or Rad51 to an Unrepairable DSB(A) An unrepairable DSB was created in wild-type (yXW1), rfa1-t11 (ySL31), rad51Δ (ySL306), and rfa1-t11 rad51Δ (ySL351) strains, and half of the DNA sample was immunoprecipitated with anti-Rfa1 antibody to extract rfa1-t11-bound chromatin.(B) For wild-type (yXW1) and rfa1-t11 (ySL31) strains, the other half of the DNA sample was applied with anti-Rad51 antibody to extract Rad51-associated chromatin. PCR-amplified DNA from the MAT locus was run on ethidium bromide-stained gels (reverse images are shown). DNA signals were quantitated and graphed as described in Figure 2.\n", - "145 \n", - " \n", - "rfa1-t11 Mutants Are Defective in the Strand Invasion Step of Gene Conversion(A) One half of the DNA extract collected from a typical timecourse experiment as described in Figure 6 was applied with anti-Rad51 antibody to immunoprecipitate Rad51-bound chromatin. Primers P1 and P2 and P1 and P3 were used to PCR-amplify Rad51-bound MAT and HML DNA, respectively (see Figure 4A). Samples were run on ethidium bromide-stained gels (reverse images are shown). DNA signals were quantitated and graphed as described in Figure 2.(B) Input DNA was used to PCR-amplify strand invasion product using a unique primer distal to MAT (pB) and a primer within the Yα sequence from HML (pA) (White and Haber 1990). PCR-amplified ARG5,6 signals from the input DNA were used as loading control.\n", - "147 \n", - " Methodology(A) Neuroanatomical location of multielectrode implants, indicated on a schematic parasaggital section based on Paxinos and Watson (1997). Indicated are the cerebral cortex (CX), the hippocampus (HP), the thalamus (TH), and the putamen (PU).(B) Top view of a rat implanted with several multielectrode arrays.(C) Experimental design. The upper panel shows a representative example of the strong circadian dynamics of the rat sleep–wake cycle (rat 5). Gray bands indicate lights-off; white bands indicate lights-on. Notice the fixed 12-h periods of darkness and light. The lower panels show animals continuously recorded for up to 96 h that were kept undisturbed except for a 1-h period of novel CSS (white segment) produced by the tactile exploration of four distinct novel objects placed at the corners of the recording box. Neural data from pre- and postnovelty periods (black and red segments, respectively, in the middle panel) were compared.(D) Neuronal ensemble correlation method. Neuronal activity templates (red boxes) were compared with extensive recordings of neuronal action potentials (green ticks in upper panel) by way of an offline template-matching algorithm (Louie and Wilson 2001) that generalizes the notion of pairwise correlations to neuronal ensembles of any size. Templates and targets (white boxes) were binned, firing-rate normalized, and correlated (middle panel). This procedure yields a time series of neuronal ensemble correlations for each template–target sliding match (lower panel).(E) Templates of interest (red boxes) were sampled around the origin of pre- and postnovelty periods during alert WK and slid against their corresponding neuronal targets so as to sample neuronal correlations every 30 s for up to 48 h.\n", - "148 \n", - " Neuronal Ensemble Correlations Including up to Four Forebrain Regions Reveal Long-Lasting Reverberation(A) Postnovelty neuronal correlations were significantly larger than prenovelty correlations in all animals studied.(B) Temporal profiles of neuronal ensemble correlations. Gray bands indicate lights-off; white bands indicate lights-on.(C) Temporal evolution of p values associated with pre- and postnovelty Bonferroni comparisons performed in intervals of 1 h (rats 1–3) or 2 h (rats 4 and 5). Significant experience-dependent neuronal reverberation was detected up to 48 h after novel stimulation. Color bar in linear scale; black denotes p > 0.05. The minimum p values (MIN P) were, respectively, 10−14, 10−3, 10−12, 10−23, and 10−22.\n", - "149 \n", - " Long-Lasting Neuronal Reverberation Occurs in the CX, HP, PU, and TH(A) Temporal profiles of neuronal ensemble correlations in all recording sites. Gray bands indicate lights-off; white bands indicate lights-on. Red and black traces indicate post- and prenovelty correlations, respectively. (B) Temporal evolution of p values associated with pre- and postnovelty Bonferroni comparisons for individual brain areas, calculated as in Figure 2C. Color bar in linear scale; black denotes p > 0.05. Minimum p values (MIN P) in crescent “rat number” order, as follows: CX: 10−10, 10−4, 10−5, 10−9, 10−9; HP: 10−12, not significant, 10−22, 10−3 (both red and blue scales); PU: 10−2, 10−12, 10−15 (blue scale) and 10−17 (red scale), 10−16 (red scale) and 10−34 (blue scale); TH: 10−18, 10−3 (blue scale), not significant, 10−30, 10−16.(C) Neuronal ensemble correlations for no-contact templates (taken from epochs within the novel stimulation period in which animals had no sensory contact with the novel objects) also show enhanced neuronal reverberation.\n", - "150 \n", - " Neuronal Reverberation Depends on Behavioral State(A) Histograms (mean ± SEM) of post- and prenovelty correlation ratios in the recording sites where significant state-related differences in neuronal ensemble correlations were detected. SW sleep post-/prenovelty correlation ratios were significantly higher than WK in all four cases (Bonferroni comparison p values as follows: rat 2, PU, SW>WK 0.013; rat 3, CX, SW>REM 0.017 and SW>WK 0.022; rat 4, HP, SW>REM 0.013 and SW>WK 0.039; rat 5, CX, SW>WK 0.0001 and REM>WK 0.0002).(B) Bonferroni comparison p values for post-/prenovelty comparisons in all animals according to behavioral state and brain area, calculated in intervals of 4 h. Animal order and time as in Figure 3B. Color bar in linear scale.(C) Neuronal ensemble correlations sorted by state for rat 5 CX. In comparison with WK, there is a clear increase in the contrast between pre- and postnovelty correlations during SW sleep. In this particular animal and brain area, increased correlations were also seen for REM sleep, but this was not the case in other animals (A). Furthermore, this REM effect was substantially weakened when expressed in p values (B), due to the very short duration of REM sleep episodes. In this respect, notice that REM sleep has much fewer datapoints, reflecting the short duration of this state relative to WK and SW sleep. Thus, even in a site where REM sleep showed results similar to SW sleep, the cumulative neuronal reverberation that takes place during REM is necessarily less than that of SW.(D) Statistical comparison of matches between templates of neuronal activity sampled at WK normal speed with a range of targets spanning different temporal scales. Plotted are Bonferroni comparison p values for post- and prenovelty comparisons in all animals according to behavioral state and brain area, calculated in intervals of 4 h for speed factors ranging from 20 times faster to two times slower than the WK normal rate. No evidence for optimization at speeds different from the WK physiological rate (1×) was found. Color scale as in (B).\n", - "151 \n", - " Neuronal Reverberation Is Strongest during SW Sleep(A) Rat 5 (CX) dramatically illustrates the state dependency of neuronal ensemble correlations, which are strongly increased by SW sleep but readily decreased by WK. The upper panel shows the firing rates of 38 cortical neurons for approximately 45 h after exposure to novel stimulation (indicated by an asterisk). The middle panel shows the superimposition of successive neuronal ensemble correlations and concurrent behavioral states. Nearly all correlation peaks correspond to SW episodes, while almost all troughs match WK epochs. The lower panel represents pooled LFP forebrain coherence (Amjad et al. 1997) over time, useful to discriminate between WK (strong coherence above 25 Hz and weak coherence under 5 Hz) and SW sleep (the opposite). Notice that in this particular example (rat 5, CX), REM episodes show correlations similar to those of SW sleep, but, as shown in Figure 4, this was the exception and not the rule across several animals.(B) State-dependent neuronal reverberation was sustained throughout the recording period, as shown by segments representing the beginning (3,200–3,300 min), middle (4,700–4,800 min), and end (5,200–5,250 min) of the experimental record. In the upper panel, notice the progressive increase of neuronal correlations across single SW sleep episodes.(C) Blow-up of two selected data segments indicated by asterisks in (A). Despite having being sampled from moments of high neuronal firing rates (asterisk), novel stimulation templates reverberate most strongly during SW sleep when firing rates are low (single asterisk and double asterisks). The high firing rates that characterize WK correspond to decreased neuronal reverberation, probably due to sensory interference.\n", - "164 \n", - " Centriole Migration in Primary Spermatocytes(A) Time-lapse series of confocal images from a wild-type primary spermatocyte expressing GFP-PACT (centrioles) and His2AvD–GFP (chromosomes). The centrioles (arrows) can be seen moving away from the plasma membrane (0) towards the nucleus (N) and then migrating diametrically apart as the chromatin condenses. The chromosomes are fully condensed at timepoint 121 min.(B–D) The two centriole pairs (green) projected over the phase-contrast view (grey) can be seen close to the fenestrated NE and away from the plasma membrane (pm) in control cells (B), while they remain plasma membrane-bound in asp (C) and in colcemid-treated wild-type cells (D). In asp spermatocytes (C), the position of the membrane-bound centrioles correlates tightly with the pointed end of phase-dark protrusions (arrows) that are not present in colcemid-treated cells. These reflect the distribution of phase-contrast membranes known to overlap microtubules in these cells.(E–J) XY projections (E–G) and their corresponding optical sections (H–J) of control (E and H), asp (F and I), colcemid-treated spermatocytes (G and J) expressing an endogenous GFP–α-tubulin confirm that the two major MTOCs in control cells are close to the nucleus, but remain near the plasma membrane in the two experimental conditions. MTOC activity in colcemid-treated spermatocytes was assayed following a 1-s pulse of 350 nm light to inactivate the drug, thus allowing microtubule regrowth. The yellow bar in the XY projections (E–G) marks the position of the corresponding XZ optical sections (H–J).\n", - "167 \n", - " The Place of Noncentrosomal Microtubule NucleationThe initial stages of noncentrosomal microtubule nucleation revealed by an endogenous GFP–α-tubulin fusion (left) and phase contrast (right). Following the corresponding videos, it is possible to unmistakably tell the chromosomes (arrows) apart form the other phase-dark objects that are present over the nuclear region (asterisks). The cell in (A) is shown as a single timeframe and the cell in (B) as a time-lapse series. In both cells, noncentrosomal microtubule nucleation (arrowheads) takes place close to the remains on the NE and does not overlap with the major chromosomes. Nucleation sites can be clustered (A) or dispersed (B). In the time-lapse series (B), only the chromosomes that are in focus are labelled. Timepoint 0 min in these series corresponds to the first sign of noncentrosomal microtubule nucleation, around 11 min after NEB. A white bar marks the growing end of a microtubule bundle that at timepoint 93 min reaches one of the bivalents.\n", - "184 \n", - " ArmΔArm Requires Endogenous ArmEndogenous allele indicated at top; ectopically expressed transgenes indicated at left.(A) The wild-type cuticle of a Drosophila embryo.(B) The armXM19 “weak” allele phenotype, similar to wg mutations in which the entire cuticle is covered with denticles.(C) The armO43A01 “medium” allele phenotype shows disintegrated embryos in which cells delaminate owing to an inability to form adherens junctions.(D) armXK22 “strong” allele does not produce embryos, owing to an oogenesis defect.(E) A wild-type embryo expressing ArmS18 shows a wild-type cuticle.(F) armXM19 mutant expressing ArmS18 is rescued to a wild-type cuticle.(G) armO43A01 mutant expressing ArmS18 shows rescued adhesion, but a wg mutant signaling phenotype.(H) armXK22 mutant expressing ArmS18 also shows rescued adhesion, as well as a wg mutant signaling phenotype.(I) Coexpression of ArmΔArm and ArmS18 in wild-type embryos leads to naked cuticle or the uniform Wg active phenotype.(J) Coexpression of ArmΔArm and ArmS18 leads to naked cuticle or the uniform Wg active phenotype in an armXM19 mutant background.(K) Coexpression of ArmΔArm and ArmS18 in armO43A01 mutant embryos leads to naked cuticle or the uniform Wg active phenotype.(L) However, coexpression of ArmΔArm and ArmS18 in “strong” mutant armXK22 background shifts embryos back to the wg mutant phenotype. Expression of the membrane-tethered, stabilized form of Arm (ArmΔArm) leads to uniform activation of signaling in all cells. This effect is independent of whether the cell is exposed to Wg signal or not, because ArmΔArm functions independently of Wg ligand. The membrane-tethered, unstabilized form of Arm (ArmS18) leads to pathway activation only in cells that receive Wg signal, because this form of Arm is still subject to Wg-dependent phosphorylation and phosphorylation-dependent degradation.\n", - "186 \n", - " C-Terminally Truncated Arm Can Signal If Its Levels Are Increased(A) armXM19 shows a wg mutant phenotype.(B) Expression of GAL4/UAS-driven ArmXM19 protein in armXM19 mutant background rescues this to a wild-type pattern.(C) The same is true of expression of an endogenous promoter-driven truncation ArmS8.(D) Removal of Zw3 has no effect on armXM19 cuticle pattern.(E) However, when ArmS8 is introduced into armXM19, zw3 mutants, the cuticle is naked.(F) Wild-type embryo is shown for comparison.(G–I) Arm stainings reveal that expression of UAS–ArmXM19 (stained for the HA tag [G]) and ArmS8 (stained for Arm [H]) is present in stripes corresponding to Wg striping, whereas removal of Zw3, along with ArmS8 expression, leads to uniform and high levels of Arm throughout the epidermis (I).\n", - "187 \n", - " Expression of ArmΔArm Leads to the Nuclear Localization of Endogenous ArmProtein(A) Wild-type Arm protein appears in stripes that correspond to cells responding to Wg signaling.(B) Expression of ArmΔArm in an armF1a background leads to the nuclear localization of endogenous Arm.(C and D) Dark-field images reveal that expression of both ArmΔArm and ArmS10 leads to similar naked cuticle phenotypes.(E) An anti-Arm Western blot showing a faster-migrating band, which correlates with endogenous Arm's being active, and a slower-migrating band, which correlates with Arm's being inactive.\n", - "188 \n", - " ΔArm Functions through Endogenous Arm(A) Embryonic cuticle of armF1a mutant showing a weak loss-of-function phenotype.(B) Cuticle of armLM134 mutant embryo showing a strong loss-of-signaling phenotype.(C) Embryo mutant for armF1a expressing ArmΔArm showing relatively normal segment polarity.(D) armLM134 mutant expressing ArmΔArm also shows segment polarity.(E and F) Both alleles in combination with a null zw3 allele and expressing ArmΔArm show a complete lack of denticles.(G and H) Both alleles expressing the activated but nontethered form of stabilized Arm, ArmS10, show the naked cuticle phenotype.(I–L) In both missense alleles, the mutant protein is expressed in stripes (I and J), corresponding with Wg expression (data not shown), which is abolished when the key degradation kinase Zw3 is removed (K and L).\n", - "189 \n", - " Relief of C-Terminal Repression through the Elimination of Cby Leads to Uniform Activation of Signaling(A) A wild-type cuticle shown for comparison.(B) Expression of ArmΔArm in the armF1a background.(C) Expression of a Cby RNAi construct along with ArmΔArm in the armF1a background.(D) Expression of a Cby RNAi construct in an armF1a background.\n", - "190 \n", - " CD8+ T-Cell Activation during Acute HIV-1 Infection(A) Percentages of activated CD38+ cells (gated on whole CD8+ T-cells, HIV tetramer-positive CD8+ T-cells, or whole CD4+ T-cells) in donors during acute HIV-1 infection and later postacute on ART (n = 12); healthy donors (n = 11) and untreated donors with nonprogressing chronic infection (n = 12) are also shown.(B and C) CD38 and Ki67 expression on CD8+ T-cell subsets defined by CD45RA/CD62L (B) or CD28/CD27 (C) expression, shown in one single donor from acute to postacute (on ART) HIV-1 infection. Percentages of positive cells are shown. Means (± SEM) of CD38+ and Ki67+ CD8+ T-cells for ten patients are also shown; statistics concern CD38 expression.(D) Staining for the activation marker CD38 on CMV-, EBV-, or influenza A virus-specific CD8+ T-cells during acute and postacute (on ART) HIV-1 infection in a single donor. Percentages of CD38+ tetramer-positive CD8+ T-cells are shown. Data on all donors (see Table 1) are also shown.(E) Activation (CD38 and Ki67 staining) of CMV-specific CD8+ T-cells or whole CD8+ T-cell population during acute and postacute (on ART) HIV-1 infection in a single donor. Percentages of cells present in quadrants are shown.Statistics: * p < 0.002, ** p < 0.01, NS = nonsignificant, with the nonparametric Mann–Whitney test.\n", - "191 \n", - " In Vitro Priming of Antigen-Specific CD8+ T-Cells(A) Representative stainings for melan-A-specific CD8+ T-cells following priming of naïve cells from healthy donor PBMCs by autologous mature DCs loaded with various concentrations of antigen. Cells are gated on lymphocytes 47 d after priming. Percentages of melan-A tetramer-positive CD8+ T-cells are shown.(B) Percentages of melan-A-specific CD8+ T-cells over time following priming at day 0 with mature DCs loaded with various concentrations of antigen, with no restimulation or with restimulation using mature DCs at day 25. The legend indicates the concentration of melan-A–peptide used in microgram per milliliter; populations generated with 0 or 10−3 μg/ml of antigen are plotted on the right-hand side Y axis.(C) Percentages of melan-A tetramer-positive CD8+ T-cells expressing granzyme A, Ki67, CD62L, or CD57 according to antigen concentration used, at day 30 following priming. Ki67 and CD57 expressions are plotted on the right-hand side Y axis.(D) CD28 and CD27 expression on melan-A tetramer-positive CD8+ T-cells in PBMC (day 0), and over time following priming with 1 μg/ml of antigen. Percentages of cells present in quadrants are shown. The model of CD8+ T-cell differentiation based on CD28 and CD27 expression is illustrated (top left panel).(E) Distribution of the melan-A-specific CD8+ T-cells into the distinct differentiated subsets according to antigen concentration used, at day 47 following priming. Similar observations were made whether the cells were subjected to a second round of stimulation or not. Data are representative of three independent experiments.\n", - "192 \n", - " Activation and Differentiation of Antigen-Specific CD8+ T-Cells during HIV-1 Infection(A) Representative staining for the differentiation marker CD27 on three HIV-specific (HLA-B8 nef, HLA-A2 p17, and HLA-B8 p24) populations in a single HIV-1-infected donor. Numbers show percentages of tetramer-positive CD8+ T-cells (outside the quadrants) and percentages of CD27− tetramer-positive cells (inside the quadrants).(B) Correlation between size (percentage of tetramer-positive CD8+ T-cells) and differentiation (percentages of CD27− tetramer-positive cells) of CD8+ T-cells specific for HIV antigens (including HLA-A2 p17, pol, HLA-B7 nef, gp41, HLA-B8 nef, p24, and HLA-B57 p24) (open circles), CMV antigens (including HLA-A2, B7, and B35 pp65) (filled circles), EBV (HLA-A2 BMLF1, HLA-B8 BZLF1, EBNA3A) (filled squares), and influenza (HLA-A2 matrix) (open squares) antigens or all antigens together. These populations were studied in individuals with chronic infection for HIV, CMV, or EBV (independently from clinical status). P values were obtained using the nonparametric Spearman rank correlation test.(C) CD28 and CD27 expression on whole, HIV nef-, or p24-specific CD8+ T-cells during acute and postacute (on ART) HIV-1 infection in a single donor.(D) CD28 and CD27 expression on CMV-, EBV-, or influenza-specific CD8+ T-cells during acute and postacute (on ART) HIV-1 infection in a single donor. Percentages of cells present in quadrants are shown.\n", - "193 \n", - " CD8+ T-Cell Differentiation and HIV-1 Disease Progression(A) Distribution of the CD8+ T-cell population in differentiated subsets (CD28+/CD27+ early, CD28−/CD27+ intermediate, and CD28−/CD27− late) through the course of HIV-1 infection. Abbreviations: H, healthy (n = 15); A, acute HIV infection (n = 11); C, chronic HIV infection nonprogressor (no ART; n = 14); P, chronic HIV infection with signs of disease progression (no ART; n = 10). Statistics: * p < 0.0001 with the ANOVA test and p < 0.005 between each group.(B) Percentages of CD27− CD8+ T-cells that are specific for HLA-B8 HIV (nef) or HLA-A2 CMV in HIV-1-infected individuals at different stages of infection. Statistics: ** p < 0.005 with the nonparametric Mann–Whitney test.(C) Inverse correlation between CD4+ T-cell counts and percentage of highly differentiated CD27− cells in the whole CD8+ T-cell population of HIV-1-infected donors during chronic infection (untreated nonprogressors and progressors). The p value was obtained using the nonparametric Spearman rank correlation test.\n", - "194 \n", - " CD8+ T-Cell Differentiation and Senescence(A) Expression of the replicative senescence-associated marker CD57 on antigen-experienced CD8+ T-cell subsets. The percentage and mean fluorescence intensity for the CD57+ cells are shown for one single donor. Data on several donors (HIV-1-infected or healthy) are also shown (n = 24).(B) Expression of CD57 on CD8+ T-cells (whole population or antigen-specific) from acute to postacute (on ART) HIV-1 infection.(C) CD69 expression and CFSE proliferation profile for CD8+ T-cell subsets gated on the basis of CD57 and CD27 expression following stimulation with anti-CD3 antibodies. PBMCs were analysed for CD69 expression after 18 h and CFSE labeling after 6 d. Percentages of proliferating cells (with background subtracted) are indicated. Representative results from three experiments (one HIV-infected and two healthy donors) are shown.(D) Telomere length measurement by flow FISH on naïve and antigen-experienced CD8+ T-cell subsets FACS-sorted on the basis of CD57, CD27, CCR7, and CD45RA expression. The average length of telomeres was obtained by substracting the mean fluorescence of the background control (no probe; open histogram) from the mean fluorescence obtained from cells hybridised with the FITC-labeled telomere probe (gray histogram). Representative results from two experiments (on healthy donors) are shown.(E) CD57 and perforin expression in the CD8+ T-cell population dissected into naïve (CD27+high, perforin-negative), antigen-experienced CD27+ (perforinlow), and antigen-experienced CD27− perforinlow or perforinhigh subsets. The percentage and mean fluorescence intensity for the CD57+ cells are indicated.(F) Representative staining for perforin and CD57 in CD8+ T-cells from a HIV-1-infected or a healthy donor. Percentages of cells present in the top quadrants are shown.(G) Representative staining for perforin and CD57 in CD4+ T-cells from an HIV-1-infected or a healthy donor. Percentages of cells present in the top quadrants are shown.\n", - "197 \n", - " Mammary-Specific Inactivation of the pRb Pathway Induces Extensive AbnormalitiesHistologic comparisons of nontransgenic (A–D), mosaic (F0 line 2 [E–H]), and transgenic (F1, line 3 [I–L]) lactating mammary glands reveals that T121 expression results in increased proliferation and apoptosis. Hemotoxylin and eosin staining shows acini of the normal lactating gland are composed of a single layer of secretory epithelial cells (A) with milk-filled lumen. Consistent with atrophy, transgenic animals have a lower density of acini demonstrated by the presence of lipid-filled adipocytes (asterisk in [K]). Acini composed of T121-expressing cells are atypical. Many are collapsed and composed of tall columnar epithelia of large hyperchromatic cells with papillary tufting (arrows in [I]). Transgene-expressing cells have large pleomorphic nuclei (open arrows in [G]) as compared to nuclei of nonexpressing cells (arrows in [G]). Staining for T121 expression (blue in [B]–[J]) indicates the line 2 F0 animal is mosaic, showing localized expression (F), whereas the transgene expresses throughout the gland of an F1 line 3 animal (J). Increased proliferation assayed by PCNA staining (red) is also localized in the mosaic founder (G), but found throughout the F1 transgenic gland (K). Similarly, TUNEL staining (brown) demonstrates increased apoptosis in transgenic animals (H and L); moreover, the regionalized apoptosis in the mosaic gland (H) strongly suggests that transgene expression and not precocious involution is the cause. All samples are from primiparous females on lactation day 1.\n", - "198 \n", - " Reduced p53 Activity Decreases Apoptosis but Does Not Increase ProliferationRepresentative apoptosis levels of each mouse line correlate with T121 expression as indicated by the percentage of TUNEL positive cells (A). Decreasing levels of p53 activity correlate with lower levels of apoptosis in transgenic mammary glands (B). The mean percentage of apoptotic cells in p53 wild-type transgenic glands was 21%; in p53 heterozygous animals, 9%; and in p53 null animals, 5% (B), indicating that 75% of the apoptosis is p53-dependent. Apoptosis levels are further reduced to 2% in terminal stage tumors (B, Tumors). The percentage of PCNA staining cells remains unchanged in p53 heterozygous or nullizygous animals (C), indicating that reduction of p53 activity levels had no significant impact on cell proliferation. Samples were derived from primiparous animals on lactation day 1, except as indicated as tumor samples (B). Transgenic animals in (B) and (C) were from line 3.\n", - "200 \n", - " Tumor MorphologiesHemotoxylin and eosin staining of WAP-T121 (C and D) and WAP-T\n", - "121\n", - "p53+/− (A and B) (also representative of WAP-T121) tumor sections shows that terminal stage adenocarcinomas have varied morphologies. Poorly differentiated solid tumors were comprised of nests (A) or cords of epithelial cells (Tu) that infiltrate a fibrous stroma and were accompanied by necrosis (arrow) and strong immune response (arrowheads). Moderately differentiated glandular tumors (B) consisted of irregular, disorganized glands. In animals of wild-type p53 background, four pilar tumors (C), distinguished by swirls of laminar acellular keratin (arrow), and a single spindle cell carcinoma (D) were also observed. For comparison, a lactating gland from a wild-type animal is shown in Figure 3A. The percentage of animals displaying each of the phenotypes is summarized in (G). Since many tumors shared multiple morphologies, the sum exceeds 100%.\n", - "209 \n", - " Lefty Antagonizes Nodal and Vg1 Signaling, but Not Activin Signaling, in Zebrafish\n", - "ntl mRNA expression (A–C) and gsc mRNA expression (D–O) in wild-type zebrafish embryos at shield stage, animal pole view. Embryos were injected with low levels (1 pg) of activin βB mRNA (A–C), high levels (10 pg) of activin βB mRNA (D–F), 200 pg of activin βA mRNA (G–I), 75 pg of sqt mRNA (J–L), or 200 pg of Vg1 (M–O). Embryos were further double-injected with either 500 pg of LacZ mRNA (A, D, G, J, and M), 100 pg of lefty1 and 400 pg of LacZ mRNAs (B, E, H, K, and N), or 500 pg of lefty1 mRNA (C, F, I, L, and O). Ectopic ntl expression (arrowheads) in activin βB mRNA-injected embryos was not inhibited by Lefty1 (B and C) when compared with LacZ mRNA-coinjected controls (A). Note the dorsal expression of ntl (asterisks)—that is, dependent on endogenous Nodal signaling—is inhibited by Lefty1 in these embryos (B and C). Ectopic gsc expression in activin βB and activin βA mRNA-injected embryos was not inhibited by Lefty1 (E and F and H and I, respectively). In contrast, ectopic gsc expression in sqt and Vg1 mRNA-injected embryos was inhibited by both levels of Lefty expression (K and L and N and O, respectively). Wild-type embryos (P) were injected with 10 pg (low) and 20 pg (high) of activin βB/HA, 75 pg of sqt, or 200 pg of Vg1 mRNA. Embryos were further double-injected with 500 pg of LacZ mRNA, 100 pg of lefty1, and 400 pg of LacZ mRNAs, or 500 pg of lefty1 mRNA. Smad2 pathway activation was measured by an Activin response element luciferase reporter, A3-luc. Values are folds over wild-type control injected with 500 pg of LacZ mRNA and A3-luc reporter. An asterisk indicates a significant difference from the level of activation with ligand and LacZ expression alone (Student's t-test, p < 0.05).\n", - "211 \n", - " Lefty Binds to Cripto, but Not to the Activin Receptors ActRIIB and Alk4(A and B) Lefty1 interacts with Cripto. RNAs (1 ng each) encoding ActRIIB(KR)/Myc, Alk4(KR)/Flag, Cripto/Flag, Lefty1/HA, or Sqt/HA were injected into Xenopus embryos. After chemical cross-linking, lysates were immunoprecipitated for either Lefty1/HA or Sqt/HA (A) with anti-HA antibody, or ActRIIB(KR)/Myc, Alk4(KR)/HA, Cripto/Flag (B) with, respectively, anti-Myc, anti-HA, or anti-Flag antibodies. Note that Lefty1 specifically interacts with Cripto (A and B), and these Lefty/Cripto complexes do not contain Alk4 (A). Moreover, processed Lefty1 binds much more efficiently to Cripto than full-length Lefty1 precursor (B). In contrast, Sqt can bind to ActRIIB, Alk4, and Cripto (A). The 55 kDa protein marker in (B) is estimated based on molecular weight markers.(C) Lefty1 competes with Nodal for binding to Cripto. RNAs encoding Sqt/HA (1 ng), Cripto/Flag (100 pg), or Lefty1 (2 ng) were injected and anti-Flag antibody was used to immunopreciptate Cripto/Flag.(D) mLefty1 binds directly to Cripto. Purified mouse Lefty1 protein (mLefty1; 10 μg/ml) was mixed with either soluble purified Cripto/His protein (5 μg/ml) or purified control VEGF-D/His protein (5 μg/ml). After chemical cross-linking, mLefty1 was immunoprecipitated with anti-mLefty1 antibody. mLefty1 associates with Cripto, but not with control VEGF-D.Proteins in the coimmunoprecipitates and total extracts were probed in Western blot analysis with the indicated antibodies: ActRIIB(KR)/Myc (kinase-defective receptor, approximately 120 kDa; anti-Myc), Alk4(KR)/Flag (kinase-defective receptor, approximately 70 kDa; anti-Flag), Cripto/Flag (approximately 30 kDa; anti-Flag), Lefty1/HA (mature ligand, approximately 36–40 kDa; anti-HA; Sakuma et al. 2002), Sqt/HA (unprocessed precursor, approximately 55 kDa; mature ligand, approximately 22 kDa; anti-HA), Lefty1/Glu (unprocessed precursor, approximately 55 kDa; mature ligand, approximately 38 kDa; anti-Glu; Sakuma et al. 2002), mLefty1 (mature ligand, approximately 36 kDa, anti-mLefty1; Sakuma et al. 2002), Cripto/His (soluble form, approximately 22–25 kDa; anti-His), and VEGF-D/His (mature ligand, approximately 15–20 kDa; anti-His).\n", - "213 \n", - " Sequence Determinants Conferring Independence from EGF-CFC Coreceptors(A) Sequence alignment of Finger 2 region of EGF-CFC-dependent and EGF-CFC-independent TGFβ ligands. Location of secondary structure elements, β-sheets (β6–β9) and loop, are shown (Kirsch et al. 2000). Residue numbering is from mouse ActivinβA.(B–E) Synthetic mRNAs (200 pg) encoding chimeras of Finger 2 subregions between Xenopus ActivinβB or ActivinβA and zebrafish Sqt or Vg1 were injected into wild-type and MZoep embryos. Schematic is not drawn to scale. gsc and ntl mRNA expression is at shield stage; animal pole views are dorsal to the right.(B) SqtAct\n", - "β\n", - "B[loop\n", - "β\n", - "8\n", - "β\n", - "9] and SqtAct\n", - "β\n", - "B[loop\n", - "β\n", - "8] can induce gsc and ntl expression in both wild-type and MZoep embryos.(C) SqtAct\n", - "β\n", - "B[\n", - "β\n", - "8] can weakly expand ntl expression in MZoep mutants. ntl mRNA expression in MZoep mutants is at shield stage; lateral view.(D) Other TGFβs conform to loop-β8 EGF-CFC-independent determinant. Note that Xenopus ActivinβA can induce ectopic gsc in both wild-type and MZoep embryos. In contrast, Vg1 can only induce gsc in wild-type embryos. Similar to Activins, chimeric SqtAct\n", - "β\n", - "A[loop\n", - "β\n", - "8] and Vg1Act\n", - "β\n", - "B[loop\n", - "β\n", - "8] can induce ectopic gsc in both wild-type and MZoep embryos.(E) Wild-type and MZoep embryos were injected with 5 pg of activin βB, 100 pg of sqt, 100 pg of Vg1, 125 pg of SqtActβB[loopβ8], 250 pg of SqtActβA[loopβ8], or 100 pg of Vg1ActβB[loopβ8] mRNA. Smad2 pathway activation was measured by an Activin response element luciferase reporter, A3-luc. Luciferase units are relative to wild-type or MZoep control injected with the A3-luc reporter alone.(F) SqtAct\n", - "β\n", - "B[loop\n", - "β\n", - "8] can bind to ActRIIB and Alk4 in the absence of EGF-CFC coreceptors. RNAs (1 ng each) encoding ActRIIB(KR)/Myc, Alk4(KR)/Flag, Cripto/Flag, ActivinβB/HA, Sqt/HA, or SqtAct\n", - "β\n", - "B[loop\n", - "β\n", - "8]/HA were injected into Xenopus embryos. Proteins in the coimmunoprecipitates and total extracts were probed in Western blot analysis with the indicated antibodies: ActRIIB(KR)/Myc (approximately 120 kDa; anti-Myc), Alk4(KR)/Flag (approximately 70 kDa; anti-Flag), Cripto/Flag (approximately 30 kDa; anti-Flag), ActivinβB/HA (mature ligand, approximately 16 kDa; anti-HA), Sqt/HA (mature ligand, approximately 22 kDa; anti-HA), and SqtAct\n", - "β\n", - "B[loop\n", - "β\n", - "8]/HA (mature ligand, approximately 22 kDa; anti-HA).\n", - "217 \n", - " Model for EGF-CFC, Activin Receptors, Lefty, and TGFβ Interactions(A) In the absence of ligands, the EGF-CFC coreceptor (solid pink) is constitutively bound to the type I receptor Alk4 (solid green).(B) Nodal (solid blue) binds to receptor complexes consisting of EGF-CFC/Alk4 and ActRIIB (solid green).(C) Lefty (solid yellow) sequesters the EGF-CFC coreceptor, thereby preventing Nodal binding to the receptor complexes.(D) Subtle sequence differences determine the interaction with the EGF-CFC coreceptor and the Lefty inhibitor. Nodal and Vg1/GDF1 (solid blue) require the EGF-CFC coreceptor for signaling through ActRIIB and Alk4, while Activin (solid red) does not. SqtAct\n", - "β\n", - "B[loop\n", - "β\n", - "8] and Vg1Act\n", - "β\n", - "B[loop\n", - "β\n", - "8] (solid blue with red strip) containing the loop-β8 region of ActivinβB can bind to ActRIIB and Alk4 without the EGF-CFC coreceptor and therefore cannot be blocked by Lefty. ActSqt[Finger1-loop\n", - "β\n", - "8] (solid red with two blue strips) requires the coreceptor for receptor complex binding and can be inhibited by Lefty.\n", - "219 \n", - " Biosynthesis of Acetate-Primed Polyketides(A) Minimal PKS is necessary and sufficient for the synthesis of a complete polyketide chain. KS-CLF is the condensing enzyme in the minimal PKS, catalyzing each round of condensation between malonyl-ACP and the growing polyketide chain. ACP serves as the carrier for malonyl units, and it is malonylated by the MAT associated with FAS. Chain synthesis initiates with the decarboxylation of malonyl-ACP to acetyl-ACP by the KS-CLF for most aromatic PKSs. The acetyl unit is then transferred to the KS-CLF and primes the enzyme for subsequent condensations. The overall chain length is controlled by the KS-CLF complex. An octaketide synthase (e.g., act PKS) uses a total of eight malonyl equivalents (including the primer), while a decaketide synthase (e.g., tcm PKS) uses a total of ten malonyl equivalents.(B) An octaketide can spontaneously form SEK4 and SEK4b in the absence of tailoring enzymes. Members of the act KR family can regioselectively reduce the octaketide at C-9, which can then spontaneously form mutactin in the absence of AROs and CYCs. When bifunctional ARO/CYC (e.g., actVII) and second-ring CYC (e.g., actIV) are present, the reduced octaketide can be transformed into the anthraquinone DMAC.(C) A decaketide can spontaneously form SEK15 and SEK15b in the absence of tailoring enzymes. KR can regioselectively reduce the C-9 carbonyl. A reduced decaketide can spontaneously form RM20, RM20b, and RM20c. Not shown are the other tailoring enzymes associated with decaketides, which can transform the nascent decaketide into tetracycline or anthracycline structures.\n", - "221 \n", - " Engineered Biosynthesis of YT46 (1) and YT46b (2)(A) HPLC trace of extracts from CH999/pYT44-pYT46. A linear gradient of 20%–60% CH3CN in water was used. (Left) CH999/pYT44, which only has the minimal PKS module from act PKS and KR, produced the expected mutactin (and the dehydrated dehydromutactin). CH999/pYT45, which contains the R1128 loading module and an incomplete minimal PKS, produced no major polyketides. (Right) Upon coexpressing the R1128 loading module with a functional act minimal PKS (in the presence of KR), two new major polyketides were produced with the indicated masses. When 1 g/l of valine was added to the growth medium, the yield of the compound with mass of 292 doubled (traces not drawn to the same scale). The two compounds are identified as YT46 and YT46b.(B) Engineered biosynthesis of YT46 and YT46b. YT46 (1) is derived from propionate, while YT46b (2) is derived from isobutyrate. Alkylacyl-ZhuG supplied by the loading module is able to prime the act minimal PKS efficiently. Incorporation of the alkylacyl moiety by the KS-CLF led to a decrease in the number of extender units incorporated in the final chain. The octaketide synthase is now only able to synthesize an alkyl hexaketide. The KR is able to regioselectively reduce the alkyl-hexaketide at the expected C-9 position. The reduced hexaketide spontaneously form the novel bicyclic structure observed in 1 and 2. Dehydrated versions of 1 and 2 are also observed (outside of limits shown in [A]).\n", - "222 \n", - " Engineered Biosynthesis of TMAC (7), YT128 (3), and YT128b (4)(A) ZhuI and ZhuJ are CYCs specific for unreduced octaketides. CH999/pYT105, which coexpressed ZhuI and ZhuJ from the R1128 PKS with the act minimal PKS, produced the anthraquinone compound TMAC (7). ZhuI and ZhuJ are thus able to cyclize unreduced octaketides. Previously characterized octaketide CYCs act ARO/CYC and act CYC are specific for reduced octaketides only. ZhuI and ZhuJ are used for reconstituting R1128 biosynthesis.(B) Reconstitution of R1128 biosynthesis using the heterologous combination of tcm minimal PKS, R1128 loading module, and CYCs ZhuI and ZhuJ. The alkylacyl-ZhuG intermediate synthesized by the loading module is able to prime the decaketide synthase from tcm minimal PKS. Owing to backbone size restrictions, the tcm KS-CLF primed with the alkylacyl groups are only able to extend the polyketide by seven additional malonyl units, resulting in an alkyl-octaketide. ZhuI and ZhuJ are able to transform the unreduced octaketide into YT128 (3) and YT128b (4). The decarboxylated versions of 3 and 4, which are R1128b (5) and R1128c (6), respectively, are also observed in the extracts of CH999/pYT128.\n", - "224 \n", - " Inhibition of Glucose-6-Phosphate Translocase Activity by Anthraquinones(A) The chemical structure of mumbaistatin. Mumbaistatin is an extremely potent inhibitor of glucose-6-phosphate translocase (IC50 = 5 nM). The core of the molecule is a reduced carboxylic acid containing anthraquinone, which is also observed in compounds such as DMAC, YT127, and YT127b.(B) Inhibition of glucose-6-phosphate translocase activity by novel anthraquinones. The inhibition assay is performed as described in the experimental section. The control contains the rat liver microsome and glucose-6-phosphate only. Chlorogenic acid (IC50 = 0.26 mM) was used as a reference. The G6Pase activity of the microsome in the presence of six anthraquinones (DMAC, 3, 4, 7, 8, and 9) was measured. For each compound, three different concentrations (50, 25, and 12.5 mM) were used to detect dose-dependent inhibition. No inhibition was observed for DMAC or 7. Dose-dependent inhibition was observed for compounds 3,\n", - " 4, 8, and 9.\n", - "225 \n", - " The Chemistry of Polyketide Chain Assembly(A) Acetic acid and malonic acid are converted to their coenzyme A (CoA) esters and then attached, by specific acyl transferases, to components of the polyketide synthase (PKS): acetyl-CoA is attached to the active site of the ketosynthase, and malonyl-CoA to a structural component of the PKS called the acyl carrier protein (ACP). Condensation of the two units by the ketosynthase, with loss of one carbon from malonyl-CoA as carbon dioxide, produces a four-carbon chain attached to the ACP. This is transferred back to the ketosynthase, and further rounds of condensation with malonyl-CoA (as shown) or other chain extender units produce a polyketide chain.(B) The three-step reductive cycle that converts a keto group to a hydroxyl, then to a double bond, and finally to a fully saturated carbon.(C) A complex polyketide in which keto groups, hydroxyl groups, double bonds, and fully saturated carbons occur at different positions along the chain, depending on the operation of the reductive cycle after each condensation.\n", - "226 \n", - " RI-TATp53C′ Induces the Hallmarks of p53 Activity in TA3/St Mammary Carcinoma Cells(A) Sequence of p53C′TAT peptide (L-amino acids) and its retro-inverso analogue (D-amino acids). To generate a negative control peptide, three essential lysine residues (Selivanova et al. 1997) were mutated while leaving the remaining peptide sequence intact.(B) Induction of G1 arrest in TA3/St cells by wild-type RI-TATp53C′, but not mutant peptide, 24 h after peptide addition.(C) Dose-dependent induction of G1 arrest by RI-TATp53C′ (open square) (D-amino acids) and the less potent p53C′TAT (open circle) (L-amino acids) but not mutant (open triangle) peptide at 24 h (left) and 48 h (right) after single treatment.(D) Induction of a permanent growth arrest in TA3/St cells by RI-TATp53C′. Cells were treated with RI-TATp53C′ peptide or vehicle for 2 d, replated, and allowed to proliferate in the presence of serum for 10 d. Colonies were then stained with methylene blue.(E) Induction of a senescence-like phenotype in TA3/St cells by RI-TATp53C′. Cells were treated with RI-TATp53C′ peptide and stained for acidic β-galactosidase activity.\n", - "228 \n", - " Solid Tumor Growth Is Inhibited by Systemic RI-TATp53C′ Peptide Administration(A) Delivery of RI-TATp53C′-biotin to subcutaneous TA3/St tumors after IP administration to immune competent A/J mice.(B) Reduction of solid TA3/St tumor growth in immune competent mice as a result of systemic administration of RI-TATp53C′. TA3/St cells were injected subcutaneously into A/J mice and allowed to grow to an average size of approximately 100 mm3. Mice were then sorted into treatment groups that received eight daily injections of vehicle (open circle) (n = 17), 650 μg of mutant peptide (open diamond) (n = 7), or 650 μg of wild-type RI-TATp53C′ peptide (open triangle) (n = 11). Final mean tumor volumes were 573 mm3 for vehicle-treated mice, 550 mm3 for mice treated with mutant peptide, and 268 mm3 for the wild-type RI-TATp53C′ peptide group.\n", - "229 \n", - " RI-TATp53C′ Treatment Extends Survival of Mice Harboring Terminal Peritoneal Carcinomatosis(A) A 6-fold increase in survival of A/J immune-competent mice harboring lethal TA3/St mammary peritoneal carcinomatosis burden after RI-TATp53C′ peptide treatment. A/J mice were given IP injections of TA3/St cells, and cells were allowed to double in number (approximately 24 h). Peritoneal tumor-bearing mice were then treated once a day for 12 consecutive days with vehicle (n = 15), 600 μg of wild-type RI-TATp53C′ (n = 10), or 600 μg of mutant peptide (n = 10). Mean survival duration was 11 d for vehicle-treated mice, 10 d for mice receiving mutant peptide, and greater than 70 d for the group receiving wild-type RI-TATp53C′ peptide.(B) Reduction of tumor cell number in vivo by RI-TATp53C′ treatment. Mice were injected with TA3/St tumor cells and treated with wild-type peptide as in (A). Three days after tumor cell injection, cells were flushed from the peritoneal cavity and serially diluted in 6-well plates. Growth of colonies was then assessed by methylene blue staining and used to measure the number of viable tumor cells present in the peritoneum after treatment with vehicle or wild-type peptide.\n", - "230 \n", - " RI-TATp53C′ Treatment Leads to 50% Long-Term Survival of Mice Bearing Terminal Peritoneal Lymphoma(A) Treatment of human Namalwa B-cell lymphoma cells with RI-TATp53C′ peptide induces apoptosis. Cells were treated with wild-type or mutant peptide, and DNA content was analyzed by flow cytometry 24 h after peptide addition.(B) Long-term survival of SCID mice harboring lethal peritoneal Namalwa lymphoma tumor burden after RI-TATp53C′ peptide treatment. Namalwa lymphoma cells were IP injected into SCID mice and allowed to proliferate for 48 h. Mice were then injected 16 times over 20 d with vehicle control (n = 16), 900 μg of wild-type RI-TATp53C′ peptide (n = 12), or 900 μg of mutant peptide (n = 6). Mean survival duration was 35 d for vehicle-treated mice and 33 d for mice receiving mutant peptide, whereas 50% of mice treated with wild-type RI-TATp53C′ peptide remained healthy at 150 d after tumor cell injection.\n", - "231 \n", - " Tumor-Reconstituted Cells from Treated Mice Remain Sensitive to RI-TATp53C′ Peptide-Induced G1 Arrest or Apoptosis in Culture(A) TA3/St cells were recovered from an A/J mouse treated with RI-TATp53C′ peptide and grown in DMEM/10% FBS. Recovered cells were treated with increasing concentrations of RI-TATp53C′ peptide and then analyzed for DNA content by flow cytometry 24 h later.(B) Namalwa cells were recovered from a SCID mouse treated with RI-TATp53C′ peptide and grown in RPMI plus 10% FBS. Recovered cells were treated with increasing concentrations of RI-TATp53C′ peptide. After 2 d, the number of viable cells was assessed by Trypan blue exclusion and normalized to the number of viable untreated cells. Mean and standard deviation of multiple experiments are depicted.\n", - "232 \n", - " Initiating Genetic Aberrations in Tumourigenesis(A) According to the two-hit model, the first hit at the rate-limiting tumour suppressor gene provides no selective advantage for the cell. Only after the loss of the second allele of this gene is tumour formation initiated. Extra genetic changes are needed for complete transformation of the cell.(B) In a haploinsufficient mechanism, the first hit on the rate-limiting tumour suppressor gene already provides the cell with sufficient selective advantage to initiate tumour formation. Further events are necessary for complete transformation. These events might or might not include the loss of the wild-type allele of the rate-limiting tumour suppressor gene.\n", - "234 \n", - " Stimuli and Behavioral Task(A) An example natural image is shown at three coherence levels, corresponding to 100% (undegraded), 45% (degraded), and 0% (pure visual noise).(B) The sequence of trial events for the DMS task used in this study. After a fixation period, a sample stimulus (S) is briefly presented, followed by a delay period and the presentation of a probe stimulus (P). While sample stimuli were presented at different coherence levels, probe stimuli were always presented in undegraded form (100% coherence). The monkeys were required to release a lever if the probe matched the sample.\n", - "235 \n", - " Learning Improved Monkeys' Ability to Identify Degraded Stimuli(A) Behavioral performance for the sessions during which neural data was collected (n = 11) is shown as a function of the coherence of the sample stimulus for novel and familiar stimuli. Asterisks denote significant differences in performance for novel and familiar stimuli.(B) The performance at 45% coherence (%Correct45) is shown for a set of novel stimuli that is introduced in the first session and then used during all subsequent sessions and thus becomes more and more familiar during subsequent sessions (circles). For comparison, performance with novel stimuli that are new and unique to each session is shown (diamonds). Sessions 1–20 represent purely behavioral training sessions (TRAIN), and sessions 21–26 represent combined behavioral and single unit recording sessions (REC).\n", - "236 \n", - " Learning Led to an Increase in V4 Neural Information about Degraded but Not Undegraded StimuliHere we summarize how much information V4 neurons communicated about novel (Inov) and familiar (Ifam) stimuli for undegraded (A) and degraded (B) stimuli. Each symbol in the scatter plot represents a single neuron and shows how much information this neuron communicated about familiar (x-axis) and novel (y-axis) stimuli. In each scatter plot, white-shaded symbols represent the 25% most informative neurons, i.e., the one-quarter of the population communicating most information about either familiar or novel stimuli. The remaining three-quarters of the population are shown in gray shading. The single neuron example in Figure 5 is represented by the star. The black ‘x' represents the population mean for the 25% most informative neurons.\n", - "237 \n", - " Many Neurons Communicated More Information about Degraded than Undegraded Familiar StimuliHere we replot the data from Figure 3 to illustrate how much information V4 neurons communicated about degraded (Idegrad) and undegraded (I100) stimuli separately for novel (A) and familiar (B) stimuli. Each symbol in the scatter plot represents a single neuron. The insets show how degradation affected the information communicated by V4 neurons, by plotting histograms of the ΔI distributions (I100 − Idegrad) for novel and familiar stimuli. While 25 neurons (30% of the population) communicated more information about degraded than undegraded familiar stimuli, only six neurons (7% of the population) did so for novel stimuli.\n", - "238 \n", - " Learning-Dependent Enhancement for Degraded Stimuli—Single Neuron Example(A and B) The activity for an example neuron for its preferred (A) and nonpreferred (B) familiar stimulus is shown in peri-stimulus-time-histogram (PSTH) and raster format.(C) The average firing rate during stimulus presentation as a function of coherence is summarized for this neuron for its preferred (+) and nonpreferred (−) familiar (fam) and novel (nov) stimuli.\n", - "241 \n", - " MuI between Neuronal Activity and Direction of MovementThe example shows a simulation of the activity of one cell during 64 movements to evenly spaced eight directions, presented in a random order (eight trials per direction). Each dot in the raster plots a and b describes the spike count of the cell in a specific trial. Without prior knowledge about the direction of movement (A), a large uncertainty exists about the responses of the neuron. However, ordering the trials according to the movement direction (B) reveals a large reduction in the uncertainty about the cell responses. The probability p(r,d) of observing a trial with direction d and spike count r is shown in (C); along with a specific conditional distribution p(r|d\n", - "0 = 90)\n", - ".\n", - "The entropy \n", - "\n", - "is a measure of the uncertainty about movement direction: H(D) = log(8) = 3 bits, in the case that all eight directions have equal probability to occur. The conditional entropy is defined as \n", - "\n", - "and describes the mean uncertainty about direction given the cell response. The MuI I(R;D) = H(D) − H(D|R)\n", - "measures the reduction in uncertainty about movement direction given the response of the cell. The MuI is symmetric, in the sense that it also measures the reduction in uncertainty about cell response given the direction of movement I(R;D) = H(D) − H(D|R)\n", - ". This relation is graphically depicted in (D).\n", - "\n", - "242 \n", - " Behavioral Paradigm and Movement Kinematics(A) Session flow (left to right). Every session (day) consisted of pre-learning, learning, post-learning, and relearning epochs. Pre- and post-learning epochs were standard eight-target tasks with a default (one-to-one) mapping between cursor movement and the movement of the hand. In the learning epoch, only one target (upwards) appeared, and a visuomotor rotational transformation was imposed on the relationship between movement of the hand and cursor movement. The example shown is for a transform of −90° (seeMaterials and Methods for a full description).(B–D) Similar kinematics pre- and post-learning. (B) Example of 1-day trajectories from the two epochs; the transform in this session was of –45°. (C) Velocity profiles. Peak velocity was slightly lower in the post-learning epoch (t-test, p = 0.05), but no difference was found between the learned direction and other directions (t-test, p = 0.3). (D) Improvement in directional deviation was calculated as the deviation of the instantaneous hand direction from the required target direction, calculated every 10 ms starting from the go-signal. All four movement types (learned and nonlearned, pre- and post-learning) exhibited the same temporal pattern. Here and for analysis of neuronal activity, we excluded the first trials in the post-learning epoch—those exhibiting significant aftereffects due to learning.\n", - "243 \n", - " Comparing MuI of Single Cells Pre- and Post-Learning(A) Distributions of single-cell information about direction of movement pre-learning (dashed) and post-learning (solid). No significant difference was found between the distributions (Kolmogorov–Smirnoff, p = 0.3). The inset shows the MuI per spike, calculated by dividing the information per cell by the cell's firing rate (Kolmogorov–Smirnoff, p = 0.25).(B) Improvement in information of individual cells. Histogram of p-values for all cells; a significant (p < 0.01, χ2) number of cells (n = 37) had a p-value greater than 0.95, representing cells that significantly increase their information content about direction after learning; 18 cells had a p-value lower than 0.05, representing cells that decreased their information content, but this was found to be only marginally significant (p = 0.06, χ2).(C) Histograms of difference in information, post- minus pre-learning, for all cells (upper) and only for cells that increase (p > 0.95) or decrease (p < 0.05) their information content significantly (lower).(D) Circular histogram for PD of cells that significantly increased their information. The cells' PDs were normalized to the learned direction in each cell recording session, revealing a unimodal distribution (Rayleigh test, p < 0.05). The upper inset shows the circular histogram for all cells and lower inset shows the circular histogram for cells that decreased their information; in both cases, the distributions seem homogenous (Rayleigh test, p > 0.1).\n", - "245 \n", - " Comparing Individual DI(A) Mean (with 95% confidence intervals, by fitting a Gaussian distribution) of post-learning information minus pre-learning information for one direction. Abscissa represents the distance from the learned-movement direction; all directions were normalized according to the learned direction in the cell's session. An increase is evident only for the learned-movement direction, with mean at 0.1 and 95% confidence intervals at 0.036 and 0.164.(B) Circular histogram of PDs for cells with a positive difference of post-learning minus pre-learning information about the learned direction (Rayleigh test, p = 0.01).\n", - "246 \n", - " Learning-Induced Elevation of Information and Activity(A and B) Histograms of changes in firing rate in the PD (post-learning minus pre-learning) for all the cells (A) and for cells that significantly increased their information (B). The horizontal line below the histogram represents its mean and the 95% confidence intervals, by fitting a Gaussian distribution.(C) Average tuning curves (baseline subtracted, ± SEM) of cells that significantly increased their information (n = 37). Comparing pre-learning (gray) and post-learning (black). Cell tuning curves were first aligned to each cell's PD.\n", - "249 \n", - " Increased Information after Learning Is Correlated with Elevation of Firing Rate in the Learned DirectionPossible mechanisms for increased slope of the tuning curve in the learned direction.(A and D) Shift of PD, i.e., shifting the whole tuning curve, may position the learned direction at a higher slope location.(B and E) Narrowing of the tuning curve, as measured by the width at half-height.(C and F) Local changes (Increase) in activity in the learned direction can increase the slope. This is similar to the observed learning-induced changes in our data (see Figure 6C). In (A)–(C), an illustration of the measured difference is indicated.(D1–D3, E1–E3, and F1–F3) Same format as in Figure 4 for the three possible mechanisms.The histogram in (F2) is shifted to the right, indicating that cells that increased their information content also elevated their firing rate in the learned direction. In these cells only a significant (p < 0.001) correlation coefficient (c = 0.566) was found (F3, asterisks and line).\n", - "250 \n", - " Improved Decoding of Movement Direction Only for the Learned Direction(A and B) Using PV. (A) PV errors given as the distance in degrees between the predicted and the actual direction for the four learned-movement directions (± SEM, bootstrap test). (B) Signal-to-noise ratio (mean/SD) of PV improvement (pre-learning deviation minus post-learning deviation) for all directions (four learned directions are pooled together and all other directions are normalized to them). A significant improvement was observed only for the learned direction (p < 0.005, Bonferoni correction for multiple tests, i.e., the eight directions).(C and D) Using a MAP estimator, we predicted 100 times the actual hand direction using neuronal activity. Shown is the fraction of correct predictions for pre-learning (C) and post-learning (D). A significant increase was observed only for the learned direction (p < 0.005, Bonferoni correction for multiple tests, i.e., the eight directions). The dashed line is the chance level (0.125).\n", - "255 \n", - " The Chemotaxis Pathways in E. coli and B. subtilis\n", - "(A) E. coli. (B) B. subtilis. Both organisms respond to extracellular signals by regulating the activity of the CheA histidine kinase. CheA is coupled to transmembrane receptors (MCP) by an adaptor protein CheW. Chemoattractants, by binding the receptor, inhibit CheA in E. coli (red line) (Borkovich et al. 1989) and stimulate CheA in B. subtilis (green line) (Garrity and Ordal 1997). CheA phosphorylates CheY. Phosphorylated CheY binds to the flagellar motor and increases the frequency of tumbles in E. coli (Cluzel et al. 2000) and runs in B. subtilis (Bischoff et al. 1993). Phosphorylated CheY is also predicted to inhibit the receptor complex in B. subtilis (dashed line). Both organisms tune the sensitivity of CheA to ligands by reversibly methylating the receptors using the CheR methytransferase and CheB methylesterase (Zimmer et al. 2000; Sourjik and Berg 2002b). Phosphorylation of CheB by CheA increases its methylesterase activity nearly 100-fold (Anand and Stock 2002). CheA activity is proportional to the degree of receptor methylation in E. coli. In B. subtilis, CheA activity depends on which residue is methylated, akin to a binary switch. E. coli possesses a phosphatase, CheZ, not present in B. subtilis, that enhances the rate of CheY dephosphorylation. B. subtilis possesses three chemotaxis proteins not found in E. coli: CheC, CheD, and CheV. CheC is a negative regulator of receptor methylation and homologous to the CheY-binding domain (P2) in CheA (Rosario et al. 1995; Rosario and Ordal 1996). CheD is a positive regulator of receptor methylation and also deamidates specific residues on the receptor (Kristich and Ordal 2002). CheV is a CheW-response regulator fusion. CheV is functionally redundant to CheW and is predicted to negatively regulate receptor activity (dashed line) (Rosario et al. 1994; Karatan et al. 2001).\n", - "258 \n", - " Simulation of Adaptation in E. coli and B. subtilis\n", - "Attractant (10 μM) is added at 500 s and removed at 1,000 s.(A) Timecourse simulation of phosphorylated CheY (left) and receptor methylation (right) in E. coli.(B) Timecourse simulation of phosphorylated CheY (left) and receptor methylation (right) in B. subtilis. In both species, adaptation correlates with changes in receptor methylation.\n", - "259 \n", - " Graphical Illustration of Mechanism for Robust Adaptation(A) Qualitative relationship among receptor activity, methylation, and demethylation in E. coli. The rate of demethylation is proportional to the number of active receptors, and the rate of methylation is inversely proportional to the number of active receptors. The system reaches steady state only when the two solid lines cross. As the rate of methylation decreases monotonically with receptor activity and the rate of demethylation increases monotonically with receptor activity, only one steady state is possible (A*) if the rates depend solely on receptor activity. The kinetic parameters change the slope of the curves, but not their monotonicity. Hence, adaptation is robust with respect to changes in the kinetic parameters. However, the point where they intersect does change with the parameters.(B) Qualitative relationship between receptor activity and the differential rate of methylation in B. subtilis. The net rate of methylation at residue 630 decreases monotonically with receptor activity, and the net rate of methylation at residue 637 increases monotonically with receptor activity. By the same arguments, only one steady state (A*) is possible and, hence, adaptation is robust in B. subtilis.\n", - "260 \n", - " Sensitivity to Parameters in E. coli and B. subtilis\n", - "(A) E. coli. (B) B. subtilis. The top figures are plots of the steady-state concentration of phosphorylated CheY as a function of CheB and CheR concentrations. The bottom figures are plots of the adaptation time as a function of CheB and CheR concentrations. Adaptation time is defined as the length of time from the peak concentration in phosphorylated CheY (Yp) to within 5% of the steady-state concentration after the addition of attractant (10 μM). For all the concentrations considered, both models precisely adapt.\n", - "261 \n", - " Oscillations and Methylation-Independent Chemotaxis(A) Timecourse simulation of cheBCDR strain in B. subtilis subject to the addition of attractants (100 μM) at 200 s and the removal at 500 s. Concentration of CheV was set at 8 nM.(B) Timecourse simulation of the cheBCDR strain in B. subtilis subject to the addition of attractants (100 μM) at 200 s and the removal at 500 s, where the concentration of CheV is halved (4 nM).\n", - "265 \n", - " Funding Healthcare R&D(A) A schematic of the way the public currently funds healthcare R&D. Academic research funded by government research agencies is paid for via taxes. This is a mixture of pure research into fundamentals and directed research, including clinical trials. Despite this, there is a dogma that academic R&D cannot produce drugs since it does not have the required commercial pressures to turn ideas into products. Patents ensure the public pays for commercial R&D via their purchase of medicines at high prices, compared to those of generic copies. The distortion of research priorities (too much spent on ‘me too’ drugs and too little on neglected diseases) has been recognised by governments for some time, and a variety of push-and-pull mechanisms have been introduced (or are being considered) to encourage research that more closely reflects public priorities. Examples of push incentives are tax breaks for R&D and other incentives such as special marketing monopolies for products as a reward for investing in research on orphan drugs or testing with pediatric patients. Pull incentives currently being discussed are advance-purchase commitments, with which governments guarantee to buy a certain amount of a drug if one is developed, or prize models. Some of these schemes are thought to be inefficient, particularly those that are indiscriminate and provide expensive subsidies relative to the amount of new R&D they ‘encourage’.(B) A schematic of the way funding of healthcare R&D could work if separate competitive markets for sales and R&D were created. A crucial difference is the absence of monopolies on final products, enabling competition between generic producers and greatly reduced prices. Incentives to develop new drugs would be provided by a new virtual market in R&D. ‘Nationally directed R&D funds’ could represent anything from rewards for innovation using market based mechanisms such as prize models (see text) to centralised funding agencies, similar to the NIH model, or multiple R&D investment funding bodies that compete for new resources. Contributions to R&D could be via taxation or as a legal obligation when paying for private healthcare plans (see text). The ability to design what would be rewarded in the virtual market would allow governments to set R&D priorities and build up local capacity within their own countries. Countries could choose weaker patent protection and create an environment in which all research groups could build on each other's work.\n", - "271 \n", - " Forest Regeneration(A) Dense understory regeneration three years after a low-intensity fire.(B) The almost total loss of live, above-ground biomass six months after a forest burnt for the third time in 15 years.(Photographs by Jos Barlow; used by permission.)\n", - "279 \n", - " A 2′-O-Methyl RNA Oligonucleotide Inhibits RNAi In Vitro in Drosophila Embryo Lysate(A) Sequences of the sense and antisense Pp-luc target RNAs (black), the siRNA (red, antisense strand; black, sense strand), and the sense and antisense 2′-O-methyl oligonucleotides (blue) used.(B) Sequence-specific depletion of RNAi activity by immobilized 2′-O-methyl oligonucleotides from Drosophila embryo lysate programmed with siRNA. siRNA was incubated with lysate to assemble RISC; then, immobilized 2′-O-methyl oligonucleotide was added. Finally, the beads were removed from the supernatant, and either sense or antisense 32P-radiolabeled target RNA was added to the supernatant to measure RISC activity for each siRNA strand.Symbols and abbreviations: Ø, target RNA before incubation with siRNA-programmed lysate; T, total reaction before depletion; unbound, the supernatant after incubation with the immobilized antisense (AS) or sense (S) 2′-O-methyl oligonucleotides shown in (A). The absence of 5′ cleavage product demonstrates that the sense oligonucleotide depleted RISC containing antisense siRNA, but not sense siRNA, and the antisense oligonucleotide depleted the sense RISC, but not that containing antisense siRNA. Bi, 5′ biotin attached via a six-carbon linker.\n", - "280 \n", - " 2′-O-Methyl Oligonucleotides Act as Stoichiometric, Irreversible Inhibitors of RISC Function(A) The immobilized sense 2′-O-methyl oligonucleotide was used to determine the concentration of 32P-radiolabeled antisense siRNA assembled into RISC in Drosophila embryo. The 2′-O-methyl oligonucleotide and siRNA duplex are shown in Figure 1A.(B–G) Inhibition of RNAi was measured using free 2′-O-methyl oligonucleotide and 1.3 nM (B), 4.6 nM (C), 9.3 nM (D), 14.5 nM (E), 18 nM (F), and 23.5 nM (G) RISC. The concentration of 2′-O-methyl oligonucleotide required for half-maximal inhibition (IC50) was calculated by fitting each dataset to a sigmoidal curve using a Hill coefficient of 1.(H) A plot of IC50 versus RISC concentration suggests that each 2′-O-methyl oligonucleotide binds a single RISC. The data suggest that binding is essentially irreversible.\n", - "281 \n", - " RISC Does Not Act through an Antisense Mechanism(A) Inhibition of sense target cleavage by an antisense 2′-O-methyl oligonucleotide requires an approximately 40-fold higher concentration than by a sense oligonucleotide. The antisense oligonucleotide can pair completely with the sense target RNA, but not with the antisense siRNA-programmed RISC. The IC50 value and the RISC concentration are indicated. Also shown are the sequences of the sense Pp-luc RNA target (black), the siRNA (red, antisense strand; black, sense strand), and the 2′-O-methyl oligonucleotide (blue).(B) The same antisense 2′-O-methyl oligonucleotide is an effective competitor of antisense target cleavage. In this experiment, inhibition occurs via binding of the antisense oligonucleotide to the sense siRNA-programmed RISC, not the target RNA. The IC50 value and the RISC concentration are indicated. Also shown are the sequences of the Pp-luc antisense RNA target (black), the siRNA (red, antisense strand; black, sense strand), and the 2′-O-methyl oligonucleotide (blue). The G:U wobble in the siRNA duplex in (B) acts to direct the sense strand into RISC and improving its efficacy in target cleavage.\n", - "282 \n", - " A 2′-O-Methyl Oligonucleotide Is a Potent Inhibitor of RNAi in Human Cultured HeLa Cells(A–D) HeLa cells were transfected with 1 nM (A), 5 nM (B), 10 nM (C), or 25 nM (D) siRNA-targeting Pp-luc mRNA. The next day the cells were cotransfected with Rr-luc-and Pp-luc-expressing plasmids together with various amounts of a 31-nt 2′-O-methyl oligonucleotide complementary to the antisense strand of the siRNA. The half-maximal concentration of 2′-O-methyl oligonucleotide required to inhibit (IC50) was determined by fitting the data to a sigmoidal curve using a Hill coefficient of 1.(E) IC50 plotted as a function of the concentration of transfected siRNA.\n", - "283 \n", - " A Complementary 2′-O-Methyl Oligonucleotide Blocks Endogenous let-7-Containing RISC Function(A) Sequence of the let-7-complementary site in the target RNA (black), of the siRNA (red, antisense strand; black, sense strand), and of the let-7-complementary 2′-O-methyl oligonucleotide (blue).(B) Schematic representation of the target RNA, which contained both Pp-luc and antisense let-7 sequences.(C) Drosophila embryo lysate (left) was programmed with let-7 siRNA; then, the target RNA and the 2′-O-methyl oligonucleotide were added together. Target RNA and 2′-O-methyl oligonucleotide (right) were added to HeLa S100 extract, which contains endogenous human let-7-programmed RISC.(D) An RNA target containing both Pp-luc and antisense let-7 sequence can be simultaneously targeted by Pp-luc siRNA and endogenous let-7 in HeLa S100 lysate. The let-7-complementary 2′-O-methyl oligonucleotide blocks let-7-programmed, but not Pp-luc siRNA-programmed, RISC function. The bottom panel shows the same samples analyzed separately to better resolve the let-7 5′ cleavage product.(E) Drosophila embryo lysate was programmed with let-7 siRNA and then incubated with biotinylated 2′-O-methyl oligonucleotide tethered to paramagnetic streptavidin beads. The beads were removed and the supernatant tested for RNAi activity.Symbols and abbreviations: Ø, target RNA before incubation with siRNA-programmed lysate; T, total reaction before depletion; unbound, the supernatant after incubation with the paramagnetic beads. “Mock” indicates that no oligonucleotide was used on the beads; “let-7” indicates that the beads contained the let-7-complementary oligonucleotide shown in (A).\n", - "284 \n", - " Injection of a 2′-O-Methyl Oligonucleotide Complementary to let-7 miRNA Can Phenocopy the Loss of let-7 Function in C. elegans\n", - "(A) Wild-type and lin-41(ma104) L2-stage C. elegans larvae were injected with either a 2′-O-methyl oligonucleotide complementary to let-7 miRNA (Figure 5A) or an unrelated Pp-luc 2′-O-methyl oligonucleotide. Absence of alae and presence of bursting vulvae were scored when the injected animals reached adulthood.(B) Isolation of let-7-associated proteins with a tethered 2′-O-methyl oligonucleotide. Northern blot analysis of let-7 miRNA remaining in the supernatant of the worm lysate after incubation with the let-7-complementary (let-7) or Pp-luc (unrelated) oligonucleotide. Input represents the equivalent of 50% of the total extract incubated with tethered oligonucleotide.(C) Western blot analysis of the GFP-tagged ALG-1 and ALG-2 proteins associated with let-7. The upper band corresponds to GFP-tagged ALG-1 and the lower to GFP-tagged ALG-2. Extracts from a transgenic strain expressing the tagged proteins was incubated with the indicated tethered 2′-O-methyl oligonucleotide; then, the beads were washed and bound proteins were fractionated on an 8% SDS-polyacrylamide gel. Western blots were probed using anti-GFP monoclonal or anti-RDE-4 polyclonal antibody. The RDE-4-specific band is marked with an asterisk (Tabara et al. 2002).(D and E) Analysis of let-7 miRNA in ALG-1/ALG-2 complexes (D). Extracts prepared from mixed-stage wild-type worms (N2) or from GFP::ALG-1/ALG-2 transgenic worms were immunoprecipitated using anti-GFP monoclonal antibodies. The unbound and immunoprecipitated RNAs were analyzed by Northern blot hybridization for let-7 (D), and 5% of the immunoprecipitated protein was analyzed by Western blotting for GFP to confirm recovery of the GFP-tagged ALG-1/ALG-2 proteins (E).\n", - "285 \n", - " Genetic Requirements for miRNA and Endogenous siRNA Generation(A) miRNA genes and selected loci corresponding to three siRNAs or siRNA populations. Cloned small RNA sequenc-es are shown as green (sense orientation relative to the genome) or red (antisense orientation) bars. Protein-coding and miRNA genes are indicated by blue arrowheads. From top to bottom: miR-171 and miR-159a loci; siRNA02 loci, with each siRNA02 sequence indicated by an asterisk and the inverted duplication shown by the gray arrows; cluster2 siRNA locus; a segment of chromosome III showing 10 5S rDNA repeats (blue indicates 5S rRNA, gray indicates spacer) containing the siRNA1003 sequence.(B) Small RNA blot assays for miR-171, miR-159, and endogenous siRNAs. Ethid-ium bromide-stained gels (prior to transfer) in the zone corresponding to tRNA and 5S RNA are shown at the bottom. Each mutant is presented in a panel with the corresponding wild-type control (Col-0 or La-er).\n", - "286 \n", - " Endogenous siRNAs in Arabidopsis\n", - "(A) Size distribution of endogenous siRNAs.(B) Distribution of distinct siRNAs in different sequence categories.(C) Density of siRNAs from highly repeated (mainly transposons and retroelements; the asterisk shows repeat sequences identified using RepeatMasker), 5S rDNA, and unique genomic sequence.\n", - "287 \n", - " Effects of Mutations on AtSN1 and 5S rDNA Chromatin Structure and Gene Expression(A) Analysis of CpG (left), CpNpG (center), and CpHpH (right) methylation in AtSN1 by bisulfite sequencing of genomic DNA.(B) Blot analysis of 5S rDNA digested with methylation-sensitive restriction enzymes HpaII (left) and MspI (right). HpaII is sensitive to CpG and CpNpG methylation, whereas MspI is sensitive to only CpNpG methylation. Methylation is indicated by the ascending ladder, which corresponds to 5S rDNA multimers (monomer = approximately 0.5 kb). Duplicate samples from each plant were analyzed.(C) ChIP assays using antibodies against dimethyl-histone H3K9 and dimethyl-histone H3K4. Genomic DNA associated with immunoprecipitated chromatin was analyzed by semiquantitative PCR with primer pairs specific for AtSN1, retrotransposon reverse transcriptase (At4g03800) (internal control for H3K9 methylation), and PFK (At4g04040) (internal control for H3K4 methylation). The PCR products were quantitated and compared against the respective internal controls, and the relative H3K4 and H3K9 methylation levels were expressed relative to that in Col-0 (arbitrarily set to 1.00).(D) Detection of AtSN1-specific transcripts by semiquantitative RT-PCR. Primers specific for PFK transcripts were used as the internal control. A parallel set of reactions without addition of reverse transcriptase (RT) was run as a quality control for genomic DNA contamination. The PCR products were normalized relative to PFK, and the expression levels were calculated relative to that in Col-0 (arbitrarily set to 1.00).\n", - "289 \n", - " Genetic Requirements for DCLs in Viral siRNA GenerationBlot analysis of viral siRNA. Systemic tissue samples were analyzed at the indicated time points from parental and mutant lines that were infected with TuMV–GFP (A), CMV-Y (B), and TCV (C). RNA blots were analyzed using virus-specific probes to detect siRNAs. Ethidium bromide-stained gels in the zone corresponding to tRNA and 5S RNA are shown. Relative accumulation (RA) of siRNAs is indicated at the bottom of each panel, with the level measured in infected control plants (Col-0 or La-er, depending on the mutant) at 7 dpi arbitrarily set to 1.0.\n", - "290 \n", - " Altered Susceptibility to TCV Infection in dcl2-1 Mutant Plants(A) Noninfected control (left) and TCV-infected (right) Col-0, dcl2-1, and dcl3-1 plants at 14 dpi.(B) TCV accumulation, as measured by ELISA, in the systemic tissues of infected wild-type and mutant plants at 7 dpi (open bars) and 14 dpi (filled bars).(C) Plant height (left), number of flowers/plant (center), and fresh weight of bolt tissue (right) were measured at 14 dpi in noninfected (open bars) and infected (filled bars) plants (n = 9).\n", - "292 \n", - " Armored Scale Insects(A) Lepidosaphes gloverii, adult females.(B) Parlatoria oleae, adult females (circular, with dark spot) and immatures (oblong).(C) Quadraspidiotus juglansregiae, adult female with waxy scale cover removed.(Photographs by Raymond J. Gill, © 2003 California Department of Food and Agriculture, published here under the terms of the Creative Commons Attribution License.)\n", - "294 \n", - " Wild-Type DMT1-Expressing Cells Exhibit a Proton Current and a Proton-Dependent Mn2+-Induced Current(A) The G185R mutation is in the fourth of 12 putative TM domains in both mouse (shown) and rat DMT1 proteins.(B) 55Fe2+ uptake was greatly reduced for G185R in comparison to wild-type DMT1, although the protein expression levels were comparable (inset).(C–E) Representative currents induced by protons (pH 4.2) and Mn2+ (100 μM) at +50 mV (open triangles; some of the datapoints have been removed for clarity) and −130 mV (open circles) in a wild-type DMT1-transfected CHO-K1 cell. Whole-cell currents were elicited by repeated voltage ramps (−140 to +60 mV, 1,000 ms), shown in (E), with a 4 s interval between ramps. Holding potential (HP) was +20 mV. Neither control solution (10mM Ca2+/140 mM Na+/[pH7.4]) nor isotonic Ca2+ (105 mM) solution induced significant current. Representative I-V relations are shown in (E). Current responses from a vector (pTracer)-transfected cell are shown in (D).(F) pH-dependence of the Erev of the wild-type DMT1 current in the presence or absence of 300 μM [Mn2+]o. In the absence of Mn2+, the pH dependence of the Erev can be fitted by a line with a slope 58 mV/pH unit. In the presence of 300 μM Mn2+, the relationship was nonlinear, especially at higher pH. EH, H+ equilibrium potential. Note that the currents were not leak-subtracted.\n", - "296 \n", - " Ca2+ Permeability of IG185R\n", - "(A) Whole-cell I-V relations in the presence of [Ca2+]o are indicated.(B) Enlarged view of (A) to show the Erev measurement.(C) [Ca2+]o dependence of Erev. The slope was fit by linear regression to 25 mV per decade, close to the 29 mV per decade predicted for a Ca2+-selective electrode (dotted line).(D) Currents through G185R in various isotonic divalent solutions. I-Vs are shown in the inset. Note that currents induced by isotonic Mg2+ and Mn2+ were transient.(E) Relative permeability of various divalent and monovalent cations. The reversal potentials of IG185R in 10 mM test divalent cations were measured under bi-ionic conditions as described in Materials and Methods. The permeability was calculated using Equations 1 and 2.(F) [Ca2+]i changes estimated by Fura-2 fluorescence in response to an elevation of [Ca2+]o from 1 to 30 mM. The results were averaged from five (HEK-On) and seven (G185R) independent experiments (n = 3–13 cells each). To minimize potential endogenous depletion-activated and/or TRP-mediated Ca2+ influx, cells were bathed in the presence of 50 μM SKF96365 and 50 μM 2-APB. The F340/F380 ratio was recorded and converted into estimated [Ca2+]i based on an ionomycin-induced Ca2+ calibration.\n", - "297 \n", - " Voltage Dependence and Pharmacological Properties of IG185R\n", - "(A) Whole-cell currents recorded in 105 mM [Ca2+]o were dependent on holding potential before the voltage ramps (−140 to −120 mV shown). For clarity, only the first 20 ms of the 4 s-long holding potential is shown.(B) Voltage dependence of IG185R in control solution and 105 mM [Ca2+]o. IDMT1 (dotted line) exhibited no depen-dence on the holding potential. Abbreviations: V1/2 , half activation voltage. κ, slope factor.(C and D) Sensitivity of IG185R to various pharmacological agents and cation channel blockers. IG185R was relatively insensitive to RR, 2-APB, or SKF96365, but was blocked by 1mM La3+ or Cd2+ (D).\n", - "298 \n", - " DMT1-Like and G185R-Like Currents in Enterocytes Isolated from Wild-Type and mk/mk Mice, Respectively(A) Enterocyte currents isolated from an iron-deficient wild-type mouse (−Fe). Reducing bath pH (140 mM NaCl) induced a slowly desensitizing inward current that was further enhanced by addition of Mn2+.(B) Both proton and H+/Mn2+currents were inwardly rectifying.(C and D) An mk enterocyte expressed a large constitutive inward current in control bath solution. Reducing the bath pH (140 mM NaCl) first inhibited and then activated another inward current insensitive to the holding potential. This slowly-desensitizing current displayed a less steeply rectifying I-V as shown in (D).\n", - "300 \n", - " A Comparison of the Evolutionary Rates of Duplicate and Singleton GenesThe average rate of nonsynonymous evolution (K\n", - "A) for representative pairs of duplicate and singleton genes in the two study organisms S. cerevisiae (A) and C. elegans (B) is shown. Representative pairs of duplicate genes evolve significantly more slowly in both study organisms (Mann–Whitney U test, p < 0.001).\n", - "301 \n", - " A Comparison of the Rate of Structural Evolution for Duplicate and Singleton GenesFor each representative pair, the number of gaps per aligned nucleotide was calculated. For both S. cerevisiae (A) and C. elegans (B), representative pairs of duplicates have significantly fewer insertions per basepair than representative pairs for singletons (Mann–Whitney U test, p < 0.0001 for both).\n", - "302 \n", - " The Codon Bias and Rate of Evolution of Genes Leading to Duplicates over the Evolutionary History of S. cerevisiae and C. elegans\n", - "For both S. cerevisiae (A) and C. elegans (B), moving averages of nonsynonymous substitutions per site (K\n", - "A, in dark gray), codon bias in the study organism (measured with CAI, in black), and codon bias of the representative ortholog in D. melanogaster (CAI, in light gray) are plotted against the number of synonymous substitutions per site (K\n", - "S) between duplicate pairs. The bin size is 15, and standard error bars are shown. Dashed lines represent the average CAI of singleton genes and the average K\n", - "A of representative pairs of singleton genes.\n", - "308 \n", - " Schematic Model of Putative Contribution of Neandertal mtDNA to the Gene Pool of Modern Humans(A) Under the assumption of a constant effective population size of 10,000 for modern humans, contemporary mtDNAs trace back to approximately five mtDNA lineages 25,000 years ago. The modern human fossils represent five additional samples from around the time of putative admixture (stars). The contemporary and early modern human (EMH) samples reject a Neandertal contribution of 25% or more to modern humans about 30,000 years ago (p ≤ 0.05).(B) Under the more realistic scenario of an expansion of the human population during and after the colonization of Europe, a smaller Neandertal contribution can be excluded because the number of ancestors of the current human gene pool was larger 30,000 years ago. However, the contribution that can be excluded would depend on when and how the expansion occurred.(C) Under the scenario that population size was constant before a putative merging with the Neandertal population and expanded only thereafter, the Neandertal contribution could have been larger, but similarly depends on how the expansion occurred.\n", - "310 \n", - " Non-Taster or Supertaster?(A) Top surface of the tongue of a non-taster.(B) Tongue of a supertaster. The small circles are fungiform papillae, each of which contains about six taste buds.\n", - "311 \n", - " High-Throughput Deletion Array Screen for AHR Modifiers(A) The flow chart of the deletion array screen. Each individual deletion strain was transformed with the AHR–LexA chimera and LacZ reporter constructs using a 96-well microtiter plate transformation approach. The AHR-dependent reporter activity of each deletion strain was examined with a 384-well plate-based fluorescence assay method. A total of 92 deletion strains were identified that displayed AHR signaling significantly different from the wt control.(B) Identification of “AHR-specific” modifiers. The effect of modifier deletions on the AHR pathway was compared with their effect on a Gal4TAD control pathway. It was found that 54 deletions influenced AHR signaling specifically, whereas 38 deletions corresponded to general factors. See text for details.\n", - "313 \n", - " Functional Modules Identified by Network Clustering(A) Network clustering of AHR–PIN. Protein nodes in the AHR–PIN (Dmax = 2) were clustered by a hierarchical clustering algorithm. A tree-depth threshold was set to delimit cluster boundaries (Rives and Galitski 2003). Clusters with at least two M-nodes are shown. See text for details.(B) Overlay of the network clusters on the AHR–PIN. The ten network clusters correspond to ten local areas in the AHR–PIN. Each network cluster (local area) is labeled with its significant functional enrichment as calculated using the FunSpec program (Robinson et al. 2002).\n", - "Color scheme. Nodes: modifier deletions that incurred down- and up-regulation of AHR signaling are marked in green and red, respectively. For intervening nodes, essential genes are marked in gray and nonessential genes in white. Links: physical interactions are labeled in black and genetic interactions in red. If both interactions are available for a given link, only the physical interaction is shown. This color scheme is also applied to Figures 4–7.\n", - "314 \n", - " Functional Modules Identified by the “Domain Influence”(A) Identification of domain influencing groups. The effects of modifier deletions on the signaling of AHR and AHRΔPASB were compared in parallel. It was found that 28 modifiers were required for the function of the PASB domain (i.e., their deletions affected the AHR, but not the AHRΔPASB). The other 25 modifiers were found to be required for the shared TAD region (i.e., their deletions affected the signaling of both AHR and AHRΔPASB).(B) Overlay of the “domain influence” layer (blue boundary) and the network-clustering layer (shadowed) on the AHR–PIN. The PASB influence group corresponds to a central region in the AHR–PIN. The TAD influence group corresponds to two peripheral areas. Occasional outlier nodes are marked with their corresponding module names.\n", - "315 \n", - " Functional Modules Revealed by Effect on AHR Pharmacology(A) Cluster analysis of the effect of modifier deletion on AHR pharmacology. AHR signaling was examined at various doses, timepoints, and temperatures, and with the two AHR agonists βNF and αNF. The influence of modifier deletion on the dose-response of the AHR was analyzed by a hierarchical clustering algorithm. Rows in the clustering diagram represent modifier deletions. Columns correspond to experimental conditions. Green and red indicate down- and up-regulated AHR signaling, respectively. Color brightness is proportional to fold change. Black indicates wt signaling. Sparse gray boxes represent missing datapoints. (Insert) Diagram of corresponding dose-response curves of the wt strain and the average of cluster C.(B) Overlay of the “pharmacology clustering” layer (shadowed, black boundary) and “domain influence” layer (blue boundary) on the AHR–PIN. The major pharmacology clusters are coincident with five local areas in the AHR–PIN. In addition, clusters A, D, and E correspond to the PASB influence module, and clusters B and C correspond to the TAD influence module. Functional annotations determined by pharmacology clustering are indicated in black, and those derived from domain influencing are indicated in blue. Occasional outlier nodes are marked with their corresponding module designation. See the legend of Figure 3 for the color scheme of the nodes and links.\n", - "316 \n", - " Functional Modules Identified by the “Localization Influence”(A) The AHR–GFP fusion protein translocates to nucleus in the presence of agonist βNF. Nucleus position in the cell was confirmed by DAPI staining (data not shown). Dimethyl sulfoxide (DMSO) is a vehicle control for βNF.(B) Classification of modifier deletion strains according to AHR–GFP phenotype (with βNF). Group I displays wt phenotype. Group II contains decreased level of receptor protein. Group III contains aggregated misfolded receptor. Group IV displays the AHR that is not capable of translocating to the nucleus.(C) Overlay of “localization influence” layer (shadowed, red boundary) and the “pharmacology clustering” layer (black boundary) on the AHR–PIN. Group I corresponds to modules C and D. Groups II, III, and IV overlap with modules of B, A, and E, respectively. Functional annotations determined by localization influence are indicated in red, and those derived from pharmacology clustering and domain influencing studies are indicated in black. Occasional outlier nodes are noted with their corresponding module designation. See the legend of Figure 3 for the color scheme of the nodes and links.\n", - "317 \n", - " Regulatory Network of AHR Signaling(A) The summary map of AHR–PIN. Functional modules were determined by the overlapped annotations from three experimental layers (domain influence, pharmacology clustering, and localization influence) as well as from network clustering. For each functional module, the main “stacking pattern” of experimental layers is noted in italics. Modifiers initially left outside the single large cluster of the AHR–PIN were assigned to corresponding functional modules by sharing the similar stacking pattern where applicable. See the legend of Figure 3 for the color scheme of the nodes and links.(B) An expanded model of AHR signaling. The AHR signaling pathway is regulated by at least five functional modules that are involved in the control of receptor folding, nuclear translocation, transcriptional activation, receptor level, and a PASB-related nuclear event. Within each functional module, modifers intially enclosed in the single large cluster of the AHR–PIN are highlighted in bold. Known human homologs of the modifiers are noted at the side with a smaller font (Costanzo et al. 2001) . ARNT is dimmed because modifiers were identified in this study from an “ARNT-free” chimeric AHR system. See text for details.\n", - "324 \n", - " Mitochondrial Evolution Using Concatenated AlignmentsNetworks of protein LogDet distances for an alignment of 32 proteins constructed with Neighbor-Net (Bryant and Moulton 2003). The scale bar indicates 0.1 substitutions per site. Enlargements at lower right show the component of shared similarity between mitochondrial-encoded proteins and (i) their homologs from intracellular endosymbionts (red) as well as (ii) their homologs from free-living α-Proteobacteria (blue). (A) Result using 6,776 gap-free sites per genome (heavily biased in amino acid composition). (B) Result using 3,100 sites after exclusion of highly variable positions (data not biased in amino acid composition at p = 0.95). All data and alignments are available upon request. Results of phylogenetic analyses are summa-rized in Table S7. Since amino acid content bias was very severe in these datasets, protein LogDet analyses were also preformed. In neighbor-joining, parsimony, and maximum-likelihood trees generated from alignments both including and excluding highly biased positions (6,776 and 3,100 gap-free amino acid sites per genome, respectively), mitochondria usually branched basal to the Wolbachia–Rickettsia clade, but never specifically with Rickettsia (Table S7).\n", - "325 \n", - " Genomic Organization and expression of Type IV Secretion Operons in wMel(A) Organization of the nine vir-like CDSs (white arrows) and five adjacent CDSs that encode for either putative membrane-spanning proteins (black arrows) or non-vir CDSs (gray arrows) of wMel, R. conorii, and A. tumefaciens. Solid horizontal lines denote RT experiments that have confirmed that adjacent CDSs are expressed as part of a polycistronic transcript. Results of these RT-PCR experiments are presented in (B). Lane 1, virB3-virB4; lane 2, RT control; lane 3, virB6-WD0856; lane 4, RT control; lane 5, WD0856-WD0855; lane 6, RT control; lane 7, WD0854-WD0853; lane 8, RT control; lane 9, virB8-virB9; lane 10, RT control; lane 11, virB9-virB11; lane 12, RT control; lane 13, virB11-virD4; lane 14, RT control; lane 15, virD4-wspB; lane 16, RT control; lane 17, virB4-virB6; lane 18, RT control; lane 19, WD0855-WD0854; lane 20, RT control. Only PCRs that contain reverse transcriptase amplified the desired products. PCR primer sequences are listed in Table S9.\n", - "330 \n", - " Self-Assembled DNA Nanostructures(A) DNA “tile” structure consisting of four branched junctions oriented at 90° intervals. These tiles serve as the primary “building block” for the assembly of the DNA nanogrids shown in (B). Each tile consists of nine DNA oligonucleotides as shown.(B) An atomic force microscope image of a self-assembled DNA nanogrid. Individual DNA tiles self-assemble into a highly ordered periodic two-dimensional DNA nanogrid.(Images were kindly provided by Thomas H. LaBean and Hao Yan.)\n", - "331 \n", - " LT-HSC Activity Is Measureable in Fetal Blood, Spleen, and Bone MarrowCell suspensions of fetal blood (A), spleen (B), and bone marrow (C) were used to competitively reconstitute lethally irradiated recipients. The percentage of donor-derived peripheral blood leukocytes is presented for each dose assayed at 20 wk or more following reconstitution. The bar represents the mean percentage of donor-derived peripheral blood leukocytes in all recipients transplanted with each dose of fetal tissue, blood, spleen, or bone marrow. Fetal tissue from each stage embryo (12.5–17.5 dpc) was transferred in two to three experiments at multiple doses. Positive engraftment was determined by comparison to staining of control mice, which in most cases was less than 0.1%.\n", - "334 \n", - " Progenitors Are Found in the Fetal Spleen and Bone Marrow Prior to Colonization by LT-HSCSeeding of the fetal spleen (A) and bone marrow (B) by progenitors unable to provide sustained myelopoiesis precedes colonization of these tissues by HSCs. Reconstituted mice were analyzed for donor contribution in the peripheral blood of B, T, and myeloid lineages at 4 wk post-transplant. Contour plots show gating of donor (Ly-5.2+) cells and analysis of B220 (B cell) versus Mac-1 (myeloid cell) markers on donor cell populations. At 14.5 dpc, progenitors able to give rise only to B cells were detectable from the fetal spleen in transplantation assays; three of eight recipients receiving 1.0 FE 14.5 dpc fetal spleen cell suspension had donor B cell readout; zero of nine recipients receiving 1.0 FE 14.5 dpc fetal spleen cell suspension LT-MLR. B cell progenitors were detectable from the fetal bone marrow at 15.5 dpc (one of five receiving 2.0 FE) and 16.5 dpc (one of eight receiving 1.0 FE), before detectable HSCs were present. Fetal tissue from each stage embryo (12.5–17.5 dpc) was transferred in two to three experiments at multiple doses. Positive engraftment was determined by comparison to staining of control mice, which in most cases was less than 0.1%.\n", - "335 \n", - " Chemotactic Activity of SDF-1α and SLF on Fetal Liver and Adult BM HSCsHSCs were assayed for their ability to chemotax in a transwell assay in response to the chemokine SDF-1α. Migrating cells were labeled with stem cell markers and analyzed by FACS to determine the actual frequency of migrated HSCs. Like adult BM HSCs, FL HSCs migrate in response to SDF-1α (A), although at reduced levels. The optimal concentration of SDF-1α for both fetal liver and adult BM HSCs was determined to be 10 nM. The migratory effect of SLF was also assayed on FL HSCs and adult BM HSCs. FL HSCs migrate equally well to SLF as SDF-1α, while adult BM HSCs showed a lesser response to SLF. SLF and SDF-1α acted synergistically in their chemoattractive effects on FL HSCs (B). To determine whether migration was due to chemokinetic effects of SDF-1α, SLF, or both, equal concentrations of factors were added to both the top and bottom wells (T&B). Data are presented as the percentage of input HSCs that migrate to the bottom chamber for a representative migration assay, each point was performed in triplicate. These data are representative of three independent experiments. The single asterisk shows a significant increase in percent migration over basal migration (p < 0.05). The double asterisk shows a significant increase in percent migration over SDF-1α alone.\n", - "338 \n", - " Behavioral Task Used to Assess the Effects of Microstimulation on Direction Discrimination Performance(A) Schematic depiction of the visual stimulus display, showing the FP, the preferred and null response targets, and a variable-coherence random-dot pattern presented within the MU RF of MT neurons. An adjustable fraction of the dots (signal dots, filled circles) moved in the preferred or null direction of the MT neurons, while the remaining dots (noise dots, open circles) were randomly replotted on each refresh of the display, thus creating a masking motion noise. Signal and noise dots could be presented at a range of binocular disparities. Outside the MU RF, the remainder of the visual display was filled with zero-disparity, stationary dots (not shown).(B) Sequence of trial events in the microstimulation experiment. During each trial, the FP appeared first. Roughly 300–500 ms after the monkey achieved fixation, the random-dot pattern appeared in the MU RF. On half of the trials, selected at random, microstimulation was turned on during the visual stimulus. After a 1-s viewing period, dots and microstimulation were extinguished, and the two small target disks appeared. The animal was rewarded for making a saccade to the target corresponding to the direction of motion of the signal dots.\n", - "339 \n", - " Effect of Microstimulation on Direction Judgments at Two Illustrative Stimulation Sites from Monkey SA site with weak disparity tuning (DTI = 0.37) is shown in (A) and (B) and a site with strong disparity tuning (DTI = 0.87) is shown in (C) and (D).(A) Disparity tuning of MU activity at a stimulation site with weak disparity selectivity. Filled circles show the mean response to four stimulus presentations at each disparity, with error bars indicating ±1 SE. The solid curve is a cubic spline interpolation. The letters “L” and “R” are plotted at the response levels obtained when the same stimulus is shown only to the left and right eyes, respectively. The dashed horizontal line gives the spontaneous activity level in the absence of any visual stimulus, and the arrowhead denotes the disparity chosen for the direction discrimination task.(B) Effect of microstimulation on direction judgments for the site with the disparity tuning indicated in (A). The proportion of decisions made by the monkey toward the neurons' preferred direction of motion is plotted against the motion coherence of the random-dot stimulus. Open circles show the behavior obtained in the absence of microstimulation; the dashed curve is the best fit to these data using logistic regression. Filled circles and the solid curve show data from randomly interleaved trials in which microstimulation was applied. Note the large leftward shift of the psychometric function, equivalent to 38.7% dots (logistic regression, p < 0.001).(C) Disparity tuning of MU activity at a stimulation site with strong disparity selectivity. Again, the arrowhead denotes the disparity at which dots were presented in the direction discrimination task.(D) Effect of microstimulation on direction judgments for the site with the disparity tuning indicated in (C). In this case, there was no significant shift of the psychometric function when microstimulation was applied (p > 0.5); the small difference in slope between stimulated and nonstimulated trials is also not significant (p > 0.25).\n", - "340 \n", - " Relationship between the Efficacy of Microstimulation and the Strength of Disparity TuningEach datum represents one experiment, with filled symbols denoting significant effects of microstimulation (logistic regression, p < 0.05). The vertical axis shows the leftward shift of the psychometric function induced by microstimulation. Thus, positive values correspond to shifts toward the preferred direction of motion. The horizontal axis shows the DTI for MU activity at each stimulation site.(A) Data for monkey S (black symbols, n = 38) and monkey T (red symbols, n = 36). For both animals, there is a highly significant tendency for the effect of microstimulation to decline with increasing disparity selectivity (linear regression, r = −0.69 for monkey S, r = −0.52 for monkey T, p < 0.001 for both). The black, filled triangle denotes the experiment depicted in Figure 2A and 2B; the black, open triangle corresponds to the experiment of Figure 2C and 2D.(B) Data for monkey R (n = 28). In this case, the two variables are uncorrelated (r = −0.025, p > 0.9).\n", - "342 \n", - " Schematic Illustration of Experiments Designed to Examine Whether Microstimulation Has Disparity-Dependent Effects on Direction DiscriminationEach panel is the top-down view of a subject, whose two eyes are represented by the large, open circles. The plane of fixation is indicated by the long horizontal line, along which dots are plotted to represent the stationary, zero-disparity background of random dots. The shaded oval represents the RF—in width and depth—of a hypothetical cluster of MT neurons.(A) Depiction of a disparity-selective site that prefers far disparities (the RF is located behind the plane of fixation). Here, we expect microstimulation to have a significant effect on direction discrimination when dots are presented at the preferred disparity (left) but not when dots are presented at a nonpreferred disparity (right).(B) Depiction of a nondisparity-selective site. The RF is extended in depth, indicating that it has little disparity selectivity. In this case, the effect of microstimulation should not depend on whether dots are presented at either a far (left) or a near (right) disparity.\n", - "343 \n", - " Example of a Disparity-Selective Microstimulation Effect(A) Disparity tuning of MU activity at this stimulation site. Conventions as in Figure 2A. Arrowheads and letters indicate the disparity values used to perform the microstimulation experiments illustrated in (B), (C), and (D). DTI = 0.55.(B) First block of direction discrimination trials, in which dots were presented at the preferred disparity (0.1°). The stimulation psychometric function (filled symbols, solid curve) is shifted well to the left of the nonstimulation function (open symbols, dashed curve) by an amount equivalent to 17% dots (logistic regression, p < 0.001), with no corresponding change in the slope of the curve (p > 0.9).(C) Second block of discrimination trials, in which dots were presented at a nonpreferred disparity (-0.5°). In this case, the two psychometric functions did not differ significantly in horizontal position (p > 0.8) or in slope (p > 0.5).(D) Third block of discrimination trials, with dots again presented at the preferred disparity (repeat of [B]). Again, microstimulation produced a leftward shift equivalent to 17% dots (p < 0.001). The small increase in the slope of the stimulation psychometric function is not significant (p > 0.2).\n", - "344 \n", - " Example of a Nondisparity-Selective Effect of Microstimulation at a Site with Poor Disparity Tuning(A) MU disparity-tuning curve; DTI = 0.27. (B–D) Effects of microstimulation on direction discrimination when dots were presented at disparities of 0°, 0.6°, and −0.6°, respectively. In each case, the leftward shift of the psychometric function is highly significant (logistic regression, p < 0.0001) while the slopes were unchanged (p > 0.4).\n", - "347 \n", - " N-Terminal Truncation of DAT Reduces AMPH-Induced Currents and DA EffluxCells were voltage clamped with a whole-cell patch pipette while an amperometric electrode was placed onto the cell membrane. The internal solution of the whole-cell patch pipette contained 2 mM DA.(A) Representative trace of AMPH-induced whole-cell current obtained from FLAG-DAT cells upon AMPH (10 μM) bath application. The membrane potential of the cell was stepped to +100mV from a holding potential of –20 mV.(B) Oxidation current acquired concomitantly to the whole-cell current represented in panel A.(C and D) Representative current traces (whole-cell and amperometric, respectively) obtained from FLAG-del22-DAT cells using the same experimental protocol as in (A) and (B).\n", - "348 \n", - " AMPH-Induced Current-Voltage and Amperometric-Voltage Relationships Obtained from FLAG-DAT, FLAG-del22-DAT, FLAG-S/A-DAT, and FLAG-S/D-DAT(A) Current-voltage relationships of AMPH-induced current obtained from FLAG-DAT (filled circles) and FLAG-del22-DAT (open circles) cells. AMPH (10 μM) was applied to the bath while the membrane potential was stepped from–120 mV to +100 mV from a holding potential of –20 mV in 20 mV increments (n = 5).(B) Amperometric-voltage relationships obtained from FLAG-DAT (filled circles) and FLAG-del22-DAT (open circles) cells acquired concomitantly to the whole-cell current of panel A.(C and D) Current-voltage (C) and amperometric-voltage (D) relationships of whole-cell and oxidative currents obtained from FLAG-S/D-DAT (filled triangles) and FLAG-S/A-DAT (open triangles) cells using the same experimental protocol as above.\n", - "351 \n", - " Defining Puf Target RNAs(A) Distribution of average Cy5/Cy3 fluorescence ratios from four independent microarray hybridizations analyzing Puf3p targets. The arrow depicts enrichment of COX17 mRNA, which is known to bind to Puf3p (Olivas and Parker 2000). The red dashed line indicates the threshold applied for defining 220 target RNAs (a magnification is shown of the enriched region).(B) Cluster of RNA targets for Puf proteins. Rows represent genes (unique cDNA elements) and columns represent individual experimental samples. Each Puf protein and an untagged strain (mock control) were assayed in quadruplicate. The color code indicates enrichments (green–red color scale). The number of mRNAs interacting with each Puf protein is indicated in parentheses. mRNAs clustering with the mock controls were removed as false positives (see Materials and Methods).\n", - "352 \n", - " Classification of mRNAs Interacting with Puf Proteins(A) Column charts showing compartmentalization of characterized gene products encoded by the Puf targets. The same compartments are shown for the entire genome in the columns designed “All” (YPD, May 2003). The number of genes represented in the charts is indicated on the top of columns. An asterisk indicates classes with p values of less than 0.001.(B) Fraction of membrane-associated gene products among the Puf targets. We classified the targets by combining both GO and YPD annotations (May 2003). “Plasma membrane” (light blue) is a subpopulation of the total membrane-associated proteins (blue). Soluble cytoplasmic or nuclear proteins were classified as “non-membrane.” “All” refers to the genome-wide compartmentalization of characterized genes, and respective numbers were retrieved from YPD. “Puf2 Top 40” refers to the 40 highest enriched Puf2p targets and equals the total number of Puf1p targets.\n", - "353 \n", - " Sequence Motifs Interacting with Puf Proteins(A) Consensus motifs detected within 3′-UTR sequences of Puf3p, Puf4p, and Puf5p target mRNAs. Height of the letters specifies the probability of appearing at the position in the motif. Letters with less than 10% appearance were omitted. Fraction of genes bearing a motif in the 3′-UTR sequence is indicated to the right. Y-helicase proteins are nearly identical in sequence and were excluded from this analysis.(B) Scheme of three-hybrid assay for monitoring RNA–protein interactions in vivo (Bernstein et al. 2002).(C) β-Galactosidase activity for three-hybrid assay. Proteins assayed are indicated on top, RNAs to the left. Abbreviations: pum, pum-HD; cons., consensus motif; UGU/AGA, UGU in consensus sequence mutated to AGA.(D) Activation of HIS3 reporter gene and resistance to 3-aminotriazole (3-AT), a competitive inhibitor of the HIS3 gene product, in a three-hybrid assay (Bernstein et al. 2002).\n", - "365 \n", - " Dissection of the New1p Prion Domain Reveals Distinct Regions Responsible for Aggregation and Prion Inheritance(A) Indicated fragments of New1p (left) were expressed as GFP fusions (inducers) in a [nu–] [pin–] strain, examined by microscopy for GFP aggregation, then plated on SD-ade medium to assess induction of [NU+]. The symbol “+” indicates induction frequencies of at least 5%; the symbol “–” indicates no induction. Maintenance was assessed by the ability of an episomal maintainer version of the indicated fragment to support an Ade+ state after overexpression of New11–153-GFP (see Materials and Methods). The aggregation of New1-GFP fusions (second column) has been previously reported (Osherovich and Weissman 2001).(B) The NYN repeat of New1p induces [NU+] and [NU+]mini. New170–100-GFP was overexpressed in [nu–] and [nu–]mini strains ([pin–] and [PIN+] derivatives of each), along with vector only or New11–153-GFP controls. Averages of three independent trials, representing 600–2000 colonies, are shown for most induction experiments; inductions using New170–100-GFP were conducted twice. Error bars show minimal and maximal observed induction efficiencies.(C) Reversibility of [NU+]mini. The [pin–] Ade+ convertants obtained in (B) were colony purified on SD-ade medium and confirmed to have lost the inducer plasmid. A stable [NU+]mini isolate is shown before and after induction, as well as after GuHCl treatment, along with [nu–] and [NU+] reference strains.\n", - "367 \n", - " PNM2–1 (G58D) Prevents Inheritance But Not Aggregation of Sup35p Prions(A) PNM2-1 protein can seed [PSI+]. A Sup35p inducer containing the PNM2-1 (G58D) mutation was overexpressed in [psi–] [PIN+] cells; shown are cells (inset) with representative fluorescent foci, which were the same in frequency and appearance as cells with a wild-type inducer. Cells overexpressing inducer versions of wild-type Sup35p (SUP), an aggregation-defective N-terminal truncation (Δ1–38), and PNM2-1 were plated and scored for Ade+. Approximately 1000 colonies were counted.(B) PNM2-1 protein polymerization is similar to that of wild-type protein.(C) Preformed PNM2-1 polymers seed wild-type and PNM2-1 monomers with comparable efficiency. Endpoint PNM2-1 polymers were used to seed fresh reactions.(D) PNM2-1 displays a partially dominant, incompletely penetrant defect in [PSI+] maintenance. [psi–] (1) and [PSI+] (2) SUP35::TRP1 pSUP35 controls are shown. [PSI+] [PIN+] SUP35::TRP1 pSUP35 was transformed with a second maintainer expressing PNM2-1 (3). The wild-type maintainer (pSUP35) was then lost through counterselection (4). Red sectors from (4) were isolated, retransformed with the wild-type maintainer, and allowed to lose the PNM2-1 maintainer (5).(E) Mitotic instability of [PSI+] in the PNM2-1 strain. A pink (Ade+) [PSI+] [PIN+] PNM2-1 isolate was grown to log phase in SD-ade liquid then shifted into nonselective (YEPD) medium. At indicated time points, aliquots were plated onto SD-ade and YEPD media to determine the fraction of [PSI+] cells (minimum of 200 colonies counted per time point). Whereas a wild-type control remained [PSI+] through the experiment, the PNM2-1 strain rapidly lost [PSI+] during logarithmic growth; during stationary phase (18 h and beyond), the percentage of [PSI+] PNM2-1 strains remained unchanged (approximately 5%).(F) Propagon count of PNM2-1 vs. wild-type [PSI+] strains. The majority of PNM2-1 cells had no [PSI+] propagons (i.e., were [psi–]). In both strains, a small number of “jackpot” cells contained over 200 propagons; see Cox et al. (2003).\n", - "368 \n", - " F, A New1p–Sup35p Chimera, Shows Prion Characteristics of New1p(A) Schematic diagram illustrating the construction of chimera F.(B) Chimera F forms a prion, [F+]. The SUP35 gene in a [psi–] [pin–] strain was replaced with the F-M-C fusion; after transient overexpression of F-M-GFP, approximately 10% of these cells converted from an Ade- ([f –]) to an Ade+ ([F+]) state. Shown are examples of[f –] and [F+] strains, before and after GuHCl treatment, along with [psi–] and [PSI+] controls.(C) Non-Mendelian inheritance of [F+]. A diploid made by mating a [F+] MATa strain against an [f –] MATα displayed a [F+] phenotype and, when sporulated, produced four [F+] meiotic progeny. All 11 tetrads examined showed this 4:0 pattern of inheritance.(D) Sedimentation analysis of F-M-C. Extracts of [f –] and [F+] strains, along with [psi–] and [PSI+] controls, were subjected to 50K × g ultracentrifugation for 15 min. Total, supernatant, and pellet fractions were separated by SDS-PAGE, transferred to nitrocellulose, and probed with anti-SUP35NM serum. As with Sup35p, the prion form of F-M-C sediments primarily to the pellet but remains in the supernatant in [f –].(E) F-M-GFP overexpression induces [NU+] but not [PSI+]. Indicated inducers and maintainers were used in an induction experiment. The symbol “+” indicates approximately 5–10% conversion to Ade+. F induced [NU+] at a comparable efficiency to New11–153; although New11–153 overexpression promoted the appearance of Ade+ colonies in the F-M-C strain, these were fewer in number (less than 5%) and reverted to Ade- after restreaking.(F) [F+] and [NU+] prion proteins interact with each other but not with [PSI+]. Episomal “second maintainers” were introduced into the indicated strains, along with an empty vector control. Antisuppression (red) indicates that the second maintainer is soluble, while white/pink indicates coaggregation of the endogenous and episomal maintainers.\n", - "369 \n", - " [Q+], a Prion Form of Pathogenically Expanded Polyglutamine(A) Schematic illustrating the construction of polyglutamine-derived prion domains. (Op) indicates the presence of the Sup35p oligopeptide repeats (residues 40–124).(B) Fluorescence micrographs of [psi–] [PIN+] strains expressing indicated polyglutamine inducers.(C) Polyglutamine-based prion inheritance. Strains with indicated inducers and maintainers were plated onto SD-ade and YEPD media to determine the fraction of Ade+ after a standard induction experiment. Interestingly, Q62 inducer forms aggregates but does not promote Ade+ in the Q62(Op) maintainer strain. Note that Q62(Op) shows a high rate of spontaneous appearance of Ade+.(D) GuHCl sensitivity of the [Q+] state. An Ade+ convertant obtained in (C) was restreaked to lose the inducer plasmid, then grown on GuHCl. Shown are plates before and after GuHCl treatment, along with [psi–] and [PSI+] controls.(E) Dominance and non-Mendelian inheritance of [Q+]. See Figure 5C.(F) [Q+] does not interact with Sup35p and vice versa. [Q+] and [PSI+] strains were transformed with indicated maintainers; mismatches between the maintainer and the chromosomally encoded allele result in antisuppression (red).\n", - "370 \n", - " Model for Prion Growth and Division(A) During prion growth, polymers seed the incorporation of monomers through interactions between Q/N-rich aggregation sequences (blue). Proteins with noncognate aggregation sequences (red) are excluded.(B) The division phase of prion replication requires the oligopeptide repeats (orange), which may facilitate the action of chaperones such as Hsp104p (scimitar) in breaking the polymer into smaller, heritable units.\n", - "372 \n", - " Structure and Evolution of the ASPM Gene in PrimatesThe scale of all plots corresponds to the consensus sequence obtained based on a multiple alignment of five ASPM genes.(A) Schematic representation of the alignment. Promoter regions, exons, and introns are marked in gray, red, and blue, respectively. White segments correspond to gaps.(B) Positions of long (50 bp or longer) insertions/deletions. “O” denotes orangutan, “M” macaque, “OGCH” the orangutan–gorilla–chimpanzee–human clade, and “GCH” the gorilla–chimpanzee–human clade.(C) Positions of polymorphic bases derived from the GenBank single nucleotide polymorphism (SNP) database.(D) Positions of the CpG island. The approximately 800-bp-long CpG island includes promoter, 5′ UTR, first exon, and a small portion of the first intron.(E) Location of an approximately 3-kb-long segmental duplication.(F) Positions of selected motifs associated with genomic rearrangements in the human sequence. Numbers in parentheses reflect number of allowed differences from the consensus motif (zero for short or two ambiguous motifs, two for longer sites).(G) Distribution of repetitive elements. The individual ASPM genes share the same repeats except of indels marked in (B).(H) DNA identity and GC content. Both plots were made using a 1-kb-long sliding window with 100-bp overlaps. The GC profile corresponds to the consensus sequence; the individual sequences have nearly identical profiles.\n", - "373 \n", - " Structure of ASPM CDSs and Evolution in PrimatesThe scale of all plots corresponds to the 3,480-amino-acid-long protein alignment; positions in the CDS were scaled accordingly.(A) Structure of the human ASPM CDS and protein. The first scheme shows positions of major domains in the ASPM protein (Bond et al. 2002). The putative microtubule-binding domain is in gray, the calponin-homology domain in orange, IQ repeats in blue, and the terminal domain in black. Positions of exons in the CDS are drawn in the second block. To separate individual exons, odd numbered exons are colored in black and even numbered ones in white.(B) Positions of insertions/deletions in the protein sequences. Coordinates correspond to the human protein sequence. “O” denotes orangutan, “G” gorilla, “M” macaque, “Gm” African green monkey, and “OGCH” the orangutan–gorilla–chimpanzee–human clade.(C) Substitutions in hominoid CDSs relative to the common ancestor. The expected ancestor CDS was derived using ML codon reconstruction implemented in PAML. African green monkey and rhesus macaque were outgroups. Nonsynonymous/synonymous (ω = Ka/Ks) ratios were free to vary in all branches. Positions marked in green correspond to synonymous changes relative to the ancestral sequence; the red bars indicate nonsynonymous changes.(D) Synonymous (red) and nonsynonymous (green) changes in ancestral lineages leading to human. aOGCH–aGCH is the ancestral lineage from the orangutan divergence to the gorilla divergence; aGCH–aCH represents the lineage from the gorilla divergence to the chimpanzee common ancestor. aCH–human corresponds to the human lineage after the chimpanzee divergence. There are seven synonymous and 19 nonsynonymous human-specific substitutions. Methods and description are the same as in (C).(E) Positions of polymorphic bases for different CDSs of African green monkey, gorilla, chimpanzee, and human. Positions marked in green correspond to synonymous polymorphisms, and the red bars indicate nonsynonymous sites. Numbers of compared sequences are in parentheses; in the case of human we show nine polymorphic positions (four synonymous and five nonsynomous) from the GenBank SNP database. ASPM mutations detected in MCPH patients are shown separately in (F).(F) Positions of 19 mutations reported for MCPH patients (Bond et al. 2002; Bond et al. 2003). All the reported mutations introduce premature stop codons. Mutation sites located within CpG dinucleotides are highlighted in red.(G) Positions of CpG dinucleotides in the human CDS.(H) Comparison of Ka and Ks rates with codon adaptation index (CAI). Ka and Ks values are for all branches (fixed ω ratio); CAI is an average for all five primates (note that CAI differences are very small between the five species). The window was set to 300 bp (100 amino acids) with a 30-bp (10-amino-acid) step.(I) Conservation at the nucleotide and protein level in primates. Y-axis corresponds to proportions of conserved (identical) positions in the CDS and the protein alignment. The plot was obtained using 100-amino-acid-long, overlapping windows, and the step was set to 10 amino acids. In the case of CDS conservation, the window was 300 bp and step 30 bp.\n", - "374 \n", - " Phylogenetic Trees and ω ratio for Complete ASPM and Three Selected SegmentsTrees and ω (Ka/Ka) ratios were computed using the ML method for codons implemented in PAML. Branch lengths represent ML distances for codons, i.e., using both synonymous and nonsynonymous nucleotide sites, and in all branches the ω ratio was set free to vary. All trees are drawn to the same scale. Branch labels mark the ω ratios for corresponding branches. Values in square brackets show ω for additional cDNA sequences whenever available. Default values and branch lengths were calculated from genomic copies. Selected tested hypotheses are listed. ωH stands for the ω rate in the human lineage, ωC in the chimpanzee lineage, ωCH in the common human–chimpanzee ancestral lineage after the gorilla divergence, ωG in the gorilla lineage, and ω0 in all other branches. Single asterisks indicate p < 0.05, χ2\n", - "1 = 3.84; double asterisks indicate p < 0.01, χ2\n", - "1 = 6.63.(A) Phylogeny for the complete ASPM CDS. In addition to testing different ω values in the human lineage, we also tested the hypothesis that the complete gorilla–chimpanzee–human clade evolved at a constant rate, different from the rest of the tree (compared to the one-ratio model, boxed).(B) The ASPM phylogeny derived from a conserved segment from exon 5 to the beginning of the IQ domain (amino acids 676–1,266). The branch connecting the human and chimpanzee common ancestor with the gorilla–chimpanzee–human common ancestor had no substitutions, therefore the ω ratio could not be calculated.(C) IQ domain (amino acids 1,267–3,225). We also tested the hypothesis that the gorilla and human lineages evolved at the same ω rate, different from the rest of the tree (compared to the one-ratio model, boxed).(D) Phylogeny of eight primate sequences from a 1,215-amino-acid-long segment of exon 18 (amino acids 1,640–2,855). We also tested the hypothesis that the gorilla and human lineages evolved at the same ω rate, different from the rest of the tree (compared to the one-ratio model, boxed).\n", - "376 \n", - " SWR1-Com Shared Subunits with NuA4 and Contained Proteins with Motifs Involved in Chromatin Biology(A) Protein complex overlap. Purifications were performed under high stringency conditions (see Materials and Methods) from Swr1-TAP, Yaf9-TAP, and untagged control strains, resolved by SDS-PAGE and stained with silver. Due to the relatively low efficiency of the Swr1-TAP purification, the wt and Swr1-TAP purifications were performed from twice the amount of starting material compared to Yaf9-TAP. Not all proteins identified by mass spectrometry were clearly visible on the gel. Arrows point to proteins that were common to the Swr1-TAP and Yaf9-TAP purifications, whereas stars point to proteins that were found only in the Yaf9-TAP purifications as judged by visual inspection and comparison of protein sizes with the data deduced from mass spectrometry. The vertical bar indicates that proteins in that area of the gel could not be clearly resolved.(B) Domain structure of SWR1-Com. Shown are SMART domain representations of individual proteins assigned to the SWR1-Com taken from the SMART database (http://smart.embl-heidelberg.de/). Domain names are included, green bars indicate coil-coiled regions, and magenta bars indicate regions of low complexity. The amino-terminal part of Swr1p is not to scale.\n", - "377 \n", - " Swc4p and Bdf1p Were Components of SWR1-ComThis figure shows immunoblots of analytical-scale TAP purifications. The captured TAP-tagged protein is indicated above the gels, and the protein that was tested for association is indicated at the right side.(A) Association of Swc4p and Tra1p. Swc4-HA was present in purifications from Yaf9-TAP, Esa1-TAP, Rvb2-TAP, and Swr1-TAP but not Ino80-TAP. NuA4 was only present in the Yaf9-TAP and Esa1-TAP material.(B) Reciprocal confirmation of Swc4p being part of NuA4. Swc4-TAP and Yaf9-TAP purified material contained NuA4 components Esa1p and Tra1p.(C) Association of Bdf1p. Bdf1p was present in purifications from Swr1-TAP, Yaf9-TAP, and Swc4-TAP but not Esa1-TAP.\n", - "378 \n", - " SWR1-Com Associated Selectively with H2A.Z and Contained H2B(A) Analytical-scale TAP purifications from H2A.Z-TAP, Yaf9-TAP, and H2A-TAP were analyzed by immunoblotting for the components indicated on the right. SWR1-Com preferentially associated with H2A.Z-TAP, whereas Kap114-HA associated equally with H2A.Z-TAP and H2A-TAP but not Yaf9-TAP.(B) SWR1-Com was purified from strains with HA-tagged versions of either H2A.Z or H2B and analyzed by immunoblotting for the presence of these histones as well as the SWR1-Com subunit Act1p.\n", - "379 \n", - " Chromosomal Distribution of Swr1p-Activated Genes(A) Histogram showing the number of Swr1p-activated genes as a function of their distance to the nearest chromosome end.(B) The statistical significance of the enrichment of Swr1p-activated genes as a function of distance to the nearest telomere, and the significance of the depletion of Swr1p-activated genes in regions greater than 40 kb from a telomere, were determined using the hypergeometric function (Tavazoie et al. 1999).\n", - "380 \n", - " Relationship of Genes Activated by Swr1p or H2A.Z(A) The Venn diagram of number of genes that exhibited a significant decrease in expression in swr1Δ cells (this work) or htz1Δ cells (Meneghini et al. 2003), revealing a large overlap. Shown on the top is the relationship for the genome overall and on the bottom for genes within 20 kB of a telomere. H2A.Z-dependent genes whose expression could not be determined in swr1Δ cells were omitted.(B) A color representation of all genes that were significantly reduced in expression in swr1Δ cells only, htz1Δ cells only, or both, grouped according to (A). Each column represents data from an independent microarray experiment that compared genome-wide expression in mutant cells of the indicated genotype to wt cells. Each row represents the changes in expression of a single gene across the eight experiments. Change in expression measured as the log2 of the mutant/wt expression ratio is indicated according to the color scale shown. Red cells refer to genes found to have increased expression in either swr1Δ cells or htz1Δ cells that decreased in expression in the other mutant. Excluded from representation are genes that increased expression in both mutants.\n", - "381 \n", - " ChIP Analysis of HA3-H2A.Z Deposition in the HMR Region and Near the Right Telomere of Chromosome XIV(A) Location of PCR primers.(B) ChIP results in wild type (bars indicate relative enrichment versus a probe in the PRP8 ORF; standard errors are shown). The ChIP enrichment signal at HMR relative to PRP8 being less than 1.0 indicated some H2A.Z deposition occurred at the PRP8 control region.(C) ChIP results in swr1Δ cells.\n", - "382 \n", - " ChIP Analysis of H2A.Z Deposition at Nontelomeric Euchromatic Sites(A) ChIP results in wild type.(B) ChIP results in swr1Δ cells. We detected a reduced enrichment of H2A.Z at all these loci when we estimated the absolute H2A.Z abundance by dividing the amount of immunoprecipitated DNA by the amount of total input DNA for each locus.\n", - "383 \n", - " Eaf1p Was a Subunit of the NuA4 HAT(A) Eaf1-HA associated with NuA4 subunits. Immunoblots of analytical-scale TAP purifications are shown. The captured TAP-tagged protein is indicated above the gels, and the protein that was tested for association is indicated at the right.(B) Strains lacking EAF1 have defects in histone H4 acetylation. Whole cell extracts from mutant strains indicated on the top were tested for global histone acetylation using antibodies directed against different forms of acetylated H4 and H2A as indicated on the right.\n", - "384 \n", - " NuA4 and SWR1-Com Shared Similar Phenotypes and Interacted Genetically(A) SWR1-Com and Eaf1p were required for resistance to DNA damage and genotoxic stress. Ten-fold serial dilutions of strains from a stationary overnight culture with the indicated deletions of SWR1-Com subunits and of EAF1 were plated and incubated at 30 °C for 2–3 d. YPD plates with the following concentrations of chemicals were used: 100 mM HU, 10 μg/ml of benomyl, 2% formamide, or 3 mM caffeine.(B) SWR1-Com and NuA4 interacted genetically. Double mutants, deduced from genetic analysis of the viable spore clones, are circled, with the two mutations of interest in each cross indicated at the side. All double mutants were inviable.\n", - "388 \n", - " Comparison of QTL Positions for Different TraitsLOD scores are shown as a function of genetic distance along different stickleback linkage groups. QTL affecting qualitative plate pattern (red line), total plate number (black lines), or plate size (blue lines) show similar shapes on several linkage groups, suggesting that the same or linked genes control multiple aspects of plate phenotype. Points in LOD plots correspond to the following microsatellite markers from left to right along each linkage group: (A) LG 4: Pitx2 (Stn220), Stn38, Gac62, Stn42, Gac4174, Stn45, Stn183, Stn46, Stn47, Stn184, Stn39; (B) LG 7: Stn70, Stn72, Stn76, Stn71, Stn78, Stn79, Stn75, Stn81, Stn80 Stn82, Pitx1; (C) LG 10: Stn119, Stn120, Stn211, Stn121, Stn124, Stn23, Stn125; (D) LG 25: Stn212, Stn213, Stn214, Stn215, Stn216, Gac1125, Stn217; (E) LG 26: Stn218, Stn219, Bmp6, Stn222, Stn223. Note that markers Stn183 and Stn184 from LG 18 in the Priest Lake cross (Peichel et al. 2001) map together with LG 4 markers in the larger Cross 1.\n", - "389 \n", - " Cumulative Effects of Freshwater Alleles on the Number, Pattern, and Size of Lateral Plates in Cross 1Increasing the total number of Paxton benthic freshwater alleles at modifier QTL on LGs 7, 10, and 26 significantly reduces plate number in animals with one marine (complete morph) and one Paxton benthic (low morph) allele near the major QTL on LG 4 (Aa progeny) (A). The same modifier QTL have little effect on fish with two marine alleles near the major QTL (AA animals) (B) and smaller phenotypic effects on animals with two benthic alleles near the major QTL (aa animals) (C). Increasing the number of benthic alleles also significantly increases the proportion of Aa fish whose overall plate pattern is classified as partial instead of complete (D). (E–F) show plate size effects. Increasing the number of benthic alleles at plate size QTL on LGs 4, 7, and 25 significantly reduces mean plate width of F2 progeny (E). (F) shows the schema of plate size measurements. Lateral plates are shown numbered from anterior to posterior. Error bars in (A–E) represent standard error.\n", - "391 \n", - " Variability Profile for Typical SVGsBlocks in the lines are conserved subsequences identified using the Pfam, BLOCKS, and PRINTS databases. In the variability profile, the x-axis is the amino acid position and the y-axis is the variability index (see Materials and Methods). Variable domains are marked by the black lines over the graph.(A) Cytosine-specific DNA methyltransferase of 355 amino acid long in H. pylori. Notice the variable domain in the middle and the variable segment in its N-terminal region, which is shorter than 70 amino acids and has no known function.(B) Virulence-associated protein homolog (VacB) of 644 amino acid long in H. pylori. It has two variable domains at the N- and C-termini.\n", - "394 \n", - " Schematic Alignment of TopA and GyrB(A) TopA. (B) GyrB. Each line represents a sequence. Black boxes indicate the conserved blocks from the BLOCKS database and are aligned correspondingly. Red boxes in (A) are the zinc-finger motifs reported by Pfam. Notice that the number of occurrences of this motif varies and that there are several sequences without this motif in the C-terminal. The lines between the boxes are the variable sequences that cannot be aligned. Variable domains are labeled in the figure.\n", - "397 \n", - " Paralogous Genes in SVGs(A) Paralog families in SVGs for four microorganisms. The x-axis shows the number of paralogs for each SVG. The y-axis shows the number of SVGs. The inset figure shows the percentage of genes with different numbers of paralogs for SVGs and fully conserved genes in E. coli genome. The x-axis is the number of paralogs, and the y-axis is the percentage.(B) Contingency tables to examine the dependence between SVG and paralogous gene. χ2 statistics are computed using standard formula.\n", - "398 \n", - " Structure of IAb-p3K and Properties of T Cell Hybridomas Reactive to It(A) Ribbon structure of the α1 and β1 domains of IAb with a wire-frame representation of the bound p3K peptide (Liu et al. 2002). Amino acids labeled in red are the five central peptide amino acids available for αβTCR interaction.(B) The figure shows the response of 105 B3K-06 hybridoma cells to various peptides presented by 105 IAb-bearing APCs, LB-15.13.(C) The figure shows the response of the T cell hybridoma YAe-62 to various MHCII molecules. In each case, 105 hybridoma cells were incubated overnight with MHCII presented in various ways. For IAb-p3K, soluble IAb-p3K was immobilized in the culture well before the addition of the hybridoma cells. In other cases, 106 spleen cells were used directly as APCs without additional peptide antigen. For pEα, the spleen cells came from IAb-pEα/ΔIAβ/ΔIi mice (Ignatowicz et al. 1996). For wild-type IAb and allo-MHCII, the spleen cells came from H-2 congenic mice on the C57BL/10 background. Finally, spleen cells from ΔIAβ/ΔIi C57BL/6 mice were used.\n", - "399 \n", - " Constructions Used in These Experiments(A and B) Previously described constructions (Rees et al. 1999) for the coexpression in a single baculovirus of soluble version of the α (A) and β (B) chains of IAb were modified as described in the Materials and Methods to anchor the molecule on the surface of infected insect cells.(C) The construction was further modified as described in the Materials and Methods to disrupt the IAb β chain with sequence encoding enhanced GFP flanked by sites for the enzymes SbfI and CeuI.(D and E) A degenerate DNA fragment was produced by PCR (D) and cloned into the construct replacing the GFP-encoding sequence (E) as described in the Materials and Methods.\n", - "400 \n", - " Functional Display of IAb-p3K on the Surface of Insect Cells(A) Sf9 insect cells were infected with baculovirus encoding a membrane-bound form of IAb-p3K. After 3 d, the surface expression of IAb-p3K was detected with an anti-IAb mAb using flow cytometry.(B) The genes for mouse ICAM (CD54) and B7.1 (CD80) were cloned into an insect cell expression plasmid as described in the Materials and Methods. The plasmids were used to cotransfect Sf9 cells, and a stable transfectant (Sf9-ICAM/B7.1) was cloned expressing both proteins detected with mAbs using flow cytometry.(C) Either Sf9 (open bars) or Sf9-ICAM/B7.1 (closed bars) cells were infected with baculovirus expressing IAb-p3K. After 3 d, the infected insect cells were used as APCs to stimulate IL-2 production from B3K-06 and YAe-62. Uninfected cells were used as negative controls.\n", - "401 \n", - " Detection of IAb-p3K-Expressing Insect Cells with Polyvalent, Fluorescent αβTCRs(A) Sf9 insect cells were infected with baculovirus encoding IAb bound either to p3K (filled histogram) or a control peptide (FEAPVAAALHAV) (unfilled histogram). After 3 d, the infected insect cells were incubated with polyvalent, fluorescent soluble αβTCRs from B3K-06 or YAe-62. The binding of each αβTCR was assessed by flow cytometry.(B) Cells, prepared as in (A), were simultaneously analyzed with fluorescent αβTCRs and a mAb specific for IAb (17–227) that does not interfere with αβTCR–IAb interaction.(C) The binding of the αβTCRs is shown only for those infected insect cells that bear a high level of surface IAb (dotted region in [B]).\n", - "402 \n", - " Recovery of IAb-p3K Virus-Infected Cells with Fluorescent αβTCR(A) Sf9 cells were infected with a mixture of virus, 99% of which encoded a control protein (a TCR β chain linked to the gp64 transmembrane/cytoplasmic tail) and 1% of which encoded IAb-p3K. After 3 d, the infected cells were analyzed as in Figure 3A for binding fluorescent αβTCR from YAe-62. The 1% of the infected cells with the brightest fluorescence was sorted (high sort, 15,700 cells). As a control, a similar number of cells that fluoresced as dully as the background fluorescence were also sorted (low sort).(B) The sorted cells were incubated with fresh Sf9 insect cells to allow propagation of the viruses and production of new stocks. The stocks were used to infect new Sf9 cells, and after 3 d the analysis of αβTCR binding was repeated.\n", - "403 \n", - " Summary of Successive Screening of the IAb–Peptide Libraries with Fluorescent αβTCRsSf9 insect cells (1 × 107 to 1.5 × 107) were infected at a MOI of approximately 1 with an aliquot of baculovirus encoding the IAb–peptide library. After 3 d, the infected cells were analyzed for binding the αβTCR of either B3K-06 or YAe-62. Either obviously fluorescent cells or the brightest 1% of the cells were sorted (2 × 104 to 8 × 104 cells) and added to 3 × 106 fresh Sf9 cells to propagate and reexpress the viruses contained in the sorted cells. These infected cells were then reanalyzed and sorted using the fluorescent αβTCRs. This process was repeated until no further enrichment of αβTCR binding was seen. In most cases, the reanalysis was done directly from the cells that were cocultured with the sorted cells. In a few cases, an intermediate viral stock was made and then used to infect additional Sf9 cells. The turn around time per cycle was 4–7 d. The figure shows the reanalysis in a single experiment of the initial viral stocks and all of the various intermediate enriched viral stocks. Sf9 cells were infected at an MOI of less than 1 with the viral stocks and analyzed as in Figure 4 for either B3K-06 (A) or YAe-62 (B) αβTCR binding.\n", - "404 \n", - " Analysis of Baculovirus Clones from the αβTCR-Enriched IAb–Peptide Library(A) Sf9 cells were infected with stock from four baculovirus clones (B9, B13, B17, and B23) isolated from the virus pool enriched with the αβTCR of B3K-06. After 3 d, an aliquot of cells from each infection was analyzed as in Figure 4 to assure uniform binding of the fluorescent B3K-06 αβTCR (top). Viral DNAs prepared from other aliquots of the cells were used as templates in a PCR with oligonucleotides that flanked the DNA encoding the IAb-bound peptide. The fragment was sequenced directly with a third internal oligonucleotide (middle). The clone stock was then used to infect Sf9-ICAM/B7.1 cells. After 3 d, the infected cells were used as APCs for B3K-06 production of IL-2 (bottom). Virus encoding IAb-p3K was used as a positive control. Virus encoding pEα was used as the negative control.(B) Same as (A), but using YAe-62 and clones (Y2, Y14, Y28, Y52) derived from the IAb–peptide library using the YAe-62 αβTCR.\n", - "405 \n", - " Arp2 Hydrolyzes ATP Rapidly upon Filament Nucleation(A) Arp2/3 (2 μM) was covalently crosslinked to γ-32P-AzidoATP by exposure to UV light. Both Arp2 and Arp3 crosslink with approximately equal efficiency (lane 1). Addition of 100-fold excess monomeric actin (lane 2) distorts the shape of the Arp2 band, but the Arp2 signal remains separate and quantifiable.(B–E) γ-32P-AzidoATP-Arp2/3 (20 nM) was mixed with 2 μM monomeric actin in polymerization buffer. Samples were taken before and at indicated times after the addition of 750 nM VCA, which initiates rapid actin-filament nucleation by the Arp2/3 complex.(B) Subunits were separated by SDS-PAGE and stained with Coomassie.(C) 32P signal shows remaining uncleaved γ-32P on Arp2 and Arp3 subunits. Arp2 rapidly loses γ-32P after addition of VCA.(D) Cleaved γ-32P was separated from free 32P-ATP and protein-32P-ATP by TLC.(E) Quantitation of (B) to (D): Protein-ATP (closed circle), Cleaved Pi (closed square), Free ATP (closed diamonds), and Arp2-ATP from SDS-PAGE (open circle, normalized separately).(F) Arp2 releases phosphate soon after ATP hydrolysis. Reaction conditions were the same as (B)–(E), but with the addition of 2 mM maltose and 2 U/ml maltose phosphorylase. Timepoints were quenched into formic acid and assayed by TLC. Hydrolyzed 32P-ATP was quantified from the decrease in protein conjugated 32P, and released 32P was quantified from the 32P-glucose phosphate produced.\n", - "406 \n", - " A Single Actin Monomer, in the Presence of Actin Filaments and VCA, Stimulates ATP Hydrolysis on Arp2, without Requiring Actin Polymerization(A–C) Remaining unhydrolyzed γ-32P-AzidoATP on Arp2 (closed circle) and Arp3 (open circle) was quantified to assay ATP hydrolysis (same conditions as Figure 1B–1D). γ-32P-AzidoATP-labeled Arp2/3 (20 nM) was mixed at indicated times with either 750 nM VCA then 2 μM G-actin (A), 2 μM G-actin then 750 nM VCA (B), or 2 μM F-actin then 750 nM VCA (C).(D) Latrunculin B (open square) inhibits the ability of VCA plus monomeric actin (open circle) to stimulate ATP hydrolysis on the Arp2/3 complex in the absence of actin filaments. Also, 32P ATP hydrolysis signal requires covalent crosslinking to Arp2/3. Arp2/3 was mixed with 6 μM γ-32P-AzidoATP and exposed to UV either before (closed circle) or after (open circle) the addition of excess (2 mM) unlabeled ATP. Excess ATP added before the UV exposure prevents crosslinking and abolishes the ATP hydrolysis signal, indicating that all the 32P ATP hydrolysis signals measured are due to ATP hydrolysis on Arp2/3 and not from ATP hydrolysis on actin.(E and F) In the presence of phalloidin-stabilized actin filaments, actin monomers are prevented from polymerizing by Latrunculin B, but still stimulate ATP hydrolysis on the Arp2/3 complex. 20 nM γ-32P-AzidoATP–labeled Arp2/3 was premixed with 1 μM phalloidin-stabilized actin filaments. The reaction was initiated by mixing with 750 nM N-WASP VCA, 1 μM G-actin and 4 μM Latrunculin B as indicated, cleaved γ-32P was assayed by phosphomolybdate extraction (E), and separately, actin polymerization was monitored by pyrene–actin fluorescence (F).\n", - "407 \n", - " Pointed-End Filament Capping Is Sufficient to Stimulate ATP Hydrolysis on Arp2 in the Absence of VCA(A) The Arp2/3 complex prevents actin filament reannealing by capping the pointed ends. The length distribution of 2 μM Alexa-488 phalloidin-stabilized actin filaments is unaffected in the absence (i) or presence (iii) of 20 nM Arp2/3 complex. (ii) 5 min after shearing the filaments, filaments have begun to reanneal in the absence of the Arp2/3 complex, but 20 nM Arp2/3 complex (iv) maintains short filaments, preventing reannealing by capping filament pointed ends.(B) ATP hydrolysis on Arp2 is stimulated by pointed-end capping. Crosslinked γ-32P-AzidoATP-Arp2/3 (20 nM) was mixed with 2 μM phalloidin-stabilized actin filaments. The mixture was split in two and one sample was sheared. Timepoints were taken as shown.(C) Uncleaved 32P on Arp2 (unsheared [closed circle] and sheared [closed square]) and Arp3 (unsheared [open circle] and sheared [open square]) were quantified from (B). Arp2 rapidly hydrolyzes bound ATP upon filament pointed-end capping.\n", - "408 \n", - " ATP Hydrolysis by Arp2 Coincides with Nucleation of New Actin Filaments, and Not Filament Debranching(A, B) The kinetics of nucleation were slowed by using only 1 μM monomeric actin (compared to 2 μM for Figure 1). γ-32P-AzidoATP-Arp2/3 (20 nM) was mixed with either 750 nM N-WASP WWA (closed circle) or Scar1 WA (closed square) and 1 μM 7% pyrene-labeled monomeric actin.(A) Actin polymerization measured by pyrene fluorescence.(B) The concentration of new filament ends (open symbols) was calculated from the polymerization data in a model-independent way (see Methods and Materials), and Arp2-ATP hydrolysis (closed symbols) was measured under the same reaction conditions for both N-WASP WWA (open and closed circles) and Scar1 WA (open and closed squares).(C) ATP hydrolysis on Arp2 does not accompany filament debranching. Using a large excess (100 nM) of γ-32P-AzidoATP-Arp2/3 creates a slow hydrolysis phase that follows the rapid nucleation phase. The slow phase of ATP hydrolysis can be inhibited by excess (1.5 μM) uncrosslinked Arp2/3 added at t = 200 s, showing that the slow phase of ATP hydrolysis is from Arp2/3 being recruited from solution and not from that already incorporated in branches.\n", - "409 \n", - " Model for Activation of ATP Hydrolysis on the Arp2/3 Complex and Mechanism by which WASP-Family Proteins Activate the Arp2/3 Complex to Nucleate New Actin Filaments(A) Filament pointed-end capping stimulates ATP hydrolysis on Arp2 without branch formation. (i) Arp2 and Arp3 are separated when the Arp2/3 complex is free in solution. (ii) Upon pointed-end capping, the binding energy of the actin-Arp2/3 interface drives Arp2 and Arp3 together and (iii) a conformational change on Arp2 (shown by the red the subdomain 3/4 loop flipping out) triggers ATP hydrolysis by Arp2 (filament pointed-end capping is probably not a significant function of the Arp2/3 complex in vivo).(b) A VCA-bound actin monomer drives the activation of the Arp2/3 complex and stimulates ATP hydrolysis on Arp2. (i) The Arp2/3 complex must first be bound to the side of an actin filament, and an actin monomer is bound to the VC domain of the WASP-family protein. (ii) The VC domain of the WASP-family protein docks the first monomer of the daughter filament onto the Arp2/3 complex, stabilizing the Arp2–Arp3–actin interaction and promoting the active conformation of the complex. (cf. Aii). (iii) The active conformation of the Arp2–Arp3–actin monomer triggers a conformational change on Arp2 and ATP hydrolysis by the subunit. (iv) Actin polymerizes from the activated Arp2/3 complex. ATP hydrolysis by Arp2 may promote dissociation of the CA domain of the WASP-family protein from the Arp2/3 complex, aided by actin polymerization, which competes its WH2 domain from the first actin monomer.\n", - "411 \n", - " In Vivo Loading and Imaging of Astrocytes Using Fluo-4 AM(A) Acute slice prepared 1 h after dye loading. Scale bar, 200 μm.(B) Higher magnification reveals cells with typical astrocyte morphology. Scale bar, 20 μm.(C) Average bulk fluorescence as a function of the depth from the pial surface.(D) Schematic drawing of the experimental arrangement. Abbreviations: EKG, electrocardiogram. PMT, photomultiplier. LFP, glass micropipe for local field potential and multiple unit recording. The same pipette was used to deliver bicuculline.(E) Image taken 50–150 μm below pial surface in vivo. Flattened xyz stack.(F) Fluo-4 AM loaded cells (left) were stained for S100B immunoreactivity (right), and the images were merged (center). See Video S3 for large-scale staining. Scale bar, 20 μm.\n", - "414 \n", - " Spatio-Temporal Dynamics of Astrocyte Ca2+ Activity(A) Definition of nearby (less than 50 μm) and distant (greater than 50 μm) cell pairs.(B) Fluorescence changes in two nearby astrocytes.(C) Cross-correlogram of fluorescent intensity.(D) Mean cross-correlation of ΔF/F0 in all nearby (thick line) and distant (thin line) cell pairs in control condition (left) and in the presence of bicuculline (right). Note large increase of ΔF/F0 correlation in nearby cell pairs in the bicuculline condition (error bar: standard error of the mean).(E) Relationship between distance of the two cells and the magnitude of correlation at zero timelag. Note lack of a reliable relationship in the control condition (left). Note also the significant negative correlation between the distance and correlated ΔF/F0 changes in cell pairs in the bicuculline-treated cortex (right).\n", - "415 \n", - " Sequence of Events for Each Trial(A) The “Compound” prompt was presented for 0.5 s, then persisted for a variable amount of additional time (0–2 s) until a cue from the scanner indicated the beginning of a new whole brain acquisition. (B) A three-word problem appeared in the center of the screen and persisted until subjects indicated with a bimanual button press that they had solved the problem, or until the 30-s time limit elapsed. Thus, event timing and condition were completely dependent on subjects' responses. (C) Following the button press or time limit, subjects were prompted to verbalize the solution (or press the buttons and say “Don't know” if the time limit expired prior to solution) then (D) prompted to indicate (with a bimanual button press) whether they felt insight, as described prior to the experiment. (E) Next, subjects performed 9 s of an unrelated filler task (three line-matching trials, 3 s each), allowing BOLD signal to return to baseline (in areas not involved in line matching).\n", - "416 \n", - " FMRI Insight Effect in RH aSTG(A) Voxels showing greater FMRI signal for insight than noninsight solutions, overlaid on the averaged normalized structural image of all subjects. The active area has a volume of 531 mm3 (peak t = 4.89 at 44, −9, −9 in Talairach space).(B) and (C) Group average signal change following the solution event, for insight (red line) and noninsight (blue line) solutions (yellow arrow indicates button press): (B) over entire LH aSTG region; (C) over entire RH aSTG region.(D) Insight solution signal change minus noninsight solution signal change, in RH aSTG (error bars show the standard error of the mean of the difference at each timepoint).\n", - "417 \n", - " FMRI Signal in RH aSTG during Initial Solving Efforts(A) Voxels in right temporal lobe showing baseline-to-peak event-related FMRI signal when subjects first encounter problems, overlaid on the averaged normalized structural image of all subjects. The cluster is in RH aSTG, with a volume of 469 mm3, with peak t value of 4.37 at 41, −6, −12 in Talairach space, clearly overlapping with the cluster showing an insight effect at solution.(B) Group average signal change following problem onset (time = 0), for the cluster defined by signal at the problem onset (green line) and the cluster (illustrated in Figure 2A) showing the insight effect at solution (white line). Error bars show the standard error of the mean of the difference at each time point.\n", - "418 \n", - " Gamma-Band Power for Insight and Noninsight Solutions(A) Grand average time course of EEG power (in v2) at 39 Hz estimated with the Morlet wavelet transform at right superior temporal electrode T8. The x-axis represents time (in seconds) with the yellow arrow and R marking the point in time of the solution button-press response (i.e., 0.0 s). The green horizontal bars above the x-axis represent the time intervals used in the statistical analyses and topographic maps. Note that gamma-band power for insight trials (red line) starts to increase above power on noninsight trials (blue line) by approximately 0.3 s before the button press.(B) Time-frequency plots of the insight minus noninsight difference shown in (A). The y-axis represents frequency (in Hz); the x-axis represents time (in seconds, with respect to the button press, exactly as shown in [A]). Red areas of the plot reflect times and frequencies at which insight EEG power is greater than noninsight EEG power; blue areas reflect times and frequencies at which noninsight EEG power is greater than insight EEG power. Note the sudden emergence of increased gamma power for insight solutions approximately 0.3 s before the button press.(C) Insight minus noninsight gamma-band differences plotted as topographic maps (LH and RH) of scalp current density (in v2/m2) estimated by a spline-based Laplacian transform computed with a realistic FMRI-derived head model. The Laplacian transform acts as a high-pass spatial filter that minimizes the contribution of activity distant from each electrode, thereby manifesting discrete, relatively superficial sources. The maps are thresholded to show foci of current density at the upper and lower 20% of the scale. Note the prominent effect of insight (effect for insight greater than effect for noninsight, in red) at the right superior temporal electrode (T8) and surrounding electrodes present from −0.30 to −0.02 s (measured with respect to the solution response) that is not present in the earlier epoch (−1.52 to −0.36 s). The blue area over left inferior parietal cortex (electrode P7) indicates that noninsight gamma power is nonsignificantly greater than insight power (F[1,19] < 1) over this region.\n", - "419 \n", - " Alpha-Band Power for Insight and Noninsight Solutions(Same conventions as in Figure 4). (A) Time course of EEG power at 9.8 Hz (in v2) at right parietal-occipital electrode (PO8). The x-axis represents time (in seconds), with the green horizontal bars above the x-axis representing the time intervals used in the statistical analyses and topographic maps. The yellow arrow and R (at 0.0 s) signify the time of the button-press response.(B) Time-frequency plots of the insight minus noninsight difference shown in (A).(C) Insight minus noninsight alpha-band differences plotted as topographic maps of scalp current density (in v2/m2). Note that alpha-band power is significantly greater for insight solutions than noninsight solutions during the −1.31 to −0.56 s interval, but not during the preceding (−2.06 to −1.56 s) or subsequent (−0.31 to +0.06 s) intervals. This alpha burst was embedded in a slow decrease in alpha (see [A]), probably reflecting a general increase in cortical activity as effort increases during the course of problem solving.\n", - "424 \n", - " Quality of Male–Male Dominance Interactions(A) Percentage of male approach–avoidance dominance interactions occurring between males more than two ranks apart.(B) Percentage of male approach–avoidance interactions occurring between males of adjacent ranks.(C) Percentage of approach–avoidance interactions representing a reversal of the direction of dominance within a dyad by a male more than two steps lower ranking. Mean ± SEM, ** and *** indicate p < 0.02 and p < 0.01, respectively, by t-test, treating each male/year as a data point. Data were derived from a total of ten different males in F93–96, 31 different males in T93–98, and 19 different males in F79–82. Potentially, the result in (B) could have arisen from different numbers of males in F93–96 versus the other two troops (a smaller group size does not change the number of adjacent animals available to any given subject, but decreases the number of nonadjacent animals available). However, the same results were found if the numbers of males in the three troops were artificially made equal by excluding excess males from either the top or the bottom of the hierarchy (data not shown).\n", - "425 \n", - " Quality of Affiliative Behaviors(A) Amount of grooming involving adult males in Forest Troop 1993–1996 and Talek Troop 1993–1996. The first pair of columns represents mean time adult males spent grooming adult females; the second pair, mean time adult males were groomed by adult females.(B) Comparison of average number of neighbors (i.e., within 3 m) of adult males in the two troops. Mean ± SEM. *, **, and *** indicate p < 0.05, 0.02, and 0.01, respectively, by unpaired t-test. Data were derived from a total of ten different males and 17 different females in F93–96, 31 different males and 21 different females in T93–98, and 19 different males and 23 different females in F79–82.\n", - "426 \n", - " Stress-Related Physiological Profiles(A) Basal glucocorticoid levels (μg/100 ml). Males were split into higher- and lower-ranking 50%, by approach–avoidance criteria. The primate glucocorticoid, cortisol, was measured by radioimmunoassay.(B) Number of anxiety-related behaviors observed 10–20 min after β-carboline-3-carboxylic acid administration (M-156, Research Biochemicals International, Natick, Massachusetts, United States), after subtracting the number observed 10–20 min after vehicle administration (dextrin in 1 ml saline); 0.5 g of the drug in 1ml saline was delivered intramuscularly by dart syringe (Pneu-Dart, Inc., Williamsport, Pennsylvania, United States) fired from a blowgun at 5 m. Mean ± SEM. * and *** indicate p < 0.05 and p < 0.01, respectively, by unpaired t-test. Data were derived from a total of ten different males in F93–96, 31 different males in T93–98, and 18 different males in F79–82.\n", - "427 \n", - " Quality of Interactions between Resident Females and Transfer Males(A) Latency, in days, until a newly transferred male is first groomed by a female (left) or presented to by a female (right).(B) Average number of adult female neighbors per scan (i.e., within 3 m; left) and average number of grooming bouts with females per 100 h of observation (right) for transfer males. Mean ± SEM. * and *** indicate p < 0.05 and p < 0.01, respectively, by unpaired t-test. Latency until first presented to by a female approached significance (p < 0.08). Data were derived from a total of ten different males and 17 different females in F93–96, and 31 different males and 21 different females in T93–98.\n", - "438 \n", - " The Effect of Trawling the Seafloor for Groundfish(A) The coral community and seabed on an untrawled seamount. (B) The exposed bedrock of a trawled seamount. Both are 1,000–2,000 meters (1094–2188 yards) below the surface. (Photo, with permission, by CSIRO Marine Research.)\n", - "442 \n", - " Percent of Literature Reporting Disease over Time in Each Taxonomic Group\n", - "rs is Spearman's ρ. α is controlled for multiple comparisons with Holm's sequential Bonferroni adjustments. (A) Turtle. (B) Coral bleaching and disease (closed square); coral disease including infectious bleaching (open circle); coral bleaching (asterisk). (C) Mammal. (D) Urchin. (E) Mollusc. (F) Seagrass. (G) Decapod. (H) Shark/ray. (I) Fish.\n", - "461 \n", - " Essential Genes and Protein Complex Subunits Minimize Noise in ExpressionBinning analysis of (A) essential genes and (B) protein complex subunits. All genes for which transcription and translation rate data were available were separated into 15 bins by their protein production rate. Each bin was then separated into thirds by number of translations per mRNA. The two-thirds in each bin with the most extreme transcription and translation are shown: black bars are the number of each type of gene (essential or complex subunit) in the third of each bin with the lowest number of translations per mRNA and the highest transcription rate, and thus low noise; gray bars are the number of each type of gene in the third with the highest number of translations per mRNA and the lowest transcripton rate, and thus high noise. Bins are ordered by their rate of protein synthesis. The number of asterisks indicates the Fisher's exact test probability of observing the values for each bin under the null model of independence. *, p ≤ 0.02; **, p < 0.005; ***, p < 0.0005.\n", - "462 \n", - " Anterior Neural Induction in Keller Explants Requires Chd(A) Proposed vertical and planar signals in neural induction (following Ruiz i Altaba 1993).(B) Diagram of Keller explant preparation and subsequent elongation of the endomesoderm by convergent extension (Keller 1991).(C) The neural and mesodermal regions of Keller explants contain descendants of BCNE cells (in blue) marked by blastomere injection at the 64-cell stage.(D) Expression of Otx2 and Krox20 in Keller explants (n = 7).(E) Injection of 17 ng Chd-MO completely blocked Otx2 and Krox20 expression in neural regions, while expression of Otx2 in anterior endoderm was not affected (n = 10).(F) The differentiated neuron marker N-tubulin is expressed in Keller explants (n = 8).(G) Partial inhibition of N-tubulin by injection of Chd-MO (n = 7).(H and I) Summary of the effects of Chd-MO in Keller explants. Abbreviations: SC, spinal cord; CG, cement gland; Epi, epidermis.(J) RT-PCR analyses of the effect of Chd-MO in Keller explants; samples injected with (plus) or without (minus) Chd-MO are indicated. Lane 1, whole embryos; lanes 2–7, Keller sandwiches. Note that expression of the neural markers NCAM and N-tubulin in Keller sandwiches was abolished by co-injection with 200 pg of dnFGF receptor 4a (dnFGF4a) mRNA and 17 ng of Chd-MO (lane 5). Injection with 600 pg of CerS mRNA, which eliminates mesoderm but not BCNE formation, does not affect neural induction in this assay (lane 6).\n", - "463 \n", - " Two Signaling Centers Coexist in the Xenopus Blastula(A) Diagram of early events between 1-cell stage and early blastula.(B–D) Expression of Chd, Nog, and Xnr3 transcripts just after midblastula transition (7 h postfertilization). Embryos were hybridized as whole mounts, stored in methanol for 1 mo at room temperature to improve contrast, and sectioned with a razor blade.(E) RT-PCR analysis of gene markers at midblastula, early stage 9. Six samples were prepared by dissections of blastula regions as shown in the diagram.(F) Summary of gene expression at blastula. The BCNE center expresses Chd, Nog, Siamois, and Xnr3, while the Nieuwkoop center expresses Xnr2, Xnr6, and Cer.\n", - "\n", - "464 \n", - " The BCNE Center Contributes to Forebrain and Midline Structures(A) Method used for lineage tracing of the BCNE center with biotin-dextran amine (BDA) labeled grafts.(B) Sagittal section of a recently grafted BCNE at stage 9.(C) Chd mRNA expression at stage 9.(D) BCNE descendants at stage 10.5.(E) Chd mRNA expression at stage 10.5.(F) BCNE center descendants at stage 11.(G) Dorsal view of BCNE descendants at neural plate stage 14.(H) Double staining of transplanted BCNE region with nuclear lacZ mRNA and epidermal ectoderm of the host with epidermal cytokeratin (epi) probe in light red at stage 14.(I) Transverse section at the level of the trunk at stage 16. Abbreviations: fp, floor plate; no, notochord.(J–L) Transverse sections at stage 40. Abbreviations: fp, floor plate; hb, hindbrain; he, heart; le, lens; mb, midbrain; no, notochord; ov, otic vesicle; re, retina.(M) Dorsal view of 6-d embryo transplanted with a BCNE graft from CMV-GFP transgenic embryos. Abbreviations: br, brain; fp, floor plate; on, optic nerve; op, olfactory placode.(N) Side view at 4 d showing labeled retina and brain. Abbreviation: br, brain.\n", - "465 \n", - " The Blastula Dorsal Animal Cap Is Specified to Form CNS(A) Experimental diagram showing embryos injected with CerS mRNA from which three regions of the animal cap were dissected at blastula, cultured until stage 26, and processed for RT-PCR. The size of the explants was 0.3 mm by 0.3 mm in these samples. Abbreviations: A, animal pole; D, dorsal region; V, ventral animal cap.(B) RT-PCR analysis of animal cap fragments; note that anterior brain markers were expressed in the dorsal fragments in the absence of mesoderm (α-actin) and endoderm (endodermin, Edd) differentiation. Abbreviations: A, animal pole; D, dorsal region; V, ventral animal cap.(C) Experimental diagram of the small animal cap sandwich experiments; these embryos were not injected with CerS. In this case, the size of the explants was 0.15 mm by 0.15 mm leaving a 0.15-mm gap from the floor of the blastocoel to avoid contamination from mesoderm-forming cells. Fragments from two explants were sandwiched together (explants are too small to heal by curling up) and cultured in 1× Steinberg's solution until stage 40. Abbreviations: VSW, ventral sandwich; DSW, dorsal sandwich.(D) Histological section of dorsal animal cap explant (dorsal sandwich). These sandwiches differentiated into histotypic forebrain tissue including white and gray matter (4/17). Abbrevations: DSW, dorsal sandwich; gm, gray matter; wm, white matter.(E) Histological section of a ventral animal cap sandwich. All sandwiches differentiated into atypical epidermis (n = 20). Abbreviations: ae, atypical epidermis; VSW, ventral sandwich.\n", - "466 \n", - " The Dorsal Animal Cap Is Required for Brain Formation(A) Ventral animal cap deletion (ΔV) produces a normal embryo.(B–F) Dorsal animal cap deletion (ΔD) results in loss of anterior brain structure. The headless phenotype of dorsal animal cap deletions was rescued by dorsal animal cap grafts (C) and animal pole grafts obtained from LiCl-treated embryos (E), but not by ventral animal cap transplants (D) or animal pole transplants (F). The average dorso-anterior indices (DAI) were 4.89 ([A] n = 28), 3.52 ([B] n = 25), 4.90 ([C] n = 10), 3.63 ([D] n = 19), 4.90 ([E] n = 12), and 3.50 ([F] n = 10).(G) Transplantation of the dorsal animal cap into the ventral animal cap region of a host embryo induced weak secondary axes (65.4%, n = 26). The embryo shown here was one of the strongest axes obtained.(H) Activity of BCNE transplanted ventrally was blocked by Chd-MO (n = 15).\n", - "467 \n", - " The CNS of Mesodermless Embryos Derives from BCNE Cells and Requires Chd, Nog, and β-Catenin(A) Experimental design. Embryos in which mesoderm induction was inhibited (by injection of 600 pg of CerS mRNA into the vegetal pole) were sectioned at stage 38 and stained with hematoxylin-eosin or for microinjected BDA lineage tracer marking the BCNE region.(B and C) Embryos injected with CerS mRNA alone (n = 40). Abbreviation: br, brain.(D and E) Embryos injected with 17 ng of Chd-MO in addition to CerS (n = 21). Abbreviation: epi, epidermis.(F and G) Coinjection of 17 ng of Chd-MO and CerS, followed by 100 pg of Chd mRNA together with the lineage tracer (n = 19). Abbreviation: br, brain.(H) Expression of anterior CNS markers in mesodermless embryos requires Chd and Nog. RT-PCR analysis of CerS mRNA–injected embryos at tailbud stage 26. Markers of anterior brain (Otx2), eye (Rx2a), midhindbrain boundary (En2), hindbrain (Krox20), and cement gland (XAG) were inhibited by injection of Chd-MO, Nog-MO, or both. A pan-neural marker (NCAM) and a neuronal marker (N-tubulin) were partially inhibited, and the posterior neural marker HoxB9 was not affected. α-actin serves as a mesoderm marker to show that CerS blocked mesoderm in these embryos and ODC as mRNA loading control. The effects of the Nog-MO described here can be rescued by full-length Nog mRNA lacking the 5′ leader sequence targeted by the antisense morpholino (data not shown).(I and J) β-cat-MO (13.6 ng) together with CerS mRNA (n = 15). Abbreviation: epi, epidermis.(K and L) Rescue of β-cat-MO by 800 pg of β-catenin mRNA. Abbreviation: br, brain.(M and N) Rescue of the β-cat-MO phenotype by 100 pg of Chd mRNA (n = 8).(O) Chd is required for the anterior neural induction caused by β-Catenin. Neural and cement gland markers were induced in animal cap explants by activation of β-Catenin signal by the injection of 600 pg β-catenin mRNA, dnGSK3 mRNA, or LiCl treatment (lanes 3–5). Markers of anterior brain (Six3, Otx2), eye (Rx2a), midhindbrain boundary (En2), hindbrain (Krox20), and cement gland (XAG) were inhibited by Chd-MO (lanes 6–8). Although inhibition was not detected for the posterior neural marker HoxB9 and the pan-neural marker NCAM, the neuronal marker N-tubulin was inhibited. α-actin and α-globin are dorsal and ventral mesoderm markers, respectively, used to show the absence of mesoderm formation, and ODC serves as loading control.\n", - "468 \n", - " A Double-Assurance Mechanism in Xenopus Neural Induction That Requires Chordin and Cerberus(A) A new Cer-MO is complementary to both Cer pseudoalleles, while two MOs reported by other authors (Hino et al. 2003; Silva et al. 2003) match only one allele, having three or four mismatches, respectively, with the other allele. The Cer-MO used in the present study inhibits head formation in intact embryos (data not shown), while the other two do not (Hino et al. 2003; Silva et al. 2003).(B) Experimental procedure and cell lineages at 32-cell and early gastrula (stage 10.5) for dorsal-animal (FDA, green) and dorsal-vegetal (TRDA, red) blastomeres microinjected at the 8-cell stage.(C and D) Uninjected embryos.(E and F) Dorsal-animal injection with 8.5 ng of Chd-MO alone partially inhibited head formation; green fluorescence was seen in anterior CNS.(G and H) Dorsal-vegetal injection with 17 ng of Cer-MO also inhibited brain formation partially; red fluorescence may be seen in anterior endomesoderm.(I and J) Injection with 8.5 ng Chd-MO dorsal-animally and 17 ng Cer-MO dorsal-vegetally blocked brain formation, but not spinal cord and somites (histological sections not shown).\n", - "470 \n", - " Functional MRN Is Required for the Response to DSBs, and Mre11–ATLD Separates Essential and Nonessential Mre11 Functions(A) The activity of protein kinases responsive to DSBs in Xenopus laevis egg extracts was monitored by incorporation of 32P from γ-32P-ATP into H2AX-derived peptides in the presence (plus DSB) or absence (minus DSB) of fragmented DNA. Labels: Wild-Type, H2AX substrate peptide containing serine 134 and serine 139; S134A, H2AX substrate peptide with a substitution of serine 134 to alanine; S139A, H2AX substrate peptide with a substitution of serine 139 to alanine; S134A/S139A, H2AX substrate peptide with a substitution of both serines to alanine.(B) Extract incubated with linear DNA at 50 ng/μl (equivalent to 4.5 × 1010 breaks/μl) was assayed with H2AX peptide in the presence of buffer (Control), ATM-neutralizing antibodies (ATM Ab), ATR-neutralizing antibodies (ATR Ab), ATM- and ATR-neutralizing antibodies (ATM/ATR Abs), ATM- and ATR-neutralizing antibodies in Ku70-depleted extracts (ATM/ATR Abs; Ku depletion), 5 mM caffeine (Caffeine).(C) DSB-responsive kinase activity was measured in the presence of 0, 5, 10, 25, and 50 ng/μl of linear DNA in control extract (filled diamonds), mock-depleted extract (open diamonds), Mre11-depleted extract (open squares), Mre11-depleted extract supplemented with 500 nM of recombinant MRN (filled squares), or Mre11-depleted extract supplemented with 500 nM MRN-ATLD1/2 (filled triangles).(D) DSB accumulation during DNA replication was monitored by TUNEL assay. Postreplicative nuclei were isolated from a control extract (stripes), Mre11-depleted extract (dots), Mre11-depleted extract supplemented with MRN (diamonds), Mre11-depleted extract supplemented with MRN-ATLD1/2 (gray) or mock-depleted extract (white).\n", - "471 \n", - " Requirements for the Assembly of DNA–Protein ComplexesElution profiles of α-32P-dATP-labeled 1 kb linear DNA from BioGel A15m chromatography columns. After loading, fractions 1–31 were collected and radioactivity was counted in a scintillation counter.(A–E) Complete elution profile. (A) Linear DNA alone. (B) Linear DNA incubated 2 h in extract at 22°C. (C) α-32P-dATP-labeled circular plasmid incubated for 2 h in extract at 22°C. (D) Linear DNA incubated with extract treated with 1 mg/ml proteinase K immediately prior to loading. (E) Linear DNA incubated in Mre11-depleted extract.(F and G) Excluded volume (fractions 6–14). (F) Linear DNA incubated in the following extracts: Mre11-depleted extract (open triangles), Mre11-depleted extract supplemented with 500 nM of MRN (filled triangles), Mre11-depleted extract supplemented with 500 nM of MRN-ATLD1/2 (open squares), or control extract supplemented with MRN (filled squares). (G) Linear DNA incubated in the following extracts: control extract (filled circles), extract treated with 5 mM caffeine (open circles), extract treated with TPEN at 100 μM (open diamonds).\n", - "472 \n", - " Mre11 Tethers DSB-Containing DNA(A) Control and treated extracts were incubated with α-32P-dATP-labeled DNA fragments and loaded onto BioGel A15 columns. Fractions 10 and 25 were collected and incubated with polyclonal antibodies against Mre11 or protein A beads alone. Beads were collected and washed, and radioactivity was counted in a scintillation counter. Shown are control extract (stripes), Mre11-depleted extract (dots), or Mre11-depleted extract supplemented with Mre11 that had been immunoprecipitated from the extract (diamonds), and extract incubated with beads alone (black).(B) Biotinylated DNA fragments were mixed with α-32P-dATP-labeled DNA fragments and incubated with various extracts. The extracts were then loaded onto BioGel A15 columns. Fractions 10 and 25 were collected and incubated with streptavidin-magnetic beads. Beads were collected and washed, and radioactivity was counted in a scintillation counter. Shown are control extract (stripes), Mre11-depleted extract (dots), Mre11-depleted extract supplemented with 500 nM MRN (diamonds), and streptavidin beads (black).\n", - "473 \n", - " DNA–Protein Complexes Are Signaling Centers Containing Active Mre11 and ATM(A) Western blot analysis of eluted fractions. Fraction numbers are indicated at bottom. Fractions were collected following chromatography of extracts incubated with fragmented (plus DSBs) or without fragmented DNA (minus DSBs). Samples from fractions were processed for SDS-PAGE and blotted with polyclonal antibodies against Mre11, ATM, and phosphorylated ATM.(B) Activity of ATM and ATR kinases in fractions 10 and 25. Extracts were incubated with DNA fragments and applied to BioGel A15m columns. Fraction 10 and fraction 25 from control extract were assayed for H2AX activity in presence of buffer (light gray), ATM-neutralizing antibodies (checks), ATR-neutralizing antibodies (dark gray), 300 μM vanillin (stripes), or 5 mM caffeine (black).(C) Activity of ATM and ATR kinases in fraction 10 and total extract. Control extracts or extracts supplemented with 500 nM recombinant MRN were incubated with DSBs and loaded onto BioGel A15m columns. Total control extract and fraction 10 were assayed for H2AX activity in the presence of buffer (light gray), ATM-neutralizing antibodies (checks), ATR-neutralizing antibodies (dark gray), or 5 mM caffeine (black).\n", - "477 \n", - " Glucose Stimulation and Ras2 or Gpa2 Activation Yield Similar Transcriptional Responses(A–E) Expression levels (represented as absolute intensity values from Affymetrix hybridization scans) of individual yeast genes (points) plotted for two different strains and conditions. Dotted red lines indicate 2-fold difference boundary.(A) Strain Y2864 (Wt) prior to glucose addition versus Y2866 (GAL-RAS2*) prior to galactose addition.(B) Strain Y2864 prior to glucose addition versus Y2876 (GAL-GPA2*) prior to galactose addition.(C) Strain Y2864 20 min after glucose addition versus 0 min after addition.(D) Strain Y2866 60 min after galactose addition versus Y2864 20 min after glucose addition.(E) Strain Y2876 60 min after galactose addition versus Y2864 20 min after glucose addition. Values are in log10.(F and G) Induction ratios (mRNA level at 60 min/mRNA level at 0 min) of genes in Y2866 (F) and Y2876 (G) versus induction ratios (mRNA level at 20 min/mRNA level at 0 min) for the same genes in Y2864. Values are in log2.\n", - "483 \n", - " Embryos with Defective Myocardial Function Do Not Form AV ECs(A–C) Fluorescence micrographs of embryos carrying a tie2::GFP transgene, visualized at 48 hpf. In (A), the endocardial ring is visible as a collection of GFP-positive cells at the AV boundary in wild-type (wt) embryos (red arrow). In (B), sih−/− embryos fail to form an AV ring at 48 hpf. In (C), cfk−/− embryos fail to form an AV ring at 48 hpf.(D and E) Cushion development remains defective in cfk−/− embryos. In (D), a 5 μm hematoxylin and eosin-stained plastic section shows the initial stages of cushion development at the AV boundary (red arrows) in a 72 hpf wild-type embryo, with the ECs being two to three cell layers thick at this stage. In (E), a cfk\n", - "−/− embryo at 72 hpf shows dilation of both chambers of a blood-filled heart with no evidence of cushion formation at the AV boundary (red arrows).(F and G) cfk−/− embryos fail to form ECs at late stages. Embryos were visualized at identical magnification after counter-staining with rhodamine phalloidin. Red blood cells (RBCs) are seen in the atria of the hearts. In (F), confocal microscopy of a 96 hpf wild-type heart from a tie2::GFP line shows triangular ECs at the AV boundary (blue arrows). In (G), cfk−/− embryos at 96 hpf lack cushion formation and clustering of GFP-positive cells at the AV boundary (blue arrows).(H) At 72 hpf, wild-type embryos have narrow hearts with forward blood flow through the embryo.(I) At 72 hpf, cfk−/− embryos have dilated hearts filled with blood that regurgitates freely from the ventricle to the atrium.(J and K) The initial phenotype in cfk−/− embryos is cardiac dilation at 36 hpf. In (J), wild-type embryos have a narrow ventricle and generate pulsatile flow at 36 hpf. In (K), cfk−/− embryos have an increased end-diastolic diameter (on average 1.18× wild-type, p < 0.01) and do not generate blood flow at 36 hpf.(L and M) Increased bmp-4 expression at the AV boundary (red arrow) is observed in wild-type (L) and cfk−/− (M) embryos at 42 hpf in anticipation of endocardial ring formation.(N) Orientation of the embryos shown in (L) and (M).\n", - "484 \n", - " Positional Cloning of cfk\n", - "(A) The locus on zebrafish LG13 containing cfk is shown, with the number of recombinants indicated below each marker. The one recombinant at the Sp6 end of BAC zC202M22 and the two recombinants at the T7 end of the same BAC define the critical region.(B) The first 52 kb of zebrafish BAC zC202M22 is shown, including the Sp6 end. One of the two recombinants from the T7 end of the BAC is still present at a marker at 52 kb, narrowing the critical region to this span. GenScan and BLAST analyses identified four coding sequences in this span, including abc-b10 (green), actin (red), a novel EST fv49b10 (black), and rab4a (blue).(C) Each of the three known genes identified on BAC zC202M22 has a homologue on scaffold 2777 of Fugu rubripes, in the same orientation (green, abc-b10; red, actin; blue, rab4a).(D) The same three genes lie in proximity to each other and in the same order on human Chromosome 1q42.13 (green, abc-b10; red, actin; blue, rab4a). Units in black are genes, predicted genes, or ESTs, which are unique in this region to that particular organism.\n", - "485 \n", - " Sequence and Expression Analysis of cfk\n", - "(A) cfk encodes a sarcomeric actin highly homologous to zebrafish α-cardiac and α-skeletal actins. Cfk differs from zebrafish α-cardiac actin at six residues and from zebrafish α-skeletal actin at four residues, but from zebrafish β-actin at 28 residues. Residues in red are those that differ from Cfk. Dots above the sequence indicate residues that universally distinguish sarcomeric from cytoplasmic actins. The arrow at R177 indicates the location of histidine in Cfks11.(B) The arginine at position 177 is universally conserved in all actin proteins examined.(C and D) cfk is expressed in the myocardium during development. In (C), whole-mount in situ hybridization on a cmlc2::GFP embryo at 36 hpf shows that cfk is expressed throughout the AP extent of the heart tube. Blue staining indicates areas of cfk expression; green is the region of cmlc2 expression. The red arrow indicates the heart tube. In (D), a plastic section of stained embryo shows cfk expression in the myocardium of the heart (blue arrow), but not in the endocardial cells (red arrow). From the onset of its expression in the heart region (around the 16-somite stage), cfk does not appear to be expressed in endothelial and endocardial cells. Weak cfk expression is also seen in the somites (data not shown).\n", - "486 \n", - " An Arginine to Histidine Change at Position 177 of Cfk Alters the Location of Positive Charges in the Nucleotide Binding Cleft of Actin(A) The position of R177 (red) in the structure of the yeast-actin monomer. The bound ATP is shown in green. The structure shown is based on a crystal structure of actin (PDB:1YAG).(B) Magnification of the cleft region showing the hydrogen bonding (green dashed lines) involving R177, which will be disrupted in H177.(C) The R177H mutation restricts yeast growth under hyperosmolar stress. Wild-type (wt) and mutant cells were grown to a density of 3 × 106 per milliliter, and aliquots were plated either on YPD or YPD plus 0.9 M NaCl at different dilutions of the culture. The cells were then incubated at 30°C for 72 h. The normosmolar and hyperosmolar experiments were done at different times.(D) Purified R177H actin has a higher critical concentration of polymerization and a delayed nucleation phase. Wild-type or mutant actin was purified from yeast cultures and polymerization mea-sured by light diffraction. Symbols and abbreviations: circles, 5 μM wild-type actin; triangles, 5 μM R177H actin; diamonds, 7.5 μM R177H actin; squares, 10 μM R177H actin; ATP, adenine triphosphate; wt, wild-type.\n", - "487 \n", - " Lack of EC Formation Is Secondary to Defective Myocardial Function(A) Embryos were observed for defective myocardial function and lack of blood flow at 36 hpf and lack of endocardial ring formation at 48 hpf. Approximately half of the embryos with defective myocardial function at 36 hpf did not develop endocardial rings. All embryos with a lack of endocardial rings previously demonstrated a myocardial function phenotype at 36 hpf. Further analyses including the genotyping of a subset of embryos showed that a small percentage of cfk−/− embryos were unaffected at 36 hpf and that they subsequently developed ECs.(B) Embryos treated from 24 to 48 hpf with 2,3-BDM to decrease myocardial force failed to develop endocardial rings in a dose-dependent manner. Loss of ring formation was not linked to loss of blood flow—14% of embryos treated at 4 mM 2,3-BDM did not form rings despite the presence of blood flow, and 58% of embryos treated at 6 mM did form rings despite the absence of blood flow.(C) Example of an embryo treated with 10 mM 2,3-BDM that failed to develop an endocardial ring at the AV boundary (red arrow).\n", - "488 \n", - " Pax7 Is Required for the Myogenic Specification of CD45+:Sca1+ Cells(A) Flow cytometric analysis of cell suspensions derived from uninjured and regenerating wild-type and Pax7\n", - " −/− muscle (4 d after ctx injection) showed an increased proportion of CD45+ cells in Pax7\n", - " −/− samples.(B and C) Pax7 protein was expressed in approximately 6%–10% of CD45+:Sca1+ cells purified from regenerating Pax7 +/− muscle.(D–K) MyoD (D and E) and Desmin (F and G) were induced in CD45+:Sca1+ cells from regenerating Pax7 +/− but were not expressed in CD45+:Sca1+ cells from regenerating Pax7\n", - " −/− muscle (H–K).\n", - "489 \n", - " Pax7 Induces Myogenic Commitment in CD45+:Sca1+ Cells(A) Western blot analysis with anti-Pax7 antibody confirmed high levels of ectopic Pax7 in C3H10T1/2 cells infected with retrovirus-Pax7 (HAN-Pax7) but not with control virus expressing a puromycin-resistance marker (HAN-puro).(B and C) HAN-Pax7 did not induce expression of myogenin in C3H10T1/2 cells.(D and E) By contrast, MyoD virus (HAN-MyoD) efficiently converted C3H10T1/2 cells to myogenin-expressing myocytes (green) .(F–I) HAN-Pax7 (F and G) but not HAN-puro (H and I) activated expression of MyoD (red) in CD45+:Sca1+ cells from uninjured muscle.(J–M) HAN-Pax7 (J) but not HAN-puro (K) also induced Myf5nLacZ expression in CD45+:Sca1+ cells. Furthermore, HAN-Pax7-infected CD45+:Sca1+ cultures differentiated into MyHC-expressing myocytes (green) under differentiation conditions (L), whereas HAN-puro-infected cells did not undergo myogenic differentiation (M). DAPI staining (blue) was used to visualize all nuclei.\n", - "491 \n", - " CDSC-Pax7 Cells Express High Levels of Myf5 and Sca1(A) Western blot analysis of CDSC-Pax7 cells in proliferation conditions (day 0) and during differentiation (days 1–4) revealed high levels of Myf5 expression and low levels of MyoD expression. By contrast, satellite-cell-derived myoblasts (Wt-Mb) displayed the opposite profile of Myf5 and MyoD expression. Myogenin (Myg) was upregulated during the differentiation of CDSC-Pax7 and satellite-cell-derived myoblasts (Wt-diff). Note the sustained expression of Pax7 during the differentiation of CDSC-Pax7 cells. C3H10T1/2 (10T) lysate was used as a negative control.(B) RT-PCR analysis indicated that CDSC-Pax7 cells (two different lines) upregulated the endogenous Pax7 mRNA. Satellite-cell-derived myoblasts (Wt-Mb) and Jurkat cells were used as positive and negative controls, respectively.(C) Flow cytometry indicated that CDSC-Pax7 cells lost expression of CD45 but retained high levels of Sca1. About 24% of satellite-cell-derived myoblasts (wt-myoblasts) expressed low levels of Sca1. (Black graph depicts staining with IgG-PE control antibody; red graph shows target staining using Sca1-PE or CD45-PE.)\n", - "492 \n", - " CDSC-Pax7 Cells Efficiently Contribute to the Repair of Dystrophic Muscle(A) Wild-type muscle expressed dystrophin at the plasmalemma of all myofibers.(B) Dystrophin protein was not detected in muscle sections from dystrophin-deficient mdx:nude mice (mdx:nu).\n", - "(C–F) CDSC-Pax7 cells differentiated in vivo after transplantation, readily forming large numbers of dystrophin-expressing myofibers (green) in mdx:nude muscle (C and D). Serial cross sections showing the viral expression of Pax7 protein in central nuclei of regenerated fibers (red staining in [E]) confirmed the donor origin of dystrophin-positive myofibers (red staining in [F]).\n", - "493 \n", - " Pax7 Does Not Induce Myogenesis in CD45+:Sca1+ Cells from Pax7\n", - " −/− Muscle(A) Northern analysis shows that MyoD\n", - "−/− satellite-cell-derived myoblasts (MD\n", - "−/− M) and differentiating cells (MD\n", - "−/− D) express endogenous Pax7 (upper arrow, Pax7 blot) and Myf5 transcripts. Pax7 \n", - "−/− CD45+:Sca1+ cells (CDSC) transduced with HAN-Pax7 (+Pax7) or HAN-puro (+puro) did not initiate expression of Myf5 mRNA. The retroviral transcript producing Pax7 (lower arrow) is smaller than the endogenous Pax7 mRNA (e.g., lower arrow).(B–D) Ectopic expression of Pax7 (red) (B) in Pax7\n", - " −/− CDSC cells did not induce Myf5 protein expression (C). DAPI staining (blue) was used to visualize nuclei (D).\n", - "495 \n", - " Adenovirus-Pax7 Significantly Improves Regeneration In Vivo(A and B) Infection of ctx-damaged Pax7\n", - " −/− muscles with Ad-Pax7 resulted in markedly improved muscle integrity and a significantly increased number of Desmin immunoreactive (green) regenerated fibers (B) relative to muscles treated with Ad-LacZ (A).(C and D) Hematoxylin and Eosin staining similarly showed an increased number of centrally nucleated fibers in Ad-Pax7-treated Pax7\n", - " −/− muscles.(E) In three separate experimental trials, the number of regenerated fibers was markedly increased in Ad-Pax7-treated muscles relative to Ad-LacZ; however, the response was biologically variable between groups. On average, Ad-Pax7 infection resulted in a 4.1 ± 0.72–fold increase in regenerated Pax7\n", - " −/− myofibers (F).\n", - "496 \n", - " Brain and Liver Transcriptome Change among Primates as a Function of TimeAverage expression differences within and between primates in brains (A), in liver (B), and for genes in brain for genes with high (red) and low (blue) variation among six humans (C). Colors: red, comparisons between and with humans; blue, comparisons between and with chimpanzees; purple, comparisons between humans and chimpanzees; orange, comparisons between orangutan and rhesus macaque; black, comparisons between experimental duplicates. Vertical error bars for expression indicate 95% confidence intervals calculated by 10,000 bootstraps over genes. Divergence times are according to Glazko and Nei (2003).\n", - "498 \n", - " Brain Transcriptome Change among Mice as a Function of TimeAverage expression differences within and between the mouse species (A) and for genes with high (red) and low (blue) variation among M. musculus individuals (B). Colors: red, comparisons between and with M. musculus; blue, between and with M. spretus; purple, between M. musculus and M. spretus. Vertical error bars for expression indicate 95% confidence intervals calculated by 10,000 bootstraps over genes. Divergence times are according to She et al. (1990).\n", - "499 \n", - " Comparison between Intact Genes and Pseudogenes(A) shows the distributions of expression divergence between humans and chimpanzees for intact genes and pseudogenes. (B) shows the distributions of the ratio of expression divergence between humans and chimpanzees and expression diversity within humans for intact genes and pseudogenes.\n", - "500 \n", - " Transcriptome Change among Brain Regions as a Function of Evolutionary Time(A) Schematic evolutionary tree for six human brain regions: B.44, Brodmann's area 44; PFC, prefrontal cortex; ACC, anterior cingulate cortex; PVC, primary visual cortex; CN, caudate nucleus; and CB, cerebellum. Numbers indicate approximate divergence time in millions of years (Butler and Hodos 1996; Nieuwenhuys et al. 1998).(B) Average expression differences among brain regions in humans (red) and in chimpanzees (blue).(C) Average expression differences among brain regions in M. musculus. Error bars for expression indicate 95% confidence intervals calculated from 10,000 bootstrap replications over genes.\n", - "505 \n", - " Spindle Cell Tumors Resembling MPNSTs in Zebrafish Heterozygous for Mutations in RP Genes(A and B) Fish with apparent masses, as indicated by the arrows, or other evident pathology were selected for histological analysis: (A) a hi2582 fish, (B) a hi1034B fish.(C–H) Histopathology of representative tumors stained with hematoxylin and eosin reveals patterns consistent with the diagnosis of MPNST in hi10 fish (C and D), hi1974 fish (E–G), and hi1807 fish (H).(C) Tumors typically filled the entire abdomen (sb, swim bladder; br, brain) (80×).(D) A large tumor with central necrosis is seen emanating from the optic nerve (n) (e, eye) (20×).(E) Tumors consist of spindle cells that stack into short fascicles, typically organizing into whorls (400×).(F) Tumor is aggressively invading muscle (m) and gill (g) (br, brain) (100×).(G) Mitotic figures (arrows) are evident (1000×).(H) Areas of focal necrosis (arrows) are frequently seen (200×).\n", - "508 \n", - " RP Genes Appear to Be Haploinsufficient Tumor Suppressors(A) RP mutations decrease the amount of RP gene expression. RNA was prepared from 3-d-old homozygous mutant embryos and their wild-type siblings, and serial dilutions of first strand cDNA were used as templates for PCR. The decrease in expression in the mutants can be determined by the difference in the dilution between wild type and mutant where the PCR product amount diminishes. The actin control shows that the total amount of mRNA was the same between samples.(B) LOH is not observed in RP mutant tumors. DNA was prepared from tumors (T) and normal tissue (N) from the same fish, and PCR was conducted with three primers that show the presence or absence of both the insert-bearing (mutant) and wild-type chromosomes. In each case, the upper band is the wild-type chromosome and the lower band is the insert-bearing one. hi10 fish #1 normal (lane 1), tumor (lane 2); hi10 fish #2 normal (lane 3), tumor (lane 4); hi258 fish normal (lane 5), tumor (lane 6); hi1974 fish normal (lane 7), tumor (lane 8).\n", - "510 \n", - " Reversal Learning and the Orbitofrontal Cortex(A) Lateral and ventral views of the surface reconstructions of the lateral and medial orbitofrontal cortex lesions in monkeys (adapted from Iversen and Mishkin 1970), with the former monkeys having difficulty with the reversal task.(B) A ventral view of the human brain, with the cerebellum removed. Red activations in the lateral orbitofrontal cortex indicate the maximal activation for reversal compared to stable acquisition events. Blue activations indicate the main effects of facial expression (adapted from Kringelbach and Rolls 2003).\n", - "512 \n", - " Comparison of Published and Photocopied FiguresExample of an image that, when seen in color (A), is rich with information; much of this information is lost when it is photocopied by students (B), as when the original is held on reserve in the library, as is required for subscription-based journals, or is provided via interlibrary loan. This image of a developing fly embryo was labeled to reveal bands of differentially expressed proteins, with HAIRY in red, KRüPPEL in green, and GIANT in blue. (Image courtesy of Stephen W. Paddock, Jim Langeland, and Sean Carroll at the University of Wisconsin–Madison.)\n", - "533 \n", - " The Segment Polarity Pattern and the Behavior of Different Cells(A) Parasegments in the segment polarity pattern. The prepattern, with stripes of wg and en expression, and the final segment polarity pattern are shown. The parasegment is the basic developmental unit in the segment polarity pattern, but segment boundaries within the adult insect are offset from the parasegment boundary.(B) A simple set of rules sufficient to achieve segment polarity patterning. Cells expressing wg must continue to express wg, en-expressing cells must continue to express en and begin expressing hh, and cells expressing neither wg nor en cannot begin expressing either.(C) The behavior of isolated cells for parameter sets that form the segment polarity pattern. These are like the simple rules in (B), but en expression depends on a wg-expressing neighbor.\n", - "534 \n", - " The Regulatory Networks in the Segment Polarity Models(A) The regulatory network used in the von Dassow et al. (2000) model. Dashed lines indicate interactions added by the original authors in order to achieve proper patterning, while solid lines indicate interactions based on experimental observations. The positive feedback system including wg is in blue, while the one involving en is green and red. The en feedback involves mutual inhibition of en and ci, so one side of the mutual inhibition scheme is drawn in green while the other is drawn in red. When the green species are active, they will repress the red ones, and vice versa. Adapted from von Dassow et al. (2000).(B) The regulatory network of the model developed here. The positive feedback systems are colored as in (A). The en feedback involves mutual inhibition of slp, however, and ci does not play a role in the en feedback system.\n", - "535 \n", - " The Segment Polarity Pattern After Cell Proliferation(A) Parasegments in the segment polarity pattern during cell proliferation. During cell proliferation, each cell duplicates into two cells that initially have identical gene expression. This yields wide stripes of wg and en expression at parasegment boundaries immediately after cell proliferation. Subsequently, differences in intercellular signaling cause the stripes of wg and en narrow.(B) A simple set of rules sufficient to maintain narrow boundaries after cell proliferation. These are like the simple rules in Figure 1C, but wg expression also depends on a hh-expressing neighbor.\n", - "536 \n", - " Inequalities Necessary for Bistability Are Satisfied by Working Parameter Sets(A) Subnetwork responsible for wg expression bistability. Levels of intercellular WG in a cell with full wg expression and in an adjacent cell can be computed from the transfer rates EndoWG, ExoWG, LMxferWG, and MxferWG; and the decay rates HEWG and HIWG, using the linearity of WG transport processes.(B and C) Intercellular WG levels in a cell expressing wg (green) and in an adjacent cell (red) were plotted against KWG→wg, the threshold level of intercellular WG protein needed for wg autoactivation. In (B), parameter sets that maintain the segment polarity pattern were used, while in (C) random parameter sets were used.(D) Levels of extracellular WG signalling to a cell adjacent to two with full wg expression were computed as described above. These were plotted against KEWG→en, the threshold level of extracellular WG signal needed to activate en expression.(E) Steady-state levels of CN in the absence of en expression plotted against KCN┤en, the threshold level needed to repress en expression.\n", - "537 \n", - " Inequalities Necessary for Bistability in the Modified Segment Polarity Model(A) Intercellular WG levels in a cell that expresses wg (green) and that does not express wg (red) were plotted against KWG→wgfor each parameter set that forms the segment polarity pattern, as in Figure 4B. In both cases, cells are receiving maximal HH signal from two neighbors.(B) Intercellular WG levels in a cell that is expressing wg but is no longer receiving HH signal from any neighbors were plotted against KWG→wg. Parameter sets that can produce the proper pattern after proliferation, including narrow stripes of wg expression, are shown in green while those that fail to do so are shown in red.\n", - "538 \n", - " The Spatial Organization of SpeciesLetters represent different PID species. Numbered rectangles represent different countries or areas.(A) Nested organization of species. Applying Diamond's theory, we here distinguish (1) “high-S” species, like species E, which are exclusively confined to the most species-rich communities; and (2) “tramps,” like species A, which occur mostly in richer communities but also in species-poor communities (e.g., measles, which is found in virtually every country). Thus, this nested pattern implies that some pathogens are restricted to the tropics, while others, more ubiquitous species, are widely and regularly distributed all over the world.(B) Random distribution of species, where no spatial organization occurs (see also Materials and Methods).\n", - "539 \n", - " The Latitudinal Gradients of PID Species(A) Relationship between PID species richness and latitude across the two hemispheres. Linear relationships between PID species richness and latitude (dotted lines) are highly significant (F = 12.29, df = 29, p = 0.0015 and F = 18.01, df = 130, p < 0.0001 for Southern and Northern hemispheres, respectively). No difference in disease species richness with latitude across the two hemispheres was observed (interaction: F = 2.68, df = 159, p = 0.1036). Residuals of PID species richness on the y axis were extracted from minimal models controlling for the effects of confounding factors on PID species diversity estimates (see Materials and Methods). Locally weighted regression (tension 0.5) did not change the general linear shape. Latitude is expressed in minute degrees.(B) Presence/absence matrix for the 229 distinct PID species across the hemispheres. The figure was generated by the Nestedness Temperature Calculator (see Atmar and Patterson 1995). The distribution is nonsymetrical because of the 224 studied countries, 172 countries are found in the Northern hemisphere versus only 52 in the Southern one. (B) indicates that PID species diversity decreases as one moves northwards or southwards from the equator. The black exponential curves are the occurrence boundary lines (see Materials and Methods). The color scale indicates the nonuniform probability of state occupancy among all of the cells of the matrix, i.e., the probability of encountering a species as function of its position in the matrix. Black cells are highly predictable presences, whereas red cells are unexpected presences.(C) Monte Carlo–derived histogram after 1,000 permutations. The histogram represents the 1,000 values obtained after Monte Carlo permutations. The average theoretical value under the null hypothesis is compared to our real value, to assess the likelihood that the parent matrix was nonrandomly generated. The probability is highly significant (p < 0.0001), confirming that the spatial organization of PID species richness on the largest scale matches the nested species subset hierarchy illustrated in Figure 1A. The symmetrical Gaussian distribution indicates that 1,000 permutations are enough to obtain reliable variance estimates for probability calculations.\n", - "540 \n", - " Models of Hybrid Incompatibility(A) D-M model of HI evolution. We diagram here an X–autosome incompatibility; for simplicity only haploid genotypes are shown. This model can be easily extended to include more complex multilocus interactions. (1) The ancestral species is fixed for the X-linked allele x and the autosomal allele a. (2) As the two species independently diverge, one becomes fixed for allele X at the first locus and the other for allele A at the second locus. (3) HI is caused by the interaction between these derived alleles, X and A. (4) This interaction may cause misregulation of downstream effector genes (d1, d2, and d3), which in turn causes the HI phenotype.(B) Hmr is an HI gene. Hmrmel has evolved in the D. melanogaster lineage and interacts to cause HI with Asib, an allele of a hypothesized autosomal gene that has evolved in the sibling-species lineage. Mutations in Hmrmel allow hybrid viability by eliminating the activity of this incompatibility allele.(C) Hmr is a downstream effector gene. Here, two unknown genes cause HI by misregulating Hmr. Mutations in Hmr allow hybrid viability by acting as downstream suppressors of the HI alleles.(D) Model with Hmr and gene A extensively diverging (see Discussion). Both Hmr and gene A coevolve with many changes along both lineages. HI could be caused by interactions between derived alleles or between a derived and an ancestral allele. All models to identify the codons in Hmr responsible for functional divergence have two constraints: first, that Hmr and gene A must be fully compatible with each other in each lineage, and second, that candidate codons must differ between Hmrsib from all three sibling species and Hmrmel.\n", - "\n", - "541 \n", - " Structure and Expression of Sibling-Species Hmr+ Transgenes(A) Diagram of Hmr+ transgenic constructs. The Hmr gene structure is shown, with the rightward arrow indicating the predicted translation start site. Sibling-species constructs used in this study are shown, together with D. melanogaster constructs previously shown (Barbash et al. 2003) to be Hmr+.\n", - "(B) Restriction map of RT-PCR fragments spanning part of exons 3 and 4, showing diagnostic restriction site polymorphisms found in the transgenic alleles and the stocks used to assay them. The D. melanogaster map corresponds to both the Hmr1 and In(1)AB rescue alleles, as well as all D. melanogaster alleles from our population sample.(C) RT-PCR products from interspecific hybrids. Hybrids were from the crosses described in Table 1. RNA was collected from 48- to 72-h-old larvae and 2- to 4-d-old adult males. Note that larval samples contain RNA from males and females, half of whom carry the sibling-species Hmr+ transgene. The portion of the PCR product derived from the transgenes is that digested by XbaI or HpaI for the D. simulans and D. mauritiana transgenes, respectively.M, 100-bp ladder marker; G, undigested PCR from an Hmr genomic clone (this product contains a 59-bp intron); cD, undigested PCR from an Hmr cDNA clone. The following are all RT-PCR products: U, undigested; C, ClaI-digested; H, HindIII-digested; X, XbaI-digested; C/X, ClaI- and XbaI-digested; Hp, HpaI-digested; C/Hp, ClaI- and HpaI-digested; –, control containing no reverse transcriptase. Note that undigested lanes (U) contain half the amount of DNA as digested samples.\n", - "549 \n", - " Stretching DNA Molecules by Capillary Action(A) Lengths of 219 unbroken Raji EBV episomes with a recognizable hybridization pattern. These molecules were stretched by the movement of a DNA solution between a silanized microscope slide and a nonsilanized coverslip. About 94% of these molecules have a size of 70 μm (±15 μm), corresponding to about 2.4 kb/μm.(B) Schematic of the PacI-linearized Raji EBV genome with the positions of various genetic elements shown to scale. The initiation site oriP is shown in green with the FR element and the DS element indicated by green boxes. The positions of EBER genes (black box), terminal repeats (smaller red box), internal repeats 1 (larger red box), and the restriction sites utilized in this study (PacI and SwaI) are also indicated.(C) Images of 6 PacI-linearized Raji EBV episomes aligned with the EBV map after hybridization and immunostaining of the DNA molecules and digital adjustment of length. The hybridization signals are shown in blue. Immunostaining to detect the halogenated nucleotides is shown by red and green. Vertical light blue lines indicate the positions of the ends of the hybridization probes and yellow lines, the position of the PacI site used to linearize the EBV episomes. All the molecules shown in this figure represent EBV episomes duplicated during either the first labeling period (red) or the second labeling period (green). The quality of the alignment of the images with the EBV map is comparable to the alignment previously obtained with combed EBV episomes (Norio and Schildkraut 2001). The resolution of analysis is limited to about 5 kb primarily because of discontinuities in the fluorescent signals, as previously reported for similar assays (Parra and Windle 1993; Jackson and Pombo 1998; van de Rijke et al. 2000).\n", - "550 \n", - " SMARD Performed on PacI-Linearized EBV Episomes Replicated in Raji Cells(A) Map of the PacI-linearized EBV genome with the positions of various genetic elements shown to scale. Below the EBV map, light blue bars indicate the positions of the hybridization probes (p107.5 and pSalF) utilized during SMARD to identify the molecules of interest and their orientation. Gray bars (a–h), and black bars (1–10), indicate the positions of the restriction fragments analyzed by 2D gel electrophoresis.(B) PacI-linearized Raji EBV episomes after hybridization and immunostaining of the DNA molecules (aligned with the map). These molecules incorporated both halogenated nucleotides, and the images are ordered (from 1 to 48) by increasing content of DNA labeled during the first labeling period (red). One additional molecule was unsuitable for precise measurements and is not shown. Vertical light blue lines indicate the positions of the ends of the hybridization probes and yellow lines, the position of the PacI site. Arrowheads mark the approximate position of the red-to-green transitions. Asterisks indicate the position of short colored patches not necessarily related to DNA replication.(C) Replication profile of the Raji EBV episomes. This profile was obtained using both the images shown in (B) and the images collected in a previous SMARD experiment (Norio and Schildkraut 2001), for a total of 69 episomes. Starting from the PacI site, genomic intervals of 5 kb are indicated on the horizontal axis by numbers from 1 to 35. The vertical axis indicates the percentage of molecules stained red within each 5-kb interval.(D) Profile of replication fork abundance and direction throughout the EBV genome. Genomic intervals of 5 kb are indicated on the horizontal axis as for (C). The vertical axis indicates the percentage of molecules (out of a population of 69 episomes) containing replication forks (red-to-green transitions) within each 5-kb interval. The forks moving from left to right are depicted in orange. The forks moving from right to left are depicted in yellow.(E) Map of the EBV genome aligned with the horizontal axes of histograms (C) and (D), and with the restriction fragments analyzed by 2D gel electrophoresis (black and gray bars below the map). Green Is indicate the presence of replication bubbles. Red Ts indicate the presence of replication intermediates produced by random termination events. Replication bubbles were detected by 2D gel electrophoresis across the region marked by the red dashed line (approximately corresponding to the RRF).(F) Transcription of the Raji EBV genome. Red arrows mark the positions of regions that can be transcribed during latency. The level of transcription derived by nuclear run-on according to Kirchner et al. (1991) is shown as gray scale (black = highest level; white = lowest level or not transcribed). The EBER genes represent the most intensively transcribed portion of the EBV genome. Intermediate levels of transcription were detected across and downstream from the long transcription unit of the EBNA genes. According to Sample and Kieff (1990), the level of transcription along the EBNA genes region decreases from left to right (I–III). Intermediate levels of transcription were also reported for the two hatched regions. However, these regions contain either repeated sequences (the terminal repeats) or cross-hybridize with other transcribed regions (oriLytR and oriLytL); therefore, their actual level of transcription could be lower.\n", - "551 \n", - " SMARD Performed on SwaI-Digested EBV Episomes Replicated in Raji Cells(A) Map of the approximately 105-kb fragment obtained by digesting EBV episomes with the restriction endonuclease SwaI.(B) Images of 36 EBV molecules ordered and marked as in Figure 3B. Molecules 18 and 19 are distorted, but the positions of the red-to-green transitions are clear.(C) Replication profile of the SwaI-digested EBV episomes shown in (B). Starting from the SwaI site, intervals of 5 kb are indicated on the horizontal axis by numbers from 1 to 21. The vertical axis indicates the percentage of molecules stained red within each 5-kb interval.(D) Profile of replication fork abundance and direction. Intervals of 5 kb are indicated on the horizontal axis as for (C). The vertical axis indicates the percentage of molecules containing replication forks in each 5-kb interval. The partitioning of the EBV genome is different from Figure 3D. Hence, the four pausing sites that in Figure 3D were located within interval 8 are here located between interval 13 and interval 14. As a consequence, the peak visible in Figure 3D is here split into two smaller adjacent peaks.(E) Map of the approximately 105-kb SwaI fragment aligned with the horizontal axes of histograms (C) and (D).\n", - "552 \n", - " Duplication Speed of Various Segments of the Raji EBV Genome(A) A detailed procedure to calculate Td using SMARD was published elsewhere (Norio and Schildkraut 2001). Here we describe how to calculate Tdab for a generic genomic region (a)–(b) (i.e., any portion of the EBV genome) using information derived from the replication patterns of a longer region (A)–(B) (i.e., the whole EBV genome). Depicted are the hypothetical staining patterns for 32 DNA molecules representing the genomic region (A)–(B) after double-labeling with two halogenated nucleotides (red and green). The molecules that started and completed their duplication during the first labeling period are fully red (R). The molecules that started their duplication during the first labeling period, completing it during the second labeling period are stained in both red and green (RG). In the total population of molecules, the fraction of R molecules increases when the length of the first labeling period (Tp1) increases. The fraction of RG molecules is proportional to the time required to duplicate the genomic region (A)–(B). Some of these molecules (marked rg) are stained in red and green also within the region (a)–(b). The fraction of rg molecules is proportional to the time required to duplicate the genomic region (a)–(b). This relationship is expressed by the equation reported at the bottom of the figure and allows us to calculate Tdab using parameters that can be easily measured on individual DNA molecules (NR, the number of R molecules; NRG, the number of RG molecules; Nrg, the number of rg molecules). Finally, the ratio between the size of the genomic segments analyzed (Lab) and Tdab represents the duplication speed of the segment (Sdab). The results obtained from the PacI and the SwaI experiments are reported in (B) and (C). Double-headed arrows indicate the genomic segments analyzed quantitatively. Segments marked with the same letter in the two maps correspond to identical portions of the Raji EBV genome. Above each arrow is indicated the corresponding Sd value in kilobases per minute. The sizes of these segments are as follows: A–G, 25 kb; H, 20 kb; I, 35 kb; K, 10 kb; L, 75 kb; and J, 10 kb. A comparison of the values obtained from the two experiments shows remarkable similarities. The largest variation was found for segment G. However, in both experiments this segment was located at the end of the DNA molecules. Therefore, the variability in stretching in this portion of the molecules may have affected the collection of the data. The red dashed line below the map indicates the position of the RRF.\n", - "553 \n", - " SMARD Performed on PacI-Linearized EBV Episomes Replicated in Mutu I Cells(A) Map of the PacI-linearized EBV genome with the positions of various genetic elements shown to scale. Below the EBV map, light blue bars show the positions of the hybridization probes (pWW and pSalF) utilized to identify the EBV molecules and their orientation. Black bars indicate the positions of two short deletions present in the Raji EBV genome (Polack et al. 1984).(B) Images of 40 PacI-linearized EBV episomes ordered and marked as in Figure 3B (from a population of 42 molecules collected in this experiment). Some molecules are distorted but the positions of the red-to-green transitions are clear. Two additional molecules were unsuitable for precise measurements and are not shown.(C) Replication profile of the PacI-linearized EBV episomes shown in (B). Starting from the PacI site, intervals of 5 kb are indicated on the horizontal axis by numbers from 1 to 35. The vertical axis indicates the percentage of molecules stained red within each 5-kb interval.(D) Profile of replication fork abundance and direction. Intervals of 5 kb are indicated on the horizontal axis as for (C). The vertical axis indicates the percentage of molecules containing replication forks in each 5-kb interval. Three different pausing sites contribute to the significant accumulation of replication forks within interval 8 (the two EBER genes and the FR element). A fourth pausing site (the DS element) is located within interval 9, producing a minor accumulation of replication forks.(E) Map of the EBV genome (to scale) aligned with the horizontal axes of histograms (C) and (D). Red arrows mark the positions of regions transcribed during the type I latency that characterize the Mutu I EBV episomes. The red dashed line above the map indicates the position of the RRF.(F) Duplication speed for various segments of the Mutu I EBV genome. Double-headed arrows indicate the genomic segments analyzed quantitatively. Above each arrow is indicated the corresponding Sd value in kilobases per minute. Segments A′–G′ divide the whole EBV genome into seven parts of identical size, corresponding, respectively, to the intervals 1–5, 6–10, 11–15, 16–20, 21–25, 26–30, and 31–35 on the horizontal axes of Figures 3C and 4C. The sizes of these segments are as follows: A′–G′, 25 kb; and K′, L′, and M′, 10 kb. Due to the presence of small differences in the DNA sequence (see text), segments A′–G′ are similar but not identical to segments A–G in Figure 5.\n", - "556 \n", - " Formation of Intersubunit Disulfide Bonds in the TM Domain of Resting αIIbβ3\n", - "(A) 293T cells were transiently transfected with the indicated integrin constructs and metabolically labeled, and were untreated (–) or oxidized with Cu-phenanthroline on ice for 10 min (+), and then lysates were immunoprecipitated with mouse mAb 10E5 against αIIbβ3, followed by SDS-7.5% PAGE under nonreducing conditions and fluorography. Positions of molecular size markers are shown on the left.(B) Disulfide bond formation efficiency. For each residue pair, the radioactivity of the αβ heterodimer band divided by the total radioactivity (sum of α, β, and αβ bands) was used to calculate the disulfide bond formation efficiency and is depicted by a gray scale (white for 0% to black for 100% efficiency). The upper and lower halves of the circle indicate the efficiency before (constitutive) and after (oxidized) Cu-phenanthroline treatment at 0 °C, respectively. Residue pairs that form inducible disulfides (i.e., efficiency increases more than 10% after oxidation) are denoted by asterisks. Results are the mean of at least two independent experiments. Solid line shows the predicted TM boundary; dotted line indicates boundary between residues that form constitutive and inducible disulfide bonds.(C) Relative orientation of the αIIb and β3 TM helices near their N-terminal ends. The TM domains are depicted schematically as α helices, and experimental results from cysteine scanning were used to deduce their relative orientation. The resultant schematic model is shown in both top and side views. Residue pairs that form disulfide bonds at greater than 50% efficiency are connected by solid (constitutive disulfides) or dotted (inducible disulfides) red lines. The gray dotted line represents the boundary between residues that form constitutive and inducible disulfide bonds. Residues are color coded based on the number of constitutive or inducible disulfide bonds formed at greater than 50% efficiency: multiple bonds (interacting residues, red), only one bond (peripheral residues, pink), and no bonds (outside residues, blue).(D) Homodimer formation by the W967C mutant of αIIb. Transfection, radiolabeling, and immunoprecipitation was performed as in (A). Full-length αIIb with the W967C mutation (α-W967C) but not the truncated active mutant αIIb with W697C (α*-W967C) produced a homodimer band (α–α) larger than the heterodimer band (α–β). The α972C/βL697C combination that produces efficient inducible heterodimer is shown as a standard (lanes 1 and 2).\n", - "558 \n", - " Formation of Intersubunit Disulfide Bonds in the TM Domain of αIIb*β3 and Effect on Ligand Binding and LIBS Epitopes(A) Immunoprecipitation. Immunoprecipitation of [35S]-labeled receptors and nonreducing SDS-PAGE and fluorography was as described in Figure 2.(B) FITC-fibrinogen binding. Binding was determined by immunofluorescence as described in Figure 3.(C) LIBS exposure. Three different anti-LIBS mAbs (LIBS6, D3, and AP5) were used to probe the conformational state. mAb binding is expressed as the mean fluorescence intensity in the absence (control, open bars) or presence (+Mn/RGD, black bars) of Mn2+ and RGD peptide.(D) Disulfide bond formation efficiency. Disulfide bond formation in αIIb*β3 heterodimers with the indicated residues mutated to cysteine was determined as described in Figure 2B.\n", - "559 \n", - " Formation of Intersubunit TM Disulfide Bonds in GFFKR/GAAKR Mutant αIIb′′β3 Receptors and Effect on Ligand Binding(A) Disulfide bond formation efficiency in αIIb\"β3. Disulfide bond formation in αIIb\"β3 heterodimers with the indicated residues mutated to cysteine was determined as in Figure 2B. Boxed residue pairs were also subjected to Cu-phenanthroline oxidation at 37 °C in (B and C).(B) Radiolabeled 293T cells expressing the indicated mutant integrins were treated with Cu-phenanthroline at 0 °C or 37 °C, followed by immunoprecipitation with anti-αIIbβ3, SDS-PAGE, and fluorography to probe disulfide bond formation.(C) Efficiency of intramembranous disulfide bond formation in the context of the αIIb\"β3 mutant receptor was assessed after Cu-phenanthroline oxidation at 0 °C or 37 °C and expressed as in Figure 2B.(D) FITC-fibrinogen binding. Binding was determined before (–) and after (+) Cu-phenanthroline oxidation at 37 °C and expressed as in Figure 3.\n", - "560 \n", - " Formation of an Intersubunit Disulfide Bridge within the Membrane Reverses the Active Phenotype of the αIIb*β3 Receptor(A) Radiolabeled 293T cells expressing the indicated mutant integrins were treated with Cu-phenanthroline at 0 °C or 37 °C, followed by immunoprecipitation with anti-αIIbβ3, SDS-PAGE, and fluorography to probe disulfide bond formation.(B) Efficiency of intramembranous disulfide bond formation in the context of the truncated αIIb*β3 receptor was assessed after Cu-phenanthroline oxidation at 0 °C or 37 °C and expressed as in Figure 2B.(C) Ligand binding by wild-type or mutant αIIb*β3 expressed on 293T cells was determined before (–) and after (+) Cu-phenanthroline oxidation at 37 °C and expressed as in Figure 3.\n", - "568 \n", - " Enrichment for Mitochondrial Proteins by MS(A) shows the 546 proteins (in rows) identified from 28 datasets (columns). The proteins are sorted in decreasing order down rows by the number of experiments in which peptide tags were identified by MS and binned into three classes of detection frequency. The number at the bottom of each class indicates the total number of proteins in the class. Proteins that are part of the reference set, and thus are previously known mitochondrial proteins (M), are marked to the left. The experiments are divided according to fermentable (F) and nonfermentable (NF) mitochondrial preparations.(B) Proportions of proteins identified in membrane and matrix fractions. Whether a protein was detected predominantly in either the membrane or matrix fraction, or equal in both fractions, was determined based on where it was detected with an average higher tag number. Shown are the proportions for all 546 proteins, for known matrix proteins (i.e., matrix and intermembrane space, n = 109), for known membrane proteins (i.e., inner and outer membrane, n = 101), and for detected proteins not previously known to be mitochondrial (n = 290).(C) Distribution of proteins identified under fermentable and nonfermentable conditions by proteomics, and overlap with previously known mitochondrial proteins. Total numbers are given in parentheses.(D) Breakdown by localization of the 546 proteins identified. For mitochondrial localization the reference set was chosen; for localization outside mitochondria the GFP fusion protein data were used (Huh et al. 2003). The inner circle represents the distribution for all proteins in yeast.(E) Distribution of median mRNA expression under fermentable and nonfermentable conditions, protein abundance under fermentable conditions (Ghaemmaghami et al. 2003), and protein length across bins of confidence of identification (maximum number of tags identified in any of the 28 datasets). The bars indicate fold differences from the median for the known mitochondrial proteins that were not detected by MS (“M not det.”).\n", - "569 \n", - " Evaluation of Proteomic Data for Protein Abundance and Mitochondrial Localization(A) Coverage of known mitochondrial proteins (Mref) by two MS proteome studies (this study and Sickmann et al. [2003]). We evaluated the 340 proteins of the mitochondrial reference set for which protein abundance data existed (Ghaemmaghami et al. 2003). The x-axis represents the median protein abundance of ten consecutive, equally sized bins of proteins.(B) Distribution and overlap of proteins identified by the two MS studies and known mitochondrial proteins. The total number of entries for each dataset is indicated in parentheses outside each circle. The number inside each circle indicates the number of proteins in each of the categories. In addition, the percentage of proteins that were localized to mitochondria by GFP tagging (Huh et al. 2003) is given in parentheses for each category.\n", - "574 \n", - " Genetic Designs of the FCIPs and the TET System(A) Genetic design of fluorescence Ca2+ indicator proteins: (i) yellow fluorescent protein, (ii) Cg2, (iii) IP, and (iv) came-leon YC3.12.(B) Operating principles of the TET regulatory system (for details see Gossen and Bujard 2002). “L” indicates short linker sequence.\n", - "575 \n", - " Expression and Functional Tests in Cell Culture(A) HeLa cells expressing tTA and Ptetbi-luciferase/Cg2 or Ptetbi-luiferase/IP and imaged by confocal microscopy. Top row: low [Ca2+] (0.1 μM), bottom row: high [Ca2+] (25 mM) and ionomycin. Relative fluorescence changes are indicated as %ΔF/F.(B) Ratios (rlu-FL/rlu-RL) of FL to RL activity measured in mouse ear fibroblast cell cultures from all DNA-positive founders in the absence (red) and presence (green) of Dox (see Materials and Methods). Circles (solid and open) indicate the lines that were selected for crossing to the transactivator lines. Solid circles indicate lines that showed smooth fluorescence.\n", - "576 \n", - " Doxycycline and tTA-Dependent FCIP ExpressionImmunohistochemical assay (A–F) using rabbit polyclonal GFP antibodies/peroxidase-DAB system: (A) YC3.12, single-positive (MTH-YC3.12-7), double-positive (MTH-YC3.12-7, αCamKII-tTA), and Dox-treated double-positive (MTH-YC3.12-7, αCamKII-tTA).(B) Cg2, single-positive (MTH-Cg2-7) and doubles-positive (MTH-Cg2-7, αCamKII-tTA).(C) IP, single-positive (MTH-IP-12) and double-positive (MTH-IP-12, αCamKII-tTA).(D) Moderate-expression line of Cg2 (MTH-Cg2-14, αCamKII-tTA).(E) Low-expression line (MTH-Cg2-15, αCamKII-tTA).(F) FCIP distribution in various brain areas.(G) Fluorescence in fixed brain slices from the accessory and the main olfactory bulb.(H–K) Two-photon images of acute, living brain slices. (H) Neurons in both CA1 and striatum usually show nuclear exclusion. (I) punctate expression in low-expressing lines (also see Figure 2B, open circles); example from CA1 and cortex. Maximum intensity projection of two-photon 3D stacks taken from a brain slice (J) and a whole-mount retina (K).\n", - "577 \n", - " Fluorescence Spectra and FCIP Mobility(A) Fluorescence distribution and emission spectra of Cg2 in cultured HEK cells and in neurons (dendrites and soma) in an acute brain slice (MTH-Cg2-7).(B) Punctate fluorescence and corresponding emission spectra (MTH-Cg2-7). “*” denotes emission spectrum of a punctate fluorescence in a different brain slice (not shown). Note smooth and punctate fluorescence also in the two-photon image on the right (MTH-Cg2-14).(C) Punctate fluorescence in a double-negative littermate of MTH-Cg2-7.(D) Image (left) and emission spectrum (right) of two-photon-excited fluorescence in an acute brain slice (MTH-Cg2-7).(E) Indicator mobility by two-photon fluorescence photobleaching recovery (IP, MTH-IP-12).\n", - "578 \n", - " In Vivo Two-Photon Imaging Through the Thinned SkullYellow cameleon 3.12 at different depths (MTH-YC3.12-8) (A) and with high resolution (MTH-YC3.12-7) (B). (C) IP at different depths (MTH-IP-1).\n", - "579 \n", - " FCIP Responses to Direct and to Synaptic Stimulation in Acute Brain Slices(A) Whole-field imaged responses of Cg2-positive cells in cortex to bursts of APs evoked by somatic current injection (whole-cell recording electrode indicated schematically); responses in the recorded (red) and in a nonrecorded (green) soma and in a region with no cell body (blue).(B) Two-photon line scan (lower trace) through the soma of a hippocampal CA1 pyramidal neuron during a burst of APs evoked by somatic current injection through a high-resistance microelectrode.(C) Whole-field-imaged responses to synaptic stimulation in cortex (five pulses at 100 Hz, 10 μA); ΔF/F image is shown below. Fluorescence and voltage responses with and without pharmacological block of glutamate channels (note suppression of APs and unmasking of inhibitory synaptic potentials).\n", - "581 \n", - " Light-Evoked Ca2+ Responses in Retinal Ganglion Cells(A) Intact, light-sensitive retinal whole mount with Sulforhodamine 101 (red) in the extracellular space. Blood vessels are red; IP-positive (MTH-IP-12) retinal ganglion cells are green; and unstained ganglion cells are dark. (Scale bar: 50 μm).(B) Projection of an image stack reveals the IP-labeled primary dendrites of the retinal ganglion cells.(C) Time course of Ca2+ response measured by high repetition rate image scan (62.5 Hz) of a soma: The cell responds with a decrease in fluorescence to the onset of the laser (asterisk) and to the repeated light stimulation (arrows).(D) Averaged (four repetitions) light-stimulus-evoked Ca2+ response (black trace; gray traces are single trials) measured in the soma (above) and in the primary dendrite (below) of a retinal ganglion cell.\n", - "582 \n", - " In Vivo Imaging of Odor-Evoked Ca2+ Signals with Transgenic Indicators in the Olfactory Bulb(A–C) IP (MTH-IP-12). (A) Raw fluorescence image. (B) Time course of fluorescence signal in the corresponding regions outlined in (C) (matching line colors). The black trace shows respiratory activity. (C) Color-coded map showing the relative change in fluorescence evoked by different odors in each pixel during the first second of the odor response.(D–F) Cg2 (MTH-Cg2-19). (D) Raw fluorescence image. (E) Time course of fluorescence signal in the corresponding regions outlined in (F) (matching line colors). (F) Color-coded maps showing the relative change in fluorescence evoked by different odors in each pixel during the first second of the odor response.\n", - "584 \n", - " Mutant α-Actinin-4 Sediments Abnormally(A) Pattern of sedimentation of α-actinin-4 in a 10%–40% sucrose gradient. Results shown are for wild-type α-actinin-4, K228E α-actinin-4, and K228E α-actinin-4 after addition of excess cold (wild-type) α-actinin. A fraction of the mutant α-actinin-4 sedimented at least as quickly than the highest molecular weight marker, catalase, which has a sedimentation coefficient of 11.3. This was observed with all of the other mutants tested as well (data not shown), but never with labeled wild-type α-actinin-4. Addition of cold α-actinin did not alter the sedimentation pattern seen with the mutant form of α-actinin-4.(B) Results illustrated graphically. Units are arbitrary.\n", - "585 \n", - " Mutant α-Actinin-4 Behavior in Cells(A) Mutant and wild-type α-actinin-4 show different localization and dynamics when expressed in a conditionally immortalized differentiated mouse podocyte cell line. Differentiated podocytes were injected in the nucleus with equal concentrations of expression plasmid for GFP fusions of mutant and wild-type actinins. At 2–4 h after injections, cells were imaged and both phase and fluorescence images recorded as described in the Materials and Methods. To illustrate changes in distribution of the fluorescence signal, three fluorescence images each 1 min apart were overlaid as red, green, and blue panes. Areas of fluorescence that were the same in all panes show as white, while dynamic areas are indicated by the color. The top panel indicates the initial phase and overlain dynamic fluorescence images of wild-type α-actinin-4, while the bottom two panels illustrate characteristic results for mutants K228E and T232I at 3 min time intervals. (See Videos S1–S3.)(B) Transfections in podocytes derived from mutant and wild-type mice. When transfected into conditionally immortalized podocytes of all three α-actinin-4 genotypes (+/+, K228E/+, or K228E/K228E), wild-type GFP–α-actinin-4 shows diffuse cytoskeletal localization. Mutant GFP–α-actinin-4 shows a similar alteration in localization when expressed in these three cells types.\n", - "586 \n", - " “Knockin” Mouse Model(A) Targeting construct. As we have described elsewhere (Kos et al. 2003), targeting initially resulted in a “knockout” allele, due to disruption of normal transcription, presumably by the intronic loxP-flanked neomycin resistance cassette. After breeding to Cre transgenic mice, this neomycin cassette was excised, as illustrated.(B) Northern blot analysis using kidney total RNA illustrates that the expression of the Actn4 transcript in K228E/K228E is similar to the expression in wild-type mice.(C) RT-PCR and sequencing of the relevant portion of Actn4 exon 8 confirms that the transcript in mice homozygous for the targeted allele contains the desired point mutation (top, wild-type; bottom, targeted).(D) Western blot showing markedly decreased expression of α-actinin-4 protein in K228E/K228E homozygous mice and moderately decreased expression in heterozygotes. Shown are blots using protein from cultured fibroblasts. Results were similar using protein extracted from lung, brain, liver, and kidney (data not shown). β-actin control is shown below.(E) Western blot showing expression of α-actinin-4 in lymphocytes from a human K228E/+ heterozygote (Kaplan et al. 2000) and three wild-type controls (two related, one unrelated). β-actin control is shown below.\n", - "588 \n", - " In Vivo PhenotypeElectron micrographs from Actn4 wild-type (A) and Actn4\n", - "K228E/K228E mice (B–D). As shown, Actn4\n", - "K228E/K228E mice were found to have abnormalities that were typically focal, with some areas of podocyte foot process effacement (B), as well as areas that appeared essentially normal (C). Bottom image ([D] using tannic acid counterstaining) illustrates electron-dense deposits observed in several podocyte cell bodies in Actn4\n", - "K228E/K228E mice. No such deposits were observed in wild-type or heterozygous mice.\n", - "589 \n", - " Biochemical Characteristics of Mutant Mice(A) Average BUN and creatinine levels in Actn4\n", - "K228E/– (n = 12), Actn4\n", - "+/+ (n = 8), and Actn4\n", - "K228E/K228E (n = 12) mice at the time of sacrifice. Differences were not statistically significant. Error bars show standard deviation.(B) Summary of proteinuria in wild-type, Actn4\n", - "+/–, Actn4\n", - "K228E/–, Actn4\n", - "–/–, and Actn4\n", - "K228E/K228E mice, measured by albumin dipstick. Distribution of measurements are illustrated graphically for each genotype.\n", - "590 \n", - " In Situ Protein Localization(A) IF studies of glomerular protein expression in Actn4\n", - "+/+, Actn4K228E/+ , and Actn4\n", - "K228E/K228E mice. As indicated, expression of α-actinin-4, ZO-1, and nephrin is shown, as is a merged image of α-actinin-4 and ZO-1 expression.(B) Glomerular expression of α-actinin-4 in normal human kidney and in an individual heterozygous for a K228E mutation.\n", - "605 \n", - " Phase Coupling of Theta Components: Time-Domain View(A) ERP-image view of baseline-normalized, response-aligned single-trial activity time series of components in the FM cluster, sorted (top-to-bottom) by phase at 4.87 Hz in a window centered 89 ms after the button press. Vertical smoothing: 400 trials. Units: microvolts normalized by dividing by the standard deviation of component single-trial baseline activity. The curving vertical trace (left) shows a moving mean of stimulus onset times; the central vertical line, the time of the button press. Data band pass in all panels: 0.1–40 Hz.(B) Exporting the same trial sorting order from (A) to CM cluster components (from the nine subjects contributing components to both clusters) demonstrates the significant partial theta phase coherence (r is approximately 0.3) between the two clusters in the postresponse time/frequency window. Note the induced (top-down, left-to-right) slope of the latency of the two (orange) positive-going CM cluster theta wave fronts.(C) Phase-sorted ERP image, as in (A), of the normalized CM cluster trials.(D) FM cluster component trials sorted in the same trial order as (C). Again, the partial theta-band phase coherence of the two clusters in the postresponse period is reflected in the diagonal (blue) negative-going wave fronts of the FM cluster data.\n", - "608 \n", - " An Ant with Three Sexes?(A) Two males from the harvester ant genus Pogonomyrmex, one from each genetic strain. In a recently discovered hybrid system, queens must mate with both types of males to produce reproductives and workers. Photo courtesy of Charles Hedgcock, Charles Hedgcock Photography, Tucson, Arizona, United States.(B) Hybrid workers emerging from a nest. Photo courtesy of Veronica Volny, University of California, Berkeley, California, United States.\n", - "609 \n", - " Four Different Species of Volvocales Algae(A) Gonium pectorale, (B) Eudorina elegans, (C) Pleodorina californica, and (D) Volvox carteri. These are unicellular organisms that live in colonies and have both large and small gametes. Photo courtesy of Aurora M. Nedelcu, from the Volvocales Information Project (http:\\\\www.unbf.ca\\vip\\index.htm).\n", - "611 \n", - " Scars of Sex(A) Streaks of sperm (St) received after a mating interaction in the hermaphroditic flatworm, Pseudobiceros bedfordi. (B) Received sperm appears to “burn” holes (H) in the receiver. Some (unknown) component of the ejaculate dissolves the skin tissue. Sc, scar tissue. (C) Exceptional case where an individual received a large amount of sperm somewhere in the middle of the body, resulting in a large hole (asterisk). The the body subsequently tore in two. Individuals like these are occasionally found in the field and can regenerate much of their body. Photo courtesy of Nico Michiels.\n", - "618 \n", - " The Synaptonemal Complex(A) Model of the SC. Lateral elements (light blue rods) of homologous chromosomes align and synapse together via a meshwork of transverse filaments (black lines) and longitudinal filaments (dark blue rods). The longitudinal filaments are collectively referred to as the “central element” of the SC. Ellipsoidal structures called recombination nodules (gray ellipsoid) are constructed on the central region of the SC. As their name implies, recombination nodules are believed to be involved in facilitating meiotic recombination (crossing over). The chromatin (red loops) of each homologue is attached to its corresponding lateral element. Because there are two “sister chromatids” in each homologue, two loops are shown extending laterally from each point along a lateral element.(B) Top: Set of tomato SCs. Chromatin “sheaths” are visible around each SC. Bottom: Two tomato SCs. The chromatin has been stripped from the SCs, allowing the details of the SC to be observed. Each SC has a kinetochore (“ball-like” structure) at its centromere. Recombination nodules, ellipsoidal structures found on the central regions of SCs, mark the sites of crossover events (see inset). Images and legend courtesy of Daniel G. Peterson, Mississippi Genome Exploration Laboratory, Mississippi State University, Mississippi State, Mississippi, United States (http://www.msstate.edu/research/mgel/index.htm).\n", - "623 \n", - " Routing DNA through Networks(A) Structure of a simplified nine-member routing gene library. The ssDNA consists of 20-base noncoding regions (black lines Z1–Z4) and 20-base coding positions (colored bars [a,b,c]1–3). All library members contain the same four DNA sequences at the four noncoding regions. At each of the three coding positions, three mutually exclusive codons, (a,b,c)n, are present for a total of twenty-seven different routing genes. Resin beads coated with an oligonucleotide complementary to one codon (anticodon beads; gray ball at left) capture by hybridization ssDNAs containing the corresponding codon.(B) To travel through the network, the ssDNA library starts on one or multiple DEAE columns (black column on left) and is hybridized to a set of anticodon columns (red, green, and blue columns) corresponding to the set of codons in the first coding position. The genes are thus physically partitioned into subpools based on sequence identity and can be processed accordingly. Each subpool is subsequently transferred to a distinct DEAE column, completing the first step through the network. The hybridization splitting, processing, and transfer are repeated for all subsequent coding regions. After completion of the final step, the library is concentrated on a reverse-phase column (RP; black-and-white column on right) and eluted for solution manipulation.\n", - "624 \n", - " Construction and Diversification of Routing Gene Populations(A) Overlapping complementary oligonucleotides that span an entire gene (for example [Z–a]1–8 and a1–8′–Z2–9′) were assembled into full gene products (“all a,” “all b,” etc.) by primerless PCR and subcloned. Equivalent amounts of the ten resulting plasmids (a1–8, … , j1–8) were mixed and used as template for eight separate PCR reactions with noncoding region primer pairs (Zi/Zi\n", - "+1′) that flanked a single coding position. The eight degenerate PCR products (Zn−xn−Zn\n", - "+1) were assembled into a library of 108 different genes by primerless PCR (right).(B) To generate ssDNA, a T7 promoter (pT7) was appended to the 3′ end of the double strand DNA library. The minus strand of the library was transcribed using T7 RNA Polymerase (T7 RNAP), and reverse transcribed from a Z1 primer using MMLV Reverse Transcriptase (MMLV RT) in a coupled reaction. The resulting DNA/RNA heteroduplex was treated with sodium hydroxide to hydrolyze the RNA, providing ssDNA.\n", - "625 \n", - " Anticodon Column Synthesis(A) Jeffamine 1500 (compound 1) was reacted with glutaric anhydride, and the singly acylated linker (compound 2) was purified over a HiTrap SP column. Purified compound 2 was coupled to NHS-activated Sepharose (gray ball). Treatment of the linkered resin compound 3 with TBTU/NHS, and subsequent incubation with a 5′-amino modified oligonucleotide (NH2-DNA), completed the synthesis of an anticodon column.(B) Refractive index FPLC chromatograms of PEG compounds 1 and 2 before and after purification by cation-exchange chromatography. Linker compound 1 migrates as a bisamine (green trace) while compound 2 migrates as a monoamine (red trace).(C) HPLC chromatograms of a 5′-aminated 20-base oligonucleotide (NH2-20mer) and a nonaminated ten-base oligonucleotide control (10mer) incubated with TBTU/NHS activated resin compound 3. Chromatograms of the starting material (black) and supernatant after 12 h (red) are shown. An unknown side-product of the coupling reaction (NH2-20mer side-product) is labeled.\n", - "626 \n", - " Linker Effects on HybridizationThe hybridization to anticodon columns of a ten-base noncomplementary oligonucleotide and a 20-base complementary oligonucleotide was analyzed by HPLC. Chromatograms of the hybridization load (blue), flow-through (red), and elute (black) are shown.(A) shows the anticodon column that was synthesized by coupling the anticodon oligonucleotide directly to NHS-activated Sepharose.(B) shows the anticodon column that was synthesized by coupling the anticodon oligonucleotide to NHS-activated Sepharose through a PEG linker.\n", - "630 \n", - " Chemical Translation(A) Schematic showing the structure of the DNA support library. Small molecules are synthesized at the 5′ end of 340-base ssDNA genes. The ssDNA consists of 20-base noncoding regions (black lines labeled Z1–Z7) and 20-base coding positions (colored bars labeled [a–j]1–6). All library members contain the same seven DNA sequences at the seven noncoding regions. At each of the six coding positions, ten mutually exclusive DNA codons, (a–j)n, are present, for a total of 60 different sequences. Each coding region specifies the addition of a single subunit to a growing small molecule. A unique reactive site (in this case a primary amine) for small-molecule synthesis is attached to the 5′ end of the ssDNA through a polyethylene glycol linker (squiggly line). Resin beads coated with an oligonucleotide complementary to one codon (anticodon beads, gray ball at right) capture by hybridization ssDNAs containing the corresponding codon.(B) Chemical translation is a split-and-pool synthesis, with splitting directed by DNA hybridization. A ssDNA library is hybridized to a set of anticodon columns (gray balls) corresponding to the set of codons present at a single coding position. The ssDNA genes partition into subpools based on sequence identity. Distinct chemical subunits (colored balls) are coupled to the DNA in each subpool. Finally, the DNA is repooled, completing the encoded addition of one subunit to the growing small molecule. The process of hybridization splitting, chemistry, and pooling is repeated for all subsequent coding regions.(C) Schematic product of chemical translation. The sequence of the small-molecule subunits (colored balls) corresponds to the sequence of codons (colored bars) in the ssDNA gene.\n", - "632 \n", - " Peptide Synthesis on DNA(A) Structure of the [Leu]enkephalin–DNA conjugate.(B) High performance liquid chromatography chromatogram of the [Leu]enkephalin peptide synthesized using succinimidyl ester chemistry on a 20-base oligonucleotide modified with a 5′ primary amine (20mer). A 10-base oligonucleotide without the 5′ primary amine (10mer) was included in the reactions as a control for nonspecific DNA modification. The red and blue traces are the DNA before and after chemistry, respectively. The mass of the major product peak (42-min retention time) matches the expected mass of the [Leu]enkephalin–DNA conjugate.(C) Electromobility shift assay of peptides synthesized on 340-base ssDNA. Conjugates were eletrophoresed on a native agarose gel in the absence (lanes 1, 3, 5, and 7) or presence (lanes 2, 4, 6, 8, and 9) of the [Leu]enkephalin-binding antibody 3-E7. [Leu]enkephalin (L) or a scrambled sequence (S) was synthesized on a 5′ amino-modified 20-base oligonucleotide, which was subsequently used as a primer for PCR (lanes 1–4), or directly on 5′ amino-modified 340-base ssDNA, which was subsequently converted to dsDNA (lanes 5–9). Addition of free [Leu]enkephalin peptide (lane 9) competes away binding.\n", - "634 \n", - " In Vitro Selection of a Nonnatural Peptide Library(A) Library building blocks. Proteinogenic building blocks are shown in green.(B) Approximately 70 DNA genes from each round of selection were sequenced, and the results are summarized as a histogram plot. The x-axis indicates the number of amino acid residue matches to [Leu]enkephalin encoded by a library sequence. The y-axis indicates the library generation (0, starting material; 1, after round one selection; 2, after round two selection). The z-axis indicates the number of sequences encoding a particular number of matches (x-axis) in a particular round (y-axis).(C) The top row reports the round two library consensus sequence, which matches [Leu]enkephalin. The second row reports the percentage of round two library clones that encode the [Leu]enkephalin amino acid at each residue position. The third row reports the identity and frequency of the most commonly occurring non-[Leu]enkephalin subunit at each position.\n", - "635 \n", - " Peptide Coupling to DNA Supports(A) Fmoc-based peptide coupling reaction to an aminated 20-base oligonucleotide (NC20) where X represents a succinimidyl or EDC/HOAt-activated ester.(B) HPLC chromatograms of a nonaminated 10-base (10mer) and an aminated 20-base (NC20) oligonucleotide. HPLC traces show DEAE column load (solid black) and elute (broken black). DEAE column elutes after succinimidyl ester–mediated (solid red) or EDC/HOAt-mediated (broken red) Fmoc-Leu coupling and Fmoc deprotection are shown. The resulting amino acid–DNA conjugate is denoted (Leu-NC20).(C) Chemical transformations are carried out using small DEAE Sepharose columns and syringes (left). Washes are facilitated by a vacuum manifold with chemically resistant stopcocks (right).\n", - "636 \n", - " DNA Support Structure and Modified Amino Acids(A) Peptide synthesis is carried out on DNA modified with a 5′ C12 amino (NC20) or a 5′ PEG amino (NP20) linker.(B) Fluorescent lysine derivative (compound 1, Fmoc-Lys[coumarin]-OH) and BME/DBU labile protecting groups for lysine (compound 2, Fmoc-Lys[Ns]-OH), arginine (compound 3, Fmoc-Arg[Ns]-OH), and histidine (compound 4, Fmoc-His[CNP]-OH).\n", - "638 \n", - " A Cell Culture Screen Identifies Novel Regulators of the Innate Immune Response(A) LPS induces an increase of about 10-fold in the number of Dipt-lacZ cells that stain positively for β-galactosidase. Ecdysone sensitizes the cells and promotes the response.(B) Dipt-lacZ induction by LPS requires known Imd signaling components, but not Tl pathway members. The fraction of β-galactosidase-positive cells was normalized to the induced control (normalized %), and influence of RNAi of Tl pathway members (dif, spz, and tub) or Imd pathway members (PGRP-LC, Imd, Ird5, and Dredd) is shown.(C–H) Activity stain (X-Gal) for β-galactosidase.(C) Untreated cells.(D) Cells treated with ecdysone alone.(E) Cells treated with ecdysone and LPS. About 10% of cells express detectable β-galactosidase.(F) RNAi against the DDRi sick reduces Dipt-lacZ expression in response to LPS.(G) RNAi of a representative EDRi, the Ras signaling pathway component Cnk, enhances Dipt-lacZ induction by LPS.(H) RNAi of a representative CDRi, the actin regulator SCAR induces Dipt-lacZ in the absence of LPS.(I–J) Immunofluorescence of S2 cells with actin in red, tubulin in green, and DNA in blue. Scale bars in (I) and (J) indicate 10 μm.(I) Wild-type cells have a characteristic rounded morphology.(J) RNAi against many CDRi genes disrupts morphological features of wild-type S2 cells. S2 cells are shown treated with MESR4 dsRNA. Cells are significantly larger in appearance and less round, with irregular tubulin and actin networks.\n", - "639 \n", - " List of Modulators of the Immune Response and a False Color Display of Their Influence on Dipt-lacZ InductionThe genes identified as DDRi (A), EDRi (B), and CDRi (C) are listed, and the colored bars show the influence of the corresponding dsRNA on Dipt-lacZ expression. The top two entries in (A), (B), and (C) show control cells (no dsRNA) without and with LPS, respectively. The scales for the false colors are given at the bottom left. Dipt-lacZ levels are given in terms of percent positive cells. For exact Dipt-lacZ expression values for each dsRNA refer to accompanying supplemental tables. In (B), the color scale (right) is compressed and extended compared to (A), and an asterisk indicates genes that also caused a CDRi phenotype. In (C), the pound sign indicates morphological defects and an asterisk indicates genes that also caused an EDRi phenotype, and the division of the genes into epistatic groups is shown. To the immediate left a false-color bar (coded as in [B]) indicates the effect of the dsRNAs on Dipt-lacZ expression without LPS addition. The block of colored columns shows the results of epistasis tests. Here, we set the undisturbed level of CDRi activation to 100% (as indicated in the left column in this group and the color code below), and to the right we represent reduction of this activation by prior RNAi of different Imd pathway genes. Five epistatic clusters (I–V) were identified (indicated by the lines to the left).\n", - "641 \n", - " Dnr1 Is a Conserved Inhibitor of Dredd Activity(A) A comparison of the amino acid sequence of Dnr1 with XP_32149 from Anopheles gambiae and human MIR. Shaded regions indicate the N-terminal ezrin/radixin/moesin domain and C-terminal RING finger. Asterisks indicate conserved residues.(B) Measurements of β-galactosidase activity in lysates prepared from Dipt-lacZ in control cells, LPS-treated cells, dnr1 dsRNA –treated cells, and sick dsRNA–treated cells exposed to LPS, respectively. Each experiment was performed in triplicate.(C) Similarity between the RING finger in Dnr1 and other IAPs. Critical residues are shaded. Asterisks indicate conserved residues.(D) Lysates from S2 cells transfected with equal amounts of N- and C-terminally HA-tagged wild-type Dnr1 (lanes 1 and 3, respectively), or N- and C-terminally HA-tagged C563Y Dnr1 (lanes 2 and 4, respectively), and analyzed by an anti-HA Western blot. Residue C563 is critical for RING finger function and is indicated with an arrowhead in (C).(E) Higher resolution of lysates from C-terminally HA-tagged wild-type or C563Y Dnr1. Mutation of the RING finger prevents accumulation of a lower isoform of Dnr1.(F and G) Subcellular localization of HA-Dnr1 transiently expressed in S2 cells treated without (F) or with (G) LPS, with HA in green, DNA in blue, and actin in red.\n", - "642 \n", - " Dnr1 Protein Levels Are Regulated by Dredd Activity(A) Amounts of HA-Dnr1 transiently increase in S2 cells treated with LPS. Anti-HA Western blot of lysates from HA-Dnr1-transfected S2 cells that were incubated with LPS for indicated periods.(B) Anti-HA Western blot of lysates from S2 cells transfected with HA-Dnr1. Coexpression of the caspase inhibitor p35 dramatically inhibits HA-Dnr1 accumulation in the absence (lanes 1 vs. 3) or presence (lanes 2 vs. 4) of LPS. Actin levels are shown as a loading control.(C) Upper panel shows the percentage of cells with nuclear GFP-Relish after the indicated treatments. The lower panel is an anti-GFP Western blot of lysates from S2 cells treated in the identical manner. z-VAD-FMK prevents nuclear accumulation of GFP-Relish and GFP-Relish processing in response to LPS.(D) Anti-HA Western blot of lysates from S2 cells transiently transfected with HA-Dnr1. While 2 h incubation with LPS normally leads to a 4-fold increase (quantified by titration) in HA-Dnr1 (lanes 1 vs. 2), incubation with z-VAD-FMK prevents the accumulation (lanes 3 vs. 4).(E) Anti-HA Western blot of lysates from S2 cells transfected with HA-Dnr1. Cells had been previously incubated with (lanes 3 and 4) or without (lanes 1 and 2) Dredd dsRNA. Results are shown for two independent experiments. Actin levels are shown as a loading control.(F) Anti-HA Western Blot of lysates from S2 cells transfected with HA-Dnr1 shows that prior RNAi against the caspases Dcp-1, Ice, Nc, and Decay does not substantially affect HA-Dnr1 levels (compare with control without LPS).(G) The number of Dipt-lacZ-expressing cells after LPS treatment is greatly reduced after Dredd RNAi, while RNAi against Dcp-1, Ice, Nc, or Decay has no effect.\n", - "643 \n", - " A Schematic of the Proposed Relationships of the Novel Immune Regulators, Sick and Dnr1, to Dredd and RelPointed and blunt arrows indicate activation and inhibition, respectively. Both Sick and Dredd are required for translocation of Rel to the nucleus and for activation of Dipt expression and they are consequently positioned upstream of Rel as activators. In the absence of Sick or Dredd, Dnr1 function is not needed to maintain pathway quiescence. Thus, Dnr1 is ordinarily required to either inhibit Sick and Dredd functions or to negate their actions, and we have indicated these regulators as being downstream of Dnr1 (A). Although we have no epistatic data that separates the action of Sick and Dredd, Dredd appears to directly cleave Rel and is hence likely to be immediately upstream of Rel. Sick might function in conjunction with Dredd or as an activator of Dredd. Since dnr1 RNAi does not enhance the response to LPS, we suggest that its inhibitor activity is either repressed or bypassed upon exposure to LPS. Consequently, we have shown that treatment with LPS counteracts Dnr1-dependent Dredd inhibition (B). We do not mean to preclude other actions of LPS that might contribute to induction, but it is notable that inactivation of Dnr1 is sufficient to activate signaling. Finally, we have shown that Dnr1 levels are affected by Dredd, and we have indicated this with a positive feedback arrow.\n", - "645 \n", - " Virulence Evolution in Mouse Malaria during Serial Passage in Immunized Versus Naïve MiceVirulence was measured by minimum red blood cell density (y-axis) in lines of P. chabaudi before (“ancestral lines;”black and gray symbols) and after serial passage through immunized (“I-lines;” red lines and triangles) or naïve (“N-lines,” green lines and circles) mice before (A) and after (B) mosquito transmission. Evolved and ancestral lines were compared in both naïve (solid lines) and immunized mice (broken lines). Filled symbols, before mosquito transmission; open symbols, after mosquito transmission. Lines were selected from an avirulent, “unadapted” clone (CW-0; left set of lines) and a virulent, “preadapted” ancestral population (CW-A; right): the latter was derived from the former by 12 serial passages in a previous experiment (Mackinnon and Read 1999b). Each symbol (with ± 1 standard error based on the variance between subline means) represents the mean of mice infected with an ancestral line or a set of passaged lines (i.e., five sublines, two mice per subline). Prior to mosquito transmission (A), differences between the I-lines and N-lines were significant in three out of the four cases (p < 0.05 for lines from the unadapted line infecting naïve mice, p < 0.01 for unadapted infecting immunized, and p < 0.001 for preadapted infecting immunized): in the fourth case (p > 0.1 for preadapted infecting naïve), virulence of the ancestral line was already apparently near-maximal. After mosquito transmission (B), the differences between the I-lines and N-lines remained the same in naïve mice as before transmission (interaction between the mosquito transmission effect and the I-line-versus-N-line difference was p > 0.7 in both the unadapted and preadapted cases). However, these line differences were eliminated in immunized mice (interaction term: p = 0.02 for the unadapted case, p = 0.08 for the preadapted case). Mosquito transmission significantly reduced the virulence of the preadapted ancestral line in immunized mice (p = 0.03) but not in the other ancestral-line-by-immune-treatment combinations (p > 0.2 in these cases). In the selection lines, mosquito transmission significantly reduced the virulence in five out of the eight comparisons (p = 0.009 and p = 0.13 in the N-lines in naïve mice derived from CW-0 and CW-A, respectively, with values of p = 0.55 and p = 0.005 in N-lines in immunized mice, p = 0.022 and p = 0.26 in I-lines in naïve mice, and p = 0.006 and p < 0.0001 in I-lines in immunized mice). Ancestral pretransmission lines had similar levels of virulence in the separate pretransmission and posttransmission experiments, with the exception of the preadapted ancestral line in immunized mice, which had higher virulence in the latter than the former (p = 0.002). Similar results to the above were obtained when virulence was measured by maximum weight loss (unpublished data). No deaths occurred during the pretransmission experiments, but in addition to the one death that occurred early in the infection prior to the occurrence of any weight loss or anemia (excluded from analyses), five occurred in the posttransmission experiment, four of these in naïve mice (two in the N-lines, one in the I-lines, and one in the nontransmitted ancestral line, all derived from the preadapted line) and one in an immunized mouse (preadapted, nontransmitted ancestral line).\n", - "647 \n", - " Relationships between Virulence, Asexual Multiplication, and Transmission Potential across Ancestral and Selection LinesVirulence, as measured by minimum red blood cell density, is plotted against maximum parasitemia in (A), and average daily gametocyte production (a measure of lifetime transmission potential) is plotted against virulence in (B). Data are all from pretransmission lines—ancestral and selected—measured in naïve (closed symbols; solid line) and immunized mice (open symbols; broken line). Regression analysis for both traits showed significant (p < 0.001) and similar (p > 0.05) slopes within both naïve and immunized mice, and significantly lower (p < 0.001) maximum parasitemia and gametocyte production in immunized than in naïve mice. When the two data points from naïve mice with values of above 3 × 109 rbc/ml were excluded from the analyses, the slopes remained statistically similar (p > 0.05). Unselected ancestral populations, black squares; N-lines, green circles; I-lines, red triangles; avirulent unadapted ancestral population, small symbols; virulent preadapted ancestral population, large symbols.\n", - "650 \n", - " Fate of Lumenal Content during Lysosomal FusionMEFs were incubated for 2 h with 70 kDa FITC–dextran followed by more than 3 h in dextran-free media to chase the dextrans into the lysosomes. These cells were then treated with calcium ionophore (A23187) to trigger exocytosis of lysosomes.(A and B) The middle panels are images of lyosomes undergoing complete (A) and partial (B) exocytosis. Intensity plots for the regions in these images marked by dotted circles are shown in the lower panel. The top panel shows a schematic representation of these different stages.(C) Schematic fluorescence intensity plots for lysosomes undergoing partial (red) or complete (green) fusion. Owing to the exponential decay of the evanescent field (blue; top panels in [A] and [B]) away from the coverslip, a lysosome that is more than 150 nm from the cell membrane (black line in top panels in [A] and [B]) is not fluorescent. As this lysosome moves closer (labeled as “entry into evanescent field”), its fluorescence intensity increases. Since the lumen of lysosome is acidic, it quenches FITC fluorescence. As soon as the fusion pore is formed, the lysosomal lumen is rapidly alkalinized resulting in an increase of FITC–dextran fluorescence (“pore opening”). Following the pore opening, the dextran is released and it diffuses away from the site of the fusion, causing the lumenal fluorescence to decrease (“release”).(D) A histogram of the fraction of lumenal contents released by exocytosing lysosomes. Upon ionophore-triggered fusion, 21% of all lysosomes analyzed in WT MEFs (n = 47; gray bars) and 45% of all in Syt VII KO MEFs (n = 51; white bars) completely released their lumenal content.(E and F) To monitor the nature of lysosomal fusion in individual WT MEFs (E) and Syt VII KO MEFs (F), calcium was increased using ionophore (WT, n = 7 cells; KO, n = 9 cells) as well as the IP3 agonists bombesin (WT, n = 6 cells; KO, n = 9 cells) and thrombin (WT, n = 5 cells; KO, n = 7 cells). Irrespective of the means, increase in calcium led to most lysosomes to fuse partially in WT MEFs (E) and completely in Syt VII KO MEFs (F). The error bars represent SEM.\n", - "651 \n", - " Fate of Membrane Protein during Lysosomal FusionLysosomal membranes in MEFs were labeled by transfecting cells with a vector encoding a CD63–GFP fusion protein, and expression was allowed for 48 h. For simultaneous labeling of lysosomal membrane and lumen, the CD63–GFP transfected cells were labeled with 70 kDa TRITC–dextran as described in Figure 1.(A) Following ionophore-induced calcium increase in WT MEFs, when the TRITC–dextran was released completely (left), CD63–GFP (right) was delivered to the plasma membrane, but it remained in multiple puncta near the site of fusion rather than diffuse away. The panels are pseudocolor surface plots, with the x and y axis representing the coordinates and the z axis representing the fluorescence intensity of individual pixels.(B) In the event of partial release of TRITC–dextran (top row), the CD63–GFP (bottom row) did not appear to be delivered to the plasma membrane. The lower panel shows the plot of fluorescent intensity of lumenal and membrane label (within the dotted circle) of the lysosome shown in (B).(C and D) Analysis of CD63–GFP-labeled lysosomes in WT MEFs (C) and in Syt VII KO MEFs (D) indicates that while CD63–GFP is retained in puncta in the WT MEFs, it diffuses freely in the plasma membrane in the SytVII KO MEFs. The lower panel shows the total and peak intensity plots of CD63–GFP-labeled lysosome in (D).\n", - "653 \n", - " Schematic Representation of the Fate of Lumenal and Membrane Cargo during Lysosomal Exocytosis(A) Partial fusion of the lysosomes from WT MEFs result in the release of a fraction of the smaller (70–250 kDa; red circles) dextran, but no release of the larger (500 kDa; blue circles) dextran. None of the lysosomal membrane protein (green bars) is delivered to the plasma membrane.(B) Complete fusion leads to release of both the large and the small dextrans and delivery of the membrane proteins to the plasma membrane, but the proteins aggregate in small puncta near the site of fusion.(C) Knockout of Syt VII causes larger-sized dextran to be released even during partial fusion, and the membrane protein is still not delivered to the plasma membrane.(D) During complete fusion, both sized dextrans are released completely and the membrane proteins delivered to plasma membrane are free to diffuse away from the site of fusion.\n", - "654 \n", - " Temporal Analysis of Lysosomal Exocytosis and Fusion Pore Opening Using 70 kDa FITC–Dextran as Lumenal Marker(A) Histogram of the release time (time taken for the vesicular fluorescence to drop from peak to postfusion resting value). Release time was less than 0.75 s for more than two-thirds of lysosomes in Syt VII KO MEF (n = 62 lysosomes), while most lysosomes (81%) in WT MEFs (n = 56 lysosomes) released their lumenal content for more than 0.75 s.(B) Analysis of release time of lysosomes using ionophore, bombesin, and thrombin to trigger lysosomal exocytosis. Irrespective of the means of calcium increase, lysosomes in Syt VII KO MEFs released their lumenal content significantly faster (p = 0.002, 0.01, and 0.03, respectively).(C) Histogram of the number of lysosomes exocytosing as a function of the time following calcium ionophore addition. Fluorescent dextran was used as a lumenal marker; the time axis indicates seconds elapsed following the addition of ionophore. Exocytosis initiated earlier in the Syt VII KO MEFs (white bars; n = 8 cells) compared to WT MEFs (gray bars; n = 6 cells).(D) No change was observed in the total number of lysosomes that exocytosed at the basal surface of WT or Syt VII KO MEFs when calcium was raised using ionophore or thrombin; however, compared to WT MEFs, bombesin triggered exocytosis of half as many lysosomes in the Syt VII KO MEFs (asterix represents p value < 0.02). The error bars represent SEM.\n", - "656 \n", - " Genes Expressed in Subsets of Mitotic Progenitors(A) Genes expressed in temporally distinct subsets of progenitors. The first column shows relative SAGE tag levels for each gene under consideration. The UniGene identities and common names of the genes in question are Mm.19155/sFrp2, Mm.3904/Fgf15, Mm.142856/Lhx2, Mm.35829/Edr, and Mm.22288/cyclin D1. The sections for ISH and BrdU shown here were taken from near the center of the retina at the developmental times shown. Mice were albino Swiss Websters except in the case of the adults, which were pigmented C57B/6. See Table S5 for a full list of probes used. Cellular laminae of both the developing and mature retina are indicated with colored bars. All pictures were taken at 200x. The graph plotting the fraction of mitotic cells in the retina adjacent to the BrdU staining is an estimate based on data from both rat and mouse (Young 1985a, 1985b; Alexiades and Cepko. 1996).(B) Spatially heterogeneous ONBL. Genes that were expressed in spatial subsets of cells in the prenatal ONBL are shown. The genes shown are Mm.4541/Sox2, Mm.18789/Sox4, Mm.4605/Tbx2, Mm.29067/Mbtd1, Mm.2229/Eya2, Mm.34701/Pum1, Mm.29924/Arl6ip1, Mm.11738/Ark-1, Mm.40321/Pgrmc2, and Mm.22288/cyclin D1. Sections were from central retina. Cellular laminae of both the developing and mature retina are indicated with colored bars. All pictures were taken at 200x. See Table S5 for a full list of probes used.\n", - "659 \n", - " Müller-Glia-Enriched Genes(A) Müller-glia-enriched genes show stronger expression in retinal progenitors than do genes enriched in other postnatally born cell types. See Materials and Methods for details of how progenitor-enriched and cell-specific expression patterns were determined, and p-values for progenitor-enrichment of genes that are cell type–specific in the mature retina were calculated. Data on 4N-enriched transcripts were obtained from Livesey et al. (2004). Numbers for each value are as follows. For N, the number of cell-enriched genes, N\n", - "MG = 86, N\n", - "Pr = 112, N\n", - "BC = 21, and N\n", - "AC = 57. For I, the number of genes that show retinal progenitor-enriched patterns by ISH, I\n", - "total = 180, I\n", - "MG = 66, I\n", - "PR = 15, I\n", - "BC = 4, and I\n", - "AC = 8. For M, the number of genes enriched in 4N retinal progenitor cells that were tested by ISH in adult retina, M\n", - "total = 28, M\n", - "MG = 12, M\n", - "PR = 3, M\n", - "BC = 3, and M\n", - "AC = 1. *, p < 10−13; **, p < 0.0001.(B) Müller-glia-enriched genes show strong expression in mitotic progenitors. The genes shown are: Mm.26062/ADO24, Mm.55143/Dkk3, Mm.5021/DDR1, Mm.35817, Mm.20465/GPCR37, Mm.200608/clusterin, and Mm.22288/cyclin D1. Sections were from central retina. Cellular laminae of both the developing and mature retina are indicated with colored bars. All pictures were taken at 200x. See Table S5 for a full list of probes used.(C) Dynamic expression of metabolic genes in developing retina. Metabolic enzymes are often selectively expressed in mitotic progenitors and developing Müller glia. The genes shown are Mm.27953/glycine decarboxylase, Mm.9114/mu-crystallin, and Mm.213213/HK-R. Cellular laminae of both the developing and mature retina are indicated with colored bars. Sections were from central retina. All pictures were taken at 200x. See Table S5 for a full list of probes used.\n", - "662 \n", - " Subcellular Localization of the Fz1 Protein(A) Anti-GFP staining of Fz-GFP in arm-fz-GFP third instar wing disc (arm drives ubiquitous expression); xz-section is shown.(B) Illustration of a cross section of a third instar wing disc. Wing epithelium forms several folds in the hinge region, where apical–basal localization can be visualized in a horizontal xy-section. The purple line in (B) indicates the position of the xy-optical section in such folds shown in (C–F).(C) Staining of a dpp-Gal4/UAS-fz1–1-1(myc) third instar wing disc. Localization of DE-Cad (in red), Dlg (green), and Fz1–1-1 (anti-Myc, blue) is shown. Apical region of the epithelium faces the lumen in the fold, and the basolateral regions are away from the lumen.(D) same staining as in (C) with two channels shown: DE-Cad and Fz1–1-1. DE-Cad (red) and Fz1–1-1 (blue) largely overlap.(E) Dlg (green) and Fz1–1-1 (blue) from (C) are shown. Fz1–1-1 localizes generally more apical than Dlg (with only a very slight overlap).(F) Fz1–1-1 single-channel staining. In summary, Fz1–1-1 is mainly localized in the apical adherens junctions and strong punctae inside cells (probably intracellular vesicles). Low levels of Fz1–1-1 also exist more ubiquitously in the basolateral region.(G) Schematic illustration of relative positions of DE-Cad, Dlg, and Fz1–1-1 along the apical–basal axis epithelial cells. DE-Cad marks the adherens junctions, whereas Dlg localization correlates with septate junctions.\n", - "663 \n", - " The Cytoplasmic Region of Fz Regulates Subcellular LocalizationAll Fz1/2 chimeras shown are Myc-tagged (the tag being inserted right after the CRD of Fz1 or Fz2; see Materials and Methods; Boutros et al. 2000). The respective Fz1/2 chimeras, with their schematic structure shown under each photomicrograph, were expressed under dpp-Gal4 (expression domain marked with UAS-EGFP in example in [A]) and analyzed by confocal microscopy xz-sections (perpendicular to the stripe of expression in the wing pouch region).(A) Subcellular localization of wild-type Fz-Myc (Fz1–1-1, in green; red channel shows coexpressed GFP to mark expressing cells). Single-channel black-and-white staining of Fz-Myc is shown on right.(B–F) Anti-Myc staining of different Fz1/2 chimeras: (B) Fz1–2-2, (C) Fz1–1-2, (D) Fz2–1-1, (E) Fz1–2-1, and (F) Fz2–2-1.(G) Fz2–2-2. Note the correlation of apical Fz localization with the presence of the Fz1 C-tail.\n", - "664 \n", - " GOF Planar Polarity Wing Phenotype of Fz1/2 Chimeras\n", - "dpp-Gal4 was used to express the respective Fz1/2 chimeras in the wing (same as described in Figure 2).(A) Wild-type wing. The dpp-Gal4 expression domain is highlighted by a thick orange line. In wild-type, all wing hairs are pointing distally.(B) dpp-Gal4; UAS-EGFP/UAS-fz1–1-1 wing (dpp>fz1–1-1; the expression domain is again highlighted with light orange). Wing hairs flanking the expression domain point away from it, consistent with previous observations that hair point away from higher levels of Fz1 activity (Adler et al. 1997).(C) dpp>fz1–2-2 wing. Wing hairs are not pointing away from expression domain, suggesting that Fz1–2-2 is not active for PCP signaling.(D) dpp>fz1–1-2 wing. Hairs point away only very slightly (less than 45 o; compare with Fz1–1-1, showing a 90 o reorientation next to expression domain). Several different lines of UAS-fz1–1-1 and UAS-fz1–1-2 were compared, showing identical behavior (Fz1–1-1 having a much stronger phenotype), suggesting that the C-tail is required for full PCP Fz activity.(E) dpp>fz2–1-1 wing. Most wing hairs point away from expression domain. The phenotype is weaker than Fz1–1-1.(F) dpp>fz1–2-1 wing. Wing hair orientation is hardly affected. Since Fz1–2-1 is apically localized (see Figure 2E), this result indicates that the presence of the Fz1 7-TM region is important for PCP activity.\n", - "665 \n", - " Effects of Fz1/2 C-Tail Mutations on Subcellular Localization and PCP Activity(A) Sequence alignment of Fz1 and Fz2 C-tails. Note high degree of conservation within the membrane proximal shared portion of the Fz1 and Fz2 C-tails. The respective mutations generated and analyzed are indicated above the sequence (see also Table 1 for complete data set). As in Figures 2 and 3, dpp-Gal4 was used to drive expression of the respective mutants, and these were detected by anti-Myc staining in third instar wing discs. Examples for Fz1–1-1V559E (V to E substitution) are shown in (B) (localization) and (F) (function). All other mutants analyzed as shown in (A) are listed in Table 1. (C–E, G, and H) show the effects of the Fz2 C-tail-specific sequences. The Fz2 C-tail was truncated at the position of the Fz1 stop codon (amino acid L633), yielding a short Fz2 C-tail (2S). The localization (C and D) and GOF PCP function (G and H) of the respective chimeras, Fz1–2-2S and Fz1–1-2S, is shown. Note that both chimeras localize apically (C and D), and Fz1–1-2S shows a strong PCP GOF phenotype (H), very similar to Fz1–1-1 (see Figure 3B). Fz1–2-2S shows only a very weak PCP phenotype (G), mainly occurring at an anterior distal region of the wing (marked by arrow; the rest of the wing is wild-type). (E) Subcellular localization of Fz1–1-1C2. Fz1–1-1C2 is Fz1 with the addition of the Fz2-specific tail extension (see Materials and Methods). Note ubiquitous protein localization within the apical–basal axis (E) and a much reduced PCP activity, as compared to wild-type Fz1–1-1, in the functional assay (I). The phenotype is much weaker than in wild-type Fz1 (compare with [F] and [H] and Figure 3B).\n", - "666 \n", - " Rescue of the fz− Eye Phenotype with tub-Promoter-Driven Fz ChimerasTangential eye sections with corresponding schematic in lower part of panel reflecting ommatidial polarity (respective genotypes are also marked below each panel). Black arrows, dorsal chiral form; red arrows, ventral chiral form; green arrows, symmetric ommatidia; black circles, ommatidia with missing photoreceptors. Anterior is to the left, dorsal is up, and an area around the equator is shown for each genotype.(A) Section of a wild-type eye (equator is indicated by yellow line).(B) fzP21/fzR52 (fz null). Note random orientation of ommatidia.(C) fzP21/fzR52; tub-fz1–1-1. The fz− phenotype is fully rescued (100% with respect to chirality; only a minor rotation wobble is rarely seen).(D) fzP21/fzR52; tub-fz1–1-2. Note partial rescue with respect to polarity (approximately 83%) and occasional photoreceptor loss representative of Wg/β-cat signaling.(E) fzP21/fzR52; tub-fz1–1-2S. Note 100% rescue, identical to wild-type Fz1 (compare with [C]).(F) fzP21/fzR52; tub-fz1–2-1. No rescue due to the presence of the Fz2 7-TM region. This chimera actually shows a mild dominant negative behavior as apparent by the increased percentage of symmetric clusters (approximately 50% as compared to fz− [approximately 15%]).\n", - "667 \n", - " Subcellular Localization of Fz1–1-1 in fmi− Mutant ClonesFz1–1-1 (Myc-tagged; shown in green) is expressed with omb-Gal4 (in large parts of the third instar wing pouch). fmiE59 clones were labeled by the absence of anti-βGal staining (red). A projection of several horizontal sections in the apical region (A) and the corresponding xz-section (B) across the clone (as indicated by a white line in A) are shown. Fz1–1-1 is localized apically inside and outside the clone, indicating that initial apical Fz recruitment is independent of Fmi.\n", - "668 \n", - " Overexpression of Apically Localizing Fz1/2 Chimeras Has an Inhibitory Effect on Canonical Wnt Signaling(A–D) show adult wings of the respective genotypes. Anterior is up and distal to the right.(A) Adult wing of an en-Gal4/+; UAS-fz1–1-1/+ fly (en>fz1–1-1). en-Gal4 drives UAS reporter genes only in the posterior compartment. Inset shows high magnification of region marked by arrowhead. Some wing margin bristles are missing (arrow) in the posterior compartment. The border between anterior (“a”) and posterior (“p”) compartments is marked with black line.(B) dshV26/+; en>fz1–1-1 adult wing. Note enhancement of the margin bristle phenotype: all margin bristles are missing from the area between the arrows in the posterior compartment.(C) en>fz2–1-1 wing. Most of the wing margin bristles are missing in the posterior compartment. Note also that the posterior compartment is smaller.(D) en>fz2–2-1 wing. Again the posterior compartment is smaller and most of the margin is missing.(E–G) show that Fz1–1-1 expression increases apical localization of Dsh-GFP and reduces Dsh-GFP in more basolateral areas of wing cells. (E) and (F) are xy-horizontal optical sections, and (G) is an xz-cross section. The positions of (E) and (F) sections are indicated in (G).(E) Apical xy-optical section of a third instar wing disc. Fz1–1-1 (red) is overexpressed by en-Gal4 in the posterior compartment (anterior–posterior border is labeled by white line, and the corresponding compartments are labeled “a” and “p,” respectively). Dsh-GFP (green) accumulates at higher levels apically in the posterior compartment. Single-channel Dsh-GFP staining is shown at right. In wild-type disc, Dsh-GFP is evenly distributed with no anterior–posterior bias (not shown).(F) A more basal xy-section of the same disc as in (E). Note reduction of Dsh-GFP staining in the posterior compartment, except at the apical junctions as seen in folds (arrowhead). In the anterior compartment, where Fz1–1-1 is not overexpressed, Dsh-GFP is only slightly enriched in the apical folds (arrow).(G) xz-section of the same wing disc shown in (E) and (F), with top panel showing double labeling for anti-Myc (red) and anti-Dsh-GFP (green) and bottom panel showing single channel of Dsh-GFP staining.(H) xz-section of a comparable disc expressing Fz2–1-1 in the posterior compartment. Fz2–1-1 overexpression (red) also causes accumulation of Dsh-GFP in apical junctions and reduction of Dsh-GFP along the basolateral region.\n", - "669 \n", - " Epigenetic Imprints at the Initiation of X Inactivation(A–H) Indirect immunofluorescence and subsequent DNA FISH analysis on mitotic chromosomes prepared from undifferentiated clone 36 ES cells after 3 d of Xist induction. H3K27m3 (A), H4K20m1 (B), and Ezh2 (D) are enriched on the arms of Chromosome 11 upon ectopic Xist expression. H3K9m2 (C) is not enhanced upon Xist expression. H3K4m2 (E) is reduced on Chromosome 11 upon Xist induction (green box) and absent from pericentric heterochromatin and the Y chromosome (orange arrow). (F) Histone H4 multiple-lysine acetylation is partially reduced (green box, left panel). Hypoacetylation (red) is restricted to chromosomal regions which show high levels of H3-K27 trimethylation (green, right panel). H3K9m3 (G) and H3K27m1 (H) are enriched at constitutive heterochromatin of pericentric regions and the Y (orange arrows).(I–K) Indirect immunofluorescence (upper panels) and subsequent Xist RNA FISH (red, Xist RNA; blue, DAPI) analysis of H3K27m3 (I), H4K20m1 (J), and Ezh2 (K) in interphase nuclei of undifferentiated clone 36 ES cells expressing Xist for 3 d.\n", - "670 \n", - " ChIP Mapping of H3K27m3, H4K20m1, H3K9m2, H3K4m3, and H3K4m2 on the Xist-Expressing Chromosome 11 during Differentiation of Clone 36 ES CellsA genetic map of Chromosome 11 indicating the loci analysed is given on the left (Xist-TG, approximate integration site of Xist transgene; puro, PGKpuromycin marker).(A to F) Chromatin was prepared from undifferentiated clone 36 ES cells grown for 3 d in the presence (light bars) or absence (dark bars) of doxycycline. H3K27m3 and H4K20m1 were enriched at three intergenic microsatellite sequences at 18.0 (A), 45.5 (C), and 75.2 (D) cM. (B) H3K27m3 was established over the coding sequence of PGKpuromycin in doxycycline-induced cells, which was accompanied by a loss of H3K4m2 and H3K4m3. (E) Tubulin control. (F) Control microsatellite located on Chromosome 15.(G–L) Analysis of H3K27m3, H4K20m1, and H3K9m2 in clone 36 ES cells differentiated for 9 d with (light bars) or without (dark bars) doxycycline. Histone methylation marks were monitored. Experiments were performed in duplicate, and the standard error is indicated in the graphs.\n", - "671 \n", - " Sequences of Xist RNA Required for H3K27m3 Establishment(A) Schematic representation of the Xist cDNA (top) indicating repeats A to E, restriction sites, and the locations of deletions (coloured bars) relative to the location of sequences required for localisation (black and hatched boxes; Wutz et al. 2002).(B) Analysis of H3K27m3 on metaphase chromosome spreads from undifferentiated ES cells after 3 d of Xist induction (see text). The staining patterns (n > 100) were scored as chromosome-wide dense methylation (black), reduced methylation (grey), and a single band (open).(C) Pattern of H3K27m3 triggered by different Xist mutants on metaphase chromosomes after 3 d of induction. Enlarged view of Chromosome 11 (clone 36) or the X chromosome (T20 lines, J1 knock-in line).(D) Focal H3K27m3 staining in interphase nuclei (percentage given; n > 100) of undifferentiated ES cells expressing Xist constructs.\n", - "672 \n", - " Restriction of H3K27m3 Establishment and Transcriptional Silencing in Differentiation(A) Initiation of H3K27m3 during clone 36 ES cell differentiation. Xist expression was induced at the beginning (+) or at various time points (24 to 120 h) after the start of differentiation, or not induced (−). The percentages of interphase cells showing H3K27m3 (black bars; n > 700) and Ezh2 (grey bars; n > 200) staining were determined at day 12 of differentiation.(B) Initiation of transcriptional silencing during differentiation was assessed by Northern blot analysis of PGKpuromycin (puro) and Gapd as a loading control in parallel cultures as described for (A).(C) Western analysis of Ezh2 and Eed protein levels during differentiation of clone 36 ES cells after induction with retinoic acid. Histones H3 and H4 were used as a loading control.(D) Establishment of H3K27m3 during embryonic development. Xist expression was induced from the single X chromosome of male Xist-tetOP embryos (see text) for 3 d (E9.5–12.5 and E13.5–16.5). The percentage of cells with H3K27m3 staining in interphase (left) and clusters of Xist RNA (right, open bars) are given (n > 300). Grey areas indicate the proportion of H3K27m3-positive cells to Xist-positive cells.(E) Xist RNA FISH (top) and H3K27m3 (bottom) staining of histological sections prepared from neck connective tissue of embryos described in (C).\n", - "673 \n", - " Kinetic Study of H3K27m3 Stability(A) The percentage of interphase nuclei (n > 100) showing H3K27m3 staining and Xist RNA was analysed for undifferentiated clone 36 ES cells, which expressed Xist for 3 d (+) or were further grown without inducer for 6, 12, 24, or 48 h.(B) Representative images of the time points analysed in (A) are shown.(C) Reversibility of H3K27m3 in differentiating clone 36 ES cells. The percentage of interphase cells showing H3K27m3 staining (n > 100) was determined for cells differentiated for 4 d in the presence of doxycycline (+) or further differentiated for 48, 72, or 96 h in the absence of inducer.\n", - "675 \n", - " Establishment of Chromosomal Memory during ES Cell Differentiation(A) Clone 36 ES cells were differentiated for 13 d in the presence of doxycycline (lane 1) or in the absence of inducer (lane 2) and the percentage of cells with H3K27m3 staining was determined (n > 800). At the beginning of differentiation, parallel cultures received either no Xist induction (lane 3) or a pulse of doxycycline for 24 h (lane 4), 36 h (lane 5), 48 h (lane 6), 60 h (lane7), or 72 h (lane 8) followed by withdrawal of inducer and concerted late induction from day 8 to day 13. A dashed red line indicates the 24-h interval of the transition when the chromosomal memory is recruited.(B and C) Establishment of irreversible transcriptional silencing during differentiation.(B) Ectopic inactivation of Chromosome 11 caused by Xist induction in differentiating clone 36 ES cells was assessed by Northern blot analysis of PGKpuromycin (puro) and Gapd as a loading control. Lanes were aligned electronically for better readability. ES cells were differentiated for 13 d in the presence of doxycycline (lane 1) or in the absence of inducer (lane 2). At the start of differentiation, parallel cultures received a Xist pulse for 24, 36, 48, or 60 h followed by withdrawal of inducer for the rest of the time (lanes 3 to 7) or followed by reinduction of Xist at day 8 of differentiation (lanes 8 to 11). All cells were analysed at day 13 of differentiation.(C) A quantitation of the puro expression relative to Gapd was derived from two independent Northern blots using tnimage software. A dashed red line indicates the 24-h interval in which the transition from reversible to irreversible silencing occurs.\n", - "676 \n", - " Model for the Transition from Initiation to Maintenance of X InactivationPhases of X inactivation are given relative to days of ES cell differentiation (bottom).(A) In undifferentiated ES cells, efficient chromosome-wide H3K27m3 depends on both Xist RNA localisation to the chromosome in cis and initiation of transcriptional silencing via the A repeat (black triangles).(B) Early in differentiation, silencing becomes dispensable for high-level H3K27m3 (dotted arrow).(C) The beginning of the critical window is specified in that Xist loses its potential to trigger H3K27m3 (dotted arrow) and transcriptional silencing. The critical window is negotiated by sustaining high levels of H3K27m3, which is thought to constitute—together with Xist RNA—the signal for the recruitment of the chromosomal memory (black oval). The memory is established on the Xi exactly when silencing becomes irreversible and Xist independent.(D) During the maintenance phase of X inactivation the chromosomal memory allows Xist RNA to establish H3K27m3 efficiently.\n", - "677 \n", - " Hairy Binds to a Specific Set of Transcriptional Targets(A and B) Comparison of DamID-identified targets for Hairy with the Drosophila Myc and Mad/Mnt family proteins. Venn diagram comparing DamID-identified Hairy downstream targets in Kc cells compared to the transcriptional activator dMyc (A) and the transcriptional repressor dMnt (B).(C) Venn diagram comparing DamID-identified Hairy targets from Kc cells and embryos.\n", - "680 \n", - " Binding of Hairy to Class C (C-Box) Sites in Putative Targets In Vitro(A) Schematic diagram (not to scale) of C-boxes within putative Hairy targets. C-boxes (Hairy binding sites) are denoted by white boxes, black arrows indicate transcription start sites (Ra, Rb, and Rc), ATG denotes the initiating methionine, and capital letters indicate bases matching with the Hairy consensus C-box. The distances in kilobases of the C-boxes from transcription start sites are noted in gray.(B) EMSA with either GST or GST–Hairy and the ac h/E-1 oligonucleotide. Lane 1, probe alone; lane 2, binding to probe by GST; lanes 3–5, binding to probe by GST–Hairy. In lanes 4 and 5, binding to probe by GST–Hairy was in the presence of competitor unlabeled oligos. An arrow indicates the Hairy–DNA complex; compwt and compmut indicate wild-type and mutated cold probes, respectively.(C) EMSA with either GST or GST–Hairy to the C-boxes within the stg and prd genes. Lanes 1–5, GST and GST–Hairy binding to the stg C-box (location: 25072658); lanes 6–10, GST and GST–Hairy binding to the prd C-box. (location: 12074032). Lane order and annotations are as in Figure 4B.(D) EMSA with GST–Hairy to the same C-box within the stg 4.9-kb genomic fragment is not competed by the presence of mutant competitor unlabeled oligo. Lane 1, probe alone; lane 2, binding to GST; lane 3, binding to probe by GST–Hairy; lanes 4 and 5, binding to probe by GST–Hairy in the presence of wild-type and mutant competitor unlabeled oligos, respectively.(E) Differential binding to C-boxes within the egh gene. EMSA with either GST or GST–Hairy to C-boxes within the egh promoter and transcribed region. Binding to three putative C-box sites is shown: egh1 (location: 2341609), egh2 (location: 2350367), and egh3 (location: 2352168). Lanes 1, 5, and 9: probe alone; lanes 2, 6, and 10: binding to probes by GST; lanes 3, 7, and 11: binding to probes with GST–Hairy. Lanes 4, 8, and 12: binding with GST–Hairy in the presence of unlabeled wild-type competitor. C-box locations and promoter information generated using Apollo (Berkeley Drosophila Genome Project).\n", - "682 \n", - " Hairy Binds to Putative Target Loci on Polytene Chromosomes(A) Hairy binds to polytene region 1A, the location of the Hairy target, ac.\n", - "(B) Hairy is not found at 84A, the cytological location for ftz.\n", - "(C–F) Hairy also binds to polytene region 99A, the location of stg (C); polytene region 3A, the location of egh (D); polytene region 33C, the location of prd (E); and polytene region 82A, the location of hkb (F).(G–I) Hairy is recruited to the insertion site for the pstg βE-4.9 reporter construct (arrow in [H] and [I]). Compare to the equivalent region of wild-type X chromosomes marked by brackets in (A), (D), and (G).(J) In situ hybridization to polytene chromosomes from pstg βE-4.9 larvae showing that this line has two insertions on the X chromosome at 1F and 6C. The probe also recognizes sequences to the endogenous white locus (asterisk).\n", - "683 \n", - " Hairy Overlaps with Cofactors Differentially(A–C) Venn diagram showing the overlap between Hairy targets and those loci also binding to the cofactors Groucho (A), dCtBP (B), and dSir2 (C).(D) Venn diagram showing combined overlaps of Hairy with its three known cofactors.\n", - "685 \n", - " Hairy Shows Context-Dependent Association with Its Cofactors(A) Sites of Hairy binding and Hairy cofactor recruitment based on DamID. The gray lines depict the relative position on the chromosomes of the approximately 6200 cDNAs on the microarray chip. The blue dots below the line represent Hairy binding sites while the green (Groucho), red (dCtBP), and yellow (dSir2) dots represent the positions of cofactor recruitment.(B–D) Cofactor recruitment visualized on third instar larval salivary gland chromosomes. Polytene chromosome sets stained (green) with antibodies to Groucho (B), dCtBP (C), and dSir2 (D). All chromosomes were counterstained with DAPI (blue) to visualize the DNA.(E) Higher magnification view of chromosome arms 2L and 2R costained with Groucho (red) and Hairy (green), and the merged image.(F) Higher magnification view of chromosome arm 2L costained with dCtBP (red) and Hairy (green), and the merged image, compared to the predicted DamID map. Note that both the DamID projected map and polytene chromosomes have more dCtBP recruitment sites to the left of the dashed line than to the right of the dashed line.(G) Chromosome arm 3R stained with dSir2 (green), highlighting regional specificity of dSir2 recruitment.(H and I) Higher magnification view of the distal ends of chromosome arms 2R (H) and 3L (I) from (D), stained with dSir2 (green), showing regional specificity and lack of dSir2 recruitment, respectively.\n", - "686 \n", - " ψV Gene Deletion(A) Physical map of the rearranged Ig light chain locus in the chicken B-cell line DT40 and the ψV knockout constructs. The locus contains a total of 25 ψV genes upstream of the functional V segment. The strategy of knocking out ψV genes by the targeted integration of the pψVDel1-25 and the pψVDel3-25 constructs is shown. Only the relevant EcoRI sites are indicated.(B) Southern blot analysis of wild-type and knockout clones using the probe shown in (A) after EcoRI digestion. The wild-type locus hybridizes as a 12-kb fragment, whereas ψVpartial and ψV– loci hybridize as 7.4-kb and 6.3-kb fragments, respectively.(C) AID status. The AID gene was amplified by PCR to verify the presence or absence of the AID cDNA expression cassette.\n", - "687 \n", - " sIgM Expression Analysis of Control and ψV Knockout Clones(A) FACS anti-IgM staining profiles of representative subclones derived from initially sIgM(+) clones.(B) Average percentages of events falling into sIgM(–) gates based on the measurement of 24 subclones.\n", - "689 \n", - " Mutation Profiles of Hypermutating Cell Lines(A) Percentages of sequences carrying a certain number of mutations. Each untemplated nucleotide substitution is counted, but gene conversions, deletions, and insertions involving multiple nucleotides are counted as single events. PM, point mutation; GC, gene conversion; D, deletion; I, insertion.(B) Hotspot preferences of untemplated nucleotide substitution mutations. Mutations occurring within a hotspot motif (RGYW or its complement WRCY) are shown by percentages. The hotspot preference was statistically significant (p < 0.05) by the standard difference test.(C) Patterns of nucleotide substitutions within sequences from ψV and the XRCC3 knockout clones. Nucleotide substitutions as part of gene conversion events are excluded. The ratios of transitions (trs) to transversions (trv) are also shown.\n", - "693 \n", - " Identification and Phenotype of Treg Cells(A) Purified CD4+ T-cells were stained with anti-CD45RO-FITC and anti-CD25-PE antibodies. The naïve, memory, and Treg subsets were identified as shown in boxes.(B) Purified CD4+ T-cells were first stained with a pure antibody against the cell surface molecule shown in the figure, followed by antimouse IgG conjugated with allophycocyanin, followed by CD25-PE and CD45RO-FITC. Gates were set for Treg, memory, and naïve T-cells as shown in (A). These results are representative of one out of five donors analyzed.\n", - "695 \n", - " Proliferation and Suppressive Capacity of Treg Cells(A) Sorted Treg and memory T-cells were labeled with CFSE and then activated through suboptimal anti-CD3 (100 ng/ml) and anti-CD28 (1 μg/ml) antibodies. Day 6 postactivation, cells were fixed and CFSE expression was analyzed by flow cytometry.(B) Resting naïve or memory CD4+ T-cells (1.5 × 105 T-cells) were labeled with CFSE and cocultured with either unlabeled purified Treg, naïve, or memory T-cells at 1:1 ratio in 96-well plates coated with suboptimal anti-CD3 (100 ng/ml) and anti-CD28 (1 μg/ml) antibodies. At day 4 postactivation, cells were fixed and analyzed for CFSE expression and cell size by flow cytometry.(C) Regions were set based on 2-fold reduction in CFSE mean intensity of naïve or memory T-cells as gated on (B), and plotted as number of cell divisions. Results represent three separate experiments from three different donors.\n", - "696 \n", - " HIV Infection of Treg Cells(A) Sorted Treg and memory T-cells were activated using plate-bound anti-CD3 (3 μg/ml) and soluble anti-CD28 (1 μg/ml) antibodies and concurrently infected with R5.HIV or VSV-G.HIV at a MOI of 5 (based on prior virus titration using Hut78/CCR5 cells). The percentage of infected cells was determined by GFP expression at 3 d postinfection by flow cytometry.(B) Supernatants from Treg and memory T-cells infected with R5.HIV cultures were collected at different time points and HIV p24 levels were measured by ELISA.(C) Treg cell death was assessed by analyzing infected cells at days 3 and 7 postinfection based on forward- and side-scatter analysis and in some experiments using propidium iodine staining analysis with flow cytometry. All of the infection results are representative of one out of five separate experiments with reproducible results. Statistical significance was determined using the Student's two-tailed t test. *\n", - "p < 0.05.\n", - "697 \n", - " Phenotype of FoxP3 Transduced T-cellsPurified CB naïve CD4+ T-cells were activated through the TCR and transduced with either HDV.FoxP3 or HDV. Cells were expanded for 14 d in IL-2-containing medium and stained with (A) anti-mCD24, anti-GITR, and anti-CD25, (B) anti-mCD24 and anti-CCR4, or (C) anti-mCD24 and anti-CCR5 antibodies. Gates were set on the mCD24-positive population (transduced), and expression of surface molecule was analyzed. The expression of these markers in the CD24-negative portion of both cultures was identical (data not shown). These results are representative of T-cells isolated from five different donors and transduced independently.\n", - "698 \n", - " Cytokine Production by FoxP3-Transduced T-cellsCD4+ naïve T-cells isolated from CB (CB-naïve) and AB (AB-naïve) and memory T-cells from AB (AB-memory) were transduced with HDV or HDV.FoxP3 as described in Figure 5. Transduced T-cells were purified through magnetic sorting of mCD24+ cells and activated using plate-bound anti-CD3 and soluble anti-CD28 antibodies. Supernatants were collected at 18–24 h postactivation and analyzed for (A) IL-2 production or (B) IFNγ, IL-4, and IL-5 production from HDV or HDV.FoxP3-tranduced naïve T-cells, using CBA assay. The results represent five separate experiments from different donors with similar relative differences in cytokine production.\n", - "699 \n", - " Proliferation and Suppression by FoxP3-Expressing Cells(A) Purified CD4+ naïve and memory T-cells were transduced with either HDV.FoxP3 or HDV as described. The transduced T-cells were labeled with CFSE and activated with anti-CD3 (100 ng/ml) and anti-CD28 (1 μg/ml) antibodies. Day 6 postactivation, cells were fixed and analyzed for CFSE expression by flow cytometry.(B) Resting CD4+ T-cells (1.5 × 105) were labeled with CFSE and cocultured at 1:1 with either unlabeled sorted HDV.FoxP3-expressing or HDV-transduced CB naïve T-cells and activated with anti-CD3 (100 ng/ml) and anti-CD28 (1 μg/ml ) antibodies. At 4 d postactivation, cells were stained with mCD24-PE as a marker for infection.(C) Naïve and memory T-cells isolated from adult blood were transduced with HDV.FoxP3 or HDV. A coculture suppression experiment was set up with resting purified autologous CD4+ T-cells as described above. Region was set on mCD24 negative CFSE+ cells (target resting CD4+ T-cells) as shown in (B), and CFSE expression was analyzed 6 d poststimulation by flow cytometry. The results are representative of three separate experiments.\n", - "700 \n", - " HIV Infection of FoxP3-Expressing T-cells(A) HDV.FoxP3 and HDV-transduced T-cells were activated using plate-bound anti-CD3 (100 ng/ml) and soluble anti-CD28 (1 μg/ml) antibodies or maintained in IL-2-containing medium. Cells were concurrently infected at different MOI of VSV-G.HIV, and infection was determined by GFP expression at 72 h postinfection by flow cytometry.(B) Supernatants were collected at different time points from R5.HIV-infected HDV.FoxP3-expressing or HDV-transduced cell cultures, and HIV p24 levels were measured by ELISA. The percentages of infected cells at days 3, 9, and 16 for HDV.FoxP3 were 2, 10, and 26, and for HDV were 0.8, 10, and 18, respectively.\n", - "701 \n", - " FoxP3 Expression in Purified CD4+CD25hi (Treg), Naïve, and Memory T-cells from HIV-Infected and Healthy Individuals(A) RNA was isolated from sorted Treg, naïve, and memory T-cells from HIV-positive (n = 24) and HIV-negative (n = 11) subjects, followed by cDNA synthesis. FoxP3 expression was quantified by TaqMan real-time PCR. The FoxP3-fold difference expression was calculated for CD4+CD25hi (Treg) versus naïve (N), and memory (Mem) versus naïve (N) T-cells. Treg cells sorted from HIV-positive subjects were further subdivided into two groups based on FoxP3 expression of Treg compared to naïve T-cells (FoxP3-high, n = 13, FoxP3 difference >10-fold; FoxP3-low, n = 11, FoxP3 difference <10-fold; HIV-negative, n = 9). These groups were stained with anti-CD3, anti-CD4, anti-CD45RO, anti-CD25, and anti-HLA-DR and analyzed by flow cytometry for (B) CD4+ T-cell percentage, (C) activated T-cell percentage (CD4+HLA-DR+), and (D) CD4+CD25hi percentage. Horizontal lines identify means. Statistical significance between groups was determined by Mann–Whitney U test and shown on top of each figure.\n", - "707 \n", - " Number of LS Genes for Indicated Hominoid LineagesTotals of aCGH-identified LS genes are indicated for single lineages (A) and multiple (B) lineages, showing both increases (+) and decreases (–) for each. The numbers reflect totals after collapsing the dataset by UniGene cluster to remove redundant cDNAs corresponding to the same gene. Bonobo represents genes unique to this species; likewise with chimpanzee. “Bonobo and chimpanzee (pre-split)” refers to genes that were changed in both species and therefore likely occurred before these species diverged, and “bonobo and chimpanzee (total)” refers to the sum of the previous three categories, which was chosen to represent the period since the Homo/Pan split. Estimated evolutionary age of each lineage is also plotted for comparison. Letters denoting different great ape species are as in Figure 1. For (B), bonobo and chimpanzee were grouped together as one lineage (C), but selection criteria had to first be met by both species independently. In (B), no LS genes were identified for the following cases: C(+)G(–); CG(–)O(+); C(–)GO(+); and CO(+)G(–).\n", - "708 \n", - " FISH Confirmation of a Human-Specific Duplication of a Gene Cluster on Chromosome 5q13.3 Detected by Interspecies cDNA aCGH(A) Human duplication of a cluster of genes at Chromosome 5q13.3. is shown by two separate, and sometimes multiple, red BAC probe (CTD-2288G5) signals in interphase cells, with only one green BAC probe signal (RP11-1077O1) for a flanking region. Metaphase FISH shows both probes at band 5q13. The third nucleus in (A) shows four signals of the control probe (green) and eight copies of the BAC probe duplicated in the aCGH assay, consistent with the pattern expected in an S/G2 nucleus.(B–E) Bonobo (B), chimpanzee (C), gorilla (D), and orangutan (E) interphase FISH studies all show no increased signal for the human duplicated gene cluster, with signals of comparable size for the CTD-2288G5 (red) and the flanking RP11-107701 (green) probes. Metaphase FISH analyses show the gene cluster to be in the p arm of Chromosomes 4 (corresponding to the human Chromosome 5) in both the bonobo and chimpanzee, in the q arm of Chromosome 4 (corresponding to the human Chromosome 5) in the orangutan, and in the p arm of the gorilla Chromosome 19 (syntenic regions to human Chromosomes 5 and 17).\n", - "709 \n", - " Independent Confirmation of Interspecies cDNA aCGH Data for Three Gene Families with Known Species Differences in Copy NumberThe chromosomal location, IMAGE clone ID, and GenBank accession are provided for each cDNA. The species average log2 ratios for each cDNA clone and the previously published estimate of gene copy number are shown for the indicated species. Also shown are TreeView images of interhominoid aCGH results for the indicated cDNAs, and a graphical depiction of the correlation between aCGH signal and published estimate of gene copy number (PECN).(A) FGF7 cDNA clone located on human Chromosome 15 was identified using the UCSC November 2002 human genome assembly and FGF7-like cDNA clones located on human Chromosome 9 were identified based on UniGene cluster sequence similarity to FGF7 reference sequence NM_002009. The correlation between published and aCGH-based copy number estimates is 0.97.(B) morpheus family cDNA clones were identified based on sequence similarity to one morpheus family member (Johnson et al. 2001). As in (A), except data relate to the morpheus genes and published data are from Johnson et al. (2001). Correlation = 0.97.(C) As in (A), except data relate to the CXYorf1 genes and published data are from Ciccodicola et al. (2000). Correlation = 0.99.\n", - "717 \n", - " Variation of Waggle Duration with Feeder Distance in Experiment 1In this experiment, flight was over land (segment 1), water (segment 2), and again over land (segment 3) (see Figure 1). Symbols depict mean waggle durations. Bars represent standard error of the mean. R, correlation coefficient. (A) shows a global linear approximation of the data, using a single regression for the entire data set (solid line). Broken curves depict 95% CIs for regression slope. (B) shows a piecewise linear approximation of the data, using separate regressions for the data over land, water, and the island. Equations represent regression lines.\n", - "718 \n", - " Variation of Waggle Duration with Feeder Distance in Experiment 2For the purposes of comparative analysis, the data were artificially divided into segments corresponding to the land, water, and island segments of experiment 1 (see Figure 2). (A) shows a global linear approximation of the data, using a single regression for the entire data set. (B) shows a piecewise linear approximation of the data as they correspond to the segments of experiment 1. Other details are the same as in Figure 2.\n", - "719 \n", - " Land and Water TerrainExamples of scenes over land (A) and water (B) that were photographed and analyzed for mean contrast within windows of various sizes, as illustrated by the red boxes in the center of the photographs. Results are given in Tables 1 and 2.\n", - "720 \n", - " Terrain Along Which the Bees Were Trained to Fly in Segment 3 of Experiment 2These two photographs show the terrain along which the bees were trained to fly in segment 3 of experiment 2. In (A) the sun was shining clearly, while in (B) it was behind a cloud. The rectangles depict the area within which mean contrast was measured (details in text).\n", - "722 \n", - " Examples of Electrophysiological Correlates of Behavioral StatesThis figure shows four 1-min samples each containing three EEG recordings (left hemisphere vs. right hemisphere [L v. R], left hemisphere vs. neutral reference [L], and right hemisphere vs. neutral reference [R]) and one EMG from one sparrow (no. 65) depicting the typical electrophysiological correlates of each behavioral state.(A) Transition from SWS (blue) to wakefulness (black).(B) Drowsiness (gray).(C) Transition from SWS (blue) to a bout of REM sleep (red), and then a brief awakening (black), followed by a return to SWS (blue).(D) Wakefulness during a period of migratory restlessness.High-amplitude artifacts associated with gross movements are shaded with a gray background. (A–C) were recorded on 11 August 2003, during the summer while the bird was in a nonmigratory state, and (D) was recorded on 11 October 2003, during the fall migratory period.\n", - "723 \n", - " Changes in Sleep during Fall MigrationBehavioral state was scored across 24-h (noon to noon) periods using a combination of video and electrophysiological recordings for birds in a nonmigratory (n = 5) and migratory (n = 8) state. The plots and table reflect the average for all birds in each group. All recordings were performed under a 12:12 LD photoperiod with lights turned off at 18:00 and on at 06:00.(A) Proportion of time in each behavioral state for nonmigrating (top) and migrating (bottom) birds. The proportion of every 10-min period spent in each sleep/wakefulness state was calculated for each bird and then averaged across all birds: wakefulness (black), drowsiness (gray), SWS (blue), and REM sleep (red). Note that overall sleep propensity in migrating birds is greatly diminished between approximately 22:30 and 06:00. Note also the increased propensity for REM sleep from 18:00 to 20:00 as compared to the same time period when not migrating.(B) Sleep and REM sleep latencies. Sleep latency was calculated as the length of time from lights out until the first occurrence of sleep (in all cases SWS) for birds in a nonmigratory and migratory state; average sleep latency did not differ significantly between nonmigrating and migrating birds. REM sleep latency was calculated as the length of time from sleep onset to the first occurrence of REM sleep. Note that REM sleep occurred earlier in sleep during migration for all five birds that were recorded in both a nonmigratory and migratory state (t = 3.3, paired, two-tailed, p < 0.05). Note also that the REM sleep latencies for the three birds recorded only in a migratory state were shorter than the shortest REM sleep latency in nonmigrating birds.(C) Sleep percentages. Average daily percentages of sleep and wakefulness states for birds in a nonmigrating (n = 5) and migrating (n = 8) state. Total sleep is the sum of SWS and REM sleep. For all states of vigilance, values for the migrating condition differed significantly from the nonmigrating condition (p < 0.01, after Bonferroni correction). The proportion of total sleep occupied by REM sleep was not significantly different between migratory states.\n", - "733 \n", - " \n", - "Phytophthora Infestations(A) Potato and (B) cacao pod.(Reproduced courtesy of Sophien Kamoun, Ohio State University [A], and Christopher J. Saunders and the USDA Agricultural Research Service [B].)\n", - "735 \n", - " Reproductive Structures of the Phytophthora\n", - "The asexual (A) sporangia, (B) zoospores, and (C) chlamydospores, and the sexual (D) oospores.(Reproduced courtesy of Matteo Garbelotto, UC Berkeley [A, D], and Edwin R.Florance, Lewis & Clark College [Portland, Oregon, United States] and the USDA Forest Service Pacific Southwest Research Station in Albany, California [B, C].)\n", - "741 \n", - " Figure-Eight-Shaped Waggle Dance of the Honeybee (Apis mellifera)A waggle run oriented 45° to the right of ‘up’ on the vertical comb (A) indicates a food source 45° to the right of the direction of the sun outside the hive (B). The abdomen of the dancer appears blurred because of the rapid motion from side to side. (Figure design: J. Tautz and M. Kleinhenz, Beegroup Würzburg.)\n", - "748 \n", - " Scab Formation and Resolution during Puncture Wound Healing(A) Puncture wound assay. L3 larvae are punctured at the dorsal midline with a 100-μm diameter pin; they are then cultured and the healing wounds analyzed as shown.(B–E) Photomicrographs of heat-killed L3 larvae before wounding (B) and at the indicated times after wounding (C–E). Note larval growth during wound healing. Anterior is up.(F) L2 larva wounded as above and analyzed in L3, 60 h after wounding. Wounding in L2 allows visualization of late stages of wound healing without the complication of pupariation, which begins about 48 h after wounding in the standard L3 assay.(G) A mock-wounded L2 larva visualized 60 h after wounding. Note that it and the wounded larva (F) grew to a similar extent.(H–M) Close-up images of (B–G) showing unwounded cuticle (H and M) or wound sites (I–L, boxed regions in C–F) to show detail of scab. Micrographs are of living larvae taken shortly before the corresponding images of the whole heat-killed larvae above. Bar, 500 μm (for B–G), 50 μm (for H–M).(N) Timing of wound responses. Solid lines, time response was most often observed; dashed extensions to left, time response was occasionally observed; dashed extensions to right, time response was diminishing; BL, basal lamina.\n", - "749 \n", - " Epidermal Cell Orientation and Fusion around Puncture Wounds(A–E) w; UAS-GFP.nls/+; A58-Gal4/+ larvae that express GFP (green) in epidermal cell nuclei were mock-wounded (A) or puncture wounded (B–E), cultured for the indicated time, filleted open, fixed, and immunostained for Fasciclin III (red) to label the basolateral surface of the cells.(A) Pre-wounding. Dashed circle, size of the 100-μm pin used for wounding.(B) 2 h postwounding. Some cells at the wound margin have elongated and oriented toward the wound (arrowheads).(C) 8 h postwounding. Cells at the wound margin have begun fusing to form a syncytium. Note the syncytium with four nuclei that contains a partially degraded, radially-oriented membrane domain (arrow) and scattered puncta of Fasciclin III staining in the cytoplasm (arrowhead) that may be membrane breakdown intermediates.(D) 48 h postwounding. The central syncytium contains ten or more nuclei, some of which are located in extensions (arrowheads) that may represent recent fusions of peripheral cells with the central syncytium. Other peripheral cells have oriented toward the syncytium but not fused with it.(E) 60 h postwounding. A large syncytium with more than 30 nuclei.(F) 8 h postwounding. Larva was treated as above but immunostained for Coracle (red), a septate junction component. The central syncytium contains nine nuclei.Bar, 50 μm.\n", - "750 \n", - " Ultrastructural Analysis of Puncture Wound Healing(A) Schematic of unwounded epidermis showing the cell monolayer, its apical cuticle lining, and basal lamina. White ovals indicate nuclei.(B) Schematic of recently wounded epidermis showing a plug of cell debris in the wound gap. Cells and ruptured cuticle at the wound margin are shown.(C–S) TEM sections of unwounded (C–F) and wounded (G–S) larvae at the times indicated after wounding. Transverse sections through each wound site are shown (C, G, J, N, and Q) along with close-ups of the boxed regions at right. c, cuticle; d, debris; e, epidermis; ec, epicuticle; m, muscle; n, epidermal nucleus; p, plug; pc, procuticle; s, scab; t, trachea(C) Pre-wounding. The epidermis and cuticle are intact.(D) Apical surface of epidermal cell showing villi (arrowhead) that secrete cuticle.(E) Basal surface. Arrowhead, basal lamina.(F) Epidermal cuticle. The epicuticle (top three layers) overlies the striated procuticle layer.(G) 1 h postwounding. The epidermis and cuticle are discontinuous but the gap is filled with a plug (outlined by dashed line) of cell debris. The epidermis has partially separated from the cuticle beyond the wound margin (asterisks).(H) The plug contains highly vesiculated cell debris.(I) The epidermis separating (asterisk) from overlying cuticle appears vesiculated and is presumably necrotic.(J) 2 h postwounding. The outer portion of the plug has melanized to form an electron-dense scab (outlined by white dashed line). The epidermis and cuticle are still discontinuous.(K) Debris, including a necrotic trachea, in the plug. The plug is not bounded by a membrane or basal lamina.(L) Portion of scab showing melanized debris and trachea.(M) Close-up of a lamellipodium (bracket) extending into a plug at the outer edge of another 2-h wound. Note basal lamina (arrowhead) along the lamellipodium.(N) 8 h postwounding. The epidermis has migrated across the gap to reestablish continuity, and has secreted new cuticle beneath the scab.(O) A region of epidermal cell cytoplasm near wound plug debris contains vesiculated material (outlined by dashed line) that is probably phagocytosed debris.(P) The newly established epidermis under the wound has a continuous basal lamina (arrowhead) and apical villi (arrow) secreting cuticle.(Q) 24 h postwounding. The new cuticle underlying the scab is thicker and the scab is more electron dense. Four nuclei in close apposition are in a syncytium because there are no membranes separating them.(R) Portion of scab and old cuticle. Note that cuticle in contact with the scab is melanized.(S) Cytoplasmic extension (arrowhead) engulfing debris at the basal surface of the epidermis of another 24-h wound.Bar, 10 μm (C, G, J, N, and Q), 0.33 μm (D and E), 0.83 μm (F), 1 μm (H, M, and P), 2 μm (I and O), 1.67 μm (K and L), 4 μm (R), 1.25 μm (S).\n", - "751 \n", - " Induction and Function of the JNK Pathway around Puncture Wounds(A–C) Larvae carrying the JNK pathway reporter puc-lacZ, which expresses a nuclear β-galactosidase, were mock-wounded (A) or puncture wounded (B and C), and then cultured for the indicated times before staining with X-gal to visualize reporter activity (blue). There is little reporter activity in unwounded epidermis (A), but 4 h after wounding the reporter is expressed in a gradient emanating from the wound, with highest expression in the row of epidermal nuclei at the wound margin and decreasing levels in surrounding nuclei out to five cell diameters away. At 24 h (C), reporter expression has declined.(D–F) Larvae carrying the JNK pathway reporter msn-lacZ, treated as above. Wounding-induced reporter expression is seen out to seven cell diameters.(G–I) Larvae carrying msn-lacZ and A58-Gal4 and UAS-bskDN transgenes (to inactivate the JNK pathway in larval epidermis), treated as above. Reporter induction is inhibited, but the scab forms normally.(J and K) Larvae carrying msn-lacZ and either UAS-bskDN alone as control (J) or A58-Gal4 and UAS-bskDN transgenes (K), wounded as above and analyzed 24 h later by immunostaining for Fasciclin III and β-galactosidase. Reporter induction is inhibited in (K), but epidermal cells have oriented toward the wound, and although nuclear β-galactosidase staining is faint, careful inspection shows that the cells closest to the wound have fused to form a syncytium. Syncytium formation was confirmed using the A58-Gal4>UAS-GFP.nls marker.(L and M) Larvae carrying msn-lacZ and either UAS-bskDN alone as control (L) or A58-Gal4 and UAS-bskDN transgenes (M), wounded and analyzed 24 h later by TEM. Note that the epidermis in M has failed to spread across the wound gap and is still discontinuous (asterisks). No cuticle has been synthesized in the wound gap, but the cuticle flanking the wound appears thickened.Bar in (I), 100 μm (for [A–I]). Bar in (K), 50 μm (for [J and K]). Bar in (M), 5 μm (for [L and M]).\n", - "752 \n", - " Cellular Responses and Genetic Requirements of Pinch Wound Healing(A–D) Larvae carrying the msn-lacZ reporter and the indicated transgenes or mutations were pinched with a forceps to abrade a region of dorsal epidermis but leave the overlying cuticle intact. Wounded larvae were cultured for the indicated times and immunostained for Fasciclin III (red) and β-galactosidase (green).(A) 6 h after pinch wounding. Note the large epidermal gap (asterisk) at the wound site. Some cells at the wound margin have elongated and oriented toward the wound (arrowheads). Others have fused to form syncytia (arrow).(B) 24 h after pinch wounding. The epidermis has spread to close the gap. Note disorganization of epidermis and syncytia (arrows) at site of healed wound.(C) An A58-Gal4 and UAS-bskDN larva 24 h after pinch wounding. Epidermal spreading is inhibited and a large wound gap remains (asterisk). However, cells at the wound margin still orient toward the wound (arrowheads) and fuse to form syncytia (arrows).(D) A hemizygous lzr15 mutant larva 24 h after pinch wounding. lzr15 blocks crystal cell development and scab formation at puncture wounds (Figure 6), but no defects are observed in pinch wound healing.(E and F) Larvae carrying msn-lacZ reporter were mock-wounded (E) or pinch wounded (F), cultured for 4 h, and stained with X-gal (blue). Wounding induces reporter expression in a gradient extending out four cell diameters. The gap (asterisk) lacks a scab.Bar, 100 μM.\n", - "753 \n", - " Effect of lz on Scab Formation and the Other Events of Puncture Wound Healing(A and B) Posterior of lz+ (w1118) (A) and lzr15 mutant (B) L3 larvae. Larvae were heated so crystal cells appear as tiny black dots. No crystal cells are apparent in the lzr15 mutant. Bar, 200 μm.(C and D) Micrographs of control lz+ (w1118) (C) and lzr15 mutant (D) L3 larvae 4 h after puncture wounding. No scab is seen at the lzr15 wound site (encircled). Bar, 50 μm.(E and F) TEM sections through 24-h–old puncture wounds of a control lzr15/+ heterozygote (E) and a hemizygous lzr15 mutant larva (F), both carrying the msn-lacZ transgene. A consolidated, electron-dense scab has formed in the control larva (E), but only a diffuse plug with peripheral electron density is present at the lzr15 hemizygous wound (F). The electron density of the lzr15 plug might be due to residual melanization activity in the lzr15 mutant. Although reepithelialization is complete in the lzr15 mutant wound, the epidermis contains large vacuoles and abundant apical processes, and it is separated by a gap (asterisks) from the old cuticle and has not secreted new cuticle. Other 24-h lzr15 mutant wounds analyzed had necrotic or discontinuous epidermis at the wound site (not shown). Bar, 10 μm.(G and H) Fluorescence micrographs of 20-h puncture wounds in control (G) and lzr15 mutant (H) larvae carrying the msn-lacZ reporter that were treated as above and immunostained for Fasciclin III (red) and β-galactosidase (green). Epidermal cells at both control and lzr15 mutant wounds have fused to form syncytia (arrows), and cells in the control are oriented toward the wound site (arrowheads). The orientation response of epidermal cells in the lzr15 mutant is difficult to assess because cell borders out to six cell diameters away from the wound appear slack and wavy. Bar, 50 μm.(I–L) X-gal stains of 6-h–old puncture wounds of control lz+ (I and K) or lzr15 hemizygous mutant larvae (J and L) carrying either msn-lacZ (I and J) or puc-lacZ (K and L). Note the absence of scabs and the increase in reporter activity (blue) in lzr15. The basal level of reporter expression in unwounded epidermis was not increased in lzr15 (not shown).Bar, 50 μm.\n", - "756 \n", - " Identification of a Zebrafish integrinα5 Mutant(A) Based on the hyoid cartilage phenotype the b926 allele was mapped to LG23. Using polymorphism mapping, we placed b926 between the markers Z5141 (2/362 recombinants/meioses) and Z20494 (3/362 recombinants/meioses). Databases of the partial zebrafish genomic sequence revealed that a homolog of integrinα5 mapped to this region.(B) Zebrafish Integrinα5 protein is predicted to have seven extracellular beta-propeller repeats (stippled), a transmembrane domain, and a short intracellular cytoplasmic tail. Integrinα5 forms heterodimeric complexes with Integrin β chains, primarily β1, and binds extracellular matrix ligands containing the RGD motif. Sequencing of integrinα5 in b926 revealed a T to A nucleotide substitution at position 952 of the cDNA that converts a tyrosine to an asparagine at amino acid 218, a residue within the third beta-propeller repeat.(C) Alignment of the third beta-propeller repeat of the Integrinα5 proteins of zebrafish, human, mouse, Xenopus, and Fugu. Y218 is absolutely conserved among all five species and is mutated to N in b926.(D) The genomic locus of integrinα5 consists of 30 exons (not drawn to scale). The integrinα5 morpholino, itga5-MO, was designed against the exon13-intron splice site (arrow).(E) The primers GC145 and GC147 were used to amplify a 497-bp fragment from wild-type cDNA. PCR amplification was then performed using cDNA from 24-hpf embryos that had been injected with 10 ng of itga5-MO at the one-cell stage, the same concentration of morpholino used for our phenotypic analysis. The resultant product was 587 bp long, and sequencing confirmed that the increased length was due to the failure to splice out the intron between exons 13 and 14. The left lane of the agarose gel contains standard size markers in basepairs.(F) A schematic of the wild-type Integrinα5 protein shows seven extracellular repeats and the transmembrane (TM) domain. Inhibition of splicing by itga5-MO would be predicted to result in a nonfunctional protein that is truncated in the seventh repeat of the extracellular domain.\n", - "757 \n", - " Region-Specific Pharyngeal Defects in integrinα5 Mutants(A–E) Flat mount dissections of hyoid and mandibular cartilages from fixed, 4-d-old wild-type (A), integrinα5− (B–D), and itga5-MO (E) animals. Meckel's (M) and palatoquadrate (PQ) cartilages are derived from the mandibular arch (1), and CH, SY, and HM cartilages and the opercle (Op) bone are derived from the hyoid arch (2). A phenotypic series (B–D) shows that the anterior half of HM (arrows) is absent and SY is progressively reduced in integrinα5− animals. Rarely, mandibular and hyoid joints are also missing in integrinα5− animals (asterisks in D). (E) Animals treated with itga5-MO display similar reductions of HM (arrow) and SY.(F and G) Flat-mount dissections of the pharyngeal cartilages of 4-d-old wild-type (F) and integrinα5− (G) animals. In addition to the mandibular and hyoid cartilages, the five CB cartilages (CB1–CB5) that are derived from the third through seventh arches are shown. Note the teeth on CB5 (dots in F). In integrinα5− embryos we see rare fusions of CB cartilages (arrow in G).(H–J) Confocal micrographs of the pharyngeal arches of wild-type fli1-GFP (H) and integrinα5−; fli1-GFP (I and J) embryos stained with anti-GFP and Zn8 antibodies at 38 hpf. Neural crest cells of the pharyngeal arches are labeled with fli1-GFP (green, numbered in [H]), and the pharyngeal pouches are labeled by the Zn8 antibody (red, numbered p1–p5 in [H]). In integrinα5−; fli1-GFP embryos, the first pouch is absent or very reduced at 38 hpf (arrows in I and J). Less frequently, we also see reductions in more posterior pouches in integrinα5−; fli1-GFP embryos (arrowhead in J shows a single endodermal mass where p3–p5 would be in wild-type embryos). The Zn8 antibody also recognizes cranial sensory ganglia (dots).(K and L) In situ hybridizations of wild-type (K) and integrinα5− (L) embryos stained with the pharyngeal pouch marker pea3 at 36 hpf (arrowhead denotes first pouch). The first pouch of integrinα5− embryos is very reduced, but still expresses pea3. Sensory ganglia also stain with pea3 (dots).(M and N) Cranial muscles of 4-d-old wild-type fli1-GFP (M) and integrinα5−; fli1-GFP (N) embryos stained with MF20 antibody. Mandibular muscles (intermandibularis posterior [imp], adductor mandibulae [am], levator arcus palatine [lap], and do) and hyoid muscles (interhyal , hyohyal [hh], ah, ao, and lo) are labeled in wild-type. integrinα5− embryos have a selective reduction of do and ah muscles (arrow in [N]). Confocal projections of integrinα5− animals did not include ocular muscles (asterisks in M).(O and P) Cranial motor nerves of wild-type islet1-GFP (O) and integrinα5−; islet1-GFP (P) live embryos at 54 hpf. islet1-GFP-expressing cranial motor neurons innervate muscles of the pharyngeal arches with the following strict segmental correspondence: trigeminal (V)—mandibular; facial (VII)—hyoid; glossopharyngeal (IX)—third; and vagus (X)—fourth through seventh. In integrinα5−; islet1-GFP embryos, facial nerve VII (arrowhead in P) is reduced and/or fails to branch.(Q and R) Summary of integrinα5 regional pharyngeal defects extrapolated to a 4-d-old embryo and color-coded for cartilage (blue), muscle (red), and nerve (green). Shown in black are the eye (filled circle within larger circle), ear (two dots within oval), and opercle bone (mushroom). In wild-type animals, facial nerve VII innervates and passes by do and ah muscles that are in close association with the aHM cartilage region (enlarged in Q′). In integrinα5 mutants, we see specific reductions of the first pouch (not shown), the aHM cartilage region, do and ah muscles, and facial nerve VII (enlarged in R′). Scale bars: 50 μm.\n", - "758 \n", - " \n", - "integrinα5 Expression in Pharyngeal Endoderm and Cranial Neural Crest(A) At the 32-cell stage, strong maternal integrinα5 expression is seen.(B) At 60% epiboly, integrinα5 expresses broadly throughout the mesendoderm.(C) Dorsal view of a 1-s-stage embryo. integrinα5 transcript is concentrated in the ectoderm at the edge of the neural plate (black arrow), in scattered presumptive endodermal cells, and in the first somite (white arrow).(D and E) Dorsal (D) and lateral (E) views of a 5-s-stage embryo show ectodermal (arrows) and pharyngeal endodermal (arrowhead) expression domains of integrinα5. Ectodermal integrinα5 expression includes migratory hyoid crest, otic placode, and forebrain.(F) At the 12-s stage, integrinα5 continues to be expressed in the pharyngeal endoderm (black arrowhead), postmigratory hyoid crest (arrow), ear (red arrowhead), and forebrain.(G–J) At 18 hpf, a dorsal view of an embryo stained for integrinα5 transcript (G) shows approximate axial levels at which cross-sections were prepared. (H) A cross-section at the level of the first pouch shows strong integrinα5 expression in the pharyngeal endoderm (arrowhead). (I) A cross-section at the level of the hyoid arch shows expression of integrinα5 in neural crest (arrow) and pharyngeal endoderm (arrowhead). (J) A cross-section at the level of the ear shows integrinα5 expression in the otic epithelium (red arrowhead) and pharyngeal endoderm (black arrowhead).(K and L) At 26-hpf (K) and 38-hpf (L) stages, integrinα5 transcript is enriched in the region of the most recent forming pharyngeal pouch (arrowheads) and in patches of crest (arrows).Scale bars: (A–C), (F), and (G): 100 μm; (D), (E), and (H–L): 50 μm.\n", - "759 \n", - " \n", - "integrinα5 Requirement in Endoderm but Not Crest(A and B) Schematics of endoderm (A) and crest (B) transplant experiments.(C–E) In endoderm transplants, confocal projections at 38 hpf (C) and 4 d (D) of a single integrinα5−; fli1-GFP host animal show that wild-type TAR* donor tissue contributed efficiently to pharyngeal endoderm (red) but not crest (green). (E) Flat-mount dissection of mandibular and hyoid cartilages from the individual in (C) and (D). Wild-type TAR* endoderm rescues first pouch development (arrow in [C]) and partially rescues hyoid cartilage development (arrowhead in [D] and arrow in [E]) in integrinα5− embryos.(F–H) In crest transplants, confocal projections of a single integrinα5−; fli1-GFP host animal show extensive colocalization (yellow) of donor tissue (red) with crest (green) at 38 hpf (F) and 4 d (G). Donor tissue does not contribute to endoderm or mesoderm. (H) Flat-mount dissection of mandibular and hyoid cartilages from the individual in (F) and (G). Neither the first pouch defects (arrow in [F]) nor hyoid cartilage defects (arrowhead in [G], arrow in [H]) of integrinα5− animals were rescued by wild-type crest.(I and J) Wild-type and integrinα5− sides that received wild-type endoderm (nwt = 39; nitga5 = 12) or crest (nwt = 30; nitga5 = 12) transplants are plotted against the contralateral integrinα5− control sides that did not receive transplants. (I) First pouch defects are quantified as percent of sides missing the first pouch. For endoderm transplants, integrinα5− recipient sides were rescued to wild-type levels. For crest transplants, integrinα5− recipient sides were not rescued compared to control sides. (J) Hyoid cartilage defects are quantified according to a mutant cartilage index: 0, wild-type; 1, partial aHM reduction; 2, full aHM loss; 3, aHM and SY losses; and 4, aHM and SY losses and fusion to CH. For endoderm transplants, integrinα5− recipient sides were rescued to wild-type index. For crest transplants, integrinα5− recipient sides were not rescued compared to control sides. Lowercase letters (a, b) in plots designate statistically significant groupings using Tukey-Kramer HSD test.Scale bars: 50 μm.\n", - "760 \n", - " Fate Map of Hyoid Cartilages(A) In in vivo microelectroporation, a glass needle coupled to a positive electrode and filled with Alexa568 amine dextrans (red) is positioned in the hyoid arch (2) of wild-type fli1-GFP embryos immobilized adjacent to a negative electrode. A short pulse of current delivers dye into single or pairs of cells. A-P and D-V axes, the mandibular arch (1), and first pouch (p1) are designated in (A) and (B).(B–D) Confocal sections of fli1-GFP-labeled hyoid arches (2) (green) show the positions of Alexa568-labeled cells (red) shortly after microelectroporation (24 hpf).(E-J) At 4 d, confocal micrographs (E–G) (schematized in [H–J]) show the resultant fate of labeled crest cells (red) in the hyoid cartilage regions (green). Examples shown include labeled hyoid cells that contributed exclusively to SY (B, E, and H), aHM (C, F, and I), and pHM (D, G, and J) cartilage regions.(K) The relative distances (normalized to one) of hyoid crest cells at 24 hpf that contributed to SY (red), aHM (blue), and pHM (green) regions are plotted along A-P and D-V axes. The first pouch and partial outline of the mandibular arch (1) are drawn for reference. One cell gave rise to an aHM/pHM (blue/green) mixed lineage, and another cell gave rise to pHM and unidentified cells (green/light blue). SY and aHM progenitors map to more anterior domains (i.e., closer to the first pouch) than do pHM progenitors (relative distances from anterior: SY, 0.12 ± 0.11; aHM, 0.17 ± 0.06; pHM 0.43 ± 0.05; statistically different using Tukey-Kramer HSD test). SY progenitors map to a more ventral domain than do aHM and pHM progenitors (relative distances from dorsal: SY, 0.68 ± 0.11; aHM, 0.33 ± 0.06; pHM 0.37 ± 0.05; statistically different using Tukey-Kramer HSD test). No significant differences along the mediolateral axis were seen between regions (relative distances from lateral: SY, 0.47 ± 0.12; aHM, 0.53 ± 0.07; pHM 0.43 ± 0.06).(L) For the fate analysis, the 4-d HS cartilage was subdivided into SY (red), aHM (blue), and pHM (green) regions. The outline of the CH cartilage is also shown.Scale bars: 50 μm.\n", - "763 \n", - " Model for Development and Evolution of Hyoid Cartilage(A–F) Models of hyoid development in wild-type (A–C) and integrinα5− (D–F) animals show the structure of hyoid arches at 24 hpf (A and D) and 38 hpf (B and E) and mandibular and hyoid cartilages at 4 d (C and F).(A) At 24 hpf of wild-type development, crest that will form aHM (dark green), pHM (medium green), and SY (light green) cartilage regions occupy distinct domains within the hyoid arch. Signals (red arrows) from the first pouch (orange) stabilize adjacent aHM- and SY-producing crest.(B) At 38 hpf of wild-type development, aHM- and SY-producing crest tightly pack along the first pouch. Cranial mesoderm (red) and some mandibular crest (blue) are also shown.(C) At 4 d of wild-type development, the HS cartilage is a composite of aHM, pHM, and SY regions. Also shown are the hyoid CH (yellow) and mandibular Meckel's (light blue) and palatoquadrate (dark blue) cartilages.(D) In integrinα5− animals, the first pouch is missing or very reduced at 24 hpf.(E) By 38 hpf, as a consequence of the lack of a first pouch, aHM and SY progenitors are disorganized and undergo gradual apoptosis. In contrast, the development of pHM progenitor cells does not require the first pouch.(F) At 4 d, aHM and SY cartilage regions are selectively reduced in integrinα5− animals.(G–I) The HS element has undergone extensive change during vertebrate evolution. In the illustrations (adapted from De Beer [1937]), the neurocranium is grey or outlined in black and mandibular and hyoid cartilages are color-coded as described above. Based on relations to morphological landmarks and data presented here on the tripartite mosaic development of HS, an evolutionary scheme is proposed.(G) In the dogfish shark Scyliorhinus canicula, a single rod-shaped element corresponds to pro-aHM/SY regions.(H) In the basal actinopterygian Polypterus senegalus, separate aHM and SY regions are present.(I) As shown for salmon, during actinopterygian evolution a new region, pHM, develops posterior to and fuses with aHM to create a wide HM plate that articulates with the neurocranium and supports an enlarged, overlying opercular apparatus (not shown).\n", - "764 \n", - " The Primate APOBEC Family(A) The human genome contains nine known members of the APOBEC family. AID and APOBEC1 are located approximately 900 kb apart on human Chromosome 12. The primate-specific APOBEC3 cluster of six genes resides on human Chromosome 22, and likely arose through a series of gene duplication events (Jarmuz et al. 2002; Wedekind et al. 2003). The single APOBEC3-like gene found in mouse resides on Chromosome 15 (not shown), which is syntenic to human Chromosome 22 (Sheehy et al. 2002). There is EST evidence for both APOBEC3D and APOBEC3DE (see Materials and Methods), and we treat these as three separate transcripts in our analysis because currently there is no evidence for the relevant protein products.(B) All members of the APOBEC family contain an active site that encodes a zinc-dependent cytidine deaminase domain with the HXE, PCXXC signature (Mian et al. 1998), a linker peptide, and a pseudoactive domain (Navaratnam et al. 1998; Jarmuz et al. 2002). The active and pseudoactive domains are related by structure only, and likely originated from a gene duplication event followed by degeneration of the catalytic activity of the pseudoactive domain. Several members of the human APOBEC3 gene cluster (APOBEC3B, 3DE, 3F, and3G) have undergone an additional duplication/recombination event and now contain two each of the active and pseudoactive sites (Jarmuz et al. 2002; Wedekind et al. 2003), as does the single APOBEC3-like gene found in mouse.DOI:10.1371/journal.pbio.0020275.g001\n", - "766 \n", - " Episodic Positive Selection on Different Regions of the APOBEC3G Gene(A–C) Sliding window (300-bp window; 50-bp slide) analysis of Ka and Ks was performed on three representative pairs of primate APOBEC3G sequences, between two hominids (human–orangutan) (A), between two OWMs (crested macaque–baboon) (B), and between two NWMs (tamarin–woolly monkey) (C). Ka/Ks, Ka, and Ks are plotted against the length of the gene (with a schematic of protein domains along the x-axis) to illustrate that different domains of APOBEC3G have undergone positive selection, depending on which lineage is examined. The value for ω, indicated by Ka/Ks, is not shown for part of the crested macaque–baboon comparison (B), because Ks is zero in this region (see plot below).(D) A schematic of the domains of human APOBEC3G illustrates the N-terminal domain (aa 1–29), the two active sites (aa 30–120 and 215–311), and the pseudoactive sites (aa 162–214 and 348–384). Also illustrated is the Vif-interaction domain of APOBEC3G (aa 54–124) (Conticello et al. 2003) as well as the single amino acid residue responsible for species-specific sensitivity to Vif (aspartic acid 128; cross shape in linker 1) (Bogerd et al. 2004; Schrofelbauer et al. 2004). PAML (Yang 1997) was used to identify individual residues (codons) that have significant posterior probabilities of ω greater than 1.0 (see Materials and Methods). Those codons with posterior probabilities greater than 0.95 and greater than 0.99 are indicated by open and closed inverted triangles, respectively (listed in Figures S2 and S3). This represents only a subset of the residues that are likely to be under positive selection, highlighting those residues that have repeatedly undergone non-synonymous substitutions. For instance, residue 128 is not highlighted, as it has a posterior probability of only 0.55 because it has undergone only one fixed non-synonymous change (along the OWM lineage). Domains have been defined by protein sequence alignment to APOBEC1 (Jarmuz et al. 2002). The first pseudoactive domain is likely to include in its C-terminus a second duplication of the N-terminal domain, although this boundary cannot be resolved because of sequence divergence.DOI:10.1371/journal.pbio.0020275.g003\n", - "770 \n", - " Interactions between Cohesin and CHRIII in S. cerevisiae\n", - "The centromere is indicated with a black circle; the smoothed data are indicated with a green line. 50-kb intervals are indicated by vertical grey lines.(A) Data generated from a cdc16-arrest ChIP for Mcd1-18Myc in W303a. The midpoint of each feature is used to represent the log2 of the median red:green ratio (left y-axis) with a black line, high firing replication origins are indicated with black triangles, and previously mapped CARC2, CARC1, CARC3, CARC4, CARC5, and CARC6 (Laloraya et al., 2000) correspond to peaks 9, 10, 29, 30, 31, and 32, respectively. Peaks are located and numbered by PeakFinder (with the exception of telomeres) using the parameters described in the Materials and Methods.(B) Smoothed data from cdc16-arrest ChIP for Mcd1/Scc1-6HA in A364a.(C) Smoothed data from cdc16-arrest ChIP for Smc3-6Myc in A364a.\n", - "772 \n", - " Peaks and AT Content(A) The AT content for each array element was calculated and put into bins in 1% intervals (grey bars, left y-axis). The AT content for each array element that is a cohesin peak was also put into bins (red bars, right y-axis).(B) The AT content for each intergenic array element was put into bins in 1% intervals (grey bars, left y-axis). The AT content for each intergenic array element that is a cohesin peak was also put into bins (red bars, right y-axis).(C) The AT content for each convergent intergenic array element was put into bins (grey bars, left y-axis) and the AT content for each convergent intergenic array element that is a cohesin peak was also put into bins (red bars, right y-axis).\n", - "773 \n", - " Features of Peaks(A) Using all cohesin-binding peaks within 40 kb of a telomere ordered based on distance from the telomere, we calculated a five-point moving average for distance in kilobases from the telomere (x-axis) and plotted this as a function of the five-point moving average of the log2 value for the associated peaks (y-axis).(B) Chromosome length (x-axis) is plotted as a function of the number of cohesin peaks (y-axis). A line was fitted using the least squares method and R2 = 0.96.(C) The distance between peaks was put into 1-kb bins; the average distance between peaks is 10.9 kb and the median is 9.3 kb.\n", - "774 \n", - " Cohesin Sites Mapped Using ChIP Followed by Semiquantitative PCR with Primers at 1-kb Intervals in a YAC Containing Human DNA(A) Cohesin binding for the entire YAC is shown.(B) Cohesin binding in the region spanning 135–180 kb is shown for the wild-type YAC (black diamonds) and for the YAC containing a replacement of the sequences at 156–162 kb with the gene encoding geneticin resistance (grey squares).\n", - "775 \n", - " Transcription Affects the Cohesin Peak at the Promoter of GAL2\n", - "SGD coordinates 260–320 kb (x-axis) and a gene map are depicted for Chromosome XII. The strain 1827-22D (isogenic to the strain in Figure 1 except CDC16) was grown with either 2% glucose (A) or 2% galactose (B) as the carbon source. Cultures were arrested with nocodazole, and ChIP chip was performed. The smoothed data (as the log2 of the ratio) is depicted in green, the peaks found by PeakFinder are indicated with black dots, and the region corresponding to the GAL2 promoter is indicated with a grey bar. Transcription of GAL2 is up-regulated 42-fold in (B).\n", - "776 \n", - " Effect of Transcript Elongation on Cohesin Associated with CARC1 and CARL2 Located on a Plasmid Next to a Galactose-Inducible Promoter(A) The fold reduction in cohesin binding in the presence (+) or absence (−) of galactose-induced transcription is depicted as a function of the 5′ or 3′ end of the locus.(B) The fold reduction in cohesin binding at CARL2 during galactose-induced transcription in the presence (+) or absence (−) of thiolutin, an inhibitor of transcript elongation.\n", - "777 \n", - " Meiotic CohesinDSB data are shown in red, Rec8 data in black, and Mcd1 data in grey.(A) Ratios for meiotic cohesin are compared to mitotic cohesin in SK1 for kilobasepairs 440–461 on Chromosome XII. For the mitotic culture, cells were arrested with nocodazole. For meiotic cells, timepoints were collected every 2 h from hour 4 to hour 12 after transfer to SPM. The median ratio value was used to represent the data. Meiosis is slower in an SK1 strain with an HA-epitope-tagged Rec8 than in a wild-type strain (see Figure 9). The gene structure for this locus is shown below the graph, with genes encoded by the Watson strand labeled on top and genes encoded by the Crick strand labeled on the bottom.(B) Ratios for meiotic cohesin are compared to mitotic cohesin and DSBs for kilobasepairs 295–345 on Chromosome XII.\n", - "778 \n", - " Meiotic Timecourse for an SK1 Strain Containing Rec8-3HACells were collected at the indicated timepoints throughout meiosis using the same experimental regime used to collect the binding sites of Rec8-3HA presented in Figure 8. The epitope tag appears to slow meiosis by 3–4 h as compared to an untagged strain. Three assays were developed to monitor culture synchrony during meiosis.(A) FACS profile of the REC8-3HA strain. Aliquots of cells were fixed with 70% EtOH, followed by FACS analysis.(B) Nuclear division of the REC8-3HA strain. Aliquots of cells were fixed with 1% formaldehyde for 1 h at room temperature. Nuclear DNA was stained by DAPI and visualized under a fluorescence microscope. At least 200 cells were scored at each timepoint.(C) Rec8-3HA protein level. Protein extracts were prepared and subjected to SDS-PAGE and Western blot. The Rec8-3HA protein level was detected by an anti-HA antibody (12CA5). The same blot was stripped and reprobed with anti-β-tubulin antibody to detect the level of β-tubulin, which served as a loading control.\n", - "779 \n", - " Microarray Analyses of Mcd1p and Smc3p BindingDNA isolated from cohesin subunit ChIPs and control input DNA was labeled with aminoallyl dUTP, conjugated to Cy5 (red) or Cy3 (green) fluorescent tags, and then hybridized competitively to microarrays. Although the samples were labeled by different fluorescent tags depending on the experiment, for the purposes of analysis, the ratios are converted such that the ChIP signal is represented by red and control DNA by green. The red-to-green (R:G) ratio for each ORF and intergenic region was calculated for cells arrested in mitosis using the cdc16 mutation and assigned a color, and the median value obtained for each element was then plotted on a map of the sixteen chromosomes to determine the chromosomal distribution of Mcd1–6HAp. Regions with a R:G ratio less than 1.8 are shown in gray, and those with ratios of 1.8 or higher are shown in red. The red shading is an indicator of the intensity of cohesin subunit binding, such that regions with larger R:G ratios have lighter shades of red. Hybridization data are unavailable for regions shaded in blue (see Materials and Methods), and genomic regions not present on the arrays are indicated in white. Centromere position is indicated by an asterisk.(A) Chromatin isolated from strains containing Mcd1-6HAp (1377A1-4B, 1829-15B, and PMY270) was immunoprecipitated using anti-HA antibodies.(B) Chromatin isolated from strains containing Smc3-6Mycp (PMY270 and 1839-3D) was immunoprecipitated with anti-Myc antibodies.\n", - "781 \n", - " Mcd1p Binding Profiles in Centromere-Proximal and -Distal RegionsCells containing Mcd1-6HAp were first staged in G1 using αF, and then released from G1 into medium containing nocodazole to arrest the cells in mitosis. For the centromere excision experiments (B–D), the cultures were divided in half after G1 arrest, and one half of each culture was treated with galactose for 2 h to induce centromere excision (see Materials and Methods). Both the induced (acentric) and uninduced (centric) control cultures were then released from the G1 arrest into fresh medium and rearrested in mitosis. Once arrested in mitosis, cells were fixed in formaldehyde and then processed for ChIP using antiserum against epitope-tagged Mcd1p (Mcd1-6HAp) as an indicator of the cohesin complex. DNA isolated from the ChIPs and diluted input DNA not subject to immunoprecipitation were then subjected to PCR analysis using oligonucleotide primer pairs that amplify approximately 300-bp fragments within the indicated regions. Quantitation of DNA in the Mcd1p ChIPs, expressed as a percentage of the input DNA, is plotted as a function of the locations of the midpoints of those DNA fragments based on the SGD coordinates. Centromere position is indicated by an oval (not drawn to scale). (A) The Mcd1p association profile for the CHRI pericentric region in strain 1377A1-4B is shown. Mcd1p binding adjacent to CEN1 is difficult to assess fully because of the presence of a moderately repetitive Ty element in the region from approximately 160 to 166 kb, indicated with the dashed line. Similarly, the Mcd1p binding profiles in the pericentric regions of CHRIII (B) and CHRXIV (C) are shown in the presence (black squares) and absence (gray circles) of CEN3 and CEN14 using strains PMY185 and PMY206, respectively. (D) The Mcd1p binding profiles for a centromere-distal region of CHRIII are shown for comparison in the presence (black squares) and absence (gray circles) of CEN3.\n", - "783 \n", - " Centromere Excision(A) CEN1 on CHRI was replaced with a CEN3-URA3 cassette flanked by head-to-tail-oriented site-specific recombination target sites (red arrows) for the R recombinase from Zygosaccharomyces rouxii, as described in Materials and Methods. This strain (1824-23B) contained the R recombinase under the control of a galactose-inducible promoter. Genomic DNA samples, taken prior to the addition of galactose to the culture medium (0) and at 0.5-h intervals for 4.5 h after the galactose addition, were digested to completion with PvuII (black arrows) and analyzed by Southern blot analysis using a 1.25-kb probe corresponding to CHRI SGD coordinates 151823 to 153080.(B) The percentage of centromere excision was determined for the timecourse shown in (A). Briefly, a phosphorimage of the Southern blot and ImageQuant software were used to determine the pixel intensities of the unexcised and excised bands (top and bottom bands, respectively). The percent excision was then calculated as the pixel intensity present in the excised band divided by the total pixel intensities of both bands at each timepoint.(C) A Southern blot analysis of centromere excision from CHRIII. The endogenous CEN3 on CHRIII was replaced by R-recombinase target-site-flanked CEN3 in strain 1829-15B, as described in Materials and Methods. The efficiency of centromere excision from CHRIII was determined by Southern blot analysis in two independent experiments using genomic DNA samples digested with SnaBI and a probe corresponding to CHRIII SGD coordinates 113799-114336. Lanes 1 and 3 represent uninduced controls, and lanes 2 and 4 represent the extent of centromere excision after 2 h of recombinase induction. The percent excision was determined as in (B).\n", - "785 \n", - " A Functional Centromere–Kinetochore Complex Is Essential for Enhanced Pericentric Cohesin AssociationCultures of isogenic wild-type (1846-15A) and ndc10-42 mutant (1846-15C) cells were arrested in αF at 23 °C and then released into fresh medium containing nocodazole at 37 °C. After the cells arrested in mitosis (approximately 3 h), the cultures were crosslinked with formaldehyde and processed for ChIP using a monoclonal antiserum against epitope-tagged Mcd1p (Mcd1-6HAp) as an indicator of the cohesin complex. The cohesin association profiles in the pericentric regions of CHRIII (A) and CHRI (B) are shown for NDC10 (black squares) and ndc10-42 (gray circles) cultures. The positions of the centromeres are indicated by ovals (not drawn to scale). The dashed line in (B) indicates a region containing a Ty element. (C) To identify chromosomal regions depleted for cohesin binding in the absence of a functional kinetochore, the Mcd1p-ChIP-to-input fluorescence ratio obtained for each ORF and intergenic region in genomic microarray analyses of CHRV, CHRVI, and CHRIX in ndc10-42 cells was divided by the ratio obtained for NDC10 cells and plotted on a map of the chromosomes. Regions that demonstrated 2.5-fold or greater reduction in Mcd1p binding in the ndc10-42 mutant are shaded dark green, while lighter green hues represent further fold reductions in Mcd1p binding. Regions where the magnitude of Mcd1p binding was similar in NDC10 and ndc10-42 cells are shown in gray. Gaps in the chromosomal maps are genomic regions not represented on the microarrays, while regions shaded blue were present on the arrays but gave no data during hybridizations for reasons described in Materials and Methods. The location of the centromere on each chromosome is indicated by an asterisk.\n", - "787 \n", - " The Centromeric Enhancer Is Active at an Ectopic LocationThe endogenous centromere on CHRIII was removed, and CEN6 was inserted at an ectopic location (SGD coordinate approximately 260 kb), producing yeast strain PMY318, as described in Materials and Methods. Cells containing the ectopic centromere and isogenic wild-type cells (1829-15B) were staged in G1 using αF, and then released into fresh medium containing nocodazole to arrest cells in mitosis. Cells were then fixed in formaldehyde and processed for ChIP using epitope-tagged Mcd1-6HAp as a marker for the cohesin complex.(A) The Mcd1p binding profiles at the ectopic location on endogenous CHRIII (black squares) and in the presence of the ectopic centromere (gray circles) are shown. The location of the ectopic centromere is indicated by the black oval.(B) The levels of Mcd1p binding in the region flanking the ectopically placed centromere were divided by those observed in the isogenic wild-type control strain to determine the fold increases in Mcd1p binding in the presence of the centromere. Data are plotted as a function of the SGD coordinates for this region.\n", - "794 \n", - " Dose- and time- dependent effect of SLC/CCL21 on proliferation of human MC. (A) Incubation of human MC with various concentrations of SLC/CCL21 (10 ng/ml, 50 ng/ml, 100 ng/ml, 250 ng/ml) induces proliferation of MC in a dose-dependent manner. (B) Time-course stimulation of MC with SLC/CCL21 for various time intervals (24 h, 48 h, 72 h). Cell proliferation was analyzed with the MTT assay as described in Methods. Cells growing under standard conditions served as control. Changes in proliferative activity are given as relative values to the respective controls. Each bar represents a mean ± SEM of 7 parallel incubations for each condition. Statistically significant differences to the control are depicted with * = p < 0.05 and ** = p < 0.01, resp. Comparable results were obtained in three series of independent experiments.\n", - "798 \n", - " Effect of SLC/CCL21 on Fas-induced cell death of human MC in Hoechst stain on a fluorescent microscopic analysis of MC (A) MC stimulated with IFN-γ. (B) MC stimulated wit IFN-γ and Fas ligation. (C) Significantly reduced number of apoptotic cells when MC were prestimulated with SLC/CCL21 prior to induction of cell death.\n", - "799 \n", - " Effect of SLC/CCL21 on Fas-induced cell death of human MC in cell count and caspase-3 assay. (A) The percentage of apoptotic MC was determined after visualisation of fragmented chromatin with Hoechst dye. Apoptotic nuclei were analyzed microscopically in three different sets of experiments counting at least 300 cells per condition. (B) Caspase-3 activity was quantitated spectrophotometrically in MC lysates. Data are from three independent sets of experiments, each performed in duplicate. Statistically significant differences are depicted: * = p < 0.05 and ** = p < 0.01, resp.\n", - "800 \n", - " Effect of IP-10/CXCL10 and Mig/CXCL9 on Fas-induced cell death of human MC in cell cycle analysis by flow cytometry. Percentage of apoptotic cells was analyzed in cell cycle analysis by flow cytometry after staining with propidium iodide. Histograms represent cell counts (y-axis) versus DNA content (x-axis) with the percentage of apoptotic cells containing sub-G1 DNA indicated. Cell cycle analysis of MC was performed after serum starvation and stimulation with IFN-γ for 48 hours. (A) Cell cycle analysis of MC after serum starvation and stimulation with IFN-γ for 48 hours. (B) Apoptosis was induced subsequently by Fas ligation. (C, D) Preincubation with IP-10/CXCL10 and Mig/CXCL9 has no effect on Fas-induced apoptosis of MC. The profiles shown are representative for four independent experiments.\n", - "801 \n", - " Effect of RANTES/CCL5 and Met-RANTES on Fas-induced cell death of human MC in cell cycle analysis by flow cytometry. Percentage of apoptotic cells was analyzed in cell cycle analysis by flow cytometry after staining with propidium iodide. Histograms represent cell counts (y-axis) versus DNA content (x-axis) with the percentage of apoptotic cells containing sub-G1 DNA indicated. (A) Cell cycle analysis of MC was performed after serum starvation and stimulation with IFN-γ for 48 hours. (B) Apoptosis was induced subsequently by Fas ligation. Prior to serum starvation the expression of chemokine receptor CCR1 was induced by pretreatment with a combination of IFN-γ (20 ng/ml), TNF-α (25 ng/ml) and IL-1β (10 ng/ml) for 24 hours. (C,D) RANTES/CCL5 250 ng/ml and Met-RANTES 250 ng/ml have no effect on Fas-induced cell death of MC.\n", - "835 \n", - " Acquisition of caveolin-2 by inclusions in caveolin-1 negative FRT cells. (A) FRT cells were infected with chlamydial organisms for 48 h. C. pneumoniae, C. psittaci, and C. trachomatis serovars A, B, E, K (not shown), as well as serovars C and F colocalized with caveolin-2. MoPn and LGV (not shown), did not colocalize with caveolin-2 in these cells. Note that only two species, the mouse pneumonitis strain (MoPn) and GPIC produce large inclusions in these cells even after 48 h infection (scale bar is 25 μm). The small inclusions nonetheless release viable progeny into the culture supernatant which could be used to infect new cells. (B) Uninfected FRT-cells stained with anti-caveolin-2 antibody to demonstrate the localization of caveolin-2 protein in the cell. Note the caveolin-2 staining (C) close to the nucleus of the cell and that there is no caveolin in the cell membrane. (N), the nucleus of the cells and the scale bar represents 10 μm. Original magnification: 600X\n", - "836 \n", - " Anti-caveolin-2 antibodies do not cross-react with chlamydial EBs. C. trachomatis serovar K and C. pneumoniae AR39 EBs were purified by renografin gradient and separated on a 10–12% NuPAGE gel. The proteins were transferred to a PVDF membrane, (A) stained with a mouse monoclonal anti-caveolin-2 antibody and the reacting complex detected with an AP-conjugated goat-anti-mouse secondary antibody. Mw is the molecular weight marker, Con is an endothelial cell lysates for caveolin-2 control, Cpn is C. pneumoniae EBs and Ct represents C. trachomatis EBs. Note that there is staining in the control lane at 22 kDa (caveolin), while there is no staining in the chlamydial organism lanes. (B) control blot using the same quantity and preparation of C. trachomatis serovar K and Cpn EBs as above. The blot was stained with a rabbit anti-Chlamydia polyclonal antibody.\n", - "841 \n", - " Representative immunostaining of paraffin sections with antibodies against Topoisomerase 2A and Aquaporin 1. (A) Upper panel shows two TOP2A positive cores from GBMs; lower panel shows two negative cores on the same tissue micro-array. (B) Upper panel from left to right: cortex and white matter; lower panel from left to right: spinal cord and hypocampus. All stained with anti-TOP2A antibodies. (C – D) Paraffin section of GBM showing nuclear staining of TOP2A; D shows a higher magnification and E is the corresponding negative control with mouse IgG1 and no primary antibodies. (F – G) Paraffin section of GBM showing cytoplasmatic staining with anti-aquaporin 1 antibodies; G shows a higher magnification and H is the negative control.\n", - "880 \n", - " Release of RMCP-1, -5 and CPA from PMC following activation with tc-LIG (PAR-2ap), compound 48/80 and Ag. (A) Supernatants from tc-LIG (10 μM), Ag (10 We/mL) and sham-treated (spon) mast cells were concentrated (10 ×) and Western blot analysis preformed for CPA, RMCP-1 and RMCP-5. Left panel shows Coomassie blue staining of the same gel and right panel Western blot with normal rabbit serum as a negative control. (B) Release of RMCP-1, RMCP-5 and CPA following 20 min and 8 h activation of PMC with tc-LIG (10 μM). (C) Dose response for the release of RMCP-1, -5 and CPA by tc-LIG-stimulated or compound 48/80-stimulated PMC. In all cases representative blots from three experiments with similar results are shown.\n", - "882 \n", - " PAR-2ap, PAR-2cp compound 48/80 and Ag-mediated release of proteolytic activity from mast cells. (A) Supernatants from PMC treated with tc-LIG (10 μM), tc-OLR (10 μM), or Ag (10 We/mL) for 8 hr were incubated with 150 pg/mL of TNF. Proteolytic activity was calculated as % degraded TNF according to the formula given in Methods section. Values in the graph indicate proteolytic activity after the subtraction of activity released by sham-treated cells (17 ± 7 %). (B) TNF-degrading proteolytic activity released from PMC by various doses of tc-LIG (20 min). Values in the graph indicate proteolytic activity after the subtraction of activity released by sham-treated cells (22 ± 5 %). (C) TNF-degrading proteolytic activity released by SLI (PAR2-ap, 40 μM), LSI (PAR2-cp, 40 μM) and tc-LIG (10 μM) treated PMC (20 min). Values in the graph indicate proteolytic activity after the subtraction of activity released by sham-treated cells (23 ± 7 %). Values are shown as \"mean ± SEM\" (n = 3–5). Star indicates statistically significant difference from spontaneous (p < 0.05).\n", - "889 \n", - " Summary of subject movement measurements. (a) Lower cervical spine flexion: the change in angle from a line extending from C7 to the tragus of the ear (T) and a vertical line through C7. (b) Upper cervical spine extension: the change in angle from a line extending from the tragus to the mid forehead (MF) and a vertical line through the tragus. (c) Protraction: the change in distance of the acromion (A) along the horizontal axis. (d) Trunk flexion: the change in angle from two lines extending from L1 to the acromion (A) and L1 to the greater trochanter (GT).\n", - "898 \n", - " Neutrophil infiltration as determined by MPO contents of peritoneal cell pellet and peritoneal supernatant. Wild-type (WT) and P/I null were subjected to CLP, euthanized at specific time points, the peritoneal lavages harvested, centrifuged, and the supernatant and the cell pellet were collected separately and assayed for MPO contents. (A) Peritoneal lavage cell pellet. (B) Peritoneal lavage supernatant. Note that at 6 h after CLP, although a significant neutrophil infiltration into the peritoneal cavity of the P/I null group is present, it is significantly impaired compared to the corresponding WT group. Values are expressed as the mean ± SEM. * p < 0.05 compared to respective control group. + p ≤ 0.05 P/I null mice compared to respective wild-type at the same time period of CLP. Data from 6 independent experiments with total sample size of 8 mice per each treatment.\n", - "902 \n", - " En bloc resection specimen of heterogeneous tumor with attached organs. Note the lipomatous regions (A), the calcified areas (B), and the remaining nonlipomatous component (C).\n", - "907 \n", - " Variation in respiratory mechanic among cftr genotypes. Values for Raw(A), G(B), H(C), and η(D) were determined by fitting the constant-phase model to measurements of Zrs from cftr+/+ (Black), cftr+/- (Green) and cftr-/- (red) genotypes. All measures were normalized by multiplication by lung weight. Error bars are +/- standard deviation. *p < 0.05 when compared to cftr+/+ and **p < 0.05 when compared to cftr+/-.\n", - "948 \n", - " (A) Comparison among different normalization factors. NFLogMean (x-axis) is plotted against SF (red open triangle) and NFMedian (black closed circle). The correlation between NFLogMean and NFMedian is higher (R = 0.971) than that between NFLogMean and SF (R = 0.918). (B) The NF score, NFscore, for SF (red open triangle), NFMedian (blue open diamond) and NFLogMean (black closed circle) is expressed as a function of respective 'true NF'. NFTrimLogMean is not shown here to simplify the graph since it is similar to NFLogMean. See also in Methods.\n", - "950 \n", - " (A) Highly reproducible systematic errors from gene-dye interactions. The arrows demonstrate intense red dye labeling for a given gene spotted in duplicate both for the T/C slide where the treated sample is labeled with red dye (Cy5) and control sample is labeled with green dye (Cy3), as well as in the C/C slide where the same sample is labeled both red and green. (B) Experimental designs. Two different experimental methods were compared: A dye-swap approach, where the dye color is reversed for T/C hybridizations, and a \"control correction\" design, where T/C and C/C hybridizations are performed without reversing the dyes. T denotes the neuregulin treated cells, while C denotes the untreated, control cells. Each arrows represent a replicate and the tails of the arrows indicate cy5 labeling and the heads indicate cy3 labeling. (C) Data processing flow chart for the control correction method.\n", - "951 \n", - " Array and intensity-dependent variation can be corrected by normalization based on intensity. (A) This is an MA-plot before normalization for one of T/C slides that plots the log intensity ratios against the averaged intensities at both wavelengths: M = log (T/C) and A = 1/2log(T*C). The majority of the data is less than zero in a \"banana\" or \"comma\" shaped distribution. This demonstrates a systematic, intensity-dependent dye effect, prominent at lower intensities. (B) After normalization using the lowess function, the MA-plot shows a more even distribution at all intensities.\n", - "952 \n", - " Control correction of each spot markedly improves the distribution of log ratios. (A) Histograms show that T/C and C/C log ratio distributions after lowess normalization still have a marked asymmetry with a larger tail towards the left (increased down-regulated genes). The distribution becomes symmetric after subtracting the log (C/C) from the log (T/C). (B) Quantile-quantile plots similarly show that the log ratio distribution becomes more normal after correction of each spot with the control ratio.\n", - "954 \n", - " Both control correction and dye-swap methods reveal statistically significant changes in gene expression. Volcano plots of the control correction method (A) and the dye-swap method (B) reveal a small proportion of genes that met our arbitrary criteria of having >1.7 fold changes with p values <0.05, determined individually for each gene. The horizontal lines on each graph represent p = 0.05. The vertical lines represent 1.7 fold changes, both up- and down-regulated. Genes shown in blue in upper left and right areas were selected for northern blot confirmation.\n", - "956 \n", - " Summary of confirmation rates for the two methods. (A) A Venn diagram summarizes the number of genes identified by each experimental method using 1.7-fold and p < 0.05 cut-offs and the verification rate by northern blot. While all 5 genes common to both methods were confirmed, 7 out of 11 genes from control correction method were confirmed, and 6 out of 7 genes from the dye-swap method using the ANOVA were confirmed. 8 out of 9 genes identified with the regularized t-test were confirmed. (B) A Venn diagram summarizes the number of genes identified by each experimental method of p < 0.05 without a fold change restriction.\n", - "960 \n", - " Splenic B cells produce MIP-2 and KC in response to LPS. (A) Purified splenic B cells (1 × 106 cells/ml) from 4 month-old C57BL/6 mice were stimulated with 10 μg/ml of LPS, anti-IgM or anti-CD40 plus IL-4 for 24 h. Then, cell-free supernatants were collected and assayed by ELISA for MIP-2 and KC secretion. Data are mean of triplicate ± SD of one representative of two experiments. The value was significantly different from non-stimulated control. (**, P < 0.01; ***, p < 0.005) (B) Immunofluorescence visualization of MIP-2 expression in the cytoplasm of 24 h LPS-stimulated splenic B cells. Cells were incubated with biotinylated goat anti-mouse MIP-2 antibody followed by SA-Oregon green-488 (green), PE-conjugated anti-IgM antibody (red) and the DNA dye DAPI (blue not shown) and subjected to cytospin (5 × 105 cells/microscope slide). Magnification: +100. (C) Total RNA was isolated from non- and LPS-stimulated cells and levels of MIP-2 and KC mRNA were examined by RT-PCR. The housekeeping gene β-actin was amplified as an internal control. The data are representative of two experiments.\n", - "961 \n", - " Effect of aging on LPS-induced B cell proliferation and MIP-2 and KC production by splenic B cells. (A) In vitro proliferation of splenic B cells stimulated with LPS. Purified splenic B cells (1.25 × 105/ml) were cultured with or without LPS. Proliferation was measured by [3H] thymidine uptake after 24 and 72 h of culture. Data are means ± SD of three mice in each group. The value was significantly different from that of aged mice. (** P < 0.01) (B) Splenic B cells from three to five young and aged mice were stimulated with 10 μg/ml of LPS for 4 and 24 h. After stimulation, cell-free supernatants were collected and assayed by ELISA for MIP-2 and KC secretion. One representative experiment out of three is shown. (C) 24 h LPS-stimulated splenic B cells were subjected to immunofluorescence staining with anti-MIP-2 and anti-KC antibodies and DNA dye DAPI as described in Figure 1. One representative experiment out of three is shown. Control anti-goat IgG staining in both young and aged B cells are shown as inserts in this panel. (D) After stimulation, cells were harvested, and RNA was prepared for MIP-2 and KC specific RT-PCR. The housekeeping gene β-actin was amplified as an internal control. Data shown are representative of two independent experiments. (E) MIP-2 and KC mRNA levels were measured by real time RT-PCR and normalized to threshold cycle (Ct) values of the co-amplified house-keeping gene GAPDH. Normalized values were calibrated to the value derived from non-stimulated controls and shown as fold change of mRNA expression. Data shown are representative of two independent experiments. Value were significantly different from those in aged mice (** P < 0.01; *** P < 0.005)\n", - "962 \n", - " Effect of aging on MIP-2 and KC production by splenic B cells co-cultured with irradiated EL-4 cells. (A) Decreased amounts of MIP-2 and KC proteins in supernatants of splenic B cells cultured in EL-4 culture system. Splenic B cells (3 × 104/well) from three to five young and aged mice were cultured with irradiated EL-4 thymoma cells in the presence of LPS and macrophage supernatant for 3 or 5 days. Culture supernatants were collected and analyzed by ELISA for MIP-2 and KC secretion. These values were significantly different from those in aged mice (** P < 0.01). (B) Real-time RT-PCR analysis of MIP-2 and KC mRNA expression in activated splenic B cells from young and aged mice. After 3 days of culture, total RNA was isolated from cultured cells and levels of MIP-2 and KC mRNA were measured by real time RT-PCR and normalized to threshold cycle (Ct) values of the co-amplified housekeeping gene GAPDH. Normalized values were calibrated to the value derived from EL-4 only controls and expressed as fold induction of mRNA. One representative experiment out of two is shown.\n", - "963 \n", - " Ability of distinct splenic B cell subpopulations from young and aged mice to produce MIP-2 and KC chemokines. (A) Spleen cells were isolated from three young and aged mice, and then stained with anti-IgM, anti-CD23 and anti-CD21 Abs. Subsequently, NF, FO and MZ B cell subpopulations were sorted from IgM+ gated cell population. (B) Amounts of MIP-2 protein in supernatants of total IgM+ B cells and distinct splenic B cell subpopulations cultured in EL-4 system. NF, FO and MZ B cells within the respective gates shown were directly sorted into individual wells of 96 well plates (1,000 cells/well). Each well had 200 μl of medium containing irradiated EL-4 cells, LPS and macrophage supernatant. After 5 days of culture, supernatants were collected and analyzed by ELISA for MIP-2 and KC secretion. These values were significantly different from those in aged mice (* P < 0.05; ** P < 0.01; *** P < 0.005). (C) Real time RT-PCR analysis of MIP-2 and KC mRNA expression in 5 days-cultured B cells from young and aged mice. MIP-2 and KC mRNA levels in total IgM+, NF, FO and MZ B cells were measured by real time RT-PCR and normalized to threshold cycle (Ct) values of the co-amplified housekeeping gene GAPDH. Normalized values were calibrated to the value derived from EL-4 only controls and expressed as fold induction of mRNA. One representative experiment out of two is shown. These values were significantly different from those in aged mice (* P < 0.05; ** P < 0.01; *** P < 0.005).\n", - "964 \n", - " Similar proliferation and differentiation between young and aged splenic B cells cultured in EL-4. FACS-sorted distinct B cell subsets (1000/well) from three young and aged mice were cultured in EL-4 culture system. Proliferation was measured by [3H] thymidine uptake after 3 days culture. Data represent the mean and variations (SD) from triplicate cultures. The data presented are representative of two independent experiments (A). Purified splenic B cells (4 × 104/well) from three young and aged mice were cultured with irradiated EL-4 thymoma cells in the presence of LPS and macrophage supernatant for 3 and 5 days. The cultured cells were stained with anti-IgG1 and anti IgM Abs. Percentages of IgG1+ IgM+ B cells are indicated (B). Absolute numbers of IgG1+ B cells in culture. Total numbers of IgG1+ B cells per well were calculated from a mixture of 20 wells in each group (C). Culture supernatants were measured by ELISA for IgG production. Data are representative of two independent experiments (D).\n", - "965 \n", - " B cell-derived MIP-2 and KC induce splenocyte migration. (A). Purified splenic B cells (1.5 × 106/ml) from three young and aged mice were added to the lower chamber of Transwell plates and stimulated with and without LPS. 24 hr after LPS stimulation, spleen cells from 4 month old C57BL/6 mice were preincubated with Hoechst and subjected to chemotaxis through 5-μm pore size Transwell filters (upper chamber) to the supernatants in the lower chambers. Hoechst fluorescence of accumulated cells in the lower chamber was measured. Data are the mean of triplicate cultures ± SD of one representative of two experiments. The value was significantly different from that of control. (* P < 0.05; ** P < 0.01) (B). For the neutralization, Abs against MIP-2 and KC were added to the supernatants in the lower chambers at the beginning of culture. The percent inhibition was calculated as follows: 100 - 100 × (chemotaxis with neutralizing Ab/chemotaxis without neutralizing Ab). Data are the mean of triplicate cultures ± SD of one representative of two experiments. The value was significantly different from that of control (* P < 0.05; ** P < 0.01).\n", - "966 \n", - " 8-Cl-Ado and 1,25(OH)2D3 Inhibit Keratinocyte Proliferation. Near-confluent primary mouse epidermal keratinocytes were treated with the indicated concentrations of (A) 8-Cl-Ado or (B) 1,25(OH)2D3 for 24 hours, and [3H]thymidine incorporation was determined as indicated in Materials and Methods. Data represent the mean ± SEM of five experimentsperformed in triplicate; *p < 0.05, **p < 0.01 versus the control value.\n", - "969 \n", - " 8-Cl-Ado Has No Effect on the 1,25(OH)2D3-Induced Increase in Keratin 1 Protein Levels. Near-confluent keratinocytes were incubated for 24 hours with and without 25 μM 8-Cl-Ado in the presence and absence of 20 nM 1,25(OH)2D3 and were then processed for western analysis. (A) A representative immunoblot is shown. (B) Keratin 1 levels were quantified, corrected for background and normalized for loading, as described in Materials and Methods. Data represent the mean ± SEM of four experiments performed in duplicate; *p < 0.05 versus the control value.\n", - "985 \n", - " Indirect immunofluorescence assay (IFA) on Plasmodium falciparum sporozoites. Panel (A) PfNPNA-1 VH/κ, (B) 2A10 MAb.\n", - "997 \n", - " Relative responsiveness of enhancers to Tax in HeLa cells. (A) CAT reporter plasmid. Each plasmid contains two copies of enhancer elements (21-bp repeats, CRE, AP1, Sp1, κB and SRE) and one copy of HTLV-I minimal promoter (HTLV TATAA). The enhancer (Enh.) sequences are shown in green. (B) A representative example of CAT assay. Increasing amounts (5 to 10 μg) of p21-HTLV-CAT (lanes 1 and 2), pCRE-HTLV-CAT (lanes 3 and 4), pAP1-HTLV-CAT (lanes 5 and 6), pSP1-HTLV-CAT (lanes 7 and 8), pKB-HTLV-CAT (lanes 9 and 10) and pSRE-HTLV-CAT (lanes 11 and 12) were transfected into HeLa cells. CAT assays were performed 48 h after transfection. AcCM: acetyl chloramphenicol. CM: chloramphenicol. (C) Basal transcriptional activities of enhancer elements. Five microgram of plasmids containing the HTLV TATAA alone (pHTLV-CAT; column 1) or the indicated enhancer elements (columns 2 to 7) were transfected into HeLa cells and the relative CAT activities were compared. CAT activity from pKB-HTLV-CAT-transfected HeLa cells was taken as 100% (lane 6). (D) Tax-dependent transcriptional activities of enhancer elements. The same plasmids as in C plus 1 μg of Tax-expressing plasmid pIEX were co-transfected into HeLa cells and the CAT assays were performed. Fold activation in the presence of Tax versus in the absence of Tax was calculated and compared. All CAT results are representative of three independent experiments.\n", - "998 \n", - " Relative responsiveness of enhancers to Tax in JPX9 cells. (A) A representative example of CAT assay. Tax-expressing plasmid pIEX (1 μg) and increasing amounts (0.5 to 1 μg) of p21-HTLV-CAT (lanes 1 and 2), pCRE-HTLV-CAT (lanes 3 and 4), pAP1-HTLV-CAT (lanes 5 and 6), pSP1-HTLV-CAT (lanes 7 and 8), pKB-HTLV-CAT (lanes 9 and 10) and pSRE-HTLV-CAT (lanes 11 and 12) were transfected into Jurkat cells. CAT assays were performed 48 h after transfection. AcCM: acetyl chloramphenicol. CM: chloramphenicol. (B) Basal transcriptional activities of enhancer elements. One microgram of plasmids containing the HTLV TATAA alone (pHTLV-CAT; column 1) or the indicated enhancer elements (columns 2 to 7) were transfected into Jurkat cells and the relative CAT activities were compared. CAT activity from pKB-HTLV-CAT-transfected Jurkat cells was taken as 100% (lane 6). (D) Tax-dependent transcriptional activities of enhancer elements. The same plasmids as in C plus 1 μg of Tax-expressing plasmid pIEX were co-transfected into Jurkat cells and the CAT assays were performed. Fold activation in the presence of Tax versus in the absence of Tax was calculated and compared. All CAT results are representative of three independent experiments.\n", - "999 \n", - " Differential activities of Tax mutants on 21-bp repeats (A), κB (B), and SRE (C) motifs. One microgram of plasmid expressing the indicated Tax mutants plus 5 μg of p21-HTLV-CAT, pKB-HTLV-CAT or pSRE-HTLV-CAT was individually transfected into HeLa cells. CAT activity from wild type Tax-transfected cells (lane 1) was taken as 100%.\n", - "1000 \n", - " Specific preference for CREB by Tax. (A) An example of CAT assay. HeLa cells were transfected with pU3RCAT alone (lane 1), pU3RCAT plus Tax expression plasmid pIEX (lane 2) or pU3RCAT plus pIEX plus increasing amounts (5 to 10 μg) of plasmids expressing the indicated dominant-negative proteins (lanes 3–10). D-Threo-[dichloroacetyl-1-14C]-chloramphenicol was as used as substrate in the CAT assay. (B) Influence of dominant-negative proteins on Tax activation. The cells received pU3RCAT (red) or pKB-SV40-CAT (blue) only (group 1), pU3RCAT/pKB-SV40-CAT plus Tax-expressing plasmid pIEX (group 2) or pU3RCAT/pKB-SV40-CAT plus pIEX plus plasmids expressing the indicated dominant-negative proteins. The empty vector was used to normalize the amount of plasmids given to each group of cells. DN: dominant-negative.\n", - "1001 \n", - " Tax preferentially activates the HTLV-I minimal TATAA promoter. (A) CAT reporter plasmid. Each plasmid contains two 21-bp repeats and one copy of minimal promoter (TATAA) from HTLV-I, HIV-1 and SV40. The minimal promoter sequences are shown in blue. (B) A representative example of CAT assay. The cells received 0, 0.5 and 1 μg of Tax-expressing plasmid pIEX and 5 μg of the indicated CAT reporter constructs (p21-HTLV-CAT, p21-HIV-CAT and p21-SV40-CAT). (C, D) Basal and Tax-induced transcriptional activities. HeLa cells were co-transfected with 5 μg of the indicated CAT reporter plasmids (p21-HTLV-CAT, p21-HIV-CAT and p21-SV40-CAT) plus 0.5 μg of pCMV empty vector (w/o Tax) or pIEX (w/ Tax). Basal CAT activity from p21-SV40-CAT-transfected cells was taken as 100% (C, column 3).\n", - "1002 \n", - " DNA-tethered Tax is specifically active on the HTLV-I minimal promoter. (A) CAT reporter plasmid. Each plasmid contains five tandem copies of Gal4-binding sites and one copy of minimal promoter (TATAA) from adenovirus E1b, HIV-1 and HTLV-I. The minimal promoter sequences are shown in blue. (B) A representative example of CAT assay. The cells were co-transfected with 2 μg of a Gal4DB plasmid (pM vector alone for lanes 1–3, pGal4-VP16 for lanes 4–6, and pGal4-Tax for lanes 7–9) and 5 μg of a CAT reporter construct (pG5-E1B-CAT for lanes 1, 4 and 7; pG5-HIV-CAT for lanes 2, 5 and 8; and pG5-HTLV-CAT for lanes 3, 6 and 9). (C, D) Basal and activated transcriptional activities. HeLa cells were co-transfected with 5 μg of the indicated CAT reporter plasmids (pG5-E1B-CAT, pG5-HIV-CAT and pG5-HTLV-CAT) plus 2 μg of pM empty vector (C), pGal4-VP16 (D, blue) or pGal4-Tax (D, yellow). Basal CAT activity from pG5-HIV-CAT-transfected cells was taken as 100% (C, column 2).\n", - "1003 \n", - " Tax further activates a promoter with DNA-tethered TBP. (A) CAT reporter plasmid. Each plasmid contains two copies of 21-bp repeat, five copies of Gal4-binding sites and one copy of minimal promoter (TATAA) from adenovirus HTLV-I, HIV-1, SV40 and adenovirus E1b. (B) CAT assay. HeLa cells were co-transfected with 5 μg of the indicated CAT reporter plasmids (p21-G5-HTLV-CAT, p21-G5-HIV-CAT, p21-G5-SV40-CAT and p21-G5-E1B-CAT) and 2 μg of pGal4-TBP (yellow) or 2 μg of pIEX (Tax; pink) or 2 μg of pGal4-TBP plus 2 μg of pIEX (Gal4-TBP + Tax; blue). Basal CAT activity from cells transfected with pGal4-TBP plus p21-G5-E1B-CAT was taken as 100% (group 4, yellow).\n", - "1004 \n", - " Col Expression during Lymph Gland Ontogeny(A) Col expression in lymph gland precursors is first observed in two separate clusters of cells (black arrows) in the dorsal-most mesoderm of thoracic segments T2 and T3 at stage 11 (stages according to Campos-Ortega and Hartenstein [1997]). Col expression in the head region is ectodermal (parasegment 0) and related to its function in head segmentation (Crozatier et al. 1999).(B and C) The clusters of Col-expressing cells get closer between stage 12 and early stage 13 (B) before coalescing (C).(D and E) Col expression becomes progressively restricted to the posterior-most cells of the forming lymph glands (arrowhead) during stage 14, as shown by the partial overlap between Odd-skipped (Odd) and Col expression.(F and G) Enlarged view of lymph glands after completion of embryogenesis, stage 16. Col expression marks the prospective PSC (Lebestky et al. 2003) in a dorsal-posterior position (arrowheads).(H) Schematic representation of Col expression in the lymph glands and pericardial cells in stage 16 embryos.(I) A srp6G mutant embryo arrested at stage 13. Col is expressed in the presumptive lymph gland primordium (black arrow), although it is not possible to distinguish between high and low levels of expression. All embryos are oriented anterior to the left. (A–C), (G), and (I) are lateral views; (D–F) are dorsal views. (B), (C), and (E–G) are higher magnifications of the dorsal thoracic region. White arrows in (A) and (I) indicate Col expression in a developing dorsal muscle (Crozatier and Vincent 1999).\n", - "1005 \n", - " \n", - "col Requirement for Lamellocyte Differentiation(A–C) 4′,6-diamidino-2-phenylindole (DAPI) staining of hemocytes from wt (A and B) and from col1 (C) third instar larvae. (A) Uninfected larva; (B) and (C) infected larvae. Plasmatocytes (inset in [A]) are always present, whereas lamellocytes (inset in [B]) are detected in the hemolymph of wt (B) but not col1 (C) larvae 48 h after infestation by L. boulardi. In col1 mutants, the wasp eggs are not encapsulated (white arrows) and develop into larvae (bottom right organism in [C]).(D–F) Lamellocytes expressing the P-lacZ marker l(3)06949 (Braun et al. 1997) surround the wasp eggs in wt larvae (D), are completely absent in infected col1 mutant larvae (E), and differentiate in the absence of wasp infection following enforced Col expression in hematopoietic cells (srpD-Gal4/UAS-col larvae) (F). (G) srpD-Gal4/UAS-col pupa showing the presence of melanotic tumors.Bars: 50 μm.\n", - "1009 \n", - " A Model for Lamellocyte Specification(A) A model for the induction of lamellocyte differentiation in the Drosophila lymph glands in response to wasp parasitization. Col enables PSC cells to respond to a primary signal (S1) that is likely emitted by plasmatocytes upon their encounter with a parasite (Russo et al. 1996; Meister 2004). As a result, the PSC cells send a secondary signal (S2) that causes prohemocytes to develop into lamellocytes. Notch (N) signalling instructs a fraction of prohemocytes to become crystal cells (Duvic et al. 2002; Lebestky et al. 2003). The circular arrow indicates that increased proliferation leading to increased numbers of crystal cells and lamellocytes follows parasitization (Sorrentino et al. 2002).(B) Schematic view of hematopoiesis in Drosophila and mouse. Left: Lymph gland cells contain two types of hematopoietic cells, PSC cells and uncommitted precursors. These precursors can give rise to either plasmatocytes or crystal cells. Crystal cell precursors can also give rise to lamellocytes upon receiving a signal from the PSC cells expressing Col (dotted arrows); this signalling is itself dependent upon a communication between circulating plasmatocytes and the PSC (A). Right: In mice, hematopoietic stem cells (HSC) give rise to common myeloid precursors (CMP) and common lymphoid precursors (CLP) (adapted from Orkin [2000] and Schebesta et al. [2002]). Signalling between CMP- and CLP-derived cells is an essential component of adaptive immunity. Col and EBF functions, in Drosophila and vertebrate hematopoiesis, respectively, suggest an ancestral role in their conferring on a subset of hematopoietic cells the ability to respond to signals from circulating immune supervisors (generically designated here as macrophages) and to provide a secondary line of defence against specific intruders.\n", - "1011 \n", - " Frequency Distribution of the 16 Possible Microsatellite-Flanking 5′–3′ Base Combinations Relative to Random Expectation(A) Cassette frequencies around (AC)2 microsatellites: black bars, observed; white bars, expected. Error bars show 95% confidence intervals and asterisks indicate significant difference (χ2 tests, 1 d.f. p < 0.05 with sequential Bonferroni corrections).(B) Deviation of cassette frequencies from random expectations around (AC)2, (AC)5, and (AC)10 microsatellites: black, white, and hatched bars, respectively.(C) Sampled number (solid line) and proportion (dotted line) of microsatellites with cassette T/A as a function of microsatellite length.\n", - "1015 \n", - " Dependence of Dinucleotide Pattern Strength on the Presence of Repeat ClustersBeginning with the dataset from the scenario showing strong patterning and large sample size (cassette T/A, dinucleotide AT, (AC)5; see Figure 5C), flanking sequences containing (AT)x were excluded, where x equalled 2 or more (A), 3 or more (B), 4 or more (C), and 5 or more (D). Plotting conventions are the same as for Figure 4.\n", - "1018 \n", - " Dependence of Sequence Similarity among Flanking Sequences on AC Repeat NumberThe average number of matches shown (± standard error) quantifies similarity among three classes of sequence: (1) blocks of 50 bp lying immediately adjacent to a microsatellite; (2) blocks of 50 bp chosen randomly to lie between 500 and 600 bases downstream from a microsatellite; and (3) randomly selected blocks of 50 bp from around the genome. Average level of chance similarity in the genome is shown by a black line in each plot (comparison among class 3). 5′ and 3′ sequences are shown separately. Comparisons among sequence classes are shown for class 1 to class 1 (A), class 1 to class 2 for sequences at the same locus (B), class 1 to class 2 for sequences at different loci (C), and class 1 to class 3 (D).\n", - "1021 \n", - " Comparison of Antisense and Inverted-Repeat Silencing of pmt\n", - "Nicotine content (mean of 5–6 plants/line) normalized to mean of WT of unelicited (control) N. attenuata plants and plants 5 d after elicitation with 150 μg of MeJA per plant from independent lines transformed with (A) antisense pmt constructs and (B) an IRpmt construct. In contrast to the 31 lines transformed with the antisense pmt construct, 29 of the 34 IRpmt lines had dramatically reduced constitutive and MeJA-induced nicotine levels. T, terminator; P, promoter; I, spliceable intron; arrow, 950-bp consensus fragment of pmt1 and pmt2. For details of transformation constructs see Protocol S1.\n", - "1022 \n", - " PMT Transcript and Alkaloid Levels of IRpmt LinesMean (± SE) relative PMT mRNA transcript levels in the roots (A), and leaf levels of (B) nicotine and (C) anatabine, in two independent lines of IRpmt-transformed (108 and 145) and WT N. attenuata plants. Elicited (150 μg of MeJA) and unelicited (control) plants were harvested at 10 h for transcript (A) and at 4 d for alkaloid (B and C) quantification. Both IRpmt lines had significantly reduced PMT transcript and nicotine but featured anatabine not present in WT plants. Lowercase letters signify differences at p ≤ 0.01, Bonferroni corrected ([A] n = 3, ANOVA: F2,12 = 12.55; [B] n = 8–10, ANOVA: F2,50 = 135.4; [C] n = 8–10, ANOVA: F2,50 = 39.611]. n.d., not detected.\n", - "1024 \n", - " Herbivore Damage to IRpmt and WT N. attenuata Plants in Nature(A) Leaf alkaloids (nicotine and anatabine) and TPIs 7 wk after transplantation (n = 6). Mean (± SE) percentage total leaf area damaged by (B) all herbivores and (C) only by Spodoptera exigua on WT N. attenuata plants and plants transformed with an IRpmt construct (108) that were either untreated (solid lines) or elicited (dotted lines; asterisk) with MeJA 7 d after plants were transplanted into a field plot in a native habitat. Differences between 108 and WT, 108*, and WT* are significant at p ≤ 0.05 (n\n", - "PMT = 36, n\n", - "WT = 50, n\n", - "PMT* = 28, n\n", - "WT* = 27; [B] ANOVA: F3,822 = 5.73, p = 0.001; [C] ANOVA: F3,822 = 4.6, p = 0.004). Plants of the nicotine-deficient transformed line 108 suffered significantly higher leaf area damage than did WT plants, but when line 108 was elicited, leaf damage by all herbivores was reduced to WT levels.\n", - "1026 \n", - " Cellularisation of Striated Myofibers after Implantation into a Larval Limb Blastema(A) Schematic diagram of procedure. After dissociation of larval limb musculature, the cells were loaded with a cell tracker dye and single myofibers taken up into a suction micropipette, prior to injection into a larval limb blastema as detailed in the Materials and Methods.(B) Section of a limb at 48 h after implantation of CellTracker Orange-labelled myofibers. The section has been counterstained with the nuclear stain Sytox green. Note the dye-labelled mononucleate cells (arrowed). Scale bar, 20 μm.\n", - "1027 \n", - " Plasticity of Isolated Myofibers(A) Phase-contrast micrograph of a live cell at 3 d after plating, showing a lobulated structure in the middle of the fiber.(B) Micrograph of a live fiber at 2 d after plating, showing budding of nuclei at one end. The cell has been counterstained with Syto 13.(C) Fluorescence micrograph of a myofiber at 24 h after microinjection with TR–dextran. The cell has been counterstained with Syto 13 dye to show the nuclei.(D) Fluorescence micrograph of a colony formed from a single myofiber injected 24 h earlier with TR–dextran. The cell has flattened on the substrate and the nuclei are stained with Syto 13 dye.(E) Fluorescence micrograph of a colony formed from the progeny of several myofibers in proximity that were injected 5 d earlier with TR–dextran.(F) Analysis of the DNA content of cells derived from myofibers injected 5 d earlier with TR–dextran. The DNA content was determined by image analysis of the nuclei of mononucleate TR-positive cells that had been stained with Hoechst (see Materials and Methods). The green arrow is the value for G0 nuclei in quiescent myofibers, while the blue arrow is the G2/M value determined for mononucleate cells with anti-phosphohistone H3. The red arrow is the G1 value determined for mononucleate cells.(G) Photomicrograph of a live myofiber, 48 h after plating, showing a binucleate bud formed at the end. The cell was stained as for (B).(H) Fluorescence micrograph of a bud containing three nuclei stained with Syto13 (yellow) derived from a myofiber that contained at least five nuclei and that was injected with TR–dextran (red).Scale bars: (B), (C), and (G), 100 μm; (A), (E), and (H), 50 μm; and (D), 10 μm.\n", - "1028 \n", - " Analysis of Nuclear Migration and Fragmentation by Time-Lapse Microscopy(A) Single frames illustrating the migration of three nuclei (yellow arrows) along a myofiber, of which two are incorporated into a terminal aggregate by 11.4 h. One nucleus (green arrow) remained stationary during this period.(B) Single frames illustrating the production of viable multinucleate fragments from a myofiber. Note the presence of a trinucleate aggregate (arrowed green) that separates after lateral breakage of the fiber (0 min, arrowed yellow). This fragment subsequently extends cytoplasmic processes (14.3 and 15.4 h) and migrates over the culture substratum.Series (A) and (B) begin at 6 h after plating. Scale bars: (A) 50 μm; (B) 200 μm.\n", - "1029 \n", - " Plasticity and Microtubule Depolymerization(A) The distribution of microtubules surrounding a multinucleate aggregate on a myofiber, as analysed by staining with anti-β-tubulin. Note the relatively disordered state of the tubulin (arrowed) in the vicinity of the nuclei. The fiber was stained at 48 h after plating. Scale bar, 50 μm.(B) Taxol inhibits the activation of myofibers after dissociation. Myofibers were dissociated and cultured in the presence of taxol as described in the Materials and Methods. The number of active fibers was determined as described.\n", - "1030 \n", - " Analysis of mRNA Expression in Myofibers at 48 h by In Situ Hybridisation(A) Expression of Msx1 mRNA in active myofiber. Note the accumulation of reaction product around nuclear aggregates (arrowed).(B) Absence of significant Msx1 mRNA expression in a quiescent fiber. This image is taken from the same culture as (A).(C) Expression of NRad mRNA in nuclei of quiescent fibers (arrowed). Comparable intensity was observed for NRad expression by active fibers.(D) Expression of Msx1 mRNA in nuclei of fibers (arrowed) made quiescent by culture in taxol. Note the difference in Msx1 expression levels between the taxol-induced inactive fibers and normal quiescent myofibers in (B). Scale bar, 50 μm.\n", - "1031 \n", - " Analysis of the Functional Role of Msx1 Expression by Exposure to Morpholino Antisense Oligonucleotides(A and B) Uptake of morpholino by myofibers. Myofibers were dissociated in the presence of biotinylated (A) or control (B) morpholinos and analysed by tyramide signal amplification at 24 h after plating. Note the positive signal in (A), dependent on the presence of biotin moiety. In three different experiments 70%–90% of the fibers were loaded as determined with this assay. Scale bar, 50 μm.(C) Functional effect of loading various morpholinos. Note that loading Msx1 antisense leads to a specific decrease in the proportion of active fibers relative to controls.(D–G) Staining of myofibers with antibody to Msx1 protein. (D and E) Fluorescence micrograph of a nucleus in a quiescent myofiber stained with Hoechst for DNA (D) and Msx1 protein (E). (F and G) Fluorescence micrograph of a nucleus in an active myofiber stained for DNA (F) and Msx1 protein (G). These images (D–G) were taken from the same culture. Scale bar, 20 μm.(H) Distribution of fluorescence intensity of nuclei in myofibers after staining with antibody to Msx1. The distributions for control active fibers and control quiescent fibers were determined for cells in the same culture and are significantly different (ANOVA, p < 0.001 at 95% confidence level). The distribution for antisense-treated quiescent fibers is not significantly different from that for control quiescent fibers.\n", - "1032 \n", - " The Strategy for Isolation of Recessive Mutations Disrupting Cortical Development(A) Migrating interneuron precursors appear to migrate tangentially (yellow arrows) through both the MZ and the IZ/SVZ. Precursors also migrate radially (pink arrows) to reach the developing cortical plate (CP).(B) Migrating interneuron precursors expressing β-galactosidase can be seen in a whole-mount preparation of an E14.5 Dlx-LacZ mouse as diffuse cortical staining.(C) In coronal section, the densely labeled SVZ of the LGE can be seen, as can the streams of migrating interneuron precursors in the cortex.(D) To identify recessive mutations, male C57BL6/J mice were treated with ENU and then crossed to FVBN/J females that were homozygous for the Dlx-LacZ transgene. Male offspring of this cross were backcrossed to produce female offspring that were then backcrossed to their fathers. Embryonic litters from these backcrosses were stained and examined for defects at E13.5 or E14.5.\n", - "1033 \n", - " Novel Alleles of scribble, megalin, and Rfx4\n", - "(A and B) Comparison of E12.5 WT (A) and mutant (B) embryos showing the severe craniorachischisis of line 90 embryos.(C) Sequencing chromatograms show the thymine in the WT sequence (top) that is an adenine in line 90 (bottom). This thymine-to-adenine substitution changes an isoleucine codon to a lysine codon within a conserved LRR domain of SCRIBBLE.(D and E) Ribbon diagrams of an LRR fold, illustrating the predicted position (red arrowheads) of the line 90 amino acid substitution. The substitution is in a linker region between two stretches of β-sheet. An LRR fold has a β-sheet on the inside, and linker regions on the outside, of a broad half-circular curve.(F) The predicted domain structure of SCRIBBLE indicating where the line 90 and the Circletail alleles alter the protein relative to the three LRR and four PDZ domains.(G and H) Dorsal views of the cortex of E17.5 WT (G) and line 267 mutant (H) embryos stained to reveal the expression of the Dlx-LacZ transgene. The red arrowheads point to the choroid plexus of the third ventricle, which is stained because of its endogenous β-galactosidase expression, and which is greatly enlarged in the mutant. The cortex of the mutant is longer along the rostrocaudal axis and is altered in shape in the caudal portion (yellow arrows). The olfactory bulbs (blue arrowheads) are also altered in shape.(I) The choroid plexus persists in its hypertrophic state after birth and can be seen as a pinkish lump on the head of this postnatal day 14 (P14) pup.(J) A coronal section through the dorsal portion of the diencephalon of a P0 pup.(K) Sequencing chromatograms show the thymine in the WT sequence (top) that is an adenine in line 267 (bottom).(L) The predicted domain structure of MEGALIN indicating where the new stop codon is introduced by the line 267 mutation.(M and N) Dorsal views of the cerebral cortex of E14.5 WT (M) and line 269 mutant (N) embryos stained to reveal the expression of the Dlx-LacZ transgene.(O and P) Coronal sections of E14.5 WT (O) and line 269 mutant (P) forebrains. Red arrowheads indicate the apparent span over which dorsal midline structures are lost in the mutant.(Q) Sequence chromatograms showing the thymine in the WT sequence (top) that is a cytosine in line 269 (bottom).(R) The predicted domain structure of RFX4 indicating where the line 269 substitution alters the protein relative to the DNA binding and the extended (B, C, and Dim) dimerization domains.\n", - "1034 \n", - " Severe Disruption of Interneuron Migration in Line 154 Mutants(A) Disseminated immature interneurons are seen as diffuse cortical (Cx) staining in WT embryos. Subcortical expression in the SVZ of the LGE can be seen as a darkly stained, inverted crescent.(B) Embryos homozygous for the line 154 mutation have little or no cortical staining, and the subcortical staining has aberrant streaks (pink arrowheads) and spots (white arrowhead), particularly in the frontal cortex.(C, E, and G) In this rostral-to-caudal series of coronal sections from WT embryos, the normal MZ and IZ/SVZ migratory streams are diffusely labeled (red arrowheads), and a sharp cortical-subcortical boundary (black arrowheads) is marked by the abrupt transition between the densely stained SVZ of the LGE and the diffuse staining of the migrating interneuron precursors.(D, F, and H) A rostral-to-caudal series of coronal sections from a line 154 mutant embryo shows the rostral spots (white arrowheads) visible in whole mount to be aggregates of cells in the cortex, and the streaky subcortical staining to be radially directed linear aggregates (pink arrowheads). The SVZ of the LGE is also noticeably thinner, and there is not a well-defined cortical-subcortical transition in the staining pattern.(I and J) Rostral views of Gad67 whole-mount in situ hybridization show the pattern of migration abnormalities in the cortex and significant defects in population of the olfactory bulb by GABAergic neurons.\n", - "1035 \n", - " Limb Patterning Defects in Tangential Migration MutantsAnterior is to the right for all limbs.(A–C) Left hindlimbs are shown from E14.5 WT (A), line 251 (B), and line 239 (C). Yellow arrowheads point to extra digits on the anterior (thumb) side of the limb in mutants. Line 275 mutants also have anterior polydactyly. The mutants have a slight developmental delay that causes some differences in appearance of the limb buds at E14.5, when the limbs are growing rapidly.(D) This diagram illustrates components of the Shh/Fgf feedback loop that maintains Fgf4 expression in the AER.(E–J) In situ hybridization on E11.5 limb buds. Unlike in WT (E), expression of the posterior patterning gene Hoxd13 in left forelimb buds extends ectopically into an anterior domain (yellow arrowheads) in 251 (F) and 239 (G) mutants. Fgf4 expression in left hindlimb buds, restricted to the posterior AER in WT (H), has an ectopic expression domain at the far anterior edge of the AER (yellow arrowheads) in 251 (I) and 239 (J) mutants.\n", - "1036 \n", - " Line 239, 251, and 275 Mutants Have Similar Migration Defects(A) Frontal view of an E14.5 WT embryo.(B) Frontal view of an E14.5 embryo homozygous for the line 239 mutation. The stream of cells leaving the SVZ of the LGE is streaky and aggregated in the rostral cortex of the mutant.(C–E) A rostral-to-caudal series of coronal sections from an E14.5 WT embryo. WT embryos have diffuse cortical staining and a sharp boundary (black arrowheads) between the subcortical and the cortical telencephalon.(F–H) Coronal sections from E14.5 line 239 mutant forebrains. Yellow circles indicate the area of the cortical-subcortical boundary where a large excess of migrating cells can be seen in the IZ/SVZ area. Orange arrowhead indicates aggregated cells in the IZ/SVZ of the lateral wall of the cortex. White arrowheads indicate aggregates in the medial wall. The staining in the MZ appears normal. Defects become less apparent in the more caudal sections.(I–K) Sections from an E14.5 line 251 mutant embryo. Orange arrowheads indicate aggregates in the lateral wall of the cortex. In (I), a linear aggregate of stained cells can be seen extending from the IZ/SVZ to the MZ (red arrowhead). The cortical-subcortical boundary is well defined in line 251 mutants.(L–N) Sections from an E14.5 line 275 mutant embryo. Yellow circles indicate aberrant staining in the cortical-subcortical boundary region. The white arrowhead indicates aggregates in the medial wall of the cortex, and the red arrowhead points to a radially directed aggregate of cells extending from the IZ/SVZ to the MZ.\n", - "1037 \n", - " Dlx-LacZ and GAD67 Expression Show that Interneuron Precursors Persist in the IZ/SVZ of 251 Mutant Cortices(A) Coronal section through the forebrain of an E18.5 WT embryo stained for β-galactosidase and counterstained with nuclear fast red.(B) A similar section from a line 251 mutant embryo. Unusual accumulations of stained cells can be seen in the cortex just dorsal to the striatum (white arrowheads). Aggregates of cells in the IZ/SVZ can also be seen (black arrowhead).(C and D) Sections adjacent to those in (A) and (B) hybridized with a probe for Gad67 mRNA. Arrowheads in (D) point to the same features that are seen in (B).(E–H) Higher-magnification views of the dorsal portions of the sections in (A–D).(I and J) Higher-magnification view of cortex. In the WT cortex (I), cells can be seen dispersed through the cortical plate (yellow arrowheads) and scattered through the MZ (blue arrowheads). Similar distributions of labeled cells can be seen in the mutant cortex (J). In contrast to the WT, however, aggregates of cells are found in IZ/SVZ (black arrowheads).\n", - "1040 \n", - " Grafting Method May Influence the Spreading Efficiency of the Silencing Signal (According to Crete et al. 2001)(A) Top grafting, the most effective in transmitting the silencing signal. (B) Reciprocal transverse graft. (C) Plug graft.\n", - "1043 \n", - " Lesion AnalysisRepresentative photomicrographs of cresyl-violet-stained coronal brain sections taken from subjects belonging to each of the three lesion groups—partial hippocampal lesion (A), sham lesion (B), and complete hippocampal lesion (C). In each case, sections corresponding to anterior, middle, and posterior levels of the hippocampus are displayed. The mean area of spared hippocampal tissue in each group (see Materials and Methods for calculation) is plotted below in (D). Note that the volumes of spared tissue in the septal and temporal halves of the hippocampus are plotted separately, but these values are still expressed as percentages of the entire hippocampal volume—hence the value of 50% per half in shams. The cartoon hippocampi accompanying the graph indicate lesioned tissue in dark grey, and spared tissue in light cream. As intended, partially lesioned rats exhibited substantial sparing only in the septal (dorsal) half of the hippocampus, and rats with complete hippocampal lesions exhibited minimal sparing (less than 5% at either pole).\n", - "1047 \n", - " Dedifferentiation of Limb Cells During Salamander Limb RegenerationBrown nuclei are a result of BrdU incorporation during DNA synthesis, and therefore mark cells that are progressing through the cell cycle. Abbreviations: e, epidermis; d, dermis; m, muscle; b, bone; bl, blastema; aec, apical epithelial cap.(A) Unamputated right forelimb of a newt and coronal section of the stylopodium. The only cells actively synthesizing DNA are those in the basal layer of the epidermis (bone marrow cells also actively synthesize DNA in the unamputated limbs but are not shown here). Note the long myofibers in the nonregenerating newt limb and the distant spacing between the muscle nuclei.(B) Seven-day limb regenerate and coronal section of the distal regenerating tip. Note that the muscle cells have lost their normal architecture and that the nuclei are more closely spaced and have begun to synthesize DNA.(C) Twenty-one-day limb regenerate and coronal section of the distal regenerating tip. The nuclei of the blastema are spaced closely together, and many nuclei are actively synthesizing DNA. The bone is also being broken down in the vicinity of the blastema.\n", - "1051 \n", - " Effects of Tissue-Specific Transcription on Integration Site Selection in Different Cell TypesGenes hosting integration events by the HIV vector were analyzed for their expression levels in transcriptional profiling data from IMR90, PBMC, and SupT1 cells. For each gene hosting an integration event, the expression values from the three cell types were then ranked lowest (red), medium (orange), and highest (yellow). The values were summed and displayed separately for each set of integration sites: (A) IMR90 sites, (B) PBMC sites, and (C) SupT1 sites. In each case there was a significant trend for the cell type hosting the integration events to show the highest expression values relative to the other two (p < 0.05 for all comparisons).\n", - "1055 \n", - " ER-Distal Secretory Stress Boosts HAC1 mRNA Abundance(A) Determination of HAC1 mRNA abundance during the UPR. The UPR was induced in WT cells by addition of either 6 mM DTT (lanes 1–4) or 1 μg/ml tunicamycin (lanes 5–8) for the times indicated. Total RNA was harvested at the indicated intervals, and the relative abundance of HAC1 and ACT1 mRNAs was analyzed by Northern blot analysis (see Materials and Methods). Splicing was calculated at the ratio of spliced (HAC1i) to total (HAC1i + HAC1u) mRNA.(B) Determination of HAC1 mRNA abundance during ER-distal secretory stress. WT, sec12–1, sec14–3, and sec1–1 strains were grown at 23 °C and shifted to 37 °C.(C) Determination of HAC1 mRNA abundance during ER-proximal secretory stress. WT, sec14–3, sec61–101, sec62–101, and sec63–201 strains were grown at 23 °C and shifted to 37 °C.\n", - "1056 \n", - " \n", - "HAC1 mRNA Induction Requires a Bipartite Signal and Is IRE1-Independent(A) Determination of HAC1 mRNA abundance during ER stress and temperature shift. WT cells were grown at 23 °C and shifted to 37 °C (lanes 1–4 and 9–12) or kept constant at 30 °C (lanes 5–8). DTT was added as indicated (lanes 5–8 and 9–12).(B) Determination of HAC1 mRNA abundance during ER stress and inositol deprivation. WT cells were grown at 30 °C in synthetic medium supplemented with inositol and shifted to synthetic medium lacking inositol (lanes 1–4 and 9–12), or continuously grown in medium supplemented with inositol (lanes 5–8). Tunicamycin was added to a final concentration of 1 μg/ml as indicated (lanes 5–8 and 9–12).(C) Distinction between heat shock response and HAC1-mRNA-inducing conditions. WT (lanes 1–4 and 9–12) and HSF1c (lanes 5–8) strains were grown at 23 °C and shifted to 37 °C (lanes 1–4 and 5–8) or continuously grown at 37 °C (lanes 9–12), and DTT added as indicated.(D) Analysis of IRE1 pathway for a role in HAC1 mRNA induction. Δire1 cells were grown at 23 °C and shifted to 37 °C (lanes 1–4 and 9–12) or continuously grown at 30 °C (lanes 5–8), and DTT was added as indicated (lanes 5–8 and 9–12). Note that in Δire1 cells, HAC1 mRNA is modestly induced in response to DTT alone (lanes 5–8). This observation is indicative of feedback regulation, whereby a block in the UPR induces the I/T signal.\n", - "1057 \n", - " Activation of the HAC1 Promoter Controls Increase in HAC1 mRNA Abundance(A) Analysis of HAC1 promoter activity during bipartite stress conditions. Δhac1 cells containing either a construct restoring HAC1 expression (lanes 1–4) or a construct expressing GFP driven by the HAC1 promoter (lanes 5–8) were grown at 23 °C and shifted to 37 °C concurrent with addition of DTT as indicated.(B) Determination of mRNA half-life during HAC1-mRNA-inducing conditions. polIIts cells were grown at 23 °C and were shifted to 37 °C either in the absence (open symbols) or presence (filled symbols) of DTT. HAC1 mRNA abundance (squares) and ACT1 mRNA abundance (circles) are normalized to the abundance of the PolIII transcript SCR1.\n", - "1058 \n", - " \n", - "HAC1 Promoter Regulation Is Required to Survive Stress(A) Determination of Hac1p levels during either ER stress alone or during both ER stress and temperature shift. WT cells were either grown at 30 °C and treated with DTT (lanes 1–4) or grown at 23 °C and simultaneously shifted to 37 °C and treated with DTT (lanes 5–8). Protein lysates were prepared, and protein levels were analyzed by Western blot analysis. The relative Hac1p/Pgk1p ratio is normalized to the DTT-treated sample (lane 4).(B) Characterization of HAC1 expression in strain used to approximate basal HAC1 expression. Cells expressing HAC1 from the endogenous promoter (lanes 1–4) or the ADH1 promoter (lanes 5–8) were grown at 30 °C in synthetic medium supplemented with inositol and shifted to synthetic medium lacking inositol simultaneous with the addition of tunicamycin.(C) Reduced viability of strains unable to express HAC1 at elevated levels. The strains described in (B) were plated in serial dilutions (left to right) on synthetic medium lacking inositol (“−ino”) and synthetic medium lacking inositol and containing tunicamycin (“−ino +TM”).\n", - "1059 \n", - " Differential UPR Target Gene Induction by Elevated Hac1p Levels(A) Comparison of UPR target gene induction under either UPR or S-UPR conditions. Whole-genome mRNA expression analysis was carried out on WT cells harvested after 60 min of treatment, either grown at 30 °C and treated with 6 mM DTT (x-axis), or grown at 23 °C and simultaneously shifted to 37 °C and treated with 6 mM DTT (y-axis). Fold changes in gene expression are in reference to the untreated (t = 0) samples. Shown are only those genes designated as targets of the UPR (see Materials and Methods). The dashed diagonal line represents equal induction under both conditions.(B) Comparison of UPR target gene induction under either UPR or S-UPR conditions (alternate display). The data from (A) were analyzed to generate a ratio (x-axis) for each gene, dividing the induction during S-UPR-inducing conditions by the induction during UPR-inducing conditions, with target genes of similar ratio grouped together (y-axis).(C) Characterization of HAC1 expression in a strain constitutively expressing HAC1 at high levels. Cells expressing HAC1 from the endogenous promoter (WT; lanes 1 and 2), or a modified promoter constitutively expressing HAC1 at high levels (HAC1proHI; lanes 3 and 4) were treated with 6 mM DTT for 60 min. Although the basal transcription of HAC1proHI is elevated, the promoter is still capable of further induction during the S-UPR (unpublished data).(D) Determination of Hac1p level in a strain constitutively expressing HAC1 at high levels. Protein lysates were prepared from the strains described in (C), and protein levels were analyzed by Western blot analysis. The relative Hac1p/Pgk1p ratio is normalized to the WT DTT-treated (t = 60) sample from Figure 4A.(E) Transcriptional response of different classes of UPR targets to high levels of Hac1p. Whole-genome mRNA expression analysis was carried on HAC1proHI and WT cells treated with 6 mM DTT and harvested after 60 min. For the genes in each of the three classes of UPR targets defined in (B), a ratio (x-axis) is calculated by dividing the fold induction in DTT-treated HAC1proHI cells by the fold induction in DTT-treated WT cells. This ratio is plotted against the number of genes with a similar ratio (y-axis). The Class 2 target YFR026C (asterisk), which is DTT-induced approximately 10-fold more in HAC1proHI than in WT cells, is of unknown function. a, DER1; b, INO1; c, YOR289W; d, YHR087W.(F) Transcriptional response of different classes of UPR targets to UMF. Whole-genome mRNA expression analysis was carried on ADH1pro-HAC1 cells grown at 23 °C and simultaneously shifted to 37 °C and treated with 6 mM DTT, and WT cells treated with 6 mM DTT, both harvested after 60 min. For the genes in each of the three classes of UPR targets defined in (B), a ratio (x-axis) is calculated by dividing the fold induction in ADH1pro-HAC1 cells under S-UPR-inducing conditions by the fold induction in WT cells under UPR-inducing conditions. This ratio is plotted against the number of genes with a similar ratio (y-axis). a, DER1; b, INO1; c, YOR289W; d, YHR087W.\n", - "1061 \n", - " Zebrafish mon Mutants Have Severe Defects in Primitive Hematopoiesis(A) Whole-mount TUNEL assays reveal that ventral-posterior mesodermal cells undergo apoptosis in homozygous montg234 mutant embryos. Whole-mount in situ hybridization of gata1 detected at the 12- and 18-somite stage in genotyped embryos. Posterior views, anterior to the left.(B) Extensive apoptosis is visible in the trunk and tail (arrowhead) and also in hematopoietic cells of the embryonic blood island at 22 h of development (arrow). Whole-mount in situ hybridization at 22 hpf including scl, gata2, gata1, ikaros, and myb in montg234 mutants. Expression of myb is greatly reduced in the blood islands because of a loss of erythroid cells, but embryonic macrophages are still present (arrows). The expression of rag1 in thymic T-cells appears normal in mon mutants at 5 d postfertilization (arrow heads). Lateral views of 22 hpf and 5-d-old embryos.\n", - "1063 \n", - " Positional Cloning Identifies the mon Gene as Zebrafish tif1γ\n", - "(A) Physical map of the mon locus on zebrafish Chromosome 8. Microsatellite markers z987 and z11001 were used to initially identify recombinants in a panel of 2,200 diploid montg234 homozygous mutants. The AFLP marker MA3 was used to initiate a chromosomal walk in PAC libraries. The critical PACS that were isolated to encompass the mon locus are indicated by numbers above bar. The PAC 107N19 defines the critical interval for the mon gene. This PAC was used as a probe to screen cDNA libraries and to identify zebrafish tif1γ cDNAs. Numbers below the bar indicate the number of recombinants identified by SSCP analysis.(B) Clustal-W–generated phylogentic tree of zebrafish (Danio rerio [Dr]) Tif1γ and Tif1α peptide sequences in comparison to TIF1 family members: human (Hs) TIF1α, TIF1β, and TIF1γ; mouse (Mm) Tif1α, Tif1β, and Tif1γ;; and fly (Dm) bonus.(C) Diagrams illustrating the structure of the Tif1γ-predicted peptide and the three identified point mutants. RING finger (RING), B-boxes (B1 and B2), plant homeodomain finger (PHD) and bromodomain (BROMO). Numbers below the first diagram indicate the percent identity shared between each of these domains in zebrafish and human TIF1γ. The predicted truncated proteins are indicated.(D) DNA sequence chromatograms showing the three ENU-induced point mutants in comparison to wild-type control sequences\n", - "1064 \n", - " The mon/tif1γ Gene Is Highly Expressed in Hematopoietic Mesoderm(A) In situ hybridization of zebrafish embryos demonstrating the embryonic expression of tif1γ. tif1γ is initially expressed as a maternal mRNA. Increased expression of tif1γ in ventral-lateral mesoderm begins between the one- to three-somite stages and increases through early development. By five somites, tif1γ is strongly expressed in lateral stripes of mesoderm that also express scl. At 22 hpf tif1γ is expressed broadly in the brain, spinal cord, trunk, and tail mesenchyme, but is at much higher levels in hematopoietic cells of the blood island. Zebrafish tif1α is also broadly expressed but relatively more uniform in most tissues, in comparison to tif1γ. Tif1α is weakly expressed at early somite stages in hematopoietic mesoderm and uniformly expressed at 22 hpf, including expression in the blood islands. Expression of scl at five somites and 22 hpf highlights the embryonic blood island in comparison to tif1γ expression.(B) In situ hybridization of mouse embryos detects broad expression of Tif1γ at embryonic day 8.5 including the yolk sac blood islands (arrow). AT embryonic day 12.5, there is high level expression in the fetal liver (arrow) and broad expression in the embryonic brain, spinal chord, gut, and muscle.\n", - "1065 \n", - " Overexpression of Wild-Type tif1γ mRNA or Marrow Transplantation Rescues Embryonic Hematopoiesis in mon Mutants(A) montg234 mutants are rescued by injection of mRNA-encoding wild-type Tif1γ protein. At 4 d of development, large numbers of RBCs are visible in the circulation of wild-type zebrafish, shown here by o-dianisidine staining of hemoglobin. Uninjected monttg234 homozygous mutants are completely bloodless. Injection of 100 pg of wild-type tif1γ mRNA rescues erythropoiesis in mutant embryos. o-dianisidine-stained larvae are shown in ventral views to highlight blood in vessels.(B) Transplantation of wild-type zebrafish marrow cells carrying a gata1:GFP transgene into 2-d-old embryos reconstitutes erythropoiesis, but not viability, in montg234 homozygous mutants. Still frames from movies of live embryos at day 3 posttransplant highlight less than 100 GFP+ RBCs in circulation (top). Transplanted cells were observed to proliferate resulting in thousands of donor-derived erythrocytes 7 d later (bottom). Arrows indicate the hearts of control and transplanted zebrafish. See Videos S1–S4.\n", - "1066 \n", - " Mammalian Tif1γ Protein Localizes to Nuclear Bodies Distinct from Heterochromatin(A) Deconvolved immunofluorescence images of a mouse embryonic fibroblast cell nucleus stained with an anti-Tif1γ antibody and stained with a monoclonal antibody directed against HP1α. This is also compared to DAPI staining. The merged images of the nucleus show that Tif1γ does not colocalize with the HP1α or DAPI staining of heterochromatin while HP1α and DAPI staining overlap.(B) G1ER mouse erythroleukemia cells express high levels of Tif1γ protein as detected by Western blot analysis. Expression of Tif1γ decreases during Gata1-dependent erythroid maturation induced by β-estradiol treatment to induce a Gata1–ER fusion protein.\n", - "1067 \n", - " TRF2 Inhibits the IR-Induced Cell Cycle Arrest(A) Retrovirally infected IMR90 cells were treated with 4 Gy IR (left and right) or treated with 4 Gy IR and exposed to caffeine (10 mM) directly after irradiation (middle). After 16 h, during which the cells were incubated in 1 μg/ml colcemide, the DNA was stained with DAPI and mitotic cells were identified by immunofluorescence with an antibody to phosphorylated histone H3.(B) Quantification of bypass of IR-induced cell cycle arrest. The mean percentage of phosphorylated histone H3-positive cells and SDs from three experiments are given. The low maximal incidence of phosphorylated H3-positive nuclei (approximately 18%) is due to loss of mitotic cells during processing; loss of mitotic cells occurred at the same level in control and experimental samples.\n", - "1068 \n", - " Effect of TRF2 on Downstream Readouts of the IR-Induced ATM Response(A) Retrovirally infected IMR90 cells were exposed to 5 Gy IR and harvested after 0, 12, 24, and 36 h. Levels of p53, Bax, p21, Hdm2, p16, pRB, and γ-tubulin (loading control) were detected by immunoblotting of equal cell number equivalents.(B) Amount of p53 protein at the indicated timepoints (hours) was determined by densitometry of p53 immunoblots such as shown in (A). Amounts were normalized to the vector control at 0 h. Mean values from three experiments and standard deviations are shown.(C) Retrovirally infected IMR90 cells were exposed to 20 Gy IR and harvested after 45 min. Nbs1 was immunoprecipitated and subsequently detected by immunoblotting using a general Nbs1 antibody and a phosphospecific Nbs1 S343 antibody. IPs were treated with λ-phosphatase where indicated.\n", - "1069 \n", - " Effect of TRF2 on IR-Induced ATM Phosphorylation(A) Overexpression of TRF2 inhibits IR-induced phosphorylation of transfected ATM in 293T cells. 293T cells co-transfected with ATM and either TRF2, TRF1, or vector were treated with the indicated doses of IR. After a 30-min recovery, cells were harvested and immunoblot analysis was performed on whole-cell lysates.(B) Overexpression of TRF2 inhibits IR-induced phosphorylation of endogenous ATM in primary fibroblasts. IMR90 primary fibroblasts infected with a retroviral construct expressing TRF2 or an empty virus were treated with the indicated doses of IR. After a 1 h recovery, cells were harvested and ATM was immunoprecipitated from whole-cell lysates. Immunoblot analysis was performed on immunoprecipitated ATM.\n", - "1070 \n", - " TRF2 Interacts with the ATM Kinase In Vivo and In Vitro and TRF2 Does Not Localize to IRIF(A) Co-IP of TRF2 with ATM. Protein extracts from IMR90 cells and A-T cells (AG02496) infected with an empty virus or a TRF2-overexpressing virus were incubated with anti-ATM or anti-Cyclin D1 antibodies as indicated, and TRF2 was detected in the IP pellets by immunoblotting. The right panel represents IPs with anti-ATM antibodies from IMR90 cells infected with a retrovirus overexpressing Nova1 or the empty vector and detection of Nova1 by immunoblotting. For each extract 1% of the IP input (input) was processed for immunoblotting in parallel.(B) Bacterially expressed ATM–GST fusion proteins were purified on glutathione agarose beads and visualized by Western blotting with anti-GST antibody (Upstate Biotechnology [Lake Placid, New York, United States] #06–332) (top). Unfused GST was run on a separate gel because of its low molecular weight. Equal amounts of fusion proteins and GST alone were incubated with purified baculoviral TRF2 (middle) or TRF1 (bottom), bound to glutathione beads, spun down, washed, and bound proteins were processed for immunoblotting with an anti-TRF1 or anti-TRF2 serum.(C) TRF2 does not localize to IRIFS. IMR90 primary fibroblasts infected with a retroviral construct expressing TRF2 or an empty virus were treated with 5 Gy IR. After a 90 min recovery, cells were fixed and processed for immunofluorescence with or without Triton X-100 extraction before fixation. Arrowheads denote foci of TRF2 signal previously demonstrated to represent telomeres. When overexpressed, some TRF2 is localized to nucleolus.\n", - "1073 \n", - " Skin Tumor Multiplicity, Size, and Progression in p19 Arf-Deficient Mice(A) Average number of papillomas (more than 2 mm in diameter) per mouse is plotted versus the number of weeks postinitiation. Both p19 Arf (Arf)+/− and p19 Arf−/− mice show greater numbers of tumors than p19 Arf+/+ mice.(B) Comparison of papilloma size (in mm) between p19 Arf+/+, p19 Arf+/−, and p19 Arf−/− mice through 28 wk postinitiation. An increase in the largest size class of tumors is seen in p19 Arf+/− and p19 Arf−/− mice but not p19 Arf+/+ mice.\n", - "(C) Percentage of mice bearing at least one carcinoma is plotted versus the number of weeks postinitiation. p19 Arf−/− mice show the shortest latency and greatest incidence of carcinoma conversion, with p19 Arf+/− mice showing an incidence between the p19 Arf−/− and p19 Arf+/+ mice. Time of appearance of lymph node metastasis is noted above the graph as a vertical line for each mouse analyzed. Metastasis to lymph node occurred frequently and sooner in p19 Arf-deficient mice than in wild-type mice.\n", - "1074 \n", - " Metastasis of Primary SCC to Lymph Nodes and Lungs in p19 Arf-Deficient Mice(A) Underside of skin from tumor-bearing mouse shows newly formed blood vessels surrounding tumor site (arrow) and leading to inguinal lymph node (arrowhead).(B) Enlarged inquinal lymph node (left) containing metastatic SCC and blood vessel formation (arrow) compared to normal lymph node (right).(C) H&E stain of carcinoma section with prominent blood vessel (bv). Carcinoma cells (ca) have penetrated blood vessel wall (arrow).(D) H&E stain of lymph node bearing infiltrating SCC cells (arrow) among normal lymphocytes (arrowhead).(E) H&E stain of lymph node bearing metastatic differentiated SCC.(F) Immunostain with pan-keratin antibody of papilloma.(G) Immunostain with pan-keratin antibody of lymph node with metastatic SCC.(H and I) H&E stain of normal lung (arrowhead) with large metastatic SCC deposit (arrow).(J) H&E stain of lung metastasis with secondary site of infiltration (arrow).(D–G, J): 20× magnification. Inserts in (E–G): 40× magnification.\n", - "1075 \n", - " Reduced p53 Expression in Skin Tumors from p19Arf-Deficient Mice(A) Western blot analysis of nuclear lysates from skin tumors from p19 Arf (Arf)+/+, p19 Arf+/−, and p19 Arf−/− mice using p53-specific antibody. PA, papilloma; skin IR, irradiated normal skin(B) p53 immunostain of paraffin-embedded skin tumor sections from p19 Arf+/+, p19 Arf+/−, and p19 Arf−/− mice (arrows indicate positive stained cells) (top). p53 immunostain of irradiated papillomas (IR) from p19 Arf+/+ and p19 Arf−/− mice (bottom). p53 is not detected in normal skin or tumors from p19 Arf−/− mice, but is induced by irradiation in both normal and tumor cells from p19 Arf−/− mice.\n", - "1076 \n", - " LOH of Wild-Type p19Arf Allele in p19Arf+/− Tumors(A) LOH analysis by semiquantitative PCR of the wild-type p19Arf allele in p19Arf+/− papillomas and carcinomas. Gradient made from kidney DNA used for quantitation of wt/mu ratio (top row). wt, wild-type allele; mu, knockout allele; asterisk, loss or reduction of p19Arf wild-type band.(B) Western blot analysis of nuclear lysates from papillomas (PA) and carcinomas (CA) from p19Arf+/+, p19Arf+/−, and p19Arf−/− mice.\n", - "1077 \n", - " Tumor Multiplicity and Proliferative Index in p19 Arf /p53 Compound Mutant Mice(A) Average number of papillomas (more than 2 mm in diameter) per mouse is plotted against the number of weeks post-initiation.(B) Image of wild-type, p19 Arf (Arf)−/−, p53−/−, and p19Arf−/−p53−/− mice with skin tumors at time of sacrifice. Wild-type mice show large exophytic tumors, while both p19 Arf- and p53-deficient mice have endophytic tumors. Note larger tumors in p19Arf /p53 compound mutant mice relative to p53 single mutants.(C) BrdU-positive cells in papillomas from wild-type, p53−/−, p19 Arf−/−, and p19 Arf−/−p53−/− mice at 10 wk postinitiation. (Bars represent average counts ± standard deviation from ten fields and five mice). p53−/− tumors show significantly fewer BrdU-positive cells than either p19 Arf−/− or wild-type tumors (p < 0.05, Wilcoxon one-sided t-test).\n", - "1078 \n", - " Tumor Progression and p53 LOH in p19Arf /p53 Compound Mutant Mice(A) Average number of carcinomas per mouse is plotted against the number of weeks postinitiation. Tumor progression was accelerated in all p19 Arf (Arf)- and p53-deficient genotypes compared to wild-type littermates. Carcinoma latency and multiplicity was almost identical for p19 Arf−/− mice regardless of p53 genotype (p53+/+, p53+/−, or p53−/−).(B) LOH of the wild-type p53 allele by semiquantitative PCR in p19 Arf /p53 compound tumors. Gradient made from kidney DNA used for quantitation of wt/mu ratio (top row). wt, wild-type allele; mu, knockout allele; asterisk, tumors with reduction of wild-type p53.\n", - "\n", - "1084 \n", - " Auto-Ab Profiles(A) ANA titres in the (129 × C57BL/6)F2.Apcs\n", - "−/− mice and (129 × C57BL/6)F2 at 1 y of age. A small circle represents one mouse; a large circle, a variable number of animals, as indicated in parentheses. Serum samples were titrated to endpoint.(B) ANA titres in the (129 × C57BL/6)F2.Apcs\n", - "−/− mice and a selected number of wild-type (129 × C57BL/6)F2 animals carrying the Chromosome 1 region between D1Mit105 and D1Mit223 (80–106 cM) of 129 origin. The symbols are as in (A).(C and D) Anti-chromatin Ab levels expressed in AEUs related to a standard positive sample, which was assigned a value of 100 AEU. The comparison is between the same groups of mice as in (A) and (B), respectively. The symbols are as in (A).\n", - "1086 \n", - " Auto-Ab Profiles(A) ANA titres in C57BL/6 mice, C57BL/6.Apcs\n", - "−/− mice, and C57BL/6.129(D1Mit105–223) congenic mice at 1 y of age. Small symbols represent one mouse; large symbols, a variable number of animals as indicated in parentheses. Serum sample were titrated to endpoint.(B and C) Anti-ssDNA (B) and anti-chromatin (C) Ab levels in the same cohorts of mice as in (A). The Ab levels are expressed in AEUs related to a standard positive sample, which was assigned a value of 100 AEU.(D) Anti-dsDNA Ab levels. Serum samples were screened at 1:20. Samples that were positive were titrated to endpoint. The symbols are as in (A).\n", - "1089 \n", - " Computational Selection of Candidate Regulatory Motifs(A) Candidate regulatory motifs are overrepresented in UPR target promoters. Sequence motifs were ranked in order of overrepresentation, i.e., on the number of observed appearances in target promoters relative to the expectation from the total appearances in all promoters. −log10\n", - "P, a metric of overrepresentation, is plotted against rank (circles). Eight motifs were chosen for experimental characterization (open circles).(B) Best words grouped into eight candidate motifs. The eight most overrepresented motifs from Fig. 1A, aligned to illustrate common core sequences. The example of each motif chosen for experimental characterization is underlined.\n", - "1090 \n", - " Identification of Two Novel Sequence Motifs Necessary and Sufficient for UPR Activation(A) Motif 1 and Motif 8 are sufficient to confer UPR-responsive transcription on an artificial promoter. Single representative sequences of the KAR2-derived UPRE and candidate regulatory motifs Motif 1 and Motif 8 were cloned into a crippled promoter driving lacZ, transformed into yeast (WT, Δire1, and Δhac1), and β-galactosidase activity monitored in response to Tm treatment.(B) UPRE-2 (Motif 1) is necessary for UPR-dependent activation of the ERO1 promoter. lacZ was placed under the control of the WT ERO1 promoter (+ UPRE-2) or a mutant (− UPRE-2), and β-galactosidase activity monitored in response to DTT treatment.(C) UPRE-3 (Motif 8) is necessary for UPR-dependent activation of the DHH1 promoter. As in (B), except using the DHH1 promoter, in which UPRE-3 appears once.(D) Novel motifs explain a greater fraction of UPR target gene activation. Sets of genes whose promoters contain UPR-responsive UASs UPRE-1, UPRE-2, UPRE-3, or a combination, are here depicted in Venn diagram format as subsets of the 381-gene UPR target set.\n", - "1091 \n", - " \n", - "GCN4 Encodes a Novel Transcription Factor in the UPR(A) Overexpression of GCN4 is sufficient for activation of UPRE-2, but not UPRE-1 or UPRE-3. UPRE-driven transcriptional activity as a function of Gcn4p levels, elevated either as a result of overexpression (+ GCN4–2μ) or amino acid starvation (+ 3-AT), in the presence or absence of ER stress (Tm).(B) GCN4 and GCN2 are necessary for ER stress-dependent activation of UPRE-1 and UPRE-2. UPRE-driven transcriptional activity as a function of GCN4 pathway genes (WT, Δgcn4, and Δgcn2) in the presence or absence of ER stress (Tm).(C) GCN4 and GCN2 are required for UPR-dependent transcriptional activation of a subset of target genes. Fold changes in mRNA levels were determined by microarray for DTT-treated vs. -untreated WT, Δire1, Δgcn4, and Δgcn2 strains (columns). Histograms show distribution of log2-fold changes for non-UPR target genes (light bars) and for UPR target genes (dark bars), which contain UPRE-1, UPRE-2, UPRE-3, or still unidentified UPREs (rows) in their promoters.(D) Target gene regulation differs significantly in WT and Δgcn4/Δgcn2 mutants. Means (μ) and standard deviations (σ) for log2-fold change in gene expression for non-UPR target genes, and for genes that fall inside the UPR target gene set and contain UPRE-1, UPRE-2, or UPRE-3 in their promoters. Z statistic (z) and P value (P): higher z reflects a greater difference between the distribution for UPRE-containing target genes and nontarget genes; lower P indicates a more highly significant difference. For detailed calculations, see Materials and Methods.\n", - "1092 \n", - " Gcn4p Protein Levels Are Upregulated during the UPR(A) Gcn4p levels, but not eIF-2α phosphorylation, rise under ER stress in a UPR-dependent manner. Cells bearing a C-terminally myc-tagged allele of GCN4 were treated with Tm for 0, 15, 30, 60, or 120 min. Western blots probed with anti-myc recognizing Gcn4p-myc (top panels) or phospho-specific anti-eIF-2α antibody (bottom panel). Gcn4p blot for the Δgcn2 mutant is 5x overexposed so that the bands are visible.(B) Quantitation of the Gcn4p-myc protein levels in Figure 4A. Data reflect an average of four experiments, normalized against Gcn4p levels in the WT t = 0 samples.\n", - "1094 \n", - " Hac1p and Gcn4p Directly Interact with UPRE-1 and UPRE-2\n", - "32P-labeled oligos bearing either UPRE-1 or UPRE-2 promoter were incubated with crude cell extracts, and subjected to nondenaturing polyacrylamide gel electrophoresis.(A) Extract: Samples were of the WT, or bore deletions in IRE1Δire1), GCN4 (Δgcn4), or GCN2 (Δgcn2), and were treated with Tm (+) or mock treated (−). Labeled oligos contained either UPRE-1 (1) or UPRE-2 (2). Binding reactions were incubated with no unlabeled competitor (−) or with 100x excess of unlabeled WT UPRE-1 (1), an inactive mutant version of UPRE-1 (1*), UPRE-2 (2), or an inactive mutant version of UPRE-2 (2*).(B) Extract: Samples from a strain overexpressing GCN4 (2μ-GCN4; lanes 1 and 2) or from a strain expressing myc-tagged Gcn4p and HA-tagged Hac1p (GCN4-myc and HA-HAC1). Binding reactions were incubated with no antibody (−), anti-myc recognizing Gcn4p-myc (myc), anti-HA recognizing HA-Hac1p (HA), or both antibodies simultaneously (myc/HA). Bands represent the following: a, Gcn4p + Hac1p + anti-myc + anti-HA; b, Gcn4p + Hac1p + anti-HA; c, Gcn4p + Hac1p + anti-myc; d, Gcn4p + Hac1p; e, Gcn4p. *, an unidentified band that appears only when extracts include both Gcn4-myc and HA-Hac1p and when both antibodies are included in the binding reaction.\n", - "1095 \n", - " Multiple Alignment of UPRE-1 and UPRE-2 from Three Budding YeastsAlignment of partial promoter sequences from S. cerevisiae and homologous sequences in related yeasts. Numerical coordinates reflect the distance from the first nucleotide of the initiation codon in the S. cerevisiae promoter.(A) A segment of the KAR2/YJL034W promoter and homologs. The core sequence of UPRE-1 is indicated.(B) A segment of the ERO1/YML130C promoter and homologs. The core sequence of UPRE-2 is indicated (above). The consensus binding site of Gcn4p is aligned (below).\n", - "1096 \n", - " Model of Gcn4p/Hac1p Action in the UPR(A) The expanded circuitry of the UPR. The classical UPR (red), the S-UPR (blue), and regulated Gcn4p levels (green) are integrated at target promoters. Transcriptional regulation of HAC1 mRNA levels, providing one level of gain control, is depicted as a rheostat under supervision of a logical AND gate informed by multiple inputs from the ER. Splicing of HAC1 mRNA by Ire1p, providing a binary on/off control, is depicted by a switch. Regulation of Gcn4p levels by Gcn2p under changing cellular conditions adds an additional layer of gain control. Together, activity levels of Hac1p, Gcn4p, and the proposed UPR modulatory factor (Leber et al. 2004) collaborate to determine the magnitude of the transcriptional output signal.(B) Mechanism of Gcn4p/Hac1p action at target promoters. In the absence of Hac1p, Gcn4p is present in the cell as a consequence of baseline activity of Gcn2p. At normal concentrations, Gcn4p is unable to bind or activate a target UPRE, but it may bind when Gcn4p levels are elevated. Upon induction of the UPR, Ire1p is activated and Hac1 is synthesized. Hac1p can bind, but not activate, target UPREs. Binding of target DNA by a Gcn4p/Hac1p heterodimer results in a transcriptionally active complex. Gcn4p levels are upregulated under UPR induction, perhaps as a consequence of stabilization by interaction with Hac1p.\n", - "1106 \n", - " Innate Immune Responses of Drosophila\n", - "(A) Posterior region of a third instar larva showing the cuticle and the trachea. These structures provide a physical barrier against infections. Cellular immune reactions consist of phagocytosis, encapsulation, and melanization.(B) A dead and melanized crystal cell phagocytosed by a plasmatocyte.(C) Encapsulation of an egg of a Drosophila parasite. The parasite is a wasp that normally infects larvae. Cells surrounding the egg are lamellocytes. The cells and the egg are stained with a fluorescent nuclear stain.(D) Clot formation occurs during wound healing.(E) Crystal cells in contact with the larval cuticle. The contents of the crystal cells are melanized. Melanization occurs in response to intruding pathogens or parasites and is also observed during wound healing.(F) Humoral immune reaction. The expression of antimicrobial peptides in the larval fat body is induced by microbes. Cells of the fat body appear green due to the presence of a transgene encoding the green fluorescent protein, under the control of the drosomycin promoter. The drosomycin promoter is activated in response to fungal infections and is under the control of the Toll pathway (see Figure 2). Antimicrobial peptides are released from the fat body into the hemolymph. This response is therefore systemic. A similar antimicrobial gene activation response can occur locally in specific body parts such as the trachea or the gut (not shown).\n", - "1112 \n", - " Affinity Purification of Emerin-Associated Proteins(A) Immunoblot of HeLa nuclear lysate proteins (L), or proteins affinity-purified using either BSA beads or emerin beads (see Materials and Methods), probed with antibody against actin.(B) HeLa nuclear lysate proteins (L) were immunoprecipitated using either immune (Im) or preimmune (PI) serum 2999 against emerin, resolved by SDS-PAGE, and Western blotted using antibodies specific for actin (upper panel) or emerin (lower panel), in succession.(C) Cosedimentation assays using F-actin and purified, recombinant wild-type emerin (residues 1–222). G-actin (2 μM) was polymerized and then incubated in the absence or presence of 2 μM emerin. Emerin was incubated alone in polymerization buffer as a negative control. After 30 min samples were centrifuged 1 h at 100,000g, resolved by SDS-PAGE, and stained with Coomassie blue. L, load (100%); S, supernatant (100%); P, pellet (100%).(D) F-actin column was used to determine the affinity of F-actin for emerin. The Kd was 480 nM for the experiment shown; range was 300–500 nM, n = 8.(E) Binding of wild-type (WT) or mutant emerin protein to F-actin beads. Recombinant emerin proteins were incubated with F-actin beads, and bound emerins were eluted with SDS-PAGE sample buffer, resolved by SDS-PAGE, blotted, and probed with antibodies against emerin (“bound”; all emerin mutants are recognized by this antibody; Lee et al. 2001; Holaska et al. 2003). The input amounts (10%) of each emerin mutant (“load”) were visualized either by immunoblotting (top row, top panel) or Coomassie staining (top row, bottom panel).(F) Domains in emerin required for binding to BAF, lamin A, transcription repressor GCL, or actin (Lee et al. 2001; Holaska et al. 2003; present study). Asterisks indicate EDMD disease-causing mutations.\n", - "1113 \n", - " Emerin Stimulates Actin Polymerization(A) Graph of a representative experiment (n = 32) showing that emerin increases the rate of actin polymerization 4-fold. R, rate of polymerization in the presence of emerin; cR, control rate of polymerization (actin alone). These data also yielded an equilibrium binding affinity of emerin for actin of 420 nM.(B) Representative graph (n = 17) in which each recombinant emerin mutant protein (1.0 μM) was added to 2.0 μM G-actin, and polymerization rates were calculated. R, rate of polymerization in the presence of emerin; cR, control rate of polymerization (actin alone). Stars indicate EDMD disease-causing mutations.(C) Critical concentration assays were performed in the presence or absence of 625 nM emerin. Actin was polymerized in the absence (barbed-end growth) or presence of 5 nM gelsolin–actin seeds (pointed-end growth) for 16 h at room temperature. Barbed-end growth with (□) or without (▪) emerin. Pointed-end growth with (○) or without (•) emerin. Actin monomers (Δ).\n", - "1114 \n", - " Emerin Binds the Pointed End of Actin Filaments(A) Gelsolin–actin seeds were incubated with increasing concentrations of wild-type emerin residues 1–222. Emerin significantly reduced the rate of subunit addition at the pointed end, with an apparent Kd of 430 nM (range, 300–500 nM, n = 12). R, rate of polymerization in the presence of emerin; cR, control rate of polymerization (actin alone).(B) Emerin inhibits depolymerization of actin filaments (2 μM) preformed from gelsolin–actin seeds, with an apparent Kd of 380 nM (range, 350–450 nM, n = 6). R, rate of depolymerization in the presence of emerin; cR, control rate of depolymerization (actin alone).(C) Rhodamine–phalloidin-stabilized actin filaments were formed from 2 μM actin, then capped at the barbed end by the addition of 100 nM capping protein, and finally diluted 2-fold in the presence of buffer or 1 μM emerin, GST, or tropomodulin (Tmod). Samples were then incubated with actin (3.2 μM) and Alexa-488 phalloidin (3.2 μM) for 2 min, diluted 1:500, placed on polylysine-coated coverslips, and viewed by fluorescence microscopy. Bar is 1 μm and applies to all panels.(D) Actin (2 μM) was incubated with gelsolin–actin seeds (500 nM) in the presence of rhodamine–phalloidin (2 μM). These red filaments were diluted 10-fold and incubated with buffer alone or with 1 μM emerin or tropomodulin (Tmod) for 10 min, followed by incubation with actin (2 μM) and Alexa-488-labeled (green) phalloidin (2 μM) for 2 min. Samples were diluted 1:500, placed on polylysine-coated coverslips, and viewed by fluorescence microscopy. Bar is 1 μm and applies to all panels.(E–H) Alexa-488-labeled emerin (green) was incubated 30 min with actin filaments stabilized by Alexa-546 phalloidin (red) and centrifuged at 100,000g to recover filaments, which were diluted 1:500 for viewing.\n", - "1116 \n", - " BR and Auxin Pathways Are Interdependent, as Measured by Hypocotyl Elongation(A) Mild temperature elevation causes elongation of the hypocotyl and BR hypersensitivity in WT plants. Columbia ecotype is shown but results are similar for Wassilewskija. Hypocotyls of 3-d-old plants grown at either 26 °C (diamonds, dashed line) or 22 °C (circles, solid line) were measured.(B) det2-1 plants are defective in BR biosynthesis and are also insensitive to the temperature increase. As the det2 deficiency is rescued by exogenous BL, temperature sensitivity is restored.(C) Plants with the weak bri1-5 mutation are insensitive both to temperature and exogenous BR.(D–H) BR response depends upon auxin response. WT is shown in circles with a solid thin line and mutants are shown in squares with a thick dashed line. Known auxin response mutants axr2-1 (D), axr1-12 (E), tir1-1 (F), and axr3-1 (G) have decreased BR response. (F) tir1 has no hypocotyl elongation phenotype in the absence of exogenous hormone treatment and only very modest effects on BR sensitivity. Response is significantly reduced in tir1 mutants at 100 nM BL, as measured by Student's t-test (p = 0.03, using Bonferroni adjustment for multiple tests; Hochberg 1988).(H) yucca plants, which overproduce auxin, also show reduced BR response.Error bars represent standard error. Data in (F) and (G) were collected in a separate experiment from other panels, resulting in small differences in the values for WT hypocotyl length.\n", - "1117 \n", - " Enhanced Hypocotyl Elongation of yucca Mutants Requires Functional BRI1(A) Average hypocotyl lengths of 3-d-old plants. Error bars represent standard error.(B) Ten-day-old WT, yucca, yucca bri1-116, and bri-116 seedlings.\n", - "1118 \n", - " BR and Auxin Have Shared Genomic Effects(A) Venn diagram showing relative proportion of BR- and auxin-responsive genes and the degree of overlap.(B) Functional categories of BR–auxin shared genes reveal a potential growth signature.(C and D) Effects of auxin on BR-regulated gene expression. Transcripts which show elevated levels are shown in orange, those with decreased levels are shown in blue, and those transcripts whose levels are not changed are shown in yellow. (C) Relative ratios were derived from the following comparisons (from left to right): BR versus mock treatment (WT plants; B), auxin versus mock treatment (WT plants; A), and yucca versus WT (Y). The three columns to the left are BR-upregulated genes and the three columns to the right are BR-downregulated genes. Among the BR-upregulated genes, there are a large number that are also induced by auxin treatment or in a yucca background. Few BR-repressed genes are repressed by auxin. nc, no change. (D) Effect of BR treatment in yucca background. Relative ratios represent BR versus mock treatment in WT plants (WT) or in yucca mutants (YB). Approximately two-thirds of BR-regulated genes were not affected by BR treatment of yucca plants.(E) Quantitative PCR shows that shared target genes are synergistically induced when treated with both auxin and BRs. At5g64770 encodes a protein with unknown function. At1g18400 encodes BEE1, a bHLH-containing protein known to be required for the BR response (Friedrichsen et al. 2002). At1g10550 and At4g30290 are putative endoxyloglucan transferases. Asterisks indicate response under an additive model.\n", - "1119 \n", - " Endogenous BR Levels Affect Expression of an Auxin-Responsive Reporter but Do Not Induce Aux/IAA Protein Turnover(A) WT, (B) det2, and (C) DW4FOX plants carrying the DR5::GUS transgene.(A) GUS staining is particularly strong in young leaves (yellow arrow).(B) det2 plants show no GUS staining in aerial tissues.(C) DWF4OX plants show increased intensity of staining, particularly at the tips of emerging leaves (yellow arrow) and in the hypocotyl (orange arrows). Inset shows hypocotyl-root junction.(D) Aux/IAA stability does not appear to be affected by treatment with BRs. Plants carrying a heat shock–inducible fusion of the N-terminal portion of AXR3 and GUS reporter were subjected to 2 h at 37 °C and then treated with mock or hormone treatments for the time periods listed.\n", - "1121 \n", - " Variability in the Responses of a Simple Cell(A) Firing rate in response to a cycle of an optimal drifting grating. Three trials are shown.(B) Firing rate averaged over seven trials. Shaded area indicates 2 s.d.(C) Same, for three other stimuli: a grating drifting in the orthogonal direction (top), a grating drifting in the opposite direction (middle), and a blank stimulus (bottom).(D) Membrane potential trace measured for the first cycle. Dashed line is resting potential Vrest. Dotted line is firing threshold Vthresh (from [H]).(E–G) As in (A–C), for coarse potential.(H) Relation between firing rate and coarse potential. Curve is fit of rectification equation.(I–K) As in (A–C), for predictions of rectification model.\n", - "1122 \n", - " Relation between Response Variance and Mean for Three Cells(A) Variance versus mean for firing rate of the simple cell in Figure 1 measured with 13 stimuli (the four in Figure 1 plus nine additional orientations). Line is linear regression. Diagonal line is prediction for a Poisson process.(B) Variance versus mean for coarse potential. Error bars are 2 s.d. Curve is linear fit to standard deviation versus mean. Dashed line is resting potential Vrest. Dotted line is firing threshold Vthresh.\n", - "(C) Variance versus mean for firing rate predicted by the rectification model. Details as in (A).(D–F) As in (A–C) for a complex cell.(G–I) As in (A–C) for a third neuron, whose behavior is intermediate between those of simple cells and complex cells.\n", - "1123 \n", - " Performance of the Rectification and Gaussian–Rectification Models in Predicting Firing-Rate VariabilityDistributions of firing-rate variance versus firing-rate mean were fitted with a line in logarithmic scale, corresponding to the equation variance = a meanb, where a is the intercept of the line and b is the slope of the line. Fitting was performed on the measured distributions (e.g., Figure 2A), on the distributions predicted by the rectification model (e.g., Figure 2C), and on those predicted by the Gaussian–rectification model (e.g., Figure 6B). Dashed lines indicate predictions for a Poisson process.(A) Comparison of measured intercept versus predicted intercept. Diagonal line indicates equality between measured and predicted values.(B) Same, for the slope.(C and D) Same as in (A) and (B), for the predictions of the Gaussian–rectification model.\n", - "1124 \n", - " The Gaussian–Rectification Model(A and B) Distributions across trials of model potential V (B) and of model firing rate R (A) for five values of the mean potential Vmean. Firing rate is obtained from potential by applying the rectification model (Figure 1H). The value for R = 0 is shown at 1/3 of veridical height.(C and D) Mean (data points) and standard deviation (error bars) for the distributions in (A) and (B) as a function of mean potential Vmean. Curve and shaded area indicate model predictions for the full range of mean potentials. Arrows indicate the five mean potentials (± 2 mV) used in (A) and (B). Throughout, dashed lines indicate resting potential Vrest and dotted lines indicate firing threshold Vthresh.\n", - "\n", - "1125 \n", - " Application of the Gaussian–Rectification Model to the Data from the Example Simple Cell(A and B) Distributions across trials of potential V (B) and of firing rate R (A) for five values of the mean potential Vmean. Curves are best-fitting Gaussians (B) and predicted distributions of firing rate (A). Bin for R = 0 is shown at 1/3 of veridical height (and is three times wider than the others so that area is veridical).(C and D) Mean (data points) and standard deviation (error bars) for the distributions in (A) and (B), as a function of mean potential Vmean. Curve and shaded area indicate model predictions for the full range of mean potentials. Arrows indicate the five mean potentials (± 2 mV) used in (A) and (B). Even a reduced model with constant standard deviation of potential (D, shaded area) predicts a growing standard deviation (A, shaded area).\n", - "1126 \n", - " Variability of Potential and Predictions of the Gaussian–Rectification Model for Three Cells(A) Distribution of normalized deviations from the mean (z-scores) for the potential of the simple cell in Figure 1 and Figure 2A–2C. These were computed by subtracting from each potential the corresponding mean potential Vmean (the abscissa in Figure 2B) and dividing by the standard deviation (the square root of the ordinate in Figure 2B). The results were cumulated. The curve is a normal Gaussian.(B) Variance versus mean for firing rate for the same cell and its prediction by the Gaussian–rectification model. Data points are same as Figure 2A. Red curve: prediction of Gaussian–rectification model Shaded area: region where the Gaussian–rectification model predicts the occurrence of 75% of the points. Line is linear regression.(C and D) Same as (A) and (B) for the complex cell in Figure 2D–2F.(E and F) Same, for the intermediate cell in Figure 2G–2I.\n", - "1127 \n", - " Responses of a Regular-Spiking Neuron in the Visual Cortex to Current Injection, and Predictions by an Enhanced Integrate-and-Fire Model Neuron(A) Injected currents were sinusoids or noise waveforms. Noise was obtained by summing eight sinusoids with incommensurate frequencies.(B) Membrane potential responses of a regular-spiking neuron (cell 19s2, experiment 4) recorded with sharp electrodes in a study of guinea pig visual cortex in vitro (Carandini et al. 1996).(C) Predictions of an enhanced integrate-and-fire neuron model fine-tuned to resemble the responses of the cell.\n", - "1128 \n", - " Variability in the Responses of the Spiking Model Neuron(A) Response of the model neuron to a 0.6-nA sinusoidal current in the presence of Gaussian noise (s.d. 0.25 nA).(B) Corresponding firing rate. Three trials are shown.(C) Firing rate averaged over 16 trials. Shaded area indicates 2 s.d.(D) Same, for three other stimuli: a 0.4-nA sinusoid (top), a 0.2-nA sinusoid (middle), and noise alone (bottom).(E) Variance versus mean for firing rate. Diagonal line is prediction for a Poisson process. Red curve: prediction of Gaussian–rectification model, with no parameters allowed to vary to fit the data. Shaded area: region where the Gaussian–rectification model predicts the occurrence of 75% of the points.(F) Relation between firing rate and injected current. Curve is fit of rectification equation.(G–I) As in (B–D), for injected current.(J) Variance versus mean for injected current.\n", - "1132 \n", - " A Structural Profile of the AR Coactivator Binding InterfaceAR–peptide complexes are colored as follows: FxxLF, yellow; FxxLW, orange; WxxLF, wheat; WxxVW, purple; FxxYF, green; FxxFF, blue; LxxLL, pink; unbound, grey.(A) Cα trace of the peptides superimposed onto the AF-2. For clarity only the LBD of AR–FxxLF is shown.(B) Superposition of the LBD of the AR–peptide complexes in the region of the coactivator interface. Backbone atoms are shown as a Cα trace. Side chains of residues composing the interface are shown as sticks.(C) Hydrophobic side chains of the core motif superimposed as in (B).\n", - "1133 \n", - " Interactions of FxxLF and LxxLL with the AR LBD(A and B) FxxLF (A) and LxxLL (B) bound to the AR AF-2 interface. FxxLF and LxxLL are shown as yellow and pink Cα coils, respectively. Helices 3, 4, and 5 of the LBD are shown as blue ribbons; Helix 12 is shown in green. LBD residues interacting with peptides are depicted as white sticks. For clarity only peptide side chains making significant interactions with the LBD are shown.(C and D) Hydrogen-bonding interactions between backbone atoms of FxxLF (C) and LxxLL (D) with Glu897 of the LBD. Peptide alpha carbons are labeled.\n", - "1134 \n", - " Induced Fit of the AR AF-2 InterfaceSurface representations of the AR AF-2 interface. The unbound structure is shown in (A), the FxxLF bound in (B), and the LxxLL bound in (C). Side chains of the hydrophobic residues of the core motifs of FxxLF and LxxLL are shown as spheres.\n", - "1135 \n", - " Interactions of the Tryptophan Motifs with the AR LBDFxxLW (A), WxxLF (B), and WxxVW (C) bound to the AR AF-2 interface. FxxLW, WxxLF, and WxxVW are shown as orange, beige, and purple Cα coils, respectively. The LBD is depicted as in Figure 3.\n", - "1136 \n", - " Interactions of Ser−2 with Glu897Interactions between Ser−2 of the peptides (A) FxxLW, (B) WxxLF, (C) WxxVW, and (D) FxxFF and Glu897 of the LBD. Peptide alpha carbons are labeled.\n", - "1137 \n", - " Interactions of FxxYF and FxxFF with the AR LBDFxxYF (A) and FxxFF (B) bound to the AR AF-2 interface. FxxYF and FxxFF are shown as yellow and orange Cα coils, respectively. The LBD is depicted as in Figure 3.\n", - "1139 \n", - " Surface Complimentarity of Hydrophobic Motifs in the AR, ERα, and GR AF-2 Clefts(A) AR–FxxLF, (B)AR–LxxLL, (C) ERα–GRIP1 (LxxLL) (Shiau et al. 1998), and (D) GR-TIF2 (LxxLL) (Bledsoe et al. 2002). The inside surfaces of the AF-2 cleft in AR, ERα, and GR are depicted. The LBD is additionally shown as a Cα trace with key side chains shown as white sticks. Phenylalanines and leucines of the FxxLF and LxxLL motifs are shown as spheres.\n", - "1140 \n", - " Expression of Endogenous PPARδ and VP16-PPARδ Transgene in Muscle(A) Pooled RNA isolated from various muscles of five wild-type male C57B6 mice was hybridized with indicated probes. EDL, extensor digitorum longus; Gastro, gastrocnemius.(B) Pooled nuclear proteins (15 μg/lane) isolated from muscles of five wild-type male C57B6 were probed with anti-PPARδ antibody. RNA polymerase II (Pol II) is shown as a loading control.(C) Expression of the VP16-PPARδ transgene in various tissues. 10 μg of total RNA from each tissue was hybridized with a VP16 cDNA probe. Gastrocnemius muscle was used here.(D) Nuclear proteins (15 μg/lane) isolated from gastrocnemius muscle of the transgenic mice (TG) and the wild-type littermates (WT) were probed with indicated antibodies. The upper, nonspecific band that cross-reacted with the anti-PPARδ antibody serves a loading control.\n", - "1142 \n", - " Activation of PPARδ Induces Genes Typical for Type I Fibers and Promotes Mitochondrial Biogenesis(A) Total RNA (10 μg/lane) prepared from gastrocnemius muscle of transgenic (TG) and wild-type (WT) littermates was probed with indicated probes. The fold increase of induction of each gene is shown.(B) Total genomic DNA (10 μg/lane) prepared from gastrocnemius muscle was digested with Nco1 and subjected to Southern analysis with COXII (mitochondrial genome–encoded) and MCIP1 (nuclear genome–encoded) DNA probes.(C) Equal amounts of gastrocnemius muscle were collected from both transgenic mice and control littermates. Total mitochondrial DNA was isolated and separated on 1% agarose gel. The relative abundance of mitochondrial DNA in transgenic and wild-type mice is presented.(D) Western blot analysis of muscle fiber markers and mitochondrial components. Each lane was loaded with 80 μg of total gastrocnemius muscle extracts.(E) Wild-type C57B6 mice were treated with vehicle or PPARδ agonist GW501516 for 10 d. Total RNA (10 μg/lane) prepared from the gastrocnemius muscle was probed with indicated probes.\n", - "1143 \n", - " Resistance to High-Fat-Induced Obesity in the Transgenic Mice(A) Seven-week-old transgenic (TG) and wild-type (WT) littermates (n = 5–6 for each group) were fed with a high-fat diet for 97 d. Left panel shows net body weight gain, which was calculated for individual mice and then averaged. Right panel shows the body weights before (Day 0) and after (Day 97) high-fat feeding.(B) Histology of inguinal fat pad in the transgenic and wild-type littermates under a high-fat diet for 2 mo.(C and D) Intramuscular glycogen content (C) and triglyceride content (D) of mice in (A) after high-fat feeding (n = 6).(E) Glucose tolerance test. Mice in (A) after high-fat feeding were fasted for 6 h and then injected with glucose at a concentration of 1g/kg body weight. Then blood glucose levels were measured periodically over 2 h (n = 6).\n", - "1144 \n", - " PPARδ Agonists Counteract Obesity Induced by High-Fat Diet(A) Eleven-week-old wild-type C57B6 mice were fed a high-fat diet in combination with vehicle or GW501516 for 57 d. Total RNA (10 μg/lane) prepared from the gastrocnemius muscle was probed with indicated probes.(B) Net body weight gain for mice in (A) after treatment was calculated for individual mice and averaged. Initial body weights were 28.54 ± 1.04 g for vehicle group (n = 5) and 28.86 ± 0.80 g for GW501516 group (n = 5).(C) Various tissue weights for mice in (A) after treatment. ifat, inguinal fat; rdfat, reproductive fat; retrofat, retroperitoneal fat.(D) Glucose tolerance test. Mice in (A) after treatment were fasted for 6 h and then injected with glucose at a concentration of 1g/kg body weight. Blood glucose levels were then measured periodically over 2 h.\n", - "1145 \n", - " PPARδ Regulates Exercise Endurance(A) Enhanced exercise performance in the transgenic mice. Fourteen-week-old male transgenic and wild-type littermates with similar body weights (n = 4 for each group) were subjected to a forced treadmill exercise test.(B) Compromised exercise performance in PPARδ-null mice. Two-month-old male PPARδ-null mice and wild-type controls with similar body weights (n = 6 for each group) were subjected to a forced treadmill exercise test.(C) Functions of PPARδ in skeletal muscle.\n", - "1152 \n", - " Adult myosin heavy chain (MHC) isoform proportions of the soleus (A), medial gastrocnemius (B), diaphragm (C), and plantaris (D) muscles of wild-type (dark bars) and MCK-CN* transgenic (gray bars) mice as determined by SDS-PAGE of whole muscle extracts. The * denotes significantly different from wild-type at p ≤ 0.05. Note the elevated proportions of slower MHC isoforms in the transgenic mice compared to wild-type.\n", - "1172 \n", - " Role of STATs in cell stress responses. (A) Autocrine IFN may activate JAK/STAT through the canonical pathway. This activation would involve tyrosine phosphorylation of STAT by JAK resulting in STAT dimers which are 20% transcriptionally active. This process is thought to \"prime\" STATs for serine phosphorylation by an IFN-inducible serine kinase (possibly PKC) [42]. Both tyrosine and serine phosphorylation results in a 100% transcriptionally active STAT1 dimer. (B) Hypoxia-reperfusion injury may directly activate p38 MAPK which phosphorylates STAT1 on SER727. Serine phosphorylated STAT could then participate in protein-protein interactions with other STAT binding proteins and activate the expression of pro-apoptotic genes like FAS. (C) In this case, hypoxia-reperfusion may activate STAT5 resulting in activation of cell survival pathways. STAT5 activation by hypoxia may be mediated by JAK2 and a STAT5/cSrc/PI-3 kinase/Akt pathway. (D) STAT3 may act as a constitutive FAS repressor, but FAS is de-repressed during UV stress which may involve STAT3 inhibition by PI3-kinase/Akt.\n", - "1174 \n", - " In patients no. 7 (A) and 8 (B), the same number of 99mTc-HMPAO-labelled DC were administered simultaneously: subcutaneously (sc) in the left axilla and intradermally in the right axilla (id). The acquisition times with gamma camera are reported along the X-axis and the Y-axis shows the counts per 10 min. In both patients intradermal administration presents a greater concentration of labelled cells in lymph nodes than the subcutaneous route.\n", - "1176 \n", - " This figure shows the migration activity of mDC (patient no. 5) and iDC (patient no. 2) labelled with 99mTc-HMPAO (A) and of mDC and iDC (patient no. 3) labelled with 111In-Oxine (B). The acquisition times with gamma camera are reported along the X-axis and the Y-axis shows the counts per 10 min. mDC migrating to regional lymph node are always higher than iDC. 99mTc-HMPAO-labelled DC were detected in lymph nodes within 1 h of administration and the maximum concentration was reached within 60 min for iDC and between 18 and 20 h after inoculation for mDC.\n", - "1189 \n", - " RCA-I lectin histochemistry on barbel of catfish, I. punctatus (albino). Barbels were fixed in 4% PFA, PBS, cryostat sectioned at 10 microns and histochemically probed with conjugated RCA-I at 1/200 dilution of the manufacturer's stock. (A). Surface labelling by RCA-I shows preferential recognition of binding sites primarily at the apical endings of taste buds. (B). Labelling by RCA-I of the apical region of two taste buds. (C). Labelling by RCA-I of horizontal section through the barbel showing reactive taste buds lining the epithelium.\n", - "1190 \n", - " SDS-PAGE (4–20%) of solubilized barbel protein, visualized with silver stain, before (A) and after (B, C, D) each enrichment step. Each lane was loaded with 5 μg of protein. Lane A: Total protein of fraction Sp. Lane B: Galactose eluted protein from the RCA column containing L-Arg stimulated ion channel activity; Lane C: Protein of the first peak fractions of the Sephacryl gel filtration step containing L-Arg stimulated ion channel activity; and Lane D: Protein containing L-Arg stimulated ion channel activity from the ion exchange chromatography enrichment step.\n", - "1191 \n", - " Western blots of SDS-PAGE protein samples before (A) and after (B, C, and D) each enrichment step. Western blots were performed using GP1. Although the identity of the samples applied to each lane was the same as illustrated in Figure 3, the amount of protein applied to each lane differed. (A). Fraction Sp, 5 μg, (B). Galactose eluted protein from the RCA column containing L-Arg stimulated ion channel activity, 1.6 μg, (C). Protein from the first peak fractions of the gel filtration step containing L-Arg stimulated ion channel activity, 0.2 μg, (D). Protein fraction containing L-Arg stimulated ion channel activity from the pH 9 fraction of the ion exchange procedure, 0.2 μg. Note that in spite of lowering protein amounts in lanes A – D, the intensity of the Western blot increases, indicative of an enrichment of the antigen protein(s) near 82–84 kDa.\n", - "1192 \n", - " Immunohistochemistry of catfish barbel taste buds using antibodies GP1 and GP2. Barbels were fixed in 4% PFA, PBS, and cryostat sectioned at 10 microns. Sections were probed using indicated dilutions of antibodies GP1 and GP2. (A). Section through a barbel immuno-stained with GP1 at 1/8000 dilution. The lines from \"TB\" point to labelled taste buds. (B). The apical aspects of three taste buds immuno-stained with 1/12000 dilution of GP2. (C). Cross section through a taste bud immuno-stained with 1/16000 dilution of GP1. (D). A single taste bud immuno-stained with 1/8000 dilution of GP2. (E). Second antibody control showing barbel without exposure to primary antibodies.\n", - "1193 \n", - " Single channel recording of the activity of the putative L-ArgR in planar lipid bilayers. Proteoliposomes containing protein from the first peak fractions off the Sephacryl S-300 elution were fused to planar lipid bilayers (DOPS:DOPE, 1:1) as described in Methods. (A). An initial control trace was obtained after addition proteoliposomes to the membrane bathing solution, before the addition of L-Arg. The three rows are from a continuous recording. (B). The addition of 10 μM L-Arg to the cis-side of the bilayer evoked regular periodic channel activity. A portion of this current record is shown at an expanded scale. (C). After several minutes of recording, the addition of 100 μM D-Arg to the cis-side resulted in the cessation of activity. Transmembrane potential was -100 mV. Traces shown in all panels are continuous records of that specific condition.\n", - "1201 \n", - " Chromosomal distribution of transcripts defining the reference retinome. (A) The distribution of 13,037 retinome genes over the human genome is shown as the difference between the number of observed and expected transcripts in window sizes of 5 Mb along the chromosomes (abscissa). The number of expected genes was based on 43,109 SGP-predicted transcripts. To correct for gene density per bin, the SGPs were adjusted by a factor of 0.30 (13,037/43,109). Positive/negative ordinate values indicate regions of enrichment/depletion of retinome-encoded transcripts. (B) Close-up of chromosomes 6 and 19 calculated for a window size of 1 Mb along the two chromosomes.\n", - "1239 \n", - " Radiographs. Radiographs of the fractured left femora at 6 weeks after fracture in rats 6(A), 26(B), and 52(C) weeks old at fracture.\n", - "1262 \n", - " Contribution of Cultivated and Exotic Variation to BY(A) The contribution of cultivated and exotic variation to BY in five genetic backgrounds. BY phenotypes in the Akko wide-spacing wet and dry experiments that involved four independent tester inbreds and their hybrids with M82 and IL789 are shown. Included are mean values for a control background of M82 and BOS3155. The four inbreds are represented as horizontal lines with circles in the gray bars. Experiments were transplanted in a randomized block design with 20 replications for each genotype under each irrigation regime. In all cases BY of the hybrids containing the exotic introgressions (IL789 × Testers) was significantly higher than that of their nearly isogenic cultivated tomato hybrids (M82 × Testers; t test, p < 0.01). The exotic effect, which represents the BY differences between the IL789 × Testers hybrids and the M82 × Testers hybrids, was consistent for all genetic backgrounds in each of the irrigation regimes. This was determined by genetic background × exotic effect two-way ANOVA (p for the interaction is 0.75 for the wet treatment and 0.88 for the dry field).(B) The mean contribution of cultivated and exotic variation to BY in wet and dry fields. BOS3155 is a leading commercial tomato hybrid that was used as a reference. Values of tester inbreds, M82 × Testers, and IL789 × Testers (shown as Δ% from M82) represent the means of the four genotypes included in each group (see Figure 3A). Base line and the letters attached to it represent M82. Means for each irrigation treatment with different letters are significantly different using a multiple-range means comparison (Tukey-Kramer; p < 0.01). The deduced exotic effect on BY is marked as black bars, and the contribution of the cultivated variation to BY is marked in gray. The absolute BY values of M82 were 303 g/m2 in the wet treatment and 122 g/m2 in the dry treatment.\n", - "1265 \n", - " Variation in Worker Reproduction with Colony Kin StructureAxes show standardized independent contrasts in WPM (log10WPM) and in r\n", - "diff. (A) is based on species values; (B) includes intraspecific variation for seven species (see text). Lines of regression are forced through the origin.\n", - "1267 \n", - " Variation in Worker Reproduction with Colony SizeAxes show standardized independent contrasts in the proportion of worker-produced males (log10WPM) and in colony size (log10\n", - "n\n", - "w). (A) includes all species; (B) includes only species in which relatedness predicts worker-produced males (i.e., r\n", - "diff is positive). Lines of regression are forced through the origin.\n", - "1268 \n", - " A Protein of 130 kDa Is a New Rab5 Effector(A) GST-Rab5-GDP and GST-Rab-GTPγS were loaded on beads and incubated with bovine brain cytosol. Bound proteins were eluted and analysed by SDS-PAGE followed by Coommasie Blue staining. The positions of the already known Rab5 effectors (EEA1, Rabaptin-5, hVps34, p110β, and Rabenosyn-5) and of the new Rab5 effector are indicated.(B) Schematic representation of the domain organisation in Rabankyrin-5. ANK, ankyrin repeats.(C) Bovine brain cytosol or HeLa cell cytosol was incubated with GST-Rab5-GDP– or GST-Rab5-GTPγS–loaded beads. Subsequently the beads were washed, and bound proteins were eluted and analysed by Western blotting using anti–Rabankyrin-5 antibodies.(D) GST-Rab4, -5, -7, and -11 fusion proteins were preloaded with GDP or GTPγS and incubated with in vitro-translated 35S-methionine–labelled Rabankyrin-5 full-length protein. As a control, bound and unbound material was analysed by SDS-PAGE followed by phosphoimager analysis.(E) Rabankyrin-5 binds most strongly to PI(3)P. Recombinant full-length Rabankyrin-5 was incubated with liposomes containing 2% of the indicated phosphoinositide. Bound Rabankyrin-5 was detected by Western blotting.\n", - "1269 \n", - " Rabankyrin-5 Associates with Two Types of Rab5-Containing Vesicles in A431 Cells, Early Endosomes, and Macropinosomes(A) A431 cells stably transfected for GFP-Rab5wt were immunostained for endogenous Rabankyrin-5 and EEA1. While there is perinuclear overlap between Rab5, Rabankyrin-5, and EEA1 in nontransfected cells (arrowheads), some smaller peripheral structures are devoid of EEA1 (arrows).(B) Overexpression of Rabankyrin-5 in A431 by using a recombinant adenovirus construct of Rabankyrin-5 causes an accumulation of peripheral, enlarged Rab5-positive structures, costained mainly by Rabankyrin-5 (arrows) but not detectable for EEA1.(C) Rabankyrin-5 localises on EGF-induced and -enriched macropinosomes. Serum-starved A431 cells (16 h) were incubated for 7 min with 100 ng/ml rhodamine-conjugated EGF to induce macropinocytosis and 1 μg/ml Cy5-labelled transferrin. Endogenous Rabankyrin-5 localises to enlarged EGF-containing macropinosomes, indicated by the lack of transferrin labelling (arrows), but also to EGF- and transferrin-containing endosomes (arrowheads).(D) Rabankyrin-5 structures contain tyrosine-phosphorylated proteins. A431 cells, stably transfected for GFP-Rab5, were stimulated with 50 ng/ml EGF for 7 min and immediately processed for immunofluorescence. Costaining of Rabankyrin-5 and tyrosine-phosphorylated proteins (α-4G10) reveal the localisation of Rabankyrin-5 to plasma membrane ruffles. Scale bars represent 10 μm.\n", - "1270 \n", - " Rabankyrin-5 Stimulates Homotypic Fusion between Early Endosomes and Heterotypic Fusion between Early Endosomes and CCVs In Vitro(A) Rabankyrin-5 was efficiently immunodepleted from HeLa cytosol without affecting the EEA1 concentration. Twenty micrograms of HeLa cell cytosol, either treated with control IgGs and immunodepleted for Rabankyrin-5 or nontreated, was applied to SDS-PAGE and probed for the indicated antigens by Western blotting. Anti-γ tubulin was used as a loading control.(B and C) Addition of recombinant Rabankyrin-5 stimulates homotypic and heterotypic fusion. Fusion (B) between early endosomes (EE-EE fusion) and (C) of early endosomes to CCVs (CCV-EE fusion) in vitro was performed in the presence of 3 mg/ml HeLa cytosol and an ATP-regenerating system (basal) and in the absence or presence of the indicated reagents. For some conditions, cytosol was immunodepleted for Rabankyrin-5 (columns 8–13) and in addition supplemented with anti–Rabankyrin-5 antibodies to neutralise the function of membrane-associated proteins (column 10). Background fusion activity is demonstrated by ATP (−Energy) or cytosol (−Cytosol) omission.\n", - "1271 \n", - " Rabankyrin-5 Localises to Macropinosomes in NIH3T3 Cells(A) NIH3T3 cells directly fixed and immunostained for endogenous Rabankyrin-5 and EEA1 reveal segregation of Rabankyrin-5 from EEA1-containing structures (arrows) in the cell periphery, while there is colocalisation in the cell centre (arrowheads).(B) Overexpression of Rabankyrin-5 increases the number of peripheral enlarged structures devoid of EEA1. NIH3T3 cells were infected with recombinant adenovirus for Rabankyrin-5 for 18 h. Dextran (2,5 mg/ml) uptake was performed for 3 min at 37 °C, fixed, and immunostained for the indicated antigens.(C and D) Formation of enlarged Rabankyrin-5 structures requires PI3-K activity. NIH3T3 cells either (C) DMSO treated or (D) pretreated for 20 min with wortmannin (WM; 100 nM) were incubated for 8 min with 0,5 μg/ml rhodamine-labelled transferrin and 2,5 mg/ml FITC-labelled dextran (MW, 10.000), fixed, processed for immunofluorescence, and analysed by confocal scanning microscopy.(E) NIH3T3 cells transiently transfected for YFP-Rabankyrin-5 and CFP-actin were imaged using time-lapse video microscopy to visualise the formation of macropinosomes by actin-driven membrane ruffles. Images were taken for the indicated time points. The arrowhead points towards Rabankyrin-5 association to an enlarged vesicle driven by actin dynamics over time. Scale bars represent 10 μm.\n", - "1272 \n", - " Immunolocalisation of Endogenous and Overexpressed Rabankyrin-5 in NIH3T3 CellsUntransfected NIH3T3 cells or cells transfected with Rabankyrin-5 were labelled with antibodies to Rabankyrin-5 followed by 10 nm protein A gold.(A) Transfected cell showing labelling of a group of vesicular structures underlying the plasma membrane (pm).(B and C) In control (untransfected) cells, low but specific labelling for Rabankyrin-5 (arrowheads) is associated with compartments close to the pm. Scale bars represent 200 nm.\n", - "1273 \n", - " Inhibition of Rab5 Activity Decreases Fluid-Phase UptakeNIH3T3 cells transiently transfected for either (A) GFP-Rab5wt or (B) RN-tre were subjected to a 30-min uptake of rhodamine-conjugated transferrin (1 μg/ml) or dextran (MW, 70.000; 3 mg/ml) at 37 °C and further processed for confocal imaging with indicated antibodies.(A) Rab5wt transfected cells show colocalisation of Rabankyrin-5–labelled macropinocytic structures, indicated by the lack of transferrin accumulation, with Rab5.(B) Cells transiently transfected for RN-tre (asterisk) show a significant reduction of fluid-phase uptake compared to nontransfected cells.(C) Fluid-phase dextran quantification of single cells transfected for RN-tre by measuring internalised fluorescence intensity (p > 0,001). Values shown are means ± standard deviation of at least 15 cells. Scale bars represent 10 μm.\n", - "1276 \n", - " Immunolocalisation of Rabankyrin-5 in the Mouse KidneyMouse kidney cortex was processed for frozen section immunoelectron microscopy. Sections were (A and B) single labelled for Rabankyrin-5 (arrowheads, 10 nm) or (C and D) double labelled (arrows, 5 nm) for Rabankyrin-5 and LAMP-1.(A) Low-magnification view of the apical region of two proximal tubule cells demonstrates low labelling for Rabankyrin-5 on apical microvilli (M) but stronger labelling (arrowheads) of large subapical electron-lucent vesicular structures (asterisks). One of these structures is shown at higher magnification in (B). L, lateral membrane.(C) Rabankyrin-5 labels LAMP-1–negative subapical structures as well as compartments showing low LAMP-1 labelling (arrows and asterisk).(D) Rabankyrin-5 (arrowheads) associates with compartments, which show no or weak labelling for LAMP-1 (asterisks). In addition, low Rabankyrin-5 labelling is associated with more strongly labelled LAMP-1–positive compartments. Note that there is some nonspecific labelling of mitochondria (m). Scale bars represent 500 nm.\n", - "1278 \n", - " Overexpression of Rabankyrin-5 Stimulates Fluid-Phase Uptake from the Apical Plasma Membrane(A and B) MDCK cells plated on coverslips were (A) mock-infected or (B) infected with Rabankyrin-5 and processed for immunofluorescence. Under both conditions EEA1 colocalised almost completely with Rabankyrin-5, while there were some Rabankyrin-5 structures devoid of EEA1. Upon Rabankyrin-5 overexpression these EEA1-lacking structures were enlarged macropinocytic-like vesicles localised predominantly in the periphery of the cell, while other enlarged compartments containing EEA1 were centripetally located.(C–F) Filter-grown MDCK cells were either mock-infected or infected with recombinant adenovirus for full-length Rabankyrin-5. HRP (5 mg/ml) or biotinylated Fab fragments (50 μg/ml) were internalised from the indicated chambers for various time points. Whereas Rabankyrin-5 overexpression (C) specifically increased HRP uptake from the apical domain, (D) basolateral HRP uptake and (E and F) Fab uptake at both domains were unaffected (p < 0,01). Values shown are means ± standard deviation of at least three independent experiments. Scale bars represent 10 μm.\n", - "1279 \n", - " Regulation of Longevity by CR and Fob1(A) Life span analysis for three genetic models of CR and deletion of FOB1. Strains shown (and mean life spans) are BY4742 (26.7), fob1Δ (37.8), gpa2Δ (34.9), gpr1 (34.4), and hxk2Δ (36.7).(B) fob1Δ and hxk2Δ increase life span additively. Strains shown (and mean life spans) are BY4742 (26.6), fob1Δ (37.3), hxk2Δ (36.7), and fob1Δ hxk2Δ (48.3).(C) fob1Δ and gpa2Δ increase life span additively. Strains shown (and mean life spans) are BY4742 (27.2), fob1Δ (37.8), gpa2Δ (36.7), and fob1Δ gpa2Δ (54.5).\n", - "1280 \n", - " Life Span Extension by CR Does Not Require Sir2(A) CR fails to increase life span of a sir2Δ mutant. Strains shown (and mean life span) are BY4742 (26.7), sir2Δ (14.0), hxk2Δ sir2Δ (12.4), and gpa2Δ sir2Δ (11.7).(B) Deletion of FOB1 suppresses the short life span of a sir2Δ strain. Strains shown and mean life spans are: BY4742 (27.5), sir2Δ (14.0), sir2Δ fob1Δ (30.0).(C) Deletion of HXK2 increases the life span of a sir2Δ fob1Δ double mutant. Strains shown (and mean life spans) are BY4742 (26.5), sir2Δ fob1Δ (30.0), and sir2Δ fob1Δ hxk2Δ (45.3).(D) Deletion of GPA2 increases the life span of a sir2Δ fob1Δ double mutant. Strains shown (and mean life spans) are BY4742 (26.6), sir2Δ fob1Δ (30.0), and sir2Δ fob1Δ gpa2Δ (51.0).\n", - "1282 \n", - " CR Increases the Life Span of Cells Overexpressing SIR2\n", - "(A) Neither deletion of FOB1 nor overexpression of SIR2 impact longevity in PSY316. Strains shown (and mean life spans) are PSY316 (21.1), PSY316 fob1Δ (20.7), and PSY316 SIR2-ox (21.7).(B) Overexpression of SIR2 and CR increase life span additively in BY4742. Strains shown (and mean life spans) are BY4742 on 2% glucose (26.1), BY4742 on 0.05% glucose (31.8), BY4742 SIR2-ox on 2% glucose (34.6), and BY4742 SIR2-ox on 0.05% glucose (42.2).\n", - "1319 \n", - " In vivo assessment of endothelial function in rabbits. Rabbits under sedation were serially infused for two minutes in the marginal ear (A) vein with the vehicle. An ink mark (Panel B) was made on the rabbit abdomen for probe location for each exam. Images (Panels C and D) of the abdominal aorta were recorded throughout the procedure.\n", - "1328 \n", - " Efficiency of lentivector-mediated gene transfer to commonly used target cell lines (A) under different MOI (B). Four cell lines were seeded at 5 × 104/well in 12 well plates. Several different inoculum volumes of lentivectors without known titre (A) or with known titre, ie.: different MOI (B) were added were added to each well (A) or as indicated. The media was changed daily. Cells were harvested three days after transduction, and washed three times with PBS. Transduction efficiency of lentivectors in different cell lines was obtained using flow cytometric analysis. Data represents mean value ± SD (n = 4).\n", - "1329 \n", - " Time-course of (A) basal and (B) TPA-induced 6-keto-PGF1α production during incubation with 1.2 μM epoxomicin. In (B) 16.7 nM TPA was used. Analyses were performed with duplicate and triplicate dishes. Mean values are shown.\n", - "1330 \n", - " Effect of epoxomicin on (A) basal and (B) TPA-induced 6-ketoPGF1α production and (C) effect of lactacystin on TPA-induced 6-ketoPGF1α production. Cells were incubated with the reagents for 6 hours. The analyses were performed with triplicate dishes *- statistically significant vs MEM/BSA. **- Statistically significant vs TPA.\n", - "1334 \n", - " Exercise Capacity of Cardiac HIF-1α KOs and HIF-1α/MCK/cre Mitochondrial Density(A) Mice lacking cardiac HIF-1α perform no differently in endurance running trials than WT mice, showing that the increase in exercise capacity seen in MCK/Cre mice is due to deletion of HIF-1α in skeletal muscle, not cardiac tissue.(B) Mice lacking skeletal muscle HIF-1α have a slight but nonsignificant increase in mitochondrial density as measured by the number of mitochondria per electron microscope field of view.\n", - "1335 \n", - " Hematocrit and Hemoglobin Levels in HIF-1α KOs and WT Mice(A) Hematocrit levels are virtually identical in both HIF-1α KOs (n = 3) and WT (n = 4) mice, indicating that loss of HIF-1α in skeletal muscle does not affect oxygen carrying capacity of the blood.(B) In addition to similar hematocrit levels, WT mice and HIF-1α KOs have very close blood hemoglobin levels.\n", - "1336 \n", - " Intramuscular Metabolite Levels at Rest and Following Stimulation(A) Glycolytic intermediates were measured from gastrocnemius muscles following the isolated stimulation protocol. Resting values represent levels in the unstimulated gastrocnemius from the same animals. HIF-1α KOs had a trend toward greater accumulated levels of HMPs during the stimulation protocol, although the difference did not reach statistical significance (p = 0.10). This difference could be indicative of a blockage in the glycolytic pathway at PFK.(B) No significant differences were seen between HIF-1α KOs and WT intramuscular glucose levels at rest or following stimulation. Both HIF-1α KO and WT muscles were able to significantly increase glucose uptake, leading to greater levels of intramuscular glucose in response to stimulation (WT, p < 0.001; KO, p < 0.05).(C) HIF-1α KOs have more stored glycogen than do WT mice. Glycogen levels were measured following the same stimulation protocol as in (B). The change in glycogen from rest to poststimulation was also greater in the HIF-1α KOs, indicating that they metabolized more glycogen in response to stimulation (p < 0.01; *p < 0.05, WT at rest vs. KO at rest).(D) HIF-1α KOs utilize more PCr in response to stimulation than do WT mice. Similar levels of PCr were seen at rest, but HIF-1α KOs metabolized significantly more during stimulation (p < 0.05) and had much lower levels following the protocol (**p < 0.01, WT poststimulation vs. KO poststimulation).(E) A trend toward lower PCr/ATP concentration ratios was seen in HIF-1α KOs relative to WT mice following stimulation, although the difference did not quite reach statistical significance (p < 0.10). A trend toward a greater drop from rest to poststimulation in the PCr/ATP ratio was also seen in HIF-1α KOs following stimulation (p < 0.10), indicating that they had to rely more heavily on PCr for ATP generation.(F) Slight but nonsignificant differences were seen in whole-muscle ATP levels at rest or following stimulation. Although HIF-1α KOs exhibited altered substrate utilization, they were able to meet their ATP demands during the protocol.(G) Both HIF-1α KOs and WT animals produced significant intramuscular lactate during the stimulation protocol; however, there was no significant difference in the amount produced by either genotype. Resting intramuscular lactate levels were also similar for WTs and HIF-1α KOs.\n", - "1337 \n", - " Force Generation and Ca2+ Release in Isolated Muscle Fibers during Stimulation(A) No differences were seen in total force generation in isolated muscle fibers. Mechanically dissected fibers from the flexor brevis muscle were subjected to a fatiguing protocol. Neither initial nor final forces differed between HIF-1α KO and WT fibers.(B) Ca2+ release and reuptake in HIF-1α KO and WT fibers was not different during the stimulation protocol. Ca2+ levels were measured in individual fibers through use of fura-2 Ca2+ indicator. The altered substrate utilization did not affect the ability of the fibers to maintain proper Ca2+ flux.\n", - "1338 \n", - " Oxidative Metabolism and Serum Lactate Production in HIF-1α KOs and WT Mice(A) HIF-1α KOs have higher resting levels of CS activity. CS is an enzyme in the Krebs cycle that can be regulated allosterically by ATP levels. Increased CS activity is indicative of increased muscle oxidative capacity, which is common in patients with glycogenolytic or glycolytic myopathies (#\n", - "p < 0.10, KO vs. WT).(B) HIF-1α KOs have higher resting levels of B-HAD activity, which is indicative of a greater ability to oxidize fatty acids (**p < 0.01, WT vs. KO).(C) Lower serum lactate levels were seen in HIF-1α KOs following a timed 25-minute run (*p < 0.05, WT vs. KO).\n", - "1339 \n", - " Endurance Capabilities of Untrained Mice(A) HIF-1α KOs have greater endurance in swimming tests as shown by their ability to swim on average more than 45 min longer than WT (*p < 0.05, WT vs. KO).(B) HIF-1α KOs have greater endurance than WT mice in uphill running tests. Although only a 10-min difference is seen between run times, it is to be noted that because of the protocol, this 10 min included two velocity increases (**p < 0.01, WT vs. KO).(C) HIF-1α KOs have less endurance than WT mice in downhill running tests. The same protocol was used as in Figure 4A, except the mice were run on a 10° decline (*p < 0.05, WT vs. KO).(D) RER uphill vs. downhill in WT mice. As would be expected from eccentric exercises relying more heavily on glycolytic fibers, the RER values are higher in mice running downhill than in those running uphill.(E) RER uphill vs. downhill in HIF-1α KOs. Once again, higher RER values are observed for mice running downhill than those running uphill.\n", - "1340 \n", - " Increased Muscle Damage in HIF-1α KOs Following Repeated Exercise(A) WT mice and HIF-1α KOs underwent a 4-d endurance test, in which animals were run to exhaustion on each of four successive days with a minimum of 22 h rest between trials. HIF-1α KOs demonstrated initially greater endurance under the protocol; however, by the second day, their endurance advantage was eliminated, and by the fourth day, HIF-1α KOs were running for a significantly shorter time (**p < 0.01) than on the first day, while WT animals were running for approximately similar times as on the first day. Repeated measures ANOVA revealed that the decrease in performance on each successive day was unique to HIF-1α KOs (p < 0.05).(B) Example of hematoxylin and eosin staining of gastrocnemius muscles after 1 d of recovery by mice after the 4-d endurance test. Evidence of greater damage can be seen in HIF-1α KO muscles compared to WT muscles.(C) Example of PCNA staining of gastrocnemius muscles from exercised mice, demonstrating increased levels of muscle regeneration in HIF-1α KOs.(D) Number of PCNA-positive nuclei per square millimeter in gastrocnemius muscles of WT mice (n = 5) and HIF-1α KOs (n = 7) that ran repeatedly for 4 d. Although HIF-1α KOs have almost twice as many PCNA-positive nuclei per square millimeter, the difference is not significant, because of wild variations in that population. F-test analysis of the data reveals that the variance is much greater in the HIF-1α KO population than the WT population (p < 0.05).\n", - "1341 \n", - " Glucose Tolerance and Glycogen Storage(A) No significant differences were seen in resting blood glucose levels in HIF-1α KOs or WT mice. Following injection of glucose at a dosage of 2 g/kg, no differences were seen in the maximum levels of blood glucose or the rate of glucose disappearance in either genotype.(B) Representative PAS staining of gastrocnemius muscle from WT mice and HIF-1α KOs. HIF-1α KOs demonstrate darker staining, indicating more stored glycogen.\n", - "1379 \n", - " FISH validation of some of the high-level amplifications (6p12.1, 8q24.3 and 17p11.2) identified by array CGH. Interphase cells hybridized with centromere 6 (red)/RP11-81F7 (green) in case 274 (A), RP11-89K10 (red) in case 527 (B) and RP11-189D22 (red) in case 364 (C). The ploidy of these cases was determined based on the modal chromosome number of the respective cases, e.g. diploid (case 426) triploid (cases 274 and 364), and tetraploid (case 527).\n", - "1408 \n", - " Relative number of M. sexta larvae on different plant locations on WT, AS –, AS-, S++, and Arizona (A) genotypes during 11 days on leaves growing at node S1, or the bottom, middle or top part of the plant (Figure 1). A single M. sexta neonate was placed on the leaf growing at node S1 and larval movement was monitored.\n", - "1410 \n", - " M. sexta mass (mean ± SEM) at 4 and 11d after neonates started to feed on leaves at S1 position (elongation stage) from WT, AS –, AS-, S++, and Arizona (A) genotypes. Bars with the same letter are not significantly different at P < 0.05 determined by one-way ANOVA. Thin bars indicate ± SEM.\n", - "1461 \n", - " Cytotoxic and bioluminescent activity in U87MG glioma cells transiently transfected with different amounts of HSV-TK-Luc plasmid. (A) Cytotoxic activity as measured by MTT assay and (B) luciferase activity as determined luminometrically in cell lysates. Results are displayed as counts per second (cps)/ μg protein. (C) Linear regression analysis of cytotoxic activity plotted against luciferase activity for the different amounts of plasmid DNA. Results from 3 independent experiments were used.\n", - "1462 \n", - " Comparison of the enzymatic activities of the HSV-TK-Luc fusion protein, HSV-TK, and Luc. U87MG cells were transiently transfected with 0.05 – 2 μg of HSV-TK-Luc, Luc, or HSV-TK plasmid. Cells transfected with equimolar amounts of DNA were analyzed for cytotoxic and bioluminescent activity. (A) Cytotoxic activity of cells transfected with HSV-TK-Luc or HSV-TK. For reasons of clarity only the graphs for 0.1 μg and 2 μg of transfected DNA are shown. (B) Luciferase activity in U87MG cells transfected with HSV-TK-Luc or Luc only. Results represent 3 independent experiments.\n", - "1463 \n", - " Correlation of light emission with cytotoxicity in intact U87MG glioma cells stably expressing the HSV-TK-Luc fusion construct and treated with GCV. (A) Cytotoxic activity as determined by MTT assay. (B) Bioluminescence imaging of quadruplicates of intact U87MG cells treated with the indicated amounts of GCV or left untreated (control). (C) Linear regression analysis of photon emission detected by the CCD camera plotted against cytotoxicity (R2 = 0.94; p = 0.029).\n", - "1464 \n", - " Bioluminescence imaging of nude mice carrying HSV-TK-Luc expressing U87MG gliomas. (A) Serial images from a mouse with 4 s.c. xenografts treated with GCV from day 7 to day 21 post tumor implantation and (B) saline treated control mouse, sacrificed on day 35 post tumor implantation due to massive tumor growth. The largest tumor in this mouse on the upper right back has already become necrotic. The day 35 image is also displayed at a broader grayscale range for better visualization of tumor localization. Note that control tumors also showed decreased light emission and a reduction in tumor size within the first 3 weeks post tumor implantation.\n", - "1465 \n", - " Comparison of (A) bioluminescence signals detected by the CCD camera and (B) tumor volumes in GCV-treated mice (n= 7, M1 – M7) harboring HSV-TK-Luc tagged U87MG glioma xenografts. GCV (60 mg/kg per day) was administered for 14 days starting at day 7 post tumor implantation. All mice were imaged at least on days 7, 15, 22, 29, and 56 post tumor implantation. BLI signals and tumor volumes at the beginning of therapy were set as 100%. Identical symbols in both graphs correspond to identical animals.\n", - "1466 \n", - " Linear regression analysis. Light emission as determined by the CCD camera was plotted against tumor volume. Mean values for all animals in a group along with the S.E.M are reported. (A) GCV treated mice: mice (n = 7) were imaged at start of therapy, after 1 and 2 weeks of GCV treatment, and 1 and 5 weeks after end of GCV therapy (R2 = 0.93, p = 0.008). In some mice additional images were acquired (Figure 5), but these were not included in this plot. (B) Saline treated control mice: these mice (n = 3) were imaged on days 7, 22, 29, and 35 and were sacrificed after the last BLI due to massive tumor growth (R2 = 0.98, p = 0.010).\n", - "1467 \n", - " Ex vivo bioluminescence imaging and histological analysis of a large HSV-TK-Luc tagged U87MG glioma in a control mouse. (A) Bioluminescence image (exposure time 10 min) of the freshly explanted tumor after D-Luciferin injection in the mouse prior to sacrifice. The tumor was cut in the middle and placed with the cut side facing the CCD camera. One part of the tumor was obviously hemorrhagic while the other part looked vital. Photon emission displayed in pseudocolors precisely reflected the macroscopic findings. (B, a and b) HE staining of paraffin sections from the same tumor as seen in (A) vital tumor region (a); hemorrhagic and necrotic tumor area (b); (B, c and d) immunohistochemistry on corresponding sections using a polyclonal anti-Luc antibody; vital tumor area (c) and hemorrhagic and necrotic region (d) with only scarce positive staining. Original magnification × 400.\n", - "1468 \n", - " Construction and characterization of the siDEN suppressor. (A) Diagram of the construction of the plasmid vector, pSMWZ-1, capable of expressing a DEN infection suppressor cassette. Abbreviations: N*, Not I; K, Kpn I; A, Apa I; E, EcoR I; SUP-1, Suppressor cassette; (B) Co-transfection with pSMWZ-siEGFP and pEGFP inhibits the expression of EGFP in cultured cells. HEK293 cells were transfected with different concentrations of plasmid DNA and three days later, EGFP-positive cells were counted by fluorescence microscopy. Results are expressed as mean ± SEM. *p < 0.05 compared to control (siRSVNS1, an unrelated siRNA construct against respiratory syncytial virus). (C) pSMWZ-siDEN suppression of DEN-2 virus replication. Vero cells were transfected with pSMWZ-siDEN3UT or pSMWZ-siDENpreM plasmid. Two days later, the cells were infected with DEN-2 virus (MOI of 0.1) and 5 days later, the numbers of DEN-2 virus infected cells were counted by fluorescence microscopy. Data are mean ± SEM. *p < 0.05 compared to control DEN-2. (D) AAV-siEGFP inhibits the expression of EGFP in cultured cells. HEK293 cells were infected with different concentrations of AAV-siEGFP, and three days later the cells were transfected with pEGFP. EGFP-positive cells were counted by fluorescence microscopy. Statistically significant differences, **p < 0.01, when compared to pEGFP plasmid control, AAV-siRSV (107) and AAV-siEGFP (108) group, respectively.\n", - "1470 \n", - " Suppression of DEN-2 replication in DCs by siDEN. (A) DCs were isolated from human peripheral blood and cultured in DMEM medium supplemented with FBS, IL-4 and GM-CSF. Non-adherent DCs were harvested on day 7, infected with AAVsiDEN, and two days later the cells were infected with DEN-2 at 0.1 MOI. DCs were harvested 5 days after DEN-2 infection and DEN-2 titers were measured by flow cytometry. (B) Supernatants from DEN-infected DCs were collected and added to culture plates containing confluent Vero cell monolayers. After virus adsorption, the Vero cells were overlaid with agarose and stained with 1% neutral red. Viral plaques were counted 48 h after neutral red overlay. Data are the averages of two independent experiments. *p < 0.05 compared to control.\n", - "1477 \n", - " Schematic illustration of the HTLV-I genome organization (A) and its various mRNA species with their specific splicing and encoded protein products (B) (See the text for detailed explanation).\n", - "1478 \n", - " Schematic illustration of the DNA elements and the activator and co-activator proteins involved in Tax-induced transcriptional activation of (A) HTLV-I LTR and (B) SRF-dependent promoters (See the text for detailed explanation).\n", - "1496 \n", - " Efficient target gene silencing with reduced OAS1 induction and lower shRNA expression. Total RNA was isolated from IS-1 cells (CTRL) or IS-1 cells 4 days after transduction with U6PT, sh319 or sh321 vectors. After reverse transcription, cDNA was analysed for expression of PAI-2 (A) and OAS1 (B). Data were generated by QRT-PCR, each target gene was detected in triplicate, error bars represent the standard deviation of mean values. 1 ml or 0.1 ml of each lentiviral vector stock was used, hence the designations 1 and 0.1. Vector titres were approximately 106 transducing units per ml resulting in a multiplicity of transduction of approximately 10 for 1 ml used or 1 for 0.1 ml used. In C, shRNA expression was detected in total cell RNAs using a modified RNase protection protocol. Total RNA was mixed with radiolabelled probes for hybridization and RNase protection. Samples were resolved on a 15 % Acrylamide/8M Urea/TBE gel and RNase protected probes detected by autoradiography. Lane 1 shows the Mir-16 probe without RNase digestion or target RNA, lane 2 is as lane 1 with RNase digestion and lane 3 as lane 2 with U6PT-transduced cell RNA as hybridization target. Lane 4 shows the sh3 probe without RNase digestion or target RNA, lane 5 as lane 4 with RNase digestion and lane 6 as lane 5 with U6PT-transduced cell RNA as hybridization target. In lane 7 sh321-transduced cell RNA was used as the hybridization target for the sh3 probe with RNase digestion, and lane 8 is as lane 7 except that cells were transduced with 10-fold less vector titre (sh321 1 and sh321 0.1). Known nucleotide lengths (Ntds.) for the probes and the protected Mir-16 endogenous RNA are marked.\n", - "1518 \n", - " Glycine receptors expressed show expression-system dependent agonist pharmacology. (A) Glycine has a reduced potency in L-cells compared to HEK cells. Glycine current responses were plotted versus the log concentration of glycine and normalized to a maximal concentration of glycine (3–10 mM). Data are presented as mean ± SEM; 4 ≤ n ≤ 9 cells for each concentration. Concentration response relationships for GlyRα2 (□; EC50 = 221 μM) and GlyRα2β (○; 269 μM) in HEK cells and in L-cells (GlyRα2, ■, 446 μM; GlyRα2β, ●; 667 μM) were derived from logistic equation fits to individual cells. (B) β-alanine has both reduced apparent affinity and efficacy for most glycine receptor isoforms transiently expressed in L-cells compared to HEK 293 cells. β-alanine apparent potency in HEK 293 cells was 717 μM for GlyRα2 (□, n = 6) and 560 μM for GlyRα2β (○, n = 7). For L-cells, β-alanine potency for GlyRα2 (■, n = 5–8) was 1.61 mM and 1.79 mM for GlyRα2β (●, n = 7). Current responses were normalized to a maximal concentration of glycine (10 mM). Note the reduced apparent efficacy of α2β receptors compared to the α2 homomeric isoforms. (C) Taurine has both reduced apparent affinity and efficacy to GlyRs transiently expressed in L-cells compared to HEK 293 cells. Taurine concentration-response relationship in HEK 293 for GlyRα2 (□; 442 μM, n = 5–6) and GlyRα2β (○; 1.25 mM, n = 3–5). Taurine concentration-response relationship in L-cells yielded GlyRα2 (■, n = 4) and GlyRα2β (●, n = 7) potencies estimated at ≥ 3 mM. Current responses were plotted versus the log concentration of taurine and normalized to a maximal concentration of glycine.\n", - "1519 \n", - " Relative expression levels does not influence taurine efficacy. (A) HEK and L-cells were co-transfected with the GlyRα2 subunit and GFP. Relative expression levels of α2-protein were examined using western blot analysis of total lysate from equal numbers of GFP+ HEK and L-cells. α2 protein was 4- to 5-fold greater in GFP+ HEK cells than in GFP+ L-cells. (B) Maximal glycine conductance across all experiments was significantly lower in L-cells compared to HEK cells, although only by about 2-fold. This may indicate that a significant amount of α2 protein in HEK cells (A) is present in a non-functional form or not associated with the plasma membrane. (C) Glycine current density vs. taurine efficacy in different cell lines expressing α2 (open symbols), α2β glycine receptors (closed symbols), and in isolated neurons from the adult rat basolateral amygdala. The correlation coefficient between glycine current density and taurine efficacy was 0.14 and was not significantly greater than zero (P >> 0.05). There was also no correlation (R2 = 0.01 to 0.3) between glycine current density and taurine efficacy when comparing individual cells within each of these systems.\n", - "1520 \n", - " The association of glycine receptors with the tubulin-cytoskeleton may influence partial agonist efficacy. (A) Tubulin depolymerization with colchicine decreased both taurine and β-alanine efficacy of α2β glycine receptors expressed in HEK 293 cells. Cells were treated with 100 μM colchicine or γ-lumicolchicine at 37°C for 30 minutes. The graph shows the partial agonist efficacy as a fraction of the maximal glycine response. For taurine (□), colchicine treatment reduced apparent efficacy from 33 ± 6% in control cells (n = 8) to 13 ± 3% in treated cells (n = 10). γ-lumicolchicine, an inactive analogue of colchicine, had no effect on taurine efficacy (29 ± 9%, n = 5, ** – P < 0.01 from ANOVA). For β-alanine (■), efficacy was reduced from 70 ± 7% in vehicle-treated cells (n = 8) or 67 ± 8% in γ-lumicolchicine-treated cells (n = 5) to 49 ± 6% in cholchicine-treated cells (n = 10, * – P < 0.05, ANOVA). (B) Colchicine treatment does not influence partial agonist efficacy of the GlyRα2 homomeric channels. Taurine (□) efficacy was 34 ± 15% in control GlyRα2 cells (n = 4) and was 38 ± 10% in colchicine-treated cells (n = 5, P >> 0.05 t-test). Similarly, β-alanine efficacy was 72 ± 12% and 86 ± 8% in the same control and treated cells, respectively (P >> 0.05, t-test). (C) Colchicine treatment decreases β-alanine efficacy in L-cells expressing GlyRα2β heteromeric channels (■), but not those expressing GlyRα2 homomeric channels (□). For the GlyRα2β channels, colchicine treatment significantly reduced efficacy from 23 ± 2% (n = 7) to 12 ± 3% (n = 3, P < 0.05 t-test). (D) Gephyrin-like immunoreactivity was detected in both cells lines using 20 and 40 μg of whole cell lysate. * – denotes expected gephyrin mobility (approx. 100 kD).\n", - "1521 \n", - " Glycine receptors expressed in different expression systems have similar 'functional' strychnine binding. Cells were pre-treated for 30 seconds with strychnine alone then exposed to a strychnine admixture with an EC50 concentration of glycine. (A) Strychnine-mediated inhibition of glycine-gated currents of GlyRα2 homomers expressed in HEK 293 (□; IC50 = 78.2 ± 13.5 nM) and L-cells (■; 33.1 ± 6.3 nM). (B) Strychnine-mediated inhibition of glycine-gated currents of GlyRα2β heteromers expressed in HEK 293 (○; 37.9 ± 7.9 nM) and L-cells (●; 23.2 ± 4.6 nM). (C) Functional KB values were calculated from IC50 values for individual cells using the Cheng-Prusoff relationship and glycine affinity/Hillslope data represented in Figure 1. Average KB values are shown for each subunit combination in the two expression systems. There was no significant effect of subunit compositions or expression system.\n", - "1547 \n", - " Expression of HA-S1P4-Gαi1 and HA-S1P4(E122Q)-Gαi1(C351I) in CHO-K1 cells. Membranes from untransfected CHO-K1 cells (lane 2) and CHO-K1 cells stably expressing HA-S1P4-Gαi1(C351I) (A) or HA-S1P4(E122Q)-Gαi1(C351I) (B) were analysed by Western blotting using anti-HA (panel I) or anti-Gαi1 (panel II) antibodies. Visualisation of immunoreactive proteins was achieved using chemiluminescence after incubation of the blot with appropriate HRP-conjugated secondary antibodies. The position of each HA-S1P4 fusion protein is indicated by an arrow. Cell-surface expressed HA-S1P4 receptor was detected by FACS analysis (panel III) using a Fluorescein conjugate of the anti-HA antibody (blue line). Cells were also stained with an isotype matched control antibody (red line). No staining of untransfected CHO-K1 cells was observed using the Fluorescein conjugate of the anti-HA antibody (not shown). Data are presented as overlay histograms and are representative of at least five independent experiments.\n", - "1549 \n", - " Ligand preference of HA-S1P4(E122Q)-Gαi1(C351I) in [35S]GTPγS binding assay. Membranes were stimulated for 30 minutes at 30°C with lysophospholipid ligands in the [35S]GTPγS binding assay and Gαi G proteins immunoprecipitated after solubilisation and preclearance with non-immune serum. (A) Membranes from CHO-K1 cells transfected to express HA-S1P4-Gαi1(C351I) or the mutant HA-S1P4(E3.29(122)Q)-Gαi1(C351I) and incubated with 100 ng/mL pertussis toxin for 24 hours prior to harvest, were left untreated (basal), or treated with vehicle or 10 μM concentrations of 18:1 LPA, 16:0 LPA, 14:0 LPA or S1P. Data are the mean of three determinations ± SEM from a single experiment and are representative of three such experiments performed. Statistical significance from the basal responses of each set of membranes tested is denoted by * (P < 0.05) or ** (P < 0.01); ## denotes statistical significance from the response to 18:1 LPA (P < 0.01) for the HA-S1P4(E3.29(122)Q)-Gαi1(C351I)-transfected membranes. (B) Membranes from CHO-K1 cells transfected to express HA-S1P4(E122Q)-Gαi1(C351I) and incubated with 100 ng/mL pertussis toxin for 24 hours prior to harvest, were stimulated with various concentrations of S1P (crosses), 18:1 LPA (open circles) or 14:0 LPA (filled triangles). Data are the mean of three determinations ± SEM and are representative of three such determinations performed.\n", - "1550 \n", - " Computational models of wild type S1P4 and its E3.29(122)Q mutant with S1P and LPA species. Computational models of the complexes between the wild type S1P4 or its E3.29(122)Q mutant with S1P or various LPA species generated by Autodock 3.0 and minimised using the MMFF94 forcefield in the MOE program. Complexes in each panel are shown from the same viewpoint with the extracellular end of the receptors oriented to the top of the figure. Standard element color codes are used with grey, white red, blue and magenta representing carbon, hydrogen, oxygen, nitrogen and phosphorous. Ribbons are shaded from red at the amino-terminus to blue at the carboxy-terminus. (A) Model of the complex between S1P (spacefilling) and the wild type S1P4 receptor. Residues in the receptor involved in ion pairs with S1P are shown as stick models and labelled. (B) Superimposition of the wild type S1P4 complex with S1P (orange) and the E3.29(122)Q S1P4 mutant complex with 14:0 LPA (green). For clarity, the only position at which the modelled amino acid position is shown for both receptor models is 3.29(122). Other residues had very similar optimised positions in the two model structures. (C) Superimposition of wild type S1P4 complexes with 18:1 LPA (cyan), 16:0 LPA (yellow) and 14:0 LPA (green) on E3.29(122)Q mutant complexes with 18:1 LPA (blue-green), 16:0 LPA (gold) and S1P (orange). For clarity, the only position at which modelled amino acid position is shown for both the wild type and mutant receptor models is 3.29(122). Other residues had very similar optimised positions in all model structures. (D) Space-filling models which represent the minimised extended conformation of each structure were constructed using SYBYL 6.9 software (Tripos Inc., St. Louis, MO., U.S.A.). The distance between phosphorus and terminal carbon atoms was predicted for each structure listed from top to bottom: 18:1 LPA, 27.0 Å; 16:0 LPA, 26.7 Å; 14:0 LPA, 24.2 Å; S1P, 24.0 Å.\n", - "1559 \n", - " Fuzzy Model Fit to Numerical Data. Comparison of experimental (solid black line) gene expression ratios from the alpha cell synchronization data set (Spellman, et al., 1998) and the predicted time series of the best-fitting fuzzy model (grey line) for genes CLN1, E = 0.930 (A), CDC28, E = 0.510 (B), SWI6, E = 0.620 (C), and CLB5, E = 0.881 (D).\n", - "1566 \n", - " Schematic illustration of methods for reconstructing the metabolic network from genome data: (A) conventional three-step method based on coding sequence (CDS) prediction, function assignment and metabolic reconstruction; (B) proposed two-step method based on a simultaneous and direct identification of coding sequences and their functions from raw genome sequences. Note that the query process has been reversed in the new method in comparison to the conventional method.\n", - "1578 \n", - " Molecular genetics and transformation rescue of bas-1. (A) Genetic and physical map of bas-1 region and bas-1 mutant alleles. Locations and extent of mutations for each bas-1 allele are shown to scale with respect to C05D2.4 and C05D2.3 coding sequences, based on known splicing patterns or Genefinder predictions. Exons are indicated by rectangular bars; an alternatively spliced 27 bp exon is also indicated after exon 2 in C05D2.4. Four of five bas-1 mutants affect only C05D2.4; ad446 is a larger deletion removing most coding sequence of both C05D2.4 and C05D2.3. (B) Genomic DNA constructs that rescue or fail to rescue bas-1 mutants. Constructs are shown to scale (top), based on the 15.1 kbp insert of the plasmid clone C05D2XN; construct names are indicated in the box on the left. The cosmid C05D2 is larger, as indicated by the arrows. Clones below are subclones or modifications of C05D2XN. Coding regions for the two predicted AADC genes C05D2.4 and C05D2.3 are indicated by the blue boxes; intergenic regions are shown in yellow. C05D2XN upstream of C05D2.4 contains two other predicted genes, one complete (C05D2.8) and one partial (C05D2.5). There are no predicted genes in the 3 kb downstream of C05D2.3. In the constructs with the least upstream sequence, only a portion of C05D2.8 remains. Constructs mutated to introduce premature stop codons are indicated with a X in the coding sequence, and red downstream of the introduced stop codon. The construct pCL8001 has a GFP gene inserted in a manner that would inactivate the C05D2.3 gene, so is comparable to the pCL7991 construct. [No GFP expression was seen in the C05D2.3::GFP reporter construct lines.]\n", - "1579 \n", - " C. elegans bas-1 cDNA sequences. (A) Consensus cDNA sequence and translation for C05D2.4/bas-1, based on the most common splice form. Nucleotide numbering is shown on the left side and amino acid numbering on the right side of the sequence. SL1 spliced leader sequence is overlined in blue in the top line. Intron locations are indicated with blue arrowheads; the phase at all intron locations is 0 (between codons; see also Fig 6). The conserved lysine (K) pyridoxal 5-phosphate binding site at amino acid 343 is boxed in black. Red amino acids in the predicted Bas-1 protein (T286, D292, H309, D311, S336, K343, K357, V378, R393, and W401) are identical to those shown to be essential for rat AADC function [5, 41, 42]. Possible phosphorylation sites that are absolutely conserved in known DDC and HisDC proteins are boxed in green (Y37, S149, S229, S230). The polyadenylation signal in the final line is underlined. Mutations found in bas-1 alleles are indicated with the allele designation and the changed base over the wildtype sequence. The allele tm351 deletion, which removes the entire second exon, is indicated by a red line over the missing sequence. The wildtype cDNA sequence shown is consistent with our RT-PCR clones (primers SL1B, C05D2-B), those we sequenced from the ORFeome project (from predicted translation start to stop), and C. elegans EST project 'YK clones' ends (used to determine the 3' end, including the site of polyadenylation). (B) Alternatively spliced 27 bp exon and surrounding genomic sequence in C. elegans and C. briggsae. The additional exon is found in a fraction of C. elegans bas-1 transcripts, and the sequence is conserved in genomic sequence from C. briggsae as shown. [We did not isolate a cDNA containing this exon among our C. briggsae bas-1 cDNAs, S. DePaul & C. Loer, unpublished results.] Predicted translation of the exon is shown above or below the nucleotide sequence. Consensus splice signals are overlined in blue, and identical nucleotides are indicated by vertical lines between the two nucleotide sequences.\n", - "1582 \n", - " Phylogenetic trees of AADC protein and nucleotide sequences. Trees were made from sequences aligned with CLUSTALW. Species and gene names are abbreviated as listed in the legend for Table 1. (A) The single minimum-length tree resulting from a heuristic search using parsimony from alignments of core protein sequences (531 characters) of selected C. elegans, C. briggsae, Human and Drosophila AADCs. C. roseus (periwinkle plant) TrpDC was used as an outgroup. Branch lengths are indicated, with bootstrap values using the same search conditions (1000 replicates) in parentheses. The search used the tree-bisection-reconnection (TBR) branch-swapping algorithm; characters were equally weighted. An identical tree topologically was obtained by a branch-and-bound search. C. elegans F12A10.3 was excluded from this analysis since it lacks a functional protein sequence (see Fig. 7 and text). Trees determined by distance methods were similar, but rearranged some of branches with low bootstrap values in the tree shown. (B) The single minimum-length tree resulting from a heuristic search using parsimony (same settings as above) of nucleotide sequence alignments (1608 characters) from a subset of AADCs above, with the addition of C. elegans F12A10.3. Dm DDC was used as an outgroup. Branch lengths and bootstrap values using the same search conditions (1000 replicates) are shown as in A. An identical tree topologically was obtained by a branch-and-bound search.\n", - "1585 \n", - " Using the HLA marker B14, we examined the BA livers for evidence of maternal microchimerism using immunohistochemistry techniques. An HLA-B14 positive patient served as our positive control (A). Specimen B, our negative control, was a patient who was, along with his mother, negative for HLA-B14. Specimen C, our test specimen, was HLA-B14 negative, with an HLA-B14+ mother. Specimen A (positive control) has a bright signal for HLA-B14 while there is only background staining for HLA-B14 in specimen B (negative control). Specimen C, the test specimen, has isolated scattered bright signals suggesting maternal microchimerism.\n", - "1591 \n", - " AA release from (A) rat liver cells (C-9) stimulated by tamoxifen, 4-OH-hydroxy-tamoxifen, LY117018 and raloxifene and (B) from rat glial cells incubated with tamoxifen and LY117018. The cells were incubated for 6-h. The analyses were performed with triplicate dishes. Each bar gives the mean value and the brackets give the SEM. * = statistically significant vs control. The data are representative of several independent experiments with similar results.\n", - "1592 \n", - " AA release from (A) human breast carcinoma cells (BT-20) and (B) human colon carcinoma cells (HT-29) by tamoxifen and LY117,018. The cells were incubated for 6-h. The analyses were performed with triplicate dishes. Each bar gives the mean values and the brackets give the SEM. * = statistically significant vs appropriate MEM/BSA control. The data are representative of several independent experiments.\n", - "1593 \n", - " Effect of tamoxifen, LY117018 or raloxifene on (A) basal 6-keto-PGF1α production and (B) the effect of tamoxifen or LY117018 on 6-keto-PGF1α production induced by lactacystin in the presence of TPA. Rat liver cells were incubated for 6-h. The analyses were performed with triplicate or quadruplicate dishes. Each bar gives the mean value and the brackets the SEM. * = Statistically significant vs control stimulation. ** = Statistically significant vs lactacystin plus TPA control. The data are representative of several independent experiments with the same results.\n", - "1594 \n", - " Inhibition of (A) tamoxifen (16 μM)-stimulated basal and (B) tamoxifen-stimulated induced 6-keto-PGF1α production (lactacystin in the presence of TPA) by celecoxib (*) and piroxicam (◊). Rat liver cells were incubated with either (A) tamoxifen (16 μM) or (B) lactacystin plus TPA in the presence of tamoxifen, for 6-h. The analyses were performed with triplicate dishes.\n", - "1596 \n", - " Effect of (A) actinomycin D on basal or induced (lactacystin plus TPA) 6-keto-PGF1α production stimulated by tamoxifen and (B) effect of ICI-182,780 on basal 6-keto-PGF1α production stimulated by tamoxifen. In (A), rat liver cells were preincubated with 1 μM actinomycin for 2-h and then incubated with tamoxifen (16 μM) or lactacystin plus TPA for 6-h. In (B), rat liver cells were incubated with tamoxifen (16 μM) and tamoxifen in the presence and absence of ICI-182,780 (16 μM) for 6-h. The analyses were performed with triplicate dishes. Each bar gives the mean value and the brackets give the SEM. Parts of the experiments were repeated several times with the same results. * Statistically significant vs control. ** Statistically significant vs lactacystin plus TPA.\n", - "1606 \n", - " Two new transposons for generating multicolored GFP fusion protein libraries. In-frame insertions of the Either-Or transposon, (A), within another coding sequence initially create truncated C-terminal YFP fusions. Alternate restriction digestion with Asc I or Srf I removes one of the fluorescent proteins and the KanR. Subsequent re-ligation produces identical full-length YFP and CFP fusion proteins. The fluorescent protein is flanked by 9 amino acid linkers encoded by the Tn5 MEs and restriction sites. The Double Barrel transposon, (B), encodes green and red fluorescent proteins (GFP and DsRed) antiparallel to one another. Therefore, insertions with another coding sequence have a 1:3 chance of being in-frame regardless of orientation. The GFP coding sequence uses the same reading frame through the Tn5 MEs as YFP in . DsRed however, has been shifted by 1 bp to use a different reading frame through the Tn5 MEs, doubling the number of usable insertion sites within a target coding sequence (Note that the reading frame shown in is that used for DsRed, translated from the lower DNA strand, and is read from right to left).\n", - "1607 \n", - " In-frame transposition events in the voltage sensitive integral membrane motor protein, Prestin. Visual screening of transiently transfected HEK-293 cells revealed truncated Prestin-YFP fusion proteins generated by in-frame transpositions (A) (scale bar = 20 μm). Alternate digestion and re-ligation of an in-frame clone with either Srf I or Asc I produces identical full-length YFP- (B) and CFP-fusion proteins (C). In-frame insertions in Prestin are identified by the first of 3 target amino acids duplicated during transposition (D). Redundant insertions are indicated by the number of recovered clones (e.g. 3x).\n", - "1608 \n", - " Transposition of the type 1 IP3R with the Double Barrel Transposon (). Transient expression in HEK-293 cells allows identification of in-frame insertions producing truncated GFP- (A) or DsRed- (B) IP3R fusion proteins. Digestion and subsequent re-ligation produces a full-length fluorescent IP3R fusion protein (C) (Scale bar = 20 μm).\n", - "1610 \n", - " Plots of 1H-15N heteronuclear NOE, NOE constraints and RMSD statistics for ChaB. (A) 1H-15N heteronuclear NOE acquired at 600 MHz. (B) Summary of all unassigned unambiguous NOE constraints: intra-residue, sequential, medium and long range NOEs are shown as blue, green, red and black bars respectively. (C) Backbone RMSD's calculated for the 17 lowest energy ChaB structures based on superposition of residues P22-S96.\n", - "1611 \n", - " Solution structure of ChaB. Ensemble of the 17 lowest energy structures showing (A) backbone and (B) heavy-atom traces. Superposition was made over residues comprising the native ChaB sequence (P22-S96). (C) Ribbon representation of the lowest energy ChaB conformer.\n", - "1612 \n", - " Sequence alignment of the family of ChaB proteins. (A) Alignment of ChaB from E. coli aligned with a series of related proteins identified by Pfam [34]. In bold above alignments, are residues most conserved among ChaB proteins. Cartoon diagram above represents the secondary structure of ChaB. ChaB from E. coli (in bold) Salmonella typhi (Q8XGJ2)and Methanosarcina mazei (Q8PYS9) are classified as group I ChaB proteins. Group II ChaB proteins are all found in Baculoviridae. The figure was created using BOXSHADE (EMBnet). Identical amino acids are highlighted in black and homologous residues in gray. (B) Sequence alignments of ChaB and related proteins σ70 and σRN based structural composition (see text for details).\n", - "1613 \n", - " Comparison of ChaB with structurally similar proteins. Structural similarities between (A) ChaB, (B) σ70(PDB code 1SIG [14]) and (C) σRN (PDB code 1H3L, [15]) proteins identified from the DALI server. The three helices in ChaB are colour coded, with the equivalent helices in σ70 and σRN similarly coloured.\n", - "1614 \n", - " CaCl2 titration and surface potential map of ChaB. (A) Summary of the perturbations of CaCl2 on the backbone 1H-15N chemical shifts of ChaB. The change in chemical shifts (determined from a weighted vector sum of 1H and 15N ppm deviations) are mapped onto the structure of ChaB using a colour gradient from blue, to red to yellow, where yellow is the largest perturbation and blue the smallest. Residues that could not be analyzed such as overlapping residues or residues that do not exhibit NH resonances are coloured grey. (B) Potential map of the surface of ChaB calculated using MOLMOL [35] shown in the same orientation as (A). Residues most perturbed by Ca2+ cluster around a highly negatively charged patch on the ChaB surface comprising a flexible loop.\n", - "1632 \n", - " Receptor specificity. Specificity of uptake of 125I-AGG (A), 125I-FSA (B), 125I-collagen (C), 125I-mannan (D), or 125I-FITC-bHA (E) in LSEC in the presence of mannose (50 mM), FSA (0.1 mg/ml), COLLA (0.1 mg/ml), hyaluronan (0.1 mg/ml) and AGG (0.3 mg/ml). Uptake (cell-associated radioactivity (solid bars) plus acid soluble radioactivity in spent medium [open bars]) was measured after 120 min incubation at 37°C. Results, given as % of control, are means of three experiments, each consisting of three parallels. Error bars represent standard deviation (+SD).\n", - "1633 \n", - " Intracellular transport of endocytosed ligands. Cultures of LSEC were pulsed with both TRITC-FSA and FITC-AGG for 1 h at 4°C. Chasing was performed after removal of unbound ligand by washing, and transferring of the cultures to 37°C. The cultures were fixed after chase periods of 10 min or 2 h and examined in fluorescence microscope. At 10 min (A) all TRITC-FSA co-localized with FITC-AGG (yellow colour indicates co-localization) in large ring-shaped vesicles (large arrowheads), and some vesicles with only FITC-AGG were observed (small arrowheads). After 2 h (B), co-localization of FITC-AGG and TRITC-FSA in large vesicles (arrows) was observed together with big vesicles with only FITC-AGG (large arrowheads) and small vesicles with only TRITC-FSA (small arrowheads). Controls show a more perinuclear appearance of TRITC-FSA when pulsed and chased for 2 h alone (C). In other experiments, TRITC-FSA was injected intravenously 1.5 h before isolation of the cells. Following an additional 6.5 h of cultivation at 37°C cultures of LSEC were pulsed with FITC-FSA (D-E), FITC-collagen (F-G), or FITC-mannan (H-I) for 1 h at 4°C. Following a 10 min chase, the FITC-ligands were observed to appear in small vesicles (arrowheads), and did not co-localize with TRITC-FSA (D, F and H). After 2 h, the FITC-ligands were transported to perinuclear compartments that co-localized almost completely with TRITC-FSA (small arrows in E, G and I). Other cultures of LSEC were pulsed for 10 min at 37°C with FITC-bHA. Following a 20 min chase, the FITC-bHA was observed in vesicles distributed all over the cell (arrowheads in J), and a similar appearance was observed after 2 h (arrowheads in K). Occasionally, cells that did not take up TRITC-FSA in vivo, but endocytosed FITC-ligands in vitro (big arrow in I), were observed. Scale bars: 10 μm.\n", - "1647 \n", - " XS52 DC are capable of presenting native PPD effectively to T cells: (A) XS52 DC were γ-irradiated and then pulsed for 8 hr with the indicated concentrations of PPD. The PPD-reactive Th1 clone (diamonds) or Th2 clone (squares) (105 cells/well) was cultured for 2 days with PPD-pulsed XS52 cells (104 cells/well). (B) Following a 3 hr incubation with or without chloroquine (100 μM), XS52 DC were pulsed with PPD (100 μg/ml) in the presence or absence of chloroquine (100 μM) and then examined for their capacity to activate the PPD-specific Th1 and Th2 clones. Data shown are the mean ± SD (n = 3) of 3H-thymidine uptake. Baseline proliferation of γ-irradiated XS52 DC alone was <300 cpm.\n", - "1648 \n", - " Pepstatin A inhibits the capacity of XS52 DC to present native PPD: (A) γ-irradiated XS52 DC were pulsed with PPD (100 μg/ml) in the presence or absence of each protease inhibitor (100 μg/ml pepstatin A, 100 μM DCI, or 100 μM E-64) or vehicle alone (1% DMSO or 15 mM NH4Cl). XS52 DC were then cultured for 2 days with the PPD-reactive Th1 or Th2 clone in the continuous presence of the same inhibitor or vehicle alone. Data shown are the mean ± SD (n = 3) of 3H-thymidine uptake in three representative experiments. (B) XS52 DC were incubated with each of protease inhibitor (100 μg/ml pepstatin A, 100 μM DCI, or 100 μM E-64) or vehicle alone (1% DMSO or 15 mM NH4Cl) for 16 hrs. Subsequently, cells were harvested and their viability was measured by trypan blue.\n", - "1649 \n", - " Failure of pepstatin A to inhibit the Ag presenting capacity of PPD-pulsed and fixed XS52 DC: (A) γ-irradiated XS52 DC were pulsed with PPD and then fixed with paraformaldehyde (left panels). Alternatively, XS52 DC were first fixed and then pulsed with PPD. Subsequently, the XS52 DC were cultured with the PPD-specific Th1 or Th2 clone in the presence or absence of pepstatin A. Data shown are the mean ± SD (n = 3) of 3H-thymidine uptake. (B): Allogeneic splenic T cells isolated from CBA mice (5 × 105 cells/well) were cultured for 4 days with the indicated numbers of γ-irradiated XS52 DC in the presence or absence of pepstatin A. Data shown are the mean ± SD (n = 3) of 3H-thymidine uptake. (C): γ-irradiated XS52 DC were pulsed for 8 hr with either native PPD or trypsin-digested PPD in the presence or absence of pepstatin A. XS52 DC were then cocultured for 4 days with PPD-reactive Th1 or Th2 clones in the presence or absence of pepstatin A. Cocultures were then pulsed for 18 hr with 3H-thymidine and then harvested using a β-counter.\n", - "1661 \n", - " The C. elegans BCKAD Homolog Is Involved in mmBCFA Biosynthesis(A) Early steps of mmBCFA biosynthesis in bacteria, based on Smith and Kaneda (1980), Oku and Kaneda (1988), and Toal et al. (1995). IVD, isovaleryl-CoA dehydrogenase. Predicted corresponding C. elegans genes encoding predicted orthologs were identified (shown in italicized names of reading frames).(B) GC profiles reveal differences in the FA composition in the wild-type animals and animals treated with RNAi of E1 alpha subunit of BCKAD encoded by Y39E4A.3. Black arrowheads point to C15ISO and C17ISO.(C) A summary of several independent preparations shows a significant decrease in both mmBCFAs in the Y39E4A.3 dsRNA-treated animals (p = 0.001 and 0.008 for C15ISO and C17ISO, respectively).\n", - "1662 \n", - " RNAi Treatment of elo-5 Causes L1 Arrest and Other Physiological Defects(A–C) Nomarski images of worms grown from eggs placed on RNAi plates. Scale bars, 100 μm.(A) Young adults had normal morphology and growth rates.(B) On the second day of adulthood, these animals displayed an egg-laying defect; eggs hatched inside the worms. Arrows point to the late embryos and hatched larvae inside a worm.(C) F1 generation arrested uniformly at the first larval stage (L1), and larvae arrested for 4–5 d died.(D–F) Images of worms derived from late larvae (L2–L4) placed on the RNAi plates.(D) The F1 progeny of worms developed from the treated larvae had smaller size and a scrawny morphology compared to the wild type shown in (A). Scale bar, 100 μm.(E) These animals produced very few oocytes, some of which gave rise to embryos and L1 worms. White arrows indicate embryos. Some oocytes remained unfertilized (black arrow). Scale bar, 10 μm.(F) The proximal part of the gonads undergoes deterioration resulting in sterility. The white arrow indicates spermatica, the black arrow shows an abnormally amorphous oocyte, and the two-way arrow points to the clumsy gonad arm that is finely ordered in wild-type animals. Scale bar, 10 μm.\n", - "1663 \n", - " The FA Composition in Worms Maintained on elo-5 RNAi Plates Supplemented with FA or with S. maltophilia Enriched with C15ISO and C15anteISO FABlack arrowheads indicate positions of mmBCFAs.(A) Animals grown with C15ISO supplements were partially rescued to the wild-type phenotype; however, no accumulation of C15ISO or its elongation to C17ISO was detectable.(B and C) Animals grown with the (B) C17ISO or (C) C17anteISO supplements were fully rescued. Peaks corresponding to C17ISO and C17anteISO are prominent.(D) The FA composition in S. maltophilia. Arrowheads point to the major FAs, C15ISO and C15anteISO.(E) The elo-5(RNAi) animals are able to elongate dietary C15ISO and C15anteISO into C17ISO and C17anteISO. Arrowheads indicate mmBCFAs. The horizontal arrow illustrates the elongation from C15 to C17 mmBCFA.\n", - "1664 \n", - " A Fluctuation of the C17ISO Amounts in Development(A) Relative amounts of C15ISO and C17ISO in the worm samples collected at different developmental stages. The amount of the mmBCFA molecule is presented as the percentage of total FA in each sample. Grey bars, C15ISO; black bars, C17ISO.(B) Proposed relationship between the levels of mmBCFA during development and the RNAi effects. Depending on the time of RNAi onset, the amount of C17ISO in F1 eggs varies. If elo-5 is suppressed in parental animals after they have begun to synthesize mmBCFA, then their eggs will have a reduced C17ISO level that is still above the critical low level, which permits these animals to grow but causes them to display gonadal defects. These worms produce a small number of progeny that is then arrested in L1. If parental animals are treated with elo-5(RNAi) right after hatching, they are unable to initiate mmBCFA biosynthesis and the levels of C15ISO and C17ISO in their eggs are reduced to below the critical low level, resulting in L1 arrest of their progeny.\n", - "1665 \n", - " Correlation between the Level of C17ISO and the Levels of Linoleic and Vaccenic Acids during DevelopmentGraphical illustrations of the correlation between the levels of C17ISO and (A) vaccenic acid and (B) linoleic acid. Data were obtained by GC analysis of synchronized populations of worms. Combined with the GC measurements generated from 50 additional samples (see Materials and Methods), these data were used to calculate correlation coefficients: CORREL C17ISO/C18:2 n6 = 0.82772, T-TEST = 6.54814 × 10−7, and CORREL C17ISO/C18:1 n7 = −0.85162, T-TEST = 4.74094 × 10−5. Black bars, C17ISO; white bars, vaccenic acid; grey bars, linoleic acid.\n", - "1666 \n", - " RNAi of the C. elegans SREBP Homolog Alters the FA Composition(A and B) The GC profiles of (A) wild-type and (B) lpd-1(RNAi)-treated worms.(C) A summary of several independent GC runs. Bars represent the percentages of total FAs. The levels of C15ISO, C17ISO, and C16:0 are significantly altered by the RNAi treatment. Black arrowheads point to differences in the C15ISO and C17ISO amounts. Grey arrowheads indicate the changes in palmitic acid, C16:0.\n", - "1668 \n", - " The Expression of GFP Fusion Constructs Suggests the Involvement of lpd-1, acs-1, and pnk-1 in mmBCFA Biosynthesis(A–D) elo-5Prom::GFP expression is downregulated in the lpd-1(RNAi) background. Scale bars, 100 μm.(A and C) GFP-filtered images of (A) elo-5Prom::GFP and (C) elo-6Prom::GFP in wild-type animals, showing the characteristic bright intestinal fluorescence.(B and D) GFP-filtered images of (B) elo-5Prom::GFP and (D) elo-5Prom::GFP in lpd-1(RNAi) animals, revealing diminished fluorescence in the gut.(E–H) lpd-1 expression is upregulated in neurons of the elo-5(RNAi) animals deficient for C15ISO and C17ISO. Scale bars, 15 μm.(E and F) Nomarski and GFP images of wild-type L1 larvae containing lpd-1Prom::GFP.\n", - "(G and H) Nomarski and GFP images of elo-5(RNAi)-treated animals (L1 arrested) containing lpd-1Prom::GFP, showing a visibly brighter fluorescence than that seen in (E) and (F). Circles are centered on the pharyngeal back bulb.(I–K) acs-1Prom::GFP expression is upregulated in the elo-5(RNAi) animals deficient for C15ISO and C17ISO. Panels show GFP images of acs-1Prom::GFP animals grown on the (I) control, (J) elo-5(RNAi), and (K) lpd-1(RNAi) plates. The fluorescence from acs-1Prom::GFP in (J) is significantly stronger than that in (I). Scale bars, 100 μm.(L–N) pnk-1Prom::GFP expression is upregulated by elo-5(RNAi) but downregulated by lpd-1(RNAi). Panels show GFP images of pnk-1Prom::GFP animals grown on the (L) control, (M) elo-5(RNAi), and (N) lpd-1(RNAi) plates. The fluorescence of the fusion construct is stronger in (M) but weaker in (N) than that in the control (L). Scale bars, 100 μm.\n", - "1669 \n", - " RNAi of Four Candidate Genes with Altered Expression in elo-5(RNAi) Worms Affects the FA Composition(A) GC profile of the wild type.(B–E) GC profiles of the RNAi-treated worms.(B–D) RNAi of the three genes resulted in a decrease of the C17ISO or both C15ISO and C17ISO levels, indicated by black arrowheads. In addition, a significant elevation in straight-chain saturated FA levels, indicated by grey arrowheads, is observed in K10C3.6(RNAi).(E) C27H6.2(RNAi) does not cause significant changes in mmBCFA but results in an elevation of straight-chain monounsaturated FA and C18:1 n7, indicated by white arrowheads. Statistical analysis of several GC runs on each of the samples was also carried out (unpublished data).\n", - "1671 \n", - " Analysis of the Effects of SNPs and Unselected Mutations on Predicted ESEs(A) The percentages of the four prediction outcomes. ESE disruption (+ −), ESE alteration (+ +), ESE neutrality (− −), and ESE creation (− +) changes are listed for the set of 2,561 validated SNPs (selected) and for the set of 100,000 simulated (unselected) mutations.(B) Synonymous and nonsynonymous mutations were analyzed separately and then compared using the MH test for homogeneity. All outcomes passed the MH test for homogeneity (H0:Outcomesynon ≈ Outcomenonsynon; p < 0.05) and could, therefore, be combined into a summary OR (weighted combination of the ORs measured in the synonymous and nonsynonymous sets). The height of each bar can be interpreted as the odds that the listed outcome will occur in the evolutionarily selected set of mutations (SNPs) relative to the odds that the same outcome will occur in the unselected (simulated mutation) set. Error bars extend one standard deviation on either side of the calculated value.\n", - "1673 \n", - " Measuring Selective Pressure on Each RESCUE-ESE HexamerAny point mutation alters six overlapping hexamers, and so a database of 8,408 SNP mutations alters a total of approximately 50,000 hexamers in the wild-type (ancestral) allele. In considering all 238 RESCUE-ESE hexamers, the frequency of each ESE hexamer in the total set of ancestral alleles was recorded for the database of SNPs and simulated mutations (8,408 SNP mutations and 100,000 simulated mutations). The ESE frequency in the SNP set was divided by the ESE frequency in the simulated set to calculate the RR for each of the 238 hexamers.(A) The distribution of RR for all 238 ESE hexamers is plotted on a logarithmic scale. A resampling strategy was used to identify 57 ESE hexamers that were significantly conserved (pink bars have an RR less than 1; p < 0.05) and also six ESE hexamers that were not conserved (blue bars have an RR greater than 1; p < 0.05).(B) The output of RESCUE-ESE was compared for several vertebrate genomes (human, mouse, pufferfish, and zebrafish). The set of 238 human RESCUE-ESE hexamers was divided into nonoverlapping subsets based on their conservation in the RESCUE-ESE output generated from other vertebrates. The proportion of ESEs that were significantly conserved in the SNP analysis (as described above in [A]) were recorded for each subset of RESCUE-ESE hexamers and are represented as pink sectors in the pie chart.\n", - "1674 \n", - " Module Predictions within the Segmentation Gene Network(A) Schematic depiction of the regulatory relationships within the segmentation gene network.(B) Ahab-predicted modules in the control regions of segmentation genes were classified based on their composition into pair-rule driven (pr, red), maternal/gap driven (mg, green), and mixed but predominantly pair-rule (pr(mg), light red) or predominantly maternal/gap driven (mg(pr), light green); see text for details. For each gene, the number and type of modules in the control region is shown; grouping of genes is indicated by brackets and follows the hierarchy as depicted in (A). The type of regulatory input a gene receives is indicative of its position within the gene network.\n", - "1675 \n", - " Ahab Predictions and Recovery of Known Modules(A) Histogram of genome-wide window scores for the Ahab mg run (maternal/gap input, window size 500 bp, window shift 50 bp, background model 2). As free energy cutoff we chose 15, which is approximately four standard deviations above the genome-wide mean (indicated by light blue line).(B) Pie chart summarizing results of Ahab predictions for gap and pair-rule genes, including recovery of known modules and testing of novel predictions.(C–F) For the genomic regions of selected gap and pair-rule genes, the free energy profiles of two Ahab runs (mg and mgpr) are shown. The free energy cutoffs are marked by dotted lines; statistically significant predictions for the mg run are marked by black arrow heads (cf. Figure 4). In the header above, the blastoderm expression pattern of the locus is depicted schematically, anterior to the left, posterior to the right. The position of experimentally validated modules within the control region is delineated by colored bars; the aspect of the endogenous pattern they drive is highlighted in matching color. Overall, the control regions of the gap genes hb and Kr and of the primary pair-rule genes eve and h are computationally well delineated with maternal/gap input. References: (1) Schroder et al. (1988), (2) Margolis et al. (1995), (3) Hoch et al. (1990), (4) Goto et al. (1989), (5) Fujioka et al. (1999), (6) Riddihough and Ish-Horowicz (1991), (7) Howard and Struhl (1990), and (8) Langeland and Carroll (1993).\n", - "1677 \n", - " Expression Patterns Driven by Ahab-Predicted Modules IAhab-predicted modules in the control region of gap and pair-rule genes were tested by fusing putative modules to a basal promoter driving lacZ (module-basal promoter-lacZ; Thummel and Pirrotta 1991). The genomic regions, with free energy profiles, for two Ahab runs (mg and mgpr) are shown on the right. The free energy cutoffs are marked by dotted lines; mg run predictions with scores greater than 15 are marked by black arrowheads, tested subthreshold peaks with scores below 15 by open arrowheads. The transcribed region of the locus is marked in blue, the experimentally tested genomic regions are marked by pink bars and named according to distance from transcription start site to middle of the enhancer, and previously known modules are marked by orange bars. The endogenous gene expression is shown on the left (blue frame), the expression pattern driven by the module(s) in the center (pink frame). Embryos are oriented anterior to left, dorsal up. In a few cases, the patterns driven by Ahab-predicted modules are unfaithful to the endogenous gene expression; we distinguish “unfaithful” and insertion-dependent “unstable” patterns. For further description see text. (A) gt, (B) cnc, (C) oc, (D) D, (E) cad, (F) fkh, and (G) slp2. References: (1) Berman et al. (2002), (2) Gao and Finkelstein (1998), (3) Lee and Frasch (2000), and (4) Pankratz et al. (1992) and Rivera-Pomar et al. (1995).\n", - "1678 \n", - " Expression Patterns Driven by Ahab-Predicted Modules IISee legend for Figure 2. (A) kni, (B) knrl, (C) pdm2, (D) nub, and (E) odd.\n", - "\n", - "1679 \n", - " Ap Distribution of Binding Sites and Cognate Input Factors(A) Plots depict distribution of input factors (black) along the ap axis (anterior tip = 100, posterior tip = 0) (based on Myasnikova et al. [2001]) and the average number of binding sites (as measured by integrated profile values; Figure 4) found in all modules driving expression at a given percent EL (red) (see Materials and Methods). For TorRE, Bcd, and Cad, the distributions of binding sites and input factors are positively correlated. For Hb, Gt, and Kr, the distributions are negatively correlated; note that the number of binding sites is particularly high in modules expressed adjacent to the expression domain of these factors. In the case of Hb, modules with more Hb sites than Bcd sites (blue) show negative correlation with input factor distribution, and modules with fewer Hb sites than Bcd sites (green) show positive correlation, indicating bimodal function of Hb. For Kni and Tll, no clear correlations are found, possibly because of the unspecificity of their weight matrices.(B) Information scores of the Kr, Kni, and Tll weight matrices.\n", - "1694 \n", - " CA150/TCERG1, thioredoxin and IRF-1 protein expression by Jurkat T cells post CXCL12α treatment. Jurkat cells were treated for 24 hrs with either CXCL12 (A, B) or gp120 IIIB (A) at 1 μg/ml in the presence or absence of control mouse IgG, mouse anti-human CXCR4 mAb, or pertussis toxin (PTx; 200 ng/ml) at 37°C. After incubation, the cell pellets were isolated, counted, washed, and subsequently lysed with the detergent. Protein determinations were then performed. Samples were loaded at 20 μg per lane on a 10% polyacrylamide gel. After electrophoresis, the gels were transferred using a transfer apparatus to an immobilon membrane and stained for CA150/TCERG1 (A, B), thioredoxin (B) or IRF-1 (B) expression via Western blot analysis (shown in panel B for each of these proteins versus control). The results are expressed as fold change versus control expression (post background subtraction).\n", - "1716 \n", - " Subcellular localization of C3G. (A) Cos-1 cells grown on coverslip were either transfected with C3G or cotransfected with Hck and indirect immunofluorescence staining performed using anti-C3G antibodies and Cy3 conjugated anti rabbit secondaries. (B) Cells transfected with Hck and C3G were stained for both the antigens as described in Materials and Methods. Hck was visualized using FITC conjugated secondaries and C3G by Cy3 conjugated secondaries. The dual panel shows the merged image of an optical section taken using the confocal microscope where the yellow signal generated shows colocalization of the two proteins.\n", - "1717 \n", - " Specificity of phosphospecific antibody, and phosphorylation of C3G on Y504 upon coexpression with Src family kinases. Cos-1 cells were transfected with the expression constructs for Hck (A) or c-Src (B) along with C3G as indicated and western blotting of whole cell lysates was performed using the phosphospecific antibody pY504. The blots were reprobed with C3G, Hck and anti pTyr (Panel A) or Src (Panel B) to show their expression in the lysates. pY504 C3G and pTyr was detected by ECL and C3G, Hck and Src by alkaline phosphatase dependent color development. UT indicates untransfected cell lysates. Y504F is a mutant of C3G in which tyrosine 504 is replaced by phenylalanine.\n", - "1718 \n", - " pY504-C3G colocalizes with Hck and shows predominant Golgi and membrane localization. (A) pY504 C3G colocalizes with Hck. Cos-1 cells transfected with Hck and C3G were stained for pY504 C3G (Cy3) and Hck (FITC) and examined using a confocal microscope. Figure shows an optical section for the individual stains as well as that of the merged (Dual) image. (B) Cos-1 cells transfected with Hck and C3G were dual labeled to detect phospho-C3G (Cy3 staining) and C3G using the Flag tag antibody (FITC staining). Panels show optical sections taken using the confocal microscope. (C) pY504 C3G is localized to the Golgi apparatus. Cos-1 cells were transfected with Hck, C3G and VSVG-GFP expression constructs and stained using pY504 primary antibody and Cy3 conjugated secondary. An optical section taken using the apotome is represented. (D) HeLa or Cos-1 cells transfected with Hck and C3G were left untreated (control) or treated with pervanadate (PV) prior to fixation and stained for pY504. Counter staining with Dapi shows cell nuclei.\n", - "1719 \n", - " Phosphorylation of endogenous C3G upon overexpression of Hck and its localization to the Golgi. (A) Cos-1 cells were transfected with expression constructs as indicated and whole cell lysates used in western blotting for pY504-C3G. ECL was used for detection. Blots were reprobed to show expression of C3G and the kinases. (B) Endogenous pY504 C3G colocalizes with c-Src. Cos-1 cells were transfected with the c-Src GFP fusion protein vector and cells stained for pY504-C3G expression (Cy3). c-Src expression was visualized as GFP fluorescence. Images shown are optical sections taken using the apotome. (C) Endogenous pY504-C3G localizes to the Golgi. Cos-1 cells were transfected with Hck along with VSVG-GFP and stained for pY504 C3G. Cells were left untreated (control) or treated with nocodazole (Noc) prior to fixation as described in Methods. Panels show optical section for pY504 by Cy3 and the VSVG-GFP by GFP fluorescence.\n", - "1720 \n", - " Phosphorylation of endogenous C3G upon activation of endogenous tyrosine kinases. (A) Cells were either left untreated (UT) or treated with pervanadate (PV) and western blotting was performed using pY504 antibody. The same blot was reprobed with C3G to show the presence of endogenous C3G in these cells. (B) Cos-1 cells on coverslips were transfected with either C3G or Y504F mutant of C3G and fixed without any treatment (cont.) or after pervanadate treatment (PV). Dual labeling was performed using the tag antibodies (stained with FITC) and pY504 antibody (stained with Cy3). Panels show optical sections obtained by confocal microscopy. (C) Cos-1 and HeLa cells grown on coverslips and transfected with VSVG-GFP were fixed without any treatment (control) or after treatment with pervanadate and stained for pY504 expression. GFP fluorescence was used to visualize the staining pattern of VSVG-GFP protein. Optical sections taken using the apotome are shown. Areas of colocalization are seen from the yellow color generated in the merged images.\n", - "1721 \n", - " pY504C3G localizes to the subcortical actin cytoskeleton. (A) HeLa cells grown on coverslips were left untreated or treated with pervanadate and stained for pY504 expression using Cy3 secondaries. The coverslips were then stained with Oregon-green phalloidin to detect F-actin. (B) C3G phosphorylation requires the activity of Src family kinases and the presence of an intact cytoskeleton. HeLa cells were pretreated with PP2 or cytochalasin D as described in methods prior to pervanadate treatment. Images show the localization of pY504 C3G labeled with Cy3 and F-actin stained with oregon green. Images shown are a single optical section visualized using the apotome.\n", - "1745 \n", - " OHS cells are more sensitive than II-11b cells to IFN-γ-mediated suppression of cell viability. Cell viability was measured in OHS cells (A) and II-11b cells (B) after treatment with the indicated concentrations of IFN-γ for 24, 48 and 72 hours. In each experiment, untreated control cells were included at all time points, and all values are given as a percentage of corresponding untreated control cells. The results are presented as mean values ± S.D. of at least three independent experiments performed in triplicate. *, p < 0.0001 and **, p < 0.05 as compared to untreated control cells.\n", - "1786 \n", - " Scheme Representing Some NUMT Insertions in GenesFour known or predicted genes, found in loci with NUMT insertion in humans, have been schematically represented either in the absence (A) or in the presence (B) of the insertion. Boxes represent exons, and thick lines represent introns. Red boxes and lines indicate the sequence corresponding to the NUMT, which has been identified for each case. A dotted line in (A) indicates that, in the absence of insertion, the exon/intron pattern was not identified by gene identification programs. Representation not to scale.\n", - "1787 \n", - " The In Vivo Rescuing and In Vitro PG-Binding Activities of Wild-Type rPGRP-SA(A–E) Drosomycin-GFP expression in (A) wild-type and (B to E) PGRP-SAseml flies after challenge by M. luteus. (A and B) Water or (C to E) rPGRP-SA at variable concentrations was injected into Drosomycin-GFP flies prior to the challenge with M. luteus.\n", - "(F) rPGRP-SA binds to both lysine-type (M. luteus and E. faecalis) and DAP-type (E. coli and P. aeruginosa) PGs but not to amidated DAP-type (Bacillus subtilis and Bacillus thuringiensis) PG. The left lane (Input) is loaded with the same amount (20 μg) of protein used for the binding assay.\n", - "1788 \n", - " PGRP-SA Structure and Sequence Comparisons(A) Ribbon diagram showing the front view (left) and side view (right) of PGRP-SA. The ribbon is colored from N to C terminus in a progression from blue to red. Disulfide bridges are shown as sticks. The π helix turn at the end of the H2 helix is indicated.(B) Comparison of PGRP-SA (blue coil, from N to C) and PGRP-LB (green coil, from N′ to C′). (A) and (B) were prepared with Bobscript (Esnouf 1999), GL_RENDER (E. Esser, personal communication), and POV-Ray (Persistence of Vision Ray Tracer v3.1g).(C) Aligned sequences of selected PGRP domains, with a serine and a histidine at position 158 and position 42 of PGRP-SA (marked with asterisks), respectively, from Drosophila (d), mouse (m), and human (h). Secondary-structure elements in PGRP-SA are indicated above the alignment. Invariant residues are boxed in black and colored in white, conserved residues are shaded in yellow, and those lining the putative PG docking groove are in pink. The disulfide bond-forming Cys residues are boxed in gray. The residue number of PGRP-SA is shown above the alignment. The residues chosen for mutagenesis are marked with black circles. A structurally based alignment of the dPGRP-LB sequence is shown at the bottom with its amidase catalytic zinc-coordinating residues colored in red.\n", - "1789 \n", - " Structural Analysis of PGRP-SA(A and B) Molecular surfaces of (A) PGRP-SA and (B) PGRP-LB shown in similar orientations. Selected PGRP-SA residues on the putative PG docking groove are highlighted on the surface. Thr158 of PGRP-LB, the residue corresponding to Thr156 of PGRP-SA, is highlighted for reference.(C) Stick model of the PGRP-SA residues chosen for mutational analysis. Residues are colored with the same rainbow-coloring scheme as in Figure 2A. Figures were prepared with GRASP (Nicholls et al. 1991), Bobscript, GL_RENDER, and POV-Ray.\n", - "1790 \n", - " Mutational Analysis of PGRP-SA(A) Upper panel shows the wild-type and mutant rPGRP-SA pulled down by lysine-type PG from M. luteus. Lower panel (Input) shows the corresponding protein samples (20 μg) without incubation with PG.(B) The relative Toll signaling activities of the rPGRP-SA mutants. At least three repeats were performed for each experiment. Each bar represents the mean with the standard deviation. The values obtained for the wild type after M. luteus PG injection were arbitrarily set to 100 (upper dashed line). The background activity level is indicated by the lower dashed line. CTR, unchallenged control.\n", - "1791 \n", - " PGRP-SA Is an L,D-Carboxypeptidase(A) Chemical structures of the DAP-type muropeptide, GlcNAc-MurNAc(anhydro)-L-Ala-γ-D-Glu-meso-DAP-D-Ala, and lysine-type muropeptide, GlcNAc-MurNAc(anhydro)-L-Ala-γ-D-Glu-L-Lys-D-Ala, used in the enzymatic assays (substrates S1 and S2, respectively). The arrow indicates the site of cleavage of the DAP-type substrate S1 by the L,D-carboxypeptidase activity.(B–G) Reverse-phase HPLC analysis. Cleavage of the DAP-type substrate S1 by wild-type rPGRP-SA results in the generation of GlcNAc-MurNAc(anhydro)-L-Ala-γ-D-Glu-meso-DAP (P1 product). The position of the peak corresponding to standard GlcNAc-MurNAc(anhydro)-L-Ala-γ-D-Glu-L-Lys (P2 product, not generated by rPGRP-SA) is indicated.(B) Incubation of S1 without rPGRP-SA for 40 h.(C and D) Incubation of S1 with rPGRP-SA for (C) 24 h and (D) 40 h.(E) Incubation of S2 with rPGRP-SA for 70 h.(F and G) Incubation of S1 with the (F) S158C and (G) H42A mutants for 40 h.\n", - "1792 \n", - " DAP-Type PG-Binding Activities of the S158A/C and H42A Mutants and the Structure of the S158-H42 Dyad in the Active Site(A) Upper panel shows the wild-type and mutant rPGRP-SA pulled down by DAP-type PG from E. coli. Lower panel (Input) shows the corresponding protein samples (20 μg) without incubation with PG.(B) Stereo diagram showing the putative active-site residues. Prepared with Bobscript, GL_RENDER, and POV-Ray.\n", - "1794 \n", - " Summary of the Four Demographic Models Considered in Each Population(A) Schematic diagram of each demographic model and its associated parameters (see Materials and Methods for details). Parameter values that match the observed data most closely for European-Americans (EA) and African-Americans (AA) are shown below the diagrams.(B) Average and 95% confidence intervals of Tajima's D (blue bars), Fu and Li's D* (red bars), and Fu and Li's F* (pale yellow bars) for the observed data and each demographic model (using the parameters that most closely match the empirical data). Results from the standard neutral model (Constant) are also shown.\n", - "1795 \n", - " The Influence of Demographic History on Tests of Selection(A and B) The significance of observed values of Tajima's D (red), Fu and Li's D* (pale yellow), Fu and Li's F* (pale blue), and Fay and Wu's H (dark blue) were reassessed for each best-fit demographic model in European-Americans (A) and African-Americans (B). Results from the standard neutral model (Constant) are shown for comparison. The number of significant genes for each demographic model is noted above each category in (A) and (B). For example, there were a total of 19 significant test statistics across all four tests of neutrality assuming a bottleneck model for Europeans, which define ten unique genes. Therefore, each gene is supported by approximately two (19/10) tests of neutrality.(C) The distribution of the number of significant genes across the five demographic models in European-Americans and African-Americans. For example, in European-Americans, 40 genes were significant in at least one of the demographic models, and 27 genes were significant in at least two of the demographic models.\n", - "1797 \n", - " HIF-1–Dependent Effects of VHL-1 InactivationRepresentative RNase protection assays of genes that were differentially expressed in the vhl-1 versus wild-type microarray in (A) mixed-stage and (B) synchronized populations of worm. All genes are regulated by the VHL-1/HIF-1/EGL-9 pathway.(C) Regulation of nhr-57 mRNA in egl-9; vhl-1 worms and by egl-9 RNAi and DIP in vhl-1 worms. For RNAi experiments controls were L4440 vector alone (−) and C17G10.1, an irrelevant putative dioxygenase.F21C3.5 is a constitutively expressed gene used to control for RNA integrity. RNase protection assays were performed using worms cultured under normoxic conditions, unless otherwise indicated.\n", - "1798 \n", - " HIF-1–Independent Effects of VHL-1 InactivationRNase protection assays of genes that were differentially expressed in the hif-1; vhl-1 versus hif-1 microarrays in (A) mixed-stage and (B) synchronized populations of worm. The results confirm the existence of VHL-1–dependent, HIF-1–independent effects on gene expression.\n", - "1799 \n", - " Chromosomal Clustering of VHL-1–Dependent (HIF-1–Independent) Genes(A) Chromosomal localization of VHL-1–dependent, HIF-1–independent genes. The positions of the genes from Table 4 are indicated by vertical ticks along the C. elegans chromosomes (shown to scale). Where two such genes are too close to be clearly resolved, the tick is marked by an asterisk. The single significant spatial clustering of VHL-1–dependent, HIF-1–independent genes is indicated by a red rectangle. The histogram under each chromosome shows the gene density (deeper bar, greater density) calculated as a sliding window of 100,000 bp moving with 10,000-bp increments along each chromosome. Dark blue indicates total annotated gene density, and light blue indicates the density of genes from the microarray that passed preliminary quality control.(B) Organization of the VHL-1–regulated (HIF-1–independent) gene cluster from Chromosome V. The relative positions and sizes of gene transcription units are shown to scale, with genes transcribed left to right above the horizontal line and right to left below the line. Names in black indicate genes that passed all selection criteria to be considered upregulated in hif-1; vhl-1 versus hif-1 worms (see Table 4). Genes with a mean >2.0-fold upregulation are indicated by green boxes, 1.5- to 2-fold are yellow, and <1.5-fold are red. Genes for which no data were obtained are shown as light grey.\n", - "1800 \n", - " Responses of VHL-1–Dependent, HIF-1–Independent Genes to egl-9 Inactivation, Hypoxia, and 2-Oxoglutarate Dioxygenase InhibitorsRNase protection assays showing regulation of VHL-1–dependent, HIF-1–independent genes by (A) EGL-9 and hypoxia and (B) pharmacological inhibitors of 2-oxoglutarate dioxygenases: DIP and DMOG. None of the genes is regulated by EGL-9, but two genes (C01B4.7 and C01B4.8) show modest induction by hypoxia, DIP, and DMOG.\n", - "1801 \n", - " Sensitivity of VHL-1–Regulated Genes to Defects in Extracellular Matrix-Associated ProteinsRNase protection assays showing altered expression of VHL-1–regulated genes that are HIF-1 independent (upper six panels) and HIF-1 dependent (F22B5.4) in worms bearing mutations affecting (A) procollagen prolyl and lysyl hydroxylases and (B) other extracellular matrix-associated proteins. A common pattern of upregulation is observed in hif-1; vhl-1, vhl-1, dpy-18, let-268, gon-1, mig-17, and unc-6 worms but not other mutants. This contrasts with the HIF-1–dependent gene F22B5.4, which is upregulated in vhl-1 worms but none of the other mutants.(C) RNase protection assay for C01B4.9 illustrating DPY-18–mediated changes in expression that are independent of HIF-1.\n", - "1802 \n", - " Proportional Population Size and Gene Diversity of M. montanus and T. talpoides\n", - "(A) Proportional population size (relative abundance) of M. montanus and T. talpoides (n = 8,589 fossils) by years before present.(B) Gene diversity (H) of M. montanus and T. talpoides by years before present; 95% confidence intervals are shown. Squares indicate M. montanus; triangles indicate T. talpoides.\n", - "\n", - "1803 \n", - " Estimates of Ne_gen and Ne_ecol\n", - "(A) T. talpoides and (B) M. montanus through time. Circles and dashed lines show Ne_ecol estimates based on low-, high-, and moderate-density estimates. Ne_gen estimates ([A] triangles and [B] rectangles) are based on θS estimates from Arlequin. Standard errors for Ne_gen are represented.\n", - "1804 \n", - " Haplotype Networks for M. montanus and T. talpoides\n", - "Haplotype networks (Clement et al. 2000) for (A) M. montanus and (B) T. talpoides from Lamar Cave fossils and from modern specimens collected within a 400-km radius of Lamar Cave. Haplogroups for both species are indicated as A–D. Each haplogroup within a species is defined by at least 3% sequence divergence within the cytochrome b fragment. M. montanus haplogroup B is taken from GenBank. Haplogroup C is a sample from outside our 400-km radius (NK5897, Mono County, California; Museum of Southwestern Biology #53376). Light shading shows modern samples; dark shading shows fossil samples; bars indicate substitutions; cytochrome b sequence positions are indicated by number above base designation. Numbers within parentheses indicate sample sizes for each haplotype.\n", - "1807 \n", - " Verification of Gene Deletions(A) Verification of ddrA and recA gene deletions by PCR analysis. Purified PCR fragments were amplified from the genomic DNA of strains R1, TNK104, TNK106, and TNK110 using primers that flank the coding sequences for ddrA and recA. Products were separated on a 0.8% agarose gel to establish whether the fragment size corresponded to the gene-replacement cassette. The left panel depicts the replacement of ddrA in TNK104 and TNK110. The right panel depicts the replacement of recA in TNK106 and TNK110. Expected sizes of the wild-type and mutant sequences are given in the figure above each image of the agarose gel.(B) Verification of the ddrA gene deletion by restriction analysis of purified PCR products. Purified PCR fragments were amplified from the genomic DNA of strains R1, TNK104, and TNK110, using primers that flank the coding sequences for ddrA. Products were restricted with EcoR1 (left panel) and EcoRV (right panel) to verify their identity. Products were separated on a 0.8% agarose gel to establish whether the restriction fragment corresponded with the expected sizes as illustrated in the figure above each image of the agarose gel.(C) Verification of the recA gene deletion by restriction analysis of purified PCR products. Purified PCR fragments were amplified from the genomic DNA of strains R1, TNK106, and TNK110, using primers that flank the coding sequences for recA. Products were restricted with PvuII (left panel) and BglII (right panel) to verify their identity. Products were separated on a 0.8% agarose gel to establish whether the restriction fragment corresponded with expected sizes as illustrated in the figure above each gel.\n", - "1808 \n", - " DNA Damage Sensitivity of D. radiodurans Cells Lacking DdrA Function(A) Representative survival curves for D. radiodurans strain TNK104 ΔddrA (squares) and D. radiodurans R1 (circles) following exposure to γ radiation. Survival of strains; values are the mean ± standard deviation of three independent experiments; n = 9.(B) Representative survival curves for D. radiodurans strain TNK104 ΔddrA (squares) and D. radiodurans R1 (circles) following exposure to mitomycin C. Values are the mean ± standard deviation of three independent experiments; n = 9.\n", - "1810 \n", - " Genome Recovery in the Absence of Nutrients Depends on DdrA(A) Pulsed-field gel electrophoresis analyses of D. radiodurans strain RI recovery over a 120 h time course in 10 mM MgSO4 following 5,000-Gy γ radiation.(B) Pulsed-field gel electrophoresis analyses of D. radiodurans strain TNK104 (ΔddrA) recovery following 5,000-Gy γ radiation.\n", - "1811 \n", - " DdrA Protein Effects on In Vivo Survival and Genome Preservation following Exposure to Ionizing Radiation in the Absence of Nutrients(A) Survival of D. radiodurans R1 and TNK104 cultures held in 10 mM MgSO4 for 120 h following exposure to 5,000-Gy γ radiation. Samples were obtained at 24-h intervals. All values are the mean ± standard deviation of three independent experiments; n = 9(B) Changes in DNA content in cultures of R1 and TNK104 recovering from exposure to 5,000-Gy γ radiation in MgSO4. The DNA concentration at each time point is expressed as a percentage of that present in each strain prior to irradiation.\n", - "1813 \n", - " DdrA Protein Binds to Single-Stranded DNA with Free 3′ EndsFour sets of EMSAs are presented, with the gels and electrophoresis conditions carefully matched. DNA substrate concentrations are 0.7 nM in each case, reported as total molecules. In each set, the first three lanes show the effects of the indicated concentration of DdrA protein. The fourth and fifth lanes are identical to the second and third lanes, respectively, except that they are treated with proteinase K to demonstrate that the DNA has not been altered. In set D, the sixth and seventh lanes are identical to the third lane (with 4 μM DdrA protein), except that they have been challenged with a 1,000-fold or 2,000-fold excess of unlabeled oligo with a 5′ extension, respectively. The unlabeled challenge oligo is the same as that used in reaction set C.(A) Single-stranded oligonucleotides (51 nt in length), labeled on the 5′ end.(B) 5′ end–labeled duplex DNA fragments (51 bp).(C) 5′ end–labeled oligonucleotide, with a self-complementary sequence leading to the formation of an 18-bp hairpin and a 15-nt 5′ single-stranded extension.(D) 3′ end–labeled oligonucleotide, with a self-complementary sequence leading to the formation of an 18-bp hairpin and a 16-nt 3′ single-stranded extension. The sequences of the single-stranded extensions in the oligos used in sets C and D are matched, except that an extra adenosine residue has been added to the oligo used in set D during the labeling process. Note that in set B, only the lower substrate band (unannealed oligonucleotides) is bound by DdrA, and the migration of the resulting complexes is identical to that shown in set A.\n", - "1814 \n", - " DdrA Protein Protects 3′ Ends from Degradation by Exonuclease I(A) This set of reactions uses the labeled duplex DNA illustrated. The oligos annealed to form this DNA are 51 and 37 nt in length and pair so as to leave a 14-nt 3′ extension. The shorter DNA is 5′ end–labeled. The first lane contains unreacted DNA, showing both the annealed duplex and the unannealed single-stranded DNA. The second lane shows the DNA after treatment with 3 units of exonuclease I for 7 min in a 15-μl reaction mixture. Note that the duplex DNA in the upper band has been shortened by removal of the single-stranded extension. In lanes 3 and 4, the DdrA protein (4 μM) has been incubated with the DNA, without and with the 3 units of exonuclease I, respectively. The DNA is bound by DdrA and shifted to the top of the gel. The reactions shown in lanes 5 and 6 are identical to those in lanes 3 and 4, but with SDS and proteinase K added to disrupt the DdrA–DNA complexes and reveal that the DNA has been minimally affected by exonuclease I. The final lane shows another reaction of the DNA with 3 units of exonuclease I, in the presence of 4 μM bovine serum albumin. Exonuclease I degrades single-stranded DNA in the 3′ to 5′ direction.(B) The protein bound to the duplex DNA is DdrA. The reaction of lane 3 in (A) was scaled up and the protein–DNA complex excised from the gel as described in Materials and Methods. The protein in this complex was subjected to electrophoresis on an SDS-polyacrylamide gel, shown here (lane 3). The control lanes contained prestained protein standards (lane 1) and purified DdrA protein (lane 2). The gel-extracted protein comigrated with DdrA.\n", - "1820 \n", - " The structure of the active HotDog domain dimer. (A) A ribbon representation of the Escherichia coli FabA dimer (PDB code: 1MKB), viewed along the dyad axis. Each 171-residue subunit contains a Hotdog fold/ domain, consisting of a seven-stranded antiparallel b-sheet 'bun', coloured magenta and green, and a five-turn a-helical 'sausage' coloured blue and purple in the respective subunits. The Hotdog fold is best observed in Figure B. There are two independent active sites located between the dimers, the active site residues of His70 from one subunit and Asp84 from the other subunit, represented as a ball-and-stick model with CPK colouring (carbon, black; hydrogen, white; oxygen, red; nitrogen, blue), constitute the potential reactive protein groups in the active sites [1]. (B) A view of FabA rotated 90° along the dyad axis. The figures were generated with MOLSCRIPT [69] and rendered with RASTER3D [70].\n", - "1823 \n", - " CBFA2T3 gene structure and promoter methylation patterns. (A) CBFA2T3 encodes two alternative transcripts, CBFA2T3A and CBFA2T3B. CBFA2T3A is encoded by exons 1A and 2–12. CBFA2T3B is encoded by exons 1B-12 splicing out exon 3. Relative exon sizes are shown. The exon 1A start site contains no CpG island. The black box marks the location of a high-density CpG island located five prime to the exon 1B start site. The black arrowheads mark the primers used for real-time RT-PCR. (B) CBFA2T3B contains a CpG island of approximately 160 CpG sites spanning 1-kb of sequence. The single black bars represent CpG sites scaled relative to each other. CAT ELISA promoter constructs and primers used for MSP, real-time MSP and bisulfite sequencing are shown. The asterisk marks the location of the amplicon and internal primers used for second-round real-time MSP. (C) CBFA2T3B promoter methylation patterns were examined in hypermethylated cell lines using sodium bisulfite sequencing. A characteristic sinusoidal pattern of approximately six high to low frequency methylation levels every 40–150 bp was detected. The high-frequency cytosine methylation levels residing within a consensus Sp1 binding site located approximately minus 450 bp from the transcriptional start of exon 1B are shown.\n", - "1824 \n", - " CBFA2T3 gene expression levels, 5-Aza-dC re-expression and promoter activity. (A) CBFA2T3 gene expression levels were assayed using real-time RT-PCR. Several breast tumor cell line and normal tissue sample expression levels are shown. The y-axis represents mRNA mlcls expressed per 104 cells shown on a log scale (mean ± SD, n = 6). Fold changes in expression relative to normal breast expression are shown above each sample. The white diamonds and white squares represent expression levels of the housekeeping genes cyclophilin A (CYPA) and ATPase coupling factor 6 subunit (ATP5A), respectively. CBFA2T3B and CBFA2T3 expressed at endogenously low yet aberrant levels in breast tumor cell lines. Using normal breast as a reference, CBFA2T3B (600 mRNA mlcls per 104 cells) and CBFA2T3 (1,800) were low compared to ATP5A (600,000) and CYPA (1,600,000). CBFA2T3 expression ranged 30,000-fold from 4 to 120,000 mRNA mlcls per 104cells in MDA-MB-231 and BT-483, respectively. In contrast, CYPA and ATP5A expression ranged 2-fold and 20-fold, respectively (100–200 and 15–300 mRNA mlcls per cell). Expression levels were also examined in several primary breast tumor samples for which total RNA was available (see Figure 6). (B) CBFA2T3 re-expression levels were examined in MDA-MB-231 cells using 5-Aza-dC. Fold changes in CBFA2T3B, CBFA2T3 and SYK expression levels are shown upon exposure to 5-Aza-dC relative to control untreated cells. > 100-fold re-expression was detected in CBFA2T3 and CBFA2T3B. 5-Aza-dC had no affect on CBFA2T3A expression (data not shown). > 1,000-fold re-expression was also detected in SYK, a control gene known to be hypermethylated and down-regulated in MDA-MB-231 cells. (C) CBFA2T3B promoter activity was assayed using CAT ELISA. Promoter constructs labeled A to D (see Figure 1B) were inserted upstream of the CAT reporter in pBLCAT3 (Boehringer Mannheim). pBLCAT2 driven by the tyrosine kinase promoter was used as a positive control. 2.0 × 106 293T cells were transfected in triplicate using Lipofectamine 2000 (Invitrogen) with 1.5 μg of construct and control vector and 0.3 μg of the internal pSVβ-galactosidase control vector (Stratagene). Cells were lysed after 24 h and CAT concentrations determined using ELISA. Of the four constructs labeled A to D, the 1-kb B construct promoted a 30-fold increase in CAT expression (mean ± SD are triplicates, n = 3).\n", - "1825 \n", - " CBFA2T3B promoter methylation levels examined using MSP. The full results of this analysis in breast tumor cell lines, primary breast tumors, normal breast counterparts and normal whole blood samples are summarized in Additional file 2. (A) An example of the characteristic basal methylation levels detected in all samples is shown for normal blood samples examined at region 2. (B) An example of the complex high to low methylation levels is shown for 20 primary breast tumor samples with adjacent normal breast counterparts. The pUC19 DNA/MspI marker concentrations reflect an approximate concentration of 100 to 1 unmethylated to methylated mlcls. The asterisks indicate the samples examined by bisulfite sequencing.\n", - "1838 \n", - " Northern analysis of P-450 induction in rGMCs treated with BaP, ANTH and their binary mixtures. mRNA expression of Cyp1a1 in rGMCs challenged with BaP, ANTH and their binary mixtures for 24 hr (A). mRNA expression of Cyp1b1 in rGMCs challenged with BaP and ANTH and their binary mixtures for 24 hr (B). RNA extraction and analysis were performed as described in methodology. β-tubulin was analyzed to asses loading and transfer efficiency. These results shown are representative of three separate experiments.\n", - "1839 \n", - " Northern analysis of P-450 induction in rGMCs treated with BaP, CHRY and their binary mixtures. mRNA expression of Cyp1a1 in rGMCs challenged with BaP and CHRY and their binary mixtures for 24 hr (A). mRNA expression of Cyp1b1 in rGMCs challenged with BaP and CHRY and their binary mixtures for 24 hr (B). RNA extraction and analysis were performed as described in methodology. β-tubulin was analyzed to asses loading and transfer efficiency. These results shown are representative of three separate experiments.\n", - "1850 \n", - " GST-B4 peptide binds to HIV-1 Vpr in S. cerevisiae and rescues cell growth. (A) GST pull-down from yeast extracts. S. cerevisiae HP16 strain co-transformed with GST or GST-B4 plasmids and (R+) or (R-) Vpr expressor were metabolically-labeled with 150 μCi of 35S-Translabel in Vpr-inducible medium. Half volume of the cell extract was used for GST pull-down, while the remaining lysates were subjected to immunoprecipitation with polyclonal anti-Vpr antiserum. Total and GST-bound radiolabeled Vpr proteins were detected by autoradiography after SDS-PAGE. (B) GST-B4 suppression of Vpr-induced cell growth arrest. Yeast co-transformants were grown in non-inducible selective medium for two days. Similar number of yeast cells were then serially diluted, spotted onto either Vpr non-inducible (Trp-/Ura-, 2% raf) or Vpr-inducible plates (Trp-/Ura-, 2% gal) and incubated for 3 to 5 days to evaluate their growth rates. This data is representative of results obtained in two independent experiments\n", - "1851 \n", - " HIV-1 Vpr mutants exhibit differential GST-B4 binding abilities. Each Vpr mutant used in this study with the exact location of the introduced mutation is described (A). (B) GST pull-down using a panel of Vpr mutants. Assays were performed as described in Fig. 1A. Protein extracts were prepared from radiolabeled cells expressing GST (lanes 1–2) or GST-B4 proteins (lanes 3–17) alone (R-), or in presence of wild-type Vpr (R+) or different mutant proteins, as indicated. Vpr bound to GST-B4 (upper panel) and the total amount of Vpr as determined using immunoprecipitation with anti-Vpr antiserum (lower panel) were separated by SDS-PAGE and detected after autoradiography. (C) The percentage of GST-B4-bound Vpr relative to the total amounts of Vpr for each mutant was quantified by autoradiography scanning and the level of wild type Vpr bound to GST-B4 was arbitrarily set as 100%. These data are representative of at least two independent experiments.\n", - "1893 \n", - " Expression of IGFBP3 and RXRalpha in human prostate tissues. Immunohistochemical staining for IGFBP3 is present as brown staining in normal prostate (A) and prostate cancer (C). Similarly RXRalpha expression is present in normal prostate (B) and lost in prostate cancer (D). All images recorded at 100× magnification.\n", - "1895 \n", - " Negative selection of developing thymocytes (A) TCR transgenic expression within thymic CD8SP (white) and CD4SP cells (grey) identified by the anti-clonotypic monoclonal antibody 6.5 in SFE-Tg mice six days after IT injection of 40 to 60 ng p24 of the LvPGK-GFP lentiviral vector (n = 2) or of 3.5 to 6 ng p24 of the LvPGK-HA vector (n = 3). Shown are representative profile of two independent experiments. Numbers indicate the frequency of 6.5+ cells (B) Absolute counts of HA-specific thymocytes six days after intra thymic injection of LvPGK-GFP or LvPGK-HA lentiviral vectors. These figures were obtained based on the percentages of total 6.5+ thymocytes determined by flow cytometry as shown in (A). Statistical analysis was performed using Student's t-test.\n", - "1916 \n", - " Networks of genes commonly regulated after tipifarnib treatment. (A) Twenty-three genes that were down-regulated in patient leukemic cells and AML cell lines were analyzed by the Ingenuity Pathway Analysis tool. The shown major network that was found to be significantly down-regulated by tipifarnib was associated with proliferation (p = 10-10). (B) Twenty-nine genes that were up-regulated were also analyzed for associated networks that were significantly affected by tipifarnib. The shown network was significantly associated with apoptosis (p = 10-10) and immunity (p = 10-7). Shaded genes are the genes identified by microarray analysis and others are those associated with the regulated genes based on the pathway analysis. The meaning of the node shapes is also indicated. Asterisks indicate genes that were identified multiple times.\n", - "1917 \n", - " Detection of tipifarnib-mediated apoptosis in AML cells. (A) Annexin V staining shows that a decrease in cellular proliferation correlates with an increase in apoptosis in the THP1 cell line following treatment with tipifarnib. (B) Apoptosis assay of control and treated cells at day 5. Annexin V stains both apoptotic and necrotic cells, propidium iodide stains necrotic cells only.\n", - "1934 \n", - " Representative immunohistochemical analysis of isolated placental cells (6–8 w) after 24 h in culture. (A) Cells stain positive for anti-human cytokeratin 7 (1:100, Biogenics). (B) Cells stain negative for anti-human vimentin (1:200, Zymed). Magnification: ×100.\n", - "1935 \n", - " (A) Representative secretion pattern of proMMP-2 (72 kD) and proMMP-9 (92 kD) in 6–8 w, 9–12 w trophoblasts and in JAR cells without treatment as examined with zymography. (B) Bar graph describing the relative percentage of gelatinases secretion, representing mean ± SEM from 5 independent experiments. Black bars represents proMMP-2 and white bars represent proMMP-9, *P < 0.05.\n", - "1936 \n", - " Dose-dependent effect of Forskolin and EGF on gelatinase secretion in JAR cells. JAR cell (1 × 104/well) were incubated 48 hours with or without Forskolin (1 μM, 10 μM or 100 μM) or EGF (0.8 ng/ml, 8 ng/ml or 80 ng/ml) and media collected for measurement of Gelatinase secretion. (A) Bar graph, representing mean ± SEM of 10 independent experiments, of cells treated with forskolin. (B) Bar graph, representing mean ± SEM of 10 independent experiments, of cells treated with EGF. Black bars represent proMMP-2 and gray bars represent proMMP-9. *P < 0.05 vs. control.\n", - "1937 \n", - " Secretion of proMMP-2 and proMMP-9 after 48 hours incubation of JAR cells, 1st trimester trophoblast cells 6–8 week or 1st trimester trophoblast cells 9–12 week in medium in absence or presence of 10 μM Forskolin. (A) Representative zymography gels. (B) Bar graph, representing mean ± SEM from 10 independent experiments detecting proMMP-2 (72 kD). (C) Bar graph, representing mean ± SEM from 10 independent experiments detecting proMMP-9 (92 kD). White bars represent control medium of cells without treatment. Black bars represent medium from cells with forskolin treatment. *P < 0.05 vs. control.\n", - "1938 \n", - " Secretion of proMMP-2 and proMMP-9 after 48 hours incubation of JAR cells, 1st trimester trophoblast cells 6–8 week or 1st trimester trophoblast cells 9–12 week in medium in absence or presence of 8 ng/ml EGF. (A) Representative zymography gels. (B) Bar graph, representing mean ± SEM from 10 independent experiments detecting proMMP-2 (72 kD). (C) Bar graph, representing mean ± SEM from 10 independent experiments detecting proMMP-9 (92 kD). White bars represent control medium of cells without treatment, black bars represent medium from cells with EGF treatment. *P < 0.05 vs. control.\n", - "1939 \n", - " Cell invasion ability of JAR cells, 1st trimester trophoblast cells 6–8 week or 1st trimester trophoblast cells 9–12 week tested with Transwell Invasion Assay. (A) represents JAR cells, (B) 1st trimester trophoblast cells 6–8 week and (C) 1st trimester trophoblast cells 9–12 week. Cells were treated with 10 μM Forskolin and incubated 36 hours on Matrigel coated membrane, with or without MMP-2 or MMP-9 inhibitory antibodies. Cells that invaded the membrane to lower well were counted with XTT. Results represent mean ± SEM from 10 independent experiments. Black bars represent control (cells without treatment or cells treated with Forskolin) with no antibodies. Gray bars represent cells (without treatment or treated with Forskolin) with addition of MMP-2 inhibitory antibody. White bars represent cells (without treatment or treated with Forskolin) with addition of MMP-9 inhibitory antibody. ANOVA for all groups results in p < 0.05, post test confirmed the t test results. *P < 0.05\n", - "1940 \n", - " Cell invasion ability of JAR cells, 1st trimester trophoblast cells 6–8 week or 1st trimester trophoblast cells 9–12 week tested with Transwell Invasion Assay. (A) represents JAR cells, (B) 1st trimester trophoblast cells 6–8 week and (C) 1st trimester trophoblast cells 9–12 week. Cells were treated with 8 ng/ml EGF and incubated 36 hours on Matrigel coated membrane, with or without MMP-2 or MMP-9 inhibitory antibodies. Cells that invaded the membrane to lower well were counted with XTT. Results represent mean +SEM from 10 independent experiments. Black bars represent control (cells without treatment or cells treated with EGF) with no antibodies. Gray bars represent cells (without treatment or EGF treated) with addition of MMP-2 inhibitory antibody. White bars represent cells (without treatment or EGF treated) with addition of MMP-9 inhibitory antibody. ANOVA for all groups results in p < 0.05, post test confirmed the t test results. * P < 0.05.\n", - "1946 \n", - " Stability of E2-BSA-FITC. E2-BSA-FITC (10-8 M in estrogen) was placed in empty wells or wells containing MC7 cells and incubated for 30 minutes at 4°C. E2-BSA-FITC was detected by reverse phase HPLC using a methanol-water gradient from 80% methanol to 50% methanol over 30 minutes at 1.0 ml/min. The assay was run in triplicate. Representative spectra are shown for E2-BSA-FITC alone (A) and E2-BSA-FITC incubated with MC7 cells (B).\n", - "1947 \n", - " The Secteur and its transmission through contamination tests in Nectria haematococca. (A) Wild-type strain exhibiting three spontaneous Secteurs (1, 2, 3). (B) s*789 mutant. (C) Contamination tests, using plugs from a Secteur or from s*789, on wild type (wt), result in one Secteur at each infection point. (D)Contamination tests on s1 mutant did not result in the induction of any Secteur at the infection points.\n", - "1948 \n", - " Selection of Nectria haematococca mutants affected in the expression of the Secteur. (A) Compares the morphology of a Normal growing culture (N) and of a ZiS culture (modified culture obtained by excision from a Secteur). (B) A 4-day ZiS culture submitted to UV mutagenesis. Note the emergence of four fast-growing sectors, which correspond to nas mutants.\n", - "1949 \n", - " Phenotypic characterization of transformants. (A) Detection of a nas mutant phenotype among 12 transformants. Arrows indicate some Secteurs. (B) Summary of the different mutants recovered among the 5000 transformants: 152 were altered in pigmentation (99 reddish, 16 white/beige/yellow, 37 greenish), 45 were altered in colony morphology (12 irregular, 12 compact, 19 colonial, 2 fluffy), and 10 were affected in the expression of the Secteur (9 nas and 1 s).\n", - "1950 \n", - " Analysis of pAN7-1 integration pattern in s2.(A) Southern blot analysis of total genomic DNA of s2 digested with ClaI, which does not cut the plasmid (lane 1), and BamHI, which cuts once in pAN7-1 (lane 2), and probed with the pAN7-1 vector. Sizes are indicated in kilobases (kb). (B) Restriction map of the pAN7-1 integration point in s2. Wild-type genomic DNA is shown as a thick line, pAN7-1 sequences are represented by the open bar, and the dotted line stands for unknown sequences. The fragment LI is inserted at the bacterial replication origin (ORI). SI is truncated and carries a part of hph and of tTrpC.\n", - "1953 \n", - " Schematic representation of the Ses locus of Nectria haematococca. (A) Open reading frames larger than 200 aa or showing sequence similarity to other genes are represented by gray arrows. Black arrows represent sequences in inverted repeated orientation: repeat 1 is 290 bp long; repeat 2 is 79 bp long; repeat 3 is 32 bp long; and repeat 4 is 93 bp long. Thick lines: subclones able to restore the Secteur modification in s* mutants. (B) Detailed map of the region between oligonucleotides im317 and ip2393c. Vertical bold lines: position of the indicated mutations. Insertion: integration point of pAN7-1 in s2. Black lozenge: polyadenylation site.\n", - "1954 \n", - " SesA and SesB conservation during evolution. (A) Alignment of SesAp with its homologues in Fusarium graminearum (F. gra 214 and F. gra 201) and Podospora anserina (P. ans). The amino acid change in s1 is boxed. (B) Alignment of SesBp with representative homologues from F. graminearum (Fg1 and Fg2; the sequence was obtained from the Fungal Genome Initiative, ), P. anserina (Pa; ), Homo sapiens (Hs; GENBANK: BC001705), Drosophila melanogaster (Dm; GENBANK: AAF5369), and Caenorhabditis elegans (Ce; PIR: T21079). Arrowheads indicate the amino acid changed in s*4, s*789, and s*18; arrow indicates the position of the frameshift in s*27. (C) Conservation of Ses organization in F. graminearum. SesA corresponds to F. gra 214 of (A) and SesB corresponds to Fg1 of (B). Percentages of identity with Nectriahaematococca SesAp and SesBp are 41% and 79%, respectively. In (A) and (B), conserved amino acids are shaded. Color reflects the degree of conservation.\n", - "1956 \n", - " Models integrating functional elements of Secteur expression in Nectria haematococca. (A) First model: In the wild-type strain, the product of the SesA and SesB genes can exist in a normal state (AN and BN) and in a modified state (AS and BS). AS determines overproduction of pigments and BS is responsible for growth alteration. (B) Second model: The product of SesA, SesAp, is responsible for pigmentation. The product of SesB, SesBp, has a catalytic activity necessary for the normal growth. These two products negatively regulate each other, and the equilibrium constants favor SesAp. In juvenile thalli, only SesBp is produced, but SesAp can be randomly produced, switching to a new state with a majority of SesAp.\n", - "1958 \n", - " Potential, K+ concentrations and pigmentation of stria vascularis in Slc26a4+/+ and Slc26a4-/- mice. a: Endocochlear potential and K+ concentrations in endolymph and perilymph at the apex (A) and base (B) of the cochlea. Numbers adjacent to symbols denote number of measurements. b-d: Pigmentation of stria vascularis in Slc26a4+/+ and Slc26a4-/- mice. b: View of stria vascularis through the bony capsule of the cochlea. OW, oval window, RW, round window; arrows, stria vascularis. c-d: Whole-mounts of stria vascularis isolated from age-matched mice. c: Laser-scanning images, bar = 10 μm, d: Quantification of pigmentation based on optical density.\n", - "1970 \n", - " Co-localization of VHA-subunits with the tonoplast marker γ-Tip and calreticulin, a marker for the ER. Confocal images represent single images of isolated maize root cells which were immuno-probed with antibodies directed against marker polypeptides of the vacuolar membrane (γ-Tip) and endoplasmatic reticulum (calreticulin) and simultaneously treated with anti-VHA-antibodies. Secondary fluorescently labelled antibodies used were anti-rabbit-FITC (A), anti rabbit-Cy3 (B, E, H), anti-mouse-FITC (D, G, J) or anti-guineapig-Cy5 (K). Images were colour coded with Adobe Photoshop. Scalebars are 10 μm. In each row, the immuno-decoration with the marker, with the VHA-subunit specific antibody and the superposition of both is shown. (A-C) Root cell labelled with γ-Tip (A) and VHA-A (B). Note the complete co-localisation of the both markers on the tonoplast of small vacuoles (C). (D-F) Double-staining with calreticulin (D) and VHA-A. (G-I) Double-labelling of a root cell with calreticulin (G) and VHA-E (H) reveals a similar result as with VHA-A. Tonoplast labelling and ER-staining are distinct. (J-L) Co-labelling with calreticulin (J) and VHA-aN-term reveals a complete co-localisation of the two signals on the ER.\n", - "1971 \n", - " Immunogold-based localisation of VHA-a. Ultra-thin cross sections of maize root cells in 1 mm distance to the tip were decorated anti VHA- (A), premmune serum, (B), anti VHA-aN-term-antibody (C,D), respectively. Sections were washed, treated with secondary antibody linked to 15 nm gold particles and visualized in an electron microscope.\n", - "1972 \n", - " FRET between VHA-subunits co-expressed in protoplasts of A. thaliana and onion epidermis cells. (A) Mesophyll protoplasts of A. thaliana were simultaneously transformed with p35S::VHA-a/YFP and p35S::VHA-c/CFP using the polyethylene glycol method. After 20 h, fluorescence emission from protoplasts was measured following excitation at 458 nm and 514 nm, and image analysis in the range of 470 – 500 nm for CFP and 560 – 585 nm for YFP fluorescence, respectively. (B) Acceptor bleaching in dependence on scan numbers. For this experiment, protoplasts expressing VHA-a-YFP were excited at 514 nm and emission was recorded between 550 and 600 nm. (C) Emission spectra of VHA-c-CFP and VHA-a-YFP before (solid line) and after (broken line) acceptor bleaching. (D) FRET between VHA-A-YFP and VHA-B-CFP after co-expression in onion epidermis cells. Excitation was achieved at 458 nm, and 2D emission images were recorded in the range of 470 to 510 nm (CFP), and 550 to 600 nm (YFP).\n", - "1973 \n", - " Membrane topology of plant VHA-a and location of the C-termini of individual subunits based on the FRET data. Based on amino acid sequence analysis and similarity with Vph1 (Leng et al. 1999), the topology of Mc-VHA-a is depicted in (A). The relative location of amino acid residues essential for proton pumping or structure are indicated with boxes. The numbers indicate the amino acid positions. In (B), the results from the FRET experiments are summarized: Asterisks tentatively mark the positions of the C-termini where the GFP variants have been fused to.\n", - "1984 \n", - " Phase II: Ca2+/Mg2+ Transport. (A) Free energy released from ATP hydrolysis by E-NTPase on the outer membrane surface would yield -7.3 kcal mol-1 or by formation of AMP by E-NTPDase would yield -10.9 kcal mol-1. (B) The energy is utilized for opening the channel formed by the E-NTPase/E-NTPDase, by altering the conformation of the sensors. This altered conformation has an inherent channel-opening effect; loss of the energy source causes the sensors to revert to the resting state, which corresponds to channel closing.\n", - "1985 \n", - " Phase II: Ca2+/Mg2+ Transport. (A) Three-dimensional impression of the E-NTPase/E-NTPDase in vivo. (B) It is possible that Ca2+ can enter the cell and excess Mg2+ can leave via the influx/efflux mechanisms depicted in the figure.\n", - "1986 \n", - " Phase III: Termination of the transport processes. (A) Several factors might contribute to the termination of Ca2+/Mg2+ transport via channel gating by E-NTPase/E-NTPDase: extracelluar and Intracellular. Additional experimental evidence is mentioned. Decreased flow of Ca2+/Mg2+ due to closing of the channel gate.\n", - "1987 \n", - " Phase III: Termination of the transport processes. (A) Three-dimensional impression of the E-NTPase/E-NTPDase in vivo when termination of the ion transport function commences. (B) Biochemical modifications of the E-NTPase/E-NTPDase oligomers such as deglycosylation would probably cause instability, leading to dissociation of the homo-oligomers. Disassembly of the functional molecule would ensue, closing the Ca2+ influx and Mg2+ efflux processes, as portrayed in the figure.\n", - "1988 \n", - " Mendel's diagrammatic explanation for the formation of the F2 population of plants produced by self-fertilisation of his F1 hybrids. Mendel proposed that F1 hybrids (Aa) contained a dominant trait (A) that was displayed and a recessive trait (a) that was not displayed. Self-fertilisation of F1 hybrids (Aa) then involved segregation of the component traits (A) and (a) into individual male pollen and female germinal cells, as shown in his diagram. Mendel proposed that if a male pollen cell carrying a trait (A) fertilised a female germinal cell carrying the same trait (A), the progeny would display trait (A). He used the analogous argument for the generation of progeny bearing trait (a). Only if male and female sex cells carried differing forms of a given trait (A or a but not both) would the progeny be hybrids (Aa). Thus random recombination of the segregated traits during self-fertilisation of hybrids would yield (on average) the F2 population of plants represented by the trait series (A + 2Aa + a) shown below Mendel's original diagram.\n", - "2025 \n", - " HIV-1 5' RNA Structural Elements. Illustration of a working model of the HIV-1 5' UTR showing the various stem-loop structures important for virus replication. These are the TAR element, the poly(A) hairpin, the U5-PBS complex, and stem-loops 1–4 containing the DIS, the major splice donor, the major packaging signal, and the gag start codon, respectively. Nucleotides and numbering correspond to the HIV-1 HXB2 sequence. (Adapted from Clever et al. [73] and Berkhout and van Wamel [136])\n", - "2058 \n", - " Spontaneous activity of PNC is independent from tonic excitatory input. A single electric shock delivered to the optic tract lateral from the recorded neuron evokes a single peak EPSC (A) that completely disappears after AMPA receptor blockade by bath application of 20 μM CNQX (E). In contrast, the spontaneous firing rate recorded in control situation (B) does not change after AMPA receptor blockade (F). Removing excitatory input does also not change the regularity of the firing as derived from the distribution of interspike intervals (C vs. G) or from the autocorrelogram (D vs. H).\n", - "2059 \n", - " Tonic synaptic input does not contribute to the generation of spontaneous activity in PNC cells. Postsynaptic responses obtained by electrical optic tract stimulation (A) can also be blocked by bath application of 1.5 mM CoCl2 (D). However, the spontaneous firing rate recorded in control situation (B) does not change after removal of synaptic input (E). Removing excitatory input does also not change the regularity of the firing as derived from the distribution of interspike intervals (C vs. F).\n", - "2060 \n", - " Spontaneous activity in PNC cells depends on a sodium conductance. In control solution (A) this cell showed regular firing pattern with depolarizing inward currents preceding each action potential. When 1 μM TTX was added to the bath the firing rate dropped at the beginning of TTX application (B). In the presence of TTX, both action potentials and depolarizing inward currents completely disappeared 5 min later (C).\n", - "2071 \n", - " Time course of mRNA accumulation in cucumber leaves after BTH treatment (A) or C. lagenarium inoculation (B). A: Total RNA was extracted from cucumber leaves at various time after application of 10 μM BTH or water (mock treatment). RNA (15 μg) from leaves 1 and 2 (treated) and leaves 3 and 4 (untreated) was fractionated by electrophoresis on agarose gels. Identical Northern blots were probed with 32P-labeled PR-8, CPR and CGT cDNAs. B: Total RNA was extracted from cucumber leaves at various time after C. lagenarium inoculation. RNA (15 μg) from untreated leaves (UT), leaves 1 (infected) and leaves 2, 3 and 4 (non infected) was fractionated by electrophoresis on agarose gels. Identical Northern blots were probed with 32P-labeled PR-8, CPR and CGT cDNAs. Equal loading of RNA was confirmed by ethidium bromide (Et Br) staining. A representative gel is shown.\n", - "2132 \n", - " Representative micrographs from the ovary of immature rats primed with eCG at 21 (A-D, G, H) or 23 (E, F) days of age, stained with hematoxylin and eosin. A, luteinized follicle showing trapped COC and release of follicular fluid (FF) to the ovarian interstitium. The rupture of the theca layers are indicated by arrows. B, COC released to the ovarian interstitium, in a lacunae of follicular fluid (FF). Clusters of granulosa cells are indicated by open arrows. C, D, COCs in the lymphatic (A) or blood (D) vessels at the ovarian hilus (OH). E, F, COC inside a blood vessel located in the periovarian fat pad (PFP) near the ovarian hilus (OH). The framed area is shown at higher magnification in F showing rupture of the blood vessel and escape of red blood cells (arrows). G, H, Non-consecutive serial sections showing a COC released to the bursal cavity (BC), adhered to the ovarian bursa. Degradation of the ovarian bursa by follicular fluid and granulosa cells (open arrows) and invasion (arrows) of the periovarian fat pad (PFP) can be observed.\n", - "2135 \n", - " Micrographs from non-consecutive serial sections from the ovary of an immature rat primed with eCG at 21 days of age. The ovarian bursa (OB) has been degraded (A) allowing release of the COC to the peritoneal cavity (B) Clusters of granulosa cells (arrows) can be observed free or attached to the ovarian bursa. Hematoxylin and eosin.\n", - "2136 \n", - " Representative micrographs from the ovary of immature rats primed with eCG at 21 (A) or 23 (B) days of age, showing luteinized follicles ruptured at the apex. The ovarian surface epithelium (OSE, arrows in A and B), and its basement membrane (arrowheads in B) remain intact, whereas the underlying ovarian tissue has been degraded (asterisk in A). The COC is retained under the ovarian surface. OB, ovarian bursa. Hematoxylin and eosin.\n", - "2145 \n", - " Visualizing Kolmogorov´s ComplexityIntuitive categories can be defined by short statements. The universe: circles and triangles, red and yellow, big and small (A). Examples of easy categories: red objects (B); triangles (C). Example of a difficult category: yellow circles and small red circles (D).\n", - "2148 \n", - " Measuring Selection Pressures by Comparing the Ratio of Nonsynonymous to Synonymous Substitutions Per Site(A) Classification of substitutions. Nonsynonymous substitutions (red) are those that change the amino acid sequence of the protein encoded by the gene, while the degeneracy of the genetic code ensures that synonymous substitutions (yellow) result in the same amino acid sequence.(B) Calculation of dN/dS. By assuming that synonymous mutations are neutral and fixed by random genetic drift, it is possible to determine the mode of selection acting on nonsynonymous mutations. If all nonsynonymous substitutions were neutral, then their rate of occurrence per site (dN) would be the same as that of synonymous substitutions per site (dS), so that dN/dS equals one. A lower ratio of nonsynonymous to synonymous substitutions per site (dN/dS < 1) means that some proportion of the nonsynonymous mutations are deleterious and removed by purifying selection. Conversely, positive selection fixes advantageous nonsynonymous mutations faster than genetic drift fixes synonymous mutations (dN/dS > 1), although this is usually restricted to a small proportion of amino acid sites within any gene. In the hypothetical example of five gene sequences shown here, with dS given above the diagonal and dN below the diagonal, there is no evidence for positive selection because mean dN/dS the (0.577) is less than one.\n", - "2149 \n", - " Lethal Mutagenesis As a Means of Controlling RNA Virus Infections(A) In a viral population prior to the application of mutagens, the mean error rate (white) is on the order of one per genome per replication (mutations marked by asterisks). (B) If a mutagen such as ribavirin is then applied to an infected patient, the mean error rate of the virus (black) is increased so that the population crosses a threshold of ‘error catastrophe’; after this point fitness declines dramatically and the population crashes. This drug-induced lethal mutagenesis seems to work more efficiently when it is used in combination with drugs that reduce the rate of viral replication.\n", - "2155 \n", - " The Ubiquitin-Mediated Proteolysis of Aux/IAA Proteins Regulates Auxin Response(A) Wild-type Arabidopsis thaliana and the axr2-1 mutant. axr2-1 is a dominant gain-of-function mutation in an Aux/IAA gene that confers reduced auxin response. The mutant axr2-1 protein constitutively represses auxin response because it cannot be targeted for proteolysis by the SCFTIR1 ubiquitin ligase. The effect of the mutation on AXR2 stability is shown in a pulse-chase experiment (inset). Wild-type and axr2-1 seedlings were labeled with 35S-methionine and AXR2/axr2-1 protein was immunoprecipitated either immediately after the labeling period (t = 0) or following a 15-minute chase with unlabeled methionine (t = 15).(B) A simplified model for auxin response. In the absence of an auxin stimulus, Aux/ IAA proteins inhibit ARF transcriptional activity by forming heterodimers. Auxin perception (by an unknown receptor) targets the Aux/IAA proteins to the SCFTIR1 complex, resulting in their ubiquitination and degradation, thereby de-repressing the ARF transcription factors. Among the ARF targets are the Aux/IAA genes themselves, which produce nascent Aux/IAA proteins that restore repression upon the pathway in a negative feedback loop.\n", - "2166 \n", - " Decay of NMDA receptor mediated EPSPs in low Mg2+ solution. (A) Experimental design: Measurements of field EPSPs from a representative experiment are plotted for two independent pathways, referred to as input 1 and input 2. By appropriate use of specific blockers CNQX and AP5, either isolated AMPA EPSPs (used for initial pathway equalization) or isolated NMDA EPSPs (used in testing sessions N1 and N2) were recorded with periods of fully blocked responses in between. The pathways were stimulated alternately, each at 0.1 Hz, except for silencing input 2 for a 3 h period that contained session N1. Each point represents the average of measurements within 1 min. As seen, during N1 the responses to input 1 decayed. During session N2 both inputs were stimulated, revealing a novel decay for input 2 and occluded depression for input 1. Samples of recorded potentials of both inputs are given for the indicated time points a-e. (B) Superimposed, averaged time courses of NMDA EPSPs for input 1 during session N1, and input 2 during session N2. (C) Superimposed averaged time courses of NMDA EPSPs for input 1 and input 2, both during session N2. For B and C, each point represents the average of measurements within 3 min intervals. The peak during session N1 was used as 100 %. Values are expressed as mean ± S.E.M (n = 8 experiments).\n", - "2167 \n", - " Activation of NMDA receptors is necessary for inducing persistent depression. (A) Experimental design: Measurements of field EPSPs are plotted for a representative experiment as in Fig. 1A. The experiment conformed with the previous one except that AP5 was present in the solution during session N1. Accordingly, synaptic transmission was blocked for the entire period when input 2 was stopped. In session N2, AP5 was eventually washed out and both inputs displayed decaying NMDA EPSPs. Samples of recorded potentials of both inputs are given for the indicated time points a-e. (B) Superimposed averaged time courses of NMDA EPSPs from both inputs during session N2. Each point represents the average of measurements within 3 min intervals. The peak of input 2 was chosen as 100 %. The equal appearance of the curves shows that no pathway specific depression remained during N2 due to the differential treatment during N1 (compare such a depression in the reference case in Fig. 1C). Values are expressed as mean ± S.E.M (n = 5 experiments).\n", - "2169 \n", - " Transient potentiation induced by sudden activation of NMDA receptors. (A) Superimposed averaged time courses of NMDA EPSPs for two pathways subjected to different stimulation protocols. Each point represents the average of measurements within 3 min intervals. Stimulation of one pathway (input 2) was stopped for a period of 30 min and then restarted at a time point when NMDA receptors were fully unblocked as judged by responses for the other pathway (input 1) that was exposed to the standard protocol. The peak of input 1 was taken as 100 %. (B) Time course of the newly evoked NMDA responses. Expanded portion of A immediately following restart of stimulation, each point representing measurement of a single EPSP. It can be noted that following the initial response there was additional growth for about a minute before responses started to decay. Values in both A and B are expressed as mean ± S.E.M (n = 8 experiments). (C) Examining the relation between the slow depression and the transient potentiation of NMDA EPSPs. Depression was quantified as end-of-session value relative to peak value (5 min averages) for input 1 that received the standard protocol. Transient potentiation was estimated as the average of the first 18 responses (3 min) of input 2 relative to the average of the corresponding interleaved responses of input 1. The latter value was nearly the same as the peak value. Each dot represents a single experiment (same set of 8 experiments as in A, B). The analysis revealed no significant correlation between the data points.\n", - "2177 \n", - " Disruption of the Ctcf gene in 6B72 cells. DNA sequences flanking the U3NeoSV1 provirus in 6B72 cells were cloned and sequenced. The flanking sequences were identical to sequences in the rat genome, placing the provirus in the first intron of the Ctcf gene (A). Filled and open boxes indicate coding and non-coding exons, respectively. Flanking sequences 5' of the U3NeoSV1 provirus (B) include the first exon (shaded) of the gene.\n", - "2178 \n", - " CTCF and Igf2 expression in RIE-1 and 6B72 cells. Levels of CTCF protein were assessed by Western blot analysis (A), normalized to a β-actin control. Levels of Igf2 transcripts were assessed by Northern blot analysis (B) normalized to GAPDH control. Protein content, as assayed by western blot analysis and standardized to β-actin was decreased in the 6B72 cell clone to 30% of control. Reverse transcriptase PCR analysis of Igf2 transcripts (C). The RT-PCR products (arrows) were separated on a 2% agarose gel, revealing an additional transcript in the 6B72 cells. The DNA sequence of the larger RT-PCR product (D) revealed an alternatively spliced transcript (Igf2sv) generated by splicing of exon 2 to a cryptic 3' splice site located 14 nucleotides upstream of exon 3.\n", - "2182 \n", - " Decreased lytic infection of L-cell clones over expressing the IGF-II gene. Constitutively expressed GAPDH was used to assess loading of RNA in lanes. Survival of lytic infection was determined by infecting 105 L-cells or L-cells expressing the pro-IGF2 transgene with varying concentrations of reovirus type 1 (A) or type 3 (B). The multiplicity of infectious virus particles per cell (MOI) is indicated for each virus serotype. Surviving cells were visualized at 4 (A) or 5 days (B) following infection with gentian violet. Transgene expression was determined by northern blot (C). Experiments were repeated three times and a representative experiment is shown.\n", - "2183 \n", - " 6B72 cells have delayed disassembly of reovirus type 1. Fluorescein-labelled reovirus particles were absorbed to RIE-1 (A) or 6B72 cells (B). Persistent fluorescence at 2 hours was found in 6B72 cells, but not in RIE-1 cells. Non-replicating reovirus type 1, at 3 × 104 particles per cell, was adsorbed to RIE-1 (C) or 6B72 (D) cells at 4°C, washed and incubated at 37°C for 2 and 4 hours. Cells were lysed and the state of virus particles determined by western blot. The outer capsid proteins μ1 and σ3 are present in the 6B72 cell preparations at 2 and 4 hours, but not in the RIE-1 cells.\n", - "2206 \n", - " Proteomic analyses demonstrating the differences in protein profiles of sera from diabetic and wild-type mice. Serum samples from fasting diabetic (db+/db+) mice and fasting wild-type (+m/+m) mice were loaded onto ProteinChip arrays. (A) List of peaks of proteins and/or peptides with indicated m/z values, the peak intensities of which were significantly changed in the diabetic state. Relative peak intensities were averaged (n = 8). The fold changes are presented as ratios of the peak intensities at indicated m/z values in db+/db+ to those in the +m/+m mice. Peaks at m/z 4203, 4576, 8515, 9291, 17406 and 18678 were obtained using CM10 ProteinChip (pH4). Peaks at 8733 and 9311 m/z were obtained using CM10 ProteinChip (pH7). Peaks at m/z 3933, 4119, 4206, 4369, 4566, 4579, 4637, 8523, 8827, 8915, 9283, 13075, 17407, 17418, 17622, 18431, 18691, 22334 and 26100 were obtained using Q10 ProteinChip. Peak at m/z 4211 was obtained using IMAC30. The chips were analyzed by SELDI-TOF-MS. (B) and (C) Typical data of relative peak intensities in +m/+m and db+/db+ mouse sera (upper, representative of 4–8 independent observations) and the peak intensity averages at m/z 4206 and 26100 (lower, n = 4 for +m/+m, n = 8 for db+/db+). The analyzed peak is indicated by arrows in the data of mass spectral signals. **P < 0.01; significantly different from the peak in wild-type mice, by unpaired t-test.\n", - "2207 \n", - " Changes in serum protein profiles in db+/db+ mice by administration of green tea. Serum samples from fasting diabetic (db+/db+) mice 2 h after administration of green tea suspension were loaded onto ProteinChip Arrays. The chips were analyzed using SELDI-TOF-MS. (A) List of peaks of proteins and/or peptides with indicated m/z values, the peak intensities of which were significantly changed by the green tea administration. Relative peak intensities were averaged (n = 4). The fold changes are presented as ratios of the peak intensities at indicated m/z values 2 h after to before green tea administration. Peaks at m/z 7495, 7595, 7808, 7920, 14983, 15612 and 15614 were obtained using CM10 ProteinChip (pH4), whereas those at m/z 7503, 7611, 7823, 7926, 11651, 11664, 11863, 15004 and 15638 were obtained using CM10 ProteinChip (pH7). Peaks at m/z 4212, 4226, 7499, 11637, 11846, 13711, 13831, 14974, 15180, 31204 and 65906 were obtained using IMAC30 ProteinChip. (B) Typical data of relative peak intensities (upper, representative of 4 independent observations) and the peak intensity average at m/z 11863 (lower, n = 4) after green tea administration and saline control. The analyzed peak is indicated by arrows in the data of mass spectral signals. **P < 0.01; significantly different from the peak obtained before the administration, by unpaired t-test.\n", - "2208 \n", - " Changes in peak intensity at m/z 4211 in diabetic state and after green tea administration. (A) Decrease in the peak intensity at m/z 4211 in serum samples from fasting diabetic (db+/db+) mice, compared with that of the fasting wild-type (+m/+m) mice. Typical data of relative peak intensities in +m/+m and db+/db+ mouse sera (upper, representative of 4–8 independent observations) and the averaged intensities of the peak at m/z 4211 (lower, n = 4 for +m/+m, n = 8 for db+/db+) indicated above by arrows. **P < 0.01; significantly different from the peak in wild-type mice, by unpaired t-test. (B) Decrease in the peak intensity at m/z 4212 in serum samples from fasting db+/db+ mice 2 h after green tea administration. Typical data of relative peak intensity (upper, representative of 4 independent observations) and the averaged intensities of the peak at m/z 4212 (lower, n = 4) after administration with either green tea or saline. **P < 0.01; significantly different from the peak obtained before the administration, by unpaired t-test.\n", - "2213 \n", - " Details of sequencing profiles: (A) Deletion of GGCA in cell line N206 causing skip of exon 3 and (B) Y93C mutation in cell line NMB; (C) RT-PCR (reverse transcriptase PCR) on cell lines grown with or without puromycine (T = treated, U = untreated) revealed a transcript variant in cell line N206, caused by the GGCA deletion (lane 1 and 2).\n", - "2215 \n", - " Mitochondrial ultrastructure shows heterogeneity between cell lines (same final magnification for the 4 images, marker = 0.5 μm): (A) NB cell line N206: dilated crista spaces in small mitochondria with a dense matrix; (B) NB cell line NMB: small mitochondria with narrow cristae and light matrix, so-called orthodox configuration, (C) NB cell line SJNB-8: unusually large mitochondria in orthodox configuration (narrow cristae), some areas in the matrix are cleared and lack cristae; (D) NB cell line LA-N-2: very large mitochondria with dilated cristae and dense matrix.\n", - "2245 \n", - " Diurnal difference in CAR and CYP2B mRNA levels in the rat liver. Animals were sacrificed at ZT8 and ZT20 (n = 3–4), and CAR (A) and CYP2B (B) mRNA levels were measured by semi-quantitative RT-PCR as described in the legend to Fig. 1. The results were normalized against those for GAPDH. The columns and bars represent the means ± SD with a significant difference at *: p < 0.01\n", - "2290 \n", - " Snapshot of the web-interface for our SAGEbetaBin method. An illustration of on-line tool implemented to make our method easily available it is shown. Researchers submit their data (A) and receive, by e-mail, an alert when we finished the job along with instructions to get results in a password-protected web-page (B). If the ID supplied is a human tag (C), then results are linked with SAGE genies' tag-to-gene map. The individual observations graphics, as utilized in this work, is available on-demand (D).\n", - "2296 \n", - " a1-α2 binding in vitro and in vivo to sites in the ORF regions of the genome. (A) An EMSA of purified a1 and α2 proteins binding to a strong a1-α2 binding site, HO(10) (lanes 1–8) and sites from the YKL162C (lanes 9–13), CDC25 (lanes 14–18), a weak a1-α2 binding site from the HO promoter, HO(8) (lanes 19–23), PRM8 (lanes 24–28), PRM9 (lanes 29–33) and URB1 (lanes 34–38). The concentration of the a1 protein was held constant at 1.4 × 10-6 M (lanes 2 and 4–38) and mixed with 5-fold dilutions of the α2 protein starting at 8.2 × 10-8 M (lanes 3, 4, 9, 14, 19, 24, 29 and 34)). The EMSAs shown are phosphorimages of the gels. Lane 1 contains HO(10) probe alone, and lanes 2 and 3 contain 1.4 × 10-6 M a1 and 8.2 × 10-8 M α2 respectively. The fold repression by each site in the context of a heterologous promoter is shown below each gene/promoter. (B) ChIP assays for the genes YKL162C, CDC25, PRM8, PRM9 and URB1 are shown. ChIP assays were performed as described in Figure 1\n", - "2297 \n", - " a1-α2 binding in vitro and in vivo to putative binding sites in promoters associated with genes which are not expressed in a haploid-specific manner. (A) An EMSA of purified a1 and α2 proteins binding to a strong a1-α2 binding site, HO(6) (lanes 1–7), COX13 (lanes 8–11), REX2 (lanes 12–15), LSM1 (lanes 16–19) and FMP14 (lanes 20–23). The concentration of the a1 protein was held constant at 1.4 × 10-6 M (lanes 2 and 4–23) and mixed with 5-fold dilutions of the α2 protein starting at 8.2 × 10-8 M (lanes 3, 4, 8, 12, 16 and 20). The EMSAs shown are phosphorimages of the gels. Lane 1 contains HO(6) probe alone, and lanes 2 and 3 contain 1.4 × 10-6 M a1 and 8.2 × 10-8 M α2 respectively. The fold repression by each site in the context of a heterologous promoter is shown. (B) ChIP assays for COX13, REX2, LSM1 and FMP14 were performed as described in Figure 1.\n", - "2300 \n", - " Average exonuclease removal from gene subgroups. The average exonuclease removals from gene ends was investigated for each IGHV, IGHD and IGHJ subgroup. Significant differences were seen among the 294 IGHV genes (A). No significant difference between the 245 IGHD genes were seen at the 5' end (B). The 3' IGHD end does show significant differences for the IGHD subgroups (C) as do the six IGHJ subgroups (D). Bars represent standard error.\n", - "2344 \n", - " The simulated ECGs with the 2-D model. (a) The normal ECG; two leads are at the middle of left and right chests (<190,50 > and <-80,50 >). (b) The normal ECG; two leads are in the cardiac cavities (<75,50 > and <32,50 >). (c) The ECG of endocardial ischemia (top line) and epicardial ischemia (bottom line); two leads are at the same positions as in (A). Two ischemia areas are shown in Figure 6(c).\n", - "2357 \n", - " Representative zymograms from tissue (A) and mucus (B) shows the standards for MMP9 (top band, ~92 kD, latent size) and MMP2 (lower band, ~72 kD, latent size) in the leftmost lane. To the right of standard in each zymogram, two sets of bands are visible, corresponding to MMP-9 and MMP-2 levels of activity in duplicate samples of control tissue. In the next two lanes are duplicate sets of bands from an experiment which shows increased activated MMP-9 and possibly MMP-2 activity in sodium metabisulphite 10-1 M treated tissue in both tissue and mucus. The bar graph only shows a comparison of the scanning density of the MMP-9 bands since the MMP-2 control and sodium metabisulphite-treated tissue showed similar activation. A significant increase in activated MMP-9 was seen in sodium metabisulphite-treated mucus and tissue (* p < 0.05, n = 3 for each).\n", - "2359 \n", - " Depletion of Cholesterol Leads to Formation of Dauer-Like Larvae(A) For worms grown on plates without cholesterol, the first-generation worms (F1) laid fewer eggs than normal (133 ± 10 versus 210 ± 12) and more eggs failed to hatch. Filled ovals depict unhatched eggs; 17% of eggs laid by cholesterol-depleted worms failed to hatch in comparison to 0.02% of those laid by cholesterol-fed worms. The second generation of worms (F2) arrested after the completion of the L1-to-L2 molt.(B) Light micrograph of an arrested L2 larva.(C) Electron micrograph of the lateral cuticle of an arrested L2 larva 5 d after arrest, showing two cuticles. The outer cuticle resembles that of an L2, which has no alae, and the inner cuticle resembles the dauer cuticle with its distinctive striated layer (bracket) and an incomplete dauer ala.(D) Electron micrograph of an arrested L2 daf-12 mutant grown without cholesterol. Arrows indicate vesicles beneath the cuticle which are not present in normal larvae.(E) Electron micrograph of a wild-type L2 larva grown with normal cholesterol.\n", - "2361 \n", - " Depletion of Cholesterol Is Associated with a Decrease of Nonmethylated Sterols(A) Nematode-specific biosynthesis of 4-methylated sterols from exogenously added cholesterol. Open arrow shows the methylation at the fourth position. A vertical line indicates hydrophilic metabolites of cholesterol.(B) Cholesterol metabolism in the first (lanes 1 and 2) and the second (lanes 3–6) generations of worms derived from mothers fed with radioactive cholesterol. CE, cholesteryl esters; mS, methylated sterols (lophenol, 4-methylcholestenol); nmS, nonmethylated sterols (cholesterol, 7-dehydrocholesterol, lathosterol). The position of these compounds on TLC was determined by chromatography of cholesteryl stearate, lophenol, and cholesterol. E, eggs; L1, L1 larvae.\n", - "2362 \n", - " Methylation of the Fourth Position of Cholestanol Is Not Required for Dauer Larva FormationStructural formulae and space-filling models of (A) cholestanol, (B) lophanol, and (C) 4αF-cholestanol. Abilities to support reproductive growth or dauer formation in the second generation are indicated. R, reproduction; D, dauer larva.\n", - "2363 \n", - " Partial Purification of Gamravali(A) Lipidic extract of worms was separated by HPLC using a C18 reverse-phase column. Retention times of (1) 7-dehydrocholesterol, (2) cholesterol/lathosterol, and (3) ecdysone/estradiol/testosterone are indicated with arrows.(B) Fractions of 2 min from the chromatography were assayed for the activity to rescue the formation of dauer larvae induced in the presence of lophenol.\n", - "2364 \n", - " Mutant daf-16 Worms Grown on Lophenol Form Defective Dauer Larvae(A) Low-magnification electron micrograph of lophenol-grown daf-16. The alae are defective although the striated layer (bracket) is visible. Note that the gut is not constricted and contains remnants of food.(B and C) High-magnification electron micrographs of lophenol-grown daf-16 and wild-type dauer larvae. Arrowhead indicates an annular structure.\n", - "2365 \n", - " Growth on Lophenol Induces the Accumulation of DAF-16 in the Nuclei of Neurons in a DAF-12–Dependent Manner(A) When grown on cholesterol, the transgenic line DAF-16a::GFP/bKO displays a diffuse staining in the cytoplasm and nuclei of many cells (only the pharynx region of an L3 larva is shown).(B) Staining of a larva of similar age by Hoechst. Note many nuclei in the pharynx.(C) The DAF-16a::GFP/bKO line grown on lophenol shows strong staining of nuclei in neurons of the pharynx, tail, and ventral cord of a dauer larva.(D) An L3 larva of DAF-16a::GFP/bKO in a daf-12 null background grown on lophenol. Note the diffuse fluorescence in the pharynx cell similar to that shown in (A).\n", - "2369 \n", - " The Process of Marking up a SentenceThe process of marking up the sentence “In par-1, par-4 and par-3 mutant four-cell embryos, MEX-3 is present at high levels in all cells, indicating that activity of these par genes is required to restrict MEX-3 to the anterior.” This sentence is taken from Huang et al. (2002).(A) The computer identifies terms that are stored in a lexicon according to categories of the ontology. A text-to-XML converter marks up the terms by enclosing them in XML brackets.(B) The fully marked-up sentence. Some categories have subcategories (for example, the category “regulation” is subdivided into “positive,” “negative,” and “unknown”). Grammar attributes have been omitted here for the sake of clarity, because they are not used in the current version of the system. Some white spaces have been inserted in the graphics for clarity enhancement.\n", - "2374 \n", - " The Effect of FtsY Mutations on the Reciprocally Stimulated GTPase Reaction between Ffh and FtsYThe stimulated GTPase reactions of (A) mutant FtsYE475(274)K (•), (B) FtsY T307(112)A (•), (C) FtsYA335(140)W (•), (D) FtsYR333(138)A (•), and wild-type FtsY (○) were determined as described in Materials and Methods. The insets show the reaction curve of the mutant FtsYs on an expanded scale.\n", - "2375 \n", - " Determination of Complex Formation between Ffh and FtsY Mutants(A) Inhibition assay for determining the affinity of mutant FtsY proteins for Ffh, as described in the text and in Materials and Methods.(B and C) Representative inhibition curves are shown for FtsY mutants (B) T307(112)A and (C) A335(140)W. The data were fit to equation 3 in Materials and Methods.\n", - "2376 \n", - " Fluorescence Characterization of Complex Formation between Ffh and Mutant FtsYA335(140)W(A) The tryptophan fluorescence of mutant FtsYA335(140)W changes upon complex formation with Ffh. Complex formation was initiated by the addition of Mg2+, as described previously (Shan and Walter 2003). Other Class II mutants do not exhibit as significant a fluorescence change (unpublished data). Thus, the conformational change that alters the environment surrounding the fluorescent W343(148) does not occur even though these mutants can form stable complexes with Ffh.(B) Association rate constants for complex formation with mutant FtsYA335(140)W (○) and wild-type FtsY(•). Linear fits to the data gave association rate constants of 6.36 × 104 and 6.34 × 104 M−1 s−1 for wild-type and mutant FtsY, respectively.(C) Dissociation rate constants of the Ffh•FtsY complexes formed by mutant FtsYA335(140)W (upper curve) and wild-type FtsY (lower curve). First-order fits to the data gave dissociation rate constants of 3.6 × 10−3 and 4.2 × 10−3 s−1 for wild-type and mutant FtsY, respectively.\n", - "2377 \n", - " Half-Site Mutants Are Compromised in the Hydrolysis Reaction from the FtsY but Not Ffh Active Site(A) The reciprocally stimulated GTPase reaction with wild-type Ffh for wild-type FtsY (○) and mutant FtsYG455(254)W (•).(B) The FfhD251N-stimulated GTPase reaction from wild-type FtsY (○) and mutant FtsYG455(254)W (•), determined as described in Materials and Methods.(C) The XTP hydrolysis reaction from FfhD251N stimulated by wild-type FtsY (○) and mutant FtsYG455(254)W (•), determined as described in Materials and Methods.\n", - "2378 \n", - " Model for Conformational Changes during Ffh-FtsY Reciprocal GTPase Activation and Implications for the Protein-Targeting Reaction(A) Model for conformational changes during formation of an activated Ffh-FtsY complex. Step a is the rearrangement of both proteins from the open to the closed state during complex formation. Step b is the coordinate docking of the IBD loops into the active sites, and step c is the docking of the Arg191s. Step d is the additional rearrangement of residues that completes one or the other GTPase site. Step e is the rearrangement that completes the other active site. GTP can be hydrolyzed from either the hemiactivated complexes (step f) or the activated complex (step g) to drive complex dissociation.(B–D) Catalytic interactions made by residues exhibiting the Class II phenotype. FtsY is in surface representation, the catalytic residues from FtsY are depicted as red sticks, the nucleotides bound to FtsY and Ffh are in dark green and dark blue, respectively, and the dotted lines depict hydrogen bonds or van der Waals contacts.(B) Interaction of IBD loop with GTP in the FtsY active site. The blue ball represents the attacking water molecule (A.W.); the violet red ball represents the active site Mg2+.(C) Interactions of Asn111(107) at the Ffh-FtsY interface. The residue homologous to Asn111, Gln107 in Ffh, is in violet red.(D) Arg195(191) is in a “pending” position. The residue homologous to Arg191 in Ras, Gln61, is in violet red.(E) Conformational changes in the GTPase domains of SRP and SR provide potential regulatory points during the protein-targeting reaction. Step 1, SR undergoes an open → closed conformational change upon association with the membrane translocon. Step 2, SRP undergoes an open → closed conformational change upon association with the ribosome and nascent polypeptide. Step 3, complex formation between SRP and SR delivers the cargo to the membrane. Step 4, cargo release from SRP allows the SRP•SR complex to undergo additional conformational changes to activate GTP hydrolysis. Step 5, SRP dissociates from SR after GTP is hydrolyzed. Note that steps 1–3 correspond to Ffh-FtsY binding (step a) in the model shown in (A), step 4 corresponds to Ffh•FtsY activation (steps b–e) in the model shown in (A), and step 5 corresponds to Ffh•FtsY complex dissociation (step g) in the model shown in (A).\n", - "2379 \n", - " NM Is Predominantly Monomeric(A) Oligomeric state of NM prior to assembly was assessed by equilibrium AUC. Above, raw plot of absorbance versus radial position for 5.8 μM NM at equilibrium, with best-fit line for a single species. Below, residuals from the fit shown above.(B) Equilibrium AUC data from 1.5, 3.8, 5.2, 5.5, and 5.8 μM samples of NM were fit to a single-species model. Shown is fitted molecular mass versus concentration. For reference, dashed lines are shown at the calculated monomer mass (29.6 kDa) and dimer mass (59.2 kDa).(C) Distribution of absorbance versus sedimentation coefficient at the indicated concentrations was obtained from velocity sedimentation data using Sedfit (Schuck et al. 2002). Inset is a magnification of the main peaks.(D) A small amount of a larger complex could be resolved by velocity sedimentation. Distribution of absorbance versus sedimentation coefficient for each of 3 μM NM and 2.7 μM NM plus GroEL (with absorbance equivalent to that of 0.3 μM NM) is shown. Inset is a magnification for sedimentation coefficients between 15.6 S and 28.4 S.\n", - "2380 \n", - " Kinetics of NM Fiber Growth Support a Monomer Addition Model(A) Initial rate of polymerization versus concentration of NM. Soluble NM at the indicated final concentrations was mixed with sonicated fibers (2.5 μM fibers at 5% of final volume) and polymerization was followed by a continuous thioflavin T assay. Rates shown were determined by the initial slopes of polymerization curves.(B) Initial rate of polymerization versus concentration of soluble NM in the presence of sonicated seed (1% of final volume) measured by a discrete thioflavin T binding assay. Error bars throughout represent the standard deviation of at least three measurements.(C) Polymerization of NM labeled with Alexa-647 at a C-terminal cysteine was monitored by the quenching of Alexa-647 fluorescence. The indicated concentrations of soluble NM were mixed with sonicated fibers (4% of final volume), and the initial rate of polymerization was measured.(D) Initial rate of polymerization versus concentration of seed. Soluble NM (2.5 μM final concentration) was mixed with the indicated quantity of sonicated seed. Highly fragmented fibers were used to maximize the absolute rate. Rates were measured as in (A).(E) Initial rate of polymerization versus concentration of seed as measured by discrete thioflavin T binding assay. Initial soluble NM concentration was 2.5 μM.(F) Initial rate of polymerization versus concentration of seed as measured by Alexa-647 fluorescence quenching. Initial soluble NM concentration was 200 nM.\n", - "2381 \n", - " Evidence that a Conformational Conversion following NM Monomer Binding to Fiber Ends Becomes Rate Limiting at High [NM](A) NM is predominantly monomeric at concentrations up to 20 μM in the presence of a moderate level of denaturant (100 mM urea and 100 mM GuHCl). Oligomeric state was assessed by velocity AUC as in Figure 1C for NM at 10, 15, and 20 μM.(B) Soluble NM was mixed with sonicated fibers in the presence of 100 mM urea and 100 mM GuHCl to minimize off-pathway aggregation at higher [NM], and the initial rate of polymerization was measured as in Figure 2A. Inset, rate of polymerization of 20 μM soluble NM versus seed percentage (v/v). The continued linear dependence of rate on fiber ends indicates that at high [NM], fiber ends remain limiting.\n", - "2382 \n", - " Effect of Fiber Fragmentation on Polymerization Kinetics(A) De novo NM polymerization (1.0–12 μM) followed by a continuous thioflavin T binding assay.(B) Lag time (measured as time to 5% completion of polymerization) versus NM concentration for the polymerizations shown in (A).(C) Schematic of nucleated polymerization with fragmentation. At low concentrations fiber growth is limited by monomer binding, whereas at high concentrations conformational conversion after binding becomes limiting.(D) The de novo polymerization data shown in (A) were fit with a linearized model (Ferrone 1999) that includes nucleation, fiber growth by monomer addition, and fragmentation, assuming the indicated sizes for the smallest stable amyloid species (nucleus size). Plotted are the residuals (best-fit value minus observed data). Each block (labeled at the left by the nucleus size used) represents the residuals from simultaneously fitting all of the data. Each line within the block displays the individual residuals from a single concentration (1 μM [top] to 12 μM [bottom]). Residuals are color coded according to the color key at the right, with red and green indicating large errors and yellow indicating a good fit. Time varies from time zero (farthest left) to the time of 3% completion of polymerization. Below (NP) are residuals from fitting the same data using a simple nucleated polymerization model. Note the systematic deviations from the model for large nucleus sizes and for NP.\n", - "2383 \n", - " Agitation Causes Fiber Fragmentation(A) Dependence of de novo polymerization reactions on degree of agitation. Polymerization in a microplate with shaking every minute (line only) was followed by thioflavin T fluorescence. Polymerization in a test tube disturbed only by pipetting to take samples for measurement (diamonds) was measured by Congo Red binding. Polymerization in a microplate with absolutely no agitation (multiple samples were started in parallel and no sample was measured more than once) (squares) was measured by Congo Red binding.(B) Effect of agitation on elongation rate. Identical reactions with 5 μM soluble NM and 2% (v/v) seeds were grown with (triangles) or without (circles) agitation. The seeds were made fresh and sheared by passing through a 25-gauge needle ten times. Polymerization was assayed by discrete thioflavin T measurements. Inset, identical reactions followed for 100 min.(C) Effect of agitation on fiber lengths. Long fibers were grown from sonicated seeds in the absence of agitation and then subjected to agitation (end-over-end rotation in a 2-ml tube). AFM images were taken after 0, 1, and 15 h of rotation. Each image is 5 μm by 5 μm.(D) Effect of agitation on seeding efficacy. Fibers from the samples imaged in (C) were used to seed polymerization of 10 μM soluble NM, and the initial rate of polymerization was measured as in Figure 2A.(E) De novo NM polymerization was measured by continuous thioflavin T fluorescence, and relative fiber number was computed as a function of time (see Materials and Methods). Inset, fiber number versus time was fit to an exponential curve for time = 0 to time = 100 min.\n", - "2384 \n", - " Fundamental Unit of Addition for NM Fiber Growth Determined by TIRF(A) Schematic of experimental setup. Cy5-labeled fibers (red) were attached to the microscope slide via biotin-streptavidin linkage. Cy3-labeled NM (green) was added in solution.(B) TIRF image of fibers (red) grown by addition of 200 nM NM (67% labeled with Cy3 [green]) for approximately 1 h. Cy3 fluorescence at fiber ends in this image represents multiple addition events.(C) Schematic of expected results if oligomers (top, trimer model shown for example) or monomers (bottom) are added to fiber ends. Graphs at the right show simulated data of fraction of additions versus fluorescence intensity of addition. Note that for the monomer model, the simulated intensities are the same whether 9% or 67% of the soluble NM is labeled.(D) Observed data: fraction of observed events versus fluorescence intensity of events. Intensities of Cy3 spots appearing at fiber ends were measured.(E) Intensities of Cy3 spots appearing at fiber ends (circles) and intensities of Cy3 spots that bleached in a single step (squares).\n", - "2385 \n", - " The Mother-Cell Line of Gene Transcription(A) Gene transcription is governed by a hierarchical regulatory cascade that involves gene activation and gene repression. The σE factor turns on a large regulon that includes the genes for GerR and SpoIIID. These DNA-binding proteins, in turn, block further transcription of many of the genes that had been activated by σE. SpoIIID is also an activator, and it turns on genes required for the appearance of pro-σK. The conversion of pro-σK to mature σK is governed by a signal emanating from the forespore as represented by the squiggle. Next, σK activates the subsequent regulon in the cascade, which includes the gene for the DNA-binding protein GerE. Finally, GerE, which, like SpoIIID, is both an activator and a repressor, turns on the final regulon in the cascade while also repressing many of the genes that had been activated by σK. The thickness of lines represents the relative abundance of genes activated (arrows) or repressed (lines ending in bars) by the indicated regulatory proteins.(B) The regulatory circuit is composed of two coherent FFLs linked in series and three incoherent FFLs. In the first coherent FFL, σE turns on the synthesis of SpoIIID, and both factors act together to switch on target genes, including genes involved in the appearance of σK. Likewise, in the second coherent FFL, σK directs the synthesis of GerE, and the two factors then act together to switch on target genes (X4). The σE factor and SpoIIID also constitute an incoherent FFL in which SpoIIID acts as a repressor to downregulate the transcription of a subset of the genes (X2) that had been turned on by σE. Similar incoherent FFLs are created by the actions of σE and GerR (X1) and by σK and GerE (X3), with GerR and GerE repressing genes that had been switched on by σE and σK, respectively. The AND symbols indicate that the FFLs operate by the logic of an AND gate in that the output (either gene activation or a pulse of gene expression) requires the action of both transcription factors in the FFL (see Mangan and Alon 2003). For example, σK and GerE are both required for the activation of X4 genes, whose induction is delayed compared to genes that are turned on by σK alone. Similarly, both σE and the delayed appearance of GerR are anticipated to create a pulse of transcription of X1 genes.\n", - "2386 \n", - " Location of Genes in the σE and σK Regulons and Their Regulation by DNA-Binding Proteins(A) The σE regulon and its modulation by SpoIIID and GerR. The first gene of each σE-controlled transcription unit identified by transcriptional profiling is indicated. In the inner circle, genes repressed by SpoIIID are green, and genes repressed by GerR are blue. In the outer circle, genes partially dependent on SpoIIID for expression are orange, and genes strongly dependent on SpoIIID are red. Underlined are SpoIIID-controlled genes for which SpoIIID binding to their upstream sequences has been demonstrated biochemically. Genes unaffected by SpoIIID or GerR are indicated in black.(B) The σK regulon and its modulation by GerE. The first gene of each σK-controlled transcription unit identified by transcriptional profiling is indicated. In the inner circle, genes repressed by GerE are green. In the outer circle, genes partially dependent on GerE for expression are orange, and genes strongly dependent on GerE are red. Genes unaffected by GerE are indicated in black.\n", - "2387 \n", - " Gel Electrophoretic Mobility-Shift Analysis of SpoIIID BindingDNA fragments of interest were amplified by PCR, gel-purified, and end-labeled using [γ-32P]-ATP and polynucleotide kinase. Purified SpoIIID was added at increasing concentrations (0 nM for lanes 1 and 5, 50 nM for lane 2, 100 nM for lane 3, and 200 nM for lane 4) and incubated at room temperature for 30 min before loading on to a nondenaturing gel containing 6% polyacrylamide. With the exception of (D), the DNA fragments corresponded to the upstream regions of the indicated genes. See Materials and Methods for the identity (coordinates) of the specific DNA sequences used in the analyses.(A) Gel shifts for known targets of SpoIIID (bofA and spoIVCA), representing positive controls, and genes (abrB, spoIIGA, and racA) under the control of another DNA-binding protein (Spo0A), representing negative controls.(B) Gel shifts for genes identified as possible targets of SpoIIID by transcriptional profiling.(C) Gel shift for cotE. Expression of cotE from its P2 promoter is strongly dependent on SpoIIID. No binding of SpoIIID to the upstream sequence for cotE is observed, suggesting that the effect of SpoIIID on transcription from the P2 promoter is indirect.(D) Gel shifts for chromosomal regions strongly enriched for SpoIIID binding as judged by ChIP-on-chip analysis. For each region, four consecutive DNA fragments of approximately 400 nucleotides in length were analyzed.\n", - "2388 \n", - " Consensus Sequences for SpoIIID, σK, and σE\n", - "Consensus sequences are displayed as sequence logos (Schneider and Stephens 1990). The height of the letters in bits represents the information content at each position (the maximum value is two bits).(A) Consensus binding sequence for SpoIIID as derived from 17 SpoIIID-binding sites mapped by DNAase I footprinting (Halberg and Kroos 1994; Zhang et al 1997; results presented herein).(B) Consensus binding sequence for SpoIIID obtained by compilation of 68 putative SpoIIID-binding sites identified as common motifs by BioProspector and BioOptimizer analysis in sequences upstream of genes identified by transcriptional profiling or within regions identified by ChIP-on-chip analysis.(C) Consensus binding sequence for SpoIIID obtained by MDscan analysis of the sequences of 26 SpoIIID-binding regions identified by ChIP-on-chip analysis.(D) Consensus promoter sequence for σK-containing RNA polymerase obtained from the compilation of 58 sequences identified as common motifs in regions upstream of σK-regulated genes by a BioProspector/BioOptimizer computational approach (Jensen and Liu 2004). Positions 1–5 on the horizontal axis correspond to the −35 element and positions 21–30 to the −10 element. The optimal spacing between the two regions is 15 bp (± 1 bp).(E) Consensus promoter sequence for σK-containing RNA polymerase obtained from the compilation of 23 previously mapped (http://dbtbs.hgc.jp/; Helmann and Moran 2002) and 18 newly identified σK-controlled promoters identified by transcription start site mapping.(F) Consensus promoter sequence for σE-containing RNA polymerase obtained from the compilation of 62 σE-controlled promoters identified by transcription start site mapping (Eichenberger et al. 2003). Positions 1–8 on the horizontal axis correspond to the −35 element, and positions 21–30 to the −10 element. The optimal spacing between the two regions is 12 bp (± 1 bp).\n", - "2391 \n", - " Hypothesized and Measured Indifference Curves and Loss Function from a Single Subject(A–C) The predicted indifference lines are shown that minimize (A) the integrated force (F × T), (B) the integrated squared force (F2 × T), and (C) the maximal force (F).(D) Experimental data from a single subject. The open circles are the reference forces. The blue full circles connected by the black lines represent indifference points. Error bars denote the 95% confidence intervals. Force profiles are illustrated (blue curves for single forces, pink curve for doubling points).(E) Inferred color plot of the loss function (warmer colors represent greater cost).\n", - "2398 \n", - " Bar graphs showing the age and sex distributions of children with JRA identified in the Oklahoma City Area (A) and Billings Area (B) IHS databases. In each Area, there was a conspicuous under-representation of both pre-school children and early adolescents diagnosed with JRA.\n", - "2413 \n", - " Venn diagrams of differential expression calls and statistical significance across both microarray platforms. A two-sample two-tailed t-test on normalized log-transformed intensities was performed for each microarray platform. (A) The entire set of 10,763 uniquely common genes between platforms was used to determine the number of statistically significant (p < 0.01) expression ratios. Genes above and below noise were included in the analysis. (B) Statistical significance determined from the set of 2,569 genes which are 'present' on at least 3 arrays in both tissues. Expression values below noise ('absent') were not included in the analysis. (C) Statistical significance determined from the set of 1,760 genes which are 'present' on all 5 arrays in both tissues (i.e. concordantly 'present').\n", - "2414 \n", - " Power analysis estimating the number of technical array replicates needed to achieve a reasonable level of statistical power or confidence for CodeLink (blue) and GeneChip (red) when noise was included (solid diamonds) or excluded (open diamonds). For both graphs the alpha was set at 0.01. (A) Relationship between power and arrays necessary to statistically discriminate two-fold changes in expression. To achieve a power of 0.90 using all 10,763 genes, 3 arrays are minimally necessary for CodeLink while 8 are required for GeneChip. However, when noise is excluded, both GeneChip and CodeLink require only 1 array to achieve this same level of power. In fact, when noise is excluded, 1 array for both GeneChip and CodeLink has a power of 0.99 to detect two-fold changes in expression. B.) In order to detect 1.5 fold changes in expression, at a 0.90 power, when noise is excluded, CodeLink minimally requires 2 arrays while GeneChip requires 3.\n", - "2416 \n", - " Lithium ions reduce IGFBP-1 gene expression. H4IIE cells were starved overnight prior to a 3 h incubation with insulin,10 nM; lithium chloride or potassium chloride at the concentrations indicated with or without dexamethasone, 500 nM; (A-B). Total cellular RNA was isolated and an RNase protection assay was performed as described in material and methods. Results are presented as percentage gene expression (A) or fold induction (B) relative to control and are means ± standard error of two experiments performed in duplicate (upper panels). Representative experiments (lower panels) are also shown. ***, p < 0.001, **, p < 0.01 and NS, not significant\n", - "2417 \n", - " SB216763 and SB415286 reduce IGFBP-1 gene expression. H4IIE cells were starved overnight prior to a 3 h incubation with insulin, 10 nM ; dexamethasone, 500 nM; plus or minus SB216763 (A) or SB415286 (B) at the concentrations shown. Total cellular RNA was isolated and an RNase protection assay was performed, as described in material and methods. Results are presented as fold induction relative to control (serum free) and are means ± standard error of two experiments performed in duplicate (upper panels). Representative experiments are also shown (lower panels). ***, p < 0.001 and * p < 0.05\n", - "2418 \n", - " Inhibition of GSK-3 does not affect the phosphorylation of MAPK or regulation of the mTOR pathway. H4IIE cells were serum starved overnight prior to incubation with insulin, 10 nM; lithium chloride, 20 mM; SB216763, 30 μM; or SB415286, 100 μM for 15 min (A) or 3 h (B). Cells were lysed, and the lysates subjected to SDS PAGE as described in materials and methods, transferred to nitrocellulose and immunoblotted with antibodies as labelled (Phospho; phosphospecific antibody). Similar results were obtained from two experiments carried out in duplicate\n", - "2419 \n", - " Paullones reduce IGFBP-1 gene expression. H4IIE cells were serum starved overnight prior to a 3 h incubation with insulin,10 nM; dexamethasone, 500 nM; plus or minus kenpaullone (A) or alsterpaullone (B) at the concentrations shown. Total cellular RNA was isolated and an RNase protection assay was performed, as described in material and methods. Results are presented as fold induction relative to control (serum free) and are means ± standard error of two experiments performed in duplicate (upper panels). Representative experiments are also shown (lower panels). ***, p < 0.001 and ** p < 0.01\n", - "2420 \n", - " Alsterpaullone does not affect the regulatory phosphorylation sites of PKB, FOXO-1, MAPK, and components of the mTOR pathway. H4IIE cells were serum starved overnight prior to incubation with 10 nM insulin, or alsterpaullone at the concentrations shown for 30 min (A) or 3 h (B). Cells were lysed, and the lysates subjected to SDS PAGE, transferred to nitrocellulose and immunoblotted with antibodies as labelled (Phospho; phosphospecific antibody). Similar results were obtained from two experiments carried out in duplicate\n", - "2421 \n", - " CHIR99021 reduces IGFBP-1 gene expression. H4IIE cells were serum starved overnight prior to a 3 h incubation with insulin,10 nM; dexamethasone, 500 nM; 8CPT-cAMP, 0.1 mM; plus or minus CHIR99021 at the concentrations shown. Total cellular RNA was isolated and an RNase protection assay was performed to measure IGFBP-1 and cyclophilin mRNA, as described in material and methods. Representative experiments are shown (A), while results are presented (B) as % expression (after correction for cyclophilin expression), relative to control (serum free) and are means ± standard error of two experiments performed in duplicate.\n", - "2422 \n", - " CHIR99021 regulates both β-catenin activity and TIRE containing promoter activity. H4IIE cells were transfected with TOPFlash (A) or alternatively with BP-1 WT or BP-1 DM5 (B) reporter constructs. Cells were incubated for 24 h with 10 nM insulin or CHIR99021 at the concentrations shown, prior to lysis and luciferase assays as described in materials and methods. Results are presented as fold induction relative to basal luciferase activity (no inhibitor) (A) or % luciferase activity relative to basal (serum free) luciferase expression (B) and are the means ± standard error of at least two experiments performed in triplicate. The basal activity of BP-1 WT and BP-1 DM5 is not significantly different.\n", - "2444 \n", - " Kaplan-Meier survival curves and associated log-rank test p-values for of eleven patients with collecting duct carcinoma of the kidney based on Fez1 (A), and Fhit (B) expression. (+); positive expression; (-) = negative expression; ■ and o = Event times.\n", - "2445 \n", - " RAPD fingerprints of all the DNA samples with primers (A) RAPD-1 (5'-CCACAGCAGT-3') and (B) RAPD-2 (5'-AAGCCCGAGG-3'). (A) Lane 1, the DNA template was the supernatant from the first phenol:chloroform:isoamyl alcohol extraction (protocol 1); lane 2, the DNA template was the supernatant after two phenol:chloroform:isoamyl alcohol extractions and one chloroform extraction (protocol 2); lane 3, the DNA template was prepared with an additional ethanol precipitation (protocol 3). (B) PCR products amplified using only the DNA template from protocol 1. 1 kb, DNA molecular weight ladder.\n", - "2446 \n", - " Schematic diagram of the chloroplast genome transformed with the bar or LTB gene and PCR analysis of wild-type and chloroplast transformants. (A) Map of the chloroplast targeting region in transplastomic plants. Arrows indicate the direction of transcription. Primer 1F is located in the native chloroplast DNA; 1R, aadA; 2F, aadA; 2R, trnA. (B) The PCR products of transplastomic plants. Lane 1, wild-type plant with primers Bar-F/Bar-R; lane 2, primers Bar-F/Bar-R produce a 550-bp fragment; lanes 3 and 6, primers 1-F/1-R produce a 1700-bp fragment; lane 4, primers 2-F/2-R produce a 2200-bp fragment containing the bar gene; lane 5, primers LTB-F/LTB-R produce a 380-bp fragment; lane 7, primers 2-F/2-R produce a 1900-bp fragment containing the LTB gene. 1 kb, DNA molecular weight ladder.\n", - "2448 \n", - " Agarose gel electrophoresis of undigested and digested genomic DNA. (A) Genomic DNA from five different plants with 5 μg of genomic DNA loaded from each sample. (B) Genomic DNA digested with the restriction enzymes EcoRI and HindIII. 1 kb, DNA molecular weight ladder.\n", - "2453 \n", - " Different plant performance under the low and high nutrient treatments measured at 14 weeks of treatment. (A) Stem biomass. (B) The proportions of foliage (open bars) and fine-root (solid bars) biomass to total plant biomass.\n", - "2455 \n", - " The relationships of shoot biomass residuals with the degree of the plasticity of biomass partitioning to foliage (A) and fine roots (B). In this study, shoot biomass is used as a surrogate of fitness, because great capacity of vegetative growth at early stages is advantageous for competing for growth resources and is suggested to be favored by natural selection [15]. The residuals of shoot biomass were calculated by differences between its observations and predictions estimated from foliage and fine-root biomass proportions using polynomial equations (see ref. 24 for a detailed description of this calculation approach). The degree of plasticity was represented as family difference between the nutrient treatments.\n", - "2464 \n", - " (A): Schematic drawing of the on-chip agar cultivation assay. (B): Optical micrograph of 24-h cultivation of two cardiac myocyte cells. (C): Time-course of oscillation of cardiac myocytes shown in Fig. (B). (D): Optical micrograph of 24-h cultivation of two sets of the synchronized pairs. (E): Time-course of oscillation of cardiac myocytes shown in Fig. (D).\n", - "2466 \n", - " The effect of different reducing agents on protein resolution in 2D gels. 50 μg aliquots of total Xenopus egg extract were dissolved in RB containing 7 M urea, 2 M thiourea, 4% CHAPS, 0.5% ampholytes and different reducing agents. 2DE separation was conducted as described in Materials and Methods. (A) 20 mM DTT, (B) 2 mM TBP, (C) 10 mM TCEP.\n", - "2469 \n", - " 2DE of two different sets of proteins in sRB (A, C) and oRB (B, D). 50 μg of total Xenopus egg extract (A, B) or 25 μg of protein eluted from mitotic chromosomes assembled for 30 min in mitotic Xenopus egg extract (C, D) were dissolved in sRB (8 M urea, 4% CHAPS, 0.5% ampholytes, 20 mM DTT) and oRB (7 M urea, 2 M thiourea, 1.2% CHAPS, 0.4% ASB14, 0.25% ampholytes, 43 mM DTT, 30 mM Tris) and separated as described in Materials and Methods. Spots detected: (A) 425, (B) 659, (C) 112, (D) 350.\n", - "2470 \n", - " Effect of different rehydration buffers on quality of western blotting analysis of 2D gels. 25 μg of mitotic chromosomes eluates were separated on pH6-11 IPG strips using sRB (A, B) or oRB (C, D) as in Figure 4. 2D gels were stained with SYPRO Ruby (A, C) or immunoblotted using anti-XCAP-E antibody (B, D). The protein spots seen on the top right of (A) were not reproducible and were perhaps due to poor alkylation. The spot pattern observed in (C) was reproducible.\n", - "2471 \n", - " Cell cycle dependent association of replication licensing complex with chromatin. Proteins eluted from chromatin assembled for 30 min in Xenopus egg extracts were separated on pH 3–10 2D gels and stained with SYPRO Ruby. In control assembly reaction MCM2,3,4,6 and 7, were detectable in eluates as multiple spot chains (A). In the presence of geminin, association of MCMs with chromatin was prevented (B). The treatment of control chromatin eluates with λ-phosphatase changes the MCMs presentation in the 2D gel (C).\n", - "2479 \n", - " Immunofluorescence staining of COS7 cells. The COS7 cells were transfected with either pCDNA3.1-PSMA or empty pCDNA3.1 and fixed with cold aceton. Fixed cells were incubated with a anti-PSMA monoclonal antibody 4A12, stained with a goat anti-mouse immunoglobulin-FITC conjugate, PSMA immunoreactive cells were visualized with a fluorescent microscope (×40). Cytoplasmatic reactivity was found in COS7 cells transfected with pCDNA3.1-PSMA (A) but not in COS7 cells transfected with pCDNA3.1 (B).\n", - "2481 \n", - " Detection of PSMA protein by Western Blot. Total cell lysates were harvested and presence of PSMA protein was detected by anti-PSMA monoclonal antibody 4A12. A 100 kD band was identified in 3 clones with detectable PSMA mRNA but not in B16 cells transfected with empty vector (A). Lane1, 2 and 3, B16 cells transfected with pCDNA3.1-PSMA. Lane 4 B16 cells transfected with pCDNA3.1. β-actin was used as reference (B).\n", - "2486 \n", - " Accounting for Mendel's observation of a 3(dominant):1(recessive) trait ratio in his F2 populations of plants. Mendel's notations for a dominant trait, a hybrid and a recessive trait were (A), (Aa) and (a) respectively. For reasons given in the preceding paper [1], a hybrid trait is represented in Figure 2 by (H). The molecular components of all traits are synthesised by a metabolic pathway. When the activity of any one enzyme in a metabolic pathway is changed in discrete steps, the flux to a trait component responds in non-linear (non-additive) fashion [3]. If the flux response is quasi-hyperbolic, as shown here, the hybrid trait (H) will be indistinguishable from the trait (A) expressed in the wild-type cell or organism, even when the enzyme activity in the hybrid (H) has been reduced to 50% of the wild-type activity. Trait (a), will be distinguishable from both traits (A) and (H) only if the enzyme activity is further reduced to a sufficient extent. Under these circumstances the trait series (A + 2H + a) becomes (3A + a); Mendel's 3(dominant):1(recessive) trait ratio is accounted for without introducing arbitrary and inconsistent arguments [1].\n", - "2492 \n", - " Western blot of TTR in paired plasma (A) and urine (B) of seven (1–7) healthy individuals and in seven urine samples (C) of healthy pregnant women. S = TTR standard\n", - "2493 \n", - " Mass spectra resulting from SELDI-TOF-MS immunoaffinity analysis of three (1–3) paired plasma (A) and urine (B) samples obtained from healthy individuals (a) and three urine samples (C) from healthy pregnant women.\n", - "2500 \n", - " The confirmation of Ndrg1 protein induction in different cell lines. (A) HTE cells were incubated with different concentrations of NiCl2 (Ni), hypoxia, and 300 μM of CoCl2 (Co) for 20 hrs. (B) HOS and MCF-7, (C) PW and DU-145 cells were incubated with 500 μM of NiCl2 (nickel), hypoxia, and 300 μM of CoCl2 (cobalt) for 20 hrs. Western blot analyses were done as described in 'Methods' section. The membranes were first incubated with anti-Ndrg1 antibody (top panels), then stripped, and rehybridized with anti-actin antibody (bottom panels) to show loading.\n", - "2505 \n", - " Consensus unrooted trees generated by the Neighbor-Joining distance method for the RecA (A) and for the LexA proteins (B). The circles highlight the main groups of bacteria. The symbol * indicates the beta proteobacteria. Some groups of bacteria included in (A) which are absent in the other trees: Spirochaetales: TREPA: Treponema pallidum (gi| 7443874), BORBU: Borrelia burgdorferi (gi| 15594476); Chlamydiales: CHLTR Chlamydia trachomatis (gi| 7443880), CHLPN: Chlamydophila pneumoniae CWL029 (gi| 7443883). The homologs of X. axonopodis and X. fastidiosa are indicated inside the square boxes.\n", - "2506 \n", - " Consensus unrooted trees generated by the Neighbor-Joining distance method for the UvrA (A), UvrB (B), UvrC (C) proteins and for the UvrD helicase family (D). The numbers in front of organism names indicate the number of members of this gene family in the corresponding organism. The circles highlight the main groups of bacteria. Inside the square box, the homologs of X. axonopodis and X. fastidiosa. In (A) there is a clear distinction between the two UvrA orthologs separated by the line. In the upper part of the figure are grouped the organisms containing the second UvrA homolog, for which no function in DNA repair has yet been assigned. In (D) the names of the genes are based on annotation available.\n", - "2508 \n", - " Consensus unrooted trees generated by the Neighbor-Joining distance method for the NAD+ dependent (A) and ATP-dependent DNA ligases (B). The circles highlight the main groups of bacteria. The homologs in Xanthomonadales are in square boxes. The symbol * indicates the beta proteobacteria. Some copies of homologs were excluded from this analysis given the low similarity among the DNA ligase ATP-dependent.\n", - "2562 \n", - " MYC Overexpression in Adult Hepatocytes Results in HCC(A) Western blot analysis demonstrating that mice transgenic for both LAP-tTA and TRE-MYC conditionally express MYC protein in their hepatocytes in the absence (−) but not in the presence (+) of doxycycline.(B) Adult mouse with MYC-induced liver tumor.(C) Histology of an adult MYC-induced liver tumor.(D) Gross pathology of an adult liver tumor transplanted subcutaneously into a scid mouse.(E) Histology of an adult tumor transplanted subcutaneously into a scid mouse.\n", - "2563 \n", - " MYC-Induced Hepatic Tumors Are Invasive and Metastatic(A) Adult mouse with MYC-induced liver tumor that has metastasized to the abdomen and the lungs.(B) Histology of an adult MYC-induced lung metastasis.(C) Histology of an adult MYC-induced liver tumor.(D) Gross pathology of a liver tumor from a neonatal host transplanted subcutaneously into a scid mouse.\n", - "2564 \n", - " MYC's Ability to Induce HCC Is Inversely Correlated with the Age of the Host at the Time of MYC Activation(A) Survival of transgenic mice demonstrates that tumorigenesis in the liver is inversely correlated with the age of the host at the time of MYC induction. Shown are cases where MYC was constitutively expressed (▪), newborn mice in which MYC was activated at birth (▴), young mice in which MYC was activated at 4 weeks of age (•), adult mice in which MYC was activated at 6–12 weeks of age (♦), and transgenic mice treated with doxycycline (□). Cohorts consisted of 15–30 mice. Mice were scored when moribund. MYC transgene expression was induced to similar levels in the differently aged cohorts of mice. Survival time is measured as the time after MYC induction.(B) Western blot examining total MYC protein levels (human MYC and endogenous murine c-MYC) in mice when MYC is induced during embryonic development, activated at birth, and activated during adulthood (after 10 weeks of age). Adult mice exhibited a progressive increase in MYC protein levels during the course of MYC induction, with a significant increase in MYC protein in tumors. MYC protein levels in neonatal mice in which MYC was activated at birth were slightly increased at 10 d of age, and significantly increased at 18 d of age when these mice developed liver tumors. Liver tumors in 2- and 6-d-old neonatal mice that overexpressed MYC during embryonic development exhibited MYC protein levels similar to those observed in neonatal and adult tumors.(C) Real-time PCR analysis showing human MYC RNA levels in mice after different durations of MYC transgene induction. Adult livers exhibited a small increase in MYC RNA levels upon MYC activation, and a much greater increase in MYC RNA in MYC-induced tumors (black bars). In neonatal mice in which the MYC transgene was induced at birth, MYC RNA levels rose after 10 d of MYC activation. When these neonatal mice developed liver tumors, they exhibited MYC RNA levels similar to those seen in adult tumors (gray bars). Mice in which MYC was overexpressed during embryonic development developed liver tumors by 2 d of age and exhibited MYC RNA levels similar to those observed in neonatal and adult tumors (white bars).\n", - "2565 \n", - " \n", - "MYC Activation during Embryonic Development Induces a Rapid Onset of Neoplasia(A) A normal neonatal liver and a neonatal liver in which MYC was activated embryonically.(B) Histology of a normal neonatal liver in which MYC was not activated.(C) Histology of a neonatal liver in which MYC was activated embryonically.(D) DNA content of normal neonatal hepatocytes.(E) DNA content of neonatal hepatocytes in which MYC was activated embryonically.(F and H) Ki67 immunofluorescence and DAPI staining corresponding to a normal neonatal liver.(G and I) Ki67 immunofluorescence and DAPI staining corresponding to a neonatal liver in which MYC was activated embryonically.\n", - "2566 \n", - " \n", - "MYC Activation in Adult Hepatocytes Causes Cellular Hypertrophy(A) Relative volumes of neonatal hepatocytes and nuclei after MYC activation. Data are expressed as normalized volume plus or minus the standard error of the mean. The volume was normalized by dividing each measurement by the mean volume of normal 1-d-old neonatal mice. Three livers were measured per time point. T, tumor.(B) Neonatal liver weights of normal and MYC-activated livers. Three to five livers were weighed per time point. Data are expressed as the mean weight (grams) plus or minus the standard error of the mean.(C) Relative volumes of adult hepatocytes and nuclei after MYC activation. Volumes of cells are expressed as the mean volume divided by the mean volume of hepatocytes from normal mice plus or minus the standard error of the mean. Cells from two to three livers were measured per time point.(D) Adult liver weights after MYC activation. A total of nine livers were measured per time point after MYC activation. Data are expressed as the mean weight (grams) plus or minus the standard error of the mean.\n", - "2567 \n", - " \n", - "MYC Activation at Birth Induces Proliferation of Neonatal Hepatocytes(A) Histology of a normal 10-d-old neonatal liver.(B) Histology of a 10-d-old liver in which MYC was activated at birth.(C) Histology of a normal 18-d-old neonatal liver.(D) Histology of a MYC-induced neonatal liver tumor that developed after 18 d of MYC overexpression; MYC was activated at birth.(E–L) Ki67 immunofluorescence (E–H) and DAPI staining (I–L) of normal neonatal hepatocytes (E, G, I, and K), MYC-activated hepatocytes (F and J), and MYC-induced neonatal tumors (H and L). Upon initial MYC activation in neonatal mice, there was a small increase in Ki67-positive cells. MYC-induced neonatal tumors exhibited much higher levels of Ki67-positive cells.\n", - "2568 \n", - " \n", - "MYC Activation in Adult Hepatocytes Induces Increased Cell Size and Endoreduplication, and Only Results in Cell Proliferation upon Neoplastic Conversion of Hepatocytes(A) Histology of a normal liver.(B) Histology of a liver 2 months after MYC activation.(C) Histology of a MYC-induced liver tumor.(D and G) Ki67 immunofluorescence and DAPI staining of a normal adult liver.(E and H) Ki67 and DAPI staining of an adult liver after 8 weeks of MYC activation.(F and I) Ki67 and DAPI staining of a MYC-induced adult tumor.(J) DNA content measured in normal hepatocytes.(K) DNA content measured after MYC induction for 2 months.(L) DNA content of a representative MYC-induced liver tumor.\n", - "2571 \n", - " \n", - "MYC Activation Induces p53 Function, and Loss of p53 Function Is Necessary for MYC to Induce Tumorigenesis in Adult Hepatocytes(A) Western blot analysis for p53 protein expression after MYC activation for 1 month, 2 months, and in MYC-induced tumors. As a positive control, we used a lymphoma cell line that overexpresses a mutant p53, kindly provided by Dr. Kevin Smith.(B) Western blot analysis for p53 protein expression in a normal neonatal liver, in a neonatal liver in which MYC was activated during embryonic development that was obtained from a 2-d-old mouse, and in MYC-induced neonatal tumors. As a positive control, we used a lymphoma cell line generated in our lab that overexpresses a mutant p53.(C) Northern blot analysis for p21 and MDM2 in neonatal and adult liver tumors.(D) Survival of adult mice after activation of MYC in the presence of the wild type or the loss of one p53 allele.(E) Loss of heterozygosity analysis of MYC/p53+/− tumors by PCR analysis.\n", - "2572 \n", - " Partial Hepatectomy Accelerates the Ability of MYC to Induce HCC in Adult Mice(A) Liver from an adult mouse 7 weeks after MYC activation exhibited no gross phenotypic changes (left), whereas the liver from an adult mouse 7 weeks after MYC activation that had undergone partial hepatectomy exhibited a multifocal liver tumor (right).(B) The histology of the liver from an adult mouse 7 weeks after MYC activation exhibited no evidence of a tumor.(C) The histology of a liver from an adult mouse after MYC activation that had undergone partial hepatectomy exhibited a multifocal HCC.(D) Survival after MYC activation in adult mice that have either not undergone surgery (▪) or undergone a partial hepatectomy (□). Results are pooled from two independent experiments with a total of ten mice per group.\n", - "2573 \n", - " The C. elegans Rhomboid Genes(A) Dendogram showing the relation between the seven-pass transmembrane domains of Rhomboids from C. elegans (C.e.), Drosophila melanogaster (D.m.), and Homo sapiens (H.s.) calculated with the neighbor joining method using CLUSTAL X (Thompson et al. 1997).(B) Alignment of C. elegans (C.e.) ROM-1 and ROM-2 and Homo sapiens (H.s.) Rho-1 relative to Drosophila melanogaster (D.m.) Rho-1. Residues identical to those of Drosophila Rho-1 are highlighted in black, and similar residues are highlighted in grey. The thick black lines indicate the predicted seven-pass transmembrane domains. The three black triangles point at the residues forming a catalytic triad that forms a charge-relay system to activate the essential serine residue during peptide bond cleavage, and the three open triangles indicate other conserved residues necessary for the enzymatic activity as identified in D.m. Rho-1 (Urban et al. 2001). The region underlined with a dotted line indicates the extent of deletion in the rom-1(zh18) allele.(C) Intron-exon structure of the rom-1 locus and extent of the deletion in the rom-1(zh18) strain. The numbers indicate the position of the deletion break-points relative to the A in the ATG start codon.\n", - "2576 \n", - " Alternative Splicing of lin-3 mRNA(A) RT-PCR amplification of lin-3 mRNA from mixed-stage N2 cDNA before (left) and after (right) size fractionation by preparative agarose gel electrophoresis. The lowest band corresponding to LIN-3S is most prominent, and the two upper bands correspond to LIN-3L and LIN-3XL.(B) Intron-exon structure of the lin-3 locus. The lin-3L splice variant is generated by the usage of an alternative (more 3′ located) splice donor in exon 6a. The lin-3XL variant contains the additional exon 6b inserted between exons 6a and 7. The regions encoding the EGF repeat in exon 5 and part of 6a and the transmembrane domain in exon 7 are outlined, and the positions of the PstI sites used for the construction of the minigenes are indicated (see Materials and Methods). The structure of the lin-3S and lin-3L minigenes is shown in the lower part of the graphic.(C) Sequence alignment of the alternatively spliced region in LIN-3 with the corresponding region in Drosophila Spitz. The 15 and 41 amino acids in LIN-3L and LIN-3XL, respectively, in the juxtamembrane region break the alignment of LIN-3 with Spitz. The C-terminal end of the EGF domain is underlined with a horizontally hatched bar, and the beginning of the transmembrane domain is underlined by a diagonally hatched line.\n", - "2578 \n", - " Scs2 Regulates the Function of Opi1 on the Nuclear Membrane(A) Steady state protein levels and localization of Opi1, Ino2, and Ino4 under repressing and activating conditions. Strains expressing myc-tagged Opi1, Ino2, or Ino4 (Longtine et al. 1998) were grown in the presence (INO1 repressing condition) or absence (INO1 activating condition) of myo-inositol for 4.5 h. Tagged proteins were analyzed by Western blotting (size-fractionated blots on the left, designated Opi1, Ino2, and Ino4) and indirect immunofluorescence (photomicrographs on the right). For Western blot analysis, 25 μg of crude lysates were immunoblotted using monoclonal antibodies against either the myc epitope (top bands in each set) or, as a loading control, Pgk1 (bottom bands in each set; indicated with an asterisk). Immunofluorescence experiments were carried out using anti-myc antibodies and anti-mouse Alexafluor 488. Bright-field (BF) and indirect fluorescent (IF) images for a single z slice through the center of the cell were collected by confocal microscopy.(B) Ino2 and Ino4 heterodimerize under both repressing and activating conditions. Cells expressing either HA-tagged Ino4 (negative control) or HA-tagged Ino4 and myc-tagged Ino2 were grown in the presence or absence of 1 μg/ml tunicamycin (Tm; an inhibitor of protein glycosylation that induces protein misfolding in the ER) for 4.5 h and lysed. Proteins were immunoprecipitated using the anti-myc monoclonal antibody. Immunoprecipitates were size-fractionated by SDS-PAGE and immunoblotted using the anti-HA monoclonal antibody. (Continued on next page)(C) Coimmunoprecipitation of Scs2 with Opi1. Detergent-solubilized microsomal membranes from either an untagged control strain (lane C) or duplicate preparations from the Opi1-myc tagged strain (myc lanes, 1 and 2) were subjected to immunoprecipitation using monoclonal anti-myc agarose. Immunoprecipitated proteins were size-fractionated by SDS-PAGE and stained with colloidal blue. Opi1-myc and the band that was excised and identified by mass spectrometry as Scs2 are indicated. IgG heavy and light chain bands are indicated with an asterisk.(D) Coimmunoprecipitation with tagged proteins. Immunoprecipitation analysis was carried out on strains expressing either Scs2-HA alone (lanes 1–3) or Scs2-HA together with Opi1p-myc (lanes 4–6). Equal fractions of the total (T), supernatant (S), and bound (B) fractions were size-fractionated by SDS-PAGE and immunoblotted using anti-myc or anti-HA monoclonal antibodies.(E) Epistasis analysis. Haploid progeny from an OPI1/opi1ΔSCS2/scs2Δ double heterozygous diploid strain having the indicated genotypes were streaked onto minimal medium with (+ inositol) or without (– inositol) 100 μg/ml myo-inositol and incubated for 2 d at 37 °C.\n", - "2579 \n", - " Ino2/Ino4 Bind to the INO1 Promoter Constitutively(A) Untagged control cells (upper images), or cells in which the endogenous copies of INO2 and INO4 were replaced with HA-tagged Ino2 (center images) or HA-tagged Ino4 (lower images) were harvested in mid-logarithmic phase and washed into medium with or without myo-inositol. After 4.5 h, about 1.5 × 108 cells were harvested and processed for Northern blot analysis (light images with dark bands, right). Northern blots were probed against both INO1 and ACT1 (loading control) mRNA. The remaining cells were fixed with formaldehyde and lysed. Chromatin was sheared by sonication and then subjected to immunoprecipitation with anti-HA agarose. Input DNA (In) and immunoprecipitated DNA (IP) were analyzed by PCR using primers to amplify the INO1 promoter and the URA3 gene. Amplified DNA was size-fractionated by electrophoresis on ethidium bromide-stained agarose gels (dark images with light bands, left).(B) Quantitative PCR analysis. Input and IP fractions were analyzed by real-time quantitative PCR. The ratio of INO1 promoter to URA3 template in the reaction is shown. Error bars represent the standard error of the mean (SEM) between experiments.\n", - "2580 \n", - " UPR-Dependent Dissociation of Opi1 from Chromatin(A) Chromatin-associated Opi1 dissociates upon activation of the UPR. Cells of the indicated genotypes were harvested after growth for 4.5 h with or without myo-inositol, fixed, and processed as in Figure 2. The scs2Δ mutant was transformed with pRS315-Opi1-myc, a CEN ARS plasmid that expresses Opi1-myc at endogenous levels. Input DNA (In) and immunoprecipitated DNA (IP) were analyzed by PCR using primers to amplify the INO1 promoter and the URA3 gene. Amplified DNA was separated by electrophoresis on ethidium bromide–stained agarose gels.(B) Quantitative PCR analysis. Input and IP fractions were analyzed by real-time quantitative PCR. The ratio of INO1 promoter to URA3 template in the reaction is shown. Error bars represent the SEM between experiments.\n", - "2581 \n", - " Membrane Association Is Essential for Scs2 FunctionThe carboxyl-terminal transmembrane domain of Scs2 was removed by replacement with three copies of the HA epitope (Scs2ΔTMD-HA; Longtine et al. [1998]).(A) Scs2ΔTMD localization. Ribosomal protein S2 (Rps2-HA), Scs2-HA, and Scs2ΔTMD-HA were localized by immunofluorescence against the HA epitope. DNA was stained with 4′,6′-diamidino-2-phenylindole. Images were collected in a single z-plane (≤ 0.7 μm thick) by confocal microscopy. Unlike Rps2-HA, which was excluded from the nucleus (indicated with white arrows), Scs2ΔTMD-HA staining was uniform and evident in the nucleoplasm.(B) Scs2ΔTMD steady-state levels. Equal amounts of whole cell extract from cells expressing either Scs2-HA or Scs2ΔTMD-HA were analyzed by immunoblotting.(C) Scs2ΔTMD is nonfunctional. Strains expressing the indicated forms of Scs2 were streaked onto medium with or without myo-inositol and incubated for 2 d at 37 °C.\n", - "2582 \n", - " The INO1 Gene Is Recruited to the Nuclear Membrane upon ActivationAn array of Lac operator repeats was integrated at INO1 or URA3 in strains expressing GFP-Lac repressor and myc-tagged Sec63. GFP-Lac repressor and Sec63-myc were localized in fixed cells by indirect immunofluorescence. Data were collected from single z sections representing the maximal, most focused signal from the Lac repressor.(A) Two classes of subnuclear localization. Shown are five representative examples of localization patterns that were scored as membrane-associated (photomicrographs and plots on left) or nucleoplasmic (right). For each image, the fluorescence intensity was plotted for each channel along a line that intersects both the Lac repressor spot and the center of the nucleus.(B) INO1 is recruited to the nuclear membrane upon activation. The fraction of cells that scored as membrane-associated is plotted for each strain grown in the presence (+) or absence (–) of inositol. The site of integration of the Lac operator (Lac O), the version of the GFP-Lac repressor (GFP-Lac I; either wild-type or having the FFAT membrane-targeting signal) expressed, and the relevant genotype of each strain is indicated. The dashed line represents the mean membrane association of the URA3 gene. The vertical arrow indicates the frequency of membrane association in the wild-type strain under activating conditions. Error bars represent the SEM between separate experiments. Each experiment scored at least 30 cells. The total number of cells (and experiments) scored for each column were: bar 1, 70 (2); bar 2, 66 (2); bar 3, 39 (1); bar 4, 71 (2); bar 5, 140 (4); bar 6, 88 (2); bar 7, 88 (2); bar 8, 92 (3); bar 9, 74 (2); and bar 10, 38 (1).\n", - "2583 \n", - " Artificial Relocalization of INO1 Bypasses the Requirement for Scs2(A) Northern blot analysis of membrane-targeted INO1. Strains of the indicated genotypes having the Lac operator array integrated at INO1 and expressing either the wild-type GFP-Lac repressor or GFP-FFAT-Lac repressor were grown in the presence or absence of 1 μg/ml tunicamycin (Tm) for 4.5 h, harvested, and analyzed by Northern blot. Blots were probed for either INO1 or ACT1 (as a loading control) mRNA. The wild-type strain CRY1, lacking both the Lac operator array and the Lac repressor, was included in the first two lanes for comparison.(B) Wild-type or scs2Δ mutant strains in which the Lac operator had been integrated at INO1 were transformed with either GFP-Lac repressor or GFP-FFAT-Lac repressor. The resulting transformants were serially diluted (tenfold between wells) and spotted onto medium lacking inositol, uracil, and histidine, and incubated for 2 d at 37 °C.(C) Wild-type and scs2Δ mutant strains transformed with either GFP-Lac repressor or GFP-FFAT-Lac repressor, but lacking the Lac operator, were streaked onto medium lacking inositol and histidine and incubated for 2 d at 37 °C.\n", - "2633 \n", - " P-Sig and Q-Sig Defined by Gene Expression Levels in HSCs in Different Stages of Cell Cycle(A) Graphic depicting the changes in bone marrow cellularity and number of HSCs in cell cycle following 5FU treatment (adapted from Harrison and Lerner 1991; Randall and Weissman 1997).\n", - "(B) Schematic of 5FU-HSC time course analysis. The genes that change over the time course can be split into two groups based on the day of maximum expression (TOM).(C) Schematic of pair-wise comparison between quiescent adult HSCs and FL-HSCs, showing groups of genes either up-regulated in the quiescent adult cells or up-regulated in the cycling FL-HSCs.(D) Genes that were both up-regulated in FL-HSCs and were in the proliferation group composed the P-sig. The P-sig shows 94% overlap with the group of genes that were up-regulated in FL-HSCs and changed over the time course.(E) Genes that were both in the quiescence group and up-regulated in adult HSCs were termed the Q-sig. The Q-sig overlaps 96% with the set of genes that were up-regulated in adult HSCs and changed over the time course.(F) Overlap of the ST-HSC signature with P-sig revealed 73% in common, defining the common P-sig.(G) Overlap of the LT-HSC signature with Q-sig revealed 58% in common and defined the common Q-sig.This figure is interactive online, and provides contextual access to Tables S1–S11. Use your mouse to highight animated areas of the graphic. Click on these areas to link to related files. \n", - "2634 \n", - " P-Sig and Q-Sig Show Patterns of Activation and Down-Regulation with Respect to Cell Cycle Status(A) Averaged pattern of P-sig gene expression over the 5FU time course plotted in solid lines, with the contributing TOM subgroups plotted in dashed lines.(B) Heat map of each gene in P-sig over the 5FU time course showing TOM subgroups in brackets.(C) Averaged pattern of Q-sig gene expression over the 5FU time course plotted in solid lines, with the contributing TOM subgroups plotted in dashed lines.(D) Heat map of each gene in Q-sig over the 5FU time course showing TOM subgroups in brackets.For both heat maps, relative expression levels are displayed according to color intensity, blue (lowest) to yellow (highest).This figure is interactive online, and provides contextual access to Tables S12–S18. Use your mouse to highight animated areas of the graphic. Click on these areas to link to related files.\n", - "2635 \n", - " GO Analysis and Chromosomal Clustering(A) Dendrogram of gene lists clustered solely according to their similarity in GO content.(B) Bar graph showing enrichments of selected GO groups in the Q-sig and P-sig. Fold changes are relative to whole microarray (p < 0.05). Asterisk marks groups in which no genes were found (complete depletion).(C) Percentage of genes within each list that are in the GO groups “cell cycle” or “cell–cell adhesion.”(D) Distribution of hits within Q-sig and P-sig on each chromosome normalized for number of expected hits for whole microarray. Pound sign denotes significant differences between Q-sig and P-sig (p < 0.05).This figure is interactive online, and provides contextual access to Tables S19–S45. Use your mouse to highight animated areas of the graphic. Click on these areas to link to related files.\n", - "2636 \n", - " Gene Expression Profiles Correlate with Protein Expression on HSCs(A) Gene expression over time. The actual observed values of each replicate at each time point are shown in red, and the line connects the predicted expression value at each time point based on our regression analysis.(B) Antigen expression on HSCs measured by flow cytometry. Gray lines represent negative control, red lines represent protein expression at day 0, and blue lines represent protein expression at day 7.(C) Cell cycle analysis of CD48− and CD48+ HSCs isolated 6 d post 5FU treatment.\n", - "2637 \n", - " Model of HSC Activation Cycle(A) Normal HSCs reside in a quiescent niche in a “state of readiness” exemplified by the indicated genes.(B) Upon stress (5FU treatment), HSCs “pause” by remaining quiescent and in their niche while they “prepare” to proliferate. HSCs receive signals from proinflammatory cytokines at this point. The signals induce a proliferative state that is divisible into early (C) and late (D) phases.(C) “Early proliferation” is marked by an increase in expression of genes involved in DNA replication, repair, and cell migration molecules that allow movement of HSCs from the quiescence niche to the proliferative zone.(D) “Late proliferation” is marked by expression of many cell cycle genes as well as many energy pathway molecules.(E) Re-induction of quiescence involves changes in migratory molecule expression, which leads to return of cells to their quiescence niche, as well the expression of antiproliferative genes.\n", - "2657 \n", - " Enhancer trap lines exhibit a variety of unique GFP expression patterns. (A). Lateral view of GFP expression in Enhancer Trap line 1 (ET1) at 38 hours post fertilization (hpf). (B) ET3 at 5–6 somite stage. (C) ET3 at 36 hpf. (D) ET4 at 26 hpf. (E) ET5 at 30 hpf. (F) ET5 at 48 hpf. (G) ET6 at 26 hpf. (H) ET7 at 32 hpf. (I) Ventral view of ET7 at 5 dpf. (J) Lateral view of ET8 at 26 hpf. (K) Dorsal view of ET9 at 28 hpf. (L) Lateral view of ET9 at 30 hpf. In all panels, anterior is to the left. See text for details.\n", - "2658 \n", - " The ET2 transgenic fish line expresses GFP in caudal primary motoneurons. GFP expression in ET2 was visualized in motoneurons using a bandpass GFP filter set at various stages of embryonic development. In all panels anterior is to the left. (A) The onset of GFP expression in ET2 line at 16 somite stage. (B) 26 somite stage. (C) 24 hpf. (D, E) 36 hpf. Axonal trajectories are visible at 24 and 36 hpf.\n", - "2659 \n", - " Identification of the transposition event in the ET2 line. (A) The pT2/S2EF1α transposon insertion into zebrafish genome is shown; restriction enzyme sites and primers used for molecular analysis are indicated. Transposon IR/DR's are shown as solid boxes with open triangles, and the GFP open reading frame is shown as a grey arrow. Genomic DNA is shown as a dotted line. N is NsiI, E is EcoRV. (B) Southern blot on ET2 line outcross embryos. DNA from GFP positive (lanes 1 and 2) and GFP negative (lanes 3 and 4) embryos was digested with NsiI (lanes 1 and 3) or EcoRV (lanes 2 and 4) and probed with a GFP-specific probe. (C) Linkage of the transposon insertion event to GFP expression. Primers flanking the transposon insertion event (arrows) were used to conduct PCR on DNA from GFP positive (lane 2) and GFP negative (lane 3) embryos from an ET2 outcross different from the one used in (B). Lane 1, λ Eco47III Marker (Fermentas Inc).\n", - "2660 \n", - " GFP expression in ET2 line embryos is indistinguishable from endogenous PARG gene expression. 23 hpf embryos collected from a heterozygous outcross were photographed for GFP fluorescence and sibling embryos were fixed for in situ hybridization. (A) In situ hybridization with PARG antisense probe. (B) In situ with GFP antisense probe. (C) Visualization of GFP expression in living embryos using a bandpass GFP filter set. (D) The same embryo as in (C) photographed using a bandpass GFP filter set with a low level of bright field illumination to visualize GFP expression in relative position to the somites.\n", - "2661 \n", - " GFP expression in ET7 line matches mkp3 mRNA expression. (A) GFP fluorescence photograph of an ET7 embryo at 23 hpf. (B) In situ hybridization on 23 hpf wild type embryo using mkp3 antisense RNA probe.\n", - "2667 \n", - " Nestin-positive MSC conditioned medium act on the GFAP-positive cell death but not on cell proliferation. (A) Characterization of committed cell types in proliferating neurospheres in presence of EGF. We observed that 14.4 ± 7.1%, 7.1± 4.1% and 3.4 ± 1.6% of cells were respectively GFAP-, Tuj1- and O4-positive (these data were obtained by absolute counts on 1576 cells). (B-C) The proliferative capacity of the differentiating neurosphere-derived cells placed in npMSC conditioned medium, nnMSC conditioned medium and in control medium (DEM/F12 + B27) was compared. BrdU incorporation was performed after 48 hours and 4 days in differentiating conditions. Double labelling GFAP-, Tuj1- and O4 with BrdU were performed. The BrdU incorporation by differentiating neurosphere-derived cells placed in the various conditions did not shown significant differences (Statistical test ANOVA, P > 0.05). (D-E) The cell death quantified by propidium iodide incorporation and counting was analysed after 48 hours and 4 days in differentiating conditions and in GFAP-, Tuj1- and O4-positive cells. After 48 hours, a significant decrease of the number of GFAP-positive cells which have incorporated the propidium iodide is observed (***Student T test, p < 0.0001). However, no significant increase of cell death was observed in O4- and Tuj1-positive cell population (Student T test, p > 0.05). After 4 days of differentiation, no difference in cell death is observed whatever the cell type or the culture condition.\n", - "2668 \n", - " Release of an active form of BMP4 by nestin-positive MSCs. (A)RT-PCR and quantitative RT-PCR were performed on npMSCs and nnMSCs. The results of quantitative RT-PCR are expressed as percent of gene expression in npMSCs compared to nnMSCs (arbitrarily as 100%) after normalisation with the GAPDH house-keeping gene expression. (B) Western blotting analysis of conditioned media by npMSCs, nnMSCs and NSC. The mature and biologically-active form of BMP4 (27 kDa) is only observed in medium conditioned by npMSCs and the 57 kDa immature and non biologically-active form can be seen in nnMSC and in neural stem cells conditioned medium. This high MW form is not present in npMSC conditioned medium, indicating a complete cleavage and activation of BMP4. (C) Effect of anti-BMP4 antibodies in differentiating NSCs cultivated in DEM/F12 or npMSCs conditioned medium. Anti-BMP4 antibodies inhibit the npMSCs effect on astroglial and oligodendroglial cell numbers but not the effect on neurons number (47.13 ± 1.53% of GFAP-positive cells, 9.98 ± 0.92% of Tuj1-positive cells and 5.67 ± 0.45% of O4-positive cells with anti-BMP4 compared to respectively 77.5 ± 2.5%, 4.30 ± 0.95% and 1.47± 0.60% in npMSC conditioned-medium). Tuj1-positive cells remains significantly lower (***student T test, p < 0.001, n = 5).\n", - "2695 \n", - " Functional expression of Rho-mOREG using a CNG-based assay. (A) HEK293 cells transiently transfected with Rho-mOREG and CNG were assayed for increases in intracellular calcium in response to 100 uM eugenol. Images contain ~2000 confluent cells and represent responses at the indicated times following odorant stimulation. Scale bar is 300 um. Responses were observed in ~10% of total cells or ~20% of transfected cells (~50% transfection efficiency). (B) Quantitation of cells expressing vector only (a), Rho-mOREG only (b), CNG only (c), Rho-mOREG and CNG (d and e) following stimulation with 100 uM eugenol (a-d) or 100 uM heptanal plus 100 uM octanal (e). * p < 0.001 compared to cells expressing vector only (a).\n", - "2699 \n", - " ER export and trafficking through the Golgi apparatus are required for Rho-mOREG functional expression. CNG cells transiently transfected with Rho-mOREG were assayed for increases in intracellular calcium in response to 10 uM eugenol, to gauge Rho-mOREG function, or 1 nM isoproterenol, to gauge β-AR function, following treatment with vehicle (0.1% ethanol), BFA (5 ug/ml), monensin (10 uM), or incubation at 20°C for 4 h (A) or 5 min (B). (C) Cells were treated with vehicle or CHX (75 uM) for 4 hr. In all experiments, cells were also co-treated for 4 h with control (0.1% DMSO), 10 mM 3-MA, or 50 uM MG-132 as indicated. Partial inhibition of Rho-mOREG function with BFA or monensin but not 20°C (A, control columns), a temperature that also attenuates endocytic events, is likely attributable to turnover of cell surface Rho-mOREG when the biosynthetic pathway, which normally replenishes the plasma membrane Rho-mOREG pool, is blocked. By contrast, BFA and monensin do not affect function of the β-AR, a control GPCR that exhibits a long half-life at the plasma membrane [31]. * p < 0.005 compared to cells treated with vehicle in the same group.\n", - "2703 \n", - " Examples of analysis of the human c-myc gene regulatory region using PATTERNFINDER in conjunction with THERMOCALC (A), in BATCH mode (B), and with WEB-THERMODYN (C) [see text].\n", - "2713 \n", - " Transmission success as measured by (A) the geometric mean oocyst load per mosquito and (B) the percentage of mosquitoes that were positive for at least one oocyst, related to day of death for the 2 single clone and the mixed clone type infections. Three birds in each group (injected with single or mixed parasite clones as in Figs. 1 & 2) were gorged on mosquitoes on the first day of patent infection. Thai clone (squares); SL clone (open circles); mixed clones (crosses). Line represents least squared residual best fit for the relationship between oocyst load and day of death. (A) R2 = 0.68, P = 0.017; (B) R2 = 0.41, P = 0.032.\n", - "2714 \n", - " Comparison of lifetime transmission success with day of host death. Lifetime transmission success is defined as (A) the mean number of oocysts per mosquito for a given day totalled over the 4 days of acute phase transmission; (B) the percentage of mosquitoes with at least one oocyst. Infections were initiated using infectious mosquitoes as in Figs. 3 & 4. Thai or SL clone alone, 8 infective mosquitoes per bird; Mixed infections were initiated using 8 or 4 infective mosquitoes from batches of mosquitoes infected with either of the clones. Mosquitoes were gorged on all birds from the first day parasites were patent in the blood, (a) Thai clone (square); SL clone (open circles); mixed 8+8 clones (triangle); mixed 4+4 clones (crosses).\n", - "2715 \n", - " Comparison of lifetime transmission success with peak anaemia. Lifetime transmission success is defined as (A) the mean number of oocysts per mosquito for a given day totalled over the 4 days of acute phase transmission; (B) the percentage of mosquitoes with at least one oocyst. Infections were initiated using infectious mosquitoes as in Figs. 3, 4 & 6. Thai or SL clone alone, 8 infective mosquitoes per bird; Mixed infections were initiated using 8 or 4 infective mosquitoes from batches of mosquitoes infected with either of the clones. Mosquitoes were gorged on all birds from the first day parasites were patent in the blood. Individuals that died before completion of the transmission period are excluded (a) Thai clone (square – thin solid line); SL clone (open circles – thick solid line); mixed 8+8 clones (triangle – long dotted line); mixed 4+4 clones (crosses – short dotted line). Lines are least squared residual best fit.\n", - "2736 \n", - " Ethidium bromide stained gels of β-actin and iNOS RT-PCR products in lung tissue from wild-type (A) and iNOS knockout mice (B) after 72 h normoxia or hyperoxia. Data shown are representative for seven experiments.\n", - "2760 \n", - " Aspergillus antigen-induced lung inflammation appears similar in wild-type, Mcp-1-/- and Ccr2-/- mice. H&E stained lung sections from PBS- or Aspergillus antigen-treated wild-type, Mcp-1-/- and Ccr2-/- mice. Representative normal airway from wild-type control mice (A) (similar findings from Mcp-1-/- and Ccr2-/- control mice are not shown). Representative lung sections from Aspergillus antigen-treated wild-type (B), Mcp-1-/- (C) and Ccr2-/- mice (D) demonstrate intense peribronchiolar and perivascular inflammation. Aspergillus antigen exposure and sample collection are described in methods. Magnification: 20× objective.\n", - "2762 \n", - " Aspergillus antigen induced goblet cell hyperplasia in wild-type, Mcp-1-/- and Ccr2-/- mice. Representative PAS-stained lung sections from PBS-treated wild-type mice (A) showed minimal PAS-positive staining (similar findings from Mcp-1-/- and Ccr2-/- control mice are not shown). Aspergillus antigen-treated wild-type (B), Mcp-1-/- (C) and Ccr2-/- mice (D) showed magenta staining in epithelial cells, which represents mucus. Aspergillus antigen exposure and sample collection are described in methods. Magnification, 40× objective.\n", - "2763 \n", - " Aspergillus antigen-treated wild-type, Mcp-1-/- and Ccr2-/- mice demonstrated intact Th2 cytokine production and induction of IgE. For cytokine determination, draining lymph node cells from Aspergillus antigen-treated wild-type, Mcp-1-/- and Ccr2-/- mice were isolated and stimulated with PMA/ionomycin for 40 hr and cytokine levels for IL-4 (A), IL-5 (B), IL-13 (C), and IFN-γ (D) were quantitated by ELISA. Serum IgE (E) from Aspergillus antigen-treated wild-type, Mcp-1-/- and Ccr2-/- mice and control mice were measured by ELISA. In (A-D), bars represent mean ± SE; in (E), results are expressed as the common log of IgE concentration where each circle represents a single PBS- or Aspergillus antigen-treated mouse and horizontal lines represent the mean of each group (PBS-treated, N = 5 mice/group; Aspergillus antigen-treated, N = 8–9 mice/group). Aspergillus antigen exposure and sample collection are described in methods. Asterisks (*) indicate values that are statistically significantly different (p < 0.001) compared to PBS controls.\n", - "2765 \n", - " Increased airway subepithelial collagen deposition after treatment with Aspergillus antigen. Representative lung sections from PBS-treated mice show minimal trichrome staining around small airways (A) (similar findings from Mcp-1-/- and Ccr2-/- control mice are not shown). Increased trichrome staining is noted around small airways in Aspergillus antigen-treated wild-type (B), Mcp-1-/- (C) and Ccr2-/- (D) mice. Blue staining around airways represents collagen. Aspergillus antigen exposure and sample collection are described in methods. Magnification, 20× objective.\n", - "2777 \n", - " Vif has a moderate effect on APOBEC3G steady-state levels. (A) HeLa cells were transfected with pNL-A1 and pcDNA-APO3G vector DNA at a 4:1 ratio. As control, mock-transfected cells (lane 1) and cells transfected with the Vif-deficient pNL-A1ΔVif construct and pcDNA-APO3G vector DNA at a 4:1 ratio (lane 3) were included. Cell lysates were processed for immunoblotting as described in Methods and APOBEC3G and Vif-specific proteins were identified using an APOBEC3G-specific polyclonal antibody (α-APO3G) or a Vif-specific monoclonal antibody #319 (α-Vif). Tubulin was identified using an antibody to α-tubulin. (B) APOBEC3G-specific bands were acquired by densitometric scanning of the film and were quantified using the Fuji ImageGauge 4.0 software (Fuji Photofilm Co, LTD). Results are expressed as percent of the Vif-negative control, which was defined as 100%.\n", - "2810 \n", - " Adaptation of a wound healing assay to a 384 well plate format. (A) Images from a time-lapse sequence of BS-C-1 cells migrating on a coverslip to heal a wound. Bar 20 μm. (B) Images of wounds 0, 3, 7, 12, and 24 hrs after wounding show characteristic protrusion of lamella at 3 hrs, migration by 7 hrs, and eventual healing of the wound at 24 hrs. Cells are stained for filamentous actin. Bar 100 μm. (C) Schematic of the protocol used for screening. The 96 well pin array (shown) produces wounds with consistent shape and placement within each well. Image of 25 wells stained for filamentous actin 7 hrs after wounding. Bar 500 μm. (D) The primary phenotypes observed with an automated microscope in a small molecule screen (4× objective, 7 hr healing). Wells often showed a combination of these phenotypes. Cells are stained for filamentous actin and DNA. The dotted yellow line notes the approximate edge of the initial wound (based on the high density of nuclei). Bar 100 μm.\n", - "2811 \n", - " The use of scanners to assay wound healing after 7 hrs recovery. (A) An image of actin-stained wells obtained using a fluorescence scanner. Normal healing wounds (left two columns) can be distinguished from wells treated with a titration of the actin cytoskeleton disrupter cytochalasin D (white box) by the width of the wound and staining at the wound margin. (B) An image of Coomassie-stained wells obtained using a transmitted-light scanner. Normal healing wounds have a more diffuse wound margin, denoting cell migration into the wound, than wells treated with cytochalasin D (white box). Bar 1 mm.\n", - "2813 \n", - " Automated analysis of wound healing images. (A) An image showing normal migration and the same image after automated analysis defines regions. Extracting characteristics of the lamellar region (blue) allows us to distinguish between the phenotypes that affect wound healing (Figure 1). Stains: red – filamentous actin; green – DNA. Bar 100 μm. (B) Automated and visual analysis are complementary approaches. Automatically generated lamellar width data is plotted for a 384 well plate. Compounds found to affect wound healing by visual analysis are shown in green, and wells that differed from the control in other ways (increased mitotics, a disrupted monolayer, etc.) are shown in red. Mean lamellar width (black line) and three standard deviations (red dashed lines) are plotted for control wells. Data collected from screening one 384 well plate of small molecules.\n", - "2834 \n", - " PET images taken before and after RFA treatments. This patient had a tumor size larger than 3.5 cm. PET scans were taken 1 week before (A) and 2 weeks after (B) RFA treatment.\n", - "2835 \n", - " CT images taken before and after RFA treatments. The same patient PET images were shown as Figure 1. (A) was taken before RFA treatment, (B) was taken 2 week after RFA treatment.\n", - "2840 \n", - " Reassortment of mRNA and PABP was not detected in cell lysates. The potential for displacement of PABP was tested by adding increasing amounts (0–1500 μg) of pure competitor poly (A) to 400 μl of cell lysates of PY4.1 and T98G cells prior to incubation with antibody-coated (anti-PABP) beads. Following immunoprecipitation, mRNAs were isolated from the pellets and analyzed using the RNase Protection Assay (RPA) mouse angiogenesis (mAngio) and human tumor suppressor (hTS1) multi-probe sets. Unprotected RNA probes were used to identify the nature of the different sized protected fragments. The experiment shows that the interaction between PABP and the endogenous mRNA targets cannot be disrupted by competing poly (A) RNA.\n", - "2846 \n", - " DJ-1-Deficient ES Cells Are Sensitized to Oxidative Stress(A) Schematic map of the murine DJ-1 gene in clone F063A04. The retroviral insertion places the engrailed-2 (En2) intron, the splice acceptor (SA), and the β-galactosidase/neomycin resistance gene fusion (β-geo) between exons 6 and 7.(B) Southern blot analysis of KpnI-digested genomic DNA from DJ-1 homozygous mutant (–/–), WT (+/+), and heterozygous (+/–)cells, probed with murine DJ-1 cDNA. WT DNA shows a predicted 14-kb band (WT), whereas the mutant allele migrates as a 9-kb band (insertion).(C) Western blot (WB) of ES cell lysates from WT (+/+), DJ-1 heterozygous (+/–), and mutant homozygous (–/–) clones with antibodies to murine DJ-1 (α-DJ-1) or β-actin (α-β-actin). DJ-1 migrates at 20 kDa, β-actin at 45 kDa.(D) ES cells were exposed to 0, 5, 10, and 20 μM H2O2 for 15 h and viability was assayed by MTT. Responses of DJ-1 heterozygous cells (diamonds) and DJ-1 knockout clones 9 (open circles), 16 (solid circles), 23 (squares), and 32 (triangles) are shown. ** p ≤ 0.01; *** p ≤ 0.0001.(E and F) Cell death of DJ-1 heterozygous and DJ-1-deficient cells (clone 32) after exposure to H2O2 (10 μM) was quantified by staining with PI and an antibody to AV with subsequent FACS analysis. AV staining marks cells undergoing apoptosis, whereas PI staining indicates dead cells. * p ≤ 0.05.(G) DJ-1 heterozygous (+/–) and knockout (clone 32; –/–) cells were assayed at 1, 6, and 24 h after treatment with 10 μM H2O2 by Western blotting for cleaved PARP (89 kDa), which indicates apoptosis. No band is seen for cleaved PARP or β-actin for the DJ-1-deficient cells at 24 h due to cell death. Data represent means ± standard error of the mean (SEM) and were analyzed by ANOVA with Fisher's post-hoc test.\n", - "2847 \n", - " Specificity and Mechanism of Altered Toxin Sensitivity in DJ-1-Deficient Cells(A–C) Cell viability of DJ-1 heterozygous cells (solid bar) and DJ-1-deficient knockout clone 32 cells (open bar) after 15 h exposure to H2O2 (A), lactacystin (B), or tunicamycin (C) as assayed by MTT reduction. * p ≤ 0.05.(D) DJ-1-deficient knockout cells (clone 32) were transiently transfected with plasmids containing WT human DJ-1 vector (solid bar) and PD-associated L166P mutant DJ-1 vector (gray bar); as a control, knockout cells were also transfected with vector alone (open bar). 48 h after transfection, cells were exposed to 10 μM H2O2 for 15 h and then assayed by MTT reduction. WT human DJ-1 significantly enhanced survival of the knockout cells, whereas the L166P mutant did not. Similar results were obtained at 20 μM H2O2 and with a second DJ-1-deficient clone (unpublished data). Transfection efficiency exceeded 90% in all cases and protein expression level was comparable for human WT and L166P mutant DJ-1 as determined by Western blotting (Figure S1). * p ≤ 0.05.(E) DJ-1-deficient cells (clone 32; open bar) and control heterozygous cells (solid bar) were assayed for intracellular formation of ROS in response to H2O2 treatment (15 min, 1 or 10 μM) using DHR and FACS analysis.(F) Protein carbonyl levels were measured by spectrophotometric analysis of DNP-conjugated lysates from DJ-1-deficient (clone 32; solid red line) and control heterozygous cells (dashed blue line). Data are shown as the mean ± SEM and were analyzed by ANOVA with Fisher's post-hoc test.\n", - "2848 \n", - " DJ-1-Deficient ES Cell Cultures Display Reduced DN Production(A) The SDIA coculture method. DJ-1 knockout or control heterozygous ES cells are cocultured with mouse stromal cells (MS5) in the absence of serum and leukemia inhibitory factor for 18 DIV.(B) DN production was quantified at 18 DIV by 3H-dopamine uptake assay. DJ-1-deficient ES cell cultures were defective relative to heterozygous control cultures.(C–D) Neuron production was quantified by immunohistochemical analysis as a percent of TuJ1-positive colonies that express TH (C) or GABA (D). Quantification of TH and GABA immunostaining was performed on all colonies in each of three independent wells. Colonies were scored as positive if any immunostained cells were present. * p ≤ 0.05.(E) The absolute number of TuJ1-positive colonies was not significantly different between the two genotypes.(F) Kinetic analysis of DN differentiation in DJ-1-deficient cultures (clone 32, solid square) and heterozygous controls (open circle) as quantified by 3H-dopamine uptake assay. * p ≤ 0.05.(G) DJ-1-deficient (open bar) and heterozygous control (closed bar) cultures differentiated for 9 DIV and then exposed to 6-OHDA at the indicated dose for 72 h. DNs were quantified by 3H-dopamine uptake assay. Data represent the means ± SEM and were analyzed by ANOVA followed by Fisher's post-hoc test. * p ≤ 0.05.\n", - "2852 \n", - " Overall Thiol-Disulfide State of Cellular Proteins in Exponentially Growing E. coli Wild-Type Cells(A) Colored overlay of the Coomassie blue–stained 2D gel (shown in green) and the phosphor image (shown in red) of a differentially trapped protein extract from exponentially growing E. coli wild-type cells. Proteins with a high ratio of 14C activity/protein appear red; proteins with a low ratio appear green. Protein spots with a ratio of 14C activity/protein greater than 2.0 are indicated by an arrow, while circles label abundant proteins without cysteines.(B) Distribution of the 14C activity/protein ratio in the 100 most abundant protein spots found on a Coomassie blue–stained gel. Bars representing spots with a ratio higher than 2.0 are colored red and are labeled with the name of the protein(s) they represent.(C) Distribution of the 14C activity/protein ratio in the 100 most intense protein spots found on the phosphor images. Bars representing spots with a ratio higher than 2.0 are colored red and are labeled with the name of the protein(s) they represent.(D) Regular and reverse trapping of exponentially growing E. coli wild-type cells. Details of colored overlays of stained protein gels (shown in green) and phosphor images (shown in red) of cell extracts upon regular trapping (top) and reverse trapping (bottom).\n", - "2853 \n", - " Identification of In Vivo Substrate Proteins of the Periplasmic Disulfide Bond Oxidase DsbA(A) Colored overlay of the stained 2D gel (shown in green) and the phosphor image (shown in red) of differentially trapped protein extract from exponentially growing E. coli wild-type cells. Proteins with a high 14C activity/protein ratio appear red, while proteins with a low ratio appear green. Proteins that were found to have significantly lower ratio of 14C activity/protein in the dsbA::kan strain (B and C) are labeled.(B) Overlay of the stained 2D gel (shown in green) and the phosphor image (shown in red) of a differentially trapped protein extract from exponentially growing dsbA::kan cells. Proteins that were found to have a significantly lower 14C activity/protein ratio in dsbA::kan cells than in wild-type strain (A) are marked with an arrowhead. A circle marks the position of DsbA on the wild-type gel.(C) Overlay of the stained 2D gel (shown in green) and the phosphor image (shown in red) of a differentially trapped protein extract from E. coli dsbA::kan cells growing under oxygen limitation. Arrowheads label proteins that were found to have a significantly lower 14C activity/protein ratio than the wild-type strain grown under oxygen limitation. A circle marks the position of DsbA on the wild-type gel.\n", - "2854 \n", - " Identification of the In Vivo Substrate Proteins of Thioredoxin A(A) Colored overlay of the stained 2D gel (shown in green) and the phosphor image (shown in red) of differentially trapped protein extract from exponentially growing E. coli wild-type cells. Proteins with a high ratio of activity per protein appear red, proteins with a low ratio appear green. Proteins that were found to have a significantly higher ratio of activity per protein in the trxA− strain (B) are labeled.(B) Overlay of the stained 2D gel (shown in green) and the phosphor image (shown in red) of differentially trapped protein extract from exponentially growing E. coli ΔtrxA cells. Proteins that were found to have a significantly higher ratio of 14C activity/protein in the ΔtrxA strain are labeled with an arrow.\n", - "2855 \n", - " Identification of Oxidative Stress–Sensitive Proteins In Vivo(A) Overlay of the stained 2D gel (shown in green) and the phosphor image (shown in red) of differentially trapped protein extracts from H2O2-stressed E. coli wild-type cells. Proteins that were found to have a significantly higher ratio of 14C activity/protein after 10 min of H2O2 treatment than in untreated cells are labeled.(B) Time course of the oxidation of proteins in E. coli wild-type cells upon treatment with H2O2. Details of the colored overlays of stained protein gels (shown in green) and phosphor images (shown in red) of cell extracts taken before (Co) and 2, 5, 10, and 30 min after addition of H2O2 to the cells. The selected proteins are FolE, Tpx, MetE, and TufB. Bar charts on the right show the oxidation-dependent change in ratio of 14C activity/protein of the protein spot labeled by an arrowhead.(C) Time course of the oxidation of MetE in E. coli wild-type cells upon treatment with 1 mM diamide. Details of the colored overlays of stained protein gels (shown in green) and autoradiographs taken on X-ray films (shown in red) of cell extracts taken before (Co) and 2, 10, and 30 min after addition of diamide to the cells.\n", - "2857 \n", - " Methionine Limitation during Oxidative Stress Induced by Diamide and H2O2\n", - "(A) Cells of wild-type E. coli strain W3110 growing exponentially in glucose-minimal medium were diluted into the same medium with (filled circles) or without (open circles) 0.2 mM L-methionine. Cultures were allowed to grow to an OD600 of approximately 0.5, and then diamide was added to a final concentration of 2 mM (red) or 3 mM (blue), and growth was monitored.(B) Cultures were grown as in (A), except that they were diluted into medium with (filled circles) or without (open circles) 0.2 mM L-homocysteine. At an OD600 of approximately 0.5, diamide (final concentration, 2 mM) was added to one set of cultures (red).(C) Cells of wild-type E. coli strain W3110 were grown in the presence or absence of L-methionine as described in (A). At an OD600 of approximately 0.2, H2O2 was added to one set of cultures (green) to a final concentration of 3 mM (a concentration found to be high enough to induce a significant slowing of growth).(D) Cultures were grown as in (C) except that they were diluted into medium with (filled circles) or without (open circles) 0.2 mM L-homocysteine.Note the different time scales between (A,B) and (C,D).\n", - "2860 \n", - " Disulfide Mapping of Reduced MetEReduced MetE should be cleaved N-terminally to each of its seven cysteines to generate eight protein fragments as shown in the diagram, where peptide A comprises residues 2–322, B is itz323–352, C is itz353–515, D is itz516–559, E is itz560–642, F is itz645–725, and G is itz726–753. It is assumed that itz643–644 is too small to be resolved. β-elimination of cyanylated cysteines can also occur; H is itz516–642 with β-elimination at cysteine 560, and I is itz645–753 with β-elimination at cysteine 726.(A) The HPLC trace at 280 nm for disulfide mapping of fragments derived from cyanylation and cleavage of reduced MetE. Following derivitization, the samples were chromatographed on a C4 reversed-phase column as described in the Materials and Methods. Peaks were assigned from comparison of masses determined by mass spectrometry and predicted masses (see Table 1).(B) The HPLC trace for disulfide mapping of MetEC>A1–4 (green), which only contains cysteines 643, 645, and 726, overlaid with that of the wild-type reduced protein (blue). Peaks corresponding to ABCDE, G, and I were identified from the mass data (see Table 1). The mass for one peak could not be determined, but was assigned as F by comparison to the wild-type trace.\n", - "2861 \n", - " Disulfide Mapping of Oxidized MetE Reveals That Cysteine 645 Is Glutathionylated(A) LC-MS analysis of fragments generated by cyanylation, cleavage, and total reduction (see Figure 4) of GSSG-oxidized (red) and reduced (blue) MetE. For oxidized MetE, peaks corresponding to F and I were not found. Instead, a peak was observed with a mass corresponding to J, itz643–753, with one reduced uncyanylated cysteine and β-elimination at the other cysteine. As discussed in the text, β-elimination occurs preferentially at cysteine 726 in the reduced enzyme, and we infer that the reduced uncyanylated cysteine is cysteine 645.(B) LC-MS analysis of the cleavage products in (A) prior to DTT reduction (black) or following total reduction (red). Prior to DTT reduction, a peak is observed that has a mass corresponding to that expected for K, itz643–753, with a glutathione adduct at one cysteine and β-elimination at the other cysteine. As discussed in the text, β-elimination occurs preferentially at cysteine 726 in the reduced enzyme, and we infer that the glutathionylated cysteine is cysteine 645. The peak containing fragment J, the product of DTT reduction, is no longer apparent. The broad peak, indicated by the asterisk, appeared to contain a mixture of fragments with masses that could not be deconvoluted. These were attributed to disulfide-linked byproducts formed under the basic cleavage conditions prior to reduction with DTT.\n", - "2862 \n", - " Cysteine 645 Is Critical for Sensitivity of MetE to Oxidation(A) The activity of 50 μM wild-type MetE (black), MetEC>A1–4 (blue), and MetEC>A5 (red) was assayed following addition of GSSG to a final concentration of 5 mM. 100% activity refers to the specific activity of the fully reduced enzyme prior to GSSG addition (27 min−1 for wild-type, 24 min−1 for mutant).(B) The change in absorbance at 325 nm was used to monitor diamide reduction after addition of 500 μM diamide to buffer (light blue), 50 μM wild-type MetE (black), and 50 μM MetEC>A5 (red).(C) Scheme for the reaction of MetE with diamide. In the first step, attack of cysteine 645 on diamide forms an inactive but stable complex. In vivo, where GSH is present in high concentration, attack of GSH leads to the formation of MetE-S-SG and reduced diamide.\n", - "2863 \n", - " Glutathionylation of MetE Induces a Conformational Change(A) Gel filtration analysis of reduced (blue), GSSG-oxidized (red), or a mixture of reduced and GSSG-oxidized (black) MetE.(B) Far UV CD spectra of reduced (blue) and GSSG-oxidized (red) MetE.(C) SDS-PAGE analysis of a digestion of native MetE with 0.08% trypsin. The band corresponding to the molecular weight of the holo-protein is marked with an asterisk.(D) GroEL (2 μM) was incubated with 1 μM reduced (blue) or GSSG-oxidized (red) MetE and the proteins were then subjected to gel filtration.\n", - "2864 \n", - " The Equilibrium Constant for MetE Oxidation Is Consistent with MetE Inactivation In Vivo(A) MetE was incubated with the indicated [GSH]/[GSSG] ratios at 1.1 mM (yellow), 2.3 mM (red), 4.6 mM (green), or 9.1 mM (blue) GSH until equilibrium was reached, as judged by a constant level of activity with time. MetE activity was then assayed to determine the relative amount of active reduced enzyme. The equilibrium constant, Kmix (see equation 2) was determined to be 1.4 from the plot of relative MetE activity versus [GSH]/[GSSG]. This value was independent of the GSH concentration and dependent only on the [GSH]/[GSSG] ratio, consistent with glutathionylation as the mechanism of inactivation.(B) Cellular redox potentials are often referenced in terms of the GSH–GSSG couple, which depends upon [GSH]2/[GSSG]. Since inactivation of MetE occurs via glutathionylation (which is dependent on [GSH]/[GSSG]), a redox potential (which is dependent on [GSH]2/[GSSG]) for inactivation of MetE (by equilibrium titration with GSH/GSSG) cannot be determined. In order to provide a physiological context for the Kmix determined in vitro, the equilibrium fraction of MetE expected to be active at different glutathione concentrations, 1 mM (red), 2 mM (green), and 5 mM (blue), was determined as a function of the cellular potential as described in the text. The regions designated “normal growth” and “oxidative stress” were inferred from published estimates of typical redox potentials in cells experiencing these conditions (Gilbert 1990).\n", - "2865 \n", - " In Vivo Thiol-Trapping Experiments(A) The strategy for in vivo thiol trapping involves brief incubation with iodoacetamide, which is able to efficiently alkylate all available thiols. Oxidized cysteines in the TCA-precipitated proteins are reduced, and the sulfhydryls exposed are then trapped with iodoacetic acid, which adds a negative charge. The two forms of the protein are separated by isoelectric focusing, and MetE is visualized by immunoblotting. Oxidized MetE results in a more acidic band on the gel than reduced MetE.(B) Thiol-trapping experiments were performed on a trxA gor strain (WP843) of E. coli (lane 2) as well as the isogenic wild-type strain (DHB4) (lane 1). The position of MetE on the gel may be compared with that of the reduced (lane 3) and GSSG-oxidized (lane 4) purified protein.\n", - "2866 \n", - " MetE Is Oxidized When E. coli Experience Oxidative Stress(A) Growth of a trxB gor strain (WP778) containing a plasmid expressing MetE was monitored by measurement of the OD600 during growth in LB medium supplemented with 4 mM DTT (filled symbols). At an OD600 of approximately 0.4, cells were filtered to remove the DTT, resuspended in fresh LB medium, and growth was monitored (open circles).(B) In vivo thiol-trapping experiments were performed before and after removal of DTT from the medium. Lanes 1 and 7 contain thiol-trapped samples of purified reduced MetE, and lanes 2 and 8 contain thiol-trapped samples of glutathionylated MetE prepared in vitro by treatment of MetE with GSSG.(C) Growth of wild-type E. coli (strain W3110) in glucose-minimal medium was monitored by the OD600 with (filled circles) and without (open circles) the addition of diamide (at OD600 approximately 0.5) to a final concentration of 0.9 mM.(D) In vivo thiol-trapping experiments were carried out to assess the oxidation state of MetE at various times following diamide addition. Lanes 1, 2, and 8 contain thiol-trapped samples of purified reduced and/or diamide-oxidized MetE.\n", - "2872 \n", - " MSL Binding to Pieces of X Chromosome Inserted into AutosomesSalivary glands from males heterozygous for each transposition were fixed (47% acetic acid in phosphate-buffered saline, then lactic acid/water/acetic acid [1:2:3]), squashed on slides, treated with anti-MSL-1 antibodies and a secondary Cy3 anti-rabbit immunoglobulin G antibody, then counterstained with DAPI and viewed using a Zeiss Axiophot microscope. Both duplications and transpositions were able to attract compensasomes, whether or not they contained predicted entry sites.(A) Line II.(B) Line I, which contains the roX1 gene.(C) Line X shows one to two bands on the smallest transposition we studied; the intensity of the second band was variable even on the X chromosome.(D) Line IV.(E) Line IX.(F) Line XI.Breakpoints (described in Table 1) were verified by cytology when possible and/or with specific probes by in situ hybridization. Gray value images were pseudo-colored and merged.\n", - "2874 \n", - " Compensasomes Do Not Spread from the X Chromosome onto Autosomal Regions Inserted on the X(A) Females expressing MSL-2 from an msl2Δ3–21 transgene and bearing a reciprocal translocation between the X and second chromosome (line XIII) do not show additional bands in the regions of the 2L arm juxtaposed to X chromosome material.(B) MSL binding pattern on the X chromosome of a wild-type male.(C and D) The autosomal region 81F–82F10–11 does not show MSL binding when inserted at 3D in the single X of a male (line XV) (C) or in MSL-2-expressing females heterozygous for the same transposition (D). Note that the MSL binding pattern on the X chromosome is not altered by the insertion. The light band (arrow) maintained on the wild-type unpaired region of the X of a female heterozygous for the transposition is also present next to the same insertion at 3D on the unique X chromosome of a male (compare C and D).\n", - "2878 \n", - " DJ-1 Is a Redox-Dependent Molecular Chaperone(A) Aggregation of CS was monitored at 43 °C after addition of either 0.8 μM CS alone (black), or along with 8.0 μM RNase A (purple), 0.5 μM DJ-1 (aqua), 2.0 μM DJ-1 (blue), 4.0 μM DJ-1 (red), or 2.0 μM Hsp27 (green).(B) Aggregation of 0.8 μM CS after 30 min at 4 °C (unfilled bar) is inhibited by 4.0 μM WT DJ-1 (black bar) but not 4.0 μM L166P mutant DJ-1 (gray bar). Data are shown as the mean ± SEM and were analyzed by ANOVA with Fisher's post-hoc test. * p < 0.05.(C) Aggregation of insulin (26 μM) B chains induced by 20 mM DTT at 25 °C. Insulin alone (black) or in the presence of 4.0 μM RNase A (purple), 0.5 μM DJ-1 (aqua), 2.0 μM DJ-1 (blue), 4.0 μM DJ-1 (red), or 2.0 μM Hsp27 (green).(D) CS thermal aggregation (unfilled bar) is suppressed by 4 μM DJ-1 (black bar), but chaperone activity is abrogated upon incubation of DJ-1 with 0.5 mM DTT for 10 min at 4 °C (gray bar). Further treatment of DTT-reduced DJ-1 with 10 mM H2O2 for 10 min at 4 °C leads to reactivation of CS suppression (hatched bar). Data are shown as the mean ± SEM and were analyzed by ANOVA with Fisher's post-hoc test. * p < 0.05.\n", - "2879 \n", - " DJ-1 Inhibits Formation of αSyn Protofibrils and Fibrils In Vitro(A) Purified αSyn (200 μM) was incubated for 2 h at 55 °C in the presence of WT DJ-1, L166P mutant DJ-1, GST, or Hsp27 (all at 100 μM). WT DJ-1 inhibits accumulation of αSyn protofibrils in vitro, while L166P mutant DJ-1, GST, and Hsp27 do not.(B) Suppression of αSyn protofibril formation by WT DJ-1 (in triplicate) was quantified as compared to GST (as a negative control) and mutant L166P DJ-1. Data are shown as the mean ± SEM and were analyzed by ANOVA with Fisher's post-hoc test. * p < 0.05.(C) Purified αSyn (200 μM) was incubated for 1 wk at 37 °C in the presence of WT DJ-1, L166P mutant DJ-1, or GST (all at 100 μM). WT DJ-1 inhibits formation of mature Congo red–positive αSyn fibrils. Data are shown as the mean ± SEM and were analyzed by ANOVA with Fisher's post-hoc test. * p < 0.05.\n", - "2880 \n", - " Overexpression of WT DJ-1 Inhibits Aggregation of αSyn In Vivo(A) CAD murine neuroblastoma cells were transfected with Flag-αSyn along with WT DJ-1, L166P clinical mutant, or vector alone, and were differentiated in vitro via serum withdrawal. Cells were subsequently treated with 2 mM FeCl2 (Fe), 5 μM lactacystin (LC), or media alone (0). Triton X-100-soluble (Tx-100 sol) and Triton X-100-insoluble (Tx-100 insol) fractions were analyzed by Western blotting. Upon FeCl2 treatment, αSyn accumulates in the Triton X-100-insoluble fraction, and accumulation of insoluble αSyn is inhibited by overexpression of WT DJ-1 (left) but not the L166P clinical mutant (right).(B) Triton X-100-insoluble αSyn as quantified by NIH Image J of a Western blot (from [A]).(C) Heterozygous (+/–) and DJ-1 deficient (–/–) ES cells were differentiated using the embryoid body protocol. Cells were transfected with Flag-αSyn (F-αSyn), and, after 48 h, treated with 2 mM FeCl2 or with media alone for 18 h. Cell lysates were analyzed by Western blotting for αSyn or β-actin. In the Triton X-100-soluble fraction (Tx-100 sol), DJ-1 accumulated to a similar extent in the knockout and control cells. In contrast, αSyn accumulation in the insoluble pool (Tx-100 insol) was detectable only in the knockout cells, and this was further promoted by FeCl2 treatment.(D) CAD cells transfected with Flag-αSyn (F-αSyn) along with WT DJ-1 (or vector alone) were treated with 2 mM FeCl2 or media alone for 18 h. Triton X-100-soluble cell lysates were immunoprecipitated with a mouse monoclonal antibody for the Flag epitope and Western blotted for DJ-1. FeCl2 treatment induces association of Flag-αSyn with WT DJ-1. Lysates represent 20% input of the immunoprecipitation (IP α-Flag). The Triton X-100 soluble pool of DJ-1 is reduced by αSyn overexpression (but not vector control), particularly in the context of FeCl2 treatment (bottom).(E) DJ-1 colocalizes with αSyn in the Triton X-100-insoluble fraction upon FeCl2 treatment. The Western blot from (A) was stripped and reprobed for DJ-1.\n", - "2883 \n", - " DJ-1 In Vitro Chaperone Activity and In Vivo Oxidative Stress Protection Activity Require Cysteine 53 but Not Cysteine 106(A) DJ-1 cysteine-to-alanine mutants C106A, C53A, and a triple mutant that harbors mutations at all three cysteines in DJ-1 (C106A/C53A/C46A), as well as L166P, were tested for in vitro chaperone activity by CS aggregation suppression assay.(B) Self-association of DJ-1 cysteine mutants. Murine neuroblastoma CAD cells were transiently cotransfected with Flag-tagged human DJ-1 vectors (either WT or mutant) along with WT YFP-tagged human DJ-1. Lysates were immunoprecipitated with anti-Flag antibodies and probed by Western blotting with an antibody specific for human DJ-1. WT Flag-DJ-1, C106A DJ-1, C53A DJ-1, and C106A/C53A/C46A DJ-1 effectively coprecipitated WT GFP-DJ-1, whereas the L166P mutant Flag-DJ-1 failed to do so. Lysates represent 20% of the input for the immunoprecipitate; Flag-DJ-1 migrates at 22 kDa, and YFP-DJ-1 migrates at 50 kDa.(C) DJ-1-deficient ES cells were transiently transfected with vector alone, WT DJ-1, or DJ-1 cysteine mutants, and exposed to 10 μM H2O2 for 15 h followed by MTT assay. The viability of the cells in the absence of drug treatment was not altered by the expression of WT or mutant DJ-1). Data are shown as the mean ± SEM and were analyzed by ANOVA with Fisher's post-hoc test. * p < 0.05(D) Expression levels of WT and mutant forms of DJ-1 were comparable as determined by Western blotting for human DJ-1 and β-actin.\n", - "2886 \n", - " Multiplicity and Cooperativity in miRNA–Target InteractionsOne miRNA can target more than one gene (multiplicity) (A), and one gene can be controlled by more than one miRNA (cooperativity) (B). The distributions are based on ordered (ranked) lists and decay approximately exponentially (approximate straight line in log-linear plot).(A) Some miRNAs appear to be very promiscuous (top left), with hundreds of predicted targets, but most miRNAs control only a few genes (bottom right).(B) Some target genes appear to be subject to highly cooperative control (top left), but most genes do not have more than four targets sites (bottom right). Although specific values are likely to change with refinement of target prediction rules, the overall character of the distribution may well be a biologically relevant feature reflecting system properties of regulation by miRNAs.\n", - "2926 \n", - " Self-processing polyproteins to reconstruct the TCR:CD3 complex. (A) Schematic diagram of the TCR:CD3 complex spanning the cytoplasmic membrane. The T-cell receptor (TCR) is formed by two subunits and the other four proteins assemble in three dimers to form the CD3 complex. The square boxes in the cytoplasmic sequences of the CD3 subunits represent the immunoreceptor tyrosine-based activation motifs (ITAMs). (B) To express the TCR:CD3 complex in cells, two retroviral vectors were designed to carry the two ORFs drawn here [8]. In the retrovirus encoding the four CD3 subunits, three different 2A sequences were used to avoid deletions due to direct repetitions.\n", - "2941 \n", - " RT-PCR validation experiment of a putative brain-specific isoform (LMO7). (A) The additional exon is detected in all tissues (primers F1, R1). (B) The primer pair F1-R2 located on exons flanking the extra exon results in two products where the shorter one is observed in brain, testis and eye (weak band). The predicted brain-specific expression pattern is, in fact, not specific.\n", - "2945 \n", - " Effect of propranolol (Pro) and atenolol (Ate) on the enhancing effect of epinephrine (Epi) on production of IL-6 (A), IL-8 (B), and IL-13 (C) from IL-1β-induced HMC-1 cells. To each well of a 6 well culture plate, two ml of HMC-1 mast cells (0.75 × 106 cells/ml) were cultured alone (Medium), or in the presence of IL-1β (10 ng/ml), Epi (1 × 10-5 M), Pro (1 × 10-4 to 1 × 10-6 M), Ate (1 × 10-4 to 1 × 10-6 M), and the combinations of these reagents for 24 hrs in triplicate. Supernatants were harvested for measuring IL-6, IL-8, and IL-13 by ELISA. IL-8 and IL-13 production were not detected in the Medium, Epi, Pro, and Ate alone groups. In A and B, by Student's t-test analysis, * and + indicate p < 0.05, when compared with the IL-1β-treated group, and the IL-1β plus Epi group, respectively. In C, * indicates p < 0.01, when compared with the IL-1β-treated group; p values for ++, +, ##, and # were <0.00005, <0.0005, <0.01, and <0.05, when compared with the IL-1β plus Epi group.\n", - "2948 \n", - " Effect of dexamethasone (Dex) on the enhancing effect of epinephrine (Epi) on production of IL-6 (A), IL-8 (B), and IL-13 (C) from IL-1β-induced HMC-1 cells. To each well of a 6 well culture plate, two ml of HMC-1 mast cells (0.75 × 106 cells/ml) were cultured alone (Medium), or in the presence of IL-1β (10 ng/ml), Epi (1 × 10-5 M), Dex (1 × 10-7 M), and the combinations of these reagents for 24 hrs in triplicate. Supernatants were harvested for measuring IL-6, IL-8, and IL-13 by ELISA. * p < 0.005, when compared with the medium control, + p < 0.05 compared to the IL-1β-treated group, and ++ p < 0.05 compared to the IL-1β plus Epi group.\n", - "2951 \n", - " Effect of Bay 11 and SB203580 on the enhancing effect of epinephrine (Epi) on production of IL-6 (A), IL-8 (B), and IL-13 (C) from IL-1β-induced HMC-1 cells. To each well of a 6 well culture plate, two ml of HMC-1 mast cells (0.75 × 106 cells/ml) were cultured alone (Medium), or in the presence of IL-1β (10 ng/ml), Epi (1 × 10-5 M), Bay 11 (1 × 10-5 M), SB 203580 (1 × 10-5 M), and the combinations of these reagents for 24 hrs in triplicate. Supernatants were harvested for measuring IL-6, IL-8, and IL-13 by ELISA. IL-8 production was not detected in the Medium, Epi, Bay 11 alone groups, while IL-13 production was not detected in the Bay 11 and SB 203580 alone groups. In A, by Student's t-test analysis, * indicates p < 0.005, when compared with the IL-1β-treated group, and + and ++ indicate p < 0.0005 and <0.00005, when compared with the IL-1β plus Epi group. In B, * indicates p < 0.05, when compared with both the IL-1β-treated group, and the IL-1β plus Epi group. In C, * indicates p < 0.005, when compared with the IL-1β-treated group, and + and ++ indicate p < 0.00005 and <0.0001, when compared with the IL-1β plus Epi group.\n", - "2966 \n", - " Timeline for sensitisation and data collection. Timeline for the protocols used to induce allergic bronchopulmonary inflammation and timing for bronchoalveolar lavage (BAL), serum IgE measurement and assessment of hyperresponsiveness to inhaled methacholine (MCh). Mice were systemically sensitised with two intraperitoneal injections of OVA/Alum on day 0 and 14, challenged with either 1 (A), 3 (B) or 6 (C) OVA aerosols (1%) for 30 minutes starting at day 21.\n", - "2972 \n", - " Base excision repair pathways for Oxidative DNA damage. (A) BER pathway demonstrating repair of 8-oxoG by the repair enzymes hOgg1 and hNTH. (B) hOgg1, hMYH, and hMTH and their respective repair function.\n", - "2974 \n", - " Western analysis of A549 cells over-expressing individual repair genes and effect on endogenous glycosylase level. (A) Endogenous expression of hOgg1 was not altered in A549 cells over-expressing any of the other repair genes when analyzed after non-toxic and toxic exposures. hOgg1 protein was not detectable for any of the cells under the above conditions when compared to cells over expressing hOgg1. (B) and (C) Endogenous expression of hMTH and hMYH respectively also were not altered in A549 cells over-expressing any of the other repair genes when analyzed after non-toxic and toxic exposures. (D) Endogenous expression of hNTH was analyzed under non-toxic and toxic conditions in A549 cells over-expressing the other repair genes. Reduced expression of hNTH was observed equally with all of the other genes after exposure to 95% O2. Endogenous expression of all four genes was equivalent under the above conditions in vector control cells; pSF91.1 (data not shown).\n", - "2975 \n", - " Western analysis of endogenous hNTH repair gene after exposure to O2 and IR. (A) Analysis of hNTH expression in A549 vector control cells following O2 or IR treatment. The ROI band mass mean intensity was calculated for individual bands and hNTH expression was normalized to the corresponding actin loading control. (B) Graph of ROI band mass normalized to the pSF91.1 zero dose.\n", - "2976 \n", - " Cell survival analysis following O2, IR, and H2O2 treatments. A549 cells over-expressing hOgg1, hMYH, hMTH and hNTH following (A) O2, (B) IR, and (C) H2O2. Brackets indicate statistical significance at * p < 0.05 and ** p < 0.001 compared to pSF91.1 at each individual dose for 1 representative experiment.\n", - "2987 \n", - " A-I Intrachromosomal tethering of the subtelomeres of each single homologue in diploid and triploid non-cycling interphase nuclei at G1. FISH of diploid (A-F) or triploid interphase nuclei (G-I) from the following cell lines: CG04-0743BBRS (diploid) derived from skin and CG01-2042YA (triploid) derived from CVS. These non-cycling cells were probed with p-subtelomeric probe (labelled with spectrum orange) and q-subtelomeric probe (spectrum green) for (A) chromosome 4; (B) chromosome 5; (C) chromosome 7, (D) chromosome 10, (E) chromosome 17, (F) chromosome 20, (G) chromosome 18, (H) chromosome 12, (I) chromosome 6. The proportion of p-q tethered signals is shown in Table 2. In each case the majority of cells (76%–85%) showed pairing of short-arm and long-arm subtelomeres from single homologues often arranged on opposite sides of the interphase nucleus. Note also that an interphase topology is exhibited such that oval rosettes of chromatin can be seen in the present study in figs 1H, 1I, an elongated rosette in fig 1C, and off-centre rosettes in figs 1A, 1B.\n", - "2996 \n", - " Scanning Electron Micrographs of Diatoms(A) Biddulphia reticulata. The whole shell or frustule of a centric diatom showing valves and girdle bands (size bar = 10 micrometres).(B) Diploneis sp. This picture shows two whole pennate diatom frustules in which raphes or slits, valves, and girdle bands can be seen (size bar = 10 micrometres).(C) Eupodiscus radiatus. View of a single valve of a centric diatom (size bar = 20 micrometres)(D) Melosira varians. The frustule of a centric diatom, showing both valves and some girdle bands (size bar = 10 micrometres).(Images courtesy of Mary Ann Tiffany, San Diego State University.)\n", - "2999 \n", - " Two Views of Cochlear MechanicsThe cochlea, shown uncoiled, is filled with liquid. In the accepted travelling wave picture (A), the partition vibrates up and down like a flicked rope, and a wave of displacement sweeps from base (high frequencies) to apex (low frequencies). Where the wave broadly peaks depends on frequency. An alternative resonance view (B) is that independent elements on the partition can vibrate side to side in sympathy with incoming sound. It remains open whether the resonant elements are set off by a travelling wave (giving a hybrid picture) or directly by sound pressure in the liquid (resonance alone).\n", - "3001 \n", - " The Diversity of Ancestral Rices(A) Long, thin-grained rice with purple hull.(B) Round-grained rice with white hull.(C) Panicles of golden-hulled rice (foreground) and purple-leafed rice (background).(D) Tall, weedy rice with pale leaves and silver hulls.\n", - "3006 \n", - " Typical Bird-Pollinated Flowers(A) Scarlet gilia Ipomopsis aggregata. Image courtesy of Clarence A. Rechenthin at US Department of Agriculture–National Resources Conservation Service PLANTS Database. (B) Scarlet monkeyflower, Mimulus cardinalis. Image by William & Wilma Follette at US Department of Agriculture–National Resources Conservation Service PLANTS Database (USDA NRCS 1992).\n", - "3007 \n", - " The Two Subspecies of Echium wildpretii\n", - "(A) The pink flowers of E. wildpretii trichosiphon are pollinated by insects. (B) The red flowers of E. wildpretii wildpretii are pollinated by generalist native birds, unless birds are driven away by large densities of bees. Photos courtesy of Alfredo Valido.\n", - "3020 \n", - " Conversion between FibroTest and fibrosis stages, and between ActiTest and necroinflammatory activity grades – Graphs. Graph A: FibroTest values according to status, from blood donors to patients with cirrhosis (n = 1570). Graph B: ActiTest values according to status, from blood donors to patients with severe necrosis (n = 1570). F0 = no fibrosis, F1 = portal fibrosis, F2 = some septa, F3 = many septa, F4 = cirrhosis, A0 = no necroinflammatory activity, A1 = minimal activity, A2 = moderate activity, A3 = severe activity. (Consensus conferences recommend treatment in patients with either F2 stage or A2 grade.) Notched box plots showing the relationship between FibroTest and the stage of fibrosis (A) and between ActiTest and the grade of activity (B). The horizontal line inside each box represents the median, and the width of each box the median ± 1.57 interquartile range/√n (to assess the 95% level of significance between group medians). Failure of the shaded boxes to overlap signifies statistical significance (P < 0.05). The horizontal lines above and below each box encompass the interquartile range (from 25th to 75th percentile), and the vertical lines from the ends of the box encompass the adjacent values (upper: 75th percentile plus 1.5 times interquartile range, lower 25th percentile minus 1.5 times interquartile range).\n", - "3058 \n", - " Polyadenylation sites of 18S rRNA subunit and a full length polyadenylated 18S clone. Polyadenylation positions on 18S subunit. (A) represents the clones derived from amplification with primers designed for the 3'end of 18S. Underlined letters represent polyadenylation sites. Y or S over them indicate whether RNA came from yeast exposed to YPD (Y) or serum (S) and superscripted digits over them indicate the number of clones found at that position. The bold enlarged letters represent the sequence with the most polyadenylation sites. The #1624 represents the position from 5' end of 18S. (B) represents partial sequences at the 5' and 3' ends of a full length clone of a polyadenylated 18S molecule.\n", - "3059 \n", - " Upregulation of 18S rRNA polyadenylation by serum exposure. Northern blot of poly-A selected RNA hybridized by 18S and UB14 specific probes (A). (a) is RNA derived from cells grown in YEPD at 30°C, (b) is RNA from yeast in serum for 5 minutes at 37°C, and (c) is RNA from yeast in serum for 15 minutes at the same temperature. (B) represents the quantitative phosphorimager data of the Northern shown in (A). Small letters (a, b, c) are the same as in (A).\n", - "3075 \n", - " Evaluation of different VZV IgG avidity assays with serum samples from patients with acute (▲) and past (■) VZV infection. The Enzygnost Anti-VZV/IgG test kit was used with standard conjugate concentration and standard incubation times (A) and with modified assay conditions (B; see text).\n", - "3077 \n", - " Linear relationship between absorbance values without and with denaturing washing step. Absorption-absorption-diagrams of dilution series of samples from (A) patients with acute (closed symbols) and past VZV infection (open symbols) and (B) of pairs of serum (closed symbols) and CSF samples (open symbols). For two examples, the determination of y-values for the virtual x-value 2.0 is represented graphically (dotted lines with arrow heads). Avidity is calculated as the ratio of absorbance y divided by absorbance x.\n", - "3174 \n", - " Strategy to Identify Temporal Regulatory Elements(A) Flowchart of the strategy used.(B) Northern blot of pha-4. pha-4 transcripts were approximately 25- to 100-fold enriched in par-1 compared to skn-1 embryos, but only approximately 5- to 10-fold enriched in wild-type compared to skn-1 embryos. Arrowheads indicate the three different pha-4 isoforms.(C) The same blot was probed with a fragment of the act-1 gene to demonstrate equal loading of RNA between lanes.\n", - "3177 \n", - " Five Newly Identified Motifs Function as Pharyngeal Enhancers(A–C) Nomarski differential contrast interference images of embryos representing three different stages of embryonic development: (A) “early” development, when the pharynx primordium is formed, (B) “mid” development, when the pharynx has completed cell division and attached to the presumptive buccal cavity, and (C) “late” development, when pharynx development is almost complete and the embryo is about to hatch. Images on the left are of “early” embryos, images in the middle are of “mid” embryos, and images on the right are of “late” embryos.(D–U) Representative transgenic embryos showing expression from reporter constructs containing the Δpes-10 promoter alone (D–F) or with insertion of three copies of Early-1 (G–I), Early-2 (J–L), Late-2 (M–O), P-1 (P–R), or P-2 (S–U). Dashed lines indicate the outline of the developing pharynx.\n", - "3178 \n", - " Late-1 Represses Early PHA-4-Dependent ExpressionPercent values indicate the percentage of transgenic animals exhibiting pharyngeal GFP expression. A reporter construct with three copies of a high-affinity PHA-4 site (TGTTTGC) upstream of the Δpes-10 promoter (A) expresses GFP in pharyngeal cells of most transgenic embryos (B) and roughly one-third of transgenic larvae (C). The addition of three copies of the Late-1 element from R07B1.9 (CCTTGGCGGCGC) to this transgene (D) drastically reduces expression in transgenic embryos (E) but has no observable effect on transgenic larvae (F). Dashed lines indicate the outline of the pharynx.\n", - "3179 \n", - " Early-1 and Early-2 Elements Are Required for K07C11.4 Expression(A) A portion of the promoter sequence of K07C11.4 from C. elegans (bottom) aligned with its ortholog from C. briggsae (top). Boxed regions show conserved predicted PHA-4 binding sites and Early-1 and Early-2 elements. Site-directed mutations that disrupt Early-1 and Early-2 (“E2 + E1 Mut”) are shown below their respective wild-type (“E2 + E1 WT”) sequence from K07C11.4.(B–E) Confocal images of mid-stage embryos expressing GFP under the control of the wild-type K07C11.4 promoter (B) or promoters with a mutation in Early-1 (C), Early-2 (D), or both Early-1 and Early-2 (E). Percentages are the fraction of transgenic embryos expressing GFP; the remainder of embryos do not express GFP.(F) Expression of the wild-type K07C11.4 reporter in a subset of somatic gonad cells in an L4 animal (arrowheads).(G) Mutation of the Early-1 element eliminates gonadal expression but does not strongly affect expression in other tissues, such as intestinal cells (arrows).Dashed lines indicate the outline of the developing pharynx.\n", - "3180 \n", - " The Late-1 Element Negatively Regulates R07B1.9(A) A portion of the promoter sequence of R07B1.9 from C. elegans (bottom) aligned with its ortholog from C. briggsae (top). Boxed regions show conserved predicted PHA-4 binding sites and a Late-1 element. The site-directed mutation that disrupts Late-1 (“Mut”) is shown below the respective wild-type sequence from R07B1.9.(B and C) Confocal images of representative early and late embryos expressing GFP under the control of the wild-type R07B1.9 promoter.(D and E) Confocal images of representative early and late embryos expressing GFP under the control of the R07B1.9 promoter with a mutation in the Late-1 element. Note the early activation of R07B1.9 when Late-1 is inactivated.Dashed lines indicate the outline of the developing pharynx.\n", - "3183 \n", - " A Genetic System to Drive Gene Recombination in Developing Joints(A) A 140-kb BAC from the Gdf5 locus was modified by inserting Cre-IRES-hPLAP into the translation start site of Gdf5 and used to make transgenic mice. Not to scale. See Materials and Methods for details.(B–E) Visualization of Gdf5-Cre driven recombination patterns based on activation of lacZ expression from the R26R Cre reporter allele. (B) LACZ activity is visible as blue staining in the ear (ea) and the joints of the shoulder (s), elbow (eb), wrist (w), knee (k), ankle (a), vertebra (vj), and phalanges (black arrowheads) of an E14.5 mouse embryo. (C) E14.5 hindlimb double-stained to show both HPLAP expression from the transgene (grey/purple staining) and LACZ expression from the rearranged R26R allele (blue staining). Note that both markers are visible in the oldest, proximal interphalangeal joint (black arrowhead), only HPLAP activity is visible in the more recently formed medial interphalangeal joint (black arrow), and neither HPLAP nor LACZ expression is visible in the youngest, most distal joint of the digit (white arrowhead). (D) Newborn (P0) forelimb with skin partially removed showing LACZ activity expressed in all phalangeal joints (red Salmon gal staining, black arrowheads) and regions of some tendons (asterisk). (E) Section through the most distal phalangeal joint of a P0 hindlimb stained with Alcian blue to mark cartilage showing LACZ expression (stained red) in all tissues of developing joints: articular cartilage (black arrowhead), precursors of ligaments and synovial membranes (black arrow), and cells where cavitation is occurring (asterisk).\n", - "3184 \n", - " \n", - "Bmpr1a Is Required for Webbing Regression and Apoptosis in Specific Regions of the Limb(A and B) Control E14.5 forelimb (A) compared to a, E14.5 mutant forelimb (B) showing webbing between digits 1 and 2 (arrowheads) and extra tissue at the posterior of digit 5 (arrows).(C) Gdf5-Cre induced lacZ expression from R26R in an E13.5 forelimb showing LACZ staining (blue) in metacarpal-phalangeal joints, between digits 1 and 2 (arrowhead), and in a region posterior to digit 5 (arrow).(D and E) Sections of E14.5 hindlimbs showing apoptosis visualized by TUNEL staining (green) and proliferation visualized by staining for histone H3 phosphorylation (red). Controls show strong, uniform TUNEL staining between digits 1 and 2 (D, arrowhead) while mutants show patchy TUNEL staining interspersed with mitotic cells in similar regions (E). Scale bar = 200 μm.(F) Quantitation of TUNEL staining and mitotic cells in the posterior region of the fifth digit shows apoptosis is reduced 30% while proliferation is increased 20% (asterisks indicate statistically significant difference).(G and H) By E15.5, interdigital tissue has regressed in controls (G, arrowhead). In contrast, tissue remains in mutants at this location, primarily derived from cells that have undergone Gdf5-Cre-mediated recombination that inactivates Bmpr1a function and activates expression of LACZ (H). Scale bar = 75 μm.\n", - "3185 \n", - " \n", - "Gdf5-Cre-Mediated Deletion of Bmpr1a\n", - "(A) Breeding strategy simultaneously deletes Bmpr1afloxP and allows visualization of Gdf5-Cre-mediated recombination by lacZ expression from R26R.(B–E) 5-week-old mutant and control mice stained with Alcian blue to mark cartilage and alizarin red to mark bone. (B) Ankle of control with strong blue staining lining each joint (arrowheads). (C) Ankle of mutant showing an absence of blue staining in most regions (arrowheads) and a joint fusion between the central (c) and second (2) tarsals (arrow). (D) Control and (E) mutant metatarsal/phalangeal joint which lacks blue staining in articular regions (arrowheads) but retains staining in the growth plate (asterisks).(F) Control forelimb.(G) Mutant forelimb with webbing between the first and second digit (black arrowhead).\n", - "3186 \n", - " \n", - "Bmpr1a Is Expressed in Joints and Is Required for Continued Joint Formation in the Ankle Region(A) Diagram of ankle bones from a wild-type mouse; bones fusing in mutant are colored red. Roman numerals II–IV, metatarsals; 2, 3, and 4/5, distal row of tarsal bones; c, central tarsal bone; ta, talus; ca, calcaneus.(B and C) In situ hybridization at E15.5 showing that Bmpr1a is expressed in ankle joint interzones (B, arrowheads) and in the forming articular regions of the phalangeal joints (C, arrowheads).(D) Near adjacent section to (C) showing Gdf5-Cre induced LACZ expression from R26R in the forming joints of the digits (arrowheads).(E–J) Marker gene expression and R26R LACZ staining patterns on near adjacent sections of control and mutant embryos. In control mice at E15.5 ankle joints are clearly delineated as regions that have down-regulated Col2 (E), express Gdf5 throughout (F), and express LACZ in most cells (G; white arrowheads and black arrows). In mutant embryos at the same stage, joint formation is incomplete. Faint Col2 expression can be seen connecting a medial region of tarsal 2 with metatarsal II (H, white arrowhead), and Gdf5 expression does not extend all the way across the joint at this location (I, white arrowhead). Between tarsals c and 2, mutants express Col2 across the normal joint-forming region (H, black arrow) and lack expression of Gdf5 at sites where skeletal fusions are observed (I, black arrow and bracket). (J) Scale bar = 100 μm.\n", - "3188 \n", - " Synovial Membrane Expansion, Articular Surface Erosion, and Accelerated Maturation of Underlying Cartilage in Ankles of Bmpr1a Mutant MiceNear adjacent sections from the tarsal 2-metatarsal II joint of 7-d-old mice. (A and B) LACZ staining (blue) shows Cre-mediated recombination is largely restricted to articular (arrowheads) and synovial cells (asterisks) in both controls and mutants. (C and D) In situ hybridization shows Col10 expression expands in mutants toward regions of synovial membrane expansion and articular surface erosion (brackets and arrows). This may be a cell nonautonomous effect of joint damage, since the LACZ expressing cells at the articular surface do not show upregulation of Col10 (arrowheads) and the region of expanded Col10 expression is largely made up of cells that have not undergone Cre-mediated recombination. Note the formation of a cartilaginous bridge along the joint capsule of the mutant where joint formation is disrupted at earlier stages (B, white arrowhead, and Figure 3, white arrowheads). (A) Scale bar = 75 μm.\n", - "3190 \n", - " Domains and Charge Distribution within the Myosin Tail(A) The myosin head (1–818) and light chains are shown at the N terminus. In the coiled-coil tail, Ala 1 is red (1,348–1,530), the AD is blue (1,531–1,824), Ala 2 is purple (1,825–1,966), the C-terminal domain is green (1,967–2,116), and the remainder is black (819–1,347). Phospho-threonines (at positions 1,823, 1,833, and 2,029) are indicated by the letter T.(B and C) Plots of the average charge of each tail domain color coded as in (A). The y-axis is average charge; the x-axis is tail position. Aspartic acid and glutamic acid are assigned –1, lysine and arginine are assigned +1, and all other a.a. are assigned 0. The average charge in (B) was determined with a window size of 14 a.a., and the average charge in (C) was determined with a window size of 28 a.a.. Arrows highlight the 28 a.a. charge repeat in (B) and the 196 a.a. charge repeat in (C).(D) “Headless” AD-Cterm (3xThr) (1,531–2,116).\n", - "3191 \n", - " Characterization of “Headless” AD-Cterm Tail Fragments(A) Analysis of assembly by sedimentation. Fraction of soluble protein as a function of NaCl concentration is plotted for the constructs depicted adjacent to the graph. The solubility of “headless” AD-Cterm (3xThr) and AD-Cterm (3xAsp) are compared to the solubility of unphosphorylated and phosphorylated full-length myosin having the globular motor domain (full-length myosin data from Cote and McCrea [1987]).(B) Sedimentation equilibrium analysis of 52 μM “headless” AD-Cterm (3xThr) and AD-Cterm (3xAsp) in buffer containing 500 mM NaCl. The top graphs show the concentration distribution, fit, and residuals for AD-Cterm (3xThr), while the bottom graphs show the same data for AD-Cterm (3xAsp). The molecular weight obtained from the fit was 130 kDa for AD-Cterm (3xThr) and 120 kDa for AD-Cterm (3xAsp).(C) Thermal melts of “headless” AD-Cterm (3xThr) and AD-Cterm (3xAsp) in buffer containing 500 mM NaCl are shown as fraction of protein denatured as a function of temperature. The open circles are data for 50 μM “headless” AD-Cterm (3xThr), and the open squares are data for 50 μM “headless” AD-Cterm (3xAsp).\n", - "3192 \n", - " Analysis of “Headless” AD-Cterm (3xThr) and GFP-AD-Cterm (3xThr) Assembly by EM(A and B) The scale bars are 100 nm, and all panels are on the same scale. (A) The “headless” AD-Cterm (3xThr) tail fragment assembled for 2 h. (B) Three images of GFP-AD-Cterm (3xThr) assembled for 2–5 min.(C) Analysis of GFP AD-Cterm (3xThr) (open circles) and GFP-AD-Cterm (3xAsp) (open squares) assembly by sedimentation.\n", - "3194 \n", - " Localization of 0.5-μm Beads in Live Dividing Dictyostelium Cells(A) Time course of a representative GMO8B Dictyostelium cell (defined in Materials and Methods; contains GFP myosin) during cytokinesis. GFP-myosin fluorescence is shown in green and the beads are shown in red. While GFP-myosin accumulates in the furrow, the beads show no directed motion. The scale bar is 10 μm and time is indicated in min:sec.(B) Plot of the location of each bead in each of six dividing cells in the six frames imaged during cytokinesis. The axes were defined in each frame to bisect the center of the cell both horizontally and vertically such that the center of the furrow is the origin of the axes. The position of each bead was then plotted relative to these axes. Different beads are represented by different colors. For three of the beads, the trajectory of the bead is shown with arrows. The average location of a cell is outlined on the plot in transparent green.\n", - "3196 \n", - " Analysis of Assembly by SedimentationThe solubility of the various constructs used for the truncation analysis is compared.(A) Comparison of “headless” AD (1xThr) and “headless” AD (1xAsp).(B) Comparison of “headless” AD (1xThr), GFP-AD (1xThr), and GFP-AD-Cterm (3xThr). The GFP is located at the N-terminus in both GFP-containing constructs.(C) Comparison of “headless” extended AD (2xThr) and “headless” extended AD (2xAsp).(D) Comparison of “headless” AD-Ala2 (2xThr) and “headless” AD-Ala2 (2xAsp).(E) Comparison of “headless” AD-Cterm (3xThr), “headless” Ala1-Ala2 (2xThr), and “headless” Ala1-Cterm (3xThr).\n", - "3197 \n", - " Design and Assembly Characteristics of AD-Cterm-GFP(A) The AD-Cterm charge distribution (top) is aligned with the reverse charge distribution (bottom), showing the overall symmetry of the 196-a.a. charge repeat in this region of the tail.(B) Analysis of assembly by EM. The AD-Cterm (3xThr) tail fragment has GFP on the C-terminus (AD-Cterm-GFP [3xThr]). The scale bar indicates a distance of 100 nm. Shown are three images of AD-Cterm GFP (3xThr), assembled 2–5 min.(C) Analysis of assembly by sedimentation. The solubility of AD-Cterm-GFP (3xThr) and AD-Cterm-GFP (3xAsp) tail fragments constructs are compared to GFP-AD-Cterm (3xThr) and “headless” AD-Cterm (3xThr) tail fragments.\n", - "3202 \n", - " Identification of an Epitope in Avenin Recognized by Intestinal T-Cells of Celiac Disease Patients(A) Reverse-phase HPLC of a pepsin-trypsin digest of avenin. Peptides in fraction 25, obtained from gel filtration, were eluted by an acetonitrile gradient (straight line), and 41 fractions were collected. Fractions recognized by T-cell lines in subsequent experiments are indicated by the numbers above the peaks.(B) T-cell recognition of fractions obtained by reverse-phase HPLC. All 41 fractions obtained in (A) were tested for recognition by the intestinal T-cell line 422.2.4 (derived from an oat-intolerant celiac disease patient). The fractions were incubated with DR3-DQ2 homozygous antigen-presenting cells overnight before the T-cell line was added. Specific T-cell responses were measured by 3H-thymidine incorporation. Pepsin-trypsin-digested avenins, both TG2-treated and untreated, were used as control antigens.(C) Sequences of the peptides in the stimulatory fractions from reverse-phase HPLC identified by tandem mass spectrometry and overlapping synthetic peptides used for T-cell assays. For better comparison, the amino acid sequence of the avenin precursor protein JQ1047 (gi82331) is taken as a consensus sequence, and deviating residues are underlined.\n", - "3204 \n", - " Reactivity of an HLA-DQ2-Restricted T-Cell Clone Derived from a T-Cell Line (CD496.2.3) Established by Avenin Stimulation of an Intestinal Biopsy of Patient CD496T-cell responses were measured by 3H-thymidine incorporation and are represented as SIs.(A) The clone specifically recognizes the avenin peptide Av-α9B after treatment with TG2. The peptides were tested at 10 μM.(B) The clone recognizes avenin but not gluten antigen after treatment with TG2.\n", - "3222 \n", - " Vital Signs of Children during the First 24 h after AdmissionMean and 95% confidence interval shown. Red circles, severe malaria; blue triangles, moderate malaria. (A) Pulse (per minute), (B) mean arterial pressure (millimetres Hg), (C) respiratory rate (per minute), and (D) blood lactate concentration (millimoles/litre).\n", - "3223 \n", - " Plots of TBW and ECW Estimates from Isotope Dilution and BIA Calculation with Measured ValuesFilled circles, admission value; open circles, day 28 follow up value; dotted lines, 95% confidence intervals for values. (A) TBW and (B) ECW. D2O, heavy water.\n", - "3224 \n", - " Body Fluid Compartment Volumes Derived from BIA on Admission and DischargeRed circles, severe malaria; blue triangles, moderate malaria. (A) TBW (litres/kilogram), (B) ECW (litres/kilogram), and (C) ICW (litres/kilogram).\n", - "3257 \n", - " Mutational spectrum, structure and expression of TMPRSS3 isoforms. (A) Coding and non-coding exons of all the known isoforms of TMPRSS3 are shown with black and gray rectangles, respectively. The newly identified isoform e has translation initiation codon (arrow) in exon 1, while the termination codon in exon 13 is marked with an asterisk. Shown also are predicted protein motifs encoded by the 3192 bp long mRNA of isoform e. All the known mutant alleles of TMPRSS3 causing hearing loss are shown above the protein motifs. Modified and updated from Ben-Yosef et al. 2001 [5] (B) Nucleotide sequence of the cDNA encoding the amino terminus of TMPRSS3e and its deduced amino acid sequence. The underlined nucleotide sequence represents the region predicted by SMART to encode a signal peptide. The last ATG shown is the reported translation initiation site for isoform a [4]. (C) RT-PCR specific to the TMPRSS3e transcript was performed on cDNA from seven human tissues, which include retina, lung, liver, heart, pancreas, placenta and kidney as indicated. All tissues, except heart, demonstrated expression of TMPRSS3e. G3PDH was used as a positive control.\n", - "3299 \n", - " Evolution of immuno-virological parameters in SIVmac251 chronically infected macaques from the IFN group. Immunological and virological parameters were followed in macaques that received their own cells transduced by the retroviral construct allowing expression of the biologically active form of IFN-β. (A) Absolute number of circulating CD4+ lymphocytes was followed by immunophenotyping and flow cytometry. (B) Cell-associated viral load was estimated in PBMCs by a quantitative PCR method based on the specific amplification of the SIV gag gene. (C) Plasma viral load was estimated by a quantitative branched-DNA method based on the specific amplification of the SIV genome. Y axis split X axis at the first reinfusion date (D0) whereas black arrows indicate the second and third reinfusion dates.\n", - "3300 \n", - " Evolution of immuno-virological parameters in SIVmac251 chronically infected macaques from the control group. Immunological and virological parameters were followed in macaques that received their own cells transduced by the deleted form of the retroviral construct. (A) Absolute number of circulating CD4+ lymphocytes was followed by immunophenotyping and flow cytometry. (B) Cell-associated viral load was estimated in PBMCs by a quantitative PCR method based on the specific amplification of the SIV gag gene. (C) Plasma viral load was estimated by a quantitative branched-DNA method based on the specific amplification of the SIV genome. Y axis split X axis at the first reinfusion date (D0) whereas black arrows indicate the second and third reinfusion dates.\n", - "3307 \n", - " Chemokine Receptor Expression on Peripheral Lung Lymphocytes(A) Single color histograms showing expression of chemokine receptors CCR4, CCR5, and CXCR3 from representative control and emphysema participants.(B) Pooled data from all participants (control, n = 10; emphysema, n = 18) showing percent (median ± SD) of total lung lymphocytes expressing CCR4 and CCR5.(C) Pooled data from same participants showing percent (median ± SD) CCR5 expression on CD4 (top) and CD8 (middle) T cells, and CXCR3 expression on unfractionated T cells (bottom) from the same participant groups.(D) Analysis of total lung lymphocyte chemokine receptor (median ± SD) profiles among participants with emphysema. Participants had either (1) lung volume reduction surgery for emphysema (non-cancer, n = 8) or (2) lung resection for treatment of small peripheral cancer (n = 10). Participants showed similar inflammatory indices as determined by CCR5 expression.In (B) and (C), *, p < 0.001; †, p = 0.01; ‡, p = 0.02; ∫, p = 0.007 (Mann-Whitney test) for the comparison of emphysema and control groups.\n", - "3308 \n", - " Expression of CXCR3 in Lungs of Control and Emphysematous Smoker Individuals(A) Representative forward and side-scatter characteristics of whole lung cells from a participant with COPD and emphysema. Anti-CD11b PE-conjugated and anti-CD14 FITC-conjugated antibodies detect lung macrophages (middle), and histogram of mean fluorescence intensity showing anti-CXCR3-Cy5 and control antibodies (cIg) detects lung macrophages in the patient with emphysema.(B) Pooled data from control individuals without (n = 5) and with (n = 8) emphysema. Columns are median, bars represent SD. *, p = 0.009 (Mann-Whitney test) for the comparison of emphysema and control participants.(C) Negative association between CXCR3 expression on CD3+ T cells and FEV1 percentage predicted based on an R2 goodness-of-fit statistic of 0.27 (p = 0.0089, r = −0.52, n = 24).\n", - "3309 \n", - " IFN-γ, MIG, and IP-10 Production by Isolated Lung Lymphocytes(A–C) Lung lymphocytes from control individuals and participants with emphysema were cultured without additional stimulation for 3 or 4 d and assessed for secretion of (A) IFN-γ, (B) MIG, and (C) IP-10 (control, n = 8; emphysema, n = 12). Columns are median, bars represent SD. *, p= 0.007; †, p = 0.01; ‡, p = 0.02 for the comparison of emphysema and control participants.(D) The same cells from a representative ex-smoker individual with emphysema were either left unstimulated (No ST) or treated with PMA/ionomycin (PMA/I) for 24 h and assessed for surface CD8 and CD69 expression and the intracytoplasmic accumulation of IFN-γ by flow cytometry.(E) Production of IL-4 by lung lymphocytes. Lung lymphocytes from a representative ex-smoker individual with emphysema were cultured for 24 h with or without PMA/ionomycin stimulation (PMA/I) and assessed for intracytoplasmic IL-4 and IFN-γ accumulation by flow cytometry.\n", - "3310 \n", - " Regulation of MMP12 by Type 1 Cytokines(A) CD14+, lymphocyte-depleted lung leukocytes were cultured with and without the indicated amounts of recombinant human IP-10 and IFN-γ, and supernatants were assessed for the presence of MMP12 by Western blotting.(B) Fold increase relative to unstimulated of MMP12 mRNA from lung macrophages stimulated without (–) and with (+) 500 ng/ml of IP-10 in the presence or absence of a function-blocking antibody to CXCR3 as determined by real-time PCR.(C and D) Lung tissue from a participant with emphysema (C) shows strong immune staining for MMP12 localized to macrophages (arrows), and (D) shows lung tissue from a control participant without emphysema and with undetectable MMP12. The insets show a high-power view of lung macrophages staining positive (C) and negative (D) for MMP12 (×60) *, p = 0.04.\n", - "3346 \n", - " Supershift EMSA in the presence of a c-Myb-specific antibody. (A). Nuclear extracts (5 μg) from K-562 cells were incubated with the radiolabeled GS945 probe (2.4 ng) representing the 21-bp triplication from the FeLV-945 LTR. Shown are probe only (lane 1), complex formation in the presence of nuclear extract (lane 2), and complex formation in the presence of 200-fold molar excess of non-specific (lane 3) or specific competitor (lane 4). Reaction performed in the presence of monoclonal antibody to c-Myb (4 μg) resulted in supershift of the specific complex (lane 5) which was not observed in the presence of 200-fold molar excess of specific competitor (lane 6). (B). Lanes 1, 2 and 3 represent repetitions of lanes 1, 2 and 5 of (A). Reaction with a isotype control antibody (lane 4) did not result in supershift. Indicated are the specific complex (solid arrow), non-specific complexes (open arrows), and the supershifted complex (asterisk). (C). EMSA performed using the radiolabeled GS61E probe, which contains only a single copy of the 21-bp element. Shown are probe only (lane 1), reaction performed in the presence of K-562 nuclear extract (5 μg; lane 2), and reaction performed in the presence of 100-fold molar excess of unlabeled GS945 (lane 3), GS61E (lane 4) or non-specific competitor (lane 5). The absence of complex formation using the GS61E probe demonstrates the requirement for the 21-bp triplication.\n", - "3348 \n", - " Response to exogenous c-Myb expression of FeLV LTRs containing c-Myb binding site mutations. (A). Diagram of the 21-bp triplication as contained in the FeLV-945 LTR, indicating the sequence of c-Myb binding sites across the repeat junctions of the triplication (+/+). LTRs were constructed in which the first (-/+) or second (+/-) binding site was mutated. (B). Firefly luciferase reporter gene plasmids containing the FeLV LTR with wild type or mutant c-Myb binding sites (500 ng) were introduced by lipid-mediated transfection in triplicate into feline embryonic fibroblasts (FEA) together with the Renilla luciferase reporter plasmid pRL-SV40 (5 ng) and a c-Myb expression plasmid in increasing concentrations (0 – 500 ng). Cell lysates were harvested 24 hours later and luciferase activity was quantified. Data are reported as a ratio of firefly to Renilla luciferase activity. Shown are data from a representative experiment repeated three times independently.\n", - "3386 \n", - " Leaf fatty acid profiles obtained from Arabidopsis lines grown at 17°C (black bars) and 36°C (white bars). (A), wild-type Columbia. Mutant lines: (B) fad5; (C) fad6; (D) act1; (E) fad7 fad8; (F) act1 fad6.\n", - "3389 \n", - " Profile generation. (A) Shows a typical region of interest (contrast enhanced for visualisation) showing the trabecular bone structure, in this case aligned approximately 22° to the vertical. (B) The central section of the FFT (128 × 128 pixels). The horizontal and vertical axes have been marked with a mid-grey tone to indicate that they have been excluded from the angle calculation. The bright strip at the centre (running from top left to bottom right) shows the preferred orientation of the trabeculae. Angles calculated from the Fourier power spectrum correspond to the same angles in the spatial domain, rotated by 90°. (C) The pixels with the maximum values are marked using white squares for the first 25 spatial frequency values of the Fourier power spectrum. The median angle, lying 21.8° from the horizontal is shown by a dashed white line. (D)_The regions used to generate the parallel (shaded black) and perpendicular (shaded white) profiles, based on the orientation of the trabecular structure.\n", - "3391 \n", - " Comparison of ROC curves. Comparison of the ROC curves for the strongest classifier from the combination of (A) PCA analysis of the perpendicular profile (Lower neck region), (B) PCA analysis of the circular profile (Upper head region) and (C) Fractal analysis of any profile (Upper neck region).\n", - "3412 \n", - " PCR and Southern hybridization of wild type 920A6 and ΔrtfA mutant, 213R.4. (A) PCR of wild type M. avium 920A-6 (lane 3) yielded a single 1.9 kb band corresponding rtfA whereas the rtfA mutant 213R.4 yielded a 3.2 kb band corresponding to rtfA with an inserted 1.3 kb hygromycin resistance gene cassette (rtfA::hyg, lane 2). Vector pVAP39 served as a positive control (lane 4). Lane 1 represents a molecular weight marker. (B) Southern blot analysis of genomic DNA from wt M. avium 920A6 and clone 213R.4 was digested with HindIII and probed for rtfA. M. avium 920A6 yielded a 11.13 kb band (lane 2) whereas clone 213R.4 (lane 1) yielded a 12.49 kb band, corresponding to the incorporation of the 1.3 kb hyg gene.\n", - "3429 \n", - " Detection of alternatively spliced exon-containing RT-PCR products. Ethidium bromide stained agarose gels (2%) showing (A) 132 bp spliced exon-containing (437 bp) and exon-less (305 bp) PCR products and (B) 87 bp spliced exon-containing (622 bp) and exon-less (535 bp) PCR products, in non-pregnant (NP), pregnant not-in-labour (PNL), and pregnant in-labour (PL) myometrial tissues. M = 100 bp marker (Promega, US); M2 = 2-log ladder (New England Biolabs Inc., UK).\n", - "3430 \n", - " Maxi-K α subunit mRNA expression analysed by quantitative real-time PCR. Results shown represent mean (± standard error of the mean, SEM) copy number values for (A) total Maxi-K α subunit (represented by the 3' conserved region), and β-actin, and (B) the 132 bp and 87 bp alternatively spliced exons of the Maxi-K α subunit. Copy number values were obtained based on product-specific serially-diluted cDNA standards, generated individually for each amplicon of interest. Tissue sets are indicated by striped columns (non-pregnant, NP), black columns (pregnant not-in-labour, PNL) and open columns (pregnant in-labour, PL).\n", - "3431 \n", - " Expression of 132 bp and 87 bp variant mRNAs of the Maxi-K α subunit. The histograms show the mean (± standard error of the mean, SEM) of the ratios of spliced exon to total maxi-K α subunit mRNA for both (A) the 87 bp and (B) the 132 bp variants in NP, PNL and PL tissues. Results indicate significantly higher expression of the 132 bp exon as a proportion of the total α subunit with labour onset, compared to non-pregnant and pregnant not-in-labour samples. There is no change in expression of the 87 bp variant between the three tissue sets. Tissue sets are indicated by striped columns (non-pregnant, NP), black columns (pregnant not-in-labour, PNL) and open columns (pregnant in-labour, PL). *P < 0.05 versus PL; +P < 0.01 versus PL.\n", - "3453 \n", - " Schematic of the Induced Roelofs Effect(A) Example visual display (not drawn to scale) comprising a target (red circle) and a frame offset to the subject's left. Gray circles (unseen by subjects) represent the remembered positions of the items within the comparison array, centered on the subject's midline.(B) One possible mechanism for the inaccurate perceptual report of the target location, based on an illusory rightward shift of the perceived target location (green circle).(C) An alternative mechanism for the inaccurate perceptual report, based on a leftward shift of the memorized location of the comparison array (blue circles). Either mechanism (B or C) would result in the subject reporting the target to occupy the remembered location of item 4 in the comparison array.\n", - "3454 \n", - " Perceptual and Sensorimotor Roelofs Effects(A) Effect of frame location on immediate (solid line) and delayed (dashed line) perceptual judgments of target location, with a significant main effect of frame offset but no frame × delay interaction (Table 1); error bars represent the standard error of the mean localization errors for each subject. (See also Figure S1A for a time line of the task events, Figure S1B for a plot of the Roelofs effect for each of the individual target locations, and Figure S1C for plots of the Roelofs effect within individual subjects.)(B) Effect of frame offset on immediate (solid line) and delayed (dashed line) saccadic eye movements, with a significant main effect of frame offset and a significant frame × delay interaction. When tested separately, the main effect of frame offset was not significant for immediate responses, but was significant for delayed responses (Table 1; see also Figure S2).\n", - "3455 \n", - " Inverse Roelofs Effect for Remembered Space(A) An inverse Roelofs effect for immediate (solid line) and delayed (dashed line) sensorimotor responses toward remembered reference array locations, with a significant main effect of frame offset and a significant frame × delay interaction. When tested separately, the main effect of frame offset was significant for both immediate and delayed responses (Table 1; see also Figure S3).(B) The inverse Roelofs effect for remembered space can be used to predict the pattern of the Roelofs effect for targets presented within an offset frame. For example, a frame offset to the right would cause the remembered comparison array to be mislocalized as being shifted approximately 1° to the right (from Figure 3A, solid line); a target presented at the center location of the comparison array (i.e., at the objective midline) would therefore be reported to lie approximately 1° to the left of the remembered center location. Computed in this way for all target and frame locations, the predicted Roelofs effect (gray lines and data points) closely matched the measured Roelofs effect for the perceptual judgment (black lines and data points, from Figure 2A, solid line), with a predicted effect size (1.61°) that did not significantly differ from the measured effect (1.47° ± 0.32°; t[9] = 0.44, n.s.). Furthermore, the measured Roelofs effect did not differ from the predicted effect for any individual frame position (left frame: t[9] = 0.39, n.s.; center frame: t[9] = 0.01, n.s.; right frame: t[9] = 0.36, n.s.).\n", - "3457 \n", - " The Biased-Midline Hypothesis(A) A depiction of the manner in which a target (red circle), located directly in front of the subject, would be perceived as being a small distance to the right of the subject's apparent midline (dotted line), which has itself been biased to the left in the presence of the left-shifted frame.(B) An immediate open-loop sensorimotor response (pointing movement, as shown here, or saccade begun immediately after the target and frame are extinguished) would be accurate if the goal of the movement were encoded in the same distorted reference frame (that is, a small distance to the right of the distorted apparent midline).(C) With the frame and target extinguished during an imposed delay, the apparent midline would drift back to veridical (gray arrows), dragging the remembered location of the target (gray circle) with it. A subsequent sensorimotor response aimed at the remembered target (located a small distance to the right of the now-veridical apparent midline) would result in a delayed sensorimotor Roelofs effect.\n", - "3459 \n", - " A Roelofs Effect for Allocentrically Defined Targets(A) Visual display used to define allocentric targets; subjects were instructed to move the eyes to the missing corner of the partial rectangle (gray circle, not seen by subject). During experimental trials, this stimulus array was presented within a large rectangular frame that was either centered or offset left or right of the subject's midline.(B) Effect of frame offset on immediate (solid line) and delayed (dashed line) sensorimotor responses to targets defined allocentrically, with a significant main effect of frame offset and a significant frame × delay interaction. When tested separately, the main effect of frame offset was not significant for immediate responses, but was significant for delayed responses (Table 1; see also Figure S6)\n", - "3460 \n", - " Task and BehaviorBehavioral task (A) and representative horizontal and vertical eye position records (B). (A) Each trial began when the monkeys pressed a button to make a fixation point (FP) appear at the center of the video monitor. Some time after the monkeys fixated the FP (dashed lines), a gray circle (depicted here as white) appeared at one of four peripheral locations. The figure illustrates its appearance at the 0° location (part a). The monkeys had to remember this location later in the task; hence we termed it the remembered location. On most trials, the circle subsequently revolved around the FP to a different location, as the monkeys maintained central fixation. The figure illustrates its termination at the 90° location (part b). A small change in the circle's luminance (part c) signaled the monkeys where to look next. This cue persisted for 150 ms, then disappeared. Because the monkeys depended on this subtle and brief cue for both timing and targeting information, we termed this the attended location. If the circle dimmed (dark gray, part c, top), the monkeys had to make a saccade to the attended location (Att-trials, part d, top). If the circle brightened (starburst, part c, bottom), the monkeys had to make a saccade to the remembered location (Rem-trials, part d, bottom). After saccade initiation, the central FP disappeared and, if the monkeys made a saccade to the correct location, a new FP appeared there (not shown). The monkeys had to fixate the new FP and, after it dimmed, release the button to produce a fruit juice reward. (Monkey drawing courtesy of Dr. Michael Shadlen.)\n", - "3461 \n", - " Example Neuron Representing the Attended LocationIn (A–C), the four rows correspond to different remembered locations and the four columns to different attended locations (see key in [C]). (A and B) PETHs and raster displays aligned on the trigger signal (vertical line). In the rasters, each dot represents a neuronal spike, and each line of dots shows a sequence of spikes during a single behavioral trial. (A) Trials in which the stimulus dimmed and the monkey made a saccade to the attended location (Att-trials). (B) Trials in which the stimulus brightened and the monkey made a saccade to the remembered location (Rem-trials). The activity of this neuron depended on where the monkey attended, with a preferred location of 90°. Note the large variation in firing rate from column to column (across the attended locations) and relative constancy of rate within columns (across remembered locations). (C) Compact representation of spatial tuning pattern shown in (A) and (B), combined. Each circle's area is proportional to the average firing rate during the 800-ms period immediately preceding the trigger signal (red rectangle in [A] and [B]). Note that the major diagonal of this firing-rate matrix, running from the upper left to the lower right corner, corresponds to the control trials, which lacked a memory requirement. F, maximal firing rate; sp/s, spikes per second.\n", - "3462 \n", - " Example Firing Rate Matrices and a Scatter Plot of Tuning IndexesPFdl neurons with different classes of spatial tuning. Firing rate matrices (A–C) in the format of Figure 2C; (E) gives the key. Tuning selectivity indexes (IAtt and IRem) and firing rate scale (F) appear adjacent to each firing rate matrix. (A) A neuron tuned to the attended location (different from the cell shown in Figure 2). (B) A neuron tuned to the remembered location. Its firing rate primarily varied across rows. (C) Two cells tuned to both the attended and remembered locations (hybrid neurons). One neuron (part a) exhibited a high firing rate when either the attended or remembered location was at 270°. The other neuron (part b) showed its highest activity when the remembered location was at 180°, but was inhibited when that was the attended location. (D) Scatter plot of spatial tuning indexes for attended (IAtt) and remembered (IRem) locations for each spatially tuned neuron in both monkeys. The different neuronal classes are color coded as in (A–C): blue corresponds to attention cells, red to memory cells, and green to hybrid cells.\n", - "3463 \n", - " Surface Projections Showing the Location of Neurons in Each ClassAll hemispheres are displayed so that rostral is to the left and dorsomedial is up. Reconstructed surface projections of the left hemispheres of monkey 1 (A) and monkey 2 (B). (C) Surface projection of the (inverted) right hemisphere of monkey 1. (D) A lateral view of the hemisphere shown in (C), with the region included in (C) approximated by the dashed box. The dotted ellipse encloses the cells deemed to lie inside the PFdl by histological analysis, but does not correspond to the cytoarchitectonic boundaries of area 46.\n", - "3465 \n", - " Attention and Memory Signals in Population Histograms(A) and (B) Representation of an attention signal by attention cells (A) and hybrid cells (B). (C) and (D) Representation of a memory signal by memory cells (C) and hybrid cells (D). In each panel, activity is shown centered on the appearance of the circle (left vertical line), on the time that the circle stopped moving (middle vertical line), and on the trigger signal (right vertical line). Attention and memory signals are reflected in the degree of separation in the average population histograms for different ranks. In (A) and (B), the data for the period immediately prior to the end of the circle's movement have been eliminated because the circle came from different initial locations.\n", - "3466 \n", - " Neuron-Dropping Curves for Different Subpopulations of PFdl Neurons in Monkey 1Each curve represents the percentage of correct single-trial estimations of location as a function of the number of neurons in the assembled populations. The curves show predictions of the attended locations (blue lines) or remembered locations (red lines) during the 800 ms immediately preceding the trigger signal, after the circle had stopped revolving around the central fixation point. Also shown is the estimation for the 800-ms period immediately preceding the onset of the circle's movement (gray lines). The dotted line indicates the chance level of estimation, 25% correct. Neuron-dropping curves are shown for neurons tuned to the attended location (A), the remembered location (B), both locations (C), and all spatially tuned neurons (D). (E) and (F) Dynamic changes in estimations of the attended (blue) and remembered (red) locations for 20 spatially tuned neurons (marked by the dashed gray line and arrows), using a 200-ms sliding window. Dashed and solid lines in (E) and (F) are shown for consistency with Figure 8. Note that the estimations in (D) are higher than in (E) and (F) because the former is based on an 800-ms interval, and the latter are based on only a 200-ms interval.\n", - "3467 \n", - " Time-Dependent Changes in Estimating the Attended Location and Remembered Location, for Both Monkeys CombinedSolid lines, trials in which the monkeys made a saccade to the attended location; dashed lines, trials in which the monkey made a saccade to the remembered location. Blue lines, estimation of the attended location; red lines, estimation of the remembered location. All records are centered on the onset of the trigger signal (using data for the 200 ms prior to that time). Vertical lines at t > 0 show the average saccade latency on Att-trials (solid) and Rem-trials (dashed). The thick bar at the bottom of the plots shows the approximate onset of the peripheral fixation spot, which the monkeys continued fixating beyond the limit of the plot. Estimations for each monkey were calculated using the same methods as for Figures 7E and 7F, except that the ensemble size for monkey 2 was 60 neurons. This number of neurons was chosen to avoid ceiling effects (i.e., 100% correct). The plotted curves show the average for the two monkeys. Location estimations for attention (A), memory (B), hybrid cells (C), and all spatially tuned neurons on Att-trials (D) and Rem-trials (E). Above the plots are schematic depictions of an example trial, of the type illustrated in Figure 1A. The red “R” marks the remembered location. In both D and E, prior to the trigger signal (left schematic), the monkeys fixated (dashed lines) centrally and covertly attended to the circle (yellow spot at the attended location). During this period, estimation of the attended location exceeded that of the remembered location. Following the saccade, the monkeys fixated a peripheral light spot (right schematic) and attended to this target to detect when it dimmed. On Att-trials (D), the monkeys' gaze shifted to the attended location, and the ensemble's estimation of this now overtly attended location improved (solid blue curve), while the representation of the now irrelevant, remembered location gradually decayed (solid red curve). On Rem-trials (E), the monkeys' gaze (dashed lines) and focus of attention (yellow spot) shifted to the (previously) remembered location. The estimation of this location consequently improved (red dashed curve), while the estimation of the previously attended (and now irrelevant) location gradually decayed. Abbreviations: Att, attended; Rem, remembered.\n", - "3468 \n", - " The CUG Initiation Codon Is Decoded as Leucine Independent of RNA Sequence(A) The indicated synthetic peptides mixed with extracts from untransfected COS-7 cells were separated by RP-HPLC. Each fraction was tested for BCZ103 T cell-stimulating activity with Kb+B7.2+ L cells as APCs. After overnight incubation, the β-galactosidase induced in activated T cells was measured using the substrate chlorophenol red-β-pyranoside, which yields a colored product with absorbance at 595 nm. The arrows indicate the reproducible peak elution times for the MYL8 and the LYL8 peptides. Injections of buffer alone (Buffer) were carried out under identical conditions, and the fractions were assayed in parallel to ensure absence of cross-contamination between runs.(B–D) Extracts from COS-7 cells transfected with cDNA encoding Kb and the indicated constructs were separated by RP-HPLC. Fractions were tested for BCZ103 T cell-stimulating activity as in (A).(E) The indicated synthetic peptides mixed with extracts from untransfected COS-7 cells were separated by RP-HPLC. Each fraction was tested for the specific DBFZ T cell-stimulating activity with Db+B7.2+ L cells as APCs as in (A). The arrows indicate the reproducible peak elution times for the MM9 and the LM9 peptides.(F and G) Extracts from COS-7 cells transfected with cDNA encoding Db and the indicated constructs were separated by RP-HPLC. Fractions were tested for DBFZ T cell-stimulating activity as in (E).(H) A range of concentrations of the indicated synthetic peptides was tested for BCZ103 T cell-stimulating activity with Kb+B7.2+ L cells as APCs.(I) A range of concentrations of the indicated synthetic peptides was tested for DBFZ T cell-stimulating activity with Db+B7.2+ L cells as APCs.\n", - "3469 \n", - " Expression of the Cryptic LYL8 Peptide Is Independent of the Efficiency of Upstream Translation Initiation Events(A) The nucleotide sequences of R0 and R1 constructs encode the SVL9 peptide followed by a termination codon and the LYL8 peptide. In the R0 construct, the SVL9 peptide is in frame with an ATG initiation codon. In the R1 construct, a single nucleotide is inserted after the ATG codon and causes the SVL9*LYL8 coding sequence to be out-of-frame with the ATG. The in-frame translation products are underlined and arrows indicate the potential initiation codons.(B and C) The R0 and R1 constructs were transfected into Lmtk– cells along with the appropriate MHC molecule. They were tested for SVL9/Db expression using the 30NX/B10Z hybridoma (B) and LYL8/Kb expression using the BCZ103 T cell hybridoma (C).(D) Extracts from COS-7 cells transfected with cDNA encoding Kb and the indicated constructs were separated by RP-HPLC. Fractions were tested for BCZ103 T cell stimulating activity as in Figure 1.\n", - "3471 \n", - " The Kozak Context Enhances the Leucine as well as the “Wobble” Methionine Start(A) Lmtk– cells were transfected with Kb cDNA and the indicated “Excellent” and “Poor” constructs encoding the (CTG)YL8 peptide. They were tested for LYL8/Kb expression using the BCZ103 T cell hybridoma.(B) Extracts from COS-7 cells transfected with cDNA encoding Kb and the indicated constructs were separated by RP-HPLC. Fractions were tested for BCZ103 T cell-stimulating activity with Kb+B7.2+ L cells as APCs. The arrows indicate the peak elution positions for the MYL8 and the LYL8 peptides. T cell responses to fractions collected after injecting sample buffer alone (Buffer) are also shown to indicate absence of cross-contamination between runs.\n", - "3473 \n", - " Ribosomes Are Scanning Specifically for the CUG/Leucine Start(A, C, and E) Lmtk– cells were transfected with the indicated constructs and Kb cDNA. After 2 d they were tested for MYL8/Kb or LYL8/Kb expression using the BCZ103 T cell hybridoma. Error bars represent the standard deviation of three replicate wells. (ATG)3ATG (solid circles, A) denotes the ATG-initiated peptide preceded by three ATGs upstream of and out of frame with the peptide; (CAG)3ATG (open circles, A) is the identical DNA construct but the upstream ATGs were replaced with CAG. (ATG)3CTG (solid circles, C) denotes the CTG-initiated peptide preceded by three ATGs upstream of and out of frame with the peptide; (CAG)3CTG (open circles, C) is the identical DNA construct but the upstream ATGs were replaced with CAG. (CTG)3CTG (solid circles, E) denotes the CTG-initiated peptide preceded by three CTGs upstream of and out of frame with the peptide; (CAG)3CTG (open circles, E) is the identical DNA construct but the upstream CTGs were replaced with CAG.(B, D, and F) Extracts from COS-7 cells transfected with cDNA encoding Kb and the indicated constructs were separated by RP-HPLC. Fractions were tested for BCZ103 T cell-stimulating activity with Kb+B7.2+ L cells as APCs. Arrows indicate the peak elution positions of the MYL8 and the LYL8 peptides. Points on graphs correspond to those in (A), (C), and (E).\n", - "3474 \n", - " The Leucine Start Is Enhanced in the Presence of Phosphorylated eIF2αHeLa cells transfected with cDNA encoding Kb together with cDNA encoding either the ATG- or CTG- initiated peptides were treated for 4 h with 50 μM NaAs, with brefeldin A (BfA), or left untreated (UT).(A) Transfected cells treated with NaAs or without (UT) were lysed and tested for phosphorylation of eIF2α by Western blot and for tubulin as a loading control.(B) The transfected cells were titrated and tested for their ability to stimulate BCZ103 T cells.\n", - "3476 \n", - " \n", - "M. marinum ΔRD1 Is Attenuated In Vitro and In Vivo(A) Growth of M. marinum WT and ΔRD1 in J774 cells. Each time point represents the average of triplicate values. Error bars are ± standard error of the mean (SEM).(B) WT and ΔRD1 bacterial numbers in frog spleens. Each time point represents the average colony counts from 3–5 frogs. Error bars are ± SEM (* p ≤ 0.05, ** p = 0.016, unpaired Student's t-test). Infecting doses were 5.8 × 105 CFU for WT and 1.2 × 106 CFU for ΔRD1.\n", - "3477 \n", - " ΔRD1 Is Attenuated in Zebrafish Larvae(A) Diagram of the zebrafish embryo/larva. Arrows indicate the two injection sites used in this study.(B) Survival of embryos infected with ΔRD1 (410 CFU) or WT bacteria (250 CFU) and null-injected embryos.(C) Whole embryo bacterial counts of WT- and ΔRD1-infected embryos. Infecting doses: 32 CFU for WT, 36 CFU for ΔRD1. Error bars are ± SEM (** p = 0.0075 comparing 7-d postinfection WT to 7-d postinfection ΔRD1; * p = 0.05 comparing 9-d postinfection WT to 9-d postinfection ΔRD1, unpaired Student's t-test).(D) Time of aggregate formation, showing delayed aggregation in the ΔRD1-infected embryos (n = 13) as compared to WT-infected embryos (n = 15). Infecting doses: 131 CFU for WT, 301 CFU for ΔRD1.(E) Whole embryo bacterial counts of WT- and ΔRD1-infected embryos on day of aggregate formation. Infecting doses: 36 CFU for WT, 78 CFU for ΔRD1. Error bars are ± SEM (*** p = 0.0008, unpaired Student's t-test; ΔRD1 n = 28, WT n = 29).(F) Fluorescent image of WT-infected embryo at 6 d postinfection with two aggregates (arrows). Scale bar, 200 μm.(G) WT-infected embryos with higher magnification overlay of fluorescent and DIC images showing an aggregate (arrow) with individual infected macrophages that are migrating toward aggregate (arrowheads). Scale bar, 50 μm.(H) Fluorescent image of ΔRD1-infected embryo at 6 d postinfection that has not formed any aggregates. Note the numerous infected macrophages throughout the head, body, and tail. Arrowhead and close-up insert (scale bar, 50 μm) show infected macrophages close to each other, but not aggregating. Scale bar, 200 μm.(I) ΔRD1-infected embryo under higher-magnification overlay of DIC and fluorescent images showing three individual infected macrophages (arrowheads). Scale bar, 50 μm.\n", - "3478 \n", - " Progression of Aggregates a WT Aggregate (A), and a ΔRD1 Aggregate (B)(A) WT aggregates shown on the first day of aggregate formation (t = 0 h); 24 h after aggregate formation (t = 24 h); and 48 h after aggregate formation (t = 48 h).(B) ΔRD1 aggregates shown at the same time points as in (A).A 60× water lens was used for all photomicrographs except the image in (A) t = 48 h, which was taken with a 40× lens. Scale bar represents 50 μm.\n", - "3479 \n", - " Normal Macrophage Chemotaxis to Initial Sites of ΔRD1 InfectionOverlay of DIC and fluorescent images showing the hindbrain ventricle (hv) of infected embryos. The hindbrain ventricle/brain (hv/b) boundary indicated by a white dashed line.(A) ΔRD1-infected embryo 4 h postinfection with individual infected macrophages marked by arrowheads.(B) ΔRD1-infected embryo 5 h postinfection in which individual infected macrophages (arrowheads) have migrated from the hindbrain ventricle and into the brain.(C) WT-infected embryo 24 h postinfection with macrophages beginning to aggregate (white arrow) in the hindbrain ventricle. A second out-of-focus aggregate is to the left (yellow arrow). Scale bar, 100 μm.\n", - "3480 \n", - " Superinfection with WT Bacteria Rescues ΔRD1 Aggregation Defect(A and B) Embryos with aggregates at 3d postinfection with 85 CFU red-fluorescent WT bacteria are shown 4 h after superinfection with green-fluorescent strains of either ΔRD1 (134 CFU) (A) or WT (169 CFU) (B) bacteria. Superinfecting strains were injected at sites distant from the aggregates, and pictures were taken outside of injection regions. Arrowheads indicate macrophages infected with superinfecting strain. Scale bar, 100 μm.(C) Embryo infected with 171 CFU green-fluorescent ΔRD1 for 4 d shown 4 h post-superinfection with 364 CFU of red-fluorescent ΔRD1. Arrowheads point to macrophages infected with each of the bacterial strains. Scale bar, 200 μm.(D) Embryo infected with 171 CFU green-fluorescent ΔRD1 for 4 d shown 4 h after superinfection with 363 CFU of red-fluorescent WT bacteria. Arrow points to macrophage aggregate. Scale bar, 200 μm.(E) Higher magnification image of aggregate (arrow) in (D) showing green fluorescent ΔRD1 and red fluorescent WT bacteria. Arrowhead points to WT-infected macrophage outside the aggregate. Scale bar, 50 μm.(F and G) Embryo infected with green fluorescent ΔRD1, superinfected with red fluorescent WT (as in D and E) shown at 24 h post-superinfection (F), and the same aggregate at 48 h post-secondary infection (G). Scale bars, 50 μm. All panels are fluorescent images.\n", - "3482 \n", - " Macrophage Aggregation Correlates with Bacterial Dissemination during WT Infection(A) Enumeration of infected macrophages in embryos by fluorescent and DIC microscopy after infection with green-fluorescent bacteria. Infecting doses: 151 CFU for WT, 301 CFU for ΔRD1. Time points are in reference to day of aggregate formation, which is set at 0. 15 WT infected embryos and 13 ΔRD1 embryos were monitored. The graph represents all 15 WT embryos, but only the 7/13 ΔRD1 infected embryos that formed aggregates over the course of the experiment. Error bars are ± SEM. (*p = 0.0136 comparing WT day 0 and WT day –2; ** p = 0.0053 comparing WT day 1 and WT day –2, unpaired Student's t-test).(B) Whole embryo bacterial counts following WT infection (*** p ≤ 0.0003, 5 d postinfection and 8 d postinfection, respectively, compared to 3 d postinfection, unpaired Student's t-test).\n", - "3483 \n", - " WT Aggregates Are More Likely to Have TUNEL-Positive Cells Than ΔRD1 AggregatesRepresentative fluorescent images of aggregates following TUNEL staining of 6-d postfertilization embryos infected with 71 green-fluorescent WT (A), or 474 green-fluorescent ΔRD1 (B) bacteria. TUNEL staining is imaged with red fluorescence, and colocalization with green-fluorescent bacteria appears yellow. Scale bar, 100 μm.\n", - "3484 \n", - " ΔRD1 Infection Is Associated with Persistent Defects in Granuloma OrganizationTissue histology of 32-d postfertilization fish infected with either 21 WT (A–D) or 9 ΔRD1 (E–F) bacteria (doses were not significantly different p = 0.15) at 1 d postfertilization. Arrows indicate granulomas and loose aggregates, arrowheads indicate caseum. Hematoxylin and eosin staining are shown in (A), (C), and (E), and modified acid-fast staining is shown in (B), (D), and (F). (A) Organized caseating WT granulomas (arrow) with central caseum (arrowhead). (B) WT granuloma showing mycobacteria predominantly in caseum with a few within epithelioid cells. (C) Noncaseating but highly organized WT M. marinum-induced granulomas showing the expected few bacteria within cells in (D). (E) Large, loose, and poorly organized macrophage aggregate of ΔRD1-infected fish with evidence of epithelioid transformation only in the center (denoted by *). (F) A few mycobacteria in the ΔRD1 aggregates. Scale bar, 100 μm. Images in (A–D) were taken with a 40× lens, whereas those in (E) and (F) were taken with a 20× lens.\n", - "3486 \n", - " Statics with Homogeneous Humans and Heterogeneous MosquitoesThe components of EIR follow different trends when larval habitat is distributed at a single point and humans are uniformly distributed (the gray background illustrates the human distribution).(A) Mosquito density (solid) declines monotonically, but PIM (dashed) increases monotonically. The density of infected mosquitoes (Z, dotted) also declines monotonically.(B) HBR (solid) and EIR (dashed) both decline monotonically away from the source, reflecting the steep gradient in mosquito density.(C) The density of infected humans (dashed) and prevalence of infection in humans (solid) also decline monotonically (the curves coincide).\n", - "3487 \n", - " Statics with Heterogeneous Humans and Homogeneous MosquitoesHBR and EIR reflect mosquito movement and human distribution patterns when larval habitat is evenly distributed but humans have a low–high–medium distribution, such as a town with rural and suburban populations on either side (the gray background illustrates the human distribution).(A) Mosquito density (solid) is highest in town, peaks at the edges of town, and dips just outside of town. PIM (dashed) and the density of infected mosquitoes (Z, dotted) follow similar patterns.(B) HBR (solid) and EIR (dashed) are both high on the low-density side of town and lowest on the medium-density side of town, with peaks just inside town and troughs just outside of town.(C) The density of infected humans (dashed) and the prevalence of infection in humans (solid) peak at the edge of town, but prevalence of infection in humans is less variable than HBR or EIR.\n", - "3488 \n", - " Statics with Heterogeneous Humans and MosquitoesWhen human density increases smoothly away from a larval habitat (the gray background illustrates the human distribution), the patterns of EIR components reflect heterogeneity in the distribution of larval habitat and human populations.(A) Mosquito density (solid) peaks an intermediate distance away from the source. The peak density of infected mosquitoes (Z, dotted) is further from the source because PIM (dashed) increases monotonically away from the source.(B) HBR (solid) decreases monotonically away from the source, reflecting mosquito density, but EIR (dashed) has a minor peak away from the source.(C) The density of infected humans (dashed) peaks away from the source, but the prevalence of infection in humans (solid) remains relatively constant near the source, dropping off sharply further away.\n", - "3489 \n", - " The Relationship between EIR and Human Prevalence, with Heterogeneity(A) EIR and the prevalence of infection in humans have a tidy relationship among patches; each small symbol is from a single patch in Figures 2–4. The relationship, given by equation 1, is plotted in gray. The phase plane of the dynamic relationship over time from Figure 1 is plotted with dashed lines. Average EIR is plotted against the average prevalence (large symbols). Predicting the average prevalence of human infection from average EIR leads to underestimates.(B–D) The density of infectious mosquitoes (Z) (B), HBR (HBR = aM/H) (C), and PIM (PIM = Z/M) (D) are plotted against the proportion of humans who are infected and infectious. PIM is a particularly bad measure of the risk of infection; in heterogeneous habitats, it peaks far from larval habitat, where mosquito density and prevalence of infection in humans is lowest. This accounts for the large number of points where PIM is high, but the proportion of infectious humans is low.\n", - "3490 \n", - " Definition of Structural and Functional Motifs, and Motif Detection(A) From a network, we select a subset of three vertices and their interconnections, representing a candidate structural motif.(B) The candidate motif is matched to the 13 motif classes for motif size M = 3. Numbers refer to the ID. The candidate motif is detected as a motif with ID = 13. In detecting structural motifs, only exact matches of candidate motif and motif class are counted.(C) A single instance of a structural motif contains many instances of functional motifs. Here, a structural motif (M = 3, ID = 13) is shown to contain, for example, two distinct instances of the functional motif ID = 9, one motif ID = 2, and one motif ID = 7. Many other distinct instances of functional motifs are present that are not shown in the figure. Note that, in order to be counted as a functional motif of size M = 3, all three vertices of the original structural motif must participate. For a very similar distinction between structural and functional motifs (“interlaced circuits”) and an illustration see Ashby (1960), p. 53.\n", - "3491 \n", - " Comparison of Structural Motif Frequency Spectra for Macaque Visual Cortex and C. elegans\n", - "(A) Spectra for structural motifs of size M = 3.(B) Spectra for structural motifs of size M = 4.\n", - "3492 \n", - " Structural Motifs that Occurred in Significantly Increased Numbers at Motif Sizes M = 3 and M = 4(A) Structural motifs found in all three large-scale cortical networks analyzed in this study (see Table 2).(B) Structural motifs found in networks optimized for functional motif number (see Table 4). Numbers refer to the motif's ID.\n", - "3493 \n", - " Motif Fingerprints for Motif size M = 3 in Macaque Visual Cortex(A) Motif fingerprints for five areas with significantly increased motif ID = 9 (V1, V3, V4, MSTd, DP, names in bold) as well as areas V2, V4t, and PITv. Polar plots display the motif participation number for 13 motif classes with M = 3 (see Figure 1). Note that, despite differences in the absolute motif participation numbers, areas V1, V3, V4, MSTd and DP show highly similar motif fingerprints.(B) Hierarchical cluster analysis of motif fingerprints. The Pearson correlation coefficients between all pairs of motif fingerprints were used in a consecutive linking procedure using Euclidean distances based on the farthest members of each cluster (for details see Kötter and Stephan [2003]). Areas with more similar motif fingerprints are linked at smaller distances. The five areas with significantly increased motif ID = 9 are indicated in bold typeface.(C) Hierarchical cluster analysis of single area motif frequency spectra using the same procedures on orthogonal data of (B). Motif classes 9, 12, and 13 covary across the 30 visual areas and form a distinct branch of the cluster tree.\n", - "3494 \n", - " Properties of Networks (n = 10) Optimized for Structural and Functional Motif Number(A) Maximization of functional motif number (N = 30, K = 311). Each maximization starts from different random initial conditions, including a different set of 10 random networks. From left to right, each graph shows plots of functional motif number, structural motif number, motif frequency spectrum (M = 3) of optimized networks, and clustering coefficient.(B) Maximization of structural motif number (N = 30, K = 311). Graphs are as in (A). Compare the motif frequency spectrum in (A) with the corresponding plot for the macaque visual cortex in Figure 2A (first row, left bar graph). Initially, random networks in generation 1 exhibited frequency spectra identical to those for random networks in Figure 2A (first row, middle panel).\n", - "3506 \n", - " Resolution and Contrast Using the Backscattered Electron Signal(A and B) Presynaptic vesicles (SV) and postsynaptic folds (SF) are clearly visible (A) in a motor endplate preparation embedded in Spurr's resin. Similarly, the hexagonal array of actin filaments (AA) can be clearly resolved (B) in a different region from the same image (both images were smoothed using the ImageJ “smooth” command). Imaging conditions for (A) and (B): electron energy, 7.5 keV; spot, 3.5; chamber pressure, 30 Pa (H2O); pixel dwell time, 30 μs. The scanning resolution was 6.7 nm/pixel.(C) The effect of beam exposure on the block surface. Note the increased brightness and the lack of chatter in the central region (inside the dashed rectangle), from which a stack was acquired at higher resolution before taking the image shown. The tissue was rat neocortex embedded in Spurr's resin. Imaging conditions for (C): electron energy, 7.5 keV; spot, 3; digital resolution for stack acquisition, 26.7 nm/pixel; dwell time, 30 μs.(D and E) Cortical tissue embedded in Epon. Synapses (SD) are clearly discernable (E). Imaging conditions for (D) and (E): electron energy, 7.5 keV beam current; spot, 3; chamber pressure, 30Pa (H2O); pixel dwell time, 30 μs. The scanning resolution was 9.5 nm/pixel.Note that more backscattering corresponds to darker pixels in (A), (B), (D), and (E) but to brighter pixels in (C).\n", - "3507 \n", - " SEM Microtomy(A) Principle of SBFSEM operation: (1) a SEM image is taken of the surface of the plastic-embedded tissue preparation (amber trapezoid). (2) Then with a diamond knife (blue) an ultrathin slice is cut off the top of the block. (3) After retraction of the knife, the next picture is taken. The pictures shown are from an actual stack (cerebellar cortex) but are not successive slices; rather, they are spaced by five images (about 315 nm) to make the changes more apparent.(B) Usually cut-off slices pile up on the top of the knife. Protruding into the picture from the right is a puffer pipette, occasionally used to remove debris from the knife.(C and D) The mechanical design for the in-chamber microtome is shown in an overview (C) and a close-up of knife and sample (D) in renderings from the computer-aided design software. Most parts are nonmagnetic stainless steel (grey). A large-motion leveraged piezo actuator (green part on the left) drives the knife holder back and forth. The custom diamond knife (light blue) is clamped in a special holder. The sample (amber) advance is driven via a lever by a direct-current-motor-driven micrometer (dark blue). The retraction during the backwards knife motion is again piezo actuated (green cylinder in the lower right of [C]). Bearing springs are brown. The BSE detector (red) is depicted schematically above the sample. Not shown is the lateral positioning mechanism.\n", - "3508 \n", - " 3D Datasets: Five Slices(A) Five slices from a stack containing a total of 365 slices at 63-nm section thickness; same tissue as in Figure 1A and 1B. Note beginning of myelin sheath (MS) in the lowest slice. Imaging conditions as in Figures 1A and 1B except resolution is 13.4 nm/pixel.(B) Reslice of the same dataset along the red line show in the top image of (A). Arrows point to the presynaptic ending (PS) and the z-band (ZB). Image corners in (A) touch the reslice (B) at the depths at which they were taken.(C and D) Cerebellar tissue displayed at low (C) and high (D) resolution; note nuclear envelope (NM). Note differences in lateral and vertical resolution. Imaging conditions for (C) and (D): electron energy, 7.5 keV; spot size, 3.5; digital resolution, 12.7 nm/pixel.\n", - "3509 \n", - " The Alignment of Successive Images in a StackShifts between images were quantified using the positions of the peaks of the cross correlation (see Materials and Methods); same dataset as in Figure 3A and 3B.(A) The peak shifts in x-direction are shown for five different subregions distributed over the field of view. Four of the regions have a size of 256 × 256 pixels, one has a size of 512 × 512 (black trace). The peaks around slices 59 and 202 are caused by slice debris on the block face (see also streaks in Figure 3B).(B) The x/y displacement for the 512 × 512 region is shown in a scatter plot. For the central cluster the standard deviations are 10.9 nm and 11.8 nm for x and y, respectively.\n", - "3510 \n", - " Energy Dependence of the Depth ResolutionThe lateral resolution does not change very much as the electron energy is reduced from 7.5 keV (A) to 4 keV (B), but the resolution along the z-direction is dramatically different (C). The lines between (A), (B), and (C) indicate the z-positions in the stack from which (A) and (B) were taken. In the high-resolution view (lower panel in [C]) membranes that were en-face (EM) in the original slices can be clearly recognized. The nominal slice thickness was 55 nm. Tissue is rat cortex. Imaging conditions: dwell time, 25 μs; spot sizes, 3.5 and 2.8 for 4 and 7.5 keV, respectively.\n", - "3513 \n", - " Sequences near the 5' (A) and 3' (B) ends of the M1 plus strands of 14 reovirus isolates. The start and stop codons are indicated by bold and underline, respectively. The one-base deletion in the 3' noncoding region of the T2J sequence is indicated by a triangle. Positions at which at least one sequence differs from the others are indicated by dots. GenBank accession numbers for corresponding sequences are indicated between the clones' names and 5' sequences in \"A\". Clones are: T1L (type 1, Lang), T1C11 (type 1, clone 11), T1C29 (type 1, clone 29), T1N84 (type 1, Netherlands 1984), T2J (type 2, Jones), T2N84 (type 2, Netherlands 1984), T2S59 (type 2, simian virus 59), T3D (type 3, Dearing), T3C12 (type 3, clone 12), T3C18 (type 3, clone 18), T3C44 (type 3, clone 44), and T3N83 (type 3, Netherlands 1983). T1L clones were obtained from Dr. E.G. Brown (Brown) or our laboratories (Coombs/Nibert). T3D clones were obtained from Drs. W.K. Joklik, L.W. Cashdollar (Joklik/Cashdollar) and our laboratories (Coombs/Nibert).\n", - "3517 \n", - " Secondary structure predictions of μ2 protein. (A) Hydropathicity index predictions of T2J (- - -) and T1L (-----) μ2 proteins, superimposed to accentuate similarities and differences. Hydropathy values were determined by the Kyte-Doolittle method [72], using DNA Strider 1.2, a window length of 11, and a stringency of 7. (B) Surface probability predictions of the T2J μ2 protein, determined as per Emini et al. [73], using DNASTAR. The predicted surface probability profiles of T1L and T3D (not shown) were identical to T2J. (C) Locations of α-helices and β-sheets were determined by the PHD PredictProtein algorithms [74], and results were graphically rendered with Microsoft PowerPoint software., α-helix;., β-sheet;—, turn. Differences in fill pattern correspond to arbitrary division of protein into four regions; N, amino terminal; V, variable; H, helix-rich; C, carboxyl terminal. The locations of variable regions are indicated by the thick lines under the domain representation.\n", - "3518 \n", - " SDS-PAGE and immunoblot analyses of virion and core particles. Proteins from gradient-purified T1L (1), T2J (2), and T3D (3) particles were resolved in 5–15% SDS-polyacrylamide gels as detailed in Materials and methods. Gels were then fixed and stained with Coomassie Brilliant Blue R-250 and silver (A). Alternatively, proteins from the gels were transferred to nitrocellulose, probed with anti-μ2 antiserum (polyclonal antibodies raised against T1L μ2, kindly provided by E. G. Brown), and detected by chemiluminescence (B). Virion proteins are indicated to the left of panel A, except for μ2, which is indicated between the panels.\n", - "3538 \n", - " Morphologic characteristics of deer mouse bone marrow-derived APC. Day 14 bone marrow cells cultured in GM-CSF were processed by cytospin and stained with Wright's stain. The cells exhibited conspicuous cytoplasmic vesicles and small processes (A). Cells collected on day 12 and incubated for 48 hours with 20 ng/ml of hmTNF displayed less conspicuous cytoplasmic vesicles (B).\n", - "3539 \n", - " Proliferation of deer mouse cells to recombinant cytokines. (A) After 8 days of incubation with GM-CSF, deer mouse bone marrow cells were washed and then cultured with dilutions of GM-CSF in duplicate for 48 hours, then proliferation assessed by MTS assay. The data are representative of four deer mice. (B) To assess proliferative capacity of deer mouse T cells to human IL-2, splenocytes were cultured with a suboptimal dose of PHA (2 μg/ml) and dilutions of recombinant human IL-2 in duplicate for 48 hours, and proliferation assessed by MTS assay. The data are representative of two deer mice.\n", - "3558 \n", - " Transduction of saphenous vein cells and intact tissue. Ad-CTL and Ad-RGD expressing eGFP were incubated with (A) HSVEC and (B) HSVSMC for different times and gene expression quantified and normalised to protein. Representative fluorescent images are shown. (C) Intact human saphenous vein was incubated with luciferase-expressing vectors and expression quantified. *Indicates p < 0.05 vs Ad-CTL.\n", - "3581 \n", - " Evolution of Viral Load and CD4+ T Cell Counts during STI(A) Survival curves of time to virologic failure during the first three supervised treatment interruptions. Virologic failure was defined as having a viral load of greater than 5,000 copies RNA/ml plasma for 3 wk or greater than 50,000 copies once. Patients still achieving viral control at the last visit and individuals restarting therapy without meeting criteria or lost in follow-up are censored at the last evaluable time point. The horizontal axis represents the time off therapy since the beginning of the treatment interruption, the vertical axis corresponds to the number of patients maintaining control of viremia. The curves for first, second, and third STIs do not differ significantly from each other (log-rank test, p > 0.05).(B) Evolution of CD4+ T cell counts during the longest treatment interruption. Slopes of CD4+ T cell counts during the first year of the longest treatment interruption are shown for patients who experienced a cessation of therapy of at least 12 mo (all except AC13, AC25, and AC45), compared to the natural decline of CD4+ T cell counts in untreated patients of the MACS cohort with early chronic HIV-1 infection (CD4+ counts of >350 cells/mm3). CD4+ T cell losses were calculated on a regression line based on least squares fit. The two groups differed significantly from each other (Mann-Whitney U test, p = 0.02).(C) CD4+ T cell count at intercept and CD4+ T cell slopes during the longest treatment interruption. The CD4+ T cell slopes of the same 11 patients shown in (B) and of untreated patients of the MACS cohort are represented according to the CD4+ T cell count at the intercept of the regression line based on least squares fit with the vertical axis (day 0 of treatment interruption).\n", - "3582 \n", - " Evolution of HIV-1-Specific CD4+ and CD8+ T Cell Responses during STI(A–D) Magnitude and breadth of increase of HIV-specific CD8+ T cells during supervised treatment interruptions.(A and B) Magnitude (A) and breadth (B) of HIV-specific CD8+ responses at the first day of treatment interruption (black bars) and at the last day off therapy (white bars). Data represent the mean and standard deviation.(C and D) Correlation between the increase of the magnitude (C) or breadth (D) of CD8+ T cell responses and the time off therapy during the first treatment interruption.(E and F) Evolution of CD4+ T helper cell responses during supervised treatment interruptions.(E) Magnitude of CD4 T helper cell responses at baseline and at the first day of treatment interruption (closed circles) and last day off therapy (open circles). Horizontal bars correspond to median values. An stimulation index greater than five was considered significant.(F) Correlation between the magnitude of p24-specific lymphocyte proliferative responses at the beginning of the first treatment interruption and the time patients were able to remain off therapy during the subsequent STI.\n", - "3584 \n", - " Circadian Variation of Glucose, Triglyceride, and Hormone Levels in Circulating BloodPlasma from whole blood isolated from unchallenged WT mice at different CTs was analyzed for glucose (A), triglyceride (B), corticosterone (C), and adiponectin levels (D) (n = 12 per time point). Results for Bmal1\n", - "−/− and Clockmut mice are shown in Table 1.\n", - "3585 \n", - " Disruption of Genes in the Core Molecular Clock Alters the Response to Insulin(A) Insulin tolerance (IT) was examined in WT mice on CT7, CT13, CT19, and CT25 at 30 min, 60 min, and 90 min after insulin injection (n = 12 per time point, *p < 0.01).(B) IT was examined in WT (black line), Bmal1\n", - "−/− (blue line), and Clockmut mice (green line) at CT1 (i) and CT13 (ii) (n = 6–10, *p < 0.05, †p < 0.01, ††p < 0.001).(C and D) Plasma levels of the counterregulatory hormones corticosterone (C) and glucagon (D) were assessed 60 min after insulin injection in Bmal1\n", - "−/− and Clockmut mice (n = 7, corticosterone assay; samples were pooled for glucagon assay, *p < 0.05).\n", - "3586 \n", - " Impaired Gluconeogenesis in Mice with a Disrupted Circadian Clock(A) Pyruvate tolerance was compared among WT (black line), Bmal1+/− (blue line), and Bmal1−/− (purple line), and Clockmut (green line) mice at CT7 (n = 6–10).(B) Relative PEPCK activity (units are expressed as luciferase activity × 103) was measured in liver (i), aorta (ii), and kidney (iii) from WT (white bars) and Clockmut mice (green bars).\n", - "3587 \n", - " The Molecular Clock Conditions HF-Induced Circadian Variation in Glucose Homeostasis(A) Glucose tolerance (GT) in RC-fed WT mice (i), HF-fed WT mice (ii), and HF-fed Clockmut mice (iii).(B) IT in RC-fed WT mice (i), HF-fed WT mice (ii), and HF-fed Clockmut mice (iii) at respective times (n = 6–8; *p < 0.05, †p < 0.01).\n", - "3625 \n", - " Relationship of M. tuberculosis BCAT to other family III aminotransferases. In (A) selected subfamily IIIa and IIIb aminotransferases were aligned and a tree constructed by the neighbor-joining method [49] in order to define the subfamily membership of the M. tuberculosis BCAT (in blue). In (B) subfamily IIIa BCATs were aligned and a cladogram constructed by the neighbor-joining method. The numbers represent the bootstrap values (in percentage) for each branch point.\n", - "3632 \n", - " The lps locus is absent from the genomes of Xoo strains BXO8, Nepal624 and Xoor strain BXORI. (A) PCR analysis using primers that are specific to wxoA gene. M is the λ HindIII Marker lane. An expected band of 1 kb (indicated by arrow) is present in the Xoo strains, BXO1 (lane 1), BXO5 (lane 3), BXO6 (lane 4) and BXO20 (lane 6) but absent in BXO8 (lane 5), Nepal624 (lane 7) and BXORI (lane 2). (B) Southern hybridization analysis of EcoRI digested genomic DNA using α-32-P labeled wxoA specific probe (see Methods). A 4 kb band can be seen (indicated by arrow) in BXO1 (lane 1) but not in BXORI (lane 2), BXO8 (lane 3) and Nepal624 (lane 4). Similar results were obtained for wxoB, wxoC, wxoD, wzm and wzt genes. (C) The blot from (B) was deprobed and was hybridized with α-32P labeled probe specific to the metB gene. A specific band can be seen in all the lanes. Note the sizes of the bands indicating that metB is present in different EcoRI fragments in BXO1, BXORI and BXO8/Nepal624.\n", - "3650 \n", - " Psammaplin A inhibited topo I catalytic activity. Topo I activity was measured by the relaxation of superhelical plasmid DNA. The assay mixture (20 μl) contained pUC118 (20 μg/ml), topo I (1 unit), and various amounts of the psammaplin A. After 30 min at 30°C, the reactions were stopped by the addition of 5 μl of stop solution. The samples were then loaded onto the agarose gel (0.8%) for electrophoresis followed by photography. (A) The reaction mixtures contain 0.5 mM DTT; (B) Compare the reactions in the presence and absence of 0.5 mM DTT.\n", - "3688 \n", - " Impact of pramipexole on MPTP-induced loss of TH-IR neurons. Low-power photomicrograph (20x) of the substantia nigra and ventral tegmental area of tissue sections stained for TH-IR from individual cases of 4 groups of mice: (A) Veh-Veh, (B) pramipexole -Veh, (C) Veh-MPTP (25 mg/kg sc., 4 times in 2 days at 8 h intervals), (D) pramipexole-MPTP. Note the marked depletion of TH-IR from the substantia nigra and considerably lesser impact in the ventral tegmental area following MPTP. Pramipexole pretreatment regimen provided complete protection (see D) from MPTP. Abbreviations: SNpc, substantia nigra pars compacta; VTA, ventral tegmental area.\n", - "3690 \n", - " Impact of pramipexole on MPTP-induced loss of DAT-IR fibers. Low-power photomicrograph (20x) of the caudate-putamen and nucleus accumbens of tissue sections processed for DAT-IR from individual cases of 4 groups of mice: (A) Saline-Saline, (B) pramipexole – Saline, (C) Saline -MPTP (20 mg/kg sc., 4 times in 2 days at 8 h intervals), (D) pramipexole-MPTP. Note the marked depletion of DAT-IR from the caudate-putamen (C) and apparent protection by pramipexole (D). Abbreviation: CPu, caudate-putamen; NAS, nucleus accumbens shell; NAC, nucleus accumbens core.\n", - "3691 \n", - " Impact of pramipexole on MPTP-induced loss of TH-IR fibers. Low-power photomicrograph (20x) of the caudate-putamen and nucleus accumbens of tissue sections processed for TH-IR from individual cases of 4 groups of mice: (A) Saline-Saline, (B) pramipexole – Saline, (C) Saline -MPTP (20 mg/kg sc., 4 times in 2 days at 8 h intervals), (D) pramipexole-MPTP. Note the marked depletion of TH-IR from the caudate-putamen (C) and apparent protection by pramipexole (D). Abbreviation: PPX, pramipexole.\n", - "3692 \n", - " Histogram of pramipexole's neuroprotective effects against MPTP induced fiber loss. Effects of subchronic treatment with pramipexole on DAT-IR (A) and TH-IR (B) optical density in the caudate-putamen, nucleus accumbens core and shell of mice treated with or without MPTP. Animals survived for 7 days after the last MPTP injection. Data are mean ± standard error of the mean from 4–5 samples per group. # for P < 0.01, all groups vs SAL + MPTP group; $ for P < 0.01, for SAL-PPX vs SAL-SAL. Abbreviations: CPU, caudate-putamen; Nac Core, nucleus accumbens core; Nac Shell, nucleus accumbens shell; PPX-MPTP, pramipexole + MPTP treated group; SAL-MPTP, saline + MPTP treated group; PPX-SAL, pramipexole + saline treated group; SAL-SAL, saline + saline treated group.\n", - "3693 \n", - " Effects of pramipexole on the kinetics of [3H]DA and [3H]MPP+ uptake. Effects of subchronic treatment pramipexole or vehicle (saline) on [3H]DA uptake (A) and [3H]MPP+ uptake (B) in striatal synaptosomes from treated mice. Group data are plotted with the mean ± standard error of the mean from 6 samples per group. The dashed line for each of the means represents the calculated 95% confidence interval. The Vmax and Km were calculated for each group and paired comparisons by t-test revealed significant differences.\n", - "3705 \n", - " HSV tk and ICP0 RNA expression in mock and HSV-infected cornea and TG. RNA isolated from tissues harvested at 3, 10, or 30 days postinfection (d) was subjected to TaqMan RT-PCR analysis using HSV tk primers/probe (A) and HSV ICP0 primers/probe (B) as described in Materials and Methods. Mouse GAPDH RNA was measured in multiplex reactions, and used to calculate relative expression using the formula Rel Exp= 2-(ΔΔCT) × 1000 as described in Materials and Methods. Shown below the plots are relative expression values and the CT value measured for tk (A) and ICPO (B) in each sample. The ICP0 signal detected at 10 and 30 dpi in HSV-infected TG is likely due to LAT RNA as described in the text. Results shown are for one experiment (Experiment #1) in which the number of individual mouse tissues pooled were 10 for cornea and 6 for TG. Similar results were obtained in two additional experiments (Experiment #2 and Experiment #3), except for variation in detection of tk RNA in infected TG at 30 dpi as described in the text.\n", - "3706 \n", - " Relative levels of chemokine and chemokine receptor RNA expression in mock and HSV-infected cornea. Corneas were harvested at 3 (A), 10 (B), or 30 (C) days postinfection, and relative levels of expression were determined by TaqMan RT-PCR analysis as described in Fig. 1 and Materials and Methods. Results shown are the average of relative expression values determined using cDNA from two independent experiments, with each cDNA subjected to 2 or 3 separate measurements. Dashed bars represent ranges of individual values. Each cDNA was synthesized from RNA isolated from pooled corneas (5 mice) as described in Fig. 1 and Materials and Methods. The induction ratios (HSV+ vs. mock) for individual genes are tabulated in Table 3.\n", - "3707 \n", - " Relative levels of chemokine and chemokine receptor RNA expression in mock and HSV-infected TG. TG were harvested at 3 (A), 10 (B), or 30 (C) days postinfection, and RNA levels were determined by TaqMan RT-PCR analysis as described in Fig. 1, Fig. 2 and Materials and Methods. Results shown are the average of relative expression values determined using cDNA from three independent experiments, with each cDNA subjected to 2 or 3 separate measurements. Dashed bars represent ranges of individual values as described in Fig. 2. The induction ratios (HSV+ vs. mock) for individual genes are tabulated in Table 3.\n", - "3719 \n", - " Left sided accessory pathway. The shortest AV and VA are recorded in CS2 (see arrows) during programmed atrial stimulation (A) and atrio-ventricular orthodromic re-entrant tachycardia (B) respectively suggesting a left sided posterolateral accessory AV connection.\n", - "3730 \n", - " Detection of PTCH1 expression in prostate cancers. Protein expression of PTCH1 was detected by immunostaining. PTCH1 antibodies (Santa Cruz Biotechnology Cat# 9149) were tested in Ptch1-/- null MEF cells (A). While Ptch1-/- null MEF cells had no positive fluorescent staining with PTCH1 antibodies, transfection of PTCH1 expressing plasmid lead to positive staining (green, indicated by an arrow, 400×). Immunohistochemistry of prostate cancer specimens with PTCH1 gave negative (B-a, 200×) or positive (Red in B-b, 200×) signals. When PTCH1 antibodies were pre-incubated with the very peptide for raising the antibodies, no positive signals could be observed (B-c).\n", - "3731 \n", - " Detection of HIP in human cancer specimens. By Western blotting, HIP antibodies (R&D systems Cat# AF1568) recognized one band between 75 and100 KD (A). Expression of endogenous HIP was detected in two GI cancer tissues, which were known to contain activated hedgehog signaling (data not shown here), but not in the matched normal tissue (B). Immunohistostaining of HIP I prostate cancer showed a similar pattern to PSA (C, 200×)\n", - "3732 \n", - " Detection of Su(Fu) in prostate cancer specimens. Su(Fu) antibodies (Santa Cruz Biotechnology Cat# 10933) recognized only one single band (54-Kd) in D283 cells (A). Following treatment of a specific SiRNA of Su(Fu), the endogenous Su(Fu) band was greatly reduced (B). Immunohistostaining with Su(Fu) antibodies in prostate cancer specimens revealed positive (C, in red, 200×), negative (D, 200×) or weak staining (E, red, 200×).\n", - "3733 \n", - " Inactivation of Su(Fu) in prostate cancer. Two TURP (Transurethral resection of the prostate) tumors with loss of Su(Fu) expression were confirmed by Western blotting (A). One mutation of Su(Fu) found in prostate cancer PC48 is shown in B, which is predicted to create a STOP codon in the Su(Fu) coding sequence +1318. The levels of Gli1 and PTCH1 transcripts in prostate tissues were detected by real-time PCR (see methods for details) (C). Tumor tissues had higher levels of the target gene transcripts.\n", - "3735 \n", - " Cellular functions of the hedgehog pathway in prostate cancer cells. Expression of hedgehog target genes, PTCH1 and Gli1, were detected by real-time PCR (A). DNA synthesis was detected by BrdU labeling (B). Over 1000 cells were counted under fluorescent microscope for the percentage of BrdU positive cells, and the experiment was repeated twice (C).\n", - "3736 \n", - " Effects of cyclopamine on cell invasiveness of prostate cancer cells. Cell invasion assay of prostate cancer cells was performed using BD Bio-coat cell invasion chambers (A). The rate of cell invasion was calculated by dividing cell numbers penetrated the matrigels by the number of cell in the control chambers (without matrigels) (B).\n", - "3738 \n", - " RNA Editing of an Alternatively Spliced Alu-Exon in a G-Protein Coupled Receptor(A) Schematic representation of LUSTR (GPR107, KIAA1624) gene structure around edited exon 15a. The AluSx repeat element in intron 15 and the exonic, inversely oriented AluJo are predicted to form an intramolecular foldback structure as depicted below (MFold software). TM, exonic regions predicted to encode transmembrane domains; *, editing sites.(B) Editing analysis of exon 15a (sequence in capital letters) and flanking regions. The two major editing sites predicted to change amino acids (H/R and Q/R) are indicated. Editing levels in brain (filled column) and lung (open column) are shown above each edited nucleotide. The splice acceptor site subject to editing is underlined.\n", - "3739 \n", - " RNA Editing of Alternative Exon 22a in Inhibitor BTKI and the 5′-UTR of KIAA1497(A) The alternatively spliced exon 22a and surrounding region of the BTKI (KIAA1417) gene with two Alu elements and its computer-predicted foldback structure.(B) Editing analysis of the AluSx- element with the exonic sequence in capital letters and edited A's in bold. The alternative splice acceptor site is underlined with a dashed line; the additional alternative consensus splice acceptor site, which undergoes editing, is underlined with a solid line.(C) Gene architecture and Alu foldback structure of KIAA1497. The brain-derived cDNA of KIAA1497, also known as LRRN1; (Taguchi et al. 1996), has a total of 15 nonpolymorphic AtoG discrepancies to gDNA, 14 being located within the 5′-UTR of the gene and one within the coding region. We analyzed PCR products covering all 14 potential editing sites in the 5′-UTR for editing in cDNA from human brain and could confirm in vivo editing to an extend clearly above the detection limit of our method for most of these positions and also at additional adenosines (data not shown). ORF, open reading frame; *, editing sites.\n", - "3740 \n", - " RNA Editing of KIAA500 Alu Inverted RepeatKIAA0500 is a cDNA of 6,577 nt in length cloned from human brain (AB007969) with a predicted open reading frame of 213 amino acids. Four AtoG discrepancies were present within the coding region of which two lead to an amino acid change (Q/R and S/G, respectively).(A) Structure of the KIAA500 mRNA with location of Alu elements indicated and the predicted RNA secondary structure according to the MFOLD algorithm. Large open box indicates predicted open reading frame. *, editing sites.(B) Editing analysis of an exonic Alu element in KIAA0500. Editing sites predicted to change amino acids are indicated. Our analysis revealed a significant percentage of editing (%G) at the nucleotide positions 3518 (27% ± 3%), 3522 (20% ± 3%) and 3625 (6% ± 1%) and additional editing sites with less than 5% editing, whereas parallel analysis of human gDNA confirmed the presence of adenosine at these positions. Editing levels in brain (filled column) and lung (open column, where detectable) are shown above each edited nucleotide.\n", - "3741 \n", - " Alu-Mediated RNA Editing in p53, SIRT2, NFκB, and Paraplegin Pre-mRNAsSchematic presentation of the gene structures from (A) P53, (B) SIRT2, (C) NFκB, and (D) SPG7. Edited repeat elements are marked by asterisks. RNA folds appear as calculated with MFOLD. The AluJb− in p53 is located in the 3′-UTR (A); all others are intronic. *, editing sites.\n", - "3742 \n", - " Editing of Alternative Foldback Structures of GPR81 Pre-mRNA(A) The position and orientation of all four Alu elements in GPR81 pre-mRNA is indicated. Three alternative Alu pairings (I–III) are predicted and experimental editing analysis indicates that all three do form in vivo. ORF, open reading frame; *, editing sites.(B) Editing analysis of AluSp+ in GPR81. Percentages of editing in human brain are indicated. The exonic sequence appears in capitals. The edited AT dinucleotide that becomes a splice donor site is underlined.\n", - "3743 \n", - " Mismatch Bias in Exonic Repetitive-Element Sequences(A) Plot of the nature and number of mismatches within Alu and L1 sequences present in human cDNAs. For reasons of comparison the L1 mismatch numbers have been multiplied by 2.9 so that the non-AtoG mismatch count for Alu and L1 is identical. Transition mismatches AtoG, GtoA, CtoT, and TtoC are displayed together for comparison.(B) Plotted are the total number of Alu sequences found in human cDNAs (first column) and the number of elements harboring AtoG and GtoA mismatches (second and last column). The third column indicates the high confidence set of edited elements (α = 0.000001).\n", - "3744 \n", - " Factors Determining Alu Targeting Probability(A) Percentage of edited elements classified in bins according to the distance separating the element and its closest inverted Alu partner.(B) Percentage of edited Alu elements clustered according to divergence from their corresponding Alu-subfamily consensus.(C) Percentage of edited Alu elements in each Alu subfamily.In (A), (B), and (C) the numbers at the bottom of the bars show the sample size in each bin. (D) Percentage of edited elements according to the tissue from which the RNA was isolated. Error bars show 95% confidence levels.\n", - "3745 \n", - " Sequence and Structure Preferences of Editing in Alus(A) The consensus sequence of 141 edited full-length Alu elements present within human Chromosome 1 transcripts with the number of editing events indicated for each sequence position (bars). Insertions and deletions present in fewer than five elements are not shown in the alignment for clarity. Bases conserved in more than 80% of the sequences are boxed. For the lesser conserved consensus positions the next most frequent base is listed below. Consensus CpG dinucleotides are in bold. Arrows indicate “high-efficiency” positions where more than 20% of adenosines present appear to be edited. Note the overlap of these positions with CpGs. Major features of Alu sequences, such as the A-Box and B-Box of Pol III and the Alu polyA sequence are labeled.(B) A typical Alu foldback structure and its major features as discussed in the text. Arrows indicate TA hot-spot positions. The magnifications show the two typical configurations of editing sites found in Alu pairs: mismatched A/C bulges (i) and A/U base pairs (ii).\n", - "3748 \n", - " Genome-Wide SNP Data Accurately Represent the Known Ancestries of the Genotyped Strains(A) A tree, adapted from Beck et al. (2000), tracing the lineage of the C57 family of mice (upper tree) shows almost perfect correlation with a phylogenic tree based solely on SNP data (lower tree). The only difference in the two trees is the location of C57BLKS/J, which splits from C57BL/6J sooner in the phylogenic tree because of the genomic contributions of the non-C57 strain, DBA/2J. The maximum parsimony phylogenic tree of the strain relatedness was built using the pseudoalignment of the 10,990 SNP alleles for 48 strains with the Phylip package, version 3.6b.(B) The DBA/2J contribution to C57BLKS/J can be visualized in its allelic patterns. The region from 104 Mb to 109 Mb on MMU9 shows the same SNP alleles for both C57BLKS/J and its other parental strain, C57BL/6J (a period represents identity with the C57BLKS/J allele). At 110 Mb, the pattern switches and every C57BLKS/J allele matches the DBA/2J content through 120 Mb. SNP marker names are positioned above the alleles with the first number representing the chromosome the marker is located on, the second number being the Mb position on the chromosome, and the third number being an approximate location within the Mb.\n", - "3749 \n", - " In Silico Mapping Method Correctly Identifies Coat Color, Retinal Degeneration, and Sweet Preference Loci from SNP Data(A) Presence or absence of the retinal degeneration, albino, or agouti phenotypes was given a numerical value of 1 or 0 for use in the mapping algorithm. In each case, the most significant p-value (indicated by an arrow) was obtained for the region that contains the gene known to produce these phenotypes. A closer inspection of the retinal degeneration mapping shows that the maximum linkage region indicated by the algorithm covered a 0.4-Mb region from 102.4 Mb to 102.8 Mb on MMU5.(B) Tas1r3 is known to be a major control gene for the complex trait of preference for sweet tastes. Values for the sweet preference of 23 strains of mice produced a highly significant association with the one Mb region of MMU4 that contains Tas1r3.\n", - "\n", - "3750 \n", - " Analysis of Adcy7 Haplotypes Reveals Amino Acid Change Associated with HDL Phenotype(A) Sequencing of Adcy7 in multiple strains revealed 28 SNPs distinguishing three distinct haplotype patterns. All strains were typed with markers selected to represent the three haplotypes. The strain distribution pattern predicted by the SNP data and the sample sequencing for this region was confirmed with NZB/BlNJ and BTBR T+ tf/J, I/LnJ and MA/MyJ, and C3H/HeJ, C57BL6/J, and C57L/J, each separating into unique haplotypes.(B) The SNP represented by marker 08.089.597 resulted in a change from a cysteine to a tyrosine in the resulting protein (asterisk). This cysteine is conserved in orthologs of the gene in human, rat, and cow. It is also found at the beginning of a stretch of ten amino acids (indicated by black line) predicted to be one of the protein's ten transmembrane domains. Identical amino acids are black and conserved amino acid changes are gray.\n", - "3757 \n", - " In Vitro DNA-Binding Profiles of Rpn4p ProteinsProfiles of 50 nM Sc_Rpn4p (A), Ca_Rpn4p (B), Hybrid_Rpn4p (C), and Nc_Rpn4p (D) binding to Sequence A (S. cerevisiae-specific; red curve), Sequence B (C. albicans-specific; blue curve), and Sequence C (hybrid; black curve) are shown. Protein was injected into the Biacore system at time = 0 for a duration of 90 sec, after which time buffer was injected and the protein dissociated from the Biacore chip. The scale of each binding profile was adjusted such that the binding levels to Sequence A are comparable for all species.\n", - "3758 \n", - " In Vitro Competition for DNA BindingThe maximum response units of binding were measured for Sc_Rpn4p (A), Ca_Rpn4p (B), or the hybrid protein (C) binding to Sequence A (left graphs), Sequence B (center graphs), and Sequence C (right graphs) in the absence (“mock”) or presence of a 1× or 5× molar excess of competitor fragments: Sequence G (with a core sequence of CTGCATTTGG), Sequence D (GGTGGCAAAA), Sequence E (AGTGGCAAAA), and Sequence F (GGTGGCAACA). Each histogram shows the maximum response units of binding, relative to the maximum response units measured for that protein binding to the Sequence A in the absence of competitor. Replicate experiments were performed for each mock reaction and the 5:1 competition experiments for Sc_Rpn4p protein. The range of replicate measurements was very narrow and is indicated by the error bars.\n", - "3764 \n", - " Gene discovery is increased by selection of weakly expressed cDNAs clones from a cDNA library made from immature cotyledons. (A) Phosphorimager pattern: A high density membrane containing 18,432 double spotted colonies from the Gm-c1007 cDNA library made from immature cotyledons was hybridized with 33P-labeled cDNAs transcribed from mRNAs isolated from immature cotyledons. (B) Graphical representation of the new cDNAs selected by the normalization process using filter hybridization. Circles represent the 931 total sequences obtained from the non-normalized source cDNA library Gm-c1007 versus the 1799 sequences of Gm-r1030 that were selected as weakly expressed sequences from the filter hybridization experiments shown in part (A). The intersection of the circles represent sequences common to both sets. H = number of sequences with hits in the databases; N = number of sequences that did not have a hit in the databases; and T = total number of sequences.\n", - "3767 \n", - " (A) Serum creatinine and (B) BUN on day 3 in the four groups of rats studied. Ct: control group, Cis: cisplatin group; FeTPPS: 5,10,15,20-tetrakis(4-sulfonatophenyl) porphyrinato iron (III) group, and Cis+FeTPPS: cisplatin+5,10,15,20-tetrakis(4'-sulfonatophenyl) porphyrinato iron (III) group. Data are mean ± SEM. n = 6. aP < 0.001 vs. Ct; bP < 0.001 vs. Ct, cP < 0.05 vs Cis (Panel A); aP < 0.001 vs. Ct; bP < 0.001 vs. Ct, cP < 0.001 vs Cis (Panel B). Serum creatinine and BUN increased in cisplatin group and FeTPPS prevented these increases in the Cis+FeTPPS group.\n", - "3768 \n", - " Urinary excretion of (A) total protein and (B) NAG on day 3 in the four groups of rats studied. Data are mean ± SEM. n = 5–6. aP < 0.001 vs. Ct, bP < 0.05 vs. Cis. Cisplatin-treated rats increased urinary excretion of total protein and NAG and these increases were prevented by FeTPPS administration in Cis+FeTPPS group.\n", - "3769 \n", - " Representative histological abnormalities in the external cortical kidney area after three days of cisplatin administration and their partial prevention by FeTPPS. (A) Normal kidney histology from control rat. (B) After three days of cisplatin administration, many cortical convoluted tubules are revisted by necrotic epithelial cells (arrows) or vacuolated swell cells (arrow heads), glomeruli do not show apparent damage. (C) FeTPPS administration does not produce histological kidney abnormalities. (D) The administration of FeTPPS partially prevents the cytotoxic damage induced by cisplatin; arrows indicate middle cellular vacuolization of cortical convoluted tubules.\n", - "3770 \n", - " Representative histological abnormalities in the inner part of the cortical kidney after three days of cisplatin administration and their partial prevention by FeTPPS. (A) Normal kidney histology from control rat. (B) After three days of cisplatin administration, the straight portion of many cortical tubules are revisted by necrotic cells (arrows). (C) FeTPPS administration does not produce histological abnormalities. (D) The administration of FeTPPS partially prevents the cytotoxic damage induced by cisplatin; arrows indicate tubules with focal necrotic cells.\n", - "3771 \n", - " Nitrotyrosine (3-NT) expression determined by immunohistochemistry in the inner part of the cortical kidney after three days of cisplatin administration and its partial prevention by FeTPPS. (A) There is no 3-NT immunostaining in the kidney of control rat. (B) In contrast, three days after cisplatin administration there is a strong 3-NT expression in the necrotic cells from the straight portion of the proximal convoluted tubules (arrows). (C) FeTPPS administration does not induce 3-NT expression. (D) The administration of FeTPPS strongly decreases 3-NT expression induced by cisplatin-treatment (Cis+FeTPPS group).\n", - "3772 \n", - " Linear representations of bovine chromosome 15 (BTA15) linkage (A), radiation hybrid (RH; B) and integrated linkage/RH maps (C). Named markers are common to both linkage and RH data sets. Tick marks without a marker name represent markers unique to an individual data set. The linkage map was solved with CRIMAP, and the RH map solved using Carthagene diploid RH data. The integrated linkage/RH map was ordered using CarthaGene with backcross linkage data merged by order with RH data.\n", - "3773 \n", - " Comparison of independent bovine chromosome 15 (BTA15) linkage (A) and radiation hybird (RH; B) maps with the integrated BTA15 map. The independent linkage map was solved with CRIMAP, and the independent RH map solved using Carthagene diploid RH data. The integrated linkage/RH map was ordered using CarthaGene with backcross linkage data merged by order with RH data. Tick marks along each axis represent positions of markers on the respective linear map. Symbols indicate the intersection of the maps. Symbols forming a straight line indicate agreement between the maps, while deviations from a straight line indicate inconsistencies between the maps. Syntenic group segments are indicated by shading on the RH map (B).\n", - "3823 \n", - " Inhibin α mRNA expression in monkey testis. Northern blots showing inhibin α mRNA expression in adult monkey testes. Equal amounts of total RNA from two adult males were run on a MOPS-formaldehyde gel. RNA was transferred to a nylon membrane and hybridized consecutively with 32 P-labeled cDNA probes corresponding to 465 bp of exon 2 (A) and 256 bp of exon 1 (B) of monkey inhibin α. Both probes detected transcripts of 1.7 and 4 kb (top two arrows). The exon 1 probe also detected a 0.4 kb transcript (bottom arrow in B). Molecular weight standards (in kb) are shown at the left of each panel. Hybridization patterns were the same in both animals.\n", - "3852 \n", - " plot of zRD of the comparison Exp1D vs Exp1A against zRD of the comparison Exp1C vs Exp1A. Exp1C and Exp1D are synthetic data sets made from the experimental replicates Exp1A and Exp1B (sh100 at t = 0 h). As zRD can be negative, we have plotted positive variations as zRD+2 and negative variations as -zRD-2 to obtain a clear separation of increased and decreased genes. All of the unchanged genes have their zRD set to zero. Red and blue circles mark the genes that received, respectively, an increasing (500 genes) or decreasing (500 genes) additional variation contribution. Black points mark all the genes that did not receive an additional variation contribution. The additional variation p-value was set to 0.30 (A), 0.10 (B), 0.05 (C) and 0.01 (D).\n", - "3853 \n", - " Performance of the scoring procedure. Comparisons were made between two groups of 2, 3 or 5 replicates. The first group is composed of synthetic data sets made from the experimental replicates Wt-t0a and Wt-t0b, in which 200 genes (100 increased and 100 decreased) are changed with different strengths (p <= 0.30(A), 0.10(B), 0.05(C) or 0.01(D)), and the second group is composed of synthetic data sets without extra variation. Ten comparisons with different combinations of data sets were made, and the resulting mean FDR of increased genes is plotted against given values of S (0.05 to 1, by steps of 0.05). Replicates 2, 3 and 5 are, respectively, plotted with blue interrupted, green dotted, and red continuous lines. Lines marked with circles and without circles refer, respectively, to the results of RDAM and SAM. Only one comparison was used for SAM analysis.\n", - "3855 \n", - " Raw SAGE sequence data showing cloning and potential sequencing artifacts excluded by SAGE software. (A) Clone with fragment of E. Coli genomic DNA. Italics denote E. Coli sequence (AE000256). (B) Clone containing a fragment of rodent genomic DNA. Italics denote M. musculus sequence (AI894042). (C) Clone with unidentifiable insert, which lack normal SAGE concatemer. pZErO-1 sequences are underlined; Anchoring enzyme recognition sites (AERS(CATG)) are shown in bold.\n", - "3856 \n", - " Raw SAGE sequence data showing cloning and potential sequencing artifacts not excluded by SAGE software. (A) Clone with fragment of E. Coli genomic DNA. Italics denote E. Coli sequence (AE000307). (B) Clone with unidentifiable insert, which lack normal SAGE concatemer. Sequences like (A-B) represent quasi-ditags that should have been removed. pZErO-1 sequence is underlined; Anchoring enzyme recognition sites (AERS(CATG)) are shown in bold, and potential SAGE tags are shown by dotted underlines.\n", - "3864 \n", - " Hydrolysis of DMF to MMF by various types of blood cells. Monocytes/lymphocytes, granulocytes, and erythrocytes were purified from blood of healthy volunteers using centrifugational techniques. Next, the various cell types were resuspended in PBS pH 7.4 to concentrations present in whole blood, e.g. 1 × 106/mL monocytes/lymphocytes (A), 5 × 106/mL granulocytes (B) and 5 × 109/mL erythrocytes (C), and then DMF was added to a final concentration of 2 mg/L. At various intervals thereafter samples were collected and the MMF (squares) and DMF (circles) concentrations were measured using HPLC. Results are a representative experiment of 3–4 independent experiments.\n", - "3896 \n", - " Flow cytometry analysis. Flow cytometry analysis of MAbs VG-IgG2κ, VG-IgM, and X4 reactivity against the CEA-expressing CO115-5F12 human colon carcinoma cell line (A) and NCA-expressing human granulocytes (B). 12A11 and 16B10 are two human anti-CEA MAbs that cross-react with NCA. 192 is a murine anti-CEA MAb that cross-reacts with NCA. Binding of the different primary antibodies was detected using either anti-human κ chain, anti-human μ chain, or anti-mouse γ chain as indicated.\n", - "3916 \n", - " Effect of indomethacin and PACs on carrageenin-induced pleurisy. At 4 h after carrageenin injection, the volume of the exudate (A) was reduced by PACs (10, 30, 60 and 100 mg/kg) and indomethacin (10 mg/kg) administration. The accumulation of polymorphonuclear cells (PMNs, B) in the pleural cavity was inhibited by all tested drugs. Each value is the mean ± s.e. mean of n = 6 experiments. °P < 0.05 versus sham. *P < 0.05 versus carrageenin.\n", - "3919 \n", - " Effect of PACs on lung injury. When compared to lung sections taken from control animals (A), lung sections from carrageenin-treated rats (B) demonstrated interstitial haemorrhage and polymorphonuclear leukocyte accumulation. Lung sections from a carrageenin-treated rat that had received PACs (30 mg/kg) (C) or indomethacin (10 mg/kg) (D) exhibited reduced interstitial haemorraghe and a lesser cellular infiltration. Original magnification: × 125.\n", - "3931 \n", - " XCEP2 Nucleic Acid and Amino Acid Sequences. (A) The nucleic acid sequence of the XCEP2A cDNA is shown. Sequences encoding the start methionine (green), the stop codon (red) are indicated. The protein coding region is shown in blue. (B) Amino acid sequences of the two Xenopus pseudoalleles of CEP2, along with the mammalian (human) sequence, are shown. Asterisks indicate highly conserved residues within the CRIB domain (black asterisks, lines), the CI domain (red asterisks, lines) and the CII domain (blue asterisks, lines) in the CEP-2 protein. Dark gray shading indicate residues conserved in all three species; light gray areas indicate residues that are conserved between two of the three species listed. Vertically oriented pairs of dots (:) indicate positions where amino acid identity is conserved in all three sequences.\n", - "3933 \n", - " Spatial Localization of XCEP2 mRNA. (A) Animal pole view in situ hybridization of embryos fixed at late blastula stage with digoxygenin-labeled antisense XCEP2A antisense probe exhibit diffuse staining across the animal region of the embryo (right). An XCEP2A sense probe served as a negative control, and showed minimal background staining (left). (B) A blastula stage embryo, cut to reveal a cross-section, reveals the animal/vegetal gradient of antisense XCEP2 probe. The blastocoel cavity is visible in the upper portion of this embryo. (C) A side view of an antisense XCEP2A probed embryo, revealing an animal (top) to vegetal (bottom) gradient of staining.\n", - "3934 \n", - " Effects of antisense XCEP2 morpholino oligonucleotide on gastrulation. (A) Injected embryos received 100 ng of morpholino, delivered to the animal region of 1-cell embryos. Typical gastrula stage embryos for each of three experimental conditions (non-injected, control morpholino and MO1 antisense injected) are shown. (B) The distribution of blastopore-to-embryo diameter ratios for each experimental condition. 18–20 embryos were assessed for each condition. In the combined \"MO1+MO2\" condition, 50 ng of each morpholino were co-injected. (C) Average blastopore to embryo diameter ratios for each of the control and experimental conditions, +/- 1SEM, are shown. (D) Effects of antisense morpholinos on post-neurulation embryonic development are shown. Antisense XCEP2-injected embryos exhibit dose-dependent abnormalities suggestive of gastrulation and/or convergence extension defects. Representative viable embryos, at Stage 26–27, from each control and experimental condition are shown. Several embryos in the MO1 treated groups exhibited varying degrees of spina bifida. Embryonic viability for the water, control morpholino, and the three doses of antisense XCEP2 morpholino (75 ng, 95 ng and 115 ng) were 90%, 90%, 81%, 63%, and 26%, respectively (20–30 embryos injected for each condition).\n", - "3935 \n", - " Antisense XCEP2 morpholino oligonucleotides specifically inhibit translation from XCEP2 mRNA. (A) Schematic diagram indicating mutations (designated by asterisks) in the morpholino target site of XCEP2*-myc mRNA that would be expected to inhibit strong interactions with the antisense XCEP2 morpholino (MO1). (B) 0.7 ng of mRNA encoding myc-tagged XCEP2 (either the normal XCEP2-myc or the mutated XCEP2*-myc) was injected alone or in combination with 80 ng of antisense XCEP2 morpholino oligonucleotide (MO1) into the animal pole of 1-cell embryos. XCEP2 protein was detected in embryo extracts (prepared at stage 8.5–9) by Western Blotting using anti-myc monoclonal antibody 9E10 (upper panels). Equivalency in protein loads in the Western Blot lanes are indicated by the similarity in staining intensity of protein bands in the corresponding SYPRO Ruby-stained gels in the lower panels.\n", - "3936 \n", - " Rescue of the antisense XCEP2 morpholino phenotype by XCEP2 mRNA co-injection. Injected embryos received 100 ng of morpholino oligonuceotide in the animal region of both blastomeres in two-cell stage embryos. MO1 and MO2 oligonucleotides were mixed at a molar ratio of 3:1, respectively. 20–30 embryos were assessed for each condition. (A) The distributions of blastopore to embryo diameters for the indicated experimental conditions are shown. The rescuing XCEP2 mRNA (XCEP*-myc) sequence was altered such that antisense morpholino oligonucleotides would be expected to bind inefficiently. (B) Average blastopore to embryo diameter ratios, +/- 2 SEM, are indicated for each experimental condition.\n", - "3938 \n", - " Effects of antisense XCEP2 Morpholino oligonucleotides on animal cap explant cell adhesion. (A) 100 ng morpholino oligonucleotide MO1 was injected into the animal region of each blastomere of 2-cell stage embryos. Animal cap explants from antisense MO1-injected embryos exhibited a marked loss of integrity (upper right panel) 24 hours after explantation, as compared to animal caps from non-injected or control morpholino injected embryos (upper left panels). Effects of these treatments on whole sibling embryos at Stage 22–23 are shown in the lower panels. In (B), embryos were injected with 75 ng of MO1 antisense morpholino in each blastomere at the 2-cell stage. Animal explants derived from non-injected embryos (left panel), MO1-injected embryos (middle panel), or embryos co-injected with 0.7 ng XCEP2*myc mRNA (right panel) are shown 24 hours after explantation.\n", - "3943 \n", - " MAT Genes Have Different Phylogenetic Histories(A) The genes of the MAT locus can be separated into four distinct groupings based on phylogenetic class, synonymous substitution rate, and nucleotide identity. The C. gattii alleles in each phylogram are encircled in red.(B) The LPD1 gene defines an ancient border of MAT. The 5′ end of the coding region is species-specific, while the 3′ region is mating type-specific. The ancient homeodomain locus is shown in red, and the ancient pheromone/pheromone receptor locus in green. Maximum likelihood trees are shown. Scale bar represents 0.05 substitutions per site. Further details are provided in Figures S2 and S3.\n", - "3953 \n", - " Protein sequence comparison of Drosophila and mouse SOCS. (A) The predicted carboxyl terminal protein sequences of Drosophila (d), mouse (m), and C. elegans (ce) SOCS genes, including the SH2 and SOCS box domains, are aligned and shaded to indicate similarities and identities. (B) Based on the protein alignments, the neighbor-joining method was used to construct a phylogenetic tree of these SOCS.\n", - "3955 \n", - " Socs36E and Socs44A are expressed in different spatio-temporal patterns. The embryonic expression patterns of upd and Socs36E are dynamic from early blastoderm throughout embryogenesis [see 28, 29 and Fig. 3]. Socs44A expression is not detected until very late stages in the trachea (A). Although such staining can be artifactual, sense strand probe never showed any staining (B). In the ovary, upd is expressed specifically in the polar follicle cells at each end of the chamber (C). Socs36E expression encompasses the anterior and posterior follicular epithelium, with highest expression at the poles (D). This is consistent with activation of Socs36E transcription due to reception of the Upd ligand which is secreted from the polar follicle cells and diffuses toward surrounding cells. Socs44A expression is restricted to the germline and only during later stages of oogenesis (E)\n", - "3956 \n", - " Socs44A misexpression reduces JAK signaling in the wing. Wild-type venation (A) is compared with a viable hop mutant, hopmsv/hopM38 (B). hop reduction causes ectopic vein (arrow) near the posterior crossvein. (C) Expression of UAS-Socs36E using the engrailed-GAL4 driver (e16E-GAL) produces a similar ectopic vein phenotype, plus the loss of the anterior crossvein (arrowhead). (D) Similar misexpression of Socs44A causes ectopic wing vein production near the posterior crossvein (arrow) and arching of vein L3 (arrowhead). (E) Reduction of the dosage of hop enhances the Socs44A misexpression phenotype. (F) Misexpression of hop in the posterior compartment causes dramatic vein loss, but that loss is restored by the simultaneous expression of Socs44A (G).\n", - "3957 \n", - " Socs44A increases activity of EGFR signaling. The ectopic wing vein phenotype of Socs44A misexpression (A) is rescued by reduction of Egfr (B), Sos (C) or Ras85D (D), positive effectors of EGFR signaling. In contrast, reduction of argos, a negative regulator of EGFR signaling, enhances the Socs44A misexpression phenotype (E). The argos allele combined with en-GAL have no effect on venation without the UAS-Socs44A transgene (F). Certain heteroallelic Egfr mutants possess a distinct wing vein phenotype, whereby the anterior crossvein and the central portion of L4 is missing (G, arrows). Engrailed-driven misexpression of argos has a similar phenotype (H and J). Concurrent misexpression of Socs44A antagonizes argos misexpression to restore near normal wing venation (I and K). The designation \"2xUAS-argos\" refers to presence of 2 total copies of the transgene in the genome.\n", - "3958 \n", - " Socs44A deficiencies enhance argos misexpression phenotypes. (A) The engrailed-GAL4 driven misexpression of argos produces a range of phenotypes which were classified based on severity. The combination of en-GAL and Df(2)CA53 had no effect on venation. (B) In flies that were also heterozygous for Df(2)CA53, which removes the Socs44A locus, the distribution of phenotypes was significantly shifted to more severe classes as compared to animals heterozygous for Df(2)Drlrv18, an overlapping deficiency that does not remove Socs44A or for Sco, a chromosome wild-type for the 44A region.\n", - "3983 \n", - " Distribution of CNEs along the Human Genome(A) Each CNE is plotted relative to its position along each of human Chromosomes 1 to 9 (data for other chromosomes not shown). The y-axis represents length along the chromosome (in megabases).(B) Distribution of the fraction of CNEs that are within certain distances of each other; e.g., 85% of the distances between CNEs are less than or equal to 370 kb. χ2 tests were carried out by comparing observed cluster sizes with those generated randomly for each chromosome (see Materials and Methods).\n", - "3985 \n", - " Comparative Sequence Analysis of the SOX21 GeneSOX21 genomic regions for mouse, human, and rat were extracted from Ensembl to include all flanking DNA up to the nearest neighbouring genes (ABCC4 and NM_180989 in the human genome and their orthologues in the rodent genomes). The region covering Fugu SOX21 (138–178 kb of Fugu Scaffold_293 [M000293]) was extracted from the Fugu Genome Server at http://fugu.rfcgr.mrc.ac.uk/fugu-bin/clonesearch.(A) MLAGAN alignment of the SOX21 gene using Fugu DNA as the base sequence compared with mouse, rat, and human genomic DNA. Coloured peaks represent regions of sequence conservation above 60% over at least 40 bp. The SOX21 coding region (SOX21 is a single exon gene) is annotated, and sequence identity is shaded in blue. Non-coding regions of sequence identity are shaded in pink. The eight elements that have been functionally assayed are labelled. Six of these are identified in the global analysis as seven CNEs (SOX21_8–10 covers two CNEs). SOX21_7 and SOX21_18 are rCNEs.(B) Multiple DNA sequence alignments of CNE SOX21_1 and CNE SOX21_19 between mouse, rat, human, and Fugu.\n", - "3986 \n", - " MLAGAN Alignments of Regions Encompassing the PAX6, HLXB9, and SHH GenesPAX6 (A), HLXB9 (B), and SHH (C). In each panel, human (top), mouse (middle), and rat (bottom) genomic DNA from Ensembl is aligned with Fugu genomic DNA from orthologous regions. Alignment parameters are the same as in Figure 2. Seventeen elements that have been functionally assayed from these regions have been labelled. The following were identified as CNEs: PAX6_6, PAX6_9–10, KIAA0010_1, and KIAA0010_3.\n", - "3987 \n", - " Composite Overviews of GFP Expression Patterns Induced by Different Elements Tested in the Functional AssayCumulative GFP expression data, from SOX21-associated elements (A), PAX6-associated elements (B), HLXB9-associated elements (C), and SHH-associated elements (D). Cumulative data pooled from multiple embryos per element on day 2 of development (approximately 26–33 hpf) are displayed schematically overlayed on camera lucida drawings of a 31-hpf zebrafish embryo. Categories of cell type are colour-coded: key is at bottom of figure. Bar graphs encompass the same dataset as the schematics and use the same colour code for tissue types. Bar graphs display the percentage of GFP-expressing embryos that show expression in each tissue category for a given element. The total number of expressing embryos analysed per element is displayed in the top left corner of each graph. Legend for the bar graph columns accompanies the bottom graph in each panel; “blood+” refers to circulating blood cells plus blood island region, “heart+” refers to heart and pericardial region (Please note: Some cells categorised as heart/pericardial region may be circulating blood cells), and “skin” refers to cells of the epidermis or EVL. s. cord, spinal cord.\n", - "3988 \n", - " Different Elements Enhance GFP Expression in Specific Tissue and Cell TypesGFP expression is shown in fixed tissue following wholemount anti-GFP immunostaining, bright-field views (A–D, F, J, K, and N), or in live embryos as GFP fluorescence, merged bright-field and fluorescent views (E, G–I, L, M, and O). Lateral views, anterior to the left, dorsal to the top (A, B, and D–O) or dorsal view, anterior to the top (C). Embryos approximately 28–33 hpf (A, D–I, L, and O), approximately 48 hpf (B, C, J, K, and N), or approximately 26 hpf (M). The identity of the element co-injected with the GFP reporter construct is shown at the bottom of each panel. Black arrows indicate the approximate position of the midbrain–hindbrain boundary; black and white arrowheads indicate GFP-expressing cells.Scale bars approximately 100 μm (A–E, G–I, and L–O) and 50 μm (F, J, and K).b, blood island; d, diencephalon; e, eye; f, fin fold; hb, hindbrain; l, lens; n, notochord; ov, otic vesicle; r, retina; s, somite; sc, spinal cord; t, telencephalon; te, tectum; y, yolk.(A) SOX21_4. Head region (eyes removed): neurons in the telencephalon and diencephalon are GFP-positive (arrowheads).(B) SOX21_19. Head region: numerous GFP-expressing neurons are visible in the forebrain, midbrain, and hindbrain. Retinal expression is also apparent.(C) SOX21_5–6. Hindbrain region: white arrowheads indicate GFP expression by several cells in the epithelium of the right developing ear (ov). GFP-expressing cells in left deveoping ear are in slightly different focal plane.(D) SOX21_1. Trunk region: two individual notochord cells express GFP (arrowheads).(E) PAX6_6. Head region of live embryo: GFP is expressed in several retinal cells.(F) PAX6_9–10. Anterior trunk region (at the level of somites 1–3): three spinal cord neurons with ventrally projecting axons express GFP (arrowheads).(G) PAX6_1. Tail region of live embryo: arrowhead indicates GFP expression in the developing median fin fold.(H) KIAA0010_1. Trunk region, three notochord cells express GFP (arrowheads).(I) KIAA0010_2. Anterior end of embryo: arrowheads point to circulating blood cells expressing GFP.(J) HLXB9_3. Trunk region: GFP-expressing muscle fibres in somite 5 (arrowheads) lie immediately dorsal and ventral to the horizontal myoseptum.(K) HLXB9_3. Trunk region (at the level of somites 13–15): arrowheads mark GFP expression in six cells forming the epidermis or EVL.(L) SHH_6. Whole live embryo: numerous GFP-expressing muscle fibres can be seen in the trunk.(M) SHH_1. Tail region of live embryo: GFP is expressed in a single bipolar neuron near the caudal end of the spinal cord (arrowhead marks cell body).(N) SHH_4. Head region (dorsolateral view): cells labelled with anti-GFP include midbrain and hindbrain neurons and cells in the retina (slightly out of focal plane). Arrowheads indicate cell bodies of hindbrain neurons, from which axons can be seen projecting ventrally.(O) SHH_2. Trunk region of live embryo: GFP-positive cells in the region of the blood islands (caudal to the urogenital opening; arrowheads) show a slightly elongated morphology, suggesting they may be blood vessel precursors rather than blood cells.\n", - "4003 \n", - " Transduction efficiencies in various human lymphoma cell lines (A), primary human lymphoma cells, and CIK cells (B). All cell types were transduced with Ad.Flexi-12 at various MOI as indicated and analyzed for GFP expression 72 h later by FACS analysis (mean ± SEM; n = 3).\n", - "4004 \n", - " IL-2 gene expression analysis in human lymphoma cell lines by using an ELISA assay. (A) Daudi, Raji and LAM53 cells were infected with Ad.IL-2 or Ad.GFP at various MOI (0, 5, 100, 200). 72 h post-infection, IL-2 produced by Ad.IL-2-transduced Raji and Daudi cells at an MOI of 200 averaged 10.6 ng/ml/106 cells and 2.7 ng/ml/106 cells, respectively (mean ± SEM; n = 3). (B) Kinetic analysis of IL-2 production in Raji cells transduced at an MOI of 200 revealed peak secretions between day 2 and 3 and IL-2 was detectable until day 8 post-infection (mean ± SEM; n = 3). All experiments were performed in triplicates.\n", - "4005 \n", - " (A) IL-12 gene expression of Ad.Flexi-12 transduced Raji and Daudi cells revealed 219 ng/ml/106 cells and 15.6 ng/ml/106 cells at 72 h post-infection, respectively (mean ± SEM; n = 3). No expression was detectable in Ad-Flexi-12 transduced LAM53 cells. (B) Peak expression of IL-12 in transduced Raji cells was evident between day 1 and 3, with IL-12 detectable until day 10 post-infection (mean ± SEM; n = 3). All experiments were performed in triplicates.\n", - "4006 \n", - " PBMC were incubated with cytokines (1–1000 pg/ml) either derived from supernatants of transduced Raji cells or recombinant with supernatants from Ad.GFP-transduced Raji cells as controls and assayed for their proliferative activity (mean ± SEM; n = 3). Adenoviral-expressed IL-2 (A) and IL-12 (B) led to dose-dependent increases in proliferation rates of PBMC. No significant difference between the effects of either cytokine was found. The proliferation effect could be blocked by addition of a neutralizing antibody against either cytokine. There was no significant difference between the effects of adenoviral-expressed or recombinant cytokines. MTT assays were performed in triplicates.\n", - "4010 \n", - " Immunohistochemical staining of CA XII (A), CA IX (B), CA II (C), and CA XIII (D) in the mouse endometrium. All the studied CA isozymes show positive immuostaining, although the staining intensity varies between different isozymes. CA XII shows stronger reaction in the deep endometrial glands compared to the surface epithelium. This pattern is inversed with CA II showing high reaction in the surface epithelium. Insert in panel A shows that the CA XII immunostaining is most abundant in the basolateral plasma membrane of the epithelial cells. Insert in panel C demonstrates that CA II immunoreactivity is also closely associated with the plasma membrane. CA IX and XIII show faint immunoreactions in both the surface and glandular epithelia. Arrows = endometrial glands, arrowheads = surface epithelium. Original magnifications: × 400.\n", - "4030 \n", - " A, B, and C. Example of import (A), duplicates (B), and differences (C) reports Import report stores all information regarding genotypes imported into GeneLink. This information includes number of records imported (how many unique individuals, how many markers) as well as the name of the file in which records are stored. The duplicates process checks for duplicate genotypes within a table. A duplicate is defined as records with the same FamInd ID and marker. All duplicate records are reported. If duplicate records have the same two alleles then one record is deleted. If the two duplicate records do not have matching alleles than the user is prompted to select which record to delete. The differences process looks for differences in genotypes compared across tables (independently scored by two researchers). All differences are reported and the user is prompted to resolve each appropriately. The user is given the option to save either record or if either score isn't acceptable then new genotype can be indicated.\n", - "4032 \n", - " A, and B. Marker (A) and individual (B) summaries GeneLink's Marker Summary provides success rates and heterozygosity for individual markers typed in the study. The Marker Summary also provides information regarding when the genotype records for this marker were imported (Import Dates). Marker quality can also be evaluated using the Flags column. Genotypes can be flagged with a T to temporarily blank scores from analyses. This is used for un-resolvable Mendelian inconsistencies. The R flag can be used for replaced DNA samples until the new DNA sample is evaluated. Neither T nor R flagged genotypes are exported. Individual summaries also provide global quality assurance information such as success or flag rates.\n", - "4075 \n", - " Molecules That Cause or Prevent Parkinson's Disease(A) shows a simplified, linear view of the aggregation pathway of α-synuclein (in blue). The monomer of α-synuclein is a natively unfolded protein with several repeats, shown by dark bars on the monomer. The protein has an innate tendency to aggregate with other molecules of α-synuclein, first into oligomers (also known as protofibrils), then into fibrils. It is the fibrillar forms of α-synuclein that are deposited into the classic pathological structures of PD, Lewy bodies. There are several studies that suggest that the oligomeric intermediates are the major toxic species, although this is not certain. (B) shows the recessive mutations associated with parkinsonism and their possible relationships to subcellular targets, either mitochondria (left) or the proteasome (right). Insults to either of these can cause cellular damage and may interact. For example, proteasome inhibitors can cause mitochondrial damage, which can be antagonized by PINK1. Parkin can promote the turnover of proteasomal substrates, and DJ-1 can prevent mitochondrial damage.Quite whether (B) relates to (A) is not clear, but recent results with DJ-1 imply that DJ-1 has chaperone activity towards oligomers of α-synuclein (see text). Although there is much to be done to resolve the order of these events, it is likely that, either alone or in concert, damage to multiple cellular pathways leads to neuronal dysfunction and, eventually, cell death.\n", - "4079 \n", - " Temperature Variation with Latitude(A) Mean and absolute minimum and maximum temperatures across the New World.(B) Mean and absolute range in sea surface temperatures across the Pacific at 165° W.\n", - "4084 \n", - " Biological Diversity in the Northern and Southern HemispheresRegular differences between the northern and southern hemispheres in patterns of diversity show up in various groups such as the birds (A) (Adelie Penguin, Pygoscelis adeliae) and seed plant families (B) (King Protea, Protea cynaroides). North–south differences in life histories are also apparent in a diverse array of groups ranging from seaweeds (C) (Bull Kelp, Durvillaea antarctica) and insects (D) (the sub-Antarctic, flightless tineid moth Pringleophaga marioni) to birds (E) (Cape Sugarbird, Promerops cafer) and mammals (F) (Sloggett's Rat, Otomoys sloggetti, from the high Drakensberg in South Africa). (Photos: [A, C, and F] Brent J. Sinclair; [B and D] Steven L. Chown; [E] Mhairi L. McFarlane)\n", - "4115 \n", - " Distribution of Active Small Molecules and Genes Targeted by RNAi Identified by Penetrance of Binucleate Phenotype and by Phenotypic Classes(A and B) Penetrance of binucleate phenotype for small molecules (A) and RNAi hits (B). (A) For the small molecules, 24% (6/25) were strong (s), 44% (11/25) medium (m), and 32% (8/25) weak (w). (B) For the RNAi hits 6% (13/2114) were strong (s), 20% (43/214) medium (m), and 74% (158/214) weak (w). In a weakly penetrant phenotype, the binucleate level was increased by more than 1.25-fold relative to the two neighboring wells in at least two experiments. In a medium penetrance phenotype, the binucleate level was above 4%, or four times as high as the neighboring wells. In a strongly penetrant phenotype, the binucleate level was above 15%. The average binucleate level in controls was approximately 1%.(C and D) Phenotypic classes for small molecules (C) and genes targeted by dsRNAs (D). (C) For the small molecules, 40% (10/25) were binucleate (b; Figure 2A), 8% (2/25) binucleate with large, diffuse DNA (d; Figure 2B), 28% (7/25) binucleate with low cell count (lc; Figure 2C), and 24% (6/25) binucleate with microtubule extensions (MT; Figure 2D). (D) For the RNAi hits, 51% (109/214) were binucleate (b; Figure 2A), 2% (5/214) binucleate with large, diffuse DNA (d; Figure 2B), 29% (62/214) binucleate with low cell count (lc; Figure 2C), and 12% (25/214) binucleate with microtubule extensions (MT; Figure 2D). In addition, 5% (10/214) were binucleate with low cell count and microtubule extensions, and 1% (3/214) were binucleate with low cell count and large, diffuse DNA.\n", - "4117 \n", - " Phenotypic ClassesThe phenotypic classes are (A) binucleate (CG10522 RNAi) and binucleate with (B) large, diffuse DNA (aurora B RNAi), (C) low cell count (RpS18 RNAi), or (D) microtubule extensions (Act5C RNAi). In (A), (B), and (C), the cytoplasm (tetramethylrhodamine stain) of Kc167 cells is shown in red and DNA in green. In (D), tubulin is shown in red and DNA in green. See Table S2 for full classification.\n", - "4118 \n", - " Kc167 Cells Exposed to dsRNA Targeting Act5C or to Cytochalasin DThe cells were exposed to dsRNA targeting Act5C for 4 d (A) or to cytochalasin D at 5 μM for 48 h (B). Tubulin is shown in red, DNA in green.\n", - "4168 \n", - " Irradiation of germinating wild type spores delays entry into S phase. Germinating spores were irradiated with UV light 3.5 h (A) and 4.5 h (B) (time 0) after inoculation into EMM medium, as described in Materials and Methods. Samples were taken for flow cytometry at the indicated times after treatment. The uppper panels show DNA histograms for the unirradiated control (shaded) and the irradiated cells (bold outline without shading). The lower panels show the quantification of cells with a 1C DNA content. Filled symbols represent the control cells, open symbols represent the irradiated cells.\n", - "4172 \n", - " Cds1, but not Chk1, is required for part of the delay. cds1Δ (A), chk1Δ (B) and chk1Δ cds1Δ (C) spores were irradiated and analysed as described in the legend to Figure 1A.\n", - "4194 \n", - " Influence of diet on body weight in adult EL mice fed the SD (A) or the KD (B). Squares represent the pre-trial period when all mice were fed the SD-UR. Circles and triangles represent the UR-fed and R-fed groups, respectively. Values are expressed as the mean ± SEM (n = 6 mice per group). Arrow indicates initiation of CR.\n", - "4206 \n", - " Morphology and expression of neurotrophins and phenotypic markers in C17.2 NSCs. (A) Undifferentiated cells exhibit a flat and rounded structure after 2 days in culture, as revealed by phase contrast microscopy. (B) After 7 days in culture, differentiating cells appear elongated with processes. Lanes:1–6: GDNF, BDNF, NGF, Nestin, GFAP and β-tubulin III mRNA expression in neural stem cells maintained in 1% calf serum (C,D), 1% fetal bovine serum (E,F), or 10% fetal bovine serum + 5% horse serum (G,H) for 2 or 7 days as indicated. (I) GAPDH mRNA from cells cultured in 1% calf serum, 1% fetal bovine serum (FBS) or 10% FBS + 5% horse serum (HS)-Lanes: 1–3 (2 days), 4–6 (7 days).\n", - "4207 \n", - " Melatonin MT1 receptor mRNA and protein expression in C17.2 NSCs. (A) RT-PCR detection of the MT1 transcript (397 bp) in neural stem cells (NSCs) maintained for 2 days in 1% FBS: lane 2 or 10% FBS + 5%HS: lane 3, but not in 1% calf serum : lane 1. (B) Expression of glyceraldehyde- 3-phosphate dehydrogenase (GAPDH, 237 bp), lanes 1–3. (C) Cells were kept in culture for the number of days indicated and extracted proteins were examined by western analysis. Lane 1: 1 day in 1% FBS; lane 2: 1 day in 10% FBS + 5% HS; lane 3: 3 days in 1% FBS. (D) Cells were grown for 1 week in 10% FBS + 5% HS and then subcultured in 1% FBS for 5 days before western analysis. Molecular weight (kDa) markers are indicated on the left.\n", - "4214 \n", - " Radiological improvement with IFN gamma treatment (ray-x of two patients are shown). Patient 4 (A), left-lung fibroexudative lesions, and (B) complete resolution after IFN gamma treatment. Patient 2 (C), bilateral moderate exudative lesions before IFN gamma treatment, and (D) important improvement of the lesions afterwards.\n", - "4229 \n", - " Schematic representation of Gal4/Vp16-UAS expression vectors (A), comparison of induction levels between transient and transgenic approaches (B-E') and transient Gal4/Vp16 mediated reporter expression in medaka embryos induced by heat-shock (F-K). A; Gal4/Vp16 activator units driven by a 1.5 kb (pCG5.0WCS) or a 600 bp (pCG6.0WCS) heat-shock promoter fragment followed by a SV40 polyadenylation signal are shown on the left. Reporter units are separated from the activator units by the pBSII backbone. YFP (pCG3.0Y) or CFP (pCG5.0WCS/6.0WCS) open reading frames are placed downstream of 4 UAS elements and followed by a SV40 polyadenylation signal. Entire expression cassettes are flanked by the IR/DRs of the SB transposon system. Additionally, I-SceI meganuclease sites flank the expression cassettes of activator vectors. Abbreviations and actual sizes of each vector are given. B-E'; Wild type medaka embryos were injected with pCG5.0WCS and MN and subjected to heat-shock treatment (B, B') or with MN and Gal4/Vp16 mRNA without treatment (C, C'). Similarly, the transgenic activator line pCG6.0WCS/T was injected with Gal4/Vp16 mRNA (D, D') or subjected to heat-shock treatment (E, E'). Anterior is to the top (B-E'). DNA and RNA concentrations are indicated together with the developmental stage and the duration of heat-shock treatment. Microinjection of the activator/reporter plasmid pCG5.0WCS results in activation of CFP according to the distribution of plasmid DNA (B-C'). In contrast, induction of activator and reporter in the transgenic line by mRNA injection or heat-shock treatment results in ubiquitous and entirely uniform expression of CFP (D-E'). F-K: Activator and reporter vectors were injected into one-cell stage medaka embryos. Anterior is to the left (F-K). Developmental stage at heat-shock induction and duration of treatment is indicated. HS treatment of up to 2 hours did not interfere with embryonic development but yielded detectable transgene expression (F-K). CFP (internal reporter) shows the expression pattern of the activator Gal4/Vp16. YFP shows activation of the independent reporter. Co-injection of activator pCG5.0WCS and independent reporter pCG3.0Y (100 ng/μl each) resulted in mosaic activation of reporter gene expression (F-H) only. Co-injection of activator pCG5.0WCS (5 ng/μl) and independent reporter pCG3.0Y (100 ng/μl) with I-SceI resulted in a broad range of different levels of mosaicism. Notably, 16% of co-injected embryos showed highly uniform expression (I-K). Abbreviations: CFP, cyan fluorescent protein; HS, heat-shock; hpf, hours post fertilization; IR/DR, inverted/direct repeats; MN, meganuclease; pA, SV40 polyadenylation signal; pBS, pBluescriptII; st, developmental stage; UAS, upstream activating sequence; zf, zebrafish.\n", - "4230 \n", - " Kinetics of activator and reporter induction (A) and activation of an independent reporter in pCG6.0WCS/T (B-J). A; Transcriptional induction of the activator Gal4/Vp16 and the internal reporter (CFP) in pCG6.0WCS/T was analyzed by RT-PCR. Embryos were heat-shock for 90 seconds at st20/31.5hpf and were allowed to recover for the indicated periods of time. Activator transcripts were detectable already 10 minutes after induction and the levels increased up to 3 hours. Degradation to undetectable levels was complete after 20 hours. Activator dependent transcription of the internal reporter CFP was observed only after 2 hours and levels were still increasing after 25 hours. C-actin was used as an internal control. (B-J); The independent reporter plasmid pCG3.0Y was injected into the transgenic Gal4/Vp16 activator line. Anterior is to the left (B-J). Expressions of both internal and independent reporters were observed in a weak to strong ubiquitous manner (B-J). Occasional higher levels of internal reporter expression were observed in some parts of the embryonic body. These higher levels were paralleled by independent reporter expression (B-D, H-J). Mosaic clones exerting stronger YFP expression reflect locally higher plasmid concentrations (B-J). Abbreviations: h, hours; hpf, hours post fertilization; HS, heat-shock; M, size marker; st, developmental stage.\n", - "4277 \n", - " Colony Morphologies(A) Point-mutant Lac+ colony showing solid blue color (the pale colonies are derived from Lac− cells).(B) lac-amplified colonies showing sectoring caused by the instability of the amplified array. Cells from these colonies grow either into sectored blue colonies or, if they have lost the amplification, into white colonies, a phenotype that we call “unstable.”(C) A sectored colony that is not unstable in that it was found to contain only stable blue and stable white cfu upon retesting.(D) An example of a microcolony of the sort used in this work. The visible colony on the lower edge of the field has a diameter of 1.4 mm (>108 cells).(E and F) Phase contrast (E) and green fluorescence (F) of the same field, showing two of 30 SMR6039 cells fluorescing.\n", - "4281 \n", - " Pol I Is Required for Adaptive Amplification and Not Point MutationStrains were plated on lactose-minimal medium and Lac+ colonies counted daily (see Materials and Methods). The plots are cumulative, showing the mean of 3–4 cultures with one SEM. Strains used: FC40 dinB+ polA+\n", - "fadAB::Tn10Kan, SMR3490 (squares); FC40 dinB+ polA12(Ts)fadAB::Tn10Kan, SMR3491 (diamonds); FC40 dinB10 polA12(Ts)fadAB::Tn10Kan, PJH308 and PJH309 (triangles, inverted triangles); and FC40 dinB10 pol+ fadAB::Tn10Kan, PJH310 (circles). All cultures were grown at 30 °C and the experiments conducted at 37 °C.(A) An example of the effect of polA(Ts) on the yield of lac-amplified colonies, showing a partial requirement for polA at a semi-permissive temperature. (B) and (C) show the effect of the dinB10 mutation on adaptive lac-amplification and point mutation, respectively. The dinB polA(Ts) cells display the decreased lac amplification of the polA mutant (B), and the decreased point mutation characteristic of the dinB mutant (C), demonstrating that the decrease in lac amplification rate does not result from channeling of lac-amplified cells into a point mutation pathway. These data (C) also show that the absence of Pol I increases point mutation (reported previously, Harris 1997) in a completely DinB-dependent manner. This could occur via the absence of Pol I leading to SOS induction (Bates et al. 1989) and more DinB/Pol IV, or via relief of a competition between high-fidelity Pol I and error-prone Pol IV at the replisome. Neither of these ways should affectlac amplification, which is Pol IV–independent, as observed (B).\n", - "4282 \n", - " DNA Amplification Does Not Induce the SOS Response(A) Known lac-amplified and point-mutant (control) derivatives of SMR6039 were grown in liquid M9 medium containing either lactose or glycerol. Mid-logarithmic phase cells were harvested and scored microscopically for GFP fluorescence, using an Olympus BL51 microscope mounted with a mercury lamp UV source and a High Q Endow GFP emission fluorescence filter cube. Some 1,000–2,000 cells from each of 4–10 fields were scored per determination. Error bars indicate one SEM for 8–13 cultures as indicated.(B) Microcolonies were harvested and suspended in 500 μl of buffer, 50 μl of which was spread on LBH X-gal rif solid medium to determine sectoring in resulting colonies. The remainders were concentrated and examined microscopically for GFP fluorescence, counting 60–400 cells per microcolony. These experiments were plated at very low cell density to avoid significant numbers of background Lac− cells being harvested with the microcolonies. Open bars, fraction of stable Lac+ isolates (32 microcolonies); black bars, fraction of sectored isolates (11 microcolonies). The two distributions do not differ (p = 0.8 by Student's t-test). These experiments were repeated, giving similar results.\n", - "4286 \n", - " Individual Proportion of Choices for FA Relative to FD in Treatments “High Intake” and “Low Intake”(A) Effect of intake on choices without decoys. Here, extra food simulates the intake consequences that the two decoys cause when they are present and consumed on 25% of the feeding opportunities (p < 0.01).(B) Results of an experiment with decoys when energetic consequences of the decoys were allowed to take effect (group NC) (p = 0.06).(C) Results of an experiment with decoys, similar to (B), in which the energetic consequences of the decoys were abolished (group C).In (B) and (C), each symbol corresponds to each of the subjects. The dashed lines show the mean values in each of the cases.\n", - "4289 \n", - " A Functional Model of How State Can Affect Partial Preferences(A) Fitness is plotted as a concave function of the organism's state. Exposure to DD leads to a poorer state (SdD) than that reached after exposure to DA (SdA) (see also B). SdD + FD and SdD + FA denote the state reached by subjects under treatment “Low Intake” as a consequence of choosing focal options FD and FA, respectively. Similarly, SdA + FD and SdA + FA represent the state reached by subjects in treatment “High Intake” after choosing FD and FA, respectively.(B) State is assumed to be a growing, linear function of energy intake. DD and DA represent the average intake rates experienced by subjects that include the decoys with the same names in their diet.Although choosing FA is always better than choosing FD, and the difference between the states caused by this choice is the same under either treatment (SdD and SdA), the fitness difference between choosing FA and FD is higher under treatment “Low Intake” (δDD) than “High Intake” (δDA). This should lead to a higher level of preference for FA in the former treatment if choices of the low-yielding option were to be reduced in proportion to their cost.\n", - "4290 \n", - " TrkA/TrkC and PV Immunohistochemistry in DRG and Spinal CordRed represents TrkA, green represents TrkC (and PV in [C]), and yellow represents co-expression.(A) TrkA/TrkC immunostaining in E15 DRG. TrkC-positive neurons normally eliminated in NT-3 KOs are rescued in double KOs.(B) TrkA/TrkC immunostaining at P0 in DRG.(C) PV immunostaining in P0 DRG. Rescued TrkC-positive cells fail to express PV.(D) Ratio of TrkA-immunopositive cells to TrkC-immunopositive cells in E15 and P0 DRGs. Data are presented as percentage of cells with standard deviation. Double KOs always had similar ratios to Bax KOs, and NT-3 KOs had the least amount of TrkC-positive cells, if any.(E) TrkA/TrkC immunostaining in E15 spinal cord. Arrow points to group Ia fibers. Dorsal is up.Scale bar: 50 μm (A–C), 1 mm (E).\n", - "4291 \n", - " Axonal Projections in the Spinal Cord after DiI Labeling of DRG at P0(A) Rescued DRG proprioceptive neurons fail to properly innervate motor neurons in double KOs. Instead, some axons are directed towards the ventral midline; they cross the midline and branch.(B) Schematic drawing of the monosynaptic reflex arc as it normally develops. Small black dots represent NT-3 released centrally by the motor neurons and peripherally by the muscle spindles.(C) High-power magnification of the inset in (A). Arrow points to the midline, and arrowheads point to synaptic bouton-like structures.Scale bar: 1 mm (A), 400 μm (C).\n", - "4292 \n", - " Sensory Axons Labeled with DiI through the DRG at E17(A) DiI-labeled fibers in WT spinal cord. Notice proprioceptive axons extending towards the motor neurons located in the ventral horn of the spinal cord in cross section.(B) Bax null spinal cord.(C) NT-3 null spinal cord. Stained fibers are restricted to the nociceptive axons in the dorsal horn, as evidenced by the complete absence of labeling in the ventral spinal cord.(D) Bax/NT-3 double null spinal cord. Although fibers extend into the ventral spinal cord, they never grow towards the motor neurons, but are directed towards the midline instead.Scale bar: 100 μm.\n", - "4293 \n", - " Muscle Spindles in Gastrocnemius Muscle and TrkA/TrkC Staining in the Tibial Nerve at P0(A) NF-M (red) and S46 (green) immunostaining in cross section of gastrocnemius muscle at P0. There are no muscle spindles detected in double KOs.(B) NF-M (red) and S46 (green) immunostaining in parallel sections of gastrocnemius muscle at P0.(C) NF-M (red) and S46 (green) immunostaining in parallel sections of gastrocnemius muscle at E17. Double null muscles are mostly devoid of muscle spindles, except for one spindle-like structure detected (shown in inset, denoted by the asterisk).(D) Muscle spindles detected by DiI labeling through the DRG. Gastrocnemius muscle is sectioned at 40 μm thickness in parallel plane to the muscle fibers.(E) Muscle spindles detected by TrkC staining in cross section of gastrocnemius muscle at P0.(F) TrkA (red) and TrkC (green) immunostaining in the tibial nerve cross section at P0. TrkC-positive fibers are missing in NT-3 KOs. Red-green overlap (yellow) is due to the thickness of the section and overlapping of red- and green-labeled (TrkA and TrkC) fibers present at different focal depths, rather than co-localization.Arrows indicate muscle spindles.Scale bar: 50 μm (A, B, D), 25 μm (C, E), 75 μm (F).\n", - "4294 \n", - " Chemoattraction of E13 DRG Axons to Local NT-3 Observed by In Vitro Co-Culture Assays(A) WT DRG with NT-3-loaded bead.(B) WT DRG with BSA-loaded bead.(C) Bax null DRG with NT-3-loaded bead.(D) p75 null DRG with NT-3-loaded bead.(E) WT DRG with NT-3-loaded bead and TrkC-Fc in the medium.(F) WT DRG with NT-3 loaded beads placed at increasing distances away from the ganglia (range, 500–1,200 μm).Scale bar: 150 μm (A–E), 350 μm (F).\n", - "4295 \n", - " Chemoattraction Towards NT-3 Beads Placed in E13 Spinal Cord DRG Explant Co-Cultures(A) NT-3 bead placed in the midline of E13 WT spinal cord. Notice axons labeled through the DRGs (circled with black dashed lines) growing towards the bead (circled with white dashed lines) enter the spinal cord at ectopic loci instead of dorsal spinal cord.(B) PBS-loaded bead in E13 spinal cord. All labeled axons extend along the dorsal spinal cord, where they terminate.(C) High-power image of the bead in (A). Notice labeled axons surrounding the bead.(D) High-power image of an NT-3-loaded bead. Notice axons bundled around the bead.(E) High-power image of an NT-3-loaded bead. Notice the axons approaching the bead via the dorsal spinal cord.(F) High-power image of a PBS-loaded bead. No labeled fibers were observed around control beads.(G) Summary of our observations from E13 spinal cord DRG organotypic cultures. In control cultures fibers extend along the dorsal spinal cord, where they normally enter the gray matter at E13. In the presence of an ectopic NT-3 source localized at the midline, these axons grow towards the NT-3 bead. NT-3 also initiates axon growth from the DRGs, entering the spinal cord at ectopic lateral loci, growing towards the bead, surrounding the bead, forming nerve bundles, and branching around it.Scale bar, 175 μm (A and B), 100 μm (C–F).\n", - "4297 \n", - " Comparison of Methylation Measurements Obtained Using MALDI-MS with Those from ESME Analysis of Directly Sequenced Bisulphite PCR Products(A) Comparison of methylation measurements obtained by MALDI-MS (x-axis) with ESME-processed data from sequencing (y-axis). Methylation rates at CpGs from forward and reverse sequencing were binned into ten intervals from zero to one using corresponding MALDI-MS measurements at the same CpGs and in the same tissue samples.(B) Comparison of methylation measurements obtained from ESME-processed data (x-axis) with measurements from MALDI-MS (y-axis). Methylation rates from MALDI are binned as in (A), using the corresponding methylation values from sequencing. Red lines show the means of the binned rates; bars show the standard deviations. The overall correlation of the data is 0.887. Data points that are not around a methylation rate of zero or one are covered by few measurements because of the bimodal distribution of methylation measurements.\n", - "4298 \n", - " The HEP Database(A) We have created a Web-based, ENSEMBL-like genome browser for displaying HEP data that is publicly available at http://www.epigenome.org. The methylation levels calculated by the ESME software are displayed in the form of a matrix. Each matrix contains the data obtained from all the samples of one amplicon. Each colour-coded square (yellow represents 0% methylation, blue represents 100% methylation, and green represents intermediate levels) within the matrix represents one CpG site. Clicking on a square reveals the tissue source of the sample and the level of methylation observed at that particular CpG site. Grey squares indicate CpG sites for which methylation levels could not be determined. Each row of squares represents all the CpG sites for one sample of a particular amplicon, and the samples are grouped by tissue type. The red bar indicates the genomic region analysed. Also shown are chromosome coordinates, CpG islands, SNPs, and ENSEMBL and high-quality, manually curated VEGA transcript information. The HEP database links to the Ensembl genome browser, providing additional information about the region of interest. The example shows amplicons within the SynGAP 1 gene that correspond to regions that were determined to be hypomethylated (second amplicon from the left), hypermethylated (first and fifth amplicons), and heterogeneously methylated (fourth amplicon). Insufficient data were obtained for the third amplicon.(B) By using the zoom function, the user can view the complete DNA sequence for the analysed amplicon.\n", - "4299 \n", - " Bimodal Distribution of DNA Methylation within the Human MHC(A) Determined by direct sequencing/ESME analysis (based on 86,374 single CpGs in different tissue samples building the median for measurement repetitions).(B) Determined by MALDI-MS (based on 1,019 MALDI measurements).\n", - "4300 \n", - " Example of METHANE Output Showing Regions That Display Tissue-Specific Methylation ProfilesThe top colour-scale bar refers to the degree of methylation (percent). The bottom colour-scale bar refers to the absolute difference in the methylation level observed between tissues at a given CpG site, and is therefore a measure of the confidence level for a CpG site to be defined as a MVP.(A) The upper matrix represents an amplicon that contains 18 CpG sites within a 386-bp region overlapping exon 3, intron 3, and exon 4 of the complement factor B gene. It is hypomethylated in liver (median methylation is 17%) and hypermethylated in all other tissues examined (median methylation is 100%). The lower matrix shows pairwise comparisons of the methylation values for each CpG site between tissues.(B) The upper matrix represents an amplicon that contains 19 CpG sites within a 550-bp region overlapping exon 3 and intron 3 of the DAXX gene. It is relatively hypomethylated in breast (median methylation is 64%) compared with the other tissues examined (median methylation is 100%). The lower matrix shows pairwise comparisons of the methylation values for each CpG site between tissues.\n", - "4301 \n", - " Example of METHANE Output Showing Regions That Display Inter-Individual Variation of Methylation Profiles(A) Example of a region that displays significant inter-individual variation, especially in prostate. The matrix represents an amplicon that contains 27 CpG sites within a 527-bp region overlapping the last exon of the CYP21A2 gene.(B) Another example of a region that displays significant inter-individual variation. The matrix represents an amplicon that contains 13 CpG sites within a 453-bp region overlapping the 5′ UTR and exon 1 of the tumour necrosis factor gene.\n", - "4302 \n", - " Comparison of Methylation Values Measured in Five Tissues and Eleven Amplicons Using MALDI-MS and ESME Analysis of Directly Sequenced PCR ProductsEach column is a tissue sample, each row a CpG site. Data are ordered in blocks by tissue type and amplicons. Positions of measurements for MALDI-MS (A) correspond to those for ESME analysis (B). The methylation values are colour coded from 0% methylation (yellow) to 100% methylation (blue), with intermediate methylation levels represented by shades of green. White indicates missing measurement values.\n", - "4304 \n", - " \n", - "Lmo Loss-of-Function Mutants Show Increased Sensitivity to Cocaine(A) Cocaine phenotypes of various Lmo mutants. Male flies hemizygous for the indicated Lmo alleles (and their appropriate genetic controls) were exposed to 150 μg of cocaine and tested in the crackometer as described in Materials and Methods. Compared to their control (Ctl-1), EP1383 (p < 0.02) and EP1306 (p < 0.001) flies show significantly increased sensitivity to cocaine. Similarly, compared to their respective controls, pdrm and hdp flies are significantly more sensitive to cocaine (p < 0.001). Asterisks denote significant differences from controls (Student's paired t-test assuming equal variance); n = 20 experiments.(B) Cocaine dose–response. EP1306 flies (filled squares) and pdrm flies (filled circles) and their respective controls were exposed to the indicated doses of cocaine. At each dose, the responses of EP1306 and pdrm flies are significantly higher than their controls (p < 0.001, n = 16–20 experiments).(C) EP1306 flies show alterations in cocaine-induced locomotor patterns of activity. Flies were exposed to 0, 75, or 100 μg of cocaine, as indicated, for 1 min. Representative traces shown correspond to 30 s of recorded activity of about ten flies starting 1 min after the end of cocaine exposure (n ≥ 4). Top panels show response of control flies to indicated amounts of cocaine; bottom panels show activity of EP1306 flies after cocaine administration. Ctl-1 is EP1631, Ctl-2 is P[GAL4] line 8.142, and Ctl-3 is w1118.\n", - "4305 \n", - " \n", - "Lmo Gain-of-Function Bx Alleles Show Reduced Sensitivity to Cocaine(A) Cocaine phenotypes of Bx mutants. Male flies hemizygous for Bx alleles Bx1 or BxJ show significant reductions in sensitivity to cocaine compared to control (Ctl) flies (p < 0.001, n = 12 experiments). Asterisks denote significant differences from control (Student's paired t-test assuming equal variance).(B) Dose–response. BxJ flies (filled circles) show reduced sensitivity compared to Ctl flies (open circles) at all doses tested (p < 0.001, n = 16–20 for all doses except for 250 μg, where p = 0.0015, n = 8). Two additional Bx alleles (Bx2 and Bx3) had similar phenotypes to Bx1 (not shown).(C) BxJ flies show alterations in cocaine-induced locomotor patterns of activity. Flies were exposed to 0, 100, or 125 μg of cocaine, as indicated, for 1 min. Representative traces shown are 30 s of recorded activity of about ten flies starting 30 or 60 s after the end of cocaine exposure (n ≥ 3). Top panels show response of control flies to indicated amounts of cocaine; bottom panels show activity of BxJ flies after cocaine administration. Ctl flies are w1118.\n", - "4306 \n", - " Molecular Structure of the Lmo Locus(A) A genomic map of the Lmo locus. Three different first exons can be utilized, forming the basis for three alternative transcripts. Exon RA-1 is separated from the alternative start sites RB-1 and RC-1 by a large (∼30 kb) intron. EP1306, EP1383, and pdrm carry insertions 25, 73, and 91 bp, respectively, upstream of the exon RA-1 transcriptional start site. Arrows within the EP elements refer to the orientation of the insertion and the expected direction of inducible expression via UAS sites contained within the EP element. Bx alleles are insertions of natural transposons into the 3′ UTR of the Lmo gene that have been shown to stabilize Lmo transcript (Shoresh et al. 1998). Protein-coding exons are shaded.(B) Expression of the Lmo RA transcript is enriched in Drosophila heads, and is reduced in the EP1306 mutant. RNA was isolated from heads and bodies; after cDNA synthesis, quantitative RT-PCR was performed using primers specific to the RA transcript of Lmo in addition to primers to a reference transcript, the ribosomal protein rp49. Relative abundance is expressed as fold increase over control (EP1631) body mRNA. No detectable amplification was seen in RNase-treated controls (data not shown). Error bars represent standard error of the mean. Asterisk denotes significant difference from control (Student's paired t-test assuming equal variance; p < 0.001, n = 3).\n", - "4307 \n", - " \n", - "pdrm's GAL4 Expression Is Sufficient to Drive Lmo-Transgene-Mediated Rescue of Cocaine Sensitivity(A) pdrm's GAL4 expression pattern. UAS-GFP reveals GAL4 expression pattern of the pdrm enhancer-trap insertion in MB lobes and calyces, ALs, the large cell bodies of the peptidergic LNvs, and neurons of the pars intercerebralis (PI).(B) Lmo expression restores wild-type cocaine responses. In the absence of a UAS transgene (“no UAS” columns), hemizygous male pdrm flies (hatched bar) are more sensitive than controls (Ctl GAL4 is line 8.142, solid bar), as shown before in Figure 1A. Male flies hemizygous for pdrm and heterozygous for either of two UAS-Lmo transgenes (UAS-Lmo1 and UAS-Lmo2; hatched black bars), show normal cocaine sensitivity when compared to either UAS-Lmo transgene alone (white bars) or UAS-Lmo transgenes in the presence of a control GAL4 line (Ctl GAL4, line 8.142; black bars). To control for non-specific effects of transgene overexpression, UAS-GFP and UAS-lacZ transgenes were also driven by pdrm GAL4. Male flies were hemizygous for pdrm (or heterozygous for the control GAL4 insertion) and heterozygous for the specific UAS transgene. One-way ANOVA revealed a significant effect of genotype in the UAS-lacZ (F = 17.4, p < 0.001), UAS-GFP (F = 19.47, p < 0.001), or no UAS transgene (F = 4.1, p < 0.001) groups, but not in either of the UAS-Lmo transgene groups (F = 1.58, p = 0.22 and F = 1.21, p = 0.31 for UAS-Lmo1 and UAS-LMO2, respectively); thus, UAS-Lmo expression specifically restores normal cocaine sensitivity to pdrm flies. Post hoc pairwise planned comparisons, with the critical p-value adjusted to 0.025, revealed significant differences between the “non-rescued” pdrm/UAS-GFP flies and the appropriate controls (UAS-GFP/+ or 8.142/UAS-GFP, p < 0.002); similarly, pdrm/UAS-lacZ flies are significantly different from their controls (UAS-lacZ/+ and 8.142/UAS-lacZ, p < 0.002). Pairwise comparisons revealed no significant differences between “rescued” pdrm/UAS-Lmo1 flies and their “normal” controls (8.142/UAS-Lmo1 and UAS-Lmo1/+, p = 0.99 and p = 0.14, respectively) or pdrm/UAS-Lmo2 flies and their controls (8.142/UAS-Lmo2/+ and UAS-Lmo2/+, p = 0.09 and p = 0.99, respectively), indicating full rescue of pdrm cocaine sensitivity. For all genotypes, n = 16–20 experiments.\n", - "4308 \n", - " \n", - "Lmo Expression in PDF Neurons Regulates Cocaine Responses(A) pdf-GAL4-driven expression of Lmo using the EP1306 element rescues the EP1306 insertional phenotype. Lmo mutants EP1306, hdp, and pdrm, as well as a control EP line (Ctl-1 = EP1413), were tested in the absence (−pdf-GAL4; white bars) and presence (+\n", - "pdf-GAL4; black bars) of pdf-GAL4. All male flies are hemizygous for the Lmo mutation (or Ctl-1) and heterozygous for pdf-GAL4 (when carrying the transgene). One-way ANOVAs with post hoc planned comparisons (critical p-value adjusted to 0.0125) confirmed that EP1306, pdrm, and hdp flies (in the absence of pdf-GAL4) had significantly increased sensitivity to cocaine compared to control flies (Ctl-1 = EP1413) (p ≤ 0.003, n = 15–26 experiments). One-way ANOVA with post hoc planned comparisons (critical p-value adjusted to 0.01) revealed a significant difference between pdrm/pdf-GAL4 and hdp/pdf-GAL4 flies and their controls (EP1413/pdf-GAL4, pdf-GAL4/+, or EP1413/+, p < 0.003, n = 24–27 experiments), showing that the presence of pdf-GAL4 does not rescue the cocaine sensitivity of pdrm or hdp flies. In contrast, similar comparisons for “rescued” EP1306/pdf-GAL4 flies revealed no significant differences from their “normal” controls (p ≥ 0.026, n = 27–36). Furthermore, within-group comparisons (+/− pdf-GAL4) using t-tests indicate a significant difference only in the EP1306 group (p = 0.002). Asterisk denotes significant difference between −pdf-GAL4 and +\n", - "pdf-GAL4 phenotype.(B) Flies overexpressing Lmo in PDF cells show decreased sensitivity to cocaine. Flies heterozygous for both pdf-GAL4 and either one of two UAS-Lmo transgenes (black bars) were compared to flies carrying UAS-Lmo (white bars) or pdf-GAL4 (gray bar) alone. One-way ANOVA revealed a significant effect of genotype for both UAS-Lmo transgene groups. Post-test planned comparisons, with the critical p-value adjusted to 0.025, showed significant differences between the pdf-GAL4/UAS-Lmo flies and either pdf-GAL4/+ (p < 0.02) or UAS-Lmo/+ controls (p < 0.005). Asterisks denote significant differences, n = 16 experiments.(C) Confocal images demonstrate overlap between pdrm and PDF expression in the LNvs. In the left panel, UAS-mCD8GFP reveals the pdrm-driven GAL4 expression pattern (green) in the adult brain, and α-PAP staining (magenta) reveals PDF-expressing LNvs. Right panels are close-ups of the cell bodies of the LNvs; white areas correspond to regions of overlap between GFP (green) and PAP (magenta) expression.\n", - "4309 \n", - " Wild-Type Lmo Is Required for Robust Circadian Rhythms of Locomotor ActivityLocomotor activity of control (Ctl-1 and Ctl-2) and Lmo mutant (EP1383, EP1306, hdpR26, and hdprev83) flies was recorded in constant darkness as previously described (Nitabach et al. 2002).(A) Representative actograms of control and Lmo mutants. Control flies show robust circadian rhythms with clear distinctions between activity during the subjective day and inactivity during the subjective night. The pattern of the EP1306 and hdprev83 mutants was more stochastic.(B) Graph showing the proportion of strongly rhythmic (white), weakly rhythmic (gray), and arrhythmic (black) flies for each genotype. Most control flies had strong rhythms (28/30 for Ctl-1 and 27/29 for Ctl-2) while Lmo mutants formed a series with an increasing fraction of the flies arrhythmic. For example, 13/26 hdprev83 flies were arrhythmic, with the other 13 all having weak rhythms. The power of the rhythm was used to estimate the strength of the activity rhythm, with a power of 300 or more classed as a strong rhythm and a power between 300 and 170 classed as a weak rhythm; arrhythmics were given a power of 170 (for analysis below). Between 24 and 30 flies were assayed for each genotype. There were no major differences in the period length of the rhythmic flies in each genotype (Ctl-1, 23.6 ± 0.3; Ctl-2, 23.5 ± 0.5; EP1383, 23.2 ± 0.4; EP1306, 23.4 ± 0.3; hdpR26, 24.2 ± 0.5; and hdprev83, 23.4 ± 0.3).(C) Quantitation of the average power of the rhythm with error bars showing standard error of the mean. One-way ANOVA revealed significant differences between genotypes (p < 0.0001). Post-hoc t-tests using a Bonferroni correction revealed that the power of the rhythm was significantly different between control flies and the Lmo mutants hdpR26, hdprev83, and EP1306 (p < 0.01). EP1383 flies had a significantly weaker rhythm than Ctl-2 flies (p < 0.05). Ctl-1, w1118, is the appropriate genetic control for the hdp alleles (black columns); Ctl-2, EP1631, is the appropriate control for EP1306 and EP1383 (gray columns). All flies tested are in the same genetic background, that of the w1118 flies.(D) Quantitation of average activity (beam crossings per minute) with error bars showing standard error of the mean. ANOVA did not reveal significant differences between genotypes at the 0.01 level. Ctl-1, w1118, is the appropriate genetic control for the hdp alleles (black columns); Ctl-2, EP1631, is the appropriate control for EP1306 and EP1383 (gray columns). All flies tested are in the same genetic background, that of the w1118 flies.\n", - "4310 \n", - " Cocaine Responses Are Not a Circadian Output and pdf Mutants Show Wild-Type Cocaine Sensitivity(A) Cocaine responses do not vary with the circadian clock. Control (EP1631) flies were raised under LD conditions and assayed for cocaine phenotypes in the crackometer at the indicated Zeitgeber (ZT) times. One-way ANOVA revealed no significant effect of time of day (F = 0.53, p = 0.82, n = 32).(B) Flies lacking the neuropeptide PDF (pdf01) display normal cocaine sensitivity. pdf01 homozygotes (pdf01/pdf01) and pdf01 hemizygotes (pdf01/Df) showed wild-type responses to cocaine in the crackometer. Individual pairwise comparisons using Student's t-tests revealed no significant differences between control (+/+ and +/Df) and pdf mutant genotypes (p = 0.69, p = 0.97, n = 6–8 experiments)\n", - "4312 \n", - " A Model for LNv and LMO Regulation of Cocaine Sensitivity(A) In wild type, LNvs modulate locomotor responses via electrical activity and synaptic transmission. We propose a model in which cocaine acts to directly increase LNv activity. Upon cocaine administration, synaptic DA concentrations are increased (via cocaine's inhibition of the plasma membrane DA transporter). Activation of presumed DA receptors on the LNv (dark arrowheads) stimulates electrical activity and subsequent synaptic output. This activity contributes to the behavioral response of the fly to cocaine.(B) LNv ablations eliminate LNv contribution to the cocaine response, reducing cocaine sensitivity.(C) In our model, Lmo loss-of-function mutants (LmoLOF), which have increased cocaine sensitivity, have increased activity/output during the cocaine response. This increased activity may be mediated by increases in receptor content on the LNv or by recruitment of other LNvs that normally do not participate in the cocaine response.(D) Lmo gain-of-function mutants (LmoGOF) mutants have reduced LNv output and reduced cocaine sensitivity. This could also result from a reduction in receptor density.\n", - "4313 \n", - " Experimental Design to Substitute Chromosomes or Chromosomal Regions Derived from Sympatry into an Allopatric Background and Measure Their Effect on Mating DiscriminationF1 male-parent backcrosses (A) allow measurements of whole chromosome effects, while F1 female-parent backcrosses (B) measure specific chromosomal region effects. Curved arrow represents the reciprocal backcross of the one shown.\n", - "4314 \n", - " Mean Square Chromosomal Effects on Mating Discrimination(A) Male-parent backcross 1 shows the effects of substituting chromosomes derived from Mather, California (sympatry), into a background derived from Flagstaff, Arizona (allopatry).(B) Male-parent backcross 2 shows the effects of substituting chromosomes derived from Mt. St. Helena, California (sympatry), into a background derived from Mesa Verde, Colorado (allopatry). *, p < 0.005; **, p < 0.001; ***, p < 0.0001.(C) Combined chromosomal contributions to female mating discrimination. Small bars on the left represent chromosomes (X, 2, 3, and 4), while long bars on the right show the frequency of matings of backcross females with D. persimilis.\n", - "4319 \n", - " Distribution and Location of Integration Sites Relative to Chromosomal Gene Density(A) Distribution of MLV and SIV integration sites relative to gene density within a 1-Mbp window compared to in silico-generated random integration sites. Each bar corresponds to the percentage of integration sites within the corresponding gene density region.(B) Location of MLV and SIV integration sites and gene density on human Chromosome 6. MLV and SIV integrations were aligned to Chromosome 6 (obtained from the UCSC custom annotation track feature) and shown in relation to RefSeq gene density (blue). 73% of the SIV integration events are within the 20-Mbp unique ridge of Chromosome 6, compared to 29% for MLV. Distance between thick black bars is 20 Mbp; centromere is represented by the black circle.\n", - "4332 \n", - " High RE Recognition of Native G209n but Not G209–2M Peptide Correlates with Efficiency in Tumor Cell LysisCTL clones 476.105 and 132.1 were assayed for lysis of T2 cells pulsed with 10-fold dilutions of (A) native or (C) heteroclitc peptide at concentrations ranging from 100 fg/ml to 100 ng/ml. (B) Lysis of Malme-3M melanoma cells by 476.105 and 132.1 CTLs. All assays were performed in triplicate, and each clone was assayed twice. Error bars reflect variation between two separate assays.\n", - "4333 \n", - " Endogenous T-Cell Responses Have Higher RE Than Vaccine-Elicited ResponsesCTL clones representing different tetramer-positive populations in each patient expressing different VB were assayed for lysis of T2 cells pulsed with various dilutions of G209n, G209–2M, M27, or M26 peptides in 51Chromium release cytotoxicity assays as described in Figure 4 legend. A RE score was attributed to each clone equal to the negative log10 of the peptide concentration that resulted in 40% lysis of peptide-pulsed T2 cells.(A and B) RE scores for both (A) MART-specific and (B) gp100-specific clones from all patients were correlated with efficiency in lysing melanoma cells. Correlation coefficients were 0.66 for MART-specific clones and 0.81 for gp100-specific clones.(C–F) Comparison of RE scores for endogenous (patients 461 and 132) and vaccine-induced (patients 517, 520, 422 and 476) responses.(C and D) RE analysis with native peptides (C) M27 and (D) G209n. Mean RE (weighted) for each response is indicated with horizontal bars. Weighted means were based on all clones, not only those assayed, and were estimated by summing the RE of each analyzed clone multiplied by the number of total clones expressing the same VB, in each patient. Weighted means were as follows: patient 517, 5.7; patient 520, 7.0; patient 461, 7.9; patient 422, 9.7; patient 476, 9.9; and patient 132, 11.2. One-tailed T-tests demonstrated that endogenous responses had significantly higher RE than vaccine-induced responses: patient 461 versus patient 517, p = 1.8 × 10−5; patient 461 versus patient 520, p = 1.1 × 10−3; patient 132 versus patient 422, p = 6 × 10−6; and patient 132 versus patient 476, p = 4.3 × 10−4.(E and F) RE analysis with heteroclitic peptides (E) M26 and (F) G209–2M. Weighted means were as follows: patient 517, 10.6; patient 520, 11.1; patient 461, 11.2; patient 422, 10.5; patient 476, 11.6; and patient 132, 11.3.\n", - "4334 \n", - " Melanoma Patient Samples Selected for Analysis of RE for Melanoma Cells(A) Six patients with T cell responses reactive with for M26 or G209–2M tetramers were selected for analysis. PBMCs from each patient were stained with PE-conjugated peptide–MHC tetramers, G209–2M-tet PE or M26-tet PE, and co-stained with anti-CD8 fluorescein isothiocyanate and anti-CD14, -CD19, and -CD4 Cy5PE. The plots shown are gated for CD8+, CD14−, CD19−, and CD4− cells. Tetramer-positive cells are boxed and estimated for percent of total CD8+ cells: patient 422, 2.5%; patient 476, 0.31%; patient 132, 0.22%; patient 517, 0.23%; patient 520, 0.12%, and patient 461, 0.50%.(B) Microcytotoxicity 51Chromium release assay with tetramer-positive cells isolated by FACS from the CD8+ PBMC population from patient 422. Isolated cells were assayed for lysis of T2 cells treated with relevant or irrelevant peptide, or mel526 melanoma cells. Sorted cells were combined with 250 target cells at 13:1 E:T ratios for 4 h, and supernatants were assayed for percent specific release of radiolabel.\n", - "4347 \n", - " Induction of Resistin in Human Macrophages(A) Induction of resistin during human macrophage differentiation ex vivo. Expression of resistin on days 1, 3, and 7 following isolation and culture of human peripheral blood monocytes under macrophage differentiation conditions. Results shown are the mean (± SEM) of three separate experiments with triplicate samples. The ANOVA F statistic for change of resistin mRNA expression during differentiation was 7.06 (p < 0.01). *, p < 0.01 for post hoc t-tests.(B) Resistin mRNA is induced by endotoxin in primary human macrophage cultures. The ANOVA F statistic for change of resistin mRNA expression in response to increasing concentration of LPS (24 h treatment) was 423.57 (p < 0.001). *, p < 0.001 for post hoc t-tests.(C) Resistin protein secretion by human macrophages is induced by endotoxin. The ANOVA F statistic for change of resistin protein secretion in response to increasing concentration of LPS (24 h treatment) was 35.36 (p < 0.001). *, p < 0.001 for post hoc t-tests.For LPS dose response studies, shown in (B) and (C), results (mean ± SEM) of representative experiments, with triplicate samples, are presented. Similar results were obtained in two independent experiments.\n", - "4348 \n", - " Endotoxin Induction of Resistin Occurs after Induction of TNFαPrimary cultures of human macrophages were treated with LPS (1 μg/ml) for various times.(A) Time course of induction of resistin mRNA. The ANOVA F statistic for the change in resistin mRNA over time was 105.45 (p < 0.001).(B) Time course of induction of TNFα mRNA. The ANOVA F statistic was 34.57 (p < 0.001).(C) Time course of secretion of resistin, TNFα, and sTNFR2 into medium. ANOVA F statistics for the effect of LPS on resistin (66.51, p < 0.001), sTNFR2 (12.86, p < 0.001), and TNFα (20.48, p < 0.001) were highly significant. Maximal secreted protein levels were as follows: resistin, 21.9 ng/ml/mg; TNFα, 207.2 ng/ml/mg; and sTNFR2, 39.3 ng/ml/mg. Results of representative experiments with triplicate samples are expressed as mean (± SEM). Similar results were obtained in three independent experiments.\n", - "4349 \n", - " Endotoxin-Induced Cytokines Regulate Resistin Induction(A) TNFα induces production of resistin mRNA by primary human macrophages. The ANOVA F statistic for the effect of increasing TNFα concentrations on resistin was 23.81 (p < 0.001). *, p < 0.001 for post hoc t-tests.(B) TNFα induces resistin protein secretion by primary human macrophages. ANOVA F statistic for the effect of TNFα on resistin was 79.85 (p < 0.001). *, p < 0.005 for post hoc t-tests. Results of representative experiments with triplicate samples are expressed as the mean (± SEM). Similar results were obtained in two independent experiments.(C) LPS (1 μg/ml) induction of resistin is abrogated by antibody neutralization of cytokines (7.5 μg/ml per antibody). ANOVA F statistic for the effect of neutralizing antibodies on resistin was 3.08 (p < 0.05). p-Values for post hoc t-tests versus IgG: *, p < 0.05; **, p < 0.001. Results are expressed as the mean (± SEM) of three separate experiments with triplicate samples.\n", - "4350 \n", - " Inhibition of Resistin Induction by Anti-Inflammatory Insulin Sensitizers(A) Down-regulation of resistin mRNA by rosiglitazone. ANOVA F statistic for the effect Rosiglitazone on resistin expression was 62.52 (p < 0.001). p value for post hoc t-tests, is depicted in the Figure. *p < 0.005 versus control for post hoc t-tests.(B) Down-regulation of resistin protein secretion by human macrophages treated with rosiglitazone. The ANOVA F statistic for the effect of rosiglitazone on resistin protein secretion was 29.44 (p < 0.001). p-Values for post hoc t-tests versus control: *, p < 0.05; **, p < 0.001. Cells were pre-treated with rosiglitazone for 24 h and with LPS (1 μg/ml) and rosiglitazone for an additional 24 h. Results of representative experiments with triplicate samples are expressed as mean (± SEM). Similar results were obtained in three independent experiments.(C) Down-regulation of resistin gene expression by aspirin. The ANOVA F statistic for the effect of aspirin on resistin expression was 61.33 (p < 0.001). p-Values for post hoc t-tests versus no aspirin: *, p < 0.01; **, p < 0.001; ***, p < 0.0001. Cells were pre-treated with aspirin for 2 h and with LPS (1 μ g/ml) and aspirin for an additional 24 h. Results of representative experiments with triplicate samples are expressed as mean (± SEM). Similar results were obtained in two independent experiments.(D) Down-regulation of resistin gene expression by NF-κB inhibitor SN50. *, p < 0.001 versus control peptide by t-test. Cells were pre-treated with SN50 or control peptide at 100 ug/ml for 2 h, and with LPS (1 μg/ml) and SN50 or control peptide for an additional 24 h. Results are the expressed as the mean (± SEM) of two independent experiments performed in triplicate.(E) Induction of resistin by activation of NF-κB. *, p < 0.05 versus control virus by t-test. Cells were infected with adenovirus expressing activated IKK or control virus for 24 h. Results of representative experiments with triplicate samples are expressed as mean (± SEM). Similar results were obtained in two independent experiments.(F) Down-regulation of resistin gene expression by inhibitors of p38 and p42 MAPK. The ANOVA F statistic for the effect of the MAPK inhibitor on resistin expression was 11.54 (p < 0.005). *, p < 0.005 versus control for post hoc t-tests. Cells were pretreated with 50 μM PD98059 or 2.5 μM SB20358 for 2 h and with LPS (1 μg/ml) and PD98059 or SB20358 for an additional 24 h. Results are expressed as the mean (± SEM) of two independent experiments performed in triplicate.\n", - "4351 \n", - " Endotoxin Dramatically Induces Plasma Resistin in Humans(A) Plasma resistin and sTNFR2 levels were measured serially in six healthy volunteers for 24 h before and after intravenous LPS (3 ng/kg) administration. The repeated measures ANOVA F statistics for the effect of LPS on plasma resistin (9.25, p < 0.001) and sTNFR2 (23.65, p < 0.001) were highly significant.\n", - "(B) Mean resistin RNA expression in whole blood cells of healthy volunteers (n = 2) before and after treatment with LPS (3 ng/kg).\n", - "4352 \n", - " Plasma Resistin Levels Correlate with sTNFR2 Levels in Humans with Type 2 Diabetes(A) The correlation (Spearman coefficient rho = 0.38, p < 0.001) of plasma resistin and sTNFR2 levels in 215 humans with type 2 diabetes is presented. The line represents the linear regression fit between log-transformed plasma levels of resistin and sTNFR2.(B) Model to explain hyperresistinemia in mice and humans with obesity despite the species differences in the source of plasma resistin. Circulating inflammatory cytokines TNFα and IL-6 are depicted because of their role in resistin induction in human macrophages and their implied role in insulin resistance. Other cytokines and inflammatory markers may also contribute to insulin resistance and/or resistin induction.\n", - "4369 \n", - " Gel shift analysis using a DIG-labeled 50 bp oligomer (0.8 ng/lane) containing the empA promoter region and putative lux box. Protein extracts were prepared from V. anguillarum M93Sm (left) and NB10 (right) incubated in (A) LB20 or (B) NSSM and added to DIG-labeled DNA. DIG-labeled DNA alone was added to the lane marked with an asterisk (*). Lane 1, 5 μg of protein extract from cells at time 0 h; lane 2, 5 μg protein extract from cells at time 3 h; lane 3, 7.5 μg protein extract from cells at time 3 h; lane 4, 5 μg protein extract from cells at time 3 h plus the unlabeled lux box-empA promoter containing oligomer; and lane 5, 5 μg protein extract from cells at time 3 h plus non-competitive oct2A (from E. coli) unlabeled 39 bp oligomer. The data presented are representative of three replicate experiments.\n", - "4371 \n", - " Induction of protease activity in V. anguillarum NB10 (A) and M93Sm (B) cells incubated in LB20 (●), NSSM (■), 3M (▲) or NSS (▼). Cells were grown for 16 h in LB20 at 27°C, harvested by centrifugation, washed twice in NSS, and resuspended at 2 × 109 CFU/ml in each condition. Samples were taken at the indicated times and cell-free supernatant was tested for protease activity using the azocasein assay. Both of the experiments shown represent a single experiment, although each experiment was repeated at least three times with similar results.\n", - "4372 \n", - " Induction of protease activity in V. anguillarum wild type (circles) and vanT mutant strains (squares). Cells were grown for 16 h in LB20, harvested by centrifugation, washed twice in NSS, and resuspended at 2 × 109 CFU/ml in either LB20 (open symbols) or NSSM (solid symbols). (A) NB10 and vanT mutant, NB02. (B) M93Sm and vanT mutant, M02. Both of the experiments shown represent a single experiment, although each experiment was repeated at least three times with similar results.\n", - "4375 \n", - " Intra (A) and Inter-assay (B) precision evaluation of GRα expression Case 1 was evaluated in both situations. Bars indicate median values of GRα-EU (expression units). Intra-assay CV was 2.1% and 1.9% for case 1 and 2. Inter-assay CV was 6.2% and 7.8% (cases 1 and 3).\n", - "4377 \n", - " Standard-curves for GRα (A) and BCR (B) in a typical experiment. In the upper part of the graph, we show the linear regression analysis equation and coefficient of correlation for log of Jurkat cell equivalents of expression and real-time PCR Ct (cycle-threshold), for each gene.\n", - "4378 \n", - " Cofractionation of Drosophila NuRD homologues in embryonic protein extracts Nuclear protein extracts were prepared from (A) 2–4 h and (B) 0–12 h old embryos, respectively and size-fractionated by FPLC using a Superose 6 column. Proteins from selected fractions were then separated by SDS gel electrophoresis and analysed by Western blotting. (A) During early embryogenesis the long isoform of MBD2/3 (MBD2/3li) cofractionated with MI-2 and MTA-like in fractions 19 to 21 (indicated in red), which correspond to a molecular weight of approx. 1 MDa. The small isoform of MBD2/3 is not expressed at this stage of embryogenesis. (B) During later stages of embryogenesis both isoforms of MBD2/3 cofractionated with MI-2 and MTA-like in fractions 15 to 19 (indicated in red), which correspond to a molecular weight of approx. 2 MDa. The size of marker proteins is shown left and on top, IN indicates input protein.\n", - "4379 \n", - " Interactions between MBD2/3 and NuRD homologues in a GST-pulldown assay (A) Analysis of interactions between radioactively labelled SV40 large T antigen (large T) and a number of control GST fusion proteins under stringent buffer conditions. Significant amounts of SV40 large T were only precipitated by p53. The faint bands seen with some of the other proteins were considered background. (B) GST-MBD2/3 fusion proteins for long and small isoforms (MBD2/3li, MBD2/3si, respectively) efficiently precipitated radioactively labelled MBD2/3 long isoform and p55 (solid arrowhead). Similarly, MI-2 protein could be precipitated by the small GST-MBD2/3 isoform (solid arrowhead). No interaction could be observed between long MBD2/3 or small MBD2/3 isoforms and MTA-like or RPD3 (open arrowheads). (C) A MBD2/3-specific antibody immunoprecipitates p55, but not GAGA factor from embryonic nuclear extracts. No proteins were detectable in control immunoprecipitations with a myc-specific antibody. (D) Size-fractionation of baculovirus-expressed MBD2/3 long isoform and RPD3. Baculovirus-expressed MBD2/3li elutes in fractions that significantly exceed the calculated molecular weight of the protein (36 kDa), thus indicating that MBD2/3li efficiently multimerizes in solution. This effect appeared to be specific for MBD2/3 and was not observed with baculovirus-expressed RPD3 protein (58kDa). The size of marker proteins is shown left and on top, IN indicates input protein.\n", - "4380 \n", - " Interactions between MBD2/3 and NuRD homologues in a yeast two-hybrid assay (A) An MBD2/3 long isoform bait efficiently transactivated reporter gene transcription in yeast expressing p55 or MBD2/3 small isoform prey constructs, respectively. A weaker transactivation could be seen upon expression of a MI-2 prey construct (panel M). An MBD2/3 small isoform bait transactivated reporter gene transcription co-expressing a MI-2 prey also under high-stringent conditions (panel H). No transactivation could be observed with MTA-like or RPD3 preys. N shows growth on non-selective plates, M on medium-stringency plates and H on high-stringency plates. X indicates X-gal staining of colonies grown on non-selective plates. (B and C) Delineation of interaction domains in a yeast two-hybrid assay. The methyl-DNA binding domain (MBD) is highlighted in red, the Drosophila specific domain (DSD) in green and the C-terminal coiled-coil domain (cc) in yellow. (B) The C-terminal region of MBD2/3 interacts with p55. The full-length p55 construct was used as a bait and various deletion mutants of MBD2/3 were used as preys. This identified the region between amino acids 178 and 305 of the MBD2/3 long isoform as the p55 interaction domain. (C) Deletion of the coiled-coil domain abolishes interactions between MBD2/3 small isoform and MI-2 under high stringent conditions.\n", - "4381 \n", - " Analysis of the architecure of NuRD (A) Yeast colonies growing on non-selective plates carrying bait (left panel) and prey (top panel) NuRD and MBD2/3 constructs. (B) Replica plate with high-selective medium. Only yeast colonies with constructs encoding interacting proteins are able to grow. MBD2/3liΔ59-339 represents a truncated MBD2/3li construct that was used to confirm the specificity of the interaction between p55 and MBD2/3. (C) X-Gal staining of yeast colonies to confirm interactions. (D) Schematic illustration of protein-protein interactions in the NuRD complex. Homodimerization of p55 and MBD2/3 are not shown.\n", - "4389 \n", - " The Cholesky AE model. Diagram representing the Cholesky AE model, in which additive genetic (A) effects are shown loading on to the four traits: the unique environment (E) would load similarly\n", - "4406 \n", - " Recombinant Cre fusion proteins. (A) Structures of recombinant Cre fusion proteins. Cre sequences from nucleotide 484 to 1513 (GenBank X03453) were expressed unaltered or incorporated into fusion proteins containing one or more of the following elements: His (MGSSHHHHHHSSLVPRGSH); His6 (MHHHHHH or HHHHHH for N- and C-terminal sequences, respectively); NLS (PKKKRKV); NLS' (PKKKKKV); T7 (MASMTGGQQMG); MTS (AAVLLPVLLAP); TAT (YGRKKRRQRRR) and (KFF)3K (KFFKFFKFFK). The table on the right lists the name, size (number of amino acids), yield following purification from E. coli (mg/L), relative solubility, and in vitro specific activity (units per milligram of enzyme) of each fusion protein. (B). Analysis of purified Cre fusion proteins. Purified Cre fusion proteins were fractionated by SDS-PAGE and stained with Coomassie blue.\n", - "4407 \n", - " Cre-mediated recombination in cultured cells. (A). Structure of the recombination substrate in Tex.loxP.EG cells. The pBABE.lox.stp.EGFP retrovirus contains multiple polyadenylation sequences (stop cassette) flanked by loxP sites such that Cre-mediated recombination activates the expression of an enhanced green fluorescent protein (EGFP) reporter gene. (B). Dose-response of Cre-mediated recombination. Tex.loxp.EG cells were treated for two hours with increasing concentrations of each soluble Cre recombinase; were washed twice with PBS; and after 24 hours in normal growth medium, the percentage of GFP expressing cells was determined by FACS analysis. For clarity, the results obtained using different fusion proteins are plotted in two panels. The Upper Panel shows results for HNC (solid squares), HT7N'C (solid circles), HNCM (open squares), HC (open circles), and Cre (solid triangles). The Lower Panel plots the results for NCH6 (solid squares), H6C (solid circles), and CH6 (solid triangles). (C). Southern blot analysis of Cre-mediated recombination. Tex.loxp.EG cells were treated with 0.5, 1.0, 2.0, and 4.0 μM of HNC, HNCM and Cre proteins as described above, except after 24 hours DNA was extracted, digested with EcoR1 and analyzed by Southern blot analysis. Cre-mediated recombination results in the conversion of the loxP-containing fragment (upper band, U) to the recombination product (lower band, R).\n", - "4408 \n", - " Temperature, serum and cell density effects on Cre-mediated recombination. (A) Transduction of cell-permeant Cre is inhibited at 4°C. Tex.loxp.EG cells were treated for 2 hours with increasing concentrations of the indicated enzymes at 4 or 37°C and the cells were processed and analyzed for Cre-mediated recombination as described in Figure 1. (B) Effect of serum on Cre-mediated recombination. Tex.loxp.EGFP cells were treated for 2 hours with 2 μM HNC or with 5 μM HC in the presence of increasing concentrations of fetal bovine serum (FBS) or normal mouse serum (MS) and analyzed for Cre-mediated recombination as described in Figure 1. The extent of recombination (percent GFP positive cells) was normalized to cells treated in the absence of serum. (B) Effect of cell density on Cre-mediated recombination. Increasing concentrations of Tex.loxp.EGFP cells were treated for 2 hours with 2 μM HNC and were analyzed for Cre-mediated recombination as described in Figure 1.\n", - "4410 \n", - " Uptake of fluorescent Cre fusion proteins. Tex.loxp.EG cells were treated for different lengths of time with the indicated Alexa 488-labeled Cre fusion proteins at 4 or 37°C and protein uptake was monitored by flow cytometry. (A) Kinetics of protein uptake. The mean fluorescence of cells treated with Alexa 488-labeled Cre fusion proteins, as calculated by the CellQuest software, increased with time and was inhibited at 4°C. (B) Representative FACS profiles of cells treated with the fluorescent HC protein. Cells were treated with Alexa 488-labeled HNCM at the indicated temperature for 0 (light gray, solid), 15 (medium gray) and 120 min (black) and analyzed by flow cytometry. Profiles of cells treated for 30 and 60 min. have been omitted for clarity.\n", - "4432 \n", - " Experimental protocols, doses of microorganism and time schedule applied to perform the \"in vivo\" assays: Fig 1a: Administration of L. fermentum (empty arrows) and Ampicillin (A). Fig 1b: Administration of S. pneumoniae (red arrow) and Ampicillin (A). Fig 1c: Administration of L. fermentum, S. pneumoniae and Ampicillin. The days when mice were sacrificed are indicated with black crosses.\n", - "4459 \n", - " Model Schematic(A) shows a simple cartoon of the bacterium and some actin filaments (explicit players) against a backdrop of a moving diffusion–reaction grid attached to the bacterium. We use this spherical coordinate grid, whose origin moves with the bacterium, to keep track of the diffusion and biochemical interactions of the scalar protein concentrations fields that characterize implicit players. Protein size greatly impacts diffusion of proteins in a cellular environment (Luby-Phelps 1994, 2000), so we modify the nominal diffusion coefficients of implicit players accordingly. The dotted line is the path trajectory in 3D space of the bacterium.(B) illustrates the origin of forces that act on a bacterium in our simulation. Actin filament α is bound to an ActA protein on the bacterial surface, generating a link force that acts to hold the two objects together. Filament β is shown colliding with the bacterium, generating a collision force that acts to push the two objects apart. The barbed end of filament γ is nominally too close to bacterial surface to allow addition of an actin monomer, but Brownian motion might bend the filament into the dotted configuration, thus allowing polymerization and creating a collision. We model our filaments as rigid rods, but simulate this filament flexibility with a polymerization probability function that approaches zero with the filament–bacterium gap; i.e., it is possible for a filament to add a monomer even if the nominal filament–bacterium gap is less than 2.7 nm (the filament length increase per actin monomer). The bacterium, actin filaments, and structures of actin filaments are all subject to Brownian simulation forces and torques, represented by δ.\n", - "4462 \n", - " Step-Sizes, Pause Durations, and Speeds of Motion with Different Brownian Simulation Force AttenuationThe legend shows the multiplier by which the Brownian simulation force on the bacterium is attenuated, such that a multiplier of 1 corresponds to a Brownian simulation force appropriate to an unconstrained bacterium and a multiplier of 0 signifies no simulated Brownian motion of the bacterium (see discussion of the relationship between applied Brownian simulation force and numerical time-step in the model description). We line-fit and filter trajectories by slope (speed) to identify pauses in the bacterial motion. Any line with slope less than the pause threshold might indicate a pause. The distance between adjacent pause locations is the step-size, assembled into a histogram in (A). No characteristic step-size is evident; smaller steps are simply more probable than larger ones. We exclude steps shorter than 0.2 nm. (B) shows a pause duration histogram; here we exclude pauses <8 ms in duration. (C) shows run speed histograms for runs >50 ms in duration. For a Brownian multiplier of 1, we used 30 simulations with 56,239 pause events for (A) and (B) and 6,098 runs for (C) (1,929 s total simulation time, 644 s total paused time, 116 nm/s average speed, pause threshold 40 nm/s). For a multiplier of 0.5, we used 13 simulations with 49,207 pause events and 2,287 runs (1,534 s total simulation time, 700 s total paused time, 93 nm/s average speed, pause threshold 30 nm/s). For a multiplier of 0, we used 18 simulations with 9,748 pause events and 1,179 runs (940 s total simulation time, 612 s total paused time, 56 nm/s average speed, pause threshold 20 nm/s).\n", - "4468 \n", - " Calculating an Average System Response(A) shows a segment of simulated bacterial trajectory with five identified pauses shown in red; δt is the pause duration, and δs is the distance along the path to the next pause. To obtain the average response of any system outcome, we align the pauses at their stopping (or starting) points as shown in (B).\n", - "4469 \n", - " Growth of Salmonella in Drosophila melanogaster\n", - "(A) Survival of wild-type flies injected with S. typhimurium. Three sets of 60 flies were injected with approximately 10,000 cfu of SL1344 (Hoiseth and Stocker 1981) from an overnight 37 °C standing culture. Injected flies were incubated at 29 °C. Survival was monitored daily. Circles, S. typhimurium-injected; squares, LB-injected; triangles, uninjected.(B) Survival of immune pathway mutant flies injected with S. typhimurium. Three sets of 20 flies were injected with approximately 100,000 cfu SL1344 and incubated at 29 °C. Fly survival was monitored at 0, 12, and 24 h postinfection. Flies infected: Black, wild-type (Oregon R); gray, imd1/imd1; white,Dif1/Dif1.(C) Salmonella growth in infected immunocompromised flies. Flies were injected with approximately 100,000 cfu SL1344 and incubated at 29 °C for the indicated times. Flies were homogenized in LB with 1% Triton X-100 to release bacteria from cells, and the homogenates were plated on LB-streptomycin plates. Only living flies were homogenized. Flies infected: Black, wild-type; gray, imd1/imd1; white, Dif1/Dif1.(D) Effects of gentamicin on S. typhimurium growth in the fly. Wild-type flies were injected with 10,000 cfu of S. typhimurium and then incubated at 29 °C for 7 d. Flies were then injected with either a solution containing 50 nl of 1 mg/ml gentamicin (black) or water (gray). A second group of previously uninfected flies was preinjected with gentamicin or water 15 min before bacterial challenge to determine the effects of the drug on bacteria before they were phagocytosed. All flies were then incubated after gentamicin or water injection at 29 °C for 4 h. Flies were then homogenized and plated. All error bars show standard deviation.(E) Effects of S. typhimurium inoculation size on bacterial growth in the fly. Flies were injected with SL1344 over a 1,000-fold dilution range. Flies were incubated at 29 °C. Flies were homogenized immediately after injection or following 7 d of incubation before plating. Injected concentrations: Black, 0.1 optical density at 600 nm (OD600); dark gray, 0.01 OD600; light gray, 0.001 OD600; white, 0.0001 OD600.\n", - "4470 \n", - " Location of S. typhimurium in the Fly(A–D) Induction of pmig-1 in Drosophila hemocytes. SL1344 carrying pmig-1 grown standing at 37 °C overnight were dried to a slide, fixed with formaldehyde and photographed using (A) differential intereference contrast (DIC) optics and (B) GFP optics. The bacteria are not highly fluorescent under these conditions. SL1344 carrying pmig-1 and grown as described above were injected into D. melanogaster larvae and the hemocytes were isolated and fixed after 24 h incubation at 29 °C. A hemocyte is shown in (C) DIC and (D) GFP optics using the same exposures as in A and B. Intensely fluorescent bacteria in the hemocytes are visible. Bar equals 5 um.(E–H) S. typhimurium growth in living flies. SL1344 carrying pmig-1 were injected into wild-type flies and incubated for 2 d at 29 °C. (E and F) Uninfected flies are compared to (G and H) infected flies with (E and G) DIC and (F and H) GFP optics. The arrowhead highlights GFP-expressing Salmonella associated with hemocytes on the dorsal side of the fly.\n", - "4471 \n", - " Effects of Salmonella Virulence Mutations on Disease in the Fly(A) Mean time to death for infected flies. Identical quantities of S. typhimurium strains were injected into Oregon R flies and survival was monitored daily (i). Infections with slrP and rescuing construct were performed separately and are thus reported separately (ii).(B) Growth of mutant Salmonella in the fly. Approximately 10,000 cfu of each bacterial strain were injected into flies. Flies were then homogenized and plated at the time of injection (black bars) or following a 7-d incubation (white bars). All error bars show standard deviation.(C–H) Phagocytosis assays in living Drosophila. To assay the effects of Salmonella infections on phagocyte function, flies were injected with approximately 10,000 cfu of each strain of S. typhimurium. Following a 7-d incubation, the flies were first injected with FITC-labeled dead E. coli and incubated for 60 min to permit them to be phagocytosed. Trypan blue was then injected to quench the fluorescence of extracellular bacteria. The area boxed in (C) was photographed using FITC optics (D–H). The flies were injected with the following bacterial strains: (D) SL1344; (E) LB (control); (F) BJ66 (SPI1); (G) P3F4 (SPI2); (H) slrP (Table 1).\n", - "4472 \n", - " Effects of Eiger Mutations on S. typhimurium Infections in the Fly(A) Survival of eiger-mutant flies infected with S. typhimurium. Three sets of 20 flies were infected with 10,000 cfu of SL1344 and incubated at 29 °C. Two eiger mutants (eiger1 and eiger3) and the background strain (w118) were assayed. Survival was monitored daily. Circle, eiger1/eiger1; square, eiger3/eiger3; triangle, w118. Solid shapes indicate LB-injected flies; open shapes indicate SL1344-injected flies. Mantel-Cox analysis demonstrated p < 0.001 when comparing infected wild-type to eiger-mutant flies.(B) Growth of S. typhimurium in eiger-mutant flies. Flies were infected with 10,000 cfu of SL1344 and plated at the time of injection or following a 7-d incubation. Black, time = 0; white, time = 7 d. All error bars show standard deviation.(C) Effects of Salmonella infection on eiger RNA transcript levels. Total RNA was extracted from five flies per sample on days 0, 1, 3, 5, and 7 postinjection with (open circles) SL1344 or (closed squares) LB. Quantitative real-time RT-PCR was performed. Relative eiger transcript quantity is expressed as the fold-difference in comparison to the day 0 value. All error bars show the standard deviation of three RNA preparations.\n", - "4473 \n", - " Different Models of the Interactions between Neanderthals and Modern Humans(A) Model of instantaneous mixing of unsubdivided Neanderthal and modern human populations.(B) Same as (A), but with an exponential growth of the modern human population having started before the admixture with Neanderthals.(C) Model of a progressive range expansion of modern humans into Europe. This model is spatially explicit, and the modern human population occupies a different range than the Neanderthal population before the admixture. Under this model, admixture is progressive and occurs because modern humans move into the territory of Neanderthals, a territory that shrinks with the advance of modern humans.\n", - "4475 \n", - " Expected Proportion of Neanderthal Lineages (in Black) among European Samples under Demographic Scenario A (Table 1) at Different Geographic Locations, for Different Interbreeding Rates(A) One admixture event on average per 50 demes over the whole period of cohabitation between Neanderthals and modern humans; (B) one admixture event per five demes; (C) one admixture event per two demes; (D) one admixture event per deme.\n", - "4477 \n", - " Phylogenetic Tree and Intron Conservation Patterns(A) Phylogenetic tree of the four fungal organisms studied (M. grisea, N. crassa, F. graminearum, and A. nidulans) with estimated time scale in millions of years ago. The rooted organismal tree was constructed using an unweighted pair group method using arithmetic averages based on a concatenated alignment of 2,073 orthologous gene sets. Estimated dates of divergence from Taylor et al. (1999), Berbee and Taylor (2000), and Heckman et al. (2001).(B) Classification of intron presence (+) and absence (−) patterns across the four fungal species. A blue “+” indicates a raw intron gain in the corresponding organism, a red “−” indicates a raw intron loss in the corresponding organism, a green “+” indicates a conserved intron, and all other introns are indicated in black.\n", - "4478 \n", - " Alignment Filtering Protocol(A) Schematic of filtering protocol applied to a ten-residue window on each side of every intron position. If either side failed the filter, the position was discarded.(B) Distributions of minimum percent identity and similarity in ten-residue windows around 181 randomly selected intron positions, for three manual classifications. The minima were taken between the left and right windows. The yellow lines indicate the chosen thresholds of at least 50% similarity and 30% identity, and bars are colored yellow if they fall above the thresholds (pass) or orange if they fall below the thresholds (fail). Parentheses indicate the number of introns in each class that pass the cutoff and the total number of introns in that class. The five lowest-percent identity and similarity bars, containing 77 positions, in the “non-homologous” plot are omitted so as to not obscure the rest of the histogram.\n", - "4479 \n", - " Positional Biases in Intron Gain and LossRelative intron positions were defined as the number of bases in the coding sequence upstream of the intron divided by the total length of the coding sequence. These relative positions were binned into five categories (quintiles), each representing one-fifth of the coding sequence length (quintiles numbered 1–5 on the x-axis).(A) Introns passing quality filter (light blue, back) and introns adjacent to gaps in the protein alignment that were removed by our quality filter (orange, front).(B) Raw and inferred gains. Raw gains (green, back) are those introns present in exactly one organism (excluding the outgroup, A. nidulans). Inferred gains (blue, front) are corrected for the estimated number of cases that arose by other combinations of gain and loss events. Inferred gains are thus slightly lower than raw gains.(C) Raw and inferred losses. Raw losses (green, front) are those introns absent in the organism in question but present in at least one of its siblings (descendants of its parent in the phylogenetic tree) and one of its cousins (non-descendants of its parent). Inferred losses (red, back) are corrected for the estimated number of introns lost along multiple lineages, or gained and then lost. Inferred losses are thus slightly higher than raw losses.(D) Number of introns gained (blue) and lost (red) since last common ancestor (losses shown as negative numbers).(E) Intron loss rate at each position since last common ancestor (introns lost per ancestral intron). Error bars represent binomial standard deviation.\n", - "4480 \n", - " Example Ortholog Alignment(A) Alignment of protein sequences for orthologs MG04228, NCU05623, FG06415, and AN1892 with intron characters inserted. “0,” “1,” and “2” indicate the phase of an intron. A black-edged rectangle indicates an intron position passing our quality filters; an unedged gray rectangle indicates an intron position that was removed by our filter. The green rectangle indicates conserved introns, the blue box marks a raw intron gain, and the gray boxes within black-edged rectangles highlight all other introns. The consensus (bottom) line characters are as follows: asterisk, identical residue in all four sequences; colon, similar residue; and period, neutral residue.(B) Nucleotide alignment of the region flanking the gained intron in (A). Putative 5′ and 3′ splice sites and a branch point sequence are highlighted in blue.\n", - "4481 \n", - " Intron Conservation in the PRPP Synthetase Gene(A) Alignment of PRPP synthetase putative orthologs MG07148, NCU06970, FG09299, and AN1965. A black-edged rectangle indicates an intron position passing our quality filters, whereas an unedged gray rectangle indicates an intron position that was removed by our filter. Blue boxes mark raw intron gains, red boxes indicate raw intron losses, and gray boxes within black-edged rectangles highlight all other introns. We manually corrected an annotation error in the first intron of the last row of the alignment.(B) Phylogenetic conservation pattern of introns in the PRPP sythetase gene. Each passing intron position was categorized as being present in A. nidulans (A), F. graminearum (F), M. grisea (M), N. crassa (N), A. nidulans and N. crassa (AN), F. graminearum and M. grisea (FM), or all four organisms (AFMN). There are no passing cases of conservation in three or four species. The number of introns in each category is shown with a purple line. The black error bar plot shows the mean and standard deviation for each category for all 2,008 ortholog sets after fitting to a Poisson distribution (see Materials and Methods). The number of introns in M. grisea and N. crassa is significantly higher, at the p < 1 × 10−9 level.\n", - "4482 \n", - " Age-Regulated Genes(A) Shown are expression levels for gene CDO1. White and black circles represent expression from cortex and medulla, respectively. The y-axis indicates log2 (expression level), and the x-axis indicates age of patient (years). Dotted and solid lines indicate best fit slopes for the cortex and medulla values, respectively.(B) For every gene, we calculated a one-sided p˜\n", - "-value that its expression changes with age. Shown is a histogram representing all of the genes represented by the Affymetrix DNA chip. Genes that decrease with age have p˜\n", - "-values near zero, and genes that increase with age have p˜\n", - "-values near one. If there were no age-regulated genes (i.e., the true βkj = 0 for every gene j), then the histogram of p˜\n", - "-values would be flat (i.e., have a uniform distribution on the interval from zero to one). The x-axis shows the p˜\n", - "-value, and the y-axis shows the number of genes with that p˜\n", - "-value. There are 985 genes with a p-value less than 0.001.\n", - "\n", - "4483 \n", - " Similar Age-Regulation in Cortex and Medulla(A) For every gene, we calculated a p˜\n", - "-value that there is a Tissuei ×Agei effect, and plotted the results in a histogram. Genes that show different age regulation in the cortex or the medulla would be contained in peaks on the left and right parts of the histogram. The figure shows that the number of genes that have different expression levels in the cortex and medulla is about the same as or less than would be expected by chance. The x-axis shows one-sided p˜\n", - "-values for Tissuei ×Agei, and the y-axis shows the number of genes with that p˜\n", - "-value. There is a systematic under-representation of the edge regions compared to a random sample of uniform random variables because of correlations among the 44,928 p˜\n", - "-values computed from 133 samples.\n", - "(B) To show whether aging in the cortex and the medulla is similar, we selected age-regulated genes in the cortex and calculated the one-tailed p˜\n", - "-value for age effects in the medulla. The histogram shows these selected p˜\n", - "-values. The spike at the right shows genes that increase with age in the medulla. Those genes also increased with age in the cortex.\n", - "(C) Shown is a scatterplot of all 684 genes that are age-regulated in either the medulla or the cortex (p < 0.001). The y-axis is the slope for the medulla of the expression change with respect to age, and the x-axis is the slope for the cortex. The solid line is the least squares line, with a slope of 0.58. The dotted line has a slope of one and passes through the origin.(D) Same as (C) but for 22 genes that are age-regulated in both the cortex and the medulla (p < 0.001).\n", - "4487 \n", - " Chronicity Index of Kidney SamplesHistology from patient 40 is shown on the left, demonstrating a normal glomerulus (G), tubules and interstitial space (T), and arteriole (A), respectively (chronicity score of zero). Histology from patient 62 is shown on the right, demonstrating glomerulosclerosis (g), tubular atrophy and interstitial fibrosis (t), and arterial intimal hyalinosis (a), respectively (chronicity score of ten). Hematoxylin and eosin staining of paraffin-embedded sections.\n", - "4489 \n", - " \n", - "Drosophila Spastin: Sequence Alignment and Gene Map(A) Clustal alignment of complete D. melanogaster and H. sapiens Spastin amino acid sequences and the AAA region of Drosophila Katanin-60. Identical and similar residues are highlighted in dark and light gray, respectively.(B) Map of the Drosophila\n", - "spastin gene, including exons (black boxes) and introns, the position of the T32\n", - "EP insertion (nucleotide 58 of the 5′ UTR), and the regions deleted by imprecise excision in lines 10-12, 17-7, and 5.75. The 3′ end of the adjacent Rox8 gene is also shown. Arrows indicate direction of transcription.(C) Unrooted phylogenetic tree generated by the “neighbor” algorithm, showing relationships between the AAA domains of Spastins and their close relatives in human and fly. Dm CG3326 is the counterpart of the human fidgetin/fidlik gene pair, while CG1193 probably encodes a second fly ortholog of human Katanin-60. In the mouse, fidgetin mutations produce inner ear defects that cause head-shaking and circling behaviors (Cox et al. 2000).\n", - "4490 \n", - " Spastin Protein Localizes to the Cytoplasm(A) In embryo “fillets” in which Spastin overexpression is driven by the engrailed-GAL4 driver, a polyclonal antibody, pAb1239, generated against the C-terminal half of Spastin (aa 380–758) recognizes the characteristic striped pattern of Engrailed cells. Anterior is up; the CNS is the structure in the center, and the lateral epithelial stripes extend to either side.(B) An enlarged view of the CNS shows Spastin protein in these embryos localizing to neuronal cell bodies (arrow indicates the ventral unpaired midline [VUM] neurons), as well as in commissural and longitudinal axons (arrowheads).(C) A high-magnification view of the Spastin-positive epithelial cells shows that the protein fills the cytoplasm (arrow), and is excluded from the nucleus (arrowhead).Scale bar: (A) 25, (B) 10, and (C) 6.5 μm.\n", - "4491 \n", - " Spastin Overexpression in Muscles Erases the Microtubule Network(A) An antibody against β3-tubulin stains body wall muscles and chordotonal cap cells in stage 16 wild-type embryos. Two abdominal hemisegments are shown; muscle fiber numbers are labeled in one. The cap cells (brackets) are difficult to distinguish in this panel because of high levels of muscle tubulin staining. They extend diagonally from about the middle of muscle 18 to muscle 22. Anterior is to the left, and dorsal is up.(B) When Spastin is overexpressed in muscles (genotype: G14-GAL4/+; T32/+), β3-tubulin staining is very weak and has a disorganized pattern in most muscle fibers, but an intact microtubule network is still present in the cap cells, which do not express this driver (brackets). The muscle fibers are misshapen and partially (arrowhead) or completely (arrow) detached from their insertion sites.(C–H) Similarly, the microtubule network (recognized by antibodies to α-tubulin) is almost eliminated by high-level Spastin expression in third instar larval muscles. Larvae of genotype UAS-spastin/MHC-GS-GAL4213-3; spastin5.75/TM3Ser-ActGFP overexpress Spastin protein specifically in muscles to varying degrees. Wild-type larval muscles had undetectable levels of Spastin using pAb 1239 (C) and displayed a dense network of microtubule bundles in the muscle (D and E), as well as in trachea (D, arrow) and neurons (D, arrowhead denotes a terminal arbor). In contrast, larval muscles expressing high levels of Spastin (F) show only faint muscle microtubule staining (G and H), while tracheal (G, arrow) and neuronal (G, arrowhead) staining remain robust.\n", - "4492 \n", - " Neuronal Overexpression of Spastin Causes Midline Convergence of Embryonic CNS Axons(A) Anti-Fasciclin II (mAb 1D4) staining of filleted late stage 16 control embryos reveals three longitudinal axon bundles (arrow) on each side of the midline. Anterior is up.(B) In sca-GAL4/+; T32/+ embryos raised at room temperature, overexpression of Spastin in neurons causes the ladder to constrict toward the midline (e.g., arrow).(C) Increased Spastin expression at 29 °C causes collapse of the CNS onto the midline (arrow). Longitudinal axon tracts are thin or absent (arrowhead).(D) A phenotype similar to that in (C) is produced by sca-GAL4-driven expression of the UAS-spastin cDNA insertion at 23 °C. Arrow and arrowhead indicate same as in (C).\n", - "4494 \n", - " NMJs in spastin Mutant Larvae Display Reduced QC(A) Representative EJP (upper) and mEJP (lower) traces are shown for control (WCS), spastin-null mutant (spastin5.75), and spin-GAL4/UAS-spastin; spastin5.75 (Rescue) larvae. All recordings were from the A3 or A4 muscle 6 NMJ.(B) The average EJP amplitude is decreased by about 20% in spastin-null mutants (37 ± 2.0 mV, n = 26) relative to control (48 ± 2.4 mV, n = 14) and Rescue (42.4 ± 1.2 mV, n = 28) larvae, and is intermediate between control and null levels in hypomorphic spastin5.75/17-7 transheterozygotes (41.9 ± 1.5 mV, n = 22).(C) The average amplitude of spontaneous events (mEJPs) is increased slightly in spastin nulls relative to control and Rescue larvae.(D) The average frequency of spontaneous events is not affected in spastin mutants compared to control. Rescue larvae had a slightly higher mEJP frequency.(E) Average QC, a measure of the amount of neurotransmitter released per action potential, is significantly lower in transheterozygotes (28 ± 1.3) versus control (35 ± 1.7), and reduced even further in spastin nulls (23 ± 1.2). This decrease is completely rescued by spin-GAL4-driven rescue (30 ± 1.9, p = 0.1 compared to WCS).(F) Average QC is temperature dependent in spastin5.75/spastin17-7 transheterozygous larvae, but not in homozygous spastin-null or control larvae. QC measured in transheterozygotes raised at 18 °C (light gray bars) is intermediate between that of control and nulls. At room temperature (dark gray) and 29 °C (black bars), similar QC values are measured in transheterozygotes and null mutants.*, p < 0.05; **, p < 0.005.\n", - "4495 \n", - " \n", - "spastin Mutant Flies Have Compromised Motor Behavior and Reduced Lifespans(A) In a flight test assay, over twice as many adult spastin hypomorphs (spastin10-12 and spastin17-7) fail to fly before falling to the bottom of a cylinder, in comparison to w1118 and T32 homozygous controls.(B) Although fewer than half of the hypomorphs fly, compared to more than 70% of controls, the distribution of collision sites of the fliers along the height of the cylinder parallels that of the controls, suggesting that these spastin mutations affect flying ability in some animals but not in others.(C and D) spastin mutants are compromised in their climbing ability. (C) All control (WCS) and nearly all spastin hypomorphs climb to the top of a vial in 30 s, but only 40% of spastin nulls do so. (D) Climbing velocity (measured for those flies that reach the top in 30 s) is 3.8 ± 0.2 cm/s in WCS (n = 45), but only 1.8 ± 0.2 and 1.4 ± 1.1 cm/s in spastin10-12 (n = 28) and spastin17-7 (n = 38) flies, respectively, and 0.3 ± 0.1 cm/s in spastin5.75 null mutants (n = 17; p < 1 × 10−8 for all relative to WCS).(E) Lifespan curves. The curve inflection point at which WCS and hypomorph flies begin to die off at a rapid rate occurs at 30–35 d after eclosion, and more than 70% of hypomorph flies and 95% of wild-type flies are still alive at 30 d. In contrast, approximately 45% of spastin5.75 null mutant flies die prior to 4 d after eclosion. However, the majority of the remaining null flies survive more than 25 d, so that the curve inflection point for nulls occurs only a few days before that for controls and hypomorphs.(F) Mean lifespan is 46 ± 2.7 d in WCS controls (n = 39) compared to 35 ± 3.2 and 35 ± 3.4 d, respectively, in spastin10-12 (n = 24, p < 0.02) and spastin17-7 (n = 32, p < 0.006), and 7.6 ± 0.6 d in nulls (n = 62, p < 10−31).(G) Only about 10% of spastin5.75 flies eclosing at room temperature are males, while 40%–45% are males for controls and hypomorphs.\n", - "4496 \n", - " The Distribution of Stable NMJ Microtubule Bundles Marked by the MAP1B-like Protein Futsch Is Altered in spastin Mutant Larvae(A–C) Anti-Futsch labels stable microtubule bundles in axons, NMJ boutons, and interbouton regions. The muscle 4 NMJs in segment A3 of third instar wild-type (A), spastin5.75 (B), and spin-GAL4/UAS-spastin; spastin5.75 (Rescue) (C) larvae were immunostained with anti-HRP (A and B) or anti-Syt antibodies (C) to label presynaptic boutons (magenta), and mAb 22C10 to label Futsch protein (A–C, green). Arrows and arrowheads mark the terminal boutons (those at the ends of synaptic branches); boutons marked by arrows in (A–C) are enlarged in insets in the middle and right panels to show examples of Futsch patterns. (A) In control (WCS) larvae, terminal boutons have both looped (arrowheads) and diffuse, punctate (right panel, arrows and inset) patterns of Futsch staining. (B) In spastin mutants, Futsch staining appears similarly strong in axon bundles (not shown) and along the main branches of the bouton arbor. More distal and terminal boutons, however, have diffuse or no Futsch staining (arrows and arrowheads). Note the absence of green staining in insets. (C) The distribution of Futsch staining is restored to the control pattern by spin-GAL4-driven expression of Spastin in the mutant background (arrows and arrowheads indicate loops). Scale bar, 5 μm.(D and E) Quantitative assessment of Futsch staining data. Futsch staining at A2 and A3 muscle 4 NMJs was classified as continuous (bundles or splayed bundles), looped, or diffuse or undetectable (none) for each bouton. (D) The percentage of boutons exhibiting continuous or looped Futsch staining (relative to the total number of boutons for each NMJ) is decreased in spastin mutants relative to controls, while the percentage of boutons having diffuse or no staining is increased. In total, 58% ± 4.2% of boutons in controls have a continuous pattern of Futsch staining, while only 42% ± 1.5% do in mutants. Boutons in this class are predominantly along the major (more proximal) branches of the axon arbor. Similarly, 11% ± 1.7% of wild-type boutons have Futsch loops, but only 6.0% ± 1.1% do in mutants. Most mutant boutons show only diffuse or no Futsch staining (52% ± 2.2%, versus 32% ± 5.2% in controls). Futsch distribution is restored to the control pattern by spin-GAL4- or Elav-GS-GAL4-driven expression of Spastin. (E) The difference in Futsch distribution is most pronounced at terminal boutons. There is no detectable Futsch staining in the majority of terminal boutons (65% ± 4.5%) in spastin mutants, compared to only 7.8% ± 5.8% of terminal boutons in wild-type larvae (p < 2 × 10−6). Futsch staining is restored in most terminal boutons of spin-GAL4- or Elav-GS-GAL4-rescued larvae, with only 20% ± 3.7% and 19% ± 5.9% of boutons, respectively, showing no staining (p = 0.09 compared to WCS). Terminal bouton staining in larvae overexpressing Spastin in neurons was unaffected relative to controls (p = 0.12). **, p < 0.005; *, p < 0.03 relative to WCS;\n", - "n\n", - ">8 NMJs scored in all cases.\n", - "4497 \n", - " The Microtubule Network in NMJ Boutons Is Altered or Absent in spastin Mutant Larvae(A) In wild-type (WCS) larvae, an antibody against α-tubulin (green) reveals the distribution of the network of microtubule bundles within the A3 muscle 4 NMJ bouton arbor. Presynaptic bouton membranes are labeled by anti-HRP antibody (magenta). The microtubule network has a complex structure and extends into the terminal boutons (arrowheads and inset). Many proximal boutons have loops (arrows). Microtubules are also observed outside of the boundaries of the NMJ; these are within the muscle fiber, which also expresses α-tubulin. Staining of these muscle microtubules is minimized by the use of Bouin's fix.(B) In spastin5.75 mutants, the microtubule network is much sparser than in controls, particularly in the distal boutons at the edges of the bouton clumps that are characteristic of spastin mutant NMJs (arrowheads and inset). Many of these distal boutons have little or no detectable α-tubulin staining. More proximal boutons still have tubulin loops, however (arrows).Scale bar, 5 μm.\n", - "4498 \n", - " MNV-1-Specific Staining In Vivo Occurs in Cells of the MΦ LineageImmunohistochemistry was performed on liver (A and B) and spleen (C and D) sections from STAT1−/− mice 2 d after oral infection. MNV-1-specific staining was seen in Kupffer cells of infected livers when probed with MNV-1 immune (A) but not preimmune (B) serum. A selected Kupffer cell lining the sinusoid is indicated by an arrowhead. MNV-1-specific staining consistent with MΦ was seen in red pulp (C) and marginal zone (D) in the spleen. The arrow indicates a cell with MΦ morphology. No staining was observed in tissues from mice infected for 1 d, in infected tissues incubated with preimmune serum, or in mock-infected tissues incubated with immune serum. RP, red pulp; WP, white pulp.\n", - "4499 \n", - " MNV-1 from Brain Homogenate Replicates in Cells of the DC and MΦ Lineage In VitroBMDCs and BMMΦ, as well as MEFs from wt or STAT1−/− mice, and RAW 264.7 cells were infected with a MOI of 0.05.(A) MNV-1 causes CPE in permissive cells. MNV-1- or mock-infected cells were observed by light microscopy 2 d postinfection. The boxed area is magnified further to show the border of the plaque.(B) Infected cell lysates were analyzed in two to four independent experiments by plaque assay at various timepoints postinfection to calculate standard deviations. For wt BMMΦ, MNV-1 growth was detected in two out of four experiments.\n", - "4500 \n", - " Characterization of the Triple Plaque-Purified Strain MNV-1.CW1(A–C) MNV-1.CW1 purified on CsCl density gradients was visualized by (A) negative staining electron microscopy, (C) Coomassie staining, and (B) Western blot analysis with a polyclonal anti-MNV-1-capsid antibody. Molecular weight markers are indicated in kiloDaltons.(D) Specific binding of mAb A6.2 to two different concentrations of CsCl-purified MNV-1 particles in an enzyme-linked immunosorbent assay.(E) Neutralization of MNV-1 from brain homogenate and MNV-1.CW1 by mAb A6.2 but not the isotype control (10H2) mAb in a plaque neutralization assay. The assay was repeated three times to calculate standard deviations. The limit of detection is indicated by the dashed line.(F) Timecourse of viral RNA synthesis in RAW 264.7 cells. Northern blot analysis of viral RNA from cells infected with MNV-1.CW1 (MOI of 2.0) or mock-infected cells. The size of RNA markers in kilobases is shown on the left. The positions of subgenomic- and genomic-length RNA are indicated on the right. This timecourse is a representative of two independent experiments.(G) Timecourse of viral protein synthesis in infected RAW 264.7 cells. MNV-1-specific proteins were precipitated from radiolabeled cell lysates of MNV-1.CW1-infected RAW 264.7 cells (MOI of 2.0) at indicated times after infection. The size of the proteins in kiloDaltons is indicated.\n", - "4501 \n", - " Ultrastructural Studies of MNV-1.CW1-Infected RAW 264.7 CellsCells were infected with MNV-1.CW1 (P3) (MOI of 2.0) (D–L) or mock-infected (A–C) and processed for electron microscopy 12 (D–F), 18 (G–I), or 24 (A–C; J–L) h.p.i. MNV-1 particles are indicated by arrows and confronting membranes by arrowheads. VA, vesiculated areas; Nuc, nucleus; rER, rough endoplasmic reticulum. Scale bars, 200 nm for (A), (D), (G), and (J); 500 nm for (B), (E), (H), and (K); 2 μm for (C), (F), (I), and (L).\n", - "4502 \n", - " Critical Role for STAT-1 in Limiting MNV-1 Growth In Vitro(A) MNV-1.CW1 has no defect in viral growth in vitro. Growth curves (MOI of 0.05) were performed two or three times with MNV-1.CW1 (P3) on indicated cells to calculate standard deviations.(B) MNV-1 growth in MΦ is controlled by STAT-1 and Type I IFNs. BMMΦ of the indicated genotype were infected with MNV-1.CW1 (P3) at the indicated MOI. The experiment was performed twice to calculate standard deviations. The p-values for PKR versus wt infection at MOI 0.05 and 2.0, 0.8867 and 0.1616, respectively, are not significant. Statistical analysis was performed using the paired t-test (GraphPad Prism, version 3.03).\n", - "4503 \n", - " Changes in Virulence of Plaque-Purified MNV-1 over Multiple Passages Are Associated with Limited Amino Acid Changes(A) Serial passage of MNV-1.CW1 in cell culture causes attenuation. STAT1−/− mice were infected orally with the indicated virus dose. The number of mice analyzed is indicated in parentheses.(B) Summary of sequence analysis of MNV-1 over several passages. The nucleotide and amino acid differences between the indicated viruses are shown (for detail see Table 1).\n", - "4516 \n", - " (A) MT mRNA expression in the gastric cancer cell lines. The expression level was determined by RT-PCR assay. β-actin was used as a control for RNA. The cDNA reverse-transcribed from the mRNA was individually amplified with each primer pair for the MT and β-actin genes. Aliquots of each PCR reaction mixture were separated on 7% polyacrylamide gel in TAE. The gel was dried and exposed on X-ray film overnight. (B) The ratio of MT/β-actin of SNU cell lines.\n", - "4523 \n", - " Effect of heptaplatin on MT induction by heavy metals in the SNU-601 cell lines. The SNU-601 cells were treated with 32 μM CdCl2 or 200 μM ZnCl2 in the presence or absence of 200 ng/ml heptaplatin for 24 hr. The MT expression level was determined by (A) the RT-PCR assay and (B) the Western blotting method.\n", - "4524 \n", - " Inhibition of c-Myb DNA-binding by homoribopolymers. Panel A: NR1R2R3 (40 fmol) and R2R3 (20 fmol) in mixture were incubated with 30 fmol MRE-containing DNA probe and 1 ng (lane 4,7,10 and 13), 10 ng (lane 5, 8, 11 and 14) and 100 ng (lane 6, 9, 12 and 15) of homoribopolymers poly(A) (lane 4–6), poly(C) (lane 7–9), poly(G) (lane 10–12) and poly(U) (lane 13–15). The binding reactions were incubated for 15 minutes at 25°C and subsequently analyzed by EMSA and phosphorimaging. Lane 1, 2 and 3 show binding reactions without homoribopolymer addition, with NR1R2R3 alone in lane 1, R2R3 in lane 2 and the mixture of both in lane 3. Panel B: NR1R2R3 and R2R3 were combined in a binding reaction as in panel A, but now in the presence of 1 ng, 10 ng or 100 ng of the ribopolymers poly(G) (lanes 3–5), poly(I) (lanes 6–8), poly(I-C) (lanes 9–11) and 100 ng poly(A) (lane 12), respectively. Lane 1 shows free probe, whereas lane 2 shows binding reaction without ribopolymer addition.\n", - "4527 \n", - " Order-of-addition analysis. A mixture of 40 fmol NR1R2R3 and 20 fmol R2R3 was incubated with 30 fmol MRE-containing DNA probe and 1 ng poly(G) (lane 4–6), 10 ng poly(G) (lane 7–9) and 100 ng poly(A) (lane 10–12). In the cases marked R (for \"RNA first\", lane 4, 7 and 10), the proteins were incubated with homoribopolymers for 15 minutes at 25°C before addition of DNA-probe and further incubation for 15 minutes at 25°C. The cases marked S (for ``simultaneous addition'', lane 5, 8 and 11) represents reactions where homoribopolymers and DNA probe were mixed before addition of protein and 15 minutes of incubation. Finally, the cases marked D (for ``DNA first'', lane 6, 9 and 12) show reactions where the protein were incubated with DNA first and then homoribopolymers were added. The reactions in lane 1–3 contained no homoribopolymers, NR1R2R3 protein alone in lane 1 and R2R3 protein alone in lane 2. The binding reactions were subsequently analyzed by EMSA and phosphorimaging.\n", - "4528 \n", - " Comparison of A-, B- and c-Myb's poly(G) inhibition. A-, B- and c-Myb NR1R2R3 (40 fmol each) were incubated separately with 20 fmol radiolabelled MRE-containing DNA probe, 0.5 ng poly(G) (lane 2),1 ng poly(G) (lane 3), 5 ng poly(G) (lane 4) and 100 ng poly(A) (lane 5). Homoribopolymers and proteins were first incubated for 15 minutes at 25°C. Then the DNA-probe was added to the mixtures and subjected to a new incubation of the same time and temperature. The binding reactions were analyzed by EMSA and autoradiography. The extra incubation step without probe was added to the experimental setup because it enhanced the inhibitory effect (lanes marked R in Fig. 3).\n", - "4531 \n", - " Data selection and query Within the data selection schema (A) users can choose all nodes they want to be included in the query. If a data group consists of two tables, the nodes are represented by vertical arrows for the first table and diagonal arrows for the second. The attribute on which the query display is focused can be selected by the three-banded icons, which switch from black-white to color and vice versa upon selection. Furthermore, trees can be saved and reloaded for subsequent analysis. Upon selection all nodes are listed in a secondary form (B), where query conditions, display and sorting order as well as the implementation of descriptive and advanced statistic can be specified. In addition to the graphical output, the query can be exported as a text of XML file.\n", - "4557 \n", - " Phylogenetic reconstruction of runt domain evolution. Top left: unrooted tree of RD proteins based on the runt domain; X1, X2 and X3 denote the RUNX clades, BfRUNT, FrRUNT, TnRUNT, CiRUNT, OdRUNT, SpRUNT and CeRNT1 represent RUNT proteins from amphioxus, fugu, Tetraodon, Ciona, Oikopleura dioica, sea urchin and C. elegans, respectively, while taxa named Dm- represent D. melanogaster RD proteins. Top right: unrooted tree of first exons of human and fugu runt domain genes. Bottom: expanded species trees for the three RUNX orthologous groups. For all trees, numbers indicate percent bootstrap support; the horizontal bars indicate 10% divergence along each branch. White and gray backgrounds indicate comparisons at the nucleotide and amino acid level, respectively. The dashed branch in the RUNX2 panel represents the position of zebrafish (A) prior to AsaturA analysis. The arrows indicate the change effected by this correction.\n", - "4570 \n", - " Output from SFINX for (A) C. elegans protein C36B1.12 and (B) one of its assigned human orthologs Q8TCT8. The overall membrane topology of the two proteins is very similar. The consensus from the different topology predictors is nine transmembrane (TM) regions, a N-terminal signal peptide, and a >150 amino acids non-cytoplasmic N-terminal region. Conserved aspartic acid residues are marked with an asterisk (residues 433 and 516 for C36B1.12; residues 351 and 412 for Q8TCT8). Phobius is the only program used that predicts both TM regions and N-terminal signal peptides. The other programs are designed to only detect TM regions, and therefore, they commonly mistake the signal peptide for a TM region. Numbers on the horizontal axis indicate amino acid positions. Color coding: black = TM region, white = non-cytoplasmic, gray = cytoplasmic, striped = N-terminal signal peptide predicted by Phobius.\n", - "4571 \n", - " Phylogenetic trees for genes (A) C36B1.12 (Q93346), (B) F40F9.1a (Q8MQ56), F40F9.1b (Q8MQ55) and F40F9.2 (Q20241), (C) sft-4 (Q18864), and (D) ZK721.1 (Q9GYF0). The trees were constructed using PHYLOWIN with neighbor-joining method and PAM distances. 500 bootstrap replicates were run. All gene identifiers are Swiss-Prot accession numbers, except in (D) where XP_148505 is the NCBI accession number. The C. elegans genes studied here are marked with asterisks. F40F9.1 is predicted to have two splice variants; however, the putative proteins have the same length and only differ in the two most C-terminal amino acids. Species abbreviations: Arabidopsis thaliana (AT), Caenorhabditis elegans (CE), Drosophila melanogaster (DM), Fugu rubripes (FR), Homo sapiens (HS), Mus musculus (MM), Oryza sativa (OS), Rattus norvegicus (RN), Saccharomyces cerevisiae (SC), Schizosaccharomyces pombe (SP), Xenopus laevis (XL).\n", - "4572 \n", - " Major tissues of expression for C36B1.12. (A) Fluorescence micrograph of an L4 larvae hermaphrodite carrying a transcriptional fusion between gfp and a putative promoter of C36B1.12 expressed in neurons in the head. (C) Fluorescence micrograph of a young adult hermaphrodite carrying the same construct expressed in intestine. The observed intestinal expression is mostly located to posterior intestinal nuclei and is more prominent in younger worms. (B and D) Corresponding DIC images. Scale bars, 20 μm.\n", - "4573 \n", - " Major tissues of expression for F40F9.1 and F40F9.2. Fluorescence micrographs of an adult hermaphrodite carrying a transcriptional fusion between gfp and a putative promoter of F40F9.1 expressed in (A) neurons and pharyngeal muscle, (C) commissures (c) and the ventral nerve cord (vnc), and (E) body wall muscle (bwm) and hypodermis (h). (G) Fluorescence micrograph of an L4 hermaphrodite carrying a transcriptional fusion between gfp and a putative promoter of F40F9.2 expressed in the excretory system (exc), neurons, and pharyngeal muscle. (B, D, F, and H) Corresponding DIC images. Scale bars, 20 μm.\n", - "4574 \n", - " Major tissues of expression for sft-4. Fluorescence micrographs of an adult hermaphrodite carrying a transcriptional fusion between gfp and a putative promoter of sft-4 expressed in (A) pharyngeal muscle, (C) vulva and (E) intestinal nuclei (i). The intestine shows some unspecific autofluorescence, but there is also specific expression in the intestinal nuclei. Expression in body wall muscle, hypodermis and neurons is not shown. (B, D, and F) Corresponding DIC images. Scale bars, 20 μm.\n", - "4575 \n", - " Major tissues of expression for ZK721.1. Fluorescence micrographs of an adult hermaphrodite carrying a transcriptional fusion between gfp and a putative promoter of ZK721.1 expressed in (A) body wall muscle, (C) hypodermis and (E) gonad. Gene expression in hypodermis is weaker compared to expression in other tissues. Expression in intestine, neurons, pharyngeal muscle, spermatheca, and vulva is not shown. (B, D and F) Corresponding DIC images. Scale bars, 20 μm.\n", - "4576 \n", - " Histogram of standard deviation The X axis is the standard deviation, and the Y axis is the percentage of genes that has standard deviation below the value of X. All data sets were normalized by spatial lowess; (A) Data set A-standard deviation of log ratio of two groups (direct hybridization); data set B-D standard deviation of the difference of log (sample/reference) of the two groups (indirect hybridization); (B) Data sets E-G common standard deviation of (sample/reference) of the two independent groups (indirection hybridization).\n", - "4595 \n", - " Differential leucocyte count. Differential leucocyte counts of peripheral blood of healthy female AKR/J mice did not differ significantly between animals sham-exposed or exposed to 900 MHz electromagnetic fields, although time influenced the ratio of lymphocytes to neutrophilic granulocytes (A) as well as the percentage of monocytes (B) and eosinophilic granulocytes (C). Percentage of basophilic granulocytes was in all cases below 1. 100 cells were counted per slice. Mean ± standard error of the mean, n = 138 (exposed) or 137 (sham-exposed) after 21 weeks of exposure.\n", - "4613 \n", - " LV modification of DC immune functions. (A) Diagram of LV constructs containinging different immune modulatory genes. (B) Up-regulation of T cell costimulators in DCs transduced with LV-CD80 or LV-CD86. Immature DCs were transduced with mock, LV-PLAP, LV-CD80, or LV-CD86 for 12 hr, induced to mature, and analyzed 24 hr later using anti-CD80 and anti-CD86 antibodies. The mean fluorescence intensity and percentage of positive cells are shown. (C) Th1/Th2 assay of DCs with up-regulated CD80 or CD86. The T-cell activation function of DCs was analyzed by DC:T cell co-culture. ICCS and FACS for T helper function were performed 8 days after co-culture. The percentages of different T-cell populations are shown. (D) Th1/Th2 assay of DCs co-transduced with different LV immune modulatory genes. DCs were transduced with LV (LV-PLAP), and co-transduced with LVs encoding different immune modulatory genes, including IL-12, CD40L, IFN-γ, FL, GM-CSF, and ICAM-1, or incubated with soluble IFN-γ. DCs were then treated with TNF-α and LPS and co-cultured with naïve CD4 T cells. The T cells were analyzed for IL-4 and IFN-γ expression by ICCS and FACS 9 days after co-culture. The percentages of different T cell populations are shown in the quadrants. The results are representative of six independent experiments.\n", - "4614 \n", - " Modification of DCs by LV-siRNA targeting IL-10. (A) LV-siRNA targeting IL-10. LV siRNAs targeting two different sites of IL-10 mRNA were illustrated. The predicted hairpin siRNA structure is shown. (B) Illustration of efficient down-regulation of IL-10 in B lymphocytes after LV IL-10 siRNA transduction. Epstein-Barr virus (EBV) transformed B cells were transduced with LV siRNA targeting IL-10 (#1 and #2) or GFP gene. The siRNA LVs also carry a lacZ reporter gene which could be labeled with fluorescein di-b-D-galactopyranoside (FDG) to separate the transduced from un-transduced cells by FACS sort. (C) Immature DCs were transduced with mock, empty LVs, LV-nlacZ, or LV-nlacZ plus LV-siIL-10 #1 or #2, treated with LPS, and analyzed by ICCS and FACS using anti-IL-10 antibody. (D) Enhanced Th1 response by DCs transduced with LV-siRNA targeting IL-10. DCs were transduced with LVs and either co-transduced with LV-siRNA targeting IL-10 (LV-IL10i#2) or GFP (GFPi) or treated with soluble IFN-γ as controls, and the DCs were then assayed for T-cell activation function by DC:T cell co-culture. The T cells were fully rested before reactivation with PMA and ionomycin after 10 days of co-culture. The numbers shown in the FACS quadrants are percentages of the total gated cell population. Results are representative of three independent experiments.\n", - "4620 \n", - " Human Sp8 cDNA sequences encompassing the ORF and translation. (A) Sequence encoding exon 1a encoding the start of Sp8L protein isoform. (B) Sequence encoding the untranslated exon 1b encoding the Sp8S protein isoform. (C) Sequence encoding the common exon 2. The atg/methionine start codon for the long protein isoform is shown in bold and coloured red and that of the short protein isoform coloured pink. The ORF stop codon, tga, is shown in bold and coloured red and is indicated by a red asterisk. An in-frame stop codon, tag, in the 5'UTR of exon 1b is shown in bold and coloured red. The exon/exon boundaries were determined by comparison with the sequence of genomic DNA clone CTA-324D18. The nucleotides underlined and shown in bold type indicate the location of the exon/exon boundaries. The loss of a GGC (glycine) codon found in an additional Sp8 clone is shown in green and bolded.\n", - "4668 \n", - " Plasma levels of Zn and Cu in controls and patients. Bars represent mean (+/-SEM) Zn (A) and Cu (B) plasma levels, and plasma Cu/Zn ratios (C) of urban (U) and endemic (E) controls; and patients with mucosal leishmaniasis (ML), localized cutaneous leishmaniasis before (LCL0) and after 3 months of treatment (LCL3), and visceral leishmaniasis (VL). *p < 0.05, **p < 0.01, ***p < .001 for LCL0 and ML vs. E and for VL vs. U (Mann-Whitney test).\n", - "4684 \n", - " FPCL contraction in response to exogenous TGF-β2. Contracting FPCL cultures (± 1 ng/ml TGF-β2) were analyzed using Image J software to quantify collagen contraction. (A) The plotted data points represent the mean surface area ± SDM for three independent patient-matched primary FPCL cultures. Experiments were repeated in quadruplicate. (B) Cell proliferation/viability assays were performed on contracting FPCL cultures. The plotted bar graph represents the mean cell number ± SDM for the indicated time points for one representative patient-matched disease and control primary culture. Significant differences between groups are indicated by the P-values. The stars denote significance differences (P < 0.05) between the same treatment groups of different time points (white star – Day 1 vs. Day 3, black star – Day 1 vs. Day 5).\n", - "4685 \n", - " Neutralizing anti-TGF-β2 antibodies block TGF-β2 stimulated FPCL contraction. (A) Control and (B) disease FPCL cultures (± 1 ng/ml TGF-β2) were treated with the indicated concentrations of neutralizing anti-TGF-β2 antibodies. FPCL contraction was analyzed and plotted as the mean surface area ± SDM for quadruplicate cultures per treatment.\n", - "4698 \n", - " Expression profiles of sequences across tissues: Hierarchical tree clustering of genes and tissues was carried out using Pearson correlation and the log of the average of the relative expression ratio for each gene, as measured in replicate arrays. Sequences with similar expression patterns across all tissues are clustered together in the resulting trees, the closeness of the sequences in sub trees is a measure of how closely correlated their expression is. (A) Hierarchical tree clustering of genes across 65 normal adult and fetal tissues. 680 sequences were identified that were highly expressed in thymus, unstimulated and stimulated lymph nodes, spleen, peripheral blood mononuclear cells, and in vitro activated T-cells. To increase specificity, 320 sequences were removed because they were also highly expressed in one or more non-lymphoid tissues, as described in the text. The pattern of expression of the remaining 360 \"immune genes\" across tissues is shown. (B) Hierarchical tree clustering of 360 immune genes across 18 normal adult and fetal tissues. There are 3 major groups of tissues that show clusters of highly expressed \"immune genes\" These include the 6 immune tissues, various segments of adult intestine, and fetal day 16.5 lung and intestine. Less prominent clusters are seen in adult lung and liver. Genes in these clusters are described in the text. While the band of high expression extends across all genes for the 6 immune tissues, relative expression of each gene within the immune tissues shows distinct patterning.\n", - "4724 \n", - " Human p53 protein activates transcription from a reporter construct in Saccharomyces cerevisiae. (A) Schematic representation of our yeast reporter construct integrated into our yeast strain. The black circle represents a single p53 responsive element from the human p21 promoter. (B) β-galactosidase assay to measure activation of the lacZ reporter gene. Wild type p53 and the indicated point mutant variants were transformed into the p53 responsive reporter strain and β-galactosidase activity in solution was determined. The activity of wild type p53 was arbitrarily set to 100%. p53R282W and p53V173A showed about 40% of activation compared to wild type p53. No activation of the reporter gene was detected in yeast cells containing the other point mutant variants. Average and standard deviation were determined from three independent experiments. (C) Growth on selective plates containing 20 mM 3-AT depends on expression of the HIS3 reporter gene and correlates with the activation of the lacZ reporter gene. Control plates consist of standard drop-out plates lacking the corresponding growth marker without 3-AT. Growth under selective conditions was dependent on activation of the p53 dependent reporter gene.\n", - "4726 \n", - " Treatment of H1299 lung carcinoma cells with CP-31398 provokes massive cell death and p53 independent decline of luciferase reporter gene activity. (A) H1299 cells were transfected with expression constructs for wild type p53 (lanes 1–3) and p53V173A (lanes 4–6). All the samples were cotransfected with a p53-responsive luciferase reporter (p21 luciferase, containing a single p53 responsive p53 binding site from the human p21 promoter, termed WWP-luc, see material and methods) and a constitutive reference β-galactosidase construct (CMV-lacZ) for normalization. These cells were subsequently incubated with 0, 10, 15 μg/ml CP-31398 respectively and relative luciferase activities were determined. (B) H1299 cells were transfected with an expression construct for the synthetic activator GAL4-VP16. All samples were cotransfected with a gal4p responsive luciferase reporter (UASG luciferase) and a reference β-galactosidase plasmid (CMV-lacZ) for normalization. The control cells were transfected with CMV-lacZ and UASG luciferase only. These cells were subsequently incubated with 0, 10 and 15 μg/ml CP-31398 and relative luciferase activities were determined. The cells were treated with CP-31398 for 16 hours.\n", - "4728 \n", - " Western Blot analysis of HeLa cells treated with CP-31398 and daunorubicin. (A) HeLa cells were treated with increasing concentrations of CP-31398 and protein extracts were subjected to SDS-PAGE and subsequent detection with an anti-p53 antibody (DO-1). (B) HeLa cells were treated with the established p53 inducing agent daunorubicin. Protein extracts were subjected to SDS-PAGE and subsequent detection with an anti-p53 antibody (DO-1). Expression of actin is detected as a loading control in experiments 5A and B.\n", - "4732 \n", - " Comparison of SF-36 scores between adolescents with (A) only hypersensitivity to defined substances, (B) only allergic diseases and (C) both (p < 0.05: BP A > B and C; GH A > C). (Physical dimension: PF, physical functioning; RP, role functioning-physical; BP, bodily pain; GH, general health. Mental dimension: VT, vitality; SF, social functioning; SE, role functioning-emotional; MH, mental health.)\n", - "4739 \n", - " Effect of 9c, 11t, 13c-CLNA on activities of enzymes related to lipid metabolism, (A) G6PDH, ME, FAS (B) CPT, peroxisomal β-oxidation, in the liver of LETO and OLETF rats. Rats were fed a control or 9c, 11t, 13c-CLNA diet for 2 weeks. Values are expressed as mean ± SE for 6 rats. a,bDifferent letters show significant differences at P < 0.05.\n", - "4741 \n", - " Composition of spider silks. (A) Structural motifs occurring within spider silks. X indicates a residue that may vary within or between proteins. The spacer represents non-repetitive but conserved regions that disrupt the glycine-rich repeats. More details on the motifs can be found in the text. (B) The sequenced cDNAs of adf-3 and adf-4 code for the shown amino acid motifs and represent approximately 1/6th of the entire dragline silks. Both comprise a non-repetitive (NR) carboxyl-terminal region and a large repeat unit based on three major peptide motifs as visualized. The amino-terminal region is so far unresolved for any dragline silk. The predicted flagelliform silk protein is organized into non-repetitive (NR) amino-terminal and carboxyl-terminal regions that flank a repetitive region made up of 11 iterations of a repeating unit. Each unit contents approximately 440 amino acids. Three types of sub-repeats are present in an ensemble with the predominant unit being GPGXX.\n", - "4742 \n", - " Cloning strategy for constructing synthetic spider silk genes. (A) Amino acid sequences of designed silk modules were derived from dragline silk proteins ADF-3 and ADF-4 and back translated into nucleotide sequences using the bacterial codon usage. (B) The cloning cassette comprised restriction sites required for module insertion and multimerization. During gene construction a spacer region was replaced by modules and module multimers. The first codon of each module (ggn) determined the \"linking\" amino acid glycine. (C) Single modules were connected resulting in controlled assembly of synthetic genes. To study different length repeat units, one or two Q modules were combined with one A module to obtain (AQ) or (QAQ). These repeat units were multimerized to generate synthetic genes coding for the repetitive proteins (rep-proteins) (AQ)n and (QAQ)n. The repetitive part of ADF-4 is generally composed of a single consensus module termed C, which was multimerized to obtain the rep-protein Cn. Additionally, carboxyl-terminal non-repetitive (NR)-regions from the natural genes were amplified by PCR and optionally linked with the synthetic genes [50].\n", - "4743 \n", - " Morphology of self-assembled fibers of recombinant spider silk proteins. Images of nanofibers of the synthetic protein C16 assembled in vitro (A) and of ADF-4 fibers assembled in insect cells (B) were obtained by atomic force microscopy (AFM). The left images depict the height information, the right images the deflection. The average height of the C16-nanofibers is 2 – 4 nm, the height of the visualized ADF-4 fiber is 0.7 μm.\n", - "4753 \n", - " ISS-ODN-stimulated and OVA-loaded Mφ (ISS-ODN/OVA-Mφ) significantly suppress airway eosinophilia and IL-5 levels in the bronchoalveolar lavage fluid. The number of eosinophils (eo), neutrophils (neutro) and mononuclear cells (MNC) in the BALF (A), and IL-5 levels in the BALF (B) after OVA inhalation challenge. Values are expressed as the mean ± SEM (n = 6 to 8). *P < .01 and †P < .05 compared with sham-treated mice. ‡P < .01 and §P < .05 compared with mice treated with OVA-Mφ.\n", - "4755 \n", - " IL-10 is crucial in the suppression of airway eosinophilia and IL-5 levels in the bronchoalveolar lavage fluid by ISS-ODN-stimulated and OVA-loaded Mφ (ISS-ODN/OVA-Mφ). (A) Number of eosinophils (eo), neutrophils (neutro) and mononuclear cells (MNC) in the BALF after OVA challenge. (B) Levels of IL-5 in the BALF after OVA challenge. Values are expressed as the mean ± SEM (n = 6 to 8 per group). *P < .05 compared with sham-treated mice. †P < .05 compared with mice treated with ISS-ODN/IL10-/-OVA-Mφ.\n", - "4759 \n", - " Characterization of phenotypic properties of cloned RIE-1 cells resistant to reovirus type 1 infection (A) Cells were stained for reovirus antigen as previously described [3]. Only the PI cells contain reovirus antigen as detected by immunohistochemistry (dark wells). Upper wells contain cloned mutant RIE-1 cells from two sets of RIE-1 mutant cell lines selected for reovirus resistance. The lower wells contain PI RIE-1 (left) and uninfected wild type RIE-1 (right). (B) Reovirus susceptible L-cell monolayers, maintained in 1 ml of completed medium, were used to detect the presence of virus in a 100 μl lysate obtained of mutant cells (upper two wells), PI RIE-1 cells (lower left) or uninfected parental RIE-1 cells (lower right). Note, that only L-cell monolayers exposed to a lysate from PI RIE-1 cells lysed within one week of exposure (gentian violet stain).\n", - "4763 \n", - " The XOR Cellular Automaton and Its Implementation by Tile-Based Self-Assembly(A) Left: three time steps of its execution drawn as a space–time history. Cells update synchronously according to XOR by the equation shown. Cells at even time steps are interleaved with those at odd time steps; arrows show propagation of information. Right: the Sierpinski triangle.(B) Translating the space–time history into a tiling. For each possible input pair, we generate a tile T-xy that bears the inputs represented as shapes on the lower half of each side and the output as shapes duplicated on the top half of each side.(C) The four Sierpinski rule tiles, T-00, T-11, T-01, and T-10, represent the four entries of the truth table for XOR: 0 ⊕ 0 = 0, 1 ⊕ 1 = 0, 0 ⊕ 1 = 1, and 1 ⊕ 0 = 1. Lower binding domains on the sides of tiles match input from the layer below; upper binding domains provide output to both neighbors on the layer above. Semicircular domains represent ‘0' and rectangular domains, ‘1'. Tiles that output ‘0' (T-00 and T-11) are gray, and we refer to them as ‘0' tiles. Tiles that output ‘1' (T-01 and T-10) are white and are referred to as ‘1' tiles. Initial conditions for the computation are provided by a nucleating structure (blue). Red asterisks indicate sites on the nucleating structure that bear a ‘1' binding domain; elsewhere, sites have all ‘0' binding domains. Black arrows indicate associations that would form two bonds; red arrows, associations that would form one bond.\n", - "(D) Error-free growth results in the Sierpinski pattern.(E) Error-prone growth from a nucleating structure with three ‘1' domains. Red crosses indicate four mismatch errors.\n", - "4764 \n", - " Typical kTAM Simulation Results(A) A roughly 130 × 70 subregion of an error-free templated crystal.(B) A subregion with 10 mismatch errors (0.1%), shown in red (both false ‘0's and false ‘1's). Grown at Gmc = 17, Gse = 8.8. Large all-zero patches near the template row are due to intact Sierpinski pattern; for simulations with these parameters, asymptotically only approximately 1% of T-00 tiles are in all-zero patches containing more than 90 tiles (referred to as large patches).(C) A subregion from a crystal grown with the T-00 and T-11 tiles at doubled concentration, on a slowly growing nucleating row. Mismatch errors (43 of them, i.e., 0.3%, during growth at Gmc = 17, Gse = 8.6) characteristically terminate the Sierpinski pattern at corners. Asymptotically, approximately 18% of T-00 tiles are in large patches.(D) An untemplated crystal with roughly 4000 tiles and no errors. Inset: The largest subregion of a perfect Sierpinski pattern is small.(E) An untemplated crystal with several errors, grown at Gmc = 17, Gse = 10.4. Note that growth in the reverse direction is more error-prone. Only approximately 1% of T-00 tiles are in large patches.(F) An untemplated crystal with few errors, grown at Gmc = 17, Gse = 8.6, with T-00 and T-11 at doubled stoichiometry. Note the large perfect subregion. Simulation was initiated by a preformed seed larger than the critical nucleus size (roughly 100 tiles). For these simulation parameters, approximately 25% of T-00 tiles are in large patches. According to the approximations used in Winfree (1998a), Gmc = 17 corresponds to 0.8 μM, Gse = 8.5 corresponds to 41.8 °C, and Gse = 10.4 corresponds to 32.7 °C. The black outline around the crystals is for clarity; it does not represent tiles.\n", - "4765 \n", - " Simulations with Slow Border Growth and T-00 and T-11 at Doubled Concentrations(A) A common error pattern: termination of triangles at corners.(B) An observed mechanism leading to termination or sideways extension of triangles: preferential nucleation of T-00 on facets.(C) Forward and sideways growth is deterministic: at sites presenting two binding domains, there is always a unique tile that can form exactly two bonds. Backward growth is non-deterministic: at sites where both binding domains agree (e.g., green arrows), there are two possible tiles that can make two bonds (either {T-10, T-01}, or {T-00, T-11}). At sites where the available binding domains disagree (e.g., red arrows), there is no tile that can associate to form two bonds. Since only the output type of tiles are shown, it is impossible to tell from these figures which backward growth sites present agreeing or disagreeing binding domains.\n", - "4766 \n", - " Molecular Schema(A) Top center: abstract versions of the four DAE-E Sierpinski rule tiles, VE-00, UE-11, RE-01, and SE-10, highlight their differences from the tiles in Figure 1. The arrangement of 3′ and 5′ ends on DAE-E tiles dictates that two distinct pairs of complementary binding domains must be used for each symbol ‘0' or ‘1,' denoted here by making complementary shapes large or small. Pink legends show the mapping of shape to sticky-end sequences. Top left: a molecular diagram for VE-00 shows how each DAE-E tile is comprised of five DNA strands; small arrows point to crossovers. Top right: a diagram for RE-01 shows how hairpins are attached to ‘1' tiles to provide AFM contrast; the exact orientation of these hairpins is unknown. Below: tiles are shown assembling on a nucleating structure. The nucleating strand for the input row (blue) is generated by assembly PCR and frequently reaches lengths of more than 3 μm (200 tiles). The nucleating strand contains subsequences onto which capping strands (orange) and input tile strands assemble to form an input tile outputting ‘0' at random intervals, the nucleating strand contains a subsequence (asterisk) for a different input tile that outputs a ‘1' on one side.(B) Top center: the six DAO-E Sierpinski rule tiles: S-00, R-00, S-11, R-11, S-01, and R-01. Top left and right: molecular diagrams highlight two notable features: (1) R-type tiles output only to S-type tiles, and vice-versa, as dictated by the 3′/5′ polarity of the molecules—again requiring two distinct pairs of binding domains per symbol. (2) The indicated rotational symmetry of the DAO-E molecules allows each molecule to serve in either of two orientations; no explicit S-10 or R-10 tiles are needed. An input tile outputting a single ‘1' sticky end is shown (asterisk). Sequences are given in Figures S4–S7.\n", - "4767 \n", - " AFM Images of DAE-E Crystals(A) Several frequent morphologies that appear in most samples, including all-'0' (upper arrow) and ‘011011'-striped crystals (lower arrow). The all-'0' crystal may be a tube that opened upon adsorption to the mica.(B) A templated crystal. The identification of tiles in this crystal is given in Figure 1E. Crosses indicate mismatch errors. Asterisks indicate ‘1's on the nucleating strand.(C) A crystal containing 10 rows of error-free Sierpinski triangle. A red triangle marks a lattice defect in the input row.(D) Another Sierpinski triangle, better resolved.(E) A crystal containing a perfect 19 × 6 subregion. Individual tiles can be clearly seen; three tiles are outlined in the lower left. Unfortunately, this crystal landed atop a thin sliver of DNA (lower arrow), obscuring the central columns of the Sierpinski triangle. The upper arrow indicates a 4-tile wide tube, near the point where it opens. A pentagon marks a lattice dislocation. Scale bars are 100 nm.\n", - "4768 \n", - " AFM Images of DAO-E Crystals(A) A large templated crystal in a 5-tile reaction (no R-11). A single ‘1' in the input row (asterisk) initiates a Sierpinski triangle, which subsequently devolves due to errors. Mismatch errors within ‘0' domains initiate isolated Sierpinski patterns terminated by additional errors at their corners.(B) A large untemplated fragment in a 5-tile reaction (no S-11). Large triangles of ‘0's can be seen. Crystals similar to this are also seen in samples lacking the nucleating structure.(C) Several large crystals in a 6-tile reaction, some with more zeros than ones, some with more ones than zeros. It is difficult to determine whether these crystals are templated or not.(D) An average of several scans of the boxed region from (C), containing roughly 1,000 tiles and 45 errors.(E) An average of several scans of a Sierpinski triangle that initiated by a single error in a sea of zeros and terminated by three further errors (a 1% error rate for the 400 tiles here). Red crosses in (D) and (E) indicate tiles that have been identified (by eye) to be incorrect with respect to the two tiles from which they receive their input. Scale bars are 100 nm.\n", - "4771 \n", - " Phylogenetic Relationships among Tigers from mtDNA Haplotypes(A) Phylogenetic relationships based on MP among the tiger mtDNA haplotypes from the combined 4,078 bp mitochondrial sequence (Table 2). Branches of the same color represent haplotypes of the same subspecies. Trees derived from ME and ML analyses have identical topologies. Numbers above branches represent bootstrap support from 100 replicates using the MP method, followed by bootstrap values using the ME-ML analyses (only those over 70% are indicated). Numbers below branches show number of MP steps per number of homoplasies from a strict consensus tree. Numbers in parentheses represent numbers of individuals sharing the same haplotype. MP analysis using heuristic search and tree-bisection-reconnection branch-swapping approach results in two equally most-parsimonious trees and the one resembling the ME and ML trees is shown here (tree length = 60 steps; CI = 0.900). The ME tree is constructed with PAUP using Kimura two-parameter distances (transition to transversion ratio = 2) and NJ algorithm followed by branch-swapping procedure (ME = 0.0142). The ML approach is performed using a TrN (Tamura-Nei) +I (with proportion of invariable sites) model, and all nodes of the ML tree were significant (a consensus of 100 trees, –Ln likelihood = 5987.09).(B) Statistical parsimony network of tiger mtDNA haplotypes based on 4,078 mtDNA sequences constructed using the TCS program (Clement et al. 2000). The area of the circle is approximately proportional to the haplotype frequency, and the length of connecting lines is proportional to the exact nucleotide differences between haplotypes with each unit representing one nucleotide substitution. Missing haplotypes in the network are represented by dots. Haplotype codes and the number of individuals (in parentheses) with each haplotype are shown (see Table 2).\n", - "4784 \n", - " Array fabrication and gene annotation (A) False-colour image generated from a bovine-Cy5, human-Cy3 hybridisation. False colour images were generated using the programme ScanAlyze, version 2.44 . The full array (24 × 25 spotting pattern) consists of 16 blocks with each gene spotted 5 times per block therefore 80 potential data points present for expression analysis per gene. A blow-up of 4 blocks illustrating the Chip design is presented. The ACTIN cDNAs acting as guide-dots can be seen as intense yellow spots demarcating each block. In addition, the majority of spots appear yellow due to similar expression levels of the orthologous genes. (B) Functional annotation of the 349 genes as set out by the Gene Ontology Consortium .The proportion of these genes within each functional / biological annotation is represented on the Y-axis and the annotation on the X-axis. (C) Chromosomal distribution of the 349 genes. The number of genes within each chromosome is represented on the Y-axis and the chromosome numbers on the X-axis.\n", - "4785 \n", - " Global data characteristics (A) Global correlation of bovine (X-axis) and human (Y-axis) experiments. The plot shows a log-log (base 2) plot of the mean signal intensities from the four independent experiments for each gene. The red line shows the regression line, the box displays the parameters of the regression line (intercept, slope) and the overall correlation. Four genes that are significantly differentially expressed as judged by using the Wilcoxon's rank-sum test are denoted by black diamond shapes. (B) MA-plot of a single experiment. The X-axis show the log (base 2) of the squared product of Cy5-red and Cy3-green intensities of each gene in the same experiment. Y-axis shows the log-ratio (base 2) of red and green intensity. The horizontal lines mark the two-fold over-expressed genes (Top line; bovine over-expression and bottom line; human over-expression). (C). Classification of detection levels of the 349 genes. The genes were sub-divided into three classes of expression levels. Class 1 (BG-tag < 0.8) – low (not detected). Class 2 (BG-tag between 0.8 and 0.9) – medium (boarderline detection) and Class 3 (BG-tag > 0.9) – high expression (readily detectable) The number of genes (X-axis) within each class (Y-axis) is also shown in the figure (black = bovine, white = human).\n", - "4786 \n", - " Data reproducibility and species variability (A) Histograms of CVs for human and bovine hybridisations. (B) Classification of signal variability in measured gene expression intensities. Human (white), bovine (grey) and mixed samples (black). CVs (co-efficient of variation) were calculated for repeated signal intensities of the four independent hybridisations and then sub-divided into four classes: Class 1 – CV < 0.25 high reproducibility, Class 2 – CV [0.25 – 0.5] good reproducibility, Class 3 – CV [0.5 – 0.75] medium reproducibility Class 4 – CV > 0.75 poor reproducibility.\n", - "4787 \n", - " Nucleotide sequence alignments of bovine and human transcripts All 349 human genes were matched against the TIGR Bos taurus gene index, BtGI Release 8.0, which contains 87,257 unique sequences. (A) Histogram of %-identities with the best match. (B) Histogram of bp overlap with the best match.\n", - "4788 \n", - " Independent verification of array results by semi-quantitative RT-PCR (A) Ethidium bromide stained gel illustrating independent verification of differential gene expression by semi-quantitative RT-PCR. PCR reactions were carried out in 50 μl volumes, loaded in the order H- (human), B- (bovine) and VE- (water as negative control) then resolved on a 2 % agarose gel as described in Materials and Methods. Each panel consist of genes of the same functional category – listed on the left hand side. A 100 bp ladder (Invitrogen) was used to confirm the sizes (Table 1) of the PCR products. (B) A graphical illustration of the comparison of the expression levels of the orthologous genes as deduced by the microarray analysis and semiquantitative RT-PCR.\n", - "4795 \n", - " Summary data for all cells that exhibited DPγ. (A) Changes in mean EPSC amplitude for (A1) individual experiments, and (A2) pooled data. (B – D) Similar plots for (B1 & B2) success rate (1 – failure rate), (C1 & C2) potency and (D1 & D2) γ. In this, and Figure 4, ns = not significant, * P < 0.05, ** P < 0.01, *** P < 0.001).\n", - "4796 \n", - " DP can occur without alterations in γ (DPN) but only when preceded by LTP that does not involve a change in γ (LTPN). (A) Plot of amplitude vs. time from a representative experiment. Black bar represents LTP pairing, grey bar DP pairing protocol. Throughout the figure, green represents baseline, red LTP and blue DP. (B) Current-variance relationship for baseline, LTP and DP (γ values for this cell (pS): baseline = 6.5, LTP = 6.7, DP = 6.0). (C) Mean EPSCs (average of all responses used for non-SFA) superimposed (left) and peak scaled (right). (D) Amplitude histogram (bin width = 2 pA; N = 151 for baseline, N = 211 for LTP, N = 513 for DP) for baseline, LTP and DP. Inset: 10 consecutive responses for baseline, LTP and DP.\n", - "4797 \n", - " Summary data for all cells exhibiting DPN. (A) Changes in mean EPSC amplitude for (A1) individual experiments, and (A2) pooled data. (B – D) Similar plots for (B1 & B2) success rate, (C1 & C2) potency and (D1 & D2) γ.\n", - "4798 \n", - " NMDA receptor-dependence of DP. (A) Plot of amplitude vs. time from an experiment in which the DP induction protocol was delivered in the presence of D-AP5 (50 μM). Black bar represents LTP pairing, grey bar DP pairing protocol. (B) Changes in mean EPSC amplitude for normalised pooled data. Filled symbols: control (n = 5); open symbols: D-AP5 (n = 4). (C) Changes in potency for normalised pooled data (symbols as in B). For the analysis of LTP, amplitude and potency were measured for the 200 trials immediately preceding the DP pairing protocol.\n", - "4799 \n", - " Further analysis of DP experiments. (A) Success rate ratio (DP / preceding LTP) vs. amplitude ratio for individual DP experiments (open symbols represent experiments for which γ did not change, closed symbols for experiments in which there was a change in γ). These symbol codes apply to the rest of the figure. (B) Potency ratio vs. amplitude ratio. (C) γ ratio vs. amplitude ratio. (D) γ ratio vs. potency ratio.\n", - "4800 \n", - " A model for the mechanisms of DP and de novo LTD. Rectangles represent AMPARs, open circles transmitter vesicles. (A) DP is due to a reduction in the number of surface-expressed AMPARs (DPN) when preceded by LTPN. Depression below the original baseline is due to a further reduction in AMPA receptor number causing a complete loss of postsynaptic receptors at some synapses. De novo LTD [17] is due to the same mechanism. (B) DP is due to a reduction in γ (DPγ) when preceded by LTPγ.\n", - "4821 \n", - " (A) Apoptosis and cell survival and (B) Cytokines and chemokines and their receptors. \n", - "4824 \n", - " Septin2 interacts with actin, but not with tubulin. (A) Immunofluorescence of endogenous Septin2 (red) and actin (green, stained with phallacidin) in interphase NRK cells. Note the typical filamentous-granular organisation of Septin2 and its co-localisation with actin. (B) Septin2 (red) does not colocalise with endogenous vinculin (green), a marker for focal adhesions. (C) Staining of Septin2 (red) and actin (green) after disruption of the actin cytoskeleton. NRK cells were treated with Latrunculin B for 30 min. Septin2 now forms rings. (D) Septin2 (red) and tubulin (green) mainly have distinct distributions in NRK cells. (E) Enlarged image of the boxed region in D. Regions with overlapping Septin2 (red) and tubulin (blue) staining always contain actin (green) as well (arrow). (F) Cells were treated with nocodazole for 30 min. Microtubule organisation (green) is disturbed, but Septin2 (red) distribution is largely unaffected. All images show a single confocal section. Bars, 10 μm.\n", - "4825 \n", - " Knock down of Septin2 expression abolishes actin organisation. NRK cells were transfected with siRNA targeting Septin2. (A) Immunofluorescence 48 hrs after transfection. Cells with reduced level of Septin2 (red) have no actin bundles (red) (0). (B) Tubulin distribution (green) is unaffected in cells showing a decreased Septin2 staining (red) (0). (C) 48 hrs after transfection with siRNA NRK cells were lysed and immunoblotted for Septin2, actin, tubulin and Erp72. The amounts of Septin2, actin and tubulin were quantified and normalized to the corresponding amount of Erp72 to account for reduction in cell number upon siRNA treatment. co, control; Erp72, Endoplasmic Reticulum Protein, member of the protein disulfide isomerase family. Similar results were obtained with Hela cells. A single confocal section is shown. Bars, 20 μm.\n", - "4826 \n", - " Characterisation of truncated YFP-Septin2 constructs. (A) Schematic presentation of full length YFP-Septin2 (YFP-Sept2-PB/G/CC) and truncated YFP-Septin2 constructs. (B) In some cells overexpression of full length YFP-Sept2-PB/G/CC induced the formation of higher-ordered YFP-Septin2 containing-structures with differing morphology (C) Untagged full length Sept2-PB/G/CC is also capable of forming these structures and actin filaments are attenuated in those cells. Full length Sept2-PB/G/CC was detected with anti-Septin2-antibody. (D) Distribution of YFP-Septin2 constructs in NRK cells and their effect on the actin cytoskeleton. Cells were transfected with either full length YFP-Sept2-PB/G/CC or the truncated YFP-Septin2 constructs and stained for actin with phallacidin. Only YFP-Sept2-PB, the construct lacking the GTPase domain and the coiled coil domain affects actin organisation. The distributions of YFP-Sept2-PB/G, the construct without the coiled-coil domain, and YFP-Sept2-G/CC, which lacks the polybasic region, are different to full length YFP-Sept2-PB/G/CC, but there is no effect on actin. Images show a single confocal section. Bars. 10 μm.\n", - "4827 \n", - " Effects of Rho-GTPases on actin and Septin2 organisation. NRK cells were transfected with GDP-locked forms of myc-Rac1 (A), myc-CDC42 (B) or myc-RhoA (C) and stained for Septin2 and actin. GTPases were detected with a monoclonal anti myc-antibody. (A) Cells expressing the myc-Rac1 mutant lack actin bundles and Septin2 organisation is disrupted. Instead of filaments, Septin2 forms rings (inset, inset was taken from another cell transfected with Rac1-mutant). (B) myc-CDC42-GDP induces the formation of thick actin bundles but has only little effect on Septin2 appearance. (C) Transfection with dominant-negativ myc-RhoA causes the detachment of most of the cells. Cells left on the coverslip have diminished actin filaments and disrupted Septin2 organisation. Images are single confocal sections. Bars, 10 μm.\n", - "4828 \n", - " Septin2 is not associated with actin in moving or ruffling cells. (A) DIC image of moving NRK cells in an experimentally wounded monolayer. Note the leading edges of the cells contain actin (green), but Septin2 (red) is completely missing. (B) Septin2 forms ring-like structures in the body of moving cells comparable to rings observed after latrunculin treatment (compare Fig. 1C). (C) In ruffling cells growing on lysine-coated coverslips Septin2 (red) is detectable in the cell body, whereas actin (green) is concentrated in ruffles. (D) Ruffles are also positive for endogenous Rac1 (green), but Septin2 (red) is clearly missing. (E) In the cell body of ruffling cells Septin2 (red) forms O- and C-shaped ring-like structures, which are not associated with actin (green, stained with phallacidin). Bars, 5 μm.\n", - "4829 \n", - " Septin2 forms highly dynamic filaments and rings. (A) YFP-Septin2 has the same distribution like endogenous Septin2 and it does not alter the organisation of endogenous Septin2. Bar, 20 μm (B) Photobleach experiment. NRK cells were transfected with either YFP-Septin2 or GFP-actin. Part of the filaments was bleached and recovery monitored over time. The ratio between mean fluorescence intensity of the prebleached box and the mean fluorescence of the whole cell was normalised to the prebleach ratio and expressed as a function of time (Materials and Methods). The graph shows representative recovery curves, which were fitted to a single exponential curve (solid lines) to calculate tDs and amount of recovery. n = 5. Images show a single confocal section of YFP-Septin2 filaments in NRK cells. Bar, 4 μm. (C) Images of a time-laps movie of YFP-Septin2 in the cell body of ruffling NRK-cells. Arrows indicate the formation cycle of a ring. Bar, 2 μm. (D,E) Photobleach experiments of YFP-Septin2 rings (also see additional file 1 for lysine/ruffling cells and additional file 2 for latrunculin). NRK cells growing on lysine-coated coverslips to induce ruffles were transfected with YFP-Septin2. Rings formed in the cell body were bleached and recovery monitored over time. For bleaching of Septin2 rings upon latrunculin treatment, normal NRK cells were transfected with YFP-Septin2 and treated with Latrunculin B for 20–25 Min before photobleaching. The data were analysed as in B to calculate tDs of recovery (D) and amount of recovery (E). n = 5. Images show a single confocal section of YFP-Septin2 rings in ruffling NRK cells. (F) Quantitative comparison of outer diameters of Septin2 rings in ruffling cells (lysine, empty circles) and upon latrunculin treatment (filled circles). Measurements were done on images of cells transfected with YFP-Septin2.\n", - "4860 \n", - " Expression of EphA2 in murine tumor cell lines and tumor/normal tissues. (A) Aliquots of protein lysates (10 μg/lane) were analyzed by Western Blotting for expression of mEphA2 protein using a specific monoclonal antibody (C-20 Ab; Santa Cruz Biotechnology, Inc., Santa Cruz, CA). Lysate samples were obtained from mouse tumor lines including the B16, B16V1 and B16BL6 melanomas and the KR129, KR130, KR233 and KR158D glioma cell lines derived from spontaneously developed glioma tissues in NPcis mice. Control β-actin labeling demonstrated equal amount of protein loading in each lane. (B) Protein lysates isolated from normal mouse brain, spleen, liver, lung, heart, skeletal muscle, and the G261 glioma and MCA 205 sarcoma cell lines were separated by SDS-PAGE, blotted onto nitrocellulose and analyzed for expression of mEphA2 using C-20 anti-EphA2 monoclonal antibody.\n", - "4862 \n", - " Immunizations with DCs loaded with Eph-A2 derived peptides inhibit the growth of both EphA2-positive and EphA2-negative tumors. (A) C57BL/6 mice received 1 × 105 MCA205 cells s.c. on day 0. These animals were then immunized with 1 × 106 DCs loaded with the indicated peptides on days 3, 10. Tumor growth was monitored for 28 days following the tumor inoculation (N = 5/group). P < 0.05 for both mEphA2671–679/30–44 and mEphA2682–689/30–44 treatments in comparison to OVA control for the tumor based on a two-tailed Student-t test (*). (B) C57BL/6 mice received s.c. pre-immunizations with 1 × 106 DCs loaded with either mEphA2671–679, mEphA2682–689, mEphA230–44 or control OVA257–264 on days -14 and -7 (N = 5 /group), followed by s.c. challenge with 5 × 104 B16 melanoma cells on day 0. On day 14, the size of tumors and the number of animals that had measurable tumors were assessed. P < 0.01 for EphA2671–679, EphA2682–689 and EphA230–44 treatments in comparison to OVA257–264 treated group (*).\n", - "4863 \n", - " Inhibition of B16-BL6 lung metastasis and VEGF-induced angiogenesis by s.c. immunizations with DCs loaded with EphA2-derived peptides. (A and B), C57BL/6 mice received i.v. injections of 2 × 105 B16-BL6 cells followed by s.c. immunizations with 1 × 106 DCs loaded with the indicated peptides on days 3, 10 and 17 (N = 4/group). The animals were sacrificed on day 28, with representative macroscopic pictures of the harvested lungs from each group (A) and the numbers of pulmonary surface metastases counted (B) P < 0.001 for both mEphA2671–679/30–44 (*) and mEphA2682–689/30–44 (**) treatments in comparison to OVA control for the number of metastasis based on two-tailed Student-t test. (C), mEphA2-targeted immunizations inhibited the vascular formation in the Matrigel plug assay. Syngeneic mice pre-immunized with control OVA- (left) or EphA2- (right) peptides were injected s.c. with Matrigel containing VEGF. After 10 days, the plugs were removed and photographed. The picture shows representative VEGF-containing plugs excised from total 5 mice/group.\n", - "4875 \n", - " Effects of saposin C on caspase-3/7 activity (A) and the influence of PI3-kinase inhibitor (B) in etoposide-treated cells. Cell culture, treatment period, growth and caspase activity was described in Figure 4. Caspase-3/7 activity was determined using the Apo-ONE Homoheneous Caspase-3/7 assay kit based on the cleavage of a profluorescent caspase-3/7 substrate (Z-DEVD-R110) and fluorimetric quantitation was performed at an excitation and emission wavelength of 485+20 and 535+25 nm, respectively. After correction of the fluorimetric reading with the blank (vehicle control), final fluorescent intensity was depicted as an arbitrary endpoint relative fluorescent unit, RFLU. PI3-kinase inhibitor (LY294002; LY) was used at final 1.5 μM concentration and saposin C was added at optimal 1 nM (for PC-3 and LNCaP) or 10 nM (for DU-145) concenration. Etoposide (Et) was added at optimal 20 μM (for PC-3 and LNCaP) or 2 μM (for DU-145). Data expressed are the average of three independent experiments and twelve replicate samples; bars, ± SEM. * indicates P < 0.05, and ** indicates P < 0.01. Statistical significance of the effect of saposin C on cell growth and apoptosis was evaluated by one-way ANOVA with Bonferroni's corrections. Differences of vehicle (or etoposide)-only-treated cells and any other single experimental group of interest (TX14A or prosaposin) was evaluated by Student's t-test and statistical significance was set at P < 0.05.\n", - "4884 \n", - " Quantitative real-time RT-PCR for extracellular matrix components. Quantitative real-time RT-PCR for (A) COL3A1, (B) BGN, (C) SPARC and (D) NID1. Circled data points indicate samples used in the cDNA microarray analysis, and horizontal lines the mean of each genotype. Absolute values for mRNA abundance were normalized to that of 18S rRNA.\n", - "4887 \n", - " Plasma viral loads of FIV infected cats as a function of TL-3 treatment and disease. (A), normalized viral load (copies/ml × 106) at week 2; (B), and at peak viremia between weeks 0 – 6.5 in FIV infected cats treated with TL-3 (+TL-3, solid symbols) or untreated (-TL-3, open symbols). (C), peak viremia between weeks 0 to 6.5 post infection, in healthy (asymptomatic) and symptomatic (euthanized) cats. The average value (largest horizontal bar, –) is plotted for each group. Equal volumes of plasma were normalized using an external RNA spike and analyzed as detailed in Materials and Methods for the presence of FIV RNA by reverse-transcription real-time quantitative PCR. * indicate average values in (C) differ significantly (p ≤ 0.05).\n", - "4888 \n", - " Individual plasma viral loads as a function of TL-3 treatment over an 8 week period. Normalized viral loads in (A) symptomatic (euthanized) and (B) asymptomatic cats. Each value corresponds to the volume normalized viral load (copies /ml) between weeks 2–8. Control cats, 213 and 214 (not shown) had viral levels below detection. Cats are grouped for the presence (■ solid bars) or absence (□ open bars) of TL-3 treatment, and then in numerical order from left to right. Specific bars are marked for the approximate week of euthanasia (†) and viral levels below detection are denoted as (*).\n", - "4902 \n", - " Delayed chlorophyll fluorescence images. Luminescence from leaves of Arabidopsis (A) and Tradescantia (B). Images are 5-minute exposures taken as soon as possible after transfer of leaves to the equipment. A conventional photograph of the Tradescantia leaf imaged in (B) is shown to illustrate the pattern of variegation (C).\n", - "4953 \n", - " Schematic Diagram of Reinforcement(A) Populations diverge by evolving separately for a period of time in allopatry (separated by a geographic barrier). Populations may still be completely compatible in their mating characteristics, or these may also have diverged slightly (represented in the figure by the differences in color). (B) Secondary contact commences. This is shown through the removal of a geographic barrier that allows individuals to migrate between populations (migration is represented by a bidirectional arrow). Secondary contact can also occur by range expansion to produce an area of sympatry, or through other similar mechanisms. Due to the prior divergence between populations, hybrids have low fitness. (C) Selection to avoid producing low fitness hybrids causes the evolution of further divergence in the mating traits (represented by color) of the two populations, reducing interbreeding.\n", - "4954 \n", - " The Pattern of Reproductive Character Displacement(A) Reproductive character displacement due to the presence of an area of overlap between two populations (differences in mating characteristics are represented by color changes, with the hatched area showing divergence in sympatry). Reproductive character displacement can also occur when the sympatric and allopatric areas are not contiguous. (B) Reproductive character displacement can appear as a cline in mating cues or mating preferences (y-axis), with divergence originating in the area of sympatry and spreading into areas of allopatry.\n", - "4955 \n", - " Basic DNA Structures for Self-Assembly(A) A four-arm junction and (B) its three-dimensional structure; (C) a DNA DX; and (D) a DNA TX.\n", - "4966 \n", - " The Association between Sleep Duration and Serum Leptin and Ghrelin Levels(A) Mean leptin levels and standard errors for half-hour increments of average nightly sleep after adjustment for age, sex, BMI, and time of storage (see Table 2). Average nightly sleep values outside the lowest and highest intervals are included in those categories. Sample sizes are given below the standard error bars. The y-axis uses a square-root scale. Data derived from 718 diaries because three participants had missing leptin data.(B) Mean ghrelin levels and standard errors for half-hour increments of total sleep time after adjustment for age, sex, BMI, and time of storage (see Table 2). Total sleep time values outside the lowest and highest intervals are included in those categories. The y-axis uses a square-root scale. Note that ranges for total sleep time amounts are typically shorter than those for average nightly sleep amounts (A; see Figure 1), and do not correlate strongly (see text).\n", - "4987 \n", - " Proliferation and efficacy of CD62Llow TDLN cells cultured with IL-2 +/- IL-7. (A) Freshly isolated whole TDLN cells were stained for expression of TCR and CD62L (left panel). The purified CD62Llow subset was stained for TCR and CD62L expression (center panel), or for CD4 and CD8 expression (right panel). (B) CD62Llow TDLN cells were activated with immobilized anti-CD3 mAb for 2 days then cultured in medium with IL-2 (4 U/ml) (closed circle) or the combination of IL-2 and IL-7 (10 ng/ml) (open circle). Cells density was adjusted to 105/ml on days 5 and 9 and total proliferation was calculated. (C) Mice bearing 3-day s.c tumors were treated with 5 Gy TBI then received adoptive transfer of 5 × 106 T cells cultured for 9 days with IL-2 alone (open circle), IL-2 + IL-7 (open triangle), or HBSS (closed circle). Each treatment group is significantly different than HBSS control (P < 0.01).\n", - "4988 \n", - " Restimulation of activated T cells induces additional proliferation with retention of specific anti-tumor efficacy. (A) CD62Llow TDLN cells were activated with anti-CD3 mAb from day 0–2 and again for 14 hrs on day 15. T cells were cultured in the presence of IL-2 (4 U/ml) (closed circle) or IL-2 plus IL-7 (10 ng/ml) (open circle) and the total proliferation is indicated. (B) FACS analysis of activated T cells on day 23 of culture stained for CD4 and CD8. (C) Mice bearing 10-day pulmonary metastases of either MCA205 or MCA207 tumors were pre-treated with 5 Gy TBI then received adoptive transfer of 2.5 × 107 cells cultured with IL-2 alone, the combination of IL-2 plus IL-7, or control HBSS as indicated. Difference between the groups bearing MCA 205 treated with T cells cultured with IL-2 or IL-2 plus IL-7 and all other groups is (P < 0.01). (D) Mice bearing 3-day s.c tumors were pre-treated with 5Gy TBI followed by injection of; HBSS (closed circles), 5 × 106 T cells activated for 5 days (open circles, P < 0.01), 5 × 106 restimulated T cells at day 23 of culture (closed triangles, P = 0.4), 1.5 × 107 re-stimulated T cells (open triangle, P < 0.01), or 4 × 107 re-stimulated T cells (closed square, P < 0.01). Number of mice showing complete regression in each treatment group of 5 mice is indicated in parentheses.\n", - "4989 \n", - " CD8+ effector T cells can be hyperexpanded through repetitive anti-CD3 stimulation. (A) CD62Llow TDLN cells were restimulated with anti-CD3 mAb for 14 hrs every 7 days starting on day 23 of culture and overall proliferation was measured for three independent experiments. (B) T cells were harvested on day 50 of culture and adoptively transferred to hosts bearing either MCA 205 or MCA 207 3-day pulmonary metastases (P < 0.01 for MCA 205 tumors treated with either 6 × 106 or 2 × 107 compared with all other groups). (C) Mice bearing 3-day s.c tumors were treated with 5 Gy TBI then received adoptive transfer of the indicated number of T cells hyperexpanded for 50 days (P = 0.06 for 4 × 107 cell dose) (D) Mice bearing 3-day i.c. tumors were treated with 5Gy TBI then received adoptive transfer of the indicated number of T cells hyperexpanded for 50 days. Mice were sacrificed when they developed neurologic symptoms indicating progressive tumor (P = 0.9 for treatment groups versus control).\n", - "4990 \n", - " Hyperexpanded CD4+ T cells mediate regression of intracranial or subcutaneous tumors. (A) CD62Llow TDLN cells were depleted of CD8+ cells prior to anti-CD3 activation and were maintained in medium with IL-2 (4 U/ml) plus IL-7 (10 ng/ml) or alternatively with IL-7 (10 ng/ml) plus IL-23 (2 ng/ml) and were restimulated for 14 hrs with anti-CD3 mAb at the indicated time points. The total proliferation with indicated losses due to AICD or re-purification of CD4+ cells is indicated. (B) Mice bearing 3-day s.c.tumors were treated with 5 Gy TBI followed by adoptive transfer of 3 × 107 CD4+ T cells culture activated for 43 days and tumor size was measured. On day 37, one mouse from IL-2 + IL-7 group was euthanized due to progressive tumor growth, however complete regression was observed in the remaining 4 mice (P = 0.015 versus control). Complete regression was observed in all five recipients of IL-7 + IL-23 cultured CD4+ T cells (P = 0.005 versus control). (C) Mice bearing 3-day intracranial tumors were treated with 5Gy TBI followed by adoptive transfer of 3 × 107 CD4+ T cells culture activated for 43 days. Mice were followed for survival (P < 0.01 for both treatment groups versus control). (D) Mice bearing 3-day subcutaneous tumors were treated with 5 Gy TBI followed by adoptive transfer of 4 × 107 CD8+ T cells hyperexpanded to greater than 108-fold for 50 days, or 1.5 × 107 CD4+ T cells hyperexpanded to greater than 108-fold for 85 days. On day 28, 4 mice from CD8 treatment group (* P = 0.39 versus control) and 2 mice from CD4 treatment group (# P = 0.019 versus control) were euthanized due to progressive tumor growth but complete tumor regression was observed in the remaining mice.\n", - "4999 \n", - " Aβ inhibits oxLDL binding, uptake and degradation in microglia. Treatment of primary microglia with 20 μM fibrillar Aβ, but not revAβ, inhibits 125I-oxLDL binding (A), cellular uptake (B) and degradation (C). Data are the mean of triplicate samples ± standard deviation, *p ≤ 0.005. (D) Microglia treated with 20 μM fibrillar Aβ fail to accumulate cholesterol ester in the presence of oxLDL. Microglia were incubated with 40 μg/ml oxLDL for 48 h in the presence and absence of 20 μM Aβ or revAβ peptide and stained with oil red O to visualize neutral lipid. Cells treated with oxLDL alone or in the presence of revAβ demonstrate the accumulation of red-stained lipid droplets in the cytoplasm. By contrast, oil red O staining is greatly reduced in oxLDL and Aβ co-treated microglia. Mag. 200X.\n", - "5023 \n", - " A: Axial, coronal and sagittal 99mTc-HMPAO SPECT images of the brain obtained during a facial twitching episode show moderate to severe heterogeneous cerebral hypoperfusion with an apparent focus of increased radiotracer uptake near the midbrain. B: 99mTc-ECD SPECT image of the brain obtained two weeks after (A) during a period free from twitching shows resolution of the area of increased uptake. C: Computer-generated depiction of A-B overlayed onto a co-registered MRI shows the area of increased uptake to lie outside the brain. See [5] or for image analysis and alignment methodology.\n", - "5057 \n", - " Mean number (±SEM) of single (A), clustered (B) and percentage of clusters (C) of GnRH-immunoreactive neurons counted in the preoptic area of ewes in the four experimental groups of the first experiment. Different letters indicate significant differences (p < 0.05). On histogram B, groups 1 and 2, like groups 3 and 4, are not statistically different, but groups 1 and 2, and groups 3 and 4, are statistically different; on histogram C group 1 is statistically higher than the other groups.\n", - "5122 \n", - " Survival index of HL-60 and U937 cells, incubated with increasing concentrations of sulphasalazine Survival index of HL-60 (A) and U937 cells (B) treated with increasing concentrations of sulphasalazine (0–1000 μM) for 72 h and measured with FMCA. Survival index, defined as fluorescence in test wells/ fluorescence in control wells (blank values subtracted) × 100.\n", - "5131 \n", - " X Genetic Maps in the Three Dioecious Species versus Plot of Synonymous Divergence(A) Gene orders and the map positions of the genes. The PAR is not drawn to scale, as there is only one marker, and the map shows only the portion of the X chromosome containing our marker genes. Vertical lines connect the homologous genes in the three species, and the chromosomal rearrangement in S. dioica, are shown by crossed lines for locus 1 and DD44.(B) Plot of synonymous divergence between X and Y pairs (dS\n", - "X-Y), estimated using PAML, against the map position using the gene order in S. latifolia and S. diclinis (see text). Synonymous divergences are statistically significantly distinguished for the following three groups of genes: locus 1, the DD44 gene, and loci 3 and 4 (see text). The figure also indicates minimum and maximum X-Y divergence time estimates for the genes, assuming a molecular clock and 1.8 × 10–8 synonymous substitutions per synonymous site per year (the mean of the values 1.4 × 10–8 and 2.2 × 10–8 discussed in the text).\n", - "5132 \n", - " Segregation Analysis of Locus 3 in S. dioica\n", - "To test for sex linkage, the female and male parents of the family and six progeny of each sex were genotyped. Genomic DNA preparations from these plants were used in PCR amplifications. The PCR products were separated by electrophoresis and visualized using ethidium bromide.(A) With primers specific for the X3 allele, the restriction enzyme RsaI reveals an allelic polymorphism. The maternal plant is heterozygous and has both cut and uncut alleles while the male parent has only the uncut allele. Female progeny always have the uncut allele (like the father), and male progeny have one of the maternal alleles, but never both, corresponding to the expected segregation of the X chromosome.(B) Primers specific for the Y gametolog. A product amplifes only with male DNA, corresponding to the expected segregation of the Y chromosome.\n", - "5142 \n", - " Ultrasound images with low mechanical index pulse sequence scheme showing the presence of microbubbles binding to the arterial endothelium in a balloon-injured carotid artery (Panel A, right) and the absence of microbubbles in the control noninjured carotid artery (Panel B, right). Scanning electron microscopy (Bar = 10 μm; magnification 1420 ×) revealed sites of injury with endothelial denudation and attachment of microbubbles (black arrows) to the denuded endothelium only in the injured vessel (A) and normal appearing endothelium in the control vessel (B). (Reprinted with permission from Tsutsui JM, Xie F, Radio SJ, Phillips P, Chomas J, Lof J et al. Non-invasive detection of carotid artery endothelial dysfunction due to hypertriglyceridemia and balloon injury with high frequency real time low mechanical index imaging of retained microbubbles. J Am Coll Cardiol 2004;44:1036-46).\n", - "5153 \n", - " Detection of LIF transcripts in cultured human liver myofibroblasts. (A): Northern blot. Total RNA from cultured human liver myofibroblasts was hybridized with a cDNA probe to human LIF. A single 4.5 kb band was observed; (B) and (C): RT-PCR. Total RNA was subjected to reverse transcription then to PCR with the hLIF-D3/hLIF-N4 (B) or with the hLIF-M3/hLIF-N4 primers (C).\n", - "5157 \n", - " RT-PCR analysis of LIF-M expression in various cell lines and in human liver. (A): LIF-M expression was analyzed with the hLIF-M2 and hLIF-3N primers: Line 1, human liver myofibroblasts; Line 2, HepG2; Line 3, Hep3B; Line 4, HuH7; Line 5, HEK293. Product sizes are shown in bp; (B): normal human liver samples. LIF-D expression was analyzed with the hLIF-D3 and hLIF-N4 primers in 4 different samples. The same samples also expressed LIF-M (not shown). Product sizes are shown in bp; (C): diseased human liver samples. In that case, LIF-M expression was analyzed with the hLIF-M3 and hLIF-4N primers in 4 cases of cirrhotic liver. The same samples also expressed LIF-D (not shown). Product sizes are shown in bp; (D): semi-quantitation of LIF-D and s-LIF-D expression in a human liver myofibroblasts sample. LIF-D expression was analyzed with the hLIF-D3 and hLIF-N4 primers. The left part shows the migration pattern of the PCR-amplified products with the number of cycles above and the size of the products indicated by arrows, in bp. The graph on the right shows the signal quantification. Similar results were obtained with LIF-M.\n", - "5186 \n", - " Angiotensin II receptor 1 staining in lung biopsies from control patients (A) and from patients with idiopathic pulmonary fibrosis (B). Immunohistochemistry for the angiotensin II receptor 1 (AGTR1), counterstained with haematoxylin. AGTR1 positive staining is seen in alveolar macrophages, in epithelial cells and in fibroblastic foci (arrows) in usual interstitial pneumonia biopsies (panel B). Epithelial cells and alveolar macrophages express AGTR1 in control lung biopsies (panel A).\n", - "5193 \n", - " Distribution of mercury levels Population distributions are shown for (A) Tabatinga and (B) Jacareacanga in μg Hg/g hair and (C) Rio-Rato in μg Hg/L urine.\n", - "5217 \n", - " CHAIN analysis of P loop GTPase-specific constraints acting on the Giα subunit. The displayed sequences are representatives of the Giα family of Gα proteins from distinct phyla. The foreground sequence set, which also includes P loop GTPases outside of the Giα family, are represented by the conserved residue patterns below the alignments. The number specified after the word 'pattern' gives the actual number of aligned sequences. (A) Motif-based contrast hierarchical alignment. Phyla are indicated in the leftmost column. Note that a purged foreground set [5] was used for the motif-based alignment in (A) and is thus smaller than the full set used by PSI-BLAST in (B). PSI-BLAST compensates for sequence redundancy by down weighting sequences [35] rather than by purging. The corresponding residue frequencies are given in integer tenths below the conserved patterns. For example, a '7' in integer tenths indicates that the corresponding residue directly above it occurs in 70–80% of the sequences. Deletion frequencies are similarly given in integer tenths (black; range 10–100%) or hundredths (gray; range 1–9%) as indicated. Histograms above the alignments display the strengths of the selective constraints acting at each position; aligned residues subject to the strongest constraints are highlighted for emphasis. For a complete description of CHAIN analysis alignments see [3]. (B) PSI-BLAST generated contrast hierarchical alignment. Sequence identifiers are indicated in the leftmost column. Note that, unlike the motif-based alignment in (A), PSI-BLAST misaligns the foreground set's Walker A region (represented by the patterns below the displayed alignment). In order to accentuate this alignment error, the background alignment in (B) consists of the foreground alignment in (A).\n", - "5218 \n", - " CHAIN analysis of α,β-hydrolase fold constraints acting on prolyl oligopeptidases. See legend to Fig. 4 for descriptions. (A) Motif-based contrast hierarchical alignment. The bars directly below the displayed sequences indicate motifs with the narrow line indicating a deletion relative to that motif and wide bars indicating catalytic residues. (B) PSI-BLAST generated contrast hierarchical alignment. The histogram heights for the catalytic aspartate and histidine in this alignment are shorter in this figure because, unlike the motif-based alignment in (A), the PSI-BLAST algorithm assigns relatively stronger constraints to the nucleophilic catalytic residue (not shown) that is much easier to align correctly.\n", - "5219 \n", - " CHAIN analysis of the D1 AAA+ module of p97 ATPases. See legends to Figs 4 and 5 for descriptions and text for discussion. (A) Motif-based contrast hierarchical alignment. The bars directly below the aligned sequences indicate motif regions; wide bars indicate residues shown in Fig. 7 and discussed in the text. (B) PSI-BLAST generated contrast hierarchical alignment.\n", - "5222 \n", - " Triplicate p30II samples express GFP and p30II while triplicate controls express only GFP. (A) Flow cytometric analysis illustrating the expression of GFP in Jurkat T cells 10 days post spin-infection with lentiviral vectors. Both sample (expressing p30II and GFP) and control (GFP alone) group contains relatively high and similar levels of GFP. (B) RT-PCR demonstrating the expression of p30II in Jurkat T cells 10 days post spin-infection with lentiviral vectors. Jurkat T cells spin-infected with sample vector express p30II while the control vector spin-infected cells do not express p30II. RT-PCR was performed with triplicate samples and controls. GAPDH was used as a control for the integrity of the message. (C) Representative western blot showing p30II expression from cell lysate (p30II migrates at ~28 kD). M = Mock vector infected cell lysate, p30 lv = p30 lentivirus vector infected cell lystate, MW = biotin molecular weight markers.\n", - "5224 \n", - " p30II activates NFAT, AP-1 and NF-κB transcriptional activity in Jurkat T lymphocytes. Black bars indicate control and grey bars indicate p30II. Data points are mean of triplicate experiments. Fold increase in activity in the presence of p30II is indicated above each bar. p30II increased the NFAT-luc activity from 2.2 to 10.7 fold depending on co-stimulatory treatment e.g., PMA, ionomycin, CD3, CD28 etc. (A), p30II increased NF-κB-luc activity from 3.1 to 11.4 fold (B) and modestly increased the AP-1 driven luciferase reporter gene activity from 1 to 5 fold in the presence of co-stimulator treatments (C).\n", - "5236 \n", - " Genomic structure of chick IRK1 and determination of transcription initiation sites (A) Restriction map of chick IRK1/Kir2.1 genomic locus. The four overlapping genomic clones are shown above the restriction map. Solid boxes indicate exons. E; EcoRI site, X; XbaI site. The probe used for northern blots is underlined. (B) Genomic sequence surrounding splice sites. Exon 1 ends at +103 and exon 2 begins at +104 (based on cIRK1 cDNA, U20216), as indicated. Intronic sequences are in italics; bold letters indicate donor site GT and acceptor site AG. (C) Primer extension analysis. Approximate size, in bases, is indicated on the left. Products of about 80 bases were present in brain, but not in DF1 fibroblasts or in controls (tRNA). (D) Determination of transcription initiation sites using 5'RACE. Shown are the results of the secondary PCR using the 5'-nested primer and a primer designed at 64-41 of cIRK1 cDNA (N-R2), and controls using the 5'-nested primer only (N only) or the reverse primer only (R2 only).\n", - "5239 \n", - " Identification of domains that affect cIRK1 expression (A) Constructs used in in vitro promoter assays. The putative TATA box, an NF-Y binding site, and an E box are shown in black, hatched and lined boxes, respectively. Numbers in parentheses indicate the length in bp of the promoter region/exon 1 included in each test plasmid. The transcription initiation site is marked with an asterisk. Luc, luciferase reporter gene. (B) In vitro transcription analysis. Plasmid constructs were transiently transfected into DF1 (left) or Qm7 cells (right). Results are shown as fold increases compared with the basal luciferase activity from cells transfected with control pGL-3B vector. Standard errors are shown as bars. *; p value < 0.05, **; p < 0.005.\n", - "5240 \n", - " Time course of phosphorylation of JNK (A) and ERK (B), in lung tissue from rats treated with saline (0 time) or LPS (2–24 h). Western blots with anti-phospho-JNK/JNK antibody or phospho-ERK/ERK antibody were employed in order to monitor JNK or ERK phosphorylation. Relative values for levels of phosphorylated JNK1/2 or ERK1/2 normalized to JNK1/2 or ERK1/2 are indicated below the gel. Results are representative results from 5 rats in each group.\n", - "5242 \n", - " Levels of total protein (A), activity of LDH (B) and neutrophil numbers (C) in bronchoalveolar lavage fluid. The groups represent rats treated as follows: Saline, saline (IT); LPS, LPS (IT); LPS-SP600125, LPS (IT) and a pretreatment with SP600125 (IO), Saline-SP600125, saline (IT) and a pretreatment with SP600125 (IO);LPS-PD98059, LPS (IT) and a pretreatment with PD98059 (IO), Saline-PD98059, saline (IT) and a pretreatment with PD98059 (IO). Animals were sacrificed 4 hours after LPS treatment. Values represent means ± SEM of results from 5 rats in each group. * Significant differences between saline, p < 0.05, and + significant difference compared with LPS group, p < 0.05.\n", - "5245 \n", - " NO production in BAL fluid (A) and alveolar macrophages in culture (B). The groups represent rats treated as follows: Saline, saline (IT); LPS, LPS (IT); LPS-SP600125, LPS (IT) and a pretreatment with SP600125 (IO), Saline-SP600125, saline (IT) and a pretreatment with SP600125 (IO); LPS-PD98059, LPS (IT) and a pretreatment with PD98059 (IO), Saline-PD98059, saline (IT) and a pretreatment with PD98059 (IO). Animals were sacrificed 4 hours after LPS treatment. Alveolar macrophages (106/m1 of RPMI medium) were incubated for 24 hours. BAL fluid and culture supernatants were analyzed using nitrite assays. Values are represented as means ± SEM of results from 5 rats in each group. * Significant differences compared with saline, p < 0.05, and + significant difference compared with LPS group, p < 0.05.\n", - "5248 \n", - " Presence of endogenous Foxo3a in motoneurons. Motoneurons from E12.5 mice spinal cords were cultured in the presence of a cocktail of neurotrophic factors (NTFs) and immunostained using an antibody against total Foxo3a, demonstrating a clearly cytoplasmic localization of endogenous Foxo3a in these conditions. (A) Immunolabelling of Foxo3a; (B) Immunolabelling combined with DAPI staining to visualize the nuclei. Scale bar: 5 microns\n", - "5250 \n", - " Non-phosphorylatable triple-mutant Foxo3a triggers motoneuron death. (A) Purified motoneurons were coelectroporated with constructs for constitutively active (ca) Akt or empty vector, together with another vector encoding GFP. The survival of transduced motoneurons was evaluated after 2 d in culture with NTFs. Akt ca further enhances the effects of NTFs on motoneuron survival. Results are mean ± SD of 2 independent experiments. (B) Using the same protocol, motoneurons were electroporated with vectors encoding either HA-wt-Foxo3a or HA-TM-Foxo3a, together with the GFP vector. They were cultured in the presence or the absence of NTFs and survival was evaluated 2 d later. Overexpression of TM-Foxo-3a leads to reduced survival in each condition. Results are mean ± SD of 12 wells from 6 independent experiments. The 100 % corresponds to the number of motoneurons electroporated with HA-wt-Foxo3a. Differences between overexpression of HA-TM-Foxo3a and HA-wt-Foxo3a were found significant using Student's t-test (p < 0.01).\n", - "5261 \n", - " Example of cardiorespiratory coordination. (A) and (B) show examples of a 'Post Event Time Series' for 1 and 2 respiratory cycles, respectively. The corresponding 'Synchrograms' are shown in (C) and (D). (E) depicts the 'Synchrogram' for phases βj. In (A) and (C) the arrows indicate a sequence with 4:1- and a sequence with 3:1-coordination. In (B) and (D) the arrows point to sequences with 7:2-, 8:2- and 6:2-coordination. The arrows in (E) indicate sequences with coordinated inspiratory onsets that correspond to the coordinated sequences in (A) and (C).\n", - "5287 \n", - " Transient expression of GFP and GFP fusion proteins in BY-2 tobacco cells. (A) GFP protein [35SΩ-sGFP (S65T)]; (B) Arabidopsis chloroplast targeting signal (pt)-GFP fusion protein [35SΩ-pt-sGFP (S65T)]; (C) putative localization signal of GGPP synthase-GFP fusion protein [35SΩ-GGPP synthase-sGFP (S65T)]\n", - "5312 \n", - " Steps in Semiautomated Image AnalysisSemiautomated image analysis involves recognition and automated segmentation of each lymph node (A), quantitation of magnetic tissue parameters (T2*, variance of pixel values; [B]), comparison of extracted tissue parameter to a database (C), and 3D reconstruction of nodal anatomy onto vascular anatomy (D).\n", - "5313 \n", - " Pelvic Nodal StagingNodal staging in patient with colorectal cancer. A PET scan using 18FDG as a tracer (A) and a CT scan (B) were interpreted as negative for nodal metastases. LMRI identified six small pelvic lymph nodes ([C] and [D]; red arrowheads), which had magnetic parameters of malignancy. Semiautomated reconstruction (E) identifies multisegmental metastases, subsequently proven histologically (F). For 3D reconstruction of pelvic nodal anatomy see Video 1.\n", - "5314 \n", - " Breast Cancer MappingPatient with breast cancer prior to sentinel lymph node biopsy.(A) Conventional axillary MRI shows nonenlarged lymph nodes that do not meet the size criteria of malignancy (white bar = 5 mm).(B) Following intravenous administration of nanoparticles, a single 3-mm intranodal metastasis was correctly identified.(C) Ex vivo MRI of sentinel node specimen confirms metastasis.(D) Semiautomated nodal analysis and reconstruction correctly juxtaposed solitary lymph node metastases adjacent to two normal lymph nodes.(E) Correlative histopathology confirms the diagnosis. For 3D reconstruction of axillary nodal anatomy see Video 2.\n", - "5323 \n", - " Test Dataset Performance of the Top Three-Gene Predictive Model of IFNβ ResponseThe same probability model generated from the training dataset (see Figure 4G) provides the background shading of volumes predictive of good response (red) and poor response (blue). Three samples are identified with arrows and followed along different graphical representations.(A and B) The two rotations of the full 3D model show that all good responder samples are correctly classified.(C) Projection of full model onto one of the possible 2D surfaces is provided as an aid to visualization.(D–F) Two-dimensional IBIS predictive models. Three samples are identified with arrows and followed along different graphical representations. If prediction was performed in only two dimensions, a higher number of misclassifications would have occurred. For example, the 2D model built using only Caspase 2/FLIP (D), could not resolve the good responding sample identified by a cyan arrow, whereas it correctly resolves the good responding sample shown by the orange arrow. The model built using Caspase 10/FLIP (E), in contrast, acts oppositely and can resolve the good responding sample shown by the cyan arrow and not the sample shown by the orange arrow. Both these sample are correctly resolved the 2D model built using Caspase 2/Caspase 10 (F); however, this model is unable to resolve the poor responding sample identified by the yellow arrow, whereas one of the previous models (E) was able to do this. As demonstrated in the full 3D model view from (A) and (B), as well as the projection of model (C), all the labeled poor and good responding patients are correctly classified. Although 2D models show high predictive capabilities, all three genes are needed to increase the classification accuracy of the IBIS model.\n", - "5324 \n", - " Characteristic Gene Expression Profiles of Good and Poor Responders to IFNβ over Time(A) An unsupervised hierarchical clustering representation of the weighted difference between the average expression of good and poor responders. For each gene, the obtained differences were log normalized and multiplied by the F-statistic from an ANOVA (responder effect) run previously (shown in [B]). The “heat” colored bar represents the absolute value of this difference. With the exception of MX1 (indicated by an arrow), all genes showing a significant difference in expression between the two groups of patients were automatically arranged in only two clusters (framed in blue).(B) List of all genes showing a significant responder effect along with their F-statistic and p-values. Genes that were part of any triplet showing more than 80% prediction accuracy at T = 0 are shown in bold.(C) A continuous representation of the longitudinal average expression of two representative genes for good (^) and poor (•) responders. TRADD shows two widely parallel curves, indicative of a significant difference in the expression averages, correlating with its profile (#) observed in the clustering shown in (A). In contrast,\n", - "GATA\n", - "3 displays two almost overlapping curves, consistent with its shading (*) in the clustering in (A).\n", - "\n", - "5325 \n", - " IFNβ-Induced Changes in Gene Expression over Time(A) An unsupervised hierarchical clustering representation of the weighted difference in gene expression at each time point versus baseline. For each gene, the obtained differences were log normalized and multiplied by the F-statistic from an ANOVA (time effect) run previously (shown in [B]). The “heat” colored bar represents the absolute value of this difference. With the exception of IFNAR1 (arrow), all genes showing a significantly different expression in at least one time point with respect to baseline were arranged in the same cluster (framed in blue).(B) List of all genes showing a significant time effect along with their F-statistic and p-values. Genes that were part of any triplet showing more than 80% prediction accuracy at T = 0 are in bold.(C) A continuous representation of the longitudinal average expression of two representative genes over all samples. MX1 (^) shows a marked departure from T = 0 and remains elevated for the rest of the observed period. This correlates well with the shading (#) displayed in the clustering shown in (A). In contrast, IRF6 (•) displays an almost flat curve, consistent with its color in the clustering (*).\n", - "5326 \n", - " The Primary, Secondary, and Tertiary Structures of the SARS s2m RNA(A) Phylogenetic comparisons of s2m RNA sequences from various coronavirus and astrovirus species. The SARS RNA sequence is color-coded to match the color scheme used throughout. Conserved sequences are highlighted as bold letters, and co-varying sequences involved in conventional RNA helical base-pairing are indicated in italics. Sequence complements are indicated using color-coded brackets.(B) The 2.7-Å experimental SIRAS platinum-phased and solvent-flattened electron density map contoured at 1.25 root mean square deviation. The map allowed unambiguous tracing of the RNA molecule because the density was unambiguous for all backbone atoms and all nucleotide bases except U(25), U(30), and U(48).(C) A corresponding ribbon diagram highlighting the unusual fold.(D) Schematic representation of the s2m RNA secondary structure, with tertiary structural interactions indicated as long-range contacts. The schematic diagram is designed to approximate the representation of the fold. The GNRA-like pentaloop structure is shown in yellow, A-form RNA helices are shown in blue and purple, the three-purine asymmetric bulge is in red, and the seven-nucleotide bubble is in green. Long-range tertiary contacts are indicated by thin red and yellow lines.\n", - "5327 \n", - " Stereo Representations of the SARS s2m RNA Structure(A) The overall SARS s2m RNA three-dimensional structure and (B) a detailed view of tertiary contacts the and [Mg(H2O)5]2+ binding sites in the context of the experimentally phased electron density map (dark blue). The [Mg(H2O)5]2+ complex ions, depicted as white octahedra, bind to the pro-R and pro-S phosphate oxygen atoms of A(12). An extensive network of potential hydrogen bonds between the metal-coordinated water molecules and the RNA is shown as yellow dotted lines.\n", - "5328 \n", - " Tertiary Structural Interactions in the SARS s2m RNA(A) Close-up of the pentaloop structure together with the augmenting helix, shown in yellow, and the perpendicular junction formed with the A-form stem, shown in cyan. The pink hydrogen bonds indicate base-quartet hydrogen bonding, as shown in (B). The 90° kink thus formed is facilitated by a very sharp bend in the backbone involving unpaired residues 29 and 30.(B) Formation of the junction of two perpendicular helices is facilitated by a base quartet composed of two G–C pairs.(C) The unusual pairing between A(17) and G(34) facilitates formation of a long-range tertiary contact between A(33) of the three-purine asymmetric bulge and G(11) and A(12) of the seven-nucleotide asymmetric bubble. A(38) forms a base triple with C(39) and G(13), forcing G(11) and A(12) out of the main helix.(D) Space-filling representation of the region shown in (C), but rotated approximately 180°. A tunnel is created by the tertiary contacts between A(33) of the purine asymmetric bulge (red), G(11) and A(12) of the seven-nucleotide bubble (green), and the helical region between them (purple). The non-bridging phosphate oxygens of G(11) and A(12) line the surface of the cavity, creating a negatively charged region into which Mg2+ ions are observed to bind.\n", - "5329 \n", - " Chemical Probing of the SARS s2m RNA in Solution(A) An autoradiogram of DMS modification of the s2m RNA in solution.(B) Mapping the results of DMS, kethoxal, and CMCT modifications onto a stereo representation of the RNA structure. Red spheres represent strongly reactive N1 positions of adenosines and N3 positions of cytidine residues in the presence of DMS, and yellow spheres represent weaker reaction. Green spheres represent positions that appear to be protected from DMS. The orange sphere represents reaction with kethoxal at the N1 position of G(11), and magenta spheres represent CMCT reactions with uridines.(C) The most extensive crystal packing interaction involves stacking of G(11) upon its symmetry mate, G(11)′.(D) Temperature factors mapped onto all non-hydrogen atoms (left) and the phosphate backbone (right) of the s2m RNA crystal structure. U(25) is the most disordered residue in the structure and has the highest temperature factor. Density of the base of U(25) is not apparent even after refinement. Most of the rest of the structure is rather well ordered.\n", - "5330 \n", - " SARS Virus RNA Macromolecular Mimicry(A) The SARS s2m RNA structure (red) is superimposed upon the 530 loop of 16S rRNA (cyan), revealing the similar stem-loop folds.(B) The IF-1 (magenta) and S12 protein (blue) that bind to the 16S rRNA 530 loop (now hidden) are shown relative to the same s2m RNA superposition, suggesting that their eukaryotic homologs might plausibly bind to the s2m RNA.\n", - "5331 \n", - " The C. elegans XX Hermaphrodite Germline Sex Determination Pathway(A) Genetic pathway for gene activity, where arrows represent positive regulation and bars represent negative regulation. The key genes tra-2 and fem-3 and the upstream regulators of tra-2 that are the focus of this work, fog-2 and gld-1, are in large bold font. The upstream genes fog-2 and gld-1, which are key regulators of tra-2 and addressed in this work, are also in large bold font. The gene activities at each level in the hierarchy are indicated below as “ACTIVE” in bold or “inactive” in grey. In L3 and L4 hermaphrodites the activities of fog-2 and gld-1 are high, leading to repression of tra-2 activity (also see [B]) and the de-repression of fem-3, resulting in the onset of spermatogenesis. In L4 and adult hermaphrodites the activity of fog-2 and gld-1 are low, leading to high tra-2 activity and the repression of fem-3, resulting in oogenesis. The shift in tra-2/fem-3 balance allows for the switch from spermatogenesis to oogenesis in an otherwise female somatic gonad in the hermaphrodite.(B) C. elegans FOG-2/GLD-1/tra-2 mRNA ternary complex. Current data indicates that FOG-2 and GLD-1 are required for the translational repression of the tra-2 mRNA [25]. GLD-1 binds as a dimer to the tra-2 mRNA 3′UTR at two 28 nucleotide direct repeat elements (TGE/DRE, blocks) and FOG-2 makes contact with GLD-1 [32,34]. All three components are required for the proper specification of hermaphrodite spermatogenesis.\n", - "5333 \n", - " \n", - "fog-2 Is Likely Absent in C. briggsae\n", - "Low-stringency Southern blotting (A) and conservation of synteny (B and C) were used in an attempt to identify a potential fog-2 gene in C. briggsae.(A) A total of 2–20 ug of digested genomic DNA was used in low-stringency Southern blotting. C. elegans fem-2 probe (Ce_fem-2) was able to detect fem-2 on both same-species and cross-species blots (first two panels). The C. elegans fog-2 probe (Ce_fog-2), which detects both fog-2 and ftr-1 on the 5.8-kb XhoI fragment, produced a signal with C. elegans but not C. briggsae genomic DNA (next two panels). fog-2 cross-species blot integrity was verified by stripping and reprobing with same-species C. briggsae fem-2 (final panel). Same-species exposures were 4 h and cross-species were 4 d. The C. elegans fem-2 probe is 70% identical to the C. briggsae genomic sequence.(B) Scale diagram of the C. elegans Chromosome 5 region containing fog-2. A 82.6-kb enlargement below, indicated by the dashed lines, shows the fog-2 cluster containing five canonical FTR genes, one FTR gene with divergent structure, and 16 non-FTR genes (also see Table S1).(C) C. briggsae contig from the genome assembly containing flanking regions with conserved synteny. A 194.4-kb enlargement below, indicated by the dashed lines, covers the C. briggsae region that is predicted to contain a putative fog-2 ortholog. The conserved genes used to identify the C. briggsae contig are indicated by the arrowheads, with the genes flanking fog-2 indicated by the large arrowheads.Each gene from the C. briggsae contig with an ortholog defined as a reciprocal best BLAST hit is present on both maps (B and C), and blocks of synteny defined by the C. elegans organization are in the same color. Only one (Y113G7B.11) of the 22 genes from the 82.6-kb fog-2 cluster was found to have a reciprocal best BLAST hit in C. briggsae (contig cb25.fpc0129, corresponding to the predicted gene CBG05618; Table S1). No FTR genes or genes related to those in the fog-2 cluster were found within 50-kb on either side of CBG05618, indicating that this region does not share conserved synteny with the fog-2 cluster. Instead, the potential C. briggsae ortholog of Y113G7B.11 is located on a C. briggsae contig region that shows extensive conserved synteny with a different portion of C. elegans Chromosome 5 not involving the fog-2 cluster (Table S2).\n", - "5334 \n", - " The Highly Diverged FOG-2 C-Terminal Region Is Responsible for GLD-1 Interaction in C. elegans\n", - "(A) Dot plot of FOG-2/FTR-1, with the black diagonal line delimiting regions of greater than 70% identity based on a 10-aa sliding window. The dashed horizontal line at the C-terminus indicates a region of low identity. The arrow indicates the final exon 4 boundary.(B) Protein sequence alignment of FOG-2 and FTR-1 encoded by exon 4. Differences are shaded in black and illustrate the abrupt breakdown in sequence conservation. The dashed line marks the region required for GLD-1 interaction.(C) Nucleotide alignment of fog-2 and ftr-1 EST coding regions expanded from a portion of the protein sequence alignment, with vertical lines delimiting the reading frame relative to fog-2. Amino acid sequence for FOG-2 (above) and changes in FTR-1 (below) are below the alignment. Frame-shifting indels are indicated by the large open arrowheads.(D) The C-terminal FOG-2 region is required for GLD-1 interaction in the yeast two-hybrid system. Full-length FOG-2 (black) and FTR-1 (grey) constructs were tested for interaction with GLD-1. FOG-2 interacts with GLD-1 (++++) whereas FTR-1 does not (−). Progressive C-terminal deletions (black) in FOG-2 were generated to identify FOG-2 requirements for GLD-1 interaction. Binding to GLD-1 was completely eliminated with the removal of the C-terminal 64 aa of FOG-2 exon 4. Transfer of exon 4 to FTR-1 (grey/black chimera) resulted in the transfer of GLD-1 binding to FTR-1. Control interactions to test for the production of functional proteins were performed with the Skp1 homolog SKR-1, which binds to the F-box region (see Materials and Methods). Searches for C. elegans and C. briggsae proteins with homology to the 64-aa FOG-2 region required for GLD-1 interaction (or FOG-2 exon 4) failed to identify any predicted proteins with significant homology (>35% or e-value = 0.01) other than FTR-1, which cannot bind GLD-1 and does not compensate for FOG-2 in sex determination.(E) Sliding-window (100-nt window, 25-nt shift) estimation of Ka/Ks ratio for fog-2/ftr-1 using full-length average Ks. The Ka/Ks ratio is highest at the C-terminal end of the Duf38/FTH domain, reaching a peak of 2.2 in window 37. The position of the F-box and Duf38/FTH domain are indicated by grey shading. The bold horizontal line is at the Ka/Ks = 1 threshold. The dashed vertical line indicates the boundary between exon 3 and exon 4.\n", - "5335 \n", - " GLD-1 Has the Opposite Sex Determination Function in C. elegans and C. briggsae\n", - "For (A) and (B) the distal end of the gonad arm is indicated by the asterisk, and regions of the germline are delimited by dashed vertical lines as follows: M, mitotic zone; TZ, transition zone; P, pachytene; Pa, abnormal pachytene; and S, spermatocytes. For both (A) and (B) staining indicated is as follows: DAPI, blue, nuclear DNA; GLD-1, green; and MSP, red.(A) RNAi of C. briggsae gld-1 results in masculinization of the germline. Paired DAPI-stained (left) and GLD-1- and MSP-stained (right) images of dissected young adult hermphrodite germlines. Top four panels illustrate the similarity between C. elegans and C. briggsae germline morphology and polarity (DAPI, blue; GLD-1, green; MSP, red). In both species, sperm (“sperm” arrow) are produced first before switching to oogenesis (“oocytes” arrow), and the pattern of cytoplasmic GLD-1 accumulation (green) is identical. GFP-injected controls were identical to wild-type animals. C. briggsae gld-1 RNAi animals exhibit masculinization of the germline (lower panels). A vast excess of sperm extends to the loop region (“sperm” arrows), and spermatogenesis extends further distally (solid line). Masculinization is confirmed by a corresponding extension in MSP staining beyond the loop (compare lower right to controls above).(B) RNAi of gld-1 and fog-3 in C. elegans and C. briggsae results in a similar tumorous germline phenotype. C. elegans (top) and C. briggsae (bottom) have normal mitotic, transition, and entry into pachytene, but abnormal progression through pachytene, based on DAPI morphology. Both MSP and GLD-1 staining were below the level of detection in both cases.\n", - "5337 \n", - " Snail Is Expressed Exclusively in the Hair Bud during MorphogenesisEmbryos were either frozen in OCT embedding compound (A, F, and H) or embedded in paraffin (C, D, E, and G), and then sectioned (8 μm).(A) In situ hybridizations with Snail sense or antisense cRNA probes. Black dotted lines demarcate the basement membrane that separates the epidermis (epi) from dermis (der). Arrows point to Snail RNA expression, restricted to the hair bud stage of follicle morphogenesis. It was not seen in later hair germ or peg stages.(B) Expression of Snail protein coincides with hair development. Protein extracts were prepared from keratinocytes transfected with empty expression vector (K14), containing the K14 promoter or with the vector driving HA-tagged Snail (K14-Snail); or from whole skin from E13.5 to P5 animals, including newborn (nb). Equal amounts of proteins were then resolved by SDS-PAGE through 12% gels and subjected to Western blotting using either an affinity-purified Snail polyclonal antiserum, which we generated, or anti-tubulin (loading control).(C–E) Immunohistochemistry shows expression of Snail protein in the nuclei of cells within the hair and skin. (C) E13.5 skin with a single layered epidermis (epi) shows no Snail expression. (D) The first morphological sign that cells have adopted a hair follicle fate is a cluster of cells called a placode in E16.5 skin. Snail is not expressed at this stage of development. (E) Snail is expressed in the hair bud of E17.5 skin but not in later stages of development such as the germ or peg.(F) Immunofluorescence with anti-Ki67 (green) identifies the proliferating cells of the skin, restricted to the basal layer of the epidermis and developing hair follicles. Anti-β4 int labeling reveals the presence of the hemidesmosomal integrin β4, restricted to the base of cells adhering to the underlying basement membrane. The white dotted line marks the outermost surface of the skin.(G) Immunohistochemistry with pMAPK marks a subset of proliferating cells within the epidermis and hair bud. Anti-pMAPK labeling was consistently robust within the hair bud.(H) Immunofluorescence with anti-laminin 5 (lam5), which demarcates the basement membrane, and anti-E-cadherin (E-cad), a component of AJs. At the leading edge of the growing bud, cell-cell borders show markedly diminished anti-E-cadherin labeling (arrowheads).\n", - "5338 \n", - " Misexpression of Snail in Mouse Skin Epidermis Results in HyperproliferationThree different surviving Tg founder mice harbored a K14-Snail transgene that was integrated into a locus that resulted in inheritable, mosaic expression of the transgene in skin epidermis. All displayed similar abnormalities, as did their offspring.(A) P16 WT and K14-Snail Tg mice. Insets denote magnified tail segments, which displayed a mosaic, flaky appearance in Tg mice. Size differences appeared with age, and are likely due to K14-promoter activity in the tongue and oral epithelium, resulting in progressive defects and reduced food intake. Hence, skin sections from young (P3) mice were analyzed (B–I).(B) Hematoxylin- and eosin-stained Tg skin section. Double arrows demarcate the border of mosaic histology, with seemingly normal epidermis (epi) and a mature hair follicle (hf) at left and hyperthickened epidermis at right.(C) Immunofluorescence of Tg skin section labeled with antibodies as color-coded on frame. Double arrows demarcate the border of mosaic anti-Snail (green), revealing Snail expression coincident with regions of hyperthickened epidermis (at left) and absent in regions of normal epidermis (at right).(D–I) Sections of P3 WT or Tg skin (affected region) subjected to either immunofluorescence (D, E, H, and I) or immunohistochemistry (F and G) with antibodies as indicated on the panel. Anti-keratin 5 indicates K5, normally restricted to the basal layer of the epidermis; anti-keratin 6 detects keratin 6, expressed in postnatal epidermis under conditions such as wounding, in which hyperproliferation occurs. All other antibodies are as in the legend to Figure 2. Comparison of D and E provide representative examples that illustrate that pMAPK is found in only a subset of all proliferating (Ki67-positive) cells. Note also the presence of Ki67- (E) and pMAPK-positive (G) cells in some suprabasal areas; Ki67-positive cells colabeled with anti-Snail (E).\n", - "5340 \n", - " Snail-Mediated Remodeling of AJs Contributes to Hyperproliferation(A) Immunofluorescence of skin sections from P30 Wt and Tg mice. Shown are affected areas of Tg skin; in areas where Snail protein was not expressed, stainings were normal. Antibodies used are against AJ proteins and include E-cadherin (E-cad), the transmembrane core protein; β-catenin (β-cat), which binds E-cadherin at AJs and which can also participate as a transcription cofactor when associated with LEF-1/TCF proteins in the nucleus; α-catenin (α-cat) which binds to both β-catenin and Ajuba, a close relative of zyxin; and Ajuba, which can associate with proteins that bind to the actin cytoskeleton, as well as with Grb-2, a mediator of the GTP nucleotide-exchange protein Sos, involved in activation of the Ras-MAPK signaling cascade. In Snail-expressing Tg regions, there was a reduced staining with anti-E-cad and anti-α-cat and a more diffuse staining with anti-Ajuba. Insets in the panels for β-catenin and Ajuba staining are magnified views of the boxed areas. Arrows mark membrane localization of the protein and asterisks mark cells with elevated levels of cytoplasmic β-catenin or Ajuba.(B) Western blot analyses of protein extracts from P30 Wt and Tg back and ear skins. Antibodies are as in (A) except anti-P-cad, which detects P-cadherin, whose expression in the hair follicle was not affected, and anti-tubulin, which detects tubulin, a control for equal protein loadings. Note that the reductions seen in E-cadherin and α-catenin are likely to be underestimates of the actual differences in affected regions, since the Tg skin expressed Snail mosaically.(C) In the presence of elevated Snail, α-catenin levels can be restored by overexpression of E-cadherin. Keratinocytes were transfected with either HA-tagged Snail (Snail[HA]; images on the left) or Snail(HA) and Ecad(HA) (images on the right). 2 d after transfection, cells were switched from low-calcium growth medium to high-calcium medium for 6 h to induce AJ formation. Cells were stained with antibodies as indicated on the panels. Arrowheads point to sites of intercellular contact between a Snail-transfected keratinocyte and its neighboring untransfected cell.(D) Reintroduction of E-cadherin in keratinocytes expressing Snail returns pMAPK to basal levels. Keratinocytes were transfected with control vector (K14), or Snail(HA), or Snail(HA) + E-cad(HA). After 2 d, cells were serum starved for 4 h and whole cell lysates were made and Western blotted with antibodies to pMAPK, HA to recognize the HA-tagged Snail and E-cadherin protein, 20or tubulin as a loading control.(E) Ajuba interacts with Grb-2 under conditions where α-catenin levels are reduced. Protein extracts were made from skins of P30 Wt and K14-Snail Tg P30 mice (blots on the left) and of newborn Wt and K14-Cre/α-catenin (fl/fl) conditionally null animals (blots on the right) [7]. Equal amounts of protein extracts were treated with anti-Grb-2 antibody (+) or control isotype antibody (–), and following centrifugation, immunoprecipitates were subjected to SDS-PAGE and Western blot analysis with anti-Ajuba and anti-Grb-2 antibodies. Note the presence of Ajuba only under conditions where levels of α-catenin and other AJ proteins were aberrantly low or absent.(F) Transgene expression of excess Ajuba or the Grb-2-interacting domain (pre-LIM) of Ajuba in keratinocytes results in the activation of the Ras-MAPK pathway. Primary newborn mouse keratinocytes were transfected with either the empty K14 expression vector (K14), or the expression vector driving Snail, full length Ajuba, or the pre-LIM domain of Ajuba in the absence or presence of a peptide inhibitor (inh) that disrupts the interaction between Grb-2 and Sos. 48 h posttransfection, protein extracts were prepared and subjected to SDS-PAGE and Western blot analyses with antibodies against pMAPK, total MAPK, Ajuba (also recognizing the smaller, pre-LIM domain), and Snail.\n", - "5341 \n", - " TGF-β2, but Not Wnt/noggin, Transiently Induces Snail Expression In Vitro(A) Failure of Wnt and noggin signaling to induce Snail in cultured keratinocytes. Primary mouse keratinocytes were treated with Wnt- and/or noggin-conditioned medium (+) or the corresponding control medium (–). These conditions are known to activate the LEF-1/β-catenin reporter TOPGal and down-regulate the E-cadherin promoter (see [4] for details). Using Western blot analyses, cellular proteins were then analyzed for Snail, LEF-1, β-catenin, and tubulin. Proteins from keratinocytes transfected with K14-Snail were used as a positive control for Snail expression.(B) TGF-β2 can induce Snail protein. Primary keratinocytes were treated for the indicated times with recombinant TGF-β2 (+) or heat inactivated TGF-β2 (–).Total cellular proteins were then isolated and analyzed by Western blot for Snail, pSMAD2 (reflective of activated TGF- signaling), and tubulin. Note the activation of Snail expression, peaking at 2 h post-TGF-β2 treatment and then disappearing thereafter.(C) Snail mRNA expression is transiently induced by TGF-β2. The experiment in (B) was repeated, and this time, total RNAs were isolated from keratinocytes treated with TGF-β2 for the indicated times. RT-PCR was then used with (+) or without (–) reverse transcriptase (RT) and with primer sets specific for Snail and GAPDH mRNAs. Note that Snail mRNA expression also peaked at 2 h, paralleling Snail protein.(D) TGF-β2 treatment results in enhanced activity of a Snail promoter-β-galactosidase reporter. Keratinocytes were transfected with a β-galactosidase reporter driven by a Snail promoter that is either WT (wt prom) or harbors a mutation in a putative pSMAD2/pSMAD4 binding site (mt prom). At 2 d posttransfection, cells were treated with either TGF-β or heat-inactivated TGF-β2 (inact) for the times indicated. β-galactosidase assays were then conducted, and results are reported as fold increase over a basal level of activity of 1. The experiment was repeated three times in triplicate, and error bars reflect variations in the results.\n", - "5342 \n", - " TGF-β2 Is Necessary to Induce Snail Expression and Regulate Proliferation and E-Cadherin in the Hair Bud(A–D) Skins from TGF-β2 WT or KO E17.5 embryos were analyzed for expression of TGF-β2 protein (A), which is present in the epidermis and dermis as previously described [33] and in the hair bud, pSMAD2 (B), Snail (C), and Snail mRNA (D). Arrows point to the hair buds.(E) Western blot analyses of Snail expression in the skins of 2-wk-old K14-Smad2 transgenic (SMAD2 TG) and WT littermate (WT) mice. Antibody to tubulin was used as a control for equal protein loadings. The K14-Smad2 Tg mouse was previously shown to possess activated TGF-β signaling [35].(F–G) Proliferation markers Ki67 (F) and pMAPK (G) are diminished in TGF-β2-null hair relative to its WT counterpart.(H–J) TGF-β2-null hair fails to down-regulate E-cadherin (H). Wnt and noggin signaling pathways are still intact in the TGF-β2 null hair as nuclear LEF-1 (I) and nuclear β-catenin (J) are still expressed.\n", - "5347 \n", - " The Fold of MetE and Similarities between the Two Barrels(A) MetE folds into two (βα)8 barrels. The N-terminal barrel (aqua) is joined to the C-terminal barrel (yellow) by a 35-residue inter-domain linker (gray) that spans 65 Å. Except for the α1 helix (at the right), the linker residues are in extended conformations. This view is along the approximate 2-fold axis that relates the two barrels. The drawing is based on coordinates for zinc-replete MetE in complex with CH3-H4folate (Table 1). The zinc ligands, zinc, and CH3-H4folate are shown in ball-and-stick representation. This figure and all subsequent figures were prepared using RIBBONS [43]. See Figure 1 for the nomenclature used to describe secondary structures.(B) A side-by-side view of the barrels of MetE, arranged to show the similarities of the β–α loop extensions. Major extensions that follow the first four β strands of the barrels are shown in cyan and gold for the N-terminal and C-terminal barrels, respectively. The drawing is based on coordinates for the zinc-replete binary complex with folate (not shown). The active site is located in the C-terminal barrel (on the right) between the extra-barrel β hairpin of the β2–α2 loop and the C-termini of the barrel strands. Zinc is gray and the zinc ligands, His618, Cys620, Glu642, and Cys704, are shown in ball-and-stick mode.\n", - "5349 \n", - " The Geometry at the Zinc Ion in Complexes with Hcy(A) Interactions of Hcy in the MetE·Hcy binary complex. The amino group of Hcy is bound by hydrogen bonds to Asp577, Glu462, and the backbone carbonyl of Ile409; the Hcy carboxyl group interacts with the backbone amide and side chain hydroxyl of Ser411. The Hcy sulfur is coordinated to zinc via a long (3.15 Å) bond, which is eclipsed in this view.(B) Superposition of the MetE resting state (gray) and the Hcy binary complex (yellow). Upon Hcy binding, zinc and His618 move away from Glu642 and closer to Hcy, and the zinc site adopts trigonal bipyramidal geometry with three strong equatorial ligands (Zn–NHis618, 2.07 Å; Zn–SCys620, 2.23 Å; Zn–SCys704, 2.24 Å) and two distant axial ligands (Zn–OGlu642, 2.90 Å; Zn–SHcy, 3.13 Å). Zinc moves 0.75 Å toward the substrate in the Hcy complex. Full inversion at zinc, upon tight binding of Hcy to MetE, would displace the metal ion approximately 1.5 Å.(C) The MetH·Hcy complex. The zinc configuration in substrate-free MetH is opposite to that found in MetE; binding of Hcy occurs without inversion in MetH and in BHMT.(D) Difference electron density for the MetE·Hcy complex, showing the geometry at the metal-binding site. The map was computed after simulating annealing and refinement of a model omitting the zinc and its five neighbors. The long Zn–Hcy and Zn–Glu642 interactions are indicated with dashes. Contour levels are 2σ (green) and 6σ (orange).\n", - "5350 \n", - " Interactions of CH3-H4folate with MetE(A) A stereoview of T. maritima MetE showing the substrate and metal-binding sites. This is a composite picture in which Hcy from the MetE·Hcy complex has been positioned by superposition on the structure of the MetE·CH3-H4folate binary complex. The substrates and metal ligands are displayed in ball-and-stick mode; Hcy is in green.(B) A stereoview of the zinc site and bound CH3-H4folate. Folate is bound by conserved residues in the N-terminal barrel (aqua) and the C-terminal barrel (yellow) with the N5-CH3 facing away from the zinc, at a distance of almost 14 Å. The pterin interacts with the long hairpins of both barrels and with the extra-barrel helices α3AH and α4AH. The groove that binds the glutamate tail of the substrate is bordered by α1AF, by the β hairpin (β2BH and β2CH) and α1AH of the C-terminal domain, and by the conserved DMV sequence that begins α2AH.\n", - "5365 \n", - " Summary of annotated EST clusters and unique representativeness of the selected probes in three GO domains: molecular function, biological process and cellular component. EST clusters contain at least one annotated sequences (noted as \"cluster annotated*\" in the legend) and unique annotations of selected microarray probes in each of the three Gene Ontology (GO) domains. (A) Molecular Function (MF) (B) Biological Process (BP) and (C) Cellular component (CC). Although fewer annotated EST clusters (number of clusters containing at least one annotated sequences) were formed using single linkage method compared to those selected using the other two linkage methods given a fixed number of cluster within the middle range (~60–442 clusters), more functionally unique probes were selected among the formed clusters by single linkage method\n", - "5367 \n", - " Summary of uniquely annotated and unannotated sequences in three Gene Ontology (GO) domains. The percentage of unique annotated sequences, \"redundant\" annotated sequences, and sequences have annotations in some of the three GO domains, but not in the particular domain of interest, and sequences have no similar gene products found in the Gene Ontology (GO) database (BlastX E-value was set at 10-6) among 971 L. setiferus ESTs. Three GO domains are (A) molecular function, (B) biological process and (C) cellular component.\n", - "5384 \n", - " Histomorphologic appearance of the primary gastric carcinoma (A) and a paragastric lymph node metastasis (B). Photomicrograph shows that the primary tumor is mainly composed of solid and tubular formations, whereas, a marked desmoplastic stromal reaction is seen in the lymph node metastasis. (hematoxylin and eosin × 40).\n", - "5397 \n", - " Gross post-delivery image of dichorionic-diamnionic placenta showing sites of umbilical cord insertions (*). The placenta associated with the nonviable 19-week spontaneous abortion (A) demonstrates atrophy, in contrast with normal placenta from the aftercoming liveborn twin (B).\n", - "5415 \n", - " Effect of BS upon the BALB/MK cells transduced with LBmSN On day 1, BALB/MK cells were seeded on a 24-well plate at 1 × 104 cells/well, and 1 × 106 cells of the virus producing cell lines PA317/LBmSN (2 × 105 cfu/ml) and PA317/LXSN (5 × 106 cfu/ml) were seeded in 25 cm2 flasks. On day 2, the media of PA317 cell clones were replaced with EMEM without EGF. On day 3, the media of PA317 cells containing virus were harvested, centrifuged at 10000 rpm per 1 min in Eppendorf centrifuge. The media of BALB/MK cells were replaced with 0.5 ml of virus solution and supplemented with 5 ng/ml EGF and 8 μg/ml Polybrene. On day 4, the media were replaced with fresh EMEM in the following conditions. After 12 days, the cells were stained with Coomassie Blue and photographed. The results are representative of at least three experiments, which gave essentially the same results. (A) BALB/MK; (B) BALB/MK + 500 μg/ml G418; (C) BALB/MK + 8 μg/ml BS; (D) BALB/MK/LXSN + 500 μg/ml G418; (E) BALB/MK/LXSN; (F) BALB/MK/LXSN + 8 μg/ml BS; (G) BALB/MK/LBmSN; (H) BALB/MK/LBmSN + 500 μg/ml G418; (I) BALB/MK/LBmSN + 0.05 μg/ml BS; (J) BALB/MK/LBmSN + 0.1 μg/ml BS; (K) BALB/MK/LBmSN + 0.2 μg/ml BS; (L) BALB/MK/LBmSN + 0.5 μg/ml BS; (M) BALB/MK/LBmSN + 1 μg/ml BS; (N) BALB/MK/LBmSN + 2 μg/ml BS; (O) BALB/MK/LBmSN + 4 μg/ml BS; (P) BALB/MK/LBmSN + 8 μg/ml BS; (Q) BALB/MK/LBmSN + 16 μg/ml BS; (R) BALB/MK/LBmSN + 32 μg/ml BS(S) Five days after the LBmSN transduction, the cells were detached with trypsin and stained with Trypan blue. Left and right sides represent BALB/MK (control) and BALB/MK/LBmSN cells respectively.\n", - "5416 \n", - " Phase contrast microscopic appearance of the BALB/MK cells transduced with LBmSN The cells were cultured and transduced as described above. After 8 days of the transduction, the cells were photographed (X 200). The results are representative of at least five experiments, which gave essentially the same results. (A) BALB/MK; (B) BALB/MK/LBmSN + 8 μg/ml BS; (C) BALB/MK/LBmSN\n", - "5417 \n", - " The effect of the concentration of the virus LBmSN upon BALB/MK cells The cells were cultured and transduced as described in Figure 1, however the virus concentration in each plate varied as follows. After 10 days of the transduction, the cells were stained with Coomassie Blue and photographed. The results are representative of at least three experiments, which gave essentially the same results. (A) BALB/MK + 8 μg/ml BS; (B) BALB/MK + 102 cfu of LBmSN + 8 μg/ml BS; (C) BALB/MK + 103 cfu of LBmSN + 8 μg/ml BS; (D) BALB/MK + 104 cfu of LBmSN + 8 μg/ml BS; (E) BALB/MK + 105 cfu of LBmSN + 8 μg/ml BS; (F) BALB/MK; (G) BALB/MK + 102 cfu of LBmSN; (H) BALB/MK + 103 cfu of LBmSN; (I) BALB/MK + 104 cfu of LBmSN; (J) BALB/MK + 105 cfu of LBmSN\n", - "5419 \n", - " The lethal effect of the supernatant from the BALB/MK cells transduced with LBmSN On day 1, BALB/MK cells were seeded on a 6 well plate at 4 × 104 cells/well, and 1 × 106 cells of the virus producing cell lines PA317/LBmSN and PA317/LXSN were seeded in 25 cm2 flasks. On day 2, the media of the PA317 cell clones were replaced with the EMEM supplemented with 10 % FBS and without EGF. On day 3, the media of PA317 cells containing virus were harvested, centrifuged at 10,000 rpm per 1 min in Eppendorf centrifuge. The media of BALB/MK cells were replaced by 2 ml of virus solution and complemented with 5 ng/ml of EGF and 8 μg/ml of Polybrene. In parallel, 1 × 104 BALB/MK cells were seeded on a 24 well plate. On day 4, the media were replaced by fresh ones. On day 5, the medium of BALB/MK cells was replaced by 0.5 ml of the medium of the LBmSN transduced BALB/MK cells, which was previously centrifuged at 10,000 rpm/ 1 min. After 7 days, the cells were photographed (X 200). The results are representative of at least three experiments, which gave essentially the same results. (A) The BALB/MK cells incubated with supernatant of BALB/MK cells transduced with LXSN; (B) The BALB/MK cells incubated with supernatant of BALB/MK cells transduced with LBmSN.\n", - "5420 \n", - " Effect of BS upon the human keratinocytes transduced with LBmSN vector On day 1, the irradiated PA317/LBmSN cells (30 Gy) and the human keratinocytes were seeded together at 3.3 × 105 and 5 × 104 cells per well respectively in a 12 well plate. Two days later, the medium was replaced with a fresh one containing the indicated concentrations of antibiotics. The cells were stained with Rhodamine B after 8 days. (A) no antibiotic; (B) 800 μg/ml G418; (C) 8 μg/ml BS; (D) 12 μg/ml BS; (E) 16 μg/ml BS; (F) 32 μg/ml BS\n", - "5421 \n", - " Effect of BS upon the keratinocytes transduced with LBmSN and selected with BS The keratinocytes were cultured and selected with 8 μg/ml BS as described in Figure 5. When the keratinocytes reached 70 % confluence, the cells were divided into two parts and transferred to 2 wells of a 12-well plate that contained the irradiated NIH3T3 cells. In one well the cells were maintained without BS (A) and in another with 8 μg/ml BS (B). The cells were stained with Rhodamine B after 10 days.\n", - "5429 \n", - " Cone ECl estimated from the reversal of ICl(Ca). A) ICl(Ca) tail current was activated by applying a 500 ms step from -78 to -18 mV during a gramicidin perforated patch whole cell recording from a rod. A ramp voltage protocol (-98 to +52 mV, 1 mV/ms) was applied during the tail current and begun 25 ms after termination of the step. B. The same protocol was then repeated in the presence of niflumic acid (0.1 mM) to inhibit ICl(Ca). C. The ramp current/voltage relationship obtained in control medium (A) was subtracted from that obtained in the presence of niflumic acid (B) to yield a niflumic acid-sensitive difference current that reversed in this cell around -46 mV (after correcting for a liquid junction potential of -8 mV).\n", - "5477 \n", - " FRAP analysis of wild type and mutant lamin As. A and B) Single z-plane confocal images of GFP-tagged (A) wt and (B) N195K lamin A expressing cells. Images were captured before (t = -5) and immediately after (t = 0) photobleaching of an area of the nuclear periphery, and at 5 min intervals thereafter. The bleach region is boxed in red. C) Graphs of mean (± s.e.m) relative fluorescence in the bleach area during FRAP, averaged over 9 cells each. In each graph, data for wt (black) and a mutant (red) lamin A are compared.\n", - "5513 \n", - " P. falciparum stage sensitivity to AD2646. Parasites at the ring (A), trophozoite (B) and schizonte (C) stages were maintained in the presence of 30 nM (square) or 100 nM (triangle) AD2646 for 24 h30, 11 h and 14 h, respectively. Aliquots were then taken, washed and maintained in culture in the absence (open symbol) or in the presence (full symbol) of the same concentration of analog. Controls were cultures maintained in the absence of drug (full circle) and processed as the treated cultures. Parasitemia and parasite morphology were determined on Giemsa-stained smears at the indicated time. Each value is the mean of two independent experiments.\n", - "5515 \n", - " Effects of AD2646 and PPMP on the formation of the tubovesicular network of P. falciparum. Infected erythrocytes at the ring stage were incubated for 24 hours in presence of 60 nM AD2646 (B) or 5 μM PPMP (C). TVN formation in treated cells and untreated cells (A) was evaluated by membrane staining using BODIPY-Fl-C5-ceramide. Arrow: TVN. Bar: 5 μm.\n", - "5517 \n", - " Schematic representation of HTLV/MLV Env chimeras and HTLV SU amino terminal subdomains. Env landmark positions are indicated and SU landmark sequences and positions are indicated by arrowheads. Open arrowheads indicate the position of construct borders. (A) HTLV/MLV Env chimeras. The H1215FEnv and H1183FEnv HTLV/MLV Env chimeras were obtained by replacing the 329 and 269 amino terminal residues of the F-MLV Env (open boxes) with the amino terminal 215 and 183 amino acid residues of the HTLV-1 Env (solid boxes), respectively. The H1215FEnv chimera, previously described and formerly designated HHproFc [9], has been renamed here for sake of nomenclature homogeneity. (B) Soluble HTLV-1 (H1) and HTLV-2 (H2) SU amino terminal subdomains, H1215SU, H2211SU, H1179SU, and H2178SU were constructed as fusion proteins with a carboxy terminal hemagglutinin (HA) or rabbit immunoglobulin Fc (rFc) tag. All amino acid residue numbering starts from the first methionine of the HTLV-1 or -2 Env signal peptide, the amino terminal 20 and 21 aa residues, respectively.\n", - "5518 \n", - " Intracellular expression of HTLV-1 Env chimeras and soluble SU subdomains. Cell extracts (A, B) or culture supernatants (C) were prepared from 293T cells transfected with either full length Env (A) or soluble SU subdomains (B, C) expression vectors as depicted in figure 2. Membranes were probed with either (A) an anti-MLV SU antiserum to detect F-MLV and H1183FEnv uncleaved Env precursor proteins (F-MLV Prgp85 and H1183Fenv Pr, respectively) indicated by arrowheads, and cleaved SU (F-MLV SUgp70 and H1183FEnv SU, respectively) indicated by circles, or (B, C) an anti-rabbit IgG antiserum to detect carboxy terminal rFc-tagged soluble subdomains, including the Ampho-MLV SU subdomain (A397SU).\n", - "5519 \n", - " HTLV-1 and -2 SU subdomains interfere with HTLV Env SU cell surface binding. (A) Conditioned medium from control 293T cells (open histograms) or from 293T cells expressing soluble rFc-tagged HTLV-1 H1215SU, HTLV-2 H2211SU and H2178SU, or Ampho-MLV A397SU subdomains (filled histograms), were incubated with A23 hamster cells for 30' at 37°C and binding was assessed by flow cytometry following addition of a secondary FITC-conjugated anti rabbit IgG antibody. Similar results were obtained in binding assays performed using all cell lines described in the text. (B) To assess binding interference, target 293T cells were transfected with the indicated Env construct and subsequently incubated with the HA-tagged H2178SU domain (filled histograms). Binding was detected by FACS following incubation with an anti HA 12CA5 mouse mAb and a FITC-conjugated anti mouse IgG antibody. Open histograms represent background levels of fluorescence. SU constructs are schematically represented below each graph by solid (HTLV), open (F-MLV) or grey (Ampho-MLV) boxes.\n", - "5522 \n", - " HTLV-1 SU amino terminal domain mutants. (A) H1215SU constructs were generated with the following SU amino terminal point mutations; R94A, S101A, D106A and Y114A. The abilities of these soluble H1215SU constructs to bind 293T cells were assessed by flow cytometry (gray histograms). The levels of expression of the various soluble SU subdomains are shown under each histogram. The abilities of the H1215SU mutants to interfere with (B) HTLV Env-induced cell fusion and (C) MLV(HTLV) pseudotype infection was assayed as described in Figs. 5 and 6. Data are representative of at least three independent experiments performed in duplicate. Error bars represent the standard error of the mean.\n", - "5544 \n", - " Effects of 17P on myometrial contractility in non-pregnant tissue. Representative recordings of spontaneous contractions in PSS only (A), the effects of cumulative additions of 17P vehicle (B), and the effects of cumulative additions of 17P (C) are shown.\n", - "5545 \n", - " Effects of 17P on myometrial contractility in pregnant tissue. Representative recordings of oxytocin-induced contractions in PSS only (A), the effects of cumulative additions of 17P vehicle (B), and the effects of cumulative additions of 17P (C) are shown.\n", - "5554 \n", - " Coronary physiologic intimal thickening. This changes starts as nodular (already visible at birth at the site of vessel bifurcation) smooth muscle cells (A) and elastic fibrils (B) hyperplasia which in the second decade is diffuse to the whole intimal surface of all extramural arterial vessels. With aging there is a progressive increase of fibrous tissue which substitutes myo-elastic tissue (C, D) with final total, anelastic, fibrosis (E, F). Arteriosclerosis distinct from atherosclerosis\n", - "5555 \n", - " Comparison between the intimal thickening of the LAD (A) and the middle cerebral artery (B) of the same 18-year old subject. In the latter artery the intimal thickening is minimal in contrast to that of LAD which is circumferential with a thickness greater than tunica media. C), difference in maximal thickness in microns found in main coronary arteries and branches in respect of the middle cerebral artery. D), absence of intimal thickening in the LAD of dogs, despite and identical morpho-function. This suggests a possible role of the neurogenic control of coronary arteries in humans. On the other hand the absence of intimal thickening in the \"mural tract\" of coronary arterial vessels (E) emphasizes the role of systolic dynamic stresses on arterial wall free to expande versus those protected by encircling contracted myocardium.\n", - "5556 \n", - " Natural history of the coronary atherosclerotic plaque in general population, including most of CHD patients. The starting point is a nodular hyperplasia of smooth muscle cells and elastic tissue with progressive fibrous replacement. No other changes as subendothelial lipo-protein-cholesterol storage, inflammatory process of any type, platelet aggregation and/or fibrin-platelet thrombi are found (A). Proteoglycan accumulation in the deep intima between tunica media and the fibrous cap is the second step (B). In this proteoglycan pool, lipo-protein/cholesterol cleft, in macrophages (\"foam cells\") and/or Ca++ salts appear. Vascularization of the plaque and hemorrhage (C) follow. In the stage of proteoglycan accumulation, lympho-plasmacellular infiltrates occur in the adventitia and intima (C) with specific localization, around adventitial nerves closed to the tunica media (medial neuritis) (D, E). This natural history is totally different from that obtained experimentally by hypercholesterol diet in animals free of spontaneous atherosclerosis or in the small group of patients with familial hypercholesterolemia (F), in which transendothelial lipo-protein insudation is the starting point.\n", - "5557 \n", - " Coronary atherosclerosis. Different aspect of a severe, pin-point lesion (arrow). Plaque with prevailing atheroma (A) or fibrosis (B). Plaque with pale, large zone of proteoglycan accumulation (C) or with small atheroma plus hemorrhage and proteoglycans associated with critical stenosis occluded by an acute thrombus (D). Sequence in the same plaque of \"rupture\" (E) followed by severe hemorrhagic atheroma with minimal, linear lumen (arrow) without occlusion(F). Occlusive thrombosis connected with hemorrhagic atheromasia at the site of a critical stenosis (G). Semilunar stenosis (H) with a normal half wall and minor lumen reduction. The concept of vessel wall remodeling to compensate plaque growth has not any support (very low frequency of this type of lesion versus severe concentric lumen reduction in the natural history of coronary heart disease).\n", - "5593 \n", - " Receptor Neuron Responses for Two-Click Stimuli(A) Stimulus parameters. Acoustic stimuli consisted of two short clicks with amplitudes A\n", - "1 and A\n", - "2, respectively, separated by a peak-to-peak interval Δt. The clicks were triangular and had a total width of 20 μs. The peak-to-peak interval was generally less than 1.5 ms.(B) Raster plots of spike responses. Spike times obtained from a single receptor neuron with four different peak intensities (83–86 dB SPL) are shown for 30 runs each. For the different intensities, both click amplitudes were varied while their ratio was kept fixed, with intensity values referring to the larger click amplitude. The inter-click interval in this example was 40 μs. The values of p denote the measured spike probabilities. The inset displays spike times from the strongest sound stimulus at higher magnification. All spikes fall in a temporal window between 4.5 and 5.5 ms after stimulation. Spike times were recorded with a temporal resolution of 0.1 ms. These data illustrate that the response of the receptor cell is well described by the occurrence probability of a single spike in a rather broad time window, for example, between 3 and 10 ms after stimulus presentation. As is often observed for these receptor cells, there is virtually no spontaneous activity.\n", - "5594 \n", - " Measurements of Iso-Response Sets and Identification of Relevant Stimulus Parameters(A) Acoustic stimuli. The stimuli consisted of two short clicks with amplitudes A\n", - "1 and A\n", - "2 that were separated by a peak-to-peak interval Δt, here shown for Δt = 40 μs (upper trace) and Δt = 750 μs (lower trace).(B–D) Examples of iso-response sets from three receptor cells. Here, as throughout the paper, iso-response sets correspond to a spike probability of 70%. Each panel shows iso-response sets from a single receptor cell for two different values of Δt, one smaller than 100 μs (filled circles) and one larger (open squares). The solid lines denote fits to the data of either straight lines or circles. The values for Δt used in the experiments are indicated in the respective panels. All error measures display 95% confidence intervals. For the short intervals, the data are well fitted by straight lines (A\n", - "1 + A\n", - "2 = constant). For the long intervals in (B) and (C), circles (A\n", - "1\n", - "2 + A\n", - "2\n", - "2 = constant) yield good fits; a slight asymmetry is clearly visible in (C). The data for the intermediate inter-click interval Δt = 120 μs in (D) are not well fitted by either of these shapes. Here, the measured points are connected by a dashed line for visual guidance. Note that in (B) the overall sensitivity of the neuron seems to have changed; the intersections of the straight line and the circle with the x- and y-axis do not match exactly although the stimulus in these cases is the same, a single click. The reason may be either a slow adaptation process or a slight rundown of the recording over the experimental time of around 30 min. However, this does not account for the more prominent differences in shape of the two iso-response sets. These examples demonstrate that on different time scales, different stimulus parameters are relevant for the transduction process, the amplitude A of a sound stimulus for short times and its energy A\n", - "2 for long times.\n", - "5596 \n", - " Temporal Structure of the Mechanical Oscillation and Electrical Integration(A) Stimulus patterns. Two clicks were presented, separated by a time interval Δt. The first click (amplitude A\n", - "1) was held constant throughout this experiment. The second click was presented in the same direction as the first click (solid line, amplitude A\n", - "2) or in the opposite (“negative”) direction (dashed line, amplitude Ã\n", - "2). The click amplitudes A\n", - "2 and Ã\n", - "2 were adjusted to fall in the desired iso-response set.(B–G) Mechanical oscillation and electrical integration of a high-frequency (B and E) and two low-frequency (C and F, and D and G, respectively) receptor neurons.(B–D) Time course of the eardrum vibration. The individual values (circles) were calculated from the measured values of A\n", - "2 and Ã\n", - "2 for each Δt. The results are compared with a theoretical curve from a damped harmonic oscillator (solid line) with fundamental frequency f and decay time constant τ\n", - "dec fitted to the data.(E–G) Time course of the electrical integration process. The measured data are compared to an exponential fit (solid line) with a time constant τ\n", - "int.\n", - "5597 \n", - " Predictions of Tuning Characteristics(A) Tuning curves for the same two cells as in Figure 5B and 5E, and 5C and 5F, respectively. The data show the intensity required to drive a receptor cell at a firing rate of 150 Hz for different sound frequencies in the range of 1 to 40 kHz. The characteristic frequency f\n", - "CF is determined as the minimum of the tuning curve, and the tuning width Δf\n", - "3dB as the width of the curve 3 dB above the minimum value.(B) Comparison of the predicted and measured characteristic frequency and the tuning width. The predictions were obtained from the fundamental frequency and decay time constant of the measured filter L(Δt); the measured values are taken from the tuning curves as in (A) (n = 12). The encircled data points correspond to the three examples shown in Figure 5. The width of the tuning curves is notoriously difficult to assess quantitatively, as it depends sensitively on an accurate determination of the intensity minimum of the tuning curve. This contributes strongly to the differences of the tuning-width values.\n", - "5598 \n", - " Model Predictions for Three-Click Stimuli(A) Stimulus patterns. The stimuli consisted of three clicks with amplitudes A\n", - "1, A\n", - "2, and A\n", - "3 that were separated by time intervals Δt\n", - "1 and Δt\n", - "2, respectively. The second and third clicks were either given in the same or opposite (“negative”) direction as the first click. A\n", - "1 and A\n", - "2 were set equal and held constant, and A\n", - "3 was adjusted to yield a spike probability of 70%. The following pairs of time intervals (Δt\n", - "1, Δt\n", - "2) were applied: (100 μs, 100 μs), (100 μs, 200 μs), and (200 μs, 100 μs).(B and C) Predicted and measured amplitudes of the third click for two different cells. Predictions were made after L(Δt) and Q(Δt) had been measured with two-click experiments such as in Figure 5. The comparison between predicted and measured values for A\n", - "3 therefore contains no free parameters. The model equation for three-click stimuli is presented in Materials and Methods. As demonstrated by these data, the model allows quantitatively accurate predictions.\n", - "5599 \n", - " Images and Phylogenetic Analysis of New Zealand's Extinct Giant Eagle, H. moorei\n", - "(A) An artist's impression of H. moorei attacking the extinct New Zealand moa. Evidence of eagle strikes are preserved on skeletons of moa weighing up to 200 kg. These skeletons show the eagle struck and gripped the moa's pelvic area, and then killed with a single strike by the other foot to the head or neck. (Artwork: John Megahan.)(B) Comparison of the huge claws of H. moorei with those of its close relative the Hieraaetus morphnoides, the “little” eagle. The massive claws of H. moorei could pierce and crush bone up to 6 mm thick under 50 mm of skin and flesh.(C) Maximum-likelihood tree based on cyt b data (circa 1 kb), depicting phylogenetic relationships within the “booted eagle” group. Extraction numbers or GenBank accession numbers are shown along with taxa name. Harpagornis moorei (red) groups exclusively with the small Hieraaetus eagles, and genetic distances suggest a recent common ancestor about 0.7–1.8 million years ago (early to mid Pleistocene). The tree uses an HKY + Γ4 + I likelihood model enforcing a molecular clock; maximum-likelihood bootstrap consensus values greater than 60% are shown.\n", - "5606 \n", - " CG and CNG Suppression in MF versus UF SequencesSequences were analyzed for their mcrBC half-sites, those that overlap CG dinucleotides, and those that overlap CNG trinucleotides. The ratio of observed to expected sites is graphed for filtered (hatched) and unfiltered (white) for retrotransposons (A) and CDSs (B).\n", - "5607 \n", - " Methylation Status of tb2 and Kafirin Cluster(A and B) Restriction maps of the tb2 gene (A) and the kafirin consensus sequences (B) are shown. The relevant restriction sites are indicated vertically and the numbers indicate the distances scale in basepairs. Each CDS is depicted as a blue-shaded arrow, and the region assayed is indicated by a black bar. The circles depict sites that are not present in every kafirin gene, and the color represents the number of genes that do not share the site. The orange circle (5′-most HhaI site) is a site conserved in nine of 11 kafirin genes, and the red circle (3′-most PstI site) is a site present in ten of the 11.(C) Results from a representative methylation analysis of tb2; the inset depicts the template dilution standard curve used to set the threshold for the experiment. Each experiment was performed three times with four on-board replicates per assay point. The results for each of the four differentially treated reactions are depicted with different colors. Red, mock-treated; blue, mcrBC-digested; orange, HhaI-digested; and green, HhaI + mcrBC double-digest. The inset shows the standard dilution control with two replicates at each dilution. The control was used to set the threshold for detection. The specificity of each reaction was confirmed using melt-curve analysis.(D) Results from a representative methylation analysis of the 11 kafirin genes. The results for each of the six differentially treated reactions are the same as in (C), with the following additional digests: pink, PstI-digested; light blue, PstI + mcrBC double-digest. Notice that the mcrBC with and without PstI yields the same Ct, while HhaI + mcrBC (green) yields a higher Ct on average; suggesting additional cleavage.\n", - "5611 \n", - " Southern Hemisphere Maps and Present-Day Nothofagus Distribution(A) Transoceanic distribution of Nothofagus subspecies Lophozonia and Fuscospora and South American species N. nitida (subgenus Nothofagus). Map adapted from Swenson et al. [43]. ASE, Australia; NCA, New Caledonia; NGU, New Guinea; NZE, New Zealand; SAM, South America; TAS, Tasmania.(B) Relationship of Australia, New Zealand, and South America 65 Myr and 35 Myr before present, reconstructed from http://www.odsn.de/ (link “Plate Tectonic Reconstructions”).\n", - "5613 \n", - " Whole-Genome Comparison of Five Campylobacter StrainsLine figures depict the results of PROmer analysis. Colored lines denote percent identity of protein translations and are plotted according to the location in the reference (C. jejuni RM1221, x-axis) and query genomes (C. jejuni NCTC 11168 [upper y-axis] and C. coli RM2228 [lower y-axis]) (A). The Venn diagrams show the number of proteins shared (black) or unique (red) within a particular relationship for all five Campylobacter strains (B) and for members of the sequenced ɛ-Proteobacteria compared in this study (C). Protein sequences binned as “unique” are unique within the context of the genomes plotted and the cutoffs used to parse the BLASTP data. The pie charts plot the number of protein sequences by main functional role categories for C. jejuni RM1221 ORFs. A frequency distribution of protein percent identity (D) was computed: specifically, the number of protein sequences within class intervals of 5% amino acid identity from 35% to 100% that match C. jejuni RM1221 reference sequences were plotted.\n", - "5614 \n", - " Phylogenetic Analysis and Frequency Distribution of Protein Percent IdentityConcensus maximum-likelihood trees are depicted using multiple alignments of 16S rRNA (A) or 12 concatenated protein datasets (B). The numbers along the branches denote percent occurrence of nodes among 100 bootstrap replicates. The scale bar represents the number of nucleotide (A) or amino acid (B) substitutions.\n", - "5617 \n", - " GC–MS Method to Assay Ratio of Long Versus Direct Routes(A) Simplified model of formaldehyde metabolism highlighting the deuterium (in red) label-tracing strategy. Oxidation of deuterated methanol (CD3OD) leads to the production of formaldehyde with two deuteriums (CD2O). Direct condensation with H4F (green arrows) and conversion to serine via the serine cycle (Figure 1) generates serine with two deuteriums. Alternatively, methylene-H4F may be produced through the long route (blue arrows; Figure 1), generating serine containing only one of the original deuteriums. Extraction and derivatizion of small molecules for analysis by GC–MS provides the ratio of (+1)/(+2) serine isotopomers, thereby assaying the proportion of methylene-H4F generated via the long route through formate or from the direct route from formaldehyde.(B) Detection of serine by GC–MS. The small peak in total ion abundance detected by the MS denoted by the arrow represents serine.(C) Analysis of the mass fragments present in this peak revealed the presence of ions with M/z values of 156 and 228, which are diagnostic for ECF–TFAA derivatized serine.\n", - "5618 \n", - " Change in Ratio of Flux through Long Versus Direct Methylene-H4F Formation Routes during Growth Transitions(A) Experimental data as determined by GC–MS analysis of serine isotopomers. The bars for each transition represent a time series from cells harvested 1 h prior to the transition, and four time points following the transition (succinate to methanol: 1, 5, 7.5, and 10 h; methanol to succinate: 1, 3, 5, and 7 h).(B) Predictions based on kinetic model simulations. The bars indicate the succinate to methanol transition (same time points as for the experimental data) and the methanol steady-state prediction.\n", - "5619 \n", - " C1 Fluxes during Transition from Succinate to MethanolThe fluxes determined are represented schematically (A). The other panels present flux for each branch, labeled A through J. The five bars for each flux represent a time series from cells harvested 1 h prior to the transition from succinate to methanol, and 1, 5, 7.5, and 10 h after the switch. Dissimilatory (B), methylene-H4F formation (C), and assimilatory (D) fluxes are presented separately with different scales for clarity. Flux F represents maximum fluxes.\n", - "5620 \n", - " C1 Fluxes during Transition from Methanol to SuccinateThe fluxes determined are represented schematically (A). The other panels present flux for each branch, labeled A through J. The five bars for each flux represent a time series from cells harvested 1 h prior to the transition from methanol to succinate, and 1, 3, 5, and 7 h after the switch. Dissimilatory (B), methylene-H4F formation (C), and assimilatory (D) fluxes are presented separately with different scales for clarity. Flux F represents maximum fluxes.\n", - "5628 \n", - " Effects of leptin and insulin on phosphorylation of STAT3, MAPK, PKB and GSK3 Rat ARC wedges were incubated for 0, 1, 5, 15 or 30 minutes with 10 nM leptin (A) or 0.1 – 1 nM insulin (B) before cells were lysed and equal amounts of lysate were subjected to SDS-PAGE and transferred to nitrocellulose membrane. The phosphorylated levels of p42/p44 MAPK, PKB, STAT3 and GSK3α/β were detected by immunoblotting with appropriate specific antibodies. The total amount of PKB is also shown. Bands were quantified using densitometry. The values are expressed as relative to the corresponding aCSF control group, and normalized for protein loading. Values represent the mean ± SEM for between 4–6 animals for each time point. * P < 0.05 and ** P < 0.01.\n", - "5629 \n", - " Changes in phosphorylation of PKB, GSK3 and MAPK by inhibition of PI3K Rat ARC wedges were pretreated with 10 μM LY294002 or aCSF for 20 minutes and incubated for 1 minute with 10 nM leptin or 1 nM insulin or aCSF. Equal amounts of protein lysate were subjected to SDS-PAGE and transferred to nitrocellulose membrane. The phosphorylated levels of PKB, and GSK3αβ (A) and p42/p44 MAPK (B) were detected by immunoblotting with appropriate specific antibodies. The total amount of PKB is also shown. Bands were quantified using a densitometer. The values are expressed as relative to the corresponding aCSF control group, and normalized for protein loading. Values represent the mean ± SEM for between 4–5 and 3–5 animals for each time point with leptin and insulin respectively. * P < 0.05 and ** P < 0.01.\n", - "5632 \n", - " Leptin and insulin increase PtdIns(3,4,5)P3 in isolated neurones Acutely isolated ARC neurones were incubated in the absence and presence of 10 nM leptin (A) or 1 nM insulin (B) for 10 minutes. Cells were fixed and permeabilized, as described in Methods, prior to incubation with wild type (wt) or K273A mutant (mt) PH-GRP1-GFP fusion protein for 1 hour. Cells were subsequently processed for visualising GFP by confocal microscopy. Note that leptin and insulin increased the binding of wild type PH-GRP1-GFP in ARC neurones, and this is shown as both the fluorescence image (upper panels in A, B) and as a false colour image (lower panels in A, B), where blue represents low or non-detectable fluorescence and red the highest fluorescence intensity.\n", - "5646 \n", - " Vps25 contains two winged helix domains arranged in tandem. (A) Ribbon diagram of Vps25; the two domains are shown in orange and yellow. Secondary structure elements are labeled. The major missing loop region connecting strands 1 and 3 is indicated by a dashed line. (B) Superposition of the Calpha positions of the N- and C-terminal domains (residues 23 to 48 and 85 to 101 with corresponding C-terminal domain residues; r.m.s.d. 3.4 Å). Note that the positions of helices 1/3 and helices 2/5 as well as wing positions W1 match up well.\n", - "5649 \n", - " Surface charge distribution of Vps25. (A) Surface potential representation of Vps25 with regions where electrostatic potential <-10 kBT are red, while those >+10 kBT are blue (kB, Boltzmann constant; T, absolute temperature). (B) Horizontal rotation (180°). Exposed residues are labeled for orientation. Note that one face of the molecule carries a mainly negative charge (A) while the other one carries a mainly positive charge (B).\n", - "5704 \n", - " Western blot for (A) SP-A and (B) SP-D proteins in mouse lung. Lanes (a, b): 2.5 μg total lavage fluid protein (c, d): 100 μg of total lung tissue homogenate protein from two healthy, non-infected BALB/c mice, and (e): 10 ng purified human SP-A or recombinant SP-D protein.\n", - "5705 \n", - " Western blot of CDN-lysate and CDN-filtrate for crossreactivity with (A) anti-human SP-A and (b) anti-mouse SP-D antibodies. Lanes (a): 20 μg, (b): 10 μg and (c): 1 μg CDN-filtrate protein. Lanes (d): 20 μg, (e): 10 μg and (f): 1 μg CDN-lysate protein and last lane: 10 ng purified human SP-A protein or recombinant SP-D protein.\n", - "5706 \n", - " SP-A and SP-D levels in BALF samples from (A) C. posadasii infected BALB/c mice (ng/μg protein, % of non-infected control mice, n = 5 of each type) (B) FKS immunized, C. posadasii infected C57BL6 mice (protected mice) (ng/μg protein, % of FKS immunized non-infected mice, n = 5 of each type). The data are shown from one representative experiment of two independent experiments. * p < 0.001 (ANOVA)\n", - "5708 \n", - " Binding of (A) SP-A and (B) SP-D to Coccidioidal antigens (CDN-lysate and CDN-filtrate). The binding of 1–10 μg/ml purified human SP-A or recombinant SP-D proteins was detected in CDN-lysate or CDN-filtrate or BSA coated wells (0.5 μg/well). Results are from one representative experiment of two independent experiments performed in duplicate. Values are shown as mean+SEM. In some cases, the error bars are smaller than the symbols.\n", - "5731 \n", - " Neighbor joining analyses using different evolutionary models and/or taxon sampling. Distance matrices were calculated from the first- and second-position matrix of Goremykin et al. [19] using (A) the K2P model, (B) the ML HKY85 model with four gamma-distributed rate categories and parameters estimated from the corresponding ML analysis, and (C) the K2P model with Acorus added to the first- and second-position matrix as described in Methods.\n", - "5733 \n", - " Bootstrap support and the SH-test p-value for the Amborella-sister or grasses-sister topologies as a function of (A) the gamma distribution α parameter value or (B) the proportion of invariable sites. The left vertical line in A and right line in B indicate the rate-heterogeneity parameter estimated from the data. The right vertical line in A and left line in B indicate the boundary where the topology of the best tree transitions between Amborella-sister and grasses-sister. All analyses were performed using the 61-gene first- and second-position matrix of Goremykin et al. [19] and the ML HKY85 model with the α parameter or proportion of invariant sites indicated on the X-axis. The transition-transversion parameter was estimated for each specified rate-heterogeneity parameter. p(Δ|LAmb-Lgrasses|) signifies the SH-test p-value for the difference between the likelihood scores of the two topologies. Bootstrap searches and SH-tests were performed as described in Methods.\n", - "5750 \n", - " HIV Incidence and AIDS Mortality among Adults in Sub-Saharan Africa, 2003–2020, under Different Intervention Scenarios(A) HIV incidence.(B) AIDS mortality.\n", - "5752 \n", - " Atorvastatin Activates sAPPα Shedding Out of Proportion to Its Effect on holoAPP or csAPP(A) SweAPP N2a cells were treated with atorvastatin (Atv) for 24 h and then surface biotinylation was performed as described in Methods. Evaluation of csAPP was performed by immunoprecipitation–immunoblot after surface biotinylation, while holoAPP and sAPPα were evaluated by immunoblot as described in Methods. C, control.(B) Graphic representation of data. Y-axis shows effect of treatment (in arbitrary units) divided by effect of untreated control (in arbitrary units); n = 3 independent experiments; *, p < 0.05; **, p < 0.01; Student's t test).\n", - "5753 \n", - " Simultaneous Treatment of SweAPP N2a Cells with Statins and an Inhibitor of Endocytosis (PO) Yields More sAPPα Shedding Than Does Treatment with Either Statins or PO Alone(A) SweAPP N2a cells were treated for 24 h with atorvastatin (Atv) or simvastatin (Sim) as indicated. Media were then replaced and cells were treated for an additional 20 min with atorvastatin, simvastatin, TNFα protease inhibitor, PO, or combinations, as indicated. Evaluation of sAPPα and holoAPP was performed by Western blot as described in Methods. C, control.(B) Graphic representation of data. Y-axis shows effect of treatment (in arbitrary units) divided by effect of untreated control (in arbitrary units); n = 3 independent experiments; *, p < 0.05 versus control; **, p < 0.01 versus C; #, p < 0.05 versus atorvastatin alone; ##, p < 0.05 versus simvastatin alone; Student's t test).\n", - "5754 \n", - " Simultaneous Treatment of SweAPP N2a Cells with a Statin and FTI-1 Causes Greater sAPPα Shedding Than Either Drug Alone(A) SweAPP N2a cells were treated for 24 h with atorvastatin (Atv, 5 μM), simvastatin (Sim, 1 μM), FTI-1 (5 μM), or a combination of FTI-1 plus a statin. Levels of sAPPα (top panel) or holoAPP (bottom panel) were evaluated as described in Methods. C, control.(B) Graphic representation of data. Y-axis shows effect of treatment (in arbitrary units) divided by effect of untreated control (in arbitrary units); n = 3 independent experiments; *, p < 0.05 versus control; **, p < 0.05 versus atorvastatin alone; ***, p < 0.05 versus simvastatin alone; Student's t test).\n", - "5756 \n", - " Structure and Expression of ROCK cDNAs, and Their Effect on Basal and Statin-Stimulated sAPPα Shedding(A) Graphic representation of the ROCK1 constructs. Myc, Myc tag; KD, kinase domain; PH domain, pleckstrin homology domain; RBD, Rho-binding domain.(B) SweAPP N2a cells were transfected with GFP, CA ROCK1, or DN ROCK1 for 48 h. Cells were lysed and levels of expressed ROCK1 protein evaluated by immunoprecipitation–immunoblot as described in Methods.(C) Model for ROCK activity modulation by Rho.(D) SweAPP N2a cells were transfected for 48 h with control (GFP), CA ROCK1, or DN ROCK1 cDNAs. At the end of this incubation, cells were treated for an additional 24 h with simvastatin (Sim, 1 μM). sAPPα and holoAPP were evaluated by immunoblot as described in Methods.(E) Graphic representation of data. Y-axis shows effect of treatment (in arbitrary units) divided by effect of untreated control (in arbitrary units); n = 3 independent experiments; *, p < 0.05 versus GFP; Student's t test). C, control.\n", - "5757 \n", - " Arachidonic Acid Inhibits Basal sAPPα Shedding but Has No Effect on holoAPP Levels(A) SweAPP cells were treated for 24 h with arachidonic acid (5 or 50 μM, represented by AA5 and AA50, respectively). Levels of sAPPα were evaluated by immunoblot as described in Methods. C, control.(B) Graphic representation of data. Y-axis shows effect of treatment (in arbitrary units) divided by effect of untreated control (in arbitrary units); n = 6 independent experiments; *, p < 0.05 versus control; Student's t test.\n", - "5763 \n", - " Anesthetic-induced depression of CA1 neuron responses involve actions at both glutamate and GABA-mediated synapses. (A) Halothane depressed population spike (PS) responses at clinically relevant concentrations (1 rat MAC = 1.2 vol % ~ 250 μM) and this depression was only partially reversed using a GABAA receptor antagonist, bicuculline (BIC). (B) Propofol (30 μM) produced a comparable degree of population spike depression compared to halothane, but this depression was substantially reversed with BIC, indicating that enhanced GABA-mediated inhibition contributes > 75 % of the depressant effect of propofol. The representative recordings shown are for propofol effects at 10 minutes following exposure to anesthetic (i.e. at 30 min on the x axis for the grouped data) and after 30 minutes of exposure, when a nearly complete block of the population spike was apparent. (C) Excitatory postsynaptic potentials (EPSP) were also depressed by halothane and this effect was not reversed by BIC, indicating a direct effect of the anesthetic on glutamate-mediated synapses. (D) Propofol-induced depression of glutamate-mediated EPSPs, in contrast, appeared to involve enhanced GABA-mediated inhibition, since this depression was completely reversed by BIC. The two anesthetics exhibited quite different sensitivities to reversal by BIC, indicating that actions at GABA synapses vary for these agents. For each graph, data were normalized and each point represents the mean ± SD for at least five measures from different slices made from separate animals. Horizontal bars indicate the time of exposure to each drug. Sample recordings from representative experiments are shown in the top traces. (E) BIC reversal of anesthetic-induced population spike depression was agent specific for equieffective levels of depression, and data are summarized for four anesthetics as bar graphs. Shaded bars represent the degree of depression produced by each anesthetic and open bars show the extent of reversal produced by BIC, error bars indicate SD for at least five measures from different slices. Volatile agents (isoflurane – ISO, 350 μM; halothane – HAL, 250 μM) were only weakly reversed by BIC, while intravenous agents (pentobarbital – PEN, 400 μM; thiopental – THIO, 80 μM; propofol-PRO, 30 μM) were more sensitive to the GABA receptor antagonist. (F) A similar profile of agent specific effects for BIC reversal was evident for glutamate-mediated EPSP responses, volatile agent effects were poorly reversed while intravenous agents appeared to be more sensitive to the GABA antagonist.\n", - "5764 \n", - " Whole cell patch clamp recordings of spontaneous GABA-mediated inhibitory postsynaptic currents (IPSC) in CA1 neurons revealed two sites of action for anesthetic-induced enhanced inhibition. (A) Spontaneous synaptic currents were blocked by a GABAA-receptor antagonist bicuculline (BIC), indicating that they were GABAA-mediated Cl- currents. Traces on the top show 20 s of continuous recording from a CA1 neuron in control and in the presence of BIC. A rate meter graph (bottom) shows the relatively stable frequency of IPSCs during 20 min of control recording, followed by a rapid and complete block of responses produced by BIC (indicated by the bar). (B) Halothane produced a marked increase of the inhibitory charge transfer in CA1 neurons measured as the integral of current recordings (shaded area in top traces). A three fold increase of inhibitory charge (pico Colombs – pC) was reversibly produced by halothane and appeared to come about through both a prolongation of IPSC time course (C) and from an increased frequency of synaptic currents (D). Both effects persisted in the presence of 10 μM tetrodotoxin (TTX) and/or glutamate receptor antagonists indicating that action potential dependent activity and glutamate synapses were not required for anesthetic action. For the rate meter histograms in (A) and (D), each bin represents the number of events recorded in 4 s divided by 4 to give a frequency in Hz (events/second). For all IPSC recordings a CsCl based internal solution was used in the patch pipette.\n", - "5765 \n", - " Anesthetics act at several sites to depress CA1 neuron synaptically evoked discharge. (A) Halothane appears to act presynaptically to depress glutamate release, evidenced by an increase in paired pulse facilitation concomitant with EPSP depression. A similar increase in facilitation was produced by isoflurane and pentobarbital, but not by thiopental or propofol. No change in EPSP rise or decay time was apparent in the presence any anesthetic. (B) The increased facilitation produced by halothane, isoflurane and pentobarbital was not reversed by bicuculline (BIC) indicating a depressant effect on glutamate nerve terminals – independent of anesthetic effects at GABAA receptors. (C) Differential GABA effects were also evident for paired pulse inhibition of population spike responses. Volatile agents like halothane produced little or no paired pulse inhibition at concentrations that produced a half maximal depression of first pulse responses. In contrast, propofol increased paired pulse inhibition and similar effects were observed with thiopental and pentobarbital. This increase in paired pulse inhibition was reversed by bicuculline indicating that these anesthetics enhanced recurrent GABAA-mediated inhibition. (D) The anesthetics also appeared to act directly on CA1 pyramidal neuron membrane excitability to slow action potential discharge activity, although the intravenous agents were much more effective compared to volatile anesthetics. None of the anesthetics produced an appreciable effect on individual action potential amplitude or time course (right: control – solid line; anesthetic – dotted, for halothane on top and propofol on bottom). (E) Anesthetics act at multiple sites to depress the CA1 neuron circuit. Sites of action are indicated on a diagram of CA1 circuitry showing input from Schaffer-collateral fibers, local inhibitory interneurons (IN) and a CA1 pyramidal neuron (triangle). Action potential propagation in Schaffer-collateral fibers (1) was depressed by ~ 15% by halothane and this contributes about 25 % to EPSP depression [60, 61]; see also [17]. This effect did not contribute to anesthetic-induced increases in facilitation, because no change in facilitation occurred when a comparable amount of action potential depression was produced by tetrodotoxin [61]. Further presynaptic depression at glutamate nerve terminals (2) was evident from the increased facilitation observed (Fig. 3A&3B) and there is also good evidence for postsynaptic depressant effects on both NMDA and AMPA receptors (3) [16, 19, 62, 63]. Anesthetics also act pre- and postsynaptically at GABA-mediated synapses (4, see Fig. 2) and can also increase tonic GABA-mediated inhibition by acting as GABA agonists in the absence of synaptically released GABA (5) [46-48]. Perisynaptic and extrasynaptic tonic GABAA receptors (7) also contribute to the postsynaptic depression produced by isoflurane [64] as well as thiopental and propofol [4, 65]. Enhanced recurrent inhibition (6) plays and important role for anesthetics in vivo [45] and strong effects were evident in the present study for propofol, thiopental and pentobarbital (Fig. 3C), similar to effects previously reported for halothane in hippocampal slices [26]. In addition, anesthetics also directly depress CA1 neuron excitability by blocking calcium channels and enhancing potassium currents contributing to hyperpolarization (8) and increased discharge thresholds [40, 41, 42, also Nishikawa, Beida & Maclver, unpublished]. These latter effects could influence CA1 neuron discharge activity for near threshold responses, but for the stronger stimuli used in the present study, effects on GABA and glutamate synapses and on postsynaptic receptors for these transmitters appear to contribute most (~ 80 %) to the depressant actions observed.\n", - "5767 \n", - " Effective information, minimum information bipartition, and complexes. a. Effective information. Shown is a single subset S of 4 elements ({1,2,3,4}, blue circle), forming part of a larger system X (black ellipse). This subset is bisected into A and B by a bipartition ({1,3}/{2,4}, indicated by the dotted grey line). Arrows indicate causally effective connections linking A to B and B to A across the bipartition (other connections may link both A and B to the rest of the system X). To measure EI(A→B), maximum entropy Hmax is injected into the outgoing connections from A (corresponding to independent noise sources). The entropy of the states of B that is due to the input from A is then measured. Note that A can affect B directly through connections linking the two subsets, as well as indirectly via X. Applying maximum entropy to B allows one to measure EI(B→A). The effective information for this bipartition is EI(A B) = EI(A→B) + EI(B→A). b. Minimum information bipartition. For subset S = {1,2,3,4}, the horizontal bipartition {1,3}/{2,4} yields a positive value of EI. However, the bipartition {1,2}/{3,4} yields EI = 0 and is a minimum information bipartition (MIB) for this subset. The other bipartitions of subset S = {1,2,3,4} are {1,4}/{2,3}, {1}/{2,3,4}, {2}/{1,3,4}, {3}/{1,2,4}, {4}/{1,2,3}, all with EI>0. c. Analysis of complexes. By considering all subsets of system X one can identify its complexes and rank them by the respective values of Φ – the value of EI for their minimum information bipartition. Assuming that other elements in X are disconnected, it is easy to see that Φ>0 for subset {3,4} and {1,2}, but Φ = 0 for subsets {1,3}, {1,4}, {2,3}, {2,4}, {1,2,3}, {1,2,4}, {1,3,4}, {2,3,4}, and {1,2,3,4}. Subsets {3,4} and {1,2} are not part of a larger subset having higher Φ, and therefore they constitute complexes. This is indicated schematically by having them encircled by a grey oval (darker grey indicates higher Φ). Methodological note. In order to identify complexes and their Φ(S) for systems with many different connection patterns, each system X was implemented as a stationary multidimensional Gaussian process such that values for effective information could be obtained analytically (details in [8]). Briefly, in order to identify complexes and their Φ(S) for systems with many different connection patterns, we implemented numerous model systems X composed of n neural elements with connections CONij specified by a connection matrix CON(X) (no self-connections). In order to compare different architectures, CON(X) was normalized so that the absolute value of the sum of the afferent synaptic weights per element corresponded to a constant value w<1 (here w = 0.5). If the system's dynamics corresponds to a multivariate Gaussian random process, its covariance matrix COV(X) can be derived analytically. As in previous work, we consider the vector X of random variables that represents the activity of the elements of X, subject to independent Gaussian noise R of magnitude c. We have that, when the elements settle under stationary conditions, X = X * CON(X) + cR. By defining Q = (1-CON(X))-1 and averaging over the states produced by successive values of R, we obtain the covariance matrix COV(X) = = = Qt * Q, where the superscript t refers to the transpose. Under Gaussian assumptions, all deviations from independence among the two complementary parts A and B of a subset S of X are expressed by the covariances among the respective elements. Given these covariances, values for the individual entropies H(A) and H(B), as well as for the joint entropy of the subset H(S) = H(AB) can be obtained as, for example, H(A) = (1/2)ln [(2π e)n|COV(A)|], where |•| denotes the determinant. The mutual information between A and B is then given by MI(A;B) = H(A) + H(B) - H(AB). Note that MI(A:B) is symmetric and positive. To obtain the effective information between A and B within model systems, independent noise sources in A are enforced by setting to zero strength the connections within A and afferent to A. Then the covariance matrix for A is equal to the identity matrix (given independent Gaussian noise), and any statistical dependence between A and B must be due to the causal effects of A on B, mediated by the efferent connections of A. Moreover, all possible outputs from A that could affect B are evaluated. Under these conditions, EI(A→B) = MI(AHmax;B). The independent Gaussian noise R applied to A is multiplied by cp, the perturbation coefficient, while the independent Gaussian noise applied to the rest of the system is given by ci, the intrinsic noise coefficient. Here cp = 1 and ci = 0.00001 in order to emphasize the role of the connectivity and minimize that of noise. To identify complexes and obtain their capacity for information integration, one considers every subset S of X composed of k elements, with k = 2,..., n. For each subset S, we consider all bipartitions and calculate EI(A B) for each of them. We find the minimum information bipartition MIB(S), the bipartition for which the normalized effective information reaches a minimum, and the corresponding value of Φ(S). We then find the complexes of X as those subsets S with Φ>0 that are not included within a subset having higher Φ and rank them based on their Φ(S) value. The complex with the maximum value of Φ(S) is the main complex. MATLAB functions used for calculating effective information and complexes are at .\n", - "5773 \n", - " a: Frozen section of soft tissue from a 72 months hip NPOA: Hematoxylin eosin (h&e): Thrombotic vessels (V), more or less advanced vacuolization/degeneration of muscular fibers (M), and adipous tissue (A). b: Oil Red-O staining : Degenerated muscle fibers (M) stained by eosin were embedded in a strongly hyperplastic perimysium. This structure was itself located inside an adipous tissue whose appearance and compartmentalization by endomysium-like sheets of cell layers suggests a muscular origin. Inset: ALP activity: the same area showed an intense ALP activity in some cells in hyperplastic perimysium. c: Hematoxylin eosin (h&e) staining showed hyperplastic intima and media.\n", - "5782 \n", - " The impacts of mutation probability on time performance for IGKA and FGKA. The population size is set to 50; the generation size is set to 100. The mutation probability ranges from 0.001 to 0.1 for fig2data, and 0.0001 to 0.1 for chodata. (A) shows the running time for FGKA and IGKA on fig2data. (B) shows the running time for FGKA and IGKA on chodata. (C) shows the average and standard error of running time on fig2data when the mutation probability is set to 0.001 and 0.005. (D) shows the average and standard error of running time on chodata when the mutation probability is set to 0.0001 and 0.0005. When the mutation probability increases, the running time increases accordingly for both algorithms. However, when the mutation probability is smaller than some threshold (0.005 for fig2data, and 0.0005 for chodata), the IGKA has better performance. It indicates the thresholds vary from one dataset to another. It mainly depends on the number of patterns and the number of features in the data set.\n", - "5783 \n", - " The impacts of mutation probability on convergence for IGKA and FGKA. The population size is set to 50; the generation size is set to 100. The mutation probability ranges from 0.001 to 0.1 for fig2data, and 0.0001 to 0.1 for chodata. (A) shows the convergence with different mutation probability for FGKA and IGKA on fig2data. (B) shows the convergence with different mutation probability for FGKA and IGKA on chodata. These two algorithms have similar convergence results. When the mutation probability changes in these two data sets, it has little impact on two algorithms during the range that is given in the Figure, except for the case when the mutation probability is too large. It gives an opportunity to choose IGKA with better performance without losing the convergence benefit.\n", - "5838 \n", - " Time-course of PBMC stimulation. PBMC were stimulated with PstS1 (10μg/ml), BCG (4 × 104 CFU/ml), PHA (2,5 μg/ml) or left unstimulated. Cytotoxicity (A), IFN-γ-production (B) and proliferation (C) of PBMC were measured after 2, 5 and 7 days of stimulation. A Cytotoxicity assay. 4-hour chromium release assay against T-24 bladder tumor cells. Effector-target cell ratio of 40:1. B IFN-γ release measured by ELISA from culture media of PBMC. C PBMC proliferation measured by overnight 3H-Thymidine incorporation assay (1 μCi/2 × 105 cells). For A and B one representative experiment out of 3 is shown (mean ± SD), for C a composite of seven independent experiments is shown (mean ± SEM). For PHA-stimulation one out of two experiments is shown (mean ± SD) . n.d. = not detectable\n", - "5841 \n", - " Intravesical PstS1 treatment after sensitization with PBS, PLG-particles or PLG-particles/BSA. Ten days before inoculation of MB-49 tumor cells mice were s.c. sensitized by injection of PBS (A), L-particles (B) or L-particles loaded with BSA (C). On days 1, 8, 15 and 22 after tumor challenge, mice were treated by intravesical instillation of PstS1 (A/B/C). Mice which received s.c. PBS and intravesical PBS served as control. Survival of mice was analyzed by Kaplan-Meier curve and log rank test.\n", - "5848 \n", - " Imaging and software power of micro CT. Pure COM stone viewed by conventional photography (A) and micro CT (B-D). B shows a typical micro CT image slice, C a 3-D reconstruction of the stone surface, and D a wedge cut that displays the internal 3-D morphology of the stone.\n", - "5888 \n", - " Genotyping of the coding region of NAT1 by T-track sequencing on Alf Express™. (A) Displayed area from T382 to T417 (B) Displayed area from T531 to T582 (C) Displayed area from T618 to T661, with genotypes 640T/T; (D) 640T/G; (E) 640G/G; (F) – Displayed area from T735 to T797, A752T and T777C alleles not found.\n", - "5889 \n", - " NAT1 variants in the coding region assessed by G-track sequencing on ABI310 PRISM. (A) Displayed area from G418 to G476, genotypes 445G/G and 459G/G; (B) 445G/A and 459G/A heterozygote; (C) Displayed area from G544 to G590, genotypes 560G/G; (D) 560G/A; (E) Displayed area from G598 to G655, genotypes 613A/A and 640T/T; (F) 613A/A and 640A/G.\n", - "5890 \n", - " NAT1 alleles in 3'-untranslated region assessed by single A-track sequencing on Alf Express™. Displayed area from A1038 to A1104. (A) NAT1*4/*4 – wild type; (B) 1088T/A and 1095C/A heterozygote; (C) 1088A/A and 1095A/A homozygote; (D) NAT1*4/*11 allele; (E) NAT1*11/*11 allele.\n", - "5891 \n", - " NAT1 alleles in 3'-untranslated region by single A-track sequencing on ABI310 PRISM. Displayed area from A1104 to A1048. (A) NAT1*4/*4 – wild type; (B) 1088T/A and 1095C/A heterozygote; (C) 1088A/A and 1095A/A homozygote; (D) 1088T/T homozygote and 1095C/A heterozygote; (E) NAT1*4/*11 allele.\n", - "5908 \n", - " Determination of apoptosis based on morphological features. Four treatment groups: control (CTL); 40 μM dexamethasone (DXM) for 8 h; 100 μM temozolomide (TMZ) for 6 h; pretreatment with 40 μM DXM for 2 h followed by 100 μM TMZ for 6 h. (A) DXM prevented TMZ mediated decrease in U87MG cell viability. The trypan blue exclusion assay was used to assess cell viability in U87MG cells. (B) Photomicrographs showing representative cells from each treatment group. The arrows indicate apoptotic cells. (C) Bar graphs indicating the percentage of apoptotic cells counted from each group. Significant difference between CTL and TMZ treated cells was indicated by * (P ≤ 0.05) and significant difference between TMZ treated cells and DXM plus TMZ treated cells was indicated by # (P ≤ 0.05).\n", - "5909 \n", - " ApopTag assay for detection and determination of DNA fragmentation in U87MG cells. Four treatment groups: control (CTL); 40 μM dexamethasone (DXM) for 8 h; 100 μM temozolomide (TMZ) for 6 h; pretreatment with 40 μM DXM for 2 h followed by 100 μM TMZ for 6 h. (A) The photomicrographs showing representative cells from each treatment group. The arrows indicate apoptotic cells. (B) Bar graphs indicating the average percentage of apoptotic cells counted from each group. Significant difference between CTL and TMZ treated cells was indicated by * (P ≤ 0.05) and significant difference between TMZ treated cells and DXM plus TMZ treated cells was indicated by # (P ≤ 0.05).\n", - "5911 \n", - " The Bax:Bcl-2 ratio measured by Western blot analysis. Four treatment groups: control (CTL); 40 μM dexamethasone (DXM) for 8 h; 100 μM temozolomide (TMZ) for 6 h; pretreatment with 40 μM DXM for 2 h followed by 100 μM TMZ for 6 h. (A) A representative gel picture showing level of expression of Bax. (B) A representative gel picture showing level of expression of Bcl-2. (C) A representative gel picture showing level of expression of β-actin. (D) Densitometric analysis showing the Bax:Bcl-2 ratio in all treatment groups. Significant difference between CTL and TMZ treated cells was indicated by * (P ≤ 0.05) and significant difference between TMZ treated cells and DXM plus TMZ treated cells was indicated by # (P ≤ 0.05).\n", - "5912 \n", - " Determination of calpain and caspase-3 activities using Western blot analysis of α-spectrin breakdown products (SBDPs). Four treatment groups: control (CTL); 40 μM dexamethasone (DXM) for 8 h; 100 μM temozolomide (TMZ) for 6 h; pretreatment with 40 μM DXM for 2 h followed by 100 μM TMZ for 6 h. (A) A representative gel picture showing generation of 145 kD and 120 kD SBDPs. (B) A representative gel picture showing level of expression of β-actin. (C) Densitometric analysis showing percent changes in optical density of the calpain-specific 145 kD SBDP over CTL. (D) Densitometric analysis showing percent change of optical density of the caspase-3-specific 120 kD SBDP over CTL. Significant difference between CTL and TMZ treated cells was indicated by * (P ≤ 0.05) and significant difference between TMZ treated cells and DXM plus TMZ treated cells was indicated by # (P ≤ 0.05).\n", - "5913 \n", - " Determination of caspase-3 activation using Western blot analysis of caspase-3-p20 active band. Four treatment groups: CTL; 40 μM DXM for 8 h; 100 μM TMZ for 6 h; pretreatment with 40 μM DXM for 2 h followed by 100 μM TMZ for 6 h. (A) A representative gel picture showing caspase-3 activation. (B) A representative gel picture showing level of expression of β-actin. (C) Densitometric analysis showing percent change in optical density of the caspase-3-p20 active band over CTL. Significant difference between CTL and TMZ treated cells was indicated by * (P ≤ 0.05) and significant difference between TMZ treated cells and DXM plus TMZ treated cells was indicated by # (P ≤ 0.05).\n", - "5930 \n", - " Collection and Playback of Texture Library(A) Whisker vibration data were collected during “electrical whisking,” induced by stimulation of the facial nerve (1) with pulse trains (2) in rat EW3. An optical sensor, shown schematically by two orthogonal light paths (3), monitored vertical and horizontal whisker motion of whisker C3.(B) “Texture” column: Photographs of the 5 surfaces used. “Trajectory” column: Sample whisker trajectories (first whisk of trial 50) associated with free whisking and the five surfaces. Each point, separated by 1 ms, gives the horizontal and vertical position; the trajectory begins with protraction (P) at t = 0 and terminates 125 ms later at the end of retraction (R). Speed is given by the color of each point. Note the irregularities—jumps, stops, and starts—induced by whisking on sandpaper. “Velocity profile” column: Whisker trajectories displayed according to the horizontal and vertical velocities (VH and VV, respectively). P refers to protraction phase (positive VH), and R to retraction phase (negative VH). In this and all figures, VH and VV were calculated 7,634 times per second. “Velocity spectrogram” column: Velocity spectrograms for each texture (see Materials and Methods).(C) Playback of the whisker trajectories to a second group of rats through a piezoelectric motor (4), shown schematically by the horizontal and vertical arrows at the base of the whisker.\n", - "5931 \n", - " Sensory Receptor and Cortical Coding Properties(A) VH and VV for two free whisks followed by two P280 whisks. The labeling conventions are as in Figure 1B. Each presented trial was unique due to small variations in whisker trajectory even on the same surface (Figure 7); the illustrated velocity profiles are the averages of 100 trials. The red arrowhead indicates the time of the first VH peak during whisker protraction on P280; blue arrowheads indicate the times of the three VH peaks during whisker retraction on P280.(B) Raster plot of first-order neuron aligned with the whisker trajectories, in response to 100 unique trials. Stimuli were applied to whisker E4.(C) PSTH of first-order neuron with 0.2-ms bins. Blue arrowheads indicate the times of maximum response to the three peaks in retraction velocity. The red arrowhead indicates the expected time of response to the peak in protraction velocity; however, the neuron did not respond to whisker protraction.(D) Raster plot for the cortical neuron cluster recorded simultaneously with the first-order neuron.(E) Two cortical PSTHs, both with 2-ms bins. The upper PSTH corresponds to the raster plot in (D); the lower PSTH is from a second cortical neuron cluster recorded simultaneously at a neighboring electrode (distance 560 μm). Blue and red arrowheads indicate the times of maximum response to the peaks in whisker protraction and retraction velocity, carried down from (A). The cortical neuron clusters responded to high velocities for both protraction and retraction. Because the first two peaks in retraction velocity were separated by just 7 ms, the resulting peaks in cortical response were fused. All PSTHs are extended to 260 ms to show responses to the final velocity feature.\n", - "5932 \n", - " Directional Selectivity in First-Order and Cortical Neurons(A) Mean spike count per whisk for ten first-order neurons separated into protraction and retraction phases. Responses to free-whisk and all textures were combined, giving a total of 8,000 whisks. First-order neurons are arranged from left to right according to their retraction:protraction spike count ratio. Five first-order neurons preferred retraction, three preferred retraction, and two responded to both phases. Principal whisker of each neuron is indicated. The neuron Zurvan is indicated by an asterisk.(B) Same analysis for 12 cortical clusters. Individual cortical neuron clusters did not present a clear preference for either retraction or protraction. Conclusions about single unit directional selectivity cannot be drawn, however, because the directional selectivity of any cluster must always be less than that of the most selective single unit in the cluster. The neuron cluster (Figure 2D, 2E) recorded simultaneously with Zurvan is indicated by an asterisk.\n", - "5934 \n", - " Texture Coding by Firing Patterns(A) VH and VV for two whisks on texture P400 (left), P280 (middle), and P100 (right). Each illustrated velocity profile is the average of 100 unique profiles.(B) First-order neuron PSTHs (0.2-ms bins) aligned with the whisker trajectories.(C) Cortical PSTHs (2-ms bins). PSTHs are extended to 260 ms. The arrowheads on the left side of PSTHs indicate mean firing rates.\n", - "5935 \n", - " Test for First-Order Neuron Encoding of Position and AccelerationTo investigate whether first-order neurons represented stimulus features other than velocity, we repeated the same analysis as in Figure 5, in relation to whisker position (A) and acceleration (B), because it has been suggested that neuronal activity is determined by these stimulus parameters [10,13]. Alignment between the PSTH (C) and stimulus position or acceleration revealed no consistent correlation. For texture P100, the boxes extending across A, B, and C highlight the absence of correlation. For example, two periods with similar positions produced first no spikes (red-outlined box on left) and then a large response (red-outlined box on right). Moreover, high acceleration (left box) produced no spikes, while lower levels of acceleration (right box) produced a large response. For this neuron, only velocity was encoded.\n", - "5937 \n", - " Sources of Neuronal Variability(A) VH and VV across the final two free whisks and the first two P280 whisks of trial number 50. Here, as in Figure 2, the red arrowhead indicates peak whisker velocity during protraction, and blue arrowheads indicate the peak whisker velocities during retraction.(B and C) First-order neuron raster plot (B) and PSTH (C), aligned with the whisker trajectories, for 100 stimulus repetitions. Due to the temporal precision of neuronal responses, the vertical scale of the PSTH has been altered (compare to Figures 2 and 5) to reflect the large numbers of spikes within single bins.(D) Cortical neuron cluster raster plot.(E) Two cortical PSTHs from activity recorded simultaneously with the first-order neuron. The upper PSTH corresponds to the raster plot in (D); the lower PSTH is derived from a second cortical neuron cluster recorded simultaneously at a neighboring electrode (distance of 560 μm). PSTHs have 0.2-ms bins for the first-order neuron and 2-ms bins for the cortical neuron clusters. All PSTHs are extended to 260 ms to show responses to the final velocity feature. Response peaks are signaled by red and blue arrowheads according to the velocity events that evoked them.\n", - "5938 \n", - " Precision of a First-Order Neuron(A) VH and VV across the first two P280 whisks of trial number 50 (see Figure 7).(B and C) Raster plot (B) and PSTH (C) of the first-order neuron for 100 repetitions of the stimulus given in (A). Inset in red frame shows a magnified view of spikes emitted in response to a single velocity event (red asterisk in [A]) and their SD in time. The same measurement of jitter was carried out for each of the response peaks that surpassed the green horizontal line (see text).\n", - "5939 \n", - " Velocity Tuning Curves and Simulated Texture Responses(A) A 5-ms trajectory of velocity white noise. Radial coordinates give VH, VV. Velocity space was subdivided such that each segment included the same number of events (3,435,300). One segment (red outline) is selected for further explanation (see text).(B) 100-ms ganglion and cortical spike train aligned below occurrences of the velocity event of interest (red bar). After each such event, spike times were accumulated to build up a spike probability profile.(C) First-order neuron spike probabilities, given by color scale, in relation to joint A,R events. To estimate the tuning curve in finer detail, the number of angles was increased to 20. Each segment now contains about 1,374,120 velocity events. One P280 whisk trajectory is superimposed.(D) Spike probabilities for cortical neuron cluster, given by color scale, in relation to joint A,R events. One P280 whisk trajectory is superimposed.(E) Simulated raster plot for first-order neuron and simulated (black) and real (red) PSTHs.(F) Simulated raster plot for cortical neuron cluster and simulated (black) and real (red) PSTHs.\n", - "5942 \n", - " Evolutionary Dynamics of Sex-Determination Pathways(A) Rapid sequence evolution. Shown are the genes in xol-1 region of C. elegans that have syntenic homologues in C. briggsae, with the amino-acid-level identity between them indicated below.(B) Pathway evolution and primary signal swapping (modified from Graham et al. [9]). In Drosophila (L), the X:A ratio indirectly regulates tra splicing through a requirement for Sxl. In the medfly Ceratitis (R), Sxl is not a sex determination gene, and the female-promoting positive regulation of tra is instead autonomous. Its inhibition by the dominant M gene allows an XX/XY system to replace one based on the X:A ratio.(C) Convergent evolution of nematode hermaphroditism in C. elegans and C. briggsae. fog-2 exists only in C. elegans, and although all species use the fem genes for male somatic development, only C. elegans requires them for hermaphrodite spermatogenesis.\n", - "5951 \n", - " \n", - "you Mutants Exhibit Hedgehog-Associated Defects in Slow Muscle and Ventral Spinal Cord(A and B) Lateral views of live zebrafish at 22 hpf. Wild-type embryos (A) have chevron-shaped somites and a clearly visible floor plate (arrowhead), while you mutants (B) exhibit U-shaped somites and an indistinct floor plate (arrowhead).(C and D) Lateral views of somites 8–13 in whole-mount embryos at 24 hpf. Wild-type embryos (C) show strong Engrailed expression in muscle pioneers (arrow), and weaker expression in multinucleate medial fast fibers (arrowheads). Engrailed expression in you mutants (D) is mostly absent, though very weak expression can occasionally be observed (arrowhead).(E and F) Dorsal views of posterior trunk and tail bud in 12-somite embryos. Wild-type embryos (E) exhibit adaxial myod expression throughout the somitic (arrowhead) and presomitic (arrow) mesoderm, while you mutants (F) lack expression in the somitic (arrowhead) and in parts of the presomitic (arrow) mesoderm.(G and H) Lateral view of somites 9–15 in whole-mount embryos at 22 hpf. Wild-type embryos (G) exhibit strong expression of ptc1, while you mutants (H) show weaker levels of ptc1 expression.(I and J) Lateral view of spinal cord in the posterior trunk of whole-mount embryos at 24 hpf. Wild-type embryos (I) show expression of nkx2.2 in the ventral spinal cord, while in you mutants (J) this expression is strongly reduced.(K–N) Dorsal views of whole-mount embryos at bud stage (10 hpf). Expression in you mutant embryos of both ehh (L) and shh (N) is similar to that observed wild-type embryos (K and M).Anterior is to the left in all images. Genotypes of all embryos were determined by PCR after photography.\n", - "5952 \n", - " Positional Cloning of the you Locus(A) Genetic and physical map of the you region on LG 7, showing the initial flanking SSLPs and the BACs used in the chromosome walk. The number of recombinants in 1,156 meioses is shown for the SSLP markers and for mapped BAC end sequences.(B) Diagram of BAC zC93A15, with expressed sequence tag markers BM184987 and AI722938 shown flanking the you locus. Both BM184987 and AI722938 showed one recombinant out of 6,514 meioses, and were genetically localized on opposite sides of you.(C) The genomic region of the you locus is depicted by horizontal black bars. Gaps in these bars represent fragments of genomic sequence that were not obtained in the sequencing analysis. Exons are depicted by blue rectangles, and the number of recombinants in 6,514 meioses is shown below each mapped exon. Single nucleotide polymorphisms in four exons always segregated with the you locus, and one of these exons harbored a single nucleotide lesion predicted to change a glutamine codon to a stop codon and truncate the open reading frame.\n", - "5953 \n", - " SCUBE Protein Alignment and Truncation of the You ProteinIn (A) and (C), the signal peptide is labeled in blue, the nine EGF domains are labeled in red, and the CUB domain is labeled in green.(A) Alignment of the predicted You amino acid sequence with SCUBE proteins in mouse and human. Identical amino acids are shaded, and similar amino acids are boxed. Conserved cysteines in these domains and elsewhere in the alignment are indicated by filled circles. A conserved six-cysteine repeat motif N-terminal to the CUB domain is labeled in yellow. The location of the glutamine residue at amino acid 644 in the zebrafish protein, which is changed to a stop codon in youty97 mutants, is boxed in bold.(B) Sequence traces from homozygous wild-type and youty97 embryos. In youty97 mutants, a C to T transition is predicted to change a glutamine codon (CAA) to a stop codon (TAA) and truncate the open reading frame.(C) Model of You protein domain structure. The You protein in youty97 mutants is predicted to be truncated prior to the six-cysteine repeat motifs, the CUB domain, and the conserved C-terminus.\n", - "5954 \n", - " MO-Induced Phenocopy of you Defects and Rescue of the you Phenotype with mRNA Injection(A, B, E, and F) Dorsal view of the posterior trunk and tail bud of 12-somite embryos.(C, D, G, and H) Lateral views of somites 8–13 in whole-mount embryos at 24 hpf.Anterior is to the left in all images. Injection at the 1–4-cell stage of 420 pg of a MO targeting the translational start site of the you mRNA (ATG MO) resulted in decreased adaxial expression of myod in the somitic (arrowhead) and presomitic (arrow) mesoderm of wild-type embryos (B). Injection of an equivalent amount of a mismatch control (mismatch MO) did not produce these defects (A). Similarly, wild-type embryos injected with 420 pg of the mismatch MO (C) exhibited strong Engrailed expression in muscle pioneers (arrow) and weaker expression in medial fast fibers (arrowheads). In contrast, Engrailed expression was strongly reduced in wild-type embryos injected with 420 pg of the ATG MO (D), though very weak expression was still observed (arrowhead). Genotypically you mutant embryos (E) showed rescued expression of adaxial myod in somitic (arrowhead) and presomitic (arrow) mesoderm when injected with 50 pg of synthetic you mRNA at the 1–4-cell stage, while mutants injected with 50 pg of a frameshift mutant form of you mRNA (F) did not exhibit rescue of adaxial myod expression. At 24 hpf, genotypically you mutant embryos injected at the 1–4-cell stage with 50 pg of you mRNA (G) showed rescue of strong Engrailed expression in the muscle pioneers (arrow) and weaker expression in the medial fast fibers (arrowheads). Mutant embryos injected with 50 pg of the mutant mRNA (H) did not show rescued Engrailed expression, though very weak Engrailed expression (arrowhead) was observed in some cases. Engrailed expression at the MHB was normal in all analyzed embryos (data not shown). Genotypes of embryos shown in (E–H) were determined by PCR after photography.\n", - "5955 \n", - " Expression of you Examined by In Situ Hybridization(A and B) Maternal you transcripts were evident in cleavage-stage embryos (A) (16-cell; 1.5 hpf), and you mRNA was widely expressed into the gastrula period (B) (shield stage; 6 hpf). In addition, you mRNA was detectable by RT-PCR at 2 hpf, prior to the zebrafish midblastula transition.(C) Toward the end of gastrulation, you transcripts began to be restricted, so that at the bud stage (10 hpf), you expression was evident in the eye field (white arrowhead), in the developing midbrain and hindbrain (black arrowheads), and in posterior paraxial stripes (arrow).(D) During early somitogenesis (12 hpf), you expression was observed in the eye field (white arrowhead), in stripes in the midbrain and the MHB (black arrowheads), in a complex pattern in the hindbrain (white arrow), and in paraxial stripes along the developing trunk and tail bud (black arrow).(E and F) At 24 hpf, you transcripts were observed dorsal to the hypothalamus (black arrow), at the boundary between the telencephalon and the diencephalon (white arrow), in the ventral tectum (white arrowhead), in the region of the presumptive cerebellum (asterisk), and dorsally along the length of the spinal cord. Additional expression of you at this stage and later was observed in the ventral tail and at the urogenital opening (arrowheads; data not shown).(G and H) At 48 hpf, you transcripts were highly expressed in the cerebellum (black arrow), and were also present in the rhombic lip (white arrowhead), and continuing along the length of the anterior–posterior axis in the dorsal spinal cord (black arrowhead; data not shown).Orientation of images: (A) lateral view; (B) lateral view, dorsal to the right; (C, D, F, and G) dorsal views, anterior to the left; (E and H) lateral views, anterior to the left.\n", - "5957 \n", - " Knockdown of patched Function Rescues Slow Muscle Defects in you\n", - "After injection of 420 pg of a mismatch control ptc1 MO, adaxial expression of myod (A) and Engrailed (B) was normal in wild-type embryos, but absent in you mutant embryos (C and D). When injected with 420 pg of a MO targeting ptc1, however, myod expression in mutants (E) was rescued to levels comparable to wild-type embryos (G). Engrailed expression was slightly expanded in both wild-type (F) and mutant (H) embryos injected with 420 pg of ptc1 MOs. Both adaxial myod expression and Engrailed expression was slightly expanded in wild-type (I and J) and you mutant embryos (K and L) injected with MOs targeting both ptc1 and ptc2 (420 pg each). Embryos assayed for myod expression are shown in flat mount at the 12-somite stage, and somites 5–9 of Engrailed-expressing embryos are shown in lateral view at 24 hpf. Anterior is to the left in all panels. Genotypes of all embryos were determined by PCR after photography.\n", - "5958 \n", - " \n", - "you Acts Non-Autonomously in Muscle Pioneers and Is Not Required in Cells Producing Hedgehog Signals(A) Donor embryos were labeled at the 1–4-cell stage with Oregon Green dextran.(B) Cells from donor embryos were transplanted into unlabeled hosts during late blastula and early gastrula stages.(C–E) Images from a chimera made by transplanting cells from labeled mutant donors (green in C and E) into unlabeled wild-type hosts. At 24 hpf, muscle pioneer cells in chimeric embryos were labeled with anti-Engrailed antibody (red in D and E). When transplanted into wild-type embryos, mutant cells were able to differentiate as muscle pioneers, as shown by co-labeling with the anti-Engrailed antibody (E, yellow arrows).(F–K) Images from chimeras made by transplanting cells from labeled wild-type donors (green in F, H, I, and K) into unlabeled mutant hosts. Expression of Engrailed (red in G, H, J, and K) in some mutant muscle pioneers (one marked by red arrows in G, H, J, and K) was rescued in a subset of embryos (see also Table 1). Donor cells in the embryo shown in (F–H) contributed solely to muscle and to non-floor-plate identities within the neural tube. Moreover, in a subset of chimeras, cells derived from wild-type donors differentiated as muscle pioneer cells (yellow arrows in J and K), simultaneously showing both the characteristic strong nuclear Engrailed expression and the typical flattened and mononucleate morphology of this cell type. The somite labeled with the arrows in J and K contains two muscle pioneers, one derived from the wild-type donor (yellow arrow) and another derived from the mutant host (red arrow). Donor cells in the embryo shown in (I–K) contributed primarily to muscle and to non-floor-plate identities within the neural tube; in addition, a group of seven floor plate cells derived from the wild-type donor was present in the tail of this embryo (not shown).\n", - "5976 \n", - " Amino acid sequence comparison of the Xenopus, human, Drosophila, and Yeast α1, α5 and α6 proteasome subunits. Amino acid sequence comparisons of α1 (A), α5 (B) and α6 (C) proteasome subunits are indicated. Matched sequences are boxed. Consensus sequences for calcium/calmodulin-dependent kinase II (CaMKII), cAMP/cGMP-dependent kinase (cAMP/cGMP), casein kinase II (CKII) and Ca2+-dependent kinase (PKC) are indicated. The numbers refer to the amino acid position at the end of each line.\n", - "5981 \n", - " Left singular vectors depicted as tetrapeptide projection value frequency distributions. Distributions for singular vectors 277 (A) and 389 (B) are shown in purple, normal distributions having the same standard deviation are shown in blue. For both distributions, the vast majority of values fall between 0.015 and -0.015. Dashed lines mark the cut-off values used to extract dominant tetrapeptides summarizing correlated peptide (copep) motifs. Selected strings of overlapping tetrapeptides describing parts of these motifs are shown boxed above the approximate regions in the distribution in which they appear.\n", - "5982 \n", - " SVD-based proteome phylogeny (A) of nine eukaryotes with percentage branch support: top – bootstrap; bottom – novel jackknife. An unsupported alternative phylogeny containing the \"ecdysozoan\" lineage is indicated by the dashed red branches. Percentage branch support values for the various clades of the tree are also provided to the left (B) for trees built using all proteins, as well as trees built after poorly described proteins are removed using either of two alternative vector magnitude inclusion values (>0.005, >0.05).\n", - "5985 \n", - " p53 (A) and p21 (C) protein levels in HCT116, HT29, HCT116 E6 and HCT116 p21-/- cells following 1 h exposure to DOX and 23 h incubation in drug-free medium. Panels B and D: densitometric analysis of p53 and p21-immune reactive bands, respectively (white bars: untreated; light grey bars: DOX 1 μM; dark grey bars: DOX 10 μM).\n", - "5987 \n", - " p53 (A) and p21 (C) protein levels in HCT116, HT29, HCT116 E6 and HCT116 p21-/- cells following 24 h exposure to TPL. Panels B and D: densitometric analysis of p53 and p21-immune reactive bands, respectively (white bars: untreated; light grey bars: TPL 1.0 mM; dark grey bars: TPL 2.5 mM).\n", - "5989 \n", - " Generation of spen mutant clones in wing imaginal discs. (A) Expression of a UAS-GFP transgene driven by MS1096 GAL4 in third instar wing imaginal discs. As described previously [22], the transgene is expressed mainly in the dorsal wing pouch, with weaker expression in the ventral side and in the prospective notum. (B, C) Virgin females with the genotype {MS1096 GAL4; 40 2piM FRT40A}, or {MS1096 GAL4; spenpoc361 FRT40A/ ln (2LR) CyO}, were crossed to {w*; GFP FRT40A; UAS-Flp1/TM6b} males. Shown are wing imaginal discs isolated from the resulting third instar larvae with the genotypes {MS1096 GAL4/+; 40 2 piM FRT40A/GFP FRT40A; UAS Flp1/ +} (B), and {MS1096 GAL4/+; spenpoc361 FRT40A/GFP FRT40A; UAS-Flp1/ +}(C). Green fluorescence reveals either compound heterozygous cells (not subjected to mitotic recombination) or GFP homozygotes (brightest), while dark spots indicate 2 piM (B) or spenpoc361 (C) homozygous clones. Dorsal is up and anterior is to the left. To know the relative area covered by either 2 piM or spenpoc361 homozygous clones versus wt clones, regions of equal intensity within the images were artificially colored in Adobe Photoshop using the Paint Bucket tool (D, E). Colors corresponding to mutant (red) or wt (blue) areas were extruded independently, and the total number of pixels contained within the regions of interest were calculated using the Kodak 1D Image Analysis Software (Eastman Kodak Company, Rochester, NY). The results are represented as the fraction covered by each genotype for each cross in a total of three discs for the crosses involving 2 piM, and 5 discs for spenpoc361 (F).\n", - "5990 \n", - " The presence of spen mutant clones affects wing vein morphology. Virgin females with the genotype {MS1096 GAL4; 40 2piM FRT40A}, {MS1096 GAL4; spenpoc231 FRT40A/ ln (2LR) CyO}, or {MS1096 GAL4; spenpoc361 FRT40A/ ln (2LR) CyO}, were crossed to {w*; GFP FRT40A; UAS-Flp1/TM6b} males, and adult wings were isolated from progeny females with the following genotypes: {MS1096 GAL4/+; 40 2 piM FRT40A/GFP FRT40A; UAS Flp1/ +} (A), {MS1096 GAL4/+; spenpoc361 FRT40A/ GFP FRT 40A; TM6b/ +} (B), {MS1096 GAL4/+; spenpoc231 FRT40A/ GFP FRT40A; UAS-Flp1/ +} (C, D), and {MS1096 GAL4/+; spenpoc361 FRT40A/ GFP FRT40A; UAS-Flp1/ +} (E, F). Arrows indicate gain (C, E, F), loss (D, F), or misplacement (E) of vein material.\n", - "5991 \n", - " spen mutations affect wing hair polarity. Crosses were performed as described in Figure 1. Shown are details (see inset in A) of adult wings isolated from progeny females with the genotypes: {MS1096 GAL4/ +; 40 2piM FRT40A/ GFP FRT40A; UAS-Flp1/ +} (A), {MS1096 GAL4/ +; spenpoc361 FRT40A/ GFP FRT40A; TM6b/ +} (B), {MS1096 GAL4/ +; spenpoc231 FRT40A/GFP FRT40A; UAS-Flp1/ +} (C), and {MS1096 GAL4/+; spenpoc361 FRT40A/ GFP FRT40A; UAS-Flp1/ +} (D). Arrows indicate the direction of the bristles.\n", - "6010 \n", - " Scheme of the ProtoNet hierarchy test. (A) The ProtoNet binary tree. Vertices in the graph are protein clusters. Crossed-out vertices are eliminated because they do not match any GO term. (B) Tree hierarchy of remaining ProtoNet clusters. Remaining nodes correspond to GO terms. (C) The corresponding GO DAG hierarchy between the vertices. (D) Intersection of graphs in B and C shows the amount of hierarchical correspondence between GO and ProtoNet. In this example, there are 6 edges common to GO and ProtoNet. 2 of the ProtoNet edges do not appear in GO and 4 GO edges do not appear in ProtoNet.\n", - "6012 \n", - " Effect of compression on mean best CS (Correspondence Score) at various threshold values. (A) Mean best CS shown here is calculated for the InterPro keywords. Mean best CS decreases from right to left, as more clusters are eliminated due to compression. Filled circles represent the mean best CS for compression according to LT thresholds. Open circles represent the mean best CS of a random compression to the same extent as explained in the text. Standard deviation of the random mean best CS is too small to be seen on the graph.\n", - "6022 \n", - " Effects of ethephon on photosynthesis and stomatal conductance in mustard Effect of different concentrations of ethephon (2-chloroethyl phosphonic acid) applied at 30 d after sowing on net photosynthetic rate (PN) (A) and stomatal conductance (gS) (B) in high photosynthetic capacity cultivar Varuna and low photosynthetic capacity cultivar RH30 of mustard (Brassica juncea) at 15 d after the treatment. Each data point represent treatment mean ± SE. Values at each data point within the cultivar sharing the same letter are not significantly different at P < 0.05.\n", - "6023 \n", - " Effects of ethephon on intercellular CO2 concentration and carbonic anhydrase activity in mustard Effect of different concentrations of ethephon (2-chloroethyl phosphonic acid) applied at 30 d after sowing on intercellular CO2 concentration (Ci) (A) and carbonic anhydrase (CA) activity (B) in high photosynthetic capacity cultivar Varuna and low photosynthetic capacity cultivar RH30 of mustard (Brassica juncea) at 15 d after the treatment. Each data point represent treatment mean ± SE. Values at each data point within the cultivar sharing the same letter are not significantly different at P < 0.05.\n", - "6028 \n", - " Normal interphase progression following removal of the midbody. A cell was cut at the end of cytokinesis to form daughter cells with or without the midbody (A, b, arrow). Subsequent long-term time-lapse imaging indicated a normal phase morphology for both cells (A). The cell with midbody entered mitosis 10 h 40 min after cutting, whereas the cell without midbody entered mitosis ~1 h afterwards (e, f, large arrows). Fluorescence imaging of aurora-B-GFP, a midbody component, confirmed that the midbody is completely segregated into one of the daughter cells (B; cutting indicated by dotted lines) Bar, 20 μm.\n", - "6049 \n", - " Neuroblastoma cells express constitutive levels of Pax-5 proteins. Panel (A) display EMSAs where Oct or BSAP (Pax-5) binding sites was incubated with nuclear extracts from Nalm6 (pre-B), KM3 (melanoma), SH-SY5Y (neuroblastoma) and SK-N-BE(2)c (neuroblastoma) cells.\n", - "6052 \n", - " Neuroblastoma cells express variable levels of E-protein activity. Panel (A) display auto radiograms with EMSAs of Oct and ?E-5 (E-protein) DNA binding activity in nuclear extracts from Nalm6 and KM3 pre-B lymphoma cells and SH-SY5Y, SK-N-BE(2)c, IMR-32, KCN-69n and LA-N-1 neuroblastoma cells. \n", - "6054 \n", - " Neuroblastoma and pre-B lymphoma differs in expression of CRE and Pu.1 site binding proteins. Panel (A) display EMSA analysis of nuclear extracts from pre-B (KM3) or neuroblastoma cells (SH-SY5Y and SK-N-BE(2)c) incubated with a consensus cAMP responsive element (CRE). The two major complexes are denoted ATFC1 and ATFC2. Panel (B) show an EMSA analysis using nuclear extracts from either pre-B lymphoma cells (Nalm6) or the neuroblastoma cells SH-SY5Y and SK-N-BE(2)c, incubated with a labelled Pu.1 binding site from the mouse Immunoglobulin l enhancer (lB). Ets1/2 or PU.1 antibody was included in the reactions as indicated. The arrow indicates the complex super-shifted by the anti PU.1 antibody.\n", - "6055 \n", - " Disruption of the chromatin structure allows for the activation of mb-1 transcription in neuroblastoma cells. (A) The top part of the figure shows ethidium bromide stained agarose gels with actin expression after RT-PCR analysis of Nalm6, SH-SY5Y and SK-N-BE(2)c cells without or after treatment with 5-azaC and TSA. Serial dilutions using 1, 1/5 and 1/25 of the template cDNA after 25 cycles of PCR were used. Panel (B) display auto-radiograms of southern blot analysis of mb-1 RT-PCR products obtained from untreated or 5-azaC/TSA treated SH-SY5Y and SK-N-BE(2)c cells and a serial dilution of untreated Nalm6 cells after 30 cycles of PCR as indicated.\n", - "6077 \n", - " 1H-15N NMR HSQC spectra and relative 1-D contour plots of the Dsg349–60REWVKFAKPCRE peptide 15N-labelled at residues 7, 10, 12 and 14 (A), plus MAb 5H10 (B), or 511G (C). Upper panels report portions of the HSQC spectra showing resonances from residues 1, 4, 6, 7, and 11. Lower panels report expanded region of the HSQC spectra showing resonances from the same residues 4, 6, 7, and 11.\n", - "6104 \n", - " Generation and replication of the GFP-Env-tagged viruses. (A) Schematic representation of the GFP-Env-tagged viruses. EGF, epidermal growth factor; PRR, proline rich region; GFP, green fluorescent protein; L, signal peptide.(B) Viral replication kinetic in transfected NIH3T3 cells monitored by the percentage of GFP-positive cells.(C) PCR analysis of genomic DNA from FLY-Jet cells transfected with GFP-EMO. The N-terminal sequences of the EGF-Env gene were analyzed by PCR using the primers MLV-5'-Env and BS-5. GFP-EMO plasmid DNA was used as a positive control and gave rise to a 900 bp fragment. Predominantly faster migrating fragments were amplified from genomic DNA (gDNA) of GFP-EMO transfected FLY-Jet cells 32 days after transfection.\n", - "6105 \n", - " Binding of GFP-Env to cells. (A) Supernatants of GFP-EMO- or GFP-MOV-infected NIH3T3 cells were incubated with the indicated target cells and analyzed by flow cytometry. Binding of GFP-Env was detected by a shift to green fluorescence (FL-1).(B) Supernatants from GFP-MOV-infected NIH3T3 cells were incubated with the indicated target cells and analyzed by flow cytometry. Soluble receptor binding domains of the ecotropic or the amphotropic MLV Env (E-sRBD, A-sRBD) were added prior to the virus, as supernatants from 293T cells transfected with the expression constructs. After 5 mins., supernatants of GFP-MOV-infected NIH3T3 cells were added for an additional 5 mins. Binding of GFP-Env was detected by a shift to green fluorescence (FL-1). NIH3T3i-MLV: chronically MLV-infected NIH3T3 cells.\n", - "6107 \n", - " eplication of semi-replicative retroviral vectors. (A) Replication of semi-replicative retroviral vectors in transfected NIH3T3 cells, monitored by detection of green, red or double fluorescent cells by flow cytometry.(B) NIH3T3 cells expressing GFP-Env. The green fluorescence of the GFP-Env fusion protein can be detected in regions surrounding the nucleus (ER/golgi) and in the plasma membrane.(C) NIH3T3 cells expressing GAG/POL-RFP. RFP expression can be detected all over the cell, since RFP is not fused to a viral protein and is able to freely diffuse.\n", - "6108 \n", - " PCR analysis of genomic DNA from NIH3T3 cells transfected with semi-replicative retroviral vectors. (A) The generation of full-length MLV genomes was analyzed by PCR using the primers p1 and p2 (see Fig. 4). Full-length MLV generates an 800 bp PCR fragment, semi-replicative retroviral vectors should not give rise to a DNA fragment because the primers do not bind to the same genome. DNA was transfected in different molar ratios as indicated. The first number indicates the molar ratio of the gag/pol plasmid and the second the Env encoding plasmid.(B) The stability of the GFP sequences inserted into the Env gene was analyzed by PCR using the primers p3 and p4 (see Fig. 4). The gfp-env sequence gives rise to a 1.5 kb fragment and wt env to an 800 bp fragment. Untransfected NIH3T3 cells were cultured in parallel and analyzed identically. The data are given as negative at days 13 and 32. NTC, no template control.\n", - "6109 \n", - " The schematic diagram of poly-thymine (poly-T) generation by Alu.(A) Alu contains poly-adenine (poly-A) region at the end. It is shown as 'aaaaaaaa'. The poly-A of Alu at anti-sense becomes poly-T (complement of poly-A) at sense strand on DNA. It is shown as 'tttttttt'. (B) mRNA now contains a poly-uracile (poly-U) region after the transcription of poly-T region. (C) AU-rich elements are found in this poly-U region in (B).\n", - "6117 \n", - " Electropherograms of the sequence of the exon 1 SNP of GAD1 identified in the process of mutational analysis. (A) and (B) show the normal C variant in the forward and reverse directions, respectively. (C) and (D) show the alternative G variant in the forward and reverse directions, respectively. This variant was only found in affected individuals of family B. No heterozygous individuals were identified for this nucleotide variant.\n", - "6119 \n", - " Three illustrations of the genomic, protein and comparative sequence homologies of the different species of GAD. (A) The genomic structures of GAD1/GAD25/GAD2 and Drosophila Gad1. (B) Comparative protein domain structures of GAD65/GAD25/GAD67 and Drosophila Gad1. (Numbers represent approximate amino acid residues). (C) Schematic illustrating the relative homology of the protein structures of GAD67/GAD65 and Drosophila Gad1.\n", - "6136 \n", - " Relationship between RFS and the three-gene expression signature in the initial series of 100 ERα-positive breast tumor samples (A) and in an independent series of 104 ERα-positive postmenopausal breast tumor samples (B).\n", - "6139 \n", - " Attenuated replication of NL(AD8)IκB-αS32/36A in primary human monocytes. Panels A and B show the growth NL(AD8), NL(AD8)IκB-antisense and NL(AD8)IκB-αS32/36A in cultures of primary human monocytes. Cells (105) were infected with equal amounts of viruses normalized based on RT counts of 106 cpm (A) or 105 cpm (B). A representative experiment of three independent infections of monocytes from different individuals is shown.\n", - "6159 \n", - " Relationship between the increase in membrane associated uPA activity (nmol/min/mg protein) and (A) Age, (B) Elapsed time between the time of the resection and the time at which the final sample was obtained, and (C) the total time for which the portal vein was clamped during operation. Spearman correlation analysis showed no correlation for A (p = 0.44, Spearman correlation coefficient = -0.071, n = 8), or B (p = 0.27, Spearman correlation coefficient = 0.26, n = 8). In C however, a statistically significant correlation was observed (p = 0.012, Spearman correlation coefficient = -0.89, n = 7).\n", - "6162 \n", - " Immunohistochemistry (IHC) (A-C) for TLR9 detected by a mouse monoclonal antibody. Adenocarcinoma of the lung (A). Squamous cell carcinoma of the lung (B). A549 cells (all 600 ×) (C). In situ hybridization (ISH) targeting mRNA of human TLR9 with a digoxigenin-labeled DNA-probe in a squamous cell carcinoma of the lung (600 ×) (D). Immunohistochemical staining of TLR9-expression-levels in nonmalignant (E) and malignant tissues (F) derived from the same lungs an stained by the use of tissue arrays. Results of RT-PCR targeting TLR9 in cell lines (G). M: molecular-weight marker (MW8, Roche). 1: negative control; 2: A549; 3: NCI-H727; 4: BEAS 2b; 5: Mononuclear cells from a healthy human donor. Confocal laser microscopy of A549 cells transiently transfected with a GFP-TLR9 plasmid: Cytoplasmic expression of TLR9 is observable in all cells, while successful transfection led to overexpression of TLR9 resulting in bright GFP signals completely superimposed by the TLR9 antibody signal (H). Nuclear counterstain was performed with TOTO3.\n", - "6163 \n", - " MCP-1 secretion in response to CpG-ODN-stimulation in the presence or absence of TNF-α by HeLa and A549 cells (A). Data are expressed as the mean ± SD (n = 6). Student's t test was used for statistical analysis. RT-PCR targeting mRNA of MCP-1 in human non-small cell lung cancer tissue stimulated with CpG-ODN for 24 h (B) (M = pBR322-Msp1). Lanes 2 and 3, as well as lanes 4 and 5 respectively show results of tissue samples from the same tumors either in the absence or presence of CpG-ODN.\n", - "6164 \n", - " CpG-ODN-stimulation decreases apoptosis in HeLa and A549 cells. Cells were stained with Annexin-V after CpG-ODN-stimulation in the presence or absence of TNF-α and CHX after 24 h (A). Data are expressed as the mean ± SD (n = 6). Student's t test was used for statistical analysis. Representative histograms are shown from experiments with HeLa cells after CpG-ODN-stimulation in the absence (B) or presence (C) of TNF-α and CHX. Caspase 3 expression in HeLa cells is shown after incubation with TNF-α and CHX (D). In the presence of CpG-ODN the expression is decreased (E). The percentage of positive cells in each sample is indicated.\n", - "6165 \n", - " TLR9 expression after CpG-ODN-stimulation in HeLa cells: There is no difference in TLR9 expression with and without CpG-ODN-stimulation after 24 h (A). CpG-ODN partially inhibit downregulation of TLR9 which is induced by TNF-α and CHX (B). FI = fluorescence intensity.\n", - "6181 \n", - " Cytoplasmic expression of unfused scFv After cloning in plasmid pPM210, scFv225.28S and mutants were expressed in strain TG1lon. 5 μl of soluble and insoluble extracts were analyzed by Coomassie blue staining (A) and western blot (B) using the 9E10 anti-c-myc monoclonal antibody followed by an anti-mouse alkaline phosphatase-conjugated antibody and detected with the chromogenic substrate BCIP/NBT.\n", - "6182 \n", - " Comparison of cytoplasmic and periplasmic soluble expression Genes of scFv225.28S and its mutant R4.1 were cloned in plasmid pAB1 [28]. In this plasmid, scFv genes are expressed under the control of the lac promoter with the pelB signal sequence fused at their N-terminal extremity in order to target protein to the periplasm. Soluble and insoluble extracts were prepared from strain TG1 and were analyzed by Coomassie blue staining (A) and western blot (B) as in Figure 8. The two last extracts (Cyto) are those analyzed in lanes 1 and 2 of Figure 8 (soluble cytoplasmic extracts of scFv225.28S and R4.1, cloned in pPM210 and expressed in TG1lon).\n", - "6199 \n", - " Expression vector constructs after recombination between the destination and entry plasmids. (A) Schematic representation where shaded and clear boxes indicate translated and untranslated regions respectively. T7 = T7 RNA polymerase promoter, lacO = lac operator, SD = shine dalgarno, H6 or H10 = hexahistidine or decahistidine, attB1 or attB2 = attB recombination sites, ORF = open reading frame, stop = stop codon, fusion = protein fusion (MBP, GFP, GST, Trx, DHFR or Dhfr), V5 = V5 epitope. (B) and (C) DNA sequences of pDEST-N112 and pDESTC102 respectively from T7 RNA polymerase promoter to stop codon.\n", - "6200 \n", - " Effect of N-terminal fusion on protein expression Total (A) and soluble (B) expression for protein 1 – 30 (Table 1) with various N-terminal fusion partners analysed by SDS-PAGE fluorescence western blots as described in Materials and Methods. Expression plasmids employed were (a) pDEST17, (b) pDEST-N110 or pDEST-N112 with either (c) MBP, (d) GFP, (e) GST or (f) Trx inserted between the DraIII and BfrBI sites as shown in Figure 1.\n", - "6218 \n", - " Effects of Dietary Phytoestrogens on Food and Water Intake in 75 Day-Old Male Long-Evans Rats. Males fed a phytoestrogen-rich (600) diet displayed significantly greater (* p < 0.05) food (A) and water intake (B) compared to males fed a phytoestrogen-free (Free) diet. The average food and water intake represents the volumes consumed over 3 consecutive days.\n", - "6221 \n", - " Plasma Leptin (A) and Insulin (B) Levels from 33, 55 or 75 day-old Male Long-Evans Rats fed either a phytoestrogen-rich (Phyto-600) or a phytoestrogen-free (Phyto-Free) diet. At 33, 55 and 75 days of age, males fed the phytoestrogen-free (Free) diets displayed significantly higher leptin and insulin levels (* p < 0.05, ** p < 0.01) compared to males fed the Phyto-600 (600) diet.\n", - "6235 \n", - " Detection of HIV-1 nef miRNAs and inhibition of Nef expression by nef RNAs. (A) Schematic representation of HIV-1 nef in its genome and synthetic DNA probes (#) used in this study. (B) Total RNAs were extracted from MT-4 T cells persistently infected with HIV-1 IIIB, separated on a 15% polyacrylamide-7 M urea gel, and subjected to northern blot analysis. The approximate sizes of the three classes of HIV-1 transcripts and small RNAs are indicated on the right. The loading control was rRNA stained with ethidium bromide. Relative expression (%) of nef small RNAs to the three classes of HIV-1 transcripts is at the bottom of figure. (C) Schematic representation of effector plasmids (E) H1 promoter-driven shRNA expression plasmids. Reporter (R) Nef-EGFP expression plasmid (pYM2.2) is also shown. (D) Inhibition by sinefs in pH1 plamids of Nef-EGFP expression. Either sinef, siluc or siegfp in each plasmid was transfected into Jurkat T cells in the presence of either pYM2.2 or control pEGFP-N1. At 36 h after transfection EGFP-positive cells were counted by flow cytometry. Data represent the relative activity of EGFP-positive cells where the percentage of positive cells in the sample transfected with pYM2.2 or pEGFP-N1 plus pcDNA3.1 or si(-) in pH1 plasmid was scored as 100%. Data are averages of three independent experiments + SD. Bars, SD. (E) Immunoblot analysis showing inhibition of YM2.2 expression by different nef shRNAs. Jurakat T cells were transfected with pYM2.2 and pH1/sinefs or siluc plasmid, cellular lysates were prepared 48 h after transfection, and immunoblotted with rabbit serum against Nef (upper panel) and anti-β-actin antibody (lower panel). The β-actin expression shows equal loading of all samples.\n", - "6236 \n", - " Inhibition of nef expression in human T cells by nef siRNAs. (A) Schematic representation of shRNA-expressing STYLE vector (E) and HIV-1 SF2 nef gene expressing pPFV/nef vector (R). The helper plasmid, pFFenv expresses FFV envelope protein under the control of CMV promoter. (B) Detection of expression of nef mRNA and integration of vectors. STYLE, SKY3.0, PFV/nef, PFV or mock was used to infect Jurkat T cells and the infected cells were cultured for 2 weeks. After 2 weeks, gag and nef mRNA expression was measured by RT-PCR. Genomic DNA of LTR, gag and nef of STYLE or PFV/nef were also detected by PCR. β-actin was used as a control. (C) Inhibition of Nef-EGFP expression by nef siRNA-expressing STYLE in Jurkat T cells. The pYM2.2 was transfected into each of the STYLE or mock-infected Jurkat T cells and EGFP-expressing cells were counted by flow cytometry at 48 h after transfection. Data represent the relative activity of EGFP-positive cells, where the percentage of positive cells in the sample transfected with pYM2.2 upon the STYLE-si(-) infected cells was scored as 100%. (D) Inhibition of HIV-1 transcription and replication by nef STYLE-367. HIV-1 IIIB persistently infected MT-4 T cells were transfected with the pLTRSF2 reporter and β-gal expressing control pCMVβ plasmids at 72 h after infection with STYLE. At 48 h post-transfection, Luc activity was measured and normalized as Luc values (Luc/β-gal). Absolute levels of Luc activity in the samples of pLTRSF2 plus SRYLE-si(-) were 16,311 + 1,253 or 783 + 87 light units for STYLE-367/miR-N367 transfectants. Data represent the relative Luc activities where the percentage of positive cells in the samples infected with the STYLE-si(-) was scored as 100%. After 48 h, p24 antigen was also measured in the cell culture supernatant of STYLE-infected Jurkat T cells. Data are averages of three independent experiments + SD. Bars, SD. (E) Inhibition of nef expression by nef siRNA in Jurkat T cells. Cells were infected with PFV/nef 48 h after infection with the STYLE and then subjected to semi-quantitative RT-PCR analysis. Data represent the relative expression of mRNA, where the percentage of positive cells in the sample of mock-infected cells (E: Mock) relative to the PFV/nef (R: PFV/nef) infected cells was scored as 100%. Data averages were derived from three independent experiments + SD. Bars, SD.\n", - "6237 \n", - " In vivo effects of miR-N367. (A) Distribution of Nef positive staining cells in the subcapsular area of groups 2 or 3 mouse spleens at 2 days after infection with PFV/nef. Anti-Nef rabbit serum or normal rabbit serum was used as a primary antibody. (B) Immunofluorescence for 305 mAb positive staining cells in the subcapsular area of groups 2 or 3 mouse spleens at 2 days after infection with PFV/nef and immunoperoxidase staining by 305 mAb in cells of interfollicular area of HIV-1 uninfected human spleen and tonsillar follicle. (C) Short term body weights of PFV/nef-infected Balb/c mice. The body weights of the PFV/nef-infected mice (group 1, n = 6, solid circle), the PFV/nef-infected followed by the STYLE-luc-infected mice (group 2, n = 6, solid triangle), the PFV/nef-infected followed by the STYLE-367-infected mice (group 3, n = 8, open triangle) and the STYLE-367-infected mice (group 4, n = 6, open circles) were measured from days 0 to 5. (D) Long term body weights of PFV/nef-infected C3H/Hej mice. Treatment of each group and numbers of mice were same as (C). Bars, SD. *; p < 0.05, **; p < 0.01 (relative to group 3). (E) Immunoperoxidase staining by 305 mAb and anti-Nef rabbit serum in cells of mouse or human adipose tissue. Arrows show positively stained areas. Magnification, X 20 (A and B); X 20 and X 200 (E).\n", - "6268 \n", - " Alternative alignments of the 8p23.1 DEF locus. (A) July 2003 UCSC version hg16 [10] chr8:6,258,283-8,262,034. Only finished clones are shown and arranged by libraries, which are indicated by background colors: RP11 = gray, bottom; SCb = white, middle; other (CTB, CTD, GS, RP13) = gray, top. Defensin gene clusters are shown as arrows, repeat blocks are indicated as striped boxes, (+) strand is above the black line, (-) strand is below the black line, same stripe patterns indicate similar structures. The light blue background indicates the distal repeat region for chromosomal rearrangements [16]. (B) Revised alignment of the 8p23.1 DEF locus, containing an additional 360-kb-contig and five clones which cannot be aligned; colors: black = aligned as in Fig. 1A; orange = clones not present in the UCSC browser; red = clones with different positions in both alignments, blue = clones presented in the UCSC browser but excluded in the revised assembly. The yellow vertical bar in DEF a illustrates the widening of the DEF cluster a as a result of the alternative alignment of [GenBank:AF200455] / [GenBank:AF238378] (see text). Clone (number) GenBank accession.version / library: (1) [GenBank:AC018398] / RP11, (2) [GenBank:AF287957] / CTD, (3) [GenBank:AF233439] / GS, CTD, (4) [GenBank:AF200455] / SCb, (5) [GenBank:AF238378] / SCb, (6) [GenBank:AF228730] / SCb, CTB, (7) [GenBank:AF215847] / CTB, (8) [GenBank:AC130339] / RP13, (9) [GenBank:AC130360] / RP11, (10) [GenBank:AC130367] / RP11, (11) [GenBank:AC134395] / RP11, (12) [GenBank:AC134683] / RP11, (13) [GenBank:AC285443] / SCb, (14) [GenBank:AC202031] / SCb, (15) [GenBank:AC134684] / RP11, (16) [GenBank:AC084121] / RP11, (17) [GenBank:AC144950] / RP11, (18) [GenBank:AC130365] / RP11, (19) [GenBank:AC131269] / RP11, (20) [GenBank:AC105233] / RP11, (21) [GenBank:AC068020] / RP11, (22) [GenBank:AC068353] / RP11, (23) [GenBank:AF298854] / SCb, (24) [GenBank:AF205406] / SCb, (25) [GenBank:AF314060] / GS, (26) [GenBank:AF314059] / SCb, (27) [GenBank:AF252831] / SCb, (28) [GenBank:AF189745] / SCb, (29) [GenBank:AF252830] / SCb, (30) [GenBank:AC148106] / RP11, (31) [GenBank:AC105214] / RP11, (32) [GenBank:AC092766] / RP11\n", - "6294 \n", - " The 90-gene meta-signature displayed greater performance than nodal status in predicting relapse-free survival in breast cancer, and it further predicts survival outcome in nodal status sub-cohorts. (A) Lymph node status correlates with survival outcome (P = 0.0004). (B) The meta-signature correlates with survival outcome (P = 2 × 10-10). (C) The meta-signature differentiates risk groups in nodal negative patients (P = 2.6 × 10-5). (D) The meta-signature predicts risk groups in nodal positive patients (P = 7.0 × 10-5).\n", - "6297 \n", - " The 90 gene meta-signature displayed two distinct patterns of expression in breast cancer groups. (A) Heat map representation of differential expression probabilities for the 90 gene meta-signature across the combined samples. The top set of genes showed consistently high probability of over-expression (yellow) in the poor outcome group, and the bottom set of genes showed consistently high probability of down-regulation (blue) in the poor outcome group. (B) Heat map of log-transformed raw data. Individually generated heat maps of the raw measurements of gene expression confirmed the distinct expression patterns of the meta-signature from independent studies. Red represents up-regulation while green represents down-regulation. R (recurred) – poor outcome group; RF (recurrence-free) – good outcome group.\n", - "6305 \n", - " Effect of hypoxia on apoptosis induction as determined by DNA fragmentation. Nucleosomal DNA fragments in 686 (A) and 1386 (B) cells were analyzed by gel electrophoresis after 24 or 48 h hypoxia. Apoptosis was confirmed by the appearance of a ladder of oligonucleosomal DNA. M, molecular standard; P, positive DNA ladder control.\n", - "6315 \n", - " rF6Hb expression as detected by immunoblotting using anti-His antibody (A) Time course induction of rF6Hb expression. Soluble fraction represents total cell lysate. (B) Purification of rF6Hb on Ni-NTA; Lanes: 1, flow-through (10 μg); 2, wash (5 μg); 3, Bound 1 (1 mL eluate, 2 μg); 4, Bound 2 (2 mL eluate, 2 μg). (C) Purification of rF6Hb eluted from Superose 12 (10 μg/fraction).\n", - "6316 \n", - " Expression of rF6Hy/rF6Hys as detected by immunoblotting using anti-His antibody (A) Time course induction of rF6Hy. (B) Purification of rF6Hy on Ni-NTA. Lanes: 1, Bound 2 (2 mL eluate; 5 μg); 2, Bound 1 (1 ml eluate; 5 μg); 3, wash (10 μg); 4, flow-through (10 μg). (C) Time course induction of rF6Hys. (D) Purification of rF6Hys on Ni-NTA. Lanes: 1, Bound 3 (3 mL eluate; 2 μg); 2, Bound 2 (2 mL eluate; 2 μg); 3, Bound 1 (1 mL eluate; 5 μg); 4, wash (10 μg); 5, flow-through (10 μg).\n", - "6335 \n", - " Monaural Sound Localization in PET Experiments Performed in the Three Groups of Subjects(A) CBF increases. Activations of the right striate and extrastriate cortices are observed in EBSP but not in the two other groups for the contrast of MSL minus its control task. Upper image series, sagittal slices; lower image series, coronal slices. X and Y coordinates refer to standardized stereotaxic space.(B) Behavioral data. Behavioral results in MSL task (with SE bars). The dashed lines represent the ideal performance, whereas the solid lines indicate the best linear fit to the observed localization performance. Negative angles on the abscissa correspond to the obstructed ear, while positive angles correspond to the unobstructed ear. Note the better performance of the EBSP group compared to the EBNP and SIG.\n", - "6336 \n", - " Binaural Sound Localization in PET Experiments Performed in the Three Groups of Subjects(A) CBF decreases. In the sagittal (upper image series) and coronal (lower image series) slices, a decreased CBF is observed in the visual cortex of SIG (striate and extrastriate cortices), for the contrast of BSL minus its control task. X and Y coordinates refer to standardized stereotaxic space.(B) CBF increases. In the sagittal (upper image series) and coronal (lower image series) images, a CBF activation peak is seen in the right ventral extrastriate cortex for the EBSP group, but not for the other two groups, for the contrast of BSL minus its control task.(C) Behavioral data. Behavioral results in the BSL task are presented (with SE bars). The dashed lines represent the ideal performance, and the solid lines indicate the best linear fit to the observed localization performance. All three groups were able to localize sounds accurately.\n", - "6339 \n", - " Correlational Analysis for Monaural Sound Localization in Blind PersonsThese data show the correlational analysis between performance (mean absolute error) in pointing task to monaurally presented sounds and CBF in a group of blind subjects. The two columns of brain images (left image series, sagittal sections; right image series, coronal sections) illustrate the statistical parametric map of the correlation, which is maximal in the ventral extrastriate cortex (A) but also significant in dorsal extrastriate (B) and striate (C) cortices. The red arrows in the coronal slices indicate the focus selected for the respective sagittal slices. The scattergram shows the individual values extracted from each of these regions; closed circles indicate blind subjects; open circles indicate SIG. The dotted vertical line represents the cutoff in performance for the a priori classification of blind subjects into those with low error rates (EBSP) and those who do not show the enhancement (EBNP). X and Y coordinates refer to standardized stereotaxic space.\n", - "6341 \n", - " Selective Constraint Plotted against Distance from the Coding Sequence in 5′ Flanking Regions and 3′ Flanking RegionsResults for (A) hominids and (B) murids. The 5′ flanking regions are shown left of the origin, and 3′ flanking regions, right. Segments of 500 bases starting from the start or stop codon were analyzed. Bootstrap 95% confidence limits are shown in light grey.\n", - "6342 \n", - " Selective Constraint at the 5′ End of First Introns Plotted against Distance from the Intron StartResults for (A) hominids and (B) murids. Segments of 500 bases starting from the 5′ end of intron 1 were analyzed. Bootstrap 95% confidence limits are shown in light grey. Constraint at the 3′ end of first introns is nonsignificant and close to zero in both hominids and murids.\n", - "6346 \n", - " (A-E): Morphology of the secondary invagination sites. Confocal micrograph (A, inverted) of a flat preparation of an embryo stained with phalloidin-rhodamine and light micrographs (B-D) and electron micrograph (E) of transverse sections through prosomal hemi-neuromeres. The midline is to the right. (A) Final pattern of the primary invagination sites in the opisthosomal segments 1 and 2. The invagination sites are arranged in 7 rows. The black dots correspond to the constricted cell processes of the individual precursor groups that are attached to the apical surface (arrow). (B) Morphology of the secondary invagination sites. At 250 hours the secondary invaginating cell groups (asterisks) are still attached to the apical surface. The individual groups are isolated by brighter sheath cells (arrowhead). The primary precursor groups have dissociated (arrow) and form basal cell layers. The longitudinal connective (lc) is already visible at the basal side. (C) The secondary invagination sites (asterisks) loose contact to the apical surface, when the epidermis (arrow) overgrows the ventral neuromeres. (D) After invagination the secondary neural precursors (asterisks) remain attached to each other forming epithelial vesicles. The cell processes run parallel to each other and extend to a lumen (arrow). (E) The cell processes (o) of the invaginating cells of a group are opposed to each other and the lumen between the cell processes is filled with microvilli (arrow). Cell junctions connect the individual processes (arrowheads). lc, longitudinal connective; o2 to o3, opisthosomal hemi-segments 2 to 3.\n", - "6349 \n", - " (A-j): Invagination of secondary neural precursors and formation of epithelial vesicles. (A-F) Confocal micrographs of flat preparations of embryos stained with phalloidin-rhodamine. (B-G) Flat preparations of the fourth prosomal hemi-segments. (A) At 220 hours about 25 secondary invagination sites form (arrow). There is no clear dividing line between the formation of secondary invagination sites (arrow) and invagination of primary neural precursors. Some primary invagination sites are still visible (arrowhead) The bars indicate the segment borders. (B) Apical optical section of the pattern of secondary invagination sites (arrow) at 240 hours of development. (C) Epidermal cells overgrow the ventral neuromeres between 250 and 300 hours (arrowheads) The arrow points to a secondary invagination group. (D) After invagination the individual cells of a groups remain attached to each other forming epithelial vesicles (arrow). (E) At 300 hours the anterior-posterior extension of the individual hemi-segments has been reduced leading to a rearrangement in the positions of the invaginated cell groups (arrow). (F) After 320 hours 8 of the 25 invaginated cell groups are no longer visible indicating that the cells have detached from each other. The arrow points to an invaginated cell group. (G) 10 cell groups are still visible at hatching (arrow). (H) Overview of the arrangement of epithelial vesicles (arrow) of the four prosomal hemi-segments corresponding to the four walking legs. The anterior-posterior reduction in size is clearly visible (compare to A). The bars indicate the segment borders. (I) Flat preparation of the prosoma at hatching. Epithelial vesicles are still visible (arrow). The bars indicate the segment borders, the arrowhead points to the midline. (J) Flat preparation of the brain at 350 hours. The arrow points to epithelial vesicles. ch, chelicera; l1 to l4, prosomal neuromeres corresponding to walking leg 1 to 4; leg 1, walking leg 1.p, pedipalp; ped, pedipalpal neuromere.\n", - "6351 \n", - " (A-C): Mitotic pattern in the ventral neuromeres after formation of the secondary invagination sites. Flat preparations of embryos stained with phalloidin-rhodamine (red) and anti-Phospho-Histon 3 (green). (A) Only scattered mitotic cells (arrowhead) are present in the ventral neuromeres after invagination of the secondary neural precursors (arrow). The pattern of cell divisions in the cephalic lobe and the prosomal segments at 310 hours of development is representative for the late embryonic stages. (B) Optical section through apical cell layers of the fourth prosomal hemi-neuromere. Only a few mitotic cells (arrowhead) are associated with epithelial vesicles. (C) A similar pattern is visible in basal cell layers of the same neuromere. The arrowhead points to a dividing cell, the arrow points to a dissociating epithelial vesicle. ch, cheliceral neuromere; cl, cephalic lobe; l1 to l2, prosomal hemi-neuromeres corresponding to walking legs 1 to 2; ped, pedipalpal hemineuromere.\n", - "6352 \n", - " (A-J): Proneural and neurogenic genes are re-expressed during formation of the secondary neural precursors. Flat preparations of the fourth and fifth prosomal hemi-segments after in situ hybridisation of whole embroys. (A-E) 220 hours of development, (F-J) 250 hours of development. Anterior is at the top, the midline to the left. (A) At 220 hours, CsASH1 expression has been down-regulated in all primary neural precursors (arrow) with the exception of one group (arrowhead). (B) At this time the pan-neural gene CsASH2 is still weakly expressed in the primary neural precursors (arrow). (C) CsDelta transcripts accumulate in the secondary invagination sites (arrow heads), while transcripts are down-regulated in the primary precursor groups. (D) A similar expression, although weaker, is visible after CsDelta2 in situ hybridisation. The arrow points to a region where CsDelta2 has been down-regulated, the arrowhead indicates expression in the secondary neural precursors. (E) CsNotch remains expressed at low levels in the ventral neuroectoderm. An up-regulation of CsNotch transcripts is visible in the secondary invagination groups (arrow). (F) At 250 hours CsASH1 expression can be detected in the secondary invagination sites (arrow), although it is not expressed in all of them. (G) CsASH2 seems to be expressed weakly in all secondary invaginating cells groups (arrow). (H) A high accumulation of CsDelta1 transcripts is visible in about 10 of the invagination sites (arrow), (I) while CsDelta2 seems to be xpressed in all invagination groups (arrow). (J) Cs Notch transcripts can be detected in all neuroectodermal cells at this time. l2 to l3, walking leg 2 to 3.\n", - "6359 \n", - " Expression of Gm-dpp in G. marginata embryos. (A) stage 2. The arrow points to expression in the dorsal portion of the neuroectoderm. (B) stage 3. The arrows point to the dorsal and ventral (middle) portion of the neuroectoderm, respectively. (C) stage 3. Aspect of the head. The arrow points to expression in the brain. (D) stage 4. Arrow: expression in the optic lobe. Asterisk: expression in the antennal neuromere. Arrowheads: expression in the heart. (E) stage 5. Arrow: expression in the optic lobe. Arrowheads: expression in the heart. (F) stage 6.1. The arrowheads denote expression in the dorsal portion of the germ band that is probably correlated with heart formation. A-E are in ventral aspect. F is in lateral aspect. Abbreviations: md, mandible; mx, maxilla; an, antenna; t1, t2, t3, first three trunk legs.\n", - "6363 \n", - " Possible endite homologs in the mouthparts of Glomeris. Schematic representations of the mouthparts of Glomeris (A-C). An insect mouthpart (maxilla of Schistocerca) is shown for comparison (D). (A) Glomeris maxilla. (B) Left and right maxilla of Glomeris already fused forming the gnathochilarium. (C) Glomeris mandible. The palp is proposed to be lost in Glomeris gnathalia ([7]; grey hatched line). The black hatched line indicates where the appendage inserts on the segment. Expression of dpp is shown in grey (hatched area in the maxilla: very weak expression). Please note that the figure shows all observed expression domains in a single drawing although really some domains appear at different time points (see text for a description of the temporal expression profile). None of the possible endite homologs in Glomeris mouthparts (lli, st, iml, and eml) expresses Gm-dpp in a fashion suggestive of a role in PD axis patterning. See text for details. Expression of dpp in Schistocerca is after [11]. Abbreviations: bs, base; ca, cardo; eml, external mandibular lobe; ga, galea; iml, internal mandibular lobe; lc, lacinia; le, lobus exterior; li, lobus interior; lli, lamella lingualis; lm, lobus medius; plp, palp; st, stipes.\n", - "6377 \n", - " A-C. The PEPCK-Ins transgene. Schematic representation (A). Example of PCR screening of PEPCK-Ins transgenic mice (B). Lanes 1–5 and lanes 10–14 are PCR reactions with genomic DNA extracted from mice that developed from microinjected mouse eggs. Primers specific for the PEPCK-Ins transgene were used for lanes 1–9 (30 cycles) while primers specific for mouse insulin 1 were used for lanes 10–18 (30 cycles). Lanes 6 and 15 are PCR negative controls (no DNA added). Lanes 7 and 16 are PCR reactions to demonstrate the specificity of the primers used (wild type NOD mouse DNA added). Lanes 8, 9, 17 and 18 are half copy spiked and plasmid controls respectively (positive controls). Example of Southern Blotting for the PEPCK-Ins transgene (C). Lane 1 One copy spiked sample (100 ng Balb/c genomic DNA + 102fg PEPCK-Ins plasmid), lane 2 genomic DNA from tail tip of F2 PEPCK-Ins mouse, lanes 3 and 4 are DNA from pups which died before weaning and lanes 5–7 are DNA from still born pups. Each lane was loaded with 15μg of genomic DNA that was digested with Xba I and Pst I to release the transgene.\n", - "6378 \n", - " A-B. Mouse insulin 1 mRNA. RT-PCR (A). Lanes 1A-6A are RT-PCR reactions using primers specific for mouse insulin 1 mRNA (30 cycles). Lanes 1B-6B are RT-PCR reactions using primers specific for mouse GAPDH mRNA (30 cycles). Lanes 1–4 are total RNA from the liver of progeny from founder T645-18, lane 5 is total RNA from the liver of progeny from founder T647-2 and lane 6 total RNA from the pancreas of progeny from founder T645-18. RPA for mouse insulin 1 mRNA (B). Lane 1 pancreatic total RNA, lane 2 liver total RNA from T647-2 progeny and lanes 3–7 liver total RNA from T645-18 progeny.\n", - "6379 \n", - " A-F. In-situ hybridisation. Pancreatic islets from a diabetic transgenic mouse illustrating insulitis, (A) antisense and (B) sense. Transgenic liver from a diabetic transgenic mouse (C) antisense and (D) sense. Wild type liver from a diabetic NOD mouse (E) antisense and (F) sense.\n", - "6382 \n", - " A-D. Haematoxylin and eosin, and insulin staining of pancreatic sections from transgenic PEPCK-Ins NOD mice. H & E staining of a pancreatic islet from a diabetic transgenic mouse illustrating insulitis (A), and from a normoglycaemic transgenic mouse (B). Insulin staining of a pancreatic islet from a diabetic transgenic mouse showing few remaining β cells (C) and from a normoglycaemic transgenic mice (D). Black Bar = 20μm for A-C, and 40μm for D.\n", - "6388 \n", - " Schematic of experimental setup to measure thumb force production in the transverse plane. (A) 3D view. (B) Side view with hand and thumb in place. Thumb extension and flexion occur in parallel with the palm, and abduction and adduction occur in a plane perpendicular to the palm with abduction moves away from the palm. (C) Visual guide for circumferential force production.\n", - "6428 \n", - " Specific silencing of hSpt5 expression by RNAi. (A) hSpt5 mRNA is 3261 nucleotides in length. siRNA targeting sequence for hSpt5 was selected from position 407 to 427 relative to the start codon. As a specific control, mutant siRNA containing 2 nucleotide mismatches (underline) between the target mRNA and the antisense of siRNA at the hypothetical cleavage sites of the mRNA was generated. (B) Evaluation of specific hSpt5 siRNA activity by RT-PCR. Total cellular mRNA was prepared from HeLa cells transfected without siRNA or with hSpt5 duplex or control siRNAs and was followed by RT-PCR, as described in Material and Methods. Each RT-PCR reaction included 100 ng total cellular mRNA, gene-specific primer sets for hSpt5 and hCycT1 amplification (0.5 μM for each primer), 200 μM dNTP, 1.2 mM MgSO4 and 1U of RT/platinum Taq mix. Primer sets for hSpt5 produced 2.6 kb products while hCycT1 produced 1.8 kb products. RT-PCR products were resolved on a 1% agarose gel and viewed by ethidium bromide staining. RT-PCR products are shown from cells that were not transfected with siRNA (lane 1), or cells transfected with single-stranded antisense hSpt5 siRNA (hSpt5 (AS), lane 2), hSpt5 duplex siRNA (hSpt5 (DS), lane 3), or mismatch hSpt5 duplex siRNA (hSpt5-mm (DS), lane 4). Lane M is a marker lane. (C) Analysis of specific hSpt5 siRNA activity by western blotting. Cell lysates were prepared from HeLa cells mock-transfected without siRNA (lane 1), or transfected with single-stranded antisense hSpt5 siRNA (hSpt5 (AS), lane 2), hSpt5 duplex siRNA (hSpt5 (DS), lane 3), or mismatch hSpt5 duplex siRNA (hSpt5-mm (DS), lane 4). Cell lysates were analyzed by 10% SDS-PAGE. Protein contents were detected by immunoblotting assay with antibodies against hSpt5 (top panel) and hCycT1 (lower panel).\n", - "6439 \n", - " Protein production levels under various conditions. SDS PAGE shows protein levels of SecB (A) and proOmpA (B). Gels were stained with Coomassie Blue. A. 15% PAGE of cell lysates from BL21(λDE3) containing pJW25. Arrow indicates SecB migration. Lane 1, molecular weight marker; lanes 2 (uninduced) and 3 (induced) are samples from cells immediately after transformation; lanes 4 (uninduced) and 5 (induced) are the same strain after 3 subculturings; lanes 6 (uninduced) and 7 (induced) after 8 subculturings; lanes 8 (uninduced) and 9 (induced) are BL21(λDE3) retransformed with the plasmid rescued from the strain in lane 6. We note that lane 8 was unintentionally underloaded. B. 10% PAGE of cell lysates from BL21(λDE3) containing pJGGV. Arrow indicates proOmpA migration. Lane 1, molecular weight marker; lanes 2 (uninduced) and 3 (induced) are samples from cells immediately after transformation; lanes 4 (uninduced) and 5 (induced) are the same strain after 3 subculturings; lanes 6 (uninduced) and 7 (induced) are BL21(λDE3) retransformed with the plasmid rescued from the strain in lane 4.\n", - "6471 \n", - " Comparison of Ndn and Snurf-Snrpn transcriptional unit expression patterns in the E13.5 mouse embryo. Comparison of Ndn (A, E, I), Snurf-Snrpn (B, F, J), MBII-85 (C, G, K) and MBII-52 (D, H, L) RNA expression on E13.5 mouse embryo adjacent sagittal sections, from lateral to more medial sections (rows I to II). Ndn as well as Snurf/Snrpn, MBII-85 and MBII-52 are almost exclusively expressed in the developing nervous system and display strikingly similar expression patterns in the developing brain and spinal chord. In the peripheral nervous system, Ndn and Snurf-Snrpn are expressed at similar levels in cranial (Ndn: A; Snurf-Snrpn: B) and dorsal root ganglia (Ndn: I; Snurf-Snrpn: J) whereas MBII-85 (C, K) and MBII-52 (D, L) are expressed at much lower levels or not at all. Note that Ndn is additionally expressed in muscle tissues such as the skeletal muscles (A) and the tongue (E), and in the adrenal primordium (I). ap, adrenal primordium; drg, dorsal root ganglia; gn, gonad; hp, hypothalamus; ht, heart; lg, lung; lv, liver; mb, midbrain; mo, medulla oblongata; mt, metanephros; ms, muscles; poa, post-optic area; pp, telencephalic epithelium preplate; ps, pons; sa, septal area; tg, tongue. Asterics indicate cranial and dorsal root ganglia in A, B, C, D.\n", - "6473 \n", - " Transgenic analyses. (A) Structure and copy number of the BAC109 transgene in line Tg92. The BAC109 transgene, the relative positions of the Ndn and Magel2 genes, and the transgenic EagI and PmeI restriction fragments detected with probes 5' and 3' are represented on the upper diagram. Genomic DNA was isolated from wild type (WT) or transgenic (TG) mice, digested by EagI or PmeI, separated by PFGE, blotted and hybridized to the 5' or 3' probes. The presence of the 54 and 50 kb Eag1 transgenic fragments detected by the 5' and the 3' probes respectively demonstrate the integrity of the transgene. Eag1 is a methylation sensitive enzyme which explains the presence of a higher hybridization band corresponding to undigested methylated DNA (Und). Hybridization of PmeI digested genomic DNA with either the 5' or 3' Ndn probes, indicated that the BAC integrated in one full copy along with a truncated copy containing the whole 5' region upstream Ndn up to the Ndn promoter.(B) Non imprinted brain-specific expression of transgenic Ndn. Ndn expression was tested by Northern blot analysis. RNAs were isolated from Tg92mat-Ndn+/-pat or wild type littermate tissues: Br, brain, Kd, kidney, Lv, liver, Sp, spleen, Th, thymus, Ht, heart, Mu, muscles. Note that Ndn transgenic mRNAs are not detected in adult muscles whereas Ndn endogenous mRNAs are. After being hybridized to an intragenic Ndn probe, Northern blots were stripped and rehybridized to a β-actin probe to check for the presence and integrity of RNAs.\n", - "6475 \n", - " Mapping of DNase I hypersensive sites in the Ndn and Magel2 genomic region. (A) The diagram shows a map of the sequenced genomic region present in the BAC109. Localisation of HS sites is indicated by arrows in relation to the Ndn and Magel2 genes, and to the AK086725 EST. Position of BglII and BamH1 sites and probes 1 to 10 are indicated. Asterics indicate polymophic BglII restriction sites present on castaneus alleles detected with probes 1/2 and probes 7/8. A, B and C design three non-coding regions of homology between the mouse and the human genomes.(B) Southern blot analysis of BglII or BamHI cut genomic DNA isolated from brain nuclei treated with increasing concentrations of DNase I (from 0 to 100 U). Maternal (mat) and paternal (pat) alleles are indicated when discrimination is possible.(C) Sequence comparison between mouse and human Ndn/Magel2 genomic regions. Alignments were peformed with the genome VISTA program (window size 100 bp, homology threshold 70%). Conserved non-coding sequences (CNS) are depicted in pink, untranslated regions (UTR) and ORF in pale and dark blue respectively. Genes are indicated by blue arrows. Repeated elements are depicted above the sequences comparison. Mapped HS sites are indicated by vertical arrows. A, B and C design three non-coding regions of homology between the mouse and the human genomes. Although the C region is depicted as a non-gening sequence, recent isolation of ESTs corresponding to this region suggests that it might belong to the Magel2 transcription unit. The asterisk above the C region indicates the beginning of the ESTs.\n", - "6505 \n", - " Xmab21l2 rescues dorsal structures in BMP4 injected embryos. (A) As previously described, injection of 0.6 ng of BMP4 mRNA gave rise to ventralized embryos. The most severely ventralized phenotype of BMP4 injection, called bauchstück, was scored with a dorso-anterior index (DAI) of 0 (top), whereas normally dorsalized embryos were assigned a DAI of 5 (bottom). (B) Embryos were injected with 0.6 ng BMP4 (n = 111), with 0.6 ng BMP4 plus 0.8 ng Mab21l2 (n = 83), or with 0.6 ng BMP4 plus 1.6 ng Mab21l2 (n = 101). In each group, we scored the percentage of complete ventralization (DAI = 0, grey bars) and normal dorsal axis formation (DAI = 5, black bars) in embryos that completed development. Intermediate classes are omitted in the plot. Coinjection of embryos with Mab21l2 significantly increased the percentage of correctly dosalized embryos (see text for details). Statistical analysis was conducted using the Chi square algorithm (1 df). *: p = 0.0005; **: p = 0.0087.\n", - "6506 \n", - " Xmab21l2 restores the normal expression of Xvent2 and Chordin in BMP4-injected embryos. Chordin (A–C) and Xvent2 (D–E) expression were analyzed by whole mount in situ hybridization. Embryos are shown in a vegetal view, dorsal to the top, ventral to the bottom. (A, D) Wild type expression of Chordin (A) and Xvent2 (D) in stage 10.5 gastrulae; (B, E) embryos injected with 1.2 ng of BMP4 mRNA alone showed reduced Chordin expression (B) (22/25) and expanded Xvent2 expression (E) (16/25); (C, F) embryos co-injected with 1.2 ng of BMP4 and 1.6 ng Xmab21l2 mRNA showed a rescue of wild type Chordin (C) (17/36) and Xvent2 expression (F) (24/29). (G) Percentage of embryos exhibiting wild type (black bars) or reduced (grey bars) Chordin gene expression in embryos injected with 1.2 ng BMP4 alone, and in embryos coinjected with 1.6 ng Mab21l2. Coinjection of Mab21l2 significantly increased the number of embryos exhibiting a wild type Chordin expression pattern; *: p = 0.004. (H) Percentage of embryos exhibiting wild type (black bars) or expanded (grey bars) Xvent2 gene expression in embryos injected with 1.2 ng BMP4 and in embryos coinjected with 1.6 ng Mab21l2. Again, Mab21l2 significantly increased the number of embryos exhibiting a wild type Xvent2 expression pattern; **: p = 0.00044. Statistical analysis was conducted using the Chi square algorithm (1 df).\n", - "6507 \n", - " Mab21l2 interacts with Smad1 in vitro and in vivo. (A) Lanes 1, 2: immunoblotting of total lysates from P19 cells, mock- and Smad1-transfected, respectively. P19 cells do not express detectable levels of endogenous SMAD1. Lanes 3–8: Affinity chromatography (pull-down) experiment. High-stringency eluates from untransfected P19 were separated by SDS-PAGE and transfered onto nitrocellulose filters. The blots were immunolabeled using an anti-SMAD1 antibody. Lanes 3–6: the in vitro interaction is not strictly dependent on activation of BMP signaling: the pull-down experiment was performed with 20 μl (3, 4) and 40 μl of P19 cell lysates (5, 6). Lysates came from P19 cells treated (4, 6) or untreated (3, 5) with BMP4. Lanes 7, 8: an His-ZZ-MAB21L2 protein (HisMab) synthesized in E. coli (lane 8) was coupled to a sepharose-Ig resin and incubated with cell lysates of P19 cells treated with BMP4. As a negative control, an in-vitro synthesized His-ZZ incubated with the same P19 lysates fails to pull down a 53 kD band. Arrows: SMAD1 (53 kD). (B) direct interaction between SMAD1 and MAB21L2; no direct interaction between SMAD4 and MAB21L2. An His-ZZ-MAB21L2 protein (+Mab) synthesized in E. coli (lane 2) was coupled to a sepharose-Ig resin and incubated with in vitro-translated SMAD1 (lanes 2), SMAD4 (lanes 4), and SMAD1 + SMAD4 (lanes 6). Negative controls were represented by His-ZZ-coupled resins (-Mab) incubated with the same in vitro-synthesized proteins (lanes 3, 5, 7). Lanes 1 and 8 contain in vitro-synthesized SMAD1 and SMAD4, respectively. (C) BMP4-dependent in vivo co-immunoprecipitation of flag-SMAD1 and myc-MAB21L2 in P19 cells. Cells were mock-transfected, transfected with flag-SMAD1 and/or with myc-MAB21L2, as indicated, and either treated with BMP4 or left untreated. In lanes 3–7, cell lysates were immunoprecipitated with a monoclonal anti-flag antibody. Cell lysates in lanes 1, 2 and immunoprecipitates in lanes 3–7 were gel fractionated and transfered to nitrocellulose filters. Blots were immunolabeled with an anti myc antibody. Arrow (42 kD) points to a band in lanes 2, 3) corresponding to myc-MAB21L2. (D) in vivo co-immunoprecipitation of flag-SMAD1 and myc-MAB21L2 in stage 11 Xenopus embryos, facilitated by BMP4 overexpression. Embryos were water-injected, injected with flag-Smad1 and/or with myc-Mab21l2 RNA, as indicated, and coinjected with BMP4 where indicated. In lanes 3–7, cell lysates were immunoprecipitated with a monoclonal anti-flag antibody. Embryo lysates in lanes 1, 2 and immunoprecipitates in lanes 3–6 were gel fractionated and transfered to nitrocellulase filters. Blots were immunolabeled with an anti myc antibody. Arrow (42 kD) points to a band in lanes 2–4) corresponding to myc-MAB21L2.\n", - "6508 \n", - " When targeted to a heterologous promoter, Mab21l2 behaves as a strong transcriptional repressor. (A) An in vitro-translated chimeric protein containing the GAL4 DNA binding domain fused to the N-terminus of MAB21L2 was used in an electrophoretic mobility shift assay. An end-labeled ds-DNA containing the GAL4 nucleotide binding site (5XUAS) was incubated in native conditions with in vitro translated GAL4-MAB21L2 (G-M) and separated electrophoretically by nondenaturing PAGE. As negative controls, we used free oligonucleotides (F) and rabbit reticulocyte lysates (RRL). As a positive control we used a previously tested GAL4 fusion protein, GAL4-D9NT (G-D9) [40]. The arrow indicates a bandshift specific for GAL4-MAB21L2 and absent in negative controls. u: unbound. (B) 5XUAS-luc transcription is clearly downregulated in cells transfected with GAL4-MAB21L2 (G-M) vs. untransfected COS7 cells or same cells transfected with GAL4 DBD, G-D) alone (*: p = 0.0019). No downregulation of 5XUAS-luc activity was observed in COS7 cells transfected with a fusion of GAL4 and the N-terminal domain of the HOXB3 protein, which possesses no transcriptional activation or repression activity [24] (ns: not significant). Statistical analysis was conducted using the T test method (two tails).\n", - "6509 \n", - " Oxidase activity induced by peptide agonists and the effect of PBP 10. Neutrophils were activated by fMLF or WKYMVM and the extracellular release of superoxide anions was recorded by chemiluminescence (expressed in Mcpm). (A) The figure shows the kinetics of the neutrophil response to two concentrations (100 nM and 20 nM) of fMLF or WKYMVM. (B) Dose dependent oxidase activation induced by the two agonists. The peak values were measured and the responses are given as percent of the maximal response. (C) Neutrophils were incubated for 120 minutes in the absence (control) or presence of pertussis toxin (PTX; 500 ng/ml) and the cells were then activated with fMLF (100 nM), WKYMVM (100 nM) or the receptor independent PKC activator PMA (100 nM) (inset). For comparision, the response induced by the two peptides after 90 minutes long incubation time with pertussis toxin is also included. (D) Effect of different concentrations of PBP10 on the neutrophil NADPH-oxidase response induced by fMLF or WYMVM, respectively. Data are expressed as percent of control (without PBP10; mean ± SD of three independent experiments).\n", - "6510 \n", - " Effect of different inhibitors on the neutrophil NADPH-oxidase activity. (A) Neutrophils were incubated with different concentrations of the PI3K specific inhibitor Wortmannin at 37°C for 30 minutes followed by stimulation with fMLF (100 nM) or WKYMVM (100 nM). A representative experiment is shown. (B) Neutrophils were incubated with the cell impermeable PIP2 binding peptide QRLFQVKGRR (1 μM final concentration) at 37°C for 5 minutes followed by stimulation with WKYMVM (100 nM). The effect of PBP10 (1 μM) is included for comparison.\n", - "6513 \n", - " Effect of PBP10 on oxidase activity induced by peptide agonists in the presence of cytochalasin B. Neutrophils were activated by fMLF (100 nM) or WKYMVM (100 nM) in the presence of cytochalasin B (2.5 μg/ml, final concentration) and the extracellular release of superoxide anion was recorded (expressed in Mcpm). (A) The figure shows the kinetics of the neutrophil response to fMLF in the absence (solid line) and presence (broken line) of PBP10 (5 μM). The results obtained are summarized in the inset, expressed as the integral values of oxidase activities from the controls (presence of cytochalasin B but not PBP10) and the activities in the presence of both cytocalasin B and PBP10. (B) The figure shows the kinetics of the neutrophil response to WKYMVM in the absence (solid line) and presence of PBP10 (broken line). The results obtained are summarized in the inset and expressed as the integral values of oxidase activities from the controls (presence of cytochalasin B but not PBP10) and the activities in the presence of both cytochalasin B and PBP10.\n", - "6538 \n", - " Analysis of residuals of PLGEM fitted on three different real-life data sets. (A) PLGEM is fitted on the 16iDC data set (MG-U74Av2) following the method described in the text, setting p = 10 and q = 0.5. (B) Model residuals are plotted as a function of the rank of the mean absolute expression level. (C) Distribution of pooled residuals. (D) The quantiles of the distribution of pooled residuals are plotted against the quantiles of a standard normal distribution. The same procedure is applied to the Leigh syndrome data set (HG-U133A, panels E-H) and to the Muscle biopsies data set (HG-U95Av2, panels I-L).\n", - "6553 \n", - " Hypothetical Parasite Burden Profiles during Pregnancy with SP IPT in a High-Transmission SettingEntomological inoculation rate is about 50 infectious bites per person per year. Note that many infections self-cure (each infection is depicted as a green line). The hatched bars represent the duration of “suppressive prophylactic activity”, and the solid bars represent the period during which parasite multiplication is suppressed (i.e., levels exceed the in vivo MIC). The horizontal dotted line at 108 parasites represents the level at which malaria can be detected on a blood film. (A) represents a drug-sensitive area; (B) represents a moderately resistant area.\n", - "6567 \n", - " The Three Features of APLThe three features of APL are (A) accumulation of abnormal promyelocytes, (B) fibrinogenopenia and disseminated intravascular coagulation, and (C) the chromosomal translocation t(15;17)(q22;q21), the resultant fusion transcripts, and variants.\n", - "6569 \n", - " Leukemogenic Effects of PML-RARá and Mechanisms of ATRA/Arsenic Trioxide in the Treatment of APL(A) In the absence of RA, RARα/RXR heterodimers recruit the transcription corepressor (CoR), which mediates transcriptional silencing by mechanisms that include direct inhibition of the basal transcription machinery and recruitment of chromatin-modifying enzymes. Chromatin modification includes histone deacetylation, which leads to a compact chromatin structure that impairs the access of transcriptional activators. In the presence of physiological concentrations (10−9–10−8 M) of RA, the transcription corepressor is released and the coactivator is recruited to the RARα/RXR heterodimer, resulting in histone acetylation (AC) and overcoming of the transcription blockage.(B) PML-RARα fusion protein binds to RARα target genes either on its own or with RXR and then recruits corepressors, leading to transcriptional repression and myeloid differentiation inhibition. PML-RARα oncoprotein sequesters the normal RXR and PML, inhibits the PML/P53 apoptotic pathway, and delocalizes PML and other proteins from the nuclear body. PML-RARα also may affect interferon (IFN) and other signal pathways. Abnormalities in protein tyrosine kinases (e.g., FLT3, c-fms) may collaborate with PML-RARα to cause APL.(C) In the presence of pharmacological doses of ATRA or arsenic trioxide, the PML-RARα fusion is degraded in ways that are dependent on caspases and proteasomes. The degradation of PML-RARα may lead to derepression of transcription suppression and restoration of PML nuclear body structure. The blockade of other signaling pathways is also released, and the anti-apoptotic effect of PML-RARα is lost. ATRA also induces cyclic AMP (cAMP), which reverses the silencing of RXR, induces the expression of RA-induced genes and cyclooxygenase 1 (Cox 1), inhibits angiogenesis, and downregulates tissue factor. Subsequently, ATRA induces terminal cell differentiation, while arsenic trioxide induces partial differentiation and/or apoptosis of APL cells. The effects of ATRA and arsenic trioxide are indicated with red and blue arrows, respectively. AF2, the ligand-dependent transcriptional activation domain contained within the C-terminal E domain of RARα; D522, aspartate at residue 522; K160, lysine at residue 160; K490, lysine at residue 490; RARE, retinoic acid response element; SUG-1, a component of proteasome 19S complex that can bind with the activated AF2 domain of RARα.\n", - "6652 \n", - " Expression profiles of regulatory genes throughout male gametophyte development. (a) Core cell-cycle genes; (b) transcription factors; (c-f) selected transcription factor families. (c) R2R3-MYB; (d) WRKY; (e) NAC; (f) C3H. Expression profiles of all transcription factor families analyzed are available as Additional data files 1 and 3. (g) Core translation factors. (h) Poly(A)-binding (PAB) protein genes. Putative male gametophyte-specific (bold) or enhanced (bold dashed) genes are highlighted.\n", - "6746 \n", - " Cumulative concentration-response curves to Ca2+ of bronchial rings obtained from sensitized control (Control; open circles) and repeatedly ovalbumin-challenged (OA-challenged; closed circles) mice. Bronchial rings were preincubated with 10-3 M acetylcholine (ACh) in the presence of 10-6 M nicardipine (A) or isotonic 60 mM K+ in the presence of 10-6 M atropine (B) in Ca2+-free, 0.05 mM EGTA solution. Each point represents the mean ± S.E. from 6 experiments. The Ca2+-induced contraction of the ACh-stimulated bronchial smooth muscles was significantly augmented in the OA-challenged group (A; P < 0.05 by ANOVA), whereas no significant change in the Ca2+-induced contraction of the high K+-depolarized muscles was observed between groups (B).\n", - "6747 \n", - " Acetylcholine (ACh)-induced Ca2+ sensitization of murine bronchial smooth muscle. (A) A typical recording of contraction induced by Ca2+ (pCa 6.0 and 5.0) and ACh (10-5–10-3 M) with guanosine triphosphate (GTP; 10-4 M) in α-toxin-permeabilized bronchial smooth muscle isolated from a sensitized control mouse. In the presence of GTP, ACh induced further contractions even in the constant Ca2+ concentration at pCa 6.0, i.e., ACh-induced Ca2+ sensitization, in an ACh-concentration-dependent manner. (B) Concentration-response curves for ACh (10-5–10-3 M)-induced Ca2+ sensitization in α-toxin-permeabilized bronchial smooth muscle isolated from sensitized control (Control; open circles) and repeatedly ovalbumin-challenged (OA-challenged; closed circles) mice. The data are expressed as percentage increase in tension induced by ACh (10-5–10-3 M) in the presence of Ca2+ (pCa 6.0) and GTP (10-4 M) from the sustained contraction induced by pCa 6.0. Each point represents the mean ± S.E. from 6 experiments. The ACh-induced Ca2+ sensitization of bronchial smooth muscle contraction was significantly augmented in the OA-challenged mice (*P < 0.05 vs. Control group by unpaired Student's t-test).\n", - "6748 \n", - " Effect of Clostridium botulinum C3 exoenzyme, an inhibitor of RhoA protein, on the acetylcholine (ACh)-induced Ca2+ sensitization of the α-toxin-permeabilized bronchial smooth muscle of mice. (A) Typical recordings of contraction induced by Ca2+ (pCa 6.0 and 5.0) and ACh (10-3 M) with guanosine triphosphate (GTP; 10-4 M) in α-toxin-permeabilized bronchial smooth muscle isolated from a sensitized control mouse. In the presence of GTP, ACh induced a further contraction even in the constant Ca2+ concentration at pCa 6.0, i.e., ACh-induced Ca2+ sensitization (a). The ACh-induced Ca2+ sensitization was re-estimated after treatment with C3 exoenzyme (10 μg/mL, for 20 min; b). (B) Summary of the effects of C3 exoenzyme on the ACh-induced Ca2+ sensitization of bronchial smooth muscle contraction in the sensitized control (Control) and repeatedly ovalbumin (OA)-challenged (OA-challenged) mice. The data are expressed as percentage increase in tension induced by ACh (in the presence of Ca2+ and GTP) from the sustained contraction induced by pCa 6.0. Each column represents the mean ± S.E. from 6 experiments. *P < 0.05 vs. Control group (Before C3) and #P < 0.05 vs. respective Before C3 group by Bonferroni/Dunn's test.\n", - "6749 \n", - " The levels of RhoA protein in the bronchi obtained from the sensitized control (Control) and repeatedly ovalbumin (OA)-challenged (OA-challenged) mice. (A) Typical immunoblots. Lane 1; Control, lane 2; OA-challenged, and GAPDH; glyceraldehyde-3-phosphate dehydrogenase. The bands were analyzed by a densitometer and normalized by the intensity of corresponding GAPDH band, and the data are summarized in B. Each column represents the mean ± S.E. from 5 experiments. The expression level of RhoA protein in the bronchi was significantly increased in the OA-challenged group (*P < 0.001 vs. Control group by unpaired Student's t-test).\n", - "6753 \n", - " Differentiated adipocytes bind and internalize more RAP than pre-adipocytes. Pre-adipocyte 3T3-L1 cells and differentiated adipocytes were incubated with 125I-RAP (500 ng/ml) in the presence (hatched bars) or absence (solid bars) of unlabeled RAP (20 μg/ml) at 4°C for 3 h (A) or 37°C for 3 h (B). For 4°C incubations, bound ligand was solubilized and directly quantitated by scintillation counting. For 37°C incubations, culture media was processed for trichloroacetic acid (TCA) precipitation and soluble radioactivity, representing degraded ligand, was quantitated by scintillation counting.\n", - "6754 \n", - " Adipocyte differentiation results in increased synthesis of a high molecular weight proteoglycan that consists of a mixture of heparan and chondroitin sulfate glycosaminoglycan moieties. Pre-adipocyte 3T3-L1 cells and differentiated adipocytes were incubated for 20 h with 35SO4 (125 μCi/ml). (A), cells were lysed with 8 M urea and proteins were fractionated by anion exchange chromatography as described in Methods. Radioactivity in each fraction was determined by scintillation counting. (B), fractions from (A) were separated by 7% SDS-PAGE and subjected to phosphorimager analysis (upper panel, pre-adipocytes; lower panel, adipocytes). (C), 35SO4-labeled proteoglycans, enriched by anion exchange chromatography, were incubated with or without heparinase I (5 Units/ml), chondroitinase ABC (5 Units/ml), or both enzymes for 20 h at 37°C. Labeled material was then fractionated by size exclusion chromatography and fractions were assessed by scintillation counting.\n", - "6756 \n", - " Inhibitors of HSPG maturation have no effect on adipocyte differentiation. 3T3-L1 pre-adipocytes were incubated with or without 3 mM pNP-Xyl or 4-MUmb concurrently with differentiation reagents for 4 d. Media was then changed to include just insulin with or without 3 mM pNP-Xyl or 4-MUmb for an additional 4–8 d. (A), cell lysates were immunoblotted with anti-VLDL-R mAb (1:50, culture supernatant), anti-LRP antisera (1:2000), or anti-CD36 IgG (5 μg/ml). For anti-leptin, proteins in culture supernatant were concentrated 10-fold by acetone precipitation prior to SDS-PAGE fractionation and immunoblotted with anti-leptin IgG (2 μg/ml). (B), following differentiation and xyloside treatment, cells were cultured for 16 h in serum-free, phenol red-free media. Culture supernatants were then assayed for LPL enzymatic activity as described in Methods. No significant difference was found in LPL levels between adipocytes treated with xylosides and untreated adipocytes (asterisk, p-value <0.01).\n", - "6796 \n", - " (A) Disease-free survival curves for women <35 vs. ≥ 35 years old. Patients younger than 35 had significantly worse outcomes than their older counterparts (p < 0.001). (B) Overall survival curves showing patients younger than 35 had significantly worse outcomes than their older counterparts (p = 0.002).\n", - "6797 \n", - " (A) Disease-free survival curves in axillary lymph node-negative patients showing no significant difference between the two age groups (p = 0.223). (B) Disease-free survival curves in axillary lymph node-positive patients showing patients younger than 35 had significantly worse outcomes than their older counterparts (p < 0.001).\n", - "6813 \n", - " Phase-contrast photomicrographs of fragile X progenitor cells The figure shows clusters/spheres during the initial stages (2–3 days after plating) of adherence to a fibronectin substrate. (A) 4×; (B) 10×; (C) 20×. Confluent serum- and growth factor-expanded cultures were serum deprived for one week in the presence of growth factors, then lifted with enzyme-free buffers and transferred to new plates with no fibronectin substrate. After growing the resulting clusters/spheres for two weeks, the clusters/spheres were transferred to new fibronectin-coated plates. Clusters/spheres (black arrows) are abundant and are seen adhering to the substrate. Cells (black arrowheads) can be seen streaming from the spheres and spreading out on the substrate.\n", - "6814 \n", - " Staining of fragile X progenitor cells, grown under expansion conditions In all panels, nuclei are stained with DAPI (blue), while the second color represents antibody staining as follows: (A) multipotential neural progenitor lineage marker, CD133 (red); (B) neural cell adhesion molecule, NCAM (green); (C) CXCL12 (SDF-1) cytokine receptor, CXCR4 (fusin, CD184, red); (D) β-III-tubulin (green); (E) the glial fibrillary acidic protein, GFAP (green); (F) nestin. (100×).\n", - "6815 \n", - " Markedly reduced staining with anti-FMRP antibody of neural progenitor cells from a fragile X patient FMRP staining (green) is greatly reduced in the fragile X derived cells (A) relative to progenitor cells from an unaffected control (B). Cell nuclei counterstained with DAPI (blue); both panels, 40×.\n", - "6816 \n", - " Analysis of plant CNB domains. (A) Arabidopsis CNB domains (CNTE1, KAT1 and CNGC2) were aligned against several well studied CNB domains including regulatory subunits of PKA (RIα and RIIβ), Epac1, Epac2, and cyclic GMP dependent kinase 2 (CGK2) from humans, HCN2 from mouse and E. coli CAP. Highlighted on the alignment are glycine residues involved in loop structures (dark grey arrows), residues forming the hydrophobic pocket for cNMP binding (green arrows) and residues proposed to contact the phosphate of the cNMP (blue arrows). The highly conserved helix capping acidic residue is shown in red. Secondary structure is denoted by arrows above the alignment, with light blue for alpha helices and pink for beta sheets and is based on the secondary structure of HCN2. (B) A homology model of atCNTE1 was generated from the known structures of CNB domains. Key residues are shown as stick representations and are colored and labeled according to the color scheme described in (A). The cGMP ligand is shown in magenta and is based on the structure of cGMP bound to HCN2 [pdb: 1Q3E] superimposed over our model. Figure was generated with Molscript [83] and Raster3D [84].\n", - "6819 \n", - " Biochemical evidence for lack of a cyclic nucleotide dependent kinase in Arabidopsis thaliana. (A) Protein kinase assays using Kemptide as a substrate. Assays were conducted on identically prepared extracts of Arabidopsis and rat adipose tissue in the presence or absence (control) of 10 μM cyclic nucleotide as indicated. Scale is offset in order to visualize both sets of results. All assays were performed in duplicate from three separate preparations and error bars indicate standard error for three separate preparations. (B) Western blotting of extracts with PKA catalytic (PKAcs) and regulatory (RII) subunit polyclonal antibodies. The PKAcs antibody was affinity purified according to [82] and used at 0.5 μg/mL while the RII antibody was used as crude serum at 5000X dilution. Lanes are as follows (A), 10 ng of purified bovine PKAcs or RII, (B) 25 μg clarified crude Arabidopsis extract, (C) 25 μg clarified crude rat adipocyte extract. Positions of mammalian PKA and RII are indicated with arrows.\n", - "6840 \n", - " Changes in allelic pattern indicated by an arrow, observed in superficial tissue (Ts) as compared to blood (germline DNA, N) of patients with bladder carcinoma: (A) Deletion at BAT – 26; (B) Insertion at BAT – 40; (C) Insertion at D2S123; (D) Loss of heterozygosity at D9S283; (E) Biallelic alteration at D9S1851 and (F) Deletion at D18S58\n", - "6841 \n", - " Superficial tumor tissues and blood (control) of bladder tumor patients demonstrated no change at (A) TGFβ RII; (B) BAX; (C) hMSH3 and (D) IGFIIR\n", - "6842 \n", - " (A) Example of clustering in an undirected network. Continuous and dash-dotted lines mean interaction between nodes. In addition, the dash-dotted line defines the only triangle where the node 1 (red) is one of the vertices. The node 1 has 4 neighbors (ki = 4), and among these neighbors only one pair is connected (n1 = 1). The total number of possible triangles that could go through node i is 6. Thus, the clustering coefficient has the value C1 = 1/6. High density of triangles means high clustering coefficient. (B) We show an example of the line graph transformation. The initial graph G corresponds to one subgraph which belongs to the Lysine Biosynthesis metabolic pathway. This graph is constructed by taking nodes as chemical compounds and edges as reactions. By applying the line graph transformation we find graph L(G), which is the reaction graph embedded in the graph G. The nodes of the graph L(G) are the reactions of the graph G [13].\n", - "6844 \n", - " (A) Graph G with two hubs with degree k' and k\" connected by edge a. (B) The corresponding line graph L(G) after the line graph transformation is done. (C) Graph G where edges b and b' have a common node as endpoint. (D) Line graph of (C). It is worth noticing that (D) has only one more edge than (B). Hence, (D) has one more triangle that go through node a than (B).\n", - "6848 \n", - " (A) We plot the results of the hierarchical model for CT(k) for different configurations. 3 initial nodes and up to 7 iterations (circles), 4 initial nodes and up to 5 iterations (triangles), 5 initial nodes and up to 4 iterations (squares). Prom top to bottom (3 initial nodes (black), 4 initial nodes (red), 5 initial nodes (green)), we show with lines the results of CT(k) obtained by means of Eq. (8). (B) The lines have the same meaning as before and the diamonds correspond to the experimental data for reactions from the KEGG database [14]. Experimental data involves 163 organisms. Circles (red): Experimental data binned into seven intervals according to degree (1 38 and ss1 = 1; Black bars: Asp with pac > 20 and ss2 = 1. (B) Two profiles for the same amino acid (Leu) in different structural environments. Grey bars: Leu with pol > 53 and ss1 = 1; Black bars: Leu with pol > 53 and ss1! = 1.\n", - "6885 \n", - " Process failure mode distribution (A) Process-related failure mode distribution. Most of the process-related failed reads have a Q20 < 100 with the primary mode of failure being \"Low signal, no DNA,\" or no template DNA in the sequencing reaction (confirmed by agarose gel electrophoresis). (B) Template-related failure mode distribution. Most of the template-related failed reads are a result of \"Poly A Tail,\" or 3' poly A stretch that leads to slippage in sequence data. Reads with a \"Low signal 5', 3' template characteristic\" failure mode contribute to the largest proportion of data with read lengths Q20 < 100.\n", - "6887 \n", - " Gene trees displaying the microarray generated expression profiles of abdomen-derived cDNAs in blood-fed compared to sugar-fed adult female mosquitoes during the following times: 5 and 30 minutes during blood meal (DBM), 0, 1, 3, 5, 12, 16, 24, and 48 hours post blood meal (PBM). k-means clustering of all genes up-regulated and down-regulated at least two-fold during at least one of the ten time points generated three sets of genes. These k-means-derived groups of genes were hierarchically clustered for visualization and include Set 1 designated the Early Genes (A), Set 2 designated the Middle Genes (B), and Set 3 designated the Late Genes (C). Each gene is represented by a single row of colored boxes; each time point is represented as a single column of colored boxes. The expression scale is represented as a gradation of color ranging from 5 fold induced genes indicated by saturated red to 2.5 fold repressed genes indicated by saturated green.\n", - "6889 \n", - " Parallel coordinates display of expression profiles of differentially expressed PCA-filtered genes from the Early Genes (A), Middle Genes (B), and Late Genes (C). X-axes correspond to a successive time point. Y-axes denote the ratio of fluorescent intensities of blood-fed to sugar-fed samples at each time point for each gene in Panels (A), (B), and (C). Plotted genes had a PCA 1 value greater than 0.5 or less than -0.5, or a PCA 2 value greater than 0.5 or less than -0.5. In Panel (D), the activity levels of juvenile hormone (JH) and ecdysone (20-E) are plotted on a similar parallel coordinate graph (modified from Dhadialla and Raikhel 1994).\n", - "6890 \n", - " Comparison of microarray and qRT-PCR gene expression profiles for selected genes. X-Y plots were generated from the ratio of transcript levels in the blood-fed adult female mosquitoes to the transcript levels in the sugar-fed adult female mosquitoes for eight selected genes at five time points including 0, 5, 12, 24 and 48 hours post blood meal (PBM). Genes were randomly selected from the three sets and included ASs 648 and 1786 from the Early Genes (A), ASs 996, 1158, 1949, and 679 from the Middle Genes (B), and ASs 12 and 1357 from the Late Genes (C). Triangles indicate fold expression data generated by qRT-PCR analysis; circles indicate fold expression data generated by microarray analysis. A horizontal line connecting either the diamonds or circles illustrates each gene expression profile. For each gene, the expression profiles created by qRT-PCR and microarray analysis are indicated using the same color.\n", - "6898 \n", - " Del100 and del231 result from minor alternative splicing pathways and not from the presence of the W262X mutation. Total RNA extracted from different normal cell lines or cells of HTI patients was subjected to RT-PCR. Controls for FAH, del100 and del231 are displayed on the left to show that the PCR reactions are in the linear range. (A) FAH amplification from exons 6 to 14 in the lymphoblastoid cell lines. The two additional products (del100 and del231) seen in the homozygous cell line (W262X/W262X) are depicted below the gels. Exons are represented by boxes and introns by lines. Del100 has skipped exon 8 and as a consequence, the reading frame is shifted (W262X becomes G229E). A first PTC is located at the 3'end of exon 10 (270X). Del231 has skipped both exons 8 and 9, but without any change in the reading frame. (B) Primers designed to specifically amplify del100 and del231 span exon 7 to 9 or exon 7 to 10 junctions respectively (depicted in blue). Full-length, del100 or del231 cDNAs were cloned in pRC/CMV and were amplified to verify primer specificity to each alternative transcript. Both transcripts are present in normal cells (wild-type lymphoblasts or fibroblasts and HeLa cells) and human liver. Del100 is amplified in HTI cells with a splice mutation in exon 12 (IVS12/ IVS12) or two nonsense mutations in exon 13 (E357X/E364X). FAH was also amplified as a control in the different human cell lines.\n", - "6899 \n", - " Del100 transcript encodes for a protein expressed in various tissues. (A) Schematic representation of the putative DEL100 and DEL231 proteins. FAH and DEL231 proteins are identical, except for the region encoded by exons 8 and 9, which is missing in DEL231. DEL100, due to the skipping of exon 8 and the resulting change in the coding frame, differs from FAH at its C-terminal end. The black bar below the DEL100 protein represents the region used to raise the antiserum. (B) 30 μg proteins of a 10% (w/v) tissue homogenate were separated on a 15% SDS-polyacrylamide gel. Proteins were transferred to a nitrocellulose membrane and blotted using a rabbit anti-FAH (top panel; dilution 1:25,000) or a mouse anti-DEL100 antiserum (middle panel; dilution 1:1,000). A band with an apparent molecular weight of 31-kDa is detected by the anti-DEL100 antiserum in all tissues tested. The star indicates non-specific signal. The membrane was blotted against β-actin to control for protein loading. (C) The 31-kDa band (indicated by a red arrow) was detected in spleen using a monoclonal antibody directed against the N-terminal part of the FAH (green arrow).\n", - "6900 \n", - " Specificity of the anti-DEL100 antiserum. (A) The mouse antiserum was affinity purified on the recombinant C-terminal of DEL100 and used to probe the same membrane as in Figure 2B. The adsorbed fraction (top panel), specific of the C-terminal of DEL100, still recognizes the 31-kDa protein. The non-adsorbed fraction (bottom panel) shows no cross-reactivity to the protein. The star indicates a non-specific signal. (B) The DEL100-Myc protein was synthesized in a rabbit reticulocyte lysate and labeled with 35S (translation panel). The tagged protein is indicated by an arrow. The band below is the protein synthesized without the Myc tag. The anti-Myc was immobilized on protein A-sepharose and incubated with in vitro translated DEL100-Myc. Effectiveness of the immunoprecipitation was verified by blotting using the anti-Myc (1/2,000) antibody. The anti-DEL100 antiserum (1/1,000) recognizes the in vitro translated protein in the input (10% of the reaction) and the immunoprecipitate (IP, indicated by an arrow).\n", - "6901 \n", - " Del100 is subjected to NMD. Control cells (wt/wt) and the homozygous cell line from the Finnish patient (W262X/W262X) were treated with 100 μg/ml cycloheximide (CHX) for 3 hours. Total RNA was extracted and subjected to RT-PCR. RAR serves as a control for RNA quantity in each sample. Control amplifications (showing an increasing number of cycles) for del100, del231 and RAR are displayed on the left to show that, with the conditions used, each PCR reaction is in the exponential phase. (A) [α33P]-dATP was incorporated during the PCR reaction and the products loaded on a 6% acrylamide gel. The gel was used to directly expose an X-ray film and the signal was quantified using the NIH Image 1.2 software. FAH was amplified from exons 6 to 14 (the del100 transcript which is detected using these primers is indicated by a star). Del100 and del231 were amplified using the specific primers RT84 and RT85. (B) Quantification of the amount of del100 mRNA in 3 different experiments, normalized to RAR levels. The error bars represent standard deviations. Del100 is stabilized between 4- to 7-fold in homozygous cells (W262X/W262X) and normal cells (wt/wt) following the cycloheximide treatment (yellow bars: - cycloheximide; purple bars: + cycloheximide). (C) del231 is relatively unaffected by translation inhibition.\n", - "6923 \n", - " Cytotoxic effects of KillerTRAIL and Apo2L/TRAIL in vitro. PC3 cells were incubated with ligand at the indicated concentrations without (A), or with 0.25 μg/ml (B), 0.5 μg/ml (C) or 1 μg/ml (D) doxorubicin for 24 hours. Data shown are the mean ± SEM from a representative experiment. Similar results have been obtained three times.\n", - "6925 \n", - " Effect of doxorubicin on c-FLIP in vivo Mice bearing PC3 xenografts were untreated or treated with 4 mg/kg or 8 mg/kg doxorubicin (i.p.). After 24 hours, protein was isolated from xenografts (A) or mouse heart (B) and probed for c-FLIP expression by western blotting. Actin was included as a loading control.\n", - "6927 \n", - " Effect of combination therapy on the growth of PC3 xenografts Mice bearing PC3 xenografts were untreated or treated with 4 mg/kg doxorubicin (i.p.), followed by either vehicle or 500 μg Apo2L/TRAIL (i.p.). Data shown represent tumor size twenty-six days after treatment was initiated (A). Tumor size in animals treated with combination therapy was monitored an additional week (33 days after treatment initiation) (B). Tumor growth over time (C) demonstrates that tumor growth is significantly different on and after day 21 (* indicates p < 0.05).\n", - "6934 \n", - " Bioluminescence in Embryos That Experienced Different Numbers of LD Cycles during DevelopmentEmbryos hemizygous for per3-luc were collected and monitored for bioluminescence while exposed to different numbers of 14:10 LD cycles starting on day 1 postfertilization followed by DD. (A) One LD, (B) one LD, (C) two LD, (D) three LD, (E) four LD, (F) five LD, (G) six LD, and (H) six LD. In (I), embryos were exposed to two LDs, one on day 1 and the other on day 6 of development. Black and white bars on top of each plot represent the times when the lights were off and on, respectively. Since overall bioluminescence levels can vary among clutches and experiments, normalized bioluminescence was averaged and plotted in each graph. Number of animals that were averaged is given at top right corner of each plot. Error bars represent standard error of the mean (SEM) For the one-LD and six-LD groups, plots for two experiments are shown here. These experiments showed small differences in developmental profiles, possibly due to differences in room temperature (about 1 °C), therefore could not be pooled. For the two- to five-LD groups, data from two experiments were pooled. The small but abrupt increase of luminescence that occurred only during the light period of LD cycles is considered an artifact made visible by low bioluminescence counts during the first several days of development, because the same level of fluctuation was observed in empty wells under LD condition.\n", - "6935 \n", - " Temporal Expression of luc mRNA Is Similar to That of per3 during DevelopmentEmbryos hemizygous for per3-luc were collected from naturally breeding parents and kept in 14:10 LD cycles (lights on at 8 A.M. CST) at 22 °C for 6 d. Larval fish were shifted to DD at the end of the light phase on day 6. Total RNA was extracted from 2- to 3-d-old embryos and 7- to 8-d-old larval fish, and was subjected to real-time PCR for per3 and luc mRNA levels.(A) Expression of per3 mRNA per embryo on day 3 was determined every 6 h starting at 10 A.M. (2 h after lights-on).(B) The per3 mRNA per animal on day 8 was measured every 4 h starting at 10 A.M.\n", - "(C) Levels of luc mRNA on day 3 were determined as in (A). White and black bars at the bottom represent light and dark phases, respectively, for (A) and (C).(D) Cycling of luc mRNA on day 8 was determined as in (B). The gray and black bars represent the time when the light would have been on and off, respectively, had the LD cycles continued.For each of per3 and luc, mRNA levels were normalized to the peak level on day 8 (10 A.M. time point). The y-axis scales were set at 120% maximum for all plots to allow direct comparison of mRNA extracted on days 3 and 8. The x-axis scales are given in both hours and days postfertilization to facilitate the comparison with Figure 2. In order to show more detailed temporal profiles of mRNAs on day 3, plots with smaller y-axis scales were shown in the insets at top right corners of (A) and (C). Each plot is the average of three identical experiments, and error bars represent SEM. An identical experiment was also done at 24 °C with essentially the same results (unpublished data).\n", - "6936 \n", - " Effects of Temperature on Development of per3-luc ExpressionTransgenic embryos were entrained by two, four, or six LD cycles at either 22 °C or 28.5 °C, and monitored for bioluminescence in DD at 21–24 °C. (A) Two LDs at 22 °C, (B) two LDs at 28.5 °C, (C) four LDs at 22 °C, (D) four LDs at 28.5 °C, (E) six LDs at 22 °C, and (F) six LDs at 28.5 °C. The insets in (E) and (F) show the last 3 d of the record with magnified y-axis scales. Black and white bars on top of each plot represent the times when the lights were off and on, respectively. Actual amount of bioluminescence in cps is averaged and plotted in each graph. Number of animals that were averaged is given at top right corner of each plot. Error bars represent SEM. Results of one of two identical experiments with similar results are shown here.\n", - "6937 \n", - " Levels of per3 and luc mRNA Are Elevated by High Temperatures during Development(A) A schematic diagram showing how embryos were entrained and collected for RNA extraction. Embryos were entrained in 14:10 LD cycles (lights on at 8 A.M.; lights off at 10 P.M. CST) at two different temperatures, 22 °C and 28.5 °C. On day 6, half of the animals were sacrificed for RNA at 10 A.M. (2 h after lights-on) and at 10 P.M. (at lights-off). The rest of the animals were transferred to DD at 22 °C at 10 P.M. on that day, and sacrificed for RNA on day 10 at 10 A.M. and 10 P.M. The white and black bars represent day and night, respectively, and the gray bars the time at which lights would have been on had the LD cycles continued. The arrowheads indicate the time at which the animals were sacrificed for RNA extraction.(B) Relative mRNA level per animal for per3 on days 6 and 10 of the experiment quantified by real-time qPCR. The levels were normalized to the value of the 10 A.M. time point on day 6 at 28.5 °C.(C) Relative RNA level per animal for luc measured from the same samples used in (B). For both (B) and (C), averages of three experiments are shown. Error bars represent SEM.\n", - "6938 \n", - " Bioluminescence Rhythms Mediated by per3-luc in DD and LD Measured for Six Days(A) Average plot of bioluminescence rhythms in DD. Animals were entrained in 14:10 LD cycles for 6 d at 22 °C and tested for approximately 6.5 d in DD.(B) Representative plot of bioluminescence rhythm in DD for an individual.(C) Average plot of bioluminescence rhythms in 14:10 LD cycles. Animals were entrained in 6 LD cycles at 22 °C prior to the monitoring.(D) Individual plot of bioluminescence rhythm in LD cycles. For each of DD and LD experiments, two experiments have been performed with essentially the same results. Only one of two experiments is shown for each of DD and LD. The first 12 h of data were deleted from each plot. Black and white bars on top of each plot represent the time when lights were off and on, respectively. Numbers of animals that were averaged is given at top right corner of (A) and (C). Error bars represent SEM in (A) and (C).\n", - "6942 \n", - " Functional Classifications from GO, Focused on Plant-Specific Categories Outlined by Gramene(A) compares predicted genes from Arabidopsis and Beijing indica. (B) compares predicted genes from Beijing indica with nr-KOME cDNAs. We ignore categories with less than 0.1% of the genes.\n", - "6944 \n", - " Duplicated Segments in the Beijing indica AssemblyDepicted here are the plots for Chromosomes 2 (A) and 6 (B). Each data point represents the coordinated genomic positions in a homolog pair, consisting of one nr-KOME cDNA and its one and only TBlastN homolog in rice. Shown on the x-axis is the position of a gene on the indicated chromosome, and shown on the y-axis is the position of its homolog on any of the rice chromosomes, with chromosome number encoded by the colors indicated on the legend at the right.\n", - "6946 \n", - " Distribution of Substitutions per Silent Site (Ks) for Homolog Pairs in Segmental, Tandem, and Background DuplicationsIn (A), contributions from the recent segmental duplication on Chromosomes 11 and 12 are colored in red. The tandem duplication data are shown on two different scales, one to emphasize the magnitude of the zero peak (B) and another to highlight the exponential decay (C). Background duplications are shown in (D).\n", - "6948 \n", - " Ka/Ks Distribution for Homolog PairsKa and Ks are the fraction of the available nonsynonymous and synonymous sites that are changed in the homolog pairs. Ka/Ks > 1 is an indicator of positive selection. Shown is the Ka/Ks distribution for segmental duplications (A) and for tandem duplications (B).\n", - "6949 \n", - " The Life Cycle of E. coli\n", - "During cell division, two new poles are formed, one in each of the progeny cells (new poles, shown in blue). The other ends of those cells were formed during a previous division (old poles, shown in red).(A) The number of divisions since each pole was formed is indicated by the number inside the pole. Using the number of divisions since the older pole of each cell was formed, it is possible to assign an age in divisions to that cell, as indicated. Similarly, cells that consecutively divided as a new pole are assigned a new pole age, based on the current, consecutive divisions as a new pole cell.(B) Time-lapse images of growing cells corresponding to the stages in (A). False color has been added to identify the poles.\n", - "6951 \n", - " The Effects of Consecutive Divisions as an Old or New Pole on Growth Rate(A) The cellular growth rate, represented on the y-axis, is normalized to the growth rate of all cells from the same generation and geography in each film. On the x-axis consecutive divisions are seen as either a new pole (open circles), showing rejuvenation, or an old pole (closed circles), showing aging. Cells represented at each point: new pole divisions 1–7: 7,730; 3,911; 1,956; 984; 465; 211; 89; old pole divisions 1–7: 4,687; 3,833; 1,933; 956; 465; 213; 75.(B) Pair comparison of the growth rates of sibling cells. The division age of the old pole sibling (the mother cell) is shown on the x-axis. The percentage difference between the growth rate of the new pole sibling (the daughter cell) and this cell is shown on the y-axis. A positive difference corresponds to a faster growth rate for the new pole cell. Cell pairs represented at each point, ages 1–7: 9,722; 4,824; 2,409; 1,202; 601; 282; 127.In both graphs, cells are from all 94 films. The error bars represent the standard error of the mean. The old and new pole growth rates in (A) and the pair differences in (B) are fitted to a line to show the trend; however, the actual progressions may not be linear (R\n", - "2 old poles = 0.97, new poles = 0.83, pair difference = 0.94).\n", - "6965 \n", - " Saturated but not unsaturated FFA induce apoptosis in cultured HMC. HMC were plated for 24 h in media containing 17% FBS, then incubated starting at time 0 with the indicated FFA at 0.2 mM complexed to albumin or with albumin alone (Control), all in media containing 5% FBS. After 24 and 48 h, the level of (A) the cleaved fragment of caspase-3 and (B) cytoplasmic nucleosomal fragments were determined by ELISA and expressed relative to the 24 h control value. Data are mean ± SEM for n = 3 independent experiments in triplicate. **, P < 0.01 by ANOVA versus control, oleate, or linoleate alone.\n", - "6966 \n", - " Palmitate-induced formation of pyknotic nuclei and the role of mitochondrial β-oxidation. (A) HMC were treated with palmitate (Palm) or oleate as described in Fig. 1, and the number of pyknotic nuclei were counted after 24 and 48 h in the presence of FFA. (B) HMC incubated with 0.2 mM palmitate in the presence and absence of 0.2 mM etomoxir (Etom) or 0.5 mM AICAR. Cells were also incubated with the same doses of etomoxir or AICAR alone. Data are mean ± SEM for n = 3 independent experiments in duplicate. **, P < 0.01 versus control (Con) or oleate alone (A) by Chi-square test.\n", - "6967 \n", - " Palmitate stimulates cleavage of caspase 9 in HMC. (A) HMC treated with palmitate were analyzed for caspase cleavage by Western blotting of total HMC lysates with antibodies that recognize the cleavage products of human caspase 9 (p35), caspase-8 (p40 and p23), and caspase-2 (p15). For a positive control in each experiment, cells were treated for 8 h with an agent known to be a strong stimulus for the caspase in question: caspase 9, staurosporine 1 μM; caspase 8, etoposide 25 μM; and caspase 2, camptothecin 6 μM. The blots were reprobed with β-actin to ensure equal protein loading. (B) Densitometric analysis (mean ± SEM) of the p35 caspase 9 fragment from 3 independent experiments. **, P < 0.01 by ANOVA versus control.\n", - "6969 \n", - " Palmitate induces translocation of cytochrome-c in cultured HMC. (A) Cells treated with control (Con, i.e., albumin alone), palmitate (Palm, 0.4 mM), oleate (Ole, 0.4 mM), or staurosporine (St, 1 μM) for the times indicated. HMC were then rapidly separated into soluble cytosolic and insoluble membrane fractions. The amount of cytochrome-c (Cyto-C) was determined by Western blotting. Equivalent amounts of total protein were present across all lanes of the cytoplasmic and membrane fractions, but the membrane fractions contained approximately 3 times more protein than the corresponding lane in the cytoplasmic fraction. (B) Densitometric analysis of cytoplasmic p14 kDa cytochrome-c from 3 independent experiments. Data are mean ± SEM. **, P < 0.01 by ANOVA versus control and oleate alone.\n", - "6970 \n", - " Effect of caspase 9 inhibition on apoptosis of HMC induced by palmitate. (A) Cells were treated with control (Con) or palmitate (Palm) in the presence and absence of the cell permeable caspase 9 inhibitor (C9I, Z-LEHD-FMK) or the caspase 8 inhibitor (C8I, Z-IETD-FMK), both at 40 μM. Addition of the caspase inhibitors was concurrent with addition of the FFA. After 24 and 48 h, caspase 9 enzyme activity was measured and expressed as fold-change over control. (B) Palmitate and Z-LEHD-FMK were added to HMC as above, and cleavage of caspase-3 was measured by ELISA as described in Experimental Procedures. (C) The number of pyknotic nuclei was assessed in cells treated with palmitate with and without Z-LEHD-FMK. (D) DNA fragmentation, assessed by ELISA as the number of nucleosomal fragments in the cytosol, was measured in cells treated with palmitate and by Z-LEHD-FMK. For A-D, data are mean ± SEM for 3 independent experiments. **, P < 0.01, *, P < 0.05 versus control by ANOVA in (A, B and D) or Chi-square test in (C).\n", - "6971 \n", - " Palmitate stimulates translocation of the proapoptotic endonuclease G protein by a caspase 9-independent mechanism. (A) HMC were incubated with palmitate (Palm) and palmitate plus the Z-LEHD-FMK caspase 9 inhibitor (C9I, 40 μM) for the times indicated. The cells were fractionated and the level of p33 endonuclease G protein was measured by Western blotting in the cytoplasmic fraction. Equivalent amounts of protein were added to each lane, as confirmed by reprobing with β-actin. (B) Densitometry of cytoplasmic p33 kDa endonuclease G protein from 3 independent experiments. **, P < 0.01, *, P < 0.05 by ANOVA versus 0 time.\n", - "6972 \n", - " Unsaturated FFA block apoptosis induced by saturated FFA. HMC were incubated for 24 or 48 h with 0.2 mM palmitate (Palm) or stearate (Ste) alone or in co-incubations with 0.2 mM of the unsaturated FFA oleate (Ole) or linoleate (Lin). Control cells were incubated with albumin alone. After 24 and 48 h, the level of (A) the cleaved fragment of caspase-3 and (B) cytoplasmic nucleosomal fragments were determined by ELISA and expressed relative to the 24 h control value. Data are mean ± SEM for n = 3 independent experiments in triplicate. **, P < 0.01 by ANOVA versus control.\n", - "6974 \n", - " Oleate prevents mitochondrial release of cytochrome-c and endonuclease G in cell treated with palmitate. (A) HMC were incubated with 0.2 mM palmitate (Palm), 0.2 mM oleate (Ole), or palmitate plus oleate for the times indicated. The cells were fractionated and the levels of cytoplasmic p14 kDa cytochrome-c (Cyto-c) or p33 kDa endonuclease G (Endo-G) protein were measured by Western blotting. Equivalent amounts of protein were added to each lane, as confirmed by reprobing with β-actin. (B) Densitometry of cytoplasmic p14 kDa cytochrome-c and p33 kDa endonuclease G protein from 3 independent experiments. **, P < 0.01, *, P < 0.05 by ANOVA versus 0 time.\n", - "7006 \n", - " Scanning electron micrograph survey of pumice granules and biofilm development. Before colonisation (A) pumice granules are blank. After 6 month of operation (B), rod shaped cells cover the pumice surface. In the 12 month biofilm, an abundant exopolymeric matrix is visible on pumice granules both at the bottom (C) and top (D) of the column.\n", - "7024 \n", - " Schematic representation of human LPP and Scrib proteins. (A) Schematic representation of the human LPP protein. Human LPP contains a proline-rich pre-LIM region followed by three tandem LIM domains. In its pre-LIM region, LPP harbors one nuclear export signal, two VASP binding sites and one α-actinin binding site. Furthermore, LPP has two regions in common with its family member TRIP6 and one region with its family members zyxin, TRIP6 and LIMD1. At its carboxy-terminus, LPP has a binding site for Scrib. (B) Schematic representation of the human Scrib protein human Scrib is a 1630 amino acid protein that contains 16 leucine-rich repeats (LRR) followed by 2 domains that are specific for the LAP family of proteins (LAP-specific domain (LAPSD) a and b), and 4 PDZ domains. The corresponding position of the mouse Scrib prey clone that was isolated in a yeast-two hybrid screen using LPP as bait is indicated. The amino acid sequence of the PDZ domains of mouse Scrib was compared to that of human Scrib, and percentage identity is indicated for each PDZ domain.\n", - "7026 \n", - " Characterization of anti-Scrib antibodies. (A) Total cell extracts were prepared from the following cell lines: human embryonic kidney epithelial cells (293) (lane 1), dog normal kidney epithelial cells (MDCK) (lane 2), human T lymphocytes (Jurkat) (lane 3), and African green monkey kidney fibroblast cells (CV-1) (lane 4). Approximately 30 μg of protein from each extract was analysed by SDS-PAGE and Western blotting with the Scrib-472 antibodies. The position of molecular markers are as shown. (B) Total cell extracts of 293T cells, either not transfected (lane 2), or transiently transfected with Xpress-hScrib that is composed of the full length human Scrib protein fused to an Xpress-epitope-tag at its amino-terminus (lanes 1 and 3) were analyzed by SDS-PAGE and Western blotting with an anti-Xpress antibody (lane 1) or with the Scrib-472 antibody (lanes 2 and 3). The position of molecular markers are as shown. (C) MDCKII cells, grown on glass coverslips, were fixed and stained with Scrib-472-antibodies. Immunofluorescence was visualized by epifluorescence microscopy.\n", - "7029 \n", - " Direct interaction between the carboxy-terminus of LPP and the PDZ domains of Scrib. (A) GST fused to either wild-type LPP (40 amino acids of the pre-LIM region, the three LIM domains and the tail), or a similar LPP molecule with a mutated carboxy-terminus (L612A) and GST alone were expressed in E. coli, purified and analyzed by SDS-PAGE and Coomassie Blue staining. All proteins were expressed well. Protein markers are as indicated. (B) In vitro synthesized [35S]-methionine-labelled full length Scrib was incubated with immobilized GST or with either one of the above-described GST fusion proteins and allowed to interact over night at 4°C. After extensive washing, bound proteins were eluted in sample buffer, separated by SDS-PAGE and visualized by autoradiography. The amount of synthesized protein loaded as a reference on the gel corresponds to 10% of the input used in each binding experiment. (C) All four PDZ domains of Scrib (amino acids 616 – 1490), either wild-type or mutated as indicated, were synthesized in vitro and [35S]-methionine-labelled. these labelled proteins were incubated with immobilized GST or with GST-LPP-LTWT and allowed to interact over night at 4°C. Bound proteins were eluted in sample buffer, separated by SDS-PAGE and visualized by autoradiography. The amount of synthesized protein loaded as a reference on the gel corresponds to 10% of the input used in each binding experiment.\n", - "7031 \n", - " Schematic overview of the tetracycline-regulated gene expression system used in this study. The hygromycin resistance gene, hph, is under the control of seven copies of the TetR binding sequence, tetO, linked to a minimal promoter (Pmin). In the tTA-dependent expression system (A), the tTA protein (green circles) promotes hygromycin resistance of A. fumigatus by binding to the tetO promoter and activating transcription of the hph gene. Incorporation of doxycycline into the medium prevents tTA from binding to tetO, resulting in hygromycin sensitivity due to the absence of hph expression. The reverse tTA system (B) takes advantage of a reverse tetracycline transactivator, rtTA (blue circles), that binds to the tetO promoter only in the presence of doxycycline. In this case, rtTA promotes hygromycin resistance of A. fumigatus only when grown in the presence of doxycycline.\n", - "7034 \n", - " Effects of doxycycline on the hygromycin sensitivity of two A. fumigatus strains that express tTA (p444) in conjunction with the tetO7-hph reporter gene (p482). (A): Ten thousand conidia from the tTA-1 or tTA-2 transformants were spotted onto the center of a plate containing 1 mg/ml hygromycin and the indicated concentrations of doxycycline (μg/ml) and colony diameter was measured with time. (B): Doxycycline regulation of hph RNA levels in the tTA-1 and tTA-2 strains by Northern blot analysis. Total RNA isolated from overnight cultures grown in the presence of 0–200 μg/ml doxycycline was fractionated by agarose gel electrophoresis, transferred to nylon membranes, and probed with a 32P-labeled hph probe. (C): Hybridization intensity in each lane of the Northern blot in (B) was normalized to levels of the SYBR-green II-stained rRNA by phosphorimager analysis and is shown as a percentage of the levels seen in the tTA-1 transformant in the absence of doxycycline.\n", - "7039 \n", - " Immunohistochemistry markers to distinguish between vascular smooth muscle and endothelial cells. A cryosection of mouse heart ventricle was simultaneously stained with FITC-conjugated smooth muscle α-actin antibody (A) and an antibody against the apical endothelial membrane protein, ICAM-2 (B). The secondary antibodies to detect ICAM-2 was Cy-5 conjugated donkey anti-rat (pseudo-colored red for clarity). Panel C is an overlay of the preceding two panels. The image width is 238 μm.\n", - "7042 \n", - " Effect of different fixation protocols on immunocytochemistry of ventricular myocytes. Enzymatically isolated ventricular myocytes were subjected to fixation protocols with (A) methanol, (B) paraformaldehyde or (C) sequential double fixation with paraformaldehyde followed by methanol. The primary antibody in all cases was against Kir6.2 subunits (76A) and the secondary antibody was Cy-3 conjugated donkey anti-rabbit IgG. The image widths are respectively 137, 107 and 139 μm.\n", - "7053 \n", - " Multipoint linkage analysis under all models for chromosomes 17 (A) and 19 (B). Multipoint parametric HLOD plots for both dominant (blue) and recessive (red) models, and nonparametric allele-sharing LOD* values (black) are displayed across the respective chromosomes. OSA analysis using ascending \"developmental milestones\" factor scores to order families is shown for chromosome 19, for which a 92-family optimal subset was identified and used to calculate allele-sharing LOD* scores (dashed black line).\n", - "7054 \n", - " OSA using family-specific LOD scores as the ranking covariate. Families were ordered based on descending LOD scores at peak linkage for 19p13 and allele-sharing LOD scores calculated in the optimal subset for (A) chromosome 17 or (B) chromosome 6. Families were also ranked based on descending LOD scores at peak linkage on chromosome 7q (C), and LOD scores calculated for chromosome 5. Solid lines reflect multipoint LOD scores corresponding to the entire dataset for the chromosome being analyzed, while dashed lines represent analysis of the optimal subset (above the dataset division in all cases) identified from OSA; these were 52 families for chromosome 17, 30 for chromosome 6 and 41 families for chromosome 7.\n", - "7055 \n", - " The effects of intestinal digestion pH and acidic storage on quercetin and quercetin-3-glucoside recovered from digested onions (A) and the effects of storage pH on digested pure quercetin and quercetin-3-glucoside (B). Samples were digested for 30 minutes with pepsin, 60 minutes with pancreatin and bile, and then stored at -80°C. Each point represents the mean ± standard deviation of triplicate observations within the same experiment. Different letters indicate significantly different observations within each compound (p < 0.05).\n", - "7057 \n", - " Caco-2 uptake of quercetin-4-glucoside (A) and quercetin (B) from digested and non-digested shallot homogenates. Shallot homogenates were digested for 30 minutes with pepsin at pH 2.0 and for 60 minutes with pancreatin/bile at pH 6.5. Digestates were directly placed on cells or diluted 1:2 or 1:4 in HBSS and then placed on cells. Cells were incubated with digestates for 30 minutes at 37°C. The imbedded graph in (B) shows quercetin recovery from shallots following the digestion procedure only. Each bar represents the mean ± standard deviation of triplicate observations within the same experiment. Different letters indicate significantly different observations within each compound (p < 0.05).\n", - "7058 \n", - " The effects of lactase and a combined lactase and digestion treatment on quercetin and quercetin-3-glucoside recovery from shallot (A) and apple (B) homogenates. Each point represents the mean ± standard deviation of triplicate observations within the same experiment. Different letters indicate significantly different observations within each compound (p < 0.05).\n", - "7059 \n", - " Dose response (A) and kinetics (B) of lactase on quercetin and quercetin glucoside recovery from shallots. Homogenized shallots were incubated 60 for minutes with 10, 50, 100, 300, 500, 1000, or 3000 units of lactase/mL sample. Homogenized shallots were incubated with 100 units lactase/mL sample for 15, 30, 60, 90, 120, 240, and 720 minutes. Each point represents the mean ± standard deviation of triplicate observations within the same experiment.\n", - "7090 \n", - " Temporal development of focal cerebral infarction induced by permanent middle cerebral artery occlusion (pMCAO). (A): Evolution of cortical and subcortical infarct volumes after pMCAO in rats. Representative TTC-stained sections at different times after stroke are shown in the insets. (B) and (C): Time course of the increase of neurological deficits and motor impairment induced by pMCAO. Infarct volumes are expressed as a percentage of the contralateral (control) hemisphere. Bars represent the group mean ± SD. * p < 0.05 with respect to subcortical infarct volume at 4 h. &p < 0.05 with respect to subcortical infarct volume at 8 h. # p < 0.05 with respect to cortical infarct volume at 8 h. ** p < 0.05 with respect to cortical infarct volume at 12 h. § p < 0.05 with respect to 4 and 8 h. The horizontal bar in Panel B shows the median neurological score.\n", - "7091 \n", - " Reduction of subcortical (A), cortical (B) and total (C) infarct volumes by the cyclooxygenase-2 inhibitor nimesulide (12 mg/kg; i.p.) when its first administration was delayed for several hours after the onset of permanent stroke. Nimesulide reduced the infarct size in animals treated at 0.5 (n = 8), 1 (n = 9) and 2 h (n = 9), but not at 3 (n = 11) and 4 h (n = 9) after pMCAO, compared to vehicle-treated and time-comparable control groups (n = 7–9 per group). Infarct volumes are expressed as a percentage of the contralateral (control) hemisphere and the data are represented as the mean ± SD. * p < 0.05 and ** p < 0.01 with respect to vehicle (Student's t-test).\n", - "7106 \n", - " Statistical evaluations. (A) \"yellow experiment\": identical cDNA samples of P. pastoris were differently labelled and hybridised to S. cerevisiae microarrays. Normalised data of channel 532 nm (Cy3) are plotted against channel 635 nm (Cy5). The solid line represents the linear correlation. Dotted lines indicate the limits of 1.5 fold differences between two signals on one spot. More than 99% of all values vary less than 1.5 fold from each other. (B) Standard deviations of all value pairs as shown in panel A, plotted against the respective mean normalised intensities. (C) Correlation of spot intensities comparing S. cerevisiae and P. pastoris, grown in identical conditions. (D) Correlation of gene regulation. The correlation between the downregulated genes of S. cerevisiae and P. pastoris upon a shift from pH 5.0 to pH 3.5 is shown.\n", - "7107 \n", - " Fed batch fermentations of P. pastoris. The two panels represent the two different fermentations performed: (a) The pH was kept at 5.0 throughout the fermentation. (b) The pH was let drop to 3.0 and was kept constant subsequently. (A) indicates the batch phase, the cells were growing on glycerol. The time scale starts at 25 h. (B) indicates the glycerol fed batch phase and (C) indicates the methanol fed batch phase. Methanol induces heterologous protein production and serves as a carbon source at the same time. The diamonds (◇) show the total yeast dry mass and refer to the left scale. The squares (□) show the pH of the culture broth and refer to the right scale. The arrows indicate the time points, when the samples for microarray analysis were taken.\n", - "7141 \n", - " Effects of the Different Manipulations on the Mean and Dispersion of RT(A) Changes in the mean RT of the numeric task when it comes first in the different experimental manipulations. Changing the notation or the response complexity makes mean RT slower, and within each condition, responses are slower for close than for far distances. The difference between far and close conditions is independent of the experimental manipulation, indicating an additive effect that is tested in the ANOVAs (see Table 2).(B) A different pattern is observed for the interquartile range, which provides a measure of dispersion. While distance manipulation results in a major change of the interquartile range, there is not a major effect of notation or response complexity.\n", - "7142 \n", - " Description of the Task and Sketch of the PRP Model and Its Predictions(A) Scheme of the main PRP effect. The vertical axis labels RT. The column on the left indicates the first task, and each coloured box within the column represents a different stage of processing: P component (dark green), C component (red), and M component (blue). The series of columns on the right indicate the processing time for task 2 at different delays (Δ), labelled on the x-axis. For each column, the three different boxes represent the three different stages of task 2: P component (green), C component (orange), and M component (cyan). As Δ progresses, the P component starts later. All components can be performed in parallel except for the C component, which establishes a bottleneck. This results in the following predictions: (1) response to the first task is independent of Δ, and (2) the RT2 (from onset of the trial) represented by the black line, is unchanged for small Δ while at sufficiently large Δ (noninterference regime) it increases linearly, with a slope of one, with Δ.(B) The predicted RT1 and RT2 (from trial onset) as a function of Δ is represented by the grey and black lines, respectively.(C) The model also establishes definite predictions for experiments in which one of the tasks is changed. The six different panels indicate all possible manipulations: first task changed (left column) or second task changed (right column) and whether the change affects the P component (first row), C component (middle row), or M component (bottom row). The changed component is labelled with a highlighted box and with an arrow. For simplicity, we assumed that the task manipulation always increases the duration of one component. RTs before the manipulation (which are the same across all panels) are represented with a solid line, grey for RT1 and black for RT2, and the RTs of the manipulated task are labelled with a dotted line with the same colour code. If the first task is changed (left column), different effects are observed depending on whether the change is in the M component or in the P–C components (which cannot be distinguished with this manipulation). If the M component is affected (bottom row), RT1 changes, but the response to the second task is unchanged. If the locus of the change is in either the P or the C component (middle and top rows), there is a larger delay until execution of task 2 and the following effect is observed: for small Δ (interference regime), RTs are increased and the regime of interference is increased, which is indicated by a shift of the kink to the right. If the second task is changed (right column), different effects are observed depending on whether the change is in the P component or in either the C or M component. If the change is in the P component (top row), for small Δ there is no net change in the response to the second task (because there was a wait at the end of the P component so extending it does not change total time execution), but there is less wait and thus the kink is shifted to the left. If the change is made in either the C or M component (middle and bottom rows) the result is a rigid shift, which is independent of Δ. By performing experiments in which the two tasks are presented in different orders, all task components can be differentiated. All task manipulations, according to the PRP model, should fall into one of the three categories, perceptual, central, or motor, each defined by its characteristic RT signature.\n", - "7144 \n", - " Dissociating Parallel and Serial Components by RT Distributions(A) RT histograms (when the number task was presented first) fitted by a simple random-walk model, separately for far distances (left column) and close distances (right column) and for the three different tasks: Digits 1 Tap (top row), Words 1 Tap (middle row), and Digits 2 Taps (bottom row).(B) Cumulative plots of the same data. The effect of both notation and response appears to be a shift of the distribution to the right while the distance effect is a change in the slope. Within each panel, we have overlapped the corresponding fit (blue line) and the fit to the easiest condition—Digits 1 Tap, Far Digits (red line)—to make the change between the different distributions apparent.(C) The two fitted values (fixed delay and integration time) as a function of numerical distance for the three different tasks. The integration time decreases with distance, but it is independent of the tasks. In contrast, the fixed delay does not change with distance but changes with the task. The summed delay plus integration time fit the mean reaction times for each distance (solid circles).(D) Statistics performed on the fit reveal that the fixed delay has a slope not significantly different from zero (i.e., it does not depend on distance), but it changes with task. In contrast, the integration time is significantly different from zero, but it does not change with task.\n", - "7147 \n", - " In Vitro Tat Deacetylation by Human SIRT Proteins(A) Scheme of Tat deacetylation assay with immunoprecipitated SIRT1–7 proteins. Expression vectors for FLAG-tagged SIRT proteins were transfected into HEK 293 cells, immunoprecipitated, and incubated with synthetic Tat (72 amino acids) carrying an N-terminal biotin label and an acetyl group at position 50 (AcTat) in the presence of NAD+. Immunoprecipitated material was also analyzed in a radioactive (3H) histone deacetylase assay using an H3 peptide as a substrate.(B) WB analysis of deacetylation reactions with antibodies specific for acetylated lysine 50 in Tat (α-AcTat), with SA-HRP, or with α-FLAG antibodies.(C) WB of Tat deacetylation by immunoprecipitated SIRT1 in the presence or absence of NAD+, TSA, or nicotinamide (Nic).\n", - "7148 \n", - " Physical Interaction between Tat and SIRT1(A) Immunoprecipitation (IP) and WB of FLAG-tagged Tat (Tat-FLAG) and HA-tagged SIRT1 (SIRT1-HA) after transfection of corresponding expression vectors (+) or empty vector controls (−) into HEK 293 cells.(B) The same experiments as in (A) performed with T7-tagged Tat and FLAG-tagged SIRT1, SIRT2, and SIRT6.(C) Coimmunoprecipitation of FLAG-tagged Tat with endogenous SIRT1 in HEK 293 cells transfected with the Tat expression vector or the empty vector control. IPs were performed with or without rabbit α-SIRT1 antibodies.(D) WB of recombinant SIRT1 protein after pulldown with synthetic biotinylated Tat or AcTat. Tat proteins were detected with antibodies specific for acetylated lysine 50 in the Tat ARM (α-AcTat) or SA-HRP.(E) Immunoprecipitation/WB of FLAG-tagged Tat or TatK50R and HA-tagged SIRT1. WT, wild type.\n", - "7149 \n", - " SIRT1 Is a Positive Cofactor for Tat Transactivation(A) Cotransfection of SIRT1 or the catalytically inactive SIRT1 mutant SIRT1H363Y with the HIV LTR luciferase construct and increasing amounts of a Tat expression vector (RSV-Tat: 0, 2, 20, and 200 ng), an HIV LTR luciferase construct containing mutated binding sites for the transcription factor NF-κB and RSV-Tat (20 ng), or with an RSV-luciferase construct (200 ng) in HeLa cells. The average of three experiments is shown (± standard error of the mean [SEM]).(B) WB analysis of HeLa cells 72 h after transfection of siRNAs directed against SIRT1 or GL3 control siRNAs.(C) Cotransfection of the HIV LTR luciferase construct with increasing amounts of CMV-Tat or CMV-TatK50R (0, 50, 100, 200, 400, and 800 ng) 48 h after transfection of double-stranded siRNAs directed against SIRT1 or GL3 control siRNAs in HeLa cells. Luciferase activity was measured 24 h after plasmid transfection and 72 h after siRNA transfection. Note that all luciferase reporter vectors used in this study are based on the pGL2 luciferase vector, which is not affected by GL3-specific siRNAs [36]. The average of three experiments is shown (± SEM).(D) The transcriptional activity of increasing amounts of the CMV-luciferase reporter (0, 50, 100, 200, 400, and 800 ng) was similar in SIRT1 knockdown or GL3-treated control cells. The average of two experiments performed in duplicate is shown (± SEM).(E) WB of endogenous SIRT1 or actin 72 h after transfection of siRNA directed against SIRT1 or mutated SIRT1 siRNA.(F) Cotransfection of the HIV LTR luciferase with increasing amounts of CMV-Tat (0, 2, 20, and 200 ng) in HeLa cells pretransfected with wild-type or mutant SIRT1 siRNA oligonucleotides as described in (C). WT, wild-type.\n", - "7150 \n", - " Impaired Tat Transcriptional Activity in Murine SIRT1−/− Cells(A) Nuclear microinjection of HIV LTR luciferase, RSV-Tat, and a human cyclinT1-expressing construct into MEFs derived from SIRT+/+ or SIRT−/− mice. In all experiments, a fixed amount of DNA was injected by adding the empty vector control. Cells were coinjected with CMV-GFP, and the luciferase activity per GFP-positive cell was calculated. An average of two injections is shown.(B) The HIV LTR luciferase construct together with RSV-Tat and the cyclinT1-expressing construct were coinjected into SIRT−/− MEFs in the presence of increasing amounts of a plasmid expressing human SIRT1. The average of three experiments is shown (± SEM).(C) Coinjection of the human SIRT1 expression vector together with the 5xUAS luciferase construct containing five Gal4 binding sites upstream of the thymidine kinase promoter and a Gal4-VP16 expression plasmid into SIRT1−/− MEFs. The average of three experiments is shown (± SEM).\n", - "7151 \n", - " Transcriptional Activity of AcTat Depends on Deacetylation by SIRT1(A) AcTat functions through TAR and cyclinT1 binding. Nuclear microinjection of increasing amounts of synthetic Tat or AcTat together with wild-type (wt TAR), TAR Δbulge, or TAR Δloop mutant HIV LTR luciferase constructs into HeLa cells. Cells were coinjected with CMV-GFP, and luciferase activity was calculated per GFP-positive cell. An average of three experiments is shown (± SEM).(B) AcTat transactivation requires CDK9. HeLa cells microinjected with Tat or AcTat (each 30 ng/μl) and the HIV LTR luciferase reporter were treated with increasing amounts of DRB, a known CDK9 inhibitor, for 4 h.(C) AcTat transcriptional activity is inhibited by nicotinamide, but not TSA. HeLa cells injected with HIV LTR luciferase and increasing amounts of AcTat were treated with TSA (400 nM) or nicotinamide (5 mM) for 4 h. The average of two experiments is shown.(D) SIRT1 is necessary for AcTat, but not Tat function. HeLa cells were transfected with siRNAs specific for SIRT1 or GL3 control siRNAs 48 h before microinjection of HIV LTR luciferase and Tat or AcTat (each 30 ng/μl). The average of three experiments is shown (± SEM).\n", - "7152 \n", - " Inhibition of HIV Gene Expression by a Small Molecule Inhibitor of SIRT1(A) In vitro histone deacetylation assays including recombinant SIRT1, radioactively labeled histone H3 peptide, and indicated concentrations of splitomicin or HR73. The average (± SEM) of two experiments performed in duplicate is shown for each point.(B) Chemical structures of splitomicin and its derivative HR73.(C) Inhibition of Tat transactivation by HR73. RSV-Tat (0, 20, and 200 ng) and HIV LTR luciferase (200 ng) or RSV-luciferase (200 ng) vectors were transfected into HeLa cells. Transfected cells were treated with indicated concentrations of HR73 or DMSO for 8 h.(D) Inhibition of HIV gene expression by HR73. GFP expression in Jurkat T cells infected with HIVNL4–3 containing the GFP open reading frame in place of the viral nef gene or with an HIV-based lentiviral vector expressing GFP from the heterologous EF-1α promoter. Treatment with HR73 (1 μM in DMSO) or DMSO was performed for 36 h after overnight infection. The average (± SEM) of four experiments is shown.\n", - "7153 \n", - " Diverse Activators Function by Increasing TC Assembly(A) Gal4-VP16. Left: a CAT reporter construct containing the E1b core promoter and four Gal4-binding sites (G4E1bCAT) was transiently trans-fected into 293T cells, together with a plasmid expressing Gal4-VP16. Middle: transcription levels were determined by quantitating CAT reporter activity. Right: TC assembly was analyzed by a ChIP assay using the indicated antibodies. The percentage of DNA immunoprecipitated relative to input is indicated. The location of the primers used in the ChIP assay to analyze the promoter (black) or ORF (gray) is schematically shown on the left.(B) SV40 enhancer. Shown on the left is a schematic diagram of a construct containing a minimal rabbit β-globin promoter and harboring or lacking the SV40 enhancer. Also shown is transcription analysis by CAT assay (middle) and TC assembly (right) in transiently transfected HeLa cells.(C) Ad E1a. Left: a CAT reporter construct containing the Ad E4 promoter and upstream ATF-binding sites (E4CAT) was transiently transfected into HeLa cells, together with a plasmid expressing Ad E1a. Middle: transcription analysis by CAT assay is shown. Right: TC assembly is shown.\n", - "7154 \n", - " The HIV-1 Tat Protein Stimulates TC Assembly through Recruitment of TBP in the Absence of TAFs(A) A CAT reporter construct containing the TAR element and Sp1-binding sites ([−83]HIV LTRCAT) was transiently transfected into 293T cells, together with a plasmid expressing Tat. Left: transcription analysis by CAT assay is shown. Middle and right: TC assembly is shown. Bottom: a schematic diagram of the CAT reporter construct is shown.(B) TC assembly was monitored in a chronically HIV-1-infected cell line, 8E5/LAV, that harbors an integrated provirus that is constitutively transcribed. Virus production was confirmed by analysis of p24 levels and reverse transcriptase activity in the culture medium (data not shown).(C) TC assembly was monitored in the chronically infected cell line U1 on the integrated HIV-1 LTR in the presence or absence of PMA.\n", - "7155 \n", - " TAFs Are Not Recruited to the HIV 1-LTR and Not Required by Tat for Transcription Activation(A) TC assembly was analyzed by a ChIP assay using antibodies directed against nine additional human TAFs, four subunits of the S\n", - "TAGA complex, and Mot1. TAFs that are also present in S\n", - "TAGA are indicated by asterisks. Bottom: schematic diagrams of the promoter constructs are shown.\n", - "(B) Transcription analysis in ts13 cells, which harbor a temperature-sensitive mutation in TAF1. Ts13 cells grown at the permissive or non-permissive temperature were transiently transfected with a luciferase reporter plasmid and a plasmid expressing a transcriptional activator. Transcription was monitored by luciferase activity, and normalized relative to activity at the permissive temperature.(C) Left: immunoblot analysis is shown. 293A cells were transfected with a TAF5 or TAF12 shRNA expression vector or an empty vector (control) and analyzed by immunoblotting using the indicated antibodies. Right: transcription levels were monitored by luciferase reporter activity in shRNA-treated cells, and normalized relative to luciferase activity in non-shRNA-treated cells.\n", - "7161 \n", - " Coupled Waves of ATP Hydrolysis in RecA Filaments(A) The interval between hydrolyzing monomers (i) is set at four monomers. The dark monomers are those at the hydrolytic step of their ATP hydrolytic cycle. Each monomer within the filament (e.g., the one marked with an “X”) is hydrolyzing an ATP every 3 s, so that a new wave must reach it within that time span. If i = 4 monomers, the waves must move every 0.75 s. The last wave, at the disassembling end, results in dissociation.(B) The same considerations in (A) for i = 4 monomers are illustrated for i = 6 monomers.\n", - "7162 \n", - " Model for RecA Filament Disassembly from Linear ssDNA(A) In the model, end-dependent disassembly occurs, with SSB filling in the vacated DNA. At low frequency, additional RecA monomers nucleate filament formation on the vacated DNA, and the new filament (dark ovals) extends until it catches up with the original filament (open ovals). This creates a new disassembling end.(B) Kinetics of disassembly as monitored by DNA-dependent ATP hydrolysis. This curve is an approximation of curves reported in previous work [27]. The rate of ATP hydrolysis declines as RecA protein dissociates from the ssDNA, until a lower steady-state rate is reached. The steady state reflects a balance between disassembly and new filament formation.(C) If, upon rebinding, the new filament does match the old one in phase, the junction between the old and new filaments could be a site of RecA monomer exchange with the solution. There will be no net disassembly at this point and no resulting change in the rate of ATP hydrolysis, because any monomers that dissociate will be immediately replaced by extension of the trailing filament.\n", - "7163 \n", - " RecA Filament Formation on dsDNA(A) RecA filaments can nucleate on dsDNA so as to have two different orientations. The initiating strand guides the orientation of each filament, with its polarity labeled in each panel. If two nucleations occur on the same filament, there can be two independent disassembly points.(B) The effect of the 30-nt 5′ extensions on RecA protein filament formation. Reactions contained 4 μM RecA protein, 4 μM DNA, and no SSB and were carried out at pH 6.6. The tailed DNA substrate has 2,900 bp of duplex DNA with the 30-nt 5′ extension on one end. The completely duplex DNA is 3,162 nt in length. The enhanced nucleation afforded by these tails is evident in the rapid ATP hydrolysis seen when the tailed DNA is used as cofactor.\n", - "7164 \n", - " The Effect of SSB Protein in Suppressing Rebinding of RecA to the Single-Strand Tails(A) Normal RecA filament disassembly protocol. The RecA filaments were formed on the tailed DNA at pH 6.62. The pH was then shifted to 8.0 to allow disassembly to commence. Disassembly curves are shown in the presence and absence of SSB. Reactions contained (after the pH shift) 2 μM RecA protein, 2 μM DNA, and (where indicated) 0.05 μM SSB.(B) Direct binding of RecA protein to the tailed DNA at pH 8.0. Reactions contained 6 μM RecA protein, 6 μM DNA, and (where indicated) 0.15 μM SSB. When included, SSB was added prior to the RecA protein.\n", - "7165 \n", - " Quantitative Measurement of RecA Filament Disassembly from dsDNA(A) The experimental protocol, as described in the text.(B) A typical disassembly curve. The black line is the measured ADP production curve. The orange line is the fitting of the data by equation 1.(C) The curve is identical to that shown in panel B for the 3-kbp DNA substrate, with the best fit line shown in orange. However, two additional curves (in solid black) are shown to illustrate the variation in fitting if the value of k\n", - "off is constrained to values 10% above or 10% below the best-fit determination.\n", - "7198 \n", - " Microfil distribution patterns in the head of a human (A-F). All images are presented in sagittal plane with gradual magnification of the olfactory area adjacent to the cribriform plate. Reference scales are provided either as a ruler in the image (mm) or as a longitudinal bar (1 mm). As in the other species, Microfil introduced into the subarachnoid space was observed around the olfactory bulb (A), in the perineurial spaces of the olfactory nerves (B, C) and in the lymphatics of the nasal septum (D), ethmoid labyrinth (E) and superior turbinate (F). Due to tissue deterioration, some of the lymphatic vessels had ruptured and Microfil was noted in the interstitium of the submucosa of the nasal septum (D). In (E), Microfil is observed in the subarachnoid space and the perineurial space of olfactory nerves. The perineurial Microfil is continuous with that in lymphatic vessels (arrows). Intact lymphatic vessels containing Microfil are outlined with arrows (D, E, F). b – brain; fs – frontal sinus; cp – cribriform plate; et – ethmoid turbinates; ob – olfactory bulbs; on – olfactory nerves; ns – nasal septum; sas – subarachnoid space.\n", - "7217 \n", - " CSLM images of S. epidermidis (SE6) intact biofilms (A), disrupted biofilm (B) and planktonic cells (C) on plastic coverslips after incubation for 24 h with 500 μg/ml of vancomycin. The bacterial cells were stained with LIVE/DEAD BacLight bacterial viability stain to directly visualize the effects of the antibiotic. The green fluorescence reflects processing of the dye by metabolically active cells while the red fluorescence is characteristic of dead cells. Note that while the green fluorescence was considerably more prominent in the intact biofilm image, the disrupted biofilm does display more green fluorescence than the planktonic cells. Also, note that the disrupted biofilm consists of large clumps and aggregates compared to the typical clusters of planktonic cells.\n", - "7254 \n", - " Ultrastructure of Cpn infected HASMC. Cells were either infected with 128 IFU/cell Cpn-K6 for 72 h (B,C) or incubated with staurosporin 1 μM for 16 h (D) or were left untreated (A). A: Untreated HASMC with normal ultrastructure, note the elongated nucleus with finely dispersed euchromatin. B: HASMC with a typical Cpn inclusion. The membrane bound vesicle contains dark (= elementary bodies) and pale (= reticular bodies) stained bacteria. The chromatin structure in the nucleus is unchanged. C: Cpn infected HASMC undergoing cell death. The nucleus is characterized by highly condensed heterochromatin (arrow head) and a compact nucleolus and is surrounded by dilate organelles (arrow). The cell membrane is completely disrupted. D: Staurosporin treated HASMC. The nucleus is partially fragmented containing patchy condensed heterochromatin (arrow heads).\n", - "7282 \n", - " Gene array screen using skewed IEC-18 cell composition to find potential phenotypic markers. Affymetrix rat gene chips were used to compare RNA from SFM and R3-IGF-I treated cells to find individual genes with significant fold changes – defined as greater than two fold more (A) or two fold less (B) with a p-value of less than 0.1 for the purpose of this screen. These were then compared with the fold changes from IGF-II analog and NBI 31772 to look for fold change trends that paralleled the changing cell composition (summarized in C as the percentage of crypt cells). The results are presented as upward arrows (strong positive correlations), upward dashed arrows (weak positive correlations), downward arrows (strong inverse correlations) and downward dashed arrows (weak inverse correlations). The large asterisk points to an example where both direct receptor agonists resulted in a significant difference but NBI 31772 did not, suggesting a direct drug effect rather than an effect of cell composition – making this gene a less likely candidate. For smaller asterisks, *** = p < 0.01, ** = p < 0.05, and * = p < 0.1.\n", - "7296 \n", - " \n", - "nhr-49(nr2041) Animals Have Reduced Life Span and Higher Fat Content(A) Adult life span of WT (black squares, solid line), nhr-49(nr2041) (black circles, dotted line), and nhr-49 RNAi animals (black diamonds, dashed line).(B) Nomarksi images of nhr-49(nr2041) at days 3, 5, and 7 of adulthood. The arrow in the day 3 image points to a gonadal vacuole that is typical of day 3 worms; the arrow in the day 5 image shows the continued deterioration of oocytes in the gonad, and the arrow in the day 7 image points to the clearing that results from complete gonadal necrosis and collapse.(C) Nile Red intestinal fat staining of WT and nhr-49(nr2041). Each image displays two representative worms from a population of L4 animals.\n", - "7298 \n", - " Regulation of β-Oxidation Gene Expression by nhr-49\n", - "(A) QRT-PCR measurement of acs-2, F09F9.3, and ech-1 expression in WT (gray bars) and nhr-49(nr2041) animals (blue bars). Expression was measured in all four stages of larval development. Error bars represent standard error of measurement.(B) RNAi of nhr-49, acs-2, or ech-1 resulted in increased Nile Red fat staining. Each image shows 3 or 4 representative worms from a population of L4 animals grown on plates containing RNAi bacteria and Nile Red fat-staining dye.(C) acs-2::gfp is expressed in many tissues including hypodermis (hyp), intestine (int), body wall muscle (bwm), neurons (neu), and pharynx (pha). ACS-2::GFP localizes to subcellular structures in a pattern similar to what has been reported for mitochondrial proteins [13].(D) Expression of acs-2::gfp was lower in nhr-49(nr2041) mutant animals.(E) Expression of Pnhr-49::gfp promoter fusion in WT animals revealed that nhr-49 is expressed in multiple tissues, including hypodermis (hyp), body wall muscle (bwm), pharynx (pha), and intestine (int). The animals shown here are genetically mosaic, harboring the Pnhr-49::gfp construct in only a fraction of total cells.(F) Ectopic expression of acs-2::gfp in nhr-49(nr2041) was sufficient to reduce Nile Red staining to WT levels.\n", - "7299 \n", - " Deletion of nhr-49 Hinders Fatty Acid Desaturation(A) QRT-PCR measurement of fat-5, fat-6, and fat-7 expression in WT (gray bars) and in nhr-49(nr2041) mutant worms (blue bars). Expression was measured in all four stages of larval development. Error bars represent standard error of measurement.(B) Relative abundance of individual fatty acid species expressed as percentage of total measured fatty acid. Fatty acids included in total fatty acid measurement but not shown in the figure include C14:0, C15:0, and C17:Δ. Fatty acids were isolated and quantified by GC/MS from WT (dark gray bars), nhr-49(nr2041) (blue bars), fat-7 RNAi animals (red bars), and nhr-49 RNAi animals (light gray bars). Error bars represent standard error. The fatty acid desaturation/elongation pathway, along with enzymes involved in desaturation and elongation, is shown in the inset; this pathway was adapted from previous studies [14,17].\n", - "7300 \n", - " \n", - "fat-7 Is Necessary for Normal Life Span and Inhibits β-Oxidation(A) Nomarski images of WT worms subjected to fat-7 RNAi at days 1 and 3 of adulthood. The arrow in the day 1 image points to vacuole formation in the intestine, and the arrow in the day 3 image points to clearing that results from collapse of the gonad. These characteristics are nearly identical to those observed for nhr-49(nr2041) worms (see Figure 1B).(B) QRT-PCR measurement of acs-2 and ech-1 expression in WT and nhr-49(nr2041) L4 animals grown on control RNAi bacteria (dark gray bars) or on fat-7 RNAi bacteria (blue bars). Error bars represent standard error of measurement.(C) RNAi knockdown of fat-7 expression in WT animals reduced Nile Red fat staining(D) RNAi of fat-7 in nhr-49(nr2041) also decreased fat staining.\n", - "7324 \n", - " SDS-PAGE and immunoblot analysis of the MBP-19 kDa fusion protein. (A) An SDS-PAGE gel showing the noninduced and IPTG-induced E. coli protein lysates. Lanes: 1- protein size markers; 2- noninduced E. coli MBP-19 kDa; 3- IPTG induced E. coli MBP-19 kDa; 4- Affinity purified MBP-19 kDa. (B) Immunoblot probed with a monoclonal antibody to MBP. Lane 1- purified MBP; Lane 2- noninduced E. coli MBP-19 kDa; Lane 3- IPTG induced E. coli MBP-19 kDa.\n", - "7325 \n", - " The recombinant 19-kDa protein is recognized by serum from infected cattle. Affinity purified MBP (lane 1) and MBP-19 kDa (lane 2) were transferred onto membranes in equal amounts and probed with sera from three clinically infected cattle: (A) animal 107; (B) animal 116; (C) animal 167. Reactivity was observed for the 19-kDa protein but not the MBP protein. Size standards are indicated in kilodaltons in the left margin.\n", - "7327 \n", - " Apoptosis detected by TUNEL at the implantation sites of the rhesus monkey on D17 (A), D19 (B), D28 (C, G) and D34 (D, E, F, H) of gestation. Apoptotic nuclei were stained dark. Arrowhead and arrow in panel A – D indicated the nuclei of syncytiotrophoblast and villous stromal cells respectively. The insets in C and D showed the positive nuclei under a higher magnification. Note the syncytiotrophoblast layer covering the basal feet of the anchoring villi in E and the cell columns in F. G and H represent the stromal cells and glandular epithelial cells respectively in the endometrium. I was the negative control. St, syncytiotrophoblast; CT, cytotrophoblast; Vi, placental villi. Scale bars represent 50 μm.\n", - "7330 \n", - " Immunohistochemical staining for P53 at implantation sites of the rhesus monkey on D17 (A), D19 (B), D28 (C, H), and D34 (D, E, F, G) of gestation. P53 was stained dark in nuclei. A-D were villous placenta under a lower magnification. The inset of panel A shows the staining in the syncytiotrophoblast covering the basal feet of the anchoring villi under a higher magnification. E, staining in villous placenta under a higher magnification. F, staining in cell columns. G, syncytiotrophoblast covering the basal feet of the anchoring villi under a higher magnification. H, the endometrium with arrows indicating stromal cells. ST, syncytiotrophoblast. CT, cytotrophoblast. Scale bars represent 50 μm.\n", - "7334 \n", - " Determination of cell viability in hepatocytes treated with bradykinin. The cell viability was spectrophotometrically determined at 570 nm by MTT assay in hepatocytes incubated in basal conditions (white column), in presence of 0.01 mM bradykinin (hatched column), in presence of 0.1 mM bradykinin (crosshatched column) and in presence of 0.1 mM bradykinin with 1.68 mM L-NAME (black column) for 2 h period. (A) Cell viability determined immediately after. (B) Cell viability determined after an additional 24 h incubation period in incomplete medium Results are expressed as a percentage of control. Values are the means ± S.E.M. (bars) of four independent experiments. p < 0,05 compared with control. p < 0,05 compared with control and 0.1 mM bradykinin treated cells\n", - "7336 \n", - " Ventral prostate (A) and seminal vesicles (B) weights in adult rats treated for 7 days with different ecotypes of Maca (2 g/kg BW). Data are Mean ± SEM *P < 0.05 with respect to control value. Number of animals was 35 for controls, 12 for Yellow Maca, 12 for Red Maca and 12 for Black Maca. None: control group receiving vehicle.\n", - "7337 \n", - " Effects of different Maca ecotypes administered for 7 days on serum testosterone (A) or estradiol (B) levels in rats. Data are mean ± SEM. Maca (2 gr/Kg BW) was administered for 7 days. Number of rats was 10 in the control group, 6 in the Red Maca treated group, 6 in the Yellow Maca, and 6 in the Black Maca treated group. P:NS between groups treated with Maca and control rats. aP < 0.05 with respect to the Yellow Maca treated group.\n", - "7338 \n", - " Ventral prostate (A) and seminal vesicles (B) weights in adult rats treated for 14 days with Red Maca. Data are mean ± SEM.TE: rats treated on day 1 and 7 with testosterone enanthate (25 mg each) i.m, Red Maca (2 g/Kg BW) was given orally during 14 days. Rats were sacrificed on day 15. * P < 0.05 with respect to vehicle group; aP < 0.05 with respect to TE group. bP < 0.05 with respect to the group treated with TE+Red Maca. Number of rats was 13 for the control group, 6 for the Red Maca, 6 for TE, and 6 for the TE plus Red Maca groups.\n", - "7339 \n", - " Ventral prostate (A) and seminal vesicles (B) weights in adult rats treated for 42 days with Red Maca. Data are mean ± SEM.TE: rats treated on day 1 and 7 with testosterone enanthate (25 mg each) i.m. Red Maca (2 g/Kg BW) was given orally during 42 days. Rats were sacrificed on day 43. *P < 0.05 with respect to vehicle group; aP < 0.05 with respect to TE group. bP < 0.05 with respect to the group treated with TE+Red Maca. Number of animals was 12 in the control group, 7 in the Red Maca group, 5 in the TE group and 5 in the TE plus Red Maca group.\n", - "7342 \n", - " Ventral prostatic epithelial height (A) and luminal area (B) in control rats, rats treated with Red Maca (RM) alone, testosterone enanthate (TE) alone or TE+Red Maca. Rats were treated for 42 days. *P < 0.05 with respect to control, aP < 0.05 respect to TE group; bP < 0.05 respect to TE+ Red Maca. Differences in duct luminal areas were assessed with Mann-Whitney U test.\n", - "7343 \n", - " Infrared (IR) spectra of lyophilized aqueous extract of three ecotypes of Lepidium meyenii (Maca). Data are expressed in absorbance units (A). Wave number is expressed in cm-1. IR spectra were measured from 4000 cm-1 to 650 cm-1 with a FT-IR spectrophotometer equipped with an ATR apparatus. Highest absorbance values correspond to Red Maca, intermediate values to Yellow Maca and lowest values to Black Maca. Peaks of absorbance are recorded at 3291 cm-1, 2927 cm-1, 1614 cm-1, 1406 cm-1, 1022 cm-1, 924 cm-1 and 862 cm-1.\n", - "7345 \n", - " Hypothalamic GnRH concentrations in implanted frogs. Hypothalamic GnRH concentrations in frogs implanted for (A) 10 days or (B) 30 days with either Ch, DHT, or E2. No significant differences were observed among treatment groups in either 10- or 30-day-implanted animals. Each bar represents mean ± SEM. N = 6–11.+\n", - "7346 \n", - " Plasma LH levels in implanted frogs. Plasma LH levels in frogs implanted for (A) 10 days or (B) 30 days with either Ch, DHT, or E2. Each bar represents mean ± SEM. Dissimilar letters indicate significant difference between groups. ND = not detectable. N = 7–10.\n", - "7347 \n", - " Pituitary LH concentrations in implanted frogs. Pituitary LH concentrations in frogs implanted for (A) 10 days or (B) 30 days with either Ch, DHT, or E2. Each bar represents mean ± SEM. Dissimilar letters indicate significant difference between groups. N = 7–10.\n", - "7348 \n", - " Testicular function in frogs implanted for 10 days. Measurements of testicular function in frogs implanted for 10 days with either Ch, DHT, or E2. (A) Average GSI, (B) average diameter of seminiferous tubules, (C) number of I SPG, and number of cysts containing (D) II SPG, (E) I SPC, and (F) II SPC were measured from 5–8 animals per treatment group. Each bar represents mean ± SEM. ND = not detectable. No significant differences were observed among treatment groups in any of the parameters measured.\n", - "7355 \n", - " Hyperoxia activates caspase 3 in TIIcells. Rats were kept normoxic (control) or subjected to hyperoxia. Lung sections (A) and freshly isolated TIIcells (B) were immunohistochemically threefold stained as described in Materials and Methods. Cell nuclei stained light blue (DAPI). TIIcells are distinguishable by the close proximity of their nuclei to green stained lamellar bodies (A; arrows). Active caspase 3 appears red labelled and is predominantly found in the cytosol of TIIcells upon hyperoxic treatment of rats (A and B). Bar 10 μm;\n", - "7360 \n", - " Hyperoxia increases the expression of TNFRI but not of Fas in TIIcells. For the expression analysis of TNFRI and Fas the membrane fraction of freshly isolated TIIcells was prepared. TNFRI (A) and Fas (B) were visualised by Western blot technique, and their expression was densitometrically determined. Values of n = 6 independent experiments are given as means ± SD in arbitrary units (control = 1). Asterisk indicates a significant difference to control (p < 0.05).\n", - "7361 \n", - " Pipette assembly for microperfusing segments of undissected bronchiole. The bronchiole is held in outer large pipette (A) by suction. An inner, septated cannulating pipette provides current passing capacity through one barrel (B1) and perfusing fluid to the duct lumen through the opposite barrel (B2), which also contains a small cannula pipette (C) that allows changes of perfusing solutions.\n", - "7377 \n", - " Morphology and characteristics of ES-derived chondrocytes after 32 days of culture. (A, B) Determination of proteoglycans in EBs with alcian blue in chondrocyte cultures induced with TGFβ1 [2 ng/ml] and BMP-2 [10 ng/ml] from d3–5 of culture and with BMP-2 [10 ng/ml], ascorbic acid [50 μg/ml] and insulin [1 μg/ml] from day 5 onwards (A) compared to control cultures (B). Bar = 8.3 μm. (C, D) Analysis of cartilage-specific matrix proteins in 32 day old EBs induced with the same supplements as in (A, B) by means of immunohistochemistry. Staining with anti-collagen type II (C) and anti-cartilage proteoglycan (D), respectively, both visualized by a secondary AlexaFluor 488 conjugated antibody. Bar = 106 μm. (E) Concentration-dependent effect of BMP-2 on chondrocyte-specific gene expression in 32-day old EBs. Values of cultures supplemented with 10 ng/ml BMP-2 are shown compared to 2 ng/ml as used by Kramer et al. [2000], which was set as 1. Values represent means of three independent experiments ± standard deviation, obtained by quantitative RT-PCR analysis. **P < 0.01; ***P < 0.001. (F) Proteoglycan content of EB extracts on day 32. BMP-2 directs increased proteoglycan synthesis in both 2 ng/ml and 10 ng/ml. *P < 0.1; **P < 0.01. Mean ± standard deviation, n = 3.\n", - "7378 \n", - " Changes on cartilage markers in response to various combinations of BMP-2, TGFβ1, insulin and ascorbic acid as outlined in table 1. (A) Diagram of expression niveaus of cartilage-specific genes of 32 day old EBs obtained by quantitative RT-PCR and standardized to GAPDH. Untreated control values were set as 1. Mean ± standard deviation, n = 3. *P < 0.1; **P < 0.01; ***P = 0.001. (B) Proteoglycan content of extracts of 32 day old EBs treated with different combinations of BMP-2, TGFβ1, insulin and ascorbic acid (see table 1). Ctrl = control. Means ± standard deviation, n = 3. *P < 0.1; **P < 0.01; ***P = 0.001. n.d. = not determined.\n", - "7379 \n", - " Quantification of chondrogenic yield by flow cytometry. (A, B) Genetically modified ES cells expressing GFP from the chondrocyte-specific aggrecan promotor. Green fluorescing chondrocytes appear as clusters of cells within the remaining cell population (A), but are also scattered in the entire population starting at day 28 of differentiation (B). (C) FACS analysis of ES-derived chondrocytes sorted by their GFP expression. Differentiation with BMP-2 only [2 ng/ml, d3–5] produced 7.26% GFP expressing cells compared to spontaneously differentiated controls, which contained very low levels of fluorescing cells (1.54%). Prolonged BMP-2 administration together with TGFβ1, ascorbic acid and insulin (supplement combination G, see table 1) raised chondrocyte outcome to 57.03%.\n", - "7380 \n", - " Expression of cartilage-specific genes in the course of EB differentiation induced by BMP-2, TGFβ1, insulin and ascorbic acid (supplement combination G, table 1). (A) Aggrecan, collagen type II A and B and link protein, biglycan and decorin. (B) Scleraxis and Sox9. Results show induction factors of expression obtained by quantitative RT-PCR and normalized to GAPDH expression in comparison to corresponding spontaneously differentiated controls, which were set as 1 (mean ± standard deviation, n = 3 independent experiments, 20 EBs each).\n", - "7381 \n", - " Degree of osteogenesis in cultures treated with chondroinducing medium (BMP, supplement combination G), osteoinducing medium (VD3 as described in ref. 18) and control ES medium (ctrl). Osteoblast phenotype and mineralization could be increased in chondrocyte cultures by adding VD3 to chondroinducing supplements at day 20 (BMP+VD3). (A) Extent of mineralization as measured by Ca2+ content. **P < 0.01; ***P = 0.001. (B) RT-PCR for chondrocyte-specific and osteoblast-specific marker genes as well as Collagen X as a marker for the hypertrophic state of chondrocytes. (C) Morphology as seen in phase contrast. Black appearing cells were identified as being mineralized osteocalcin expressing osteoblasts previously [18]. No such cells can be seen in control (ctrl) and chondrocyte (BMP) but in osteoblast (VD3) and rescued osteoblast cultures (BMP+VD3).\n", - "7383 \n", - " Characterization of ES-derived adipocytes. (A) Oil-Red-O staining of lipid droplets in ES-derived adipocytes. Bar = 42 μm. (B, C) Influence of BMP-2 alone and in combination with TGFβ1, insulin and ascorbic acid (see table 1) on expression of adipocyte-specific genes. Quantitative RT-PCR was performed on 30 day old EBs. Expression of genes of interest was normalized to GAPDH and compared to untreated controls. Values show means ± standard deviations on n = 3 independent experiments. *P < 0.1; **P < 0.01; ***P = 0.001.\n", - "7390 \n", - " Schematic diagram of the aggregation screening assay (A) and typical results (B) A: Scheme of an in vitro mutant huntingtin aggregation assay modified for drug screening. In the primary screening, the mixture of fusion protein, GST-Q58-Htn (20 μg/ml) and Thrombin (0.5 unit/μg protein) was immediately distributed into the 96-well plates containing diluted compounds at 40 μl/well. The final concentration of the small compounds is 100 μM. 10 μl of 10% SDS/50 mM 2-mercaptoethanol was added into each well to stop the reaction after 24 hours incubation at room temperature. The aggregates were separated by filtering through a cellulose acetate membrane (0.2 μm). Immunoblotting was done with a specific anti-huntingtin antibody, HP1, followed by incubation with peroxidase conjugated anti-rabbit antibody. The signals of the retained aggregates were scanned and quantified. In the secondary screening, compounds tested positive in were tested at 10 μM and a 45-minute incubation at room temperature was followed after mixing the protein and enzyme. B: A typical immunoblot of the huntingtin aggregation inhibitor screening. The aggregates retained on the membrane were visualized by ECL. The intensity of dot reflects the amount of aggregates. The blot shows the positions of each drug in a 96-well plate. Congo Red: positive control (row E, column 12 and row F, column 12). DMSO: negative control (row G, column 12 and row H, column 12). Drugs in wells F2, E4, E9 and D3 are huntingtin aggregation inhibitors.\n", - "7400 \n", - " Functional study of HNP 1-3. Normal microscopy (A&B) and flourescence microscopy (C&D) of MDCK cells. MDCK cells were exposed to calcein with (A&C) and without HNP 1-3 (B&D). By fluorescence microscopy (C&D) the cells were observed to uptake calcein only when treated with fractions containing HNP 1-3/calcein (C). Fractions containing unidentified peptides purified from colon tumors were used as negative controls together with calcein and did not stimulate the cells to uptake calcein (D). Cell islands treated with HNP 1-3 appeared diffuse and showed enlarged nuclei, indicating apoptosis (A).\n", - "7401 \n", - " The genomic island (GI) present in the chromosome of the endosymbiont UWE25. (A) Position of the GI on the UWE25 genome, a 100-kb region (grey area) delimited by two direct repeats (Table 1) at both ends and by two gly-tRNAs genes in tandem (all tRNAs genes are represented by '+') at its proximal end. A third copy of the direct repeat (Table 1) is indicated by a white line disrupting the grey area. The region is characterized by a different slope in the cumulative GC skew analysis (black curve) and by a higher G+C content (grey curve, windows of 20 kb, 0.1-kb step). The horizontal line indicates the genomic G+C content average. (B) Closer view of the 100-kb region (black curve, cumulative GC skew; grey curve, G+C content windows of 5 kb, 0.1-kb step; horizontal line, average genomic G+C content). (C) Residual cumulative G+C content (GC') and genomic features of the 100-kb GI. This region encompasses the region with the highest G+C content in the 20-kb windows analysis of the UWE25 genome. The position of genes is represented by an 'X' on the upper line if encoded on the positive strand, otherwise by an 'X' on the bottom line (For details, see Table in Supplementary Material 1). A large majority of genes are co-oriented in the genome region flanked by the direct repeats. The tra operon (thick line), present on this GI, exhibits a G+C content (40.0%) clearly higher than that of the whole genome (34.7%). The positions of transposases (open circles) and of phage-related genes (full circles) are indicated.\n", - "7403 \n", - " Similarity and phylogenetic analyses of tra units showing the close relatedness of the UWE25 tra unit with the operons involved in the F-like conjugative systems: (A) UPGMA tree of gene order analysis and (B) UPGMA tree comparing the Kimura corrected p-distances of the concatenated traA, traK, traB, traV, and traC gene present along the UWE25 tra unit and the F-like, I-like and P-like plasmids [20]. The bar represents estimated evolutionary distance scale. The numbers at each node are the results of a bootstrap analysis; each value is derived from 100 samples.\n", - "7409 \n", - " Effect of PE on the expression of cell cycle regulators, p27kip1, p21ip1/waf1 and pRB. Preconfluent, serum-deprived cells were incubated with PE (5 μM) or vehicle for up to 48 h. Expression of cell cycle regulators was determined by Western blot analysis of whole cell lysates as described in Methods. The panels are representative Western blots showing the effect of PE on the expression of p27kip1 (A), p21cip1/waf1 (B), pRb (C), and lamin A/C (D) protein levels respectively. Percentages representing the quantitation of protein bands by densitometric analysis of blots obtained from three different experiments are indicated on top of each immunoblot.\n", - "7424 \n", - " Deletion analysis of IGFBP-3 promoter for the induction by p53. HepG2 cells were transiently transfected with the panel of IGFBP-3 promoter-luciferase reporter constructs with (B) or without (A) co-transfection by pCMV-p53, and luciferase activity was measured after 48 h. Mean count of luciferase activity +/- SEM is shown.\n", - "7436 \n", - " The human glucose-6-phosphatase gene promoter. (A) Sequence of a portion of the human glucose-6-phosphatase gene promoter including the CRE-like sequences CRE1 and CRE2. (B) The reporter plasmid pG6PCRE1/CRE2luc contains a minimal promoter consisting of the human immunodeficiency virus TATA box, the adenovirus major late promoter initiator element, the luciferase open reading frame, and glucose-6-phosphatase promoter sequences encompassing both CRE-like sequences CRE1 and CRE2. The reporter plasmids pG6PCRE1mut/CRE2luc and pG6PCRE1/CRE2mutluc carry mutations in either the CRE1 or the CRE2, to inactivate these sites. (C) Reporter plasmids pG6PCRE1luc and pG6PCRE2luc contain glucose-6-phosphatase promoter sequences encompassing either the CRE1 or the CRE2. (D) The reporter plasmid pTNFα(CRE/AP1)2luc contains two identical copies of the composite CRE/AP1 sequence derived from the human TNFα gene, upstream of a minimal promoter. The sequence of one of these motifs is depicted.\n", - "7437 \n", - " Schematic representation and expression of the constitutively active CREB2/CREB fusion protein C2/CREB. (A) Schematic representation of the modular structure of CREB, CREB2, and C2/CREB. The basic region leucine zipper domain (bZIP) is indicated. The chimeric bZIP protein C2/CREB consists of the constitutively active transcriptional activation domain of CREB2 and the bZIP domain of CREB, responsible for dimerization and DNA-binding. (B) Western Blot analysis of HepG2 cells transfected with an expression vector encoding C2/CREB. As a control, extracts from mock transfected HepG2 cells were analyzed. Western blots were probed with an antibody against the FLAG-tag.\n", - "7438 \n", - " Biological activity of C2/CREB, a constitutively active CREB2/CREB fusion protein. One of the reporter plasmids pG6PCRE1/CRE2luc, pG6PCRE1mut/CRE2luc pG6PCRE1/CRE2mutluc (A), pG6PCRE1luc, pG6PCRE2luc (B), or pTNFα(CRE/AP1)2luc (C) (1 μg/plate) was transfected into HepG2 cells together with the pRSVβ internal standard plasmid (2 μg/plate), encoding β-galactosidase under the control of the Rous sarcoma virus long terminal repeat, and either the \"empty\" expression vector pCMV5 or an expression vector encoding C2/CREB (20 ng plasmid/plate). The data are presented as the ratio of luciferase activity (light units) to β-galactosidase units (OD units) measured in the cell extracts. The mean +/- SD is depicted.\n", - "7439 \n", - " Schematic representation and biological activity of the nuclear targeted mutant of the catalytic subunit of cAMP-dependent protein kinase. (A) Schematic representation of the modular structure of the catalytic subunit of cAMP-dependent protein kinase (Cα) and the mutant NLSCα. The wild-type enzyme is myristylated as indicated (Myr). The sequence of the nuclear localization signal derived from the SV40 large T antigen and the triple FLAG epitope in NLSCα are shown. (B) Western Blot analysis of HepG2 cells transfected with an expression vector encoding NLSCα. As a control, extracts from mock transfected HepG2 cells were analyzed. Western blots were probed with an antibody against the FLAG-tag. (C) Modular structure of the GAL4-CREB fusion protein. The protein consists of the DNA-binding domain of GAL4 (amino acids 1–147) and the activation domain of CREB (amino acids 1–281). The reporter plasmid pUAS5luc contains a transcription unit encompassing the luciferase open reading frame and a minimal promoter that consists of five copies of the upstream activating sequence (UAS), a TATA box derived from the HIV long terminal repeat and the initiator element from the adenovirus major late promoter. The reporter plasmid pUAS5luc (1 μg/plate) was transfected into HepG2 cells together with the pRSVβ internal standard plasmid (2 μg/plate) and either an expression vector encoding the DNA binding domain of GAL4 (plasmid pM1) or the GAL4-CREB fusion protein (1 μg plasmid/plate). In addition, cells were transfected with an expression vector encoding either the wild-type (Cα) or mutated (NLSCα) form of cAMP-dependent protein kinase (100 ng/plate). Forty-eight hours post-transfection cell extracts were prepared and the β-galactosidase and luciferase activities of these extracts were determined.\n", - "7440 \n", - " Transcriptional activity of CREB and CREB mutants in the presence of a nuclear targeted mutant of the catalytic subunit of cAMP-dependent protein kinase. One of the reporter plasmids pG6PCRE1/CRE2luc, pG6PCRE1mut/CRE2luc pG6PCRE1/CRE2mutluc (A), pG6PCRE1luc, pG6PCRE2luc (B), or pTNFα(CRE/AP1)2luc (C) (1 μg/plate) was transfected into HepG2 cells together with the pRSVβ internal standard plasmid (2 μg/plate) and the \"empty\" expression vector pCMV5 or an expression vector encoding either CREB, CREBS133A, or K-CREB (20 ng plasmid/plate). In addition, an expression vector encoding NLSCα (100 ng/plate) was transfected. Forty-eight hours post-transfection cell extracts were prepared and the β-galactosidase and luciferase activities of these extracts were determined. The data are presented as the ratio of luciferase activity (light units) to β-galactosidase units (OD units) measured in the cell extracts. The mean +/- SD is depicted.\n", - "7441 \n", - " Biological activity of constitutively active ATF2 fusion protein towards glucose-6-phosphatase promoter-containing reporter genes. (A) Schematic representation of the modular structure of C2/ATF2. This chimeric bZIP protein consists of the constitutively active transcriptional activation domain of CREB2 and the bZIP domain of ATF2, responsible for dimerization and DNA-binding. (B, C, D) HepG2 cells were transfected with one of the reporter plasmids pG6PCRE1/CRE2luc, pG6PCRE1mut/CRE2luc pG6PCRE1/CRE2mutluc (B), pG6PCRE1luc, pG6PCRE2luc (C), or pTNFα(CRE/AP1)2luc (D), the pRSVβ internal reference plasmid, and either the \"empty\" expression vector pCMV5 or an expression vector encoding C2/ATF2 (100 ng expression plasmid/plate). Lysates were prepared forty-eight hours post-transfection and β-galactosidase and luciferase activities were measured. The mean +/- SD is depicted.\n", - "7479 \n", - " (A) Representative Northern blots of epimorphin mRNA and β-actin mRNA. Epimorphin mRNA (3.2-kb) was expressed in samples of normal lung (Control: lanes 1–3) and lungs from patients with UIP (lanes 4–6) and patients with NSIP (lanes 7–9) (upper blot). To confirm that the blots reflected samples of equal size, they were reprobed for expression of β-actin mRNA (lower blot). (B) The data are expressed as a ratio of epimorphin to β-actin band density units (arbitrary units) and reported as mean ± SEM measured by means of NIH Image analysis. In NSIP samples, the density of epimorphin expression was significantly higher than that in control and UIP samples (*P < 0.05).\n", - "7480 \n", - " Representative Western blots for epimorphin in normal mouse and human lung samples (A), and representative epimorphin immunohistochemistry (B) in normal mouse lung. (A) Recognition of the 150-kd bands by rat anti-mouse epimorphin monoclonal antibody (MC-1) in extracted lung samples. (B) Weak epimorphin staining in vascular walls (arrowheads) and alveolar walls (inset). Scale bar = 50 μm.\n", - "7481 \n", - " (A) Representative Western blots for epimorphin in normal control subjects and fibrotic groups. Epimorphin protein (150-kd) was expressed in samples of normal lung (Control: lanes 1–3) and lungs from patients with UIP (lanes 4–7) and patients with NSIP (lanes 8–10). (B) The data are expressed as a ratio of a standard normal control subject to each case's band density units (arbitrary units) and reported as mean ± SEM measured by means of NIH Image analysis. In NSIP samples, the density of epimorphin protein expression was significantly higher than that in control and UIP samples (*P < 0.05)\n", - "7482 \n", - " Representative histology stained with hematoxylin-eosin (H&E)(A) and Alcian blue-periodic acid-Schiff (AB-PAS)(B) and immunohistochemistry for epimorphin (C), rat normal serum as negative control for epimorphin (D), keratin (E), and α-smooth muscle actin (F) for all patients with NSIP. (A) Thickened alveolar walls showed edema, fibrosis, and inflammatory cell infiltration. Dense fibrosis was inconspicuous or absent. (A and B) Intra-alveolar organizing fibrotic areas were seen as pale eosinophilic fibrosis with H&E staining and as Alcian blue positive area with AB-PAS staining as early stage of fibrosis (asterisks). (C) Positive epimorphin immunostaining appeared in areas of early fibrosis (inset in C shows a close-up view; asterisks indicates early intra-alveolar fibrotic area) covered with regenerated alveolar epithelial cells (arrowhead in E), in addition to the alveolar walls. A few α-smooth muscle actin-positive cells were noted in the fibrotic areas (arrowhead in F). Scale bars = 60 μm.\n", - "7484 \n", - " Representative double-labeled confocal fluorescent images of staining for epimorphin plus keratin (A), epimorphin (C), vimentin (D), and epimorphin plus vimentin (E) in an early fibrotic lesion from the lung of a patient with NSIP. (A) The presence of epimorphin (green) in areas of early fibrosis and the presence of keratin (red) in epithelial cells overlying the lesions were confirmed. (B) The same image shown in part A but with Nomarski optics used. (C–E) Epimorphin (C, green) localized in vimentin-positive (D, red) stromal cells (yellow-orange) and in surrounding ECM in early fibrotic areas (E). Nuclei were 4,6-diamidino-2-phenylindole dihydrochloride-positive (blue). Asterisks indicate early fibrotic areas. Scale bars = B: 20 μm, E: 5 μm.\n", - "7485 \n", - " Representative images of immunostaining for epimorphin (A) and MMP-2 (B) in NSIP; the double-labeled confocal fluorescent image of in an early fibrotic lesion from the lung of a patient with NSIP was stained for epimorphin plus MMP-2 (C). (A) Epimorphin immunoreactivity was observed in early fibrotic areas, with (B) MMP-2 labeled in regenerated epithelial cells overlying the fibrotic lesion. Asterisks indicate early fibrotic areas. (C) MMP-2 (red) was strongly expressed in re-epithelialized cells overlying early fibrotic lesions with clear epimorphin expression (green). Nuclei were 4,6-diamidino-2-phenylindole dihydrochloride-positive (blue). Asterisks indicate early fibrotic areas. Scale bars = 20 μm.\n", - "7486 \n", - " (A) Representative images of MMP-2 immunostaining in A549 cells cultured with recombinant epimorphin (right panel) or with BL (left panel) after 9 hours of incubation. In the epimorphin-coated slides, plated cells formed some monolayer cell islands in addition to loose sheets of cells, and cells in these cell islands showed strong MMP-2 immunostaining (by the immunoperoxidase method). Scale bars = 30 μm. (B) Via the MMP-2 Biotrack Activity Assay System, MMP-2 activity in the supernatants of A549 cells cultured with recombinant epimorphin was higher than in supernatants of cells cultured with BL or Type IV collagen (P = 0.01).\n", - "7490 \n", - " Indirect immunofluorescence analysis and morphology of transgenic cells. Localisation of LmSIR2 using immunofluorescence analysis (A) L929 cells carrying an empty pcDNA vector (B) L929 (Cl2) expressing LmSIR2 protein. Morphology of cells in culture: (C) L929 cells carrying an empty pcDNA vector and (D) L929 Cl2. Note the reduced cell density and the presence of cells bearing abnormal morphology (arrow).\n", - "7491 \n", - " Growth kinetics analysis. Cell proliferation was determined using two methods: cell counting (A), the results are given as a mean value of a triplicate experiment ; and 3H-thymidine incorporation (B), the results are given as mean value of a sextuplate experiment\n", - "7492 \n", - " Expression of a senescence biomarker. (pH6.0) β-galactosidase activity detected in L929 cells expressing LmSIR2 (Cl2) (B and C) but not in L929 carrying an empty pcDNA plasmid (A). Cells were seeded at 40 cells/mm2 in 25 cm2 flasks and after 13 days of growth, the presence of pH6-galactosidase activity (Arrow) was determined as described in the Materials and Methods section. N nucleus, note the perinuclear galactosidase activity.\n", - "7504 \n", - " Tn9-8-gpt was rescued from concatamers following serial passage in HF cells. (A) Tn9-8-gpt was passaged in HF cells and monomer units were recovered by linearizing concatemeric DNA from serial passage 3 with HindIII and cloning in bacteria (lanes 2 and 4) and also by linearizing passage 2 DNA with PstI and cloning in bacteria (lane 3). Lane 1 represents the unpassaged clone for comparison. Following rescue in bacteria, DNA was prepared and cut with NcoI. Fragments were separated on an agarose gel and visualized with ethidium bromide staining (left panel). The gel was transferred to a nylon membrane and probed with an a sequence specific probe (right panel). (B) Fragments from an NaeI digest were also separated on an agarose gel and visualized as in panel A. The gel was transferred to a nylon membrane and probed with an a sequence specific probe. Lane 5 shows a 100 bp ladder. Lanes 3 and 4 show a ca. 800 bp fragment that hybridizes to a sequences.\n", - "7537 \n", - " Accuracy of the linear model. Dot plot of all PM probe signals as calculated by the linear model, against actual PM probe signals determined from fibroblasts after UV (A). The data presented in Figure 1A were used to calculate correlation coefficients (R2) between the signals calculated by the linear model and the actual PM signals of fibroblasts after UV (B).\n", - "7538 \n", - " Numbers of differentially expressed genes. Numbers of differentially expressed genes (q < 0.005) with a unique LocusLink ID in cultures of fibroblasts (dotted) and CM-enriched cultures after MS (A), in cultures of fibroblasts (dotted) and CM-enriched fractions after IR (B), or in cultures of fibroblasts (dotted) and CM-enriched fractions after UV (C). Overlapping parts of the circles represent genes that show differential expression both in CM-enriched cultures/fractions and cultures of fibroblasts.\n", - "7545 \n", - " (A) Low power micrograph of E. coli strain TPE1978 cells showing the density of the bacterial samples used for indirect IEM and the presentation of flagella (bar length = 1 μm) (B) IEM of strain TPE1978 flagella after incubation with rabbit flagellar H48 antiserum (1:1000) and detection of bound antibody by anti-rabbit-IgG- 10 nm gold (1:20), bar length = 100 nm. (C) Strain JM109 flagella after incubation with rabbit flagellar H48 antiserum and detection of bound antibody by anti-rabbit-IgG- 10 nm gold. (D) Strain TPE1978 flagella after incubation with rabbit flagellar H4 antiserum (1:1000) and detection of bound antibody by anti-rabbit-IgG- 5 nm gold. (E) Strain JM109 flagella after incubation with rabbit flagellar H4 antiserum and detection of bound antibody by anti-rabbit-IgG- 5 nm gold. (F) Double-labeling IEM of strain TPE1978 after sequential incubations with rabbit flagellar H4 antiserum and anti-rabbit-IgG 5 nm gold, followed by rabbit flagellar H48 antiserum detected by anti-rabbit-IgG- 10 nm gold. Both, 5 nm and 10 nm gold markers are bound at comparable amounts over all flagella present on the bacteria. (G) Double-labeling IEM of strain JM109 after sequential incubations with rabbit flagellar H4 antiserum and anti-rabbit-IgG- 5 nm gold followed by rabbit flagellar H48 antiserum and anti-rabbit-IgG- 10 nm gold. Only H48 specific (10 nm) gold particles are bound to the flagella of JM109.\n", - "7548 \n", - " Chromosome abnormalities in patients with autistic traits (A) 4 markers: [multiple copies] derived from chromosome 2 [1], 15 [3] with nomenclature (B) 1 duplication of chromosome 15 with arrow denoting the region involved (C) 3 partial deletions (right homolog)(multiple copies) of 3p25, 12q21.2q23.3 & 13q13.2q14.1 with the ideogram, the arrows denote the deleted region. (D) 3 inversions (the right homolog) (multiple copies), inv(10)(p11.2q21.2), inv(14)(q11.2q32), inv(17)(q24.2q25.3) with arrows on the ideogram showing the inverted region (E) 2 translocations (partials in 2 copies, chromosomes involved (right) and their normal homolog (left)) one apparently balanced t(1;14)(q25;q31.2) and one unbalanced der(14;18)(q10;q10). The ideogram with arrows show the breakpoints\n", - "7557 \n", - " Western blot analysis of recombinant S. gordonii and B. subtilis strains expressing M6 protein and M6/TTFC fusion protein. (A) S. gordonii envelope fractions. Lane 1 through 3, GP1241 expressing M6 under the control of PP promoter. Lane 1, GP1241 harvested after overnight growth. Lane 2, GP1241 harvested after early stationary phase. Lane 3, GP1241 harvested after exponential phase. Lane 4, recipient strain GP201 (negative control). Lane 5, GP231 (positive control). Blot was developed with anti-M6 monoclonal antibody 10B6. (B) S. gordonii and B. subtilis envelope fractions. Lane 1, S. gordonii GP204 (negative control). Lane 2, S. gordonii GP1253 expressing M6/TTFC (positive control). Lane 3, B. subtilis recipient strain GP800.2 (negative control). Lane 4, B. subtilis GP848 expressing M6/TTFC under the control of PP promoter. Blot was developed with anti TTFC rabbit serum. Molecular weight markers are shown in the right side of panels.\n", - "7558 \n", - " Flow-cytometric analysis of E. faecalis expressing M6/OVA. (A) OG1SS, recipient strain not expressing M6/OVA. (B) GP431, recombinant strain expressing M6/OVA on the surface. Bacterial cells were treated with anti-OVA rabbit serum and than with FITC-conjugated goat anti-rabbit IgG. x axis, arbitrary units (a.u.) of fluorescence intensity (log10); y axis, relative cell number.\n", - "7565 \n", - " Kinetics of iron efflux from SH-SY5Y cells. SH-SY5Y cells were cultured for 2 days with varied amounts of iron as described in Figure 1A. The culture medium was changed to fresh DMEM and the kinetic of iron exit from the cells was followed by determining the concentration of iron in the medium by absorption spectrometry (A). Data is means ± SD from 3 experiments. The efflux rate, obtained from the slope of the curves in Figure 7A, was plotted against iron concentration during the 2-day culture period (B). In C, the efflux rate was plotted against the density of the 65.3 KDa or 122.1 KDa bands. To that end, the 65.3 KDa or 122.1 KDa bands shown in Figure 5 were quantified by densitometry and paired with the efflux rates determined in Figure 7A at the same iron concentrations. A good correlation between efflux rate and the presence of the 122.1 KDa band was observed.\n", - "7582 \n", - " 50% inhibitory concentrations of LL37 and Protegrin-1. Two-fold serial dilutions were used to determine the IC50s of LL37 (A) and Protegrin-1 for the VLΔBH vector (B). Modulation of cell metabolism was investigated in parallel by incubating 293A target cells stably transduced with a luciferase gene with the indicated amounts of HDP. The luciferase activity is expressed as percentage of the luciferase activity of cells cultured in the absence of HDP. The mean and the standard deviation of triplicates are given.\n", - "7583 \n", - " Time and concentration dependent inhibition of lentiviral vectors by LL37 and Protegrin-1. The lentiviral vector VLΔBH transferring the luciferase gene was either preincubated with 200 μg/ml of LL37 (A) or 50 μg/ml of Protegrin-1 (B) for 30 minutes (-30) or added simultaneously (0) with LL37 and Protegrin-1 to 293A target cells. Target cells were also preincubated for 120 minutes with the lentiviral vector prior to addition of LL37 and Protegrin-1. Two days after infection luciferase activities were determined as percentage of luciferase activities of cells cultured in the absence of HDPs. Cells stably transduced with the luciferase gene were also cultured in the presence and absence of LL37 and PG-1 to determine the effect of HDPs on the cell metabolism. The mean and the standard deviation of triplicates is given. A lentiviral vector transferring the GFP gene (HIV-CSCG) was incubated for 30 minutes at the indicated concentrations of LL37 (C) or Protegrin-1 (D). The vector was then added directly to 293A target cells (undiluted) or after a 1:10 dilution in medium lacking the HDPs. The number of GFP positive cells at each HDP concentration is given as percentage of GFP-positive cells of cultures transduced with diluted and undiluted vectors in the absence of HDPs. The mean and standard deviation of triplicates are shown.\n", - "7585 \n", - " Inhibitory effects of Protegrin-1 and LL37 on HIV-1 Env mediated vector entry (A, B) and HIV-1 infection (C,D). A lentiviral vector transferring the GFP gene (VGΔBH-SIN) was incubated at increasing concentrations of LL37 (A) or Protegrin-1 (B) prior to transduction of P4CCR5 cells. The vector titer is given as percentage of the titer of the vector incubated in the absence of HDPs. Wild type HIV-1 was incubated with increasing concentrations of LL37 (C) and Protegrin-1 (D). The virus titer was subsequently determined on P4CCR5 indicator cells and is expressed as percentage of the titer of the untreated HIV-1 virus stock. The toxicity of LL37 and Protegrin-1 was determined in parallel using the BrdU incorporation assay.\n", - "7594 \n", - " Production of reactive oxygen species (ROS) by bronchoalveolar lavage (BAL) cells, 1 day (A) and 14 days (B) after intranasal administration of bleomycin (0.1 mg, BLM) or saline (Control) to mice with the p47phox subunit of NADPH-oxidase deleted (p47phox -/- knockout mice (KO): solid bars), compared with \"Wild Type\" p47phox +/+ mice (WT: blank bars). Cells were stimulated in vitro with PMA (0.8 μM) and ROS production was evaluated by chemiluminescence. Data were collected at the time of maximum light emission. Results are expressed as relative light units (mean ± SEM). ***: p < 0.001 comparison with control mice exposed to saline solution alone. ###: p < 0.001 for KO mice compared with WT mice. n = 5–9.\n", - "7596 \n", - " Representative gelatin zymogram of BAL supernatant fluids, 1 and 14 days after intranasal administration of bleomycin (BLM, 0.1 mg/mouse) or saline vehicle (Control) to p47phox +/+ WT mice (A) and p47phox -/- KO mice (B). The following gelatinolytic bands were identified as MMP activity: pro-MMP-9 (105 kDa), MMP-9 (86 kDa), pro-MMP-2 (70 kDa), and MMP-2 (64 kDa). M: molecular weight marker.\n", - "7597 \n", - " Quantification by densitometry of 105-kDa pro-MMP-9 (A), and 64-kDa MMP-2 (B) gelatinase activity on zymograms of BAL fluid, performed 1 day or 14 days after intranasal administration of bleomycin (BLM, 0.1 mg/mouse) or saline vehicle (Control), to p47phox +/+ WT mice (blank bars) and p47phox -/- KO mice (solid bars). Results are represented as the mean of relative intensity ± SEM. * : p < 0.05, ** : p < 0.01, *** : p < 0.001 compared with control mice exposed to saline solution alone. ###: p < 0.001 for p47phox -/- KO mice compared with p47phox +/+ WT mice. n = 8–10.\n", - "7599 \n", - " Transmission electron microscopy of the outer retina at P21 in (A) Crx+/+ and (B) Crx-/- retinas. pe, pigmented epithelium. os, outer segments. is, inner segments. onl, outer nuclear layer with photoreceptor nuclei. Scale bar = 5 μm for A and B.\n", - "7601 \n", - " Transmission electron micrograph of Crx-/- retina at P21 (A and B), and scanning electron micrograph of Crx-/- at P10 (C) of outer segment layer. (A) Evidence of ciliogenesis in the photoreceptor layer of Crx-/- retina. Nonmotile connecting cilia were observed in cross section (arrowheads 1,2, and 3, for examples). Connecting cilium 1 (arrowhead 1) demonstrated seven microtuble doublets, while cilium 2 and cilium 3 exhibited nine. In A, a displaced cell nucleus (n) appearing pyknotic and abnormal deposition of matrix (mx) material of unknown identity were seen, along with large amounts of membranous vesicles (arrow) which filled the photoreceptor space and appeared to be released from inner segments. Scale bar = 3.7 μm. (B) Nonmotile connecting cilium in cross section, from a Crx-/- photoreceptor, demonstrating characteristic 9+0 radial array of microtubule doublets. Scale bar = 88 nm. (C) Scanning electron micrograph (SEM) of membranous vesicles (arrow shows one example) shed from inner segments of Crx-/- photoreceptors at P10. Figure shows inner segments viewed from the scleral side with the pigmented epithelium removed. Scale bar = 1 μm.\n", - "7603 \n", - " Transmission electron micrographs of Crx-/- photoreceptors in the photoreceptor layer at P7. (A) Photoreceptor layer of Crx+/+ retina demonstrating nascent outer segment structures (arrow) emerging from photoreceptor connecting cilia (cc). (B) Crx-/- photoreceptors exhibited connecting cilia (cc) at this early stage, however, nascent outer segment structures were not observed. Scale Bar = 1 μm.\n", - "7604 \n", - " Scanning electron microscopy of peripherin-/- (A) and rhodopsin-/- (B) photoreceptors at P21, viewed from the scleral side with the pigmented epithelium removed. cc, connecting cilium. is, inner segment. Scale bar = 10 μm.\n", - "7605 \n", - " Transmission electron micrographs of the outer plexiform layer in Crx-/- retinas. (A) In Crx+/+ retina at P21, newly formed rod spherules were abundant (arrow demonstrates one example). The spherules were club-shaped and contained a single invaginating synapse with one ribbon complex. Cone terminals form large, flat pedicles that contain many invaginating synapses with separate ribbon structures. These terminals were more scarce, but apparent in Crx+/+ retinas at P21 (one example in box). (B) In the outer plexiform layer (OPL) of Crx-/- retinas, photoreceptor terminals appeared highly disorganized at P21 (arrows). Well-formed pedicles and spherules were not evident. Putative terminals containing ribbon-like structures were apparent, suggesting at least limited generation of synapse components. Many terminals appeared to contain multiple ribbon-like structures, instead of a singule ribbon. For example, terminal 1 and 2 contained two ribbons each, whereas terminal 3 appeared to contain only one. opl, outer plexiform layer. Scale bar = 2 μm.\n", - "7606 \n", - " Transmission electron micrographs of the outer plexiform layer in Crx-/- retinas at P21. (A) Crx+/+ rod spherules contained a single invaginating synapse with one ribbon complex. The spherule was a blunt or club-shaped structure. (B) Crx+/+ rod terminals contained a single ribbon structure (r). Two processes, from horizontal cells (h), contacted the rod laterally. An additional process, the postsynaptic bipolar dendrite (b), was situated more centrally. Terminals were filled with synaptic vesicles. One coated vesicle originatinf from the cell membrane was observed (arrow). (C) In the OPL of Crx-/- retinas, photoreceptor terminals appeared highly disorganized. Putative terminals containing synaptic vesicles and ribbon-like structures were apparent (arrows), suggesting at least limited generation of synapse components. However, well formed spherules and pedicles were not observed. Further, many terminals appeared to contain multiple ribbon-like structures (r). The majority of these ribbons were not associated with the synaptic membrane, but instead were found free floating and, in some instances, were perinuclear (D, arrow). H, horizontal cell; B, bipolar cell; N, nucleus; r, ribbon. (A) Scale bar = 500 nm, (B) Scale bar = 250 nm, (C and D) Scale bar = 500 nm.\n", - "7622 \n", - " Polyclonal IgG to brain proteins and Plasmodium species in previous and present infections. Association of anti-brain IgG derived PCA factor-1 scores and Plasmodium species detected in the previous clinical Malaria episode (A), or presently (B). Medians calculated for all indicated subjects are shown by vertical bars. Subjects in which both species were detected at the same time were not considered. Crosses indicate exposed aparasitemic subjects with previous malaria, circles HBV-, and rhombi HBV+ parasite carriers. Open symbols represent asymptomatic and closed symbols symptomatic subjects.\n", - "7639 \n", - " α7 nAChR subunit is expressed in rat microglial cultures. Semiquantitative RT-PCR analysis of α7 nAChR mRNA expression in rat microglial cells (A) and in PC12 cells and rat hippocampus (C). A 754-bp band corresponding to α7 nAChR was specifically amplified (acc. number S53987; amplified region: 906–1660). Expression of β-actin is shown as internal control. No contamination of genomic DNA was present as shown in panel B (-RT: RNA from microglia that was reverse transcribed without the enzyme and amplified for α7 subunit).\n", - "7644 \n", - " Representative results of the methylation analyses of the NKX3.1 promoter. (A) Methylation-specific PCR. A visible PCR product in Lanes U indicates the presence of unmethylated alleles whereas a PCR product in Lanes M indicates the presence of methylated alleles. The left panel illustrates the methylation status of selected TGCTs and the testicular cancer cell lines. Note the methylation of sample # 2110. The right panel shows the unmethylated status of primary prostate cancers and prostate cancer cell lines. Abbreviations: NB, normal blood (positive control for unmethylated samples); IVD, in vitro methylated DNA (positive control for methylated samples); neg, negative control (containing water as template); U, lane for unmethylated MSP product; M, lane for methylated MSP product. (B) Bisulphite sequencing. The bisulphite sequence allows a positive display of 5-methyl cytosines in the gene promoter as unmethylated cytosines appear as thymines, while 5-methylcytosines appear as cytosines in the final sequence. The left chromatogram represents a part of the unmethylated NKX3.1 promoter in the germ cell tumor cell line TERA2, including 11 CpG sites marked by underlined letters. The right chromatogram represents the unmethylated prostate cancer cell line DU145. Both sequences have been generated by reversing the respective anti-sense sequences by use of the software \"Chromas\".\n", - "7655 \n", - " Degradation of 3H-non-mineralized (A) and 3H-mineralized (B) bone matrix by breast cancer cells. Breast cancer cells (105 cells/well) stimulated with TGFβ (10-10 M) were cultured for 24 h on 3H-labelled extracellular matrices in the presence (+) and absence (-) of 2 μg/ml of human plasminogen. After 24-h incubation, bone matrix degradation was measured as described in Materials and methods. 8–800 mU (Ploug units) of pure human uPA in 1 ml of serum-free medium with or without 2 μg/ml of plasminogen, incubated as a control in parallel wells in the absence of cells, released 3–4% of the total radioactivity. This experiment was repeated twice. The results are expressed as percentage release of 3H labelled bone matrix. Each bar is the mean ± S.E.M. of six wells. The stimulatory effects of TGFβ on breast cancer cell mediated 3H release were statistically significant ***P < 0.001 compared with the unstimulated controls and the HME cells.\n", - "7656 \n", - " RT-PCR of MMPs in breast cancer cells. Breast cancer cells were cultured as described in the Material and methods in the absence (A) and presence (B) of TGFβ (10-10 M). Total RNA was isolated and RT-PCR performed with specific primers for MMPs-1,2,3,7,8,9,10,11,12,13,14,15,16,17. The housekeeping gene GAPDH was used as a positive control. Representative results for MDA-231 cells are shown (A) and (B): Lane 1 MMP-1; lane 2 MMP-13; lane 3 MMP-3; lane 4 MMP-9; lane 5 MMP-14; lane 6 GAPDH. The normal breast cell line HME stimulated with TGFβ is shown in (C). Band intensities were quantified by scanning densitometry and data expressed as a ratio (MMP/G3PDH) of the average optical density (OD) × area. The ratio of the intensity of the MMP mRNA band over the intensity of the G3PDH mRNA was arbitrarily designated as 1.0.\n", - "7657 \n", - " RT-PCR of uPA and uPAR in breast cancer cells. ZR-75-1 breast cancer cells were cultured as described in the material and methods in the absence (A) and presence (B) of TGFβ (10-10 M). Total RNA was isolated and RT-PCR performed with specific primers for uPA, tPA and uPAR. The housekeeping gene GAPDH was used as a positive control. Lane 1 uPA; lane 2 uPAR; lane 3 GAPDH. The normal breast cell line HME stimulated with TGFβ is shown in (C). Band intensities were quantified by scanning densitometry and data expressed as a ratio (uPA or uPAR/G3PDH) of the average optical density (OD) × area. The ratio of the intensity of the uPA or uPAR mRNA band over the intensity of the G3PDH mRNA was arbitrarily designated as 1.0.\n", - "7660 \n", - " Immunological characterization of MMPs and uPA in Breast Cancer Cells. Breast cancer cells (105 cells/well) stimulated with TGFβ (10-10 M) were cultured for 24 h in serum-free medium in the presence of 2 μg/ml of human plasminogen and CT1166 and aprotinin. Western blot analysis was undertaken as described in the Materials and methods section. Lane 1, MDA-231 cells; lane 2, ZR-75-1cells; lane 3 MCF-7 cells; lane 4, HME cells. Pro- and active forms of collagenase-1 gelatinase-B, and stromelysin-1 and proform of collagenase-3 were detected (A). Pro and active forms of uPA are shown (B).\n", - "7665 \n", - " Ependymal damage with rhodamine dyes. (A) Timecourse of ependymal death in the lateral ventricle after rhodamine dye injection demonstrated with digital subtraction. Damage to the ependyma was evident at 12 h and rapidly progressed by 24 h. (B) Histology at 24 h demonstrates swollen ependyma with numerous pyknotic profiles in injected, but not the contralateral, hemisphere. e, ependyma; lv, lateral ventricle; p, parenchyma. RHO fluorescence overlaid on brightfield hematoxylin images. (C) Low-power view of lateral ventricles 3 d after injection demonstrates halo of rhodamine-positive cells around injected ventricle (white arrow). The contralateral ventricle demonstrates labelled ependyma in the absence of damage. (D) By 3 d, near-complete loss of the ependyma was evident. This coincided with the appearance of dye-laden SVMs, black arrowheads. The ependyma remained intact in the contralateral hemisphere (right panels). e, ependyma; lv, lateral ventricle; p, parenchyma; RhoB, rhodamine beads. RHO fluorescence overlaid on brightfield hematoxylin image (RhoB) and photoconverted DiI counterstained with hematoxylin. (E) Periventricular reactive astrocytes (black arrows) visualized with nestin immunohistochemistry (IHC) at 3d post-injection at wall of injected ventricle (left), but not in the contralateral hemisphere (right). lv, lateral ventricle; sp, septum. (F) IHC for ciliated cell-specific foxj1 28d after dye injection demonstrates persistent loss of ependyma in injected hemispere (left). cc, corpus callosum, cp, caudate/putamen; sp, septum. (G) Equivalent volume control injection of GFP-reporter adenovirus demonstrates no ependymal damage 3 weeks after injection. e, ependyma; lv, lateral ventricle; p, parenchyma. GFP fluorescence overlaid on brightfield hematoxylin image.\n", - "7666 \n", - " Selective labelling of SVMs with rhodamine dyes. (A) RHO+ cells are microglia. Transmission electron microscopy demonstrates dye-laden inclusions (white arrows) in a SVM. n, nucleus. (B) Immunohistochemistry for F4/80 (top) and histochemistry for lectin IB4 (bottom) demonstrate double-labelled periventricular cells, white arrows. (C) Time-lapse confocal microscopy in live brain slices demonstrates SVM (white arrow) extending (time 0' and 9') and retracting (time 4.5' and 13.5') a process toward ependymal debris (yellow star) highly suggestive of phagocytosis. See also Video 1. lv, lateral ventricle; p, parenchyma. (D) Neuraminidase injection following sublethal ependymal labelling similarly results in RHO+ SVMs (black arrows). e, ependyma; lv, lateral ventricle; p, parenchyma. Left panels, hematoxylin; Right panels, RHO fluorescence overlaid on hematoxylin.\n", - "7667 \n", - " Infiltration of parenchyma by SVMs after injury. (A) SVMs infiltrated the stratum oriens of the hippocampus in injured mice (right panel) but not in sham animals (left panel). cSO, contralateral stratum oriens of hippocampus; ffx, fimbria/fornix; lv, lateral ventricle; th, thalamus. (B) SVMs migrate significantly farther into parenchyma of injured animals compared to sham injury (*p < 0.01). (C) Infiltration of hippocampus begins days after injury and cells remain for weeks (*p < 0.05 compared to sham). (D) Temporal pattern of infiltration corresponds to neuropil degeneration (black punctate staining, bottom left) activation of resident microglia (shown by increased IB4 staining, bottom middle) and glial activation (indicated by phospho-ERK immunoreactivity, bottom right). GSD, Gallyas silver degeneration stain; pERK, phospho-extracellular signal-related kinase.\n", - "7668 \n", - " Dynamics of infiltrative microgliosis. (A) 2D projections of confocal images demonstrate three migratory cells (large and small white arrows) migrating into the cSO. white arrowhead, non-migratory cell for reference. e, ependyma; cSO, stratum oriens. See also Video 2. (B) Migration was highly directed from ventricle to hippocampus, five representative cells from a single experiment. lv, lateral ventricle; black stars, cell origin (C) Highly polarized, migratory morphologies of RHO+ cells as demonstrated by confocal 3D reconstruction. cb, cell body; lpr, leading process; tpr, trailing process.\n", - "7669 \n", - " HIV-1 tat injection activates SVMs and incites IMG. (A) Ependymal loss (top left) and subventricular microgliosis (bottom left) 24 h following injection of 2.0 nmol tat protein but not in animals injected with deactivated tat (right panels). (B) To determine if tat-activated SVMs migrated in situ we rendered timelapse confocal movies 24 h post-injection. Colored arrowheads demonstrate three SVMs which migrate from the region near the ventricle (green line) deep into the parenchyma (colored dashed lines). Field measures ~200 μm horizontally. See also Video 5.\n", - "7671 \n", - " Effects of MAP kinase manipulation on b2/640 type X collagen promoter activity, in chick cephalic sternum chondrocytes. A and B: Mutant kinases; 24 hrs after seeding, cells were transfected with luciferase vectors and 0.5–1 μg mutant kinase DNA. After 5 hrs medium was changed (A) or medium changed and BMP-2 added (B). C and D: Inhibitor treatments; 5 hours after transfection with luciferase vectors, medium was changed and kinase inhibitor or vehicle (DMSO) was added as indicated. In D 30 ng/ml BMP-2 was added one hr after medium change. Data obtained using at least 2 independent isolates of chondrocytes, assayed in triplicate. Values are mean ± SEM of luciferase ratios of type X collagen promoter activity to control vector, normalized to BMP-2 treated controls. *:p < 0.05 that luciferase ratio differs from non BMP-2 treated group, +: p < 0.05 that luciferase ratio differs from group with no MAP kinase manipulation.\n", - "7674 \n", - " Levels of glutamine and glutamate, and ratio of glutamine to glutamate in CSF of normal controls, and first episode and drug naive schizophrenic patients. (A) CSF levels of glutamine in patients were not different from those of normal controls. (B) CSF levels of glutamate in patients were not different from those of normal controls. (C) Ratios of glutamine to glutamate in patients were significantly higher than those of normal controls.\n", - "7688 \n", - " CD57+ GC-Th cells are more efficient than other tonsil CD4+ T cell subsets in helping B cells. (A) CD4+ T cell subsets were cultured with total tonsil CD19+ B cells for 7 days in the presence of SEB. Naïve B cells (C) or GC-B cells (D) were cultured with equal numbers of CD57+GC-Th cells or other T cell subsets (CD57-, CD57-CD69+ and CD57-CD69- T cells) for 7 days followed by ELISA for IgM, IgG, IgA and IgE. Data from 5 independent experiments were combined and the averages are shown with standard errors. Relative production levels to CD57+ GC-Th cells are shown. *Significant differences from CD57+ GC-Th cells. The absolute Ig production levels (ng/ml) in panel A (GC-Th + Total B cells) were 5737 ± 1764 (IgM), 2111 ± 1185 (IgG), 577 ± 186 (IgA), and 4.8 ± 2.1 (IgE). The absolute Ig production levels (ng/ml) in panel B (GC-Th cells + naïve B cells) were 2045 ± 697 (IgM), 63 ± 21 (IgG), 40 ± 23 (IgA), and 2.9 ± 1.2 (IgE). The average levels (ng/ml) of Ig produced in the cultures of GC-Th cells and GC B cells were 750 ± 279 (IgM), 175 ± 52 (IgG), 51 ± 13 (IgA), and 1.0 ± 0.5 (IgE). (D) Isotype composition of the Ig induced by CD57+ GC-Th cells. Naïve B cells or GC-B cells were cultured with equal numbers of CD57+GC-Th cells or CD57-CD69+ T cells for 7 days followed by ELISA for IgM, IgG, IgA and IgE. Data from 4 independent experiments were combined and the averages are shown with standard errors. *Significant differences between naïve and GC-B cells, but not between the two T cell subsets, were observed.\n", - "7689 \n", - " CD57+ GC-Th cells have the capacities to induce AID expression and to support CSR in B cells. IgD+CD38- naïve B cells were cultured with CD57+ GC-Th cells for indicated time periods followed by RT-PCR analysis for (A) AID expression and (B) CSR. The sizes of specific PCR products are 152 bp (IgM); 416 bp (IgG1, G2, G3), 904 bp (IgG4); 904 bp (IgA1); 891 bp (IgA2); and 179 bp (IgE). Shown are productive recombination products. (C) The expression kinetics of AID and productive IgG3 transcripts over an 8 day period are shown together in a graph. In this panel, normalized expression levels calculated after dividing the levels of AID amplification by β-actin levels are shown. The time gap to reach the peak levels of the expression between AID and productive IgG3 transcripts is shown by an arrow. Representative data from at least three independent experiments are shown (panels A and B). (D) Identification of extrachromosomal reciprocal DNA recombination products. Naïve B cells were cultured with CD57+ GC-Th cells for indicated time periods and were processed to isolate genomic DNA. Fresh GC-B cells were examined for positive controls. The switch circles were detected by a nested PCR method. Representative data out of three independent experiments are shown. (E) Detection of switch circles by a DC-PCR technique. Naive B cells, CD38+ GC-B cells and naïve B cells cultured with GC-Th cells for 5 days were examined for the presence of γ3 and α1/2 switch circles.\n", - "7729 \n", - " How Did Bison Really Evolve?(A) A modern bison (Bison bison), (B) the skull of an extinct bison ancestor, and (C) extraction of aDNA from a bison bone. (Images: [A] Steve Malowski, United States Fish and Wildlife Service, [B and C] Henry Wellcome Ancient Biomolecules Centre, Oxford University)\n", - "7731 \n", - " Domesticating Maize(A) Maize cob from the Ocampo Caves in Mexico dated to 3,890 years before the present. aDNA can reveal the selection of traits during early maize domestication that cannot be observed in the fossil record.(B) Examples of modern maize.(Images: [A] Svante Pääbo, Max Planck Institute, [B] Keith Weller, USDA Agriculture Research Service)\n", - "7733 \n", - " Summary of Phenotypes DeterminedLight (left panels) and scanning electron (right panels) micrographs of mosaic Drosophila eyes. Large homozygous mutant clones are orange (arrowheads); heterozygous tissues are dark red. Examples are shown of lethal mutations that give a (A) wild-type (63.4% of lethal mutations), (B) rough (disordered ommatidia, 18.2%), (C) cell lethal (absence of homozygous mutant tissue, 14.5%), and (D) glossy (loss of lens structure, 3.9%) phenotype. For details on how clones are generated, see http://www.bruinfly.ucla.edu.\n", - "7742 \n", - " A concentration-response inhibition of lipopolysaccharide-stimulated TNFα (A) and IL-1β (B) release by Prolastin in human blood monocytes. Isolated blood monocytes were treated with LPS (10 ng/ml) alone or together with various concentrations of Prolastin (0–16 mg/ml) for 18 h. TNFα and IL-1β levels were measured by ELISA. Data are the means of quadruplicate culture supernatants ± S.E. and are representative of three separate experiments.\n", - "7743 \n", - " Comparisons of the effects of native (nAAT), polymeric (pAAT) and Prolastin on lipopolysaccharide – stimulated TNFα (A) and IL-β (B) production by human blood monocytes isolated from four healthy donors. Isolated blood monocytes were treated with LPS (10 ng/ml) alone or together with 0.5 mg/ml nAAT, pAAT or Prolastin for 18 h. TNFα and IL-1β levels were measured by ELISA. Each bar represent the mean ± S.E. *** p < 0.001.\n", - "7744 \n", - " Effects of AATs on neutrophils activated with zymosan. (A) Concentration-dependent effects of Prolastin on IL-8 release from neutrophils activated with opsonised zymosan. Freshly isolated blood neutrophils were treated with zymosan (0.3 mg/ml) alone or together with various concentrations of Prolastin (0–8 mg/ml) for 18 h. IL-8 levels were measured by ELISA. Data are the means of quadruplicate culture supernatants ± S.E. and are representative of three separate experiments. (B) Effects of opsonised zymosan alone or together with native (nAAT), polymeric (pAAT) AAT or Prolastin on IL-8 release from neutrophils. The release of neutrophil IL-8 was measured in cell free supernatants as described in Materials and methods. Neutrophils were treated for 18 h with a constant amount of zymosan (0.3 mg/ml) alone or together with nAAT, pAAT or Prolastin (0.5 mg/ml) for 18 h. IL-8 levels were measured by ELISA. Each bar represents the means ± S.E. of three separate experiments carried out in duplicate repeats. *** p < 0.001\n", - "7769 \n", - " Empirical data: relationship between ML consensus bootstrap proportion and Bayesian posterior probability. Comparison of PROML bootstrap proportions (horizontal axes) with Bayesian posterior probabilities (vertical axes) for all internal nodes in trees inferred from 21 empirical protein-sequence datasets. Data are for trees inferred by gamma-corrected ML under JTT, versus those inferred by gamma-corrected Bayesian inference under JTT (open diamonds) or under EQ (closed squares), (A) for the 7 datasets for which the two ML and two Bayesian trees (see text) are topologically identical, (B) for the 10 datasets for which at least one ML or Bayesian tree (see text) differs slightly (edit distance ≤ 2) from the other three, (C) for the 4 datasets for which at least one tree differs more substantially (edit distance ≥ 3), (D) for the subset of internal nodes, within the latter 14 non-identical trees, that subtend identical subtrees, and (E) for data in panels (A) and (D) plotted together.\n", - "7770 \n", - " Comparative performance with simulated data: correct model, single long branch, symmetric distance Performance at different branch-length ratios of ML and Bayesian inference with simulated protein-sequence data evolved on a tree having a single long branch, measured as Robinson-Foulds symmetric distance. The JTT model was used for both sequence evolution and tree inference. Number (out of 50) of accurately reconstructed topologies (vertical axes) versus branch-length ratio (horizontal axes), where inference was by (A) gamma-corrected PROML, (B) Bayesian uncorrected for ASRV, with uniform prior, (C) gamma-corrected Bayesian with uniform prior, and (D) gamma-corrected Bayesian with exponential prior. Shading codes for each different distance are shown in the small box at the right of each panel (A-D). Thus the right-hand bar in panel B shows that using Bayesian inference uncorrected for ASRV and assuming a uniform prior, with a dataset generated on a tree in which one branch was lengthened 70-fold, 33 of 50 independent trees recovered the correct topology (Robinson-Foulds symmetric distance zero); 6 differed topologically in ways that involved a single node (distance two); 2 differed in ways that involved two adjacent nodes (distance four); 4 were at distance six; and the remaining 5 were at the maximum symmetric distance, eight. See text for explanation of dual bars in Panel A.\n", - "7780 \n", - " Phylogenetic analysis of human ADAMTS proteins and invertebrate homologs. Unambiguously aligned amino acids were analyzed by distance (Protdist+NJ), maximum parsimony (MP) and maximum likelihood (ML) methods. The trees shown are the ML distance topologies. Numbers at the nodes represent the percent of bootstrap replicates of distance (NJ) and parsimony (MP), and the percent of quartet puzzling steps (QP) in support of each group. (A) Phylogenetic tree of human and distantly related invertebrate ADAMTS homologs inferred from a 359-amino acid alignment, with α = 1.42 and proportion of invariable sites (pI) = 0.09. (B) Phylogeny of human and invertebrate ADAMTS homologs with long branches removed, inferred from 543 aligned amino acids, with α = 1.48 and proportion of invariable sites (pI) = 0.10. For reference, Genbank GI numbers for the sequences are provided [Additional File 2].\n", - "7787 \n", - " Formation of ceramide in ethanol-treated astrocytes: concentration dependence. Astrocytes were labeled with 3H-serine for 72 hours, washed and treated with ethanol (0.1–1 %, v/v). After (A) 1 hour and (B) 18 hours, the cells were extracted with methanol/chloroform (2:1), phospholipids were separated by TLC, and the radioactivity associated with ceramide and sphingomyelin was determined by liquid scintillation counting. Data (N = 5–6) are means ± S.E.M. and are expressed as [%] ceramide/sphingomyelin. Statistics: one-way ANOVA for repeated measurements, (A) F3,19 = 3.98, p = 0.03; (B) F3,23 = 4.88, p = 0.02. *, p < 0.05 vs. controls (Dunnett's post test).\n", - "7788 \n", - " Effects of isomeric butanols on ceramide formation in astrocytes. Astrocytes were prelabeled with [3H]-serine for 72 hours, washed and treated with 1-butanol (\"1-But\") or t-butanol (\"t-But\"). After (A) 1 hour and (B) 18 hours, the cells were extracted with methanol/chloroform (2:1), phospholipids were separated by TLC, and the radioactivity associated with ceramide and sphingomyelin was determined by liquid scintillation counting. Data (N = 8–10) are means ± S.E.M. and are expressed as [%] ceramide/sphingomyelin. Statistics: Repeated measures ANOVA, (A) F4,49 = 7.2, p = 0.0002; (B) F4,39 = 25.0, p < 0.0001. *, p < 0.05; **, p < 0.01 vs. controls (\"Ctr\"). #, p < 0.05; ##, p < 0.01 vs. effect of 1-butanol (Tukey-Kramer multiple comparisons test).\n", - "7789 \n", - " Effects of phosphatidic acid on ceramide formation in astrocytes. Astrocytes were prelabeled with [3H]-serine for 72 hours, washed and treated with PA (200 μM) or ethanol (EtOH, 0.3 % v/v) during transient permeabilization with streptolysin-O (144 ng/ml) in calcium-free medium. After 15 min, the cultures were washed and re-exposed to calcium-containing medium to initiate pore repair. After (A) 1 hour and (B) 18 hours, the cells were extracted with methanol/chloroform (2:1), phospholipids were separated by TLC, and the radioactivity associated with ceramide and sphingomyelin was determined by liquid scintillation counting. During the experiments, PA was only present for 15 min during cell permeabilization whereas ethanol was present throughout the incubation period. Data (N = 9) are means ± S.E.M. and are expressed as [%] ceramide/sphingomyelin. Statistics: Repeated measures ANOVA, (A) F3,35 = 5.52, p = 0.005; (B) F3,35 = 14.5, p < 0.0001. **, p < 0.01 vs. controls (\"Ctr\"). #, p < 0.05; ##, p < 0.01 vs. effect of ethanol (Tukey-Kramer multiple comparisons test).\n", - "7790 \n", - " Inhibition of phospholipase D activity by ceramide. PLD activity in serum-starved, [3H]-glycerol-labeled astrocytes was determined by the transphosphatidylation assay; in the presence of ethanol, PLD converts [3H]-phosphatidylcholine (PC) into [3H]-phosphatidylethanol (PEth) which reflects PLD activity. In (A), PLD activity was stimulated by addition of medium containing 10% fetal calf serum (FCS) for 5 min. In (B), PLD activity was stimulated by 4β-phorbol-12β,13α-dibutyrate (PDB; 1 μM) for 30 min. C2-ceramide (\"C2\") was added to the cultures in concentrations of 10 and 50 μM 45 min before the addition of FCS and PDB, respectively. Data are means ± S.E.M. of 7–8 experiments and are expressed as [%] PEth/PC. Statistics: ANOVA, (A) F4,36 = 14.0, p < 0.0001; (B) F4,37 = 75.2, p < 0.0001. **, p < 0.01 vs. controls. ##, p < 0.01 vs. stimulated PLD activity (Tukey-Kramer multiple comparisons test).\n", - "7793 \n", - " (A) CYP increases RSV titer in the lungs of BALB/c mice. Mice were treated with CYP (100 mg/kg, i.p.) or PBS and 5 days later infected with RSV (50 μl i.n. twice, 106 PFU/ mouse). Animals were sacrificed on day 4 and RSV titers were measured in whole lung homogenates by RSV plaque assay. (n = 4 for each group; § P < 0.01 vs PBS group). (B) Cyclophosphamide affects body weight. Mice (n = 4) were infected with RSV alone or were treated with CYP (100 mg/kg i.p.) prior to infection. Body weights were measured on day 1, 5, 10, 15, and 22 after treatment. Bars represent means ± SEM. (* P < 0.05; †. P < 0.01 vs RSV); ‡ P < 0.05; § P < 0.01 vs control).\n", - "7794 \n", - " (A) BAL cell differential of RSV-infected mice. Mice were treated with cyclophosphamide (CYP) or vehicle 5 days before infection with RSV. Animals were sacrificed on day 4 postinfection and BAL was performed. Following cytocentrifugation, BAL cells were stained with Leukostat and counted from 4 different slides from each group in a blinded fashion. Cell counts as percentage of total were plotted. (B) Measurement of airway hyperrresponsiveness (AHR). Mice treated as above were tested for AHR by methacholine challenge in a plethysmograph. AHR is expressed as PENH, percent of control. (C) Lung histopathology. Mice were infected with RSV alone (C and D) or treated with cyclophosphamide (A and B) prior to RSV infection. The third group of mice was not exposed to RSV (E and F). Animals were sacrificed on day 5 and their lungs removed and sectioned. Paraffin-embedded lung sections were stained with hematoxylin-eosin.\n", - "7795 \n", - " Detection of RSV and cytokines in the lungs of BALB/c mice. (A) RSV-N and IL-10, IL-12, IFN-γ and β-actin were checked by RT-PCR. Mice were infected with RSV alone or treated with CYP prior to infection. The third group was uninfected (PBS) as control. Animals were sacrificed on day 5, their lungs removed and RNA was isolated and used in RT-PCR assay. (B) Densitometric analysis of the band densities from part A. Relative intensity refers to the ratio of the intensity of each cDNA product to that of β-actin.\n", - "7796 \n", - " CYP-treated BALB/c mice produce higher levels of Th1 and Th2 cytokines. Mice were infected with RSV alone or were treated with cyclophosphamide prior to infection. The third group of mice received no virus (PBS only) as control. Animals were sacrificed on day 5 and their lungs removed. Whole lung homogenates were prepared and cyrtokines were measured by ELISA. Results are given as mean ± SEM (n = 4 for each group). (A) CYP-pretreated mice produce higher IL-10 in the lungs. (‡ P < 0.05 vs. PBS). (B) IL-12 was higher in CYP-treated mice. (§ P < 0.01 vs. PBS. * P < 0.05 vs. RSV). (C) IFN-γ was higher in CYP-treated mice. (* P < 0.05 vs. RSV; ‡ P < 0.05 vs. PBS).\n", - "7797 \n", - " Changes in IL-12 and IFN-γ levels over time in CYP-treated mice. Mice were treated with cyclophosphamide at 100 mg/kg i.p. Animals were sacrificed on day 1, 2, 4, 6 after treatment and their lungs removed. Whole lung homogenates were prepared and IL-12 (A) and IFN-γ (B) were measured by ELISA. Untreated mice were used as control. Results are shown as mean ± SEM (n = 2; ‡ P < 0.05; § P < 0.01 vs. control).\n", - "7801 \n", - " Effects of inhibitors on FGF2-stimulated ERK and GSK3β activity Immunocomplex kinase assays for (A) ERK and (B) GSK3β activity without FGF2 treatment, or after inhibition with PD98059, U0126, LY29004, Bisindolymaleimide I or Gö6983 followed by FGF2 treatment. (C) Inhibitor treatment alone. (D) Summary of changes in phosphorylation (P) versus changes in activity (Act) of ERK and GSK3β. ⇑ Indicates an increase, ⇓ indicates a decrease, – indicates no change. * = P < 0.05 by One-Way ANOVA with post-hoc Dunnett's when compared to control.\n", - "7802 \n", - " Viability assays indicate that ERK activation is required for FGF2 protection against gp120 (A) Trypan Blue Exclusion assay for cell survival after 30 min of treatment with inhibitors LY294002, U0126, Bis I, or Gö6983 followed by treatment with FGF2 and/or gp120. (B) Trypan Blue Exclusion assay for cell survival after 30 min of treatment with the MEK inhibitor U0126 alone, and followed by exposure to gp120 and/or FGF2 for 24 h. In cells treated with FGF2 and anti-FGF2, HUVEC were exposed to anti-FGF2 antibody for 1 h followed by treatment with FGF2 alone or in combination with gp120. * Indicates a significant difference from control. * = P < 0.05 by One-Way ANOVA with post-hoc Dunnett's when compared to control.\n", - "7803 \n", - " Gene transfer of constitutively active ERK and AKT protect cells from gp120 toxicity (A) After gene transfer of constitutively active (ca) ERK or ca AKT, HUVEC were exposed to gp120, FGF2 or a combination of both and cell viability was assayed via Trypan Blue Exclusion. Controls consisted of ca ERK, ca AKT and GFP gene transfer without further treatment. * indicates a significant difference from control. ** indicates a significant difference from *. * = P < 0.05 by One-Way ANOVA with post-hoc Dunnett's when compared to control. ** = P < 0.05 by One-Way ANOVA with post-hoc Tukey-Kramer when compared between experimental groups.\n", - "7805 \n", - " Effects of FGF2, gp120, and inhibitors on ERK and GSK3β phosphorylation (A, B) Western blots showing ERK and GSK3β phosphorylation with (A) gp120 alone (lane 2), and with inhibitors (lanes 3–6), (B) FGF2 and gp120 (lane 2), and FGF2 with inhibitors and gp120 (lanes 3–6). (C) Table summarizing data from western blots (A and B) showing changes in phosphorylation of ERK and GSK3β. ⇑ Indicates and increase, ⇓ indicates a decrease, – indicates no change.\n", - "7807 \n", - " A) In vivo CYP1A enzyme activities (A) and in vivo CYP1A protein expression (B). CYP1A enzyme activities and protein expression in juvenile Atlantic cod exposed in vivo to vehicle (5 ml peanut oil/kg fish), ketoconazole (12 mg/kg fish), nonylphenol (25 mg/kg fish), ethynylestradiol (5 mg/kg fish) and ketoconazole + nonylphenol (12 + 25 mg/kg fish). A) EROD activities. B) CYP1A protein levels analyzed using PAb against rainbow trout CYP1A. Each bar represents mean values of eight to nine fish ± SD; aSignificantly different from vehicle treated fish; bSignificantly different from ketoconazole+nonylphenol treated fish; P < 0.05.\n", - "7808 \n", - " In vivo CYP3A enzyme activities (A) and in vivo CYP3A protein expression (B). CYP3A enzyme activities and protein expression in juvenile Atlantic cod exposed in vivo to vehicle (5 ml peanut oil/kg fish), ketoconazole (12 mg/kg fish), nonylphenol (25 mg/kg fish), ethynylestradiol (5 mg/kg fish) and ketoconazole + nonylphenol (12 + 25 mg/kg fish). A) BFCOD activities. B) CYP3A protein levels analyzed using PAb against rainbow trout CYP3A. Each bar represents mean values of eight to nine fish ± SD; aSignificantly different from vehicle treated fish; bSignificantly different from ketoconazole+nonylphenol treated fish; P < 0.05.\n", - "7809 \n", - " CYP3A Western blot (A) and CYP3A 2D-immunoblots (B). A) Western blot of hepatic microsomal CYP3A proteins in juvenile Atlantic cod treated with vehicle (5 ml peanut oil/kg fish) and ketoconazole (12 mg/kg fish) detected using PAb against rainbow trout CYP3A. B) 2D-gel electrophoresis followed by immunoblotting using PAb against rainbow trout CYP3A. Each blot represent pooled liver microsomes of eight to nine fish for each treatment; vehicle (5 ml peanut oil/kg fish), ketoconazole (12 mg/kg fish), nonylphenol (25 mg/kg fish), ethynylestradiol (5 mg/kg fish), ketoconazole + nonylphenol (12 + 25 mg/kg fish).\n", - "7810 \n", - " Non-competitive inhibition of CYP1A by ketoconazole (A) and non-competitive inhibition of CYP3A by ketoconazole (B). Dixon plots for ketoconazole on A) EROD activity (diamonds represent 8.2; squares represent 25 and triangles represent 677 pM ethoxyresorufin). B) BFCOD activity (diamonds represent 48; squares represent 84 and triangles represent 200 μM BFC).\n", - "7811 \n", - " Non-competitive inhibition of CYP1A by ethynylestradiol (A) and uncompetitive inhibition of CYP3A by ethynylestradiol (B). Dixon plots for ethynylestradiol on A) EROD activity (diamonds represent 8.2; squares represent 25 and triangles represents 677 pM ethoxyresorufin). B) BFCOD activity (diamonds represent 200; squares represent 267 and triangles represents 356 μM BFC).\n", - "7826 \n", - " The proportions of CD4+CD25+ subset in peripheral blood and spleen lymphocytes from normal BALB/c mice. Mouse peripheral blood (A) or spleen single-cell suspensions (B) were collected or prepared, and stained with PE-conjugated anti-mouse CD4 and Cychrome-conjugated anti-mouse CD25 antibodies, after the lysis of erythrocytes, the samples were analyzed by flow cytometry.\n", - "7827 \n", - " The relationship between tumor sizes and the CD4+CD25+/CD4+ proportions in peripheral blood or spleen lymphocytes in tumor bearing mice. (A) 1 × 105 to 1 × 107 C26 colon carcinoma cells were inoculated subcutaneously at right axilla of BALB/c mice (n = 12). 20 days later, after tumor sizes were measured, the mice were sacrificed and peripheral blood lymphocytes (○) and spleen (■) lymphocytes were stained with anti-mouse CD4 and CD25 antibodies. x-axis represents the diameters of tumors; y-axis represents the proportion of CD4+CD25+/CD4+. The absolute total lymphocyte counts were 9.85 ± 2.34 (× 109/L) in peripheral blood and 2.37 ± 0.77 (× 108) in spleen. The representative figures of CD4+CD25+ subset in peripheral blood (B) or spleen (C) lymphocytes from tumor bearing mice were also shown.\n", - "7843 \n", - " Schematic of screen for RNA substrates of Ire1p endoribonuclease using an in vitro nuclease reaction. Recombinant Ire1* expressed and purified from E. coli is incubated with poly(A)+ RNA isolated from wild-type S. cerevisiae to cleave endogenous HAC1 mRNA and other potential RNA substrates of Ire1p. Cleaved RNA (lacking the poly(A) tail) is separated from uncleaved RNA as the unbound, poly(A)- fraction from an oligo(dT) column and used to prepare fluorescent probe by reverse transcription followed by PCR amplification in the presence of Cy3-dTTP. A second control probe, using poly(A)- RNA from mock nuclease reactions (identical reactions except for the lack of Ire1*) is prepared similarly, except that PCR amplification was carried out in the presence of Cy5-dTTP. Equal amounts of these probes are mixed and used to probe the yeast DNA microarray. Because RNA fragments generated by Ire1* cleavage are represented only in the Cy3 probe, microarray spots hybridizing to cleaved fragments should appear green, whereas microarray spots hybridizing to molecules common to both probes should appear yellow upon superimposition of green (Cy3) and red (Cy5) channels.\n", - "7844 \n", - " Efficient cleavage of HAC1 mRNA by Ire1* in the presence of cellular mRNA. (a) Schematic diagram of the Ire1*-cleaved (poly(A)-) and uncleaved (poly(A)+) RNA fractions separated after an in vitro nuclease reaction on yeast poly(A)+ RNA. (b) Northern blot of the RNA fractions indicated in (a) probed with a PCR fragment encompassing either the 5' exon of HAC1 (lanes 1-3) or the 3' exon (lanes 4-6). Lanes 1 and 4, yeast poly(A)+ RNA before Ire1* cleavage; lanes 2 and 5, bound uncleaved RNA fraction (b, poly(A)+); lanes 3 and 6, unbound cleaved RNA fraction (u, poly(A)-). Positions of uncleaved and cleaved HAC1 mRNA are indicated. Note that the 5' exon and 5' exon plus intron, and the 3' exon and 3' exon plus intron RNA species, respectively, co-migrate on these agarose gels.\n", - "7857 \n", - " Temporal and spatial expression profiles of sample genes from the three inflammation-dependent clusters. Temporal and spatial profiles of the (A) early inflammatory, (B) late inflammatory and (C) inflammation-maintained clusters. Line graphs display absolute temporal expression levels (y-axis) at each time point (x-axis) for both PU.1 null (pink) and wild-type (blue) wounds. y-axis expression levels vary according to individual gene expression levels. In situ hybridization studies of (A) 12 h, (B) 24 h or (C) 3 h frozen sections illustrate the contrasting expression patterns of each of these classes of genes in wild-type (WT) versus PU.1 null wounds. (Aa,d,g,j,m,p,s) In the early inflammatory cluster, expression in wild-type wounds peaks at 12 h but is absent or significantly reduced in PU.1 null wounds. (Ab,c) In situ studies show L-plastin to be expressed by activated leukocytes in the wild-type only (arrow). (Ae,f) Faint expression of C3 is seen in both genotypes (see arrows). (Ah,i) Onzin expression appears to be in the same cells within the connective tissue in both genotypes. (Ak,l) Both keratinocytes and leukocytes (arrows) express MRP14 in the wild-type but only keratinocyte expression (arrow) is seen in the PU.1 null wound. (An,o) Osteopontin displays a possible 'fibrosis' gene spatial profile with expression in deep dermal cell layers (arrow) in the wild-type only. (Aq,r) CCr1 is expressed only in the wild-type wound, in cells whose clustered location suggests they are one of the leukocyte lineages.(At,u) Expression of CXC10 is broad and throughout the wound connective tissue of wild-type wounds (arrow) suggesting that expressing cells are wound fibroblasts. (B) In the late inflammatory cluster, expression in wild-type wounds appears to peak beyond 12 h in wild-type wounds and is absent or reduced in PU.1 null wounds. (Bb,c) Expression of Cathepsin S is seen in activated leukocytes in the wild-type only (arrow). (Bd) Repetin is expressed by both genotypes but to a lower level in the PU.1 null. (Be,f) Repetin is only upregulated by keratinocytes but is not restricted only to wild-type wounds (arrows). (Bh,i) Expression of the potential fibrosis gene Angiotensin II Receptor 1 is seen in deep dermal cell layers of wild-type and, to a significantly reduced level, PU.1 null wounds (arrows). (C) In the inflammation maintained cluster, the expression profiles suggest that while these genes may be initially expressed in PU.1 null wounds, persistent expression requires the presence of an inflammatory response as in the wild-type wound situation. (Cb,c) Expression of Mcpt5 is seen at both wound sites (arrows) in scattered cells throughout the wound connective tissue. (Ce,f) CCL2 appears to be expressed by host wound cells at both wound sites (see arrows). (Ch,i) CCL7 is expressed in an almost identical temporal and spatial profile to CCL2. Scale bars = 400 μm (Aa-o, Ba-f, C) and 250 μm (Ap-u and Bh,i).\n", - "7876 \n", - " Overexpression of IGFBP2 in ovarian carcinoma. (A) Western blotting analysis in paired normal and cancer tissues (N1 to T4), one normal ovarian (N5) and 3 unpaired ovarian cancer tissues (T6 to T8) showed frequent overexpression of IGFP2 in ovarian cancer tissues compared with normal ovarian tissues. (N: normal ovarian tissue, T: ovarian cancer tissue). (B) Expression of IGFBP2 in normal ovary (100×), borderline ovarian tumor (100×), and invasive ovarian carcinoma (200×) using tissue microarray. IGFBP2 was expressed at greater level in invasive ovarian carcinoma than normal and borderline ovarian tumors.\n", - "7877 \n", - " IGFBP2 overexpressing promotes ovarian cancer cell invasion. (A) IGFBP2 expression of six ovarian cancer cell lines. The western blotting analysis shows that the expression level of IGFBP2 is heterogeneous in cell lines. SKOV3 and OV-90 ovarian cancer cell lines have very low endogenous IGFBP2. NIH:OVCAR3, PA-1 and TOV-112D have high levels of IGFBP2 expression whereas TOV-21G has relatively moderate expression of IGFBP2. (B) Two vector transfected clones and three IGFBP2 stable clones with different expression level were obtained. The expression of IGFBP2 was determined by western blotting analysis (p: parental SKOV3 cell line, v: vector transfected cell lines, b: IGFBP2 stable cell lines). (C) The invasion capacity of stable clones showed that IGFBP2 overexpressing cells have invasion potential as 1.84 – 2.89 fold as parental and vector transfected cells. (*p < 0.05)\n", - "7878 \n", - " Attenuation of IGFBP2 inhibits ovarian cancer cell invasion. (A) Western blotting analysis of IGFBP2 after transfection of siRNA in OVCAR3 and PA-1. 4 siRNAs inhibit the IGFBP2 with various levels. IGFBP2 levels of siRNA-3 transfected cells have similar to those of Lamin A/C and negative control transfected cells. (B) Four different siRNAs were transfected to PA-1 ovarian cancer cells which has high endogenous IGFBP2. Different inhibiting levels of IGFBP2 were determined by western blotting analysis. siRNA-1 and -4 were working better than siRNA-2 and -3. (C) The invasion activity after 72 hours of siRNA transfection was significantly decreased in siRNA-1 and -4 treated cells comparing with siRNA-2 and -3 treated cells (*p < 0.05).\n", - "7879 \n", - " Turbidity time course of the in vitro microtubule assembly. (A) Tubulin in presence of various ligands. Samples with 15 μM tubulin are maintained at 4°C. After addition of 8 μM Tat (line 4), 4 μM Tat (line 2) from HIV-1 HxB2 strain or 15 μM paclitaxel (line 3), the assembly reaction was started by warming the samples at 37°C (time 0, arrow) and compared to tubulin alone (line1). The ΔOD350 nm is measured every 30 sec. After 30 min the temperature was lowered to 10°C (arrow). (B) Electron microscopy of microtubules formed in the presence of Tat. Aliquot from samples reaching the ΔDO350 nm plateau at 37°C were adsorbed on coated Formvar films on copper grids. Electron micrographs of microtubules formed without Tat (Control) or with indicated concentrations of Tat and paclitaxel are presented with 4000-fold magnification. Microtubules formed with Tat at 8 μM are also presented at 40000-fold magnification. (C) Production of microtubules in the presence of Tat. Samples of 15 μM tubulin alone (Control) and with 8 μM Tat (Tat 8), 16 μM Tat (Tat 16) or 15 μM paclitaxel (Paclitaxel) at the time they reach the plateau at 37°C were ultracentrifuged and supernatant (S) and pellets (P) were analyzed on SDS-PAGE. (Tat 8) × 5 indicates a fivefold increase in the quantity of the sample loaded. The mass of tubulin (Tub 55 kDa) and Tat (Tat 10 kDa) are indicated.\n", - "7881 \n", - " Effect of different Tat variants on cell cycle progression, apoptosis and microtubule network in lymphocytes. (A) Table showing data from fluorescence microscopy after 20 hours treatment with indicated concentration of Tat or paclitaxel. Percentage of apoptotic cells are determined after DAPI staining and the differences in apoptosis between treated and untreated cells used as control obtained in three independent experiments are presented. (B) Jurkat cells were treated with indicated concentrations of paclitaxel and various Tat or were untreated (control). After 20 hours, cells were stained with PI and analysed by flow cytometry. Percentage of cells in G2/M (G2 / M) or apoptotic cells (H) with hypodiploid DNA are indicated in the upper corner of each cell (C) Jurkat cells were treated with 10 μM Tat Eli or 1 μM paclitaxel and processed for immunofluorescence labeling with anti-alpha tubulin antibody as described in materials and methods. Control corresponds to untreated cells.\n", - "7882 \n", - " Tat induces cytochrome c release from isolated mitochondria. After 2 hour treatment with 10 μM (P10) of peptide 73–99 or 0.2 μM (T0.2), 2 μM (T2) and 10 μM (T10) of Tat Eli or without peptide (T-), samples were centrifuged and supernatants and pellets were separated. (A). Western blots of the supernatant with antibodies against cytochrome c (Cyt C) and with antibodies against VDAC. (B) Western blots of Mitochondria Pellets. Data are representative of four independent experiments.\n", - "7884 \n", - " (A) Locations of inteins found in different DNA polymerases of the family B (PolB) (I, II, III; filled triangles) and other extra segments identified in the Mimivirus PolB (i1, i2, i3; open triangles). Nanoarchaeum equitans PolI is encoded in two pieces of genes (NEQ068, NEQ528), the break point of which corresponds to the position III intein integration site. Full intein motifs are comprised of the C-terminal part of NEQ068 and N-terminal part of NEQ528. (B) A phylogenetic tree of the family B DNA polymerases (PolBs) from diverse organisms, including Mimivirus (R322; GenBank AY653733), Paramecium bursaria Chlorella virus 1 (PBCV), Ectocarpus siliculosus virus (ESV), Invertebrate iridescent virus 6 (IIV), Lymphocystis disease virus 1 (LDV), Amsacta moorei entomopoxvirus (AME), Variola virus, Asfarvirus, eukaryotic DNA polymerase α and δ catalytic subunits, and archaeal DNA polymerase I. Intein containing genes are indicated by bold letters in the figure. Numbers in parentheses on the right of species name designate the numbering of paralogs. Sequences corresponding to inteins or Mimivirus extra segments (i1, i2, i3) were removed for the tree reconstruction. N. equitans PolI split genes were concatenated. (C) A phylogenetic tree based on the intein sequences found in PolBs. Numbers (I, II, and III) in parentheses on the right of species names indicate the intein integration sites. In (B) and (C), trees were built using a neighbor joining method, and rooted by the mid-point method. Bootstrap values larger than 70% are indicated along the branches.\n", - "7907 \n", - " Detection of HCoV-NL63 and HCoV-OC43 in samples from patients suffering from severe respiratory symptoms. (A) Number of samples tested per month. (B) Patients infected with HCoV-NL63 and HCoV-OC43. A single HCoV-229E positive sample was isolated in April 2003 (not shown).\n", - "7913 \n", - " Interaction effects of age and residence variable on bone mineral density at the femoral neck in men (A) and women (C), and at the lumbar spine in men (B) and women (D).\n", - "7914 \n", - " After a latency period Wallerian degeneration following cut and crush injury starts abruptly in single axons and involves total fragmentation of axons within few hours A-D: Conventional fluorescence micrographs of a ~2.5 cm long peripheral nerve stump (sciatic-tibial nerve segment) wholemount preparation at the proximal (A) and distal site (B) 37 h after cut injury with few individual fluorescent axons broken into fragments. A small number of axons fragmented at the proximal (C) and distal site (D) of a peripheral nerve stump wholemount preparation could also be detected 40 h following crush injury. E-H: Conventional fluorescence micrographs of a ~2.5 cm long peripheral nerve stump (sciatic-tibial nerve segment) wholemount preparation at the proximal (E) and distal site (F) 42 h after cut injury with most YFP labelled axons fragmented. A similar picture with a majority of axons degenerated is evident at the proximal (G) and distal end (H) of a peripheral nerve stump wholemount preparation 44 h after crush injury. YFP fluorescence has been pseudo-coloured green with the applied imaging software (MetaVue, Universal Imaging Corporation). Magnification: 100 ×\n", - "7918 \n", - " Wave front of Wallerian degeneration in a YFP labelled wild-type axon after crush lesion A: The partially degenerated axon that is bracketed was identified in a 44 h crushed wild-type nerve. All more distal regions of this axon are fragmented and all more proximal regions are intact (data not shown). B-D: higher magnification of this axon from (A) around the transition point between intact and fragmented regions. (D) shows the most proximal breakpoint in this nerve and the inferred retrograde direction of propagation of Wallerian degeneration. Immediately proximal to the breakpoint severe vacuolation occupies almost the entire axon thickness. Slightly further proximal in (C), there are also severe YFP negative vacuoles and fragmentation appears imminent at two points (asterisks). Further proximal still in (B), the degree of vacuolation decreases. YFP fluorescence has been pseudo-coloured green with the applied confocal imaging software (Zeiss LSM Software Release 3.2). Scale bars: 50 μm (A) and 10 μm (B, C, D)\n", - "7919 \n", - " Axonal fragmentation progresses asynchronously as a localised wave along individual axons in a anterograde or retrograde direction A-D: Graphs showing the number of axonal breaks along individual YFP labelled axons with anterograde gradient of fragmentation in relation to the distance in mm from the transection point 37 h (A), 40 h (B), 41 h (C) and 42 h (D) after cut lesion. Note that with increasing distance from the transection, axon lengths with marked fragmentation abruptly change into lengths with no or just a few axonal breaks, indicating that Wallerian degeneration progresses with a localised fragmentation wave front. Additionally note the variable localisation of the fragmentation wave front along different axons at one timepoint representing the asynchronity of Wallerian degeneration among the axon population. E-H: Graphs showing the number of axonal breaks along individual YFP labelled axons with retrograde gradient of fragmentation in relation to the distance in mm from the crush point 40 h (E), 42 h (F), 43 h (G) and 44 h (H) after crush lesion. Note that with increasing distance from the crush point axon lengths without any features of fragmentation abruptly change into lengths containing axonal breaks. Asynchronity of progression of Wallerian degeneration along individual axons is also apparent after crush lesion.\n", - "7921 \n", - " Schematic illustration depicting the spatiotemporal pattern of axon degeneration after cut and crush injury of a wild-type and a WldS peripheral nerve. Each yellow line represents an individual YFP positive axon in wild-type (A, B) and WldS (C, D) peripheral nerves. Accounting for wild-type peripheral nerves, firstly, both after transection (A) and crush injury (B) axonal fragmentation progresses as a localised wave quickly within a matter of few hours over the individual axon. Thereby, the abrupt shift between preserved and fragmented axon distances along partially fragmented axons represents the wave front. The processes differ only in direction with an anterograde course after cut and a retrograde course after crush lesion. Secondly, axonal fragmentation in the YFP positive axon population is asynchronous with some intact and others entirely or partially fragmented in one nerve at one time point. Thirdly, axonal breaks are dispersed homogenously along totally fragmented fibres. In contrast, in WldS peripheral nerves, firstly, both after transection (C) and crush (D) injury axonal degeneration progresses in anterograde direction with a velocity similar to that of slow axonal transport. Secondly, the gradients of axon degeneration are uniform with gradual decrease of degenerative changes along the axon from proximal to distal. Thirdly, degeneration happens broadly synchronously among the population of WldS axons. Fourthly, formation of end bulbs with subsequent swellings at the proximal ends of WldS axons can be observed especially after crush lesion but also occasionally after transection lesion.\n", - "7922 \n", - " Light and electron microscopy revealed an exclusively anterograde gradient of axon degeneration in transected and crushed WldS sciatic/tibial nerves after prolonged lesion times A, F: Quantification of axon preservation at proximal and distal ends of the peripheral nerve stump after transection (A) and crush (F) injury exposed exclusively anterograde gradients of axon degeneration after 15 to 30 days following injury (15 d lesion time-point only after transection injury). Differences in the number of protected axons between the proximal and distal end of the stump were maximum after 20 days and more moderate prior or later to that, correspondingly. Remarkably, after 30 days following crush lesion considerable numbers of totally intact axons could be counted (63.5 % in distal tibial nerve) pointing to a weaker effect of compression over transection and generally to the longevity of distal WldS axons. B-E: Light microscopic images (B, D) and corresponding electron micrographs (C, E) taken from the proximal (B, C) and distal (D, E) end of the peripheral nerve stump after 20 days following transection lesion. At the proximal end (sciatic nerve) 28.1 % myelinated axons were structurally preserved while at the distal end (tibial nerve) we could observe 85.0 % preserved axons pointing to an anterograde gradient of axon degeneration. G-J: Light microscopic images (G, I) and corresponding electron micrographs (H, J) taken from the proximal (G, H) and distal (I, J) end of the peripheral nerve stump after 20 days following compression lesion. Similar to the transection lesion also here we identified a clear anterograde degeneration gradient with 70.0 % intact axons at the proximal end and 94.8 % preserved axons at the distal end of the nerve stump. Magnification of light microscopy is 630 × and electron microscopy is 3400 ×\n", - "7927 \n", - " Two models to account for the progressive nature of Wallerian degeneration after transection lesions in wild-type axons. (A) A putative inhibitor of intrinsic self-destruction machinery is constantly delivered from the cell body to the unlesioned wild-type axon (top). After axon transection the inhibitor is no longer supplied and is cleared first from proximal regions of the distal stump by fast axonal transport. This leads to a wave of fragmentation moving proximal to distal along the isolated axon stump. (B) In an alternative model, the wave of fragmentation is propagated not by directional removal of a putative inhibitor but by rapid localised influx of calcium ions beginning at the most vulnerable part of the axon. Once inside, calcium ions not only activate calpains to degrade the local axoplasm, but also diffuse and exceed the threshold of calpain activation in the immediately adjacent region. This leads to further axoplasmic and membrane breakdown and further calcium influx. The pattern is repeated to generate a wave of fragmentation moving along the axon. Model (A) has the attraction that the putative inhibitor would be a good candidate for mediating of the WldS phenotype (e.g., it could be overexpressed in WldS), while model (B) more easily explains why the directionality is reversed in a crush lesion. The calcium influx and diffusion wave could spread also retrogradely (not shown) if the distal end were the first to disintegrate. In model (A), however, it is hard to see how retrograde axonal transport could explain the depletion of an inhibitor that ultimately has to come from the cell body (see text for more details).\n", - "7931 \n", - " Raf-specific IgG in sera of i.n (A) or p.o/i.v. (B) immunized BxB23 mice (serum dilution 1:200) demonstrated by western blotting. Proteins of 106 lysed SF9 cells expressing recombinant C-Raf [28] (lanes marked with +) or proteins of 106 lysed SF9 cells (– lanes) as control were loaded per lane.\n", - "7935 \n", - " Ldccys2 is a single copy gene and is expressed only in amastigotes. (A) Southern blot hybridization of digested genomic DNA from L. (L.) chagasi (Lc) and L. (L.) donovani (Ld). 5 μg of genomic DNA was digested with restriction enzymes as mentioned in the figure and blotted onto Hybond-N membranes. The blot was probed with coding region pf Ldccys2 cDNA clone. (B) Northern blot analyses of L. (L.) chagasi total RNA. Total RNA (10 μg/lane) from promastigotes of logarithmic (lane 1), stationary (lane 2) growth phase, U937 cells (human macrophage cell line) infected with promastigotes for 96 h (lane 3) and uninfected U937 cells (lane 4) were separated on 1.2% (w/v) formaldehyde agarose gel and transferred on to Hybond N+ membrane. Blot was hybridized with PCR amplified DNA fragment containing 3'UTR from Ldccys2 (panel I), Ldccys1 (154 bp, near the polyA region, panel II), and coding region of α-tubulin from L. (L.) chagasi, a kind gift from Dr. M.E. Wilson (panel IV). (C) Western blot analysis of L. (L.) chagasi promastigotes and amastigotes. Equal amounts of proteins from promastigotes of logarithmic (lane 1), stationary (lane 2) phase, U937 cells infected with promastigotes (lane 3) and uninfected U937 cells (lane 4) were separated on 10% (w/v) SDS-PAGE and blotted on to Hybond – P membrane. Western blot analysis was carried out using α-Ldccys2 antibody.\n", - "7936 \n", - " Expression of recombinant Ldccys2 using insect cell expression system. Western blots showing recombinant expression of Ldccys2 using anti-JHE antibody (A) and duplicate blot probed with anti-Ldccys2 antibody (B). The lanes are labeled appropriately. 5 μg of supernatant from the insect cells expressing recombinant plasmids or the control were separated on 8% SDS-PAGE, blotted onto to PVDF membranes and probed with 1:500 dilution of anti-JHE or 1:100 dilution of anti-Ldccys2 antibody. A horseradish peroxidase conjugated anti-mouse secondary antibody was used and the blot was developed by using ECL chemiluminescent kit. (C) Gelatin assay showing cysteine protease activity of the recombinant protein. The supernatant was separated on a gelatin gel and incubated in a reducing buffer. The gel was then stained with Coomassie Blue to visualize the clearing of gelatin on the gel indicating cysteine protease activity.\n", - "7937 \n", - " Ldccys2 single allele gene replacement. (A) Schematic representation of the wild type and hyg/dhfr-ts targeted alleles of Ldccys2. The location of the PstI sites used to characterize the hygromycin B resistant recombinants is shown by arrows. The bold lines labelled a, b and c represents the location of different probes used in Southern analyses. (B) Southern analyses of Ldccys2 heterozygous knockout mutants. Genomic DNA (2 μg/lane) from wild type L. (L.) chagasi (WT) and Ldccys2 heterozygous knockout mutants (KO) were digested with PstI and separated on a 0.9% (w/v) agarose gel. The DNA was blotted on to Hybond N+ membrane and hybridized with probes a (i), b (ii) and c (iii). Asterisks: 1- represents wild type allele of Ldccys2 (3.5 kb), 2 and 3- represent disrupted allele (3.0 kb and 2.8 kb). The grey lines indicate the size of expected bands upon PstI digestion.\n", - "7938 \n", - " Characterization of L. (L.) chagasi heterozygous knockout mutant amastigotes and intra macrophage survival of Ldccys2KO amastigotes in vitro. (A) Northern blot analysis. Total RNA (10 μg/lane) from U937 cells infected with wild type promastigotes, Ldccys2KO and uninfected U937 cells were separated on 1.2% (w/v) formaldehyde agarose gel and transferred on to Hybond N+ membrane. Blot was hybridized with Ldccys2 coding region DNA probe (1) and α-tubulin gene from L. (L.) chagasi (2). (B) Western blot analysis. Equal amount of lysates from U937 cells infected with wild type promastigotes, Ldccys2KO promastigotes and uninfected U937 cells were separated on 10% (w/v) SDS-PAGE, blotted on to Hybond P membrane. Panel 1 represents the membrane that was probed with α-Ldccys2 antibody and panel 2 is the duplicate gel stained with Coomassie blue. (C) Bar graph showing the number of intracellular amastigotes. U937 macrophage cells were infected at a macrophage to parasite ratio of 1:10. The survival of the amastigotes within the macrophages was evaluated every 12 hours by cytospin and Diff-Quick staining. (D) Graph showing the percent of total macrophages infected at the given time points. For each treatment, 100 infected macrophages were counted. Values represent means ± SEM from three independent experiments.\n", - "7939 \n", - " Expression of sense and antisense Ldccys2 transcripts in L. (L.) chagasi and survival of wild type, sense and antisense Ldccys2 expressing amastigotes in macrophages. (A) Northern blot analyses of amastigotes expressing sense and antisense transcripts. Total RNA (10 μg/lane) isolated from axenic amastigotes of wildtype parasites, transfectants with P6.5/Ldccys2 sense plasmid and P6.5/Ldccys2 antisense plasmid were separated on 1.2% (w/v) formaldehyde agarose gel and blotted on to Hybond N+ membrane. Blots were probed with probes specific for antisense (panel 1) and sense (panel 2) transcripts. Panel 3 represents ethidium bromide stained gel. (B) Western blot analysis of sense and antisense Ldccys2 expressing amastigotes. Equal amounts of total protein extracted from axenically transformed amastigotes with P6.5/Ldccys2 sense plasmid and P6.5/Ldccys2 antisense plasmid and wildtype parasites were separated on 10% (w/v) SDS-PAGE and blotted on to Hybond P membrane. The blot was probed with α-Ldccys2 antibody (panel 1) and a duplicate gel was stained with Coomassie blue (panel2). (C) Bar graph showing total number of amastigotes within the macrophage cells. U937 macrophage cells were infected at a macrophage to parasite ratio of 1:10. The survival of the amstigotes within the macrophages was evaluated every 12 hours by cytospin and Diff-Quick staining.(D) Graph showing the percent of total macrophages infected at the given time points. For each treatment, 100 infected macrophages were counted. Values represent means ± SEM from three independent experiments.\n", - "7940 \n", - " Reduced activity and protein levels of the Na+/K+ ATPase enzyme in APP+PS1 mice. Activity of total (A) and ouabain-sensitive (B) ATPase was assayed colorimetrically in APP+PS1 mice tissue (n = 8, open bars) and non-transgenic littermate tissue (n = 8, solid bars), presented here as μmols of phosphate liberated by ATPase per mg of protein per hour. In the amyloid-containing hippocampus, there was a significant decrease in the specific activity of ouabain-sensitive ATPase in APP+PS1 mice compared to non-transgenic mice, but there was no decrease in cerebellar Na+/K+ ATPase activity. Cerebellar activity was 20% of that seen in non-transgenic hippocampus. Panel C shows the quantitation of the optical density of bands corresponding to the molecular weight of Na+/K+ ATPase using standard Western blot technique. This reveals a trend for decreased protein levels. *** indicates significant differences between APP+PS1 mice and non-transgenic littermates (p < 0.001) when measured by one-way ANOVA.\n", - "7965 \n", - " Spot fluorescence and standard concentration A graph of spot fluorescence as a function of standard concentration (A) shows that both the difference in concentration and the variability in spot fluorescence increase with concentration. Both negatively affect model fitting and subsequent statistical inferences due to the excessive leverage of the larger concentrations and the heteroskedasticity of the spot intensities. In this case, loge transforms of both concentration and spot fluorescence reduce the excessive leverage and improve the homogeneity (B). The log transformation is consistent with the featured concentration dilution series and is a common transformation of chemical measurements that often are assumed log normally distributed.\n", - "7966 \n", - " Candidate standard curves A review of the graphs of a four-parameter logistic curve (A) and a power law curve (B) suggests that the former shows higher fidelity to the data and is a better choice for the standard curve in this case.\n", - "7967 \n", - " Modeling diagnostics The points in graphs of the standardized residuals versus the loge standard concentrations (A) and the standardized residuals versus the estimated loge spot intensities (B) are reasonably well behaved, showing no strong systematic trends or deviations from the zero line. These indicate that the four-parameter logistic model is acceptable, that subsequent statistical inferences are reasonable, but that a better model may exist in another model family.\n", - "7968 \n", - " Three-panel diagnostic summary The standard curve panel (A) of the three-panel diagnostic summary features a scatterplot of the data, the estimated standard curve (black line), the 95% confidence intervals (blue lines), and the region of acceptable errors (grey). For this example, the acceptable segment of the standard curve (i.e., the segment with concentration estimation errors acceptable to us) covers spot intensities from about 1000 to 7500 intensity units and concentrations from about 25 to 500 pg/ml. The histogram of sample intensities (B) suggests that about one-fifth of the sample spot intensities is below the detection limit of about 1000 units, about three-fifths will produce estimated concentrations in the acceptable range, and one-fifth exceeds the acceptable range. With regard to remeasuring the standards in this experiment or imaging in future experiments, the three-panel graph suggests that it may be worthwhile to attempt to extend the acceptable range. It also suggests that the normalization between the standards measurements and sample measurements should be revisited. The graph of the concentration coefficient of variation as function of concentration (C) offers an alternative summary of the estimation errors over the range of concentrations.\n", - "7972 \n", - " (A) Log transformed marginal outgoing degree distributions (B) Log transformed marginal incoming degree distributions in the eleven organisms\n", - "8089 \n", - " (A) Normal HeLa confluent monolayer. (B) CPE in the HeLa cells at 3 days after infection with adenovirus type 1. (C) CPE in the HeLa cells at 3 days after infection with 500 μl eluate of the infected adenovirus type 1 untreated filter paper strips. (D) CPE in the HeLa cells after 3 days infected with the dialysed adenovirus type 1 positive cell cultured sample. (E) No CPE was observed when the HeLa cells were infected with 500 μl of the dialysed eluate from the adenovirus type 1 infected SDS/EDTA-pretreated paper strip.\n", - "8093 \n", - " (A) Percentage of apoptosis in LoVo cells after exposure times of 4, 8 12, 16, 20 and 24 h to 10 μM of NCX 4040. (B) Apoptosis in LoVo cells after a 24-h exposure as evidenced by in situ TUNEL assay. (C) Apoptosis in LoVo cells after a 24-h exposure as evidenced by DAPI staining. (D) Inhibition of NCX 4040-induced apoptosis in LoVo cells after a 24-h simultaneous exposure to the NO-NSAID and the caspase-9 inhibitor, as evidenced by TUNEL assay.\n", - "8094 \n", - " (A) COX-1 and COX-2 basal mRNA and protein expression in the different cell lines. Lane a, LoVo cells; lane b, WiDr cells; lane c, LRWZ cells; lane d, LoVo Dx. (B) COX-1 protein expression in the different cell lines. LoVo: lane 1, untreated cells; lane 2, cells exposed to 10 μM of NCX 4040 (24 h); LoVo Dx: lane 3, untreated cells; lane 4, cells exposed to 50 μM of NCX 4040 (24 h); WiDr: lane 5, untreated cells; lane 6, cells exposed to 50 μM of NCX 4040 (24 h); LRWZ: lane 7, untreated cells; lane 8, cells exposed to 50 μM of NCX 4040 (24 h). (C) COX-2 protein expression in WiDr and LoVo Dx cell lines after different exposure schemes to 10 μM of NCX 4040. Lane 1, untreated cells (24 h); lane 2, NCX 4040 (24 h); lane 3, untreated cells (24 h) + washout (24 h); lane 4, NCX 4040 (24 h) + washout (24 h).\n", - "8095 \n", - " (A) Activation of caspases-9 and -3 after exposure times of 1, 2, 3, 4, 5 and 6 h to 10 μM of NCX 4040 in LoVo cells. (B) Activation of caspases-9 and -3 after exposure times of 8, 10, 12 and 14 h to 50 μM of NCX 4040 in LRWZ cells. An antibody for actin was used as loading control.\n", - "8096 \n", - " Antitumor efficacy in mice implanted with LoVo Dx (A), WiDr (B) and LoVo (C) cell lines. Each experimental group included 8 mice, each experiment was repeated at least three times, and representative independent experiments are reported. Experimental points represent means of 24 experiments (bars, SD). Arrows indicate the start of treatment.\n", - "8102 \n", - " Percentage of γδ T cells in young/adult and old melanoma patients and age-matched healthy subjects. Freshly isolated (A) or 10-day cultured (B) PBMC from young/adult and old melanoma patients and young/adult and old healthy subjects were double stained with MoAb anti pan- γδ (FITC) and anti-CD3 (PE) and analyzed by flow cytometry. Statistical analyses was performed as reported in Mat. and Methods.\n", - "8137 \n", - " Selection of transgenic HD1 plants. Potato plant transformed with pHD1-BinAR construct carrying a cDNA for human dopamine receptor under the control of the CaMV 35S promoter (A) were selected by northern blot analysis (B). Lines showing the highest expression were further submitted to western blot analysis. For this purpose proteins were extracted with 0.1% or 1% Triton (C) and 50 μg of protein extract was run on 12% SDS polyacrylamide gel. D refers to control plants, numbers to different transgenic lines and S to Full Range Rainbow Molecular Weight Marker RPN 800 (Amersham Bioscience).\n", - "8155 \n", - " dsRNAs and plasmids used for transfections. (A) Not-to-scale schematic representation of the endogenous TbPFR2 locus, with four copies of TbPFR2 coding sequence and specific UTRs. Regions targeted by RNAi are highlighted. The TbPFR2 coding sequence was targeted using CDS dsRNA and the UTRs were targeted all together with a set of dsRNA homologous to the 3' UTR, the intergenic UTR (igUTR) and the 5' UTR (UTRs MIX dsRNAs). (B) Not-to-scale representation of the constructs used for the transfection of WT cells (pTbPFR2TAG430 and pTbPFR2TAG430-ΔHLA; integration in the rDNA spacer) or TbPFR2i cells (pPCGFP and pPCTcPFR2; integration in the tubulin intergenic region). Large boxes represent protein coding sequences (black boxes: proteins of interest; grey boxes: antibiotic-resistance activities). Each plasmid was linearized with the indicated restriction enzyme prior to transfection into the cells. 3' ALD UTR: 3' UTR of the aldolase gene; ACT UTR: 5' or 3' UTR of the actin gene; EP ig reg: EP procyclin intergenic region; TUB ig reg: tubulin intergenic region.\n", - "8157 \n", - " TbPFR2 silencing by targeting its UTRs all together. WT cells were transfected with GFP dsRNA (A), CDS dsRNA (B) or UTRs MIX dsRNAs (C). At 14 h post-transfection, cells were treated for immunofluorescence using the L8C4 anti-TbPFR2 antibody (green) and counterstained with DAPI (blue). Cells of interest are bi-nucleated/bi-flagellated. Transfection of GFP dsRNA did not produce any specific phenotype. Both the CDS dsRNA and the UTRs MIX dsRNAs successfully silenced TbPFR2. Scale bar: 10 μm. See text for details.\n", - "8253 \n", - " Differential Localization and Expression of CD36 Protein in Kidneys of Diabetic Mice with Glomerulopathy and of Humans with DNP(A and B) Indirect double-immunofluorescence labeling of kidney sections from non-diabetic control (A) and diabetic (B) mice with anti-CD36 (green) and proximal tubular marker anti-aquaporin1 (red).(C and D) Double labeling of non-diabetic control mice with anti-CD36 (green) and loop-of-Henle marker sodium potassium chloride cotransporter anti-NKCC (red) (C) and collecting duct marker aquaporin2 (red) (D) (arrow depicts colocalization of anti-CD36 and anti-aquaporin2 staining).(E and F) Double labeling of human kidney sections from control individuals (E) and individuals with diabetes with DNP (F) using anti-CD36 (green) and anti-aquaporin1 (red).(G) Higher-magnification image of (F) with arrows depicting colocalization of anti-CD36 and anti-aquaporin1. (Note that anti-CD36 labeling is heterogeneous: staining is isolated proximal tubular cells.)(H–J) Representative images of anti-CD36 immunoperoxidase staining of sections of normal human kidney (H), human kidney with DNP (I), and human kidney with FSGS (J). Arrow in (I) depicts proximal tubular epithelial staining.(K) CD36 PTEC expression score derived from blinded, semi-quantitative analysis of distribution and intensity of proximal tubular CD36 staining of human biopsy samples from ten normal control, ten DNP, and ten FSGS kidneys and the result shown on a dot plot. Significance was calculated by Wilcoxon Rank Sum Test, and PTEC scores for DNP kidneys were significantly different from those of FSGS kidneys and normal human kidneys.\n", - "8254 \n", - " TED and IF Coincide with Proximal Tubular Apoptosis and CD36 Expression in Human DNP(A and B) Periodic Acid–Schiff staining of diabetic mouse kidney (28-wk-old C57BLKS/J-leprdb/db) (A) and human DNP kidney (B). Arrowheads denote glomeruli with advanced mesangial expansion and glomerulosclerosis; arrows depict normal proximal tubule in diabetic mouse (A) and TED in human with DNP (B).(C) TUNEL assay (green) and anti-CD36 (red) double labeling of human DNP. Arrows indicate apoptotic, CD36-positive tubular epithelial cells.(D) TUNEL assay (green) and anti-aquaporin1 (red) double labeling of human DNP. Arrows depict TUNEL-positive and aquaporin1-positive PTECs.(E) Dot plot indicates the number of TUNEL-positive tubular cells per 100 total tubular cells in kidneys of control (CTL) and diabetic (DM) mice and humans, as indicated.\n", - "8255 \n", - " CD36 mRNA and Protein Synthesis Is Stimulated in Human, but Not in Murine, PTECs, and Is Suppressed in Murine Collecting Duct Cells by High Ambient Glucose(A) Relative CD36 mRNA abundance determined by quantitative real-time PCR in human PTEC line HK-2 treated with 30 mM D-glucose (open bars) or control L-glucose (black bars) for 4 and 24 h following maintenance of cells in 5 mM D-glucose medium. Bars represent mean ± SEM of three to five repeat experiments. Numbers on top of bars indicate significant p-values of experimental groups relative to 0 h.(B) Bar graphs show experiment as described under (A), using mouse collecting duct cell line M1 instead of human HK-2 PTECs. The relative expression of CD36 was normalized to internal control housekeeping genes HPRT and beta actin, and to baseline controls (untreated cells).(C) Relative cell surface expression of CD36 protein determined by FACS in M1 cells (open bars) and HK-2 cells (black bars) maintained in 5 mM D-glucose medium (CTL), or in medium containing 30 mM D-glucose (D-gluc) or L-glucose (L-gluc) for 72 h. (Original FACS histograms are provided in Figure S1.) Bars represent mean ± SEM of three to five repeat experiments. Numbers indicate significant p-values of experimental groups relative to control.(D) Immunoblot showing CD36 protein levels in human HK-2 PTECs maintained in control 5 mM D-glucose (CTL), or after stimulation for 72 h with 30 mM L-glucose (L-gluc) or D-glucose (D-gluc), as indicated. Tubulin is shown for loading control. All data represent at least four independent repeat experiments.\n", - "8256 \n", - " AGE-BSA, CML-BSA, and FFA PA Induce Apoptosis in Human PTECs through CD36 SignalingBar graphs show mean ± SEM of apoptotic nuclei, visualized by DAPI staining and normalized to 100 total cells, in human HK-2 PTECs. Data are derived from three independent repeat experiments. Numbers on top of bars indicate significant p-values of experimental groups relative to control, or as indicated by bracket.(A) Cells were treated for 48 h with control BSA (40 μM), TSP-1 (1 μg/ml), and AGE-BSA modified for 2, 5, or 10 weeks (AGE-BSA2, AGE-BSA5, and AGE-BSA10, respectively) in the absence or presence of control IgG (10 μg/ml) or anti-CD36 neutralizing antibody (10 μg/ml), as indicated.(B) Cells were treated with control BSA (40 μM), or CMLmin-BSA at 0.5, 1, 2, 5, and 10 μM, in the absence or presence of anti-CD36 neutralizing antibody, as indicated.(C) Cells were treated with monounsaturated FFA oleic acid (OA) or PA at increasing concentrations, in the absence or presence of control IgG (10 μg/ml) or anti-CD36 neutralizing antibody (10 μg/ml), as indicated.\n", - "8257 \n", - " Activation of Intracellular Pathways following AGE-BSA and PA Treatment of Human HK-2 PTECs(A and C) Immunoblots show levels of (A) phosphorylated (Y418) src kinase and tubulin or (C) phosphorylated p38 MAPK (pp38) and total p38 MAPK (p38) in HK-2 cells treated with AGE-BSA5 (40 μM) in the absence or presence of control IgG or anti-CD36 neutralizing antibody (10 μg/ml) for different time periods, as indicated.(B and D) As shown in (A) and (C), except HK-2 cells were treated with PA (150 μM) instead of AGE-BSA5.(E and F) Bar graphs demonstrate mean ± SEM of caspase 3 activity in three independent repeat experiments. Caspase 3 activity was measured by quantitative ELISA in HK-2 cells after 18 h of stimulation with AGE-BSA5 and PA, as per manufacturer's protocol. Numbers on top of bars indicate significant p-values of experimental groups relative to control, or as indicated by brackets.(G) Bar graphs demonstrate number of apoptotic nuclei of HK-2 cells, normalized to 100 total cells, treated with AGE-BSA5 (40 μM) or PA (150 μM) in the absence (black bars) or presence of pan-caspase inhibitor (z-VAD-fmk [100 μM]; open bars), caspase 3 inhibitor (z-DEVD-fmk [20 μM]; first striped bars), caspase 9 inhibitor (z-LEHD-fmk (20 μM); gray bars), or chemical inhibitors of p38 MAPK (SB203580 [10 μM]; second striped bars). Mean ± SEM of three independent repeat experiments is presented. Numbers on top of bars indicate the significant p-values for comparison relative to control (no inhibitor).\n", - "8260 \n", - " Accessibility of Communities to HCFs(A) A histogram indicating heterogeneity in the distance from communities in KwaZulu–Natal to the closest HCF. The treatment accessibility function used in our model is a Gaussian distribution, exp(−kd\n", - "2), indicating that accessibility is strongly related to distance (d), and k is a dispersal length scale parameter.(B) The catchment region is shown with an effective radius of 20 km for coverage from each HCF (k = 0.0151).(C) The catchment region is shown with an effective radius of 40 km for coverage from each HCF (k\n", - "= 0.003786).(D) The catchment region is shown with an effective radius of 60 km for coverage from each HCF (k = 0.00168).In each case, the red dots indicate the location of the HCF, the green circles represent the locations where treatment accessibility has been reduced to 50% relative to someone located at the HCF, and the blue circles represent the locations where treatment accessibility has been reduced to 1% relative to someone located at the HCF. The locations of communities are presented as black diamonds. The large black diamonds denote large communities (with population greater than 10,000 people), and the small black diamonds denote small communities (with population less than 10,000 people). Substantially more area of the province is covered if HCFs have catchment regions of 60-km radius, relative to catchment regions of 40-km radius, and substantially less area of the province is covered if HCFs have a catchment region of only 20-km radius. However, the proportion of people with access does not differ greatly between the different catchment sizes because of the great spatial heterogeneity in the prevalence of people with HIV.\n", - "8261 \n", - " Pie Charts of the Three Strategies for Allocating ARVs to HCFsThe three strategies considered are as follows: allocation of ARVs according to the results of minimizing our objective function (first row) allocation of ARVs only to one HCF in Durban (second row), allocation of ARVs equally to each of the 17 HCFs (third row). The proportion of ARVs allocated by these strategies to the 17 different HCFs is indicated in (A), (D), and (G), with each HCF represented by a different color. The spatial allocation of ARVs is shown in (B), (E), and (H), respectively. The respective percentage of infected people that are treated throughout the KwaZulu–Natal province is simulated in (C), (F), and (I). Here, the x–y plane represents spatial location, and the shaded color at a location refers to the proportion of individuals with HIV that are treated at the specified location. The plots were obtained by generating an interpolating surface where the z-ordinate, colored by magnitude, represents the proportion of treated individuals, and then orientating the view of the surface normal to the x–y plane. We performed surface data interpolation using the method of translates [32].\n", - "8270 \n", - " Sequencing Chromatograms with the T790M EGFR Exon 20 Mutation in Various Clinical Specimens and the NSCLC Cell Line H1975(A–C) In all three patients—patient 1 (A), patient 2 (B), and patient 3 (C)—the secondary T790M mutation was observed only in lesions obtained after progression on either gefitinib or erlotinib.(D) Cell line H1975 contains both an exon 21 L858R mutation (upper panel) and the exon 20 T790M mutation (lower panel). The asterisks indicate a common SNP (A or G) at nucleotide 2361; the arrows indicate the mutation at nucleotide 2369 (C→T), which leads to substitution of methonine (ATG) for threonine (ACG) at position 790. In the forward direction, the mutant T peak is blue. In the reverse direction, the mutant peak is green, while the underlying blue peak represents an “echo” from the adjacent nucleotide.\n", - "8271 \n", - " A Novel PCR-RFLP Assay Independently Confirms Presence of the T790M Mutation in Exon 20 of the EGFR Kinase Domain(A) Design of the assay (see text for details). “F” designates the fluorescent label, FAM. At the bottom of this panel, the assay demonstrates with the 97-bp NlaIII cleavage product the presence of the T790M mutation in the H1975 cell line; this product is absent in H2030 DNA. The 106-bp NlaIII cleavage product is generated by digestion of wild-type EGFR.(B) The PCR-RFLP assay demonstrates that pre-drug tumor samples from the three patients lack detectable levels of the mutant 97-bp product, while specimens obtained after disease progression contain the T790M mutation. Pt, patient.\n", - "8272 \n", - " EGFR Mutants Containing the T790M Mutation Are Resistant to Inhibition by Gefitinib or Erlotinib293T cells were transiently transfected with plasmids encoding wild-type (WT) EGFR or EGFR mutants with the following changes: T790M, L858R, L858R + T790M, del L747–E749;A750P, or del L747–E749;A750P + T790M. After 36 h, cells were serum-starved for 24 h, treated with gefitinib or erlotinib for 1 h, and then harvested for immunoblot analysis using anti-p-EGFR (Y1092), anti-t-EGFR, anti-phosphotyrosine (p-Tyr), and anti-actin antibodies as described in Methods. The EGFR T790M mutation, in conjunction with either wild-type EGFR or the drug-sensitive L858R EGFR mutant, prevents inhibition of tyrosine phosphorylation (A) or p-EGFR (B) by gefitinib. Analogously, the T790M mutation, in conjunction with the drug-responsive del L747–E749;A750P EGFR mutant, prevents inhibition of p-EGFR by erlotinib (C).\n", - "8276 \n", - " Structural Models of EGFR Showing the T790M Resistance Mutation(A) Space-filling representation of the wild-type kinase active site (cyan) with the viewer looking down the vertical axis. The structure above the plane of the figure is omitted for clarity. The threonine 790 side chain is green, and erlotinib's molecular surface is shown as a yellow net.(B) The threonine 790 side chain is replaced by the corresponding methionine side chain from the structure of the insulin receptor tyrosine kinase (Protein Data Bank entry 1IRK). The EGFR and insulin receptor have a similar structure in this region of the active site. The methionine side chain would sterically clash with erlotinib, as shown, as well as with the related kinase inhibitor gefitinib (not shown).(Figure: Nikola Pavletich, Structural Biology Program, Memorial Sloan-Kettering Cancer Center)\n", - "8312 \n", - " Polyacrylamide gels from electromobility shift assays. Polyacrylamide gels showing the decrease in amounts of protein complex with labelled oligomer as the concentration of the competing non-labelled oligomer increases (lanes marked x5 through x25). Lane marked ’C’ has no competitor and represents the basal levels of labelled complex. The measure of displacement of the labelled oligomer is expressed as a ratio of radio-labelled product, for each lane, divided by the basal value, presented in Table 2. Comparison of allele specific DNA-protein complex stability is a ratio of the highest competitor concentration (x25) of each of the two alleles. Thus for rs1799722 (A) allele A binds proteins 1.66 times better than allele G and for rs2528521 (B) allele A binds proteins 2.62 times better than allele G (Table 2, extreme right column).\n", - "8317 \n", - " Characterization of fibre type specificity of dihydropyridine receptor Two subsequent sections of mouse musculus gastrocnemius were assayed for DHPR localization by fluorescence staining (A) and for fibre type analysis by staining for mATPase (B). After preincubation in pH 4.6, type IIA displays a relatively low acid stability and is stained most lightly (*). The corresponding fibre in (A) is also recognized by fluorophore conjugated DHP blocker. The fibre on the right of the asterisked fibre shows also fluorescence. The intensity is, however, somewhat lower than in the fibre next to it and originates probably from the special fibre type (hybrid, type IIDA). (C) A control sample preincubated with nifedipine. Bar 20 μm.\n", - "8337 \n", - " Interaction network maps showing 109 (A), 40 (B), and 31 (C) interacting proteins.\n", - "8353 \n", - " The molecular composition of the sea urchin vault.(A) SDS-PAGE analysis (4–16% acrylamide gradient gel) of isolated sea urchin (S) and rat (R) vaults. The band at ~100 kDa in both lanes represents the major vault protein (MVP). (B) SDS-PAGE analysis of sea urchin vaults both without (-) and with (+) RNase treatment. The 26.5 kDa band in the (-) RNase lane, which is missing in the (+) RNase lane, is thought to correspond to the sea urchin vRNA. Mr represents the molecular weight marker lane.\n", - "8354 \n", - " The sequence of the sea urchin major vault protein (SpMVP). (A) Amino acid sequence of SpMVP aligned with that of rat MVP. Identical residues are highlighted in yellow, and similar residues are highlighted in green. (B) Bar diagram of SpMVP. The sequence has seven repeats in the N-terminal half of the protein (R1-R7), each repeat consisting of 41 to 62 aa, spanning residues 32–400; and a predicted coiled coil region in the C-terminal half of the sequence (C.C.), residues 663–762. The positions of two possible nuclear localization sequences (NLS1 470-KKAR, and NLS2 498-KPKR), a putative nuclear export sequence (NES, 792–816), and two probable sumoylation sites that are conserved across six species (S1 K308-VKGE, and S2 K707-AKAE) are indicated.\n", - "8355 \n", - " Western blots of isolated sea urchin vaults. (A) Peptide amino acid sequence of rat MVP (aa 19–35) aligned with Sp MVP (25–41). Anti-peptide antibodies were generated against the rat MVP sequence shown and affinity-purified as previously described [38]. Twelve of the rat MVP amino acids are conserved in the Sp MVP peptide sequence. (B) 150 μg of sea urchin egg extract proteins (lane E) and 10 μg of purified sea urchin vault proteins (lane V) were separated on this Coomassie-blue stained SDS-8% polyacrylamide mini-gel. The arrow shows the position of the 100 kDa MVP in (B, C and D). (C) Alkaline-phosphatase stained western blot showing the migration of the pre-stained protein ladder (lane M: 176.5, 113.7, 80.9, 63.8 (pink), 49.5, and 8.4 kDa polypeptides). Affinity-purified anti-sea urchin MVP antibodies [16] recognize a 100 kDa polypeptide in egg extracts (lane E) and in purified vault preparations (lane V). Asterisks indicate two bands of approximately 80 kDa and 50 kDa that may be breakdown products of the MVP. (D) Affinity-purified anti-peptide antibodies (anti-LDQN, [38]) bind to the 100 kDa MVP polypeptide in purified sea urchin vaults. This peptide antibody appears to bind non-specifically to a large number of polypeptides in the sea urchin egg extracts.\n", - "8356 \n", - " Negative-stain and cryoEM images of isolated sea urchin vaults. (A) Negative-stain electron micrograph. (B) Cryoelectron micrograph. The black arrow indicates a vault that is opening at the midsection, and the white arrow indicates the dark molecular contents within another particle. The scale bar represents 1,000 Å. Note that the magnification of the cryoEM image (B) is slightly higher than that of the negative-stain EM image (A).\n", - "8357 \n", - " The sea urchin vault reconstruction at 33 Å resolution. (A) The full reconstruction, which reveals that the sea urchin vault has essentially the same exterior structure as rat and mouse vaults. (B and C) The reconstruction is shown cropped along two perpendicular axes to reveal the hollow interior. The crop planes are displayed with the strongest density in red and the weakest density in green. Note that the strongest density is in the \"shoulder\" region at the top and bottom of the central barrel section. The flat portion of one cap is indicated by an arrow in (B). The scale bar represents 100 Å.\n", - "8359 \n", - " S1 processing and detergent fractionation in CHO cells. (A) Cells were incubated with PT (20 nM) for 4 h followed by lysis with RIPA or Triton X-100 (TX100) buffer on ice or at room temperature (RT). A western blot of the detergent-insoluble (I) and -soluble (S) fractions is shown, with bands corresponding to full length S1 or processed S1 (S1p) indicated. Lane marked C is PT (200 ng) loading control. (B) Western blot of Triton X-100 lysate fractions of CHO cells treated with PT or PT* (catalytically inactive mutant of PT) for 4 h. (C) Western blot of Triton X-100 lysate fractions of untreated CHO cells after addition of 500 ng PT to the lysis mixture.\n", - "8362 \n", - " Localization of the processing site on S1. (A) CHO cells were incubated with PT or PT*-CSP/N (PT*/N) for 4 h and analyzed for S1 processing as before. Western blots are shown of the processing samples (proc) or purified protein loading controls (C). (B) Western blot comparing S1p after processing of PT in CHO cells (proc) or trypsin cleavage (tryp) of PT (200 or 100 ng).\n", - "8363 \n", - " Processing of mutant PT proteins in CHO cells. (A) Western blot showing purified protein (lanes marked [C]) or processing of S1 (lanes marked [proc]) after addition of various mutant PT proteins (20 nM) to CHO cells. (B) Western blot showing processing of S1 (lanes marked [proc]) after addition of the 210–218/R replacement mutant PT proteins or PT and PT* controls to CHO cells.\n", - "8364 \n", - " ADP-ribosylation assay of mutant PT constructs. (A) Autoradiogram of cellular ADP-ribosylation assay after treatment of CHO cells with the indicated PT protein. The upper radiolabeled band (approximately 41 kDa) corresponds presumably with Giα2 and Giα3, while the lower band is PT-independent endogenously labeled band often seen in this assay with CHO cell lysates [9]. (B) Graphed data showing the mean (n = 3) cellular activity of the 2 deletion constructs that are not processed (activity of wild type PT was set at 100%) and the in vitro ADP-ribosylation activity of the same proteins. (C) Autoradiogram of cellular ADP-ribosylation assay after treatment of CHO cells with the indicated PT protein, demonstrating the retention of activity of the replacement mutant PT constructs.\n", - "8365 \n", - " S1 processing in CHO cell transfectants expressing S1. (A) Western blot showing lack of processing of endogenous S1 in transfectants expressing S1 in the cytosol (S1-SP) or in the ER (S1+SP). (B) Western blot showing EDTA-inhibitable processing of S1 after exogenous addition of purified PT (20 nM) to these transfectants.\n", - "8384 \n", - " Strength/Duration Curves. Strength / duration (S/D) curves for cardiac muscle cells (filled circles) and smooth muscle cells (unfilled circles) (5-cell chains) when Rgj was ∞ (0 channels) (A) or when Rgj was 10 MΩ(1000 channels) (B). The S / D curves are rectangular hyperbolas. The time (pulse duration) it takes for a current intensity of twice the rheobasic intensity to produce the all-or-none repolarization is the chronaxie (σ) The rheobase is the asymptote of the data points extrapolated back to the ordinate, as shown. The chronaxie was about 1.0 ms, in both panels A and B. But the absolute current intensity required was about 8–10-fold greater in panel B compared to panel A. The membrane time constant (τm) is related to the chronaxie (σ) by the equation shown in panel A.\n", - "8391 \n", - " Apoptosis mediated by death receptors requires the FADD adaptor molecule. (A) Engagement of a Fas ligand trimer on a trimer of Fas leads to FADD adaptor molecule recruitment through homotypic DD interactions. FADD next binds initiator pro-caspase through DED interactions. This Fas/FADD/pro-caspase complex forms the Fas death-inducing signaling complex (DISC) since initiator pro-caspase activates a caspase cascade resulting in apoptotic death of the cell. Alternatively, c-FLIPs can promote cell survival by interacting with FADD through their respective DED, thus hindering recruitment and activation of initiator pro-caspase. (B) Signaling mediated by TNF-R1 implicates formation of two sequential complexes [61]. The complex I (in blue) contains the TNF-R1, the adaptor TRADD, the receptor interacting kinase (RIP), and the TNF-receptor associated factor 2 (TRAF2). It assemblies rapidly following TNF-α stimulation and activates the NF-kB pathway which in turn induces expression of survival genes, including c-FLIP. Later on, complex I dissociates from the TNF-R1 and is internalized. FADD can then bind the liberated DD of TRADD and recruits initiator pro-caspase, forming complex II (in red) which is cytoplasmic. Activation of initiator pro-caspase 8/10 in complex II results in apoptosis of the cell. Red box: DD; hatched red box: DED.\n", - "8392 \n", - " Lack of FADD expression confers survival/growth advantages on tumor cells. Absence of FADD protein confers multiple death receptor-mediated apoptosis resistance and allows tumor cells to co-express death receptors and ligands without committing cell death. (A) Lack of FADD contributes to immune escape and resistance to chemotherapy. FADD deficient tumor cells resist death receptor-mediated apoptosis induced by TIL and chemotherapeutic drugs. Anthracyclines increase Fas and FasL expression on tumor cells. Etoposide induces Fas receptor trimerization, leading to Fas-mediated cell death independently of FasL expression. Both drugs enhance TRAIL-R2-mediated apoptosis. (B) Lack of FADD contributes to tumor counter-attack. Lack of FADD expression allows many types of tumor cells to express innocuously functional FasL that can kill TIL. Secretion of TNF-α by AML cells can have cytotoxic effects on TIL. (C) Lack of FADD contributes to tumor growth. In the absence of FADD, Fas signaling leads to a proliferative signal instead of an apoptotic one. Concomitant death receptor and ligand expression, in the absence of FADD, allows autocrine (in red) and paracrine (in orange) proliferation of tumor cells. Activated TIL can contribute to paracrine (in purple) proliferation of FADD-deficient tumor cells.\n", - "8448 \n", - " Principle of the mRNA-tagging method. Step 1, FLAG-tagged poly(A)-binding protein (PABP) is expressed from a transgene using a cell-specific promoter. Step 2, PABP and poly(A)+ RNA are crosslinked in situ by formaldehyde. Step 3, poly(A)-RNA/FLAG-PABP complexes are purified by anti-FLAG affinity purification. Step 4, RNA-PABP crosslinks are reversed and RNA is isolated. Step 5, purified RNA is used for microarray analysis.\n", - "8449 \n", - " Quantification of tissue-specific transcripts in RNA prepared by mRNA tagging. The transcript indicated on the left of each row was amplified by RT-PCR using gene-specific primers. Poly(A)+RNA from wild-type (WT) animals was used as a template in lane 1. RNA prepared by mRNA tagging from che-2::PABP (JN501), acr-5::PABP (JN502) and myo-3::PABP (JN503) was used in lanes 2, 3 and 4, respectively.\n", - "8464 \n", - " FLP detection of InDels of various sizes in homozygotes and heterozygotes. In each panel the top two graphs show the homozygotes and the bottom graph the heterozygote. Gray shaded areas mark the defined expected allele lengths and red lines indicate the borders of a predefined window of expected allele lengths. (a-c) Detection of InDels in C. elegans that show increasing levels of adenosine (A) addition. (a) 3-bp InDel ZH1-01 with no A addition; (b) 12-bp InDel ZH2-01 with A addition; (c) 2-bp InDel ZH3-05a with A addition. (d) 1-bp InDel ZH3-23 in C. elegans with A addition. An unambiguous allele-call can be made, irrespectively of the level of A addition: both homozygous samples consist of two peaks at different positions, whereas the heterozygous animal exhibits three peaks. (e) The 1-bp InDel 3R160 in Drosophila runs over a 12-13 nucleotide poly(T) stretch and exhibits stutter bands. Even in this case, a clear allele-call can be made (three peaks in homozygous and four peaks in heterozygous animals). (f) The 6-bp InDel ZHX-22 in C. elegans occurs in a poly(C) stretch and the FLP graph displays stutter bands. As expected, the longer fragment exhibits a higher degree of stuttering.\n", - "8487 \n", - " Functional characterization of HTLV-1 mutated XRE sequence. (A) Schematic representation of the HTLV-1 XRE. On the left, the XRE corresponds to U3 and R sequences within the HTLV-1 long terminal repeat, and consists of four stem-loops. On the right, the predicted secondary structure of the stem-loopD (SLD) with the minimal Rex binding site and the mutations introduced within the putative hnRNP A1 binding site are indicated. (B) Schematic view of the reporter plasmid CMV/XRE. (C) Effect of mutations within the XRE sequence on the Rex trans-activation capacity. Jurkat cells were transfected with 1 μg of the indicated reporter plasmid in the presence or not of Rex expression plasmid (200 ng) and the constitutive internal control tk-renilla luciferase vector (10 ng). Data are expressed as normalized luciferase activity and the error bars represent the standard deviations from three independent experiments.\n", - "8489 \n", - " Effect of ectopic expression of a dominant negative mutant of hnRNP A1 in HTLV-1 producing C91PL cells. (A) Primer location on HTLV-1 mRNA; (B) Analysis of the nucleo-cytoplasmic distribution of viral gene expression in NLS-A1- and LXSP- transduced cells. Four days after transduction, mRNAs were extracted from the nuclear and cytoplasmic compartments of each cell type and levels of unspliced (gag/pol), singly spliced (env) and doubly spliced (tax/rex) mRNAs were reverse transcribed and quantified by real-time quantitative PCR (RQ-PCR), by using specific primers. Results are expressed as the amount of nuclear (grey bar) and cytoplasmic (black bar) indicated mRNA relative to β-actin. (C) Evaluation of the nuclear export rate (NER) of Rex-dependent (gag/pol plus env) mRNA and of Rex-independent (tax/rex) mRNA in NLS-A1- or LXSP- transduced C91PL cells. Numbers are the ratio between cytoplasmic (C) to total (T) RNA and nuclear (N) to total RNA.\n", - "8490 \n", - " RNAi-mediated reduction of hnRNP A1 expression in Jurkat cells. (A) hnRNP A1 mRNA levels in cells transduced with the indicated retroviruses were determined by RQ-PCR. Levels in knockdown cells are given as percent mRNA reduction relative to the level in control cells transduced with empty pRS virus. Standard deviations are from at least three determinations performed in duplicate. (B) Equal amounts of protein from either nontransduced (lane1) or transduced with the indicated virus (lanes 2 to 4) were analyzed by immunoblotting. Actin and ASF/SF2 were used as control. Note that hnRNP A1 was significantly depleted in cells transduced with siRNA+548, whereas ASF/SF2 was not affected.\n", - "8491 \n", - " Analysis of hnRNP A1 depletion in HTLV-1 producing C91PL cells. (A) Analysis of hnRNP A1 mRNA levels in cells transduced with the indicated retroviruses. Four days after transduction, cytoplasmic RNA were extracted, reverse transcribed with oligo-dT, and levels of hnRNP A1 mRNA were determined by RQ-PCR. (B) Expression of hnRNP A1, Rex and hnRNP C1/C2 was monitored by immunoblotting of total protein extract from C91PL cells transduced with the indicated virus. Equivalent protein loading was confirmed by immunoblotting with an anti-actin antibody. (C) Detection of hnRNP A1 and p19gag expression in C91PL cells transduced with the indicated virus. Dot plots showing both hnRNP A1 and HTLV-1 gag expressions in one representative experiment. The percentage of cells in each quadrant is indicated.\n", - "8492 \n", - " Effect of hnRNP A1 depletion on viral gene expression. (A) Quantification of total viral gene expression in siRNA-transduced C91PL cells by quantitative PCR. Nuclear and cytoplasmic mRNAs were extracted from siRNA (black bars)- or control PRS (white bars)- transduced C91PL cells. Equal amounts of mRNA were reverse transcribed with oligo-dT and subjected to RQ- PCR. Results are expressed as the relative levels of total viral mRNA to cellular β-actin. Error bars indicate standard deviations. (B) Analysis of the nucleo-cytoplasmic expression of viral genes. Four days after transduction, mRNAs were extracted and analyzed as in Fig. 3B. Results are expressed as the amount of nuclear (grey bar) and cytoplasmic (black bar) indicated mRNA relative to β-actin. (C) Evaluation of the nuclear export rate (NER) of Rex-dependent (gag/pol plus env) mRNA and of Rex-independent (tax/rex) mRNA in PRS- or siRNA- transduced C91 PL cells.\n", - "8525 \n", - " The genotype file (A), genome information file (B) and pedigree file (C) used by dChipLinkage for analysis.\n", - "8526 \n", - " (A) In the genotype view, the red, blue, yellow and white colors represent genotype call AA, BB, AB and No Call. (B) The inferred haplotypes indicating ancestor origins are displayed in correspondence to the genotype view. The different colors represent distinct founder chromosomes. For each individual (column), the father allele haplotype is displayed on the left and mother allele haplotype on the right. (C) In the ordered genotype view, the red and blue colors represent the A and B genotype of father allele (left) and mother allele (right) in each individual (column). The LOD score curve is displayed in the shaded box on the right. The left boundary and right boundary of the box represent value of -2 and 3, and the red vertical line represents 2.\n", - "8527 \n", - " (A) The peak LOD score region is enlarged and displayed proportionally to real chromosomal distance in the context of genes and cytobands. LOD score peaks are shown at the q-arm of chromosome 3 (114.18 -117.00 Mb, maximal LOD = 2.77). The shaded curve region has the same range as Figure 14. (B) A enlarged view of the peak region with more details of the individual SNPs and genes. The transcription starting site of the genes are used to display their positions.\n", - "8528 \n", - " The genotypes (A) and inferred haplotypes (B) from family 5026.10 on the peak score region of chromosome 3 are shown (for more details see the legend in Figure 14). In the peak LOD score region all the affected children (3, 4, 5 and 7) inherited the same ancestral allele in the consanguineous family and the unaffected child (6) inherited two different ancestral alleles.\n", - "8557 \n", - " Agonist-induced signaling and internalization of Rog. (A) Maximum calcium response plotted as a function of spiradoline dose for cells transfected with Rog or the wild-type KOR and treated with dynorphin or spiradoline. (B) Confocal micrographs show representative internalization of GFP-tagged Rog receptors 1 h after treatment with 10 μM or 100 μM spiradoline. Dynorphin at 100 μM (far right) caused little internalization in this assay. (C) ELISA for FLAG-tagged cell-surface receptors shows dose-dependent loss of receptors from cell surface one h after spiradoline treatment. After a 1 μM dose of spiradoline, internalization is evident within 15 minutes. Data are expressed as a percentage of receptors detected on surface of untreated cells expressing Rog. Error bars represent SEM for three replicates.\n", - "8558 \n", - " Agonist-induced internalization is reduced in Rog-A, but not Rog-μ. (A) Confocal micrographs showing localization of GFP-tagged Rog (left), Rog-A (center), or Rog-μ (right) stably expressed in HEK293 cells and treated with 10 μM spiradoline for 1 h before fixation. (B) A dose-response ELISA shows less internalization of Rog-A in response to 1 h of spiradoline at doses of 0.3–100 μM spiradoline. After treatment with 1 μM spiradoline, Rog-A showed less internalization up to 1 h after treatment. (C) A dose-response ELISA shows more internalization of Rog-μ in response to 1 h of low doses of spiradoline ranging from 0.01 to 0.1 μM. After treatment with 1 μM spiradoline, there was no difference in the time course of internalization between Rog and Rog-μ. ELISA data are expressed as a percentage of receptors detected on surface of untreated cells expressing the same receptor.\n", - "8559 \n", - " Antagonist treatment increases cell-surface expression of Rog-μA. (A) ELISA comparing cell-surface expression of receptors stably expressed in HEK293 cell lines, either untreated (white bars) or treated for 18 h with the antagonist norBNI (10 μM, dark bars). Error bars represent SEM for three replicates. NorBNI significantly increased cell-surface expression of both Rog-μ and Rog-μA. OD, optical density. (B) Confocal micrographs showing that the localization of GFP-tagged Rog-μA is primarily intracellular in untreated cells (left), but the receptor moves to the membrane after 18 hours of antagonist treatment (right). There is relatively little change in Rog after norBNI treatment relative to untreated cells.\n", - "8560 \n", - " Desensitization of cAMP inhibition and superactivation of AC after pretreatment with spiradoline (A) Spiradoline (1 nM pretreatment) inhibited forskolin-induced cAMP formation in HEK293 cells transiently expressing Rog, Rog-A, Rog-μ, and Rog-μA. Data are expressed as inhibition of forskolin-induced cAMP. The baseline (0) represents maximum forskolin-induced cAMP accumulation in control cells. Pretreatment with 1 nM spiradoline for 10 min causes a shift in the dose-response curve for later spiradoline treatment in Rog and Rog-μA cells, but not Rog-A. Spiradoline pretreatment lowered the maximal response of Rog-μ to subsequent spiradoline treatment. (B) HEK293 cells transiently expressing receptors were treated 18 h with 10 nM spiradoline, and assayed for cAMP accumulation in response to a 15-min treatment with 10 μM forskolin. Spiradoline pretreatment significantly increased forskolin-induced cAMP in cells expressing KOR, Rog and Rog-A. Pretreatment of cells expressing Rog-μ and Rog-μA had not effect on response to forskolin. Data are expressed relative to the amount of cAMP accumulated after 10 μM forskolin treatment in cells pretreated with vehicle. Bars represent mean ± SEM for six replicates per condition. (C) HEK293 cells transiently expressing receptors were treated 18 h with 10 nM spiradoline, and assayed for loss of cell-surface expression by ELISA. Long-term spiradoline treatment significantly reduces cell-surface expression of all receptors, but the degree of internalization does not differ among different receptors. Bars represent mean ± SEM for three replicates per condition.\n", - "8578 \n", - " Graphs obtained from OIS data in the anterior and posterior SII cortical regions evoked by flutter stimulus on the central pad of 2 subjects. Figurines indicate regions of interest. (A) Top Panels: Time course of absorbance values from the posterior SII region obtained with ipsilateral, contralateral, and bilateral stimulus. Note that in this case, the absorbance evoked by the bilateral stimulus is larger than the response evoked by either the ipsilateral or the contralateral stimulus. (B) Bottom Panels: Time course of absorbance values from the anterior SII region obtained from data sampled during ipsilateral, contralateral, and bilateral stimulation. Note that the response evoked by the bilateral stimulus is smaller than the response evoked by the contralateral stimulus. Maximal differentiation of the time course of the response to the different stimulus conditions appears to occur between 1 and 3 seconds.\n", - "8614 \n", - " Bar plots show comparison of RMSEs by using the global method (black bar), the lowess method (grey bar), and the adaptive method (white bar) for normalization with simulated data generated from a mixture model with c = 1.5, a = 118, a0 = 410, γ = 31, γ1 = 23, and γ2 = 29 at three different noise levels (A) SD = 0; (B) SD = 0.25; and (C) SD = 0.50.\n", - "8626 \n", - " Effect of ibpAB availability on the proteome composition after two hours of α-glucosidase production at 42°C. After growth at 37°C to OD600 of 0.5, cultures were induced with 1 mM IPTG, and transferred to 42°C. Two hours later, cells were harvested and the proteome was separated by two-dimensional gel-electrophoresis. Silver-stained two-dimensional gels of (A) wildtype strain with or (B) without ibpAB overexpression, and of (C) the ibp AB deletion strain. Reference spots used for normalisation of spot intensities after densitometry are indicated by circles. Positions of selected proteins (cf. text) are indicated.\n", - "8629 \n", - " Disaggregation and resolubilisation of inclusion bodies produced at 42°C Inclusion bodies of α-glucosidase were produced for two hours at 42°C, followed by addition of tetracycline and subsequent incubation at 30°C. Coomassie-stained SDS-PAGE gel of (A) the insoluble cell fractions and (B) the soluble cell fractions extracted from identical amounts of biomass; times relative to induction and ibpAB genotype are given above the lanes. Positions of α-glucosidase, IbpA/IbpB and membrane proteins are indicated. First lane contains molecular weight markers of 97.4, 66.2, 45, 31, 21.5 and 14.4 kDa, respectively.\n", - "8631 \n", - " Impact of production temperature on reactivation of α-glucosidase from inclusion bodies. Inclusion bodies of α-glucosidase were produced for two hours at 37°C (A) or 42°C (B) in ibpAB deletion mutant (white square), wildtype strain without (grey circle) or with ibpAB overproduction (black triangle). Specific activity of α-glucosidase was measured during incubation at 30°C after addition of tetracycline. Mean values and 95% confidence intervals from six (37°C) or four (42°C) independent experiments. Time is given in hours after induction.\n", - "8656 \n", - " Homeostatic systems. In absence of external influence, homeostatic systems (A) progress rapidly to stasis (0) while external perturbations (arrows, e.g. immune recognition of virus) cause pseudo-chaotic fluctuating long-term behaviours in complex systems (B).\n", - "8665 \n", - " Photomicrograph of SupT1 cells co-cultivated with TF 228.1.16 cells. Cell forming syncytia are aggregated (A). In the presence of dexamethasone (B) cells are mainly exploded vs. in the presence of IM28.\n", - "8668 \n", - " Effect of IM28 and dexamethasone on SupT1 cells co-cultured with TF228.1.16. Zoom of negative photomicrograph of SupT1 cultures co-cultivated with TF 228.1.16 cells (A) in the presence of dexamethasone (B) and IM28. Note the evident syncytia in (A) with an apparent slender shape of infected cells. Cells treated with dexamethasone were atrophic and sometimes exploded whereas cells incubated with IM28 were round. \n", - "8676 \n", - " Fructose-induced insulin resistance: evidence from euglycemic hyperinsulinemic clamp studies. Mean glucose levels (A) were slightly but significantly higher in fructose-fed vs. control animals during the last 30 mins of the clamp period (p < 0.01). Mean insulin levels (B) were slightly but not significantly higher in the fructose-fed vs. control hamsters during the clamp period. The glucose infusion rate (Ginf) (C) during the clamp period was significantly lower in fructose-fed vs. control animals (p < 0.01). The calculated insulin sensitivity index (SI – see methods) (D) was also significantly lower in the fructose-fed vs. control hamsters (p = 0.03). Fructose-fed (n = 9), control hamsters (n = 10). (adapted from Taghibiglou et al. [100]).\n", - "8712 \n", - " The five types of sub-alignment region around HSPs in which dynamic programming may be applied. The start of an HSP (A), handling small gaps by joining two adjacent ends of HSPs (B), handling large gaps by joining two distant HSPs via a span (C,D) and the end of an HSP (E). Other features, such as splice sites are incorporated into the alignment within the SARs.\n", - "8717 \n", - " Lead II monitor strip recorded shortly after admission (A) and at the chest pain onset (B).\n", - "8740 \n", - " Layout of the TP53 low density DNA microarray. (A): Names and alignment of stacking oligonucleotides and probes to their respective synthetic wild type target sequence. Bold letters correspond to the nucleotide change in DNA sequence due to the point mutations. (B): Layout of the probe array on the glass slide. The probes were applied to the slide in triplicate as depicted at the top. The numbers correspond to the probes in Table 1.\n", - "8741 \n", - " Electrophoretic analysis of PCR products and single-stranded target DNA produced by \"cycle sequencing.\" (A): Electrophoresis in 2% agarose gel from PCR reactions of regions from exons 7 and 8 of the TP53 gene: 100 bp ladder (Lane 1), 108 bp PCR product from exon 7 (lane 2), 92 bp PCR product from exon 8 (lane 3). (B): Electrophoresis in 4% agarose gel of two multiplex PCR reactions from exons 7 and 8 of the TP53 gene. Lanes 1 and 3 represent the products of two different samples; lane 2 is the 100 bp ladder.\n", - "8742 \n", - " Hybridization of synthetic targets. (A) Homozygous pattern. Hybridization pattern produced by synthetic target (ST) on probes (arrayed onto 14 slides). Synthetic targets were annealed with prelabeled stacking oligonucleotides and hybridized with the array of probes having sequence variations. (B) Heterozygous pattern. Hybridization patterns produced by heterozygous combination of synthetic targets (ST) on probes. Equivalent amounts of wild type and mutant synthetic targets were annealed with prelabeled 5'and 3'stacking oligonucleotides, then hybridized with the array of probes having sequence variations (see Table 1).\n", - "8743 \n", - " Hybridization of samples proposed in the multiplex format. (A). Sample with wild type genotype. Representative experiment of multiplex hybridization assay with sample P1. The red arrows indicates the wild type hybridization signals. The DNA obtained was individually annealed with the two pairs of stacking oligonucleotides and hybridized in one assay. Above Multiplex Assay with sample L7. The hybridized with their respective array of probes having sequence variations. The DNA obtained was annealed the two pairs of stacking oligonucleotides and hybridized in the multiplex format with. (B) The electropherogram showed the sequence wild type of the interest codon. The pink row pointed the signal of the probe in the microarray (point mutation).\n", - "8790 \n", - " Schematics of the SaV constructs, Wt, MEG-1076, and MQG-1076, containing the rVP1, rVP2, and poly(A) sequences. Each construct began at the predicted AUG start. The triangles show the positions of the nucleotide point mutations. The black triangle had an amino acid substitution in the VP1, whereas the open triangle in the VP2 gene did not change amino acid sequence. An RNA probe (anti-VP1) was used to monitor the transcription of rVP1 mRNA in which contained the native sequence, i.e., lacking the mutation at 1076.\n", - "8791 \n", - " Northern Blot analysis of Wt and MEG-1076 rVP1 mRNA. The total RNA was purified from the cells at 1, 2, 3, 4, 5, 6, 7, and 8 dpi. (A) The relative amounts of total RNA for each construct. (B) The steady-state levels of rVP1 mRNA with an anti-VP1 probe specific for the VP1 gene, corresponding to the VP1 nucleotide position 157 to 1283.\n", - "8792 \n", - " Western blot analysis of Wt and MEG-1076 rVP1. Confluent Tn5 cells were infected with Mc114 recombinant baculoviruses at MOI of 14.5 and incubated at 26°C. The culture medium, including the cells, were harvested 1, 2, 3, 4, 5, 6, 7, and 8 dpi as described in the materials and methods. (A) The cell culture medium was concentrated by ultracentrifugation, resuspended in 20 μl of Grace's medium, and 5 μl was mixed with loading dye and loaded into each well. (B) The cell lysate was separated from the culture medium, resuspended in 200 μl of Grace's medium, and 5 μl was mixed with loading dye and loaded into each well. \n", - "8819 \n", - " K13 activates HIV-1 LTR promoter. A. 293T cells were transfected with an empty vector or the indicated constructs (100 ng/well) along with an HIV-1 LTR/luciferase reporter construct (10 ng/well) and a pRSV/LacZ (β-galactosidase) reporter construct (75 ng/well), and the experiment was performed as described under \"Materials and Methods.\" The values shown are averages (Mean ± S.E.) of one representative experiment out of three in which each transfection was performed in duplicate. B. A dose-response analysis of HIV-1 LTR activation by K13 and pro-inflammatory cytokines. 293T cells were transfected with the indicated amounts of a K13 expression plasmid and luciferase assay performed 36 h post-transfection as described for (A). The total amount of transfected DNA was kept constant by adding an empty vector. For experiments involving TNF-α and IL-1β, cells were treated with the indicated concentration of cytokines 12 h after transfection of the reporter plasmids and assayed for reporter activity after 24 h of stimulation. C. K13 activates HIV-1 LTR in Cos-7 cells. The experiment was performed as described in 1A except LIPOFECTAMINE 2000 Reagent (Invitrogen, Carlsbad, CA) was used for transfection and Renilla luciferase was used for normalization. D. K13 activates HIV-1 LTR in Jurkat cells. The experiment was performed as described for 1C by using LIPOFECTAMINE 2000 Reagent (Invitrogen, Carlsbad, CA).\n", - "8855 \n", - " Vascularization of a coronary atherosclerotic plaque showing different aspects of neovascularization. By serial sections of postmortem injected plaques, giant advential capillary-like vessels (A) are connected with secondary branches proximal and distal to the plaque and with new arterioles (B) with a well developed tunica media (indication of functioning blood flow), within the thickened, atherosclerotic intima in turn joined through angiomatous plexuses (C) to the residual lumen (D) E) plastic casts of plaques with different aspects of vascularization.\n", - "8856 \n", - " Cineangiographic monitoring in a patient with non occlusive LAD stenosis (A) who developed an extensive infarct without angiographic occlusion. The subsequent imaging of occlusion began distally (B) and ascended to the origin (C) of the vessel (arrow) indicating that the angiographic \"pseudocclusion\" was due to stasis for increased peripheral resistance and not for primitive thrombosis, not shown morphologically (see text).\n", - "8857 \n", - " The coronary thrombus is a multivariant phenomenon (A), including medial neuritis. Its location in severe (≥70) stenosis associated with other factors (retrograde collateral flow, reduced fibrinolytic activity, etc, see text) justifies the concept that is a secondary phenomenon. Any time there is an increased peripheral resistance (B) (spasm, intramural extravascular compression following infarction, etc), stasis in related main vessel and in collaterals both outside and within the plaque is expected with hemorrhage, plaque rupture and trombosis (C). On the other hand, it is difficult to accept that acute occlusion of a pin-point lumen bypassed by preexisting functioning collaterals (D) may result in infarct necrosis or sudden death. Even experimentally occlusion of a severe \"chronic\" (7 days) stenosis does not produce any ischemic dysfunction.\n", - "8863 \n", - " Cell cycle responses of human diploid fibroblast (HDF) cells. (A) Response to DNA damage. HDF cells were exposed to 0, 10 or 20 J/m2 ultraviolet light and entry into S phase was assayed by BrdU incorporation. For each bar n ≥ 300 cells. (B) Recovery from nocodazole arrest. HDF cells were arrested in mitosis by double thymidine block followed by nocodazole (left) and released for 30 min. (center and right). DNA, blue; α-tubulin, green; γ-tubulin, red. (C) Example of binucleate cells created by cytochalasin-induced cytokinesis failure. DNA, blue. (D) Cell cycle progression of HDF cells in response to cytokinesis failure induced with 2 μM cytochalasin. Cells were assayed for BrdU incorporation at the indicated times after removal of cytochalasin. \"control\" cells were not treated with cytochalasin; \"cytochalasin (mononucleate)\" cells were treated, but completed cytokinesis, and \"cytochalasin (binucleate)\" cells were treated and failed to divide in cytokinesis. For each bar n ≥ 300 cells. (E) Cell cycle progression of HDF cells in response to cytokinesis failure induced with 12.5 μM blebbistatin. Cells were assayed for BrdU incorporation at the indicated times after removal of blebbistatin. \"control\" cells were not treated with blebbistatin; \"blebbistatin (mononucleate)\" cells were treated, but completed cytokinesis, and \"blebbistatin (binucleate)\" cells were treated and failed to divide in cytokinesis. For each bar n ≥ 300 cells. (F) Cell cycle progression in response to the presence of extra centrosomes. Image shows the product of fusion between a G1 cell and a G1 cytoplast. 24 h after fusion this cell has four centrosomes, indicating that it has undergone centrosome duplication, and has incorporated BrdU, indicating that it has entered S phase. DNA, blue; BrdU, green; pericentrin, red. Punctate blue staining is due to cell surface marker used to identify fusion products [12]. Scale bars represent 10 μm.\n", - "8864 \n", - " Cytokinesis inhibitors do not block the G1 to S phase progression of binucleate HDF cells. Serum-starved G0 cells were fused and released into medium containing BrdU and (A) no drug, (B) 25 μM blebbistatin, (C) 5 μM AKI-1, or (D) 5 μM cytochalasin. Some cells remain unfused after the fusion treatment, and were used as mononucleate controls. Time points were taken to assay for S phase entry.\n", - "8865 \n", - " Cytokinesis failure does not significantly delay the exit frommitosis. (A) Images from time-lapse series of HDF cells at the indicated times after release from nocodazole-mediated mitotic arrest. \"Control\" cells were not treated with blebbistatin; \"Blebbistatin\" cells were treated with blebbistatin beginning at 30 min after release from nocodazole. (B) MPM-2 immunofluorescence as a marker for mitotic exit. Fluorescence image of a mitotic cell with condensed DNA and intense MPM-2 staining (top) and a cytokinetic cell with decondensed DNA and diminished MPM-2 staining (bottom). DNA, blue; MPM-2, green. Scale bar represents 10 μm. (C) Mitotic index of control and blebbistatin-treated cells after mitotic release. \"Control\" cells were not treated with blebbistatin; \"Blebbistatin\" cells were treated with blebbistatin beginning at 30 min after release from nocodazole. Mitotic index was determined by MPM-2 staining and DNA morphology, as in (B). For each point n = 100 cells.\n", - "8866 \n", - " Cells arrested in G1 by cytokinesis failure enter p53- and p21-dependent premature senescence. (A) p53 pathway dependence of the G1 arrest following cytokinesis failure. Wt, p53-/- and p21-/- mouse embryo fibroblasts were synchronized and treated with blebbistatin and assayed as in Figure 1E. For each bar n ≥ 200 cells. (B) G1 arrested binucleate cells entered premature senescence as assayed by senescence-associated β-galactosidase activity (SA-β-gal). The dark stain in the binucleate cell shown is the reaction product of Xgal cleavage. Scale bar represents 10 μm. (C) Time course of appearance of senescent cells. Mononucleate and binucleate cells were assayed for SA-β-gal at the indicated days after blebbistatin removal. For each point n = 60–100 cells.\n", - "8867 \n", - " Binucleate cells contain nuclear γ-H2AX foci. (A) Binucleate cells were prepared by synchronization and treatment with 25 μM blebbistatin as described above, then stained for the DNA damage marker γ-H2AX. Untreated control cells (top) did not contain any visible γ-H2AX foci, whereas binucleate cells, after released from blebbistatin for 1 h, (bottom) contained γ-H2AX foci that were similar to those of cells treated with H2O2 (middle). Scale bar represents 2.5 μm. (B) Culture was continued for 8 days after release from blebbistatin. Most mononucleate cells lacked γ-H2AX foci (top), whereas approximately 30% of binucleate cells still contained nuclear γ-H2AX foci (bottom). The binucleate cells were also flattened and enlarged, consistent with a senescent-like arrest. Scale bar represents 10 μm.\n", - "8868 \n", - " The combination of double thymidine block and nocodazole treatment causes DNA damage in HDF cells (A) Asynchronous HDF cells were treated with either double thymidine, nocodazole, or blebbistatin individually, then released into BrdU-containing growth media and assayed for S phase entry. For each bar n ≥ 200 cells. (B) Cells were subjected to the treatments in the order double thymidine, nocodazole, blebbistatin. Samples of cells were taken after release from each drug, and S phase entry was assayed. For each bar n ≥ 200 cells. (C) Cells were treated with double thymidine block followed by nocodazole, then stained for γ-H2AX. Scale bar represents 2.5 μm.\n", - "8874 \n", - " A network of genetic interactions with BNI4, CHS1, CHS3, CHS4, CHS5, CHS6 and CHS7. (A) Global view of the network. Synthetic interactions with any query gene (diamonds) are depicted as edges joining these to nodes (circles). Nodes whose deletion mutant have a decreased, wild type and increased chitin content are colored in green, gray and red, respectively. For the decreased (green) and increased (red) chitin contents, color intensity is proportional to the magnitude of the change. (B) Venn diagram of the CHS1 interaction set with the CSIII network. The number of genes interacting with CHS1 or with any of the CSIII query genes is indicated. The numbers in parentheses indicate the number of interactions for multiply connected genes. Genes showing 2 or more interactions are grouped in green or red ovals, respectively.\n", - "8875 \n", - " Analysis of the CSIII network. (A) Grouping genes of the CSIII network in functional categories. Genes belonging to the \"core\" group (CHS3 plus at least one other) are underlined. The proportions of the functional categories in the CSIII network and in the \"core\" group are represented in the outer and the inner pies, respectively. (B) Interactions among the \"core\" group. Color coding for nodes is as in (A).\n", - "8876 \n", - " Grouping deletion mutants with an altered chitin content according to their interaction pattern. (A) Chitin levels, expressed in nmole GlcNAc/mg dry weight, in wild type, group 1 and query mutants. (B) Chitin levels in wild type and group 2 mutants. Note the different scales in (A) and (B). Hypersensitivity, resistance, wild type and not determined sensitivity to Calcofluor are indicated by black, open, gray and hatched bars, respectively.\n", - "8877 \n", - " Grouping deletion mutants with wild type chitin content according to their interaction pattern. (A) and (B) group 3 and 4 mutants, respectively. Hypersensitivity, resistance, wild type and not determined sensitivity to Calcofluor are indicated by bold, open, gray and underlined characters, respectively.\n", - "8915 \n", - " The effects of PGE2 on the input resistance of a VMPO temperature insensitive neuron (A) and a VMPO warm sensitive neuron (B). For each, changes in membrane potential are plotted in response to a series of hyperpolarizing current pulses (-10 to -100 pA, 200 ms), during baseline conditions (●), perfusion with PGE2 (▲), and after PGE2 has been washed out of the chamber (■). For the temperature insensitive neuron in A (m = 0.05), input resistance decreased from a baseline of 406.33 MΩ, to 332.40 MΩ during perfusion with PGE2. After PGE2 had been washed out of the chamber, input resistance increased to 372.32 MΩ. For the warm sensitive neuron in B (m = 1.30), input resistance decreased from a baseline of 388.00 MΩ, to 244.86 MΩ during perfusion with PGE2. After PGE2 had been washed out of the chamber, input resistance increased to 327.63 MΩ.\n", - "8918 \n", - " Averaged pre- and post-spike activity of a temperature insensitive VMPO neuron (A) and warm sensitive VMPO neuron (B). For each, averages of 10 action potentials (truncated) during baseline conditions and during perfusion with PGE2 (1 μM), are superimposed on the spike threshold (post-pike activity during PGE2 is indicated by an asterisk). These averages do not include pre-spike activity that contained putative postsynaptic potentials. For the temperature insensitive neuron in A, the rate of rise of the depolarizing prepotential increased from 0.17 mV·mSec-1 to 0.27 mV·mSec-1. For the warm sensitive neurons in B, the rate of rise of the depolarizing prepotential decreased from 0.38 mV·mSec-1 to 0.18 mV·mSec-1.\n", - "8950 \n", - " Antigen spreading and MHC class I loss variant in patient#12. Flow cytometry analyses on serial blood specimen (A) or tumor invaded lymph nodes (B) gating on CD8+ T lymphocytes stained using A2/Mart1 or A2/gag specific fluorescent tetramers. Ex vivo microcultures stimulated with Mart1 peptides and examined according to similar settings. (C) Flow cytometry analyses of two CUR tumor cell lines (pt#12) after the first exosome therapy (continuation treatment) in clinical response and after the second exosome course (second leukapheresis) at relapse for MHC class I (anti-HLA-A2 mAb, anti-HLA-BC mAb and W6.32 Ab) expression. A positive control was included which consisted of a allogeneic HLA-A*0201melanoma line FON.\n", - "8952 \n", - " p53 Immunostaining in CNS embryonal tumors. Most p53 immunopositivity was relatively faint and present only in a small fraction of the tumor. This nodular medulloblastoma had weak staining in less than 25% of cells (A). Some anaplastic medulloblastomas had strong p53 immunostaining in a larger fraction of cells (B). Most AT/RT and supratentorial PNET contained p53 immunopositive cells, like this lesion metastatic within the CNS in which almost all cells are strongly positive (C). Note the lack pf staining in non-neoplastic stroma (Asterisk).\n", - "8954 \n", - " JC virus sequences are not detected in embryonal brain tumors. JC virus plasmid DNA is detectable over a wide range of dilutions when added to genomic DNA (A), but was not identified in DNA extracted from a range of embryonal brain tumors (B). In contrast, the ERV-3 endogenous retrovirus is easily detected both using standard dilution curves (C) and in tumor DNA (D).\n", - "8974 \n", - " p27 expression was detected by the pThr187 Ab p27 only in the proliferative compartments of normal tissues. In tonsil (A) both parabasal squamous cells and lymphoid germinal cells were stained. In intestinal epitehlium only the nuclei of deep crypt cells were stained (B). Within the germinal centres, the outer rim of centroblasts and mitotic cells were strongly positive for pThr187-p27, whereas centrocytes were less labelled (C). Trophoblastic villi of placenta show pThr187-p27 intense staining only in the cytotrophoblastic layer and not in the syncytiotrophoblastic layer (D).\n", - "8975 \n", - " The relationship between phospho-p27 expression and proliferation was evident both in low- (A) and high- (B) grade SIL, with its expression correlating well with the extent of the dysplastic cell population. Intense staining for phospho-p27 was also observed in the neoplastic cells of colonic (C) and lung (D) adenocarcinoma, in cervical squamous invasive carcinoma (E) and in choriocarcinoma (F)\n", - "8976 \n", - " Western blot analysis of MDA MB 468 (breast cancer) and NPA (thyroid papillary cancer) cell lines revealed a single anti-pThr187-p27 band, corresponding to that shown by the regular p27 antibodies. (A). pThr187 staining of parabasal squamous cells (B) abolished by absorption of the antibody with the immunizing peptide.\n", - "8977 \n", - " Coexpression of the forms of p27 in lymphoid germinal center (A) and in glioblastomas (B). Simulataneous detection of p27 by both regular (green) and pThr187 (red) antibodies. Signal generated by the two antibodies Yellow areas (arrows) showed the colocalitation of the signal generated by both antibodies.\n", - "8979 \n", - " Nonsynonymous and synonymous rates of change in three genes. Nonphotosynthetic taxa are named in bold. (A) rps2 nonsynonymous branch lengths. (B) matK nonsynonymous branch lengths. (C) rbcL nonsynonymous branch lengths. (D) rps2 synonymous branch lengths. (E) matK synonymous branch lengths. (F) rbcL synonymous branch lengths. Taxa with rbcL pseudogenes are identified with Ψ. Uncertain pseudogene status is indicated by \"Ψ?\" [20, 26].\n", - "8980 \n", - " Correlations across each possible pair of genes for synonymous and nonsynonymous rates. (A) rps2 versus matK. (B) rps2 versus rbcL. (C) matK versus rbcL. All nonsynonymous comparisons involving rbcL pseudogenes are indicated with a hollow triangle.\n", - "8981 \n", - " Correlation plots of synonymous and nonsynonymous rates within each gene. (A) rps2 rates. (B) matK rates. (C) rbcL rates. In 4C, the Epifagus pseudogene has been excluded and the other pseudogenes are indicated with a hollow triangle.\n", - "8994 \n", - " Quantitative binding of mAb to hCD200R-CD4d3+4. (A). Scheme illustrating a reverse phase microarray in which purified CD200R proteins were immobilized and then screened with fluorescent mAb specific for hCD200R or for the antigenic rCD4 tag (OX68) of the hybrid recombinant protein.(B). Typical microarray shows binding of OX68 mAb (red) to control proteins or the overlapping binding of hCD200R mAb and OX68 (yellow) to immobilized human CD200R.(C). Shows the green fluorescence intensity of each spot for all four replicates (mean ± SEM).(D). Shows red fluorescence intensity due to binding of OX68 mAb using data in left panel for DX147 (similar levels were found with the other mAb). Serial two-fold dilutions of purified, soluble, recombinant human and mouse CD200R-CD4d3+4 proteins, and of control rat CD4d3+4 were arrayed onto epoxy-coated microscope slides. Each protein dilution series was arrayed in 3 rows of 4 spots, ranging in concentration from 40 μg ml-1 (first spot) to 0.08 μg ml-1 (spot 10), with control spotting buffer containing 0.5 mg ml-1 BSA in the last two spots. All arrays were performed in quadruplicate and a representative set is shown in (B). Each slide was incubated for 16 h at 4°C with a mixture of hCD200R mAb (DX147, DX136 or OX108) labelled with Alexa-555 (indicated as green fluorescence measured at 532 nm) and rCD4 mAb (OX68, detecting the antigenic tag and allowing for measurement of recombinant protein concentration) labelled with Alexa-647 (red fluorescence measured at 635 nm). At the highest concentrations, the hCD200R spots appear either white (saturating conditions) or yellow, due to the combination of green and red signals given by the specific binding of the Alexa-555-mAb to hCD200R and Alexa-647-OX68 mAb respectively. Quantitative measurements are expressed as mean fluorescence units at 532 nm (green) and 647 nm (red) versus amount of protein arrayed.\n", - "8995 \n", - " Analysis of mAb reactivity with hCD200R by orientation via antibody immobilization. (A). Scheme of one forward phase microarray in which purified human CD200R protein was immobilized via OX68 mAb and detected with the DX136 hCD200R mAb (green fluorescence).(B). Typical microarray shows binding of the hCD200R mAb (green) and OX68 mAb (red) to hCD200R immobilized via four different capture mAb.(C). Shows the mean fluorescence intensity ± SEM for each spot of all replicates. Serial two-fold dilutions of capture human CD200R mAb OX108, DX136 and DX147 and control rat CD4 mAb OX68 were arrayed onto epoxy-coated microscope slides. Each mAb dilution series was arrayed in quadruplicate of 2 rows of 6 spots, ranging in concentration from 80 μg ml-1 (first spot) to 0.16 μg ml-1 (spot 10), with control spotting buffer containing 0.5 mg ml-1 BSA in the last two spots. The whole array was repeated on the slide for a total of 8 replicates per spot. Each slide was incubated for 2 h with 20 μg ml-1 of purified recombinant hCD200R-CD4d3+4 protein, prior to incubation with Alexa-555-labeled CD200R mAb (DX147, DX136 or OX108) or Alexa-647 control rCD4 mAb (OX68). Quantitative measurements are expressed as mean fluorescence units at 532 nm (green) and 635 nm (red) versus amount of capture mAb arrayed.\n", - "8997 \n", - " Mapping of DX136 and OX108 epitopes on the N-terminal domain of human CD200R. (A). The mutants giving complete or nearly complete inhibition of CD200 binding, determined by BIAcore analysis, are indicated with red circles (<35% binding compared to non-mutated WT hCD200R protein), whereas those giving partial effects (35–70% binding) are depicted in orange. Data from [33].(B). The mutants giving severe inhibition (<35% compared to WT) of OX108 and DX136 mAb binding, as determined by microarray analysis, are depicted in blue and yellow respectively. Dark green circles represent mutants that severely impaired both OX108 and DX136 mAb binding. Mutants partially affecting DX136 binding (35–50%) are shown in pale yellow. Mutants that severely affect DX136 binding (35% binding or less) but have only a partial effect on OX108 binding (50%) are represented in pale green. Open circles depict mutants that did not affect the binding of CD200, OX108 or DX136 mAb. The CD200R model is based on a typical Ig V domain from the human junctional adhesion molecule-1 (JAM1) [34]. The beta sheets are labelled with the GFC face orientated in front and the BED face behind.\n", - "8998 \n", - " Binding of multimeric CD200 ligands to CD200R proteins. (A). Diagram of the reverse phase array depicting immobilized CD200R interacting with the multivalent bead ligand.(B). A representative microarray set showing binding of hCD200 beads to CD200R-CD4d3+4 proteins, but not control rat CD4.(C). Mean fluorescence intensity ± SEM of all four sets is shown versus receptor protein concentration arrayed. Serial two-fold dilutions of purified, soluble, recombinant human, mouse and rat CD200R-CD4d3+4 proteins, and of control rat CD4 were arrayed onto epoxy-coated microscope slides. Each receptor protein dilution series was arrayed in 3 rows of 4 spots, ranging in concentration from 40 μg ml-1 (first spot) to 0.08 μg ml-1 (spot 10), with control spotting buffer containing 0.5 mg ml-1 BSA in the last two spots. Only the first 8 dilutions (2 rows) are shown in (B) and analyzed in (C). All arrays were performed in quadruplicate. All receptors were arrayed on the same slide, which was incubated for 16 h at 4°C with polyvalent human CD200-CD4d3+4 FITC-fluorescent beads. At the highest concentrations, the hCD200R spots appear white (saturating conditions). Quantitative measurements are expressed as fluorescence units at 532 nm (green) versus amount of protein arrayed.\n", - "9009 \n", - " Two situations where f is affected by deviations from the model. (A) The effect of a change in Ne on the value of f. This change in Ne occurs in the most recent common ancestor of the four simulated sequences. Population ratio refers to its Ne after versus before this change. (B) The effect of an increased C to T substitution rate. Categories A, B, and C are defined in Table 1.\n", - "9046 \n", - " IFN-α, IFN-β and/or IFN-γ inhibit HCMV plaque formation on HFFs. HFFs were pre-treated with (A) vehicle or 100 IU/ml each of (B) IFN-α, (C) IFN-β, (D) IFN-γ, (E) IFN-α and IFN-γ or (F) IFN-β and IFN-γ. Monolayers were subsequently infected with 1000 PFU of HCMV strain Towne-GFP, and plaque numbers were determined 11 d p.i. by fluorescence microscopy. Plaques were determined by counting a minimum of 10 GFP-positive cells in one foci.\n", - "9047 \n", - " Type I IFNs (IFN-α and IFN-β) and type II IFN (IFN-γ) synergistically inhibit HCMV plaque formation on HFFs. (A) Viral plaque reduction assay. HFFs were treated with vehicle or increasing amounts of IFN-α (■), IFN-β (●), IFN-γ (▲), IFN-α and IFN-γ (□) or IFN-β and IFN-γ (○) prior to infection with 400 PFU of Towne-GFP (n = 3). Fold-inhibition in IFN-treated groups as compared to vehicle-treated groups is plotted as a function of IFN concentration (IU/ml). Significant differences in fold-inhibition for HFFs treated with combination IFNs relative to cells treated with individual IFNs are denoted by a single asterisk (P < 0.001, one-way ANOVA and Tukey's post hoc t test). (B) Illustration of a representative isobologram for a combination of two drugs. The solid line is the line of additivity. When the isobole lies below the line of additivity, the combinatorial effect of drug A and drug B is synergistic. When the isobole lies above the line of additivity, the combinatorial effect of drug A and drug B is antagonistic. Combination effect of (C) IFN-α and IFN-γ and (D) IFN-β and IFN-γ on HCMV plaque formation on HFFs was plotted in an isobologram. Values used to generate the concave isoboles were derived from a dose response curve and represent a combination dose required to elicit 95% (IC95) inhibition of viral plaque formation on HFFs. The dashed line represents the theoretical line of additivity.\n", - "9049 \n", - " Inhibition of HCMV by IFN-α, IFN-β and/or IFN-γ is not a result of decreased viral entry into cells. Ethidium bromide-stained IE exon 4 PCR products amplified from HCMV-infected HFFs pre-treated with either vehicle (A) or 100 IU/ml of IFN-α (B), IFN-β (C), IFN-γ (D), IFN-α and IFN-γ (E) or IFN-β and IFN-γ (F). From left to right, PCR products were amplified from H2O control, 100 ng of uninfected (UI) HFF DNA or 100 ng of HCMV-infected HFF DNA harvested from cells inoculated for 2 h at MOIs of 0.3 to 30. GAPDH PCR products were run along side IE exon 4 PCR products and served as internal loading controls (data not shown).\n", - "9051 \n", - " IFN-α, IFN-β and/or IFN-γ inhibit HCMV IE protein expression. (A) HFFs were pre-treated with either vehicle (1) or 100 IU/ml of IFN-α (2), IFN-β (3), IFN-γ (4), IFN-α and IFN-γ (5) or IFN-β and IFN-γ (6) 12 h prior to infection with HCMV. At 12 h p.i., cells were harvested and equal amounts of total protein were examined for IE protein (IE72, IE86) expression by western blot analyses. (B-G) Vehicle- or IFN-treated cells were infected with HCMV and the nuclear proteins IE72/86 were detected by indirect immunofluorescence 5 d p.i. Representative images (100X) from cultures treated with (B) vehicle, (C) IFN-α, (D) IFN-β, (E) IFN-γ, (F) IFN-α and IFN-γ or (G) IFN-β and IFN-γ. Immunofluorescent labeling: HCMV IE72/86 – Alexa Fluor 568 (red), nucleus – DAPI (blue), overlaid (pink).\n", - "9071 \n", - " Abdominal VFF WT and MCDM Post-pre response frequency was calculated by subtracting the average pre-surgical response frequency from the average post-surgical response frequency for WT mice (A) and MCDM (B). P-values are for the comparison of the post-pre response frequency for TNBS infusion versus post-pre response frequency for saline infusion.\n", - "9072 \n", - " Left Hindpaw VFF WT and MCDM Post-pre response frequency was calculated by subtracting the average pre-surgical response frequency from the average post-surgical response frequency for WT mice (A) and MCDM (B). P-values are for the comparison of the post-pre response frequency for TNBS infusion versus post-pre response frequency for saline infusion.\n", - "9087 \n", - " TRPV1-immunoreactive nerve fibres in breast skin. (A) Normal, control skin : TRPV1-immunoreactive nerve fibres (small arrows) in the sub-epidermis. (B) Painful skin (macromastia patient): intra-epidermal, TRPV1-immunoreactive nerve fibre (arrow) deriving from a large, sub-epidermal fascicle and extending to the stratum corneum. (Ci) Painful skin (breast reconstruction patient): TRPV1-immunoreactive intra-epidermal fibres passing along the junction between the epidermis and stratum corneum (Cii-enlarged area from Ci). (Di) Painful skin (macromastia patient): multiple branching, TRPV1-immunoreactive intra-epidermal nerve fibres (arrows) extending to the stratum corneum (Dii-enlarged area from Di). Large double arrows indicate relative epidermal thickness. Scale bars: A, B, C(i), D(i) = 50 μm; C(ii), D(ii) = 10 μm.\n", - "9088 \n", - " Quantification of TRPV1-immunoreactive, intra-epidermal fibres and breast pain. Scattergrams show TRPV1-immunoreactivity in (A) intra-epidermal fibres and (B) intra-epidermal fibre \"clusters\" in patients with and without breast pain.\n", - "9118 \n", - " Recordings of Ca2+-fluxes in iplA- and wild type amoebae. [Ca2+]e was measured in cell suspensions with a Ca2+-sensitive electrode. (A) Treatment of amoebae with 5 mM EGTA for 30 min activated capacitative Ca2+-influx (one out of 12/6 determinations in 4/3 independent experiments is shown for iplA- and wild type, respectively). (B) Capacitative influx was blocked by the addition of 1 mM NaN3 (one out of 5/4 determinations in 3/3 independent experiments). Measurements were done at t3.\n", - "9119 \n", - " Agonist-activated Ca2+-fluxes in suspensions of iplA- and wild type amoebae. cAMP elicited reversible Ca2+-influx in the mutant (A) and in wild type ((B) and see [14]); measurements were done at t7–t7.5. Note the different doses of CaCl2 added for calibration. The time points of cAMP-addition (1 μM) and of AA-addition (6 μM) in the wild type are indicated by arrows.\n", - "9120 \n", - " Fatty acids activate Ca2+-fluxes in iplA- amoebae. (A) 60 μM AA evoked a transient decrease in [Ca2+]e representing Ca2+-influx; measurement was done at t6 (B) After preincubating amoebae with the SERCA-type Ca2+-ATPase blocker BHQ (100 μM) for 20 min to inhibit uptake of Ca2+ into internal storage compartments, the AA-activated response was absent; measurement was done at t7.5. Results of measurements with wild type (C, D) stimulated with 6 μM AA are shown for comparison.\n", - "9121 \n", - " cAMP and arachidonic acid elicit Ca2+-release from internal stores. (A) [Ca2+]e was recorded at t7 in iplA- cells with permeabilized plasma membranes. Amoebae were challenged with 1 μM cAMP and 3 μM AA, respectively. (B) The response of permeabilized wild type stimulated with 1 μM cAMP at t6 is shown for comparison.\n", - "9123 \n", - " [Ca2+]i-recordings in cells preincubated with CaCl2 in order to load stores. (A) The response of wild type upon stimulation with 1 μM cAMP (arrow) at standard conditions, i.e. after preincubation with 1 mM CaCl2 for 10–15 min and stimulated in the presence of 1 mM CaCl2 is shown. Values give mean ± s.e.m. of 7 cells. (B) When iplA- cells were stimulated with 1 μM cAMP at standard conditions (as outlined in (A)), no response was observed. Mean ± s.e.m. of 6 cells is shown. (C) Wild type was preincubated with 1 mM CaCl2 for 4–5 h; after washing cells were incubated in H5-buffer supplemented with 1 μM CaCl2 and challenged with 1 μM cAMP (arrow). Values give mean ± s.e.m. of 16 cells. (D) iplA- incubated for 3 h with 20 mM CaCl2 were washed and subsequently [Ca2+]i-imaging was done in buffer containing 1 mM CaCl2. Arrow indicates the time point when 1 μM cAMP was added. Mean ± s.e.m. of 10 cells is shown.\n", - "9131 \n", - " Plants infected with PVX.GFP or PVX.19K at 21 dpi. (A) N. benthamiana plants infected with PVX.GFP (left) and PVX.19K (right). (B, D) PVX.19K-infected N. benthamiana and N. clevelandii plants, respectively, at 21 dpi show systemic necrosis. (C) PVX.GFP-infected N. clevelandii plants. (E, F) C. quinoa and C. amaranticolor leaves infected with PVX.19K (left both panels) and PVX.GFP (right in both panels).\n", - "9132 \n", - " Immunoblot and northern analyses of the PVX infected N. benthamiana plants. (A) Immunoblot analysis conducted using PVX CP antiserum show similar levels of PVX.GFP virus (lanes 1–4) and PVX.19K virus (lanes 5–8). Lane 9 contains extract of non inoculated plants. (B) Northern analysis of RNA isolated from a healthy plant (lane 1), upper noninoculated leaves of PVX.GFP infected plants (lanes 2 – 4) and upper noninoculated leaves of PVX.19K infected plants (lanes 5 – 8). Blots were probed with a GFP sequence probe. The bottom image is the ethidium bromide stained gel showing ribosomal RNAs. Abbrev.: g, genomic RNA.\n", - "9133 \n", - " Evidence for RNA silencing suppression by the SBWMV 19K CRP. (A) nontransgenic N. benthamiana under a UV lamp exhibits red fluorescence due to chlorophyll. (B) GFP-transgenic N. benthamiana (line 16C) exhibits green fluorescence under a UV lamp. (C) GFP was systemically silenced in the 16C transgenic N. benthamiana following infiltration with Agrobacterium. Here in the upper most leaves GFP silencing is vein centric. Systemic GFP silencing is detected initially within 2 weeks. (D) Within 3 weeks, GFP expression is completely silenced in the upper leaves. (E) GFP silenced plant inoculated with PVX.GUS. Emerging tissues of the infected plant remain silenced. (F, G, and H) GFP expression was observed in the emerging tissues of plants that were inoculated with PVX.19K. (I) Northern analyses of total RNAs from nontransgenic tissues (lanes 1, 2) and GFP transgenic tissues (lanes 4 – 7) probed with a labeled GFP sequence probe. Lane 3 is blank. Lanes under the northern blot show ribosomal RNAs on an ethidium bromide stained gel. (J) Northern analysis of total RNAs from 16C plants infiltrated with Agrobacterium containing GFP constructs and probed with a labeled GFP sequence probe. Lanes 1–4 are RNA samples taken from plants that were also inoculated with PVX.19K. Lanes 5–8 are RNA samples taken from plants inoculated with PVX.GUS. Lanes under the northern blot show ribosomal RNAs.\n", - "9173 \n", - " Chronic ethanol exposure increases microtubule content in PC12 cells. Chronic ethanol exposure (100 mM for 96 hours) significantly decreases free tubulin content (A) and significantly increases microtubule-associated tubulin content (B) in PC12 cells. The graphs in A and B represent the combined results of five independent replications (n = 10) of the same experiment (Three of these experiments are from wild type PC12 cells; two are from control vector transfected PC12 cells. We found no significant differences between these two cells types). Data are the mean +/- SEM. Asterisks represent significant differences from corresponding control (p < 0.001). Figure C is a representative Western Blot from one replication.\n", - "9174 \n", - " Chronic ethanol exposure in PKC dominant-negative PC12 cells. Ethanol (100 mM for 96 hours) has no effect on microtubule or tubulin content in dominant-negative delta PC12 cells (A). Ethanol significantly increased microtubule content and decreased tubulin content in dominant-negative epsilon cells (B). The graphs represent the combined data from three independent replications of the same experiment (n = 6). Data are presented as the mean +/- SEM. Asterisks represent significant differences from corresponding control (p < 0.005).\n", - "9180 \n", - " CK and AdK activities in pathological and normal liver tissue. Specific CK (A) and AdK activities (B) in total homogenate fractions were determined as described under \"Methods\". The liver samples were classified into five groups: group 1 – cirrhotic liver tissue (nos. 5, 7, 11, 13, 17–19, 23, 24); group 2 – neoplastic tissues (nos. 4, 9, 14, 15, 20, 21; 2 primary hepatocellular carcinomas [nos. 4 and 9]; 3 cholangiocellular carcinomas [nos. 14, 20 and 21]; 1 liver metastasis of a malignant melanoma [no. 15]); group 3 – samples of necrotizing liver tissue due to acute or subacute organ rejection (nos. 2, 6, 22); group 4 – samples of macroscopically normal liver parenchymal tissue (nos. 3, 8, 10, 16, 25) surrounding focal liver pathologies (2 primary HCCs [nos. 4 and 9]; metastasis of malignant melanoma [no. 15]; vena hepatica occlusion [no. 24]); group 5 – samples originating from a normal rat liver (no. 12) and from a patient with steatosis hepatis (no. 1). No AdK activity measurements are available for liver sample no. 1.\n", - "9181 \n", - " CK isoenzymes in HCC. Subcellular fractions of HCC liver samples no. 4 (A, B) and 9 (C, D) were analysed by cellulose polyacetate electrophoresis as described under \"Methods\". H = total homogenate; C = cytosolic fraction; M = mitochondrial fraction; Ct = control containing BB-CK and Mi-CK; Mi-CKd = dimeric Mi-CK; Mi-CKo = octameric Mi-CK; O = place of sample application. The cellulose polyacetate strips were exposed to an overlay gel containing PCr (A, C = CK activity staining), or lacking PCr (B, D = corresponding negative controls). Whereas Mi-CKd and Mi-CKo were well separated in (A), they were less so in (C).\n", - "9182 \n", - " Graphs of pulmonary metastases of rats. (A) Lung weight of control and JTE-522 treated rats injected with RCN-9 (group 1, 10.70 ± 0.57 g; group 2, 9.14 ± 0.62 g; group 3, 5.61 ± 0.76 g; group 4, 3.52 ± 0.81 g). JTE-522 significantly and dose-dependently decreased the lung weight of each group (p = 0.0001). (B) Maximal diameter of metastatic tumors in control and JTE-522 treated rats injected with RCN-9 (group 1, 5067 ± 499 μm; group 2, 4233 ± 244 μm; group 3, 2583 ± 211 μm; group 4; 1990 ± 96 μm). JTE-522 significantly and dose-dependently decreased size of metastases (p = 0.0002). (C) The number of metastatic tumors in control and JTE-522 treated rats injected with RCN-9 (group 1, 203 ± 26; group 2, 197 ± 26; group 3, 204 ± 18; group 4, 165 ± 33). Microscopy shows no significant differences in the number of metastases (p = 0.13)\n", - "9183 \n", - " Removed lungs and the largest cross sections. (A) Representative lungs of rats injected with RCN-9. Removed lungs on the left were those of group 4 (JTE-522: 30 mg/kg/day); and those on the right were group 1 (control). Surface of the lungs of group 1 has more metastatic tumors than that of group 4. (B) The largest cross-sections of group 1 (control) and group 4 (JTE-522: 30 mg/kg/day), which were stained with hematoxylin and eosin. The upper slide shows the largest cross-section of group 1, and the lower one shows that of group 4. Many metastatic tumors are not visible on the surface.\n", - "9204 \n", - " Activation of RARE and p53 gene by E/P and retinoids in 76N TERT cells. Cells were transiently transfected with the RARE (A) or p53 (B) reporter plasmid, and then treated with retinoids for 24 hours with or without E/P. Luciferase activity was measured and normalized as described under \"Materials and Methods\". Results are the means ± SE from 3 experiments. *, significant differences from control.\n", - "9226 \n", - " Transmission electron micrographs of Fe3O4 magnetic nanoparticles I (A), Fe3O4 magnetic nanoparticles II (B), GOX-Fe3O4 I (C), and GOX-Fe3O4 II (D).\n", - "9227 \n", - " Distribution of particles on the electron micrographs of Fe3O4 magnetic nanoparticles I and GOX-Fe3O4 I (A), and Fe3O4 magnetic nanoparticles II and GOX-Fe3O4 II (B).\n", - "9228 \n", - " FTIR spectra of Fe3O4 magnetic nanoparticles I (A) and Fe3O4 magnetic nanoparticles II (B), GOX-Fe3O4 I (C), and GOX-Fe3O4 II (D).\n", - "9231 \n", - " Effect of temperature on the activity of GOX-Fe3O4 I (A) and GOX-Fe3O4 II (B) at pH 7.4. The samples were stored at 37, 50, 60, 70 and 80°C for 30 min and the activities were measured at 25°C.\n", - "9234 \n", - " Temporal profiles of PK2 mRNA in the SCN in response to abrupt shifts of light/dark cycles. Animals were entrained to 12L:12D (LD) and subjected to either 6-hour delay of light/dark cycles (6hrD), 6-hour advance (6hrA), 6-hour delay followed by adaptation of 2 additional LD (6hrD+2LD), or 6-hour advance followed by adaptation of 2 additional LD (6hrA+2LD) or 6 additional LD (6hrA+6LD). Open and filled horizontal bars indicate light and dark periods, respectively. The LD data is doubled plotted as dashed line (open square) in all graphs. The zeitgeber time (ZT) on the x-axis reflects the timescale for LD, 6hrD or 6hrA. Please note that the additional LD adaptation groups use the same timescale as the 6hrD or 6hrA. (A) Temporal profiles of PK2 mRNA under 6hrD and LD. Note that PK2 mRNA responds quickly to the 6hrD shift. (B) Temporal profiles of PK2 mRNA rhythm under 6hrA and LD. Note that PK2 mRNA did not adjust to the 6hrA shift. (C) Temporal profiles of PK2 mRNA rhythm under 6hrD, 6hrD+2LD and LD to indicate adaptation of PK2 rhythm under 6hrD. Note that PK2 rhythm is stably entrained to 6hrD after two days. (D) Temporal profiles of PK2 mRNA rhythm under 6hrA, 6hrA+2LD, 6hrA+6LD and LD to illustrate adaptation of PK2 rhythm under 6hrA. Note that PK2 rhythm did not stably entrained to 6hrA until after 6 days. Each value is the mean ± SEM of 3 animals.\n", - "9235 \n", - " Effects of photoperiods on PK2 mRNA rhythm in the SCN. Temporal profiles of PK2 rhythm under 8L:16D (A), 16L:8D (B) and 20L:4D (C). Open and filled bars indicate light and dark periods, respectively. The zeitgeber time (ZT) on the x-axis reflects the timescale for each photoperiod. Each value represents the mean ± SEM of 3–4 animals. One-way ANOVA indicated that peak levels of all groups are significantly different from each other, p < 0.05–0.001 using Bonferroni's post-hoc test. Autoradiographic images show representative mRNA expression of PK2 during these photoperiods.\n", - "9236 \n", - " PK2 mRNA rhythm in the SCN of melanopsin-deficient (Opn4-/-) mice and triple knockout mice (Opn4-/- Gnat1-/- Cnga3-/- mice). (A) Temporal profiles of PK2 mRNA rhythm in wildtype (filled squares) and Opn4-/- mice (open triangles) under LD. Open and filled bars indicate light and dark periods, respectively. Each value represents the mean ± SEM of 3–4 animals. Two-way ANOVA indicated that there is no significant difference between genotypes. (B) Light pulse-induced PK2 mRNA expression in wildtype (shaded bars) and Opn4-/- mice (filled bars). PK2 mRNA was measured one and two hours after brief light pulse at ZT14. Each value represents the mean ± SEM of 6–8 animals. *p < 0.05, **p < 0.01, Student's t-test. (C) Light-pulse induced PK2 mRNA expression in triple knockout mice that lack melanopsin, rod and cone photoreceptive system (Opn4-/- Gnat1-/- Cnga3-/- mice). Dark controls received no light pulse. Each value represents the mean ± SEM of 3 animals. (D) PK2 mRNA expression in triple knockout mice at circadian time (CT) 3 and 15.\n", - "9237 \n", - " Light-driven molecular rhythms in the SCN of Cry1-/-Cry2-/- mice. Temporal mRNA profiles of Per2 (A), Per1 (B), Bmal1 (C) and PK2 (D) in Cry1-/-Cry2-/- mice under 12L:12D (LD) or two days constant darkness (2DD). Each value represents the mean ± SEM of 3–4 animals. Two-way ANOVA with Bonferroni's posthoc analysis was used to test for significant interactions between expression across time of sampling and under different lighting conditions (LD vs 2DD). p < 0.0001 (Per2), p < 0.002 (Per1), p < 0.0001 (Bmal1) and p < 0.0001 (PK2). (E) Light pulse-induced PK2 mRNA in Cry1-/-Cry2-/- mice. PK2 mRNA was measured one and two hours after brief light pulse at ZT14 (shaded bar). Black bar represents dark controls that did not receive light pulse. Each value represents the mean ± SEM of 5–6 animals. Two-way ANOVA indicates a significant difference in PK2 expression between light and dark treatment (p < 0.05), however, the PK2 induction is not significantly different between the two timepoints (1 hr vs 2 hr). (F) Locomotor behavioural rhythms of wild type (left) and Cry1-/-Cry2-/- mice (right) in response to 6 hour advance of light/dark cycle. Open and filled bars indicate light and dark periods, respectively. Black arrow indicates the day of 6 hour advance shift (6hrA). Numbers above and below the actograms represent timescale in zeitgeber time (ZT) for LD and 6hrA. (G) Rapid adjustment of PK2 rhythm in Cry1-/-Cry2-/- mice to 6 hour advance (6hrA). PK2 mRNA was quantitated in the SCN of wildtype and Cry1-/-Cry2-/- mice under LD (shaded) or 6hrA (black). Each value represents the mean ± SEM of 3–4 animals. Three-way ANOVA with Bonferroni's post hoc analysis indicates a significant interaction between light/dark cycle (LD vs 6hrA), timepoint (ZT4 vs ZT16) and genotype (wildtype vs Cry1-/-Cry2-/- mice), p < 0.001. Two-way ANOVA with Bonferroni's post hoc analysis show that there is significant difference in wildtype PK2 expression level between LD and 6hrA, (ZT4, ***p < 0.001; ZT16, **p < 0.01), but not in Cry1-/-Cry2-/- mice (ZT4, p = 1.000; ZT16, p = 1.000).\n", - "9239 \n", - " Cholesterol ester: triacylglycerol ratio in fish-oil (A) and MIX-diet (B) fed hamsters. Hamsters were fed fish oil (FO) or MIX diet at a low fat (5% w/w) or a high fat (20% w/w) level in the absence (pink) or presence (blue) of 0.25% w/w cholesterol. Lipids were analyzed as described in the methods. Values are means for 12 animals with standard deviations shown by vertical bars. Differences between groups were evaluated using Student's t test.\n", - "9246 \n", - " Elevation of pericranial flap and craniotomy. Pericranial flap being raised after elevation of the scalp flap (B) followed by a single burr hole frontoorbitotomy (A).\n", - "9248 \n", - " Facial approach Weber Ferguson incision (B) followed by inferior orbitotomy (A) which enabled the retraction of the eyeball.\n", - "9258 \n", - " Co-immunoprecipitation of Scar3 and Abi1 from mouse brain extract. Protein G beads were used to precipitate Abi1 from mouse brain extracts in the presence or absence of (A) anti-Abi1 or an unrelated control antibody or (B) anti-Scar3 or an unrelated control antibody. (A) The beads fractions were probed with anti-Abi1, anti-Scar/WAVE1 and anti-Scar/WAVE3. Anti-Abi1 immunoblotting confirmed precipitation of Abi1 only with specific antibody and immunoblotting with anti-Scar/WAVE1 shows association with a known binding partner. Immunoblotting with anti-Scar/WAVE3 revealed Scar/WAVE3 to also be present in Abi1 immunoprecipitates. Anti-Abi1 pulls down both Scar1 and Scar3 together with Abi1. (B) Beads fractions from anti-Scar/WAVE3 immunoprecipitates were probed with both anti-Scar/WAVE3 and anti-Abi1. Both Scar3 and Abi1 are detected in anti-Scar/WAVE3 immunoprecipitates, but not with controls.\n", - "9259 \n", - " Co-immunoprecipitation of Abi1 and HSPC300 with Scar Homology Domain. Cos 7 fibroblasts transiently transfected as indicated. Protein G beads were used to immunoprecipitate Myc-Scar1 SHD, Myc-Scar2 SHD or Myc-Scar3 SHD from lysates in the presence (+) or absence (-) of anti-Myc (9E10) monoclonal antibody. Empty pRK5-Myc vector was used as an additional negative control. (A) HA-Abi1 was detected in the beads plus antibody fractions for Myc-Scar1 SHD, Myc-Scar2 SHD, and Myc-Scar3 SHD, but not in the negative controls. (B) HA-HSPC300 was detected in the beads plus antibody fraction of immunoprecipitations from cells co-transfected only with Myc-Scar1 SHD, Myc-Scar2 SHD, and Myc-Scar3 SHD, but not empty vector controls or in the absence of 9E10 antibody.\n", - "9260 \n", - " Recombinant SHD pulls down Abi1 and HSPC300. Lysate of Cos7 fibroblasts transfected with HA-Abi1 or HSPC300 was incubated as indicated with GST alone, GST-Scar1 SHD (A), GST-Scar2 SHD (A), or GST-Scar3 SHD (B) on glutathione-s-agarose beads. Beads bound fractions were analysed by SDS-PAGE and immunoblotting with a monoclonal anti-Myc (9E10) antibody. HA-Abi1 and HA-HSPC300 were found in pull-downs with all three Scar Homology Domains, but not with GST alone.\n", - "9262 \n", - " Cellular localisation of Scar3. C2C12 cells were stained with anti-Scar/WAVE3, anti-Arp3, anti-Abi1 and fluorescently labelled phalloidin to investigate the cellular localisation of endogenous proteins. (A) C2C12 cells stained with (i) anti-Scar/WAVE3 (green), (ii) phalloidin (red) (iii) reveal co-localisation of Scar/WAVE3 with cortical polymerised actin in membrane ruffles. Scar/WAVE3 also colocalises with other areas enriched in polymerised actin, but not stress fibres. (B) Co-staining with (i) anti-Scar/WAVE3 and (ii) anti-Arp3 reveals co-localisation of Scar/WAVE3 (green) with the Arp2/3 complex (red) at protruding areas of the cell membrane. (C) Cells stained with (i) anti-Scar/WAVE3 and (ii) anti-Abi1. (iii) Scar/WAVE3 (green) co-localises with Abi1 (red) in some areas of membrane protrusion. A (i), B (i), and C (i) all show a cytoplasmic and perinuclear and cytoplasmic pool of Scar/WAVE3, with enrichment at areas of lamellipodial protrusion. B (ii) and C (ii) show similar patterns of staining for Arp3 and Abi1. Scale bars are equal to 20 μm in all pictures.\n", - "9263 \n", - " Cellular localization of Abi1, HSPC300, and the Scar homology domain. Transfected Cos cells were stained with a monoclonal anti-Myc antibody and polyclonal anti-HA antibodies to detect over-expressed proteins. (A) Cos7 cells were co-transfected with (i) HA-HSPC300, (ii) HA-Abi1, (iii) Myc-Scar1 SHD, (iv) Myc-Scar2 SHD, or (v) Myc-Scar3 SHD to examine localization of these proteins. HSPC300, and all three SHDs localise in a diffuse cytoplasmic pool with some enrichment at protrusive edges of cells. Abi1 is not detected at the edges of cells, but appears in vesicle-like spots throughout the cytoplasm. (B) Cos7 cells were co-transfected with Myc-Scar1 SHD (i) and HA-HSPC300 (ii) shown as red and green respectively in a merged image (iii). Scar1-SHD and HSPC300 exhibit the same diffuse staining throughout the cytoplasm but also co-localize at protruding edges of cells. (C) Cos7 cells were co-transfected with Myc-Scar1 SHD (i) and HA-Abi1 (ii). (iii) Shows a merge image with myc-Scar1 SHD in red and HA-Abi1 in green. Scar1 SHD and Abi1 both colocalize to punctate spots similar to those seen for Abi1 alone. (D) Cos7 cells co-transfected with Myc-Scar2 SHD (i) and HA-HSPC300 (ii) shown as red and green respectively in a merge image (iii). Both Scar2 SHD and HSPC300 exhibit peri-nuclear staining and localization to protrusive edges of cells. (E) Cos7 cells co-transfected with Myc-Scar2 SHD (i) and HA-Abi1 (ii). (iii) Scar2 SHD (red) and Abi1 (green) show co-localization to cytoplasmic spots and the edges of cells. (F) Cos7 cells co-transfected with (i) Myc-Scar3 SHD (red) and (ii) HA-HSPC300 (green), in a merged image (iii). HSPC300 and Scar3 SHD show diffuse cytoplasmic staining with enrichment at protrusive edges of cells. (G) Cos7 cells co-transfected with (i) Myc-Scar3 SHD and (ii) HA-Abi1. (iii) In a merge image Abi1 (green) and Scar3 SHD (red) co-localize to punctate cytoplasmic spots and to the edges of lamellipodia. Scale bars in all panels are 20 μm.\n", - "9266 \n", - " Effects of treatment with CpG-ODN on total BALF cell recruitment (A), eosinophils (B). B10.RIII/WT (□) and IFN-β-/- (■) mice were sensitized to OVA by intraperitoneal injection and subsequently challenged with OVA either alone or with CpG-ODN by intranasal drops on days 14 and 16. Cells were harvested on day 17th. n = 5/group, *P < 0.05 vs. OVA groups. † P < 0.05 vs OVA-treated WT mice.\n", - "9267 \n", - " BALF cytokine (protein) concentrations after intranasal CpG-ODN. BALF were collected 24 h after the last challenge from each group (n = 5/group) and cytokine levels determined by ELISA in non-immunized, OVA-challenged, and OVA-challenged/CpG-treated B10.RIII (□) and IFN-β-/- (■) mice at days 14 and 16. IL-5 (A) levels were significantly augmented after OVA challenge and diminished after CpG vaccination in both strains similarly. IFN-γ (B) was not induced in OVA/primed-OVA/challenge, but was induced after CpG vaccination. IFN-γ was stronger induced in B10.RIII than in IFN-β-/- mice. Th1/T2 ratio was stronger skewed to Th1-profile in B10.RIII than in IFN-β-/- mice. Data are given as mean ± SEM, *P < 0.05 vs. OVA groups. † P < 0.05 vs B10.RIII mice treated with CpG\n", - "9272 \n", - " Food intake (gm/day) (A) and water intake (mg/day) (B) in control. 14-days and 28-days STZ-induced diabetes groups (N = 6 in each group); * p ≤ 0.05 Vs control group.\n", - "9273 \n", - " Renal blood flow (mL/min) (A) and carotid blood flow (mL/min) (B) in control, 14-days and 28-days STZ-induced diabetes groups (N = 6 in each group); * p ≤ 0.05 Vs control group.\n", - "9274 \n", - " The concentration of plasma ET-1 (pg.mL-1) in control, 14-days and 28-days STZ-induced diabetes groups (A) (N = 6 in each group). Effect of duration (14-days and 28-days) of STZ-induced diabetes on the expression of preproET-1 protein in thoracic aorta (B), in kidney cortex (C) and in kidney medulla (D) and % change in densitometric units of preproET-1 (N = 3 in each group); * p ≤ 0.05 Vs control group, # p ≤ 0.05 Vs 14-days diab group.\n", - "9275 \n", - " Effect of STZ-induced diabetes on the plasma (A), thoracic aorta (B), kidney cortex (C) and kidney medulla (D) concentration of nitric oxide byproducts (NOx) in control, 14-days and 28-days diabetic rats. (N = 6 in each group); * p ≤ 0.05 Vs control group, # p ≤ 0.05 Vs 14-days diab group.\n", - "9303 \n", - " Panels A, B, and C show the three accepted ways by which a retrovirus may transform cells: capture of a c-onc and over-expression of v-onc by the provirus (A); promoter insertion upstream of a growth controlling cellular gene (B); and enhancer insertions either upstream or downstream of growth controlling cellular genes (C). Panel D shows the stepwise ways in which HTLV-I Tax oncoprotein may transform cells by i) inactivating checkpoints to induce tolerance of damaged DNA, and ii) permitting the accumulation of unrepaired DNA lesions which ultimately convert a normal cell to a transformed cell.\n", - "9305 \n", - " Typical recordings of ion current through a single Maltoporin trimer in presence of modified maltohexaose (see [16] for details). (A) Shows the unmodified maltohexaose and on the right hand side the modified sugar molecule. We designed this molecule according the crystal structure to guarantee the low penetration ability from one side. (B) M6-ANDS was added to trans (left) and then to cis (right). Sugar analogue modulates ion current only to the cis-side, the side of Maltoporin addition. The average residence time is 5.0 ms. (C) First, M6-ANDS was injected to the trans-side and no variation in the ion current occurs. As control, maltohexaose was added to the same side (left). The natural substrate is translocated demonstrating that it enters the channel from trans with the reducing end first. Then, M6-ANDS was added additionally to the cis-side (right) generating long current interruptions superimposed to maltohexaose blockade events seen in the figure of the left side. The dashed lines corresponding to zero current. Membrane bathing solution was 1 M KCl, 10 mM Tris, 1 mM CaCl2, pH 7.4, the applied voltage was + 150 mV.\n", - "9311 \n", - " Genomic organization of the SULT1A LCR family. (A) 30 LCRs (red) aligned to the SULT1A3 LCR (blue). Core sequences of SULT1A and LCR16a families are shown between dashed lines. (B) Chromosome 16 positions of 29 SULT1A3-related LCRs. (C) Known genes, bacterial sequencing contigs, and LCRs (outlined in boxes) in three 350 kbp regions of chromosome 16.\n", - "9337 \n", - " Glucose-6-phosphate isomerase phylogeny. (A) Multiple alignment based (MAB) tree. (B) TULIP tree. Both trees were constructed using the BLOSUM 62 similarity matrix. For MAB tree construction, bootstrap support was estimated using 1000 replicates. To build TULIP trees, Z-scores were estimated with 2000 sequence shuffling. Topology supported by high bootstrap results in the MAB tree (figures in black), are consistently recovered in the corresponding pair-wise alignement based TULIP tree.\n", - "9339 \n", - " Solution of the enolase phylogenic incongruence. (A) Multiple alignment based (MAB) tree. (B) TULIP tree. Both trees were constructed using the BLOSUM 62 similarity matrix. For MAB tree construction, bootstrap support was estimated using 1000 replicates. To build TULIP trees, Z-scores were estimated with 2000 sequence shuffling. Clades that contain a unique insertional signature (Land plants, green box; Charophytes and Chlorarachnion, blue box; Alveolates; yellow box) are not gathered in the MAB tree, as previously reported [36]. By contrast, in the TULIP tree, the phylogeny of enolase proteins is reconciled with the insertional signature detection in Land plants, Charophytes, Chlorarachnion and Alveolates.\n", - "9340 \n", - " (A) Gumbel score distribution simulated for enolases used in the present paper (B) graphical determination of ψ\n", - "9342 \n", - " Comparison to TaqMan® technology. Total RNA was extracted from isolated monocytes stimulated for 6 hours by LPS, serial-diluted 1:10 and retro-transcribed to generate standard curves by plotting the CT against the concentration of this cellular RNA in arbitrary units. TNF-α transcripts were amplified by real time PCR using either (A) the TaqMan® commercial kit and the TaqMan® universal PCR master mix or (B) our primers and the SYBR Green PCR master mix. Data represent the standard curves obtained for the two techniques, their slopes and the deducted efficiencies.\n", - "9351 \n", - " Representative structures from the folding pathway obtained after (A) 0 ps (B) 700 ps (C) 1000 ps (D) 2500 ps (E) 4000 ps (F) 5000 ps. Structures A and B belong to the first ensemble; C and D to the second and E and F to the third. Color code: Pro: Red; Trp: Blue; Asp: Green; Arg: Yellow\n", - "9352 \n", - " Distributions of Radius of gyration for (A) Ensemble 1 (B) Ensemble 2 (C) Ensemble 3 (D) Entire range of structures.\n", - "9366 \n", - " Ultrapathology of the colonic mucosa of the sensitized mice after challenge with OVA. Representative EM photomicrographs are taken from the colonic mucosa of the sensitized mice after challenge with OVA and show (A) epithelial cell (epi) necrosis (EN) and dilation of the blood vessel (BV) in the subepithelial region (×3,000); (B) epithelium destruction, basement membrane (BM) hyperplasia and blood vessel dilation (×2,000); (C) bacteria (arrows) adhering to and penetrating the epithelial cells (×3,000); (D) abscess (Ab) formation in subepithelial region with a colony of bacteria (arrows) and a red blood cell (RBC) in it (×2,000); (E) micro-ulcer (empty arrow) formation on the surface of colonic mucosa with bacteria (arrow) adherence (×2,500); (F) edema and blood vessel (BV) dilation in the lamina propria (LP) (×2,500).\n", - "9367 \n", - " MPO activity and inflammatory scores of the colonic mucosa. Colonic tissues show an increased MPO activity (A) and increased inflammatory scores (B) after challenge with OVA. *, p < 0.05, compared with naïve controls.\n", - "9391 \n", - " Recording before and after inhibition of breathing. Recording of airway pressure (Paw), oesophageal pressure (Poes) and phrenic nerve activity (PNA) before inhibition of spontaneous breathing in a representative cat after lung lavage during gas ventilation (GV) (A) and during partial liquid ventilation (PLV) (C), and at inhibition during GV after lung lavage (B) and during PLV (D).\n", - "9392 \n", - " Lung mechanics and blood gases. Multipanel figure showing (A) transpulmonary pressure; (B) tidal volume; (C) lung compliance; (D) resistance; (E) arterial pH; (F) arterial pCO2 during gas ventilation (GV) before lavage and during GV and partial liquid ventilation after lavage in each cat (unbroken lines) and as mean (broken line).\n", - "9393 \n", - " Pressure-volume curves. Pressure-volume curve during (A) gas ventilation (GV) before lavage and (B) during GV and partial liquid ventilation (C) after lavage in a representative cat.\n", - "9396 \n", - " Activation of p42/p44 MAPK following short and long-time incubation with GM-CSF, effect of aging. Neutrophils of young (A) and elderly subjects (B) were stimulated either for 5, 30, 60 min, 6 and 18 hours with GM-CSF alone or pre-treated with PD98059 (i-ERK) for 1 hours prior to GM-CSF stimulation for 18 hours. Neutrophils were then lysed and analyzed by western-blotting experiments for p42/p44 MAPK phosphorylation revealing by phospho-anti-p42/p44 MAPK polyclonal Abs. Control loading are shown under each blot for p44. Experiments were performed for 15 different donors of each group.\n", - "9397 \n", - " Time-dependant activation of p38 MAPK following incubation with GM-CSF, effect of aging. Neutrophils were stimulated with GM-CSF from 0 to 18 hours and immediately lysed. Western-blotting experiments of neutrophils of young (A) and elderly subjects (B) lysates were conducted by revealing with anti-phospho-p38 MAPK polyclonal Abs. Control loading for p38 are shown under each blot. Blots are representative of 15 independent experiments.\n", - "9398 \n", - " Expression of bcl-2 family members Bax and Bcl-xL in PMN with aging upon treatment with GM-CSF and PD98059 and SB203580 for 18 h. Neutrophils were cultured in presence of GM-CSF alone or in combination with either the p42/p44 MAPK inhibitor, PD98059, or the p38 MAPK inhibitor, SB203580, for 18 h. Then, neutrophils were lysed and western-blotting experiments were executed to investigate the amount of Bax in young (A) and elderly donors (B). The same experiments were conducted for studying Bcl-xl expression in PMN of young (C) and elderly subjects (D). GM-CSF significantly decreased the expression of Bax in PMN of young subjects (A, p < 0.01), without any effect in PMN of elderly subjects (B). GM-CSF significantly increased the expression of Bcl-xL (p < 0.05) in both age groups (C and D), Blots are representative of 15 independent experiments.\n", - "9475 \n", - " Expression of ALT proteins in L. mexicana cultured promastigotes. (A-D) Immunofluorescent detection of transgenic protein. Paraformaldehyde-fixed wild-type promastigotes were incubated with (A) anti-L. mexicana serum or (B) anti-ALT-1 antibody. (C) Cloned alt-1 transfected and (D) alt-2 transfected fixed parasites were incubated with an anti-ALT-1 antibody, which binds to both ALT-1 and ALT-2, and detected with an anti-mouse-FITC secondary antibody. (E-H) FACS analysis of transfected promastigotes of L. mexicana. Fixed promastigotes were stained, without permeabilization, with anti-ALT-1 antibody and analysed by FACS. (E) alt-1-transfected L. mexicana; (F) alt-2-transfected L. mexicana; (G) wild-type L. mexicana. Positive cells are those within the gate (M1) set above the threshold defined by reactivity of transfected parasites stained with normal mouse serum (H). (I, J) Multiplication of transfectants within macrophages. (I) In vitro-transformed wild-type amastigotes or (J) alt-1 transfected amastigotes were added to bone marrow-derived macrophages from CBA mice at a ratio of 10 parasites per macrophage. After 24 hours at 34°C the infected macrophages were observed by microscopy.\n", - "9476 \n", - " In vitro infection of macrophages with transfected amastigotes. (A, B). Bone marrow derived macrophages from CBA mice were infected for (A) 24 hours or (B) 7 days with wild-type or transfected amastigotes at a ratio of 10 parasites per macrophage. Parasites were detected and counted by immunofluorescence. Between 100 and 200 macrophages were counted for each time-point. The χ2 test showed significant differences in the numbers of infected vs uninfected macrophages between wild-type and either alt-1 or alt-2 transfectants at both time points (p < 0.001). (C, D). In vitro infection of macrophages with L. mexicana expressing the cysteine protease inhibitor-2 (CPI-2) gene of B. malayi (C) after 24 hours and (D) after 7 days. (E, F) Infection of C57BL/6 mice with transfected L. mexicana. (E) Time-course of lesion development in mice. Groups of 8 female C57BL/6 mice were injected subcutaneously in the footpad with 3 × 106 stationary-phase wild-type L. mexicana, alt-1 transfectants or alt-2 transfectants. Lesion size was measured weekly during the course of infection with a dial micrometer and expressed as the difference in size between the infected footpad and the contralateral uninfected footpad. One of two replicate experiments with similar results is shown; because data are not normally distributed (see for example recovery of wild-type parasites in panel F), standard error values cannot be applied. (F) Recovery of parasites from footpads at 15 weeks post-infection. The number of parasites in the footpad was estimated by limiting dilution assay. Results are expressed as log10 of the highest dilution containing parasites.\n", - "9480 \n", - " Deletion of the Acidic Domain abolishes the functional effect of ALT transfection. (A-C) Immunofluorescent detection of ADD (acidic domain deleted mutant of ALT-2) protein. Paraformaldehyde-fixed wild-type promastigotes (A) and cloned ADD transfected parasites (B) were incubated with mouse antiserum to anti-ALT-2, and detected with an anti-mouse-FITC secondary antibody. (C) Cloned ADD transfected parasites were also incubated with normal mouse serum. (D) Bone marrow-derived macrophages were infected with stationary phase amastigotes of wild-type L. mexicana or transfected alt-2 and ADD parasites at a ratio of 10 parasites per cell. After 7 days, cells were stained with Giemsa. The percentage of macrophages infected with parasites was determined by counting 3 samples (from 3 different wells) of 100 cells. The χ2 test showed significant differences in the number of infected macrophages between wild-type and alt-2 transfectants (p < 0.001), but not between wild-type and add-transfected parasites.\n", - "9498 \n", - " Chromosomal localisation and the gene structure of murine L-threonine aldolase gene. (A) The gene is located on chromosome 11, band E2 (accession No. AL591433, the Sanger Institute, UK). (B) The 7-exon gene spans 5.6 kb. There is a CpG island spanning the 5' untranslated exon. The ORF is indicated by closed boxes. The sizes, in bp, of the exons and introns are indicated.\n", - "9501 \n", - " Comparison of the mouse threonine aldolase cDNA and ORF with the human and chimpanzee genes. (A) There is a cytidine deletion in exon 4 of the human threonine aldolase gene resulting in a frame-shift. (B) There is a guanosine deletion in exon 7 of the human threonine aldolase gene resulting in a frame-shift. (C) Comparison of the mouse protein with a translation of human and chimpanzee genes shows that the presence of the frame-shift in exon 4 creates a truncated ORF of 144 residues that does not include the PLP-binding lysine residue (pink K); consequently the protein would be non-functional. All exon/exon boundaries are conserved and shown on the translated protein as black underlined residues except that of chimpanzee exon 1 which is shown as a red underlined residue. Stop codons are indicated by red hashes. ORF residues generated by frame-shifts are shown in lower case. Conserved residues are indicated by a (*), strongly similar residues by a (:) and weakly similar residues by a (.). Abbreviations: mouse, Mus musculus, Mm; Homo sapiens, Hs; Pt, Pan troglodytes; exon 4, Ex4; exon 7, Ex7; translations in frame 1, F1; frame 2, F2 and frame 3, F3.\n", - "9503 \n", - " Expression of TA, SDH and SDH1 mRNA in mouse tissues by real time PCR. The expression levels in each tissue were normalised to that of the housekeeping genes beta-actin and G3PDH. (A) For TA the expression levels in all tissues were standardised to that of prostate, which was taken as 100; (B) and for SDH and SDH1 the expression levels were standardised to that of liver, which was taken as 100.\n", - "9545 \n", - " Representative scatter blots of breast cancer cells using the 1.2 Cancer Array for expression analysis. (A) untreated MCF-7 breast cancer cells (results of duplicate experiments), (B) antibody-treated versus untreated MCF-7 cells, and (C) antibody-treated versus untreated BT474 breast cancer cells.\n", - "9548 \n", - " The labyrinth of the paca placenta. (A) The central region of a lobe (cl), a labyrinthine region (lab) and interlobular regions (in). Haematoxylin and eosin. (B) Central region of a placental lobe, showing the presence of fetal veins (fv), maternal arterial blood spaces (ma) lined by trophoblast cells, and the mesenchyme (mes) surrounding these structures. Haematoxylin and eosin. (C) Detail to show the trophoblastic lining of maternal blood spaces (tr) and the intact walls of small fetal veins. PAS. (D) The placental labyrinth, showing the radial disposition (←) of the trophoblastic columns, the fetal capillaries (fc) and maternal blood spaces (mbs). Haematoxylin and eosin. Scale bars: 500 μm (A), 200 μm (B); 50 μm (C, D).\n", - "9549 \n", - " The interlobium of the paca placenta. (A) Channels in the interlobium (in) drain the maternal blood spaces of the labyrinth (lab) and converge on larger venous blood spaces (mv). Haematoxylin and eosin. (B) Fetal artery (fa) at the border between an interlobular region and the labyrinth at the periphery of a lobe. Haematoxylin and eosin. Scale bars: 100 μm (A); 50 μm (B).\n", - "9550 \n", - " Fetal surface of the paca placenta. (A) The visceral yolk sac (vys) attaches to the surface of the chorioallantoic placenta. Just before attachment it forms the fibrovascular ring (fvr). Left of the point of attachment, the endoderm continues as the parietal yolk sac (pys). To the right, the surface is covered by connective tissue. Masson's trichrome. (B) The parietal yolk sac endoderm (endo) forms a layer of epithelial cells that rests on Reichert's membrane (Rm). Immediately below the membrane are scattered connective tissue cells (ct). Masson's trichrome. (C) Beneath the endoderm and Reichert's membrane are spongiotrophoblast cells (sp tr), with a vacuolated appearance, marginal syncytium (ma tr) and a portion of the labyrinth (lab). Haematoxylin and eosin. (D) The centre of the placental disk is covered by connective tissue. Beneath this are marginal trophoblast and labyrinth. Haematoxylin and eosin. Scale bars: 500 μm (A); 10 μm (B); 100 μm (C-D).\n", - "9551 \n", - " Subplacenta, junctional zone and pedicle of the paca placenta. (A) Subplacenta. A layer of cytotrophoblasts (cy tr) is supported on lamellae of fetal mesenchyme (fm). Beneath it is the subplacental syncytiotrophoblast (sy tr). Gomori's trichrome. (B) Groups of multinucleated giant cells with a finely granular cytoplasm are found between the subplacenta and decidua. They are bordered by connective tissue. Masson's trichrome. (C) Middle portion of the placental pedicle, showing a large number of maternal blood vessels (mbv) and connective tissue fibers (ct). Haematoxylin and eosin. Scale bars: 20 μm (A-B); 200 μm (C).\n", - "9552 \n", - " Yolk sac placenta of the paca. (A) The visceral yolk sac is complexly folded with columnar epithelial cells of endodermal origin (endo) supported by fetal mesenchyme (fm). Haematoxylin and eosin. (B) The mesenchyme (stained blue) contains vitelline blood vessels (vit bv). Masson's trichrome. Scale bars: 50 μm (A); 10 μm (B).\n", - "9554 \n", - " Ultrastructure of the subplacenta and junctional zone of the paca placenta. (A) The cytotrophoblast layer (cy tr) is multilaminar with dilated intercellular spaces. The cells are characterized by their large nuclei. They rest on a thin basement membrane (bm) which separates them from the fetal mesenchyme. (B) The syncytiotrophoblast (sy tr) contains electron-dense droplets (dd). Microvilli project from the syncytiotrophoblast into lacunae containing material of moderate electron density (arrows). (C) Multinucleated giant cells from the junctional zone. The cytoplasm has electron transparent areas, giving it a vacuolated appearance. (D) Two giant cells (gc) separated by intercellular matrix into which they send processes (arrows). Scale bars: 5 μm (A-C); 1 μm (D).\n", - "9555 \n", - " Ultrastructure of the inverted yolk sac placenta of the paca. (A) The apical surface of the endodermal cells bears numerous microvilli. The supranuclear cytoplasm contains many larger vesicles or vacuoles with a small amount of electron dense content. (B) Invaginations (arrowheads), small coated vesicles (cv) and tubules are present in the most apical regions of the cytoplasm. Scale bars: 4 μm (A); 1 μm (B).\n", - "9556 \n", - " Effect of macrophages on oxidation products in LDL and oxLDL. RPMI 1640 containing 100 μg/mL of LDL or oxLDL (oxidized for 2 h) was incubated in cell culture wells at 37°C with and without macrophages (HMDM) for 2 h and 24 h. Values are expressed as nmol/mg LDL, TBARS (n = 5) (A), lipid peroxides (n = 6) (B), H2O2 (n = 6), (C). Values of Apo B are expressed as % change compared to cell free control incubations (n = 4) (D).\n", - "9561 \n", - " Effect of LDL and oxLDL on the intracellular antioxidant defenses in macrophages. The intracellular activity of catalase (A), glutathione peroxidase (B), and the levels of glutathione (C) were measured in crude extracts from macrophages (n = 6) incubated with LDL or oxLDL (oxidized for 2 h). Control cells were incubated in the absence of LDL. Results were analyzed by ANOVA.\n", - "\n", - "18.89%\n" - ] - } - ], - "source": [ - "count = 0\n", - "\n", - "for i, data in enumerate(dataset[:]):\n", - "\n", - " if '(A)' in data['caption']:\n", - " print(i, '\\n', data['caption'])#; break\n", - " count += 1\n", - "\n", - "print(f'\\n{count/len(dataset)*100:.2f}%')" - ] - }, - { - "cell_type": "code", - "execution_count": 24, - "metadata": {}, - "outputs": [], - "source": [ - "def split_captions(dataset):\n", - " \"\"\"\n", - " Split figure captions into subcaptions.\n", - "\n", - " Args:\n", - " dataset (List[Dict[str, str]]): List of dictionaries containing figure captions.\n", - "\n", - " Returns:\n", - " Dict[str, List[Dict[str, str]]]: Dictionary mapping PMC_ID to a list of sub-figure labels and captions.\n", - " \"\"\"\n", - " def get_pattern(text):\n", - " patterns = [\n", - " ('parenthesis', r'\\([aA]'),\n", - " ('letter_dot', r'[aA]\\.'),\n", - " ('letter_paren', r'[aA]\\)'),\n", - " ('panel', r'Panel [aA]'),\n", - " ]\n", - " for pattern_name, regex in patterns:\n", - " if re.search(regex, text):\n", - " return pattern_name\n", - " return None\n", - "\n", - " def get_pattern_specifics(pattern):\n", - " if pattern == 'parenthesis':\n", - " return {\n", - " 'regex': lambda letter: rf'\\({letter}',\n", - " 'merged_regex': lambda letter: rf'\\({letter}[^a-zA-Z]([a-zA-Z])\\)',\n", - " 'extract_label': lambda text: text.strip('()'),\n", - " 'find_end': lambda text, start: start + text[start:].index(')') + 1\n", - " }\n", - " elif pattern == 'letter_dot':\n", - " return {\n", - " 'regex': lambda letter: rf'{letter}\\.',\n", - " 'merged_regex': lambda letter: rf'{letter}[^a-zA-Z]([a-zA-Z])\\.',\n", - " 'extract_label': lambda text: text.rstrip('.'),\n", - " 'find_end': lambda text, start: start + 2\n", - " }\n", - " elif pattern == 'panel':\n", - " return {\n", - " 'regex': lambda letter: rf'Panel {letter}',\n", - " 'merged_regex': lambda letter: rf'Panel {letter}[^a-zA-Z]([a-zA-Z])',\n", - " 'extract_label': lambda text: re.search(r'[Pp]anel ([a-zA-Z])', text).group(1),\n", - " 'find_end': lambda text, start: start + len(re.match(r'[Pp]anel [a-zA-Z]', text[start:]).group())\n", - " }\n", - " elif pattern == 'letter_paren':\n", - " return {\n", - " 'regex': lambda letter: rf'{letter}\\)',\n", - " 'merged_regex': lambda letter: rf'{letter}[^a-zA-Z]([a-zA-Z])\\)',\n", - " 'extract_label': lambda text: text.rstrip(')'),\n", - " 'find_end': lambda text, start: start + 2\n", - " }\n", - " return None\n", - "\n", - " def process_single_caption(full_caption):\n", - " \"\"\"\n", - " Process a single caption, splitting it into main caption and subcaptions.\n", - "\n", - " Args:\n", - " full_caption (str): The full caption text to process.\n", - "\n", - " Returns:\n", - " List[Dict[str, str]]: List of dictionaries containing labels and captions.\n", - " \"\"\"\n", - " subcaptions = []\n", - " pattern_name = get_pattern(full_caption)\n", - " \n", - " if not pattern_name:\n", - " return [{\"label\": \"main\", \"caption\": full_caption.strip()}]\n", - " \n", - " pattern = get_pattern_specifics(pattern_name)\n", - " first_subcaption_match = re.search(pattern['regex']('[aA]'), full_caption)\n", - " \n", - " if not first_subcaption_match:\n", - " return [{\"label\": \"main\", \"caption\": full_caption.strip()}]\n", - " \n", - " main_caption = full_caption[:first_subcaption_match.start()].strip()\n", - " \n", - " remaining_text = full_caption[first_subcaption_match.start():]\n", - " current_subcaption_letter = pattern['extract_label'](first_subcaption_match.group())\n", - " \n", - " while current_subcaption_letter in (ascii_uppercase + ascii_lowercase):\n", - " subcaption_start_match = re.search(pattern['regex'](current_subcaption_letter), remaining_text)\n", - " if not subcaption_start_match:\n", - " break\n", - " \n", - " subcaption_start = subcaption_start_match.start()\n", - " merged_subcaption_match = re.match(pattern['merged_regex'](current_subcaption_letter), remaining_text[subcaption_start:])\n", - " \n", - " if merged_subcaption_match:\n", - " subcaption_label = pattern['extract_label'](remaining_text[subcaption_start:subcaption_start+merged_subcaption_match.end()])\n", - " end_letter = merged_subcaption_match.group(1)\n", - " subcaption_end = subcaption_start + merged_subcaption_match.end()\n", - " else:\n", - " subcaption_label = pattern['extract_label'](remaining_text[subcaption_start:pattern['find_end'](remaining_text, subcaption_start)])\n", - " end_letter = current_subcaption_letter\n", - " subcaption_end = pattern['find_end'](remaining_text, subcaption_start)\n", - " \n", - " subcaption_text = remaining_text[subcaption_end:].strip()\n", - " \n", - " next_letter_index = (ascii_uppercase + ascii_lowercase).index(end_letter) + 1\n", - " if next_letter_index < len(ascii_uppercase + ascii_lowercase):\n", - " next_subcaption_letter = (ascii_uppercase + ascii_lowercase)[next_letter_index]\n", - " next_subcaption_match = re.search(pattern['regex'](next_subcaption_letter), subcaption_text)\n", - " if next_subcaption_match:\n", - " subcaption_text = subcaption_text[:next_subcaption_match.start()].strip()\n", - " else:\n", - " next_subcaption_letter = None\n", - " \n", - " subcaptions.append({\"label\": subcaption_label, \"caption\": subcaption_text})\n", - " \n", - " remaining_text = remaining_text[subcaption_end:] # Remove the leading space\n", - " current_subcaption_letter = next_subcaption_letter\n", - " \n", - " if main_caption:\n", - " subcaptions.insert(0, {\"label\": \"main\", \"caption\": main_caption})\n", - " \n", - " return subcaptions\n", - "\n", - " result = {}\n", - " for item in dataset:\n", - " pmc_id = item['PMC_ID']\n", - " caption = item['caption']\n", - " result[pmc_id] = process_single_caption(caption)\n", - " \n", - " return result" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Original:\n", - "Electromyographic activity of the crural diaphragm a) at rest and b) on slow sustained straining. ↑ = straining\n", - "\n", - "Processed:\n", - "label: main | caption: Electromyographic activity of the crural diaphragm\n", - "label: a | caption: at rest and\n", - "label: b | caption: on slow sustained straining. ↑ = straining\n", - "\n", - " ==================================================================================================== \n", - "\n" - ] - } - ], - "source": [ - "### TEST CODE ###\n", - "sample = 5255 #116 + 1002 #2575 #2100+3821 #2100+1015 #6125 #9476 #123 #4721 #2512 #5555\n", - "result = split_captions(dataset[sample:sample+1])\n", - "\n", - "# Print the result\n", - "for i, (pmc_id, captions) in enumerate(result.items()):\n", - " print(f\"Original:\\n{dataset[i+sample]['caption'].strip()}\\n\\nProcessed:\")\n", - " for caption in captions:\n", - " print(f\"label: {caption['label']} | caption: {caption['caption']}\")\n", - " print('\\n', \"=\"*100, '\\n')" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/openpmcvl/granular/process/playground_inference_detect_align.py b/openpmcvl/granular/process/playground_inference_detect_align.py deleted file mode 100644 index 8997d34..0000000 --- a/openpmcvl/granular/process/playground_inference_detect_align.py +++ /dev/null @@ -1,474 +0,0 @@ -""" -Inference % Evaluation functions of subfig detection, OR subfig detection & subfig-subcap token-wise align -""" - -import os -from tkinter import W -from regex import P -import torch -import argparse -from torch.utils.data import DataLoader -from tqdm import tqdm -from pathlib import Path -import random -import numpy as np -from datetime import datetime -from datetime import timedelta -from datetime import timezone -import json - -from torchvision import transforms -from torchvision import utils as vutils - -from openpmcvl.process.dataset_det_align import FigCap_Dataset, figcap_collate, Fig_Dataset, fig_collate, Fig_Separation_Dataset, fig_separation_collate -from openpmcvl.process.align_metric import SubfigureSubcaptionAlignmentMetric -from openpmcvl.process.detect_metric import calculate_mAP_voc12, box_cxcywh_to_xyxy, find_jaccard_overlap -from openpmcvl.process.visualization_tools import visualization, visualization_noComparision - -from matplotlib import pyplot as plt - -# Visualization the dataset -# def inference(model, valSet, valLoader, save_path='./Inference', iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - -# # Subfig Subcap Metric -# subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) -# subcaption_metric.reset() - -# Path(save_path).mkdir(parents=True, exist_ok=True) - -# # validate one epoch -# with torch.no_grad(): -# model.eval() -# for batch in tqdm(valLoader): -# image = batch['image'].cuda() # (bs, 3, max_w, max_h) -# # TRANSFORM -# # image = image_transform(image) -# # -# caption = batch['caption'].cuda() # (bs, max_l) -# subfigures = batch['subfigs'] -# img_ids = batch['image_id'] # [bs] -# original_hws = batch['original_hws'] # [bs * [2]] 没resize+pad前的hw -# untokenized_caption = batch['untokenized_caption'] # [bs * 'string'] -# output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) -# cpu_output_box = output_box.cpu() -# cpu_output_sim = output_sim.cpu() -# cpu_output_det_class = output_det_class.cpu() -# cpu_caption = caption.cpu() - -# # evaluation detection(mAP) and alignment(f1) -# filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False -# index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) -# for i in range(image.shape[0]): -# # accumulate results as coco format -# det_boxes=[cpu_output_box[i, filter_mask[i,:], :]] # [1 * (filter_pred_num, 4)] -# # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() -# det_scores=[cpu_output_det_class.squeeze()[i, filter_mask[i,:]]] # [1 * (filter_pred_num)] -# det_labels=[torch.ones_like(det_scores[-1])] # [1 * (filter_pred_num)] all 1 -# true_boxes=[subfigures[i][0]] # [1 * (subfig_num, 4)] -# true_labels=[torch.ones(true_boxes[-1].shape[0])] # [1 * (subfig_num)] all 1 -# true_difficulties=[torch.zeros_like(true_labels[-1])] # [1 * (subfig_num)] all zeros - -# # calcualte mAP, recall, precision -# mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) - -# # accumulate results as subfig-subcap format -# ls_caption = [valSet.id_to_token(cpu_caption[i].tolist())] # [1 * cap_len] before evaluation, convert ids to tokens -# ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist()] # [1 * [filtered_query_num * [4]]], (cx, cy, w, h) -# ls_gt_boxes = [subfigures[i][0].tolist()] # [bs * [subfigure * [4]]], (cx, cy, w, h) -# filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False -# pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption -# ls_pred_tokens = [pred_tokens] # [1 * [filtered_query_num * [aligned_token_num]]] -# filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False -# gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption -# ls_gt_tokens = [gt_tokens] # [1 * [subfig_num * [subcap_token_num]]] -# # calculate mAP, recall, precision -# match_matrix = subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, -# gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) -# f1, rcl, prec = subcaption_metric.get_metric(reset=True) - -# img_path = [] -# if config.name_by_f1: -# img_path.append("%s/f1(%.2f)%s" % (save_path, f1, img_ids[i])) -# elif config.name_by_mAP: -# img_path.append("%s/mAP(%.2f)%s" % (save_path, mAP, img_ids[i])) - -# visualization(image=image[i].cpu(), original_h=original_hws[i][0], original_w=original_hws[i][1], -# pred_boxes=det_boxes[-1], pred_texts=pred_tokens, gt_boxes=true_boxes[-1], gt_texts=gt_tokens, match_matrix = match_matrix[-1], -# cap=ls_caption[-1], untokenized_cap=untokenized_caption[i], path=img_path, mAP=mAP, f1=f1) - -# Evaluate det and align on the dataset -# def evaluate(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5, similarity_threshold=0.5): - -# # Subfig Subcap Metric -# subcaption_metric = SubfigureSubcaptionAlignmentMetric(iou_threshold) -# subcaption_metric.reset() - -# # validate one epoch -# with torch.no_grad(): -# model.eval() -# det_boxes = [] -# det_labels = [] -# det_scores = [] -# true_boxes = [] -# true_labels = [] -# true_difficulties = [] -# for batch in tqdm(valLoader): -# image = batch['image'].cuda() # (bs, 3, max_w, max_h) -# caption = batch['caption'].cuda() # (bs, max_l) -# subfigures = batch['subfigs'] -# output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) -# cpu_output_box = output_box.cpu() -# cpu_output_sim = output_sim.cpu() -# cpu_output_det_class = output_det_class.cpu() - -# # accumulate results as coco format -# filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False -# for i in range(filter_index.shape[0]): -# det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] -# # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() -# det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] -# det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 -# true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] -# true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 -# true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - -# # accumulate results as subfig-subcap format -# cpu_caption = caption.cpu() -# ls_caption = [valSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens -# # -# filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False -# ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) -# # -# ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) -# # -# index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) -# ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] -# ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] -# for i in range(image.shape[0]): -# filter_tmp = cpu_output_sim[i, filter_mask[i], :] > similarity_threshold # (filtered_query_num, caption_length) True or False -# pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption -# ls_pred_tokens.append(pred_tokens) -# filter_tmp = subfigures[i][1] > similarity_threshold # (subfig_num, caption_length) True or False -# gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption -# ls_gt_tokens.append(gt_tokens) -# subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, -# gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - -# gold_subfig_num = 0 -# gold_subcap_num = 0 -# for subfigs in true_boxes: -# gold_subfig_num += len(subfigs) -# for subcaps in true_boxes: -# gold_subcap_num += len(subcaps) -# print('evaluate on %d compound figures, total %d gold subfigs, %d gold subcaps' % (len(valSet), gold_subfig_num, gold_subcap_num)) - - -# mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) -# out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) -# print(out_str) -# f1, rcl, prec = subcaption_metric.get_metric(reset=True) -# out_str = "f1:%.3f recall:%.3f precsision:%.3f" % (mAP, rcl, prec) -# print(out_str) -# return f1, rcl, prec, mAP, recall, precision - -# # Evaluate det and align on the dataset -# def evaluate_det(model, valSet, valLoader, iou_threshold=0.75, score_threshold=0.5): -# # validate one epoch -# with torch.no_grad(): -# model.eval() -# det_boxes = [] -# det_labels = [] -# det_scores = [] -# true_boxes = [] -# true_labels = [] -# true_difficulties = [] -# for batch in tqdm(valLoader): -# image = batch['image'].cuda() # (bs, 3, max_w, max_h) -# caption = batch['caption'].cuda() # (bs, max_l) -# subfigures = batch['subfigs'] -# output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) -# cpu_output_box = output_box.cpu() -# # cpu_output_sim = output_sim.cpu() -# cpu_output_det_class = output_det_class.cpu() - -# # accumulate results as coco format -# filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False -# for i in range(filter_index.shape[0]): -# det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] -# # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP_voc12() -# det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] -# det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 -# true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] -# true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 -# true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - -# gold_subfig_num = 0 -# for subfigs in true_boxes: -# gold_subfig_num += len(subfigs) -# print('evaluate on %d compound figures, total %d gold subfigs' % (len(valSet), gold_subfig_num)) - -# mAP, recall, precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, iou_threshold, score_threshold) -# out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) -# print(out_str) - -# return mAP, recall, precision - -# Separation compound figures -def separation(model, valLoader, save_path='./Segmentation', rcd_file='./Segmentation/separation.jsonl', score_threshold=0.75, nms_threshold=0.4): - - Path(save_path).mkdir(parents=True, exist_ok=True) - subfig_list = [] - subfig_count = 0 - - # validate one epoch - with torch.no_grad(): - model.eval() - try: - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_h, max_w) - _, _, height, width = image.shape - caption = batch['caption'].cuda() # (bs, max_l) - img_ids = batch['image_id'] # [bs] - img_idxes = batch['image_index'] - original_images = batch['original_image'] # [bs * (3, h, w)] - unpadded_hws = batch['unpadded_hws'] # [bs * [2]] - output_det_class, output_box, _ = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_det_class = output_det_class.cpu() - filter_mask = cpu_output_det_class.squeeze() > score_threshold # [bs, query_num], True or False - for i in range(image.shape[0]): - det_boxes=cpu_output_box[i, filter_mask[i,:], :] # (filter_pred_num, 4) - det_scores=cpu_output_det_class.squeeze()[i, filter_mask[i,:]].numpy() # (filter_pred_num) - img_id = img_ids[i].split('.jpg')[0] # xxxx.jpg - img_idx = img_idxes[i] # x - unpadded_image = original_images[i] - original_h, original_w = unpadded_hws[i] - # 求scale - if original_h > original_w: - scale = original_h / 512 - else: - scale = original_w / 512 - # 非极大值抑制 - order = np.argsort(det_scores) - picked_bboxes = [] # [suppressed_num, 4] - picked_scores = [] # [suppressed_num] - while order.size > 0: - # 最大score的index - index = order[-1] - if order.size == 1: - picked_bboxes.append(det_boxes[index].tolist()) - picked_scores.append(det_scores[index]) - break - else: - iou_with_left = find_jaccard_overlap(box_cxcywh_to_xyxy(det_boxes[index]), box_cxcywh_to_xyxy(det_boxes[order[:-1]])).squeeze().numpy() # (left_bboxes_num) - left = np.where(iou_with_left < nms_threshold) # (left_bboxes_num) - order = order[left] # (new_filtered_num) - picked_bboxes.append(det_boxes[index].tolist()) - picked_scores.append(det_scores[index]) - # Crop and Save Image - for bbox, score in zip(picked_bboxes, picked_scores): - try: - subfig_path = '%s/%s_%d.jpg' % (save_path, img_id, subfig_count) - cx, cy, w, h = bbox - # 计算在原图中的bbox坐标 - x1 = round((cx - w/2)*width*scale) - x2 = round((cx + w/2)*width*scale) - y1 = round((cy - h/2)*height*scale) - y2 = round((cy + h/2)*height*scale) - # 纠正如果超出了compound figure的boundary - x1 = min(max(x1, 0), original_w-1) - x2 = min(max(x2, 0), original_w-1) - y1 = min(max(y1, 0), original_h-1) - y2 = min(max(y2, 0), original_h-1) - # 抠图 - subfig = unpadded_image[:, y1:y2, x1:x2] # (3, h, w) - subfig = subfig.to(torch.device('cpu')) - vutils.save_image(subfig, subfig_path) - # Record the Subfig Info in Jsonl file - subfig_list.append({'id':'%d.jpg'%subfig_count, 'source_fig_id':img_id, 'position':[(x1, y1), (x2, y2)], 'score':score.item()}) - subfig_count += 1 - except (ValueError): - print('Crop Error: [x1 x2 y1 y2]:[%.2f %.2f %.2f %.2f], w:%.2f, h:%.2f' % (x1, x2, y1, y2, original_w, original_h)) - - # 若中途报错,暂时保存现有的分割结果 - except Exception as e: - print(repr(e)) - print('Break at %s' % img_idx) - - f = open(rcd_file, 'a') - for line in subfig_list: - f.write(json.dumps(line)+'\n') - f.close() - -# grid search align -# def grid_search(config, model, Set, Loader): -# # 测试不同的confidence score,在recall和precision之间平衡 -# for score_th in np.arange(0.3, 1.0, 0.05): -# config.score_threshold = score_th -# f1, rcl, prec, mAP, recall, precision = evaluate(model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) -# out_str = "mAP:%.3f recall:%.3f precsision:%.3f f1:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision, f1, rcl, prec) -# print(out_str) -# if config.rcd_file: -# with open(config.rcd_file, 'a') as f: -# f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) -# f.write('Results: mAP--%.3f recall--%.3f precision--%.3f f1--%.3f recall--%.3f precision--%.3f\n' % (mAP, recall, precision, f1, rcl, prec)) -# f.write('\n\n') -# f.close() - -# if config.vis_path: -# inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) - -# # grid search detection -# def grid_search_det(config, model, Set, Loader): -# # 测试不同的confidence score,在recall和precision之间平衡 -# for score_th in np.arange(0.3, 1.0, 0.05): -# config.score_threshold = score_th -# mAP, recall, precision = evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) -# out_str = "mAP:%.3f recall:%.3f precsision:%.3f" % (mAP, recall, precision) -# print(out_str) -# if config.rcd_file: -# with open(config.rcd_file, 'a') as f: -# f.write('IOU > %.2f Score > %.2f Similarity > %.2f\n' % (config.iou_threshold, config.score_threshold, config.similarity_threshold)) -# f.write('Results: mAP--%.3f recall--%.3f precision--%.3f' % (mAP, recall, precision)) -# f.write('\n\n') -# f.close() -# # the inference function should be simplified for det only -# if config.vis_path: -# inference(model, Set, Loader, config.vis_path, config.iou_threshold, config.score_threshold, config.similarity_threshold) - - -def str2bool(v): - return v.lower() in ('true') - - -def get_eval_args_parser(): - parser = argparse.ArgumentParser() - - # ----------------- Eval Config - - parser.add_argument('--checkpoint', default='/fs01/home/afallah/Multimodal/pmc_dataset/process/log/checkpoint.pth', help='checkpoint to load') - parser.add_argument('--eval_file', default='/datasets/PMC-15M/experimental/figures.jsonl', help='dataset for evaluation') - parser.add_argument('--img_root', default='/datasets/PMC-15M/figures', help='root path for figures') - parser.add_argument('--rcd_file', default='./Inference/separation.jsonl', help='file to record') - parser.add_argument('--vis_path', default='./Inference/visualizations', help='file to record the visualizations') - parser.add_argument('--save_path', default='./Inference', help='path to save the visualizations') - - parser.add_argument('--model', default='baseline', type=str, help='baseline') - parser.add_argument('--resnet', type=int, default=34) - parser.add_argument('--pretrained_bert', type=str, default='PubMed_BERT') - - parser.add_argument('--platform', type=str, default='DBCloud') - parser.add_argument('--gpu', type=str, default='1') - - parser.add_argument('--task', type=str, default='sep', help='det, det_grid_search, align, align_grid_search, sep') - - parser.add_argument('--normalization', type=str2bool, default=False) - parser.add_argument('--val_batch_size', type=int, default=16) - - parser.add_argument('--name_by_f1', type=str2bool, default=True, help='name the visualization by f1 score') - parser.add_argument('--name_by_mAP', type=str2bool, default=True, help='name the visualization by mAP score') - - # ----------------- Eval Hyperparameters - - parser.add_argument('--iou_threshold', default=0.75, type=float) - parser.add_argument('--score_threshold', default=0.5, type=float) - parser.add_argument('--similarity_threshold', default=0.5, type=float) - - # ----------------- Model Structure - parser.add_argument('--enc_layers', default=4, type=int, - help="Number of encoding layers in the transformer") - parser.add_argument('--dec_layers', default=4, type=int, - help="Number of decoding layers in the transformer") - parser.add_argument('--txt_dec_layers', default=4, type=int, - help="Number of decoding layers in the text transformer") - parser.add_argument('--mlp_ratio', default=4, type=int, - help="Intermediate size of the feedforward layers in the transformer blocks") - parser.add_argument('--hidden_dim', default=256, type=int, - help="Size of the embeddings (dimension of the transformer)") - parser.add_argument('--dropout', default=0.0, type=float, - help="Dropout applied in the transformer") - parser.add_argument('--nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--text_nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--num_queries', default=32, type=int, - help="Number of query slots") - - config = parser.parse_args() - return config - - -def prepare_model_and_dataset(config): - torch.multiprocessing.set_sharing_strategy('file_system') - - # vocab_file = 'path to bert vocab.txt, needed to tokenize compound caption; not necessary for subfigure separation' - - # if 'det' in config.task: - # Set = Fig_Dataset(None, config.eval_file, config.img_root, vocab_file, config.normalization) - # Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_collate) - if 'sep' in config.task: - Set = Fig_Separation_Dataset(None, config.eval_file, config.img_root, config.normalization) - Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=fig_separation_collate) - # else: - # Set = FigCap_Dataset(None, config.eval_file, config.img_root, vocab_file, normalization=config.normalization) - # Loader = DataLoader(Set, batch_size=config.val_batch_size, shuffle=False, num_workers=2, collate_fn=figcap_collate) - - if config.model == 'baseline': - # export PYTHONPATH=/fs01/home/afallah/pmc-data-extraction:$PYTHONPATH - from openpmcvl.models.subfigure_detector import FigCap_Former - else: - print('Unsupported Model Type %s' % config.model) - exit() - - - model = FigCap_Former(num_query=config.num_queries, - num_encoder_layers=config.enc_layers, - num_decoder_layers=config.dec_layers, - feature_dim=config.hidden_dim, - atten_head_num=config.nheads, - mlp_ratio=config.mlp_ratio, - dropout=config.dropout, - activation='relu', - bert_path = '', #'/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert, - num_text_decoder_layers=config.txt_dec_layers, - text_atten_head_num=config.text_nheads, - text_mlp_ratio=config.mlp_ratio, - text_dropout=config.dropout, - text_activation='relu', - resnet=config.resnet, - resnet_pretrained=False) - os.environ["CUDA_VISIBLE_DEVICES"] = config.gpu - # model = nn.DataParallel(model) - model.cuda() - - checkpoint = torch.load(config.checkpoint, map_location='cpu') - state_dict = checkpoint['model_state_dict'] - model_dict = model.state_dict() - model_checkpoint = {k: v for k, v in state_dict.items()} - model_dict.update(model_checkpoint) - model.load_state_dict(model_dict, strict=False) - - cp_mAP = checkpoint['val_mAP'] if 'val_mAP' in checkpoint else 0 - cp_f1 = checkpoint['val_f1'] if 'val_f1' in checkpoint else 0 - - print('Load checkpoint from %s, epoch %d, val_mAP %.2f, val_F1 %.2f' % \ - (config.checkpoint, checkpoint['epoch'], cp_mAP, cp_f1)) - - return model, Set, Loader - - -if __name__ == '__main__': - config = get_eval_args_parser() - model, Set, Loader = prepare_model_and_dataset(config) - # if config.task == 'det': - # evaluate_det(model, Set, Loader, config.iou_threshold, config.score_threshold) - # elif config.task == 'det_grid_search': - # grid_search_det(config, model, Set, Loader) - # elif config.task == 'align': - # evaluate(config, model, Set, Loader, config.iou_threshold, config.score_threshold, config.similarity_threshold) - # elif config.task == 'align_grid_search': - # grid_search(config, model, Set, Loader) - if config.task == "sep": - separation(model, Loader, config.save_path, config.rcd_file, config.score_threshold, nms_threshold=0.4) - else: - print('Undefined Evaluation Task') \ No newline at end of file diff --git a/openpmcvl/granular/process/playground_subfigure_ocr.py b/openpmcvl/granular/process/playground_subfigure_ocr.py deleted file mode 100644 index 0454ced..0000000 --- a/openpmcvl/granular/process/playground_subfigure_ocr.py +++ /dev/null @@ -1,407 +0,0 @@ -""" -Pipeline to OCR the label of each subfig and align them with subcaptions -""" - -import yaml -import torch -from skimage import io -import numpy as np -import cv2 -from torch.autograd import Variable -from PIL import Image -import torch.nn.functional as F -import os -from tqdm import tqdm -import json - -from subfigure_ocr.models.yolov3 import * -from subfigure_ocr.models.network import * -from subfigure_ocr.separator import process - -SUBFIGURE_OCR_DIR = '/fs01/home/afallah/pmc-data-extraction/openpmcvl/process/subfigure_ocr' -INFERENCE_DIR = '/fs01/home/afallah/pmc-data-extraction/Inference' - -class classifier(): - def __init__(self): - # model_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/exsclaim/figures/' - configuration_file = f"{SUBFIGURE_OCR_DIR}/config/yolov3_default_subfig.cfg" - with open(configuration_file, 'r') as f: - configuration = yaml.load(f, Loader=yaml.FullLoader) - - self.image_size = configuration['TEST']['IMGSIZE'] - self.nms_threshold = configuration['TEST']['NMSTHRE'] - self.confidence_threshold = 0.0001 - self.dtype = torch.cuda.FloatTensor - self.device = torch.device('cuda') - - object_detection_model = YOLOv3(configuration['MODEL']) - self.object_detection_model = self.load_model_from_checkpoint(object_detection_model, "object_detection_model.pt") - ## Load text recognition model - text_recognition_model = resnet152() - self.text_recognition_model = self.load_model_from_checkpoint(text_recognition_model, 'text_recognition_model.pt') - - self.object_detection_model.eval() - self.text_recognition_model.eval() - - def load_model_from_checkpoint(self, model, model_name): - """ load checkpoint weights into model """ - checkpoints_path = f'{SUBFIGURE_OCR_DIR}/checkpoints/' #'/remote-home/zihengzhao/CompoundFigure/exsclaim/exsclaim/figures/checkpoints/' - checkpoint = checkpoints_path + model_name - model.load_state_dict(torch.load(checkpoint)) - # model = nn.DataParallel(model) - model.to(self.device) - return model - - def detect_subfigure_boundaries(self, figure_path): - """ Detects the bounding boxes of subfigures in figure_path - - Args: - figure_path: A string, path to an image of a figure - from a scientific journal - Returns: - subfigure_info (list of lists): Each inner list is - x1, y1, x2, y2, confidence - """ - - ## Preprocess the figure for the models - img = io.imread(figure_path) - if len(np.shape(img)) == 2: - img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB) - else: - img = cv2.cvtColor(img,cv2.COLOR_RGBA2RGB) - - img, info_img = process.preprocess(img, self.image_size, jitter=0) - img = np.transpose(img / 255., (2, 0, 1)) - img = np.copy(img) - img = torch.from_numpy(img).float().unsqueeze(0) - img = Variable(img.type(self.dtype)) - - img_raw = Image.open(figure_path).convert("RGB") - width, height = img_raw.size - - ## Run model on figure - with torch.no_grad(): - outputs = self.object_detection_model(img.to(self.device)) - outputs = process.postprocess(outputs, dtype=self.dtype, - conf_thre=self.confidence_threshold, nms_thre=self.nms_threshold) - - ## Reformat model outputs to display bounding boxes in our desired format - ## List of lists where each inner list is [x1, y1, x2, y2, confidence] - subfigure_info = list() - - if outputs[0] is None: - return subfigure_info - - for x1, y1, x2, y2, conf, cls_conf, cls_pred in outputs[0]: - box = process.yolobox2label([y1.data.cpu().numpy(), x1.data.cpu().numpy(), y2.data.cpu().numpy(), x2.data.cpu().numpy()], info_img) - box[0] = int(min(max(box[0],0),width-1)) - box[1] = int(min(max(box[1],0),height-1)) - box[2] = int(min(max(box[2],0),width)) - box[3] = int(min(max(box[3],0),height)) - # ensures no extremely small (likely incorrect) boxes are counted - small_box_threshold = 5 - if (box[2]-box[0] > small_box_threshold and - box[3]-box[1] > small_box_threshold): - box.append("%.3f"%(cls_conf.item())) - subfigure_info.append(box) - return subfigure_info - - def detect_subfigure_labels(self, figure_path, subfigure_info): - """ Uses text recognition to read subfigure labels from figure_path - - Note: - To get sensible results, should be run only after - detect_subfigure_boundaries has been run - Args: - figure_path (str): A path to the image (.png, .jpg, or .gif) - file containing the article figure - subfigure_info (list of lists): Details about bounding boxes - of each subfigure from detect_subfigure_boundaries(). Each - inner list has format [x1, y1, x2, y2, confidence] where - x1, y1 are upper left bounding box coordinates as ints, - x2, y2, are lower right, and confidence the models confidence - Returns: - subfigure_info (list of tuples): Details about bounding boxes and - labels of each subfigure in figure. Tuples for each subfigure are - (x1, y1, x2, y2, label) where x1, y1 are upper left x and y coord - divided by image width/height and label is the an integer n - meaning the label is the nth letter - concate_img (np.ndarray): A numpy array representing the figure. - Used in classify_subfigures. Ideally this will be removed to - increase modularity. - """ - img_raw = Image.open(figure_path).convert("RGB") - img_raw = img_raw.copy() - width, height = img_raw.size - binary_img = np.zeros((height,width,1)) - - detected_label_and_bbox = None - max_confidence = 0.0 - for subfigure in subfigure_info: - ## Preprocess the image for the model - bbox = tuple(subfigure[:4]) - img_patch = img_raw.crop(bbox) - img_patch = np.array(img_patch)[:,:,::-1] - img_patch, _ = process.preprocess(img_patch, 28, jitter=0) - img_patch = np.transpose(img_patch / 255., (2, 0, 1)) - img_patch = torch.from_numpy(img_patch).type(self.dtype).unsqueeze(0) - - ## Run model on figure - label_prediction = self.text_recognition_model(img_patch.to(self.device)) - label_confidence = np.amax(F.softmax(label_prediction, dim=1).data.cpu().numpy()) - x1,y1,x2,y2, box_confidence = subfigure - total_confidence = float(box_confidence)*label_confidence - if total_confidence < max_confidence: - continue - label_value = chr(label_prediction.argmax(dim=1).data.cpu().numpy()[0]+ord("a")) - if label_value == "z": - continue - # if (x2-x1) < 64 and (y2-y1)< 64: - detected_label_and_bbox = [label_value, x1,y1,x2,y2] - - return detected_label_and_bbox - - def run(self, figure_path): - subfigure_info = self.detect_subfigure_boundaries(figure_path) - subfigure_info = self.detect_subfigure_labels(figure_path, subfigure_info) - - return subfigure_info - - -def subfigure_ocr(): - """ - 提取subfigure的label信息 - """ - # 所有可以分出subcap的comfig - old_dict = {} - for i in range(10): - #TODO - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_part_%d/exsclaim.json'%i - with open(file_path, 'r') as f: - old_dict.update(json.load(f)) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - comfig_dict = {} - for datum in tqdm(data): - comfig_id = datum['id'] - comfig_dict[comfig_id] = {'h':datum['height'], 'w':datum['width']} - - model = classifier() - # root path to all subfigs - path = INFERENCE_DIR #'/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_subfigures/' - # all comfigs - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl') - lines = f.readlines() - comfig = [json.loads(line) for line in lines] - new_dict = {} - # for datum in tqdm(comfig[:100000]): - for datum in tqdm(comfig): - comfig_id = datum['comfig_id'] - if not (comfig_id in old_dict): # 只ocr那些caption可以被打开的结果 - continue - comfig_h = comfig_dict[comfig_id]['h'] - comfig_w = comfig_dict[comfig_id]['w'] - # 记录每个comfig的subfig信息(包含OCR - master_images=[] - for subfig, locs, scores in zip(datum['subfig_ids'], datum['subfig_locs'], datum['subfig_scores']): - label_info = model.run(path+subfig) - if label_info: - x1, y1, x2, y2 = locs - x1 = round(x1 * comfig_w) - x2 = round(x2 * comfig_w) - y1 = round(y1 * comfig_h) - y2 = round(y2 * comfig_h) - w = x2 - x1 - h = y2 - y1 - geometry = [{'x':x1, 'y':y1}, {'x':x1, 'y':y2}, {'x':x2, 'y':y1}, {'x':x2, 'y':y2}] - label, label_x1, label_y1, label_x2, label_y2 = label_info - label_geometry = [{'x':label_x1+x1, 'y':label_y1+y1}, {'x':label_x1+x1, 'y':label_y2+y1}, {'x':label_x2+x1, 'y':label_y1+y1}, {'x':label_x2+x1, 'y':label_y2+y1}] - subfig_label = {"text":label, "geometry":label_geometry} - master_images.append({ - 'classification':subfig, - 'confidence':scores, - 'height':h, 'width':w, - 'geometry':geometry, - "subfigure_label":subfig_label, - "scale_bars":[], - "caption": [], - "keywords": [], - "general": []}) - new_dict[comfig_id] = old_dict[comfig_id] - new_dict[comfig_id]['master_images'] = master_images - - # '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_ocr_subfig.json' - with open(f'{INFERENCE_DIR}/pmc2exsclaim_ocr_subfig.json', 'w', encoding="utf-8") as f: - json.dump(new_dict, f, indent=3) - -# change this file path for different subcaption separation method -def subfigure_ocr_link_exsclaim_subcap(): - """ - ocr之后的subfigure和subcaption合并到同一个exsclaim中 - """ - def are_same_text(t1, t2, tokenizer): - if t1 == t2: - return True - if t1[:-1] == t2: - return True - if t1 == t2[:-1]: - return True - if tokenizer.tokenize(t1) == tokenizer.tokenize(t2): - return True - else: - return False - from transformers import AutoTokenizer - tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' - with open(file_path, 'r') as f: - cap_dict = json.load(f) - - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim_no_subcaps.json' - with open(file_path, 'r') as f: - data_dict = json.load(f) - - """ - check = {} - for pmc_id, datum in tqdm(data_dict.items()): - check[pmc_id] = datum - if len(check) > 2: - break - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/check_before_link_subcaps.json', 'w', encoding="utf-8") as f: - json.dump(check, f, indent=3) - """ - - filtered_subcap = 0 - unfiltered_subcap = 0 - for pmc_id, datum in tqdm(data_dict.items()): - subcaps = [] - for subcap in cap_dict[pmc_id]['unassigned']['captions']: - if len(subcap["description"]) == 0: - # 没有 - continue - filtered_description = [] - for text in subcap["description"]: - # subcap中每一段不等于整个caption - if not are_same_text(text, datum['full_caption'], tokenizer): - filtered_description.append(text) - if len(filtered_description) == 0: - # 都过滤掉了 - continue - joint_subcap = " ".join(filtered_description) - if not are_same_text(joint_subcap, datum['full_caption'], tokenizer): - # subcap连在一起不等于整个caption - subcap["description"] = filtered_description - subcaps.append(subcap) - unfiltered_subcap += 1 - else: - filtered_subcap += 1 - data_dict[pmc_id]['unassigned']['captions'] = subcaps - - """ - check = {} - for pmc_id, datum in tqdm(data_dict.items()): - check[pmc_id] = datum - if len(check) > 2: - break - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/check_after_link_subcaps.json', 'w', encoding="utf-8") as f: - json.dump(check, f, indent=3) - """ - - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json', 'w', encoding="utf-8") as f: - json.dump(data_dict, f, indent=3) - -# 将/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json送入exsclaim的pipeline将subfig和subcap对齐 - -def ocr_replace_clip_alignment(): - """ - 将exsclaim输出的subfigure和subcaption对齐结果,替换掉CLIP的对齐结果 - """ - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json' - with open(file_path, 'r') as f: - ocr_dict = json.load(f) - - file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' - with open(file_path, 'r') as f: - lines = f.readlines() - data = [json.loads(line) for line in lines] - - new_data = [] - missing_comfig = abandon_1 = abandon_2 = replace = 0 - for datum in tqdm(data): - comfig_id = datum['comfig_id'] - old_subfig_ids = datum['subfig_ids'] - old_subcaptions = datum['subcaptions'] - old_subcap_indexes = datum['subcap_indexes'] - old_subcap_scores = datum['subcap_scores'] - new_subfig_ids = [] - new_subcap_indexes = [] - new_subcap_scores = [] - if comfig_id not in ocr_dict: - missing_comfig += 1 - continue - ocr_results = ocr_dict[comfig_id] - for subfig in ocr_results['master_images']: - if len(subfig['caption']) > 0: - if subfig['classification'] not in old_subfig_ids: - print('Subfig ID not found Error : ', subfig['classification']) - abandon_1 += 1 - continue - subcaption = " ".join(subfig['caption']) - if subcaption not in old_subcaptions: - print('Caption not found Error : ', subfig['classification']) - print('Subcaption : %s'% subcaption) - for i, tmp in enumerate(old_subcaptions): - print('Subcaption Option %d : %s \n', (i,tmp)) - abandon_2 += 1 - continue - # 有ocr匹配的subcaption结果, 而且可以替换进来 - new_subfig_ids.append(subfig['classification']) - new_subcap_indexes.append(old_subcaptions.index(subcaption)) - new_subcap_scores.append(1.0) - replace += 1 - for idx, subfig in enumerate(old_subfig_ids): - if subfig in new_subfig_ids: - # 已经用ocr的匹配结果替换掉了 - continue - else: - new_subfig_ids.append(subfig) - new_subcap_indexes.append(old_subcap_indexes[idx]) - new_subcap_scores.append(old_subcap_scores[idx]) - datum['subfig_ids'] = new_subfig_ids - datum['subcap_indexes'] = new_subcap_indexes - datum['subcap_scores'] = new_subcap_scores - new_data.append(datum) - - print('Missing comfig in exsclaim:', missing_comfig) - print('Missing subfigure id:', abandon_1) - print('Missing subcaption:', abandon_2) - print('Successfully replace:', replace) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(plus_ocr).jsonl', 'w') - for datum in tqdm(new_data): - f.write(json.dumps(datum)+'\n') - f.close() - - -# if __name__ == "__main__": -# file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' -# with open(file_path, 'r') as f: -# lines = f.readlines() -# data = [json.loads(line) for line in lines] - -# for datum in data: -# if datum['comfig_id'] == "PMC4608103_Fig2.jpg": -# for subcap in datum['subcaptions']: -# print(subcap, '\n') -# break - -# file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(new).jsonl' -# with open(file_path, 'r') as f: -# lines = f.readlines() -# data = [json.loads(line) for line in lines] - -# for datum in data: -# if datum['comfig_id'] == "PMC4608103_Fig2.jpg": -# print(datum['subcaption']) \ No newline at end of file diff --git a/openpmcvl/granular/process/pmc_oa.py b/openpmcvl/granular/process/pmc_oa.py deleted file mode 100644 index 74a88c1..0000000 --- a/openpmcvl/granular/process/pmc_oa.py +++ /dev/null @@ -1,139 +0,0 @@ -"""PMC-OA Dataset""" - -import os -import jsonlines - -import datasets - -logger = datasets.logging.get_logger(__name__) - -_CITATION = """\ -@article{lin2023pmc, - title={PMC-CLIP: Contrastive Language-Image Pre-training using Biomedical Documents}, - author={Lin, Weixiong and Zhao, Ziheng and Zhang, Xiaoman and Wu, Chaoyi and Zhang, Ya and Wang, Yanfeng and Xie, Weidi}, - journal={arXiv preprint arXiv:2303.07240}, - year={2023} -} -""" - -_DESCRIPTION = """\ -Foundation models trained on large-scale dataset gain a recent surge in CV and NLP. In contrast, development in biomedical domain lags far behind due to data scarcity. -To address this issue, we build and release PMC-OA, a biomedical dataset with 1.6M image-caption pairs collected from PubMedCentral's OpenAccess subset, which is 8 times larger than before. -PMC-OA covers diverse modalities or diseases, with majority of the image-caption samples aligned at finer-grained level, i.e., subfigure and subcaption. -While pretraining a CLIP-style model on PMC-OA, our model named PMC-CLIP achieves state-of-the-art results on various downstream tasks, -including image-text retrieval on ROCO, MedMNIST image classification, Medical VQA, i.e. +8.1% R@10 on image-text retrieval, +3.9% accuracy on image classification. -""" - -_HOMEPAGE = "https://weixionglin.github.io/PMC-CLIP/" - -_URLs = { - "images": "https://huggingface.co/datasets/axiong/pmc_oa/resolve/main/images.zip", - "pmc_oa_beta": "https://huggingface.co/datasets/axiong/pmc_oa/resolve/main/pmc_oa_beta.jsonl", - "pmc_oa": "https://huggingface.co/datasets/axiong/pmc_oa/resolve/main/pmc_oa.jsonl", -} - - -class PMC_OA_Config(datasets.BuilderConfig): - """BuilderConfig for PMC_OA""" - - def __init__(self, **kwargs): - """ - Args: - **kwargs: keyword arguments forwarded to super. - """ - super(PMC_OA_Config, self).__init__(version=datasets.Version("1.0.0", ""), **kwargs) - - -class PMC_OA(datasets.GeneratorBasedBuilder): - """PMC_OA Dataset""" - - VERSION = datasets.Version("1.0.0") - BUILDER_CONFIGS = [ - PMC_OA_Config( - name="pmc_oa_beta", - description=" pairs. Subfigures detected by a DETR model.", - ), - PMC_OA_Config( - name="pmc_oa", - description=" pairs. Subfigures detected by a DETR model. Subcaptions detected by ChatGPT and aligned with subfigures.", - ), - ] - - def _info(self): - if self.config.name == "pmc_oa_beta": - return datasets.DatasetInfo( - description=_DESCRIPTION, - features=datasets.Features( - { - "image": datasets.Value("string"), - "caption": datasets.Value("string"), - } - ), - supervised_keys=None, - citation=_CITATION, - homepage=_HOMEPAGE, - ) - elif self.config.name == "pmc_oa": - return datasets.DatasetInfo( - description=_DESCRIPTION, - features=datasets.Features( - { - "image": datasets.Value("string"), - "caption": datasets.Value("string"), - "alignment_type": datasets.Value("string"), - "alignment_score": datasets.Value("float"), - } - ), - supervised_keys=None, - citation=_CITATION, - homepage=_HOMEPAGE, - ) - - def _split_generators(self, dl_manager): - """Returns SplitGenerators.""" - downloaded_files = dl_manager.download_and_extract(_URLs) - if self.config.name == "pmc_oa_beta": - return [ - datasets.SplitGenerator( - name=datasets.Split.TRAIN, gen_kwargs={"filepath": downloaded_files["pmc_oa_beta"], "image_dir": downloaded_files['images']} - ) - ] - elif self.config.name == "pmc_oa": - return [ - datasets.SplitGenerator( - name=datasets.Split.TRAIN, gen_kwargs={"filepath": downloaded_files["pmc_oa"], "image_dir": downloaded_files['images']} - ) - ] - - def _generate_examples(self, filepath, image_dir): - """Yields examples.""" - logger.info("generating examples from = %s", filepath) - - with jsonlines.open(filepath) as reader: - for _id, obj in enumerate(reader): - if self.config.name == "pmc_oa_beta": - relative_image_path = obj['image'] - image_path = os.path.join(image_dir, "caption_T060_filtered_top4_sep_v0_subfigures", relative_image_path) - caption = obj['caption'] - yield _id, { - "image": { - "path": image_path, - "bytes": open(image_path, "rb").read(), - }, - "caption": caption, - } - elif self.config.name == "pmc_oa": - relative_image_path = obj['image'] - image_path = os.path.join(image_dir, "caption_T060_filtered_top4_sep_v0_subfigures", relative_image_path) - caption = obj['caption'] - alignment_type = obj['alignment_type'] - alignment_score = obj['alignment_score'] - yield _id, { - "image": { - "path": image_path, - "bytes": open(image_path, "rb").read(), - }, - "caption": caption, - "alignment_type": alignment_type, - "alignment_score": alignment_score, - } diff --git a/openpmcvl/granular/process/sh_files/search_bert_layers.sh b/openpmcvl/granular/process/sh_files/search_bert_layers.sh deleted file mode 100644 index 7d48188..0000000 --- a/openpmcvl/granular/process/sh_files/search_bert_layers.sh +++ /dev/null @@ -1,5 +0,0 @@ -python train.py --output_dir 'Log/ContinueAlign/Bert_Froze_8' --model baseline --detr_froze True --alignment_froze False --bert_froze_depth 8 --checkpoint 'Log/Detection/(0.837)Color_Flip_Aug/best_det.pth' --warmup 300 --lr 1e-5 --align_loss_coef 1.0 - -python train.py --output_dir 'Log/ContinueAlign/Bert_Froze_10' --model baseline --detr_froze True --alignment_froze False --bert_froze_depth 10 --checkpoint 'Log/Detection/(0.837)Color_Flip_Aug/best_det.pth' --warmup 300 --lr 1e-5 --align_loss_coef 1.0 --gpu 1 - -python train.py --output_dir 'Log/ContinueAlign/Bert_Froze_4' --model baseline --detr_froze True --alignment_froze False --bert_froze_depth 4 --checkpoint 'Log/Detection/(0.837)Color_Flip_Aug/best_det.pth' --warmup 300 --lr 1e-5 --align_loss_coef 1.0 --gpu 2 \ No newline at end of file diff --git a/openpmcvl/granular/process/sh_files/search_threshold.sh b/openpmcvl/granular/process/sh_files/search_threshold.sh deleted file mode 100644 index 8faf5d3..0000000 --- a/openpmcvl/granular/process/sh_files/search_threshold.sh +++ /dev/null @@ -1,10 +0,0 @@ -for iou_th in 0.95 0.9 0.8 0.75 0.7 0.65 0.6 0.55 0.5 - do - for score_th in 0.9 0.8 0.75 0.7 0.65 0.6 0.55 0.5 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 - do - for simi_th in 0.9 0.8 0.75 0.7 0.65 0.6 0.55 0.5 0.45 0.4 0.35 0.3 0.25 0.2 0.15 0.1 - do - python inference.py --model baseline --checkpoint Log/ContinueAlign/\(0.646\)newdataset_open_detection/best_valid.pth --iou_threshold $iou_th --score_threshold $score_th --similarity_threshold $simi_th --rcd_file Log/ContinueAlign/\(0.646\)newdataset_open_detection/grid_search_threshold.txt - done - done - done \ No newline at end of file diff --git a/openpmcvl/granular/process/subcaption.ipynb b/openpmcvl/granular/process/subcaption.ipynb deleted file mode 100644 index d125a80..0000000 --- a/openpmcvl/granular/process/subcaption.ipynb +++ /dev/null @@ -1,174 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 51, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n", - "┃\u001b[1;35m \u001b[0m\u001b[1;35mJob Config \u001b[0m\u001b[1;35m \u001b[0m┃\u001b[1;35m \u001b[0m\u001b[1;35mValue \u001b[0m\u001b[1;35m \u001b[0m┃\n", - "┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩\n", - "│\u001b[2;34m \u001b[0m\u001b[2;34mSlurm Job ID \u001b[0m\u001b[2;34m \u001b[0m│\u001b[34m \u001b[0m\u001b[34m13403958 \u001b[0m\u001b[34m \u001b[0m│\n", - "│\u001b[2m \u001b[0m\u001b[2mJob Name \u001b[0m\u001b[2m \u001b[0m│ Meta-Llama-3.1-8B-Instruct │\n", - "│\u001b[2m \u001b[0m\u001b[2mPartition \u001b[0m\u001b[2m \u001b[0m│ a40 │\n", - "│\u001b[2m \u001b[0m\u001b[2mNum Nodes \u001b[0m\u001b[2m \u001b[0m│ 1 │\n", - "│\u001b[2m \u001b[0m\u001b[2mGPUs per Node\u001b[0m\u001b[2m \u001b[0m│ 1 │\n", - "│\u001b[2m \u001b[0m\u001b[2mQOS \u001b[0m\u001b[2m \u001b[0m│ normal │\n", - "│\u001b[2m \u001b[0m\u001b[2mWalltime \u001b[0m\u001b[2m \u001b[0m│ 04:00:00 │\n", - "│\u001b[2m \u001b[0m\u001b[2mData Type \u001b[0m\u001b[2m \u001b[0m│ auto │\n", - "└───────────────┴────────────────────────────┘\n" - ] - } - ], - "source": [ - "!vec-inf launch llama-3.1 --model-variant=\"8B-Instruct\" --qos=\"normal\"" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Dataset size: 9568\n" - ] - }, - { - "data": { - "text/plain": [ - "{'PMC_ID': 'PMC193607',\n", - " 'media_id': 'pbio-0000031-g001',\n", - " 'caption': 'Electron micrograph of Proteobacteria in eukaryotic cell',\n", - " 'media_url': 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC193607/bin/pbio.0000031.g001.jpg',\n", - " 'media_name': 'PMC193607_pbio-0000031-g001.jpg'}" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from openai import OpenAI\n", - "client = OpenAI(base_url=\"http://gpu003:8080/v1\", api_key=\"EMPTY\")\n", - "\n", - "DATA_ROOT = '/datasets/PMC-15M'\n", - "SAMPLE_DATA = f'{DATA_ROOT}/0.jsonl'\n", - "\n", - "# Load sample jsonl file\n", - "with open(SAMPLE_DATA, 'r') as f:\n", - " dataset = [eval(line) for line in f]\n", - "\n", - "print(f\"Dataset size: {len(dataset)}\"); dataset[23]" - ] - }, - { - "cell_type": "code", - "execution_count": 295, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Length of prompt: 68, Length of caption: 272\n", - "\n", - " Affinity Purification of Emerin-Associated Proteins(A) Immunoblot of HeLa nuclear lysate proteins (L), or proteins affinity-purified using either BSA beads or emerin beads (see Materials and Methods), probed with antibody against actin.(B) HeLa nuclear lysate proteins (L) were immunoprecipitated using either immune (Im) or preimmune (PI) serum 2999 against emerin, resolved by SDS-PAGE, and Western blotted using antibodies specific for actin (upper panel) or emerin (lower panel), in succession.(C) Cosedimentation assays using F-actin and purified, recombinant wild-type emerin (residues 1–222). G-actin (2 μM) was polymerized and then incubated in the absence or presence of 2 μM emerin. Emerin was incubated alone in polymerization buffer as a negative control. After 30 min samples were centrifuged 1 h at 100,000g, resolved by SDS-PAGE, and stained with Coomassie blue. L, load (100%); S, supernatant (100%); P, pellet (100%).(D) F-actin column was used to determine the affinity of F-actin for emerin. The Kd was 480 nM for the experiment shown; range was 300–500 nM, n = 8.(E) Binding of wild-type (WT) or mutant emerin protein to F-actin beads. Recombinant emerin proteins were incubated with F-actin beads, and bound emerins were eluted with SDS-PAGE sample buffer, resolved by SDS-PAGE, blotted, and probed with antibodies against emerin (“bound”; all emerin mutants are recognized by this antibody; Lee et al. 2001; Holaska et al. 2003). The input amounts (10%) of each emerin mutant (“load”) were visualized either by immunoblotting (top row, top panel) or Coomassie staining (top row, bottom panel).(F) Domains in emerin required for binding to BAF, lamin A, transcription repressor GCL, or actin (Lee et al. 2001; Holaska et al. 2003; present study). Asterisks indicate EDMD disease-causing mutations.\n" - ] - } - ], - "source": [ - "SYSTEM_PROMPT = \"\"\"\n", - "Subfigure labels are letters referring to individual subfigures within a larger figure.\n", - "Check if the caption contains explicit subfigure label. \n", - "If not or there is only one subfigure, output \"NO\" and end the generation. \n", - "If yes, output \"YES\", then generate the subcaption of the subfigures according to the caption. \n", - "The output should use the template: Yes.\\n Subfigure-A: ... \\n Subfigure-B: ... \\n ......\n", - "The label should be removed from subcaption.\n", - "\"\"\".strip()\n", - "\n", - "# ================================================================================================================================================================================== #\n", - "\n", - "# SYSTEM_PROMPT = \"\"\"\n", - "# You are an expert in analyzing figure captions, breaking them into subcaptions.\n", - "# - Determine if the caption contains excplicit labeled subfigures (A, B, ...).\n", - "# - If one or zero subfigures, respond with \"NO\" and exit generation.\n", - "# - If more than one subfigures exist, respond with \"YES\" followed by:\n", - "# Subfigure-A: [Content for A, excluding label]\n", - "# Subfigure-B: [Content for B, excluding label]\n", - "# [Continue for additional subfigures]\n", - "# - If there was only one or zero subfigures, end with \"NONE\".\n", - "# \"\"\".strip()\n", - "\n", - "caption = dataset[1112]['caption'] #116 + 1002 #2575 #2100+3821 #2100+1015 #6125 #9476 #123 #4721 #2512 #5555 #12\n", - "\n", - "USER_PROMPT = f\"\"\"\n", - "Caption: \\n{caption}\n", - "\"\"\".strip()\n", - "\n", - "print(f\"Length of prompt: {len(SYSTEM_PROMPT.split(' '))}, Length of caption: {len(caption.split(' '))}\\n\\n {caption}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 296, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "YES.\n", - " Subfigure-A: Immunoblot of HeLa nuclear lysate proteins (L), or proteins affinity-purified using either BSA beads or emerin beads (see Materials and Methods), probed with antibody against actin.\n", - " Subfigure-B: HeLa nuclear lysate proteins (L) were immunoprecipitated using either immune (Im) or preimmune (PI) serum 2999 against emerin, resolved by SDS-PAGE, and Western blotted using antibodies specific for actin (upper panel) or emerin (lower panel), in succession.\n", - " Subfigure-C: Cosedimentation assays using F-actin and purified, recombinant wild-type emerin (residues 1–222). G-actin (2 μM) was polymerized and then incubated in the absence or presence of 2 μM emerin. Emerin was incubated alone in polymerization buffer as a negative control. After 30 min samples were centrifuged 1 h at 100,000g, resolved by SDS-PAGE, and stained with Coomassie blue. L, load (100%); S, supernatant (100%); P, pellet (100%).\n", - " Subfigure-D: F-actin column was used to determine the affinity of F-actin for emerin. The Kd was 480 nM for the experiment shown; range was 300–500 nM, n = 8.\n", - " Subfigure-E: Binding of wild-type (WT) or mutant emerin protein to F-actin beads. Recombinant emerin proteins were incubated with F-actin beads, and bound emerins were eluted with SDS-PAGE sample buffer, resolved by SDS-PAGE, blotted, and probed with antibodies against emerin (“bound”; all emerin mutants are recognized by this antibody; Lee et al. 2001; Holaska et al. 2003). The input amounts (10%) of each emerin mutant (“load”) were visualized either by immunoblotting (top row, top panel) or Coomassie staining (top row, bottom panel).\n", - " Subfigure-F: Domains in emerin required for binding to BAF, lamin A, transcription repressor GCL, or actin (Lee et al. 2001; Holaska et al. 2003; present study). Asterisks indicate EDMD\n" - ] - } - ], - "source": [ - "completion = client.chat.completions.create(\n", - " model=\"/model-weights/Meta-Llama-3.1-8B-Instruct\",\n", - " messages=[\n", - " {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n", - " {\"role\": \"user\", \"content\": USER_PROMPT},\n", - " ],\n", - " temperature=0,\n", - " max_tokens=500,\n", - ")\n", - "\n", - "print(completion.choices[0].message.content)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/openpmcvl/granular/process/subfigure.ipynb b/openpmcvl/granular/process/subfigure.ipynb deleted file mode 100644 index c8ddc52..0000000 --- a/openpmcvl/granular/process/subfigure.ipynb +++ /dev/null @@ -1,319 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import torch\n", - "import torch\n", - "from torchvision import transforms\n", - "from transformers import BertTokenizer\n", - "from PIL import Image, ImageDraw\n", - "import matplotlib.pyplot as plt\n", - "\n", - "ROOT = f\"{os.getcwd()}/pmc_dataset/process\"\n", - "MODEL_DIR = f\"{ROOT}/log/checkpoint.pth\"\n", - "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", - "\n", - "os.chdir(ROOT)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "DATA_ROOT = '/datasets/PMC-15M'\n", - "SAMPLE_DATA = f'{DATA_ROOT}/0.jsonl'\n", - "\n", - "# Load sample jsonl file\n", - "with open(SAMPLE_DATA, 'r') as f:\n", - " dataset = [eval(line) for line in f]\n", - "\n", - "sample = dataset[2323]\n", - "print(f\"Dataset size: {len(dataset)}\"); sample" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "checkpoint = torch.load(MODEL_DIR, map_location=device)\n", - "checkpoint.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "model_state_dict = checkpoint['model_state_dict']\n", - "print(model_state_dict.keys())" - ] - }, - { - "cell_type": "code", - "execution_count": 47, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 47, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from model_det_align import FigCap_Former\n", - "\n", - "model = FigCap_Former(\n", - " num_query=32,\n", - " num_encoder_layers=4,\n", - " num_decoder_layers=4,\n", - " num_text_decoder_layers=4,\n", - " bert_path='bert-base-uncased',\n", - " alignment_network=True,\n", - " resnet_pretrained=False,\n", - " resnet=34,\n", - " feature_dim=256, # Assuming this is the same as hidden_dim in the original code\n", - " atten_head_num=8, # Using the default from the original code\n", - " text_atten_head_num=8, # Using the default from the original code\n", - " mlp_ratio=4, # Using the default from the original code\n", - " dropout=0.0, # Using the default from the original code\n", - " activation='relu', # Using the default from the original code\n", - " text_mlp_ratio=4, # Using the default from the original code\n", - " text_dropout=0.0, # Using the default from the original code\n", - " text_activation='relu' # Using the default from the original code\n", - ")\n", - "model.load_state_dict(model_state_dict)\n", - "# print(model.state_dict().keys())\n", - "\n", - "# # model = nn.DataParallel(model)\n", - "# model.to(device)\n", - "# img = torch.rand(4, 3, 128, 128).to(device)\n", - "# text = torch.randint(1, 30000, (4, 100)).to(device)\n", - "# a, b, c = model(img, text)\n", - "# print(a.shape)\n", - "# print(a[0,0,0])\n", - "# print(b.shape)\n", - "# print(c.shape)\n", - "# print(c[0,0,0])" - ] - }, - { - "cell_type": "code", - "execution_count": 49, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Number of detected objects: 4\n", - "Detected bounding boxes:\n", - "tensor([[0.7457, 0.7347, 0.4850, 0.4815],\n", - " [0.7468, 0.2489, 0.4684, 0.4703],\n", - " [0.2493, 0.7392, 0.4782, 0.4746],\n", - " [0.2549, 0.2477, 0.4877, 0.4832]], device='cuda:0')\n", - "\n", - "Detection scores:\n", - "tensor([1.0000, 1.0000, 1.0000, 1.0000], device='cuda:0')\n", - "\n", - "Similarity scores shape: torch.Size([4, 157])\n" - ] - } - ], - "source": [ - "# 1. Prepare input data\n", - "# Image preprocessing\n", - "image_transform = transforms.Compose([\n", - " transforms.Resize((512, 512)),\n", - " transforms.ToTensor(),\n", - " transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n", - "])\n", - "\n", - "image_path = \"/datasets/PMC-15M/figures/PMC517716_F1.jpg/1471-2407-4-58-1.jpg\"\n", - "image = Image.open(image_path)\n", - "image_tensor = image_transform(image).unsqueeze(0) # Add batch dimension\n", - "\n", - "# Text preprocessing\n", - "tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')\n", - "caption = sample['caption'] # Assuming 'sample' is defined and contains the caption\n", - "text_tokens = tokenizer(caption, return_tensors=\"pt\", padding=True, truncation=True, max_length=512)\n", - "\n", - "# 2. Set up model for inference\n", - "model.eval()\n", - "model.to(device)\n", - "torch.set_grad_enabled(False)\n", - "\n", - "# 3. Run inference\n", - "image_tensor = image_tensor.to(device)\n", - "text_tokens = {k: v.to(device) for k, v in text_tokens.items()}\n", - "\n", - "output_det_class, output_box, similarity = model(image_tensor, text_tokens['input_ids'])\n", - "\n", - "# 4. Process outputs\n", - "detection_threshold = 0.5\n", - "positive_detections = output_det_class.squeeze() > detection_threshold\n", - "detected_boxes = output_box.squeeze()[positive_detections]\n", - "detected_similarities = similarity.squeeze()[positive_detections]\n", - "\n", - "# 5. Print results\n", - "print(\"Number of detected objects:\", positive_detections.sum().item())\n", - "print(\"Detected bounding boxes:\")\n", - "print(detected_boxes)\n", - "print(\"\\nDetection scores:\")\n", - "print(output_det_class.squeeze()[positive_detections])\n", - "print(\"\\nSimilarity scores shape:\", detected_similarities.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 50, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "image/png": "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v+Paa6+NmTNnxsiRIzP7FBYWxuzZs+PUU0/d5uz51q1bx7x58+L//u//omXLlts8r3PPPTdmzJgR/fr1i6FDh8bmzZvjqaeeimeffTa6du0aERFDhw6Nu+++O0477bS47LLL4rnnnouJEyfG66+/Hn/84x+LHW/p0qUxcODAGDFiRAwbNiwOOOCA2LBhQ/Ts2TM++OCDGDFiROy9996xcOHCGD16dHz00UcxZcqUiIh49NFHY+DAgfE///M/MWnSpIiIeP311+OZZ56Jiy++uNT6DzzwwLjnnnvi0ksvjZYtW2aWV2ncuHH8+9//jqOPPjreeuutGDlyZLRp0yZmzZoVZ599dqxevbrEMadPnx4bN26M4cOHR25ubnzrW9/a5rVLk5eXFyeffHLcdddd8dprr8VBBx0UEREjRozILBV00UUXxbJly+KWW26Jl156KZ555pmoUaNGTJkyJS688MLIy8uLq666KiIic/+U9TqW5XO95557YujQoXHYYYfF8OHDIyKibdu2qed0zTXXxLhx46J3795x3nnnxdKlS+NXv/pVvPDCC5nat/r000/juOOOi1NOOSW+973vxezZs+OKK66Ijh07Rr9+/b7WNQUAYBsSAAB2e3/961+T7OzsJDs7O+nRo0dy+eWXJ3Pnzk0KCwtL9G3dunUyePDgzPvp06cnEZH07ds3KSoqyrT36NEjycrKSn74wx9m2jZv3py0bNky6dmzZ7FjRkQyduzYEsdctmxZpm3Dhg0lahkxYkRSu3btZOPGjZm2nj17JhGRTJ06tUT/nj17Fhv7hRdeSCIimT59eom+PXr0SLp3716s7f77708iIpk/f36J/l921113JRGR5OTkJL169Uquvvrq5Kmnnkq2bNlSrN/jjz+eRERy0UUXlTjG1mu5ZMmSJCKSoUOHFtv+ox/9KImI5PHHH8+0tW7dOomIZM6cOcX6jh8/PqlTp07yz3/+s1j7lVdemWRnZyfvvfdekiRJcvHFFyf16tVLNm/evM3zK03r1q2T/v37F2ubMmVKEhHJb3/720xbYWFh0qNHjyQvLy9Zu3ZtkiRJsmzZsiQiknr16iUrVqz42uN92S9+8YskIpIHHnggSZIkeeqpp5KISO69995i/ebMmVOi/aCDDipxjyZJ2a9jWT7XJEmSOnXqFPsubfXV+3/FihVJTk5O0qdPn2L30C233JJERDJt2rRM29b7/ze/+U2mbdOmTUmzZs2SU089tcRY29K/f/+kdevW5doHAGBPZDkXAIA9wLHHHhuLFi2KE088MV5++eX4+c9/Hn379o0WLVrEgw8+WKZjnHvuucUegti9e/dIkiTOPffcTFt2dnZ07do1/vWvf5W7xi+v6/3ZZ5/Fxx9/HEceeWRs2LAh3njjjWJ9c3NzY8iQIeUe48sGDRoUzz33XLz99tuZtnvvvTdatWoVPXv23Oa+55xzTsyZMyeOPvroePrpp2P8+PFx5JFHxn777RcLFy7M9PvDH/4QWVlZMXbs2BLH2HotH3744YiIGDVqVLHtW2d8P/TQQ8Xa27RpE3379i3WNmvWrDjyyCOjYcOG8fHHH2devXv3ji1btsSTTz4ZERENGjSI9evXx6OPPrrN8yurhx9+OJo1axYDBw7MtNWoUSMuuuiiWLduXTzxxBPF+p966qnRuHHjChk7Ly8vIr64VyK+uAb169ePY489ttg16NKlS+Tl5ZXpYa9lvY5l+VzL47HHHovCwsK45JJLolq1//wTbdiwYVGvXr0S90BeXl6xteJzcnLisMMO+1rfOwAAtk+IDgCwh+jWrVvcf//98emnn8bzzz8fo0ePjs8++yxOO+20Mq1Nvffeexd7X79+/YiIaNWqVYn2L69BXVavvvpqnHzyyVG/fv2oV69eNG7cOBMUrlmzpljfFi1afOOHiJ5++umRm5sb9957b2aMv/zlL3HmmWeWKQjt27dvzJ07N1avXh1PPvlkXHDBBfHuu+/GCSeckHm46Ntvvx3Nmzff5rIl7777blSrVi323XffYu3NmjWLBg0axLvvvlusvU2bNiWO8eabb8acOXOicePGxV69e/eOiP887PT888+P/fffP/r16xctW7bM/DLg63r33Xdjv/32Kxb8RnyxBMzW7dur/etat25dRETUrVs3Ir64BmvWrIkmTZqUuA7r1q0r0wNfy3ody/K5lsfW63TAAQcUa8/JyYl99tmnxHVs2bJliXu0YcOGX+t7BwDA9lkTHQBgD5OTkxPdunWLbt26xf777x9DhgyJWbNmlTqr9suys7PL3J585cGi27N69ero2bNn1KtXL6699tpo27Zt1KxZM1588cW44oorSjzU8cuz1r+uhg0bxgknnBD33ntvjBkzJmbPnh2bNm0qNsO3LGrXrh1HHnlkHHnkkdGoUaMYN25cPPLIIzF48OByHaesM5hLO/eioqI49thj4/LLLy91n/333z8ivnjo6ZIlS2Lu3LnxyCOPxCOPPBLTp0+PQYMGlXgY6I5QEZ/bVq+88kpEROaXD0VFRdGkSZPML0W+qiwz4Mt6HStb2nexvN87AADKRogOALAH2/pgy48++qhS61iwYEF88skncf/998dRRx2VaV+2bNk3Ou72gulBgwbFd77znXjhhRfi3nvvjUMOOSTzkMqv46vXs23btjF37txYtWpV6qzl1q1bR1FRUbz55puZGdwREcuXL4/Vq1dH69attztu27ZtY926dZkZ09uSk5MTAwYMiAEDBkRRUVGcf/75cfvtt8fVV19dYjb89rRu3Tr+/ve/R1FRUbHZ6FuX3ylL7V/HunXr4o9//GO0atUqc83atm0bjz32WBxxxBHbDevT7ouyXseyfK7bGuertl6npUuXxj777JNpLywsjGXLlpXpcwUAYMexnAsAwB5g/vz5pc5S3boe91eXkdjZts6s/XKNhYWFcdttt32j49apUycivpjpXpp+/fpFo0aNYtKkSfHEE0+UeRb6vHnzSm3/6vU89dRTI0mSGDduXIm+W8/1+OOPj4iIKVOmFNs+efLkiIjo37//duv53ve+F4sWLYq5c+eW2LZ69erYvHlzRER88sknxbZVq1YtDj744IiI2LRp03bH+arjjz8+CgoKYubMmZm2zZs3x8033xx5eXnbXVv+6/j3v/8dZ511VqxatSquuuqqTFD9ve99L7Zs2RLjx48vsc/mzZuL3QN16tQp9Z4o63Usy+e6rXG+qnfv3pGTkxO//OUvi+1/1113xZo1a8p0DwAAsOOYiQ4AsAe48MILY8OGDXHyySdHu3btorCwMBYuXBgzZ86M/Pz8b/yQzm/q8MMPj4YNG8bgwYPjoosuiqysrLjnnnu+8fIUbdu2jQYNGsTUqVOjbt26UadOnejevXtmbe4aNWrEGWecEbfccktkZ2cXe0DmtnznO9+JNm3axIABA6Jt27axfv36eOyxx+LPf/5zdOvWLQYMGBAREb169YqzzjorfvnLX8abb74Zxx13XBQVFcVTTz0VvXr1ipEjR0anTp1i8ODBcccdd2SWtXn++efj7rvvjpNOOil69eq13Xp+/OMfx4MPPhgnnHBCnH322dGlS5dYv359/OMf/4jZs2fHO++8E40aNYqhQ4fGqlWr4phjjomWLVvGu+++GzfffHN07ty52Cz4sho+fHjcfvvtcfbZZ8fixYsjPz8/Zs+eHc8880xMmTIls1751/XBBx/Eb3/724j4Yvb5a6+9FrNmzYqCgoK47LLLYsSIEZm+PXv2jBEjRsTEiRNjyZIl0adPn6hRo0a8+eabMWvWrLjpppvitNNOi4iILl26xK9+9au47rrrYt99940mTZrEMcccU+brWJbPdes4jz32WEyePDmaN28ebdq0ie7du5c4z8aNG8fo0aNj3Lhxcdxxx8WJJ54YS5cujdtuuy26detW7iWGtuXvf/975mHCb731VqxZsyauu+66iIjo1KlT5t4FAOBLEgAAdnuPPPJIcs455yTt2rVL8vLykpycnGTfffdNLrzwwmT58uXF+rZu3ToZPHhw5v306dOTiEheeOGFYv3Gjh2bRESycuXKYu2DBw9O6tSpU6wtIpKxY8eWOOayZcsybc8880zy7W9/O6lVq1bSvHnz5PLLL0/mzp2bREQyf/78TL+ePXsmBx10UKnn2bNnz6Rnz57F2h544IGkffv2SfXq1ZOISKZPn15s+/PPP59ERNKnT59Sj1ma3/3ud8kZZ5yRtG3bNqlVq1ZSs2bNpH379slVV12VrF27tljfzZs3J9dff33Srl27JCcnJ2ncuHHSr1+/ZPHixZk+n3/+eTJu3LikTZs2SY0aNZJWrVolo0ePTjZu3FjsWK1bt0769+9fak2fffZZMnr06GTfffdNcnJykkaNGiWHH354csMNNySFhYVJkiTJ7Nmzkz59+iRNmjRJcnJykr333jsZMWJE8tFHH233nNPGXr58eTJkyJCkUaNGSU5OTtKxY8cS13jZsmVJRCTXX3/9dsf58ngRkUREkpWVldSrVy856KCDkmHDhiXPPfdc6n533HFH0qVLl6RWrVpJ3bp1k44dOyaXX3558uGHH2b6FBQUJP3790/q1q2bRESxe6Ys1zFJyva5vvHGG8lRRx2V1KpVK4mIzPeqtPs/SZLklltuSdq1a5fUqFEjadq0aXLeeecln376abE+aff/4MGDk9atW2/3um4du7TXl7/3AAD8R1aSePoMAAB7rpdffjk6d+4cv/nNb+Kss86q7HIAAIAqxproAADs0e68887I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ACCFEB0AAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBAAAAACCFEB0AAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBAAAAACCFEB0AAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBAAAAACCFEB0AAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBAAAAACCFEB0AAAAAAFII0QEAAAAAIMXXCtE3b94cjz32WNx+++3x2WefRUTEhx9+GOvWravQ4gAAAAAAoDJVL+8O7777bhx33HHx3nvvxaZNm+LYY4+NunXrxqRJk2LTpk0xderUHVEnAAAAAADsdOWeiX7xxRdH165d49NPP41atWpl2k8++eSYN29ehRYHAAAAAACVqdwz0Z966qlYuHBh5OTkFGvPz8+PDz74oMIKAwAAAACAylbumehFRUWxZcuWEu3/93//F3Xr1q2QogAAAAAAoCood4jep0+fmDJlSuZ9VlZWrFu3LsaOHRvHH398RdYGAAAAAACVqtzLudxwww1x3HHHRfv27WPjxo3x/e9/P958881o1KhR/O53v9sRNQIAAAAAQKUod4jeqlWrePnll2PmzJnx8ssvx7p16+Lcc8+NM888s9iDRgEAAAAAYFdXrhD9888/j3bt2sVf/vKXOPPMM+PMM8/cUXUBAAAAAEClK9ea6DVq1IiNGzfuqFoAAAAAAKBKKfeDRS+44IKYNGlSbN68eUfUAwAAAAAAVUa5Q/QXXngh7r///th7772jb9++ccoppxR7ldett94a+fn5UbNmzejevXs8//zz2+y/evXquOCCC2KvvfaK3Nzc2H///ePhhx8u97gAAAAAALA95X6waIMGDeLUU0+tkMFnzpwZo0aNiqlTp0b37t1jypQp0bdv31i6dGk0adKkRP/CwsI49thjo0mTJjF79uxo0aJFvPvuu9GgQYMKqQcAAAAAAL6s3CH69OnTK2zwyZMnx7Bhw2LIkCERETF16tR46KGHYtq0aXHllVeW6D9t2rRYtWpVLFy4MGrUqBEREfn5+RVWDwAAAAAAfFm5l3PZauXKlfH000/H008/HStXriz3/oWFhbF48eLo3bv3f4qpVi169+4dixYtKnWfBx98MHr06BEXXHBBNG3aNDp06BATJkyILVu2fN3TAAAAAACAVOUO0devXx/nnHNO7LXXXnHUUUfFUUcdFc2bN49zzz03NmzYUObjfPzxx7Fly5Zo2rRpsfamTZtGQUFBqfv861//itmzZ8eWLVvi4YcfjquvvjpuvPHGuO6661LH2bRpU6xdu7bYCwAAAAAAyqLcIfqoUaPiiSeeiD//+c+xevXqWL16dTzwwAPxxBNPxGWXXbYjaswoKiqKJk2axB133BFdunSJ008/Pa666qqYOnVq6j4TJ06M+vXrZ16tWrXaoTUCAAAAALD7KHeI/oc//CHuuuuu6NevX9SrVy/q1asXxx9/fNx5550xe/bsMh+nUaNGkZ2dHcuXLy/Wvnz58mjWrFmp++y1116x//77R3Z2dqbtwAMPjIKCgigsLCx1n9GjR8eaNWsyr/fff7/MNQIAAAAAsGcrd4i+YcOGEkuwREQ0adKkXMu55OTkRJcuXWLevHmZtqKiopg3b1706NGj1H2OOOKIeOutt6KoqCjT9s9//jP22muvyMnJKXWf3NzcTNi/9QUAAAAAAGVR7hC9R48eMXbs2Ni4cWOm7d///neMGzcuNfxOM2rUqLjzzjvj7rvvjtdffz3OO++8WL9+fQwZMiQiIgYNGhSjR4/O9D/vvPNi1apVcfHFF8c///nPeOihh2LChAlxwQUXlPc0AAAAAABgu6qXd4ebbrop+vbtGy1btoxOnTpFRMTLL78cNWvWjLlz55brWKeffnqsXLkyxowZEwUFBdG5c+eYM2dOZqb7e++9F9Wq/Sfnb9WqVcydOzcuvfTSOPjgg6NFixZx8cUXxxVXXFHe0wAAAAAAgO0qd4jeoUOHePPNN+Pee++NN954IyIiBg4cGGeeeWbUqlWr3AWMHDkyRo4cWeq2BQsWlGjr0aNHPPvss+UeBwAAAAAAyqvcIXpERO3atWPYsGEVXQsAAAAAAFQp5V4TfeLEiTFt2rQS7dOmTYtJkyZVSFEAAAAAAFAVlDtEv/3226Ndu3Yl2g866KCYOnVqhRQFAAAAAABVQblD9IKCgthrr71KtDdu3Dg++uijCikKAAAAAACqgnKH6K1atYpnnnmmRPszzzwTzZs3r5CiAAAAAACgKij3g0WHDRsWl1xySXz++edxzDHHRETEvHnz4vLLL4/LLruswgsEAAAAAIDKUu4Q/cc//nF88skncf7550dhYWFERNSsWTOuuOKKGD16dIUXCAAAAAAAlaXcIXpWVlZMmjQprr766nj99dejVq1asd9++0Vubu6OqA8AAAAAACpNuddE3yovLy+6desWdevWjbfffjuKiooqsi4AAAAAAKh0ZQ7Rp02bFpMnTy7WNnz48Nhnn32iY8eO0aFDh3j//fcrvEAAAAAAAKgsZQ7R77jjjmjYsGHm/Zw5c2L69Onxm9/8Jl544YVo0KBBjBs3bocUCQAAAAAAlaHMa6K/+eab0bVr18z7Bx54IL7zne/EmWeeGREREyZMiCFDhlR8hQAAAAAAUEnKPBP93//+d9SrVy/zfuHChXHUUUdl3u+zzz5RUFBQsdUBAAAAAEAlKnOI3rp161i8eHFERHz88cfx6quvxhFHHJHZXlBQEPXr16/4CgEAAAAAoJKUeTmXwYMHxwUXXBCvvvpqPP7449GuXbvo0qVLZvvChQujQ4cOO6RIAAAAAACoDGUO0S+//PLYsGFD3H///dGsWbOYNWtWse3PPPNMDBw4sMILBAAAAACAylLmEL1atWpx7bXXxrXXXlvq9q+G6gAAAAAAsKsr85roAAAAAACwpxGiAwAAAABACiE6AAAAAACkEKIDAAAAAECKcofo8+fP3xF1AAAAAABAlVPuEP24446Ltm3bxnXXXRfvv//+jqgJAAAAAACqhHKH6B988EGMHDkyZs+eHfvss0/07ds3/t//+39RWFi4I+oDAAAAAIBKU+4QvVGjRnHppZfGkiVL4rnnnov9998/zj///GjevHlcdNFF8fLLL++IOgEAAAAAYKf7Rg8WPfTQQ2P06NExcuTIWLduXUybNi26dOkSRx55ZLz66qsVVSMAAAAAAFSKrxWif/755zF79uw4/vjjo3Xr1jF37ty45ZZbYvny5fHWW29F69at47vf/W5F1woAAAAAADtV9fLucOGFF8bvfve7SJIkzjrrrPj5z38eHTp0yGyvU6dO3HDDDdG8efMKLRQAAAAAAHa2cofor732Wtx8881xyimnRG5ubql9GjVqFPPnz//GxQEAAAAAQGUq93IuY8eOje9+97slAvTNmzfHk08+GRER1atXj549e1ZMhQAAAAAAUEnKHaL36tUrVq1aVaJ9zZo10atXrwopCgAAAAAA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AAAApBCiAwAAAABACiE6AAAAAACkEKIDAAAAAEAKIToAAAAAAKQQogMAAAAAQAohOgAAAAAApBCiAwAAAABACiE6AAAAAACkEKIDAAAAAEAKIToAAAAAAKQQogMAAAAAQAohOgAAAAAApBCiAwAAAABACiE6AAAAAACkEKIDAAAAAEAKIToAAAAAAKQQogMAAAAAQAohOgAAAAAApBCiAwAAAABACiE6AAAAAACkqBIh+q233hr5+flRs2bN6N69ezz//POpfe+888448sgjo2HDhtGwYcPo3bv3NvsDAAAAAMDXVekh+syZM2PUqFExduzYePHFF6NTp07Rt2/fWLFiRan9FyxYEAMHDoz58+fHokWLolWrVtGnT5/44IMPdnLlAAAAAADs7io9RJ88eXIMGzYshgwZEu3bt4+pU6dG7dq1Y9q0aaX2v/fee+P888+Pzp07R7t27eLXv/51FBUVxbx583Zy5QAAAAAA7O4qNUQvLCyMxYsXR+/evTNt1apVi969e8eiRYvKdIwNGzbE559/Ht/61rdK3b5p06ZYu3ZtsRcAAAAAAJRFpYboH3/8cWzZsiWaNm1arL1p06ZRUFBQpmNcccUV0bx582JB/JdNnDgx6tevn3m1atXqG9cNAAAAAMCeodKXc/km/vd//zd+//vfxx//+MeoWbNmqX1Gjx4da9asybzef//9nVwlAAAAAAC7quqVOXijRo0iOzs7li9fXqx9+fLl0axZs23ue8MNN8T//u//xmOPPRYHH3xwar/c3NzIzc2tkHoBAAAAANizVOpM9JycnOjSpUuxh4JufUhojx49Uvf7+c9/HuPHj485c+ZE165dd0apAAAAAADsgSp1JnpExKhRo2Lw4MHRtWvXOOyww2LKlCmxfv36GDJkSEREDBo0KFq0aBETJ06MiIhJkybFmDFj4r777ov8/PzM2ul5eXmRl5dXaecBAAAAAMDup9JD9NNPPz1WrlwZY8aMiYKCgujcuXPMmTMn87DR9957L6pV+8+E+V/96ldRWFgYp512WrHjjB07Nq655pqdWToAAAAAALu5Sg/RIyJGjhwZI0eOLHXbggULir1/5513dnxBAAAAAAAQlbwmOgAAAAAAVGVCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASCFEBwAAAACAFEJ0AAAAAABIIUQHAAAAAIAUQnQAAAAAAEghRAcAAAAAgBRCdAAAAAAASFElQvRbb7018vPzo2bNmtG9e/d4/vnnt9l/1qxZ0a5du6hZs2Z07NgxHn744Z1UKQAAAAAAe5JKD9FnzpwZo0aNirFjx8aLL74YnTp1ir59+8aKFStK7b9w4cIYOHBgnHvuufHSSy/FSSedFCeddFK88sorO7lyAAAAAAB2d5Ueok+ePDmGDRsWQ4YMifbt28fUqVOjdu3aMW3atFL733TTTXHcccfFj3/84zjwwANj/Pjxceihh8Ytt9yykysHAAAAAGB3V6khemFhYSxevDh69+6daatWrVr07t07Fi1aVOo+ixYtKtY/IqJv376p/QEAAAAA4OuqXpmDf/zxx7Fly5Zo2rRpsfamTZvGG2+8Ueo+BQUFpfYvKCgotf+mTZti06ZNmfdr1qyJiIi1a9d+k9J3eUWbNpTavvW6pG3f2uebbv8mNVRUjVWhhh1ZY1WoYVeosSrU4J7euTVWhRp2hRqrQg2++7tODbtCjVWhhl2hxqpQg+/+rlPDrlBjVahhV6ixKtSwK9RYFWrwM3LXqWFXqLEq1LAr1FgVatgZ3/091dZzT5Jkm/2yku312IE+/PDDaNGiRSxcuDB69OiRab/88svjiSeeiOeee67EPjk5OXH33XfHwIEDM2233XZbjBs3LpYvX16i/zXXXBPjxo3bMScAAAAAAMAu7f3334+WLVumbq/UmeiNGjWK7OzsEuH38uXLo1mzZqXu06xZs3L1Hz16dIwaNSrzvqioKFatWhX/9V//FVlZWd/wDAAAAAAA2BUlSRKfffZZNG/efJv9KjVEz8nJiS5dusS8efPipJNOiogvQu558+bFyJEjS92nR48eMW/evLjkkksybY8++mixmexflpubG7m5ucXaGjRoUBHlAwAAAACwC6tfv/52+1RqiB4RMWrUqBg8eHB07do1DjvssJgyZUqsX78+hgwZEhERgwYNihYtWsTEiRMjIuLiiy+Onj17xo033hj9+/eP3//+9/G3v/0t7rjjjso8DQAAAAAAdkOVHqKffvrpsXLlyhgzZkwUFBRE586dY86cOZmHh7733ntRrVq1TP/DDz887rvvvvjpT38aP/nJT2K//faLP/3pT9GhQ4fKOgUAAAAAAHZTlfpgUQAAoKR33nkn2rRpEy+99FJ07ty5ssspl125dgAAKE217XcBAADKKysra5uva665prJLLOHoo48u9uwhAACgCiznAgAAu6OPPvoo898zZ86MMWPGxNKlSzNteXl5lVEWAABQTmaiAwDADtCsWbPMq379+pGVlZV536RJk5g8eXK0bNkycnNzM88FSrNly5Y455xzol27dvHee+9FRMQDDzwQhx56aNSsWTP22WefGDduXGzevDmzT1ZWVvz617+Ok08+OWrXrh377bdfPPjgg+U6h/z8/JgwYUKcc845Ubdu3dh7773jjjvuKNbn+eefj0MOOSRq1qwZXbt2jZdeeqnEcV555ZXo169f5OXlRdOmTeOss86Kjz/+OCIiFixYEDk5OfHUU09l+v/85z+PJk2axPLly8tVLwAA7AhCdAAA2MluuummuPHGG+OGG26Iv//979G3b9848cQT48033yzRd9OmTfHd7343lixZEk899VTsvffe8dRTT8WgQYPi4osvjtdeey1uv/32mDFjRvzsZz8rtu+4cePie9/7Xvz973+P448/Ps4888xYtWpVuWq98cYbM+H4+eefH+edd15mRv26devihBNOiPbt28fixYvjmmuuiR/96EfF9l+9enUcc8wxccghh8Tf/va3mDNnTixfvjy+973vRcR/lpA566yzYs2aNfHSSy/F1VdfHb/+9a+jadOm5aoVAAB2BCE6AADsZDfccENcccUVccYZZ8QBBxwQkyZNis6dO8eUKVOK9Vu3bl30798/Vq5cGfPnz4/GjRtHxBfh+JVXXhmDBw+OffbZJ4499tgYP3583H777cX2P/vss2PgwIGx7777xoQJE2LdunXx/PPPl6vW448/Ps4///zYd99944orrohGjRrF/PnzIyLivvvui6KiorjrrrvioIMOihNOOCF+/OMfF9v/lltuiUMOOSQmTJgQ7dq1i0MOOSSmTZsW8+fPj3/+858REXHddddFw4YNY/jw4fGDH/wgBg8eHCeeeGK56gQAgB3FmugAALATrV27Nj788MM44ogjirUfccQR8fLLLxdrGzhwYLRs2TIef/zxqFWrVqb95ZdfjmeeeabYzPMtW7bExo0bY8OGDVG7du2IiDj44IMz2+vUqRP16tWLFStWlKveLx9j65I0W4/x+uuvx8EHHxw1a9bM9OnRo0ex/V9++eWYP39+qWvAv/3227H//vtHTk5O3HvvvXHwwQdH69at4xe/+EW5agQAgB1JiA4AAFXU8ccfH7/97W9j0aJFccwxx2Ta161bF+PGjYtTTjmlxD5fDrRr1KhRbFtWVlYUFRWVq4Zveox169bFgAEDYtKkSSW27bXXXpn/XrhwYURErFq1KlatWhV16tQpV50AALCjCNEBAGAnqlevXjRv3jyeeeaZ6NmzZ6b9mWeeicMOO6xY3/POOy86dOgQJ554Yjz00EOZ/oceemgsXbo09t13351a+1cdeOCBcc8998TGjRsz4f2zzz5brM+hhx4af/jDHyI/Pz+qVy/9nx9vv/12XHrppXHnnXfGzJkzY/DgwfHYY49FtWpWnwQAoPL5WykAAOxkP/7xj2PSpEkxc+bMWLp0aVx55ZWxZMmSuPjii0v0vfDCC+O6666LE044IZ5++umIiBgzZkz85je/iXHjxsWrr74ar7/+evz+97+Pn/70pzv1PL7//e9HVlZWDBs2LF577bV4+OGH44YbbijW54ILLohVq1bFwIED44UXXoi333475s6dG0OGDIktW7bEli1b4gc/+EH07ds3hgwZEtOnT4+///3vceONN+7UcwEAgDRmogMAwE520UUXxZo1a+Kyyy6LFStWRPv27ePBBx+M/fbbr9T+l1xySRQVFcXxxx8fc+bMib59+8Zf/vKXuPbaa2PSpElRo0aNaNeuXQwdOnSnnkdeXl78+c9/jh/+8IdxyCGHRPv27WPSpElx6qmnZvpsnXV/xRVXRJ8+fWLTpk3RunXrOO6446JatWoxfvz4ePfdd+Mvf/lLRHyxxMsdd9wRAwcOjD59+kSnTp126jkBAMBXZSVJklR2EQAAAAAAUBVZzgUAAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBAAAAACCFEB0AAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBAAAAACCFEB0AAAAAAFII0QEAAAAAIIUQHQAAAAAAUgjRAQAAAAAghRAdAAAAAABSCNEBACgmPz8/zj777Ao9ZlZWVlxzzTWZ9zNmzIisrKx45513KnSco48+Oo4++ugKPSZfWLduXQwdOjSaNWsWWVlZcckll1R2SbusHXX/AwCwYwjRAQD2EP/4xz/itNNOi9atW0fNmjWjRYsWceyxx8bNN99c2aXtMB9++GFcc801sWTJkgo/9tNPPx39+vWLFi1aRM2aNWPvvfeOAQMGxH333VfhY1UFEyZMiBkzZsR5550X99xzT5x11lk7dLz8/PzIysqKrKysqFatWjRo0CA6duwYw4cPj+eee+4bHfu2226LGTNmVEyh2zBhwoT405/+tMPHKasNGzbErbfeGn369Im99tor6tatG4ccckj86le/ii1btlR2eQAAVVZWkiRJZRcBAMCOtXDhwujVq1fsvffeMXjw4GjWrFm8//778eyzz8bbb78db731Vqbvpk2bolq1alGjRo0KG3/jxo1RvXr1qF69ekR8MRN3yJAhsWzZssjPz6+wcQoLCyMiIicnJyIi/va3v0W3bt1i+vTpFTq7ftasWXH66adH586d44wzzoiGDRvGsmXL4sknn4waNWrE/PnzK2ysquLb3/52VK9ePZ5++umdMl5+fn40bNgwLrvssoiI+Oyzz+L111+PWbNmRUFBQVx66aUxefLkr3XsDh06RKNGjWLBggUVWHFJeXl5cdppp5UI7Lds2RKff/555ObmRlZW1g6t4cteeeWVOPjgg+N//ud/ok+fPlGvXr2YO3du/PGPf4xBgwbF3XffvdNqAQDYlVSv7AIAANjxfvazn0X9+vXjhRdeiAYNGhTbtmLFimLvc3NzK3z8mjVrVvgxv2zDhg1Ru3btTHi+o11zzTXRvn37ePbZZ0uM+dXruSMlSRIbN26MWrVq7fCxVqxYEe3bt6+w423evDmKioq2+Zm1aNEifvCDHxRrmzRpUnz/+9+PX/ziF7HffvvFeeedV2E17SzZ2dmRnZ2908dt1qxZ/OMf/4iDDjoo0zZixIg455xzYvr06XH11VfHvvvuu9PrAgCo6iznAgCwB3j77bfjoIMOKhGgR0Q0adKk2Puvrom+df3mp59+Oi666KJo3LhxNGjQIEaMGBGFhYWxevXqGDRoUDRs2DAaNmwYl19+eXz1f3b86propXnggQeif//+0bx588jNzY22bdvG+PHjSywzcfTRR0eHDh1i8eLFcdRRR0Xt2rXjJz/5SWbb1jXRFyxYEN26dYuIiCFDhmSWBpkxY0aMHTs2atSoEStXrixRx/Dhw6NBgwaxcePG1Frffvvt6NatW6kB8FevZ1FRUdx0003RsWPHqFmzZjRu3DiOO+64+Nvf/pbps3nz5hg/fny0bds2cnNzIz8/P37yk5/Epk2bih0rPz8/TjjhhJg7d2507do1atWqFbfffntERKxevTouueSSaNWqVeTm5sa+++4bkyZNiqKiomLH+P3vfx9dunSJunXrRr169aJjx45x0003pZ7rggULIisrK5YtWxYPPfRQ5jpuXc97xYoVce6550bTpk2jZs2a0alTpxIzmt95553IysqKG264IaZMmZI5z9deey113DS1atWKe+65J771rW/Fz372s2L3WlFRUUyZMiUOOuigqFmzZjRt2jRGjBgRn376abFr+Oqrr8YTTzyROZcvr6Nf1uu4vc81Kysr1q9fH3fffXdmnK3fq7Q10W+77bY46KCDIjc3N5o3bx4XXHBBrF69ulifrff/a6+9Fr169YratWtHixYt4uc///l2r12jRo2KBehbnXzyyRER8frrr2/3GAAAeyIz0QEA9gCtW7eORYsWxSuvvBIdOnT4Wse48MILo1mzZjFu3Lh49tln44477ogGDRrEwoULY++9944JEybEww8/HNdff3106NAhBg0aVK7jz5gxI/Ly8mLUqFGRl5cXjz/+eIwZMybWrl0b119/fbG+n3zySfTr1y/OOOOM+MEPfhBNmzYtcbwDDzwwrr322hgzZkwMHz48jjzyyIiIOPzww+O///u/49prr42ZM2fGyJEjM/sUFhbG7Nmz49RTT93m7PnWrVvHvHnz4v/+7/+iZcuW2zyvc889N2bMmBH9+vWLoUOHxubNm+Opp56KZ599Nrp27RoREUOHDo277747TjvttLjsssviueeei4kTJ8brr78ef/zjH4sdb+nSpTFw4MAYMWJEDBs2LA444IDYsGFD9OzZMz744IMYMWJE7L333rFw4cIYPXp0fPTRRzFlypSIiHj00Udj4MCB8T//8z8xadKkiPgiOH3mmWfi4osvLrX+Aw88MO6555649NJLo2XLlpnlVRo3bhz//ve/4+ijj4633norRo4cGW3atIlZs2bF2WefHatXry5xzOnTp8fGjRtj+PDhkZubG9/61re2ee3S5OXlxcknnxx33XVXvPbaa5lgeMSIEZmlgi666KJYtmxZ3HLLLfHSSy/FM888EzVq1IgpU6bEhRdeGHl5eXHVVVdFRGTun7Jex7J8rvfcc08MHTo0DjvssBg+fHhERLRt2zb1nK655poYN25c9O7dO84777xYunRp/OpXv4oXXnghU/tWn376aRx33HFxyimnxPe+972YPXt2XHHFFdGxY8fo169fua9nQUFBRHwRsgMAUIoEAIDd3l//+tckOzs7yc7OTnr06JFcfvnlydy5c5PCwsISfVu3bp0MHjw483769OlJRCR9+/ZNioqKMu09evRIsrKykh/+8IeZts2bNyctW7ZMevbsWeyYEZGMHTu2xDGXLVuWaduwYUOJWkaMGJHUrl072bhxY6atZ8+eSUQkU6dOLdG/Z8+excZ+4YUXkohIpk+fXqJvjx49ku7duxdru//++5OISObPn1+i/5fdddddSUQkOTk5Sa9evZKrr746eeqpp5ItW7YU6/f4448nEZFcdNFFJY6x9VouWbIkiYhk6NChxbb/6Ec/SiIiefzxxzNtrVu3TiIimTNnTrG+48ePT+rUqZP885//LNZ+5ZVXJtnZ2cl7772XJEmSXHzxxUm9evWSzZs3b/P8StO6deukf//+xdqmTJmSRETy29/+NtNWWFiY9OjRI8nLy0vWrl2bJEmSLFu2LImIpF69esmKFSu+9nhf9otf/CKJiOSBBx5IkiRJnnrqqSQiknvvvbdYvzlz5pRoP+igg0rco0lS9utYls81SZKkTp06xb5LW331/l+xYkWSk5OT9OnTp9g9dMsttyQRkUybNi3TtvX+/81vfpNp27RpU9KsWbPk1FNPLTHW9mzatClp37590qZNm+Tzzz8v9/4AAHsCy7kAAOwBjj322Fi0aFGceOKJ8fLLL8fPf/7z6Nu3b7Ro0SIefPDBMh3j3HPPLfYQxO7du0eSJHHuuedm2rKzs6Nr167xr3/9q9w1fnld788++yw+/vjjOPLII2PDhg3xxhtvFOubm5sbQ4YMKfcYXzZo0KB47rnn4u2338603XvvvdGqVavo2bPnNvc955xzYs6cOXH00UfH008/HePHj48jjzwy9ttvv1i4cGGm3x/+8IfIysqKsWPHljjG1mv58MMPR0TEqFGjim3fOuP7oYceKtbepk2b6Nu3b7G2WbNmxZFHHhkNGzaMjz/+OPPq3bt3bNmyJZ588smIiGjQoEGsX78+Hn300W2eX1k9/PDD0axZsxg4cGCmrUaNGnHRRRfFunXr4oknnijW/9RTT43GjRtXyNh5eXkR8cW9EvHFNahfv34ce+yxxa5Bly5dIi8vr0wPey3rdSzL51oejz32WBQWFsYll1wS1ar9559ow4YNi3r16pW4B/Ly8oqtFZ+TkxOHHXbY1/rejRw5Ml577bW45ZZbMg/+BQCgOCE6AMAeolu3bnH//ffHp59+Gs8//3yMHj06PvvsszjttNPKtDb13nvvXex9/fr1IyKiVatWJdq/vAZ1Wb366qtx8sknR/369aNevXrRuHHjTFC4Zs2aYn1btGjxjR8ievrpp0dubm7ce++9mTH+8pe/xJlnnlmmILRv374xd+7cWL16dTz55JNxwQUXxLvvvhsnnHBC5uGib7/9djRv3nyby5a8++67Ua1atRIPdGzWrFk0aNAg3n333WLtbdq0KXGMN998M+bMmRONGzcu9urdu3dE/Odhp+eff37sv//+0a9fv2jZsmXmlwFf17vvvhv77bdfseA34oslYLZu317tX9e6desiIqJu3boR8cU1WLNmTTRp0qTEdVi3bl2ZHvha1utYls+1PLZepwMOOKBYe05OTuyzzz4lrmPLli1L3KMNGzYs9/fu+uuvjzvvvDPGjx8fxx9//NeoHABgz2CqAQDAHiYnJye6desW3bp1i/333z+GDBkSs2bNKnVW7ZdlZ2eXuT35yoNFt2f16tXRs2fPqFevXlx77bXRtm3bqFmzZrz44otxxRVXlHio45dnrX9dDRs2jBNOOCHuvffeGDNmTMyePTs2bdpUbIZvWdSuXTuOPPLIOPLII6NRo0Yxbty4eOSRR2Lw4MHlOk5ZZzCXdu5FRUVx7LHHxuWXX17qPvvvv39EfPHQ0yVLlsTcuXPjkUceiUceeSSmT58egwYNKvEw0B2hIj63rV555ZWIiMwvH4qKiqJJkyaZX4p8VVlmwJf1Ola2tO9ieb53M2bMiCuuuCJ++MMfxk9/+tOKKg0AYLckRAcA2INtfbDlRx99VKl1LFiwID755JO4//7746ijjsq0L1u27Bsdd3vB9KBBg+I73/lOvPDCC3HvvffGIYccknlI5dfx1evZtm3bmDt3bqxatSp11nLr1q2jqKgo3nzzzcwM7oiI5cuXx+rVq6N169bbHbdt27axbt26zIzpbcnJyYkBAwbEgAEDoqioKM4///y4/fbb4+qrry4xG357WrduHX//+9+jqKio2Gz0rcvvlKX2r2PdunXxxz/+MVq1apW5Zm3bto3HHnssjjjiiO2G9Wn3RVmvY1k+122N81Vbr9PSpUtjn332ybQXFhbGsmXLyvS5lscDDzwQQ4cOjVNOOSVuvfXWCj02AMDuyHIuAAB7gPnz55c6S3XretxfXUZiZ9s6s/bLNRYWFsZtt932jY5bp06diPhipntp+vXrF40aNYpJkybFE088UeZZ6PPmzSu1/avX89RTT40kSWLcuHEl+m49163LaEyZMqXY9smTJ0dERP/+/bdbz/e+971YtGhRzJ07t8S21atXx+bNmyMi4pNPPim2rVq1anHwwQdHRMSmTZu2O85XHX/88VFQUBAzZ87MtG3evDluvvnmyMvL2+7a8l/Hv//97zjrrLNi1apVcdVVV2WC6u9973uxZcuWGD9+fIl9Nm/eXOweqFOnTqn3RFmvY1k+122N81W9e/eOnJyc+OUvf1ls/7vuuivWrFlTpnugrJ588sk444wz4qijjop77723xFI8AACUZCY6AMAe4MILL4wNGzbEySefHO3atYvCwsJYuHBhzJw5M/Lz87/xQzq/qcMPPzwaNmwYgwcPjosuuiiysrLinnvuKfeyMF/Vtm3baNCgQUydOjXq1q0bderUie7du2fW5q5Ro0acccYZccstt0R2dnaxB2Ruy3e+851o06ZNDBgwINq2bRvr16+Pxx57LP785z9Ht27dYsCAARER0atXrzjrrLPil7/8Zbz55ptx3HHHRVFRUTz11FPRq1evGDlyZHTq1CkGDx4cd9xxR2ZZm+effz7uvvvuOOmkk6JXr17brefHP/5xPPjgg3HCCSfE2WefHV26dIn169fHP/7xj5g9e3a888470ahRoxg6dGisWrUqjjnmmGjZsmW8++67cfPNN0fnzp2LzYIvq+HDh8ftt98eZ599dixevDjy8/Nj9uzZ8cwzz8SUKVMy65V/XR988EH89re/jYgvZp+/9tprMWvWrCgoKIjLLrssRowYkenbs2fPGDFiREycODGWLFkSffr0iRo1asSbb74Zs2bNiptuuilOO+20iIjo0qVL/OpXv4rrrrsu9t1332jSpEkcc8wxZb6OZflct47z2GOPxeTJk6N58+bRpk2b6N69e4nzbNy4cYwePTrGjRsXxx13XJx44omxdOnSuO2226Jbt27lXmIozbvvvhsnnnhiZGVlxWmnnRazZs0qtv3ggw/O/FIFAIAvSQAA2O098sgjyTnnnJO0a9cuycvLS3JycpJ99903ufDCC5Ply5cX69u6detk8ODBmffTp09PIiJ54YUXivUbO3ZsEhHJypUri7UPHjw4qVOnTrG2iEjGjh1b4pjLli3LtD3zzDPJt7/97aRWrVpJ8+bNk8svvzyZO3duEhHJ/PnzM/169uyZHHTQQaWeZ8+ePZOePXsWa3vggQeS9u3bJ9WrV08iIpk+fXqx7c8//3wSEUmfPn1KPWZpfve73yVnnHFG0rZt26RWrVpJzZo1k/bt2ydXXXVVsnbt2mJ9N2/enFx//fVJu3btkpycnKRx48ZJv379ksWLF2f6fP7558m4ceOSNm3aJDVq1EhatWqVjB49Otm4cWOxY7Vu3Trp379/qTV99tlnyejRo5N99903ycnJSRo1apQcfvjhyQ033JAUFhYmSZIks2fPTvr06ZM0adIkycnJSfbee+9k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s3bt2obIAwAAAAAATUadS/T7778/119/fbbddtsMHz48RxxxRI3P+3HRRReloqIirVq1yuDBg3PfffcVzr3iiitSVlZW49OqVav3dV0AAAAAAHg3dX6xaMeOHfO5z32u3gLMmDEjlZWVmTZtWgYPHpypU6dm+PDhWbhwYbp06bLRY9q3b5+FCxdWb5eVldVbHgAAAAAAWK/OJfrll19erwGmTJmSMWPGZPTo0UmSadOm5ZZbbsn06dNz1llnbfSYsrKydOvWrV5zAAAAAADAv6vzci7rLV26NHfffXfuvvvuLF269H2dY82aNZk/f36GDRv2z0DNmmXYsGGZN29e4XErVqxIr1690rNnz3zmM5/JI4888r6uDwAAAAAA76bOJfrKlSvzta99LVtvvXX22Wef7LPPPunevXuOPfbYrFq1qk7nevnll7Nu3bp07dq1xnjXrl2zePHijR6z0047Zfr06bnhhhvyq1/9KlVVVdlrr73yj3/8Y6PzV69eneXLl9f4AAAAAABAbdS5RK+srMydd96Zm266Ka+//npef/313HDDDbnzzjvzjW98oyEy1jBkyJCMHDkyAwYMyNChQ3P99ddnq622yiWXXLLR+ZMmTUqHDh2qPz179mzwjAAAAAAAbB7qXKL/7ne/yy9+8YscdNBBad++fdq3b58RI0bksssuy3XXXVenc3Xu3DnNmzfPkiVLaowvWbKk1muet2jRIrvttluefPLJje4fN25cli1bVv157rnn6pQRAAAAAICPrjqX6KtWrdpg+ZUk6dKlS52XcykvL8/AgQMza9as6rGqqqrMmjUrQ4YMqdU51q1bl7/+9a/ZeuutN7q/ZcuW1WX/+g8AAAAAANRGnUv0IUOGZMKECXnrrbeqx958881MnDix1sX3v6qsrMxll12WK6+8Mo899lhOPPHErFy5MqNHj06SjBw5MuPGjauef8455+R///d/8/e//z0PPPBAvvKVr+TZZ5/NcccdV+drAwAAAADAu9mirgdceOGFGT58eLbZZpv0798/SfLQQw+lVatWue222+oc4Mgjj8zSpUszfvz4LF68OAMGDMjMmTOrn3ZftGhRmjX7Z9f/2muvZcyYMVm8eHE6deqUgQMHZu7cuenbt2+drw0AAAAAAO+mziV6v3798sQTT+Tqq6/O448/niQ56qijcvTRR6d169bvK8TYsWMzduzYje6bM2dOje0f//jH+fGPf/y+rgMAAAAAAHVR5xI9Sdq0aZMxY8bUdxYAAAAAAGhS6rwm+qRJkzJ9+vQNxqdPn57JkyfXSygAAAAAAGgK6lyiX3LJJenTp88G4zvvvHOmTZtWL6EAAAAAAKApqHOJvnjx4my99dYbjG+11VZ58cUX6yUUAAAAAAA0BXUu0Xv27Jl77rlng/F77rkn3bt3r5dQAAAAAADQFNT5xaJjxozJaaedlrfffjuf/vSnkySzZs3KGWeckW984xv1HhAAAAAAABpLnUv0b33rW3nllVdy0kknZc2aNUmSVq1a5cwzz8y4cePqPSAAAAAAADSWOpfoZWVlmTx5cr773e/mscceS+vWrbPjjjumZcuWDZEPAAAAAAAaTZ3XRF+vbdu22WOPPdKuXbs89dRTqaqqqs9cAAAAAADQ6Gpdok+fPj1TpkypMXb88cdn++23zy677JJ+/frlueeeq/eAAAAAAADQWGpdol966aXp1KlT9fbMmTNz+eWX55e//GXuv//+dOzYMRMnTmyQkAAAAAAA0BhqvSb6E088kUGDBlVv33DDDfnMZz6To48+Okly/vnnZ/To0fWfEAAAAAAAGkmtn0R/88030759++rtuXPnZp999qne3n777bN48eL6TQcAAAAAAI2o1iV6r169Mn/+/CTJyy+/nEceeSSf+tSnqvcvXrw4HTp0qP+EAAAAAADQSGq9nMuoUaNy8skn55FHHskdd9yRPn36ZODAgdX7586dm379+jVISAAAAAAAaAy1LtHPOOOMrFq1Ktdff326deuWa6+9tsb+e+65J0cddVS9BwQAAAAAgMZS6xK9WbNmOeecc3LOOedsdP+/l+oAAAAAAPBhV+s10QEAAAAA4KNGiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABepcos+ePbshcgAAAAAAQJNT5xL9wAMPTO/evXPeeeflueeea4hMAAAAAADQJNS5RH/++eczduzYXHfdddl+++0zfPjw/Pa3v82aNWsaIh8AAAAAADSaOpfonTt3zumnn54FCxbk3nvvzcc//vGcdNJJ6d69e77+9a/noYceaoicAAAAAACwyX2gF4vuvvvuGTduXMaOHZsVK1Zk+vTpGThwYPbee+888sgj9ZURAAAAAAAaxfsq0d9+++1cd911GTFi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9tlnn4aMCgAAAADAR9AWjXnxl19+OevWrUvXrl1rjHft2jWPP/544XHLli1Ljx49snr16jRv3jwXX3xx9t9//43OXb16dVavXl29vXz58voJDwAAAADAZq9RS/T3q127dlmwYEFWrFiRWbNmpbKyMttvv3323XffDeZOmjQpEydO3PQhAQAAAAD40GvUEr1z585p3rx5lixZUmN8yZIl6datW+FxzZo1yw477JAkGTBgQB577LFMmjRpoyX6uHHjUllZWb29fPny9OzZs35uAAAAAACAzVqjroleXl6egQMHZtasWdVjVVVVmTVrVoYMGVLr81RVVdVYsuVftWzZMu3bt6/xAQAAAACA2mj05VwqKyszatSoDBo0KHvuuWemTp2alStXZvTo0UmSkSNHpkePHpk0aVKSd5ZnGTRoUHr37p3Vq1fn1ltvzVVXXZWf/exnjXkbAAAAAABshhq9RD/yyCOzdOnSjB8/PosXL86AAQMyc+bM6peNLlq0KM2a/fOB+ZUrV+akk07KP/7xj7Ru3Tp9+vTJr371qxx55JGNdQsAAAAAAGymGr1ET5KxY8dm7NixG903Z86cGtvnnXdezjvvvE2QCgAAAACAj7pGXRMdAAAAAACaMiU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQIEmUaJfdNFFqaioSKtWrTJ48ODcd999hXMvu+yy7L333unUqVM6deqUYcOGvet8AAAAAAB4vxq9RJ8xY0YqKyszYcKEPPDAA+nfv3+GDx+el156aaPz58yZk6OOOiqzZ8/OvHnz0rNnzxxwwAF5/vnnN3FyAAAAAAA2d41eok+ZMiVjxozJ6NGj07dv30ybNi1t2rTJ9OnTNzr/6quvzkknnZQBAwakT58++fnPf56qqqrMmjVrEycHAAAAAGBz16gl+po1azJ//vwMGzaseqxZs2YZNmxY5s2bV6tzrFq1Km+//XY+9rGPbXT/6tWrs3z58hofAAAAAACojUYt0V9++eWsW7cuXbt2rTHetWvXLF68uFbnOPPMM9O9e/caRfy/mjRpUjp06FD96dmz5wfODQAAAADAR0OjL+fyQXz/+9/PNddck9///vdp1arVRueMGzcuy5Ytq/4899xzmzglAAAAAAAfVls05sU7d+6c5s2bZ8mSJTXGlyxZkm7dur3rsRdccEG+//3v5/bbb8+uu+5aOK9ly5Zp2bJlveQFAAAAAOCjpVGfRC8vL8/AgQNrvBR0/UtChwwZUnjcD37wg5x77rmZOXNmBg0atCmiAgAAAADwEdSoT6InSWVlZUaNGpVBgwZlzz33zNSpU7Ny5cqMHj06STJy5Mj06NEjkyZNSpJMnjw548ePz69//etUVFRUr53etm3btG3bttHuAwAAAACAzU+jl+hHHnlkli5dmvHjx2fx4sUZMGBAZs6cWf2y0UWLFqVZs38+MP+zn/0sa9asyec///ka55kwYULOPvvsTRkdAAAAAIDNXKOX6EkyduzYjB07dqP75syZU2P7mWeeafhAAAAAAACQRl4THQAAAAAAmjIlOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAA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ANAAysrK3vVz9tlnN3bEDey777457bTTGjsGAAA0KY2+JjoAAGyOXnzxxep/z5gxI+PHj8/ChQurx9q2bdsYsQAAgDryJDoAADSAbt26VX86dOiQsrKy6u0uXbpkypQp2WabbdKyZcsMGDAgM2fOLDzXunXr8rWvfS19+vTJokWLkiQ33HBDdt9997Rq1Srbb799Jk6cmLVr11YfU1ZWlp///Of57Gc/mzZt2mTHHXfMjTfeWKd7qKioyPnnn5+vfe1radeuXbbddttceumlNebcd9992W233dKqVasMGjQoDz744Abn+dvf/paDDjoobdu2TdeuXXPMMcfk5ZdfTpLMmTMn5eXlueuuu6rn/+AHP0iXLl2yZMmSOuUFAICGoEQHAIBN7MILL8yPfvSjXHDBBXn44YczfPjwHHbYYXniiSc2mLt69ep84QtfyIIFC3LXXXdl2223zV133ZWRI0fm1FNPzaOPPppLLrkkV1xxRb73ve/VOHbixIn54he/mIcffjgjRozI0UcfnVdffbVOWX/0ox9Vl+MnnXRSTjzxxOon6lesWJFDDjkkffv2zfz583P22Wfnm9/8Zo3jX3/99Xz605/Obrvtlr/85S+ZOXNmlixZki9+8YtJ/rmEzDHHHJNly5blwQcfzHe/+938/Oc/T9euXeuUFQAAGoISHQAANrELLrggZ555Zr70pS9lp512yuTJkzNgwIBMnTq1xrwVK1bk4IMPztKlSzN79uxstdVWSd4px88666yMGjUq22+/ffbff/+ce+65ueSSS2oc/9WvfjVHHXVUdthhh5x//vlZsWJF7rvvvjplHTFiRE466aTssMMOOfPMM9O5c+fMnj07SfLrX/86VVVV+cUvfpGdd945hxxySL71rW/VOP6nP/1pdtttt5x//vnp06dPdtttt0yfPj2zZ8/O//3f/yVJzjvvvHTq1CnHH398vvKVr2TUqFE57LDD6pQTAAAaijXRAQBgE1q+fHleeOGFfOpTn6ox/qlPfSoPPfRQjbGjjjoq22yzTe644460bt26evyhhx7KPffcU+PJ83Xr1uWtt97KqlWr0qZNmyTJrrvuWr1/yy23TPv27fPSSy/VKe+/nmP9kjTrz/HYY49l1113TatWrarnDBkypMbxDz30UGbPnr3RNeCfeuqpfPzjH095eXmuvvrq7LrrrunVq1d+/OMf1ykjAAA0JCU6AAA0USNGjMivfvWrzJs3L5/+9Kerx1esWJGJEyfmiCOO2OCYfy20W7RoUWNfWVlZqqqq6pThg55jxYoVOfTQQzN58uQN9m299dbV/547d26S5NVXX82rr76aLbfcsk45AQCgoSjRAQBgE2rfvn26d++ee+65J0OHDq0ev+eee7LnnnvWmHviiSemX79+Oeyww3LLLbdUz999992zcOHC7LDDDps0+7/7xCc+kauuuipvvfVWdXn/5z//ucac3XffPb/73e9SUVGRLbbY+H/9eOqpp3L66afnsssuy4wZMzJq1KjcfvvtadbM6pMAADQ+/1cpAABsYt/61rcyefLkzJgxIwsXLsxZZ52VBQsW5NRTT91g7imnnJLzzjsvhxxySO6+++4kyfjx4/PLX/4yEydOzCOPPJLHHnss11xzTb7zne9s0vv48pe/nLKysowZMyaPPvpobr311lxwwQU15px88sl59dVXc9RRR+X+++/PU089ldtuuy2jR4/OunXrsm7dunzlK1/J8OHDM3r06Fx++eV5+OGH86Mf/WiT3gsAABTxJDoAAGxiX//617Ns2bJ84xvfyEsvvZS+ffvmxhtvzI477rjR+aeddlqqqqoyYsSIzJw5M8OHD8/NN9+cc845J5MnT06LFi3Sp0+fHHfccZv0Ptq2bZubbrop//mf/5nddtstffv2zeTJk/O5z32ues76p+7PPPPMHHDAAVm9enV69eqVAw88MM2aNcu5556bZ599NjfffHOSd5Z4ufTSS3PUUUflgAMOSP/+/TfpPQEAwL8rK5VKpcYOAQAAAAAATZHlXAAAAAAAoIASHQAAAAAACijRAQAAAACggBIdAAAAAAAKKNEBAAAAAKCAEh0AAAAAAAoo0QEAAAAAoIASHQAAAAAACijRAQAAAACggBIdAAAAAAAKKNEBAAAAAKCAEh0AAAAAAAoo0QEAAAAAoIASHQAAAAAACijRAQAAAACggBIdAAAAAAAKKNEBAAAAAKCAEh0AgBoqKiry1a9+tV7PWVZWlrPPPrt6+4orrkhZWVmeeeaZer3Ovvvum3333bdez8k7VqxYkeOOOy7dunVLWVlZTjvttMaO9KHVUL//AAA0DCU6AMBHxF//+td8/vOfT69evdKqVav06NEj+++/f37yk580drQG88ILL+Tss8/OggUL6v3cd999dw466KD06NEjrVq1yrbbbptDDz00v/71r+v9Wk3B+eefnyuuuCInnnhirrrqqhxzzDENer2KioqUlZWlrKwszZo1S8eOHbPLLrvk+OOPz7333vuBzn3xxRfniiuuqJ+g7+L888/P//zP/zT4deri/PPPzyc/+clstdVWadWqVXbcccecdtppWbp0aWNHAwBosspKpVKpsUMAANCw5s6dm/322y/bbrttRo0alW7duuW5557Ln//85zz11FN58sknq+euXr06zZo1S4sWLert+m+99Va22GKLbLHFFkneeRJ39OjRefrpp1NRUVFv11mzZk2SpLy8PEnyl7/8JXvssUcuv/zyen26/tprr82RRx6ZAQMG5Etf+lI6deqUp59+On/605/SokWLzJ49u96u1VR88pOfzBZbbJG77757k1yvoqIinTp1yje+8Y0kyRtvvJHHHnss1157bRYvXpzTTz89U6ZMeV/n7tevXzp37pw5c+bUY+INtW3bNp///Oc3KOzXrVuXt99+Oy1btkxZWVmDZvh3n/vc57LVVlulT58+adeuXR577LFcdtll6dKlSxYsWJAtt9xyk+YBAPgw2KKxAwAA0PC+973vpUOHDrn//vvTsWPHGvteeumlGtstW7as9+u3atWq3s/5r1atWpU2bdpUl+cN7eyzz07fvn3z5z//eYNr/vv32ZBKpVLeeuuttG7dusGv9dJLL6Vv3771dr61a9emqqrqXX9mPXr0yFe+8pUaY5MnT86Xv/zl/PjHP86OO+6YE088sd4ybSrNmzdP8+bNG+Xav/vd7zYYGzJkSD7/+c/npptuype+9KVGSAUA0LRZzgUA4CPgqaeeys4777xBgZ4kXbp0qbH972uir1+/+e67787Xv/71bLXVVunYsWNOOOGErFmzJq+//npGjhyZTp06pVOnTjnjjDPy7//Pjv++JvrG3HDDDTn44IPTvXv3tGzZMr179865556bdevW1Zi37777pl+/fpk/f3722WeftGnTJv/1X/9VvW/9muhz5szJHnvskSQZPXp09dIgV1xxRSZMmJAWLVpsdAmL448/Ph07dsxbb71VmPWpp57KHnvssdEC+N+/z6qqqlx44YXZZZdd0qpVq2y11VY58MAD85e//KV6ztq1a3Puueemd+/eadmyZSoqKvJf//VfWb16dY1zVVRU5JBDDsltt92WQYMGpXXr1rnkkkuSJK+//npOO+209OzZMy1btswOO+yQyZMnp6qqqsY5rrnmmgwcODDt2rVL+/bts8suu+TCCy8svNc5c+akrKwsTz/9dG655Zbq73H9et4vvfRSjj322HTt2jWtWrVK//79c+WVV9Y4xzPPPJOysrJccMEFmTp1avV9Pvroo4XXLdK6detcddVV+djHPpbvfe97NX7XqqqqMnXq1Oy8885p1apVunbtmhNOOCGvvfZaje/wkUceyZ133ll9L/+6jn5tv8f3+rmWlZVl5cqVufLKK6uvs/7vqmhN9Isvvjg777xzWrZsme7du+fkk0/O66+/XmPO+t//Rx99NPvtt1/atGmTHj165Ac/+EGdv8t//U7W3zsAABvyJDoAwEdAr169Mm/evPztb39Lv3793tc5TjnllHTr1i0TJ07Mn//851x66aXp2LFj5s6dm2233Tbnn39+br311vzwhz9Mv379MnLkyDqd/4orrkjbtm1TWVmZtm3b5o477sj48eOzfPny/PCHP6wx95VXXslBBx2UL33pS/nKV76Srl27bnC+T3ziEznnnHMyfvz4HH/88dl7772TJHvttVf+3//7fznnnHMyY8aMjB07tvqYNWvW5LrrrsvnPve5d316vlevXpk1a1b+8Y9/ZJtttnnX+zr22GNzxRVX5KCDDspxxx2XtWvX5q677sqf//znDBo0KEly3HHH5corr8znP//5fOMb38i9996bSZMm5bHHHsvvf//7GudbuHBhjjrqqJxwwgkZM2ZMdtppp6xatSpDhw7N888/nxNOOCHbbrtt5s6dm3HjxuXFF1/M1KlTkyR//OMfc9RRR+U//uM/Mnny5CTJY489lnvuuSennnrqRvN/4hOfyFVXXZXTTz8922yzTfXyKltttVXefPPN7LvvvnnyySczduzYbLfddrn22mvz1a9+Na+//voG57z88svz1ltv5fjjj0/Lli3zsY997F2/uyJt27bNZz/72fziF7/Io48+mp133jlJcsIJJ1QvFfT1r389Tz/9dH7605/mwQcfzD333JMWLVpk6tSpOeWUU9K2bdt8+9vfTpLq35/afo+1+bleddVVOe6447Lnnnvm+OOPT5L07t278J7OPvvsTJw4McOGDcuJJ56YhQsX5mc/+1nuv//+6uzrvfbaaznwwANzxBFH5Itf/GKuu+66nHnmmdlll11y0EEHvef3VyqV8sorr2Tt2rV54oknctZZZ6V58+ZeygsAUKQEAMBm73//939LzZs3LzVv3rw0ZMiQ0hlnnFG67bbbSmvWrNlgbq9evUqjRo2q3r788stLSUrDhw8vVVVVVY8PGTKkVFZWVvrP//zP6rG1a9eWttlmm9LQoUNrnDNJacKECRuc8+mnn64eW7Vq1QZZTjjhhFKbNm1Kb731VvXY0KFDS0lK06ZN22D+0KFDa1z7/vvvLyUpXX755RvMHTJkSGnw4ME1xq6//vpSktLs2bM3mP+vfvGLX5SSlMrLy0v77bdf6bvf/W7prrvuKq1bt67GvDvuuKOUpPT1r399g3Os/y4XLFhQSlI67rjjauz/5je/WUpSuuOOO6rHevXqVUpSmjlzZo255557bmnLLbcs/d///V+N8bPOOqvUvHnz0qJFi0qlUql06qmnltq3b19au3btu97fxvTq1at08MEH1xibOnVqKUnpV7/6VfXYmjVrSkOGDCm1bdu2tHz58lKpVCo9/fTTpSSl9u3bl1566aX3fb1/9eMf/7iUpHTDDTeUSqVS6a677iolKV199dU15s2cOXOD8Z133nmD39FSqfbfY21+rqVSqbTlllvW+Fta799//1966aVSeXl56YADDqjxO/TTn/60lKQ0ffr06rH1v/+//OUvq8dWr15d6tatW+lzn/vcBtfamBdffLGUpPqzzTbblGbMmFGrYwEAPoos5wIA8BGw//77Z968eTnssMPy0EMP5Qc/+EGGDx+eHj165MYbb6zVOY499tgaL0EcPHhwSqVSjj322Oqx5s2bZ9CgQfn73/9e54z/uq73G2+8kZdffjl77713Vq1alccff7zG3JYtW2b06NF1vsa/GjlyZO6999489dRT1WNXX311evbsmaFDh77rsV/72tcyc+bM7Lvvvrn77rtz7rnnZu+9986OO+6YuXPnVs/73e9+l7KyskyYMGGDc6z/Lm+99dYkSWVlZY3965/4vuWWW2qMb7fddhk+fHiNsWuvvTZ77713OnXqlJdffrn6M2zYsKxbty5/+tOfkiQdO3bMypUr88c//vFd76+2br311nTr1i1HHXVU9ViLFi3y9a9/PStWrMidd95ZY/76l1rWh7Zt2yZ553cleec76NChQ/bff/8a38HAgQPTtm3bWr3stbbfY21+rnVx++23Z82aNTnttNPSrNk//yvamDFj0r59+w1+B9q2bVtjrfjy8vLsueeetf67+9jHPpY//vGPuemmm3LOOeekc+fOWbFiRZ1zAwB8VFjOBQDgI2KPPfbI9ddfnzVr1uShhx7K73//+/z4xz/O5z//+SxYsOA9Xxq57bbb1tju0KFDkqRnz54bjP/rGtS19cgjj+Q73/lO7rjjjixfvrzGvmXLltXY7tGjxwd+ieiRRx6Z0047LVdffXXGjx+fZcuW5eabb87pp59eqyJ0+PDhGT58eFatWpX58+dnxowZmTZtWg455JA8/vjj6dKlS5566ql07979XZctefbZZ9OsWbPssMMONca7deuWjh075tlnn60xvt12221wjieeeCIPP/xwYUG9/mWnJ510Un7729/moIMOSo8ePXLAAQfki1/8Yg488MD3vN+i7DvuuGON4jd5ZwmY9fvfK/v7tb70bdeuXZJ3voNly5ZtsCb9erV54Wttv8fa/FzrYv33tNNOO9UYLy8vz/bbb7/B97jNNtts8DvaqVOnPPzww7W6Xnl5eYYNG5YkOeSQQ/If//Ef+dSnPpUuXbrkkEMOeb+3AQCw2VKiAwB8xJSXl2ePPfbIHnvskY9//OMZPXp0rr322o0+VfuvmjdvXuvx0r+9WPS9vP766xk6dGjat2+fc845J717906rVq3ywAMP5Mwzz9zgpY7/+tT6+9WpU6cccsgh1SX6ddddl9WrV9d4wrc22rRpk7333jt77713OnfunIkTJ+YPf/hDRo0aVafz1PYJ5o3de1VVVfbff/+cccYZGz3m4x//eJJ3Xnq6YMGC3HbbbfnDH/6QP/zhD7n88sszcuTIDV4G2hDq4+e23t/+9rckqf4fH6qqqtKlS5dcffXVG51fmyfga/s9Nraiv8W6/t2tt9dee2XrrbfO1VdfrUQHANgIJToAwEfY+hdbvvjii42aY86cOXnllVdy/fXXZ5999qkef/rppz/Qed+rmB45cmQ+85nP5P7778/VV1+d3Xbbrfolle/Hv3+fvXv3zm233ZZXX3218KnlXr16paqqKk888UT1E9xJsmTJkrz++uvp1avXe163d+/eWbFiRfXTxe+mvLw8hx56aA499NBUVVXlpJNOyiWXXJLvfve7GzwN/1569eqVhx9+OFVVVTWeRl+//E5tsr8fK1asyO9///v07Nmz+jvr3bt3br/99nzqU596z7K+6Peitt9jbX6u73adf7f+e1q4cGG233776vE1a9bk6aefrtXP9YN66623Nvj/+AAA4B3WRAcA+AiYPXv2Rp9SXb8e978vI7GprX+y9l8zrlmzJhdffPEHOu+WW26Z5J0n3TfmoIMOSufOnTN58uTceeedtX4KfdasWRsd//fv83Of+1xKpVImTpy4wdz19zpixIgkydSpU2vsnzJlSpLk4IMPfs88X/ziFzNv3rzcdtttG+x7/fXXs3bt2iTJK6+8UmNfs2bNsuuuuyZJVq9e/Z7X+XcjRozI4sWLM2PGjOqxtWvX5ic/+Unatm37nmvLvx9vvvlmjjnmmLz66qv59re/XV1Uf/GLX8y6dety7rnnbnDM2rVra/wObLnllhv9najt91ibn+u7XeffDRs2LOXl5fnv//7vGsf/4he/yLJly2r1O1AbK1euzKpVqzYY/93vfpfXXnut+n8EAgCgJk+iAwB8BJxyyilZtWpVPvvZz6ZPnz5Zs2ZN5s6dmxkzZqSiouIDv6Tzg9prr73SqVOnjBo1Kl//+tdTVlaWq6666n0vT7Fe796907Fjx0ybNi3t2rXLlltumcGDB1evzd2iRYt86Utfyk9/+tM0b968xgsy381nPvOZbLfddjn00EPTu3fvrFy5Mrfffntuuumm7LHHHjn00EOTJPvtt1+OOeaY/Pd//3eeeOKJHHjggamqqspdd92V/fbbL2PHjk3//v0zatSoXHrppdXL2tx333258sorc/jhh2e//fZ7zzzf+ta3cuONN+aQQw7JV7/61QwcODArV67MX//611x33XV55pln0rlz5xx33HF59dVX8+lPfzrbbLNNnn322fzkJz/JgAEDajwFX1vHH398Lrnkknz1q1/N/PnzU1FRkeuuuy733HNPpk6dWr1e+fv1/PPP51e/+lWSd54+f/TRR3Pttddm8eLF+cY3vpETTjiheu7QoUNzwgknZNKkSVmwYEEOOOCAtGjRIk888USuvfbaXHjhhfn85z+fJBk4cGB+9rOf5bzzzssOO+yQLl265NOf/nStv8fa/FzXX+f222/PlClT0r1792y33XYZPHjwBve51VZbZdy4cZk4cWIOPPDAHHbYYVm4cGEuvvji7LHHHnVeYqjIE088kWHDhuXII49Mnz590qxZs/zlL3/Jr371q1RUVOTUU0+tl+sAAGx2SgAAbPb+8Ic/lL72ta+V+vTpU2rbtm2pvLy8tMMOO5ROOeWU0pIlS2rM7dWrV2nUqFHV25dffnkpSen++++vMW/ChAmlJKWlS5fWGB81alRpyy23rDGWpDRhwoQNzvn0009Xj91zzz2lT37yk6XWrVuXunfvXjrjjDNKt912WylJafbs2dXzhg4dWtp55503ep9Dhw4tDR06tMbYDTfcUOrbt29piy22KCUpXX755TX233fffaUkpQMOOGCj59yY3/zmN6UvfelLpd69e5dat25datWqValv376lb3/726Xly5fXmLt27drSD3/4w1KfPn1K5eXlpa222qp00EEHlebPn1895+233y5NnDixtN1225VatGhR6tmzZ2ncuHGlt956q8a5evXqVTr44IM3mumNN94ojRs3rrTDDjuUysvLS507dy7ttddepQsuuKC0Zs2aUqlUKl133XWlAw44oNSlS5dSeXl5adttty2dcMIJpRdffPE977no2kuWLCmNHj261Llz51J5eXlpl1122eA7fvrpp0tJSj/84Q/f8zr/er0kpSSlsrKyUvv27Us777xzacyYMaV777238LhLL720NHDgwFLr1q1L7dq1K+2yyy6lM844o/TCCy9Uz1m8eHHp4IMPLrVr166UpMbvTG2+x1Kpdj/Xxx9/vLTPPvuUWrduXUpS/Xe1sd//UqlU+ulPf1rq06dPqUWLFqWuXbuWTjzxxNJrr71WY07R7/+oUaNKvXr1etfvdOnSpaXjjz++1KdPn9KWW25ZKi8vL+24446l0047bYO/YwAA/qmsVPqAj/cAAMCH2EMPPZQBAwbkl7/8ZY455pjGjgMAADQx1kQHAOAj7bLLLkvbtm1zxBFHNHYUAACgCbImOgAAH0k33XRTHn300Vx66aUZO3Zs9UtIAQAA/pXlXAAA+EiqqKjIkiVLMnz48Fx11VUf+CWYAADA5kmJDgAAAAAABayJDgAAAAAABZToAAAAAABQ4CP3YtGqqqq88MILadeuXcrKyho7DgAAAAAAjaBUKuWNN95I9+7d06xZ8fPmH7kS/YUXXkjPnj0bOwYAAAAAAE3Ac889l2222aZw/0euRG/Xrl2Sd76Y9u3bN3Ia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1atXZ//990+7du0yefLkrF69OtOmTWuInAAAAAAAsMnV+Un0U089NYMGDcprr72W1q1bV49/9rOfzaxZs+o1HAAAAAAANKY6P4l+1113Ze7cuSkvL68xXlFRkeeff77eggEAAAAAQGOr85PoVVVVWbdu3Qbj//jHP9KuXbt6CQUAAAAAAE1BnUv0Aw44IFOnTq3eLisry4oVKzJhwoSMGDGiPrMBAAAAAECjqvNyLhdccEEOPPDA9O3bN2+99Va+/OUv54knnkjnzp3zm9/8piEyAgAAAABAo6hzid6zZ8889NBDmTFjRh566KGsWLEixx57bI4++ugaLxoFAAAAAIAPuzqV6G+//Xb69OmTm2++OUcffXSOPvrohsoFAAAAAACNrk5rordo0SJvvfVWQ2UBAAAAAIAmpc4vFj355JMzefLkrF27tiHyAAAAAABAk1HnNdHvv//+zJo1K//7v/+bXXbZJVtuuWWN/ddff329hQMAAAAAgMZU5xK9Y8eO+dznPtcQWQAAAAAAoEmpc4l++eWXN0QOAAAAAABocupcoq+3dOnSLFy4MEmy0047Zauttqq3UAAAAAAA0BTU+cWiK1euzNe+9rVsvfXW2WeffbLPPvuke/fuOfbYY7Nq1aqGyAgAAAAAAI2iziV6ZWVl7rzzztx00015/fXX8/rrr+eGG27InXfemW984xt1DnDRRReloqIirVq1yuDBg3Pfffe96/zXX389J598crbeeuu0bNkyH//4x3PrrbfW+boAAAAAAPBe6rycy+9+97tcd9112XfffavHRowYkdatW+eLX/xifvazn9X6XDNmzEhlZWWmTZuWwYMHZ+rUqRk+fHgWLlyYLl26bDB/zZo12X///dOlS5dcd9116dGjR5599tl07NixrrcBAAAAAADvqc4l+qpVq9K1a9cNxrt06VLn5VymTJmSMWPGZPTo0UmSadOm5ZZbbsn06dNz1llnbTB/+vTpefXVVzN37ty0aNEiSVJRUVHXWwAAAAAAgFqp83IuQ4YMyYQJE/LWW29Vj7355puZOHFihgwZUuvzrFmzJvPnz8+wYcP+GaZZswwbNizz5s3b6DE33nhjhgwZkpNPPjldu3ZNv379cv7552fdunV1vQ0AAAAAAHhPdX4S/cILL8zw4cOzzTbbpH///kmShx56KK1atcptt91W6/O8/PLLWbdu3QZPtXft2jWPP/74Ro/5+9//njvuuCNHH310br311jz55JM56aST8vbbb2fChAkbPWb16tVZvXp19fby5ctrnREAAAAAgI+2Opfo/fr1yxNPPJGrr766uuw+6qijcvTRR6d169b1HvBfVVVVpUuXLrn00kvTvHnzDBw4MM8//3x++MMfFpbokyZNysSJExs0FwAAAAAAm6c6l+hJ0qZNm4wZM+YDXbhz585p3rx5lixZUmN8yZIl6dat20aP2XrrrdOiRYs0b968euwTn/hEFi9enDVr1qS8vHyDY8aNG5fKysrq7eXLl6dnz54fKDsAAAAAAB8NdV4TfdKkSZk+ffoG49OnT8/kyZNrfZ7y8vIMHDgws2bNqh6rqqrKrFmzCtdW/9SnPpUnn3wyVVVV1WP/93//l6233nqjBXqStGzZMu3bt6/xAQAAAACA2qhziX7JJZekT58+G4zvvPPOmTZtWp3OVVlZmcsuuyxXXnllHnvssZx44olZuXJlRo8enSQZOXJkxo0bVz3/xBNPzKuvvppTTz01//d//5dbbrkl559/fk4++eS63gYAAAAAALynOi/nsnjx4my99dYbjG+11VZ58cUX63SuI488MkuXLs348eOzePHiDBgwIDNnzqx+2eiiRYvSrNk/e/6ePXvmtttuy+mnn55dd901PXr0yKmnnpozzzyzrrcBAAAAAADvqc4les+ePXPPPfdku+22qzF+zz33pHv37nUOMHbs2IwdO3aj++bMmbPB2JAhQ/LnP/+5ztcBAAAAAIC6qnOJPmbMmJx22ml5++238+lPfzpJMmvWrJxxxhn5xje+Ue8BAQAAAACgsdS5RP/Wt76VV155JSeddFLWrFmTJGnVqlXOPPPMGuuXAwAAAADAh12dS/SysrJMnjw53/3ud/PYY4+ldevW2XHHHdOyZcuGyAcAAAAAAI2m2XtP2bi2bdtmjz32SLt27fLUU0+lqqqqPnMBAAAAAECjq3WJPn369EyZMqXG2PHHH5/tt98+u+yyS/r165fnnnuu3gMCAAAAAEBjqXWJfumll6ZTp07V2zNnzszll1+eX/7yl7n//vvTsWPHTJw4sUFCAgAAAABAY6j1muhPPPFEBg0aVL19ww035DOf+UyOPvroJMn555+f0aNH139CAAAAAABoJLV+Ev3NN99M+/btq7fnzp2bffbZp3p7++23z+LFi+s3HQAAAAAANKJal+i9evXK/PnzkyQvv/xyHnnkkXzqU5+q3r948eJ06NCh/hMCAAAAAEAjqfVyLqNGjcrJJ5+cRx55JHfccUf69OmTgQMHVu+fO3du+vXr1yAhAQAAAACgMdS6RD/jjDOyatWqXH/99enWrVuuvfbaGvvvueeeHHXUUfUeEAAAAAAAGkutS/RmzZrlnHPOyTnnnLPR/f9eqgMAAAAAwIddrddEBwAAAACAjxolOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUqHOJPnv27IbIAQAAAAAATU6dS/QDDzwwvXv3znnnnZfnnnuuITIBAAAAAECTUOcS/fnnn8/YsWNz3XXXZfvtt8/w4cPz29/+NmvWrGmIfAAAAAAA0GjqXKJ37tw5p59+ehYsWJB77703H//4x3PSSSele/fu+frXv56HHnqoIXICAAAAAMAm94FeLLr77rtn3LhxGTt2bFasWJHp06dn4MCB2XvvvfPII4/UV0YAAAAAAGgU76tEf/vtt3PddddlxIgR6dWrV2677bb89Kc/zZIlS/Lkk0+mV69e+cIXvlDfWQEAAAAAYJPaoq4HnHLKKfnNb36TUqmUY445Jj/4wQ/Sr1+/6v1bbrllLrjggnTv3r1egwIAAAAAwKZW5xL90UcfzU9+8pMcccQRadmy5UbndO7cObNnz/7A4QAAAAAAoDHVeTmXCRMm5Atf+MIGBfratWvzpz/9KUmyxRZbZOjQofWTEAAAAAAAGkmdS/T99tsvr7766gbjy5Yty3777VcvoQAAAAAAoCmoc4leKpVSVla2wfgrr7ySLbfcsl5CAQAAAABAU1DrNdGPOOKIJElZWVm++tWv1ljOZd26dXn44Yez11571X9CAAAAAABoJLUu0Tt06JDknSfR27Vrl9atW1fvKy8vzyc/+cmMGTOm/hMCAAAAAEAjqXWJfvnllydJKioq8s1vftPSLQAAAAAAbPZqXaKvN2HChIbIAQAAAAAATU6tSvTdd989s2bNSqdOnbLbbrtt9MWi6z3wwAP1Fg4AAAAAABpTrUr0z3zmM9UvEj388MMbMg8AAAAAADQZtSrR1y/hsm7duuy3337Zdddd07Fjx4bMBQAAAAAAja5ZXSY3b948BxxwQF577bWGygMAAAAAAE1GnUr0JOnXr1/+/ve/N0QWAAAAAABoUupcop933nn55je/mZtvvjkvvvhili9fXuMDAAAAAACbi1qtif6vRowYkSQ57LDDUlZWVj1eKpVSVlaWdevW1V86AAAAAABoRHUu0WfPnt0QOQAAAAAAoMmpc4k+dOjQhsgBAAAAAABNTp1L9PVWrVqVRYsWZc2aNTXGd9111w8cCgAAAAAAmoI6l+hLly7N6NGj84c//GGj+62JDgAAAADA5qJZXQ847bTT8vrrr+fee+9N69atM3PmzFx55ZXZcccdc+ONNzZERgAAAAAAaBR1fhL9jjvuyA033JBBgwalWbNm6dWrV/bff/+0b98+kyZNysEHH9wQOQEAAAAAYJOr85PoK1euTJcuXZIknTp1ytKlS5Mku+yySx544IH6TQcAAAAAAI2oziX6TjvtlIULFyZJ+vfvn0suuSTPP/98pk2blq233rreAwIAAAAAQGOp83Iup556al588cUkyYQJE3LggQfm6quvTnl5ea644or6zgcAAAAAAI2mziX6V77ylep/Dxw4MM8++2wef/zxbLvttuncuXO9hgMAAAAAgMZU5xL937Vp0ya77757fWQBAAAAAIAmpVYlemVlZa1POGXKlPcdBgAAAAAAmpJalegPPvhgrU5WVlb2gcIAAAAAAEBTUqsSffbs2Q2dAwAAAAAAmpxmjR0AAAAAAACaqlo9iX7EEUfkiiuuSPv27XPEEUe869zrr7++XoIBAAAAAEBjq1WJ3qFDh+r1zjt06NCggQAAAAAAoKmoVYl++eWXb/TfAAAAAACwObMmOgAAAAAAFKjVk+j/6pVXXsn48eMze/bsvPTSS6mqqqqx/9VXX623cAAAAAAA0JjqXKIfc8wxefLJJ3Psscema9eu1WulAwAAAADA5qbOJfpdd92Vu+++O/3792+IPAAAAAAA0GTUeU30Pn365M0332yILAAAAAAA0KTUuUS/+OKL8+1vfzt33nlnXnnllSxfvrzGBwAAAAAANhd1Xs6lY8eOWb58eT796U/XGC+VSikrK8u6devqLRwAAAAAADSmOpfoRx99dFq0aJFf//rXXiwKAAAAAMBmrc4l+t/+9rc8+OCD2WmnnRoiDwAAAAAANBl1XhN90KBBee655xoiCwAAAAAANCl1fhL9lFNOyamnnppvfetb2WWXXdKiRYsa+3fdddd6CwcAAAAAAI2pziX6kUcemST52te+Vj1WVlbmxaIAAAAAAGx26lyiP/300w2RAwAAAAAAmpw6l+i9evVqiBwAAAAAANDk1KpEv/HGG3PQQQelRYsWufHGG9917mGHHVYvwQAAAAAAoLHVqkQ//PDDs3jx4nTp0iWHH3544TxrogMAAAAAsDmpVYleVVW10X8DAAAAAMDmrFljBwAAAAAAgKaq1iX6vHnzcvPNN9cY++Uvf5ntttsuXbp0yfHHH5/Vq1e/rxAXXXRRKioq0qpVqwwePDj33XdfrY675pprUlZW9q5LzAAAAAAAwPtV6xL9nHPOySOPPFK9/de//jXHHntshg0blrPOOis33XRTJk2aVOcAM2bMSGVlZSZMmJAHHngg/fv3z/Dhw/PSSy+963HPPPNMvvnNb2bvvfeu8zUBAAAAAKA2al2iL1iwIP/xH/9RvX3NNddk8ODBueyyy1JZWZn//u//zm9/+9s6B5gyZUrGjBmT0aNHp2/fvpk2bVratGmT6dOnFx6zbt26HH300Zk4cWK23377Ol8TAAAAAABqo9Yl+muvvZauXbtWb99555056KCDqrf32GOPPPfcc3W6+Jo1azJ//vwMGzbsn4GaNcuwYcMyb968wuPOOeecdOnSJccee+x7XmP16tVZvnx5jQ8AAAAAANRGrUv0rl275umnn07yTvn9wAMP5JOf/GT1/jfeeCMtWrSo08VffvnlrFu3rkY5v/5aixcv3ugxd999d37xi1/ksssuq9U1Jk2alA4dOlR/evbsWaeMAAAAAAB8dNW6RB8xYkTOOuus3HXXXRk3blzatGlTYz3yhx9+OL17926QkOu98cYbOeaYY3LZZZelc+fOtTpm3LhxWbZsWfWnrk/LAwAAAADw0bVFbSeee+65OeKIIzJ06NC0bds2V155ZcrLy6v3T58+PQcccECdLt65c+c0b948S5YsqTG+ZMmSdOvWbYP5Tz31VJ555pkceuih1WNVVVXv3MgWW2ThwoUbFPktW7ZMy5Yt65QLAAAAAACSOpTonTt3zp/+9KcsW7Ysbdu2TfPmzWvsv/baa9O2bds6Xby8vDwDBw7MrFmzcvjhhyd5pxSfNWtWxo4du8H8Pn365K9//WuNse985zt54403cuGFF1qqBQAAAACAelXrEn29Dh06bHT8Yx/72PsKUFlZmVGjRmXQoEHZc889M3Xq1KxcuTKjR49OkowcOTI9evTIpEmT0qpVq/Tr16/G8R07dkySDcYBAAAAAOCDqnOJXt+OPPLILF26NOPHj8/ixYszYMCAzJw5s/plo4sWLUqzZrVeuh0AAAAAAOpNo5foSTJ27NiNLt+SJHPmzHnXY6+44or6DwQAAAAAAEk84g0AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWaRIl+0UUXpaKiIq1atcrgwYNz3333Fc697LLLsvfee6dTp07p1KlThg0b9q7zAQAAAADg/Wr0En3GjBmprKzMhAkT8sADD6R///4ZPnx4XnrppY3OnzNnTo466qjMnj078+bNS8+ePXPAAQfk+eef38TJAQAAAADY3DV6iT5lypSMGTMmo0ePTt++fTNt2rS0adMm06dP3+j8q6++OieddFIGDBiQPn365Oc//3mqqqoya9asTZwcAAAAAIDNXaOW6GvWrMn8+fMzbNiw6rFmzZpl2LBhmTdvXq3OsWrVqrz99tv52Mc+ttH9q1evzvLly2t8AAAAAACgNhq1RH/55Zezbt26dO3atcZ4165ds3jx4lqd48wzz0z37t1rFPH/atKkSenQoUP1p2fPnh84NwAAAAAAHw2NvpzLB/H9738/11xzTX7/+9+nVatWG50zbty4LFu2rPrz3HPPbeKUAAAAAAB8WG3RmBfv3LlzmjdvniVLltQYX7JkSbp16/aux15wwQX5/ve/n9tvvz277rpr4byWLVumZcuW9ZIXAAAAAICPlkZ9Er28vDwDBw6s8VLQ9S8JHTJkSOFxP/jBD3Luuedm5syZGTRo0KaICgAAAADAR1CjPomeJJWVlRk1alQGDRqUPffcM1OnTs3KlSszevToJMnIkSPTo0ePTJo0KUkyefLkjB8/Pr/+9a9TUVFRvXZ627Zt07Zt20a7DwAAAAAANj+NXqIfeeSRWbp0acaPH5/FixdnwIABmTlzZvXLRhctWpRmzf75wPzPfvazrFmzJp///OdrnGfChAk5++yzN2V0gP+/vTuPsqI80Af8NsgiIksGAVkEd0RUFNRBx6AGRXGJWzS4gLhGRVGMC4myiIHBUYITY1AjuERHBmOiUYOTIBgUXOIaN6LE7acCKkEEIgjdvz9y6NhCabcC3cDznHPP4X71VdV7b9+G9u3yKwAAAADWc9VeoidJ//79079//1Vumzp1aoXnb7755poPBAAAAAAAqeY10QEAAAAAoCZTogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABRQogMAAAAAQAElOgAAAAAAFFCiAwAAAABAASU6AAAAAAAUUKIDAAAAAEABJToAAAAAABSoESX6z3/+87Rv3z7169fPnnvumSeffPJL50+cODEdOnRI/fr1s9NOO+XBBx9cS0kBAAAAANiQVHuJPmHChAwcODBDhgzJM888k1122SU9e/bM3LlzVzl/+vTp6d27d0499dQ8++yzOeKII3LEEUfkxRdfXMvJAQAAAABY31V7iT569Oicfvrp6devXzp27JixY8emQYMGGTdu3CrnX3vttTnooINy0UUXZYcddsjw4cOz22675brrrlvLyQEAAAAAWN9tVJ0nX7p0aZ5++ukMGjSofKxWrVrp0aNHZsyYscp9ZsyYkYEDB1YY69mzZ37729+ucv6SJUuyZMmS8ucff/xxkmTBggXfMP26rXTJ4lWOr3hfiravmPNNt3+TDKsrY03IsCYz1oQM60LGmpDBZ3rtZqwJGdaFjDUhg+/9dSfDupCxJmRYFzLWhAy+99edDOtCxpqQYV3IWBMyrAsZa0IGf0euOxnWhYw1IcO6kLEmZFgb3/sbqhWvvays7EvnlZR91Yw16L333kvr1q0zffr0dOvWrXz84osvziOPPJInnnhipX3q1q2bW2+9Nb179y4fu/766zNs2LDMmTNnpflDhw7NsGHD1swLAAAAAABgnfbOO++kTZs2hdur9Ur0tWHQoEEVrlwvLS3NvHnz8m//9m8pKSmpxmQAAAAAAFSXsrKyfPLJJ2nVqtWXzqvWEr1Zs2apXbv2SleQz5kzJy1btlzlPi1btqzS/Hr16qVevXoVxpo0afL1QwMAAAAAsF5o3LjxV86p1huL1q1bN126dMnkyZPLx0pLSzN58uQKy7t8Xrdu3SrMT5I//OEPhfMBAAAAAODrqvblXAYOHJi+ffuma9eu2WOPPTJmzJgsWrQo/fr1S5L06dMnrVu3zsiRI5MkAwYMSPfu3XPNNdfkkEMOyV133ZU///nPufHGG6vzZQAAAAAAsB6q9hL9uOOOywcffJDBgwdn9uzZ6dy5cyZNmpQWLVokSd5+++3UqvWvC+b32muv3Hnnnbnsssvyox/9KNtuu21++9vfplOnTtX1EgAAAAAAWE+VlJWVlVV3CAAA4F/efPPNbLnllnn22WfTuXPn6o5TJetydgAAWJVqXRMdAADWVyUlJV/6GDp0aHVHXMm+++6b888/v7pjAABAjVLty7kAAMD66P333y//84QJEzJ48ODMnDmzfKxhw4bVEQsAAKgiV6IDAMAa0LJly/JH48aNU1JSUv68efPmGT16dNq0aZN69eqV3xeoyPLly3PKKaekQ4cOefvtt5Mk9957b3bbbbfUr18/W221VYYNG5Zly5aV71NSUpJf/vKXOfLII9OgQYNsu+22ue+++6r0Gtq3b58RI0bklFNOyaabbpotttgiN954Y4U5Tz75ZHbdddfUr18/Xbt2zbPPPrvScV588cUcfPDBadiwYVq0aJGTTjopH374YZJk6tSpqVu3bqZNm1Y+/6qrrkrz5s0zZ86cKuUFAIA1QYkOAABr2bXXXptrrrkmV199dV544YX07Nkzhx9+eF577bWV5i5ZsiTf+9738txzz2XatGnZYostMm3atPTp0ycDBgzIyy+/nBtuuCG33HJLfvKTn1TYd9iwYTn22GPzwgsvpFevXjnhhBMyb968KmW95pprysvxs88+O2eddVb5FfULFy7MoYcemo4dO+bpp5/O0KFD88Mf/rDC/vPnz8/++++fXXfdNX/+858zadKkzJkzJ8cee2ySfy0hc9JJJ+Xjjz/Os88+m8svvzy//OUv06JFiyplBQCANUGJDgAAa9nVV1+dSy65JN///vez/fbbZ9SoUencuXPGjBlTYd7ChQtzyCGH5IMPPsiUKVOy2WabJflnOX7ppZemb9++2WqrrXLAAQdk+PDhueGGGyrsf/LJJ6d3797ZZpttMmLEiCxcuDBPPvlklbL26tUrZ599drbZZptccskladasWaZMmZIkufPOO1NaWpqbb745O+64Yw499NBcdNFFFfa/7rrrsuuuu2bEiBHp0KFDdt1114wbNy5TpkzJX//61yTJlVdemaZNm+aMM87IiSeemL59++bwww+vUk4AAFhTrIkOAABr0YIFC/Lee+9l7733rjC+99575/nnn68w1rt377Rp0yYPP/xwNt544/Lx559/Po899liFK8+XL1+eTz/9NIsXL06DBg2SJDvvvHP59k022SSNGjXK3Llzq5T388dYsSTNimO88sor2XnnnVO/fv3yOd26dauw//PPP58pU6ascg34WbNmZbvttkvdunVzxx13ZOedd067du3y05/+tEoZAQBgTVKiAwBADdWrV6/86le/yowZM7L//vuXjy9cuDDDhg3LUUcdtdI+ny+069SpU2FbSUlJSktLq5Thmx5j4cKFOeywwzJq1KiVtm2++eblf54+fXqSZN68eZk3b1422WSTKuUEAIA1RYkOAABrUaNGjdKqVas89thj6d69e/n4Y489lj322KPC3LPOOiudOnXK4YcfngceeKB8/m677ZaZM2dmm222WavZv2iHHXbI7bffnk8//bS8vH/88ccrzNltt93y61//Ou3bt89GG636Pz9mzZqVCy64IDfddFMmTJiQvn375o9//GNq1bL6JAAA1c9PpQAAsJZddNFFGTVqVCZMmJCZM2fm0ksvzXPPPZcBAwasNPfcc8/NlVdemUMPPTSPPvpokmTw4MG57bbbMmzYsLz00kt55ZVXctddd+Wyyy5bq6/j+OOPT0lJSU4//fS8/PLLefDBB3P11VdXmHPOOedk3rx56d27d5566qnMmjUrDz30UPr165fly5dn+fLlOfHEE9OzZ8/069cv48ePzwsvvJBrrrlmrb4WAAAo4kp0AABYy84777x8/PHHufDCCzN37tx07Ngx9913X7bddttVzj///PNTWlqaXr16ZdKkSenZs2fuv//+XHHFFRk1alTq1KmTDh065LTTTlurr6Nhw4b53e9+lx/84AfZdddd07Fjx4waNSpHH310+ZwVV91fcsklOfDAA7NkyZK0a9cuBx10UGrVqpXhw4fnrbfeyv3335/kn0u83Hjjjendu3cOPPDA7LLLLmv1NQEAwBeVlJWVlVV3CAAAAAAAqIks5wIAAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUECJDgAAAAAABZToAAAAAABQQIkOAAAAAAAFlOgAAFTQvn37nHzyyav1mCUlJRk6dGj581tuuSUlJSV58803V+t59t133+y7776r9Zj808KFC3PaaaelZcuWKSkpyfnnn1/dkdZZa+rzDwDAmqFEBwDYQPzlL3/JMccck3bt2qV+/fpp3bp1DjjggPzsZz+r7mhrzHvvvZehQ4fmueeeW+3HfvTRR3PwwQendevWqV+/frbYYoscdthhufPOO1f7uWqCESNG5JZbbslZZ52V22+/PSeddNIaPV/79u1TUlKSkpKS1KpVK02aNMlOO+2UM844I0888cQ3Ovb111+fW265ZfUE/RIjRozIb3/72zV+nq9r/vz5ad68eUpKSnL33XdXdxwAgBqrpKysrKy6QwAAsGZNnz49++23X7bYYov07ds3LVu2zDvvvJPHH388s2bNyuuvv14+d8mSJalVq1bq1Kmz2s7/6aefZqONNspGG22U5J9X4vbr1y9vvPFG2rdvv9rOs3Tp0iRJ3bp1kyR//vOfs/vuu2f8+PGr9er6iRMn5rjjjkvnzp3z/e9/P02bNs0bb7yRP/3pT6lTp06mTJmy2s5VU/z7v/97Ntpoozz66KNr5Xzt27dP06ZNc+GFFyZJPvnkk7zyyiuZOHFiZs+enQsuuCCjR4/+Wsfu1KlTmjVrlqlTp67GxCtr2LBhjjnmmJUK++XLl+ezzz5LvXr1UlJSskYzfJnzzjsv48aNy6JFizJx4sQcc8wx1ZYFAKAm26i6AwAAsOb95Cc/SePGjfPUU0+lSZMmFbbNnTu3wvN69eqt9vPXr19/tR/z8xYvXpwGDRqUl+dr2tChQ9OxY8c8/vjjK53zi+/nmlRWVpZPP/00G2+88Ro/19y5c9OxY8fVdrxly5altLT0S79mrVu3zoknnlhhbNSoUTn++OPz05/+NNtuu23OOuus1ZZpbaldu3Zq165drRlefPHF/OIXv8jgwYMzePDgas0CAFDTWc4FAGADMGvWrOy4444rFehJ0rx58wrPv7gm+or1mx999NGcd9552WyzzdKkSZOceeaZWbp0aebPn58+ffqkadOmadq0aS6++OJ88X92/OKa6Kty77335pBDDkmrVq1Sr169bL311hk+fHiWL19eYd6+++6bTp065emnn863v/3tNGjQID/60Y/Kt61YE33q1KnZfffdkyT9+vUrXxrklltuyZAhQ1KnTp188MEHK+U444wz0qRJk3z66aeFWWfNmpXdd999lQXwF9/P0tLSXHvttdlpp51Sv379bLbZZjnooIPy5z//uXzOsmXLMnz48Gy99dapV69e2rdvnx/96EdZsmRJhWO1b98+hx56aB566KF07do1G2+8cW644YYk/1ya4/zzz0/btm1Tr169bLPNNhk1alRKS0srHOOuu+5Kly5dsummm6ZRo0bZaaedcu211xa+1qlTp6akpCRvvPFGHnjggfL3ccV63nPnzs2pp56aFi1apH79+tlll11y6623VjjGm2++mZKSklx99dUZM2ZM+et8+eWXC89bZOONN87tt9+eb33rW/nJT35S4bNWWlqaMWPGZMcdd0z9+vXTokWLnHnmmfn73/9e4T186aWX8sgjj5S/ls+vo1/Z9/Grvq4lJSVZtGhRbr311vLzrPi+KloT/frrr8+OO+6YevXqpVWrVjnnnHMyf/78CnNWfP5ffvnl7LfffmnQoEFat26dq666qkrv44ABA3LkkUdmn332qdJ+AAAbIleiAwBsANq1a5cZM2bkxRdfTKdOnb7WMc4999y0bNkyw4YNy+OPP54bb7wxTZo0yfTp07PFFltkxIgRefDBB/Nf//Vf6dSpU/r06VOl499yyy1p2LBhBg4cmIYNG+bhhx/O4MGDs2DBgvzXf/1XhbkfffRRDj744Hz/+9/PiSeemBYtWqx0vB122CFXXHFFBg8enDPOOKO8LNxrr73yH//xH7niiisyYcKE9O/fv3yfpUuX5u67787RRx/9pVfPt2vXLpMnT87/+3//L23atPnS13XqqafmlltuycEHH5zTTjsty5Yty7Rp0/L444+na9euSZLTTjstt956a4455phceOGFeeKJJzJy5Mi88sor+c1vflPheDNnzkzv3r1z5pln5vTTT8/222+fxYsXp3v37nn33Xdz5plnZosttsj06dMzaNCgvP/++xkzZkyS5A9/+EN69+6d73znOxk1alSS5JVXXsljjz2WAQMGrDL/DjvskNtvvz0XXHBB2rRpU768ymabbZZ//OMf2XffffP666+nf//+2XLLLTNx4sScfPLJmT9//krHHD9+fD799NOcccYZqVevXr71rW996XtXpGHDhjnyyCNz88035+WXX86OO+6YJDnzzDPLlwo677zz8sYbb+S6667Ls88+m8ceeyx16tTJmDFjcu6556Zhw4b58Y9/nCTln5/Kvo+V+brefvvtOe2007LHHnvkjDPOSJJsvfXWha9p6NChGTZsWHr06JGzzjorM2fOzC9+8Ys89dRT5dlX+Pvf/56DDjooRx11VI499tjcfffdueSSS7LTTjvl4IMP/sr3b+LEiZk+fXpeeeUVNzcFAKiMMgAA1nv/93//V1a7du2y2rVrl3Xr1q3s4osvLnvooYfKli5dutLcdu3alfXt27f8+fjx48uSlPXs2bOstLS0fLxbt25lJSUlZT/4wQ/Kx5YtW1bWpk2bsu7du1c4ZpKyIUOGrHTMN954o3xs8eLFK2U588wzyxo0aFD26aeflo917969LEnZ2LFjV5rfvXv3Cud+6qmnypKUjR8/fqW53bp1K9tzzz0rjN1zzz1lScqmTJmy0vzPu/nmm8uSlNWtW7dsv/32K7v88svLpk2bVrZ8+fIK8x5++OGyJGXnnXfeSsdY8V4+99xzZUnKTjvttArbf/jDH5YlKXv44YfLx9q1a1eWpGzSpEkV5g4fPrxsk002KfvrX/9aYfzSSy8tq127dtnbb79dVlZWVjZgwICyRo0alS1btuxLX9+qtGvXruyQQw6pMDZmzJiyJGW/+tWvyseWLl1a1q1bt7KGDRuWLViwoKysrKzsjTfeKEtS1qhRo7K5c+d+7fN93k9/+tOyJGX33ntvWVlZWdm0adPKkpTdcccdFeZNmjRppfEdd9xxpc9oWVnl38fKfF3LysrKNtlkkwrfSyt88fM/d+7csrp165YdeOCBFT5D1113XVmSsnHjxpWPrfj833bbbeVjS5YsKWvZsmXZ0UcfvdK5vmjx4sVlW2yxRdmgQYPKysrKyqZMmVKWpGzixIlfuS8AwIbKci4AABuAAw44IDNmzMjhhx+e559/PldddVV69uyZ1q1b57777qvUMU499dQKN0Hcc889U1ZWllNPPbV8rHbt2unatWv+9re/VTnj59f1/uSTT/Lhhx9mn332yeLFi/Pqq69WmFuvXr3069evyuf4vD59+uSJJ57IrFmzysfuuOOOtG3bNt27d//SfU855ZRMmjQp++67bx599NEMHz48++yzT7bddttMnz69fN6vf/3rlJSUZMiQISsdY8V7+eCDDyZJBg4cWGH7iiu+H3jggQrjW265ZXr27FlhbOLEidlnn33StGnTfPjhh+WPHj16ZPny5fnTn/6UJGnSpEkWLVqUP/zhD1/6+irrwQcfTMuWLdO7d+/ysTp16uS8887LwoUL88gjj1SYf/TRR2ezzTZbLedu2LBhkn9+VpJ/vgeNGzfOAQccUOE96NKlSxo2bFipm71W9n2szNe1Kv74xz9m6dKlOf/881Or1r/+E+30009Po0aNVvoMNGzYsMJa8XXr1s0ee+xRqe+7//zP/8xnn31WvgQSAABfTYkOALCB2H333XPPPffk73//e5588skMGjQon3zySY455phKrU29xRZbVHjeuHHjJEnbtm1XGv/8GtSV9dJLL+XII49M48aN06hRo2y22WblReHHH39cYW7r1q2/8U1EjzvuuNSrVy933HFH+Tnuv//+nHDCCZUqQnv27JmHHnoo8+fPz5/+9Kecc845eeutt3LooYeW31x01qxZadWq1ZcuW/LWW2+lVq1a2WabbSqMt2zZMk2aNMlbb71VYXzLLbdc6RivvfZaJk2alM0226zCo0ePHkn+dbPTs88+O9ttt10OPvjgtGnTpvyXAV/XW2+9lW233bZC8Zv8cwmYFdu/KvvXtXDhwiTJpptumuSf78HHH3+c5s2br/Q+LFy4sFI3fK3s+1iZr2tVrHiftt9++wrjdevWzVZbbbXS+9imTZuVPqNNmzb9yu+7N998M//1X/+Vn/zkJ+W/hAAA4KtZEx0AYANTt27d7L777tl9992z3XbbpV+/fpk4ceIqr6r9vNq1a1d6vOwLNxb9KvPnz0/37t3TqFGjXHHFFdl6661Tv379PPPMM7nkkktWuqnj569a/7qaNm2aQw89NHfccUcGDx6cu+++O0uWLKlwhW9lNGjQIPvss0/22WefNGvWLMOGDcvvf//79O3bt0rHqewVzKt67aWlpTnggANy8cUXr3Kf7bbbLsk/b3r63HPP5aGHHsrvf//7/P73v8/48ePTp0+flW4Guiasjq/bCi+++GKSlP/yobS0NM2bNy//pcgXVeYK+Mq+j9Wt6Hvxq77vBg8enNatW2ffffctXwt99uzZSZIPPvggb775ZrbYYouVfikCALChU6IDAGzAVtzY8v3336/WHFOnTs1HH32Ue+65J9/+9rfLx994441vdNyvKqb79OmT7373u3nqqadyxx13ZNdddy2/SeXX8cX3c+utt85DDz2UefPmFV613K5du5SWlua1114rv4I7SebMmZP58+enXbt2X3nerbfeOgsXLiy/YvrL1K1bN4cddlgOO+ywlJaW5uyzz84NN9yQyy+/fKWr4b9Ku3bt8sILL6S0tLRC8bpi+Z3KZP86Fi5cmN/85jdp27Zt+Xu29dZb549//GP23nvvryzriz4XlX0fK/N1/bLzfNGK92nmzJnZaqutyseXLl2aN954o1Jf18p4++238/rrr1c4xwpnn312kn/etLRJkyar5XwAAOsLlxgAAGwApkyZssqrVFesx/3FZSTWthVX1n4+49KlS3P99dd/o+NusskmSf55pfuqHHzwwWnWrFlGjRqVRx55pNJXoU+ePHmV4198P48++uiUlZVl2LBhK81d8Vp79eqVJBkzZkyF7aNHj06SHHLIIV+Z59hjj82MGTPy0EMPrbRt/vz5WbZsWZLko48+qrCtVq1a2XnnnZMkS5Ys+crzfFGvXr0ye/bsTJgwoXxs2bJl+dnPfpaGDRt+5dryX8c//vGPnHTSSZk3b15+/OMflxfVxx57bJYvX57hw4evtM+yZcsqfAY22WSTVX4mKvs+Vubr+mXn+aIePXqkbt26+e///u8K+9988835+OOPK/UZqIwrr7wyv/nNbyo8VrxfF198cX7zm9+Uf88AAPAvrkQHANgAnHvuuVm8eHGOPPLIdOjQIUuXLs306dMzYcKEtG/f/hvfpPOb2muvvdK0adP07ds35513XkpKSnL77bdXeVmYL9p6663TpEmTjB07Nptuumk22WST7LnnnuVrc9epUyff//73c91116V27doVbpD5Zb773e9myy23zGGHHZatt946ixYtyh//+Mf87ne/y+67757DDjssSbLffvvlpJNOyn//93/ntddey0EHHZTS0tJMmzYt++23X/r3759ddtklffv2zY033li+rM2TTz6ZW2+9NUcccUT222+/r8xz0UUX5b777suhhx6ak08+OV26dMmiRYvyl7/8JXfffXfefPPNNGvWLKeddlrmzZuX/fffP23atMlbb72Vn/3sZ+ncuXOFq+Ar64wzzsgNN9yQk08+OU8//XTat2+fu+++O4899ljGjBlTvl751/Xuu+/mV7/6VZJ/Xn3+8ssvZ+LEiZk9e3YuvPDCnHnmmeVzu3fvnjPPPDMjR47Mc889lwMPPDB16tTJa6+9lokTJ+baa6/NMccckyTp0qVLfvGLX+TKK6/MNttsk+bNm2f//fev9PtYma/rivP88Y9/zOjRo9OqVatsueWW2XPPPVd6nZtttlkGDRqUYcOG5aCDDsrhhx+emTNn5vrrr8/uu+9e5SWGivzHf/zHSmMrrjrffffdc8QRR6yW8wAArG+U6AAAG4Crr746EydOzIMPPpgbb7wxS5cuzRZbbJGzzz47l112WbUv3/Bv//Zvuf/++3PhhRfmsssuS9OmTXPiiSfmO9/5Tnr27Pm1j1unTp3ceuutGTRoUH7wgx9k2bJlGT9+fIUbXPbp0yfXXXddvvOd72TzzTev1HF/+ctf5t57783//u//5r333ktZWVm22mqr/PjHP84ll1ySjTb614/Z48ePz84775ybb745F110URo3bpyuXbtmr732qnC8rbbaKrfcckt+85vfpGXLlhk0aNBXrlO/QoMGDfLII49kxIgRmThxYm677bY0atQo2223XYYNG1Z+E9gTTzwxN954Y66//vrMnz8/LVu2zHHHHZehQ4d+rXWwN95440ydOjWXXnppbr311ixYsCDbb799xo8fn5NPPrnKx/ui5557LieddFJKSkqy6aabpm3btjnssMNy2mmnZY899lhp/tixY9OlS5fccMMN+dGPfpSNNtoo7du3z4knnpi99967fN7gwYPz1ltv5aqrrsonn3yS7t27Z//996/0+5hU7us6evTonHHGGbnsssvyj3/8I3379l1liZ4kQ4cOzWabbZbrrrsuF1xwQb71rW/ljDPOyIgRI1KnTp1v/F4CAPD1lZR908t7AABgHfb888+nc+fOue2223LSSSdVdxwAAKCGsSY6AAAbtJtuuikNGzbMUUcdVd1RAACAGshyLgAAbJB+97vf5eWXX86NN96Y/v37u6EiAACwSpZzAQBgg9S+ffvMmTMnPXv2zO233/6Nb4IJAACsn5ToAAAAAABQwJroAAAAAABQQIkOAAAAAAAF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/PmCBQtW34sAAAAAAGC9Vu03Fq2K0tLSNG/ePDfeeGO6dOmS4447Lj/+8Y8zduzYwn1GjhyZxo0blz/atm27FhMDAAAAALAuq7YSvVmzZqldu3bmzJlTYXzOnDlp2bLlKvfZfPPNs91226V27drlYzvssENmz56dpUuXrnKfQYMG5eOPPy5/vPPOO6vvRQAAAAAAsF6rthK9bt266dKlSyZPnlw+VlpamsmTJ6dbt26r3GfvvffO66+/ntLS0vKxv/71r9l8881Tt27dVe5Tr169NGrUqMIDAAAAAAAqo1qXcxk4cGBuuumm3HrrrXnllVdy1llnZdGiRenXr1+SpE+fPhk0aFD5/LPOOivz5s3LgAED8te//jUPPPBARowYkXPOOae6XgIAAAAAAOuxaruxaJIcd9xx+eCDDzJ48ODMnj07nTt3zqRJk8pvNvr222+nVq1/9fxt27bNQw89lAsuuCA777xzWrdunQEDBuSSSy6prpcAAAAAAMB67GuV6MuWLcvUqVMza9asHH/88dl0003z3nvvpVGjRmnYsGGVjtW/f//0799/ldumTp260li3bt3y+OOPf53YAAAAAABQJVUu0d96660cdNBBefvtt7NkyZIccMAB2XTTTTNq1KgsWbIkY8eOXRM5AQAAAABgravymugDBgxI165d8/e//z0bb7xx+fiRRx5Z4SahAAAAAACwrqvylejTpk3L9OnTU7du3Qrj7du3z7vvvrvaggEAAAAAQHWr8pXopaWlWb58+Urj/+///b9suummqyUUAAAAAADUBFUu0Q888MCMGTOm/HlJSUkWLlyYIUOGpFevXqszGwAAAAAAVKsqL+dy9dVX56CDDkrHjh3z6aef5vjjj89rr72WZs2a5X/+53/WREYAAAAAAKgWVS7R27Ztm+effz4TJkzI888/n4ULF+bUU0/NCSecUOFGowAAAAAAsK6rUon+2WefpUOHDrn//vtzwgkn5IQTTlhTuQAAAAAAoNpVaU30OnXq5NNPP11TWQAAAAAAoEap8o1FzznnnIwaNSrLli1bE3kAAAAAAKDGqPKa6E899VQmT56c//u//8tOO+2UTTbZpML2e+65Z7WFAwAAAACA6lTlEr1JkyY5+uij10QWAAAAAACoUapcoo8fP35N5AAAAAAAgBqnyiX6Ch988EFmzpyZJNl+++2z2WabrbZQAAAAAABQE1T5xqKLFi3KKaecks033zzf/va38+1vfzutWrXKqaeemsWLF6+JjAAAAAAAUC2qXKIPHDgwjzzySH73u99l/vz5mT9/fu6999488sgjufDCC9dERgAAAAAAqBZVXs7l17/+de6+++7su+++5WO9evXKxhtvnGOPPTa/+MUvVmc+AAAAAACoNlW+En3x4sVp0aLFSuPNmze3nAsAAAAAAOuVKpfo3bp1y5AhQ/Lpp5+Wj/3jH//IsGHD0q1bt9UaDgAAAAAAqlOVl3O59tpr07Nnz7Rp0ya77LJLkuT5559P/fr189BDD632gAAAAAAAUF2qXKJ36tQpr732Wu644468+uqrSZLevXvnhBNOyMYbb7zaAwIAAAAAQHWpcomeJA0aNMjpp5++urMAAAAAAECNUuU10UeOHJlx48atND5u3LiMGjVqtYQCAAAAAICaoMol+g033JAOHTqsNL7jjjtm7NixqyUUAAAAAADUBFUu0WfPnp3NN998pfHNNtss77///moJBQAAAAAANUGVS/S2bdvmscceW2n8scceS6tWrVZLKAAAAAAAqAmqfGPR008/Peeff34+++yz7L///kmSyZMn5+KLL86FF1642gMCAAAAAEB1qXKJftFFF+Wjjz7K2WefnaVLlyZJ6tevn0suuSSDBg1a7QEBAAAAAKC6VLlELykpyahRo3L55ZfnlVdeycYbb5xtt9029erVWxP5AAAAAACg2lR5TfQVGjZsmN133z2bbrppZs2aldLS0tWZCwAAAAAAql2lS/Rx48Zl9OjRFcbOOOOMbLXVVtlpp53SqVOnvPPOO6s9IAAAAAAAVJdKl+g33nhjmjZtWv580qRJGT9+fG677bY89dRTadKkSYYNG7ZGQgIAAAAAQHWo9Jror732Wrp27Vr+/N577813v/vdnHDCCUmSESNGpF+/fqs/IQAAAAAAVJNKX4n+j3/8I40aNSp/Pn369Hz7298uf77VVltl9uzZqzcdAAAAAABUo0qX6O3atcvTTz+dJPnwww/z0ksvZe+99y7fPnv27DRu3Hj1JwQAAAAAgGpS6eVc+vbtm3POOScvvfRSHn744XTo0CFdunQp3z59+vR06tRpjYQEAAAAAIDqUOkS/eKLL87ixYtzzz33pGXLlpk4cWKF7Y899lh69+692gMCAAAAAEB1qXSJXqtWrVxxxRW54oorVrn9i6U6AAAAAACs6yq9JjoAAAAAAGxolOgAAAAAAFBAiQ4AAAAAAAWU6AAAAAAAUKDKJfqUKVPWRA4AAAAAAKhxqlyiH3TQQdl6661z5ZVX5p133lkTmQAAAAAAoEaocon+7rvvpn///rn77ruz1VZbpWfPnvnf//3fLF26dE3kAwAAAACAalPlEr1Zs2a54IIL8txzz+WJJ57Idtttl7PPPjutWrXKeeedl+eff35N5AQAAAAAgLXuG91YdLfddsugQYPSv3//LFy4MOPGjUuXLl2yzz775KWXXlpdGQEAAAAAoFp8rRL9s88+y913351evXqlXbt2eeihh3Lddddlzpw5ef3119OuXbt873vfW91ZAQAAAABgrdqoqjuce+65+Z//+Z+UlZXlpJNOylVXXZVOnTqVb99kk01y9dVXp1WrVqs1KAAAAAAArG1VLtFffvnl/OxnP8tRRx2VevXqrXJOs2bNMmXKlG8cDgAAAAAAqlOVl3MZMmRIvve9761UoC9btix/+tOfkiQbbbRRunfvvnoSAgAAAABANalyib7ffvtl3rx5K41//PHH2W+//VZLKAAAAAAAqAmqXKKXlZWlpKRkpfGPPvoom2yyyWoJBQAAAAAANUGl10Q/6qijkiQlJSU5+eSTKyznsnz58rzwwgvZa6+9Vn9CAAAAAACoJpUu0Rs3bpzkn1eib7rpptl4443Lt9WtWzf//u//ntNPP331JwQAAAAAgGpS6RJ9/PjxSZL27dvnhz/8oaVbAAAAAABY71W6RF9hyJAhayIHAAAAAADUOJUq0XfbbbdMnjw5TZs2za677rrKG4uu8Mwzz6y2cAAAAAAAUJ0qVaJ/97vfLb+R6BFHHLEm8wAAAAAAQI1RqRJ9xRIuy5cvz3777Zedd945TZo0WZO5AAAAAACg2tWqyuTatWvnwAMPzN///vc1lQcAAAAAAGqMKpXoSdKpU6f87W9/WxNZAAAAAACgRqlyiX7llVfmhz/8Ye6///68//77WbBgQYUHAAAAAACsLyq1Jvrn9erVK0ly+OGHp6SkpHy8rKwsJSUlWb58+epLBwAAAAAA1ajKJfqUKVPWRA4AAAAAAKhxqlyid+/efU3kAAAAAACAGqfKJfoKixcvzttvv52lS5dWGN95552/cSgAAAAAAKgJqlyif/DBB+nXr19+//vfr3K7NdEBAAAAAFhf1KrqDueff37mz5+fJ554IhtvvHEmTZqUW2+9Ndtuu23uu+++NZERAAAAAACqRZWvRH/44Ydz7733pmvXrqlVq1batWuXAw44II0aNcrIkSNzyCGHrImcAAAAAACw1lX5SvRFixalefPmSZKmTZvmgw8+SJLstNNOeeaZZ1ZvOgAAAAAAqEZVLtG33377zJw5M0myyy675IYbbsi7776bsWPHZvPNN1/tAQEAAAAAoLpUeTmXAQMG5P3330+SDBkyJAcddFDuuOOO1K1bN7fccsvqzgcAAAAAANWmyiX6iSeeWP7nLl265K233sqrr76aLbbYIs2aNVut4QAAAAAAoDpVuUT/ogYNGmS33XZbHVkAAAAAAKBGqVSJPnDgwEofcPTo0V87DAAAAAAA1CSVKtGfffbZSh2spKTkG4UBAAAAAICapFIl+pQpU9Z0DgAAAAAAqHFqVXcAAAAAAACoqSp1JfpRRx2VW265JY0aNcpRRx31pXPvueee1RIMAAAAAACqW6VK9MaNG5evd964ceM1GggAAAAAAGqKSpXo48ePX+WfAQAAAABgfVYj1kT/+c9/nvbt26d+/frZc8898+STT1Zqv7vuuislJSU54ogj1mxAAAAAAAA2SFUu0T/66KOcc8456dixY5o1a5ZvfetbFR5VNWHChAwcODBDhgzJM888k1122SU9e/bM3Llzv3S/N998Mz/84Q+zzz77VPmcAAAAAABQGZVazuXzTjrppLz++us59dRT06JFi/K10r+u0aNH5/TTT0+/fv2SJGPHjs0DDzyQcePG5dJLL13lPsuXL88JJ5yQYcOGZdq0aZk/f/43ygAAAAAAAKtS5RJ92rRpefTRR7PLLrt845MvXbo0Tz/9dAYNGlQ+VqtWrfTo0SMzZswo3O+KK65I8+bNc+qpp2batGnfOAcAAAAAAKxKlUv0Dh065B//+MdqOfmHH36Y5cuXp0WLFhXGW7RokVdffXWV+zz66KO5+eab89xzz1XqHEuWLMmSJUvKny9YsOBr5wUAAAAAYMNS5TXRr7/++vz4xz/OI488ko8++igLFiyo8FiTPvnkk5x00km56aab0qxZs0rtM3LkyDRu3Lj80bZtV1RIiwAAFNBJREFU2zWaEQAAAACA9UeVr0Rv0qRJFixYkP3337/CeFlZWUpKSrJ8+fJKH6tZs2apXbt25syZU2F8zpw5admy5UrzZ82alTfffDOHHXZY+VhpaWmSZKONNsrMmTOz9dZbV9hn0KBBGThwYPnzBQsWKNIBAAAAAKiUKpfoJ5xwQurUqZM777zzG99YtG7duunSpUsmT56cI444Isk/S/HJkyenf//+K83v0KFD/vKXv1QYu+yyy/LJJ5/k2muvXWU5Xq9evdSrV+9rZwQAAAAAYMNV5RL9xRdfzLPPPpvtt99+tQQYOHBg+vbtm65du2aPPfbImDFjsmjRovTr1y9J0qdPn7Ru3TojR45M/fr106lTpwr7N2nSJElWGgcAAAAAgG+qyiV6165d884776y2Ev24447LBx98kMGDB2f27Nnp3LlzJk2aVH6z0bfffju1alV56XYAAAAAAPjGqlyin3vuuRkwYEAuuuii7LTTTqlTp06F7TvvvHOVQ/Tv33+Vy7ckydSpU79031tuuaXK5wMAAAAAgMqocol+3HHHJUlOOeWU8rGSkpKvdWNRAAAAAACoyapcor/xxhtrIgcAAAAAANQ4VS7R27VrtyZyAAAAAABAjVOpEv2+++7LwQcfnDp16uS+++770rmHH374agkGAAAAAADVrVIl+hFHHJHZs2enefPmOeKIIwrnWRMdAAAAAID1SaVK9NLS0lX+GQAAAAAA1me1qjsAAAAAAADUVJUu0WfMmJH777+/wthtt92WLbfcMs2bN88ZZ5yRJUuWrPaAAAAAAABQXSpdol9xxRV56aWXyp//5S9/yamnnpoePXrk0ksvze9+97uMHDlyjYQEAAAAAIDqUOkS/bnnnst3vvOd8ud33XVX9txzz9x0000ZOHBg/vu//zv/+7//u0ZCAgAAAABAdah0if73v/89LVq0KH/+yCOP5OCDDy5/vvvuu+edd95ZvekAAAAAAKAaVbpEb9GiRd54440kydKlS/PMM8/k3//938u3f/LJJ6lTp87qTwgAAAAAANWk0iV6r169cumll2batGkZNGhQGjRokH322ad8+wsvvJCtt956jYQEAAAAAIDqsFFlJw4fPjxHHXVUunfvnoYNG+bWW29N3bp1y7ePGzcuBx544BoJCQAAAAAA1aHSJXqzZs3ypz/9KR9//HEaNmyY2rVrV9g+ceLENGzYcLUHBAAAAACA6lLpEn2F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9tupVetfF8zvtddeufPOO3PZZZflRz/6Ubbddtv89re/TadOnarrJQAAAAAAsJ4qKSsrK6vuEAAAwL+8+eab2XLLLfPss8+mc+fO1R2nStbl7AAAsCrVuiY6AACsr0pKSr70MXTo0OqOuJJ99903559/fnXHAACAGqXal3MBAID10fvvv1/+5wkTJmTw4MGZOXNm+VjDhg2rIxYAAFBFrkQHAIA1oGXLluWPxo0bp6SkpPx58+bNM3r06LRp0yb16tUrvy9QkeXLl+eUU05Jhw4d8vbbbydJ7r333uy2226pX79+ttpqqwwbNizLli0r36ekpCS//OUvc+SRR6ZBgwbZdtttc99991XpNbRv3z4jRozIKaeckk033TRbbLFFbrzxxgpznnzyyey6666pX79+unbtmmeffXal47z44os5+OCD07Bhw7Ro0SInnXRSPvzwwyTJ1KlTU7du3UybNq18/lVXXZXmzZtnzpw5VcoLAABrghIdAADWsmuvvTbXXHNNrr766rzwwgvp2bNnDj/88Lz22msrzV2yZEm+973v5bnnnsu0adOyxRZbZNq0aenTp08GDBiQl19+OTfccENuueWW/OQnP6mw77Bhw3LsscfmhRdeSK9evXLCCSdk3rx5Vcp6zTXXlJfjZ599ds4666zyK+oXLlyYQw89NB07dszTTz+doUOH5oc//GGF/efPn5/9998/u+66a/785z9n0qRJmTNnTo499tgk/1pC5qSTTsrHH3+cZ599Npdffnl++ctfpkWLFlXKCgAAa4ISHQAA1rKrr746l1xySb7//e9n++23z6hRo9K5c+eMGTOmwryFCxfmkEMOyQcffJApU6Zks802S/LPcvzSSy9N3759s9VWW+WAAw7I8OHDc8MNN1TY/+STT07v3r2zzTbbZMSIEVm4cGGefPLJKmXt1atXzj777GyzzTa55JJL0qxZs0yZMiVJcuedd6a0tDQ333xzdtxxxxx66KG56KKLKux/3XXXZdddd82IESPSoUOH7Lrrrhk3blymTJmSv/71r0mSK6+8Mk2bNs0ZZ5yRE088MX379s3hhx9epZwAALCmWBMdAADWogULFuS9997L3nvvXWF87733zvPPP19hrHfv3mnTpk0efvjhbLzxxuXjzz//fB577LEKV54vX748n376aRYvXpwGDRokSXbeeefy7ZtsskkaNWqUuXPnVinv54+xYkmaFcd45ZVXsvPOO6d+/frlc7p161Zh/+effz5TpkxZ5Rrws2bNynbbbZe6devmjjvuyM4775x27drlpz/9aZUyAgDAmqREBwCAGqpXr1751a9+lRkzZmT//fcvH1+4cGGGDRuWo446aqV9Pl9o16lTp8K2kpKSlJaWVinDNz3GwoULc9hhh2XUqFErbdt8883L/zx9+vQkybx58zJv3rxssskmVcoJAABrihIdAADWokaNGqVVq1Z57LHH0r179/Lxxx57LHvssUeFuWeddVY6deqUww8/PA888ED5/N122y0zZ87MNttss1azf9EOO+yQ22+/PZ9++ml5ef/4449XmLPbbrvl17/+ddq3b5+NNlr1f37MmjUrF1xwQW666aZMmDAhffv2zR//+MfUqmX1SQAAqp+fSgEAYC276KKLMmrUqEyYMCEzZ87MpZdemueeey4DBgxYae65556bK6+8MoceemgeffTRJMngwYNz2223ZdiwYXnppZfyyiuv5K677spll122Vl/H8ccfn5KSkpx++ul5+eWX8+CDD+bqq6+uMOecc87JvHnz0rt37zz11FOZNWtWHnroofTr1y/Lly/P8uXLc+KJJ6Znz57p169fxo8fnxdeeCHXXHPNWn0tAABQxJXoAACwlp133nn5+OOPc+GFF2bu3Lnp2LFj7rvvvmy77barnH/++eentLQ0vXr1yqRJk9KzZ8/cf//9ueKKKzJq1KjUqVMnHTp0yGmnnbZWX0fDhg3zu9/9Lj/4wQ+y6667pmPHjhk1alSOPvro8jkrrrq/5JJLcuCBB2bJkiVp165dDjrooNSqVSvDhw/PW2+9lfvvvz/JP5d4ufHGG9O7d+8ceOCB2WWXXdbqawIAgC8qKSsrK6vuEAAAAAAAUBNZzgUAAAAAAAoo0QEAAAAAoIASHQAAAAAACijRAQAAAACggBIdAAAAAAAKKNEBAAAAAKCAEh0AAAAAAAoo0QEAAAAAoIASHQAAAAAACijRAQAAAACggBIdAAAAAAAKKNEBAAAAAKDA/weeW5aPg7+HtQAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\n", - "Top 5 similar tokens for Detection 1:\n", - "a: 0.9769\n", - ".: 0.9769\n", - "of: 0.9768\n", - "##ing: 0.9768\n", - "##ing: 0.9768\n", - "\n", - "Top 5 similar tokens for Detection 2:\n", - "the: 0.8139\n", - "##ing: 0.8138\n", - "##ing: 0.8138\n", - "): 0.8137\n", - "cell: 0.8136\n", - "\n", - "Top 5 similar tokens for Detection 3:\n", - "a: 0.9955\n", - ".: 0.9955\n", - "##ing: 0.9955\n", - "antibodies: 0.9954\n", - "): 0.9954\n", - "\n", - "Top 5 similar tokens for Detection 4:\n", - "##ing: 0.9008\n", - ".: 0.9007\n", - "##ing: 0.9005\n", - "the: 0.9005\n", - "the: 0.9005\n", - "\n", - "Full Caption:\n", - "[CLS] different types of cervical cell staining with the p16ink4a - specific antibodies. a. normal epithelium ( smear ) : negative staining. b. cin i ( indicated with a dotted arrow ) and cancer in situ ( solid arrows ) : a very poor cytoplasmic staining in separate cin i cells and sporadic staining in cancer in situ. c. invasive squamous cell carcinoma. diffuse cytoplasmic staining with the sole cell expressing p16ink4a in the nucleus ( solid arrow ). the boundary with adjoining normal tissue is marked with a dotted arrow. d. ht3 cells ( smear ) with both nuclear and cytoplasmic subcellular location of the positive staining. [SEP]\n" - ] - } - ], - "source": [ - "# Visualization part starts here\n", - "# Load the original image for drawing\n", - "original_image = Image.open(image_path)\n", - "\n", - "# Create a drawing object\n", - "draw = ImageDraw.Draw(original_image)\n", - "\n", - "# Get the image dimensions\n", - "img_width, img_height = original_image.size\n", - "\n", - "# Define colors for bounding boxes\n", - "colors = ['red', 'green', 'blue', 'yellow']\n", - "\n", - "# Draw bounding boxes\n", - "for i, box in enumerate(detected_boxes):\n", - " # Convert normalized coordinates to pixel coordinates\n", - " cx, cy, w, h = box.cpu().numpy()\n", - " x1 = int((cx - w/2) * img_width)\n", - " y1 = int((cy - h/2) * img_height)\n", - " x2 = int((cx + w/2) * img_width)\n", - " y2 = int((cy + h/2) * img_height)\n", - " \n", - " # Draw rectangle\n", - " draw.rectangle([x1, y1, x2, y2], outline=colors[i % len(colors)], width=3)\n", - " \n", - " # Add detection score\n", - " score = output_det_class.squeeze()[positive_detections][i].item()\n", - " draw.text((x1, y1-20), f\"Score: {score:.4f}\", fill=colors[i % len(colors)])\n", - "\n", - "# Display the image with matplotlib\n", - "plt.figure(figsize=(12, 12))\n", - "plt.imshow(original_image)\n", - "plt.axis('off')\n", - "plt.title(\"Detected Objects\")\n", - "plt.show()\n", - "\n", - "# Decode tokens\n", - "decoded_tokens = tokenizer.convert_ids_to_tokens(text_tokens['input_ids'][0])\n", - "\n", - "# Visualize similarity scores for each detection\n", - "plt.figure(figsize=(15, 5 * detected_similarities.shape[0]))\n", - "for i in range(detected_similarities.shape[0]):\n", - " plt.subplot(detected_similarities.shape[0], 1, i+1)\n", - " plt.bar(range(len(decoded_tokens)), detected_similarities[i].cpu().numpy())\n", - " plt.title(f\"Similarity Scores for Detection {i+1}\")\n", - " plt.xlabel(\"Token Index\")\n", - " plt.ylabel(\"Similarity Score\")\n", - " plt.xticks([]) # Remove x-axis labels for clarity\n", - "plt.tight_layout()\n", - "plt.show()\n", - "\n", - "# Print top 5 most similar tokens for each detection\n", - "for i in range(detected_similarities.shape[0]):\n", - " similarities = detected_similarities[i].cpu().numpy()\n", - " top5_indices = similarities.argsort()[-5:][::-1]\n", - " print(f\"\\nTop 5 similar tokens for Detection {i+1}:\")\n", - " for idx in top5_indices:\n", - " print(f\"{decoded_tokens[idx]}: {similarities[idx]:.4f}\")\n", - "\n", - "# Print the full caption\n", - "print(\"\\nFull Caption:\")\n", - "print(tokenizer.decode(text_tokens['input_ids'][0]))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/openpmcvl/granular/process/subfigure_classify.py b/openpmcvl/granular/process/subfigure_classify.py deleted file mode 100644 index b0c4dbd..0000000 --- a/openpmcvl/granular/process/subfigure_classify.py +++ /dev/null @@ -1,248 +0,0 @@ -""" -Pipeline to filter out nonmedical subfigs -""" - -import csv -import json -import logging -import os -from PIL import Image -import torchvision.transforms as standard_transforms -from torchvision import models -import argparse -import torch.nn as nn -import torch -from torch.utils.data import DataLoader -device = torch.device("cuda" if torch.cuda.is_available() else "cpu") -from tqdm import tqdm -import datetime -from spacy.tokens import Span -import numpy as np -import json -from torch.utils.data import Dataset - - -def fig_classification(fig_class_model_path): - fig_model = models.resnext101_32x8d() - num_features = fig_model.fc.in_features - fc = list(fig_model.fc.children()) # Remove last layer - fc.extend([nn.Linear(num_features, 28)]) # Add our layer with 4 outputs - fig_model.fc = nn.Sequential(*fc) - fig_model = fig_model.to(device) - fig_model.load_state_dict(torch.load(fig_class_model_path)) - fig_model.eval() - - return fig_model - - -class PMC_OA(Dataset): - def __init__(self, csv_path): - # self.data_info = json.load(open(csv_path,'r')) - f = open(csv_path) - lines = f.readlines() - self.data_info = [json.loads(line) for line in lines] - - self.root_dir = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1/caption_T060_filtered_top4_sep_v1_subfigures/' - mean_std = ( [.485, .456, .406], [.229, .224, .225]) - self.fig_class_trasform = standard_transforms.Compose([ - standard_transforms.Resize((384, 384), interpolation=Image.ANTIALIAS), - standard_transforms.ToTensor(), - standard_transforms.Normalize(*mean_std)]) - - """ - self.data_info = [] - ab_count = 0 - for datum in data_info: - img_path = self.root_dir + datum['subfig_id'] - try: - tmp = Image.open(img_path).convert('RGB') - self.data_info.append(datum) - except: - ab_count += 1 - print('Cant Open %d SubFigure'%ab_count) - """ - - def __getitem__(self, index): - try: - img_path = self.root_dir + self.data_info[index]['subfig_id'] - image = Image.open(img_path).convert('RGB') - image = self.fig_class_trasform(image) - except: - image = torch.zeros((3, 384, 384)) - img_path = None - print(self.root_dir + self.data_info[index]['subfig_id']) - return { - "image_path": img_path, - "image": image - } - - def __len__(self): - return len(self.data_info) - - -if __name__ == "__main__": - # 加载所有comfig-fullcaption - with open('/remote-home/share/medical/public/PMC_OA/comfig2cap_dict.json', 'r') as f: - figcap_dict = json.load(f) - - # 对每个subfig分类 - args = argparse.ArgumentParser(description='DocFigure trained model') - args.add_argument('-p', type=str) - args.add_argument('-bs', default=4, type=int) - args = args.parse_args() - # 加载sep得到的所有subfig - json_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1/caption_T060_filtered_top4_sep_v1_before_cap/caption_T060_filtered_top4_sep_v1_before_filter/sub2com_part%s.jsonl'%args.p - # figure classification model - print('Model loading...') - fig_model = fig_classification('/remote-home/zihengzhao/CompoundFigure/Ours/dataset_code/resnext101_figure_class.pth') - print('Model loaded.') - # dataset - print('Dataset loading...') - test_dataset = PMC_OA(json_path) - test_dataloader = DataLoader( - test_dataset, - batch_size=args.bs, - num_workers=4, - pin_memory=True, - sampler=None, - shuffle=False, - collate_fn=None, - drop_last=False, - ) - print('Dataset loaded.') - # class each subfig as medical or nonmedical - pred = {} # subfig_id : class_index - for sample in tqdm(test_dataloader): - image_path = sample['image_path'] - img_tensor = sample['image'].to(device) - fig_label = fig_model(img_tensor) - #print(fig_label.shape) - fig_prediction = fig_label - #print(fig_label.shape) - for index in range(len(image_path)): - if image_path[index]: - subfig_id = image_path[index].split('/')[-1] - pred[subfig_id] = torch.argmax(fig_prediction[index].cpu().detach()).item() - print('%d Subfigs are Reabable Out of %d'%(len(pred), len(test_dataset))) - # 加载unfilter数据,根据class结果筛选subfig,并和captions匹配 - f = open(json_path) - lines = f.readlines() - unfiltered_data = [json.loads(line) for line in lines] - filtered_data = [] # dict of all medical subfigs - ab_count = 0 - # {'subfig_id':'part_%d_%d.jpg'%(part_id, subfig_id), 'comfig_id':comfig_id, 'subfig_loc':[x1/w, y1/h, x2/w, y2/h], 'subfig_score':score, 'caption'} - for datum in tqdm(unfiltered_data): - subfig_id = datum['subfig_id'] - comfig_id = datum['comfig_id'] - if subfig_id not in pred: - continue - if pred[subfig_id] == 15: - filtered_data.append(datum) - datum['caption'] = figcap_dict[comfig_id] - # 所有medical的subfig - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1/caption_T060_filtered_top4_sep_v1_before_cap/sub2com_part%s.jsonl'%args.p, 'w') - for line in filtered_data: - f.write(json.dumps(line)+'\n') - f.close() - print('%d Medical Subfigs Out of %d'%(len(filtered_data), len(unfiltered_data))) - # 根据过滤的subfig,生成comfig数据,comfig中所有nonmedical的subfig将不被记录(如果comfig内所有subfig都是nonmedical,那么就会被过滤掉 - agg_comfig = [] - cur_comfig = filtered_data[0]['comfig_id'] - cur_comfig_datum = {'comfig_id':cur_comfig, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'caption':filtered_data[0]['caption']} - for datum in tqdm(filtered_data): - if datum['comfig_id'] != cur_comfig: # comfig中所有的subfig必须顺序相连 - if len(cur_comfig_datum['subfig_ids'])>0: - agg_comfig.append(cur_comfig_datum) - cur_comfig = datum['comfig_id'] - cur_comfig_datum = {'comfig_id':cur_comfig, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'caption':datum['caption']} - cur_comfig_datum['subfig_ids'].append(datum['subfig_id']) - cur_comfig_datum['subfig_locs'].append(datum['subfig_loc']) - cur_comfig_datum['subfig_scores'].append(datum['subfig_score']) - # print('cur_comfig_datum:', cur_comfig_datum) - if len(cur_comfig_datum['subfig_ids'])>0: - agg_comfig.append(cur_comfig_datum) - # 所有含有medical的subfig的comfig - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1/caption_T060_filtered_top4_sep_v1_before_cap/com2sub_part%s.jsonl'%args.p, 'w') - for line in agg_comfig: - f.write(json.dumps(line)+'\n') - f.close() - print('%d Comfigs Have Medical Subfig'%(len(agg_comfig))) - - exit() - - ############################################################## - # 下面是filter nonmedical + filter不能被exsclaim分割caption # - ############################################################## - - """ - # 加载每个comfig的subcaps和caption - subcap_num = 0 - separable_comfig_num = 0 - comfig2subcaps = {} - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' # exsclaim分割的cap(没有分割subfig也没有对齐,所以都在unassign里) - with open(file_path, 'r') as f: - results = json.load(f) - for comfig_id, datum in tqdm(results.items()): - cap_ls = [datum['full_caption']] # [caption, subcap1, ......] - for cap in datum['unassigned']['captions']: - if len(cap['description']) > 0: - cap_ls += cap['description'] - for subfigure in datum['master_images']: - if "caption" in subfigure and len(subfigure['caption']) > 0: - cap_ls += subfigure['caption'] - comfig2subcaps[comfig_id] = cap_ls - if len(cap_ls) > 1: - separable_comfig_num += 1 - subcap_num += (len(cap_ls) - 1) - print('%d Separable Out of %d, Avg %.2f Subcaptions'%(separable_comfig_num, len(comfig2subcaps), subcap_num/separable_comfig_num)) - - # 加载unfilter数据,根据class结果筛选subfig,并和captions匹配 - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v1_sub2com_unfiltered_part%s.jsonl'%args.p) - lines = f.readlines() - unfiltered_data = [json.loads(line) for line in lines] - filtered_data = [] - # {'subfig_id':'part_%d_%d.jpg'%(part_id, subfig_id), 'comfig_id':comfig_id, 'subfig_loc':[x1/w, y1/h, x2/w, y2/h], 'subfig_score':score} - for datum in tqdm(unfiltered_data): - subfig_id = datum['subfig_id'] - comfig_id = datum['comfig_id'] - if subfig_id not in pred: - continue - if pred[subfig_id] == 15: - # print('medical') - if comfig_id in comfig2subcaps: - print('caption') - datum['caption'] = comfig2subcaps[comfig_id][0] - # {'subfig_id':'part_%d_%d.jpg'%(part_id, subfig_id), 'comfig_id':comfig_id, 'subfig_loc':[x1/w, y1/h, x2/w, y2/h], 'subfig_score':score, 'caption':caption} - filtered_data.append(datum) - else: - print(comfig_id) - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_after_extract_filter/sub2com_part%s.jsonl'%args.p, 'w') - for line in filtered_data: - f.write(json.dumps(line)+'\n') - f.close() - print('%d Subfig Has Caption Out of %d'%(len(filtered_data), len(unfiltered_data))) - - # 根据过滤的subfig,生成comfig数据 - agg_comfig = [] - cur_comfig = filtered_data[0]['comfig_id'] - cur_comfig_datum = {'comfig_id':cur_comfig, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'caption':filtered_data[0]['caption'], 'subcaptions':comfig2subcaps[cur_comfig][1:]} - # {'comfig_id':cur_comfig_id, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[]} - for datum in tqdm(filtered_data): - if datum['comfig_id'] != cur_comfig: - if len(cur_comfig_datum['subfig_ids'])>0: - agg_comfig.append(cur_comfig_datum) - # print('agg_comfig:', agg_comfig) - cur_comfig = datum['comfig_id'] - cur_comfig_datum = {'comfig_id':cur_comfig, 'subfig_ids':[], 'subfig_locs':[], 'subfig_scores':[], 'caption':datum['caption'], 'subcaptions':comfig2subcaps[cur_comfig][1:]} - cur_comfig_datum['subfig_ids'].append(datum['subfig_id']) - cur_comfig_datum['subfig_locs'].append(datum['subfig_loc']) - cur_comfig_datum['subfig_scores'].append(datum['subfig_score']) - # print('cur_comfig_datum:', cur_comfig_datum) - if len(cur_comfig_datum['subfig_ids'])>0: - agg_comfig.append(cur_comfig_datum) - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_v1_divide_after_extract_filter/com2sub_part%s.jsonl'%args.p, 'w') - for line in agg_comfig: - f.write(json.dumps(line)+'\n') - f.close() - print('%d Comfig Has Caption'%(len(agg_comfig))) - """ \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_label.ipynb b/openpmcvl/granular/process/subfigure_label.ipynb deleted file mode 100644 index cb7697a..0000000 --- a/openpmcvl/granular/process/subfigure_label.ipynb +++ /dev/null @@ -1,302 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import os\n", - "import torch\n", - "import torch\n", - "from torchvision import transforms\n", - "from transformers import BertTokenizer\n", - "from PIL import Image, ImageDraw\n", - "import matplotlib.pyplot as plt\n", - "\n", - "ROOT = f\"{os.getcwd()}/pmc_dataset/process\"\n", - "MODEL_DIR = f\"{ROOT}/log/checkpoint.pth\"\n", - "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", - "\n", - "os.chdir(ROOT)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "import yaml\n", - "import torch\n", - "from skimage import io\n", - "import numpy as np\n", - "import cv2\n", - "from torch.autograd import Variable\n", - "from PIL import Image\n", - "import torch.nn.functional as F\n", - "import os\n", - "from tqdm import tqdm\n", - "import json\n", - "\n", - "from subfigure_ocr.models.yolov3 import *\n", - "from subfigure_ocr.models.network import *\n", - "from subfigure_ocr.separator import process" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "class classifier():\n", - " def __init__(self):\n", - " self.root = '/fs01/home/afallah/Multimodal/pmc_dataset/process/subfigure_ocr/'\n", - " configuration_file = self.root + \"config/yolov3_default_subfig.cfg\"\n", - " with open(configuration_file, 'r') as f:\n", - " configuration = yaml.load(f, Loader=yaml.FullLoader)\n", - "\n", - " self.image_size = configuration['TEST']['IMGSIZE']\n", - " self.nms_threshold = configuration['TEST']['NMSTHRE']\n", - " self.confidence_threshold = 0.0001\n", - " self.dtype = torch.cuda.FloatTensor\n", - " self.device = torch.device('cuda')\n", - "\n", - " object_detection_model = YOLOv3(configuration['MODEL'])\n", - " self.object_detection_model = self.load_model_from_checkpoint(object_detection_model, \"object_detection_model.pt\")\n", - " ## Load text recognition model\n", - " text_recognition_model = resnet152()\n", - " self.text_recognition_model = self.load_model_from_checkpoint(text_recognition_model, 'text_recognition_model.pt')\n", - "\n", - " self.object_detection_model.eval()\n", - " self.text_recognition_model.eval()\n", - "\n", - " def load_model_from_checkpoint(self, model, model_name):\n", - " \"\"\" load checkpoint weights into model \"\"\"\n", - " checkpoints_path = self.root + \"checkpoints/\"\n", - " checkpoint = checkpoints_path + model_name\n", - " model.load_state_dict(torch.load(checkpoint))\n", - " # model = nn.DataParallel(model)\n", - " model.to(self.device)\n", - " return model\n", - " \n", - " def detect_subfigure_boundaries(self, figure_path):\n", - " \"\"\" Detects the bounding boxes of subfigures in figure_path\n", - "\n", - " Args:\n", - " figure_path: A string, path to an image of a figure\n", - " from a scientific journal\n", - " Returns:\n", - " subfigure_info (list of lists): Each inner list is\n", - " x1, y1, x2, y2, confidence \n", - " \"\"\"\n", - "\n", - " ## Preprocess the figure for the models\n", - " img = io.imread(figure_path)\n", - " if len(np.shape(img)) == 2:\n", - " img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB)\n", - " else:\n", - " img = cv2.cvtColor(img,cv2.COLOR_RGBA2RGB)\n", - "\n", - " img, info_img = process.preprocess(img, self.image_size, jitter=0)\n", - " img = np.transpose(img / 255., (2, 0, 1))\n", - " img = np.copy(img)\n", - " img = torch.from_numpy(img).float().unsqueeze(0)\n", - " img = Variable(img.type(self.dtype))\n", - "\n", - " img_raw = Image.open(figure_path).convert(\"RGB\")\n", - " width, height = img_raw.size\n", - "\n", - " ## Run model on figure\n", - " with torch.no_grad():\n", - " outputs = self.object_detection_model(img.to(self.device))\n", - " outputs = process.postprocess(outputs, dtype=self.dtype, \n", - " conf_thre=self.confidence_threshold, nms_thre=self.nms_threshold)\n", - "\n", - " ## Reformat model outputs to display bounding boxes in our desired format\n", - " ## List of lists where each inner list is [x1, y1, x2, y2, confidence]\n", - " subfigure_info = list()\n", - "\n", - " if outputs[0] is None:\n", - " return subfigure_info\n", - "\n", - " for x1, y1, x2, y2, conf, cls_conf, cls_pred in outputs[0]:\n", - " box = process.yolobox2label([y1.data.cpu().numpy(), x1.data.cpu().numpy(), y2.data.cpu().numpy(), x2.data.cpu().numpy()], info_img)\n", - " box[0] = int(min(max(box[0],0),width-1))\n", - " box[1] = int(min(max(box[1],0),height-1))\n", - " box[2] = int(min(max(box[2],0),width))\n", - " box[3] = int(min(max(box[3],0),height))\n", - " # ensures no extremely small (likely incorrect) boxes are counted\n", - " small_box_threshold = 5\n", - " if (box[2]-box[0] > small_box_threshold and \n", - " box[3]-box[1] > small_box_threshold):\n", - " box.append(\"%.3f\"%(cls_conf.item()))\n", - " subfigure_info.append(box)\n", - " return subfigure_info\n", - "\n", - " def detect_subfigure_labels(self, figure_path, subfigure_info):\n", - " \"\"\" Uses text recognition to read subfigure labels from figure_path\n", - " \n", - " Note: \n", - " To get sensible results, should be run only after\n", - " detect_subfigure_boundaries has been run\n", - " Args:\n", - " figure_path (str): A path to the image (.png, .jpg, or .gif)\n", - " file containing the article figure\n", - " subfigure_info (list of lists): Details about bounding boxes\n", - " of each subfigure from detect_subfigure_boundaries(). Each\n", - " inner list has format [x1, y1, x2, y2, confidence] where\n", - " x1, y1 are upper left bounding box coordinates as ints, \n", - " x2, y2, are lower right, and confidence the models confidence\n", - " Returns:\n", - " subfigure_info (list of tuples): Details about bounding boxes and \n", - " labels of each subfigure in figure. Tuples for each subfigure are\n", - " (x1, y1, x2, y2, label) where x1, y1 are upper left x and y coord\n", - " divided by image width/height and label is the an integer n \n", - " meaning the label is the nth letter\n", - " concate_img (np.ndarray): A numpy array representing the figure.\n", - " Used in classify_subfigures. Ideally this will be removed to \n", - " increase modularity. \n", - " \"\"\"\n", - " img_raw = Image.open(figure_path).convert(\"RGB\")\n", - " img_raw = img_raw.copy()\n", - " width, height = img_raw.size\n", - " binary_img = np.zeros((height,width,1))\n", - "\n", - " detected_label_and_bbox = None\n", - " max_confidence = 0.0\n", - " for subfigure in subfigure_info:\n", - " ## Preprocess the image for the model\n", - " bbox = tuple(subfigure[:4])\n", - " img_patch = img_raw.crop(bbox)\n", - " img_patch = np.array(img_patch)[:,:,::-1]\n", - " img_patch, _ = process.preprocess(img_patch, 28, jitter=0)\n", - " img_patch = np.transpose(img_patch / 255., (2, 0, 1))\n", - " img_patch = torch.from_numpy(img_patch).type(self.dtype).unsqueeze(0)\n", - "\n", - " ## Run model on figure\n", - " label_prediction = self.text_recognition_model(img_patch.to(self.device))\n", - " label_confidence = np.amax(F.softmax(label_prediction, dim=1).data.cpu().numpy())\n", - " x1,y1,x2,y2, box_confidence = subfigure\n", - " total_confidence = float(box_confidence)*label_confidence\n", - " if total_confidence < max_confidence:\n", - " continue\n", - " label_value = chr(label_prediction.argmax(dim=1).data.cpu().numpy()[0]+ord(\"a\"))\n", - " if label_value == \"z\":\n", - " continue\n", - " if (x2-x1) < 64 and (y2-y1)< 64:\n", - " detected_label_and_bbox = [label_value, x1,y1,x2,y2]\n", - " \n", - " return detected_label_and_bbox\n", - " \n", - " def run(self, figure_path):\n", - " subfigure_info = self.detect_subfigure_boundaries(figure_path)\n", - " subfigure_info = self.detect_subfigure_labels(figure_path, subfigure_info) \n", - "\n", - " return subfigure_info" - ] - }, - { - "cell_type": "code", - "execution_count": 61, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAEsASwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD31mCqWbgCqsepWksjRpNl1+8Np4qa5/49pP8AdNZQCgZI5poDTe8gRcmTj2BNIt7buARKOfUEVnjDLkcisK+0OaXWI7+O4YKrKzDd0A7CmknuB1sl9bQoXklCqOSSDVW117TL0SG3vEkEbbWwDwa5t9Rkn1D7BJEwDIxBHOfr6VFZwzxT+VEkaQ7zu24weP51ShpqB1N3r2l2PN1eRxf72eakg1nTrqISQXSSIRkMvIrmdY0y01K0RLzcFjO5ZF4xWY0baZEIbaGSa3+7mMDd0zyKahFrzA9CW5hdQyuCp71Gb+2EvlmQ7sZ+6f8ACuYg1FbPToRPmNtgZlB6ZrVhlaVA6sMEdxUONgNJ762jIDS8nsATTW1K1jh815SqepRh/Ss2QNv3HkYxjNIGt54/IkTKeh5osBpQapZXB2w3CsfQA0+e/tbZN0su0dOhNZL2hiiH2BYlPc1meKIn/s+CeSURbM70HOfpTUU2kB0baxYIkbNOAsgyuUb/AAqwby3CoxnQB/u5P3q87trmdLjZJaNd2yFdgYfdPU/zrda102/uhPNdMFUL+5c8KfQU3BIDq/NT1pfMU9xVdNrKChBXtinYxWYE+9fWjcPWqB1G1RHZpANi7iD1xUFvr+nTQLIJsBmK8qadmBr5qG5uobO3aed9kSfebHSnoyugZTlSMgihlV1KsAQexpAQ2uoWt6GNvOsm04OO1WMioILO3tSxghSMucttGM1Pij0AMilzRijFABmjNFFABkUUYrHn1W6i1xLFdPnkhbH78DCrn39u9NJvYDYpMilrG1XS7y8vILi1uxCY1IOc8HsfT9KEr7gX7vUbSx8sXVwkRkOEDH71WVYMoZTkHvVG40uG7nimnLM8a7cZ4q8qhVCjgCjSwC0UUUgDPOM0Ud6KAKuozLb6bcTN0SMk84rlbfXrW+iKqxi5Cljzt+tdFr8Jn0C+iVgpeFlBPbivL7W2bTY2wd5OBwT0PO6tqcFKLY7HpUEZSJVZt2B19aczIqFyRtHU1ya3t3cWdssJaPIKMD1/CtqGNDZLb3kpIdSrMxwTUuNhGZrmv/2f5MlnCk6uPmNLZRw3Gkveo727zR48sdFPtVLWNC/s7bexXf7oEsSedo9hVd/EFnbvFcLcyCJWC+Xs6nFaqKcVyjRu2YtpLeWGa9Uy9XHTaKsR6fb2KzXBd5Gx1J7Vzl0zzSm+tPLUybfmB6r3qSbUJLuBYfOJuM5bAx07UuR3Cw+11FLy+8p33dQfMXn2FbMl41v+7TqVyCK5e0j8xvMbarryXJxit3T1tpYWMM/myIcsT2zTnFIdjSgZpYlZ/vVFe31ppkYe4fk/dA5zWUNSuIrry3B4fDYxjFaV7b219Ev2lN+zkH0qHGz1Cw6wvHm2OrBotud/TJrWKR3sOy4RXHoaxLSSGHEEPyIBwKutcw20StK5VTwBjkmpa10EaOyzsYduUVDz83Nc29nF5k1veXMZ8wh1ZFGQfatwwWmpWQLO6gdyduKp6TpEqag11PPFMirtVVT+Zoi0uojPubvyL77Ha3hUQAD5+7e/rU58TzTyLbQwsQcqZtnQ9vlrW1PS47wb1RQ45JA5NZmmMsKzKlp5GAd07HOD9apOLV2MptaO1/Dc/aVUkYdPM4X2x+VbFvpL3cTG4BgHRUQAYFUrfTh9nnuLq4hePzNwI4+uSK3NPuYZ4SYJVkROODnFKUtBFyCPyYljHReKcJUJwHXP1rC12/1SK3UabAHdmAYt2GasW7SNaxF1QPt+cL61HLpcDZzSMwVS3YVnpMy52nHtVqKUS5XuOtKwFW21m0upmhRysgJAVxgt7itGqCaTaR3puxGfNPqxwPwq/Q7dACiijIpAFGKqT3QDCOEqZS2MGrQzgZ60AZWr61/ZJjzazTBwTuRcgY7fWrthdx31lFdRBgsihtrDBHsanZFcYZQR6GlACjgY+lPSwC1XuLtLdgGHWrFRTQJOuHGaSAI545I94YYHU06ORJUDxuHU9CpyDWFrVrNLa/YIpFSKYbWZuM+1QadHc6SkGnhQyZ2khdqke1Xy3VwOnzmiqFnZy287NvOw9ic1fqAILxQ9nMp6FDXLJpVukgdFI9jyK6m8/wCPOb/cNc/JcLBDvfp6VUW9gBbVN6NyMdhUWraV/alsiC5aMRtuIA+9U1pdrcrwNpB6VbHzbgwwPequ0wMdo2S5jsJhut+mH+YSLjnNTP4Y0TUbcpGWMZPIjYcVuNCk1vtbjcmN3pxWBJBPpsIuNN8ucNgSvkAsB0A7DvQpN7MCOXw2Im8u0TywrKOed6getaE3hu3CvJbARTN1I6e9TXkssmnL+88uZ06B9pz7NS2WpGJUtbsk3CrksOQR9e5o5pNbgUINDjSKVZiZDgYzzgelSwafbW9u8dtEIi33j3q5BeJfl3gP3WwysMGo5cxybRgn0B5NF2MxIdK2zZd2Kg9PU+taM8aeRtwc5pLAy3M0qyRMCnSr5s3YfMpx6d6bk76hcxLW0lhnR87lU81duNMk1WVJN4SND9zv9akeaCHduRiRn7wxjFZen6in2phZyMz5zsYZ69+KLt6oYmoG3u7j7Mtx5MONrM/HP1rVtVj8P6aIFnFxM4L5LcY9R7Vzur2/2+/eGGRIdu3iNevftWtdWUV1YxJFMXkijCSKevHSm9kmAv26O42yTXe7eM4VzgVZDo8P2aeXdby8ZzyPoayobMJBtjR4ZyfmZlLKfxq7bxoUjQ+YwUgMcEFvXik7LYTRtQaTbxWkls+6VJPv7z96q0mnPp9rHDpreUgbLA/Nmnaijm6S4V2VI037QeuO2Kw59RkuWh1GZpIkifCAkrn/AB/Gkk2I6q3R3tV+0Y8zvjpWDbyNFesX3yl2O1QfujNa8WrW9xbRTowHmj5Ae5qza2vkx4f5nPLE1OwHOumqfbkHnbE38Mr5G0dttbto4+1vnjKjaCefyq0scSE4UZ61ky6VbXWupd+axZP4cdx70+a+4G6ORRSDgVE1zCiyMZFxH9/BztqAJA6MxAYEjqAelY11oT3erG8e9mCAqURTjZjrg+9VNLWNvEU9xBeyPHKCxi8ogZ/3v6V01U7x2AaqKoGBTqKKkAopksixRNI3ReabBcR3CkxknHXIoAlpjyxxgF3VQeBk0+qV9ZG8KKXAiH3hjk0AV9YntIxCtxMsbM3yfLuP4VoQpGsMezlccGoriwtbtEW4hSRU+6GHSs+GS5TVv9KdYbfBSGLd973xVbrQDaoqMzxiQR7xvPapKkCG7/49Jf8AdNc5PbJcwBGOO4re1N2j024dBlhGSAa5kT3DWO8JsmK/dYZwaqN+gDgBp1pLIil2Vc8d8VlXV1rFw9pLZLEEZgZcnIC/X6VrWMtzcWbidBGw4HHX3xVG0tptXiuIHnSNeNpTPHNap21YHQ2WoW19Dsjnjc7f4Tmqk+kzwafiGXfLGp2AKAOvpWToFhFot2YBbMAobMrsQcewPvXRnVrZYmcNv2nbheaiScX7oGLJ5Rs7dNVaXz0f5SnG4deRQtxBe3guMhUKNwGJ+Ud6gvbyS61Jo5IQIQWGcfdFT2lusN2YygO5M5z90fSqatqxlm1MCxkwbwrd2JzUdzCqzJK0z5YjCAc5qCeOaybdGGkQnPTOKllklkijKRthvlxj/OKVih0X2n7Qk0dziLOPm6nHatS71ALEUW5VHbhWK8ZrnWuWcIhjCrk7F6Y/H3rSnkh2Rl4HO0Ybb2OKTj3FYtWcjwrJFfSxy7+3fB7VDaaZo1pfm8gJ81RgLuyFH0qmmy7vg8qlZMde/tkVVuLKZZpmhIYEgYOc07a7gatvouny6hJcqWErcgGqWoyppNxOI5WL43MxHK+wqTToHgI3u27PHtVrXrB323kO3zcAMGOBSv71mBy6avcfbWaWVyrnaitht3+cV3Wmr5tlE5jRAVzhBisTR9F+0wiW5SOLDdEzk/nXUqqRRgDCoox7AUVGnsFzmdS32epfaLm4QIxwgA5xULp5EyyXeye2nG5EJ4BpPEekrqV7Dcxh5omGdyfMPoKmu7F4bOBPNWKBFG0SYPNUrJIRDcx6bqF/bt5kkTWx3JGqctjng1pf8JF5thO9pbSNcRdIpOCRnGfpVu0g02KL7YgiL7PmcHmrNlJaXEX2i2RQG4J24NS2hGdFqV1c2jPLClvLnAy2QRUOgPffb7pLoHaGIT5Co29jnvUOpW1jrN+Uhu3Wa3G+SNF+8B/dp1vc6lf6dJbWy/Z2jYIJOdwX8epotoBb1bUL201K1iij/wBHfO99ufoM9qfY6LBbXkl3bTMfNJZ04KsTUd3oUup6ZFb3l25dX3Zx19jSSbNE037OZW3NwhQYxQtrIDWt7K2tWdoYgjMcsRVknFULAhbZPnVmcZ4NZ9vHqL6vIZb6ExZ/1QbPy/TsamwGtPfQW+3zGI3HA4qyDkVTlsI5mBd3xt2lc8GrJ4AUdqnQBzKGUqwBB7GsyfWrK1vDYKw+1bCyxgY3Y7ZrRZ0jHzuB9TWdcjTJbmO6kSN5YuVemrdQJdKvpb+2LzQGF1OCp7VfrKn1u2gjd2wqqMkmsuz8SSXuom3jeMcnC7D+HNPlb1sB1Nc14mkn2BbJmivFICOADuB6gVrx34aTyZBtfbknHFZw0+bT4pLiOU3Dsew9+tOOjuBHo/nia3W+XfdqCpfPt6V0fase0kuLq8guEkQwgFZEDcqcVsUpbgV75PMsZ03bdyEZ9K5Cw1OCO+msmaVljJXc44GBk11OsRJNo93HI/lo0TBnzjArkZL5WuVtnWMwOgVZR97J71UFdDSGS+KklUjT4ehO52OSo9cVmwzXmkXcN/BHJdm6kCmOLjjPJP05otdNs9GvHVFknEhJZgcDJ7CprW5SK5muEuXlWIMRGvAPbitWlb3UOxo6r4Xi1jUlvluZYJ/l5DEgL6AZrft7C3t4lSPhRjqc1j6bcPqsLvl4lzgZ7j2rXhXyVVWfd2zWTctrkkT6hYJNJDvUy43FMferOsNYF15uIiWOSuExjnGKuXVjaQtJqCW0f2jb1PTpVGGyluUWS2RIDzkofve9NWsNWEsr7z7t/McL1I3grx+NWHneOZjvAj2fLtbj64FOfw9JcLGZZ1MoXa529ay9Xs5bGcKjZjIxw4H401ZsdxumW9xLqUl1PL+7U52KcCr91cvKHNunlHductwCKpQW08jqm8c/O5DY4rRtxZyrLaM/ly8nefSnLcZXtkSeZPIk3uAc4PLH0Na0OlSOoeT92+OmataXYW1pEDCyuf7471Et1qR1ZoHtU+y9nHUe9Q3d6Etlm209Im3E7jVZ7C//ALVEv2oNaFtxjbsP7oGKjs7bVYtamkklVrNuVGeQPSpteGqtYn+ysef/ALwH86m+thEWmT6gNVure7I8sfNHhMDHpn6UusahbGZNNZ3Dynkp0GOx+tatqkgt4/P2mbYN5HrTTp9q1wJ2hRpF+6xHSi6uBRC2elWqWzSeXliwAyazdZtPtYjsngaaJvmMqn7prS1iXT7UxSXh27jgHOPzpn9iq8zypM3ly/Njce4pxlbUCppWj6WF+SYTDGHRWyMn1qxe22oWkltBo8UcdqCTJ065961LXT7azDeTEFZ+WPqatUnLUDnVhuY9WmENl5aOu1pO7fQ54qpYLJaa0YRFezxhyvmyv90/T0rQkn1tNaKpDFLZM4AA+UquOWz3+lbgHfvTcnawAOlZ0tzZXt39kLxtIhPBGfrWlWcmiWEd/wDbkgAnyWzk9T1OKlWAz7uw+y6kt6sypAqgGMA5z2AHpVDTpbBb+91Xyp4BF8xyPlbPcVoahpl09958M/BIOw9vXFRNo18+sbzMv2F1xJF2PHpWl1bVgN1PxrpthZw3ALSLKcAgZC+5rRh1P7Rp32lF2hiFU4657isK10e7XUHsprCL+zkOUaut8mNovKKjZjG0elKSitgOXudQuRKyokYbON8vX2NV7BLu7k847Quduz0PrW1qlnFbWTShN2P7w+77k0+ziF7of7lRE0inDAEfjT5lYDHbUXhkuEvrBfs8XG4rkZq3p9pYPb/arZUhEnPEXWtLT7F7XThBeus77iSW5H60y7gzs8kqAvRAMD8KHJbIB0aLGOZvMVu7LUlzN5WkzvFC0xCnEa9W/KqlpFIcpIhQM2dtT6bq9reXU9pbqwa3O1uMDNS/ICHw3bxQ2TGK2eHLdXOS3v8AzrbooqW7u4GfrYU6Jeh2Cr5TZJ7DFec21hBd3qRW1xIcN+8Jbk8fyr0fW0eTRL1YxmQwttGM84rzLRJLyxYu1nISv+tQNk/XitqXwtofQ6aOK4s50jEQaNTguy5LDvz2xVq2tbWJmeG3RHYckVbKtMiEKRuAPNZ4hvk1I55ty3BXAAXHp1zUbhciu7sJciAnB9F4q/ZxPtyxbGP4qyZYJLrXlhaJwic7w3X3rbnWa2tf9GUSyAcbjRJWtYRZhysXzAjuRUEryW5aaODcOnWqWl6p9pu5raa5iZwflUdcVZutTSyuQrRyMhGcpSad7AM0jXRqV7LbfZpI2Rchz0q/fWsr24McccswPU9hVxAMAgDB56VVvNQhg3QrLGLkjKRsetK93oBjW5tkuGdBI8sSncApCk1RfWLZNQS2bTGM8hPOSpYVqi1vZLWVlQQytKNzYCbl78iq887Q6jDCLWGR1xiUqST+NaKw7mnDfWNysun2hVLpFDvB90rn1qzdtc2+mzOki7wvBbjb+NYX9sWi3d69np5W7A/1hXDNitPRr651XTTJeWuxWJUo/cetS421EN0nWBLbujP5pjC7XyMyepxW7GwkQMB17GsyDSrW3uVmiUhs960ldF+XIB9DUu19AJKKRWzS1IFS90601DyvtUKy+U+9N3Y1bAwMCiigCtf3YsbGa6ZWYRKWKqOTVDw/rTa1YfaZLdrf5yqh+N1O1zUpNOt4zHGrtI+zDAkfpVe70SW8v4phII4V2thGIZWH93tVpK2oG7xjNULLWLTULqa2gZvMhGWDLjI9RV/Hy4PpVGztNP08stsscbOST82T+tSrWAu+YgcJuG484zzTqpiz/wCJj9q8zPy424q5SAYRkmmDPSpSKqahcx2NjLdTK7RxjcQgyaAMtpdU/tdFE0a2+8/Lx8y1vqoHSuatLt9U33UUEhi6BX4INdJGS0all2kjkelVIB1GKKKkAxmq8lqr5K/KT1qxRQAxIlQep9TUFvp9paTSzQQJHJMd0jL1Y1aooAKKgkkdbmKMRsVbOX7Dip6AKeqNKml3LQAGURttHvXPafe2zBIzLGbqQbmVTnPrXQau7xaPdyRpvdYmIUdzivLrLTLvWJBcLD9laM4GCcda1pxTTuB2dyl419GYZdiLzyevsRS6xa3VxCklpciAx5Zt3RhWZp+n6qmq/wClOrQRtuSQNn8Mda355Nu1ACM96T0aAwZ5/wC0bCMrcyxJC371/uM3HBB9K37G4gvLUPbzJNtO1iPUdarJYWrI8Xkqiyff28ZpLSBtKZreGFmixuDb8k/WhtWsgK58M28MklxYqIbuRsl2+Ye4qaLSZ4LBYSTPcZLCZgCUJ/u1sxuWjVyu3I6HtUaXsTzmH5g46ZHWlzy2Aj0u3msbMQXV158mSQzdcelc9qWsWFtrDSXkOycLtjIkzkZ43Cr19YyR3321nzJn92SeM44HtTHFnfWqvqVoolPQgAGnG27AclxL4gswFlMDod2QDtYVLaO2mMtvLIZ3Y9f7v0pL1FQRXMBKwkBDjqo7VUiv5becC9i82Hqs2Mn8ae60HY3nls4roFvKExH3sc1bXpgVkm1tryZZ0lB3c4BrTVSFC56VmxEGoX/2CKNhGZHkfaoHrisO+me5ktrx72Sxdvl8lkyThuo+tdQQpQ7sBR1zWDDDJql8stzDDJbxkkcAgDttI61UQNW01FbmYJsKhl3Kx7/4VEdeso9UFjLcIJG4QAE5P16VFe21+98ptGiSEptJKjj696mXRLSURtcxLK6MHB6DcKWnUDUJwM0A7lz0+tApc1IHN3U99bamn2u+tYrZpMgS4y3stXbHXrW9uxbIHywJRuzY9KlutFsr2486eMux6jccGp/ItbNGlSCNNi9UQZx6VTasBT1q8eFPKQkZXcSOtc3Zaos91JCIJRtAYORlW9wfxroTNbawN0DAyKvzRvwcHpkVTj0No5S0UQDdNxPQfnVRslqBoaTcOzGFum3d9K1qwmuI9E2K8byyygkBOwFa9vN9ogjl2Mm9d21hyKh9wJqRsd6WggGkAgUKMAY+lLRRQBBcSzRtEIoDKGbDkMBsHr71PSMSFJAyewrD0fUdXur6aK/sEgjAypVvu+x9aaWlwN2iq97NLBavJDCZpB0Qd6o2M99fCVpYzAiyYTKlSy456+9FuoGtRUFxcw2Vq09xIEiT7zntUqOsiB0YMp5BFIB1FFFAFe9QPYzJkjchHFcvpmkf2c8m24Z42UBYyPu+9dXc/wDHtL/umuelu0hlEao8kpGdoqot7AWk61El7az3MtqJAZYcbx/d/wA5qFpNQS4GxEaJyABjlR3zUclhYWuozX7lxPKu04PAHQ8f40W7gRXlteXd5DJY3nlwxsC6hsDj+ea3YnV0BVww9RWDoNrb2PnBLuecTNuBlIOPbiteP7PANiMqj0zTn2Au4yMVHFbQwtuRBn+8etKjcZyMetNiuYZTiOVWPoDWdmBMyKwwyg/WmvDGVUFFIHbFPFLQnYCrPapNbvCBtDDGBXK3F3NYO1tNFnBPXpXW3DtbwvMVLBRnArGgeHxNHJvtniRPlWYjkmtYO2r2Aqafejd5sQMZBy6Y4atpdatYwpunFuHbanmH7x74qO10KOBlBl3Ivbb96rd/pdpqNqLeeP8AdjoFOKUpRuBDNqFpdXT6YGlDyL99Rx09agk8PoujNY207JJvD+Y3c571oJZRRH91Gitt278cjjAqhpejzWN208tw0jMpViWJ388E0rpbAU5NYPh97TT7oieRxlmHBOTgYFdOCPes3UtV03TZYBfzJG8hxGWXP/6q0VYMoIOQeRSlsnYB4YGjNNJ9KaFCk8n15qbgPzwfWsiWbUSrs0G91Q4jUgI3Pqfatb3qpqdj/aNk1v5rRbsHcv8AWnF66gZ+jxXa2lzKbCO2mb/VDufTdVzRlvRaf6cWMpJPzY4/+tUmmWH9nWS2wmklCkndIcmrvSm5XuAySGKUqZI0cqcqWGcVIoxSClqAHUUUU0AUUUUwCjFFFABRRWDrljrFzfWMunXphgjY+fGON/pTSuwNa8tIr62e3nXdG2Mim2NlHY24hiLlc5y7ZNWI9wRd33sc06ld2sAUUUUARXP/AB7S/wC6axEhiEnm7BvxjNbV1/x6y/7prHTpTQEoHSuU1lJpfm27ij7mU87q6dmIHy9a57W7eTzlnkmEcY6kttFXDR6gS6VB9nhUtkFm3bf7tLe3nkIH2BuecnoPWrtrAXjUxnKEZDdj6VXubNGGxx+fFO6vqAtjeme3PXy5Bj5TwR/k1P8AbvLdDHAoKjarkdRUVnAkUDJCM7RjrzWfqGiyXesW1/FMqpBF5XlhivHfp9BQkmwN2HXEMwhkTL5wSvrWurhk3KcgjIrm4rHzLlHjTMg+/IO/+c/pVq61qDSZUtJI5ZXChiUXPU9aiUewDtLk1p9QnF/GI7cFtg4/DBFac93BaxyPI4AjQuwHJwPapQQygjvWUvh60S8NyjOrM+9xuzuP+FK6b1Am0jW7XWYS9uJEZRkxyDDAfStLcByagt7O3tmkeGFEaQ5cqOWqYjK7TyKl2voA1LiKVmWORWZfvAHkVLVC00u2s5mliBDsMMfWruaHboBS1PSrbVY1S5TcFPT/AD9KuRosUaovRRgUu7nFVr27is7dpZm2J0zinq9ALJkUc5qCa/toZUikmVZH5VT1NZCzS3kUs1k3nRbG2leQWA6D3zVQ2d3eWpmu7eQtDCzDDbWkP90iqUV1A6zdkcUiOG5BrH0S9nuLUiaBYUVQIhzu247g1attTglkWEttlbkI3BpOLQGjSk03PTFKelQA4UUmQKdQAtFFFABRRRVAFFMVmLMChAB4PrT6ACiiigAozTWYKpb0qnZalFfO6IjqydmFAF6iiigCC9YLZTMxwAh5rFikVlypyPatPWIPtWjXkGSPMiZcg4PSua0uK6twI5FQQqgC85OapLQCxqiX8lkV06SNZ9w5kyAV7gHsaqJpbrpaHUpZLyaHc24Dls9sVqTXcFpbtNcSrHEvVm6CpLe4huYhJDIHRhkMtPmaQGFo+prZWRhe1lgtI2CQGQNlick53Ut7deen2xEkw68IOSe1W9alvk8hbOzW4idj5pIzt44GKtTiGHTlkuk8kRp/BwVPoKptaO24HPaZcTyuru6hfbqP8a37MtJ9+DzF7t3qlYC1u5uEuCOoLrwfxqe61v7DqENlDbFyzAEKDwCcZ6USu3ZAbyqAMAYFJJBFKwZ4wSO+OainmdIyUTc2OBXOPrF7ba5tubqLyun2ZcZ5+77/AJ1EYt7AdWOBgcViXGpatBq4gXThPas6qJUb7qn7zN9KuWV4NUslmRXhOSNrdRisTxDLqGjRC706N5i5+fPIX3OO1OKu7AdYrZ5HSlzXNw+JfK0y0ubuFxNdHakKL3Ayevat6GdZ4ElAIDDOD1FQ4tbgS5ozWbqWtWelLm4fn0qpa+KtPupRGpYMRkfSjkk1dAGveITpF1bWy27SNOC27nt1xx1qQWhuone+3PHJHkpnHv0qG4jnGrQ3c00a2+7amZDjBHGB61tcPx1B9KptJKwFDSLuzlWSK0yuw/MCKr3uvPZ69HpxtXKOilZdpIZiegrSt7CC1kZ4YkQt1IHWpZFcq23rtOD70k1cClJpKNqH2wSyI7HLfN1HpUGpWxiWaWxCtfBQFBPPXn8cVZ06K8jkk+1HKYG3nv7VNdWn2ghkIR8/MfWncCLRri7ns915FJG4OB5gAJ9+K1A1RgYFKDUN3AkBzT81GDxSg80gJM0mfemFuopVYEUASZopuaXJoAWikzS5FAGGbzWB4jW3+zI2nleXwcg/WtwdKO9FU5XAKaFUHhQKdSEgdaVwFpKAQelLTAgvMfY5v901x+qeINM0OONtRuUg8xtseQSWP0Fdfff8eM3+4a8Q8baRp0Pi2z1y+8QSQuNipZRRb5XxxtTB43ZxyO9UgOv/AOEi8LeJJP7J/tKJ5ZMbYm3Rsx7Y3AV0ljZW9jbrBbR7EUYAFfOnxIaaHxJZSfY5LErZxtFHJLvkA3vgsR0b2ya+kIWzEh9VFHN06ATrwvSh40lQo6BkPUHvQpGKUmpAzdVvW0zT3ezt45plHywbtuadomptqunpcvavbO3/ACzfqKrN4fgk1R755WJYglPfNS61Hq8tqqaPPDDPvG55FyNtae61ZAbGcrz+NYl34c03UNYTUt8omjG1ljk+VseoqrqVxd3l2miS25e2uE2XEsZKlff6VHYzWug3v2CPz5meQK7v/CT0wKai0rp6gXY9Ju4vEwvYrhlstnzReYcFun3ce3rW+yh1wTx6Uxc1JnArNyuBmazayS20f2eKNnjfcCybiv0rkXg1/T7v+0ry6SKJvl279p6+nb6V6DkNUN5Zw3tq8E65Rhjg4I/GqhO2jA47Wwt5KswfzI5QrpKhyPTiqllYTNeDyQWONoOOc12lpo9naWMVmkIaGPO0Pyfzp0kElv5Ys4o1QffVRiqVWy5UAwaVHKtv9p+doR8uD3q+qqpOBio7WVpYsum1vSpgOprJt9QF/GlP5Vj67qVzpkMc8EIli+bzc5yPQCtC1uGubWKZ42jZ0DFG6r7UcrtcCfOTR36mkzRk1IC59TSg1geJJrmC1aVPN8hQN3kj5s5qn4d8TNqQmtvsciPbFV+Z8lh61fJePMgOtzilzXOeJI9Yljh/sq7FsFO6Q7NzVqaS922l2/29la6C4kKDAJocbRvcDRzSg1GGz0pc1AEitkdMfWlzUYajPNACyFhG20fN2rG8PzapLLefb23RrJiItHsP0+nvW1kHilAApp2TQD6XNMzS/jSAN43be9Zeu6fPqen+RBMI23hjnow9DWlxnNG7Jpp2dwKml289raJFPJ5kijk9qv0xfvU+ne4FbUDjT7j/AHDXz94z8MalL46h1awvohJIY5I/N/5ZFMc+hHGa+hLm3ju7WW3lyY5FKsAccGs+Pw7p0cAh8pmQDbhmJ4qly9RHheufDrxN4nvRf3Gp2c0gAjDv8oKZJG0KpwOelejzXWvabYw7o4ryRY/3rwKRg9gq8k12qaTaRoESPaqjAAPSnf2bb/3T+dF1e9h7mNps001jDLcRGOZ0BZD1U+lWJZUhjaWV1RFGWZjgCtIafAP4T+dQX2iWOoW32e5jLxbg2Ce4ORSurisY63clzKHhYeTjjHerNlcCVHxu+XuwxV200GwsbdILeIxxKSQoY4561ZXToE6Bv++qbaCxSaSNT8xAJ9aPIhaVZSilx0NPvPD9lfPumEhPbbIVq59ii2hQWAH+1SGVh7UkmWjYKcEg4NXBaRj1/Ol+zR+h/OkBzOl2WpWuqTGW4Z7NhnbI247vb0FboPHrVn7NGOx/OgW6DsfzpydwK2aaGHmbd3PpVz7OnofzrNj8PWUeptqC+d9oZtxPmnH0x6e1JJAWRg9KgvbpbGymuWR3WNd21OprQFug7H86a9rHIpVgSD70AcVPruranp0U+lWTwbZCsyz43dtuOowc1auPEzWElotzFEyyAI7Ryc+Z0wq966h7CFrdoMMEZdp2nBqpZaBp9iJPJhP7x97bzu+b1q7w7ATI25QSME9qdVjyE9P1pfIT0/Ws7AVHUMpUjKt1FQxWkMDsYo1Qt1IHWtHyE9D+dJ5Ceh/OmBVAywbvTs44wKseQmeh/Ol8lPSgDm9O8Pmw8QXuqm7eR7nPyYwAPQ/SpLvVLmPUxaoqxkMCMoW8xf6V0Hkp6UGBD1Garmu7sCCOTcilhhj2p2eaX7JGGLbn57bqk8lSO9RYBgbBpd1Rw2SRZy8j5OfnbOKnWJFHFFgGZz7UyWQxx7hzipvLX0pHhR0KMDtIweaLAUra/W5YoAQR61apsNjbwHKJhumc1N5a+9NpdAGocsKlpoQA5p1IBGO1SfSmCUn+H9adJ/q2+lQIQRxzjimBNv8Ab9aN/tTB6U8DigBd3tS7vajFAFABk0UtNYOfu0AKDz0par263Cs/nurDPykVYoATPOKWmbj6cd81mXuspCu2DDHONx+7+GOtAGnJIkaF3cKo6knArIl14iXbBaPKmcBi23Pv9KzZDNd3SNKDJjnezcL9B61P5TRgs3zjPQrVWHYvprLMcm2wPXfTjrKCTZ5RzjPXissWuyFkTKHsG5I96ifY21C78YyRxmiyHY121tFYKYW596Y2vKFOINxHbfWQT5rb41TaeN/ofxqGREVFSbaXYNuYnGVHoKaSCxuvr0cYy0OABk/N0po1/IGbbHPUvxj16ViRqz7MlR8pVto7np/MfrV63iSSAPKASqgM2OGIORj1oshNGimtO8m02jYxkMGyDVs3uyIu6Bcdt1Z9jE3ljcTK7d8YC+lP8zyUKoHlxuyxHyk+makRYOpfuBKsDMCOgPNPtr97iMObWSIHs5GR+Waq2bFY8uPlb5gPSn+a0cj+YV2k7lx2H+fShoC81xtTdsz7ZqqdVjCudhGz72TwPxqQSIT0IyN2SMY/wrMubYztFGgURq3PJyc5/pQgLS62pUnycdwN/UVL/ajmYR/ZmHPUtjviqiWsVuGd1AP16D+lFyfLjjVFI9h+fP5UaAW21TYcNAeuPvVCdcTO0QMW7DP/ANb3rIZ5XjcsGUbsj5jz3qRWR5PkPBxwO3rVWQ7Gw+q7VBEIYk4I34xR/apDcwfJxghsn8qxY1YwxpCdqsR8y/Xn+tStNDtPmndtA4xyfrSsFjXbUwrBTFjPTLUxdYjYAmJlB7mszyRJGw3/AChs8H9KbAd0ciKxCj+L+VFkFjUbV8EkQFl4wQev6U6PVS7bWhCnp9//AOtWHuElyFjXZhyvPG7/ABrSjt/JjdyfmUbSQc7R6UNWBIvJqKm8jtyhDSAlTyRj8qvVj28ol1T91IXRV2cfdHHb9K2B0qRDX+4fpVeNACSFA3cnHerD/cP0qFenXFAEg6U9elRqakUe9AC0U1nVPvMB25NUb3WLSyOx3aSXH+rjG5v/AK340AaFFYsWp3d9KiwwCNN/zMG3HA/CtWaZIImkkYKiDLE0AOJ+bBaqj6lCkjIHV9uQQhyQR2NUrjU/OJW1Y8jmQjp9BWXDZw2ySuqqplctIYwFLE9SfU+9NIaRdu72a4k+b5YscRK3LH3NNhhjRlZ8EnoO1NZkSM+X8h4/hzThMgX5WVscZz1NMYSBQ6K2VGcgdOadmTzGJ27AOME5zULSM0W1XUSNnG4Yz+FN5U8Z55ZgvFMYxp2eMMF3sSfuc4pLh1QxqwPmOcDAztqLz1ikTHmr5rbVQIcDp6Dj605YXcKoIRhkjLZyPX9aLILjAhf5Wg5Y+WQrdu5q3FZ7JYkkfLIrcbMnFOsUby5JEVBJk8H1q+EKszhFeTHUcdvWi4rkKW8XnFQCp+8SvUHnHt0qaG3EaOzZIUnkY5Peqdqd99LJ5jeYoBdONue3HX/Jq95KSMHdCrfwpnAP/wBepbEVpoZ58cBYRl2cDJb0UelWt2IV6xxNjgnHbp7fhUc+23Uq5chhjCnkY79abZSPc2du0Yj+bG/LbwPUfXOaAuTPGgGQZH24GB6/SoIoYfkDhklOWCvjcPf0FWioiVQRtb69Kjhbyld3yxdiw3rjb7UBccqicODwjD5lZeT9T/ntUX2ndJ5KASH5sOBgDjgfWmxxXkvHnCOMltwKHP55p1qsUGAd8jAbi7980tBE7w7xD5wQOPmbuPpWdc3JkuAo4TaNpY8mrt5K/wBikeIgHZnI6isjyEnlWTBZwNpJJ46VSKRHIWjbfJgtn5Pmxz/n+VTWEgnbzlQR5ONp6N9PyqN7fzI9hQNtPAQY464/nS2o8q8hUREIEy2R0ApjHyxQxTSKsSxzSY8xlHJ7Z/CnRxkiPc+w7h909f8APNaNzHbXsvlzIpdTg4zxUqWCJgQ7UK9zycf5zSuIggj+z5D581zu4pot7d0jYllY9MP+fSpZliiC+ZJwWxknn6VVbUI0UbfMOOrBT/X+lLqMsRWdrCoIjO7n5idx/WoproM72lvHkbd24N3NOiu1ukKmPB+n+NSwWgttzIoVm5J2j/CjbcRHZmNLyBIzjAO4JjAGD1xW2OlZtowadVGMrw3y47VpCkSNf7h+lQryKmk/1bfSolIAoAeOtMnuIraIySyBEHc0PIsULSSMFRRliewrkb7UZb6435VYYz8qnj8T7kU0gLGp6wmqwtapC6wseWfgsPp71oadoNukYmljAkf5iBx9Kj0i2tZVNwtuPOU7euR61oXOoG3UqQGlI+VB/M+gp+SAsM1vYQcAKOwHU1gXd1JfXBjfG1SCIt2cHsW/wqJ55pSzXHzA8ZI7fSn21nBbbXgUIvJ2IuASe+KLDSHRrDEoJd2w3A/H8zT3mVWXMbNzj5RmoFVmmZ8v8rcqRRLcB7cuPMQA4yBj8eaZQ9WILsGyo6IBz7/rUDvtjYPGQG6YHKn/ACajkmjXzGRHU4Hz4poEs06os7ELnevU/SnYBzzLGwJffgZUdG/E00hCy7S6qSHyCal+ytlXXLpnhEOMn3wasww+YrIU8uPAZyPXnii5LKsVoqY3giNjyN3H1q5sOWjlT5Gxko3Kj0qeJERwIcHuD13e/WkneVbmEJ5bDJEnOdo/QdfWpvcew6A7Efyozs6KDwPrnvUkys6/vH8ofeYjqcds1BHPL8wCbJeWVM5olyIo5iN7Bt27djb6rznHpQA8TCWVPKR0O4qOgVvc+1TSrNI6kyqY8ZwoIwR754FVy9skSSLeSRtGf9X5gznptO7rz+NPSYy2p8x4objZ8+xt+xu/1pMBk6Ilv594dzhCS8JwGXGe556Co7a8t3hSTTyJGl+YxxNnG45PQcHr1q0scZ8tkVpHXhXZu3+TRbRCK3n3xrE0zEtsc5OR79PwoFYgvb1Y4RDGcXD4VUXl+eM+v41JFLNDt/0qM26rtJkVt+4H5juLc/l+NLKm5vKjmQOOm4ZP0FAffcmOWLCL83UYB9P50DsT3E8ewSvcJHAOQSRhj/nFVy0hmVQW2SBkVVX7pxncT26frUuZIUVIVZ97k5k52+mPaopJ3WVQZG3c7sL94+n0FAhrxy/YTDtPmn5NjHd75z3qlE+xxGmUk534PHsTWmk0jKpjUOT97np71G/zrvmgUg/cIbI+vBpodyj9nkuBHH5sj+u3ufrWjDbGFdnOzI+Y+3/6qjgDo+IyrEnLIQFAqaf93IWUg7c5DHjp2ob6Awilhj2qY2U9Pdqll+Rwqszbs/ePH/1qp3AUkb5ioYZwmFJ4/WpYYX2qx+aPG3kc7aVhGdNP5tzEpwF+70xj6UeW8SsU8xlc42kY9KZDYym6kQxMVG3DDAB9SBRcWt4s3mHKx9wx/wAKoofBAjz4KOTnuScce/ateQvFafO5LlQBntWdaxLNcqQ78nO7kE/jVmbd9vjCISF3dfzqZbgT2aRXE0dxHHLGy5BDk1q1k2omivl3SlkfICgcCtYdKRLGv9w/SoB2qeT/AFbVm3eoRWUfzHfKR8sYPJ/+tQKw7Uri0itWiunwHH3Byx+grk/KeebdApSFOnmP1PqfT6VLtlup3uJT5jyHBOeF9gPSrCKVJVc4XuP5D0qkrDRdF49vai2tF28fNJjkn2H+NVI98ce6dfmLcgHr9TUUcLrI7CSQyOfwUVMJJodyyAOCflx1A9aY7FjIVgxbavTbimPI4kRQnyk5Zs9Pao1LKdxUFBzy2Tmhirop3NHKw4GOaBiSPubYkg3AjcB6VCq/L5kybcY3qOcjPehiLhgEyozghvlz/jVmK3ZoyQNjt1P8Ofp+VPYTK6L58DsUzGMYVOKsxwOLhX8wMG+4ETI/4Ec/4UR2CmLE0hIwN3z8D+tWoY1jk8tVfOzdvHT6ClcVgEMwjdFkULkHcByBTreLyJpne5kkDHJ3jhT/ALP4VHJOttb8MZSM4Rm3En+7mop2eewaOJ1WQ90cfJ687cHFLUCVZpNzL/rER9qOFK8f1qLzC+d77Qn3ljP8/wD61V5olaeREDxy4B85iSPoM8D8P0qq7rDM6QCVl28sxwB7896GUkXw+BGrKrk9WjCg/wDjx6Vc+SMARr5eTyNhYGq8ELLGzbgUxu3AnH5nmqMl/LJP5auVVTgsvTPcMe36UtwNKaMbOYfOH8O1ABuqlFDJ5kMM7rBE28OqkH6VQ1ETNKjDgFtvzNz+BqxHMkalI4vvFuCuVLd88e9CQ7WRtfZYXXMLypNyBIqdPrSafBcxxCFto8viRQe/qPrVe1nEa4VgEUbGTcf0p8qxBWuFuDblBk7OQVHrn/8AXTdySW6dlVspKq5DbwQoHPqDmqcUl3JcCGW2jijckzZRWMjdM+mKH8q7sPLuLjzHmGNsa5OD02juPersjQxxjMgZQTHx1Vv4c0lsDHWCeWJFfjYcoAxY7e2azZZ3ijk/eq7LjzZSuOp5/n0FS3F0PtYB4ydgIHX16e9MaKZIxliV9FTn2+nSmvMBsBTeIWdZJWUHLnkr/T0xTRBL9oGGULt3fePB7D/PrSyzeVIIvMVti5kMnXFN+0Bwu1gwboV5B9B/KqGaVvEszxzbiSSdwHAJGeuKfKYk3M6kRKc8jPPWm26m3hjTbliMlQO/eoL5980aPIQoBcoFzjPTtUdQGQSSyrIbVhCsnJb7xJ9+3p0pLOeWCSQzMZFXaih/vA9z+PFLE2GCod5+7uJB49vzqGV8zYabIHJwpzz05qhWNW3kJLP5vmQDJO4crUsd9DcgbXBQ8EMvI9qrRbHs8RP/AA8YPOf8ipLmK0j8sGIlic4jGCPUkipFYsPFmPdkx/3Ru4H4VXjEMa73lJLfdIHc8VYMQYKHYYUY5GSPxqB4QsmfL5UcFdzN+WKQ0TWgCFEO53XPzuMGtCqULb7gFR8nI/GrtBJV1HJ0642u6HyzhkOCPoa5QRKA+f3rY5BOSfcmusv/APjwn4z8hrjUmSCFvOkjjdufkHH/ANeqRSJFiTIlZAGGBtGcD2FJLvwmyWRWZupziiK9ikjV0mDL05XBz9O1TCJi28uQmPudqY7D4srnhsjrxx+FPMjxxt8pY+hPWoF/dyMiMxOcsP602aUswUrsB9OoagBTKqp5iu4QZzhTz/njmo2lYOoWUbeAuGG8n0P6VMjI02xNvm7cdOg/KlyIJFiGXeTlSVxgd+ef0piHwxXBZnlRBxhQvc/lVpGSJiss2XztxjvjtUsMZSMMYwCQBwuPrTWjdgWjVGcZUFv8+1S2A9dl1ApdDEg5CjhuvtT/ACURTguCTkjcfX1zUbOY1XzXbJ4BAwKgd4mkVpJDhT8qZ5Y/1/z1pWAdhRhNqpECeAAM+lQPEine8jRqh7DFNjnjRPNkumJ3bShTgZPt/jUEqysXkLB1bkMi5XjnJHrVIVyeXUbU3X2YhnlCjpwO/v6ipVv2EZ27/unHy4UfpWdE4mCSxuzbsfKV4XHb2qXdDAsjNMUbjgtjnsKLJgXftBRSxSRo2GSIxu4z3GM1lsLa6gjvbJzcwOvVTkqfcZzx6VaWTLJMxMTt8vDZ2n6flU9iILVUgeONJWVnZkAAcljlsfjk/WlaxV11MG4vR5XlW7xvOJM43DJGOvv0oj1CScZW4TCna4DfxDtjt0rVuNNgnuAqyI0sTZUN1HHtjtUCaDGly10MR7jyufvfn/OjrctSXLZj41O1o2faZWOWHb3q1a2qXVo8bl9vyrtwMYB5H6Va/drGZCqBUG0lkJOc4/xovZoprLfbN5TdWHQqAcn+VF9TMfEsUO37Sd00ciiOUrnORg4x079aL6aK5jYqCCJNrkj7rBdwPv1FCkOiLHEkm1g2WbHT+IVBBBcmFZriX97Nl3g+XaCQOBj3HX3otqJEcMOBJ083qcNkZ9qdbXCeUBK+1tv3G69etM2GN5I13IR8w2r94/5FMktjcyRNCrL8uWbZww54zT3GK+HQo4d5C+NyduKsW9ukU32hudq/xnIj9/rSTzW+kQnJQbmJYnHzNycE1WF/NKw8tvkf+JcYz2/ClqxmyJkRAQQNwyCVwOazpraZZmnd2IkYnoOnZTUwSC/tkW6jMnzbvUcHGOPzxRFbweXJCZGKbsg9fTH8qWwEEWxW+5kjnB4O769KkZ0aI5hJC4zjk5zzmnRQCeI+XuZd3B/vYyPTp/jTobNliYPtjTn5V+bFVcCvEr3jNH5bbV746e9aCobG1UK8XUKWkbjv/jVSWUtMltb+YHwWGFwv4nv/AJ6VoW8Mo8zfBEi7gVKkt+JqW7ksseYw2AxM248BV6emajkaRzneEUHBBA/nmpFYISC+cc5xgCoCPLfZHb/ucEls9/pSBDrYCOfy96kHlQOuK0azIYs36SRghQDkFfr3rToEVdRJGnTkDJCHivOLDWdK1W4Mceq2lxcxttEQ+Vs9TgE5PTqPSvSNR/5B8/b5DXGR2UQcSxW8cTH+MIAxyeen1J/GqRUSVYh/yzKr3dVA5pTOBI3zMCowSeAKWOAwuu3aIsfNk9Kc0MTBt4O0jGW7UxkckzxwAkmQeoHI5qKHCyGZ1I3AYYnjt781bktHZSIs8/w9e/TFQp5kTBfKccYLZ+X8qdwLNvFLEwDyLuk+bg/dHoP89quxRqGZf4uoH0xVdYkbEzpI57AfXrSLbCJ9zuVXeFRFJOewz68ZNTuItl2Fs3zeYNxGVHOPQD8qpsbyFl3lXTYxCD5SzZG0k+gGaulQ6sGTKB9wx2A/yaqfbLeXeTIXKluCvJ28N+AzikgHqWZGeZwysQygDjA96zpbzYswaNd/RpYzuHfqT/nJpL66Nyn7pmAU9B6Yx+QyO1NUokQjBZ2X5gHHT/GrsLcje3me3kf5WEm0rt4K+pG7+tPg86KVt0pRm6yEZ59R0FJO8jRLEItzNjjd09c0zzA7fZorgfaQP4sbsfSlzdGVyPcn+1vAyq8Ilk5yV4yf/r1YVIJpDG52vtzsfp6jFRAOsA+bL/dyf4cYz9c02YovmyS42r8rFU5IosIIoZEnhXa0u1t+T0XtnrVmVVtt1yXWOGPdJOZf4Mjlh6ABenvUMNw9oEDs0se7gu3KDsBUGq6XB4gs3tLxZ47aUKJgJdgYbufm+tDuLQ8S1f4jXk/jq21i0ZhaWL7II/u74+jZHqw/LivbtNltNUWz1aNTKknzQyBMFAc/ePpgjpXz6ug2E/xKGgoZIrBr/wCz5L5ZV3YPPrXv+n+H7bwtocejwyXNzbeb8hmdcxq3XnjjP481CbuM05HlE3lwQ5aWTcHYgrnHcBsn/wCtV54VtZgsiMxkBwWGV+lYlsLazd9o2zRvvDsv3VbgktnuF61qMrXsUO+73CHDsCoO484znp0qmA26imZ3BJjt9vDxjJyRg9R/L1pYrVPsZG6QqcEAMf5dv6U9Z3kZo1GVDdhxnnNSrMzRZdfLX37UgEtROjyLM6up+cHbgryePftUCy3AvCGTCvlY1QfcXknJ9+KsrtslK+YZZZCWGcZ68+nAzRFOGVCZFkRsqroAQefX8MfhQwOfv2abUFieMSMD8g6/Njk49uKsfZSVAIRdoyMen+f51rXscSLvSNjKe6ruY/4VTjspXh/efKhzwwIb/wCtVJ6DJLEFipb720jBOaulUi81t+xE/hKcLx6Dms+41LRvDEELajerbRzSeWkjngtjue3TvV20nt7i2e5tp45opG+V4nLhj25/Kpe4ia3jjR/MSWUoVAAyNo9/r2qXahDM25y3AX0qG4jhSBVYBE/ugEhvXgdadHc20pAjdTk44/lSGT20UaRnYmzB6A5NSbXdi/mOF6bOKYjKq4Y4UHOT3pS3ccIODzQSQNm2Zs8oeS5cAD0qQhzli3H92lZUmjUcMvXBHFK7tjbsO3u2eKAQy3nDzKq8jbnI5H51frN0tRDC0b7Q5kbAHp2/StKgRWv8/YJ9uM7D16VyomhO7n+HOegNdTqP/IPn/wBw1yEX72Uxt9wpnH1GapFIlMjtGxcNGR2A3Ux+dpfoO5HPc0kmIIWaNQPLxt68ZYCq9tO8lgGbacRnjHoeP50xlh5JDKirKvzDOw8A96lWceaoAzJtyUUdvWobslbeN1JXeVBA6YyP8avC0h84zbcuPlHPAH06UN2JLLuQNoicjA+ZT39hVWzmknublblDsh2jzG+UHOSTj6YqxJu3bw7D5jHjPGDg/n/ialtztimcKNxbBPr0FSh3KpkmdpIYUCeXzK4bIXuAPXI79veqa5uSFcoNylDKRtL8buB9TUlwzyzmLzGVZGbdtOM/5x9aZazEaELrYpk854xnoFzjH5cU9hNlaMssrQSIfUSZ2r+h6/hURtVjmLQtkpxsjfjnmmyXskbyOFQlEwOPb2+tUjdSLGki4BLHI7Z9fXNWFzWdFlYtvywGcE1DaWcCFpTCwnjH3jycc8ZqxayPcaPFcyNl5FyVx8o59P8AHNJJIyxy46BcYzU2KUnsMnmP2iLY2XYlvmX7o44/LP51K0sZtHdHjQhj5hOce/41jKn2jUtjsdsYDLj1rp9NsbeSL5kH3mA4zjDY/lVPQlGMonkt0SOVZWV8eYVbB/XrWtIBJZR29wh804YY6DBzuP1p95HHDaTlI1/dLuUEcZABH61WIBvLON1Dghpct13DpU3uJnIv8N9F0/WodbFxeSXUjtPLFJtaIK2d2eM4w1drdBPs6xvAZEbanlr378+g7fhT0gE8b3Ezu5dj8hxtAx93Hp7HNQQWwlhjumkl3zxhyA+AuQGwvoM4/L65EkFyzceRHcQqWBWZ8OvbAU//AFvzplxYQSaln5I0faHUsf3jA7h3HI9alu1UrISqkoBgkfj/AD/kKZIyxyqBFGfLaRUJHK4x39+9JMZLazRxrtj/AHm8ku0Y4JB6lug5H6VLIA5Q73XJwcHO4ZqtYTM6nKqACQoAxtwe351pmMNGjnlmYAn2zSHYzGMsdxMLYtcTMc7T8ojQntx7VagfdCLVxHE+1ifLH3B/Q/8A16bCoW4lfGWMpBPTpgDpUU0nlC6nCIXtgxTI64A6/maNwLO5REyK6sVA+U+nbv8AWnmLdFHvwNv3125zx09qcvzOpPXaGz9QP8adBbwwKzRRohZgSVUc0gucp8RdGt9Y8CarbwxuZ4UE0Sjk7kO7+Wfzr5r0rW9V0SdZ9Nv7i0fPJjcgH6joa+wZHLth8MrEKVI4wTzXG+LvAPhweCbiyh06OBLWOSaF4gA6sqk53dTnHOc5pMLmv4Uvbq/8OWFxLqUOqtKm5rqNQm722gcY6c4rViV/N3OUVWz8gA4/GvnX4Sa/qFj4stdJimzY3zlJYmyQDg/MvoeMV71DM9rZajKjbvJ3FFbkDGf8KaC5autQtPOS1KefKeQvbI5NTWd99rfY1nJGu3K578+nartpGiW6OqDc67iaRydu8cMeMihsQbxIvGV2nGAe9IxLREu2w/xYbIH41EnCwkAAuMsQKg1xETTJ3KB9g3AMTjP4UDsSWdoi3RuGwZGYsME8Vq1hWEzPLafKi5T+Fcfw1u0En//Z", - "text/plain": [ - "" - ] - }, - "metadata": { - "image/jpeg": { - "width": 400 - } - }, - "output_type": "display_data" - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Cropped image dimensions: (300, 300)\n" - ] - } - ], - "source": [ - "from PIL import Image\n", - "from IPython.display import display, Image as IPImage\n", - "\n", - "# Load and crop image\n", - "image_path = \"/datasets/PMC-15M/figures/PMC517716_F1.jpg/1471-2407-4-58-1.jpg\"\n", - "img = Image.open(image_path)\n", - "crop_box = (0, 0, 300, 300) # (left, top, right, bottom)\n", - "cropped_img = img.crop(crop_box)\n", - "\n", - "# Save cropped image temporarily\n", - "crop_path = \"cropped_image.jpg\"\n", - "cropped_img.save(crop_path)\n", - "\n", - "# Display cropped image\n", - "display(IPImage(filename=crop_path, width=400)) # Adjust width as needed\n", - "print(f\"Cropped image dimensions: {cropped_img.size}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# Process with model\n", - "model = classifier()" - ] - }, - { - "cell_type": "code", - "execution_count": 62, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Model results: ['a', 11, 164, 24, 184]\n", - "Temporary file removed\n" - ] - } - ], - "source": [ - "results = model.run(crop_path)\n", - "print(\"Model results:\", results)\n", - "\n", - "# Clean up\n", - "import os\n", - "os.remove(crop_path)\n", - "print(\"Temporary file removed\")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.9" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/openpmcvl/granular/process/subfigure_ocr.py b/openpmcvl/granular/process/subfigure_ocr.py deleted file mode 100644 index 2029083..0000000 --- a/openpmcvl/granular/process/subfigure_ocr.py +++ /dev/null @@ -1,407 +0,0 @@ -""" -Pipeline to OCR the label of each subfig and align them with subcaptions -""" - -import yaml -import torch -from skimage import io -import numpy as np -import cv2 -from torch.autograd import Variable -from PIL import Image -import torch.nn.functional as F -import os -from tqdm import tqdm -import json - -from subfigure_ocr.models.yolov3 import * -from subfigure_ocr.models.network import * -from subfigure_ocr.separator import process - -class classifier(): - def __init__(self): - model_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/exsclaim/figures/' - configuration_file = model_path + "config/yolov3_default_subfig.cfg" - with open(configuration_file, 'r') as f: - configuration = yaml.load(f, Loader=yaml.FullLoader) - - self.image_size = configuration['TEST']['IMGSIZE'] - self.nms_threshold = configuration['TEST']['NMSTHRE'] - self.confidence_threshold = 0.0001 - self.dtype = torch.cuda.FloatTensor - self.device = torch.device('cuda') - - object_detection_model = YOLOv3(configuration['MODEL']) - self.object_detection_model = self.load_model_from_checkpoint(object_detection_model, "object_detection_model.pt") - ## Load text recognition model - text_recognition_model = resnet152() - self.text_recognition_model = self.load_model_from_checkpoint(text_recognition_model, 'text_recognition_model.pt') - - self.object_detection_model.eval() - self.text_recognition_model.eval() - - def load_model_from_checkpoint(self, model, model_name): - """ load checkpoint weights into model """ - checkpoints_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/exsclaim/figures/checkpoints/' - checkpoint = checkpoints_path + model_name - model.load_state_dict(torch.load(checkpoint)) - # model = nn.DataParallel(model) - model.to(self.device) - return model - - def detect_subfigure_boundaries(self, figure_path): - """ Detects the bounding boxes of subfigures in figure_path - - Args: - figure_path: A string, path to an image of a figure - from a scientific journal - Returns: - subfigure_info (list of lists): Each inner list is - x1, y1, x2, y2, confidence - """ - - ## Preprocess the figure for the models - img = io.imread(figure_path) - if len(np.shape(img)) == 2: - img = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB) - else: - img = cv2.cvtColor(img,cv2.COLOR_RGBA2RGB) - - img, info_img = process.preprocess(img, self.image_size, jitter=0) - img = np.transpose(img / 255., (2, 0, 1)) - img = np.copy(img) - img = torch.from_numpy(img).float().unsqueeze(0) - img = Variable(img.type(self.dtype)) - - img_raw = Image.open(figure_path).convert("RGB") - width, height = img_raw.size - - ## Run model on figure - with torch.no_grad(): - outputs = self.object_detection_model(img.to(self.device)) - outputs = process.postprocess(outputs, dtype=self.dtype, - conf_thre=self.confidence_threshold, nms_thre=self.nms_threshold) - - ## Reformat model outputs to display bounding boxes in our desired format - ## List of lists where each inner list is [x1, y1, x2, y2, confidence] - subfigure_info = list() - - if outputs[0] is None: - return subfigure_info - - for x1, y1, x2, y2, conf, cls_conf, cls_pred in outputs[0]: - box = process.yolobox2label([y1.data.cpu().numpy(), x1.data.cpu().numpy(), y2.data.cpu().numpy(), x2.data.cpu().numpy()], info_img) - box[0] = int(min(max(box[0],0),width-1)) - box[1] = int(min(max(box[1],0),height-1)) - box[2] = int(min(max(box[2],0),width)) - box[3] = int(min(max(box[3],0),height)) - # ensures no extremely small (likely incorrect) boxes are counted - small_box_threshold = 5 - if (box[2]-box[0] > small_box_threshold and - box[3]-box[1] > small_box_threshold): - box.append("%.3f"%(cls_conf.item())) - subfigure_info.append(box) - return subfigure_info - - def detect_subfigure_labels(self, figure_path, subfigure_info): - """ Uses text recognition to read subfigure labels from figure_path - - Note: - To get sensible results, should be run only after - detect_subfigure_boundaries has been run - Args: - figure_path (str): A path to the image (.png, .jpg, or .gif) - file containing the article figure - subfigure_info (list of lists): Details about bounding boxes - of each subfigure from detect_subfigure_boundaries(). Each - inner list has format [x1, y1, x2, y2, confidence] where - x1, y1 are upper left bounding box coordinates as ints, - x2, y2, are lower right, and confidence the models confidence - Returns: - subfigure_info (list of tuples): Details about bounding boxes and - labels of each subfigure in figure. Tuples for each subfigure are - (x1, y1, x2, y2, label) where x1, y1 are upper left x and y coord - divided by image width/height and label is the an integer n - meaning the label is the nth letter - concate_img (np.ndarray): A numpy array representing the figure. - Used in classify_subfigures. Ideally this will be removed to - increase modularity. - """ - img_raw = Image.open(figure_path).convert("RGB") - img_raw = img_raw.copy() - width, height = img_raw.size - binary_img = np.zeros((height,width,1)) - - detected_label_and_bbox = None - max_confidence = 0.0 - for subfigure in subfigure_info: - ## Preprocess the image for the model - bbox = tuple(subfigure[:4]) - img_patch = img_raw.crop(bbox) - img_patch = np.array(img_patch)[:,:,::-1] - img_patch, _ = process.preprocess(img_patch, 28, jitter=0) - img_patch = np.transpose(img_patch / 255., (2, 0, 1)) - img_patch = torch.from_numpy(img_patch).type(self.dtype).unsqueeze(0) - - ## Run model on figure - label_prediction = self.text_recognition_model(img_patch.to(self.device)) - label_confidence = np.amax(F.softmax(label_prediction, dim=1).data.cpu().numpy()) - x1,y1,x2,y2, box_confidence = subfigure - total_confidence = float(box_confidence)*label_confidence - if total_confidence < max_confidence: - continue - label_value = chr(label_prediction.argmax(dim=1).data.cpu().numpy()[0]+ord("a")) - if label_value == "z": - continue - if (x2-x1) < 64 and (y2-y1)< 64: - detected_label_and_bbox = [label_value, x1,y1,x2,y2] - - return detected_label_and_bbox - - def run(self, figure_path): - subfigure_info = self.detect_subfigure_boundaries(figure_path) - subfigure_info = self.detect_subfigure_labels(figure_path, subfigure_info) - - return subfigure_info - - -def subfigure_ocr(): - """ - 提取subfigure的label信息 - """ - # 所有可以分出subcap的comfig - old_dict = {} - for i in range(10): - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_part_%d/exsclaim.json'%i - with open(file_path, 'r') as f: - old_dict.update(json.load(f)) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4.jsonl') - lines = f.readlines() - data = [json.loads(line) for line in lines] - comfig_dict = {} - for datum in tqdm(data): - comfig_id = datum['id'] - comfig_dict[comfig_id] = {'h':datum['height'], 'w':datum['width']} - - model = classifier() - # root path to all subfigs - path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_subfigures/' - # all comfigs - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl') - lines = f.readlines() - comfig = [json.loads(line) for line in lines] - new_dict = {} - # for datum in tqdm(comfig[:100000]): - for datum in tqdm(comfig): - comfig_id = datum['comfig_id'] - if not (comfig_id in old_dict): # 只ocr那些caption可以被打开的结果 - continue - comfig_h = comfig_dict[comfig_id]['h'] - comfig_w = comfig_dict[comfig_id]['w'] - # 记录每个comfig的subfig信息(包含OCR - master_images=[] - for subfig, locs, scores in zip(datum['subfig_ids'], datum['subfig_locs'], datum['subfig_scores']): - label_info = model.run(path+subfig) - if label_info: - x1, y1, x2, y2 = locs - x1 = round(x1 * comfig_w) - x2 = round(x2 * comfig_w) - y1 = round(y1 * comfig_h) - y2 = round(y2 * comfig_h) - w = x2 - x1 - h = y2 - y1 - geometry = [{'x':x1, 'y':y1}, {'x':x1, 'y':y2}, {'x':x2, 'y':y1}, {'x':x2, 'y':y2}] - label, label_x1, label_y1, label_x2, label_y2 = label_info - label_geometry = [{'x':label_x1+x1, 'y':label_y1+y1}, {'x':label_x1+x1, 'y':label_y2+y1}, {'x':label_x2+x1, 'y':label_y1+y1}, {'x':label_x2+x1, 'y':label_y2+y1}] - subfig_label = {"text":label, "geometry":label_geometry} - master_images.append({ - 'classification':subfig, - 'confidence':scores, - 'height':h, 'width':w, - 'geometry':geometry, - "subfigure_label":subfig_label, - "scale_bars":[], - "caption": [], - "keywords": [], - "general": []}) - new_dict[comfig_id] = old_dict[comfig_id] - new_dict[comfig_id]['master_images'] = master_images - - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_ocr_subfig.json', 'w', encoding="utf-8") as f: - json.dump(new_dict, f, indent=3) - -# change this file path for different subcaption separation method -def subfigure_ocr_link_exsclaim_subcap(): - """ - ocr之后的subfigure和subcaption合并到同一个exsclaim中 - """ - def are_same_text(t1, t2, tokenizer): - if t1 == t2: - return True - if t1[:-1] == t2: - return True - if t1 == t2[:-1]: - return True - if tokenizer.tokenize(t1) == tokenizer.tokenize(t2): - return True - else: - return False - from transformers import AutoTokenizer - tokenizer = AutoTokenizer.from_pretrained('microsoft/BiomedNLP-PubMedBERT-base-uncased-abstract-fulltext') - - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/pmc2exsclaim_sep_cap_v0.json' - with open(file_path, 'r') as f: - cap_dict = json.load(f) - - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim_no_subcaps.json' - with open(file_path, 'r') as f: - data_dict = json.load(f) - - """ - check = {} - for pmc_id, datum in tqdm(data_dict.items()): - check[pmc_id] = datum - if len(check) > 2: - break - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/check_before_link_subcaps.json', 'w', encoding="utf-8") as f: - json.dump(check, f, indent=3) - """ - - filtered_subcap = 0 - unfiltered_subcap = 0 - for pmc_id, datum in tqdm(data_dict.items()): - subcaps = [] - for subcap in cap_dict[pmc_id]['unassigned']['captions']: - if len(subcap["description"]) == 0: - # 没有 - continue - filtered_description = [] - for text in subcap["description"]: - # subcap中每一段不等于整个caption - if not are_same_text(text, datum['full_caption'], tokenizer): - filtered_description.append(text) - if len(filtered_description) == 0: - # 都过滤掉了 - continue - joint_subcap = " ".join(filtered_description) - if not are_same_text(joint_subcap, datum['full_caption'], tokenizer): - # subcap连在一起不等于整个caption - subcap["description"] = filtered_description - subcaps.append(subcap) - unfiltered_subcap += 1 - else: - filtered_subcap += 1 - data_dict[pmc_id]['unassigned']['captions'] = subcaps - - """ - check = {} - for pmc_id, datum in tqdm(data_dict.items()): - check[pmc_id] = datum - if len(check) > 2: - break - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/check_after_link_subcaps.json', 'w', encoding="utf-8") as f: - json.dump(check, f, indent=3) - """ - - with open('/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json', 'w', encoding="utf-8") as f: - json.dump(data_dict, f, indent=3) - -# 将/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json送入exsclaim的pipeline将subfig和subcap对齐 - -def ocr_replace_clip_alignment(): - """ - 将exsclaim输出的subfigure和subcaption对齐结果,替换掉CLIP的对齐结果 - """ - file_path = '/remote-home/zihengzhao/CompoundFigure/exsclaim/extracted/detr_subfigure_ocr_align/exsclaim.json' - with open(file_path, 'r') as f: - ocr_dict = json.load(f) - - file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' - with open(file_path, 'r') as f: - lines = f.readlines() - data = [json.loads(line) for line in lines] - - new_data = [] - missing_comfig = abandon_1 = abandon_2 = replace = 0 - for datum in tqdm(data): - comfig_id = datum['comfig_id'] - old_subfig_ids = datum['subfig_ids'] - old_subcaptions = datum['subcaptions'] - old_subcap_indexes = datum['subcap_indexes'] - old_subcap_scores = datum['subcap_scores'] - new_subfig_ids = [] - new_subcap_indexes = [] - new_subcap_scores = [] - if comfig_id not in ocr_dict: - missing_comfig += 1 - continue - ocr_results = ocr_dict[comfig_id] - for subfig in ocr_results['master_images']: - if len(subfig['caption']) > 0: - if subfig['classification'] not in old_subfig_ids: - print('Subfig ID not found Error : ', subfig['classification']) - abandon_1 += 1 - continue - subcaption = " ".join(subfig['caption']) - if subcaption not in old_subcaptions: - print('Caption not found Error : ', subfig['classification']) - print('Subcaption : %s'% subcaption) - for i, tmp in enumerate(old_subcaptions): - print('Subcaption Option %d : %s \n', (i,tmp)) - abandon_2 += 1 - continue - # 有ocr匹配的subcaption结果, 而且可以替换进来 - new_subfig_ids.append(subfig['classification']) - new_subcap_indexes.append(old_subcaptions.index(subcaption)) - new_subcap_scores.append(1.0) - replace += 1 - for idx, subfig in enumerate(old_subfig_ids): - if subfig in new_subfig_ids: - # 已经用ocr的匹配结果替换掉了 - continue - else: - new_subfig_ids.append(subfig) - new_subcap_indexes.append(old_subcap_indexes[idx]) - new_subcap_scores.append(old_subcap_scores[idx]) - datum['subfig_ids'] = new_subfig_ids - datum['subcap_indexes'] = new_subcap_indexes - datum['subcap_scores'] = new_subcap_scores - new_data.append(datum) - - print('Missing comfig in exsclaim:', missing_comfig) - print('Missing subfigure id:', abandon_1) - print('Missing subcaption:', abandon_2) - print('Successfully replace:', replace) - - f = open('/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(plus_ocr).jsonl', 'w') - for datum in tqdm(new_data): - f.write(json.dumps(datum)+'\n') - f.close() - - -if __name__ == "__main__": - file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_com2sub(new).jsonl' - with open(file_path, 'r') as f: - lines = f.readlines() - data = [json.loads(line) for line in lines] - - for datum in data: - if datum['comfig_id'] == "PMC4608103_Fig2.jpg": - for subcap in datum['subcaptions']: - print(subcap, '\n') - break - - file_path = '/remote-home/share/medical/public/PMC_OA/caption_T060_filtered_top4/caption_T060_filtered_top4_sep_v0/caption_T060_filtered_top4_sep_v0_sub2com(new).jsonl' - with open(file_path, 'r') as f: - lines = f.readlines() - data = [json.loads(line) for line in lines] - - for datum in data: - if datum['comfig_id'] == "PMC4608103_Fig2.jpg": - print(datum['subcaption']) - - - - - diff --git a/openpmcvl/granular/process/subfigure_ocr/__init__.py b/openpmcvl/granular/process/subfigure_ocr/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/process/subfigure_ocr/config/scale_label_reader.json b/openpmcvl/granular/process/subfigure_ocr/config/scale_label_reader.json deleted file mode 100644 index b63122f..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/config/scale_label_reader.json +++ /dev/null @@ -1,169 +0,0 @@ -{ - "echo":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":1, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6 - }, - "charlie":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":1, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6 - }, - "bravo":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6, - "text":"complete_random" - }, - "alpha":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":4 - }, - "beta":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":64, - "input_width":256, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":4 - }, - "gamma":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":4 - }, - "delta":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6 - }, - "epsilon":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6, - "text":"complete_random" - }, - "zeta":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":1, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6, - "text":"complete_random" - }, - "eta":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":0, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6 - }, - "theta":{ - "batch_size":16, - "learning_rate":0.01, - "cnn_to_rnn":1, - "input_height":128, - "input_width":512, - "sequence_length":32, - "recurrent_type":"bi-lstm", - "cnn_kernel_size":[ - 3, - 3 - ], - "convolution_layers":6 - }, - "original":{ - "convolution_layers":4, - "cnn_kernel_size":[3,3], - "activation_type":"relu", - "recurrent_layers":2, - "recurrent_type":"bi-lstm", - "input_height":32, - "input_width":128, - "sequence_length":8 - } -} \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_master.cfg b/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_master.cfg deleted file mode 100644 index 3e8f7fc..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_master.cfg +++ /dev/null @@ -1,34 +0,0 @@ -MODEL: - TYPE: YOLOv3 - BACKBONE: darknet53 - ANCHORS: [[185, 147], [94, 87], [133, 126], - [102, 212], [234, 102], [204, 199], - [390, 123], [177, 368], [318, 230]] - ANCH_MASK: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] - N_CLASSES: 15 -TRAIN: - LR: 0.001 - MOMENTUM: 0.9 - DECAY: 0.0005 - BURN_IN: 1000 - MAXITER: 50000 - STEPS: (400000, 450000) - BATCHSIZE: 4 - SUBDIVISION: 16 - IMGSIZE: 608 - LOSSTYPE: l2 - IGNORETHRE: 0.7 -AUGMENTATION: - RANDRESIZE: True - JITTER: 0.3 - RANDOM_PLACING: True - HUE: 0.1 - SATURATION: 1.5 - EXPOSURE: 1.5 - LRFLIP: False - RANDOM_DISTORT: True -TEST: - CONFTHRE: 0.8 - NMSTHRE: 0.1 - IMGSIZE: 416 -NUM_GPUS: 1 diff --git a/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_subfig.cfg b/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_subfig.cfg deleted file mode 100644 index 7a879f4..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/config/yolov3_default_subfig.cfg +++ /dev/null @@ -1,34 +0,0 @@ -MODEL: - TYPE: YOLOv3 - BACKBONE: darknet53 - ANCHORS: [[6, 7], [9, 10], [10, 14], - [13, 11], [16, 15], [15, 20], - [21, 19], [24, 24], [34, 31]] - ANCH_MASK: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] - N_CLASSES: 15 -TRAIN: - LR: 0.001 - MOMENTUM: 0.9 - DECAY: 0.0005 - BURN_IN: 1000 - MAXITER: 20000 - STEPS: (400000, 450000) - BATCHSIZE: 4 - SUBDIVISION: 16 - IMGSIZE: 608 - LOSSTYPE: l2 - IGNORETHRE: 0.7 -AUGMENTATION: - RANDRESIZE: True - JITTER: 0.3 - RANDOM_PLACING: True - HUE: 0.1 - SATURATION: 1.5 - EXPOSURE: 1.5 - LRFLIP: False - RANDOM_DISTORT: True -TEST: - CONFTHRE: 0.8 - NMSTHRE: 0.1 - IMGSIZE: 416 -NUM_GPUS: 1 diff --git a/openpmcvl/granular/process/subfigure_ocr/models/__init__.py b/openpmcvl/granular/process/subfigure_ocr/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/process/subfigure_ocr/models/crnn.py b/openpmcvl/granular/process/subfigure_ocr/models/crnn.py deleted file mode 100644 index 1e8c5c1..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/models/crnn.py +++ /dev/null @@ -1,182 +0,0 @@ -from torch import optim, nn, utils -import numpy as np - -class CRNN(nn.Module): - - def __init__(self, - configuration=None, - input_channels=3, - output_classes=22, - convolution_layers=4, - cnn_kernel_size=(3,3), - in_channels=None, - max_pooling=None, - batch_normalization=None, - dropout=None, - activation_type="relu", - recurrent_layers=2, - recurrent_type="bi-lstm", - input_height=128, - input_width=512, - sequence_length=32): - """ Initialize a Convolutional Recurrent Neural Network - - Args: - configuration (dict): dictionary containing configuration - parameters. If not provided, values from keyword arguments will be - used. If both provided, keyword arguments take precedence. - input (int): Number of input channels. Default: 3 (for RGB images) - output (int): Number of output channels/classes. Default: 22 - convolution_layers (int): Number of Conv2d layers in architecture - cnn_kernal_size (tuple): (h, w) of kernel applied in each cnn layer - in_channels (list): Number on input channels for each respective - convolutional layer. Must be None or a list of length of - convolution_layers. If None, defaults to in_channels defined - below. - batch_normalization (list): list of ints, where each int is a - convultional layer after which batch normalization should - occur. Each element of the list should be - <= convolution_layers. If False, no batch normalization will - occur. - max_pooling (list): list of ints, where each int is a - convultional layer after which max pooling should occur. Each - element of the list should be <= convolution_layers. If False, - no max_pooling will occur. - dropout (list): list of ints, where each int is a - convultional layer after which batch normalization should - occur. Each element of the list should be - <= convolution_layers. If False, no dropout will occur. - activation_type (string): Activation function to be applied after - each convolutional layer. Default: relu - recurrent_type (string): Type of RNN to be used. Default: bi-lstm - recurrent_layers (int): Number of recurrent layers - input_height (int): expected height of input images. Default: 16 - input_width (int): expected width of input images. Default: 128 - sequence_length (int): Output width of CNN and input sequence - length to RNN (time steps). Default: 8. - """ - super(CRNN, self).__init__() - # load parameters from configuration file if provided - if configuration is not None: - # with open(configureation_file, "r") as f: - # config = json.load(f) - config = configuration - input_channels = config.get("input_channels", input_channels) - output_classes = config.get("output_classes", output_classes) - convolution_layers = ( - config.get("convolution_layers", convolution_layers) - ) - cnn_kernel_size = config.get("cnn_kernel_size", cnn_kernel_size) - in_channels = config.get("in_channels", in_channels) - max_pooling = config.get("max_pooling", max_pooling) - batch_normalization = ( - config.get("batch_normalization", batch_normalization) - ) - dropout = config.get("dropout", dropout) - activation_type = config.get("activation_type", activation_type) - recurrent_layers = ( - config.get("recurrent_layers", recurrent_layers) - ) - recurrent_type = config.get("recurrent_type", recurrent_type) - input_height = config.get("input_height", input_height) - input_width = config.get("input_width", input_width) - sequence_length = config.get("sequence_length", sequence_length) - - activation_functions = { - "relu": nn.ReLU(), - "leaky_relu": nn.LeakyReLU(), - "tanh": nn.Tanh() - } - max_pooling_kernel = (3, 3) - max_pooling_stride = (2, 2) - max_pooling_padding = (max_pooling_kernel[0] // 2, max_pooling_kernel[1] // 2) - current_dims = (input_height, input_width) - activation_function = activation_functions[activation_type.lower()] - if in_channels is None: - if convolution_layers < 8: - in_channels = [64, 128, 256, 256, 512, 512, 512] - else: - in_channels = [min(2**(i // 3 + 6), 2014) - for i in range(convolution_layers)] - if batch_normalization is None: - batch_normalization = [i for i in range(0, convolution_layers, 2)] - if dropout is None: - dropout = [] - if max_pooling is None: - max_pooling = list(np.linspace(0, convolution_layers - 1, - 3).astype(int)) - in_channels = [input_channels] + in_channels - # Build the CNN layers - cnn = nn.Sequential() - for layer in range(convolution_layers): - in_channel = in_channels[layer] - out_channel = in_channels[layer + 1] - padding = (cnn_kernel_size[0] // 2, cnn_kernel_size[1] // 2) - convolution_layer = nn.Conv2d(in_channel, out_channel, cnn_kernel_size, padding=padding) - cnn.add_module("Convolution {}".format(layer), convolution_layer) - if layer in max_pooling: - cnn.add_module("Max Pooling {}".format(layer), - nn.MaxPool2d(max_pooling_kernel, max_pooling_stride, max_pooling_padding)) - current_dims = max_pooling_output_dim(current_dims, - max_pooling_kernel, - max_pooling_padding, - max_pooling_stride) - if layer in batch_normalization: - cnn.add_module("Batch Nomralization {}".format(layer), - nn.BatchNorm2d(out_channel)) - cnn.add_module("Activation {}".format(layer), activation_function) - if layer in dropout: - cnn.add_module("Dropout {}".format(layer), nn.Dropout2d(0.5)) - # Add a Max Pooling layer to get the height of the image to 1 and - # the width to the desired sequence length - divisor = int(current_dims[1] / sequence_length) - kernel = (current_dims[0] + 1, max(divisor + 1, 3)) - padding = (current_dims[0] // 2, max(divisor // 2, 1)) - stride = (current_dims[0], divisor) - cnn.add_module("Max Pooling Last {}".format(divisor), - nn.MaxPool2d(kernel, stride, padding)) - current_dims = max_pooling_output_dim(current_dims, kernel, padding, stride) - hidden = 256 - recurrent_types = { - "bi-lstm": nn.LSTM(out_channel, hidden, bidirectional=True), - "lstm": nn.LSTM(out_channel, hidden, bidirectional=False) - } - # Build the RNN layers - rnn = nn.Sequential() - rnn.add_module("Recurrent Layer {}".format(layer+1), - recurrent_types[recurrent_type]) - if recurrent_type == "bi-lstm": - hidden_out = hidden*2 - else: - hidden_out = hidden - self.fc = nn.Sequential() - self.fc.add_module("Fully Connected", nn.Linear(hidden_out, output_classes)) - self.rnn = rnn - self.cnn = cnn - - def forward(self, input): - cnn_output = self.cnn(input) - batch_size, channels, height, width = cnn_output.size() - assert height == 1 - # eliminate height dimension - cnn_output = cnn_output.squeeze(2) # batch, channels, width - # Format input to rnn to sequence, batch, channels because - # that is expected input for RNN (unless batch_first=True) - # In PyTorch LSTM nomenclature, width is sequence length and - # channels is input size - cnn_output = cnn_output.permute(2, 0, 1) # width, batch, channels - rnn_output, _ = self.rnn(cnn_output) # width, batch, channels - # Reformat shape for fully connected layer - rnn_output = rnn_output.permute(1, 0, 2) # batch, width/seq, channels - output = self.fc(rnn_output) # batch, width/seq, classes - output = nn.LogSoftmax(dim=2)(output) # batch, width/seq, classes - - return output - -def max_pooling_output_dim(dimension, kernel, padding, stride, dilation=(1,1)): - output_dims = [] - for i in range(0, 2): - numerator = dimension[i] + 2*padding[i] - dilation[i] * (kernel[i] -1) - 1 - output = int(float(numerator) / stride[i] + 1) - output_dims.append(output) - return output_dims diff --git a/openpmcvl/granular/process/subfigure_ocr/models/network.py b/openpmcvl/granular/process/subfigure_ocr/models/network.py deleted file mode 100644 index bf1b8cf..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/models/network.py +++ /dev/null @@ -1,353 +0,0 @@ -import torch -import torch.nn as nn -from torch.utils.model_zoo import load_url as load_state_dict_from_url - -def get_model_urls(): - model_urls = { - 'resnet18': 'https://download.pytorch.org/models/resnet18-5c106cde.pth', - 'resnet34': 'https://download.pytorch.org/models/resnet34-333f7ec4.pth', - 'resnet50': 'https://download.pytorch.org/models/resnet50-19c8e357.pth', - 'resnet101': 'https://download.pytorch.org/models/resnet101-5d3b4d8f.pth', - 'resnet152': 'https://download.pytorch.org/models/resnet152-b121ed2d.pth', - 'resnext50_32x4d': 'https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth', - 'resnext101_32x8d': 'https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth', - 'wide_resnet50_2': 'https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth', - 'wide_resnet101_2': 'https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth', - } - return model_urls - -def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): - """3x3 convolution with padding""" - return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, - padding=dilation, groups=groups, bias=False, dilation=dilation) - - -def conv1x1(in_planes, out_planes, stride=1): - """1x1 convolution""" - return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) - - -class BasicBlock(nn.Module): - expansion = 1 - __constants__ = ['downsample'] - - def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, - base_width=64, dilation=1, norm_layer=None): - super(BasicBlock, self).__init__() - if norm_layer is None: - norm_layer = nn.BatchNorm2d - if groups != 1 or base_width != 64: - raise ValueError('BasicBlock only supports groups=1 and base_width=64') - if dilation > 1: - raise NotImplementedError("Dilation > 1 not supported in BasicBlock") - # Both self.conv1 and self.downsample layers downsample the input when stride != 1 - self.conv1 = conv3x3(inplanes, planes, stride) - self.bn1 = norm_layer(planes) - self.relu = nn.ReLU(inplace=True) - self.conv2 = conv3x3(planes, planes) - self.bn2 = norm_layer(planes) - self.downsample = downsample - self.stride = stride - - def forward(self, x): - identity = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - - if self.downsample is not None: - identity = self.downsample(x) - - out += identity - out = self.relu(out) - - return out - - -class Bottleneck(nn.Module): - expansion = 4 - __constants__ = ['downsample'] - - def __init__(self, inplanes, planes, stride=1, downsample=None, groups=1, - base_width=64, dilation=1, norm_layer=None): - super(Bottleneck, self).__init__() - if norm_layer is None: - norm_layer = nn.BatchNorm2d - width = int(planes * (base_width / 64.)) * groups - # Both self.conv2 and self.downsample layers downsample the input when stride != 1 - self.conv1 = conv1x1(inplanes, width) - self.bn1 = norm_layer(width) - self.conv2 = conv3x3(width, width, stride, groups, dilation) - self.bn2 = norm_layer(width) - self.conv3 = conv1x1(width, planes * self.expansion) - self.bn3 = norm_layer(planes * self.expansion) - self.relu = nn.ReLU(inplace=True) - self.downsample = downsample - self.stride = stride - - def forward(self, x): - identity = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - out = self.relu(out) - - out = self.conv3(out) - out = self.bn3(out) - - if self.downsample is not None: - identity = self.downsample(x) - - out += identity - out = self.relu(out) - - return out - - -class ResNet(nn.Module): - - def __init__(self, block, layers, num_classes=30, zero_init_residual=False, - groups=1, width_per_group=64, replace_stride_with_dilation=None, - norm_layer=None): - super(ResNet, self).__init__() - if norm_layer is None: - norm_layer = nn.BatchNorm2d - self._norm_layer = norm_layer - - self.inplanes = 64 - self.dilation = 1 - if replace_stride_with_dilation is None: - # each element in the tuple indicates if we should replace - # the 2x2 stride with a dilated convolution instead - replace_stride_with_dilation = [False, False, False] - if len(replace_stride_with_dilation) != 3: - raise ValueError("replace_stride_with_dilation should be None " - "or a 3-element tuple, got {}".format(replace_stride_with_dilation)) - self.groups = groups - self.base_width = width_per_group - self.conv1 = nn.Conv2d(3, self.inplanes, kernel_size=3, stride=1, padding=1, - bias=False) - self.bn1 = norm_layer(self.inplanes) - self.relu = nn.ReLU(inplace=True) - self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) - self.layer1 = self._make_layer(block, 64, layers[0]) - self.layer2 = self._make_layer(block, 128, layers[1], stride=2, - dilate=replace_stride_with_dilation[0]) - self.layer3 = self._make_layer(block, 256, layers[2], stride=2, - dilate=replace_stride_with_dilation[1]) - self.layer4 = self._make_layer(block, 512, layers[3], stride=2, - dilate=replace_stride_with_dilation[2]) - self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) - self.fc = nn.Linear(512 * block.expansion, num_classes) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu') - elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): - nn.init.constant_(m.weight, 1) - nn.init.constant_(m.bias, 0) - - # Zero-initialize the last BN in each residual branch, - # so that the residual branch starts with zeros, and each residual block behaves like an identity. - # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677 - if zero_init_residual: - for m in self.modules(): - if isinstance(m, Bottleneck): - nn.init.constant_(m.bn3.weight, 0) - elif isinstance(m, BasicBlock): - nn.init.constant_(m.bn2.weight, 0) - - def _make_layer(self, block, planes, blocks, stride=1, dilate=False): - norm_layer = self._norm_layer - downsample = None - previous_dilation = self.dilation - if dilate: - self.dilation *= stride - stride = 1 - if stride != 1 or self.inplanes != planes * block.expansion: - downsample = nn.Sequential( - conv1x1(self.inplanes, planes * block.expansion, stride), - norm_layer(planes * block.expansion), - ) - - layers = [] - layers.append(block(self.inplanes, planes, stride, downsample, self.groups, - self.base_width, previous_dilation, norm_layer)) - self.inplanes = planes * block.expansion - for _ in range(1, blocks): - layers.append(block(self.inplanes, planes, groups=self.groups, - base_width=self.base_width, dilation=self.dilation, - norm_layer=norm_layer)) - - return nn.Sequential(*layers) - - def _forward(self, x): - x = self.conv1(x) - x = self.bn1(x) - x = self.relu(x) -# x = self.maxpool(x) - - x = self.layer1(x) -# print(x.size()) - x = self.layer2(x) -# print(x.size()) - x = self.layer3(x) -# print(x.size()) - x = self.layer4(x) -# print(x.size()) - - x = self.avgpool(x) - x = torch.flatten(x, 1) - x = self.fc(x) - - return x - - # Allow for accessing forward method in a inherited class - forward = _forward - - -def _resnet(arch, block, layers, pretrained, progress, **kwargs): - model = ResNet(block, layers, **kwargs) - if pretrained: - model_urls = get_model_urls() - state_dict = load_state_dict_from_url(model_urls[arch], - progress=progress) - model.load_state_dict(state_dict) - return model - - -def resnet18(pretrained=False, progress=True, **kwargs): - r"""ResNet-18 model from - `"Deep Residual Learning for Image Recognition" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - return _resnet('resnet18', BasicBlock, [2, 2, 2, 2], pretrained, progress, - **kwargs) - - -def resnet34(pretrained=False, progress=True, **kwargs): - r"""ResNet-34 model from - `"Deep Residual Learning for Image Recognition" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - return _resnet('resnet34', BasicBlock, [3, 4, 6, 3], pretrained, progress, - **kwargs) - - -def resnet50(pretrained=False, progress=True, **kwargs): - r"""ResNet-50 model from - `"Deep Residual Learning for Image Recognition" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - return _resnet('resnet50', Bottleneck, [3, 4, 6, 3], pretrained, progress, - **kwargs) - - -def resnet101(pretrained=False, progress=True, **kwargs): - r"""ResNet-101 model from - `"Deep Residual Learning for Image Recognition" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - return _resnet('resnet101', Bottleneck, [3, 4, 23, 3], pretrained, progress, - **kwargs) - - -def resnet152(pretrained=False, progress=True, **kwargs): - r"""ResNet-152 model from - `"Deep Residual Learning for Image Recognition" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - return _resnet('resnet152', Bottleneck, [3, 8, 36, 3], pretrained, progress, - **kwargs) - - -def resnext50_32x4d(pretrained=False, progress=True, **kwargs): - r"""ResNeXt-50 32x4d model from - `"Aggregated Residual Transformation for Deep Neural Networks" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - kwargs['groups'] = 32 - kwargs['width_per_group'] = 4 - return _resnet('resnext50_32x4d', Bottleneck, [3, 4, 6, 3], - pretrained, progress, **kwargs) - - -def resnext101_32x8d(pretrained=False, progress=True, **kwargs): - r"""ResNeXt-101 32x8d model from - `"Aggregated Residual Transformation for Deep Neural Networks" `_ - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - kwargs['groups'] = 32 - kwargs['width_per_group'] = 8 - return _resnet('resnext101_32x8d', Bottleneck, [3, 4, 23, 3], - pretrained, progress, **kwargs) - - -def wide_resnet50_2(pretrained=False, progress=True, **kwargs): - r"""Wide ResNet-50-2 model from - `"Wide Residual Networks" `_ - - The model is the same as ResNet except for the bottleneck number of channels - which is twice larger in every block. The number of channels in outer 1x1 - convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 - channels, and in Wide ResNet-50-2 has 2048-1024-2048. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - kwargs['width_per_group'] = 64 * 2 - return _resnet('wide_resnet50_2', Bottleneck, [3, 4, 6, 3], - pretrained, progress, **kwargs) - - -def wide_resnet101_2(pretrained=False, progress=True, **kwargs): - r"""Wide ResNet-101-2 model from - `"Wide Residual Networks" `_ - - The model is the same as ResNet except for the bottleneck number of channels - which is twice larger in every block. The number of channels in outer 1x1 - convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 - channels, and in Wide ResNet-50-2 has 2048-1024-2048. - - Args: - pretrained (bool): If True, returns a model pre-trained on ImageNet - progress (bool): If True, displays a progress bar of the download to stderr - """ - kwargs['width_per_group'] = 64 * 2 - return _resnet('wide_resnet101_2', Bottleneck, [3, 4, 23, 3], - pretrained, progress, **kwargs) - -if __name__ == '__main__': - __all__ = ['ResNet', 'resnet18', 'resnet34', 'resnet50', 'resnet101', - 'resnet152', 'resnext50_32x4d', 'resnext101_32x8d', - 'wide_resnet50_2', 'wide_resnet101_2'] \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/models/yolo_layer.py b/openpmcvl/granular/process/subfigure_ocr/models/yolo_layer.py deleted file mode 100644 index 10ebd4f..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/models/yolo_layer.py +++ /dev/null @@ -1,632 +0,0 @@ -import torch -import torch.nn as nn -import numpy as np -from .network import resnet152 -import cv2 -import warnings - -def bboxes_iou(bboxes_a, bboxes_b, xyxy=True): - """Calculate the Intersection of Unions (IoUs) between bounding boxes. - IoU is calculated as a ratio of area of the intersection - and area of the union. - - Args: - bbox_a (array): An array whose shape is :math:`(N, 4)`. - :math:`N` is the number of bounding boxes. - The dtype should be :obj:`numpy.float32`. - bbox_b (array): An array similar to :obj:`bbox_a`, - whose shape is :math:`(K, 4)`. - The dtype should be :obj:`numpy.float32`. - Returns: - array: - An array whose shape is :math:`(N, K)`. \ - An element at index :math:`(n, k)` contains IoUs between \ - :math:`n` th bounding box in :obj:`bbox_a` and :math:`k` th bounding \ - box in :obj:`bbox_b`. - - from: https://github.com/chainer/chainercv - """ - if bboxes_a.shape[1] != 4 or bboxes_b.shape[1] != 4: - raise IndexError - - # top left - if xyxy: - tl = torch.max(bboxes_a[:, None, :2], bboxes_b[:, :2]) - # bottom right - br = torch.min(bboxes_a[:, None, 2:], bboxes_b[:, 2:]) - area_a = torch.prod(bboxes_a[:, 2:] - bboxes_a[:, :2], 1) - area_b = torch.prod(bboxes_b[:, 2:] - bboxes_b[:, :2], 1) - else: - tl = torch.max((bboxes_a[:, None, :2] - bboxes_a[:, None, 2:] / 2), - (bboxes_b[:, :2] - bboxes_b[:, 2:] / 2)) - # bottom right - br = torch.min((bboxes_a[:, None, :2] + bboxes_a[:, None, 2:] / 2), - (bboxes_b[:, :2] + bboxes_b[:, 2:] / 2)) - - area_a = torch.prod(bboxes_a[:, 2:], 1) - area_b = torch.prod(bboxes_b[:, 2:], 1) - en = (tl < br).type(tl.type()).prod(dim=2) - area_i = torch.prod(br - tl, 2) * en # * ((tl < br).all()) - return area_i / (area_a[:, None] + area_b - area_i) -class YOLOLayer(nn.Module): - """ - detection layer corresponding to yolo_layer.c of darknet - """ - def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): - """ - Args: - config_model (dict) : model configuration. - ANCHORS (list of tuples) : - ANCH_MASK: (list of int list): index indicating the anchors to be - used in YOLO layers. One of the mask group is picked from the list. - N_CLASSES (int): number of classes - layer_no (int): YOLO layer number - one from (0, 1, 2). - in_ch (int): number of input channels. - ignore_thre (float): threshold of IoU above which objectness training is ignored. - """ - - super(YOLOLayer, self).__init__() - strides = [32, 16, 8] # fixed - self.anchors = config_model['ANCHORS'] - self.n_anchors = len(self.anchors) -# self.anch_mask = config_model['ANCH_MASK'][layer_no] -# self.n_anchors = len(self.anch_mask) - self.n_classes = config_model['N_CLASSES'] - self.ignore_thre = ignore_thre - # self.l2_loss = nn.MSELoss(size_average=False) - # self.bce_loss = nn.BCELoss(size_average=False) - self.l2_loss = nn.MSELoss(reduction='sum') - self.bce_loss = nn.BCELoss(reduction='sum') - - - self.stride = strides[layer_no] - self.all_anchors_grid = [(w / self.stride, h / self.stride) - for w, h in self.anchors] - self.masked_anchors = self.all_anchors_grid - self.ref_anchors = np.zeros((len(self.all_anchors_grid), 4)) - self.ref_anchors[:, 2:] = np.array(self.all_anchors_grid) - self.ref_anchors = torch.FloatTensor(self.ref_anchors) - self.conv = nn.Conv2d(in_channels=in_ch, - out_channels=self.n_anchors * 5, - kernel_size=1, stride=1, padding=0) - self.classifier_model = resnet152() - - def forward(self, xin, compound_labels=None): - """ - In this - Args: - xin (torch.Tensor): input feature map whose size is :math:`(N, C, H, W)`, \ - where N, C, H, W denote batchsize, channel width, height, width respectively. - labels (torch.Tensor): label data whose size is :math:`(N, K, 5)`. \ - N and K denote batchsize and number of labels. - Each label consists of [class, xc, yc, w, h]: - class (float): class index. - xc, yc (float) : center of bbox whose values range from 0 to 1. - w, h (float) : size of bbox whose values range from 0 to 1. - Returns: - loss (torch.Tensor): total loss - the target of backprop. - loss_xy (torch.Tensor): x, y loss - calculated by binary cross entropy (BCE) \ - with boxsize-dependent weights. - loss_wh (torch.Tensor): w, h loss - calculated by l2 without size averaging and \ - with boxsize-dependent weights. - loss_obj (torch.Tensor): objectness loss - calculated by BCE. - loss_cls (torch.Tensor): classification loss - calculated by BCE for each class. - loss_l2 (torch.Tensor): total l2 loss - only for logging. - """ - output = self.conv(xin) - - batchsize = output.shape[0] - fsize = output.shape[2] - n_ch = 5 - dtype = torch.cuda.FloatTensor if xin.is_cuda else torch.FloatTensor - - output = output.view(batchsize, self.n_anchors, n_ch, fsize, fsize) - output = output.permute(0, 1, 3, 4, 2) # .contiguous() - - # logistic activation for xy, obj, cls - output[..., np.r_[:2, 4:n_ch]] = torch.sigmoid( - output[..., np.r_[:2, 4:n_ch]]) - - # Suppresses incorrect UserWarning about a non-writeable Numpy array - # PR with fix accepted shortly after torch 1.7.1 release - # https://github.com/pytorch/pytorch/pull/47271 - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - # calculate pred - xywh obj cls - x_shift = dtype(np.broadcast_to( - np.arange(fsize, dtype=np.float32), output.shape[:4])) - y_shift = dtype(np.broadcast_to( - np.arange(fsize, dtype=np.float32).reshape(fsize, 1), output.shape[:4])) - - masked_anchors = np.array(self.masked_anchors) - - w_anchors = dtype(np.broadcast_to(np.reshape( - masked_anchors[:, 0], (1, self.n_anchors, 1, 1)), output.shape[:4])) - h_anchors = dtype(np.broadcast_to(np.reshape( - masked_anchors[:, 1], (1, self.n_anchors, 1, 1)), output.shape[:4])) - - pred = output.clone() - pred[..., 0] += x_shift - pred[..., 1] += y_shift - pred[..., 2] = torch.exp(pred[..., 2]) * w_anchors - pred[..., 3] = torch.exp(pred[..., 3]) * h_anchors - - if compound_labels is None: # not training - pred[..., :4] *= self.stride - return pred.reshape(batchsize, -1, n_ch).data - - pred = pred[..., :4].data - - # target assignment - - tgt_mask = torch.zeros(batchsize, self.n_anchors, - fsize, fsize, 4).type(dtype) - obj_mask = torch.ones(batchsize, self.n_anchors, - fsize, fsize).type(dtype) - tgt_scale = torch.zeros(batchsize, self.n_anchors, - fsize, fsize, 2).type(dtype) - - target = torch.zeros(batchsize, self.n_anchors, - fsize, fsize, n_ch).type(dtype) - - labels, imgs = compound_labels - imgs = imgs.data.cpu().numpy() - labels = labels.cpu().data - nlabel = (labels.sum(dim=2) > 0).sum(dim=1) # number of objects - - truth_x_all = labels[:, :, 1] * fsize - truth_y_all = labels[:, :, 2] * fsize - truth_w_all = labels[:, :, 3] * fsize - truth_h_all = labels[:, :, 4] * fsize - truth_i_all = truth_x_all.to(torch.int16).numpy() - truth_j_all = truth_y_all.to(torch.int16).numpy() - - for b in range(batchsize): - n = int(nlabel[b]) - if n == 0: - continue - img = imgs[b].transpose((1,2,0))[:,:,::-1] - truth_box = dtype(np.zeros((n, 4))) - truth_box[:n, 2] = truth_w_all[b, :n] - truth_box[:n, 3] = truth_h_all[b, :n] - truth_i = truth_i_all[b, :n] - truth_j = truth_j_all[b, :n] - - # calculate iou between truth and reference anchors - anchor_ious_all = bboxes_iou(truth_box.cpu(), self.ref_anchors) - best_n_all = np.argmax(anchor_ious_all, axis=1) - - truth_box[:n, 0] = truth_x_all[b, :n] - truth_box[:n, 1] = truth_y_all[b, :n] - - pred_ious = bboxes_iou( - pred[b].view(-1, 4), truth_box, xyxy=False) - pred_best_iou, pred_best_iou_index = pred_ious.max(dim=1) - pred_best_iou = pred_best_iou.view(pred[b].shape[:3]) - not_obj_mask = (pred_best_iou<0.3) - - - is_obj_mask = (pred_best_iou>0.7) - pred_best_iou_index = pred_best_iou_index.view(pred[b].shape[:3]) - - obj_mask[b] = (not_obj_mask+is_obj_mask).type(dtype) - - # encourage bbox with over 0.7 IOU - rp_index = np.nonzero(is_obj_mask) - for rp_i in range(rp_index.size()[0]): - rp_anchor, rp_i, rp_j = rp_index[rp_i] - truth_box_index = int(pred_best_iou_index[rp_anchor, rp_i, rp_j]) - target[b,rp_anchor, rp_i, rp_j,4] = 1 - - # target label for the bbox - reference_label = int(labels[b, truth_box_index, 0]) - - self.classifier_model.eval() - - pred_x,pred_y,pred_w,pred_h = pred[b,rp_anchor, rp_i, rp_j,:4]*self.stride - x1 = int(min(max(pred_x-pred_w/2,0),img.shape[0]-1)) - y1 = int(min(max(pred_y-pred_h/2,0),img.shape[0]-1)) - x2 = int(min(max(pred_x+pred_w/2,0),img.shape[0]-1)) - y2 = int(min(max(pred_y+pred_h/2,0),img.shape[0]-1)) -# print(x1,y1,x2,y2) - if (x1+2 < x2) and (y1+2 0).sum(dim=1) - truth_x_all_sub = prior_labels[:, :, 1] * fsize - truth_y_all_sub = prior_labels[:, :, 2] * fsize - truth_i_all_sub = truth_x_all_sub.to(torch.int16).numpy() - truth_j_all_sub = truth_y_all_sub.to(torch.int16).numpy() - - # pred_mask = dtype(np.zeros((batchsize, self.n_anchors, fsize, fsize, n_ch))) - # for b in range(batchsize): - # for ti in range(nprior_label[b]): - # i,j = truth_i_all_sub[b,ti], truth_j_all_sub[b,ti] - # best_anchor = torch.argmax(pred[b,:,j,i,4]) - # i_best = min(max(int(pred[b,best_anchor,j,i,0].to(torch.int16).cpu().numpy()),0),fsize-1) - # j_best = min(max(int(pred[b,best_anchor,j,i,1].to(torch.int16).cpu().numpy()),0),fsize-1) - # # if labels is None: - # # pass - # # else: - # # pred_mask[b,:,j,i,:] = 1 - # pred_mask[b,:,j,i,:] = 1 - # pred_mask[b,best_anchor,j_best,i_best,:] = 1 - # pred *= pred_mask - - - if labels is None: # not training - pred[..., :4] *= self.stride - return pred.data -# return pred.view(batchsize, -1, n_ch).data - - pred = pred[..., :4].data - - # target assignment - tgt_mask = torch.zeros(batchsize, self.n_anchors, - fsize, fsize, n_ch).type(dtype) - in_grid_distance = torch.zeros(batchsize, 80 ,2).type(dtype) - -# tgt_mask = torch.zeros(batchsize, self.n_anchors, -# fsize, fsize, 4 + self.n_classes).type(dtype) -# # obj_mask = torch.ones(batchsize, self.n_anchors, -# # fsize, fsize).type(dtype) -# obj_mask = torch.zeros(batchsize, self.n_anchors, -# fsize, fsize).type(dtype) - tgt_scale = torch.zeros(batchsize, self.n_anchors, - fsize, fsize, 2).type(dtype) - - target = torch.zeros(batchsize, self.n_anchors, - fsize, fsize, n_ch).type(dtype) - - labels = labels.cpu().data - nlabel = (labels.sum(dim=2) > 0).sum(dim=1) # number of objects -# assert nprior_label == nlabel - - truth_x_all = labels[:, :, 1] * fsize - truth_y_all = labels[:, :, 2] * fsize - truth_w_all = labels[:, :, 3] * fsize - truth_h_all = labels[:, :, 4] * fsize -# truth_i_all = truth_x_all.to(torch.int16).numpy() -# truth_j_all = truth_y_all.to(torch.int16).numpy() - -# pred_areas = torch.zeros(batchsize).type(dtype) -# target_areas = torch.zeros(batchsize).type(dtype) - for b in range(batchsize): - n = int(nlabel[b]) - if n == 0: - continue - truth_box = dtype(np.zeros((n, 4))) - truth_box[:n, 2] = truth_w_all[b, :n] - truth_box[:n, 3] = truth_h_all[b, :n] - truth_i = truth_i_all_sub[b, :n] - truth_j = truth_j_all_sub[b, :n] - - # calculate iou between truth and reference anchors - anchor_ious_all = bboxes_iou(truth_box, (self.ref_anchors).type(dtype)) - best_n_all = torch.argmax(anchor_ious_all, dim=1) - - truth_box[:n, 0] = truth_x_all[b, :n] - truth_box[:n, 1] = truth_y_all[b, :n] - -# pred_ious = bboxes_iou( -# pred[b].view(-1, 4), truth_box, xyxy=False) -# pred_best_iou, _ = pred_ious.max(dim=1) -# pred_best_iou = (pred_best_iou > self.ignore_thre) -# pred_best_iou = pred_best_iou.view(pred[b].shape[:3]) -# # set mask to zero (ignore) if pred matches truth -# obj_mask[b] = 1- pred_best_iou - -# if sum(best_n_mask) == 0: -# continue - - for ti in range(n): - i, j = truth_i[ti], truth_j[ti] - - # find box with iou over 0.7 and under 0.3 (achor point) - current_truth_box = truth_box[ti:ti+1] - current_pred_boxes = pred[b,:,j,i,:4] - pred_ious = bboxes_iou(current_truth_box, current_pred_boxes, xyxy=False) - good_anchor_index = torch.nonzero((pred_ious>0.7)[0]).cpu().numpy() - bad_anchor_index = torch.nonzero((pred_ious<0.3)[0]).cpu().numpy() -# print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) - for good_i in range(len(good_anchor_index)): - a = good_anchor_index[good_i] - tgt_mask[b,a,j,i,:] = 1 - target[b, a, j, i, 0] = torch.clamp((truth_x_all[b, ti]-i)/torch.Tensor(self.masked_anchors)[a, 0]+0.5,0,1) - target[b, a, j, i, 1] = torch.clamp((truth_y_all[b, ti]-j)/torch.Tensor(self.masked_anchors)[a, 1]+0.5,0,1) - target[b, a, j, i, 2] = torch.log( - truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16) - target[b, a, j, i, 3] = torch.log( - truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16) - target[b, a, j, i, 4] = 1 - target[b, a, j, i, 5 + labels[b, ti, - 0].to(torch.int16).numpy()] = 1 - tgt_scale[b, a, j, i, :] = torch.sqrt( - 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize) - - i_best = min(max(int(pred[b,a,j,i,0].cpu().numpy()),0),fsize-1) - j_best = min(max(int(pred[b,a,j,i,1].cpu().numpy()),0),fsize-1) - current_pred_boxes_2 = pred[b,:,j_best,i_best,:4] - pred_ious_2 = bboxes_iou(current_truth_box, current_pred_boxes_2, xyxy=False) - good_anchor_index_2 = torch.nonzero((pred_ious_2>0.7)[0]).cpu().numpy() - bad_anchor_index_2 = torch.nonzero((pred_ious_2<0.3)[0]).cpu().numpy() - # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) - for good_i_2 in range(len(good_anchor_index_2)): - a = good_anchor_index_2[good_i_2] - tgt_mask[b,a,j_best,i_best,:] = 1 - target[b, a, j_best, i_best, 0] = torch.clamp((truth_x_all[b, ti]-i_best)/torch.Tensor(self.masked_anchors)[a, 0]+0.5,0,1) - target[b, a, j_best, i_best, 1] = torch.clamp((truth_y_all[b, ti]-j_best)/torch.Tensor(self.masked_anchors)[a, 1]+0.5,0,1) - target[b, a, j_best, i_best, 2] = torch.log( - truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16) - target[b, a, j_best, i_best, 3] = torch.log( - truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16) - target[b, a, j_best, i_best, 4] = 1 - target[b, a, j_best, i_best, 5 + labels[b, ti, - 0].to(torch.int16).numpy()] = 1 - tgt_scale[b, a, j_best, i_best, :] = torch.sqrt( - 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize) - - for bad_i_2 in range(len(bad_anchor_index_2)): - a = bad_anchor_index_2[bad_i_2] - tgt_mask[b,a,j_best,i_best,4:] = 1 - - - - for bad_i in range(len(bad_anchor_index)): - a = bad_anchor_index[bad_i] - tgt_mask[b,a,j,i,4:] = 1 - - # best anchor box - a = best_n_all[ti] - tgt_mask[b,a,j,i,:] = 1 - target[b, a, j, i, 0] = torch.clamp((truth_x_all[b, ti]-i)/torch.Tensor(self.masked_anchors)[a, 0]+0.5,0,1) - target[b, a, j, i, 1] = torch.clamp((truth_y_all[b, ti]-j)/torch.Tensor(self.masked_anchors)[a, 1]+0.5,0,1) - target[b, a, j, i, 2] = torch.log( - truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16) - target[b, a, j, i, 3] = torch.log( - truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16) - target[b, a, j, i, 4] = 1 - target[b, a, j, i, 5 + labels[b, ti, - 0].to(torch.int16).numpy()] = 1 - tgt_scale[b, a, j, i, :] = torch.sqrt( - 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize) - - i_best = min(max(int(pred[b,a,j,i,0].cpu().numpy()),0),fsize-1) - j_best = min(max(int(pred[b,a,j,i,1].cpu().numpy()),0),fsize-1) - - # find box with iou over 0.7 and under 0.3 (predict center) - current_truth_box = truth_box[ti:ti+1] - current_pred_boxes = pred[b,:,j_best,i_best,:4] - pred_ious = bboxes_iou(current_truth_box, current_pred_boxes, xyxy=False) - good_anchor_index = torch.nonzero((pred_ious>0.7)[0]).cpu().numpy() - bad_anchor_index = torch.nonzero((pred_ious<0.3)[0]).cpu().numpy() -# print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) - for good_i in range(len(good_anchor_index)): - a = good_anchor_index[good_i] - tgt_mask[b,a,j_best,i_best,:] = 1 - target[b, a, j_best, i_best, 0] = torch.clamp((truth_x_all[b, ti]-i_best)/torch.Tensor(self.masked_anchors)[a, 0]+0.5,0,1) - target[b, a, j_best, i_best, 1] = torch.clamp((truth_y_all[b, ti]-j_best)/torch.Tensor(self.masked_anchors)[a, 1]+0.5,0,1) - target[b, a, j_best, i_best, 2] = torch.log( - truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16) - target[b, a, j_best, i_best, 3] = torch.log( - truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16) - target[b, a, j_best, i_best, 4] = 1 - target[b, a, j_best, i_best, 5 + labels[b, ti, - 0].to(torch.int16).numpy()] = 1 - tgt_scale[b, a, j_best, i_best, :] = torch.sqrt( - 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize) - - for bad_i in range(len(bad_anchor_index)): - a = bad_anchor_index[bad_i] - tgt_mask[b,a,j_best,i_best,4:] = 1 - - - a = best_n_all[ti] - tgt_mask[b,a,j_best,i_best,:] = 1 - target[b, a, j_best, i_best, 0] = torch.clamp((truth_x_all[b, ti]-i_best)/torch.Tensor(self.masked_anchors)[a, 0]+0.5,0,1) - target[b, a, j_best, i_best, 1] = torch.clamp((truth_y_all[b, ti]-j_best)/torch.Tensor(self.masked_anchors)[a, 1]+0.5,0,1) - target[b, a, j_best, i_best, 2] = torch.log( - truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16) - target[b, a, j_best, i_best, 3] = torch.log( - truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16) - target[b, a, j_best, i_best, 4] = 1 - target[b, a, j_best, i_best, 5 + labels[b, ti, - 0].to(torch.int16).numpy()] = 1 - tgt_scale[b, a, j_best, i_best, :] = torch.sqrt( - 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize) - -# in_grid_distance[b,ti,0] += target[b, a, j_best, i_best, 0] -# in_grid_distance[b,ti,1] += target[b, a, j_best, i_best, 1] - - - # loss calculation - - output *= tgt_mask - target *= tgt_mask - target_in_grid_distance = torch.zeros(batchsize, 80 ,2).type(dtype) - -# output[..., 4] *= obj_mask -# output[..., np.r_[0:4, 5:n_ch]] *= tgt_mask - output[..., 2:4] *= tgt_scale - -# target[..., 4] *= obj_mask -# target[..., np.r_[0:4, 5:n_ch]] *= tgt_mask - target[..., 2:4] *= tgt_scale - - bceloss = nn.BCELoss(weight=tgt_scale*tgt_scale, - reduction='sum') # weighted BCEloss - loss_xy = bceloss(output[..., :2], target[..., :2]) - loss_wh = self.l2_loss(output[..., 2:4], target[..., 2:4]) / 2 - loss_obj = self.bce_loss(output[..., 4], target[..., 4]) - loss_cls = self.bce_loss(output[..., 5:], target[..., 5:]) - loss_l2 = self.l2_loss(output, target) - loss_in_grid = self.bce_loss(in_grid_distance, target_in_grid_distance) - -# target_areas = torch.ones(batchsize).type(dtype) -# loss_area = 0.1*self.l2_loss(pred_areas,target_areas) - - loss = loss_xy + loss_wh + loss_obj + loss_cls + 0.01*loss_in_grid - - return loss, loss_xy, loss_wh, loss_obj, loss_cls, loss_in_grid, loss_l2 - diff --git a/openpmcvl/granular/process/subfigure_ocr/models/yolov3.py b/openpmcvl/granular/process/subfigure_ocr/models/yolov3.py deleted file mode 100644 index 6ce14c8..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/models/yolov3.py +++ /dev/null @@ -1,299 +0,0 @@ -import torch -import torch.nn as nn - -from collections import defaultdict -from .yolo_layer import YOLOLayer, YOLOimgLayer - -def add_conv(in_ch, out_ch, ksize, stride): - """ - Add a conv2d / batchnorm / leaky ReLU block. - Args: - in_ch (int): number of input channels of the convolution layer. - out_ch (int): number of output channels of the convolution layer. - ksize (int): kernel size of the convolution layer. - stride (int): stride of the convolution layer. - Returns: - stage (Sequential) : Sequential layers composing a convolution block. - """ - stage = nn.Sequential() - pad = (ksize - 1) // 2 - stage.add_module('conv', nn.Conv2d(in_channels=in_ch, - out_channels=out_ch, kernel_size=ksize, stride=stride, - padding=pad, bias=False)) - stage.add_module('batch_norm', nn.BatchNorm2d(out_ch)) - stage.add_module('leaky', nn.LeakyReLU(0.1)) - return stage - - -class resblock(nn.Module): - """ - Sequential residual blocks each of which consists of \ - two convolution layers. - Args: - ch (int): number of input and output channels. - nblocks (int): number of residual blocks. - shortcut (bool): if True, residual tensor addition is enabled. - """ - def __init__(self, ch, nblocks=1, shortcut=True): - - super().__init__() - self.shortcut = shortcut - self.module_list = nn.ModuleList() - for i in range(nblocks): - resblock_one = nn.ModuleList() - resblock_one.append(add_conv(ch, ch//2, 1, 1)) - resblock_one.append(add_conv(ch//2, ch, 3, 1)) - self.module_list.append(resblock_one) - - def forward(self, x): - for module in self.module_list: - h = x - for res in module: - h = res(h) - x = x + h if self.shortcut else h - return x - -def create_yolov3_modules(config_model, ignore_thre): - """ - Build yolov3 layer modules. - Args: - config_model (dict): model configuration. - See YOLOLayer class for details. - ignore_thre (float): used in YOLOLayer. - Returns: - mlist (ModuleList): YOLOv3 module list. - """ - - # DarkNet53 - mlist = nn.ModuleList() - mlist.append(add_conv(in_ch=3, out_ch=32, ksize=3, stride=1)) - mlist.append(add_conv(in_ch=32, out_ch=64, ksize=3, stride=2)) - mlist.append(resblock(ch=64)) - mlist.append(add_conv(in_ch=64, out_ch=128, ksize=3, stride=2)) - mlist.append(resblock(ch=128, nblocks=2)) - mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=2)) - mlist.append(resblock(ch=256, nblocks=8)) # shortcut 1 from here - mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=2)) - mlist.append(resblock(ch=512, nblocks=8)) # shortcut 2 from here - mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=2)) - mlist.append(resblock(ch=1024, nblocks=4)) - - # YOLOv3 - mlist.append(resblock(ch=1024, nblocks=2, shortcut=False)) - mlist.append(add_conv(in_ch=1024, out_ch=512, ksize=1, stride=1)) - # 1st yolo branch - mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=1)) - mlist.append( - YOLOLayer(config_model, layer_no=0, in_ch=1024, ignore_thre=ignore_thre)) - - mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) - mlist.append(nn.Upsample(scale_factor=2, mode='nearest')) - mlist.append(add_conv(in_ch=768, out_ch=256, ksize=1, stride=1)) - mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) - mlist.append(resblock(ch=512, nblocks=1, shortcut=False)) - mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) - # 2nd yolo branch - mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) - mlist.append( - YOLOLayer(config_model, layer_no=1, in_ch=512, ignore_thre=ignore_thre)) - - mlist.append(add_conv(in_ch=256, out_ch=128, ksize=1, stride=1)) - mlist.append(nn.Upsample(scale_factor=2, mode='nearest')) - mlist.append(add_conv(in_ch=384, out_ch=128, ksize=1, stride=1)) - mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=1)) - mlist.append(resblock(ch=256, nblocks=2, shortcut=False)) - mlist.append( - YOLOLayer(config_model, layer_no=2, in_ch=256, ignore_thre=ignore_thre)) - - return mlist - -class YOLOv3(nn.Module): - """ - YOLOv3 model module. The module list is defined by create_yolov3_modules function. \ - The network returns loss values from three YOLO layers during training \ - and detection results during test. - """ - def __init__(self, config_model, ignore_thre=0.7): - """ - Initialization of YOLOv3 class. - Args: - config_model (dict): used in YOLOLayer. - ignore_thre (float): used in YOLOLayer. - """ - super(YOLOv3, self).__init__() - - if config_model['TYPE'] == 'YOLOv3': - self.module_list = create_yolov3_modules(config_model, ignore_thre) - else: - raise Exception('Model name {} is not available'.format(config_model['TYPE'])) - - def forward(self, x, targets=None): - """ - Forward path of YOLOv3. - Args: - x (torch.Tensor) : input data whose shape is :math:`(N, C, H, W)`, \ - where N, C are batchsize and num. of channels. - targets (torch.Tensor) : label array whose shape is :math:`(N, 50, 5)` - - Returns: - training: - output (torch.Tensor): loss tensor for backpropagation. - test: - output (torch.Tensor): concatenated detection results. - """ - train = targets is not None - output = [] - self.loss_dict = defaultdict(float) - route_layers = [] - for i, module in enumerate(self.module_list): - # yolo layers - if i in [14, 22, 28]: - if train: - x, *loss_dict = module(x, targets) - for name, loss in zip(['xy', 'wh', 'conf', 'cls', 'l2'] , loss_dict): - self.loss_dict[name] += loss - else: - x = module(x) - output.append(x) - else: - x = module(x) - - # route layers - if i in [6, 8, 12, 20]: - route_layers.append(x) - if i == 14: - x = route_layers[2] - if i == 22: # yolo 2nd - x = route_layers[3] - if i == 16: - x = torch.cat((x, route_layers[1]), 1) - if i == 24: - x = torch.cat((x, route_layers[0]), 1) - if train: - return sum(output) - else: - return torch.cat(output, 1) - - -def create_yolov3img_modules(config_model, ignore_thre): - """ - Build yolov3 layer modules. - Args: - config_model (dict): model configuration. - See YOLOLayer class for details. - ignore_thre (float): used in YOLOLayer. - Returns: - mlist (ModuleList): YOLOv3 module list. - """ - - # DarkNet53 - mlist = nn.ModuleList() - mlist.append(add_conv(in_ch=4, out_ch=32, ksize=3, stride=1)) - mlist.append(add_conv(in_ch=32, out_ch=64, ksize=3, stride=2)) - mlist.append(resblock(ch=64)) - mlist.append(add_conv(in_ch=64, out_ch=128, ksize=3, stride=2)) - mlist.append(resblock(ch=128, nblocks=2)) - mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=2)) - mlist.append(resblock(ch=256, nblocks=8)) # shortcut 1 from here - mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=2)) - mlist.append(resblock(ch=512, nblocks=8)) # shortcut 2 from here - mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=2)) - mlist.append(resblock(ch=1024, nblocks=4)) - - # YOLOv3 - mlist.append(resblock(ch=1024, nblocks=2, shortcut=False)) - mlist.append(add_conv(in_ch=1024, out_ch=512, ksize=1, stride=1)) - # 1st yolo branch - mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=1)) - mlist.append( - YOLOimgLayer(config_model, layer_no=0, in_ch=1024, ignore_thre=ignore_thre)) - - mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) - mlist.append(nn.Upsample(scale_factor=2, mode='nearest')) - mlist.append(add_conv(in_ch=768, out_ch=256, ksize=1, stride=1)) - mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) - mlist.append(resblock(ch=512, nblocks=1, shortcut=False)) - mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) - # 2nd yolo branch - mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) - mlist.append( - YOLOimgLayer(config_model, layer_no=1, in_ch=512, ignore_thre=ignore_thre)) - - mlist.append(add_conv(in_ch=256, out_ch=128, ksize=1, stride=1)) - mlist.append(nn.Upsample(scale_factor=2, mode='nearest')) - mlist.append(add_conv(in_ch=384, out_ch=128, ksize=1, stride=1)) - mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=1)) - mlist.append(resblock(ch=256, nblocks=2, shortcut=False)) - mlist.append( - YOLOimgLayer(config_model, layer_no=2, in_ch=256, ignore_thre=ignore_thre)) - - return mlist - - -class YOLOv3img(nn.Module): - """ - YOLOv3 model module. The module list is defined by create_yolov3img_modules function. \ - The network returns loss values from three YOLO layers during training \ - and detection results during test. - """ - def __init__(self, config_model, ignore_thre=0.7): - """ - Initialization of YOLOv3 class. - Args: - config_model (dict): used in YOLOLayer. - ignore_thre (float): used in YOLOLayer. - """ - super(YOLOv3img, self).__init__() - - if config_model['TYPE'] == 'YOLOv3': - self.module_list = create_yolov3img_modules(config_model, ignore_thre) - else: - raise Exception('Model name {} is not available'.format(config_model['TYPE'])) - - def forward(self, x, targets=None): - """ - Forward path of YOLOv3. - Args: - x (torch.Tensor) : input data whose shape is :math:`(N, C, H, W)`, \ - where N, C are batchsize and num. of channels. - targets (torch.Tensor) : label array whose shape is :math:`(N, 50, 5)` - - Returns: - training: - output (torch.Tensor): loss tensor for backpropagation. - test: - output (torch.Tensor): concatenated detection results. - """ - train = (targets[0] is not None) - output = [] - self.loss_dict = defaultdict(float) - route_layers = [] - for i, module in enumerate(self.module_list): - # yolo layers - if i in [14, 22, 28]: - if train: - x, *loss_dict = module(x, targets) - for name, loss in zip(['xy', 'wh', 'conf', 'cls', "in_grid", 'l2'] , loss_dict): - self.loss_dict[name] += loss - else: - x = module(x,targets) - output.append(x) - else: - x = module(x) - - # route layers - if i in [6, 8, 12, 20]: - route_layers.append(x) - if i == 14: - x = route_layers[2] - if i == 22: # yolo 2nd - x = route_layers[3] - if i == 16: - x = torch.cat((x, route_layers[1]), 1) - if i == 24: - x = torch.cat((x, route_layers[0]), 1) - if train: - return sum(output) - else: - return output -# return torch.cat(output, 1) \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/__init__.py b/openpmcvl/granular/process/subfigure_ocr/scale/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/coco_eval.py b/openpmcvl/granular/process/subfigure_ocr/scale/coco_eval.py deleted file mode 100644 index 6dd0a05..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/coco_eval.py +++ /dev/null @@ -1,381 +0,0 @@ -## Acquired from https://github.com/pytorch/vision/tree/master/references/detection -import json -import tempfile - -import numpy as np -import copy -import time -import torch -import torch._six - -from pycocotools.cocoeval import COCOeval -from pycocotools.coco import COCO -import pycocotools.mask as mask_util - -from collections import defaultdict - -from . import utils -import pathlib - - -class CocoEvaluator(object): - def __init__(self, coco_gt, iou_types): - assert isinstance(iou_types, (list, tuple)) - coco_gt = copy.deepcopy(coco_gt) - self.coco_gt = coco_gt - - self.iou_types = iou_types - self.coco_eval = {} - for iou_type in iou_types: - self.coco_eval[iou_type] = COCOeval(coco_gt, iouType=iou_type) - - self.img_ids = [] - self.eval_imgs = {k: [] for k in iou_types} - - def update(self, predictions): - img_ids = list(np.unique(list(predictions.keys()))) - self.img_ids.extend(img_ids) - - for iou_type in self.iou_types: - results = self.prepare(predictions, iou_type) - coco_dt = loadRes(self.coco_gt, results) if results else COCO() - coco_eval = self.coco_eval[iou_type] - - coco_eval.cocoDt = coco_dt - coco_eval.params.imgIds = list(img_ids) - img_ids, eval_imgs = evaluate(coco_eval) - - self.eval_imgs[iou_type].append(eval_imgs) - - def synchronize_between_processes(self): - for iou_type in self.iou_types: - self.eval_imgs[iou_type] = np.concatenate(self.eval_imgs[iou_type], 2) - create_common_coco_eval(self.coco_eval[iou_type], self.img_ids, self.eval_imgs[iou_type]) - - def accumulate(self): - for coco_eval in self.coco_eval.values(): - coco_eval.accumulate() - - def summarize(self, model_name="unnamed_model", nms=False): - current_file = pathlib.Path(__file__).resolve(strict=True) - if nms: - model_name = model_name + "-nms" - save_file = current_file.parent / 'results' / '{}.txt'.format(model_name) - for iou_type, coco_eval in self.coco_eval.items(): - with open(save_file, "a") as f: - f.write("IoU metric: {}\n".format(iou_type)) - coco_eval.summarize() - f.write(self.prepare_summary(coco_eval)) - return coco_eval.stats - - def prepare_summary(self, coco_eval): - summary = ("Average Precision (AP) @[ IoU=0.50:0.95 | area= all | " - "maxDets=100 ] = {}\n" - "Average Precision (AP) @[ IoU=0.50 | area= all | " - "maxDets=100 ] = {}\n" - "Average Precision (AP) @[ IoU=0.75 | area= all | " - "maxDets=100 ] = {}\n" - "Average Precision (AP) @[ IoU=0.50:0.95 | area= small | " - "maxDets=100 ] = {}\n" - "Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | " - "maxDets=100 ] = {}\n" - "Average Precision (AP) @[ IoU=0.50:0.95 | area= large | " - "maxDets=100 ] = {}\n" - "Average Recall (AR) @[ IoU=0.50:0.95 | area= all | " - "maxDets= 1 ] = {}\n" - "Average Recall (AR) @[ IoU=0.50:0.95 | area= all | " - "maxDets= 10 ] = {}\n" - "Average Recall (AR) @[ IoU=0.50:0.95 | area= all | " - "maxDets=100 ] = {}\n" - "Average Recall (AR) @[ IoU=0.50:0.95 | area= small | " - "maxDets=100 ] = {}\n" - "Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | " - "maxDets=100 ] = {}\n" - "Average Recall (AR) @[ IoU=0.50:0.95 | area= large | " - "maxDets=100 ] = {}\n".format(*coco_eval.stats.tolist())) - return summary - - def prepare(self, predictions, iou_type): - if iou_type == "bbox": - return self.prepare_for_coco_detection(predictions) - elif iou_type == "segm": - return self.prepare_for_coco_segmentation(predictions) - elif iou_type == "keypoints": - return self.prepare_for_coco_keypoint(predictions) - else: - raise ValueError("Unknown iou type {}".format(iou_type)) - - def prepare_for_coco_detection(self, predictions): - coco_results = [] - for original_id, prediction in predictions.items(): - if len(prediction) == 0: - continue - - boxes = prediction["boxes"] - boxes = convert_to_xywh(boxes).tolist() - scores = prediction["scores"].tolist() - labels = prediction["labels"].tolist() - - coco_results.extend( - [ - { - "image_id": original_id, - "category_id": labels[k], - "bbox": box, - "score": scores[k], - } - for k, box in enumerate(boxes) - ] - ) - return coco_results - - def prepare_for_coco_segmentation(self, predictions): - coco_results = [] - for original_id, prediction in predictions.items(): - if len(prediction) == 0: - continue - - scores = prediction["scores"] - labels = prediction["labels"] - masks = prediction["masks"] - - masks = masks > 0.5 - - scores = prediction["scores"].tolist() - labels = prediction["labels"].tolist() - - rles = [ - mask_util.encode(np.array(mask[0, :, :, np.newaxis], dtype=np.uint8, order="F"))[0] - for mask in masks - ] - for rle in rles: - rle["counts"] = rle["counts"].decode("utf-8") - - coco_results.extend( - [ - { - "image_id": original_id, - "category_id": labels[k], - "segmentation": rle, - "score": scores[k], - } - for k, rle in enumerate(rles) - ] - ) - return coco_results - - def prepare_for_coco_keypoint(self, predictions): - coco_results = [] - for original_id, prediction in predictions.items(): - if len(prediction) == 0: - continue - - boxes = prediction["boxes"] - boxes = convert_to_xywh(boxes).tolist() - scores = prediction["scores"].tolist() - labels = prediction["labels"].tolist() - keypoints = prediction["keypoints"] - keypoints = keypoints.flatten(start_dim=1).tolist() - - coco_results.extend( - [ - { - "image_id": original_id, - "category_id": labels[k], - 'keypoints': keypoint, - "score": scores[k], - } - for k, keypoint in enumerate(keypoints) - ] - ) - return coco_results - - -def convert_to_xywh(boxes): - xmin, ymin, xmax, ymax = boxes.unbind(1) - return torch.stack((xmin, ymin, xmax - xmin, ymax - ymin), dim=1) - - -def merge(img_ids, eval_imgs): - all_img_ids = utils.all_gather(img_ids) - all_eval_imgs = utils.all_gather(eval_imgs) - - merged_img_ids = [] - for p in all_img_ids: - merged_img_ids.extend(p) - - merged_eval_imgs = [] - for p in all_eval_imgs: - merged_eval_imgs.append(p) - - merged_img_ids = np.array(merged_img_ids) - merged_eval_imgs = np.concatenate(merged_eval_imgs, 2) - - # keep only unique (and in sorted order) images - merged_img_ids, idx = np.unique(merged_img_ids, return_index=True) - merged_eval_imgs = merged_eval_imgs[..., idx] - - return merged_img_ids, merged_eval_imgs - - -def create_common_coco_eval(coco_eval, img_ids, eval_imgs): - img_ids, eval_imgs = merge(img_ids, eval_imgs) - img_ids = list(img_ids) - eval_imgs = list(eval_imgs.flatten()) - - coco_eval.evalImgs = eval_imgs - coco_eval.params.imgIds = img_ids - coco_eval._paramsEval = copy.deepcopy(coco_eval.params) - - -################################################################# -# From pycocotools, just removed the prints and fixed -# a Python3 bug about unicode not defined -################################################################# - -# Ideally, pycocotools wouldn't have hard-coded prints -# so that we could avoid copy-pasting those two functions - -def createIndex(self): - # create index - # print('creating index...') - anns, cats, imgs = {}, {}, {} - imgToAnns, catToImgs = defaultdict(list), defaultdict(list) - if 'annotations' in self.dataset: - for ann in self.dataset['annotations']: - imgToAnns[ann['image_id']].append(ann) - anns[ann['id']] = ann - - if 'images' in self.dataset: - for img in self.dataset['images']: - imgs[img['id']] = img - - if 'categories' in self.dataset: - for cat in self.dataset['categories']: - cats[cat['id']] = cat - - if 'annotations' in self.dataset and 'categories' in self.dataset: - for ann in self.dataset['annotations']: - catToImgs[ann['category_id']].append(ann['image_id']) - - # print('index created!') - - # create class members - self.anns = anns - self.imgToAnns = imgToAnns - self.catToImgs = catToImgs - self.imgs = imgs - self.cats = cats - - -maskUtils = mask_util - - -def loadRes(self, resFile): - """ - Load result file and return a result api object. - :param resFile (str) : file name of result file - :return: res (obj) : result api object - """ - res = COCO() - res.dataset['images'] = [img for img in self.dataset['images']] - - # print('Loading and preparing results...') - # tic = time.time() - if isinstance(resFile, torch._six.string_classes): - anns = json.load(open(resFile)) - elif type(resFile) == np.ndarray: - anns = self.loadNumpyAnnotations(resFile) - else: - anns = resFile - assert type(anns) == list, 'results in not an array of objects' - annsImgIds = [ann['image_id'] for ann in anns] - assert set(annsImgIds) == (set(annsImgIds) & set(self.getImgIds())), \ - 'Results do not correspond to current coco set' - if 'caption' in anns[0]: - imgIds = set([img['id'] for img in res.dataset['images']]) & set([ann['image_id'] for ann in anns]) - res.dataset['images'] = [img for img in res.dataset['images'] if img['id'] in imgIds] - for id, ann in enumerate(anns): - ann['id'] = id + 1 - elif 'bbox' in anns[0] and not anns[0]['bbox'] == []: - res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) - for id, ann in enumerate(anns): - bb = ann['bbox'] - x1, x2, y1, y2 = [bb[0], bb[0] + bb[2], bb[1], bb[1] + bb[3]] - if 'segmentation' not in ann: - ann['segmentation'] = [[x1, y1, x1, y2, x2, y2, x2, y1]] - ann['area'] = bb[2] * bb[3] - ann['id'] = id + 1 - ann['iscrowd'] = 0 - elif 'segmentation' in anns[0]: - res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) - for id, ann in enumerate(anns): - # now only support compressed RLE format as segmentation results - ann['area'] = maskUtils.area(ann['segmentation']) - if 'bbox' not in ann: - ann['bbox'] = maskUtils.toBbox(ann['segmentation']) - ann['id'] = id + 1 - ann['iscrowd'] = 0 - elif 'keypoints' in anns[0]: - res.dataset['categories'] = copy.deepcopy(self.dataset['categories']) - for id, ann in enumerate(anns): - s = ann['keypoints'] - x = s[0::3] - y = s[1::3] - x1, x2, y1, y2 = np.min(x), np.max(x), np.min(y), np.max(y) - ann['area'] = (x2 - x1) * (y2 - y1) - ann['id'] = id + 1 - ann['bbox'] = [x1, y1, x2 - x1, y2 - y1] - # print('DONE (t={:0.2f}s)'.format(time.time()- tic)) - - res.dataset['annotations'] = anns - createIndex(res) - return res - - -def evaluate(self): - ''' - Run per image evaluation on given images and store results (a list of dict) in self.evalImgs - :return: None - ''' - # tic = time.time() - # print('Running per image evaluation...') - p = self.params - # add backward compatibility if useSegm is specified in params - if p.useSegm is not None: - p.iouType = 'segm' if p.useSegm == 1 else 'bbox' - print('useSegm (deprecated) is not None. Running {} evaluation'.format(p.iouType)) - # print('Evaluate annotation type *{}*'.format(p.iouType)) - p.imgIds = list(np.unique(p.imgIds)) - if p.useCats: - p.catIds = list(np.unique(p.catIds)) - p.maxDets = sorted(p.maxDets) - self.params = p - - self._prepare() - # loop through images, area range, max detection number - catIds = p.catIds if p.useCats else [-1] - - if p.iouType == 'segm' or p.iouType == 'bbox': - computeIoU = self.computeIoU - elif p.iouType == 'keypoints': - computeIoU = self.computeOks - self.ious = { - (imgId, catId): computeIoU(imgId, catId) - for imgId in p.imgIds - for catId in catIds} - - evaluateImg = self.evaluateImg - maxDet = p.maxDets[-1] - evalImgs = [ - evaluateImg(imgId, catId, areaRng, maxDet) - for catId in catIds - for areaRng in p.areaRng - for imgId in p.imgIds - ] - # this is NOT in the pycocotools code, but could be done outside - evalImgs = np.asarray(evalImgs).reshape(len(catIds), len(p.areaRng), len(p.imgIds)) - self._paramsEval = copy.deepcopy(self.params) - # toc = time.time() - # print('DONE (t={:0.2f}s).'.format(toc-tic)) - return p.imgIds, evalImgs diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/coco_utils.py b/openpmcvl/granular/process/subfigure_ocr/scale/coco_utils.py deleted file mode 100644 index d84aeab..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/coco_utils.py +++ /dev/null @@ -1,253 +0,0 @@ -## Acquired from https://github.com/pytorch/vision/tree/master/references/detection -import copy -import os -from PIL import Image - -import torch -import torch.utils.data -import torchvision - -from pycocotools import mask as coco_mask -from pycocotools.coco import COCO - -import torchvision.transforms as T - - -class FilterAndRemapCocoCategories(object): - def __init__(self, categories, remap=True): - self.categories = categories - self.remap = remap - - def __call__(self, image, target): - anno = target["annotations"] - anno = [obj for obj in anno if obj["category_id"] in self.categories] - if not self.remap: - target["annotations"] = anno - return image, target - anno = copy.deepcopy(anno) - for obj in anno: - obj["category_id"] = self.categories.index(obj["category_id"]) - target["annotations"] = anno - return image, target - - -def convert_coco_poly_to_mask(segmentations, height, width): - masks = [] - for polygons in segmentations: - rles = coco_mask.frPyObjects(polygons, height, width) - mask = coco_mask.decode(rles) - if len(mask.shape) < 3: - mask = mask[..., None] - mask = torch.as_tensor(mask, dtype=torch.uint8) - mask = mask.any(dim=2) - masks.append(mask) - if masks: - masks = torch.stack(masks, dim=0) - else: - masks = torch.zeros((0, height, width), dtype=torch.uint8) - return masks - - -class ConvertCocoPolysToMask(object): - def __call__(self, image, target): - w, h = image.size - - image_id = target["image_id"] - image_id = torch.tensor([image_id]) - - anno = target["annotations"] - - anno = [obj for obj in anno if obj['iscrowd'] == 0] - - boxes = [obj["bbox"] for obj in anno] - # guard against no boxes via resizing - boxes = torch.as_tensor(boxes, dtype=torch.float32).reshape(-1, 4) - boxes[:, 2:] += boxes[:, :2] - boxes[:, 0::2].clamp_(min=0, max=w) - boxes[:, 1::2].clamp_(min=0, max=h) - - classes = [obj["category_id"] for obj in anno] - classes = torch.tensor(classes, dtype=torch.int64) - - segmentations = [obj["segmentation"] for obj in anno] - masks = convert_coco_poly_to_mask(segmentations, h, w) - - keypoints = None - if anno and "keypoints" in anno[0]: - keypoints = [obj["keypoints"] for obj in anno] - keypoints = torch.as_tensor(keypoints, dtype=torch.float32) - num_keypoints = keypoints.shape[0] - if num_keypoints: - keypoints = keypoints.view(num_keypoints, -1, 3) - - keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0]) - boxes = boxes[keep] - classes = classes[keep] - masks = masks[keep] - if keypoints is not None: - keypoints = keypoints[keep] - - target = {} - target["boxes"] = boxes - target["labels"] = classes - target["masks"] = masks - target["image_id"] = image_id - if keypoints is not None: - target["keypoints"] = keypoints - - # for conversion to coco api - area = torch.tensor([obj["area"] for obj in anno]) - iscrowd = torch.tensor([obj["iscrowd"] for obj in anno]) - target["area"] = area - target["iscrowd"] = iscrowd - - return image, target - - -def _coco_remove_images_without_annotations(dataset, cat_list=None): - def _has_only_empty_bbox(anno): - return all(any(o <= 1 for o in obj["bbox"][2:]) for obj in anno) - - def _count_visible_keypoints(anno): - return sum(sum(1 for v in ann["keypoints"][2::3] if v > 0) for ann in anno) - - min_keypoints_per_image = 10 - - def _has_valid_annotation(anno): - # if it's empty, there is no annotation - if len(anno) == 0: - return False - # if all boxes have close to zero area, there is no annotation - if _has_only_empty_bbox(anno): - return False - # keypoints task have a slight different critera for considering - # if an annotation is valid - if "keypoints" not in anno[0]: - return True - # for keypoint detection tasks, only consider valid images those - # containing at least min_keypoints_per_image - if _count_visible_keypoints(anno) >= min_keypoints_per_image: - return True - return False - - assert isinstance(dataset, torchvision.datasets.CocoDetection) - ids = [] - for ds_idx, img_id in enumerate(dataset.ids): - ann_ids = dataset.coco.getAnnIds(imgIds=img_id, iscrowd=None) - anno = dataset.coco.loadAnns(ann_ids) - if cat_list: - anno = [obj for obj in anno if obj["category_id"] in cat_list] - if _has_valid_annotation(anno): - ids.append(ds_idx) - - dataset = torch.utils.data.Subset(dataset, ids) - return dataset - - -def convert_to_coco_api(ds): - coco_ds = COCO() - # annotation IDs need to start at 1, not 0, see torchvision issue #1530 - ann_id = 1 - dataset = {'images': [], 'categories': [], 'annotations': []} - categories = set() - for img_idx in range(len(ds)): - # find better way to get target - # targets = ds.get_annotations(img_idx) - img, targets = ds[img_idx] - image_id = targets["image_id"].item() - img_dict = {} - img_dict['id'] = image_id - img_dict['height'] = img.shape[-2] - img_dict['width'] = img.shape[-1] - dataset['images'].append(img_dict) - bboxes = targets["boxes"] - bboxes[:, 2:] -= bboxes[:, :2] - bboxes = bboxes.tolist() - labels = targets['labels'].tolist() - areas = targets['area'].tolist() - iscrowd = targets['iscrowd'].tolist() - if 'masks' in targets: - masks = targets['masks'] - # make masks Fortran contiguous for coco_mask - masks = masks.permute(0, 2, 1).contiguous().permute(0, 2, 1) - if 'keypoints' in targets: - keypoints = targets['keypoints'] - keypoints = keypoints.reshape(keypoints.shape[0], -1).tolist() - num_objs = len(bboxes) - for i in range(num_objs): - ann = {} - ann['image_id'] = image_id - ann['bbox'] = bboxes[i] - ann['category_id'] = labels[i] - categories.add(labels[i]) - ann['area'] = areas[i] - ann['iscrowd'] = iscrowd[i] - ann['id'] = ann_id - if 'masks' in targets: - ann["segmentation"] = coco_mask.encode(masks[i].numpy()) - if 'keypoints' in targets: - ann['keypoints'] = keypoints[i] - ann['num_keypoints'] = sum(k != 0 for k in keypoints[i][2::3]) - dataset['annotations'].append(ann) - ann_id += 1 - dataset['categories'] = [{'id': i} for i in sorted(categories)] - coco_ds.dataset = dataset - coco_ds.createIndex() - return coco_ds - - -def get_coco_api_from_dataset(dataset): - for _ in range(10): - if isinstance(dataset, torchvision.datasets.CocoDetection): - break - if isinstance(dataset, torch.utils.data.Subset): - dataset = dataset.dataset - if isinstance(dataset, torchvision.datasets.CocoDetection): - return dataset.coco - return convert_to_coco_api(dataset) - - -class CocoDetection(torchvision.datasets.CocoDetection): - def __init__(self, img_folder, ann_file, transforms): - super(CocoDetection, self).__init__(img_folder, ann_file) - self._transforms = transforms - - def __getitem__(self, idx): - img, target = super(CocoDetection, self).__getitem__(idx) - image_id = self.ids[idx] - target = dict(image_id=image_id, annotations=target) - if self._transforms is not None: - img, target = self._transforms(img, target) - return img, target - - -def get_coco(root, image_set, transforms, mode='instances'): - anno_file_template = "{}_{}2017.json" - PATHS = { - "train": ("train2017", os.path.join("annotations", anno_file_template.format(mode, "train"))), - "val": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val"))), - # "train": ("val2017", os.path.join("annotations", anno_file_template.format(mode, "val"))) - } - - t = [ConvertCocoPolysToMask()] - - if transforms is not None: - t.append(transforms) - transforms = T.Compose(t) - - img_folder, ann_file = PATHS[image_set] - img_folder = os.path.join(root, img_folder) - ann_file = os.path.join(root, ann_file) - - dataset = CocoDetection(img_folder, ann_file, transforms=transforms) - - if image_set == "train": - dataset = _coco_remove_images_without_annotations(dataset) - - # dataset = torch.utils.data.Subset(dataset, [i for i in range(500)]) - - return dataset - - -def get_coco_kp(root, image_set, transforms): - return get_coco(root, image_set, transforms, mode="person_keypoints") diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/corpus.txt b/openpmcvl/granular/process/subfigure_ocr/scale/corpus.txt deleted file mode 100644 index d40cb24..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/corpus.txt +++ /dev/null @@ -1,50000 +0,0 @@ - 495 CM -933 MM - 991 mm -472 mm - 218.0 nm -497.5 nm - 224 UM - 812 A - 178 cm -284 A - 232 nm -565 CM - 700 um -45 um - 534 um -955 NM -918 CM -934 MM -166 um -862 NM -441 mm -871 UM - 828 um - 839 MM - 141 mm - 133 CM -49 NM - 308 MM -363 um -884 mm - 466 MM - 470 CM - 974 A - 903 UM -546 nm -322 NM - 256 um - 191 cm -427 A - 324 CM - 254 CM - 884 A -122 NM -516 MM - 279 UM -158 UM -117 um - 489 MM -455.5 UM -484 UM -667 MM -24 NM -768 um -255.0 NM - 987 NM - 392 UM -644 UM - 97 cm - 536 CM -786 UM - 273 cm -533 nm -232 um - 407 A - 886.5 NM - 312 cm - 528 A - 73 UM - 497 MM -94 CM - 169 UM - 19 NM -799 MM - 465 CM -805 UM - 512.5 NM -584.5 UM -902 um - 485 A - 266 CM -259 UM - 465 MM - 151 UM -650.0 MM -532 A - 923 mm - 546 A - 20 CM -808 A -46 MM - 210 um -416 cm -1000 nm - 902 MM -623 MM -533 CM -184 A -912 nm -835.0 cm -766 A - 619 NM -80 A -209.5 CM - 110.0 A -828 A - 349 um -86 um - 860 um - 358.0 UM -151 nm - 1 mm - 806 CM - 395 NM -760 UM - 602 mm -418 nm -479 NM -7 um - 281 cm - 616 cm -856 A - 846 CM -463 A - 469 nm - 592 mm -392 UM -502 nm - 378 A - 877.0 UM - 491 um -943 NM -531 A -421 MM -705 cm - 618 MM - 622 CM - 603 NM -599 um -527 um -484 um - 318 A - 416 MM -221 CM - 830 mm - 292 MM - 11 mm - 14 MM - 899 CM -692 um -420.5 CM -770 mm -497 mm -518 cm -856 A - 78 MM -820 NM -537 mm -3 NM -42 um -714 MM - 368 UM -226 CM - 801 mm -298 mm -526 MM -149 nm - 356 nm - 72 um - 85.5 um -340 nm -870 CM - 375 nm - 140 CM -686 CM -422 cm - 858 nm -343 CM - 963 mm -304 mm -618 um -954 cm - 604 cm -14 mm -962 A - 309 A - 99 MM -309 um -700 cm - 633 A -155 UM -383 MM -608 mm - 876 CM -952 mm -291 CM - 457 CM - 294 MM -780 A - 121 nm - 191 um - 209 NM -547.0 MM - 316 cm - 302.0 nm - 202 cm -434 NM - 141 nm -69 cm -192 um -350 UM - 955 NM -798 um -111 NM -500 um - 758 A - 622 um - 922 mm - 854 NM -949 UM -157 UM - 73 UM -821 um -893 nm - 220 UM -708 cm -952 MM -309 mm - 322 nm - 692 cm - 656 nm - 611 cm - 712 UM -428 mm - 258 A - 71 UM - 650 um - 229 CM -812 nm - 818 cm - 126.0 nm -245 cm -21 UM - 573.5 A - 960 nm - 543 MM - 180 nm - 833 um -348 CM -849 um - 899 MM - 259 cm - 214 um -815.0 NM -556 um -474 NM -390 A -495.5 mm - 656 cm -248 UM -50 cm - 827 mm - 73 CM - 947 cm - 285 A - 531 cm -345 um -197 mm - 139 um -581 nm - 488 MM - 853 A -592 NM -518 nm - 218 MM - 642.0 CM -197 A - 151 CM - 25 CM -200 NM - 491 UM -433 mm - 854 MM - 766 NM -813 CM -963 cm -482 UM -418 mm -664 mm -412 um - 23 CM -932 um - 483 A - 864 A - 47 UM -207 CM - 566 UM -76 CM -148 cm -938 um -583 A - 976 cm - 881 cm -478 um -112 um - 789 NM -69.5 UM - 829 MM -297 A -79 um - 280 NM -319 um -997 CM -480 MM - 145 um - 531 um - 528 cm - 637 UM -325 cm -220 A - 744 mm - 166 um -781 CM - 842 NM -914 um - 358 CM -354 cm - 880.5 um -499 mm - 385 CM -498 CM -630 A -951 mm - 264 cm -996 MM -980 UM -994 MM - 623.5 um - 499 NM - 458 cm - 180 A - 280 mm -615 UM - 65 NM - 465 CM -716 A -861 um -477 NM - 625 MM - 562 UM - 842 UM -858 um - 271 UM -249 MM - 386 NM - 938 nm -770 UM -437 cm - 786 NM -463 NM - 130 um - 20 A -744 UM -473 nm - 729 mm -493 nm - 513 UM - 161 mm - 96 nm -421 MM - 46 cm -472 cm -857 CM - 233 nm -205 UM -578 MM - 950 cm - 362 um - 332 nm - 345 MM - 405 um - 929 UM - 285.0 cm -71 MM - 486 mm -308 A -176 A - 13 um -783 A -221 MM -756 um - 868 MM - 822 nm - 627 cm -375 cm -243 CM -735 MM - 258 CM -916 NM -983 cm - 317 MM - 571 CM - 134 mm - 249.5 um -280 A - 3 UM -114.0 mm - 85 UM - 696 mm - 839 MM - 652 NM - 505 mm - 42 um - 984 CM -586 nm - 704 NM - 197.5 CM - 271.0 um - 864.0 cm - 147 um - 738 nm -354 cm -506 A - 567 CM - 612 MM - 379 UM -664 um -492 A - 16 UM -673 mm -818 um -359 mm -645 CM - 698 um -272 um -341 um - 991 cm -814 UM - 600 UM -839 A - 961 CM -670 NM - 941 MM - 571 NM -757 MM - 551 CM - 752 um -122 UM - 620 um - 804 MM - 84 A - 791 cm - 600 NM -61 mm -306 NM -101 nm -815 nm -892 cm -513 UM - 425 NM -9 nm - 436 cm -957.0 CM -65 UM - 681 MM -257 um -105 CM -77 cm -435 CM -177 mm -92 nm - 73 mm -794.5 cm - 590 MM -511 nm -173 A -177.0 nm -952 cm - 724 MM - 786 nm - 33 nm - 731 mm -897 cm -913 um -750 um -486 A - 253 UM -318 UM -58.0 nm - 187 UM -736 nm - 169 A - 39 nm - 575.0 UM -135 cm - 634 CM - 162 nm - 891 MM -88 nm - 918.0 NM - 193 UM -930 UM - 396 MM -440 mm -930 MM - 297 cm -614 NM - 673 mm - 908 CM - 33 um - 249 CM - 899 nm - 150 MM -373 MM -427 nm -923 um - 375 CM - 628 UM - 249 NM - 670.0 cm - 584.5 nm -504 UM -699 CM -685 cm -595 nm -760 MM -125 um - 860.0 CM - 441 MM -8 A -922 nm - 955 CM - 951 nm - 935 A - 873 UM - 883 um -333 UM - 128 CM -271 nm - 413 CM -489 um -682 cm -903 MM -350 CM -781 A - 119 um -805 mm - 333 MM - 428 um - 95 MM - 975 UM -255 mm -729 nm - 970 CM -688 A - 655 nm -611 A -372 nm -253 mm -175 nm - 486 nm -507 NM - 776 nm -228 CM -61 mm -346 MM -839 NM -877 mm -738 MM - 130 um - 586 nm - 390 A -423 nm - 220 um - 574 nm -102 nm - 360.0 um - 544 um -220 cm - 461 CM - 368 um -838 CM -854 um -86 nm - 23 MM -859 CM -788 um -710 mm -721 mm - 60 NM -365 UM -175 um -714 A -50 CM - 176.5 A -857 CM - 607 nm - 545 mm - 20 UM -310 nm -741 NM - 296 mm -682 cm -986 mm - 496 A - 805 mm - 630 MM -663 nm -740 UM - 145 MM -929 MM -862 MM - 298 nm -230.0 UM - 850 um -112 NM -734 UM -160 mm - 86.5 um - 453 cm - 237 UM -884 MM -157 UM - 698 um -181 NM -677 UM -844.0 UM -687 A -27 cm - 439 NM - 309 mm -389 um -838 NM - 179 A - 719 MM - 696 UM -802 MM - 186 MM - 393 MM -998.0 mm -782 UM - 383 UM - 68 mm -227 cm - 912 A -603 cm - 952 cm -841.0 A -529 um - 312 cm - 115 MM -706 um -331 A - 660 UM -626.5 um - 839.0 cm -197 mm - 824 nm - 50 UM -639 UM - 706 nm -917 NM - 11 MM - 394 cm -105 CM - 191 NM - 383 CM - 737 A -672 NM -985 MM -554 UM - 123 NM - 199.0 NM - 637 MM -64 um - 556 nm -798.5 cm - 908 NM -381 NM - 809 MM -705 cm - 660 nm - 224 cm -61 CM -889 cm -496 nm - 450 MM - 803 CM -8 MM -597 CM -693 UM -984 um -768 UM - 534 cm - 786 MM - 761.0 cm -856.0 NM - 914 MM -364 UM -290 cm - 885 CM -993 NM - 865 nm - 681 CM -502 cm -603 CM -359 nm -257 NM - 423 mm - 265 um -692 MM - 95 CM -875 A -749 CM -998 A - 777 A - 297 UM - 832 cm - 463 nm - 210 mm - 647 nm -482 mm - 909 A -947 cm - 358 mm - 889 cm - 396 MM - 280 um -959 CM -93 cm - 455 CM - 867 cm - 792 UM - 358 A -127 um - 340 cm -338 um - 778 cm - 315 A -339 nm -7 MM - 667 CM -253 MM -305 NM - 338 A -485 nm - 477 nm - 951 nm -915.0 mm - 940 um - 493 NM - 229 mm - 677 nm -468 NM - 775 nm -464 mm -984 NM -948 nm - 35 A - 642 CM -95 um - 5 A -838 A -531 UM -139 MM - 960 cm -304 cm - 248.5 UM -21 NM -796 NM - 673 MM - 109 CM -900 CM -533 nm -415 um -19 NM -821 A -290 MM - 93 cm -583 CM - 801 um - 293 CM - 928.0 UM -347 nm -631 UM -85 nm -964 mm - 839 mm - 906 CM - 938 MM - 844 CM -669 A - 588 UM -402 mm -469 NM - 385 um - 448 MM - 130 cm -632 um -336 NM -940 UM - 220 cm -438 mm -117 um -838 cm - 922 mm - 373 CM - 486 nm -681 MM - 944 mm - 524 cm - 654 um -315 A -462 UM - 398 MM - 322 MM - 584 um - 329 nm - 464 NM - 704 mm -200 UM - 511 NM -124 CM -234 nm - 687 UM - 993 nm -441 mm - 133 A - 792 um -405 cm -171 A -332 um - 773 mm - 101 mm -648 NM -33 CM - 102 um -386 cm -150.5 nm -329 nm - 841 UM - 541 mm - 15 MM - 253 MM -679 cm -975 A - 61 nm - 313 CM - 356 NM -426 um - 115 MM -758 MM -319 um - 989 nm -241 CM -191 nm -361.0 MM - 572 A - 134 NM -922 um - 514 MM - 571 MM - 975 UM -26 MM - 539 mm - 484 CM - 214.5 mm - 189 nm -334 CM -25 cm - 277 nm - 542 mm - 620 um - 739 MM -823 cm - 477 cm -378 nm - 491 UM -693 NM -716 um - 766 mm - 599 NM - 936 A -511 nm - 75 cm -718 MM - 589 um - 588 NM - 807 A -975 CM -177 MM - 539 nm - 428 A -594 NM - 672 CM - 878 CM -507 nm -992 MM -663 UM -621 A -318 mm -363 cm - 132.5 um -37 mm - 185 um -187 um - 785 A - 519 A -572 cm -952.5 um - 832 nm -701 A -323 A - 499.5 mm -508 A - 340 A - 957 um -263 CM - 471 UM - 558 MM -101 MM -691 A -264 cm - 151 mm - 691 mm - 665 A -947 MM -387 mm - 586.0 NM -599 CM - 857 um - 144 um - 690 CM - 668 cm -748 CM - 625 CM - 70 nm - 320 cm -32.0 A -877 nm -289 NM - 323 mm -191 CM -226 A - 21 MM -226.5 MM -507 MM -944 cm -39 nm - 687 um - 928 MM - 568 A - 616 NM -991.0 cm -438 nm -678 NM - 323 CM -214 NM - 831 A - 893 CM - 539 nm - 725 MM -886 nm - 841 UM - 700.0 CM -585 NM -374 UM - 19 um -678 MM - 355 um - 984 cm - 84 um -142 cm -788.0 MM -632 UM - 357 A -359 um -226 CM - 195 UM -152 MM - 135 nm - 83 NM - 649 mm -1000 NM -159 MM -537 UM - 508 nm -25 nm -580 NM - 671 MM - 24 A -989 nm - 445 mm - 571 mm - 911 mm - 644 CM -517 UM - 727 UM - 152 CM - 929 UM - 144 MM - 241 NM - 989 mm -337 um - 561 um -544 nm -230 A -842 MM -394 um -419 cm - 802 UM - 52 NM -156 A - 543 mm - 782 cm -64 CM - 336.0 cm -773 NM -139 A -786 mm - 765 cm -393 UM -866 UM -482 A - 782 A - 470 UM -71 nm -717 mm -547 cm - 93 um - 925 mm - 219 NM - 161 CM -905 CM -604 A -655 NM - 930 cm -962 mm -982 UM -225 um -19 MM -237 mm -603 NM -44 CM - 889 um -378 NM -7 mm -575 A - 749 A -526 UM - 911 A - 21 NM -510 nm -893 NM - 340 mm -239 um -643 CM - 209 cm - 986 UM - 844 um -402 CM -526 mm -268 UM - 799 UM -438.5 um -707 CM - 22 NM - 924 A - 807 mm - 817 CM - 592 UM - 306 NM - 298 NM - 532 nm -667 UM - 972 CM -949 A -981 mm -508 um - 478 NM - 716 cm -89 um -261 MM - 11 CM -834.0 nm - 184 CM - 516 CM -652 cm - 173 NM - 333 cm - 313 um - 76 NM - 401 um - 944 nm -525 mm -947 um -23 cm - 481 CM - 416 A - 710.5 NM -456 MM -437.5 cm -38 cm - 831 A - 654 NM -198 NM - 189 MM -776 NM - 28 nm -704 mm -152 A -21 UM -177.0 cm - 962 MM -40 CM - 999 A -521.5 A -704 UM -510 um -973 UM - 671.0 MM - 531 A -229 CM -569 cm - 304 cm - 265 UM - 454 CM - 169 mm - 866 UM -138 NM -498 nm - 19 UM -43 um - 789 MM -379 NM - 330 A - 306 NM -502 CM - 270 UM - 395 A -269 mm -743 UM - 189 mm - 274 NM - 687 MM -906 mm - 497 NM - 177 MM -415 NM -813 NM - 520 um -65 MM - 620.5 cm -41 cm - 482 mm -307 nm -45 NM - 890 cm -338 nm - 328 mm -413.0 cm -931 cm -227 MM -357 mm -221 mm - 141 mm - 919 mm -532 um -253 CM -525 UM - 829 NM -909.0 CM -220 UM - 937 MM - 636 UM - 690 mm - 357 um -972 mm - 812 nm -115 um - 698 cm -778 cm -28 um - 989 nm -330 um - 365 cm -889 cm - 578 cm -837 nm - 454 MM -325 um -171 mm -431 NM -610 A -264 CM -732 A - 778 cm -656 NM -718 A - 580 NM -442 UM -667 cm - 116 CM - 176 cm - 710 cm -402 CM -778 UM - 429 UM - 685.5 um - 500.5 mm -802 MM -963 cm - 252 NM - 285 um -678 um - 272 cm -302 CM -5 MM -232 NM - 277 NM - 13 mm -316 NM - 818 nm - 796 A - 65 CM - 768 nm - 708 MM - 174 mm -5 NM -352 mm - 633 CM -547 MM -124 A - 689 UM - 488 CM -993 nm -613 A -496 CM - 160 MM -288 A - 723 cm - 31 A - 687 mm -238 nm - 154 UM - 213 cm -511 CM - 291 A - 561 um -460 nm - 844 A -409 A - 798.5 NM - 197 A -104 UM -226 NM - 646 CM - 154 um - 816.0 A -998.0 um - 244 UM -566 CM - 341 nm - 669 CM - 820 nm - 198 UM - 81 nm - 376 MM -313 um - 453 MM -339 mm - 648 MM - 805 nm - 358 nm -74.5 cm -280 cm -960 um -697 mm - 593 cm - 51 nm -145 A -12 MM - 181 UM -896 nm -35 um -444 nm -908 UM -753 NM -501 NM -684 UM -902 cm -639 MM -891 mm - 357 mm - 481.5 mm -274 um -276 mm - 262 A - 7 cm -929 nm -415 mm - 697 MM -114 A -840 UM - 81 um - 347 NM - 45 cm - 790 NM -632 NM -202 NM - 111.5 A - 811 A - 963 NM - 956 mm -810 NM -762 UM -842 cm -504 A -117 nm - 165 mm - 517 UM -915 nm - 210 CM -750 NM - 186 UM -582 cm - 998 NM -570 mm - 451 um - 796.5 cm - 513 CM -511 CM -379 cm - 268 nm -381 NM - 26 mm - 634 MM -360 MM -790 mm -265 nm -518 A - 296 MM - 47 MM -400 UM -131 um - 282.0 nm -475 UM -892 CM - 428 A -502 mm -904 A - 769 mm -345 MM - 76 A -18 mm -743 UM - 497 cm - 724 mm -575 CM -568 NM -114 A - 219 CM - 707 MM -616 CM -688 mm - 421 UM - 958 UM - 938 MM - 220.0 NM - 66 CM -235 mm - 628 um -649 MM -469 nm -143 CM -430 UM -913 nm - 78 CM -439 nm - 245 CM - 327 cm - 726 CM -736 MM -274 cm - 720 mm - 538 NM -927 MM - 85 NM - 38 NM -602 MM -619 um - 707 MM - 791 MM -806 A -396 MM - 675 MM -680 mm -680 um - 297 MM -613 NM - 393 um -969 A - 518 nm -94 cm -871 cm -368 nm - 843 NM - 679 nm -307 CM -329 cm - 7 nm -262 MM -54 CM - 52 A -493 NM - 888 nm - 805 CM - 454 NM - 968 um - 734 CM -127 mm -349 mm - 423 mm -347 UM - 874 mm - 922 cm - 610 um -520 cm - 943 NM -46 UM -86 CM -699 mm - 806 nm - 194 NM -939 cm - 174.5 um -287 NM -186 UM - 362 cm - 585 cm - 252 mm - 427 A -550 nm -216 cm -613 mm - 382 UM -506 um - 468 cm -57 CM - 703 cm -730 nm - 539 CM -437 NM -269 MM -994 um -191 A -612 mm - 62 NM -998 MM - 228.0 mm -656 um - 62.0 CM -139 mm -767 NM -742 MM -12 UM -698 MM -409.5 cm -570 cm - 275 A -469 NM - 902 cm -604 um -172 cm - 705 CM -601 cm -622 um - 673 UM -606 nm - 966 MM -413 MM -246 um - 624 cm - 976 NM - 650 cm - 55 A - 939 cm - 244.5 UM -506 um - 764 UM - 617 cm -419 mm - 539 cm - 961 nm - 52 cm -427 UM - 65 nm -773 cm -404 CM - 126 UM -969 um -533 MM - 107 MM - 964 cm - 87 nm - 994 cm - 752 cm - 572.0 nm -410 nm - 845 NM -754 A -653 MM - 811 um -912.0 cm - 931 UM - 400 mm -868 mm - 794 cm - 852 CM - 288 MM -856 NM -143 um -202 um -18 nm -83 CM -606 mm - 724 cm - 12 NM - 80 cm - 245 um -766 CM -685 NM -722 NM - 416 A -311 UM - 535 mm - 424 UM - 503 MM - 74 MM -95 nm -803 MM - 4 NM -337 NM - 814 CM -16 mm - 248 nm -848 CM - 648 A -205 nm - 137 CM - 798 um - 636 cm - 40 A - 502 A -482.0 UM -293 CM -449 UM -314 NM -372 cm - 755 UM -457.5 NM -875 CM -179 MM - 179 NM -683 CM - 663 cm - 769 mm -879 mm - 190 cm - 591 mm - 719 NM -303 cm - 805 NM - 546 mm - 128 um - 366.5 mm - 492 CM - 873 NM - 909 mm - 787 UM - 33 um - 942 CM - 987 NM - 226 mm - 156 um - 207 nm - 786 CM - 620 um -220 nm - 404 NM -701 CM -905.0 CM -442 nm -766 mm -368 nm -565 mm -960 mm - 558 um - 726 mm - 312 nm - 241 nm -607 nm - 516 MM -847 CM - 531 mm -991 um -681 CM - 930 cm - 425 NM -606 CM - 759 cm -847 MM -789 A - 396 cm -915 A -760 MM -142 mm - 463 MM -718 NM - 530 CM - 252 MM -655 UM -682 A -138 NM -824 mm -895 mm - 846 NM - 736 um - 979 mm -671 NM - 909 um -850 NM -722 A - 390 nm -390 nm - 159 CM -366 mm - 21 cm - 103 A - 379 um -250 um - 954 cm -633 cm -808 nm - 738 cm - 105 nm -257 mm -658.5 nm - 140.0 NM - 341 UM -149.5 mm -527 NM -392 NM -578 cm - 677 um -757 um -880 mm - 381 nm - 121 CM -751 nm - 516 NM - 352 CM -653 UM -553 cm -17 UM -115 A - 129 UM - 918 A - 982 A - 76 UM -204 cm - 454.0 A - 411 A -704 nm -655 cm - 132 CM - 923 NM - 428 A -393 nm -752 NM - 357 UM -926 A -337 nm - 529 cm - 845 um -854 A - 199 um -683.5 nm - 495 cm - 383 cm - 539.0 cm - 540 nm - 198 um - 719 cm -567 um -88 UM -940 A -956 MM -4 um - 498 mm - 982 um - 541 A -31 nm - 242 mm -756 mm - 400 A - 610 nm -390 UM -998.0 A -683 UM - 858 um - 91 UM - 903.5 MM -682 cm - 365 cm -830 UM -982 cm -878 NM - 613 A - 168 CM - 202 cm - 570 CM - 65 UM -375 NM -931 NM - 312 um - 110 um -254 MM -146 nm - 898 nm - 217.0 um - 688 cm - 959.5 nm -528 mm -57 A -390 cm - 347.5 CM -692 mm -741 UM -65 NM -878 nm -306 nm -331 nm -732 UM - 931 cm - 906 A - 167 MM -451 mm - 970 MM -486 NM - 481 CM -27 MM - 4 cm - 296 NM - 368 A - 902 um - 443 nm - 790 MM -616.5 UM -156 mm -175 CM - 442 MM -507 CM -280 um - 606.5 NM -287 CM - 126 um - 412 mm -816 nm - 484 um -528 um -651 MM - 996 CM - 84 CM -879 UM -995 nm -482 mm -517 mm - 680 UM - 341 CM - 430 UM - 495 cm -870 CM - 80 NM - 959 cm - 675 cm - 545 A - 636 um - 160 cm - 874 nm -82 NM - 169 CM -86 CM - 897 mm -11 cm -690 MM - 645 CM -57 mm -982 um -828 nm - 700 cm -783 mm - 109 NM -275 nm -261 MM -485 um -451 cm - 641 NM - 764 NM -408 um -2 nm -122 UM - 665 um - 110 A - 460 A - 196 MM -483 A -38 UM - 1 nm - 700 MM -359 A - 13 mm -205 um -462 UM -823 A - 550 nm - 804 A - 362 nm -139 UM -648 nm - 717 nm - 177 CM -486 um - 997 nm -269 NM - 945 MM -76 nm -981.5 mm -254 UM -791 A -37 A -351 nm - 148 um -15 CM - 450 NM - 263 CM - 274 NM -586 CM -939 MM -809 um -208 mm - 835 mm -725 nm -17 MM -163 um -827 MM - 81 NM -744 um - 385 NM -828 A - 925 nm - 575 um - 656 UM - 4 A -168 CM - 679 nm -640 NM - 232.0 mm -788 nm - 46 UM -395 A - 63 nm - 508 um -268 UM - 891 nm -47 mm -850 A - 982 NM - 83 UM -18 UM - 152 cm -557 um -520 cm - 522 UM - 892 cm - 750 mm -735 A - 912 NM - 709 NM -632 nm - 38 NM - 906 NM - 213 UM - 652 cm -534 nm - 274 NM - 616 um -635 A - 587 cm - 846 mm - 434.5 CM -360 UM -95 mm - 220 mm -473 nm -936 MM - 799 nm -980 NM -943 NM -172 nm -394 um -477.5 A -616 mm -885 mm - 411 nm -700 UM - 117 cm -878 A - 324 mm - 276 NM -904 um -539 UM - 776 cm - 721 NM - 234 MM - 217 NM -330 mm -306 mm - 62 nm - 717 um - 230 um -764 cm -380 NM - 672 um -254 CM - 736 cm -391 cm -21 NM -566 MM - 910 nm - 349 NM -649 CM -621 cm -49 UM - 567.0 A -557 mm - 272 mm - 347 um - 174 mm -891 UM - 362 UM - 233 CM - 702 nm - 536 UM - 252 UM - 469 UM -507.5 NM - 956 CM - 657 nm -408 nm - 477 CM - 313 nm - 189 NM -793 um -534.5 mm -448 UM - 857 UM -124 UM -268 cm -977 UM -20 um - 598 UM - 183 MM -669 UM -983 NM -832 CM -860 um -23 MM - 976 A - 938 UM - 934 CM - 761 mm - 391 mm -906 CM -208 nm -672 A - 811 A -799 mm -446 MM -984 um - 121 NM - 729 A - 257 nm - 978 A -392 mm -212 um - 10 A -269 CM -841 cm -226.0 mm -517 mm - 137 UM -538 mm - 786 mm - 155 mm -733 UM -64 CM -598 NM -996 NM - 897 mm - 262 mm -206 NM - 206 UM -678 UM - 995 nm -734 cm - 800 nm -512 CM - 224 MM - 501 NM - 381 cm -644.5 CM -747 mm - 396 MM -257 mm - 747 nm -942 nm - 800 A -914 cm -784 mm - 918 UM -300 nm - 654 NM -461 cm -137 NM - 123 CM - 797 MM -139 NM - 123 A -581 MM - 521 UM - 325 MM - 695 A -668 UM - 805 MM - 767 mm - 200 CM -468 CM - 716 NM - 131 MM - 709.5 MM - 874 mm - 15 cm -754 UM - 631 um - 401 mm -545 UM -95 UM -674 UM -548 CM -384 nm - 954 UM -325 NM - 371 mm - 853 CM - 481 CM -951 CM -893 mm -292 A -276 A - 119 A - 376 um - 672.5 mm - 379 NM -961 NM - 238 nm - 297 mm - 366 NM - 304 cm -515 mm - 676.5 CM -631 CM -214 UM - 887 CM -800 nm - 153 cm -781 UM -949 A -994 CM -103 um -532 mm -558 nm -653 CM - 99 cm -117 mm - 267 um -916 mm -535 CM - 696 nm - 505 MM - 437 UM - 928 nm -148 CM - 406 CM - 847 NM -678 cm -702 cm - 140 nm -544 nm -861 CM -829 nm -60 UM -752 nm - 40 mm -465 nm - 795 um -335 um - 317 mm - 840 A -30 A - 445 um - 670 UM -524 A - 340 NM - 426 CM -282 um -743 cm - 863 MM -188 NM - 98 um - 984 um -488 UM -775 NM - 467 UM - 164 mm -247 cm - 30 um - 307 mm - 626 UM -967 um -73 UM -696 um - 493 NM - 479 CM - 453.5 nm - 827 nm - 695 NM - 377 cm -787 NM - 950 UM - 697 MM -612 MM - 976 MM -849 NM -6 A - 114.5 UM -152 cm - 531 UM - 62 nm - 300 cm - 536 UM - 66.5 cm -992 MM -398 mm - 941 nm - 345 A -48 CM - 738 mm -853 um -599 UM - 11 UM -187 NM -193 cm -285 nm - 971 nm - 687 A -762 CM - 380 UM - 916 A -316 nm - 209 UM - 253 NM -331 mm - 861 MM - 935 nm -864 UM - 340 MM - 989 UM - 711 UM -328 UM -231 MM - 468 A -314 mm - 685 nm - 493 nm -968 um -898 nm - 722 UM - 783 MM -345 mm -728 A -384 nm - 163 mm - 850 um - 304 UM -606 mm -855 NM -254.5 UM - 200 A - 772 CM - 33 mm -816 A - 429 CM -34 MM -654.5 mm - 981 MM -795 A -347.0 cm -89 UM -834 nm -505 A - 639 A -491 cm -852 UM - 985 nm - 211 A -583 um -592 A -250.0 mm -342 cm -886 CM - 313 nm - 320 CM -857 MM -719 um -80 mm -78 um - 220 CM - 87 nm - 608 UM -509 NM -507 A -576 MM -111 A -24 nm -150 MM - 943 UM - 936.5 um -950 cm -498 A -601 CM -366 um - 232 nm - 427 nm - 364 cm - 131 cm -924 UM -759 um -539 mm - 887 A - 57.0 cm -247 cm -797 MM -97 cm -360 UM -205 nm -585 MM - 501 cm - 929 mm - 442 A - 143 cm -373 A - 920 MM -495 UM -826 MM - 779 CM -24 cm -24 cm -711 NM - 902 UM - 733 mm -152 CM -60 NM - 322 MM - 826 MM -709 NM - 164 MM -120 A -609 CM -271 NM - 764 NM - 328 UM -708 CM -160 CM - 178 mm -906 mm - 561 nm - 522 cm - 418 MM -958 mm - 1 um -260 UM -139 mm - 190 UM -659 A - 77 NM -962 um - 10 UM - 260 NM - 21 A -739 CM -283 mm -625 CM -757.0 MM -34 nm - 972 nm - 809 NM -197 CM - 419 A - 261 um -340 NM - 295 um -709.5 cm - 699 CM - 868 um -923 nm -139 CM - 614 cm - 365.5 cm -384 UM -735 nm -705 cm -635 nm - 325 NM - 497 CM - 360 UM - 682 MM - 788 CM - 113 UM - 725 cm - 799 um - 656 um -171 NM - 710 NM -787 MM -522 mm - 69 nm -749 MM - 894 um -950 mm -149 UM - 380 MM - 519 UM -63 cm -658 um -905 MM -987 UM -940 MM -243 CM - 931 nm -853 mm - 991 MM -365.5 MM -680 mm - 466 CM -41 NM -86 nm -221 UM -857 CM - 335 UM -123 CM - 871 um - 839.5 nm - 996 NM - 530 A -9 mm - 123 MM - 455 cm -528 MM -145 nm - 584 A -20 CM - 103 cm - 759 CM -220 cm - 424 CM - 856 cm -400 A - 355 CM - 525 A -497 NM -570 A - 556 MM -360 MM -612 mm -746 cm - 962 cm -952 CM -55 nm - 845 NM -967 UM -779 MM -964 um -292.5 MM -511 UM -90 mm - 222 NM - 180 cm - 365 um - 498 um - 185 MM -572 CM - 611 cm -108 mm -539 MM -308 nm - 260 nm - 801 UM - 441 NM -154 CM - 603 NM -644 cm -203 cm -465.0 CM - 461 um - 697 cm -555 NM -991 UM -470 mm - 692 NM -908 cm - 273 CM -457 UM - 803 MM -602 A - 193 cm - 589 cm - 177 A -517 NM -209 NM - 436 CM -279 mm -122 um - 677 A -406 UM -728 um - 135 NM - 853 nm - 194 nm -796 MM - 606 UM -89 UM - 589.5 A - 75.0 um - 70 um - 526 CM - 393 NM - 497 um -194 um -842 nm - 191 CM -174 UM - 593 nm - 205 A - 65 A - 3 NM -668 A - 219 mm - 496 mm - 95 NM - 517 cm -148 NM -196 cm -730 NM - 45 UM -439 A -545 CM - 455 MM -26 A - 271 mm - 766 NM - 277 cm - 870 NM -101 NM -129 nm - 914 A -780 CM -887 cm -940 mm -527 CM -495 mm - 572 nm - 565 um -803 UM - 226 MM - 430 cm -168 UM - 15 nm -297 CM -475 nm - 267 cm - 142 um - 966 cm -642 NM -585 NM -60 NM -994 A - 13 um - 488 NM - 857 A -824 nm -246 cm -385 nm - 529 mm -958 UM -797.5 nm - 36 cm -371 A -733.5 A -403 A - 584 mm -74 CM -426 CM - 815 NM - 389 A - 878 MM -29 UM -754 CM -238 NM -63 NM - 304 MM -764 MM -491 CM - 3 MM -894 cm -655.0 CM -59 mm - 2 A - 412 CM - 357 MM -64 MM -490 MM -441 cm - 900 um - 244 nm -348 MM - 536 nm -720 nm -469 mm -574 NM -975 MM -247 um - 321 A -975 um - 924 CM -781 A -155 mm -211 mm - 154 MM - 892 MM - 61 NM -467 um -589 NM -757 A -52 A - 756 CM -163 cm -678 CM -270 A - 832 mm - 459 cm - 498 UM -441 um - 644 MM - 948 UM -340 CM -348 CM - 840 mm - 44 CM -471 MM -688.0 um - 338 NM -166 um -479 NM - 249 um - 133 A - 788 CM - 5 nm -54 CM -761 NM -71 um -51 nm -711 UM - 346 nm - 883 CM - 433 nm -97 mm -58 cm - 203 um -518 nm - 619 UM - 392 NM -154 NM - 48 NM - 99.5 mm -436 mm -697 mm - 288 UM -548 UM - 493 MM - 692 CM - 580 MM -449 mm - 113 CM -906 um - 796 um -729 nm -534 um - 106 CM - 119.5 CM - 147 MM - 763.0 um -220.0 MM -419 nm -558 A -103 nm -737 NM -471 MM -369 nm - 757 CM -144 NM - 802 A -205 um - 310 nm -121 UM - 116 um -778 A -202 mm - 375 NM - 302 CM -958 A -566 nm - 408 um - 231 A - 32 UM -291 UM - 31.0 UM -398 A - 796 nm - 863 CM -89 mm -844 cm - 912 UM - 140 mm - 180 A -820 UM - 10 MM - 260 CM - 734 NM -143 UM -523 CM - 807 mm -79 A - 742 CM - 75 CM -293 UM -211 CM -316.5 A -384.0 cm -928 CM -85.5 nm -700 A - 47 CM - 51 um -696 UM - 65 UM -925 mm -403 mm -281 um -651 MM -44 cm -797 um -213 A -58 cm - 640 um -596 um -931.0 MM -384 nm - 688 UM - 950 um - 929 um - 868 NM - 525.5 A - 367 MM - 636.0 nm - 383 um - 274 MM - 114 mm - 290 A - 161 um - 185.0 CM - 261 A -392 nm - 514 UM -973 um - 394 um -436 CM - 348 CM -762 cm -359 CM - 57 UM -808 cm - 94 nm -294 NM -998 nm - 35 um - 317 A -281 cm -624 nm -784 nm - 115 cm -58.0 nm -922 CM -598 UM -898 A -526 NM - 675 um -863 NM -871 nm -233 cm -177 A -433 nm -444 um - 2 cm - 192 cm -213 NM -822 UM - 679 NM -294 CM - 678 UM -151 nm -910 UM - 701 MM - 220 NM -357 UM - 417 cm -695 A - 316 um -364 MM -293 CM -125 nm -522.0 CM -141 um - 271 mm - 15 CM - 292 nm - 650 mm - 649 cm -708 MM - 885 um - 597 um -180 um -827 A - 604 MM - 463 um -543 cm - 575 CM - 818 nm - 550 UM - 767 UM - 52 cm -122 mm -686 CM - 765 MM -160 A - 740 cm - 770 cm -656 MM -153 mm - 819 CM -941 MM - 394 MM - 755 cm -616 MM - 628 um - 978 um -863 UM - 84 um -839 CM -777 A - 668 A -899 cm - 912 um -681 cm -45 cm -24 nm -645 nm - 848 um -816 cm -300 NM - 331 um -343 cm -197 cm - 558 cm - 983 cm - 346 A - 949 mm - 113 A - 684.5 NM -651.5 A - 194 mm -120 UM -715 mm - 305 CM -593 A - 701 nm - 135 mm - 1 NM - 289 A -492 UM -172 NM - 861 CM -330 MM - 34 MM -86 cm -600 CM - 125 um -781 um -408 cm -770 A - 767.5 cm -120 NM - 651 cm - 829 CM - 19 MM - 417 mm - 752 NM - 554 UM -797 A - 345 um -582 UM - 757 CM -557 cm -904 mm -361 MM - 280 cm -493 NM -11 mm - 472 mm -814 MM - 358 UM - 595 um -653 UM -83 NM -900 mm - 545 CM -8 mm - 896 CM -12 A - 451 A - 837 CM - 111 nm -33 cm - 680 um - 996 NM -994 UM - 65 mm -242 NM - 669 A -592 CM -567 NM -129 UM - 639 CM - 840 A - 639 A - 633 NM -654 A -823 um - 460 nm - 827 cm - 951 cm -444 cm - 217 mm - 612 um -101 A -681 um -994 nm - 57 CM - 898 UM -583 cm -98.0 mm - 76 MM -411 cm - 506.5 CM -863 UM - 498 MM - 304 nm -334 A - 135 um - 414 UM -449 nm - 168 UM - 633 mm - 148 UM - 337 A -562 A -554 um -122 nm - 169 CM -29 UM -103 nm -220 CM -234 nm - 429 UM -754.0 cm -59 MM -617 A - 200 nm -425 A -383 NM - 956.5 CM - 293 A -176 MM - 199 CM -956 A - 784 UM -572 NM -887 mm - 595 cm - 193 cm -951 CM -643 cm -674 cm -801 um -340 nm - 62 MM -183 cm -911 NM -217 CM - 729 nm - 504 um -921 CM -709 mm - 322 A - 698 MM -117 um -36 um - 596 mm - 484 cm - 398 UM - 860 nm -207 cm -460 A -707.5 NM - 27 CM -847 um -943 CM -155 nm - 255 nm - 627 cm -727.5 UM - 957 um -465 UM - 164 CM - 926 cm -541 MM - 30 nm -551 NM -686 um - 999 cm -274 nm - 694 UM -232 NM -842 NM -135 UM - 795 mm - 930 MM - 973 CM - 404 MM - 543 MM -219 CM -70 MM - 584 nm - 542 UM - 756 MM -145 mm - 58 cm -349 MM -489 NM -313 mm - 715 NM - 135 cm -73 CM - 70 CM - 231 mm -227 NM -616 UM -873 CM -213 mm - 839 A - 306 nm - 7 cm - 826 A - 345 cm -449 A -423 cm -943 CM - 725 nm -524 MM - 40 cm - 979 CM - 574 A - 653 cm - 417 NM -482 um -613 A -558 um -2 nm - 462 CM -553 UM -781 um - 64 MM -443 A - 62 NM -515 CM -232 nm - 710 um - 692 UM - 894 CM -887 UM -453 um - 336 A - 267 NM - 594 UM - 137 MM -731 A -153 NM -940 CM -246 MM - 821 A -500 MM -504 nm - 253 um -957 um - 670 CM -36 mm - 375 NM - 482 nm -133 A - 51 cm -382 cm -573 mm -288 cm - 178 nm - 518 nm - 977 nm - 345.5 nm -267 CM -557 MM -111 um - 981 cm -46 CM -730.0 MM -23 um - 585 UM -183 UM - 974 cm -534 UM -401 UM -498 MM -530 MM -768 um - 323 mm - 583.5 mm -342 nm - 920 mm - 653 nm -336 CM - 658 CM -861 MM -18 A - 985 NM -550 mm - 804 CM -340 A -745 nm -201 um - 910 CM - 583.5 NM -295 A - 907 CM -984 CM -928 MM - 604 A - 996 A -890.5 nm -439 cm -434 MM -425 cm - 991 cm -994 A -316 cm -280 A - 859 um -826 CM - 63 A - 650 nm - 623 MM - 257 nm - 22 nm -690 MM -936 UM -581 cm -805 CM - 820 CM - 391 um - 604 CM - 219 mm -145 MM -557 cm -485 A - 142 CM -680 UM -645.5 MM - 87 NM - 990 um -468 A - 91 NM - 581 NM - 312 NM -132 NM - 132 nm -277 NM -561 um -23 NM - 877 um - 319 A - 202 mm - 666 nm - 858 mm -628 MM - 696 cm -376 CM - 956 cm -513 MM - 281 A - 228 UM - 363 NM -229 mm - 801 cm -94 MM - 659 A - 841 NM -872 MM - 119 A - 281 mm -518 mm - 522 MM -604 MM - 690 UM -258 A -113 nm - 779 MM -417 nm -773 NM -226 um - 454 nm -602 NM -395 UM -652 mm - 513 A -753 MM -449 MM - 470 CM - 126 MM - 179 MM -236 MM -633 UM - 43 A -242 A -102 mm -460 cm -737 A - 816 UM - 423 um - 381 mm - 91 NM -372 mm - 838 A - 393 mm -476 nm -913 MM - 482.5 MM - 747 cm -431 NM -775.0 NM -596 A - 881 nm - 631 mm - 170 mm -501 mm -170 CM -384 MM -488 cm - 579 um -729 A - 65 A - 307 CM - 633 mm - 139 UM -921 UM -261 nm -889.0 cm - 436 A - 918 um -896 UM - 201 mm -76 CM - 718.5 MM - 837 mm - 841 A -13 nm -269 um - 877 A -893 um - 41 nm -508 NM - 105 MM -926 UM -637 A -399 NM -672 UM - 688 UM - 241 um - 789 cm -616 mm - 938 CM -667 A -893 MM -410 MM - 463 UM - 21 UM - 22 nm -447 A - 334 CM - 858 CM -602 MM -360 MM - 759 UM -619 MM -370 mm - 394 MM - 434 NM - 927 CM -277 mm - 590 NM - 755 um -799 cm - 817 mm - 307 A - 115 UM -38 MM -656 MM - 661 nm - 591 UM - 550 CM - 504 UM - 619 MM - 660 CM -740 NM - 611 mm -724 A - 67 um - 947 mm - 718.5 A - 547 NM - 284 UM - 403 um - 394 nm -862 A - 666 UM -455 cm -886 CM - 837 nm - 271 A - 665 UM - 802 nm -692.0 CM -15 um -701 um - 201 A -409 A - 624 CM -103 NM -670 A - 563 NM - 979 A -630.5 A - 787 NM -569 cm - 402 A - 212 NM -150 um -8 MM - 293 mm - 728 MM - 472 mm -230 cm -888.5 nm -837 UM -34 A - 84 NM -965 mm -568 UM - 787 nm -322 cm -31 nm -408 NM -113 UM - 33 A - 403 CM -759 MM - 208 um - 523 UM -439 MM -281 A - 189 MM - 998.0 um -78 A -485 UM - 52 MM - 455 um - 755 MM - 94 UM - 206.0 NM -904 CM - 872 NM - 156 UM -637 MM -129 nm - 168 MM - 462 um -262 UM - 296.0 MM -708 MM -347 NM -495 NM - 464 UM -151 mm -223 UM -150 CM -578 NM -163 NM -515 um - 773 cm - 108 UM -83 CM -177 cm - 791 MM -200 CM -792 MM - 330 NM - 553 NM - 668 CM -960 um - 668 nm - 848 mm -559 UM -415 NM - 17 UM -930 NM -999 NM - 833 A - 860 UM -460 A -275 A -331 CM -707 CM - 464 um -627 UM - 185 NM - 121 MM - 951 nm - 654 CM - 786 A - 497 A - 601 um -820 NM -214 cm -594 nm - 935 nm -254 mm - 985 CM - 760 nm - 970 cm - 923 cm - 132 CM - 517 mm -322 A - 320 NM -446 MM - 678 NM - 289 cm - 413 MM -578 mm - 546 MM -615 mm -226 CM - 330 mm - 648 A -259 MM - 613 NM -582 cm - 835 nm - 89 um -813 UM -586 UM - 156.0 mm -850 CM - 480 UM - 457 NM - 574 nm - 881 MM -594 mm - 732 UM -101 CM - 889 cm -677 MM -402 CM - 284 nm - 156 MM -724 um -462 NM - 303 MM -866 NM - 106 CM - 39 CM - 880 MM -660 CM -832 mm -63 mm - 141 um - 828 NM -449 CM - 945 nm - 393 MM - 654 A - 373 UM - 713 nm - 255 mm -31 A - 224 um - 281 mm -924 CM -626 A -347 um - 843 MM - 136 UM -300 UM - 911 UM - 767 NM -603 MM -776 MM - 561.5 MM -392 nm - 293 nm -587 mm -884 MM -804 um - 607 cm -346 MM - 119 cm - 685 mm -74 nm - 660 UM -562 NM - 250 nm - 496 MM - 593 cm - 443 cm - 479 A - 420 CM - 426 A -743 cm -347 nm - 818 MM -489 nm -605 mm -648 nm -3 um -956 A - 847 CM - 828 um -120 um - 466 nm -842 mm - 397 cm -376 NM -506 MM -483 nm - 756.0 MM - 510 NM - 59 CM - 723 um -160 um - 974 CM - 426 UM -103 NM -102 um - 43 cm - 59 cm -221 NM -256 nm - 918 um - 621 UM -850 UM -554 cm - 344 NM - 414 A -576 MM - 473 UM -195 MM -149 NM - 837 MM -260 MM - 745 um -649 cm - 306 nm -528 CM -613 UM -7 UM - 921 um - 575 mm - 18 mm -394 um -588 CM -709 um - 812 NM - 361 UM - 752 nm -447 UM -881 UM -960 cm - 863 UM -465 NM -374 MM -304 MM - 549 um -885 NM -852 MM -360 nm - 214 NM - 562.0 MM - 238 CM - 921 um - 56 um -292 mm -376 CM -818 nm - 656 mm - 191 um - 778 CM -934 MM -830 mm -655 um -504 mm -233 UM -558 MM - 407.5 cm - 152 cm - 916 um -532.0 CM - 795 UM - 893 A - 593 MM -835 CM - 479 MM - 299 cm - 822 NM -862 nm - 532 nm -918.5 nm - 482 nm - 682.5 nm -149 cm - 970 cm -14 cm -429 UM -274 mm -470 mm -958 nm -488 cm - 922 NM -227 MM - 807 cm -72.0 mm -123 A -626 nm -925 mm - 224 cm - 337 A -658 UM - 895 CM -229 UM - 194 UM - 370 A - 8 CM -1000 cm -848 UM -865 NM -609 mm -964 cm -920 nm - 328 um -900 NM -115 nm - 815 nm -819.5 A -34.0 NM - 705 MM - 808 NM - 700 CM - 253 CM - 131 cm - 185 NM - 58 cm - 198 NM - 11 NM -721 A - 686 CM -865 CM - 318 UM - 783 cm -778 CM -483 NM - 470 nm - 851 NM - 673 mm -351 mm - 945 NM - 997 UM - 560 UM - 783 NM - 719 NM - 163.5 MM -98 CM - 51 NM - 277 CM - 119 NM -107 CM - 842 um - 691.5 UM - 778.0 mm -837 MM -95 NM - 943 NM -767 MM - 24 cm - 679 NM - 63 um - 877 UM -466 A -558 um -459 UM - 609 um - 547 nm - 17 A - 100 CM -237 UM - 37 MM - 801 mm -225 CM -246 cm -71 UM -156 cm - 711 cm - 867 UM - 435 CM -451 MM - 449 A - 385 MM - 764 nm -168 CM -661 cm -95 mm - 360 cm -523 UM - 185 UM - 299 UM - 678 NM -954 A -541.0 A - 172 mm - 554 cm -141 um - 912 cm - 421 MM - 873 A -276.5 mm -912 MM -309 NM - 76 nm -111 nm - 538 A - 285 CM -313 CM -12 mm -619 A -709.0 mm - 216 cm - 707 MM -682 A -664 UM - 828 UM -446 CM - 472 nm -258 CM - 435 CM - 430 um - 70 MM - 32 NM - 947 cm - 192 cm - 434 nm - 172 um -899 A - 251 CM - 695 cm -141 cm - 478 MM -636 MM - 601 mm -612 NM - 596 cm - 75 nm -643 NM - 30 um -551 mm -670 um - 613 mm - 392 cm - 272 A -843 mm - 125 MM - 766 cm -145 NM - 646.5 A - 98 UM - 613 um -936 cm - 727 um -687 cm - 766 cm - 226 um -569 MM - 920 MM -361 CM - 630 mm -823 A -526.5 cm -386 A -611 UM -453 cm - 645 NM - 680 A - 50 UM -436 um -926 NM -803 CM -39 NM - 513 A - 995 um - 555 cm -838 MM -853 um - 571 mm - 700 cm - 593 cm - 611 MM - 513 nm - 246 MM - 229 UM -223 cm - 504 UM -531.5 mm - 819 NM - 170 nm -320.0 MM - 404 nm -222 A - 313 mm - 257 UM -268 CM - 131 NM - 563 MM -763 nm - 62 mm - 811.5 UM -434 CM - 772.5 UM -644 MM - 727 cm - 453 A -924 nm - 653 NM - 822 um - 866 MM -843 um -369 A - 254 NM -238 nm - 883 CM -685 CM - 559 UM - 484 um - 541 MM - 815 mm - 358 mm - 274 um -230 um -727 CM - 458 MM - 895 mm -479 CM - 607 um -564 NM -188 cm -75 um - 482 cm - 692 A -768 mm - 21 NM -68 um - 530 nm - 156 nm -276 MM - 495 nm -52 UM - 210 UM - 453 cm - 40 NM -713 cm - 434 CM -261 nm -503 UM - 880 cm - 892 MM -650 UM - 312 nm -524 um - 613 MM -821 NM -576 mm - 531 um -211 UM - 964 UM - 52 um - 875 nm - 975 um - 347 A -392 A - 727 um - 373 um -57 um - 993 CM -477 nm - 55 cm - 764.5 um - 765.5 CM - 921 NM - 158 CM - 876 mm -162 UM -240 UM -66 UM -570.0 MM -62 A -645 CM - 717 mm - 334 MM -87 NM - 901 cm - 306 um - 499.5 um -201 cm - 393 UM - 678 mm -480 mm - 581 nm -452 A - 816 UM - 96 CM -449 cm -927 CM -657 UM - 839 nm - 236 nm -318 CM -747.0 cm -250 A - 84 CM - 431 UM -211 cm - 650 UM -456 NM - 625 A -776 A -407 mm -895 MM - 536 um -358 A - 718 um -121 MM - 676 CM -663 mm - 25 cm - 530 MM - 438 CM - 877 nm - 436 A - 212 CM -28 nm - 413 um -473.5 cm - 186 nm - 417 um -360 UM -629 um - 284.0 nm - 687 MM - 484 um - 133 CM - 157 CM -274.5 A - 974 mm - 907 NM -363 CM - 510 UM -763 NM - 877 CM -149 cm -862 mm - 732 CM - 494 mm -762 A - 70 A - 480 MM - 262.5 CM - 845 nm - 380 NM -805 A -1000 nm - 561 UM - 310 A - 259 nm -598 MM - 592 UM -25 cm - 210.0 UM -203 MM -47 mm -734 A -514 mm - 579 NM -516 nm - 913 NM - 783 um -273 CM - 388 nm -200 NM - 226 um -538.5 um -833 um -836 CM -99 um - 11 A -452 A - 76 NM -52 MM -131 nm - 959 NM - 900 CM - 107 NM -542 cm -595 A -185 mm - 51 cm -657 cm -111 CM - 868 UM -127 CM - 529 MM -195 cm - 850 um -115 CM -651 mm -30 cm - 663 mm -333 nm - 565 um -365 um -282 um - 192 A -449 A -586 cm - 926 mm - 826 um -781 cm - 332 CM -758 A -695 CM -10 um -902 um - 920 nm - 355 NM - 799 um - 783 cm -386 A -968 nm - 281 CM -290 MM -960 A - 630 NM - 672 cm -950 MM - 911 um -619 cm - 259 mm - 631.5 CM -153 A -509 MM -569.5 MM - 424 NM -215 CM -289 CM - 611 NM -421 MM - 78 cm - 417 CM - 210 MM -444 mm - 787 NM -798 UM -759 MM - 981 mm -763 mm -189 CM - 384 CM -908.5 NM -120 cm -435 CM -335 um -418 nm - 445 cm -57 CM - 466 UM -706 NM -194 um -141 cm - 476 CM -356 nm - 701 UM - 275 CM -697 mm -416 MM -450 cm -568 UM - 617 NM -831 mm - 239 cm -983 NM -178 um -540 cm - 243 um - 874 UM -507 um -438 cm - 778 cm - 293 A -752 NM - 190 NM -574 cm -382 mm -463 cm -832 cm - 348 CM -961 MM - 767 mm -905.5 mm - 800 MM -541 um - 249 um - 680 mm - 456 A - 903 um -775 cm -32 um -685.5 mm -478 cm - 653.0 CM - 890 um -486 CM - 869 NM -542 A - 590 MM - 733 NM - 290 UM -515 mm - 952 UM - 556 A -373 MM - 449.5 nm -270 UM -324 A - 571 A - 426 um - 32 CM - 384 nm -715 nm - 121 mm - 709 cm - 67 CM -207 cm -409 nm -410 MM -588 nm -51 um -307 mm -64 mm -979 nm -555 um -745 mm - 889 nm - 996 A -607 A - 154 um - 651 MM - 768 cm - 609 cm - 629 CM - 853 A -147 NM - 391 MM -217 nm -794 MM - 984 cm -245 mm -879 UM -514 A - 145.0 cm -752 cm - 652 mm - 571 mm - 964 cm - 897 MM -724 cm -789 MM -218 nm -846 A -62 MM -813 um - 432 A - 400 cm -24 UM - 489 NM -843 NM -419 cm -366 CM -331 cm -925 um - 558 UM - 493 NM - 725 A -248 cm -863 um -711 mm -996 nm - 801 um -237 NM - 300 A - 696 CM - 196 CM - 563 MM - 903 NM -818 nm - 129 MM - 381 MM -186 NM -83 um -862 UM -137.0 mm -25 MM - 970.5 cm - 40 A -897 NM -863 cm - 384 CM -889 nm - 766 NM - 655 CM - 173 MM - 741 CM - 382.5 mm -719 nm -399 nm -181 mm - 15 NM - 873 cm - 126 A -198 MM - 616 um - 780 mm - 656 A - 898 cm -427 NM -879 mm -243 UM - 703 mm -100 um - 563 UM - 586 CM - 504 CM - 505 NM - 441 A - 546 UM - 578 A - 42 cm -166.0 UM -6 MM -939 mm -720 cm - 779.5 cm -250 mm -633 cm - 125 A - 803 UM -746 A -326.5 cm - 210 MM - 511 A - 374 CM -843 um -783 nm - 240 UM -813 UM - 772 mm - 404 CM -57 NM - 968 nm -988 MM -359 um -314 UM -790 NM - 217 UM -462 um -152 cm -856 nm -782 MM -315 MM -511.0 CM - 538 MM -954 mm - 983 UM - 488 cm -187 nm - 542 MM -506 CM - 627 A - 36.5 MM - 477 cm - 878 cm - 175 A - 187 MM - 191 NM - 815 cm - 747 um - 444 um - 398 NM -43 CM - 183 nm -775 cm -565 nm - 213 A -621 mm - 63 UM -542 mm - 426 um - 217 nm - 267 mm -944 nm -696 MM -105 um -80 CM -526 A -365 cm -595 um -960 mm - 760 UM -876 um - 688 um - 460 UM - 17 nm -431 NM - 723 CM - 449 cm -496 nm -80 CM -742 CM - 923 um - 108 um - 295 MM - 893.0 cm -843 MM - 86 NM - 590 NM - 508 cm - 135 A -470.0 nm -756 NM - 860 A -954 MM - 943 CM - 602 NM - 928 UM - 504 CM - 461 cm - 114 nm - 957 nm -475 um - 740 NM -180.5 CM -658 mm - 469 MM - 210 MM -314 A - 996 UM -36 UM -125 MM -584.0 A - 152 UM -841 MM - 446 cm - 997 UM -900 mm - 19 NM - 23 MM - 791 NM -652 NM -444 CM - 753 CM - 935 nm -876 CM - 901 UM -252.5 MM -772 A -815 CM -757 MM -990 NM - 110 UM -29 NM -82 MM - 984 NM -837 MM -896 MM - 234 NM - 525 cm - 406 A - 625 CM - 858 CM - 129 um - 230 CM -230 A -42 cm -902 um - 95 cm -143 NM -569 UM - 676 CM -978 CM -708 nm - 944 UM - 421 NM -87 MM -677 MM - 721 mm - 606 cm - 660 nm - 255.5 A - 190 NM -539 nm - 666 UM - 963 A - 540.5 cm -671 CM -691 cm -310 cm -425 um -685 um - 183 mm - 106 NM -152 A - 827 UM - 797 A - 960 CM -723 MM -319 CM -529 nm -768 CM - 389 UM -738 um -210 NM - 716.0 MM - 885 NM -235 um -84 MM -703 UM -387 A - 305 CM -662 MM - 9 um -711 mm - 57 A -170 NM - 310 nm -767 mm - 45 CM -160 A -76 UM -317 UM -139 um - 175 cm - 226 mm - 198 MM -659 cm -825 UM - 165 nm -55 NM - 869.5 um - 170 UM -420 A - 193 A - 362 UM -723 um -175 mm - 813 UM -563 UM - 762 mm - 493 MM - 769 A - 414 CM -752 UM - 579 CM - 34 cm - 70 nm - 345 MM - 72 cm -469 A - 217 UM - 719 NM - 303 CM - 93 nm -822 nm - 785 nm -776 A -801 CM - 600 NM -984 mm - 162 MM - 155 UM - 568 nm - 847 CM - 433 A -681.0 um -84 NM - 896 CM -514 NM - 203 nm -25 um - 608 CM - 349 UM - 163 nm -51 mm - 38 UM -822 nm - 617 nm - 64 CM - 324 A - 824 CM -944 MM - 105 A - 444 NM -661.0 NM -862 nm - 325 NM - 734 NM - 739 nm -92 mm -302 nm - 748 MM -180 cm - 687 NM -616 mm -518 A -7 mm -757 um -633 UM - 450 cm -833 um -460 nm -577 CM - 79 nm -141 NM -952 cm -965 CM - 742 cm -930 nm -450 mm - 41 MM -634 UM -210 UM -490 UM - 809 MM - 351 NM - 964 UM -723.5 CM - 785 CM - 642 MM -323 um - 749 um -146 nm -648 mm -612 um -106 mm - 724 UM - 651 NM -895 CM - 196 A -717 cm - 286 A - 665 cm -289 NM - 987 um -422 nm -691 cm - 877.5 CM -750 cm -220 um - 456.5 NM - 490 A - 919 MM -69 um - 639 A - 994 nm -534 MM - 387 A - 255.5 nm - 899 CM -85 A - 138 CM - 228 cm -325 cm - 178 cm - 973 CM -453 um -131 CM - 480 MM - 307 nm - 650 mm -268 um - 472 CM -682 nm -996.5 mm -208.5 mm - 745 CM -482 A -345 NM -594 nm -595 A - 941 um - 692 A - 523 MM -394 A - 441 mm -845 nm -792 cm -576 UM - 317 MM - 527 UM -14 A - 697 MM - 571 mm - 398 um -362 UM -613 mm -519.5 UM - 266 cm - 944 MM - 505 cm - 306 A - 875 MM - 433 A -178 MM - 987 UM - 720 nm -35 NM -22 cm - 822 A -749 nm -757 UM - 72 nm -733 nm - 517 A -25 cm - 623 cm - 903.5 UM - 356 nm -360 cm - 495 A - 592 CM - 959 A - 130 UM - 611 cm -681 nm - 768 NM - 223 NM - 331 MM -347 mm -724 NM - 84 um - 831 MM - 731 A - 768 A -142 MM -824 CM - 892 NM -323 nm -351 cm -829 NM - 684 mm - 485 UM - 875 cm - 855 MM - 442 A -668 mm - 511 A - 641 UM - 599 A - 389.5 cm - 806 cm - 18 NM - 36 um - 353 CM - 90 nm -570 A -858 CM - 724 MM - 822 UM -146 UM -518 nm - 655 nm - 178 MM -395 CM -219 UM - 761 cm - 691 um -296 NM - 871 nm - 327 MM - 642 MM - 655 MM - 64 mm - 551 um - 857 NM - 981 um - 621 NM - 734 CM - 987 UM -857 um - 240 MM - 699 mm - 68 um -484 um -5 CM - 765 A - 502 CM -777.5 cm -747 cm - 584 nm - 591 um -651 um -211 UM - 365 CM - 485 cm - 751 CM - 948 A - 977 nm - 621 MM -305 cm - 333 MM -50 A - 313 NM - 953 um -904 mm -181 MM - 243 CM -124 um -742 CM -345 cm -849.5 cm -518 nm - 258 UM - 804 cm - 576.5 um - 368 CM - 757 um -873 UM - 977 mm -106 nm -823 um - 731 cm - 761 CM - 125 mm -698 nm - 38 NM - 398 NM - 160 UM - 590 cm - 281 mm - 752 mm - 255 mm - 513 mm -534 cm -327 A -413 MM - 414 nm -816 A -960 MM -277 um -89 NM - 55 NM - 547 mm -794 um - 698 CM - 22 um - 863 NM - 271 UM - 964 MM - 958 UM - 273 CM - 518 UM - 796 UM - 479 MM -308 A -318 UM -899 CM -330 mm -656 NM - 203 nm - 696 UM - 499 CM - 749 CM - 496 um - 630 nm - 637 CM - 333 MM -412 um - 605 NM -741 mm -304 mm -232 NM -119 UM -500 um -510 A - 921 cm -260 cm - 106 A - 486 nm - 689 UM -257 um - 347 cm -516 NM - 10 um - 155 um -704.0 CM - 395 um - 204 cm - 22 CM - 958 UM -896 um - 160 cm -968 um - 628 mm - 652.0 mm -762 cm - 102 nm - 176 UM -611 NM -538 mm -346 CM -177 NM - 146 MM - 764 mm - 891 um - 722 um - 231 CM -63 A - 405 cm - 139 NM - 529 A -344 cm - 418 um - 4 CM -152 cm - 657 NM - 877 um - 370 A - 426 nm -222 A -88 UM - 418 NM -879 A -397 mm -918 A - 513 CM -116 mm -445 UM - 505 NM -928 CM - 481 A - 430 NM - 663 um - 720 MM -410 mm - 376 nm -198 A - 538 UM -599 MM - 766 cm -79 cm -161 NM - 497 CM -211 UM -205 MM -155 UM -779 UM - 745.0 um -965 nm -46 nm - 380 MM - 286 cm - 558 NM -96 A - 135 nm -683 cm -184 MM -206 um -97 cm - 167 mm - 802 CM -257 mm - 872 UM - 950 NM - 528 um - 113 NM -31 nm - 729 mm -620 A -427 NM -188 mm -534 CM - 161 nm - 496 cm -749 nm -154 A - 488 A - 846 A - 768 um - 876 mm -145 A -596 MM - 693 nm - 278 cm -505 A -335 nm -255 cm -981 UM -56 MM -897 nm - 238 A -951 MM - 726 um -290 MM - 297 mm -645 NM - 557 A -281 nm - 406.5 cm - 427 CM -83 CM - 502 CM - 13 um -765 nm -840 cm -885 UM -872 A - 826.0 cm -935 cm -658 mm -915 UM - 433 um - 275 cm -305 CM - 827 CM -435 cm - 104 um -927 mm -379 nm - 827 A - 594 A -759 cm - 878 A -193 UM - 286 NM -108 cm - 295 MM - 936 UM - 517 UM - 984 NM -436 cm -292 CM -726 mm - 909 NM - 664 cm - 433 MM - 562 mm -777 um - 562.0 MM -616 NM - 643 UM -998 nm - 192 UM - 875 mm -38 CM -433 A -159 um -201 nm - 161 MM -54 um -767 NM -369 nm -637 NM -803 nm - 170 A - 541.5 NM -960 MM -545.0 NM - 469 mm - 396 um - 339 NM - 58 um -793 nm - 453 nm - 166 CM - 633 A - 267 NM - 62 um - 991 um - 492 cm - 781 NM - 119 MM - 492 UM - 56 um -884.5 CM - 278 mm - 814 NM -463 cm - 650 mm - 692 CM -565 um -277 nm -434 CM - 122 mm - 41 um - 656 A - 423 nm - 514 um -83 MM - 514 UM - 689 cm -313 um -513 MM - 491 NM - 300 cm - 680 CM - 679 um - 278 NM -159 nm - 258 cm - 253 cm - 609 CM -363 mm -35 CM -991 CM -982.5 cm -555 UM -558 UM -301 NM - 573 um -372 CM -96 NM -820 NM - 445 MM - 477 NM - 10 UM -54 nm -410 UM - 14 um -550 mm - 780 nm - 170 UM -486 MM - 592 CM -477 um -125 um - 596 nm - 655 nm -219 nm -160 um -515.5 A -855 MM - 339 UM - 429 A - 358 MM -102 MM -510 UM - 531 MM - 420 CM - 618 CM -152 nm - 673 NM -343 nm - 200 cm -426 CM - 660 cm -629 um -240 NM - 233 UM -328 NM -196 mm - 704.0 A - 637 A - 651 NM -544 mm - 872.0 nm - 615 UM -579 um - 2 A -902 UM - 255 um - 16 UM - 850 NM -481 mm -205 NM - 169 mm -346 A - 81 um - 584 A -790 NM -222 CM - 800 CM - 472 UM -685 A - 832 cm -262 UM -102 MM - 498 cm - 500 cm -16 CM -249 A -610 NM - 855 CM - 487 UM -307 CM -128 CM - 686 mm -51 cm - 637 um -885 A - 219 UM - 913 mm - 118 mm -476 NM -277 cm - 675 MM -436 cm - 967 cm -363 NM -245.0 CM - 852 CM - 169 CM -475 CM -427 nm -351 cm -734 mm - 960 cm - 830 cm -856 nm - 917 MM -509 um -810 MM -102 MM - 338 CM -395 mm - 534 cm - 156 UM - 150 NM - 135 MM - 686 A -183 CM - 628 CM - 388 MM - 658 cm - 675 A - 592 cm - 703 mm - 607 UM -882 A -871 CM -551 MM -360 cm -169 MM - 479 NM - 712 nm -365 um -801 cm -734 cm - 156 cm - 220.5 MM - 191 NM -813 MM -682 MM -932 cm -8 NM - 845 MM -250 NM - 904 mm - 636 CM -268 cm -141 mm -146 cm - 864 CM -540 cm -123 cm -756 mm -976 MM - 245 MM -462 MM -635 um -793 cm -823 UM -358 um - 336 NM - 73 cm -368 CM -959 nm -67 mm -850 um - 126 MM - 405 um -827 um - 190 UM - 719 um -328.0 CM -885 cm -505 cm -11 um - 588 CM -375 um -52 um - 174 A - 945 MM -208 A - 496 cm -197 nm -910 nm -105 MM -427 mm - 434 nm -220 NM -485 NM - 678 UM -70 A -566 NM -335 cm -87.5 NM - 816 mm - 722 MM -627 UM - 634 A -417 um - 977 MM - 292 cm - 90 cm - 597 NM - 790 A -468 CM - 598 NM - 480 MM -484 A -510.0 um - 283 MM -213.0 CM -990 nm -960 mm -629 cm -598 um - 374 NM - 613 mm - 18 um -878 NM - 556 CM -488 A -105 NM - 54 MM - 138 nm -925 NM -227 CM - 275 nm - 904 UM - 160 CM -505 um - 873 CM -22 cm -929 cm - 696 MM -78 um - 447 um - 580 um -634 cm -801 um -535 CM -420 MM -686 MM - 442 NM -603 MM - 413 cm - 436 NM - 643 nm - 697 CM -272 UM -500 CM -29 A -5 A - 156 A - 105 MM - 753 um -243 UM - 314 MM - 859 MM - 821 UM - 691 MM - 258 NM -922 um -268 um - 981 MM - 153 A -259 UM -367 MM - 716 A - 576.5 NM - 796 cm - 938 A - 302 cm - 15.5 um - 986 cm -705.0 NM - 409 um -777 nm -595 mm - 901 UM - 614 A - 957 UM - 251 MM - 356 UM - 381 CM - 734 A - 431 A -247 cm -989 mm - 742 mm -827 mm - 624 nm -309 um - 349 um -634 um -868 A - 739 nm -300 NM - 247 MM - 222 cm -194 cm -380 nm -225 UM - 439 mm - 230 A -975 cm -360 mm - 972 NM - 480 mm -309 A -724 nm -126 MM -605 cm -267 nm - 196 NM -989 MM - 538 A -588 cm - 914 UM -223.5 A -733 cm -357 UM - 490 CM - 882 A - 372 A - 819 um - 306 cm -654 A - 454 um -128 A -91 MM -884 mm - 856 MM - 980 cm -52 cm -400 UM -465 MM -737 mm - 93 um -47 UM -238 nm -547 UM -481 NM - 877 NM -488 MM -613 MM -25 UM - 900 A - 720 MM -80 mm - 553 NM - 659 um -619 nm -405 A -253.5 CM - 546.5 um - 83.0 um - 862 um -299 mm -385 NM -239 nm - 925 nm -234 CM - 36 A - 428 A -605 um -977 A - 314 MM - 964 nm -93 cm - 365 nm - 213.5 UM -776 NM - 308 nm -189 UM -337 CM - 807 NM -170 cm - 228 CM -435 A - 389 mm - 604 A - 181 CM - 564.0 MM - 74.5 NM -624.0 UM - 369 mm -642 UM - 114 UM -970 UM -962 NM - 90 A - 255 UM -364 NM -818 CM -507 mm -674 mm - 450 A - 623.5 cm -301 UM - 488 cm -687 NM -628.5 cm -323 CM - 465 cm -289 um - 969 CM - 812 A -49 MM -610 MM - 598 UM -968 um -381 CM - 554 MM - 210 NM -224 cm - 516 MM - 73 cm -480 CM - 659.0 NM - 881 MM -174 mm -248 mm -385 um - 931 A -75 UM -415 CM -165 UM - 235 um - 87 UM -512 UM -345 cm - 949 nm - 612 CM - 993 cm - 37 nm - 320 UM -938 UM - 466 CM -297 mm - 781 um - 659 CM - 36.0 NM -713 um -987 CM - 408 NM - 43 UM -839 UM - 841 NM -51 MM - 708 nm -45 NM - 601.5 cm -17 MM - 744 nm -192 um -138 mm - 481 UM -150 NM -463 mm - 529.5 NM - 216 CM - 730 A -687 A - 269 nm - 244 A -159 mm - 777 A - 602 nm - 604 UM - 728 A - 808 mm -436 mm - 378 UM -76 A -10 nm - 520 NM - 578 UM -904 MM - 931 mm - 403 UM -635 nm -801 cm -736.5 mm -826 MM -963 mm -531 cm - 891 UM - 255 A -794 NM -509 UM - 42 MM - 548 MM - 86 um - 943 NM -175 UM -759 UM -691 nm -244 MM - 755 A - 371 CM - 14 UM -10 um - 643 nm -23 mm - 911 mm -419 CM -722 UM - 339 MM -793 UM - 487 NM - 787 CM -525 A - 8 A - 138 nm - 529 MM -174 cm -226 mm - 914 NM - 247 mm - 71 CM -981 um - 754 A -317 A -577 um - 647 CM -222 cm - 812 A - 281 nm -408 CM - 397 mm - 965 nm - 60 um -165 MM - 443 nm - 433 UM - 3 um -584 A -557 MM - 654 mm -763 A -27 um -418 mm - 412 nm - 863 NM - 294 um - 479 A - 525 um - 440 NM - 227 mm - 5 um - 117 nm -521 mm -133 CM - 619 UM - 825 MM -848 cm - 484 cm - 837 NM - 857 A - 859 NM - 555 um -279 UM -668 mm - 941 NM -620.5 A - 23 A -327 nm - 759 cm -659 A -712 MM -401.0 mm - 789 mm -862 mm -243 mm - 129 A - 882 nm - 963 nm - 426 nm - 54 UM -79 CM -994 A - 618 mm -659 UM - 790 CM - 148 MM -802 A -57.0 NM -402 MM -477 A -8 nm - 304 nm -195 NM - 200 NM - 644 CM - 520 um -349 nm - 868 MM -424 nm - 85 mm -139 mm -934 A -339 UM -338 um - 832 MM -679 A - 704 um -993 mm -486 UM - 839 um -799 MM - 447 NM - 169 um -220 CM -285 UM - 496 mm -238 UM -553 A -230 NM -572 CM - 188 cm -887 NM -315 cm -340 NM -624 um - 157 MM -548 A - 315 CM -852 UM - 254 UM -561 cm - 995 MM -978 A - 539 UM - 552 UM -531.5 um - 845 mm - 353 cm -143 cm - 426 UM -648 mm - 724 um - 911 NM - 480 NM -630 A - 255 NM -769 CM -40 nm -343 um - 490 um - 592 CM -188 nm - 381 mm - 994 CM -626 A - 471 MM -562 UM -206 NM - 493 CM -786 nm -686 mm -786 UM - 274 nm -113 MM -284 A - 81 mm -387 A - 479 nm -306 MM -578 nm -196 cm - 754.5 mm -122.5 UM -438 cm - 95 CM -994 MM - 187 mm -283 UM - 23 mm -364 NM - 463 A -902 mm - 599 um -57 MM - 850 UM -29 cm - 577 A -977 MM -252 MM -763 CM - 528 NM - 350 UM - 124 UM -782 UM -683 CM - 910 NM -87 um - 579 A - 302 UM -898 nm -637 MM -81 CM - 576 NM - 596 NM - 927 NM -778 UM -555 MM -210 A - 529 um -596 MM -416 NM -320 nm -65 MM - 554 UM - 285 A -450.5 MM - 85 A -735 mm - 307.5 nm -985 UM -126.5 mm -657 NM -764 nm -953 NM - 75 mm - 813 A -768 um -592 NM - 647 NM - 558 UM -494 MM -810 nm -44 um - 804 cm - 183 mm - 325 NM - 407 CM -369 um -878 A -754 NM - 63.5 NM -732 nm - 277 MM -516 mm -217 um - 312 A - 386 MM - 507 um - 383 MM -205 A -853 A -221 A - 917 MM - 38 um -511 MM -383 A -752 MM -142 cm -30 UM - 672 NM - 630 nm -423 NM -100 A -112 cm - 753 NM - 912 MM -407 UM - 302 um - 121 UM -351 NM - 455 CM - 513 mm - 101 mm - 897 nm - 659 cm - 159 MM -572 A -873 NM - 16.0 um -453 CM - 130 cm - 323 mm - 237 UM - 246.5 nm - 524 cm -987 cm -730 CM - 376 A - 666 mm -270 nm - 765 MM - 950 cm - 13 nm - 444.0 mm - 705 nm - 699 cm -16 NM -739 nm -171 UM -584 um - 865 CM -76 CM -930 cm -70 nm -848.5 cm -192 NM - 989 um - 999 um -826 A - 527 UM - 429 MM -515 nm -942 mm - 127 um -368 nm - 617 cm - 45 MM -187.5 MM -429 um -566 UM -350 CM -174 um -258.0 nm -570 mm - 528 CM - 780 UM - 349 mm -188 CM - 523 NM -119 MM -800 nm - 818 NM - 200 CM -80 A - 975 MM -800 UM -145 cm - 610 MM -762 nm -759 CM - 766 nm -665 A - 536 cm - 489 UM - 493 cm -759 mm -928 UM - 852 cm -92 UM -702 NM -797 um - 596 NM - 347 CM - 431 CM -402 um - 617 nm - 64 NM -876 UM -800 MM - 322 cm - 16.0 nm -671 mm -556 MM - 296 cm - 192 um -373 nm - 662 MM - 972 nm - 741 NM -982 cm - 820 MM - 306 A -232 mm -199 UM -139 um -917 A - 194 nm -571 UM -798 UM - 548 MM -75 NM -236 um -186.0 nm - 300 UM - 125 UM - 700 cm - 417.5 CM -392 um - 884 A - 489 NM - 98 A -162 UM -560 UM - 821 UM -189 um -353 cm -551.0 um -26 A -717 nm - 756 mm - 282 MM -826 MM - 94 MM -320 A - 5 CM - 956 nm -663 nm -437 NM -644 mm -829 NM - 870 UM -276 nm - 22 CM -695 A -247.0 NM -1 A -435 um -415 um -59 mm - 514 A -374 MM -11 mm -158 mm - 240 MM - 45 cm - 573 MM -870 cm - 742 MM - 224 cm - 944 um - 9 A -356 um -744 CM -782 NM -588 A -407 UM - 449 CM - 37 um -848 nm -780 UM - 660 MM - 608 NM - 105 cm -674 MM -225 cm - 833 UM -565 mm -371 um -986 A - 257 MM -737 CM -928 cm - 31.0 mm - 283 NM - 873 A - 814 UM - 792 cm -596 mm -590 CM - 9 A - 414 MM - 827 NM - 758 mm -568 nm -181 cm -536 CM -439 nm -271 mm - 943 MM - 467 nm -363 cm - 646 UM - 671 CM -87 CM - 850 mm - 805 nm - 755 um - 649 MM - 185 um - 306 NM -914 NM - 929 um -711.5 NM -463 mm -145 nm -275 NM - 21 cm -188 NM - 524 CM - 550 nm -298 CM - 363.5 UM -169 cm - 174 CM - 45 UM -272 mm -779 UM -873 A -540 MM -300 mm - 320 A - 834 A - 319 mm -534.0 cm - 580 UM - 296 mm - 260 nm -520 A - 37 MM - 440 mm - 416 CM -947 nm - 56 um -227 nm -965 nm -74 A -488.0 UM - 518 A -401 NM -323 mm -582 MM - 342 NM -101 um -38 MM - 478 NM -811 UM -574 cm -908 um - 886 MM -767 UM - 631 mm -948 nm -254 UM - 358 CM - 749 cm -149 mm -552 UM -476 cm - 135 nm -812 nm - 572 nm - 446 MM -621 NM -177 A - 130 um - 892 nm - 717 MM - 914 CM -84 NM -506 nm - 967 A -746 um -670 um - 725 NM -630 nm -587 A -300 NM -87 um -449 MM - 866 mm - 948 UM -412 nm - 912 mm -587 UM - 159.0 A -126 A - 628 CM - 201 UM - 765 nm - 605 nm -551 nm - 251 cm -58 cm -279 mm -657 NM -757 mm -700 UM -33 MM - 644 A - 831 A -974 mm - 748 UM - 674 mm - 789 MM - 189 CM -782 A - 642 mm - 77 nm -811 cm - 899.5 MM - 111 A -785 A - 565 NM -612 A - 356 NM -584 cm - 260 mm - 754 CM -363 NM - 497 um - 237 cm - 918 NM - 348 um -998.5 nm -315 NM -262 nm -388 um -647 NM -130 nm -499 A -359 cm -497 mm - 6 UM -33 mm - 385.5 A -167 A - 191.0 nm -597 nm - 342 cm - 679 um -79 nm -431 cm - 215 A -297 mm -793 cm - 218 um - 107 um -356 cm - 595 A -322 CM - 597 mm -810 UM - 741 MM -675 NM -910 nm -847 MM -424 nm -586 CM -399 um - 695 NM -282.0 UM -499 cm -174 nm - 727 um -223 CM -634 A -465 NM -262 nm -373 A -165 mm -182 MM - 827 A - 328 mm -215 NM - 18 cm -194 MM - 753 um - 92.5 A - 299 cm -734 A -964 nm -850 um -843 mm - 697 NM - 453 UM -74 UM -382 mm - 996 cm -905 A - 490 MM - 672 um - 461 CM -861 um -422 nm -902 NM -171 CM - 22 UM - 802 A - 678 um -110 mm - 451 nm -898 MM - 886 NM - 556 A -165 MM - 212 CM - 386 MM - 178 UM -353 MM -149 cm - 180 UM -485 MM -7 UM -903 CM -387 um -957 um -228 A -526 A -694 mm - 733 nm -624 A - 579 NM -129 CM - 531 mm - 173 A -314 CM - 515 CM - 887 mm -186 mm - 448 um -234 MM -442 CM - 212 MM -794 MM -163 um - 679 CM - 353 NM -623 MM - 865 NM - 722 CM - 389 mm -911 CM -402 NM -205 mm - 276 MM - 46 um -600 NM - 539 UM - 483 A -966 MM -27 um - 897 MM - 433 UM -815 um -675 cm - 855 nm -884 UM -600 MM - 374 CM -560 UM -314 um -919 NM -696 NM -654 nm -99 MM -733 cm -708 CM - 795 NM -325 CM -805 A -365 MM -790 nm - 301 um -563 um -41 UM -806 MM - 690 CM - 494 CM - 174 nm - 15 NM -235 UM -749 A -508 UM - 161 MM - 268 A - 238 UM - 332 A -930 A - 917 nm - 884 cm -505 A -339 CM - 776 UM -83 um -747 cm - 489 CM -952 NM - 782 NM - 766 CM - 815 nm - 462 A - 752 UM -266 A -722 nm -959 mm - 218 NM - 572 CM -404 CM - 388 um - 239 um -646 UM - 851 mm - 722 MM - 147 cm -138 MM -898.5 A - 126 UM - 855 um - 49 um - 73 um -939 MM -243.5 CM - 604 cm -448 UM -234 nm - 549 NM - 665 MM - 457 MM -719 NM -963.0 um - 223 um - 565 UM -725.0 NM -67 um - 488 A -55 nm - 417 MM - 883 nm -173 mm - 768 MM - 103 nm - 523 MM - 543 CM - 541 UM - 26 cm - 192 A - 19 cm -675 um -154 cm - 847 A -576 MM -754 nm -176 nm -653 mm - 356 mm - 712 MM -232 um - 467 mm -787 MM -163 UM - 134 CM - 957.0 nm - 888 MM -311 NM -314 CM - 948 um -403 um - 331 CM - 889 A -182 MM -36 NM -137 CM -529 mm - 224 um -143 UM - 455 mm -386 CM -543 nm - 415 mm -69 um -339 nm -787 nm - 711 mm -114 CM -417 um - 61 mm -872 nm -695 mm -879 CM - 554 nm - 476 A - 563 CM - 250 um - 106 NM - 210.5 NM -563 nm -658 UM -791 MM - 761 A - 77 MM - 660 nm -703 CM -477 A - 456 cm -579 nm - 634 um - 583 nm -428 CM - 154 um - 15 um -224 cm -453 um -39 A - 635 um - 912 nm - 660 A -273 cm -615 UM -775 nm -946 NM -440 A -513 CM -749 UM -146 MM - 737 NM -307 nm - 179 CM - 876 nm -143 UM -330 UM - 13 um - 71 cm - 644 A - 138 A -428 UM -345 NM -470 NM - 986 um - 840 NM - 863 A -12 UM - 672 MM - 792 nm - 260 nm - 210 cm - 217 um - 742 nm - 156 MM -260 nm -7 MM -315 MM - 994 MM - 993 nm - 861 mm - 180 mm -152.0 MM - 709 UM - 725.5 MM -433 NM - 661 UM -231 mm - 130 MM -244 um - 72.0 mm - 434 NM - 21 CM -135 A -395 A - 509 UM - 582 mm - 38 mm -844 um - 534 A - 535 cm -287 CM -744 A -357 mm -419 CM -526 mm - 470 um -677 um - 514 MM - 708 NM - 731 nm - 849 nm -620 CM - 718 cm - 918 CM - 174 UM -469 mm -765 mm -919 MM -423 NM - 573 CM - 248 A -408 um -441 um - 882 A -506 UM - 668 UM - 461 UM - 525 nm -832.5 NM - 225 MM -868 CM -8 UM - 674 UM - 314 mm -707 mm -782 MM -912 um - 470 cm - 454 cm -169 CM -75 MM -787 mm -214 cm -665 CM -113 cm - 27 NM - 583 NM - 520 nm -163 UM - 689 um -522 A - 982 MM -312 A - 759 A - 406 cm - 160 mm - 250 cm -873 cm -868 nm - 110 CM -315 nm - 244 nm -713 NM -416 nm - 415.0 nm - 854 MM -57 A -337 UM - 285 NM -308 nm -548 MM -255 MM -438 UM -995 mm -164.5 mm -432 NM -670 nm - 169 UM - 522 MM - 667 A -185 UM - 415 A -419 mm - 927 NM -717.0 nm -649 mm -129 MM -552 CM - 264 UM - 319 UM -861 nm - 663 UM - 71 UM -653 MM - 878 UM -494.0 cm - 10 CM -915 nm -153 nm - 86 A -251 CM -240 cm - 896 MM - 855 cm - 678 mm -152 NM -652 mm - 953 mm - 862 nm -953 MM - 56 um -717 cm -339 cm -693 NM -755 um - 943 UM -147 cm -608 nm - 490 NM -250 um -348 A -418 nm -610 UM -525 um - 323 UM -932 A - 356 MM - 774 MM -278 um -496 nm -687 UM -528 mm -423 mm - 870 A - 242 UM -426 um - 903 um - 795 NM - 426 MM -198 nm -461 nm -70 um - 238 cm -712 nm - 705 A -768 NM -192 A - 244.0 cm - 836 CM - 601 UM - 579 mm -59 UM - 754 um - 411 UM -371 MM - 298 MM -467 um -432 CM - 892 MM - 355 UM -994 UM - 711 nm -985 MM -192 cm -817 um - 498 CM - 494 CM -97 MM - 843 NM - 854 CM -528 UM - 746 MM -711 cm -482 nm -268 MM -217 MM -49 MM -2 um -358 CM -146 um - 558 UM - 946 A -947 NM -80 cm -116 MM -267 A -173 MM - 275 NM - 556 nm - 942 cm -368 MM - 13 UM -99 um -923 nm - 405 MM -267 cm - 61 CM -528 nm -646 NM - 923 cm -43 mm - 355 NM - 292 CM - 931 NM - 598 nm -667 A -813 UM - 674 nm -654 MM -354 NM - 726 UM - 489.0 A - 901 UM -283 nm - 817 cm - 583 um -227 um -56 cm -570 CM -771 NM -198 cm - 607 UM - 509 um - 786 CM - 303 um - 559 um - 709 CM - 238 um - 157 cm - 836 MM -184 A -192 mm -693 A -652 mm - 544 um - 688 UM - 135 A -996 A -168 mm - 765 CM -847 mm - 907 nm -781 A -809 nm -327 NM -852 CM - 285 UM -620 CM -66 mm -445 UM - 644 MM -552 A - 182 NM -613 um - 198 um -43 UM -326 NM -499 cm -935 NM -426 nm -295.5 um - 302 um -418 UM - 826 mm -408 CM - 783 mm - 480 A -401 mm -334 CM -89 um - 644 NM -864 A -212 UM - 387 cm -201 mm -99 nm - 350 um - 796 mm -105 UM -845 CM -466 MM - 999 NM -566 A -382 A -222 CM -890 MM -332 MM -169 NM - 338.5 mm -329 nm - 317 nm -955 mm - 315 NM -261 cm - 37 CM - 588 A - 514 cm -891 MM - 386 cm -650 CM -831 A -335 cm -604 um - 314 um -739 NM - 46 A -824 CM -85 NM -505 A - 766 MM - 4 A -410 nm - 184 cm -951 A - 985 cm -851 NM - 974 NM -815 cm -538 nm -369 um -917 nm -774 A - 282 MM - 466 MM - 606 cm -165 nm - 442 CM -109 NM - 274 A - 354 MM - 863 UM - 354 NM -658 mm -991 mm -613 NM -64 A - 796 NM - 162 NM - 27 nm -676 CM - 7 NM -572 nm -19 um - 185 nm - 223 MM -127 CM - 8 NM - 144 CM -825 mm - 863 cm -345 CM - 70 cm -403 A -791.0 um -166 mm -895 MM -886 nm -703 um -227 UM - 514 NM -851 A - 519 mm - 305 CM -943 UM -336 nm -5 A - 102.0 nm - 1 CM -493 MM -114 nm - 534 mm - 628 um - 29 mm - 908 um - 433 NM - 447 CM - 835 nm - 915 NM -351 cm - 804 CM -639 nm -663 um - 73 A -407 um -163 A - 874 A - 831 MM -365 A -726 mm -604 A - 528 um - 877 CM -622 NM -903 nm -926 mm -303 MM -172 mm - 475 NM - 992 NM - 976 cm -971 NM -939 nm -345.5 NM -470 A - 7 CM -691 mm - 689 A - 885 UM - 350 cm -31 mm - 266 A - 960 mm -688 UM -541.0 A -985 mm - 930 nm -137 A - 158 A -516 NM -417 nm -705 CM - 911 um - 964 um -613 UM -178 mm - 262 A - 453 MM - 648 UM - 153 CM -768 UM - 79 nm -36 mm -222 UM - 217 A - 707 NM - 539 CM - 4 um -818 UM - 681 A - 418 UM - 690 nm - 266 UM -566 NM - 345 NM -77 um -394 UM -459 mm -358 um -84 NM - 295 NM -928 um -205 MM - 175 mm - 63 UM - 918 cm - 48 MM -979 CM - 14 MM -318 mm -743 MM - 616 UM - 463 NM -241 A -368 CM -772 NM -992 CM -424 MM -867 UM - 107 UM - 634 cm -356 CM - 177 UM - 610 MM - 350 NM - 16.0 A -190 CM - 641 CM -977.0 UM -553 UM -421 mm -262 um -247 CM - 769 nm - 992 mm - 385 nm -234 NM - 581 nm - 5 MM -321 um - 999 MM -641 um - 828 nm - 48 cm -910 um - 587.0 UM - 205 NM -212 MM -956 mm - 62 NM - 319 nm - 361 MM - 694 nm -634 CM -85 um - 598 A -592 nm -667.5 um - 436 mm -344 UM -723 CM - 930 UM -522 MM - 639 A - 307 UM - 817 CM - 208 CM - 326 cm - 601 UM -898.5 UM -610 MM -289 mm - 991 MM - 27 A - 962 NM -425 UM -729 mm -456 nm -23 nm - 256 cm - 544 um -97 A - 859 UM -533 mm - 263 cm -555 UM -380 A -212 CM - 480 A -592 CM - 638 A -296 nm - 515 A -872 mm -266 cm - 120 MM -470 UM - 311 MM -771.5 CM -128 cm -181 NM - 657.0 NM -486 um - 849 um -110 MM -49 nm - 527 UM - 123 um - 527 MM - 479 cm - 31 CM - 705 nm - 608 UM - 67 NM - 56 cm -364 CM -263 A -68 NM -992 um -572 cm -966 cm -29 nm -39 NM -954 mm -719 CM -223.5 UM -567 UM - 572 um -366 cm - 553 nm - 765 cm - 384.5 UM -699 UM -940 MM - 742 MM -780 CM - 708 CM - 556 MM - 529 NM - 39 NM - 799 um -445 UM -219 mm - 412 um -135 nm -598 NM -671 NM - 652.0 NM - 624 CM - 995 mm -318 CM -734 NM - 690 um -853 nm - 787 A -740 A -488 cm - 926 UM - 133 MM - 792 CM - 375 NM - 743 MM - 233 NM - 268 CM -612 UM -900 A - 770 NM - 528 MM -465 UM - 726 mm - 71 NM - 537 A - 256.0 nm -724 CM - 541 UM - 195 NM - 401 CM - 446 um - 110 um - 998 UM -781.5 A - 633 CM - 741 UM - 700 um -750 UM -635 NM -752 MM - 317 CM -499 MM -764 NM -46 A -327 um -182.0 um -859 MM -549 nm - 150 nm -916 mm - 154 NM - 750 A - 507 cm - 186 UM -320 A - 4 CM -949.5 MM -588 nm - 202 CM - 954 mm -230 CM -604 nm - 219 A - 383 cm - 649 NM -845 UM -799 A - 308 NM - 107 cm -993 UM -566 NM -490 MM - 139 MM -994 nm - 105 UM - 165 nm -767 CM -537 MM - 695 UM -576 CM -55 CM -781 nm -766 A -663 NM -317.0 UM - 741 um - 281 mm - 366 UM - 969 um -736 NM -732 A - 431 NM -803 cm -262 CM - 984 cm - 283 um - 442 CM - 85 A -777 UM -484 um - 737 MM -191 UM - 938 mm - 123.5 um -806 MM -882 NM - 51 UM -731 NM - 553 NM - 128 mm - 583 MM -589 A -529 cm -260.0 mm -885 um - 842.5 nm -104 mm -417 mm -235 UM - 78 NM -337 NM -792 MM -36 CM - 428 CM - 289 um -290 um - 512 MM - 513 NM -760 UM - 391 nm - 964 MM - 88 CM - 894 cm -507 MM -417.5 cm -191 cm - 63 A -991 cm -759 cm - 73 nm - 241 A - 885 MM - 933 nm -367 mm - 942 um -348 UM - 343 A -407 MM -516 UM - 860 um - 875 MM -401 UM - 229 um -715 NM -957 cm - 769 um -9 CM - 358 A - 329 NM - 696 um - 93 mm -324 NM -792 mm -556 UM - 265 cm - 200.5 um - 65 MM - 619 UM - 673.5 nm -725 cm - 192 A -492 UM - 950 CM -264 A -656 A - 436 A - 387 UM -84 A -81 cm - 228.5 NM -172 cm - 683 nm -900 NM - 266 mm -174 mm -41 mm -991 NM - 4 nm -415 nm - 207 mm - 562 mm -489 um - 663.5 nm -747 A - 165.5 nm - 502 NM -162 A -907 mm -268 A - 738 nm - 612 A -554 nm -803 um -674 cm -765 um -815 A - 354 NM - 632 UM -685 um -784 UM - 412.0 A -57 NM - 950 A - 837 um -145 mm - 643 MM -414 nm -255 cm -729 cm -186 mm -92 um - 168 CM - 933 nm - 704 nm - 808 UM - 697 nm - 996 um - 720 cm - 788 NM - 238 CM -34 NM -578 nm - 963 A -712 nm -473 MM - 791 MM -237 A - 224 nm - 22 mm - 470 MM - 207 nm - 620.0 MM -456 mm - 224 cm -477 nm -406 MM -380 nm -212 A - 179 A - 63 NM -74.5 mm -678 cm -123.5 cm - 975 UM - 511 UM -857 A - 21 um - 379.0 UM -265 cm -780 cm - 801 A - 135 nm - 495 mm - 750 CM -491.5 MM -851 CM - 211 MM - 96 CM -372 CM - 372 NM -402 CM - 617 mm - 982 NM - 499 UM - 919 cm - 630 mm - 403 um -854 mm -62 UM - 401 CM - 14 mm -667 NM - 134 um -981 NM -586 UM -72 nm -486 CM -258 A -54 cm - 268 cm - 422 cm -328 NM -530 A -315 nm - 962 NM - 776 NM - 867.5 UM -834 MM - 380 um -245 UM - 578 um - 783 A -257 CM -781 mm -634 CM - 268 nm - 635 CM -251 MM -195 um -233 CM - 721 NM - 12 A -338 UM -526 mm - 963 mm -960 CM -479 mm -502.5 mm - 335 MM -972 um - 267 mm -880 A - 142 um -519 cm -748.0 cm - 524 NM -552 um -83 MM -651 um - 212 NM -351 MM - 743 um -496 um -292 CM -648 um -258 UM -629 A - 708 nm - 695 nm - 807 um - 161 cm - 930 mm - 246 CM -729 MM - 778 MM - 235 cm -336 MM - 68 nm - 267 CM - 434.5 cm - 556 CM - 333 nm - 95 cm -101 cm - 631 um - 899 mm -116 cm -745 A - 174 A - 653 mm - 904 MM -215 A - 257 mm -511 nm - 628 um - 688 cm -506 CM -747 NM - 831 NM -105 nm - 363 NM - 741 cm - 514 UM -221 CM -437 mm -302 A -29 MM -775 cm -703 CM -110 mm -473 MM - 61 NM -158 MM - 217 UM -910 cm -746 cm -446 A -266 MM -125 A -820 nm - 788 mm - 691 NM -445 NM - 972.0 CM -221 A - 45 UM - 750 cm - 349 um -875 cm -965 nm - 761 cm -953 A - 846 mm - 289 um - 541 MM - 73.5 um - 914 UM - 464 CM - 481 A - 205 mm - 738 MM -837 cm - 324.5 NM - 551 CM - 736 nm -500 um -704 NM -467 CM -134 MM - 287 MM - 759 nm -953 nm -556 cm - 68 um - 33 um -530 um -125 UM -445.0 nm - 108 mm -61 NM - 562.0 MM -607 A - 889 NM - 545 mm -562 nm -755 UM - 405 UM - 962 cm -197 A - 315 MM -101 CM - 623 A - 943 cm -28 MM -987 mm - 529 NM - 474 A -258 UM -474 NM -2 cm -219 A - 58 MM - 679 NM - 217 nm -361 A - 924 NM -569 um -422.0 CM -969 MM -786 mm - 350 A - 445 um - 270 MM -341 mm -490 mm -269 A - 683 MM - 174 cm - 530 NM - 890.5 NM -523 cm -202 nm - 753 A - 136 um -276 A -88 nm - 969 CM -486 MM - 356 CM -285 NM - 550 um - 949 nm -997 um - 295 CM - 910 NM -869 UM - 364 cm - 987 NM - 592 MM - 665 UM - 263 um -20 MM -910 MM - 678 CM - 627 cm - 922 UM - 327 um -334 UM - 764 NM - 873.0 um - 494 mm - 508 nm - 397 cm -980 UM -788.0 nm -440 um - 921 MM - 862 MM - 272 mm - 436 MM - 252 MM - 399 CM - 86 mm -797 UM - 245 NM -293 mm -629 UM - 705 mm - 583 cm - 325 UM -387 NM - 581 um - 548 NM -764 A -161 A - 876 mm - 336 CM -117 CM -593 um - 230 um -888 nm -964 um -872 MM - 952.0 A - 625 um -717 nm -267 um - 332 A -2 um - 919 mm -683 UM - 75 MM -797 um -288 um -456 um - 459 UM - 648 CM - 641 NM - 990 MM -389 cm - 925 NM -392 cm - 262 mm - 821 MM - 43 MM - 859 um - 791 mm - 5 um -326.5 MM -769 um -591 cm - 997 MM -578 CM -539 nm - 772 mm - 952 MM -377 mm - 551.0 MM - 54 mm -108 MM - 323 CM -637 NM -311 UM -418 A - 85 nm - 38 um - 708 A -633 NM - 433 UM - 271 cm - 541 MM -556 nm - 736 A -839 mm - 620 cm -923 CM - 685 um - 816 mm -448 um - 243 cm - 339 MM - 262 NM - 188 NM -604 CM -918 UM -37 CM -659 nm - 615 A -534 um - 88 mm -913 NM - 467 UM -280 A -209 cm -204 um - 303 A -335 UM -101.0 UM - 581 NM - 327 um - 580 nm - 214.5 NM - 503 mm - 909 UM -395 NM -572 um - 744 A - 379 um - 844 mm - 818 MM -908 UM - 149 A - 159 nm - 238 UM - 620 nm -658 um -992 A -561 CM -113 nm - 33 um -256 NM - 849 cm -14 cm - 417 MM -231 NM - 521 CM -517 um -647 NM - 451 um -278 A - 662 NM -975 MM -42 um -250 A - 532 MM -631 MM - 905 MM -462.5 NM -137 UM - 59 nm - 563 um -825 A -671 mm -923 UM -210 cm -497 nm -812 CM -526 MM - 516 MM - 595 NM -905 NM -29.5 MM -801 um -944 A -634 A -197 UM - 67 CM - 699 UM -383 mm -104 MM -619 CM - 147 mm -880 mm - 722 MM - 179 CM -117 CM -610 um - 785.0 UM -587 A - 400 UM - 193 cm - 987 MM -86 um -773.5 CM - 607 cm - 475 CM - 106 um -61.5 UM - 708 CM - 766 A - 342 UM -540 UM - 184 UM - 584 A -938 cm -69 MM - 741 A - 928.0 MM -451 UM -369 UM - 753 NM -675 CM - 338 A - 836 nm -822 nm -696 UM - 408 NM - 736 mm - 73 A -11 CM -227 cm - 518 A -159 MM -706 um -782 NM - 876 cm - 135 um -992 UM - 591 um - 779 NM - 764.5 mm - 531 MM - 884 nm - 514 cm - 519 nm - 744 NM -572 um -419 mm -978 UM -235 CM -289 CM -459 UM -911 UM - 926 MM - 375 UM - 505 um -704 NM -947 UM - 420 mm -884 cm - 210 MM -220 CM -581 nm - 509 NM -964 UM - 623 nm -396 NM - 470 mm -373 CM -789 MM - 879 nm - 298 nm - 166 A - 837 A -824 cm -834 NM -365 CM - 112 CM - 232 A -862 CM -383 mm - 766.5 A -659 NM - 583 nm -945 um - 34 UM -174 MM -84 NM - 790.5 CM -124 cm -484 um - 355 mm -122 A - 947 MM -730 CM -400 CM - 310 um - 56 NM - 408 nm -834 A -30 UM -831.0 um -76 cm -668 UM -522.0 cm - 39 um -349 cm - 580 cm -392 A -659 cm - 333 um -695 mm - 921 NM - 705 A - 774 mm -996 CM -476 CM -999 CM -134 NM - 894 um -98.0 CM - 262 mm -563 mm -27 A -113 UM -416 CM - 628 cm - 620 nm - 869 MM -397 UM -223 um -343 um -775 A - 419 um - 504 mm - 228 MM - 771 A -359 cm -791 MM - 102 mm -316 A - 316 A - 449 cm -286 NM -20 UM -785 cm - 162 nm - 236 CM - 45 UM - 344 nm -149 NM - 202 mm -413 A -546 UM -342 cm - 453 um - 495 A - 529 MM -984 nm - 301 mm - 442 MM -400 A -196 CM -681 CM - 841 MM -526 A -900 um -96 um - 744 CM -901 NM - 132 cm -787 CM - 668 um - 112 UM - 178 UM - 568.5 UM - 717 UM -136 UM - 892 nm -95.0 A -478 nm - 17.0 CM - 889 A -224 A - 526 UM - 128 MM - 918 CM -861 nm -583 A - 858 mm - 110 A -958 A -331 UM -345 NM -77 UM -127.0 cm -435 MM - 448.5 um - 117 um - 352 mm -138 mm -736 MM -722.5 A -217 um - 850 CM -329 UM - 497 UM -213 UM -217 um -908 cm -63 mm - 877 MM -180 cm - 772 nm - 986.5 um -368 UM - 61 MM - 521 cm - 771 A -411 A -206.0 nm -325 um - 261 mm -183 nm - 997.5 A -302 A -410 UM -504 MM - 906 NM - 779 cm -213 CM -536 um - 643 nm - 775 NM -105 CM - 684 mm -155 um - 607 um - 21 UM - 793 A -981 um - 620 nm -1000.0 cm -460 um - 961 cm - 589 mm - 474 nm - 106 A -361 nm -163 NM -16 CM -758 nm -123 cm -75 NM - 263 MM - 74 um - 154 UM - 79 cm - 470 UM - 694 mm - 395 NM -191 um - 89 mm -549 UM - 286 cm -163 CM -507 mm - 844 mm -3 um -884 cm -13 cm -577 MM -557 um -424 MM - 94 CM -239 mm -667 A - 997 nm -311 cm - 291 NM -811 cm -939 UM - 505 um - 377 cm -780 mm - 188 NM - 361 A - 382 mm -345 NM -161 UM -228 NM - 528 CM -33 NM - 375.5 mm - 71 mm -141 nm -995 MM - 420 cm - 827 CM -334 cm - 348 A -57 A -167 NM - 834 CM -1 UM -447 MM - 872 CM -98 CM - 22 MM - 408 NM -696 nm - 810 NM - 811 CM - 731 CM - 553 um -432 cm - 857 cm -501 NM - 972 UM -244 CM -9 um -483 um - 739 nm -287 CM - 556 MM - 424 UM -878 um - 953 mm - 125 CM -486 UM -778 MM - 608 cm -1000 um -522 NM -599 um -144 A -929 nm - 757 cm - 265 A - 919 NM - 654 um - 634 CM -89 cm - 823 cm -224 A -333 A -58 CM -781 NM - 988 cm -710 UM - 942 A -434 MM - 889 MM - 781 um -41 MM - 23 MM -257 MM -385 A -21 CM -43 UM -184 nm - 673 NM - 638 CM - 894 CM - 945 UM - 287 A - 865 um -309 CM -825 CM -617 UM -417 UM -605 mm - 417 nm - 29 CM - 879 um - 39 um - 387 A - 554 MM - 775 cm -731 MM -291 nm - 876 cm -896 UM - 242 cm -151 cm -940 A -76 cm -102 nm -799 cm - 954 NM - 896 UM -260 NM - 729 NM -641 mm -352 nm -388.5 CM -684 cm -884 A - 971 CM -127 CM - 595 NM -397 um -613.0 mm - 605 A -128 nm -856 CM -912 mm - 496 um - 918 NM -169 CM - 359 MM - 225 um - 845 nm - 205 A - 688 A - 472 NM - 840 CM - 311 UM - 30 MM -491 NM - 812 NM - 146 nm - 512 A -329 NM -472 NM - 757 MM -975 NM -200 mm -817 UM - 295 A -425 UM -388.0 CM - 919 CM -855 mm -36 UM - 523 UM -12 UM -328 cm -39 UM -268.5 mm -75 UM -373 NM -176 cm - 510 UM - 7 nm - 219.0 CM - 273 NM - 581 mm - 654 nm -15 mm -63 NM - 757 CM - 983 A -553.5 NM - 734 mm -719 cm - 934 MM -991 um - 738 CM - 52 NM - 348 MM - 441 UM -864 A -18 mm - 575 A - 910 NM -167 cm -25 um -589 NM -163 CM - 199 CM -322 nm - 633 CM - 267 A - 51 nm - 866 cm -85 mm -314 um - 459 CM -9 UM - 452 nm - 688 um - 138 cm -930 MM - 805 UM - 111 MM -556 UM - 543 um -496.0 UM -66 CM - 373 MM -816 CM - 154 nm - 688 mm -198 UM - 30 A -800 A -982 MM - 644 cm -994 mm -221 CM - 50 nm - 983 CM - 606 UM - 43 nm - 38 um -452 CM -322 NM -707 mm - 198 NM - 250 UM -585 mm - 473 MM -931 CM -125.0 MM -68 NM -55 nm - 44 CM - 342.5 UM - 186 A - 390 CM - 162 NM -221 CM -77 mm - 49 mm -562 CM - 361 CM - 441 um -793 A - 501 UM - 916 cm - 362 A -176 cm -457.5 CM -132 CM - 499 CM -288 UM - 911 NM - 33 A - 652 nm -393 MM -263 UM -551 mm -219.0 CM -377 A -227 NM - 834 cm -401 NM - 571 A -80 A - 595.0 A -239 mm - 359 mm - 58 A - 67 MM - 598 um -137 nm - 998 um - 785 mm - 424 CM -409 MM -469 mm -684 nm - 368 MM -446 um - 965 nm -560 CM - 153 nm - 549 A -867 CM - 791 A -29 um -224 um -665 um - 995 cm - 80 MM - 914 A -178 um - 617 nm -892 MM -961 cm - 631 cm -908 UM -552 um -941 A - 741 cm -959 NM -871 CM -106 nm -572 NM - 423 A -793 um - 876 cm - 772 mm -36 CM -510 um -261 A - 584 cm -779 CM -124 um -694 MM - 547 NM - 524 MM - 292 nm -124 UM -291 CM -771 mm -506 CM - 355 mm - 883 NM - 44 NM - 951 cm -643 um -968 MM - 12 CM - 355 cm - 306 MM - 430 A - 623 NM - 828 MM -229 um -882 UM - 681 MM -304 um -487 nm - 167.5 A -684 mm -248 nm - 439 UM -836 um -749 NM -905 CM -1000 CM - 787 cm - 790 NM - 684 um - 784 NM - 459 mm -463 MM -343 mm -977 A -750 mm - 779 cm -635 um - 724 cm -310 um - 627 um -122 mm -920 um - 100 mm - 149 CM - 16 nm -550 CM - 268 UM -882 MM -977 MM - 447 NM - 545 A - 50 UM -426 um - 741 um -348 cm - 167 A - 857 um - 538 MM -192 A -861 um - 840 nm -665 um -192 um -995 nm -73 nm -477 nm -651 mm -117.5 cm - 110 nm -118 um -925 UM -424 UM -464 mm - 652 um - 722 CM - 147 CM - 813 UM - 319 CM - 998 mm - 169 MM - 399 cm - 956 um -715 NM - 748 nm - 968 CM - 776 A -9 NM - 260 nm - 777 nm -75 um - 308 NM -62 nm -117 A -905 nm - 495 CM - 140 NM - 314 um - 278 A - 30 NM -94 nm -892 CM - 927 NM -788 CM - 625 CM - 758 mm -635 CM -312 A - 445 MM -584 um - 574 A - 536.0 nm -4 MM - 239 MM - 757 MM - 142 um -201 A - 52 CM -252 MM - 330.5 mm - 391 um -696 um - 582 cm -615 NM - 530 NM -262 CM - 903 UM -706 A - 482 NM - 715 CM - 315.5 CM - 890 um - 373 NM -306 UM - 475 A - 76 A - 735 NM -957 MM - 637 um - 507 MM -676 CM -95 A -821 MM - 911 cm -115 NM -33 cm -761 A -419 cm - 173 nm -868 um -11 um - 972 A -95 cm -588 um -648 NM -333 CM - 61 UM - 609 MM - 903 nm -20 CM -889 mm -592 nm -43 mm -521 mm - 346 mm -711.5 NM -569 MM -565 A - 235 um - 414 UM -925 um -431 cm -339 MM - 194 NM -843 CM - 603 MM -844 UM -405 NM -399 nm - 802 cm - 489 A - 328 CM - 164 CM -971 NM -682 um -698 um - 614 CM - 727 NM - 733 um - 173 um - 690 UM - 978 NM -152 A -836.0 NM - 341 UM - 847 MM -159 CM -822.0 cm -386 UM - 865 NM -521 MM - 474 cm - 853 MM - 370 cm -217 cm - 595 mm - 562 UM - 842 CM -812 A -284 CM -217 mm - 865 MM - 601 cm -472 cm -934 UM - 228 UM -344.0 A - 345 NM -77 um -262 A -308 um - 37 A -317 cm -717 UM -550 MM -627 MM - 819 UM - 47 um - 853 um - 557 UM - 907 CM -505 nm - 57 NM - 942 cm -351 nm -438 cm - 370 NM - 415 nm -517 UM - 154 nm - 331 cm -450 nm - 673 UM -954 nm -734 um -286 NM - 233 CM - 692 um - 77 NM - 205 CM - 157 MM - 536 UM -927 A - 256 mm - 354 NM - 665 A -690 nm - 473 CM -795 MM - 802 cm -834 NM -233 mm -610 NM - 533 um - 715 um - 209 nm - 112 CM - 272 mm -490 NM - 838 nm -85 MM -554 CM -59 MM -322 A -575 MM -246 A -508 UM -901 NM -454 CM -831 nm - 505 A -870 mm -697 CM - 860 MM -293 nm - 798.0 A - 334 CM -123 NM - 639 MM - 524 nm - 607 cm -463 um -35.5 UM - 525 NM - 205 MM - 588 UM - 452 A - 360 um -190 nm - 48 NM - 245 cm -945 NM - 806 A - 709 A - 297 nm -687 NM -116 UM -888 A - 729 CM -96 mm - 557 NM - 844 cm - 498.0 mm -546 A -289 mm -49.5 nm -897 um - 980 A - 704 nm - 907 NM - 735 um -59 NM -243 CM - 700 A -660 MM -6 um -133 MM - 598 NM -928 mm -432 mm -631 um -814 um -423 UM -187 um -159 NM - 655 um -792 mm - 936 um - 50 NM -959 um -566 UM -975 UM -594 nm -801 cm -421 A -194 nm - 576 NM -554 NM - 742 UM - 397 um - 936 UM -544 um -421 mm - 29 cm -993 NM - 756 mm -982 nm - 569 mm - 501 MM -984 NM - 541 um -898 A - 638 um - 317 A -515 nm - 711 MM - 928.0 cm -330 nm -584 mm -303 mm - 543 nm - 960 cm - 1 NM -920 CM -874 cm - 713.5 CM -852 MM - 370 mm - 7 CM - 524 A - 495 um -245 cm - 786 NM -792 um -368 A - 205 mm -422 A -594 NM - 750 mm -117 mm - 993 mm - 799 UM - 305 mm -5 NM -809 nm -8 nm -704 um - 109 mm -28 NM -400 A -824 um - 469 mm - 537 um - 415 MM -517 A -857 NM -906 mm -256 CM - 465 MM -694 cm - 20 nm - 58 UM - 783 UM -319 NM - 410 cm - 443 UM - 496 NM -872 nm -487 nm -189 cm - 305 A -309 CM - 703 um - 912 cm -975 cm -928 A -41 CM - 940 CM -594 UM -705.5 um - 790 nm -238 mm -812 CM -437 cm - 123 NM - 929 mm -760 MM -438 nm -402 mm - 962 CM - 200 NM -497 NM -612 NM - 100 mm - 318 um - 328 nm -978 MM -748 UM -862 nm -795 A -109 CM -938 nm - 739 MM - 121 cm - 861 nm -113.5 nm - 818 UM - 789 UM - 225 cm - 273 A -518 um - 185 nm -687 mm -944 A -942 um -887 um - 348 nm -190 nm -474 NM - 311 um - 726 mm - 514 um -451 CM -333 cm -683 MM -276 cm - 87 NM -293 mm -948.5 nm -488 um - 356 CM -407 MM -364 A -533 UM - 492 NM - 151 cm - 871 nm - 944 mm -860 nm - 410 nm - 624 mm - 459 A - 738.0 cm -676 um -882 cm -953 MM - 913 UM - 201 nm -451 nm -754 mm - 451 MM -318 A -389 um - 888 um -963 nm -366 mm -132 CM -872 um - 7 UM - 986 CM -903 nm -221 NM - 254 cm - 107 CM - 688 nm -608 A -317 A - 749 CM -766 nm - 409 NM -21 um - 612 CM - 272 um - 493 mm - 82 UM - 581 mm -393 MM -310 A -488 MM - 211 um -717 CM -5 mm -584 mm -728 CM - 770 MM -78 um -298 nm -963 mm -821 um - 703 UM - 508 mm -358 um -131 CM - 339 nm -83 A - 271.5 MM - 405 cm - 387.0 A - 513 A - 69 UM - 735 CM -148 UM - 748 CM -516 A -167 mm -469 cm - 463 A - 700 nm -383 MM - 495.5 NM - 682 um - 814 cm - 507 nm -526 A -221.0 CM - 465 mm -309 um -138 nm -365 cm - 668 mm -991 nm -875 UM -404 um - 515.0 mm -972 MM -888 NM -618 UM - 418 cm - 739 NM - 532 MM - 282 CM -293 NM - 690 MM -898 mm -954 mm - 847 NM -702 CM -208 CM - 252 MM - 574 mm - 835 A - 159 cm -445 cm -216 NM -779 nm - 963 A - 14 NM - 774 UM - 368 UM -937 A - 888 UM -785 CM - 8 CM - 293 NM -372 mm -66 cm - 838 UM - 19 cm -304 mm - 648 NM - 695 NM -179 mm -72.0 CM - 251 nm -727 nm -2 cm -757 CM -330 nm - 54 A - 993 mm - 738 nm -907 MM - 991 MM - 148 MM - 715 nm -862 UM - 516 NM - 693 NM -207 mm - 660 nm - 496 UM -468 mm - 444 cm - 75 cm -978 CM -180 MM - 282 um -670 UM -710 um - 323 A -395 CM -67 um -103 MM - 729 nm -133 NM - 12 CM - 190 MM - 720 CM -920 MM - 684 A -223 mm - 372 UM -840 um -241 mm -300 NM - 352 CM -105 nm - 310 UM -412 CM -378 cm -164 um - 876 CM - 764 CM - 772 nm -463 mm - 330 A -230 nm -397 mm - 906 nm - 642 mm - 754 cm -144 UM -460 MM - 372 A - 783 mm -443 um - 5 MM - 643 UM - 11 MM -996 cm -351 UM - 738 mm - 384 um -65 A -544 A -264 MM - 174 mm - 998 MM -476 cm - 479 cm - 680 CM -962 cm - 125 nm -415 UM - 665 um -262 mm - 702.0 um -470 um - 507 MM - 432 CM - 814 um -110 um - 991 CM -739.5 A - 15 UM -708 CM -322 um -391 CM - 804 UM -992 UM - 990 CM - 301 mm -250 A -701 A -689 mm -149 UM -703 um - 188 A -837 UM -395 CM -559 um -405 NM -821 UM - 415 A -409 CM - 815.5 cm -882 NM -572 nm - 945 cm -763 CM - 126 NM -782 CM - 152 cm -852 cm -803 A - 541 MM - 737 mm -281 UM - 527 nm - 353 NM -847 mm -319.0 nm -385 nm -838.0 cm -490 cm - 229 cm -21 mm - 540 A -782 CM -78 NM -358 MM - 200 UM -83 MM -64 cm - 539 A - 39 MM -139 UM - 35 nm - 553 CM -447 NM -755 A - 123 A - 576 A - 530 MM -931.0 MM -649 NM -284 UM - 372 UM -177 NM -280 CM - 92 A -890 MM -404 nm - 67 A -596 cm -762 um - 102 mm -758 CM -507 nm - 328 MM -778 NM - 896 MM -652 NM - 454 UM -641 nm - 581 um - 29 UM -182 A - 19 um -864 MM -5 cm -517 MM - 890 nm - 146 NM - 845 nm -834 MM -593 cm -925 nm -198 mm - 448 nm - 170 A - 891 UM - 278 CM - 687 cm -670 CM -164.0 cm -693.5 NM - 515 um -296 A -869 nm -828 CM -202 CM - 886 um -437 um - 180 um -12 A -592 MM -565 MM -265 UM - 104 UM - 350 cm - 986 cm -509 MM -69 cm -189 mm - 423 A -367 UM - 927 CM -818 nm -916 nm -186 mm - 543 cm -374 cm -936 MM -410 CM - 121 CM -52 cm - 192 nm - 353 mm -449 um - 303 MM - 46 um -525 CM - 130.0 nm - 693 um - 724 cm - 965 mm - 471 A -146 um -537 CM - 595 NM - 520 MM - 434 UM - 583 NM -304 cm - 959.5 nm - 862 A -138 UM -260 cm - 541 NM -526 mm -212 mm - 850 A - 45 NM -997 cm - 366 MM - 115 cm - 567 MM - 882 NM - 107.5 nm - 732 NM - 271 MM -634.5 UM - 287 MM - 718 CM - 176 A - 734 NM -823 NM - 402 mm -929 mm - 357 cm - 39 nm -543 A - 578 um -747 cm - 458 UM -51 UM -304 CM - 403 nm - 559 MM -147 A - 137 A - 709 mm -917 mm -456 NM - 626 NM - 116 CM - 42 A -635 cm -738 nm - 99 CM -780 NM - 238 cm - 106 CM - 714 um - 805 nm -839 cm -222 MM - 679 MM - 868 nm - 632 MM -333 UM -614 mm - 764 nm -709 CM - 588 cm - 131 CM - 283 CM - 477 NM - 405 mm -695 cm -944.5 cm -905 mm -9 cm - 376 A -870 UM - 3 cm - 877 MM -40 cm - 222 CM - 342 UM -900 nm - 527 NM - 270 NM - 912 nm -941 NM - 499 MM - 902 MM - 138 mm -350 nm -805 NM - 71 um - 641 CM - 637 CM -950 A -886 cm - 231 A - 231 nm - 542 MM - 285 mm -291 um - 45 CM -116 CM - 551 A - 193 MM -4 cm -884 um - 255 A - 63 UM - 258 nm -519 UM - 806 NM -120 A - 247 A - 459 CM -317 NM - 577 CM - 926 UM - 804 um -729 um - 529 um - 833 mm -336 A -602 A - 1 nm -438 nm - 292 nm -77 UM - 577.0 CM - 504 cm -851 NM -348 um -460 CM - 859 MM -979 MM -437 MM -852 nm -729 NM - 568 nm - 966 cm - 88 NM - 943 mm - 884 UM -534 cm - 304 MM - 7 A - 72 cm - 370 nm -668 cm -818 A -831 nm -743 mm -444 A -979.5 MM -1000 A - 103 mm -615 A -500 cm - 575 NM - 485 UM - 972 UM -407 CM - 182.0 NM -268 NM -543 UM - 444 mm - 382 um -93 nm - 766 nm -173 um -891 cm -975 A -130 NM - 242 MM - 610 cm - 567 nm -287 MM - 730 mm - 946 mm - 365 MM - 623 um -808 A - 905 A - 751 MM - 738 NM -146 cm -529 NM -654 nm - 849 UM - 268 A -559 MM -680 NM -716 mm -592 nm -346 mm -436 CM -63 CM -51 CM - 49 UM -361 nm - 948 cm -746 um - 202 um -79 NM - 486 cm -631 nm - 796 cm - 769 cm - 957 UM - 361 MM -407 mm - 859 UM - 844 NM -863 nm - 234 UM -248 A - 929 MM - 315 um -970 cm -708 cm -690 MM - 306 nm - 942 mm - 264 nm -924.5 cm -575 UM - 324 UM -774 cm - 313 CM -257 um - 720 UM -624 nm -684 NM - 546 MM - 386 A -588 MM - 399 nm -606 A -916 NM -973 mm -267.5 MM - 535 cm -257 UM -415 NM -603 mm -387.0 A - 937 cm - 376 NM - 971 A - 167 A - 287 um -32 mm -703 CM - 966 um - 148 cm - 852 mm -892 A - 917 mm - 232.5 mm -122.5 UM - 216 MM - 33 A - 120 A - 130 CM - 425 UM - 789 cm -758.0 A - 903 um - 138 MM -873 CM - 539.0 A - 657 UM -799 UM -894 NM -923 NM - 731 um -952 MM - 431 nm - 280 nm - 766.0 mm -771.5 um -106 A - 448 UM -713 um -959 um -782 mm - 755 UM -778 MM -816 mm -782 cm -84 CM -17 um -51 cm - 102 CM -924 NM - 46 NM - 326 MM -849 um -722 MM - 512 UM -386 CM -275 UM - 800 cm -711 UM -788 UM -715 mm - 420 mm -708 A -191 UM - 398 mm -765 UM -226 UM -498 UM - 141 MM - 546 cm -669 UM -611 um -462 nm - 83 um -946 MM - 327 cm -743 UM - 787 NM -381 UM -861 mm -679 CM -609 CM - 543 nm - 119 CM - 756 NM - 24 UM - 103 NM - 249 CM -457 cm - 371 CM -626 A - 914 cm -839 um -494 NM -319 um - 900 mm -437 um -16 um - 812 mm -33 um - 394 mm -218 nm - 261 mm - 308 um - 631 nm -388 CM -595 mm - 766.5 NM -282 nm - 72 um - 164 nm - 80 nm - 560 UM - 283.5 mm -613 nm - 274.0 A -269 cm -452 NM -961 mm -295 UM -363 A -515 CM - 335 A -741 UM -141 nm - 273 CM -600 nm -145 UM -385.5 NM -589 CM - 39 A - 227 um - 965 um -239 um - 357 cm -826 UM - 25 UM - 258 MM - 373 cm - 746 NM - 531 NM -579 cm - 667 NM -206 NM - 98 NM - 31 A -299 cm - 194 NM - 432 A -212 UM -623 mm - 552 CM -825 UM -203 A -242 MM - 494 cm -600 UM - 541 A -30 CM -521 um -804 nm - 36 A -780 NM - 273 NM -937 A - 19 NM -736 mm - 813 cm -415 nm -528 mm -308 MM - 16 um -976 nm -213 cm - 910 mm -881 CM -615 MM - 54 UM - 824 A - 83 MM -53 cm - 88 CM - 712 mm -411 NM -567 um -360 cm - 194 A - 977 UM - 587 mm -319 mm - 814 um -742 A - 413 NM - 821 NM - 441 MM - 985 A - 918 NM - 345 mm - 215 NM -561 NM -350 UM - 118.5 NM - 731 UM -983 UM - 212 nm - 837 MM - 958 nm -733 A - 572 MM -82 mm -289 MM -655 um -659 cm -589 cm -616 MM -995 A - 320 NM -931.5 um - 719 MM - 965.0 CM - 867 CM -739 um -238 mm - 470 UM - 696 CM -566 UM -988 um - 922 CM - 245 nm -440 cm - 373 nm -718 mm - 293 NM -42 um -112 mm - 656 NM - 165.0 nm - 920 cm -692 A - 47 CM - 82 CM - 524.0 cm - 459 CM - 954 NM -216 A - 870 NM - 664 UM - 73 mm - 964 NM -433 nm - 760 nm -554 MM - 388 NM - 548 NM -507 CM - 37 MM - 864 NM - 285 nm - 538 UM - 105 A - 182 CM - 576 nm - 778 CM -3 cm - 650 um -757 UM - 508 cm -731 MM -813 cm - 419 um -570 um - 7 CM - 165 um - 50 mm -112 cm - 601 cm - 89 um -976 CM - 538.0 nm -900 cm -515 um - 743 um -990 nm -653 mm -59.5 NM -185 mm -512 NM -241 um - 141 mm - 910 NM - 345 cm -758 A - 595 nm - 249 mm -783 cm -907 UM -71 A -826 CM - 66 cm - 238 NM - 988 mm - 290 UM - 396 A -885 mm - 513 um -139 cm -484 cm - 4 UM -61 MM - 229 um -444 nm -324 nm -799 A - 294 MM - 842 MM - 726 UM - 632 um - 392 CM - 563 cm - 152 um -697 cm -849 um -284.0 MM -46 MM -473 NM -446 CM - 20 CM -386 A -862 A - 27 um - 242 mm - 31 um -127 A - 38 A - 757 CM - 637.0 A - 776 NM -789 nm - 51 mm -878 A -907 cm -131 cm -326 nm - 223 cm - 548 mm - 408 um -967 MM - 206 NM -788 cm -510 NM -526 mm -313 cm -744 UM -190 UM -40 MM - 922 nm -419 A -89 mm - 52 A - 217 um - 515 cm - 414 NM -265 nm - 410 NM - 968 CM - 316 mm -217 CM - 753 nm - 486 UM -318 um -3 mm - 60 NM -522 NM - 827 NM -930 mm - 259 MM -791 A -260 UM -791 NM - 281 nm -525 um - 125 CM - 629.5 cm - 322 um -662 NM -897 um -495 MM -603 A - 136 A - 717 A -371 MM - 311 mm - 170.0 nm -574 cm - 183 NM - 256 cm - 685 NM - 4 CM - 763 nm -973 UM -679 mm - 232 mm -962 cm -319 CM - 184 um -881 mm -140 CM -309 nm - 138 MM -66 cm -425 cm - 816 NM - 930 A -399 NM - 134 um -422 um -126 UM - 785 UM - 209 cm - 387 NM -721 mm -920 NM - 442 UM - 995 NM - 792 cm -139 um - 603 nm - 99 nm - 688 cm -644 mm - 819 um - 980 MM -636 um -530 NM - 890 NM -738 mm - 652 UM - 475 A -416 NM - 257 nm - 218 A -123 A - 903 MM -954 um - 222 mm -19 um - 536 NM - 381 um -124.0 A - 634 CM - 485 mm - 369 MM -93 NM - 792 A - 304 MM - 931 MM -161 UM - 369 um -868 UM - 483 CM - 332 cm - 579 MM - 86 A - 769 um -43 NM - 549 CM - 336 nm -437 cm - 352 A -664 CM -202 nm - 199 um -331 MM - 925 UM - 357 NM - 766 NM - 446 um -984 nm -317 A - 184 cm -773 um -228 mm - 544 MM - 836 NM - 614 A - 520 um -979 mm -96 mm -317 MM - 611 NM - 74 nm -561 A -26 A - 294 nm -347 um -184 NM -107 um - 686 CM - 709 UM -14 um - 467 MM -926 um -346 A - 32 nm -737 UM -978 mm -119 um -708 cm -125 um - 700 nm -344 MM - 568 UM -59 um - 263 MM -65 MM -165 NM -878 cm - 521 NM -494 mm - 868 UM -410 CM - 57 nm -934 cm - 411 NM - 326 CM - 927 UM -221 mm - 717 UM - 985 nm -305 A - 857 A - 49 um -666 um -890 nm - 851 nm - 484 nm - 752 CM - 840 um - 779 MM -1000 nm - 662 NM -409 MM -975 nm -864 um - 362 A -430 CM -716 A -787 CM -791 cm -364 MM - 424 MM - 87 um -672 NM -98 cm -995 nm - 806 A -638 um - 361 NM - 671.0 CM -544 UM - 296 cm -224 cm - 426 mm -516 A - 175 CM - 983 A -847 UM - 805 UM - 996 cm - 688 MM - 141 um -427 um -213 A -297 cm -496 A - 917 A -13 MM - 833 CM -661 A -227 um -993 MM -81 cm - 329 cm -126 um -967 CM - 311 cm -743 nm - 146 UM - 101 A -789 A - 674 UM - 649 cm - 251 A -125 CM - 354 UM -418 UM - 77 cm -252 mm -89 um - 879 MM - 257 nm - 29 NM - 580 cm - 386 NM - 305 CM -185 MM - 945 UM - 399 MM - 849 A -994.5 um -874 cm - 900 A - 88 mm - 7 nm - 432.5 cm -933 A -125 nm - 604 NM - 169 UM - 576 UM -812 nm -252 um -377 CM - 899.5 mm -818 um -91 UM -903 um -900 NM - 630 MM - 456 NM - 559 nm - 706 um -770 um - 150 CM -939 nm -113 CM -767 NM -686 nm - 947 um -435 nm - 932 UM -959 UM - 973 cm -621 nm -623 MM - 255 cm -832 nm -923 um - 11 MM - 123.0 nm -811 NM - 893 A -100 cm -923 cm - 910 um - 22 MM -42.0 um -856 nm - 905 NM - 204 NM - 947 nm -65 mm -600 UM - 737 MM -440 cm - 201 MM -470 CM -672 mm - 256 um - 941 UM -469 A - 691 mm -128 UM -968 A -682 nm - 914 um -333 UM -831 A - 707 MM -721 nm - 462 NM -425 nm - 983 mm - 29 NM - 284 mm - 136 MM -676 NM -602 um -299 mm -105 NM -869 NM - 407 MM -147 cm -640 mm -679 CM - 287 CM -809 um - 574 UM -402 CM -707 NM - 827 A - 970 A - 710 CM - 307.0 nm - 165 UM -858 MM - 477 UM -92 um - 636 cm - 179 um -414 NM - 912 nm - 25 mm - 314 A - 982 CM -635 mm -201 nm - 618 cm -489 NM -824 mm - 406 A -679.0 MM - 432 nm -97.5 MM - 359 mm -932 um - 726 NM -280 CM -208 cm - 802 UM - 863 NM - 227 NM -780 um -15 A -742 cm - 151 cm -54 MM - 664 CM - 234 NM - 583 CM -614 um - 770 A -15 MM -328 MM - 438 um - 759 mm -750 MM -726 CM - 282 NM - 488 CM -201 CM - 175 UM - 72 MM - 733 MM - 506 MM -964 mm - 566 NM - 457 NM - 216 um -555 mm -220 nm - 21 mm -704 MM -404 um - 531 nm -454 um - 455 um - 407 NM - 907 um -551 A -925 CM -599 nm - 806.0 A -80 UM -823 nm - 990 CM - 927 mm - 97 um - 616 UM - 512 CM -358 MM - 517 um - 928 nm - 291 NM -33 MM -893 cm -139 MM -860 um - 994 um -458 mm -82 mm - 358 cm - 292 NM -777 mm - 498 cm - 60 CM -230 A - 471 nm - 402 cm - 787 CM - 614 um - 758 mm - 209 cm -669.0 UM - 698 NM -402 NM - 733 UM -635 NM -98.0 A - 775 CM - 75 A -761 A -498 NM - 38 NM -779 A - 728 NM -996 MM - 905 um - 574 UM -364 cm -77.5 A -259 mm -143 NM - 325 mm - 916 MM -113 UM -268 mm -89 CM - 873 cm - 14 UM - 195 cm -646 nm - 56 MM - 862 A -170 MM -251 A -560 NM - 909 cm -634 CM -323 A - 680 NM -736 MM -79 MM - 960 um -466 UM -51 um -666 CM - 249 mm -998 MM - 43 A -550 UM -135 MM - 793 MM -215 UM -826 MM - 881 nm -967 cm - 914 cm - 587 mm -98 nm - 150 mm -800 MM -768 UM - 531 um - 321 nm - 25.0 nm -269 MM -965 UM - 211 nm -937 CM - 19 um -219 mm - 634 um - 171 um -202 UM -70 UM -929 NM - 401 UM - 339 cm -272 UM - 864 mm - 432.0 nm - 852 A -739 NM - 807 MM -76 nm - 278 MM - 354 CM - 780 MM - 544 A -992 cm -550 MM -901 CM - 121 A -672 NM - 47 nm -441 mm -991 nm - 617 CM - 763 NM -126 MM -584 A -305 UM -904 cm - 35 mm -195 NM -557 um -913 cm - 735 um - 602 MM - 89.0 nm -46 nm -219 A - 970 cm -982 CM - 987 MM - 752 nm -322 nm - 514.0 UM -394 UM - 992 nm - 61 cm - 862 mm -750 nm -698 A -916 CM - 18 nm -500 CM - 302 MM - 589 A - 118 CM - 174 A - 730 UM -241 UM -775 UM -380 UM - 563 nm -89 NM -784 MM - 178 cm - 421 nm -683 mm - 68 CM - 410 um - 135 UM -9 MM - 391 CM -523 nm -445 cm -540 mm - 828 nm -365 CM - 776 UM -6 NM -640 A - 138 UM -1000 nm -51 nm - 773 MM -838 NM - 581 um - 900 MM - 894 CM -808 nm - 102 um -235 UM - 706 MM - 382 mm -812 MM - 596 MM -305 cm -213 MM -513 NM - 548 cm - 24 cm - 609 MM -908 MM - 875 A - 570 MM -543 NM - 911 A - 64 cm - 344 UM - 523 A -925 cm - 651 MM - 422 um -861 MM -910 MM - 357 cm - 19 nm -126 um - 646 nm - 263 A -631 nm - 701 MM - 515 um -343 NM -782 A - 759 um - 273 NM -215 cm -912 um -798 CM -729 mm - 775 nm -294 A -80 nm - 634 um -92 CM -191.0 MM - 549 cm - 467 nm - 778 CM - 364 um - 289 um -525 NM -150 um - 825 CM - 872 NM -526 mm - 348 um -382 nm - 261 NM - 359 CM - 852 um -299 nm -581 UM -41 MM - 799 NM - 482 mm -935 um -73 nm -204 CM - 952 CM - 444 MM -735 A -587 nm -607 NM - 185 um -700 NM - 290 um -725 um - 389 um - 411 A -753 MM - 197 NM -255 MM -742 cm - 284 mm -903.0 cm - 36 cm -284 NM -30 MM - 191 nm - 153 cm -867 A - 345 NM - 425.0 nm -936 nm -877 mm -699 CM - 415 um - 63 UM -627 CM -338 NM -494 nm -731 um - 571 cm - 316 cm -383 NM - 383 NM -305 MM -568 um - 142 nm -633 mm - 371 mm - 930 A -311 UM - 810 A - 144 NM - 738 A - 323 UM - 945 mm - 82.5 cm -296 NM - 916 mm -817 UM -943 cm -647 CM -938 cm - 610 UM - 188 MM -481 cm - 747 A -973 MM - 316 A -808 NM - 714 MM - 972 MM -786 cm -534 MM - 463.0 nm - 924 cm -77 um - 383 NM - 546 UM - 353 MM - 375 UM -553 mm -233 um -855 cm - 38 nm - 720 CM -126 A - 223 UM - 540 um -191 nm -12 mm -160 NM -852 um -27 nm - 258 NM - 335 um - 882 CM - 879.0 cm -770 UM - 83 MM -77 um - 546 nm -730 NM -937 CM -14 cm -478 UM -683 UM - 46 A -147 UM -995 nm - 60 mm - 895 um -449 cm -923 A -38 NM - 879 UM - 769.0 UM -886 UM - 102 nm - 779 A -341 nm -566 MM - 161 um -263 MM - 163 A -943.0 UM - 749 NM -366 mm - 179 UM -715 cm -308 nm - 790 um - 527 NM -662 um -989 mm -655 um -221 nm -750 A - 384.0 A -28 UM - 83 cm -432 A - 809 CM -546.5 MM -349 CM -606 A -682 mm -478 nm -173 cm -815 MM -690 MM -12 UM -85 A -485 UM -743 UM - 910 MM - 809 mm -426 MM - 225 nm -315 cm - 587 cm - 248 A -275 um - 988 UM - 482 nm - 148 NM -438 UM -431.5 UM -425 CM -125 mm - 594 UM -32 CM -480 MM -226 A -2 NM -283 mm - 294.5 A -965 nm -584 nm - 194.0 CM -712 um -255 UM - 373 NM -945 NM -135 um - 224 cm -581 NM -443.5 um -33 um -36 nm - 822 cm - 170.5 UM -620 NM - 284 MM -662 MM - 664 um - 402 NM -482 NM -450 A -986 UM - 734 MM -387 UM -677 NM -498 mm -393 MM -138 MM - 152 A -243 nm -338 um -716 UM - 59 nm -546 UM - 518 UM - 284 cm -34 NM - 723 MM -749 NM -609 NM - 449 mm - 106 A - 731 CM -364.0 A - 514 nm -935 nm - 812 NM -587 MM -393 cm - 241 MM -863 mm -2 NM - 633 mm -608 A -911 um - 711 MM -651 um -861.5 mm - 733 UM -147 um - 533 A -520 nm - 940 MM -364 um -369 mm -260 cm - 55 um -991 CM - 996 mm -536 cm - 594 UM -437 nm - 334 NM - 910 CM -698 nm -748 NM -595 mm -984 mm - 820 nm - 594 CM - 354 A - 918 MM - 395 mm -733 A -254.0 nm -646 nm -367 cm -693 A -129 MM -365 cm -502 UM - 979 CM -174 mm - 695 nm - 387 nm -474 A -776 NM -237 cm - 720 um -720 NM -668 A - 667 MM -475 cm - 905 A - 93 nm -441 nm -783 MM - 139 UM -12 cm - 74 nm - 484 CM - 201.0 mm - 290 CM - 76 NM -176 UM - 187 NM -97.0 CM -718 A -748 CM - 640 um - 333 cm -292 NM - 339 NM - 668 A - 15 mm -15 um - 563.0 um - 949 cm - 953 mm - 733 mm -749 A -712 MM -830 CM - 699 cm - 557 um - 192 NM - 526 NM -456 NM - 364 cm - 46 UM -488 UM -992 UM - 765 MM -766 UM -233 A -76 cm -74 nm - 911 UM - 30 UM - 814 NM - 774 mm - 714 MM - 48 A - 763 mm -472 NM -855 NM - 448 A - 178 CM -489 UM - 858 A -902 cm -821 UM - 627 CM - 43 nm -822 CM -195 MM - 963 nm - 231 mm -883 UM - 666 cm -774.5 UM -412 A - 846 nm -587 NM - 477 mm -200 um - 400 cm -679 mm - 690 CM - 206 A -869 mm -963 MM - 389 um - 55 NM -896 nm - 158.5 CM -645 cm - 571 cm -583 UM -882 A - 680 cm -489 cm -559 um -534 um -108 cm -805 CM - 425.5 cm -879 um -570 A - 548.0 UM - 134 mm -72 MM -291 um -336 MM - 771 MM -680 nm - 547 nm -156 NM - 143 NM - 909 cm -998 NM - 772 CM -497 A - 409 MM - 397 mm - 103 nm -749 NM -326 UM - 129 CM -1000 CM - 318 NM - 182 cm - 817 NM - 15 MM -588 um - 380 MM -458 cm -847 um - 69 mm -967 mm - 495 NM - 144 UM - 276 A - 453 A -424 MM - 460 NM - 209 UM -63 CM -522 cm -893 CM -825 CM -834 mm -595 nm - 72 NM - 699 UM -293 UM - 917 um - 490 mm -509 A -595 MM - 1000 CM -66 um -100 mm - 817 um -957 NM - 492 NM -810 mm - 901 A -45.5 um -505 um -115 A - 506 MM -704 A -947 UM -843 NM - 554 NM -487 UM - 491.5 UM - 100 nm - 628 NM -787 CM -16.5 CM -60 um -191 nm -845 MM - 295 NM - 608 nm -659 mm -477 UM -803 A -283 cm -930 um - 715 A -612 MM -152 um - 29.5 mm - 421 nm - 151 cm -740 UM -584.5 MM -56 NM - 15 UM -191 cm -530 MM - 699 MM -481 um - 862 UM - 353 um - 211 A -166 CM - 649 MM - 639 MM - 353 NM -451 nm -454 mm - 346 NM -755 um -900 nm -943.5 nm - 613 cm -11 um -310 NM - 945 UM -597 UM -284 mm - 362 NM - 735 UM -209 NM - 287 mm -152 nm - 366 cm - 437 A -635 NM -754 CM - 152 mm - 718 MM - 58 um - 445.5 um - 871 CM - 723 UM -14 mm -230 MM - 134 CM - 731 MM - 986 NM -661.5 nm - 670 MM - 125 um -610 mm -602 A - 356 A - 6 um - 891.5 CM -821 um - 319 MM - 801 A -109 A -34 UM - 979 CM - 325 mm - 444 NM - 495 A -474 nm -182 NM -395 mm - 352 NM -643 UM - 909 UM -399 NM -214 cm -809 NM -45 A -790 CM -367 cm -172 NM -130.0 NM -462.0 MM -895 nm -794 NM -935 CM - 801 UM - 738 nm - 286 A -172 mm -362 MM -753 NM -69 mm - 23 NM -870 nm -397 mm -456 um -810 A -729 um - 372 mm - 479 UM - 912 um - 803 MM - 418.0 NM - 983 UM -601 NM -293.0 mm - 160 MM - 341 UM - 872 um - 425.5 NM - 24 um -605 nm - 489 um -292 CM - 28 cm -256 um -824 cm - 331 um -960 A -405 cm -673 cm -532 cm -187 mm -931 um -641 nm -998 A - 353 um - 940 cm -691 NM - 108 MM - 842 A -784 nm - 26 cm -46 UM -215 CM -739 nm -831 A -866 UM - 631 um -816 MM - 401 um - 493 UM -533 nm -417 NM -511 cm - 392 NM - 576 A -786 cm - 111 nm -638 um -534 UM -779 nm - 363 A - 124 A - 478 NM - 287 cm -187 A - 569 MM -238 A -868 A -569 um -165 CM -633 CM -926 CM -953 MM - 990 CM -152 A - 933 A -906 NM - 719 NM -339 um - 272.5 mm -944 CM -777 CM - 220 NM -832 mm -204 cm -663 um - 224 mm - 756 cm -489 um - 436 CM - 328 NM -550 mm - 160 cm - 289 nm - 829 A - 911 A -770 cm - 361 nm - 928 A - 141 mm -535 UM - 565 um -193 um - 660 CM - 501 MM -433 CM -101 NM -742 nm -190 A - 709 CM - 820 MM - 969 CM - 392 MM -246 UM -725 cm -681 nm -275 A - 659 A - 982 MM - 579 mm -514 A -346 cm - 352 nm - 386 nm -540 MM - 594 A -738 mm - 143 cm - 510 nm -875 cm -984 CM - 15 A -50 cm -384 mm - 944 CM -191 A -269 nm - 631 NM -599 nm -528 MM -182 cm -574 MM -705 UM - 98 cm - 357 UM - 634 mm - 725 CM -383 NM -37 cm -256.0 A - 947.5 MM -896 UM -396 cm - 869 A -693 CM - 721 UM -28 MM -327 MM -513 nm - 348 A - 284 mm -495 CM - 608 MM -983.0 UM -638 NM -296 NM - 615 mm - 453 UM - 836 um - 527 nm - 63 NM - 280 nm -645.0 MM - 619 NM - 854 UM -651 nm - 206 nm - 845 mm -47 MM - 533 MM - 468 cm - 105 cm -915 A -490 mm - 841 um - 965 MM - 462 nm -650 cm -319 UM -198 UM - 944 A -577 A -813 A - 828 nm - 914 cm -921 nm -781 MM - 127 nm - 39 cm - 67 A - 864 mm -220 A - 400 nm -836 um - 895 NM - 637 um - 205 um - 149 UM - 548 cm - 898 nm - 801 MM - 682 CM -144 NM - 481 mm - 456 CM -65 nm - 117 mm - 159 CM -668 nm - 898 NM - 472 A -773 nm -453 mm -531 mm -654 CM -336 NM -263 um - 673 um -570 MM -111 nm - 152 NM -495 CM -241 mm -717 MM -146 mm - 561 nm -859 CM - 743 CM -899 um -821 cm - 519 um - 919 mm - 725 cm -467 nm -369 UM - 166 mm - 544 CM -900 MM -682 mm - 655 A -560 nm - 129 CM - 666 UM - 563 um -581 mm -416 nm - 714 UM -663.5 UM - 838 UM - 326 A -833 nm - 935 cm -286 nm - 593.5 NM -142 CM - 697 cm -766 NM - 368 um -664 cm - 752 CM -105 A - 104 A - 837 um - 456 um -821 UM -205 mm - 2 cm - 658.5 mm - 70 UM - 794 CM - 860 NM - 29 NM -734 cm -565 UM - 978 A -130 UM - 265 UM - 51 NM -41 mm -917 CM -813 cm - 657 NM - 73 nm -107 cm -829 CM - 454 mm -942 CM -202 UM -788 nm -861 cm - 989 nm -325 MM - 57 NM -160 MM -601 NM - 367 MM - 738 nm -3 cm - 353.5 MM - 471 cm -959 NM -588 CM -460 nm - 838 UM -689 cm -515 CM - 528 MM -939 MM - 593.5 um -666 A - 138 CM - 180 nm -328 nm -23 um - 116 nm -170 NM -587 nm -674 um - 980 um -557 UM - 628 nm -690 NM - 958 UM -684 A - 437 mm - 909 nm - 202 CM -216 NM -513 nm -98 mm -777 UM -244 um -415 UM -832 nm - 648 A -55.5 CM -770 um -374 A -152 UM -916 A - 455 um - 962 UM - 122 NM -10 NM - 765 A - 907 A - 110 A - 586 nm - 378 um -15 mm -325 MM -274 A - 33 MM - 375 UM -150 um - 477 CM -737 MM -546 mm -340 A - 973 mm - 148 nm - 965 A -423 UM -706.0 um - 230 um - 572 A -38 CM -671 UM -783 um - 679 CM -646 A -844 mm - 910 A -629 A -265 MM -966.5 NM - 935 CM - 344 mm -693 mm - 474 NM -864 mm -78 cm -452 um - 476 UM - 856 um - 937 NM - 736 nm -480.5 MM - 867 um - 992 um - 39.0 um - 461 nm -261.0 CM - 403 cm -374 NM -670 nm -696 mm -700 CM - 223 A -55 CM -325 mm -852 NM -951 CM - 276.5 A -458 nm - 526 MM -653 cm - 204 nm -995 NM - 233 um -389 nm -277 UM - 722 CM -492 A -747 A - 11 cm - 4 mm - 380 A -805 cm -477 mm -192 cm - 468 A - 463 CM -922 um - 781 CM - 949.5 cm - 304 NM - 225 mm - 405 UM -536 mm - 916 MM - 396 um - 476 MM -316 NM -252 UM -753 nm -943 cm -976 um - 865 NM -526 mm - 689 A -142 UM -737 A -912 UM - 183 MM -361 mm -670 NM -484 CM - 8 cm - 169 mm - 891 MM - 850 MM -421 mm - 743 cm - 911 CM -405 CM -368 A - 356 mm - 991 um -554 mm - 221 cm -753 CM - 634 A - 533 mm - 658 cm - 578 mm -599 um - 815 um -511 um -377 cm - 761 mm - 647 um - 855 nm - 584 NM -162 cm - 206 A - 338 um -886 um -957 um - 137 cm -309 NM - 608 cm - 208 um -16 mm -27 UM - 216 cm -762 nm - 685 CM - 832 nm - 9 nm - 453 CM - 861 nm - 95 UM - 381 nm - 167 CM -260 CM - 137 A -905 MM - 365 cm -352 CM - 220 um - 185 nm -756 CM - 897 NM - 855 cm - 915 MM - 928 NM - 213 CM -65 NM - 120 cm -581.5 MM -63 A - 540 mm -612 nm - 528 nm -226 mm -260 A - 94 CM - 293 cm - 587.5 um -7 nm - 796 NM - 596 nm -327.0 MM -964 nm -988 A - 667 cm - 817 MM -818 nm - 572 mm -487 nm -712 nm - 358 A -490 cm -503 um - 676 UM -116 UM - 192 mm -270 UM - 33 um -756 CM -562 MM -819 A - 260 A -551 CM -63 cm - 25 nm -115 nm -461 nm - 785.0 NM - 55 nm -349 cm -823 UM -509 MM -200 UM - 347 NM - 329 mm -352 nm - 332 mm - 592 UM -628 CM -794 nm - 725 MM - 352 UM - 205 MM - 176 UM - 304 UM - 829.0 mm -879 UM - 301 A - 997 NM -856 um - 802 A - 701 um - 174 mm - 941 UM - 647 nm -1 CM - 660 cm -701 UM -48 NM - 957 NM -551 CM - 602 um - 69 cm - 237 CM - 825 CM - 831 mm -251 A - 105 CM -612 nm -346 cm - 176 nm -168 um -698 NM - 903 um -354 cm -40 A - 960 um - 754 um -801 cm - 567.0 UM -686 mm -42 A -260 MM -911 NM -22 um - 988 mm -227 um - 253.0 UM - 655 mm - 732 um -666 nm - 23 UM -954 A - 67 NM - 337 um - 686 cm -565 nm -802 um - 403 NM -366.0 nm -3 NM - 617.0 um -716 NM -368 cm -774 MM -76 cm -109 MM - 812 cm - 541.0 um -163 UM - 862 CM - 147 mm - 990 MM -757 nm -788 UM -522.5 CM - 613 um -863.0 um - 839 MM -615 CM -634 A -181 mm - 114 um - 293 nm -951 UM - 653 MM - 113 MM - 666 cm - 103 um - 178 nm -802 nm -480 nm - 961 cm - 595 UM -67 UM - 370 NM -605 MM - 911 CM -596 cm -328 CM -274 nm - 189.5 nm - 669.0 UM - 568 cm -495 UM - 709 mm - 182 MM - 591 CM -785 UM -858 nm -227 cm - 372 A -182.5 cm - 892 CM - 120 cm -130 NM - 940 UM -729 cm - 546 nm -326 A - 874 UM -428 NM - 621 UM -504 cm - 145 mm -309 NM - 930 nm -743 UM -256 mm -472 mm -316 mm - 16 A - 828 CM - 899 UM - 237 CM -635 nm -809 cm - 665 nm -28 um -591 MM - 59 mm -473 NM -671.0 NM - 313 UM -922.5 NM - 769 NM -577 A -341 MM -585 A - 147 MM - 360 NM -630 A -75 NM - 574 UM - 29 NM -254 UM -222 MM -924 MM -367 mm - 521 CM -382 cm -169.0 cm -614 MM -30 cm - 52.0 MM - 527 um - 616 A -407 MM -607 CM - 603 mm -510 NM - 442 nm -365 NM -14 mm -832 um -196 cm -847 NM - 98 CM - 960 A -135 um - 183 um - 256 NM -973 mm - 264 um - 829 cm - 586 UM - 38 mm -574 MM -682 nm - 612 NM - 442 A -727 um -611 cm - 558 cm - 755 NM -354 CM -84 nm -836 MM -874 CM - 369 mm -158 CM - 797 mm - 687 um - 694 nm - 781 cm -802 CM - 476 MM - 241 mm -162 um - 491 CM - 543 NM - 809 mm - 75 CM - 350 UM - 498.0 cm - 374 MM - 21 cm -631 MM -55 A -258 A - 907 UM -3 nm -289 CM -947 um -773 UM - 206 A - 96 NM - 899.0 NM - 284 cm -764 mm -414 CM -530 A - 142 NM -608 UM -645 CM - 268 nm - 381 nm - 998 NM - 767 cm -784 mm -796 cm -617 A -154 NM -411 NM - 194 NM -296 MM -476 mm - 278 NM - 415 CM - 523 cm - 252 NM -790 nm - 376 MM - 597 MM - 576 NM -865 UM - 745 NM - 843 um -561 nm -667 mm -831 UM -445 NM -17 A -117 nm -373 A - 380.0 MM -897 CM -946 mm - 152 MM - 834 UM -34 MM -88.0 um -143 um - 489 A -110 mm -162 um - 417 um - 453 NM -414 um - 600 mm -248 cm -862 um - 859 UM -259 cm -965 UM - 375 UM - 302 cm - 578 um - 461.5 cm - 151 UM - 349 A -213 UM -394 UM - 165 NM -770 mm - 983 cm - 397 MM - 987 cm - 194 A -259 NM -385 um -742.0 CM - 834 cm -512 NM -713.5 mm -263 nm - 214 cm - 416 cm -80 UM - 606 mm -277 cm - 275 CM - 983 NM -95 um -980 MM -926 UM - 37 UM -796 mm -506 CM -880 mm -956 UM -231 um - 338 A -219 CM - 694 UM - 468 CM -43 NM -455 cm - 773 mm -786 mm -779 A - 65 nm -782 um -78.5 CM -84 nm -640 um -239.0 UM -82 cm - 203 CM -28 A - 941 cm - 180 UM - 479 NM -347 CM - 824 A -318 A - 146 CM - 873 CM - 837 nm -259 A -744 um -365 nm -604 nm -616 NM -573 NM - 713 UM -781 um - 917 mm - 78 cm - 84 nm -526 NM - 739 MM - 148 CM -363 mm -601 mm - 91 mm -333 CM -700 MM -970.5 nm -729 CM -725.5 MM - 242 MM - 526 cm - 696 nm -830 cm - 792 mm -608 A -164 um - 269 MM -966 CM -850 MM -231 UM -375 MM -510 mm -807 UM - 425 um -292 cm -655 cm -554 A -129 UM - 993 cm - 635.5 cm -764 A -92 MM - 795 nm -223 mm -783 CM -590.5 cm - 827 mm - 524 nm -261 CM - 449 um -829 A - 852.5 nm - 159 cm - 477 A -996 UM - 546 mm -566 nm -458 MM - 998 NM -308 UM -749 A - 641 MM -90 CM - 921 MM - 559 um - 623 NM -414 A - 251 NM - 770 A -533 cm - 213 A -629 UM -785 NM - 936.0 CM - 71 MM - 535 A -254 MM -340 CM - 196 nm - 748 A -175 nm -216 cm -310.5 NM -607 mm -970 UM - 341 cm - 290 cm - 826 A -897 UM -987 um - 396 UM - 137 NM - 481 UM -601 mm - 994 A - 611 cm -388 cm - 458 nm -847 mm - 795 NM - 799 NM -10 cm - 142 um -837 mm -618.5 UM -166 mm - 735 CM -177 NM -383 mm - 180 A - 914 nm - 714 NM - 329 CM - 766 MM - 767 CM -868 MM - 483 CM - 337 CM - 639 NM - 112 mm -523 NM - 31 CM - 971 NM -695 um -639 NM - 363 MM -781 A - 843 A - 627 mm -26 A -566 nm - 161 nm - 191 CM -80 NM -622 UM - 804 UM - 292 mm - 564 A - 177 nm - 448 UM - 542 MM - 948 A -50 um -66 A -316 um -993 A - 228.5 UM -859 um -823 nm - 994 UM - 479 NM -873 um - 94 cm - 242 A - 253 A -407 cm - 352 NM - 209 cm - 533 CM -572 A - 431 um - 560 MM - 770 CM - 864 UM - 440 A -864 NM - 413 NM - 965 A - 79 um -237.0 MM - 58 um -68 um -722 A - 84 nm -670.0 mm -396 mm - 233 nm - 223 mm -316 MM -79 NM -902 A -865 mm - 907 CM -563 mm - 915 um -724 nm - 50 um - 522 um -101 CM - 951 cm -578 NM - 536 mm -630 nm -921 NM -416 A -265 mm - 256 UM - 191 A -235 cm - 67 cm - 525 MM -942 A -294 A - 984 CM -872.5 MM -779 MM -651 nm - 43 NM -402 MM - 479 nm -421 A - 4.0 UM - 977 UM -876 mm - 329 UM -195 mm -868 mm -699 NM - 286 CM -718.0 CM - 234 UM -564 A -746 cm - 87 um -951 NM - 118 A - 13 MM - 236.5 UM - 726 nm - 37 UM - 344 MM -629 CM -105 um - 85 A -769 UM - 533 mm - 40 nm -862 um - 558 CM - 435 nm -832 mm -461.0 mm - 151 CM - 300 UM -53 nm -327 A - 306 mm -822.5 mm - 578 CM - 287 nm -1 UM - 699 nm -394 nm -333 mm -925 cm -452 CM - 648 A -34 UM - 779.5 nm - 312 um - 111 NM -41 CM - 173 um - 988 A -263 nm -289 NM -907.5 um -717.0 MM -7 mm - 97 cm - 688 CM -355 MM - 500 A - 264 um - 8 CM -673 UM - 881 MM -530 nm -696 um - 888 A -259 MM -855 um -91 mm - 271 UM - 138.0 A - 735 MM -420 CM - 207 UM -672 um -919 MM -330 MM - 768 NM -656 CM - 655 MM -581 mm -892 um -115 um -607 nm - 975 cm -975 UM - 551 mm - 432.5 mm - 156 CM -417 cm -528 nm -748 cm - 959 MM -710 nm -262 CM -192 CM -294 um - 727 CM - 27 UM -193 cm - 928 um -986 um -686 nm - 433 cm -508 nm - 696 UM -774 um - 732 nm -450 mm -701 NM -27 NM - 577 MM - 25 CM - 575 A - 222 NM - 448 MM -733 CM -184 um - 831 UM - 97 cm - 151 cm - 394 CM - 803 CM -256 MM - 42 A -795 NM -517 NM - 469 A -955 um -674 um - 172 um - 518 nm -556 NM -139 UM -143 um - 862 CM -332 nm -930 CM -698 MM -831 um -571 cm - 422.0 NM -748 nm - 496 nm -665 CM -736 nm - 183 CM - 463 mm - 541 NM -239.0 CM - 212 A - 411 CM -956.0 CM - 448 mm -224 NM -430 UM -424 NM - 541 um - 371 CM - 85 cm -794 MM - 314 UM - 782 MM -550 nm - 715 MM - 259 NM - 553 A -10 MM - 109 UM -293 cm - 360.0 mm - 238 MM -269 um -978 nm - 659 nm - 535 cm - 101.0 um -160 um - 535 um - 158 A - 982 um -40 CM -355 A -693 UM - 754 um - 715 um - 797 nm -539 MM - 6.0 CM - 5 NM - 779 NM - 918 A - 307 cm -129 A -58 nm -251 cm - 248 cm -570 nm - 336 mm -830 UM -897 NM - 776 cm -141 CM -491 A - 118 mm -114 mm -733 CM - 310.5 um -87 um -299 nm - 797.5 um - 469 MM - 74 nm - 533 mm - 243 A - 640 UM -521 nm -421 cm - 166 A - 18 cm -131 UM - 349 um -503.0 um - 608 um - 211 UM - 666 NM -832 NM - 440 um -82 CM - 40 UM -817 CM -161 nm -623 A -927 mm - 629 A -109 nm - 684 CM - 711 um -460 NM -977 um -359 CM - 192 cm - 652.0 UM - 203 A -866.0 mm - 779 CM -356 A - 200 NM - 388 UM - 456.5 MM -959 cm - 142 nm - 344 um -308 NM -193.5 nm - 434 NM - 961 nm - 678 CM -442 nm - 10 UM -494 cm - 221 MM - 208 cm -321 A - 216 mm - 698 cm -785 um -955 A - 350 um - 803 cm - 427 CM - 214 MM -871 UM - 24 NM -41.5 mm - 487 um -497 A - 201 nm - 236 UM -454 mm - 63 CM -498 NM - 213 nm - 948 MM -694 um -709 NM - 770 um - 418 mm -764 CM - 545 CM - 464 nm -758 CM -495 nm -916 UM - 388 CM -535 mm -25 NM -400 NM -321 UM -237 A -620 nm -296 UM - 887 cm - 890 cm -153.5 nm - 508 NM -627 UM - 852 A - 485 NM - 318 MM - 98 um - 754 A - 24 nm - 946.5 MM -443 um -350 NM -786 UM -218 NM - 303 um - 268 MM - 227 mm -355 um -534 cm - 527 UM - 67 mm - 362 CM -580 cm - 310 UM -782 NM -949.0 um -626 CM -389 um - 586 cm - 141.0 cm -84 CM -556 A - 836 um -547 mm - 933 cm -624 CM - 327 NM -121 UM - 808.5 UM - 644 A -440.5 CM - 922 nm - 711 MM -768 A - 495 NM - 25 um -550 UM - 48 cm - 341 nm -156 nm - 168 mm - 845 UM -15 nm - 128 CM - 67 MM - 483 NM - 195 cm -806 UM - 586 mm -402.5 A - 160 CM - 764 MM - 903 NM - 267 mm - 856 MM -912 nm - 749 nm - 961.0 UM - 279 MM - 305 MM - 157 um - 336 A -158 nm -982 A -905 um -396 mm - 692.0 mm - 66 CM - 139 nm -384 CM - 394 NM -653 nm - 262 NM -349 mm - 293 UM -623 nm - 320 cm - 111 NM - 22 mm -543 CM - 428 MM -772 UM -848 nm -572 cm -565 CM - 474 UM -196 CM - 575 A - 132 MM - 42 NM -349 nm - 935 CM -138 mm -995 A - 434 CM -649 nm -501 UM - 507 UM - 551 CM - 485 CM -105 NM -328 A -11 mm - 965 NM - 462 NM - 970 um -161 MM - 587 CM - 243 um - 316 NM - 236 A - 659 mm -953 cm -858 NM - 811 cm -964.0 NM -440 UM - 916 um - 340 A - 690 A - 204 CM -408 CM - 195.5 cm - 804 cm - 670 UM - 588 CM -102 A - 816 CM -746 cm -658 cm -32.0 A -202 nm - 820 CM -646 CM -641 mm -243 nm - 166 cm -946 mm -107 UM -673 NM - 971 nm -697 MM -890 NM - 121 cm -9 nm - 39 MM - 536 A -278 nm - 950 A -798 MM - 777 cm - 58 NM - 365 A -271 CM -36 mm -937 cm -981 UM - 594 MM -424 MM - 401 MM -361 UM - 205 A - 454 cm -807 CM -594 UM - 313 NM - 560 mm -843 UM - 520 MM -274 mm -705 CM -952 UM -231 CM - 342 nm -148 nm -208 UM -406 A - 340 MM -894 UM -383 um -219 UM - 191 nm -251 nm -151 um -282 MM -552 MM -841 CM - 861 NM -392 A -195 um - 309 CM -264 cm -480 NM - 21 CM - 149 mm - 452 nm -427 CM -846 NM -614 cm -610.5 um -564 nm - 418 NM -787 cm -944 UM -76 MM - 551 cm - 583 UM - 921 UM - 584 cm -328 A - 798 nm -390 cm - 878 NM - 364 mm -262 um -35.0 UM - 387 mm - 101 NM - 15 um - 899 nm - 742 cm -797.5 cm - 253 nm - 639.0 A -630 A -5 um - 657 nm -98 A -309 um -841.5 CM -336 NM - 630 A - 366 MM - 848 A -487 cm - 482 cm - 585 UM - 310 A -421 A -28 cm -348 A -766 A - 790 um - 480 nm - 927 CM -973 um -80 MM - 695 MM -61 nm - 230 MM - 541 um - 361 NM -276 um - 968.5 um - 882 UM - 779 cm -588 nm - 758 UM - 687 nm - 282.0 mm -863 mm - 234 um - 326 cm -753 um - 540 mm -963 cm - 829 cm - 311 mm -839 MM -170 A - 735 nm -768 UM -842 NM - 166 cm - 701 cm - 760 UM -36 MM - 875 UM - 548 UM - 424 UM -844 CM -268 MM -579 mm -306 cm - 26.5 NM -619 NM -863 um -320 cm - 156 UM -542 cm - 739 MM - 888 mm - 733 mm - 114 mm -375 NM - 992 nm -737 MM -974 cm - 110 um -650 MM - 594 um -76 cm -85.5 UM -214 cm - 555 A -553 um - 713 MM -524 um - 615 A - 993 UM -233.0 nm -284 MM - 520 A -496 CM - 674 cm -4 UM - 353 mm - 675 UM -960 A -195 A - 531 MM -357.0 CM - 833 NM -152 nm - 195 mm -291 cm - 499 NM -826 mm - 946 nm -356 UM - 164 nm -906 nm -513 mm - 790 NM -263 MM -840 UM -119 A - 585 CM -479 um -627 nm - 525 CM -187 A -267.5 A -232 um -173 UM - 147 UM -857 A - 606 cm - 336 um - 27 CM - 236 cm - 954 mm - 96 cm -229 um -324 cm -403 A - 233 A -866 NM -954 mm -729.0 A -130 MM - 853 um - 996 um -245 A -523.5 CM -313 mm - 904 cm - 533 mm - 236 A - 739 um - 91 mm -730 nm -280 NM - 969.5 cm - 201 CM -221 nm -788 CM -467 mm -560 A -573 CM - 189.0 NM -788.5 MM -907 cm - 722 um - 142 UM - 470 CM - 198 cm -645 NM -78 MM - 842 CM - 988 CM - 81 nm - 174 CM - 964 mm -994 mm - 615 um - 909 UM - 631 MM -639 NM -57 MM -572.5 A -963 cm -763 cm -759 NM -45 nm -872 CM -751 mm - 788 cm -623 UM - 649.0 A -46.0 A - 74 CM -615 MM -236 UM - 50 A - 778 um -539 MM - 766 NM - 254 CM -700 nm - 694 mm -689 nm - 816 MM - 251 mm -776 A -783 NM -226 mm - 534 um - 494 MM - 1000 MM - 990 MM - 369 um - 458 mm - 798 NM -553 um - 87 nm -149 nm -106 um -163 NM -497 nm - 111 um -389 A - 82 um -89 um - 688 MM - 660 UM - 860 MM -983 CM - 390 UM -721 cm - 527 UM - 744 nm -27 cm - 680 MM -904 CM -608 cm - 39 nm -447 NM -727 UM - 468 NM -95 NM -484 UM - 3 cm - 73 um - 313 nm -335 mm - 616 A - 669 NM - 702 A - 964.5 mm -82 NM -361 NM - 261 MM - 736 um - 676 nm - 361 A - 280 cm -278 cm -846 cm -61 NM -528 um -332 mm - 155 NM -862 NM -47 MM -742 nm - 713 mm -926 nm - 438 NM -718.5 mm - 820 UM - 560 UM -494 CM - 13 A - 839 A - 88 nm -513 cm - 748 A -213 A - 98 mm -676 MM - 649 UM -676.0 MM - 212 UM - 113 CM -812 cm -15 um -598 A -374 mm -350 A - 810 cm - 114 nm - 800.0 cm -689 UM -785 MM -622 CM -733 mm - 98 cm -667 cm -586 UM - 442 UM -907 nm - 861 A - 668 MM - 153 mm - 172 NM - 296 NM -434 UM - 16 um - 887 UM - 790 UM - 571 CM - 762 UM -375 UM - 738 nm - 743 MM -12 mm - 96 cm -90 nm -621 A - 518 NM - 176 um - 280 UM - 575 mm -530 A - 894 NM - 742 mm - 488 um -365 NM -362 CM -891 NM - 473 NM - 790 CM - 725 um -57 CM - 195 um - 41 NM -801 CM - 122 CM -764 A - 659 nm - 105 mm - 148 MM -338 UM -249 MM - 430 CM -324 cm -39 mm -805 NM -957 MM - 376 CM -926 NM - 795 CM - 964 CM -58 um - 154.5 cm - 184 mm - 514 um -905 MM - 693 MM - 294 MM - 860 CM - 338 UM - 185 nm -885 NM - 432 cm - 468 mm - 544 MM - 191 CM - 272 um -678 mm -626 UM -728 CM - 442 MM -137 NM - 475 nm -635 cm -163 MM - 422 nm - 630 mm -862 cm -373 nm - 287 NM - 845 A -172.5 um - 111 CM -457 mm -813 nm - 413 MM -486 NM -337 um - 442 CM -670 um - 6 cm -550 UM -748 CM - 287 CM -375 nm - 54 mm -63 MM - 317 um -634 MM -803 UM -455 MM - 423 um -328 A - 577 CM - 351 mm - 596 MM - 873 A -132 um -763.0 NM -342 NM -345 nm -958 CM - 383 um - 874 nm -443 um - 936 CM - 68 mm -861 CM - 367 nm - 359 MM - 240 CM -434 CM -466 NM -953 MM - 43 cm - 57 cm - 487 um -55 NM - 402 UM - 242 A - 465 MM -628 nm - 13 um - 556 cm - 589.0 NM -672 nm -897 cm -867 nm - 772 UM - 985 mm -790 UM -445.5 A - 175 MM -205 cm -851 um -70 MM -472 NM -229 CM -426 cm -942 NM - 832 nm -124 um -831 um -911 MM - 785.5 UM - 621 CM - 205 CM - 63 MM -115 UM - 518 MM -362 NM -547 NM -655 NM - 537 CM - 512 MM -42 CM -657 CM -86 cm - 968.5 UM -721 mm - 266 CM -898 UM -741 NM - 195 um - 951 UM -335 um - 643.5 CM -265 um -555 NM -725 nm -586 nm - 257 A -253 A -286 MM -148 UM -465 um -884 um - 730 cm -534 um - 812 NM - 785 mm -419 MM - 884 A - 806 MM - 233 nm - 487 mm -463 MM -611 mm - 933 MM - 282 cm - 593 A - 640 A -513 cm -169 UM -537 mm - 163 UM -786 um - 719 A -807 um -85 CM - 880 A -980 cm - 984 NM -353 um - 911.5 mm -1 mm -808 cm -880 um -738 um -362 A -409 UM -222 cm - 925 UM - 595 NM - 70 MM -310 MM - 627 MM -927 cm - 950 mm -25 NM - 183 MM - 168 nm -439 MM - 136.0 um -838 CM -427 MM -607 CM - 87 NM -603 MM -979 A -898 nm -851 A -722 um - 296 CM -278 nm -537 UM - 436 MM - 362 MM - 457 NM -487 UM -841 A -542 mm -120 NM - 146 CM -324 nm -484 um -407 nm - 4.5 MM - 924 nm -729 A - 182 MM - 888 UM -32 mm -392 UM -635 um - 3 UM - 109 nm -233 CM - 775 A -35.5 cm - 907 A - 673 MM - 841 mm -918 um -325 nm -956 mm -500 NM -959 CM - 473 um -153 cm - 364 CM -593 MM - 766 MM - 165 nm -539 NM - 536 A -522 UM - 812 NM -456 A -221 CM -962.0 CM - 498 A -609 UM - 287.0 cm - 867 um - 549 mm - 626 A -266 UM -224 A - 773 NM -287 A -589 MM - 678 UM - 699 cm -391 NM -252 um -831 cm - 479 MM - 654 mm - 971 NM - 55.5 NM - 555 cm -595 UM - 765 UM - 528 um - 829 cm - 945 UM -884 um -889 MM - 897.0 cm -26 mm - 629 UM - 152 mm - 349 mm - 182 CM - 459 cm -453 cm - 989 um - 551 nm -944 UM -435 mm - 963 CM - 459 MM -488 cm -183 um -457 nm - 206 mm - 800 mm - 611 A - 685 A -250 nm -162 mm - 572 UM -273.5 CM - 980 cm -340 NM -25.0 mm -20 CM - 402 CM - 777 cm - 893 A -425 cm -615 NM -80 NM -942 A - 855 MM - 818 MM -596 A -732 UM -385 nm -230 CM -81 nm - 781 um -990 MM - 85 mm -902 cm -373 um - 844 um -459 um - 309.0 NM -871 CM - 519 MM - 534 mm - 684 NM - 145 MM -79 cm - 883 CM - 77 CM - 786 CM - 390 mm - 296 MM - 804 cm - 649 CM -744 mm - 240 NM - 516 mm - 317 nm -842 um - 747 MM -986 cm -38 mm - 498 A - 266 UM - 601 UM -268 UM -171 MM - 112 cm - 836 cm - 354 CM - 968 A - 289 NM - 473 A - 57 cm - 73 CM -447 MM -320 NM - 835 NM -387.5 CM - 745 UM -762 A -687 MM -832 CM - 984.0 CM -122 nm - 154 nm - 606 mm - 457 cm -727 NM - 58 NM -783 UM -595 UM - 30 MM - 8 mm -228.5 mm - 582 CM - 265 MM - 988 nm - 174 A - 266 mm - 651 A -199 nm - 797.0 cm - 304 um - 505 MM -780 um -230 MM -855 nm - 527 A -838 NM -38 um -987 CM -492 um - 316 nm -855 UM - 570 mm -174 nm -994 CM -909 nm - 712 cm -999 um -436 UM -810 MM - 157 MM - 300 UM - 552 MM -15 um - 919 UM -842 A - 10 NM -182 NM - 918 um -782 nm - 473 A -882 CM -917 nm -789 mm -227 nm - 736 nm - 879 A -405 CM - 544 mm - 142 um -497 nm -917 A - 573 um - 579 CM -341 A -831.0 A - 1000 A -79 mm - 517 A -322 UM - 827 nm - 747 um - 864 UM - 160 cm - 159 A - 108 A - 78 mm - 171 UM - 778 MM -107 mm - 572 um -382 UM -546 CM -249 MM -226 A - 164 A -253 um - 911 MM - 427 nm - 911 CM -274 nm - 407 mm - 520 MM -925 mm - 860 A -999.0 um - 636 mm - 152 nm -498 NM -237 MM -37 MM -751 nm -987 um -554 CM -721 cm -333 um -791 CM -475 cm -23 CM -979 MM - 662 um - 526 um -848 cm -877 nm - 182 NM -37 UM -313 um -358 nm -540.5 UM -686 CM - 306 A -632 CM -14 A -795 cm - 268 UM - 843.0 cm -700 UM -97 cm - 584 A - 870 UM - 503 MM - 924.0 CM -733 CM - 438 MM - 91 cm - 817 NM -909 A - 284 um - 564 um - 608 mm - 554 A - 663 CM -813 UM - 535 A - 257 MM - 2 A - 359 cm - 660 mm -199 nm -35 UM -858 A -758 mm - 193 UM - 307 NM -593 nm -274 MM -688 UM -722 mm - 965 mm - 791 um - 349 CM -829 UM -112 um -20 um - 270 NM - 613 MM - 647 cm -685 mm -648 NM -871 cm -140 MM - 937 A - 788 um -933 nm -744 A -835 mm -799 nm - 782.5 MM -256 UM -141 A -161 mm - 819 nm -800 um -611 UM - 127 UM - 8 MM - 513 UM - 28 NM - 51 NM -923 UM -668 CM - 643 CM -663 mm - 19 A -784 mm - 67 A - 923 cm - 79 cm - 643 CM - 464 cm - 371 A - 857 A - 872 NM -764 UM - 902 CM -282 MM -263 NM - 614 mm -426.5 A - 845 NM - 112 nm -281 UM - 510 CM -785 um - 726 um - 903 nm -874 UM - 1 A - 37 UM -27 cm -342 nm - 811 UM - 740 mm -347 mm -438 cm - 394.5 mm - 17 um -23 MM - 150 A - 738 um -906 mm - 827 um - 961 mm - 118 UM - 411 NM -544 UM -301.0 NM -672 UM -76 nm -557.0 cm - 436 UM -243 cm -818 NM - 121 CM - 532 CM -851 mm -349 CM -267 UM - 687 nm - 379 um -163 cm -856 um - 5 nm -939 cm - 8 CM - 241 UM -611 cm -713.0 NM -478 CM -71 MM - 187 mm - 115 NM -319 NM -69 UM -801.0 nm - 623 MM -693 mm -433 mm - 905 CM - 13 um -688 mm -695 MM - 223 NM - 365 cm -971 NM - 547 um - 569 nm - 809 CM - 195 mm - 990 cm - 294.0 mm -860 um -954 mm - 537 A -134 CM - 817 nm -259 mm -99 nm -660 nm -219 A -53 UM - 513 MM - 535 um -559 nm -553 um -648 UM -450 cm -781 um -827 nm - 233 um - 341 mm - 858 cm - 952 NM -255 MM -865 CM - 693 mm -672 nm - 430 A -47 MM -958 NM -51.0 cm -418 nm -414 um - 61 cm -187 A - 49 A - 309 NM -262 um -533 NM -219 cm -8.0 UM -8 um -160 UM -167 UM -817 MM -61 MM -62 NM - 484 cm - 395 NM - 189 mm -663 um -723 CM - 906 cm -569 MM - 917 MM -723 NM -155 NM - 558.5 cm -356 A - 479 A -730 A - 861 um - 528 A -963.0 nm -516.5 CM -32 NM -659 mm - 765 A -696 A - 306 CM -290 um - 470 cm -265 nm - 35 UM - 697 UM - 837 um -300 cm - 130 um - 248 nm -494 um - 763 CM - 179 nm - 904 NM - 312 cm -886 mm -451 nm -121 um - 543 nm - 338 UM -935 A -75 CM - 920 nm - 27 cm -358 NM - 883 UM -833 NM - 339 nm -255 mm - 690 nm -248 CM -886 A -761 MM -515 um - 884 A -674 MM -684 A -429 CM - 410 MM - 356.0 A - 993 A - 271 mm -326 A -690 MM -517 cm - 835 nm - 534 NM - 934 mm -557 nm -369 NM -947 nm - 980 UM - 204 cm -384 UM - 626 NM - 890 CM -230 NM -316 A -651 um -757 cm - 412 cm - 375 NM -819 NM -240 A - 863 NM -119 um -411.5 CM -589 NM - 529 A -32 UM -439 A - 621 nm - 104 nm - 959 nm - 756 mm - 535 CM - 582 A -371 UM - 885 nm - 94 NM - 106 um -1000 MM -977.5 A - 755 UM -160 A -145 A -470 NM -231 mm - 736 CM - 380 MM -29 nm -975 cm -343 mm - 610 A -325 NM -88 CM - 938 nm - 579 UM -823 NM -765 MM -219.5 UM -880 UM -517 UM - 420 CM -367 nm - 994 NM -438 A - 807 nm - 793 nm - 325 um - 348 CM - 746 NM - 964 UM - 501 NM - 110 cm - 830 A -856 MM -766 cm - 521 UM -224 UM -740 cm -821 um - 307 UM -511 nm -109 UM -202 NM - 8 mm - 830 um -303 CM - 454 MM - 316 cm - 591 UM -953 CM -261 nm - 545.0 UM - 140 NM -913 MM - 164 MM -669 CM -621 CM -234 mm -801 MM - 601 cm - 968 cm -1 mm - 641 cm -138 mm - 134 CM - 471 um -852 CM -873 nm -116 cm - 753 nm -411 cm -148 nm -122 A -130 NM -746 um -249 MM - 712.5 nm - 154 nm -657 NM - 536 cm - 863 nm - 248 um -995 NM -614 A - 626 um -111 MM -32 CM - 306 cm - 320 MM -1 mm -36 CM - 165 UM - 637 nm -825 nm - 586 um -949 NM -898 UM -910 UM -348 A -402 CM - 26 nm - 284 um -790 cm - 349 cm -351 cm - 149 NM -11 A -16 nm -551 cm -938 mm - 699 cm - 31.5 UM -71.0 cm - 30 cm - 772 A -561 um -659 NM -10 CM -380 nm - 214 A -919 um -564 MM -445 UM - 59 MM -943 mm -433 nm - 420 NM - 239 mm -8 um -565 mm - 445 NM -158 nm - 972 mm -562 mm - 365 UM - 878 NM - 924 MM -778 NM -625 NM -556 A - 856 UM - 71 cm -229 NM -88 MM - 349 mm - 801 cm -955 nm - 181 A - 637 cm -132 um - 27 NM - 638 NM - 135 NM - 251 um -385 mm - 308 CM - 46 cm - 520.0 cm -823 um - 341 A - 760 mm -782 MM -98 UM -927 nm - 113 nm -612 mm -993 A -919 UM -262 MM - 273.0 cm -618 NM - 485 MM - 174 UM -728 nm - 361 cm - 46 A -830 UM -805 A - 358 nm - 185 CM - 206 um - 69 A - 43 A -855 nm -831 NM -471 nm - 316 A -846 nm - 933 CM -194 um - 312 nm - 553 nm -21 mm -50 MM - 838 um -555.5 NM - 119 mm - 403 mm -836 nm -332 nm -933 A - 244 nm -964 mm - 142 NM -750 CM -479 MM - 345 CM -557 A -850 UM -584 UM - 648 MM - 687 UM - 569 mm - 435 mm -888 mm -451 cm - 12 A - 527 MM -35 mm -731 A - 945 mm - 470 NM -610 CM -222 MM - 358 UM - 56 mm -344 A -439.0 cm -108 CM -762 nm - 592 um -194 CM - 123 mm -277.5 cm -332 cm - 347 mm - 162 mm - 893 um -145 MM -308 MM -667 um -138 um -45 UM - 340 A - 443 mm - 298 nm -45 A -729 um -118 A -180 NM -697 UM - 436 NM - 130 um - 956 nm - 831 mm -64 NM -430 CM -487 CM - 399 UM -153 CM - 284 NM - 6.5 NM - 943 mm -400 A - 907 NM - 561 CM -727 mm - 891.0 cm -269 um -258 um -373 CM - 875 NM -443 UM - 398 MM - 658 MM -841 A - 344 MM - 933 CM -367 cm - 293 NM -257 nm -635 CM -309 cm -744 MM - 815 CM -744 cm -167 cm - 588 UM -99 UM -620 MM - 122 CM -924 MM - 378 nm - 124 nm -173.0 MM -571 um -309 cm - 251 cm - 393 A - 614 cm -615 nm - 148 CM -741 A - 327 nm -342 NM -843 nm -225 nm -928 MM -522 MM - 357 mm - 631 CM - 233 mm -88.0 cm -329 NM -581 CM -580 A -210 A -798 CM -171 CM -530 UM -256 NM - 796 A -763 mm -721.5 A - 721 MM -905.0 MM -979 CM - 220 um -551 um -680 CM - 404 um -670 NM - 301.0 nm -388 nm - 778 UM -65 cm - 788 um -199 cm -422 nm -275.5 cm -616 nm - 887 MM - 480 MM -619 um -916 cm -532 A -618 mm -681 UM -948 A - 529 CM - 712 cm - 484 MM -277 CM -211 cm -18 MM - 421 mm -897 mm -293 NM -589 UM -607 nm -977 mm -346 UM -611 nm - 509 cm -891 CM - 920 NM - 595 MM - 40 CM -443 nm -244 NM - 658 CM -36 um - 345 MM -747 UM -308 cm - 303 A - 131 CM -924 nm - 418 mm -617 cm - 52 CM - 949 um -996 um -630 MM -60 mm - 457 um -14 MM - 890 UM - 665 nm -40 A -792 um - 727 cm - 5 NM - 729 CM - 659 cm -301 um - 102 mm -559 NM -181 cm - 479 CM -842 NM - 119 NM - 181 nm -392 nm -890 UM -122 CM - 625 MM -609 CM -163 nm - 806 nm -88 A -863 mm -251 mm - 60 NM - 472.0 mm -766 CM -401 CM -966 UM -565 NM -668 mm - 46 UM - 330 um -139 um - 925 mm -156 um -626 A - 360 MM -558 CM -545 MM - 443 NM -648 UM -916 CM -35 mm - 743 UM -85 mm - 738 um -503 cm -160 cm - 311 UM - 411 nm -994 CM - 68 cm -827 nm -540 mm -173 A -941 nm -40 cm -475 CM -951 CM -539 cm - 362 CM -767 MM - 987.0 A -529.0 mm - 176 MM -186 CM - 573 A -922 MM - 322 UM -85 um - 526 A - 868 A - 303 cm - 404 nm - 209 MM - 869 cm -165 mm -955 CM - 626 cm -245 nm -279 nm -284 CM -586 MM -950 A -28.5 cm - 279 cm - 118 um -670 CM - 348 UM -725 cm -447 nm -953 A -697 cm -750 mm -518 NM - 65 NM - 485 CM -572 mm -652 NM - 457 nm -376 nm -316.5 MM -440 cm -496.5 nm - 436 UM -438 nm -762 CM -374 A -625 MM -318 mm - 218 cm -648.0 MM -244 mm - 454 cm -875 um -370 cm - 95 mm -251 NM -660 nm -799 nm -786 A - 709 nm - 27.0 CM - 903 nm -29 MM - 852 um -252 cm - 658.5 CM -523 CM -465 A - 285 NM - 916 um - 598 UM -304 mm -571 NM - 792 A - 778 CM -549 CM - 281 A -651 cm -176 mm - 921 um -52 MM -715.0 UM - 891 mm - 795 A -302 MM - 368 nm - 647 MM - 78 um -31 um - 585 MM - 147 um - 378 um - 109 CM -483 um -238 nm - 856 UM -356 UM - 596 NM - 8 MM -513 CM -438 CM -666 NM - 189 NM -812 NM - 278 UM -71 UM - 749 cm -259 UM -792 UM -54 cm -231.0 MM -709 CM -824 MM - 151 um -807 CM - 719 A - 206 CM -710 mm - 740 NM -657 mm - 935 A -173 MM -83.0 NM -596 UM -148 NM -976 nm -699 MM - 278 UM - 485 MM - 11 UM - 261 um -498 CM - 318 A - 677 mm -15 NM - 551 mm - 734 NM - 44 NM - 362 nm - 147 UM -327 nm -284 cm -461 um - 205 NM -714 nm -70 um - 158 A - 710 mm - 936 UM -781 UM - 669 cm -358 NM -706 um -472 A -120 CM - 864 um - 917 NM - 128 NM - 835 nm -449 um - 722 A - 346 A - 652 MM - 741 um -32 A -618 nm -701 A - 852 CM -511 UM -110 NM - 161 A -789 UM - 764 nm -87 um - 390 MM -314 cm - 994 UM - 539 cm - 254 um -851.0 mm -506 A - 679 A - 206.5 UM -128 mm - 126 A -960 nm -72 mm - 761 mm -587 MM -341 um -579 cm - 900 nm -765 MM - 155 mm - 503 cm - 217.0 CM -619 NM -78 NM - 676 CM -431 mm -470 UM - 874 cm - 174 mm - 694 mm -473 UM -972 A -505 nm - 912 mm - 976 nm - 668 MM -351 CM -54 CM -746 nm -81 CM -254 um -559.0 nm -958 nm - 367 MM - 699 CM - 277 cm -990 um -667 NM -564 CM -106 NM -160 NM -480 mm -683 A - 332 nm - 214 nm - 25 um -264 nm -13 um - 655 UM -949 A -48 cm -193 MM -41 cm - 354 mm - 735 MM -359 UM -387.0 cm - 700 cm -234 MM - 617 A - 621 A -672 mm -367 MM -832 nm - 846 um - 146 mm - 411 MM -30.5 UM - 324 MM - 935 MM - 335 CM -364 cm -386 cm -61 MM -797 mm - 684 NM - 563 MM -924 um - 534 nm -388 CM - 472.0 um - 143 nm - 667 UM -196 UM - 463 cm -424 NM - 186 mm - 733 um - 183 NM -416 A - 787 A -111 nm -888 NM -934 cm - 74.0 UM -928 mm -35 NM -7 cm -7 mm - 341.0 A - 939 um - 961 mm - 275 mm -390 mm -369 nm - 410 nm - 887 cm - 663 nm - 328 A - 160 UM -134 CM -593 A - 46 CM - 525 NM - 823 nm - 831 A - 126 nm -219.5 A - 467 NM - 473 mm -861 CM - 680 um - 307 UM -480 NM -914 cm -162 NM -723 CM - 25 A -32 mm -327 mm - 35 cm - 856 um -121 um -257 CM -293 NM -583 NM - 290 CM -880 nm - 344 mm - 475 A -699 UM - 998 um -559 A - 858 NM - 110 um -254 A -288 NM -547 nm -115 A - 318 MM - 514 CM -278 cm - 825 MM -168 UM - 973 MM -599 um - 490 CM -632 nm -992 cm - 926 CM -921 mm - 234 MM -630 MM - 762 MM - 114 nm - 28 mm - 343 NM - 359 cm -5.5 nm -362 NM -712 mm - 535 UM -501.0 A -15 NM -565 um -772 mm - 469 um -32 MM -516 MM - 6 NM -696 nm -233 MM - 445 A - 808 nm - 984 UM - 364 UM - 977 A - 596 nm -271 UM -757 CM - 60 MM -983 CM -183 A - 750 MM -644 cm - 963 NM - 256 MM - 601 CM - 537 MM - 173 cm -315 MM - 82 NM -720 UM -220 A - 773 UM -710 A -230 mm - 213 NM -134 mm - 427 cm -180 A - 152 mm -733 MM - 418 um - 317 mm - 45 MM - 586 nm -1 um -769 mm - 679 cm - 958.0 nm - 594 mm -998 um - 756 um - 237 mm -761 MM -232 UM - 700 A -852 UM - 498 nm - 514 MM -622.0 mm - 324 UM - 59 mm -133 cm - 604 A - 799 NM - 547 mm -912 MM -272 um -386 um -433 nm - 817 um - 730 A - 10 mm - 725 CM -930 UM - 350 MM - 302 MM -926 MM -355 NM - 495 UM - 503 CM -774 nm -249 UM -200 um -198 nm -717 cm -22 NM - 515 CM -864 nm -146 A - 217 um - 14 um -431 mm -417 mm -137 MM -993 nm - 413 NM -167 CM -341 NM -498 A -629 nm - 897 A - 304 NM -927 NM -687 MM -625 UM - 775 mm -755 UM - 699 nm - 449 A -457 mm - 975.5 nm -28 nm -169.0 CM - 375 UM - 631 mm -959 CM - 578 NM - 289 MM - 994 A - 359 nm - 77 UM -858 um -328 um -17 um -225 MM -770 cm -808 A -330.5 mm - 819 nm - 732 MM - 63 MM -884 UM - 942 MM - 545 mm -342 MM - 429 NM - 99 A -532 nm - 20 nm - 229 cm -607 mm - 599 MM - 660 um -809 cm -44 NM -258 UM - 662 A -589 mm -522 nm -111 mm -271 MM - 782 CM -703 mm -531 nm -678 CM - 603 um - 954 MM -57 nm - 827 MM -239 mm -86 UM -57 nm - 249 CM -709 UM -368 mm - 345 CM -125 nm -447 A - 296 MM - 406 MM - 815 A - 416 CM - 449 MM -542 MM - 654 A -670 um - 932 nm - 630 um - 266 NM - 728 MM - 930 CM -320 A - 618 mm - 298 MM - 774 cm - 963 um - 813 mm -171.0 UM - 384 A - 280 A - 364 CM -672 nm -32 CM - 852 cm - 545 um -279 UM -371.0 cm - 719 MM -552 um - 754 MM - 192 MM - 292 CM -176 A - 572.5 um - 271 UM -17 cm -289 NM - 696 mm - 128 A -440 MM - 973 nm -253 um - 503 A -666 um -341 um - 846 MM -960 CM -387.5 A -384 CM -853 NM -845 MM - 295 MM - 60 UM - 809 mm - 594 A - 646 MM -350 UM -723 nm -32 MM -550 mm - 401 CM - 13.0 nm - 936 cm - 209 MM - 541 MM - 884 CM -818 NM - 81 nm - 498 UM - 86 nm - 124 nm - 954.0 um - 541 um -374 MM -783 CM -234 cm - 427 A -156 A - 202 UM - 527 nm -585 cm - 903 UM - 985 A -383 MM - 345 cm - 869 NM - 705 mm -751 CM - 98 nm - 596 CM - 993 UM - 7 nm - 492 NM -495 MM -974 cm - 468 nm -727 nm -866 UM -828 cm - 951 A -228 A -411 MM - 430 MM -865 nm -275 NM -833 um -372 A - 710 UM -68 um - 422 CM -430.0 MM - 291 nm -458 cm -152.5 mm -468 A - 608 cm - 10 nm -615 um - 509 nm -760 A - 952 UM -795 mm - 657 MM - 196 MM - 677 cm -615 A -680.5 um - 414 mm -182 nm - 837 MM -738 CM - 44 mm -112 nm - 412 mm - 536 NM - 655 MM -903 nm - 239 A -359 MM - 473 cm - 739 um - 125 MM -419 mm -840 A - 378 NM -879 nm - 167 mm -376 nm - 221 CM -152 cm -248 NM -421 NM -17 NM - 328 UM - 354 nm - 590 NM - 654 CM -337 nm -885 mm - 544 NM - 198 um -630 um - 524 UM - 761 CM - 34 cm -209 MM -386 um - 529 um - 776 cm - 700 um - 74 NM - 921 UM -597 NM -187 NM - 125 nm -48 nm -961 um -549 NM -122 cm -653 cm - 408 UM - 6 UM -108 nm -854 um -335 A - 461 nm - 645 mm -982 CM -233 MM - 503 NM - 58 MM -291 um -538 NM -368 nm -708 A - 175 A -838 MM - 913 cm - 164 um - 727 mm - 254 MM -633 CM - 525 MM - 4 um - 258 A -752 NM - 579 NM -314 mm - 426 MM - 983 NM -303 UM - 582 NM - 724 MM -277 nm - 339 nm -146 MM -919 cm - 128 NM -477 nm - 254 A -691 nm -542 CM - 611 nm -411 nm - 165 cm - 102 mm - 465 mm -666 CM - 208 CM - 841 CM -485 NM - 254 cm - 548 UM -574 NM -182 nm - 616 UM - 149 CM - 38 A -101 mm -165 mm -134.0 nm -275 CM - 835.0 nm -491 um -527 CM -67 UM -941 A - 604 MM - 264 MM - 338 cm - 215 A -472 cm - 999 A -89 UM - 712 nm -500 MM - 81 MM - 546 CM -893 CM - 662 nm - 34 um - 754 cm -303 MM -196 A -701 MM - 481 NM - 448 um - 662 MM -975 um - 383 NM - 177 MM -594 NM -47 mm - 375 MM -781 mm -993 cm -543 nm -645 cm - 41 nm - 304 UM - 928 cm - 384 cm - 966 CM - 973 A - 750 CM - 813 um - 803 UM - 919 NM - 970 NM - 789 CM - 326 NM - 95 um - 478 NM - 307 MM -673 mm - 755 MM -455 CM - 31 mm -405 nm - 691 UM -732 um -435 um - 573 NM - 853 cm -920 UM - 930 um -894 MM -217 CM -625 A - 164 mm - 835 NM - 388 nm - 690 cm - 273 NM - 519 UM - 32 cm -442 mm - 499 MM - 853 CM -853 CM -585 CM -428 um - 596.0 cm -935 MM -153 A -715 cm -490 A -93 nm -925 A - 552 mm - 760 UM -659 MM -632 UM -39 nm -844 nm -810 NM - 175 MM - 222 mm - 966 UM - 870 um - 18 MM - 214 A - 775 nm -20 nm -347 NM -423 cm - 371 um - 193 nm - 586 A - 620 A -850 CM - 760 A -40 nm - 52 mm - 176 mm -680 CM -410 NM -304 um -198 um - 57 UM - 794 mm -564 NM -975 UM - 825 mm - 958 mm -255 CM - 668 um - 397 A -58 um -868 mm - 634 NM - 928 A - 830 NM - 807 cm -615 cm -294.0 nm - 316 mm - 57 NM - 108.5 um -93 A -924 NM - 445 CM - 604 UM -609 nm - 387 cm -81 NM - 73 nm -727 cm - 835 NM - 214 UM - 801 CM - 875 um - 975 nm - 972 A -649 MM - 30 um -176 UM -661.0 nm - 595 CM - 383 mm -114 um -475 CM -971 cm - 59 NM - 104 nm -291.0 A -748 mm - 743 cm - 878 NM - 245 mm -366 A -114.5 MM -536 um -512 CM -795 nm -584.0 CM -265 CM - 258 CM -878.5 NM -435 cm - 425 NM - 802 A - 271 A - 577 A -5 NM - 242 nm - 414 NM -737 cm -273 MM -594 CM -39 A -576 UM - 480 A - 576 NM -430 cm -162 CM -224 cm - 705 NM - 40 nm - 792.0 nm -552 nm - 193 UM - 360.5 NM -632.5 A -238 um -273 um - 262 um -434 nm -840 um -668 nm - 337 nm - 577 um -123 MM - 687 cm -94 CM - 159 MM -144 UM - 104 um - 696 CM -162 um - 28 CM -289 cm - 220 CM - 608 NM - 228 um - 730 um -342 um - 653 um - 796 cm -922 NM -896 NM -146 UM - 425 cm -527 mm - 766 NM -743 MM - 532 A -884 cm - 988 CM -467 NM -229 CM -98 CM -250 cm - 391 NM - 23 NM - 312 NM - 748 A - 518 MM -529 A - 463 nm - 894 um -116 MM -144 NM -59 MM - 169 cm - 335 um - 692 cm -554 A -71 A -396 mm -255 MM -827 MM -433 nm - 342 cm - 227 um - 464 NM -74 NM - 345 nm -829 CM -653 cm -976.0 UM -208 cm -347 NM -467 nm -347 um -522 mm - 992 cm -318 um - 50 nm - 578.5 cm -70 nm -380 MM - 897 mm - 190 UM - 569 cm - 951 um - 807 cm - 373 NM - 949 NM - 977 MM -339 A - 771 UM - 507 A -928 UM - 716 mm - 607 MM - 941 mm -158 mm -988 cm - 805 um -1000 nm - 963 cm - 852 A - 515 MM - 770 cm -780 NM -579 nm - 880 CM -268 MM -728.5 NM -996 A - 53 MM -952 NM -931 UM -598 A - 197 UM -941 UM - 824 cm - 837 MM - 468 cm -127 cm - 812 UM - 320 um - 845 MM - 899 um -889 nm - 409 cm -56 MM -758 A - 819 cm -691 cm -727 mm - 896.0 UM - 308 MM - 743 UM - 905 cm -937 UM - 216 nm -642 UM - 253 um - 672 MM - 100 NM -753 CM - 213 um - 684 mm - 579 NM -517 CM -483 um -211 mm -13 MM -638.5 cm - 899 A - 798 um - 659 um -969 UM - 470 um - 580.0 NM - 894 UM - 185 cm -380 UM -590 cm -160 CM -642 NM - 150 mm - 799 A - 441 NM -208 UM - 657.5 cm - 46 NM -358 UM - 458 nm - 372 nm -896 nm -878 cm -922 CM -751 cm -999 cm - 554 UM - 108 cm - 432 CM -324 MM - 936 nm -658 UM - 120 UM - 535 um - 847 mm - 624 MM - 581 mm -315 nm -825 mm -430.0 A - 657 MM -485 CM -915 cm - 640 mm -115 MM - 231 um -656 nm -546 nm -193.0 nm -494 CM - 874 NM -834 nm - 832 UM - 907 nm -417 UM - 177 MM - 125 cm - 819 UM -916 A -893 CM - 55.0 UM -872 mm - 707 mm -158 cm -868 NM -587 NM - 384 CM - 728 mm -811 CM -762 mm - 499 A - 601 UM - 49 CM -89.0 MM - 698 nm -674 A - 288 nm -815 A -703 mm -416 UM - 169 A -491 A -544 cm - 568 um - 830 um - 871 CM -30 um -326 MM - 248 cm - 255 nm - 760 cm -234 mm - 643 nm - 593 mm - 216 NM - 407 nm - 979 A - 602 nm -490 A - 302 CM -554 CM -861 um - 663 MM -722 MM - 343 CM - 685 nm -61 cm - 229 UM - 261 MM - 884 cm - 331 NM - 440 MM -330 mm - 447 mm - 599 A -861 um - 362 nm - 963 nm - 362 A -948 NM - 712 cm - 895 NM -262 UM - 240 MM - 11 MM -572.0 cm -912 mm - 537 NM - 727 mm -543.5 UM -477 UM -923 mm -343 MM - 732 mm - 721 cm -289 MM - 581 nm - 883 CM - 123 mm -371 um -578 MM -756 UM -626 A -498 um - 610 MM -272 mm -269 nm -316 UM -971 um -332 um - 74.5 mm - 894 MM -497 NM -622 cm - 645 um -531 mm -521 cm -338 A - 188 nm -334 um -95 A -558 A - 270 UM -34 UM -823 mm -568 mm - 951 CM - 243 cm -190 MM -601 um -140 NM -112.5 cm -928 CM - 977 cm - 687 CM -780 nm - 922 A -71 UM - 822 CM - 473 UM -644 NM - 362 nm - 490 NM -10 cm - 452 mm -687 nm -5 cm - 827 CM - 978 UM - 539 cm - 199 NM -324 NM -775 UM - 213 um - 511 cm - 156 UM -703 cm -389 nm -612 nm - 458 UM - 161 UM -29 UM -766 um -700 nm - 320 nm -965 UM -381 mm - 487 nm - 724 cm - 962 MM -741 UM - 410 UM - 96 um -710 CM - 409 nm - 767 A -655 MM - 2 mm -6 mm -81 CM - 166 mm -648 A -16 mm - 48 mm -899 mm -262 um - 121 UM - 967 CM -60 mm -428 NM - 750 CM -184 CM - 613 MM - 727 MM -883 cm -572 CM - 701 NM -99 CM -253 cm -237 A - 262 mm - 899 UM - 521 UM -665 UM - 681 CM - 217 NM -91.0 MM - 519 mm -600 um -683 A - 523 cm - 761 MM -751 cm - 456 mm - 407 cm -817 um -647 MM - 634 CM - 214 cm - 58 mm -33 nm -828 CM - 170 MM - 473 CM -3 nm -961 mm - 876 mm - 579 MM -376 mm - 325 MM - 51 CM -570 UM -95 MM - 367 A -921 A -46 mm -702.5 MM -71 mm -852 nm -185 UM - 95 mm -877 CM -547 CM - 418 NM -840 NM -731 CM -142 um -415 CM - 653 UM -653 A -505 A - 810 cm -933 A - 718 mm - 65 nm -540 NM - 613 A - 460 um -942 um - 582 A - 24 A -775 cm - 676 um -464 nm - 640 CM - 415 CM -748 nm - 784 cm - 839 um -589 A -329 CM -536 nm - 555 CM - 509 mm - 700 cm - 934 CM - 247 NM -290 UM -385 UM -926 nm - 348 MM - 569 NM - 916 CM - 552 A - 69 UM - 933 um -44 NM -817 MM -947 A - 597 nm -889 um -452 CM - 942 mm -29 mm -930 CM -831 mm -677 A - 254 NM -959 cm - 673 UM - 416 nm -14 MM -18 NM - 914 CM - 529 A -383 UM - 694 cm - 120 NM -259 cm - 318 nm -378 nm - 939 CM - 586 CM - 15 CM - 949 UM -541 nm -983 NM - 228 NM -551 cm -256 um - 647 NM -329 mm -549 UM - 314 cm - 957 CM - 275 A -354 cm - 351 um - 358 A -780 A -998 nm -885 A -643 um - 545 nm - 416 UM -840 NM -278 MM -134 nm - 216 mm - 155.5 NM -60 NM -873 UM - 721.5 nm - 124 nm - 836 cm -871 nm - 5 um -503 UM -294 MM - 511 MM -192 mm - 64 A -37 MM - 282 um -94 um -54 mm - 46 mm - 520 CM -994 CM - 115 UM - 310 A - 66 cm - 33 A - 873 A - 412.5 MM -528 CM -625 A - 665 mm -867 UM -910 um - 808 mm - 635 mm -274 CM -645 UM -162 NM - 907 nm -945 A - 78 cm - 169 CM -82 CM -78 CM - 221 UM - 164 cm - 407 nm - 65 um - 550 MM -62 um - 39.0 NM - 902 cm - 896 MM - 695 mm - 585.5 NM -637 nm - 895 MM -670 UM - 712 mm - 650 NM - 676 CM -373 cm - 985 um -144 mm - 808 mm - 819 cm -342 nm -95 UM - 165 UM - 488 A - 186 CM - 112 CM -353 CM - 422 UM -654 cm -332 A - 309 NM -362 MM -854 A - 196 cm - 611 nm -142 CM -857 A -273 MM -506 um - 362 NM -70 CM - 232 NM -637 A - 594 nm - 97 mm - 574 NM - 431 nm -407 CM - 863 MM -202 A - 516 MM -589 nm - 818 NM - 766 mm - 657 NM - 592 cm -155 um -952 A -343 cm -509 UM -518.5 A - 817 mm -501 UM -270 CM -857 MM -118 UM - 437 NM -109 NM - 340 um -816 mm -951 A -629 cm - 239 cm - 649 cm - 751 A - 406 A -411 um -957.0 UM -716 mm -958 MM - 617.0 cm -562 nm -331.5 CM - 539 nm -819 A - 612 NM -664 nm - 977 um - 320 UM - 438 UM - 340 mm - 924 cm - 391 UM -290 MM -988 mm -608 NM -63 mm -733 mm - 369 UM -398.5 um -733 UM -956 um -368 nm -669 CM -344 NM -500 A -804 um -257 UM -184 UM - 720 um -139 nm - 549 nm - 407 nm - 979 CM -296 CM -812 UM -404 cm - 662.0 A - 977 A -487 CM - 375 UM - 780 MM -432 MM - 456 cm -71 A -748 um - 611 NM - 563 um -366 NM -805 um -991 A -13 CM - 158 mm - 16 CM - 323 UM - 400 cm - 619 MM -120 mm -380 nm - 637 nm -534 NM - 775 NM - 765 MM -656 NM - 407 mm -538 A - 495 um - 964 A - 288 NM - 338 NM -417 nm -285 UM - 601 NM - 820 A - 166 nm -747 cm - 977 cm -404 NM -758 nm - 350 MM - 502 nm - 838 NM - 44 CM - 181 A - 658 cm -928 CM - 298 MM - 659 CM - 263 um -651 nm -847 cm - 138 UM - 429 cm -798 MM -620 mm -698 NM - 129 CM - 811 MM - 363 nm - 326 A -140 NM -46 NM -436 CM -168 A -843 nm - 170 A - 221 CM - 558.0 mm - 271 NM -577 cm -822 mm - 405.5 UM -673 mm - 180 NM -563 mm - 620 MM - 436.5 UM -252 NM - 435 UM - 664 um -745 A - 938 A - 750 mm -157 um - 921 MM -559.0 UM -693 mm - 146 NM -395 UM - 392 um -85 NM - 279 um - 995 um -565 UM - 748 cm -67 A - 508 nm - 660 cm - 955.5 um -746 UM - 700 mm - 773 mm - 491 nm -533.0 A - 323 CM -255 UM - 193 um - 33 MM - 170 MM -240 NM -226 MM - 820 NM -711 A -271 CM -98 mm -333 NM - 168 A - 1 mm - 884 CM - 604 um -176 CM - 36 UM - 45 nm -270 UM -389 nm -288 nm - 373 cm - 366 um -234 cm -954 MM - 442 A -284 CM -657 UM - 863 cm -410 mm -602 MM -519 MM -828 nm - 992 cm -595 mm - 894.5 A - 341 um - 870 NM - 17 CM - 78 um -514 CM -808 NM -502 nm -747 A -855 cm - 871 NM -8 mm -839 mm - 193 NM -603 NM - 874 cm -115 cm - 954 mm -302 UM - 259 nm - 295 A -656 nm - 287 nm - 684 UM -663 MM -32 CM -803 um - 69 CM -235 NM - 892 cm - 291 NM -475 UM - 465 mm - 595.5 um -251 nm -450 nm -800 um -389 nm - 731 UM - 867 cm - 971 nm - 390 nm - 288 UM -411 nm -624 um - 200 MM -349 NM - 686 CM -137 um -755 A -479 CM -56 nm - 121 um -426 A -494 CM - 534 cm -957 UM - 479 A -351 A -529 MM -603 mm - 684 cm - 149 NM - 920 um -330 UM -977 CM - 802 UM - 928 MM -133 nm -19 mm -814 NM -471 nm - 90.5 nm -73 cm - 139 CM - 507 cm -495 UM -82 nm - 587 nm - 916 cm -684 cm - 943 CM -814 nm - 631 A - 485 NM -524 MM -262 um - 778 MM - 761 mm -100 UM - 983 A - 363 CM - 794 A -489 MM - 739 mm -69 mm - 537 um -199 mm -267 mm - 354 nm - 275 NM - 121 A -758 nm - 916 CM -392 CM -698 CM - 10 UM - 209 A -237 UM - 426 A -994 A - 652 mm -980 A -191 A -990 nm -663 um -449 mm - 231 NM -935 A -851 CM - 482 NM - 710 um -324 cm - 386 cm - 917 UM - 512 mm - 762.0 MM - 587 cm -845 nm -738 mm - 449 cm - 302 mm -354 um -873 mm -164 nm - 202 UM -758 mm - 387 NM -331 A - 429 NM - 375.0 mm - 754 MM -996 CM -380 MM - 281 um -917 mm -63 mm - 90 MM -993 nm - 548 UM -710 cm - 86 UM -368 cm - 920 NM -391 um -892 UM - 939 nm -404 NM - 925 UM -891 UM - 477 MM - 765 nm -743 MM - 77 mm -83.5 um -594.5 MM - 194 MM -166 nm -388 A -952 UM - 527 mm - 278 NM - 16 UM -752 UM - 389 cm -712 MM -935 A -346.0 UM -39 CM -360 A - 876.5 NM - 826 UM - 133 A - 668 um -988 MM -284 MM -263 NM -698 mm -604 CM - 834 nm -134 CM - 845 NM - 939 A -990 nm - 982 MM -597 CM -37 cm - 37 NM - 546 nm - 737 NM -888 UM - 897 nm - 716 mm -953 UM - 115 cm - 775 mm - 431 CM - 849 um -626 NM -409 MM - 14 cm - 377 UM -298 um - 795 A -869 A -572 um - 517 cm -236 um -280 nm - 943 MM -14 NM - 836 nm -244 um - 391 NM -446 cm - 27 mm - 572 UM - 438 A - 991 mm - 918 UM - 752 NM - 228 NM - 617.0 mm -542 nm - 242 nm -846 UM - 183 mm -529 nm - 670 cm - 449 MM -412 nm -503 CM - 797 mm - 784 um - 926 A - 37 um -306 A - 89 UM -297 CM - 815 CM -629 A - 211 MM -98 nm - 630 NM - 105 um - 254 nm - 116 A -159 UM -195 um -729 CM - 119 NM - 384 A -177 NM - 797 nm - 953 um - 741 NM -895 mm - 336 mm - 989 nm -158 nm -705 mm -543 mm -560 CM -36 um - 664 A - 396 UM -756 UM - 76 um - 906 UM - 710 mm - 551 cm - 878.0 CM - 59 A - 143 um -181 CM - 294 nm - 123 um -247 A -643 um - 714 mm -777 CM -505 cm - 651 um - 924 nm -706 CM - 44 cm -153 UM -919 NM - 482 UM -85 UM - 731 nm - 460 MM -743 MM - 440 nm - 769 cm -545 um -454 nm - 371 UM -933 A -529 A -29 NM -455 nm - 335 mm - 651.5 NM - 814 UM -34.0 mm -271 MM - 455 MM - 412 A - 646 CM -895 cm -973 MM - 37 A -714 NM -139 MM - 827 mm - 730 MM - 168 mm -918 um - 191 A -585 UM - 376.0 MM -291 cm - 647 NM -570 um -260 MM -64 mm - 975 MM - 927 UM - 780 CM - 652 CM -149 MM -143 NM -744 NM - 22 MM - 593 um -666.0 cm -313 UM -228 mm - 323 mm -875 nm - 903 cm -351 um - 467 A -603 CM -124 NM -397 MM -332 UM -737 um -207 mm -820 CM - 759.5 A -667 cm -883 UM -928 CM - 138 nm - 327 UM - 783.0 MM -930 nm -650 MM -574 MM - 672 A - 213 MM - 67 nm -224 nm -890 um - 292 nm -206 um -73 NM - 153 A - 614 CM - 581 NM -347 A - 412 CM -909 UM - 8 cm -537 CM - 685 MM - 546 UM - 594 CM -704 MM -931 um -402 cm - 460 nm -354 CM - 953 nm -244 um -659 NM - 573 A -899.5 CM -894 UM - 423.5 NM -200 UM - 471 CM - 245 MM - 287 NM -441 um -399 cm - 142 NM -519 CM - 408 NM -650 NM -22 A -118 NM - 571 mm - 804 NM - 321 MM - 695 CM - 561 CM -862 A - 205 A -202 nm - 203 mm -451 MM - 408 A -922 mm -285 cm -913 nm -530.5 CM -260.5 UM -456 NM -168 MM - 624 UM -944 MM -382 NM -349 nm -193 CM -971 NM -713 nm - 163 UM - 794 um - 912 mm - 865 cm - 8 MM - 921 nm -407 A -745 UM -691 UM - 912 um - 733 nm -603 NM -393 um -206 A -15 CM - 158 nm - 973 UM -503 CM -712 A - 421 A -99 NM -403 NM -504 mm -808.5 CM -452 um - 3 mm - 883 cm - 142 um - 301 A - 543 cm -100 UM - 937 MM -484 um - 28 MM -895 NM -569 CM -854 nm - 595 UM - 870 A -744 UM -465 mm -50 CM -225 cm -9 MM - 372 UM -808 nm - 480 nm - 527 mm - 323 um - 343.0 MM - 320 nm - 518 NM -538 MM -261 nm -544 CM - 147 cm -858 NM -801 mm -962 NM - 450 NM -493 MM - 805 CM - 988 UM -952.5 NM -975.5 mm - 906 um -337 NM - 679 NM - 95 CM - 444 UM - 239 um - 292 mm -835 nm - 303 nm -882 UM -596 nm - 146 nm -654 CM - 390 nm -262 UM - 592 A - 234 UM -968 A - 908 mm - 806 UM - 742 NM -654 mm - 937 UM - 904 A -946 CM -917 um -932 A -292 mm - 148 A - 667 um -959 MM - 583 NM - 841 cm - 525 um - 271 cm -869 MM -639 um -607 mm - 274 CM -387 A - 538 CM - 202 MM -900 cm - 267 nm -819 CM - 262 cm - 732 mm -364 CM - 140 A - 757 nm - 388 UM -551 um -79 UM - 766 CM - 81 A - 149 nm - 646 nm - 736 UM -252 NM - 663 nm -108 CM -28 UM -709 cm - 616 A - 381 CM -872 cm -171 cm -45 nm -773 CM - 325 mm -83 cm - 113 NM -813 nm - 608 CM - 73 A - 561 mm -456 CM - 827 UM - 138 A - 830 mm - 204.0 cm -833 UM - 255 A - 52 NM -799 mm - 39 A - 62.5 UM -770 cm -116 MM - 923 UM - 497 mm - 991 NM - 591 MM - 409 CM -838 cm - 255 mm - 755 um -741.0 NM - 819 mm - 441 mm -646 cm - 478 nm - 433 nm -267 MM -159 NM -168 cm -879 A - 16 um - 241 cm - 955 nm - 223 A - 28 um -56 NM - 930 NM -954 cm - 243 cm -811 nm -745 NM - 568 cm - 763 cm - 31 nm - 564 mm -944 CM - 301 UM -623 UM - 803 A -263 UM - 605 UM -546 NM -300 mm - 607 mm - 847 NM - 67 um -94 A -327.5 UM - 187 um -882 NM - 162 um - 295 UM - 622 nm - 927 mm - 267 MM -191 CM - 554 UM - 90 NM -794 A -925 mm -173 NM - 171 MM - 855 NM -441.0 mm -234 mm - 436 mm -501 mm - 271 CM - 129 nm - 534 A - 545 um -901 NM -211 UM -164 um -82 UM -918 NM - 317 NM - 902 mm -911 NM -700 CM - 607 um -5 cm -118 nm - 66 mm -423 UM - 239 um - 980 MM -988 nm -42 CM -342 NM - 760 NM - 421 CM - 766 CM -980 NM -696 A -746 UM - 411 A -478 UM - 405 cm -568 A -529 CM -502 cm -249 NM - 308 CM - 129 UM - 922.0 mm -285 mm -279 mm - 740 MM - 57 MM - 358 CM -825 mm - 490 um -678 mm -738 UM - 679.0 nm -472 nm - 730 CM - 648 nm - 349 mm - 134.0 CM - 844 CM -310 MM -268 CM - 908 cm - 284 CM - 93 cm - 57.0 mm -914 UM - 479 MM -33 NM -685 nm - 241 A -746 A -551 CM - 28 CM - 806.0 mm - 541 um - 300 mm -755 MM - 328 NM -608 NM - 405 CM -992 UM -389 um - 557 A -69 A -296 A - 990 UM -349 mm -378 cm - 487 UM -408 NM - 58 CM -669 mm -467 NM -439 UM - 322 A -958 UM -230 cm - 24 mm - 152 cm -816 A - 677 MM -115 CM -661 UM - 260 MM - 681 A -172 nm - 986 NM - 399 cm - 531 mm - 141 A -35 NM - 549 nm - 839 CM -125 um - 624 um -881 A -855 CM -571 CM -737 um -495 um -671 mm -481 A - 916 MM - 342 A -312 CM -825.5 CM -214 UM - 712 NM -308 A -342 nm - 826 A -312 MM - 413 NM -427 A - 939 UM - 191 MM -969.5 CM -930 UM - 80 A - 338 A -315 um -417 NM - 418 nm -682 UM -640 mm -4 NM - 850 mm - 558 nm -981 MM - 443 UM - 23 cm -118 A - 419 A - 203 MM - 759 A -641 UM -922 UM - 599 NM -282 NM -302 nm -740 MM -844 NM - 726 cm - 821.0 NM - 316 A -573 MM - 959 cm - 912 A -856 um - 467 CM - 904 CM -277 NM -37 MM - 388 UM - 576 UM -675 cm -672.5 UM -974 um -681 mm - 497 um - 969.5 UM -711 CM - 793 nm -139 um -332 um -933 um - 453.0 nm -427.5 UM - 13 nm - 658 um -282 cm - 635 cm - 851 UM -766 MM - 352 A -237 CM -416 UM -50.0 CM -338 A - 26 um -753 nm - 633 CM - 482 um - 471 mm -23 mm - 827 mm - 143 um -729 mm - 887 nm - 633 A -766 MM -309 mm - 953 NM - 739 cm -532 MM - 936.0 nm -262 A - 365 cm - 949 UM - 902 A -678 um - 307 CM - 972 A -5 UM - 225 cm - 934 NM -502 mm - 673 cm - 713 A - 410 UM -159 mm - 670 NM - 139 um -386 mm - 744 A - 744 A -170.5 cm - 96 NM - 503 cm - 739 mm - 591 MM - 131 mm -473 CM - 497 um -546 UM - 888 MM - 582 CM - 323 um - 724 mm - 30 nm - 249 A - 846 CM - 40 UM - 49 nm -453 CM -956 cm - 310 A -863 UM -831 um - 101 CM -18 A - 321 NM -192.0 nm -75 um - 538 UM -630 UM -552 CM -982 um - 35 mm -84 um -661 um -440 mm -689 cm -634 MM -48 cm - 575 NM -888 NM -269 A -744 A -141 MM - 373 CM - 202 A - 722 mm - 59 mm -560 mm - 515 cm - 926 UM - 856 cm - 16 UM - 908 NM - 828 cm -525 MM - 720 mm - 919 um - 727.0 CM - 807 UM -592 UM -416 NM - 989 mm - 838 UM -365 um -560 nm -337 nm -37 um -351 NM - 593 mm -111 cm -743 NM -714 MM - 506 CM - 320 cm - 704 CM - 538 NM - 632 A - 153 cm - 126 A - 678 MM - 830 mm -733 nm -559 UM -67 A -340 cm - 638 mm -30 NM - 162 CM - 73 um -305 MM - 751 UM - 222 nm -167 MM -554 UM - 228 MM -657 CM - 82 MM - 636 mm - 36 nm -721 MM - 507 mm - 308 cm - 584 UM - 287 mm -608.5 NM - 530 mm -965 NM - 723 um -517 MM - 520 NM - 608 NM - 355 UM -883 CM -295 NM -49 nm - 469 nm - 553 cm - 798 mm -396 UM -663 UM -497 MM -844 CM - 36 CM - 19 MM -894 MM -491 NM -699 A - 972 UM -599 A -321.5 A - 723 MM -355 cm -54 mm - 674 nm -425 UM -844 NM -589 MM - 657 NM - 211 nm - 107 NM - 509 CM -773 nm -932 um - 297 MM - 843 A - 39 um -96 CM - 55 NM -303 mm - 42 mm -752 CM - 233 mm - 905 um -178 nm - 987 um - 799 nm -404 NM -680 mm - 994 mm - 201 um - 606 um -9 CM - 919 cm - 400 nm - 35 um - 765 A -900 cm -641 um -978 A -854 NM -229 NM -221 nm - 582 NM -195 UM -642 MM -227 CM -756 um -997 cm -790 CM -320.0 NM -392 NM -52 NM -365 mm -594 A -689 CM - 901 cm -774 um -59 CM -315 UM -455 cm - 219 CM - 577.5 UM - 344 cm - 362 MM -606 cm - 574 nm - 342.5 UM -816 um - 984 mm -61 cm -84 mm -202 A - 442 cm -682 cm - 38 nm -181 nm - 284 um -504 mm - 759.0 NM -443.5 um - 935 cm -615 UM -64 cm - 680 mm -409 CM - 972 um - 707 nm -982 CM -544 cm -143 mm - 355 um - 635 CM -680 um - 798 CM - 537 um -895 CM -672.0 MM -135 A - 69 UM - 736 A -771 CM - 768 UM - 724 NM -3 MM -424 NM -381 A -746 UM -609 um - 844 MM - 395 UM - 541 nm -800.5 mm -697 CM -94 NM - 370 nm - 910 cm - 449 um -54 CM -170 nm - 862 cm -298 CM - 621 cm - 294 CM - 471 um - 713 NM -279 NM -484 A - 328 NM -86 MM - 603 UM -992 nm - 530 um -361.0 mm - 274 cm -111 mm -975 mm -569 A - 72 A -290 UM - 634 NM - 16 um - 64 NM -158 UM -256 A -620 cm - 922 mm -581 cm - 99 A -269 CM - 689 NM - 125 UM - 588 A -916 CM - 944 mm - 176 A - 349 UM - 86 A -962.5 CM - 253 UM -65 nm - 994 MM -425 MM -356 CM -634 CM -341 um -25 cm - 984 cm - 902 CM - 466 A -150 UM -735 mm -851 nm - 476 mm - 993 MM - 787 A - 178 UM -338 mm -308 MM - 245 UM -382 CM -711 MM -387 mm - 706 UM -957 nm - 8 mm - 256 A - 372 NM - 294 MM - 320 NM - 420 um -308 cm -602 NM - 418 MM -273 um - 402 nm -367 nm - 887 mm -191 A -921 cm - 632 cm - 7 A - 325 cm - 988 CM -184 mm -171 mm - 219 A -111.0 NM -815 UM - 314 mm -38 mm - 902 nm - 367 mm - 372 nm - 137 um -651 um -290 nm - 726 MM -298 um -164 MM -65 NM -72 um - 986.0 cm -12 mm -406 UM -643 NM - 192 mm - 560 um - 619 CM -547 CM -254 A - 501 MM -466 cm - 186 mm - 357 cm -177.5 MM -739 um -595 MM - 238 A - 406 um - 102 NM - 691 nm - 411 nm -656 mm - 763 nm -377 nm - 311 cm -663 UM - 982 nm - 530 CM -925 mm - 291 mm -371 CM - 896 mm -107 um - 119 CM - 346 NM -679 nm - 821 um - 478 MM - 808 cm - 880 cm -266 A -219 um -493.5 NM -659 A - 367 mm - 902 um -670 um -591 CM -770 CM - 487 UM - 820 CM - 926 NM - 475 NM -123 MM -185 um - 242 cm -458 nm - 175 NM -42 CM - 738 A - 853 nm -900 mm -230 A - 159 UM -365 um -521 um - 908.5 mm -630 cm - 177 NM - 920 nm -690.5 cm - 196 NM - 732 um -483 cm -15 nm -421 MM -591 cm -974 UM -990 NM -975 um -561 CM -121 A - 415 UM - 573 CM -863 CM -386 cm - 247 um -748 cm -947 MM - 710 MM -975 A -947 CM - 821 mm - 489 CM -157.0 mm - 297 A - 904 cm - 678 MM -74 CM - 226 UM -80 NM - 754 um - 838 UM -164 UM - 771 MM - 459 CM - 967 nm -975 MM - 220 um - 999 MM - 138 mm -705 MM -378 CM -641 NM - 7.5 CM -148 UM - 353 MM - 901 mm -213 NM - 275 um -743 cm - 35 UM - 198 MM - 139 nm -859 NM -985 A -153 cm - 99 CM - 669 UM - 204 NM -863 UM - 160.5 um -488 mm - 409 um -608 A - 240 UM - 733 UM - 362 CM -632 A - 703 CM -386 MM -239 CM -569 UM - 113 nm -184 um - 472 A -543 A - 623.0 UM -7 um -726 A - 435 UM -419 UM -644 A - 852 mm -445 UM - 743 mm -281 nm - 877 um - 819 UM - 356 NM -453 NM - 406 UM -395 CM -596 um - 791 CM - 795 mm -217 mm - 318 mm - 407 mm -125 um - 444 A -274 um - 685 NM -969 UM - 705 nm -803 MM -145 um -584 A - 621 um -42 UM -661 cm -48 UM -676 um - 813 MM - 44 cm - 650 UM - 414 UM - 741 A - 683 NM -718 A - 964 um - 494 cm - 706 nm -706 NM -862 CM -872 NM - 710 um -71 CM -239 mm - 38 mm - 836 um -812 mm - 67 um - 803 cm - 331 CM - 243 mm -814 mm -643 CM - 725 mm -464.5 mm - 278 UM -437 cm -320 mm -797 cm - 525 CM -257 NM - 471 CM -825 MM -252 mm - 819 A - 425 NM -287 A - 109 MM - 371.5 UM - 519 A -919 NM -360 cm - 929 NM - 301 um - 677 um -878 NM - 347 CM -496 mm - 734 nm -64 mm -690 A -421 CM -108 mm -555 UM - 191 mm - 639.0 nm - 458 um - 623 NM - 722 nm -412 CM -898 A - 802 mm -847 um -595 um - 175 nm - 802 A -411 cm -62 NM - 736 mm - 64 NM -819 A - 407 nm - 555 NM -651 MM -995 A - 760 CM -784 CM -152 UM -551 NM -641 MM -486.0 UM -117 um -662 cm -743 A - 104 NM - 514 A - 731 A -229 NM - 297 NM - 707 NM - 208 CM -811 nm -422 nm -811 um - 336 UM -4 CM - 716 nm - 3.5 NM -472 MM -673 A - 753 nm -552 MM - 77 cm -400 CM -798 mm - 583 nm -720 MM -139 cm -102 NM -45 um - 805 nm - 560 CM - 19 nm -970 CM - 42 mm - 363 cm - 756 mm - 435 MM -755.0 CM - 359 cm - 257 cm - 271 MM -633 A - 660 um -903 mm - 279 MM -994 mm -147 mm -784 NM -630 UM - 995 NM -908 mm - 147 CM -881 MM - 421 MM -868 CM -351 nm -991 mm -486 cm - 937 nm - 528 NM -772 MM - 856 cm - 788 cm - 92 CM -717 nm - 201 um -656 NM - 919 nm - 653 mm -106 mm -600 MM - 515 cm -402 mm - 655 UM - 729 CM -564 um - 330 A - 156 A - 598 NM - 283 A -692 MM -592 NM - 803 cm -679 cm - 6 CM - 949 UM -818 NM - 701 UM - 968 mm -116 cm - 657 NM - 643 UM - 495 A -352 mm -529 A - 758 nm - 484 mm - 281.5 A - 620 CM -320 MM - 195 CM - 159 mm - 599 NM -367 NM - 911 nm - 991 UM -619 nm - 906 A -476 UM - 830 mm -148 mm - 855 A -485 cm - 968.5 MM - 717 um -745 UM -921 nm -450 NM - 933 mm - 240 nm - 880 MM -794 A -937 cm -379 UM -11 mm -132 um - 451 mm - 652 NM - 635 cm - 638 NM - 747 UM - 78 A -312 cm - 264 NM - 80.5 um -493 A - 772 UM -174 um - 112 um -993 mm -500 nm - 104 um -346 MM -336 NM -966 A -41 mm -406 um - 579.5 mm - 583 cm - 316 CM - 29 A -647 um - 832 nm - 772 CM - 40 MM - 317 UM -480 cm - 972 A -618 cm - 941 nm - 818 cm -257 CM - 155 um -7 UM - 948 cm -189 mm -721 mm -131 cm - 267 nm -421 cm - 797 um - 157 MM -473 MM - 975 nm - 1000 cm - 190 um - 439 nm -864 um -510 cm -277.0 cm -986 cm -767 cm - 451 A -51 NM - 50 mm - 565 mm -459 A -682 cm - 344 MM -212 CM -511 cm -27 MM - 584 A -743 UM - 970 MM - 613 CM - 661.0 CM -510 UM - 46 um -717 nm -273 MM -863 UM - 737 CM - 323 nm -238 A - 568 um -679 cm - 362 NM - 784 cm -836 mm -234 um -930 nm -469 um - 595 mm - 26 A -767 nm -40 NM - 857 A - 635 nm -48 nm -196 MM - 621 CM - 861 UM - 366 CM - 691 mm - 186 CM - 725.0 A - 751 nm -44 NM - 726 NM - 127 UM -701 CM -49 um - 820 um - 260 CM -562 mm - 258 CM -87 A - 178 CM -119 A -328 nm -81 NM -170 A - 26.5 mm -356 nm -415 NM -828 NM - 472 MM -819 um - 444 UM -1 CM - 919 MM - 291 mm -939 UM - 996 CM - 839 MM -494 NM - 583 nm - 586 UM -558 um - 869 NM -748 mm - 579 UM -809 A -16 mm -602 NM - 107 UM - 620 UM -604 nm - 457 MM - 930 CM - 96 A -736 cm - 515 CM - 139 cm - 222 UM - 518 CM - 187 mm - 825 NM -477.5 NM - 373 um -288 CM -92 cm -674 mm -833 um - 590 NM -188 um - 949 A - 631 cm - 937 MM - 900 nm -361 CM - 174 CM -394 um -484 CM - 761 nm -547 UM - 720 CM - 256 MM -296 mm - 887 MM -196 NM - 641 nm -946 UM -806 nm - 906 A -688 MM -834 MM - 249 UM -431 mm -499 NM - 940 cm -432 um -294 mm -692 NM - 24 mm - 928 NM -649 CM - 82 UM - 404 um - 547 cm - 27 cm -649 UM - 528 mm - 280 nm - 755 mm - 381 mm - 187 mm -406 nm - 689 nm -947 UM - 947 mm - 984 um - 807 NM - 581 cm - 751 MM - 507 A - 972 mm -383 um - 696 MM -353 NM - 201 cm -96 MM -795.5 MM -637 nm - 318 UM -57 mm - 367 UM - 133 UM -486 um -257 NM -703 cm -10 nm -606 cm -419 A -685 UM -177 MM - 943 um - 268 nm - 83 nm -275 um -195 A -759 A - 581 NM -154 A -387 MM - 445 UM -314 cm - 724 CM -603 CM - 878 um -95 nm -974 MM - 414 NM -514 cm - 592 NM - 696 mm - 402 A - 726 CM -144.5 UM - 417 MM - 247 mm - 451 nm - 88 nm -408 nm - 343 UM - 690 um - 831 UM -546 cm - 811 UM -212 A -178 A -824 nm -644 cm -58 NM -241 UM - 424 NM - 571 A - 43 cm - 8 nm -404 nm -67 CM - 354 um -236 mm - 699 cm - 23.5 CM - 731 CM - 490 mm -619 um - 613 MM -739 A -839 cm -216 cm - 667 MM - 840 A -517 A -20 um -618 um - 6 mm -978 nm - 181 mm -116 UM -656 A -379 mm -164 nm - 283 MM -757 um - 568 mm - 354 UM - 827 MM - 908 A -910 um -152.5 NM - 757 UM - 388 NM - 119 nm - 908 A -615 A - 740 nm - 605 um -649 cm -716 CM -670 NM - 722 um -79 um -137 um - 64 NM -486 UM - 300 cm -732 CM - 719 NM - 22 um - 337 A - 411 NM - 811 A - 812 UM - 258 CM -467 A -285 mm - 90 nm - 862 MM -982.5 nm -267 CM -597 A -729 um - 960 UM -911 UM -544 CM -135 NM -723 A -892 um - 19 A - 975 mm -878 um - 217 um - 763 CM - 523 MM -745 NM - 572.0 UM - 844 A - 953 NM -435 NM -96 mm -744 NM -741 UM -330 NM - 862 NM -36 A -445 nm -253 UM - 419 cm -703 nm -532 CM - 996 UM - 585 NM - 40 mm - 481 UM -724 UM -149 MM -86 um - 915 A -809 CM - 588 nm -609 NM -797.0 A - 871 UM -556 NM -846 mm -906 CM - 793 UM - 299 um - 485 A -120 cm - 668.0 UM -424 CM -492 um -616 UM - 283 NM - 674 A -624 UM -461 NM - 818 A - 478 um - 705 NM - 746 CM - 222 UM - 779 mm - 994 A -504 um -735 A -574 UM -999 mm -189 um - 846 nm -314 MM -901 UM - 290 CM - 274 NM - 739 MM -979 MM -217 um -617 UM - 24 UM -994 mm -555 MM -372 mm -572 CM - 805 NM - 754 MM -790 UM - 209 CM - 127 nm -605 um -426 MM -310 A -895 mm - 841 A - 586 um -549 nm - 668 MM - 594 UM -186 nm - 974 MM -938 MM - 815 mm -750 mm -9 cm - 717 nm -125 nm -535.0 A - 776 CM - 48 mm -620 um -363 A -535 MM - 438 MM -255 mm -415.5 CM - 151 cm - 572 UM -259 CM -880 cm -625 mm -920 um - 918 cm - 16 mm -861 NM - 735 MM - 127 mm - 985 MM - 516 cm - 169 NM -205 cm - 224 NM - 98 cm - 224 nm - 848 MM - 957 um - 924 MM - 867 UM - 47 A -567 MM -360 NM - 439 UM -970 UM - 404 nm -649 cm - 579 um -712 MM - 126 UM - 795 MM -200 mm - 424 CM -303 A -487 CM -984 nm -794 um -550 UM -954 UM - 557 CM - 76 UM - 583 cm - 948 UM -640 NM - 413 UM - 788 NM -462 nm -481 cm - 465 CM - 100 mm -663 nm - 988 NM - 857 UM - 292 A - 186 nm - 547 cm -180 MM -801 um -11 CM - 907 A -201 mm -260 nm -474.0 UM -566 mm -872 CM -5 mm - 857 um -25 um - 970 nm - 825 cm - 7 NM - 99 um - 411 cm - 919 A -948 MM - 71 CM - 56.5 CM -112 UM -638 A - 911 NM - 510 MM - 154 UM - 219.5 um -312 cm -287 MM -828 MM - 578 MM - 421 mm -667 cm - 368 mm -24 um - 562 UM - 448 NM - 104 MM - 999 nm -337 mm - 126 A - 73 A - 675 MM -562 A -957 um - 967 A - 140 MM -271 UM -957 cm -855 MM - 613 um -279 nm -337 mm - 756 NM - 321 nm -478 cm -724 CM -440 um - 926 mm - 486 mm -853 nm -934 mm - 275 cm - 114 CM -56 NM - 21 cm - 913 MM -837 mm - 271 UM -259 nm -59 MM - 322 NM -821 mm - 926 mm -679 UM - 887 um -858 A -376 CM -592 mm - 442 cm - 214 CM - 648 NM -484.0 mm - 789 MM - 802 cm -922 A -502 cm - 654 cm - 592 cm - 898 A -103 nm -304 UM - 124 A - 570 MM -192 CM -200 mm - 661 UM -134 um -540 cm -479 A -2 CM -552 UM -819 nm - 630 A -126 nm -288 cm -609.0 um -698 A - 847 um - 783 NM - 826 mm - 520 cm -948 NM - 682 A - 765 um - 3 A -393 nm -941 A - 633 um - 975 cm - 645 cm - 446 MM -275 A -150 A -88 um -339 CM -350 A - 804 A -641 mm - 688 MM - 788 MM - 103 NM - 907 MM -675 MM - 769 UM -799 CM - 736 CM - 36 mm - 994 mm - 159 cm -850 A - 355 um - 735 MM - 881 nm - 235 A -952 UM -430 nm - 795 A -128 mm -939 CM - 341.0 MM -659 UM - 608 A - 44 cm -965 MM - 484 MM - 139 UM - 421 um -635 CM - 559 UM - 231 mm - 276 UM -919.0 A - 383 nm -80 nm - 465 mm - 77 nm -721 cm -471 um -177 cm -957 um -201 MM -173 mm - 998 UM -855 cm -972 UM - 994 cm - 514 UM -68 mm - 367 UM - 541 CM - 90 CM -529 nm - 253 CM -268 cm -295 um -425 CM -770 um -391 MM -364 mm -848 MM -378 nm -14 cm -8 cm -20 um -677 A - 306 um - 721 CM - 269 A -563 cm - 137 CM -344 mm -29 NM - 415 nm - 161 UM -887 CM -313 um -304 um - 338 MM - 570 MM - 927 UM - 468.0 cm -99 mm - 650 cm -681 MM -484 mm - 472 CM -180 mm - 992 cm -667 CM - 913 A -564 mm -249 MM -634 NM -643 A -962 CM - 461 UM -178 NM -220.5 CM -578 NM - 449 NM -598 um - 581 MM - 34 NM -782 mm -54 NM - 620 mm -740 um -472 nm -77 A - 256 NM -249 MM - 97 um -332 um - 801 CM - 718 CM -222 nm - 509 nm -189 UM -53 cm -135 MM -327 cm - 881 MM - 2 NM -741 CM - 570 MM -919 A -916 um - 158 NM -195 UM - 419 um - 902 NM -184 A -874.0 UM - 953 UM -921 CM -38 MM - 938 MM - 478 NM - 882 A - 913 mm -714.0 cm -876 mm -820 um - 289 UM -272 mm -580 A - 797 mm - 485 CM -734 UM -606 A - 13 CM - 259 MM - 956 CM -738 UM - 569 um -845 CM - 893 A - 659 mm -767 MM - 731 mm -858 NM -386 CM - 290 cm - 563 UM - 717 UM -824 um - 722 um - 792.0 um - 706 CM - 176 CM - 96 CM - 748 NM - 195.0 UM - 646 UM - 667 cm - 22 MM -418 um - 21 MM -201 MM -134 A - 273 mm -244 mm - 710 cm - 797.5 NM - 264 CM -449 um -565 NM -418 um -424 nm - 999 A -520 nm -656 UM -257 A - 775 cm -360 mm - 770 CM -3.0 cm -861 CM - 632 nm - 420 cm - 314 MM -698 cm -621 NM -742 nm -528 mm - 46 NM - 918 MM -284 A - 312 nm -228 NM -139 CM - 708 CM -886 CM -35 UM -494 mm -441 UM -803 um -613 CM - 990 nm - 681 MM - 244 UM -73 A -934 cm -872 NM -667 A -574 MM -561 mm - 677 A -100 nm - 363 mm - 549 A - 271.5 MM - 779 A -884 A -875 CM - 564 cm - 184 mm - 532 A - 106 cm - 121 cm -533 MM - 422 mm -166 NM - 661.5 nm - 69 UM - 289 um - 52 NM -5 MM - 408 A - 221 cm - 923 UM - 742 MM - 845 UM -409.0 nm -624 UM - 947 nm -822 UM -647 UM -529 nm - 240 um -386 CM - 268 MM - 709 UM - 127 MM -490 mm - 217 NM -565 CM - 623 cm - 344 cm -476 um - 536 um -268 UM - 279 UM - 210 UM -669 CM - 667 NM - 313 NM - 737 mm -138 MM -1000 NM -147 nm -338 mm - 159 CM - 428 NM -49 mm - 318 nm -290 um - 808 um - 966.0 UM - 296 nm -515 mm - 136 CM -943 MM -490 CM -133 um -398 A - 858 MM - 274 um -712 cm -270 MM -259 mm -808 nm -585 CM -213 MM -28 UM -988.5 um -508 nm -44.0 CM -631 A -569 MM - 633 NM - 50 UM -707 A - 697 CM - 806 NM -704 CM - 783 nm - 129 NM - 66 mm - 502 NM -677 A - 490 cm -849 um - 535 NM -976 cm -247 NM - 317 MM -900 nm -700 A - 965 nm -616 A - 2 A - 64 nm -179 nm - 963 MM -488 CM - 962 NM - 755 NM - 824 NM - 154 NM - 933 cm - 952 NM -429 cm -388 nm -157 UM -996 cm - 773 mm -60 um -579 NM - 129 CM -771 cm - 273 cm - 439 UM - 895 nm -383 UM - 711 nm - 872 CM - 97 CM -819 cm -54 A -783 cm - 963 NM -916 UM -268 MM -735 nm - 783 um - 236 UM - 175 MM -831 A -302 CM - 44 cm - 544 um - 121 CM -793 cm -802 NM - 604 mm -572 mm - 569 nm - 117 nm -803 nm -889 um -57 NM - 985 NM - 50 A - 308 mm - 11 CM -732 um - 420 MM -757 um - 61 mm -887 UM -389 A - 81 um - 462 A - 73 CM - 989 nm - 463 MM -642 nm - 512 NM - 74 nm - 674 nm - 136 CM -94 CM - 859 cm -123 nm -377 CM - 697 MM - 758 nm - 866 CM - 35 NM -447 A -745 A -456 mm - 345 CM - 514 MM -674 NM -506 MM -925 um -995 cm - 877 mm -548 A - 146 NM -402 A -424 A -591 cm -191 nm - 760 UM -851 A -872 A - 40 MM - 874 A -309 UM -698 MM -502 nm -445 A -270 A - 8 MM -84 A - 810 UM - 498 mm -295 nm - 225 A - 502 NM -325 um - 999 um - 212 NM -602 MM - 929 UM -312.5 NM - 252 A - 975 cm - 835 NM -509 mm -818 um -747 UM - 100 MM -607.0 MM - 24.0 cm - 938 nm - 668 MM -702 nm -855 UM - 698.5 um - 250.5 A - 812 A -5 cm - 336.5 mm -928 nm -555 NM - 32 nm - 725 UM -595 nm -891 nm -17 MM - 157 A -551 nm -903 MM - 911.5 NM -754 um -604 um - 222 nm -241 nm - 692.5 um - 319 UM -976 mm - 935.5 cm - 15 MM -657.0 cm - 864 cm -757 CM -92 NM - 811 nm - 131 CM - 964 cm - 81 A - 26 nm - 952 A - 624 MM -903 um -34 cm - 789 NM - 875 CM -2 A -476 mm - 115 MM - 227 MM -912 cm -850 UM - 938 A - 212 CM -182 nm -950.0 A -974.0 cm - 265 CM -32 um -989 CM -910 CM - 350 nm - 973 MM -288 cm - 930 um - 363 MM -827 cm -256 nm -209 um - 977 cm - 270 NM -235 CM - 501 cm -668 NM -976 cm -918 MM - 773 UM -219 UM - 914 NM - 196 A - 358 NM -586.0 A - 356 cm - 991 UM -230 A -383 UM -975 A -966 um - 189 NM -142 UM - 459 NM - 892 MM - 785 nm - 640.5 MM - 5 A - 484 MM - 144 cm -470 cm -849 cm - 516 cm -865 UM -105 CM - 665 mm - 115 cm - 519 CM - 720 A - 1 CM -66 mm -847 nm - 504 mm - 938 MM - 916 NM - 62 mm -398 cm - 151 cm -449 cm - 583 mm - 727 NM -998 UM - 71 CM -167 A -237 cm - 677 MM - 57 UM - 148 MM -715 A - 560 mm - 691 A -110 mm - 564 MM - 102 A - 197 MM -690 cm - 364 MM - 848 A - 632 um -646 NM - 334 CM -985 NM - 476 um -844 A -446 mm -191 NM - 972 NM -493 um -156 MM -369 MM -898 UM -866.5 UM -578 A - 874 A - 26 MM -638 MM -67 nm -41 UM -568 NM - 966 UM - 731 cm - 629 mm -597 CM -220 CM -745 nm -195 mm -914 CM - 582 NM - 667 MM -235 mm - 197 um -844 nm -914 nm - 968 MM - 367 NM - 108 cm - 136 CM - 389 CM - 835 CM -383 um -678 MM -217 MM -910 MM - 946 cm -928 mm - 673 nm - 966 cm -964 MM -179 UM - 460 nm - 589 UM -981 um - 291 UM -770 cm -932 mm - 120 CM -342 NM - 564 CM -808 A -443 CM - 9 cm - 993 cm - 608 A - 280 CM -563 A - 352 UM - 252 um -19 mm - 141 MM - 877 NM - 306 MM - 673 CM - 379 NM -863 CM -270 um -759 mm -996 mm - 385 A - 647 mm -471 A - 516 um - 882 NM - 590 A -992 mm -941 UM - 606 um - 301 cm -674.5 A -826 NM - 45 A -310 nm - 350 NM - 917 NM -862 mm - 417 CM - 882 mm - 137 A -166 MM - 473 CM - 326 mm -158 mm - 42 nm -791 CM - 696 um -708 mm -835 nm -175 UM -35 mm - 325 A -630 NM - 128 cm -700.0 cm -926 MM -354 NM -834 MM - 6 nm -839 um -674 mm - 741 nm - 63 UM - 399 um -518 MM -136 A -653 NM - 166 mm - 425.5 CM -148 mm - 403 A -121 UM - 407 UM - 3 um -314 A - 764 CM -279 UM -544 mm - 118 nm -413 CM - 914 um - 930 nm -414 mm -517 um - 630 um -983 um -579 mm - 612 cm - 644 NM - 418 um -988 CM - 747 cm -849 um - 72 UM - 225 cm - 38 MM - 197 A - 969 cm -416 MM -562 A - 154 nm - 684 cm - 127 NM - 612 mm - 427 NM - 141 A - 281 um - 835 mm -73 A - 828 NM - 778 NM - 28 A -387 mm -489 UM - 564 um - 592 cm -397 nm - 311 um - 48 UM - 193 cm -860 mm -622 NM -946 A - 396 nm - 355 cm - 383 UM - 587 CM - 308 nm -243 nm -912 MM - 654 CM - 676.5 UM - 157 CM - 217 CM - 516 UM - 814 A -654 um - 208 MM - 398 UM -100 cm - 350 MM - 368 nm - 432 cm -190 MM - 318 CM - 861 mm -749 mm -932 cm - 698 A -442 nm - 782 UM - 440 nm -245 CM - 229 NM -344 CM -133 nm -636 UM -955.5 mm - 34 MM - 973 nm - 763 mm -122 cm - 300 CM - 610 nm -656 NM -211 NM -873 NM - 851 MM - 844 mm - 628 mm - 641 A - 944 nm -487 NM -773 CM -884 NM - 825 NM - 820 um - 40 um -502 A -143 mm - 538 NM -787 MM -34 cm -357 MM - 218 mm -513 CM - 544 MM - 320 A - 634 mm - 387 A -764 NM -935 NM -203 cm -367 um - 661 A -876 MM -659 NM - 952 UM -596 CM -813 cm - 877 UM -21 MM -28 MM -647 A -572 nm - 777 CM -461 um -240 A - 143 NM -682 NM -706 um - 302 mm - 745.0 UM - 385.0 NM -729 um - 335 UM - 969 NM - 964 UM -410 CM -546 nm -588 A -300 nm -814 MM - 85 NM -30 NM -74 NM -489 NM - 196 CM -418 A -874 A - 120 um -29 um - 985 CM - 439.5 NM - 365 cm -660 NM - 453 CM -961 A - 252 um -615 cm - 226 mm - 368.0 nm -447 mm - 490 NM -66 A -80 um -582 mm -158 MM -927 cm -969 A -758 nm - 217 um -651 UM -358 A - 305 CM -507 MM -604 mm -65 UM - 504 mm -622 UM - 532 NM - 932 NM - 816 um -635 NM -116 CM -429 CM -93 UM -98 mm -158 A - 168 CM -795 MM -437 cm -351 UM -610 A - 472 um - 282 um - 103 mm - 927 CM -1000 UM -629 A -631 cm - 896 A - 157 NM - 901 um - 654 NM - 995 UM -187 MM -254 UM -326 MM -247 nm -735 MM - 158 UM - 545 MM - 961 MM - 756 cm - 358 nm -730 MM -363 A - 364 A -280 cm - 110 UM - 374 CM -726 CM - 199 CM - 332.5 cm -566 A - 789 mm -542 CM -102 UM -618 MM -463 mm - 606.5 A -148 um -963.0 mm - 238 mm - 473 cm -533 mm - 902 cm - 860 NM - 470 UM -365 UM -499 MM -811 um - 150 um - 332 nm - 16 nm -240 A -758 nm - 818 CM -919 CM - 85 UM -453 NM - 992 cm -802 um -798 cm - 339 UM - 651 A - 74 UM - 284 UM -292 UM -27 cm - 255 CM - 855 NM -766 A -31 um -805 um -367 nm -159.0 cm -190 um -663 NM - 191 mm -899 um - 782 um -217 NM - 165 NM -216 MM -364 cm -680 cm - 660 UM - 926 nm - 583 mm -512 mm -715 mm - 888 CM -484 NM -577 A -933.5 mm - 562 CM -244 um - 759 NM -843 um - 351 A -256 UM -345 um -916.5 nm - 137 CM -483 cm -219 NM - 561 nm -548 CM - 883 um -375 CM -314 MM -995 CM - 207 cm - 961 NM -775 mm -83 A -484 nm -144 UM -102 CM - 795 UM - 975 CM -376 mm - 520 NM - 676 UM -571 A -588 nm -561 UM - 156 CM - 927 NM -727 nm - 4 um -785 cm -705 cm - 470 um - 695 MM -126 cm -226 UM -421 MM - 174 UM - 451 MM -335 nm -724 um -4 MM -51 um -519 nm - 809 MM -280 cm -542 cm - 319 cm - 787 UM -813 UM - 149 CM - 412 um - 704 A - 645 CM -974 um -151 cm - 297 CM -972 NM -191 MM -826 CM - 996 cm - 102 mm -78 cm -477 cm -892 MM -43 MM - 229 nm -870 UM - 655 NM - 642 UM - 628 cm -660 um - 36 A - 710 um -101 mm -719 nm -102 MM - 88 UM -784 NM -701 nm - 186 UM - 958 mm -758 nm -575 A -674 MM -750 mm - 27 cm - 630 MM -229 MM - 906.0 cm - 419 MM - 646 UM - 170 mm -595 A -643 cm - 531 UM -132.5 NM - 96 cm -739 MM -863 CM - 142 um -945 nm -595 CM - 301 MM -152 um - 257 MM - 972 NM - 186 CM -291 um -971 A - 896 NM - 947 UM - 337.0 um -222 A - 398 nm -694.0 cm -514 um -363 MM -476 um -477 nm - 534.0 NM - 451 mm - 62 nm -26.0 mm -534 UM -261 nm -640 NM - 608 CM - 789 MM -569 UM - 677 mm -457 cm - 532 UM - 705 mm - 268 CM - 180 UM - 872 UM -129 MM -863 cm - 31 CM -935 cm -228 cm -128 MM -763 mm -175 mm -411 CM -711 mm - 359.0 MM -894 MM - 551 MM -88 CM -368 nm -92 A - 574 nm - 873 A -849.5 CM - 865 NM - 722 um -26 nm - 596 CM -956 nm - 553 mm - 647 nm -603 mm - 668 CM - 749 MM - 116 cm -156 NM - 924 nm -819 nm - 191 um -926 cm -944 um -878.5 cm - 286 mm - 48 A -797 nm - 160 NM - 38 MM -30 NM - 262 um -62 NM - 866 mm -45 CM -933 mm - 960 nm -245 CM - 84 A - 937 A -260 CM - 652 NM - 685 UM -405 CM - 716 A - 529 UM -223 cm -50 nm -244 CM - 860.0 cm -595 nm -649 MM -184.5 UM -241 um - 270 NM - 70 UM -490 CM - 945 NM - 894.0 CM -929 UM - 938 UM -521 UM - 715 mm -869 mm -139 um - 727 um -855 A -382 UM - 488 CM - 118 nm - 911 A -377 NM -477 NM -911 UM -126 UM - 252 A -622 um - 138 um - 794 mm -908 nm - 674 A -149 A -577 NM - 461 UM - 585 nm -891 A - 726 MM - 718 mm - 740.0 NM - 409 CM - 425 nm -215 CM -467 cm -981 UM - 67 um - 253 UM -914 um -276 um -636 NM - 527 NM - 76 CM -157 MM - 245 cm -556 MM - 233 MM - 878 MM - 196 cm -196 CM - 58 MM -559 MM -823 MM - 695 NM - 94 cm -219 MM -148 A -249 nm -494 MM -494 MM - 676 A -525 mm -29 MM -637 UM - 871 mm -736 A -426 mm - 106 UM - 351 NM - 116 A - 811 um - 95 CM -455 um - 143 NM -300.5 cm - 898 NM -668 A - 515 nm -456 CM -485 A - 300 CM - 321 A -62 UM - 233 mm - 623 NM -704 NM - 120 MM -211 um -850 CM -878 UM - 868 um -661 cm - 372 nm - 455 mm -722 MM - 320 CM - 441 MM -216 nm -231 A - 701 CM -326 MM -632 NM -478 A -166 mm -643 cm -950 CM -159 nm - 610 nm -58 UM - 51 UM -61 um - 649 mm - 728 mm -373.5 CM -776 MM - 151 A -381 MM -9 cm - 994 um -448 nm -661 CM - 793 A -162 nm - 297 A -465 um -817 MM -233 NM -41 CM - 902.5 UM -973 NM -596 CM -155 um -893.5 CM - 268 mm -136 nm -784 UM - 639 CM -455 mm -251 CM -158 um -365 mm -892 A - 303 um -779 MM - 378 um -902 cm -830 A -893 NM -759 um -465 MM - 706 nm - 692 NM - 97 UM -878 UM -887 CM -939 mm - 912 nm -752 CM -328 MM -931 um -127 CM -508 UM - 50 NM - 391 um - 663.0 A -45 nm - 388 mm -877.0 um - 170 um -849 MM - 33 NM -529 NM - 759 A -670 NM - 521 CM -993 UM - 669 mm - 72 um -628 A - 435 CM - 657 mm -68 NM -979 A -779 nm - 559 cm -246 A -233 CM -611 UM - 806 UM - 256.0 MM - 618 nm -863 NM - 402 UM -21 nm -569 mm -321 CM -981 A -472 NM -10 nm - 643 UM - 132 NM - 188 A -733 nm - 779 CM - 66 nm - 104 nm - 627 mm -535 CM -21 mm - 872.0 cm - 885 UM -652 cm -739 NM -799 cm -433 MM -505 NM -513 mm -469 A -136 UM -856 um - 357 CM -219 CM - 754 A -911 A - 648 A - 423 um -231 NM - 23 nm -626 um -243 cm -261 CM - 791 A - 41 CM -670 um -602 A -834 um -714 mm - 812 MM -121.5 UM -659 nm - 51 nm -349 A -644 cm - 367 mm - 232 NM - 787 mm - 804 mm -577 CM - 991 CM - 832 cm - 26 nm -997 NM -333 MM -285 MM - 324 MM -632 CM -550.0 UM - 297 mm -210 A -533 NM -953 um -223 MM -244 CM - 849 NM - 412.0 MM - 794 mm - 391.5 A -264 nm - 181 cm - 218 mm - 554 A -819 NM - 998.0 nm -966 nm - 395 nm - 208 A -127 nm - 872 CM -649 A - 898 mm -963 um - 511 A - 730 cm - 80 cm -126 UM - 7 CM - 617 A - 739 cm -453 um - 905 nm -241 cm -962 A - 443 A - 588 MM - 885 CM -612 cm - 522 A - 928 CM -955 NM -839 cm - 239 cm -843 cm - 648 mm -744 cm - 111 cm -385 nm - 21 A - 344 mm - 587 cm - 743 MM - 746 MM - 356 A -573 CM - 931 UM - 460 MM -165 cm - 281 nm -314 MM - 182 um -265.5 cm - 458 CM -137 cm -793 cm -762 MM -501 mm - 162 CM -843 MM - 769 UM -237 CM -44 MM - 828 UM - 837 MM - 985 nm - 575 mm -122 MM -593 MM -952 MM -151 cm - 652 cm -144.0 nm - 762 NM -2 A - 781 CM - 469 nm -422 cm - 173 A - 259 CM -949.5 CM - 777 um - 396 NM -882 UM - 382 UM -939 MM - 79 UM -490 MM -216 A -548 UM - 553 A -317 cm -210 UM -472 mm - 398.5 cm -460 mm - 999 cm - 782 MM - 677 NM - 45 um - 156 UM - 815 um - 590 nm - 363 A - 396 MM - 929 A - 448 mm -71 nm - 966 CM - 411 um - 37 UM -315 nm - 419 um -824 CM -775 MM - 109 mm - 31 MM -281 nm -466 cm - 4 UM - 550 CM - 770 NM -454.0 UM -394 mm - 130 nm - 262 UM - 726 CM - 533 mm - 765 cm -159 A -101 NM - 69 um -22 MM -434 CM -770 nm -933 um - 552 mm -457 CM - 663 um - 887 CM - 53 cm -940 cm - 164 A -696 MM - 597 A - 134 cm -57 mm - 114 CM -231 UM -728 CM -30 mm - 548 nm -578.0 A - 572 UM -653 MM - 778 CM - 3 CM - 672 mm -825 A - 201 MM -149 UM -849 cm - 330 NM - 407 MM -517 MM - 424 nm - 212 MM -724 NM - 401 MM -609 cm -21 cm - 918 UM - 409 MM -416 cm - 21 A - 11 UM - 303 A - 532 CM - 142 A - 244 um -405 UM - 515 nm - 370 A -350 A -37 MM -694 nm -451 mm -918 MM - 64 CM - 861 UM -422 nm - 635 A -868 mm -476 UM -879 A -484 nm -286 nm -212 CM - 326 mm -749 CM - 341 NM -607 CM - 624 um -447 UM -987 NM - 331 UM -547 um -854 nm -299 mm - 714 CM - 105 UM -348 NM - 632 MM -732 NM - 884.5 UM -664 MM -299 cm -928 A -103 MM - 610 CM - 393.5 MM -475 um - 635 MM - 24 um -284 MM - 397 MM - 132 NM - 535 A -888 A -875 A -163 CM - 991 CM -846 A -354 NM -154 UM - 755 cm - 417 mm -590 um - 763 NM -322 A -594 A - 786 A - 843 cm -617 A - 735 UM - 836 MM -573 cm - 835 cm - 989 cm -640 A -740 mm -229 um - 837 mm -655 cm - 911 um -495.5 mm - 153 MM -272 mm -63.0 NM -959 NM -375 NM - 386 um - 90.0 cm - 936 cm -360 CM - 807 UM - 919 CM - 756 MM -402 cm - 673 MM -723 UM -187 UM -724 A -919 A -507 um -931 um - 832 MM - 680 mm -562 A - 1000 cm - 964 CM -573 NM - 145 CM - 848 nm -55 NM - 371 CM -845 CM -50 A - 322 MM -200 cm - 522 CM - 415 nm - 524 cm -664 A -127 nm -34 cm -623.5 um -232 A - 908 A - 191 mm -759 nm -535 NM - 847 cm - 172 mm -514 CM - 101 nm -342 um -268 mm -157 NM -902 A -59 um -376 UM -471.5 UM -280 NM - 282 mm -43 nm - 365 UM -178.5 nm -99 NM -19 nm - 849 UM - 127.5 NM - 999 UM - 68 A -450 A -154 um - 934.5 nm -749 MM -868 UM - 98 nm -591 UM -872 CM - 369 MM - 388 MM - 956 cm - 764 um -633.5 UM -553 cm -773 MM - 790 nm - 978 NM -546 CM - 743 cm -45 cm -86 CM - 180 NM - 558 MM - 124 NM - 737 A - 571 mm -997 NM -928 CM - 841 cm - 438 um -474 mm - 915 NM -173 A - 463 CM - 175 um - 115 CM - 542 mm -595 MM -905 MM - 416 NM -311 cm -309 CM - 13 NM -738 mm -296 MM -751 CM - 978 NM -528 UM -693 NM -73 MM -37 A -8 UM - 873.5 NM - 514 um - 164 CM -462 CM -446 NM - 52 um -78 um -217 um - 593 um -265 nm -504 MM - 19 NM - 243 um -654 mm -894 NM -909 um - 820 mm - 337 NM - 547 NM - 4 um - 732 MM - 52 mm -367 mm - 751 NM - 58 um - 286 CM - 466 um - 768 nm -723 MM - 16 UM -272 um -183 NM -327 A -770 NM - 987 um - 380 cm -322 CM - 593 A - 833 mm -762 cm -665 cm - 410 A -464 CM - 222 MM - 911 mm -469 nm - 139 nm - 4 A - 709 mm -200 MM - 132 nm - 131 A -119 UM - 684 MM -215 cm - 838 NM - 342 CM - 595 um -108 um - 548 mm - 775 um - 273 cm -312 nm - 71.5 mm -690.0 nm - 567 nm -343 A - 172 cm -510 UM - 418 NM -767 NM - 623 UM - 561 CM - 976 CM -978 CM -512.0 NM -65 nm -897.5 cm - 807.5 cm - 658 mm - 491 A - 333 MM -926.0 um - 296 A -219 MM -323 NM - 306 mm - 452 nm -254 cm - 491 nm - 699 UM - 102 MM -193 um - 312 NM - 616 um -17 mm - 175 um - 301 CM -425 MM -883 UM - 491 cm - 560 mm -300 CM - 390 NM - 38 um - 334 um -437 mm -206 MM - 609 A -460 A - 972 UM -519 A - 898 cm - 33 um -99 mm -105 mm -413.0 nm - 863 NM -287 UM -816 A - 216 cm -269 cm -278 cm -667 um - 57.0 cm -460 NM - 397 cm - 280 NM - 835 A - 892 cm -996 nm - 58 A - 568 NM -302 UM -573 CM -221 um - 847 nm -262 nm - 853 cm - 941 MM -727 mm -197 um - 742 cm - 165 UM - 467 NM - 374 mm -142 A - 502 NM -638 mm - 593 mm -222 um -669 cm - 254 mm -446 NM -127 nm - 120 NM -506 CM - 7 A - 459 um -121 mm - 427 UM - 94.5 cm -953 CM -767 mm - 944 mm - 849 cm -502 um - 232 UM - 291.0 mm - 262 NM - 393 mm - 990 nm -871 MM - 909 um -538 CM -14 mm -589 UM - 505 A - 413 um -870 CM -789 CM - 853 CM - 707 mm - 679 um -984 CM - 435 mm -897 UM - 340 MM - 693 CM - 179 A - 366 NM -493 NM - 416 um - 432 A - 896 CM -700 um - 772 nm -912 CM - 907 um - 42.5 MM - 698 cm -622 NM - 505 nm -131 NM -33 UM - 581 mm -5 cm -49 A -288 NM - 459.0 CM - 835 A - 510 UM - 12 nm -817 mm - 249 um - 477 cm - 952 UM -682 nm - 865 um - 596 nm - 649 um - 719 NM - 828 NM -348 um -576 UM - 517.0 nm - 340.0 MM - 397 nm - 800 NM -66 cm -362 UM -129 cm - 971 NM - 569 um -655 cm -999 NM - 35 um -768 MM -438 um -654 mm - 979 NM -416 NM -190 cm - 248 A -208 CM - 244 A - 345 CM -838 um -843 cm -177 UM -810 cm - 382.0 NM -928 A -23 CM -806 MM - 889 CM -575 CM -645 nm - 844 nm - 164 NM - 32 CM - 375 NM -813 UM - 970 nm - 832 NM -230 NM - 472 CM -75 mm - 955 mm - 410 UM -30 cm - 264 CM -753 A -560 um -127 A -988 NM - 489 NM - 74.0 CM -760 UM - 291 nm -764 cm -81 CM -388 A - 670 MM - 229 um -287 cm - 577.5 UM -770 MM -846 UM - 9 MM -695 NM -790 um - 507 A -622.0 CM -127.0 cm - 238 nm -381 cm -868 mm - 969 MM -553 nm - 414 mm - 469 NM -182 CM - 97 UM - 734 nm - 814 MM -744 A -120 MM -998 um -653 um - 940 cm -889 mm - 775 NM -710 um -712 cm -182 NM -759 mm - 772 NM - 298 CM - 778 UM - 906 CM - 387 um -722 mm - 614 nm -938 UM -816 mm -339 UM - 598 mm -839 CM -98 UM -934 UM - 16 A -116 mm - 959 MM - 974 MM -950 cm - 4 cm - 761 A -34 nm -234 UM -743 NM - 224 nm - 761 nm - 22 mm - 269 um - 302 CM -78 nm -95 UM -221 UM -383 MM - 951 cm -295 NM -546 A -715 UM -376 nm - 280.0 mm -645 mm -877 UM -250 NM - 478 UM - 80 MM -295 CM -586 CM - 373 cm - 660 A -343 A - 504 UM - 885 UM - 256 NM - 495 um - 116 um - 1 UM - 662 CM -11 MM - 453 UM -863 CM - 252 NM - 470 um - 618 NM -392 um - 492 um -166 NM - 812 A -866 mm - 864 um -738 CM - 855 cm -462 MM -99 CM -225 nm - 247 nm - 68 A - 756 MM -287 mm - 165 A - 574 A - 596 CM -203 cm - 704 A - 355 cm - 185 UM - 220 mm -617 UM - 443 MM -517 um -539 um - 36 CM - 60 mm -795 um -39 mm - 209 A -313 NM - 934 A -142 um -71 CM - 746 nm -412 NM -506 nm -491 um -496 UM -234 um - 65 um - 325 nm - 560 MM - 879 UM -60 cm -695 NM - 144 NM -386 UM - 768 CM - 106 UM -623 UM -503 UM - 257 CM -442.0 cm -819 NM -628 um - 442 CM -659 NM -320 A -618 NM -634 cm -739 cm - 64 NM - 943 A -44 A -400 MM -383 nm - 170 mm - 383 UM -820 MM -354 um - 632 mm -456 mm - 266 A - 467.5 NM -29 cm - 516 A - 951 CM -585 A -859 NM -618 nm - 292 mm -365 um - 139 um - 417 um - 597 NM -966 NM -445 UM -574 UM -889 nm -887 A -357 A -604.5 cm -339 MM - 745 cm -801 CM -956 A -539 NM - 737 mm - 262 mm -627 MM -342 UM - 458 mm -816 A -789 um -917 cm -877 um - 223 A - 569 MM -41 A - 200 cm - 276 MM -821 cm - 854 UM -81 CM - 706 MM - 691 um -533 CM - 478 MM -349 mm - 470 A -44 MM - 647 CM -551 nm -732 MM - 472 mm - 633 nm -751 um - 530 mm - 376 nm - 328 CM - 388 A -962 NM - 357 nm -562 NM -293 mm - 983 CM -279 A -23 UM - 411 cm -48.5 cm -708 um -30 NM -896 mm -514 A - 564 nm - 364 mm -714 cm -111 mm -557 um -446 CM - 788.0 UM - 485 um -665 NM -308 MM - 663 um - 463 MM -295 cm - 358 UM -170 cm -790 CM -77 MM -186 A - 314 mm - 56 nm - 339 cm - 67 MM -173 A -718 CM - 10 UM - 61 mm -856 mm - 619 cm -132 nm -199 nm - 547 cm -925 CM -776 MM - 874 nm -82 cm - 509 cm -57 cm - 121 CM -240 CM - 930 UM -276 A -445 cm -806 cm -248 mm -198 mm -686.5 CM - 718 mm - 548 mm - 673 UM - 493 cm - 78 um -826 cm -224 A - 475 nm -36 NM - 84 um - 240 MM - 517 mm -202 UM -351 A -833 A -128 NM -361 mm - 446 cm -150.5 A -427 A - 30 nm -490 MM -674 mm -473 nm -845 MM - 6 MM -753 mm -208 NM - 165 nm -582 NM - 279 um -792 CM - 686 CM -924 MM -812 UM - 325 MM -767 MM -378 A - 761 UM -246 cm - 811 A -217 NM -944.5 mm -988 UM - 164 A - 569.5 CM - 942 MM -513 MM - 832 MM -348 MM -803 um -32 nm - 479.0 CM -154 cm - 449 CM - 85 A -589 MM - 725 cm -683 mm -619 A -139 CM -191 nm - 509.0 A - 353 UM -668 UM - 105 nm -812 mm - 572 NM - 29 UM - 454 CM -943 mm - 685 um - 836 MM -976 UM -727 MM - 333 nm -910 NM - 8 NM -649 MM -887 nm -830 CM -40 um -971 A -680 cm - 673 cm - 653 A - 409 um -964.5 NM -731 mm - 661 CM - 347 CM - 42 CM - 102 MM - 87 nm -278 um - 751 CM - 279 MM - 334 NM - 688 MM - 257 CM -433 cm - 707 MM - 725 um -478 MM -702 cm -591 um - 723 CM -456 cm - 522 cm -569 um -136 cm - 685 NM - 107 A - 507 A -744 mm -573 CM -238 NM -818 mm - 81 CM - 515 CM -890 CM - 985 MM - 214 MM - 373 CM -604.5 NM - 884 UM - 442 nm -355 A -840 nm - 76 mm - 213 MM - 197 MM - 252 A - 876 nm - 874 cm - 867 cm - 37 MM -295 A - 501 um - 280 um -834 cm - 532 NM -121 CM -392 UM - 79 um -495 CM -684 um - 383.0 um - 188 cm - 152 cm -695 UM - 923 NM -468 UM - 545 MM - 993 cm -461 CM - 604 CM - 474 UM - 638 cm -654 NM - 169 CM -684 NM - 677 A -639 NM - 854 um -421 UM -781 um -221 MM - 350 mm -540 mm - 299 cm - 200 NM -270.5 A -921.5 mm - 4 nm - 763 NM - 94 MM - 26.0 NM -817 CM -764 UM - 623 MM -504 NM -506 UM - 505 mm -625 nm - 18 A -558 um - 478 UM -450 UM -217 A - 10 nm - 653 mm -510 cm -363 UM -76 mm -362 um -687.5 A - 720 NM - 940 mm -746 cm - 312 mm - 466 nm - 148 CM -127 cm - 483 um - 91 MM - 144 MM -804 CM - 427 um -491 MM - 637 MM -193 cm -587 NM - 990 NM - 941 NM -918 A - 387 MM -54 mm - 403 A - 519 UM - 817 mm - 640 NM - 413 NM - 721 cm -247 MM - 395 cm -440 MM - 667 NM - 273 NM - 223 CM - 292 mm - 376 MM -427 cm -686 A - 909.5 cm - 662 NM - 196 NM - 940 um - 262 UM - 497 NM -749 cm - 794 cm -25.5 A - 359 A - 85 UM - 218 MM -473 MM -923 nm - 91 cm -577 A -716 A - 34 CM - 268.5 UM - 411 A - 53 NM - 533 mm -215.0 A - 241 mm -399 UM - 80 A -485 MM - 699 CM -239.0 cm -37 A - 210 NM - 747 A -947 NM -524 um -151 CM - 33 mm - 624 UM -599 cm -582 MM -642 CM -103 mm - 194 um - 284 CM -76 CM -672 MM - 453 A - 429 nm - 528 A -554 nm - 174 cm - 503 mm -615 A -219 um -516 UM -503 NM -818 cm - 68 MM -240 cm -101 um -742 cm - 281 MM -948 CM -205 A - 520 cm - 464 nm - 852 um -88 nm -596.5 MM -736 A - 300 CM -13 mm - 636 MM - 798 um - 672 CM -42 cm -823 um - 725 CM -243 MM -37 MM - 936 nm -205 MM -165 UM - 750 UM -417 MM - 519 nm -135 A - 911.0 A -424 NM -425 nm - 1000 MM - 863 A - 151 A -595 NM -327 UM - 572 CM -663 mm - 336 mm - 668 A - 365 nm - 903 nm - 118 MM - 632 CM - 502 A - 176 NM - 10 cm -938 mm - 520 MM - 383 cm -817 NM - 25 um - 836 nm - 694.5 NM - 839 CM -77.5 A - 492 um - 350 CM -720 A - 776 MM - 836 nm - 82 UM - 754 CM -356 CM - 418 cm -431 mm -852 MM -901 NM -496 cm - 122 A - 467 A -577 A -954 A - 398 nm - 669 nm -631 UM -583 um -130 A -530 UM -229 UM - 755 CM -291 um -646 cm - 852 A - 724 CM - 485 nm -576 CM -932 NM -887 um - 81 UM -759 um -429 MM -130 MM -61 A - 466 um - 419 UM - 247 um - 752 CM -73 A - 813 nm - 943 UM -872 UM - 466 mm -972 nm - 357 NM - 638 A - 222 UM - 674 UM -218 nm - 639 mm -660 CM -400 um - 454 MM - 855 NM - 785 mm -450 UM - 736 MM -86 NM -396 MM - 174 CM - 102 um -3 um -119 A - 813 mm - 358 mm - 133 NM -258 UM -650 CM -373 um - 225 mm -607 CM -199 UM - 419 um - 411 mm - 133 cm -971 CM -543 A - 564 CM - 702 UM - 684 nm -116 A - 210 MM -164.0 nm - 845 NM -248 A -607 MM - 842 A - 31 NM - 46 UM -180 um -893 nm -876 mm -184 um - 706 CM - 906 cm -694 CM -400 UM -953 NM -650 mm -500 nm - 515 NM -675 nm - 296 cm -325 um - 163 MM -514 MM - 137 um -265 A -774 um - 338 A - 619 UM -614 UM - 171 MM - 298 A -441 UM -380 mm -643.5 CM -295 um - 544 mm - 148 CM -596 nm - 508 MM - 751 cm -729 mm - 376 A -332 MM - 825 A -384 um -955 um -637 CM - 81 um - 543 UM - 224 UM - 136 nm -558 um - 404 UM -614 NM -94 A -517 nm -352 CM - 894 cm - 396 MM -141 um -469 A - 667 NM -777 NM - 329 nm - 428 A -251 mm - 863.0 UM - 326 NM - 919 MM - 983 CM -262 CM -664 UM -715 cm - 456 cm -875 CM -371 MM - 907 NM - 718 NM - 383 A -962 um - 206 cm -378 UM - 396 MM - 642 mm -982 um - 753 A - 260 A -262 cm - 254 um - 19 um -385 A - 451 mm -828 CM -821 um -369.5 NM - 886 NM - 434 CM -151 um - 522 CM -576 UM -18.0 CM -105 cm - 737 mm -457 nm - 101 um -112 UM - 508 um - 744 nm -289 nm -389 cm - 789 NM - 2 nm - 271 nm -8 A - 753 nm -339.0 mm -303 cm -483 um - 433 MM -620 mm - 240 NM - 509 cm -230 A - 7 NM -107 UM - 23 UM -243 cm - 110 NM -506 nm - 297 nm -982 mm - 454 A -855 A -174 NM -361 nm -459 nm -652 mm -726.5 mm - 687 nm -991 mm - 577 cm -623 A -700 UM -608 UM -580 NM - 681 NM - 400 mm - 194 mm -661 A - 61 nm -359 A - 620 cm -316 mm -820 A - 840 mm -214 UM - 868 cm - 44 cm -875 cm -869 NM -356 mm -838 mm - 378 mm -974 UM -887 CM - 20.0 CM - 444 A - 57 NM - 543 NM -582 um - 745 um - 381 mm - 86 cm -267 um -327 nm -700 NM -90 UM - 553 cm - 490 A -727 UM -682 UM - 590 CM -764 mm - 33 cm - 293 mm - 220.0 NM -8 mm - 372 MM - 793 nm -971 nm -614 MM -678 A -652.0 A -203 mm - 765 nm -673 UM -177 nm - 789 um - 387 NM -98 nm - 395 mm - 455 nm -682 nm -375 nm -661 mm - 687 CM - 196 A - 530 mm -685 CM -615 cm -807 NM - 925 UM - 729 MM - 396 CM - 653 UM -460 mm - 684 um -124 um -642 MM - 349 um -487 A -918 um - 149 CM - 684 A - 347 A - 595 MM -899 A -750 nm -582 mm -695 um -86 mm - 898 CM - 632 A -27 um -60 mm - 577 nm - 131 A -424 nm -677 um -772 NM -904 A -688 um - 368 CM -684 um -818 A -888 NM -794 UM -275 mm -683 UM -29 cm - 339 CM - 374 A -494 cm - 617 CM - 176 um -465 nm -240 nm - 146 cm -744 CM -149 nm - 322 nm -264 mm - 25 CM - 821 UM - 112 NM - 393 A -595 A -630 mm - 331 NM -612 NM -546 CM -336 CM - 900 nm -945 UM - 562 um -290 um - 414 MM -136 um - 692 A - 407 mm - 755 nm - 135 nm -31 NM - 171 mm -608 NM - 63 A -472 UM - 338 CM - 387 mm - 617 um -72 A -677 MM -159 A -809 mm - 65 UM -321 A - 561 MM - 221 nm -321 nm - 94 nm - 617 A -548 um -981 um -962 A -992 A - 316 nm - 661 MM - 829 CM -407 UM - 351 UM - 181 NM -338 CM -611 um - 602 CM - 583 NM -144 A - 740 um -727 MM - 455 NM -815 UM -324 MM - 149 cm -609 MM -950 A -808 A -486 UM - 611 CM - 439 cm -574 MM - 338 NM - 280 A -452 cm - 388 UM - 262 MM -234 CM - 638 nm -583 MM - 806 A -49 UM - 719 um -477 A - 421 CM - 352 nm - 263 mm -841 mm -217 nm -500 mm -289 UM - 516 nm -892 A -635 UM -425 A - 332.0 NM - 580 NM - 347 CM - 31.5 nm - 472 cm -352 cm -875 A -12 NM - 62 nm -300 UM -860 A -622 A - 173.0 um -314 MM -865 mm - 148 CM - 35 mm - 560 um - 262 A - 429 NM -464 CM -511 nm - 551 um -972 nm - 415 NM - 489 cm - 918 NM -442 UM -732 MM -760 um - 856 nm -717 um -831 mm -434 um -470 UM -957 A - 326 CM -745 A - 372 UM - 488 NM - 544 nm -338 NM -412 cm -851 um - 295 CM - 70 A - 370 MM -789 nm - 139 MM - 116 NM -729.0 UM -330 mm -893 mm - 327 nm -783 nm - 984 cm -24 cm -541 UM - 792 MM -194 A -23.0 nm -734 um -608 um -846 nm -587 UM - 154 mm -87 NM - 191 NM - 47 cm -879 um -142 NM -431 um -774 UM -911 um - 760 mm -131.0 MM -553 NM -634 MM - 610 cm -734 um -924 UM -71 UM -990 MM -470 mm -770 cm - 888 UM -974 CM -11.5 mm -384 cm - 192 mm - 615 NM -866 CM -213 um - 162 um -186 NM - 116 NM - 872 NM -49 A - 246 CM -866 um - 937 nm -817 MM -78 A -436 mm -115 MM -719 cm -558 NM - 392 A - 217 MM - 666 MM - 236 mm - 56 um -94 nm -306 CM - 936 NM -332 MM - 419 UM - 66 um -349 um - 218 cm -738 MM - 967 NM - 943 um - 582 nm - 89.0 cm -305 nm -95 mm - 992 nm -280.5 UM - 569 NM - 418 NM - 354 UM -331.5 cm -907 CM -270 A -631 UM -516 nm -360 MM - 377 um - 55 cm - 767 CM - 921 NM - 440 MM - 59 mm - 825 MM -78 MM -995 UM - 462 MM - 689 um -464 MM -570 mm -303 mm - 860 NM - 463 cm -905 nm -407.0 A - 200 nm - 582 cm - 135 um -667 NM -11 MM - 405 nm - 645.5 mm - 644 MM -177 NM - 400 UM - 16 mm -385 cm - 178 NM - 150 UM - 806 um - 370 MM - 982 UM - 366.0 CM - 963 NM -264 nm -918 UM - 174 UM -135 cm - 870 nm - 324 MM - 28 A - 543 um - 270 A - 451 nm -174 CM - 683 NM - 848 NM - 917 CM -826 A - 7 MM - 386 MM - 836 um - 177 cm -502 A - 353.0 NM - 578 nm -437 A -729 mm -749 A -246 NM - 249 CM - 474 um -121 nm -966 MM - 255 NM -103 NM - 291 um - 359 mm - 61 um - 135 NM - 901 UM -322 UM - 108 cm -609 CM -841 cm -471 NM - 460 nm - 283 CM -438 um - 91 cm -592 cm -999 mm - 509 mm - 829 mm - 525 MM -193 A - 832 CM - 586 UM - 406 UM -870 A - 800 NM -792 MM -219 CM -421 cm - 899.5 cm -318 UM - 889 NM - 683 MM - 434 UM -498 UM - 498 nm -658 MM -476 A -723.0 NM -929 um -803 CM -410 nm - 351 cm - 873 NM - 230 um - 131 UM - 629 cm -121 CM -347 cm - 669 nm - 31 UM - 213 UM -905 cm - 802 mm -809 nm -113 CM - 723 MM - 370 cm - 594 cm -357 CM -300 MM - 875 nm -671 cm - 615 CM -733 CM - 890 A -819 NM - 169.0 um - 504 um -189 cm -79 um -255 NM -700 mm - 100 cm - 672 mm - 629.0 A - 54 MM - 611 mm - 351 CM -945 MM - 692 UM - 872 CM - 931 mm -430 CM - 952 mm -463 NM - 539 UM - 748 um -516 UM - 484 NM - 389.5 nm -504 nm - 819 nm -794 mm -760 mm -65 cm - 510 A - 101 mm -359 MM -140 cm - 317 UM -48 A -618 UM -660 NM -649 UM -56 MM -115 mm - 75 nm - 553 CM -82 um - 192 UM -875 CM -487 CM -323 A -753 mm - 562 MM - 393 nm -621 mm - 407 cm - 152 mm - 371 nm - 114 mm - 268 um - 730 mm -993 mm -25 CM - 788 um -447 CM - 595 mm -42 MM - 469 um -123 UM - 686 cm - 341 mm - 158 cm - 829 CM - 146 CM -162 MM -50 UM -931 NM - 607 nm -278 UM -662 nm - 155 nm -165 um -210 NM -261 NM -793 UM -848 nm -763 nm - 556 A -571 mm - 660 CM - 534 mm - 702 NM - 678 mm - 999.5 mm - 95.0 MM - 964 um -383 mm -553 mm -550 CM -197 CM -541 cm -910 cm - 709 mm - 897 NM - 848 A -886 NM - 31 A -384 mm -962 cm -407 cm - 433 MM -833 nm -844 MM -554 nm -406 NM -548 mm - 185 NM -378.5 CM -465 A -281 um - 195 MM - 120 UM -415 UM -611 um - 861 NM -538 um -591 CM -616 A -463 NM -778 MM - 490 um - 878 um -104 cm - 483 mm - 221 UM - 658 mm -72 mm - 625 mm -441 mm -657 um - 534 um -924.5 CM -535 UM -366 MM -784 CM -456 MM - 739 NM -17 MM -292 UM - 833 UM - 432 NM -557 cm - 501 nm - 432 nm - 672 MM - 368 UM - 884 um -423 MM - 625 um - 111 um - 195 A - 858 MM - 835 MM - 364 nm - 866 NM -939.0 um -854 um - 367 A - 880 um -190 UM -406 nm -970.5 CM -631 A - 711 MM -644 CM - 883 nm - 482 cm -706 um -7 nm -354 A -423 mm - 415 mm -29 mm - 373 nm -158 MM -93 CM - 502 NM -542 nm -552 um - 778.0 CM - 497 um - 408 CM -324 UM - 491 mm - 436 nm - 394 nm -805 nm - 225 mm - 259 UM - 316 UM - 269 NM - 465 nm -657 MM -447 A -81 NM -611 A - 194 nm - 914 UM -103 UM - 94 UM -1 mm - 791 UM - 690 cm - 831 UM -559 mm - 754 NM -46 A - 315 NM - 260 CM -342 A - 333 CM - 888 UM -71 mm -108 MM - 113 um - 71 nm -516 nm - 207 nm -515 um -162 NM - 731 CM -849 mm -363 nm - 37 A - 204 mm - 20 um - 821 um - 351 mm - 452.5 um - 588 CM - 947 A - 718 A -123 CM -161 UM -40 MM - 911 A -326 um -215 A -136 UM - 777 nm - 890 cm - 199 A -396 nm - 30 mm - 916 UM - 503 NM - 436.0 nm -277 mm -776 mm -471 A - 34 nm -655 cm -287 um - 857 MM - 949 cm -647 MM - 622 CM - 622 um -146.5 MM - 164 um - 247 um -699 NM -462 UM -170 A -436 UM - 68.0 nm -38 cm -318 nm - 276.0 CM -597 UM -507 CM - 304 um -907 cm - 852 cm - 669 UM - 18 MM -252 nm -920 NM -95 cm -846 A - 880 mm -954 nm - 37 um - 271 A - 974 MM - 41 UM -780 CM -288 MM -644.5 um - 796 CM -39 nm -362 A - 585 mm -285.0 um -792 A -163 cm -258.0 MM -864 UM - 418 NM - 518 um - 545 NM - 632 UM - 702 um - 476 cm - 81 mm -963 UM - 122 nm -441 NM -24 A - 654 MM - 892 nm - 172 mm - 211 A - 126 MM - 361 mm - 576 cm -787 um -62 um - 394 nm - 635 MM -674 cm -921 nm - 870 nm -481 MM - 912 um - 347 mm -306 mm - 224 MM -676 MM -497 MM - 603 MM -296 MM - 361 mm -648 MM -485 MM -946 cm -484 nm -298 NM - 799 A -308 mm - 114 cm - 306 um -861 nm - 302 A - 886 nm - 937 NM - 813 MM -112 CM - 450 UM - 904 MM -16 A -372 um - 296 mm -848 cm -215 um - 587 UM -144 UM - 722 mm -738 um - 879 UM - 677 NM - 143 cm -309 MM - 680 A -993 mm -371 um - 660 um -763 UM -847.5 um -235 um -656 NM -418 UM - 715 nm -158 MM - 520 NM - 383 NM -463 cm -900 UM -43 NM -748 mm -80 MM -485 um - 664 mm -719 um -23 NM -184 CM - 197 UM - 582 MM -145 cm - 349 CM - 74 A -972 nm -280 CM -707 CM - 838 MM - 732 um -408 A - 794 um -404 cm -656 cm - 26 A - 848 um -475 nm -935 UM -189 MM - 985 mm - 182 mm -178 UM -42 nm -190 NM - 530 cm - 437.0 MM -889 cm -802 NM - 272.0 MM - 43 MM -243 UM - 28 NM - 858.5 NM -689 mm - 217 nm - 905 cm - 972 MM -627 MM -50 MM -712 CM - 665 MM -70 NM - 160 MM -14 um - 586 CM -81 MM - 671 mm -755 um -65 A -222 um -619 nm - 937 NM -959 A - 262 CM - 582 nm - 168 um -127 MM - 617 nm - 407 cm - 40 mm - 964 cm - 967 um - 862 nm - 189 CM -852.0 MM - 782 MM -701 CM -751 NM - 361 cm - 884 CM - 651 A -441 CM -726 UM -759 UM -969 A -690 nm - 580 cm - 125 um - 747 um -713 UM - 544 cm -782 cm - 790 NM - 719 A -912 um - 60 MM -6.5 MM -76 CM - 615 um -158 cm - 195 um -907 UM -25 UM -517 um - 883 um - 203 CM -505 CM - 907 MM -156 CM - 141 UM - 970 cm - 608 mm - 299 MM -630 mm - 783 A -134 um - 254 mm - 802 mm -252 MM - 599 mm -866 MM -349 um - 742 NM - 503 cm -840 UM - 145 mm -23 mm -974 um -286 UM -57 nm -271 cm - 859 A -479 cm - 196 cm -326 UM -441 MM -360 A - 156 cm - 571 NM - 706 UM -82 NM - 532 um - 693 UM - 174 nm - 814 MM -960 A -905 NM - 513 MM -472 nm -762 A -602 UM -937 nm -795 mm - 648 NM -960 cm - 693 mm - 359 MM - 749 nm - 352 mm - 775 um -338 CM - 572 um -517 MM - 340 A -745 A - 297 mm -324 mm -702 UM - 48 cm - 403 cm -692 A -308 um - 54 nm - 551 NM - 137 cm -596 cm - 214 CM - 34 mm - 100 cm - 537.0 nm - 525 CM - 231 MM -32 cm -841 nm - 319 um -317 MM -920 A - 143 CM - 241 UM - 2 MM -769 nm -724 MM -829 CM -847 nm -913 NM -319 A - 479 UM - 531 um - 245 A -808 MM - 356 nm -238 UM -742 nm -698 um - 795 mm -921 nm - 991 UM - 362 MM -30 MM - 42 CM - 862 CM -365 UM -961 nm -747 NM -216 UM -969 nm -913.5 UM - 818.0 MM -602 A - 294 mm - 282 CM - 610 nm - 343 CM - 884 UM -259 mm -608 um - 392 nm -414 nm -151 mm -610 CM -622 NM -505 um - 706 CM - 831 nm - 321 nm -71 CM -574 MM -71 A -391 nm -38 CM - 100 MM - 979 UM - 349 A - 581 UM - 7 NM - 932 cm -554 cm -398 A -50 um - 770 UM - 946 um -503 cm - 211 CM -711 A - 10 A -374 um - 320 CM -863 CM -755 NM - 532 um - 562 nm - 151 MM -380.5 MM - 88 cm -384 nm -54.5 A - 788 NM -710 nm - 473 cm - 349 nm - 581 CM -835 mm -564 A - 861 CM -970 A - 452 um -61.5 CM -369 CM - 464 nm - 863 CM -755 nm -55 A - 758.5 NM - 480 UM - 411 A -70 UM -657 NM -207 NM -989 UM - 471 UM - 351 mm -214 nm -425 um -672 MM -925 CM -821 MM -223 cm -635 A -761 cm - 618 nm -667 nm -273 mm - 844 UM -955 A - 229 nm - 687 CM - 201 CM -928 MM -45 um - 795 UM - 799 A - 580 UM -426 UM -540 CM -646 nm -231 um - 449 CM - 612 cm -738 nm -623 UM -711 cm -851 A -644 um -736 um - 145 UM - 366 cm -327 cm - 869 NM -96 A -180 MM - 627 cm - 319 mm - 73 um - 172 nm -540 CM - 140 nm - 75 A - 329 cm - 561 mm - 203 cm - 810 mm - 491 MM - 339 UM - 859 CM -16 mm -673 mm - 293 um -580 cm - 413 mm - 149 A - 999 UM -625 A - 124 cm -794 nm -147 um - 350 A -118 CM -41 cm -55 CM -939 um - 340 NM - 62 um -362 um -440 cm -276 UM - 979 MM -631 NM -833 CM - 517 nm - 995 NM - 608 MM -683 MM - 810 NM - 571 NM -433 NM - 335 um -873 CM - 799 MM - 231 CM -889 NM -469 nm -182 CM - 538 A - 371 cm -308 CM - 31 um - 111 mm -110 cm -1000 A - 627 NM - 748 UM -271 CM -552 A - 833 MM - 657 mm -421 cm - 561 nm - 653 nm -876 UM -50 um -79 CM - 125.5 A -982 CM -393 A - 346 um - 501 um - 662 UM - 193 cm - 206 nm - 465 CM - 299 UM -287 A -193 UM -185 NM - 80 CM - 719 UM - 622.5 nm - 399 um -609 CM - 21 cm -749 um - 638 mm -192 A -503 UM -608 A - 327 cm -617 CM -572 UM - 478 cm - 960 nm -443 MM -11 MM -751 CM - 587 mm -879 um - 823 NM - 233 cm -923 A -51 nm - 73 NM - 654 UM -198 MM -153 UM -182 nm - 730 NM -387 NM - 40 A -821 UM -512 MM - 300 A - 536 NM - 35 cm - 689 NM -372 cm -529 CM -889 A - 521 um -649 mm -281 NM -135 um -566 cm -666 NM - 383 nm - 500 cm -771 mm - 923 CM - 128 um - 27.0 mm -181 UM - 524 mm -285 NM -306 cm -774 mm - 701 cm - 542 mm -365 UM -501 cm -635.5 cm -214 um -815 UM -367 nm -235.0 um - 965 nm -345 um - 219 cm - 517 MM -652 UM - 11 CM - 477 nm - 114 MM -216 NM - 861 A - 50 mm -89 cm - 543 nm - 893 nm - 144 CM -568 um -158 um -393 CM -771 cm -91 NM -919 um -132 um -436 NM - 822 cm - 639 CM - 545 UM - 401 um -864 CM -525 NM - 747 nm - 701 CM -445 MM -953 mm -603 NM -317 nm -690 mm - 893 UM -65 MM -977 mm -527 NM -178 nm - 381 nm - 765 nm - 887 MM -182 NM - 876 NM - 936 nm -186 MM - 635 UM -482 CM - 131 NM -665 mm -683 A - 985 A -791 NM -352.0 NM -263.5 A -504 NM - 700 CM - 153 cm -355 UM - 270 cm - 189 nm - 2 cm -395 A -831 nm - 906 um -174 nm - 237 um - 905.0 cm -603 nm -126.0 A - 802.0 cm - 70 cm - 524 nm -528 A -78 CM -222 CM - 811 CM - 338 NM -17 nm - 817 cm -447 UM -452 nm -360 MM -627 mm - 976 NM - 236 cm - 727 NM -152 NM -93 mm -481 MM -388 CM - 498 um -640 um - 681 MM - 720 mm -645 CM - 865 um - 483 nm - 739 NM - 733 A - 487 mm - 596 CM -236 UM -597 cm - 86 NM - 671 A -757 A -104 cm -326 nm -852 cm -714 nm - 10 mm - 856 cm -82 um - 44 CM - 804 nm -336 cm -629 nm -234 MM -210 NM -862 MM - 190 nm -894 CM - 88 A - 136 A - 628 NM -222 cm -451 UM -255.5 NM -296 MM - 990 nm - 936 um -131 NM -370 CM -279 NM -636 A -858 cm -294 cm - 780 nm - 872 NM -773 NM -306 MM - 323 UM - 896 mm -457 mm -309 mm - 110 um -902 NM - 577 A -764 mm - 849 CM - 298 cm -858 A - 473 NM -336 CM - 386 CM - 717 A - 134 nm -158 CM -798 CM -547 mm - 125 mm -756 mm - 619 cm -55 cm -281 mm -307 um - 879 nm - 760 NM -22 MM - 912 um -768 um -244 mm - 494 mm -904 cm - 351.5 NM -483 CM - 174 A - 411 UM -477 NM -966.0 cm - 218 CM -897 cm - 763 um - 59 MM - 311 A -861 cm - 21 NM - 107 MM -193 cm - 770 nm -672 A -27 A - 917 NM - 27 UM -574 A -110 nm -384.0 CM - 414 MM - 564 cm - 649 NM -252 UM - 432 nm - 694 cm -742 CM -219 CM -224 cm -466 UM - 74 nm - 627 mm -632 A -184 cm -248 um - 886 CM -56 MM - 656 MM - 799 UM - 976 um - 60 mm -620.0 mm -191 mm -118 CM - 489 UM -137 A -332 CM - 378 mm - 920 um -278 cm -977 cm -27 UM - 882 CM - 169 um - 3 A - 592 A - 46 UM -509 mm - 700 NM - 86 um -698 A - 573 cm - 235 UM -816 um -35 mm -608 CM -226 um - 594 mm -719 um - 872 cm -843 NM -225 NM -675 nm -268 nm - 304 NM -628 CM - 148 mm -280 um -585 nm -809 MM - 69 mm -834 um - 91 A -942 um - 846 CM - 170 cm -90 nm -907 mm -435 MM -100 um -155 NM - 499 nm -341 um - 567 NM -994 CM -957 nm - 647 mm -477 mm -542 cm - 96 mm - 381 mm -282 nm - 544 nm - 536 nm - 551 A -584 A -258 nm -927 cm -812 mm - 813 cm -562.0 nm -705 nm -597 nm -490 NM - 91 cm -493 nm - 69 cm - 576 nm - 282 CM - 515 nm - 687 cm - 190 UM - 775 nm - 357 UM -989 nm -694 A - 823 UM - 950 NM - 27 cm -443 NM -105 cm - 556 cm - 682 mm - 64 UM - 647 NM - 723 UM - 749 um -995.5 A - 258 A - 864 A -876 nm - 285 nm -325 CM - 387 CM -101 MM - 53 cm -896 nm - 302 MM - 560 MM -47.0 CM - 758 UM -136 A -224 A -591 CM -567 mm -461 cm -290 nm - 835 UM -578 cm - 173 CM - 957 UM - 430 cm -741 nm - 828 UM -543 mm - 599 A - 525 CM - 901 A - 440 NM - 285 NM - 590 MM - 320 NM - 758 A -903 CM -134 UM -598 NM -518 cm -53 NM -333 A -568 um - 257 nm -153 UM - 760 um -262 UM - 811 nm - 374 MM -219 A -557 NM -997 UM -999 um -304 um - 24 MM -423 cm -502 nm -588 CM -536 cm - 299 UM - 567.0 UM -537.0 UM - 953 mm - 179 nm - 448 um - 587 MM - 207 mm - 379 nm -959 um -342 NM -370 NM -418.0 UM -321 mm - 957 MM - 949.5 um -123 nm -518 MM - 165 cm -704 CM -789 nm - 963.5 CM - 959 um -935 cm - 144 CM - 959 NM -836 mm -245 CM - 351 CM - 228 nm - 616 UM - 915 CM -368 MM - 781 UM - 979 CM - 306 A - 557 nm - 120 CM - 308 mm -10.0 NM - 130 MM -265 MM -329 mm -937 cm -529 cm - 253 UM -966 NM - 744 A -696 mm - 379 MM -569 CM - 475 CM - 397 A -47 um -927 um -429 UM -181 NM - 632 NM - 148 UM -817 MM -3 UM - 534 NM - 483 UM - 207 cm - 350 A - 731 NM -859 nm -983 um - 808 UM - 523 cm -917 MM -527 nm - 732 mm -528 MM - 757 cm - 284 mm -193 NM - 895 UM - 776 cm - 186 A -454 CM - 37 MM -355 mm - 109 nm -482 um -848 CM - 200 mm - 887 mm - 879 nm - 767 nm - 902.5 NM - 868 cm - 7 UM -356 CM - 108 mm -248 mm - 500 um -437 MM -402 nm - 493 NM -3 CM - 758 UM -567 UM -648 nm - 774 CM - 40 cm -566 cm - 843 cm -283 MM - 403 A -713 nm -737 NM - 23 A -971 nm -548 NM - 723 um - 728 CM -140 um -712 um -866 MM - 533 UM - 238.0 mm -628 nm - 623 UM - 367 NM - 533 cm -414 NM -282 cm - 906 UM - 56 A - 609 A - 209 mm - 511 mm -554 CM - 236 CM -743 MM -362 mm -672 NM - 23 A -792 A -764 mm -429 um - 30 mm - 804 nm - 75 UM -629 mm -194 A - 516 mm -712 mm - 134 NM -319 UM -44 UM - 235 UM - 933.0 CM - 422 um - 335 mm - 243 NM -338 MM - 230 A - 898 A - 104 CM - 744 nm -823 NM - 239 nm -825 CM - 908 MM - 972 A - 902 A -829 cm -9 A - 584 A -934 mm -226 nm -230 A - 843.5 NM - 774 cm - 837 MM -609 MM -188 A -176 CM -573 nm -103 mm -572.5 um - 738 nm -556 CM - 98 um - 763 MM - 507 CM - 304 nm -711 UM -251 NM -8 MM -254 A - 512 um - 694 NM - 323 cm - 357 UM -746 nm - 943 mm -154 mm -235 mm - 671 cm - 211.0 A -868 NM -92 MM - 787 mm -755 A - 836 mm - 649 MM -113 CM - 205 UM - 550 nm -495.5 UM - 164 CM -361.5 mm - 629 CM - 36 um -693 cm -756 NM - 924 UM - 897 nm - 840 CM - 450 cm - 801 um -382 nm -304 um -87 NM - 218 A -151 cm - 523 MM -985 mm - 995 NM - 936 um -398 CM -70 UM -821 A -369 A - 461 NM -706.0 nm -563 NM - 280 UM - 941 CM - 497 CM -570 MM -494 UM - 253 NM -661 um - 291 um - 992 um -323 mm -445 nm - 430 CM -480 NM - 609 CM - 625 nm -331.0 um - 967 um -987 MM -901 cm -161 CM - 133.5 nm - 525 UM -335 nm -609 nm - 821 mm - 621 A - 940 mm - 993 cm - 70 A - 631 MM -70 NM - 996 UM - 434 mm -800 mm - 121 nm -174 um -367 cm - 675 um - 811 mm - 288 NM -358 NM - 959 UM - 636 NM -107 A -749.5 mm -110.5 um - 69 A - 559 NM -950 UM - 31 NM - 217 NM -332 CM -891 MM - 335 MM - 20 cm -474 nm - 458 UM - 560 CM - 807 mm - 808 nm - 450 mm -876 um -175.5 A - 208 cm - 625 cm - 497 MM - 434 um -527 nm - 611 cm - 453 um -645 NM -937 MM -913 um -711 mm - 948 NM -107 mm - 854 UM -27 mm - 531 MM -590 um -866 MM -895 nm - 334 CM - 138 cm - 428 MM -61 NM - 509 UM -284.5 A -41 CM -947 NM - 146 A -471 CM - 580 NM -695 um - 991 um -811 MM - 419.5 CM - 615 nm - 251 MM - 983 MM -124 nm -976 nm -981 UM -604 CM - 716 cm -744 MM -493 NM - 239 cm - 322.5 NM - 90 um -433 nm -649 MM - 375 CM - 678 cm - 200 NM -222 MM -246 NM -555 um -985 mm -219 mm - 845 UM - 661 MM -396 MM - 857 mm -662.0 nm -783 cm - 295 mm - 207 MM -559 A -196 mm -492 UM -634 UM -239 um -609 nm - 612 um -352 NM - 793 mm - 783 mm -696.5 A -862 CM -854 NM - 304 MM - 392 cm -197 NM - 514 A -32 mm -203 CM -262 NM - 257 NM -708 CM - 572 A -657 A - 626 mm - 812 UM - 5 A -463.0 mm -18 cm - 534 UM -944 NM -920 MM -318 A - 693 A -290 nm - 385 UM - 757 UM - 64 A - 22 mm - 307 nm -970 MM -755 UM - 919 CM -177 NM -198 nm -504 A - 59 NM -60 MM - 750 A - 655 mm - 632 nm - 724 A -870 A - 409 cm -973 um - 251 nm - 198 MM -739 UM -230 nm -426 um -184 mm -318 nm - 265 cm - 286 NM - 967 mm - 203.0 MM - 767 A - 224 mm -896 MM - 405 NM -329.5 MM -688 um - 437 CM -183 cm - 475 UM - 446 nm - 582 nm -724 NM - 428 um - 213 A -511 cm - 364 um - 352 nm - 89 CM -537 mm - 47 A - 667 MM - 799 mm -676 A -781 A - 599 um - 314 mm - 988 cm -434.0 CM -622 MM - 153.5 nm - 384 nm - 852 nm - 694 UM -291.5 mm -705 MM - 219 MM - 504 cm -693 MM -54 nm -65 CM - 731 mm - 996 MM - 278 mm - 174 A - 586 MM -826 MM -148 A -895 mm - 483 um - 732 nm - 359 cm -781 MM - 894 UM - 103 um -391 nm - 445 um - 920 CM -750 UM - 529 NM - 905 cm -590 cm - 851 nm - 425.5 nm -212 mm -277 um -929 CM - 103 MM - 180 UM -175 A -78.0 UM -802 UM - 29 MM -787 nm -462 um -339 nm -356 um -664 A -488 NM -579 nm - 29 nm - 985 A -697 mm - 948 um -541 cm -161 cm - 311.0 NM - 784 UM -518 cm -225 UM -641 nm -996 CM - 664 CM -94 A -119 UM - 554 um -994 CM - 821 NM -66 mm -365 um -94 CM -178 NM -879 mm - 821 mm - 173 NM - 562 NM - 300 A -11 um - 732 mm - 589 um -525 MM -269 UM -736.5 A -244 um -489 UM -93 NM - 571 NM - 933 um - 899 CM -715 MM -103 nm -274 mm - 946 UM -760 cm -163 A - 743 nm -177 MM -479.5 mm - 123 um - 2 UM -26 UM - 404 A - 878 mm -67 CM -897 nm - 280 um -989.5 UM - 362 NM - 140 UM - 284 A - 360 mm -977 A - 800 CM -355 nm -230 CM - 715 mm - 626 NM -732.5 NM -441 MM -953 mm -317 nm -33 NM - 108 cm - 280 mm - 121 cm - 541 CM -48.5 mm - 245 mm - 343 um - 26 A - 117 um -788 nm - 198 A -26 mm -368 MM -530 CM - 480 um - 191 UM - 40 mm -843 um -369 MM - 115 UM - 421 nm - 756 mm - 97 cm - 527 CM - 505.5 cm -708 MM - 457 cm - 951 mm - 451 NM -977 MM -448 A -817 um - 781 cm -739 MM - 338 NM -320 mm - 191 mm - 290 UM - 628 CM -485 cm - 357 CM - 77 nm -902 MM -59 UM -407 A - 346 cm -99 NM - 496 um - 631 MM - 995 UM -504 UM -445 NM -606 cm -350 UM - 235 UM - 867 UM - 264 UM - 635.5 A -558 nm -941 A - 531 A -763 mm - 528 mm -503 UM -354 A - 497 NM -20 UM - 154 MM - 810 nm -112 nm -667 CM - 521 nm -753.0 um - 607 nm -867 cm -596 um -393 cm - 953 um -536 um - 999 MM -111 cm - 325.5 mm -130 A - 305 nm - 417 mm - 362 um - 233 MM - 924 MM -41 UM -267 MM - 681 cm - 96 UM -681.0 UM - 727 um - 582 NM -722 cm -168 nm - 146.5 NM -604 cm -476 A -736 A - 7 um -792 A -524 mm - 466 cm -499 mm - 692 cm -730 NM - 662 CM -371 NM -453 cm - 939 NM - 50 mm -703 nm - 498 MM -458 nm -237 UM - 104 cm -778 mm -826 NM -793 CM - 837 CM - 386 cm - 398 cm - 369 mm - 341 UM - 304 CM - 519 CM - 616 UM - 247 nm -946 MM -724 NM - 824 A -954.0 cm -803 UM - 905 mm - 184 CM -564 um - 939 UM -206 UM -136 nm - 351 um - 72 um - 925.0 mm - 879 A - 329.5 MM - 170 cm - 209 A - 24 MM - 439 NM -650 MM - 783 um - 533 cm - 988.0 CM - 501 MM - 552 A -243 NM - 997 nm - 790 UM - 337 MM - 920 UM - 81 NM -353 nm - 715 NM -859 UM -500 MM - 521 MM - 317 mm -855 NM - 758 CM -997 MM -216 NM -356 mm - 582 nm - 427 MM - 954 nm -18 um -682 UM -610 UM - 755 UM -613 MM - 644 MM -947 MM -324 MM - 251 UM -956 cm - 263 NM - 875 MM -567 cm - 417 MM -125 nm -141 MM -450 A -598 cm - 897 cm - 26 nm -883 MM - 968 NM -323 NM - 472 mm - 901 CM -121 um - 307 cm -532 um -18 A - 485 UM - 989 nm - 17 MM - 308 um -196 UM - 324 cm - 904 CM -871 nm -557 MM - 595 CM - 584 nm -749 MM -201 cm - 461 um - 997 MM -292 MM -899 um -923 cm -870 MM -874 um -266 A - 455 NM - 312 nm - 549 nm - 643 CM - 495 CM - 802 NM - 926 CM - 678.5 UM -66 UM - 868 A -206 NM - 212 mm - 544 MM - 974 MM - 439 nm - 372 um - 286 NM - 968 A -608 NM - 998 A - 773 MM -972 mm -711 MM - 232 mm - 843 NM - 900 um - 765 um -79 UM -711 cm - 924 nm -730 nm - 392 nm - 161 A -773 A - 924 CM -495 cm -124 MM - 726 NM -123 UM - 166 nm - 114 nm - 935 MM - 856 mm -275 cm -484 um - 303 A -508 UM - 783 NM - 481 NM - 399 A - 735 UM -962 A -336 mm - 568 mm -819 um -860 cm -896 MM -365 UM -236 nm - 920 um -616 MM -162 A - 30 mm -946 A - 593 um - 386 um - 488.5 UM -913 cm - 693 nm - 416 UM -355 um -341 MM -36 UM - 364 cm - 228.0 UM - 934 um - 173 UM -281 NM - 236 mm -737 NM -636 UM - 180 UM -131 nm -165 um - 558 mm -551 cm - 469 um - 813 mm -478 mm - 898 CM - 898 UM -929.0 nm - 359 cm - 903 mm -577 um - 265 mm -491 A - 341 UM -345 NM - 321 um - 39 nm -552 nm -430 A -443 MM -506 cm - 651 MM -298 A -429 A - 220 MM -747 MM -482 nm -123 MM - 723.0 nm - 697 um -101 nm -530 NM - 191 UM -897 UM -729 CM -515.0 UM - 746 um -413 A -578 nm -405 nm -535 mm - 396 nm -358 CM -125 NM -115 UM - 395 nm - 26 CM -757 nm -368 cm - 101 A - 799 NM -41 mm - 149 nm - 749 cm -16 um - 879 MM - 364 um - 387 UM - 137 A -491 um -872 cm - 909 nm - 325 nm - 320 MM - 247 UM -297 NM -970 MM -38 nm -397.0 NM -12 NM -680 nm - 438 A -867 MM - 702 cm - 489 CM -219 NM - 685 MM - 590 um - 44 A -190 UM - 887 UM - 863 A - 632 NM -136 cm -99 UM -278 nm - 935.0 cm - 574 nm - 82 A - 843 cm - 410 um -957 CM - 910 um - 174 nm - 4 NM -401 CM - 385 A - 25 UM - 484 A -67 A -724 cm -46.0 NM - 723.0 mm -175 um -572 MM -428 NM -954 um - 474 CM -671 nm -115 NM -903 MM -473 A -526 UM -176 NM -950.5 NM -181 A - 87 mm -892 cm - 214 UM -290 um -102.5 UM -547 A - 617 UM -861 cm -610 MM -519 NM - 57 MM - 638 nm -601 um - 263 mm - 785 cm -110 MM -538 nm - 358 mm -966 NM -885 nm - 757 MM -314 MM - 818 UM -831 mm -84 um - 123.0 um -57 mm - 519.0 CM -916 nm -298 UM -129 CM - 880 MM - 673 nm - 203 nm -520 A -950 CM - 434 cm - 703.5 um -993 um -473 A -830 NM -362 nm - 229 nm -890 NM -215.5 NM -704 mm - 162 nm - 642 MM - 985 um -438 UM - 870 nm -582 nm - 942 UM - 438 CM - 875 cm - 628 MM -834 MM -112 UM -384 mm -674 UM -453 A - 237 nm - 958 MM - 388 um - 824.0 CM -851 nm -675 CM -732 CM - 748 um -700.5 MM -281 mm -9 nm - 878 nm -94 CM -417 cm -52 um -533 A -813 UM -875 CM -356 CM - 347 A - 8 um -22 NM - 722 UM -38 mm -659 mm - 357 NM -58 um -939 NM -513 A -368 cm - 236 mm -442 MM -300 mm -307 um -483 A - 799 UM -263 UM - 667 nm -145 UM - 966 cm - 349 A - 590 cm - 843 NM -797 CM -342 um -247 cm - 800 CM -389 cm - 479 cm - 353 um -122 NM -97 A -562 MM - 474.5 um - 527 MM -474 mm - 203 NM - 825 nm -951 CM - 992 mm - 133 um - 654 A -473 MM - 159 um - 658 cm - 350 CM -839 um - 424 cm -261 NM - 86 nm -756 UM - 689 MM - 203 A - 4 mm -396 CM - 686 cm -964 um -650 CM -76 mm - 830 NM - 62 mm -287 A - 442 A -217 UM -549 cm -18 NM - 217 mm - 545 CM -156 CM - 831 MM -307 um - 440 UM - 934 MM -933 NM - 678 A - 267 um - 398 MM - 286 NM -788 mm -945 cm - 265 cm -432 um -885 MM -843 nm -868 um - 603.0 MM -533 MM - 495 CM -885 mm -664 MM - 695 um -491 A -241 MM - 543 um - 817 cm -788 mm - 753 nm -2 UM -471 UM -862 mm -871 um -831 mm -133.0 MM - 980 NM -103 mm -65 A - 826 cm - 257 um - 226 mm -46.5 MM -30 CM - 67 cm -996 UM -686 A - 873.0 UM - 921.0 mm -710 nm - 204.5 cm - 840 MM -339 A -248 CM - 193 mm -45 UM - 548.0 cm - 491 A -905 CM - 80 CM -269 um - 242 MM - 181 CM -820 CM - 693 UM - 28 MM - 45 MM - 220 nm - 620 A -126 um -551 mm -613 MM -633 mm -350 CM -496 A -293 nm - 473 cm -326 UM -628 MM -602 nm -555 CM -640 mm -685 UM -832 A -718 mm - 967 nm - 261 um -22 um -692 UM - 663 cm -938 NM - 804 nm -243 A -934 cm - 132 cm -916 A -655 mm -621 CM -982 um - 466 mm - 767 mm -99 CM - 158 MM - 827 A -582 nm - 331.0 um -388 UM -380 um -81 um - 359 nm -684 CM - 954 um -240 um -249 A - 796 cm -646 A - 170 A - 462 A - 618 um -225 NM - 462 A - 756 A -577 nm - 530 MM -684 um - 535 cm -619 NM -594 CM - 297 cm - 269 UM -590.5 CM -952.5 mm -278 NM - 861 A - 30 cm -86 um - 828 MM - 117 MM -931 nm -111 UM -340 A -337 MM - 797 mm - 625.0 UM -866 UM - 987 cm - 937 cm - 799.0 mm -875 NM - 203 cm -716 um - 342 NM -694 mm - 285 CM - 982 nm -276 cm -283 nm -709.5 UM -631 nm - 170 CM - 918 nm - 848 MM -30 cm - 750 nm - 915 nm -412 MM -612 cm - 513 nm - 170 A -676 CM -443 um -966.5 NM - 680 mm -12 NM - 639 MM - 244 NM -754 A -77 A - 982 NM -395 mm - 257 A -230 nm - 660 cm -385 mm -204 A -922 NM -274 CM -328 A -508.0 A -319 NM -33 mm - 525 mm -555 NM - 400 mm -393 NM - 939.5 NM -562 um - 795 CM -501 NM - 627 MM -351 cm -737 A -726.5 mm - 430 mm -401 nm - 899 nm -282 mm - 618 mm -865 um - 75 MM -431 MM -390 mm -731 MM - 836 MM - 306 NM -485 NM -111 MM -260 UM - 907 um -207 UM -817 CM -565 nm - 483 CM -496 MM - 637 NM - 566 nm -931 MM - 973 NM -628 MM - 244 mm - 693 nm -210 UM -69 A - 388.5 A -116 mm -602 A -872 mm - 349 A - 482 mm -101 A -981 mm - 614 um -37 cm -626 UM - 592 A - 387 mm -533 A - 668 A - 458 A - 135 nm - 612 cm - 935 MM - 571 UM -967 nm - 730 nm - 573 NM -632 A - 360 NM - 405 A -101 um - 610 mm - 217 UM -202 um - 916 um - 570 UM -165 um - 381 UM -125 nm - 961 cm - 119 NM -320 MM -806 mm -279 A -290 CM - 974 cm - 192 nm -609 A - 847 A - 839 CM -869 nm -403 UM - 348 MM - 46 MM -460 nm - 437 NM - 923 mm -50 mm -767 CM - 184 CM - 923 UM -568 A - 111 mm - 99 UM -229 CM - 936 nm -584.0 nm - 343 nm -99 CM - 425 NM -803 A -807 UM -646 UM -139 CM -29 um - 353 MM - 38 mm - 775 nm - 534 CM - 1000 mm -1 um - 831 cm -774 UM -105 MM -294 nm - 120 mm -448 um -429 NM -357 CM - 192 MM -519 A - 934 MM -936 CM - 872 CM -66 mm - 60 mm -85 nm -761 CM - 267 mm -656 MM -366 CM - 161 UM -674 UM -659 MM -606 A -745 nm -659 A - 370 MM -345 MM -890 MM - 982 cm -626 A - 720 NM -422 mm -743 mm - 856 MM -633 um -641 mm - 192 NM - 86 UM - 346 NM - 207 UM -957 A -796 mm - 469.5 MM -437 A -453 mm -840 UM - 612 CM -169 CM -569 nm -415 mm - 269 cm - 111 mm - 577 CM - 612 cm - 354 mm - 600 NM - 84 A - 319 nm - 290 um -880 NM -661 cm -132 cm -941 UM - 59 UM - 298 MM - 289 MM - 923 nm -642 nm - 995 A - 185 A - 397 um -668 UM -77 um -304 NM -853 um -736 UM - 468 mm -742.5 CM - 873 MM -383 nm -462 nm - 990 CM - 551 mm - 313 A -677 mm - 520 MM - 107 CM -424 um - 952.5 nm - 235 A -991 cm -162.0 NM - 923 cm - 575 CM -700 um -26 NM - 104 NM - 320 MM - 366 MM - 749 MM -42 NM - 913 UM - 931 A - 119 NM -904 nm - 705 mm -75 NM -635 um -980 um - 192 MM -892.0 A - 602 CM -384 MM - 781 mm - 635 um - 52 CM - 617 A -177 cm -458.0 nm - 485 um - 944 CM -403 UM - 432 A - 264 nm - 471.0 um - 378 UM -435 CM - 20 nm - 521 MM - 253 mm -933.5 mm -559.5 NM - 992 UM - 821 A - 137 A -721.5 nm -238 cm - 696 MM - 186 um - 86.0 UM -851 NM -849 A -456 nm - 489 UM - 746 CM -40 CM -452 mm -257 MM -802 cm -954 mm -380 cm -201 cm -421 NM - 207 A - 200 um -451 CM -948 cm - 7 MM - 666 A -895 NM - 609 um - 987.5 um -106 um -370 nm -983 mm - 721 cm - 311 MM -741 CM - 966 mm -283 mm - 5.5 mm - 774 nm -115 mm -276 um - 639 NM -150 MM -903 A -427 cm -557 A - 224 MM - 316 nm - 413 UM -705 mm - 687 um - 834 cm - 643 mm - 560 cm - 27 MM - 123 UM -245 nm -441 mm - 888 um -255.0 mm -137 nm -863 NM - 183 mm -956 CM -883 nm -653 cm -593 um - 49 nm -614 CM -186 MM - 520.5 CM - 68 CM -500 um -693 MM -42 MM -39 A - 566 CM -717 UM -367 mm -968 um - 371 MM - 221 UM -405 nm - 847 nm - 726 mm - 584 A - 919 cm -785 UM - 981 mm -485 MM -593 nm -742 CM - 977 um -327 mm -489 um -153 MM -915 MM - 830 cm -426 NM - 867 mm - 714 cm - 463 A - 860 A -838 nm - 643 um -424 UM -657 cm -100 cm -670 MM - 769 nm -373 nm -956 um - 450 NM - 833 CM - 823 nm -89 NM - 962 MM -367 NM - 264 MM -607 NM - 223 mm -83 um - 131 UM -934 A -65 nm - 384 cm -329 MM -447 MM -860 A -90 MM - 541 cm -898 MM -361 nm - 675 CM - 942 mm -852 CM - 831 cm -197 CM -663 UM - 696 A -46 cm -726 MM -653 A -806.0 nm -249 UM - 718 nm -205 um - 76 cm - 131 NM - 359 CM - 890 mm - 893 cm - 951 mm -783 nm - 643 A - 958 mm - 936 um -589 UM - 204 A - 868 NM -635 NM -298 mm - 388 nm -469 cm - 740 cm - 871 UM - 396 NM - 729 cm -282 CM - 234 mm -343 NM - 696.5 UM - 425 mm - 868 NM -790 NM -846 UM -255 um -210 UM -695 mm - 642 mm - 598 UM -568 um -38 UM -176 MM -799 nm - 779 A -608 MM - 548 NM - 829 UM -251 um - 870 A - 941 um - 64 MM -293 A -888 MM -409 MM -180 mm - 31 UM -542 MM - 836 MM -680 UM -540.5 nm -261 mm -737 nm - 345 mm - 921 mm -617 um -927 A - 25 MM - 585 CM -587 nm - 220 mm -823 nm -267 UM - 802 nm - 367 MM -88 um -26 nm - 859 A - 92 NM -143 um -955 MM -504 nm -455 NM -452 um - 833 UM -502 nm - 427 A - 946 cm -209 CM -512 A -588 cm -296 A -93 MM - 635 um - 721 NM -274 um - 935 UM - 915 NM -563 UM -998 A - 927 MM -3 A -661 um - 446 nm -693 um - 721 MM -640 A -416 UM - 32 MM - 383 NM -333 A -7 NM -914 MM - 393 MM - 713 MM -612 mm -729 um -445 CM - 668 cm - 574 MM -831 mm -338 MM - 881 mm - 480 UM -831.0 um - 798 mm - 813 cm - 508 nm - 393 CM - 446 um -585 A - 241 NM -239 um - 34 MM - 488 NM -705 UM - 685 A - 619 um - 943 A - 940 NM - 805 mm - 848 NM - 453 um - 561 A -399 cm -839 cm - 92 NM -622 NM -651 NM - 894 cm -228 MM -934 cm -389 um - 473 nm - 583 CM -635 mm -730 mm -724 nm -835 UM - 159 MM - 367 um -70 MM -102 cm -615 cm -810 nm -729 A -508 A -249 mm -405 UM -901 cm -437 NM -545 cm - 134 um - 364 mm - 22 cm -19 CM - 263 CM - 811 um -973 UM -551 um - 4.5 nm -380 um - 963 UM -98 um -8 cm - 535 UM - 857 mm -20 MM -341 CM - 578 UM -679 um - 156 cm -91 MM -674 A - 548 UM -268.5 CM - 940 CM -220 nm -392 CM - 522 NM -22 cm - 139 MM - 561 cm - 192 nm -178 CM - 786 mm - 722.0 UM - 768 cm -551 MM -192 NM - 811 nm -292 CM - 744 NM -905 MM - 804 mm -471 NM -283 CM -490 UM - 294 mm - 818 mm -58 MM -266 cm -988 A - 118 cm -290 NM - 981 MM - 79 NM - 882 A - 943 MM -900.0 A -108 NM - 349 NM - 767 nm -435 nm - 269 nm -652 um - 907 MM -727 UM - 699.5 NM -915 UM - 16 um -287 NM - 267 mm -979 UM - 595 UM - 166 nm - 855 mm - 927 um -622 mm -485 CM - 735 cm - 414 nm - 5 A -230 A - 255 MM - 920 mm - 368 um - 399 CM -411 mm - 305 um -9 nm - 138 nm - 602.0 mm - 340 mm - 710 NM -517 nm - 966 cm - 527 CM - 327 CM -237 CM -809 um - 392 NM - 38 NM - 909 A -421 UM -691 CM -823 A - 357 MM -717 mm -585 nm - 137 MM - 937 nm - 919 mm - 128 um - 265 mm -536 CM - 132 UM -135 cm -575 nm -399 um -58 um -236 CM - 679 NM -560.5 A - 637 UM -843 A -215 NM - 948 UM - 311 CM - 16 um - 855 UM -821 cm -385 mm -888 A - 428 CM - 543 mm - 513 NM -694 A - 390 nm -721 mm -568 um - 631 UM - 797 nm -414 CM - 506 CM - 689 nm - 504 mm -800 nm - 559 MM -170 mm -814 MM -446.0 A -464 mm - 991 CM -140 MM -986 CM - 803.5 um - 356 um - 904 NM -115 MM -946 mm -319 UM - 722 UM - 144 nm -398 UM - 544 cm - 876 MM - 611 nm -31 nm - 263 A -12 nm - 598 CM -388 UM - 506 mm - 698 CM -797 cm -273 MM - 363 cm -522 MM -890 NM -167 MM - 225 mm -264 MM -580 MM -134 MM - 335 UM -385 NM -13 nm - 475 CM - 159 nm - 47 A - 157 MM - 407 A - 317 UM - 739 UM - 526 CM -98 cm - 994 A - 466 um -589 um - 747 UM -526 CM -480 A - 382 cm - 63 MM -286 A -691 mm - 287 MM - 79 um -345 mm - 93 um - 140 cm - 936 A - 490 MM -925 um -86 UM - 97 cm - 109 cm - 762 CM - 664 UM -958 cm -879 cm -476 um -793 um - 281 mm - 230 UM -337 nm - 985 CM - 655 nm - 810 UM - 298 um - 738 UM - 722 NM -318 um - 347 um -839 NM - 479 MM -32 CM -540 cm -486 MM - 830 um - 392 NM -621 NM - 648 UM -643 um -212 MM - 935 um -617 cm - 286 mm - 434 CM - 270 CM -897 UM -717 A - 320 mm - 617 nm -561 NM -609 um -729 nm - 111 MM -473 UM - 513 UM -442 nm -625 NM -741 NM -547.5 nm -40 CM - 909 NM - 647 MM - 488 UM -998 nm - 916 cm -618 A -304 nm -760 nm - 304 MM - 937 UM - 770.5 cm - 97 A -420 MM -174 mm - 890 mm -441 MM -153 mm - 696.0 nm -66 um -103 CM -363 CM -405 A -201 NM - 155 MM - 323 CM - 619 UM - 269 CM -727 um -214.5 cm - 77 NM -584 MM - 794 NM -277 cm -394 A - 296 um -514 CM - 609.0 MM - 106 um -252 A - 441 A -757 A -350 mm - 634 um -636 NM - 218 nm -981 mm -664 NM - 651 NM -435.5 NM - 68 NM -233 MM - 206 CM -128 nm - 481 NM -534 cm -241 nm - 444 um -731 MM - 944 UM -302 NM -474 um -967 A -802 cm - 497 NM -519 CM -558 UM - 336 mm -154 NM -26 A - 848 MM -103 CM -519 nm -795 um - 828 CM -66 MM - 491 A -200 nm -693.5 NM - 652 CM - 206 A -81 UM - 288 cm -406 um - 183 UM -469 NM - 228 UM - 637 mm - 701 A - 674 A -552 nm - 14 A -604 cm - 397 UM - 475 A -189 A -352 UM -240 cm - 491 MM - 21 cm - 21 um -317 CM -150 cm -392.5 cm - 54 MM - 884 MM -309 cm -720 A - 181 cm - 882 NM -519 A -216 CM - 553 mm -651 nm - 984 um -44 UM -189 CM -378 cm - 630 CM -288 um - 235 NM - 576 nm -710 A - 271 NM - 144 A -25 mm - 848 CM - 681 CM -988 mm - 697 um -639 nm - 70 CM -461 nm - 27 mm - 804 CM - 881 MM -914 um - 875.0 CM -639 UM -602.0 cm -364 nm -280 A - 329 cm - 432 nm -75 mm - 738 nm - 250 MM -835 MM - 889 NM - 950 mm - 163 UM - 443 cm - 499 UM -402.0 um -388.0 MM - 720 mm - 696 NM - 229 mm - 411 A - 869 CM -668 cm - 344 um - 262 mm -883 um - 815 cm -170 MM -326 CM - 325 NM - 227 nm - 793 A -993 MM -790 UM - 344 A - 416 UM - 298 NM - 224 A - 987 CM - 152 um -593 cm - 486 mm - 516 MM -624 cm -682 MM - 89 CM -866 nm - 116 MM - 706 UM -361 um -939 MM - 564 MM -859 um - 881 MM - 444 NM -713 CM - 628 cm -908 UM -884 UM - 477 UM -980.0 A - 992 cm - 285 A -301 UM - 854 CM - 66 NM - 87 CM -567 MM - 520 NM - 592 NM - 368 cm - 398 NM -5 mm - 821 mm - 872 nm -742 nm -696 mm - 168 cm - 172 MM - 76 nm - 247.0 cm - 477 nm - 322 CM -340 MM - 589 um -478 cm - 121 cm - 929 A - 815 um - 993 UM -721 A -580 UM -850 cm - 197 mm - 704 nm - 740 cm - 402 cm - 809 mm - 892 UM - 988.0 MM - 40 nm - 675 um -405 UM -619 CM -181 UM - 262 nm - 466 CM - 1000 UM -672 MM - 288 um -645 cm -124 mm - 107 A -509 UM -183.5 NM - 651 MM -203 UM -424 NM - 757 NM - 516 UM -179 CM - 67.0 NM -82 mm - 69 NM -937 UM - 91 nm -597 NM -886 CM -205 UM - 881 UM -317 MM - 890 A -130 cm -836 NM - 159 UM - 717 CM - 192 nm - 109 CM - 677 CM -557 nm - 418 nm -116 A - 993 cm -513 A -725 MM - 458.5 MM - 501 A -2 mm -523 mm -791.5 CM - 441 UM - 647 um - 440 UM -604 NM - 224 nm - 169 MM - 733 cm - 374 CM - 870 NM -152 um -866 MM - 73 um -562 A -106 CM - 618 CM -614.5 CM - 296 CM -438 A - 415 CM - 85 A -88 MM - 619 CM - 44 nm - 597 cm - 690 nm -647 cm - 444 nm -584 CM - 940 UM -736 cm - 448 nm -941 A -782 NM - 38 um -585 A -638 mm -882 CM -376 CM - 893 NM -200 um -798 MM - 335 nm -449 cm - 72 nm - 476 mm -787 CM - 79 nm -368 UM - 593 cm -651 um -519 nm - 39 NM - 278 cm -33 CM -78 mm - 741 nm -657 mm - 814 CM - 600 cm -775 cm -511 um -614 mm - 397 um - 553 CM -409 A -758 nm - 446 UM -272 mm -200 mm - 886 nm - 356 mm -827 um - 608 UM - 564 MM -218 NM - 224 um -836 UM - 872 MM - 975.5 MM - 632 cm -714 MM -667 CM - 868 MM - 55 A - 97 mm -894 A -753 NM - 419.5 UM - 135 cm - 536 UM -669 MM -725 CM - 494 cm - 492 cm -952 A - 536 mm -556 mm - 649 nm -628.5 um - 578 UM -195 CM - 607 UM -868.0 um - 876 NM -160 UM - 29 UM -776 A - 929 um -177 nm - 82 mm - 553 um -191 um -691 mm - 515 mm -10 NM - 781 nm - 537 mm - 540 cm -927.0 um - 486 mm -539 um - 404 um - 80 A - 481 UM - 157 A -26 A - 237 A - 88.0 UM -285 UM - 963 um -894.0 mm -322 NM -898 UM -758 NM - 189 mm - 36 A -267 nm - 41 NM -287 UM -519 um -827 nm - 720 A -942 mm -377.0 mm -992 UM -560 mm - 654 nm - 45 nm - 614 um - 702 nm - 667 CM -552.0 A -364 mm - 423 MM -899 UM - 814 CM - 272 um - 308 A - 386.5 nm -704 mm - 884 MM -103 UM - 917 UM - 690 A - 930 MM -34 um -933 MM - 985 NM - 808 MM - 904 CM -555 A - 868 A -376 cm - 149 NM - 653 um - 892 CM -739 UM - 230 mm -835 UM - 662 cm - 19 MM -85 um - 479 nm -691 UM -203 mm - 447 CM - 244.0 um -891 NM - 493 A -181 nm - 134 um - 980 A - 400 cm - 779 nm -551 mm -475 UM -229 CM -853 mm -471 NM - 635 um - 137 cm -692 CM -363 mm - 673 A -873 CM - 275 A -304 MM -177 nm - 68 UM - 968 mm -614 MM - 128 nm - 985 nm - 540 mm -80 cm - 149 nm - 531 MM - 285.5 um -631 MM -607 MM - 435 nm -596 cm - 55 MM -125 MM -34 um - 877 CM -307 NM -992 MM -140 NM - 985 UM - 486 UM - 159 cm -206 cm -211 nm -293 UM - 458 cm - 236 UM -552 nm - 428 A -158 cm - 857.5 NM - 577 MM - 394 mm -504 cm -184 A -640 UM - 434 um - 689 A - 46.5 NM - 816 MM -196 nm - 485 CM -43 A - 238 cm - 683 A - 773 CM -294 mm -804 MM -904 cm - 464 UM -158 A - 743 CM - 636 CM - 670 mm - 304 A -460 mm -935 CM -727 um - 145 cm -865 NM - 178 nm - 181 UM - 766 CM - 575 mm - 998 UM -200 NM - 416 cm - 422 um - 717 A - 914 cm - 685 UM -42 A -978 A - 943 UM -683 CM -474.5 NM -731 A - 743 nm - 657 UM - 520 NM - 838 mm - 44.0 UM - 746 um -787 CM -468 CM -488 NM - 210 UM -475 UM - 560 cm -458 A -169 um - 909 A - 973 um - 475 um - 800 um -3 A - 659 UM - 99 CM - 793 um -140 nm -393 nm -724 NM - 301 A - 994 MM - 275 A -670 um -907 nm -944 um -58.5 NM - 746 mm - 674 A - 796 cm - 22 mm -107 CM - 386 um -134 CM - 151 CM -211 um - 851 um - 175.5 NM - 68 cm - 702 UM -884 MM - 650 A -726 mm -630 MM - 819 cm -215 um -306 um -379 cm - 880 nm - 365 CM -288 NM - 342 CM - 828 MM - 99 NM - 249 mm -908 NM -433 um -96 mm - 427 nm -694.5 nm - 533.0 UM - 914 NM - 3 A -125 MM -93 NM -491 UM -607 MM -423 A - 997 NM - 872 um - 515 cm -802 mm -292 CM - 386 UM -77 A -138 CM - 242 nm -300 NM -461 MM - 63 UM -523 NM -308 A -998 nm - 389 nm -602 CM - 702 CM - 751 UM - 932 cm -810 mm -818.0 NM - 196 NM - 544 UM -509 um -477 NM - 620 UM - 4 A -881 A -262 A -198 MM - 836 CM -807 A - 106 CM - 813 nm - 797 cm -988 NM - 878 A -900 CM -543 UM -37 NM -335 cm -696 CM - 613 A -340 CM -501 NM - 363 nm -857 MM -139 nm -671 um - 396 MM - 489 MM -782 NM -796 mm -148 mm -595 UM -291 CM -30 CM - 943 UM - 227 cm - 194 mm - 452 nm -986.0 nm -125 mm - 715 A - 909 MM - 784 CM - 756 NM -81 cm -10 UM -964 MM - 241 CM - 269 A -74 nm -149 cm -913 cm -899 nm -751 mm -611 mm -546 cm - 324 A - 662 UM - 656 UM - 831 NM -751 A -10 CM -654 cm - 511 nm - 419.5 cm - 397 nm - 618 um - 423 nm - 49 um - 757.0 um -288 CM -855 A - 940 cm -148 CM -927 CM - 721 CM - 894 nm -606 NM -335 NM - 470 NM -923 UM -757 mm - 734 A - 167 mm - 673 UM - 372 NM -915 CM -664 cm - 47 um - 449 nm -374 CM - 449 nm -635 MM - 796 nm -362 cm - 795 mm - 758.0 mm -444.5 CM - 557 MM -769 UM - 384 A -834 MM -323 cm - 345 mm - 605 nm -589 cm -890 mm -906 um -342 CM - 318 CM -8 CM -342 A - 8 MM -830 MM -203 cm - 479 cm -354 mm - 909 CM -393 mm -391 MM - 292 A - 748 mm - 932 NM - 147 NM -75 CM -764 mm -178 um - 965 um - 842 A - 517 A - 138 UM - 166 CM - 30 MM - 218 CM - 258 mm - 455 CM -521 CM - 894 cm -985 MM -251 NM -412 nm - 672 MM - 978 UM -326 NM -17 mm - 612 CM -635 mm - 61 cm -748 A - 779 um -578 A -386 CM - 900 A - 870 nm - 547 mm -511 CM -714 um - 82 A - 651 um - 571 MM -8 mm -193 nm - 311 UM -729 A -105.5 MM - 44.0 cm -819 NM - 830 MM - 705 nm - 578 mm - 985 um -2 CM - 489 mm - 56 UM -645 NM -3 A - 861 MM -933 CM - 317 cm - 745 CM - 793 MM -122 CM -724 cm - 26 UM -744 CM - 933 cm -207 NM - 357 cm - 117 NM - 222 um - 790 MM - 970 um -188 um -213 um -616 A -39 cm - 238 MM -789 um -889 um - 880 mm - 98 NM -805 CM -590 A - 783 MM -500 UM - 231 A - 279 cm -139 nm -14 UM - 974 CM - 531 NM - 552 NM -648 UM -106 A -725 A - 206 A - 517 mm -393 mm -955 NM -420 CM - 540 UM -460 CM -669 MM -283 MM - 108 um - 982 cm - 636 mm - 865 CM - 944 NM -551 MM -179 um -460 CM -910 NM -59 UM - 768 A - 159 um - 1000 mm - 223 A -938 MM -292.5 cm -398 UM - 882 nm - 578 A - 66 CM - 719 NM - 706 mm -721 nm - 848 MM -196 CM -987 um - 80 mm -552 UM -201 MM -778 CM - 539 mm -510 CM -883 nm - 47 nm - 510 mm -684 CM - 990 CM -359 MM - 770 A - 874 cm -112.5 CM - 962 A - 586 cm -729 UM - 471 um - 434 mm -137 CM -721 MM -619 MM - 403 A -662 UM - 510 cm - 116 um - 954 UM -843 mm -302.5 cm - 612 nm -549 UM -470 cm -155 mm - 772 UM -129 A -617 mm -314 MM -413 MM -866 mm - 113 NM -335.5 UM -507 cm - 643 UM -698 cm -219.0 NM - 269.0 nm -457 mm -770 CM -780 A -608 mm -287 um -319 UM -682 um - 49 A -538 cm -183 um -422 A -256 cm -518 A - 165 um -158 UM - 867 um -716 A - 444 UM -885 mm -653 UM -99 nm -562 A -71 A - 90 A - 30 UM -978 nm -963 nm - 68 CM - 379 NM - 871 MM - 528 CM - 103 cm - 364 mm - 46 CM -645 cm -137 MM - 332 A -416 mm - 612 cm - 655 MM - 416 mm -37 nm -896 nm - 743 UM - 293 A -893 CM -90.0 um - 627 um -750 A - 909 CM - 744 NM -321 CM -642 A -202 mm -597 mm -881 NM - 666 MM -516.5 A -193.0 um -169 A - 48 mm -847 CM - 235 MM - 52 A - 12 um -803 um - 493 UM - 330.5 cm -999 MM - 115 mm -272 um - 69 um - 4 A -297 mm - 677 mm - 10 NM - 698 um - 779 A - 170 cm - 590 A - 835.0 cm -778 mm - 733 nm - 465 CM -531 um - 753 cm -416 um -474 UM -665 nm - 808.0 cm - 152 um -79 NM -468 UM -820 A - 906 UM - 99 CM - 925 UM - 456 nm -795 A -45 cm - 836 um -119 mm -507 MM -963 MM - 297 A -576.0 um - 664 UM - 72 um - 718 UM - 398.5 A - 229 MM -193 um -587 CM -911 CM - 51 mm -157 mm -685.5 cm -425 NM - 942 nm -2 nm - 246 CM -23 MM - 969 mm -751 mm -637 UM - 126 nm -179 cm - 325 A -630 um - 475 CM -67 cm - 458 NM - 50 cm - 608 cm - 786 MM - 423 NM - 124.0 CM -73 nm -648 NM -43 mm -700 nm -916 mm -490 mm - 918 CM -342 cm - 595 UM -760 nm -858 A - 625 A -783 cm - 403 mm -282 mm - 14 NM - 235 um - 391 mm -253 um -142.5 NM - 168 UM -548 UM - 424 mm -274 MM - 990 mm -606 mm - 445 MM -407 mm -8 nm - 30 UM - 726 NM - 63 CM -201 nm -314 cm -617 UM - 392 cm - 138 cm - 962 UM - 489 MM - 345 A - 72 UM -463 A - 614 nm - 929 CM - 687 NM -597 A -765 NM - 92 UM -852 CM - 279 UM -46 cm -313 um -345 CM - 649 nm -119 MM -422 A - 696 A - 708 A - 173 NM - 194 A -66 NM -893 um - 763 mm - 574 MM - 10 A -541 NM - 646 um -734 A - 112 MM - 302 MM -809 nm - 292 nm -813 CM - 149 nm - 608 cm - 173 mm -537 NM - 529 um - 758 cm -463 MM -249 UM -283 A - 86 MM -136 cm - 975 UM -210 UM -261 MM - 910 mm - 393 MM -996 nm - 857 CM -291 UM -317 nm - 240 UM - 80 A -643 mm - 785.5 mm -59 NM - 753 MM -968 nm - 32.5 NM - 155 mm - 533 NM -76 NM - 113 nm -359 MM -543 um -155 NM -901 UM - 440 um -533 A -912 MM - 123 NM -456 MM -983 cm - 12.0 NM -484 cm -733 mm - 744 UM -555 A - 494 nm - 114 nm -8 cm - 536 CM - 877.0 nm - 84 nm -485 um -557 cm - 21 UM -993 MM - 514 UM - 741 A -219 A -518 UM -510 UM - 188 nm - 55 A -925 um -223 mm -18 NM - 616 A - 345 NM -587 A - 315 nm - 795 NM -508 cm -287 NM - 800 mm - 120 mm - 779 CM -271 cm -664 CM -155 NM -599 A -814 NM -298 um -504 mm -382 A - 221 um - 305 um - 711 MM - 572 MM -285 mm -161 CM - 856 nm - 501 cm - 96 NM - 831 mm - 751 MM -197 mm - 194 A -214 MM - 812 um - 226 mm - 744 mm -281 cm -648 CM - 367 MM -150 mm - 256 cm -279 UM -591 NM - 493 NM - 537 MM - 200 UM -862.0 cm -299 mm -726 nm - 87 A - 121 A -876 mm - 158.5 um -741 um -132 A - 376 A -83 UM -649 um -446 cm - 673 mm -759 nm - 967 CM - 589 UM - 881 cm - 165 CM -619 A - 2 mm -616 CM -511 A -11 nm -429 A - 518 MM - 416 MM - 637 UM - 448 UM -44 NM -898 cm - 691 NM - 466 um -932.0 UM -114 CM - 489 mm - 115 UM -36 mm - 917 um -177 MM - 810 MM - 644 um -537 NM - 132 nm -341 um -107 cm - 103 UM - 941 mm -272 MM -856 MM -651 A -609 UM - 362 mm -435 nm - 689 CM - 857 nm -32 cm - 185 UM - 958 NM - 30 um -514 nm - 947 UM -617 MM -53 CM - 441 mm -257.5 MM - 452 mm - 479 UM - 990 A -708 mm -321 A -538 um - 976 A - 390 A -247 MM - 977 MM - 313 CM -225 NM - 644 um - 1000.0 nm -431 mm -550 A -664 um - 81 nm - 725 um - 708 CM - 648 MM -614 CM -374 cm - 967 mm -484.5 MM -866.5 um -598 cm -468 cm -723 cm -720 A - 577 nm -515 A - 75 UM -987 nm - 423 NM -934 UM -667 cm - 417 UM -345 MM - 882 MM -406 MM -777 MM - 532 um -243 nm - 496 NM -215 MM -159 NM -581 um -717 nm - 962 nm - 470 UM -507 um - 84 CM -428.0 MM -940 MM -423.0 nm -283 nm - 256 MM - 861 NM -592 MM -277 nm - 201 cm -864.0 MM - 574 NM - 787 UM -316 cm -62 cm - 455 MM - 402 nm -705 UM -792 cm - 687 cm - 403 MM - 983 NM - 525 CM - 995 um - 108 NM -978 NM - 435 mm -190 nm -216 A - 286 UM -607 mm -102 UM - 825 cm - 848 um -360 cm -202 nm - 271 CM -215 NM -885 A -331.5 mm - 187 UM - 639 NM - 865 UM - 599 NM -528 A - 498 CM - 996 mm -402 um - 789 A - 859 MM -900 CM -755 UM -377 mm -76 CM -437 cm - 809 mm - 753 cm -642 cm -655 MM - 684 nm - 900 NM -668 CM - 984 mm -496 UM -182.0 UM - 740 mm -475 cm - 705 UM - 465 MM - 916 CM -53 nm -761 UM -577 CM -718 NM -763 MM - 271 CM -988 cm -741 um - 669 mm - 735 CM -416 mm -592 A - 701 UM - 581 MM -348 NM -572.0 MM - 622 UM - 987 mm - 355 CM - 292 nm - 904 CM - 925 CM -142 nm -192 NM - 567 mm - 420 nm -510 cm -480 MM -729 nm -134 MM -304 mm -71 um - 370 A -472 CM -562 um -852 UM -326 cm -604 MM -169 NM -837 MM - 713 A - 653 um -682 UM - 503 um - 542 MM -629 UM -423 CM - 396 MM - 733 NM -698 cm -911 CM -428 NM -781 MM - 824 cm -804 CM -709 UM -371 nm -615 NM -488 CM - 211 nm - 516 nm -462 UM - 780 nm -131 mm - 756 NM -671 cm -577 UM - 376 UM -701 A -667 um -873 um -732 CM - 227 CM - 900 A -260 um - 787 NM -399 mm -109 um - 967 UM - 123 A -79 MM - 957 MM - 718 MM - 33 nm -673 cm -422 nm - 883 mm -589 um - 53 um - 545.0 UM -380 cm - 276 CM -239 um - 388 NM - 659.0 A -756 A -228 UM -547 CM - 721 CM - 15 cm -42 um - 638 CM - 443 cm -593 cm -456 CM - 755 cm -308 mm - 362 cm - 281 NM - 687 CM - 845 cm -538 UM - 772 um -745 NM -726 UM - 448 um - 77 nm - 910 mm - 442 NM - 159 mm - 588 mm -922 um -589 CM -340.5 mm - 422 CM -683 CM -215 A -324 nm -962 MM -516 nm - 320 nm - 893 nm - 899 NM -301 um -681 mm -725 MM -639 cm -655.5 cm - 204 nm - 280 UM - 696 MM - 912 nm -861 A - 566 cm - 755 A - 969 CM - 284 MM -990 um - 223 nm - 87 um -735.5 nm - 575 mm - 894 MM -911 cm - 822 nm -854 NM -647 mm - 545 cm - 227 um - 564 cm - 17 cm -10 UM - 352 A - 158 NM - 278 nm -673 UM -688 NM -753 NM - 931 UM - 489 NM - 819 NM -653 MM -102 CM - 527 A - 184 CM -983 NM - 322 cm -954 A - 554 um -365 cm -826 UM -652 MM - 887 A -859 cm - 600 UM -888 um -866 cm - 927 mm - 190 UM -869 mm -174 NM -100 nm -76 mm - 999 UM - 671 cm -442 CM -31 MM -418 mm - 654 um -125 cm - 791 A - 839 um - 698 um - 323 MM -11 CM -968 A -430 NM -825 UM - 168 cm - 664 mm -486 UM -715 CM - 215 cm -242 cm - 990 nm - 28 CM - 910 UM -148.5 CM - 336 UM - 274.5 nm -305 NM - 9 um - 454 mm - 429 cm - 25 MM -150.5 NM - 137 mm - 16 NM - 93 um - 534 mm -948 um -326 CM - 807 mm -17 mm -51 A -40 nm - 294 A -53 nm - 88 nm -848 MM - 579 A -440 MM -638 cm - 412 CM -333 um - 840 A - 569 nm - 575 NM - 782 UM -339 A - 645 CM -163 mm - 634 NM - 478 UM - 535 mm -739 cm -287 cm -102 um - 849 NM -39 NM - 381 nm - 411 um - 744 MM -103 CM - 520.5 NM -989 MM -588 NM -788 A -366 CM - 170 um -806 NM - 776 cm - 10 NM - 794 nm -160 um - 509 MM -577 NM - 600 A - 947 UM - 457 UM -398 NM - 237 A -508 UM -528 UM -620 nm - 839 mm - 33 mm - 331 nm - 408.0 mm -640 CM -196 NM - 830 cm - 511 mm - 515 cm - 632 A - 730 A - 200 NM -884 um - 605 um -643 mm - 699 MM - 812 NM -607 mm - 834 nm - 657 mm -764 um -507 mm -913 nm - 92 cm - 863 MM -496 mm -146 A -428 cm -835 cm -84.0 UM -352 UM -321 CM - 825 um - 709 cm - 284 um - 475 UM -437 CM -968 NM - 810 NM -963 NM -36 nm - 709 nm - 1.0 um - 877 CM - 357 cm - 117 UM -997 um - 861 UM -286 CM -676 nm -974 MM - 400 MM -391 MM -477 um -427 NM - 508 nm -282 MM -312 um -647 nm - 359 NM -845 UM - 338 cm - 552 mm - 810.0 CM - 85 MM -342 mm -456 UM - 972 A -573 MM -979 CM - 622 UM -578.5 NM -308 MM -709 CM -761 UM -884 cm - 321 A - 977 CM - 800 cm - 459 cm - 84 um - 793 NM -96 mm -982 cm -132 nm - 935 nm - 857 CM - 433.0 mm -668 um - 799 um -794 NM - 125 A -811 MM - 453 um -658 CM -433.5 CM -443 UM -551 cm -141 A - 318 A -231 MM -194 um -657 UM - 187 NM - 525 mm -367 NM - 538 MM -376 NM -400 MM -582 NM -306 NM -419 CM -689 mm - 292 UM -982 UM - 584 um - 203 A - 565 A -448 CM - 363 um -750 mm -652 mm -188 A - 62 CM - 591 MM - 335 cm - 23 mm -298 um -423 um - 283 CM - 526 UM -667 MM - 533 MM - 556 NM - 392 MM - 54.0 NM -538 um - 977 cm - 455 nm - 16 nm - 255 UM - 690 cm -715 A -315 CM -763 NM - 113 MM -89.0 A -665 UM -652 cm - 25 cm - 128 mm - 871 cm - 40 CM - 536.0 A - 259 cm -465 MM - 783 um -475 MM - 535 A - 62 um - 385 MM -661 um -801 cm -938 nm - 982 MM -225 CM - 724 UM -270 A -479 NM -582 A -622 A -608 nm -624 nm - 70 A - 158 UM -882 CM - 547 cm -848 nm - 162 um -809 CM - 633 mm - 800 UM - 484.0 MM -109.0 MM -592 mm -212 mm -883.0 cm - 52 UM -917 NM -503.0 UM - 240 nm -623 mm -774 um - 611.0 um - 744 um - 101 CM - 176 mm -671 NM -770 um - 561 NM - 888 MM -943 UM -358 nm - 940 A - 119 CM - 455 mm - 727 mm - 590 CM -486 mm -223 UM -809 cm - 475 cm -279 NM -753 um -538 cm -598 CM -266 NM - 609 um -106 NM -753 mm -870 cm -282 cm - 713 nm - 746 nm - 496 NM - 582 mm - 945.0 UM -720 CM - 963 cm -934 UM - 763 um - 309 CM -978 UM -783 A -36 CM - 461 NM - 406 cm -351 NM - 171 cm -938 A -732 UM - 861 mm - 766.0 MM -872 nm -563 UM -741 cm - 13 CM - 269 CM -463 UM -340 MM -919 MM -752 CM - 301 A - 620 cm -599 mm -49 A - 758 A -327 nm -97 A - 585 nm - 391 CM -492 mm - 670 CM - 458 um - 137 nm - 647 MM -109 A -380 cm - 846 MM - 340 NM -619 nm -395 cm -307 CM - 418 um -689 MM -505 cm - 853 CM -78 A - 80 CM -620.0 UM -644 nm -637 mm - 116 NM - 329 CM -796.5 MM - 997 nm -979 nm - 301 cm - 969 nm - 16.0 MM -58 A -487 mm - 185 nm - 860 um -997 UM -672 UM - 42 UM - 550 um - 412 NM -295 um -190 cm - 439 nm - 446 UM - 778 cm -549 cm - 19 nm - 232 um -176 MM -765 MM -999 UM -71 A -648 MM - 106 MM - 896 cm -767 CM - 546 MM -702 cm -728 cm -512 A -993 CM -614 nm - 862 cm - 982 UM - 493 NM - 381 UM - 526 cm -107 MM - 822 NM - 756 CM - 812 A -595 MM - 407 mm -561 A - 245.0 um -987 MM -499 UM -786 mm -125 MM -919 UM -848 CM -193 MM - 395 um - 747 nm -772 CM -234 um -73 A -641.0 CM -706 um - 94 nm -291 UM -280 UM -325 cm - 771 MM - 105 cm -16 nm - 713 A -870 UM - 887 MM -723 mm - 347 NM - 446 cm -698 um -664 nm -465 cm - 246 mm - 673 CM -773 um -16 nm - 265 MM -509 cm -749 A -132 UM - 467 nm - 907 MM - 754 NM -160 UM - 390 mm - 682 UM -978 A - 336 A - 987 CM -726 NM -469 CM -838 NM -491 NM - 408 NM -875 MM -367.0 CM - 387 MM -637 mm - 76 um -376 mm - 224 NM - 296 CM - 732 mm -695 nm -200 cm - 224 nm -189 nm - 840 NM -212 CM -160 mm - 830.5 NM - 554 NM - 117 UM -398 cm -992 A -742 UM -766 NM - 546 A - 47 CM -996 MM -830 cm -490 cm - 802 nm - 762.0 NM - 578 CM -990 UM - 285 cm -558 NM - 961 NM -375 mm -152 cm -30 mm -568 NM - 981 um - 678 NM -620 A - 132 cm - 596 cm - 98 um - 76 A - 73.0 cm - 199 A - 446 NM -135 mm - 270 A - 72 CM -40 A - 221 nm -107 mm -637 UM - 894 UM -190 A - 156 NM - 325 MM -646 NM -119 mm -885 MM -170 cm -539 CM - 631 UM - 892 MM -74 nm - 408 nm - 244 cm -981 nm -954.5 MM - 135 cm -849 cm -261 mm - 817 cm -113 CM -768 um - 941 CM - 360 mm - 380 nm - 167 MM -25 CM -246 nm -120 mm -216 nm -856 nm -95 nm -858.5 cm -512 MM -301 nm -431 nm -685 um - 261 UM - 749 UM - 292.5 um -217 UM -41 A -758 mm - 188 um - 609 um - 1 A -92.0 UM -772 A -733 nm -557 cm -649 mm -548 A - 998.0 CM - 245 nm - 652 A -466 NM - 393 UM - 812 UM - 643 cm -281 CM -29 mm - 520 NM -318 NM - 56 nm - 467 cm - 635 CM -113 CM - 630 UM - 939 mm - 900 NM - 458 MM - 304 nm - 385 MM -104 cm - 852 CM -442 mm - 378 CM - 795 nm - 14 cm -154 um - 147 MM - 26 UM -362 MM - 370 nm -70 nm - 175 UM - 556 CM -874 NM - 22 A - 457 CM - 884 mm - 802 NM -102 NM - 179 NM -836 UM -634 NM - 841 CM - 80.5 A - 696 NM -496 A -551 um - 928 MM - 575 MM -539 CM - 716.0 A -696 NM -322 mm - 612 NM -372 mm -878 UM - 405 cm -467 UM - 878 um - 472 A -100 A -503.0 A - 921 nm -820 MM -212 cm - 166 cm -370 nm - 396.0 um -684 A - 833 MM - 279 mm - 976 A - 26 um -991 cm -100 cm - 727 MM - 701 um - 255 mm -15 A - 441 nm - 101 nm -438 NM - 633 CM -809 A -779 mm - 235 um -974 UM -517 MM -223 CM - 674 UM -473 mm -219 um - 36 MM -250 nm - 803 nm - 95 CM - 551.0 cm - 820 nm -592 um -703 mm -190 UM -797 um - 305 NM -330 um -674 MM - 929 mm - 633 MM -304 CM - 980 MM -997 A - 799 UM - 616 A -518 MM -352 A - 867 UM - 33 CM - 759 NM -189 cm -900 CM -408 MM - 509 nm - 721 um -994 MM -501 mm -572 cm - 687 UM - 404 mm - 222 UM -429 MM - 566 UM -723 um - 291.0 UM -784 MM - 439 A - 20 um - 575 mm -25 NM -12 nm - 314 cm -802 MM -819 NM -393.0 CM -833 NM -913 mm - 414 A - 201 MM - 924 A -825 mm - 13 nm - 331 um - 172 cm - 750 CM -817 um -275 mm - 517 cm -220 MM -229 CM -851 nm - 259 NM -152 CM - 494 nm -262 UM -376.0 nm -432 A - 470 NM - 120 nm -834 UM - 768 MM -94 cm -916 CM -435 A - 771 UM - 560 mm - 138 um - 561 cm -768 mm -747 nm -373 A - 319 CM -858 CM -924 MM -910 NM - 436 UM - 301 mm - 242 MM -806 A -68 mm - 44 mm -122 A - 521.5 MM -885 A -446 cm -35 nm -28 NM -186 um -827 um - 193 nm -222 A -825 cm - 690 A -693 um -487 um -863 NM -457.5 um -183 um -516 um -390 UM -650 CM -517 nm -904 A -293 A -778 mm -918 A -407.5 A -157 nm - 343 nm -273 nm - 582 MM - 546 UM -448 A -716 NM -665 MM -652 A - 114 NM - 396 UM -306 mm -161 NM -327.0 CM - 917 UM - 932 mm -494 UM - 418 MM - 828 mm - 744 A -230 nm - 328.0 mm - 862 MM - 239 um - 263 nm -594 mm - 839 UM - 254.5 nm -715 MM - 613 um - 531 mm -7.5 A -21 um -350 nm - 480 cm -254 nm -577 A - 57 cm -452 NM -463 um - 898 NM -598 mm -53.5 CM - 929 um - 967 MM - 325 mm - 589 UM - 18 MM -163 MM -955 nm -892 um -955 MM - 585 cm - 328 MM -536 CM - 879 cm - 154 MM -411 NM - 310 UM - 837 CM -22 UM -680 cm - 995 UM -322 MM -756 um -693 UM -507 NM -444 NM - 248 CM - 711 UM - 910 um -271 MM - 415 NM -596 CM -885 A - 338 cm - 161.5 mm - 785 MM -184 nm -997 cm -291 MM -487 UM -160 A -858.5 A - 174 um - 93 CM -682 cm - 311.0 nm -263 nm -554 um -837 nm - 502 cm -81 cm - 91 nm - 899.0 CM - 164 nm -272 CM - 982 cm -664 MM -946 MM -76 CM -912 cm -577 A -282 UM -614 um -238 MM -33 A - 997 um - 74 mm -717 A - 279 cm -54 UM -299 um - 568 MM - 606 mm - 873 NM -633 mm -63 UM - 852 nm -43 nm -591 UM - 471 UM - 71 nm -393.0 cm -561 CM - 242 nm -840 MM -980 A -47 nm -403 A - 740 CM -875 A - 768 UM - 220 nm -521 nm -633 cm - 361 mm -271 UM - 32 CM -880 nm - 872 A -820 CM -955 NM -991 CM - 386 cm - 411 NM - 3 CM - 430 NM - 31 NM - 75 nm -910 NM - 276 A - 559 MM - 451 cm - 701 NM -983 UM -597 UM - 187 nm - 859 nm - 120 cm - 300 mm -669 cm -450 CM - 69 MM -877 A -724 UM -540 nm - 471 NM - 131 A - 809 NM -129 NM -780 MM -590 mm - 753 NM - 236 cm - 624 CM -35 UM -168 NM -408 A - 547 mm - 434 um -649 CM - 392 A - 433 um -977 cm -3 NM -56 MM -896 UM -406.5 A -203 NM -959 nm - 996 MM -832 MM - 475 MM - 758 CM - 381 CM - 590 NM - 21 A -961 mm - 402 CM - 798 nm -890 CM -323 um - 528 MM - 584.0 cm - 674 MM - 26 nm -935 um -621 cm - 819 MM -261 MM - 75 nm -641 nm - 336 NM -576 MM -440 UM - 625 nm -486 NM - 749 NM -5 nm - 454 MM -729 cm -561 UM -261 CM - 983 nm - 588 CM - 162 um - 980 UM -397 UM -925 MM -93 UM - 755 NM - 414.5 CM -373 MM - 651 cm - 531 UM - 521 mm -670 MM - 919 um - 317 cm - 564 A -89 mm - 180 MM -181 cm -439 cm - 882 MM - 736 mm -121 NM -208 nm -881 mm - 322 CM - 543 CM - 310 NM -80 A - 425 CM - 998 NM -953 mm - 25 cm -886 mm - 589 NM - 207 UM - 270 um -631 um - 757 A - 503 um - 293 mm -108 cm -359 um - 553 cm -883 NM - 28 nm -780 CM -255 MM - 830 cm - 51 um - 587 cm -472 A - 302 cm -327 mm -674.5 UM -302 A -115 A -641 UM -461 MM - 914 CM -241 A -727 NM -190 NM - 42 CM - 823 mm - 754.0 mm - 851 mm - 14 nm -201 NM -978 NM - 774 MM - 989 um - 133.5 um -68 cm - 482 cm - 967 um - 834 NM - 799 A -672.5 um - 854 NM - 416 cm - 933 um - 639 NM - 778 CM -581 UM - 7 NM - 785 UM - 353 mm -787 cm - 453 mm - 691 cm -260 MM -569 mm -131 UM -133 CM - 341 NM -731 NM -993 CM -55 NM -49 NM - 607 nm - 492 MM -562 UM - 989 CM -682 nm -817 um - 119 CM - 272 cm -126 mm -548 nm -746 nm - 9 NM - 301 CM -187 nm - 205 nm - 882 nm - 654 cm - 523 mm - 281 cm -513 UM -157 CM - 814 nm -731 UM - 884 cm -850 nm - 359 mm -788 NM -903 A -718 MM -706 CM - 103 CM -641 A -42.0 CM -942 A - 777 NM -235 mm - 616 NM - 741 A -756 um - 523 um -977 cm -527 nm -958 mm - 438 CM - 358 nm -481 um - 65 mm -976 CM -628 nm -451 A - 697 NM -711 A - 908 nm - 769 um - 101 nm - 318 cm -421 nm -234 UM - 871 UM -656 MM - 235 NM -930 MM -240 cm - 813 cm - 420 cm -897 cm - 881 UM -619 UM -452 NM - 236 cm - 737 cm - 260 cm - 749 A -904 um -950 nm -547 nm - 144 cm -559 MM - 587 CM -505 cm -464 nm -647 nm - 796 um -979 MM - 698 UM - 356 A - 343.5 mm - 263 cm - 981 CM - 13 nm - 207 A - 546 nm -993 mm - 479 mm - 511 mm - 610 NM -692 nm - 349 mm -502 nm -568 UM - 549 MM -705 cm - 566 A - 580 cm - 213 cm - 651 A -734 um - 512 CM -459 um -367 um -236 CM - 444 CM -830 cm -391.5 NM -234 UM - 177 CM -418 CM - 478 A - 674.5 NM -827 cm - 23 cm -153 UM -242 MM -835 UM - 578 CM -880 nm - 566 nm -264 um - 266 MM -518 CM -954 MM -283 A -219 UM - 449 A - 831 NM - 654 um - 154 A - 954 cm -844.0 A - 588 um - 343 cm -575 NM - 919 CM -766 mm - 260 NM - 725 nm - 3 A - 925.0 NM - 142 NM -134 NM - 513 cm - 375 nm - 576 MM - 817.5 nm -323 NM - 326 NM -928 mm - 541 um -526 CM - 586 um -593 A -584 A -404 nm -211 UM - 196 um - 128 cm - 736 CM -528 MM -316 nm - 19 mm - 295 MM -318 A - 243 nm -54 um -485 UM -513 A - 106 CM -123 nm - 459 nm - 707 nm - 126 CM - 463 MM - 736 CM -773 UM - 898 A -194 UM -293 A - 332 mm -596 cm - 883 um -32 um - 729 nm - 561 um -428 um - 412 MM - 246 cm - 511 nm - 410 CM -53 MM -582 cm - 592 UM -961 cm -751.5 mm -385 A -998 cm - 693 cm - 92 A - 147 CM - 33 nm -536 mm - 354 NM - 787 cm -985 A - 313 CM - 822 mm -43.0 nm -45 CM - 538 um -132 NM - 747 cm -559 MM -803 MM -220 MM -532 NM -682 cm - 333 A - 550 mm -891 um -823 mm - 692 NM - 356 NM -623 um -923 UM - 463 mm -750 mm -305 CM - 618 MM -189 CM -629 UM -66 cm -596 UM - 462 cm -572 um -149.5 UM - 211 MM -303 um -10 MM -955 NM -933 A - 65 CM -624 MM - 203 um -355 cm -84 UM - 602 cm - 267 um -215 nm - 363 UM -378 MM - 53 um - 736 UM - 150 MM - 367 nm -751 um - 147 nm -2 UM -715 nm - 664 MM -812 MM -582 MM - 623 nm -718 A -360 NM - 95 UM -920 um -193 mm - 973 UM -380.5 A -6 nm -170 A - 121 MM - 533 nm - 630 nm - 369 cm - 228 UM -944 cm -447 NM -986 A - 901 UM - 230 MM -375 MM - 99 A -93 CM - 141.0 nm - 278 mm - 192 um - 578 um - 228 cm -54 mm -70 cm - 165 CM - 397 mm -708.5 mm - 796 UM -978 CM - 828 cm - 350 um - 975 cm - 304 A - 338 mm -826 cm - 696 nm - 231 mm -335 NM -847 cm -291 nm -44 cm -193 CM - 666 nm -223 nm -980 A - 120 um - 153 nm -355 UM - 258 um -109 A -580 cm -195 mm - 344 MM -50 nm - 260 mm -757 UM - 301 um - 987 A -199 UM - 988 MM - 735 CM - 903 um - 461 MM - 688 mm - 447 NM - 417 CM -400 MM -284 nm -779 MM - 791 nm - 473 A - 212 mm - 790 NM - 494 UM -95 MM - 749 nm -609 nm -897 A - 703 cm - 663 um - 476.5 NM -781.5 A - 587 NM - 195 cm -27 um - 448.5 NM -346 mm -54 um -226 UM - 14 mm -884 mm - 236 nm -909 UM -976 MM - 467 mm -146 cm -807 mm -150 nm -280.0 um - 34 mm - 593 um - 171 MM - 292 nm -88 UM -29 cm -1000 mm -229 NM -750 MM - 993 um -112 um - 960 UM - 108 um - 400 NM -454 A -611 A -226 mm -626 um -608 NM -560 A -44 CM - 941 nm - 661 MM - 358 cm - 877 cm - 243 nm -918 um - 675 MM - 366 MM -694 cm - 150 NM - 647 NM -22 cm -712 nm -310 NM -406 MM - 905 um -642 nm -365 nm -9 um - 986 CM - 561 mm - 116 NM -354.5 CM -144 mm - 648 um - 341 A - 910 nm -900 mm -906 UM -73 mm - 698 CM - 217 NM -271 cm - 175 A -580 NM -628 MM -51 um -499 UM - 689 CM -672 um -999 um -376 NM - 79.5 um - 534 um - 67 UM -503 MM -355 A - 640 cm - 508 UM -792 UM - 983 CM -157 NM - 824 um -367 UM - 907 cm -520 cm -812 cm - 685 cm -231 nm -895 nm -358 UM -533 cm -960 mm -178 MM -897 mm - 945 mm - 748 UM - 414 MM -209.0 mm - 337 cm -894 CM - 842 CM - 755 nm - 163 UM -78 nm - 808.5 um - 772 NM -84 nm -588 nm -489 UM -928 nm - 8 A - 786 A -616 mm - 387 mm -768 nm - 166 MM - 684 A - 459 mm -9 mm - 1000 CM - 485 CM - 319 um - 659 CM - 825 CM -165 NM -524 cm -27 um -111 nm - 68 um - 604 um -678 UM - 887 cm -112 cm - 109 mm -13 mm - 176 A - 684 A -990 cm - 529 cm -359 um - 660 A - 79 CM -7 mm -236 MM - 564 CM - 757 nm - 340 CM -696 A -520 NM - 475 UM - 759 mm - 576 NM - 768.0 um -424 nm -629 NM - 968 MM -422.0 um - 617 cm - 237 nm - 659 CM - 407.0 MM -441 um - 355 nm -336 cm - 814 nm -679 mm - 242 mm -42 A -303 MM -78 um -393 MM - 380 mm - 599 MM -958 cm -65 MM -304 um - 807 UM - 818 UM - 439 CM -832 MM - 893 nm -709 A - 79 cm -619 nm - 896 CM - 353 A - 108 nm -286 nm - 585 um -836 MM - 797 um -400 UM - 404 CM -363 um - 662 nm -94 UM -314 MM -475 UM -85 mm -204 um - 938 UM - 472 A -187 CM -414 cm -587 A - 839 CM -381 um -274 cm -872 UM -598 MM -992 cm -213 MM -713 UM - 247 UM -699 cm -159 A -627 A -133 NM - 284 UM - 302 um - 924 mm -452 NM -579 A - 161 um -472 UM - 686 NM - 546 um -405 MM -866 nm - 216 UM - 225 NM -135 A - 195 MM -465 um -828 CM -858 cm - 372 cm -215 MM - 613 um - 539 NM - 708 MM -755 um -126 nm -648 CM - 364 CM -11 UM - 22 um -71.5 nm -526 mm -130 UM - 614 mm - 943 um -659 MM - 988 mm - 774 UM -249 cm - 319 mm -326 A - 565 NM - 158 cm -874 cm -101 nm -888 nm - 906 A -394 NM -570 MM - 148 um -678 A - 583 um - 817 UM -201 MM - 534 CM -403 A - 891 CM - 343 cm - 717 cm -153 NM - 201 CM - 245 cm -217 CM -689 um -36 CM - 97 um -436 CM -783 cm - 778 cm - 127 CM - 756 UM -221 MM -60.0 MM - 89 UM -986 MM - 724 mm -313 A -725 CM -960 mm - 594 cm -628 CM -708 CM -390.0 NM -421 CM -802 MM - 109 nm -265 cm -959 A -563 mm -726 UM -209 A -472 CM -280 NM -710 UM - 140 um - 674 cm - 182 nm -436 um - 807 um - 275 UM -958 MM - 992 MM -372 CM - 794 um -720 nm -61 cm - 999 NM -205 CM - 445.0 NM - 587 UM -320 A -539 cm - 415 um - 167 UM - 136 um -93 cm - 109 nm -219.5 CM - 699 CM -749 NM - 562 NM -279 cm - 600 mm -60 A -656 mm - 389 um -511 mm -964 NM -73 CM -93 mm -875 mm -325 um - 668 CM - 155.5 MM - 150 A - 637 UM -966 NM - 827 nm -491 CM -142 cm - 613.0 nm -769 NM -120 um -577 cm - 718 MM - 383 CM -580 mm -769 CM - 448 A -491 A - 508 cm -214 nm -614 NM -513 cm - 18 CM -299 NM -43 mm - 284 MM - 706.5 A -898 um -431 cm -159 CM - 789 um - 860 A - 162 CM - 605 UM - 206 um - 273 cm - 609 nm - 953 nm - 229 cm - 644 um - 61 A - 742 mm -623 A -952 nm - 847 nm -930 cm -863 UM -884 nm -238 mm - 66 mm - 971 CM -193 A -336 nm - 214 mm - 984 A -38 MM - 613 A -343 mm - 233 nm -476 cm - 548 NM - 758 cm -237 MM - 37 NM -349 mm -932 UM - 516 NM -753 NM - 102 MM - 903 mm - 526 NM - 266 mm - 433 nm -225 mm -389 nm -126 A -253 NM - 353 UM - 972 NM -579 A -683 um -470 MM -347 UM - 962 NM - 95.5 MM - 664 MM - 485 um -366 um - 382 nm -521.0 cm - 412 MM - 744 MM -756 cm -172 CM - 685 um - 646 NM -524 A - 350 CM - 269 nm -947.0 CM - 989 CM -14 cm -719 mm -99 cm - 244 cm - 199 NM -748 cm - 769 um - 495 mm -204 A - 354 mm - 786 CM -735 cm -399 A -902 CM - 223 nm -82 CM -553 CM - 251 cm - 226 UM -211 cm - 703 um - 276 nm -29 um -18.0 nm - 775 nm - 177 um -12 A -225 NM - 296 mm -147 um -408 cm - 912 MM - 111 nm - 872 UM - 309 CM -750 MM -225 A -445 MM - 380 A - 621 um - 797 MM - 129.5 cm -771 mm -515 mm - 804 um -570 mm -975 cm - 488 UM - 64 A -682 A - 76 CM -171 mm - 726 um - 558 UM -674 A -989 CM - 189 NM - 81 CM - 14 um - 382 UM -856 A -725 MM -769 CM - 50 CM - 561 NM - 664 cm -733 UM - 250 nm -777 mm - 727 nm -337 cm -94 UM - 98 A -122 NM - 236 cm - 51.0 cm -953 cm - 659 nm - 50 mm -184 nm - 390 CM -816 MM - 356 MM - 732 um -307 nm - 779 MM -32 MM -69 NM -107 MM -671 UM - 325 NM - 410 UM - 174 CM -392 MM -255 MM - 148 cm - 98 mm -797 nm - 99 mm - 538.5 mm -170 CM - 466 nm -728 nm - 530 A - 553 UM -574 um -498 mm -339 MM -459 A - 662 NM -198 MM -877 um -139 NM - 342 MM - 159 mm - 9 NM - 623 UM - 398.0 um - 531 UM -209 mm -750 MM - 581 NM - 862 cm -778.5 cm -87 MM -215 A -493 nm - 736 CM - 34 NM - 533 um -258.0 nm - 680 nm - 499 cm - 621 cm -712 um -680 nm - 654 NM - 640 A - 424 cm -400 mm -269 mm -802 um -855 A -990 NM -528 um -760 CM - 381 cm - 975 NM -657 mm -526 cm -469 mm - 344 UM -733 A - 220 nm - 340 um - 901 MM -75 um -275 nm - 800 MM -616 CM -3 nm - 98 UM - 835 cm - 38 mm - 230 cm - 551 UM - 879 um -769 MM - 15 CM - 505 CM - 995 MM -746 A - 826 mm - 58 mm -162 um - 606 mm - 847 MM - 611 nm -972 MM - 327 mm -237 cm - 206 cm - 766 UM -43 CM - 34 mm - 353 A - 746 cm - 390 um -930 MM -623 A - 128 UM - 848 nm - 122 NM -573 CM -69 A -58 mm - 946 NM -1 MM -965 MM -992 mm -967 cm - 161 UM - 551 mm -117 mm -491 mm -805 NM -233.0 UM -51 MM - 663 cm -413 cm - 662 NM - 528 NM - 862.5 UM -26 nm - 144 UM -699 CM -126.0 mm - 696 UM -203 cm - 957 A - 704 cm -52 MM -333 mm - 879 MM - 561 MM -809 MM -828 UM -470 um -120 cm -490 nm - 26 NM - 966 nm -403 NM -785 nm - 866 MM -204 UM -513 mm -394 nm - 464 nm - 609 NM - 761 NM - 868 MM -130 nm - 359 UM - 201 MM - 344 NM - 637 MM - 275 UM - 936 CM -982.0 NM -445 um - 592 CM - 770 MM - 837 CM - 209 nm -173 CM -880 NM -722 A - 475 CM -323 MM - 33 cm -494 cm - 119 A - 557 UM - 950 NM - 329 um - 592 mm -37 nm -326 nm - 62 um - 781 UM - 322 UM - 316 UM - 323 CM -473 cm -248 cm -961 NM -49 MM -77 NM - 269 CM -690 cm -507.0 A - 897 nm -804 NM - 363 nm - 727 CM -960 UM -466 mm - 532 NM -641 A -557.5 A -623 cm -757 A - 282 cm -203 mm - 803 UM -559 UM - 619 cm -158 nm - 364 um -766 MM - 597 NM - 851 NM -491 mm - 514.0 mm -478 CM -150 CM - 257 cm -252 A - 315 NM -291 cm -158.0 nm - 928 CM -994 A -531 UM -472 mm - 199 nm - 673 CM - 500 NM - 537 MM - 448 mm - 90 mm - 457 nm - 903 mm -928 um -163 mm -597 UM -849 mm -414 mm -403.5 cm -774 CM - 27 nm -285 um -670 UM - 748 nm -304 um -342 nm - 636 nm - 832 UM -398 mm - 913 nm -117 A -321 UM -663 NM - 382 cm - 410 NM -189 mm -548 mm -447 nm -140 nm -315 A -886 UM - 740 mm -878 um -239 NM - 368 MM -79 A - 411 nm -429 CM -789 CM -584 cm -6 nm - 54 CM -292 cm -121 CM - 129 A -756 CM -621 um - 332.0 CM -684 CM -35 mm -776 CM -990 nm - 282 cm - 196 MM -528 cm -324 um -703 cm - 803 MM -416 MM -210 NM - 428 NM - 77 nm -520 mm -683 CM - 989 mm -626 cm -365 A -420 nm - 212 UM -832 CM - 904 nm -969 MM -773 NM -106 nm -360.0 CM - 597 cm -774 A - 518.0 mm - 395 um -710 mm - 291 NM - 80 MM - 988 MM - 417.0 MM - 263 MM - 141 A - 498 UM - 437 NM - 228 UM -405 cm - 275 um - 834 MM -589 NM -284 CM - 669 nm -344 cm -79 MM -846 mm -614 UM -492 A -49 nm -908 mm - 995 nm - 559 CM -866 CM - 628 NM -798 mm -799 NM -127 MM -417.5 MM - 688 um -36 UM -866 UM - 617 A - 276 MM - 13 MM - 49 A -437 A -363 NM -480 CM -282 MM - 94 um - 752 NM -449 CM - 655 cm - 171 cm -796 A - 837 A -586 cm -754 um - 317 um -939 um - 776 UM -373 nm -788 NM -113 CM - 463 cm - 630 cm - 92 nm - 292 CM -805 UM -602 A -390 um - 648 UM -131 mm -681 nm - 407.0 UM -876 mm -898 UM -144 UM - 502 um - 815 A - 167 MM -192 A -447 CM -373 um - 84 cm - 333 CM - 954 CM -359 UM - 248 MM -697 A - 777 nm - 292.5 NM - 893 A -441 MM - 5 nm - 229 A -168 A - 207 CM -443 cm - 594 UM - 770 mm -347 MM -658 A -33 A -784 nm - 184 NM -409 MM - 598 UM -136 um -992 nm - 922 NM - 742 NM - 964 UM - 368 cm - 731 NM -34 mm - 883 cm -925 nm -286 nm -410 MM -888 nm - 40 mm - 844 mm - 476 UM - 399 cm - 178 mm - 381 nm - 24 UM -909 CM -643 MM -660 UM - 788 cm -655.0 UM -64 MM -17 um -495 UM -711 NM -242 MM -482 um - 233 um -162 NM - 553 mm - 884 A -152 um -371 A - 611.0 um -353 MM - 262 mm -25 UM - 818 cm - 745 mm -612 mm - 265 um - 551 mm - 544 cm - 643 cm -941 cm - 381 UM - 297 A - 837 cm - 102 UM - 179 nm -401 CM -115 um -510 mm - 193 um -761 UM - 313 mm - 734 NM - 72 nm - 12 NM - 554 NM -480 cm -637 A - 450 mm -792 mm -522.0 A -900 mm - 460 MM -427 UM - 167 NM -393 MM - 227 cm -562 MM - 604 CM -838 UM -294 cm - 982 CM -45 UM -561 MM - 656 MM - 773 CM -867 CM - 22 nm -226 cm -826 cm -781 um -209 nm - 307 mm - 387 MM -89 A -736 MM -914 A - 896 NM - 533 NM - 15 nm -513 UM - 521 cm - 47 A -343 A - 910 UM - 887 MM -139 NM -501 NM -680 MM - 296 nm -917 NM - 990 A - 63 nm -258 UM - 295 CM - 738 UM - 733 UM - 311 mm - 370 A - 977 A -731 A - 852.0 mm - 562 UM - 524 nm -299 cm -390 cm -651 mm -891 MM -860 UM - 984 mm -214 NM -618 CM -153 CM - 576 MM - 206 um - 605 A -512 UM - 639 A - 733 A -980 A -304 MM - 345 mm -698 MM -710 A -758 um -376 um - 192 MM -707 UM -457 cm -387 nm -614 A -341 NM - 794 nm - 553 MM -715 mm -2 NM - 500 nm - 259 cm -771 MM - 588 A -614 cm - 911 NM -495 mm -152 um - 294 UM - 179 MM -308 NM -555 UM - 573.0 A -93 cm -860 nm -600 mm -152 nm -296 CM -790 NM -914 mm - 986 CM - 502 MM - 313 CM -527 MM -272 A -349 nm - 303 CM -652 mm - 560.5 CM -355 NM -272 UM - 190 um -411 nm -682 MM -152 um -422 MM - 75 cm -853 A - 905 um -693 UM -516 CM -891 cm - 183 cm - 829 NM - 452 cm -524 um - 245 um - 477 NM - 956 A -661 mm - 812 CM -968 MM -406 CM - 883 um - 983 CM -973 um - 348 nm - 299 um -226 mm -186 UM -434 MM -934 NM - 288 NM -263 A -745 MM - 902 cm - 154 CM - 295.5 mm -855 MM - 154 A -860 um -154 NM -218 MM - 438 cm - 252 cm -456 mm - 122 nm - 218 cm -596.5 CM - 197 cm - 6 mm -407 nm -3 um - 217 um -298 CM -337.0 MM -378 A -765 UM - 257 mm - 138 A - 472 MM - 434 mm -31 A - 177 nm -532 cm -995 um -256 mm -181 um -511.0 um -508 um - 813 CM - 162 MM - 983 nm -467 nm - 601 A - 822 nm - 171 cm - 96 cm - 103 CM - 20 UM -237 cm -895 MM - 819 UM -421 A -58.0 NM -309 CM - 867 UM - 232 mm -673.0 mm -631 cm - 575 A -356 nm -926 um - 234 cm - 203 um - 457 MM -978 UM -773 um -377 UM - 324 um -810 NM - 162 mm - 938 A -347 UM - 218 UM - 783 um -896 UM - 237 A - 640.5 cm -560 cm - 414 um - 672 um - 207 UM - 275 CM - 454 CM - 4 MM - 320 CM - 831 MM -837 um -63 NM -526 UM - 262 NM - 963 CM - 205 NM - 797 um - 354 cm - 696.0 mm - 28 UM -735 A -747 NM - 45 A - 818 UM -928 nm - 949 UM - 451 um -602 CM -421 CM -779 A - 153 MM - 72 um - 98 cm - 150 NM -407 NM - 960 UM -501 CM - 652 mm -190 um - 342 mm -831 UM -792 cm -123 um - 143 A -964 NM -482 nm - 534 nm - 208 A -123 UM - 449 UM - 185 NM - 532 cm -549 cm - 208 um - 834 A -568 um -84 cm -172 NM - 111 CM - 927 CM -307 um - 498.0 CM - 87 cm -577 CM -121 MM -298 CM -318 mm - 429 MM - 164 NM -212 nm - 48 mm - 477 NM -291 UM - 328 NM - 819 um -483 nm -187 nm -88 nm - 970 mm - 431 CM - 523 UM - 665 UM -658 nm -916 mm -202 UM -683 um - 726 CM -125 NM - 639 mm - 691 cm -848 um -284 NM -805 MM - 387 UM - 801 MM -216 cm - 741 MM -749 UM - 19 cm - 717 CM -273 MM -565 mm -422 CM - 583 cm - 720 A - 764 MM -534 nm - 472 UM -697 um -866 A - 299 um -860 mm - 355 NM - 577 A -944 NM -775 UM - 682 MM -920 UM -445 um -597 NM - 206.0 nm -648 A - 406 UM - 39 CM -820 A -202 UM - 819 cm -187 um -374.5 CM - 770 MM - 353 nm - 891 cm - 930 A - 265 NM -879 NM -675 cm -766 um - 672 MM - 312.0 MM - 240 A - 403 MM - 937 nm -341 NM -625 A -545 cm -432 um - 111 cm -936 nm -615.5 nm - 351 CM - 724 CM - 14 um -793 MM -219 A -248 mm -47 CM - 170 cm -85 um -237 CM - 59 cm -883 UM - 926 UM - 584 A -69 CM -644 UM - 745 mm - 961.5 mm - 866 mm -188 MM -912 UM -170 UM -203.5 CM - 984.0 CM - 409 nm -190 nm -286 CM -71 CM -117 UM -359 UM - 761.0 cm - 155 MM - 22 cm -716 mm - 51 um -630 mm -202 NM -730 nm -790 MM - 655 UM -613 um - 431 A -205.5 A - 786 nm - 833 NM - 556 MM - 410 CM - 501 cm -496 A -897 A - 418 MM - 664 MM - 877 mm -414 um -618 CM - 577 um -215 UM -448 nm -896.0 mm - 955 mm - 699 UM -973 UM -15 NM - 40 nm - 944 um -17.0 nm - 868 A -266 mm -667 MM -351 NM - 619 MM -625 mm -792 UM - 696 cm - 226 A -103 CM - 89 mm -652 mm -460 UM - 148 CM -948 UM -163 cm -147 NM -919 nm - 283 mm - 90 nm -601 CM - 895 NM -264 MM -434 A - 544 cm - 446 A - 580 CM -670 UM - 772 NM - 524 nm -14 MM - 719 CM -667 um - 848 MM -954 UM -342 CM -395 UM -817 NM - 547 mm - 17 nm -531 UM -294 CM -661 cm -949 um - 657 NM - 716 mm -895 NM - 768 um - 537 mm -766 NM - 395 UM -595 cm - 513 MM - 545 NM - 750.0 um - 914 NM -163 UM - 857.5 MM - 14 nm - 70 nm -764 CM - 55 UM -701 UM - 570 um - 186 um - 287 NM - 504 cm - 110 um -509 CM - 220 um - 390 MM - 595.5 A -960 um -58 A -389 MM -772 mm - 268 mm - 239 um - 737 NM -380 MM - 429 nm -428 cm - 354 nm -806 MM - 697 MM - 176.5 A - 613 nm -479 UM -617 cm - 257 MM -88 nm -897 UM - 434 UM - 322 um -795 mm - 687 um - 565 A -262 A -935 CM - 356 CM -745 nm -74 mm -837 CM -462 UM -874 nm - 247 um - 691 cm -207 cm - 857 CM - 452 cm - 758 um - 678 CM -796 UM - 858 NM -602 UM - 272 um - 355 UM -483 NM -870 UM -449 A -352 CM - 670 mm -799 nm -646 cm - 414 cm - 589 nm -112 nm -65 A -904 A -248 NM - 648 NM - 950 UM - 717 UM -895 nm - 526 nm -606 UM -354 um - 476.5 cm - 360 A -45 nm -309 NM -782 um -83 nm -546 cm - 325 mm - 131 A - 742 UM - 265.0 UM - 243 MM -941 nm -839 um - 433 MM -526 nm -331 um -115 mm -848 mm - 329 NM -109 cm -383 mm -911 MM - 737 um -811 um -860 cm -502 um - 361 cm -739 MM - 535 NM -724 nm -782 UM -972 UM - 258 NM -382 CM -871 cm -152 NM - 118 UM - 230 NM -716 CM -769 mm - 505 CM -921 cm -79 UM - 209 nm -662 NM -340 CM -237 CM -646 MM - 610 UM -706 A -467 cm -39 cm -151.0 A - 368 CM -562 UM - 534 CM - 44 nm -559 nm -941 MM -226 UM - 95 cm -665 NM - 713 MM - 141 CM -72 CM -905 MM - 630 mm - 349 NM -714 A - 727 MM - 485 CM -476 CM - 878 nm -422 CM -210 UM -112 UM - 193 um -730 A - 534 cm - 130 cm -380 NM -607 NM -435 CM -601 mm -962 A - 535 nm - 857 cm -465 NM - 132 mm - 242 nm - 776 MM - 335 CM - 54 mm -824 nm -296 cm - 892.0 A - 310 mm -861 A - 482 cm - 916 um -253 mm - 47 mm - 853 CM - 433 A - 521 um - 433.5 nm - 70 nm -798 MM -258 mm - 293 mm -496 nm -191 NM -518 NM - 166 A - 60 cm -183 NM -853 MM -606 UM - 457 NM - 229 UM - 508 CM - 656 MM -408 um - 110 UM - 38 nm -914.5 mm -524 MM - 831 um - 535 CM -583 um - 608 A -281 um -916 MM - 107 MM - 690 um - 770 um - 160.5 MM - 239 nm - 476.5 MM -603 A -297 um -56.5 MM - 910 NM -305 um -882 um -508 A -853 CM - 123 mm - 618 NM -286 A - 484 NM -501 MM -226 cm - 718 MM - 938 A - 767 UM -790 NM -104 um - 671 NM -504 nm - 595 A -603 cm - 826 nm -100 UM - 221 A -628 NM - 232 MM -73 CM - 578 MM - 689 A -896 cm -404 NM - 838 CM -458 cm -495 A - 82 A -701 nm - 408 nm - 9 MM - 574 MM -134 mm -579 NM - 631 NM - 124 um - 889 NM -37 A - 27 NM -709 nm -901 mm - 495 A - 698 UM - 773 cm - 861 mm - 574 nm -717 mm - 820 MM -622 MM -271 CM -454 A - 221 cm -226 nm - 187 cm -990 UM - 487 nm -382 NM - 762 nm - 396 cm - 593 UM -435 um - 155 cm -67 nm -894 cm - 69 UM -837 MM - 128 A -976 MM - 623.5 um - 78 UM - 772.5 NM -788 A -700.0 cm -969 nm - 188 cm -509 nm - 928 nm -901 MM - 480 UM - 32 nm - 277 nm - 147 A -986 A -444.0 mm -732 um - 150 um -350 UM -661 NM -966 um -339 mm -971 um -356 cm - 227 A -583 nm -881 UM - 858 UM -312 A -42 cm - 14 nm - 270 CM -43 mm -40 nm - 430 nm -239 um -499 nm -457 nm - 65 NM - 900.5 MM - 793 UM - 175 nm -404 NM - 232 A - 924 um -120 um -204 NM - 928 um - 669 mm - 229 UM -451 CM - 259 cm -738 UM -289 CM -674 nm -657 UM - 598 mm -526 nm - 637 UM - 848 UM - 840 CM -939 UM -178 MM -352 cm -181 UM - 124 A - 309 A - 94 UM - 189 cm - 154 NM -225.5 NM -260.0 A - 280 NM - 825 MM - 30 um - 55 NM - 502 nm - 502 CM - 421 MM -683 CM - 166 mm - 681 CM - 870.0 A - 411 MM - 380 A -790 mm - 839 cm - 79 nm - 252 CM - 693 mm - 750 UM -802 nm -622 UM - 163 nm - 508 cm - 422 MM - 255 CM - 318 um -312 cm - 217 A -98 um - 31 mm - 133 um - 474 cm - 706 cm -130 nm - 212 mm -22 CM -690 CM -493 nm - 382 UM - 153 UM - 148 NM -22 mm -94 CM - 182 MM - 825 NM - 673 mm -521.0 NM - 948 mm - 631 cm - 78 mm -343 UM -479 cm - 891 cm - 327 UM -517 mm -569 um -597 MM - 560 A - 816 cm - 658 mm -734 UM - 981 NM -472 CM - 703 um -810 A - 920 mm -904 nm -270 nm -260 nm -940 UM - 855 cm - 355.5 CM - 379 nm -462 mm -198 mm - 799 MM -877 UM - 627 CM - 612 MM -988 UM -256 um -199 CM - 970 CM - 786 CM -716 NM - 532 NM -80 MM - 695 MM - 358 mm - 927 mm - 336 NM - 317 CM -612 CM - 737 NM - 662 cm - 865 UM -510 CM - 946 cm - 75 nm -361 UM -939 UM - 153 nm - 167 A - 186 CM - 155 mm -486 CM - 123 cm - 979 A - 142 cm - 385.0 mm -227 MM -838 nm -783 cm - 86 UM - 60.5 cm - 175 mm - 389 cm - 968 A - 790 mm -999 A -329 UM -511 MM - 563 UM - 455 CM -288 CM -543 cm -714 mm - 940 cm - 46 CM - 983 mm - 178 cm - 7 UM - 932 A - 908 cm - 545 CM -846 cm -11 UM - 929 um -270 NM - 142 um - 649 A - 829 A - 63 nm - 774 A -281 mm -203 um -628 cm - 144 nm - 463 A - 62 UM - 638 mm -9 um - 218 mm -370 A -779 mm - 748 cm -929.0 um - 740 mm - 68 A -178 A -169 NM - 414 mm - 586 NM - 882 UM -228 NM - 756 CM - 903 UM -839 UM - 352 cm - 827 mm -331 cm - 521.0 CM - 64 um - 125 cm - 562 mm -159 um -532 A -529 UM -313 cm - 341 CM -477 um -214.5 MM -655 cm -160 A -780 cm - 820 CM - 797 CM -496 nm -23 CM -182 nm -735 um - 452 MM - 808 UM -78 nm - 8 A -994 MM -187 A - 483 um -932 mm - 793 UM - 546 cm -350 cm -224 cm - 243 CM - 528 cm -379 NM -918 CM - 811 NM -853 um - 663 cm -428 mm - 640 A -22 MM -337 CM - 925 CM - 653 MM - 704 CM -341 mm - 494 um - 762 mm -874 cm - 632 NM -9 mm - 364 UM -47.5 NM - 866 mm -74 UM - 571 NM - 121 A -143 NM - 376 um - 646 MM - 289 NM -541 A - 74 NM -813 nm -371 um -427 mm -644 UM -333 NM - 442 mm -208 NM - 732 NM - 335.0 cm - 665 nm -583 mm -770 MM - 706 A -317 CM -402 NM - 313 CM -255 mm - 270 UM -92 mm -58 mm -441 A - 200 mm -117 MM - 983 cm - 304 A - 118 CM -444 A -733 cm -83 MM -768 mm -296 UM -751 mm - 449 UM - 357 mm -853 cm -32 nm - 373 mm -93 UM - 982 UM -340 um - 283 mm -829 MM -730 mm - 555 nm - 187 MM -460 CM - 837 CM - 704.5 UM -597 A - 37 UM -180 mm -970.0 um -249.0 um -149 A -769.0 MM -902 UM -209 CM -663 A - 633 um -675 um - 606 UM -62 CM -612 UM - 501 A -355 CM - 320 UM - 788 um -91 A - 108 NM -776 cm - 56 MM - 341 um -177 um -156 um - 864 A - 502 nm - 947 um -770.5 NM - 437 CM - 123 nm -500 um - 821 MM -469 um -5 A - 463.0 A -749 CM - 640 cm - 671 nm - 212 nm -688 cm -221 CM -144 cm -457 NM -716 mm -265 UM - 809 um - 963 nm - 893 nm -888 NM -757 um - 897 NM -339 mm - 955 A - 179 um -285 MM - 44 A - 429 UM -525 cm - 257 UM - 456 nm -64 NM -136 mm -78 A -278 cm -497 um -662 cm - 957.0 cm -597 mm -591 UM -942 cm -103.5 mm - 435 cm -708 UM -465 nm -229 mm -478 CM - 56 mm - 190 A -713 MM -601 um - 995 MM -881 um -995 MM -687 cm -421 NM - 28 MM - 221 A - 228 A - 767 CM -656 UM - 511 mm -916 MM - 120 UM - 949 A -75 mm -40 um - 859 A - 919 A - 454 mm -137.5 cm - 405.0 mm -950 um -1000 UM - 753 mm - 856 A - 372 mm - 733 nm - 923 MM -528 cm - 162 NM - 242.0 cm - 904 A - 524.5 cm -254 um - 555 NM -790 NM - 638 A - 945 nm - 903 nm -758 cm -17 nm - 579 UM -383 A -989 UM -251 A - 263 NM - 275 MM - 597.5 UM -11 CM -440 nm - 470 mm -485 CM - 847 mm - 809 um - 833 A - 508 mm - 652 UM -891 CM -241 NM - 429 MM - 40.0 MM -245.5 mm - 505 mm - 606 mm -362 mm - 606 A -645 A - 455 UM -167 UM -553 cm - 449 A -506 mm -309 mm -649 mm - 11 um -359 CM - 915 CM -358 um -136 MM - 300 MM - 666 nm -118 MM -199 mm -735 um - 8 NM -876 NM - 62 CM -795 MM - 638 NM -863 cm -429 CM - 742 cm - 619 mm - 925 cm -975 A - 242 MM - 718 NM -290 mm - 297 um - 890 CM -313 um - 339 nm -289 NM - 86 NM - 288 UM - 203 mm - 170 A -906 NM -996 nm -567 NM -918 A -900 NM - 513 CM -225 CM -127 A -263 mm -797 nm -693 MM -141 NM - 726 cm - 185 um -878 um -230.5 CM - 683 NM -475 um -780 mm - 86 nm -820.5 nm -674.0 MM -825 CM - 320 CM -407 nm - 902 NM -567 UM -815 UM - 383 nm - 190 um - 186 CM - 676 UM -151 CM -756 A -854 um -857 nm - 717.0 NM -722 CM -660 MM - 390 CM -798 cm - 337 A - 539 CM -988 mm - 392 MM - 256 cm - 31 mm - 975 MM -89 cm - 42.0 cm -413 UM -246 um -218 cm - 454 MM -369 UM -23 um - 106.5 nm -724 MM - 193 um - 588 MM -550 cm -775 um - 252 cm -377.0 A -297 nm - 312 nm -1000 MM - 877 cm - 74 MM - 246 nm -879 A -781 CM - 689 MM -395 MM - 582 MM -395 MM -671 CM - 455 CM -155 cm - 259 CM - 284 mm -83 um -429 nm -254 nm -463 mm - 582 MM - 661 nm -972 NM -1000 um - 821 UM -767.0 CM - 390 A - 159 nm - 617 UM -564 MM - 853 um -350 cm - 244 mm - 470 MM - 334 MM - 783 um - 114 cm -992 cm - 946 um - 32 mm -835 mm -459 CM - 339 nm -548 nm - 129 mm -843 A - 209 nm - 191 nm -486 A - 502 mm -635 mm -572 A -732 MM -517 cm - 200 cm -752 nm - 331 mm - 374 cm - 969 MM - 408 MM -704 cm -522 CM - 807.0 NM -642 UM -869 cm - 527 um -588 NM -190 nm - 525 NM -908 nm -939 cm -992 cm - 926 um -969 CM - 981 CM - 733 mm -746 um -817 mm - 346 um -627 nm -456 MM -808 um -375 CM - 627 cm -475 NM - 150 CM - 439 nm - 391 CM -569 CM -638 cm -921 mm - 38 A - 151 mm - 673 UM -294 um - 164 nm - 642 A -557 UM -326 nm -777 UM -196 CM - 217 cm -700 um - 697 CM -250 UM -130 UM -266 CM - 89 NM - 397 NM - 839 um -871 A -574 A - 102 nm -14 nm -273 nm -401 um - 313 mm -552 MM -904 CM - 61 nm - 605 um -509 CM - 248 CM -669 nm - 276 A - 929 um - 429 UM -437 A -136 NM -571 nm -691 um - 396 cm -736 MM -486 NM -433 CM -551.0 NM -219 UM - 255 NM - 327 NM - 470 NM - 778 mm -697 nm -116 um - 697 mm - 700 mm - 769 MM - 457 A -761 MM -808 um -569 NM -650 UM - 933 A - 904 nm - 220 MM -272 nm - 31 NM - 494 mm -138 UM -349 CM -438 A - 75 mm -371 MM -613 um -110 nm -170 cm - 540 A - 630 NM - 338 mm -132 CM -711.0 CM - 434 nm -113 A -832 cm -692 UM -176 MM -246 NM - 309.5 cm -894.0 MM -957 MM - 926 A - 365 UM -207 um -970 cm - 18 MM -91 CM -890 mm -573 nm - 837 CM - 674 um - 228 A -774 NM - 485 nm -982 mm -45 MM -341 um -717 um -484 MM - 926 cm - 243.5 CM - 742 NM -843 UM -823.5 UM - 491 cm - 406 UM -137 um - 217 NM -842 UM - 377 mm - 754 A -917.0 NM - 560 cm - 771 nm - 956 NM - 265 nm -6 CM -563 cm - 528 um -784 mm - 14 A -721 CM - 691 CM -451 cm -559 mm -890 CM -856.5 nm -726 nm -325 nm - 244 MM - 737 nm - 950.0 NM - 836 CM - 968 nm -455 CM - 404 A - 56 NM -25 mm - 244 um - 282 CM -806 cm -550 CM -362 cm - 237 CM - 801 UM - 825 um -94 CM - 891 cm -519 A - 279 A -951 A -754 A -12 nm -174 A - 424 nm -621 um -654 MM -409 um - 984 CM -360 UM - 905 mm -881 UM -234 NM - 106 A -193 MM -427 CM -821 cm - 56 um -495 CM - 393 NM -155 UM -520 nm -987 nm -220 mm -938 NM -925 nm -488 um -448 cm -935 cm -231 nm -970 A - 671 MM -151 CM -656 NM -257 UM -136 cm -648 cm - 563 CM - 381 um - 37 nm -7 um - 98 NM - 400 UM - 409 UM -154 CM - 121.5 A - 573 UM -50.5 NM -500 NM -365.0 MM -938 NM -817 cm - 916 CM - 86 nm - 8 um - 737 MM -110 mm -545.0 mm - 165 CM -977 mm -819 MM - 999 cm -76 A -702 nm - 190 A -768 mm - 976 cm - 249 um - 428 MM -192 MM - 816 cm - 817 CM - 791 cm -582 A - 659 um -639 MM -65 A - 401 UM - 146 MM -512 mm -541 mm -638 CM - 439 um - 401 nm -135 mm - 766 UM - 315 nm - 622.0 A -588 UM - 970 cm - 68 cm -356 CM - 929 A - 805 cm - 782 NM - 836 nm -238 CM - 109 nm -166 MM - 386 nm -490 MM -486 nm -812 CM - 834 nm - 965 MM -864 UM - 344 NM -370 nm - 327 CM - 929 NM -891 A -783 um -342 CM -427 um - 237.5 MM -935 A - 360 um - 811 CM -245 MM -294 UM -499 cm - 424 MM -714 CM -232 CM -563 cm -7.5 cm -827 um -450 mm -698 mm -601 MM - 90 NM -269 MM -906 CM - 390 UM -403 um -130 CM -82 cm -578 mm - 356 CM - 546 CM -251 nm -513 A - 512 nm - 238 CM - 92 cm - 41 cm -947 nm -544 A -796 nm -423 NM - 119 UM -570 nm -445 cm -295 A - 775 cm -237 NM - 508 UM -924 mm - 902 NM - 761 nm - 563 CM -317 UM - 57 mm -534 um -216 mm -124 cm -159 NM -234 UM -478 NM - 926 CM -444 nm -778 mm - 124 cm - 474 A -527 mm -543 MM -538 mm - 386 nm - 797 um - 676 UM -787 UM -713 MM -922 nm -427 A - 855 cm - 669 um -259 cm -324 mm -75 NM - 819 nm -581 um -67.5 CM -566 um -530 mm - 929 NM - 795.5 cm -838 nm -425 MM -3 nm -153 CM -901 A - 347 UM - 932 NM -510 nm - 203 MM -864 CM -664 MM -993 MM -485 cm -117 nm -51 mm -883 MM - 884 um -572 UM - 411 UM -215 MM - 860 CM - 708 nm - 699 mm -226 MM -181.0 cm - 788 MM - 664 A - 559.5 nm - 212 CM -273 CM - 309 MM -512 A -624 nm -557 UM - 276 MM - 182 cm - 612 mm - 51 cm - 640 mm -771 A - 796 mm - 655 MM - 810 nm - 568 nm - 86 nm -76 um - 933.0 MM - 202 A - 952 MM -617 cm -287 NM - 426 nm - 239 um -315 A -413.0 nm - 252 um -312 A -318 UM - 171.5 um - 789 A - 264 NM - 775 NM - 464 MM -790 um - 466 NM -278 A - 191 UM -291 CM - 193 CM - 915 cm -730 nm -787 A - 829 NM -154 A -149 cm - 733 CM - 387 A -690 CM - 988 A - 679 CM - 95 MM - 751 nm -894 CM - 320 A - 137 mm - 245 mm -306 cm - 203 um - 170 cm - 915 UM -253 MM - 929 NM - 841.0 A - 696 nm - 670 cm -103 MM - 59 MM - 738 NM -186 mm -540 cm - 338 um -43 NM -380 mm -479 mm - 449 CM - 157 nm - 591 A - 723 A - 580 UM -404 NM -708 A - 205 A -472 mm - 1000 UM -609 NM - 139 NM - 479 mm - 62 UM - 786 nm -626 MM -666 A -814 CM -814.5 A - 485 mm - 618 NM -633 cm -409 CM -866 NM - 230 um -892 UM - 405.5 cm - 95 A -954 mm - 819 um -533 um - 858 um - 116 CM -380 UM -369 NM - 472 MM - 504 um - 566 nm - 265 UM - 813 mm - 36 MM - 664 mm -217 cm -146 NM -117 mm - 90 um - 798 A -271.5 mm -374 A - 384 cm - 162 cm -287 nm - 225.5 NM - 933 mm - 106 CM -518 cm -232 um - 438 MM - 329 NM -680.0 um - 470 MM - 161 mm - 815 cm - 815 nm - 805 cm -42 MM -314 cm -800 MM - 506 UM -142 UM - 270 mm - 720 um -666 A -318 um -558 CM - 229 um - 244 UM -8 UM - 91 UM -569 cm -533 CM -474 cm -119 UM - 283 MM -210 cm - 553 mm - 773 cm -978 NM - 234 nm -293 A -136 nm - 540 A - 926 NM -509 MM - 749 um - 435 UM - 389 MM -927 A -525 MM -530 UM - 553 CM - 846 NM - 659 mm - 104 cm -196 cm - 327 A - 62 MM -68 UM -62 um -332 nm -71 um -945 A -798 UM - 950.5 MM -126 NM - 874 nm - 817 A -992 um - 24 UM - 281.5 CM - 817 um -868 A - 500 NM - 203 mm - 555 A - 99 NM - 137 nm -231 nm - 828 CM - 142 NM -988 nm - 625 A - 338 cm - 850 cm -28 cm -830 cm - 321 cm -634 mm -503 mm -875 um -366 nm - 624 NM - 127 NM - 87 CM - 799 mm - 638 CM -784.0 mm - 104 mm - 234 MM -403 um - 208 um - 144 A - 441 A - 624 um -1000 mm -287 UM -784 A -161 mm - 595.5 A -426 NM -916 mm -957 um -888 UM - 961 cm - 775 NM -739 nm -796 um - 329 CM -153 cm -87 nm -15 um -229 UM - 328 CM - 565 nm -58 nm -471 MM -505 A -926 um - 807 A - 700 nm -986 A -453 NM -567 nm -58 CM - 862.5 NM -770 cm - 852 um - 98 CM -139 MM - 468 UM - 664 CM - 979 cm -391 cm - 994 UM -710 mm - 518 A -786 MM -559 nm -102 mm - 565 MM - 23 MM - 945 cm -909 UM -748 A - 801 cm - 932 cm - 400 nm - 11 UM - 792 um - 793 NM -697 nm -955 um -767 UM -295 CM - 293 nm - 299 nm -290 UM -805 mm - 297 MM - 918 A - 209 CM - 294 cm - 510 nm -734 um -343 nm -148 mm - 787 nm -896 nm -20 A - 246 UM - 262 MM - 788 UM -224 mm -513 CM - 761 MM - 459 cm - 599 CM - 307 um -486 NM - 132 um -363 mm -950 cm -548.5 CM -716.5 UM - 727 MM -673 A -938 NM - 58 mm - 117 A -630 um - 956.5 MM -361 cm -583 UM -546 NM -762 NM -15 NM - 732 cm -749 nm - 857 mm - 289 NM -1 NM - 779 NM -626 UM -165 nm -912 CM -972 cm - 275 MM - 2 MM - 608 um - 53 NM -665 CM -255 um - 276 cm - 806 A - 130 cm - 749 um -162 MM -585 UM -312 MM - 444 NM - 625 um - 178 um - 239 UM -638 MM -401 A - 416 mm - 488 um -91 nm -937 um -485 MM -253 um - 136 NM - 862 um - 309 MM - 838 um - 582 um - 632 mm - 852 um -995 NM - 19 CM -717 nm -353 UM -742 NM -927 nm - 806 UM -755 NM - 106 A -110 nm -675 cm - 242 um - 326 um - 727 UM - 786 NM -84 A -359 MM - 45 nm -435 MM - 567 cm -906 cm - 626 NM - 941 A - 984 um -275 CM - 560 MM - 986 NM -558 um -230 UM -883 MM - 358 MM - 208 UM - 887 CM - 980 A -838 MM -75 nm -836 UM -577 mm - 41 A -803 nm - 155 cm - 885 um -859 CM -383 UM - 557 CM -281 UM - 764 mm -127 nm -972 UM - 28 CM -249 UM -664 MM - 838 mm - 794 NM - 773 mm -750 NM -656 mm - 899 CM - 289 mm - 682.0 MM -81 CM -378 MM -194 MM - 179 mm - 255 UM -976 CM - 565 NM -983 A - 26 um -574 NM - 839 MM -445 NM -286 NM -961 UM -22 cm -792 nm -835 NM -521 A -596 NM - 645 MM - 133 NM -586 MM -687 A - 772 A -23 A - 5 cm - 473 nm - 487 UM - 916 cm - 184 CM - 375 CM - 724 CM - 974 UM - 427 UM - 490 CM - 68 mm -832 um -588 mm -566 A - 517 UM - 789 MM -283 CM - 663 um - 28 A -707 A -357 nm -587 um -632 um -534 MM -845 NM -994 MM - 841 nm - 43 A -285 CM -609 NM - 423 A -125 cm - 967.5 mm -958 A -977 UM - 138 MM -481 cm -863.0 um -829 UM - 523 A -138 mm -987 UM -527 mm -540 nm - 631 NM -140 cm - 543 cm - 307 NM - 870 cm - 930 nm -206 A - 156 cm - 629 CM - 388 cm -964.5 NM - 623 CM - 921 CM - 580 cm -80 nm - 19 UM -138 CM -461 UM - 779 cm - 266 UM - 949 CM - 741 MM -418 cm - 790 nm -549 CM - 92 UM -752 A -122.0 nm -932 CM -14 mm -559 cm -924 mm -852 UM - 92 um -713 A - 935 nm -44 um -2 um - 848 cm -210 A - 452 CM - 315 um - 436 cm -838 nm - 442 mm - 844 MM - 363 cm - 167 nm -7 mm -278 UM - 833 NM -586 CM - 899 nm -416 um -856 MM -72 A - 852 um - 858 MM -784 mm - 971 NM -348 NM - 83 nm -315 NM - 42.5 A -595 UM -305 cm - 531 NM - 668 NM -606 mm -475 nm -410 cm -491 mm -828 NM -348 A - 797 nm - 763 um - 404 nm -512 A - 615 MM -601 mm -277 cm -902 CM -494 UM - 267 CM -385 UM - 765 cm - 566 MM -223 CM -526 cm -172 MM - 755 mm - 236.0 MM - 971 cm -756 A - 207 mm - 952 MM - 550 mm -305 NM -856 CM - 514 UM - 311 UM -823.5 cm - 669.0 MM -433 um - 627 cm - 848 CM - 890 mm -148 um - 154 UM - 903 mm - 456 CM - 914 nm - 806 A - 887 um - 662 UM -671 nm - 325 NM - 494 cm - 613 MM - 169 mm -240 cm -964 MM - 103 MM -248 MM - 798 UM -484 MM - 895 A -396 MM - 986 A - 38 NM - 254 nm - 868 CM -548 MM -613 UM - 316 mm -815 UM - 553 CM - 933.0 UM -908 MM -52 MM -797 cm - 200 nm -134 NM -425 A -532 NM - 634 A - 514 A - 655 A -600 cm -147 nm - 198.0 UM - 915 um - 191 MM -534.5 um -281 nm -284 mm -524 A -914 nm - 146 cm - 580 cm -190 nm - 256 MM -415 mm - 224 nm - 222 mm - 851 um -293 nm - 400 cm -958 NM - 721 um - 843 NM - 418 NM -134 MM -208 A -608 mm -454 mm -844 NM -83 cm -478 MM - 597 A -540 mm - 109 A -753 cm - 406 mm -388 A -196 CM -218 um - 494.5 mm -518 A -231 cm - 173 MM - 518.5 MM - 108 cm - 252 MM - 449 CM -923 UM - 785 um -354 UM -706 NM -255 MM -11 NM - 91 CM - 513 nm -726 NM - 74 nm - 487 MM - 671 NM -775 NM -817 mm - 996 um -369 CM -38 A - 25 CM -385 mm - 97 um - 485 UM -932 MM - 628 CM - 875 NM -990 nm - 555 mm -660 NM -208 CM -258 mm - 200 MM -715 nm -429 mm -103 CM - 786 nm -118 MM -637.5 NM -983 CM - 493 CM -518 CM - 734 nm -934 mm - 754 CM - 289 mm -167 um - 338 mm - 13 nm - 290 A -438 A -536 A -965 mm - 167 UM -550 CM -55 cm - 965 nm -505 A - 690 um - 617 mm - 579 nm - 41 UM - 832 A - 82 CM - 170 mm -287 cm -302 UM -555 A -279.5 A -119.0 nm - 352 um -89 MM - 319 nm -593 A - 980 CM -615 cm -283 um - 883 CM - 79 MM - 958 mm -384 um -740 UM -111 um - 80 nm -459 MM -732 um -626 A -145 um -302 MM -280 NM - 391 cm - 489 cm - 584 A -589 CM - 870 cm -384 MM -221.0 NM - 870 nm - 583 CM -898 A -509 UM - 56 cm - 732 NM -313 A -352 MM - 515 mm - 883 um -958 NM - 989.0 A - 527 nm -967 NM - 784 UM -879 cm - 647 mm -957 nm -607 NM -797 nm -567 A - 223.0 CM -390 mm - 908 MM - 339 A -968 cm - 831 um -284 UM - 867 um -278 UM - 108 A -691 UM - 822 cm -786 CM - 960 CM -594 um -893 CM - 314 A -441 NM -168 nm -574 CM - 385 A - 756 A -505 MM - 664 MM -124 um -645 NM -798 nm -152 CM -793 nm -407 MM -696 MM -785 MM - 746 UM -624 NM -835.5 A -539 MM -509 cm -754 cm -312 cm -562 nm - 563 um - 163 CM - 467 UM -731 A -65 UM - 684 A - 467 um - 644 mm -589 UM - 411 mm - 411 um -796 mm - 974 cm -231 mm - 224.0 CM -772 CM -275 MM -306 UM -677 mm -282 mm - 199 um -845 A - 699.5 A - 24 MM -885.5 nm - 125 A - 921 CM -250 um - 27 NM - 518 um - 661 A -661 mm - 944 A -701 MM -675 mm - 405 A -913 cm -652 NM - 563 CM - 246 A -797 MM - 302 UM - 150 nm - 265 nm - 543 mm -961 MM -162 NM -139 UM - 30 NM - 131 cm -198 cm - 580 mm -150 CM - 675 cm - 66.5 NM - 640 UM -573 CM -224 NM - 963 cm -616 NM - 589 NM -899 UM - 861 MM -760 um - 594 CM -460 NM - 61 um - 862 cm -394 um -718 cm -547 NM -143 nm - 975 A - 93 A -149 MM - 744 nm - 750 um -750 cm - 451 nm - 186.5 UM -517 mm -328 mm - 233 CM - 611 UM -560 CM -168 NM -597 nm - 427 UM -770.5 mm - 226 cm -745 NM -436 A -973 mm - 53 CM - 801 A -318 cm -32 CM -213 um - 611 cm - 361 NM -667 nm - 312 A -48 UM - 591 A - 891 mm - 86 nm - 292 nm -926 cm - 693 um -346 cm - 891 MM - 868 nm - 45 NM -399 A - 301 nm -871 UM -349 CM -62 mm -651 NM - 594 mm -922 UM - 356 nm - 801 UM -363 cm -603 A -762 mm -257.5 nm -778 UM -94 nm -914 MM - 886 CM - 565 nm -32 MM - 739 nm -674 um - 90 um -709 MM -263 NM - 800 um - 563 cm -988 mm -3 MM - 454 nm - 2 CM - 795 cm -795 cm - 344 UM -83 A -329 nm -234 um - 740 NM -569 NM - 270 NM -684 A -708 cm - 315 cm - 377 NM - 405 nm - 565 CM - 259 UM - 69 MM - 574.0 um -655 NM -614 um - 931 nm - 975 A -353 A - 720 mm -161 nm - 970 CM -460 cm -256.0 A - 833 NM -864 cm - 890 cm -76 CM -515 MM -184 CM - 131 CM - 433 cm - 57 NM - 52 UM - 372 UM - 443 UM -252 MM - 579 A -155 um -170 CM - 859 UM - 887 mm - 809 mm -277 MM - 902 A -260 MM -89 CM -921 mm - 512 um - 139 mm - 751 nm - 276 NM -999 um -602 nm -259 UM -732 nm -788 nm - 110 NM -331.0 MM -903 cm - 842 CM - 572 um -672 NM - 935 NM - 180 mm -194 cm - 15 um - 149 MM -855 CM -640 MM - 630 cm -175 mm -633 mm -868 A - 863 nm - 30 um -44 A - 130 NM -820 UM -373 um - 165 cm - 377 mm - 474 mm -449 cm - 602 nm - 673 nm - 341 nm -969 MM - 774 mm -238 nm - 541 A -154 cm -27 NM - 965 mm -834 A - 735 CM - 614 um -523 NM - 722 nm - 685 NM -205 nm -701 cm - 332 UM -242.0 NM - 518 nm - 581 A - 694 um - 227 cm - 732 mm -608 nm - 988 CM -174 um - 836 cm -967 UM -580 cm - 241 A - 568 NM - 15 cm - 445 UM - 998 UM -764 cm -598 MM - 320 CM -961 um - 47 A - 475 MM -991 mm -948 NM -269 CM - 431 MM -650 UM - 254 A -699 nm - 292 CM -813 CM - 973.5 cm - 418 UM -193 MM -391 CM - 392 A -107 A -217 mm - 674 UM -822 CM -97 MM - 574 CM -256 CM - 815 mm -692 nm - 128 mm - 295 CM - 275 UM -607 MM - 384 cm -32 UM - 80 NM - 827 mm -620 CM - 552 um -862 nm - 896 cm - 271 mm - 871 nm - 291 cm - 881 um -821 um -267 CM - 175 um -394 MM -270 nm - 178 nm - 157 um -764 cm -181 CM - 198 cm - 920 UM - 239 mm - 403 nm - 493 A - 472 MM - 259 nm -492 um - 773 MM - 445 cm - 490 UM - 374 um - 260 A -351 CM - 495 NM - 57 CM -342 nm - 875 mm -505 um - 801 UM - 474 A - 320 A -757 MM -186.0 MM - 96 CM -973 CM - 171 NM - 232 um -96 NM - 202 NM -640 A - 909 mm -337 um -456 CM - 81 nm -376 NM -632 um -945 mm - 557 um - 492 um -390 CM -335 um - 70 nm -530 cm - 729 NM - 836 MM -206 A -70 nm -355 mm -219 CM -935 mm - 303 MM - 646 cm -154 NM - 936 um -776 um -391 nm -77 um -164 nm -103 mm - 772 NM - 142 CM - 627 NM - 221 cm - 197 UM - 215 CM -598 CM - 266 nm -869 MM -473 UM -920.5 um -746 MM -929 um - 555.0 NM -681 UM - 737 MM - 721 mm -81 nm - 508 MM - 754 UM - 855 UM - 944 CM -571 mm - 64 UM - 272 nm - 418 cm -904 nm - 91 CM -847 MM - 50 UM -374 CM -437 nm - 240 A -519 NM - 137 MM - 25 mm -501 nm -798 MM -596 cm - 582 UM - 453 um -250 um -449 cm - 855 CM -964.0 MM - 760 NM -137 NM - 322 cm -701 cm -822 um - 539 A - 212 mm - 96 NM -303 mm -262 UM -661 nm -902 A - 638 NM - 796 um -11 mm - 592 NM -737 nm -986 um -961.5 CM -283 nm -718 mm -209 NM -439 UM -356 A -171 MM - 161 NM -976.5 CM - 732 um - 927 CM -273 NM -28 A - 682 mm - 114 A - 770 NM - 433 NM - 577 mm -614 UM -251 A -851 cm -996 nm -144 um -589 A - 399 NM -741 MM - 971 um - 884 UM -359.0 mm - 105 NM - 392 CM -415 cm -410 MM -911 nm - 361 CM -806 UM -722 UM - 818 nm - 966 nm -876 CM -327 nm -818 cm -860 UM - 490 cm -790 mm -624 CM - 120 cm -928 cm - 810 mm -61 NM - 207 um - 363 A - 62 CM - 440 mm -40 um -837 mm - 412 mm -659 UM - 603 nm -703 um - 419 mm -44 A - 958 cm -342 UM - 269 um -380 UM - 420 MM - 849 um - 836 cm -168 cm - 787 um - 517 CM - 630 MM - 690 mm - 269 nm -491 UM -291 NM - 935 MM -335 mm -180 MM - 592 CM -894 NM -534 CM -564 cm -284 UM - 655 nm -973 mm -940 cm -219 UM - 587 MM - 236 MM -188 um -204 um -999 A - 281 NM - 926 A - 746 um - 370 CM - 493.5 UM -130 um - 292 MM - 255 mm -843 A - 722 nm -570 cm -482 CM - 388 cm - 460 MM - 481 NM - 941 UM - 627 um - 366 cm -497.5 NM - 69 A - 344 nm -527 A - 996 mm -135 nm - 579 A - 558 CM - 399 cm -751 NM - 133 um - 713 cm -479 UM - 201 UM -224 NM -654 um -995 um - 202 UM -478 cm - 163 NM -331 um - 558 A -739.5 cm -843 UM -902.5 NM - 450 um -698 um - 799 nm -242 mm -497 NM -551 NM - 459 nm -196 A -842 um - 209 nm -302 nm - 318 nm -214 MM - 891 A -498 UM - 893 CM - 689 um -727 cm -759 NM - 466 A - 606 UM -600 NM - 626 MM - 646 A - 303 cm - 233 mm -153 mm -771.5 A - 699 mm -414 nm - 836.0 cm - 292 A -723 UM -970 cm - 214 cm - 848 CM -504 NM - 63 nm - 496 NM -535 UM -94 MM -392 UM -575 CM -976 UM -159 A - 551 MM - 761 um - 882 MM - 319 UM - 429 mm -39 nm - 734 CM - 742 nm - 147 mm - 410 nm - 43 nm -259 UM -55 UM -260 mm -69 UM - 233 MM -799 um -96 um -86 um - 529 cm -389 A -519 nm -586 A -645 um - 840 NM -643 NM -2 CM - 242 cm - 872 A -625 CM -392 MM -879 CM -348 MM - 197 UM -882 nm -782 CM -349 mm - 753 mm - 388 MM -1 UM - 980 nm -794 cm -150 NM -234 cm -430 NM -26 um - 515 A - 181 MM -559 MM -421 nm - 200 nm -163 MM -989 CM - 452 CM -592 A -830 CM - 20 CM -213 um - 9.5 um - 790 cm - 910 nm - 977 UM - 640 MM -424 cm -601 MM - 966 nm -213 nm -989 MM -116 um -187 um -912 mm -819 MM - 757 UM -121 nm -517 cm -463 um -784 UM - 66.0 NM -176 MM -525 A -737 nm - 585 mm - 993.0 CM -377.0 NM -263 A - 873 um -156 A -437 cm -927 MM -180 CM -457 cm - 308 mm -98 UM -770 A - 896 mm - 788 um - 730 cm - 482 A - 713 um -49 MM -659 NM -515 A -558 CM - 847 CM -166 um - 350 um - 311 cm - 977 mm -785 mm - 363 mm -666 mm - 916 CM - 344 cm -614 MM - 209 cm -540 nm - 422 nm - 994 mm -123 mm -836 A - 776 A - 115 cm - 93 MM -854 um - 228.5 nm - 205 um -957 cm - 875.0 nm - 997 UM - 187 NM - 596 MM - 766 um -759 nm - 557 UM - 920 A -67 MM - 437 CM - 100 nm -707 NM - 276 CM - 481 nm -729 CM -140 CM - 723 cm -40 MM -117 A - 848 NM -587 nm -131 um -288 cm - 574.0 NM -216 um -73 mm -650 MM - 492 nm - 391 cm - 449 CM -926 UM -669 CM - 105 A -797 nm - 604 MM - 405 mm -81 um -386 UM - 9 nm -655 mm -94 A -641 nm - 66 cm - 666 MM - 221.5 NM - 177 mm - 592 MM -559 nm -978 um - 166 NM -286 UM -221 um - 906 NM -381 CM -432 MM -42 nm - 249 NM -863 CM -367 UM -219.5 mm -226 MM -971 A -88 UM - 347 cm - 750 NM - 826 A -887 UM -85 UM - 558 MM -363 UM -810 A -6 cm - 616 nm - 325 NM -832 A -686 mm - 462.0 NM - 490 NM -275 A - 118 mm - 781 MM - 653 um - 11 um -418.5 NM - 440 mm -429 cm -421 CM - 498 A - 780 A -632 MM - 43 cm - 573 mm - 755.0 A -797 um -335 mm -576 um - 164 MM -111 mm - 178 MM -877 A -51 MM -360 A -258 mm -600 A - 937 NM -978 CM -754 um -52 mm - 857 CM -645 UM -370 cm - 134 UM -251 mm -494 cm - 787 CM - 903 um - 459 UM -222 A - 327 mm -653 nm -449 nm -485 CM - 908 UM -126 NM -455 um -379 A -421 NM - 960 nm - 411 MM -105 nm -865 CM - 491 cm - 534 NM - 231 NM - 68.0 MM -667 MM -380 nm -677 um -464 um - 670 CM -456 MM - 826 CM - 171 A - 298 CM - 174 NM - 213 mm -790 NM -375 UM - 388 um - 210 cm -702 A -854 nm -56 A - 892 NM - 133 MM -499 A - 566 CM -501 cm -333 MM -38 um - 966 mm - 397.5 A - 661 um - 62 nm - 862 nm - 162 A -989 nm -48.0 cm - 335 um - 282 MM - 527 mm - 941 MM -705 NM -574 CM - 145 um -866 mm -558 CM -427 NM -309.5 A -509 MM -398 CM -928 mm -805 cm -701 mm -302 um - 846 A -954.5 CM -96 MM - 469 um - 518 MM -240 A -398 CM - 741 CM -597 nm - 432 UM - 190 A -241 NM -707 MM - 438 UM -963 mm - 300 cm -431 cm - 677 mm - 35 nm - 61 UM -853 nm - 922 nm -514 UM - 659 nm - 252 nm - 533 NM - 169 cm - 744.5 mm - 947 NM - 898 CM - 617.0 MM -381 MM - 758 NM -221 A -678 MM - 394 NM -157.5 MM -213 UM - 342 MM -391 nm -735 nm - 760 UM - 729 mm -592 cm -662 NM -631 MM -761 A - 39 nm -480 NM - 294 CM - 147 um - 816 um - 588 mm -737 UM -80 A - 198 um -32 A -990 um -257.5 nm -283 um - 262 NM -878 nm -577 nm -159 nm -462 mm - 115 CM - 155 mm -456 cm - 149 MM -244 UM - 725 A - 92 nm -66 um -465 MM -256 um - 722 nm -511 A - 669.0 um -338 um - 904.0 nm - 611 mm - 71 MM -480 MM -701.0 UM -279 A -342 mm -157 UM - 195 mm -196 nm - 111 UM -890 cm -798 mm -760 mm - 875 NM - 222 mm -90 CM - 567 A -505 um -655 mm -844 nm - 154 A -503 A - 403 NM - 421 cm - 156 UM -388 NM -842 cm -291 nm - 125 MM -629 mm -543 NM - 261 um - 353 UM -357 cm - 133 A - 574 um -511 UM -29 A -87 nm -303 nm -600 UM -188 A - 366 um -468 nm -751 UM -297 NM -602 CM -726 CM - 492 nm - 613 mm - 51 A -411.0 nm - 751 CM -547.5 A - 156 nm -127 NM -598 CM - 177 nm -254 A -997 CM - 412 um -31 cm -56 cm -306 UM -533 um - 740 um - 32 MM -898 A -339 A - 942.0 mm -623 MM -690 UM - 918 um - 910 CM - 418 UM -442 NM -213 cm -300 CM - 892 MM - 869 UM -354 nm - 1000 um -981 um -535 NM - 629 nm -356 A - 174 CM - 761 NM - 344 UM -342 cm - 156 CM -948 UM -502 CM - 726 cm -813 UM -321 UM -195 NM -224 A -564 cm -911 MM -119 um -792 MM - 986 CM - 351 cm - 238 nm -491 CM -399 cm - 507 A - 736 um -862 UM -216 um -808 cm - 733 NM - 13 A - 401 NM -15 A -305 nm -172 UM -603 mm - 716 UM - 831 UM - 274 um -603 NM - 581 um -83 nm -415 A -862 mm - 523 cm - 562 NM -447 UM -689 UM - 642 mm - 67 um - 712 um - 991 CM - 120 um -727 A - 342 nm - 696 um -681 cm -69 cm - 6 cm - 377 MM -373 NM - 821 UM - 654 um - 585 cm -665 mm - 331 cm -334 nm -635 NM -378 um - 180 mm -713 mm - 423 mm - 750 CM -975 UM - 536 cm -839.0 A -555 MM -66 CM -723 UM -694 UM -573 NM -556 um -67 NM -44 um -645 UM -287 cm -111 CM -32 CM -543 um -25 MM - 656 cm - 614 nm -605 mm -283 A -195 MM -515 CM -590 mm -936 um - 602 UM -733 CM -880 MM -561 um -308 mm - 593 nm -366 MM -398 mm -38 cm - 536 cm - 177.0 mm - 963.5 MM - 25 cm - 81 mm - 687 A - 830 nm -842 UM -29 UM - 6 NM -549 mm - 847 MM - 277 mm - 241 um - 859 cm -87 MM -760 NM -378 CM - 626 NM -774 mm -427 NM -468 NM - 917 um - 59 cm - 242 MM - 84 CM -603 NM -372 nm - 377 mm -640.5 A -339 nm - 247 NM -338 MM -993 mm -630 MM - 493 cm -874.0 CM - 614 cm - 557 MM -56 cm -690 UM - 725 um - 990 CM -647 A -114.5 um - 94 nm - 950 cm -605 NM -855 A -141 mm - 557 mm - 160 MM - 201 A -670 CM - 877 MM -531 nm -875 A - 319 cm -955 cm -68 nm -111 CM - 276 CM -566 cm - 551 CM -223 um - 447 CM - 280 UM - 449 cm -988 mm -444 NM -37 um - 952 UM - 938 cm -370 cm - 775 NM - 453 A - 122 MM -533 CM -248 nm - 448 UM -575 UM - 114.0 mm -352 nm -464.5 MM -599 UM -680 mm - 495 um - 304 NM -479 nm -337.0 um - 185 cm -177 UM -722 CM - 785 MM - 198.0 CM -230 NM - 35 cm - 328 NM - 53 cm - 369 UM -255 um -140 NM -330 UM - 272 um - 742 NM -834 mm -78 um -601.0 mm -82 CM - 192 A -47.5 mm - 809 UM - 192 CM - 682 mm - 741 NM -255 nm -287 um -116 mm - 430 NM - 639 mm - 600 CM -203 cm - 332 CM - 358 NM -50 mm -483 A -402.0 UM - 132 mm -499 NM -288 NM - 59 nm - 676 A - 190 CM - 995 NM - 260 nm - 76 um - 49 UM - 176 CM - 322 CM -582 mm -637 nm - 4 mm -749 A - 821 NM -777 CM - 310 NM - 450 cm - 247 NM -224 CM - 141 UM - 1000 um -516 CM - 192 mm -862 MM - 665 UM - 653 mm -310 NM - 219 cm -716 UM -698 mm -505 um -381 A - 427 um -338 mm -392.0 CM - 239 cm - 637 CM - 359.5 cm - 5 cm -587 NM -759 NM - 988 mm - 634 mm - 878 um -239 A -358.0 nm -593 um - 363 mm -197 MM -751 CM -684 A - 626 A -237 cm -509 mm -492 CM -399 MM -534 A - 820 UM - 270 A - 455 UM - 689 NM -583 NM - 591 UM -47 UM -877 mm - 75 nm -564 cm - 556 nm - 232 UM - 503 mm -491 A - 669 MM - 860 MM - 790 A - 550 NM -552 um - 391 mm - 688 NM -765.0 A - 857 nm -335 UM - 866 MM -290 NM - 773 UM -813 NM -207 A -449 MM - 755 mm - 16.0 nm - 933 UM -674 UM - 871 mm -905 MM -861 um -430 cm - 987 CM - 426 CM -335.0 NM -91 MM - 889 mm -260 nm -457 A -27 CM - 270 MM -171 A -947 MM -873 nm -857 NM - 864 mm - 105 cm -190 mm - 769 nm -739 MM - 827 mm -585 CM -683 UM -545 nm -460 MM -572 nm - 474 A -618 A -87.5 um -316 mm - 654 NM - 241 CM -313 CM - 407 CM - 110 cm - 566 um -14 um - 965 cm -711.5 CM -282 CM - 399 MM - 879 mm - 304 UM - 9 CM -970 NM - 93 cm - 325 um - 788 NM - 232 CM -17.0 CM -916 mm -322 cm - 122 A - 281 CM - 24 A -3 MM - 745 UM - 522 cm -290 CM - 835 NM -726 A -986 A -846 mm -582 MM - 473 UM -201 mm - 620 NM -210 UM - 916 mm - 531 um - 815 UM - 900 MM - 203 um - 908 nm - 888 A -609 A -717 MM - 670 NM - 265 CM - 216 CM -877 mm -73.5 NM - 15 mm -93 NM - 393 cm - 157 A - 257 A - 79 CM -214 nm -492 UM - 186 A -371 nm -44 A -132 MM -525 mm - 107 CM - 401 UM -813 CM -274 NM - 647 NM -284 um - 495 NM - 126 um - 841 CM - 170 mm - 49 NM - 252 MM -870 NM - 858 NM -253 CM -461 CM -462 UM -997.0 nm -1 mm -237 UM - 674 A - 965 UM -601 mm - 602 UM -155 um -624 nm -466 nm -358 CM - 172 NM -919 um - 284 NM -540 A - 697 CM -268 UM -102 A -565 um -736 MM -103 A -132 um - 705 MM -838 UM -118 NM - 481 um -358 UM - 514 A - 600 cm - 124 NM -300 A - 572 um -261 um - 121 um -874 nm -540 um - 207 CM - 15 NM - 813 UM - 68 um -679 UM -283 A - 260 CM -399 nm - 175.0 nm - 475 A -459 UM - 460 MM -135 MM -462 UM - 730 mm -968 A - 662 um - 472.0 um -236 UM -126.0 mm -404 mm -487 cm - 710 NM -819 um -124 NM - 267 A -997 A -552.0 nm - 410 um -950 CM - 212 um - 315.0 MM -244 mm -273.0 um -907 A -757 NM -897 MM -135 mm - 799 MM -21 CM - 366 UM -535 CM -605 nm -627 nm -158 um - 112.5 cm - 503 um - 489 cm -904 nm - 888 NM - 7 um -336 A -980 NM - 3 CM -708 nm -122.0 CM - 836 CM -750 cm -782 CM - 327 um -151 nm -712 MM -784 NM -435 mm -103 MM -313 A -485 A - 43 um - 495 nm -101 um -906 MM -559 mm -494 nm - 352 nm -374 um -20 CM - 242 UM - 244 NM -402 nm - 93 mm -507 mm - 393 NM - 780 CM - 208 UM - 691 mm -624 CM - 911 A - 214 UM -271 A - 11 MM - 674 mm -440 um -851.0 A - 876 UM -156 UM - 678 A - 202 um - 674 cm - 234 NM -750 um -886 NM -827 cm - 392 A - 8 CM -474 CM - 329 mm - 302 cm -557 NM -279 A -611 UM -732 nm -614 cm -35.5 MM -289 UM - 630 NM - 680 cm - 880 NM - 963 NM - 93 mm -463 CM -460 NM -532.5 CM -808.0 mm - 32 mm - 623 NM -788 CM - 93.0 A -935 MM - 760 MM -414 A -781 mm - 249 NM - 4 cm - 334 MM -170 UM - 452 um -817 um - 42 um -74 UM -227.0 UM - 109 cm -656 nm - 580 CM - 652 A - 318.5 mm -289 CM - 202 MM - 472 mm -613 nm - 78 mm -810 NM - 464 A -922.5 UM - 949.0 UM -201 A -312 MM - 294 mm -443.0 UM - 501 UM -900 CM - 953 UM -946 UM -973 cm - 945 um - 812 nm -967 UM -211 NM - 900 mm - 426 mm -193 mm - 505 mm - 678 cm -526 CM - 549 um -662 UM - 271 CM -274 A - 288 UM -66 mm -425 A -902 MM -596 cm - 573 mm -223 nm -39 nm - 922 A - 439 mm - 232 mm - 417 CM -762 nm - 634 cm - 615 nm - 506 MM -549 mm - 673 um -808 A -145 um -848 um -914 A -551 UM - 860 nm -93 CM - 775 um - 769.0 nm - 103 MM - 680 nm - 786 nm - 214.0 A - 258.5 CM - 976 nm - 575 nm -460 UM -805 mm -42 NM -719 A -966 UM - 995 A -837 nm - 505 NM - 523 mm - 22 cm -374 A - 692 A -441 A -753 CM - 794.0 MM -867 UM -421 MM -618 mm - 182 um -539 UM - 673 UM -185 mm -845 A - 5 UM -414 NM - 270 cm - 341 NM - 890 A -307.0 cm -915 A - 125 nm -59 MM -145 A -972 mm - 679 UM - 6 A -140 cm - 630 MM - 449 mm -926 MM - 18 cm - 56 NM -516 nm -112 NM - 610 um - 558 NM - 775.5 um - 60 MM - 126 nm - 702 mm - 431.0 UM - 554 NM -139 um - 928 CM -771 NM -210 mm - 985 um - 123 nm - 97 mm -291 MM - 252 A -878 A - 699 UM - 567 A -956 A - 559 mm -241 cm - 230.0 MM - 179 NM - 317 A -148 um -885 UM - 853 cm - 873 A -611 cm -228 CM -947 UM -340 um -936 A - 686 um -934 A -209 mm -906 NM - 129 um -140 mm -566 mm -75 UM - 981 CM - 608 cm - 524 cm - 622 MM - 792 A -524 NM -824 A - 806 nm - 952 UM - 886 A - 448.5 A -195 CM -62 CM - 62 cm -541 mm -42 MM - 959 nm -638 CM -34 cm - 688.5 A - 272 A -171 A - 474 NM -135 UM -970 UM -561 CM - 395 A - 531 NM -202 mm -821 nm -783 A - 465 mm -503 um - 371 nm -858 UM - 468 mm -462 MM - 430 NM - 23 A -732 NM - 278 um - 895 nm - 422 cm -731 MM -77 MM - 479 A - 73 UM - 470 mm -740 CM - 12 cm -527 NM -752 MM -370 nm - 433 nm -735 cm -520 nm -784 MM - 658.0 cm -142 um - 157 mm -326 cm - 82 CM - 923 CM - 422 CM -362 mm -816 A -98 nm - 882 CM - 869 UM - 249 A -545 UM -29 CM -179 CM - 744 cm -89 NM -809 um -860 UM - 810 cm -394 NM - 794 NM -582 mm -99 mm - 194 nm - 599 NM -344 MM - 218 mm - 283 CM - 254 UM -516 mm -195 MM -546 UM - 339 NM - 984 mm -712 A -785 mm -948 cm - 27 cm -255 NM -333 NM - 897 CM -889 mm -299 um -686 A - 953 CM - 645 mm -465 UM -370 CM -937 CM -892 MM -252 MM - 354 MM -876 MM -186 nm -732 NM - 210 CM -593 mm -174 A -488 NM - 280 MM - 260 nm -995 CM -476.5 mm -981 MM - 708 NM - 333 A - 880 UM -793 UM -867 UM - 921 cm - 904 A -939 UM -695 NM - 572 mm - 47 MM -202 NM -445 cm -470 CM -372 MM -167 cm - 759 UM -180 A - 218 CM -429 A - 555 cm -178 CM - 658 um -490 nm -109.0 NM - 658 nm - 803 um - 708 cm -577 A - 830 A -641 NM - 274 mm -193 UM -722 NM -513 cm -64.5 nm -924 um -818 MM - 742 MM -780 cm - 687 CM -157 A - 889 mm - 782 NM -814 cm - 55 CM - 627 mm -291 um -303 MM - 541 UM -957 A -994 A - 545 UM - 130 mm - 353 UM -693 CM - 952 cm - 254 MM -616 CM - 150 UM -85 um - 279 um -226 CM -442 NM - 467 MM - 319 UM -735 MM -230 UM -785 CM -13 MM -623 cm -608 A - 660 um -457 NM -202 mm -433 UM - 661 um -373 CM -25 cm -147 A -954 mm - 248 cm - 568 A - 819 UM - 802 um -604 MM - 778 nm - 497 MM -867 cm -280 mm - 401 nm - 729 mm -42 mm - 497 A -48 mm -59 MM -692.5 NM -171 nm - 905 um -150 NM - 264 mm -359 UM -643 um - 312 A -693 UM - 151 A -186 A - 824 MM -18 MM -696 NM -89 um - 366.5 mm - 137 A - 355.5 cm - 729 mm - 402 cm -77 CM - 460 UM -820 A -220 A - 25 nm - 273 um -766 MM -115 nm - 168 mm - 557 mm - 949 mm - 486 NM -453 nm - 109 mm - 933 UM - 197 MM -241 cm -226 CM - 247 um -230 MM -436.5 cm -326 um -313 CM - 158 cm -431 um - 518 A - 262 um - 682 MM - 411 mm -841 nm - 474 cm - 625 um -787 UM - 259 mm -501 mm - 787 mm -691 UM -495 UM -755 nm -999 NM - 446 UM -896.0 MM - 744 cm - 746 nm -891 MM -324 cm -655 cm -93 nm -546 mm - 834 cm - 358 CM - 698 CM -364 CM - 642 CM -982 MM -205 nm -352 um -263 um - 431 CM -304 mm - 641 A -587 CM -748 mm - 240 A -702 nm -332 CM - 288.0 NM -545 CM - 787.0 mm -441 MM -350 UM -206 UM -876 CM - 861 um -897 NM -449 mm - 144 CM -59 cm - 364 MM -454 mm -111 nm -270 um -766 nm - 301 um -44 cm -307 MM - 519 mm - 262 cm -940 um - 337 nm -160 UM -105 A -149 A -691 MM -106 um - 695 CM -347 nm - 237 mm - 858.0 MM - 677 mm - 817 UM - 51 A - 520 NM -522 CM - 436 CM - 889 nm - 818 nm - 689 cm - 914 cm -120 nm -131 CM - 785 cm - 92 NM - 971 CM -781 NM - 505 nm - 233 nm - 363 NM - 448 CM -473 MM - 76 CM - 935.0 NM -905 A -511 A - 226 CM -358 CM - 978 UM -987 nm -207 UM - 430 mm - 386 NM -484 CM - 448 UM - 695 nm - 932 UM - 460 NM - 437 mm - 13.0 A - 471 um - 525 NM -479 um -763 A - 279 MM -331 MM -244 cm -741 CM - 467 mm - 70 um - 901 nm -675 nm - 141 UM -303 cm - 497 MM - 480.5 cm -198 um - 557.0 um - 986 NM -616 um -688 CM -656 UM -890 cm -221 A -343 cm - 770 CM - 870 UM - 1 A -450 um -591 A - 222 A - 480 um -583 mm -537 um -589 CM - 326 A - 973 UM - 95 um -563 UM -16.5 A -408 CM - 463 CM -591 MM - 771 cm -798 NM -685 UM - 823 A -193 cm - 969 cm - 921 um -902 MM -893 MM -795 nm -213 MM -911 NM -135 CM - 900 MM -130 mm - 819 um - 441 UM - 480 MM -684 mm - 655 CM - 86 NM -989 A - 543 MM - 858 um -806 MM -969 CM - 558 um -63 A - 781 CM - 671 MM -264 UM - 317 A - 158 MM - 301 um -285 MM - 246 MM -108 nm -150 mm -154 NM -736 NM - 296 NM - 859 NM - 333 A - 505 um - 946.0 A -798 NM - 129 NM -636 NM - 164 um -247 UM - 33 UM - 418 UM -195 MM -689 cm - 600 nm -316 A - 938.5 cm - 353 NM - 766 A -835 cm -935 mm -63 A - 164.0 nm - 510 NM - 962 CM -165 um -810 UM - 709 cm -170 A - 907 NM - 844 nm - 537.0 CM - 250 nm -716 CM - 700 NM - 813 A - 668.5 MM -84 NM -633 CM -840.0 A -982 UM -372 cm -407 MM - 502 MM -400 NM -390 CM -7 CM - 239 CM - 800 CM - 446 um - 496 UM - 96.5 mm -939 CM - 243 UM - 107 cm -889 UM -634 MM -882 MM - 51 UM -487 CM -370 mm -730 NM - 87 um - 872 CM -568 um -231 nm - 38 UM -198 CM - 619 A -974 um -264 cm - 364 um - 109.0 MM - 753 mm - 717 A -859 nm -591 MM -929 um - 810 UM -545 CM -511 um - 934 nm -577 UM -329 CM -201 MM -936 CM -149 cm -305 UM -754 mm -218 CM - 178 CM - 243 CM -275 um - 347 nm -184 MM - 773 MM -906 NM - 800 CM - 678 mm -774 A - 48 mm -567 um -939 NM - 939 NM - 869 MM - 247 cm - 564 mm -939 cm -557 NM - 567 NM -170.0 CM -418 MM - 310 MM -580 UM - 273 NM -195 CM -954 MM -675 cm - 296 NM -676 cm - 201 MM - 865 A - 597 CM -750 A -983 um - 604 CM - 173 UM -418 um -860 NM - 437 CM -928.0 UM -557 mm - 857 um - 450 mm -649 cm -320 nm - 227 MM - 464 cm - 149 UM - 330 NM -497 UM -489 UM - 22 mm -10 um -437 NM -837 cm -863 nm -612 um - 380 cm -268 mm -244.0 NM - 210 CM -231 UM - 890 UM -677 MM -192 MM -780 um -53 UM - 452 mm - 659 um -893 cm - 744.0 MM -618 CM -849 MM - 820 CM -659 mm - 751 cm - 525 MM -360 cm - 679 UM - 269 A -769 cm -177 cm - 462 um - 955 NM -572 um - 691 UM - 234.0 NM - 597 UM -897 cm - 648 MM -559 A -511 A -486 MM -387 CM - 799 UM - 33 NM - 558 A -794 um - 655 UM - 219 CM -769.5 mm - 604 NM -283 A - 846.5 um - 269.5 UM - 698 NM -519 NM - 686 mm -178 MM -650 NM -105 UM -138 UM -569 MM - 992 mm -716 mm - 991 CM - 608 A -220 CM -727 MM - 857 cm - 601 NM - 320.5 nm -671 um - 667 CM -93 CM -527 NM - 495 mm - 886 nm - 956 NM - 563 CM -623 mm - 75 cm - 143 A -732 um -229 um - 897 CM - 97 UM -403 NM -52 CM - 587 cm - 879 NM - 415 MM -292 nm -219 CM - 666 UM - 467 A - 651.0 NM -345 mm - 446 nm - 204 cm - 982 MM -160 mm - 347 nm - 393 A -948 UM - 230 cm - 1 CM -436.5 MM -798.0 um -76 um - 378 um - 796 nm - 17 nm - 820 CM - 654 mm -137 cm -484 nm -746 NM -833 cm -937 NM -170 MM -74 NM -150 CM -692 cm - 68 A - 67 NM -151 mm - 98 cm -953 A - 894.5 mm - 314 um - 293 mm -493 CM - 702 UM - 13 nm - 450 nm - 333 cm -247 CM - 670 nm - 142 A - 821 um - 982 nm - 351 MM - 773 UM -449 mm - 109 MM - 305 NM - 827 NM - 488 NM - 1000 CM - 336 NM -801 mm -703 cm -743 A -757 A -229 mm - 392 NM - 76.0 MM - 271 mm -863 NM - 411 A - 404 CM - 567 NM -579 MM - 229 NM -456 CM - 638 MM - 800 MM - 902 MM - 831 mm -316 nm - 772 um - 927 NM - 998 mm - 734 um -714 nm -919 UM - 637 NM -230 cm - 279 CM - 214 MM - 536 UM -877 MM - 512 MM -298 um -698 NM -155 mm -494 UM - 392 A - 987 UM - 781 nm - 874 cm - 517.0 NM -789 CM -179 UM -255 A - 31 nm -666 um -903 MM - 850 um - 246 um -116.0 um -179 A - 70 A - 644 nm -314 mm -545 A -929 MM -77 nm -15 mm -277 cm -442 cm - 645 cm -545 A - 993 UM - 606 mm -639 cm - 379 um - 188 CM -509 A - 888 MM - 755 mm - 263 A -233 mm -954 UM - 96 MM - 7 um -798 cm - 385 um - 996 UM - 948 mm - 450 UM - 383 MM - 995 A - 518 mm - 876 um -866 nm -286 CM -662 CM - 884 UM -99 A - 229 MM - 928 cm -479 um -68 nm -641 um - 951 nm -119 NM - 86 A -143 cm - 612 um - 310 um - 607 nm - 551 um - 290 NM - 975 UM -26 A - 50 NM -4 cm - 149 MM - 470 A - 772 MM - 353 A -132 NM -686 MM -506 nm -862 mm - 205 MM -498 cm -635 NM - 738 cm -944 cm -934 MM - 200 MM - 489 CM - 792 MM - 1 CM -787 mm - 658 um - 692 CM -784 cm - 883.5 CM -777 A -339 CM -296 CM -616 A -554 MM -352 MM -111 CM -439 nm -630 CM - 182 CM -600 UM - 387 nm -814 cm - 404 MM - 567.0 um - 147 A - 55 UM - 300.5 mm - 488 mm -326 A - 692 UM - 133 UM -170 A - 711 NM - 559 CM -579 cm -145 UM - 310.5 A - 565 A - 874 cm - 823 um - 364 um -880 nm -29 NM -333 NM -313 nm - 627 mm -581 um -771 cm - 457 mm -506 mm - 879 CM - 230 NM -833.5 MM -299 cm -818 NM -826 cm -190 cm - 968 um - 391 CM -439 A - 482 nm - 900 nm -621 A -768 MM - 769 UM -179 NM - 204 UM -922 um -759 UM - 960 mm -276 MM -51 NM - 573 A - 220 CM - 117 NM -42 NM -647 MM -232 nm - 916 um - 617 cm - 161 um - 945 nm - 510 nm -455 A - 24 um -319.5 CM - 508 um -151 MM -644 CM -736 A - 131 NM -153 nm - 634 UM - 36 A - 793 um - 347 MM -31 cm - 140 mm -92 mm -752 CM - 164 UM -983 NM -99 cm -842 nm -910 NM - 152 UM - 105 nm -985 MM -853 mm -607 nm -331 nm -754 MM - 232 UM - 328 cm - 964 CM -495 nm -779 nm -611 UM -413 UM - 424 mm -429 mm -959 MM - 61 A - 797 MM - 803 nm - 926 UM - 911.0 um - 323 MM - 16 UM -44 A -235 NM - 56 MM -827 cm -197 nm -638 A -111 cm -429 A - 955 mm - 85 NM -445 cm -763 UM -744 mm -270 CM - 6 um - 112 cm - 486 MM -641 cm - 633 MM - 700 A -677 MM - 399.0 UM - 42 CM -959 MM - 928 mm -648 mm -52 nm - 228 nm - 525 MM - 734 um - 403 NM -142 um -177 um - 481 CM -296 CM - 445 MM - 165 cm - 160 NM - 45 NM - 18 mm - 526 um - 993 A -500 nm - 975 um - 893 cm -590.0 um -802 MM - 245 CM -597 A - 772 NM -571 nm -113 um -619 UM -572 MM - 86 NM -911 NM -109 mm - 804 mm - 156 MM -468 UM - 757 CM -588 mm -477 MM -328 NM -245 NM - 562 UM -215 cm - 994 nm - 675.0 nm -414 UM -529 cm - 939 NM -812.0 UM -961 um -767 NM -405 A - 627 nm -476 mm -994 CM - 109 NM - 691 NM - 389 cm - 420 nm -941 cm - 749 MM -870 NM -388 um -87 CM -613 A -630 UM - 673 MM -453 MM -660 MM -843.0 um -986 mm - 590 UM - 502 mm - 249 NM - 239 UM - 831 mm - 119.0 UM -496 nm -92 NM -843 um -109 mm - 924 CM -543 mm - 483 NM -309 nm -96 UM -752 nm - 254 NM -639 nm - 647 mm - 902 nm -604 A - 30 A -164 um - 692 CM - 101 MM -162 cm - 692 um - 552 um - 400 um - 345 UM - 183 cm - 979 CM -561 CM - 379.5 UM - 829 mm -954 NM -991 NM - 292 MM - 41 MM - 570.5 NM -108 UM -772 cm - 854 UM -913 UM -970 MM -100 um -514 um - 508 mm -481 um -495 MM - 276 MM -221 MM -716 mm -194 UM - 389 cm - 215 CM - 33.0 mm -344 cm -515 MM - 356 nm -902 MM -468 mm -911 um - 152 NM -830 um -10 UM -83 A - 715 MM - 500 UM - 243 UM -380 UM -420 A - 977 um - 486 UM -924 NM - 843 nm - 674 A - 113 cm - 571 cm -602 cm - 531 MM -998.0 nm - 611 NM - 68 MM -47 CM - 580 um - 511 CM - 330 um - 894 mm - 249 MM -851 cm -843 um -515 CM - 287 CM - 512 CM - 290 mm -449 A - 312 cm - 445 CM -824 A - 46 A - 941 CM -202 nm -859 MM - 683 CM -943 mm -810 nm - 107 cm - 874 NM - 57 A - 403 mm -242 UM - 559 UM -842 cm -882 A -829.0 nm - 341 cm - 316 UM -662 UM - 756 um - 286 NM -105 UM -251 A - 929 NM - 326 A -881 cm - 719 nm - 434 nm -961 UM -117 UM - 344 mm -672 MM -736 NM - 996 A - 604 NM -898 MM - 42 um -927 CM -910 um -526 A - 842 MM -168 cm -391 cm -724 um - 191 nm -52 um -662 NM - 31 nm -922 cm -217 UM -830 cm -357 NM -760 cm - 616 um -958 UM - 364 um -228 cm -434.5 MM -109 A - 717 A -824 mm -359 MM -114 um -786 mm -89 mm - 925 cm -936 A - 587 mm -948 cm - 698 cm - 698 A - 966 CM - 959 A -273 mm -809 mm -602 nm -376 um - 287 MM - 507 UM -382 A - 307 um -432 NM -380.5 UM -54 A -633 NM - 511 CM - 985 NM - 716 MM -213 mm -374 NM -152 MM - 842 UM - 349 NM - 517 A -786 um -568 A -953 UM - 370 NM -424 MM -988 A - 513 nm - 621 UM - 105 CM - 228 mm -88.0 MM -371 CM - 854 nm -774 mm -301 UM -894 UM - 618 um - 567 NM - 355 cm - 671 UM - 894 NM - 401.0 NM - 440.0 A -534 NM -795.5 A -950 mm - 748 MM - 248 nm -698 nm -189 MM -814 MM - 471 MM -443 CM - 283 MM - 295 um -881 A -807 cm - 230 MM - 796 nm - 932 UM -642 A - 994 um - 841 nm -653 nm - 572 A - 224.5 CM -331 mm -860 mm -90 MM -192 nm - 660 mm - 940 MM -932 nm - 328 NM - 565 NM -652 cm - 487 mm - 835 CM -576 A - 823 nm - 858 MM - 809 A - 387 MM -878 mm -204 cm -4 mm -61.0 UM -209 nm - 47 A - 118 CM - 185 UM -817 A -644 A - 815 A -622 MM - 109 A - 933 UM - 739 nm - 930 CM - 915 NM -360 NM - 880 mm - 826 UM - 6 nm - 753 UM -997 UM - 858 nm - 200 nm -89 MM -124 CM - 384 NM - 797 cm -479 mm - 409 A -440 MM - 999 mm - 943 mm -2 mm -182 UM - 577 NM -722 A -19.0 cm -474 UM -306 cm - 837 um -411 um - 908 cm - 773 NM -607 MM -425 um -308 NM - 867 cm -376 cm - 581 um -729 MM - 18 mm -664 A -538 A -280 MM -627 A -653 NM -493 MM -17 CM -958 nm - 934 NM - 255 A -421 NM - 532 nm -925 UM -655.5 nm - 97 CM -225 mm - 219 cm -661 mm - 639 nm -525 CM - 214 mm -535 cm -149 UM -424.0 CM -424 A - 867 MM -34 MM -755.5 nm -313 NM - 97 cm - 826 UM -690 mm - 12 A -243 CM - 240 cm - 386 MM - 710 nm - 631 NM -540 CM - 372.5 A - 927 nm -213 um - 604 CM - 362 NM -55 CM -568 CM -110 NM - 944 NM -930 um -511 CM -301 nm -872 CM -260 um -711 cm -877 um - 130 CM -398 nm -289 A -527 UM - 535 mm -421 UM -662 um - 28.5 um - 800 nm - 714 MM -10 cm - 847 NM -650 A -256 A - 586 um -817.5 nm -829 nm - 784 CM -563 nm -91 A - 547 MM -798 mm - 508 MM -358 UM - 740 CM - 814 nm - 417 MM -363 CM -582 MM - 236 mm - 570 CM - 952 UM -384 UM -749 A -398 nm -68 mm - 135 nm - 43 MM - 909 CM - 51.5 MM - 493.5 UM - 752 um - 797 MM -21.5 um - 607 MM -9 mm - 48 mm - 317 nm -820 UM -654 cm - 753 cm - 498 mm -655 NM -965 UM - 959 MM -847.0 um -717 MM - 202 nm - 140 mm - 94 cm - 679 MM -788 UM - 954 NM - 22 A - 485 UM - 266 mm - 211 A -710 UM -529 um -758 A -239 UM - 163 MM -597 um - 128 nm - 368 um -808 A - 192 MM - 129 NM -876 MM -69 UM -913 cm - 714 CM - 214 CM - 603 mm - 901 mm -380 CM - 379 mm - 846 nm - 548 UM - 552 CM - 87 CM - 326 um - 810 MM - 430 MM -867.5 NM - 249 MM - 77 MM - 591 CM -249 cm -3 A -252 UM - 837 mm -560 A - 591 CM -309 cm -514 nm - 960 um -14 nm - 572 nm - 263 CM -592 CM -879 MM - 616 CM -720 NM - 615 mm -631 A -652 CM - 462 cm - 35 NM - 82 um -404 A - 990 cm - 300 UM - 462 A -744 CM -111 UM -575 um - 767 nm -54 A -596 mm -620 A - 721.0 CM - 548 MM - 112 nm - 646 MM - 934 A - 778.0 mm - 333 NM -161 A - 441 NM - 201 UM -192 cm -506 A -620 CM -27 um - 748 um - 593 MM -734 NM - 795 nm -817 UM - 824 UM - 384 mm -319 um - 650 CM - 859 CM - 565.0 mm - 342.0 UM -556 A - 249 mm - 454.5 cm -225.0 NM -582 mm - 898 MM - 957 MM - 345 nm - 644.0 A - 289 CM - 921 mm -926 nm - 562.5 NM - 968 cm - 18 A -580 cm - 771 nm -879 mm -682 UM -690 nm - 108 A -906 nm - 455 cm - 73 A -715 UM - 727 CM -421 MM -602 cm - 744 CM -399 cm - 358 A - 298 MM - 271 CM - 179 NM - 18 UM -334.0 nm - 762 UM -925.0 CM -549 UM - 609 NM -535 CM -475 nm - 557 CM - 84 UM - 48 CM -144 UM -312 cm - 989 UM - 133 mm -323 NM - 545 nm - 554 cm -585 UM -969 MM - 281 CM - 138 nm -49 um -917.0 um - 919 mm - 96 MM - 457 mm - 451 A -932 A - 114 cm -989 cm - 529 um - 935 cm - 501 mm - 912 um - 996 NM - 911 CM - 89 nm -426 A -376 MM - 426 MM -281 CM - 940 cm - 420 mm - 958 um -933 mm - 38 nm -978 A - 842 mm -321 cm -419 nm -724 MM -214 NM -268 A - 896 cm -322 nm -239 nm - 869 NM -534 UM -652 nm - 840 um - 344 MM - 845 MM -909 A -256 A -107 MM - 617 A - 734 cm -982 CM -440 A - 108 A - 933 CM -51 NM -549 MM -675 A - 825 nm -91 UM - 20 MM -801.0 MM -360 MM -947 nm -523 cm - 311 A -923 nm -131 NM - 369 A - 755 mm -968 cm - 95 um -179 MM - 189 nm - 577 UM - 739 CM - 286 CM -124 nm - 521 cm - 209 mm - 64 mm -821 UM - 94 nm -667 NM -687 nm -500 A -719 NM -952 UM -88 MM -454 nm -277 um - 219 um -415 A -446 MM -162 nm - 103 CM -797 CM - 596 mm - 725 UM -643 cm -214 cm -146 A -844 nm -947 NM -193 CM - 754 NM -696 NM - 290 mm - 736 A - 325 mm -472 UM - 449 A - 519 A - 193 cm - 572 UM - 443 UM - 702 cm -916 mm - 526 CM -395 um -741 nm - 359 cm -496 nm - 123 cm - 468 MM - 898 cm - 258 cm -124 MM - 734 cm - 341 CM -315 um -487 mm - 376 CM -592.5 CM - 528 UM -101 nm - 354 nm -871 um - 740 mm -634 A -297 nm - 729 cm -676 mm - 889 cm -749 NM -155 NM -121 UM -142.5 um -21 mm - 399 MM -138.0 NM -661 um -727 MM -997 UM -713 NM - 567 UM - 94 mm -363 MM - 151 mm - 311 CM - 50 nm - 671 A - 731 um - 102 mm -322 mm -338 UM -842 NM - 865 CM -11 um - 693 CM -564 nm -76 cm -670 A -88 CM - 379 A - 925 cm - 142 cm -155 nm -235 CM - 65 NM -722 A - 649 MM -240 UM -135 UM - 178 CM -287 NM -1 A - 10 A - 95 UM -267 nm -812 cm -551 um - 423 cm - 351 MM -876 UM - 769 um -800 um - 232 nm - 149 mm -499 mm - 652 NM - 465.0 A -225 UM -461 mm -526 um - 417 NM -223 NM - 587 MM - 455 NM -977 NM - 292 UM -260 nm - 665 mm - 893 A -71 mm - 179 CM -983 NM -482 NM -464 mm -500 um -978 mm -43 nm - 399 A - 448 nm - 654 cm - 281 NM -771 um - 689 nm -878 cm - 20 MM -696 nm -265 A - 846 A - 901 mm -556 MM - 155 nm -26 CM - 792 A -266 cm -241 UM -759 cm - 324 cm -622 cm - 239 nm -976 UM -659 nm -177 um - 82 um -625 A -620 A -767.0 cm -105 MM - 494 NM -150.0 cm - 881 nm - 957 mm -15 um - 620 NM -597 mm -298 cm - 612 CM - 400 nm - 923 MM -540 um -148 MM - 782 NM -860 A -397 A - 510 MM - 632 CM - 320 CM -724 NM -990 mm - 613.5 um - 701 nm -716 MM -361 cm - 825 NM -952 cm - 118 MM -332 A - 835 UM -831 mm - 199 um -69 NM - 162 mm - 324 A -114 MM - 248.5 CM -434 UM - 143 UM -480 UM -520 cm - 334 um -552 cm - 190 nm - 155 MM - 460 cm - 614 A - 654 MM - 312 um - 256 MM -409.5 MM - 799 um -109 MM -791 nm - 156 um -896 UM - 647 MM -78 NM - 632 A - 297 A -374 MM - 641 um - 536 nm - 982 NM -194 NM -530.0 um - 121 CM -857 um - 953 MM - 705 CM - 314 CM - 539 NM - 121 CM -863 NM -252 A -410 MM - 517 MM - 204 nm - 433 UM - 304 mm - 709 um - 802 CM -490 cm - 151 cm -770 CM -213 CM - 256 mm - 210 A -1 CM - 2 CM - 138 NM - 218 cm -172 NM -386 MM - 772 A -965 cm - 760 nm - 752 UM -994 nm -716 cm - 537 um - 921 cm - 261 MM - 191 MM - 710 MM - 862 NM - 614 cm -281 cm - 343 nm -810 um - 490 UM -31 um -621 CM -980 mm - 481 um -101 cm -472 NM -756.0 cm -580 CM - 344 CM - 63 A -692 NM - 510 cm -864 mm - 34 um -965 nm - 849 NM - 245 mm -661 mm -841.0 NM - 404 um - 861 A - 387 NM -854 MM - 153 A - 646 MM -778 nm - 998 nm -616 nm - 736 cm - 48 cm -204 CM - 123 mm - 30 NM - 844 um - 89 A -975 MM -290 mm -734 cm - 989 UM - 956 cm -880 mm -988 cm -768 CM - 510 nm -210 cm - 918 um - 298 cm - 542.0 NM - 146 um -729 mm - 466 um -1000 NM - 268 NM -433 A -561 cm - 806 NM - 490 NM -63 cm - 998 CM - 824 A -976 CM -857 NM -561 UM -287 cm - 643 UM -16 MM - 96 CM -716 MM -236 mm -656 nm -397 mm - 603 um -877 CM - 709 MM -894 MM -141 CM - 510 mm -638 nm - 543 CM -494 um - 279 nm -406 CM - 110 nm -881 UM -585 CM - 153 A - 248 MM - 581 A - 293 nm - 623 um - 267 cm -51 nm - 671.5 um - 80 CM - 459 NM -315 NM - 453 cm - 948 mm - 518 UM -111 nm - 63 mm -347 CM - 530 nm -701 NM -372 CM - 361 um - 506 cm -170 mm - 661.0 A - 453 mm - 440 A - 764 um - 73 UM -495 cm - 390 um -448 um -511 cm -762.5 A - 261 nm -288 MM - 174 MM - 813 A -927 cm - 414 MM -155 A -437 NM -283 UM -980 NM -930 UM - 231 um - 241 nm - 280 NM - 577 nm -270 cm -609 A -403 CM - 267 UM - 435 NM - 230 UM - 14 A - 307 UM - 410 A -384 um - 87 cm - 898 MM -305 UM -652 A - 685 NM - 343 NM -583 A - 277 mm -702 UM - 276 um - 405 mm - 220 CM -384 MM -329 UM -323 CM -500.0 UM - 38 MM -734 um -296 CM - 947 nm - 568 um - 80 cm - 224 mm - 224 um -717 CM - 597 UM -931 CM - 995 cm - 576 MM - 477 A -706 um - 762 A -363 nm -558.5 cm - 417 nm - 409.5 mm -321 nm - 388 mm -270 NM - 656 A -620 MM - 112 mm -188 NM - 446 NM - 941 cm - 640 MM -631 NM - 627.0 nm - 215 UM - 428 UM - 520 CM -607 NM - 573 NM - 320 NM -998 um -13.5 CM - 233 um - 732 MM - 966 NM - 426 cm -780 um - 306 um - 125 UM - 115 nm -766 um - 457 A - 914 UM - 672 NM - 803 mm - 698 A -131 MM - 468 NM -259 mm -454 NM - 603 MM -129 nm -1 cm -178 CM - 98.0 cm -379 mm -322 mm - 632 NM - 574 cm - 549 UM - 815 NM -705 nm -723 mm -456 um - 954 nm -830 A - 350 CM -60 UM - 124 NM - 373 A -404 UM -723 NM - 108 NM -23 mm - 397.0 nm - 737 CM -739 NM - 425 nm - 431 CM -873 cm - 273 um - 918 MM -108 nm - 291 nm -124 MM - 420 UM - 80 nm - 788 mm - 138 mm - 976 CM -556 um - 88 UM -172 MM -675 NM - 894 MM - 400 mm - 920.0 mm - 950 UM -409 CM - 807 CM - 490 nm - 416 cm - 396 UM - 255 CM - 1 A - 976 um - 150 cm - 726 cm - 44 A -906 CM -183 um -966 mm - 461 A - 17 mm - 104 mm -435 cm - 18 MM -698 NM -185 NM -146 MM -301 MM -262 UM - 761 MM - 931 NM - 716 MM - 915 CM - 791 UM -192 um - 885 mm -485 A -728.5 um - 924 UM - 650 NM - 718 um - 34 um - 116 mm -610 cm -728 cm - 398 A - 761 um - 554 um -735 A -33 um -854 UM -267 A -699 UM -795 A - 642.0 A - 37 mm - 465 cm -682 MM -698 A - 211 nm -452 um -235 cm -566 cm -664 mm -993 MM - 921 um -803 A -586 CM -64 UM - 532 mm - 247 A - 77 CM - 324 mm -736 nm -371 nm - 88 um - 266.5 mm - 739 A -74 UM - 259 MM -166.0 CM -898 NM - 95 A - 768 nm - 618 A - 182 um - 208 NM -835 nm -78 nm - 365 mm -95.0 cm - 429 MM - 93 MM -866 nm -925 um -527 A - 218 cm - 613 NM -632 A - 857 nm - 102 um - 389 cm -177 MM -296 cm -509 NM - 382 A -988 um - 951 NM -689 NM - 527 nm -454 cm -796 nm - 555.0 MM -328 A - 593 nm -681 MM - 391 cm -648 cm -340 mm - 303 NM - 434 mm -121 um -308 UM - 17 NM - 641 CM - 276 NM -283 nm - 805 CM - 832 um -806 cm -74 mm - 774 NM -373 UM - 170 UM -187 A - 815 um - 237 CM - 797 CM -700 NM -602 nm -668 UM - 566 cm -505 nm -290 NM - 961 mm -368 A - 606 UM -4 um - 800 A -283 NM - 961 cm -309 cm -635 nm -936 mm -584 UM -428 MM - 773 um - 312 UM - 143 NM - 956 NM -889 cm - 89 nm -50 CM -488 A - 783 CM -230 A - 369.5 UM -219 NM - 224 mm -287 A - 240 MM -558 CM -534 A - 499 nm - 743 A -979.5 nm - 113 UM -628 NM - 568 cm - 883 um - 113 UM -424.0 A - 140 cm -731 CM - 630 A - 354 A -995 A - 156 NM -564 UM - 350 nm - 154 MM -653 um - 674 um - 200 NM - 67 CM - 36 um - 48 UM - 196 A -1 nm - 934 UM - 397 CM -34 UM -209 mm - 386 MM - 597 CM -689 um - 957 cm - 101 um - 628 nm -495 NM -806 CM - 164 um -284 A - 360 nm -908 cm -196 cm - 572 UM - 519 MM - 270 um - 393 cm -64 NM - 584 MM - 545 um - 390 nm - 405 UM - 958 um -461 UM -148 NM -497 MM - 360 um -889 MM - 379 A -559 cm -576 UM -325 mm - 477 nm -980 CM - 499 NM -948 A - 552 A -418 nm - 533 cm -644 nm -864 NM -615 A -937 nm -786 cm -184 mm - 691.0 CM - 284 mm -6 CM - 987 MM -850 A - 571 MM - 225 UM -742 mm -100 um - 309 cm - 692 A - 857 NM -898 nm -184 UM -196 mm - 370.0 cm -425 NM - 861 NM -225 UM -839 MM - 350 nm - 684 um - 905 A - 863 UM -461 NM - 824 CM - 309 cm -612 mm - 401 A -55 um -295 NM - 888 mm - 450 CM -159 MM -305 nm - 338 um -662.0 nm - 542 nm - 328 mm -77 nm -997 NM -604 NM -436 um - 240 um - 938 mm - 204 cm - 678 UM -866 NM - 366 A - 547 NM -378 mm -67 NM -254 um -52 UM -189 CM - 170 cm - 105 CM - 290.0 A -797 A - 239 cm - 726 NM -320 A -738 CM -266 nm - 301 NM - 68 MM - 841 UM - 776 cm - 698 um -465 NM - 805 UM -140 um -898 A -220 A - 168 CM - 566 CM -121 cm -285 mm - 329 um - 267 UM - 375 A - 687 A -77 nm -556 nm - 354 MM - 976 MM -972 CM - 659 NM - 92 nm -226 cm - 26.5 NM - 521 mm - 109 nm - 698 um - 726 mm -315 mm - 724 UM - 414 cm -936 UM -587 CM -490 um -656 UM -80 MM -571 MM -597 UM - 556 UM - 775 NM -334 nm -687 NM - 607 cm - 82 cm - 955 CM -548 nm - 228 cm - 440 NM -482 UM -869 cm - 428 um -17 A -955 NM -768 UM - 708 CM - 460 UM - 129 A -387.5 nm -748 mm - 905 CM -721 A -59 nm - 401 cm - 652 UM -872 mm - 661 mm -141 um - 169 UM -145 nm - 379 um - 529 CM - 987 UM - 687 mm - 382 A -74 UM -150 NM -492 CM -774 MM - 687 CM - 394 A -975 mm -806 MM - 210 A -571 NM -648 CM -415 cm - 778 um - 337 NM -520 CM -688 mm - 576 CM -169 nm -554.0 cm - 384 cm - 337 nm - 2 UM -760 MM -165 UM -420 CM -144 nm -227 CM - 839 MM - 334 MM - 557 MM - 184 A - 216 NM -953 MM - 66 cm -734 nm -611 nm -288.5 CM -519 A - 148 NM - 908 MM -844 nm -225 A -905 A -854 cm - 83 cm -709 nm -451 UM - 95 cm - 302 cm - 197 cm - 928 mm -663 CM - 936 cm - 145 mm -541 cm - 978 cm -863 cm - 556 um - 921 UM - 499 NM -687 mm - 871 um - 854 mm -793 UM -176 CM - 255 NM -650 um -745 CM -482 um - 570 CM -828 A -554 CM - 146 mm -991 A -49 nm -259 UM - 52 cm -666 cm - 243 UM - 617 NM - 524 A - 454 MM - 449 MM -975 nm -359 NM -580 um -468 mm -810 CM -702 UM - 838 UM -116 um - 502.0 UM - 175 NM -928 UM -272 MM - 962 um -828 nm -85 mm -362.0 UM - 422 cm -900 cm -684.5 UM -945 NM - 144.5 cm - 250 UM -322 CM - 678 A -417 A - 23 MM - 579 cm -978 mm -623 MM -233 cm - 493 NM - 611 NM - 446 NM -111 UM -466 nm - 592 CM - 347 nm - 337 um - 823 um -171 cm - 715 MM - 528 CM - 718 UM - 258 nm - 865 A - 121 NM - 204.0 mm - 606 UM -343 mm -150 NM - 575 cm -845 mm - 412 NM -863 cm -887.5 nm - 516 nm - 547 A -992 mm -658 NM - 669 CM - 588 A -809 MM -748 UM - 95 NM - 400 nm -804 mm - 655 um -772 um - 473 A - 231 UM - 440 CM -283 cm -696 NM -137 cm - 462 A -42 um - 212 MM -836 CM - 32 nm - 652 UM -255 MM -988 mm - 380 UM - 388 UM - 728 um - 577 A - 818 CM - 213 cm -336 nm -104 UM -571 cm - 787 CM - 670 A - 770 NM - 107 UM -347 A -440 um - 412 mm - 936 mm - 762.5 mm -500 cm - 137 um - 352 MM -729 NM - 887 nm - 469 cm - 240 UM -439 cm -85 cm - 619 nm - 94 mm - 302 NM -64 um -800 NM - 399 mm - 980 nm -100 MM -704 UM -103 um -636 NM - 434 mm - 336.5 UM -588 cm - 783 MM -383 CM - 586 um - 631 um -372 MM - 337 um - 70 MM - 216 mm -365 MM -590 MM -663 UM -1 UM -451 um - 16 mm - 845 nm -649 mm - 138 nm -543 NM -120 UM -591.0 nm - 860 CM -956 mm -958 A -857 nm - 993 cm - 771 mm -310 CM - 397 UM - 702 NM - 396.5 MM -975 NM - 702 nm -743 UM - 588 mm - 598 A - 321 um -621 um -517 cm - 181 MM - 189 A - 361.5 nm -236 cm - 28 CM -423 nm - 293 mm - 293 nm -495 um - 671 NM -500 MM -14 CM - 981 NM - 413 nm - 653 NM -993 MM - 630 CM -272 nm - 816 um -42.0 um -231 A - 361 NM -55 NM - 723 cm -47 NM - 734 mm -49 mm - 756 CM -924 MM - 67 MM -94 UM - 886 um -451 MM -319 UM - 157 nm -177 A - 160 mm - 914 UM - 351 A - 794 mm - 774 UM - 460 mm - 355 A - 10 cm -991 mm - 590 nm -222 CM - 241 cm - 860 um - 676 mm - 871 mm -560 UM -414 UM -524 UM -201 CM -827 um - 934.0 cm -296 cm -257 CM - 543 MM - 651 cm -12 MM -756 NM - 762 A - 421 CM -422 cm -342 um - 552 UM -665 CM - 97 MM - 602 NM -633 MM - 741 MM -523 UM - 250 UM - 993 NM - 115 UM - 582 cm - 684.0 MM - 327 UM -945 um - 628 MM -496 mm - 304 MM -423 A -910 NM - 656 mm - 540 A -245 MM - 221 um - 349 UM -67 A - 209 cm - 171.5 nm -738 cm -585 A - 640 MM - 685 A -750 um - 189 CM - 193.0 MM - 982 nm -170 nm - 69 MM - 847 nm - 705 cm -836 mm - 414 mm -219 A -762 CM - 178 nm - 499 mm -692.5 CM -318 A -640 UM -689 nm - 827 nm -903 MM -759 CM -434 mm -140 MM -343 NM - 794 NM -114 cm -724 mm - 337 um - 821 CM -447 CM - 918 cm -368 UM -414 UM - 733 um - 810 mm - 772 um - 285 UM - 192 nm -675 um - 938 A -337 CM - 549 UM - 714 um - 637 MM - 761 NM - 143 mm - 185 A - 626 mm -786 UM -954 CM - 669 CM - 442 MM - 53 um - 851 MM -799 UM -731 mm -442 mm -930 um -607 NM -808 cm - 709 cm -673 A -36 mm -720 cm -719 MM - 24 A - 521 nm -371 nm -347 A -1000 CM -121 A - 573 cm - 798 MM - 32 NM - 679 UM -164 mm - 37 A - 491 MM -599 UM -538 CM -234 um - 183 cm - 394 cm - 862 mm - 404 MM -996 cm - 240 UM - 94 um - 558 UM -464 cm - 618 CM - 532 cm -770 A - 469 MM -267 cm - 438 CM - 734 mm - 318 mm -908 MM -20 A - 843 UM -191 CM -304 MM - 277 CM - 364 UM -66 CM -47 NM - 932 A -867 UM -546 CM -501 cm - 639 cm -348 um -893 cm -378 CM - 809 NM -332 um - 333 um -714 cm -344 mm -750 NM -3 A -783 UM -952 A - 937 um - 265.5 mm - 439 cm -704 CM -281 MM -43 A - 461 um - 838.0 nm - 409 MM -539 um - 708 nm - 204 UM - 619.0 NM -405 MM - 773 um - 803 um - 44 NM -839.5 NM - 255 CM - 493 CM -37 mm - 132 cm - 819 um -414 cm - 65 nm - 64.5 nm -292 um -125 mm - 937 cm - 895 cm - 229 cm -347 nm -222 A -743 NM -8 cm -161 CM - 352 um - 672 nm -68 mm - 380 UM -684 um - 279 um - 110 UM - 809 CM -307 nm -875 cm - 158.0 A -316 um - 233 nm - 419 CM - 38 MM -115 MM -401 mm -111 MM - 910 A - 972.0 cm - 884 cm -305 um - 812 mm -9 NM - 629.0 MM - 603 NM - 489 UM - 75 mm - 827 mm - 691.5 nm - 392 um - 201 MM - 842 nm - 39.0 cm - 645 mm -184 UM -36 A - 443 MM - 483 um - 83 NM -261 nm -481 mm -421 nm - 269 A -357 MM -418 nm -950 MM -817 um - 247 cm - 516 UM -209 NM - 95 A - 144 CM - 189 UM -13 MM - 903 um -564 nm -832 nm -140 cm - 828 um -797 MM -921 MM - 636 NM - 466 NM - 531 MM -518 UM -725 NM -684 cm -340 A -91 MM - 434 um -235 NM -78 nm -683 UM - 44 nm -349 A -298 CM -672 CM - 581 MM -545 A -588 MM - 460 UM - 171 um -655 MM -6 mm -581 nm - 485 CM -807 mm - 920 um - 883 NM - 595 cm - 932 cm - 710 NM - 916 mm -163 UM - 132 nm -21 UM - 131 cm - 779 cm - 429 UM - 431 mm -913 mm - 608 MM -778 UM - 531 nm -859 UM -436 um - 117 A -739 MM - 674 um -393 UM - 319 UM - 511 A - 980 um -403 nm -114 UM - 717 mm -73 um - 629 nm -599 mm - 846 mm -917 NM - 541 CM - 9 um -838 um - 503 cm - 972 um -618 UM -857 A -541 CM -817 A - 126 NM -256 nm -9 UM -764 nm - 841 nm -918 nm -626 MM - 222 cm -100 A -656 UM -247 nm -472 A - 90 A -112 A - 401 CM - 994 CM - 334.5 A -300 A - 6 NM - 780 um -748 mm -699 UM -156.0 cm - 430.5 NM - 827 NM - 64 mm - 623 A -22.5 mm -482 nm - 540 cm -956 MM -95 um - 638 CM -200 mm -205 UM -806 MM - 873.0 CM - 194.5 nm - 126 um - 684 cm -430 mm -957 NM -999 CM - 608 MM -996 CM - 262 UM - 222 cm -176 nm - 415 MM - 898 MM -514 CM -862 NM -776 UM - 1 CM - 175 A - 555 MM -406 NM -683 UM - 693 NM - 412 cm - 579 um - 835 A - 711 cm -314 um -145 CM -802 mm - 152 nm -521 cm -262 NM - 639.5 nm - 207 UM -282 UM - 209 cm -452 um - 470 NM - 381.5 A -430 nm -554 NM - 909 um -129 CM - 536 cm -12 CM - 148 A - 949 CM - 730 nm - 628 CM -847 MM - 352 UM - 812 UM - 795 cm - 455 NM -148 cm - 405 CM -511 nm - 241 MM -655 UM -702 mm -229 UM -575 NM -723 um - 995 CM - 557 cm -356 cm - 847 UM - 299 cm - 996 um - 959 CM -321 NM -848 cm - 269 MM - 668 CM - 716 A - 36 cm - 991.0 NM -818 mm - 861 mm - 909 A - 562 NM -952 nm - 750 UM -378 A -377 A - 675 A - 108 mm - 651 mm -904 um - 430 nm -685 cm - 254 um -598 NM - 31 A -989 MM - 242 um -265 NM -664 MM - 732 A - 20 nm -988 CM -545 NM -659 MM -846.0 mm - 294 mm -737 CM -830 nm - 781 um -336 nm - 354 MM - 934 A - 72 mm - 173 mm -519 CM - 994 nm - 942 cm -406 um -106 MM -518 um -237 MM - 167 um -685 A - 220 MM - 245 CM - 93 CM -206 mm - 822 mm - 886 nm - 495 cm - 552 UM - 423 UM - 185 UM - 738 CM - 427 um - 785 UM - 955 A -67 NM - 815 nm - 883 UM - 145 nm - 537 CM -847 CM - 286 A -724 CM - 21 CM - 223 mm -8 um -182 mm - 609 um - 974 UM -421 NM -484 nm - 648 MM - 716 A - 669 um -21 NM -238 mm -749 nm -294 cm - 883 NM -160 cm - 801 UM - 933 MM -854 NM - 592 mm -414 nm -746 cm - 716.5 mm -987 NM -57 A -465 MM -654 cm - 122 cm - 552 cm - 999 UM - 536 CM -138 cm -793 MM - 768 CM - 841 NM -171 CM -893 cm -687 A -520 CM -98 NM - 212 nm -305 mm - 298 cm - 539 A -913 mm -350 mm - 416 MM - 935 A - 386 nm -622 nm -35 um -58 nm -151 CM - 783 NM -692 A - 14 UM - 787 UM -784 A - 51 CM - 479 UM -436 A - 428 NM - 553 um -731 MM - 896 nm -389 UM -866 UM - 955 CM - 210 nm -170 mm -579 UM - 869 cm - 560 cm -279 mm -529 cm - 468.0 um -751 um - 185 um -418 CM -857 nm -622 UM - 750 cm - 645 UM - 299 um - 469 MM - 455 CM - 108 CM - 638.0 MM -174 nm -277 NM -678 cm -541 A -578 um - 764 mm - 78 MM - 369 cm - 715 NM - 812 UM - 661 cm -953 um -680 NM - 155 um -476 UM - 418 NM - 648 nm - 284 MM - 817 A - 514 CM - 816 NM -808 UM -190 nm - 517 UM -330 MM - 863 UM - 973 A - 579 CM - 651 nm - 19 cm - 286 UM -489 A -334 MM -14 MM - 359 UM -156 cm -156 UM - 654 um -289 A - 962 UM - 617 CM - 139.0 UM -630 MM - 581 mm - 692 NM - 141 mm - 35 MM -535 cm -877 cm -313.0 NM -921 nm - 903 mm -539 cm - 678 cm -448 MM - 370 cm - 935.0 um -232 nm - 640 cm - 983 A - 151 MM - 269 nm - 144 NM - 578 um - 939 MM -26 um - 442 CM -929 A -865 CM -180 mm -447 cm -308 um - 38 NM -199 cm -173 mm -317.5 cm - 648 mm - 161 um -687 cm - 628 um - 394 MM - 238 NM - 225 NM - 172 CM - 489 um -245 mm - 58 MM -64 mm -841 um - 452 MM -481 NM -966.0 MM -319.5 um - 588 MM - 875 mm - 465 UM - 254 MM -547 UM - 723.0 nm - 855 um -173 mm -992 NM - 3 nm -47 NM -475 NM -811 UM -274 um - 698 CM - 523 cm -188 um -58 um - 818 mm -151 um -551 NM - 884 A -450 CM -562 MM -245 um -474 A -735 A - 944 NM -518 A -621 A -355 MM -214 mm -623 nm - 292 CM - 8 A -633 CM -573 mm - 531 CM - 580 mm - 769 MM - 541 mm -785.5 cm - 323 UM -693 A -825 NM - 67 UM - 885 nm - 41 CM - 593 um - 627 cm -655 NM -509 CM -362 nm - 722 CM - 540 um -991 MM - 348 cm - 745 NM -182 A - 455 um - 971 MM -736 nm -104 A -970 A - 215 um - 233 nm -197 cm -706 cm - 595 UM - 802 CM - 951 cm - 46 cm -448 MM - 736 cm - 345 UM -337.5 cm -407 CM -630 mm - 589 MM - 133 MM - 365 cm - 346 cm - 689 cm - 424 mm -692 cm - 704 um -16 A - 142 nm - 525 NM - 927 A - 168 nm -957 cm - 690 mm -946 MM - 543 MM - 706 mm -770 CM -654 cm -1 cm - 837 nm -689 NM -830 UM -601.0 NM -322 cm - 45 MM - 866 nm -574 NM - 614 cm -564 nm - 25 um - 825 um -767 MM - 156 MM - 905 nm -434 CM - 123 A - 951 CM -230 NM -739 mm - 848 nm - 559 MM - 737 A -867 UM - 809 cm - 353 A - 962 NM -953 um -79 nm - 443.5 nm -734 nm - 137 A -268 CM - 783 nm -161 UM - 230 mm - 624 um - 925 NM - 197 cm -653 um - 558 cm - 850 MM - 788 mm -279 MM - 807 UM - 650 CM -11 UM - 131 mm - 177 UM -521 mm - 2 MM - 426 MM - 43 MM -707 NM - 630 cm - 817 um -558 mm -97 UM -343 mm -784 um - 183 mm -340 cm - 808 A - 515 A -591 nm -379 MM - 43 nm -243 cm - 183 UM -467.5 nm -947.5 mm -732 UM -276 um - 562 A - 572 mm - 530 MM -882 mm -37 UM -448 MM - 62 MM -692 cm -58 CM - 264 nm -631 UM -317 um -155 mm -320 MM -746 NM - 352 UM - 345 cm -492 NM -722 mm -956 UM -181 um - 382 cm -942 MM -538 A - 761 nm -949 NM - 992 MM -593 A - 750 A - 145 nm -32 UM - 458 MM -703 um -678 NM - 22 um - 749 cm -360 nm - 110 mm -855 UM -822 cm -829 nm -458 um -856 MM - 702 UM -944 MM -902 MM - 215 UM -979 mm - 992 CM - 443.5 A -336 UM -125 cm -32 UM - 916 CM -596 NM -95 UM -494 UM - 347 nm -530 MM - 455 cm - 563 CM -459 MM -305 CM - 64 um - 981 nm - 55 cm -819.5 mm - 817 CM - 761 A - 510 CM - 420 A - 977 MM - 114 CM -249 um -873 cm -4 UM - 741 mm - 176 UM -861 cm - 49 A - 834 UM - 296 A -990 mm - 97 NM -786 cm - 989 A -441 UM - 439 mm - 820 UM -742 cm -767 NM -523 mm -557 cm -471 UM - 244 NM - 962 UM -162 CM - 181 nm -290 A - 417 NM - 2 mm -723 UM -186 A -341 nm - 54 UM -363 nm - 694.0 A -337 MM - 410 NM - 163 cm - 831 CM -557 nm - 123 um -924 UM - 926 MM - 412 CM -21 cm - 609 CM -540 um -221 CM -212 cm - 390 nm - 561 CM -489 um -523 cm - 222 UM -990 cm -760 A - 597 CM - 603.0 A - 744 NM - 954 nm - 204 nm - 995 mm - 470 mm - 803 nm -16 MM - 229 CM - 383 nm - 404 cm -606 cm -428 cm - 271 MM - 700 A - 259 mm -483 mm - 859 um - 816 MM - 961 CM -657 UM -830.5 nm - 696 UM -164 um -109 mm - 451 UM - 728 MM - 405 nm - 690 cm -577 cm -426 cm -696 NM -423 NM -576 NM - 607 cm - 692 MM - 491 MM -939 um - 471 A -738 NM -776 A -432 CM - 48 MM -949 mm -623.0 A -131 cm -489 cm -273 MM -741 NM -840 nm - 437 UM - 192 um -169 CM - 729.5 um -190 NM - 817 cm -696 A - 450 um -114 nm - 901 A - 958 mm - 328 MM - 511 A - 391 nm -273 nm - 711 A - 448 cm -348 NM -359 A -770 cm -807 UM - 350 NM -937 A - 187 nm -794 A - 923 cm - 876 nm - 265 um - 273 A -319 cm - 531 MM - 344 nm -609 CM -962 CM - 508.5 cm - 244 UM - 721 mm - 46 mm - 187 nm -221 nm - 423 mm - 935 UM -833 nm - 260.5 CM -948 nm -297 A -204 MM - 141 cm -646 A - 317 mm -428 NM - 851 CM - 818 UM -841 um -203 cm - 623 nm - 917 nm - 30 cm - 304 NM -450 mm -240 nm -552 mm -775 cm -849 CM - 712 NM - 220 MM -675 um - 943 CM -87 mm - 27 cm -29 cm - 180 mm -523 A - 392 A - 810 cm - 342 UM -266.0 CM -105 MM -660 UM -369 A - 576 NM - 416 um - 438 UM -173 um - 208 MM -629 NM - 543 mm -89 cm - 184 NM - 897 um - 853 mm - 103 um - 58 MM - 272 um -266 MM - 66 nm -62 nm - 129 UM -600 um -99 MM -748 cm -286 NM -911 um - 462 nm - 230 UM -534 mm -144 um -778 um -458.0 um - 49 um - 865 NM -496 UM -680 UM - 668 NM - 47 CM - 927 UM - 88 CM -179 MM - 278 UM -466 um -130 A -565 mm - 256 nm -939 UM -437 mm - 825 CM -344.5 MM -656 CM - 873 NM - 586 MM -105 nm - 255 nm -475 A -277 um - 445 CM -988 cm -990 um - 499 MM -714 CM -518 cm -507 um - 588 A -541 um -508 UM - 872 UM -187 nm -482 CM - 87 NM - 463 NM -712 MM - 998 NM -768 NM - 678 cm -731 MM -259 mm - 932 A - 164 UM -323 cm - 325.5 NM -186 MM - 798 cm -281 um - 189 UM -461 A - 505 UM - 793 A -582 mm -795 um -635 mm -285 nm - 715 MM -809 CM -154 nm -618 MM - 294 mm -284 MM - 52.5 um - 910.5 A - 885 UM - 675 mm - 420 nm - 359 CM -612 MM - 197 mm -731 UM -640 MM -950 NM - 765 NM -389 A - 390 mm -681 um -785 mm -75 mm -927 CM -488 A - 244 MM - 799 NM - 647 nm - 527 um -968 MM - 401 CM -973 nm -638 nm - 522 um -440 NM -829 A -708 MM -744 A -329.0 CM -115 NM - 583 UM - 47 um - 281 mm -438 um - 407 MM -729 mm -683 nm - 44 MM - 471 UM -251 NM -623 MM - 305 CM -962 A - 860 mm - 44 CM -624 nm -988 A -385 cm -543 NM - 544 A -665 MM - 955 mm -113 um - 877.0 mm - 529 NM -50 MM -598 UM - 189 CM - 315 nm -20.0 um -245 um - 796 MM - 543 UM -145 um - 903 NM - 650 UM -332 cm -704 MM -41 cm -696 cm -965.0 nm -766 CM - 851 CM - 425 cm -508 UM - 251 MM -392 UM - 625 um -797 UM -935 NM - 181 cm -178 CM -926 CM - 321 cm - 861 mm - 894 nm -603 um -767 mm - 965 UM -483 NM - 922 um - 611 A -486 um -98 UM - 934 um -118 cm -497 cm -663 um -539 nm - 712 MM - 287 MM -519 UM -551 um - 453 nm -680 CM - 246 UM - 622 nm - 762 CM - 52 A -99 MM -304 CM - 628 CM -629 nm - 710 CM -478 UM -87 UM -916 UM - 323 cm -748 nm - 647 um - 682 um - 334 MM -629 cm - 80 A -545 CM - 235 CM -644.0 MM - 336 UM - 888 mm -465 mm -599 NM -559 mm -45 CM -969 nm -513 mm - 587 NM - 763 um - 741 cm - 775 NM -313 MM - 579 UM - 990 um - 74 um -108 NM -911 A -363 um - 298 A -313 UM -723 um - 210 um -377 CM -38 A -47 um - 974 CM - 19 um - 401 A - 618 cm -918 NM - 389 um - 2 MM - 820 MM -117 um -631 cm - 253 A -936 MM -337 NM - 390 A - 966 nm -753 mm -233 cm -19 NM - 882 um - 311 cm - 550 MM -302 cm -6 MM -656 UM - 55 A - 944 nm - 729.5 nm - 359 cm - 15 CM - 159 MM -267 mm - 401 nm -96 A - 714 um -565 MM - 617 UM -40 nm -247 MM -277 CM - 276 nm - 198 NM - 662 mm -615 CM - 604 A - 247 NM -54 cm - 428 CM -354 NM - 837 A -326 CM -240 MM -922 nm - 21 CM - 675 A - 514 um - 823 NM - 266 um - 583 MM -835 CM - 689 UM - 962 nm -254 cm - 238 NM -785 nm - 471 mm - 291 mm -176 UM - 311 A -158 NM - 691 CM - 464 MM -329 um -455 mm - 131 nm - 730 MM - 977 A - 988 mm -919 nm - 199 nm -919 nm -478 um -362 nm -14 CM -874 A - 465 cm - 559 um -460 CM -31.5 cm - 141 UM - 411 cm - 187 CM -531 A -548.0 UM -53 UM - 459 CM -394 UM - 725 NM -20 A - 740.0 CM - 557 mm -114 CM -577 um - 664 mm - 576 CM -238 CM -532 MM - 540 nm - 495 MM -274.5 A - 298 NM - 347 MM - 357 mm - 759 UM - 463 MM - 714 NM -638 NM -750 CM - 703 cm -201 um -872 A -508 A -637 nm - 446 MM - 34 MM -120 nm -960 A - 129 nm - 499 nm -76 um - 223 NM -74 um - 570 A -766 UM - 412 nm - 893 mm - 253 nm -579 cm - 948 MM -409 UM -46 NM -131 A -156 CM -40 nm -936 um -467 um - 182 NM - 418.0 cm - 499 um -672 NM - 744 UM - 600 CM -974 nm - 957 um -835 nm -434.0 NM -356 cm -922 cm -551 mm -69 um -123 MM - 757 NM - 354 mm - 787 NM -604 A -69 cm -94 mm - 224 MM -998 nm - 692 mm - 651 MM -477.5 nm -272 cm - 574 A -452 nm -105 UM - 180 mm - 909 nm -67 NM - 908 mm - 785 um - 62 um -512 um - 939 mm -759 nm - 172 CM -834 cm - 20 cm - 380 um - 287 mm - 962 mm - 597 cm -883 CM -115 cm - 744 um -887 nm - 907 MM - 733 nm - 969 NM -911 NM - 597 UM -6 nm -773 nm -236 nm - 756.5 A -85 MM - 671 MM - 294 um -993 MM - 157 A - 225 NM - 460 A -249 A -49 nm -567 cm - 252 MM -632 A - 335 A -206 cm -962 CM - 224 CM -480 UM - 994 NM -504 UM - 311 cm - 909 um -17 um -820 NM - 861 cm - 962 cm -748 CM -232 NM - 898 MM -700 nm -430 mm - 209 mm -170 nm - 211 A - 854 UM - 387 CM - 148 NM - 976 NM - 928 NM -976 MM -357 nm -237 NM - 704 nm - 135 A -207 MM - 4 UM -505 NM -732 um -335 MM - 192 CM -941 um - 963 cm - 290 NM - 257 cm - 466 nm -151 mm -971 A -597 CM -947 MM -874 A -670 nm -693 NM - 242 CM - 797 UM - 378 um -91 A - 815 UM - 934 um -14 CM - 282 UM - 596 um -150 A -400 um - 572 um -974 cm - 924 UM -370 UM - 965 CM -313 um - 613 cm -887 UM - 124 MM - 571 mm -267 MM -93 MM -200 NM - 948 nm -606 mm -307 A - 53 MM - 183 mm - 368 UM -819.0 NM - 383 NM -562 A - 804 A -745 NM - 61 um - 979 CM -395 cm -909 um -85 CM -34 mm - 932 A - 881 MM - 723 NM - 764 CM - 332 um - 747 A -62 MM -498 um -135 mm - 397 UM -596 cm - 268 UM -404 CM -839 mm - 586 A -879 CM - 632 cm -652 NM - 135 NM -894 mm - 574 MM - 594 NM - 120 A -186 mm - 234 NM - 277 cm -682 NM -420 um -856 NM - 373 CM - 594 cm -982 cm - 172 UM - 777 CM -203 NM - 773 UM -226 MM -979 CM -61 cm - 481 um -263 CM - 246 NM -495 nm - 745.0 NM - 913 MM - 35 UM - 851 cm - 802 CM -73 mm - 387 cm -379 NM - 45 MM -198 NM -218 um - 419 um -380 CM - 777 nm -607 nm -25 um -644 A - 499 um -527 NM - 613 nm - 398 A - 453 CM - 932 cm - 462 CM - 297 CM - 376 um -724 A - 733 cm -337 nm -474 UM - 170 MM -49.0 CM -375 MM -63.0 CM - 681 NM - 801 nm -565.5 MM - 841.0 CM -183 A -286 A - 562 UM - 163 NM - 768 NM -259 CM - 671 mm -659 um - 310 CM -946 UM - 425 mm -69 mm - 39 UM - 197 A -523 MM -273 cm -922.0 cm - 702 mm - 797 um - 871 A - 368.0 cm -316 um -431 um -363 mm - 927 A -767 nm -334 CM -483 nm - 241 CM -331 A -874 um -906 NM -944 um -150 UM -739 A -631 um - 480 A - 997 UM -607 nm -610 NM -259 MM -473 cm -800 cm -197 NM -999 mm - 328 um -227 um -806 CM - 611 MM - 449 CM -396 A - 650 A - 175 MM -703 UM -506 NM - 693 CM -791 UM - 272 A -86 UM - 710 cm - 470 nm - 82 NM - 391 UM - 980 MM -676 NM - 663 nm -767 CM - 422 NM - 335 UM - 45 CM - 325 mm -962 A -1 um - 842 cm - 966 UM -602.0 mm - 194 A - 607 CM - 65 NM -855 A - 148 um -207.5 mm -58 CM - 165 CM - 502 MM - 582 nm -592 nm - 692 mm -212 MM -80 MM -8 um -638 MM - 396 MM -584 nm - 140 mm - 336 CM -532 um - 657 cm - 633 CM - 887 cm -426 cm - 242 MM - 518 nm -150 MM - 689 UM - 268 MM -531 cm - 629 CM -487 nm -756.5 um -771 mm - 902 nm -806 um -364 A - 996 CM - 138 nm - 105 CM - 629 cm - 257 cm -639 um -974 mm - 348 MM -812.0 NM -980.0 NM -593 um - 32 UM - 281 um -711 NM -620 mm - 787 cm - 400 cm -170 MM -500 cm -265 MM -495 UM - 523 NM -590.0 um -372 um -20 NM -992 A - 870 MM - 822 mm - 35.0 mm -583 NM -32 NM - 711 UM - 767 mm -363 MM - 424 A -943 mm -763 NM - 2 cm - 803 mm - 144 um -275 mm - 744 cm - 858 NM - 866 A - 892 UM -408 A -982 NM - 445 NM - 470 mm -397 cm - 138 nm - 567 NM -406 CM - 759 cm -426 cm -94 NM - 746 MM - 993 UM -811 um -977 NM - 138 cm - 522 A - 130 MM -674 UM -783 CM -729 NM - 39 A - 449 NM - 711.5 UM -233 nm - 94 nm -171 MM -512 CM -663 NM - 707 CM -708 MM -898 NM -269 NM - 114 UM - 254 CM - 641 nm - 293 UM - 939 A -73 UM - 951 CM -109 nm -286 nm - 822 A - 492 UM -483 mm -544 MM -734.5 nm -118 cm -156 um -872 nm -664 um -660 nm - 814 mm - 284 CM -28 um -878 MM - 91 mm - 949 nm - 545 A -842 UM - 47 cm - 386.5 NM -830 A - 701 CM - 119 um - 96 NM -636.5 CM - 577 mm -108 MM -563 CM - 725 NM - 378 mm - 100 CM - 258 um -186 cm -172 nm -142 A -295 CM -321 UM -162 um - 779 CM - 542 MM - 533 cm -883 UM -957 CM -127 CM - 547 cm -658 NM - 213 cm -587 UM -398 NM - 404 um -517 A - 423 MM - 159 mm -422 CM -757 MM - 994 A -201 A -72 NM -813 A - 616 mm -671 CM -560 um - 280 cm - 350 nm - 305 MM - 742 NM - 608 NM - 97 nm - 858 nm - 389 NM - 674 CM -245 nm -241 um -187 nm - 86 UM - 385 UM -225 mm - 146 nm -75 cm - 949 CM -129 MM -891 CM - 888 cm - 122 nm -557 um - 767 NM -320 nm - 873 CM -98 CM -178 um -442 um - 780 A -761 nm -999 CM -567 MM -718 um -814.0 cm -357 UM - 814 nm - 621.0 mm -256 UM - 911 cm - 598 cm -819 NM - 717 cm - 701 nm - 44 um - 497.5 um -450 cm -537 um -323 mm -58 MM -823 cm - 35 um - 424 MM - 121 CM -627 MM -669 MM -36 CM -509 nm - 571 nm - 436 NM -969 nm - 860 NM - 7.0 MM - 761 mm -269 NM - 285 UM - 788 UM -656 cm - 629 NM - 259 CM - 210 CM - 56 UM - 604 A -560 um -981 mm -868 cm - 7 UM - 532 CM - 850 mm -402 A -204 um -558 MM - 887 UM - 837 NM -848.0 um -146 NM - 549.0 CM -145 um -830 MM - 266 UM -710 MM - 457 UM - 663 NM - 928 UM -823 MM -867 CM -229 MM -586 CM -749 um -756 nm -370 mm - 532 nm -76 A -307 UM -260 cm -491 mm - 620 nm - 426 UM - 942 CM -30 NM -270 cm - 27 mm - 840 mm - 403 nm -458 nm -541 MM -108.5 NM - 813 MM - 917 um - 556 mm -492 A -944 mm -838 um -165 MM -119 NM -347 CM - 426 nm - 706 mm - 969 cm - 552 MM -159 UM - 223 UM - 189 UM -644 nm - 218 um - 696 NM - 26 MM -82.0 um -743 UM - 226 CM -971 UM - 460 A - 920 mm - 410 NM - 68 UM -771 MM - 884 A - 452 CM - 924 nm -508 NM - 201 MM - 901 CM -312 cm -440 NM -563 A - 157 nm -67 um -867 um -366 NM - 251 nm -491 nm -950 CM -225 MM - 770 A - 495 mm -843 MM - 765 nm -935 NM - 868.0 um -106 mm -360 cm - 230.5 cm - 960 um -169 NM -511 nm - 375 UM -546 mm - 566 nm - 866 NM - 310 nm -551 cm - 175 nm -218 CM - 289 nm -927 UM - 549 nm -247 um - 125 CM - 365 NM - 148 CM - 793 UM -718 UM - 972 A - 352 um - 935 um - 892 um -565 UM - 537 MM - 303 nm -615 CM - 684 UM -553 CM -202 mm - 282 nm -54 nm - 956 mm -540 um - 149 nm -741 cm - 662.0 A -88 MM - 563 CM -195 MM - 223 CM - 291 A -887 um - 402 CM -225 um -51 UM -822 NM - 537 A - 653 um - 478 mm -819 mm - 772 mm -99 CM - 680 NM - 373 nm -615 mm -990 CM -506.0 mm -765 cm -727 mm - 572 UM -660 mm -517 NM -99 UM - 735 nm - 94 nm -170 MM - 235 A -672 um -848 UM - 607 CM - 257 mm - 476 cm -795 UM - 868 NM -734 mm -875 A -893 um - 570 mm -901 CM -721 NM -340 mm - 963 mm - 258 um - 400 cm -696 MM -771 NM - 905.5 A - 127 UM -247 A -849 NM -153 CM - 669 MM - 462 CM - 742 um - 611 um -960 nm -810 nm - 264 MM -631 A -335 nm - 448 CM - 949 cm -660 A -276 NM - 51 cm -409.5 MM -70 mm - 923 UM - 469.0 nm -785 um -896.0 nm - 96 nm -84 A - 552 CM -223 cm - 914 A - 536 mm -558 cm -452 cm -366 A -760 nm - 774 cm - 547 CM -13 UM - 4 MM -961 mm -214 um -211 mm -938 CM - 204 um - 177 CM -485 CM - 875 NM - 598 CM -103 CM - 464 nm - 678.5 NM -189 UM -219 mm - 765 MM -231 cm - 274 CM - 676 NM -88 A - 557 nm -572 NM -420 UM - 366 cm -777 nm -230 mm - 624 um -151 A -139 cm -694 um -955 um - 773 nm -508 UM - 924 CM - 466 MM -54 UM - 499 NM - 368 mm - 695 um -447 NM - 130 CM - 584 cm - 809 um - 904 mm - 458 cm -783 UM - 176 MM -993 CM -182 cm - 131 mm - 826 um - 623 A -896 A -607 CM -235 UM -189 cm -126 nm - 54 MM - 792 A - 126 cm - 589 MM - 224 MM - 2 UM -92 MM -196 CM - 925 CM - 441 um -166 um -395 nm - 304.5 A - 53 UM -736 NM - 797 NM -503 A - 321 cm -787 mm - 631 CM - 21 CM -76 CM - 496 A -557 NM -840 CM - 984 nm -806 CM -270 CM - 270 MM -122 CM -934 A -32 nm - 106 CM -364.5 NM - 359 nm - 645 um -608 mm -933 nm - 245 CM -22 UM -967 nm -45 NM - 947 UM - 855 UM -127 MM -133 CM - 994 mm -794 cm - 972 mm -976.5 MM - 679 MM - 580.0 nm -835 UM - 427 UM -469 mm -951 UM -782 A - 949 cm -555 um -161 NM -485 NM - 694 um -188 um - 743.0 CM - 230 um -624 nm -755 UM - 80 um -924 A -212 A - 684 um -742 NM - 383 um -601 UM - 949 nm - 952 UM -780 cm -63 nm - 129 CM -860 CM - 757 MM - 55 mm -940 cm - 604.5 um -434 nm - 981 UM - 95 CM -201 um - 655 MM - 968 CM - 26 NM - 40 cm -357 CM -870 nm -798 um -839 um -230.5 NM -987 um -616 A -890 nm - 854 nm -99 mm - 2 MM - 155 CM - 402 nm - 649 A -938 nm - 522 nm - 802 A -481 MM - 676 UM - 966 CM - 465 um -526.0 MM - 752 um -423 A - 91 CM - 794 CM -41 CM - 324 A - 139 cm - 877 CM -906 um - 776 A - 192 A - 375.5 UM -591 nm -209 MM - 949 MM - 887 UM - 558 A -720 CM -465 cm - 531 CM -54 MM - 577.0 MM -285.5 um -190 UM - 13 CM - 498 cm -732 um - 640 um - 398 mm -251 CM -303 MM -670 UM - 631 cm -520 UM -920 A -259 nm - 483 cm - 509 nm -406 UM - 32 UM -114 A - 959 MM -402 NM - 240 MM -280 UM - 857 um - 512 UM -838 MM -203 nm - 217 UM -273 NM - 317 CM -628 CM -761 nm -705 um -816 mm - 599 UM -473.5 cm - 707 UM - 128.5 UM - 113 mm - 712 mm - 4 cm -898.5 nm - 831 UM - 94 um -780 UM - 584 A - 155 A -243 nm -323 A -147 nm - 635 mm - 312 nm -691 NM - 730 A - 881 CM -573 UM - 444 NM - 40 MM - 347 mm -441 cm - 216 cm -873 CM -634 CM - 454 UM -277 A -918 MM -909 A -420 A - 963 cm - 568 A - 877.0 cm -395 mm - 836 A - 981 MM -824 CM - 691 mm - 996 mm -666 MM -960 A -962 um -236 A - 880 CM - 568 um -45.0 um - 756 cm -620 um - 631 UM -161 A -865 UM -773 A -875 CM - 253 CM -342 A -747.0 MM -663 um -994 MM -716 MM -495 UM -986 CM - 676 UM - 91 UM -155 um -792 UM -686.0 mm - 516 um - 445 mm - 461 um -882 NM -422 mm - 177 NM -907 CM -258 MM - 507 CM - 182.0 UM -170 CM - 330 nm - 123 mm - 120 MM -406 CM - 53 UM - 583 um -938 MM - 279 nm - 528 cm -243 cm -137.0 um -926 MM -222 CM -807 NM - 10 mm -507 mm -612 mm - 70 MM -719 cm -574 um - 653 cm - 537 nm - 420 UM -813 CM -23 nm - 749 A - 712 um -326 A - 485 UM -809 cm - 144 UM - 213 MM -650 CM - 616 um - 791 MM - 519 UM - 723 cm -926 mm -452 UM - 329 UM -597 CM -577 UM -282 UM - 397 MM -538 cm -333 MM - 131 UM -962 CM - 710 A -608 MM -245 um -411 cm - 639 mm -673 mm - 134 A - 944 MM - 270 NM - 359 A - 400 mm - 863 UM -612 A -99 NM - 874 UM -48 MM - 812 A -297 CM - 521 MM -450 A -126.0 NM - 388 um - 167 MM -402 UM -489 mm - 99 mm -531 mm -361.0 A - 732 MM -545 NM - 82 A -586 A -566 um - 291 UM - 414 NM - 760 A - 220 UM -821.5 UM - 158 A - 323 A -716 NM -832 mm - 205 nm -618 CM -762 CM - 806 nm -624 UM -658 nm - 11 NM - 14 A -63 cm -109 A -7 nm -433 CM - 215 um - 842 UM -787 MM - 441 nm - 28 um - 912 A - 943 MM -796 um - 337 nm - 67 CM -205 A -728 um - 422.5 A -692 nm -685.5 nm - 71.5 um - 231 cm -844 MM -22 MM - 602 A - 213 nm -205 mm -22 nm -436 mm -573 um -908 mm -138 UM - 739 mm - 346.5 A -751.5 UM -591 CM -706 A -558 UM - 693 UM - 59 A -525 nm - 903 CM - 57 UM -729 mm - 569 um -131 mm -892 A - 631 cm - 494 CM - 607 MM - 355 nm -671 CM -641 cm -649 nm - 99 UM - 618 um -610 um -800 MM - 892.0 mm -180 NM -635 NM - 129 mm - 514 UM - 809 nm - 678 NM -125 nm - 747 UM - 684 NM - 170 CM -595 NM - 38 NM - 548 A - 348 nm - 751 UM - 354 nm -747 nm - 411 cm -846 nm -890 CM -970 UM - 230 mm - 393 A - 83 MM -9 cm - 215 mm - 532 MM -557 mm - 498 mm -254 CM - 752 NM - 232 A - 86 MM -44 UM - 903 CM - 925 um -822 cm - 922 CM - 266 mm - 313 cm -622 NM -334 cm - 728 mm - 148 MM - 644 CM - 508.5 mm -102 CM -993 mm - 454 mm -148 nm - 592 MM - 74 CM - 579 cm -17 cm -796 nm - 704 mm - 519 mm -533 UM -997 UM - 960 cm - 929 UM -8 cm -893 um -333 mm - 252 MM -254.5 um - 84 UM -25 A -768 CM - 333 cm -538 MM - 15 CM - 724 mm - 7 nm -671 um -511 mm - 324 nm -35 mm - 212 CM - 13 UM -57 um - 938 CM -932 A - 748 mm -402 UM - 245 nm -33 A -391 cm -955 UM -328 A - 348 CM - 723 CM - 282 NM -962 UM - 455 mm - 189 CM -520 cm -691 NM -362 MM - 91 CM - 840 NM - 494 cm - 345 CM - 454 mm -424 nm -522 um - 575 A -349 NM - 65.5 nm - 856 nm -644 nm - 281 CM - 261 MM -755 cm - 790 A -127 um - 5 A - 363 CM - 594 mm -820 mm - 408 mm - 678 UM -922 A -129 cm -977 nm -601 A - 626 A - 490 nm - 487 mm - 798 A -615 nm - 295 cm - 342 mm -968 UM -105 um -364 UM - 904 MM - 682 NM - 890 cm -676 MM -304 NM - 880 um - 558.0 mm - 554 NM -772 um -565 UM - 779 MM -523 CM -325 A -864 nm - 709 um - 453 NM - 467 cm - 6.5 A - 88 UM -596 A - 642 cm - 204 NM - 526 CM - 175 UM - 528 MM - 905 NM - 822 um - 557 CM -750 nm -905 um - 56 cm - 978 nm - 192 MM -471 CM -581 A - 11 nm -249 A - 195 nm - 814 nm - 77 MM - 986 um - 7 A - 828 nm - 258 um - 654 NM - 667 nm -26 cm -837 MM - 877 cm -695 CM - 86 mm -917 CM - 714 CM - 506 NM -429 cm - 118 CM - 4 NM -127.0 A -554 cm - 259 nm - 50 CM - 97 mm -992 cm - 71 A - 207 UM - 453 NM - 14 CM -594 UM -188 CM -500 cm -732 mm -573 A - 819 UM - 377 cm - 639 nm -53 A -507 UM -343 CM -190 mm -701 A - 305 cm - 981 mm -964 um -549 nm - 411.5 A -892 cm -451 A -859 um -280 cm - 236 A - 29.5 A - 366 cm -875 cm -289 MM -259 mm - 472 cm - 252 A -750 A -335 mm - 380 MM - 756 UM -294 NM -199 um - 768 UM - 282 A -801.5 nm - 436 cm - 574 cm -97 A -937 mm - 851 mm -55 NM -737 um - 188 NM -468 mm -312 UM - 904 UM -837 NM - 985 cm -720 nm -343 mm - 133 nm -494 cm - 80 A -534 cm -970 cm -369 MM -844 UM -681 UM - 53 cm -37 A -930 A -924 nm - 800 NM -76 nm - 879 CM - 330 nm -801 nm -373 NM -241 nm -984 mm -870 mm -483.5 cm -633 MM - 187 nm - 415 CM -388 MM - 499 mm -935 CM -918 MM - 325 cm - 644 MM -679 CM - 711 cm - 811 mm - 289 UM - 41 nm - 316 NM - 671 A - 998 nm - 552 MM - 249.5 A -21 MM -630 cm -477 um - 574 MM -140 NM - 200 MM -745 mm -927 nm -204 MM -790.0 A -109 UM - 402 NM - 166 CM -541 um - 60 nm -338 A -813 nm - 221 CM -634 A - 607 MM -693 CM -627 mm -612 NM - 66 mm - 902.5 MM - 556 NM -335 um - 801 CM -905 A -376 CM - 867 um - 554 cm -471 cm - 736 UM -528 nm - 103 um - 502 nm - 237 UM - 517 nm -66 A - 158 MM -735 A - 730 A -982 UM -797 MM - 724 CM - 346 A - 807 cm -784 MM - 192 A -709 nm - 112 A - 240 nm -971 um -758.0 UM - 323 MM -83 MM -188 NM -169 mm - 761 CM -81 A - 200.0 mm -608 nm - 797 cm - 446 CM - 937 CM - 86 UM - 743 mm -661 mm -804.5 A - 110 cm -291 A -530 NM - 279 nm - 870 NM -172 nm - 316 nm - 826 A - 172 UM -749 CM -671 UM -405 nm -765.5 MM -921 um -246 nm - 223 um - 909 NM -713 cm - 176 cm - 692 cm - 64 mm -750 um - 968 MM - 752 UM - 152 mm - 996 cm -263 A - 672 NM -168 MM - 766 UM - 548 nm -71 cm -675 cm - 676 cm - 276 um - 955 MM -484 um -679 A - 801 um - 727 nm -12 nm - 299 NM -258 NM -533 um - 264 mm - 353 A - 562 nm - 423 NM - 693.0 mm -994 mm -424 MM - 406 UM - 141 mm -400 NM - 560 NM -325 CM - 987 mm -821 um - 552 NM -789 NM - 42 cm -394 CM - 205 nm -760 UM -392 MM - 917 UM - 434 CM -406 mm - 740 MM -999 cm - 776 NM -958 MM -533 nm -968 CM -843 NM -201 cm - 887 nm -666 A -915 CM - 546 UM -7 UM -126 NM - 312 UM - 175 cm - 135 nm -162 cm - 143 mm - 781 MM -617 A - 49 cm -192 A - 7 CM -931 um -319 mm - 448 MM -188 nm -649.0 NM - 426 mm - 28 NM -659 cm - 269 NM -57 cm -846 MM - 515 NM - 187 A -946 nm - 340 mm - 743 A - 277 A - 917 MM -768 nm - 769 MM -748 um -255 MM - 861 mm -856 cm -6 um - 510 NM -622 A - 163 mm - 534 A -199 NM - 105 UM -656 nm - 227 cm -708 nm -491 UM - 668 NM -423 A - 501.0 mm -964 mm -643 CM - 565 um - 831 UM - 302 UM - 787 A - 207 um -360 cm -829 UM - 523 A - 567 A - 460 MM - 738 CM -688 cm - 212 nm -169 cm - 757 UM -321 um - 336 mm - 447 cm -430 cm -374 cm - 894 NM - 174 mm -517 A -274.0 um -809 NM - 369 UM - 686 um -957 CM - 819 A -575 A - 843 NM -470 UM - 230 NM - 572 mm -209 MM -193 NM -294 MM - 770 A -52 cm -665 A - 865 UM -33 MM -392 cm -346 mm - 491 A -639 mm - 486 NM - 805 mm -83 UM - 112 NM - 256 um - 846 UM -945 um -320 nm -956 CM - 617 NM - 440 A -409 um - 457 MM - 839 um -592 A -618.0 um - 874 cm - 476 mm -927 UM -295 cm -843 cm - 869 mm - 74 A -378.0 MM - 500 MM - 97 CM -936 A -921 nm - 69 NM -261 mm -314 A -523 nm -647 mm - 948 cm -803 NM -687 cm - 877 UM - 695 A -668 NM -670 UM - 354 MM -182 MM -189 A - 460 A -698 um -242 NM -976 A - 617 NM -666 MM -13 CM -639 CM -777 UM - 346 MM -125 MM - 294 UM - 70 UM - 143 UM - 875 MM - 87 nm -777 cm - 643 A -819 NM - 492.5 NM -458 mm -426 MM - 306 mm - 342 nm - 328 cm - 90 nm - 679 cm -933 um - 230 cm -232 A -261 um -152 MM - 4 NM - 679 MM - 628 MM - 853 CM -529.5 CM - 333 nm - 845 CM -26 A -877 NM -79 nm - 169 mm -707 mm -377 um - 717 um -645 nm - 263 nm -27 CM -728 MM -157 nm - 816 A -960 UM - 843 nm -415 NM - 814 MM - 475 CM - 664 NM - 5 MM -491.0 UM -838 mm - 496 nm -696 um - 339 UM - 165 UM - 759 A - 786 NM - 688 MM - 413 UM - 789 CM -799 UM - 233 A -961 A -281 mm - 626 CM -817 um -403 UM - 464 nm -205 nm - 722 UM - 614 mm -80 UM - 284 UM -103 NM -724 cm - 417 cm -738 um -877 NM -410 cm - 698 CM -450 um - 96 CM -268 um -385 MM - 435 mm -312 UM - 92 cm - 683 CM -701 cm -443 nm - 467 CM - 984 cm - 548 MM - 403 um - 465 UM - 444 um - 30 MM - 352 MM - 65 mm -720 mm -709 CM - 233 mm -28 MM - 692.5 cm - 61 A -847 nm - 360 CM -592 nm -281 nm -974.0 NM - 379 MM - 558 A -933.0 nm -458 UM -207 nm -831 CM -433 um -181 UM -882 UM - 691 MM -433 NM -381 MM - 571 UM - 86 nm - 54 NM -404 cm - 897 CM - 297 A - 581 CM - 135 NM - 869 CM - 791 A -595 nm - 476 cm -576 UM - 43 A - 14 NM - 497 um - 588 MM -23 UM - 570 nm - 947 NM - 231 MM - 670 UM -294.5 NM -189.5 nm - 834 UM - 434 nm -462 nm - 988 UM -872 MM -959 NM -260 A -877 MM -927 MM - 640 nm - 453 CM -198 mm - 952 mm - 387 mm - 878 nm - 361 NM - 694 MM -829 um - 640 cm -776 um -584 mm -204 MM - 262 nm - 868 UM - 478 NM -20 mm - 491 nm -513 UM - 735.0 MM - 893 A -210 MM -80 UM -219 UM - 987 UM -32 nm -394 NM -793 NM -153 CM -684 CM -367 CM - 190 cm -73 cm -342 nm - 638 um - 231.0 cm - 292 um -514 UM -411 cm - 510 mm - 30 nm -737 UM -344 UM - 946 mm -486 cm - 256 MM -260 CM -420.0 NM - 394 cm - 615 cm -816 UM - 472 MM -537 NM -649 NM - 269 um -592 cm - 919.0 A - 960 cm -715 cm - 212.0 A - 375 UM - 651 cm - 844 A - 405 UM - 854 cm - 765 cm -660 um - 857 cm -343.5 UM -987 A - 965 cm -676 cm - 449 mm -400 mm -541 MM - 829 A - 527 CM -671 nm - 791 CM -629 um -126 mm -552 um - 97.5 um -769 A - 748 um -764 mm - 38 UM -796.0 mm - 292 UM - 415 nm -741 UM - 903 NM -481 A - 560 UM - 180 NM -290 nm -319 UM - 998 mm - 385 nm -196 A -953 MM - 737 mm - 975 cm -205 cm - 152.0 nm - 514 mm -321 cm -129 MM - 868 UM -8 MM -743 CM -669 nm - 736 cm - 4 mm -431 nm - 984 mm - 693 A -298 nm -984 A -13 CM - 207 nm - 940 A - 833 cm - 746 A -263.0 nm -227 NM - 953 MM -829 CM - 191 cm - 202 nm -111 mm -493.5 UM - 645 nm - 585 NM - 606 CM - 991 um -304 mm - 489 CM - 738 CM -992 nm -536 nm - 923 A - 444 MM -618 um -703 MM - 920 NM - 284 NM - 592 um -660 MM -144 A - 604 A - 536 MM - 710 NM -50 A -573 um -646 UM - 65 NM - 205 mm - 538 nm - 827 A -553 A -653 cm -261 A -460 NM -557 um -449 MM -988 CM - 977 A - 289 CM - 289 MM -186 NM - 410 CM - 691 cm -84 cm -914 MM -956 um - 843.5 CM - 915 mm - 550 NM -580 mm - 309 um -239.0 MM -414 cm - 74 mm -840 CM - 297 CM -158 A -332 um -464 um - 146 NM -331 A -851 NM - 795 UM -323 CM - 187 A -516 mm -2 A -395 mm - 875 cm - 301 cm - 121 nm - 644 A - 478 MM -7 UM -731 UM - 551 A - 964 A - 836 cm -424 um -78 um - 787 mm - 310 NM - 965 mm -861 UM -591 UM -39 nm -175 NM - 444 CM -269 NM - 379 cm -74 NM - 787 mm - 157 NM - 487 A -43 UM -154 mm -853 A - 895 MM -179 nm -485 MM -756 A - 686 A - 334 nm -434 um - 837.0 A - 917 MM - 218 mm - 712 A - 257 um - 391 A -50 A -131 cm - 95 CM - 322 um - 282 mm - 391 CM - 219 um - 786 CM -67 MM - 579 CM - 829 mm - 931 mm -446 CM -47 cm -154 um - 497 um -571.0 cm -251.5 NM - 465 MM -744 mm -191 MM -166 CM -394 CM -78 NM - 661 mm -224 UM - 128 CM - 477 CM - 423 mm - 163 nm -477 mm - 455 cm -701 A - 897 UM - 451 mm - 856 um -295 nm -769 nm - 818 NM -4.5 mm -406 A - 842 UM -468 CM -412 NM -861 nm - 661 CM - 419 CM - 383 MM - 985 nm -13 MM - 516 nm - 684 NM - 492 mm -910 nm -488 nm - 976 CM - 906 UM -804.0 mm -986 MM -616 MM -197 mm -114 A - 916 cm -893 UM -843 NM - 202 A - 274 NM - 307 A - 766 cm - 98 MM - 893.0 MM - 876 MM - 412 um - 964 NM -977 cm -67 nm -746 nm - 644 A - 415 A -756 NM - 76 mm -641 UM - 461 NM - 742 MM - 964 NM -82 um - 10 MM - 625 UM - 932 cm - 387 A - 477 mm -317 um -975 A - 688 NM - 334 MM -978 NM - 876 um - 644 UM -798 mm -138 nm -653 um -500 um -290.0 MM -972 CM -167 UM - 168 mm - 742.5 cm - 432 MM - 135 um - 210 cm - 931 nm - 415 cm - 153 mm -506 NM - 90 mm -585 nm - 509 MM - 91 UM -313 nm - 279 MM - 681 A - 198 nm -82 A -183 nm - 645 cm -503 um - 887.5 cm - 711 mm -678 CM - 778 CM -193 cm -619 NM -618 UM - 849 cm - 539 UM - 140.0 nm - 697 cm -83.0 mm -45 MM - 104 um -922 MM - 414 NM -339 NM -236 NM -222 MM -51 mm -186 um - 644 cm -819 UM -591 MM -670 cm -663 MM - 166 A -752 MM - 250 NM -293 UM - 299 MM - 77 um - 639 CM - 135 CM - 719 cm - 882 CM - 19 UM -794 NM -178 mm - 167 MM -430 cm -133.5 UM -722 um -307 NM -935 cm - 328 NM - 736 NM - 811 cm -630 MM -500 MM - 436 UM -673 nm -572 um -110.5 um - 446 CM -823 NM -185 mm - 607 NM -543 CM - 413 CM - 493 A -832 A -897 cm -805 MM -641 cm - 518 cm - 768.5 um -7 A -193 CM -654 CM -202 um -459 um -13 CM - 55 UM - 997 mm - 475 nm - 305 mm -837 MM -556 cm -853 MM - 331 cm -442 mm - 738 um - 126 NM - 900 CM -33 nm -804 NM -84 NM -209 A -478 NM -664 mm - 236 A -747 cm - 762 NM - 377 um - 858 MM -139 cm -946 nm - 39 nm -710 um - 211 NM -34.5 CM - 103 NM -821 CM -597 A -189 cm - 914 um - 775 UM -566 um - 245 um -397 cm -821 MM - 623 MM - 668 nm - 740 mm -310 nm -30 CM - 406 MM -954 UM - 956 NM -517 NM - 502.5 MM -398 MM -588 mm - 223 MM - 560 mm - 257 cm - 385.0 A -238 MM -589 um - 806 cm -572 UM - 280 mm -220 NM -707 nm - 833 NM - 31.0 cm - 225 MM -181 MM - 502 um - 630 um -199 mm -476 NM -264 cm -256 MM -397.0 um -101 UM - 137 um - 311 cm - 476 CM -397 CM -239 MM - 865 UM - 612 CM -631 UM - 42 A -861 A - 888 CM - 812 NM -584 mm - 392 NM -975 NM -394 mm -886 UM -367.0 UM -540 CM - 219 cm -223 CM - 715 nm - 583.0 mm -368 um - 837 um -576 cm - 191 CM - 757 um -659 mm -473 UM -454 A -65 UM - 452 nm -601 CM - 133 CM - 690 mm - 862 NM -505 UM - 27 UM -682 cm - 334 MM - 968 A -543 um -524 CM - 907 mm -727 nm -174 NM -957 cm - 939 nm - 545 mm - 546.0 UM -990 nm - 373 NM -877 MM -785 mm -334 um - 671 CM -757 UM -167 NM - 940 MM - 111 nm - 488 UM - 801 CM -102 CM -483 MM -435 UM -46 NM - 949.5 UM - 102 UM - 795 cm -6 cm -31 A -424 UM - 620 mm - 319 um -225 MM - 13 um -930 mm -253 cm - 860 MM - 816 mm -341 nm -19 NM - 71 A -661 UM -93 A - 898 mm - 408 nm - 257 UM -992 A -577 CM -674 UM -86.5 CM - 753 um - 718 UM - 471 A -601 um -393 MM -667 nm -674 um - 609 um - 652 cm -694 UM -353 A -403 MM -193 CM - 139 CM -347 nm - 819 A - 424 nm - 628 um - 306 nm -211 mm - 769 UM - 226 MM - 976 um - 81 mm -534 um - 734 CM -97 MM - 763 CM -405 mm - 977 nm -285 nm - 903 cm - 462 cm -559 nm - 325 CM -700 um - 908 nm - 225 mm -408 UM - 991 cm -761 MM -529 nm - 664 cm - 354 CM - 914 UM - 445 UM - 687 mm - 246 um -792 um -169 UM -391 um -854 UM -195 UM -150 MM -504 A - 737 mm -775.5 CM - 318 UM -155 MM - 255 mm - 686 A -995 cm -129 NM - 935 nm - 704 mm - 134 MM -250 NM - 249 NM - 382 MM -636 CM -32 um - 590 CM -114 um - 515 MM - 685 NM -594 MM -984 A -801 um -303 CM -171 NM -524 CM -687 UM - 85 um - 764 um -814 nm - 187 cm -417 um - 216 um - 942 A -748 A -75 nm -485 MM -796 mm -755 um - 316 MM - 773 nm -705 um -584 mm - 513 MM - 647 MM -507 UM - 71 um -906 A - 673 nm -751 nm -974 UM -212 cm -157 CM -867 NM -35 cm -558 NM - 781 UM - 635 CM - 711 UM -556 mm - 310 mm - 847 A - 306 UM -201 mm -203.0 um - 412 NM -445 cm - 531 nm -479 UM - 812 nm - 367 UM -494 A -885 NM -608 CM - 743 MM -182 UM - 908 A -829 cm - 533 CM -396 um -209 NM -761 MM -892 CM - 834 NM - 216 CM - 759 A -827 mm -193 um - 580 um - 36 NM -672 mm - 901 um - 539 UM - 855 mm -628 mm -495 UM -765 MM - 409 nm - 577 um -235 nm - 644 A -447 CM -323 mm -759 NM - 468 cm -40 UM - 135 A -735 cm -384 mm -645 um - 645 UM - 534 um - 746 nm - 214 MM - 70 UM - 201.5 UM -288 MM -313 UM -404 MM -987 CM - 796.5 mm - 308 A -866 NM - 244 CM -331 MM -949 CM - 133 CM -96.5 NM - 100 UM -750 um -805 nm - 835 A -474 A -370.0 NM - 944 MM -937 A - 985 mm - 645 A - 939 um - 94 MM -651 UM -651 CM -250 nm - 469 cm -428 MM -871 NM - 166 MM -625 NM -476 NM -831.5 A -973 cm -540 MM - 589 mm -58 mm -449 nm - 491 mm -840 UM - 581 um -229 UM -250.5 MM - 38 MM -88 UM -362 CM -42 um - 243 MM - 897 MM - 777 cm - 248 A -401 um - 929 um -472 CM - 3 UM -116 NM -119 MM - 767 nm - 589 cm -175 NM - 70 CM - 546 NM - 879 NM -565 NM -51.5 cm -782 NM - 421 A -773 MM - 504 NM -206 cm - 734 cm -161 cm - 795 A -735 NM -799 A -67 NM -809 UM -163 cm - 690.0 A -452 MM - 819 nm -284 A - 394 MM -892 cm -500 mm -479 NM -973 UM - 431 cm - 322 um -680 UM -423 um -472 cm - 231 nm - 201.0 cm - 765 mm -776 mm - 1 um - 678 CM - 199 cm - 396 CM -34 UM -487 nm -31 mm - 870 cm -536 CM - 137 MM - 857 mm - 214 nm - 504 CM -72 UM - 31 CM - 808 A - 146 cm -788 NM - 666 mm - 129 um -768 NM -129 A -219 CM -334 CM -147 UM -758 NM - 909 NM -370 um - 145 UM -681 MM - 614 um - 662 A - 163 UM -50 A -335 UM - 753 cm - 850 cm -337 A -774 MM - 295 NM -519 nm -872 A - 744 cm - 900 A - 495 CM -934 mm - 522 NM - 558 nm -778 cm -698 cm - 922 CM -976 NM -631 UM -454 mm -356.0 um -241 mm - 297 mm -122 mm - 557 UM -862 A -848 MM - 760 A -268 cm -496 nm - 240 um - 534 cm - 966 mm -873 UM - 592 UM - 411 nm - 47 cm - 757 MM -672 CM -793 NM - 777 mm - 383 MM -150 mm - 113 nm -962 NM - 180 nm - 699 CM -464 UM -551.5 NM - 297 NM -22 um - 538 CM -931 nm -646 mm -699 NM - 162 CM - 926 A -110 nm -87 nm - 275 CM -126 CM -864 cm -316 cm - 103 NM - 808 MM -130 UM -183 UM - 990 CM -575 A -374 MM - 276 um - 370.0 MM -276 MM - 933 um - 748 UM - 132 MM - 977 nm - 944 cm -799 cm - 362 A -57 CM - 664 nm -68 MM -660 nm -342 nm -852.0 mm -692 cm - 795 CM - 678 um -385 UM -984 NM - 773 CM - 480 CM - 694 NM -532 cm - 166 NM -206 cm -638 CM - 857.5 cm -178 mm -778 A - 723 MM -99 um - 541 MM -411 A -60.0 UM -803 MM - 266 CM - 280 A -24 MM -8 MM -758 nm - 336 UM - 146 UM -747 UM - 462 UM - 489 nm - 137 A -555 A -765 um -527 NM - 625 CM - 591 A -428 cm - 929 um - 310 nm - 484 mm - 631 CM -108 UM - 221 A - 992 um -521.5 NM -842 MM - 904 CM - 95 CM - 588 NM -852 NM - 125 cm - 714 A - 47 NM -568 cm -288 NM - 351 A - 239 UM -419 cm -289 CM - 331 NM -629 CM -588 NM - 163 CM -894 A -927 CM -762.0 NM -803 cm - 180 A - 826 um - 343 MM -506 CM - 545 UM -837 MM -599 cm -773 UM -535 MM -842.0 NM - 383 UM -237 MM - 358 MM -147 cm - 510 A -666 UM -773 NM - 798 CM - 51 MM - 695 mm - 414 A - 329 mm -319 mm -822 MM - 349 mm - 625 UM -703 cm - 650 NM -61 NM -118 NM - 568 mm -848 cm - 778 cm -661 NM - 303 mm -912 NM -311 CM - 265 nm -686.0 nm -207 NM - 733 MM - 451 mm -631 CM - 828 NM - 704 nm - 991 um - 761 um - 303 nm - 984 cm - 716 mm - 554 nm - 170 mm - 607 A - 958 um -204 nm - 695 nm -944 CM - 500 cm -372 cm - 876 CM - 563 CM -756 um -257 um -697 mm - 777 mm - 472 A -915 UM - 967 mm - 42 A -402 mm - 855 um - 406 CM -624 MM - 753 cm - 505 mm -65 A - 347.5 CM - 945 cm -165 UM -208.0 nm -565 nm - 545 A - 565 A - 431 A -814.0 NM -954 nm - 616 MM -751 nm -670 nm - 129 CM - 15 CM - 139 MM -768 MM - 435 NM -1000 A -756 A -113.0 A -449 MM -85 A - 536 UM - 576 UM - 103 MM -850 nm - 573 nm - 139 um - 16 mm - 849 CM -971 CM -123.5 MM - 882 mm -946 MM -627 um -762 mm - 398 UM - 407 UM -852 UM -482 NM - 366 NM - 110 cm - 409 cm - 259 A - 449 CM - 721 mm -407 um - 397 MM - 231 UM -892 A - 334 mm -838 cm -775 mm -44 NM - 516 um -874 nm - 78 um - 367 cm - 423 MM - 752 mm -471.0 mm -796 UM -520 A - 632 CM - 450 cm - 22 cm -558.5 UM - 406 nm - 168 MM -520 CM - 615 nm -397 CM - 700.5 um -157 A - 598 mm -240 mm - 496 A - 115 CM -80 nm - 835 A -262 nm - 813 NM - 328 mm -774 NM - 852 mm - 745 NM -854 A - 78 um -859 CM -567 mm -952 A - 498 um -173 NM - 403 NM -83 CM - 589 um - 687 A -478 UM - 970 A - 262 NM - 924 NM -658 A - 601 NM -360 MM -245 NM - 829 um -553 CM - 537 MM -177 UM - 778 NM -139 um - 422 A - 959 MM - 653 mm - 72 um -320 um -231 nm - 657 um -477 nm -64 mm - 97 cm -355 nm - 967 A - 820 nm - 336 NM -779 UM - 825 UM - 450 nm -918 mm -102 um - 785 UM - 57 NM - 958 mm - 994 nm -582 A - 726 A - 300 UM - 578 mm - 715 A - 506 mm - 642 um - 244 CM - 353.0 MM - 366 UM - 821 MM -444 NM - 945 cm - 577 um -104 mm - 535 NM - 564 mm - 741 um -365 NM - 787 cm - 693 cm -601 MM -354 mm -665 nm -670 um -959 nm - 933 A -599 MM - 568 MM -276 nm -707 A - 560 cm - 481 UM -705 NM - 511 A - 953 mm - 580 nm - 59 nm -189 A - 378 MM - 22 UM - 976 um -127 A - 68 cm -545 nm -405 um -315 UM - 318 A - 704 MM -942 um - 134 CM -651 mm -69 NM - 419 MM - 929 mm - 249 NM -751 cm - 580 NM -818 nm - 301 CM -49 mm -165 CM -285 cm -47 MM - 61 UM -13 um -996 MM - 235 UM - 900 um - 716 MM -5 mm -487 CM - 412 mm - 930 mm -340 cm - 944 cm - 117 um -355 mm - 255 mm -446 CM -116 cm - 356 nm -745 CM -485 A -505 nm - 844 UM - 416 NM - 932 A - 724.0 mm -950 CM - 597.5 CM -357 UM -713 NM -884 nm -154 cm -751 CM -650 cm -601 cm - 347 mm -297 CM - 942 mm -518 MM -40.5 CM -348 UM - 867 MM - 559 NM - 126 NM -677 A -442 UM -244 um - 127 MM -741 mm - 14 CM -821 UM - 217 CM -671 A -120 nm -743 NM - 296 nm -79 cm - 587 UM - 389 MM - 160 mm - 113 nm - 272 mm - 937 nm - 89 cm -845 NM -154 CM - 777 A -22 MM - 584 MM - 581 UM -742 um -710 nm -865 MM - 382 UM - 717 nm - 895 nm -124.5 CM - 314 NM - 649 MM - 575 UM - 26 mm - 164 MM -673 A -273 NM - 684 nm -726.5 NM -857 NM -282 UM -914 UM -555 MM - 600 NM -395 mm -263 cm - 222 mm - 446 UM - 918 cm - 64 CM - 232 mm - 973 nm -447 mm - 621 cm - 492 um - 159 A -416.5 cm - 151 UM - 623 nm -857 MM -96 mm - 959 nm - 692 MM -512 CM - 806 UM -154 UM - 217 NM - 664 MM -117 NM -527 NM -671 cm -987 um - 110 cm - 518 CM - 876 cm -520 nm - 889 MM - 45 NM - 943 um -118 NM - 134 NM -775 mm -318 um - 933 nm - 179 mm -76 um -917 mm - 671 mm -368 CM - 573.5 CM - 278.5 mm - 982 cm - 347 NM -160 mm - 567 CM - 808 um - 392.0 cm - 593 MM - 440 NM - 973 MM - 663 NM -453 um - 2 MM -313 CM - 71 A - 678 mm - 644 um -695 nm - 391 NM - 710 nm -331 mm -215 NM - 12 cm - 267 cm -544 um -933 cm -345 NM - 15 cm -492 cm -829 CM -756 nm - 60 MM -108 nm -2 NM -674 cm -489 MM -314 NM - 451 NM -112 um - 387.0 A -334 CM -283 mm - 121 A - 864 UM - 665 mm -962 cm -173 UM - 322.5 UM - 521 MM -115 um - 937 MM -54 nm - 478 um - 923 MM - 914 mm -119 UM - 639 nm -473 cm -493 nm -562 CM -546 NM - 193 um -912.5 um - 47 cm -743 NM - 496 MM -552 UM - 547 cm - 687 NM - 695 MM - 961 cm - 787 UM - 964 MM - 857 um - 345 um -371 NM -617 MM -644 MM -773 nm -226 um - 221 um - 143 nm - 471 MM -787 CM -368 A -1 A -535 CM - 561 MM - 797 MM -72 nm -183 cm -382 MM - 660 MM -483 CM - 603 mm -542 mm - 729 mm - 534 nm -377 UM - 933.0 A - 366 UM - 647.0 A - 747 um -114 UM -996 MM -581 CM -525 UM -328 nm - 58 A - 213 NM - 16 nm - 196 mm -789 cm -957 mm -528 nm -668 A -769 NM -432 A -458 nm -308 CM - 892 mm -105 MM -254 mm - 606.5 nm -564 um - 521 CM -180 NM - 669 mm -142 mm -789 CM - 166 MM - 972 MM -555 A - 228 mm -693 mm -468 mm - 487 NM - 264 CM -299 CM -148 CM - 785 cm -966 UM -170 CM -733 UM - 954 MM - 646 CM - 647 A - 749 A -347 nm - 596 CM - 754 cm - 506 A -305 mm -501 mm -992 MM - 793 MM - 318 UM - 570 um - 955 A -601 um -95 um - 337 UM - 891 nm - 489 MM -126 nm - 850 cm - 276 UM - 464 A - 620 MM - 97.0 CM -617 MM -53 UM - 641 CM - 17 cm -931 um -868 mm -459 um - 369 cm -655 MM -353 CM - 290 MM - 265 nm -202 nm - 372 nm - 14 UM -62 nm - 977 UM - 999 nm -284 um -897 UM -735 UM -421 nm -613 NM -260 cm -575 mm -725 CM - 335 NM -768 NM -332 mm - 563 cm - 57 nm -963 um -700 um - 462 CM -674 mm - 850 mm -229 CM -504 mm - 784 CM -379 mm - 672 NM - 572 NM - 991 mm - 68 cm -619 nm - 995 UM -57 NM - 898 UM - 596 nm - 974 A -419 nm - 89 um -572 CM - 991 NM - 368 nm -432 mm - 570 nm - 905 mm - 997 NM - 234 UM - 104 um -364 um -971 MM -882 CM - 962 nm - 727 cm -93 um - 498 cm -944 cm - 595 A -208 cm -649 NM -293 nm - 368 MM -422 mm - 877 mm -239 A -513 nm -739 cm -885 um - 401 UM -110 CM -68 cm -938 UM -474 UM - 802 NM -994 MM -884 NM - 216 MM - 133 MM -211 NM - 539.5 NM - 90 A - 606 cm - 930 A - 155 cm -71 CM -835 UM - 726 A - 28 um -811 nm - 354 mm -241 CM - 149 CM - 607 UM -881 mm - 725 um -333 CM -57 CM -264 mm -279 cm -402 MM - 715 NM -546 CM -114 cm -755.0 UM - 386 NM - 689 A -983 cm - 822 cm -666 nm -678 UM -825 MM -864 mm -3 um - 994 um - 727 CM - 764 um -800 A -104 MM - 517 A - 932 nm - 554 mm -464 cm -769 um - 668 nm - 663 um -101 A -793 mm - 211 cm -301 NM - 601 cm -194 um -18 cm -226 mm -973 cm - 864 nm -512 CM -663 nm -798 mm -610.5 um - 258 mm - 176 um -638 um -186 UM -674 CM - 65 MM -346 mm -680 UM - 865 A - 589 MM - 520 cm - 44 cm - 746 um - 208 A - 140 NM - 29 NM - 507 mm - 544 A - 44 A - 731 UM -406 um - 599 cm - 450 um - 405 MM - 587 UM -454 CM - 192 um - 185 CM - 905.0 CM -227 NM -292 um -888 cm -20.0 CM - 563.0 UM -904 A - 925 UM -589 nm -568 um -709 UM -392.0 CM - 960 mm -198 cm -906 um - 117 nm - 897 cm - 945 NM -126 NM - 187 um - 582 UM - 222 nm - 572 A - 213 MM -530.0 um - 165 MM - 49 cm -781 A - 776 CM - 206 cm - 56 A - 646 UM -464 CM -873 A - 183 CM -729 mm - 729 MM -359 CM -633 um -880 cm - 888 UM - 961 NM - 70 CM - 563 um -58 CM - 768 mm - 633 mm - 315 NM - 869 nm - 810 um -477 um -728 A - 175 MM - 42 cm -207 CM -530.0 nm -716 A - 354 cm -778 A -463.5 A - 447 A -925 cm - 752 cm -953 mm - 77 cm - 946 CM -475 MM - 901 MM -607 cm -826.0 nm - 217 mm -549 A - 812 MM -37 A - 827 cm -585 um - 179 MM - 19 nm -186 cm -564 A -541 mm - 657.0 MM - 893 cm -567 CM -565 mm - 608 um - 47 um -774 MM - 654 nm - 450 MM - 492 cm - 920 UM - 742 CM -680 um - 452 A - 279 A - 852.5 mm - 951 cm -850 nm - 973 nm -290 um -265 UM - 145 UM - 780 cm - 434 A -724 nm -590 CM -334 UM -701 cm -806 CM - 117.5 cm - 373 MM -960 cm -726 nm -967.5 UM -651 cm -909 CM -994 mm -957 MM - 41 nm -270 MM -922 nm - 881 nm -754 A - 790 mm -229 CM - 838 nm -248 NM - 12 CM - 555 CM - 762 UM -490 nm -574 mm -892 MM -67 A -441 cm - 21 um -69 UM -196 cm -541 CM - 343 A - 581 CM - 45 nm - 79 UM -881 nm - 281 cm -915 CM - 475 CM - 526 cm - 650 NM - 480 um - 464 CM - 518 nm -410 CM -179 MM - 822 um -837 MM - 483 UM - 240 MM -675.0 MM -269 MM - 655 A -162 CM -148 mm - 366 cm -431 A -477 A -775 mm - 94 MM -228 NM - 793 um -388 CM -617 NM - 581 UM - 116 CM - 815 A - 309 NM -610 cm -146 mm - 193 UM -841 UM - 91 nm -296 um - 740 mm - 96 MM - 902 NM - 862 nm -415 um - 397 A - 80 CM - 549 um -658 nm - 81 mm - 992 nm - 886 NM -843 MM - 861 cm -146 NM -579 UM -866 nm -346 cm -718 UM -233 mm -751 nm - 243 UM - 637 um -983 mm - 930 CM -623 nm -327 UM -455 CM -147 MM -552 CM -457 A -366 NM - 370 UM - 980 um - 596 um -13 UM -467 MM - 73 nm -555 nm - 400 CM -407 NM - 722 mm -831 mm - 618 cm - 755 CM - 259 MM -718 NM - 946 A - 126 um -207 cm - 996 nm - 14 CM - 627 um - 281 um -920 MM -614 CM -359 um -151 cm -924 nm -577 mm - 865 um - 649 A - 129 A - 792.0 um - 579 cm -769 A - 104 nm -751 nm -583 MM -322 CM - 477 cm - 493 cm -45 A -92 CM -303 CM - 619 CM - 674 CM -643 MM - 362 UM - 178 cm - 635 nm - 324 UM -498 cm -963 UM -685 mm -888 um - 732 NM - 104 mm -715 A - 36 MM -400 NM -53 um - 627 mm - 841 A - 220 mm -267 NM - 248 nm -9 cm -8 NM - 463 nm -770 nm -216 CM - 271 UM - 488 NM - 601 nm -813 UM - 832 um -407 NM -635 nm - 340 MM -849 NM -601 um - 732 MM - 776 mm -440.0 NM - 714 mm -511 CM -569 MM -671 NM -436 um - 741 mm - 712 um -461 UM -882 UM - 650 MM -633 MM -492 cm - 487 CM - 971 UM - 235 mm -892 um -106 CM - 126 um - 340 MM -12 NM - 717 UM - 730 um - 949 NM -754 nm -364 A - 598.5 cm - 53 mm - 467 A -299 A - 259 mm -893 NM - 457 um -40 um -584 NM -437 nm - 634 CM -647 mm -696 UM -476 MM -413 MM -894 NM - 422 cm -68 A -208 A - 976 mm -288 MM - 515 mm -218 UM - 339 nm -905 CM -756 NM -299 cm - 657 CM -430 NM -425 cm -171 CM -422 NM -233 CM -347 A -202 cm -902 mm - 398 UM - 184 CM -888 UM -436 CM -311 cm -28 CM - 729 UM - 584 NM -877 UM - 47 cm -372 cm - 860 MM - 431 A - 774 nm - 545 MM -408 cm - 985 MM - 650 A -844 MM - 529 MM - 526 um - 229 NM - 13 MM -971 CM - 381 NM - 228.5 MM - 203 A - 211 A - 674 CM - 570 cm - 888 mm - 850 um - 799 cm -136 nm -555 UM - 513.5 CM - 763.5 NM -855 NM - 752 cm -23 A -688 UM - 725 CM - 520 nm - 258 um -129 nm - 786 UM -931 nm - 747.0 CM - 856 A -128 MM - 487 mm -846 nm - 839 um -855 cm - 525 CM -935 UM -644 CM - 682 um -737 NM - 76 A -459 NM -730 nm -501 nm -721 cm -903 A -823 um - 339 MM -390 mm -326 CM - 265 um - 398 nm - 213 cm -676 NM -822 UM -878 UM -508 UM -779 UM -424 mm - 531 cm - 656 nm -923 mm - 180 MM -140 MM -480 MM - 468 nm - 787 mm - 515 um -206.0 NM - 494 A - 701.0 cm - 81 CM - 117 NM - 706 um -574 A - 952 NM - 112 A -945 um -280 NM - 33 nm -574 CM -172 cm -441 CM -205 mm -969 UM - 991 mm - 11 CM - 469 nm - 578 cm - 810 MM - 150 MM -520 CM -556 UM -816 nm - 937 nm - 769 UM - 184 cm -379 MM -486 nm - 19 A - 668 nm - 670 cm - 430 UM - 235 CM - 731 nm - 524 A -516 NM - 197 cm - 7 NM - 903 cm - 822 A - 348 cm -295 MM - 348 NM - 752 cm -220 UM -410 cm - 535 um - 573 nm -990 nm - 314 A -686 um -789 CM -115 mm - 586 nm -927 A - 657 NM - 811 cm -559 A - 215 NM - 986 A - 246 nm - 202 mm - 772 mm -565 mm -893 cm -182 UM - 527 A - 695 mm - 664 UM -372 mm - 519 cm - 244 MM -764 nm -285 MM -153 CM -124 nm -47 MM - 447 um -157 nm -569 MM -759 NM - 48 nm -241 A -256 um - 607 UM -260 A - 682 nm -642 um - 352 cm - 997 NM -567 um -498 um - 46 A - 941 CM - 271 CM -267 UM - 632 nm - 773 CM - 266 cm -666 CM -653 nm -703 um -530.0 MM - 355 cm -543 CM -241 UM - 350 NM - 284 cm - 460 cm -76 cm -886 CM - 142 A - 461 um - 133 UM - 877 mm -815 A - 508 MM -671 um - 903 um -591 CM -868 cm -639 um - 13 NM -448 nm - 734 UM - 514 NM -447 A - 66 A -225 A -214 mm - 644 cm - 763 NM - 679 NM - 189 um -589 um -771 NM - 663 nm -382 CM -481 um -617 NM -246 mm -447 UM - 819 A -618 um -705 MM -572 UM - 637 UM - 961 UM - 551 NM -823 UM -490.5 nm - 651 MM - 365 MM -538 mm -19 MM - 31 um - 217 nm - 76 NM - 799 mm - 630 mm - 701 UM -199 um -793 CM - 31 nm - 535 A - 289 nm - 48 mm -543 NM - 125 A - 307 CM -695 nm -262 nm -123 UM -506 NM -443 A -638 A -677 cm -919 cm - 803 CM - 747 A -28 nm - 164 A - 787 A - 176 mm -512 CM -648 NM -683 A -956 A - 533 cm - 458 MM -449 MM - 4 UM -651 A -120 UM -161 MM - 513 nm - 322 A - 801 mm -413 MM -488 NM - 360 um -826 nm -785 mm - 982 cm - 275 CM - 339 um - 860 nm - 101 A - 161 A -69 NM -309 CM - 975 MM -884 NM -292 nm - 559 um - 541 cm - 547 UM -42 nm - 66 NM - 491 mm -890 nm - 101 mm -307 CM - 50 NM - 612 cm - 495 mm -189 um -555 nm - 152 mm -925 CM -262.5 mm -263 mm -460 um -749 NM -392 cm -542 nm -959 cm -660 mm -490 um - 723 nm -153 cm - 86 UM - 842 nm - 212 A - 527.0 MM -358 cm -622 A - 392 cm -222 MM -734 mm - 499 cm - 692 cm -350 NM -79 mm - 206 UM - 796 cm -805 um -570.0 nm -437 MM -322 um -858 NM - 4 NM -616 nm - 780 cm - 911 A - 16 um -256 CM - 273.0 UM - 89 CM - 885 um - 707.5 NM - 736 nm -680 um - 467 CM - 471 nm - 836 MM -404 CM - 117 UM -611 A - 20 cm -89 nm -732 CM - 338 um - 539 cm - 894 UM -956 NM -950 MM -98 mm -14 um - 934 NM -552 um -27 UM - 99 A -538 cm - 880 um -942 CM -797 mm -810.0 um - 55 um -966 UM -837 MM - 557 nm - 881 CM - 108 cm -512 A - 606 mm - 472 MM - 205 nm -473 NM - 764 UM -341 mm - 621 MM -506 CM - 834 NM - 547 mm - 758.5 mm -358 MM - 939 nm - 99 UM - 856 NM -793 nm - 1 cm -286 cm -644 UM - 351 NM -376 NM - 373 cm -559 mm - 500 cm - 117 MM -279 nm - 280 mm -353 A -410 A -719 um -457 MM - 103 cm - 79 MM -845 UM -331 A - 959 A - 284 NM - 498 NM - 402 A - 213 mm -703 mm -26 CM -376 UM -18 UM - 299 cm - 880.0 um - 426 A -728 UM -884 UM - 509 NM - 293 mm -53 cm - 33 NM - 335 um -15 CM - 647 cm -150 um - 766.0 cm -789 A -508 mm -709 nm - 875 UM -962 UM - 690 nm - 624 MM -419 nm - 760 A - 721 MM - 413 A - 215 cm -817 cm - 125 nm - 782 CM -981 mm - 425 MM - 204 cm -102 nm -960 NM - 126 UM - 372 NM -695 MM -415 CM - 869 nm - 860 UM -909 um - 851 NM - 40 um -490 CM -879 UM - 292 MM - 414 mm - 995 um -720 A -743 mm - 649 mm -396 MM -238 mm -590 um - 451 A - 753 cm - 952 CM - 361 NM - 314 nm -426 UM -322 cm -924 um - 592 nm - 603 mm - 228 CM - 68 um -267 mm -578 MM -723 A - 212 cm - 754 MM - 539 CM -84 cm - 228 A - 396 um - 190 cm - 908.0 nm -943 nm -538 nm -782 um -339 CM - 455 A - 896 nm -76 cm -619 mm -394 cm - 661 CM - 465 CM -386 CM -68 nm -678 NM -241 um - 701 NM - 63 nm -764 nm - 828.5 MM -499 UM - 379 UM -705 um -765 CM - 302 MM -136 MM - 736 cm -983 CM -201 A - 947 mm - 892.5 NM - 98 NM -847 nm - 536 MM - 480 cm - 669.0 UM -266 CM -315 nm - 419 CM -355 NM - 53 um - 301 um - 72 um - 678 um - 964 MM -60 MM -437 CM - 745 um - 593 nm -633 MM - 503 A - 351 nm -874 um - 896 CM -138 CM - 484 nm -797 um -879 CM -909 NM - 603 nm -345 MM -578 um -778 A - 329 MM - 12 A -221 nm - 465 MM -353 NM -166 CM -468 MM - 788 um - 731 CM - 113 MM -706 cm - 969 nm - 858 um - 931 um -11 cm - 785 mm - 832 A - 434 UM -1 mm - 383 UM -400 MM - 568 um - 100 um -608 um -591 nm -96 cm -365 um - 977.5 mm -636 MM -774 A -438 cm -569 A -126 cm - 307 UM -452 UM - 404 nm - 603 MM - 218 mm -100 mm - 794 nm -231 nm -547 um - 35 mm -327 CM - 580 A - 956 NM -693 mm - 749 NM -484.5 mm -110 um -750 NM - 441 NM - 463 NM -633 NM - 790 nm -138 CM - 822 MM -821 um - 989 MM -710 nm -896 cm -889 MM - 310 A -512 NM - 55 UM - 737 um -324 UM -512 CM -362 NM - 32 nm -95 CM -471 mm - 890 NM - 942 mm -806 um -364 cm -472 mm -480 mm - 913 cm - 742 um -120 mm - 905 nm -31 um -281 nm - 270 NM - 362 NM -682 MM - 624 um -866 UM - 441 NM - 783 MM -107 mm -509 A -823 um - 449 A - 24 cm - 579 CM -728 um - 512 CM -9 MM -844 cm -652 mm -865 CM - 80 nm -715 MM - 366 cm - 76 MM -647.5 MM - 334 CM -458 um - 193 MM - 673 A - 25 mm - 728 UM -136 nm -727 NM -413 cm - 18 UM - 130 MM - 10 CM -980 MM - 779 mm - 320 nm -912 CM - 716 A -91 um -281 MM -70 mm - 529 A -278 um -199 UM - 999 UM -648.0 CM -592 UM - 147 NM -930 NM - 390 CM -195 MM - 250 MM - 290 mm -572 CM -100 um -109 cm -557 A -237 mm - 309 mm - 963 mm -952.0 MM -187 um -619 A -278.0 MM - 191 A - 23 NM -832 cm - 197 A -520 A -401 mm - 863 CM -99.5 cm -17 A -836 A -561 nm - 453 NM - 793.5 MM - 426 mm -10 mm - 897 NM -318 nm - 140 mm -297 MM -992 cm - 543 mm - 366 MM -854 NM - 397 nm -200 MM -864 NM - 397.0 UM -570 A - 829 MM - 163 um - 489 A -407 MM -630.0 nm - 221 cm - 998 um - 407 um - 992 MM -89 MM - 566 mm - 806 A -742 UM - 349 cm - 660 UM - 671 UM - 399 NM -789 A - 591 um - 689 MM -441 A - 762 nm -423 mm -134 MM -71 CM - 524 NM - 349 NM -456 mm -964 NM -215 cm -50 UM - 263 um -687 um -277 A - 278 MM - 935.0 mm - 312 cm -106 um - 479 NM -196 NM - 830.5 CM - 526 mm -953 nm -30 mm - 581 CM - 593 NM - 986 mm - 305.5 nm - 719 nm -668 NM -902 A - 241 CM -957 mm -537 CM -410 MM - 767 cm -899 um - 149 UM -831 A -860 A -774 NM - 915 nm -872 NM - 790 UM - 818 cm -842 UM - 283 CM - 796 CM - 244 MM -543.5 NM - 454 CM -539 cm - 739 cm - 438 A -649 cm - 254 mm - 810 MM -75 CM -642 CM - 622 nm -556 mm - 507 MM -771 nm - 964 A -514.5 UM - 102 UM -923 um - 883 um - 34 UM - 125 cm - 342 MM -653 UM -64.5 MM - 348 UM -822 nm - 416 NM -473 UM -965 mm - 697 cm - 648 nm -88 nm -755 CM - 820 NM - 532 mm - 74 cm - 55 CM - 775.5 CM -533 nm -717 mm - 171 A - 437 mm - 350 nm - 669.5 cm -877 CM -372.5 um -966 UM -95 mm - 830 cm - 53 nm - 878 nm -450.5 CM -682 nm -198 um - 190 NM -835 UM -1000 UM - 287 CM - 575 MM -735 UM - 410 UM - 221 um - 881 cm - 958 cm - 28 CM -418 MM - 46 UM - 252 A -271.0 nm - 927 UM -866 A -220 mm -281 um - 359 A - 917 CM - 64 cm -679 um -598 CM - 115 um -811 mm -237 um - 434 MM -915 mm - 75.0 nm - 924 cm -883 CM - 60 UM -571 MM -261 CM -186 A -980 nm -322 mm - 796 mm - 341 CM -427 UM -320 nm -350 um - 956 nm - 7 nm - 298 CM - 864 CM -870 MM -755 UM -79 nm -450 NM -861 cm - 296 cm -302 MM -443 UM -908 UM - 402 UM -396 cm -548 cm - 575 UM - 899 nm -57 A -513 nm -475 UM -125 A -490 A - 202 MM - 433 mm - 647 cm - 195 NM - 277 CM - 435 UM - 782 NM - 355 NM - 741 MM - 740 nm -567 A -25 nm -357 cm - 430 nm -932 um -314 nm -170.5 A -342 NM -229 UM -980 um -745 NM -715 UM -320.5 cm - 185 A -787 UM - 525 A -962 NM -632 CM - 546 cm -191 A -566 MM -886 um -616.0 MM - 277 cm -876 nm -488 MM - 630 UM - 26 MM - 22 um -146.5 UM - 975 mm -969 CM -923 cm -666 nm - 564 UM -678 UM - 493 um -390 nm - 323 MM -695 cm - 480 nm -219.0 A - 493.5 nm -556 MM - 16 nm -590 um - 233 mm -28 mm - 878 MM - 999 MM - 146 mm -575 NM - 76 UM -230 A - 810 CM -178 UM - 223 NM - 831 cm - 861 um -423 MM -638 MM -738 nm - 273 mm - 878 um - 522 mm - 175 UM -292 mm -315 A - 330 UM -126 CM - 181 NM - 74 nm - 916 nm -114 A - 752 CM - 28 cm -904 NM -452 cm -130 um - 928 MM - 955 mm - 627 um -75 cm - 179 mm -940 cm - 102 CM - 895 NM -854 mm - 333 um -626 MM - 154 NM -693 MM -378 MM - 978 UM -730 um - 181 CM - 685 CM -665 NM -615 A -29 cm -842 cm -503 mm - 60 nm -219 cm - 62 cm - 645 UM -851 UM -602 mm - 532 NM -830 nm -779 cm - 705 nm -795 nm -566 NM -59 nm - 493 NM -770 A -368 NM -916 NM -348 mm -573 NM -78 NM -624 um - 19 CM - 359 nm - 892 cm -57 A - 681 A - 330 nm - 596 um -953 MM - 94 um - 416 UM - 944 UM - 761 MM -445 mm - 847 NM -307 A -683 A - 540 mm - 307 UM - 968 MM - 283 mm - 717 nm - 420 nm -603 NM - 289 cm -812 A -890 cm -685 cm -96 NM -503 NM -404 CM - 59 CM - 141 CM -125 MM - 789 NM -231 UM - 281 MM - 47 CM -86 MM -226 UM -850 UM - 314 um -824 mm - 636 cm - 846 mm - 117 MM -290 mm - 399 UM -173 NM -883 CM - 680 um - 169 cm - 52 A -442 MM - 266 cm - 10 um - 119 mm - 64 NM -547 UM -580 nm - 948.5 CM -196 MM - 940 cm -301 mm - 494 MM -810 nm -300 A - 394 um -408 NM -387 CM - 476 CM -862 NM -744 um - 437 cm -445 mm - 753 CM - 898 CM -400 A - 343 CM -333 um - 731 MM -5 nm -452 NM - 327 nm -707 mm - 253 CM - 737 MM -834 A - 349 cm -354 A -608 cm - 661 A - 243 NM - 205 mm -446 um - 26 nm - 543 mm -484 cm -897 A -188 cm - 194 CM - 809 A - 576 CM -447 nm - 929 mm - 995 MM -20 mm -839 CM - 792 CM -859 cm - 1000.5 nm -425 mm -674 CM -425 mm - 376 UM - 530 cm - 231 UM -731 mm -458 NM -192 MM - 68 um -354 A -250 mm -959 NM - 983 mm -605 mm - 267 um - 108 MM -541 um -817 MM -333 um -612 cm -932 nm - 542 UM - 913 um -574 UM -758 um -291 CM -488 nm -213 um - 409.5 um -203 um - 46 NM -514 UM - 300 MM - 48 cm -59 MM -721 CM - 290 mm -992 nm -742 nm -403 um - 612 mm -410 cm - 498 CM -295 CM -430 nm - 168 UM -595 cm -494 um - 781 NM - 101 nm - 116 MM -928 CM - 867 nm -432 UM - 96 CM -47 A - 452 MM - 9 nm - 239 A - 551 um - 209 um -525 MM -907 cm -127.5 um -977 UM -927 MM -841 nm - 511 um - 266 mm - 650 A -809 um -371 A - 805 A - 885 CM -538 CM -185 UM -334 UM - 263.5 A - 130 nm - 4 nm - 381 UM - 598 um - 844 NM -359.5 MM -284 UM - 572 nm -786 UM - 53 mm - 287 CM -117 mm - 345 CM -719 um - 487 mm -463 cm - 596 CM -250 cm - 193.0 A - 341 NM - 114 um -130 um -636 UM -667 CM - 402 mm -524.5 MM -925 mm - 250 um -807 UM -869 um -180 MM - 840 nm -536 um - 71 cm -298 cm - 385 NM - 127 um -921 UM -47 um - 556 cm -148 um - 848 MM - 685 UM - 510 MM -527 A -3 mm -456 CM -572 A - 672 um -801 MM -801 CM - 883 CM -683 A -876 CM -831 UM - 579 CM -755 cm - 321 mm - 540 MM - 789 NM - 152 NM - 160 MM -668 nm -886 CM -905 nm - 816 um -11 UM -974 UM -761 cm - 243 um - 111 cm -43 NM - 258 NM - 955 UM - 252 mm - 162.0 cm -735 cm - 1 UM -621 MM - 592 CM -737 MM - 169 cm -820 CM - 216 mm - 563 CM - 606 cm - 848 mm - 299 um - 587 CM -138 A - 212 um -374 mm -754 CM - 621 nm -711 mm - 69 cm -898 CM - 910 cm -28 CM - 523 MM -843 A - 929 um - 842 nm - 940 cm - 763 NM - 376 CM -798 cm -845 um - 351 CM - 810 UM - 677 CM - 310 CM -938.0 A - 71 UM -579 cm - 452 UM -782 nm - 861 A - 950.5 UM -598 A - 25 MM -838 NM -3 A -1000 nm - 534 NM - 562 MM -426 cm -647 nm - 410 NM - 283 NM - 447 CM - 223 cm -845 UM - 947 A - 699 MM -626 UM - 769 MM - 142 A -397 um - 865 CM -717 um -592 um - 349 NM - 71 um -475 UM -807 MM - 40 MM - 717 nm - 25 MM - 576.0 mm -28 cm -282 mm -642 nm - 177 NM - 708 um - 968 um - 737 CM - 577 nm - 621 um -894 NM -971 MM - 34 cm - 126 um - 499 MM -908 MM - 197 um -453 nm -349 nm -767 NM - 811 MM - 689 MM - 418 A -298 MM -113 CM -893 CM -222 A -295 cm -995 UM -168 mm -239 um - 76 CM -854 UM -325 UM - 768 NM -993 MM -751 cm -879 UM -388 NM - 860 mm -356 CM -944 CM - 419 MM -201 NM - 479 mm - 186 um -472 mm - 15 cm - 821 cm -873 MM -907 um -407 MM - 814 nm - 271 NM -722 cm -864 um -352 nm - 539 cm - 337 um -329 A -755.5 MM -98 CM - 173 mm - 159 um - 673 mm -250 CM -595 cm - 91 MM - 283 UM - 641 A -394 MM - 828 um -129.5 UM - 920 NM -502 nm -475 mm - 370.5 A -192 cm -188 UM -670 CM -693 um -122 UM -165 cm - 579 um -840.5 NM -513 NM - 193.5 A - 961 NM -858 MM -622 um - 284 um -606 CM -770 cm - 404 MM -145 NM -599 CM - 757 A -737 um - 265 mm -871 UM -516 nm -837 nm -520 UM - 316 UM -723 CM - 456 UM - 197 um -176 um -972 mm - 731 A - 999 nm -952 A - 498 nm -65 mm - 611 cm - 980 A -262 um -447 um - 514 um -521 cm -832 A -124 CM - 668 um -371 A -797 nm - 453 MM -973 nm - 240 mm - 851 UM - 448 MM - 393 MM - 329 um -716 NM - 995 nm - 899 cm -730 NM - 332 UM - 717 um - 651 um - 656 cm - 985 UM -186 MM - 468 nm -977 CM -59 mm - 554 mm -83 A -630 CM - 50 MM - 348 NM - 166 MM -481 NM -122 UM - 662 CM - 377 cm -601 A -905 cm -343 UM -757 cm - 231 nm - 215 um - 687 MM -729 CM -419 cm - 251 NM - 347 MM - 901 nm -649 NM - 832 um -349 mm - 220 um -528 A -472.5 A -840 nm -406 mm - 304 A -702 CM -717 CM - 431 UM -985 mm - 728.5 CM -887 NM - 725 A - 82 CM -352 A - 165 A - 282 UM -758 CM - 881 cm -498 mm -980 CM -297 um - 557 CM - 520 nm -243 UM -544 mm - 876 NM - 133 CM - 592 CM - 248.5 CM - 882 UM -135 UM -918 nm - 557 um -866 A -846 A -199.5 UM - 195 nm - 152 CM -705 mm -552 A - 507 A -334 A - 649 um - 75 A -800 A -274 mm - 691 cm -53 CM - 87 NM -621 CM - 285 nm -727 MM - 268 NM -28 mm - 360 UM -428.5 um -253 mm - 794 um -814 cm -858 cm - 70 CM -915 UM -970 cm -336 NM - 938 um - 574 mm - 578 CM -137 NM -449 um -587 UM -615 CM - 850 cm - 549.0 mm -839 NM - 896 cm -579 CM -507 um -772.0 mm - 318 mm - 490 UM - 535 MM -328 mm - 504 A - 694 A - 544 CM -782 UM - 374 cm -703 A - 496 CM -396 CM -870 um -581 CM - 384 MM - 328 mm -337 um -707 um -109 mm - 775 mm - 524.0 um -660 UM -637 CM -231 CM - 107 NM - 830.5 CM -180 um -125 cm - 97 UM - 277 CM -382 um -264 cm -438 MM - 630 mm - 870 CM -167 um - 976 MM - 92 mm - 948 UM -787 um -789 cm -689 NM -542 NM - 109 CM -250 NM - 321 A - 781 um - 216 cm -351 mm -851 A - 850 mm -319 CM - 229 A -247 cm -647 UM - 895 nm -472 NM -280.5 NM -428 mm -726 NM -382 nm -606 um -456 um - 840 UM - 97 nm -413 mm - 537 A -910 A - 622 mm - 830 UM - 214.5 MM -374 A -93 um - 870 mm - 8 cm -186 CM - 454 um -78 A -31 mm - 133 cm - 402.5 um -989 CM - 453.0 MM -618 cm - 468 mm - 569 NM -72 MM -845 NM -190 um - 269 mm - 626 mm - 974 mm - 779 mm -367 UM - 781 A -575 um - 414 MM - 990 mm - 613 um - 341 um -279 CM - 506 mm -241 um - 273 NM -34 CM - 38 UM -766 um - 528 CM -850 MM - 205 UM -229 UM - 476 cm -937 CM -153 NM -773 CM -467 MM -79 UM - 283 A -2 MM - 61 UM - 557 mm -215 um - 252 UM - 15 A - 660 UM -459 NM - 894 mm -824 CM - 192.5 NM - 963 nm -389 A -970 nm -399 um -15 NM -215 um -849 um -660 nm - 627.0 mm - 330 cm -173 nm -532 cm - 524 cm - 443 CM -136 nm -788 A -154 UM -785 A - 372 mm - 620 MM - 25 CM - 525 NM -947 um -456 NM -7 MM -124 NM - 464 cm -919 MM -333 NM -62 A -479 UM -437 MM - 431 UM -885 A -525 nm - 337 UM - 945 um -949 MM -330.0 CM -446 mm - 284 MM - 618 nm - 678 um -553 A - 918 UM - 599 nm -349 um - 956 nm -758 UM -710 nm -862 um - 89 cm - 146 NM - 964 A -438 nm - 307 MM - 875 cm -312 cm - 796 nm -172 MM -41 CM - 13 UM -53 MM - 892 UM -392 NM -372 um -297 CM -563 CM - 490 cm - 208 UM - 461 CM - 105.0 nm - 770 cm - 304 mm -260 mm -675 nm - 670 nm - 546 um - 567 A -538 NM - 833 CM -560 nm -365 A - 596 A -254 cm - 814 NM - 122 um - 823 CM -170 um - 954 mm -237 um -27.5 CM -131 mm - 878 NM -234 UM -9 nm - 850.0 mm -991 um - 792 A -262 nm -849 mm -3 UM - 557 A -863.0 NM -978 nm - 338 MM -255 MM -568 NM - 263 UM -454 MM - 721 NM -141 mm - 547 CM - 455 CM - 19 UM - 760 UM - 260 nm - 790 mm - 9 CM - 559.0 nm - 281 NM - 826 nm - 779 CM - 915 cm -81 mm -887 cm -566 UM - 702 CM - 671 MM -555 mm - 840 mm -879 MM - 30 cm -262 mm -276 CM -365 NM -602 MM - 555 mm - 20 nm -964 cm -899 um -550 NM - 397 NM -84 um -572 NM -427 A -443 A -112 um - 217 CM - 951 NM - 696 nm - 664 nm -539 um - 292 MM - 1000 mm -110 um - 541 mm -335 NM - 377 MM -790 nm - 636 MM - 51 MM -53 UM - 271 MM -814.0 mm -15 CM -62 CM -521 NM -409 nm - 177 NM -860 um - 311 CM - 104 nm - 629 MM -174 nm -436 NM -438 A -830 nm - 962 mm - 403 um - 319 A - 142 MM -471 mm - 226 NM - 532 mm -756.5 nm -839 mm - 414 A -931 MM - 755 CM -750 A -77 CM -916 um - 118 um - 479 UM -50.5 um - 688 cm -744 um - 401 um -526 UM - 788 mm -719.0 A -965 MM - 412 mm -101 A - 457 mm -627 A -406 cm - 699 CM -578 MM -424 nm -926.0 nm -474 NM - 728 UM -514 nm -464 um -934 UM -439 cm -886 NM -7.5 UM - 281 NM -454 cm - 755 A - 346 mm - 238 mm -416 mm - 433 CM -32 A -641 A - 726 UM - 598 CM - 491 mm - 516 CM - 823 MM -82 cm -496 mm -601 NM -920 UM -618 MM - 886 CM -445 A - 561 um -919 A -454 cm -188 um -382 mm -149 A -593 nm - 329 mm -862 CM - 514 MM -714 UM - 347 um - 401 mm -324 cm -520 NM -863 nm - 130 A -561 NM -266 CM -689 cm -945 A -638 UM - 509 nm - 48 CM - 100 A - 59 A - 279 mm -68 UM - 934 mm - 784.0 cm - 84 CM - 525 UM -627 mm - 219 UM -478 A -169 UM - 150 A - 412 mm - 668 um - 407 MM - 737 A - 594 nm -617 MM - 410 CM - 414 NM -805.0 CM - 242 MM - 349 cm - 552 CM - 751 MM - 287 um - 662 cm -717 UM -882.5 mm - 534 UM - 353 A - 57 CM - 881 mm - 791 nm -700 cm -661 CM -913 UM - 55 MM - 514 MM - 614 nm - 488 mm -701 UM -169 mm - 424 A -619 um -910 NM -851.5 MM - 100 cm - 407 nm - 95 mm - 894 CM -352 mm -848 mm - 886 cm - 704 A - 394 cm -926 CM -892 UM - 586 UM -363 NM -570.0 UM - 190 MM - 812 nm - 138 MM -788 mm -659 CM -309 mm -288 um - 723 nm -199 cm - 336 MM - 769 mm - 15 UM -670.0 UM -768 um - 737 UM - 337 NM -317 UM -735.5 nm - 588 UM - 115 MM - 923 UM - 482 UM - 286 NM - 318 MM -590 nm -116 um -858 CM - 8 um -596 cm - 874 MM -10 nm -37 cm -307 UM -82 MM -443 MM - 735 A -936 UM - 151 CM -875 UM - 462 MM -796 UM -783 um -200 UM - 997 A - 821 NM -931 cm -126 UM -412 cm -179 mm -415 UM -303 cm -647 cm -464 MM - 580 nm - 761 UM -105 um - 919 nm -791 CM - 424 nm -785 mm - 771 nm -686 nm - 695.0 A - 392 CM -758 cm - 781 mm -339 mm -906 A -985 NM -582 cm -371 A -444 cm -692 um -396 MM -611 CM - 931 mm -263 cm - 130 NM - 528 nm - 87 um -17 mm -339 cm - 894 CM -777 NM - 65.5 A -79 CM - 463 cm - 531 MM - 250 mm -544 CM -107 um -414 nm - 363 um -748 cm - 753 NM -15 A -373 MM -962 MM -356 um - 270 MM - 182 NM - 131 mm -599 um -976 um - 423 A -478 A -506.0 NM - 16 A - 297 cm - 469 NM - 134 NM - 179 nm - 670 A -87 NM -152 mm - 397 nm - 84 A -98 MM -547 NM -884 MM - 479 um -439 A -538 CM -236 cm -145 NM - 513 MM -835 MM -958 nm - 720 NM - 653 MM - 286 A - 779 cm - 922 NM - 455 MM -602 UM - 966 MM - 401 A -593.0 mm -862 nm -379 MM - 21 um - 139 um -352 A -286 cm - 193 cm - 376 cm -76 um -44.5 nm -290.5 MM -329 A - 514.5 MM -867 UM -49 cm -893 CM -548 um -999 cm -764 mm -182 um -512 um -727 MM - 363 cm -287 cm -348 nm - 629 MM -599 MM - 605 cm - 180 CM -210 nm -112 MM -95 NM - 688 mm - 605 mm - 829 um - 849 UM - 761 MM -278 NM -313 nm -859 MM - 545 um -336 A - 19.0 CM - 820 CM -376 MM -466 NM -624 NM - 127 MM -88 cm -821 NM -675 CM -952 cm - 217 um -242 cm -463 UM -510 CM - 967 NM -903 NM -543 MM -196 nm -885 um - 424 MM -125 CM -704 NM -416 CM - 254 mm - 294 NM -801 MM -685 mm - 83 A - 345 cm -698 NM -42.0 MM -604 nm -182 CM -649 MM -909 CM - 629 UM - 659 nm - 291 NM - 433.0 CM -956 MM -408 um - 309 MM - 213 A - 712 nm - 4 CM -259 CM - 186.5 A -347 nm -799 MM -352 mm -241 mm - 599.5 cm -78.0 A - 198 cm - 153 CM -217 cm - 522 CM -291 um - 487 cm -551 um - 406 CM -834 MM - 7 UM -898 CM -650 NM - 784 nm -85 UM - 602 UM -583 CM - 727 um - 61 A -574 NM -152 NM - 248 UM - 130 mm -371 cm - 509 mm -405 nm -43 MM -879 um -34 NM - 480 NM - 62 CM - 783 nm -536 UM -414 UM -589 UM - 459.5 A - 482 NM - 619 MM -341 MM -196 UM -93 MM - 265 UM -645 A -547 nm -708 um - 713.5 cm -594.0 MM -59 cm -616 cm - 25 mm - 661 A -264 um -778 um - 439 MM - 24 nm -351 mm -805 MM - 32 cm - 35 mm -610 CM - 473 A - 284 mm - 573 MM - 980 A - 10 MM - 388 mm -721 um -979 A - 262 nm -584 mm - 840 A - 198 UM - 174 cm - 296 cm -485 mm - 960 CM - 586 um -499 MM -439 MM - 210 um - 945 cm -525 um - 126 cm -17 A - 307 A -762 NM - 631 um - 244 mm - 758 um -506 nm -843 um -467 nm -202 cm -389 cm - 365 nm -453 CM - 389 MM -130 A - 773 MM - 215 um -158 NM - 575 NM -860.0 MM -403 cm -912 cm - 114 nm - 704 um - 232 cm -777 um -856 UM -926 um - 110 nm - 517 MM - 312 MM -163 NM - 588 UM -882 nm -273 um - 718 nm -489 nm - 829 A -666 NM - 178 mm -702 MM -851 CM - 17 UM - 910.0 MM -943 mm -111 NM -508 mm -657 CM -458 NM -805 NM - 473 MM - 253 UM -511 NM -371.5 UM - 194 UM - 822 A - 501 NM -131 cm - 691 UM -19 um - 500 nm -102 um - 921 nm -416 um -63 nm -650 mm - 444 mm - 510 mm - 635 MM -972 nm - 612 nm - 976 CM -713 um - 691 A - 833 mm - 526 NM - 813 A -846 mm -572 mm - 814 um -647 mm -623 NM - 744 NM - 176 UM -672 mm -844 um -724 MM - 938 mm -528 MM -369 um - 98 CM - 690 nm -650 nm - 371 cm -975 mm - 913 MM -260 cm - 692 CM - 609 A -161 cm -408 A - 964 UM - 877 UM -125 MM - 668 NM -462 cm -287 UM - 262.5 CM -446 um -552 CM -433 CM - 338 um -872 A - 958 A - 259 UM - 310 A -692 um -774 cm -741 mm - 958 CM -56 MM -42 um - 590 CM - 784 UM - 913 CM - 330 cm -514 nm -99 NM -695 nm - 846 nm -240 nm -159 A -292 NM -809 UM -395 mm -314 nm - 859 CM - 890 cm - 812 CM -184 cm -979 UM - 536 NM - 868 CM - 735 nm -855 um - 846 nm -822 mm - 576 um -447 A - 806 nm - 223 um - 630 um - 16 um -868.0 CM - 837 mm -90 MM -888 MM - 369 um - 753.5 um - 173.5 NM - 450 um -366 cm -84 CM - 86 CM -710 cm - 993 NM -550 NM -1000 NM - 431 UM -396 CM -539 mm -96 MM - 186 cm - 591 A -457 CM - 765 cm -524.5 cm -143 NM - 653 UM -238 MM -679 MM -569 nm -478 A -502 A -417 nm - 941 NM - 906.5 A -596 A -564 MM - 196 A -800 nm -338.0 nm -964 A -349 A -548 mm -160 NM - 271 A -467 nm -115 MM - 303 MM -677 A - 457 CM - 741 MM - 572 um -7 nm - 709 MM - 559 um - 745 A -145 A - 640 cm - 952 CM -729 CM -682 um - 945 UM -664 nm - 764 cm -845 UM - 430 NM -616 um - 34 NM -436 um - 716 nm -980 mm - 434.0 CM -280 NM - 194 NM -290 A -898 MM - 186 NM -725 cm - 231 um -870 cm -601 um - 605 A - 757 CM - 176.5 A - 33 nm - 296 UM -638 cm -571 NM -295 um -553 NM -830 NM - 801 UM -52 um - 869 mm -67 UM - 176 nm -359 cm -116 CM - 436 um -521 NM -200.5 A -928 NM -108 um -933.0 UM - 919 um -551 mm - 80 um - 407 UM -749 A -513 A - 108 MM -302 UM -982 MM - 395 MM -389 UM -445 nm -311 A - 267 mm -608 um -70 nm - 648 CM -806 UM -164 UM -557 A - 506 NM -99 A -674 A -900 nm -902 nm -406 UM -254 A -553 nm -50 mm - 838 MM -411 NM - 28.0 nm - 58 MM -309 mm -912 UM -632 MM - 445 UM -638 um -719 cm -423 um -827 cm - 366 mm - 305 cm -782.5 CM -623 UM - 679 mm -740 NM - 693 A -621 mm -688 nm - 913 A -841 MM -406 A -995 CM - 388 um - 978.5 UM - 384 NM - 484 nm -153 NM - 685.5 UM -360 A - 405 CM - 216 mm - 837 cm -753 NM -924 cm - 412 MM - 780 cm -24 um -258 um - 631 CM - 833 MM -606 cm -863 cm -236 um - 588 um -610 mm - 597 CM - 985 mm -941 UM -524 mm -547 UM -329 CM - 253 UM -988 cm -831 UM -457 A - 362 cm - 473 NM -508 UM -959 CM - 838 cm -482 A -565 A - 855 um -801 nm -413 nm -440 NM - 949 NM -489 um -660 MM - 923 um -869 nm -438 A - 694 mm - 256 mm - 767 NM - 107 CM - 181 CM -200 um - 764 um -110 nm -41 NM -822 CM -315 A -750 CM - 931 nm - 149 mm -492 mm - 909 MM - 878 CM -124 nm -957 NM - 353 mm - 706 NM -761 cm -237 NM -866 um - 267 MM -319 A -725 mm - 568 nm -633 mm -520 mm - 915 MM - 518 mm -767 CM - 751 UM - 412 CM -30 MM - 138 MM -531 A -375 CM - 225 um - 371 nm -2 CM - 77 um -157 um - 785 MM -140 NM -107 mm - 247 UM -464.0 MM - 842 cm -25 mm -619 nm - 602 A - 186 A -983 CM -720 CM -436 cm - 162 UM -248 cm -435 nm - 955 um -685 MM - 689 CM -426 mm -135 UM - 933 CM -760 mm -555 A -44 um - 26 mm -487 NM -602 um -102 A - 660 A - 391 CM - 621 cm -156 um - 367 A - 193 UM -797 nm - 45 nm -44 cm - 675 cm - 900 NM - 368 A -665 cm -459 cm -852 cm - 546 MM -162 MM - 150 mm - 462 MM - 737 A - 970 um - 884 A -365 UM - 709 NM -15 cm - 363 CM - 502 cm -294 NM -83 cm - 854 MM -198 nm - 821 UM - 545 nm - 338.0 um - 520 mm -730 mm -167 um -88 mm - 688 MM - 285.0 um - 256 mm -849 mm -116.0 A -587 nm -727 um - 612 NM -953 um -253 A - 908 cm -495 MM - 143 um -300 NM -898 NM - 808 NM - 256 UM -748 CM - 830 um -56 NM - 418 um -203 CM -24 cm - 875 UM - 170 UM -268 NM - 478 mm - 398 MM -943 mm -681 nm - 217 cm - 820 cm -901 UM -155 CM - 550 mm - 483 mm - 976 A - 151 MM -530 UM - 498 CM -210 cm -719 NM -88 NM -629 A - 807 MM - 447 cm - 366 cm -650 nm - 529 CM - 261 cm - 738 UM -187 NM -699 um - 199 nm -25 nm -394 mm - 741 nm - 462 NM -43 UM - 817 A - 405 nm -501 um -4 NM -120 CM -412 MM - 314 mm -109 MM -473 MM -148 CM -170 UM -433 nm - 610.0 um - 938 NM -1000 MM - 883 cm -516 NM - 890 NM -629 A -153 MM - 642 NM - 333 MM -7 nm -475 CM -903 mm - 48 NM - 861 mm - 503 um -708 nm - 800 nm -813.0 CM -959 A - 664 cm -795 A - 832.0 MM - 462 nm -193 CM -948 um -970 CM -666 UM -508 mm -122 MM - 890 CM - 821.0 mm - 107.5 UM - 62 um - 967 A - 798 mm -177 UM - 420 MM - 175 cm -622 A -601 CM - 219 cm - 987 UM -607 nm - 306 cm -613 um - 177 cm -72 A -896 mm -39.0 UM - 525 NM -855 CM -746 A -130 CM - 900 um - 880 CM -711 CM - 776 um - 636 nm - 580 UM - 766 A - 149.0 MM -414 MM -781 nm -329 NM - 290 MM -633 mm -197 mm -645 NM -338.5 nm - 318 A -697 nm -930 A - 958 CM - 606 UM - 216 NM - 139 nm -780 nm -972 A - 925 A -371 MM -64 UM - 285 mm - 25 NM - 931 NM - 788 A -564 CM -177 NM - 471 um -665.0 A -10 NM -16 um -87 MM -439 nm -413 CM -193 MM - 230 A - 46 cm - 435 UM - 46 cm - 342 cm - 940 A - 531 cm -237 nm - 993 nm -876 mm -448 A -602 UM - 769 A -6 NM - 20 NM - 127 A -512 nm -587 nm -452.0 MM -856 UM - 399 NM - 352 CM -910.0 mm - 232 nm -133 NM -552 nm -278 MM -383 MM - 480 MM -600 UM - 465 um -857 cm - 823 mm - 501 UM - 431 cm -791.5 CM -903 mm -77 mm -307 A -549 UM - 971 um -234 MM -774 UM - 8 NM - 90 NM - 875 nm -345 UM -396 mm - 5 UM -281 MM - 345 MM - 446 cm -770 A - 942 mm - 706 CM - 654 UM - 634 cm - 966 UM -340 A -371 nm -870 MM - 604 um - 187 NM -111 nm - 698 CM -559 A -237 CM - 40 mm - 586 nm - 546 UM -525 mm - 509 um -344 CM -573.5 cm -208 A -179.5 NM -871 nm - 854 A - 540 um -196 UM - 480 UM - 590.0 CM -102 cm - 836 um - 180 mm -819 UM - 175 CM - 976.5 UM - 766 NM - 902 NM -440 cm -931 nm - 377 UM - 493 mm - 67 CM - 995 CM - 100 NM -94 A - 509 MM - 202 MM - 139 UM -300 um -940 um -584 nm - 53.0 CM - 566 A -811 A -71.5 um - 662 um - 78 nm - 652 nm - 914 um -836 NM - 933.5 mm - 241 CM -256 cm - 647 mm -168 mm -19 MM - 847 UM - 534 MM -735 CM -853.5 nm - 631 mm - 407 um - 778 cm - 776 A - 1 mm - 516 nm - 629 um - 213 mm -641 UM -205 um - 690 mm - 982 mm - 268 MM - 660 mm -642 UM -954 um -268 um -300 CM - 96 NM - 257 um - 345 um - 846 A - 966 mm - 101 CM -751 nm - 192 UM -261 nm -601 UM - 263 cm -254 CM - 922 A - 54 CM -892 mm - 439 NM - 69 NM - 800 um - 118 cm -243 cm - 448 cm -100 nm - 214.5 NM - 813 A - 367 mm -333 cm -308 cm -702 CM -345 cm - 224 MM -271 cm -49 CM -43 um -308 mm - 146 A -1000 NM -145 um - 945 MM -491 cm -338 A - 53 um - 946 cm - 474 A - 608 UM - 546 CM -543 cm - 344 um -418 UM - 869 UM - 971 nm - 894 mm - 895 CM - 280 CM -921 NM - 942 UM - 538 NM -67 MM - 890 CM - 28 A -731 MM - 381 MM -837 um - 545 CM -707 MM - 232 UM -968 mm - 477 MM - 814 A - 84 MM - 456 CM -75.0 mm - 580 mm -187 MM - 917 A -150 cm - 869 A - 750 MM - 91 NM -693 CM -102 CM - 753 um - 780 A - 98 UM - 574 um - 959 UM -995 A -975 NM - 335 NM - 998 um - 247 cm -302 cm - 816 A - 267 UM - 46 mm -967 A -91 um - 499 nm - 836 mm -450 um -954 MM - 382 NM - 738 nm -77 cm - 618 UM -493 nm -423 NM - 845 CM -726 MM -513 MM -156 um - 509 MM - 142 cm - 305 um -541 CM - 547 UM -889 UM -67 A -916 A - 46 MM - 500.5 mm -23 UM -89 um - 542 CM - 615 mm -18 um -538 um -131 nm - 594 NM - 200.0 MM -793 NM -266 NM -596 UM - 804 um - 743 mm - 870 A -735 A -765 um - 808 nm -871.5 UM - 916 NM -990 cm -476 nm - 604 um - 163 cm - 407 MM - 655 cm - 193 cm -683 nm -854 NM -93 um - 138 CM -73 nm - 581 MM - 878 CM - 860 MM - 272 nm -381 cm - 102 A - 439 mm -688 A - 507 MM -166 mm -993 um -54 um -928 CM - 113 cm -903 MM - 873 mm -672 um -864 MM - 846 CM - 683 NM -118 A -790 um - 30 nm - 519.5 CM - 125 mm - 254 UM - 737 mm -662 A - 724 cm -437 um -72 nm - 295 nm -567 mm -5 um - 441 cm - 997 um - 891 A - 409 um - 578 um - 543 MM -634 MM - 567 cm - 569 UM -43.5 A -838 nm - 829 UM - 392 MM - 880 UM - 880 NM -410 CM - 815 cm - 542 um -39 NM - 481 cm -88 mm - 895.0 um -74 um - 85 cm -563 A -523 MM -259 nm -691 MM -739 MM -937 CM -402 CM - 997 NM - 744 cm -371 um - 590 MM - 321 CM - 840 nm -782 NM - 646 NM -778 mm -35 UM -529 UM -473 um -69 um - 999 NM -10 cm - 38 cm -20 NM - 265 A - 759 NM -890 CM -972 CM -763 UM - 327 cm - 29 NM - 123 NM - 639 A - 127 NM - 643 mm - 154 NM - 915 cm -770 UM -509 MM - 82 A - 195 A -635 cm - 79 mm - 179 um -123 cm - 772 mm -641 A - 133 MM - 342 mm - 939 um - 177 CM -886 um -134 A - 376 NM - 877 cm -997 um - 144 NM -828 CM -792 cm -929 MM -485 um - 127 um - 303 CM - 803 cm -657 A - 26 nm -585 A -336 UM -578 mm -198 A - 595 nm - 981.0 CM - 591 cm -967 nm -79 um - 759 UM - 717 mm -505.0 um -299 nm - 537 MM -251 mm -164 NM - 878 um -529 NM - 825 um - 774 MM - 149 cm - 778 NM - 607 CM - 923 nm - 26 mm - 376 nm - 654 nm -315 cm - 21 cm - 208 um -61 CM -792 mm - 588 A -939 NM - 982 mm -413 NM - 360 nm - 295 mm - 834.5 CM -34 nm -517 um -721 CM - 914 um - 359 NM -695 cm -509 A -772 UM - 240 NM - 715 mm -399 UM -893 cm - 123 A -489 cm -940 NM - 639 mm - 212 um - 190 UM -666 A -368 CM - 287 CM -69 um -523 nm - 606 mm - 87 A - 892 um - 931 um - 185 nm - 542 CM -763 UM - 948 mm -973 cm - 537 NM -966 mm -930 um - 364 UM -526 A -112 UM - 54 MM - 714 um - 677 MM - 88 NM -187 A -784 MM -867 UM -705 mm -675 mm -100 um -630 mm - 866 CM - 876 mm - 721 A - 676 UM -609 MM - 579 NM -396 CM - 549 NM -33 cm - 275 A - 930 um - 511 CM - 780 NM -359 UM - 695.5 UM - 194 mm -823 A - 381 cm - 628 CM -955 nm -855 UM -908.0 A -89 mm - 846 UM -699 MM - 536 cm -823 NM - 225 nm - 680 MM - 816 cm - 584 A - 157 CM -88 mm - 193.0 NM -783 CM - 598 NM - 897 UM -775 MM -981 MM - 185 mm -88 nm - 518 mm -298 CM -103 NM -403 MM - 9 MM -384 cm - 219 A -848 MM - 791 MM -625 UM - 481 NM - 354.5 A - 110 mm -661 UM -663 CM - 323 um - 819 mm - 850 NM - 229 um - 787 A - 258 cm -72 MM -578 cm - 831 um - 411 MM - 976 CM -23 CM -876.0 um -181 NM - 186 nm - 275 um -650 cm - 933 mm -355 UM -284 um - 69 NM -526 A - 955 cm -250 NM - 901 nm -217 A - 681 cm -956 CM -396 MM - 728 NM - 627 MM -673 um - 936 mm -889 NM - 999 MM -989 mm -822 cm - 707 CM - 596 UM - 327 A -746 mm - 952 um -310 um -95 UM - 908 A -249 MM -359 mm - 914 A - 628 nm -303 CM -904 um -867 mm -257 cm -710 UM - 958.0 um -222 MM - 601.5 UM - 784 NM - 654 NM - 657 UM - 537.5 UM -699 cm -664 mm -89 um - 329 cm -201 nm -981 CM - 484 MM - 226 cm - 825 MM -625 UM -207 um -640 CM -703 mm - 315 cm - 207.5 cm - 118 MM -655 NM -340 UM -639 MM - 633 mm - 652 nm -887 cm - 595 UM - 350 CM -400 UM -654 NM - 919 A -916 mm -758 UM - 130 A -943 mm - 996.0 A - 404 A -70 A - 50 NM - 464 um - 101 CM - 937 um -360 NM -959 NM - 991 CM - 372 A -723 UM - 322 mm - 400 cm -935 CM - 14 MM -53 cm -55 um -586 mm - 692 NM - 260 A - 771 MM -35 CM - 525 cm - 921 cm -980 nm -419 nm - 921 nm -912 UM - 513 mm - 149 cm - 822 CM - 515 um -632 A -442 NM - 192 mm - 922 um -885 CM -834 A -402 um -394 UM - 467.0 um - 554 CM -730 A -57 CM - 806 NM - 941 um -119 um -996 mm - 215 UM -823 NM -594 cm - 138 NM -112 CM -561 MM -839 UM - 236 cm - 716 CM - 616 CM -347 cm -327 mm - 357 um - 960 CM -752 cm -839 um - 550 UM -456 MM -888 UM -511 MM - 294 UM -95 UM - 581 MM - 75 um -391 MM -358 cm -301 mm - 125 A -693 CM -813 UM -133 MM - 595 NM -564 nm - 925 cm - 181 UM -565 CM - 363 MM - 365 CM -688 mm -634 MM -778 mm - 108.5 mm -28 A - 740 cm -731 NM -937 NM - 7 mm - 657 NM - 440 A - 70 um - 314 NM - 655 MM -168 NM - 568 A -39 A - 123 mm -467 UM -64 um - 569 um -130 CM - 76 MM -568 um - 576 CM - 249 MM - 639 nm -975 UM - 88 A - 663 CM - 653 MM - 967 MM -750 NM - 795 mm - 84 UM -74 cm - 425 mm -480 UM -359 NM - 841 NM - 111 um - 379 cm - 158 cm - 129.5 cm - 343 MM - 770 MM - 552 UM -290 um -986 A - 16 UM - 181 cm - 82 CM - 327 MM - 894 MM -335 MM - 702 nm - 446 um -206 A -653 MM -547 A -777 cm - 39 nm -873 A - 174 UM -689 cm - 174 mm - 745 MM - 559 mm - 176 A -424 UM - 292 cm -713 NM - 723 CM - 394 MM - 24 NM -711 NM - 423.0 MM - 784 MM -755 cm - 213 UM - 909 CM - 347 cm - 479 um - 294 mm -708 A - 800 NM -537 UM - 3 cm -546 MM - 267 NM - 464 nm - 391 nm -131 CM - 709 nm - 307 nm -867 CM -793 mm -62 cm - 516 UM -457 CM - 700 CM - 450 cm -106 nm -917 MM - 140 nm - 333.0 um - 523 UM - 818 mm - 757 NM -663 CM - 508 A - 210 CM - 516 UM - 435 um -587 MM -224 um -841 NM - 178 nm -101 A -81 CM - 323 cm - 910 CM -500 mm - 743 cm - 781 nm - 494 UM -748 UM -183 mm - 669 UM -324 A - 227 mm - 552 A - 35.0 um -596 cm -261 CM -465 NM - 761 um -343 cm -910 nm -547 A -774 A - 131 mm -277 cm - 616 CM - 735 NM -904 A - 845 cm - 495.5 mm - 380 nm -250 cm -592 CM - 619 NM - 232 UM - 909 MM -171 CM -486 A - 497 CM - 555 um - 393 um -121 mm -993 mm - 230 cm - 929 A -44 NM - 426 mm -598 A -777 A -975 mm - 841 MM - 378 CM - 363 UM - 617 MM -116 cm -27 um - 755 um - 474 um -161 NM -823 NM - 655 NM - 380.0 NM -465 cm - 884 cm - 787 CM - 347 cm -233 nm -923 NM - 20 NM - 151 nm -901 um - 690 A - 397 mm -471 um - 9.0 CM - 43 nm -459 cm -715 A -337 nm -93 A - 874 mm -870 A -966 CM - 627 CM - 691 cm -363 mm - 736 cm -828 cm - 898 mm - 508 MM -894 um - 574 NM - 292 cm -482 MM - 90 A - 539 UM -98 NM -1 A -26 A -140 um -233 MM - 595 MM -859 CM -251 MM -514 CM - 255 mm -720 CM - 957 MM - 187 MM -291 um -944 UM -276 cm -219 MM - 186 A - 579 CM - 430 um -737 nm - 950 nm -525 NM -39 mm -268 nm -671 UM - 92 CM -321 mm -619 um - 390.5 cm -59 MM -961 um -176 NM - 562 mm -889 CM -64 mm - 595 UM - 940 MM -331 A - 983 nm -828 CM -170 CM -388 CM - 369 um -34 NM -144 CM - 589 CM -457 nm -514 A -276 UM - 607 A -436 MM - 130 mm - 878 A -516 NM - 955 cm -562 nm -439 CM -305 cm - 452 UM -373 A - 183 NM - 428 NM -588 NM - 453 A -303 nm - 10 cm -953 um -479 nm - 556 cm -34 mm - 26 MM - 952 UM - 245 nm - 435 UM -725 MM - 304 nm - 372 UM - 128 nm -593 CM - 541 MM -848 cm -608 um - 319 MM -490 A - 466 MM -462 nm - 304 mm - 228 A -622 NM -765 A - 140 mm -326 MM -949 UM - 430 MM -47 nm -645 A - 68 NM -556 nm -381 MM -858.5 UM -894 UM -205 MM -33 mm -661 mm - 915 um -601 A - 876 nm -292 cm - 808 um - 138 A -330 NM - 144 CM -508 A -12 NM -418 nm -61 nm - 483 nm -15 CM - 850 um - 912 UM -413 UM -331 A -816 cm -398 A - 942 mm - 320 A -458 CM -120 A -460 cm -850 mm - 52 um - 705 NM -73.0 NM - 263 nm -221 A - 845 MM - 771 um - 632 UM -166 UM -523 cm -756 nm - 785 CM - 956.0 UM -510 UM -444 um -291 um -853 cm - 577 nm -805.0 UM -38 NM - 986 nm - 955 UM - 787 MM -341 CM -789 MM - 505 UM -630 mm - 864 MM -803 UM - 714 nm -876 um - 503 nm -190 MM -83 MM - 232 CM - 4 NM -324 NM - 701 MM -488 CM -11 nm - 489 MM - 415 nm -616 CM -810 NM - 395 CM -62 MM - 887 nm -845 MM -41 MM - 758 NM - 519 MM - 157 CM -952 nm -425 mm -621 um -913 um -565 UM - 334 cm - 741 cm -662 mm - 656 cm -715 nm -189 MM -873 nm - 373 um -287 mm -744 A -441 mm - 336 UM -598 CM - 694 NM - 173 nm - 701 MM -801 cm -38 MM -201 CM -373 nm -507 CM -121 nm - 523 CM - 738 MM -901 UM -501 um - 977 cm - 513 A -824 nm - 355 UM -791 A -688 A -441 nm -419 nm - 182 um -267 um - 992 mm - 901 NM - 10 NM -566 CM - 512 um -708 A -668 cm -244 um - 313 A -235 um -714 NM - 54 CM - 709 um -183 nm - 347 um - 434 A -647 um - 521 cm - 226 mm -324 A -774 A - 961 nm - 448 nm - 528 UM - 271.0 cm -688 um - 550 um - 604 MM -435 um - 744 nm - 324 A - 245 mm -496 cm - 427 NM - 666 CM - 221 mm -226 mm -465 um -952 UM - 335 CM -149 MM -416 nm - 72 NM -240 UM - 965 NM - 961 CM -202 CM - 505 CM -151 MM -824 um -494 cm -2 NM - 844 mm - 543 nm - 92 mm - 89 CM - 35 nm -878 nm - 953 mm - 98 MM - 523 CM -545 cm -376 MM -453 nm - 196 cm -867 UM -247 NM -494 NM - 317 mm - 531 A - 456 um -544 MM -275 cm -400 cm -288 UM - 468.0 CM -6 MM -511 nm -574.5 CM - 83 mm - 384 MM - 893 NM -572 cm -270 NM -867 nm -400 UM - 185 A -848 A - 614 mm -84 cm - 492 um -820 cm - 105 MM -71 nm - 913 UM - 279.5 um -741 A -423 um - 445 nm -824 UM - 119 mm - 928 MM -756 CM - 451 UM -595 nm - 452 nm -944.5 CM - 88 cm -376 nm -181 A -696 cm -59 UM -268 NM - 950 mm -806 NM - 30 UM -791 um -44 MM -519 cm -924 MM -915 cm - 970 cm - 158 um -488 um - 695 CM -2 mm - 672 um -44 um - 366.5 cm - 269 MM -346 NM -258 CM - 483 A -824 A -757 A -379 mm -876.5 A - 316 nm - 858 NM - 469 nm -528 A -795 CM - 891 cm - 630 NM -789 MM - 908 nm -181 NM - 397 cm -604 MM - 315 UM -121 CM - 978 um -261 um -762.5 nm -90.5 mm - 611 UM - 493 NM -52 um - 326 cm -631 um -708 nm -694 um - 464 nm -835 um -740 mm - 262 UM -714 MM - 864 A -640 UM - 143 nm - 679 A - 516 CM -515.5 nm -816 A -648 UM -193 CM - 952 CM -416 UM -477 cm -631 CM - 589 cm -490 um - 963.0 MM -149 CM - 790 NM -386 MM -736 mm - 341.0 A -46 nm - 511 cm -459 cm - 850 CM - 884 UM -459 um - 432 nm -674 nm - 505 um - 56 A -294 CM -617 mm - 224 nm -607 NM -974 cm -970 NM -809 cm - 505 A -766.0 mm - 231 mm - 665 A - 708 NM -698 NM -621 um - 923 CM - 981 NM -237 CM -232 um - 567 MM - 908 MM -585 MM - 475 nm -230 MM -847 nm - 928 um -642 cm -890 CM - 693 cm - 612 nm -546 A - 853 cm - 973.5 CM - 498 UM -222 nm - 970 MM -255 A -28 CM -398 CM -710 UM -439 UM -157 cm -534 mm -991 cm - 327 mm -983 NM -825 CM - 319 UM -981 um -158 A - 324 um - 153 MM - 427 mm - 443 A - 692 UM -77 MM - 459 A - 218 CM - 502 mm -975 mm -19 NM -992 mm -227 UM -858 mm - 405 CM -53 NM -425 MM - 158 cm -223 um - 979 NM -851 UM -296 A -962 MM - 867 cm - 541 NM -114 nm -788 MM -136 MM - 225 UM -76 A -855 cm - 699 cm - 183 NM - 799 A - 255 mm -120 UM - 699 A - 224.5 CM - 847 UM - 424 CM - 741 NM - 56 um -976 CM -481 NM -619 UM - 600 A -541 MM -26 A -162 NM -388 CM - 955 UM - 503 A - 656 UM -136 UM -222 NM -225 UM -871 A -791 A -167 CM - 246 UM -232 CM - 538 mm -229 UM -234 NM -518 NM - 258 um - 272 MM - 196 A -149 MM - 19 NM -489 cm - 676 nm -103 MM -858 mm -948 CM - 599 cm - 332 mm - 668 mm -923 um - 975 cm -51 MM - 865.5 nm -934 um -959 MM -800 NM - 808 nm - 932 A -875 A -981 A -960.0 NM -510 CM - 970 NM -295 mm -91 CM -691 CM -308 mm -377 UM -185 CM - 116.5 um -921.5 MM - 18 CM -334 NM - 418 nm -919 UM -185 cm - 159 cm - 79 A -46 NM - 499 mm - 795 cm - 898 um -603 mm - 91 um - 65 nm -933 um - 472 NM -957 um - 180 nm - 980 mm - 85 mm - 323 CM -752 um -924 MM - 975 mm - 118 UM - 656 nm - 704 um - 590 A -163 CM - 459 CM -242 mm - 288 A -961 mm -905 CM -353.5 MM -844 um - 33 MM - 435 UM -113 nm -965 um - 771 nm -659 um - 310 MM -576 UM - 295 MM -687 UM - 607 mm -346.5 NM -793 UM - 863 UM - 371 cm -152 um -186 MM -604 MM - 780 um -347 CM - 983 UM - 372 CM - 761 mm -82 um - 762 um - 77 CM - 1000 UM - 146 A - 868 um - 640 MM - 48 um -268 cm -330 um -6 NM - 865.0 cm -906.0 NM -39 nm -756 um - 232 UM -890 A -65 MM -311 MM -891 NM - 349 nm - 845 NM -738 nm - 424 nm - 278 MM -916 cm - 657 MM - 396 UM -56 UM - 84 cm -79 nm -119 um - 107 A -19 nm - 582 cm - 431 A -182 UM - 685 UM -751 cm -203 A - 239 CM -303 NM - 696 mm - 366 CM - 932 um -226 CM - 194 CM -965 um -681 UM -958 UM - 974 A -357 um - 560 NM - 13 UM -14 cm - 792 A - 159 A - 333 UM - 179 nm - 585 A -210 cm -608 MM - 805 UM -711 MM - 400 MM -22 nm - 72 UM - 401.5 mm - 170 CM - 796 CM -13 A - 612 MM - 582 um - 877 NM - 534 MM - 268 cm - 429 A - 585 nm - 679 um - 831 nm -866 mm - 713 CM -49 um -238 mm -704 NM - 227 A - 419 NM - 787 UM -863 CM -949 mm - 59 um - 883 NM -392 nm - 774 MM - 436 mm - 138.5 NM -187 CM -795.0 UM -262 UM -46 cm - 167 NM - 67 MM - 537 MM -688 mm - 437 MM - 914 A - 502 nm -419.0 A -910 NM - 557 A - 231 nm - 268 MM - 896 A -629.0 um -980 um -336 MM -840 cm -59 NM - 275 um -587 A -106 mm -909 MM -737 MM -151 UM - 510 NM -84 mm -553.0 MM -642 A -23 MM - 798 um -204.5 mm -304 nm -397 MM - 924 CM - 163.0 A - 292 nm -493 NM -271 CM -279 nm -954 NM - 580 MM -858 NM - 668 CM - 365 nm -79 um - 455 mm - 42 mm -555 CM -580 A -770 cm - 67 NM - 708 A -892 mm -852 NM -783 um -798 UM - 227 NM -89 CM - 2 nm - 960 NM - 390 A - 104 um - 809 CM -735 mm - 544 nm -999 nm -733 A -412.5 UM -430 NM - 974 um -194 MM -434 NM - 247 UM -815 MM -726 cm - 423 NM -529 CM -368 nm -308 UM -395 CM - 300 CM - 806 MM -834 mm -596 NM - 910 CM -394 CM - 141 mm -762 cm -314 UM -998 CM -561.0 nm - 757 um -317.5 um - 462 cm - 907 NM -143 um -599 UM - 614 MM - 915 MM -203 CM - 663.0 NM -47 MM - 279 um -150 NM - 971 CM -698 UM -126 MM -812 MM -394 mm - 463 UM - 304 MM -624 A -428 UM -353 NM -979 MM - 952.0 mm - 859 MM - 740 nm - 374 MM -658 NM -669 UM -760 UM - 558.0 A -83 cm - 601 MM - 89 CM -959 um - 996 NM - 900.5 NM - 767 A -652 CM -242 MM -307 cm - 94 NM -324 um -18 CM -245 MM -943 NM - 459 MM -446 A -633 cm - 922 mm - 243 nm - 20 MM -286 MM -116 MM -494.0 mm -86 mm -909 UM -640 um -732 MM -325 CM -162 um -983 UM - 155 um -977 CM - 707 A - 640.0 A -222 CM - 264 MM - 551 cm - 759 UM -848 UM -422 nm -89 NM - 344 cm -939 nm - 160 UM - 185 UM -436 nm - 681 NM -747 NM - 146 mm - 384 mm -743.5 mm -263 MM -387 CM - 28 mm - 91 MM - 212 A -102 UM - 708 um -761 NM - 803 A -684 MM -89 nm -810 nm -162 CM - 385 A -905 UM - 42.0 UM - 782 MM - 773 NM - 392 NM - 800 A -121 A - 994 UM -104 MM - 522 MM - 150 MM - 534 nm -829 um - 114 mm - 356 A -285 UM - 116 mm - 259 CM -773 CM - 177 nm -43 CM - 166 um -424 cm -366 mm -562 NM - 879 um - 33 mm -655 mm -141 um -436 MM -875 um - 867 CM - 226 NM - 336 cm -180.5 A - 859 A -596 nm - 44 mm -414 mm -41 NM -711 A - 701 mm - 688 MM -320 um - 141 A - 153 nm - 355 um - 579 CM - 134 A -266 um - 27 nm - 709 nm - 329 A - 196 cm -90 MM - 306 UM - 795 cm -344 NM - 168 UM - 980 um - 420 cm - 155 um - 305 cm -955 mm -70 MM -3 nm -39 UM -776 MM - 744 UM -261 nm -938 A -796 NM - 446 UM - 548 A -896 NM - 965 MM - 719 A - 264 mm -976 CM - 628 nm - 714 cm - 826 mm - 462 um - 426 A -971 NM -786 MM - 543 MM -722 MM -703 um - 768 MM - 187 mm -457 CM - 901 cm - 941 UM - 992 A - 305 MM - 557 nm -68 MM -520.5 CM -813 NM - 779 A -553 mm -580 MM - 893 cm -614 MM -941 MM - 423 A - 674 mm - 845 A - 854 UM - 151 A - 777 A - 670 cm -645 cm - 393.5 CM -727 NM -450 UM -426 mm - 577 cm -108 um - 127 A -285 nm - 536.5 CM -599 mm -285 NM - 685 NM -166 mm -775 A - 530 nm -898 MM -830.5 A -668 CM -703 UM - 479 MM - 223 mm - 818 UM -494 mm -247 cm -82 um - 819 nm -333 UM - 463 NM - 139 cm - 143 UM - 814 MM - 429 MM - 388 um - 174 MM - 545 nm -814 mm -335 NM -482 mm -919 CM - 5 MM -594 MM - 14 mm -74 UM -506 CM -671 um - 652 mm - 500 NM - 886 mm - 871 nm - 505 nm - 500 MM -531.0 um -303.0 NM - 5 um -961 nm - 869 cm -584 A -547 A -732 cm - 437 A - 253 um -594 mm -801 UM -364 mm -724 UM - 524 nm - 746 MM -915 CM - 754 UM - 971 cm - 105 mm - 407 nm -710 CM -628 um -446 nm - 985 CM -458 nm -20 cm - 609 UM - 643 CM - 513 NM - 774 NM -246 CM -772 MM - 919 NM - 896 UM - 750 cm -105 um -544 CM -785 UM - 783 mm - 788 UM - 46 um - 788 A -760 CM - 407 MM - 94 A -921 nm -421 mm -225 A -751 mm -27 mm - 606 CM - 812 A -511 um - 324.0 MM - 12 um - 883.0 CM -764 cm -210 A - 879 mm - 171 UM -896 um - 899 um - 474 UM - 423 A -316.5 MM -76 mm - 863 um -145 um - 797 A -55 CM - 323 mm -719 CM -807 um -348 NM -147 MM -282 um -771 UM -522 um - 796 um - 100 CM - 147 um -133.5 NM - 951 cm - 104 A - 616 CM -204 A -677 um - 214 A -793 mm -690 A - 821 nm - 10 mm -229 CM -381 MM -692 UM - 962 NM - 789 um -511 nm - 150 MM - 693 NM - 534 nm - 218 MM - 711 nm -299 um -746 UM -302 A - 359 MM -940 MM -615 UM - 412 MM -532 NM -712 cm - 729 nm -471 mm -983 nm - 636 cm -446 CM - 253 um - 478 MM - 826 MM - 578 um - 543 cm -319 mm -972 A -682 um - 288.5 CM - 979 cm - 286 A - 501 MM - 95 A - 132 MM - 937 NM - 834 NM - 545 UM -533 CM - 582 NM - 875 CM -70 MM - 9 NM - 680.5 mm - 43 nm -487 cm -421 nm - 445.0 MM - 868 MM -431 mm -944 mm -184 mm -55 nm - 334 nm -460 A - 561 um - 113 um - 831 um -325 MM -96 nm - 377 MM - 520 um - 213 MM - 817 NM - 863 um - 669 nm -699 UM - 164 UM - 611 cm - 67 MM -37 A -694.0 A - 729.5 UM - 966 nm -416 um - 76 NM - 687 NM -152 NM -223 UM - 6 nm -215 cm -51 CM -821 NM - 209 um - 63 NM -301 nm - 464 mm -760 UM - 274 cm -115 cm - 902 cm - 225 mm - 519 cm - 118 UM - 227 NM -344 mm -539 NM -288 UM -764 MM -561 NM - 671 CM - 178 CM - 634 um -397 NM -88 CM - 584 cm -589 NM - 996 A -23.0 cm -153 A -407 mm - 178 NM -761 um - 381 nm -116 UM -931 um - 273 cm -855.5 cm - 227 cm - 589 MM -643 MM -647 um -156 um -291 nm - 644 CM - 516 cm - 418 CM - 376 mm -420 UM - 363.0 mm -331 nm -473 CM -641 um -841 MM - 260 CM -842 UM - 574 CM -114 A - 219 mm - 409 CM - 289 mm - 730 MM - 86 MM - 914 NM -815 NM - 144 UM - 916 A - 126 NM -600 CM - 766 nm -734 mm -797 cm -877 CM - 309 mm - 157 cm - 880 A - 435.0 NM - 43 UM -283 UM - 382 CM -1 UM - 118 NM - 633 UM -127 mm - 779 CM -304 A -148 UM -55 CM -262 CM -923 CM - 901 MM - 533 cm -888 nm -218 UM -723 NM - 349 A - 495 CM -654 MM -853 NM - 350 MM - 543 um -864 CM - 197 um - 440 MM - 900.0 CM - 540 nm -687 CM -28 UM -64 A - 225 A - 209 mm -946 A - 506 nm -376 NM -889 A -460 NM -946 um -636 cm -510 A -292 UM - 901 mm -805.0 nm - 386 MM - 164 UM -794 NM -160 CM -359 NM - 667 nm - 186 um - 15 nm -582 nm -399 CM - 392 cm - 339 nm -726 cm - 211 CM - 206 um - 232 cm - 137 NM -223 cm -275 CM - 446 NM -789 A - 351 UM -488 A - 604 um - 980 mm -693 MM - 4 mm - 521 CM - 303 um - 830 cm -782 cm -145 nm -812 um -605 CM - 283 cm - 623 um - 777 A - 707 mm - 835 MM - 232 nm - 981 mm - 595 CM -679 UM -577 UM -267 MM -155 mm - 684 cm -618 mm -770 mm - 485.0 UM - 831 um -928 nm -525 UM -932 mm -614 cm -678 um -443 mm -693 nm -722 cm - 961 UM -598 mm - 593 MM - 452 UM - 751 MM - 875.0 mm -596 mm - 497 MM - 121 cm -971 cm - 374 A -604 UM - 247 A -273 nm - 629 nm -566 CM - 143 NM -664 mm -726 MM -479 MM - 283.0 UM - 16 mm -923 UM -17 CM -479 NM -647 mm - 663.0 A -434 NM - 242 mm - 908 cm - 416 nm -488 UM -385 MM - 135 UM - 287 CM - 487 um - 645 UM -508 um - 241 cm - 35 CM - 373 um - 436 cm - 983 um - 906 nm - 324 MM -126 MM -676 mm - 747 mm -657 nm - 527.0 um -975 cm - 879 mm - 973 CM - 648 um -17 um -892 um - 810 nm - 318.5 cm -795 MM -233.5 nm -578 MM - 366 UM -87 NM - 660 mm -229 nm - 27 mm -772 um -168 nm -110 UM - 921 mm -160 cm - 134 CM -693.5 MM - 19 NM - 367 NM - 404 nm - 311 UM -707 CM -78 um -572.0 cm -211 um - 996 nm - 935 cm - 790 CM - 932 UM -643 mm - 858.0 mm -799 MM - 880 MM - 402 cm - 442 MM - 3 um - 357 NM - 537 mm -267 mm - 130 NM -812 A -400 um - 818 MM -985 UM -469 cm - 922 nm -456 NM -774 nm - 868 NM -303 mm - 176 A - 267 nm - 724 A -244 um -794 A -6 um -329 NM - 546 A -705 nm - 215 nm - 159 MM -32 UM - 802 um -71 CM - 353 um -322 A -704 nm - 258 cm -862 mm -206 A - 230.0 mm -252 NM -247 A -280 CM -344 MM - 788 NM - 85 UM -42.5 um -690 mm - 232 A -49 CM - 583 nm - 748 mm -15 CM -774 CM - 940 CM -265 UM - 317 A - 469 MM -420 um -213 nm - 825 um -158 nm -26 um - 509 MM - 310 nm -709 nm - 679 A - 565 cm -963 nm - 385.5 A -965 nm - 455 mm - 88 mm - 860 mm - 896 A - 665 NM - 71 UM -34 NM - 682 UM -589 A - 168 cm -667 MM -617 nm -995 MM - 556 cm -193.5 UM -405 um -341 UM - 934 NM - 199 um - 444 mm -400 CM - 628 UM - 82 CM - 240 cm -87 A -16 cm - 368 CM -512 MM -441 MM - 850 mm -949.5 nm -920 CM -161 NM -146 UM -288 A - 439 NM -626 NM -77 MM -13 CM -523 mm - 153 A - 41 A - 765 NM - 536 A -301 UM - 997 CM -352 A - 744 cm -432 nm - 295 CM - 680 NM - 845 UM - 960 MM -692 A -159 MM -512 cm -179 mm - 225 nm -85 mm - 667 UM -608 cm -307.5 nm -187 mm -352 A - 709 CM -937 nm -629 cm - 869 A -856 um -491 cm - 883 A - 739 CM - 432 cm -874.0 CM -828 UM - 859 mm - 586 nm -133 um - 317 um -866 UM - 655 CM - 697 um - 988 mm -975 UM -235 MM - 84 A - 158 A - 454 cm -489 A - 865 NM - 795 CM - 990 UM - 250 nm -501 cm - 595 cm -35 um -179 CM -363 UM -392 CM - 871 A -80 MM - 422 MM - 503 UM -921 CM -739 nm -104 A - 393 MM - 168 CM -160 MM -492 mm - 716 MM - 436 um -382 um -473 UM -258 cm -66 MM -326 nm -195 NM -71 mm -440 UM - 102 CM - 214 MM -246 cm - 250 nm - 205 A -16 nm -531 UM - 648 NM -611 um -35 MM -373 NM - 534 UM -160 um -420.0 NM -350 NM - 472 nm - 870 CM -586 UM -971 um - 395 um - 807 nm - 735 MM -524 cm -446 NM -473 UM -626 UM -152 A - 369 NM - 545 A - 756 UM -325.0 A -127 CM -560 A -817 cm -174 NM -462 NM -700 nm - 573 A -624 A -529 MM -400 cm -453 nm - 696 nm -506 nm - 354 nm -111 nm - 813 cm -119 NM - 797 cm -798 MM -330 nm -215 A - 264 nm - 469 mm -62 CM -220 UM -619 NM -313 um - 26 NM - 437 A - 959 nm - 295 CM - 103 CM - 1 MM - 520.0 UM -993 NM - 219 um -627 mm - 732 um -417 cm - 728 NM -829 A - 663 mm - 392 MM - 247.5 MM - 371 um - 695.5 cm -522 MM -311 A -75 nm - 574 um - 394 cm -71 nm -177 MM - 48 CM - 625 um - 748 um -857 A -760 mm - 480 UM -187 cm -25 nm - 327 um -802 MM -147 mm - 251 nm - 830 CM -791 mm - 708 um -256 CM - 918.5 nm -337 mm -120 A -75 NM -126 mm -691 nm - 510 nm -335 CM -957 CM - 786 UM -118 cm -288 um - 584.5 cm -789 um - 126 MM -788 UM - 519 mm - 168 um - 911 NM -287 mm - 289 NM -984 NM - 9 UM - 883 nm -427 cm -372 cm - 855 mm -529 UM -267 MM -420 um - 394 UM -431 MM -569 UM - 222 CM - 886 um -832 A - 16 A - 400 cm -269 A - 454 um - 215 um - 892 um - 727 A -583.0 cm -639 MM -117 UM - 549 A -293 mm -625 cm -210 mm - 698 UM - 712 A - 809 NM -32 mm -983 CM -722 MM - 346 NM -135 cm - 672 um -284 NM -831 MM -123 nm -859 cm - 608 A -985 mm -327 A - 63 A -590 mm -941 CM - 737 mm - 654 CM -783 MM -681 A -381 UM - 232 A -241 cm -775 cm - 154 UM - 678 CM - 927 MM -743 CM -672 mm - 140 UM -391 CM -688 nm -627 um - 272 CM -766 NM -432 A - 459 MM - 444 mm -382 cm - 403 cm - 205 mm -148 mm -32 mm -737 NM -556 um - 692 nm - 651 UM -175 nm -57 NM - 7 cm - 153 cm - 370 CM -32 mm - 304 cm - 444 A - 966 NM -496 A - 952 cm - 563 MM - 477 mm -208 A -116 A -754 um -37 nm - 487 A -353 um -514 NM -488 MM - 111 mm - 303 nm -469 cm - 805 UM -234 UM -473 CM -650 A -718 A - 981 A - 803 nm - 251 cm - 523 UM -650 CM -808 mm - 530.0 NM -903 nm -570 NM - 422 CM - 247 NM - 643 mm - 488 MM - 958 MM - 100 um - 424 NM -328 CM - 806 NM -651 UM -257 nm -218 mm - 948 UM -805 mm - 926 um - 542 CM - 207 NM - 335 MM -579 UM -443 CM -564 NM -559 nm -164 cm - 943 A -987 nm - 247 nm - 981 MM -923 UM -836 MM - 889 CM -644 NM -210 cm - 511 um - 20 CM -76 cm -87 mm - 190 cm - 110 um -354 NM - 113 MM -288 mm - 695 cm - 729 NM -783 UM - 35 MM -546 nm - 8 NM - 347 UM - 359 NM -792 MM - 675 nm -362 CM -287 um - 531 CM -446 um -408 UM - 87 CM - 221 MM - 622 mm - 418 um - 890 NM -934 UM - 58 nm - 612 um - 115 mm -614.0 cm -204 NM - 513 um -460 nm -498 MM - 490 UM - 766 A - 191 UM -835 MM - 955 um -397 cm -442.0 CM -502 CM - 203 CM -641 um -599 nm - 993 nm - 338 A - 240 UM -127 mm - 525 UM -675 CM -618 nm -822.0 nm - 250 UM - 692 NM - 442 UM -638 MM - 507 A -907 nm - 371 cm - 256 CM -202 um -83 mm -214 nm - 676 UM -363.5 UM -620 mm -261 um -526 MM -61 CM - 689 um -655 CM - 243 cm - 82 mm -687 um - 859 nm -604 NM -386 NM -540 CM -350 MM -598 cm -915 UM -757 NM - 185 um - 314 nm -750 A - 702 nm -109 CM - 35 A -583 mm -62 mm -63 cm - 210 cm -827 UM - 553 NM - 416 mm -557 MM -685 A -358 A - 463 NM -951.5 MM - 827.0 MM - 83 A - 895 UM -75 UM -383 NM - 308 UM -361 CM - 384 MM - 280 MM - 169 NM - 539 um - 421.0 NM - 549 nm -39 UM -718 MM - 633 nm - 229 CM -551 UM - 518 cm - 106 nm -110 MM - 852 UM -664 um -634 mm - 815 UM - 201 UM -659 cm - 557 mm - 52 cm -781 um -446 UM -30 A - 211 MM - 402 CM -778 A - 351 NM -496 MM - 159 A - 674 NM -318 MM -464 um - 164 mm - 216 um - 54 A -57 cm - 600 CM -275 NM - 855 CM -907 um - 614.0 um -301 cm -251 UM - 766 A -299 um -955 MM - 995 nm - 108 nm - 887 MM -79 CM -277 nm - 252 nm -238 UM -704 CM -320 MM -687 A - 187 MM - 917 A -437 um -231 mm - 89 nm -87 UM - 593 MM -52 cm - 619 cm -579 A - 676 um - 372 um - 313.5 cm - 706 A -688 MM -50 NM - 845 A -754 cm -932 nm - 469 MM - 866 nm - 846 MM -613 CM -354 NM - 286 UM - 800 UM - 545 cm -868 MM - 645 NM - 636.0 UM -385 nm -839 um - 700.0 nm -533.0 um - 164 cm -755 MM - 522 UM -144 um - 732 mm - 662 nm -113 um - 722 A - 553.5 nm - 53 NM - 15 cm -827 NM -709 nm - 583 UM - 777 um - 949 mm - 759 UM -718 um -869 mm - 535 A - 797 NM -132 nm - 468.5 um -47 CM - 732 nm - 408 MM - 845 MM -168 nm - 361 nm -476 um - 93 CM - 61 NM - 137 MM - 971 um -317 NM -53 nm -986 mm -533 NM -802 A - 512 MM -301 cm -51 um - 327 UM - 268 MM -848 nm - 160 MM - 526 UM -974 um -885 MM - 625 nm - 427 mm - 643 um - 802.0 um - 722 A -693 MM - 200 um - 355 um -648 nm -367 UM - 44 NM -972 cm -735 CM - 654 um - 112 CM -711 nm - 925 CM -404 mm -117 nm -592 cm -318 mm -146 MM - 865 mm - 30 UM - 255 CM - 777 A -20 cm - 777 A - 997 MM - 788 UM -638 um - 501 mm - 410 NM -286 NM - 628 NM -407 UM - 356 CM - 836 UM - 885 um -980 UM -53 um -183 UM -323.0 MM - 973 NM -527 A - 911 UM - 294 A - 543 cm -147 cm - 598.5 NM -153 um -199 nm - 329 cm - 990 CM - 714 UM - 611 UM -815 A -816 UM -659.5 NM - 770 mm - 950 UM - 366 NM - 431 MM -188 MM -661 NM - 246 um -645.0 nm -263 CM - 858 MM -989 MM - 302 UM -82 A -102 CM - 964 MM -509 NM -247 CM -53 mm -632 UM -794 nm -779 cm - 876 UM - 376 mm - 166.5 cm - 164 um - 65 NM -736 CM - 50.5 NM -388 cm - 679.0 nm - 981 nm -714 nm -275 A -948 A - 800 NM -635 cm -746 NM -296 mm -327 um - 509 mm -770 um -648 mm -14 nm -894 nm - 792 CM - 114 nm - 651 MM -989 cm - 192 A -794 MM - 143 um -554 CM -730 nm - 151 mm - 332 UM - 351 um - 674 NM -710 um -366 NM -46 nm - 636 mm -913 MM - 391 MM - 226 mm - 647 nm - 433 cm - 883 UM -943 UM - 560 CM - 789 NM -970 CM - 449 UM - 126 A - 883 mm - 397 NM -314 um - 234 CM -611 A - 549 MM -925 nm - 934 NM - 518.5 UM -333 mm -753 cm - 65 CM -474 cm - 313 UM -902.0 um - 8 mm -243.0 mm - 62 mm -567 CM -836 A - 161 mm -783 MM -508 UM -978 NM -815 NM - 869 um -570 A - 18 UM -43 NM - 62 nm -537.5 NM -866 nm - 40 NM - 845 CM - 667 NM -607 A -780.5 MM - 453 um -179 nm - 307 MM -707.5 mm - 515 mm - 195.0 NM -683 A - 385 um - 683 UM - 250 UM -62 mm -599 cm - 672 CM -957 UM -325 nm -999 um - 764.0 nm -91 CM -648 UM -220 cm - 130 mm -956 mm -363 NM - 294 cm -462 cm -649 A -175 um - 124 NM - 275 A -191 A - 566 cm -583 UM - 219.5 NM -332.5 A - 211 mm -508 NM - 313 A - 100 A - 867 UM -203.5 NM -268 CM - 569 mm -383 UM - 816 um - 111 cm - 258 UM -885 CM - 791 mm - 388 CM -967 NM -566 mm - 558 UM - 486 NM -332 um - 222 CM - 733 um -299 mm - 304 nm - 657 UM - 941 cm - 38 MM -442 A -596 um - 855 NM - 377 MM - 754 um -132 NM - 299 A -615 nm -116 NM - 623 mm - 577 mm - 474 NM - 648 NM -152 UM - 654 cm -477 NM - 386 CM -732 NM - 228 UM -694 A - 235 MM -295.5 CM -581 nm -847 UM - 402 UM - 299 mm - 53 um - 282 MM - 251 um -487 cm -331 A -667 mm - 954 UM - 663 NM -300 A -721 mm -931 MM -24 um - 775 CM -77 mm -962 UM - 85 UM - 380 cm - 245 NM - 447 A - 15 nm - 972 nm - 566 mm -114 A -358 um - 485 cm -484 nm -543 cm - 711 nm -15 MM -509 A - 551 MM - 509 nm - 443 um -988 UM -412 cm -205 MM - 446 um - 17 cm -767.0 cm -633 MM -116 cm -985 um - 738 cm - 781 CM - 820 um - 888 NM -857 A - 855 UM -171 NM - 43 MM - 485 cm -509 um - 470 MM -650 UM -892 NM -729 nm - 204 um -783 cm - 713 MM - 778 A - 730 cm - 305 um -816 NM - 410 A -829 NM -102 NM - 371 A -1 CM - 544 MM - 4 A -251 um -183 MM -851 MM - 203 UM - 778 A -237 MM - 510 UM -844 cm -645 nm - 358 A -133 um -8.0 UM - 469 CM -637 mm -969 nm - 58 CM - 411 UM - 540.5 A - 513 NM -203 MM -557 CM - 215 UM - 685 cm - 16 MM -766 UM -357 mm - 551 A -378 mm -757 NM -987 A -598 MM - 703 mm -105 UM - 884 A -408 mm - 926 A -689 MM - 948 NM - 296 mm -981 UM - 904 um - 261 um - 361 mm - 116 nm - 82.5 CM -502 cm -406 CM - 506 cm -11 mm -724 mm -629 A -133 nm - 953 mm -987 nm -101 UM -42 nm -12 NM - 760 UM - 805 nm -605 CM - 603 UM -631 nm -486 cm -94 um - 344 mm -216 cm - 565 CM - 726 A -415.0 NM -545 nm - 1000 cm -530 nm - 242 um - 81 nm - 720 UM -467 CM -472 cm -504 nm - 82 NM -516 CM -796 NM - 446 cm -892.5 mm -282 nm - 749 NM -650 UM - 902 A -351 um -595 CM - 683.5 nm - 991 CM -204 NM -534 MM -239 NM - 929 UM -445 NM -99 nm - 948 MM -619 A - 27 cm - 888 UM -66 cm -32 nm - 789 um -708.0 A -36 mm -243 mm - 436 A -430 MM - 781 A -83 A -192 A -755 mm - 274 CM - 709 um -754.0 um - 826 cm -788 mm - 171 mm - 721 NM -887 um - 6 UM -151 UM -368 um -587 A - 997 nm - 570 um - 30 mm - 357 CM - 489 um - 513 UM -418 UM -378 cm -480 UM -879 cm - 172 A - 831 UM - 91 A -898 mm - 15.5 UM -670.5 um -854 CM -935 UM -583 NM - 483.0 nm - 896 MM -915 MM -806 um -334 cm -122 MM - 870 MM - 150 MM - 593 NM -134 A -324 CM - 115 cm -961 cm -483 A -859 MM -194 cm - 19 cm - 294 cm -211 mm -586 NM -932 mm -789 cm - 432 A -9.5 mm -7 CM -549 NM - 335 mm -476 um -652 MM -851 mm -70 mm - 270 um - 584 um - 681 NM -278 mm -598 UM -610 mm - 466.0 CM -305 um -819 NM -652 CM -176 um -966.5 CM -497 CM -241 nm -628 NM -212 mm - 101 CM -419 UM -141 cm - 980 mm - 40 um - 331 MM - 690 UM - 234 mm - 826 UM -19 A - 269 mm - 567 MM - 450 um - 918 MM - 513 CM -234 cm -340 NM -423.0 mm - 758 UM -343 CM - 488 cm -860 MM -562 cm - 582 um - 7 MM - 841 um -531 um -482 NM -874 MM -188 NM -889 UM - 475 um - 613 UM - 814 cm - 1 A - 475 um -112 cm -396 mm - 947 NM - 46 CM -854 mm - 386 A - 905 um - 68 MM -946 CM -233 UM -353 NM -378 mm -628 MM - 683 CM -695 A -334 CM - 522 nm -679 mm -875 cm - 764 CM -21 A - 169 A - 528 NM -102 nm - 456 mm -835 cm -525 cm -475 UM - 214 CM -475 mm -454 mm - 380 A - 967.5 nm -641 nm -285 CM - 955 mm - 568 nm -42 nm - 622 A -580 NM - 226.5 CM - 361 UM -592 NM -280 mm -490 um -677 CM -666 A -634 mm - 467 MM - 309 A -368 NM -942 UM - 25 CM -298 mm - 869 um -983 um -528 A - 94 CM -868 mm - 440 NM -552.0 nm - 265 MM -154 MM - 925 UM -103 UM -40 nm - 835 UM - 608 A - 469 um -341 cm -33 MM -4 A - 903 NM - 995 um -39 CM -265 A -744 A - 660 UM -889 cm - 624 A - 41 nm -311 cm -551 nm -330 cm -587 NM -760 MM -407 nm - 33 um -146 nm -743 A - 723.0 um -81 cm -678 nm - 388 nm - 732 A -207 nm -346.0 CM -489 UM -59.5 NM - 149 A - 1 NM - 76 nm -708 mm -999.0 um -988 NM -895 mm - 773 CM -819 CM -37 CM -561 nm -641.0 MM -616 NM - 715 um -607 A - 993 A -583 MM - 582 um -460 MM - 350 cm -710 um -507 UM -666 MM - 528 A -596 A -551 NM - 223 CM - 82 cm - 702 UM - 45 cm -207 um - 381 um -796 mm - 839 A -992.5 um -29 NM -627 MM - 835 NM -246 UM -195 CM - 54.0 UM -371 um - 741 CM -443 MM - 777 cm - 528 um -92 UM - 241 CM - 66 CM -557 mm -308 CM - 247 MM - 329 UM -822 mm - 551 CM - 416 A -512.5 um -363 MM -616 A - 800 NM -206 nm -795 cm - 316 UM -353.0 nm -751 um -23 A -175 NM - 534 A - 590 MM - 957 NM -803 mm - 329 NM - 75 um - 547 UM - 597 A - 803 UM - 325 nm -158 mm -211 CM - 903 CM -544 mm -560.5 UM - 427 nm -183 MM - 445 UM -82 cm - 750 mm - 736 A -609 MM - 535 nm - 473 um -693 nm - 989 UM - 198 NM -928 A -219 UM -939 UM -848 A - 936 A - 330 MM - 419 mm -840 um -916 um - 208 cm -764.0 MM -194 mm - 217 mm -68 NM -510 UM -683 A -29 nm - 544 um - 435 cm - 684 mm -841 MM - 750 UM -899 cm - 180 UM -644.5 mm -880 MM - 557 cm - 833 um -137 MM - 464 A -473 A - 444 cm - 31 cm - 735 NM -767 cm -909.5 UM - 237 nm - 506 A -501 MM - 529 A - 925 mm - 168 MM -181 nm -979 mm - 209 UM -810 cm -678 nm -517 A -594 A -581 A - 991 cm -223 MM -181 NM -694 CM -963 MM - 215 CM -457 CM -719 MM - 597 um -956 mm -445 NM -144 CM -672 NM -701 A -772 um - 112 mm - 482 mm - 986 cm -329 A -875 cm -460 nm -653.5 nm -869 um -860 A -961 MM -243 um -637 CM -764 MM - 685 CM - 727 mm -387 MM -696 um -163 um -458 cm - 277 NM - 988 CM -927 MM - 656 UM - 20 CM -699 NM -558 CM -747 MM -739.5 A - 461 UM -939 mm -299 CM - 640 mm - 44 cm - 403 MM -250 A -246 UM - 386 CM -244 nm - 851 A - 768.0 mm -893 A - 237 um - 840 A -469 um - 774 MM -241 mm - 87 nm -80.5 A -83 cm -340 cm - 447.0 CM -623 um -665 nm - 958.5 UM -431 mm -517 um -609 A -290 UM -28 A - 552 MM - 539 cm -703 CM - 741 nm -575 um -171 um - 831 CM -681 UM - 545 um - 326 mm -462.5 MM - 22 mm -763 CM -498 mm - 959 um -161 nm -131 NM -552.0 um -280 A -865 mm -436 CM -91.0 cm -820 mm -375 MM -956 UM -426 um - 442 A -478 NM -148 UM -323 CM -211 MM - 514 mm -881 cm -958 A -249 NM - 460 um - 768 MM -236 mm -204 nm - 665 mm - 605 UM - 326 MM - 918 cm - 315 CM -168 um - 782.5 cm -376 CM -299 cm - 906 CM -936 CM -556 um - 535 UM -326 A -880 UM - 179 NM - 972 A - 104 um -516 cm - 102 NM -436 MM - 400 UM -355 cm - 559 MM -875 CM - 895 nm -475 CM - 255 nm - 61 MM - 654 um - 192 MM -627 A - 663 MM -735 nm -407 A diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/ctc.py b/openpmcvl/granular/process/subfigure_ocr/scale/ctc.py deleted file mode 100644 index 8da5b9e..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/ctc.py +++ /dev/null @@ -1,241 +0,0 @@ -#### ADAPTED FROM https://github.com/githubharald/CTCDecoder/blob/master/src/BeamSearch.py -from __future__ import division -from __future__ import print_function -import numpy as np -import pathlib -from .lm import LanguageModel -from operator import itemgetter - - -class BeamEntry: - "information about one single beam at specific time-step" - def __init__(self): - self.prTotal = 0 # blank and non-blank - self.prNonBlank = 0 # non-blank - self.prBlank = 0 # blank - self.prText = 1 # LM score - self.lmApplied = False # flag if LM was already applied to this beam - self.labeling = () # beam-labeling - - -class BeamState: - "information about the beams at specific time-step" - def __init__(self): - self.entries = {} - - def norm(self): - "length-normalise LM score" - for (k, _) in self.entries.items(): - labelingLen = len(self.entries[k].labeling) - self.entries[k].prText = self.entries[k].prText ** (1.0 / (labelingLen if labelingLen else 1.0)) - - def sort(self): - "return beam-labelings, sorted by probability" - beams = [v for (_, v) in self.entries.items()] - sortedBeams = sorted(beams, reverse=True, key=lambda x: x.prTotal*x.prText) - return [(x.labeling, x.prTotal*x.prText) for x in sortedBeams] - - -def applyLM(parentBeam, childBeam, classes, lm): - "calculate LM score of child beam by taking score from parent beam and bigram probability of last two chars" - if lm and not childBeam.lmApplied: - c1 = classes[parentBeam.labeling[-1] if parentBeam.labeling else classes.index(' ')] # first char - c2 = classes[childBeam.labeling[-1]] # second char - lmFactor = 0.01 # influence of language model - bigramProb = lm.getCharBigram(c1, c2) ** lmFactor # probability of seeing first and second char next to each other - childBeam.prText = parentBeam.prText * bigramProb # probability of char sequence - childBeam.lmApplied = True # only apply LM once per beam entry - - -def addBeam(beamState, labeling): - "add beam if it does not yet exist" - if labeling not in beamState.entries: - beamState.entries[labeling] = BeamEntry() - - -def ctcBeamSearch(mat, classes, lm, beamWidth=25): - "beam search as described by the paper of Hwang et al. and the paper of Graves et al." - - blankIdx = len(classes) - maxT, maxC = mat.shape - - # initialise beam state - last = BeamState() - labeling = () - last.entries[labeling] = BeamEntry() - last.entries[labeling].prBlank = 1 - last.entries[labeling].prTotal = 1 - - # go over all time-steps - for t in range(maxT): - curr = BeamState() - - # get beam-labelings of best beams - bestLabelings = last.sort()[0:beamWidth] - - # go over best beams - for labeling, conf in bestLabelings: - - # probability of paths ending with a non-blank - prNonBlank = 0 - # in case of non-empty beam - if labeling: - # probability of paths with repeated last char at the end - prNonBlank = last.entries[labeling].prNonBlank * mat[t, labeling[-1]] - - # probability of paths ending with a blank - prBlank = (last.entries[labeling].prTotal) * mat[t, blankIdx] - - # add beam at current time-step if needed - addBeam(curr, labeling) - - # fill in data - curr.entries[labeling].labeling = labeling - curr.entries[labeling].prNonBlank += prNonBlank - curr.entries[labeling].prBlank += prBlank - curr.entries[labeling].prTotal += prBlank + prNonBlank - curr.entries[labeling].prText = last.entries[labeling].prText # beam-labeling not changed, therefore also LM score unchanged from - curr.entries[labeling].lmApplied = True # LM already applied at previous time-step for this beam-labeling - - # extend current beam-labeling - for c in range(maxC - 1): - # add new char to current beam-labeling - newLabeling = labeling + (c,) - - # if new labeling contains duplicate char at the end, only consider paths ending with a blank - if labeling and labeling[-1] == c: - prNonBlank = mat[t, c] * last.entries[labeling].prBlank - else: - prNonBlank = mat[t, c] * last.entries[labeling].prTotal - - # add beam at current time-step if needed - addBeam(curr, newLabeling) - - # fill in data - curr.entries[newLabeling].labeling = newLabeling - curr.entries[newLabeling].prNonBlank += prNonBlank - curr.entries[newLabeling].prTotal += prNonBlank - - # apply LM - applyLM(curr.entries[labeling], curr.entries[newLabeling], classes, lm) - - # set new beam state - last = curr - - # normalise LM scores according to beam-labeling-length - last.norm() - - # # sort by probability - # bestLabeling = last.sort()[0] # get most probable labeling - - # # map labels to chars - # res = '' - # for l in bestLabeling[0]: - # res += classes[l] - - return last.sort()[:10] - - -### Added by MaterialEyes - -def get_legal_next_characters(path, sequence_length=8): - path_length = len(path) - spots_left = sequence_length - path_length - if path_length == 0: - return [0,1,2,3,4,5,6,7,8,9] - prefix = False - base_unit = False - nonzero_digits = 0 - digits = 0 - decimals = 0 - - for label in path: - if label in [1,2,3,4,5,6,7,8,9]: - nonzero_digits += 1 - digits += 1 - elif label == 0: - digits += 1 - elif label == 19: - decimals += 1 - elif label in [10,11,12,13,14,15,16,17] and not prefix: - prefix = True - elif label == 20: - prefix = True - base_unit = True - elif label in [10, 11] and prefix: - base_unit = True - elif label in [18, 21, 22]: - continue - else: - print("How did I get here?\nThe path is: ", path) - - # unit has been started, no digits or decimals allowed - if prefix: - # unit has not been finished, no prefixes allowed - if not base_unit: - # only one spot left, must finish unit - if spots_left == 1: - return [10, 11] - else: - return [10, 11, 18, 21] - # unit has been finished, only blanks left - else: - return [18, 21] - # unit has not been started - # decimal must be followed by a digit - if label == 19: - return [0,1,2,3,4,5,6,7,8,9,18,21] - # if unit hasn't started and only one spot left, must be A - if spots_left == 1: - return [20] - elif spots_left == 2: - # current label is a space, can go right into unit - if label in [18,21]: - return [10,11,12,13,14,15,16,17,18,20,21] - else: - return [18, 21] - # more than 2 spots left - # if last spot is not a blank, must be followed by more numbers or spaces - if label not in [18, 21]: - if decimals == 1: - return [0,1,2,3,4,5,6,7,8,9,18,21] - else: - return [0,1,2,3,4,5,6,7,8,9,19,18,21] - # last spot is blank, can be followed by anything - if decimals == 1: - return [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21] - else: - return [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21] - -def postprocess_ctc(results): - classes = "0123456789mMcCuUnN .A" - idx_to_class = classes + "-" - for result, confidence in results: - confidence = float(confidence) - word = "" - for step in result: - word += idx_to_class[step] - word = word.strip() - word = "".join(word.split("-")) - try: - number, unit = word.split() - number = float(number) - if unit.lower() == "n": - unit = "nm" - elif unit.lower() == "c": - unit = "cm" - elif unit.lower() == "u": - unit = "um" - if unit.lower() in ["nm", "mm", "cm", "um", "a"]: - return number, unit, confidence - except Exception as e: - continue - return -1, "m", 0 - -def run_ctc(probs, classes): - current_file = pathlib.Path(__file__).resolve(strict=True) - language_model_file ="corpus.txt" - language_model = LanguageModel(current_file.parent / language_model_file, classes) - top_results = ctcBeamSearch(probs, classes, lm=language_model, beamWidth=15) - magnitude, unit, confidence = postprocess_ctc(top_results) - return magnitude, unit, confidence \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/dataset.py b/openpmcvl/granular/process/subfigure_ocr/scale/dataset.py deleted file mode 100644 index 2672ddb..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/dataset.py +++ /dev/null @@ -1,287 +0,0 @@ -import json -import torch -import numpy as np -import os -from PIL import Image, ImageFont, ImageDraw -import random -import pathlib -from matplotlib import font_manager -#from ...utilities.boxes import convert_labelbox_to_coords -from torchvision import transforms - -def draw_text_on_image(image, text): - """ generates an image with text and a txt file with text's coordinates """ - width, height = image.size - - # system_fonts = font_manager.findSystemFonts(fontpaths=None, fontext='ttf') - current_dir = pathlib.Path(__file__).resolve(strict=True).parent - font_directory = current_dir.parent.parent.parent.parent / "dejavu-fonts-ttf-2.37" / 'ttf' - font_type = random.choice(os.listdir(font_directory)) - font_path = font_directory / font_type - max_width = int((1.5 * width) / len(text)) - max_font_size = min(height, 24, max_width) - font_size = random.randint(min(max_font_size-1, 9), max_font_size) - font = ImageFont.truetype(str(font_path), font_size, encoding="unic") - text_width, text_height = font.getsize(text) - startX = random.randint(0, max(1,width-text_width)) - startY = random.randint(0, max(1,height-text_height)) - box = (startX, startY,startX + text_width, startY + text_height) - # draw text on image - draw = ImageDraw.Draw(image) - color = find_color(image, box) - - draw.text((startX, startY), text, fill=color, font=font) - - # add random buffers to bounding box edges - move_up, move_left = random.randint(0,5), random.randint(0,5) - crop_y1 = max(0, startY - move_up ) - crop_y2 = min(height, startY + text_height + random.randint(1,5)) - crop_x1 = max(0, startX - move_left) - crop_x2 = min(width, startX + text_width + random.randint(1,5)) - - # save the image - image = image.crop((crop_x1,crop_y1, crop_x2, crop_y2)) - - return image - -def get_unit(): - units = ["u", "U", "\u03bc", "m", "M", "c", "C", "n", "N", "A", "\u212b"] - unit1 = random.choice(units) - unit2 = random.choice(units) - text = unit1 + unit2 - if random.randint(0, 2) == 0: - text = unit1 - label = "" - for character in text: - if character == "\u212b": - label_char = "A" - elif character == "\u03bc": - label_char = "u" - else: - label_char = character - label += label_char - return text, label - -def get_number(length): - nonzero = ["1", "2", "3", "4", "5", "6", "7", "8", "9"] - digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] - if length <= 2: - text = random.choice(nonzero) - text += random.choice(digits) - return text[:length] - - digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] - first = random.choice(digits) - - for i in range(length-2): - if first == "0": - first += "." - elif "." in first: - first += random.choice(digits) - else: - first += random.choice(digits + ["."]) - first += random.choice(digits) - return first - -def no_pattern(length): - characters = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", " ", "."] - characters += ["u", "U", "\u03bc", "m", "M", "c", "C", "n", "N", "A", "\u212b"] - text = "" - for i in range(length-1): - text += random.choice(characters) - - label = "" - for character in text: - if character == "\u212b": - label_char = "A" - elif character == "\u03bc": - label_char = "u" - else: - label_char = character - label += label_char - return text, label - -def find_color(image, box): - """ finds color for text to contrast background - - Args: - image: an image object - box: 4-tuple containing starting and ending x coordinate of text box - on image and starting and ending y coordinates of text box - Returns - color (tuple): color of text to create contrast from background - """ - startX, startY, endX, endY = box - image_array = np.array(image) - try: - grayscale = cv.cvtColor(image_array, cv.COLOR_BGR2GRAY) - except: - grayscale = image_array - new_image = grayscale[startY:endY, startX:endX] - mean = np.mean(new_image) - low_nums = random.randint(0, 15) - if mean < 120: - return (254 - low_nums, 254 - low_nums, 254 - low_nums) - elif mean < 135: - return random.choice([(254, low_nums, low_nums), (low_nums, 254, low_nums), (low_nums, low_nums, 254)]) - else: - return (low_nums, low_nums, low_nums) - -class ScaleLabelDataset(): - """ Dataset used to train CRNN to read scale bar labels """ - def make_encoding(self, label): - max_length = 32 - char_to_int = { - "0": 0, - "1": 1, - "2": 2, - "3": 3, - "4": 4, - "5": 5, - "6": 6, - "7": 7, - "8": 8, - "9": 9, - "m": 10, - "M": 11, - "c": 12, - "C": 13, - "u": 14, - "U": 15, - "n": 16, - "N": 17, - " ": 18, - ".": 19, - "A": 20, - "-": 21 - } - target = torch.tensor(max_length * [21]) - - for i, char in enumerate(label): - target[i] = char_to_int[char] - return target - - def __init__(self, transforms, text="random_separate"): - self.text = text - self.transforms = transforms - current_dir = pathlib.Path(__file__).resolve(strict=True).parent - self.background_images = current_dir / 'background' - - def __getitem__(self, idx): - # constants - SYNTH_BACKGOUND = 2 # out of 10 - ## select background image - # generate a random number create synthetic image - random_number = random.randint(0, 9) - if random_number < SYNTH_BACKGOUND: - # generate an image with solid background - color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) - background_image = Image.new("RGB", (200, 200), color=color) - # use a natural background - else: - background_image_name = random.choice( - os.listdir(self.background_images) - ) - background_image_path = self.background_images / background_image_name - background_image = ( - Image.open(background_image_path).convert("RGB") - ) - - if self.text == "random_separate": - ## select text to write on background - length = random.randint(1, 5) - number = get_number(length) - unit, label = get_unit() - space = random.choice(["", " ", " "]) - text = number + space + unit - label = number + " " + label - elif self.text == "complete_random": - length = random.randint(3, 8) - text, label = no_pattern(length) - # draw text and crop - cropped_image = draw_text_on_image(background_image, text) - if self.transforms is not None: - cropped_image = self.transforms(cropped_image) - - background_image.close() - target = self.make_encoding(label) - return cropped_image, target - - def __len__(self): - return 5000 - -class ScaleBarDataset(): - """ Dataset used to train Faster-RCNN to detect scale labels and lines """ - def __init__(self, root, transforms, test=True, size=None): - ## initiates a dataset from a json - self.root = root - self.transforms = transforms - if test: - scale_bar_dataset = os.path.join(root, "scale_bars_dataset_test.json") - else: - scale_bar_dataset = os.path.join(root, "scale_bars_dataset_train.json") - - self.test = test - with open(scale_bar_dataset, "r") as f: - self.data = json.load(f) - all_figures = os.path.join(root, "images", "labeled_data") - self.images = [figure for figure in self.data - if os.path.isfile(os.path.join(all_figures, - figure))] - if size != None: - self.images = random.sample(self.images, size) - - def __getitem__(self, idx): - image_path = os.path.join(self.root,"images", "labeled_data", self.images[idx]) - with Image.open(image_path).convert("RGB") as image: - image_name = self.images[idx] - - boxes = [] - labels = [] - for scale_bar in self.data[image_name].setdefault("scale_bars", []): - boxes.append(convert_labelbox_to_coords(scale_bar["geometry"])) - labels.append(1) - for scale_label in self.data[image_name].setdefault("scale_labels", []): - boxes.append(convert_labelbox_to_coords(scale_label["geometry"])) - labels.append(2) - - num_objs = len(boxes) - boxes = torch.as_tensor(boxes, dtype=torch.float32) - labels = torch.as_tensor(labels, dtype=torch.int64) - - image_id = torch.tensor([idx]) - area = (boxes[:, 3] - boxes[:, 1]) * (boxes[:, 2] - boxes[:, 0]) - # suppose all instances are not crowd - iscrowd = torch.zeros((num_objs,), dtype=torch.int64) - - target = {} - target["boxes"] = boxes - target["labels"] = labels - target["image_id"] = image_id - target["area"] = area - target["iscrowd"] = iscrowd - - if self.transforms is not None: - new_image = self.transforms(image) - - return new_image, target - - def __len__(self): - return len(self.images) - - - -if __name__ == "__main__": - normalize_transform = transforms.Compose([transforms.GaussianBlur((3,3), sigma=(0.1, 2.0)), - transforms.Resize((128, 512)), - transforms.ToTensor(), - ]) - resize_transform = transforms.Compose([transforms.Resize((128, 512)), - transforms.ToTensor()]) -#transforms.Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]), - dataset = ScaleLabelDataset(transforms=normalize_transform) - - for i in range(100): - image, label = dataset[i] - image = transforms.ToPILImage()(image) - image.save("generated/" + str(i) + ".jpg", "JPEG") \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/engine.py b/openpmcvl/granular/process/subfigure_ocr/scale/engine.py deleted file mode 100644 index 4e6bbd5..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/engine.py +++ /dev/null @@ -1,153 +0,0 @@ -## Acquired from https://github.com/pytorch/vision/tree/master/references/detection -import math -import sys -import time -import torch -import numpy as np -import torchvision.models.detection.mask_rcnn - -from .coco_utils import get_coco_api_from_dataset -from . import utils -from .coco_eval import CocoEvaluator -from . import process -import pathlib - -def train_one_epoch(model, optimizer, data_loader, device, epoch, - print_freq, lr_scheduler=None, model_name="unnamed_model"): - model.train() - metric_logger = utils.MetricLogger(delimiter=" ", model_name=model_name) - metric_logger.add_meter('lr', utils.SmoothedValue(window_size=1, fmt='{value:.6f}')) - header = 'Epoch: [{}]'.format(epoch) - - #if epoch == -5: - # warmup_factor = 1. / 1000 - # warmup_iters = min(1000, len(data_loader) - 1) - - # lr_scheduler = utils.warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor) - - for images, targets in metric_logger.log_every(data_loader, print_freq, header): - images = list(image.to(device) for image in images) - targets = [{k: v.to(device) for k, v in t.items()} for t in targets] - - loss_dict = model(images, targets) - - losses = sum(loss for loss in loss_dict.values()) - - # reduce losses over all GPUs for logging purposes - loss_dict_reduced = utils.reduce_dict(loss_dict) - losses_reduced = sum(loss for loss in loss_dict_reduced.values()) - - loss_value = losses_reduced.item() - - if not math.isfinite(loss_value): - print("Loss is {}, stopping training".format(loss_value)) - print(loss_dict_reduced) - sys.exit(1) - - optimizer.zero_grad() - losses.backward() - optimizer.step() - - if lr_scheduler is not None: - lr_scheduler.step(loss_value) - - metric_logger.update(loss=losses_reduced, **loss_dict_reduced) - metric_logger.update(lr=optimizer.param_groups[0]["lr"]) - - return metric_logger - - -def _get_iou_types(model): - model_without_ddp = model - if isinstance(model, torch.nn.parallel.DistributedDataParallel): - model_without_ddp = model.module - iou_types = ["bbox"] - if isinstance(model_without_ddp, torchvision.models.detection.MaskRCNN): - iou_types.append("segm") - if isinstance(model_without_ddp, torchvision.models.detection.KeypointRCNN): - iou_types.append("keypoints") - return iou_types - -def run_nms_on_outputs(outputs): - nms_outputs = [] - for image_outputs in outputs: - scale_bar_info = [] - for i, box in enumerate(image_outputs["boxes"]): - confidence = image_outputs["scores"][i] - if True: - #print("confidence is over 0.5") - x1, y1, x2, y2 = box - label = image_outputs['labels'][i] - scale_bar_info.append([x1, y1, x2, y2, confidence, label]) - scale_bar_info = process.non_max_suppression_malisiewicz(np.asarray(scale_bar_info), 0.4) - boxes = torch.empty((0, 4)) - labels = [] - scores = [] - boxes_temp = [] - for scale_object in scale_bar_info: - x1, y1, x2, y2, confidence, label = scale_object - boxes_temp.append([x1, y1, x2, y2]) - labels.append(label) - scores.append(confidence) - boxes_temp = torch.tensor(boxes_temp) - boxes = torch.cat((boxes, boxes_temp)) - image_dict = { - "boxes": boxes, - "labels": torch.tensor(labels, dtype=torch.int64), - "scores": torch.tensor(scores) - } - nms_outputs.append(image_dict) - return nms_outputs - -@torch.no_grad() -def evaluate(model, data_loader, device, model_name="unnamed_model"): - n_threads = torch.get_num_threads() - # FIXME remove this and make paste_masks_in_image run on the GPU - torch.set_num_threads(1) - cpu_device = torch.device("cpu") - model.eval() - metric_logger = utils.MetricLogger(delimiter=" ", model_name=model_name) - header = 'Test:' - - coco = get_coco_api_from_dataset(data_loader.dataset) - iou_types = _get_iou_types(model) - coco_evaluator = CocoEvaluator(coco, iou_types) - nms_evaluator = CocoEvaluator(coco, iou_types) - - for images, targets in metric_logger.log_every(data_loader, 100, header): - images = list(img.to(cpu_device) for img in images) - - #torch.cuda.synchronize() - model_time = time.time() - outputs = model(images) - nms_outputs = run_nms_on_outputs(outputs) - outputs = [{k: v.to(cpu_device) for k, v in t.items()} for t in outputs] - nms_outputs = [{k: v.to(cpu_device) for k, v in t.items()} for t in nms_outputs] - - model_time = time.time() - model_time - res = {target["image_id"].item(): output for target, output in zip(targets, outputs)} - nms_res = {target["image_id"].item(): output for target, output in zip(targets, nms_outputs)} - evaluator_time = time.time() - coco_evaluator.update(res) - nms_evaluator.update(nms_res) - evaluator_time = time.time() - evaluator_time - metric_logger.update(model_time=model_time, evaluator_time=evaluator_time) - - # gather the stats from all processes - metric_logger.synchronize_between_processes() - - current_file = pathlib.Path(__file__).resolve(strict=True) - save_file = current_file.parent / 'results' / '{}.txt'.format(model_name) - with open(save_file, "a") as f: - f.write("Averaged stats:{}\n".format(metric_logger)) - - coco_evaluator.synchronize_between_processes() - nms_evaluator.synchronize_between_processes() - # accumulate predictions from all images - coco_evaluator.accumulate() - coco_evaluator.summarize(model_name=model_name) - torch.set_num_threads(n_threads) - nms_evaluator.accumulate() - nms_evaluator.summarize(model_name=model_name, nms=True) - - return coco_evaluator diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/evaluate_scale.py b/openpmcvl/granular/process/subfigure_ocr/scale/evaluate_scale.py deleted file mode 100644 index 68506fb..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/evaluate_scale.py +++ /dev/null @@ -1,434 +0,0 @@ -import json -import os -from torch import optim, nn, utils -import torchvision.transforms as T -from torchvision import datasets, transforms, models -import torchvision -from torchvision.models.detection.faster_rcnn import FastRCNNPredictor -import numpy as np -import torch -import pathlib -from PIL import Image -from pytorch_model_summary import summary -import argparse -from operator import itemgetter -from exsclaim.figures.scale.ctc import ctcBeamSearch -from exsclaim.figures.scale.lm import LanguageModel -from exsclaim.figures.scale.process import non_max_suppression_malisiewicz -from exsclaim.figures.models.crnn import CRNN -import exsclaim.utilities.boxes as boxes -import cv2 -import random - - -def convert_to_rgb(image): - return image.convert("RGB") - -def create_scale_bar_objects(scale_bar_lines, scale_bar_labels): - """ Match scale bar lines with labels to create scale bar jsons - - Args: - scale_bar_lines (list of dicts): A list of dictionaries - representing predicted scale bars with 'geometry', 'length', - and 'confidence' attributes. - scale_bar_labels (list of dicts): A list of dictionaries - representing predicted scale bar labesl with 'geometry', - 'text', 'confidence', 'box_confidence', 'nm' attributes. - Returns: - scale_bar_jsons (list of Scale Bar JSONS): Scale Bar JSONS that - were made from pairing scale labels and scale lines - unassigned_labels (list of dicts): List of dictionaries - representing scale bar labels that were not matched. - """ - scale_bar_jsons = [] - paired_labels = set() - for line in scale_bar_lines: - x_line, y_line = boxes.find_box_center(line["geometry"]) - best_distance = 1000000 - best_label = None - for label_index, label in enumerate(scale_bar_labels): - x_label, y_label = boxes.find_box_center(label["geometry"]) - distance = (x_label - x_line)**2 + (y_label - y_line)**2 - if distance < best_distance: - best_distance = distance - best_index = label_index - best_label = label - # If the best match is not very good, keep this line unassigned - if best_distance > 5000: - best_index = -1 - best_label = None - best_distance = -1 - continue - paired_labels.add(best_index) - scale_bar_json = { - "label" : best_label, - "geometry" : line["geometry"], - "confidence" : float(line.get("confidence", 0)), - "length" : line.get("length", None), - "label_line_distance" : best_distance - } - scale_bar_jsons.append(scale_bar_json) - # Check which labels were left unassigned - unassigned_labels = [] - for i, label in enumerate(scale_bar_labels): - if i not in paired_labels: - unassigned_labels.append(label) - return scale_bar_jsons, unassigned_labels - -def detect_scale_objects(image, scale_bar_detection_checkpoint): - """ Detects bounding boxes of scale bars and scale bar labels - Args: - image (PIL Image): A PIL image object - Returns: - scale_bar_info (list): A list of lists with the following - pattern: [[x1,y1,x2,y2, confidence, label],...] where - label is 1 for scale bars and 2 for scale bar labelss - """ - scale_bar_detection_model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True) - input_features = scale_bar_detection_model.roi_heads.box_predictor.cls_score.in_features - number_classes = 3 # background, scale bar, scale bar label - scale_bar_detection_model.roi_heads.box_predictor = FastRCNNPredictor(input_features, number_classes) - cuda = torch.cuda.is_available() and (gpu_id >= 0) - if cuda: - scale_bar_detection_model.load_state_dict(torch.load(scale_bar_detection_checkpoint)["state_dict"]) - scale_bar_detection_model = scale_bar_detection_model.cuda() - else: - scale_bar_detection_model.load_state_dict(torch.load(scale_bar_detection_checkpoint, map_location="cpu")["model_state_dict"]) - # prediction - scale_bar_detection_model.eval() - with torch.no_grad(): - outputs = scale_bar_detection_model([image]) - # post-process - scale_bar_info = [] - for i, box in enumerate(outputs[0]["boxes"]): - confidence = outputs[0]["scores"][i] - if confidence > 0.5: - x1, y1, x2, y2 = box - label = outputs[0]['labels'][i] - scale_bar_info.append([x1, y1, x2, y2, confidence, label]) - scale_bar_info = non_max_suppression_malisiewicz(np.asarray(scale_bar_info), 0.4) - return scale_bar_info - -def postprocess_ctc(results): - classes = "0123456789mMcCuUnN .A" - idx_to_class = classes + "-" - for result, confidence in results: - confidence = float(confidence) - word = "" - for step in result: - word += idx_to_class[step] - word = word.strip() - word = "".join(word.split("-")) - print(word) - try: - number, unit = word.split() - number = float(number) - if unit.lower() == "n": - unit = "nm" - elif unit.lower() == "c": - unit = "cm" - elif unit.lower() == "u": - unit = "um" - if unit.lower() in ["nm", "mm", "cm", "um", "a"]: - return number, unit, confidence - except Exception as e: - continue - return -1, "m", 0 - -def determine_scale(figure_path, detection_checkpoint, recognition_checkpoint, figure_json=None): - """ Adds scale information to figure by reading and measuring scale bars - - Args: - figure_path (str): A path to the image (.png, .jpg, or .gif) - file containing the article figure - figure_json (dict): A Figure JSON - Returns: - figure_json (dict): A dictionary with classified image_objects - extracted from figure - """ - if figure_json is None: - figure_json = {} - convert_to_nm = { - "a" : 0.1, - "nm" : 1.0, - "um" : 1000.0, - "mm" : 1000000.0, - "cm" : 10000000.0, - "m" : 1000000000.0, - } - unassigned = figure_json.get("unassigned", {}) - unassigned_scale_labels = unassigned.get("scale_bar_labels", []) - master_images = figure_json.get("master_images", []) - image = Image.open(figure_path).convert("RGB") - tensor_image = T.ToTensor()(image) - # Detect scale bar objects - scale_bar_info = detect_scale_objects(tensor_image, detection_checkpoint) - label_names = ["background", "scale bar", "scale label"] - scale_bars = [] - scale_labels = [] - for scale_object in scale_bar_info: - x1, y1, x2, y2, confidence, classification = scale_object - geometry = boxes.convert_coords_to_labelbox([int(x1), int(y1), - int(x2), int(y2)]) - if label_names[int(classification)] == "scale bar": - scale_bar_json = { - "geometry" : geometry, - "confidence" : float(confidence), - "length" : int(x2 - x1) - } - scale_bars.append(scale_bar_json) - elif label_names[int(classification)] == "scale label": - - scale_bar_label_image = image.crop((int(x1), int(y1), - int(x2), int(y2))) - ## Read Scale Text - scale_label_text, label_confidence = read_scale_bar_label( - scale_bar_model, scale_bar_label_image) - if scale_label_text is None: - print("non label detected") - continue - magnitude, unit = scale_label_text.split(" ") - magnitude = float(magnitude) - length_in_nm = magnitude * convert_to_nm[unit.strip().lower()] - label_json = { - "geometry" : geometry, - "text" : scale_label_text, - "label_confidence" : float(label_confidence), - "box_confidence" : float(confidence), - "nm" : length_in_nm, - "unit": unit - } - scale_labels.append(label_json) - # Match scale bars to labels and to subfigures (master images) - scale_bar_jsons, unassigned_labels = ( - create_scale_bar_objects(scale_bars, scale_labels)) - - return scale_bar_jsons - -def match_scale_bars(correct, predicted): - matched = [] - paired_predicted = set() - unmatched_correct = 0 - for correct_scale in correct: - x_correct, y_correct = boxes.find_box_center(correct_scale["geometry"]) - best_distance = None - best_prediction = None - best_index = None - for predicted_index, predicted_scale in enumerate(predicted): - if predicted_index in paired_predicted: - continue - x_predicted, y_predicted = boxes.find_box_center(predicted_scale["geometry"]) - distance = (x_predicted - x_correct)**2 + (y_predicted - y_correct)**2 - if best_distance is None or distance < best_distance: - best_distance = distance - best_index = predicted_index - best_prediction = predicted_scale - # If the best match is not very good, keep this line unassigned - if best_distance is None or best_distance > 100: - best_index = -1 - best_prediction = None - best_distance = -1 - unmatched_correct += 1 - continue - paired_predicted.add(best_index) - matching = (correct_scale, best_prediction) - matched.append(matching) - unmatched_predicted = len(predicted) - len(paired_predicted) - return matched, unmatched_correct, unmatched_predicted - -def super_resolution(image): - current_file = pathlib.Path(__file__).resolve(strict=True) - model = "LapSRN_x8.pb" - modelName = model.split(os.path.sep)[-1].split("_")[0].lower() - modelScale = model.split("_x")[-1] - modelScale = int(modelScale[:modelScale.find(".")]) - - - sr = cv2.dnn_superres.DnnSuperResImpl_create() - model_path = current_file.parent / model - sr.readModel(str(model_path)) - sr.setModel(modelName, modelScale) - image = np.array(image) - image = sr.upsample(image) - image = Image.fromarray(image) - return image - -def read_scale_bar_label(scale_bar_model, scale_bar_label_image): - # preprocess - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - #scale_bar_label_image = super_resolution(scale_bar_label_image) - resize_transform = transforms.Compose([ - transforms.Resize((128, 512)), - transforms.Lambda(convert_to_rgb), - transforms.ToTensor(), - transforms.Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]), - ]) - classes = "0123456789mMcCuUnN .A" - idx_to_class = classes + "-" - image = resize_transform(scale_bar_label_image) - image = image.unsqueeze(0) - image = image.to(device) - # run image on model - logps = scale_bar_model(image) - probs = torch.exp(logps) - probs = probs.squeeze(0) - # postprocess - language_model_file ="corpus.txt" - current_file = pathlib.Path(__file__).resolve(strict=True) - language_model = LanguageModel(current_file.parent / language_model_file, classes) - top_results = ctcBeamSearch(probs, classes, lm=language_model, beamWidth=15) - - magnitude, unit, confidence = postprocess_ctc(top_results) - convert_to_nm = { - "a" : 0.1, - "nm" : 1.0, - "um" : 1000.0, - "mm" : 1000000.0, - "cm" : 10000000.0, - "m" : 1000000000.0, - } - nm = magnitude * convert_to_nm[unit.strip().lower()] - return {"unit": unit, "number": magnitude, "label_confidence": float(confidence), "nm": nm} - -def split_label(text): - """ Split a scale bar label into a number and a unit """ - text = text.strip() - for i, char in enumerate(text): - try: - float(text[:i+1]) - except: - if i > 0: - return text[:i].strip(), ''.join(text[i:].strip()) - break - return 0, None - -def test_label_reading(model_name, epoch=None): - """ Run test training set on the specified model and checkpoint - - Args: - model_name (str): Name of model - epoch (int): Epoch number or None to use highest epoch checkpoint - """ - # load test images and test image labels - current_file = pathlib.Path(__file__).resolve(strict=True) - exsclaim_root = current_file.parent.parent.parent.parent - tests = exsclaim_root / 'exsclaim' / 'tests' / 'data' - test_json = tests / "scale_bars_dataset_test.json" - train_json = tests/ "scale_bars_dataset_train.json" - test_images = tests / 'images' / 'labeled_data' - # load scale bar model - checkpoint_directory = exsclaim_root / "training" / "checkpoints" - if epoch is None: - epoch = ( - sorted([int(file.split("-")[-1].split(".")[0]) - for file in os.listdir(checkpoint_directory) - if file.split("-")[0] == model_name])[-1] - ) - scale_bar_label_checkpoint = ( - checkpoint_directory / (model_name + "-" + str(epoch) + ".pt") - ) - try: - all_configurations_path = ( - exsclaim_root / "training" / "scale_label_reader.json" - ) - with open(all_configurations_path, "r") as f: - all_configurations = json.load(f) - configuration = all_configurations[model_name] - except Exception as e: - print(e) - configuration = None - scale_bar_model = CRNN(configuration=configuration) - cuda = torch.cuda.is_available() - if cuda: - checkpoint = torch.load(scale_bar_label_checkpoint) - scale_bar_model = scale_bar_model.cuda() - else: - checkpoint = torch.load(scale_bar_label_checkpoint, map_location='cpu') - scale_bar_model.load_state_dict(checkpoint["model_state_dict"]) - scale_bar_model.eval() - # save constants - convert_to_nm = { - "a" : 0.1, - "nm" : 1.0, - "um" : 1000.0, - "mm" : 1000000.0, - "cm" : 10000000.0, - "m" : 1000000000.0, - } - # initialize results lists - correct_nms = [] - predicted_nms = [] - nm_percentage_off = [] - confidences = [] - cunits = [] - punits = [] - cnums = [] - pnums = [] - incorrect = 0 - # combine test and training data (reader was trained on synthetic data) - with open(test_json, "r") as f: - test_dict = json.load(f) - with open(train_json, "r") as f: - train_dict = json.load(f) - test_dict.update(train_dict) - keys = list(test_dict.keys()) - random.shuffle(keys) - # test model on each scale bar - for k, figure_name in enumerate(keys): - correct_labels = [] - predicted_labels = [] - figure = Image.open(test_images / figure_name).convert("RGB") - for label in test_dict[figure_name].get("scale_labels", []): - geometry = label.get("geometry") - text = label["text"] - magnitude, unit = split_label(text.strip()) - if unit not in convert_to_nm: - print("unit is none ", text) - continue - magnitude = float(magnitude) - nm = magnitude * convert_to_nm[unit.strip().lower()] - correct_labels.append({"geometry":geometry, "nm": nm, "number": magnitude, "unit": unit}) - - subfigure = figure.crop((boxes.convert_labelbox_to_coords(geometry))) - predicted_label = read_scale_bar_label(scale_bar_model, subfigure) - if predicted_label is None: - continue - if predicted_label["nm"] != nm: - incorrect += 1 - subfigure.save("incorrect/" + str(predicted_label["nm"]) + figure_name) - predicted_labels.append(predicted_label) - print("Correct: {}\tPredicted: {} {}".format(text, predicted_label["number"], predicted_label["unit"])) - - for correct, predicted in zip(correct_labels, predicted_labels): - correct_nm = correct["nm"] - predicted_nm = predicted["nm"] - confidence = predicted["label_confidence"] - correct_nms.append(correct_nm) - predicted_nms.append(predicted_nm) - confidences.append(confidence) - nm_percentage_off.append(abs(predicted_nm - correct_nm)/ correct_nm) - punits.append(predicted["unit"]) - cunits.append(correct["unit"]) - pnums.append(predicted["number"]) - cnums.append(correct["number"]) - - # if k > 50: - # break - #print(incorrect / len(cunits)) - with open(str(model_name) + "-" + str(epoch) + "nosrn_newlm.json", "w+") as f: - results = { - "correct_nms": correct_nms, - "predicted_nms": predicted_nms, - "confidences": confidences, - "correct_numbers": cnums, - "predicted_numbers": pnums, - "predicted_units": punits, - "correct_units": cunits - } - json.dump(results, f) - - -if __name__ == "__main__": - current_file = pathlib.Path(__file__).resolve(strict=True) - recognition_checkpoint = current_file.parent.parent.parent.parent / "training" / "checkpoints" / "alpha-160.pt" - test_label_reading(recognition_checkpoint) \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/label_reader_test.py b/openpmcvl/granular/process/subfigure_ocr/scale/label_reader_test.py deleted file mode 100644 index 687a7e0..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/label_reader_test.py +++ /dev/null @@ -1,197 +0,0 @@ -import os -import cv2 -import json -import yaml -import glob -import torch -import shutil -import pathlib -import time - -import numpy as np -import torch.nn.functional as F -import torch.nn as nn - -from skimage import io -from scipy.special import softmax -from torch.autograd import Variable -from PIL import Image, ImageDraw, ImageFont -import torchvision.models.detection -import torchvision.transforms as T -from torchvision.models.detection.faster_rcnn import FastRCNNPredictor -from torchvision import models - - -class ScaleBarReaderTest(): - - #### Utility Functions #### - def is_number(self, n): - """ returns true if a string n represents a float """ - try: - float(n) - except ValueError: - return False - return True - - def is_valid_scale_bar_label(self, text): - """ returns True if label is of form "[0-9]* [nm|um|mm|A]" """ - if self.is_number(text) or "/" in text: - return False - if len(text.split(" ")) != 2: - return False - if not self.is_number(text.split(" ")[0]): - return False - return True - - def all_divide(self, text): - return text - - def scale_divide(self, text): - return text.split()[0] - - def unit_divide(self, text): - return text.split()[-1] - - def get_classification_model(self, scale_label_recognition_checkpoint, classes, depth, pretrained=True): - """ """ - ## Load scale bar label reading model - - # load an object detection model pre-trained on COCO - if depth == 18: - model = models.resnet18(pretrained=pretrained) - elif depth == 50: - model = models.resnet50(pretrained=pretrained) - elif depth == 152: - model = models.resnet152(pretrained=pretrained) - - device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') - cuda = torch.cuda.is_available() and (gpu_id >= 0) - - if depth == 18: - model.fc = nn.Sequential(nn.ReLU(), - nn.Dropout(0.2), - nn.Linear(512, classes), - nn.LogSoftmax(dim=1)) - else: - model.fc = nn.Sequential(nn.Linear(2048, 512), - nn.ReLU(), - nn.Dropout(0.2), - nn.Linear(512, classes), - nn.LogSoftmax(dim=1)) - model.to(device) - - if cuda: - model.load_state_dict(torch.load(scale_label_recognition_checkpoint)) - model = model.cuda() - else: - model.load_state_dict(torch.load(scale_label_recognition_checkpoint, map_location='cpu')["model_state_dict"]) - - model.eval() - return model - - def set_up_model(self, checkpoint_path): - """ set FigureSeparator values """ - print("starting {}".format(checkpoint_path)) - # Break up checkpoint path - pretrained = True if checkpoint_path.split("/")[-2] == "pretrained" else False - model_name = checkpoint_path.split("/")[-1].split(".")[0] - model_type, epoch = model_name.split("-") - chunks = model_type.split("_") - dataset_name = "_".join(chunks[:-1]) - depth = int(chunks[-1]) - - ## Code to set up scale label reading model(s) - # id_to_class dictionaries for model outputs - all = {0: '0.1 A', 1: '0.1 nm', 2: '0.1 um', 3: '0.2 A', 4: '0.2 nm', 5: '0.2 um', 6: '0.3 A', 7: '0.3 nm', 8: '0.3 um', 9: '0.4 A', 10: '0.4 nm', 11: '0.4 um', 12: '0.5 A', 13: '0.5 nm', 14: '0.5 um', 15: '0.6 A', 16: '0.6 nm', 17: '0.6 um', 18: '0.7 A', 19: '0.7 nm', 20: '0.7 um', 21: '0.8 A', 22: '0.8 nm', 23: '0.8 um', 24: '0.9 A', 25: '0.9 nm', 26: '0.9 um', 27: '1 A', 28: '1 nm', 29: '1 um', 30: '10 A', 31: '10 nm', 32: '10 um', 33: '100 A', 34: '100 nm', 35: '100 um', 36: '2 A', 37: '2 nm', 38: '2 um', 39: '2.5 A', 40: '2.5 nm', 41: '2.5 um', 42: '20 A', 43: '20 nm', 44: '20 um', 45: '200 A', 46: '200 nm', 47: '200 um', 48: '25 A', 49: '25 nm', 50: '25 um', 51: '250 A', 52: '250 nm', 53: '250 um', 54: '3 A', 55: '3 nm', 56: '3 um', 57: '30 A', 58: '30 nm', 59: '30 um', 60: '300 A', 61: '300 nm', 62: '300 um', 63: '4 A', 64: '4 nm', 65: '4 um', 66: '40 A', 67: '40 nm', 68: '40 um', 69: '400 A', 70: '400 nm', 71: '400 um', 72: '5 A', 73: '5 nm', 74: '5 um', 75: '50 A', 76: '50 nm', 77: '50 um', 78: '500 A', 79: '500 nm', 80: '500 um', 81: '6 A', 82: '6 nm', 83: '6 um', 84: '60 A', 85: '60 nm', 86: '60 um', 87: '600 A', 88: '600 nm', 89: '600 um', 90: '7 A', 91: '7 nm', 92: '7 um', 93: '70 A', 94: '70 nm', 95: '70 um', 96: '700 A', 97: '700 nm', 98: '700 um', 99: '8 A', 100: '8 nm', 101: '8 um', 102: '80 A', 103: '80 nm', 104: '80 um', 105: '800 A', 106: '800 nm', 107: '800 um', 108: '9 A', 109: '9 nm', 110: '9 um', 111: '90 A', 112: '90 nm', 113: '90 um', 114: '900 A', 115: '900 nm', 116: '900 um'} - some = {0: '0.1 A', 1: '0.1 nm', 2: '0.1 um', 3: '0.2 A', 4: '0.2 nm', 5: '0.2 um', 6: '0.3 A', 7: '0.3 nm', 8: '0.3 um', 9: '0.4 A', 10: '0.4 nm', 11: '0.4 um', 12: '0.5 A', 13: '0.5 nm', 14: '0.5 um', 15: '1 A', 16: '1 nm', 17: '1 um', 18: '10 A', 19: '10 nm', 20: '10 um', 21: '100 A', 22: '100 nm', 23: '100 um', 24: '2 A', 25: '2 nm', 26: '2 um', 27: '2.5 A', 28: '2.5 nm', 29: '2.5 um', 30: '20 A', 31: '20 nm', 32: '20 um', 33: '200 A', 34: '200 nm', 35: '200 um', 36: '25 A', 37: '25 nm', 38: '25 um', 39: '250 A', 40: '250 nm', 41: '250 um', 42: '3 A', 43: '3 nm', 44: '3 um', 45: '30 A', 46: '30 nm', 47: '30 um', 48: '300 A', 49: '300 nm', 50: '300 um', 51: '4 A', 52: '4 nm', 53: '4 um', 54: '40 A', 55: '40 nm', 56: '40 um', 57: '400 A', 58: '400 nm', 59: '400 um', 60: '5 A', 61: '5 nm', 62: '5 um', 63: '50 A', 64: '50 nm', 65: '50 um', 66: '500 A', 67: '500 nm', 68: '500 um'} - scale_some = {0: '0.1', 1: '0.2', 2: '0.3', 3: '0.4', 4: '0.5', 5: '1', 6: '10', 7: '100', 8: '2', 9: '2.5', 10: '20', 11: '200', 12: '25', 13: '250', 14: '3', 15: '30', 16: '300', 17: '4', 18: '40', 19: '400', 20: '5', 21: '50', 22: '500'} - scale_all = {0: '0.1', 1: '0.2', 2: '0.3', 3: '0.4', 4: '0.5', 5: '0.6', 6: '0.7', 7: '0.8', 8: '0.9', 9: '1', 10: '10', 11: '100', 12: '2', 13: '2.5', 14: '20', 15: '200', 16: '25', 17: '250', 18: '3', 19: '30', 20: '300', 21: '4', 22: '40', 23: '400', 24: '5', 25: '50', 26: '500', 27: '6', 28: '60', 29: '600', 30: '7', 31: '70', 32: '700', 33: '8', 34: '80', 35: '800', 36: '9', 37: '90', 38: '900'} - unit_data = {0: 'A', 1: 'mm', 2: 'nm', 3: 'um'} - dataset_to_dict = {"all" : all, "some": some, "scale_all": scale_all, "scale_some": scale_some, "unit_data": unit_data} - self.idx_to_class = dataset_to_dict[dataset_name] - self.class_to_idx = { v : k for k, v in self.idx_to_class.items()} - - self.model = self.get_classification_model(checkpoint_path, len(self.idx_to_class), depth, pretrained) - - get_actual_text_funcs = {'all': self.all_divide, 'some': self.all_divide, 'scale_all': self.scale_divide, "scale_some": self.scale_divide, "unit_data": self.unit_divide} - self.get_actual_text = get_actual_text_funcs[dataset_name] - - def run_model(self, cropped_image): - label_reader_transforms = T.Compose([T.Resize((224, 224)), - T.ToTensor(), - T.Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]),]) - cropped_image = label_reader_transforms(cropped_image) - cropped_image = cropped_image.unsqueeze(0) - - ## Find predicted scale unit - with torch.no_grad(): - log_probabilities = self.model(cropped_image) - probabilities = torch.exp(log_probabilities) - probabilities = list(probabilities.numpy()[0]) - predicted_idx = probabilities.index(max(probabilities)) - text = self.idx_to_class[predicted_idx] - return predicted_idx, text, probabilities[predicted_idx] - - - def test_single_model(self, checkpoint_path): - """ Tests the accuracy and validity of reading scale bar labels """ - self.set_up_model(checkpoint_path) - scale_label_data = pathlib.Path(__file__).resolve(strict=True) - scale_label_data = scale_label_data.parent.parent.parent / 'tests' / 'data' / 'scale_label_dataset' - correct = 0 - incorrect = 0 - predicted_classes = [] - predicted_idxs = [] - actual_classes = [] - actual_idxs = [] - confidences = [] - skipped = 0 - for label_dir in os.listdir(scale_label_data): - label = str(label_dir) - actual_text = self.get_actual_text(label) - if actual_text in self.class_to_idx: - actual_idx = self.class_to_idx[actual_text] - else: - skipped += 1 - actual_idx = -1 - for image_file in os.listdir(scale_label_data / label): - scale_label_image = Image.open(scale_label_data / label / image_file).convert("RGB") - predicted_idx, predicted_text, confidence = self.run_model(scale_label_image) - predicted_idxs.append(predicted_idx) - predicted_classes.append(predicted_text) - actual_classes.append(actual_text) - actual_idxs.append(actual_idx) - confidences.append(float(confidence)) - if predicted_idx == actual_idx: - correct += 1 - else: - incorrect += 1 - - accuracy = correct / float(correct + incorrect + 0.0000000000000001) - return {"predicted_class": predicted_classes, - "predicted_idx": predicted_idxs, - "actual_class": actual_classes, - "actual_idx": actual_idxs, - "confidence": confidences, - "accuracy": accuracy} - - def test_many_models(self, checkpoint_dir): - """ tests accuracy of diffferent scale label reading methods """ - results_dict = {} - for filename in os.listdir(checkpoint_dir): - model_name, filetype = str(filename).split(".") - if model_name not in {"some_18-120", "all_18-148", "scale_all_18-124", "scale_some_18-127", "unit_data_18-250"}: - continue - if filetype == "pt": - checkpoint_path = checkpoint_dir / filename - single_result_dict = self.test_single_model(str(checkpoint_path)) - results_dict[filename] = single_result_dict - with open("results_breif.txt", "w") as f: - json.dump(results_dict, f) - - - -if __name__ == '__main__': - checkpoint_dir = pathlib.Path(__file__).parent / 'checkpoints' / 'pretrained' - test = ScaleBarReaderTest() - test.test_many_models(checkpoint_dir) diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/lm.py b/openpmcvl/granular/process/subfigure_ocr/scale/lm.py deleted file mode 100644 index e9813a5..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/lm.py +++ /dev/null @@ -1,59 +0,0 @@ - -from __future__ import division -from __future__ import print_function -import codecs -import re - - -class LanguageModel: - "simple language model: word list for token passing, char bigrams for beam search" - def __init__(self, fn, classes): - "read text from file to generate language model" - self.initWordList(fn) - self.initCharBigrams(fn, classes) - - - def initWordList(self, fn): - "internal init of word list" - with open(fn, "r") as f: - txt = f.read().lower() - words = re.findall(r'\w+', txt) - self.words = list(filter(lambda x: x.isalpha(), words)) - - - def initCharBigrams(self, fn, classes): - "internal init of character bigrams" - - # init bigrams with 0 values - self.bigram = {c: {d: 0 for d in classes} for c in classes} - - # go through text and add each char bigram - codec = codecs.open(fn, 'r', 'utf8') - txt = codec.read() - codec.close() - for i in range(len(txt)-1): - first = txt[i] - second = txt[i+1] - - # ignore unknown chars - if first not in self.bigram or second not in self.bigram[first]: - continue - - self.bigram[first][second] += 1 - - - def getCharBigram(self, first, second): - "probability of seeing character 'first' next to 'second'" - first = first if first else ' ' # map start to word beginning - second = second if second else ' ' # map end to word end - - # number of bigrams starting with given char - numBigrams = sum(self.bigram[first].values()) - if numBigrams == 0: - return 0 - return self.bigram[first][second] / numBigrams - - - def getWordList(self): - "get list of unique words" - return self.words diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/process.py b/openpmcvl/granular/process/subfigure_ocr/scale/process.py deleted file mode 100644 index 90b9542..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/process.py +++ /dev/null @@ -1,73 +0,0 @@ -import numpy as np - -def non_max_suppression_malisiewicz(boxes, overlap_threshold): - """ Eliminates redundant boxes using NMS adapted from Malisiewicz et al. - - Args: - boxes (np.ndarray): A >=5 by N array of bounding boxes where each - of the N rows represents a bounding box with format of - [x1, y1, x2, y2, confidence, ...] - overlap_threshold (float): If two boxes exist in which their intersection - divided by their union (IoU) is greater than overlap_threshold, - only the box with higher confidence score will remain - - Returns: - boxes (np.ndarray): A >=5 by K array where K <= N of bounding boxes that - remain after applying NMS adapted from https://www.pyimagesearch.com/2015/02/16/faster-non-maximum-suppression-python/ - based off of Malisiewicz et al. - """ - # if there are no boxes, return an empty list - if len(boxes) == 0: - return [] - - # if the bounding boxes integers, convert them to floats -- - # this is important since we'll be doing a bunch of divisions - if boxes.dtype.kind == "i": - boxes = boxes.astype("float") - - # initialize the list of picked indexes - pick = [] - - # grab the coordinates of the bounding boxes - x1 = boxes[:,0] - y1 = boxes[:,1] - x2 = boxes[:,2] - y2 = boxes[:,3] - scores = boxes[:,4] - - # compute the area of the bounding boxes and sort the bounding - # boxes by the bottom-right y-coordinate of the bounding box - area = (x2 - x1 + 1) * (y2 - y1 + 1) - idxs = np.argsort(scores) - - # keep looping while some indexes still remain in the indexes - # list - while len(idxs) > 0: - # grab the last index in the indexes list and add the - # index value to the list of picked indexes - last = len(idxs) - 1 - i = idxs[last] - pick.append(i) - - # find the largest (x, y) coordinates for the start of - # the bounding box and the smallest (x, y) coordinates - # for the end of the bounding box - xx1 = np.maximum(x1[i], x1[idxs[:last]]) - yy1 = np.maximum(y1[i], y1[idxs[:last]]) - xx2 = np.minimum(x2[i], x2[idxs[:last]]) - yy2 = np.minimum(y2[i], y2[idxs[:last]]) - - # compute the width and height of the bounding box - w = np.maximum(0, xx2 - xx1 + 1) - h = np.maximum(0, yy2 - yy1 + 1) - - # compute the ratio of overlap - overlap = (w * h) / area[idxs[:last]] - - # delete all indexes from the index list that have - idxs = np.delete(idxs, np.concatenate(([last], - np.where(overlap > overlap_threshold)[0]))) - - # return only the bounding boxes that were picked using the - # integer data type - return boxes[pick] \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/scale_bar_model.py b/openpmcvl/granular/process/subfigure_ocr/scale/scale_bar_model.py deleted file mode 100644 index 4ca7ba8..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/scale_bar_model.py +++ /dev/null @@ -1,192 +0,0 @@ -import torchvision -from torchvision.models.detection.faster_rcnn import FastRCNNPredictor -from .dataset import ScaleBarDataset -from .engine import train_one_epoch, evaluate -from PIL import Image, ImageDraw -from . import utils -import torch -from torch import optim -import torchvision.transforms as T -import skimage as io -import numpy as np -import os -import pathlib -import random -import cv2 -import argparse - - - -def random_gaussian_blur(image): - image = np.array(image) - random_value = random.randint(0,4) - if random_value == 2: - image_blur = cv2.GaussianBlur(image,(15,15),10) - new_image = image_blur - return new_image - return image - -def get_transform(train): - transforms = [] - if train: - transforms.append(T.Lambda(random_gaussian_blur)) - transforms.append(T.ToTensor()) - return T.Compose(transforms) - -def get_model(train_status): - num_classes = 3 #background, scale bar, scale_label - train_statuses = {"p" : True, "s": False} - faster = train_statuses[train_status[0]] - resnet = train_statuses[train_status[1]] - - current_model = "scale_bar_model_{}".format(train_status) - - # load an object detection model pre-trained on COCO - model = torchvision.models.detection.fasterrcnn_resnet50_fpn( - pretrained=faster, pretrained_backbone=resnet) - # get the number of input features for the classifier - in_features = model.roi_heads.box_predictor.cls_score.in_features - # replace the pre-trained head with a new on - model.roi_heads.box_predictor = FastRCNNPredictor(in_features, num_classes) - - # construct an optimizer - params = [p for p in model.parameters() if p.requires_grad] - learning_rate = 0.001 - optimizer = optim.Adam(params, lr=learning_rate) - # and a learning rate scheduler - #lr_scheduler = optim.lr_scheduler.ReduceLROnPlateau(optimizer, "min") - #lr_scheduler = optim.lr_scheduler.MultiStepLR(optimizer, milestones=[20, 40, 60]) - lr_scheduler = None - # find if there is a previous checkpoint - current_path = pathlib.Path(__file__).resolve(strict=True) - checkpoints = current_path.parent / 'checkpoints' - largest = -1 - best_checkpoint = None - for checkpoint in os.listdir(checkpoints): - filename = checkpoint.split(".")[0] - if not os.path.isfile(os.path.join(checkpoints, checkpoint)): - continue - model_name, number = filename.split("-") - if model_name != current_model: - continue - number = int(number) - if number > largest: - best_checkpoint = checkpoint - largest = number - if best_checkpoint == None: - return model, lr_scheduler, optimizer, 0 - - best_checkpoint = checkpoints / best_checkpoint - cuda = torch.cuda.is_available() and (gpu_id >= 0) - if cuda: - checkpoint = torch.load(best_checkpoint) - model = model.cuda() - else: - checkpoint = torch.load(best_checkpoint, map_location='cpu') - - model.load_state_dict(checkpoint["model_state_dict"]) - optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) - #lr_scheduler.load_state_dict(checkpoint["lr_state_dict"]) - epoch = checkpoint['epoch'] - - return model, lr_scheduler, optimizer, epoch - -def train_object_detector(train_status): - # train on the GPU or on the CPU, if a GPU is not available - device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') - - current_path = pathlib.Path(__file__).resolve(strict=True) - checkpoints = current_path.parent / "checkpoints" - root_directory = current_path.parent.parent.parent / 'tests' / 'data' - # use our dataset and defined transformations - dataset_train = ScaleBarDataset(root_directory, get_transform(train=True), False) - dataset_test = ScaleBarDataset(root_directory, get_transform(train=False), True) - - # define training and validation data loaders - data_loader = torch.utils.data.DataLoader( - dataset_train, batch_size=32, shuffle=True, num_workers=0, - collate_fn=utils.collate_fn) - - data_loader_test = torch.utils.data.DataLoader( - dataset_test, batch_size=32, shuffle=True, num_workers=0, - collate_fn=utils.collate_fn) - - # get the model using our helper function - model, lr_scheduler, optimizer, start_epoch = get_model(train_status) - # move model to the right device - model.to(device) - - model_name = "scale_bar_model_{}".format(train_status) - num_epochs = 200 - for epoch in range(start_epoch + 1, num_epochs): - # train for one epoch, printing every 10 iterations - train_one_epoch(model, optimizer, data_loader, device, - epoch, print_freq=5, lr_scheduler=lr_scheduler, model_name=model_name) - # evaluate on the test dataset - evaluate(model, data_loader_test, device=device, model_name=model_name) - - if epoch % 1 == 0: - torch.save({ - 'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - #'lr_state_dict': lr_scheduler.state_dict() - }, - checkpoints / "scale_bar_model_{}-{}.pt".format(train_status, epoch)) - - -def run(): - ## Load text recognition model - scale_bar_checkpoint = 'scale_bar_model.pt' - scale_bar_model = get_model(3) - cuda = torch.cuda.is_available() and (gpu_id >= 0) - if cuda: - scale_bar_model.load_state_dict(torch.load(scale_bar_checkpoint)["model_state_dict"]) - scale_bar_model = scale_bar_model.cuda() - else: - scale_bar_model.load_state_dict(torch.load(scale_bar_checkpoint, map_location='cpu')["model_state_dict"]) - - scale_bar_model.eval() - - # use our dataset and defined transformations - dataset = ScaleBarDataset('', get_transform(train=True)) - dataset_test = ScaleBarDataset('', get_transform(train=False)) - - # split the dataset in train and test set - indices = torch.randperm(len(dataset)).tolist() - dataset = torch.utils.data.Subset(dataset, indices[:-100]) - dataset_test = torch.utils.data.Subset(dataset_test, indices[-100:]) - image, _ = dataset_test[0] - label_boxes = np.array(dataset_test[0][1]["boxes"]) - - - with torch.no_grad(): - prediction = scale_bar_model([image]) - - image = Image.fromarray(image.mul(255).permute(1, 2,0).byte().numpy()) - image.save("test2.png") - draw = ImageDraw.Draw(image)# draw groundtruth - for elem in range(len(label_boxes)): - draw.rectangle([(label_boxes[elem][0], label_boxes[elem][1]), (label_boxes[elem][2], label_boxes[elem][3])], outline ="green", width =3) - for element in range(len(prediction[0]["boxes"])): - boxes = prediction[0]["boxes"][element].cpu().numpy() - score = np.round(prediction[0]["scores"][element].cpu().numpy(), - decimals= 4) - if score > 0.8: - draw.rectangle([(boxes[0], boxes[1]), (boxes[2], boxes[3])], - outline ="red", width =3) - draw.text((boxes[0], boxes[1]), text = str(score)) - - image.save("test.png") - -if __name__ == "__main__": - # for command line usage - ap = argparse.ArgumentParser() - ap.add_argument("-t", "--train_status", type=str, default="pp", - help="whether faster rcc and resent backbone are pretrained") - - args = vars(ap.parse_args()) - - train_status = args["train_status"] - - train_object_detector(train_status) diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/train_label_reader.py b/openpmcvl/granular/process/subfigure_ocr/scale/train_label_reader.py deleted file mode 100644 index f7ffc88..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/train_label_reader.py +++ /dev/null @@ -1,433 +0,0 @@ -import argparse -import json -import os -import pathlib -from operator import itemgetter - -import numpy as np -import torch -from PIL import Image -from pytorch_model_summary import summary -from torch import nn, optim -from torchvision import transforms - -from ..models.crnn import CRNN -from .ctc import ctcBeamSearch -from .dataset import ScaleLabelDataset -from .lm import LanguageModel - - -def convert_to_rgb(image): - return image.convert("RGB") - -def load_data(batch_size, input_height, input_width, text="random_separate"): - normalize_transform = transforms.Compose([ - transforms.GaussianBlur((3,3), sigma=(0.1, 2.0)), - transforms.Resize((input_height, input_width)), - transforms.Lambda(convert_to_rgb), - transforms.ToTensor(), - transforms.Normalize(mean = [0.485, 0.456, 0.406], std = [0.229, 0.224, 0.225]), - ]) - resize_transform = transforms.Compose([transforms.Resize((32, 128)), - transforms.Lambda(convert_to_rgb), - transforms.ToTensor()]) - train_data = ScaleLabelDataset(transforms=normalize_transform, text=text) - trainloader = torch.utils.data.DataLoader(train_data, batch_size=batch_size, shuffle=True) - return trainloader, trainloader - -def get_model(checkpoint_directory, model_name): - best_model = None - highest_epoch = 0 - for checkpoint in os.listdir(checkpoint_directory): - checkpoint_name, epoch = checkpoint.split(".")[0].split("-") - epoch = int(epoch) - if checkpoint_name == model_name and epoch > highest_epoch: - best_model = checkpoint - highest_epoch = epoch - if best_model is None: - return None - return checkpoint_directory / best_model - -def train_one_epoch(model, - epoch, - criterion, - optimizer, - lr_scheduler, - trainloader, - testloader, - results_file, - checkpoint_directory, - model_name, - save_every, - print_every, - best_loss): - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - batches = 0 - for inputs, labels in trainloader: - inputs = inputs.to(device) - labels = labels.to(device) - target_lengths = [] - for label in labels: - label_list = label.tolist() - target_lengths.append(label_list.index(21)) - target_lengths = torch.tensor(target_lengths, dtype=torch.int8, device=device) - input_lengths = torch.tensor([32]*len(target_lengths), device=device) - predictions = model(inputs) - predictions = predictions.permute(1, 0, 2) - loss = criterion(predictions, labels, input_lengths, target_lengths) - optimizer.zero_grad() - loss.backward() - optimizer.step() - lr_scheduler.step(loss) - batches += 1 - if batches % print_every == 0: - with open(results_file, "a+") as f: - f.write("\tBatch: {}, Loss: {}, Learning Rate: {}\n".format(batches, loss, optimizer.param_groups[0]["lr"])) - # test results - running_loss = 0 - i = 0 - for inputs, labels in testloader: - inputs = inputs.to(device) - labels = labels.to(device) - if i > 1000: - break - target_lengths = [] - for label in labels: - label_list = label.tolist() - target_lengths.append(label_list.index(21)) - target_lengths = torch.tensor(target_lengths, dtype=torch.int8, device=device) - input_lengths = torch.tensor([32]*len(target_lengths), device=device) - predictions = model(inputs) - predictions = predictions.permute(1, 0, 2) - loss = criterion(predictions, labels, input_lengths, target_lengths) - running_loss += float(loss) - if running_loss < best_loss: - best_loss = running_loss - with open(results_file, "a+") as f: - f.write("Epoch: {}, Running Loss: {}, Learning Rate: {}\n".format(epoch, running_loss, optimizer.param_groups[0]["lr"])) - # save checkpoint - if epoch % save_every == 0: - torch.save({ - "epoch": epoch, - "model_state_dict": model.state_dict(), - "optimizer_state_dict": optimizer.state_dict(), - "lr_state_dict": lr_scheduler.state_dict(), - "best_loss": best_loss - }, checkpoint_directory / (model_name + "-{}.pt".format(epoch))) - return best_loss - -def train_crnn(batch_size=32, - epochs=2000, - learning_rate=0.001, - optimizer="SGD", - lr_scheduler="plateau", - loss_function="CTC", - print_every=50, - save_every=5, - input_channels=3, - output_classes=22, - cnn_to_rnn=0, - model_name="test", - input_height=128, - input_width=512, - sequence_length=32, - recurrent_type="bi-lstm", - cnn_kernel_size=(3,3), - convolution_layers=4, - hard_set_lr = None, - configuration = None, - text="random_separate"): - """ trains model """ - current_file = pathlib.Path(__file__).resolve(strict=True) - exsclaim_root = current_file.parent.parent.parent.parent - checkpoint_directory = exsclaim_root / "training" / "checkpoints" - results_file = exsclaim_root / "training" / "results" / (model_name + ".txt") - # Load CRNN model and assign optimizer, lr_scheduler - model = CRNN(input_channels=input_channels, - output_classes=output_classes, - convolution_layers=convolution_layers, - cnn_kernel_size=cnn_kernel_size, - recurrent_type=recurrent_type, - input_height=input_height, - input_width=input_width, - sequence_length=sequence_length, - configuration=configuration) - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - model.to(device) - with open(results_file, "a+") as f: - f.write(summary( - model, - torch.zeros((1, 3, input_height, input_width)).to(device), - show_input=False - )) - f.write("\n") - # set up training hyper parameters - optimizers = { - "adam" : optim.Adam(model.parameters(), lr=learning_rate), - "SGD" : optim.SGD(model.parameters(), lr=learning_rate) - } - optimizer = optimizers[optimizer] - best_checkpoint = get_model(checkpoint_directory, model_name) - if best_checkpoint is not None: - cuda = torch.cuda.is_available() - if cuda: - checkpoint = torch.load(best_checkpoint) - model = model.cuda() - else: - checkpoint = torch.load(best_checkpoint, map_location='cpu') - model.load_state_dict(checkpoint["model_state_dict"]) - optimizer.load_state_dict(checkpoint["optimizer_state_dict"]) - current_epoch = checkpoint["epoch"] - best_loss = checkpoint["best_loss"] - else: - current_epoch = 0 - best_loss = 999999999999 - - # hard set learning rate - if hard_set_lr is not None: - optimizer.param_groups[0]["lr"] = hard_set_lr - # dict of lr_schedulers after optimizer state dict is loaded since - # lr_schedulers take optimizer as a parameter - lr_schedulers = { - "plateau": optim.lr_scheduler.ReduceLROnPlateau( - optimizer, patience=2000, threshold=0.000001, factor=0.5 - ) - } - lr_scheduler = lr_schedulers[lr_scheduler] - if best_checkpoint is not None: - lr_scheduler.load_state_dict(checkpoint["lr_state_dict"]) - # Set loss function, load data and begin training - loss_functions = { - "CTC": nn.CTCLoss(blank=21, zero_infinity=True), - "NLL": nn.NLLLoss() - } - criterion = loss_functions[loss_function] - label_trainloader, label_testloader = load_data(batch_size, input_height, input_width, text) - character_trainloader, character_testloader = load_data(batch_size, input_height, input_width, text) - # Set rnn to untrainable - for name, param in model.named_parameters(): - if "Recurrent" not in name: - param.requires_grad = False - for epoch in range(current_epoch+1, int(cnn_to_rnn*epochs)): - best_loss = train_one_epoch(model, epoch, criterion, optimizer, lr_scheduler, - character_trainloader, character_testloader, - results_file, checkpoint_directory, model_name, save_every, print_every, - best_loss) - try: - current_epoch = epoch - except: - pass - # train full model - print("\nStarting full model training\n") - for param in model.parameters(): - param.requires_grad = True - for epoch in range(current_epoch+1, epochs): - best_loss = train_one_epoch(model, epoch, criterion, optimizer, lr_scheduler, - label_trainloader, label_testloader, - results_file, checkpoint_directory, model_name, save_every, print_every, - best_loss) - - -### DECODER FUNCTIONS ### - -def ctc_decoders(beamWidth, constrict_search, lm, postprocess): - classes = "0123456789mMcCuUnN .A" - idx_to_class = classes + "-" - def ctc_search(matrix): - ctc_inputs = torch.exp(matrix) - ctc_inputs = ctc_inputs.squeeze(0) - results = ctcBeamSearch(ctc_inputs, - classes=classes, - lm=lm, - beamWidth=beamWidth, - constrict_search=constrict_search) - if postprocess: - word = postprocess_ctc(results) - else: - word = "" - for step in results[0]: - word += idx_to_class[step] - return word - return ctc_search - -def is_number(n): - try: - float(n) - return True - except: - return False - -def path_to_word(path, idx_to_class): - word = "" - for step in path[1:]: - word += idx_to_class[step[0]] - word = "".join(word.split("-")) - word = "".join(word.split(" ")) - for i in range(len(word)): - if not is_number(word[:i+1]): - break - return str(float(word[:i])) + " " + word[i:].lower() - -def postprocess_ctc(results): - classes = "0123456789mMcCuUnN .A" - idx_to_class = classes + "-" - for result in results: - word = "" - for step in result: - word += idx_to_class[step] - word = word.strip() - word = "".join(word.split("-")) - try: - number, unit = word.split(" ") - number = float(number) - if unit.lower() not in ["nm", "mm", "cm", "um", "a"]: - continue - return word - except: - continue - return None - -def decode(logits, beam_width): - legal_next_steps = create_rules() - start_idx = 22 - potential_paths = [[(start_idx, 0)]] - for timestep in logits: - new_potential_paths = [] - for path in potential_paths: - current_idx = path[-1][0] - legal_idxs = valid_next_char(path, 8) - next_steps = find_n_best_legal_moves(legal_idxs, timestep, beam_width) - for next_step in next_steps: - new_potential_paths.append(path + [next_step]) - #new_potential_paths += potential_paths - sorted_potential_paths = sorted(new_potential_paths, key=lambda x : score_candidate(x), reverse=True) - potential_paths = sorted_potential_paths[:beam_width] - final_rankings = sorted(potential_paths, key=lambda x : score_candidate(x, True), reverse=True) - return final_rankings - -def find_n_best_legal_moves(legal_idxs, next_timestep, n): - moves = [] - for legal_idx in legal_idxs: - moves.append((legal_idx, next_timestep[legal_idx])) - ranked_moves = sorted(moves, key=itemgetter(1), reverse=True) - return ranked_moves[:n] - -def score_candidate(path, is_final=False): - """ path is list of (label, logp) tuples """ - units = 0 - nonzero_digits = 0 - decimals = 0 - score = 0 - for label, logp in path: - if label in [1,2,3,4,5,6,7,8,9]: - nonzero_digits += 1 - elif label in [10,11,12,13,14,15,16,17]: - units += 1 - # Angstrom is standalone unit - elif label == 20: - units += 2 - elif label == 19: - decimals += 1 - # score for ordering - if label in [0,1,2,3,4,5,6,7,8,9] and units > 0: - return -100 - score = logp - if (units > 2 - or (units > 0 and nonzero_digits == 0)): - score = -100 - if not is_final: - return score - # change score to 0 for rule violations - if (units != 2 - or nonzero_digits not in [1,2,3,4,5] - or decimals > 1): - score = -100 - return score - - -def valid_next_char(path, sequence_length): - path_length = len(path) - spots_left = sequence_length - path_length + 1 - if path_length == 1: - return [1,2,3,4,5,6,7,8,9] - prefix = False - base_unit = False - nonzero_digits = 0 - digits = 0 - decimals = 0 - - for label, logp in path: - if label in [1,2,3,4,5,6,7,8,9]: - nonzero_digits += 1 - digits += 1 - elif label == 0: - digits += 1 - elif label == 19: - decimals += 1 - elif label in [10,11,12,13,14,15,16,17] and not prefix: - prefix = True - elif label == 20: - prefix = True - base_unit = True - elif label in [10, 11] and prefix: - base_unit = True - elif label in [18, 21, 22]: - continue - else: - print("How did I get here?\nThe path is: ", path) - - # unit has been started, no digits or decimals allowed - if prefix: - # unit has not been finished, no prefixes allowed - if not base_unit: - # only one spot left, must finish unit - if spots_left == 1: - return [10, 11] - else: - return [10, 11, 18, 21] - # unit has been finished, only blanks left - else: - return [18, 21] - # unit has not been started - # decimal must be followed by a digit - if label == 19: - return [0,1,2,3,4,5,6,7,8,9,18,21] - # if unit hasn't started and only one spot left, must be A - if spots_left == 1: - return [20] - elif spots_left == 2: - # current label is a space, can go right into unit - if label in [18,21]: - return [10,11,12,13,14,15,16,17,18,20,21] - else: - return [18, 21] - # more than 2 spots left - # if last spot is not a blank, must be followed by more numbers or spaces - if label not in [18, 21]: - if decimals == 1: - return [0,1,2,3,4,5,6,7,8,9,18,21] - else: - return [0,1,2,3,4,5,6,7,8,9,19,18,21] - # last spot is blank, can be followed by anything - if decimals == 1: - return [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,20,21] - else: - return [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21] - -def create_rules(): - classes = "0123456789mMcCuUnN .A-" - # digits can be followed by other digits, decimal points, spaces, and blanks - legal_next_chars = {i : [0,1,2,3,4,5,6,7,8,9,18,19,21] for i in range(0,10)} - # a space can be followed by unit characters and blanks - legal_next_chars[18] = [10,11,12,13,14,15,16,17,18,20,21] - # a decimal point can be followed by digits and blanks - legal_next_chars[19] = [0,1,2,3,4,5,6,8,9,18,21] - # A can only be followed by a blank - legal_next_chars[20] = [18,21] - # non-A units can only be followed by a blank or an m - for i in range(10, 18): - legal_next_chars[i] = [10, 11,18, 21] - # a blanks can be followed by all - legal_next_chars[21] = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21] - legal_next_chars[22] = [0,1,2,3,4,5,6,7,8,9,18,21] - return legal_next_chars diff --git a/openpmcvl/granular/process/subfigure_ocr/scale/utils.py b/openpmcvl/granular/process/subfigure_ocr/scale/utils.py deleted file mode 100644 index f064205..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/scale/utils.py +++ /dev/null @@ -1,268 +0,0 @@ -## Acquired from https://github.com/pytorch/vision/tree/master/references/detection -from collections import defaultdict, deque -import datetime -import pickle -import time - -import torch -import torch.distributed as dist - -import numpy as np -import errno -import os -import pathlib - -class SmoothedValue(object): - """Track a series of values and provide access to smoothed values over a - window or the global series average. - """ - - def __init__(self, window_size=20, fmt=None): - if fmt is None: - fmt = "{median:.4f} ({global_avg:.4f})" - self.deque = deque(maxlen=window_size) - self.total = 0.0 - self.count = 0 - self.fmt = fmt - - def update(self, value, n=1): - self.deque.append(value) - self.count += n - self.total += value * n - - def synchronize_between_processes(self): - """ - Warning: does not synchronize the deque! - """ - if not is_dist_avail_and_initialized(): - return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') - dist.barrier() - dist.all_reduce(t) - t = t.tolist() - self.count = int(t[0]) - self.total = t[1] - - @property - def median(self): - d = torch.tensor(list(self.deque)) - return d.median().item() - - @property - def avg(self): - d = torch.tensor(list(self.deque), dtype=torch.float32) - return d.mean().item() - - @property - def global_avg(self): - return self.total / self.count - - @property - def max(self): - return max(self.deque) - - @property - def value(self): - return self.deque[-1] - - def __str__(self): - return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value) - - -def all_gather(data): - """ - Run all_gather on arbitrary picklable data (not necessarily tensors) - Args: - data: any picklable object - Returns: - list[data]: list of data gathered from each rank - """ - world_size = get_world_size() - if world_size == 1: - return [data] - - # serialized to a Tensor - buffer = pickle.dumps(data) - storage = torch.ByteStorage.from_buffer(buffer) - tensor = torch.ByteTensor(storage).to("cuda") - - # obtain Tensor size of each rank - local_size = torch.tensor([tensor.numel()], device="cuda") - size_list = [torch.tensor([0], device="cuda") for _ in range(world_size)] - dist.all_gather(size_list, local_size) - size_list = [int(size.item()) for size in size_list] - max_size = max(size_list) - - # receiving Tensor from all ranks - # we pad the tensor because torch all_gather does not support - # gathering tensors of different shapes - tensor_list = [] - for _ in size_list: - tensor_list.append(torch.empty((max_size,), dtype=torch.uint8, device="cuda")) - if local_size != max_size: - padding = torch.empty(size=(max_size - local_size,), dtype=torch.uint8, device="cuda") - tensor = torch.cat((tensor, padding), dim=0) - dist.all_gather(tensor_list, tensor) - - data_list = [] - for size, tensor in zip(size_list, tensor_list): - buffer = tensor.cpu().numpy().tobytes()[:size] - data_list.append(pickle.loads(buffer)) - - return data_list - - -def reduce_dict(input_dict, average=True): - """ - Args: - input_dict (dict): all the values will be reduced - average (bool): whether to do average or sum - Reduce the values in the dictionary from all processes so that all processes - have the averaged results. Returns a dict with the same fields as - input_dict, after reduction. - """ - world_size = get_world_size() - if world_size < 2: - return input_dict - with torch.no_grad(): - names = [] - values = [] - # sort the keys so that they are consistent across processes - for k in sorted(input_dict.keys()): - names.append(k) - values.append(input_dict[k]) - values = torch.stack(values, dim=0) - dist.all_reduce(values) - if average: - values /= world_size - reduced_dict = {k: v for k, v in zip(names, values)} - return reduced_dict - - -class MetricLogger(object): - def __init__(self, delimiter="\t", model_name="unnamed_model"): - self.meters = defaultdict(SmoothedValue) - self.delimiter = delimiter - current_file = pathlib.Path(__file__).resolve(strict=True) - self.save_file = current_file.parent / 'results' / '{}.txt'.format(model_name) - - - def update(self, **kwargs): - for k, v in kwargs.items(): - if isinstance(v, torch.Tensor): - v = v.item() - assert isinstance(v, (float, int)) - self.meters[k].update(v) - - def __getattr__(self, attr): - if attr in self.meters: - return self.meters[attr] - if attr in self.__dict__: - return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) - - def __str__(self): - loss_str = [] - for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) - return self.delimiter.join(loss_str) - - def synchronize_between_processes(self): - for meter in self.meters.values(): - meter.synchronize_between_processes() - - def add_meter(self, name, meter): - self.meters[name] = meter - - def log_every(self, iterable, print_freq, header=None): - i = 0 - if not header: - header = '' - start_time = time.time() - end = time.time() - iter_time = SmoothedValue(fmt='{avg:.4f}') - data_time = SmoothedValue(fmt='{avg:.4f}') - space_fmt = ':' + str(len(str(len(iterable)))) + 'd' - if torch.cuda.is_available(): - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}', - 'max mem: {memory:.0f}' - ]) - else: - log_msg = self.delimiter.join([ - header, - '[{0' + space_fmt + '}/{1}]', - 'eta: {eta}', - '{meters}', - 'time: {time}', - 'data: {data}' - ]) - MB = 1024.0 * 1024.0 - - - f = open(self.save_file, "a") - - for obj in iterable: - data_time.update(time.time() - end) - yield obj - iter_time.update(time.time() - end) - if i % print_freq == 0 or i == len(iterable) - 1: - eta_seconds = iter_time.global_avg * (len(iterable) - i) - eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) - if torch.cuda.is_available(): - f.write(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB)) - else: - f.write(log_msg.format( - i, len(iterable), eta=eta_string, - meters=str(self), - time=str(iter_time), data=str(data_time))) - i += 1 - end = time.time() - total_time = time.time() - start_time - total_time_str = str(datetime.timedelta(seconds=int(total_time))) - f.write('{} Total time: {} ({:.4f} s / it)\n'.format( - header, total_time_str, total_time / len(iterable))) - f.close() - -def collate_fn(batch): - return tuple(zip(*batch)) - -def warmup_lr_scheduler(optimizer, warmup_iters, warmup_factor): - - def f(x): - if x >= warmup_iters: - return 1 - alpha = float(x) / warmup_iters - return warmup_factor * (1 - alpha) + alpha - - return torch.optim.lr_scheduler.LambdaLR(optimizer, f) - -def is_dist_avail_and_initialized(): - if not dist.is_available(): - return False - if not dist.is_initialized(): - return False - return True - - -def get_world_size(): - if not is_dist_avail_and_initialized(): - return 1 - return dist.get_world_size() \ No newline at end of file diff --git a/openpmcvl/granular/process/subfigure_ocr/separator/__init__.py b/openpmcvl/granular/process/subfigure_ocr/separator/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/process/subfigure_ocr/separator/process.py b/openpmcvl/granular/process/subfigure_ocr/separator/process.py deleted file mode 100644 index 3bc41fb..0000000 --- a/openpmcvl/granular/process/subfigure_ocr/separator/process.py +++ /dev/null @@ -1,239 +0,0 @@ -from __future__ import division - -import torch -import cv2 -import numpy as np - -def label2yolobox(labels, info_img, maxsize, lrflip): - """ - Transform coco labels to yolo box labels - Args: - labels (numpy.ndarray): label data whose shape is :math:`(N, 5)`. - Each label consists of [class, x1, y1, x2, y2] where \ - class (float): class index. - x1, y1, x2, y2 (float) : coordinates of \ - left-top and right-bottom points of bounding boxes. - Values range from 0 to width or height of the image. - info_img : tuple of h, w, nh, nw, dx, dy. - h, w (int): original shape of the image - nh, nw (int): shape of the resized image without padding - dx, dy (int): pad size - maxsize (int): target image size after pre-processing - lrflip (bool): horizontal flip flag - - Returns: - labels:label data whose size is :math:`(N, 5)`. - Each label consists of [class, xc, yc, w, h] where - class (float): class index. - xc, yc (float) : center of bbox whose values range from 0 to 1. - w, h (float) : size of bbox whose values range from 0 to 1. - """ - h, w, nh, nw, dx, dy = info_img - x1 = labels[:, 1] / w - y1 = labels[:, 2] / h - x2 = (labels[:, 1] + labels[:, 3]) / w - y2 = (labels[:, 2] + labels[:, 4]) / h - labels[:, 1] = (((x1 + x2) / 2) * nw + dx) / maxsize - labels[:, 2] = (((y1 + y2) / 2) * nh + dy) / maxsize - labels[:, 3] *= nw / w / maxsize - labels[:, 4] *= nh / h / maxsize - if lrflip: - labels[:, 1] = 1 - labels[:, 1] - return labels - -def yolobox2label(box, info_img): - """ - Transform yolo box labels to yxyx box labels. - Args: - box (list): box data with the format of [yc, xc, w, h] - in the coordinate system after pre-processing. - info_img : tuple of h, w, nh, nw, dx, dy. - h, w (int): original shape of the image - nh, nw (int): shape of the resized image without padding - dx, dy (int): pad size - Returns: - label (list): box data with the format of [y1, x1, y2, x2] - in the coordinate system of the input image. - """ - h, w, nh, nw, dx, dy = info_img - y1, x1, y2, x2 = box - box_h = ((y2 - y1) / nh) * h - box_w = ((x2 - x1) / nw) * w - y1 = ((y1 - dy) / nh) * h - x1 = ((x1 - dx) / nw) * w - label = [max(x1,0), max(y1,0), min(x1 + box_w,w), min(y1 + box_h,h)] - return label - -def nms(bbox, thresh, score=None, limit=None): - """Suppress bounding boxes according to their IoUs and confidence scores. - Args: - bbox (array): Bounding boxes to be transformed. The shape is - :math:`(R, 4)`. :math:`R` is the number of bounding boxes. - thresh (float): Threshold of IoUs. - score (array): An array of confidences whose shape is :math:`(R,)`. - limit (int): The upper bound of the number of the output bounding - boxes. If it is not specified, this method selects as many - bounding boxes as possible. - Returns: - array: - An array with indices of bounding boxes that are selected. \ - They are sorted by the scores of bounding boxes in descending \ - order. \ - The shape of this array is :math:`(K,)` and its dtype is\ - :obj:`numpy.int32`. Note that :math:`K \\leq R`. - - from: https://github.com/chainer/chainercv - """ - - if len(bbox) == 0: - return np.zeros((0,), dtype=np.int32) - - if score is not None: - order = score.argsort()[::-1] - bbox = bbox[order] - bbox_area = np.prod(bbox[:, 2:] - bbox[:, :2], axis=1) - - selec = np.zeros(bbox.shape[0], dtype=bool) - for i, b in enumerate(bbox): - tl = np.maximum(b[:2], bbox[selec, :2]) - br = np.minimum(b[2:], bbox[selec, 2:]) - area = np.prod(br - tl, axis=1) * (tl < br).all(axis=1) - - iou = area / (bbox_area[i] + bbox_area[selec] - area) - if (iou >= thresh).any(): - continue - - selec[i] = True - if limit is not None and np.count_nonzero(selec) >= limit: - break - - selec = np.where(selec)[0] - if score is not None: - selec = order[selec] - return selec.astype(np.int32) - -def postprocess(prediction, dtype, conf_thre=0.7, nms_thre=0.45): - """ - Postprocess for the output of YOLO model - perform box transformation, specify the class for each detection, - and perform class-wise non-maximum suppression. - Args: - prediction (torch tensor): The shape is :math:`(N, B, 4)`. - :math:`N` is the number of predictions, - :math:`B` the number of boxes. The last axis consists of - :math:`xc, yc, w, h` where `xc` and `yc` represent a center - of a bounding box. - num_classes (int): - number of dataset classes. - conf_thre (float): - confidence threshold ranging from 0 to 1, - which is defined in the config file. - nms_thre (float): - IoU threshold of non-max suppression ranging from 0 to 1. - - Returns: - output (list of torch tensor): - - """ - box_corner = prediction.new(prediction.shape) - box_corner[:, :, 0] = prediction[:, :, 0] - prediction[:, :, 2] / 2 - box_corner[:, :, 1] = prediction[:, :, 1] - prediction[:, :, 3] / 2 - box_corner[:, :, 2] = prediction[:, :, 0] + prediction[:, :, 2] / 2 - box_corner[:, :, 3] = prediction[:, :, 1] + prediction[:, :, 3] / 2 - prediction[:, :, :4] = box_corner[:, :, :4] - - output = [None for _ in range(len(prediction))] - for i, image_pred in enumerate(prediction): - # Filter out confidence scores below threshold - conf_mask = (image_pred[:, 4] >= conf_thre).squeeze() - image_pred = image_pred[conf_mask] - - # If none are remaining => process next image - if not image_pred.size(0): - continue - # Get score and class with highest confidence - class_conf = torch.ones(image_pred[:, 4:5].size()).type(dtype) - class_pred = torch.zeros(image_pred[:, 4:5].size()).type(dtype) - - # Detections ordered as (x1, y1, x2, y2, obj_conf, class_conf, class_pred) - detections = torch.cat( - (image_pred[:, :5], class_conf.float(), class_pred.float()), 1) - # Iterate through all predicted classes - unique_labels = detections[:, -1].cpu().unique() - if prediction.is_cuda: - unique_labels = unique_labels.cuda() - for c in unique_labels: - # Get the detections with the particular class - detections_class = detections[detections[:, -1] == c] - nms_in = detections_class.cpu().numpy() - nms_out_index = nms( - nms_in[:, :4], nms_thre, score=nms_in[:, 4]*nms_in[:, 5]) - detections_class = detections_class[nms_out_index] - if output[i] is None: - output[i] = detections_class - else: - output[i] = torch.cat((output[i], detections_class)) - - return output - -def preprocess_mask(mask, imgsize, info_img): - h, w, nh, nw, dx, dy = info_img - sized = np.ones((imgsize, imgsize, 1), dtype=np.uint8) * 127 - mask = cv2.resize(mask, (nw, nh)) - sized[dy:dy+nh, dx:dx+nw, 0] = mask - - return sized - -def preprocess(img, imgsize, jitter, random_placing=False): - """ - Image preprocess for yolo input - Pad the shorter side of the image and resize to (imgsize, imgsize) - Args: - img (numpy.ndarray): input image whose shape is :math:`(H, W, C)`. - Values range from 0 to 255. - imgsize (int): target image size after pre-processing - jitter (float): amplitude of jitter for resizing - random_placing (bool): if True, place the image at random position - - Returns: - img (numpy.ndarray): input image whose shape is :math:`(C, imgsize, imgsize)`. - Values range from 0 to 1. - info_img : tuple of h, w, nh, nw, dx, dy. - h, w (int): original shape of the image - nh, nw (int): shape of the resized image without padding - dx, dy (int): pad size - """ - h, w, _ = img.shape - img = img[:, :, ::-1] - assert img is not None - - if jitter > 0: - # add jitter - dw = jitter * w - dh = jitter * h - new_ar = (w + np.random.uniform(low=-dw, high=dw))\ - / (h + np.random.uniform(low=-dh, high=dh)) - else: - new_ar = w / h - - if new_ar < 1: - nh = imgsize - nw = nh * new_ar - else: - nw = imgsize - nh = nw / new_ar - nw, nh = int(max(nw,1)), int(max(nh,1)) - - if random_placing: - dx = int(np.random.uniform(imgsize - nw)) - dy = int(np.random.uniform(imgsize - nh)) - else: - dx = (imgsize - nw) // 2 - dy = (imgsize - nh) // 2 - - img = cv2.resize(img, (nw, nh)) - sized = np.ones((imgsize, imgsize, 3), dtype=np.uint8) * 127 - sized[dy:dy+nh, dx:dx+nw, :] = img - - info_img = (h, w, nh, nw, dx, dy) - return sized, info_img \ No newline at end of file diff --git a/openpmcvl/granular/process/train_clip_align.py b/openpmcvl/granular/process/train_clip_align.py deleted file mode 100644 index 7c9ae98..0000000 --- a/openpmcvl/granular/process/train_clip_align.py +++ /dev/null @@ -1,267 +0,0 @@ -""" -To finetune PMC-CLIP-Beta on MediCAT (sentence-wise alignment -""" - -import torch.nn as nn -from builtins import print -import os -import argparse -import numpy as np -import torch -from torch.utils.data import DataLoader -import random -import torch.optim as optim -import math -from pathlib import Path -import torch.backends.cudnn as cudnn -import json -import shutil - -from dataset_code.dataset_from_wx import SentenceWise_Align_Dataset, sentencewise_align_collate, Bidirection_SentenceWise_Align_Dataset, bidirection_sentencewise_align_collate -from dataset_code.dataset_exsclaim import SentenceWise_Align_EM_Dataset -from train_engine import train_sentencewise_align, train_sentencewise_align_bidirection - -def str2bool(v): - return v.lower() in ('true') - -def set_seed(config): - seed = config.seed - torch.manual_seed(seed) - np.random.seed(seed) - random.seed(seed) - cudnn.benchmark = True - # new seed - torch.cuda.manual_seed(seed) - torch.cuda.manual_seed_all(seed) - cudnn.benchmark = False - cudnn.deterministic = True - -def contain(name, key_words_list): - for keys in key_words_list: - if keys in name: - return True - return False - -def get_train_args_parser(): - parser = argparse.ArgumentParser() - - # ----------------- Training Control - parser.add_argument('--platform', type=str, default='DBCLOUD') - parser.add_argument('--output_dir', type=str, default='Log/Detection/Pretrained-ResNet', - help='File path for model, visualization, log') # ! - - parser.add_argument('--checkpoint', default=None, help='checkpoint to load') - parser.add_argument('--resume_train', type=str2bool, default='False', - help='Load checkpoint and resume the interrupted training') - - parser.add_argument('--visual_encoder_freeze', type=str2bool, default='False', - help='Keep detection network frozen') - parser.add_argument('--text_encoder_freeze', type=str2bool, default='False', - help='Keep pretrained ResNet frozen') - - parser.add_argument('--seed', type=int, default=42) - parser.add_argument('--gpu', type=str, default='0') - parser.add_argument('--cp_interval', default=10, type=int) - - # ----------------- Learning Rate, Loss and Regularizations, ... - parser.add_argument('--epoch_num', type=int, default=1000) - parser.add_argument('--warmup', type=int, default=0) - parser.add_argument('--lr', type=float, default=3e-4, help='initial learning rate') - parser.add_argument('--weight_decay', default=0.0, type=float) - - parser.add_argument('--match_cost_class', default=1, type=float, - help="Class coefficient in the matching cost") - parser.add_argument('--match_cost_bbox', default=5, type=float, - help="L1 box coefficient in the matching cost") - parser.add_argument('--match_cost_giou', default=2, type=float, - help="giou box coefficient in the matching cost") - parser.add_argument('--match_cost_align', default=0.0, type=float, - help="text align coefficient in the matching cost") - parser.add_argument('--match_cost_side', default=0.0, type=float, - help="text align coefficient in the matching cost") - - parser.add_argument('--class_loss_coef', default=1.0, type=float) - parser.add_argument('--bbox_loss_coef', default=5.0, type=float) - parser.add_argument('--giou_loss_coef', default=2.0, type=float) - parser.add_argument('--align_loss_coef', default=0.0, type=float) - parser.add_argument('--side_loss_coef', default=0.0, type=float) - parser.add_argument('--focal_sigma', default=0.0, type=float) - parser.add_argument('--easy_sample_weight', default=0.0, type=float, help='Loss weight for negative samples from other compound figures in the same batch') - - parser.add_argument('--iou_threshold', default=0.75, type=float) - parser.add_argument('--score_threshold', default=0.5, type=float) - parser.add_argument('--similarity_threshold', default=0.5, type=float) - - # ----------------- Model Structure - parser.add_argument('--dec_layers', default=8, type=int, - help="Number of decoding layers in the transformer") - parser.add_argument('--txt_dec_layers', default=4, type=int, - help="Number of decoding layers in the text transformer") - parser.add_argument('--mlp_ratio', default=4, type=int, - help="Intermediate size of the feedforward layers in the transformer blocks") - parser.add_argument('--hidden_dim', default=768, type=int, - help="Size of the embeddings (dimension of the transformer)") - parser.add_argument('--dropout', default=0.0, type=float, - help="Dropout applied in the transformer") - parser.add_argument('--nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--text_nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--num_queries', default=50, type=int, - help="Number of query slots") - - # ----------------- Dataset - parser.add_argument('--task', type=str, default=None, help='det, det2align, tokenwisealign, sentencewisealign, bidirection-sentencewisealign') - parser.add_argument('--aug_params', type=str, default=None) - parser.add_argument('--aug_ratio', type=float, default=0.25) - - parser.add_argument('--dataset', type=str, default='medicat', help='exsclaim') - parser.add_argument('--medicat_ratio', type=float, default=1.0) - parser.add_argument('--exsclaim_ratio', type=float, default=1.0) - - parser.add_argument('--normalization', type=str2bool, default=False) - parser.add_argument('--input_size', type=int, default=224) - parser.add_argument('--trainset_size', type=float, default=1.0) - parser.add_argument('--batch_size', type=int, default=16) - parser.add_argument('--val_batch_size', type=int, default=32) - - parser.add_argument('--num_worker', type=int, default=4) - - config = parser.parse_args() - - return config - -def main(config): - torch.multiprocessing.set_sharing_strategy('file_system') - os.environ["TOKENIZERS_PARALLELISM"] = "false" - - set_seed(config) - - from model_clip_align import SentenceWise_Align_Former, SentenceWise_Align_Former_Softmax, SentenceWise_Align_Former_Bidirection - model_code = 'model_from_wx.py' - - if config.task == "sentencewisealign": - model = SentenceWise_Align_Former() - elif config.task == "sentencewisealign_softmax": - model = SentenceWise_Align_Former_Softmax() - elif config.task == "bidirection-sentencewisealign": - model = SentenceWise_Align_Former_Bidirection() - - # os.environ['CUDA_VISIBLE_DEVICES'] = config.gpu - device = torch.device('cuda') - model = nn.DataParallel(model) - model.to(device) - - optimizer = optim.AdamW(model.parameters(), lr=config.lr, weight_decay=config.weight_decay) - def lambda_rule(epoch): - return 0.5 * (1 + math.cos(math.pi * (epoch) / (config.epoch_num))) - def warmup_lambda_rule(epoch): - if epoch < config.warmup: - return (epoch+1) / config.warmup - else: - return 0.5 * (1 + math.cos(math.pi * (epoch+1-config.warmup) / (config.epoch_num-config.warmup))) - if config.warmup > 0: - lr_sch = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=warmup_lambda_rule) - else: - lr_sch = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_rule) # cosine annealing - - start_epoch = 1 - best_val_acc = 0.0 - # Load - if config.resume_train: - checkpoint = torch.load(config.checkpoint, map_location='cpu') - model.load_state_dict(checkpoint['model_state_dict']) - optimizer.load_state_dict(checkpoint['optimizer_state_dict']) - lr_sch.load_state_dict(checkpoint['lr_sch_state_dict']) - best_val_acc = checkpoint['val_acc'] if 'val_acc' in checkpoint else 0.0 - start_epoch = int(checkpoint['epoch']) + 1 - print('Resume Training from %s, Epoch %d' % (config.checkpoint, start_epoch)) - elif config.checkpoint: - checkpoint = torch.load(config.checkpoint, map_location='cpu') - model.load_state_dict(checkpoint['model_state_dict']) - print('Load checkpoint from %s, Epoch %d' % (config.checkpoint, int(checkpoint['epoch']))) - - # 如果固定detection网络 - if config.visual_encoder_freeze: - print('visual_encoder_freeze') - for name, param in model.named_parameters(): - if contain(name, ['img_encoder']): - param.requires_grad = False - # 如果固定detection中的ResNet(一般当ResNet是Pretrained) - if config.text_encoder_freeze: - print('text_encoder_freeze') - for name, param in model.named_parameters(): - if contain(name, ['text_encoder']): - param.requires_grad = False - - print('Output file locate at : %s' % os.path.join(config.output_dir)) - - if config.platform == "DBCLOUD": - train_file = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_train.jsonl' - exsclaim_file = '/remote-home/zihengzhao/CompoundFigure/exsclaim-data/data.jsonl' - val_file = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_test.jsonl' - train_img_root = test_img_root = '/remote-home/share/medical/public/MedICaT/compound_figures/subfigures' - exsclaim_image_root = '/remote-home/share/medical/public/MedICaT/exsclaim_extracted/subfigures' - elif config.platform == "DB": - exsclaim_file = '/GPFS/data/zihengzhao/CompoundFigure/exsclaim_extracted/train.jsonl' - train_file = '/GPFS/data/zihengzhao/CompoundFigure/MedICaT/compound_figures/reid_train.jsonl' - val_file = '/GPFS/data/zihengzhao/CompoundFigure/MedICaT/compound_figures/reid_test.jsonl' - train_img_root = test_img_root = '/GPFS/data/zihengzhao/CompoundFigure/MedICaT/compound_figures/subfigures' - exsclaim_image_root = '/GPFS/data/zihengzhao/CompoundFigure/exsclaim_extracted/subfigures' - - Path(os.path.join(config.output_dir)).mkdir(parents=True, exist_ok=True) - - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - shutil.copy(config.aug_params, os.path.join(config.output_dir, config.aug_params.split('/')[-1])) - else: - aug_param = None - - if config.task in ["sentencewisealign", "sentencewisealign_softmax"]: - if config.dataset == 'medicat': - TrainSet = SentenceWise_Align_Dataset(aug_param, train_file, train_img_root, config.normalization, trainset_size_ratio=config.trainset_size, input_size=config.input_size, aug_ratio=config.aug_ratio) - else: - # aug_params, exsclaim_filepath, medicat_filepath, exsclaim_image_root, medicat_image_root, normalization=False, medicat_ratio=1.0, exsclaim_ratio=1.0, input_size=512, mode='Test', aug_ratio=0.25 - TrainSet = SentenceWise_Align_EM_Dataset(aug_param, exsclaim_filepath=exsclaim_file, medicat_filepath=train_file, exsclaim_image_root=exsclaim_image_root, medicat_image_root=train_img_root, normalization=config.normalization, medicat_ratio=config.medicat_ratio, exsclaim_ratio=config.exsclaim_ratio, input_size=config.input_size, aug_ratio=config.aug_ratio) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=True, num_workers=config.num_worker, collate_fn=sentencewise_align_collate) - ValSet = SentenceWise_Align_Dataset(None, val_file, test_img_root, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=config.num_worker, collate_fn=sentencewise_align_collate) - elif config.task == "bidirection-sentencewisealign": - TrainSet = Bidirection_SentenceWise_Align_Dataset(aug_param, train_file, train_img_root, config.normalization, trainset_size_ratio=config.trainset_size, input_size=config.input_size) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=True, num_workers=config.num_worker, collate_fn=bidirection_sentencewise_align_collate) - ValSet = Bidirection_SentenceWise_Align_Dataset(None, val_file, test_img_root, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=config.num_worker, collate_fn=bidirection_sentencewise_align_collate) - - # code - shutil.copy('train_clip_align.py', os.path.join(config.output_dir, 'train_clip_align.py')) - shutil.copy('inference_clip_align.py', os.path.join(config.output_dir, 'inference_clip_align.py')) - shutil.copy(os.path.join('dataset_code', 'dataset_clip_align.py'), os.path.join(config.output_dir, 'dataset_clip_align.py')) - shutil.copy(model_code, os.path.join(config.output_dir, model_code)) - shutil.copy('transformer_module.py', os.path.join(config.output_dir, 'transformer_module.py')) - shutil.copy('detect_metric.py', os.path.join(config.output_dir, 'detect_metric.py')) - shutil.copy('align_metric.py', os.path.join(config.output_dir, 'align_metric.py')) - shutil.copy('augmentation_tools.py', os.path.join(config.output_dir, 'augmentation_tools.py')) - - if config.task in ["sentencewisealign", "sentencewisealign_softmax"]: - train_sentencewise_align(model=model, - optimizer=optimizer, - lr_sch=lr_sch, - config=config, - start_epoch=start_epoch, - best_val_acc=best_val_acc, - trainLoader=TrainLoader, - valLoader=ValLoader) - elif config.task == "bidirection-sentencewisealign": - train_sentencewise_align_bidirection(model=model, - optimizer=optimizer, - lr_sch=lr_sch, - config=config, - start_epoch=start_epoch, - best_val_acc=best_val_acc, - trainLoader=TrainLoader, - valLoader=ValLoader) - -if __name__ == "__main__": - config = get_train_args_parser() - main(config) \ No newline at end of file diff --git a/openpmcvl/granular/process/train_detect_align.py b/openpmcvl/granular/process/train_detect_align.py deleted file mode 100644 index c4dee85..0000000 --- a/openpmcvl/granular/process/train_detect_align.py +++ /dev/null @@ -1,389 +0,0 @@ -import torch.nn as nn -from builtins import print -import os -import argparse -import numpy as np -import torch -from torch.utils.data import DataLoader -import random -import torch.optim as optim -import math -from pathlib import Path -import torch.backends.cudnn as cudnn -import json -import shutil - -from dataset_code.simcfs_reimp import SimCFS_Dataset -from dataset_code.dataset_det_align import FigCap_Dataset, figcap_collate, Fig_Dataset, fig_collate -from dataset_code.dataset_ours_syn import Synthetic_Dataset -from dataset_code.dataset_reallayout_syn import Real_Layout_Synthetic_Dataset -from train_engine import train_det_and_align - -def str2bool(v): - return v.lower() in ('true') - -def set_seed(config): - seed = config.seed - torch.manual_seed(seed) - np.random.seed(seed) - random.seed(seed) - cudnn.benchmark = True - # new seed - torch.cuda.manual_seed(seed) - torch.cuda.manual_seed_all(seed) - cudnn.benchmark = False - cudnn.deterministic = True - -def contain(name, key_words_list): - for keys in key_words_list: - if keys in name: - return True - return False - -def get_train_args_parser(): - parser = argparse.ArgumentParser() - - # ----------------- Training Control - parser.add_argument('--output_dir', type=str, default='Log/Detection/Pretrained-ResNet', - help='File path for model, visualization, log') # ! - - parser.add_argument('--checkpoint', default=None, help='checkpoint to load') - parser.add_argument('--resume_train', type=str2bool, default='False', - help='Load checkpoint and resume the interrupted training') - - parser.add_argument('--model', type=str, default='baseline', help='baseline / dot_product / bidirection_dec') - - parser.add_argument('--resnet', type=int, default=34) - parser.add_argument('--pretrained_resnet', type=str2bool, default='True') - parser.add_argument('--pretrained_bert', type=str, default='PubMed_BERT') - - parser.add_argument('--detr_froze', type=str2bool, default='False', - help='Keep detection network frozen') - parser.add_argument('--resnet_froze', type=str2bool, default='False', - help='Keep pretrained ResNet frozen') - parser.add_argument('--alignment_froze', type=str2bool, default='True', - help='Keep align network frozen') - parser.add_argument('--bert_froze_depth', type=int, default=12, - help='Keep pretrained bert frozen before this depth of layers, default 12, i.e. froze whole bert') - - parser.add_argument('--gpu', type=str, default='0') - parser.add_argument('--seed', type=int, default=42) - - parser.add_argument('--cp_interval', default=10, type=int) - - # ----------------- Learning Rate, Loss and Regularizations, ... - parser.add_argument('--epoch_num', type=int, default=1000) - parser.add_argument('--warmup', type=int, default=0) - parser.add_argument('--lr', type=float, default=3e-4, help='initial learning rate') - parser.add_argument('--weight_decay', default=0.0, type=float) - - parser.add_argument('--match_cost_class', default=1, type=float, - help="Class coefficient in the matching cost") - parser.add_argument('--match_cost_bbox', default=5, type=float, - help="L1 box coefficient in the matching cost") - parser.add_argument('--match_cost_giou', default=2, type=float, - help="giou box coefficient in the matching cost") - parser.add_argument('--match_cost_align', default=0.0, type=float, - help="text align coefficient in the matching cost") - parser.add_argument('--match_cost_side', default=0.0, type=float, - help="text align coefficient in the matching cost") - - parser.add_argument('--class_loss_coef', default=1.0, type=float) - parser.add_argument('--bbox_loss_coef', default=5.0, type=float) - parser.add_argument('--giou_loss_coef', default=2.0, type=float) - parser.add_argument('--align_loss_coef', default=0.0, type=float) - parser.add_argument('--side_loss_coef', default=0.0, type=float) - parser.add_argument('--focal_sigma', default=0.0, type=float) - - parser.add_argument('--iou_threshold', default=0.75, type=float) - parser.add_argument('--score_threshold', default=0.0, type=float) - parser.add_argument('--similarity_threshold', default=0.5, type=float) - - # ----------------- Model Structure - parser.add_argument('--enc_layers', default=4, type=int, - help="Number of encoding layers in the transformer") - parser.add_argument('--dec_layers', default=4, type=int, - help="Number of decoding layers in the transformer") - parser.add_argument('--txt_dec_layers', default=4, type=int, - help="Number of decoding layers in the text transformer") - parser.add_argument('--mlp_ratio', default=4, type=int, - help="Intermediate size of the feedforward layers in the transformer blocks") - parser.add_argument('--hidden_dim', default=256, type=int, - help="Size of the embeddings (dimension of the transformer)") - parser.add_argument('--dropout', default=0.0, type=float, - help="Dropout applied in the transformer") - parser.add_argument('--nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--text_nheads', default=8, type=int, - help="Number of attention heads inside the transformer's attentions") - parser.add_argument('--num_queries', default=50, type=int, - help="Number of query slots") - - # ----------------- Dataset - parser.add_argument('--benchmark', type=str, default='medicat', help='imageclef / medicat2downloads') - parser.add_argument('--dataset', type=str, default='None', help = "ours_syn, real_layout, simcfs, real_det, real_align") - parser.add_argument('--synthetic_params', type=str, default='no_gap_minus.jsonl') - parser.add_argument('--aug_params', type=str, default=None) - - parser.add_argument('--normalization', type=str2bool, default=False) - parser.add_argument('--input_size', type=int, default=512) - parser.add_argument('--trainset_size', type=float, default=1.0) - parser.add_argument('--batch_size', type=int, default=16) - parser.add_argument('--val_batch_size', type=int, default=32) - - config = parser.parse_args() - - return config - -def main(config): - torch.multiprocessing.set_sharing_strategy('file_system') - set_seed(config) - - # Choose the right model - if config.model == 'baseline': - from model_det_align import FigCap_Former - model_code = 'model_det_align.py' - else: - print('Unsupported Model Type %s' % config.model) - exit() - - # Enable the alignment part or only the DETR - if config.dataset in ["ours_syn", "real_layout", "simcfs", "real_det"]: - alignment_network = False - elif config.dataset == "real_align": - alignment_network = True - else: - print('Unregconized Dataset Type % s' % config.dataset) - exit() - - # Set the model - model = FigCap_Former(num_query=config.num_queries, - num_encoder_layers=config.enc_layers, - num_decoder_layers=config.dec_layers, - feature_dim=config.hidden_dim, - atten_head_num=config.nheads, - mlp_ratio=config.mlp_ratio, - dropout=config.dropout, - activation='relu', - alignment_network = alignment_network, - bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert, - num_text_decoder_layers=config.txt_dec_layers, - text_atten_head_num=config.text_nheads, - text_mlp_ratio=config.mlp_ratio, - text_dropout=config.dropout, - text_activation='relu', - resnet = config.resnet, - resnet_pretrained=config.pretrained_resnet) - - # Initial status if no train resumed - start_epoch = 1 - best_val_f1 = 0.0 - best_val_mAP = 0.0 - # Load - if config.resume_train: - checkpoint = torch.load(config.checkpoint, map_location='cpu') - model.load_state_dict(checkpoint['model_state_dict']) - optimizer.load_state_dict(checkpoint['optimizer_state_dict']) - lr_sch.load_state_dict(checkpoint['lr_sch_state_dict']) - best_val_f1 = checkpoint['val_f1'] if 'val_f1' in checkpoint else 0.0 - best_val_mAP = checkpoint['val_mAP'] if 'val_mAP' in checkpoint else 0.0 - start_epoch = int(checkpoint['epoch']) + 1 - print('Resume Training from %s, Epoch %d, Val mAP:%.3f, Val F1:%.3f' % (config.checkpoint, start_epoch, best_val_mAP, best_val_f1)) - elif config.checkpoint: - checkpoint = torch.load(config.checkpoint, map_location='cpu') - if config.dataset in ["ours_syn", "real_layout", "simcfs", "real_det"]: - state_dict = checkpoint['model_state_dict'] - model_dict = model.state_dict() - new_state_dict = {} - for k, v in state_dict.items() : - if k[:6] == 'module': - new_state_dict[k[7:]] = v - else: - new_state_dict[k] = v - model_checkpoint = {k: v for k, v in new_state_dict.items() if not contain(k, ['text_embed', 'text_channel_squeeze', 'text_decoder', 'simi_head', 'img_proj'])} - model_dict.update(model_checkpoint) - model.load_state_dict(model_dict) - elif config.dataset == "real_align": - state_dict = checkpoint['model_state_dict'] - model_dict = model.state_dict() - new_state_dict = {} - for k, v in state_dict.items() : - if k[:6] == 'module': - new_state_dict[k[7:]] = v - else: - new_state_dict[k] = v - model.load_state_dict(new_state_dict) - print('Load checkpoint from %s, Epoch %d, Val mAP:%.3f, Val F1:%.3f' % (config.checkpoint, int(checkpoint['epoch']), checkpoint['val_mAP'], checkpoint['val_f1'])) - - # Parallel model to CUDA - if config.dataset in ["ours_syn", "real_layout", "simcfs", "real_det"]: - os.environ['CUDA_VISIBLE_DEVICES'] = config.gpu - device = torch.device('cuda') - model = nn.DataParallel(model) - model.to(device) - elif config.dataset == "real_align": - torch.cuda.set_device(config.gpu) - model.cuda() - - # 根据训练要求,冻结模型部分参数 - # 目前synthetic只支持detection,所以synthetic默认是det mode,需要把alignment部分froze住 - if config.dataset in ["ours_syn", "real_layout", "simcfs", "real_det"]: - config.alignment_froze = True - config.bert_froze_depth = 12 - # align_mode的数据集是固定的(网络不一定 - if config.dataset == 'real_align': - assert config.alignment_froze == False - # 如果固定detection网络 - if config.detr_froze: - print('Detection Network Frozen') - for name, param in model.named_parameters(): - if contain(name, ['query', 'img_embed', 'img_channel_squeeze', 'pos_embed', 'img_encoder', 'img_decoder', 'box_head', 'det_class_head']): - param.requires_grad = False - # 如果固定detection中的ResNet(一般当ResNet是Pretrained) - elif config.resnet_froze: - print('ResNet Frozen') - for name, param in model.named_parameters(): - if contain(name, ['img_embed']): - param.requires_grad = False - # 如果固定alignment网络 - if config.alignment_froze: - print('Alignment Frozen') - for name, param in model.named_parameters(): - if contain(name, ['text_embed', 'text_channel_squeeze', 'text_decoder', 'simi_head', 'img_proj']): - param.requires_grad = False - # 如果固定Bert前半部分 - elif config.bert_froze_depth > 0: - print('Bert Frozen %d Layers' % config.bert_froze_depth) - for name, param in model.named_parameters(): - if contain(name, ['text_embed.embeddings'] + ['text_embed.encoder.layer.'+str(i) for i in range(config.bert_froze_depth)]): - param.requires_grad = False - - # Set optimizer and lr_schedulor - optimizer = optim.AdamW(model.parameters(), lr=config.lr, weight_decay=config.weight_decay) - def lambda_rule(epoch): - return 0.5 * (1 + math.cos(math.pi * (epoch) / (config.epoch_num))) - def warmup_lambda_rule(epoch): - if epoch < config.warmup: - return (epoch+1) / config.warmup - else: - return 0.5 * (1 + math.cos(math.pi * (epoch+1-config.warmup) / (config.epoch_num-config.warmup))) - if config.warmup > 0: - lr_sch = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=warmup_lambda_rule) - else: - lr_sch = optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda_rule) # cosine annealing - - # Set benckmark - if config.benchmark == 'medicat': - train_file = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_train.jsonl' - val_file = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_test.jsonl' # '/remote-home/share/medical/public/MedICaT/subfig_subcap_val.jsonl' - train_img_root = test_img_root = '/remote-home/share/medical/public/MedICaT/compound_figures/figures' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert+'/vocab.txt' - elif config.benchmark == 'imageclef': - train_file = '/remote-home/share/medical/public/ImageCLEF2016/medtask/train_comfigs.jsonl' - val_file = '/remote-home/share/medical/public/ImageCLEF2016/medtask/test_comfigs.jsonl' # '/remote-home/share/medical/public/MedICaT/subfig_subcap_val.jsonl' - train_img_root = test_img_root = '/remote-home/share/medical/public/ImageCLEF2016/medtask/new_id_comfigs' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert+'/vocab.txt' - elif config.benchmark == 'medicat2downloads': - train_file = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_train_and_test.jsonl' - val_file = '/remote-home/zihengzhao/CompoundFigure/Dataset/(300 samples)caption_T060_filtered_top4.jsonl' # '/remote-home/share/medical/public/MedICaT/subfig_subcap_val.jsonl' - train_img_root = '/remote-home/share/medical/public/MedICaT/compound_figures/figures' - test_img_root = '/remote-home/zihengzhao/CompoundFigure/Dataset/(300 samples)caption_T060_filtered_top4' - vocab_file = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/'+config.pretrained_bert+'/vocab.txt' - - # Set dataset and loader - if config.dataset == 'ours_syn': - with open(config.synthetic_params) as f: - param = json.load(f) - shutil.copy(config.synthetic_params, os.path.join(config.output_dir, config.synthetic_params.split('/')[-1])) - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - shutil.copy(config.aug_params, os.path.join(config.output_dir, config.aug_params.split('/')[-1])) - else: - aug_param = None - dataset_code = 'dataset_ours_syn.py' - TrainSet = Synthetic_Dataset(train_file, train_img_root, param, aug_param, trainset_size_ratio=config.trainset_size, input_size=config.input_size) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - ValSet = Fig_Dataset(None, val_file, test_img_root, vocab_file, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - elif config.dataset == 'real_layout': - with open(config.synthetic_params) as f: - param = json.load(f) - shutil.copy(config.synthetic_params, os.path.join(config.output_dir, config.synthetic_params.split('/')[-1].split('/')[-1])) - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - shutil.copy(config.aug_params, os.path.join(config.output_dir, config.aug_params.split('/')[-1])) - else: - aug_param = None - dataset_code = 'dataset_reallayout_syn.py' - TrainSet = Real_Layout_Synthetic_Dataset(train_file, train_img_root, param, aug_param, trainset_size_ratio=config.trainset_size, input_size=config.input_size) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - ValSet = Fig_Dataset(None, val_file, test_img_root, vocab_file, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - elif config.dataset == 'simcfs': - with open(config.synthetic_params) as f: - param = json.load(f) - shutil.copy(config.synthetic_params, os.path.join(config.output_dir, config.synthetic_params.split('/')[-1].split('/')[-1])) - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - shutil.copy(config.aug_params, os.path.join(config.output_dir, config.aug_params.split('/')[-1])) - else: - aug_param = None - dataset_code = 'simcfs_reimp.py' - TrainSet = SimCFS_Dataset(train_file, train_img_root, param, aug_param, trainset_size_ratio=config.trainset_size, input_size=config.input_size) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - ValSet = Fig_Dataset(None, val_file, test_img_root, vocab_file, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - elif config.dataset == 'real_det': - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - shutil.copy(config.aug_params, os.path.join(config.output_dir, config.aug_params.split('/')[-1])) - else: - aug_param = None - dataset_code = 'dataset.py' - TrainSet = Fig_Dataset(aug_param, train_file, train_img_root, vocab_file, config.normalization, trainset_size_ratio=config.trainset_size, input_size=config.input_size) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=True, num_workers=16, collate_fn=fig_collate) - ValSet = Fig_Dataset(None, val_file, test_img_root, vocab_file, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=16, collate_fn=fig_collate) - elif config.dataset == 'real_align': - if config.aug_params: - with open(config.aug_params) as f: - aug_param = json.load(f) - shutil.copy(config.aug_params, os.path.join(config.output_dir, config.aug_params.split('/')[-1])) - else: - aug_param = None - dataset_code = 'dataset.py' - TrainSet = FigCap_Dataset(aug_param, train_file, train_img_root, vocab_file, config.normalization, trainset_size_ratio=config.trainset_size, input_size=config.input_size) - TrainLoader = DataLoader(TrainSet, batch_size=config.batch_size, shuffle=True, num_workers=16, collate_fn=figcap_collate) - ValSet = FigCap_Dataset(None, val_file, test_img_root, vocab_file, config.normalization, input_size=config.input_size) - ValLoader = DataLoader(ValSet, batch_size=config.val_batch_size, shuffle=False, num_workers=16, collate_fn=figcap_collate) - - # Log location - print('Output file locate at : %s' % os.path.join(config.output_dir)) - Path(os.path.join(config.output_dir)).mkdir(parents=True, exist_ok=True) - # Backup code for reproducibility - shutil.copy('train_detect_align.py', os.path.join(config.output_dir, 'train_detect_align.py')) - shutil.copy('inference_detect_align.py', os.path.join(config.output_dir, 'inference_detect_align.py')) - shutil.copy(os.path.join('dataset_code', dataset_code), os.path.join(config.output_dir, dataset_code)) - shutil.copy(model_code, os.path.join(config.output_dir, model_code)) - shutil.copy('transformer_module.py', os.path.join(config.output_dir, 'transformer_module.py')) - shutil.copy('detect_metric.py', os.path.join(config.output_dir, 'detect_metric.py')) - shutil.copy('align_metric.py', os.path.join(config.output_dir, 'align_metric.py')) - shutil.copy('augmentation_tools.py', os.path.join(config.output_dir, 'augmentation_tools.py')) - - train_det_and_align(model=model, - optimizer=optimizer, - lr_sch=lr_sch, - start_epoch=start_epoch, - best_val_f1=best_val_f1, - best_val_mAP=best_val_mAP, - config=config, - trainSet=TrainSet, trainLoader=TrainLoader, - valSet=ValSet, valLoader=ValLoader) - -if __name__ == "__main__": - config = get_train_args_parser() - main(config) \ No newline at end of file diff --git a/openpmcvl/granular/process/train_engine.py b/openpmcvl/granular/process/train_engine.py deleted file mode 100644 index 07dfd8f..0000000 --- a/openpmcvl/granular/process/train_engine.py +++ /dev/null @@ -1,702 +0,0 @@ -""" -Train functions of detection, detection & token-wise alignment(fail), clip-style sentence-wise alignment -""" - -from builtins import print -import os -import torch -import torch.nn.functional as F -from torch.utils.tensorboard import SummaryWriter -from tqdm import tqdm -from einops import repeat -from scipy.optimize import linear_sum_assignment -from datetime import datetime -from datetime import timedelta -from datetime import timezone -import time - -from align_metric import box_cxcywh_to_xyxy, generalized_box_iou, pair_wise_bce, SubfigureSubcaptionAlignmentMetric -from detect_metric import calculate_mAP_voc12, side_loss - -def train_sentencewise_align(model=None, optimizer=None, lr_sch=None, config=None, start_epoch=0, best_val_acc=0.0, trainLoader=None, trainSet=None, valLoader=None, valSet=None): - """ - 基于PMC-CLIP-BETA在Alignment数据上训练subfig和subcap对齐(在train时只考虑img2text - - Args: - model : DETR + BERT + AlignmentDecoder - config : args parser - start_epoch : start from a checkpoint or from 0 - best_val_acc : load from a checkpoint or 0.0 when train from scratch - ...... - """ - # log file - f_path = os.path.join(config.output_dir, 'log.txt') - with open(f_path, 'a') as f: - SHA_TZ = timezone(timedelta(hours=8), - name='Asia/Shanghai') - utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) - beijing_now = utc_now.astimezone(SHA_TZ) # 北京时间 - configDict = config.__dict__ - f.write('%d--%d--%d--%d--%d Configs :\n' % (beijing_now.year, beijing_now.month, beijing_now.day, beijing_now.hour, beijing_now.minute)) - for eachArg, value in configDict.items(): - f.write(eachArg + ' : ' + str(value) + '\n') - f.write('\n') - f.close() - log_path = os.path.join(config.output_dir, 'log') - writer = SummaryWriter(log_path) - # model checkpoint - val_align_best_model_path = os.path.join(config.output_dir, 'best_align.pth') - cp_model_path = os.path.join(config.output_dir, 'checkpoint.pth') - # start train from here - for epoch in range(start_epoch, config.epoch_num+1): - # train one epoch - model.train() - train_loss_align = 0.0 - hit = 0 - noaug_hit = 0 - random_guess_acc_ls = [] - for batch in tqdm(trainLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - subcaptions = batch['subcaptions'].cuda() # (bs, subcap_num, 77) - location = batch['location'].cuda() # (bs, 4) - gt = batch['subcaption_gts'].cuda() # (bs, subcap_num) - noaug_subcap_idx = batch['noaug_subcap_idx'] # [bs] - nopad_subcap_idx = batch['nopad_subcap_idx'] # [bs] - # forward pass - output_sim = model(image, subcaptions, location) # (bs, subcap_num) - batch_loss = F.binary_cross_entropy(torch.clamp(output_sim, min=1e-10, max=1-1e-10), gt) - train_loss_align += batch_loss.detach().item() - optimizer.zero_grad() - batch_loss.backward() - optimizer.step() - # train set的对齐命中率 - for i in range(image.shape[0]): - tmp_sim = output_sim[i, :noaug_subcap_idx[i]] - tmp_gt_sim = gt[i, :noaug_subcap_idx[i]] - if torch.argmax(tmp_sim) == torch.argmax(tmp_gt_sim): - noaug_hit += 1 - for i in range(image.shape[0]): - tmp_sim = output_sim[i, :nopad_subcap_idx[i]] - tmp_gt_sim = gt[i, :nopad_subcap_idx[i]] - if torch.argmax(tmp_sim) == torch.argmax(tmp_gt_sim): - hit += 1 - # 对每个sample随机猜的命中率 - for noaug_subcap_num in noaug_subcap_idx: - random_guess_acc_ls.append(1/noaug_subcap_num) - lr_sch.step() - noaug_train_acc = noaug_hit/len(trainSet) - train_acc = hit/len(trainSet) - random_guess_acc = sum(random_guess_acc_ls)/len(random_guess_acc_ls) - print('train random guess acc:', random_guess_acc) - train_loss_align /= len(trainLoader) - - # validate one epoch - with torch.no_grad(): - model.eval() - hit = 0 - noaug_hit = 0 - random_guess_acc_ls = [] - for batch in tqdm(valLoader): - # forward pass - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - subcaptions = batch['subcaptions'].cuda() # (bs, subcap_num, 77) - location = batch['location'].cuda() # (bs, 4) - gt = batch['subcaption_gts'].cuda() # (bs, subcap_num) - noaug_subcap_idx = batch['noaug_subcap_idx'] # [bs] - nopad_subcap_idx = batch['nopad_subcap_idx'] # [bs] - output_sim = model(image, subcaptions, location) # (bs, subcap_num) - # val set的对齐命中率 - for i in range(image.shape[0]): - tmp_sim = output_sim[i, :noaug_subcap_idx[i]] - tmp_gt_sim = gt[i, :noaug_subcap_idx[i]] - if torch.argmax(tmp_sim) == torch.argmax(tmp_gt_sim): - noaug_hit += 1 - for i in range(image.shape[0]): - tmp_sim = output_sim[i, :nopad_subcap_idx[i]] - tmp_gt_sim = gt[i, :nopad_subcap_idx[i]] - if torch.argmax(tmp_sim) == torch.argmax(tmp_gt_sim): - hit += 1 - # 对每个sample随机猜的命中率 - for noaug_subcap_num in noaug_subcap_idx: - random_guess_acc_ls.append(1/noaug_subcap_num) - noaug_val_acc = noaug_hit/len(valSet) - val_acc = hit/len(valSet) - random_guess_acc = sum(random_guess_acc_ls)/len(random_guess_acc_ls) - print('val random guess acc:', random_guess_acc) - - # record and save - if noaug_val_acc > best_val_acc: - best_val_acc = noaug_val_acc - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - 'val_acc': noaug_val_acc, - 'train_acc': noaug_train_acc, - 'train_loss_align': train_loss_align, - }, val_align_best_model_path) - - if epoch % config.cp_interval == 0: - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - 'val_acc': noaug_val_acc, - 'train_acc': noaug_train_acc, - 'train_loss_align': train_loss_align, - }, cp_model_path) - - writer.add_scalar('train/noaug_train_acc', noaug_train_acc, epoch) - writer.add_scalar('train/train_loss_align', train_loss_align, epoch) - writer.add_scalar('val/noaug_val_acc', noaug_val_acc, epoch) - writer.add_scalar('train/train_acc', train_acc, epoch) - writer.add_scalar('val/val_acc', val_acc, epoch) - - out_str = "Epoch:%d Learning Rate:%.4e\n" \ - "trn-aln:%.4f trn_acc:%.4f noaug_trn_acc:%.4f val_acc:%.4f noaug_val_acc:%.4f"% \ - (epoch, optimizer.param_groups[0]['lr'], - train_loss_align, train_acc, noaug_train_acc, val_acc, noaug_val_acc) - - with open(f_path, 'a') as f: - f.write(out_str + '\n\n') - print(out_str) - - out_str = 'Best val_acc:%.2f' % (best_val_acc) - print(out_str) - with open(f_path, 'a') as f: - f.write(out_str ) - - -def train_sentencewise_align_bidirection(model=None, optimizer=None, lr_sch=None, config=None, start_epoch=0, best_val_acc=0.0, trainLoader=None, valLoader=None): - """ - 基于PMC-CLIP-BETA在Alignment数据上训练subfig和subcap对齐(在训练时考虑一个compoundfigure内img2text和text2img - - Args: - model : DETR + BERT + AlignmentDecoder - config : args parser - start_epoch : start from a checkpoint or from 0 - best_val_acc : load from a checkpoint or 0.0 when train from scratch - ...... - """ - # log file - f_path = os.path.join(config.output_dir, 'log.txt') - with open(f_path, 'a') as f: - SHA_TZ = timezone(timedelta(hours=8), - name='Asia/Shanghai') - utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) - beijing_now = utc_now.astimezone(SHA_TZ) # 北京时间 - configDict = config.__dict__ - f.write('%d--%d--%d--%d--%d Configs :\n' % (beijing_now.year, beijing_now.month, beijing_now.day, beijing_now.hour, beijing_now.minute)) - for eachArg, value in configDict.items(): - f.write(eachArg + ' : ' + str(value) + '\n') - f.write('\n') - f.close() - log_path = os.path.join(config.output_dir, 'log') - writer = SummaryWriter(log_path) - # model checkpoint - val_align_best_model_path = os.path.join(config.output_dir, 'best_align.pth') - cp_model_path = os.path.join(config.output_dir, 'checkpoint.pth') - - for epoch in range(start_epoch, config.epoch_num+1): - # train one epoch - model.train() - train_loss_align = 0.0 - img2txt_hit = 0 - img2txt_miss = 0 - # img2txt_random_guess_acc_ls = [] - for batch in tqdm(trainLoader): - # forward pass - padded_img = batch['padded_img'].cuda() # (bs*num_subfig, 3, 224, 224) - padded_cap = batch['padded_cap'].cuda() # (bs*num_sucap, 77) - loc = batch['loc'].cuda() # (bs*num_subfig, 4) - img2cap_gt = batch['img2cap_gt_ls'].cuda() # (bs*num_subfig, bs*num_subcap) - img_split_idx = batch['img_split_idx'] # [bs] - cap_split_idx = batch['cap_split_idx'] # [bs] - similarity_matrix = model(padded_img, padded_cap, loc, img_split_idx, cap_split_idx) # (bs*subfig_num, bs*subcap_num) - - i_cursor = 0 - t_cursor = 0 - batch_i_loss = 0.0 - batch_t_loss = 0.0 - for subfig_num, subcap_num in zip(img_split_idx, cap_split_idx): - pred = similarity_matrix[i_cursor:i_cursor+subfig_num, t_cursor:t_cursor+subcap_num] - gt = img2cap_gt[i_cursor:i_cursor+subfig_num, t_cursor:t_cursor+subcap_num] - i_cursor += subfig_num - t_cursor += subcap_num - for i in range(pred.shape[0]): - batch_i_loss += F.binary_cross_entropy(torch.clamp(pred[i,:], min=1e-10, max=1-1e-10), gt[i,:]) - if torch.argmax(pred[i,:]) == torch.argmax(gt[i,:]): - img2txt_hit += 1 - else: - img2txt_miss += 1 - for i in range(pred.shape[1]): - batch_t_loss += F.binary_cross_entropy(torch.clamp(pred[:,i], min=1e-10, max=1-1e-10), gt[:,i]) - batch_i_loss /= similarity_matrix.shape[0] - batch_t_loss /= similarity_matrix.shape[1] - - batch_loss = (batch_i_loss + batch_t_loss)/2 - train_loss_align += batch_loss.detach().item() - optimizer.zero_grad() - batch_loss.backward() - optimizer.step() - - """ - # 对每个sample随机猜的命中率 - # for gt_matrix in img2cap_gt: # (num_subfig, num_subcap) - # img2txt_random_guess_acc_ls += [1/gt_matrix.shape[1]] * gt_matrix.shape[0] - - # bce loss weight for each subfig-subcap pair in the batch - coef_matrix = torch.ones_like(similarity_matrix) * config.easy_sample_weight - i_cursor = 0 - t_cursor = 0 - for subfig_num, subcap_num in zip(img_split_idx, cap_split_idx): - coef_matrix[i_cursor:i_cursor+subfig_num, t_cursor:t_cursor+subcap_num] = 1.0 - i_cursor += subfig_num - t_cursor += subcap_num - - # bp - assert similarity_matrix.shape == coef_matrix.shape == img2cap_gt.shape - batch_loss_img = 0.0 - batch_loss_cap = 0.0 - bce_matrix = F.binary_cross_entropy(torch.clamp(similarity_matrix, min=1e-10, max=1-1e-10), img2cap_gt, reduce=False) - bce_matrix = torch.mul(bce_matrix, coef_matrix) - for i in range(bce_matrix.shape[0]): # bs*num_subfig - batch_loss_img += torch.mean(bce_matrix[i, :]) - if torch.argmax(similarity_matrix[i, :]) == torch.argmax(img2cap_gt[i, :]): - img2txt_hit += 1 - else: - img2txt_miss += 1 - for i in range(bce_matrix.shape[1]): # bs*num_subcap - batch_loss_cap += torch.mean(bce_matrix[:, i]) - batch_loss_img /= bce_matrix.shape[0] - batch_loss_cap /= bce_matrix.shape[1] - batch_loss = (batch_loss_cap + batch_loss_img)/2 - train_loss_align += batch_loss.detach().item() - optimizer.zero_grad() - batch_loss.backward() - optimizer.step() - """ - - lr_sch.step() - train_acc = img2txt_hit/(img2txt_hit+img2txt_miss) - # random_guess_acc = sum(img2txt_random_guess_acc_ls)/len(img2txt_random_guess_acc_ls) - # print('train random guess acc:', random_guess_acc) - train_loss_align /= len(trainLoader) - - # validate one epoch - with torch.no_grad(): - model.eval() - img2txt_hit = 0 - img2txt_miss = 0 - # img2txt_random_guess_acc_ls = [] - for batch in tqdm(valLoader): - # forward pass - padded_img = batch['padded_img'].cuda() # (bs*num_subfig, 3, 224, 224) - padded_cap = batch['padded_cap'].cuda() # (bs*num_sucap, 77) - loc = batch['loc'].cuda() # (bs*num_subfig, 4) - img2cap_gt = batch['img2cap_gt_ls'].cuda() # (bs*num_subfig, bs*num_subcap) - img_split_idx = batch['img_split_idx'] # [bs] - cap_split_idx = batch['cap_split_idx'] # [bs] - similarity_matrix = model(padded_img, padded_cap, loc, img_split_idx, cap_split_idx) # (bs*subfig_num, bs*subcap_num) - - i_cursor = 0 - t_cursor = 0 - for subfig_num, subcap_num in zip(img_split_idx, cap_split_idx): - pred = similarity_matrix[i_cursor:i_cursor+subfig_num, t_cursor:t_cursor+subcap_num] - gt = img2cap_gt[i_cursor:i_cursor+subfig_num, t_cursor:t_cursor+subcap_num] - i_cursor += subfig_num - t_cursor += subcap_num - for i in range(pred.shape[0]): - if torch.argmax(pred[i,:]) == torch.argmax(gt[i,:]): - img2txt_hit += 1 - else: - img2txt_miss += 1 - - # 对每个sample随机猜的命中率 - # for gt_matrix in img2cap_gt: # (num_subfig, num_subcap) - # img2txt_random_guess_acc_ls += [1/gt_matrix.shape[1]] * gt_matrix.shape[0] - - """ - # evaluate - for i in range(similarity_matrix.shape[0]): # bs*num_subfig - if torch.argmax(similarity_matrix[i, :]) == torch.argmax(img2cap_gt[i, :]): - img2txt_hit += 1 - else: - img2txt_miss += 1 - """ - - val_acc = img2txt_hit/(img2txt_hit+img2txt_miss) - # random_guess_acc = sum(img2txt_random_guess_acc_ls)/len(img2txt_random_guess_acc_ls) - # print('val random guess acc:', random_guess_acc) - - # record and save - if val_acc > best_val_acc: - best_val_acc = val_acc - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - 'val_acc': val_acc, - 'train_acc': train_acc, - 'train_loss_align': train_loss_align, - }, val_align_best_model_path) - - if epoch % config.cp_interval == 0: - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - 'val_acc': val_acc, - 'train_acc': train_acc, - 'train_loss_align': train_loss_align, - }, cp_model_path) - - writer.add_scalar('train/train_acc', train_acc, epoch) - writer.add_scalar('train/train_loss_align', train_loss_align, epoch) - writer.add_scalar('val/val_acc', val_acc, epoch) - - out_str = "Epoch:%d Learning Rate:%.4e\n" \ - "trn-aln:%.4f trn_acc:%.4f val_acc:%.4f"% \ - (epoch, optimizer.param_groups[0]['lr'], - train_loss_align, train_acc, val_acc) - - with open(f_path, 'a') as f: - f.write(out_str + '\n\n') - print(out_str) - - out_str = 'Best val_acc:%.2f' % (best_val_acc) - print(out_str) - with open(f_path, 'a') as f: - f.write(out_str ) - - -def train_det_and_align(model=None, optimizer=None, lr_sch=None, config=None, start_epoch=0, best_val_f1=0.0, best_val_mAP=0.0, trainSet=None, trainLoader=None, valLoader=None): - """ - 耦合DETR和AlignmentNetwork训练(Alignment效果不好 - - Args: - model : DETR + BERT + AlignmentDecoder - config : args parser - start_epoch : start from a checkpoint or from 0 - best_val_f1 & best_val_mAP : load from a checkpoint or 0.0 when train from scratch - ...... - """ - # log file - f_path = os.path.join(config.output_dir, 'log.txt') - with open(f_path, 'a') as f: - SHA_TZ = timezone(timedelta(hours=8), - name='Asia/Shanghai') - utc_now = datetime.utcnow().replace(tzinfo=timezone.utc) - beijing_now = utc_now.astimezone(SHA_TZ) # 北京时间 - configDict = config.__dict__ - f.write('%d--%d--%d--%d--%d Configs :\n' % (beijing_now.year, beijing_now.month, beijing_now.day, beijing_now.hour, beijing_now.minute)) - for eachArg, value in configDict.items(): - f.write(eachArg + ' : ' + str(value) + '\n') - f.write('\n') - f.close() - log_path = os.path.join(config.output_dir, 'log') - writer = SummaryWriter(log_path) - # path to model checkpoint - val_align_best_model_path = os.path.join(config.output_dir, 'best_align.pth') - val_det_best_model_path = os.path.join(config.output_dir, 'best_det.pth') - cp_model_path = os.path.join(config.output_dir, 'checkpoint.pth') - # subfig-subcap align metric - train_subcaption_metric = SubfigureSubcaptionAlignmentMetric(config.iou_threshold) - train_subcaption_metric.reset() - val_subcaption_metric = SubfigureSubcaptionAlignmentMetric(config.iou_threshold) - val_subcaption_metric.reset() - # start train here - for epoch in range(start_epoch, config.epoch_num+1): - # train one epoch - t0 = time.time() - model.train() - train_loss_box = train_loss_iou = train_loss_align = train_loss_class = train_loss_side = 0.0 - train_det_boxes = [] - train_det_labels = [] - train_det_scores = [] - train_true_boxes = [] - train_true_labels = [] - train_true_difficulties = [] - for batch in tqdm(trainLoader): - # forward pass - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_cap_l) - subfigures = batch['subfigs'] # [... [ (subfig_num, 4), (subfig_num, max_cap_l)] ...] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, max_cap_l) - # hungarian match (refer to DETR for details - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - with torch.no_grad(): - best_match = [] # [bs, (subfigure)] - bs_cost_class = F.binary_cross_entropy(cpu_output_det_class, torch.ones_like(cpu_output_det_class), reduce=False) # (bs, query_num, 1) - for i in range(image.shape[0]): - gold_box, gold_align = subfigures[i] - cost_class = repeat(bs_cost_class[i], 'q c -> q (repeat c)', repeat=gold_box.shape[0]) # bce (query_num, subfigure_num) - cost_box = torch.cdist(cpu_output_box[i], gold_box, p=1) # iou + l1 (query_num, sugfigure_num) - cost_iou = -generalized_box_iou(box_cxcywh_to_xyxy(cpu_output_box[i]), box_cxcywh_to_xyxy(gold_box)) - cost_side = side_loss(cpu_output_box[i], gold_box) # side loss (query_num, subfigure_num) - cost_align = pair_wise_bce(cpu_output_sim[i], gold_align) # ce (query_num, subfigure) - C = config.match_cost_align * cost_align + \ - config.match_cost_bbox * cost_box + \ - config.match_cost_giou * cost_iou + \ - config.match_cost_class * cost_class + \ - config.match_cost_side * cost_side - # find best bipartite match - _, col_idx = linear_sum_assignment(C.t()) # (subfigure) - best_match.append(col_idx) - # loss calculation according to the match - batch_loss_box = batch_loss_iou = batch_loss_align = batch_loss_class = batch_loss_side = 0.0 - for i in range(image.shape[0]): - gold_box, gold_align = subfigures[i] - gold_box = gold_box.cuda() - gold_align = gold_align.cuda() - # bbox l1 loss + iou loss - tmp = F.l1_loss(gold_box, output_box[i, best_match[i], :], reduction='none') # (subfig_num, 4) - batch_loss_box += tmp.sum() / gold_box.shape[0] - tmp = 1 - torch.diag(generalized_box_iou(box_cxcywh_to_xyxy(gold_box), - box_cxcywh_to_xyxy(output_box[i, best_match[i], :]))) # (subfig) - batch_loss_iou += tmp.sum() / gold_box.shape[0] - # classify loss - tmp = torch.zeros_like(output_det_class[i]) # (query_num, 1) - tmp[best_match[i], :] = 1.0 # GT: set matched queries as 1.0, otherwise 0.0 - batch_loss_class += F.binary_cross_entropy(output_det_class[i], tmp) - # align loss - matched_sim = output_sim[i, best_match[i], :] # prob (subfig_num, caption_length) - focal_weight = torch.abs(matched_sim - gold_align) ** config.focal_sigma # (1-p_t)**sigma = (y-p)**sigma - unweighted_bce = F.binary_cross_entropy(matched_sim, gold_align, reduce=False) # prob (subfig_num, caption_length) - batch_loss_align += torch.mean(focal_weight * unweighted_bce) # prob (subfig_num, caption_length) - # side loss - tmp = torch.diag(side_loss(output_box[i, best_match[i], :], gold_box)) # (subfig_num) - batch_loss_side += tmp.sum() / gold_box.shape[0] - train_loss_box += batch_loss_box.detach().item() - train_loss_iou += batch_loss_iou.detach().item() - train_loss_align += batch_loss_align.detach().item() - train_loss_class += batch_loss_class.detach().item() - train_loss_side += batch_loss_side.detach().item() - # accumulate results for mAP - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - train_det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP() - train_det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - train_det_labels.append(torch.ones_like(train_det_scores[-1])) # [bs * (filter_pred_num)] all 1 - train_true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - train_true_labels.append(torch.ones(train_true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - train_true_difficulties.append(torch.zeros_like(train_true_labels[-1])) # [bs * (subfig_num)] all zeros - # accumulate results as subfig-subcap format - cpu_caption = caption.cpu() - ls_caption = [trainSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens - # filter out nonobject outputs - filter_mask = cpu_output_det_class.squeeze() > 0.0 # [bs, query_num], True or False - ls_pred_boxes = [cpu_output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) - ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) - # for detected and gt subfigs, find indexes of aligned tokens - index_matrix = torch.arange(0, cpu_output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] - ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] - for i in range(image.shape[0]): - filter_tmp = cpu_output_sim[i, filter_mask[i], :] > config.similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens.append(pred_tokens) - filter_tmp = subfigures[i][1] > config.similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens.append(gt_tokens) - train_subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - # back prop - batch_loss = config.bbox_loss_coef*batch_loss_box + \ - config.giou_loss_coef*batch_loss_iou + \ - config.align_loss_coef*batch_loss_align + \ - config.class_loss_coef*batch_loss_class + \ - config.side_loss_coef*batch_loss_side - batch_loss /= image.shape[0] # avg within a batch - optimizer.zero_grad() - batch_loss.backward() - optimizer.step() - lr_sch.step() - train_mAP, train_det_recall, train_det_precision, _ = calculate_mAP_voc12(train_det_boxes, train_det_labels, train_det_scores, train_true_boxes, train_true_labels, train_true_difficulties, config.iou_threshold, config.score_threshold) - train_f1, train_aln_recall, train_aln_precision = train_subcaption_metric.get_metric(reset=True) - train_loss_box /= len(trainSet) # avg within an epoch - train_loss_iou /= len(trainSet) - train_loss_align /= len(trainSet) - train_loss_class /= len(trainSet) - train_loss_side /= len(trainSet) - - # torch.cuda.empty_cache() - - # validate one epoch - with torch.no_grad(): - model.eval() - val_loss_box = val_loss_iou = val_loss_align = val_loss_class = 0.0000 - det_boxes = [] - det_labels = [] - det_scores = [] - true_boxes = [] - true_labels = [] - true_difficulties = [] - for batch in tqdm(valLoader): - image = batch['image'].cuda() # (bs, 3, max_w, max_h) - caption = batch['caption'].cuda() # (bs, max_l) - subfigures = batch['subfigs'] - output_det_class, output_box, output_sim = model(image, caption) # (bs, query_num, 1), (bs, query_num, 4), (bs, query_num, caption_length) - cpu_output_box = output_box.cpu() - cpu_output_sim = output_sim.cpu() - cpu_output_det_class = output_det_class.cpu() - # accumulate results for mAP - filter_index = cpu_output_det_class.squeeze() > 0.0 # [bs, pred_num] True or False - for i in range(filter_index.shape[0]): - det_boxes.append(cpu_output_box[i, filter_index[i,:], :]) # [bs * (filter_pred_num, 4)] - # Note the boxex are kept (cx, cy, w, h) until calculating IOU in calculate_mAP() - det_scores.append(cpu_output_det_class.squeeze()[i, filter_index[i,:]]) # [bs * (filter_pred_num)] - det_labels.append(torch.ones_like(det_scores[-1])) # [bs * (filter_pred_num)] all 1 - true_boxes.append(subfigures[i][0]) # [bs * (subfig_num, 4)] - true_labels.append(torch.ones(true_boxes[-1].shape[0])) # [bs * (subfig_num)] all 1 - true_difficulties.append(torch.zeros_like(true_labels[-1])) # [bs * (subfig_num)] all zeros - # accumulate results as subfig-subcap format - cpu_caption = caption.cpu() - ls_caption = [trainSet.id_to_token(cpu_caption[i].tolist()) for i in range(cpu_caption.shape[0])] # [bs * cap_len] before evaluation, convert ids to tokens - # filter out nonobject outputs - filter_mask = output_det_class.squeeze() > 0.0 # [bs, query_num], True or False - ls_pred_boxes = [output_box[i, filter_mask[i], :].tolist() for i in range(image.shape[0])] # [bs * [filtered_query_num * [4]]], (cx, cy, w, h) - ls_gt_boxes = [ls[0].tolist() for ls in subfigures] # [bs * [subfigure * [4]]], (cx, cy, w, h) - # for detected and gt subfigs, find indexes of aligned tokens - index_matrix = torch.arange(0, output_sim.shape[-1]) # [caption_length], (0, 1, 2 ...) - ls_pred_tokens = [] # [bs * [filtered_query_num * [aligned_token_num]]] - ls_gt_tokens = [] # [bs * [subfig_num * [subcap_token_num]]] - for i in range(image.shape[0]): - filter_tmp = output_sim[i, filter_mask[i], :] > config.similarity_threshold # (filtered_query_num, caption_length) True or False - pred_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [filtered_query_num * [aligned_token_num]] index of tokens in the caption - ls_pred_tokens.append(pred_tokens) - filter_tmp = subfigures[i][1] > config.similarity_threshold # (subfig_num, caption_length) True or False - gt_tokens = [index_matrix[filter_tmp[j, :]].tolist() for j in range(filter_tmp.shape[0])] # [subfig_num * [subcap_token_num]] index of tokens in the caption - ls_gt_tokens.append(gt_tokens) - val_subcaption_metric.update(predicted_subfigures=ls_pred_boxes, predicted_tokens=ls_pred_tokens, - gold_subfigures=ls_gt_boxes, gold_tokens=ls_gt_tokens, wordpieces=ls_caption) - val_mAP, val_det_recall, val_det_precision, _ = calculate_mAP_voc12(det_boxes, det_labels, det_scores, true_boxes, true_labels, true_difficulties, config.iou_threshold, config.score_threshold) - val_f1, val_aln_recall, val_aln_precision = val_subcaption_metric.get_metric(reset=True) - """ - val_loss_box /= len(valSet) # avg within an epoch - val_loss_iou /= len(valSet) - val_loss_align /= len(valSet) - val_loss_class /= len(valSet) - """ - # record and save - if val_mAP > best_val_mAP: - best_val_mAP = val_mAP - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - # - 'val_f1': val_f1, - 'val_aln_recall' : val_aln_recall, - 'val_aln_precision' : val_aln_precision, - 'val_mAP' : val_mAP, - 'val_det_recall' : val_det_recall, - 'val_det_precision' : val_det_precision, - # - 'train_f1': train_f1, - 'train_aln_recall' : train_aln_recall, - 'train_aln_precision' : train_aln_precision, - 'train_mAP' : train_mAP, - 'train_det_recall' : train_det_recall, - 'train_det_precision' : train_det_precision, - # - 'train_loss_box': train_loss_box, - 'train_loss_iou': train_loss_iou, - 'train_loss_class': train_loss_class, - 'train_loss_align': train_loss_align, - }, val_det_best_model_path) - - if val_f1 > best_val_f1: - best_val_f1 = val_f1 - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - # - 'val_f1': val_f1, - 'val_aln_recall' : val_aln_recall, - 'val_aln_precision' : val_aln_precision, - 'val_mAP' : val_mAP, - 'val_det_recall' : val_det_recall, - 'val_det_precision' : val_det_precision, - # - 'train_f1': train_f1, - 'train_aln_recall' : train_aln_recall, - 'train_aln_precision' : train_aln_precision, - 'train_mAP' : train_mAP, - 'train_det_recall' : train_det_recall, - 'train_det_precision' : train_det_precision, - # - 'train_loss_box': train_loss_box, - 'train_loss_iou': train_loss_iou, - 'train_loss_class': train_loss_class, - 'train_loss_align': train_loss_align, - }, val_align_best_model_path) - - if epoch % config.cp_interval == 0: - torch.save({'epoch': epoch, - 'model_state_dict': model.state_dict(), - 'optimizer_state_dict': optimizer.state_dict(), - 'lr_sch_state_dict': lr_sch.state_dict(), - # - 'val_f1': val_f1, - 'val_aln_recall' : val_aln_recall, - 'val_aln_precision' : val_aln_precision, - 'val_mAP' : val_mAP, - 'val_det_recall' : val_det_recall, - 'val_det_precision' : val_det_precision, - # - 'train_f1': train_f1, - 'train_aln_recall' : train_aln_recall, - 'train_aln_precision' : train_aln_precision, - 'train_mAP' : train_mAP, - 'train_det_recall' : train_det_recall, - 'train_det_precision' : train_det_precision, - # - 'train_loss_box': train_loss_box, - 'train_loss_iou': train_loss_iou, - 'train_loss_class': train_loss_class, - 'train_loss_align': train_loss_align, - }, cp_model_path) - - writer.add_scalar('train/train_f1', train_f1, epoch) - writer.add_scalar('train/train_aln_recall', train_aln_recall, epoch) - writer.add_scalar('train/train_aln_precision', train_aln_precision, epoch) - writer.add_scalar('train/train_mAP', train_mAP, epoch) - writer.add_scalar('train/train_det_recall', train_det_recall, epoch) - writer.add_scalar('train/train_det_precision', train_det_precision, epoch) - # - writer.add_scalar('train/train_loss_align', train_loss_align, epoch) - writer.add_scalar('train/train_loss_box', train_loss_box, epoch) - writer.add_scalar('train/train_loss_class', train_loss_class, epoch) - writer.add_scalar('train/train_loss_iou', train_loss_iou, epoch) - # - writer.add_scalar('val/val_f1', val_f1, epoch) - writer.add_scalar('val/val_aln_recall', val_aln_recall, epoch) - writer.add_scalar('val/val_aln_precision', val_aln_precision, epoch) - writer.add_scalar('val/val_mAP', val_mAP, epoch) - writer.add_scalar('val/val_det_recall', val_det_recall, epoch) - writer.add_scalar('val/val_det_precision', val_det_precision, epoch) - - out_str = "Epoch:%d Learning Rate:%.4e\n" \ - "trn-cls:%.4f trn-iou:%.4f trn-box:%.4f trn-aln:%.4f\n" \ - "trn_mAP:%.4f trn_det_R:%.4f trn_det_P:%.4f trn_f1:%.4f trn_aln_R:%.4f trn_aln_P:%.4f\n" \ - "val_mAP:%.4f val_det_R:%.4f val_det_P:%.4f val_f1:%.4f val_aln_R:%.4f val_aln_P:%.4f"% \ - (epoch, optimizer.param_groups[0]['lr'], - train_loss_class, train_loss_iou, train_loss_box, train_loss_align, - train_mAP, train_det_recall, train_det_precision, train_f1, train_aln_recall, train_aln_precision, - val_mAP, val_det_recall, val_det_precision, val_f1, val_aln_recall, val_aln_precision - ) - - with open(f_path, 'a') as f: - f.write(out_str + '\n\n') - print(out_str) - - out_str = 'Best val_F1:%.2f, val_mAP:%.2f' % (best_val_f1, best_val_mAP) - print(out_str) - with open(f_path, 'a') as f: - f.write(out_str ) - diff --git a/openpmcvl/granular/process/transformer_module.py b/openpmcvl/granular/process/transformer_module.py deleted file mode 100644 index 2e13a56..0000000 --- a/openpmcvl/granular/process/transformer_module.py +++ /dev/null @@ -1,192 +0,0 @@ -import math -import torch -from torch import nn -import torch.nn.functional as F -import copy - -class MultiHeadAttention(nn.Module): - ''' Multi-Head Attention module ''' - - def __init__(self, n_head, d_model, d_k, d_v, dropout=0.1): - super().__init__() - - self.n_head = n_head - self.d_k = d_k - self.d_v = d_v - - self.w_qs = nn.Linear(d_model, n_head * d_k, bias=False) - self.w_ks = nn.Linear(d_model, n_head * d_k, bias=False) - self.w_vs = nn.Linear(d_model, n_head * d_v, bias=False) - self.fc = nn.Linear(n_head * d_v, d_model, bias=False) - - self.attention = ScaledDotProductAttention(temperature=d_k ** 0.5, attn_dropout=dropout) - - self.dropout = nn.Dropout(dropout) - self.layer_norm = nn.LayerNorm(d_model, eps=1e-6) - - - def forward(self, q, k, v, mask=None): - - residual = q - - q = self.layer_norm(q) - k = self.layer_norm(k) - v = self.layer_norm(v) - - d_k, d_v, n_head = self.d_k, self.d_v, self.n_head - sz_b, len_q, len_k, len_v = q.size(0), q.size(1), k.size(1), v.size(1) - - # Pass through the pre-attention projection: b x lq x (n*dv) - # Separate different heads: b x lq x n x dv - q = self.w_qs(q).view(sz_b, len_q, n_head, d_k) - k = self.w_ks(k).view(sz_b, len_k, n_head, d_k) - v = self.w_vs(v).view(sz_b, len_v, n_head, d_v) - - # Transpose for attention dot product: b x n x lq x dv - q, k, v = q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2) - - if mask is not None: - mask = mask.unsqueeze(1) # For head axis broadcasting. - - q, attn = self.attention(q, k, v, mask=mask) - - # Transpose to move the head dimension back: b x lq x n x dv - # Combine the last two dimensions to concatenate all the heads together: b x lq x (n*dv) - q = q.transpose(1, 2).contiguous().view(sz_b, len_q, -1) - q = self.dropout(self.fc(q)) - q += residual - - return q, attn - -class ScaledDotProductAttention(nn.Module): - ''' Scaled Dot-Product Attention ''' - - def __init__(self, temperature, attn_dropout=0.1): - super().__init__() - self.temperature = temperature - self.dropout = nn.Dropout(attn_dropout) - - def forward(self, q, k, v, mask=None): - - attn = torch.matmul(q / self.temperature, k.transpose(2, 3)) - - if mask is not None: - attn = attn.masked_fill(mask == 0, -1e9) - - attn = self.dropout(F.softmax(attn, dim=-1)) - output = torch.matmul(attn, v) - - return output, attn - -class TransformerEncoderLayer(nn.Module): - - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu"): - super().__init__() - self.self_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) # 内含 norm + atten + dropout + residual - - # Implementation of Feedforward model - self.ffn = nn.Sequential( - nn.Linear(d_model, dim_feedforward), - _get_activation_md(activation), - nn.Dropout(dropout), - nn.Linear(dim_feedforward, d_model), - nn.Dropout(dropout) - ) - - self.norm = nn.LayerNorm(d_model) - - def forward(self, src): - - q = k = src - src = self.self_attn(q, k, src)[0] - - src2 = self.norm(src) - src2 = self.ffn(src2) - src = src + src2 - - return src - -class TransformerDecoderLayer(nn.Module): - - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu"): - super().__init__() - - self.self_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) - - self.cross_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) - - self.ffn = nn.Sequential( - nn.Linear(d_model, dim_feedforward), - _get_activation_md(activation), - nn.Dropout(dropout), - nn.Linear(dim_feedforward, d_model), - nn.Dropout(dropout) - ) - - self.norm = nn.LayerNorm(d_model) - - def forward(self, tgt, memory): - - tgt = self.cross_attn(tgt, memory, memory)[0] - - tgt = self.self_attn(tgt, tgt, tgt)[0] - - tgt2 = self.norm(tgt) - tgt2 = self.ffn(tgt2) - tgt = tgt + tgt2 - - return tgt - -class TransformerEncoder(nn.Module): - def __init__(self, encoder_layer, num_layers): - super().__init__() - self.layers = _get_clones(encoder_layer, num_layers) - self.num_layers = num_layers - - def forward(self, src): - output = src - - for layer in self.layers: - output = layer(output) # (bs, patch_num, feature_dim) - - return output - -class TransformerDecoder(nn.Module): - def __init__(self, decoder_layer, num_layers): - super().__init__() - self.layers = _get_clones(decoder_layer, num_layers) - self.num_layers = num_layers - - def forward(self, encoder_memory, query, return_intermedia=False): - query_output = query - intermedia = [] - - for i in range(len(self.layers)): - query_output = self.layers[i](query_output, encoder_memory) # (bs, query_num, feature_dim) - if return_intermedia: - intermedia.append(query_output) - - return query_output, intermedia - -def _get_clones(module, N): - return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) - -def _get_activation_fn(activation): - """Return an activation function given a string""" - if activation == "relu": - return F.relu - if activation == "gelu": - return F.gelu - if activation == "glu": - return F.glu - raise RuntimeError(F"activation should be relu/gelu, not {activation}.") - -def _get_activation_md(activation): - """Return an activation function given a string""" - if activation == "relu": - return nn.ReLU() - if activation == "gelu": - return nn.GELU() - if activation == "glu": - return nn.GLU() - raise RuntimeError(F"activation should be relu/gelu, not {activation}.") diff --git a/openpmcvl/granular/process/visualization_tools.py b/openpmcvl/granular/process/visualization_tools.py deleted file mode 100644 index 735cec2..0000000 --- a/openpmcvl/granular/process/visualization_tools.py +++ /dev/null @@ -1,381 +0,0 @@ -from matplotlib import pyplot as plt -import random -import os - -color_ls = ['red', 'darkred', 'lightcoral', 'orangered', 'sienna', 'sandybrown', - 'gold', 'olive', 'olivedrab', 'yellowgreen', 'darkseagreen', 'green', - 'lightseagreen', 'skyblue', 'steelblue', 'deepskyblue', 'dodgerblue', - 'blue', 'darkblue', 'blueviolet', 'violet'] -random.shuffle(color_ls) - -def idx_2_cap(text_idxs, cap): - text = '' - if len(text_idxs) > 0: - sorted_tokens = sorted(text_idxs) - curr_end = sorted_tokens[0] - for token in sorted_tokens[1:]: - if token > curr_end+1: - if curr_end != sorted_tokens[0]: - text += '[SEP] ' - text += cap[token] - text += ' ' - else: - assert curr_end+1 == token, "curr_end %d, token %d, len(text_ids) %d, len(cap) %d" % (curr_end, token, len(text_idxs), len(cap)) - curr_end = token - text += cap[token] - text += ' ' - return text - -def span_2_text(spans, caption): - text = "" - for span in spans: - if span[0] == span[1]: - text += (caption[span[0]] + '/') - else: - text += (caption[span[0]] + ' ' + caption[span[0]+1] + '......' + caption[span[1]-1] + ' ' + caption[span[1]] + '/') - return text - -def concat_caption(caption): - text = "" - for token in caption: - if token != '[CLS]' and token != '[SEP]' and token != '[PAD]': - text += token - text += " " - return text - -# Visualization function for a compound figure (only infer) -def visualization_noComparision(image, original_h, original_w, boxes, normalized_coord, texts, cap, untokenized_cap, path): - """ - Visualization a compound figure inference result - - Args: - image tensor: (3, h, w) - original_h/w: scalar - boxes tensor or list of tensors: (pred_num, 4) / [pred_num, (4)], (cx, cy, w, h) ratio of the image - texts list: [pred_num, [subcap_len]], index - cap list: [cap_len], string tokens - untokenized_cap string: untokenized caption - path string: path to save the figure - """ - _, padded_h, padded_w = image.shape - if original_h > original_w: - unpadded_h = padded_h - unpadded_w = (original_w/original_h)*padded_h - else: - unpadded_w = padded_w - unpadded_h = (original_h/original_w)*padded_w - np_image = image.permute(1, 2, 0).numpy()[:int(unpadded_h), :int(unpadded_w), :] - subcap = [] - - fig = plt.figure(dpi=300)#, figsize=(5, 5*unpadded_h/unpadded_w)) - plt.subplots_adjust(hspace=0.05, wspace=0.05) - - ax = fig.add_subplot(2, 2, 1) - ax.imshow(np_image, interpolation=None) - plt.axis("off") - for i in range(boxes.shape[0]): - if normalized_coord: - x1 = (boxes[i][0] - 0.5*boxes[i][2]) * padded_w - y1 = (boxes[i][1] - 0.5*boxes[i][3]) * padded_h - rec_w = boxes[i][2] * padded_w - rec_h = boxes[i][3] * padded_h - else: - x1 = (boxes[i][0] - 0.5*boxes[i][2]) - y1 = (boxes[i][1] - 0.5*boxes[i][3]) - rec_w = boxes[i][2] - rec_h = boxes[i][3] - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor=color_ls[i%21], linewidth=1) # the same color as the matched gt - ax.add_patch(rect) - if texts: - subcap.append([i, str(i) + ' : ' + idx_2_cap(texts[i], cap)]) # the same color as the matched gt - ax.text(x1+2, y1-2, str(i), wrap=True, color=color_ls[i%21],fontsize=10) - - ax = fig.add_subplot(2, 2, 2) - plt.axis("off") - if cap: - for cap in subcap: - ax.text(0, cap[0]/len(cap), cap[1], wrap=True, color=color_ls[cap[0]%21], fontsize=5) - - if untokenized_cap: - ax = fig.add_subplot(2, 2, 3) - ax.text(0, 0, untokenized_cap, wrap=True, color='black',fontsize=8) - plt.axis("off") - - # plt.tight_layout() - plt.savefig(path) - plt.close() - -# Visualization function for a compound figure (infer and gt) -def visualization(image, original_h, original_w, - pred_boxes, pred_texts, gt_boxes, gt_texts, match_matrix, - cap, untokenized_cap, path, f1, mAP): - """ - Visualization a compound figure inference result - - 对于Pred,同F1metric函数一样,需要和GT匹配上,对应的用同一颜色; - 匹配不上的呢?再用另外的颜色并(在Box上)额外标注是匹配不上的,无需再列出文本; - - Args: - image tensor: (3, h, w) - original_h/w: scalar - boxes tensor: (pred_num, 4), (cx, cy, w, h) ratio of the image - texts list: [pred_num, [subcap_len]], index - cap list: [cap_len], string tokens - match_matrix list: [num_gt], the best matched prediction index of each gold subfigure - untokenized_cap string: untokenized caption - path string: path to save the figure - metric dict: {'metric':number ...} - """ - _, padded_h, padded_w = image.shape - if original_h > original_w: - unpadded_h = padded_h - unpadded_w = (original_w/original_h)*padded_h - else: - unpadded_w = padded_w - unpadded_h = (original_h/original_w)*padded_w - np_image = image.permute(1, 2, 0).numpy()[:int(unpadded_h), :int(unpadded_w), :] - # np_image = image.permute(1, 2, 0).numpy() # 不去除pad - pred_subcap = [] - gt_subcap = [] - - fig = plt.figure(dpi=300)#, figsize=(5, 5*unpadded_h/unpadded_w)) - plt.subplots_adjust(hspace=0.05, wspace=0.05) - - ax = fig.add_subplot(3, 2, 1) - ax.imshow(np_image, interpolation=None) - plt.axis("off") - for i in range(pred_boxes.shape[0]): - if i in match_matrix: - gt_idx = match_matrix.index(i) - x1 = (pred_boxes[i][0] - 0.5*pred_boxes[i][2]) * padded_w - y1 = (pred_boxes[i][1] - 0.5*pred_boxes[i][3]) * padded_h - rec_w = pred_boxes[i][2] * padded_w - rec_h = pred_boxes[i][3] * padded_h - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor=color_ls[gt_idx%21], linewidth=1) # the same color as the matched gt - ax.add_patch(rect) - pred_subcap.append([gt_idx, str(gt_idx) + ' : ' + idx_2_cap(pred_texts[i], cap)]) # the same color as the matched gt - ax.text(x1+2, y1-2, str(gt_idx), wrap=True, color=color_ls[gt_idx%21],fontsize=10) - else: - x1 = (pred_boxes[i][0] - 0.5*pred_boxes[i][2]) * padded_w - y1 = (pred_boxes[i][1] - 0.5*pred_boxes[i][3]) * padded_h - rec_w = pred_boxes[i][2] * padded_w - rec_h = pred_boxes[i][3] * padded_h - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor='grey', linewidth=1) - ax.add_patch(rect) - # pred_subcap.append(str(gt_idx) + ' : ' + idx_2_cap(pred_texts[i], cap)) - ax.text(x1+2, y1-2, 'None', wrap=True, color='grey',fontsize=10) - - ax = fig.add_subplot(3, 2, 2) - plt.axis("off") - for matched_subcap in pred_subcap: - ax.text(0, matched_subcap[0]/len(pred_subcap), matched_subcap[1], wrap=True, color=color_ls[matched_subcap[0]%21], fontsize=5) - - ax = fig.add_subplot(3, 2, 3) - ax.imshow(np_image, interpolation=None) - plt.axis("off") - for i in range(gt_boxes.shape[0]): - x1 = (gt_boxes[i][0] - 0.5*gt_boxes[i][2]) * padded_w - y1 = (gt_boxes[i][1] - 0.5*gt_boxes[i][3]) * padded_h - rec_w = gt_boxes[i][2] * padded_w - rec_h = gt_boxes[i][3] * padded_h - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor=color_ls[i%21], linewidth=1) - ax.add_patch(rect) - gt_subcap.append(str(i) + ' : ' + idx_2_cap(gt_texts[i], cap)) - ax.text(x1+2, y1-2, str(i), wrap=True, color=color_ls[i%21],fontsize=10) - - ax = fig.add_subplot(3, 2, 4) - plt.axis("off") - for i in range(len(gt_subcap)): - ax.text(0, i/len(gt_subcap), gt_subcap[i], wrap=True, color=color_ls[i%21],fontsize=5) - - ax = fig.add_subplot(3, 2, 5) - ax.text(0, 0, untokenized_cap, wrap=True, color='black',fontsize=8) - plt.axis("off") - - plt.suptitle('F1:%.2f mAP:%.2f' % (f1, mAP)) - # plt.tight_layout() - plt.savefig(path) - plt.close() - -# Visualization function for a compound figure (only detection results) -def visualization_detection(image, original_h, original_w, - pred_boxes, gt_boxes, match_matrix, - path, mAP): - """ - Visualization a compound figure inference result - - 对于Pred,同F1metric函数一样,需要和GT匹配上,对应的用同一颜色; - 匹配不上的呢?再用另外的颜色并(在Box上)额外标注是匹配不上的; - - Args: - image tensor: (3, h, w) - original_h/w: scalar - boxes tensor: (pred_num, 4), (cx, cy, w, h) ratio of the image - match_matrix list: [num_gt], the best matched prediction index of each gold subfigure - path string: path to save the figure - metric dict: {'metric':number ...} - """ - _, padded_h, padded_w = image.shape - if original_h > original_w: - unpadded_h = padded_h - unpadded_w = (original_w/original_h)*padded_h - else: - unpadded_w = padded_w - unpadded_h = (original_h/original_w)*padded_w - np_image = image.permute(1, 2, 0).numpy()[:int(unpadded_h), :int(unpadded_w), :] - - fig = plt.figure(dpi=300)#, figsize=(5, 5*unpadded_h/unpadded_w)) - plt.subplots_adjust(hspace=0.05, wspace=0.05) - - ax = fig.add_subplot(2, 1, 1) - ax.imshow(np_image, interpolation=None) - plt.axis("off") - for i in range(pred_boxes.shape[0]): - if i in match_matrix: - gt_idx = match_matrix.index(i) - x1 = (pred_boxes[i][0] - 0.5*pred_boxes[i][2]) * padded_w - y1 = (pred_boxes[i][1] - 0.5*pred_boxes[i][3]) * padded_h - rec_w = pred_boxes[i][2] * padded_w - rec_h = pred_boxes[i][3] * padded_h - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor=color_ls[gt_idx%21], linewidth=1) # the same color as the matched gt - ax.add_patch(rect) - ax.text(x1+2, y1-2, str(gt_idx), wrap=True, color=color_ls[gt_idx%21],fontsize=10) - else: - x1 = (pred_boxes[i][0] - 0.5*pred_boxes[i][2]) * padded_w - y1 = (pred_boxes[i][1] - 0.5*pred_boxes[i][3]) * padded_h - rec_w = pred_boxes[i][2] * padded_w - rec_h = pred_boxes[i][3] * padded_h - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor='grey', linewidth=1) - ax.add_patch(rect) - ax.text(x1+2, y1-2, 'None', wrap=True, color='grey',fontsize=10) - - ax = fig.add_subplot(2, 1, 2) - ax.imshow(np_image, interpolation=None) - plt.axis("off") - for i in range(gt_boxes.shape[0]): - x1 = (gt_boxes[i][0] - 0.5*gt_boxes[i][2]) * padded_w - y1 = (gt_boxes[i][1] - 0.5*gt_boxes[i][3]) * padded_h - rec_w = gt_boxes[i][2] * padded_w - rec_h = gt_boxes[i][3] * padded_h - rect = plt.Rectangle((x1, y1), rec_w, rec_h, fill=False, edgecolor=color_ls[i%21], linewidth=1) - ax.add_patch(rect) - ax.text(x1+2, y1-2, str(i), wrap=True, color=color_ls[i%21],fontsize=10) - - plt.suptitle('mAP:%.2f' % (mAP)) - # plt.tight_layout() - plt.savefig(path) - plt.close() - -# Load visualiztaion from medicat and ours, concat and save for comparison -def compare_visualization(): - """ - load visualiztaion from medicat and ours, concat and save for comparison - """ - ours_root = 'Log/ContinueAlign/(0.646)newdataset_open_detection/visualization' - medicat_root = "../medicat/code/subcaption/log/9.27/visualization" - save_root = 'Log/ContinueAlign/(0.646)newdataset_open_detection/compare_visual' - - # rcd ours prediction - ours_dict = {} - ours = os.walk(ours_root) - for path, dir_list, file_list in ours: - file_list.sort() - for file_name in file_list: - metric, other = file_name.split('(') - value, image_id = other.split(')') - if image_id not in ours_dict: - ours_dict[image_id] = {metric:float(value), "path":'%s/%s'%(ours_root, file_name)} - else: - ours_dict[image_id][metric] = float(value) - - medicat = os.walk(medicat_root) - for path, dir_list, file_list in medicat: - file_list.sort() - for file_name in file_list: - # compare metric - metric, other = file_name.split('(') - value, image_id = other.split(')') - if image_id == '1706.png': - continue - ours_metric = ours_dict[image_id][metric] # float - gap = ours_metric - float(value) - save_path = "%s/%s(%.2f)%s" % (save_root, metric, gap, image_id) - # concat image - our_img = Image.open(ours_dict[image_id]['path']) - w, h = our_img.size - medicat_img = Image.open(os.path.join(medicat_root, file_name)) - result = Image.new(our_img.mode, (w*2, h)) - result.paste(our_img, box=(0, 0)) - result.paste(medicat_img, box=(w, 0)) - result.save(save_path) - -# 可视化synthetic图像和bbox -def visual_synthetic_data(): - torch.multiprocessing.set_sharing_strategy('file_system') - - with open('synthetic_parameters/parameters/target_depth_v0.jsonl') as f: - param = json.load(f) - - with open('augmentation_parameters/flip_color_grey_noise_blur.jsonl') as f: - aug_param = json.load(f) - - # eval_synthetic_data(aug_param, param, False) - - filepath = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_train.jsonl' - image_root = '/remote-home/share/medical/public/MedICaT/compound_figures/figures' - Set = Synthetic_Dataset(filepath, image_root, param, aug_param, eval_mode=True) - Loader = DataLoader(Set, 64, collate_fn=fig_collate) - for batch in tqdm(Loader): - # forward pass - image = batch['image'] # (bs, 3, max_w, max_h) - caption = batch['caption'] # (bs, max_cap_l) - subfigures = batch['subfigs'] # [... [(subfig_num, 4), (subfig_num, max_cap_l)] ...] - unpadded_hws = batch['unpadded_hws'] # [bs, [2]] - image_ids = batch['image_id'] # [bs] - exit() - -# 可视化synthetic(基于真实的Layout替换图像)图像和bbox -def visual_reallayout_synthetic_data(): - torch.multiprocessing.set_sharing_strategy('file_system') - - with open('synthetic_parameters/parameters/sim_cfs.jsonl') as f: - param = json.load(f) - # eval_synthetic_data(param, eval_mode=False) - - with open('augmentation_parameters/flip_color_grey_noise_blur.jsonl') as f: - aug_param = json.load(f) - - filepath = '/remote-home/share/medical/public/MedICaT/compound_figures/reid_train.jsonl' - image_root = '/remote-home/share/medical/public/MedICaT/compound_figures/figures' - Set = Real_Layout_Synthetic_Dataset(filepath, image_root, param, aug_param, eval_mode=True) - Loader = DataLoader(Set, 64, collate_fn=fig_collate) - for batch in tqdm(Loader): - # forward pass - image = batch['image'] # (bs, 3, max_w, max_h) - caption = batch['caption'] # (bs, max_cap_l) - subfigures = batch['subfigs'] # [... [(subfig_num, 4), (subfig_num, max_cap_l)] ...] - unpadded_hws = batch['unpadded_hws'] # [bs, [2]] - image_ids = batch['image_id'] # [bs] - exit() - -# 可视化simcfs synthetic图像和bbox -def visual_simcfs_data(): - torch.multiprocessing.set_sharing_strategy('file_system') - - with open('synthetic_parameters/parameters/real_layout.jsonl') as f: - param = json.load(f) - # eval_synthetic_data(param, eval_mode=False) - - with open('augmentation_parameters/flip_color_grey_noise_blur.jsonl') as f: - aug_param = json.load(f) - - Set = SimCFS_Dataset(param, aug_param, epoch_maximum=1500, eval_mode=True) - Loader = DataLoader(Set, 64, collate_fn=fig_collate) - for batch in tqdm(Loader): - # forward pass - image = batch['image'] # (bs, 3, max_w, max_h) - caption = batch['caption'] # (bs, max_cap_l) - subfigures = batch['subfigs'] # [... [(subfig_num, 4), (subfig_num, max_cap_l)] ...] - unpadded_hws = batch['unpadded_hws'] # [bs, [2]] - image_ids = batch['image_id'] # [bs] - exit() \ No newline at end of file From e1067ca6612ad29c8cf7d42a80c658673edec6d5 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:29:49 -0500 Subject: [PATCH 28/62] Add subfigure detector refactored model. --- .../granular/models/subfigure_detector.py | 143 ++++++++++++------ 1 file changed, 94 insertions(+), 49 deletions(-) diff --git a/openpmcvl/granular/models/subfigure_detector.py b/openpmcvl/granular/models/subfigure_detector.py index 40fddfd..ba7327b 100644 --- a/openpmcvl/granular/models/subfigure_detector.py +++ b/openpmcvl/granular/models/subfigure_detector.py @@ -5,54 +5,77 @@ from torch import nn from torchvision import models, transforms import math -# from torchsummary import summary + from openpmcvl.granular.models.transformer_module import * from einops import repeat class FigCap_Former(nn.Module): - def __init__(self, num_query=50, num_encoder_layers=6, num_decoder_layers=6, - feature_dim=256, atten_head_num=8, mlp_ratio=4, dropout=0.0, activation='relu', - alignment_network = False, - bert_path = '/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/PubMed_BERT', - num_text_decoder_layers=6, text_atten_head_num=8, text_mlp_ratio=4, text_dropout=0.0, text_activation='relu', - resnet=34, resnet_pretrained=False): + def __init__( + self, + num_query=50, + num_encoder_layers=6, + num_decoder_layers=6, + feature_dim=256, + atten_head_num=8, + mlp_ratio=4, + dropout=0.0, + activation="relu", + alignment_network=False, + bert_path="/remote-home/zihengzhao/CompoundFigure/medicat/code/pretrained_model/PubMed_BERT", + num_text_decoder_layers=6, + text_atten_head_num=8, + text_mlp_ratio=4, + text_dropout=0.0, + text_activation="relu", + resnet=34, + resnet_pretrained=False, + ): super().__init__() # Followings are modules for fig detection if resnet == 18: - self.img_embed = nn.Sequential(*list(models.resnet18(pretrained=resnet_pretrained).children())[:8]).cuda() + self.img_embed = nn.Sequential( + *list(models.resnet18(pretrained=resnet_pretrained).children())[:8] + ).cuda() self.img_channel_squeeze = nn.Conv2d(512, feature_dim, 1) elif resnet == 34: - self.img_embed = nn.Sequential(*list(models.resnet34(pretrained=resnet_pretrained).children())[:8]).cuda() + self.img_embed = nn.Sequential( + *list(models.resnet34(pretrained=resnet_pretrained).children())[:8] + ).cuda() self.img_channel_squeeze = nn.Conv2d(512, feature_dim, 1) elif resnet == 50: - self.img_embed = nn.Sequential(*list(models.resnet50(pretrained=resnet_pretrained).children())[:8]).cuda() + self.img_embed = nn.Sequential( + *list(models.resnet50(pretrained=resnet_pretrained).children())[:8] + ).cuda() self.img_channel_squeeze = nn.Conv2d(2048, feature_dim, 1) else: - print('ResNet Error: Unsupported Version ResNet%d' % resnet) + print("ResNet Error: Unsupported Version ResNet%d" % resnet) exit() self.pos_embed = PositionEncoding(num_pos_feats=feature_dim) - - encoder_layer = TransformerEncoderLayer(feature_dim, atten_head_num, mlp_ratio*feature_dim, dropout, activation) + + encoder_layer = TransformerEncoderLayer( + feature_dim, atten_head_num, mlp_ratio * feature_dim, dropout, activation + ) self.img_encoder = TransformerEncoder(encoder_layer, num_encoder_layers) self.query = nn.Parameter(torch.rand(num_query, feature_dim)) - decoder_layer = TransformerDecoderLayer(feature_dim, atten_head_num, mlp_ratio*feature_dim, dropout, activation) - self.img_decoder = TransformerDecoder(decoder_layer=decoder_layer, num_layers=num_decoder_layers) + decoder_layer = TransformerDecoderLayer( + feature_dim, atten_head_num, mlp_ratio * feature_dim, dropout, activation + ) + self.img_decoder = TransformerDecoder( + decoder_layer=decoder_layer, num_layers=num_decoder_layers + ) self.box_head = nn.Sequential( nn.Linear(feature_dim, feature_dim), nn.ReLU(inplace=True), - #nn.Dropout(p=dropout), - #nn.Linear(feature_dim, feature_dim), - #nn.ReLU(inplace=True), + # nn.Dropout(p=dropout), + # nn.Linear(feature_dim, feature_dim), + # nn.ReLU(inplace=True), nn.Linear(feature_dim, 4), - nn.Sigmoid() - ) - self.det_class_head = nn.Sequential( - nn.Linear(feature_dim, 1), - nn.Sigmoid() + nn.Sigmoid(), ) + self.det_class_head = nn.Sequential(nn.Linear(feature_dim, 1), nn.Sigmoid()) # Followings are modules for fig-cap alignment self.alignment_network = alignment_network # exclude alignment modules(BERT) to allow multi-gpu acceleration @@ -64,21 +87,29 @@ def __init__(self, num_query=50, num_encoder_layers=6, num_decoder_layers=6, nn.ReLU(inplace=True), nn.Dropout(p=dropout), nn.Linear(768, feature_dim), - nn.Dropout(p=dropout) + nn.Dropout(p=dropout), ) - text_decoder_layer = TransformerDecoderLayer(feature_dim, text_atten_head_num, text_mlp_ratio*feature_dim, text_dropout, text_activation) - self.text_decoder = TransformerDecoder(decoder_layer=text_decoder_layer, num_layers=num_text_decoder_layers) + text_decoder_layer = TransformerDecoderLayer( + feature_dim, + text_atten_head_num, + text_mlp_ratio * feature_dim, + text_dropout, + text_activation, + ) + self.text_decoder = TransformerDecoder( + decoder_layer=text_decoder_layer, num_layers=num_text_decoder_layers + ) self.simi_head = nn.Sequential( - nn.Linear(feature_dim*2, feature_dim), + nn.Linear(feature_dim * 2, feature_dim), nn.ReLU(inplace=True), - #nn.Dropout(p=dropout), + # nn.Dropout(p=dropout), nn.Linear(feature_dim, feature_dim), nn.ReLU(inplace=True), - #nn.Dropout(p=dropout), + # nn.Dropout(p=dropout), nn.Linear(feature_dim, 1), - nn.Sigmoid() + nn.Sigmoid(), ) self.img_proj = nn.Parameter(torch.rand(feature_dim, feature_dim)) @@ -99,29 +130,31 @@ def forward(self, images, texts): """ # Img Embed x = self.img_embed(images) # (bs, 2048, h/32, w/32) - x = self.img_channel_squeeze(x) # (bs, 256, h/32, w/32) + x = self.img_channel_squeeze(x) # (bs, 256, h/32, w/32) - pos = self.pos_embed(x.shape[0], x.shape[2], x.shape[3], x.device) # (bs, 256, h/32, w/32) + pos = self.pos_embed( + x.shape[0], x.shape[2], x.shape[3], x.device + ) # (bs, 256, h/32, w/32) x = x + pos x = x.view(x.shape[0], x.shape[1], -1) # (bs, 256, (w*h)/(32*32)) - x = x.transpose(1, 2) # (bs, (w*h)/(32*32), 256) + x = x.transpose(1, 2) # (bs, (w*h)/(32*32), 256) # Detect - x = self.img_encoder(x) # (bs, (w*h)/(32*32), 256) - query = repeat(self.query, 'l d -> bs l d', bs=x.shape[0]) # (bs, 50, 256) + x = self.img_encoder(x) # (bs, (w*h)/(32*32), 256) + query = repeat(self.query, "l d -> bs l d", bs=x.shape[0]) # (bs, 50, 256) query, _ = self.img_decoder(x, query) # (bs, 50, 256) - output_det_class = self.det_class_head(query) # (bs, 50, 1) - output_box = self.box_head(query) # (bs, 50, 4) + output_det_class = self.det_class_head(query) # (bs, 50, 1) + output_box = self.box_head(query) # (bs, 50, 4) # Text Embed if self.alignment_network: - t = self.text_embed(texts)[0][-1] # (bs, l, 768) - t = self.text_channel_squeeze(t) # (bs, l, 256) + t = self.text_embed(texts)[0][-1] # (bs, l, 768) + t = self.text_channel_squeeze(t) # (bs, l, 256) # Align - query = query @ self.img_proj # (bs, 50, 256) - t, _ = self.text_decoder(query, t) # (bs, l, 256) + query = query @ self.img_proj # (bs, 50, 256) + t, _ = self.text_decoder(query, t) # (bs, l, 256) # t_proj = t_proj * self.txt_proj # (bs, l, 256) query = query.unsqueeze(2).repeat(1, 1, t.shape[1], 1) # (bs, 50, l, 256) @@ -129,7 +162,9 @@ def forward(self, images, texts): similarity = torch.cat((query, t), -1) # (bs, 50, l, 512) similarity = self.simi_head(similarity).squeeze(-1) # (bs, 50, l) else: - similarity = 0# torch.zeros(query.shape[0], query.shape[1], texts.shape[-1]).cuda() + similarity = ( + 0 # torch.zeros(query.shape[0], query.shape[1], texts.shape[-1]).cuda() + ) """ cos = nn.CosineSimilarity(dim=3) @@ -149,9 +184,11 @@ def forward(self, images, texts): class PositionEncoding(nn.Module): - def __init__(self, normalize=True, scale=100.0, num_pos_feats=256, temperature=10000): + def __init__( + self, normalize=True, scale=100.0, num_pos_feats=256, temperature=10000 + ): super().__init__() - self.num_pos_feats = num_pos_feats//2 + self.num_pos_feats = num_pos_feats // 2 self.temperature = temperature self.normalize = normalize if scale is not None and normalize is False: @@ -159,15 +196,19 @@ def __init__(self, normalize=True, scale=100.0, num_pos_feats=256, temperature=1 if scale is None: scale = 2 * math.pi self.scale = scale - + def forward(self, bs, h, w, device): # 输入是b,c,h,w mask = torch.ones(bs, h, w, device=device) # 因为图像是2d的,所以位置编码也分为x,y方向 # 1 1 1 1 .. 2 2 2 2... 3 3 3... - y_embed = mask.cumsum(1, dtype=torch.float32) # (b, h, w) the 'y-index' of each position + y_embed = mask.cumsum( + 1, dtype=torch.float32 + ) # (b, h, w) the 'y-index' of each position # 1 2 3 4 ... 1 2 3 4... - x_embed = mask.cumsum(2, dtype=torch.float32) # (b, h, w) the 'x-index' of each position + x_embed = mask.cumsum( + 2, dtype=torch.float32 + ) # (b, h, w) the 'x-index' of each position if self.normalize: eps = 1e-6 y_embed = y_embed / (y_embed[:, -1:, :] + eps) * self.scale @@ -181,8 +222,12 @@ def forward(self, bs, h, w, device): # 输出shape=b,h,w,128 pos_x = x_embed[:, :, :, None] / dim_t pos_y = y_embed[:, :, :, None] / dim_t - pos_x = torch.stack((pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4).flatten(3) - pos_y = torch.stack((pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4).flatten(3) + pos_x = torch.stack( + (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4 + ).flatten(3) + pos_y = torch.stack( + (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4 + ).flatten(3) pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) # 每个特征图的xy位置都编码成256的向量,其中前128是y方向编码,而128是x方向编码 From e5a308eb7967a4d44ed2c2032bccad37ae46eebb Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:30:02 -0500 Subject: [PATCH 29/62] Add transformer modules. --- .../granular/models/transformer_module.py | 136 ++++++++++-------- 1 file changed, 79 insertions(+), 57 deletions(-) diff --git a/openpmcvl/granular/models/transformer_module.py b/openpmcvl/granular/models/transformer_module.py index 2e13a56..dd164b7 100644 --- a/openpmcvl/granular/models/transformer_module.py +++ b/openpmcvl/granular/models/transformer_module.py @@ -4,8 +4,9 @@ import torch.nn.functional as F import copy + class MultiHeadAttention(nn.Module): - ''' Multi-Head Attention module ''' + """Multi-Head Attention module""" def __init__(self, n_head, d_model, d_k, d_v, dropout=0.1): super().__init__() @@ -19,12 +20,13 @@ def __init__(self, n_head, d_model, d_k, d_v, dropout=0.1): self.w_vs = nn.Linear(d_model, n_head * d_v, bias=False) self.fc = nn.Linear(n_head * d_v, d_model, bias=False) - self.attention = ScaledDotProductAttention(temperature=d_k ** 0.5, attn_dropout=dropout) + self.attention = ScaledDotProductAttention( + temperature=d_k**0.5, attn_dropout=dropout + ) self.dropout = nn.Dropout(dropout) self.layer_norm = nn.LayerNorm(d_model, eps=1e-6) - def forward(self, q, k, v, mask=None): residual = q @@ -46,7 +48,7 @@ def forward(self, q, k, v, mask=None): q, k, v = q.transpose(1, 2), k.transpose(1, 2), v.transpose(1, 2) if mask is not None: - mask = mask.unsqueeze(1) # For head axis broadcasting. + mask = mask.unsqueeze(1) # For head axis broadcasting. q, attn = self.attention(q, k, v, mask=mask) @@ -58,8 +60,9 @@ def forward(self, q, k, v, mask=None): return q, attn + class ScaledDotProductAttention(nn.Module): - ''' Scaled Dot-Product Attention ''' + """Scaled Dot-Product Attention""" def __init__(self, temperature, attn_dropout=0.1): super().__init__() @@ -78,19 +81,24 @@ def forward(self, q, k, v, mask=None): return output, attn + class TransformerEncoderLayer(nn.Module): - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu"): + def __init__( + self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu" + ): super().__init__() - self.self_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) # 内含 norm + atten + dropout + residual + self.self_attn = MultiHeadAttention( + nhead, d_model, d_k=d_model // nhead, d_v=d_model // nhead, dropout=dropout + ) # 内含 norm + atten + dropout + residual # Implementation of Feedforward model self.ffn = nn.Sequential( - nn.Linear(d_model, dim_feedforward), - _get_activation_md(activation), - nn.Dropout(dropout), - nn.Linear(dim_feedforward, d_model), - nn.Dropout(dropout) + nn.Linear(d_model, dim_feedforward), + _get_activation_md(activation), + nn.Dropout(dropout), + nn.Linear(dim_feedforward, d_model), + nn.Dropout(dropout), ) self.norm = nn.LayerNorm(d_model) @@ -106,21 +114,28 @@ def forward(self, src): return src + class TransformerDecoderLayer(nn.Module): - def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu"): + def __init__( + self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu" + ): super().__init__() - self.self_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) + self.self_attn = MultiHeadAttention( + nhead, d_model, d_k=d_model // nhead, d_v=d_model // nhead, dropout=dropout + ) - self.cross_attn = MultiHeadAttention(nhead, d_model, d_k=d_model//nhead, d_v=d_model//nhead, dropout=dropout) + self.cross_attn = MultiHeadAttention( + nhead, d_model, d_k=d_model // nhead, d_v=d_model // nhead, dropout=dropout + ) self.ffn = nn.Sequential( - nn.Linear(d_model, dim_feedforward), - _get_activation_md(activation), - nn.Dropout(dropout), - nn.Linear(dim_feedforward, d_model), - nn.Dropout(dropout) + nn.Linear(d_model, dim_feedforward), + _get_activation_md(activation), + nn.Dropout(dropout), + nn.Linear(dim_feedforward, d_model), + nn.Dropout(dropout), ) self.norm = nn.LayerNorm(d_model) @@ -137,56 +152,63 @@ def forward(self, tgt, memory): return tgt + class TransformerEncoder(nn.Module): - def __init__(self, encoder_layer, num_layers): - super().__init__() - self.layers = _get_clones(encoder_layer, num_layers) - self.num_layers = num_layers + def __init__(self, encoder_layer, num_layers): + super().__init__() + self.layers = _get_clones(encoder_layer, num_layers) + self.num_layers = num_layers + + def forward(self, src): + output = src - def forward(self, src): - output = src + for layer in self.layers: + output = layer(output) # (bs, patch_num, feature_dim) - for layer in self.layers: - output = layer(output) # (bs, patch_num, feature_dim) + return output - return output class TransformerDecoder(nn.Module): - def __init__(self, decoder_layer, num_layers): - super().__init__() - self.layers = _get_clones(decoder_layer, num_layers) - self.num_layers = num_layers + def __init__(self, decoder_layer, num_layers): + super().__init__() + self.layers = _get_clones(decoder_layer, num_layers) + self.num_layers = num_layers + + def forward(self, encoder_memory, query, return_intermedia=False): + query_output = query + intermedia = [] - def forward(self, encoder_memory, query, return_intermedia=False): - query_output = query - intermedia = [] + for i in range(len(self.layers)): + query_output = self.layers[i]( + query_output, encoder_memory + ) # (bs, query_num, feature_dim) + if return_intermedia: + intermedia.append(query_output) - for i in range(len(self.layers)): - query_output = self.layers[i](query_output, encoder_memory) # (bs, query_num, feature_dim) - if return_intermedia: - intermedia.append(query_output) + return query_output, intermedia - return query_output, intermedia def _get_clones(module, N): return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) + def _get_activation_fn(activation): - """Return an activation function given a string""" - if activation == "relu": - return F.relu - if activation == "gelu": - return F.gelu - if activation == "glu": - return F.glu - raise RuntimeError(F"activation should be relu/gelu, not {activation}.") + """Return an activation function given a string""" + if activation == "relu": + return F.relu + if activation == "gelu": + return F.gelu + if activation == "glu": + return F.glu + raise RuntimeError(f"activation should be relu/gelu, not {activation}.") + def _get_activation_md(activation): - """Return an activation function given a string""" - if activation == "relu": - return nn.ReLU() - if activation == "gelu": - return nn.GELU() - if activation == "glu": - return nn.GLU() - raise RuntimeError(F"activation should be relu/gelu, not {activation}.") + """Return an activation function given a string""" + if activation == "relu": + return nn.ReLU() + if activation == "gelu": + return nn.GELU() + if activation == "glu": + return nn.GLU() + raise RuntimeError(f"activation should be relu/gelu, not {activation}.") From 7b81d9aaeeba876659850dbdd2a318f76d7656df Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:30:21 -0500 Subject: [PATCH 30/62] Remove prompts directory. --- openpmcvl/granular/prompts/__init__.py | 0 .../granular/prompts/subcaption_system_prompt.txt | 10 ---------- 2 files changed, 10 deletions(-) delete mode 100644 openpmcvl/granular/prompts/__init__.py delete mode 100644 openpmcvl/granular/prompts/subcaption_system_prompt.txt diff --git a/openpmcvl/granular/prompts/__init__.py b/openpmcvl/granular/prompts/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/prompts/subcaption_system_prompt.txt b/openpmcvl/granular/prompts/subcaption_system_prompt.txt deleted file mode 100644 index 1180ca0..0000000 --- a/openpmcvl/granular/prompts/subcaption_system_prompt.txt +++ /dev/null @@ -1,10 +0,0 @@ -Subfigure labels are letters referring to individual subfigures within a larger figure. -Check if the caption contains explicit subfigure label. -If not or there is only one subfigure, output "NO" and end the generation. -If yes, output "YES", then generate the subcaption of the subfigures according to the caption. -The output should use the template: - YES - Subfigure-A: ... - Subfigure-B: ... - ...... -The label should be removed from subcaption. \ No newline at end of file From 2e6d0ffdb87588aec791f804e9c1b0932250d757 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:32:01 -0500 Subject: [PATCH 31/62] Finalize subfigure pipeline. --- openpmcvl/granular/pipeline/subfigure.py | 169 ++++++++++++----------- openpmcvl/granular/pipeline/subfigure.sh | 53 ++++--- 2 files changed, 121 insertions(+), 101 deletions(-) diff --git a/openpmcvl/granular/pipeline/subfigure.py b/openpmcvl/granular/pipeline/subfigure.py index f24056c..2adff09 100644 --- a/openpmcvl/granular/pipeline/subfigure.py +++ b/openpmcvl/granular/pipeline/subfigure.py @@ -1,23 +1,24 @@ import os -import json import argparse from pathlib import Path from typing import List, Tuple import numpy as np import torch -import torch.nn as nn from torch.utils.data import DataLoader from tqdm import tqdm from torchvision import utils as vutils -from PIL import Image from openpmcvl.granular.dataset.dataset import ( Fig_Separation_Dataset, fig_separation_collate, ) from openpmcvl.granular.models.subfigure_detector import FigCap_Former -from openpmcvl.granular.pipeline.utils import box_cxcywh_to_xyxy, find_jaccard_overlap +from openpmcvl.granular.pipeline.utils import ( + box_cxcywh_to_xyxy, + find_jaccard_overlap, + save_jsonl, +) def load_dataset(eval_file: str, batch_size: int, num_workers: int) -> DataLoader: @@ -42,6 +43,7 @@ def load_dataset(eval_file: str, batch_size: int, num_workers: int) -> DataLoade shuffle=False, num_workers=num_workers, collate_fn=fig_separation_collate, + pin_memory=True, ) @@ -143,86 +145,86 @@ def separate_subfigures( """ Path(save_path).mkdir(parents=True, exist_ok=True) subfig_list = [] + failed_subfig_list = [] subfig_count = 0 - with torch.no_grad(): - try: - for batch in tqdm( - loader, desc="Separating subfigures...", total=len(loader) - ): - image = batch["image"].to(device) - img_ids = batch["image_id"] - original_images = batch["original_image"] - unpadded_hws = batch["unpadded_hws"] - - output_det_class, output_box, _ = model(image, None) - - cpu_output_box = output_box.cpu() - cpu_output_det_class = output_det_class.cpu() - filter_mask = cpu_output_det_class.squeeze() > score_threshold - - for i in range(image.shape[0]): - det_boxes = cpu_output_box[i, filter_mask[i, :], :] - det_scores = cpu_output_det_class.squeeze()[ - i, filter_mask[i, :] - ].numpy() - img_id = img_ids[i].split(".jpg")[0] - unpadded_image = original_images[i] - original_h, original_w = unpadded_hws[i] - - scale = max(original_h, original_w) / 512 - - picked_bboxes, picked_scores = process_detections( - det_boxes, det_scores, nms_threshold + print("Separating subfigures...") + for batch in tqdm(loader, desc=f"File: {rcd_file}", total=len(loader)): + image = batch["image"].to(device) + img_ids = batch["image_id"] + original_images = batch["original_image"] + unpadded_hws = batch["unpadded_hws"] + + output_det_class, output_box, _ = model(image, None) + + output_box = output_box.cpu() + output_det_class = output_det_class.cpu() + filter_mask = output_det_class.squeeze() > score_threshold + + for i in range(image.shape[0]): + det_boxes = output_box[i, filter_mask[i, :], :] + det_scores = output_det_class.squeeze()[i, filter_mask[i, :]].numpy() + img_id = img_ids[i].split(".jpg")[0] + unpadded_image = original_images[i] + original_h, original_w = unpadded_hws[i] + + scale = max(original_h, original_w) / 512 + + picked_bboxes, picked_scores = process_detections( + det_boxes, det_scores, nms_threshold + ) + + for bbox, score in zip(picked_bboxes, picked_scores): + try: + subfig_path = f"{save_path}/{img_id}_{subfig_count}.jpg" + cx, cy, w, h = bbox + + # Calculate padding in terms of bounding box dimensions + pad_ratio = 0.01 + pad_w = w * pad_ratio + pad_h = h * pad_ratio + + # Adjust the coordinates with padding + x1 = round((cx - w / 2 - pad_w) * image.shape[3] * scale) + x2 = round((cx + w / 2 + pad_w) * image.shape[3] * scale) + y1 = round((cy - h / 2 - pad_h) * image.shape[2] * scale) + y2 = round((cy + h / 2 + pad_h) * image.shape[2] * scale) + + # Ensure the coordinates are within image boundaries + x1, x2 = [max(0, min(x, original_w - 1)) for x in [x1, x2]] + y1, y2 = [max(0, min(y, original_h - 1)) for y in [y1, y2]] + + subfig = unpadded_image[:, y1:y2, x1:x2].detach().cpu() + vutils.save_image(subfig, subfig_path) + + subfig_list.append( + { + "id": f"{img_id}_{subfig_count}.jpg", + "source_fig_id": img_id, + "PMC_ID": img_id.split("_")[0], + "media_name": f"{img_id}.jpg", + "position": [(x1, y1), (x2, y2)], + "score": score.item(), + "subfig_path": subfig_path, + } + ) + subfig_count += 1 + except ValueError: + print( + f"Crop Error: [x1 x2 y1 y2]:[{x1} {x2} {y1} {y2}], w:{original_w}, h:{original_h}" ) + failed_subfig_list.append( + { + "id": f"{img_id}_{subfig_count}.jpg", + "source_fig_id": img_id, + "PMC_ID": img_id.split("_")[0], + "media_name": f"{img_id}.jpg", + } + ) + continue - for bbox, score in zip(picked_bboxes, picked_scores): - try: - subfig_path = f"{save_path}/{img_id}_{subfig_count}.jpg" - cx, cy, w, h = bbox - - # Calculate padding in terms of bounding box dimensions - pad_ratio = 0.03 - pad_w = w * pad_ratio - pad_h = h * pad_ratio - - # Adjust the coordinates with padding - x1 = round((cx - w / 2 - pad_w) * image.shape[3] * scale) - x2 = round((cx + w / 2 + pad_w) * image.shape[3] * scale) - y1 = round((cy - h / 2 - pad_h) * image.shape[2] * scale) - y2 = round((cy + h / 2 + pad_h) * image.shape[2] * scale) - - # Ensure the coordinates are within image boundaries - x1, x2 = [max(0, min(x, original_w - 1)) for x in [x1, x2]] - y1, y2 = [max(0, min(y, original_h - 1)) for y in [y1, y2]] - - subfig = unpadded_image[:, y1:y2, x1:x2].to( - torch.device("cpu") - ) - vutils.save_image(subfig, subfig_path) - - subfig_list.append( - { - "id": f"{img_id}_{subfig_count}.jpg", - "source_fig_id": img_id, - "PMC_ID": img_id.split("_")[0], - "media_name": f"{img_id}.jpg", - "position": [(x1, y1), (x2, y2)], - "score": score.item(), - "subfig_path": subfig_path, - } - ) - subfig_count += 1 - except ValueError: - print( - f"Crop Error: [x1 x2 y1 y2]:[{x1} {x2} {y1} {y2}], w:{original_w}, h:{original_h}" - ) - except Exception as e: - print(f"Error occurred: {repr(e)}") - finally: - with open(rcd_file, "a") as f: - for line in subfig_list: - f.write(json.dumps(line) + "\n") + save_jsonl(subfig_list, rcd_file) + save_jsonl(failed_subfig_list, f"{rcd_file.split('.')[0]}_failed.jsonl") def main(args: argparse.Namespace) -> None: @@ -234,6 +236,7 @@ def main(args: argparse.Namespace) -> None: """ os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + torch.set_grad_enabled(False) model = load_separation_model(args.separation_model, device) dataloader = load_dataset(args.eval_file, args.batch_size, args.num_workers) @@ -246,13 +249,11 @@ def main(args: argparse.Namespace) -> None: nms_threshold=args.nms_threshold, device=device, ) - print("\nSubfigure separation and classification completed.\n") + print("\nSubfigure separation completed.\n") if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="Subfigure Separation and Classification Script" - ) + parser = argparse.ArgumentParser(description="Subfigure Separation Script") parser.add_argument( "--separation_model", diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index e106328..2f655ed 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -1,26 +1,45 @@ #!/bin/bash -#SBATCH -c 8 +#SBATCH -c 12 #SBATCH --gres=gpu:1 -#SBATCH --mem=32GB -#SBATCH --time=8:00:00 +#SBATCH --partition=a40 +#SBATCH --mem=100GB +#SBATCH --time=15:00:00 #SBATCH --job-name=subfigure #SBATCH --output=%x-%j.out -#SBATCH --gres=gpu:1 +# Activate the environment source /h/afallah/light/bin/activate +# Set the working directory cd /h/afallah/pmc-data-extraction -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ - --separation_model openpmcvl/granular/models/subfigure_detector.pth \ - --class_model openpmcvl/granular/models/resnext101_figure_class.pth \ - --eval_file /datasets/PMC-15M/granular/granular_meta.jsonl \ - --img_root /datasets/PMC-15M/figures \ - --save_path /datasets/PMC-15M/granular/subfigures \ - --rcd_file /datasets/PMC-15M/granular/subfigures.jsonl \ - --score_threshold 0.5 \ - --nms_threshold 0.4 \ - --batch_size 8 \ - --num_workers 4 \ - --gpu 0 - 2>&1 | tee -a %x-%j.out \ No newline at end of file +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." + exit 1 +fi + +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" + +# Iterate over each JSONL number +for num in $JSONL_NUMBERS; do + # Define the paths for the evaluation file and the record file + eval_file="/datasets/PMC-15M/granular/${num}_meta.jsonl" + rcd_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" + + # Run the subfigure separation script + stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ + --separation_model openpmcvl/granular/models/subfigure_detector.pth \ + --eval_file "$eval_file" \ + --save_path /datasets/PMC-15M/granular/${num}_subfigures \ + --rcd_file "$rcd_file" \ + --score_threshold 0.5 \ + --nms_threshold 0.4 \ + --batch_size 128 \ + --num_workers 8 \ + --gpu 0 + + # Print a message indicating the completion of processing for the current JSONL number + echo "Finished processing ${num}" +done From c8bba1d3992f1082cf18801987cdb95005843c70 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:33:02 -0500 Subject: [PATCH 32/62] pipeline/subcaption.py --- openpmcvl/granular/pipeline/subcaption.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index b9c7347..d1d7b0a 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -6,14 +6,16 @@ #SBATCH --job-name=subcaption #SBATCH --output=%x-%j.out +# Activate the environment source /h/afallah/light/bin/activate +# Set the working directory cd /h/afallah/pmc-data-extraction +# Run the subcaption script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ - --system-prompt-file openpmcvl/granular/prompts/subcaption_system_prompt.txt \ --base-url http://gpu030:8080/v1 \ --model /model-weights/Meta-Llama-3.1-8B-Instruct \ --max-tokens 500 \ From 2fee5e970d2f9c3820d272b5f9b28250d2de2a14 Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:33:19 -0500 Subject: [PATCH 33/62] Add subcaption pipeline. --- openpmcvl/granular/pipeline/subcaption.py | 26 +++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/openpmcvl/granular/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py index 0b8e387..8a8a671 100644 --- a/openpmcvl/granular/pipeline/subcaption.py +++ b/openpmcvl/granular/pipeline/subcaption.py @@ -1,10 +1,3 @@ -""" -File: subcaption.py ----------------------- -This script processes figure captions from a JSONL file, breaking them down into subcaptions -using a language model. It saves the results to a JSON file. -""" - import re import json import argparse @@ -16,6 +9,21 @@ from openpmcvl.granular.pipeline.utils import load_dataset +PROMPT = """ +Subfigure labels are letters referring to individual subfigures within a larger figure. +This is a caption: "%s" +Check if the caption contains explicit subfigure label. +If not, output "NO" and end the generation. +If yes, output "YES", then generate the subcaption of the subfigures according to the caption. +The output should use the template: + YES + Subfigure-A: ... + Subfigure-B: ... + ... +The label should be removed from subcaption. +""".strip() + + def process_caption( client: OpenAI, system_prompt: str, caption: str, model: str, max_tokens: int ) -> str: @@ -92,14 +100,14 @@ def main(args: argparse.Namespace) -> None: args (argparse.Namespace): Command-line arguments. """ # Initialize OpenAI client - client = OpenAI(base_url=args.base_url, api_key="EMPTY") + client = OpenAI() # base_url=args.base_url, api_key="EMPTY" # Load dataset dataset = load_dataset(args.input_file) print(f"\nDataset size: {len(dataset)}") # Load system prompt - with open(args.system_prompt_file, "r") as f: + with open(args.prompt_file, "r") as f: system_prompt = f.read().strip() # Inference loop From 995c83fe723ff3f42d3fb775191a5abc008e805a Mon Sep 17 00:00:00 2001 From: afallah Date: Sun, 5 Jan 2025 23:34:21 -0500 Subject: [PATCH 34/62] Add subfigure classification pipeline. --- openpmcvl/granular/pipeline/classify.py | 65 +++++++++++++++---------- openpmcvl/granular/pipeline/classify.sh | 42 +++++++++++----- 2 files changed, 70 insertions(+), 37 deletions(-) diff --git a/openpmcvl/granular/pipeline/classify.py b/openpmcvl/granular/pipeline/classify.py index 6cdc9dc..9757959 100644 --- a/openpmcvl/granular/pipeline/classify.py +++ b/openpmcvl/granular/pipeline/classify.py @@ -1,15 +1,14 @@ import argparse -import json from PIL import Image from typing import Any, Dict, List import torch import torch.nn as nn -from torch.utils.data import Dataset, DataLoader +from torch.utils.data import DataLoader from torchvision import models, transforms from tqdm import tqdm -from openpmcvl.granular.pipeline.utils import load_dataset +from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl from openpmcvl.granular.dataset.dataset import SubfigureDataset MEDICAL_CLASS = 15 @@ -44,6 +43,7 @@ def classify_dataset( batch_size: int, device: torch.device, output_file: str, + num_workers: int, ): """ Classifies images in a dataset using the provided model and saves results to a new JSONL file. @@ -54,7 +54,7 @@ def classify_dataset( batch_size (int): Batch size for processing. device (torch.device): Device to use for processing. output_file (str): Path to save the updated JSONL file with classification results. - + num_workers (int): Number of workers for processing. Returns: None """ @@ -68,35 +68,40 @@ def classify_dataset( ) dataset = SubfigureDataset(data_list, transform=transform) - dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=False) + dataloader = DataLoader( + dataset, + batch_size=batch_size, + shuffle=False, + num_workers=num_workers, + pin_memory=True, + ) model.eval() model.to(device) results = [] - with torch.no_grad(): - for images, items in tqdm(dataloader, desc="Classifying"): - images = images.to(device) - - outputs = model(images) + for images, indices in tqdm( + dataloader, desc=f"Classifying for {output_file}", total=len(dataloader) + ): + images = images.to(device) + outputs = model(images) - for output, item in zip(outputs, items): - sorted_pred = torch.argsort(output.cpu(), descending=True) - medical_class_rank = (sorted_pred == MEDICAL_CLASS).nonzero().item() - is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD + for output, idx in zip(outputs, indices): + sorted_pred = torch.argsort(output.cpu(), descending=True) + medical_class_rank = (sorted_pred == MEDICAL_CLASS).nonzero().item() + is_medical = medical_class_rank < CLASSIFICATION_THRESHOLD - # Update the item with the new keys - item["medical_class_rank"] = medical_class_rank - item["is_medical"] = is_medical + # Get the original item using the index + item = data_list[idx.item()] + result = { + **item, + "medical_class_rank": medical_class_rank, + "is_medical_subfigure": is_medical, + } + results.append(result) - # Append the updated item to results - results.append(item) - - # Save the updated items to a new JSONL file - with open(output_file, "w") as f: - for item in results: - f.write(json.dumps(item) + "\n") + save_jsonl(results, output_file) def main(args: argparse.Namespace) -> None: @@ -117,12 +122,19 @@ def main(args: argparse.Namespace) -> None: None """ device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + torch.set_grad_enabled(False) model = load_classification_model(args.model_path, device) dataset = load_dataset(args.dataset_path) + print(f"Loaded {len(dataset)} subfigures from {args.dataset_path}.") classify_dataset( - model, dataset, args.batch_size, device, args.dataset_path, args.output_file + model, + dataset, + args.batch_size, + device, + args.output_file, + args.num_workers, ) @@ -148,6 +160,9 @@ def main(args: argparse.Namespace) -> None: parser.add_argument( "--batch_size", type=int, default=128, help="Batch size for processing" ) + parser.add_argument( + "--num_workers", type=int, default=8, help="Number of workers for processing" + ) args = parser.parse_args() main(args) diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh index 8ff29e7..326f521 100644 --- a/openpmcvl/granular/pipeline/classify.sh +++ b/openpmcvl/granular/pipeline/classify.sh @@ -1,21 +1,39 @@ #!/bin/bash -#SBATCH -c 8 +#SBATCH -c 12 #SBATCH --gres=gpu:1 -#SBATCH --mem=48GB -#SBATCH --time=8:00:00 +#SBATCH --partition=a40 +#SBATCH --mem=100GB +#SBATCH --time=15:00:00 #SBATCH --job-name=classify #SBATCH --output=%x-%j.out -#SBATCH --gres=gpu:1 +# Activate the environment source /h/afallah/light/bin/activate +# Set the working directory cd /h/afallah/pmc-data-extraction -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ - --model_path openpmcvl/granular/models/resnext101_figure_class.pth \ - --dataset_path /datasets/PMC-15M/granular/subfigures.jsonl \ - --output_file /datasets/PMC-15M/granular/subfigures_classified.jsonl \ - --batch_size 128 \ - --num_workers 8 \ - --gpu 0 - 2>&1 | tee -a %x-%j.out \ No newline at end of file +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." + exit 1 +fi + +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" + +# Iterate over each JSONL number +for num in $JSONL_NUMBERS; do + input_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" + output_file="/datasets/PMC-15M/granular/${num}_subfigures_classified.jsonl" + + # Run the classification script + stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ + --model_path openpmcvl/granular/models/resnext101_figure_class.pth \ + --dataset_path "$input_file" \ + --output_file "$output_file" \ + --batch_size 256 \ + --num_workers 8 \ + + echo "Finished classifying ${num}" +done \ No newline at end of file From ac5bd0a981e59b803196eaf361b2ec77839b9c4e Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:01:22 -0500 Subject: [PATCH 35/62] Finalize preprocessing pipeline. --- openpmcvl/granular/pipeline/preprocess.py | 24 ++++++++++++++++++----- openpmcvl/granular/pipeline/preprocess.sh | 4 ++++ 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/openpmcvl/granular/pipeline/preprocess.py b/openpmcvl/granular/pipeline/preprocess.py index c3ca1d1..e9d40b8 100644 --- a/openpmcvl/granular/pipeline/preprocess.py +++ b/openpmcvl/granular/pipeline/preprocess.py @@ -45,7 +45,11 @@ def check_keywords(caption: str, keywords: Set[str]) -> Tuple[List[str], bool]: def process_single_file( - input_file: str, figure_root: str, keywords: Set[str], output_dir: str, position: int + input_file: str, + figure_root: str, + keywords: Set[str], + output_dir: str, + position: int, ) -> Tuple[List[dict], List[str], List[str]]: """ Process a single input file. @@ -67,8 +71,13 @@ def process_single_file( messages = [] # Use tqdm with position parameter - pbar = tqdm(data, desc=f"Processing {os.path.basename(input_file)}", - position=position, leave=True, ncols=100) + pbar = tqdm( + data, + desc=f"Processing {os.path.basename(input_file)}", + position=position, + leave=True, + ncols=100, + ) for item in pbar: pmc_id = item["PMC_ID"] @@ -118,7 +127,7 @@ def process_single_file( # Save processed data for this input file input_filename = os.path.splitext(os.path.basename(input_file))[0] - temp_output_file = os.path.join(output_dir, f"{input_filename}_processed.jsonl") + temp_output_file = os.path.join(output_dir, f"{input_filename}_meta.jsonl") save_jsonl(processed_data, temp_output_file) msg = ( f"\nProcessed {len(processed_data)} items from {input_file}. Saved to {temp_output_file}" @@ -160,7 +169,12 @@ def preprocess_data( } # Use tqdm to track overall progress - overall_pbar = tqdm(total=len(input_files), desc="Overall Progress", position=len(input_files), leave=True) + overall_pbar = tqdm( + total=len(input_files), + desc="Overall Progress", + position=len(input_files), + leave=True, + ) for future in as_completed(future_to_file): input_file = future_to_file[future] diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index 57c2672..227918f 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -6,10 +6,13 @@ #SBATCH --job-name=preprocess #SBATCH --output=%x-%j.out +# Activate the environment source /h/afallah/light/bin/activate +# Set the working directory cd /h/afallah/pmc-data-extraction +# Define the paths for the input and output files INPUT_DIR="/datasets/PMC-15M" OUTPUT_FILE="/datasets/PMC-15M/granular/granular_meta.jsonl" FIGURE_ROOT="/datasets/PMC-15M/figures" @@ -23,6 +26,7 @@ for num in $JSONL_NUMBERS; do INPUT_FILES+="$INPUT_DIR/$num.jsonl " done +# Run the preprocess script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ --input_files $INPUT_FILES \ --output_file $OUTPUT_FILE \ From 2c0e583aae1ab8ecac96d8b29e527a13d34902f8 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:07:48 -0500 Subject: [PATCH 36/62] Add alignment pipeline. --- openpmcvl/granular/pipeline/align.py | 102 ++++++++++++++------------- openpmcvl/granular/pipeline/align.sh | 57 +++++++++++++-- 2 files changed, 105 insertions(+), 54 deletions(-) diff --git a/openpmcvl/granular/pipeline/align.py b/openpmcvl/granular/pipeline/align.py index 754d9ed..4a5b4a0 100644 --- a/openpmcvl/granular/pipeline/align.py +++ b/openpmcvl/granular/pipeline/align.py @@ -1,38 +1,12 @@ +import os import argparse -import json -from pathlib import Path -from typing import List, Dict, Union +from typing import Dict from tqdm import tqdm -from openpmcvl.granular.process.playground_subfigure_ocr import classifier +from openpmcvl.granular.models.subfigure_ocr import classifier +from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl -def load_dataset(file_path: str) -> List[Dict]: - """ - Load dataset from a JSONL file. - - Args: - file_path (str): Path to the JSONL file - - Returns: - List[Dict]: List of dictionaries containing the JSONL data - """ - with open(file_path, 'r') as f: - return [json.loads(line) for line in f] - -def update_dataset(data: List[Dict], file_path: str) -> None: - """ - Save dataset to a JSONL file. - - Args: - data (List[Dict]): List of dictionaries to save - file_path (str): Path to the output JSONL file - """ - with open(file_path, 'w') as f: - for item in data: - json.dump(item, f) - f.write('\n') - def process_subfigure(model: classifier, subfig_data: Dict) -> Dict: """ Process a single subfigure using the OCR model. @@ -44,19 +18,26 @@ def process_subfigure(model: classifier, subfig_data: Dict) -> Dict: Returns: Dict: Updated subfigure data with OCR results """ - image_path = subfig_data['subfig_path'] - ocr_result = model.run(image_path) + if "subfig_path" not in subfig_data: + subfig_data["subfig_path"] = f"{args.root_dir}/images/{subfig_data['image']}" + + try: + ocr_result = model.run(subfig_data["subfig_path"]) + except Exception as e: + ocr_result = "" + print(f"Error processing subfigure {subfig_data['image']}: {e}") if ocr_result: label_letter, *label_position = ocr_result - subfig_data['label'] = f"Subfigure-{label_letter.upper()}" - subfig_data['label_position'] = label_position + subfig_data["label"] = f"Subfigure-{label_letter.upper()}" + subfig_data["label_position"] = label_position else: - subfig_data['label'] = "" - subfig_data['label_position'] = [] + subfig_data["label"] = "" + subfig_data["label_position"] = [] return subfig_data + def main(args: argparse.Namespace) -> None: """ Main function to process subfigures and update JSONL file. @@ -67,23 +48,48 @@ def main(args: argparse.Namespace) -> None: # Load model and dataset model = classifier() dataset = load_dataset(args.dataset_path) - - # Process each subfigure - updated_data = [] - for item in tqdm(dataset, desc="Processing subfigures", total=len(dataset)): - updated_item = process_subfigure(model, item) - updated_data.append(updated_item) + if args.dataset_slice: + dataset = dataset[args.dataset_slice] + # dataset = [data for data in dataset if data["is_medical_subfigure"]] + print( + f"Total {len(dataset)} medical subfigures from {os.path.basename(args.dataset_path)}" + ) + + # Label each subfigure + labeled_dataset = [] + for data in tqdm(dataset, desc="Labeling subfigures", total=len(dataset)): + updated_item = process_subfigure(model, data) + labeled_dataset.append(updated_item) + + total_labeled = len([data for data in labeled_dataset if data["label"]]) + print(f"Total {total_labeled} subfigures labeled.") # Save updated data - update_dataset(updated_data, args.save_path) - print(f"\nUpdated data saved to {args.save_path}\n") + save_jsonl(labeled_dataset, args.save_path) + print(f"\nLabeled data saved to {args.save_path}\n") if __name__ == "__main__": parser = argparse.ArgumentParser(description="Subfigure OCR and Labeling") - parser.add_argument('--dataset_path', type=str, required=True, help='Path to input JSONL file') - parser.add_argument('--save_path', type=str, required=True, help='Path to output JSONL file') - + parser.add_argument( + "--root_dir", type=str, required=True, help="Path to root directory" + ) + parser.add_argument( + "--dataset_path", type=str, required=True, help="Path to input JSONL file" + ) + parser.add_argument( + "--dataset_slice", + type=str, + help="Start and end indices for dataset slice (e.g. '0:100')", + ) + parser.add_argument( + "--save_path", type=str, required=True, help="Path to output JSONL file" + ) + args = parser.parse_args() - main(args) \ No newline at end of file + if args.dataset_slice: + start, end = map(int, args.dataset_slice.split(":")) + args.dataset_slice = slice(start, end) + + main(args) diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index 7902d8c..f059e7c 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -1,17 +1,62 @@ #!/bin/bash #SBATCH -c 6 #SBATCH --gres=gpu:1 +#SBATCH --partition=a40 #SBATCH --mem=32GB -#SBATCH --time=8:00:00 -#SBATCH --job-name=subfigure +#SBATCH --time=12:00:00 +#SBATCH --job-name=align #SBATCH --output=%x-%j.out -#SBATCH --gres=gpu:1 +#SBATCH --error=%x-%j.err +# Activate the environment source /h/afallah/light/bin/activate +# Set the working directory cd /h/afallah/pmc-data-extraction +# Check if the correct number of arguments are provided +if [ $# -lt 2 ]; then + echo "Please provide: begin index and end index as arguments." + exit 1 +fi + +BEGIN_IDX=$1 +END_IDX=$2 + +# Define the root directory +root_dir="/projects/multimodal/datasets/pmc_oa" + +# Define the input and output files +input_file="${root_dir}/pmc_oa.jsonl" +output_file="${root_dir}/pmc_oa_labeled/pmc_oa_aligned_${BEGIN_IDX}_${END_IDX}.jsonl" + +# Print the alignment range +echo "Aligning from index ${BEGIN_IDX} to ${END_IDX}" + +# Run the alignment script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ - --dataset_path /datasets/PMC-15M/granular/subfigures2.jsonl \ - --save_path /datasets/PMC-15M/granular/subfigures_labeled2.jsonl \ - 2>&1 | tee -a %x-%j.out \ No newline at end of file + --root_dir "$root_dir" \ + --dataset_path "$input_file" \ + --save_path "$output_file" \ + --dataset_slice "${BEGIN_IDX}:${END_IDX}" + +echo "Finished aligning from index ${BEGIN_IDX} to ${END_IDX}" + +# Original loop commented out: +# if [ $# -eq 0 ]; then +# echo "Please provide JSONL numbers as arguments." +# exit 1 +# fi +# +# JSONL_NUMBERS="$@" +# +# for num in $JSONL_NUMBERS; do +# input_file="/datasets/PMC-15M/granular/${num}_subfigures_classified.jsonl" +# output_file="/datasets/PMC-15M/granular/${num}_subfigures_aligned.jsonl" +# +# stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ +# --dataset_path "$input_file" \ +# --save_path "$output_file" \ +# +# echo "Finished aligning ${num}" +# done \ No newline at end of file From 0fb6462ca6238d99404f59a0ad8161c5d3f33220 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:26:36 -0500 Subject: [PATCH 37/62] Add config for yolov model. --- .../granular/config/yolov3_default_subfig.cfg | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 openpmcvl/granular/config/yolov3_default_subfig.cfg diff --git a/openpmcvl/granular/config/yolov3_default_subfig.cfg b/openpmcvl/granular/config/yolov3_default_subfig.cfg new file mode 100644 index 0000000..7a879f4 --- /dev/null +++ b/openpmcvl/granular/config/yolov3_default_subfig.cfg @@ -0,0 +1,34 @@ +MODEL: + TYPE: YOLOv3 + BACKBONE: darknet53 + ANCHORS: [[6, 7], [9, 10], [10, 14], + [13, 11], [16, 15], [15, 20], + [21, 19], [24, 24], [34, 31]] + ANCH_MASK: [[6, 7, 8], [3, 4, 5], [0, 1, 2]] + N_CLASSES: 15 +TRAIN: + LR: 0.001 + MOMENTUM: 0.9 + DECAY: 0.0005 + BURN_IN: 1000 + MAXITER: 20000 + STEPS: (400000, 450000) + BATCHSIZE: 4 + SUBDIVISION: 16 + IMGSIZE: 608 + LOSSTYPE: l2 + IGNORETHRE: 0.7 +AUGMENTATION: + RANDRESIZE: True + JITTER: 0.3 + RANDOM_PLACING: True + HUE: 0.1 + SATURATION: 1.5 + EXPOSURE: 1.5 + LRFLIP: False + RANDOM_DISTORT: True +TEST: + CONFTHRE: 0.8 + NMSTHRE: 0.1 + IMGSIZE: 416 +NUM_GPUS: 1 From 9bd713a7f628887e8156090e090b4fdc1a8abd7e Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:27:02 -0500 Subject: [PATCH 38/62] Add path to checkpoints in classifier and subfigure model. --- openpmcvl/granular/pipeline/classify.sh | 2 +- openpmcvl/granular/pipeline/subfigure.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh index 326f521..8a8c872 100644 --- a/openpmcvl/granular/pipeline/classify.sh +++ b/openpmcvl/granular/pipeline/classify.sh @@ -29,7 +29,7 @@ for num in $JSONL_NUMBERS; do # Run the classification script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ - --model_path openpmcvl/granular/models/resnext101_figure_class.pth \ + --model_path openpmcvl/granular/checkpoints/resnext101_figure_class.pth \ --dataset_path "$input_file" \ --output_file "$output_file" \ --batch_size 256 \ diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index 2f655ed..c58e9a0 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -30,7 +30,7 @@ for num in $JSONL_NUMBERS; do # Run the subfigure separation script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ - --separation_model openpmcvl/granular/models/subfigure_detector.pth \ + --separation_model openpmcvl/granular/checkpoints/subfigure_detector.pth \ --eval_file "$eval_file" \ --save_path /datasets/PMC-15M/granular/${num}_subfigures \ --rcd_file "$rcd_file" \ From 980b677c60ae82ecaa7738faa8dc231510e93657 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:27:35 -0500 Subject: [PATCH 39/62] Add subfigure detection and ocr models. --- openpmcvl/granular/models/network.py | 424 ++++++++++++ openpmcvl/granular/models/process.py | 248 +++++++ openpmcvl/granular/models/subfigure_ocr.py | 186 +++++ openpmcvl/granular/models/yolo_layer.py | 767 +++++++++++++++++++++ openpmcvl/granular/models/yolov3.py | 327 +++++++++ 5 files changed, 1952 insertions(+) create mode 100644 openpmcvl/granular/models/network.py create mode 100644 openpmcvl/granular/models/process.py create mode 100644 openpmcvl/granular/models/subfigure_ocr.py create mode 100644 openpmcvl/granular/models/yolo_layer.py create mode 100644 openpmcvl/granular/models/yolov3.py diff --git a/openpmcvl/granular/models/network.py b/openpmcvl/granular/models/network.py new file mode 100644 index 0000000..bde68da --- /dev/null +++ b/openpmcvl/granular/models/network.py @@ -0,0 +1,424 @@ +import torch +import torch.nn as nn +from torch.utils.model_zoo import load_url as load_state_dict_from_url + + +def get_model_urls(): + model_urls = { + "resnet18": "https://download.pytorch.org/models/resnet18-5c106cde.pth", + "resnet34": "https://download.pytorch.org/models/resnet34-333f7ec4.pth", + "resnet50": "https://download.pytorch.org/models/resnet50-19c8e357.pth", + "resnet101": "https://download.pytorch.org/models/resnet101-5d3b4d8f.pth", + "resnet152": "https://download.pytorch.org/models/resnet152-b121ed2d.pth", + "resnext50_32x4d": "https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth", + "resnext101_32x8d": "https://download.pytorch.org/models/resnext101_32x8d-8ba56ff5.pth", + "wide_resnet50_2": "https://download.pytorch.org/models/wide_resnet50_2-95faca4d.pth", + "wide_resnet101_2": "https://download.pytorch.org/models/wide_resnet101_2-32ee1156.pth", + } + return model_urls + + +def conv3x3(in_planes, out_planes, stride=1, groups=1, dilation=1): + """3x3 convolution with padding""" + return nn.Conv2d( + in_planes, + out_planes, + kernel_size=3, + stride=stride, + padding=dilation, + groups=groups, + bias=False, + dilation=dilation, + ) + + +def conv1x1(in_planes, out_planes, stride=1): + """1x1 convolution""" + return nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=stride, bias=False) + + +class BasicBlock(nn.Module): + expansion = 1 + __constants__ = ["downsample"] + + def __init__( + self, + inplanes, + planes, + stride=1, + downsample=None, + groups=1, + base_width=64, + dilation=1, + norm_layer=None, + ): + super(BasicBlock, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + if groups != 1 or base_width != 64: + raise ValueError("BasicBlock only supports groups=1 and base_width=64") + if dilation > 1: + raise NotImplementedError("Dilation > 1 not supported in BasicBlock") + # Both self.conv1 and self.downsample layers downsample the input when stride != 1 + self.conv1 = conv3x3(inplanes, planes, stride) + self.bn1 = norm_layer(planes) + self.relu = nn.ReLU(inplace=True) + self.conv2 = conv3x3(planes, planes) + self.bn2 = norm_layer(planes) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class Bottleneck(nn.Module): + expansion = 4 + __constants__ = ["downsample"] + + def __init__( + self, + inplanes, + planes, + stride=1, + downsample=None, + groups=1, + base_width=64, + dilation=1, + norm_layer=None, + ): + super(Bottleneck, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + width = int(planes * (base_width / 64.0)) * groups + # Both self.conv2 and self.downsample layers downsample the input when stride != 1 + self.conv1 = conv1x1(inplanes, width) + self.bn1 = norm_layer(width) + self.conv2 = conv3x3(width, width, stride, groups, dilation) + self.bn2 = norm_layer(width) + self.conv3 = conv1x1(width, planes * self.expansion) + self.bn3 = norm_layer(planes * self.expansion) + self.relu = nn.ReLU(inplace=True) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + + out = self.conv2(out) + out = self.bn2(out) + out = self.relu(out) + + out = self.conv3(out) + out = self.bn3(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out += identity + out = self.relu(out) + + return out + + +class ResNet(nn.Module): + + def __init__( + self, + block, + layers, + num_classes=30, + zero_init_residual=False, + groups=1, + width_per_group=64, + replace_stride_with_dilation=None, + norm_layer=None, + ): + super(ResNet, self).__init__() + if norm_layer is None: + norm_layer = nn.BatchNorm2d + self._norm_layer = norm_layer + + self.inplanes = 64 + self.dilation = 1 + if replace_stride_with_dilation is None: + # each element in the tuple indicates if we should replace + # the 2x2 stride with a dilated convolution instead + replace_stride_with_dilation = [False, False, False] + if len(replace_stride_with_dilation) != 3: + raise ValueError( + "replace_stride_with_dilation should be None " + "or a 3-element tuple, got {}".format(replace_stride_with_dilation) + ) + self.groups = groups + self.base_width = width_per_group + self.conv1 = nn.Conv2d( + 3, self.inplanes, kernel_size=3, stride=1, padding=1, bias=False + ) + self.bn1 = norm_layer(self.inplanes) + self.relu = nn.ReLU(inplace=True) + self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1) + self.layer1 = self._make_layer(block, 64, layers[0]) + self.layer2 = self._make_layer( + block, 128, layers[1], stride=2, dilate=replace_stride_with_dilation[0] + ) + self.layer3 = self._make_layer( + block, 256, layers[2], stride=2, dilate=replace_stride_with_dilation[1] + ) + self.layer4 = self._make_layer( + block, 512, layers[3], stride=2, dilate=replace_stride_with_dilation[2] + ) + self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) + self.fc = nn.Linear(512 * block.expansion, num_classes) + + for m in self.modules(): + if isinstance(m, nn.Conv2d): + nn.init.kaiming_normal_(m.weight, mode="fan_out", nonlinearity="relu") + elif isinstance(m, (nn.BatchNorm2d, nn.GroupNorm)): + nn.init.constant_(m.weight, 1) + nn.init.constant_(m.bias, 0) + + # Zero-initialize the last BN in each residual branch, + # so that the residual branch starts with zeros, and each residual block behaves like an identity. + # This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677 + if zero_init_residual: + for m in self.modules(): + if isinstance(m, Bottleneck): + nn.init.constant_(m.bn3.weight, 0) + elif isinstance(m, BasicBlock): + nn.init.constant_(m.bn2.weight, 0) + + def _make_layer(self, block, planes, blocks, stride=1, dilate=False): + norm_layer = self._norm_layer + downsample = None + previous_dilation = self.dilation + if dilate: + self.dilation *= stride + stride = 1 + if stride != 1 or self.inplanes != planes * block.expansion: + downsample = nn.Sequential( + conv1x1(self.inplanes, planes * block.expansion, stride), + norm_layer(planes * block.expansion), + ) + + layers = [] + layers.append( + block( + self.inplanes, + planes, + stride, + downsample, + self.groups, + self.base_width, + previous_dilation, + norm_layer, + ) + ) + self.inplanes = planes * block.expansion + for _ in range(1, blocks): + layers.append( + block( + self.inplanes, + planes, + groups=self.groups, + base_width=self.base_width, + dilation=self.dilation, + norm_layer=norm_layer, + ) + ) + + return nn.Sequential(*layers) + + def _forward(self, x): + x = self.conv1(x) + x = self.bn1(x) + x = self.relu(x) + # x = self.maxpool(x) + + x = self.layer1(x) + # print(x.size()) + x = self.layer2(x) + # print(x.size()) + x = self.layer3(x) + # print(x.size()) + x = self.layer4(x) + # print(x.size()) + + x = self.avgpool(x) + x = torch.flatten(x, 1) + x = self.fc(x) + + return x + + # Allow for accessing forward method in a inherited class + forward = _forward + + +def _resnet(arch, block, layers, pretrained, progress, **kwargs): + model = ResNet(block, layers, **kwargs) + if pretrained: + model_urls = get_model_urls() + state_dict = load_state_dict_from_url(model_urls[arch], progress=progress) + model.load_state_dict(state_dict) + return model + + +def resnet18(pretrained=False, progress=True, **kwargs): + r"""ResNet-18 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet("resnet18", BasicBlock, [2, 2, 2, 2], pretrained, progress, **kwargs) + + +def resnet34(pretrained=False, progress=True, **kwargs): + r"""ResNet-34 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet("resnet34", BasicBlock, [3, 4, 6, 3], pretrained, progress, **kwargs) + + +def resnet50(pretrained=False, progress=True, **kwargs): + r"""ResNet-50 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet("resnet50", Bottleneck, [3, 4, 6, 3], pretrained, progress, **kwargs) + + +def resnet101(pretrained=False, progress=True, **kwargs): + r"""ResNet-101 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet( + "resnet101", Bottleneck, [3, 4, 23, 3], pretrained, progress, **kwargs + ) + + +def resnet152(pretrained=False, progress=True, **kwargs): + r"""ResNet-152 model from + `"Deep Residual Learning for Image Recognition" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + return _resnet( + "resnet152", Bottleneck, [3, 8, 36, 3], pretrained, progress, **kwargs + ) + + +def resnext50_32x4d(pretrained=False, progress=True, **kwargs): + r"""ResNeXt-50 32x4d model from + `"Aggregated Residual Transformation for Deep Neural Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs["groups"] = 32 + kwargs["width_per_group"] = 4 + return _resnet( + "resnext50_32x4d", Bottleneck, [3, 4, 6, 3], pretrained, progress, **kwargs + ) + + +def resnext101_32x8d(pretrained=False, progress=True, **kwargs): + r"""ResNeXt-101 32x8d model from + `"Aggregated Residual Transformation for Deep Neural Networks" `_ + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs["groups"] = 32 + kwargs["width_per_group"] = 8 + return _resnet( + "resnext101_32x8d", Bottleneck, [3, 4, 23, 3], pretrained, progress, **kwargs + ) + + +def wide_resnet50_2(pretrained=False, progress=True, **kwargs): + r"""Wide ResNet-50-2 model from + `"Wide Residual Networks" `_ + + The model is the same as ResNet except for the bottleneck number of channels + which is twice larger in every block. The number of channels in outer 1x1 + convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 + channels, and in Wide ResNet-50-2 has 2048-1024-2048. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs["width_per_group"] = 64 * 2 + return _resnet( + "wide_resnet50_2", Bottleneck, [3, 4, 6, 3], pretrained, progress, **kwargs + ) + + +def wide_resnet101_2(pretrained=False, progress=True, **kwargs): + r"""Wide ResNet-101-2 model from + `"Wide Residual Networks" `_ + + The model is the same as ResNet except for the bottleneck number of channels + which is twice larger in every block. The number of channels in outer 1x1 + convolutions is the same, e.g. last block in ResNet-50 has 2048-512-2048 + channels, and in Wide ResNet-50-2 has 2048-1024-2048. + + Args: + pretrained (bool): If True, returns a model pre-trained on ImageNet + progress (bool): If True, displays a progress bar of the download to stderr + """ + kwargs["width_per_group"] = 64 * 2 + return _resnet( + "wide_resnet101_2", Bottleneck, [3, 4, 23, 3], pretrained, progress, **kwargs + ) + + +if __name__ == "__main__": + __all__ = [ + "ResNet", + "resnet18", + "resnet34", + "resnet50", + "resnet101", + "resnet152", + "resnext50_32x4d", + "resnext101_32x8d", + "wide_resnet50_2", + "wide_resnet101_2", + ] diff --git a/openpmcvl/granular/models/process.py b/openpmcvl/granular/models/process.py new file mode 100644 index 0000000..58e9e66 --- /dev/null +++ b/openpmcvl/granular/models/process.py @@ -0,0 +1,248 @@ +from __future__ import division + +import torch +import cv2 +import numpy as np + + +def label2yolobox(labels, info_img, maxsize, lrflip): + """ + Transform coco labels to yolo box labels + Args: + labels (numpy.ndarray): label data whose shape is :math:`(N, 5)`. + Each label consists of [class, x1, y1, x2, y2] where \ + class (float): class index. + x1, y1, x2, y2 (float) : coordinates of \ + left-top and right-bottom points of bounding boxes. + Values range from 0 to width or height of the image. + info_img : tuple of h, w, nh, nw, dx, dy. + h, w (int): original shape of the image + nh, nw (int): shape of the resized image without padding + dx, dy (int): pad size + maxsize (int): target image size after pre-processing + lrflip (bool): horizontal flip flag + + Returns: + labels:label data whose size is :math:`(N, 5)`. + Each label consists of [class, xc, yc, w, h] where + class (float): class index. + xc, yc (float) : center of bbox whose values range from 0 to 1. + w, h (float) : size of bbox whose values range from 0 to 1. + """ + h, w, nh, nw, dx, dy = info_img + x1 = labels[:, 1] / w + y1 = labels[:, 2] / h + x2 = (labels[:, 1] + labels[:, 3]) / w + y2 = (labels[:, 2] + labels[:, 4]) / h + labels[:, 1] = (((x1 + x2) / 2) * nw + dx) / maxsize + labels[:, 2] = (((y1 + y2) / 2) * nh + dy) / maxsize + labels[:, 3] *= nw / w / maxsize + labels[:, 4] *= nh / h / maxsize + if lrflip: + labels[:, 1] = 1 - labels[:, 1] + return labels + + +def yolobox2label(box, info_img): + """ + Transform yolo box labels to yxyx box labels. + Args: + box (list): box data with the format of [yc, xc, w, h] + in the coordinate system after pre-processing. + info_img : tuple of h, w, nh, nw, dx, dy. + h, w (int): original shape of the image + nh, nw (int): shape of the resized image without padding + dx, dy (int): pad size + Returns: + label (list): box data with the format of [y1, x1, y2, x2] + in the coordinate system of the input image. + """ + h, w, nh, nw, dx, dy = info_img + y1, x1, y2, x2 = box + box_h = ((y2 - y1) / nh) * h + box_w = ((x2 - x1) / nw) * w + y1 = ((y1 - dy) / nh) * h + x1 = ((x1 - dx) / nw) * w + label = [max(x1, 0), max(y1, 0), min(x1 + box_w, w), min(y1 + box_h, h)] + return label + + +def nms(bbox, thresh, score=None, limit=None): + """Suppress bounding boxes according to their IoUs and confidence scores. + Args: + bbox (array): Bounding boxes to be transformed. The shape is + :math:`(R, 4)`. :math:`R` is the number of bounding boxes. + thresh (float): Threshold of IoUs. + score (array): An array of confidences whose shape is :math:`(R,)`. + limit (int): The upper bound of the number of the output bounding + boxes. If it is not specified, this method selects as many + bounding boxes as possible. + Returns: + array: + An array with indices of bounding boxes that are selected. \ + They are sorted by the scores of bounding boxes in descending \ + order. \ + The shape of this array is :math:`(K,)` and its dtype is\ + :obj:`numpy.int32`. Note that :math:`K \\leq R`. + + from: https://github.com/chainer/chainercv + """ + + if len(bbox) == 0: + return np.zeros((0,), dtype=np.int32) + + if score is not None: + order = score.argsort()[::-1] + bbox = bbox[order] + bbox_area = np.prod(bbox[:, 2:] - bbox[:, :2], axis=1) + + selec = np.zeros(bbox.shape[0], dtype=bool) + for i, b in enumerate(bbox): + tl = np.maximum(b[:2], bbox[selec, :2]) + br = np.minimum(b[2:], bbox[selec, 2:]) + area = np.prod(br - tl, axis=1) * (tl < br).all(axis=1) + + iou = area / (bbox_area[i] + bbox_area[selec] - area) + if (iou >= thresh).any(): + continue + + selec[i] = True + if limit is not None and np.count_nonzero(selec) >= limit: + break + + selec = np.where(selec)[0] + if score is not None: + selec = order[selec] + return selec.astype(np.int32) + + +def postprocess(prediction, dtype, conf_thre=0.7, nms_thre=0.45): + """ + Postprocess for the output of YOLO model + perform box transformation, specify the class for each detection, + and perform class-wise non-maximum suppression. + Args: + prediction (torch tensor): The shape is :math:`(N, B, 4)`. + :math:`N` is the number of predictions, + :math:`B` the number of boxes. The last axis consists of + :math:`xc, yc, w, h` where `xc` and `yc` represent a center + of a bounding box. + num_classes (int): + number of dataset classes. + conf_thre (float): + confidence threshold ranging from 0 to 1, + which is defined in the config file. + nms_thre (float): + IoU threshold of non-max suppression ranging from 0 to 1. + + Returns: + output (list of torch tensor): + + """ + box_corner = prediction.new(prediction.shape) + box_corner[:, :, 0] = prediction[:, :, 0] - prediction[:, :, 2] / 2 + box_corner[:, :, 1] = prediction[:, :, 1] - prediction[:, :, 3] / 2 + box_corner[:, :, 2] = prediction[:, :, 0] + prediction[:, :, 2] / 2 + box_corner[:, :, 3] = prediction[:, :, 1] + prediction[:, :, 3] / 2 + prediction[:, :, :4] = box_corner[:, :, :4] + + output = [None for _ in range(len(prediction))] + for i, image_pred in enumerate(prediction): + # Filter out confidence scores below threshold + conf_mask = (image_pred[:, 4] >= conf_thre).squeeze() + image_pred = image_pred[conf_mask] + + # If none are remaining => process next image + if not image_pred.size(0): + continue + # Get score and class with highest confidence + class_conf = torch.ones(image_pred[:, 4:5].size()).type(dtype) + class_pred = torch.zeros(image_pred[:, 4:5].size()).type(dtype) + + # Detections ordered as (x1, y1, x2, y2, obj_conf, class_conf, class_pred) + detections = torch.cat( + (image_pred[:, :5], class_conf.float(), class_pred.float()), 1 + ) + # Iterate through all predicted classes + unique_labels = detections[:, -1].cpu().unique() + if prediction.is_cuda: + unique_labels = unique_labels.cuda() + for c in unique_labels: + # Get the detections with the particular class + detections_class = detections[detections[:, -1] == c] + nms_in = detections_class.cpu().numpy() + nms_out_index = nms( + nms_in[:, :4], nms_thre, score=nms_in[:, 4] * nms_in[:, 5] + ) + detections_class = detections_class[nms_out_index] + if output[i] is None: + output[i] = detections_class + else: + output[i] = torch.cat((output[i], detections_class)) + + return output + + +def preprocess_mask(mask, imgsize, info_img): + h, w, nh, nw, dx, dy = info_img + sized = np.ones((imgsize, imgsize, 1), dtype=np.uint8) * 127 + mask = cv2.resize(mask, (nw, nh)) + sized[dy : dy + nh, dx : dx + nw, 0] = mask + + return sized + + +def preprocess(img, imgsize, jitter, random_placing=False): + """ + Image preprocess for yolo input + Pad the shorter side of the image and resize to (imgsize, imgsize) + Args: + img (numpy.ndarray): input image whose shape is :math:`(H, W, C)`. + Values range from 0 to 255. + imgsize (int): target image size after pre-processing + jitter (float): amplitude of jitter for resizing + random_placing (bool): if True, place the image at random position + + Returns: + img (numpy.ndarray): input image whose shape is :math:`(C, imgsize, imgsize)`. + Values range from 0 to 1. + info_img : tuple of h, w, nh, nw, dx, dy. + h, w (int): original shape of the image + nh, nw (int): shape of the resized image without padding + dx, dy (int): pad size + """ + h, w, _ = img.shape + img = img[:, :, ::-1] + assert img is not None + + if jitter > 0: + # add jitter + dw = jitter * w + dh = jitter * h + new_ar = (w + np.random.uniform(low=-dw, high=dw)) / ( + h + np.random.uniform(low=-dh, high=dh) + ) + else: + new_ar = w / h + + if new_ar < 1: + nh = imgsize + nw = nh * new_ar + else: + nw = imgsize + nh = nw / new_ar + nw, nh = int(max(nw, 1)), int(max(nh, 1)) + + if random_placing: + dx = int(np.random.uniform(imgsize - nw)) + dy = int(np.random.uniform(imgsize - nh)) + else: + dx = (imgsize - nw) // 2 + dy = (imgsize - nh) // 2 + + img = cv2.resize(img, (nw, nh)) + sized = np.ones((imgsize, imgsize, 3), dtype=np.uint8) * 127 + sized[dy : dy + nh, dx : dx + nw, :] = img + + info_img = (h, w, nh, nw, dx, dy) + return sized, info_img diff --git a/openpmcvl/granular/models/subfigure_ocr.py b/openpmcvl/granular/models/subfigure_ocr.py new file mode 100644 index 0000000..0b4a15c --- /dev/null +++ b/openpmcvl/granular/models/subfigure_ocr.py @@ -0,0 +1,186 @@ +import os +import yaml +import torch +from skimage import io +import numpy as np +import cv2 +from torch.autograd import Variable +from PIL import Image +import torch.nn.functional as F + +from openpmcvl.granular.models.yolov3 import YOLOv3 +from openpmcvl.granular.models.network import resnet152 +from openpmcvl.granular.models.process import preprocess, postprocess, yolobox2label + + +class classifier: + def __init__(self): + + self.current_dir = os.path.dirname(os.path.abspath(__file__)) + configuration_file = os.path.join( + self.current_dir, "..", "config", "yolov3_default_subfig.cfg" + ) + + with open(configuration_file, "r") as f: + configuration = yaml.load(f, Loader=yaml.FullLoader) + + self.image_size = configuration["TEST"]["IMGSIZE"] + self.nms_threshold = configuration["TEST"]["NMSTHRE"] + self.confidence_threshold = 0.0001 + self.dtype = torch.cuda.FloatTensor + self.device = torch.device("cuda") + + object_detection_model = YOLOv3(configuration["MODEL"]) + self.object_detection_model = self.load_model_from_checkpoint( + object_detection_model, "object_detection_model.pt" + ) + ## Load text recognition model + text_recognition_model = resnet152() + self.text_recognition_model = self.load_model_from_checkpoint( + text_recognition_model, "text_recognition_model.pt" + ) + + self.object_detection_model.eval() + self.text_recognition_model.eval() + + def load_model_from_checkpoint(self, model, model_name): + """load checkpoint weights into model""" + checkpoints_path = os.path.join(self.current_dir, "..", "checkpoints") + checkpoint = os.path.join(checkpoints_path, model_name) + model.load_state_dict(torch.load(checkpoint)) + # model = nn.DataParallel(model) + model.to(self.device) + return model + + def detect_subfigure_boundaries(self, figure_path): + """Detects the bounding boxes of subfigures in figure_path + + Args: + figure_path: A string, path to an image of a figure + from a scientific journal + Returns: + subfigure_info (list of lists): Each inner list is + x1, y1, x2, y2, confidence + """ + + ## Preprocess the figure for the models + img = io.imread(figure_path) + if len(np.shape(img)) == 2: + img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) + else: + img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB) + + img, info_img = preprocess(img, self.image_size, jitter=0) + img = np.transpose(img / 255.0, (2, 0, 1)) + img = np.copy(img) + img = torch.from_numpy(img).float().unsqueeze(0) + img = Variable(img.type(self.dtype)) + + img_raw = Image.open(figure_path).convert("RGB") + width, height = img_raw.size + + ## Run model on figure + with torch.no_grad(): + outputs = self.object_detection_model(img.to(self.device)) + outputs = postprocess( + outputs, + dtype=self.dtype, + conf_thre=self.confidence_threshold, + nms_thre=self.nms_threshold, + ) + + ## Reformat model outputs to display bounding boxes in our desired format + ## List of lists where each inner list is [x1, y1, x2, y2, confidence] + subfigure_info = list() + + if outputs[0] is None: + return subfigure_info + + for x1, y1, x2, y2, conf, cls_conf, cls_pred in outputs[0]: + box = yolobox2label( + [ + y1.data.cpu().numpy(), + x1.data.cpu().numpy(), + y2.data.cpu().numpy(), + x2.data.cpu().numpy(), + ], + info_img, + ) + box[0] = int(min(max(box[0], 0), width - 1)) + box[1] = int(min(max(box[1], 0), height - 1)) + box[2] = int(min(max(box[2], 0), width)) + box[3] = int(min(max(box[3], 0), height)) + # ensures no extremely small (likely incorrect) boxes are counted + small_box_threshold = 5 + if ( + box[2] - box[0] > small_box_threshold + and box[3] - box[1] > small_box_threshold + ): + box.append("%.3f" % (cls_conf.item())) + subfigure_info.append(box) + return subfigure_info + + def detect_subfigure_labels(self, figure_path, subfigure_info): + """Uses text recognition to read subfigure labels from figure_path + + Note: + To get sensible results, should be run only after + detect_subfigure_boundaries has been run + Args: + figure_path (str): A path to the image (.png, .jpg, or .gif) + file containing the article figure + subfigure_info (list of lists): Details about bounding boxes + of each subfigure from detect_subfigure_boundaries(). Each + inner list has format [x1, y1, x2, y2, confidence] where + x1, y1 are upper left bounding box coordinates as ints, + x2, y2, are lower right, and confidence the models confidence + Returns: + subfigure_info (list of tuples): Details about bounding boxes and + labels of each subfigure in figure. Tuples for each subfigure are + (x1, y1, x2, y2, label) where x1, y1 are upper left x and y coord + divided by image width/height and label is the an integer n + meaning the label is the nth letter + concate_img (np.ndarray): A numpy array representing the figure. + Used in classify_subfigures. Ideally this will be removed to + increase modularity. + """ + img_raw = Image.open(figure_path).convert("RGB") + img_raw = img_raw.copy() + width, height = img_raw.size + binary_img = np.zeros((height, width, 1)) + + detected_label_and_bbox = None + max_confidence = 0.0 + for subfigure in subfigure_info: + ## Preprocess the image for the model + bbox = tuple(subfigure[:4]) + img_patch = img_raw.crop(bbox) + img_patch = np.array(img_patch)[:, :, ::-1] + img_patch, _ = preprocess(img_patch, 28, jitter=0) + img_patch = np.transpose(img_patch / 255.0, (2, 0, 1)) + img_patch = torch.from_numpy(img_patch).type(self.dtype).unsqueeze(0) + + ## Run model on figure + label_prediction = self.text_recognition_model(img_patch.to(self.device)) + label_confidence = np.amax( + F.softmax(label_prediction, dim=1).data.cpu().numpy() + ) + x1, y1, x2, y2, box_confidence = subfigure + total_confidence = float(box_confidence) * label_confidence + if total_confidence < max_confidence: + continue + label_value = chr( + label_prediction.argmax(dim=1).data.cpu().numpy()[0] + ord("a") + ) + if label_value == "z": + continue + # if (x2-x1) < 64 and (y2-y1)< 64: + detected_label_and_bbox = [label_value, x1, y1, x2, y2] + + return detected_label_and_bbox + + def run(self, figure_path): + subfigure_info = self.detect_subfigure_boundaries(figure_path) + subfigure_info = self.detect_subfigure_labels(figure_path, subfigure_info) + + return subfigure_info diff --git a/openpmcvl/granular/models/yolo_layer.py b/openpmcvl/granular/models/yolo_layer.py new file mode 100644 index 0000000..aeecd7e --- /dev/null +++ b/openpmcvl/granular/models/yolo_layer.py @@ -0,0 +1,767 @@ +import torch +import torch.nn as nn +import numpy as np +import warnings +import cv2 +from openpmcvl.granular.models.network import resnet152 +from openpmcvl.granular.models.process import preprocess + + + +def bboxes_iou(bboxes_a, bboxes_b, xyxy=True): + """Calculate the Intersection of Unions (IoUs) between bounding boxes. + IoU is calculated as a ratio of area of the intersection + and area of the union. + + Args: + bbox_a (array): An array whose shape is :math:`(N, 4)`. + :math:`N` is the number of bounding boxes. + The dtype should be :obj:`numpy.float32`. + bbox_b (array): An array similar to :obj:`bbox_a`, + whose shape is :math:`(K, 4)`. + The dtype should be :obj:`numpy.float32`. + Returns: + array: + An array whose shape is :math:`(N, K)`. \ + An element at index :math:`(n, k)` contains IoUs between \ + :math:`n` th bounding box in :obj:`bbox_a` and :math:`k` th bounding \ + box in :obj:`bbox_b`. + + from: https://github.com/chainer/chainercv + """ + if bboxes_a.shape[1] != 4 or bboxes_b.shape[1] != 4: + raise IndexError + + # top left + if xyxy: + tl = torch.max(bboxes_a[:, None, :2], bboxes_b[:, :2]) + # bottom right + br = torch.min(bboxes_a[:, None, 2:], bboxes_b[:, 2:]) + area_a = torch.prod(bboxes_a[:, 2:] - bboxes_a[:, :2], 1) + area_b = torch.prod(bboxes_b[:, 2:] - bboxes_b[:, :2], 1) + else: + tl = torch.max( + (bboxes_a[:, None, :2] - bboxes_a[:, None, 2:] / 2), + (bboxes_b[:, :2] - bboxes_b[:, 2:] / 2), + ) + # bottom right + br = torch.min( + (bboxes_a[:, None, :2] + bboxes_a[:, None, 2:] / 2), + (bboxes_b[:, :2] + bboxes_b[:, 2:] / 2), + ) + + area_a = torch.prod(bboxes_a[:, 2:], 1) + area_b = torch.prod(bboxes_b[:, 2:], 1) + en = (tl < br).type(tl.type()).prod(dim=2) + area_i = torch.prod(br - tl, 2) * en # * ((tl < br).all()) + return area_i / (area_a[:, None] + area_b - area_i) + + +class YOLOLayer(nn.Module): + """ + detection layer corresponding to yolo_layer.c of darknet + """ + + def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): + """ + Args: + config_model (dict) : model configuration. + ANCHORS (list of tuples) : + ANCH_MASK: (list of int list): index indicating the anchors to be + used in YOLO layers. One of the mask group is picked from the list. + N_CLASSES (int): number of classes + layer_no (int): YOLO layer number - one from (0, 1, 2). + in_ch (int): number of input channels. + ignore_thre (float): threshold of IoU above which objectness training is ignored. + """ + + super(YOLOLayer, self).__init__() + strides = [32, 16, 8] # fixed + self.anchors = config_model["ANCHORS"] + self.n_anchors = len(self.anchors) + # self.anch_mask = config_model['ANCH_MASK'][layer_no] + # self.n_anchors = len(self.anch_mask) + self.n_classes = config_model["N_CLASSES"] + self.ignore_thre = ignore_thre + # self.l2_loss = nn.MSELoss(size_average=False) + # self.bce_loss = nn.BCELoss(size_average=False) + self.l2_loss = nn.MSELoss(reduction="sum") + self.bce_loss = nn.BCELoss(reduction="sum") + + self.stride = strides[layer_no] + self.all_anchors_grid = [ + (w / self.stride, h / self.stride) for w, h in self.anchors + ] + self.masked_anchors = self.all_anchors_grid + self.ref_anchors = np.zeros((len(self.all_anchors_grid), 4)) + self.ref_anchors[:, 2:] = np.array(self.all_anchors_grid) + self.ref_anchors = torch.FloatTensor(self.ref_anchors) + self.conv = nn.Conv2d( + in_channels=in_ch, + out_channels=self.n_anchors * 5, + kernel_size=1, + stride=1, + padding=0, + ) + self.classifier_model = resnet152() + + def forward(self, xin, compound_labels=None): + """ + In this + Args: + xin (torch.Tensor): input feature map whose size is :math:`(N, C, H, W)`, \ + where N, C, H, W denote batchsize, channel width, height, width respectively. + labels (torch.Tensor): label data whose size is :math:`(N, K, 5)`. \ + N and K denote batchsize and number of labels. + Each label consists of [class, xc, yc, w, h]: + class (float): class index. + xc, yc (float) : center of bbox whose values range from 0 to 1. + w, h (float) : size of bbox whose values range from 0 to 1. + Returns: + loss (torch.Tensor): total loss - the target of backprop. + loss_xy (torch.Tensor): x, y loss - calculated by binary cross entropy (BCE) \ + with boxsize-dependent weights. + loss_wh (torch.Tensor): w, h loss - calculated by l2 without size averaging and \ + with boxsize-dependent weights. + loss_obj (torch.Tensor): objectness loss - calculated by BCE. + loss_cls (torch.Tensor): classification loss - calculated by BCE for each class. + loss_l2 (torch.Tensor): total l2 loss - only for logging. + """ + output = self.conv(xin) + + batchsize = output.shape[0] + fsize = output.shape[2] + n_ch = 5 + dtype = torch.cuda.FloatTensor if xin.is_cuda else torch.FloatTensor + + output = output.view(batchsize, self.n_anchors, n_ch, fsize, fsize) + output = output.permute(0, 1, 3, 4, 2) # .contiguous() + + # logistic activation for xy, obj, cls + output[..., np.r_[:2, 4:n_ch]] = torch.sigmoid(output[..., np.r_[:2, 4:n_ch]]) + + # Suppresses incorrect UserWarning about a non-writeable Numpy array + # PR with fix accepted shortly after torch 1.7.1 release + # https://github.com/pytorch/pytorch/pull/47271 + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + # calculate pred - xywh obj cls + x_shift = dtype( + np.broadcast_to(np.arange(fsize, dtype=np.float32), output.shape[:4]) + ) + y_shift = dtype( + np.broadcast_to( + np.arange(fsize, dtype=np.float32).reshape(fsize, 1), output.shape[:4] + ) + ) + + masked_anchors = np.array(self.masked_anchors) + + w_anchors = dtype( + np.broadcast_to( + np.reshape(masked_anchors[:, 0], (1, self.n_anchors, 1, 1)), + output.shape[:4], + ) + ) + h_anchors = dtype( + np.broadcast_to( + np.reshape(masked_anchors[:, 1], (1, self.n_anchors, 1, 1)), + output.shape[:4], + ) + ) + + pred = output.clone() + pred[..., 0] += x_shift + pred[..., 1] += y_shift + pred[..., 2] = torch.exp(pred[..., 2]) * w_anchors + pred[..., 3] = torch.exp(pred[..., 3]) * h_anchors + + if compound_labels is None: # not training + pred[..., :4] *= self.stride + return pred.reshape(batchsize, -1, n_ch).data + + pred = pred[..., :4].data + + # target assignment + + tgt_mask = torch.zeros(batchsize, self.n_anchors, fsize, fsize, 4).type(dtype) + obj_mask = torch.ones(batchsize, self.n_anchors, fsize, fsize).type(dtype) + tgt_scale = torch.zeros(batchsize, self.n_anchors, fsize, fsize, 2).type(dtype) + + target = torch.zeros(batchsize, self.n_anchors, fsize, fsize, n_ch).type(dtype) + + labels, imgs = compound_labels + imgs = imgs.data.cpu().numpy() + labels = labels.cpu().data + nlabel = (labels.sum(dim=2) > 0).sum(dim=1) # number of objects + + truth_x_all = labels[:, :, 1] * fsize + truth_y_all = labels[:, :, 2] * fsize + truth_w_all = labels[:, :, 3] * fsize + truth_h_all = labels[:, :, 4] * fsize + truth_i_all = truth_x_all.to(torch.int16).numpy() + truth_j_all = truth_y_all.to(torch.int16).numpy() + + for b in range(batchsize): + n = int(nlabel[b]) + if n == 0: + continue + img = imgs[b].transpose((1, 2, 0))[:, :, ::-1] + truth_box = dtype(np.zeros((n, 4))) + truth_box[:n, 2] = truth_w_all[b, :n] + truth_box[:n, 3] = truth_h_all[b, :n] + truth_i = truth_i_all[b, :n] + truth_j = truth_j_all[b, :n] + + # calculate iou between truth and reference anchors + anchor_ious_all = bboxes_iou(truth_box.cpu(), self.ref_anchors) + best_n_all = np.argmax(anchor_ious_all, axis=1) + + truth_box[:n, 0] = truth_x_all[b, :n] + truth_box[:n, 1] = truth_y_all[b, :n] + + pred_ious = bboxes_iou(pred[b].view(-1, 4), truth_box, xyxy=False) + pred_best_iou, pred_best_iou_index = pred_ious.max(dim=1) + pred_best_iou = pred_best_iou.view(pred[b].shape[:3]) + not_obj_mask = pred_best_iou < 0.3 + + is_obj_mask = pred_best_iou > 0.7 + pred_best_iou_index = pred_best_iou_index.view(pred[b].shape[:3]) + + obj_mask[b] = (not_obj_mask + is_obj_mask).type(dtype) + + # encourage bbox with over 0.7 IOU + rp_index = np.nonzero(is_obj_mask) + for rp_i in range(rp_index.size()[0]): + rp_anchor, rp_i, rp_j = rp_index[rp_i] + truth_box_index = int(pred_best_iou_index[rp_anchor, rp_i, rp_j]) + target[b, rp_anchor, rp_i, rp_j, 4] = 1 + + # target label for the bbox + reference_label = int(labels[b, truth_box_index, 0]) + + self.classifier_model.eval() + + pred_x, pred_y, pred_w, pred_h = ( + pred[b, rp_anchor, rp_i, rp_j, :4] * self.stride + ) + x1 = int(min(max(pred_x - pred_w / 2, 0), img.shape[0] - 1)) + y1 = int(min(max(pred_y - pred_h / 2, 0), img.shape[0] - 1)) + x2 = int(min(max(pred_x + pred_w / 2, 0), img.shape[0] - 1)) + y2 = int(min(max(pred_y + pred_h / 2, 0), img.shape[0] - 1)) + # print(x1,y1,x2,y2) + if (x1 + 2 < x2) and (y1 + 2 < y2): + patch = np.uint8(255 * img[y1:y2, x1:x2]) + # print("patch size is", patch.shape) + patch, _ = preprocess(patch, 28, jitter=0) + patch = np.transpose(patch / 255.0, (2, 0, 1)) + patch = torch.from_numpy(patch).unsqueeze(0).type(dtype) + pred_label = int( + self.classifier_model(patch).argmax(dim=1).data.cpu().numpy()[0] + ) + + if pred_label == reference_label: + target[b, rp_anchor, rp_i, rp_j, 4] = 1 + else: + # print("%d/%d, pred=%d, gt=%d"%(rp_i,int(rp_index.size()[0]),pred_label,reference_label)) + target[b, rp_anchor, rp_i, rp_j, 4] = 0 + else: + target[b, rp_anchor, rp_i, rp_j, 4] = 0 + + for ti in range(best_n_all.shape[0]): + # if best_n_mask[ti] == 1: + i, j = truth_i[ti], truth_j[ti] + a = best_n_all[ti] + obj_mask[b, a, j, i] = 1 + tgt_mask[b, a, j, i, :] = 1 + target[b, a, j, i, 0] = truth_x_all[b, ti] - i + target[b, a, j, i, 1] = truth_y_all[b, ti] - j + target[b, a, j, i, 2] = torch.log( + truth_w_all[b, ti] / w_anchors[b, a, j, i] + 1e-16 + ) + target[b, a, j, i, 3] = torch.log( + truth_h_all[b, ti] / h_anchors[b, a, j, i] + 1e-16 + ) + target[b, a, j, i, 4] = 1 + tgt_scale[b, a, j, i, :] = torch.sqrt( + 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize + ) + + # loss calculation + + output[..., 4] *= obj_mask + output[..., np.r_[0:4]] *= tgt_mask + output[..., 2:4] *= tgt_scale + + target[..., 4] *= obj_mask + target[..., np.r_[0:4]] *= tgt_mask + target[..., 2:4] *= tgt_scale + + bceloss = nn.BCELoss( + weight=tgt_scale * tgt_scale, reduction="sum" + ) # weighted BCEloss + loss_xy = bceloss(output[..., :2], target[..., :2]) + loss_wh = self.l2_loss(output[..., 2:4], target[..., 2:4]) / 2 + loss_obj = self.bce_loss(output[..., 4], target[..., 4]) + loss_cls = 0 # self.bce_loss(output[..., 5:], target[..., 5:]) + loss_l2 = self.l2_loss(output, target) + + loss = loss_xy + loss_wh + loss_obj + loss_cls + + return loss, loss_xy, loss_wh, loss_obj, loss_cls, loss_l2 + + +class YOLOimgLayer(nn.Module): + """ + detection layer corresponding to yolo_layer.c of darknet + """ + + def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): + """ + Args: + config_model (dict) : model configuration. + ANCHORS (list of tuples) : + ANCH_MASK: (list of int list): index indicating the anchors to be + used in YOLO layers. One of the mask group is picked from the list. + N_CLASSES (int): number of classes + layer_no (int): YOLO layer number - one from (0, 1, 2). + in_ch (int): number of input channels. + ignore_thre (float): threshold of IoU above which objectness training is ignored. + """ + + super(YOLOimgLayer, self).__init__() + strides = [32, 16, 8] # fixed + self.anchors = config_model["ANCHORS"] + self.n_anchors = len(self.anchors) + # self.anch_mask = config_model['ANCH_MASK'][layer_no] + # self.n_anchors = len(self.anch_mask) + self.n_classes = config_model["N_CLASSES"] + self.ignore_thre = ignore_thre + self.l2_loss = nn.MSELoss(reduction="sum") + self.bce_loss = nn.BCELoss(reduction="sum") + self.stride = strides[layer_no] + self.all_anchors_grid = [ + (w / self.stride, h / self.stride) for w, h in self.anchors + ] + self.masked_anchors = self.all_anchors_grid + # self.masked_anchors = [self.all_anchors_grid[i] + # for i in self.anch_mask] + self.ref_anchors = np.zeros((len(self.all_anchors_grid), 4)) + self.ref_anchors[:, 2:] = np.array(self.all_anchors_grid) + self.ref_anchors = torch.FloatTensor(self.ref_anchors) + self.conv = nn.Conv2d( + in_channels=in_ch, + out_channels=self.n_anchors * (self.n_classes + 5), + kernel_size=1, + stride=1, + padding=0, + ) + + def forward(self, xin, all_labels=None): + """ + In this + Args: + xin (torch.Tensor): input feature map whose size is :math:`(N, C, H, W)`, \ + where N, C, H, W denote batchsize, channel width, height, width respectively. + labels (torch.Tensor): label data whose size is :math:`(N, K, 5)`. \ + N and K denote batchsize and number of labels. + Each label consists of [class, xc, yc, w, h]: + class (float): class index. + xc, yc (float) : center of bbox whose values range from 0 to 1. + w, h (float) : size of bbox whose values range from 0 to 1. + Returns: + loss (torch.Tensor): total loss - the target of backprop. + loss_xy (torch.Tensor): x, y loss - calculated by binary cross entropy (BCE) \ + with boxsize-dependent weights. + loss_wh (torch.Tensor): w, h loss - calculated by l2 without size averaging and \ + with boxsize-dependent weights. + loss_obj (torch.Tensor): objectness loss - calculated by BCE. + loss_cls (torch.Tensor): classification loss - calculated by BCE for each class. + loss_l2 (torch.Tensor): total l2 loss - only for logging. + """ + output = self.conv(xin) + labels, prior_labels = all_labels + + batchsize = output.shape[0] + fsize = output.shape[2] + n_ch = 5 + self.n_classes + dtype = torch.cuda.FloatTensor if xin.is_cuda else torch.FloatTensor + + output = output.view(batchsize, self.n_anchors, n_ch, fsize, fsize) + output = output.permute(0, 1, 3, 4, 2) # .contiguous() + # print(output.size()) + + # logistic activation for xy, obj, cls + output[..., np.r_[:2, 4:n_ch]] = torch.sigmoid(output[..., np.r_[:2, 4:n_ch]]) + # output[..., np.r_[2:n_ch]] = torch.sigmoid( + # output[..., np.r_[2:n_ch]]) + + # calculate pred - xywh obj cls + + x_shift = dtype( + np.broadcast_to(np.arange(fsize, dtype=np.float32), output.shape[:4]) + ) + y_shift = dtype( + np.broadcast_to( + np.arange(fsize, dtype=np.float32).reshape(fsize, 1), output.shape[:4] + ) + ) + + masked_anchors = np.array(self.masked_anchors) + + w_anchors = dtype( + np.broadcast_to( + np.reshape(masked_anchors[:, 0], (1, self.n_anchors, 1, 1)), + output.shape[:4], + ) + ) + h_anchors = dtype( + np.broadcast_to( + np.reshape(masked_anchors[:, 1], (1, self.n_anchors, 1, 1)), + output.shape[:4], + ) + ) + + pred = output.clone() + pred[..., :2] -= 0.5 + pred[..., 0] *= w_anchors + pred[..., 1] *= h_anchors + pred[..., 0] += x_shift + pred[..., 1] += y_shift + pred[..., 2] = torch.exp(pred[..., 2]) * w_anchors + pred[..., 3] = torch.exp(pred[..., 3]) * h_anchors + + prior_labels = prior_labels.cpu().data + nprior_label = (prior_labels.sum(dim=2) > 0).sum(dim=1) + truth_x_all_sub = prior_labels[:, :, 1] * fsize + truth_y_all_sub = prior_labels[:, :, 2] * fsize + truth_i_all_sub = truth_x_all_sub.to(torch.int16).numpy() + truth_j_all_sub = truth_y_all_sub.to(torch.int16).numpy() + + # pred_mask = dtype(np.zeros((batchsize, self.n_anchors, fsize, fsize, n_ch))) + # for b in range(batchsize): + # for ti in range(nprior_label[b]): + # i,j = truth_i_all_sub[b,ti], truth_j_all_sub[b,ti] + # best_anchor = torch.argmax(pred[b,:,j,i,4]) + # i_best = min(max(int(pred[b,best_anchor,j,i,0].to(torch.int16).cpu().numpy()),0),fsize-1) + # j_best = min(max(int(pred[b,best_anchor,j,i,1].to(torch.int16).cpu().numpy()),0),fsize-1) + # # if labels is None: + # # pass + # # else: + # # pred_mask[b,:,j,i,:] = 1 + # pred_mask[b,:,j,i,:] = 1 + # pred_mask[b,best_anchor,j_best,i_best,:] = 1 + # pred *= pred_mask + + if labels is None: # not training + pred[..., :4] *= self.stride + return pred.data + # return pred.view(batchsize, -1, n_ch).data + + pred = pred[..., :4].data + + # target assignment + tgt_mask = torch.zeros(batchsize, self.n_anchors, fsize, fsize, n_ch).type( + dtype + ) + in_grid_distance = torch.zeros(batchsize, 80, 2).type(dtype) + + # tgt_mask = torch.zeros(batchsize, self.n_anchors, + # fsize, fsize, 4 + self.n_classes).type(dtype) + # # obj_mask = torch.ones(batchsize, self.n_anchors, + # # fsize, fsize).type(dtype) + # obj_mask = torch.zeros(batchsize, self.n_anchors, + # fsize, fsize).type(dtype) + tgt_scale = torch.zeros(batchsize, self.n_anchors, fsize, fsize, 2).type(dtype) + + target = torch.zeros(batchsize, self.n_anchors, fsize, fsize, n_ch).type(dtype) + + labels = labels.cpu().data + nlabel = (labels.sum(dim=2) > 0).sum(dim=1) # number of objects + # assert nprior_label == nlabel + + truth_x_all = labels[:, :, 1] * fsize + truth_y_all = labels[:, :, 2] * fsize + truth_w_all = labels[:, :, 3] * fsize + truth_h_all = labels[:, :, 4] * fsize + # truth_i_all = truth_x_all.to(torch.int16).numpy() + # truth_j_all = truth_y_all.to(torch.int16).numpy() + + # pred_areas = torch.zeros(batchsize).type(dtype) + # target_areas = torch.zeros(batchsize).type(dtype) + for b in range(batchsize): + n = int(nlabel[b]) + if n == 0: + continue + truth_box = dtype(np.zeros((n, 4))) + truth_box[:n, 2] = truth_w_all[b, :n] + truth_box[:n, 3] = truth_h_all[b, :n] + truth_i = truth_i_all_sub[b, :n] + truth_j = truth_j_all_sub[b, :n] + + # calculate iou between truth and reference anchors + anchor_ious_all = bboxes_iou(truth_box, (self.ref_anchors).type(dtype)) + best_n_all = torch.argmax(anchor_ious_all, dim=1) + + truth_box[:n, 0] = truth_x_all[b, :n] + truth_box[:n, 1] = truth_y_all[b, :n] + + # pred_ious = bboxes_iou( + # pred[b].view(-1, 4), truth_box, xyxy=False) + # pred_best_iou, _ = pred_ious.max(dim=1) + # pred_best_iou = (pred_best_iou > self.ignore_thre) + # pred_best_iou = pred_best_iou.view(pred[b].shape[:3]) + # # set mask to zero (ignore) if pred matches truth + # obj_mask[b] = 1- pred_best_iou + + # if sum(best_n_mask) == 0: + # continue + + for ti in range(n): + i, j = truth_i[ti], truth_j[ti] + + # find box with iou over 0.7 and under 0.3 (achor point) + current_truth_box = truth_box[ti : ti + 1] + current_pred_boxes = pred[b, :, j, i, :4] + pred_ious = bboxes_iou( + current_truth_box, current_pred_boxes, xyxy=False + ) + good_anchor_index = torch.nonzero((pred_ious > 0.7)[0]).cpu().numpy() + bad_anchor_index = torch.nonzero((pred_ious < 0.3)[0]).cpu().numpy() + # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) + for good_i in range(len(good_anchor_index)): + a = good_anchor_index[good_i] + tgt_mask[b, a, j, i, :] = 1 + target[b, a, j, i, 0] = torch.clamp( + (truth_x_all[b, ti] - i) + / torch.Tensor(self.masked_anchors)[a, 0] + + 0.5, + 0, + 1, + ) + target[b, a, j, i, 1] = torch.clamp( + (truth_y_all[b, ti] - j) + / torch.Tensor(self.masked_anchors)[a, 1] + + 0.5, + 0, + 1, + ) + target[b, a, j, i, 2] = torch.log( + truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + + 1e-16 + ) + target[b, a, j, i, 3] = torch.log( + truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + + 1e-16 + ) + target[b, a, j, i, 4] = 1 + target[b, a, j, i, 5 + labels[b, ti, 0].to(torch.int16).numpy()] = 1 + tgt_scale[b, a, j, i, :] = torch.sqrt( + 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize + ) + + i_best = min( + max(int(pred[b, a, j, i, 0].cpu().numpy()), 0), fsize - 1 + ) + j_best = min( + max(int(pred[b, a, j, i, 1].cpu().numpy()), 0), fsize - 1 + ) + current_pred_boxes_2 = pred[b, :, j_best, i_best, :4] + pred_ious_2 = bboxes_iou( + current_truth_box, current_pred_boxes_2, xyxy=False + ) + good_anchor_index_2 = ( + torch.nonzero((pred_ious_2 > 0.7)[0]).cpu().numpy() + ) + bad_anchor_index_2 = ( + torch.nonzero((pred_ious_2 < 0.3)[0]).cpu().numpy() + ) + # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) + for good_i_2 in range(len(good_anchor_index_2)): + a = good_anchor_index_2[good_i_2] + tgt_mask[b, a, j_best, i_best, :] = 1 + target[b, a, j_best, i_best, 0] = torch.clamp( + (truth_x_all[b, ti] - i_best) + / torch.Tensor(self.masked_anchors)[a, 0] + + 0.5, + 0, + 1, + ) + target[b, a, j_best, i_best, 1] = torch.clamp( + (truth_y_all[b, ti] - j_best) + / torch.Tensor(self.masked_anchors)[a, 1] + + 0.5, + 0, + 1, + ) + target[b, a, j_best, i_best, 2] = torch.log( + truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + + 1e-16 + ) + target[b, a, j_best, i_best, 3] = torch.log( + truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + + 1e-16 + ) + target[b, a, j_best, i_best, 4] = 1 + target[ + b, + a, + j_best, + i_best, + 5 + labels[b, ti, 0].to(torch.int16).numpy(), + ] = 1 + tgt_scale[b, a, j_best, i_best, :] = torch.sqrt( + 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize + ) + + for bad_i_2 in range(len(bad_anchor_index_2)): + a = bad_anchor_index_2[bad_i_2] + tgt_mask[b, a, j_best, i_best, 4:] = 1 + + for bad_i in range(len(bad_anchor_index)): + a = bad_anchor_index[bad_i] + tgt_mask[b, a, j, i, 4:] = 1 + + # best anchor box + a = best_n_all[ti] + tgt_mask[b, a, j, i, :] = 1 + target[b, a, j, i, 0] = torch.clamp( + (truth_x_all[b, ti] - i) / torch.Tensor(self.masked_anchors)[a, 0] + + 0.5, + 0, + 1, + ) + target[b, a, j, i, 1] = torch.clamp( + (truth_y_all[b, ti] - j) / torch.Tensor(self.masked_anchors)[a, 1] + + 0.5, + 0, + 1, + ) + target[b, a, j, i, 2] = torch.log( + truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16 + ) + target[b, a, j, i, 3] = torch.log( + truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16 + ) + target[b, a, j, i, 4] = 1 + target[b, a, j, i, 5 + labels[b, ti, 0].to(torch.int16).numpy()] = 1 + tgt_scale[b, a, j, i, :] = torch.sqrt( + 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize + ) + + i_best = min(max(int(pred[b, a, j, i, 0].cpu().numpy()), 0), fsize - 1) + j_best = min(max(int(pred[b, a, j, i, 1].cpu().numpy()), 0), fsize - 1) + + # find box with iou over 0.7 and under 0.3 (predict center) + current_truth_box = truth_box[ti : ti + 1] + current_pred_boxes = pred[b, :, j_best, i_best, :4] + pred_ious = bboxes_iou( + current_truth_box, current_pred_boxes, xyxy=False + ) + good_anchor_index = torch.nonzero((pred_ious > 0.7)[0]).cpu().numpy() + bad_anchor_index = torch.nonzero((pred_ious < 0.3)[0]).cpu().numpy() + # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) + for good_i in range(len(good_anchor_index)): + a = good_anchor_index[good_i] + tgt_mask[b, a, j_best, i_best, :] = 1 + target[b, a, j_best, i_best, 0] = torch.clamp( + (truth_x_all[b, ti] - i_best) + / torch.Tensor(self.masked_anchors)[a, 0] + + 0.5, + 0, + 1, + ) + target[b, a, j_best, i_best, 1] = torch.clamp( + (truth_y_all[b, ti] - j_best) + / torch.Tensor(self.masked_anchors)[a, 1] + + 0.5, + 0, + 1, + ) + target[b, a, j_best, i_best, 2] = torch.log( + truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + + 1e-16 + ) + target[b, a, j_best, i_best, 3] = torch.log( + truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + + 1e-16 + ) + target[b, a, j_best, i_best, 4] = 1 + target[ + b, + a, + j_best, + i_best, + 5 + labels[b, ti, 0].to(torch.int16).numpy(), + ] = 1 + tgt_scale[b, a, j_best, i_best, :] = torch.sqrt( + 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize + ) + + for bad_i in range(len(bad_anchor_index)): + a = bad_anchor_index[bad_i] + tgt_mask[b, a, j_best, i_best, 4:] = 1 + + a = best_n_all[ti] + tgt_mask[b, a, j_best, i_best, :] = 1 + target[b, a, j_best, i_best, 0] = torch.clamp( + (truth_x_all[b, ti] - i_best) + / torch.Tensor(self.masked_anchors)[a, 0] + + 0.5, + 0, + 1, + ) + target[b, a, j_best, i_best, 1] = torch.clamp( + (truth_y_all[b, ti] - j_best) + / torch.Tensor(self.masked_anchors)[a, 1] + + 0.5, + 0, + 1, + ) + target[b, a, j_best, i_best, 2] = torch.log( + truth_w_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 0] + 1e-16 + ) + target[b, a, j_best, i_best, 3] = torch.log( + truth_h_all[b, ti] / torch.Tensor(self.masked_anchors)[a, 1] + 1e-16 + ) + target[b, a, j_best, i_best, 4] = 1 + target[ + b, a, j_best, i_best, 5 + labels[b, ti, 0].to(torch.int16).numpy() + ] = 1 + tgt_scale[b, a, j_best, i_best, :] = torch.sqrt( + 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize + ) + + # in_grid_distance[b,ti,0] += target[b, a, j_best, i_best, 0] + # in_grid_distance[b,ti,1] += target[b, a, j_best, i_best, 1] + + # loss calculation + + output *= tgt_mask + target *= tgt_mask + target_in_grid_distance = torch.zeros(batchsize, 80, 2).type(dtype) + + # output[..., 4] *= obj_mask + # output[..., np.r_[0:4, 5:n_ch]] *= tgt_mask + output[..., 2:4] *= tgt_scale + + # target[..., 4] *= obj_mask + # target[..., np.r_[0:4, 5:n_ch]] *= tgt_mask + target[..., 2:4] *= tgt_scale + + bceloss = nn.BCELoss( + weight=tgt_scale * tgt_scale, reduction="sum" + ) # weighted BCEloss + loss_xy = bceloss(output[..., :2], target[..., :2]) + loss_wh = self.l2_loss(output[..., 2:4], target[..., 2:4]) / 2 + loss_obj = self.bce_loss(output[..., 4], target[..., 4]) + loss_cls = self.bce_loss(output[..., 5:], target[..., 5:]) + loss_l2 = self.l2_loss(output, target) + loss_in_grid = self.bce_loss(in_grid_distance, target_in_grid_distance) + + # target_areas = torch.ones(batchsize).type(dtype) + # loss_area = 0.1*self.l2_loss(pred_areas,target_areas) + + loss = loss_xy + loss_wh + loss_obj + loss_cls + 0.01 * loss_in_grid + + return loss, loss_xy, loss_wh, loss_obj, loss_cls, loss_in_grid, loss_l2 diff --git a/openpmcvl/granular/models/yolov3.py b/openpmcvl/granular/models/yolov3.py new file mode 100644 index 0000000..979b931 --- /dev/null +++ b/openpmcvl/granular/models/yolov3.py @@ -0,0 +1,327 @@ +import torch +import torch.nn as nn + +from collections import defaultdict +from openpmcvl.granular.models.yolo_layer import YOLOLayer, YOLOimgLayer + + +def add_conv(in_ch, out_ch, ksize, stride): + """ + Add a conv2d / batchnorm / leaky ReLU block. + Args: + in_ch (int): number of input channels of the convolution layer. + out_ch (int): number of output channels of the convolution layer. + ksize (int): kernel size of the convolution layer. + stride (int): stride of the convolution layer. + Returns: + stage (Sequential) : Sequential layers composing a convolution block. + """ + stage = nn.Sequential() + pad = (ksize - 1) // 2 + stage.add_module( + "conv", + nn.Conv2d( + in_channels=in_ch, + out_channels=out_ch, + kernel_size=ksize, + stride=stride, + padding=pad, + bias=False, + ), + ) + stage.add_module("batch_norm", nn.BatchNorm2d(out_ch)) + stage.add_module("leaky", nn.LeakyReLU(0.1)) + return stage + + +class resblock(nn.Module): + """ + Sequential residual blocks each of which consists of \ + two convolution layers. + Args: + ch (int): number of input and output channels. + nblocks (int): number of residual blocks. + shortcut (bool): if True, residual tensor addition is enabled. + """ + + def __init__(self, ch, nblocks=1, shortcut=True): + + super().__init__() + self.shortcut = shortcut + self.module_list = nn.ModuleList() + for i in range(nblocks): + resblock_one = nn.ModuleList() + resblock_one.append(add_conv(ch, ch // 2, 1, 1)) + resblock_one.append(add_conv(ch // 2, ch, 3, 1)) + self.module_list.append(resblock_one) + + def forward(self, x): + for module in self.module_list: + h = x + for res in module: + h = res(h) + x = x + h if self.shortcut else h + return x + + +def create_yolov3_modules(config_model, ignore_thre): + """ + Build yolov3 layer modules. + Args: + config_model (dict): model configuration. + See YOLOLayer class for details. + ignore_thre (float): used in YOLOLayer. + Returns: + mlist (ModuleList): YOLOv3 module list. + """ + + # DarkNet53 + mlist = nn.ModuleList() + mlist.append(add_conv(in_ch=3, out_ch=32, ksize=3, stride=1)) + mlist.append(add_conv(in_ch=32, out_ch=64, ksize=3, stride=2)) + mlist.append(resblock(ch=64)) + mlist.append(add_conv(in_ch=64, out_ch=128, ksize=3, stride=2)) + mlist.append(resblock(ch=128, nblocks=2)) + mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=2)) + mlist.append(resblock(ch=256, nblocks=8)) # shortcut 1 from here + mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=2)) + mlist.append(resblock(ch=512, nblocks=8)) # shortcut 2 from here + mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=2)) + mlist.append(resblock(ch=1024, nblocks=4)) + + # YOLOv3 + mlist.append(resblock(ch=1024, nblocks=2, shortcut=False)) + mlist.append(add_conv(in_ch=1024, out_ch=512, ksize=1, stride=1)) + # 1st yolo branch + mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=1)) + mlist.append( + YOLOLayer(config_model, layer_no=0, in_ch=1024, ignore_thre=ignore_thre) + ) + + mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) + mlist.append(nn.Upsample(scale_factor=2, mode="nearest")) + mlist.append(add_conv(in_ch=768, out_ch=256, ksize=1, stride=1)) + mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) + mlist.append(resblock(ch=512, nblocks=1, shortcut=False)) + mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) + # 2nd yolo branch + mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) + mlist.append( + YOLOLayer(config_model, layer_no=1, in_ch=512, ignore_thre=ignore_thre) + ) + + mlist.append(add_conv(in_ch=256, out_ch=128, ksize=1, stride=1)) + mlist.append(nn.Upsample(scale_factor=2, mode="nearest")) + mlist.append(add_conv(in_ch=384, out_ch=128, ksize=1, stride=1)) + mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=1)) + mlist.append(resblock(ch=256, nblocks=2, shortcut=False)) + mlist.append( + YOLOLayer(config_model, layer_no=2, in_ch=256, ignore_thre=ignore_thre) + ) + + return mlist + + +class YOLOv3(nn.Module): + """ + YOLOv3 model module. The module list is defined by create_yolov3_modules function. \ + The network returns loss values from three YOLO layers during training \ + and detection results during test. + """ + + def __init__(self, config_model, ignore_thre=0.7): + """ + Initialization of YOLOv3 class. + Args: + config_model (dict): used in YOLOLayer. + ignore_thre (float): used in YOLOLayer. + """ + super(YOLOv3, self).__init__() + + if config_model["TYPE"] == "YOLOv3": + self.module_list = create_yolov3_modules(config_model, ignore_thre) + else: + raise Exception( + "Model name {} is not available".format(config_model["TYPE"]) + ) + + def forward(self, x, targets=None): + """ + Forward path of YOLOv3. + Args: + x (torch.Tensor) : input data whose shape is :math:`(N, C, H, W)`, \ + where N, C are batchsize and num. of channels. + targets (torch.Tensor) : label array whose shape is :math:`(N, 50, 5)` + + Returns: + training: + output (torch.Tensor): loss tensor for backpropagation. + test: + output (torch.Tensor): concatenated detection results. + """ + train = targets is not None + output = [] + self.loss_dict = defaultdict(float) + route_layers = [] + for i, module in enumerate(self.module_list): + # yolo layers + if i in [14, 22, 28]: + if train: + x, *loss_dict = module(x, targets) + for name, loss in zip(["xy", "wh", "conf", "cls", "l2"], loss_dict): + self.loss_dict[name] += loss + else: + x = module(x) + output.append(x) + else: + x = module(x) + + # route layers + if i in [6, 8, 12, 20]: + route_layers.append(x) + if i == 14: + x = route_layers[2] + if i == 22: # yolo 2nd + x = route_layers[3] + if i == 16: + x = torch.cat((x, route_layers[1]), 1) + if i == 24: + x = torch.cat((x, route_layers[0]), 1) + if train: + return sum(output) + else: + return torch.cat(output, 1) + + +def create_yolov3img_modules(config_model, ignore_thre): + """ + Build yolov3 layer modules. + Args: + config_model (dict): model configuration. + See YOLOLayer class for details. + ignore_thre (float): used in YOLOLayer. + Returns: + mlist (ModuleList): YOLOv3 module list. + """ + + # DarkNet53 + mlist = nn.ModuleList() + mlist.append(add_conv(in_ch=4, out_ch=32, ksize=3, stride=1)) + mlist.append(add_conv(in_ch=32, out_ch=64, ksize=3, stride=2)) + mlist.append(resblock(ch=64)) + mlist.append(add_conv(in_ch=64, out_ch=128, ksize=3, stride=2)) + mlist.append(resblock(ch=128, nblocks=2)) + mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=2)) + mlist.append(resblock(ch=256, nblocks=8)) # shortcut 1 from here + mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=2)) + mlist.append(resblock(ch=512, nblocks=8)) # shortcut 2 from here + mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=2)) + mlist.append(resblock(ch=1024, nblocks=4)) + + # YOLOv3 + mlist.append(resblock(ch=1024, nblocks=2, shortcut=False)) + mlist.append(add_conv(in_ch=1024, out_ch=512, ksize=1, stride=1)) + # 1st yolo branch + mlist.append(add_conv(in_ch=512, out_ch=1024, ksize=3, stride=1)) + mlist.append( + YOLOimgLayer(config_model, layer_no=0, in_ch=1024, ignore_thre=ignore_thre) + ) + + mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) + mlist.append(nn.Upsample(scale_factor=2, mode="nearest")) + mlist.append(add_conv(in_ch=768, out_ch=256, ksize=1, stride=1)) + mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) + mlist.append(resblock(ch=512, nblocks=1, shortcut=False)) + mlist.append(add_conv(in_ch=512, out_ch=256, ksize=1, stride=1)) + # 2nd yolo branch + mlist.append(add_conv(in_ch=256, out_ch=512, ksize=3, stride=1)) + mlist.append( + YOLOimgLayer(config_model, layer_no=1, in_ch=512, ignore_thre=ignore_thre) + ) + + mlist.append(add_conv(in_ch=256, out_ch=128, ksize=1, stride=1)) + mlist.append(nn.Upsample(scale_factor=2, mode="nearest")) + mlist.append(add_conv(in_ch=384, out_ch=128, ksize=1, stride=1)) + mlist.append(add_conv(in_ch=128, out_ch=256, ksize=3, stride=1)) + mlist.append(resblock(ch=256, nblocks=2, shortcut=False)) + mlist.append( + YOLOimgLayer(config_model, layer_no=2, in_ch=256, ignore_thre=ignore_thre) + ) + + return mlist + + +class YOLOv3img(nn.Module): + """ + YOLOv3 model module. The module list is defined by create_yolov3img_modules function. \ + The network returns loss values from three YOLO layers during training \ + and detection results during test. + """ + + def __init__(self, config_model, ignore_thre=0.7): + """ + Initialization of YOLOv3 class. + Args: + config_model (dict): used in YOLOLayer. + ignore_thre (float): used in YOLOLayer. + """ + super(YOLOv3img, self).__init__() + + if config_model["TYPE"] == "YOLOv3": + self.module_list = create_yolov3img_modules(config_model, ignore_thre) + else: + raise Exception( + "Model name {} is not available".format(config_model["TYPE"]) + ) + + def forward(self, x, targets=None): + """ + Forward path of YOLOv3. + Args: + x (torch.Tensor) : input data whose shape is :math:`(N, C, H, W)`, \ + where N, C are batchsize and num. of channels. + targets (torch.Tensor) : label array whose shape is :math:`(N, 50, 5)` + + Returns: + training: + output (torch.Tensor): loss tensor for backpropagation. + test: + output (torch.Tensor): concatenated detection results. + """ + train = targets[0] is not None + output = [] + self.loss_dict = defaultdict(float) + route_layers = [] + for i, module in enumerate(self.module_list): + # yolo layers + if i in [14, 22, 28]: + if train: + x, *loss_dict = module(x, targets) + for name, loss in zip( + ["xy", "wh", "conf", "cls", "in_grid", "l2"], loss_dict + ): + self.loss_dict[name] += loss + else: + x = module(x, targets) + output.append(x) + else: + x = module(x) + + # route layers + if i in [6, 8, 12, 20]: + route_layers.append(x) + if i == 14: + x = route_layers[2] + if i == 22: # yolo 2nd + x = route_layers[3] + if i == 16: + x = torch.cat((x, route_layers[1]), 1) + if i == 24: + x = torch.cat((x, route_layers[0]), 1) + if train: + return sum(output) + else: + return output + + +# return torch.cat(output, 1) From 3906b3118d9c587d3eed5b826eca0857dc4f0f89 Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:28:25 -0500 Subject: [PATCH 40/62] Add checkpoints directory. --- openpmcvl/granular/checkpoints/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 openpmcvl/granular/checkpoints/__init__.py diff --git a/openpmcvl/granular/checkpoints/__init__.py b/openpmcvl/granular/checkpoints/__init__.py new file mode 100644 index 0000000..e69de29 From 88b7ab6112164979547807fc7c16c356b248119d Mon Sep 17 00:00:00 2001 From: afallah Date: Mon, 6 Jan 2025 00:31:16 -0500 Subject: [PATCH 41/62] Add missing init file to config directory. --- openpmcvl/granular/config/__init__.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 openpmcvl/granular/config/__init__.py diff --git a/openpmcvl/granular/config/__init__.py b/openpmcvl/granular/config/__init__.py new file mode 100644 index 0000000..e69de29 From 78ff49bd3767ccf802b609709baadb1529db40a7 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:13:09 -0500 Subject: [PATCH 42/62] Remove biomedclip classification logic. --- openpmcvl/classification/__init__.py | 0 openpmcvl/classification/classifier.py | 113 ------------------------- openpmcvl/classification/classifier.sh | 21 ----- 3 files changed, 134 deletions(-) delete mode 100644 openpmcvl/classification/__init__.py delete mode 100644 openpmcvl/classification/classifier.py delete mode 100644 openpmcvl/classification/classifier.sh diff --git a/openpmcvl/classification/__init__.py b/openpmcvl/classification/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/classification/classifier.py b/openpmcvl/classification/classifier.py deleted file mode 100644 index a6a6b15..0000000 --- a/openpmcvl/classification/classifier.py +++ /dev/null @@ -1,113 +0,0 @@ -import argparse -import torch -from typing import List, Dict -from open_clip import create_model_from_pretrained, get_tokenizer - - -def load_biomedclip_model(device: torch.device) -> tuple: - """ - Load the BiomedCLIP model and tokenizer. - - Args: - device (torch.device): The device to load the model on. - - Returns: - tuple: A tuple containing the model and tokenizer. - """ - model, _ = create_model_from_pretrained( - "hf-hub:microsoft/BiomedCLIP-PubMedBERT_256-vit_base_patch16_224" - ) - tokenizer = get_tokenizer( - "hf-hub:microsoft/BiomedCLIP-PubMedBERT_256-vit_base_patch16_224" - ) - model.to(device) - model.eval() - return model, tokenizer - - -def get_keyword_embeddings( - model: torch.nn.Module, tokenizer: object, classes: List[str], device: torch.device -) -> torch.Tensor: - """ - Generate embeddings for the given classes using BiomedCLIP. - - Args: - model (torch.nn.Module): The BiomedCLIP model. - tokenizer (object): The BiomedCLIP tokenizer. - classes (List[str]): List of classes to embed. - device (torch.device): The device to perform computations on. - - Returns: - torch.Tensor: Tensor of keyword embeddings. - """ - template = "this is a photo of " - texts = tokenizer([template + k for k in classes], context_length=256).to(device) - with torch.no_grad(): - _, text_features, _ = model(None, texts) - return text_features - - -def classify_images( - image_embeddings: torch.Tensor, keyword_embeddings: torch.Tensor -) -> torch.Tensor: - """ - Classify images based on the closest keyword embedding. - - Args: - image_embeddings (torch.Tensor): Tensor of image embeddings. - keyword_embeddings (torch.Tensor): Tensor of keyword embeddings. - - Returns: - torch.Tensor: Tensor of classification indices. - """ - similarities = torch.matmul(image_embeddings, keyword_embeddings.t()) - return torch.argmax(similarities, dim=1) - - -def main(input_file: str, output_file: str, classes: List[str]): - """ - Main function to classify images using BiomedCLIP. - - Args: - input_file (str): Path to the input .pt file containing image embeddings. - output_file (str): Path to save the output .pt file with classifications. - classes (List[str]): List of classes to use for classification. - """ - device = torch.device("cuda" if torch.cuda.is_available() else "cpu") - model, tokenizer = load_biomedclip_model(device) - - keyword_embeddings = get_keyword_embeddings(model, tokenizer, classes, device) - - input_data = torch.load(input_file) - image_embeddings = input_data["rgb_embedding"].to(device) - - classifications = classify_images(image_embeddings, keyword_embeddings) - - input_data["class"] = classifications.cpu() - - torch.save(input_data, output_file) - print(f"Classifications saved to {output_file}.") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Classify images using BiomedCLIP") - parser.add_argument( - "input_file", - type=str, - help="Path to the input .pt file containing image embeddings", - ) - parser.add_argument( - "output_file", - type=str, - help="Path to save the output .pt file with classifications", - ) - parser.add_argument( - "--classes", - nargs="+", - default=["radiology", "pathology", "chest x-ray"], - help="List of classes to use for classification", - ) - - args = parser.parse_args() - - main(args.input_file, args.output_file, args.classes) diff --git a/openpmcvl/classification/classifier.sh b/openpmcvl/classification/classifier.sh deleted file mode 100644 index 83b500c..0000000 --- a/openpmcvl/classification/classifier.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash -#SBATCH -c 6 -#SBATCH --partition=t4v2 -#SBATCH --mem=32GB -#SBATCH --time=8:00:00 -#SBATCH --job-name=classify_images -#SBATCH --output=%x-%j.out -#SBATCH --gres=gpu:1 - -source /h/afallah/light/bin/activate - -cd /h/afallah/pmc-data-extraction - -INPUT_FILE="openpmcvl/classification/embeddings.pt" -OUTPUT_FILE="openpmcvl/classification/classified.pt" - -stdbuf -oL -eL srun python3 openpmcvl/classification/classifier.py \ - $INPUT_FILE \ - $OUTPUT_FILE \ - --classes "radiology" "ultrasound" "magnetic_resonance" "computerized_tomography" "x-ray" "angiography" "pet" "visible_light_photography" "endoscopy" "electroencephalography" "electrocardiography" "electromyography" "microscopy" "gene_sequence" "chromatography" "chemical_structure" "mathematical_formula" "non-clinical_photos" "hand-drawn_sketches" \ - 2>&1 | tee -a %x-%j.out \ No newline at end of file From b71e9332140b29e9fa88817cdaff461216ec4b46 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:16:01 -0500 Subject: [PATCH 43/62] Remove original loop from align.sh --- openpmcvl/granular/pipeline/align.sh | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index f059e7c..1128a3c 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -40,23 +40,4 @@ stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ --save_path "$output_file" \ --dataset_slice "${BEGIN_IDX}:${END_IDX}" -echo "Finished aligning from index ${BEGIN_IDX} to ${END_IDX}" - -# Original loop commented out: -# if [ $# -eq 0 ]; then -# echo "Please provide JSONL numbers as arguments." -# exit 1 -# fi -# -# JSONL_NUMBERS="$@" -# -# for num in $JSONL_NUMBERS; do -# input_file="/datasets/PMC-15M/granular/${num}_subfigures_classified.jsonl" -# output_file="/datasets/PMC-15M/granular/${num}_subfigures_aligned.jsonl" -# -# stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ -# --dataset_path "$input_file" \ -# --save_path "$output_file" \ -# -# echo "Finished aligning ${num}" -# done \ No newline at end of file +echo "Finished aligning from index ${BEGIN_IDX} to ${END_IDX}" \ No newline at end of file From d75690ff392c327e64da96960194d9b8f235c819 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:27:06 -0500 Subject: [PATCH 44/62] Remove dead code in model files. --- openpmcvl/granular/models/network.py | 5 -- .../granular/models/subfigure_detector.py | 35 ++------- openpmcvl/granular/models/subfigure_ocr.py | 2 - .../granular/models/transformer_module.py | 1 - openpmcvl/granular/models/yolo_layer.py | 74 +------------------ openpmcvl/granular/models/yolov3.py | 3 - 6 files changed, 10 insertions(+), 110 deletions(-) diff --git a/openpmcvl/granular/models/network.py b/openpmcvl/granular/models/network.py index bde68da..f635d37 100644 --- a/openpmcvl/granular/models/network.py +++ b/openpmcvl/granular/models/network.py @@ -252,16 +252,11 @@ def _forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu(x) - # x = self.maxpool(x) x = self.layer1(x) - # print(x.size()) x = self.layer2(x) - # print(x.size()) x = self.layer3(x) - # print(x.size()) x = self.layer4(x) - # print(x.size()) x = self.avgpool(x) x = torch.flatten(x, 1) diff --git a/openpmcvl/granular/models/subfigure_detector.py b/openpmcvl/granular/models/subfigure_detector.py index ba7327b..b5d0784 100644 --- a/openpmcvl/granular/models/subfigure_detector.py +++ b/openpmcvl/granular/models/subfigure_detector.py @@ -1,9 +1,7 @@ -from cgitb import text import torch -import numpy as np from pytorch_pretrained_bert.modeling import BertModel from torch import nn -from torchvision import models, transforms +from torchvision import models import math from openpmcvl.granular.models.transformer_module import * @@ -69,9 +67,6 @@ def __init__( self.box_head = nn.Sequential( nn.Linear(feature_dim, feature_dim), nn.ReLU(inplace=True), - # nn.Dropout(p=dropout), - # nn.Linear(feature_dim, feature_dim), - # nn.ReLU(inplace=True), nn.Linear(feature_dim, 4), nn.Sigmoid(), ) @@ -104,10 +99,8 @@ def __init__( self.simi_head = nn.Sequential( nn.Linear(feature_dim * 2, feature_dim), nn.ReLU(inplace=True), - # nn.Dropout(p=dropout), nn.Linear(feature_dim, feature_dim), nn.ReLU(inplace=True), - # nn.Dropout(p=dropout), nn.Linear(feature_dim, 1), nn.Sigmoid(), ) @@ -155,31 +148,17 @@ def forward(self, images, texts): # Align query = query @ self.img_proj # (bs, 50, 256) t, _ = self.text_decoder(query, t) # (bs, l, 256) - # t_proj = t_proj * self.txt_proj # (bs, l, 256) query = query.unsqueeze(2).repeat(1, 1, t.shape[1], 1) # (bs, 50, l, 256) t = t.unsqueeze(1).repeat(1, query.shape[1], 1, 1) # (bs, 50, l, 256) similarity = torch.cat((query, t), -1) # (bs, 50, l, 512) similarity = self.simi_head(similarity).squeeze(-1) # (bs, 50, l) else: + # We wont use similarity, set to 0 to make code faster similarity = ( 0 # torch.zeros(query.shape[0], query.shape[1], texts.shape[-1]).cuda() ) - """ - cos = nn.CosineSimilarity(dim=3) - similarity = cos(t.unsqueeze(1).repeat(1, query.shape[1], 1, 1), query.unsqueeze(2).repeat(1, 1, t.shape[1], 1)) - similarity = similarity/2.0 + 0.5 # project to [0, 1], (bs, 50, l), cosine similarity - """ - - """ - # The following code may results in cosine similarity beyond [0, 1] - t = t/t.norm(dim=-1, keepdim=True) - query = query/query.norm(dim=-1, keepdim=True) - similarity2 = query @ t.transpose(1,2) # self.logit_scale.exp() * query @ t.transpose(1,2) # (bs, 50, l), cosine similarity - similarity2 = similarity2/2.0 + 0.5 # project to [0, 1] - """ - return output_det_class, output_box, similarity @@ -198,9 +177,9 @@ def __init__( self.scale = scale def forward(self, bs, h, w, device): - # 输入是b,c,h,w + # Input is b,c,h,w mask = torch.ones(bs, h, w, device=device) - # 因为图像是2d的,所以位置编码也分为x,y方向 + # Since image is 2D, position encoding is split into x,y directions # 1 1 1 1 .. 2 2 2 2... 3 3 3... y_embed = mask.cumsum( 1, dtype=torch.float32 @@ -215,11 +194,11 @@ def forward(self, bs, h, w, device): x_embed = x_embed / (x_embed[:, :, -1:] + eps) * self.scale # num_pos_feats = 128 - # 0~127 self.num_pos_feats=128,因为前面输入向量是256,编码是一半sin,一半cos + # 0~127 self.num_pos_feats=128, since input vector is 256, encoding is half sin, half cos dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=device) dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) - # 输出shape=b,h,w,128 + # Output shape=b,h,w,128 pos_x = x_embed[:, :, :, None] / dim_t pos_y = y_embed[:, :, :, None] / dim_t pos_x = torch.stack( @@ -230,5 +209,5 @@ def forward(self, bs, h, w, device): ).flatten(3) pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) - # 每个特征图的xy位置都编码成256的向量,其中前128是y方向编码,而128是x方向编码 + # Each feature map position is encoded as a 256d vector, first 128d for y direction, last 128d for x direction return pos # (b,n=256,h,w) diff --git a/openpmcvl/granular/models/subfigure_ocr.py b/openpmcvl/granular/models/subfigure_ocr.py index 0b4a15c..fbb1fe5 100644 --- a/openpmcvl/granular/models/subfigure_ocr.py +++ b/openpmcvl/granular/models/subfigure_ocr.py @@ -48,7 +48,6 @@ def load_model_from_checkpoint(self, model, model_name): checkpoints_path = os.path.join(self.current_dir, "..", "checkpoints") checkpoint = os.path.join(checkpoints_path, model_name) model.load_state_dict(torch.load(checkpoint)) - # model = nn.DataParallel(model) model.to(self.device) return model @@ -174,7 +173,6 @@ def detect_subfigure_labels(self, figure_path, subfigure_info): ) if label_value == "z": continue - # if (x2-x1) < 64 and (y2-y1)< 64: detected_label_and_bbox = [label_value, x1, y1, x2, y2] return detected_label_and_bbox diff --git a/openpmcvl/granular/models/transformer_module.py b/openpmcvl/granular/models/transformer_module.py index dd164b7..a0e9dd7 100644 --- a/openpmcvl/granular/models/transformer_module.py +++ b/openpmcvl/granular/models/transformer_module.py @@ -1,4 +1,3 @@ -import math import torch from torch import nn import torch.nn.functional as F diff --git a/openpmcvl/granular/models/yolo_layer.py b/openpmcvl/granular/models/yolo_layer.py index aeecd7e..240b0c0 100644 --- a/openpmcvl/granular/models/yolo_layer.py +++ b/openpmcvl/granular/models/yolo_layer.py @@ -2,12 +2,10 @@ import torch.nn as nn import numpy as np import warnings -import cv2 from openpmcvl.granular.models.network import resnet152 from openpmcvl.granular.models.process import preprocess - def bboxes_iou(bboxes_a, bboxes_b, xyxy=True): """Calculate the Intersection of Unions (IoUs) between bounding boxes. IoU is calculated as a ratio of area of the intersection @@ -79,12 +77,8 @@ def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): strides = [32, 16, 8] # fixed self.anchors = config_model["ANCHORS"] self.n_anchors = len(self.anchors) - # self.anch_mask = config_model['ANCH_MASK'][layer_no] - # self.n_anchors = len(self.anch_mask) self.n_classes = config_model["N_CLASSES"] self.ignore_thre = ignore_thre - # self.l2_loss = nn.MSELoss(size_average=False) - # self.bce_loss = nn.BCELoss(size_average=False) self.l2_loss = nn.MSELoss(reduction="sum") self.bce_loss = nn.BCELoss(reduction="sum") @@ -249,10 +243,9 @@ class (float): class index. y1 = int(min(max(pred_y - pred_h / 2, 0), img.shape[0] - 1)) x2 = int(min(max(pred_x + pred_w / 2, 0), img.shape[0] - 1)) y2 = int(min(max(pred_y + pred_h / 2, 0), img.shape[0] - 1)) - # print(x1,y1,x2,y2) + if (x1 + 2 < x2) and (y1 + 2 < y2): patch = np.uint8(255 * img[y1:y2, x1:x2]) - # print("patch size is", patch.shape) patch, _ = preprocess(patch, 28, jitter=0) patch = np.transpose(patch / 255.0, (2, 0, 1)) patch = torch.from_numpy(patch).unsqueeze(0).type(dtype) @@ -263,13 +256,11 @@ class (float): class index. if pred_label == reference_label: target[b, rp_anchor, rp_i, rp_j, 4] = 1 else: - # print("%d/%d, pred=%d, gt=%d"%(rp_i,int(rp_index.size()[0]),pred_label,reference_label)) target[b, rp_anchor, rp_i, rp_j, 4] = 0 else: target[b, rp_anchor, rp_i, rp_j, 4] = 0 for ti in range(best_n_all.shape[0]): - # if best_n_mask[ti] == 1: i, j = truth_i[ti], truth_j[ti] a = best_n_all[ti] obj_mask[b, a, j, i] = 1 @@ -333,8 +324,6 @@ def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): strides = [32, 16, 8] # fixed self.anchors = config_model["ANCHORS"] self.n_anchors = len(self.anchors) - # self.anch_mask = config_model['ANCH_MASK'][layer_no] - # self.n_anchors = len(self.anch_mask) self.n_classes = config_model["N_CLASSES"] self.ignore_thre = ignore_thre self.l2_loss = nn.MSELoss(reduction="sum") @@ -344,8 +333,6 @@ def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): (w / self.stride, h / self.stride) for w, h in self.anchors ] self.masked_anchors = self.all_anchors_grid - # self.masked_anchors = [self.all_anchors_grid[i] - # for i in self.anch_mask] self.ref_anchors = np.zeros((len(self.all_anchors_grid), 4)) self.ref_anchors[:, 2:] = np.array(self.all_anchors_grid) self.ref_anchors = torch.FloatTensor(self.ref_anchors) @@ -389,12 +376,9 @@ class (float): class index. output = output.view(batchsize, self.n_anchors, n_ch, fsize, fsize) output = output.permute(0, 1, 3, 4, 2) # .contiguous() - # print(output.size()) # logistic activation for xy, obj, cls output[..., np.r_[:2, 4:n_ch]] = torch.sigmoid(output[..., np.r_[:2, 4:n_ch]]) - # output[..., np.r_[2:n_ch]] = torch.sigmoid( - # output[..., np.r_[2:n_ch]]) # calculate pred - xywh obj cls @@ -438,25 +422,9 @@ class (float): class index. truth_i_all_sub = truth_x_all_sub.to(torch.int16).numpy() truth_j_all_sub = truth_y_all_sub.to(torch.int16).numpy() - # pred_mask = dtype(np.zeros((batchsize, self.n_anchors, fsize, fsize, n_ch))) - # for b in range(batchsize): - # for ti in range(nprior_label[b]): - # i,j = truth_i_all_sub[b,ti], truth_j_all_sub[b,ti] - # best_anchor = torch.argmax(pred[b,:,j,i,4]) - # i_best = min(max(int(pred[b,best_anchor,j,i,0].to(torch.int16).cpu().numpy()),0),fsize-1) - # j_best = min(max(int(pred[b,best_anchor,j,i,1].to(torch.int16).cpu().numpy()),0),fsize-1) - # # if labels is None: - # # pass - # # else: - # # pred_mask[b,:,j,i,:] = 1 - # pred_mask[b,:,j,i,:] = 1 - # pred_mask[b,best_anchor,j_best,i_best,:] = 1 - # pred *= pred_mask - if labels is None: # not training pred[..., :4] *= self.stride return pred.data - # return pred.view(batchsize, -1, n_ch).data pred = pred[..., :4].data @@ -465,30 +433,17 @@ class (float): class index. dtype ) in_grid_distance = torch.zeros(batchsize, 80, 2).type(dtype) - - # tgt_mask = torch.zeros(batchsize, self.n_anchors, - # fsize, fsize, 4 + self.n_classes).type(dtype) - # # obj_mask = torch.ones(batchsize, self.n_anchors, - # # fsize, fsize).type(dtype) - # obj_mask = torch.zeros(batchsize, self.n_anchors, - # fsize, fsize).type(dtype) tgt_scale = torch.zeros(batchsize, self.n_anchors, fsize, fsize, 2).type(dtype) - target = torch.zeros(batchsize, self.n_anchors, fsize, fsize, n_ch).type(dtype) labels = labels.cpu().data nlabel = (labels.sum(dim=2) > 0).sum(dim=1) # number of objects - # assert nprior_label == nlabel truth_x_all = labels[:, :, 1] * fsize truth_y_all = labels[:, :, 2] * fsize truth_w_all = labels[:, :, 3] * fsize truth_h_all = labels[:, :, 4] * fsize - # truth_i_all = truth_x_all.to(torch.int16).numpy() - # truth_j_all = truth_y_all.to(torch.int16).numpy() - # pred_areas = torch.zeros(batchsize).type(dtype) - # target_areas = torch.zeros(batchsize).type(dtype) for b in range(batchsize): n = int(nlabel[b]) if n == 0: @@ -506,17 +461,6 @@ class (float): class index. truth_box[:n, 0] = truth_x_all[b, :n] truth_box[:n, 1] = truth_y_all[b, :n] - # pred_ious = bboxes_iou( - # pred[b].view(-1, 4), truth_box, xyxy=False) - # pred_best_iou, _ = pred_ious.max(dim=1) - # pred_best_iou = (pred_best_iou > self.ignore_thre) - # pred_best_iou = pred_best_iou.view(pred[b].shape[:3]) - # # set mask to zero (ignore) if pred matches truth - # obj_mask[b] = 1- pred_best_iou - - # if sum(best_n_mask) == 0: - # continue - for ti in range(n): i, j = truth_i[ti], truth_j[ti] @@ -528,7 +472,6 @@ class (float): class index. ) good_anchor_index = torch.nonzero((pred_ious > 0.7)[0]).cpu().numpy() bad_anchor_index = torch.nonzero((pred_ious < 0.3)[0]).cpu().numpy() - # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) for good_i in range(len(good_anchor_index)): a = good_anchor_index[good_i] tgt_mask[b, a, j, i, :] = 1 @@ -576,7 +519,7 @@ class (float): class index. bad_anchor_index_2 = ( torch.nonzero((pred_ious_2 < 0.3)[0]).cpu().numpy() ) - # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) + for good_i_2 in range(len(good_anchor_index_2)): a = good_anchor_index_2[good_i_2] tgt_mask[b, a, j_best, i_best, :] = 1 @@ -660,7 +603,7 @@ class (float): class index. ) good_anchor_index = torch.nonzero((pred_ious > 0.7)[0]).cpu().numpy() bad_anchor_index = torch.nonzero((pred_ious < 0.3)[0]).cpu().numpy() - # print(len(good_anchor_index),len(bad_anchor_index),good_anchor_index, bad_anchor_index) + for good_i in range(len(good_anchor_index)): a = good_anchor_index[good_i] tgt_mask[b, a, j_best, i_best, :] = 1 @@ -732,21 +675,13 @@ class (float): class index. 2 - truth_w_all[b, ti] * truth_h_all[b, ti] / fsize / fsize ) - # in_grid_distance[b,ti,0] += target[b, a, j_best, i_best, 0] - # in_grid_distance[b,ti,1] += target[b, a, j_best, i_best, 1] - # loss calculation output *= tgt_mask target *= tgt_mask target_in_grid_distance = torch.zeros(batchsize, 80, 2).type(dtype) - # output[..., 4] *= obj_mask - # output[..., np.r_[0:4, 5:n_ch]] *= tgt_mask output[..., 2:4] *= tgt_scale - - # target[..., 4] *= obj_mask - # target[..., np.r_[0:4, 5:n_ch]] *= tgt_mask target[..., 2:4] *= tgt_scale bceloss = nn.BCELoss( @@ -759,9 +694,6 @@ class (float): class index. loss_l2 = self.l2_loss(output, target) loss_in_grid = self.bce_loss(in_grid_distance, target_in_grid_distance) - # target_areas = torch.ones(batchsize).type(dtype) - # loss_area = 0.1*self.l2_loss(pred_areas,target_areas) - loss = loss_xy + loss_wh + loss_obj + loss_cls + 0.01 * loss_in_grid return loss, loss_xy, loss_wh, loss_obj, loss_cls, loss_in_grid, loss_l2 diff --git a/openpmcvl/granular/models/yolov3.py b/openpmcvl/granular/models/yolov3.py index 979b931..4285ef5 100644 --- a/openpmcvl/granular/models/yolov3.py +++ b/openpmcvl/granular/models/yolov3.py @@ -322,6 +322,3 @@ def forward(self, x, targets=None): return sum(output) else: return output - - -# return torch.cat(output, 1) From 5e6c48f7400ba5ee697ca72db7fab8be1123dd83 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:33:38 -0500 Subject: [PATCH 45/62] Remove deadcode from pipeline. --- openpmcvl/granular/pipeline/align.py | 4 +++- openpmcvl/granular/pipeline/subcaption.py | 18 +----------------- openpmcvl/granular/pipeline/subcaption.sh | 2 -- 3 files changed, 4 insertions(+), 20 deletions(-) diff --git a/openpmcvl/granular/pipeline/align.py b/openpmcvl/granular/pipeline/align.py index 4a5b4a0..32a6a83 100644 --- a/openpmcvl/granular/pipeline/align.py +++ b/openpmcvl/granular/pipeline/align.py @@ -50,7 +50,9 @@ def main(args: argparse.Namespace) -> None: dataset = load_dataset(args.dataset_path) if args.dataset_slice: dataset = dataset[args.dataset_slice] - # dataset = [data for data in dataset if data["is_medical_subfigure"]] + + # Use this line to filter out non-medical subfigures if needed + dataset = [data for data in dataset if data["is_medical_subfigure"]] print( f"Total {len(dataset)} medical subfigures from {os.path.basename(args.dataset_path)}" ) diff --git a/openpmcvl/granular/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py index 8a8a671..dd35aa4 100644 --- a/openpmcvl/granular/pipeline/subcaption.py +++ b/openpmcvl/granular/pipeline/subcaption.py @@ -11,7 +11,6 @@ PROMPT = """ Subfigure labels are letters referring to individual subfigures within a larger figure. -This is a caption: "%s" Check if the caption contains explicit subfigure label. If not, output "NO" and end the generation. If yes, output "YES", then generate the subcaption of the subfigures according to the caption. @@ -106,10 +105,6 @@ def main(args: argparse.Namespace) -> None: dataset = load_dataset(args.input_file) print(f"\nDataset size: {len(dataset)}") - # Load system prompt - with open(args.prompt_file, "r") as f: - system_prompt = f.read().strip() - # Inference loop results = [] @@ -120,7 +115,7 @@ def main(args: argparse.Namespace) -> None: output = process_caption( client=client, - system_prompt=system_prompt, + system_prompt=PROMPT, caption=caption, model=args.model, max_tokens=args.max_tokens, @@ -146,17 +141,6 @@ def main(args: argparse.Namespace) -> None: parser.add_argument("--input-file", required=True, help="Path to input JSONL file") parser.add_argument("--output-file", required=True, help="Path to output JSON file") - parser.add_argument( - "--system-prompt-file", required=True, help="Path to system prompt file" - ) - parser.add_argument( - "--base-url", default="http://gpu010:8080/v1", help="Base URL for OpenAI API" - ) - parser.add_argument( - "--model", - default="/model-weights/Meta-Llama-3.1-8B-Instruct", - help="Model directory", - ) parser.add_argument( "--max-tokens", type=int, diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index d1d7b0a..9707b82 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -16,7 +16,5 @@ cd /h/afallah/pmc-data-extraction stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ - --base-url http://gpu030:8080/v1 \ - --model /model-weights/Meta-Llama-3.1-8B-Instruct \ --max-tokens 500 \ 2>&1 | tee -a %x-%j.out \ No newline at end of file From a43c3bf0947448a7872444af33faea180694812f Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:42:06 -0500 Subject: [PATCH 46/62] Remove histogram notebook. --- .../utils/histogram_text_lengths.ipynb | 353 ------------------ 1 file changed, 353 deletions(-) delete mode 100644 openpmcvl/granular/utils/histogram_text_lengths.ipynb diff --git a/openpmcvl/granular/utils/histogram_text_lengths.ipynb b/openpmcvl/granular/utils/histogram_text_lengths.ipynb deleted file mode 100644 index 8455a49..0000000 --- a/openpmcvl/granular/utils/histogram_text_lengths.ipynb +++ /dev/null @@ -1,353 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/projects/aieng/diffusion_bootcamp/env/diffusion-models-bootcamp-yasaman-in14eNW_-py3.9/lib/python3.9/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], - "source": [ - "import os\n", - "import json\n", - "import torch\n", - "from transformers import BertTokenizer\n", - "import matplotlib.pyplot as plt\n", - "import pickle\n", - "from time import time\n", - "from datetime import timedelta" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0.jsonl\n", - "1.jsonl\n", - "2.jsonl\n", - "3.jsonl\n", - "4.jsonl\n", - "5.jsonl\n", - "6.jsonl\n", - "7.jsonl\n", - "8.jsonl\n", - "9.jsonl\n", - "10.jsonl\n", - "11.jsonl\n" - ] - } - ], - "source": [ - "# get file names\n", - "rootdir = \"/datasets/PMC-15M/\"\n", - "filenames = [fname for fname in os.listdir(rootdir) if fname.endswith(\".jsonl\") and not fname.endswith(\"_refs.jsonl\")]\n", - "filenames = sorted(filenames, key=lambda x: int(x.replace(\".jsonl\", \"\")))\n", - "print(\"\\n\".join(filenames))\n", - "\n", - "# create results directory\n", - "if not os.path.exists(os.path.join(rootdir, \"text_lengths\")):\n", - " os.mkdir(os.path.join(rootdir, \"text_lengths\"))" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# load tokenizer\n", - "tokenizer = BertTokenizer.from_pretrained(\"bert-base-uncased\")\n", - "\n", - "stime = time()\n", - "\n", - "for fname in filenames:\n", - " text_lengths = []\n", - " print(f\"[{timedelta(seconds=int(time() - stime))}] Loading file {fname}...\")\n", - " # load data\n", - " with open(os.path.join(rootdir, fname)) as f:\n", - " data = [json.loads(line)[\"caption\"] for line in f]\n", - "\n", - " print(f\"[{timedelta(seconds=int(time() - stime))}] Extracting caption lengths in {fname}...\")\n", - " for caption in data:\n", - " tokens = tokenizer(caption, return_tensors='pt')\n", - " text_lengths.append(tokens[\"input_ids\"].reshape(-1).shape[0])\n", - " \n", - " print(f\"[{timedelta(seconds=int(time() - stime))}] Saving caption lengths of {fname}...\")\n", - " save_path = os.path.join(rootdir, \"text_lengths\", fname.replace(\".jsonl\", \".pkl\"))\n", - " with open(save_path, \"wb\") as f:\n", - " pickle.dump(text_lengths, f)\n", - " print(f\"[{timedelta(seconds=int(time() - stime))}] Saved caption lengths in {save_path}...\")\n", - "print(f\"[{timedelta(seconds=int(time() - stime))}] Successfully processed all files in {rootdir}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['8.pkl',\n", - " '5.pkl',\n", - " '3.pkl',\n", - " '1.pkl',\n", - " '6.pkl',\n", - " '7.pkl',\n", - " '4.pkl',\n", - " '2.pkl',\n", - " '0.pkl']" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "os.listdir(os.path.join(rootdir, \"text_lengths\"))" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "(11163147,)\n" - ] - } - ], - "source": [ - "import numpy as np\n", - "\n", - "# load saved pickle files\n", - "text_lengths = []\n", - "for fname in os.listdir(os.path.join(rootdir, \"text_lengths\")):\n", - " filename = os.path.join(rootdir, \"text_lengths\", fname)\n", - " with open(filename, \"rb\") as f:\n", - " text_lengths.extend(pickle.load(f))\n", - "\n", - "text_lengths = np.array(text_lengths)\n", - "print(text_lengths.shape)" - ] - }, - { - "cell_type": "code", - "execution_count": 9, - "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkIAAAGdCAYAAAD+JxxnAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy80BEi2AAAACXBIWXMAAA9hAAAPYQGoP6dpAAAl/ElEQVR4nO3de3DU9b3/8RdJyCYBNuHS7HIJECsFuVQukRhBezpkWD05c+TIaZFJmRSpVk+0QM5wOy1Q26FJwXPqjYu2U2GmKMJMe6wEcDKhwqHGgEEuAYyckR4Y6AYUkkWFANn374/zy/ewQCGrQiCf52NmZ8z3+853P9mvwz5ns99NBzMzAQAAOCihrRcAAADQVgghAADgLEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM5KausF3Myi0aiOHTumLl26qEOHDm29HAAA0ApmptOnT6tXr15KSLj6az6E0FUcO3ZMWVlZbb0MAADwBRw5ckR9+vS56gwhdBVdunSR9L8PpN/vb+PVAACA1ohEIsrKyvKex6+GELqKll+H+f1+QggAgFtMa97WwpulAQCAswghAADgLEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAswghAADgLEKoDfWfW97WSwAAwGmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZ8UVQs3NzZo/f76ys7OVmpqqr3/96/r5z38uM/NmzEwLFixQz549lZqaqvz8fB08eDDmOCdPnlRhYaH8fr8yMjI0bdo0ffrppzEze/bs0b333quUlBRlZWVp8eLFl61n3bp1GjRokFJSUjRs2DBt2LAhZn9r1gIAANwVVwj98pe/1PLly/Xiiy/qwIED+uUvf6nFixfrhRde8GYWL16s559/XitWrFB1dbU6deqkUCiks2fPejOFhYXat2+fKioqtH79em3dulWPPfaYtz8SiWj8+PHq16+fampqtGTJEv30pz/Vyy+/7M288847mjx5sqZNm6b3339fEyZM0IQJE1RbWxvXWgAAgMMsDgUFBfbII4/EbHvooYessLDQzMyi0agFg0FbsmSJt7+hocF8Pp+99tprZma2f/9+k2Q7duzwZjZu3GgdOnSwo0ePmpnZsmXLrGvXrtbU1OTNzJkzxwYOHOh9/d3vftcKCgpi1pKbm2s//OEPW72Wa2lsbDRJ1tjY2Kr5ePWbs/66HBcAAJfF8/wd1ytC99xzjyorK/Xhhx9Kknbv3q1t27bpgQcekCQdOnRI4XBY+fn53vekp6crNzdXVVVVkqSqqiplZGQoJyfHm8nPz1dCQoKqq6u9mfvuu0/JycneTCgUUl1dnU6dOuXNXHw/LTMt99OatVyqqalJkUgk5gYAANqvpHiG586dq0gkokGDBikxMVHNzc1atGiRCgsLJUnhcFiSFAgEYr4vEAh4+8LhsDIzM2MXkZSkbt26xcxkZ2dfdoyWfV27dlU4HL7m/VxrLZcqLS3V008/3YpHAgAAtAdxvSK0du1arV69Wq+++qp27typVatW6ZlnntGqVauu1/puqHnz5qmxsdG7HTlypK2XBAAArqO4XhGaNWuW5s6dq4cffliSNGzYMP3P//yPSktLVVRUpGAwKEmqr69Xz549ve+rr6/X8OHDJUnBYFDHjx+POe6FCxd08uRJ7/uDwaDq6+tjZlq+vtbMxfuvtZZL+Xw++Xy+1j0YAADglhfXK0Kff/65EhJivyUxMVHRaFSSlJ2drWAwqMrKSm9/JBJRdXW18vLyJEl5eXlqaGhQTU2NN7N582ZFo1Hl5uZ6M1u3btX58+e9mYqKCg0cOFBdu3b1Zi6+n5aZlvtpzVoAAIDj4nkXdlFRkfXu3dvWr19vhw4dst///vfWo0cPmz17tjdTVlZmGRkZ9sYbb9iePXvswQcftOzsbDtz5ow3c//999uIESOsurratm3bZgMGDLDJkyd7+xsaGiwQCNiUKVOstrbW1qxZY2lpafbSSy95M3/+858tKSnJnnnmGTtw4IAtXLjQOnbsaHv37o1rLVfDVWMAANx64nn+jiuEIpGITZ8+3fr27WspKSl222232Y9//OOYy9yj0ajNnz/fAoGA+Xw+GzdunNXV1cUc55NPPrHJkydb586dze/329SpU+306dMxM7t377axY8eaz+ez3r17W1lZ2WXrWbt2rX3jG9+w5ORkGzJkiJWXl8fsb81aroYQAgDg1hPP83cHs4s+FhoxIpGI0tPT1djYKL/f/5Ufv//ccv2lrOArPy4AAC6L5/mbvzUGAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEUBvrP7e8rZcAAICzCCEAAOAsQggAADiLEAIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAswghAADgLEIIAAA4K+4QOnr0qL73ve+pe/fuSk1N1bBhw/Tee+95+81MCxYsUM+ePZWamqr8/HwdPHgw5hgnT55UYWGh/H6/MjIyNG3aNH366acxM3v27NG9996rlJQUZWVlafHixZetZd26dRo0aJBSUlI0bNgwbdiwIWZ/a9YCAADcFVcInTp1SmPGjFHHjh21ceNG7d+/X//+7/+url27ejOLFy/W888/rxUrVqi6ulqdOnVSKBTS2bNnvZnCwkLt27dPFRUVWr9+vbZu3arHHnvM2x+JRDR+/Hj169dPNTU1WrJkiX7605/q5Zdf9mbeeecdTZ48WdOmTdP777+vCRMmaMKECaqtrY1rLQAAwGEWhzlz5tjYsWP/5v5oNGrBYNCWLFnibWtoaDCfz2evvfaamZnt37/fJNmOHTu8mY0bN1qHDh3s6NGjZma2bNky69q1qzU1NcXc98CBA72vv/vd71pBQUHM/efm5toPf/jDVq/lWhobG02SNTY2tmo+Xv3mrLd+c9Zfl2MDAOCqeJ6/43pF6I9//KNycnL0ne98R5mZmRoxYoR+/etfe/sPHTqkcDis/Px8b1t6erpyc3NVVVUlSaqqqlJGRoZycnK8mfz8fCUkJKi6utqbue+++5ScnOzNhEIh1dXV6dSpU97MxffTMtNyP61Zy6WampoUiURibgAAoP2KK4Q++ugjLV++XAMGDNBbb72lJ554Qj/60Y+0atUqSVI4HJYkBQKBmO8LBALevnA4rMzMzJj9SUlJ6tatW8zMlY5x8X38rZmL919rLZcqLS1Venq6d8vKyrrWQwIAAG5hcYVQNBrVyJEj9Ytf/EIjRozQY489pkcffVQrVqy4Xuu7oebNm6fGxkbvduTIkbZeEgAAuI7iCqGePXtq8ODBMdvuuOMOHT58WJIUDAYlSfX19TEz9fX13r5gMKjjx4/H7L9w4YJOnjwZM3OlY1x8H39r5uL911rLpXw+n/x+f8wNAAC0X3GF0JgxY1RXVxez7cMPP1S/fv0kSdnZ2QoGg6qsrPT2RyIRVVdXKy8vT5KUl5enhoYG1dTUeDObN29WNBpVbm6uN7N161adP3/em6moqNDAgQO9K9Ty8vJi7qdlpuV+WrMWAADguHjehb19+3ZLSkqyRYsW2cGDB2316tWWlpZmv/vd77yZsrIyy8jIsDfeeMP27NljDz74oGVnZ9uZM2e8mfvvv99GjBhh1dXVtm3bNhswYIBNnjzZ29/Q0GCBQMCmTJlitbW1tmbNGktLS7OXXnrJm/nzn/9sSUlJ9swzz9iBAwds4cKF1rFjR9u7d29ca7karhoDAODWE8/zd1whZGb25ptv2tChQ83n89mgQYPs5ZdfjtkfjUZt/vz5FggEzOfz2bhx46yuri5m5pNPPrHJkydb586dze/329SpU+306dMxM7t377axY8eaz+ez3r17W1lZ2WVrWbt2rX3jG9+w5ORkGzJkiJWXl8e9lqshhAAAuPXE8/zdwcysbV+TunlFIhGlp6ersbHxurxfqP/ccknSX8oKvvJjAwDgqniev/lbYwAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhNBNoP/c8rZeAgAATiKEAACAswghAADgLEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAswihmwR/gR4AgBuPEAIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAs75UCJWVlalDhw6aMWOGt+3s2bMqLi5W9+7d1blzZ02cOFH19fUx33f48GEVFBQoLS1NmZmZmjVrli5cuBAz8/bbb2vkyJHy+Xy6/fbbtXLlysvuf+nSperfv79SUlKUm5ur7du3x+xvzVoAAIC7vnAI7dixQy+99JK++c1vxmyfOXOm3nzzTa1bt05btmzRsWPH9NBDD3n7m5ubVVBQoHPnzumdd97RqlWrtHLlSi1YsMCbOXTokAoKCvTtb39bu3bt0owZM/SDH/xAb731ljfz+uuvq6SkRAsXLtTOnTt15513KhQK6fjx461eCwAAcJx9AadPn7YBAwZYRUWFfetb37Lp06ebmVlDQ4N17NjR1q1b580eOHDAJFlVVZWZmW3YsMESEhIsHA57M8uXLze/329NTU1mZjZ79mwbMmRIzH1OmjTJQqGQ9/Xo0aOtuLjY+7q5udl69eplpaWlrV7LtTQ2Npoka2xsbNV8vPrNWR9zAwAAX148z99f6BWh4uJiFRQUKD8/P2Z7TU2Nzp8/H7N90KBB6tu3r6qqqiRJVVVVGjZsmAKBgDcTCoUUiUS0b98+b+bSY4dCIe8Y586dU01NTcxMQkKC8vPzvZnWrOVSTU1NikQiMTcAANB+JcX7DWvWrNHOnTu1Y8eOy/aFw2ElJycrIyMjZnsgEFA4HPZmLo6glv0t+642E4lEdObMGZ06dUrNzc1XnPnggw9avZZLlZaW6umnn77KTw8AANqTuF4ROnLkiKZPn67Vq1crJSXleq2pzcybN0+NjY3e7ciRI229JAAAcB3FFUI1NTU6fvy4Ro4cqaSkJCUlJWnLli16/vnnlZSUpEAgoHPnzqmhoSHm++rr6xUMBiVJwWDwsiu3Wr6+1ozf71dqaqp69OihxMTEK85cfIxrreVSPp9Pfr8/5gYAANqvuEJo3Lhx2rt3r3bt2uXdcnJyVFhY6P13x44dVVlZ6X1PXV2dDh8+rLy8PElSXl6e9u7dG3N1V0VFhfx+vwYPHuzNXHyMlpmWYyQnJ2vUqFExM9FoVJWVld7MqFGjrrkWAADgtrjeI9SlSxcNHTo0ZlunTp3UvXt3b/u0adNUUlKibt26ye/366mnnlJeXp7uvvtuSdL48eM1ePBgTZkyRYsXL1Y4HNZPfvITFRcXy+fzSZIef/xxvfjii5o9e7YeeeQRbd68WWvXrlV5ebl3vyUlJSoqKlJOTo5Gjx6tZ599Vp999pmmTp0qSUpPT7/mWgAAgNvifrP0tfzqV79SQkKCJk6cqKamJoVCIS1btszbn5iYqPXr1+uJJ55QXl6eOnXqpKKiIv3sZz/zZrKzs1VeXq6ZM2fqueeeU58+ffSb3/xGoVDIm5k0aZJOnDihBQsWKBwOa/jw4dq0aVPMG6ivtRYAAOC2DmZmbb2Im1UkElF6eroaGxuvy/uF+s8tj/n6L2UFX/l9AADgmniev/lbYwAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYTQTaT/3PK2XgIAAE4hhG4yxBAAADcOIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQjeh/nPL23oJAAA4gRACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAswghAADgLEIIAAA4ixACAADOIoRuUvwFegAArj9CCAAAOIsQAgAAziKEAACAswghAADgLEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAswghAADgLEIIAAA4ixC6ifWfW97WSwAAoF2LK4RKS0t11113qUuXLsrMzNSECRNUV1cXM3P27FkVFxere/fu6ty5syZOnKj6+vqYmcOHD6ugoEBpaWnKzMzUrFmzdOHChZiZt99+WyNHjpTP59Ptt9+ulStXXraepUuXqn///kpJSVFubq62b98e91oAAIC74gqhLVu2qLi4WO+++64qKip0/vx5jR8/Xp999pk3M3PmTL355ptat26dtmzZomPHjumhhx7y9jc3N6ugoEDnzp3TO++8o1WrVmnlypVasGCBN3Po0CEVFBTo29/+tnbt2qUZM2boBz/4gd566y1v5vXXX1dJSYkWLlyonTt36s4771QoFNLx48dbvRYAAOC2DmZmX/SbT5w4oczMTG3ZskX33XefGhsb9bWvfU2vvvqq/vmf/1mS9MEHH+iOO+5QVVWV7r77bm3cuFH/8A//oGPHjikQCEiSVqxYoTlz5ujEiRNKTk7WnDlzVF5ertraWu++Hn74YTU0NGjTpk2SpNzcXN1111168cUXJUnRaFRZWVl66qmnNHfu3Fat5VoikYjS09PV2Ngov9//RR+mv6k1v/r6S1nBV36/AAC0Z/E8f3+p9wg1NjZKkrp16yZJqqmp0fnz55Wfn+/NDBo0SH379lVVVZUkqaqqSsOGDfMiSJJCoZAikYj27dvnzVx8jJaZlmOcO3dONTU1MTMJCQnKz8/3Zlqzlks1NTUpEonE3AAAQPv1hUMoGo1qxowZGjNmjIYOHSpJCofDSk5OVkZGRsxsIBBQOBz2Zi6OoJb9LfuuNhOJRHTmzBl9/PHHam5uvuLMxce41louVVpaqvT0dO+WlZXVykcDAADcir5wCBUXF6u2tlZr1qz5KtfTpubNm6fGxkbvduTIkbZeEgAAuI6Svsg3Pfnkk1q/fr22bt2qPn36eNuDwaDOnTunhoaGmFdi6uvrFQwGvZlLr+5quZLr4plLr+6qr6+X3+9XamqqEhMTlZiYeMWZi49xrbVcyufzyefzxfFIAACAW1lcrwiZmZ588kn94Q9/0ObNm5WdnR2zf9SoUerYsaMqKyu9bXV1dTp8+LDy8vIkSXl5edq7d2/M1V0VFRXy+/0aPHiwN3PxMVpmWo6RnJysUaNGxcxEo1FVVlZ6M61ZCwAAcFtcrwgVFxfr1Vdf1RtvvKEuXbp477VJT09Xamqq0tPTNW3aNJWUlKhbt27y+/166qmnlJeX512lNX78eA0ePFhTpkzR4sWLFQ6H9ZOf/ETFxcXeqzGPP/64XnzxRc2ePVuPPPKINm/erLVr16q8/P+usiopKVFRUZFycnI0evRoPfvss/rss880depUb03XWgsAAHBbXCG0fPlySdLf/d3fxWx/5ZVX9P3vf1+S9Ktf/UoJCQmaOHGimpqaFAqFtGzZMm82MTFR69ev1xNPPKG8vDx16tRJRUVF+tnPfubNZGdnq7y8XDNnztRzzz2nPn366De/+Y1CoZA3M2nSJJ04cUILFixQOBzW8OHDtWnTppg3UF9rLQAAwG1f6nOE2js+RwgAgFvPDfscIQAAgFsZIQQAAJxFCAEAAGcRQgAAwFmEEAAAcBYhBAAAnEUIAQAAZxFCN7nWfNYQAAD4YgghAADgLEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihG4BfJYQAADXByF0iyCGAAD46hFCAADAWYQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIXQL4RJ6AAC+WoQQAABwFiEEAACcRQgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCAEAAGcRQgAAwFmE0C2GD1UEAOCrQwgBAABnEUIAAMBZhBAAAHAWIQQAAJxFCN2CeMM0AABfDUIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihG5RXEIPAMCXRwjdwoghAAC+HEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADiLEAIAAM4ihG5x/eeWcxk9AABfECEEAACcRQi1E7wqBABA/AghAADgLEIIAAA4ixACAADOIoTaEd4nBABAfAihdoYYAgCg9QghAADgLEKoHeJDFgEAaB1CCAAAOIsQasd4ZQgAgKsjhAAAgLMIIQfwqhAAAFfmRAgtXbpU/fv3V0pKinJzc7V9+/a2XtIN1/JrMqIIAID/0+5D6PXXX1dJSYkWLlyonTt36s4771QoFNLx48fbemlthiACAOB/tfsQ+o//+A89+uijmjp1qgYPHqwVK1YoLS1Nv/3tb9t6aW2OIAIAuC6prRdwPZ07d041NTWaN2+ety0hIUH5+fmqqqq6bL6pqUlNTU3e142NjZKkSCRyXdYXbfr8uhw3Xn1nrrvi9tqnQzd4JQAAfHktz9tmds3Zdh1CH3/8sZqbmxUIBGK2BwIBffDBB5fNl5aW6umnn75se1ZW1nVb480s/dm2XgEAAF/c6dOnlZ6eftWZdh1C8Zo3b55KSkq8r6PRqE6ePKnu3burQ4cOX+l9RSIRZWVl6ciRI/L7/V/psfHlcX5ufpyjmx/n6ObWns+Pmen06dPq1avXNWfbdQj16NFDiYmJqq+vj9leX1+vYDB42bzP55PP54vZlpGRcT2XKL/f3+7+B2xPOD83P87RzY9zdHNrr+fnWq8EtWjXb5ZOTk7WqFGjVFlZ6W2LRqOqrKxUXl5eG64MAADcDNr1K0KSVFJSoqKiIuXk5Gj06NF69tln9dlnn2nq1KltvTQAANDG2n0ITZo0SSdOnNCCBQsUDoc1fPhwbdq06bI3UN9oPp9PCxcuvOxXcbg5cH5ufpyjmx/n6ObG+flfHaw115YBAAC0Q+36PUIAAABXQwgBAABnEUIAAMBZhBAAAHAWIdQGli5dqv79+yslJUW5ubnavn17Wy+pXSotLdVdd92lLl26KDMzUxMmTFBdXV3MzNmzZ1VcXKzu3burc+fOmjhx4mUfwHn48GEVFBQoLS1NmZmZmjVrli5cuBAz8/bbb2vkyJHy+Xy6/fbbtXLlyuv947U7ZWVl6tChg2bMmOFt4/y0vaNHj+p73/ueunfvrtTUVA0bNkzvvfeet9/MtGDBAvXs2VOpqanKz8/XwYMHY45x8uRJFRYWyu/3KyMjQ9OmTdOnn34aM7Nnzx7de++9SklJUVZWlhYvXnxDfr5bXXNzs+bPn6/s7Gylpqbq61//un7+85/H/I0tztE1GG6oNWvWWHJysv32t7+1ffv22aOPPmoZGRlWX1/f1ktrd0KhkL3yyitWW1tru3btsr//+7+3vn372qeffurNPP7445aVlWWVlZX23nvv2d1332333HOPt//ChQs2dOhQy8/Pt/fff982bNhgPXr0sHnz5nkzH330kaWlpVlJSYnt37/fXnjhBUtMTLRNmzbd0J/3VrZ9+3br37+/ffOb37Tp06d72zk/bevkyZPWr18/+/73v2/V1dX20Ucf2VtvvWX//d//7c2UlZVZenq6/ed//qft3r3b/vEf/9Gys7PtzJkz3sz9999vd955p7377rv2X//1X3b77bfb5MmTvf2NjY0WCASssLDQamtr7bXXXrPU1FR76aWXbujPeytatGiRde/e3davX2+HDh2ydevWWefOne25557zZjhHV0cI3WCjR4+24uJi7+vm5mbr1auXlZaWtuGq3HD8+HGTZFu2bDEzs4aGBuvYsaOtW7fOmzlw4IBJsqqqKjMz27BhgyUkJFg4HPZmli9fbn6/35qamszMbPbs2TZkyJCY+5o0aZKFQqHr/SO1C6dPn7YBAwZYRUWFfetb3/JCiPPT9ubMmWNjx479m/uj0agFg0FbsmSJt62hocF8Pp+99tprZma2f/9+k2Q7duzwZjZu3GgdOnSwo0ePmpnZsmXLrGvXrt45a7nvgQMHftU/UrtTUFBgjzzySMy2hx56yAoLC82Mc9Qa/GrsBjp37pxqamqUn5/vbUtISFB+fr6qqqracGVuaGxslCR169ZNklRTU6Pz58/HnI9Bgwapb9++3vmoqqrSsGHDYj6AMxQKKRKJaN++fd7MxcdomeGctk5xcbEKCgoueww5P23vj3/8o3JycvSd73xHmZmZGjFihH796197+w8dOqRwOBzz+Kanpys3NzfmHGVkZCgnJ8ebyc/PV0JCgqqrq72Z++67T8nJyd5MKBRSXV2dTp06db1/zFvaPffco8rKSn344YeSpN27d2vbtm164IEHJHGOWqPdf7L0zeTjjz9Wc3PzZZ9qHQgE9MEHH7TRqtwQjUY1Y8YMjRkzRkOHDpUkhcNhJScnX/aHdQOBgMLhsDdzpfPVsu9qM5FIRGfOnFFqaur1+JHahTVr1mjnzp3asWPHZfs4P23vo48+0vLly1VSUqJ/+7d/044dO/SjH/1IycnJKioq8h7jKz2+Fz/+mZmZMfuTkpLUrVu3mJns7OzLjtGyr2vXrtfl52sP5s6dq0gkokGDBikxMVHNzc1atGiRCgsLJYlz1AqEEJxQXFys2tpabdu2ra2Xgv/vyJEjmj59uioqKpSSktLWy8EVRKNR5eTk6Be/+IUkacSIEaqtrdWKFStUVFTUxquDJK1du1arV6/Wq6++qiFDhmjXrl2aMWOGevXqxTlqJX41dgP16NFDiYmJl131Ul9fr2Aw2Earav+efPJJrV+/Xn/605/Up08fb3swGNS5c+fU0NAQM3/x+QgGg1c8Xy37rjbj9/t5teEqampqdPz4cY0cOVJJSUlKSkrSli1b9PzzzyspKUmBQIDz08Z69uypwYMHx2y74447dPjwYUn/9xhf7d+0YDCo48ePx+y/cOGCTp48Gdd5xJXNmjVLc+fO1cMPP6xhw4ZpypQpmjlzpkpLSyVxjlqDELqBkpOTNWrUKFVWVnrbotGoKisrlZeX14Yra5/MTE8++aT+8Ic/aPPmzZe9rDtq1Ch17Ngx5nzU1dXp8OHD3vnIy8vT3r17Y/6RqKiokN/v954g8vLyYo7RMsM5vbpx48Zp79692rVrl3fLyclRYWGh99+cn7Y1ZsyYyz5y4sMPP1S/fv0kSdnZ2QoGgzGPbyQSUXV1dcw5amhoUE1NjTezefNmRaNR5ebmejNbt27V+fPnvZmKigoNHDjwlv6Vy43w+eefKyEh9qk8MTFR0WhUEueoVdr63dquWbNmjfl8Plu5cqXt37/fHnvsMcvIyIi56gVfjSeeeMLS09Pt7bfftr/+9a/e7fPPP/dmHn/8cevbt69t3rzZ3nvvPcvLy7O8vDxvf8vl2ePHj7ddu3bZpk2b7Gtf+9oVL8+eNWuWHThwwJYuXcrl2V/QxVeNmXF+2tr27dstKSnJFi1aZAcPHrTVq1dbWlqa/e53v/NmysrKLCMjw9544w3bs2ePPfjgg1e8NHvEiBFWXV1t27ZtswEDBsRcmt3Q0GCBQMCmTJlitbW1tmbNGktLS2sXl2Zfb0VFRda7d2/v8vnf//731qNHD5s9e7Y3wzm6OkKoDbzwwgvWt29fS05OttGjR9u7777b1ktqlyRd8fbKK694M2fOnLF/+Zd/sa5du1paWpr90z/9k/31r3+NOc5f/vIXe+CBByw1NdV69Ohh//qv/2rnz5+PmfnTn/5kw4cPt+TkZLvtttti7gOtd2kIcX7a3ptvvmlDhw41n89ngwYNspdffjlmfzQatfnz51sgEDCfz2fjxo2zurq6mJlPPvnEJk+ebJ07dza/329Tp06106dPx8zs3r3bxo4daz6fz3r37m1lZWXX/WdrDyKRiE2fPt369u1rKSkpdtttt9mPf/zjmMvcOUdX18Hsoo+fBAAAcAjvEQIAAM4ihAAAgLMIIQAA4CxCCAAAOIsQAgAAziKEAACAswghAADgLEIIAAA4ixACAADOIoQAAICzCCEAAOAsQggAADjr/wEJjtRYCx2ibAAAAABJRU5ErkJggg==", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "# plot histogram\n", - "\n", - "values, bins, patches = plt.hist(text_lengths, bins=1000)" - ] - }, - { - "cell_type": "code", - "execution_count": 10, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([2.000000e+00, 1.062300e+01, 1.924600e+01, ..., 8.607754e+03,\n", - " 8.616377e+03, 8.625000e+03])" - ] - }, - "execution_count": 10, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bins" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "peak of histogram: (10.623, 913232.0)\n" - ] - } - ], - "source": [ - "# compute peak\n", - "print(f\"peak of histogram: {sorted(list(zip(bins, values)), key=lambda x: x[1], reverse=True)[0]}\")" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "625.0" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# compute quantile\n", - "np.quantile(text_lengths, q=0.99)" - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'whiskers': [,\n", - " ],\n", - " 'caps': [,\n", - " ],\n", - " 'boxes': [],\n", - " 'medians': [],\n", - " 'fliers': [],\n", - " 'means': []}" - ] - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.boxplot(text_lengths)" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0.8604472376830655" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "np.sum(text_lengths < 256) / len(text_lengths)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0. , 0.01, 0.02, 0.03, 0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 ,\n", - " 0.11, 0.12, 0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,\n", - " 0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 , 0.31, 0.32,\n", - " 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39, 0.4 , 0.41, 0.42, 0.43,\n", - " 0.44, 0.45, 0.46, 0.47, 0.48, 0.49, 0.5 , 0.51, 0.52, 0.53, 0.54,\n", - " 0.55, 0.56, 0.57, 0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65,\n", - " 0.66, 0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75, 0.76,\n", - " 0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84, 0.85, 0.86, 0.87,\n", - " 0.88, 0.89, 0.9 , 0.91, 0.92, 0.93, 0.94, 0.95, 0.96, 0.97, 0.98,\n", - " 0.99, 1. ])" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# compute q-values for 256 and 512 tokens\n", - "from scipy import special\n", - "\n", - "f = np.linspace(0,1,101)\n", - "f" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "0.5 - 0.5 * special.erf(f / np.sqrt(2)) # Q(f) = 0.5 - 0.5 erf(f/sqrt(2))" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "diffusion_boot_yasaman", - "language": "python", - "name": "diffusion_boot_yasaman" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.12" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} From 045233b6abaaf0f6861e18470fa0c5e30fb71a41 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:52:15 -0500 Subject: [PATCH 47/62] Update align.sh: Replace hardcoded directories with environment variable explanations --- openpmcvl/granular/pipeline/align.sh | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index 1128a3c..8da590f 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -8,11 +8,16 @@ #SBATCH --output=%x-%j.out #SBATCH --error=%x-%j.err -# Activate the environment -source /h/afallah/light/bin/activate +# Set environment variables +# VENV_PATH: Path to your virtual environment (e.g. export VENV_PATH=$HOME/venv) +# PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) +# PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) -# Set the working directory -cd /h/afallah/pmc-data-extraction +# Activate virtual environment +source $VENV_PATH/bin/activate + +# Set working directory +cd $PROJECT_ROOT # Check if the correct number of arguments are provided if [ $# -lt 2 ]; then @@ -23,19 +28,16 @@ fi BEGIN_IDX=$1 END_IDX=$2 -# Define the root directory -root_dir="/projects/multimodal/datasets/pmc_oa" - # Define the input and output files -input_file="${root_dir}/pmc_oa.jsonl" -output_file="${root_dir}/pmc_oa_labeled/pmc_oa_aligned_${BEGIN_IDX}_${END_IDX}.jsonl" +input_file="$PMC_ROOT/pmc_oa.jsonl" +output_file="$PMC_ROOT/pmc_oa_aligned_${BEGIN_IDX}_${END_IDX}.jsonl" # Print the alignment range echo "Aligning from index ${BEGIN_IDX} to ${END_IDX}" # Run the alignment script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ - --root_dir "$root_dir" \ + --root_dir "$PMC_ROOT" \ --dataset_path "$input_file" \ --save_path "$output_file" \ --dataset_slice "${BEGIN_IDX}:${END_IDX}" From a1ab5d640236820c0a2e457c8ea9a7f4fbb41520 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:52:15 -0500 Subject: [PATCH 48/62] Update classify.sh: Replace hardcoded directories with environment variable explanations --- openpmcvl/granular/pipeline/classify.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh index 8a8c872..b8b425f 100644 --- a/openpmcvl/granular/pipeline/classify.sh +++ b/openpmcvl/granular/pipeline/classify.sh @@ -7,11 +7,16 @@ #SBATCH --job-name=classify #SBATCH --output=%x-%j.out -# Activate the environment -source /h/afallah/light/bin/activate +# Set environment variables: +# VENV_PATH: Path to virtual environment (e.g. export VENV_PATH=$HOME/venv) +# PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) +# PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) -# Set the working directory -cd /h/afallah/pmc-data-extraction +# Activate virtual environment +source $VENV_PATH/bin/activate + +# Set working directory +cd $PROJECT_ROOT # Check if the number of arguments is provided if [ $# -eq 0 ]; then @@ -24,8 +29,8 @@ JSONL_NUMBERS="$@" # Iterate over each JSONL number for num in $JSONL_NUMBERS; do - input_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" - output_file="/datasets/PMC-15M/granular/${num}_subfigures_classified.jsonl" + input_file="$PMC_ROOT/${num}_subfigures.jsonl" + output_file="$PMC_ROOT/${num}_subfigures_classified.jsonl" # Run the classification script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ From cd3ed1fc7e0c0f07f4c72084a125fe12e20a70be Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:52:15 -0500 Subject: [PATCH 49/62] Update preprocess.sh: Replace hardcoded directories with environment variable explanations --- openpmcvl/granular/pipeline/preprocess.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index 227918f..76183f1 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -6,16 +6,21 @@ #SBATCH --job-name=preprocess #SBATCH --output=%x-%j.out -# Activate the environment -source /h/afallah/light/bin/activate +# Set environment variables: +# VENV_PATH: Path to virtual environment (e.g. export VENV_PATH=$HOME/venv) +# PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) +# PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) -# Set the working directory -cd /h/afallah/pmc-data-extraction +# Activate virtual environment +source $VENV_PATH/bin/activate + +# Set working directory +cd $PROJECT_ROOT # Define the paths for the input and output files -INPUT_DIR="/datasets/PMC-15M" -OUTPUT_FILE="/datasets/PMC-15M/granular/granular_meta.jsonl" -FIGURE_ROOT="/datasets/PMC-15M/figures" +INPUT_DIR="$PMC_ROOT" +OUTPUT_FILE="$PMC_ROOT/granular_meta.jsonl" +FIGURE_ROOT="$PMC_ROOT/figures" # Specify which JSONL files to process JSONL_NUMBERS="0 1 2 3 4 5 6 7 8 9 10 11" From 3a00710df663c6011118c993ed0b6c76cd6bcb32 Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:52:15 -0500 Subject: [PATCH 50/62] Update subcaption.sh: Replace hardcoded directories with environment variable explanations --- openpmcvl/granular/pipeline/subcaption.sh | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index 9707b82..c912cff 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -6,15 +6,20 @@ #SBATCH --job-name=subcaption #SBATCH --output=%x-%j.out -# Activate the environment -source /h/afallah/light/bin/activate +# Set environment variables: +# VENV_PATH: Path to virtual environment (e.g. export VENV_PATH=$HOME/venv) +# PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) +# PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) -# Set the working directory -cd /h/afallah/pmc-data-extraction +# Activate virtual environment +source $VENV_PATH/bin/activate + +# Set working directory +cd $PROJECT_ROOT # Run the subcaption script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ - --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ - --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ + --input-file $PMC_ROOT/pmc_oa.jsonl \ + --output-file $PMC_ROOT/pmc_oa_caption.jsonl \ --max-tokens 500 \ 2>&1 | tee -a %x-%j.out \ No newline at end of file From 4937b5e8f01a93f0a8e2818d6bb5b55a7dc14e5a Mon Sep 17 00:00:00 2001 From: afallah Date: Wed, 8 Jan 2025 19:52:15 -0500 Subject: [PATCH 51/62] Update subfigure.sh: Replace hardcoded directories with environment variable explanations --- openpmcvl/granular/pipeline/subfigure.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index c58e9a0..bd7c91f 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -7,11 +7,16 @@ #SBATCH --job-name=subfigure #SBATCH --output=%x-%j.out -# Activate the environment -source /h/afallah/light/bin/activate +# Set environment variables: +# VENV_PATH: Path to virtual environment (e.g. export VENV_PATH=$HOME/venv) +# PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) +# PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) -# Set the working directory -cd /h/afallah/pmc-data-extraction +# Activate virtual environment +source $VENV_PATH/bin/activate + +# Set working directory +cd $PROJECT_ROOT # Check if the number of arguments is provided if [ $# -eq 0 ]; then @@ -25,14 +30,14 @@ JSONL_NUMBERS="$@" # Iterate over each JSONL number for num in $JSONL_NUMBERS; do # Define the paths for the evaluation file and the record file - eval_file="/datasets/PMC-15M/granular/${num}_meta.jsonl" - rcd_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" + eval_file="$PMC_ROOT/${num}_meta.jsonl" + rcd_file="$PMC_ROOT/${num}_subfigures.jsonl" # Run the subfigure separation script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ --separation_model openpmcvl/granular/checkpoints/subfigure_detector.pth \ --eval_file "$eval_file" \ - --save_path /datasets/PMC-15M/granular/${num}_subfigures \ + --save_path "$PMC_ROOT/${num}_subfigures" \ --rcd_file "$rcd_file" \ --score_threshold 0.5 \ --nms_threshold 0.4 \ From 699085888c254dc3c94ad44a15b772f9c2425de1 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 00:05:34 -0500 Subject: [PATCH 52/62] Remove old util files. --- openpmcvl/granular/utils/__init__.py | 0 openpmcvl/granular/utils/clean_by_format.py | 68 ---------- .../granular/utils/compute_text_lengths.py | 52 -------- .../granular/utils/compute_text_lengths.slrm | 22 ---- .../granular/utils/create_captions_folder.py | 40 ------ openpmcvl/granular/utils/dir_or_file.py | 25 ---- openpmcvl/granular/utils/run.slrm | 25 ---- openpmcvl/granular/utils/train_test_split.py | 123 ------------------ 8 files changed, 355 deletions(-) delete mode 100644 openpmcvl/granular/utils/__init__.py delete mode 100644 openpmcvl/granular/utils/clean_by_format.py delete mode 100644 openpmcvl/granular/utils/compute_text_lengths.py delete mode 100644 openpmcvl/granular/utils/compute_text_lengths.slrm delete mode 100644 openpmcvl/granular/utils/create_captions_folder.py delete mode 100644 openpmcvl/granular/utils/dir_or_file.py delete mode 100644 openpmcvl/granular/utils/run.slrm delete mode 100644 openpmcvl/granular/utils/train_test_split.py diff --git a/openpmcvl/granular/utils/__init__.py b/openpmcvl/granular/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/openpmcvl/granular/utils/clean_by_format.py b/openpmcvl/granular/utils/clean_by_format.py deleted file mode 100644 index 7d11587..0000000 --- a/openpmcvl/granular/utils/clean_by_format.py +++ /dev/null @@ -1,68 +0,0 @@ -import json -import os -from tqdm import tqdm -from PIL import Image - - -def clean_by_format(jsonl_file, output_file, accepted_ext): - # load jsonl file - print(f"Loading data from {jsonl_file} ...") - with open(jsonl_file, "r") as f: - data = [json.loads(line) for line in f] - - clean_data = [] - for sample in tqdm(data): - # check media format - if sample["media_name"].split(".")[-1] in accepted_ext: - clean_data.append(sample) - - - # save new entries file - print(f"Saving data to {output_file} ...") - with open(output_file, "w") as f: - for sample in clean_data: - json.dump(sample, f) - f.write("\n") - - -def check_loadability(jsonl_file, output_file): - # load jsonl file - print(f"Loading data from {jsonl_file} ...") - with open(jsonl_file, "r") as f: - data = [json.loads(line) for line in f] - - num_error = 0 - clean_data = [] - for sample in tqdm(data): - # try loading the image with PIL - try: - img_path = os.path.join(os.path.dirname(jsonl_file), "figures", sample["media_name"]) - with Image.open(img_path) as img: - image = img.convert("RGB") - # if no exception occured, sample is loadable - clean_data.append(sample) - except Exception as e: - print(f"Error loading {img_path}") - print(e) - num_error += 1 - continue - - print(f"Number of error file: {num_error}") - - # save new entries file - print(f"Saving data to {output_file} ...") - with open(output_file, "w") as f: - for sample in clean_data: - json.dump(sample, f) - f.write("\n") - - -if __name__ == "__main__": - jsonl_file = "/datasets/PMC-15M/processed/train_.jsonl" - output_file = "/datasets/PMC-15M/processed/train_clean.jsonl" - accepted_ext = ["jpg", "png", "jpeg", "blp", "bmp", "gif", "dds", "dib", "eps"] - clean_by_format(jsonl_file, output_file, accepted_ext) - - checked_file = "/datasets/PMC-15M/processed/train_checked.jsonl" - check_loadability(output_file, checked_file) - diff --git a/openpmcvl/granular/utils/compute_text_lengths.py b/openpmcvl/granular/utils/compute_text_lengths.py deleted file mode 100644 index e375b93..0000000 --- a/openpmcvl/granular/utils/compute_text_lengths.py +++ /dev/null @@ -1,52 +0,0 @@ -import os -import json -import torch -from transformers import BertTokenizer -import matplotlib.pyplot as plt -import pickle -from time import time -from datetime import timedelta - - -# store the start time -stime = time() - -# get file names -rootdir = "/datasets/PMC-15M/" -filenames = [fname for fname in os.listdir(rootdir) if fname.endswith(".jsonl") and not fname.endswith("_refs.jsonl")] -filenames = sorted(filenames, key=lambda x: int(x.replace(".jsonl", ""))) - -print(f"[{timedelta(seconds=int(time() - stime))}] Name of found files in {rootdir}:") -print("\t"+"\n\t".join(filenames)) - -# create results directory -if not os.path.exists(os.path.join(rootdir, "text_lengths")): - os.mkdir(os.path.join(rootdir, "text_lengths")) -print(f"[{timedelta(seconds=int(time() - stime))}] Results directory is set to {os.path.join(rootdir, 'text_lengths')}") - -# load tokenizer -tokenizer = BertTokenizer.from_pretrained("bert-base-uncased") - -for fname in filenames: - text_lengths = [] - print(f"[{timedelta(seconds=int(time() - stime))}] Loading file {fname}...") - # load data - with open(os.path.join(rootdir, fname)) as f: - data = [json.loads(line)["caption"] for line in f] - - print(f"[{timedelta(seconds=int(time() - stime))}] Extracting caption lengths in {fname}...") - for caption in data: - tokens = tokenizer(caption, return_tensors='pt') - text_lengths.append(tokens["input_ids"].reshape(-1).shape[0]) - - print(f"[{timedelta(seconds=int(time() - stime))}] Saving caption lengths of {fname}...") - save_path = os.path.join(rootdir, "text_lengths", fname.replace(".jsonl", ".pkl")) - with open(save_path, "wb") as f: - pickle.dump(text_lengths, f) - print(f"[{timedelta(seconds=int(time() - stime))}] Saved caption lengths in {save_path}...") -print(f"[{timedelta(seconds=int(time() - stime))}] Successfully processed all files in {rootdir}") - - - - - diff --git a/openpmcvl/granular/utils/compute_text_lengths.slrm b/openpmcvl/granular/utils/compute_text_lengths.slrm deleted file mode 100644 index e2b8e15..0000000 --- a/openpmcvl/granular/utils/compute_text_lengths.slrm +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -#SBATCH --ntasks=1 -#SBATCH -c 4 -#SBATCH --mem=16G -#SBATCH --gres=gpu:1 -#SBATCH --time=8:00:00 -#SBATCH --job-name=pubmed -#SBATCH --output=pubmed_%j.log - -export ENVPATH=/projects/aieng/diffusion_bootcamp/env/diffusion-models-bootcamp-yasaman-in14eNW_-py3.9/bin/activate - -echo $(date) -echo Running on node $(hostname) -echo Saving logs in $(pwd) -echo Loading virtual environment from ${ENVPATH} - -# activate virtual environment -source ${ENVPATH} - -# start server on the given port -srun python -u compute_text_lengths.py diff --git a/openpmcvl/granular/utils/create_captions_folder.py b/openpmcvl/granular/utils/create_captions_folder.py deleted file mode 100644 index c2a789b..0000000 --- a/openpmcvl/granular/utils/create_captions_folder.py +++ /dev/null @@ -1,40 +0,0 @@ -import os -import re -import json -from tqdm import tqdm - - -def file_captions(jsonl_file): - # create output dir - cap_rootdir = os.path.join(os.path.dirname(jsonl_file), "captions") # captions root dir - if not os.path.isdir(cap_rootdir): - os.mkdir(cap_rootdir) - - # load jsonl file - print(f"Loading data from {jsonl_file} ...") - with open(jsonl_file, "r") as f: - data = [json.loads(line) for line in f] - - for sample in tqdm(data): - # write caption in a separate file - cap_filename = f"{sample['PMC_ID']}_{sample['media_id']}.txt" - with open(os.path.join(cap_rootdir, cap_filename), "w") as f: - f.write(sample["caption"]) - - # replace caption with caption file name in jsonl - sample.pop("caption", None) - sample["caption_name"] = cap_filename - - # save new entries file - with open(jsonl_file.replace(".jsonl", "_.jsonl"), "w") as f: - for sample in data: - json.dump(sample, f) - f.write("\n") - - -if __name__ == "__main__": - jsonl_file = "/datasets/PMC-15M/processed/train.jsonl" - file_captions(jsonl_file) - jsonl_file = "/datasets/PMC-15M/processed/test.jsonl" - file_captions(jsonl_file) - diff --git a/openpmcvl/granular/utils/dir_or_file.py b/openpmcvl/granular/utils/dir_or_file.py deleted file mode 100644 index e211245..0000000 --- a/openpmcvl/granular/utils/dir_or_file.py +++ /dev/null @@ -1,25 +0,0 @@ -import os -import json - -img_rootdir = "/datasets/PMC-15M/figures" - -for vol in range(2, 12): - print(f"VOLUME {vol}") - json_filename = f"/datasets/PMC-15M/{vol}.jsonl" - - with open(json_filename, "r") as f: - data = [json.loads(line) for line in f] - - print("ntotal:", len(data)) - count_files = 0 - ninfiles = 0 - for sample in data: - filename = os.path.join(img_rootdir, sample["media_name"]) - if os.path.isfile(filename): - count_files += 1 - inname = sample["media_url"].split("/")[-1] - if not os.path.isfile(os.path.join(filename, inname)): - ninfiles += 1 - - print("nfiles:", count_files) - print("all in-file?:", ninfiles == 0) diff --git a/openpmcvl/granular/utils/run.slrm b/openpmcvl/granular/utils/run.slrm deleted file mode 100644 index 053a360..0000000 --- a/openpmcvl/granular/utils/run.slrm +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -#SBATCH --job-name=pmc15m -#SBATCH --partition=cpu -#SBATCH --qos=cpu_qos -#SBATCH --mem=64G -#SBATCH --time=12:00:00 -#SBATCH --nodes=1 -#SBATCH --ntasks-per-node=1 -#SBATCH --cpus-per-task=12 -#SBATCH --export=ALL -#SBATCH --output=../../outputs/slurm-%j-%N.out - - -# load virtual env -# module purge -# module load anaconda/3.9 -# conda init bash -source ~/.bashrc -conda activate ~/Documents/envs/pubmed/ - - -# run -# srun python -u train_test_split.py -srun python -u clean_by_format.py \ No newline at end of file diff --git a/openpmcvl/granular/utils/train_test_split.py b/openpmcvl/granular/utils/train_test_split.py deleted file mode 100644 index 96d6c05..0000000 --- a/openpmcvl/granular/utils/train_test_split.py +++ /dev/null @@ -1,123 +0,0 @@ -import os -import json -import re -import numpy as np -from tqdm import tqdm - - -def aggregate_vols(jsonl_rootdir, banned_extentions): - """ - Gather all volumes in one file, fix media paths, and remove non-image files. - """ - # list all available volumes - volumes = [file for file in os.listdir(jsonl_rootdir) if re.fullmatch("[0-9]+\.jsonl", file) is not None] - volumes = sorted(volumes, key=lambda x: int(x.replace(".jsonl", ""))) - print(f"Found volumes: {volumes}") - - img_rootdir = os.path.join(jsonl_rootdir, "figures") # images root dir - all_data = [] # list for aggregated dataset - - for volume in volumes: - # load volume - print(f"Processing volume {volume} ...") - with open(os.path.join(jsonl_rootdir, volume), "r") as f: - data = [json.loads(line) for line in f] - - nbanned = 0 # count number of non-image media - for sample in tqdm(data): - media_name = os.path.join(img_rootdir, sample["media_name"]) - # check if media file/dir exists - if not os.path.exists(media_name): - continue - # check if media is image - extention = sample["media_name"].split(".")[-1] - if extention in banned_extentions: - nbanned += 1 - continue - # check if media_name is a file or directory - # if media_name is a directory, replace it with the name of the file inside it - if os.path.isdir(media_name): - dir_contents = os.listdir(media_name) - assert len(dir_contents) == 1, f"More than a single file exist in {media_name}" - media_name = os.path.join(media_name, dir_contents[0]) - assert os.path.isfile(media_name), f"Is a directory: {media_name}" - sample["media_name"] = os.path.join(sample["media_name"], dir_contents[0]) - # add sample to list - if os.path.isfile(media_name): - all_data.append(sample) - - print(f"{nbanned} non-image samples were in volume {volume}") - print(f"{len(all_data)} samples aggregated.") - - return all_data - - -def train_test_split(agg_filename, train_ratio, test_ratio=None, seed=42): - """ - Split dataset into train and test sets. - """ - # load dataset - print(f"Loading aggregated data: {agg_filename} ...") - with open(agg_filename, "r") as f: - data = [json.loads(line) for line in f] - - # determine number of train and test samples - print("Determining number of train and test samples...") - ntrain = int(len(data) * train_ratio) - if test_ratio is not None: - ntest = int(len(data) * test_ratio) - else: - ntest = len(data) - ntrain - - # randomly permute data - print("Permuting data samples...") - rng = np.random.default_rng(seed) - perm = rng.permutation(data) - - # split dataset - train_data = perm[:ntrain] - test_data = perm[ntrain:(ntrain+ntest)] - print("Finished splitting:") - print(f"num train: {len(train_data)}") - print(f"num test: {len(test_data)}") - - return train_data, test_data - - -def save_jsonl(data, filename): - with open(filename, "w") as f: - for sample in data: - json.dump(sample, f) - f.write("\n") - - -def create_dummy(filename, nsamples=1000): - # load dataset - print(f"Loading original data: {filename} ...") - with open(filename, "r") as f: - data = [json.loads(line) for line in f] - # save dummy version - save_jsonl(data[:nsamples], filename.replace(".jsonl", "_dummy.jsonl")) - -if __name__ == "__main__": - jsonl_rootdir = "/datasets/PMC-15M/processed" - banned_extentions = ["mov", "avi", "mpeg", "pdf", "mp4", "docx"] - agg_filename = os.path.join(jsonl_rootdir, "aggregated.jsonl") - - # # aggregate - # agg_data = aggregate_vols(jsonl_rootdir, banned_extentions) - # save_jsonl(agg_data, agg_filename) - - # # split - # train_data, test_data = train_test_split(agg_filename, train_ratio=0.8, seed=42) - # save_jsonl(train_data, os.path.join(jsonl_rootdir, "train.jsonl")) - # save_jsonl(test_data, os.path.join(jsonl_rootdir, "test.jsonl")) - - # test_filename = "/datasets/PMC-15M/processed/test_clean.jsonl" - # val_data, test_data = train_test_split(test_filename, train_ratio=0.5, seed=42) - # save_jsonl(val_data, os.path.join(jsonl_rootdir, "val_clean.jsonl")) - # save_jsonl(test_data, os.path.join(jsonl_rootdir, "test_clean.jsonl")) - - # # create dummy sets for debugging - # create_dummy(os.path.join(jsonl_rootdir, "train.jsonl"), 1000) - # create_dummy(os.path.join(jsonl_rootdir, "test.jsonl"), 500) \ No newline at end of file From ec99fe72ed5fae00ab90f3d146e0389ee5a0b80a Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 00:33:50 -0500 Subject: [PATCH 53/62] Add readme on how the granular pipeline should be used. --- openpmcvl/granular/README.md | 106 ++++++++++++++++++++++++++++++++++- 1 file changed, 103 insertions(+), 3 deletions(-) diff --git a/openpmcvl/granular/README.md b/openpmcvl/granular/README.md index f9a666b..00d177d 100644 --- a/openpmcvl/granular/README.md +++ b/openpmcvl/granular/README.md @@ -1,4 +1,104 @@ -# Granular Package +# **Granular Pipeline** +Our goal is to create a finegrained dataset of biomedical subfigure-subcaption pairs from raw dataset of PMC figure-caption pairs. We assume that a dataset of PMC figure-caption pairs, e.g. PMC-17M, is already downloaded. Note that all .sh files require you to pass in the JSONL numbers from the PMC dataset (e.g. `0 1 2 3 4 5 6 7 8 9 10 11`) as arguments.

+ + +## **1. Preprocess** +> **Code:** `preprocess.py & preprocess.sh`
+> **Input:** Directory of figures and PMC metadata in JSONL format
+> **Output:** Filtered figure-caption pairs in JSONL format (`${num}_meta.jsonl`)
+ +- Filter out figure-caption pairs that are not .jpg images, missing, or corrupted. +- Filter for figure-caption pairs that contain target biomedical keywords. + +Each datapoint contains the following fields: +- `id`: A unique identifier for the figure-caption pair. +- `PMC_ID`: The PMC ID of the article. +- `caption`: The caption of the figure. +- `image_path`: The path to the image file. +- `width`: The width of the image in pixels. +- `height`: The height of the image in pixels. +- `media_id`: The ID of the media file. +- `media_url`: The URL of the media file. +- `media_name`: The name of the media file. +- `keywords`: The keywords found in the caption. +- `is_medical`: Whether the caption contains any target biomedical keywords. +

+ +This script saves the output both as a directory of processed JSONL files and a merged JSONL file. The former is used in the next step of the pipeline. +

+ + +## **2. Subfigure Extraction** +> **Code:** `subfigure.py & subfigure.sh`
+> **Input:** Filtered figure-caption pairs in JSONL format (`${num}_meta.jsonl`)
+> **Output:** Directory of subfigure jpg files, and subfigure metadata in JSONL format (`${num}_subfigures.jsonl`)
+ +- Breakdown compound figures into subfigures. +- Keep original figure for non-compound figures or if an exception occurs. + +Each datapoint contains the following fields: + +When a subfigure is successfully detected and separated: +- `id`: Unique identifier for the subfigure (format: {source_figure_id}_{subfigure_number}.jpg) +- `source_fig_id`: ID of the original compound figure +- `PMC_ID`: PMC ID of the source article +- `media_name`: Original filename of the compound figure +- `position`: Coordinates of subfigure bounding box [(x1,y1), (x2,y2)] +- `score`: Detection confidence score +- `subfig_path`: Path to saved subfigure image + +When subfigure extraction fails: +- `id`: Generated ID that would have been used +- `source_fig_id`: ID of the original figure +- `PMC_ID`: PMC ID of the source article +- `media_name`: Original filename + +This script saves extracted subfigures as .jpg files in the target directory. Metadata for each subfigure is stored in separate JSONL files, with unique IDs that link back to the original figure-caption pairs in the source JSONL files. +

+ + +## **3. Subcaption Extraction** +> **Code:** `subcaption.py & subcaption.sh`
+> **Input:** PMC metadata in JSONL format
+> **Output:** PMC metadata in JSONL format with subcaptions
+ +- Extract subcaptions from captions. +- Keep original caption if the caption cannot be split into subcaptions. + +While this pipeline works, its slow as it goes through API calls one by one. There is a tutorial notebook using a batch API call to speed it up. It's highly recommended to use the notebook instead of this script. +

+ + +## **4. Classification** +> **Code:** `classify.py & classify.sh`
+> **Input:** Subfigure metadata in JSONL format (`${num}_subfigures.jsonl`)
+> **Output:** Subfigure metadata in JSONL format (`${num}_subfigures_classified.jsonl`)
+ +- Classify subfigures and include metadata about their class. + +The following fields are added to each datapoint: +- `is_medical_subfigure`: Whether the subfigure is a medical subfigure. +- `medical_class_rank`: The model's confidence in the medical classification. + +This script preserves all subfigures and adds an `is_medical_subfigure` boolean flag to identify medical subfigures. It also includes a `medical_class_rank` field indicating the model's confidence in the medical classification. +

+ + +## **5. Alignment** +> **Code:** `align.py & align.sh`
+> **Input:** Subfigure metadata in JSONL format (`${num}_subfigures_classified.jsonl`)
+> **Output:** Aligned subfigure metadata in JSONL format (`${num}_aligned.jsonl`)
+ +- Find the label associated with each subfigure. +- If no label is found, it means either: + - The image is a standalone figure (not part of a compound figure) + - The OCR model failed to detect the subfigure label (e.g. "A", "B", etc.) + +The non biomedical subfigures will be removed. The following fields are added to each datapoint: +- `label`: The label associated with the subfigure. (e.g. "Subfigure-A") +- `label_position`: The position of the label in the subfigure. + + +The outputs from steps 3 and 5 contain labeled subcaptions and labeled subfigures respectively. By matching these labels (e.g. "Subfigure-A"), we can create the final subfigure-subcaption pairs. Any cases where labels are missing or captions couldn't be split will be handled in subsequent steps. Refer to notebook for more details. +

-This package contains tools to extract sub-figures and sub-captions from downloaded image-caption pairs. -This enlarges the dataset, and may increase the quality of the data as well since the sub-pairs will be more focused and less confusing. From 2da05e17928e56f5a146d7c55c64e3bb59e9ea89 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 00:34:09 -0500 Subject: [PATCH 54/62] Improve the file naming convention in sh files. --- openpmcvl/granular/pipeline/align.sh | 40 ++++++++--------- openpmcvl/granular/pipeline/align_original.sh | 43 ++++++++++++++++++ .../granular/pipeline/classify_original.sh | 39 ++++++++++++++++ openpmcvl/granular/pipeline/preprocess.sh | 10 ++++- .../granular/pipeline/preprocess_original.sh | 35 +++++++++++++++ openpmcvl/granular/pipeline/subcaption.sh | 26 ++++++++--- .../granular/pipeline/subcaption_original.sh | 20 +++++++++ .../granular/pipeline/subfigure_original.sh | 45 +++++++++++++++++++ 8 files changed, 229 insertions(+), 29 deletions(-) create mode 100644 openpmcvl/granular/pipeline/align_original.sh create mode 100644 openpmcvl/granular/pipeline/classify_original.sh create mode 100644 openpmcvl/granular/pipeline/preprocess_original.sh create mode 100644 openpmcvl/granular/pipeline/subcaption_original.sh create mode 100644 openpmcvl/granular/pipeline/subfigure_original.sh diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index 8da590f..2523733 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -19,27 +19,25 @@ source $VENV_PATH/bin/activate # Set working directory cd $PROJECT_ROOT -# Check if the correct number of arguments are provided -if [ $# -lt 2 ]; then - echo "Please provide: begin index and end index as arguments." +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." exit 1 fi -BEGIN_IDX=$1 -END_IDX=$2 - -# Define the input and output files -input_file="$PMC_ROOT/pmc_oa.jsonl" -output_file="$PMC_ROOT/pmc_oa_aligned_${BEGIN_IDX}_${END_IDX}.jsonl" - -# Print the alignment range -echo "Aligning from index ${BEGIN_IDX} to ${END_IDX}" - -# Run the alignment script -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ - --root_dir "$PMC_ROOT" \ - --dataset_path "$input_file" \ - --save_path "$output_file" \ - --dataset_slice "${BEGIN_IDX}:${END_IDX}" - -echo "Finished aligning from index ${BEGIN_IDX} to ${END_IDX}" \ No newline at end of file +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" + +# Iterate over each JSONL number +for num in $JSONL_NUMBERS; do + input_file="$PMC_ROOT/${num}_subfigures_classified.jsonl" + output_file="$PMC_ROOT/${num}_aligned.jsonl" + + # Run the alignment script + stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ + --root_dir "$PMC_ROOT" \ + --dataset_path "$input_file" \ + --save_path "$output_file" + + echo "Finished aligning ${num}" +done diff --git a/openpmcvl/granular/pipeline/align_original.sh b/openpmcvl/granular/pipeline/align_original.sh new file mode 100644 index 0000000..1128a3c --- /dev/null +++ b/openpmcvl/granular/pipeline/align_original.sh @@ -0,0 +1,43 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --gres=gpu:1 +#SBATCH --partition=a40 +#SBATCH --mem=32GB +#SBATCH --time=12:00:00 +#SBATCH --job-name=align +#SBATCH --output=%x-%j.out +#SBATCH --error=%x-%j.err + +# Activate the environment +source /h/afallah/light/bin/activate + +# Set the working directory +cd /h/afallah/pmc-data-extraction + +# Check if the correct number of arguments are provided +if [ $# -lt 2 ]; then + echo "Please provide: begin index and end index as arguments." + exit 1 +fi + +BEGIN_IDX=$1 +END_IDX=$2 + +# Define the root directory +root_dir="/projects/multimodal/datasets/pmc_oa" + +# Define the input and output files +input_file="${root_dir}/pmc_oa.jsonl" +output_file="${root_dir}/pmc_oa_labeled/pmc_oa_aligned_${BEGIN_IDX}_${END_IDX}.jsonl" + +# Print the alignment range +echo "Aligning from index ${BEGIN_IDX} to ${END_IDX}" + +# Run the alignment script +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ + --root_dir "$root_dir" \ + --dataset_path "$input_file" \ + --save_path "$output_file" \ + --dataset_slice "${BEGIN_IDX}:${END_IDX}" + +echo "Finished aligning from index ${BEGIN_IDX} to ${END_IDX}" \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/classify_original.sh b/openpmcvl/granular/pipeline/classify_original.sh new file mode 100644 index 0000000..8a8c872 --- /dev/null +++ b/openpmcvl/granular/pipeline/classify_original.sh @@ -0,0 +1,39 @@ +#!/bin/bash +#SBATCH -c 12 +#SBATCH --gres=gpu:1 +#SBATCH --partition=a40 +#SBATCH --mem=100GB +#SBATCH --time=15:00:00 +#SBATCH --job-name=classify +#SBATCH --output=%x-%j.out + +# Activate the environment +source /h/afallah/light/bin/activate + +# Set the working directory +cd /h/afallah/pmc-data-extraction + +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." + exit 1 +fi + +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" + +# Iterate over each JSONL number +for num in $JSONL_NUMBERS; do + input_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" + output_file="/datasets/PMC-15M/granular/${num}_subfigures_classified.jsonl" + + # Run the classification script + stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ + --model_path openpmcvl/granular/checkpoints/resnext101_figure_class.pth \ + --dataset_path "$input_file" \ + --output_file "$output_file" \ + --batch_size 256 \ + --num_workers 8 \ + + echo "Finished classifying ${num}" +done \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index 76183f1..fdefaa1 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -22,8 +22,14 @@ INPUT_DIR="$PMC_ROOT" OUTPUT_FILE="$PMC_ROOT/granular_meta.jsonl" FIGURE_ROOT="$PMC_ROOT/figures" -# Specify which JSONL files to process -JSONL_NUMBERS="0 1 2 3 4 5 6 7 8 9 10 11" +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." + exit 1 +fi + +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" # Construct INPUT_FILES string INPUT_FILES="" diff --git a/openpmcvl/granular/pipeline/preprocess_original.sh b/openpmcvl/granular/pipeline/preprocess_original.sh new file mode 100644 index 0000000..227918f --- /dev/null +++ b/openpmcvl/granular/pipeline/preprocess_original.sh @@ -0,0 +1,35 @@ +#!/bin/bash +#SBATCH -c 32 +#SBATCH --partition=cpu +#SBATCH --mem=128GB +#SBATCH --time=12:00:00 +#SBATCH --job-name=preprocess +#SBATCH --output=%x-%j.out + +# Activate the environment +source /h/afallah/light/bin/activate + +# Set the working directory +cd /h/afallah/pmc-data-extraction + +# Define the paths for the input and output files +INPUT_DIR="/datasets/PMC-15M" +OUTPUT_FILE="/datasets/PMC-15M/granular/granular_meta.jsonl" +FIGURE_ROOT="/datasets/PMC-15M/figures" + +# Specify which JSONL files to process +JSONL_NUMBERS="0 1 2 3 4 5 6 7 8 9 10 11" + +# Construct INPUT_FILES string +INPUT_FILES="" +for num in $JSONL_NUMBERS; do + INPUT_FILES+="$INPUT_DIR/$num.jsonl " +done + +# Run the preprocess script +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ + --input_files $INPUT_FILES \ + --output_file $OUTPUT_FILE \ + --figure_root $FIGURE_ROOT \ + --keywords MRI fMRI CT CAT PET PET-MRI MEG EEG ultrasound X-ray Xray nuclear imaging tracer isotope scan positron EKG spectroscopy radiograph tomography endoscope endoscopy colonoscopy elastography ultrasonic ultrasonography echocardiogram endomicroscopy pancreatoscopy cholangioscopy enteroscopy retroscopy chromoendoscopy sigmoidoscopy cholangiography pancreatography cholangio-pancreatography esophagogastroduodenoscopy radiology pathology histopathology \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index c912cff..a705d64 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -17,9 +17,23 @@ source $VENV_PATH/bin/activate # Set working directory cd $PROJECT_ROOT -# Run the subcaption script -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ - --input-file $PMC_ROOT/pmc_oa.jsonl \ - --output-file $PMC_ROOT/pmc_oa_caption.jsonl \ - --max-tokens 500 \ - 2>&1 | tee -a %x-%j.out \ No newline at end of file +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." + exit 1 +fi + +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" + +# Iterate over each JSONL number +for num in $JSONL_NUMBERS; do + # Run the subcaption script + stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ + --input-file "$PMC_ROOT/${num}_meta.jsonl" \ + --output-file "$PMC_ROOT/${num}_subcaptions.jsonl" \ + --max-tokens 500 \ + 2>&1 | tee -a %x-%j.out + + echo "Finished processing ${num}" +done \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/subcaption_original.sh b/openpmcvl/granular/pipeline/subcaption_original.sh new file mode 100644 index 0000000..9707b82 --- /dev/null +++ b/openpmcvl/granular/pipeline/subcaption_original.sh @@ -0,0 +1,20 @@ +#!/bin/bash +#SBATCH -c 6 +#SBATCH --partition=cpu +#SBATCH --mem=32GB +#SBATCH --time=8:00:00 +#SBATCH --job-name=subcaption +#SBATCH --output=%x-%j.out + +# Activate the environment +source /h/afallah/light/bin/activate + +# Set the working directory +cd /h/afallah/pmc-data-extraction + +# Run the subcaption script +stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ + --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ + --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ + --max-tokens 500 \ + 2>&1 | tee -a %x-%j.out \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/subfigure_original.sh b/openpmcvl/granular/pipeline/subfigure_original.sh new file mode 100644 index 0000000..c58e9a0 --- /dev/null +++ b/openpmcvl/granular/pipeline/subfigure_original.sh @@ -0,0 +1,45 @@ +#!/bin/bash +#SBATCH -c 12 +#SBATCH --gres=gpu:1 +#SBATCH --partition=a40 +#SBATCH --mem=100GB +#SBATCH --time=15:00:00 +#SBATCH --job-name=subfigure +#SBATCH --output=%x-%j.out + +# Activate the environment +source /h/afallah/light/bin/activate + +# Set the working directory +cd /h/afallah/pmc-data-extraction + +# Check if the number of arguments is provided +if [ $# -eq 0 ]; then + echo "Please provide JSONL numbers as arguments." + exit 1 +fi + +# Get the list of JSONL numbers from the command line arguments +JSONL_NUMBERS="$@" + +# Iterate over each JSONL number +for num in $JSONL_NUMBERS; do + # Define the paths for the evaluation file and the record file + eval_file="/datasets/PMC-15M/granular/${num}_meta.jsonl" + rcd_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" + + # Run the subfigure separation script + stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ + --separation_model openpmcvl/granular/checkpoints/subfigure_detector.pth \ + --eval_file "$eval_file" \ + --save_path /datasets/PMC-15M/granular/${num}_subfigures \ + --rcd_file "$rcd_file" \ + --score_threshold 0.5 \ + --nms_threshold 0.4 \ + --batch_size 128 \ + --num_workers 8 \ + --gpu 0 + + # Print a message indicating the completion of processing for the current JSONL number + echo "Finished processing ${num}" +done From 1c365bdc9d451be2daa933605cda5eef548c3aac Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 00:34:44 -0500 Subject: [PATCH 55/62] Improve style. --- openpmcvl/granular/pipeline/subcaption.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/openpmcvl/granular/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py index dd35aa4..f648494 100644 --- a/openpmcvl/granular/pipeline/subcaption.py +++ b/openpmcvl/granular/pipeline/subcaption.py @@ -6,7 +6,7 @@ from typing import Dict from openai import OpenAI -from openpmcvl.granular.pipeline.utils import load_dataset +from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl PROMPT = """ @@ -128,11 +128,7 @@ def main(args: argparse.Namespace) -> None: results.append(item) - with open(args.output_file, "w") as f: - for item in results: - json.dump(item, f) - f.write("\n") - + save_jsonl(results, args.output_file) print(f"\nResults saved to {args.output_file}") From 58a914873df474bb5322b8aa69f0cada44146011 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 01:02:37 -0500 Subject: [PATCH 56/62] Add subcaption pipeline. --- openpmcvl/granular/pipeline/subcaption.ipynb | 217 +++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 openpmcvl/granular/pipeline/subcaption.ipynb diff --git a/openpmcvl/granular/pipeline/subcaption.ipynb b/openpmcvl/granular/pipeline/subcaption.ipynb new file mode 100644 index 0000000..e7a6b6c --- /dev/null +++ b/openpmcvl/granular/pipeline/subcaption.ipynb @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import shutil\n", + "import re\n", + "import pickle\n", + "import json\n", + "from typing import Any, Dict, List\n", + "from dotenv import load_dotenv\n", + "from tqdm import tqdm\n", + "from openai import OpenAI\n", + "\n", + "from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl\n", + "\n", + "PMC_ROOT = \"set this directory\"\n", + "\n", + "# Make sure .env file containt OPENAI_API_KEY\n", + "load_dotenv()\n", + "client = OpenAI()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# **Subcaption Extraction**\n", + "\n", + "Extracts subfigure captions from figure captions using OpenAI's GPT-4o Batch API.\n", + "\n", + "## Pipeline\n", + "1. Input: JSONL with metadata (captions + IDs)\n", + "2. Generate batch API requests (50k limit)\n", + "3. Submit to OpenAI batch processing\n", + "4. Get results as structured subcaptions\n", + "5. Save results to JSONL file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "PROMPT = \"\"\"\n", + "Subfigure labels are letters referring to individual subfigures within a larger figure.\n", + "This is a caption: \"%s\"\n", + "Check if the caption contains explicit subfigure label. \n", + "If not, output \"NO\" and end the generation. \n", + "If yes, output \"YES\", then generate the subcaption of the subfigures according to the caption. \n", + "The output should use the template:\n", + " YES\n", + " Subfigure-A: ...\n", + " Subfigure-B: ...\n", + " ...\n", + "The label should be removed from subcaption.\n", + "\"\"\".strip()\n", + "\n", + "caption = \"Try sample caption!\"\n", + "\n", + "\n", + "completion = client.chat.completions.create(\n", + " model=\"gpt-4o-2024-08-06\",\n", + " messages=[\n", + " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", + " {\"role\": \"user\", \"content\": PROMPT % caption},\n", + " ],\n", + " temperature=0,\n", + " max_tokens=500,\n", + ")\n", + "\n", + "print(completion.choices[0].message.content)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [], + "source": [ + "def generate_api_request(custom_id, system_content, user_content):\n", + " \"\"\"Generate a single API request in the required format.\"\"\"\n", + " return {\n", + " \"custom_id\": custom_id,\n", + " \"method\": \"POST\",\n", + " \"url\": \"/v1/chat/completions\",\n", + " \"body\": {\n", + " \"model\": \"gpt-4o-2024-08-06\",\n", + " \"messages\": [\n", + " {\"role\": \"system\", \"content\": system_content},\n", + " {\"role\": \"user\", \"content\": user_content},\n", + " ],\n", + " \"temperature\": 0,\n", + " \"max_tokens\": 2000,\n", + " },\n", + " }\n", + "\n", + "\n", + "def create_prompt(caption):\n", + " \"\"\"Create the prompt template with the given caption.\"\"\"\n", + " return PROMPT.strip() % caption\n", + "\n", + "\n", + "def generate_jsonl(dataset, requests_file):\n", + " \"\"\"Generate JSONL file with API requests.\n", + " \n", + " Args:\n", + " dataset: List of metadata containing captions and IDs\n", + " requests_file: Path to output requests JSONL file\n", + " \"\"\"\n", + " count = 0\n", + " \n", + " # Open output file and write requests line by line\n", + " with open(requests_file, \"w\") as f:\n", + " for data in dataset:\n", + " count += 1\n", + " \n", + " # Skip first 50k entries (already processed)\n", + " if count <= 50000: # Batch API can handle at most 50k requests\n", + " continue\n", + " \n", + " # Only process captions under 400 words\n", + " if len(data[\"caption\"].split()) <= 400:\n", + "\n", + " # Generate API request for this caption\n", + " request = generate_api_request(\n", + " custom_id=f\"{data['id']}\",\n", + " system_content=\"You are a helpful assistant.\",\n", + " user_content=create_prompt(data[\"caption\"]),\n", + " )\n", + " \n", + " # Write request as JSON line\n", + " f.write(json.dumps(request) + \"\\n\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Load the metadata dataset containing captions and IDs\n", + "dataset = load_dataset(os.path.join(PMC_ROOT, \"meta.jsonl\"))\n", + "\n", + "# Define output path for API requests\n", + "requests_file = os.path.join(PMC_ROOT, \"requests.jsonl\")\n", + "\n", + "# Generate JSONL file with API requests for each caption\n", + "generate_jsonl(dataset, requests_file)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Upload the requests file to OpenAI for batch processing\n", + "batch_input_file = client.files.create(file=open(requests_file, \"rb\"), purpose=\"batch\")\n", + "batch_input_file_id = batch_input_file.id\n", + "\n", + "# Create a batch job to process the requests\n", + "# This will run for up to 24 hours and process 50k subcaptions\n", + "client.batches.create(\n", + " input_file_id=batch_input_file_id,\n", + " endpoint=\"/v1/chat/completions\",\n", + " completion_window=\"24h\", \n", + " metadata={\"description\": \"50k subcaptions\"},\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Note you have to run this separately for each submitted batch\n", + "# Check status of first batch job\n", + "print(client.batches.retrieve(\"batch_xxxxx\"))\n", + "\n", + "# Get the output file content from the completed batch\n", + "file_response = client.files.content(\"file-xxxxxx\")\n", + "\n", + "# Write the batch results to a JSONL file\n", + "with open(f\"{PMC_ROOT}/subcaptions.jsonl\", \"w\") as f:\n", + " f.write(file_response.text)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.9" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 7600a165e4abc1f24e56487132810cf6d509e1db Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 01:04:39 -0500 Subject: [PATCH 57/62] Add guide to use the subcaption.ipynb for subcaption pipeline. --- openpmcvl/granular/README.md | 4 ++-- openpmcvl/granular/pipeline/subcaption.ipynb | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openpmcvl/granular/README.md b/openpmcvl/granular/README.md index 00d177d..11d762f 100644 --- a/openpmcvl/granular/README.md +++ b/openpmcvl/granular/README.md @@ -58,14 +58,14 @@ This script saves extracted subfigures as .jpg files in the target directory. Me ## **3. Subcaption Extraction** -> **Code:** `subcaption.py & subcaption.sh`
+> **Code:** `subcaption.ipynb | subcaption.py & subcaption.sh`
> **Input:** PMC metadata in JSONL format
> **Output:** PMC metadata in JSONL format with subcaptions
- Extract subcaptions from captions. - Keep original caption if the caption cannot be split into subcaptions. -While this pipeline works, its slow as it goes through API calls one by one. There is a tutorial notebook using a batch API call to speed it up. It's highly recommended to use the notebook instead of this script. +While this pipeline works, its slow as it goes through API calls one by one. There is a notebook (`subcaption.ipynb`) using batch API calls to speed it up. It's highly recommended to use the notebook instead of this script.

diff --git a/openpmcvl/granular/pipeline/subcaption.ipynb b/openpmcvl/granular/pipeline/subcaption.ipynb index e7a6b6c..710c16a 100644 --- a/openpmcvl/granular/pipeline/subcaption.ipynb +++ b/openpmcvl/granular/pipeline/subcaption.ipynb @@ -145,6 +145,7 @@ "outputs": [], "source": [ "# Load the metadata dataset containing captions and IDs\n", + "# If you have multiple datasets, you can merge them into one\n", "dataset = load_dataset(os.path.join(PMC_ROOT, \"meta.jsonl\"))\n", "\n", "# Define output path for API requests\n", From af738ff8184dbcf8fcb88dfa2b10df97570c84d6 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 11:10:54 -0500 Subject: [PATCH 58/62] Remove files with explicit directories. --- openpmcvl/granular/pipeline/align_original.sh | 43 ------------------ .../granular/pipeline/classify_original.sh | 39 ---------------- .../granular/pipeline/preprocess_original.sh | 35 --------------- .../granular/pipeline/subcaption_original.sh | 20 --------- .../granular/pipeline/subfigure_original.sh | 45 ------------------- 5 files changed, 182 deletions(-) delete mode 100644 openpmcvl/granular/pipeline/align_original.sh delete mode 100644 openpmcvl/granular/pipeline/classify_original.sh delete mode 100644 openpmcvl/granular/pipeline/preprocess_original.sh delete mode 100644 openpmcvl/granular/pipeline/subcaption_original.sh delete mode 100644 openpmcvl/granular/pipeline/subfigure_original.sh diff --git a/openpmcvl/granular/pipeline/align_original.sh b/openpmcvl/granular/pipeline/align_original.sh deleted file mode 100644 index 1128a3c..0000000 --- a/openpmcvl/granular/pipeline/align_original.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/bin/bash -#SBATCH -c 6 -#SBATCH --gres=gpu:1 -#SBATCH --partition=a40 -#SBATCH --mem=32GB -#SBATCH --time=12:00:00 -#SBATCH --job-name=align -#SBATCH --output=%x-%j.out -#SBATCH --error=%x-%j.err - -# Activate the environment -source /h/afallah/light/bin/activate - -# Set the working directory -cd /h/afallah/pmc-data-extraction - -# Check if the correct number of arguments are provided -if [ $# -lt 2 ]; then - echo "Please provide: begin index and end index as arguments." - exit 1 -fi - -BEGIN_IDX=$1 -END_IDX=$2 - -# Define the root directory -root_dir="/projects/multimodal/datasets/pmc_oa" - -# Define the input and output files -input_file="${root_dir}/pmc_oa.jsonl" -output_file="${root_dir}/pmc_oa_labeled/pmc_oa_aligned_${BEGIN_IDX}_${END_IDX}.jsonl" - -# Print the alignment range -echo "Aligning from index ${BEGIN_IDX} to ${END_IDX}" - -# Run the alignment script -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/align.py \ - --root_dir "$root_dir" \ - --dataset_path "$input_file" \ - --save_path "$output_file" \ - --dataset_slice "${BEGIN_IDX}:${END_IDX}" - -echo "Finished aligning from index ${BEGIN_IDX} to ${END_IDX}" \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/classify_original.sh b/openpmcvl/granular/pipeline/classify_original.sh deleted file mode 100644 index 8a8c872..0000000 --- a/openpmcvl/granular/pipeline/classify_original.sh +++ /dev/null @@ -1,39 +0,0 @@ -#!/bin/bash -#SBATCH -c 12 -#SBATCH --gres=gpu:1 -#SBATCH --partition=a40 -#SBATCH --mem=100GB -#SBATCH --time=15:00:00 -#SBATCH --job-name=classify -#SBATCH --output=%x-%j.out - -# Activate the environment -source /h/afallah/light/bin/activate - -# Set the working directory -cd /h/afallah/pmc-data-extraction - -# Check if the number of arguments is provided -if [ $# -eq 0 ]; then - echo "Please provide JSONL numbers as arguments." - exit 1 -fi - -# Get the list of JSONL numbers from the command line arguments -JSONL_NUMBERS="$@" - -# Iterate over each JSONL number -for num in $JSONL_NUMBERS; do - input_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" - output_file="/datasets/PMC-15M/granular/${num}_subfigures_classified.jsonl" - - # Run the classification script - stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/classify.py \ - --model_path openpmcvl/granular/checkpoints/resnext101_figure_class.pth \ - --dataset_path "$input_file" \ - --output_file "$output_file" \ - --batch_size 256 \ - --num_workers 8 \ - - echo "Finished classifying ${num}" -done \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/preprocess_original.sh b/openpmcvl/granular/pipeline/preprocess_original.sh deleted file mode 100644 index 227918f..0000000 --- a/openpmcvl/granular/pipeline/preprocess_original.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash -#SBATCH -c 32 -#SBATCH --partition=cpu -#SBATCH --mem=128GB -#SBATCH --time=12:00:00 -#SBATCH --job-name=preprocess -#SBATCH --output=%x-%j.out - -# Activate the environment -source /h/afallah/light/bin/activate - -# Set the working directory -cd /h/afallah/pmc-data-extraction - -# Define the paths for the input and output files -INPUT_DIR="/datasets/PMC-15M" -OUTPUT_FILE="/datasets/PMC-15M/granular/granular_meta.jsonl" -FIGURE_ROOT="/datasets/PMC-15M/figures" - -# Specify which JSONL files to process -JSONL_NUMBERS="0 1 2 3 4 5 6 7 8 9 10 11" - -# Construct INPUT_FILES string -INPUT_FILES="" -for num in $JSONL_NUMBERS; do - INPUT_FILES+="$INPUT_DIR/$num.jsonl " -done - -# Run the preprocess script -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ - --input_files $INPUT_FILES \ - --output_file $OUTPUT_FILE \ - --figure_root $FIGURE_ROOT \ - --keywords MRI fMRI CT CAT PET PET-MRI MEG EEG ultrasound X-ray Xray nuclear imaging tracer isotope scan positron EKG spectroscopy radiograph tomography endoscope endoscopy colonoscopy elastography ultrasonic ultrasonography echocardiogram endomicroscopy pancreatoscopy cholangioscopy enteroscopy retroscopy chromoendoscopy sigmoidoscopy cholangiography pancreatography cholangio-pancreatography esophagogastroduodenoscopy radiology pathology histopathology \ - 2>&1 | tee -a %x-%j.out \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/subcaption_original.sh b/openpmcvl/granular/pipeline/subcaption_original.sh deleted file mode 100644 index 9707b82..0000000 --- a/openpmcvl/granular/pipeline/subcaption_original.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -#SBATCH -c 6 -#SBATCH --partition=cpu -#SBATCH --mem=32GB -#SBATCH --time=8:00:00 -#SBATCH --job-name=subcaption -#SBATCH --output=%x-%j.out - -# Activate the environment -source /h/afallah/light/bin/activate - -# Set the working directory -cd /h/afallah/pmc-data-extraction - -# Run the subcaption script -stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subcaption.py \ - --input-file /datasets/PMC-15M/experimental/demo/demo.jsonl \ - --output-file /datasets/PMC-15M/experimental/demo/demo_caption.jsonl \ - --max-tokens 500 \ - 2>&1 | tee -a %x-%j.out \ No newline at end of file diff --git a/openpmcvl/granular/pipeline/subfigure_original.sh b/openpmcvl/granular/pipeline/subfigure_original.sh deleted file mode 100644 index c58e9a0..0000000 --- a/openpmcvl/granular/pipeline/subfigure_original.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -#SBATCH -c 12 -#SBATCH --gres=gpu:1 -#SBATCH --partition=a40 -#SBATCH --mem=100GB -#SBATCH --time=15:00:00 -#SBATCH --job-name=subfigure -#SBATCH --output=%x-%j.out - -# Activate the environment -source /h/afallah/light/bin/activate - -# Set the working directory -cd /h/afallah/pmc-data-extraction - -# Check if the number of arguments is provided -if [ $# -eq 0 ]; then - echo "Please provide JSONL numbers as arguments." - exit 1 -fi - -# Get the list of JSONL numbers from the command line arguments -JSONL_NUMBERS="$@" - -# Iterate over each JSONL number -for num in $JSONL_NUMBERS; do - # Define the paths for the evaluation file and the record file - eval_file="/datasets/PMC-15M/granular/${num}_meta.jsonl" - rcd_file="/datasets/PMC-15M/granular/${num}_subfigures.jsonl" - - # Run the subfigure separation script - stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ - --separation_model openpmcvl/granular/checkpoints/subfigure_detector.pth \ - --eval_file "$eval_file" \ - --save_path /datasets/PMC-15M/granular/${num}_subfigures \ - --rcd_file "$rcd_file" \ - --score_threshold 0.5 \ - --nms_threshold 0.4 \ - --batch_size 128 \ - --num_workers 8 \ - --gpu 0 - - # Print a message indicating the completion of processing for the current JSONL number - echo "Finished processing ${num}" -done From 616b6efcbfb27f7eca28154c6de4a7b354b253f5 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 11:15:23 -0500 Subject: [PATCH 59/62] Add sample command for .sh files. --- openpmcvl/granular/README.md | 7 ++++++- openpmcvl/granular/pipeline/align.sh | 4 ++++ openpmcvl/granular/pipeline/classify.sh | 4 ++++ openpmcvl/granular/pipeline/preprocess.sh | 4 ++++ openpmcvl/granular/pipeline/subcaption.sh | 3 +++ openpmcvl/granular/pipeline/subfigure.sh | 3 +++ 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/openpmcvl/granular/README.md b/openpmcvl/granular/README.md index 11d762f..4dbb47d 100644 --- a/openpmcvl/granular/README.md +++ b/openpmcvl/granular/README.md @@ -1,5 +1,10 @@ # **Granular Pipeline** -Our goal is to create a finegrained dataset of biomedical subfigure-subcaption pairs from raw dataset of PMC figure-caption pairs. We assume that a dataset of PMC figure-caption pairs, e.g. PMC-17M, is already downloaded. Note that all .sh files require you to pass in the JSONL numbers from the PMC dataset (e.g. `0 1 2 3 4 5 6 7 8 9 10 11`) as arguments.

+Our goal is to create a finegrained dataset of biomedical subfigure-subcaption pairs from the raw dataset of PMC figure-caption pairs. We assume that a dataset of PMC figure-caption pairs, e.g. PMC-17M, is already downloaded, formatted as a directory of JSONL files and a directory of image .jpg files. Note that all .sh files require you to pass in the JSONL numbers from the PMC dataset as arguments. + +Sample command: +```bash +sbatch openpmcvl/granular/pipeline/preprocess.sh 0 1 2 3 4 5 6 7 8 9 10 11 +``` ## **1. Preprocess** diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index 2523733..bd14380 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -13,6 +13,10 @@ # PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) # PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) +# Sample command: +# sbatch openpmcvl/granular/pipeline/align.sh 0 1 2 3 4 5 6 7 8 9 10 11 + + # Activate virtual environment source $VENV_PATH/bin/activate diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh index b8b425f..ca22e33 100644 --- a/openpmcvl/granular/pipeline/classify.sh +++ b/openpmcvl/granular/pipeline/classify.sh @@ -12,6 +12,10 @@ # PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) # PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) +# Sample command: +# sbatch openpmcvl/granular/pipeline/classify.sh 0 1 2 3 4 5 6 7 8 9 10 11 + + # Activate virtual environment source $VENV_PATH/bin/activate diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index fdefaa1..72b5671 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -11,6 +11,10 @@ # PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) # PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) +# Sample command: +# sbatch openpmcvl/granular/pipeline/preprocess.sh 0 1 2 3 4 5 6 7 8 9 10 11 + + # Activate virtual environment source $VENV_PATH/bin/activate diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index a705d64..4cdbb1a 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -11,6 +11,9 @@ # PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) # PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) +# Sample command: +# sbatch openpmcvl/granular/pipeline/subcaption.sh 0 1 2 3 4 5 6 7 8 9 10 11 + # Activate virtual environment source $VENV_PATH/bin/activate diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index bd7c91f..aa46220 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -12,6 +12,9 @@ # PROJECT_ROOT: Path to project root directory (e.g. export PROJECT_ROOT=$HOME/project) # PMC_ROOT: Path to PMC dataset directory (e.g. export PMC_ROOT=$HOME/data) +# Sample command: +# sbatch openpmcvl/granular/pipeline/subfigure.sh 0 1 2 3 4 5 6 7 8 9 10 11 + # Activate virtual environment source $VENV_PATH/bin/activate From abff95c39496a97fa57922b9fbce0b9f51714a86 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 11:22:38 -0500 Subject: [PATCH 60/62] Add file description to sh files. --- openpmcvl/granular/pipeline/align.sh | 2 ++ openpmcvl/granular/pipeline/classify.sh | 2 ++ openpmcvl/granular/pipeline/preprocess.sh | 2 ++ openpmcvl/granular/pipeline/subcaption.sh | 2 ++ openpmcvl/granular/pipeline/subfigure.sh | 2 ++ 5 files changed, 10 insertions(+) diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index bd14380..341b0ce 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Batch script to align subfigures with subcaptions + #SBATCH -c 6 #SBATCH --gres=gpu:1 #SBATCH --partition=a40 diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh index ca22e33..c23dc10 100644 --- a/openpmcvl/granular/pipeline/classify.sh +++ b/openpmcvl/granular/pipeline/classify.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Batch script to classify subfigures into figure types + #SBATCH -c 12 #SBATCH --gres=gpu:1 #SBATCH --partition=a40 diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index 72b5671..12dffa5 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Batch script to preprocess PMC figure-caption pairs + #SBATCH -c 32 #SBATCH --partition=cpu #SBATCH --mem=128GB diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index 4cdbb1a..de6a9d2 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Batch script to extract subcaptions from figure captions using GPT API + #SBATCH -c 6 #SBATCH --partition=cpu #SBATCH --mem=32GB diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index aa46220..e4423d5 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -1,4 +1,6 @@ #!/bin/bash +# Batch script to extract subfigures from compound figures using a detection model + #SBATCH -c 12 #SBATCH --gres=gpu:1 #SBATCH --partition=a40 From 70a9eb1cd64f9bcb11753cd5b4563f281a6f15a9 Mon Sep 17 00:00:00 2001 From: afallah Date: Tue, 14 Jan 2025 11:32:05 -0500 Subject: [PATCH 61/62] Improve style. --- openpmcvl/granular/models/network.py | 2 +- openpmcvl/granular/models/process.py | 16 ++++++----- .../granular/models/subfigure_detector.py | 8 +++--- openpmcvl/granular/models/subfigure_ocr.py | 18 ++++++------- .../granular/models/transformer_module.py | 5 ++-- openpmcvl/granular/models/yolo_layer.py | 22 +++++++++------ openpmcvl/granular/models/yolov3.py | 27 ++++++++++++------- openpmcvl/granular/pipeline/align.py | 6 +++-- openpmcvl/granular/pipeline/classify.py | 17 +++++++----- openpmcvl/granular/pipeline/preprocess.py | 19 ++++++++----- openpmcvl/granular/pipeline/subcaption.ipynb | 21 +++++++-------- openpmcvl/granular/pipeline/subcaption.py | 17 ++++++------ openpmcvl/granular/pipeline/subfigure.py | 13 +++++---- openpmcvl/granular/pipeline/utils.py | 15 +++++++---- 14 files changed, 122 insertions(+), 84 deletions(-) diff --git a/openpmcvl/granular/models/network.py b/openpmcvl/granular/models/network.py index f635d37..8a3af9c 100644 --- a/openpmcvl/granular/models/network.py +++ b/openpmcvl/granular/models/network.py @@ -1,5 +1,5 @@ import torch -import torch.nn as nn +from torch import nn from torch.utils.model_zoo import load_url as load_state_dict_from_url diff --git a/openpmcvl/granular/models/process.py b/openpmcvl/granular/models/process.py index 58e9e66..d683c0d 100644 --- a/openpmcvl/granular/models/process.py +++ b/openpmcvl/granular/models/process.py @@ -1,8 +1,8 @@ from __future__ import division -import torch import cv2 import numpy as np +import torch def label2yolobox(labels, info_img, maxsize, lrflip): @@ -22,7 +22,8 @@ class (float): class index. maxsize (int): target image size after pre-processing lrflip (bool): horizontal flip flag - Returns: + Returns + ------- labels:label data whose size is :math:`(N, 5)`. Each label consists of [class, xc, yc, w, h] where class (float): class index. @@ -77,7 +78,9 @@ def nms(bbox, thresh, score=None, limit=None): limit (int): The upper bound of the number of the output bounding boxes. If it is not specified, this method selects as many bounding boxes as possible. - Returns: + + Returns + ------- array: An array with indices of bounding boxes that are selected. \ They are sorted by the scores of bounding boxes in descending \ @@ -87,7 +90,6 @@ def nms(bbox, thresh, score=None, limit=None): from: https://github.com/chainer/chainercv """ - if len(bbox) == 0: return np.zeros((0,), dtype=np.int32) @@ -135,7 +137,8 @@ def postprocess(prediction, dtype, conf_thre=0.7, nms_thre=0.45): nms_thre (float): IoU threshold of non-max suppression ranging from 0 to 1. - Returns: + Returns + ------- output (list of torch tensor): """ @@ -203,7 +206,8 @@ def preprocess(img, imgsize, jitter, random_placing=False): jitter (float): amplitude of jitter for resizing random_placing (bool): if True, place the image at random position - Returns: + Returns + ------- img (numpy.ndarray): input image whose shape is :math:`(C, imgsize, imgsize)`. Values range from 0 to 1. info_img : tuple of h, w, nh, nw, dx, dy. diff --git a/openpmcvl/granular/models/subfigure_detector.py b/openpmcvl/granular/models/subfigure_detector.py index b5d0784..22380a0 100644 --- a/openpmcvl/granular/models/subfigure_detector.py +++ b/openpmcvl/granular/models/subfigure_detector.py @@ -1,11 +1,12 @@ +import math + import torch +from einops import repeat from pytorch_pretrained_bert.modeling import BertModel from torch import nn from torchvision import models -import math from openpmcvl.granular.models.transformer_module import * -from einops import repeat class FigCap_Former(nn.Module): @@ -116,7 +117,8 @@ def forward(self, images, texts): images (compound figure): shape (bs, c, h, w) texts (caption tokens): shape (bs, max_length_in_this_batch) - Returns: + Returns + ------- output_det_class: tensor (bs, query_num, 1), 0~1 indicate subfigure or no-subfigure output_box: tensor (bs, query_num, 4), prediction of [cx, cy, w, h] similarity: tensor (bs, query_num, caption_length), 0~1 indicate belong or not belong to the subfigure diff --git a/openpmcvl/granular/models/subfigure_ocr.py b/openpmcvl/granular/models/subfigure_ocr.py index fbb1fe5..008cadf 100644 --- a/openpmcvl/granular/models/subfigure_ocr.py +++ b/openpmcvl/granular/models/subfigure_ocr.py @@ -1,16 +1,17 @@ import os -import yaml + +import cv2 +import numpy as np import torch +import torch.nn.functional as F +import yaml +from PIL import Image from skimage import io -import numpy as np -import cv2 from torch.autograd import Variable -from PIL import Image -import torch.nn.functional as F -from openpmcvl.granular.models.yolov3 import YOLOv3 from openpmcvl.granular.models.network import resnet152 -from openpmcvl.granular.models.process import preprocess, postprocess, yolobox2label +from openpmcvl.granular.models.process import postprocess, preprocess, yolobox2label +from openpmcvl.granular.models.yolov3 import YOLOv3 class classifier: @@ -44,7 +45,7 @@ def __init__(self): self.text_recognition_model.eval() def load_model_from_checkpoint(self, model, model_name): - """load checkpoint weights into model""" + """Load checkpoint weights into model""" checkpoints_path = os.path.join(self.current_dir, "..", "checkpoints") checkpoint = os.path.join(checkpoints_path, model_name) model.load_state_dict(torch.load(checkpoint)) @@ -61,7 +62,6 @@ def detect_subfigure_boundaries(self, figure_path): subfigure_info (list of lists): Each inner list is x1, y1, x2, y2, confidence """ - ## Preprocess the figure for the models img = io.imread(figure_path) if len(np.shape(img)) == 2: diff --git a/openpmcvl/granular/models/transformer_module.py b/openpmcvl/granular/models/transformer_module.py index a0e9dd7..f903a77 100644 --- a/openpmcvl/granular/models/transformer_module.py +++ b/openpmcvl/granular/models/transformer_module.py @@ -1,7 +1,8 @@ +import copy + import torch -from torch import nn import torch.nn.functional as F -import copy +from torch import nn class MultiHeadAttention(nn.Module): diff --git a/openpmcvl/granular/models/yolo_layer.py b/openpmcvl/granular/models/yolo_layer.py index 240b0c0..e7c48b6 100644 --- a/openpmcvl/granular/models/yolo_layer.py +++ b/openpmcvl/granular/models/yolo_layer.py @@ -1,7 +1,9 @@ -import torch -import torch.nn as nn -import numpy as np import warnings + +import numpy as np +import torch +from torch import nn + from openpmcvl.granular.models.network import resnet152 from openpmcvl.granular.models.process import preprocess @@ -18,7 +20,9 @@ def bboxes_iou(bboxes_a, bboxes_b, xyxy=True): bbox_b (array): An array similar to :obj:`bbox_a`, whose shape is :math:`(K, 4)`. The dtype should be :obj:`numpy.float32`. - Returns: + + Returns + ------- array: An array whose shape is :math:`(N, K)`. \ An element at index :math:`(n, k)` contains IoUs between \ @@ -72,7 +76,6 @@ def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): in_ch (int): number of input channels. ignore_thre (float): threshold of IoU above which objectness training is ignored. """ - super(YOLOLayer, self).__init__() strides = [32, 16, 8] # fixed self.anchors = config_model["ANCHORS"] @@ -111,7 +114,9 @@ def forward(self, xin, compound_labels=None): class (float): class index. xc, yc (float) : center of bbox whose values range from 0 to 1. w, h (float) : size of bbox whose values range from 0 to 1. - Returns: + + Returns + ------- loss (torch.Tensor): total loss - the target of backprop. loss_xy (torch.Tensor): x, y loss - calculated by binary cross entropy (BCE) \ with boxsize-dependent weights. @@ -319,7 +324,6 @@ def __init__(self, config_model, layer_no, in_ch, ignore_thre=0.7): in_ch (int): number of input channels. ignore_thre (float): threshold of IoU above which objectness training is ignored. """ - super(YOLOimgLayer, self).__init__() strides = [32, 16, 8] # fixed self.anchors = config_model["ANCHORS"] @@ -356,7 +360,9 @@ def forward(self, xin, all_labels=None): class (float): class index. xc, yc (float) : center of bbox whose values range from 0 to 1. w, h (float) : size of bbox whose values range from 0 to 1. - Returns: + + Returns + ------- loss (torch.Tensor): total loss - the target of backprop. loss_xy (torch.Tensor): x, y loss - calculated by binary cross entropy (BCE) \ with boxsize-dependent weights. diff --git a/openpmcvl/granular/models/yolov3.py b/openpmcvl/granular/models/yolov3.py index 4285ef5..1e706b0 100644 --- a/openpmcvl/granular/models/yolov3.py +++ b/openpmcvl/granular/models/yolov3.py @@ -1,8 +1,9 @@ +from collections import defaultdict + import torch -import torch.nn as nn +from torch import nn -from collections import defaultdict -from openpmcvl.granular.models.yolo_layer import YOLOLayer, YOLOimgLayer +from openpmcvl.granular.models.yolo_layer import YOLOimgLayer, YOLOLayer def add_conv(in_ch, out_ch, ksize, stride): @@ -13,7 +14,9 @@ def add_conv(in_ch, out_ch, ksize, stride): out_ch (int): number of output channels of the convolution layer. ksize (int): kernel size of the convolution layer. stride (int): stride of the convolution layer. - Returns: + + Returns + ------- stage (Sequential) : Sequential layers composing a convolution block. """ stage = nn.Sequential() @@ -71,10 +74,11 @@ def create_yolov3_modules(config_model, ignore_thre): config_model (dict): model configuration. See YOLOLayer class for details. ignore_thre (float): used in YOLOLayer. - Returns: + + Returns + ------- mlist (ModuleList): YOLOv3 module list. """ - # DarkNet53 mlist = nn.ModuleList() mlist.append(add_conv(in_ch=3, out_ch=32, ksize=3, stride=1)) @@ -153,7 +157,8 @@ def forward(self, x, targets=None): where N, C are batchsize and num. of channels. targets (torch.Tensor) : label array whose shape is :math:`(N, 50, 5)` - Returns: + Returns + ------- training: output (torch.Tensor): loss tensor for backpropagation. test: @@ -200,10 +205,11 @@ def create_yolov3img_modules(config_model, ignore_thre): config_model (dict): model configuration. See YOLOLayer class for details. ignore_thre (float): used in YOLOLayer. - Returns: + + Returns + ------- mlist (ModuleList): YOLOv3 module list. """ - # DarkNet53 mlist = nn.ModuleList() mlist.append(add_conv(in_ch=4, out_ch=32, ksize=3, stride=1)) @@ -282,7 +288,8 @@ def forward(self, x, targets=None): where N, C are batchsize and num. of channels. targets (torch.Tensor) : label array whose shape is :math:`(N, 50, 5)` - Returns: + Returns + ------- training: output (torch.Tensor): loss tensor for backpropagation. test: diff --git a/openpmcvl/granular/pipeline/align.py b/openpmcvl/granular/pipeline/align.py index 32a6a83..ff679e6 100644 --- a/openpmcvl/granular/pipeline/align.py +++ b/openpmcvl/granular/pipeline/align.py @@ -1,8 +1,9 @@ -import os import argparse +import os from typing import Dict from tqdm import tqdm + from openpmcvl.granular.models.subfigure_ocr import classifier from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl @@ -15,7 +16,8 @@ def process_subfigure(model: classifier, subfig_data: Dict) -> Dict: model (classifier): Initialized OCR model subfig_data (Dict): Dictionary containing subfigure data - Returns: + Returns + ------- Dict: Updated subfigure data with OCR results """ if "subfig_path" not in subfig_data: diff --git a/openpmcvl/granular/pipeline/classify.py b/openpmcvl/granular/pipeline/classify.py index 9757959..82a3784 100644 --- a/openpmcvl/granular/pipeline/classify.py +++ b/openpmcvl/granular/pipeline/classify.py @@ -1,15 +1,16 @@ import argparse -from PIL import Image from typing import Any, Dict, List import torch -import torch.nn as nn +from PIL import Image +from torch import nn from torch.utils.data import DataLoader from torchvision import models, transforms from tqdm import tqdm -from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl from openpmcvl.granular.dataset.dataset import SubfigureDataset +from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl + MEDICAL_CLASS = 15 CLASSIFICATION_THRESHOLD = 4 @@ -23,7 +24,8 @@ def load_classification_model(model_path: str, device: torch.device) -> nn.Modul model_path (str): Path to the classification model checkpoint device (torch.device): Device to use for processing - Returns: + Returns + ------- nn.Module: Loaded classification model """ fig_model = models.resnext101_32x8d() @@ -55,7 +57,9 @@ def classify_dataset( device (torch.device): Device to use for processing. output_file (str): Path to save the updated JSONL file with classification results. num_workers (int): Number of workers for processing. - Returns: + + Returns + ------- None """ mean_std = ([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) @@ -118,7 +122,8 @@ def main(args: argparse.Namespace) -> None: - batch_size (int): Batch size for processing - output_file (str): Path to save the JSONL file with classification results - Returns: + Returns + ------- None """ device = torch.device("cuda" if torch.cuda.is_available() else "cpu") diff --git a/openpmcvl/granular/pipeline/preprocess.py b/openpmcvl/granular/pipeline/preprocess.py index e9d40b8..5843beb 100644 --- a/openpmcvl/granular/pipeline/preprocess.py +++ b/openpmcvl/granular/pipeline/preprocess.py @@ -1,7 +1,7 @@ -import os import argparse -from typing import List, Set, Tuple +import os from concurrent.futures import ProcessPoolExecutor, as_completed +from typing import List, Set, Tuple from PIL import Image from tqdm import tqdm @@ -16,10 +16,12 @@ def get_image_dimensions(image_path: str) -> Tuple[int, int]: Args: image_path (str): The path to the image file. - Returns: + Returns + ------- Tuple[int, int]: A tuple containing the width and height of the image. - Raises: + Raises + ------ IOError: If the image file cannot be opened or read. """ with Image.open(image_path) as img: @@ -34,7 +36,8 @@ def check_keywords(caption: str, keywords: Set[str]) -> Tuple[List[str], bool]: caption (str): The caption text to search in. keywords (Set[str]): A set of keywords to search for. - Returns: + Returns + ------- Tuple[List[str], bool]: A tuple containing: - A list of found keywords. - A boolean indicating whether any keywords were found. @@ -61,7 +64,8 @@ def process_single_file( output_dir (str): Directory to save the processed file. position (int): Position for the tqdm progress bar. - Returns: + Returns + ------- Tuple[List[dict], List[str], List[str]]: Processed data, missing figures, and messages. """ data = load_dataset(input_file, num_datapoints=-1) @@ -150,7 +154,8 @@ def preprocess_data( figure_root (str): Root directory for figure images. keywords (List[str]): List of keywords to search for in captions. - Returns: + Returns + ------- None """ all_processed_data = [] diff --git a/openpmcvl/granular/pipeline/subcaption.ipynb b/openpmcvl/granular/pipeline/subcaption.ipynb index 710c16a..b566126 100644 --- a/openpmcvl/granular/pipeline/subcaption.ipynb +++ b/openpmcvl/granular/pipeline/subcaption.ipynb @@ -6,17 +6,14 @@ "metadata": {}, "outputs": [], "source": [ - "import os\n", - "import shutil\n", - "import re\n", - "import pickle\n", "import json\n", - "from typing import Any, Dict, List\n", + "import os\n", + "\n", "from dotenv import load_dotenv\n", - "from tqdm import tqdm\n", "from openai import OpenAI\n", "\n", - "from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl\n", + "from openpmcvl.granular.pipeline.utils import load_dataset\n", + "\n", "\n", "PMC_ROOT = \"set this directory\"\n", "\n", @@ -114,16 +111,16 @@ " requests_file: Path to output requests JSONL file\n", " \"\"\"\n", " count = 0\n", - " \n", + "\n", " # Open output file and write requests line by line\n", " with open(requests_file, \"w\") as f:\n", " for data in dataset:\n", " count += 1\n", - " \n", + "\n", " # Skip first 50k entries (already processed)\n", " if count <= 50000: # Batch API can handle at most 50k requests\n", " continue\n", - " \n", + "\n", " # Only process captions under 400 words\n", " if len(data[\"caption\"].split()) <= 400:\n", "\n", @@ -133,7 +130,7 @@ " system_content=\"You are a helpful assistant.\",\n", " user_content=create_prompt(data[\"caption\"]),\n", " )\n", - " \n", + "\n", " # Write request as JSON line\n", " f.write(json.dumps(request) + \"\\n\")" ] @@ -170,7 +167,7 @@ "client.batches.create(\n", " input_file_id=batch_input_file_id,\n", " endpoint=\"/v1/chat/completions\",\n", - " completion_window=\"24h\", \n", + " completion_window=\"24h\",\n", " metadata={\"description\": \"50k subcaptions\"},\n", ")" ] diff --git a/openpmcvl/granular/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py index f648494..376ef0e 100644 --- a/openpmcvl/granular/pipeline/subcaption.py +++ b/openpmcvl/granular/pipeline/subcaption.py @@ -1,11 +1,11 @@ -import re -import json import argparse +import re from sys import stderr -from tqdm import tqdm from typing import Dict from openai import OpenAI +from tqdm import tqdm + from openpmcvl.granular.pipeline.utils import load_dataset, save_jsonl @@ -36,7 +36,8 @@ def process_caption( model (str): Model directory being used. max_tokens (int): Maximum number of tokens for the model response. - Returns: + Returns + ------- str: Processed caption from the language model. """ user_prompt = f"Caption: \n{caption}".strip() @@ -61,7 +62,8 @@ def parse_subcaptions(output: str) -> Dict[str, str]: Args: output (str): Output from the language model. - Returns: + Returns + ------- Dict[str, str]: Dictionary of subcaptions, where keys are subfigure labels and values are subcaptions. """ lines = output.strip().split("\n") @@ -81,9 +83,8 @@ def parse_subcaptions(output: str) -> Dict[str, str]: subcaptions[current_key] = " ".join(current_value).strip() current_key = f"Subfigure-{match.group(1).upper()}" current_value = [match.group(2)] - else: - if current_key: - current_value.append(line) + elif current_key: + current_value.append(line) if current_key: subcaptions[current_key] = " ".join(current_value).strip() diff --git a/openpmcvl/granular/pipeline/subfigure.py b/openpmcvl/granular/pipeline/subfigure.py index 2adff09..0795c8a 100644 --- a/openpmcvl/granular/pipeline/subfigure.py +++ b/openpmcvl/granular/pipeline/subfigure.py @@ -1,13 +1,13 @@ -import os import argparse +import os from pathlib import Path from typing import List, Tuple import numpy as np import torch from torch.utils.data import DataLoader -from tqdm import tqdm from torchvision import utils as vutils +from tqdm import tqdm from openpmcvl.granular.dataset.dataset import ( Fig_Separation_Dataset, @@ -30,7 +30,8 @@ def load_dataset(eval_file: str, batch_size: int, num_workers: int) -> DataLoade batch_size (int): Batch size for the DataLoader num_workers (int): Number of workers for the DataLoader - Returns: + Returns + ------- DataLoader: Configured DataLoader for the separation dataset """ dataset = Fig_Separation_Dataset( @@ -55,7 +56,8 @@ def load_separation_model(checkpoint_path: str, device: torch.device) -> FigCap_ checkpoint_path (str): Path to the model checkpoint device (torch.device): Device to use for processing - Returns: + Returns + ------- FigCap_Former: Loaded model """ model = FigCap_Former( @@ -97,7 +99,8 @@ def process_detections( det_scores (np.ndarray): Confidence scores for detections nms_threshold (float): IoU threshold for NMS - Returns: + Returns + ------- Tuple[List[List[float]], List[float]]: Picked bounding boxes and their scores """ order = np.argsort(det_scores) diff --git a/openpmcvl/granular/pipeline/utils.py b/openpmcvl/granular/pipeline/utils.py index 0ff6f13..3219b37 100644 --- a/openpmcvl/granular/pipeline/utils.py +++ b/openpmcvl/granular/pipeline/utils.py @@ -1,7 +1,8 @@ import json -import torch from typing import Any, Dict, List +import torch + def load_dataset(file_path: str, num_datapoints: int = -1) -> List[Dict[str, Any]]: """ @@ -11,7 +12,8 @@ def load_dataset(file_path: str, num_datapoints: int = -1) -> List[Dict[str, Any file_path (str): Path to the input JSONL file. num_datapoints (int): Number of datapoints to load. If -1, load all datapoints. - Returns: + Returns + ------- List[Dict[str, Any]]: List of dictionaries, each representing an item in the dataset. """ with open(file_path, "r") as f: @@ -44,7 +46,8 @@ def box_cxcywh_to_xyxy(x): Args: x (torch.Tensor): Input tensor of shape (..., 4) containing bounding box coordinates in (cx, cy, w, h) format. - Returns: + Returns + ------- torch.Tensor: Tensor of shape (..., 4) containing bounding box coordinates in (x1, y1, x2, y2) format. """ x_c, y_c, w, h = x.unbind(-1) @@ -60,7 +63,8 @@ def find_intersection(set_1, set_2): set_1 (torch.Tensor): Set 1, a tensor of dimensions (n1, 4) -- (x1, y1, x2, y2) set_2 (torch.Tensor): Set 2, a tensor of dimensions (n2, 4) - Returns: + Returns + ------- torch.Tensor: Intersection of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2) """ lower_bounds = torch.max(set_1[:, :2].unsqueeze(1), set_2[:, :2].unsqueeze(0)) @@ -77,7 +81,8 @@ def find_jaccard_overlap(set_1, set_2): set_1 (torch.Tensor): Set 1, a tensor of dimensions (n1, 4) set_2 (torch.Tensor): Set 2, a tensor of dimensions (n2, 4) - Returns: + Returns + ------- torch.Tensor: Jaccard Overlap of each of the boxes in set 1 with respect to each of the boxes in set 2, a tensor of dimensions (n1, n2) """ if set_1.dim() == 1 and set_1.shape[0] == 4: From a671e5190362a28423f50e08b8fff46e3ae26f3a Mon Sep 17 00:00:00 2001 From: afallah Date: Sat, 18 Jan 2025 12:24:51 -0500 Subject: [PATCH 62/62] Fix style issues. --- openpmcvl/granular/README.md | 3 +-- openpmcvl/granular/models/network.py | 1 - openpmcvl/granular/models/subfigure_ocr.py | 1 - openpmcvl/granular/models/transformer_module.py | 6 ------ openpmcvl/granular/models/yolov3.py | 7 ++----- openpmcvl/granular/pipeline/align.sh | 4 ++-- openpmcvl/granular/pipeline/classify.sh | 4 ++-- openpmcvl/granular/pipeline/preprocess.sh | 2 +- openpmcvl/granular/pipeline/subcaption.ipynb | 3 +-- openpmcvl/granular/pipeline/subcaption.py | 6 +++--- openpmcvl/granular/pipeline/subcaption.sh | 4 ++-- openpmcvl/granular/pipeline/subfigure.sh | 4 ++-- 12 files changed, 16 insertions(+), 29 deletions(-) diff --git a/openpmcvl/granular/README.md b/openpmcvl/granular/README.md index 4dbb47d..7475f8e 100644 --- a/openpmcvl/granular/README.md +++ b/openpmcvl/granular/README.md @@ -55,7 +55,7 @@ When a subfigure is successfully detected and separated: When subfigure extraction fails: - `id`: Generated ID that would have been used - `source_fig_id`: ID of the original figure -- `PMC_ID`: PMC ID of the source article +- `PMC_ID`: PMC ID of the source article - `media_name`: Original filename This script saves extracted subfigures as .jpg files in the target directory. Metadata for each subfigure is stored in separate JSONL files, with unique IDs that link back to the original figure-caption pairs in the source JSONL files. @@ -106,4 +106,3 @@ The non biomedical subfigures will be removed. The following fields are added to The outputs from steps 3 and 5 contain labeled subcaptions and labeled subfigures respectively. By matching these labels (e.g. "Subfigure-A"), we can create the final subfigure-subcaption pairs. Any cases where labels are missing or captions couldn't be split will be handled in subsequent steps. Refer to notebook for more details.

- diff --git a/openpmcvl/granular/models/network.py b/openpmcvl/granular/models/network.py index 8a3af9c..511d832 100644 --- a/openpmcvl/granular/models/network.py +++ b/openpmcvl/granular/models/network.py @@ -141,7 +141,6 @@ def forward(self, x): class ResNet(nn.Module): - def __init__( self, block, diff --git a/openpmcvl/granular/models/subfigure_ocr.py b/openpmcvl/granular/models/subfigure_ocr.py index 008cadf..a470b83 100644 --- a/openpmcvl/granular/models/subfigure_ocr.py +++ b/openpmcvl/granular/models/subfigure_ocr.py @@ -16,7 +16,6 @@ class classifier: def __init__(self): - self.current_dir = os.path.dirname(os.path.abspath(__file__)) configuration_file = os.path.join( self.current_dir, "..", "config", "yolov3_default_subfig.cfg" diff --git a/openpmcvl/granular/models/transformer_module.py b/openpmcvl/granular/models/transformer_module.py index f903a77..d4deedc 100644 --- a/openpmcvl/granular/models/transformer_module.py +++ b/openpmcvl/granular/models/transformer_module.py @@ -28,7 +28,6 @@ def __init__(self, n_head, d_model, d_k, d_v, dropout=0.1): self.layer_norm = nn.LayerNorm(d_model, eps=1e-6) def forward(self, q, k, v, mask=None): - residual = q q = self.layer_norm(q) @@ -70,7 +69,6 @@ def __init__(self, temperature, attn_dropout=0.1): self.dropout = nn.Dropout(attn_dropout) def forward(self, q, k, v, mask=None): - attn = torch.matmul(q / self.temperature, k.transpose(2, 3)) if mask is not None: @@ -83,7 +81,6 @@ def forward(self, q, k, v, mask=None): class TransformerEncoderLayer(nn.Module): - def __init__( self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu" ): @@ -104,7 +101,6 @@ def __init__( self.norm = nn.LayerNorm(d_model) def forward(self, src): - q = k = src src = self.self_attn(q, k, src)[0] @@ -116,7 +112,6 @@ def forward(self, src): class TransformerDecoderLayer(nn.Module): - def __init__( self, d_model, nhead, dim_feedforward=2048, dropout=0.1, activation="relu" ): @@ -141,7 +136,6 @@ def __init__( self.norm = nn.LayerNorm(d_model) def forward(self, tgt, memory): - tgt = self.cross_attn(tgt, memory, memory)[0] tgt = self.self_attn(tgt, tgt, tgt)[0] diff --git a/openpmcvl/granular/models/yolov3.py b/openpmcvl/granular/models/yolov3.py index 1e706b0..0f8fe1e 100644 --- a/openpmcvl/granular/models/yolov3.py +++ b/openpmcvl/granular/models/yolov3.py @@ -48,7 +48,6 @@ class resblock(nn.Module): """ def __init__(self, ch, nblocks=1, shortcut=True): - super().__init__() self.shortcut = shortcut self.module_list = nn.ModuleList() @@ -194,8 +193,7 @@ def forward(self, x, targets=None): x = torch.cat((x, route_layers[0]), 1) if train: return sum(output) - else: - return torch.cat(output, 1) + return torch.cat(output, 1) def create_yolov3img_modules(config_model, ignore_thre): @@ -327,5 +325,4 @@ def forward(self, x, targets=None): x = torch.cat((x, route_layers[0]), 1) if train: return sum(output) - else: - return output + return output diff --git a/openpmcvl/granular/pipeline/align.sh b/openpmcvl/granular/pipeline/align.sh index 341b0ce..0e508bd 100644 --- a/openpmcvl/granular/pipeline/align.sh +++ b/openpmcvl/granular/pipeline/align.sh @@ -19,7 +19,7 @@ # sbatch openpmcvl/granular/pipeline/align.sh 0 1 2 3 4 5 6 7 8 9 10 11 -# Activate virtual environment +# Activate virtual environment source $VENV_PATH/bin/activate # Set working directory @@ -44,6 +44,6 @@ for num in $JSONL_NUMBERS; do --root_dir "$PMC_ROOT" \ --dataset_path "$input_file" \ --save_path "$output_file" - + echo "Finished aligning ${num}" done diff --git a/openpmcvl/granular/pipeline/classify.sh b/openpmcvl/granular/pipeline/classify.sh index c23dc10..48083d9 100644 --- a/openpmcvl/granular/pipeline/classify.sh +++ b/openpmcvl/granular/pipeline/classify.sh @@ -45,6 +45,6 @@ for num in $JSONL_NUMBERS; do --output_file "$output_file" \ --batch_size 256 \ --num_workers 8 \ - + echo "Finished classifying ${num}" -done \ No newline at end of file +done diff --git a/openpmcvl/granular/pipeline/preprocess.sh b/openpmcvl/granular/pipeline/preprocess.sh index 12dffa5..a1ef227 100644 --- a/openpmcvl/granular/pipeline/preprocess.sh +++ b/openpmcvl/granular/pipeline/preprocess.sh @@ -49,4 +49,4 @@ stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/preprocess.py \ --output_file $OUTPUT_FILE \ --figure_root $FIGURE_ROOT \ --keywords MRI fMRI CT CAT PET PET-MRI MEG EEG ultrasound X-ray Xray nuclear imaging tracer isotope scan positron EKG spectroscopy radiograph tomography endoscope endoscopy colonoscopy elastography ultrasonic ultrasonography echocardiogram endomicroscopy pancreatoscopy cholangioscopy enteroscopy retroscopy chromoendoscopy sigmoidoscopy cholangiography pancreatography cholangio-pancreatography esophagogastroduodenoscopy radiology pathology histopathology \ - 2>&1 | tee -a %x-%j.out \ No newline at end of file + 2>&1 | tee -a %x-%j.out diff --git a/openpmcvl/granular/pipeline/subcaption.ipynb b/openpmcvl/granular/pipeline/subcaption.ipynb index b566126..0fe63b5 100644 --- a/openpmcvl/granular/pipeline/subcaption.ipynb +++ b/openpmcvl/granular/pipeline/subcaption.ipynb @@ -105,7 +105,7 @@ "\n", "def generate_jsonl(dataset, requests_file):\n", " \"\"\"Generate JSONL file with API requests.\n", - " \n", + "\n", " Args:\n", " dataset: List of metadata containing captions and IDs\n", " requests_file: Path to output requests JSONL file\n", @@ -123,7 +123,6 @@ "\n", " # Only process captions under 400 words\n", " if len(data[\"caption\"].split()) <= 400:\n", - "\n", " # Generate API request for this caption\n", " request = generate_api_request(\n", " custom_id=f\"{data['id']}\",\n", diff --git a/openpmcvl/granular/pipeline/subcaption.py b/openpmcvl/granular/pipeline/subcaption.py index 376ef0e..f7cfc7e 100644 --- a/openpmcvl/granular/pipeline/subcaption.py +++ b/openpmcvl/granular/pipeline/subcaption.py @@ -11,9 +11,9 @@ PROMPT = """ Subfigure labels are letters referring to individual subfigures within a larger figure. -Check if the caption contains explicit subfigure label. -If not, output "NO" and end the generation. -If yes, output "YES", then generate the subcaption of the subfigures according to the caption. +Check if the caption contains explicit subfigure label. +If not, output "NO" and end the generation. +If yes, output "YES", then generate the subcaption of the subfigures according to the caption. The output should use the template: YES Subfigure-A: ... diff --git a/openpmcvl/granular/pipeline/subcaption.sh b/openpmcvl/granular/pipeline/subcaption.sh index de6a9d2..2eebdf5 100644 --- a/openpmcvl/granular/pipeline/subcaption.sh +++ b/openpmcvl/granular/pipeline/subcaption.sh @@ -39,6 +39,6 @@ for num in $JSONL_NUMBERS; do --output-file "$PMC_ROOT/${num}_subcaptions.jsonl" \ --max-tokens 500 \ 2>&1 | tee -a %x-%j.out - + echo "Finished processing ${num}" -done \ No newline at end of file +done diff --git a/openpmcvl/granular/pipeline/subfigure.sh b/openpmcvl/granular/pipeline/subfigure.sh index e4423d5..7940747 100644 --- a/openpmcvl/granular/pipeline/subfigure.sh +++ b/openpmcvl/granular/pipeline/subfigure.sh @@ -37,7 +37,7 @@ for num in $JSONL_NUMBERS; do # Define the paths for the evaluation file and the record file eval_file="$PMC_ROOT/${num}_meta.jsonl" rcd_file="$PMC_ROOT/${num}_subfigures.jsonl" - + # Run the subfigure separation script stdbuf -oL -eL srun python3 openpmcvl/granular/pipeline/subfigure.py \ --separation_model openpmcvl/granular/checkpoints/subfigure_detector.pth \ @@ -49,7 +49,7 @@ for num in $JSONL_NUMBERS; do --batch_size 128 \ --num_workers 8 \ --gpu 0 - + # Print a message indicating the completion of processing for the current JSONL number echo "Finished processing ${num}" done