pax_global_header00006660000000000000000000000064116324215540014515gustar00rootroot0000000000000052 comment=57c982a8e5e8950a695fbc83ba78dba842652df0 pyxnat-0.9.0~dev0/000077500000000000000000000000001163242155400140235ustar00rootroot00000000000000pyxnat-0.9.0~dev0/.gitignore000077500000000000000000000001171163242155400160150ustar00rootroot00000000000000*.pyc MANIFEST pyxnat.egg-info/ build/ dist/ *.DS_Store* .project .pydevprojectpyxnat-0.9.0~dev0/CHANGES.rst000066400000000000000000000046311163242155400156310ustar00rootroot00000000000000Latest changes =============== Release 0.9.0 ---------------- * New features: - Global scan listing function: interface.select.scans() - Support for XNAT configuration file format - Prearchive services - Batch function for downloading all files related to a scan or an assessor - Create element with an XML document - New xpath function for EObjects * Improvements: - Catching authencation errors - Toggle option for cache warnings - Description for search templates is displayed Release 0.8.0 ---------------- * Compatible with XNAT 1.5 * New features: - provenance annotation on assessors and recontructions - search templates - callback system to monitor data streams to and from the server * Improvements: - support for proxies in the Interface object - a description can be added when a search is saved on the server - python strings can be uploaded and saved just like files * Bug fixes including: - improved unicode support for uploaded files - solved cache issue on Windows - a major bug in the Collection.where method Release 0.7.0 ---------------- * Errors following the PEP-249 * Some operations follow the PEP-249 - e.g. `fetchall` replaces `get` * New inspection functions: - experiement_types - assessor_types - scan_types - reconstruction_types - project_values - subject_values - experiment_values - assessor_values - scan_values - reconstruction_values * Inspect method `fieldvalues` changed to `field_values` * `Interface` Object now supports config files. * Bug fix regarding the file names in the cache. It means that cached data from older versions has to be re-downloaded. * The disk check for available space is performed against a timer instead of always. * The default `get` function to download file now supports custom paths. * Bug fix for HTTP sessions management. * New `last_modified` method for project to get subjects last modified date. * Resource elements are now fully configurable at creation. * Added support for XNAT pipelines. * Added push and pull zip files at the resource level. * Added simple schema parsing capabilities. * Add a global management interface to gather different managers. * Interface now follows redirections on the server url. pyxnat-0.9.0~dev0/MANIFEST.in000066400000000000000000000001351163242155400155600ustar00rootroot00000000000000include *.txt *.py recursive-include pyxnat *.py *.txt *.csv graft doc prune pyxnat/examples pyxnat-0.9.0~dev0/README.rst000066400000000000000000000075671163242155400155310ustar00rootroot00000000000000The homepage of pyxnat with user documentation is located on: http://packages.python.org/pyxnat/ Getting the latest code ========================= To get the latest code using git, simply type:: git clone git://github.com/pyxnat/pyxnat.git If you don't have git installed, you can download a zip or tarball of the latest code: http://github.com/pyxnat/pyxnat/archives/master Or the lastest stable version: http://pypi.python.org/pypi/pyxnat Installing ========================= As any Python packages, to install pyxnat, simply do:: python setup.py install in the source code directory. Workflow to contribute ========================= To contribute to pyxnat, first create an account on `github `_. Once this is done, fork the `pyxnat repository `_ to have you own repository, clone it using 'git clone' on the computers where you want to work. Make your changes in your clone, push them to your github account, test them on several computer, and when you are happy with them, send a pull request to the main repository. Running the test suite ========================= To run the test suite, you need nosetests and the coverage modules. Run the test suite using:: nosetests from the root of the project. Building the docs ========================= To build the docs you need to have setuptools and sphinx (>=0.5) installed. Run the command:: python setup.py build_sphinx The docs are built in the build/sphinx/html directory. Making a source tarball ========================= To create a source tarball, eg for packaging or distributing, run the following command:: python setup.py sdist The tarball will be created in the `dist` directory. This command will compile the docs, and the resulting tarball can be installed with no extra dependencies than the Python standard library. You will need setuptool and sphinx. Making a release and uploading it to PyPI ================================================== This command is only run by project manager, to make a release, and upload in to PyPI:: python setup.py sdist bdist_egg register upload Licensing ---------- pyxnat is **BSD-licenced** (3 clause): This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. Copyright (c) 2010-2011, Yannick Schwartz All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of Yannick Schwartz. nor the names of other pyxnat contributors may be used to endorse or promote products derived from this software without specific prior written permission. **This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage.** pyxnat-0.9.0~dev0/TODO.rst000066400000000000000000000011521163242155400153210ustar00rootroot00000000000000 * Add some in-code comments on the inner workings of the mod ule * Support current reserved keywords as resource identifiers * Improve get file * Add support for subfolders in files - provenance - nipype and cff integration * Add/update tests for: - provenance - templates * Seems to be a bug in select('/project/PROJ//files') syntax * bug in provenance? --> bug with the allowDataDeletion flag * BUG: have to go to the dropdown menu of custom variables before being able to add custom variables * BUG in manage.schemas.add? * check ex2rst in pymvpa.tools to generate sphinx from example scripts pyxnat-0.9.0~dev0/debian/000077500000000000000000000000001163242155400152455ustar00rootroot00000000000000pyxnat-0.9.0~dev0/debian/changelog000066400000000000000000000002451163242155400171200ustar00rootroot00000000000000pyxnat (0.9.0~dev0-1) unstable; urgency=low * Initial release (Closes: #609820). -- Yannick Schwartz Thu, 08 Sep 2011 15:31:48 -0400 pyxnat-0.9.0~dev0/debian/compat000066400000000000000000000000021163242155400164430ustar00rootroot000000000000007 pyxnat-0.9.0~dev0/debian/control000066400000000000000000000024211163242155400166470ustar00rootroot00000000000000Source: pyxnat Section: python Priority: extra Maintainer: Yannick Schwartz Uploaders: Yaroslav Halchenko , Michael Hanke Build-Depends: debhelper (>= 7.2.18), python-all, python-lxml, python-httplib2 (>= 0.7.0), python-simplejson, python-nose Standards-Version: 3.9.2 Homepage: http://packages.python.org/pyxnat/ Vcs-Git: git://github.com/pyxnat/pyxnat.git Vcs-Browser: https://github.com/pyxnat/pyxnat.git Package: python-pyxnat Architecture: all Depends: ${python:Depends}, ${misc:Depends}, python-lxml, python-simplejson, python-httplib2 (>= 0.7.0), Recommends: python-networkx, python-matplotlib Provides: ${python:Provides} Description: Interface to access neuroimaging data on XNAT servers pyxnat is a simple Python library that relies on the REST API provided by the XNAT platform since its 1.4 version. XNAT is an extensible database for neuroimaging data. The main objective is to ease communications with an XNAT server to plug-in external tools or Python scripts to process the data. It features: . - resources browsing capabilities - read and write access to resources - complex searches - disk-caching of requested files and resources pyxnat-0.9.0~dev0/debian/copyright000066400000000000000000000060501163242155400172010ustar00rootroot00000000000000Format-Specification: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?op=file&rev=173 Upstream-Name: pyxnat Upstream-Contact: Yannick Schwartz Source: http://github.com/pyxnat/pyxnat Files: * Copyright: 2010-2011, Yannick Schwartz License: BSD-3 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Yannick Schwartz nor the names of any contributors may be used to endorse or promote products derived from this software without specific prior written permission. . This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the copyright owner or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. Files: doc/sphinxext/* Copyright: 2008, Stefan van der Walt 2008, Pauli Virtanen License: BSD-2 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: . 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. . THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyxnat-0.9.0~dev0/debian/gbp.conf000066400000000000000000000003631163242155400166660ustar00rootroot00000000000000[DEFAULT] # the default branch for upstream sources: upstream-branch = master # the default branch for the debian patch: debian-branch = debian # the default tag formats used: upstream-tag = release/%(version)s debian-tag = debian/%(version)s pyxnat-0.9.0~dev0/debian/pyversions000066400000000000000000000000051163242155400174040ustar00rootroot000000000000002.6- pyxnat-0.9.0~dev0/debian/rules000077500000000000000000000014631163242155400163310ustar00rootroot00000000000000#!/usr/bin/make -f # -*- makefile -*- PACKAGE_NAME = python-pyxnat PACKAGE_ROOT_DIR = debian/${PACKAGE_NAME} INSTALL_PATH = $(CURDIR)/debian/${PACKAGE_NAME} # default Python PYTHON=$(shell pyversions -d) %: dh $@ override_dh_auto_test: : # Do not test just after build, lets install and then test override_dh_auto_install: dh_auto_install # All tests later on # cd build to prevent use of local/not-built source tree ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) cd build; \ for PYTHON in $(shell pyversions -r); do \ echo "I: Running pyxnat unittests using $$PYTHON"; \ PYTHONPATH=$$(/bin/ls -d $(INSTALL_PATH)/usr/lib/$$PYTHON/*-packages):$$PYTHONPATH \ $$PYTHON /usr/bin/nosetests --exclude=test_del_provenance pyxnat; \ done endif override_dh_auto_clean: dh_auto_clean -rm -rf doc/build build pyxnat-0.9.0~dev0/debian/source/000077500000000000000000000000001163242155400165455ustar00rootroot00000000000000pyxnat-0.9.0~dev0/debian/source/format000066400000000000000000000000141163242155400177530ustar00rootroot000000000000003.0 (quilt) pyxnat-0.9.0~dev0/debian/watch000066400000000000000000000002151163242155400162740ustar00rootroot00000000000000version=3 opts="filenamemangle=s/.*\/(.*)/pyxnat-$1\.tar\.gz/" \ http://github.com/pyxnat/pyxnat/downloads .*tarball/release/([\d\.a-z]+) pyxnat-0.9.0~dev0/doc/000077500000000000000000000000001163242155400145705ustar00rootroot00000000000000pyxnat-0.9.0~dev0/doc/CHANGES.rst000077700000000000000000000000001163242155400204022../CHANGES.rstustar00rootroot00000000000000pyxnat-0.9.0~dev0/doc/__init__.py000066400000000000000000000001361163242155400167010ustar00rootroot00000000000000""" This is a phony __init__.py file, so that nose finds the doctests in this directory. """ pyxnat-0.9.0~dev0/doc/advanced_tutorial.rst000066400000000000000000000220741163242155400210170ustar00rootroot00000000000000============================== Advanced Tutorial ============================== .. currentmodule:: pyxnat This advanced tutorial is not much more complicated than the starters one. It just goes over parts of the API that may be less used (not that they are less useful!) and that are more likely to change in future releases. Introspection ------------- In order to browse a database people have to be aware of: - the REST hierarchy - schema types and fields - values of fields and resources within a project The idea of this interface is to help users find their way around a XNAT server by making it easier to gather the preceding information. Searchable datatypes and fields ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >>> # simple datatypes listing >>> central.inspect.datatypes() [..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...] >>> # datatypes listing with filter >>> central.inspect.datatypes('cnda:*') ['cnda:manualVolumetryData', 'cnda:clinicalAssessmentData', 'cnda:psychometricsData', 'cnda:dtiData', 'cnda:atlasScalingFactorData', 'cnda:segmentationFastData', 'cnda:modifiedScheltensData'] >>> # simple fields listing >>> central.inspect.datatypes('xnat:subjectData') ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT', ...] >>> # field listing with filter >>> central.inspect.datatypes('xnat:subjectData', '*ID*') ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/ADD_IDS'] >>> # field listing on multiple types >>> central.inspect.datatypes('cnda:*', 'EXPT_ID') ['cnda:manualVolumetryData/EXPT_ID', 'cnda:clinicalAssessmentData/EXPT_ID', 'cnda:psychometricsData/EXPT_ID', 'cnda:dtiData/EXPT_ID', 'cnda:atlasScalingFactorData/EXPT_ID', 'cnda:segmentationFastData/EXPT_ID', 'cnda:modifiedScheltensData/EXPT_ID'] To known what values fields can take in the database:: >>> central.inspect.field_values('xnat:mrSessionData/SESSION_ID') REST hierarchy ~~~~~~~~~~~~~~ pyxnat does not support all the REST resources. The reasons for this is that, some of these resources are still experimental, or do not work exactly the same way which would make it difficult to provide a consistent interface at the Python level. However support for these exotic resources will increase in future releases. A good way to know what is the supported REST hierarchy is to use the following method:: >>> central.inspect.architecture() # rest_hierarchy() still works - PROJECTS + SUBJECTS + EXPERIMENTS + ASSESSORS + RESOURCES + FILES + IN_RESOURCES + FILES + OUT_RESOURCES + FILES + RECONSTRUCTIONS + IN_RESOURCES + FILES + OUT_RESOURCES + FILES + SCANS + RESOURCES + FILES + RESOURCES + FILES + RESOURCES + FILES + RESOURCES + FILES Naming conventions ~~~~~~~~~~~~~~~~~~ Administrators usually use a consistent vocabulary across single projects, that maps to XNAT datatypes. A new feature in introduced in 0.6 and improved in 0.7 is to be able to define a mapping so that specific name patterns can be used to cast a resource when creating a new one. For example with the following mapping:: '/projects/my_project/subjects/*/experiments/SessionA_*':'xnat:mrSessionData' Creating an experiment in ``my_project`` that matches `Session_*`, creates an `xnat:mrSessionData`:: >>> central.select('/projects/my_project/subjects/*/experiments/SessionA_new').create() In the 0.7, it is no longer up to the user to manually save and load the mapping file. Files are created automatically and the mappings are discovered `on the fly` when queries are issued on the server. Files are loaded at the ``Interface`` creation and the mappings are updated regularly. This functionality can be configured with the following method:: >>> # activate (default) >>> central.inspect.set_autolearn('True') >>> # setup update frequency >>> central.inspect.set_autolearn(tick=10) When a mapping is available, re-running the ``rest_hierarchy`` method will display additional information such as:: - PROJECTS + SUBJECTS + EXPERIMENTS ----------- - xnat:mrSessionData - xnat:petSessionData +ASSESSORS .... There are additional methods to visualize and display the mappings:: >>> central.inspect.experiment_types() >>> central.inspect.assessor_types() >>> central.inspect.scan_types() >>> central.inspect.reconstruction_types() Methods also allow to have a quick look on the values at those levels on the database:: >>> central.inspect.experiment_values('xnat:mrSessionData') >>> central.inspect.assessor_values('xnat:mrSessionData') >>> central.inspect.scan_values('xnat:mrSessionData') >>> central.inspect.reconstruction_values('xnat:mrSessionData') For more details check the reference documentation. .. note:: With ``networkx`` and ``matplotlib`` installed, a ``draw`` subinterface will be made available to display some data from the inspect subinterface as a graph:: >>> central.draw.experiments() >>> central.draw.assessors() >>> central.draw.scans() >>> central.draw.reconstructions() >>> central.draw.architecture() >>> central.draw.field_values() Sharing ------- It is possible to share ``Subjects``, ``Experiments`` and ``Assessors`` via the REST API. The methods to control sharing are:: >>> subject = interface.select('/project/project1/subject/subject1') >>> subject.share('project2') >>> subject.unshare('project2') >>> # to know to in which projects a subject is available >>> subject.shares() Almost the same interface is available for collection objects:: >>> subjects = interface.select('/project/project1/subjects') >>> subjects.share('project2') >>> subjects.unshare('project2') >>> # to retrieve the subjects sharing a list of projects >>> subjects.sharing(['project1', 'project2']) .. note:: Of course the permissions policies (user level and project accessibility)still apply. .. warning:: The ``shares`` and ``sharing`` methods are not implemented in an efficient way at the moment. There is another more concerning issue: subjects for example are accessible through their ID or label. But labels stop working when trying to access a subject through a project that is not its orginial one. Search templates --------------- PyXNAT is also able to define templates to use with XNAT search engine. They work basically the same way as usual searches but instead of defining values to filter the data, one need to define keywords to replace them later with the actual values:: >>> contraints = [('xnat:subjectData/SUBJECT_ID','LIKE','subject_id'), ('xnat:subjectData/PROJECT', '=', 'project_id'), 'OR', [('xnat:subjectData/AGE','>','age'), 'AND' ] ] >>> columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID'] >>> interface.manage.search.save_template('name', 'xnat:subjectData', columns, criteria, sharing='public', description='my first template' ) >>> interface.manage.search.use_template('name', {'subject_id':'%', 'project_id':'my_project', 'age':'42' } ) >>> interface.select(...).where(template=('name', {'subject_id':'%', 'project_id':'my_project', 'age':'42'} ) ) And now it is also possible to re-use saved searches in the where clause in the same way as the templates. It means that you re-use the contraints but not the data selection which still changes: >>> interface.select(...).where(query='saved_name') Provenance definition -------------------- PyXNAT 0.8 introduces a way to store provenance i.e. to describe the steps that were performed on an initial data to produce this one. Reconstructions and assessors only can be annotated with provenace information: >>> prov = {'program':'young', 'timestamp':'2011-03-01T12:01:01.897987', 'user':'angus', 'machine':'war', 'platform':'linux', } >>> element.provenance.attach(prov) >>> element.provenance.get() >>> element.dettach() The provenance attach method adds new steps with each call, unless the overwrite parameter is set to True. The following keywords for the provenance dictionnay are available: - program - program_version - program_arguments - timestamp - cvs - user - machine - platform - platform_version - compiler - compiler_version pyxnat-0.9.0~dev0/doc/conf.py000066400000000000000000000150001163242155400160630ustar00rootroot00000000000000# -*- coding: utf-8 -*- # # pyxnat documentation build configuration file, created by # sphinx-quickstart on Tue Nov 24 11:04:02 2009. # # This file is execfile()d with the current directory set to its containing dir. # # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os import pyxnat sys.path.append(os.path.abspath('./sphinxext')) # If your extensions (or modules documented by autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.append(os.path.abspath('.')) # General configuration # --------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [ 'sphinx.ext.autodoc', 'sphinx.ext.pngmath', 'numpydoc', 'phantom_import', 'autosummary', 'sphinx.ext.coverage' ] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8' # The master toctree document. master_doc = 'index' # General information about the project. project = u'pyxnat' copyright = u'2010, Yannick Schwartz' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = pyxnat.__version__[:3] # The full version, including alpha/beta/rc tags. release = pyxnat.__version__ # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directory, that shouldn't be searched # for source files. exclude_trees = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # Options for HTML output # ----------------------- # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths # given in html_static_path. # html_style = 'default.css' # The theme to use for HTML and HTML Help pages. Major themes that come with # Sphinx are currently 'default' and 'sphinxdoc'. html_theme = 'nature' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, the reST sources are included in the HTML build as _sources/. #html_copy_source = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'pyxnatdoc' # Options for LaTeX output # ------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). latex_documents = [ ('index', 'pyxnat.tex', ur'pyxnat Documentation', ur'Yannick Schwartz', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {'http://docs.python.org/dev': None} pyxnat-0.9.0~dev0/doc/generated/000077500000000000000000000000001163242155400165265ustar00rootroot00000000000000pyxnat-0.9.0~dev0/doc/generated/pyxnat.Inspector.rst000066400000000000000000000001271163242155400225500ustar00rootroot00000000000000pyxnat.Inspector ================ .. currentmodule:: pyxnat .. autoclass:: Inspector pyxnat-0.9.0~dev0/doc/generated/pyxnat.Interface.rst000066400000000000000000000001271163242155400225020ustar00rootroot00000000000000pyxnat.Interface ================ .. currentmodule:: pyxnat .. autoclass:: Interface pyxnat-0.9.0~dev0/doc/generated/pyxnat.SearchManager.rst000066400000000000000000000001431163242155400233000ustar00rootroot00000000000000pyxnat.SearchManager ==================== .. currentmodule:: pyxnat .. autoclass:: SearchManager pyxnat-0.9.0~dev0/doc/generated/pyxnat.Select.rst000066400000000000000000000001161163242155400220170ustar00rootroot00000000000000pyxnat.Select ============= .. currentmodule:: pyxnat .. autoclass:: Select pyxnat-0.9.0~dev0/doc/generated/pyxnat.Users.rst000066400000000000000000000001131163242155400216760ustar00rootroot00000000000000pyxnat.Users ============ .. currentmodule:: pyxnat .. autoclass:: Users pyxnat-0.9.0~dev0/doc/index.rst000066400000000000000000000013221163242155400164270ustar00rootroot00000000000000.. pyxnat documentation master file, created by sphinx-quickstart on Tue Nov 24 11:04:02 2009. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. pyxnat: Xnat in Python ============================================ .. topic:: **User guide contents:** .. toctree:: :maxdepth: 1 installing.rst under_the_hood.rst starters_tutorial.rst advanced_tutorial.rst reference_documentation.rst CHANGES.rst Introduction ------------ .. automodule:: pyxnat Module contents ---------------- .. currentmodule :: pyxnat .. autosummary:: :toctree: generated/ Interface Select SearchManager CacheManager Users pyxnat-0.9.0~dev0/doc/installing.rst000066400000000000000000000100731163242155400174670ustar00rootroot00000000000000Installing pyxnat =================== Platforms --------- OS Independent. It was tested under: - Ubuntu 10.04 with python 2.6 - Ubuntu 8.04 with python 2.5 - Mandriva 2008 with python 2.5 - Windows XP with python 2.6 - Mac OS X 10.5 Leopard with python 2.5 Prerequisites ------------- - *python* v2.5+ - *python-lxml* v1.3.6+ recommanded, earlier versions may work: All Python dependencies but lxml are shipped with this package. Lxml may be installed using standard Python distribution tools, here are the recommanded ones. For more details on installing procedures please see the sections following this one. #. easy_install: lxml may be installed via easy_install under Unix and Windows #. Windows only: a .exe installer is provided #. Mac OS X: a macport of lxml is available, see lxml site for further information. Alternatively, you can compile the package from sources by following the instructions. If the recommanded command on the site fails:: python setup.py build --static-deps Try forcing an older version of libxml2:: python setup.py build --static-deps --libxml2-version=2.7.3 Do not forget to add lxml to your PYTHONPATH afterwards. - *python-nose* v0.10+ to run the unit tests - *networkx* and *matplotlib* are not mandatory: These libraries are used to make some graphical representations. The `easy_install` way ----------------------- The easiest way to install pyxnat is (provided that you have `setuptools` installed) to run:: easy_install pyxnat You may need to run the above command as administrator On a unix environment, it is better to install outside of the hierarchy managed by the system: easy_install --prefix /usr/local pyxnat .. warning:: Packages installed via `easy_install` override the Python module look up mechanism and thus can confused people not familiar with setuptools. Although it may seem harder, we suggest that you use the manual way, as described in the following paragraph. The manual way --------------- To install pyxnat first download the latest tarball (follow the link on the bottom of http://pypi.python.org/pypi/pyxnat) and expand it. Installing in a local environment .................................. If you don't need to install for all users, we strongly suggest that you create a local environment and install `pyxnat` in it. One of the pros of this method is that you never have to become administrator, and thus all the changes are local to your account and easy to clean up. #. First, create the following directory (where `~` is your home directory, or any directory that you want to use as a base for your local Python environment, and `X` is your Python version number, e.g. `2.6`):: ~/usr/lib/pythonX/site-packages #. Second, make sure that you add this directory in your environment variable `PYTHONPATH`. Under window you can do this by editing your environment variables in the system parameters dialog. Under Unix you can add the following line to your `.bashrc` or any file source at login:: export PYTHONPATH=$HOME/usr/lib/python2.6/site-packages:$PYTHONPATH #. In the directory created by expanding the `pyxnat` tarball, run the following command:: python setup.py install --prefix ~/usr You should not be required to become administrator, if you have write access to the directory you are installing to. Installing for all users ........................ If you have administrator rights and want to install for all users, all you need to do is to go in directory created by expanding the `pyxnat` tarball and run the following line:: python setup.py install If you are under Unix, we suggest that you install in '/usr/local' in order not to interfere with your system:: python setup.py install --prefix /usr/local Testing ....... Go in the directory 'pyxnat/tests' and run the `nosetests` command. pyxnat-0.9.0~dev0/doc/reference_documentation.rst000066400000000000000000000032771163242155400222220ustar00rootroot00000000000000============================== Reference documentation ============================== .. currentmodule:: pyxnat.core The `Interface` class ~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.Interface :members: :inherited-members: The `Select` class ~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.select.Select :members: __call__, project, projects The `Inspect` class ~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.help.Inspector :members: The `SearchManager` class ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.search.SearchManager :members: The `Search` class ~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.search.Search :members: The `EObject` class ~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.EObject :members: The `CObject` class ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.CObject :members: The `Project` class ~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.Project :members: The `File` class ~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.resources.File :members: The `Attributes` class ~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.attributes.EAttrs :members: The `Provenance` class ~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.provenance.Provenance :members: The `Users` class ~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.users.Users :members: The `Inspector` class ~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.help.Inspector :members: The `CacheManager` class ~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.cache.CacheManager :members: The `SchemaManager` class ~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: pyxnat.core.manage.SchemaManager :members: pyxnat-0.9.0~dev0/doc/sphinxext/000077500000000000000000000000001163242155400166225ustar00rootroot00000000000000pyxnat-0.9.0~dev0/doc/sphinxext/LICENSE.txt000066400000000000000000000030271163242155400204470ustar00rootroot00000000000000------------------------------------------------------------------------------- The files - numpydoc.py - autosummary.py - autosummary_generate.py - docscrape.py - docscrape_sphinx.py - phantom_import.py have the following license: Copyright (C) 2008 Stefan van der Walt , Pauli Virtanen Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pyxnat-0.9.0~dev0/doc/sphinxext/__init__.py000066400000000000000000000000001163242155400207210ustar00rootroot00000000000000pyxnat-0.9.0~dev0/doc/sphinxext/autosummary.py000066400000000000000000000247411163242155400215720ustar00rootroot00000000000000""" =========== autosummary =========== Sphinx extension that adds an autosummary:: directive, which can be used to generate function/method/attribute/etc. summary lists, similar to those output eg. by Epydoc and other API doc generation tools. An :autolink: role is also provided. autosummary directive --------------------- The autosummary directive has the form:: .. autosummary:: :nosignatures: :toctree: generated/ module.function_1 module.function_2 ... and it generates an output table (containing signatures, optionally) ======================== ============================================= module.function_1(args) Summary line from the docstring of function_1 module.function_2(args) Summary line from the docstring ... ======================== ============================================= If the :toctree: option is specified, files matching the function names are inserted to the toctree with the given prefix: generated/module.function_1 generated/module.function_2 ... Note: The file names contain the module:: or currentmodule:: prefixes. .. seealso:: autosummary_generate.py autolink role ------------- The autolink role functions as ``:obj:`` when the name referred can be resolved to a Python object, and otherwise it becomes simple emphasis. This can be used as the default role to make links 'smart'. """ import sys, os, posixpath, re from docutils.parsers.rst import directives from docutils.statemachine import ViewList from docutils import nodes import sphinx.addnodes, sphinx.roles from sphinx.util import patfilter from docscrape_sphinx import get_doc_object def setup(app): app.add_directive('autosummary', autosummary_directive, True, (0, 0, False), toctree=directives.unchanged, nosignatures=directives.flag) app.add_role('autolink', autolink_role) app.add_node(autosummary_toc, html=(autosummary_toc_visit_html, autosummary_toc_depart_noop), latex=(autosummary_toc_visit_latex, autosummary_toc_depart_noop)) app.connect('doctree-read', process_autosummary_toc) #------------------------------------------------------------------------------ # autosummary_toc node #------------------------------------------------------------------------------ class autosummary_toc(nodes.comment): pass def process_autosummary_toc(app, doctree): """ Insert items described in autosummary:: to the TOC tree, but do not generate the toctree:: list. """ env = app.builder.env crawled = {} def crawl_toc(node, depth=1): crawled[node] = True for j, subnode in enumerate(node): try: if (isinstance(subnode, autosummary_toc) and isinstance(subnode[0], sphinx.addnodes.toctree)): env.note_toctree(env.docname, subnode[0]) continue except IndexError: continue if not isinstance(subnode, nodes.section): continue if subnode not in crawled: crawl_toc(subnode, depth+1) crawl_toc(doctree) def autosummary_toc_visit_html(self, node): """Hide autosummary toctree list in HTML output""" raise nodes.SkipNode def autosummary_toc_visit_latex(self, node): """Show autosummary toctree (= put the referenced pages here) in Latex""" pass def autosummary_toc_depart_noop(self, node): pass #------------------------------------------------------------------------------ # .. autosummary:: #------------------------------------------------------------------------------ def autosummary_directive(dirname, arguments, options, content, lineno, content_offset, block_text, state, state_machine): """ Pretty table containing short signatures and summaries of functions etc. autosummary also generates a (hidden) toctree:: node. """ names = [] names += [x.strip() for x in content if x.strip()] table, warnings, real_names = get_autosummary(names, state, 'nosignatures' in options) node = table env = state.document.settings.env suffix = env.config.source_suffix all_docnames = env.found_docs.copy() dirname = posixpath.dirname(env.docname) if 'toctree' in options: tree_prefix = options['toctree'].strip() docnames = [] for name in names: name = real_names.get(name, name) docname = tree_prefix + name if docname.endswith(suffix): docname = docname[:-len(suffix)] docname = posixpath.normpath(posixpath.join(dirname, docname)) if docname not in env.found_docs: warnings.append(state.document.reporter.warning( 'toctree references unknown document %r' % docname, line=lineno)) docnames.append(docname) tocnode = sphinx.addnodes.toctree() tocnode['includefiles'] = docnames tocnode['maxdepth'] = -1 tocnode['glob'] = None tocnode['entries'] = [] tocnode = autosummary_toc('', '', tocnode) return warnings + [node] + [tocnode] else: return warnings + [node] def get_autosummary(names, state, no_signatures=False): """ Generate a proper table node for autosummary:: directive. Parameters ---------- names : list of str Names of Python objects to be imported and added to the table. document : document Docutils document object """ document = state.document real_names = {} warnings = [] prefixes = [''] prefixes.insert(0, document.settings.env.currmodule) table = nodes.table('') group = nodes.tgroup('', cols=2) table.append(group) group.append(nodes.colspec('', colwidth=30)) group.append(nodes.colspec('', colwidth=70)) body = nodes.tbody('') group.append(body) def append_row(*column_texts): row = nodes.row('') for text in column_texts: node = nodes.paragraph('') vl = ViewList() vl.append(text, '') state.nested_parse(vl, 0, node) row.append(nodes.entry('', node)) body.append(row) for name in names: try: obj, real_name = import_by_name(name, prefixes=prefixes) except ImportError: warnings.append(document.reporter.warning( 'failed to import %s' % name)) append_row(":obj:`%s`" % name, "") continue real_names[name] = real_name doc = get_doc_object(obj) if doc['Summary']: title = " ".join(doc['Summary']) else: title = "" col1 = ":obj:`%s <%s>`" % (name, real_name) if doc['Signature']: sig = re.sub('^[a-zA-Z_0-9.-]*', '', doc['Signature']) if '=' in sig: # abbreviate optional arguments sig = re.sub(r', ([a-zA-Z0-9_]+)=', r'[, \1=', sig, count=1) sig = re.sub(r'\(([a-zA-Z0-9_]+)=', r'([\1=', sig, count=1) sig = re.sub(r'=[^,)]+,', ',', sig) sig = re.sub(r'=[^,)]+\)$', '])', sig) # shorten long strings sig = re.sub(r'(\[.{16,16}[^,)]*?),.*?\]\)', r'\1, ...])', sig) else: sig = re.sub(r'(\(.{16,16}[^,)]*?),.*?\)', r'\1, ...)', sig) col1 += " " + sig col2 = title append_row(col1, col2) return table, warnings, real_names def import_by_name(name, prefixes=[None]): """ Import a Python object that has the given name, under one of the prefixes. Parameters ---------- name : str Name of a Python object, eg. 'numpy.ndarray.view' prefixes : list of (str or None), optional Prefixes to prepend to the name (None implies no prefix). The first prefixed name that results to successful import is used. Returns ------- obj The imported object name Name of the imported object (useful if `prefixes` was used) """ for prefix in prefixes: try: if prefix: prefixed_name = '.'.join([prefix, name]) else: prefixed_name = name return _import_by_name(prefixed_name), prefixed_name except ImportError: pass raise ImportError def _import_by_name(name): """Import a Python object given its full name""" try: # try first interpret `name` as MODNAME.OBJ name_parts = name.split('.') try: modname = '.'.join(name_parts[:-1]) __import__(modname) return getattr(sys.modules[modname], name_parts[-1]) except (ImportError, IndexError, AttributeError): pass # ... then as MODNAME, MODNAME.OBJ1, MODNAME.OBJ1.OBJ2, ... last_j = 0 modname = None for j in reversed(range(1, len(name_parts)+1)): last_j = j modname = '.'.join(name_parts[:j]) try: __import__(modname) except ImportError: continue if modname in sys.modules: break if last_j < len(name_parts): obj = sys.modules[modname] for obj_name in name_parts[last_j:]: obj = getattr(obj, obj_name) return obj else: return sys.modules[modname] except (ValueError, ImportError, AttributeError, KeyError), e: raise ImportError(e) #------------------------------------------------------------------------------ # :autolink: (smart default role) #------------------------------------------------------------------------------ def autolink_role(typ, rawtext, etext, lineno, inliner, options={}, content=[]): """ Smart linking role. Expands to ":obj:`text`" if `text` is an object that can be imported; otherwise expands to "*text*". """ r = sphinx.roles.xfileref_role('obj', rawtext, etext, lineno, inliner, options, content) pnode = r[0][0] prefixes = [None] #prefixes.insert(0, inliner.document.settings.env.currmodule) try: obj, name = import_by_name(pnode['reftarget'], prefixes) except ImportError: content = pnode[0] r[0][0] = nodes.emphasis(rawtext, content[0].astext(), classes=content['classes']) return r pyxnat-0.9.0~dev0/doc/sphinxext/autosummary_generate.py000077500000000000000000000164711163242155400234500ustar00rootroot00000000000000#!/usr/bin/env python r""" autosummary_generate.py OPTIONS FILES Generate automatic RST source files for items referred to in autosummary:: directives. Each generated RST file contains a single auto*:: directive which extracts the docstring of the referred item. Example Makefile rule:: generate: ./ext/autosummary_generate.py -o source/generated source/*.rst """ import glob, re, inspect, os, optparse, pydoc from autosummary import import_by_name try: from phantom_import import import_phantom_module except ImportError: import_phantom_module = lambda x: x def main(): p = optparse.OptionParser(__doc__.strip()) p.add_option("-p", "--phantom", action="store", type="string", dest="phantom", default=None, help="Phantom import modules from a file") p.add_option("-o", "--output-dir", action="store", type="string", dest="output_dir", default=None, help=("Write all output files to the given directory (instead " "of writing them as specified in the autosummary:: " "directives)")) options, args = p.parse_args() if len(args) == 0: p.error("wrong number of arguments") if options.phantom and os.path.isfile(options.phantom): import_phantom_module(options.phantom) # read names = {} for name, loc in get_documented(args).items(): for (filename, sec_title, keyword, toctree) in loc: if toctree is not None: path = os.path.join(os.path.dirname(filename), toctree) names[name] = os.path.abspath(path) # write for name, path in sorted(names.items()): if options.output_dir is not None: path = options.output_dir if not os.path.isdir(path): os.makedirs(path) try: obj, name = import_by_name(name) except ImportError, e: print "Failed to import '%s': %s" % (name, e) continue fn = os.path.join(path, '%s.rst' % name) if os.path.exists(fn): # skip continue f = open(fn, 'w') try: f.write('%s\n%s\n\n' % (name, '='*len(name))) if inspect.isclass(obj): if issubclass(obj, Exception): f.write(format_modulemember(name, 'autoexception')) else: f.write(format_modulemember(name, 'autoclass')) elif inspect.ismodule(obj): f.write(format_modulemember(name, 'automodule')) elif inspect.ismethod(obj) or inspect.ismethoddescriptor(obj): f.write(format_classmember(name, 'automethod')) elif callable(obj): f.write(format_modulemember(name, 'autofunction')) elif hasattr(obj, '__get__'): f.write(format_classmember(name, 'autoattribute')) else: f.write(format_modulemember(name, 'autofunction')) finally: f.close() def format_modulemember(name, directive): parts = name.split('.') mod, name = '.'.join(parts[:-1]), parts[-1] return ".. currentmodule:: %s\n\n.. %s:: %s\n" % (mod, directive, name) def format_classmember(name, directive): parts = name.split('.') mod, name = '.'.join(parts[:-2]), '.'.join(parts[-2:]) return ".. currentmodule:: %s\n\n.. %s:: %s\n" % (mod, directive, name) def get_documented(filenames): """ Find out what items are documented in source/*.rst See `get_documented_in_lines`. """ documented = {} for filename in filenames: f = open(filename, 'r') lines = f.read().splitlines() documented.update(get_documented_in_lines(lines, filename=filename)) f.close() return documented def get_documented_in_docstring(name, module=None, filename=None): """ Find out what items are documented in the given object's docstring. See `get_documented_in_lines`. """ try: obj, real_name = import_by_name(name) lines = pydoc.getdoc(obj).splitlines() return get_documented_in_lines(lines, module=name, filename=filename) except AttributeError: pass except ImportError, e: print "Failed to import '%s': %s" % (name, e) return {} def get_documented_in_lines(lines, module=None, filename=None): """ Find out what items are documented in the given lines Returns ------- documented : dict of list of (filename, title, keyword, toctree) Dictionary whose keys are documented names of objects. The value is a list of locations where the object was documented. Each location is a tuple of filename, the current section title, the name of the directive, and the value of the :toctree: argument (if present) of the directive. """ title_underline_re = re.compile("^[-=*_^#]{3,}\s*$") autodoc_re = re.compile(".. auto(function|method|attribute|class|exception|module)::\s*([A-Za-z0-9_.]+)\s*$") autosummary_re = re.compile(r'^\.\.\s+autosummary::\s*') module_re = re.compile(r'^\.\.\s+(current)?module::\s*([a-zA-Z0-9_.]+)\s*$') autosummary_item_re = re.compile(r'^\s+([_a-zA-Z][a-zA-Z0-9_.]*)\s*') toctree_arg_re = re.compile(r'^\s+:toctree:\s*(.*?)\s*$') documented = {} current_title = [] last_line = None toctree = None current_module = module in_autosummary = False for line in lines: try: if in_autosummary: m = toctree_arg_re.match(line) if m: toctree = m.group(1) continue if line.strip().startswith(':'): continue # skip options m = autosummary_item_re.match(line) if m: name = m.group(1).strip() if current_module and not name.startswith(current_module + '.'): name = "%s.%s" % (current_module, name) documented.setdefault(name, []).append( (filename, current_title, 'autosummary', toctree)) continue if line.strip() == '': continue in_autosummary = False m = autosummary_re.match(line) if m: in_autosummary = True continue m = autodoc_re.search(line) if m: name = m.group(2).strip() if m.group(1) == "module": current_module = name documented.update(get_documented_in_docstring( name, filename=filename)) elif current_module and not name.startswith(current_module+'.'): name = "%s.%s" % (current_module, name) documented.setdefault(name, []).append( (filename, current_title, "auto" + m.group(1), None)) continue m = title_underline_re.match(line) if m and last_line: current_title = last_line.strip() continue m = module_re.match(line) if m: current_module = m.group(2) continue finally: last_line = line return documented if __name__ == "__main__": main() pyxnat-0.9.0~dev0/doc/sphinxext/docscrape.py000066400000000000000000000346051163242155400211470ustar00rootroot00000000000000"""Extract reference documentation from the NumPy source tree. """ import inspect import textwrap import re import pydoc from StringIO import StringIO from warnings import warn 4 class Reader(object): """A line-based string reader. """ def __init__(self, data): """ Parameters ---------- data : str String with lines separated by '\n'. """ if isinstance(data,list): self._str = data else: self._str = data.split('\n') # store string as list of lines self.reset() def __getitem__(self, n): return self._str[n] def reset(self): self._l = 0 # current line nr def read(self): if not self.eof(): out = self[self._l] self._l += 1 return out else: return '' def seek_next_non_empty_line(self): for l in self[self._l:]: if l.strip(): break else: self._l += 1 def eof(self): return self._l >= len(self._str) def read_to_condition(self, condition_func): start = self._l for line in self[start:]: if condition_func(line): return self[start:self._l] self._l += 1 if self.eof(): return self[start:self._l+1] return [] def read_to_next_empty_line(self): self.seek_next_non_empty_line() def is_empty(line): return not line.strip() return self.read_to_condition(is_empty) def read_to_next_unindented_line(self): def is_unindented(line): return (line.strip() and (len(line.lstrip()) == len(line))) return self.read_to_condition(is_unindented) def peek(self,n=0): if self._l + n < len(self._str): return self[self._l + n] else: return '' def is_empty(self): return not ''.join(self._str).strip() class NumpyDocString(object): def __init__(self,docstring): docstring = textwrap.dedent(docstring).split('\n') self._doc = Reader(docstring) self._parsed_data = { 'Signature': '', 'Summary': [''], 'Extended Summary': [], 'Parameters': [], 'Returns': [], 'Raises': [], 'Warns': [], 'Other Parameters': [], 'Attributes': [], 'Methods': [], 'See Also': [], 'Notes': [], 'Warnings': [], 'References': '', 'Examples': '', 'index': {} } self._parse() def __getitem__(self,key): return self._parsed_data[key] def __setitem__(self,key,val): if not self._parsed_data.has_key(key): warn("Unknown section %s" % key) else: self._parsed_data[key] = val def _is_at_section(self): self._doc.seek_next_non_empty_line() if self._doc.eof(): return False l1 = self._doc.peek().strip() # e.g. Parameters if l1.startswith('.. index::'): return True l2 = self._doc.peek(1).strip() # ---------- or ========== return l2.startswith('-'*len(l1)) or l2.startswith('='*len(l1)) def _strip(self,doc): i = 0 j = 0 for i,line in enumerate(doc): if line.strip(): break for j,line in enumerate(doc[::-1]): if line.strip(): break return doc[i:len(doc)-j] def _read_to_next_section(self): section = self._doc.read_to_next_empty_line() while not self._is_at_section() and not self._doc.eof(): if not self._doc.peek(-1).strip(): # previous line was empty section += [''] section += self._doc.read_to_next_empty_line() return section def _read_sections(self): while not self._doc.eof(): data = self._read_to_next_section() name = data[0].strip() if name.startswith('..'): # index section yield name, data[1:] elif len(data) < 2: yield StopIteration else: yield name, self._strip(data[2:]) def _parse_param_list(self,content): r = Reader(content) params = [] while not r.eof(): header = r.read().strip() if ' : ' in header: arg_name, arg_type = header.split(' : ')[:2] else: arg_name, arg_type = header, '' desc = r.read_to_next_unindented_line() desc = dedent_lines(desc) params.append((arg_name,arg_type,desc)) return params _name_rgx = re.compile(r"^\s*(:(?P\w+):`(?P[a-zA-Z0-9_.-]+)`|" r" (?P[a-zA-Z0-9_.-]+))\s*", re.X) def _parse_see_also(self, content): """ func_name : Descriptive text continued text another_func_name : Descriptive text func_name1, func_name2, :meth:`func_name`, func_name3 """ items = [] def parse_item_name(text): """Match ':role:`name`' or 'name'""" m = self._name_rgx.match(text) if m: g = m.groups() if g[1] is None: return g[3], None else: return g[2], g[1] raise ValueError("%s is not a item name" % text) def push_item(name, rest): if not name: return name, role = parse_item_name(name) items.append((name, list(rest), role)) del rest[:] current_func = None rest = [] for line in content: if not line.strip(): continue m = self._name_rgx.match(line) if m and line[m.end():].strip().startswith(':'): push_item(current_func, rest) current_func, line = line[:m.end()], line[m.end():] rest = [line.split(':', 1)[1].strip()] if not rest[0]: rest = [] elif not line.startswith(' '): push_item(current_func, rest) current_func = None if ',' in line: for func in line.split(','): push_item(func, []) elif line.strip(): current_func = line elif current_func is not None: rest.append(line.strip()) push_item(current_func, rest) return items def _parse_index(self, section, content): """ .. index: default :refguide: something, else, and more """ def strip_each_in(lst): return [s.strip() for s in lst] out = {} section = section.split('::') if len(section) > 1: out['default'] = strip_each_in(section[1].split(','))[0] for line in content: line = line.split(':') if len(line) > 2: out[line[1]] = strip_each_in(line[2].split(',')) return out def _parse_summary(self): """Grab signature (if given) and summary""" if self._is_at_section(): return summary = self._doc.read_to_next_empty_line() summary_str = " ".join([s.strip() for s in summary]).strip() if re.compile('^([\w., ]+=)?\s*[\w\.]+\(.*\)$').match(summary_str): self['Signature'] = summary_str if not self._is_at_section(): self['Summary'] = self._doc.read_to_next_empty_line() else: self['Summary'] = summary if not self._is_at_section(): self['Extended Summary'] = self._read_to_next_section() def _parse(self): self._doc.reset() self._parse_summary() for (section,content) in self._read_sections(): if not section.startswith('..'): section = ' '.join([s.capitalize() for s in section.split(' ')]) if section in ('Parameters', 'Attributes', 'Methods', 'Returns', 'Raises', 'Warns'): self[section] = self._parse_param_list(content) elif section.startswith('.. index::'): self['index'] = self._parse_index(section, content) elif section == 'See Also': self['See Also'] = self._parse_see_also(content) else: self[section] = content # string conversion routines def _str_header(self, name, symbol='-'): return [name, len(name)*symbol] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): if self['Signature']: return [self['Signature'].replace('*','\*')] + [''] else: return [''] def _str_summary(self): if self['Summary']: return self['Summary'] + [''] else: return [] def _str_extended_summary(self): if self['Extended Summary']: return self['Extended Summary'] + [''] else: return [] def _str_param_list(self, name): out = [] if self[name]: out += self._str_header(name) for param,param_type,desc in self[name]: out += ['%s : %s' % (param, param_type)] out += self._str_indent(desc) out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += self[name] out += [''] return out def _str_see_also(self, func_role): if not self['See Also']: return [] out = [] out += self._str_header("See Also") last_had_desc = True for func, desc, role in self['See Also']: if role: link = ':%s:`%s`' % (role, func) elif func_role: link = ':%s:`%s`' % (func_role, func) else: link = "`%s`_" % func if desc or last_had_desc: out += [''] out += [link] else: out[-1] += ", %s" % link if desc: out += self._str_indent([' '.join(desc)]) last_had_desc = True else: last_had_desc = False out += [''] return out def _str_index(self): idx = self['index'] out = [] out += ['.. index:: %s' % idx.get('default','')] for section, references in idx.iteritems(): if section == 'default': continue out += [' :%s: %s' % (section, ', '.join(references))] return out def __str__(self, func_role=''): out = [] out += self._str_signature() out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters','Returns','Raises'): out += self._str_param_list(param_list) out += self._str_section('Warnings') out += self._str_see_also(func_role) for s in ('Notes','References','Examples'): out += self._str_section(s) out += self._str_index() return '\n'.join(out) def indent(str,indent=4): indent_str = ' '*indent if str is None: return indent_str lines = str.split('\n') return '\n'.join(indent_str + l for l in lines) def dedent_lines(lines): """Deindent a list of lines maximally""" return textwrap.dedent("\n".join(lines)).split("\n") def header(text, style='-'): return text + '\n' + style*len(text) + '\n' class FunctionDoc(NumpyDocString): def __init__(self, func, role='func'): self._f = func self._role = role # e.g. "func" or "meth" try: NumpyDocString.__init__(self,inspect.getdoc(func) or '') except ValueError, e: print '*'*78 print "ERROR: '%s' while parsing `%s`" % (e, self._f) print '*'*78 #print "Docstring follows:" #print doclines #print '='*78 if not self['Signature']: func, func_name = self.get_func() try: # try to read signature argspec = inspect.getargspec(func) argspec = inspect.formatargspec(*argspec) argspec = argspec.replace('*','\*') signature = '%s%s' % (func_name, argspec) except TypeError, e: signature = '%s()' % func_name self['Signature'] = signature def get_func(self): func_name = getattr(self._f, '__name__', self.__class__.__name__) if inspect.isclass(self._f): func = getattr(self._f, '__call__', self._f.__init__) else: func = self._f return func, func_name def __str__(self): out = '' func, func_name = self.get_func() signature = self['Signature'].replace('*', '\*') roles = {'func': 'function', 'meth': 'method'} if self._role: if not roles.has_key(self._role): print "Warning: invalid role %s" % self._role out += '.. %s:: %s\n \n\n' % (roles.get(self._role,''), func_name) out += super(FunctionDoc, self).__str__(func_role=self._role) return out class ClassDoc(NumpyDocString): def __init__(self,cls,modulename='',func_doc=FunctionDoc): if not inspect.isclass(cls): raise ValueError("Initialise using a class. Got %r" % cls) self._cls = cls if modulename and not modulename.endswith('.'): modulename += '.' self._mod = modulename self._name = cls.__name__ self._func_doc = func_doc NumpyDocString.__init__(self, pydoc.getdoc(cls)) @property def methods(self): return [name for name,func in inspect.getmembers(self._cls) if not name.startswith('_') and callable(func)] def __str__(self): out = '' out += super(ClassDoc, self).__str__() out += "\n\n" #for m in self.methods: # print "Parsing `%s`" % m # out += str(self._func_doc(getattr(self._cls,m), 'meth')) + '\n\n' # out += '.. index::\n single: %s; %s\n\n' % (self._name, m) return out pyxnat-0.9.0~dev0/doc/sphinxext/docscrape_sphinx.py000066400000000000000000000100741163242155400225320ustar00rootroot00000000000000import re, inspect, textwrap, pydoc from docscrape import NumpyDocString, FunctionDoc, ClassDoc class SphinxDocString(NumpyDocString): # string conversion routines def _str_header(self, name, symbol='`'): return ['.. rubric:: ' + name, ''] def _str_field_list(self, name): return [':' + name + ':'] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): return [''] if self['Signature']: return ['``%s``' % self['Signature']] + [''] else: return [''] def _str_summary(self): return self['Summary'] + [''] def _str_extended_summary(self): return self['Extended Summary'] + [''] def _str_param_list(self, name): out = [] if self[name]: out += self._str_field_list(name) out += [''] for param,param_type,desc in self[name]: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) out += [''] out += self._str_indent(desc,8) out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += [''] content = textwrap.dedent("\n".join(self[name])).split("\n") out += content out += [''] return out def _str_see_also(self, func_role): out = [] if self['See Also']: see_also = super(SphinxDocString, self)._str_see_also(func_role) out = ['.. seealso::', ''] out += self._str_indent(see_also[2:]) return out def _str_warnings(self): out = [] if self['Warnings']: out = ['.. warning::', ''] out += self._str_indent(self['Warnings']) return out def _str_index(self): idx = self['index'] out = [] if len(idx) == 0: return out out += ['.. index:: %s' % idx.get('default','')] for section, references in idx.iteritems(): if section == 'default': continue elif section == 'refguide': out += [' single: %s' % (', '.join(references))] else: out += [' %s: %s' % (section, ','.join(references))] return out def _str_references(self): out = [] if self['References']: out += self._str_header('References') if isinstance(self['References'], str): self['References'] = [self['References']] out.extend(self['References']) out += [''] return out def __str__(self, indent=0, func_role="obj"): out = [] out += self._str_signature() out += self._str_index() + [''] out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters', 'Attributes', 'Methods', 'Returns','Raises'): out += self._str_param_list(param_list) out += self._str_warnings() out += self._str_see_also(func_role) out += self._str_section('Notes') out += self._str_references() out += self._str_section('Examples') out = self._str_indent(out,indent) return '\n'.join(out) class SphinxFunctionDoc(SphinxDocString, FunctionDoc): pass class SphinxClassDoc(SphinxDocString, ClassDoc): pass def get_doc_object(obj, what=None): if what is None: if inspect.isclass(obj): what = 'class' elif inspect.ismodule(obj): what = 'module' elif callable(obj): what = 'function' else: what = 'object' if what == 'class': return SphinxClassDoc(obj, '', func_doc=SphinxFunctionDoc) elif what in ('function', 'method'): return SphinxFunctionDoc(obj, '') else: return SphinxDocString(pydoc.getdoc(obj)) pyxnat-0.9.0~dev0/doc/sphinxext/numpydoc.py000066400000000000000000000073701163242155400210410ustar00rootroot00000000000000""" ======== numpydoc ======== Sphinx extension that handles docstrings in the Numpy standard format. [1] It will: - Convert Parameters etc. sections to field lists. - Convert See Also section to a See also entry. - Renumber references. - Extract the signature from the docstring, if it can't be determined otherwise. .. [1] http://projects.scipy.org/scipy/numpy/wiki/CodingStyleGuidelines#docstring-standard """ import os, re, pydoc from docscrape_sphinx import get_doc_object, SphinxDocString import inspect def mangle_docstrings(app, what, name, obj, options, lines, reference_offset=[0]): if what == 'module': # Strip top title title_re = re.compile(r'^\s*[#*=]{4,}\n[a-z0-9 -]+\n[#*=]{4,}\s*', re.I|re.S) lines[:] = title_re.sub('', "\n".join(lines)).split("\n") else: doc = get_doc_object(obj, what) lines[:] = str(doc).split("\n") if app.config.numpydoc_edit_link and hasattr(obj, '__name__') and \ obj.__name__: v = dict(full_name=obj.__name__) lines += [''] + (app.config.numpydoc_edit_link % v).split("\n") # replace reference numbers so that there are no duplicates references = [] for l in lines: l = l.strip() if l.startswith('.. ['): try: references.append(int(l[len('.. ['):l.index(']')])) except ValueError: print "WARNING: invalid reference in %s docstring" % name # Start renaming from the biggest number, otherwise we may # overwrite references. references.sort() if references: for i, line in enumerate(lines): for r in references: new_r = reference_offset[0] + r lines[i] = lines[i].replace('[%d]_' % r, '[%d]_' % new_r) lines[i] = lines[i].replace('.. [%d]' % r, '.. [%d]' % new_r) reference_offset[0] += len(references) def mangle_signature(app, what, name, obj, options, sig, retann): # Do not try to inspect classes that don't define `__init__` if (inspect.isclass(obj) and 'initializes x; see ' in pydoc.getdoc(obj.__init__)): return '', '' if not (callable(obj) or hasattr(obj, '__argspec_is_invalid_')): return if not hasattr(obj, '__doc__'): return doc = SphinxDocString(pydoc.getdoc(obj)) if doc['Signature']: sig = re.sub("^[^(]*", "", doc['Signature']) return sig, '' def initialize(app): try: app.connect('autodoc-process-signature', mangle_signature) except: monkeypatch_sphinx_ext_autodoc() def setup(app, get_doc_object_=get_doc_object): global get_doc_object get_doc_object = get_doc_object_ app.connect('autodoc-process-docstring', mangle_docstrings) app.connect('builder-inited', initialize) app.add_config_value('numpydoc_edit_link', None, True) #------------------------------------------------------------------------------ # Monkeypatch sphinx.ext.autodoc to accept argspecless autodocs (Sphinx < 0.5) #------------------------------------------------------------------------------ def monkeypatch_sphinx_ext_autodoc(): global _original_format_signature import sphinx.ext.autodoc if sphinx.ext.autodoc.format_signature is our_format_signature: return print "[numpydoc] Monkeypatching sphinx.ext.autodoc ..." _original_format_signature = sphinx.ext.autodoc.format_signature sphinx.ext.autodoc.format_signature = our_format_signature def our_format_signature(what, obj): r = mangle_signature(None, what, None, obj, None, None, None) if r is not None: return r[0] else: return _original_format_signature(what, obj) pyxnat-0.9.0~dev0/doc/sphinxext/phantom_import.py000066400000000000000000000130641163242155400222400ustar00rootroot00000000000000""" ============== phantom_import ============== Sphinx extension to make directives from ``sphinx.ext.autodoc`` and similar extensions to use docstrings loaded from an XML file. This extension loads an XML file in the Pydocweb format [1] and creates a dummy module that contains the specified docstrings. This can be used to get the current docstrings from a Pydocweb instance without needing to rebuild the documented module. .. [1] http://code.google.com/p/pydocweb """ import imp, sys, compiler, types, os, inspect, re def setup(app): app.connect('builder-inited', initialize) app.add_config_value('phantom_import_file', None, True) def initialize(app): fn = app.config.phantom_import_file if (fn and os.path.isfile(fn)): print "[numpydoc] Phantom importing modules from", fn, "..." import_phantom_module(fn) #------------------------------------------------------------------------------ # Creating 'phantom' modules from an XML description #------------------------------------------------------------------------------ def import_phantom_module(xml_file): """ Insert a fake Python module to sys.modules, based on a XML file. The XML file is expected to conform to Pydocweb DTD. The fake module will contain dummy objects, which guarantee the following: - Docstrings are correct. - Class inheritance relationships are correct (if present in XML). - Function argspec is *NOT* correct (even if present in XML). Instead, the function signature is prepended to the function docstring. - Class attributes are *NOT* correct; instead, they are dummy objects. Parameters ---------- xml_file : str Name of an XML file to read """ import lxml.etree as etree object_cache = {} tree = etree.parse(xml_file) root = tree.getroot() # Sort items so that # - Base classes come before classes inherited from them # - Modules come before their contents all_nodes = dict([(n.attrib['id'], n) for n in root]) def _get_bases(node, recurse=False): bases = [x.attrib['ref'] for x in node.findall('base')] if recurse: j = 0 while True: try: b = bases[j] except IndexError: break if b in all_nodes: bases.extend(_get_bases(all_nodes[b])) j += 1 return bases type_index = ['module', 'class', 'callable', 'object'] def base_cmp(a, b): x = cmp(type_index.index(a.tag), type_index.index(b.tag)) if x != 0: return x if a.tag == 'class' and b.tag == 'class': a_bases = _get_bases(a, recurse=True) b_bases = _get_bases(b, recurse=True) x = cmp(len(a_bases), len(b_bases)) if x != 0: return x if a.attrib['id'] in b_bases: return -1 if b.attrib['id'] in a_bases: return 1 return cmp(a.attrib['id'].count('.'), b.attrib['id'].count('.')) nodes = root.getchildren() nodes.sort(base_cmp) # Create phantom items for node in nodes: name = node.attrib['id'] doc = (node.text or '').decode('string-escape') + "\n" if doc == "\n": doc = "" # create parent, if missing parent = name while True: parent = '.'.join(parent.split('.')[:-1]) if not parent: break if parent in object_cache: break obj = imp.new_module(parent) object_cache[parent] = obj sys.modules[parent] = obj # create object if node.tag == 'module': obj = imp.new_module(name) obj.__doc__ = doc sys.modules[name] = obj elif node.tag == 'class': bases = [object_cache[b] for b in _get_bases(node) if b in object_cache] bases.append(object) init = lambda self: None init.__doc__ = doc obj = type(name, tuple(bases), {'__doc__': doc, '__init__': init}) obj.__name__ = name.split('.')[-1] elif node.tag == 'callable': funcname = node.attrib['id'].split('.')[-1] argspec = node.attrib.get('argspec') if argspec: argspec = re.sub('^[^(]*', '', argspec) doc = "%s%s\n\n%s" % (funcname, argspec, doc) obj = lambda: 0 obj.__argspec_is_invalid_ = True obj.func_name = funcname obj.__name__ = name obj.__doc__ = doc if inspect.isclass(object_cache[parent]): obj.__objclass__ = object_cache[parent] else: class Dummy(object): pass obj = Dummy() obj.__name__ = name obj.__doc__ = doc if inspect.isclass(object_cache[parent]): obj.__get__ = lambda: None object_cache[name] = obj if parent: if inspect.ismodule(object_cache[parent]): obj.__module__ = parent setattr(object_cache[parent], name.split('.')[-1], obj) # Populate items for node in root: obj = object_cache.get(node.attrib['id']) if obj is None: continue for ref in node.findall('ref'): if node.tag == 'class': if ref.attrib['ref'].startswith(node.attrib['id'] + '.'): setattr(obj, ref.attrib['name'], object_cache.get(ref.attrib['ref'])) else: setattr(obj, ref.attrib['name'], object_cache.get(ref.attrib['ref'])) pyxnat-0.9.0~dev0/doc/starters_tutorial.rst000066400000000000000000000337721163242155400211300ustar00rootroot00000000000000============================== Starters Tutorial ============================== .. currentmodule:: pyxnat This is a short tutorial going through the main features of this API. Depending on the policy of the XNAT server you are using, and your user level, you can have read and write access to a specific set of resources. During this tutorial, we will use a `fake` standard user account on the XNAT central repository, where you will have limited access to a number of projects and full access to the projects you own. .. note:: XNAT Central is a public XNAT repository managed by the XNAT team and updated regularly with the latest improvements of the development branch. _____ .. [#] http://central.xnat.org Getting started --------------- Connecting to a XNAT server requires valid credentials so you might want to start by requesting those on the Web interface of your server. >>> from pyxnat import Interface >>> central = Interface( server='http://central.xnat.org:8080', user='my_login', password='my_pass', cachedir=os.path.join(os.path.expanduser('~'), '.store') ) The cachedir argument specifies where the local disk-cache will be stored. Every query and downloaded file will be stored here so choose a location with sufficient free space. If the datastore argument if not given, a temporary location is picked automatically but it may be flushed at every reboot of the machine. Here the cachedir argument is set to a `.store` directory in the user's home directory in a cross platform manner. If the `cachedir` starts getting full, a warning will be printed in the stdout. It is also possible to define an :class:`Interface` object without specifying all the connection parameters. Pyxnat switches to interactive mode and prompts the user for the missing information. In that case the object checks that the parameters are correct by connecting to the server. >>> central = Interface(server='http://central.xnat.org:8080') >>> User:my_login >>> Password: You can also use a configuration file. The best way to create the file is to use the ``save_config()`` method on an existing interface. >>> central.save_config('central.cfg') >>> central2 = Interface(config='central.cfg') .. warning:: Depending on the server configuration, you may have to include the port in the server url, as well as the name of the XNAT tomcat application. So you might end up with something like: http://server_ip:port/xnat The main interface class is now divided into logical subinterfaces: - data selection - general management - cache management - server instrospection Data selection -------------- Now that we have an `Interface` object, we can start browsing the server with the ``select`` subinterface which can be used, either with expicit Python objects and methods, or through a ``path`` describing the data. Simple requests:: >>> interface.select.projects().get() [..., u'CENTRAL_OASIS_CS', u'CENTRAL_OASIS_LONG', ...] >>> interface.select('/projects').get() [..., u'CENTRAL_OASIS_CS', u'CENTRAL_OASIS_LONG', ...] Nested requests:: >>> interface.select.projects().subjects().get() >>> interface.select('/projects/*/subjects').get() >>> interface.select('/projects/subjects').get() >>> interface.select('//subjects').get() ['IMAGEN_000000001274', 'IMAGEN_000000075717', ...,'IMAGEN_000099954902'] Filtered requests:: >>> interface.select.projects('*OASIS_CS*').get() >>> interface.select('/projects/*OASIS_CS*').get() [u'CENTRAL_OASIS_CS'] >>> interface.select.project('IMAGEN').subjects('*55*42*').get() >>> interface.select('/projects/IMAGEN/subjects/*55*42*').get() ['IMAGEN_000055203542', 'IMAGEN_000055982442', 'IMAGEN_000097555742'] Resources paths --------------- The resources paths that can be passed as an argument to ``select`` is a powerful tool but can easily generate thousands of queries so one has to be careful when using it. Absolute paths ~~~~~~~~~~~~~~ A full path to a resource is a sequence of resource level and resource_id pairs:: /project/IMAGEN/subject/IMAGEN_000055982442 A full path to a resource listing is a sequence of resource level and resource_id pairs finishing by a plural resource level (i.e. with an 's'):: /project/IMAGEN/subject/IMAGEN_000055982442/experiments The first nice thing here is that you actually don't have to worry about resource level to be plural or singular within the path:: /project/IMAGEN/subject/IMAGEN_000055982442 EQUALS /projects/IMAGEN/subjects/IMAGEN_000055982442 /project/IMAGEN/subject/IMAGEN_000055982442/experiments EQUALS /project/IMAGEN/subjects/IMAGEN_000055982442/experiment Relative paths and shortcuts ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When browsing resources, some levels are often left without any IDs and filled with ``*`` filters instead, which leads to paths like:: /projects/*/subjects/*/experiments/* That can instead be written:: /projects/subjects/experiments OR //experiments To have all the experiments from a specific project:: /project/IMAGEN//experiments EQUALS /project/IMAGEN/subjects/*/experiments The double slash syntax can be used anywhere in the path and any number of time:: //subjects//assessors EQUALS /projects/*/subjects/*/experiments/*/assessors/* Sometimes, a path will generate more than one path because it can be interpreted in different way:: //subjects//assessors//files Generates:: /projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/* /projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/* /projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/* .. warning:: If you try ``//files``, it will generate all the possible descendant paths: | /projects/*/subjects/*/experiments/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/* | /projects/*/subjects/*/experiments/*/scans/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/* | /projects/*/subjects/*/resources/*/files/* | /projects/*/resources/*/files/* | /projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/* | /projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/* If the server has decent amount a data it will take ages to go through all the resources. Resources operations -------------------- Several operations are accessible for every resource level. The most importants are responsible for creating new resources, deleting existing ones and testing whether a given resource exists or not:: >>> my_project = central.select.project('my_project') >>> my_project.exists() False >>> my_project.create() >>> my_project.exists() True >>> subject = my_project.subject('first_subject') >>> subject.create() >>> subject.delete() >>> subject.exists() False An optional keyword argument is available to specify the datatype from the XNAT schema. The keyword must match the name of the REST level. >>> subject.create() >>> subject.experiment('pet_session' ).create(experiments='xnat:petSessionData') It is also possible to create resources without having to create the parent resources first. For example:: >>> central.select('/project/PROJECT/subject/SUBJECT').exists() False >>> central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP').exists() False Specifiy the datatype on multiple levels:: >>> central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP/scan/SCAN' ).create(experiments='xnat:mrSessionData', scans='xnat:mrScanData') Use default datatypes:: >>> central.select('/project/PROJECT/subject/SUBJECT/experiment/EXP/scan/SCAN' ).create() Additional fields can be configured at the resource creation. It can be especially useful for datatypes that have some mandatory fields, and thus would not be created if not specified (this is not a best practice for XML Schema writers though). It also enables users to set the resource ID through the REST API instead of just the label (the ID in this case is generated automatically). Custom ID example:: >>> experiment.create(experiments='xnat:mrSessionData', ID='my_custom_ID' ) With additional fields:: >>> experiment.create(**{'experiments':'xnat:mrSessionData', 'ID':'mr_custom_ID', 'xnat:mrSessionData/age':'42'} ) .. warning:: When using xpath syntax to declare fields, it is mandatory to pass the arguments using a dictionnary because of the ``/`` and ``:`` characters. And do not forget to expand the dict with the ``**``. Since you can create different resource levels in a single create call in pyxnat, it is also possible to configure those levels in a single call. For example if the subject for that experiment was not created, you could have specified:: >>> experiment.create( **{'experiments':'xnat:mrSessionData', 'ID':'mr_custom_ID', 'xnat:mrSessionData/age':'42', 'xnat:subjectData/investigator/lastname':'doe', 'xnat:subjectData/investigator/firstname':'john', 'xnat:subjectData/ID':'subj_custom_ID' }) File support ------------ It is possible to upload and then download files at every REST resource level:: >>> my_project.files() [] >>> my_project.file('image.nii').put('/tmp/image.nii') >>> # you can add any of the following arguments to give additional >>> # information on the file you are uploading >>> my_project.file('image.nii').put( '/tmp/image.nii', content='T1', format='NIFTI' tags='image test' ) >>> my_project.resource('NIFTI').file('image.nii').size() 98098 >>> my_project.resource('NIFTI').file('image.nii').content() 'T1' >>> my_project.resource('NIFTI').file('image.nii').format() 'NIFTI' >>> my_project.resource('NIFTI').file('image.nii').tags() 'image test' >>> my_project.resource('NIFTI').file('image.nii').get() '~/.store/nosetests@central.xnat.org/c7a5b961fc504ffc9aa292f76d75fb0c_image.nii' >>> my_project.file('image.nii').get_copy() '~/.store/nosetests@central.xnat.org/workspace/projects/Volatile/resources/123150742/files/image.nii' >>> my_project.file('image.nii').get_copy('/tmp/test.nii') '/tmp/test.nii' >>> # the resource level can be used to group files >>> my_project.resource('ANALYZE').file('image.hdr').put('/tmp/image.hdr') >>> my_project.resource('ANALYZE').file('image.img').put('/tmp/image.img') >>> my_project.resources() ['NIFTI', 'ANALYZE'] >>> my_project.resource('ANALYZE').files() ['image.hdr', 'image.img'] .. tip:: New since 0.7, the default ``get()`` method on a file can be given a custom path. It will still be handled and tracked by the cache in the same way as other files. Attributes support ------------------ Each resource level also has a set of metadata fields that can be informed. This set of fields depends on the resource level and on its type in the XNAT schema. >>> # use hard-coded shortcuts from the REST API >>> my_project.attrs.set('secondary_ID', 'myproject') >>> my_project.attrs.get('secondary_ID') 'myproject' >>> # use XPATH from standard or custom XNAT Schema >>> my_project.attrs.set('xnat:projectData/keywords', 'test project') >>> my_project.attrs.get('xnat:projectData/keywords') 'test project' >>> # get or set multiple attributes in a single request to improve performance >>> my_project.attrs.mset({'xnat:projectData/keywords':'test project', 'secondary_ID':'myproject'}) >>> my_project.attrs.mget(['xnat:projectData/keywords', 'secondary_ID']) ['test porject', 'myproject'] _____ .. [#] http://www.xnat.org/XNAT+REST+XML+Path+Shortcuts The search engine ------------------ The XNAT search engine can be queried via the REST model. It can be used to retrieve a specific subset of REST resources or a table containing the relevant values. The following queries find all the subjects that are within `my_project` or that have an age superior to 14:: >>> contraints = [('xnat:subjectData/SUBJECT_ID','LIKE','%'), ('xnat:subjectData/PROJECT', '=', 'my_project'), 'OR', [('xnat:subjectData/AGE','>','14'), 'AND' ] ] >>> # retrieve experiments >>> interface.select('//experiments').where(contraints) >>> # retrieve table with one subject per row and the columns SUBJECT_ID and AGE >>> interface.select('xnat:subjectData', ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/AGE']).where(contraints) See the ``Search``, ``SeachManager`` and ``CObject`` classes reference documentation for further details. To get the searchable types and fields to put in the contraints, rows and columns parameters, use the ``Interface.inspect.datatypes`` method:: >>> central.inspect.datatypes(optional_filter) [..., 'xnat:subjectData', 'xnat:projectData', 'xnat:mrSessionData', ...] >>> central.inspect.datatypes('xnat:subjectData', optional_filter) ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/INSERT_DATE', 'xnat:subjectData/INSERT_USER', 'xnat:subjectData/GENDER_TEXT', ...] .. tip:: How to get all the results in a query? >>> interface.select('xnat:subjectData', ['xnat:subjectData/SUBJECT_ID', 'xnat:subjectData/AGE']).all() .. tip:: How to get all the columns from a datatype? >>> table = interface.select('xnat:subjectData').where(...) .. tip:: Then to get everything: >>> table = interface.select('xnat:subjectData').all() pyxnat-0.9.0~dev0/doc/under_the_hood.rst000066400000000000000000000050461163242155400203150ustar00rootroot00000000000000==================== Under the Hood ==================== The REST model -------------- Check out the wikipedia page if you are not familiar with REST. _____ .. [#] http://en.wikipedia.org/wiki/REST The REST model in XNAT ---------------------- Basically the resources are accessible pairing a level and its ID in a sequence representing a URI starting by /REST. Uniquely identifiable resources: - /REST/projects/{ID} - /REST/projects/{ID}/subjects/{ID} Listing the resources is done by not giving an ID at the end of a URI: - /REST/projects - /REST/projects/{ID}/subjects Requesting specific data in specific format is done with a query string: - /REST/projects?format=csv - /REST/projects/{ID}?format=xml _____ .. [#] http://www.xnat.org/Web+Services REST in Python -------------- The REST resource levels supported by this Python library are the following:: - projects - subjects - experiments - scans - reconstructions - assessors Attached to each resource level are:: - resources - files Every level corresponds to a Python class sharing common methods from ResourceObject and adding methods relevant to the specific resource. +-----------------+----------------+ | REST resource | Python Class | +=================+================+ | REST | Interface | +-----------------+----------------+ | projects | Project | +-----------------+----------------+ | subjects | Subject | +-----------------+----------------+ | experiments | Experiment | +-----------------+----------------+ | scans | Scan | +-----------------+----------------+ | reconstructions | Reconstruction | +-----------------+----------------+ | assessors | Assessor | +-----------------+----------------+ | resources | Resource | +-----------------+----------------+ | files | File | +-----------------+----------------+ This classes may but should not be instantiated manually. The HTTP requests are handled by a slightly modified version of httplib2, which is shipped the package. The main fix was made to enable back the built-in HTTP cache to avoid downloading again files that are already in the cache. This changes nothing for other resources that don't have to necessary HTTP headers to enable a cache service. pyxnat-0.9.0~dev0/pyxnat/000077500000000000000000000000001163242155400153465ustar00rootroot00000000000000pyxnat-0.9.0~dev0/pyxnat/__init__.py000066400000000000000000000045301163242155400174610ustar00rootroot00000000000000""" pyxnat is a simple python library that relies on the REST API provided by the XNAT platform since its 1.4 version. XNAT is an extensible database for neuroimaging data. The main objective is to ease communications with an XNAT server to plug-in external tools or python scripts to process the data. It features: #. resources browsing capabilities #. read and write access to resources #. complex searches #. disk-caching of requested files and resources .. [#] XNAT home: http://www.xnat.org/ .. [#] pyxnat documentation: http://packages.python.org/pyxnat/ .. [#] pyxnat download: http://pypi.python.org/pypi/pyxnat#downloads .. [#] pyxnat sources: http://github.com/pyxnat/pyxnat ____ **A short overview** *Setup the connection* >>> from pyxnat import Interface >>> interface = Interface( server='http://central.xnat.org:8080', user='login', password='pass', cachedir=os.path.join(os.path.expanduser('~'), '.store') ) *Browse the resources* >>> interface.select.projects().get() [u'CENTRAL_OASIS_CS', u'CENTRAL_OASIS_LONG', ...] *Create new resources* >>> interface.select.project('my_project').create() >>> interface.select.project('my_project').resource('images' ).file('image.nii').put('/tmp/image.nii') *Make complex searches* >>> table = interface.select('xnat:subjectData', ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID' ] ).where([('xnat:subjectData/SUBJECT_ID','LIKE','%'), ('xnat:subjectData/PROJECT', '=', 'my_project'), 'AND' ]) """ __version__ = '0.9.0dev' from .core import Interface from .core import SearchManager from .core import CacheManager from .core import Select from .core import Inspector from .core import Users from .core import attributes from .core import cache from .core import help from .core import interfaces from .core import resources from .core import schema from .core import select from .core import users from .core import jsonutil from .core import uriutil from .core import xpass from .core import xpath_store pyxnat-0.9.0~dev0/pyxnat/core/000077500000000000000000000000001163242155400162765ustar00rootroot00000000000000pyxnat-0.9.0~dev0/pyxnat/core/__init__.py000066400000000000000000000003121163242155400204030ustar00rootroot00000000000000import os import sys from .interfaces import Interface from .search import SearchManager from .cache import CacheManager from .select import Select from .help import Inspector from .users import Users pyxnat-0.9.0~dev0/pyxnat/core/array.py000066400000000000000000000150561163242155400177750ustar00rootroot00000000000000from .jsonutil import JsonTable class ArrayData(object): def __init__(self, interface): self._intf = interface def _get_array(self, query_string, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:imageSessionData', columns=None, constraints=None ): if constraints is None: constraints = {} uri = '/data/experiments?xsiType=%s' % experiment_type if project_id is not None: uri += '&project=%s' % project_id if subject_id is not None: uri += '&%s/subject_id=%s' % (experiment_type, subject_id) if subject_label is not None: uri += '&%s/subject_label=%s' % (experiment_type, subject_label) if experiment_id is not None: uri += '&ID=%s' % experiment_id if experiment_label is not None: uri += '&label=%s' % experiment_label uri += query_string if constraints != {}: uri += ',' + ','.join(constraints.keys()) if columns is not None: uri += ',' + ','.join(columns) c = {} [c.setdefault(key.lower(), value) for key, value in constraints.items() ] return JsonTable(self._intf._get_json(uri)).where(**c) def experiments(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:mrSessionData', columns=None, constraints=None ): """ Returns a list of all visible experiment IDs of the specified type, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. experiment_type: string xsi path type; e.g. 'xnat:mrSessionData' constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ query_string = '&columns=ID,project,%s/subject_id' % experiment_type return self._get_array(query_string, project_id, subject_id, subject_label, experiment_id, experiment_label, experiment_type, constraints ) def scans(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:mrSessionData', scan_type='xnat:mrScanData', columns=None, constraints=None ): """ Returns a list of all visible scan IDs of the specified type, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. experiment_type: string xsi path type; e.g. 'xnat:mrSessionData' scan_type: string xsi path type; e.g. 'xnat:mrScanData', etc. constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ query_string = '&columns=ID,project,%s/subject_id,%s/ID' % ( experiment_type, scan_type) return self._get_array(query_string, project_id, subject_id, subject_label, experiment_id, experiment_label, experiment_type, constraints ) def search_experiments(self, project_id=None, subject_id=None, subject_label=None, experiment_type='xnat:mrSessionData', columns=None, constraints=None ): """ Returns a list of all visible experiment IDs of the specified type, filtered by optional constraints. This function is a shortcut using the search engine. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_type: string xsi path type must be a leaf session type. defaults to 'xnat:mrSessionData' columns: List[string] list of xsi paths for names of columns to return. constraints: list[(tupple)] List of tupples for comparison in the form (key, comparison, value) valid comparisons are: =, <, <=,>,>=, LIKE """ if columns is None: columns = [] where_clause = [] if project_id is not None: where_clause.append(('%s/project' % experiment_type, "=", project_id)) if subject_id is not None: where_clause.append(('xnat:subjectData/ID', "=", subject_id)) if subject_label is not None: where_clause.append(('xnat:subjectData/LABEL', "=", subject_label)) if constraints is not None: where_clause.extend(constraints) if where_clause != []: where_clause.append('AND') if where_clause != []: table = self._intf.select(experiment_type, columns=columns).where(where_clause) return table else: table = self._intf.select(experiment_type, columns=columns) return table.all() pyxnat-0.9.0~dev0/pyxnat/core/attributes.py000066400000000000000000000142431163242155400210420ustar00rootroot00000000000000import difflib import urllib from .jsonutil import JsonTable from .uriutil import uri_parent from .schema import datatype_attributes class EAttrs(object): """ Accessor class to resource fields. Help to retrieve the attributes paths relevant to this element:: >>> subject.attrs() ['xnat:subjectData/sharing', 'xnat:subjectData/sharing/share', 'xnat:subjectData/resources', ... 'xnat:subjectData/experiments/experiment' ] All paths are not valid but they give an indication of what is available. To retrieve the paths, the corresponding schemas must be downloaded first through the schema management interface in order to be parsed:: >>> interface.manage.schemas.add('xnat.xsd') >>> interface.manage.schemas.add('myschema/myschema.xsd') """ def __init__(self, eobj): """ Parameters ---------- eobj: :class:`EObject` Object """ self._eobj = eobj self._intf = eobj._intf self._datatype = None self._id = None def __call__(self): """ List the attributes paths relevant to this element. """ paths = [] self._intf.manage.schemas._init() for root in self._intf.manage.schemas._trees.values(): paths.extend(datatype_attributes(root, self._get_datatype())) return paths def _get_datatype(self): if self._datatype is None: self._datatype = self._eobj.datatype() return self._datatype def _get_id(self): if self._id is None: self._id = self._eobj.id() return self._id def set(self, path, value): """ Set an attribute. Parameters ---------- path: string The xpath of the attribute relative to the element. value: string The attribute's value. Note that the python type is always a string but the content of the value must match what is defined in the schema. e.g. an element defined as a float in the schema must be given a string containing a number, a valid date must follow the ISO 8601 which is the standard representation for dates and times established by the W3C. """ put_uri = self._eobj._uri+'?%s=%s' % (urllib.quote(path), urllib.quote(value) ) self._intf._exec(put_uri, 'PUT') def mset(self, dict_attrs): """ Set multiple attributes at once. It is more efficient to use this method instead of multiple times the `set()` method when setting more than one attribute because only a single HTTP call is issued to the server. Parameters ---------- dict_attrs: dict The dict of key values to set. It follows the same principles as the single `set()` method. """ query_str = '?' + '&'.join(['%s=%s' % (urllib.quote(path), urllib.quote(val) ) for path, val in dict_attrs.items() ] ) put_uri = self._eobj._uri + query_str self._intf._exec(put_uri, 'PUT') def get(self, path): """ Get an attribute value. .. note:: The value is always returned in a Python string. It must be explicitly casted or transformed if needed. Parameters ---------- path: string The xpath of the attribute relative to the element. Returns ------- A string containing the value. """ query_str = '?columns=ID,%s' % path get_uri = uri_parent(self._eobj._uri) + query_str jdata = JsonTable(self._intf._get_json(get_uri) ).where(ID=self._get_id()) # unfortunately the return headers do not always have the # expected name header = difflib.get_close_matches(path.split('/')[-1], jdata.headers() ) if header == []: header = difflib.get_close_matches(path, jdata.headers())[0] else: header = header[0] replaceSlashS = lambda x : x.replace('\s',' ') if type(jdata.get(header)) == list: return map(replaceSlashS, jdata.get(header)) else: return jdata.get(header).replace('\s', ' ') def mget(self, paths): """ Set multiple attributes at once. It is more efficient to use this method instead of multiple times the `get()` method when getting more than one attribute because only a single HTTP call is issued to the server. Parameters ---------- paths: list List of attributes' paths. Returns ------- list: ordered list of values (in the order of the requested paths) """ query_str = '?columns=ID,%s' % ','.join(paths) get_uri = uri_parent(self._eobj._uri) + query_str jdata = JsonTable(self._intf._get_json(get_uri) ).where(ID=self._get_id()) results = [] # unfortunately the return headers do not always have the # expected name for path in paths: header = difflib.get_close_matches(path.split('/')[-1], jdata.headers()) if header == []: header = difflib.get_close_matches(path, jdata.headers())[0] else: header = header[0] results.append(jdata.get(header).replace('\s', ' ')) return results pyxnat-0.9.0~dev0/pyxnat/core/cache.py000066400000000000000000000270051163242155400177170ustar00rootroot00000000000000from __future__ import with_statement import os import platform import ctypes import glob import hashlib import re import time import shutil from StringIO import StringIO _platform = platform.system() DEBUG = False def md5name(key): """ Generates a unique path to store server responses. """ ext = re.findall('.*?(?=(\?format=.+?(?=\?|&|$)|' '\&format=.+?(?=\?|&|$)))', key) if ext != []: last = key.split('?')[0].split('/')[-1] key = key.replace(ext[0], '') ext = ext[0].split('format')[1] key += ext last += ext else: last = key.split('/')[-1] return '%s_%s' % (hashlib.md5(key).hexdigest(), last.replace('=', '.')) def bytes_to_human(size, unit): """ Returns a more human readable version of a size in bytes. """ if unit == 'mega': return float(size) / 1024 ** 2 elif unit == 'giga': return float(size) / 1024 ** 3 else: return size def memstr_to_bytes(text): """ Convert a memory text to its value in kilobytes. """ kilo = 1024**2 units = dict(K=1, M=kilo, G=kilo**2) try: size = int(units[text[-1]]*float(text[:-1])) except (KeyError, ValueError): raise ValueError( "Invalid literal for size give: %s (type %s) should be " "alike '10G', '500M', '50K'." % (text, type(text)) ) return size class HTCache(object): def __init__(self, cachedir, interface, safe=md5name): """ Parameters ---------- cachedir: string The cache path. interface: :class:`Interface` Object safe: callable The function used to generate the responses cache paths. """ self._intf = interface self.cache = cachedir self.safe = safe self._cachepath = None if not os.path.exists(cachedir): os.makedirs(cachedir) def get(self, key): retval = None _cachepath = os.path.join(self.cache, self.safe(key)) if DEBUG: print 'cache get:', key, print '\n\t', _cachepath try: f = file('%s.headers' % _cachepath, "rb") retval = f.read() f.close() f = file(_cachepath, "rb") retval += f.read() f.close() except IOError: try: f = file('%s.alt' % _cachepath, "rb") _altpath = f.read() f.close() f = file(_altpath, "rb") retval += f.read() f.close() except: return return retval def set(self, key, value): """ Sets cache entry. """ _fakepath = '%s.alt' % os.path.join(self.cache, self.safe(key)) _headerpath = '%s.headers' % os.path.join(self.cache, self.safe(key)) _cachepath = os.path.join(self.cache, self.safe(key)) if self._cachepath is not None: # when using custom path if _cachepath != self._cachepath and os.path.exists(_cachepath): os.remove(_cachepath) # remove default file if exists if os.path.exists(_fakepath): f = file(_fakepath, "rb") _altpath = f.read() f.close() if _altpath != self._cachepath and os.path.exists(_altpath): # remove old custom file if different location os.remove(_altpath) _cachepath = self._cachepath if DEBUG: print 'cache set custom:', key print '\n\t', _cachepath f = open(_fakepath, 'w') f.write(_cachepath) f.close() self._cachepath = None else: # when using default cache path if os.path.exists(_fakepath): # if alternate location exists f = file(_fakepath, "rb") _altpath = f.read() f.close() if _altpath != self._cachepath and os.path.exists(_altpath): os.remove(_altpath) # remove actual file os.remove(_fakepath) # remove pointer file if DEBUG: print 'cache set default:', key print '\n\t', _cachepath header = '' value = StringIO(value) # avoid checking disk status each time if time.gmtime(time.time())[5] % 10 == 0: disk_status = self._intf.cache.disk_ready(_cachepath) if not disk_status[0] and self._intf.cache._warn: print 'Warning: %s is %.2f%% full' % \ (os.path.dirname(_cachepath), disk_status[1]) while len(header) < 4 or header[-4:] != '\r\n\r\n': header += value.read(1) content = value.read() f = file(_headerpath, "wb") f.write(header) f.close() f = file(_cachepath, "wb") f.write(content) f.close() def preset(self, path): """ Sets and forces a path for the next entry to be set. .. note:: Basically it is a way to trick the cache mechanism into using something else than the default path to store entries. """ if self._intf._mode != 'offline': self._cachepath = path def delete(self, key): """ Deletes the entry. """ if DEBUG: print 'cache del:', key _cachepath = os.path.join(self.cache, self.safe(key)) _fakepath = '%s.alt' % _cachepath _headerpath = '%s.headers' % _cachepath if os.path.exists(_fakepath): f = file(_fakepath, "rb") _altpath = f.read() f.close() os.remove(_fakepath) if os.path.exists(_altpath): os.remove(_altpath) if os.path.exists(_cachepath): os.remove(_cachepath) if os.path.exists(_headerpath): os.remove(_headerpath) def get_diskpath(self, key, force_default=False): """ Gets the disk path where the entry is stored (default path or not) """ _cachepath = os.path.join(self.cache, self.safe(key)) _fakepath = '%s.alt' % _cachepath if os.path.exists(_fakepath) and not force_default: f = file(_fakepath, "rb") _altpath = f.read() f.close() return _altpath else: return _cachepath class CacheManager(object): """ Management interface for the cache. It provides a few methods to:: - evaluate the size a the cache - check if there is space left on the disk - clear the cache - define cache usage parameters """ def __init__(self, interface): """ Parameters ---------- interface: :class:`Interface` Object """ self._intf = interface self._cache = interface._http.cache self._warn = True def enable_warnings(self, toggle=True): self._warn = toggle def clear(self): """ Clears all files tracked by pyxnat. """ for _fakepath in glob.iglob('%s/*.alt' % self._cache.cache): f = file(_fakepath, "rb") _altpath = f.read() f.close() if os.path.exists(_altpath): os.remove(_altpath) shutil.rmtree(self._cache.cache) os.makedirs(self._cache.cache) def size(self, unit='bytes'): """ Returns the amount of space taken by the cache. Parameters ---------- unit: str unit in which to return the size can be bytes (default), mega or giga Returns ------- size: float """ size = 0 for cachefile in glob.iglob('%s/*' % self._cache.cache): size += os.path.getsize(cachefile) if cachefile.endswith('.alt'): f = file(cachefile, "rb") _altpath = f.read() f.close() if os.path.exists(_altpath): size += os.path.getsize(_altpath) return bytes_to_human(size, unit) def available_disk(self, path=None, unit='bytes'): """ Available disk on partition. Default location is cache folder. """ if path is None: path = self._cache.cache if not os.path.isdir(path): path = os.path.dirname(path.rstrip('/')) if _platform == 'Windows': available = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW( ctypes.c_wchar_p(path), None, None, ctypes.pointer(available)) return bytes_to_human(available.value, unit) else: cache_st = os.statvfs(path) return bytes_to_human(cache_st.f_bavail * cache_st.f_bsize, unit) def used_disk(self, path=None, unit='bytes'): """ Used disk on partition. Default location is cache folder. """ if path is None: path = self._cache.cache return self.total_disk(path, unit) - self.available_disk(path, unit) def total_disk(self, path=None, unit='bytes'): """ Total disk on partition. Default location is cache folder. """ if path is None: path = self._cache.cache if not os.path.isdir(path): path = os.path.dirname(path.rstrip('/')) if _platform == 'Windows': total = ctypes.c_ulonglong(0) ctypes.windll.kernel32.GetDiskFreeSpaceExW( ctypes.c_wchar_p(path), None, ctypes.pointer(total), None, ) return bytes_to_human(total.value, unit) else: cache_st = os.statvfs(path) return bytes_to_human(cache_st.f_blocks * cache_st.f_bsize, unit) def disk_ready(self, path=None, ready_ratio=90.0): """ Checks the status of the disk. Basically if there is enough space left. The default location is cache dir. """ if path is None: path = self._cache.cache disk_ratio = ( float(self.used_disk(path)) / \ float(self.total_disk(path)) * 100 ) return disk_ratio < ready_ratio, disk_ratio def set_usage(self, mode=None, expiration=1.0): """ Customize cache usage. Parameters ---------- mode: string 'online' or 'offline': - online will always query the server to have up to date data. - offline will only try to query the server if the data is not cached. expiration: float Relevant only to online mode. The cache has an expiration mechanism. If two queries on the same resource are issued under the specified value, the cache will be used and the server will not be requested. """ if mode == 'online': self._intf._mode = 'online' self._intf._memtimeout = expiration elif mode == 'offline': self._intf._mode = 'offline' self._intf._memtimeout = expiration else: self._intf._memtimeout = expiration pyxnat-0.9.0~dev0/pyxnat/core/downloadutils.py000066400000000000000000000147731163242155400215540ustar00rootroot00000000000000import os import zipfile from .schema import class_name from . import uriutil from . import schema def unzip(fzip, dest_dir, check={'run':lambda z,d: True,'desc':""}): """ Extracts the given zip file to the given directory, but only if all members of the archive pass the given check. Parameters ---------- src: fzip zipfile dest_dir: string directory into which to extract the archive check: dict An dictionary that has the keys: 'run' : A function that takes a filename and parent directory and returns Bool. By default this function always returns True. 'dest' : A string description of this test. By default this is empty. Returns a tuple of type (bool,[string]) where if the extraction ran successfully the first is true and the second is a list of files that were extracted, and if not the first is false and the second is the name of the failing member. """ for member in fzip.namelist(): if not check['run'](member,dest_dir): return (False,member) fzip.extractall(path=dest_dir) return (True, map (lambda f: os.path.join(dest_dir,f),fzip.namelist())) def download (dest_dir, instance=None,type="ALL",name=None, extract=False, safe=False): """ Download all the files at this level that match the given constraint as a zip archive. Should not be called directly but from a instance of class that supports bulk downloading eg. "Scans" Parameters ---------- instance : 'object The instance that contains local values needed by this function eg. instance._cbase stores the URI. dest_dir : string directory into which to place the downloaded archive type: string a comma separated list of file types, eg. "T1,T2". Default is "ALL" name: string the name of the zip archive. Defaults to None. See below for the default naming scheme extract: bool If True, the files are left extracted in the parent directory. Default is False safe: bool If true, run safety checks on the files before extracting, eg. check that the file doesn't exist in the parent directory before overwriting it. Default is False Default Zip Name ---------------- Given the project "p", subject "s" and experiment "e", and that the "Scans" (as opposed to "Assessors" or "Reconstructions") are being downloaded, and the scan types are constrained to "T1,T2", the name of the zip file defaults to: "p_s_e_scans_T1_T2.zip" Exceptions ---------- A generic Exception will be raised if any of the following happen: - This function is called directly and not from an instance of a class that supports bulk downloading eg."Scans" - The destination directory is unspecified A LookupError is raised if there are no resources to download A ValueError is raised if any of the following happen: - The project, subject and experiment names could not be extracted from the URI - The type constraint "ALL" is used with other constraints. eg. "ALL,T1,T2" - The URI associated with this class contains wildcards eg. /projects/proj/subjects/*/experiments/scans An EnvironmentError is raised if any of the following happen: - If "safe" is true, and (a) a zip file with the same name exists in given destination directory or (b) extracting the archive overrides an existing file. In the second case the downloaded archive is left in the parent directory. Return ------ A path to the zip archive if "extract" is False, and a list of extracted files if True. """ if instance is None: raise Exception('This function should be called directly but from an instance of a class that supports bulk downloading, eg. "Scans"') if dest_dir is None: raise Exception('Destination directory is unspecified') # the URI must be fully qualified with a project,subject and experiment if '%2A' in instance._cbase: raise ValueError('URI contains wildcards :' + instance._cbase) # Check that there are resources at this level available = instance.get() if len(available) == 0: raise LookupError( 'There are no %s to download' % class_name(instance).lower()) pse = uriutil.extract_uri(instance._cbase) if pse is None: raise ValueError("Could not extract project, subject and experiment from the uri: " + instance._cbase) # Extract the desired scan types. Clean up whitespace and remove dupes types = {} for t in type.split(','): cleaned = t.strip() if cleaned != "": types[cleaned] = cleaned # Make sure the user hasn't asked us to download ALL the scans and then asked # for them to be constrained to a type. if len(types) > 1 and 'ALL' in types: raise ValueError('The \"ALL\" scan type constraint cannot be used with any other constraint') (p,s,e) = pse # Make the name of the zip file default_zip_name = lambda: '%s_%s_%s_%s_%s' % ( p, s, e, class_name(instance).lower(), '_'.join(types.values())) zip_name = name if name != None else default_zip_name() zip_location = os.path.join(dest_dir, zip_name + '.zip') if safe: if os.path.exists(zip_location): raise EnvironmentError("Unable to download to " + zip_location + " because this file already exists.") # Download from the server instance._intf._http.cache.preset(zip_location) instance._intf._exec(uriutil.join_uri( instance._cbase,','.join(types.values())) + '/files?format=zip') # Extract the archive fzip = zipfile.ZipFile(zip_location,'r') if extract: check = {'run': lambda f, d: not os.path.exists(os.path.join(dest_dir,f)), 'desc': 'File does not exist in the parent directory'} safeUnzip = lambda: unzip(fzip, dest_dir, check) if safe else lambda:unzip(fzip,dest_dir) (unzipped, paths) = safeUnzip()() if not unzipped: fzip.close() raise EnvironmentError("Unable to extract " + zip_location + " because file " + paths + " failed the following test: " + check['desc']) else: return paths else: fzip.close() return zip_location pyxnat-0.9.0~dev0/pyxnat/core/errors.py000066400000000000000000000055351163242155400201740ustar00rootroot00000000000000import re import httplib2 # parsing functions def is_xnat_error(message): return message.startswith('') def parse_error_message(message): if message.startswith(''): error = message.split('

')[1].split('

')[0] elif message.startswith('')[1].split('')[0]: error = message.split('')[1].split('')[0] else: error = message.split('

')[1].split('

')[0] else: error = message return error def parse_put_error_message(message): if message.startswith(''): error = message.split('

')[1].split('

')[0] required_fields = [] for line in error.split('\n'): try: datatype_name = re.findall("\'.*?\'",line)[0].strip('\'') element_name = re.findall("\'.*?\'",line )[1].rsplit(':', 1)[1].strip('}\'') required_fields.append((datatype_name, element_name)) except: continue return required_fields def catch_error(msg_or_exception): # handle errors returned by the xnat server if isinstance(msg_or_exception, (str, unicode)): # parse the message msg = msg_or_exception if msg.startswith(''): error = msg.split('

')[1].split('

')[0] elif msg.startswith('')[1].split('')[0]: error = msg.split('')[1].split('')[0] else: error = msg.split('

')[1].split('

')[0] else: error = msg # choose the exception if error == 'The request requires user authentication': raise OperationalError('Authentication failed') elif 'Not Found' in error: raise OperationalError('Connection failed') else: raise DatabaseError(error) # handle other errors, raised for instance by the http layer else: if isinstance(msg_or_exception, httplib2.ServerNotFoundError): raise OperationalError('Connection failed') else: raise DatabaseError(str(msg_or_exception)) # Exceptions as defined in PEP-249, the module treats errors using thoses # classes following as closely as possible the original definitions. class Warning(StandardError): pass class Error(StandardError): pass class InterfaceError(Error): pass class DatabaseError(Error): pass class DataError(DatabaseError): pass class OperationalError(DatabaseError): pass class IntegrityError(DatabaseError): pass class InternalError(DatabaseError): pass class ProgrammingError(DatabaseError): pass class NotSupportedError(DatabaseError): pass pyxnat-0.9.0~dev0/pyxnat/core/help.py000066400000000000000000000536131163242155400176100ustar00rootroot00000000000000import glob try: import networkx as nx import matplotlib.pyplot as plt _DRAW_GRAPHS = True except: _DRAW_GRAPHS = False import json from . import schema from .jsonutil import get_column from .search import Search from .uriutil import check_entry class Inspector(object): """ Database introspection interface. """ def __init__(self, interface): """ Parameters ---------- interface: :class:`Interface` Object """ self._intf = interface self._get_json = interface._get_json self._auto = True self._tick = 30 self.schemas = SchemasInspector(interface) def __call__(self): for name in ['experiment', 'assessor', 'scan', 'reconstruction']: self._resource_struct(name) def set_autolearn(self, auto=None, tick=None): """ Once in a while queries will persist additional information on the server. This information is available through the following methods of this class: - experiment_types - assessor_types - scan_types - reconstruction_types It is also transparently used in insert operations. Parameters ---------- auto: boolean True to enable auto learn. False to disable. tick: int Every 'tick' seconds, if a query is issued, additional information will be persisted. See Also -------- EObject.insert() """ if auto is not None: self._auto = auto if tick is not None: self._tick = tick def datatypes(self, pattern='*', fields_pattern=None): """ Discovers the datatypes and datafields of the database. Parameters ---------- pattern: string Pattern for the datatype. May include wildcards. fields_pattern: string - Pattern for the datafields -- may include wildcards. - If specified, datafields will be returned instead of datatypes. Returns ------- list : datatypes or datafields depending on the argument usage. """ self._intf._get_entry_point() search_els = self._get_json('%s/search/elements?format=json' % self._intf._entry) if not fields_pattern and ('*' in pattern or '?' in pattern): return get_column(search_els , 'ELEMENT_NAME', pattern) else: fields = [] for datatype in get_column(search_els , 'ELEMENT_NAME', pattern): fields.extend(self._datafields(datatype, fields_pattern or '*', True) ) return fields def _datafields(self, datatype, pattern='*', prepend_type=True): self._intf._get_entry_point() search_fds = self._get_json('%s/search/elements/%s?format=json' % (self._intf._entry, datatype) ) fields = get_column(search_fds, 'FIELD_ID', pattern) return ['%s/%s' % (datatype, field) if prepend_type else field for field in fields if '=' not in field and 'SHARINGSHAREPROJECT' not in field ] def experiment_types(self): """ Returns the datatypes used at the experiment level in this database. See Also -------- Inspector.set_autolearn() """ return self._resource_types('experiment') def assessor_types(self): """ Returns the datatypes used at the assessor level in this database. See Also -------- Inspector.set_autolearn() """ return self._resource_types('assessor') def reconstruction_types(self): """ Returns the datatypes used at the reconstruction level in this database. See Also -------- Inspector.set_autolearn() """ return self._resource_types('reconstruction') def scan_types(self): """ Returns the datatypes used at the scan level in this database. See Also -------- Inspector.set_autolearn() """ return self._resource_types('scan') def field_values(self, field_name): """ Look for the values a specific datafield takes in the database. """ self._intf._get_entry_point() search_tbl = Search(field_name.split('/')[0], [field_name], self._intf ) criteria = [('%s/ID' % field_name.split('/')[0], 'LIKE', '%'), 'AND'] return list(set([val for entry in search_tbl.where(criteria) for val in entry.values() ]) ) def project_values(self): """ Look for the values a the project level in the database. .. note:: Is equivalent to interface.select.projects().get() """ self._intf._get_entry_point() return get_column(self._get_json( '%s/projects' % self._intf._entry), 'ID') def subject_values(self, project=None): """ Look for the values a the subject level in the database. .. note:: Is equivalent to interface.select('//subjects').get() """ self._intf._get_entry_point() uri = '%s/subjects?columns=ID' % self._intf._entry if project is not None: uri += '&project=%s' % project return get_column(self._get_json(uri), 'ID') def experiment_values(self, datatype, project=None): """ Look for the values a the experiment level for a given datatype in the database. .. note:: The datatype should be one of Inspector.experiment_types() Parameters ---------- datatype: string An experiment type. project: string Optional. Restrict operation to a project. project: string Optional. Restrict operation to a project. """ self._intf._get_entry_point() uri = '%s/experiments?columns=ID' % self._intf._entry if datatype is not None: uri += '&xsiType=%s' % datatype if project is not None: uri += '&project=%s' % project return get_column(self._get_json(uri), 'ID') def assessor_values(self, experiment_type, project=None): """ Look for the values at the assessor level for a given experiment type in the database. .. note:: The experiment type should be one of Inspector.experiment_types() .. warning:: Depending on the number of elements the operation may take a while. Parameters ---------- datatype: string An experiment type. project: string Optional. Restrict operation to a project. """ return self._sub_experiment_values('assessor', project, experiment_type) def scan_values(self, experiment_type, project=None): """ Look for the values at the scan level for a given experiment type in the database. .. note:: The experiment type should be one of Inspector.experiment_types() .. warning:: Depending on the number of elements the operation may take a while. Parameters ---------- datatype: string An experiment type. project: string Optional. Restrict operation to a project. """ return self._sub_experiment_values('scan', project, experiment_type) def reconstruction_values(self, experiment_type, project=None): """ Look for the values at the reconstruction level for a given experiment type in the database. .. note:: The experiment type should be one of Inspector.experiment_types() .. warning:: Depending on the number of elements the operation may take a while. Parameters ---------- datatype: string An experiment type. project: string Optional. Restrict operation to a project. """ return self._sub_experiment_values('reconstruction', project, experiment_type) def structure(self): """ Displays the keywords structure used in XNAT REST API. """ def traverse(coll, lvl): for key in schema.resources_tree[coll]: print '%s+%s' % (' ' * lvl, key.upper()) datatypes = set([ self._intf._struct[uri] for uri in self._intf._struct.keys() if uri.split('/')[-2] == key ]) if datatypes != set(): print '%s %s' % (' ' * lvl, '-' * len(key)) for datatype in datatypes: print '%s- %s' % (' ' * lvl, datatype) if schema.resources_tree.has_key(key): traverse(key, lvl + 4) print '- %s' % 'PROJECTS' traverse('projects', 4) def _sub_experiment_values(self, sub_exp, project, experiment_type): self._intf._get_entry_point() values = [] column = '%s/%ss/%s/id' % \ (experiment_type.lower(), sub_exp, sub_exp) sub_exps = '%s/experiments?columns=ID,%s' % (self._intf._entry, column ) if project is not None: sub_exps += '&project=%s' % project values = get_column(self._get_json(sub_exps), column) return list(set(values)) def _resource_struct(self, name): kbase = {} for kfile in glob.iglob('%s/*.struct' % self._intf._cachedir): kdata = json.load(open(kfile, 'rb')) if kdata == {}: continue if name in kdata.keys()[0]: kbase.update(kdata) self._intf._struct.update(kbase) return kbase def _resource_types(self, name): return list(set(self._resource_struct(name).values())) class GraphData(object): def __init__(self, interface): self._intf = interface self._struct = interface._struct # def link(self, subjects, fields): # criteria = [('xnat:subjectData/SUBJECT_ID', '=', _id) # for _id in subjects # ] # criteria += ['OR'] # # variables = ['xnat:subjectData/SUBJECT_ID'] + fields # subject_id = 'xnat:subjectData/SUBJECT_ID' # for field in fields: # field_tbl = self._intf.select('xnat:subjectData', # [subject_id, field] # ).where(criteria) # head = field_tbl.headers() # head.remove('subject_id') # head = head[0] # possible = set(field_tbl.get(head)) # groups = {} # for val in possible: # groups[val] = field_tbl.where(**{head:val} # ).select('subject_id') # return groups def datatypes(self, pattern='*'): graph = nx.DiGraph() graph.add_node('datatypes') graph.labels = {'datatypes':'datatypes'} graph.weights = {'datatypes':100.0} datatypes = self._intf.inspect.datatypes(pattern) namespaces = set([dat.split(':')[0] for dat in datatypes]) for ns in namespaces: graph.add_edge('datatypes', ns) graph.weights[ns] = 70.0 for dat in datatypes: if dat.startswith(ns): graph.add_edge(ns, dat) graph.weights[dat] = 40.0 return graph def rest_resource(self, name): resource_types = self._intf.inspect._resource_types(name) graph = nx.DiGraph() graph.add_node(name) graph.labels = {name:name} graph.weights = {name:100.0} namespaces = set([exp.split(':')[0] for exp in resource_types]) for ns in namespaces: graph.add_edge(name, ns) graph.weights[ns] = 70.0 for exp in resource_types: if exp.startswith(ns): graph.add_edge(ns, exp) graph.weights[exp] = 40.0 return graph def field_values(self, field_name): search_tbl = Search(field_name.split('/')[0], [field_name], self._intf ) criteria = [('%s/ID' % field_name.split('/')[0], 'LIKE', '%'), 'AND'] dist = {} for entry in search_tbl.where(criteria): for val in entry.values(): dist.setdefault(val, 1.0) dist[val] += 1 graph = nx.Graph() graph.add_node(field_name) graph.weights = dist graph.weights[field_name] = 100.0 for val in dist.keys(): graph.add_edge(field_name, val) return graph def architecture(self, with_datatypes=True): graph = nx.DiGraph() graph.add_node('projects') graph.labels = {'projects':'projects'} graph.weights = {'projects':100.0} def traverse(lkw, as_lkw): for key in schema.resources_tree[lkw]: as_key = '%s_%s' % (as_lkw, key) weight = (1 - len(as_key*2)/100.0) * 100 graph.add_edge(as_lkw, as_key) graph.labels[as_key] = key graph.weights[as_key] = weight if with_datatypes: for uri in self._struct.keys(): if uri.split('/')[-2] == key: datatype = self._struct[uri] graph.add_edge(as_key, datatype) graph.weights[datatype] = 10 graph.labels[datatype] = datatype traverse(key, as_key) traverse('projects', 'projects') return graph class PaintGraph(object): def __init__(self, interface): self._intf = interface self.get_graph = interface._get_graph def architecture(self, with_datatypes=True, save=None): graph = self.get_graph.architecture(with_datatypes) plt.figure(figsize=(8,8)) pos = nx.graphviz_layout(graph, prog='twopi', args='') # node_size = [(float(graph.degree(v)) * 5)**3 for v in graph] # node_size = [graph.weights[v] ** 2 for v in graph] # node_color = [float(graph.degree(v)) for v in graph] # node_color = [graph.weights[v] ** 2 for v in graph] cost = lambda v: float(graph.degree(v)) ** 3 + \ graph.weights[v] ** 2 costs = norm_costs([cost(v) for v in graph], 10000) nx.draw(graph, pos, labels=graph.labels, node_size=costs, node_color=costs, font_size=13, font_color='orange', font_weight='bold' ) plt.axis('off') if save is not None: plt.savefig(save) plt.show() def experiments(self, save=None): graph = self.get_graph.rest_resource('experiments') self._draw_rest_resource(graph, save=None) def assessors(self, save=None): graph = self.get_graph.rest_resource('assessors') self._draw_rest_resource(graph, save=None) def reconstructions(self, save=None): graph = self.get_graph.rest_resource('reconstructions') self._draw_rest_resource(graph, save=None) def scans(self): graph = self.get_graph.rest_resource('scans') self._draw_rest_resource(graph) def _draw_rest_resource(self, graph, save=None): plt.figure(figsize=(8,8)) pos = nx.graphviz_layout(graph, prog='twopi', args='') cost = lambda v: float(graph.degree(v)) ** 3 + \ graph.weights[v] ** 2 node_size = [cost(v) for v in graph] # node_size = [graph.weights[v] ** 2 for v in graph] # node_color = [float(graph.degree(v)) for v in graph] node_color = [cost(v) for v in graph] nx.draw(graph, pos, node_size=node_size, node_color=node_color, font_size=13, font_color='green', font_weight='bold' ) plt.axis('off') if save is not None: plt.savefig(save) plt.show() def datatypes(self, pattern='*', save=None): graph = self.get_graph.datatypes(pattern) plt.figure(figsize=(8,8)) pos = nx.graphviz_layout(graph, prog='twopi', args='') cost = lambda v: float(graph.degree(v)) ** 3 + \ graph.weights[v] ** 2 node_size = [cost(v) for v in graph] # node_size = [graph.weights[v] ** 2 for v in graph] # node_color = [float(graph.degree(v)) for v in graph] node_color = [cost(v) for v in graph] nx.draw(graph, pos, node_size=node_size, node_color=node_color, font_size=13, font_color='green', font_weight='bold' ) plt.axis('off') if save is not None: plt.savefig(save) plt.show() def field_values(self, field_name, save=None): graph = self.get_graph.field_values(field_name) plt.figure(figsize=(8,8)) pos = nx.graphviz_layout(graph, prog='twopi', args='') cost = lambda v: graph.weights[v] graph.weights[field_name] = max([cost(v) for v in graph]) / 2.0 costs = norm_costs([cost(v) for v in graph], 10000) nx.draw(graph, pos, node_size=costs, node_color=costs, font_size=13, font_color='black', font_weight='bold' ) plt.axis('off') if save is not None: plt.savefig(save) plt.show() def norm_costs(costs, norm=1000): max_cost = max(costs) return [ (cost / max_cost) * norm for cost in costs] # class GraphDrawer(object): # def __init__(self, interface): # self._intf = interface # def datatypes(self, project): # self._intf.connection.set_strategy('offline') # experiments_types = self._intf.inspect.datatypes.experiments(project) # labels = {project:project, 'Experiments':'Experiments'} # g = nx.Graph() # g.add_edge(project, 'Experiments', {'weight':1}) # for exp_type in experiments_types: # g.add_edge('Experiments', exp_type, {'weight':8}) # labels[exp_type] = exp_type # pos = nx.graphviz_layout(g, prog='twopi', args='') # nx.draw_networkx_nodes(g, pos, # nodelist=[project], # node_color='green', alpha=0.7, # node_size=2500, node_shape='s') # nx.draw_networkx_nodes(g, pos, # nodelist=['Experiments'], # node_color='blue', alpha=0.7, # node_size=2000, node_shape='p') # nx.draw_networkx_nodes(g, pos, # nodelist=experiments_types, # node_color='red', alpha=0.7, # node_size=1500, node_shape='o') # nx.draw_networkx_edges(g, pos, width=2, alpha=0.5, # edge_color='black') # nx.draw_networkx_labels(g, pos, labels, # alpha=0.9, font_size=8, # font_color='black', font_weight='bold') # plt.axis('off') # plt.show() # self._intf.connection.revert_strategy() class SchemasInspector(object): def __init__(self, interface): self._intf = interface def __call__(self): self._intf.manage.schemas._init() for xsd in self._intf.manage.schemas(): print '-'*40 print xsd.upper() print '-'*40 print for datatype in schema.datatypes( self._intf.manage.schemas._trees[xsd]): print '[%s]'%datatype print for path in schema.datatype_attributes( self._intf.manage.schemas._trees[xsd], datatype): print path print def look_for(self, element_name, datatype_name=None): paths = [] self._intf.manage.schemas._init() if ':' in element_name: for root in self._intf.manage.schemas._trees.values(): paths.extend(schema.datatype_attributes(root, element_name)) return paths for xsd in self._intf.manage.schemas(): # nsmap = self._intf.manage.schemas._trees[xsd].nsmap if datatype_name is not None: datatypes = [datatype_name] else: datatypes = schema.datatypes( self._intf.manage.schemas._trees[xsd] ) for datatype in datatypes: for path in schema.datatype_attributes( self._intf.manage.schemas._trees[xsd], datatype): if element_name in path: paths.append(path) return paths pyxnat-0.9.0~dev0/pyxnat/core/httputil.py000066400000000000000000000011001163242155400205150ustar00rootroot00000000000000 _boundary = '----------ThIs_Is_tHe_bouNdaRY_$' _crlf = '\r\n' def file_message(content, content_type, path, name): body = [] body.append('--' + _boundary) body.append('Content-Disposition: form-data; ' 'name="%s"; filename="%s"' % (path, name) ) body.append('Content-Type: %s' % content_type) body.append('') body.append(content) body.append('--' + _boundary + '--') body.append('') body = _crlf.join(body) content_type = 'multipart/form-data; boundary=%s' % _boundary return body, content_type pyxnat-0.9.0~dev0/pyxnat/core/interfaces.py000066400000000000000000000335431163242155400210030ustar00rootroot00000000000000import os import time import tempfile import email import getpass import httplib2 import json from .select import Select from .cache import CacheManager, HTCache from .help import Inspector, GraphData, PaintGraph, _DRAW_GRAPHS from .manage import GlobalManager from .uriutil import join_uri from .jsonutil import csv_to_json from .errors import is_xnat_error from .errors import catch_error from .array import ArrayData from .xpath_store import XpathStore from . import xpass DEBUG = False # main entry point class Interface(object): """ Main entry point to access a XNAT server. >>> central = Interface(server='http://central.xnat.org:8080', user='login', password='pwd', cachedir='/tmp' ) Or with config file: >>> central = Interface(config='/home/me/.xnat.cfg') Or for interactive use: >>> central = Interface('http://central.xnat.org') .. note:: The interactive mode is activated whenever an argument within server, user or password is missing. In interactive mode pyxnat tries to check the validity of the connection parameters. Attributes ---------- _mode: online | offline Online or offline mode _memtimeout: float Lifespan of in-memory cache """ def __init__(self, server=None, user=None, password=None, cachedir=tempfile.gettempdir(), config=None): """ Parameters ---------- server: string | None The server full URL (including port and XNAT instance name if necessary) e.g. http://central.xnat.org, http://localhost:8080/xnat_db Or a path to an existing config file. In that case the other parameters (user etc..) are ignored if given. If None the user will be prompted for it. user: string | None A valid login registered through the XNAT web interface. If None the user will be prompted for it. password: string | None The user's password. If None the user will be prompted for it. cachedir: string Path of the cache directory (for all queries and downloaded files) If no path is provided, a platform dependent temp dir is used. v config: string Reads a config file in json to get the connection parameters. If a config file is specified, it will be used regardless of other parameters that might have been given. """ self._interactive = False if not all([server, user, password]) and not config: self._interactive = True if all(arg is None for arg in [server, user, password, config]): connection_args = xpass.read_xnat_pass(xpass.path()) if connection_args is None: raise Exception('XNAT configuration file not found ' 'or formated incorrectly.') self._server = connection_args['host'] self._user = connection_args['u'] self._pwd = connection_args['p'] self._cachedir = os.path.join( cachedir, '%s@%s' % ( self._user, self._server.split('//')[1].replace( '/', '.').replace(':', '_') ) ) elif config is not None: self.load_config(config) else: if server is None: self._server = raw_input('Server: ') else: self._server = server if user is None: user = raw_input('User: ') if password is None: password = getpass.getpass() self._user = user self._pwd = password self._cachedir = os.path.join( cachedir, '%s@%s' % ( self._user, self._server.split('//')[1].replace( '/', '.').replace(':', '_') ) ) self._callback = None self._memcache = {} self._memtimeout = 1.0 self._mode = 'online' self._struct = {} self._entry = None self._last_memtimeout = 1.0 self._last_mode = 'online' self._jsession = 'authentication_by_credentials' self._connect_extras = {} self._connect() self.inspect = Inspector(self) self.select = Select(self) self.array = ArrayData(self) self.cache = CacheManager(self) self.manage = GlobalManager(self) self.xpath = XpathStore(self) if _DRAW_GRAPHS: self._get_graph = GraphData(self) self.draw = PaintGraph(self) if self._interactive: self._get_entry_point() self.inspect() def _get_entry_point(self): if self._entry is None: # /REST for XNAT 1.4, /data if >=1.5 self._entry = '/REST' try: self._jsession = self._exec('/data/JSESSION') self._entry = '/data' if is_xnat_error(self._jsession): catch_error(self._jsession) except Exception, e: if not '/data/JSESSION' in e.message: raise e return self._entry def _connect(self, **kwargs): """ Sets up the connection with the XNAT server. Parameters ---------- kwargs: dict Can be used to pass additional arguments to the Http constructor. See the httplib2 documentation for details. http://code.google.com/p/httplib2/ """ if kwargs != {}: self._connect_extras = kwargs else: kwargs = self._connect_extras kwargs['disable_ssl_certificate_validation'] = True if DEBUG: httplib2.debuglevel = 2 self._http = httplib2.Http(HTCache(self._cachedir, self), **kwargs) self._http.add_credentials(self._user, self._pwd) def _exec(self, uri, method='GET', body=None, headers=None): """ A wrapper around a simple httplib2.request call that: - avoids repeating the server url in the request - deals with custom caching mechanisms - manages a user session with cookies - catches and broadcast specific XNAT errors Parameters ---------- uri: string URI of the resource to be accessed. e.g. /REST/projects method: GET | PUT | POST | DELETE HTTP method. body: string HTTP message body headers: dict Additional headers for the HTTP request. """ if headers is None: headers = {} self._get_entry_point() uri = join_uri(self._server, uri) if DEBUG: print uri # using session authentication headers['cookie'] = self._jsession headers['connection'] = 'keep-alive' # reset the memcache when client changes something on the server if method in ['PUT', 'DELETE']: self._memcache = {} if self._mode == 'online' and method == 'GET': if time.time() - self._memcache.get(uri, 0) < self._memtimeout: if DEBUG: print 'send: GET CACHE %s' % uri info, content = self._http.cache.get(uri ).split('\r\n\r\n', 1) self._memcache[uri] = time.time() response = None else: response, content = self._http.request(uri, method, body, headers) self._memcache[uri] = time.time() elif self._mode == 'offline' and method == 'GET': cached_value = self._http.cache.get(uri) if cached_value is not None: if DEBUG: print 'send: GET CACHE %s' % uri info, content = cached_value.split('\r\n\r\n', 1) response = None else: try: self._http.timeout = 10 response, content = self._http.request(uri, method, body, headers) self._http.timeout = None self._memcache[uri] = time.time() except Exception, e: catch_error(e) else: response, content = self._http.request(uri, method, body, headers) if DEBUG: if response is None: response = httplib2.Response(email.message_from_string(info)) print 'reply: %s %s from cache' % (response.status, response.reason ) for key in response.keys(): print 'header: %s: %s' % (key.title(), response.get(key)) if response is not None and response.has_key('set-cookie'): self._jsession = response.get('set-cookie')[:44] if response is not None and response.get('status') == '404': r,_ = self._http.request(self._server) if self._server.rstrip('/') != r.get('content-location', self._server).rstrip('/'): old_server = self._server self._server = r.get('content-location').rstrip('/') return self._exec(uri.replace(old_server, ''), method, body) else: raise httplib2.HttpLib2Error('%s %s %s' % (uri, response.status, response.reason ) ) if is_xnat_error(content): catch_error(content) return content def _get_json(self, uri): """ Specific Interface._exec method to retrieve data. It forces the data format to csv and then puts it back to a json-like format. Parameters ---------- uri: string URI of the resource to be accessed. e.g. /REST/projects Returns ------- List of dicts containing the results """ if 'format=json' in uri: uri = uri.replace('format=json', 'format=csv') else: if '?' in uri: uri += '&format=csv' else: uri += '?format=csv' content = self._exec(uri, 'GET') if is_xnat_error(content): catch_error(content) return csv_to_json(content) def _get_head(self, uri): if DEBUG: print 'GET HEAD' _nocache = httplib2.Http() _nocache.add_credentials(self._user, self._pwd) rheaders = {'cookie':self._jsession} try: head = _nocache.request( '%s%s' % (self._server, uri), 'HEAD', headers=rheaders)[0] except: time.sleep(1) head = _nocache.request( '%s%s' % (self._server, uri), 'HEAD', headers=rheaders)[0] info = email.Message.Message() for key, value in head.iteritems(): if key == 'content-disposition': info['content-location'] = '%s%s' % (self._server, uri) if key not in ['set-cookie']: info[key] = value return info def save_config(self, location): """ Saves current configuration - including password - in a file. .. warning:: Since the password is saved as well, make sure the file is saved at a safe location with appropriate permissions. Parameters ---------- location: string Destination config file. """ if not os.path.exists(os.path.dirname(location)): os.makedirs(os.path.dirname(location)) fp = open(location, 'w') config = {'server':self._server, 'user':self._user, 'password':self._pwd, 'cachedir':os.path.split(self._cachedir)[0], } json.dump(config, fp) fp.close() def load_config(self, location): """ Loads a configuration file and replaces current connection parameters. Parameters ---------- location: string Configuration file path. """ if os.path.exists(location): fp = open(location, 'rb') config = json.load(fp) fp.close() self._server = str(config['server']) self._user = str(config['user']) self._pwd = str(config['password']) self._cachedir = str(config['cachedir']) self._cachedir = os.path.join( self._cachedir, '%s@%s' % ( self._user, self._server.split('//')[1].replace( '/', '.').replace(':', '_') ) ) else: raise Exception('Configuration file does not exists.') def version(self): return self._exec('/data/version') def set_logging(self, level=0): pass pyxnat-0.9.0~dev0/pyxnat/core/jsonutil.py000066400000000000000000000224341163242155400205240ustar00rootroot00000000000000import csv import copy from fnmatch import fnmatch from StringIO import StringIO import json # jdata is a list of dicts def join_tables(join_column, jdata, *jtables): indexes = [] for jtable in [jdata]+list(jtables): if isinstance(jtable, dict): jtable = [jtable] index = {} [index.setdefault(entry[join_column], entry) for entry in jtable] indexes.append(index) merged_jdata = [] for join_id in indexes[0].keys(): for index in indexes[1:]: indexes[0][join_id].update(index[join_id]) merged_jdata.append(indexes[0][join_id]) return merged_jdata def get_column(jdata, col, val_pattern='*'): if isinstance(jdata, dict): jdata = [jdata] if val_pattern == '*': return [entry[col] for entry in jdata if entry.has_key(col)] else: return [entry[col] for entry in jdata if fnmatch(entry.get(col), val_pattern) ] def get_where(jdata, *args, **kwargs): if isinstance(jdata, dict): jdata = [jdata] match = [] for entry in jdata: match_args = all([arg in entry.keys() or arg in entry.values() for arg in args ]) match_kwargs = all([entry[key] == kwargs[key] for key in kwargs.keys() ]) if match_args and match_kwargs: match.append(entry) return match def get_where_not(jdata, *args, **kwargs): if isinstance(jdata, dict): jdata = [jdata] match = [] for entry in jdata: match_args = all([arg in entry.keys() or arg in entry.values() for arg in args ]) match_kwargs = all([entry[key] == kwargs[key] for key in kwargs.keys() ]) if not match_args and not match_kwargs: match.append(entry) return match def get_headers(jdata): if isinstance(jdata, dict): jdata = [jdata] return [] if jdata == [] else jdata[0].keys() def get_selection(jdata, columns): if isinstance(jdata, dict): jdata = [jdata] sub_table = copy.deepcopy(jdata) rmcols = set(get_headers(jdata)).difference(columns) for entry in sub_table: for col in rmcols: if entry.has_key(col): del entry[col] return sub_table def csv_to_json(csv_str): csv_reader = csv.reader(StringIO(csv_str), delimiter=',', quotechar='"') headers = csv_reader.next() return [dict(zip(headers, entry)) for entry in csv_reader] class JsonTable(object): """ Wrapper around a list of dictionnaries to provide utility functions. """ def __init__(self, jdata, order_by=[]): self.data = jdata self.order_by = order_by def __repr__(self): # if len(self.data) == 0: # return '[]' # elif len(self.data) == 1: # return str(self.data[0]) if len(self.headers()) <= 5: _headers = ','.join(self.headers()) else: _headers = '%s ... %s' % (','.join(self.headers()[:2]), ','.join(self.headers()[-2:]) ) return ' %s' % ( len(self), len(self.headers()), _headers ) # return ('[%s\n .\n .\n . \n%s]\n\n' # '------------\n' # '%s rows\n' # '%s columns\n' # '%s characters') % (str(self.data[0]), # str(self.data[-1]), # len(self), # len(self.headers()), # len(self.dumps_csv()) # ) def __str__(self): return self.dumps_csv() def __len__(self): return len(self.data) def __iter__(self): return iter(self.data) def __getitem__(self, name): if isinstance(name, (str, unicode)): return self.get(name) elif isinstance(name, int): return self.__class__([self.data[name]], self.order_by) elif isinstance(name, list): return self.select(name) def __getslice__(self, i, j): return self.__class__(self.data[i:j], self.order_by) def join(self, join_column, *jtables): """ Join jsontables with a common column. Parameters ---------- join_column: string The name or header of the join column. jtables: *args Other jtables. """ return self.__class__( join_tables(join_column, self.data, *[jtable.data for jtable in jtables]), self.order_by ) def has_header(self, name): return name in self.headers() def headers(self): """ Returns the headers of the object. """ return get_headers(self.data) def get(self, col, val_pattern='*', always_list=False): """ Gets a single column value. Parameters ---------- col: string The column name val_pattern: string Enable a filter on the values to be returned. always_list: boolean If only a single value is to be returned - i.e. there is only on element in the list of dicts or there is only one match against the value filter - is can be returned within a list (with True) or not (default). """ res = get_column(self.data, col, val_pattern) if always_list: return res if len(self.data) == 1: return res[0] return res def where(self, *args, **kwargs): """ Filters the object. Paramaters ---------- args: Value must be matched in the key or the value of an entry. kwargs: Value for a specific key must be matched in an entry. Returns ------- A :class:`JsonTable` containing the matches. """ return self.__class__(get_where(self.data, *args, **kwargs), self.order_by ) def where_not(self, *args, **kwargs): """ Filters the object. Conditions must not be matched. Paramaters ---------- args: Value must not be matched in the key or the value of an entry. kwargs: Value for a specific key must not be matched in an entry. Returns ------- A :class:`JsonTable` containing the not matches. """ return self.__class__(get_where_not(self.data, *args, **kwargs), self.order_by ) def select(self, columns): """ Select only some columns of interest. Returns ------- A :class:`JsonTable` with the selected columns. """ return self.__class__(get_selection(self.data, columns), self.order_by ) def dump_csv(self, dest, delimiter=','): """ Dumps the object content in a csv file format. Parameters ---------- dest: string Destination file path. delimiter: char Character to separate values in the csv file. """ fd = open(dest, 'w') fd.write(self.dumps_csv(delimiter)) fd.close() def dumps_csv(self, delimiter=','): str_buffer = StringIO() csv_writer = csv.writer(str_buffer, delimiter=delimiter, quotechar='"', quoting=csv.QUOTE_MINIMAL) for entry in self.as_list(): csv_writer.writerow(entry) return str_buffer.getvalue() def dump_json(self, dest): fd = open(dest, 'w') fd.write(self.dumps_json()) fd.close() def dumps_json(self): return json.dumps(self.data) def as_list(self): table = [[]] for header in self.order_by: if header in self.headers(): table[0].append(header) for header in self.headers(): if header not in self.order_by: table[0].append(header) for entry in self.data: row = [] for header in self.order_by: if entry.has_key(header): row.append(entry.get(header)) for header in self.headers(): if header not in self.order_by: row.append(entry.get(header)) table.append(row) return table def items(self): table = [] for entry in self.data: row = () for header in self.order_by: if entry.has_key(header): row += (entry.get(header), ) for header in self.headers(): if header not in self.order_by: row += (entry.get(header), ) table.append(row) return table pyxnat-0.9.0~dev0/pyxnat/core/manage.py000066400000000000000000000262361163242155400201110ustar00rootroot00000000000000import re import glob import urllib from lxml import etree from .search import SearchManager from .users import Users from .resources import Project from .tags import Tags from .uriutil import join_uri, check_entry from .jsonutil import JsonTable from . import httputil class GlobalManager(object): """ Mainly a container class to provide a clean interface for all management classes. """ def __init__(self, interface): self._intf = interface self.search = SearchManager(self._intf) self.users = Users(self._intf) self.tags = Tags(self._intf) self.schemas = SchemaManager(self._intf) self.prearchive = PreArchive(self._intf) def register_callback(self, func): """ Defines a callback to execute when collections of resources are accessed. Parameters ---------- func: callable A callable that takes the current collection object as first argument and the current element object as second argument. Examples -------- >>> def notify(cobj, eobj): >>> print eobj._uri >>> interface.manage.register_callback(notify) """ self._intf._callback = func def unregister_callback(self): """ Unregisters the callback. """ self._intf._callback = None def project(self, project_id): """ Returns a project manager. """ return ProjectManager(project_id, self._intf) class ProjectManager(object): """ Management interface for projects. This functionalities are also available through `Project` objects. """ def __init__(self, project_id, interface): self._intf._get_entry_point() self._intf = interface project = Project('%s/projects/%s' % (self._intf._entry, project_id ), self._intf ) self.prearchive_code = project.prearchive_code self.set_prearchive_code = project.set_prearchive_code self.quarantine_code = project.quarantine_code self.set_quarantine_code = project.set_quarantine_code self.current_arc = project.current_arc self.set_subfolder_in_current_arc = \ project.set_subfolder_in_current_arc self.accessibility = project.accessibility self.users = project.users self.owners = project.owners self.members = project.members self.collaborators = project.collaborators self.user_role = project.user_role self.add_user = project.add_user self.remove_user = project.remove_user class SchemaManager(object): """ Management interface for XNAT schemas. The aim is to provide a minimal set of functionalities to parse and look at XNAT schemas. """ def __init__(self, interface): self._intf = interface self._trees = {} def _init(self): if self._trees == {}: cache_template = '%s/*.xsd.headers' % self._intf._cachedir for entry in glob.iglob(cache_template): hfp = open(entry, 'rb') content = hfp.read() hfp.close() url = re.findall('(?<=content-location:\s%s)' '.*?(?=\r{0,1}\n)' % self._intf._server, content)[0] self._trees[url.split('/')[-1]] = \ etree.fromstring(self._intf._exec(url)) def __call__(self): self._init() return self._trees.keys() def add(self, url): """ Loads an additional schema. Parameters ---------- url: str url of the schema relative to the server. e.g. for http://central.xnat.org/schemas/xnat/xnat.xsd give ``schemas/xnat/xnat.xsd`` or even only ``xnat.xsd`` """ self._init() if not re.match('/?schemas/.*/.*\.xsd', url): if not 'schemas' in url and re.match('/?\w+/\w+[.]xsd', url): url = join_uri('/schemas', url) elif not re.match('^[^/].xsd', url): url = '/schemas/%s/%s'%(url.split('.xsd')[0], url) else: raise NotImplementedError self._trees[url.split('/')[-1]] = \ etree.fromstring(self._intf._exec(url)) def remove(self, name): """ Removes a schema. """ if self._trees.has_key(name): del self._trees[name] """ Fields Of the Prearchive ------------------------ Each session in the prearchive has the following fields: "project" - The name of the project. "Unassigned" if the session is unassigned. "timestamp" - The time (down to millisecond) that this session was received by XNAT. "20110603_124835868" for example. "lastmod" - The time this session as last modified. Moving, resetting etc. updates this time "uploaded" - The time this session was uploaded to XNAT. Usually the same as "timestamp" "scan_date" - The date this session was scanned. "scan_time" - The time this session was scanned. "subject" - The name of the subject "folderName" - The id of this session. Corresponds to XNAT's session id, "name" - The name of this session. Corresponds to XNAT's session label. "tag" - This session's unique DICOM identifier. Usually the SOP instance UID. "status" - The current status of this session "url" - The unique uri of this session. "autoarchive" - Whether this session should be auto-archived. For more in-depth information about the prearchive see: http://docs.xnat.org/Using+the+Prearchive#XNAT%201.5:%20Managing%20Data%20with%20the%20Prearchive-Operations-Session%20Status Uniquely identifying a session ------------------------------ Every session in the prearchive uniquely is identified by "project", "timestamp" and "folderName". (13/7/2011) - Each session could have been uniquely identified by the "url" field or the "tag" field. These are arguably more elegant identifiers but for now the "project", "timestamp", "folderName" triple is used. """ class PreArchive(object): def __init__(self, interface): self._intf = interface """ Retrieve the status of a session Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. """ def status(self, triple): return JsonTable( self._intf._get_json('/data/prearchive/projects') ).where( project=triple[0], timestamp=triple[1], folderName=triple[2] ).get('status') """ Retrieve the contents of the prearchive. """ def get(self): return JsonTable(self._intf._get_json('/data/prearchive/projects'), ['project', 'timestamp', 'folderName'] ).select(['project', 'timestamp', 'folderName'] ).as_list()[1:] """ Retrieve the scans of a give session triple Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. """ def get_scans(self, triple): return JsonTable(self._intf._get_json( '/data/prearchive/projects/%s/scans' \ % '/'.join(triple) )).get('ID') """ Retrieve the resource of a session triple Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. scan_id - id of the scan """ def get_resources(self, triple, scan_id): return JsonTable(self._intf._get_json( '/data/prearchive/projects/%s' '/scans/%s/resources' % ('/'.join(triple), scan_id) )).get('label') """ Retrieve a list of files in a given session triple Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. scan_id - id of the scan resource_id - id of the resource """ def get_files(self, triple, scan_id, resource_id): return JsonTable(self._intf._get_json( '/data/prearchive/projects/%s' '/scans/%s/resources/%s/files' % ('/'.join(triple), scan_id, resource_id) )).get('Name') """ Move multiple sessions to a project in the prearchive asynchronously. If only one session is it is done now. This does *not* archive a session. Parameters ---------- uris - a list of session uris new_project - The name of the project to which to move the sessions. """ def move (self, uris, new_project): add_src = lambda u: urllib.urlencode({'src':u}) async = len(uris) > 1 and 'true' or 'false' print async post_body = '&'.join ((map(add_src,uris)) + [urllib.urlencode({'newProject':new_project})] + [urllib.urlencode({'async':async})]) request_uri = '/data/services/prearchive/move?format=csv' return self._intf._exec(request_uri ,'POST', post_body, {'content-type':'application/x-www-form-urlencoded'}) """ Reinspect the file on the filesystem on the XNAT server and recreate the parameters of the file. Essentially a refresh of the file. Be warned that if this session has been scheduled for an operation, that operation is cancelled. Parameters ---------- uris - a list of session uris new_project - The name of the project to which to move the sessions. """ def reset(self, triple): post_body = "action=build" request_uri = '/data/prearchive/projects/%s?format=single' \ % '/'.join(triple) return self._intf._exec(request_uri ,'POST', post_body, {'content-type':'application/x-www-form-urlencoded'}) """ Delete a session from the prearchive Parameters ---------- uri - The uri of the session to delete """ def delete (self, uri): post_body = "src=" + uri + "&" + "async=false" request_uri = "/data/services/prearchive/delete?format=csv" return self._intf._exec(request_uri ,'POST', post_body, {'content-type':'application/x-www-form-urlencoded'}) """ Get the uri of the given session. Parameters ---------- triple - A list containing the project, timestamp and session id, in that order. """ def get_uri(self, triple): return JsonTable( self._intf._get_json('/data/prearchive/projects') ).where( project=triple[0], timestamp=triple[1], folderName=triple[2] ).get('url') pyxnat-0.9.0~dev0/pyxnat/core/pathutil.py000066400000000000000000000011351163242155400205020ustar00rootroot00000000000000import os def find_files(src): names = os.listdir(src) errors = [] files = [] for name in names: srcname = os.path.join(src, name) try: if os.path.islink(srcname): linkto = os.readlink(srcname) files.extend(find_files(linkto)) # os.symlink(linkto, dstname) elif os.path.isdir(srcname): files.extend(find_files(srcname)) else: files.append(srcname) except (IOError, os.error), why: errors.append((srcname, str(why))) return files pyxnat-0.9.0~dev0/pyxnat/core/pipelines.py000066400000000000000000000220571163242155400206460ustar00rootroot00000000000000import sys import os import json import datetime import urllib2 import smtplib from copy import deepcopy import email.mime.text import xml.dom.minidom import suds.client import suds.xsd.doctor from . import httputil class PipelineNotFoundError(Exception): """workflow not found""" class Pipelines(object): def __init__(self, project, interface): self._intf = interface self._project = project def get(self): response = self._intf._exec('%s/projects/%s/pipelines' % ( self._intf._get_entry_point(), self._project, )) return json.loads(response)['ResultSet']['Result'] def add(self, location): f = open(location, 'rb') pip_doc = f.read() f.close() body, content_type = httputil.file_message( pip_doc, 'text/xml', location, os.path.split(location)[1]) pipeline_uri = '%s/projects/%s/pipelines/%s' % ( self._intf._get_entry_point(), self._project, os.path.split(location)[1] ) self._intf._exec(pipeline_uri, method='PUT', body=body, headers={'content-type':content_type} ) def delete(self, pipeline_id): pass class Pipeline(object): def __init__(self, pipeline_id, interface): self._intf = interface self._id = pipeline_id def run(self): pass def stop(self): pass def update(self): pass def complete(self): pass def fail(self): pass # class Pipeline(object): # """class for mirroring workflow information (XML) in XNAT""" # def __init__(self, base_url, username, password, workflow_id): # self._base_url = base_url # self._username = username # self._password = password # self._cookiejar = None # res = self._call('CreateServiceSession.jws', # 'execute', # (), # authenticated=True) # self._session = str(res) # args = (('ns1:string', self._session), # ('ns1:string', 'wrk:workflowData.ID'), # ('ns1:string', '='), # ('ns1:string', workflow_id), # ('ns1:string', 'wrk:workflowData')) # workflow_ids = self._call('GetIdentifiers.jws', 'search', args) # self._doc = None # for w_id in workflow_ids: # url = '%s/app/template/XMLSearch.vm/id/%s/data_type/wrk:workflowData' % (self._base_url, str(w_id)) # r = urllib2.Request(url) # self._cookiejar.add_cookie_header(r) # data = urllib2.urlopen(r).read() # doc = xml.dom.minidom.parseString(data) # workflow_node = doc.getElementsByTagName('wrk:Workflow')[0] # status = workflow_node.getAttribute('status').lower() # if status in ('queued', 'awaiting action', 'hold'): # self._doc = doc # break # if self._doc is None: # raise PipelineNotFoundError # return # def _call(self, # jws, # operation, # inputs, # authenticated=False, # fix_import=False): # """perform a SOAP call""" # url = '%s/axis/%s' % (self._base_url, jws) # if authenticated: # t = suds.transport.http.HttpAuthenticated(username=self._username, # password=self._password) # else: # t = suds.transport.http.HttpTransport() # if self._cookiejar is not None: # t.cookiejar = self._cookiejar # if fix_import: # xsd_url = 'http://schemas.xmlsoap.org/soap/encoding/' # imp = suds.xsd.doctor.Import(xsd_url) # doctor = suds.xsd.doctor.ImportDoctor(imp) # client = suds.client.Client('%s?wsdl' % url, # transport=t, # doctor=doctor) # else: # client = suds.client.Client('%s?wsdl' % url, transport=t) # typed_inputs = [] # for (dtype, val) in inputs: # ti = client.factory.create(dtype) # ti.value = val # typed_inputs.append(ti) # # the WSDL returns the local IP address in the URLs; these need # # to be corrected if XNAT is behind a proxy # client.set_options(location=url) # f = getattr(client.service, operation) # result = f(*typed_inputs) # if self._cookiejar is None: # self._cookiejar = t.cookiejar # return result # def _close(self): # """close the XNAT session (log out)""" # self._call('CloseServiceSession.jws', 'execute', ()) # return # def _update_xnat(self): # """update XNAT with the current state of this (WorkflowInfo) object""" # inputs = (('ns0:string', self._session), # ('ns0:string', self._doc.toxml()), # ('ns0:boolean', False), # ('ns0:boolean', True)) # self._call('StoreXML.jws', # 'store', # inputs, # authenticated=True, # fix_import=True) # return # def _append_node(self, root, name, value): # """add a simple text node with tag "name" and data "value" under # the node "root" # """ # node = self._doc.createElement(name) # node.appendChild(self._doc.createTextNode(value)) # root.appendChild(node) # return # def set_environment(self, arguments, parameters): # """set the execution environment # should be run only once before update() is called # """ # # order is important # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # ee_node = self._doc.createElement('wrk:executionEnvironment') # ee_node.setAttribute('xsi:type', 'wrk:xnatExecutionEnvironment') # workflow_node.appendChild(ee_node) # self._append_node(ee_node, 'wrk:pipeline', arguments['pipeline']) # self._append_node(ee_node, 'wrk:xnatuser', arguments['u']) # self._append_node(ee_node, 'wrk:host', arguments['host']) # params_node = self._doc.createElement('wrk:parameters') # ee_node.appendChild(params_node) # for key in parameters: # param_node = self._doc.createElement('wrk:parameter') # param_node.setAttribute('name', key) # for val in parameters[key]: # param_node.appendChild(self._doc.createTextNode(val)) # params_node.appendChild(param_node) # for email in arguments['notify_emails']: # self._append_node(ee_node, 'wrk:notify', email) # self._append_node(ee_node, 'wrk:dataType', arguments['dataType']) # self._append_node(ee_node, 'wrk:id', arguments['id']) # if arguments['notify_flag']: # self._append_node(ee_node, 'wrk:supressNotification', '0') # else: # self._append_node(ee_node, 'wrk:supressNotification', '1') # return # def update(self, step_id, step_description, percent_complete): # """update the workflow in XNAT""" # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # workflow_node.setAttribute('status', 'Running') # t = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # workflow_node.setAttribute('current_step_launch_time', t) # workflow_node.setAttribute('current_step_id', step_id) # workflow_node.setAttribute('step_description', step_description) # workflow_node.setAttribute('percentageComplete', percent_complete) # self._update_xnat() # return # def complete(self): # """mark the workflow comleted in XNAT and close the session""" # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # workflow_node.setAttribute('status', 'Complete') # t = datetime.datetime.now().strftime('%Y-%m-%dT%H:%M:%S') # workflow_node.setAttribute('current_step_launch_time', t) # workflow_node.setAttribute('percentageComplete', '100.0') # try: # workflow_node.removeAttribute('current_step_id') # except xml.dom.NotFoundErr: # pass # try: # workflow_node.removeAttribute('step_description') # except xml.dom.NotFoundErr: # pass # self._update_xnat() # self._close() # return # def fail(self, description=None): # """mark the workflow failed in XNAT and close the session""" # workflow_node = self._doc.getElementsByTagName('wrk:Workflow')[0] # workflow_node.setAttribute('status', 'Failed') # if description is not None: # workflow_node.setAttribute('step_description', description) # self._update_xnat() # self._close() # return pyxnat-0.9.0~dev0/pyxnat/core/provenance.py000066400000000000000000000230751163242155400210170ustar00rootroot00000000000000import time import platform import socket from lxml import etree from lxml.etree import Element, QName from .uriutil import uri_parent from .jsonutil import JsonTable from . import httputil _nsmap = {'xnat':'http://nrg.wustl.edu/xnat', 'prov':'http://www.nbirn.net/prov', 'xsi':'http://www.w3.org/2001/XMLSchema-instance' } _required = ['program', 'timestamp', 'user', 'machine', 'platform'] _optional = ['program_version', 'program_arguments', 'cvs', 'platform_version', 'compiler', 'compiler_version', 'library', 'library_version' ] _all = ['program', 'program_version', 'program_arguments', 'timestamp', 'cvs', 'user', 'machine', 'platform', 'platform_version', 'compiler', 'compiler_version', # 'library', 'library_version' ] _platform_name, _hostname, \ _platform_version, _platform_version2,\ _machine, _machine2 = platform.uname() _machine = socket.gethostname() def provenance_document(eobj, process_steps, overwrite): root_node = etree.fromstring(eobj.get()) existing_prov = None for child in root_node.getchildren(): if str(child.tag).endswith('provenance'): existing_prov = child break if existing_prov is not None and not overwrite: prov_node = existing_prov else: if existing_prov is not None and overwrite: root_node.remove(existing_prov) prov_node = Element(QName(_nsmap['xnat'], 'provenance'), nsmap=_nsmap ) root_node.insert(0, prov_node) prov_node.extend(provenance_parameters(process_steps)) return etree.tostring(root_node.getroottree()) def provenance_parameters(process_steps): prov = [] for step in process_steps: if not set(_required).issubset(step.keys()): missing = list(set(_required).difference(step.keys())) raise Exception(('Following attributes are ' 'required to define provenance: %s' % missing ) ) prov.append(process_step_xml(**step)) return prov def process_step_xml(**kwargs): step_node = Element(QName(_nsmap['prov'], 'processStep'), nsmap=_nsmap) program_node = Element(QName(_nsmap['prov'], 'program'), nsmap=_nsmap) program_node.text = kwargs['program'] if kwargs.has_key('program_version'): program_node.set('version', kwargs['program_version']) if kwargs.has_key('program_arguments'): program_node.set('arguments', kwargs['program_arguments']) step_node.append(program_node) timestamp_node = Element(QName(_nsmap['prov'], 'timestamp'), nsmap=_nsmap ) timestamp_node.text = kwargs['timestamp'] step_node.append(timestamp_node) if kwargs.has_key('cvs'): cvs_node = Element(QName(_nsmap['prov'], 'cvs'), nsmap=_nsmap) cvs_node.text = kwargs['cvs'] step_node.append(cvs_node) user_node = Element(QName(_nsmap['prov'], 'user'), nsmap=_nsmap) user_node.text = kwargs['user'] step_node.append(user_node) machine_node = Element(QName(_nsmap['prov'], 'machine'), nsmap=_nsmap) machine_node.text = kwargs['machine'] step_node.append(machine_node) platform_node = Element(QName(_nsmap['prov'], 'platform'), nsmap=_nsmap) platform_node.text = kwargs['platform'] if kwargs.has_key('platform_version'): platform_node.set('version', kwargs['platform_version']) step_node.append(platform_node) if kwargs.has_key('compiler'): compiler_node = Element(QName(_nsmap['prov'], 'compiler'), nsmap=_nsmap ) compiler_node.text = kwargs['compiler'] if kwargs.has_key('compiler_version'): compiler_node.set('version', kwargs['compiler_version']) step_node.append(compiler_node) if kwargs.has_key('library'): library_node = Element(QName(_nsmap['prov'], 'library'), nsmap=_nsmap ) library_node.text = kwargs['library'] if kwargs.has_key('library_version'): library_node.set('version', kwargs['library_version']) step_node.append(library_node) return step_node class Provenance(object): """ Class to annotate processed data with provenance information. The following parameters are available: - program - program_version - program_arguments - timestamp - cvs - user - machine - platform - platform_version - compiler - compiler_version Examples -------- >>> prov = {'program':'young', 'timestamp':'2011-03-01T12:01:01.897987', 'user':'angus', 'machine':'war', 'platform':'linux', } >>> element.provenance.set(prov) >>> element.provenance.get() >>> element.delete() """ def __init__(self, eobject): self._intf = eobject._intf self._eobject = eobject def set(self, process_steps, overwrite=False): """ Set provenance information for the data within this element. .. note:: If some required parameters are not provided, theses parameters will be extracted from the current machine and set automatically. Those parameters are: - machine - platform - timestamp - user .. warning:: overwrite option doesn't work because of a bug with the allowDataDeletion flag in XNAT Parameters ---------- process_steps: list or dict dict or list of dicts to define the processing steps of the data. The minimum set of information to give is: program, timestamp, user, machine and platform. More keywords in the class documentation. overwrite: boolean If False the process_steps are added to the existing ones. Else the processing steps overwrite any existing provenance. """ if isinstance(process_steps, dict): process_steps = [process_steps] for process_step in process_steps: _timestamp = time.strftime('%Y-%m-%dT%H:%M:%S', time.localtime() ) if not process_step.has_key('machine'): process_step['machine'] = _machine if not process_step.has_key('platform'): process_step['platform'] = _platform_name process_step['platform_version'] = _platform_version if not process_step.has_key('timestamp'): process_step['timestamp'] = _timestamp if not process_step.has_key('user'): process_step['user'] = self._intf._user doc = provenance_document(self._eobject, process_steps, overwrite) body, content_type = httputil.file_message( doc, 'text/xml', 'prov.xml', 'prov.xml') prov_uri = self._eobject._uri if overwrite: prov_uri += '?allowDataDeletion=true' self._intf._exec(prov_uri, method='PUT', body=body, headers={'content-type':content_type} ) def get(self): """ Gets all the provenance information for that object. Returns ------- A list of dicts. """ datatype = self._eobject.datatype() columns = ['%s/ID' % datatype] + [ '%s/provenance/processStep/%s' % (datatype, field) for field in _all ] prov_uri = uri_parent(self._eobject._uri) prov_uri += '?columns=' prov_uri += ','.join(columns) steps = [] table = JsonTable(self._intf._get_json(prov_uri)) id_header = 'ID' if table.has_header('ID') \ else '%s/id' % datatype.lower() for step in table.where(**{id_header:self._eobject.id()}): step_dict = {} for key in step.keys(): if 'processstep' in key: step_dict[key.split('processstep/')[1]] = step[key] steps.append(step_dict) return steps def delete(self): """ Removes the provenance attached to this object. .. warning:: doesn't work because of a bug with the allowDataDeletion flag in XNAT """ provenance_node = self._eobject.xpath('//xnat:provenance') if provenance_node != []: provenance_node = provenance_node[0] parent_node = provenance_node.getparent() parent_node.remove(provenance_node) doc = etree.tostring(parent_node.getroottree()) body, content_type = httputil.file_message( doc, 'text/xml', 'prov.xml', 'prov.xml') self._intf._exec( '%s?allowDataDeletion=true' % self._eobject._uri, method='PUT', body=body, headers={'content-type':content_type} ) pyxnat-0.9.0~dev0/pyxnat/core/resources.py000066400000000000000000002074231163242155400206720ustar00rootroot00000000000000from __future__ import with_statement import lxml import os import re import shutil import tempfile import mimetypes import zipfile import time import urllib import codecs from fnmatch import fnmatch import json from lxml import etree from .uriutil import join_uri, translate_uri, uri_segment from .uriutil import uri_last, uri_nextlast from .uriutil import uri_parent, uri_grandparent from .uriutil import uri_shape from .jsonutil import JsonTable, get_selection from .pathutil import find_files from .attributes import EAttrs from .search import build_search_document, rpn_contraints, query_from_xml from .errors import is_xnat_error, parse_put_error_message from .errors import DataError, ProgrammingError, catch_error from .cache import md5name from .provenance import Provenance # from .pipelines import Pipelines from . import schema from . import httputil from . import downloadutils DEBUG = False # metaclasses def get_element_from_element(rsc_name): def getter(self, ID): Element = globals()[rsc_name.title()] return Element(join_uri(self._uri, rsc_name + 's', ID), self._intf) return getter def get_element_from_collection(rsc_name): def getter(self, ID): Element = globals()[rsc_name.title()] Collection = globals()[rsc_name.title() + 's'] return Collection([Element(join_uri(eobj._uri, rsc_name + 's', ID), self._intf ) for eobj in self ], self._intf ) return getter def get_collection_from_element(rsc_name): def getter(self, id_filter='*'): Collection = globals()[rsc_name.title()] return Collection(join_uri(self._uri, rsc_name), self._intf, id_filter ) return getter def get_collection_from_collection(rsc_name): def getter(self, id_filter='*'): Collection = globals()[rsc_name.title()] return Collection(self, self._intf, id_filter, rsc_name, self._id_header, self._columns) return getter class ElementType(type): def __new__(cls, name, bases, dct): rsc_name = name.lower()+'s' \ if name.lower() in schema.resources_singular \ else name.lower() for child_rsc in schema.resources_tree[rsc_name]: dct[child_rsc] = get_collection_from_element(child_rsc) dct[child_rsc.rstrip('s')] = \ get_element_from_element(child_rsc.rstrip('s')) return type.__new__(cls, name, bases, dct) def __init__(cls, name, bases, dct): super(ElementType, cls).__init__(name, bases, dct) class CollectionType(type): def __new__(cls, name, bases, dct): rsc_name = name.lower()+'s' \ if name.lower() in schema.resources_singular \ else name.lower() for child_rsc in schema.resources_tree[rsc_name]: dct[child_rsc] = get_collection_from_collection(child_rsc) dct[child_rsc.rstrip('s')] = \ get_element_from_collection(child_rsc.rstrip('s')) return type.__new__(cls, name, bases, dct) def __init__(cls, name, bases, dct): super(CollectionType, cls).__init__(name, bases, dct) # generic classes class EObject(object): """ Generic Object for an element URI. """ def __init__(self, uri, interface): """ Parameters ---------- uri: string URI for an element resource. e.g. /REST/projects/my_project interface: :class:`Interface` Main interface reference. """ self._uri = urllib.quote(translate_uri(uri)) self._urn = urllib.unquote(uri_last(self._uri)) self._urt = uri_nextlast(self._uri) self._intf = interface self.attrs = EAttrs(self) def __repr__(self): return '<%s Object> %s' % (self.__class__.__name__, urllib.unquote(uri_last(self._uri)) ) def _getcell(self, col): """ Gets a single property of the element resource. """ return self._getcells([col]) def _getcells(self, cols): """ Gets multiple properties of the element resource. """ p_uri = uri_parent(self._uri) id_head = schema.json[self._urt][0] lbl_head = schema.json[self._urt][1] filters = {} columns = set([col for col in cols if col not in schema.json[self._urt] \ or col != 'URI'] + schema.json[self._urt] ) get_id = p_uri + '?format=json&columns=%s' % ','.join(columns) for pattern in self._intf._struct.keys(): if fnmatch(uri_segment( self._uri.split(self._intf._entry, 1)[1], -2), pattern): reg_pat = self._intf._struct[pattern] filters.setdefault('xsiType', set()).add(reg_pat) if filters != {}: get_id += '&' + \ '&'.join('%s=%s' % (item[0], item[1]) if isinstance(item[1], basestring) else '%s=%s' % (item[0], ','.join([val for val in item[1]]) ) for item in filters.items() ) for res in self._intf._get_json(get_id): if self._urn in [res.get(id_head), res.get(lbl_head)]: if len(cols) == 1: return res.get(cols[0]) else: return get_selection(res, cols)[0] def exists(self, consistent=False): """ Test whether an element resource exists. """ try: return self.id() != None except Exception, e: if DEBUG: print e return False def id(self): """ Returns the element resource id. """ return self._getcell(schema.json[self._urt][0]) def label(self): """ Returns the element resource label. """ return self._getcell(schema.json[self._urt][1]) def datatype(self): """ Returns the type defined in the XNAT schema for this element resource. +----------------+-----------------------+ | EObject | possible xsi types | +================+=======================+ | Project | xnat:projectData | +----------------+-----------------------+ | Subject | xnat:subjectData | +----------------+-----------------------+ | Experiment | xnat:mrSessionData | | | xnat:petSessionData | +----------------+-----------------------+ """ return self._getcell('xsiType') def create(self, **params): """ Creates the element if it does not exists. Any non-existing ancestor will be created as well. .. warning:: An element resource both have an ID and a label that can be used to access it. At the moment, XNAT REST API defines the label when creating an element, but not the ID, which is generated. It means that the `name` given to a resource may not appear when listing the resources because the IDs will appear, not the labels. .. note:: To set up additional variables for the element at its creation it is possible to use shortcuts defined in the XNAT REST documentation or xpath in the schema: - element.create(ID='theid') - subject.create(**{'xnat:subjectData/ID':'theid'}) Parameters ---------- params: keywords - Specify the datatype of the element resource and of any ancestor that may need to be created. The keywords correspond to the levels in the REST hierarchy, see Interface.inspect.architecture() - If an element is created with no specified type: - if its name matches a naming convention, this type will be used - else a default type is defined in the schema module - To give the ID the same value as the label use use_label=True e.g element.create(use_label=True) Examples -------- >>> interface.select('/project/PROJECT/subject' '/SUBJECT/experiment/EXP/scan/SCAN' ).create(experiments='xnat:mrSessionData', scans='xnat:mrScanData' ) See Also -------- EObject.id EObject.label EObject.datatype """ if params.has_key('xml') and os.path.exists(params.get('xml')): f = codecs.open(params.get('xml')) doc = f.read() f.close() try: doc_tree = etree.fromstring(doc) doc_tree.xpath('//*')[0].set('label', uri_last(self._uri)) doc = etree.tostring(doc_tree) except: pass body, content_type = httputil.file_message( doc, 'text/xml', 'data.xml', 'data.xml') _uri = self._uri _uri += '?allowDataDeletion=true' self._intf._exec(_uri, method='PUT', body=body, headers={'content-type':content_type} ) return self datatype = params.get(uri_nextlast(self._uri)) struct = self._intf._struct if datatype is None: for uri_pattern in struct.keys(): if fnmatch( self._uri.split(self._intf._entry, 1)[1], uri_pattern): datatype = struct.get(uri_pattern) break else: datatype = schema.default_datatypes.get( uri_nextlast(self._uri)) if datatype is None: create_uri = self._uri else: local_params = \ [param for param in params if param not in schema.resources_types + ['use_label'] \ and (param.startswith(datatype) or '/' not in param) ] create_uri = '%s?xsiType=%s' % (self._uri, datatype) if 'ID' not in local_params \ and '%s/ID' % datatype not in local_params \ and params.get('use_label'): create_uri += '&%s/ID=%s' % (datatype, uri_last(self._uri)) if local_params != []: create_uri += '&' + '&'.join('%s=%s' % (key, params.get(key) ) for key in local_params ) # avoid to reuse relative parameters for key in local_params: del params[key] parent_element = self._intf.select(uri_grandparent(self._uri)) if not uri_nextlast(self._uri) == 'projects' \ and not parent_element.exists(): parent_datatype = params.get(uri_nextlast(parent_element._uri)) if DEBUG: print 'CREATE', parent_element, parent_datatype parent_element.create(**params) if DEBUG: print 'PUT', create_uri output = self._intf._exec(create_uri, 'PUT') if is_xnat_error(output): paths = [] for datatype_name, element_name \ in parse_put_error_message(output): path = self._intf.inspect.schemas.look_for( element_name, datatype_name) paths.extend(path) if DEBUG: print path, 'is required' return paths return self insert = create def delete(self, delete_files=True): """ Deletes an element resource. Parameters ---------- delete_files: boolean Tells if files attached to the element resources are removed as well from the server filesystem. """ delete_uri = self._uri if not delete_files \ else self._uri + '?removeFiles=true' out = self._intf._exec(delete_uri, 'DELETE') if is_xnat_error(out): catch_error(out) def get(self): """ Retrieves the XML document corresponding to this element. """ return self._intf._exec(self._uri+'?format=xml', 'GET') def xpath(self, xpath): root = etree.fromstring(self.get()) return root.xpath(xpath, namespaces=root.nsmap) def namespaces(self): pass def parent(self): uri = uri_grandparent(self._uri) Klass = globals()[uri_nextlast(uri).title().rsplit('s', 1)[0]] return Klass(uri, self._intf) def children(self, show_names=True): """ Returns the children levels of this element. Parameters ---------- show_name: boolean If True returns a list of strings. If False returns a collection object referencing all child objects of this elements. Examples -------- >>> subject_object.children() ['experiments', 'resources'] >>> subject_object.children(False) 170976556 """ children = schema.resources_tree.get(uri_nextlast(self._uri)) if show_names: return children return CObject([getattr(self, child)() for child in children], self._intf ) def tag(self, name): """ Tag the element. """ tag = self._intf.manage.tags.get(name) if not tag.exists(): tag.create() tag.reference(self._uri) return tag def untag(self, name): """ Remove a tag for the element. """ tag = self._intf.manage.tags.get(name) tag.dereference(self._uri) if tag.references().get() == []: tag.delete() class CObject(object): """ Generic Object for a collection resource. A collection resource is a list of element resources. There is however several ways to obtain such a list: - a collection URI e.g. /REST/projects - a list of element URIs - a list of collections e.g. /REST/projects/ONE/subjects **AND** /REST/projects/TWO/subjects - a list of element objects - a list a collection objects Collections objects built in different ways share the same behavior: - they behave as iterators, which enables a lazy access to the data - they always yield EObjects - they can be nested with any other collection Examples -------- No access to the data: >>> interface.select.projects() 173667084 Lazy access to the data: >>> for project in interface.select.projects(): >>> print project Nesting: >>> for subject in interface.select.projects().subjects(): >>> print subject """ def __init__(self, cbase, interface, pattern='*', nested=None, id_header='ID', columns=[], filters={}): """ Parameters ---------- cbase: string | list | CObject Object from which the collection is built. interface: :class:`Interface` Main interface reference. pattern: string Only resource element whose ID match the pattern are returned. nested: None | string Parameter used to nest collections. id_header: ID | label Defines whether the element label or ID is returned as the identifier. columns: list Defines additional columns to be returned. filters: dict Defines additional filters for the query, typically options for the query string. """ self._intf = interface self._cbase = cbase self._id_header = id_header self._pattern = pattern self._columns = columns self._filters = filters self._nested = nested if isinstance(cbase, basestring): self._ctype = 'cobjectcuri' elif isinstance(cbase, CObject): self._ctype = 'cobjectcobject' elif isinstance(cbase, list) and cbase != []: if isinstance(cbase[0], basestring): self._ctype = 'cobjecteuris' if isinstance(cbase[0], EObject): self._ctype = 'cobjecteobjects' if isinstance(cbase[0], CObject): self._ctype = 'cobjectcobjects' elif isinstance(cbase, list) and cbase == []: self._ctype = 'cobjectempty' else: raise Exception('Invalid collection accessor type: %s'%cbase) def __repr__(self): return ' %s' % id(self) def _call(self, columns): try: uri = translate_uri(self._cbase) uri = urllib.quote(uri) request_shape = uri_shape( '%s/0' % uri.split(self._intf._entry, 1)[1]) reqcache = os.path.join(self._intf._cachedir, '%s.struct' % md5name(request_shape) ).replace('_*', '') gather = uri.split('/')[-1] in ['experiments', 'assessors', 'scans', 'reconstructions'] tick = time.gmtime(time.time())[5] % \ self._intf.inspect._tick == 0 and\ self._intf.inspect._auto if (not os.path.exists(reqcache) and gather) \ or (gather and tick): columns += ['xsiType'] # struct = {} # if self._intf._struct.has_key(reqcache): # struct = self._intf._struct[reqcache] # else: # struct = json.load(open(reqcache, 'rb')) # self._intf._struct[reqcache] = struct query_string = '?format=json&columns=%s' % ','.join(columns) # struct = {} # for pattern in struct.keys(): # request_pat = uri_segment( # join_uri(uri, self._pattern).split('/REST')[1], -2 # ) # # print pattern, request_pat, fnmatch(pattern, request_pat) # if (fnmatch(pattern, request_pat) # and struct[pattern] is not None): # self._filters.setdefault('xsiType', set() # ).add(struct[pattern]) if self._filters != {}: query_string += '&' + '&'.join( '%s=%s' % (item[0], item[1]) if isinstance(item[1], (str, unicode)) else '%s=%s' % ( item[0], ','.join([val for val in item[1]]) ) for item in self._filters.items() ) jtable = self._intf._get_json(uri + query_string) if (not os.path.exists(reqcache) and gather) \ or (gather and tick): _type = uri.split('/')[-1] self._learn_from_table(_type, jtable, reqcache) return jtable except Exception, e: if DEBUG: raise e return [] def _learn_from_table(self, _type, jtable, reqcache): request_knowledge = {} for element in jtable: xsitype = element.get('xsiType') uri = element.get('URI').split(self._intf._entry, 1)[1] uri = uri.replace(uri.split('/')[-2], _type) shape = uri_shape(uri) request_knowledge[shape] = xsitype if os.path.exists(reqcache): previous = json.load(open(reqcache, 'rb')) previous.update(request_knowledge) request_knowledge = previous self._intf._struct.update(request_knowledge) json.dump(request_knowledge, open(reqcache, 'w')) def __iter__(self): if self._ctype == 'cobjectcuri': if self._id_header == 'ID': id_header = schema.json[uri_last(self._cbase)][0] elif self._id_header == 'label': id_header = schema.json[uri_last(self._cbase)][1] else: id_header = self._id_header for res in self._call([id_header] + self._columns): try: eid = urllib.unquote(res[id_header]) if fnmatch(eid, self._pattern): klass_name = uri_last(self._cbase ).rstrip('s').title() Klass = globals().get(klass_name, self._intf.__class__) eobj = Klass(join_uri(self._cbase, eid), self._intf) if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, subeobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjecteuris': for uri in self._cbase: try: Klass = globals().get(uri_nextlast(uri).rstrip('s').title(), self._intf.__class__) eobj = Klass(uri, self._intf) if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, subeobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjecteobjects': for eobj in self._cbase: try: if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.rstrip('s').title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, subeobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjectcobject': for eobj in self._cbase: try: if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(self._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, self._nested), interface=self._intf, pattern=self._pattern, id_header=self._id_header, columns=self._columns): try: self._run_callback(self, eobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjectcobjects': for cobj in self._cbase: try: for eobj in cobj: if self._nested is None: self._run_callback(self, eobj) yield eobj else: Klass = globals().get(cobj._nested.title(), self._intf.__class__) for subeobj in Klass( cbase=join_uri(eobj._uri, cobj._nested), interface=cobj._intf, pattern=cobj._pattern, id_header=cobj._id_header, columns=cobj._columns): try: self._run_callback(self, eobj) yield subeobj except RuntimeError: pass except KeyboardInterrupt: self._intf._connect() raise StopIteration elif self._ctype == 'cobjectempty': for empty in []: yield empty def _run_callback(self, cobj, eobj): if self._intf._callback is not None: self._intf._callback(cobj, eobj) def first(self): """ Returns the first element of the collection. """ for eobj in self: return eobj fetchone = first def get(self, *args): """ Returns every element. .. warning:: If a collection needs to issue thousands of queries it may be better to access the resources within a `for-loop`. Parameters ---------- args: strings - Specify the information to return for the elements within ID, label and Object. - Any combination of ID, label and obj is valid, if more than one is given, a list of tuple is returned instead of a list. """ if args == (): return [urllib.unquote(uri_last(eobj._uri)) for eobj in self] else: ret = () for arg in args: if arg == 'id': self._id_header = 'ID' ret += ([urllib.unquote(uri_last(eobj._uri)) for eobj in self ], ) elif arg == 'label': self._id_header = 'label' ret += ([urllib.unquote(uri_last(eobj._uri)) for eobj in self ], ) else: ret += ([eobj for eobj in self], ) if len(args) != 1: return ret else: return ret[0] fetchall = get def tag(self, name): """ Tag the collection. """ tag = self._intf.manage.tags.get(name) if not tag.exists(): tag.create() tag.reference_many([eobj._uri for eobj in self]) return tag def untag(self, name): """ Remove the tag from the collection. """ tag = self._intf.manage.tags.get(name) tag.dereference_many([eobj._uri for eobj in self]) if tag.references().get() == []: tag.delete() def where(self, constraints=None, template=None, query=None): """ Only the element objects whose subject that are matching the constraints will be returned. It means that it is not possible to use this method on an element that is not linked to a subject, such as a project. Examples -------- The ``where`` clause should be on the first select: >>> for experiment in interface.select('//experiments' ).where([('atest/FIELD', '=', 'value'), 'AND']): >>> print experiment Do **NOT** do this: >>> for experiment in interface.select('//experiments'): for assessor in experiment.assessors( ).where([('atest/FIELD', '=', 'value'), 'AND']): >>> print assessor Or this: >>> for project in interface.select('//projects' ).where([('atest/FIELD', '=', 'value'), 'AND']): >>> print project See Also -------- search.Search() """ if isinstance(constraints, (str, unicode)): constraints = rpn_contraints(constraints) elif isinstance(template, (tuple)): tmp_bundle = self._intf.manage.search.get_template( template[0], True) tmp_bundle = tmp_bundle % template[1] constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(query, (str, unicode)): tmp_bundle = self._intf.manage.search.get(query, 'xml') constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(constraints, list): pass else: raise ProgrammingError('One in [contraints, template and ' 'query] parameters must be correctly ' 'set.' ) # _columns = [ # 'xnat:subjectData/PROJECT', # 'xnat:subjectData/SUBJECT_ID', # ] + ['%s/ID' %qtype for qtype in _queried_types] # bundle = build_search_document( # 'xnat:imageSessionData', _columns, constraints) # content = self._intf._exec( # "%s/search?format=json" % self._intf._entry, # 'POST', bundle) # if content.startswith(''): # raise Exception(content.split('

')[1].split('

')[0]) # results = JsonTable(json.loads(content)['ResultSet']['Result']) # return results results = query_with( interface=self._intf, join_field='xnat:subjectData/SUBJECT_ID', common_field='SUBJECT_ID', return_values=['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID'], _filter=constraints ) searchpop = ['%s/projects/' % self._intf._entry + \ '%(project)s/subjects/%(subject_id)s' % res for res in results ] cobj = self while cobj: first = cobj.first() if not first: break if uri_nextlast(first._uri) == 'subjects': break else: cobj = getattr(cobj, '_cbase') backup_header = cobj._id_header if cobj._pattern != '*': cobj._id_header = 'ID' poi = set(searchpop ).intersection([eobj._uri for eobj in cobj]) else: poi = searchpop cobj._cbase = list(poi) cobj._ctype = 'cobjecteuris' cobj._nested = None cobj._id_header = backup_header return self # specialized classes class Project(EObject): __metaclass__ = ElementType def __init__(self, uri, interface): """ Parameters ---------- uri: string The file resource URI interface: Interface Object """ EObject.__init__(self, uri, interface) # self.pipelines = Pipelines(self.id(), self._intf) def prearchive_code(self): """ Gets project prearchive code. """ return int(self._intf._exec(join_uri(self._uri, 'prearchive_code'))) def set_prearchive_code(self, code): """ Sets project prearchive code. Parameters ---------- code: 0 to 4 """ self._intf._exec(join_uri(self._uri, 'prearchive_code', code), 'PUT') def quarantine_code(self): """ Gets project quarantine code. """ return int(self._intf._exec(join_uri(self._uri, 'quarantine_code'))) def set_quarantine_code(self, code): """ Sets project quarantine code. Parameters ---------- code: 0 to 1 """ self._intf._exec(join_uri(self._uri, 'quarantine_code', code), 'PUT') def current_arc(self): """ Gets project current archive folder on the server. """ return self._intf._exec(join_uri(self._uri, 'current_arc')) def set_subfolder_in_current_arc(self, subfolder): """ Changes project current archive subfolder on the server. """ current_arc = self._intf._exec(join_uri(self._uri, 'current_arc')) self._intf._exec(join_uri(self._uri, 'current_arc', current_arc, subfolder), 'PUT') def accessibility(self): """ Gets project accessibility. """ return self._intf._exec(join_uri(self._uri, 'accessibility'), 'GET') def set_accessibility(self, accessibility='protected'): """ Sets project accessibility. .. note:: Write access is given or not by the user level for a specific project. Parameters ---------- accessibility: public | protected | private Sets the project accessibility: - public: the project is visible and provides read access for anyone. - protected: the project is visible by anyone but the data is accessible for allowed users only. - private: the project is visible by allowed users only. """ return self._intf._exec(join_uri(self._uri, 'accessibility', accessibility), 'PUT') def users(self): """ Gets all registered users for this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).get('login', always_list=True) def owners(self): """ Gets owners of this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(displayname='Owners' ).get('login', always_list=True) def members(self): """ Gets members of this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(displayname='Members' ).get('login', always_list=True) def collaborators(self): """ Gets collaborator of this project. """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(displayname='Collaborators' ).get('login', always_list=True) def user_role(self, login): """ Gets the user level of the user for this project. Parameters ---------- login: string A user of the project. Returns ------- string : owner | member | collaborator """ return JsonTable(self._intf._get_json(join_uri(self._uri, 'users')) ).where(login=login )['displayname'].lower().rstrip('s') def add_user(self, login, role='member'): """ Adds a user to the project. The user must already exist on the server. Parameters ---------- login: string Valid username for the XNAT database. role: owner | member | collaborator The user level for this project: - owner: read and write access, as well as administrative privileges such as adding and removing users. - member: read access and can create new resources but not remove them. - collaborator: read access only. """ self._intf._exec(join_uri(self._uri, 'users', role.lstrip('s').title() + 's', login ), 'PUT') def remove_user(self, login): """ Removes a user from the project. Parameters ---------- login: string Valid username for the XNAT database. """ self._intf._exec(join_uri(self._uri, 'users', self.user_role(login).title()+'s', login ), 'DELETE') def datatype(self): return 'xnat:projectData' def experiments(self, id_filter='*'): return Experiments('%s/experiments' % self._intf._entry, self._intf, id_filter, filters={'project':self.id()} ) def experiment(self, ID): return Experiment('%s/experiments/%s' % (self._intf._entry, ID), self._intf ) def last_modified(self): """ Gets the last modified dates for all the project subjects. If any element related to a subject changes, experiment, variable, scan, image etc... the date will be changed. """ uri = '%s/subjects?columns=last_modified' % self._uri return dict(JsonTable(self._intf._get_json(uri), order_by=['ID', 'last_modified'] ).select(['ID', 'last_modified'] ).items() ) def add_custom_variables(self, custom_variables, allow_data_deletion=False): """Adds a custom variable to a specified group Parameters ---------- custom_variables: a dictionary allow_data_deletion : a boolean Examples -------- >>> variables = {'Subjects' : {'newgroup' : {'foo' : 'string', 'bar' : 'int'}}} >>> project.add_custom_variables(variables) """ tree = lxml.etree.fromstring(self.get()) update = False for protocol, value in custom_variables.items(): try: protocol_element = tree.xpath( "//xnat:studyProtocol[@name='%s']" % protocol, namespaces=tree.nsmap).pop() except IndexError: raise ValueError( 'Protocol %s not in current schema' % protocol ) try: definitions_element = protocol_element.xpath( 'xnat:definitions', namespaces = tree.nsmap).pop() except IndexError: update = True definitions_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'],'definitions'), nsmap=tree.nsmap ) protocol_element.append(definitions_element) for group, fields in value.items(): try: group_element = definitions_element.xpath( "xnat:definition[@ID='%s']" % group, namespaces = tree.nsmap).pop() fields_element = group_element.xpath( "xnat:fields", namespaces = tree.nsmap).pop() except IndexError: update = True group_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'],'definition'), nsmap = tree.nsmap ) group_element.set('ID', group) group_element.set( 'data-type', protocol_element.get('data-type')) group_element.set('description','') group_element.set('project-specific','1') definitions_element.append(group_element) fields_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'],'fields'), nsmap = tree.nsmap ) group_element.append(fields_element) for field, datatype in fields.items(): try: field_element = fields_element.xpath( "xnat:field[@name='%s']" % field, namespaces = tree.nsmap).pop() except IndexError: field_element = lxml.etree.Element( lxml.etree.QName(tree.nsmap['xnat'],'field'), nsmap = tree.nsmap) field_element.set('name', field) field_element.set('datatype', datatype) field_element.set('type', 'custom') field_element.set('required', '0') field_element.set( 'xmlPath', "xnat:%s/fields/field[name=%s]/field" % ( protocol_element.get( 'data-type').split(':')[-1], field) ) fields_element.append(field_element) update = True if update: body, content_type = httputil.file_message( lxml.etree.tostring(tree), 'text/xml', 'cust.xml', 'cust.xml' ) uri = self._uri if allow_data_deletion: uri = self._uri + '?allowDataDeletion=true' self._intf._exec(uri, method='PUT', body=body, headers= {'content-type':content_type}) def get_custom_variables(self): """Retrieves custom variables as a dictionary It has the format {studyProtocol: { setname : {field: type, ...}}} """ tree = lxml.etree.fromstring(self.get()) nsmap = tree.nsmap custom_variables = {} for studyprotocols in tree.xpath('//xnat:studyProtocol', namespaces=nsmap): protocol_name = studyprotocols.get('name') custom_variables[protocol_name] = {} for definition in studyprotocols.xpath(('xnat:definitions' '/xnat:definition'), namespaces=nsmap): definition_id = definition.get('ID') custom_variables[protocol_name][definition_id] = {} for field in definition.xpath('xnat:fields/xnat:field', namespaces=nsmap): field_name = field.get('name') if field.get('type') == 'custom': custom_variables[protocol_name][definition_id][ field_name] = field.get('datatype') return custom_variables class Subject(EObject): __metaclass__ = ElementType def datatype(self): return 'xnat:subjectData' def shares(self, id_filter='*'): """ Returns the projects sharing this subject. Returns ------- Collection object. """ return Projects(join_uri(self._uri, 'projects'), self._intf, id_filter) def share(self, project): """ Share this subject with another project. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'PUT') def unshare(self, project): """ Remove subject from another project in which it was shared. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'DELETE') class Experiment(EObject): __metaclass__ = ElementType def shares(self, id_filter='*'): """ Returns the projects sharing this experiment. Returns ------- Collection object. """ return Projects(join_uri(self._uri, 'projects'), self._intf, id_filter) def share(self, project): """ Share this experiment with another project. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'PUT') def unshare(self, project): """ Remove experiment from another project in which it was shared. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'DELETE') def trigger_pipelines(self): """ Triggers the AutoRun pipeline. """ self._intf._exec(self._uri+'?triggerPipelines=true', 'PUT') def fix_scan_types(self): """ Populate empty scan TYPE attributes based on how similar scans were populated. """ self._intf._exec(self._uri+'?fixScanTypes=true', 'PUT') def pull_data_from_headers(self): """ Pull DICOM header values into the session. """ self._intf._exec(self._uri+'?pullDataFromHeaders=true', 'PUT') def trigger(self, pipelines=True, fix_types=True, scan_headers=True): """ Run several triggers in a single call. Parameters ---------- pipelines: boolean Same as trigger_pipelines. fix_types: boolean Same as fix_scan_types. scan_headers: boolean Same as pull_data_from headers. """ if not all([not pipelines, not fix_types, not scan_headers]): options = [] if pipelines: options.append('triggerPipelines=true') if fix_types: options.append('fixScanTypes=true') if scan_headers: options.append('pullDataFromHeaders=true') options = '?' + '&'.join(options) self._intf._exec(self._uri + options, 'PUT') class Assessor(EObject): __metaclass__ = ElementType def __init__(self, uri, interface): EObject.__init__(self, uri, interface) self.provenance = Provenance(self) def shares(self, id_filter='*'): """ Returns the projects sharing this assessor. Returns ------- Collection object. """ return Projects(join_uri(self._uri, 'projects'), self._intf, id_filter) def share(self, project): """ Share this assessor with another project. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'PUT') def unshare(self, project): """ Remove assessor from another project in which it was shared. Parameters ---------- project: string The other project name. """ self._intf._exec(join_uri(self._uri, 'projects', project), 'DELETE') def set_param(self, key, value): self.attrs.set('%s/parameters/addParam[name=%s]/addField' \ % (self.datatype(), key), value ) def get_param(self, key): return self.xpath( "//xnat:addParam[@name='%s']/child::text()" % key)[-1] def get_params(self): return self.xpath("//xnat:addParam/child::text()")[1::2] def params(self): return self.xpath('//xnat:addParam/attribute::*') class Reconstruction(EObject): __metaclass__ = ElementType def __init__(self, uri, interface): EObject.__init__(self, uri, interface) self.provenance = Provenance(self) def datatype(self): return (super(Reconstruction, self).datatype() or 'xnat:reconstructedImageData' ) class Scan(EObject): __metaclass__ = ElementType def set_param(self, key, value): self.attrs.set('%s/parameters/addParam[name=%s]/addField' \ % (self.datatype(), key), value ) def get_param(self, key): return self.xpath( "//xnat:addParam[@name='%s']/child::text()" % key)[-1] def get_params(self): return self.xpath("//xnat:addParam/child::text()")[1::2] def params(self): return self.xpath('//xnat:addParam/attribute::*') class Resource(EObject): __metaclass__ = ElementType def get(self, dest_dir, extract=False): """ Downloads all the files within a resource. ..warning:: Currently XNAT adds parent folders in the zip file that is downloaded to avoid name clashes if several resources are downloaded in the same folder. In order to be able to download the data uploaded previously with the same structure, pyxnat extracts the zip file, remove the exra paths and if necessary re-zips it. Careful, it may take time, and there is the problem of name clashes. Parameters ---------- dest_dir: string Destination directory for the resource data. extract: boolean If True, the downloaded zip file is extracted. If False, not extracted. Returns ------- If extract is False, the zip file path. If extract is True, the list of file paths previously in the zip. """ zip_location = os.path.join(dest_dir, uri_last(self._uri) + '.zip') if dest_dir is not None: self._intf._http.cache.preset(zip_location) self._intf._exec(join_uri(self._uri, 'files')+'?format=zip') fzip = zipfile.ZipFile(zip_location, 'r') fzip.extractall(path=dest_dir) fzip.close() members = [] for member in fzip.namelist(): old_path = os.path.join(dest_dir, member) print member print member.split('files',1) new_path = os.path.join( dest_dir, uri_last(self._uri) #, member.split('files', 1)[1].split(os.sep, 2)[2] ) if not os.path.exists(os.path.dirname(new_path)): os.makedirs(os.path.dirname(new_path)) shutil.move(old_path, new_path) members.append(new_path) # TODO: cache.delete(...) for extracted in fzip.namelist(): pth = os.path.join(dest_dir, extracted.split(os.sep, 1)[0]) if os.path.isdir(pth): shutil.rmtree(pth) os.remove(zip_location) if not extract: fzip = zipfile.ZipFile(zip_location, 'w') arcprefix = os.path.commonprefix(members) arcroot = '/%s' % os.path.split(arcprefix.rstrip('/'))[1] for member in members: fzip.write(member, os.path.join(arcroot, member.split(arcprefix)[1]) ) fzip.close() unzippedTree = os.path.join(dest_dir, uri_last(self._uri)) if os.path.exists(unzippedTree): if os.path.isdir(unzippedTree): shutil.rmtree(os.path.join(dest_dir, uri_last(self._uri))) else : os.remove(unzippedTree) return zip_location if os.path.exists(zip_location) else members def put(self, sources, **datatypes): """ Insert a list of files in a single resource element. This method takes all the files an creates a zip with them which will be the element to be uploaded and then extracted on the server. """ zip_location = tempfile.mkstemp(suffix='.zip')[1] arcprefix = os.path.commonprefix(sources) arcroot = '/%s' % os.path.split(arcprefix.rstrip('/'))[1] fzip = zipfile.ZipFile(zip_location, 'w') for src in sources: fzip.write(src, os.path.join(arcroot, src.split(arcprefix)[1])) fzip.close() self.put_zip(zip_location, **datatypes) os.remove(zip_location) def put_zip(self, zip_location, **datatypes): """ Uploads a zip or tgz file an then extracts it on the server. After the compressed file is extracted the individual files are accessible separately, or as a whole using get_zip. """ if not self.exists(): self.create(**datatypes) self.file(os.path.split(zip_location)[1] + '?extract=true' ).put(zip_location) def put_dir(self, src_dir, **datatypes): """ Finds recursively all the files in a folder and uploads them using `insert`. """ self.put(find_files(src_dir), **datatypes) batch_insert = put zip_insert = put_zip dir_insert = put_dir def datatype(self): return (super(Reconstruction, self).datatype() or 'xnat:abstractResource' ) class In_Resource(Resource): __metaclass__ = ElementType class Out_Resource(Resource): __metaclass__ = ElementType class File(EObject): """ EObject for files stored in XNAT. """ __metaclass__ = ElementType def __init__(self, uri, interface): """ Parameters ---------- uri: string The file resource URI interface: Interface Object """ EObject.__init__(self, uri, interface) self._absuri = None def attributes(self): """ Files attributes include: - URI - Name - Size in bytes - file_tags - file_format - file_content Returns ------- dict : a dictionnary with the file attributes """ return self._getcells(['URI', 'Name', 'Size', 'file_tags', 'file_format', 'file_content']) def get(self, dest=None, force_default=False): """ Downloads the file to the cache directory. .. note:: The default cache path is computed like this: ``path_to_cache/md5(uri + query_string)_filename`` Parameters ---------- dest: string | None - If None a default path in the cache folder is automatically computed. - Else the file is downloaded at the requested location. force_default: boolean - Has no effect if the file is downloaded for the first time - If the file was previously download with a custom path, calling get() will remember the custom location unless: - another custom location is set in dest - force_default is set to True and the file will be moved to the cache Returns ------- string : the file location. """ if not self._absuri: self._absuri = self._getcell('URI') if self._absuri is None: raise DataError('Cannot get file: does not exists') if dest is not None: self._intf._http.cache.preset(dest) elif not force_default: _location = \ self._intf._http.cache.get_diskpath( '%s%s' % (self._intf._server, self._absuri) ) self._intf._http.cache.preset(_location) self._intf._exec(self._absuri, 'GET') return self._intf._http.cache.get_diskpath( '%s%s' % (self._intf._server, self._absuri) ) def get_copy(self, dest=None): """ Downloads the file to the cache directory but creates a copy at the specified location. Parameters ---------- dest: string | None - file path for the copy - if None a copy is created at a default location based on the file URI on the server Returns ------- string : the copy location. """ if not dest: dest = os.path.join(self._intf._http.cache.cache, 'workspace', *self._absuri.strip('/').split('/')[1:]) if not os.path.exists(os.path.dirname(dest)): os.makedirs(os.path.dirname(dest)) src = self.get() if src != dest: shutil.copy2(src, dest) return dest def put(self, src, format='U', content='U', tags='U', **datatypes): """ Uploads a file to XNAT. Parameters ---------- src: string Location of the local file to upload or the actual content to upload. format: string Optional parameter to specify the file format. Defaults to 'U'. content: string Optional parameter to specify the file content. Defaults to 'U'. tags: string Optional parameter to specify tags for the file. Defaults to 'U'. """ format = urllib.quote(format) content = urllib.quote(content) tags = urllib.quote(tags) try: if os.path.exists(src): path = src name = os.path.basename(path).split('?')[0] src = codecs.open(src).read() else: path = self._uri.split('/')[-1] name = path except: path = self._uri.split('/')[-1] name = path content_type = mimetypes.guess_type(path)[0] or \ 'application/octet-stream' body, content_type = httputil.file_message(src, content_type, path, name ) guri = uri_grandparent(self._uri) if not self._intf.select(guri).exists(): self._intf.select(guri).insert(**datatypes) resource_id = self._intf.select(guri).id() self._absuri = urllib.unquote( re.sub('resources/.*?/', 'resources/%s/' % resource_id, self._uri) ) query_args = { 'format': format, 'content': content, 'tags': tags, } if '?' in self._absuri: k, v = self._absuri.split('?')[1].split('=') query_args[k] = v self._absuri = self._absuri.split('?')[0] put_uri = '%s?%s' % ( self._absuri, '&'.join('%s=%s' % (k,v) for k, v in query_args.items()) ) # print 'INSERT FILE', os.path.exists(src) self._intf._exec( put_uri, 'PUT', body, headers={'content-type':content_type} ) # track the uploaded file as one of the cache # print 'GET DISKPATH', os.path.exists(src) # _cachepath = self._intf._http.cache.get_diskpath( # '%s%s' % (self._intf._server, self._absuri), # force_default=True # ) # _fakepath = '%s.alt' % _cachepath # _headerpath = '%s.headers' % _cachepath # print 'WRITE REFFILE', os.path.exists(src) # reffile = open(_fakepath, 'wb') # reffile.write(src) # reffile.close() # info_head = self._intf._get_head(self._absuri) # print 'WRITE HEADER FILE', os.path.exists(src) # headerfile = open(_headerpath, 'wb') # headerfile.write(info_head.as_string()) # headerfile.close() insert = put create = put def delete(self): """ Deletes the file on the server. """ if not self._absuri: self._absuri = self._getcell('URI') if self._absuri is None: raise DataError('Cannot delete file: does not exists') return self._intf._exec(self._absuri, 'DELETE') def size(self): """ Gets the file size. """ return self._getcell('Size') def labels(self): """ Gets the file labels. """ return self._getcell('file_tags') def format(self): """ Gets the file format. """ return self._getcell('file_format') def content(self): """ Gets the file content description. """ return self._getcell('file_content') class In_File(File): __metaclass__ = ElementType class Out_File(File): __metaclass__ = ElementType class Projects(CObject): __metaclass__ = CollectionType class Subjects(CObject): __metaclass__ = CollectionType def sharing(self, projects=[]): return Subjects([eobj for eobj in self if set(projects).issubset(eobj.shares().get()) ], self._intf ) def share(self, project): for eobj in self: eobj.share(project) def unshare(self, project): for eobj in self: eobj.unshare(project) class Experiments(CObject): __metaclass__ = CollectionType def sharing(self, projects=[]): return Experiments([eobj for eobj in self if set(projects).issubset(eobj.shares().get()) ], self._intf ) def share(self, project): for eobj in self: eobj.share(project) def unshare(self, project): for eobj in self: eobj.unshare(project) class Assessors(CObject): __metaclass__ = CollectionType def sharing(self, projects=[]): return Assessors([eobj for eobj in self if set(projects).issubset(eobj.shares().get()) ], self._intf ) def share(self, project): for eobj in self: eobj.share(project) def unshare(self, project): for eobj in self: eobj.unshare(project) def download (self, dest_dir, type="ALL", name=None, extract=False, safe=False): """ A wrapper around :func:`downloadutils.download` """ return downloadutils.download(dest_dir, self, type, name, extract, safe) class Reconstructions(CObject): __metaclass__ = CollectionType def download (self, dest_dir, type="ALL", name=None, extract=False, safe=False): """ A wrapper around :func:`downloadutils.download` """ return downloadutils.download(dest_dir, self, type, name, extract, safe) class Scans(CObject): __metaclass__ = CollectionType def download (self, dest_dir, type="ALL", name=None, extract=False, safe=False): """ A wrapper around :func:`downloadutils.download` """ return downloadutils.download(dest_dir, self, type, name, extract, safe) class Resources(CObject): __metaclass__ = CollectionType class In_Resources(Resources): __metaclass__ = CollectionType class Out_Resources(Resources): __metaclass__ = CollectionType class Files(CObject): __metaclass__ = CollectionType class In_Files(Files): __metaclass__ = CollectionType class Out_Files(Files): __metaclass__ = CollectionType ## Utility functions for downloading and extracting zip archives def _datatypes_from_query(query): datatypes = [] for constraint in query: if isinstance(constraint, list): datatypes.extend(_datatypes_from_query(constraint)) elif isinstance(constraint, tuple): datatypes.append(constraint[0].split('/')[0]) return datatypes def query_with(interface, join_field, common_field, return_values, _filter): _stm = (join_field.split('/')[0], return_values) _cls = rewrite_query(interface, join_field, common_field, _filter) return interface.select(*_stm).where(_cls) def rewrite_query(interface, join_field, common_field, _filter): _new_filter = [] for _f in _filter: if isinstance(_f, list): _new_filter.append(rewrite_query( interface, join_field, common_field, _f)) elif isinstance(_f, tuple): _datatype = _f[0].split('/')[0] _res = interface.select( _datatype, ['%s/%s' % (_datatype, common_field)] ).where([_f, 'AND']) _new_f = [(join_field, '=', '%s' % sid) for sid in _res['subject_id'] ] _new_f.append('OR') _new_filter.append(_new_f) elif isinstance(_f, (str, unicode)): _new_filter.append(_f) else: raise Exception('Invalid filter') return _new_filter pyxnat-0.9.0~dev0/pyxnat/core/schema.py000066400000000000000000000122171163242155400201130ustar00rootroot00000000000000 # REST collection resources tree resources_tree = { 'projects' :['subjects', 'resources'], 'subjects' :['experiments', 'resources'], 'experiments' :['assessors', 'reconstructions', 'scans', 'resources'], 'assessors' :['resources', 'in_resources','out_resources'], 'reconstructions' :['in_resources','out_resources'], 'scans' :['resources'], 'resources' :['files'], 'files' :[], 'in_resources' :['files'], 'in_files' :[], 'out_resources' :['files'], 'out_files' :[], } prearc_tree = {'projects' :['scans'], 'scans' :['resources'], 'resources' :['files'] } # REST resources that are not natively supported extra_resources_tree = {'projects':['assessors', 'scans', 'reconstructions'], 'subjects':['assessors', 'scans', 'reconstructions'], } # REST translation table rest_translation = {'in_resources':'in/resources', 'in_files':'in/files', 'out_resources':'out/resources', 'out_files':'out/files', 'in_resource':'in/resource', 'in_file':'in/file', 'out_resource':'out/resource', 'out_file':'out/file', } # REST json format json = {'projects':['ID', 'ID'], 'subjects':['ID', 'label'], 'experiments':['ID', 'label'], 'assessors':['ID', 'label'], 'reconstructions':['ID', 'label'], 'scans':['ID', 'ID'], 'resources':['xnat_abstractresource_id', 'label'], 'out_resources':['xnat_abstractresource_id', 'label'], 'in_resources':['xnat_abstractresource_id', 'label'], 'files':['Name', 'Name'], } resources_singular = [key.rsplit('s', 1)[0] for key in resources_tree.keys()] resources_plural = resources_tree.keys() resources_types = resources_singular + resources_plural default_datatypes = {'projects':'xnat:projectData', 'subjects':'xnat:subjectData', 'experiments':'xnat:mrSessionData', 'assessors':'xnat:mrAssessorData', 'reconstructions':'xnat:reconstructedImageData', 'scans':'xnat:mrScanData', 'resources':None, 'in_resources':None, 'out_resources':None, } def datatype_attributes(root, datatype): def _iterchildren(node, pathsofar): elements = [] for child in node.iterchildren(): if isinstance(child.tag, basestring) \ and child.tag.split('}')[1] == 'element': elements.append('%s/%s'%(pathsofar, child.get('name'))) elements.extend(_iterchildren(child, '%s/%s'% (pathsofar, child.get('name'))) ) elif isinstance(child.tag, basestring) \ and child.tag.split('}')[1] == 'attribute': elements.append('%s/%s'%(pathsofar, child.get('name'))) elif isinstance(child.tag, basestring) \ and child.tag.split('}')[1] == 'extension': ct_xpath = "/xs:schema/xs:complexType[@name='%s']"% \ child.get('base').split(':')[1] for complex_type in node.getroottree( ).xpath(ct_xpath, namespaces=child.nsmap): same = False for ancestor in child.iterancestors(): if ancestor.get('name') == \ child.get('base').split(':')[1]: same = True break if not same: elements.extend(_iterchildren(complex_type, pathsofar) ) elements.extend(_iterchildren(child, pathsofar)) else: elements.extend(_iterchildren(child, pathsofar)) return elements ct_xpath = "/xs:schema/xs:complexType[@name='%s']" % \ datatype.split(':')[1] attributes = [] for complex_type in root.xpath(ct_xpath, namespaces=root.nsmap): for child in complex_type.iterchildren(): attributes.extend(_iterchildren(child, datatype)) return attributes def datatypes(root): nsmap = get_nsmap(root) return [element.get('type') for element in root.xpath('/xs:schema/xs:element', namespaces=nsmap) ] def get_nsmap(node): nsmap = node.nsmap none_ns = node.nsmap.get(None) if none_ns != None: nsmap[none_ns.rsplit('/', 1)[1]] = none_ns del nsmap[None] return nsmap def class_name(self): """ Return the name of this class without qualification. eg. If the class name is "x.y.class" return only "class" """ return self.__class__.__name__.split('.')[-1] pyxnat-0.9.0~dev0/pyxnat/core/search.py000066400000000000000000000617351163242155400201310ustar00rootroot00000000000000import os import re import glob import csv import difflib from StringIO import StringIO from lxml import etree import json from .jsonutil import JsonTable, get_column, get_where, get_selection from .errors import is_xnat_error, catch_error from .errors import ProgrammingError, NotSupportedError from .errors import DataError, DatabaseError from .uriutil import check_entry search_nsmap = {'xdat':'http://nrg.wustl.edu/security', 'xsi':'http://www.w3.org/2001/XMLSchema-instance'} special_ops = {'*':'%', } def build_search_document(root_element_name, columns, criteria_set, brief_description='', long_description='', allowed_users=[]): root_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'bundle'), nsmap=search_nsmap ) root_node.set('ID', "@%s" % root_element_name) root_node.set('brief-description', brief_description) root_node.set('description', long_description) root_node.set('allow-diff-columns', "0") root_node.set('secure', "false") root_element_name_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'root_element_name'), nsmap=search_nsmap ) root_element_name_node.text = root_element_name root_node.append(root_element_name_node) for i, column in enumerate(columns): element_name, field_ID = column.split('/') search_field_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'search_field'), nsmap=search_nsmap ) element_name_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'element_name'), nsmap=search_nsmap ) element_name_node.text = element_name field_ID_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'field_ID'), nsmap=search_nsmap ) field_ID_node.text = field_ID sequence_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'sequence'), nsmap=search_nsmap ) sequence_node.text = str(i) type_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'type'), nsmap=search_nsmap ) type_node.text = 'string' header_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'header'), nsmap=search_nsmap ) header_node.text = column search_field_node.extend([element_name_node, field_ID_node, sequence_node, type_node, header_node ]) root_node.append(search_field_node) search_where_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'search_where'), nsmap=search_nsmap ) root_node.append(build_criteria_set(search_where_node, criteria_set)) if allowed_users != []: allowed_users_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'allowed_user'), nsmap=search_nsmap ) for allowed_user in allowed_users: login_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'login'), nsmap=search_nsmap ) login_node.text = allowed_user allowed_users_node.append(login_node) root_node.append(allowed_users_node) return etree.tostring(root_node.getroottree()) def build_criteria_set(container_node, criteria_set): for criteria in criteria_set: if isinstance(criteria, basestring): container_node.set('method', criteria) if isinstance(criteria, (list)): sub_container_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'child_set'), nsmap=search_nsmap ) container_node.append( build_criteria_set(sub_container_node, criteria)) if isinstance(criteria, (tuple)): if len(criteria) != 3: raise ProgrammingError('%s should be a 3-element tuple' % str(criteria) ) constraint_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'criteria'), nsmap=search_nsmap ) constraint_node.set('override_value_formatting', '0') schema_field_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'schema_field' ), nsmap=search_nsmap ) schema_field_node.text = criteria[0] comparison_type_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'comparison_type' ), nsmap=search_nsmap ) comparison_type_node.text = special_ops.get(criteria[1], criteria[1] ) value_node = \ etree.Element(etree.QName(search_nsmap['xdat'], 'value'), nsmap=search_nsmap ) value_node.text = criteria[2].replace('*', special_ops['*']) constraint_node.extend([ schema_field_node, comparison_type_node, value_node]) container_node.append(constraint_node) return container_node def query_from_xml(document): query = {} root = etree.fromstring(document) _nsmap = root.nsmap query['description'] = root.get('description', default="") query['row'] = root.xpath('xdat:root_element_name', namespaces=root.nsmap)[0].text query['columns'] = [] for node in root.xpath('xdat:search_field', namespaces=_nsmap): en = node.xpath('xdat:element_name', namespaces=root.nsmap)[0].text fid = node.xpath('xdat:field_ID', namespaces=root.nsmap)[0].text query['columns'].append('%s/%s' % (en, fid)) query['users'] = [ node.text for node in root.xpath('xdat:allowed_user/xdat:login', namespaces=root.nsmap ) ] try: search_where = root.xpath('xdat:search_where', namespaces=root.nsmap)[0] query['constraints'] = query_from_criteria_set(search_where) except: query['constraints'] = [('%s/ID' % query['row'], 'LIKE', '%'), 'AND'] return query def query_from_criteria_set(criteria_set): query = [] query.append(criteria_set.get('method')) _nsmap = criteria_set.nsmap for criteria in criteria_set.xpath('xdat:criteria', namespaces=_nsmap): _f = criteria.xpath('xdat:schema_field', namespaces=_nsmap)[0] _o = criteria.xpath('xdat:comparison_type', namespaces=_nsmap)[0] _v = criteria.xpath('xdat:value', namespaces=_nsmap)[0] constraint = (_f.text, _o.text, _v.text) query.insert(0, constraint) for child_set in criteria_set.xpath('xdat:child_set', namespaces=_nsmap): query.insert(0, query_from_criteria_set(child_set)) return query def rpn_contraints(rpn_exp): left = [] right = [] triple = [] for i, t in enumerate(rpn_exp.split()): if t in ['AND', 'OR']: if 'AND' in right or 'OR' in right and left == []: try: operator = right.pop(right.index('AND')) except: operator = right.pop(right.index('OR')) left = [right[0]] left.append(right[1:] + [t]) left.append(operator) right = [] elif right != []: right.append(t) if left != []: left.append(right) else: left = right[:] right = [] elif right == [] and left != []: left = [left] left.append(t) right = left[:] left = [] else: raise ProgrammingError('in expression %s' % rpn_exp) else: triple.append(t) if len(triple) == 3: right.append(tuple(triple)) triple = [] return left if left != [] else right # --------------------------------------------------------------- class SearchManager(object): """ Search interface. Handles operations to save and get back searches on the server. Examples -------- >>> row = 'xnat:subjectData' >>> columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID' ] >>> criteria = [('xnat:subjectData/SUBJECT_ID', 'LIKE', '*'), 'AND' ] >>> interface.manage.search.save('mysearch', row, columns, criteria, sharing='public', description='my first search' ) """ def __init__(self, interface): self._intf = interface def _save_search(self, row, columns, constraints, name, desc, sharing): self._intf._get_entry_point() name = name.replace(' ', '_') if sharing == 'private': users = [self._intf._user] elif sharing == 'public': users = [] elif isinstance(sharing, list): users = sharing else: raise NotSupportedError('Share mode %s not valid' % sharing) self._intf._exec( '%s/search/saved/%s?inbody=true' % (self._intf._entry, name), method='PUT', body=build_search_document(row, columns, constraints, name, desc.replace('%', '%%'), users ) ) def save(self, name, row, columns, constraints, sharing='private', description=''): """ Saves a query on the XNAT server. Parameters ---------- name: string Name of the query displayed on the Web Interface and used to get back the results. row: string Datatype from `Interface.inspect.datatypes()`. Usually ``xnat:subjectData`` columns: list List of data fields from `Interface.inspect.datatypes('*', '*')` constraints: list See also: `Search.where()` sharing: string | list Define by whom the query is visible. If sharing is a string it may be either ``private`` or ``public``. Otherwise a list of valid logins for the XNAT server from `Interface.users()`. See Also -------- Search.where """ self._save_search(row, columns, constraints, name, description, sharing) def saved(self, with_description=False): """ Returns the names of accessible saved search on the server. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) if with_description: return [(ld['brief_description'], ld['description'].replace('%%', '%')) for ld in get_selection(jdata, ['brief_description', 'description' ] ) if not ld['brief_description'].startswith('template_')] else: return [name for name in get_column(jdata, 'brief_description') if not name.startswith('template_')] def get(self, name, out_format='results'): """ Returns the results of the query saved on the XNAT server or the query itself to know what it does. Parameters ---------- name: string Name of the saved search. An exception is raised if the name does not exist. out_format: string Can take the following values: - results to download the results of the search - xml to download the XML document defining the search - query to get the pyxnat representation of the search """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) try: search_id = get_where(jdata, brief_description=name)[0]['id'] except IndexError: raise DatabaseError('%s not found' % name) if out_format in ['xml', 'query']: bundle = self._intf._exec( '%s/search/saved/%s' % (self._intf._entry, search_id ), 'GET') if out_format == 'xml': return bundle else: return query_from_xml(bundle) content = self._intf._exec( '%s/search/saved/%s/results?format=csv' % (self._intf._entry, search_id), 'GET') results = csv.reader(StringIO(content), delimiter=',', quotechar='"') headers = results.next() return JsonTable([dict(zip(headers, res)) for res in results ], headers ) def delete(self, name): """ Removes the search from the server. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) try: search_id = get_where(jdata, brief_description=name)[0]['id'] except IndexError: raise DatabaseError('%s not found' % name) self._intf._exec('%s/search/saved/%s' % (self._intf._entry, search_id ), 'DELETE') def save_template(self, name, row=None, columns=[], constraints=[], sharing='private', description=''): """ Define and save a search template. Same as the save method, but the values in the constraints are used as keywords for value replacement when using the template. Parameters ---------- name: string Name under which the template is save in XNAT. A 'template_' is prepended to the name so that it appear clearly as a template on the web interface. row: string Datatype from `Interface.inspect.datatypes()`. Usually ``xnat:subjectData`` columns: list List of data fields from `Interface.inspect.datatypes('*', '*')` constraints: list See also: `Search.where()`, values are keywords for the template sharing: string | list Define by whom the query is visible. If sharing is a string it may be either ``private`` or ``public``. Otherwise a list of valid logins for the XNAT server from `Interface.users()`. """ def _make_template(query): query_template = [] for constraint in query: if isinstance(constraint, tuple): query_template.append((constraint[0], constraint[1], '%%(%s)s' % constraint[2]) ) elif isinstance(constraint, (unicode, str)): query_template.append(constraint) elif isinstance(constraint, list): query_template.append(_make_template(constraint)) else: raise ProgrammingError('Unrecognized token ' 'in query: %s' % constraint ) return query_template self._save_search( row, columns, _make_template(constraints), 'template_%s' % name, description, sharing ) def saved_templates(self, with_description=False): """ Returns the names of accessible saved search templates on the server. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) if with_description: return [ (ld['brief_description'].split('template_')[1], ld['description'].replace('%%', '%') ) for ld in get_selection(jdata, ['brief_description', 'description' ] ) if ld['brief_description'].startswith('template_') ] else: return [name.split('template_')[1] for name in get_column(jdata, 'brief_description') if name.startswith('template_')] def use_template(self, name, values): """ Parameters ---------- name: string Name of the template. values: dict Values to put in the template, get the valid keys using the get_template method. Examples -------- >>> interface.manage.search.use_template(name, {'subject_id':'ID', 'age':'32' }) """ self._intf._get_entry_point() bundle = self.get_template(name, True) % values # have to remove search_id information before re-posting it _query = query_from_xml(bundle) bundle = build_search_document(_query['row'], _query['columns'], _query['constraints'] ) content = self._intf._exec( "%s/search?format=csv" % self._intf._entry, 'POST', bundle) results = csv.reader(StringIO(content), delimiter=',', quotechar='"') headers = results.next() return JsonTable([dict(zip(headers, res)) for res in results ], headers ) def get_template(self, name, as_xml=False): """ Get a saved template, either as an xml document, or as a pyxnat representation, with the keys to be used in the template between the parentheses in %()s. Parameters ---------- name: str Name under which the template is saved as_xml: boolean If True returns an XML document, else return a list of constraints. Defaults to False. """ self._intf._get_entry_point() jdata = self._intf._get_json( '%s/search/saved?format=json' % self._intf._entry) try: search_id = get_where(jdata, brief_description='template_%s' % name )[0]['id'] except IndexError: raise DatabaseError('%s not found' % name) bundle = self._intf._exec( '%s/search/saved/%s' % (self._intf._entry, search_id ), 'GET') if as_xml: return bundle else: _query = query_from_xml(bundle) return _query['row'], _query['columns'], _query['constraints'], _query['description'] def delete_template(self, name): """ Deletes a search template. """ self.delete('template_%s' % name) def eval_rpn_exp(self, rpnexp): return rpn_contraints(rpnexp) class Search(object): """ Define constraints to make a complex search on the database. This :class:`Search` is available at different places throughout the API: >>> interface.select(DATA_SELECTION).where(QUERY) >>> interface.manage.search.save('name', TABLE_DEFINITION, QUERY) Examples -------- >>> query = [('xnat:subjectData/SUBJECT_ID', 'LIKE', '%'), ('xnat:projectData/ID', '=', 'my_project'), [('xnat:subjectData/AGE', '>', '14'), 'AND' ], 'OR' ] """ def __init__(self, row, columns, interface): """ Configure the result table. Parameters ---------- row: string The returned table will have one line for every matching occurence of this type. e.g. xnat:subjectData --> table with one line per matching subject columns: list The returned table will have all the given columns. """ self._row = row self._columns = columns self._intf = interface def where(self, constraints=None, template=None, query=None): """ Triggers the search. Parameters ---------- contraints: list A query is an unordered list that contains - 1 or more constraints - 0 or more sub-queries (lists as this one) - 1 comparison method between the constraints ('AND' or 'OR') A constraint is an ordered tuple that contains - 1 valid searchable_type/searchable_field - 1 operator among '=', '<', '>', '<=', '>=', 'LIKE' Returns ------- results: JsonTable object An table-like object containing the results. It is basically a list of dictionaries that has additional helper methods. """ self._intf._get_entry_point() if isinstance(constraints, (str, unicode)): constraints = rpn_contraints(constraints) elif isinstance(template, (tuple)): tmp_bundle = self._intf.manage.search.get_template( template[0], True) tmp_bundle = tmp_bundle % template[1] constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(query, (str, unicode)): tmp_bundle = self._intf.manage.search.get(query, 'xml') constraints = query_from_xml(tmp_bundle)['constraints'] elif isinstance(constraints, list): pass else: raise ProgrammingError('One of contraints, template and query' 'parameters must be correctly set.') bundle = build_search_document(self._row, self._columns, constraints) content = self._intf._exec( "%s/search?format=csv" % self._intf._entry, 'POST', bundle) if is_xnat_error(content): catch_error(content) results = csv.reader(StringIO(content), delimiter=',', quotechar='"') headers = results.next() headers_of_interest = [] for column in self._columns: headers_of_interest.append( difflib.get_close_matches( column.split(self._row + '/')[0].lower() \ or column.split(self._row + '/')[1].lower(), headers)[0] ) if len(self._columns) != len(headers_of_interest): raise DataError('unvalid response headers') return JsonTable([dict(zip(headers, res)) for res in results], headers_of_interest).select(headers_of_interest) def all(self): return self.where([(self._row + '/ID', 'LIKE', '%'), 'AND']) pyxnat-0.9.0~dev0/pyxnat/core/select.py000066400000000000000000000347651163242155400201460ustar00rootroot00000000000000import re from . import schema from .search import Search from .resources import CObject, Project, Projects # imports used implicitly from .uriutil import inv_translate_uri, check_entry # from .uriutil import uri_last from .errors import ProgrammingError DEBUG = False def is_type_level(element): return element.strip('/') in schema.resources_types and \ not is_expand_level(element) def is_singular_type_level(element): return element.strip('/') in schema.resources_singular and \ not is_expand_level(element) def is_expand_level(element): return element.startswith('//') and \ element.strip('/') in schema.resources_types def is_id_level(element): return element is not None and \ element.strip('/') not in schema.resources_types def is_wildid_level(element): return element is not None and \ element.strip('/') not in schema.resources_types and \ ('?' in element or '*' in element) def expand_level(element, fullpath): def find_paths(element, path=[]): resources_dict = schema.resources_tree element = element.strip('/') paths = [] if path == []: path = [element] init_path = path[:] for key in resources_dict.keys(): path = init_path[:] if element in resources_dict[key]: path.append(key) look_again = find_paths(key, path) if look_again != []: paths.extend(look_again) else: path.reverse() paths.append('/' + '/'.join(path)) return paths absolute_paths = find_paths(element) els = re.findall('/{1,2}.*?(?=/{1,2}|$)', fullpath) index = els.index(element) if index == 0: return absolute_paths else: for i in range(1, 4): if is_type_level(els[index - i]) or is_expand_level(els[index - i]): parent_level = els[index - i] break if parent_level.strip('/') in schema.resources_singular: parent_level += 's' return [abspath.split(parent_level)[1] for abspath in absolute_paths if parent_level in abspath] def mtransform(paths): tpaths = [] for path in paths: els = re.findall('/{1,2}.*?(?=/{1,2}|$)', path) tels = [] ignore_path = False for i, curr_el in enumerate(els): if i + 1 < len(els): next_el = els[i + 1] else: next_el = None if is_type_level(curr_el): if not is_id_level(next_el): if not is_singular_type_level(curr_el): tels.append(curr_el) tels.append('/*') else: tels.append(curr_el + 's') tels.append('/*') else: if not is_singular_type_level(curr_el): if not is_wildid_level(next_el): tels.append(curr_el.rstrip('s')) else: tels.append(curr_el) else: if not is_wildid_level(next_el): tels.append(curr_el) else: tels.append(curr_el + 's') elif is_expand_level(curr_el): exp_paths = [''.join(els[:i] + [rel_path] + els[i + 1:]) for rel_path in expand_level(curr_el, path) ] tpaths.extend(mtransform(exp_paths)) ignore_path = True break elif is_id_level(curr_el): tels.append(curr_el) else: raise ProgrammingError('in %s' % path) if not ignore_path: tpaths.append(''.join(tels)) return tpaths def group_paths(paths): groups = {} for path in paths: resources = [el for el in re.findall('/{1,2}.*?(?=/{1,2}|$)', path) if el.strip('/') in schema.resources_types \ and el.strip('/') not in ['files', 'file'] ] if len(resources) == 1: groups.setdefault(resources[0], set()).add(path) continue for alt_path in paths: if alt_path.endswith(path): alt_rsc = \ [el for el in re.findall('/{1,2}.*?(?=/{1,2}|$)', alt_path ) if el.strip('/') in schema.resources_types \ and el.strip('/') not in ['files', 'file'] ] if alt_rsc[-1].strip('/') in \ ['files', 'file', 'resources', 'resource'] + \ schema.rest_translation.keys(): groups.setdefault(alt_rsc[-2] + alt_rsc[-1], set() ).add(alt_path) else: groups.setdefault(alt_rsc[-1], set()).add(alt_path) return groups def compute(path): if not re.match('/project(s)?|//.+', path): path = '/' + path path = inv_translate_uri(path) try: groups = group_paths(mtransform([path])) except: raise ProgrammingError('in %s' % path) best = [] for name in groups: lightest = (0, None) for path in groups[name]: score = len(path.split('/')) if lightest == (0, None) or lightest[0] > score: lightest = (score, path) best.append(lightest[1]) return best class Select(object): """ Data selection interface. Callable object that indicates the data to be returned to the user. Examples -------- Select with a path: >>> interface.select('/projects/myproj/subjects').get() Select with a datatype: >>> columns = ['xnat:subjectData/PROJECT', 'xnat:subjectData/SUBJECT_ID' ] >>> criteria = [('xnat:subjectData/SUBJECT_ID', 'LIKE', '*'), 'AND' ] >>> interface.select('xnat:subjectData', columns ).where(criteria) """ def __init__(self, interface): """ Parameters ---------- interface: :class:`Interface` Main interface reference. """ self._intf = interface def project(self, ID): """ Access a particular project. Parameters ---------- ID: string ID of the project. """ self._intf._get_entry_point() return globals()['Project']( '%s/projects/%s' % (self._intf._entry, ID), self._intf) def projects(self, id_filter='*'): """ Returns the list of all visible projects for the server. Parameters ---------- id_filter: string Name pattern to filter the returned projects. """ self._intf._get_entry_point() return globals()['Projects']( '%s/projects' % self._intf._entry, self._intf, id_filter) def experiments(self, project_id=None, subject_id=None, subject_label=None , experiment_type='xnat:mrSessionData' , columns=None , constraints=None ): """ Returns a list of all visible experiment IDs of the specified type, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_type: string xsi path type must be a leaf session type. defaults to 'xnat:mrSessionData' columns: List[string] list of xsi paths for names of columns to return. constraints: list[(tupple)] List of tupples for comparison in the form (key, comparison, value) valid comparisons are: =, <, <=,>,>=, LIKE """ if columns is None: columns = [] where_clause = [] if project_id is not None: where_clause.append(('%s/project' % experiment_type, "=", project_id)) if subject_id is not None: where_clause.append(('xnat:subjectData/ID', "=", subject_id)) if subject_label is not None: where_clause.append(('xnat:subjectData/LABEL', "=", subject_label)) if constraints is not None: where_clause.extend(constraints) if where_clause != []: where_clause.append('AND') if where_clause != []: print where_clause table = self.__call__(experiment_type, columns=columns).where(where_clause) return table else: table = self.__call__(experiment_type, columns=columns) return table.all() pass def scans(self, project_id=None, subject_id=None, subject_label=None, experiment_id=None, experiment_label=None, experiment_type='xnat:imageSessionData', scan_type='xnat:imageScanData', columns=None, constraints=None ): """ Returns a list of all visible scan IDs of the specified type, filtered by optional constraints. Parameters ---------- project_id: string Name pattern to filter by project ID. subject_id: string Name pattern to filter by subject ID. subject_label: string Name pattern to filter by subject ID. experiment_id: string Name pattern to filter by experiment ID. experiment_label: string Name pattern to filter by experiment ID. experiment_type: string xsi path type; e.g. 'xnat:mrSessionData' scan_type: string xsi path type; e.g. 'xnat:mrScanData', etc. constraints: dict Dictionary of xsi_type (key--) and parameter (--value) pairs by which to filter. """ if constraints is None: constraints = {} uri = '/data/experiments?xsiType=%s' % experiment_type if project_id is not None: uri += '&project=%s' % project_id if subject_id is not None: uri += '&subject_id=%s' % subject_id if subject_label is not None: uri += '&subject_label=%s' % subject_label if experiment_id is not None: uri += '&ID=%s' % experiment_id if experiment_label is not None: uri += '&label=%s' % experiment_label uri += '&columns=ID,project,subject_id,%s/ID' % scan_type if constraints != {}: uri += ',' + ','.join(constraints.keys()) if columns is not None: uri += ',' + ','.join(columns) c = {} [c.setdefault(key.lower(), value) for key, value in constraints.items() ] return JsonTable(self._intf._get_json(uri)).where(**c) def tag(self, name): self._intf._get_entry_point() return self._intf.manage.tags.get(name).references() def tags(self): self._intf._get_entry_point() return self._intf.manage.tags() def __repr__(self): return '' def __call__(self, datatype_or_path, columns=[]): """ Select clause to specify what type of data is to be returned. Parameters ---------- datatype_or_path: string Can either be a resource path or a datatype: - when a path, REST resources are returned, the `columns` argument is useless. - when a datatype, a search Object is returned, the `columns` argument has to be specified. columns: list List of fieldtypes e.g. xnat:subjectData/SUBJECT_ID Datatype and columns are used to specify the search table that has to be returned. Use the method `where` on the `Search` object to trigger a search on the database. """ self._intf._get_entry_point() if datatype_or_path.startswith('/tag'): if len(datatype_or_path.split('/')) == 3: return self.tag(datatype_or_path.split('/')[-1]) else: return self.tags() if datatype_or_path in ['/', '//', self._intf._entry]: return self if datatype_or_path.startswith(self._intf._entry): datatype_or_path = datatype_or_path.split( self._intf._entry, 1)[1] if datatype_or_path.startswith('/'): return_list = [] try: for path in compute(datatype_or_path): if DEBUG: print 'path: %s' % path pairs = zip(path.split('/')[1::2], path.split('/')[2::2]) # # in case a level id has a / - allowed for files only # if len(path.split('/')[1:]) % 2 == 1 \ # and uri_last(path) not in schema.resources_types: # pairs[-1] = (pairs[-1][0], uri_last(path)) obj = self for resource, identifier in pairs: if isinstance(obj, list): obj = [getattr(sobj, resource)(identifier) for sobj in obj] else: obj = getattr(obj, resource)(identifier) return_list.append(obj) if len(return_list) == 1: return return_list[0] else: return CObject(return_list, self._intf) except Exception, e: if DEBUG: print e raise ProgrammingError('in %s' % datatype_or_path) else: if columns == []: columns = self._intf.inspect.datatypes(datatype_or_path) return Search(datatype_or_path, columns, self._intf) pyxnat-0.9.0~dev0/pyxnat/core/tags.py000066400000000000000000000067061163242155400176170ustar00rootroot00000000000000import os import tempfile from .jsonutil import JsonTable, csv_to_json from .resources import CObject class Tags(object): """ Database tags sub-interface. It is meant to be an attribute of the main Interface class. """ def __init__(self, interface): self._intf = interface self._meta_project = None def __call__(self): self._init() return self._meta_project.subject(self._intf._user ).resource('tags').files().get() def _init(self): if self._meta_project is None: self._meta_project = \ self._intf.select.project('metabase_%s' % self._intf._user) if self._meta_project.accessibility() != 'private': self._meta_project.set_accessibility('private') if not self._meta_project.exists(): self._meta_project.create() self._meta_project.set_accessibility('private') def new(self, name): return self.get(name).create() def delete(self, name): self.get(name).delete() def get(self, name): return Tag(name, self._intf) def share(self, other_user): if self._intf.select.project('metabase_%s' % other_user).exists(): self._meta_project.subject(self._intf._user ).share('metabase_%s' % other_user) class Tag(object): def __init__(self, name, interface): self._name = name self._intf = interface self._intf.manage.tags._init() self._file = self._intf.manage.tags._meta_project.subject( self._intf._user).resource('tags').file(name) def __repr__(self): return ' %s'%self._name def _read(self): fd = open(self._file.get(), 'rb') jtag = JsonTable(csv_to_json(fd.read())) fd.close() return jtag def create(self): if not self.exists(): jtag = JsonTable([]) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) return self def delete(self): if self.exists(): self._file.delete() def exists(self): return self._file.exists() def dereference(self, uri): jtag = self._read() tmp = tempfile.mkstemp()[1] jtag.where_not(URI=uri).dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def dereference_many(self, uris=[]): jtag = self._read() for uri in uris: jtag = jtag.where_not(URI=uri) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def reference(self, uri): uri = self._intf.select(uri)._uri jtag = self._read() if uri not in jtag.get('URI', always_list=True): jtag.data.append({'URI':uri}) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def reference_many(self, uris=[]): jtag = self._read() for uri in uris: jtag.data.append({'URI':uri}) tmp = tempfile.mkstemp()[1] jtag.dump_csv(tmp) self._file.put(tmp) os.remove(tmp) def references(self, show_uris=False): jtag = self._read() uris = jtag.get('URI', always_list=True) if not show_uris: return CObject(uris, self._intf) return uris pyxnat-0.9.0~dev0/pyxnat/core/uriutil.py000066400000000000000000000066371163242155400203610ustar00rootroot00000000000000import os import re from .schema import rest_translation # from .schema import resources_types def translate_uri(uri): segs = uri.split('/') for key in rest_translation.keys(): if key in segs[-2:]: uri = uri.replace(key, rest_translation[key]) return uri def inv_translate_uri(uri): inv_table = dict(zip(rest_translation.values(), rest_translation.keys())) for key in inv_table.keys(): uri = uri.replace('/%s' % key, '/%s' % inv_table[key]) return uri def join_uri(uri, *segments): return '/'.join(uri.split('/') + \ [seg.lstrip('/') for seg in segments]).rstrip('/') def uri_last(uri): # return uri.split(uri_parent(uri))[1].strip('/') return uri.split('/')[-1] def uri_nextlast(uri): # return uri_last(uri.split(uri_last(uri))[0].strip('/')) return uri.split('/')[-2] def uri_parent(uri): # parent = uri # if not os.path.split(uri)[1] in resources_types: # while os.path.split(parent)[1] not in resources_types: # parent = os.path.split(parent)[0] # return parent return uri_split(uri)[0] def uri_grandparent(uri): return uri_parent(uri_parent(uri)) def uri_split(uri): return uri.rsplit('/', 1) def uri_segment(uri, start=None, end=None): if start is None and end is None: return uri elif start is None: return '/'+'/'.join(uri.split('/')[:end]) elif end is None: return '/'+'/'.join(uri.split('/')[start:]) else: return '/'+'/'.join(uri.split('/')[start:end]) def uri_shape(uri): kwid_map = dict(zip(uri.split('/')[1::2], uri.split('/')[2::2])) shapes = {} for kw in kwid_map: seps = kwid_map[kw] for char in re.findall('[a-zA-Z0-9]', seps): seps = seps.replace(char, '') chunks = [] for chunk in re.split('|'.join(seps), kwid_map[kw]): try: float(chunk) chunk = '*' except: pass chunks.append(chunk) shapes[kw] = '?'.join(chunks) return make_uri(shapes) def make_uri(_dict): uri = '' kws = ['projects', 'subjects', 'experiments', 'assessors', 'reconstructions', 'scans', 'resources', 'in_resources', 'out_resources', 'files', 'in_files', 'out_files'] for kw in kws: if _dict.has_key(kw): uri += '/%s/%s' % (kw, _dict.get(kw)) return uri def check_entry(func): def inner(*args, **kwargs): args[0]._intf._get_entry_point() return func(*args, **kwargs) return inner def extract_uri(uri) : """ Destructure the given REST uri into project,subject and experiment. Returns None if any one of project,subject or experiment is unspecified in the URI and a (project,subject,experiment) triple otherwise. """ split = uri.split(os.sep) # a well qualified uri has a project subject, and experiment name # so when split the following items should be present: # ['', 'data', 'projects', 'project-name', 'subjects', 'subject-name', 'experiments', 'experiment-name', 'scans'] # Based on the above comment if there aren't 9 items in the split list the uri isn't well qualified if (len(split) != 9): return None project = split[3] subject = split[5] experiment = split[7] return (project,subject,experiment) pyxnat-0.9.0~dev0/pyxnat/core/users.py000066400000000000000000000046201163242155400200130ustar00rootroot00000000000000from .uriutil import check_entry from .jsonutil import JsonTable class Users(object): """ Database user management interface. It is used to retrieve information on users registered on a server. .. note:: At the moment user creation and deletion is not supported through the REST API but it will be at some point. Examples -------- >>> interface.manage.users() ['list_of_users'] >>> interface.manage.users.firstname('nosetests') 'nose' See Also -------- Project.users() Project.add_user() Project.remove_user() """ def __init__(self, interface): """ Parameters ---------- interface: :class:`Interface` Main interface reference. """ self._intf = interface def __call__(self): """ Returns the list of all registered users on the server. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).get('login', always_list=True) def firstname(self, login): """ Returns the firstname of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['firstname'] def lastname(self, login): """ Returns the lastname of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['lastname'] def id(self, login): """ Returns the id of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['xdat_user_id'] def email(self, login): """ Returns the email of the user. """ self._intf._get_entry_point() return JsonTable(self._intf._get_json('%s/users' % self._intf._entry) ).where(login=login)['email'] def resources(self): """ Returns the resources of the user. """ self._intf._get_entry_point() print self._intf._get_json( '%s/user/cache/resources' % self._intf._entry) pyxnat-0.9.0~dev0/pyxnat/core/xpass.py000066400000000000000000000035601163242155400200120ustar00rootroot00000000000000import os from functools import partial # default path to xnat pass file def path(): return os.getenv('USERPROFILE') or os.getenv('HOME') + "/.xnatPass" # str -> {'host': ..., 'u': ..., 'p': ..., 'port': ...} | None def read_xnat_pass(f): if os.path.exists(f) and os.path.isfile(f): infile = open(f) return parse_xnat_pass(infile.readlines()) else: # raise IOError('XNAT Pass file :' + f + " does not exist") return None # [str] -> {'host': ..., 'u': ..., 'p': ..., 'port':...} | None def parse_xnat_pass(lines): empty = {'host': None, 'u': None, 'p': None} line = find_plus_line(lines) u = ('u',partial(find_token,'@'),True) host = ('host',partial(find_token,'='),True) p = ('p',partial(lambda x : (x,x)),True) def update_state(x,k,state): state[k] = x return state if line == None: return None else: return chain([u,host,p],line,empty,update_state) # [(str, str -> str, bool)] -> # str -> # dict # dict -> dict # dict | None def chain(ops, initEnv, initState, update_statef): env = initEnv state = initState for op in ops: (k,_op,mandatory) = op tmp = _op(env) if tmp == None: if mandatory: return None else: (v,rest) = tmp env = rest state = update_statef(v,k,state) return state # [str] -> str | None def find_plus_line(lines): plusLines = filter (lambda x: x.startswith('+'), lines) if len(plusLines) == 0: return None else: return plusLines[0][1:] # char -> str -> (str,str) | None def find_token(tok,line): splitString = map(lambda x: x.strip(), line.split(tok)) if len(splitString) == 0 or len(splitString) == 1 or splitString[0] == '': return None else: return (splitString[0],splitString[1]) pyxnat-0.9.0~dev0/pyxnat/core/xpath_store.py000066400000000000000000000126571163242155400212230ustar00rootroot00000000000000import re from datetime import datetime from os import path from glob import iglob from lxml import etree from .jsonutil import JsonTable def get_subject_id(location): f = open(location, 'rb') content = f.read() f.close() subject = re.findall(' %s' % in_image[-120:] Popen('bet2 %s %s -f 0.5 -g 0 ' % (in_image, out_image), shell=True).communicate() return out_image def notify(message): print '<== %s'%message[-120:] pool = Pool(processes=8) for adni_mprage in interface.select('//experiments/*SessionA*' '/assessors/*ADNI*/out/resources/files' ).where('psytool:tci_parentData/TCI051 = 1 AND'): pool.apply_async(bet, (adni_mprage.get(),), callback=notify) pool.close() pool.join() pyxnat-0.9.0~dev0/pyxnat/tests/000077500000000000000000000000001163242155400165105ustar00rootroot00000000000000pyxnat-0.9.0~dev0/pyxnat/tests/__init__.py000066400000000000000000000000001163242155400206070ustar00rootroot00000000000000pyxnat-0.9.0~dev0/pyxnat/tests/attributes_test.py000066400000000000000000000033631163242155400223140ustar00rootroot00000000000000import os from uuid import uuid1 from .. import Interface _modulepath = os.path.dirname(os.path.abspath(__file__)) central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') sid = uuid1().hex eid = uuid1().hex subject = central.select.project('nosetests').subject(sid) experiment = subject.experiment(eid) def test_fancy_resource_create(): field_data = {'experiment':'xnat:mrSessionData', 'ID':'TEST_%s' % eid, 'xnat:mrSessionData/age':'42', 'xnat:subjectData/investigator/lastname':'doe', 'xnat:subjectData/investigator/firstname':'john', 'xnat:subjectData/ID': 'TEST_%s' % sid, } experiment.create(**field_data) print subject.id() assert subject.exists() print experiment.id() assert experiment.exists() globals()['subject'] = experiment.parent() globals()['experiment'] = experiment def test_attr_get(): assert experiment.attrs.get('xnat:mrSessionData/age') == '42.0' def test_attr_mget(): fields = ['xnat:subjectData/investigator/firstname', 'xnat:subjectData/investigator/lastname' ] assert subject.attrs.mget(fields) == ['john', 'doe'] def test_attr_set(): experiment.attrs.set('xnat:mrSessionData/age', '26') assert experiment.attrs.get('xnat:mrSessionData/age') == '26.0' def test_attr_mset(): field_data = {'xnat:subjectData/investigator/firstname':'angus', 'xnat:subjectData/investigator/lastname':'young', } subject.attrs.mset(field_data) assert set(subject.attrs.mget(field_data.keys())) == \ set(['angus', 'young']) def test_cleanup(): subject.delete() assert not subject.exists() pyxnat-0.9.0~dev0/pyxnat/tests/custom_variables_test.py000066400000000000000000000015641163242155400234710ustar00rootroot00000000000000from uuid import uuid1 from .. import Interface central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') project = central.select('/project/nosetests') variables = {'Subjects' : {'newgroup' : {'foo' : 'string', 'bar' : 'int'}}} sid = uuid1().hex eid = uuid1().hex cid = uuid1().hex scan = project.subject(sid).experiment(eid).scan(cid).insert(use_label=True) # def test_add_custom_variables(): # project.add_custom_variables(variables) # def test_get_custom_variables(): # assert project.get_custom_variables() == variables def test_set_param(): scan.set_param('foo', 'foostring') scan.set_param('bar', '1') assert scan.params() == ['foo', 'bar'] def test_get_params(): assert scan.get_params() == ['foostring', '1'] def test_params_cleanup(): project.subject(sid).delete() assert not project.subject(sid).exists() pyxnat-0.9.0~dev0/pyxnat/tests/experiments_tests.py000066400000000000000000000006151163242155400226510ustar00rootroot00000000000000import os from .. import Interface _modulepath = os.path.dirname(os.path.abspath(__file__)) central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') def test_global_experiment_listing(): assert central.array.experiments(project_id='CENTRAL_OASIS_CS', experiment_type='xnat:mrSessionData', ) pyxnat-0.9.0~dev0/pyxnat/tests/hello_xnat.txt000066400000000000000000000000141163242155400214010ustar00rootroot00000000000000Hello XNAT! pyxnat-0.9.0~dev0/pyxnat/tests/interfaces_test.py000066400000000000000000000021031163242155400222400ustar00rootroot00000000000000from uuid import uuid1 from .. import Interface central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') def test_simple_object_listing(): assert isinstance(central.select.projects().get(), list) def test_simple_path_listing(): assert isinstance(central.select('/projects').get(), list) def test_nested_object_listing(): assert isinstance(central.select.projects('*OASIS*').subjects().get(), list) def test_nested_path_listing(): assert isinstance(central.select('/projects/*OASIS*/subjects').get(), list) def test_nested_for_access(): stop = False for subject in central.select('/projects/*OASIS*/subjects'): for f in subject.experiments().scans().resources().files(): assert isinstance(f._uri, (str, unicode)) stop =True break if stop: break def test_seach_access(): constraints = [('xnat:subjectData/PROJECT', '=', 'CENTRAL_OASIS_CS'), 'AND'] for subject in central.select('//subjects').where(constraints): assert '/projects/CENTRAL_OASIS_CS' in subject._uri pyxnat-0.9.0~dev0/pyxnat/tests/jsonutil_test.py000066400000000000000000000024161163242155400217730ustar00rootroot00000000000000import os import tempfile from .. import jsonutil _csv_example = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'results.csv') _list_of_dirs = jsonutil.csv_to_json(open(_csv_example, 'rb').read()) jtable = jsonutil.JsonTable(_list_of_dirs) # coverage_tests def test_dump_methods(): jtable.dumps_csv() jtable.dumps_json() jtable.dump_csv(tempfile.mkstemp()[1]) jtable.dump_json(tempfile.mkstemp()[1]) jtable.where(psytool_audit_parentdata_audit9='0', psytool_audit_parentdata_audit2='0', psytool_audit_parentdata_audit1='2', psytool_audit_parentdata_audit10='2') jtable.where('5154') assert True # unit_tests def test_get_item_str_value(): assert jtable['subject_label'] == jtable.get('subject_label') def test_get_item_int_value(): assert jtable.data[0] == jtable[0].data[0] def test_get_item_list_value(): assert set(jtable[['projects', 'subjectid']].headers()) == set(['projects', 'subjectid']) def test_join(): index = jtable.headers().index('subjectid') a = jtable.select(jtable.headers()[:index+1]) b = jtable.select(jtable.headers()[index:]) c = a.join('subjectid', b) assert len(jtable.headers()) == len(c.headers()) pyxnat-0.9.0~dev0/pyxnat/tests/manage_test.py000066400000000000000000000007701163242155400213550ustar00rootroot00000000000000from .. import Interface central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') notified = [] def notify(cobj, eobj): notified.append(eobj) def test_register_callback(): local_notified = [] central.manage.register_callback(notify) for element in central.select('/projects'): local_notified.append(element) assert notified == local_notified def test_unregister_callback(): central.manage.unregister_callback() assert central._callback is None pyxnat-0.9.0~dev0/pyxnat/tests/provenance_test.py000066400000000000000000000015501163242155400222620ustar00rootroot00000000000000from uuid import uuid1 from .. import Interface central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') project = central.select('/project/nosetests') prov = { 'program':'young', 'timestamp':'2011-03-01T12:01:01.897987', 'user':'angus', 'machine':'war', 'platform':'linux', } sid = uuid1().hex eid = uuid1().hex aid = uuid1().hex assessor = project.subject(sid).experiment(eid).assessor( aid).insert(use_label=True) def test_provenance(): assessor.provenance.set(prov) _prov = assessor.provenance.get()[0] assert prov['program'] == _prov['program'] def test_del_provenance(): assessor.provenance.delete() print assessor.provenance.get() assert assessor.provenance.get()[0] == [] def test_provenance_cleanup(): project.subject(sid).delete() assert not project.subject(sid).exists() pyxnat-0.9.0~dev0/pyxnat/tests/resources_test.py000066400000000000000000000147731163242155400221470ustar00rootroot00000000000000import os import socket import platform import tempfile from uuid import uuid1 from .. import Interface _modulepath = os.path.dirname(os.path.abspath(__file__)) central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') _id_set1 = { 'sid':uuid1().hex, 'eid':uuid1().hex, 'aid':uuid1().hex, 'cid':uuid1().hex, 'rid':uuid1().hex, } _id_set2 = { 'sid':uuid1().hex, 'eid':uuid1().hex, 'aid':uuid1().hex, 'cid':uuid1().hex, 'rid':uuid1().hex, } subj_1 = central.select.project('nosetests').subject(_id_set1['sid']) expe_1 = subj_1.experiment(_id_set1['eid']) asse_1 = expe_1.assessor(_id_set1['aid']) scan_1 = expe_1.scan(_id_set1['cid']) reco_1 = expe_1.reconstruction(_id_set1['rid']) def test_subject_create(): assert not subj_1.exists() subj_1.create() assert subj_1.exists() def test_experiment_create(): assert not expe_1.exists() expe_1.create() assert expe_1.exists() def test_assessor_create(): assert not asse_1.exists() asse_1.create() assert asse_1.exists() def test_scan_create(): assert not scan_1.exists() scan_1.create() assert scan_1.exists() def test_reconstruction_create(): assert not reco_1.exists() reco_1.create() assert reco_1.exists() def test_provenance(): reco_1.provenance.set({'program':'nosetests'}) assert reco_1.provenance.get()[0]['program'] == 'nosetests' def test_multi_create(): asse_2 = central.select('/projects/nosetests/subjects/%(sid)s' '/experiments/%(eid)s' '/assessors/%(aid)s' % _id_set2 ) expe_2 = central.select('/projects/nosetests/subjects/%(sid)s' '/experiments/%(eid)s'%_id_set2 ) assert not asse_2.exists() asse_2.create(experiments='xnat:petSessionData', assessors='xnat:petAssessorData') assert asse_2.exists() assert asse_2.datatype() == 'xnat:petAssessorData' assert expe_2.datatype() == 'xnat:petSessionData' scan_2 = central.select('/projects/nosetests/subjects/%(sid)s' '/experiments/%(eid)s/scans/%(cid)s' % _id_set2 ).create() assert scan_2.datatype() == 'xnat:mrScanData' #def test_share_subject(): # assert not central.select('/projects/nosetests2' # '/subjects/%(sid)s' % _id_set1 # ).exists() # subj_1.share('nosetests2') # assert central.select('/projects/nosetests2/subjects/%(sid)s'%_id_set1 # ).exists() # assert set(subj_1.shares().get()) == set(['nosetests', 'nosetests2']) #def test_share_experiment(): # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s'%_id_set1 # ).exists() # expe_1.share('nosetests2') # assert central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s'%_id_set1 # ).exists() # assert set(expe_1.shares().get()) == set(['nosetests', 'nosetests2']) #def test_share_assessor(): # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s/assessors/%(aid)s'%_id_set1 # ).exists() # asse_1.share('nosetests2') # assert central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s/assessors/%(aid)s'%_id_set1 # ).exists() # assert set(asse_1.shares().get()) == set(['nosetests', 'nosetests2']) #def test_unshare_assessor(): # asse_1.unshare('nosetests2') # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s/assessors/%(aid)s'%_id_set1 # ).exists() # assert asse_1.shares().get() == ['nosetests'] #def test_unshare_experiment(): # expe_1.unshare('nosetests2') # assert not central.select('/projects/nosetests2/subjects/%(sid)s' # '/experiments/%(eid)s'%_id_set1 # ).exists() # assert expe_1.shares().get() == ['nosetests'] #def test_unshare_subject(): # subj_1.unshare('nosetests2') # assert not central.select('/projects/nosetests2/subjects/%(sid)s'%_id_set1 # ).exists() # assert subj_1.shares().get() == ['nosetests'] def test_put_file(): local_path = os.path.join(_modulepath, 'hello_xnat.txt') subj_1.resource('test').file('hello.txt').put(local_path) assert subj_1.resource('test').file('hello.txt').exists() assert long(subj_1.resource('test').file('hello.txt').size()) == \ os.stat(local_path).st_size def test_get_file(): fh = subj_1.resource('test').file('hello.txt') central.cache.set_usage(expiration=0) fpath = fh.get() assert os.path.exists(fpath) assert open(fpath, 'rb').read() == 'Hello XNAT!\n' custom = os.path.join(tempfile.gettempdir(), uuid1().hex) fh.get(custom) assert os.path.exists(custom) assert not os.path.exists(fpath) fh.get() assert os.path.exists(custom) os.remove(custom) def test_get_copy_file(): fpath = os.path.join(tempfile.gettempdir(), uuid1().hex) fpath = subj_1.resource('test').file('hello.txt').get_copy(fpath) assert os.path.exists(fpath) fd = open(fpath, 'rb') assert fd.read() == 'Hello XNAT!\n' fd.close() os.remove(fpath) central.cache.set_usage(expiration=1) def test_last_modified(): sid = subj_1.id() t1 = central.select('/project/nosetests').last_modified()[sid] subj_1.attrs.set('age', '26') assert subj_1.attrs.get('age') == '26' t2 = central.select('/project/nosetests').last_modified()[sid] assert t1 != t2 def test_subject1_delete(): assert subj_1.exists() subj_1.delete() assert not subj_1.exists() def test_subject2_delete(): subj_2 = central.select('/projects/nosetests/subjects/%(sid)s'%_id_set2) assert subj_2.exists() subj_2.delete() assert not subj_2.exists() def test_project_configuration(): project = central.select('/project/nosetests') assert project.quarantine_code() == 0 assert project.prearchive_code() == 0 assert project.current_arc() == 'arc001' assert 'nosetests' in project.users() assert 'nosetests' in project.owners() assert project.user_role('nosetests') == 'owner' pyxnat-0.9.0~dev0/pyxnat/tests/results.csv000066400000000000000000010462771163242155400207470ustar00rootroot00000000000000"subject_label","subjectid","insert_date","projects","project","mr_count","psytool_audit_parentdata_iteration","psytool_audit_parentdata_language","psytool_audit_parentdata_user_code_ident","psytool_audit_parentdata_completed","psytool_audit_parentdata_age_for_test","psytool_audit_parentdata_processed_age_for_test","psytool_audit_parentdata_qr_flag","psytool_audit_parentdata_qr_comment","psytool_audit_parentdata_valid","psytool_audit_parentdata_audit1","psytool_audit_parentdata_audit2","psytool_audit_parentdata_audit3","psytool_audit_parentdata_audit4","psytool_audit_parentdata_audit5","psytool_audit_parentdata_audit6","psytool_audit_parentdata_audit7","psytool_audit_parentdata_audit8","psytool_audit_parentdata_audit9","psytool_audit_parentdata_audit10","quarantine_status" "000000029814","NOSE_000000029814",2009-06-08 09:13:28.0,",","NOSE",2,1,"en","P",1,5462,5462,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000354464","NOSE_000000354464",2009-10-06 09:32:09.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000886880","NOSE_000000886880",2010-02-09 07:03:53.0,",","NOSE",2,1,"fr","P",1,5078,5078,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000298603","NOSE_000000298603",2009-05-11 17:33:10.0,",","NOSE",2,2,"de","P",1,5651,5651,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000333153","NOSE_000000333153",2010-04-12 07:04:19.0,",","NOSE",2,1,"fr","P",1,5262,5262,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000399670","NOSE_000000399670",2009-05-12 09:33:59.0,",","NOSE",2,1,"en","P",1,5195,5195,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000576275","NOSE_000000576275",2009-05-12 10:04:58.0,",","NOSE",2,1,"de","P",1,5287,5287,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000106062","NOSE_000000106062",2009-12-04 16:42:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000160957","NOSE_000000160957",2009-04-29 19:21:28.0,",","NOSE",2,1,"en","P",1,5289,5289,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000803045","NOSE_000000803045",2010-07-01 07:04:55.0,",","NOSE",2,1,"en","P",1,5175,5175,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000174454","NOSE_000000174454",2009-12-04 16:51:50.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000655126","NOSE_000000655126",2010-04-18 07:04:46.0,",","NOSE",2,1,"de","P",1,5250,5250,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000048641","NOSE_000000048641",2010-07-25 07:04:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000843073","NOSE_000000843073",2009-05-12 10:21:54.0,",","NOSE",2,1,"en","P",1,5204,5204,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000610454","NOSE_000000610454",2009-04-29 19:33:41.0,",","NOSE",2,1,"fr","P",1,5158,5158,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000744604","NOSE_000000744604",2010-05-09 07:05:35.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000216788","NOSE_000000216788",2009-09-21 20:04:36.0,",","NOSE",2,1,"de","P",1,5537,5537,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000486036","NOSE_000000486036",2009-05-12 10:38:53.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000562039","NOSE_000000562039",2009-04-29 19:39:33.0,",","NOSE",2,1,"fr","P",1,5132,5132,"Good",,"1",4,1,2,0,0,0,1,0,0,0,"active" "000000563902","NOSE_000000563902",2009-05-12 10:55:56.0,",","NOSE",2,1,"de","P",1,5136,5136,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000843668","NOSE_000000843668",2010-07-08 12:42:58.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,1,0,0,0,0,0,"active" "000000826737","NOSE_000000826737",2009-08-21 20:56:26.0,",","NOSE",2,1,"de","P",1,5153,5153,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000779499","NOSE_000000779499",2010-02-02 07:03:13.0,",","NOSE",2,1,"en","P",1,5231,5231,"Good",,,2,1,1,0,0,0,0,1,0,0,"active" "000000078092","NOSE_000000078092",2009-08-19 13:51:02.0,",","NOSE",2,2,"de","P",1,5446,5446,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000429127","NOSE_000000429127",2009-04-29 19:39:13.0,",","NOSE",2,1,"en","P",1,5368,5368,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000575214","NOSE_000000575214",2009-05-12 11:13:12.0,",","NOSE",2,1,"de","P",1,5461,5461,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000478758","NOSE_000000478758",2009-06-29 09:32:52.0,",","NOSE",2,1,"de","P",1,5091,5091,"Good",,,4,1,3,1,0,0,3,2,0,4,"active" "000000646157","NOSE_000000646157",2009-04-29 19:24:29.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000171560","NOSE_000000171560",2009-08-19 14:06:06.0,",","NOSE",2,1,"en","P",1,5358,5358,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000890315","NOSE_000000890315",2009-06-29 09:56:12.0,",","NOSE",2,1,"de","P",1,5137,5137,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000170048","NOSE_000000170048",2009-10-17 20:05:31.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000359816","NOSE_000000359816",2009-04-29 19:21:22.0,",","NOSE",2,1,"en","P",1,5378,5378,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000806880","NOSE_000000806880",2009-12-04 17:02:11.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000354188","NOSE_000000354188",2010-07-08 12:39:51.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000753588","NOSE_000000753588",2009-04-29 19:37:00.0,",","NOSE",2,1,"de","P",1,5014,5014,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000785864","NOSE_000000785864",2009-05-12 11:56:24.0,",","NOSE",2,1,"de","P",1,5275,5275,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000119365","NOSE_000000119365",2009-04-29 19:38:38.0,",","NOSE",2,1,"de","P",1,4968,4968,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000762347","NOSE_000000762347",2009-04-29 19:32:17.0,",","NOSE",2,1,"en","P",1,5279,5279,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000644656","NOSE_000000644656",2009-07-06 11:26:08.0,",","NOSE",2,1,"en","P",1,5198,5198,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000030933","NOSE_000000030933",2010-04-13 07:04:47.0,",","NOSE",2,1,"en","P",1,5148,5148,"Good",,,4,2,1,0,0,0,0,0,0,4,"active" "000000063222","NOSE_000000063222",2009-04-29 19:31:54.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000332313","NOSE_000000332313",2009-12-22 20:03:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000366483","NOSE_000000366483",2010-07-08 12:23:18.0,",","NOSE",2,1,"fr","P",1,4936,4936,"Good",,,4,1,1,1,0,0,4,0,0,4,"active" "000000463366","NOSE_000000463366",2009-04-29 19:40:56.0,",","NOSE",2,1,"en","P",1,5246,5246,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000056900","NOSE_000000056900",2009-05-12 12:37:58.0,",","NOSE",2,1,"de","P",1,5133,5133,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000792247","NOSE_000000792247",2009-05-12 12:46:17.0,",","NOSE",2,1,"de","P",1,5305,5305,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000900867","NOSE_000000900867",2009-04-29 19:42:35.0,",","NOSE",2,1,"en","P",1,5478,5478,"Good",,"1",4,2,3,0,0,0,0,1,2,2,"active" "000000401166","NOSE_000000401166",2010-02-17 07:04:17.0,",","NOSE",2,1,"fr","P",1,5243,5243,"Good",,,3,0,1,0,0,0,0,0,0,4,"active" "000000708788","NOSE_000000708788",2009-05-12 13:03:13.0,",","NOSE",2,1,"de","P",1,5174,5174,"Good",,,3,0,1,0,0,0,0,0,2,0,"active" "000000588484","NOSE_000000588484",2009-12-04 17:02:51.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,1,0,0,"active" "000000616167","NOSE_000000616167",2009-08-22 20:50:08.0,",","NOSE",2,1,"en","P",1,5046,5046,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000285191","NOSE_000000285191",2009-04-29 19:41:23.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",1,0,0,0,0,0,0,1,0,0,"active" "000000802574","NOSE_000000802574",2009-05-12 13:12:15.0,",","NOSE",2,1,"fr","P",1,5426,5426,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000775625","NOSE_000000775625",2009-05-12 13:21:01.0,",","NOSE",2,1,"de","P",1,5518,5166,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000267413","NOSE_000000267413",2009-12-06 20:07:24.0,",","NOSE",2,1,"fr","P",1,5398,5398,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000390611","NOSE_000000390611",2009-08-19 14:17:06.0,",","NOSE",2,1,"fr","P",1,5354,5354,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000607675","NOSE_000000607675",2009-07-31 19:18:22.0,",","NOSE",2,2,"en","P",1,5039,5423,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000577026","NOSE_000000577026",2009-08-19 14:32:18.0,",","NOSE",2,1,"en","P",1,5280,5280,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000399146","NOSE_000000399146",2009-05-12 13:29:26.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,"1",2,1,2,0,0,0,0,1,0,0,"active" "000000248724","NOSE_000000248724",2009-05-12 13:38:49.0,",","NOSE",2,1,"en","P",1,4861,5245,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000486049","NOSE_000000486049",2010-02-05 10:08:07.0,",","NOSE",2,1,"fr","P",1,5326,5326,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000373511","NOSE_000000373511",2009-12-04 16:43:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000345910","NOSE_000000345910",2010-07-08 12:42:32.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,0,0,"active" "000000765058","NOSE_000000765058",2009-12-04 17:03:30.0,",","NOSE",,1,"en","P",1,,,,,,2,3,2,0,0,0,1,1,0,0,"active" "000000442124","NOSE_000000442124",2009-06-08 09:38:24.0,",","NOSE",2,1,"de","P",1,5263,5263,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000497540","NOSE_000000497540",2010-03-28 07:04:39.0,",","NOSE",2,1,"en","P",1,5469,5469,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000849035","NOSE_000000849035",2009-06-08 10:03:22.0,",","NOSE",2,1,"en","P",1,5720,5720,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000880325","NOSE_000000880325",2009-10-26 20:05:37.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000910758","NOSE_000000910758",2009-06-08 10:29:32.0,",","NOSE",2,1,"en","P",1,5335,5335,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000414898","NOSE_000000414898",2009-08-19 14:37:29.0,",","NOSE",2,1,"de","P",1,5316,5316,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000041910","NOSE_000000041910",2009-05-12 13:45:16.0,",","NOSE",2,1,"de","P",1,4957,4957,"Good",,"1",3,2,2,0,0,0,0,0,0,0,"active" "000000740285","NOSE_000000740285",2009-08-19 14:42:33.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,4,"active" "000000837725","NOSE_000000837725",2009-04-29 19:19:08.0,",","NOSE",,1,"en","P",1,5283,5283,,,"9",4,1,2,0,1,0,1,0,0,4,"active" "000000595866","NOSE_000000595866",2009-12-04 16:52:41.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000889251","NOSE_000000889251",2010-04-12 07:04:43.0,",","NOSE",2,1,"de","P",1,5442,5442,"Good",,,2,0,2,0,0,0,0,0,0,0,"active" "000000898482","NOSE_000000898482",2009-04-29 19:37:42.0,",","NOSE",2,1,"fr","P",1,5182,5182,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000690862","NOSE_000000690862",2010-02-28 07:03:50.0,",","NOSE",2,1,"en","P",1,5302,5302,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000897915","NOSE_000000897915",2009-12-04 17:01:50.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000574607","NOSE_000000574607",2009-04-29 19:19:32.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000467174","NOSE_000000467174",2010-07-08 12:44:08.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000249353","NOSE_000000249353",2009-10-28 21:18:24.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000315519","NOSE_000000315519",2009-10-16 20:33:59.0,",","NOSE",2,1,"de","P",1,5296,5296,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000626089","NOSE_000000626089",2009-05-12 14:10:37.0,",","NOSE",2,1,"en","P",1,5047,5047,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000792620","NOSE_000000792620",2009-12-04 16:46:40.0,",","NOSE",2,1,"en","P",1,5032,5032,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000677457","NOSE_000000677457",2009-10-25 20:05:40.0,",","NOSE",2,1,"de","P",1,5403,5403,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000492122","NOSE_000000492122",2009-04-29 19:25:20.0,",","NOSE",2,1,"None","P",1,5284,5313,"Good",,"1",2,1,1,1,0,0,1,0,0,0,"active" "000000243752","NOSE_000000243752",2009-05-12 14:24:10.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000960346","NOSE_000000960346",2009-08-19 14:57:28.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000346722","NOSE_000000346722",2009-04-29 19:31:22.0,",","NOSE",2,1,"en","P",1,5224,5224,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000051759","NOSE_000000051759",2009-04-29 19:26:07.0,",","NOSE",2,2,"de","P",1,5122,5143,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000922602","NOSE_000000922602",2009-05-12 14:46:59.0,",","NOSE",2,1,"de","P",1,5422,5432,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000450827","NOSE_000000450827",2009-05-12 14:54:37.0,",","NOSE",2,1,"de","P",1,5336,5336,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000428075","NOSE_000000428075",2009-04-29 19:29:00.0,",","NOSE",2,1,"de","P",1,5275,5275,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000759337","NOSE_000000759337",2009-12-04 16:46:30.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000788628","NOSE_000000788628",2009-04-29 19:21:25.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,"1",3,2,3,1,1,0,0,1,0,0,"active" "000000203660","NOSE_000000203660",2010-02-14 07:10:40.0,",","NOSE",2,1,"de","P",1,5140,5140,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000781162","NOSE_000000781162",2010-04-19 07:04:58.0,",","NOSE",2,1,"fr","P",1,5318,5318,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000262475","NOSE_000000262475",2009-04-29 19:39:30.0,",","NOSE",2,1,"en","P",1,5166,5166,"Good",,"1",4,1,2,0,1,0,1,0,0,0,"active" "000000089691","NOSE_000000089691",2009-05-12 15:23:02.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000422831","NOSE_000000422831",2009-05-12 15:32:28.0,",","NOSE",2,1,"en","P",1,5319,5319,"Good",,"1",1,0,2,0,0,0,0,0,0,0,"active" "000000235412","NOSE_000000235412",2009-11-16 10:49:45.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000474670","NOSE_000000474670",2009-05-12 15:40:52.0,",","NOSE",2,1,"de","P",1,4935,4935,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000191362","NOSE_000000191362",2009-12-04 16:46:53.0,",","NOSE",2,1,"en","P",1,5024,5024,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000978124","NOSE_000000978124",2009-05-12 15:49:57.0,",","NOSE",2,1,"de","P",1,5304,5305,"Good",,"1",1,0,0,0,0,0,0,0,2,0,"active" "000000377254","NOSE_000000377254",2009-04-29 19:33:36.0,",","NOSE",2,1,"de","P",1,5173,5173,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000391457","NOSE_000000391457",2010-06-21 12:19:51.0,",","NOSE",,2,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000278388","NOSE_000000278388",2010-07-08 12:43:23.0,",","NOSE",,1,"en","P",1,,,,,,2,3,3,0,0,0,1,1,0,0,"active" "000000706153","NOSE_000000706153",2009-04-29 19:32:00.0,",","NOSE",2,1,"en","P",1,5171,5171,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000328926","NOSE_000000328926",2009-12-04 17:02:19.0,",","NOSE",2,1,"en","P",1,5360,5360,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000563029","NOSE_000000563029",2009-08-19 15:02:40.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000341590","NOSE_000000341590",2010-07-08 12:39:20.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000299640","NOSE_000000299640",2009-05-12 16:13:29.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000446901","NOSE_000000446901",2009-04-29 19:33:33.0,",","NOSE",2,,,,,,,"Missing","

difficult with ...

",,,,,,,,,,,,"active" "000000687228","NOSE_000000687228",2010-02-25 07:05:51.0,",","NOSE",2,1,"de","P",1,5300,5300,"Good",,,4,0,2,1,0,0,1,0,0,0,"active" "000000625609","NOSE_000000625609",2010-01-18 07:03:23.0,",","NOSE",2,1,"de","P",1,5077,5077,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000876010","NOSE_000000876010",2010-07-08 12:43:47.0,",","NOSE",,1,"fr","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000129763","NOSE_000000129763",2009-05-12 16:22:18.0,",","NOSE",2,1,"de","P",1,5293,5293,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000760316","NOSE_000000760316",2009-04-29 19:33:44.0,",","NOSE",2,1,"en","P",1,5126,5126,"Good",,"1",3,1,3,0,0,0,2,1,2,0,"active" "000000444158","NOSE_000000444158",2009-08-19 15:17:44.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000343406","NOSE_000000343406",2009-07-31 19:18:39.0,",","NOSE",2,1,"en","P",1,4708,5092,"Good",,,4,2,4,0,0,0,0,0,0,0,"active" "000000709385","NOSE_000000709385",2009-04-29 19:31:30.0,",","NOSE",2,1,"en","P",1,5756,5756,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000240485","NOSE_000000240485",2009-08-24 20:59:38.0,",","NOSE",2,1,"de","P",1,5148,5148,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000418634","NOSE_000000418634",2009-05-12 16:50:22.0,",","NOSE",2,1,"en","P",1,5258,5258,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000008869","NOSE_000000008869",2010-07-08 12:23:38.0,",","NOSE",2,1,"en","P",1,108,108,"Doubtful","

grandmother was...

",,1,1,0,0,2,0,0,0,0,0,"active" "000000197309","NOSE_000000197309",2010-06-21 12:08:44.0,",","NOSE",,1,"en","P",1,5140,5140,,,,2,1,2,0,0,0,0,0,0,0,"active" "000000594973","NOSE_000000594973",2009-04-29 19:42:41.0,",","NOSE",2,1,"fr","P",1,5129,5129,"Good",,"1",4,1,1,0,0,0,2,0,0,0,"active" "000000576892","NOSE_000000576892",2010-04-18 07:05:01.0,",","NOSE",2,1,"en","P",1,5592,5592,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000659517","NOSE_000000659517",2009-10-06 10:10:50.0,",","NOSE",2,1,"de","P",1,5152,5152,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000339161","NOSE_000000339161",2009-05-12 17:00:09.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,"1",3,1,1,0,0,0,1,0,0,0,"active" "000000663674","NOSE_000000663674",2009-11-27 10:20:41.0,",","NOSE",2,1,"en","P",1,5137,5137,"Good",,,2,1,1,0,1,0,1,1,0,0,"active" "000000096360","NOSE_000000096360",2010-01-29 07:03:32.0,",","NOSE",2,1,"de","P",1,5265,5265,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000797489","NOSE_000000797489",2010-07-08 12:36:54.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,1,0,0,0,"active" "000000918395","NOSE_000000918395",2009-05-12 17:10:04.0,",","NOSE",2,1,"de","P",1,5364,5364,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000532641","NOSE_000000532641",2009-04-29 19:39:42.0,",","NOSE",2,1,"en","P",1,5146,5146,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000445319","NOSE_000000445319",2009-05-12 17:29:43.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000366125","NOSE_000000366125",2009-12-21 20:03:32.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,,2,1,1,0,0,0,0,1,0,0,"active" "000000576876","NOSE_000000576876",2009-05-12 17:38:29.0,",","NOSE",,1,"en","P",1,,,,,,4,0,3,0,0,0,0,0,0,0,"active" "000000511502","NOSE_000000511502",2010-07-08 12:39:28.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000150117","NOSE_000000150117",2009-10-12 20:05:34.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000255310","NOSE_000000255310",2009-05-12 17:38:53.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,"1",1,4,1,0,0,1,1,1,0,4,"active" "000000157779","NOSE_000000157779",2009-12-04 16:43:11.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000302723","NOSE_000000302723",2009-04-29 19:37:18.0,",","NOSE",2,1,"en","P",1,5303,5303,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000549199","NOSE_000000549199",2009-07-31 19:18:55.0,",","NOSE",2,1,"de","P",1,5054,5054,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000305718","NOSE_000000305718",2009-05-12 17:59:23.0,",","NOSE",,1,"en","P",1,,,,,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000065337","NOSE_000000065337",2009-12-04 16:58:57.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000014087","NOSE_000000014087",2009-12-04 16:54:19.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000470078","NOSE_000000470078",2009-07-31 19:50:02.0,",","NOSE",2,1,"de","P",1,5489,5489,"Good",,,4,0,2,0,0,0,1,0,0,0,"active" "000000703855","NOSE_000000703855",2009-08-19 15:20:10.0,",","NOSE",2,1,"de","P",1,5396,5396,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000461373","NOSE_000000461373",2009-12-04 17:03:40.0,",","NOSE",,1,"en","P",1,,,,,,3,1,2,0,0,0,0,1,0,0,"active" "000000538355","NOSE_000000538355",2009-12-04 17:03:51.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000209425","NOSE_000000209425",2009-04-29 19:28:08.0,",","NOSE",2,1,"en","P",1,5357,5357,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000875128","NOSE_000000875128",2009-04-29 19:34:56.0,",","NOSE",2,1,"de","P",1,5039,5039,"Good",,"1",3,1,2,1,0,0,0,1,2,0,"active" "000000047378","NOSE_000000047378",2009-10-05 20:11:48.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000195017","NOSE_000000195017",2009-05-12 18:25:39.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000878181","NOSE_000000878181",2009-04-29 19:26:26.0,",","NOSE",2,1,"de","P",1,5465,5465,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000770681","NOSE_000000770681",2009-11-04 14:36:56.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,4,1,2,0,1,0,1,0,0,4,"active" "000000379976","NOSE_000000379976",2009-06-08 10:57:53.0,",","NOSE",2,1,"de","P",1,5187,5187,"Good",,,4,1,2,0,1,0,0,0,0,4,"active" "000000038962","NOSE_000000038962",2009-05-12 18:41:58.0,",","NOSE",2,1,"de","P",1,5380,5380,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000843072","NOSE_000000843072",2009-05-12 18:52:30.0,",","NOSE",2,1,"en","P",1,5342,5342,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000369564","NOSE_000000369564",2010-04-29 11:36:00.0,",","NOSE",2,2,"en","P",1,5276,5276,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000207330","NOSE_000000207330",2009-05-12 19:03:05.0,",","NOSE",2,1,"de","P",1,5552,5200,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000785410","NOSE_000000785410",2010-05-18 07:06:42.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000015646","NOSE_000000015646",2009-04-29 19:41:12.0,",","NOSE",2,1,"en","P",1,5214,5214,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000042474","NOSE_000000042474",2009-05-12 19:23:35.0,",","NOSE",2,1,"en","P",1,5065,5065,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000073046","NOSE_000000073046",2010-05-24 07:04:21.0,",","NOSE",2,1,"en","P",1,5172,5172,"Good",,,3,0,0,0,1,0,1,0,0,0,"active" "000000253730","NOSE_000000253730",2009-05-12 19:33:55.0,",","NOSE",2,1,"de","P",1,5018,5018,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000968050","NOSE_000000968050",2009-04-29 19:41:37.0,",","NOSE",2,1,"en","P",1,5148,5148,"Good",,"1",4,1,3,0,0,0,0,0,0,0,"active" "000000901216","NOSE_000000901216",2009-12-04 16:45:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000957890","NOSE_000000957890",2009-05-12 19:53:12.0,",","NOSE",2,1,"de","P",1,5520,5520,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000374628","NOSE_000000374628",2009-04-29 19:19:24.0,",","NOSE",2,1,"fr","P",1,5605,5605,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000706149","NOSE_000000706149",2009-07-31 19:19:11.0,",","NOSE",2,1,"de","P",1,5373,5373,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000479652","NOSE_000000479652",2009-07-03 09:42:00.0,",","NOSE",2,1,"de","P",1,5326,5326,"Good",,,3,0,1,1,0,1,1,1,0,2,"active" "000000017505","NOSE_000000017505",2009-04-29 19:28:05.0,",","NOSE",2,1,"en","P",1,5235,5235,"Good",,"1",3,0,1,0,0,0,1,0,0,0,"active" "000000157743","NOSE_000000157743",2009-12-04 16:47:15.0,",","NOSE",2,1,"en","P",1,5204,5204,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000304676","NOSE_000000304676",2009-06-08 11:25:21.0,",","NOSE",2,1,"de","P",1,4985,4985,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000366383","NOSE_000000366383",2009-04-29 19:38:58.0,",","NOSE",2,2,"fr","P",1,5481,5481,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000028126","NOSE_000000028126",2009-05-12 20:35:39.0,",","NOSE",2,1,"de","P",1,5463,5474,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000734470","NOSE_000000734470",2009-11-10 20:24:37.0,",","NOSE",2,1,"en","P",1,5282,5282,"Good",,,3,1,1,1,0,0,1,0,0,2,"active" "000000912863","NOSE_000000912863",2009-04-29 19:33:21.0,",","NOSE",2,1,"de","P",1,5170,5170,"Good",,"1",4,0,3,0,0,0,2,0,0,0,"active" "000000688910","NOSE_000000688910",2009-08-19 15:34:46.0,",","NOSE",2,1,"fr","P",1,5185,5185,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000207623","NOSE_000000207623",2009-12-04 17:02:37.0,",","NOSE",,1,"en","P",1,,,,,,3,2,2,0,1,0,0,1,0,0,"active" "000000635320","NOSE_000000635320",2009-10-16 05:17:38.0,",","NOSE",2,1,"de","P",1,5458,5458,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000686948","NOSE_000000686948",2009-06-29 11:45:39.0,",","NOSE",2,1,"de","P",1,5399,5399,"Good",,,4,1,4,4,0,0,3,0,0,0,"active" "000000607093","NOSE_000000607093",2010-02-01 07:04:30.0,",","NOSE",2,1,"en","P",1,5371,5371,"Good",,,3,0,3,0,0,0,0,0,0,0,"active" "000000258714","NOSE_000000258714",2009-07-15 14:46:34.0,",","NOSE",2,1,"en","P",1,5421,5421,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000974337","NOSE_000000974337",2010-07-20 07:17:19.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000038743","NOSE_000000038743",2009-04-29 19:41:55.0,",","NOSE",2,1,"en","P",1,4971,4971,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000495480","NOSE_000000495480",2009-10-30 03:16:09.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000087383","NOSE_000000087383",2009-06-29 12:10:35.0,",","NOSE",2,1,"de","P",1,5532,5532,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000409997","NOSE_000000409997",2009-04-29 19:30:09.0,",","NOSE",2,2,"en","P",1,5238,5238,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000123036","NOSE_000000123036",2009-04-29 19:23:58.0,",","NOSE",2,1,"en","P",1,5352,5352,"Good",,"1",2,2,1,0,0,0,0,0,0,0,"active" "000000758575","NOSE_000000758575",2010-02-27 07:04:22.0,",","NOSE",2,1,"en","P",1,5272,5272,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000144162","NOSE_000000144162",2009-04-29 19:24:53.0,",","NOSE",2,1,"de","P",1,5064,5064,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000976421","NOSE_000000976421",2009-12-07 15:27:12.0,",","NOSE",2,1,"en","P",1,5135,5135,"Good",,,3,1,3,0,0,0,0,1,0,0,"active" "000000031156","NOSE_000000031156",2009-04-29 19:38:47.0,",","NOSE",2,1,"en","P",1,5216,5216,"Good",,"1",3,0,0,0,0,0,1,0,2,2,"active" "000000510428","NOSE_000000510428",2009-07-31 19:19:58.0,",","NOSE",2,1,"de","P",1,5473,5473,"Good",,,2,2,2,0,0,0,0,0,0,0,"active" "000000519777","NOSE_000000519777",2009-07-31 19:20:14.0,",","NOSE",2,1,"en","P",1,5483,5483,"Good",,,1,3,2,0,0,0,0,0,0,0,"active" "000000996071","NOSE_000000996071",2009-05-12 21:49:32.0,",","NOSE",,1,"en","P",1,,,,,"9",3,1,0,0,0,0,0,0,0,0,"active" "000000717843","NOSE_000000717843",2010-07-13 07:10:59.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000746382","NOSE_000000746382",2009-05-12 21:49:52.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000973100","NOSE_000000973100",2009-12-04 16:50:26.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000934362","NOSE_000000934362",2009-04-29 19:38:31.0,",","NOSE",2,1,"en","P",1,5171,5171,"Good",,"1",3,2,3,0,0,0,1,2,0,0,"active" "000000573943","NOSE_000000573943",2009-09-25 21:13:47.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000833964","NOSE_000000833964",2010-02-05 10:08:21.0,",","NOSE",2,1,"fr","P",1,5316,5316,"Good",,,2,0,1,0,1,0,0,0,0,0,"active" "000000374831","NOSE_000000374831",2010-02-26 07:06:14.0,",","NOSE",2,1,"de","P",1,5258,5258,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000205311","NOSE_000000205311",2009-08-19 15:45:15.0,",","NOSE",2,1,"de","P",1,5466,5466,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000985162","NOSE_000000985162",2009-05-12 21:58:45.0,",","NOSE",2,1,"fr","P",1,5558,5558,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000534395","NOSE_000000534395",2010-07-16 07:06:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000535290","NOSE_000000535290",2009-04-29 19:19:18.0,",","NOSE",2,1,"de","P",1,5235,5235,"Good",,"1",2,3,2,0,0,0,0,1,0,0,"active" "000000171694","NOSE_000000171694",2009-04-29 19:37:15.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000796497","NOSE_000000796497",2009-06-29 12:30:54.0,",","NOSE",2,1,"de","P",1,5392,5392,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000552758","NOSE_000000552758",2010-07-27 07:10:54.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000908566","NOSE_000000908566",2009-05-12 22:28:13.0,",","NOSE",2,1,"de","P",1,5273,5273,"Good",,"1",3,0,0,0,0,0,1,0,0,0,"active" "000000050847","NOSE_000000050847",2009-06-08 11:26:12.0,",","NOSE",2,1,"en","P",1,5225,5225,"Good",,"1",3,0,1,0,0,0,0,1,2,0,"active" "000000455783","NOSE_000000455783",2010-07-09 07:05:20.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000130909","NOSE_000000130909",2009-07-31 19:20:30.0,",","NOSE",2,1,"de","P",1,5139,5139,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000781027","NOSE_000000781027",2009-05-12 22:39:23.0,",","NOSE",2,1,"en","P",1,5140,5140,"Good",,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000258343","NOSE_000000258343",2009-06-03 10:45:28.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000376072","NOSE_000000376072",2009-04-29 19:24:44.0,",","NOSE",2,1,"en","P",1,5056,5056,"Good",,"1",4,1,2,1,1,1,1,0,0,2,"active" "000000199274","NOSE_000000199274",2009-12-04 16:41:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000541987","NOSE_000000541987",2009-05-12 22:54:22.0,",","NOSE",2,1,"de","P",1,5363,5363,"Good",,"1",4,1,1,2,0,0,1,1,0,0,"active" "000000312297","NOSE_000000312297",2009-04-29 19:40:38.0,",","NOSE",2,1,"en","P",1,5415,5415,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000835571","NOSE_000000835571",2009-04-29 19:33:04.0,",","NOSE",2,1,"de","P",1,5345,5345,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000428664","NOSE_000000428664",2009-12-04 16:46:38.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000237579","NOSE_000000237579",2010-06-01 07:08:31.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000540068","NOSE_000000540068",2010-07-25 07:06:20.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000680267","NOSE_000000680267",2009-06-29 12:31:03.0,",","NOSE",2,1,"de","P",1,5602,5602,"Good",,,4,1,1,1,2,0,0,0,2,2,"active" "000000912219","NOSE_000000912219",2010-01-08 20:03:24.0,",","NOSE",2,1,"fr","P",1,5112,5112,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000330471","NOSE_000000330471",2009-05-12 23:27:01.0,",","NOSE",2,1,"de","P",1,5299,5299,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000125822","NOSE_000000125822",2009-10-08 20:05:16.0,",","NOSE",2,1,"de","P",1,5227,5227,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000202038","NOSE_000000202038",2009-04-29 19:30:56.0,",","NOSE",2,1,"en","P",1,5409,5409,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000322625","NOSE_000000322625",2009-12-04 17:03:25.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000376910","NOSE_000000376910",2009-05-12 23:46:43.0,",","NOSE",,1,"en","P",1,5139,5139,,,"9",2,0,0,0,0,0,0,4,0,0,"active" "000000016997","NOSE_000000016997",2009-04-29 19:39:18.0,",","NOSE",2,1,"en","P",1,5326,5326,"Good",,"1",3,2,2,1,0,0,1,0,0,0,"active" "000000705490","NOSE_000000705490",2009-04-29 19:36:05.0,",","NOSE",2,1,"en","P",1,5289,5291,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000115320","NOSE_000000115320",2009-07-15 14:49:32.0,",","NOSE",2,1,"de","P",1,5409,5409,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000841954","NOSE_000000841954",2010-02-28 07:07:01.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000747283","NOSE_000000747283",2009-05-13 00:20:47.0,",","NOSE",2,1,"fr","P",1,5387,5387,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000092399","NOSE_000000092399",2009-06-29 12:31:12.0,",","NOSE",2,1,"de","P",1,5129,5129,"Good",,,1,0,0,0,0,0,0,1,0,0,"active" "000000814010","NOSE_000000814010",2009-05-13 00:32:15.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,4,0,1,2,0,0,2,0,0,2,"active" "000000563053","NOSE_000000563053",2009-08-19 15:55:41.0,",","NOSE",2,1,"en","P",1,5464,5464,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000135240","NOSE_000000135240",2009-05-13 00:32:37.0,",","NOSE",2,1,"de","P",1,5191,5192,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000458419","NOSE_000000458419",2009-07-31 19:21:01.0,",","NOSE",2,1,"de","P",1,5398,5398,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000274636","NOSE_000000274636",2010-03-18 07:10:03.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000904324","NOSE_000000904324",2010-04-08 07:04:16.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000466053","NOSE_000000466053",2010-07-22 07:05:46.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000057916","NOSE_000000057916",2009-08-19 16:11:18.0,",","NOSE",2,1,"de","P",1,5472,5472,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000972541","NOSE_000000972541",2010-07-16 07:07:44.0,",","NOSE",,1,"de","P",1,,,,,,2,2,3,0,0,0,0,0,0,4,"active" "000000167678","NOSE_000000167678",2009-04-29 19:32:32.0,",","NOSE",2,1,"de","P",1,4929,4929,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000958693","NOSE_000000958693",2009-12-30 20:03:35.0,",","NOSE",2,1,"de","P",1,5146,5146,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000913882","NOSE_000000913882",2009-10-22 14:58:11.0,",","NOSE",2,1,"en","P",1,5194,5194,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000624403","NOSE_000000624403",2010-04-19 07:04:43.0,",","NOSE",2,1,"fr","P",1,4976,4976,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000762218","NOSE_000000762218",2009-04-29 19:29:41.0,",","NOSE",2,1,"de","P",1,5141,5141,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000930565","NOSE_000000930565",2009-05-13 01:04:26.0,",","NOSE",2,1,"de","P",1,5332,5332,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000591390","NOSE_000000591390",2010-02-15 10:30:46.0,",","NOSE",2,1,"en","P",1,5234,5234,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000505194","NOSE_000000505194",2009-04-29 19:39:39.0,",","NOSE",2,1,"de","P",1,5416,5416,"Doubtful",,"1",4,1,1,1,0,0,1,1,0,0,"active" "000000391404","NOSE_000000391404",2009-12-04 16:50:24.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000023370","NOSE_000000023370",2009-05-13 01:18:42.0,",","NOSE",2,1,"de","P",1,5350,5350,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000065434","NOSE_000000065434",2009-04-29 19:28:11.0,",","NOSE",2,1,"en","P",1,5179,5179,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000158833","NOSE_000000158833",2009-05-13 01:41:03.0,",","NOSE",2,1,"de","P",1,5208,5208,"Good",,"9",4,0,1,0,0,0,1,0,0,0,"active" "000000093504","NOSE_000000093504",2010-07-13 07:05:01.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000844227","NOSE_000000844227",2009-04-29 19:36:00.0,",","NOSE",2,1,"de","P",1,4930,4930,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000196192","NOSE_000000196192",2009-05-13 02:03:50.0,",","NOSE",2,1,"de","P",1,5416,5416,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000669357","NOSE_000000669357",2010-01-16 07:03:36.0,",","NOSE",2,1,"fr","P",1,5188,5188,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000423149","NOSE_000000423149",2009-04-29 19:27:30.0,",","NOSE",2,1,"fr","P",1,5424,5424,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000930226","NOSE_000000930226",2010-04-29 11:36:23.0,",","NOSE",2,1,"fr","P",1,4968,4968,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000584960","NOSE_000000584960",2009-12-04 16:56:15.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000448684","NOSE_000000448684",2009-05-13 02:27:19.0,",","NOSE",2,1,"en","P",1,4886,5270,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000530782","NOSE_000000530782",2009-11-22 20:06:39.0,",","NOSE",2,1,"en","P",1,5123,5123,"Good",,,2,2,2,0,0,0,0,0,0,0,"active" "000000514720","NOSE_000000514720",2010-05-10 07:04:44.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000681578","NOSE_000000681578",2009-12-04 17:01:18.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,0,0,3,0,0,0,"active" "000000781909","NOSE_000000781909",2009-05-13 02:37:51.0,",","NOSE",2,1,"de","P",1,5496,5496,"Good",,"1",3,0,0,0,0,0,1,0,0,0,"active" "000000541833","NOSE_000000541833",2009-05-13 02:50:29.0,",","NOSE",2,1,"de","P",1,5192,5192,"Good",,"1",3,1,2,2,1,0,1,1,2,2,"active" "000000710743","NOSE_000000710743",2009-04-29 19:36:49.0,",","NOSE",2,1,"de","P",1,5469,5469,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000083155","NOSE_000000083155",2009-04-29 19:32:29.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,"1",3,0,0,0,0,0,3,0,0,0,"active" "000000729447","NOSE_000000729447",2009-11-22 20:06:52.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,4,1,0,0,0,0,0,0,0,0,"active" "000000126397","NOSE_000000126397",2009-12-04 16:59:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000990530","NOSE_000000990530",2009-09-29 20:35:06.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000528620","NOSE_000000528620",2010-07-08 12:46:18.0,",","NOSE",,1,"fr","P",1,5606,5606,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000294234","NOSE_000000294234",2009-04-29 19:36:23.0,",","NOSE",2,1,"en","P",1,5279,5279,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000386494","NOSE_000000386494",2010-04-29 11:36:15.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,2,0,"active" "000000406804","NOSE_000000406804",2010-05-04 07:04:33.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000188052","NOSE_000000188052",2010-07-08 12:43:10.0,",","NOSE",2,1,"en","P",1,5124,5124,"Good",,,2,1,2,0,0,0,0,0,0,0,"active" "000000295637","NOSE_000000295637",2010-03-24 07:03:57.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,2,2,"active" "000000349868","NOSE_000000349868",2010-04-18 07:07:50.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000196277","NOSE_000000196277",2009-12-04 16:40:38.0,",","NOSE",2,1,"de","P",1,5212,5212,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000978638","NOSE_000000978638",2009-06-08 12:09:02.0,",","NOSE",2,1,"de","P",1,5143,5143,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000147232","NOSE_000000147232",2009-05-13 03:41:04.0,",","NOSE",2,1,"en","P",1,5178,5178,"Good",,"9",3,3,3,0,1,0,0,0,0,0,"active" "000000980406","NOSE_000000980406",2009-12-04 16:51:54.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000342462","NOSE_000000342462",2009-04-29 19:33:09.0,",","NOSE",2,1,"de","P",1,5200,5200,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000349257","NOSE_000000349257",2010-02-05 10:07:44.0,",","NOSE",2,1,"en","P",1,5190,5190,"Good",,,4,1,3,0,1,0,0,0,0,0,"active" "000000358973","NOSE_000000358973",2010-05-28 07:04:47.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,2,0,"active" "000000333060","NOSE_000000333060",2010-07-21 07:06:18.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000516697","NOSE_000000516697",2009-12-04 16:46:45.0,",","NOSE",2,1,"en","P",1,5107,5107,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000896449","NOSE_000000896449",2009-07-31 19:21:19.0,",","NOSE",2,1,"de","P",1,5182,5182,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000139146","NOSE_000000139146",2009-04-29 19:35:28.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",3,1,1,1,0,0,1,1,0,2,"active" "000000473038","NOSE_000000473038",2010-03-02 07:05:05.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000361131","NOSE_000000361131",2009-11-04 14:57:52.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000515807","NOSE_000000515807",2009-11-04 15:37:49.0,",","NOSE",2,1,"de","P",1,5134,5134,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000889723","NOSE_000000889723",2010-07-08 12:37:14.0,",","NOSE",,1,"de","P",1,,,,,,4,2,2,0,0,0,0,0,0,0,"active" "000000515515","NOSE_000000515515",2009-12-04 17:02:03.0,",","NOSE",2,1,"en","P",1,5089,5089,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000562750","NOSE_000000562750",2010-02-23 07:05:59.0,",","NOSE",2,1,"de","P",1,5102,5102,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000230683","NOSE_000000230683",2009-04-29 19:28:33.0,",","NOSE",2,1,"en","P",1,5379,5379,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000921836","NOSE_000000921836",2010-04-29 11:59:27.0,",","NOSE",2,1,"en","P",1,5177,5177,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000421396","NOSE_000000421396",2009-06-08 12:36:18.0,",","NOSE",2,1,"en","P",1,5498,5498,"Good",,"1",3,1,1,1,0,0,0,1,0,0,"active" "000000588942","NOSE_000000588942",2009-07-15 14:52:49.0,",","NOSE",2,1,"en","P",1,5474,5474,"Good",,,3,3,3,0,0,0,0,0,0,0,"active" "000000911747","NOSE_000000911747",2009-04-29 19:40:28.0,",","NOSE",2,1,"de","P",1,5158,5158,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000715041","NOSE_000000715041",2009-11-21 20:06:46.0,",","NOSE",2,1,"de","P",1,5222,5222,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000113404","NOSE_000000113404",2009-06-08 13:04:10.0,",","NOSE",2,1,"en","P",1,5254,5254,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000729089","NOSE_000000729089",2010-06-05 07:06:46.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000514890","NOSE_000000514890",2009-06-08 13:25:55.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000435527","NOSE_000000435527",2009-05-13 04:46:34.0,",","NOSE",2,1,"de","P",1,5336,5336,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000819692","NOSE_000000819692",2009-05-13 04:58:11.0,",","NOSE",2,1,"en","P",1,5310,5310,"Good",,"1",3,0,1,1,1,0,1,0,0,0,"active" "000000733195","NOSE_000000733195",2009-04-29 19:34:43.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000196853","NOSE_000000196853",2009-11-17 20:07:57.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000196270","NOSE_000000196270",2009-04-29 19:42:44.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",3,1,2,0,3,0,3,2,0,0,"active" "000000040569","NOSE_000000040569",2010-03-04 07:04:00.0,",","NOSE",,1,"en","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000573347","NOSE_000000573347",2009-09-30 13:41:39.0,",","NOSE",2,1,"en","P",1,5204,5204,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000102613","NOSE_000000102613",2009-04-29 19:27:21.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000686999","NOSE_000000686999",2009-04-29 19:38:04.0,",","NOSE",2,1,"en","P",1,5337,5337,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000493439","NOSE_000000493439",2010-05-01 07:21:33.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000206480","NOSE_000000206480",2009-04-29 19:41:15.0,",","NOSE",2,1,"en","P",1,5413,5413,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000332939","NOSE_000000332939",2009-04-29 19:41:34.0,",","NOSE",2,1,"en","P",1,5391,5391,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000020224","NOSE_000000020224",2009-06-29 12:42:00.0,",","NOSE",2,1,"en","P",1,5277,5277,"Good",,,4,2,2,0,0,0,0,0,0,0,"active" "000000964418","NOSE_000000964418",2009-04-29 19:33:30.0,",","NOSE",2,1,"en","P",1,5344,5344,"Good",,"1",4,0,2,0,0,0,0,0,2,0,"active" "000000777912","NOSE_000000777912",2009-04-29 19:34:49.0,",","NOSE",2,1,"en","P",1,5334,5334,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000065879","NOSE_000000065879",2009-07-31 19:21:50.0,",","NOSE",2,1,"de","P",1,5189,5189,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000422179","NOSE_000000422179",2009-09-08 21:08:33.0,",","NOSE",2,1,"de","P",1,5460,5460,"Good",,,4,0,2,0,0,0,0,1,0,0,"active" "000000953281","NOSE_000000953281",2010-05-26 07:04:51.0,",","NOSE",2,1,"en","P",1,5207,5207,"Good",,,4,0,1,0,0,0,1,1,0,0,"active" "000000224754","NOSE_000000224754",2009-05-13 06:52:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000423131","NOSE_000000423131",2009-06-29 13:09:22.0,",","NOSE",2,1,"en","P",1,5244,5244,"Good",,,2,0,1,0,0,0,1,1,0,0,"active" "000000727629","NOSE_000000727629",2009-11-04 02:04:22.0,",","NOSE",2,1,"fr","P",1,5637,5637,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000552834","NOSE_000000552834",2010-02-08 09:14:47.0,",","NOSE",,1,"fr","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000085337","NOSE_000000085337",2009-05-13 07:05:01.0,",","NOSE",2,1,"de","P",1,5119,5119,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000376679","NOSE_000000376679",2009-11-04 02:51:18.0,",","NOSE",2,1,"fr","P",1,5117,5117,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000317510","NOSE_000000317510",2010-02-15 10:30:34.0,",","NOSE",1,1,"en","P",1,5138,5138,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000425872","NOSE_000000425872",2009-05-13 07:20:37.0,",","NOSE",2,1,"de","P",1,5205,5205,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000379940","NOSE_000000379940",2009-05-13 07:36:29.0,",","NOSE",2,1,"fr","P",1,5237,5237,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000075449","NOSE_000000075449",2009-04-29 19:31:44.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000474746","NOSE_000000474746",2009-07-31 19:22:07.0,",","NOSE",2,1,"fr","P",1,4992,4992,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000172967","NOSE_000000172967",2009-04-29 19:28:55.0,",","NOSE",2,1,"de","P",1,5289,5289,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000638824","NOSE_000000638824",2009-12-04 17:03:27.0,",","NOSE",,1,"en","P",1,,,,,,2,2,3,2,1,0,1,2,0,2,"active" "000000214685","NOSE_000000214685",2009-05-13 08:25:47.0,",","NOSE",,1,"en","P",1,5283,5283,,,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000935973","NOSE_000000935973",2009-12-04 17:03:33.0,",","NOSE",,1,"en","P",1,,,,,,3,4,3,0,1,0,0,2,0,0,"active" "000000771634","NOSE_000000771634",2009-09-30 13:54:03.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000532672","NOSE_000000532672",2009-08-06 13:37:52.0,",","NOSE",2,1,"en","P",1,5270,5270,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000223076","NOSE_000000223076",2010-03-27 07:03:59.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,1,0,1,1,0,0,0,"active" "000000642844","NOSE_000000642844",2009-05-13 08:42:22.0,",","NOSE",2,1,"de","P",1,5014,5014,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018855","NOSE_000000018855",2010-04-30 07:05:21.0,",","NOSE",,1,"de","P",1,,,,,,4,1,3,0,0,0,1,0,0,0,"active" "000000113404","NOSE_000000113404",2010-04-22 07:07:19.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000244445","NOSE_000000244445",2010-05-29 07:05:54.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,2,"active" "000000610352","NOSE_000000610352",2009-04-29 19:29:52.0,",","NOSE",2,1,"en","P",1,5454,5454,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000432763","NOSE_000000432763",2009-06-08 13:53:03.0,",","NOSE",2,1,"en","P",1,5191,5191,"Good",,"1",4,1,2,1,0,0,0,1,0,0,"active" "000000292040","NOSE_000000292040",2009-04-29 19:38:28.0,",","NOSE",2,1,"de","P",1,5029,5029,"Good",,"9",3,0,0,0,0,0,0,0,0,0,"active" "000000862568","NOSE_000000862568",2009-04-29 19:29:57.0,",","NOSE",2,2,"de","P",1,5426,5436,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000417397","NOSE_000000417397",2009-04-29 19:42:15.0,",","NOSE",2,1,"de","P",1,5271,5271,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000679405","NOSE_000000679405",2009-05-13 09:44:09.0,",","NOSE",2,1,"en","P",1,5463,5463,"Good",,"1",4,1,1,0,0,0,0,1,0,0,"active" "000000054345","NOSE_000000054345",2009-04-29 19:40:09.0,",","NOSE",2,1,"en","P",1,5251,5251,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000249343","NOSE_000000249343",2009-12-04 17:04:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000262865","NOSE_000000262865",2010-03-31 07:04:17.0,",","NOSE",,1,"de","P",1,,,,,,3,1,2,0,0,0,3,1,0,4,"active" "000000967977","NOSE_000000967977",2010-07-08 13:44:32.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000835248","NOSE_000000835248",2009-11-23 10:15:29.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000018292","NOSE_000000018292",2010-03-11 07:04:36.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,,4,1,2,0,0,0,1,0,0,0,"active" "000000181351","NOSE_000000181351",2009-04-29 19:25:29.0,",","NOSE",2,1,"de","P",1,5182,5182,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000000564","NOSE_000000000564",2009-12-04 17:00:43.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000749834","NOSE_000000749834",2010-04-16 07:07:38.0,",","NOSE",2,1,"en","P",1,5187,5187,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000789926","NOSE_000000789926",2010-01-24 07:03:49.0,",","NOSE",2,1,"en","P",1,5129,5129,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000264811","NOSE_000000264811",2009-11-10 20:41:59.0,",","NOSE",2,1,"en","P",1,5158,5158,"Good",,,3,1,0,0,0,0,1,1,0,0,"active" "000000889305","NOSE_000000889305",2009-12-04 17:02:46.0,",","NOSE",2,1,"en","P",1,5191,5191,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000257181","NOSE_000000257181",2009-05-13 10:17:31.0,",","NOSE",2,1,"de","P",1,5535,5535,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000596208","NOSE_000000596208",2010-07-08 12:51:51.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000138185","NOSE_000000138185",2009-06-29 13:38:40.0,",","NOSE",2,1,"en","P",1,5329,5329,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000986828","NOSE_000000986828",2009-12-04 16:46:27.0,",","NOSE",2,1,"en","P",1,5449,5449,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000848356","NOSE_000000848356",2009-08-31 13:51:07.0,",","NOSE",2,1,"en","P",1,5477,5477,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000242443","NOSE_000000242443",2009-05-13 10:31:18.0,",","NOSE",2,1,"de","P",1,5408,5408,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000308442","NOSE_000000308442",2010-07-21 07:09:01.0,",","NOSE",,1,"de","P",1,,,,,,2,1,2,0,0,0,0,0,0,0,"active" "000000039903","NOSE_000000039903",2009-04-29 19:27:38.0,",","NOSE",2,1,"de","P",1,5064,5064,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000614249","NOSE_000000614249",2009-04-29 19:20:58.0,",","NOSE",2,1,"en","P",1,5174,5174,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000895509","NOSE_000000895509",2010-07-11 07:05:44.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,2,0,"active" "000000124208","NOSE_000000124208",2009-10-22 15:16:07.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,2,0,0,4,"active" "000000347184","NOSE_000000347184",2009-05-13 11:12:28.0,",","NOSE",2,1,"de","P",1,5530,5530,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000584859","NOSE_000000584859",2009-08-31 14:02:56.0,",","NOSE",2,1,"en","P",1,5242,5242,"Good",,,2,3,3,0,0,0,0,0,0,0,"active" "000000728262","NOSE_000000728262",2009-08-06 12:18:17.0,",","NOSE",2,,,,,,,"Missing","

incomplete beca...

",,,,,,,,,,,,"active" "000000562977","NOSE_000000562977",2010-04-22 07:04:39.0,",","NOSE",,1,"en","P",1,-89,-89,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000246872","NOSE_000000246872",2009-06-08 14:21:58.0,",","NOSE",2,1,"en","P",1,4800,5184,"Good",,"1",2,0,2,0,0,0,0,0,0,0,"active" "000000971090","NOSE_000000971090",2009-05-13 11:28:40.0,",","NOSE",2,1,"de","P",1,5378,5378,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000236935","NOSE_000000236935",2009-04-29 19:24:23.0,",","NOSE",2,1,"de","P",1,5104,5104,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000903205","NOSE_000000903205",2009-08-19 16:34:56.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good","

needs to be car...

",,4,0,2,0,0,0,0,0,0,2,"active" "000000255143","NOSE_000000255143",2009-06-12 19:11:29.0,",","NOSE",2,1,"en","P",1,5268,5268,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000527504","NOSE_000000527504",2009-05-13 12:14:20.0,",","NOSE",2,1,"en","P",1,5295,5295,"Good",,"1",3,0,2,0,0,0,0,0,0,0,"active" "000000603036","NOSE_000000603036",2009-08-19 16:49:39.0,",","NOSE",2,1,"de","P",1,5295,5295,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000452621","NOSE_000000452621",2009-07-06 11:56:52.0,",","NOSE",2,1,"en","P",1,4710,5094,"Good",,,4,0,1,1,1,0,1,0,2,0,"active" "000000050078","NOSE_000000050078",2009-10-10 20:11:16.0,",","NOSE",2,1,"de","P",1,5429,5429,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000048418","NOSE_000000048418",2009-09-12 20:05:13.0,",","NOSE",2,1,"en","P",1,5180,5180,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000065094","NOSE_000000065094",2009-12-04 16:53:57.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000947230","NOSE_000000947230",2009-04-29 19:29:47.0,",","NOSE",2,1,"de","P",1,5015,5015,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000459391","NOSE_000000459391",2009-04-29 19:19:13.0,",","NOSE",2,1,"fr","P",1,5415,5415,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000150707","NOSE_000000150707",2009-05-13 13:56:54.0,",","NOSE",2,1,"de","P",1,5453,5453,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000790134","NOSE_000000790134",2009-11-24 15:40:57.0,",","NOSE",2,1,"en","P",1,5239,5239,"Good",,,4,0,1,1,1,0,1,1,2,0,"active" "000000780427","NOSE_000000780427",2010-07-16 07:05:22.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000419233","NOSE_000000419233",2009-11-29 20:06:55.0,",","NOSE",2,1,"en","P",1,5186,5186,"Good",,,4,0,1,1,1,0,0,0,0,0,"active" "000000040558","NOSE_000000040558",2009-12-04 17:00:59.0,",","NOSE",2,1,"en","P",1,5129,5129,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000046034","NOSE_000000046034",2009-05-13 14:29:00.0,",","NOSE",2,1,"en","P",1,5282,5282,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000469173","NOSE_000000469173",2010-04-15 07:06:08.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000789855","NOSE_000000789855",2010-05-05 07:04:24.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000074682","NOSE_000000074682",2010-07-08 13:51:20.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000009446","NOSE_000000009446",2009-05-13 14:39:27.0,",","NOSE",2,1,"de","P",1,5071,5071,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000549153","NOSE_000000549153",2010-01-21 07:03:48.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000687689","NOSE_000000687689",2010-03-14 07:04:35.0,",","NOSE",2,1,"de","P",1,5276,5276,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000131675","NOSE_000000131675",2009-11-04 14:59:52.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000350636","NOSE_000000350636",2009-11-04 15:00:08.0,",","NOSE",,1,"fr","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000985209","NOSE_000000985209",2009-11-04 15:00:26.0,",","NOSE",2,1,"fr","P",1,5290,5290,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000736672","NOSE_000000736672",2009-04-29 19:25:12.0,",","NOSE",2,1,"en","P",1,5239,5239,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000098988","NOSE_000000098988",2010-04-29 11:52:42.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,2,0,2,0,"active" "000000266545","NOSE_000000266545",2010-07-14 07:06:50.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000741119","NOSE_000000741119",2010-02-22 07:03:54.0,",","NOSE",2,1,"fr","P",1,5517,5517,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000162049","NOSE_000000162049",2009-05-13 15:00:44.0,",","NOSE",2,1,"de","P",1,5518,5518,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000601410","NOSE_000000601410",2010-03-29 07:03:58.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000016955","NOSE_000000016955",2010-02-23 07:04:05.0,",","NOSE",2,1,"en","P",1,5235,5235,"Good",,,4,1,3,2,0,0,0,0,0,0,"active" "000000000297","NOSE_000000000297",2009-04-29 19:29:33.0,",","NOSE",3,1,"en","P",1,5215,5215,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000256089","NOSE_000000256089",2009-04-29 19:29:30.0,",","NOSE",2,1,"en","P",1,5368,5368,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000917649","NOSE_000000917649",2009-07-31 19:22:40.0,",","NOSE",2,1,"en","P",1,4927,5311,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000085997","NOSE_000000085997",2009-04-29 19:32:46.0,",","NOSE",2,1,"de","P",1,5007,5007,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000670826","NOSE_000000670826",2009-12-04 16:40:10.0,",","NOSE",2,1,"de","P",1,5265,5265,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000599364","NOSE_000000599364",2009-09-29 20:54:06.0,",","NOSE",2,1,"fr","P",1,5062,5062,"Good",,,1,1,1,0,0,0,0,0,4,0,"active" "000000801792","NOSE_000000801792",2009-05-13 15:43:03.0,",","NOSE",2,1,"de","P",1,5195,5195,"Good",,"9",3,2,3,2,2,0,2,1,2,2,"active" "000000021826","NOSE_000000021826",2009-05-13 15:54:38.0,",","NOSE",2,1,"de","P",1,5155,5155,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000171462","NOSE_000000171462",2009-05-13 16:07:27.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000977480","NOSE_000000977480",2009-12-04 16:57:01.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000000825","NOSE_000000000825",2010-02-11 07:03:51.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000931899","NOSE_000000931899",2009-07-31 19:53:19.0,",","NOSE",2,1,"de","P",1,5538,5538,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000565845","NOSE_000000565845",2009-05-13 16:19:22.0,",","NOSE",2,1,"de","P",1,5187,5187,"Good",,"1",4,2,1,0,0,0,0,0,2,0,"active" "000000921954","NOSE_000000921954",2009-04-29 19:33:18.0,",","NOSE",2,1,"de","P",1,5221,5221,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000826934","NOSE_000000826934",2009-04-29 19:30:41.0,",","NOSE",2,2,"en","P",1,5489,5489,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000032795","NOSE_000000032795",2009-08-19 17:00:38.0,",","NOSE",2,1,"de","P",1,5329,5329,"Good","

The Subject nee...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000534042","NOSE_000000534042",2009-12-04 16:53:47.0,",","NOSE",,1,"de","P",1,,,,,,2,1,0,0,0,0,0,0,0,0,"active" "000000531629","NOSE_000000531629",2009-04-29 19:24:26.0,",","NOSE",2,1,"de","P",1,5569,5569,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000491377","NOSE_000000491377",2009-04-29 19:30:38.0,",","NOSE",2,1,"en","P",1,5243,5304,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000427102","NOSE_000000427102",2009-09-13 20:04:36.0,",","NOSE",2,1,"en","P",1,5367,5367,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000783635","NOSE_000000783635",2009-05-13 17:15:00.0,",","NOSE",2,1,"de","P",1,4984,4984,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000902605","NOSE_000000902605",2009-04-29 19:28:27.0,",","NOSE",2,1,"de","P",1,5508,5508,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000198965","NOSE_000000198965",2009-05-13 17:36:52.0,",","NOSE",2,1,"en","P",1,5303,5303,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000000368","NOSE_000000000368",2009-06-12 19:39:02.0,",","NOSE",2,1,"de","P",1,5279,5279,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000984063","NOSE_000000984063",2009-05-13 17:47:57.0,",","NOSE",2,1,"en","P",1,5046,5046,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000719480","NOSE_000000719480",2009-07-06 12:25:03.0,",","NOSE",2,1,"de","P",1,5304,5304,"Missing",,,1,0,0,0,0,0,0,0,0,0,"active" "000000886379","NOSE_000000886379",2009-05-13 18:00:45.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,"1",4,1,1,0,0,0,0,1,0,2,"active" "000000357222","NOSE_000000357222",2010-05-09 07:05:09.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000496466","NOSE_000000496466",2009-04-29 19:34:37.0,",","NOSE",2,1,"en","P",1,5468,5468,"Good",,"1",4,0,1,0,1,0,1,1,0,4,"active" "000000240360","NOSE_000000240360",2010-02-21 07:04:40.0,",","NOSE",2,1,"de","P",1,5231,5231,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000034618","NOSE_000000034618",2009-09-09 23:11:15.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,0,0,1,1,0,0,"active" "000000838113","NOSE_000000838113",2010-05-09 07:04:47.0,",","NOSE",2,1,"fr","P",1,5211,5211,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000118316","NOSE_000000118316",2009-06-08 14:50:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000821690","NOSE_000000821690",2009-04-29 19:38:33.0,",","NOSE",2,1,"en","P",1,5290,5290,"Good",,"1",4,0,1,0,0,0,1,0,0,0,"active" "000000771514","NOSE_000000771514",2009-05-13 18:38:58.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000442910","NOSE_000000442910",2009-04-29 19:37:45.0,",","NOSE",2,1,"de","P",1,5029,5029,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000281650","NOSE_000000281650",2009-05-13 19:05:19.0,",","NOSE",2,1,"de","P",1,5034,5034,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000058700","NOSE_000000058700",2009-05-13 19:18:07.0,",","NOSE",2,1,"en","P",1,5252,5252,"Good",,"1",4,0,2,0,0,0,1,0,0,0,"active" "000000005386","NOSE_000000005386",2009-05-13 19:27:50.0,",","NOSE",2,1,"en","P",1,5438,5438,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000181774","NOSE_000000181774",2009-11-06 20:37:34.0,",","NOSE",2,1,"en","P",1,5475,5475,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000124063","NOSE_000000124063",2009-04-29 19:39:45.0,",","NOSE",2,1,"de","P",1,5217,5217,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000996936","NOSE_000000996936",2010-07-14 07:05:47.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000596256","NOSE_000000596256",2009-04-29 19:42:27.0,",","NOSE",2,1,"en","P",1,5109,5109,"Good",,"1",4,0,2,1,0,0,0,0,0,0,"active" "000000920901","NOSE_000000920901",2009-12-04 16:48:22.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000777515","NOSE_000000777515",2009-11-04 15:06:25.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000899162","NOSE_000000899162",2009-09-06 20:42:45.0,",","NOSE",2,1,"en","P",1,5421,5421,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000066842","NOSE_000000066842",2009-06-30 09:54:12.0,",","NOSE",2,1,"de","P",1,5429,5429,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000517016","NOSE_000000517016",2009-04-29 19:30:47.0,",","NOSE",2,1,"de","P",1,5156,5156,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000470020","NOSE_000000470020",2009-04-29 19:20:52.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000853304","NOSE_000000853304",2009-04-29 19:32:11.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000810457","NOSE_000000810457",2009-07-31 19:53:46.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000447513","NOSE_000000447513",2010-02-19 07:03:41.0,",","NOSE",,1,"fr","P",1,,,,,,4,1,2,0,1,0,0,0,0,0,"active" "000000937781","NOSE_000000937781",2009-05-13 20:46:03.0,",","NOSE",,1,"de","P",1,,,,,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000605715","NOSE_000000605715",2009-05-13 20:59:54.0,",","NOSE",2,,,,,,,"Missing","

Parent had to l...

",,,,,,,,,,,,"active" "000000415464","NOSE_000000415464",2010-03-11 07:18:21.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000115871","NOSE_000000115871",2009-06-08 15:16:56.0,",","NOSE",2,1,"en","P",1,5387,5387,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000604658","NOSE_000000604658",2010-07-08 12:40:58.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000437993","NOSE_000000437993",2009-04-29 19:28:46.0,",","NOSE",2,1,"de","P",1,5188,5188,"Doubtful","

data was rated ...

","0",1,0,1,0,0,0,0,0,0,2,"active" "000000751445","NOSE_000000751445",2009-04-29 19:29:55.0,",","NOSE",2,1,"de","P",1,4815,4815,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000974731","NOSE_000000974731",2009-07-31 19:54:00.0,",","NOSE",2,1,"en","P",1,5365,5365,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000897451","NOSE_000000897451",2009-05-13 21:39:22.0,",","NOSE",2,1,"de","P",1,5272,5272,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000734565","NOSE_000000734565",2009-05-13 21:52:25.0,",","NOSE",2,1,"en","P",1,5166,5166,"Good",,"1",3,0,1,0,0,0,0,1,0,0,"active" "000000850762","NOSE_000000850762",2009-11-24 15:41:06.0,",","NOSE",2,1,"fr","P",1,5148,5148,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000484721","NOSE_000000484721",2009-12-04 16:52:33.0,",","NOSE",,1,"de","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000741640","NOSE_000000741640",2010-04-14 07:05:06.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000056239","NOSE_000000056239",2009-05-13 22:05:45.0,",","NOSE",2,1,"de","P",1,5134,5134,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000717843","NOSE_000000717843",2009-05-13 22:19:13.0,",","NOSE",2,1,"de","P",1,5445,5445,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000404624","NOSE_000000404624",2009-05-13 22:31:17.0,",","NOSE",,1,"de","P",1,,,,,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000759429","NOSE_000000759429",2009-05-13 22:45:22.0,",","NOSE",2,1,"en","P",1,5385,5385,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000844706","NOSE_000000844706",2010-05-25 07:04:58.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000164605","NOSE_000000164605",2009-12-04 16:51:23.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000814390","NOSE_000000814390",2010-07-08 12:38:11.0,",","NOSE",,1,"fr","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000015547","NOSE_000000015547",2009-08-31 14:17:03.0,",","NOSE",2,1,"en","P",1,129,129,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000131519","NOSE_000000131519",2009-12-04 17:02:21.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000599967","NOSE_000000599967",2009-08-19 17:31:31.0,",","NOSE",2,1,"de","P",1,5195,5195,"Good",,,4,0,0,0,0,0,0,0,2,0,"active" "000000510567","NOSE_000000510567",2009-08-19 17:46:59.0,",","NOSE",2,1,"en","P",1,5392,5392,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000580795","NOSE_000000580795",2009-05-13 22:58:47.0,",","NOSE",2,1,"en","P",1,5301,5301,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000615660","NOSE_000000615660",2009-05-13 23:12:16.0,",","NOSE",2,1,"de","P",1,5268,5268,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000706553","NOSE_000000706553",2009-05-13 23:25:48.0,",","NOSE",2,1,"de","P",1,5415,5415,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000356518","NOSE_000000356518",2009-07-31 19:23:00.0,",","NOSE",2,2,"en","P",1,5176,5176,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000563112","NOSE_000000563112",2009-06-08 20:45:41.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000462215","NOSE_000000462215",2009-10-17 20:14:06.0,",","NOSE",2,1,"en","P",1,5278,5278,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000574435","NOSE_000000574435",2010-05-18 07:04:39.0,",","NOSE",2,1,"en","P",1,5124,5124,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000400585","NOSE_000000400585",2010-03-06 07:04:21.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000120416","NOSE_000000120416",2010-03-26 07:04:23.0,",","NOSE",2,1,"fr","P",1,5365,5365,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000519870","NOSE_000000519870",2009-05-13 23:39:12.0,",","NOSE",2,1,"fr","P",1,5518,5518,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000238565","NOSE_000000238565",2010-06-21 12:10:46.0,",","NOSE",,1,"en","P",1,5244,5244,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000288955","NOSE_000000288955",2009-05-13 23:52:32.0,",","NOSE",2,1,"de","P",1,5219,5219,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000661785","NOSE_000000661785",2009-05-14 00:02:51.0,",","NOSE",2,1,"de","P",1,5377,5377,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000523737","NOSE_000000523737",2009-04-29 19:38:01.0,",","NOSE",2,1,"en","P",1,5199,5199,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000507386","NOSE_000000507386",2009-08-31 14:31:10.0,",","NOSE",,1,"en","P",1,5319,5319,,,,4,1,1,0,0,0,2,0,0,0,"active" "000000423366","NOSE_000000423366",2010-04-08 07:04:20.0,",","NOSE",2,1,"fr","P",1,5095,5095,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000733184","NOSE_000000733184",2009-10-09 20:19:34.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000884889","NOSE_000000884889",2010-06-21 13:19:49.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000197748","NOSE_000000197748",2010-07-13 07:05:18.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000348377","NOSE_000000348377",2009-07-31 19:23:17.0,",","NOSE",2,1,"en","P",1,5438,5438,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000733379","NOSE_000000733379",2009-05-14 00:32:12.0,",","NOSE",2,1,"de","P",1,5347,5347,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000651678","NOSE_000000651678",2009-08-20 05:58:32.0,",","NOSE",2,1,"de","P",1,5201,5201,"Good",,,3,0,0,0,0,0,3,0,0,2,"active" "000000681160","NOSE_000000681160",2010-04-16 07:04:27.0,",","NOSE",2,1,"en","P",1,-5,-5,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000739287","NOSE_000000739287",2010-05-31 07:05:03.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000838585","NOSE_000000838585",2009-12-04 16:46:59.0,",","NOSE",2,1,"en","P",1,5092,5092,"Good",,,4,1,0,0,0,0,0,0,0,0,"active" "000000756282","NOSE_000000756282",2009-11-08 00:07:45.0,",","NOSE",2,1,"en","P",1,5118,5118,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000461785","NOSE_000000461785",2009-05-14 00:41:00.0,",","NOSE",2,1,"fr","P",1,5364,5364,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000571279","NOSE_000000571279",2009-05-14 00:54:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000980347","NOSE_000000980347",2009-04-29 19:26:01.0,",","NOSE",2,1,"fr","P",1,5187,5187,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000153072","NOSE_000000153072",2009-05-14 01:22:48.0,",","NOSE",,3,"en","P",1,5194,5447,,,"9",3,1,1,0,0,0,0,0,0,0,"active" "000000455317","NOSE_000000455317",2009-12-04 16:53:31.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000668308","NOSE_000000668308",2009-04-29 19:39:21.0,",","NOSE",2,1,"de","P",1,5041,5041,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000057360","NOSE_000000057360",2009-05-14 01:40:16.0,",","NOSE",2,1,"en","P",1,5166,5166,"Good",,"1",4,2,3,2,2,1,2,1,2,2,"active" "000000877952","NOSE_000000877952",2009-09-18 14:47:08.0,",","NOSE",2,1,"de","P",1,5326,5326,"Good",,,1,0,2,0,0,0,0,0,0,0,"active" "000000759987","NOSE_000000759987",2009-05-14 01:55:05.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000939090","NOSE_000000939090",2010-07-08 12:46:24.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000152839","NOSE_000000152839",2010-02-01 07:03:20.0,",","NOSE",2,1,"en","P",1,5192,5192,"Good",,,4,0,1,0,0,0,0,0,2,0,"active" "000000570001","NOSE_000000570001",2009-04-29 19:39:53.0,",","NOSE",2,1,"de","P",1,5280,5280,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000509497","NOSE_000000509497",2009-04-29 19:34:19.0,",","NOSE",1,1,"en","P",1,5308,5308,"Good",,"9",3,3,3,2,1,0,3,2,2,2,"active" "000000074860","NOSE_000000074860",2009-10-22 15:32:21.0,",","NOSE",2,1,"en","P",1,5115,5115,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000603127","NOSE_000000603127",2009-04-29 19:31:05.0,",","NOSE",2,1,"de","P",1,5040,5040,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000295033","NOSE_000000295033",2009-12-04 16:52:39.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000988370","NOSE_000000988370",2009-04-29 19:36:43.0,",","NOSE",2,1,"en","P",1,5319,5319,"Good",,"1",3,2,3,0,0,0,1,2,0,0,"active" "000000522869","NOSE_000000522869",2009-05-14 03:06:40.0,",","NOSE",2,1,"de","P",1,5212,5212,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000662841","NOSE_000000662841",2009-05-14 03:20:31.0,",","NOSE",2,1,"de","P",1,5313,5313,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000048375","NOSE_000000048375",2010-03-18 07:04:04.0,",","NOSE",2,1,"fr","P",1,5124,5124,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000800815","NOSE_000000800815",2009-05-14 03:34:34.0,",","NOSE",2,1,"en","P",1,5153,5153,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000931568","NOSE_000000931568",2009-09-08 21:16:37.0,",","NOSE",2,1,"de","P",1,5278,5278,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000366371","NOSE_000000366371",2009-05-14 03:49:00.0,",","NOSE",2,1,"de","P",1,5478,5478,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000270318","NOSE_000000270318",2009-12-04 17:02:32.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000320389","NOSE_000000320389",2010-04-19 07:05:03.0,",","NOSE",2,1,"en","P",1,5146,5146,"Good",,,1,2,1,0,0,0,0,0,0,0,"active" "000000956673","NOSE_000000956673",2009-12-04 17:03:35.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000841336","NOSE_000000841336",2010-07-08 12:42:42.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000845281","NOSE_000000845281",2009-12-04 17:01:28.0,",","NOSE",2,1,"en","P",1,5161,5161,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000428305","NOSE_000000428305",2009-10-17 04:56:27.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000259127","NOSE_000000259127",2009-05-14 04:04:49.0,",","NOSE",2,,,,,,,"Missing","

parents didn't ...

",,,,,,,,,,,,"active" "000000007630","NOSE_000000007630",2009-07-31 19:23:35.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000876848","NOSE_000000876848",2009-04-29 19:35:04.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000511399","NOSE_000000511399",2009-10-09 21:15:19.0,",","NOSE",2,1,"de","P",1,5236,5236,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000105249","NOSE_000000105249",2009-04-29 19:35:48.0,",","NOSE",2,1,"en","P",1,5348,5348,"Good",,"1",3,3,3,0,0,0,0,0,0,0,"active" "000000311379","NOSE_000000311379",2010-07-21 07:05:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000448905","NOSE_000000448905",2009-05-14 04:46:10.0,",","NOSE",2,1,"de","P",1,5284,5284,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000906117","NOSE_000000906117",2009-05-14 05:00:44.0,",","NOSE",2,1,"de","P",1,4646,4646,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000887827","NOSE_000000887827",2009-10-14 10:13:29.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000147016","NOSE_000000147016",2009-11-07 21:05:13.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000775830","NOSE_000000775830",2009-12-04 16:53:52.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000055047","NOSE_000000055047",2009-12-04 16:53:02.0,",","NOSE",,1,"de","P",1,,,,,,2,2,2,0,0,0,0,0,0,0,"active" "000000986828","NOSE_000000986828",2009-04-29 19:23:25.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000801312","NOSE_000000801312",2009-04-29 19:39:07.0,",","NOSE",2,1,"fr","P",1,5337,5337,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000732187","NOSE_000000732187",2009-04-29 19:28:49.0,",","NOSE",2,1,"de","P",1,4879,4879,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000304296","NOSE_000000304296",2010-01-19 07:03:59.0,",","NOSE",2,1,"fr","P",1,5149,5149,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000706007","NOSE_000000706007",2010-05-26 07:04:32.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000106857","NOSE_000000106857",2009-04-29 19:29:19.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000400632","NOSE_000000400632",2010-01-19 17:07:10.0,",","NOSE",2,1,"de","P",1,5512,5512,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000159624","NOSE_000000159624",2009-10-06 10:45:04.0,",","NOSE",2,1,"fr","P",1,5098,5098,"Good",,,3,1,1,1,0,0,0,0,0,0,"active" "000000102306","NOSE_000000102306",2009-09-09 23:10:49.0,",","NOSE",2,1,"de","P",1,5452,5452,"Good",,,4,0,1,0,0,0,1,0,0,0,"active" "000000416067","NOSE_000000416067",2009-04-29 19:41:46.0,",","NOSE",2,1,"en","P",1,5473,5473,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000570453","NOSE_000000570453",2010-07-08 13:49:39.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,2,2,"active" "000000619466","NOSE_000000619466",2010-05-23 07:04:14.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000803167","NOSE_000000803167",2009-09-01 11:18:33.0,",","NOSE",2,1,"fr","P",1,5200,5200,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000205740","NOSE_000000205740",2010-03-18 07:04:47.0,",","NOSE",2,1,"fr","P",1,5356,5356,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000224092","NOSE_000000224092",2009-11-08 20:42:31.0,",","NOSE",2,1,"en","P",1,5432,5432,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000081411","NOSE_000000081411",2010-02-24 07:03:48.0,",","NOSE",2,1,"fr","P",1,5348,5348,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000896281","NOSE_000000896281",2009-09-11 09:47:05.0,",","NOSE",2,1,"en","P",1,5383,5383,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000771899","NOSE_000000771899",2010-06-10 07:05:34.0,",","NOSE",2,1,"en","P",1,5187,5187,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000026941","NOSE_000000026941",2009-12-17 10:16:43.0,",","NOSE",2,1,"fr","P",1,5265,5265,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000710234","NOSE_000000710234",2009-06-08 15:45:54.0,",","NOSE",2,1,"de","P",1,4822,4822,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000856091","NOSE_000000856091",2010-07-08 12:45:21.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,1,0,0,4,"active" "000000960715","NOSE_000000960715",2009-06-29 14:07:38.0,",","NOSE",2,1,"en","P",1,4920,5304,"Good",,,3,0,0,0,0,0,0,0,0,2,"active" "000000536841","NOSE_000000536841",2009-10-13 16:12:54.0,",","NOSE",2,1,"de","P",1,5216,5216,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000038931","NOSE_000000038931",2009-11-27 10:18:08.0,",","NOSE",2,1,"de","P",1,5132,5132,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000920665","NOSE_000000920665",2010-03-17 07:07:42.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,2,"active" "000000657997","NOSE_000000657997",2009-04-29 19:27:19.0,",","NOSE",2,1,"de","P",1,5390,5390,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000056304","NOSE_000000056304",2009-04-29 19:31:19.0,",","NOSE",2,1,"en","P",1,5192,5192,"Good",,"1",4,1,3,0,0,0,0,1,0,4,"active" "000000727681","NOSE_000000727681",2009-06-08 16:14:25.0,",","NOSE",2,1,"de","P",1,4972,4972,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000427538","NOSE_000000427538",2010-07-18 07:05:28.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000550632","NOSE_000000550632",2009-04-29 19:41:40.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",3,2,2,1,0,0,1,1,0,0,"active" "000000209826","NOSE_000000209826",2009-07-31 19:55:05.0,",","NOSE",2,1,"fr","P",1,5055,5055,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000067372","NOSE_000000067372",2009-12-04 16:54:00.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000337728","NOSE_000000337728",2009-04-29 19:39:50.0,",","NOSE",2,1,"en","P",1,5077,5077,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000109637","NOSE_000000109637",2010-07-08 12:47:08.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000219804","NOSE_000000219804",2009-08-20 20:41:29.0,",","NOSE",2,1,"de","P",1,5205,5205,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000223460","NOSE_000000223460",2009-05-14 07:21:18.0,",","NOSE",2,1,"de","P",1,5319,5319,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000428069","NOSE_000000428069",2010-03-02 07:04:01.0,",","NOSE",,1,"fr","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000469339","NOSE_000000469339",2010-04-13 07:04:28.0,",","NOSE",2,1,"fr","P",1,5458,5458,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000025169","NOSE_000000025169",2009-04-29 19:32:03.0,",","NOSE",2,1,"de","P",1,5403,5403,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000486433","NOSE_000000486433",2009-04-29 19:30:18.0,",","NOSE",2,1,"en","P",1,5273,5273,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000329460","NOSE_000000329460",2009-12-04 16:53:23.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,2,0,0,0,"active" "000000620201","NOSE_000000620201",2009-05-14 08:03:33.0,",","NOSE",2,1,"en","P",1,5246,5246,"Good",,"9",2,1,1,0,1,0,0,0,0,0,"active" "000000622210","NOSE_000000622210",2009-04-29 19:35:39.0,",","NOSE",2,1,"en","P",1,5294,5294,"Good",,"1",1,2,0,0,0,0,0,0,0,0,"active" "000000540037","NOSE_000000540037",2009-04-29 19:23:55.0,",","NOSE",2,1,"en","P",1,5299,5299,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000204653","NOSE_000000204653",2009-04-29 19:39:01.0,",","NOSE",2,1,"de","P",1,5159,5159,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000327531","NOSE_000000327531",2009-06-08 16:42:34.0,",","NOSE",2,1,"de","P",1,5437,5437,"Good",,,3,0,1,1,0,0,0,1,0,0,"active" "000000028516","NOSE_000000028516",2009-04-29 19:36:17.0,",","NOSE",2,1,"en","P",1,5245,5245,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000635425","NOSE_000000635425",2009-07-06 12:34:06.0,",","NOSE",2,1,"de","P",1,5458,5458,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000943858","NOSE_000000943858",2009-07-31 19:23:53.0,",","NOSE",2,1,"fr","P",1,5517,5517,"Good",,,4,0,0,0,0,0,1,0,0,4,"active" "000000481880","NOSE_000000481880",2009-09-14 20:09:38.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,1,0,0,0,0,0,"active" "000000278194","NOSE_000000278194",2009-05-14 09:12:10.0,",","NOSE",2,1,"en","P",1,5352,5352,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000143372","NOSE_000000143372",2010-07-08 12:41:13.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000999510","NOSE_000000999510",2009-04-29 19:34:16.0,",","NOSE",2,1,"de","P",1,5018,5018,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000038965","NOSE_000000038965",2009-06-08 17:06:37.0,",","NOSE",2,1,"de","P",1,5012,5012,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000596301","NOSE_000000596301",2009-12-04 16:22:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000309959","NOSE_000000309959",2009-12-04 16:53:33.0,",","NOSE",,2,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000303933","NOSE_000000303933",2010-05-03 07:04:23.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000657498","NOSE_000000657498",2009-12-04 16:46:22.0,",","NOSE",2,1,"en","P",1,5184,5184,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000149558","NOSE_000000149558",2009-04-29 19:31:11.0,",","NOSE",2,1,"de","P",1,5187,5187,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000368036","NOSE_000000368036",2009-09-27 20:41:34.0,",","NOSE",2,1,"fr","P",1,5384,5384,"Good",,,3,0,0,0,0,0,1,0,0,2,"active" "000000416958","NOSE_000000416958",2009-05-14 09:57:41.0,",","NOSE",2,1,"de","P",1,5428,5428,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000084181","NOSE_000000084181",2009-05-14 10:11:45.0,",","NOSE",2,1,"de","P",1,5425,5429,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000725730","NOSE_000000725730",2010-07-27 07:04:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000226805","NOSE_000000226805",2009-05-14 10:24:08.0,",","NOSE",2,1,"de","P",1,5351,5351,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000309886","NOSE_000000309886",2009-04-29 19:33:12.0,",","NOSE",2,1,"en","P",1,5117,5117,"Good",,"1",4,1,2,3,1,0,2,2,0,0,"active" "000000952082","NOSE_000000952082",2009-05-14 10:52:56.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000606373","NOSE_000000606373",2009-05-14 10:53:21.0,",","NOSE",2,1,"de","P",1,5270,5270,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000126852","NOSE_000000126852",2010-02-18 07:04:04.0,",","NOSE",2,1,"fr","P",1,5202,5202,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000673114","NOSE_000000673114",2009-05-14 11:08:22.0,",","NOSE",2,1,"de","P",1,5216,5223,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000656642","NOSE_000000656642",2009-12-04 17:02:24.0,",","NOSE",2,1,"en","P",1,5361,5361,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000334312","NOSE_000000334312",2010-03-06 07:03:57.0,",","NOSE",2,1,"en","P",1,5112,5112,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000030383","NOSE_000000030383",2009-04-29 19:42:09.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000720770","NOSE_000000720770",2009-10-02 20:17:46.0,",","NOSE",,3,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000176309","NOSE_000000176309",2010-03-17 07:07:49.0,",","NOSE",2,1,"de","P",1,5209,5209,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000563125","NOSE_000000563125",2009-10-22 22:39:38.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000744049","NOSE_000000744049",2009-05-15 15:13:44.0,",","NOSE",2,1,"de","P",1,5380,5384,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000003626","NOSE_000000003626",2009-12-04 17:12:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000427922","NOSE_000000427922",2009-04-29 19:42:38.0,",","NOSE",2,1,"en","P",1,5427,5427,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000489040","NOSE_000000489040",2009-04-29 19:24:12.0,",","NOSE",2,1,"de","P",1,5147,5147,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000027766","NOSE_000000027766",2010-01-23 07:08:39.0,",","NOSE",2,1,"en","P",1,5196,5196,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000510782","NOSE_000000510782",2009-09-30 14:22:17.0,",","NOSE",2,1,"de","P",1,5242,5242,"Good",,,2,0,1,0,0,0,1,0,0,0,"active" "000000202936","NOSE_000000202936",2009-05-15 15:14:20.0,",","NOSE",2,1,"de","P",1,5341,5341,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000492732","NOSE_000000492732",2010-03-23 07:04:18.0,",","NOSE",2,1,"fr","P",1,5290,5290,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000703988","NOSE_000000703988",2009-11-21 20:07:17.0,",","NOSE",2,1,"fr","P",1,5179,5179,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000356189","NOSE_000000356189",2009-06-08 17:08:35.0,",","NOSE",2,1,"en","P",1,4698,5082,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000676721","NOSE_000000676721",2009-06-08 17:35:40.0,",","NOSE",2,1,"de","P",1,5541,5541,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000336403","NOSE_000000336403",2009-11-04 15:35:55.0,",","NOSE",2,1,"en","P",1,5363,5363,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000365851","NOSE_000000365851",2009-11-16 10:49:38.0,",","NOSE",,1,"de","P",1,,,,,,2,3,3,0,0,0,0,0,4,0,"active" "000000740719","NOSE_000000740719",2009-12-04 16:41:03.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000820878","NOSE_000000820878",2009-05-15 15:14:33.0,",","NOSE",2,1,"en","P",1,5450,5450,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000354825","NOSE_000000354825",2009-04-29 19:32:40.0,",","NOSE",2,1,"de","P",1,5414,5414,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000907309","NOSE_000000907309",2009-05-15 15:14:56.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000205857","NOSE_000000205857",2010-03-31 07:04:24.0,",","NOSE",2,1,"de","P",1,5395,5395,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000197065","NOSE_000000197065",2009-11-04 16:05:01.0,",","NOSE",2,1,"fr","P",1,5197,5197,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000797750","NOSE_000000797750",2009-11-23 10:15:37.0,",","NOSE",2,1,"en","P",1,5184,5184,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000991841","NOSE_000000991841",2009-04-29 19:34:40.0,",","NOSE",2,1,"en","P",1,5098,5098,"Good",,"1",4,1,1,1,0,0,1,1,0,4,"active" "000000565928","NOSE_000000565928",2009-04-29 19:23:49.0,",","NOSE",2,1,"de","P",1,5165,5165,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000609210","NOSE_000000609210",2009-06-08 17:54:23.0,",","NOSE",2,1,"fr","P",1,5436,5436,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000049211","NOSE_000000049211",2009-05-15 15:15:24.0,",","NOSE",1,1,"en","P",1,5193,5193,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000026015","NOSE_000000026015",2009-05-15 15:15:37.0,",","NOSE",2,2,"fr","P",1,5314,5314,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000523141","NOSE_000000523141",2009-12-04 16:47:12.0,",","NOSE",2,1,"en","P",1,5404,5404,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000476330","NOSE_000000476330",2009-07-31 19:24:30.0,",","NOSE",2,1,"fr","P",1,4945,4945,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000786751","NOSE_000000786751",2009-12-04 16:56:29.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000365092","NOSE_000000365092",2010-03-24 07:04:07.0,",","NOSE",2,1,"fr","P",1,5295,5295,"Good",,,4,0,0,4,0,0,4,0,0,0,"active" "000000299153","NOSE_000000299153",2009-05-15 15:15:49.0,",","NOSE",2,1,"de","P",1,5288,5288,"Good",,,4,1,2,0,1,0,0,0,0,0,"active" "000000974139","NOSE_000000974139",2009-06-08 18:03:22.0,",","NOSE",2,1,"en","P",1,5064,5064,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000541984","NOSE_000000541984",2009-05-15 15:16:01.0,",","NOSE",2,1,"de","P",1,5468,5468,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000226195","NOSE_000000226195",2009-08-19 18:03:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000076819","NOSE_000000076819",2009-11-04 15:40:11.0,",","NOSE",2,1,"de","P",1,5131,5131,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000929561","NOSE_000000929561",2010-03-10 07:05:11.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000257070","NOSE_000000257070",2010-06-10 07:05:22.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000720987","NOSE_000000720987",2009-05-15 15:16:14.0,",","NOSE",2,,,,,,,"Missing",,,,,,,,,,,,,"active" "000000536106","NOSE_000000536106",2010-03-13 07:05:22.0,",","NOSE",2,1,"en","P",1,5484,5484,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000113643","NOSE_000000113643",2009-05-15 15:16:23.0,",","NOSE",2,1,"de","P",1,5239,5239,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000209243","NOSE_000000209243",2009-04-29 19:38:44.0,",","NOSE",2,1,"de","P",1,5082,5082,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000433804","NOSE_000000433804",2009-11-28 20:07:36.0,",","NOSE",2,1,"fr","P",1,5403,5403,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000139109","NOSE_000000139109",2009-10-22 22:46:25.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000000981","NOSE_000000000981",2009-12-04 16:47:20.0,",","NOSE",2,1,"en","P",1,5173,5173,"Good",,,3,1,1,0,0,0,0,0,2,0,"active" "000000424769","NOSE_000000424769",2009-04-29 19:25:23.0,",","NOSE",2,1,"en","P",1,5107,5107,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000369413","NOSE_000000369413",2009-11-26 20:19:36.0,",","NOSE",2,1,"de","P",1,5166,5166,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000427982","NOSE_000000427982",2009-05-15 15:16:58.0,",","NOSE",2,1,"en","P",1,5298,5298,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000189282","NOSE_000000189282",2010-07-26 07:04:57.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000431455","NOSE_000000431455",2010-04-10 07:04:15.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000437304","NOSE_000000437304",2009-10-16 21:17:38.0,",","NOSE",2,1,"de","P",1,5234,5234,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000415407","NOSE_000000415407",2009-05-15 15:17:10.0,",","NOSE",2,1,"en","P",1,5038,5038,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000294580","NOSE_000000294580",2009-06-08 18:30:15.0,",","NOSE",2,1,"de","P",1,5353,5353,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000980704","NOSE_000000980704",2010-06-30 07:05:30.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000661804","NOSE_000000661804",2009-07-31 19:55:55.0,",","NOSE",,1,"en","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000760117","NOSE_000000760117",2009-04-29 19:30:59.0,",","NOSE",2,2,"en","P",1,5751,5751,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000736214","NOSE_000000736214",2009-04-29 19:41:58.0,",","NOSE",2,1,"en","P",1,5413,5413,"Good",,"1",4,1,1,2,0,0,0,1,0,0,"active" "000000797483","NOSE_000000797483",2009-05-15 15:17:45.0,",","NOSE",2,1,"en","P",1,5317,5317,"Good",,"1",3,1,2,0,0,0,1,0,0,0,"active" "000000863899","NOSE_000000863899",2010-03-26 07:04:06.0,",","NOSE",2,1,"en","P",1,5299,5299,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000676662","NOSE_000000676662",2009-06-08 18:57:44.0,",","NOSE",2,1,"de","P",1,5380,5380,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000304980","NOSE_000000304980",2009-08-24 20:40:28.0,",","NOSE",2,1,"fr","P",1,5103,5103,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000511085","NOSE_000000511085",2009-07-31 19:24:48.0,",","NOSE",2,2,"de","P",1,5144,5144,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000440625","NOSE_000000440625",2009-06-12 19:44:52.0,",","NOSE",2,1,"de","P",1,5191,5191,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000169931","NOSE_000000169931",2009-11-30 20:06:44.0,",","NOSE",2,1,"de","P",1,5141,5141,"Good",,,3,0,2,0,0,0,0,0,0,4,"active" "000000210314","NOSE_000000210314",2009-04-29 19:36:51.0,",","NOSE",2,2,"fr","P",1,5330,5330,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000920693","NOSE_000000920693",2009-06-08 21:44:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000578597","NOSE_000000578597",2009-12-04 16:47:10.0,",","NOSE",2,1,"en","P",1,5370,5370,"Good",,,4,1,0,0,0,0,1,0,0,0,"active" "000000298424","NOSE_000000298424",2009-12-03 20:10:04.0,",","NOSE",2,1,"fr","P",1,4980,4980,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000611006","NOSE_000000611006",2010-05-05 07:06:04.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000465818","NOSE_000000465818",2010-07-22 07:05:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000518034","NOSE_000000518034",2010-06-10 07:07:42.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000770890","NOSE_000000770890",2009-10-10 20:28:57.0,",","NOSE",2,1,"en","P",1,5471,5471,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000919704","NOSE_000000919704",2009-09-11 10:02:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000259062","NOSE_000000259062",2009-07-31 19:56:15.0,",","NOSE",2,1,"de","P",1,5191,5191,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000164658","NOSE_000000164658",2010-06-06 07:05:30.0,",","NOSE",2,1,"en","P",1,5093,5093,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000199681","NOSE_000000199681",2009-06-08 22:11:08.0,",","NOSE",2,1,"en","P",1,5337,5337,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000280118","NOSE_000000280118",2009-12-04 16:41:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000112151","NOSE_000000112151",2010-07-21 07:06:35.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000989754","NOSE_000000989754",2009-05-15 15:18:08.0,",","NOSE",2,1,"de","P",1,5203,5203,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000896391","NOSE_000000896391",2009-10-01 21:45:05.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,4,0,3,1,0,0,1,1,0,0,"active" "000000846195","NOSE_000000846195",2009-04-29 19:26:32.0,",","NOSE",2,1,"de","P",1,5231,5231,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000811021","NOSE_000000811021",2009-04-29 19:42:12.0,",","NOSE",2,1,"fr","P",1,5699,5699,"Good",,"1",2,1,1,1,0,0,0,0,0,0,"active" "000000182892","NOSE_000000182892",2010-03-10 07:07:14.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000019977","NOSE_000000019977",2009-04-29 19:27:49.0,",","NOSE",2,1,"fr","P",1,5585,5585,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000700671","NOSE_000000700671",2009-05-15 15:18:54.0,",","NOSE",2,1,"de","P",1,5393,5393,"Good",,"9",4,0,1,0,0,0,0,0,0,0,"active" "000000552842","NOSE_000000552842",2009-04-29 19:31:36.0,",","NOSE",2,1,"de","P",1,5129,5129,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000257146","NOSE_000000257146",2009-07-31 18:59:27.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000235399","NOSE_000000235399",2009-12-04 16:53:36.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000542817","NOSE_000000542817",2009-07-15 15:17:08.0,",","NOSE",2,1,"fr","P",1,5219,5219,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000335973","NOSE_000000335973",2009-04-29 19:42:24.0,",","NOSE",2,1,"fr","P",1,5459,5459,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000254244","NOSE_000000254244",2009-05-15 15:19:29.0,",","NOSE",2,1,"en","P",1,5382,5382,"Doubtful","

wrong code used...

","1",0,-1,0,0,0,0,0,0,0,0,"active" "000000825869","NOSE_000000825869",2009-12-03 20:07:32.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000852830","NOSE_000000852830",2009-04-29 19:26:21.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000902317","NOSE_000000902317",2010-01-16 07:03:40.0,",","NOSE",2,1,"en","P",1,5209,5209,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000852280","NOSE_000000852280",2009-12-04 16:53:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000143059","NOSE_000000143059",2009-06-08 22:37:06.0,",","NOSE",2,1,"en","P",1,5300,5300,"Good",,"1",1,4,1,0,0,0,0,0,0,0,"active" "000000034059","NOSE_000000034059",2010-05-08 07:05:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,1,0,0,"active" "000000383722","NOSE_000000383722",2009-07-06 12:34:54.0,",","NOSE",2,1,"fr","P",1,5343,5343,"Good",,,4,0,1,0,0,0,0,0,2,0,"active" "000000453276","NOSE_000000453276",2009-05-15 15:19:49.0,",","NOSE",2,1,"de","P",1,5546,5327,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000051166","NOSE_000000051166",2010-04-20 07:05:41.0,",","NOSE",2,1,"fr","P",1,5109,5109,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000556292","NOSE_000000556292",2009-04-29 19:23:39.0,",","NOSE",2,1,"fr","P",1,5623,5623,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000843649","NOSE_000000843649",2009-05-15 15:20:13.0,",","NOSE",2,1,"de","P",1,5330,5330,"Good",,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000598632","NOSE_000000598632",2009-05-15 15:20:26.0,",","NOSE",2,1,"de","P",1,5243,5243,"Good",,"1",3,0,1,0,0,1,0,0,0,0,"active" "000000517167","NOSE_000000517167",2009-10-25 20:16:11.0,",","NOSE",,1,"en","P",1,,,,,,3,2,3,0,0,0,0,0,0,0,"active" "000000539042","NOSE_000000539042",2009-04-29 19:39:59.0,",","NOSE",2,1,"en","P",1,5456,5456,"Good",,"1",3,0,1,0,0,0,0,1,0,0,"active" "000000217321","NOSE_000000217321",2009-04-29 19:25:07.0,",","NOSE",2,1,"en","P",1,5319,5319,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000870725","NOSE_000000870725",2010-06-01 07:06:17.0,",","NOSE",2,1,"fr","P",1,4988,4988,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000907308","NOSE_000000907308",2009-06-29 15:41:30.0,",","NOSE",2,1,"de","P",1,5378,5378,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000332258","NOSE_000000332258",2009-05-15 15:21:00.0,",","NOSE",2,1,"de","P",1,5324,5331,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000087584","NOSE_000000087584",2009-05-15 15:21:13.0,",","NOSE",2,1,"de","P",1,5453,5453,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000091721","NOSE_000000091721",2009-12-30 20:03:30.0,",","NOSE",2,1,"en","P",1,5161,5161,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000142684","NOSE_000000142684",2009-08-21 21:12:17.0,",","NOSE",2,1,"fr","P",1,5491,5491,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000706781","NOSE_000000706781",2010-07-24 07:07:12.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000681644","NOSE_000000681644",2009-05-18 10:22:52.0,",","NOSE",2,1,"de","P",1,5180,5180,"Good",,"1",3,0,0,1,1,0,1,0,0,2,"active" "000000140146","NOSE_000000140146",2009-04-29 19:34:04.0,",","NOSE",2,1,"en","P",1,5205,5205,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000215314","NOSE_000000215314",2009-05-18 10:32:30.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000759560","NOSE_000000759560",2010-05-02 07:05:54.0,",","NOSE",2,1,"en","P",1,5160,5160,"Good",,,1,2,1,0,0,0,0,0,2,0,"active" "000000666893","NOSE_000000666893",2009-04-29 19:25:31.0,",","NOSE",2,1,"de","P",1,5389,5389,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000705802","NOSE_000000705802",2009-04-29 19:32:43.0,",","NOSE",2,1,"fr","P",1,5447,5447,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000420911","NOSE_000000420911",2010-01-23 07:08:52.0,",","NOSE",2,1,"fr","P",1,4918,4918,"Good",,,2,1,1,0,0,0,1,0,0,2,"active" "000000487930","NOSE_000000487930",2009-05-18 10:32:31.0,",","NOSE",2,1,"en","P",1,5315,5315,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000857462","NOSE_000000857462",2009-04-29 19:31:57.0,",","NOSE",2,1,"en","P",1,5143,5143,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000068720","NOSE_000000068720",2009-04-29 19:28:16.0,",","NOSE",2,1,"en","P",1,5188,5188,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000136384","NOSE_000000136384",2009-12-04 16:47:18.0,",","NOSE",2,1,"en","P",1,5225,5225,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000797705","NOSE_000000797705",2009-05-18 14:16:52.0,",","NOSE",2,1,"fr","P",1,5432,5432,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000305146","NOSE_000000305146",2009-05-18 10:32:33.0,",","NOSE",2,1,"fr","P",1,5255,5255,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000403276","NOSE_000000403276",2010-02-28 07:04:22.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000020924","NOSE_000000020924",2010-03-20 07:07:17.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000608618","NOSE_000000608618",2009-12-04 16:53:50.0,",","NOSE",,1,"de","P",1,,,,,,4,2,4,0,0,0,3,1,0,4,"active" "000000848814","NOSE_000000848814",2009-04-29 19:36:32.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000591191","NOSE_000000591191",2009-05-18 10:32:34.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000768202","NOSE_000000768202",2009-12-04 17:03:56.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000599061","NOSE_000000599061",2009-04-29 19:40:17.0,",","NOSE",2,1,"en","P",1,5318,5318,"Good",,"1",3,2,1,1,1,0,0,0,0,0,"active" "000000969551","NOSE_000000969551",2009-07-02 09:47:58.0,",","NOSE",2,1,"fr","P",1,5502,5502,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000436091","NOSE_000000436091",2009-04-29 19:33:56.0,",","NOSE",2,1,"en","P",1,5401,5401,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000426556","NOSE_000000426556",2009-12-04 17:01:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000411736","NOSE_000000411736",2009-04-29 19:41:31.0,",","NOSE",2,1,"fr","P",1,5119,5119,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000577283","NOSE_000000577283",2009-04-29 19:32:14.0,",","NOSE",2,1,"de","P",1,5160,5160,"Good",,"1",2,1,2,0,0,0,0,0,0,0,"active" "000000535021","NOSE_000000535021",2009-05-18 14:42:51.0,",","NOSE",2,1,"de","P",1,5193,5193,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000510768","NOSE_000000510768",2009-09-23 20:15:15.0,",","NOSE",2,1,"de","P",1,5161,5161,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000109919","NOSE_000000109919",2009-04-29 19:25:37.0,",","NOSE",2,1,"fr","P",1,5523,5523,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000161911","NOSE_000000161911",2009-04-29 19:26:18.0,",","NOSE",2,1,"en","P",1,5256,5256,"Good",,"1",4,2,3,0,0,0,0,0,0,4,"active" "000000243381","NOSE_000000243381",2009-04-29 19:41:09.0,",","NOSE",2,1,"de","P",1,5154,5154,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000416308","NOSE_000000416308",2009-10-04 20:32:34.0,",","NOSE",2,1,"en","P",1,5160,5164,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000148116","NOSE_000000148116",2009-08-19 18:39:05.0,",","NOSE",2,1,"de","P",1,5345,5345,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000461646","NOSE_000000461646",2009-10-25 21:03:50.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000785451","NOSE_000000785451",2010-04-08 07:04:09.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000472657","NOSE_000000472657",2009-10-01 20:07:50.0,",","NOSE",2,1,"en","P",1,5325,5325,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000810194","NOSE_000000810194",2009-12-04 17:03:38.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000581557","NOSE_000000581557",2010-04-11 07:32:39.0,",","NOSE",2,1,"de","P",1,5300,5300,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000788907","NOSE_000000788907",2010-01-28 07:03:23.0,",","NOSE",2,1,"de","P",1,5511,5511,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000105711","NOSE_000000105711",2009-07-15 15:21:15.0,",","NOSE",2,1,"de","P",1,5465,5465,"Good",,,4,0,1,0,0,0,0,0,0,4,"active" "000000176651","NOSE_000000176651",2009-08-29 05:20:00.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000076409","NOSE_000000076409",2010-07-21 07:14:06.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000129748","NOSE_000000129748",2009-07-31 19:02:53.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000545473","NOSE_000000545473",2010-07-08 12:48:36.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000331932","NOSE_000000331932",2009-12-04 16:52:04.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000784572","NOSE_000000784572",2009-06-29 15:56:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000733427","NOSE_000000733427",2009-05-18 10:32:36.0,",","NOSE",2,1,"fr","P",1,5097,5097,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000021310","NOSE_000000021310",2009-06-08 23:09:22.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,,3,3,3,0,0,0,0,0,0,0,"active" "000000037823","NOSE_000000037823",2009-12-04 16:43:09.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000059066","NOSE_000000059066",2010-02-17 07:03:39.0,",","NOSE",2,1,"en","P",1,5262,5262,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000853164","NOSE_000000853164",2009-12-04 17:10:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000573517","NOSE_000000573517",2010-04-29 11:52:55.0,",","NOSE",2,1,"en","P",1,5324,5324,"Good",,,1,4,1,0,0,0,0,0,0,2,"active" "000000941549","NOSE_000000941549",2009-05-18 10:32:37.0,",","NOSE",2,1,"de","P",1,5321,5323,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000884684","NOSE_000000884684",2009-06-08 23:37:15.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000243355","NOSE_000000243355",2009-04-29 19:37:03.0,",","NOSE",2,1,"en","P",1,5240,5240,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000428249","NOSE_000000428249",2009-04-29 19:26:43.0,",","NOSE",2,1,"fr","P",1,5216,5216,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000559717","NOSE_000000559717",2009-11-04 15:40:52.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000982129","NOSE_000000982129",2009-08-19 18:54:00.0,",","NOSE",2,1,"en","P",1,5340,5340,"Good",,,3,1,1,0,1,0,1,0,0,0,"active" "000000641013","NOSE_000000641013",2010-05-27 07:05:38.0,",","NOSE",,1,"de","P",1,,,,,,4,0,2,0,0,0,1,0,0,2,"active" "000000663818","NOSE_000000663818",2009-12-04 17:03:48.0,",","NOSE",,1,"en","P",1,,,,,,4,1,3,3,1,0,1,1,0,0,"active" "000000688037","NOSE_000000688037",2009-12-04 17:03:01.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000917421","NOSE_000000917421",2010-02-23 07:03:51.0,",","NOSE",2,1,"fr","P",1,5270,5270,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000117046","NOSE_000000117046",2009-04-29 19:33:59.0,",","NOSE",2,1,"en","P",1,5323,5323,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000800089","NOSE_000000800089",2009-07-31 19:03:34.0,",","NOSE",2,1,"en","P",1,4957,5341,"Good",,,4,0,0,0,1,0,1,0,0,0,"active" "000000202506","NOSE_000000202506",2009-05-18 10:32:39.0,",","NOSE",2,1,"fr","P",1,5169,5169,"Good",,"1",3,0,1,0,1,0,0,0,0,0,"active" "000000435062","NOSE_000000435062",2009-09-11 10:12:18.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000959634","NOSE_000000959634",2009-04-29 19:26:51.0,",","NOSE",2,1,"de","P",1,5035,5035,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000725052","NOSE_000000725052",2009-06-09 00:04:45.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",3,1,1,0,0,0,0,0,0,2,"active" "000000672480","NOSE_000000672480",2009-08-19 19:09:26.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000826982","NOSE_000000826982",2010-07-08 12:37:30.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000135907","NOSE_000000135907",2009-10-14 09:45:56.0,",","NOSE",2,1,"de","P",1,5499,5499,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000412003","NOSE_000000412003",2009-06-09 00:29:32.0,",","NOSE",2,1,"en","P",1,5190,5190,"At home",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000074649","NOSE_000000074649",2009-04-29 19:31:27.0,",","NOSE",2,1,"en","P",1,5102,5102,"Good",,"1",4,1,1,0,1,0,1,1,0,0,"active" "000000843459","NOSE_000000843459",2009-04-29 19:23:36.0,",","NOSE",2,1,"de","P",1,5348,5348,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000820270","NOSE_000000820270",2009-05-18 10:32:40.0,",","NOSE",2,1,"en","P",1,5092,5092,"Good",,"9",2,1,0,0,0,0,0,0,0,0,"active" "000000970985","NOSE_000000970985",2010-04-07 07:04:10.0,",","NOSE",,1,"de","P",1,5324,5324,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000493414","NOSE_000000493414",2009-07-31 19:25:34.0,",","NOSE",2,1,"de","P",1,5142,5142,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000300618","NOSE_000000300618",2009-05-18 10:32:41.0,",","NOSE",2,1,"de","P",1,5471,5261,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000651031","NOSE_000000651031",2009-10-18 20:15:25.0,",","NOSE",2,1,"de","P",1,5184,5184,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000133599","NOSE_000000133599",2009-05-18 10:32:43.0,",","NOSE",2,1,"fr","P",1,5312,5312,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000352137","NOSE_000000352137",2009-12-04 16:51:57.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000526812","NOSE_000000526812",2009-04-29 19:27:16.0,",","NOSE",2,1,"en","P",1,5345,5345,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000440850","NOSE_000000440850",2009-11-04 15:41:34.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000881902","NOSE_000000881902",2009-05-18 14:16:51.0,",","NOSE",2,1,"fr","P",1,5369,5369,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000245231","NOSE_000000245231",2010-07-27 07:10:59.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000500173","NOSE_000000500173",2009-12-14 12:53:14.0,",","NOSE",2,1,"en","P",1,5444,5444,"Good",,,3,0,1,0,0,0,1,0,0,0,"active" "000000161291","NOSE_000000161291",2009-07-31 19:03:57.0,",","NOSE",2,1,"de","P",1,-7,-7,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000258190","NOSE_000000258190",2009-12-04 17:03:53.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000059047","NOSE_000000059047",2009-08-31 14:59:59.0,",","NOSE",2,1,"en","P",1,5417,5417,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000012067","NOSE_000000012067",2009-04-29 19:39:24.0,",","NOSE",2,1,"en","P",1,5130,5130,"Good",,"1",1,1,0,0,0,0,0,0,2,0,"active" "000000783884","NOSE_000000783884",2010-06-05 07:05:20.0,",","NOSE",2,1,"en","P",1,5589,5589,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000908422","NOSE_000000908422",2009-05-18 10:32:44.0,",","NOSE",2,1,"de","P",1,5169,5189,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000321210","NOSE_000000321210",2009-06-09 01:24:23.0,",","NOSE",2,,,,,,,"Good",,,,,,,,,,,,,"active" "000000801075","NOSE_000000801075",2009-04-29 19:37:39.0,",","NOSE",2,1,"en","P",1,5191,5191,"Good",,"1",4,1,0,0,0,0,0,0,0,0,"active" "000000814596","NOSE_000000814596",2009-10-22 22:31:46.0,",","NOSE",2,1,"fr","P",1,5529,5529,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000262887","NOSE_000000262887",2009-05-18 10:32:46.0,",","NOSE",2,1,"fr","P",1,5188,5188,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000654571","NOSE_000000654571",2009-04-29 19:32:37.0,",","NOSE",2,1,"fr","P",1,5138,5138,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000578333","NOSE_000000578333",2010-04-18 07:04:42.0,",","NOSE",2,1,"en","P",1,5479,5479,"Good",,,3,2,3,0,0,0,0,0,0,0,"active" "000000389139","NOSE_000000389139",2010-04-22 07:04:32.0,",","NOSE",2,1,"en","P",1,5196,5196,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000968486","NOSE_000000968486",2009-05-18 10:32:47.0,",","NOSE",2,1,"de","P",1,4991,4993,"Good",,"9",0,-1,0,0,0,0,0,0,0,0,"active" "000000342468","NOSE_000000342468",2009-11-04 15:42:14.0,",","NOSE",2,1,"de","P",1,5348,5348,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000275515","NOSE_000000275515",2009-06-09 01:50:39.0,",","NOSE",2,1,"en","P",1,5246,5246,"Good",,,4,0,3,3,3,0,3,2,0,4,"active" "000000009790","NOSE_000000009790",2009-11-04 15:36:02.0,",","NOSE",2,1,"en","P",1,5180,5180,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000289413","NOSE_000000289413",2009-06-09 02:16:48.0,",","NOSE",2,1,"en","P",1,5283,5283,"Good",,"1",4,1,2,0,0,0,0,0,0,0,"active" "000000641530","NOSE_000000641530",2009-04-29 19:35:54.0,",","NOSE",2,1,"de","P",1,5217,5217,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000080027","NOSE_000000080027",2009-07-31 19:41:13.0,",","NOSE",2,1,"de","P",1,5062,5062,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000785869","NOSE_000000785869",2009-06-09 02:43:37.0,",","NOSE",2,1,"de","P",1,5468,5468,"Good",,,3,0,1,0,0,0,1,0,0,0,"active" "000000942309","NOSE_000000942309",2009-11-16 10:49:49.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000232646","NOSE_000000232646",2009-04-29 19:30:44.0,",","NOSE",2,1,"de","P",1,5485,5485,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000814044","NOSE_000000814044",2009-04-29 19:26:04.0,",","NOSE",2,1,"en","P",1,5027,5027,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000586551","NOSE_000000586551",2009-05-18 10:32:48.0,",","NOSE",,1,"de","P",1,,,,,"9",2,1,3,3,4,3,3,0,0,0,"active" "000000993537","NOSE_000000993537",2010-02-15 07:03:29.0,",","NOSE",2,1,"de","P",1,5441,5441,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000743047","NOSE_000000743047",2009-12-04 17:02:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000014905","NOSE_000000014905",2009-12-04 17:01:45.0,",","NOSE",2,1,"en","P",1,5094,5094,"Good",,,4,1,3,0,0,0,0,0,0,0,"active" "000000402477","NOSE_000000402477",2009-12-04 17:03:17.0,",","NOSE",2,1,"en","P",1,5132,5132,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000113294","NOSE_000000113294",2009-04-29 19:31:41.0,",","NOSE",2,1,"fr","P",1,5316,5316,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000000475","NOSE_000000000475",2010-06-21 12:30:51.0,",","NOSE",2,1,"en","P",1,5128,5128,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000129891","NOSE_000000129891",2009-06-09 03:06:52.0,",","NOSE",2,1,"en","P",1,4750,5134,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000443933","NOSE_000000443933",2009-04-29 19:20:55.0,",","NOSE",2,1,"en","P",1,5179,5179,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000067897","NOSE_000000067897",2009-10-14 10:13:57.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000138990","NOSE_000000138990",2009-09-01 10:33:58.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000512737","NOSE_000000512737",2009-04-29 19:30:32.0,",","NOSE",2,1,"de","P",1,5475,5475,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000479711","NOSE_000000479711",2009-04-29 19:19:29.0,",","NOSE",2,1,"en","P",1,5147,5147,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000988781","NOSE_000000988781",2009-08-20 06:00:24.0,",","NOSE",1,1,"en","P",1,5445,5445,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000009380","NOSE_000000009380",2010-07-21 07:05:27.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000999625","NOSE_000000999625",2009-06-09 03:34:33.0,",","NOSE",2,1,"de","P",1,5225,5225,"Good","

Due to language...

",,1,0,0,0,0,0,0,0,0,0,"active" "000000775080","NOSE_000000775080",2009-05-18 10:32:50.0,",","NOSE",2,1,"en","P",1,5274,5274,"Good",,"9",2,0,1,2,1,0,3,1,0,0,"active" "000000806119","NOSE_000000806119",2009-05-18 10:32:51.0,",","NOSE",2,1,"de","P",1,4940,4940,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000121887","NOSE_000000121887",2009-07-15 15:26:49.0,",","NOSE",2,1,"de","P",1,5520,5520,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000892214","NOSE_000000892214",2009-11-05 09:44:33.0,",","NOSE",2,1,"de","P",1,5426,5426,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000335680","NOSE_000000335680",2009-10-17 20:50:02.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000181864","NOSE_000000181864",2009-10-10 20:47:03.0,",","NOSE",2,1,"de","P",1,5519,5519,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000736546","NOSE_000000736546",2010-04-17 07:32:55.0,",","NOSE",2,1,"de","P",1,5133,5133,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000483749","NOSE_000000483749",2009-05-18 10:56:02.0,",","NOSE",2,,,,,,,"Missing","

Parent had to l...

",,,,,,,,,,,,"active" "000000326452","NOSE_000000326452",2009-07-31 19:04:41.0,",","NOSE",2,1,"fr","P",1,5587,5587,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000447729","NOSE_000000447729",2009-04-29 19:40:45.0,",","NOSE",2,1,"fr","P",1,5237,5237,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000281961","NOSE_000000281961",2009-06-29 16:26:01.0,",","NOSE",2,1,"de","P",1,5572,5572,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000959697","NOSE_000000959697",2009-08-31 15:07:18.0,",","NOSE",2,1,"de","P",1,5500,5500,"Good",,,2,1,2,0,0,0,0,0,0,0,"active" "000000309300","NOSE_000000309300",2009-07-02 09:49:13.0,",","NOSE",2,1,"fr","P",1,5362,5362,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000672728","NOSE_000000672728",2009-05-18 10:32:53.0,",","NOSE",2,1,"de","P",1,5193,5198,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000509349","NOSE_000000509349",2009-07-31 19:05:23.0,",","NOSE",2,1,"de","P",1,5452,5452,"Good",,,3,1,3,0,0,0,0,0,0,0,"active" "000000462875","NOSE_000000462875",2009-05-18 10:56:07.0,",","NOSE",2,1,"de","P",1,5649,5649,"Good",,"9",3,0,0,0,0,0,1,0,0,0,"active" "000000989196","NOSE_000000989196",2010-06-21 12:10:02.0,",","NOSE",,1,"en","P",1,5154,5154,,,,3,0,2,0,0,0,1,0,0,0,"active" "000000078832","NOSE_000000078832",2009-08-21 21:17:10.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,1,0,0,1,0,0,0,"active" "000000181144","NOSE_000000181144",2009-12-04 17:04:21.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000633251","NOSE_000000633251",2009-08-19 19:29:59.0,",","NOSE",2,1,"en","P",1,5036,5420,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000089666","NOSE_000000089666",2009-05-18 14:16:53.0,",","NOSE",2,1,"de","P",1,5169,5169,"Good",,"1",2,0,2,0,0,0,0,0,0,0,"active" "000000505818","NOSE_000000505818",2009-12-04 16:53:38.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000232928","NOSE_000000232928",2009-04-29 19:40:35.0,",","NOSE",2,1,"en","P",1,5283,5283,"Good",,"1",1,2,2,0,0,0,0,0,0,0,"active" "000000786287","NOSE_000000786287",2010-07-14 07:20:21.0,",","NOSE",,1,"de","P",1,5283,5283,,,,4,1,3,0,0,0,0,0,0,0,"active" "000000171032","NOSE_000000171032",2009-08-20 06:00:51.0,",","NOSE",2,1,"de","P",1,4872,4872,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000166494","NOSE_000000166494",2009-07-31 19:05:51.0,",","NOSE",2,1,"de","P",1,5318,5318,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000348034","NOSE_000000348034",2009-05-18 14:16:55.0,",","NOSE",2,1,"fr","P",1,5423,5423,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000695877","NOSE_000000695877",2009-04-29 19:37:13.0,",","NOSE",2,1,"fr","P",1,5439,5439,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000257406","NOSE_000000257406",2009-05-18 10:32:54.0,",","NOSE",2,1,"fr","P",1,5413,5413,"Good",,,4,0,0,0,0,0,4,0,0,0,"active" "000000386299","NOSE_000000386299",2010-07-08 12:49:48.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000897189","NOSE_000000897189",2010-06-17 07:04:59.0,",","NOSE",2,1,"fr","P",1,5269,5269,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000272766","NOSE_000000272766",2009-12-04 16:52:52.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000391651","NOSE_000000391651",2009-08-19 19:45:17.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000524159","NOSE_000000524159",2010-07-08 13:42:49.0,",","NOSE",1,1,"en","P",1,5211,5211,"Good","

drink craving o...

",,3,2,2,0,0,0,1,1,0,0,"active" "000000119593","NOSE_000000119593",2009-04-29 19:35:07.0,",","NOSE",2,1,"de","P",1,5207,5207,"Doubtful",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000295806","NOSE_000000295806",2009-12-04 17:01:01.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,2,0,2,2,0,0,"active" "000000086983","NOSE_000000086983",2009-12-04 17:02:43.0,",","NOSE",,1,"en","P",1,,,,,,1,2,1,0,0,0,0,0,0,0,"active" "000000270659","NOSE_000000270659",2009-04-29 19:40:05.0,",","NOSE",2,1,"en","P",1,5047,5047,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000221399","NOSE_000000221399",2009-10-13 15:32:36.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000377022","NOSE_000000377022",2009-12-04 16:25:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000082063","NOSE_000000082063",2009-05-18 10:32:56.0,",","NOSE",2,1,"de","P",1,5719,5353,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000689513","NOSE_000000689513",2009-04-29 19:37:33.0,",","NOSE",2,1,"de","P",1,5118,5118,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000738517","NOSE_000000738517",2010-07-08 12:24:42.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000675752","NOSE_000000675752",2010-04-18 07:05:05.0,",","NOSE",,1,"de","P",1,5352,5352,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000656766","NOSE_000000656766",2009-11-22 20:06:45.0,",","NOSE",2,1,"en","P",1,5173,5173,"Good",,,4,0,1,1,1,0,1,0,0,2,"active" "000000380913","NOSE_000000380913",2009-06-09 03:40:57.0,",","NOSE",2,1,"en","P",1,4670,5054,"Good",,"1",4,0,1,1,1,1,1,0,0,0,"active" "000000278489","NOSE_000000278489",2010-03-26 07:04:12.0,",","NOSE",2,1,"en","P",1,5209,5209,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000972531","NOSE_000000972531",2010-01-14 11:51:13.0,",","NOSE",2,1,"en","P",1,5475,5475,"Good",,,3,2,3,0,0,0,0,1,0,2,"active" "000000745063","NOSE_000000745063",2009-05-18 10:32:57.0,",","NOSE",2,1,"de","P",1,5353,5363,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000106125","NOSE_000000106125",2009-12-04 16:53:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000935618","NOSE_000000935618",2009-04-29 19:32:35.0,",","NOSE",2,1,"de","P",1,5298,5298,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000510272","NOSE_000000510272",2010-06-09 07:05:33.0,",","NOSE",,1,"de","P",1,,,,,,4,1,2,0,0,0,2,3,0,4,"active" "000000347499","NOSE_000000347499",2009-04-29 19:36:11.0,",","NOSE",2,1,"en","P",1,5121,5121,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000583142","NOSE_000000583142",2009-10-11 20:05:33.0,",","NOSE",2,1,"de","P",1,5450,5450,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000611484","NOSE_000000611484",2009-10-04 20:41:26.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000532202","NOSE_000000532202",2009-05-18 10:32:58.0,",","NOSE",2,1,"en","P",1,5105,5105,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000111692","NOSE_000000111692",2009-08-19 20:03:14.0,",","NOSE",2,1,"de","P",1,5441,5441,"Good",,,4,0,2,0,0,1,1,0,0,0,"active" "000000145651","NOSE_000000145651",2010-07-18 07:05:56.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000136409","NOSE_000000136409",2009-12-14 12:53:01.0,",","NOSE",2,1,"en","P",1,5209,5209,"Good",,,4,1,3,0,0,0,0,0,0,0,"active" "000000711829","NOSE_000000711829",2009-12-02 09:52:53.0,",","NOSE",2,1,"de","P",1,5317,5317,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000709215","NOSE_000000709215",2010-04-20 07:05:00.0,",","NOSE",2,1,"fr","P",1,4938,4938,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000540585","NOSE_000000540585",2009-04-29 19:42:21.0,",","NOSE",2,1,"fr","P",1,5458,5458,"Good",,"1",4,0,0,3,1,1,3,1,0,0,"active" "000000491206","NOSE_000000491206",2010-01-22 07:04:08.0,",","NOSE",2,1,"en","P",1,5157,5157,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000010322","NOSE_000000010322",2009-08-19 20:13:47.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000281202","NOSE_000000281202",2009-04-29 19:34:59.0,",","NOSE",2,1,"en","P",1,5084,5084,"Good",,"1",4,1,3,0,0,0,1,1,0,0,"active" "000000689676","NOSE_000000689676",2009-08-19 20:29:13.0,",","NOSE",2,1,"de","P",1,5407,5407,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000337029","NOSE_000000337029",2010-01-03 20:03:31.0,",","NOSE",2,1,"en","P",1,5126,5126,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000479341","NOSE_000000479341",2009-12-04 17:01:26.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000084743","NOSE_000000084743",2009-04-29 19:31:33.0,",","NOSE",2,1,"de","P",1,5340,5340,"Good",,"1",4,0,1,0,0,0,1,0,4,0,"active" "000000483513","NOSE_000000483513",2009-04-29 19:25:09.0,",","NOSE",2,1,"en","P",1,5413,5413,"Good",,"1",3,0,0,0,0,1,0,0,0,0,"active" "000000629369","NOSE_000000629369",2009-10-22 22:40:18.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000265044","NOSE_000000265044",2009-05-18 10:33:00.0,",","NOSE",2,1,"fr","P",1,5149,5149,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000707560","NOSE_000000707560",2010-04-11 07:09:03.0,",","NOSE",2,1,"fr","P",1,5086,5086,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000277421","NOSE_000000277421",2009-11-04 15:42:59.0,",","NOSE",2,1,"de","P",1,5162,5162,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000982695","NOSE_000000982695",2010-03-30 07:04:10.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000229742","NOSE_000000229742",2009-12-04 16:44:37.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000556488","NOSE_000000556488",2009-06-03 10:45:09.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,"1",4,0,1,0,0,0,1,1,0,0,"active" "000000309294","NOSE_000000309294",2010-01-14 11:53:06.0,",","NOSE",2,1,"de","P",1,5227,5227,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000232248","NOSE_000000232248",2010-06-21 12:18:21.0,",","NOSE",,1,"en","P",1,,,,,,4,1,3,0,0,0,0,2,0,0,"active" "000000250211","NOSE_000000250211",2010-03-03 07:04:37.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000552408","NOSE_000000552408",2009-12-04 16:51:28.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,1,0,0,0,"active" "000000174585","NOSE_000000174585",2009-11-12 10:01:10.0,",","NOSE",2,1,"en","P",1,5112,5112,"Good",,,2,2,1,0,0,0,0,0,0,0,"active" "000000843977","NOSE_000000843977",2009-04-29 19:27:51.0,",","NOSE",2,1,"en","P",1,5227,5227,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000513900","NOSE_000000513900",2009-06-09 04:06:04.0,",","NOSE",2,2,"de","P",1,5131,5131,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000117198","NOSE_000000117198",2010-03-23 07:04:58.0,",","NOSE",2,2,"en","P",1,5355,5355,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000396866","NOSE_000000396866",2009-12-04 16:52:47.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000223789","NOSE_000000223789",2010-07-03 07:05:18.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000197189","NOSE_000000197189",2010-06-21 12:12:48.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,2,2,"active" "000000931032","NOSE_000000931032",2009-04-29 19:39:10.0,",","NOSE",2,1,"fr","P",1,5234,5234,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000514812","NOSE_000000514812",2009-12-04 16:48:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000153043","NOSE_000000153043",2009-05-18 10:33:01.0,",","NOSE",2,1,"en","P",1,5443,5443,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000965536","NOSE_000000965536",2009-04-29 19:35:45.0,",","NOSE",2,1,"en","P",1,5312,5312,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000524904","NOSE_000000524904",2010-03-01 07:03:44.0,",","NOSE",2,1,"en","P",1,5125,5125,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000938408","NOSE_000000938408",2009-06-09 04:33:42.0,",","NOSE",2,1,"en","P",1,5172,5172,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000701344","NOSE_000000701344",2009-06-09 05:01:04.0,",","NOSE",2,1,"en","P",1,5270,5270,"Good",,,3,0,1,0,0,0,0,0,2,0,"active" "000000444748","NOSE_000000444748",2009-04-29 19:38:25.0,",","NOSE",2,1,"en","P",1,5296,5296,"Good",,"1",4,2,2,0,0,0,0,0,0,0,"active" "000000296316","NOSE_000000296316",2009-11-16 11:16:29.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000072207","NOSE_000000072207",2009-12-08 09:52:08.0,",","NOSE",2,1,"en","P",1,5165,5165,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000896138","NOSE_000000896138",2010-02-01 07:03:37.0,",","NOSE",2,1,"de","P",1,4817,4817,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000413303","NOSE_000000413303",2010-02-23 07:04:19.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000762585","NOSE_000000762585",2010-07-18 07:12:00.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000744347","NOSE_000000744347",2010-05-10 07:04:49.0,",","NOSE",2,1,"en","P",1,5411,5411,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000177959","NOSE_000000177959",2009-04-29 19:25:51.0,",","NOSE",2,1,"en","P",1,5328,5328,"Good",,"1",3,1,2,0,0,0,0,0,0,2,"active" "000000141936","NOSE_000000141936",2010-03-02 07:03:47.0,",","NOSE",2,1,"de","P",1,5237,5237,"Good",,,4,1,1,0,0,0,0,0,0,0,"active" "000000897866","NOSE_000000897866",2009-04-29 19:36:26.0,",","NOSE",2,1,"en","P",1,5153,5153,"Good",,"1",3,4,3,0,0,0,0,1,0,0,"active" "000000897700","NOSE_000000897700",2010-03-05 07:04:17.0,",","NOSE",,1,"de","P",1,5469,5469,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000193933","NOSE_000000193933",2009-12-04 17:02:00.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000817712","NOSE_000000817712",2010-01-31 07:03:40.0,",","NOSE",2,1,"en","P",1,5247,5247,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000359626","NOSE_000000359626",2010-07-15 07:05:21.0,",","NOSE",,1,"en","P",1,,,,,,1,0,2,0,0,0,0,0,0,0,"active" "000000029000","NOSE_000000029000",2009-05-18 10:33:03.0,",","NOSE",2,1,"fr","P",1,5210,5210,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000850524","NOSE_000000850524",2009-09-22 23:08:13.0,",","NOSE",2,1,"de","P",1,5381,5381,"Good",,,2,0,0,0,0,0,0,0,2,0,"active" "000000518106","NOSE_000000518106",2009-04-29 19:36:08.0,",","NOSE",2,1,"en","P",1,5362,5362,"Good",,"9",3,0,1,0,0,0,0,0,0,0,"active" "000000045204","NOSE_000000045204",2010-03-14 07:04:15.0,",","NOSE",2,1,"en","P",1,5197,5197,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000366867","NOSE_000000366867",2009-04-29 19:30:29.0,",","NOSE",2,1,"en","P",1,5158,5158,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000694051","NOSE_000000694051",2010-06-21 12:11:50.0,",","NOSE",2,1,"en","P",1,5119,5119,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000593721","NOSE_000000593721",2009-08-19 20:29:22.0,",","NOSE",2,1,"en","P",1,5351,5351,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000538838","NOSE_000000538838",2009-05-18 10:33:04.0,",","NOSE",2,1,"de","P",1,5450,5450,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000121154","NOSE_000000121154",2010-04-21 07:05:18.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000674988","NOSE_000000674988",2010-02-08 09:14:30.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000114562","NOSE_000000114562",2009-06-09 05:19:12.0,",","NOSE",2,1,"en","P",1,5069,5069,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000558692","NOSE_000000558692",2010-02-15 10:30:58.0,",","NOSE",2,1,"en","P",1,5138,5138,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000996959","NOSE_000000996959",2009-04-29 19:36:34.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000726649","NOSE_000000726649",2010-06-16 07:05:11.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,1,0,0,0,0,"active" "000000014697","NOSE_000000014697",2009-12-04 16:40:48.0,",","NOSE",2,1,"de","P",1,5398,5398,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000488719","NOSE_000000488719",2009-07-31 19:06:32.0,",","NOSE",2,1,"fr","P",1,5282,5282,"Good",,,1,1,2,0,0,0,0,0,0,0,"active" "000000241071","NOSE_000000241071",2010-06-02 07:05:07.0,",","NOSE",2,2,"en","P",1,5519,5519,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000669887","NOSE_000000669887",2009-04-29 19:34:13.0,",","NOSE",2,1,"en","P",1,5276,5276,"Good",,"1",3,0,1,0,0,0,0,0,2,0,"active" "000000939705","NOSE_000000939705",2009-06-29 16:28:42.0,",","NOSE",2,1,"fr","P",1,5103,5103,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000500755","NOSE_000000500755",2009-05-18 10:33:05.0,",","NOSE",2,1,"de","P",1,5000,5000,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000293149","NOSE_000000293149",2009-11-24 15:40:51.0,",","NOSE",2,1,"de","P",1,5419,5419,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000896283","NOSE_000000896283",2009-12-04 16:53:25.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000176749","NOSE_000000176749",2009-04-29 19:36:58.0,",","NOSE",2,1,"en","P",1,5027,5027,"Good",,"1",3,2,3,0,1,0,0,1,0,0,"active" "000000492327","NOSE_000000492327",2009-12-04 16:40:31.0,",","NOSE",2,1,"de","P",1,5112,5112,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000794436","NOSE_000000794436",2010-05-30 07:04:39.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000619195","NOSE_000000619195",2009-07-01 10:02:18.0,",","NOSE",2,1,"de","P",1,5372,5372,"Good",,,4,1,2,0,0,0,1,0,0,0,"active" "000000059100","NOSE_000000059100",2009-08-19 20:44:40.0,",","NOSE",2,1,"fr","P",1,5243,5243,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000461957","NOSE_000000461957",2009-06-29 16:56:17.0,",","NOSE",2,1,"en","P",1,5198,5198,"Good",,,3,0,2,0,0,0,1,0,0,0,"active" "000000781893","NOSE_000000781893",2010-05-13 07:05:03.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000391185","NOSE_000000391185",2009-04-29 19:36:46.0,",","NOSE",2,2,"en","P",1,5262,5500,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000183057","NOSE_000000183057",2009-06-29 17:25:32.0,",","NOSE",2,1,"de","P",1,5274,5274,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000120071","NOSE_000000120071",2009-07-02 09:50:45.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000292187","NOSE_000000292187",2009-12-01 20:06:49.0,",","NOSE",2,1,"en","P",1,5415,5415,"Good",,,3,1,1,1,0,0,0,0,0,4,"active" "000000589855","NOSE_000000589855",2009-12-04 16:52:49.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000808259","NOSE_000000808259",2009-05-18 10:33:07.0,",","NOSE",2,1,"de","P",1,5655,5434,"Good",,"9",1,1,1,0,0,0,0,0,0,0,"active" "000000526252","NOSE_000000526252",2009-06-09 05:45:39.0,",","NOSE",2,1,"de","P",1,5362,5362,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000102677","NOSE_000000102677",2009-05-18 10:33:08.0,",","NOSE",2,1,"en","P",1,5440,5440,"Good",,"9",3,2,2,0,1,0,2,1,0,0,"active" "000000530845","NOSE_000000530845",2009-12-04 16:58:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000078555","NOSE_000000078555",2009-05-18 10:33:10.0,",","NOSE",2,1,"de","P",1,5283,5283,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000585361","NOSE_000000585361",2009-04-29 19:36:29.0,",","NOSE",2,1,"de","P",1,5085,5085,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000937122","NOSE_000000937122",2009-05-18 10:33:11.0,",","NOSE",2,1,"en","P",1,5024,5024,"Good",,,3,0,1,0,0,0,1,1,0,0,"active" "000000338498","NOSE_000000338498",2009-05-18 10:33:13.0,",","NOSE",2,1,"de","P",1,5498,5146,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000698661","NOSE_000000698661",2010-01-16 07:05:06.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000076175","NOSE_000000076175",2009-05-18 10:33:14.0,",","NOSE",2,1,"de","P",1,5608,5256,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000977362","NOSE_000000977362",2009-04-29 19:38:19.0,",","NOSE",2,1,"en","P",1,5197,5197,"Good",,"9",3,1,0,0,0,0,0,0,0,0,"active" "000000278687","NOSE_000000278687",2009-05-18 10:33:15.0,",","NOSE",2,1,"de","P",1,5377,5377,"Good",,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000167406","NOSE_000000167406",2009-04-29 19:25:56.0,",","NOSE",2,1,"en","P",1,5028,5028,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000252934","NOSE_000000252934",2009-06-09 06:12:22.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,"1",4,0,0,1,1,0,1,0,0,0,"active" "000000351972","NOSE_000000351972",2010-02-14 07:03:33.0,",","NOSE",,1,"de","P",1,,,,,,4,0,3,0,0,0,4,0,2,2,"active" "000000016885","NOSE_000000016885",2009-11-26 20:19:49.0,",","NOSE",2,1,"en","P",1,5197,5197,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000136575","NOSE_000000136575",2009-05-18 10:33:17.0,",","NOSE",2,1,"en","P",1,5345,5345,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000644076","NOSE_000000644076",2010-07-08 12:39:13.0,",","NOSE",2,1,"fr","P",1,5156,5156,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000768190","NOSE_000000768190",2009-04-29 19:35:16.0,",","NOSE",2,1,"de","P",1,4994,4994,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000941646","NOSE_000000941646",2009-05-18 10:56:06.0,",","NOSE",2,1,"de","P",1,5166,5166,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000841924","NOSE_000000841924",2009-05-18 10:56:55.0,",","NOSE",2,1,"de","P",1,5168,5170,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000957059","NOSE_000000957059",2009-05-18 10:33:18.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000283546","NOSE_000000283546",2010-03-30 07:04:55.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000872710","NOSE_000000872710",2010-04-29 11:35:53.0,",","NOSE",2,1,"en","P",1,5154,5154,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000698722","NOSE_000000698722",2009-05-18 10:33:20.0,",","NOSE",2,1,"de","P",1,5333,5333,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000553249","NOSE_000000553249",2009-05-18 10:33:21.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,"1",1,3,1,1,0,1,1,1,2,2,"active" "000000088750","NOSE_000000088750",2009-12-04 17:01:23.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,1,1,0,0,"active" "000000695858","NOSE_000000695858",2009-12-04 16:53:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000337501","NOSE_000000337501",2009-04-29 19:36:20.0,",","NOSE",2,1,"en","P",1,5471,5471,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000270525","NOSE_000000270525",2009-05-18 10:33:22.0,",","NOSE",2,1,"en","P",1,5175,5175,"Good",,"9",4,0,0,0,0,0,0,0,0,0,"active" "000000759374","NOSE_000000759374",2009-12-04 17:03:20.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,0,0,"active" "000000683396","NOSE_000000683396",2009-04-29 19:38:52.0,",","NOSE",2,1,"de","P",1,5142,5142,"Good",,"1",2,0,0,0,0,0,0,0,2,0,"active" "000000726008","NOSE_000000726008",2010-02-26 07:03:46.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000309028","NOSE_000000309028",2009-04-29 19:24:09.0,",","NOSE",2,1,"en","P",1,5245,5245,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000211076","NOSE_000000211076",2009-05-18 10:33:24.0,",","NOSE",2,1,"de","P",1,5258,5258,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000245639","NOSE_000000245639",2009-04-29 19:19:10.0,",","NOSE",,1,"en","P",1,5198,5198,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000967938","NOSE_000000967938",2009-07-07 09:59:46.0,",","NOSE",2,1,"de","P",1,5209,5209,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000378915","NOSE_000000378915",2009-12-04 16:47:23.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000704638","NOSE_000000704638",2009-08-19 20:59:37.0,",","NOSE",2,1,"en","P",1,4967,5351,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000701902","NOSE_000000701902",2010-07-08 12:42:01.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000217056","NOSE_000000217056",2010-05-15 07:05:06.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000429504","NOSE_000000429504",2010-02-15 10:30:06.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,,2,2,1,1,0,0,0,0,0,0,"active" "000000490594","NOSE_000000490594",2010-07-11 07:05:05.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000576648","NOSE_000000576648",2009-12-04 16:51:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000204539","NOSE_000000204539",2009-08-19 21:14:48.0,",","NOSE",2,1,"en","P",1,5360,5360,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000215654","NOSE_000000215654",2009-06-03 10:45:00.0,",","NOSE",2,1,"en","P",1,5208,5208,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000270187","NOSE_000000270187",2009-12-04 17:02:54.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000187084","NOSE_000000187084",2009-12-04 16:49:34.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000978351","NOSE_000000978351",2010-04-01 07:05:50.0,",","NOSE",2,1,"de","P",1,5267,5267,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000697505","NOSE_000000697505",2009-04-29 19:39:16.0,",","NOSE",2,2,"de","P",1,5507,5933,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000535474","NOSE_000000535474",2009-06-09 06:56:19.0,",","NOSE",2,1,"de","P",1,5119,5119,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000534137","NOSE_000000534137",2009-04-29 19:26:12.0,",","NOSE",2,1,"en","P",1,5242,5242,"Good",,"1",4,1,0,0,0,0,0,0,0,0,"active" "000000065115","NOSE_000000065115",2009-12-04 17:01:55.0,",","NOSE",,1,"en","P",1,,,,,,3,1,2,0,0,0,0,1,0,0,"active" "000000013340","NOSE_000000013340",2009-05-18 10:33:25.0,",","NOSE",2,1,"fr","P",1,5414,5414,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000273740","NOSE_000000273740",2009-04-29 19:16:20.0,",","NOSE",2,1,"en","P",1,5127,5127,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000946077","NOSE_000000946077",2009-04-29 19:35:42.0,",","NOSE",2,1,"fr","P",1,5212,5212,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000369583","NOSE_000000369583",2009-04-29 19:35:51.0,",","NOSE",2,1,"en","P",1,5422,5422,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000794499","NOSE_000000794499",2009-07-06 13:22:26.0,",","NOSE",2,1,"de","P",1,5519,5519,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000330965","NOSE_000000330965",2010-04-17 07:05:19.0,",","NOSE",2,1,"en","P",1,5262,5262,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000951742","NOSE_000000951742",2009-06-09 07:01:06.0,",","NOSE",2,1,"de","P",1,5002,5002,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000086635","NOSE_000000086635",2009-05-18 10:33:26.0,",","NOSE",2,1,"de","P",1,5158,5158,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000170846","NOSE_000000170846",2009-11-04 15:43:40.0,",","NOSE",2,1,"en","P",1,5258,5258,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000754762","NOSE_000000754762",2009-05-18 10:33:28.0,",","NOSE",2,1,"de","P",1,5137,5137,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000102524","NOSE_000000102524",2009-04-29 19:30:12.0,",","NOSE",2,1,"de","P",1,5089,5089,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000700814","NOSE_000000700814",2010-06-28 07:04:56.0,",","NOSE",2,1,"fr","P",1,5443,5443,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000941730","NOSE_000000941730",2009-04-29 19:41:02.0,",","NOSE",2,1,"en","P",1,5409,5409,"Good",,"1",2,2,2,0,1,0,1,1,0,0,"active" "000000035923","NOSE_000000035923",2009-07-31 19:07:00.0,",","NOSE",1,1,"en","P",1,5027,5411,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000919361","NOSE_000000919361",2009-11-18 12:27:48.0,",","NOSE",2,1,"de","P",1,5418,5418,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000972759","NOSE_000000972759",2009-06-09 07:27:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000855711","NOSE_000000855711",2009-05-18 10:33:29.0,",","NOSE",2,1,"de","P",1,5172,5172,"Good",,"1",4,1,2,0,0,0,0,0,0,2,"active" "000000183588","NOSE_000000183588",2010-07-08 12:45:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000315365","NOSE_000000315365",2009-08-19 21:29:54.0,",","NOSE",2,1,"de","P",1,5180,5180,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000548576","NOSE_000000548576",2010-03-17 07:04:16.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000865077","NOSE_000000865077",2009-12-04 16:51:01.0,",","NOSE",,1,"de","P",1,,,,,,4,0,2,0,0,1,1,0,0,0,"active" "000000089717","NOSE_000000089717",2009-12-04 17:02:26.0,",","NOSE",2,1,"en","P",1,5145,5145,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000124238","NOSE_000000124238",2009-12-09 20:07:06.0,",","NOSE",2,1,"de","P",1,5265,5265,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000275300","NOSE_000000275300",2009-05-18 10:56:03.0,",","NOSE",2,1,"de","P",1,5655,5655,"Good",,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000692350","NOSE_000000692350",2009-04-29 19:30:03.0,",","NOSE",2,1,"en","P",1,5382,5382,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000503064","NOSE_000000503064",2010-06-27 07:04:48.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000245506","NOSE_000000245506",2010-01-25 07:03:16.0,",","NOSE",2,1,"de","P",1,5226,5226,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000132628","NOSE_000000132628",2009-12-04 16:25:38.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000302329","NOSE_000000302329",2009-06-09 07:51:09.0,",","NOSE",2,1,"en","P",1,4952,5336,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000992664","NOSE_000000992664",2010-03-28 07:03:58.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000806367","NOSE_000000806367",2009-05-18 10:33:31.0,",","NOSE",2,1,"fr","P",1,5494,5494,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000155006","NOSE_000000155006",2009-04-29 19:25:01.0,",","NOSE",2,1,"en","P",1,5484,5484,"Good",,"9",3,0,0,0,0,0,1,0,0,0,"active" "000000503670","NOSE_000000503670",2009-09-30 15:26:29.0,",","NOSE",2,1,"en","P",1,4988,4988,"Good",,,4,1,3,0,0,0,1,0,0,0,"active" "000000290626","NOSE_000000290626",2010-03-12 07:03:57.0,",","NOSE",2,1,"en","P",1,5188,5188,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000294544","NOSE_000000294544",2010-02-27 07:03:54.0,",","NOSE",2,1,"en","P",1,5276,5276,"Good",,,4,0,2,0,0,0,0,0,0,0,"active" "000000883116","NOSE_000000883116",2009-04-29 19:34:07.0,",","NOSE",2,1,"en","P",1,5478,5478,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000122624","NOSE_000000122624",2010-06-01 07:05:33.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000561318","NOSE_000000561318",2009-05-18 10:33:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000975214","NOSE_000000975214",2009-04-29 19:37:36.0,",","NOSE",2,1,"en","P",1,5170,5170,"Good",,"1",4,0,1,1,1,0,1,1,0,0,"active" "000000884189","NOSE_000000884189",2009-04-29 19:38:16.0,",","NOSE",2,1,"de","P",1,5144,5144,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000390295","NOSE_000000390295",2009-07-31 19:07:23.0,",","NOSE",2,1,"de","P",1,5361,5361,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000642221","NOSE_000000642221",2009-05-18 10:33:33.0,",","NOSE",2,1,"de","P",1,5123,5123,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000006720","NOSE_000000006720",2009-05-18 10:33:35.0,",","NOSE",2,1,"de","P",1,5807,5450,"Good",,"1",2,3,3,0,0,0,1,1,0,0,"active" "000000808426","NOSE_000000808426",2009-05-18 14:17:05.0,",","NOSE",2,1,"en","P",1,5210,5210,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000474621","NOSE_000000474621",2009-04-29 19:32:08.0,",","NOSE",,1,"de","P",1,,,,,"9",3,1,3,1,2,0,2,1,0,2,"active" "000000658517","NOSE_000000658517",2009-06-29 18:12:56.0,",","NOSE",2,1,"en","P",1,5207,5207,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000995377","NOSE_000000995377",2009-04-29 19:32:14.0,",","NOSE",2,1,"en","P",1,5230,5230,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000447072","NOSE_000000447072",2009-08-19 21:42:55.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000416407","NOSE_000000416407",2009-12-04 16:52:54.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000119447","NOSE_000000119447",2010-05-26 07:06:44.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,2,"active" "000000476689","NOSE_000000476689",2009-12-04 16:46:17.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000097289","NOSE_000000097289",2009-04-29 19:33:19.0,",","NOSE",2,1,"de","P",1,4987,4987,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000888438","NOSE_000000888438",2009-04-29 19:29:36.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000923441","NOSE_000000923441",2010-03-18 07:08:00.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000425720","NOSE_000000425720",2009-04-29 19:35:20.0,",","NOSE",2,1,"de","P",1,5119,5119,"Good",,"9",3,0,1,0,0,0,1,0,0,0,"active" "000000316454","NOSE_000000316454",2009-11-27 10:18:47.0,",","NOSE",2,1,"de","P",1,5259,5259,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000874903","NOSE_000000874903",2009-10-03 20:25:27.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000739373","NOSE_000000739373",2009-07-31 19:07:44.0,",","NOSE",2,1,"de","P",1,5253,5253,"Good",,,4,1,1,0,0,0,1,0,0,0,"active" "000000042282","NOSE_000000042282",2009-12-04 17:01:15.0,",","NOSE",,1,"en","P",1,,,,,,4,4,1,0,1,0,4,4,2,2,"active" "000000875019","NOSE_000000875019",2009-09-20 20:14:49.0,",","NOSE",2,1,"fr","P",1,5291,5291,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000984883","NOSE_000000984883",2010-07-08 12:40:27.0,",","NOSE",,1,"de","P",1,,,,,,2,2,1,0,0,0,0,0,0,0,"active" "000000200445","NOSE_000000200445",2009-04-29 19:36:25.0,",","NOSE",2,1,"fr","P",1,5481,5481,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000574304","NOSE_000000574304",2009-04-29 19:37:29.0,",","NOSE",2,1,"de","P",1,5469,5469,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000226321","NOSE_000000226321",2010-01-12 20:03:33.0,",","NOSE",2,1,"de","P",1,5421,5421,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000088640","NOSE_000000088640",2009-12-04 16:52:02.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000017103","NOSE_000000017103",2009-08-19 21:48:17.0,",","NOSE",2,1,"de","P",1,5418,5418,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000874563","NOSE_000000874563",2009-04-29 19:37:56.0,",","NOSE",2,1,"en","P",1,5392,5392,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000346343","NOSE_000000346343",2009-04-29 19:38:13.0,",","NOSE",2,1,"de","P",1,5048,5048,"Good",,"9",2,2,2,0,0,0,1,0,0,0,"active" "000000670072","NOSE_000000670072",2009-06-29 18:42:54.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000796062","NOSE_000000796062",2010-05-26 07:04:43.0,",","NOSE",2,2,"fr","P",1,5087,5087,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000122027","NOSE_000000122027",2009-04-29 19:28:38.0,",","NOSE",2,1,"de","P",1,4980,4980,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000375065","NOSE_000000375065",2009-04-29 19:41:48.0,",","NOSE",2,1,"de","P",1,5262,5262,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000049767","NOSE_000000049767",2009-04-29 19:33:24.0,",","NOSE",2,1,"en","P",1,5106,5106,"Good",,"1",4,2,2,2,0,0,1,0,0,4,"active" "000000567876","NOSE_000000567876",2009-12-04 17:00:06.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,2,0,"active" "000000588941","NOSE_000000588941",2009-11-20 14:06:42.0,",","NOSE",2,1,"en","P",1,5295,5295,"Good",,,3,0,1,0,1,0,0,0,0,0,"active" "000000394741","NOSE_000000394741",2009-12-04 17:02:13.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000731022","NOSE_000000731022",2009-04-29 19:43:50.0,",","NOSE",2,1,"de","P",1,5131,5131,"Good",,"1",3,0,1,0,0,0,0,0,2,0,"active" "000000597631","NOSE_000000597631",2009-07-06 13:51:19.0,",","NOSE",2,1,"de","P",1,5212,5212,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000055372","NOSE_000000055372",2009-04-29 19:24:17.0,",","NOSE",2,1,"en","P",1,5335,5335,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000983232","NOSE_000000983232",2009-09-25 00:03:15.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000965348","NOSE_000000965348",2009-04-29 19:45:51.0,",","NOSE",2,1,"en","P",1,5417,5417,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000446657","NOSE_000000446657",2010-05-19 07:05:14.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000466652","NOSE_000000466652",2009-08-19 22:03:50.0,",","NOSE",2,1,"en","P",1,5341,5341,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000364118","NOSE_000000364118",2009-04-29 19:40:42.0,",","NOSE",2,1,"en","P",1,5468,5468,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000470665","NOSE_000000470665",2010-04-29 11:53:28.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000528241","NOSE_000000528241",2010-04-08 07:08:56.0,",","NOSE",2,1,"de","P",1,5129,5129,"Good",,,3,0,0,1,0,0,0,0,0,0,"active" "000000877464","NOSE_000000877464",2009-05-18 14:17:06.0,",","NOSE",2,1,"fr","P",1,5409,5409,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000346052","NOSE_000000346052",2009-04-29 19:29:14.0,",","NOSE",2,1,"de","P",1,5094,5094,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000761019","NOSE_000000761019",2009-09-27 01:10:14.0,",","NOSE",2,1,"de","P",1,5536,5536,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000725927","NOSE_000000725927",2009-04-29 19:48:39.0,",","NOSE",2,2,"en","P",1,5268,5268,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000012240","NOSE_000000012240",2009-06-03 10:42:35.0,",","NOSE",2,1,"en","P",1,5238,5238,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000235649","NOSE_000000235649",2009-11-10 20:58:21.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,1,1,0,0,"active" "000000045035","NOSE_000000045035",2010-06-08 07:06:42.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000765361","NOSE_000000765361",2010-01-30 07:03:24.0,",","NOSE",2,1,"en","P",1,5243,5243,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000764361","NOSE_000000764361",2009-04-29 19:49:41.0,",","NOSE",2,1,"de","P",1,5297,5297,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000051800","NOSE_000000051800",2009-09-04 04:49:04.0,",","NOSE",2,1,"de","P",1,5091,5091,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000965909","NOSE_000000965909",2009-04-29 19:24:20.0,",","NOSE",2,1,"de","P",1,5260,5260,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000546346","NOSE_000000546346",2009-04-29 19:26:35.0,",","NOSE",2,1,"en","P",1,5160,5160,"Good",,"1",3,1,0,1,1,0,1,1,0,2,"active" "000000076382","NOSE_000000076382",2009-04-29 19:26:45.0,",","NOSE",2,1,"en","P",1,5117,5117,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000376616","NOSE_000000376616",2009-12-04 17:01:13.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,0,0,"active" "000000005298","NOSE_000000005298",2009-04-29 19:54:00.0,",","NOSE",2,1,"de","P",1,5369,5369,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000250779","NOSE_000000250779",2010-07-13 07:06:21.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000653950","NOSE_000000653950",2010-06-21 12:04:02.0,",","NOSE",2,1,"en","P",1,5212,5212,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000751885","NOSE_000000751885",2009-04-29 19:55:06.0,",","NOSE",2,1,"de","P",1,5665,5665,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000671300","NOSE_000000671300",2009-04-29 19:56:12.0,",","NOSE",2,1,"en","P",1,5210,5210,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000447155","NOSE_000000447155",2009-04-29 19:40:52.0,",","NOSE",2,1,"fr","P",1,5624,5624,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000426804","NOSE_000000426804",2009-12-04 17:03:14.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000394349","NOSE_000000394349",2009-04-29 19:37:06.0,",","NOSE",2,1,"fr","P",1,5311,5311,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000704694","NOSE_000000704694",2009-04-29 19:59:20.0,",","NOSE",2,1,"de","P",1,5580,5228,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000271697","NOSE_000000271697",2009-04-29 20:00:28.0,",","NOSE",2,1,"en","P",1,5343,5343,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000485794","NOSE_000000485794",2009-04-29 19:36:03.0,",","NOSE",2,1,"en","P",1,5331,5331,"At home",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000500158","NOSE_000000500158",2009-04-29 20:02:38.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000501791","NOSE_000000501791",2009-04-29 20:03:44.0,",","NOSE",2,1,"fr","P",1,4985,4985,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000252092","NOSE_000000252092",2009-11-29 20:06:42.0,",","NOSE",2,1,"en","P",1,5080,5080,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000954723","NOSE_000000954723",2009-10-26 20:43:51.0,",","NOSE",2,1,"fr","P",1,5412,5412,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000600124","NOSE_000000600124",2009-07-31 19:08:06.0,",","NOSE",2,1,"de","P",1,5139,5139,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000755699","NOSE_000000755699",2009-04-29 20:04:46.0,",","NOSE",2,1,"de","P",1,5549,5192,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000680763","NOSE_000000680763",2009-04-29 19:23:45.0,",","NOSE",2,1,"de","P",1,5356,5356,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000306854","NOSE_000000306854",2010-01-29 07:03:48.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000250445","NOSE_000000250445",2009-04-29 19:34:30.0,",","NOSE",2,1,"en","P",1,5439,5439,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000935121","NOSE_000000935121",2009-08-20 06:03:22.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000445437","NOSE_000000445437",2010-04-29 11:59:20.0,",","NOSE",,1,"de","P",1,1540,1540,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000710008","NOSE_000000710008",2009-08-19 22:19:26.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000728027","NOSE_000000728027",2009-04-29 19:26:54.0,",","NOSE",2,1,"de","P",1,5351,5351,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000206563","NOSE_000000206563",2009-04-29 20:08:14.0,",","NOSE",2,1,"de","P",1,4964,4964,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000812959","NOSE_000000812959",2010-02-15 10:30:29.0,",","NOSE",2,1,"en","P",1,5217,5217,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000060589","NOSE_000000060589",2009-09-05 22:41:17.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000848133","NOSE_000000848133",2009-11-18 12:28:22.0,",","NOSE",2,1,"de","P",1,5364,5364,"Good",,,2,1,2,1,0,0,0,0,0,0,"active" "000000797467","NOSE_000000797467",2009-07-31 19:08:22.0,",","NOSE",2,1,"en","P",1,5123,5123,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000428101","NOSE_000000428101",2010-02-09 07:06:10.0,",","NOSE",2,1,"de","P",1,5105,5105,"Good",,,3,2,3,0,0,0,0,0,0,0,"active" "000000187223","NOSE_000000187223",2009-04-29 19:31:48.0,",","NOSE",2,1,"de","P",1,5248,5248,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000410419","NOSE_000000410419",2009-09-18 14:24:42.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000649709","NOSE_000000649709",2009-12-04 16:53:12.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000383991","NOSE_000000383991",2009-04-29 19:40:49.0,",","NOSE",2,1,"fr","P",1,5146,5146,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000115829","NOSE_000000115829",2009-04-29 20:11:36.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000439004","NOSE_000000439004",2009-04-29 20:11:57.0,",","NOSE",2,1,"de","P",1,5485,5498,"Good",,"1",3,0,1,0,0,0,1,0,0,0,"active" "000000472167","NOSE_000000472167",2009-12-04 16:52:30.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000863006","NOSE_000000863006",2009-04-29 20:13:03.0,",","NOSE",2,1,"de","P",1,5382,5382,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000736809","NOSE_000000736809",2009-04-29 20:14:08.0,",","NOSE",2,1,"en","P",1,5077,5077,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000947325","NOSE_000000947325",2009-04-29 20:15:12.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000109451","NOSE_000000109451",2009-04-29 19:25:40.0,",","NOSE",2,1,"de","P",1,4944,4944,"Good",,"1",2,1,2,0,0,0,0,0,0,0,"active" "000000583946","NOSE_000000583946",2009-12-04 16:53:18.0,",","NOSE",,1,"de","P",1,,,,,,4,1,4,0,0,0,1,0,0,4,"active" "000000990934","NOSE_000000990934",2009-04-29 19:24:58.0,",","NOSE",2,1,"fr","P",1,5189,5189,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000589967","NOSE_000000589967",2009-12-04 16:40:55.0,",","NOSE",2,1,"de","P",1,5105,5105,"Good",,,2,1,2,1,0,0,0,0,0,0,"active" "000000934671","NOSE_000000934671",2009-04-29 20:18:02.0,",","NOSE",2,1,"de","P",1,5125,5126,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000710505","NOSE_000000710505",2010-02-14 07:10:10.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000942448","NOSE_000000942448",2010-06-11 07:05:17.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000316586","NOSE_000000316586",2009-06-09 08:51:50.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000526379","NOSE_000000526379",2009-04-29 19:35:57.0,",","NOSE",2,1,"en","P",1,5322,5322,"Good",,"1",4,1,1,0,0,0,1,0,0,0,"active" "000000727958","NOSE_000000727958",2010-04-16 07:05:10.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,1,0,0,0,"active" "000000669877","NOSE_000000669877",2009-04-29 20:20:18.0,",","NOSE",2,1,"de","P",1,5133,5133,"Good",,"1",1,2,1,1,0,0,3,1,0,0,"active" "000000894157","NOSE_000000894157",2010-01-23 07:13:35.0,",","NOSE",2,1,"de","P",1,5124,5124,"Good",,,2,0,0,0,0,0,2,0,0,0,"active" "000000538990","NOSE_000000538990",2010-06-10 07:05:29.0,",","NOSE",2,1,"fr","P",1,5184,5184,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000660436","NOSE_000000660436",2009-11-04 15:44:03.0,",","NOSE",2,1,"fr","P",1,5174,5174,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000355022","NOSE_000000355022",2010-03-16 07:05:23.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000691591","NOSE_000000691591",2009-04-29 19:31:51.0,",","NOSE",2,1,"en","P",1,5104,5104,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000095190","NOSE_000000095190",2009-10-06 09:50:07.0,",","NOSE",2,1,"en","P",1,5118,5118,"Good",,,3,2,3,1,1,0,1,1,0,4,"active" "000000746816","NOSE_000000746816",2010-05-19 07:04:46.0,",","NOSE",2,1,"fr","P",1,5573,5573,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000985561","NOSE_000000985561",2009-04-29 20:22:35.0,",","NOSE",2,1,"de","P",1,4847,4847,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000992920","NOSE_000000992920",2009-09-30 15:51:34.0,",","NOSE",2,,,,,,,"Missing","

Test could not ...

",,,,,,,,,,,,"active" "000000488140","NOSE_000000488140",2009-06-09 10:22:46.0,",","NOSE",2,1,"en","P",1,5251,5251,"Good",,"1",4,1,2,2,1,0,2,2,0,4,"active" "000000703690","NOSE_000000703690",2009-08-20 06:04:00.0,",","NOSE",2,1,"de","P",1,5506,5506,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000505343","NOSE_000000505343",2009-06-12 20:37:01.0,",","NOSE",2,1,"en","P",1,5296,5296,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000823475","NOSE_000000823475",2009-04-29 20:23:45.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,1,0,0,1,1,0,0,"active" "000000523337","NOSE_000000523337",2009-04-29 19:41:29.0,",","NOSE",2,1,"en","P",1,5333,5333,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000260858","NOSE_000000260858",2009-04-29 20:26:11.0,",","NOSE",2,1,"de","P",1,5012,5012,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000048209","NOSE_000000048209",2010-04-14 07:04:33.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000880160","NOSE_000000880160",2009-09-29 22:42:04.0,",","NOSE",2,1,"de","P",1,5137,5137,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000417328","NOSE_000000417328",2009-04-29 20:27:11.0,",","NOSE",2,1,"de","P",1,5673,5452,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000410724","NOSE_000000410724",2009-04-29 20:28:19.0,",","NOSE",2,1,"fr","P",1,5200,5200,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000960611","NOSE_000000960611",2009-12-04 16:42:08.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000974777","NOSE_000000974777",2009-04-29 19:35:36.0,",","NOSE",2,1,"en","P",1,5129,5129,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000243964","NOSE_000000243964",2009-04-29 20:30:40.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000871045","NOSE_000000871045",2009-04-29 19:28:44.0,",","NOSE",2,1,"de","P",1,5160,5160,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000549249","NOSE_000000549249",2009-04-29 20:32:58.0,",","NOSE",2,1,"de","P",1,5109,5109,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000412042","NOSE_000000412042",2009-08-19 22:42:50.0,",","NOSE",2,1,"de","P",1,5343,5343,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000370078","NOSE_000000370078",2009-10-17 00:07:49.0,",","NOSE",2,1,"de","P",1,5261,5261,"Good",,,3,1,3,0,0,0,0,0,0,0,"active" "000000411433","NOSE_000000411433",2010-07-08 12:39:41.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000492938","NOSE_000000492938",2009-04-29 20:33:18.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000862534","NOSE_000000862534",2010-05-23 07:04:43.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000659590","NOSE_000000659590",2010-02-16 07:04:08.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000283504","NOSE_000000283504",2009-08-06 13:26:20.0,",","NOSE",2,1,"en","P",1,5103,5103,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000958625","NOSE_000000958625",2009-04-29 19:35:10.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018083","NOSE_000000018083",2009-04-29 19:32:58.0,",","NOSE",2,1,"de","P",1,5010,5010,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000372455","NOSE_000000372455",2009-04-29 19:30:50.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000191130","NOSE_000000191130",2009-04-29 19:37:30.0,",","NOSE",2,1,"en","P",1,5255,5255,"Good",,"1",3,2,1,0,0,0,1,4,0,4,"active" "000000197051","NOSE_000000197051",2009-07-15 15:49:08.0,",","NOSE",2,1,"de","P",1,5379,5379,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000164752","NOSE_000000164752",2009-09-21 23:07:41.0,",","NOSE",2,1,"fr","P",1,5291,5291,"Good",,,3,1,2,0,0,0,0,0,0,0,"active" "000000703567","NOSE_000000703567",2009-09-25 07:09:32.0,",","NOSE",2,1,"fr","P",1,5105,5105,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000130145","NOSE_000000130145",2010-07-08 12:37:41.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000570045","NOSE_000000570045",2010-02-22 07:04:59.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000235257","NOSE_000000235257",2009-04-29 19:21:01.0,",","NOSE",2,1,"en","P",1,5154,5154,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000078434","NOSE_000000078434",2009-04-29 20:40:05.0,",","NOSE",,1,"en","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000442258","NOSE_000000442258",2009-12-01 20:06:46.0,",","NOSE",2,1,"en","P",1,5335,5335,"Good",,,3,1,1,1,0,0,1,0,0,0,"active" "000000058468","NOSE_000000058468",2010-06-21 12:49:04.0,",","NOSE",,1,"en","P",1,5122,5122,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000785394","NOSE_000000785394",2009-09-08 23:59:34.0,",","NOSE",2,1,"de","P",1,5197,5197,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000734236","NOSE_000000734236",2010-06-07 07:06:09.0,",","NOSE",2,1,"fr","P",1,5138,5138,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000816976","NOSE_000000816976",2009-12-04 17:01:21.0,",","NOSE",,1,"en","P",1,,,,,,1,1,0,2,0,0,0,0,0,0,"active" "000000927771","NOSE_000000927771",2009-12-01 20:06:43.0,",","NOSE",2,1,"en","P",1,5350,5350,"Good",,,1,2,0,0,0,0,0,0,0,0,"active" "000000795763","NOSE_000000795763",2009-12-28 20:03:31.0,",","NOSE",2,1,"de","P",1,5131,5131,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000512947","NOSE_000000512947",2009-04-29 20:41:16.0,",","NOSE",2,1,"de","P",1,5363,5363,"Good",,"9",4,0,1,0,0,0,0,0,0,2,"active" "000000799627","NOSE_000000799627",2009-06-12 21:29:32.0,",","NOSE",2,1,"fr","P",1,5032,5032,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000922855","NOSE_000000922855",2009-12-04 16:54:03.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000163588","NOSE_000000163588",2009-04-29 19:33:06.0,",","NOSE",2,1,"de","P",1,5279,5279,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000613122","NOSE_000000613122",2009-04-29 20:43:36.0,",","NOSE",2,1,"de","P",1,5426,5426,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000691682","NOSE_000000691682",2009-12-04 16:40:45.0,",","NOSE",2,1,"de","P",1,5173,5173,"Good",,,2,0,2,0,0,0,0,0,0,0,"active" "000000984195","NOSE_000000984195",2009-04-29 19:41:43.0,",","NOSE",2,1,"fr","P",1,5207,5207,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000495808","NOSE_000000495808",2009-04-29 19:24:40.0,",","NOSE",2,1,"en","P",1,5422,5422,"Good","

ticked ^ wrong ...

","1",1,1,1,0,0,0,0,0,0,0,"active" "000000796435","NOSE_000000796435",2010-02-26 07:03:41.0,",","NOSE",2,1,"de","P",1,5534,5534,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000645112","NOSE_000000645112",2010-06-01 07:07:57.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000425503","NOSE_000000425503",2009-08-06 14:04:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000422113","NOSE_000000422113",2009-04-29 20:47:10.0,",","NOSE",2,1,"en","P",1,5177,5177,"Good","

sister found ou...

","0",1,2,1,0,0,0,0,1,0,0,"active" "000000808618","NOSE_000000808618",2009-12-03 20:07:29.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000599336","NOSE_000000599336",2009-04-29 19:36:55.0,",","NOSE",2,1,"fr","P",1,5123,5123,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000032130","NOSE_000000032130",2009-06-03 10:45:20.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,"1",3,2,2,0,1,0,1,0,0,0,"active" "000000111088","NOSE_000000111088",2009-04-29 20:48:52.0,",","NOSE",2,1,"de","P",1,5620,5268,"Good",,"1",1,1,1,0,0,0,0,0,0,0,"active" "000000215650","NOSE_000000215650",2009-11-10 21:12:12.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000882773","NOSE_000000882773",2010-07-08 12:41:47.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,1,0,0,0,0,0,0,"active" "000000070393","NOSE_000000070393",2009-04-29 19:23:42.0,",","NOSE",2,1,"de","P",1,5067,5067,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000655639","NOSE_000000655639",2009-12-04 16:57:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000001219","NOSE_000000001219",2010-07-27 07:05:53.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000410794","NOSE_000000410794",2009-06-12 22:25:21.0,",","NOSE",2,1,"de","P",1,5298,5298,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000667008","NOSE_000000667008",2009-12-04 17:08:28.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000368361","NOSE_000000368361",2009-07-01 10:49:13.0,",","NOSE",2,1,"en","P",1,5174,5174,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000777629","NOSE_000000777629",2009-04-29 20:51:21.0,",","NOSE",2,1,"en","P",1,5107,5107,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000980906","NOSE_000000980906",2009-04-29 20:52:30.0,",","NOSE",2,1,"de","P",1,5422,5422,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000636312","NOSE_000000636312",2009-10-17 00:34:52.0,",","NOSE",2,1,"de","P",1,5257,5257,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000498628","NOSE_000000498628",2010-04-16 07:09:34.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000643280","NOSE_000000643280",2010-02-22 07:03:50.0,",","NOSE",2,1,"en","P",1,5248,5248,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000919813","NOSE_000000919813",2010-07-08 12:37:07.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000464528","NOSE_000000464528",2009-09-06 21:02:13.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,,1,3,1,0,0,0,0,0,0,0,"active" "000000157957","NOSE_000000157957",2009-04-29 20:53:34.0,",","NOSE",2,1,"en","P",1,5383,5383,"Good",,"1",4,0,0,0,0,0,1,1,0,0,"active" "000000516231","NOSE_000000516231",2009-12-04 16:52:57.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000637537","NOSE_000000637537",2009-10-18 20:29:24.0,",","NOSE",2,1,"de","P",1,5469,5469,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000304151","NOSE_000000304151",2009-12-04 16:49:30.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000594850","NOSE_000000594850",2010-03-01 07:03:54.0,",","NOSE",2,1,"en","P",1,5222,5222,"Good",,,4,1,1,1,0,0,0,3,0,0,"active" "000000301249","NOSE_000000301249",2009-04-29 20:53:54.0,",","NOSE",,1,"en","P",1,,,,,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000116300","NOSE_000000116300",2009-07-15 15:51:50.0,",","NOSE",2,1,"de","P",1,5099,5099,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000780046","NOSE_000000780046",2009-04-29 20:55:07.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000911793","NOSE_000000911793",2009-04-29 20:55:31.0,",","NOSE",2,1,"fr","P",1,5323,5323,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000683947","NOSE_000000683947",2009-04-29 19:38:10.0,",","NOSE",2,1,"en","P",1,5222,5222,"Good",,"1",3,1,1,0,0,0,0,1,0,0,"active" "000000647990","NOSE_000000647990",2009-09-02 23:49:50.0,",","NOSE",2,1,"de","P",1,5465,5465,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000929235","NOSE_000000929235",2009-12-04 16:55:05.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000004017","NOSE_000000004017",2009-06-03 10:44:52.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000147629","NOSE_000000147629",2009-04-29 19:34:35.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000066509","NOSE_000000066509",2009-04-29 19:25:34.0,",","NOSE",2,1,"en","P",1,5233,5233,"Good",,"1",3,2,2,0,0,0,1,0,0,0,"active" "000000503700","NOSE_000000503700",2009-04-29 19:30:26.0,",","NOSE",2,1,"en","P",1,5423,5423,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000387014","NOSE_000000387014",2009-12-04 17:02:08.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000295121","NOSE_000000295121",2009-04-29 21:01:42.0,",","NOSE",2,1,"en","P",1,5086,5086,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000331379","NOSE_000000331379",2009-12-04 16:46:12.0,",","NOSE",2,1,"en","P",1,4718,5102,"Good",,,4,1,1,0,0,0,0,0,0,0,"active" "000000735365","NOSE_000000735365",2009-12-04 16:46:14.0,",","NOSE",2,1,"en","P",1,5067,5067,"Good",,,4,1,2,1,0,0,1,1,0,0,"active" "000000296154","NOSE_000000296154",2009-11-16 11:16:58.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000983254","NOSE_000000983254",2009-04-29 21:01:46.0,",","NOSE",2,1,"de","P",1,5732,5380,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000122365","NOSE_000000122365",2009-09-17 10:07:59.0,",","NOSE",2,1,"en","P",1,5372,5372,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000180679","NOSE_000000180679",2009-07-15 15:52:57.0,",","NOSE",2,1,"de","P",1,5272,5272,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000848117","NOSE_000000848117",2010-05-20 07:05:54.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000094581","NOSE_000000094581",2009-04-29 21:03:00.0,",","NOSE",2,1,"de","P",1,5792,5426,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000935461","NOSE_000000935461",2009-12-04 17:02:34.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000819313","NOSE_000000819313",2009-04-29 19:24:03.0,",","NOSE",2,1,"de","P",1,5235,5235,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000719755","NOSE_000000719755",2009-12-04 16:50:46.0,",","NOSE",,1,"de","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000230637","NOSE_000000230637",2009-04-29 19:27:46.0,",","NOSE",2,1,"en","P",1,5278,5278,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000306935","NOSE_000000306935",2010-05-16 07:05:20.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000344282","NOSE_000000344282",2009-09-18 14:47:37.0,",","NOSE",2,1,"de","P",1,5428,5428,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000534184","NOSE_000000534184",2009-04-29 19:26:37.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000859284","NOSE_000000859284",2009-04-29 21:07:54.0,",","NOSE",,1,"en","P",1,,,,,"9",3,1,1,0,0,0,0,1,0,0,"active" "000000247745","NOSE_000000247745",2009-04-29 21:08:56.0,",","NOSE",2,1,"en","P",1,5257,5257,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000089418","NOSE_000000089418",2009-04-29 19:34:46.0,",","NOSE",2,1,"en","P",1,5392,5392,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000658593","NOSE_000000658593",2009-04-29 21:11:20.0,",","NOSE",,1,"en","P",1,5330,5331,,,"9",4,1,3,2,0,0,3,1,2,2,"active" "000000337970","NOSE_000000337970",2010-02-08 09:14:06.0,",","NOSE",2,1,"de","P",1,5262,5262,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000940202","NOSE_000000940202",2010-03-16 07:15:42.0,",","NOSE",2,1,"de","P",1,5108,5108,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000215766","NOSE_000000215766",2009-04-29 19:24:34.0,",","NOSE",2,1,"de","P",1,5080,5080,"Next visit",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000728784","NOSE_000000728784",2009-04-29 19:34:01.0,",","NOSE",2,1,"fr","P",1,5138,5138,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000920365","NOSE_000000920365",2009-04-29 19:29:11.0,",","NOSE",2,1,"en","P",1,5317,5317,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000084939","NOSE_000000084939",2010-07-14 07:15:13.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,1,0,0,0,"active" "000000118145","NOSE_000000118145",2010-07-08 12:52:40.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000021641","NOSE_000000021641",2009-04-29 21:16:13.0,",","NOSE",2,1,"de","P",1,5520,5520,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000041936","NOSE_000000041936",2009-04-29 21:17:30.0,",","NOSE",2,1,"de","P",1,5383,5383,"Good",,"9",2,2,2,0,0,0,0,0,0,0,"active" "000000742556","NOSE_000000742556",2009-04-29 21:18:50.0,",","NOSE",2,1,"en","P",1,5141,5141,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000282199","NOSE_000000282199",2009-08-19 23:11:36.0,",","NOSE",2,1,"en","P",1,5370,5370,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000963726","NOSE_000000963726",2009-10-22 16:22:28.0,",","NOSE",2,1,"en","P",1,5267,5267,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000602014","NOSE_000000602014",2009-04-29 21:20:11.0,",","NOSE",2,1,"en","P",1,5229,5229,"Good",,"1",4,2,4,0,0,0,3,0,0,4,"active" "000000165018","NOSE_000000165018",2009-04-29 21:21:27.0,",","NOSE",2,1,"de","P",1,5178,5178,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000626736","NOSE_000000626736",2010-07-08 12:24:16.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000578820","NOSE_000000578820",2009-04-29 19:29:16.0,",","NOSE",2,1,"de","P",1,5519,5519,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000409499","NOSE_000000409499",2010-01-25 07:03:58.0,",","NOSE",2,1,"en","P",1,5216,5216,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000194410","NOSE_000000194410",2009-09-20 20:14:54.0,",","NOSE",2,1,"en","P",1,5111,5495,"Good",,,3,1,1,0,0,0,1,1,0,0,"active" "000000628886","NOSE_000000628886",2009-04-29 21:23:26.0,",","NOSE",2,1,"en","P",1,5232,5232,"Good",,"1",2,2,1,0,0,0,0,0,0,0,"active" "000000302447","NOSE_000000302447",2009-04-29 21:23:48.0,",","NOSE",2,1,"en","P",1,5142,5142,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000970880","NOSE_000000970880",2009-12-20 20:03:19.0,",","NOSE",2,1,"fr","P",1,5177,5177,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000196685","NOSE_000000196685",2009-07-06 14:06:22.0,",","NOSE",2,1,"en","P",1,5412,5412,"Good",,,4,1,3,0,0,0,0,1,0,0,"active" "000000728887","NOSE_000000728887",2009-04-29 21:25:06.0,",","NOSE",2,1,"en","P",1,5269,5269,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000542662","NOSE_000000542662",2009-07-31 19:09:16.0,",","NOSE",2,1,"de","P",1,5466,5466,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000600809","NOSE_000000600809",2009-07-31 19:09:32.0,",","NOSE",2,1,"en","P",1,5311,5311,"Good",,,4,1,2,0,0,0,1,0,0,0,"active" "000000063996","NOSE_000000063996",2009-04-29 21:26:17.0,",","NOSE",2,1,"de","P",1,5572,5572,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000002539","NOSE_000000002539",2009-04-29 21:27:30.0,",","NOSE",2,1,"de","P",1,5073,5073,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000326363","NOSE_000000326363",2010-07-08 12:39:59.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000285723","NOSE_000000285723",2009-04-29 19:35:13.0,",","NOSE",2,1,"en","P",1,5178,5178,"Good",,"1",4,1,1,0,0,0,0,0,0,4,"active" "000000792849","NOSE_000000792849",2009-11-04 15:44:44.0,",","NOSE",2,1,"en","P",1,5447,5447,"Good",,,3,1,1,0,0,0,0,1,0,2,"active" "000000454794","NOSE_000000454794",2010-03-21 07:04:00.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000420900","NOSE_000000420900",2009-10-17 00:37:42.0,",","NOSE",2,1,"de","P",1,5274,5274,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000583975","NOSE_000000583975",2009-04-29 21:29:05.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000016908","NOSE_000000016908",2009-09-23 20:14:51.0,",","NOSE",2,1,"de","P",1,5387,5387,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000637993","NOSE_000000637993",2009-04-29 21:29:09.0,",","NOSE",2,1,"de","P",1,5826,5474,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000764935","NOSE_000000764935",2010-06-21 12:22:59.0,",","NOSE",2,1,"en","P",1,5132,5132,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000724881","NOSE_000000724881",2009-05-18 14:16:56.0,",","NOSE",2,1,"en","P",1,4703,5087,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000057534","NOSE_000000057534",2009-04-29 21:30:29.0,",","NOSE",2,1,"de","P",1,5387,5387,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000809420","NOSE_000000809420",2010-04-09 07:04:41.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000159176","NOSE_000000159176",2009-11-04 15:45:05.0,",","NOSE",2,1,"fr","P",1,5143,5143,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000118994","NOSE_000000118994",2010-01-19 07:03:43.0,",","NOSE",2,1,"en","P",1,5152,5152,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000058490","NOSE_000000058490",2009-07-31 19:09:53.0,",","NOSE",2,1,"en","P",1,4854,5238,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000828658","NOSE_000000828658",2009-08-19 23:35:23.0,",","NOSE",2,2,"en","P",1,5145,5145,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000794132","NOSE_000000794132",2009-09-27 00:04:21.0,",","NOSE",2,1,"fr","P",1,5645,5645,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000080185","NOSE_000000080185",2009-04-29 21:31:49.0,",","NOSE",2,1,"de","P",1,5110,5110,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000997120","NOSE_000000997120",2009-08-19 23:52:02.0,",","NOSE",2,1,"en","P",1,5156,5156,"Good",,,2,0,0,0,1,0,0,0,0,0,"active" "000000216955","NOSE_000000216955",2009-04-29 19:31:16.0,",","NOSE",2,1,"en","P",1,5187,5187,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000982261","NOSE_000000982261",2009-04-29 19:24:47.0,",","NOSE",3,1,"en","P",1,5269,5269,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000110479","NOSE_000000110479",2009-08-20 00:07:10.0,",","NOSE",2,1,"en","P",1,5364,5364,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000220604","NOSE_000000220604",2009-04-29 19:42:03.0,",","NOSE",2,1,"en","P",1,5127,5127,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000468005","NOSE_000000468005",2009-12-04 10:23:49.0,",","NOSE",2,1,"en","P",1,5532,5532,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000627628","NOSE_000000627628",2009-11-05 10:00:46.0,",","NOSE",2,1,"fr","P",1,5111,5111,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000414062","NOSE_000000414062",2010-07-22 07:13:56.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000864704","NOSE_000000864704",2009-12-04 16:53:44.0,",","NOSE",,1,"de","P",1,,,,,,1,2,1,0,0,0,0,0,0,0,"active" "000000678195","NOSE_000000678195",2010-04-11 07:31:45.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000114515","NOSE_000000114515",2009-12-04 17:02:06.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000237432","NOSE_000000237432",2009-04-29 21:36:48.0,",","NOSE",2,1,"de","P",1,4987,4987,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000296273","NOSE_000000296273",2009-12-04 16:53:41.0,",","NOSE",,1,"de","P",1,,,,,,4,0,1,0,0,0,1,0,0,0,"active" "000000015991","NOSE_000000015991",2009-08-20 00:22:34.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000107821","NOSE_000000107821",2009-04-29 21:38:06.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000294282","NOSE_000000294282",2009-04-29 19:23:30.0,",","NOSE",2,1,"de","P",1,5176,5176,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000252044","NOSE_000000252044",2009-12-04 16:52:07.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000843877","NOSE_000000843877",2009-10-22 16:25:33.0,",","NOSE",2,1,"en","P",1,-20,-20,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000815764","NOSE_000000815764",2010-04-01 07:03:56.0,",","NOSE",2,1,"en","P",1,5126,5126,"Good",,,4,1,2,2,0,0,1,1,0,0,"active" "000000412581","NOSE_000000412581",2009-04-29 19:25:04.0,",","NOSE",2,1,"de","P",1,4774,4774,"Good",,"1",3,0,1,0,0,0,1,0,0,0,"active" "000000307769","NOSE_000000307769",2010-04-04 07:03:58.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000199436","NOSE_000000199436",2009-04-29 19:29:08.0,",","NOSE",2,1,"de","P",1,5302,5302,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000633012","NOSE_000000633012",2009-10-09 20:54:37.0,",","NOSE",1,1,"en","P",1,5496,5496,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000704063","NOSE_000000704063",2010-07-24 07:06:57.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000325790","NOSE_000000325790",2009-04-29 21:43:02.0,",","NOSE",2,1,"de","P",1,5317,5317,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000213834","NOSE_000000213834",2009-07-08 10:01:09.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000834745","NOSE_000000834745",2010-07-08 12:47:17.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,2,"active" "000000809519","NOSE_000000809519",2009-09-15 20:04:39.0,",","NOSE",2,1,"de","P",1,5314,5314,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000097780","NOSE_000000097780",2009-04-29 21:44:15.0,",","NOSE",1,1,"en","P",1,5469,5469,"Good",,"9",3,1,1,0,1,0,0,0,0,0,"active" "000000148214","NOSE_000000148214",2009-04-29 19:37:59.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",4,0,2,0,0,0,1,1,0,4,"active" "000000604818","NOSE_000000604818",2009-04-29 19:40:02.0,",","NOSE",2,1,"en","P",1,5423,5423,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000088630","NOSE_000000088630",2009-06-13 00:18:14.0,",","NOSE",2,1,"de","P",1,5135,5135,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000552826","NOSE_000000552826",2009-04-29 21:47:59.0,",","NOSE",2,1,"en","P",1,5286,5286,"Good",,"1",4,0,0,0,0,0,1,0,0,0,"active" "000000903615","NOSE_000000903615",2009-04-29 19:33:15.0,",","NOSE",2,1,"fr","P",1,5722,5722,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000970411","NOSE_000000970411",2009-04-29 19:25:59.0,",","NOSE",2,1,"en","P",1,5310,5310,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000701794","NOSE_000000701794",2009-07-31 19:10:13.0,",","NOSE",2,1,"en","P",1,5201,5201,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000626253","NOSE_000000626253",2009-06-13 00:45:49.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000720401","NOSE_000000720401",2009-08-20 00:34:57.0,",","NOSE",2,1,"de","P",1,5323,5323,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000053401","NOSE_000000053401",2010-07-18 07:05:34.0,",","NOSE",,1,"en","P",1,,,,,,1,4,1,0,0,0,0,0,0,0,"active" "000000978923","NOSE_000000978923",2009-04-29 19:28:22.0,",","NOSE",2,1,"en","P",1,5324,5324,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000734029","NOSE_000000734029",2009-12-04 16:24:37.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000078302","NOSE_000000078302",2009-04-29 21:53:01.0,",","NOSE",2,1,"en","P",1,5452,5452,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000411129","NOSE_000000411129",2010-02-23 07:03:41.0,",","NOSE",2,1,"de","P",1,5244,5246,"Good",,,2,0,0,0,0,0,0,0,2,0,"active" "000000600438","NOSE_000000600438",2010-07-08 12:24:29.0,",","NOSE",,2,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000019393","NOSE_000000019393",2010-04-16 07:05:45.0,",","NOSE",2,1,"fr","P",1,5465,5465,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000850748","NOSE_000000850748",2009-07-31 19:28:48.0,",","NOSE",2,1,"de","P",1,5409,5409,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000407098","NOSE_000000407098",2009-05-18 14:16:58.0,",","NOSE",2,1,"de","P",1,5454,5454,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000470040","NOSE_000000470040",2009-04-29 19:24:06.0,",","NOSE",2,1,"en","P",1,5352,5352,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000000159","NOSE_000000000159",2009-04-29 21:55:31.0,",","NOSE",2,1,"de","P",1,5255,5255,"Good",,"1",2,3,2,0,0,0,0,0,0,0,"active" "000000941671","NOSE_000000941671",2009-05-18 14:16:59.0,",","NOSE",,1,"en","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000736098","NOSE_000000736098",2009-12-04 17:07:55.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000025486","NOSE_000000025486",2009-04-29 19:26:59.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,"1",4,2,1,0,0,0,0,0,0,0,"active" "000000195153","NOSE_000000195153",2010-02-17 07:04:06.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000322216","NOSE_000000322216",2009-04-29 19:34:53.0,",","NOSE",2,1,"de","P",1,5126,5126,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000354697","NOSE_000000354697",2009-11-27 10:18:13.0,",","NOSE",2,1,"en","P",1,5421,5421,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000354742","NOSE_000000354742",2010-06-21 12:09:28.0,",","NOSE",,1,"en","P",1,5143,5143,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000972606","NOSE_000000972606",2009-09-17 10:08:13.0,",","NOSE",2,1,"de","P",1,5355,5355,"Doubtful","

The mother had ...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000777805","NOSE_000000777805",2009-04-29 19:31:13.0,",","NOSE",2,1,"de","P",1,5218,5218,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000542640","NOSE_000000542640",2010-03-30 07:04:25.0,",","NOSE",2,1,"en","P",1,5195,5195,"Good",,,3,0,3,0,0,0,0,1,0,0,"active" "000000544089","NOSE_000000544089",2009-10-22 16:36:26.0,",","NOSE",2,1,"de","P",1,5207,5207,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000358791","NOSE_000000358791",2010-04-12 07:08:50.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000097187","NOSE_000000097187",2010-04-30 07:04:59.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000307567","NOSE_000000307567",2009-04-29 22:00:34.0,",","NOSE",,1,"en","P",1,,,,,"9",4,1,3,0,0,0,0,0,0,0,"active" "000000387005","NOSE_000000387005",2009-04-29 19:24:31.0,",","NOSE",2,1,"en","P",1,5442,5442,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000719786","NOSE_000000719786",2009-04-29 19:32:08.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000418754","NOSE_000000418754",2009-10-19 20:31:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000183044","NOSE_000000183044",2009-09-09 22:19:13.0,",","NOSE",2,1,"de","P",1,-21,-21,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000123947","NOSE_000000123947",2009-12-04 17:01:04.0,",","NOSE",2,1,"en","P",1,5219,5219,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000719499","NOSE_000000719499",2009-06-13 01:36:49.0,",","NOSE",2,1,"en","P",1,5074,5074,"Good",,,4,1,1,0,0,0,0,0,0,4,"active" "000000360233","NOSE_000000360233",2009-04-29 22:04:25.0,",","NOSE",2,1,"en","P",1,5067,5067,"Good",,"1",3,1,2,1,1,0,1,1,0,0,"active" "000000625140","NOSE_000000625140",2010-02-15 07:03:36.0,",","NOSE",2,1,"de","P",1,5344,5344,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000059128","NOSE_000000059128",2009-08-20 01:13:52.0,",","NOSE",2,1,"de","P",1,5463,5463,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000450042","NOSE_000000450042",2009-12-14 12:53:09.0,",","NOSE",2,1,"de","P",1,5488,5488,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000153918","NOSE_000000153918",2010-02-16 07:06:33.0,",","NOSE",2,1,"de","P",1,5118,5118,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000362940","NOSE_000000362940",2009-12-04 16:46:25.0,",","NOSE",2,2,"en","P",1,5444,5444,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000599788","NOSE_000000599788",2009-07-31 19:10:36.0,",","NOSE",2,1,"fr","P",1,5054,5054,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000900804","NOSE_000000900804",2010-04-29 11:56:52.0,",","NOSE",,1,"en","P",1,,,,,,1,4,1,1,1,1,1,1,2,4,"active" "000000450286","NOSE_000000450286",2009-06-13 02:19:33.0,",","NOSE",2,1,"de","P",1,5564,5564,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000910786","NOSE_000000910786",2009-04-29 19:25:53.0,",","NOSE",2,1,"de","P",1,5240,5240,"Good",,"1",4,0,0,0,0,0,0,0,2,0,"active" "000000492008","NOSE_000000492008",2009-04-29 19:29:06.0,",","NOSE",2,1,"en","P",1,5387,5387,"Good",,"1",2,1,1,0,0,0,1,1,0,0,"active" "000000894732","NOSE_000000894732",2009-04-29 19:19:21.0,",","NOSE",2,1,"de","P",1,5264,5264,"Good",,"1",4,0,0,0,0,0,2,0,0,4,"active" "000000686546","NOSE_000000686546",2009-04-29 22:08:23.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000296614","NOSE_000000296614",2009-04-29 22:09:13.0,",","NOSE",2,1,"de","P",1,5451,5451,"Good",,"1",2,0,2,0,0,0,0,0,0,0,"active" "000000757042","NOSE_000000757042",2009-06-13 02:46:20.0,",","NOSE",2,1,"de","P",1,5343,5343,"Good",,,1,1,1,0,0,0,0,0,2,2,"active" "000000343168","NOSE_000000343168",2009-11-04 15:45:46.0,",","NOSE",2,1,"fr","P",1,5370,5370,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000497349","NOSE_000000497349",2009-11-18 12:28:18.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000056574","NOSE_000000056574",2009-04-29 19:28:35.0,",","NOSE",2,1,"en","P",1,5286,5286,"Good",,"1",2,1,2,1,0,0,2,1,0,4,"active" "000000424162","NOSE_000000424162",2009-11-27 10:18:28.0,",","NOSE",2,1,"en","P",1,5139,5139,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000366464","NOSE_000000366464",2009-04-29 22:11:50.0,",","NOSE",2,1,"en","P",1,5285,5285,"Good",,"1",4,1,3,1,1,0,1,1,0,0,"active" "000000312469","NOSE_000000312469",2009-07-31 19:10:53.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000036348","NOSE_000000036348",2009-12-04 16:53:55.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,1,0,0,0,"active" "000000178651","NOSE_000000178651",2009-05-18 14:17:03.0,",","NOSE",2,1,"en","P",1,5090,5090,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000172016","NOSE_000000172016",2009-07-15 16:03:44.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000692528","NOSE_000000692528",2009-12-04 17:01:42.0,",","NOSE",,1,"en","P",1,,,,,,4,0,1,0,0,0,0,0,0,0,"active" "000000169428","NOSE_000000169428",2009-09-18 14:48:07.0,",","NOSE",2,1,"de","P",1,5253,5253,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000981307","NOSE_000000981307",2009-10-25 20:31:14.0,",","NOSE",2,1,"de","P",1,5174,5174,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000925630","NOSE_000000925630",2009-11-16 11:16:55.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000720717","NOSE_000000720717",2009-12-04 17:04:10.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000481217","NOSE_000000481217",2009-04-29 22:13:07.0,",","NOSE",2,1,"de","P",1,5060,5060,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000390401","NOSE_000000390401",2010-07-01 07:05:19.0,",","NOSE",2,1,"fr","P",1,5343,5343,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000943982","NOSE_000000943982",2009-09-02 23:18:47.0,",","NOSE",2,1,"en","P",1,5561,5473,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000459072","NOSE_000000459072",2009-04-29 22:14:25.0,",","NOSE",2,1,"de","P",1,5536,5536,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000287303","NOSE_000000287303",2009-07-31 19:11:11.0,",","NOSE",2,1,"de","P",1,5330,5330,"Doubtful","

Each item had t...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000241315","NOSE_000000241315",2009-07-31 19:11:29.0,",","NOSE",2,1,"de","P",1,5233,5233,"Good",,,4,0,1,0,0,0,0,0,0,2,"active" "000000851928","NOSE_000000851928",2010-07-13 07:06:52.0,",","NOSE",2,1,"fr","P",1,5065,5065,"Good",,,4,0,0,4,0,0,2,0,0,4,"active" "000000478152","NOSE_000000478152",2010-06-21 12:15:17.0,",","NOSE",2,1,"en","P",1,5233,5233,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000703905","NOSE_000000703905",2009-06-13 03:16:22.0,",","NOSE",2,1,"de","P",1,5120,5120,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000007505","NOSE_000000007505",2009-06-13 03:17:00.0,",","NOSE",2,1,"de","P",1,5260,5260,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000988562","NOSE_000000988562",2009-04-29 22:15:45.0,",","NOSE",2,1,"de","P",1,5062,5062,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000774996","NOSE_000000774996",2009-04-29 22:16:10.0,",","NOSE",2,1,"de","P",1,5518,5518,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000262483","NOSE_000000262483",2009-10-16 00:51:03.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000196161","NOSE_000000196161",2009-06-13 03:45:11.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000706541","NOSE_000000706541",2009-04-29 19:38:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000685614","NOSE_000000685614",2009-12-10 20:07:19.0,",","NOSE",2,1,"fr","P",1,5336,5336,"Good",,,4,0,1,0,1,0,0,0,0,0,"active" "000000671478","NOSE_000000671478",2009-10-16 00:55:32.0,",","NOSE",,1,"en","P",1,,,,,,2,2,3,2,0,0,2,1,0,0,"active" "000000935910","NOSE_000000935910",2010-01-21 07:06:34.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000764129","NOSE_000000764129",2009-12-04 16:46:19.0,",","NOSE",2,1,"en","P",1,5376,5376,"Doubtful","

'During institu...

",,2,0,0,0,0,0,0,0,0,0,"active" "000000050398","NOSE_000000050398",2009-04-29 19:38:50.0,",","NOSE",2,1,"de","P",1,4909,4909,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000522437","NOSE_000000522437",2009-08-20 01:28:57.0,",","NOSE",2,1,"de","P",1,5037,5037,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000162336","NOSE_000000162336",2009-06-29 20:02:44.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000346066","NOSE_000000346066",2009-04-29 19:31:02.0,",","NOSE",2,1,"en","P",1,5296,5296,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000822015","NOSE_000000822015",2009-06-13 04:09:47.0,",","NOSE",2,1,"fr","P",1,5381,5381,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000419481","NOSE_000000419481",2010-02-03 07:04:51.0,",","NOSE",2,1,"de","P",1,5268,5268,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000114089","NOSE_000000114089",2009-04-29 22:21:00.0,",","NOSE",2,1,"de","P",1,5100,5100,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000244233","NOSE_000000244233",2009-05-18 14:17:00.0,",","NOSE",2,1,"en","P",1,4864,5248,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000164905","NOSE_000000164905",2009-04-29 19:35:02.0,",","NOSE",2,1,"en","P",1,5130,5130,"Good",,"1",1,1,2,0,0,0,0,0,0,0,"active" "000000780950","NOSE_000000780950",2009-04-29 19:28:41.0,",","NOSE",2,1,"en","P",1,5344,5344,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000049277","NOSE_000000049277",2009-12-04 17:12:23.0,",","NOSE",2,1,"en","P",1,5341,5341,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000696005","NOSE_000000696005",2009-07-07 10:28:30.0,",","NOSE",2,1,"de","P",1,5420,5420,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000482569","NOSE_000000482569",2010-02-08 09:14:19.0,",","NOSE",2,1,"fr","P",1,5166,5166,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000126297","NOSE_000000126297",2009-04-29 19:32:20.0,",","NOSE",2,1,"en","P",1,5288,5288,"Good",,"1",3,1,1,0,0,0,0,1,0,2,"active" "000000356420","NOSE_000000356420",2009-12-04 16:54:05.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000746717","NOSE_000000746717",2009-04-29 22:25:12.0,",","NOSE",2,1,"de","P",1,5283,5283,"Good",,"1",3,0,0,0,0,0,2,0,0,0,"active" "000000603350","NOSE_000000603350",2010-07-08 12:23:11.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000947214","NOSE_000000947214",2009-10-25 20:46:10.0,",","NOSE",2,1,"en","P",1,5393,5393,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000322099","NOSE_000000322099",2009-04-29 22:26:31.0,",","NOSE",2,1,"de","P",1,5558,5558,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000753912","NOSE_000000753912",2009-10-24 20:16:58.0,",","NOSE",2,1,"de","P",1,5374,5374,"Good",,,4,0,0,0,0,0,4,0,0,4,"active" "000000000937","NOSE_000000000937",2010-02-03 07:05:49.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000049940","NOSE_000000049940",2009-12-04 16:46:43.0,",","NOSE",2,1,"en","P",1,5045,5045,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000339273","NOSE_000000339273",2009-04-29 22:27:51.0,",","NOSE",,1,"en","P",1,,,,,"9",2,1,1,0,0,0,1,1,0,0,"active" "000000505663","NOSE_000000505663",2009-04-29 22:29:08.0,",","NOSE",2,1,"de","P",1,5250,5250,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000333472","NOSE_000000333472",2009-04-29 19:25:42.0,",","NOSE",2,1,"de","P",1,5411,5411,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000922072","NOSE_000000922072",2009-06-13 05:10:12.0,",","NOSE",2,1,"en","P",1,4697,5081,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000177517","NOSE_000000177517",2009-04-29 22:31:51.0,",","NOSE",2,1,"en","P",1,5473,5473,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000523702","NOSE_000000523702",2009-04-29 19:27:24.0,",","NOSE",2,1,"de","P",1,5252,5252,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000796379","NOSE_000000796379",2009-04-29 19:26:15.0,",","NOSE",2,1,"fr","P",1,5267,5267,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000219929","NOSE_000000219929",2009-12-04 16:46:48.0,",","NOSE",2,1,"en","P",1,5358,5358,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000737550","NOSE_000000737550",2010-06-21 13:06:55.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000801601","NOSE_000000801601",2009-07-31 19:12:09.0,",","NOSE",2,1,"de","P",1,5197,5197,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000337248","NOSE_000000337248",2009-04-29 22:35:42.0,",","NOSE",2,1,"de","P",1,5274,5274,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000663855","NOSE_000000663855",2009-04-29 19:27:57.0,",","NOSE",2,1,"en","P",1,5389,5389,"Good",,"1",4,0,1,0,1,0,1,1,0,0,"active" "000000682972","NOSE_000000682972",2009-04-29 19:27:13.0,",","NOSE",2,1,"en","P",1,5376,5376,"Good",,"1",1,2,1,0,0,0,0,1,0,0,"active" "000000299755","NOSE_000000299755",2010-03-31 07:05:23.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000963365","NOSE_000000963365",2010-04-02 07:05:13.0,",","NOSE",,1,"de","P",1,,,,,,3,2,3,1,1,0,3,1,0,4,"active" "000000817387","NOSE_000000817387",2009-10-07 22:36:08.0,",","NOSE",,1,"en","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000017410","NOSE_000000017410",2009-07-31 19:12:27.0,",","NOSE",2,1,"de","P",1,5342,5342,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000985750","NOSE_000000985750",2009-05-18 14:17:02.0,",","NOSE",2,1,"fr","P",1,5489,5489,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000433488","NOSE_000000433488",2009-06-29 20:32:24.0,",","NOSE",2,1,"en","P",1,5417,5417,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000841822","NOSE_000000841822",2009-11-25 11:34:36.0,",","NOSE",2,1,"de","P",1,5217,5217,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000035411","NOSE_000000035411",2010-07-19 07:05:56.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000407318","NOSE_000000407318",2009-06-13 05:48:20.0,",","NOSE",2,1,"de","P",1,4878,4878,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000788500","NOSE_000000788500",2009-04-29 19:36:37.0,",","NOSE",2,1,"en","P",1,5310,5310,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000520700","NOSE_000000520700",2009-04-29 22:40:57.0,",","NOSE",2,1,"en","P",1,4981,4981,"Good",,"1",4,3,3,0,0,0,1,1,4,0,"active" "000000093633","NOSE_000000093633",2010-04-16 07:04:37.0,",","NOSE",,1,"en","P",1,,,,,,2,2,1,0,0,0,0,0,0,0,"active" "000000007296","NOSE_000000007296",2009-12-02 09:54:53.0,",","NOSE",2,1,"de","P",1,5220,5220,"Good",,,3,1,2,0,0,0,1,0,0,0,"active" "000000311692","NOSE_000000311692",2009-04-29 22:42:17.0,",","NOSE",2,1,"en","P",1,5145,5145,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000249270","NOSE_000000249270",2010-04-14 07:06:43.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000000887","NOSE_000000000887",2009-04-29 22:43:39.0,",","NOSE",2,1,"fr","P",1,5165,5165,"Good",,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000019770","NOSE_000000019770",2009-04-29 19:32:55.0,",","NOSE",2,1,"en","P",1,5259,5259,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000519016","NOSE_000000519016",2009-07-03 10:32:05.0,",","NOSE",,1,"en","P",1,,,,,,1,3,1,0,0,0,0,0,0,0,"active" "000000063217","NOSE_000000063217",2009-04-29 19:38:41.0,",","NOSE",3,1,"en","P",1,5334,5334,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000157718","NOSE_000000157718",2009-12-03 20:07:19.0,",","NOSE",2,1,"en","P",1,5133,5133,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000289050","NOSE_000000289050",2009-10-10 20:58:26.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000304162","NOSE_000000304162",2010-04-21 07:08:04.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000148930","NOSE_000000148930",2010-05-18 07:05:45.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,4,2,3,0,0,0,1,1,0,2,"active" "000000722318","NOSE_000000722318",2009-04-29 22:47:40.0,",","NOSE",2,1,"de","P",1,4994,4994,"Good",,"1",3,1,0,1,3,2,3,0,0,2,"active" "000000174022","NOSE_000000174022",2009-09-26 02:56:26.0,",","NOSE",2,1,"de","P",1,5529,5529,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000659900","NOSE_000000659900",2009-04-29 19:27:08.0,",","NOSE",2,1,"de","P",1,5127,5127,"Good",,"1",3,0,2,0,0,0,3,0,0,0,"active" "000000118218","NOSE_000000118218",2009-05-18 10:56:04.0,",","NOSE",2,1,"de","P",1,5022,5022,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000617021","NOSE_000000617021",2009-06-29 21:01:53.0,",","NOSE",2,1,"de","P",1,5428,5428,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000497899","NOSE_000000497899",2009-04-29 22:50:15.0,",","NOSE",2,1,"en","P",1,5186,5186,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000762284","NOSE_000000762284",2009-12-04 17:03:09.0,",","NOSE",2,1,"en","P",1,5207,5207,"Good",,,4,3,4,1,1,0,3,1,0,4,"active" "000000426118","NOSE_000000426118",2009-07-31 19:12:47.0,",","NOSE",2,1,"en","P",1,4863,5247,"Good",,,4,0,0,0,0,0,3,0,0,0,"active" "000000404320","NOSE_000000404320",2010-07-08 12:49:03.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000541127","NOSE_000000541127",2009-12-04 16:40:58.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000994145","NOSE_000000994145",2010-03-09 07:11:08.0,",","NOSE",2,1,"de","P",1,5121,5121,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000392683","NOSE_000000392683",2009-07-31 19:13:02.0,",","NOSE",2,1,"de","P",1,5192,5192,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000758922","NOSE_000000758922",2009-12-04 16:52:23.0,",","NOSE",,1,"de","P",1,,,,,,3,1,0,0,0,0,0,0,0,2,"active" "000000374112","NOSE_000000374112",2009-04-29 19:30:23.0,",","NOSE",2,1,"en","P",1,5274,5274,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000379159","NOSE_000000379159",2009-06-13 06:44:03.0,",","NOSE",2,1,"fr","P",1,4912,4912,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000108200","NOSE_000000108200",2009-08-20 01:34:50.0,",","NOSE",2,1,"de","P",1,5472,5472,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000604692","NOSE_000000604692",2009-06-13 07:12:42.0,",","NOSE",2,1,"en","P",1,5591,5591,"Good",,"9",4,1,3,0,0,0,1,0,0,0,"active" "000000340039","NOSE_000000340039",2009-04-29 19:40:20.0,",","NOSE",2,1,"en","P",1,5416,5416,"Good",,"1",4,0,1,0,0,0,0,0,0,4,"active" "000000704818","NOSE_000000704818",2010-04-13 07:04:51.0,",","NOSE",2,1,"fr","P",1,5330,5330,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000495696","NOSE_000000495696",2009-04-29 19:35:25.0,",","NOSE",2,1,"fr","P",1,5343,5343,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000914163","NOSE_000000914163",2009-04-29 22:54:56.0,",","NOSE",2,1,"fr","P",1,5171,5171,"Good",,"9",4,0,1,0,0,0,0,0,0,0,"active" "000000668330","NOSE_000000668330",2010-02-24 07:05:41.0,",","NOSE",2,1,"de","P",1,5110,5110,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000600080","NOSE_000000600080",2009-07-08 10:23:15.0,",","NOSE",2,1,"de","P",1,5392,5392,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000916108","NOSE_000000916108",2009-12-04 16:44:50.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000879169","NOSE_000000879169",2009-06-29 21:32:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000733917","NOSE_000000733917",2009-04-29 19:41:49.0,",","NOSE",2,1,"en","P",1,5322,5322,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000425510","NOSE_000000425510",2009-04-29 22:57:40.0,",","NOSE",,1,"en","P",1,5166,5166,,,"9",1,3,2,0,0,0,0,0,0,0,"active" "000000750587","NOSE_000000750587",2010-03-20 07:06:48.0,",","NOSE",2,1,"de","P",1,5116,5116,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000921274","NOSE_000000921274",2009-04-29 22:59:02.0,",","NOSE",2,1,"de","P",1,5398,5398,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000098092","NOSE_000000098092",2009-07-15 16:10:56.0,",","NOSE",2,1,"en","P",1,5299,5299,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000946183","NOSE_000000946183",2009-04-29 19:26:57.0,",","NOSE",1,1,"en","P",1,5134,5134,"Good",,"9",3,2,0,0,0,0,0,0,0,0,"active" "000000321815","NOSE_000000321815",2009-04-29 23:01:11.0,",","NOSE",,1,"de","P",1,,,,,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000699179","NOSE_000000699179",2009-12-04 16:46:32.0,",","NOSE",,1,"en","P",1,,,,,,1,2,1,0,0,0,0,0,0,0,"active" "000000646987","NOSE_000000646987",2010-05-08 07:31:39.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000838382","NOSE_000000838382",2009-12-04 16:51:45.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000770335","NOSE_000000770335",2010-02-03 07:03:22.0,",","NOSE",2,1,"fr","P",1,5311,5311,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000177414","NOSE_000000177414",2009-04-29 19:28:14.0,",","NOSE",2,1,"en","P",1,5324,5324,"Good",,"1",3,2,3,0,0,0,1,0,0,0,"active" "000000221701","NOSE_000000221701",2009-04-29 19:37:24.0,",","NOSE",2,1,"fr","P",1,5350,5350,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000868865","NOSE_000000868865",2009-04-29 23:05:15.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000668558","NOSE_000000668558",2009-04-29 19:29:03.0,",","NOSE",2,1,"de","P",1,5100,5100,"Good","

daughter were t...

","1",0,-1,0,0,0,0,0,0,0,0,"active" "000000233772","NOSE_000000233772",2009-04-29 23:07:29.0,",","NOSE",2,1,"de","P",1,5385,5385,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000297559","NOSE_000000297559",2010-07-08 13:01:32.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000262618","NOSE_000000262618",2009-11-04 15:36:11.0,",","NOSE",2,1,"en","P",1,5193,5193,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000169367","NOSE_000000169367",2009-08-20 06:07:08.0,",","NOSE",2,1,"de","P",1,5321,5321,"Good",,,4,1,1,2,0,0,4,0,0,0,"active" "000000806923","NOSE_000000806923",2009-04-29 19:27:40.0,",","NOSE",2,1,"de","P",1,5494,5494,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000004121","NOSE_000000004121",2009-06-29 21:57:05.0,",","NOSE",2,1,"en","P",1,5172,5172,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000186171","NOSE_000000186171",2010-03-02 07:04:22.0,",","NOSE",2,1,"fr","P",1,5300,5300,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000188105","NOSE_000000188105",2010-01-14 11:51:02.0,",","NOSE",2,1,"en","P",1,5222,5222,"Good",,,3,1,3,1,0,0,1,1,0,0,"active" "000000989889","NOSE_000000989889",2009-04-29 19:42:49.0,",","NOSE",2,1,"en","P",1,5096,5096,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000496878","NOSE_000000496878",2009-06-29 22:25:35.0,",","NOSE",2,1,"de","P",1,5481,5481,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000667204","NOSE_000000667204",2009-12-04 17:12:42.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000060890","NOSE_000000060890",2009-04-29 23:11:35.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000019392","NOSE_000000019392",2009-04-29 19:35:31.0,",","NOSE",2,1,"en","P",1,5395,5395,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000898901","NOSE_000000898901",2010-06-21 12:11:29.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000818587","NOSE_000000818587",2009-04-29 23:14:24.0,",","NOSE",2,1,"de","P",1,5491,5491,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000270211","NOSE_000000270211",2009-12-04 16:46:35.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,0,1,0,1,0,2,0,"active" "000000589914","NOSE_000000589914",2010-06-30 07:05:12.0,",","NOSE",,1,"en","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000934851","NOSE_000000934851",2009-07-15 16:12:50.0,",","NOSE",2,1,"en","P",1,5278,5278,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000873242","NOSE_000000873242",2009-08-20 02:05:56.0,",","NOSE",2,1,"en","P",1,5405,5405,"Good",,,2,3,2,0,0,0,0,1,0,0,"active" "000000423852","NOSE_000000423852",2009-04-29 19:33:38.0,",","NOSE",2,2,"de","P",1,5457,5490,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000944752","NOSE_000000944752",2009-04-29 23:16:46.0,",","NOSE",2,1,"de","P",1,5430,5430,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000267921","NOSE_000000267921",2009-04-29 19:27:02.0,",","NOSE",2,1,"en","P",1,5321,5321,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000046625","NOSE_000000046625",2009-04-29 23:19:26.0,",","NOSE",2,1,"fr","P",1,5168,5168,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000906010","NOSE_000000906010",2010-05-14 07:05:03.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,1,0,0,0,0,0,"active" "000000852153","NOSE_000000852153",2009-04-29 19:39:27.0,",","NOSE",2,1,"fr","P",1,5106,5106,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000636651","NOSE_000000636651",2010-04-14 07:04:20.0,",","NOSE",2,1,"fr","P",1,5151,5151,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000496795","NOSE_000000496795",2009-04-29 23:22:12.0,",","NOSE",,1,"en","P",1,,,,,"9",1,0,0,0,0,0,0,0,0,0,"active" "000000398823","NOSE_000000398823",2009-07-07 10:28:53.0,",","NOSE",2,1,"en","P",1,4811,5195,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000831084","NOSE_000000831084",2009-04-29 19:27:43.0,",","NOSE",2,1,"en","P",1,5475,5475,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000450306","NOSE_000000450306",2009-10-13 15:50:15.0,",","NOSE",2,1,"de","P",1,5120,5120,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000982686","NOSE_000000982686",2009-11-17 20:07:47.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000157889","NOSE_000000157889",2010-06-21 12:14:40.0,",","NOSE",2,1,"en","P",1,5244,5244,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000308617","NOSE_000000308617",2009-09-02 23:46:22.0,",","NOSE",2,1,"fr","P",1,5258,5258,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000406252","NOSE_000000406252",2010-01-27 07:03:24.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000583428","NOSE_000000583428",2009-04-29 19:31:24.0,",","NOSE",2,1,"fr","P",1,5514,5514,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000488221","NOSE_000000488221",2009-11-16 11:16:20.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000444152","NOSE_000000444152",2009-04-29 19:42:47.0,",","NOSE",2,1,"fr","P",1,5350,5350,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000970117","NOSE_000000970117",2009-04-29 19:28:30.0,",","NOSE",2,1,"en","P",1,5132,5132,"Good",,"1",3,1,2,0,0,0,2,0,0,2,"active" "000000406577","NOSE_000000406577",2009-04-29 19:33:50.0,",","NOSE",2,1,"de","P",1,5150,5150,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000938690","NOSE_000000938690",2009-04-29 19:42:18.0,",","NOSE",2,1,"en","P",1,5211,5211,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000510980","NOSE_000000510980",2010-06-21 12:07:19.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000975859","NOSE_000000975859",2009-04-29 23:30:42.0,",","NOSE",2,1,"de","P",1,5236,5236,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000531522","NOSE_000000531522",2009-04-29 19:38:55.0,",","NOSE",2,1,"en","P",1,5121,5121,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000497958","NOSE_000000497958",2009-04-29 19:19:16.0,",","NOSE",2,1,"de","P",1,5457,5457,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000717221","NOSE_000000717221",2009-04-29 23:33:48.0,",","NOSE",2,2,"de","P",1,5476,5476,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000254965","NOSE_000000254965",2010-07-11 07:05:30.0,",","NOSE",,1,"en","P",1,,,,,,4,1,3,0,0,0,0,0,0,0,"active" "000000530540","NOSE_000000530540",2009-12-03 20:11:20.0,",","NOSE",2,1,"de","P",1,5230,5230,"Good",,,2,1,0,0,0,0,1,0,0,0,"active" "000000526151","NOSE_000000526151",2009-07-31 19:13:43.0,",","NOSE",2,1,"fr","P",1,5295,5295,"Good",,,2,0,1,0,0,0,2,0,0,0,"active" "000000558080","NOSE_000000558080",2009-12-04 16:52:17.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000529342","NOSE_000000529342",2009-12-04 16:55:44.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000258176","NOSE_000000258176",2009-04-29 23:35:11.0,",","NOSE",2,1,"en","P",1,5361,5361,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000233587","NOSE_000000233587",2009-07-16 14:49:19.0,",","NOSE",2,1,"en","P",1,5380,5380,"Good",,,2,0,0,0,0,0,1,0,0,0,"active" "000000429141","NOSE_000000429141",2009-06-13 07:14:11.0,",","NOSE",2,1,"de","P",1,5126,5126,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000048694","NOSE_000000048694",2010-04-11 07:32:15.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000440736","NOSE_000000440736",2009-08-20 02:20:59.0,",","NOSE",2,1,"de","P",1,5179,5179,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000650863","NOSE_000000650863",2009-12-04 16:40:42.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000472513","NOSE_000000472513",2010-05-07 07:04:58.0,",","NOSE",2,1,"en","P",1,5125,5125,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000140141","NOSE_000000140141",2009-04-29 19:36:14.0,",","NOSE",2,,,,,,,"Missing","

language proble...

",,,,,,,,,,,,"active" "000000992288","NOSE_000000992288",2010-01-23 07:08:29.0,",","NOSE",2,1,"en","P",1,5230,5230,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000613928","NOSE_000000613928",2009-04-29 23:37:27.0,",","NOSE",2,1,"de","P",1,5352,5352,"Good",,"9",3,0,1,0,0,0,0,0,0,0,"active" "000000886775","NOSE_000000886775",2009-04-29 19:29:22.0,",","NOSE",2,1,"de","P",1,5181,5181,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000250058","NOSE_000000250058",2009-12-04 16:52:36.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000887725","NOSE_000000887725",2009-04-29 19:41:06.0,",","NOSE",2,1,"de","P",1,5139,5139,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000439726","NOSE_000000439726",2009-04-29 19:33:53.0,",","NOSE",2,1,"en","P",1,5363,5363,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000580541","NOSE_000000580541",2010-05-09 07:04:41.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000638755","NOSE_000000638755",2009-04-29 23:42:48.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000907260","NOSE_000000907260",2009-04-29 19:30:35.0,",","NOSE",2,1,"de","P",1,5100,5100,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000688873","NOSE_000000688873",2009-04-29 19:40:24.0,",","NOSE",1,,,,,,,"Missing","

subject wanted ...

",,,,,,,,,,,,"active" "000000114725","NOSE_000000114725",2009-04-29 23:45:31.0,",","NOSE",2,1,"fr","P",1,5331,5331,"Good",,"1",4,2,1,0,0,0,0,0,0,0,"active" "000000301598","NOSE_000000301598",2009-08-20 02:36:03.0,",","NOSE",,1,"en","P",1,,,,,,3,1,1,0,0,0,0,0,2,0,"active" "000000591700","NOSE_000000591700",2009-10-22 20:11:38.0,",","NOSE",2,1,"de","P",1,5335,5335,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000305304","NOSE_000000305304",2009-07-31 19:14:18.0,",","NOSE",2,1,"de","P",1,5388,5388,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000979095","NOSE_000000979095",2009-12-04 16:50:12.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000940998","NOSE_000000940998",2009-06-29 22:59:48.0,",","NOSE",2,1,"en","P",1,5252,5252,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000469674","NOSE_000000469674",2009-06-30 10:18:20.0,",","NOSE",2,1,"de","P",1,5430,5430,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000266205","NOSE_000000266205",2010-06-16 07:05:18.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000210163","NOSE_000000210163",2009-04-29 23:46:53.0,",","NOSE",2,1,"de","P",1,5843,5477,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000901020","NOSE_000000901020",2010-01-25 07:03:12.0,",","NOSE",2,1,"en","P",1,5169,5169,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000793849","NOSE_000000793849",2009-04-29 23:48:16.0,",","NOSE",2,1,"de","P",1,5285,5285,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000549489","NOSE_000000549489",2010-04-12 07:04:51.0,",","NOSE",2,1,"en","P",1,5171,5171,"Good",,,2,2,1,0,1,0,3,1,0,0,"active" "000000323276","NOSE_000000323276",2010-05-13 07:04:49.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000728305","NOSE_000000728305",2009-06-29 23:27:51.0,",","NOSE",2,1,"de","P",1,5166,5166,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000138113","NOSE_000000138113",2009-04-29 23:48:53.0,",","NOSE",2,1,"de","P",1,5370,5370,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000621897","NOSE_000000621897",2009-04-29 19:35:19.0,",","NOSE",2,1,"de","P",1,5225,5225,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018441","NOSE_000000018441",2010-07-08 12:41:36.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000603471","NOSE_000000603471",2009-04-29 19:24:56.0,",","NOSE",2,1,"de","P",1,5205,5205,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000370479","NOSE_000000370479",2009-04-29 19:41:17.0,",","NOSE",2,1,"en","P",1,5255,5255,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000912451","NOSE_000000912451",2010-05-02 07:04:33.0,",","NOSE",2,1,"fr","P",1,5109,5109,"Good",,,3,0,2,0,0,0,1,0,0,0,"active" "000000991963","NOSE_000000991963",2010-04-29 11:41:15.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000616384","NOSE_000000616384",2009-08-20 02:51:58.0,",","NOSE",2,1,"en","P",1,5336,5336,"Good",,,4,1,1,0,0,0,0,0,0,2,"active" "000000151328","NOSE_000000151328",2009-04-29 23:54:13.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000093768","NOSE_000000093768",2009-04-29 23:54:41.0,",","NOSE",2,1,"de","P",1,4952,4952,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000561240","NOSE_000000561240",2010-06-16 07:05:00.0,",","NOSE",,1,"de","P",1,,,,,,3,2,3,1,0,0,1,1,0,4,"active" "000000892213","NOSE_000000892213",2010-06-09 07:05:38.0,",","NOSE",2,1,"fr","P",1,4996,4996,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000011436","NOSE_000000011436",2009-04-29 19:41:52.0,",","NOSE",2,1,"en","P",1,5287,5287,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000055985","NOSE_000000055985",2009-07-31 19:14:46.0,",","NOSE",2,1,"fr","P",1,5387,5387,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000942158","NOSE_000000942158",2009-04-29 19:32:49.0,",","NOSE",2,1,"de","P",1,4926,4926,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000190981","NOSE_000000190981",2009-04-29 19:27:54.0,",","NOSE",2,1,"en","P",1,5313,5313,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000550247","NOSE_000000550247",2010-01-25 07:03:47.0,",","NOSE",2,1,"en","P",1,5244,5244,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000175768","NOSE_000000175768",2009-04-29 23:59:59.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,2,"active" "000000556219","NOSE_000000556219",2009-04-29 19:23:02.0,",","NOSE",2,1,"en","P",1,5321,5321,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000323687","NOSE_000000323687",2010-04-04 07:04:09.0,",","NOSE",2,1,"fr","P",1,5270,5270,"Good",,,3,0,2,0,0,0,0,0,0,0,"active" "000000365933","NOSE_000000365933",2010-07-15 07:05:15.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000438443","NOSE_000000438443",2009-04-30 00:02:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000720576","NOSE_000000720576",2009-04-30 00:02:54.0,",","NOSE",2,1,"en","P",1,5075,5075,"Good",,"9",2,0,1,0,0,0,0,0,0,0,"active" "000000937446","NOSE_000000937446",2010-04-14 07:04:12.0,",","NOSE",2,1,"en","P",1,5202,5202,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000211674","NOSE_000000211674",2009-08-20 03:05:15.0,",","NOSE",,1,"en","P",1,5377,5377,,,,2,1,0,0,0,0,0,0,0,0,"active" "000000803905","NOSE_000000803905",2009-11-24 15:40:46.0,",","NOSE",2,1,"de","P",1,5277,5277,"Good",,,4,0,0,0,0,0,1,0,0,0,"active" "000000740529","NOSE_000000740529",2009-12-03 20:07:06.0,",","NOSE",2,1,"en","P",1,5131,5131,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000216056","NOSE_000000216056",2009-04-29 19:31:08.0,",","NOSE",2,1,"en","P",1,5367,5367,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000737666","NOSE_000000737666",2009-04-29 19:24:01.0,",","NOSE",2,1,"en","P",1,5216,5216,"Good",,"1",3,1,2,0,0,0,1,0,0,0,"active" "000000439238","NOSE_000000439238",2009-12-04 16:52:12.0,",","NOSE",,1,"de","P",1,,,,,,3,1,2,0,0,0,0,0,0,0,"active" "000000354175","NOSE_000000354175",2009-12-04 16:49:23.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000038161","NOSE_000000038161",2009-04-29 19:29:38.0,",","NOSE",2,1,"en","P",1,5437,5437,"Good",,"1",3,1,1,0,0,0,0,0,0,0,"active" "000000042302","NOSE_000000042302",2010-07-08 12:24:53.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000487579","NOSE_000000487579",2010-07-01 07:05:24.0,",","NOSE",2,1,"fr","P",1,5093,5093,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000900322","NOSE_000000900322",2009-06-29 23:37:59.0,",","NOSE",2,1,"en","P",1,5517,5517,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000167192","NOSE_000000167192",2009-04-29 19:36:40.0,",","NOSE",2,1,"en","P",1,5069,5069,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000604286","NOSE_000000604286",2009-04-30 00:09:35.0,",","NOSE",2,1,"en","P",1,5123,5123,"Good",,"1",3,0,3,0,0,0,0,1,0,0,"active" "000000754303","NOSE_000000754303",2010-03-22 07:04:54.0,",","NOSE",,1,"de","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000605765","NOSE_000000605765",2009-10-24 20:13:18.0,",","NOSE",2,1,"en","P",1,5144,5144,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000400333","NOSE_000000400333",2009-06-13 07:30:08.0,",","NOSE",2,1,"en","P",1,5339,5339,"Good",,,3,1,1,0,1,0,0,0,0,0,"active" "000000160554","NOSE_000000160554",2009-04-30 00:10:58.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000074412","NOSE_000000074412",2010-02-25 07:03:37.0,",","NOSE",2,1,"fr","P",1,5523,5523,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000508233","NOSE_000000508233",2009-10-02 20:15:35.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000398729","NOSE_000000398729",2009-09-02 23:46:26.0,",","NOSE",2,1,"en","P",1,5341,5341,"Good",,,4,1,2,0,0,0,0,0,0,0,"active" "000000176423","NOSE_000000176423",2009-12-04 16:46:57.0,",","NOSE",2,1,"en","P",1,5214,5214,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000297469","NOSE_000000297469",2009-04-30 00:11:05.0,",","NOSE",2,1,"de","P",1,5659,5659,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000324133","NOSE_000000324133",2009-04-30 00:12:18.0,",","NOSE",2,1,"de","P",1,5521,5521,"Good",,"1",4,0,1,0,0,0,3,0,0,2,"active" "000000152160","NOSE_000000152160",2009-07-16 14:55:45.0,",","NOSE",,1,"en","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000585409","NOSE_000000585409",2009-07-31 19:32:19.0,",","NOSE",2,1,"fr","P",1,5214,5214,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000483926","NOSE_000000483926",2009-12-04 16:50:09.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000569601","NOSE_000000569601",2009-04-29 19:29:49.0,",","NOSE",2,1,"en","P",1,5226,5226,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000823004","NOSE_000000823004",2009-12-04 16:48:33.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000203207","NOSE_000000203207",2010-03-04 07:04:05.0,",","NOSE",2,1,"en","P",1,5145,5145,"Good",,,3,2,2,0,0,0,0,0,0,0,"active" "000000937329","NOSE_000000937329",2009-11-04 15:32:58.0,",","NOSE",2,1,"fr","P",1,5370,5370,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000813292","NOSE_000000813292",2009-06-13 08:00:16.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000766368","NOSE_000000766368",2010-02-02 07:04:09.0,",","NOSE",2,1,"de","P",1,5262,5262,"Good",,,3,0,1,0,0,0,1,0,0,0,"active" "000000688594","NOSE_000000688594",2009-10-04 21:19:05.0,",","NOSE",2,1,"de","P",1,5335,5335,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000683262","NOSE_000000683262",2010-01-30 07:03:28.0,",","NOSE",2,1,"de","P",1,5165,5165,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000804925","NOSE_000000804925",2009-12-04 17:03:43.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000902805","NOSE_000000902805",2009-12-04 17:00:32.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000672183","NOSE_000000672183",2009-07-16 14:56:30.0,",","NOSE",2,1,"de","P",1,5290,5290,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000348339","NOSE_000000348339",2009-09-09 00:00:09.0,",","NOSE",2,1,"de","P",1,5478,5478,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000768368","NOSE_000000768368",2010-07-08 12:41:04.0,",","NOSE",,2,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000226396","NOSE_000000226396",2009-06-13 08:00:31.0,",","NOSE",2,1,"de","P",1,5535,5535,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000538285","NOSE_000000538285",2010-06-04 07:07:32.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,1,0,0,0,"active" "000000819585","NOSE_000000819585",2009-07-16 14:59:18.0,",","NOSE",2,1,"fr","P",1,5515,5515,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000958705","NOSE_000000958705",2009-09-09 22:32:02.0,",","NOSE",2,1,"de","P",1,5146,5146,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000787092","NOSE_000000787092",2009-07-15 16:19:36.0,",","NOSE",2,1,"en","P",1,4758,5142,"Good",,,2,2,1,0,0,0,0,0,0,0,"active" "000000224956","NOSE_000000224956",2009-06-30 00:00:07.0,",","NOSE",2,1,"de","P",1,5379,5379,"Good",,,4,0,2,0,0,0,0,0,0,0,"active" "000000391954","NOSE_000000391954",2009-04-29 19:23:33.0,",","NOSE",2,1,"de","P",1,5330,5330,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000232374","NOSE_000000232374",2009-06-13 08:27:42.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000810745","NOSE_000000810745",2009-10-01 21:08:07.0,",","NOSE",2,1,"en","P",1,5315,5315,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000020880","NOSE_000000020880",2009-04-29 19:28:00.0,",","NOSE",2,1,"en","P",1,5212,5212,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000178799","NOSE_000000178799",2009-11-30 20:06:39.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000517883","NOSE_000000517883",2009-04-30 00:17:41.0,",","NOSE",2,1,"de","P",1,5571,5571,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000542741","NOSE_000000542741",2010-07-08 13:47:38.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000671234","NOSE_000000671234",2009-12-04 16:51:19.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,1,0,0,0,0,0,"active" "000000460041","NOSE_000000460041",2009-11-04 15:33:05.0,",","NOSE",2,1,"fr","P",1,5409,5409,"Good",,,2,1,1,0,1,0,0,0,0,0,"active" "000000834443","NOSE_000000834443",2009-04-29 19:40:32.0,",","NOSE",2,1,"de","P",1,5273,5273,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000005732","NOSE_000000005732",2009-12-03 20:11:25.0,",","NOSE",2,1,"en","P",1,5257,5257,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000971601","NOSE_000000971601",2010-05-18 07:04:53.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000394329","NOSE_000000394329",2009-04-30 00:20:22.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000964374","NOSE_000000964374",2009-11-16 10:51:10.0,",","NOSE",,1,"de","P",1,,,,,,2,2,1,0,0,0,0,0,0,0,"active" "000000281068","NOSE_000000281068",2009-04-29 19:28:52.0,",","NOSE",2,1,"en","P",1,5145,5145,"Doubtful","

parent was drin...

","1",4,1,3,0,0,0,1,1,0,4,"active" "000000533977","NOSE_000000533977",2009-12-04 16:52:44.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000622058","NOSE_000000622058",2009-04-29 19:39:04.0,",","NOSE",2,1,"de","P",1,5361,5361,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000758003","NOSE_000000758003",2009-12-04 17:00:52.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000014929","NOSE_000000014929",2009-04-29 19:37:21.0,",","NOSE",2,1,"en","P",1,5268,5268,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000710206","NOSE_000000710206",2009-10-22 22:43:05.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000507449","NOSE_000000507449",2009-10-11 20:35:12.0,",","NOSE",2,1,"de","P",1,5093,5093,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000684131","NOSE_000000684131",2009-04-29 19:24:37.0,",","NOSE",2,1,"en","P",1,5486,5486,"Good",,"1",2,2,1,0,0,0,0,1,0,0,"active" "000000894549","NOSE_000000894549",2009-04-29 19:28:24.0,",","NOSE",2,1,"en","P",1,5343,5343,"Good",,"1",4,1,2,0,0,0,0,1,0,0,"active" "000000839688","NOSE_000000839688",2009-04-29 19:39:56.0,",","NOSE",2,1,"en","P",1,5170,5170,"Doubtful","

she thought tha...

","0",0,-1,0,0,0,0,0,0,0,0,"active" "000000455469","NOSE_000000455469",2009-05-18 10:32:26.0,",","NOSE",2,1,"de","P",1,5155,5155,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000931155","NOSE_000000931155",2010-05-16 07:05:25.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000107777","NOSE_000000107777",2009-04-29 19:24:15.0,",","NOSE",2,1,"en","P",1,5265,5265,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000741664","NOSE_000000741664",2009-04-30 00:31:03.0,",","NOSE",2,1,"de","P",1,5524,5524,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000564808","NOSE_000000564808",2010-01-15 07:03:41.0,",","NOSE",,1,"en","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000791642","NOSE_000000791642",2009-04-29 19:19:27.0,",","NOSE",2,1,"de","P",1,5210,5210,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000784701","NOSE_000000784701",2009-04-29 19:25:26.0,",","NOSE",2,1,"de","P",1,5096,5096,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000174683","NOSE_000000174683",2009-04-29 19:41:20.0,",","NOSE",2,1,"en","P",1,5113,5113,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000580272","NOSE_000000580272",2009-04-30 00:36:27.0,",","NOSE",2,1,"de","P",1,5159,5159,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000158868","NOSE_000000158868",2010-05-07 07:04:46.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000013478","NOSE_000000013478",2010-06-26 07:04:53.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000557495","NOSE_000000557495",2009-06-13 08:43:02.0,",","NOSE",2,1,"en","P",1,5346,5346,"Good",,"1",1,2,1,0,0,0,0,0,0,2,"active" "000000657533","NOSE_000000657533",2009-07-03 10:45:38.0,",","NOSE",2,1,"de","P",1,5176,5176,"Good",,,2,0,1,0,0,0,0,0,2,0,"active" "000000467955","NOSE_000000467955",2009-08-20 03:20:46.0,",","NOSE",2,1,"de","P",1,5216,5216,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000040728","NOSE_000000040728",2009-12-04 17:01:32.0,",","NOSE",2,1,"en","P",1,5439,5439,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000919689","NOSE_000000919689",2009-09-09 20:55:22.0,",","NOSE",2,1,"fr","P",1,5454,5454,"Good",,,1,1,0,0,0,0,0,0,0,0,"active" "000000772255","NOSE_000000772255",2009-04-30 00:37:51.0,",","NOSE",2,,,,,,,"Missing",,,,,,,,,,,,,"active" "000000677559","NOSE_000000677559",2009-12-04 17:02:59.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000134261","NOSE_000000134261",2009-04-29 19:39:47.0,",","NOSE",2,2,"de","P",1,5416,5416,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000606179","NOSE_000000606179",2009-11-04 15:33:24.0,",","NOSE",2,1,"de","P",1,5443,5443,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000236515","NOSE_000000236515",2010-04-29 11:53:46.0,",","NOSE",2,1,"de","P",1,5173,5173,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000892341","NOSE_000000892341",2009-04-29 19:32:26.0,",","NOSE",2,1,"de","P",1,5154,5154,"Good",,"1",2,0,0,0,0,0,0,0,0,2,"active" "000000494690","NOSE_000000494690",2009-04-30 00:41:50.0,",","NOSE",,1,"en","P",1,,,,,,3,1,2,0,0,0,0,0,0,0,"active" "000000890791","NOSE_000000890791",2009-12-04 17:01:53.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000410375","NOSE_000000410375",2009-12-04 17:03:22.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000743984","NOSE_000000743984",2010-07-18 07:14:38.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000031708","NOSE_000000031708",2009-08-21 21:49:16.0,",","NOSE",2,1,"fr","P",1,5136,5136,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000340643","NOSE_000000340643",2009-04-29 19:37:27.0,",","NOSE",2,1,"en","P",1,5323,5323,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000720939","NOSE_000000720939",2009-04-30 00:43:25.0,",","NOSE",2,1,"de","P",1,5586,5586,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000376659","NOSE_000000376659",2010-03-30 07:07:24.0,",","NOSE",2,1,"de","P",1,5172,5172,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000087611","NOSE_000000087611",2009-07-31 19:15:49.0,",","NOSE",2,1,"de","P",1,5486,5486,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000347529","NOSE_000000347529",2009-06-13 08:59:50.0,",","NOSE",2,1,"de","P",1,5428,5428,"Doubtful","

Due to language...

",,2,0,0,0,0,0,0,0,0,0,"active" "000000607021","NOSE_000000607021",2009-04-29 19:32:23.0,",","NOSE",2,1,"de","P",1,5256,5256,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000936086","NOSE_000000936086",2009-04-30 00:46:01.0,",","NOSE",2,1,"de","P",1,5289,5289,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000800867","NOSE_000000800867",2009-06-30 00:35:37.0,",","NOSE",2,1,"en","P",1,5213,5213,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000088237","NOSE_000000088237",2009-04-29 19:35:22.0,",","NOSE",2,1,"en","P",1,5369,5369,"Good",,"1",2,2,2,0,0,0,0,0,0,0,"active" "000000654340","NOSE_000000654340",2009-04-29 19:39:36.0,",","NOSE",2,2,"de","P",1,5251,5282,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000730431","NOSE_000000730431",2009-11-29 20:06:45.0,",","NOSE",2,1,"de","P",1,5130,5130,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000466806","NOSE_000000466806",2009-04-30 00:53:51.0,",","NOSE",2,1,"fr","P",1,5474,5474,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000846844","NOSE_000000846844",2009-09-14 20:17:51.0,",","NOSE",2,1,"de","P",1,5373,5373,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000462378","NOSE_000000462378",2010-06-03 07:05:21.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000966071","NOSE_000000966071",2009-09-08 22:37:01.0,",","NOSE",2,1,"de","P",1,5485,5485,"Good",,,4,2,3,3,2,3,4,2,2,4,"active" "000000446834","NOSE_000000446834",2010-04-30 07:04:39.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000631407","NOSE_000000631407",2009-12-04 16:38:21.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000336504","NOSE_000000336504",2009-08-20 03:31:03.0,",","NOSE",,1,"en","P",1,5159,5159,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000850815","NOSE_000000850815",2009-04-30 00:57:46.0,",","NOSE",,1,"en","P",1,5301,5301,,,"9",3,1,0,0,0,0,0,0,0,0,"active" "000000374017","NOSE_000000374017",2009-10-17 21:08:31.0,",","NOSE",2,1,"en","P",1,5236,5236,"Good","

Completed by gu...

",,4,1,1,0,1,0,0,0,2,0,"active" "000000379789","NOSE_000000379789",2009-12-01 20:07:19.0,",","NOSE",2,1,"en","P",1,5250,5250,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000620454","NOSE_000000620454",2009-06-13 09:28:30.0,",","NOSE",2,1,"de","P",1,4994,4994,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000262718","NOSE_000000262718",2009-12-04 17:02:29.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000382156","NOSE_000000382156",2009-06-13 09:56:37.0,",","NOSE",2,1,"fr","P",1,5287,5287,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000503926","NOSE_000000503926",2010-06-05 07:06:59.0,",","NOSE",,1,"en","P",1,,,,,,2,3,1,0,1,0,0,1,2,0,"active" "000000596908","NOSE_000000596908",2009-04-30 01:04:29.0,",","NOSE",2,1,"fr","P",1,5098,5098,"Good",,"1",3,0,1,0,1,0,1,1,0,2,"active" "000000263501","NOSE_000000263501",2009-11-04 15:33:40.0,",","NOSE",2,1,"en","P",1,5026,5410,"Good",,,4,1,1,0,0,0,0,0,0,0,"active" "000000888918","NOSE_000000888918",2009-04-29 19:29:44.0,",","NOSE",2,1,"en","P",1,5295,5295,"Good",,"1",3,2,2,0,0,0,0,0,0,4,"active" "000000320676","NOSE_000000320676",2009-04-30 01:11:40.0,",","NOSE",2,1,"de","P",1,5275,5275,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000144012","NOSE_000000144012",2010-06-21 07:05:03.0,",","NOSE",,1,"en","P",1,,,,,,2,2,1,0,0,0,1,1,0,0,"active" "000000981977","NOSE_000000981977",2009-04-29 19:27:10.0,",","NOSE",2,1,"en","P",1,5359,5359,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000761928","NOSE_000000761928",2009-04-30 01:26:00.0,",","NOSE",2,1,"de","P",1,5527,5527,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000706894","NOSE_000000706894",2009-04-30 01:34:09.0,",","NOSE",2,1,"de","P",1,5850,5484,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000985794","NOSE_000000985794",2009-08-20 03:46:36.0,",","NOSE",2,1,"de","P",1,5203,5203,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000947536","NOSE_000000947536",2010-01-05 15:14:44.0,",","NOSE",2,1,"fr","P",1,5383,5383,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000782112","NOSE_000000782112",2009-10-03 20:56:32.0,",","NOSE",2,1,"de","P",1,5315,5315,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000793800","NOSE_000000793800",2009-07-31 19:33:08.0,",","NOSE",2,1,"en","P",1,5454,5454,"Good",,,2,2,1,0,0,0,0,0,2,0,"active" "000000498415","NOSE_000000498415",2009-10-12 20:40:50.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000595391","NOSE_000000595391",2009-04-29 19:37:47.0,",","NOSE",2,1,"de","P",1,5331,5331,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000345837","NOSE_000000345837",2010-04-20 07:06:04.0,",","NOSE",,1,"fr","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000245805","NOSE_000000245805",2009-04-29 19:25:45.0,",","NOSE",2,1,"fr","P",1,5687,5687,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000565526","NOSE_000000565526",2009-04-29 19:42:06.0,",","NOSE",2,1,"de","P",1,5416,5419,"Good",,"1",3,1,1,0,0,0,1,1,0,0,"active" "000000589466","NOSE_000000589466",2009-08-31 15:54:59.0,",","NOSE",2,1,"de","P",1,5410,5410,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000972266","NOSE_000000972266",2009-12-04 17:01:40.0,",","NOSE",1,1,"en","P",1,5212,5212,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000416345","NOSE_000000416345",2010-07-08 13:44:00.0,",","NOSE",,1,"en","P",1,,,,,,3,1,0,0,0,0,0,0,0,0,"active" "000000462924","NOSE_000000462924",2009-05-18 10:32:27.0,",","NOSE",2,1,"de","P",1,4884,4884,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000490045","NOSE_000000490045",2009-04-29 19:23:28.0,",","NOSE",2,1,"de","P",1,5383,5383,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000084633","NOSE_000000084633",2009-09-02 23:46:30.0,",","NOSE",2,1,"en","P",1,5241,5241,"Good",,,2,1,0,0,0,0,0,0,0,0,"active" "000000287039","NOSE_000000287039",2009-12-04 16:47:02.0,",","NOSE",2,1,"en","P",1,5048,5055,"Good",,,4,1,1,0,0,0,3,0,0,0,"active" "000000535518","NOSE_000000535518",2010-07-08 12:44:25.0,",","NOSE",2,1,"fr","P",1,5208,5208,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000701430","NOSE_000000701430",2009-06-13 10:03:30.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000202173","NOSE_000000202173",2009-06-03 10:45:22.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000840863","NOSE_000000840863",2009-12-04 16:45:46.0,",","NOSE",2,1,"en","P",1,5065,5065,"Good",,,4,0,2,0,0,0,0,0,0,0,"active" "000000523261","NOSE_000000523261",2009-04-30 02:11:12.0,",","NOSE",2,1,"de","P",1,5459,5459,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000809806","NOSE_000000809806",2009-04-30 02:19:55.0,",","NOSE",2,1,"de","P",1,5305,5305,"Good",,"1",2,1,0,0,1,0,1,0,0,0,"active" "000000514864","NOSE_000000514864",2009-04-30 02:27:44.0,",","NOSE",2,1,"de","P",1,5602,5250,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000683868","NOSE_000000683868",2010-02-05 10:14:14.0,",","NOSE",2,1,"de","P",1,5238,5238,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000536913","NOSE_000000536913",2009-12-04 17:03:46.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000063160","NOSE_000000063160",2009-12-22 20:03:17.0,",","NOSE",,1,"fr","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000465447","NOSE_000000465447",2009-12-04 17:03:12.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000968235","NOSE_000000968235",2009-04-29 19:42:32.0,",","NOSE",2,1,"de","P",1,5377,5377,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000938507","NOSE_000000938507",2009-04-29 19:27:35.0,",","NOSE",2,1,"en","P",1,5320,5320,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000573086","NOSE_000000573086",2009-04-30 02:54:14.0,",","NOSE",2,1,"en","P",1,5014,5014,"Good",,"9",2,0,0,0,0,0,0,0,0,0,"active" "000000396968","NOSE_000000396968",2010-06-02 07:05:28.0,",","NOSE",,1,"en","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000931489","NOSE_000000931489",2009-10-22 22:43:43.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000830446","NOSE_000000830446",2009-11-22 20:07:59.0,",","NOSE",2,1,"en","P",1,5036,5036,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000482980","NOSE_000000482980",2009-04-30 03:02:54.0,",","NOSE",2,1,"en","P",1,5305,5305,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000820606","NOSE_000000820606",2009-11-04 15:33:58.0,",","NOSE",2,1,"en","P",1,5302,5302,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000986669","NOSE_000000986669",2009-04-30 03:12:04.0,",","NOSE",2,1,"de","P",1,5206,5206,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000100739","NOSE_000000100739",2009-04-29 19:37:53.0,",","NOSE",2,1,"en","P",1,5188,5188,"Good",,"1",4,0,1,0,1,0,0,0,0,0,"active" "000000450559","NOSE_000000450559",2009-04-30 03:30:11.0,",","NOSE",2,1,"fr","P",1,5096,5096,"Good",,"1",4,1,1,0,0,0,0,0,0,2,"active" "000000200530","NOSE_000000200530",2009-04-30 03:38:51.0,",","NOSE",2,1,"de","P",1,5777,5425,"Good",,"1",1,2,1,0,0,0,0,0,0,0,"active" "000000329772","NOSE_000000329772",2010-06-03 07:04:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000636740","NOSE_000000636740",2010-07-09 07:21:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000742825","NOSE_000000742825",2009-04-30 03:48:00.0,",","NOSE",1,1,"fr","P",1,5280,5280,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000921165","NOSE_000000921165",2010-03-13 07:05:37.0,",","NOSE",2,1,"en","P",1,5148,5148,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000602673","NOSE_000000602673",2009-04-30 03:56:53.0,",","NOSE",2,1,"de","P",1,5391,5391,"Good",,"1",3,1,0,0,0,0,0,0,0,0,"active" "000000400354","NOSE_000000400354",2009-10-16 05:16:21.0,",","NOSE",2,1,"de","P",1,5088,5088,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000013218","NOSE_000000013218",2009-12-04 16:40:53.0,",","NOSE",2,1,"de","P",1,5177,5177,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000781265","NOSE_000000781265",2009-12-04 17:02:56.0,",","NOSE",,1,"en","P",1,,,,,,3,1,3,0,0,0,0,0,0,0,"active" "000000389392","NOSE_000000389392",2010-04-19 07:07:22.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000007487","NOSE_000000007487",2009-06-13 11:02:40.0,",","NOSE",2,1,"de","P",1,5281,5281,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000908763","NOSE_000000908763",2009-08-06 13:31:34.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000751132","NOSE_000000751132",2009-10-23 20:31:50.0,",","NOSE",2,1,"en","P",1,5437,5437,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000653799","NOSE_000000653799",2009-04-30 04:06:25.0,",","NOSE",2,1,"de","P",1,5105,5105,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000905669","NOSE_000000905669",2009-04-30 04:15:40.0,",","NOSE",2,1,"fr","P",1,5441,5441,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000758036","NOSE_000000758036",2009-12-04 17:03:07.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000745026","NOSE_000000745026",2009-07-16 14:57:46.0,",","NOSE",2,1,"de","P",1,5155,5155,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000088859","NOSE_000000088859",2009-07-07 11:02:50.0,",","NOSE",2,1,"de","P",1,5317,5317,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000021716","NOSE_000000021716",2009-04-30 04:23:02.0,",","NOSE",,1,"en","P",1,,,,,"9",2,1,1,0,0,0,0,0,0,0,"active" "000000853302","NOSE_000000853302",2009-06-30 01:02:00.0,",","NOSE",2,1,"de","P",1,5292,5292,"Good",,,4,0,1,0,0,0,1,0,0,4,"active" "000000940171","NOSE_000000940171",2009-06-13 11:30:26.0,",","NOSE",,1,"de","P",1,5014,5014,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000300678","NOSE_000000300678",2010-02-11 07:04:26.0,",","NOSE",2,1,"de","P",1,5306,5306,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000726489","NOSE_000000726489",2010-01-28 07:03:35.0,",","NOSE",2,1,"de","P",1,5467,5467,"Good","

commanding the ...

",,2,0,0,0,0,0,0,0,0,0,"active" "000000633751","NOSE_000000633751",2009-12-04 16:53:28.0,",","NOSE",,1,"de","P",1,,,,,,2,2,1,0,0,0,2,0,0,0,"active" "000000648697","NOSE_000000648697",2009-07-07 11:31:52.0,",","NOSE",2,1,"de","P",1,5312,5312,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000878794","NOSE_000000878794",2010-07-10 07:08:21.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000506754","NOSE_000000506754",2009-04-29 19:34:27.0,",","NOSE",2,1,"de","P",1,5419,5419,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000913951","NOSE_000000913951",2009-06-30 01:30:31.0,",","NOSE",2,1,"en","P",1,5362,5362,"Good",,,4,0,1,1,1,0,0,1,0,0,"active" "000000598188","NOSE_000000598188",2009-07-31 19:16:10.0,",","NOSE",2,1,"de","P",1,5381,5381,"Good",,,4,0,1,0,0,1,1,2,0,0,"active" "000000017250","NOSE_000000017250",2009-04-29 19:28:03.0,",","NOSE",2,1,"de","P",1,5403,5403,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000728885","NOSE_000000728885",2009-12-04 16:52:20.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000701368","NOSE_000000701368",2009-08-20 04:19:45.0,",","NOSE",2,1,"en","P",1,5112,5112,"Good","

English was not...

",,0,-1,0,0,0,0,0,0,0,0,"active" "000000648110","NOSE_000000648110",2009-04-29 19:28:19.0,",","NOSE",2,1,"en","P",1,5331,5331,"Good",,"1",4,2,3,1,0,0,0,1,2,2,"active" "000000546943","NOSE_000000546943",2010-04-09 07:04:25.0,",","NOSE",,1,"en","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000368546","NOSE_000000368546",2009-09-04 23:45:14.0,",","NOSE",,1,"en","P",1,5171,5171,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000751380","NOSE_000000751380",2009-04-29 19:42:01.0,",","NOSE",2,1,"en","P",1,5103,5103,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000167380","NOSE_000000167380",2009-06-13 11:59:10.0,",","NOSE",2,1,"en","P",1,5073,5073,"Good",,"1",4,0,1,0,1,0,1,1,0,0,"active" "000000737050","NOSE_000000737050",2009-07-31 19:16:29.0,",","NOSE",2,1,"de","P",1,5436,5436,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000201507","NOSE_000000201507",2010-03-17 07:04:44.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000567118","NOSE_000000567118",2009-04-30 05:04:00.0,",","NOSE",2,1,"de","P",1,5163,5163,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000277045","NOSE_000000277045",2009-07-31 19:34:21.0,",","NOSE",2,1,"de","P",1,5437,5437,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000118418","NOSE_000000118418",2009-04-29 19:38:22.0,",","NOSE",2,1,"en","P",1,5453,5453,"Good",,,1,1,1,0,0,0,0,0,0,0,"active" "000000444180","NOSE_000000444180",2009-12-04 17:01:35.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000812127","NOSE_000000812127",2010-06-21 12:04:07.0,",","NOSE",2,1,"en","P",1,5121,5121,"Good",,,1,1,4,0,0,3,1,3,0,4,"active" "000000642016","NOSE_000000642016",2010-07-08 12:38:24.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000461435","NOSE_000000461435",2010-05-29 07:05:45.0,",","NOSE",,1,"de","P",1,5133,5133,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000998461","NOSE_000000998461",2009-04-29 19:16:17.0,",","NOSE",2,2,"de","P",1,5221,5221,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000321190","NOSE_000000321190",2009-12-07 15:26:54.0,",","NOSE",2,1,"fr","P",1,5128,5128,"Good",,,4,1,1,1,1,0,1,0,0,0,"active" "000000335684","NOSE_000000335684",2009-04-29 19:41:26.0,",","NOSE",2,1,"en","P",1,5302,5302,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000075536","NOSE_000000075536",2009-12-04 17:02:40.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000310145","NOSE_000000310145",2010-07-15 07:05:46.0,",","NOSE",2,1,"fr","P",1,5003,5003,"Good",,,4,1,1,1,1,1,1,1,4,4,"active" "000000880014","NOSE_000000880014",2009-04-29 19:26:40.0,",","NOSE",2,1,"fr","P",1,5087,5087,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000478875","NOSE_000000478875",2009-12-04 16:40:50.0,",","NOSE",2,1,"de","P",1,5319,5319,"Good",,,1,2,1,0,0,0,0,0,0,0,"active" "000000529052","NOSE_000000529052",2009-08-20 20:41:37.0,",","NOSE",2,1,"de","P",1,4990,4990,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000615719","NOSE_000000615719",2009-08-20 20:41:25.0,",","NOSE",2,1,"en","P",1,5189,5189,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000534096","NOSE_000000534096",2009-06-13 12:28:07.0,",","NOSE",2,1,"fr","P",1,5309,5309,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000291773","NOSE_000000291773",2009-11-28 20:06:51.0,",","NOSE",,2,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000460609","NOSE_000000460609",2009-07-07 11:32:47.0,",","NOSE",2,1,"en","P",1,4825,5209,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000354852","NOSE_000000354852",2009-09-06 00:09:15.0,",","NOSE",2,1,"de","P",1,5432,5432,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000534499","NOSE_000000534499",2009-12-04 16:52:09.0,",","NOSE",,2,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000516575","NOSE_000000516575",2009-12-04 17:08:41.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000241664","NOSE_000000241664",2009-08-20 04:32:19.0,",","NOSE",2,1,"de","P",1,5426,5426,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000825920","NOSE_000000825920",2009-06-30 01:31:31.0,",","NOSE",2,1,"fr","P",1,5124,5124,"Good",,,4,2,1,0,0,0,0,0,0,0,"active" "000000739925","NOSE_000000739925",2009-10-14 10:00:42.0,",","NOSE",2,1,"en","P",1,5201,5202,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000019168","NOSE_000000019168",2009-10-22 21:58:06.0,",","NOSE",2,1,"en","P",1,5152,5536,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000387826","NOSE_000000387826",2009-12-04 16:47:07.0,",","NOSE",2,1,"en","P",1,5161,5161,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000686297","NOSE_000000686297",2009-11-04 15:34:05.0,",","NOSE",2,1,"en","P",1,5153,5153,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000679066","NOSE_000000679066",2010-04-19 07:04:55.0,",","NOSE",2,1,"fr","P",1,5231,5231,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000641375","NOSE_000000641375",2009-12-04 16:43:06.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000667411","NOSE_000000667411",2009-04-29 19:33:27.0,",","NOSE",2,1,"en","P",1,5476,5476,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000050453","NOSE_000000050453",2009-07-31 19:16:51.0,",","NOSE",2,1,"de","P",1,5285,5285,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000813321","NOSE_000000813321",2009-06-30 01:47:04.0,",","NOSE",2,1,"de","P",1,5510,5510,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000298927","NOSE_000000298927",2010-06-12 07:05:54.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,1,0,0,0,"active" "000000304185","NOSE_000000304185",2010-03-23 07:06:37.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000137904","NOSE_000000137904",2009-09-12 20:22:18.0,",","NOSE",2,1,"de","P",1,5347,5347,"Good",,,3,0,1,0,0,0,2,0,0,0,"active" "000000882003","NOSE_000000882003",2009-04-29 19:26:23.0,",","NOSE",2,1,"fr","P",1,5311,5311,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000210812","NOSE_000000210812",2009-04-30 06:04:24.0,",","NOSE",2,1,"de","P",1,5373,5373,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000018949","NOSE_000000018949",2010-04-20 07:04:43.0,",","NOSE",,1,"de","P",1,,,,,,1,1,1,0,0,0,0,0,0,0,"active" "000000369113","NOSE_000000369113",2009-06-03 10:44:08.0,",","NOSE",2,2,"en","P",1,5386,5386,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000447675","NOSE_000000447675",2009-04-29 19:30:15.0,",","NOSE",2,1,"en","P",1,5391,5391,"Good",,"1",3,1,2,0,0,0,0,0,0,0,"active" "000000680149","NOSE_000000680149",2009-06-13 13:24:30.0,",","NOSE",2,1,"de","P",1,4934,4934,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000089995","NOSE_000000089995",2009-04-29 19:29:28.0,",","NOSE",2,1,"de","P",1,4913,4913,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000955685","NOSE_000000955685",2009-05-18 10:32:29.0,",","NOSE",2,1,"en","P",1,5138,5138,"Good",,"1",3,0,1,0,1,0,1,1,0,0,"active" "000000242124","NOSE_000000242124",2009-12-04 16:52:15.0,",","NOSE",,1,"de","P",1,,,,,,1,0,1,0,0,0,0,0,0,0,"active" "000000131865","NOSE_000000131865",2009-04-29 19:34:25.0,",","NOSE",2,1,"fr","P",1,5280,5280,"Good",,"1",4,0,2,0,0,0,0,0,0,0,"active" "000000441942","NOSE_000000441942",2009-04-29 19:26:29.0,",","NOSE",2,2,"de","P",1,5415,5464,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000822322","NOSE_000000822322",2009-04-30 06:49:42.0,",","NOSE",2,1,"de","P",1,5126,5126,"Good",,"1",3,0,1,0,0,0,1,0,0,2,"active" "000000880498","NOSE_000000880498",2009-04-29 19:37:09.0,",","NOSE",2,1,"en","P",1,5370,5370,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000107442","NOSE_000000107442",2009-09-19 20:20:22.0,",","NOSE",2,1,"fr","P",1,5244,5244,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000806721","NOSE_000000806721",2009-04-29 19:27:27.0,",","NOSE",2,1,"de","P",1,5254,5254,"Good",,"1",1,1,0,0,0,0,0,0,0,0,"active" "000000306433","NOSE_000000306433",2009-12-04 16:46:01.0,",","NOSE",,1,"en","P",1,,,,,,4,0,2,0,0,0,0,0,0,0,"active" "000000984651","NOSE_000000984651",2009-04-29 19:32:52.0,",","NOSE",2,1,"en","P",1,5104,5104,"Good",,"1",3,1,1,0,1,0,1,1,4,0,"active" "000000469556","NOSE_000000469556",2009-12-04 16:47:05.0,",","NOSE",2,1,"en","P",1,5219,5219,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000999690","NOSE_000000999690",2009-12-04 16:53:20.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000507203","NOSE_000000507203",2009-04-29 19:33:47.0,",","NOSE",2,1,"en","P",1,5343,5343,"Good",,"1",1,0,1,0,1,0,1,0,0,0,"active" "000000056273","NOSE_000000056273",2009-07-31 19:17:10.0,",","NOSE",,1,"en","P",1,,,,,,1,1,1,0,0,0,0,0,2,0,"active" "000000760648","NOSE_000000760648",2009-06-30 02:12:42.0,",","NOSE",2,1,"fr","P",1,5180,5180,"Good",,,1,0,1,0,0,0,0,0,0,0,"active" "000000491355","NOSE_000000491355",2009-12-04 17:01:47.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000583673","NOSE_000000583673",2009-04-29 19:19:35.0,",","NOSE",2,1,"de","P",1,5324,5324,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000621030","NOSE_000000621030",2010-06-30 07:04:52.0,",","NOSE",2,1,"en","P",1,5404,5404,"Good",,,3,0,1,0,0,0,0,1,0,0,"active" "000000918368","NOSE_000000918368",2010-05-31 07:05:14.0,",","NOSE",,1,"en","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000166767","NOSE_000000166767",2009-04-29 19:23:52.0,",","NOSE",2,1,"en","P",1,5288,5288,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000653807","NOSE_000000653807",2009-12-04 16:54:08.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000561983","NOSE_000000561983",2010-05-23 07:04:34.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000680867","NOSE_000000680867",2010-03-08 07:04:01.0,",","NOSE",2,1,"en","P",1,5332,5332,"Good",,,4,2,3,0,0,0,0,1,0,0,"active" "000000092149","NOSE_000000092149",2010-03-28 07:04:24.0,",","NOSE",2,1,"fr","P",1,5263,5263,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000632048","NOSE_000000632048",2010-07-08 12:43:29.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000243571","NOSE_000000243571",2009-10-11 20:35:37.0,",","NOSE",2,1,"de","P",1,5014,5014,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000144749","NOSE_000000144749",2009-12-04 17:04:13.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000837481","NOSE_000000837481",2009-04-30 07:55:10.0,",","NOSE",2,1,"de","P",1,5318,5318,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000322347","NOSE_000000322347",2010-03-17 07:04:21.0,",","NOSE",,1,"de","P",1,,,,,,4,0,0,0,0,0,0,0,0,0,"active" "000000942393","NOSE_000000942393",2009-12-04 16:52:25.0,",","NOSE",,1,"de","P",1,,,,,,4,0,2,1,0,0,1,0,0,4,"active" "000000907892","NOSE_000000907892",2009-08-20 04:47:47.0,",","NOSE",1,1,"en","P",1,5363,5363,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000233177","NOSE_000000233177",2009-12-04 17:03:04.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000661315","NOSE_000000661315",2009-08-20 06:09:27.0,",","NOSE",2,1,"de","P",1,5071,5071,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000855012","NOSE_000000855012",2009-04-29 19:33:01.0,",","NOSE",2,1,"en","P",1,5394,5394,"Good",,"1",4,0,2,0,0,0,1,0,0,0,"active" "000000188483","NOSE_000000188483",2009-04-29 19:27:05.0,",","NOSE",2,1,"en","P",1,5353,5353,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000852364","NOSE_000000852364",2009-04-30 08:23:20.0,",","NOSE",2,1,"en","P",1,5119,5119,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000651771","NOSE_000000651771",2009-08-20 04:57:34.0,",","NOSE",2,1,"de","P",1,5361,5361,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000201693","NOSE_000000201693",2009-06-13 13:54:26.0,",","NOSE",2,2,"fr","P",1,5561,5561,"Good",,,4,0,0,0,0,0,0,0,0,0,"active" "000000650347","NOSE_000000650347",2009-04-30 08:23:42.0,",","NOSE",2,1,"fr","P",1,5227,5227,"Good",,"1",4,0,1,0,0,0,0,1,0,0,"active" "000000232920","NOSE_000000232920",2009-08-20 05:12:33.0,",","NOSE",2,1,"de","P",1,5497,5497,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000827003","NOSE_000000827003",2010-07-08 13:01:16.0,",","NOSE",,1,"en","P",1,,,,,,4,1,1,1,0,0,3,0,0,4,"active" "000000170915","NOSE_000000170915",2009-04-29 19:30:53.0,",","NOSE",2,1,"en","P",1,5336,5336,"Good",,"1",3,1,0,0,1,0,0,0,0,0,"active" "000000284789","NOSE_000000284789",2009-06-13 14:23:34.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000259295","NOSE_000000259295",2009-04-29 19:35:34.0,",","NOSE",2,1,"en","P",1,5379,5379,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000062661","NOSE_000000062661",2009-11-04 15:34:23.0,",","NOSE",2,1,"fr","P",1,5579,5579,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000785511","NOSE_000000785511",2010-04-16 07:05:14.0,",","NOSE",2,1,"fr","P",1,5335,5335,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000066718","NOSE_000000066718",2009-04-29 19:40:59.0,",","NOSE",2,1,"en","P",1,5348,5348,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000259654","NOSE_000000259654",2010-07-14 07:19:43.0,",","NOSE",,1,"de","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000803815","NOSE_000000803815",2009-04-29 19:19:42.0,",","NOSE",2,1,"de","P",1,5288,5288,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000614784","NOSE_000000614784",2009-11-04 15:34:41.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000266291","NOSE_000000266291",2009-04-29 19:37:50.0,",","NOSE",2,1,"de","P",1,5258,5258,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000198965","NOSE_000000198965",2009-06-13 14:50:59.0,",","NOSE",2,1,"de","P",1,5389,5389,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000691123","NOSE_000000691123",2009-09-17 10:11:04.0,",","NOSE",2,1,"de","P",1,5298,5298,"Good",,,3,0,1,0,0,0,0,0,0,0,"active" "000000372966","NOSE_000000372966",2009-04-29 19:30:00.0,",","NOSE",2,1,"en","P",1,5327,5327,"Good",,"1",4,1,2,0,1,0,1,0,0,2,"active" "000000741844","NOSE_000000741844",2010-02-05 10:08:40.0,",","NOSE",2,1,"de","P",1,5410,5410,"Good",,,3,1,1,0,0,0,0,0,0,0,"active" "000000828232","NOSE_000000828232",2009-07-31 19:17:31.0,",","NOSE",2,1,"de","P",1,5182,5182,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000157998","NOSE_000000157998",2009-08-20 09:15:05.0,",","NOSE",2,1,"de","P",1,5201,5201,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000003586","NOSE_000000003586",2009-10-06 10:18:55.0,",","NOSE",2,1,"de","P",1,5168,5168,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000447163","NOSE_000000447163",2009-04-30 09:28:02.0,",","NOSE",2,1,"fr","P",1,5169,5169,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000345690","NOSE_000000345690",2009-12-04 16:56:39.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000885929","NOSE_000000885929",2010-07-08 12:38:38.0,",","NOSE",,1,"de","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000940994","NOSE_000000940994",2010-01-13 11:40:36.0,",","NOSE",2,1,"en","P",1,5175,5175,"Good",,,3,1,0,0,0,0,0,0,0,0,"active" "000000811368","NOSE_000000811368",2009-12-04 17:01:37.0,",","NOSE",,1,"en","P",1,,,,,,2,2,2,0,0,0,0,0,0,0,"active" "000000239596","NOSE_000000239596",2010-01-15 07:03:37.0,",","NOSE",2,1,"fr","P",1,5048,5048,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000593697","NOSE_000000593697",2009-12-04 17:04:45.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000369862","NOSE_000000369862",2009-10-17 02:43:18.0,",","NOSE",2,1,"en","P",1,5406,5406,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000849072","NOSE_000000849072",2009-04-29 19:24:50.0,",","NOSE",2,1,"en","P",1,5228,5228,"Good",,"1",4,3,2,0,0,0,0,0,0,0,"active" "000000921318","NOSE_000000921318",2009-11-21 20:06:43.0,",","NOSE",2,1,"fr","P",1,,,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000202556","NOSE_000000202556",2009-04-30 09:55:48.0,",","NOSE",2,1,"fr","P",1,5413,5413,"Good",,"1",2,1,1,0,0,0,0,0,0,0,"active" "000000565730","NOSE_000000565730",2009-11-04 15:35:00.0,",","NOSE",2,1,"en","P",1,5215,5215,"Good",,,2,0,1,0,0,0,0,0,0,0,"active" "000000390587","NOSE_000000390587",2009-10-03 21:13:37.0,",","NOSE",2,1,"en","P",1,5224,5224,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000931504","NOSE_000000931504",2009-04-29 19:29:25.0,",","NOSE",2,1,"en","P",1,5312,5312,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000022598","NOSE_000000022598",2010-03-02 07:09:36.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,,4,0,1,1,1,0,2,1,0,4,"active" "000000501033","NOSE_000000501033",2009-04-30 10:26:31.0,",","NOSE",3,1,"de","P",1,5362,5367,"Good",,"1",3,0,1,0,0,0,0,0,0,2,"active" "000000141270","NOSE_000000141270",2009-04-29 19:19:05.0,",","NOSE",2,1,"de","P",1,5488,5488,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000524289","NOSE_000000524289",2009-08-20 05:27:46.0,",","NOSE",2,1,"en","P",1,5372,5372,"Good",,,2,2,1,0,0,0,0,0,2,0,"active" "000000147235","NOSE_000000147235",2009-12-04 16:41:00.0,",","NOSE",2,1,"de","P",1,5186,5186,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000197552","NOSE_000000197552",2009-04-30 10:55:34.0,",","NOSE",2,1,"de","P",1,5301,5301,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000310143","NOSE_000000310143",2009-04-29 19:27:32.0,",","NOSE",2,1,"de","P",1,5386,5386,"Good",,"1",1,0,1,0,0,0,0,0,0,0,"active" "000000597142","NOSE_000000597142",2009-04-30 11:32:48.0,",","NOSE",2,1,"en","P",1,5329,5329,"Good",,"1",4,1,1,0,0,0,0,0,0,0,"active" "000000370689","NOSE_000000370689",2010-04-08 07:04:48.0,",","NOSE",2,1,"fr","P",1,5590,5590,"Good",,,3,0,1,0,0,0,1,0,0,2,"active" "000000365936","NOSE_000000365936",2009-07-31 19:17:49.0,",","NOSE",2,1,"fr","P",1,5740,5740,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000361818","NOSE_000000361818",2010-06-30 07:05:41.0,",","NOSE",2,1,"fr","P",1,5295,5295,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000340544","NOSE_000000340544",2009-12-04 16:46:51.0,",","NOSE",2,1,"en","P",1,5034,5034,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000898518","NOSE_000000898518",2010-06-23 07:38:19.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000552797","NOSE_000000552797",2009-08-20 05:40:34.0,",","NOSE",2,1,"de","P",1,5412,5412,"Good",,,4,0,1,0,0,0,1,1,0,0,"active" "000000403977","NOSE_000000403977",2010-02-15 10:30:12.0,",","NOSE",2,1,"en","P",1,5141,5141,"Good",,,4,0,1,0,0,0,1,0,0,0,"active" "000000329823","NOSE_000000329823",2009-07-31 19:18:07.0,",","NOSE",2,1,"en","P",1,5179,5179,"Good",,,1,2,1,0,0,0,0,0,0,0,"active" "000000617315","NOSE_000000617315",2009-04-30 11:45:27.0,",","NOSE",2,1,"en","P",1,5344,5344,"Good",,"1",2,0,1,0,0,0,0,0,0,0,"active" "000000481630","NOSE_000000481630",2009-04-30 11:57:05.0,",","NOSE",2,1,"de","P",1,5406,5406,"Good",,"1",4,0,1,0,0,0,0,0,0,0,"active" "000000064158","NOSE_000000064158",2009-04-29 19:34:22.0,",","NOSE",2,1,"fr","P",1,5094,5094,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000310626","NOSE_000000310626",2009-06-13 15:19:20.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000451549","NOSE_000000451549",2009-12-04 16:52:28.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000985310","NOSE_000000985310",2009-12-04 16:48:57.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000588989","NOSE_000000588989",2009-06-13 15:40:16.0,",","NOSE",2,1,"en","P",1,5386,5386,"Good",,"1",0,-1,0,0,0,0,0,0,0,0,"active" "000000787771","NOSE_000000787771",2009-04-30 12:18:50.0,",","NOSE",2,1,"de","P",1,5458,5458,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000202391","NOSE_000000202391",2009-12-03 20:07:25.0,",","NOSE",,1,"en","P",1,,,,,,2,0,0,0,0,0,0,0,0,0,"active" "000000817376","NOSE_000000817376",2010-03-03 07:03:53.0,",","NOSE",2,1,"en","P",1,5026,5026,"Good",,,3,0,0,0,0,0,1,0,0,0,"active" "000000268854","NOSE_000000268854",2009-04-29 19:34:10.0,",","NOSE",1,1,"fr","P",1,5563,5563,"Good",,"9",3,0,2,0,0,0,0,0,0,0,"active" "000000876084","NOSE_000000876084",2009-04-29 19:26:10.0,",","NOSE",2,1,"de","P",1,5522,5522,"Good",,"1",4,0,0,0,0,0,0,0,0,0,"active" "000000110194","NOSE_000000110194",2009-04-29 19:30:06.0,",","NOSE",2,1,"en","P",1,5136,5136,"Good",,"1",2,1,0,0,0,0,0,0,0,0,"active" "000000558786","NOSE_000000558786",2009-07-15 16:35:06.0,",","NOSE",2,1,"fr","P",1,5130,5130,"Good",,,0,-1,0,0,0,0,0,0,0,0,"active" "000000791137","NOSE_000000791137",2009-11-16 10:50:09.0,",","NOSE",,1,"en","P",1,,,,,,1,1,0,0,0,0,0,0,0,0,"active" "000000607495","NOSE_000000607495",2010-04-29 11:42:55.0,",","NOSE",,1,"de","P",1,,,,,,3,0,0,0,0,0,0,0,0,0,"active" "000000494734","NOSE_000000494734",2009-04-29 19:26:48.0,",","NOSE",2,1,"de","P",1,5351,5351,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000025301","NOSE_000000025301",2009-12-04 16:42:10.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000824072","NOSE_000000824072",2009-12-22 20:03:21.0,",","NOSE",2,1,"en","P",1,5223,5223,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000823590","NOSE_000000823590",2009-11-04 15:35:14.0,",","NOSE",2,1,"en","P",1,5282,5282,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000778119","NOSE_000000778119",2009-04-29 19:25:48.0,",","NOSE",2,1,"fr","P",1,5334,5334,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000413899","NOSE_000000413899",2009-04-30 13:32:24.0,",","NOSE",2,1,"en","P",1,5016,5016,"Good",,"1",3,0,1,0,0,0,0,0,0,0,"active" "000000080285","NOSE_000000080285",2010-03-26 07:04:33.0,",","NOSE",2,1,"de","P",1,5117,5117,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000949521","NOSE_000000949521",2009-04-30 13:48:47.0,",","NOSE",2,1,"de","P",1,5303,5303,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000432990","NOSE_000000432990",2009-09-08 23:36:34.0,",","NOSE",2,1,"de","P",1,5399,5399,"Good",,,2,1,1,0,0,0,0,0,0,0,"active" "000000395390","NOSE_000000395390",2009-04-30 14:05:12.0,",","NOSE",2,1,"en","P",1,5362,5362,"Good",,"1",4,1,2,0,0,0,3,1,0,0,"active" "000000012604","NOSE_000000012604",2009-04-30 14:21:27.0,",","NOSE",2,1,"de","P",1,5366,5366,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000375389","NOSE_000000375389",2009-08-20 06:10:05.0,",","NOSE",2,1,"de","P",1,5413,5413,"Good",,,3,0,0,0,0,0,0,0,0,0,"active" "000000395629","NOSE_000000395629",2009-06-30 02:43:05.0,",","NOSE",2,1,"de","P",1,5448,5448,"Good",,,2,0,0,0,0,0,0,0,0,0,"active" "000000425624","NOSE_000000425624",2009-10-22 22:08:37.0,",","NOSE",,1,"en","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000013398","NOSE_000000013398",2009-12-04 17:02:48.0,",","NOSE",,1,"en","P",1,,,,,,3,0,1,0,0,0,0,0,0,0,"active" "000000804429","NOSE_000000804429",2009-04-30 14:37:52.0,",","NOSE",2,1,"de","P",1,5321,5321,"Good",,,1,0,0,0,0,0,0,0,0,0,"active" "000000252290","NOSE_000000252290",2009-12-05 20:07:10.0,",","NOSE",2,1,"fr","P",1,5130,5130,"Good",,,4,0,1,0,0,0,0,0,0,0,"active" "000000789326","NOSE_000000789326",2009-04-29 19:28:57.0,",","NOSE",2,1,"fr","P",1,5313,5313,"Good",,"1",3,0,0,0,0,0,0,0,0,0,"active" "000000221793","NOSE_000000221793",2010-07-10 07:05:27.0,",","NOSE",,1,"de","P",1,,,,,,1,0,0,0,0,0,0,0,0,0,"active" "000000882535","NOSE_000000882535",2009-04-29 19:31:39.0,",","NOSE",2,1,"en","P",1,5355,5355,"Good",,"1",4,1,2,1,1,0,1,1,2,0,"active" "000000688393","NOSE_000000688393",2009-12-04 16:53:10.0,",","NOSE",,1,"de","P",1,,,,,,4,1,2,1,0,0,2,2,0,4,"active" "000000357426","NOSE_000000357426",2009-04-29 19:32:06.0,",","NOSE",2,1,"de","P",1,5164,5164,"Good",,"1",3,0,2,0,0,0,0,0,0,0,"active" "000000249743","NOSE_000000249743",2009-11-27 10:18:33.0,",","NOSE",2,1,"en","P",1,5318,5318,"Good",,,2,2,3,0,0,0,0,1,0,0,"active" "000000774663","NOSE_000000774663",2009-04-30 15:40:24.0,",","NOSE",2,1,"de","P",1,5252,5252,"Good",,"1",1,0,0,0,0,0,0,0,0,0,"active" "000000113197","NOSE_000000113197",2009-04-29 19:40:13.0,",","NOSE",2,1,"en","P",1,5174,5174,"Good",,"1",2,0,0,0,0,0,0,0,0,0,"active" "000000943842","NOSE_000000943842",2009-10-22 22:45:00.0,",","NOSE",,1,"de","P",1,,,,,,0,-1,0,0,0,0,0,0,0,0,"active" "000000148464","NOSE_000000148464",2009-12-04 16:52:59.0,",","NOSE",,,,,,,,,,,,,,,,,,,,,"active" "000000983720","NOSE_000000983720",2009-04-30 16:03:17.0,",","NOSE",2,,,,,,,"Missing","

Not completed o...

",,,,,,,,,,,,"active" "000000836229","NOSE_000000836229",2010-07-08 13:55:14.0,",","NOSE",,1,"de","P",1,,,,,,2,1,1,0,0,0,0,0,0,0,"active" "000000886243","NOSE_000000886243",2010-05-19 07:05:07.0,",","NOSE",,1,"de","P",1,,,,,,2,0,1,0,0,0,0,0,0,0,"active" "000000465021","NOSE_000000465021",2009-04-29 19:42:29.0,",","NOSE",2,1,"de","P",1,5252,5252,"Good",,"1",4,1,2,0,0,0,0,0,0,0,"active" pyxnat-0.9.0~dev0/pyxnat/tests/scans_tests.py000066400000000000000000000006541163242155400214200ustar00rootroot00000000000000import os from .. import Interface _modulepath = os.path.dirname(os.path.abspath(__file__)) central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') def test_global_scan_listing(): assert central.array.scans(project_id='CENTRAL_OASIS_CS', experiment_type='xnat:mrSessionData', scan_type='xnat:mrScanData' ) pyxnat-0.9.0~dev0/pyxnat/tests/search_test.py000066400000000000000000000046211163242155400213710ustar00rootroot00000000000000from uuid import uuid1 from .. import Interface from .. import jsonutil central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') search_name = uuid1().hex def test_datatypes(): assert 'xnat:subjectData' in central.inspect.datatypes() def test_datafields(): assert 'xnat:subjectData/DOB' in \ central.inspect.datatypes('xnat:subjectData') assert 'xnat:subjectData/DOB' in \ central.inspect.datatypes('xnat:subjectData', '*') def test_fieldvalues(): assert len(central.inspect.field_values('xnat:subjectData/SUBJECT_ID') ) != 0 def test_inspect_resources(): assert 'OAS1_0440_MR1' in \ central.inspect.experiment_values('xnat:mrSessionData', 'CENTRAL_OASIS_CS' ) assert 'OAS1_0286_MR1_FSEG' in \ central.inspect.assessor_values('xnat:mrSessionData', 'CENTRAL_OASIS_CS' ) assert 'mpr-1' in \ central.inspect.scan_values('xnat:mrSessionData', 'CENTRAL_OASIS_CS' ) # just coverage assert isinstance(central.inspect.experiment_types(), list) assert isinstance(central.inspect.assessor_types(), list) assert isinstance(central.inspect.scan_types(), list) assert isinstance(central.inspect.reconstruction_types(), list) assert isinstance(central.inspect.project_values(), list) assert isinstance(central.inspect.subject_values(), list) def test_search(): results = central.select( 'xnat:mrSessionData', central.inspect.datatypes('xnat:mrSessionData') ).where([('xnat:mrSessionData/SCANNER', 'LIKE', '*GE*'), 'AND']) assert isinstance(results, jsonutil.JsonTable) def test_save_search(): central.manage.search.save( search_name, 'xnat:mrSessionData', central.inspect.datatypes('xnat:mrSessionData'), [('xnat:mrSessionData/SCANNER', 'LIKE', '*GE*'), 'AND'] ) assert search_name in central.manage.search.saved() def test_get_search(): results = central.manage.search.get(search_name) assert isinstance(results, jsonutil.JsonTable) def test_delete_search(): central.manage.search.delete(search_name) assert search_name not in central.manage.search.saved() pyxnat-0.9.0~dev0/pyxnat/tests/select_test.py000066400000000000000000000062731163242155400214100ustar00rootroot00000000000000from .. import select def test_switch_to_singular(): assert select.compute('/projects/nosetests') == ['/project/nosetests'] def test_switch_to_plural(): assert select.compute('/project') == ['/projects/*'] def test_complete_stars_plural(): assert select.compute('/projects/subjects/experiments') == ['/projects/*/subjects/*/experiments/*'] def test_complete_stars_singular(): assert select.compute('/project/subject/experiment') == ['/projects/*/subjects/*/experiments/*'] def test_simple_root_expand(): assert select.compute('//experiments') == ['/projects/*/subjects/*/experiments/*'] def test_simple_root_expand(): assert select.compute('//experiments') == ['/projects/*/subjects/*/experiments/*'] def test_simple_level_expand(): assert select.compute('/projects/IMAGEN//experiments') == ['/project/IMAGEN/subjects/*/experiments/*'] def test_leaf_level_expand(): assert set(select.compute('//files')) == \ set(['/projects/*/subjects/*/experiments/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/scans/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/*', '/projects/*/subjects/*/resources/*/files/*', '/projects/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/*']) def test_double_level_expand(): assert set(select.compute('//experiments//files')) == \ set(['/projects/*/subjects/*/experiments/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/scans/*/resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/out_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/in_resources/*/files/*', '/projects/*/subjects/*/experiments/*/reconstructions/*/out_resources/*/files/*', '/projects/*/subjects/*/experiments/*/assessors/*/resources/*/files/*']) def test_compute_all(): assert set(select.compute('/projects/nosetests//experiments/*Session*//files/myfile.txt')) == \ set(['/project/nosetests/subjects/*/experiments/*Session*/resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/reconstructions/*/in_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/scans/*/resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/assessors/*/out_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/assessors/*/in_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/reconstructions/*/out_resources/*/file/myfile.txt', '/project/nosetests/subjects/*/experiments/*Session*/assessors/*/resources/*/file/myfile.txt']) pyxnat-0.9.0~dev0/pyxnat/tests/uriutil_test.py000066400000000000000000000030301163242155400216120ustar00rootroot00000000000000from .. import uriutil def test_translate_uri(): assert uriutil.translate_uri('/assessors/out_resources/files') == '/assessors/out/resources/files' assert uriutil.translate_uri('/assessors/out_resource/files') == '/assessors/out/resource/files' assert uriutil.translate_uri('/assessors/in_resources/files') == '/assessors/in/resources/files' assert uriutil.translate_uri('/assessors/in_resource/files') == '/assessors/in/resource/files' def test_inv_translate_uri(): assert uriutil.inv_translate_uri('/assessors/out/resources/files') == '/assessors/out_resources/files' assert uriutil.inv_translate_uri('/assessors/out/resource/files') == '/assessors/out_resource/files' assert uriutil.inv_translate_uri('/assessors/in/resources/files') == '/assessors/in_resources/files' assert uriutil.inv_translate_uri('/assessors/in/resource/files') == '/assessors/in_resource/files' def test_join_uri(): assert uriutil.join_uri('/projects', 'project_id', 'subjects', 'subject_id') == '/projects/project_id/subjects/subject_id' def test_uri_last(): assert uriutil.uri_last('/projects/1/subjects/2') == '2' def test_uri_nextlast(): assert uriutil.uri_nextlast('/projects/1/subjects/2') == 'subjects' def test_uri_parent(): assert uriutil.uri_parent('/projects/1/subjects/2') == '/projects/1/subjects' def test_uri_grandparent(): assert uriutil.uri_grandparent('/projects/1/subjects/2') == '/projects/1' def test_uri_split(): assert uriutil.uri_split('/projects/1/subjects/2') == ['/projects/1/subjects', '2'] pyxnat-0.9.0~dev0/pyxnat/tests/user_and_project_management_test.py000066400000000000000000000041471163242155400256510ustar00rootroot00000000000000from .. import Interface central = Interface('https://central.xnat.org', 'nosetests', 'nosetests') def test_users(): assert isinstance(central.manage.users(), list) def test_user_firstname(): assert central.manage.users.firstname('nosetests') == 'Yannick' def test_user_lastname(): assert central.manage.users.lastname('nosetests') == 'Schwartz' def test_user_email(): assert central.manage.users.email('nosetests') == \ 'yannick.schwartz@gmail.com' def test_user_id(): assert central.manage.users.id('nosetests') == '204' def test_project_users(): assert isinstance(central.select.project('nosetests').users(), list) def test_project_owners(): assert isinstance(central.select.project('nosetests').owners(), list) def test_project_members(): assert isinstance(central.select.project('nosetests').members(), list) def test_project_collaborators(): assert isinstance(central.select.project('nosetests').collaborators(), list ) def test_project_user_role(): assert central.select.project('nosetests' ).user_role('nosetests') == 'owner' def test_add_remove_user(): central.select.project('nosetests').add_user('schwarty', 'collaborator') assert 'schwarty' in central.select.project('nosetests').collaborators() central.select.project('nosetests').remove_user('schwarty') assert 'schwarty' not in central.select.project('nosetests' ).collaborators() def test_project_accessibility(): assert central.select.project('nosetests').accessibility() in \ ['public', 'protected', 'private'] central.select.project('nosetests').set_accessibility('private') assert central.select.project('nosetests').accessibility() == 'private' central.select.project('nosetests').set_accessibility('protected') assert central.select.project('nosetests').accessibility() == 'protected' def test_project_prearchive_code(): pass def test_project_quarantine_code(): pass def test_current_arc(): pass pyxnat-0.9.0~dev0/pyxnat/tests/xpass_test.py000066400000000000000000000025511163242155400212620ustar00rootroot00000000000000from .. import xpass def test_find_plus_line(): print "Testing find_plus_line" test = ['hello', '+hello world', ''] assert(xpass.find_plus_line(test) == 'hello world') test2 = ['','hello world'] assert(xpass.find_plus_line(test2) == None) test3 = [] assert(xpass.find_plus_line(test3) == None) def test_find_token(): print "Testing find_token" str = "hello,world" assert(xpass.find_token(',',str) == ('hello','world')) assert(xpass.find_token(' ',str) == None) def test_parse_xnat_pass(): print "Testing parse_xnat_pass" nothingLine = "" line = "+user@localhost:8080/xnat=password" lineWithSpaces="+user@localhost:8080/xnat=password " lineWithoutPlus = "user@localhost:8080/xnat=password" lineWithoutUser = "+@localhost:8080/xnat=password" lineWithoutHost = "+user=password" lineWithoutPass = "+user@localhost:8080/xnat" assert(xpass.parse_xnat_pass([nothingLine,line]) == {'p': 'password', 'host': 'localhost:8080/xnat', 'u': 'user'}) assert(xpass.parse_xnat_pass([lineWithSpaces]) == {'p': 'password', 'host': 'localhost:8080/xnat', 'u': 'user'}) assert(xpass.parse_xnat_pass([lineWithoutPlus]) == None) assert(xpass.parse_xnat_pass([lineWithoutUser]) == None) assert(xpass.parse_xnat_pass([lineWithoutHost]) == None) assert(xpass.parse_xnat_pass([lineWithoutPass]) == None) pyxnat-0.9.0~dev0/setup.cfg000066400000000000000000000011031163242155400156370ustar00rootroot00000000000000[aliases] release = egg_info -RDb '' # Make sure the sphinx docs are built each time we do a dist. bdist = build_sphinx bdist sdist = build_sphinx sdist # Make sure a zip file is created each time we build the sphinx docs build_sphinx = generate_help build_sphinx zip_help # Make sure the docs are uploaded when we do an upload upload = upload upload_help [egg_info] # tag_build = .dev [bdist_rpm] doc-files = doc [nosetests] verbosity = 2 detailed-errors = 1 with-coverage = 0 cover-package = pyxnat # pdb = 1 # pdb-failures = 1 # with-doctest = 0 # doctest-extension = rst pyxnat-0.9.0~dev0/setup.py000066400000000000000000000036341163242155400155430ustar00rootroot00000000000000#!/usr/bin/env python from distutils.core import setup import sys import pyxnat # For some commands, use setuptools if len(set(('develop', 'sdist', 'release', 'bdist_egg', 'bdist_rpm', 'bdist', 'bdist_dumb', 'bdist_wininst', 'install_egg_info', 'build_sphinx', 'egg_info', 'easy_install', 'upload', )).intersection(sys.argv)) > 0: from setupegg import extra_setuptools_args # extra_setuptools_args is injected by the setupegg.py script, for # running the setup with setuptools. if not 'extra_setuptools_args' in globals(): extra_setuptools_args = dict() setup(name='pyxnat', version=pyxnat.__version__, summary='XNAT in Python', author='Yannick Schwartz', author_email='yannick.schwartz@cea.fr', url='http://packages.python.org/pyxnat/', packages = ['pyxnat'], package_data={'pyxnat':['externals/*.py', 'externals/httplib2/*.py', 'externals/simplejson/*.py', 'tests/*.py', 'tests/*.txt', 'tests/*.csv', 'core/*.py', '*.py' ], }, description="""Xnat in Python""", long_description=pyxnat.__doc__, license='BSD', classifiers=[ 'Development Status :: 4 - Beta', 'Environment :: Console', 'Intended Audience :: Developers', 'Intended Audience :: Science/Research', 'Intended Audience :: Education', 'License :: OSI Approved :: BSD License', 'Operating System :: OS Independent', 'Programming Language :: Python', 'Topic :: Scientific/Engineering', 'Topic :: Utilities', 'Topic :: Internet :: WWW/HTTP', ], platforms='any', **extra_setuptools_args) pyxnat-0.9.0~dev0/setupegg.py000077500000000000000000000061111163242155400162220ustar00rootroot00000000000000#!/usr/bin/env python """Wrapper to run setup.py using setuptools.""" import zipfile import os import sys from setuptools import Command from sphinx_pypi_upload import UploadDoc ################################################################################ # Code to copy the sphinx-generated html docs in the distribution. DOC_BUILD_DIR = os.path.join('build', 'sphinx', 'html') def relative_path(filename): """ Return the relative path to the file, assuming the file is in the DOC_BUILD_DIR directory. """ length = len(os.path.abspath(DOC_BUILD_DIR)) + 1 return os.path.abspath(filename)[length:] class ZipHelp(Command): description = \ """zip the help created by the build_sphinx, and put it in the source distribution. """ user_options = [ ('None', None, 'this command has no options'), ] def run(self): if not os.path.exists(DOC_BUILD_DIR): raise OSError, 'Doc directory does not exist.' target_file = os.path.join('doc', 'documentation.zip') # ZIP_DEFLATED actually compresses the archive. However, there # will be a RuntimeError if zlib is not installed, so we check # for it. ZIP_STORED produces an uncompressed zip, but does not # require zlib. try: zf = zipfile.ZipFile(target_file, 'w', compression=zipfile.ZIP_DEFLATED) except RuntimeError: zf = zipfile.ZipFile(target_file, 'w', compression=zipfile.ZIP_STORED) for root, dirs, files in os.walk(DOC_BUILD_DIR): relative = relative_path(root) if not relative.startswith('.doctrees'): for f in files: zf.write(os.path.join(root, f), os.path.join(relative, f)) zf.close() def initialize_options(self): pass def finalize_options(self): pass class GenerateHelp(Command): description = " Generate the autosummary files " user_options = [ ('None', None, 'this command has no options'), ] def run(self): os.system('%s doc/sphinxext/autosummary_generate.py -o doc/generated/ doc/*.rst' % sys.executable) def initialize_options(self): pass def finalize_options(self): pass ################################################################################ # Call the setup.py script, injecting the setuptools-specific arguments. extra_setuptools_args = dict( tests_require=['nose', 'coverage'], test_suite='nose.collector', cmdclass={'zip_help':ZipHelp, 'generate_help':GenerateHelp, 'upload_help': UploadDoc}, zip_safe=False, ) if __name__ == '__main__': execfile('setup.py', dict(__name__='__main__', extra_setuptools_args=extra_setuptools_args)) pyxnat-0.9.0~dev0/sphinx_pypi_upload.py000066400000000000000000000111731163242155400203160ustar00rootroot00000000000000# -*- coding: utf-8 -*- """ sphinx_pypi_upload ~~~~~~~~~~~~~~~~~~ setuptools command for uploading Sphinx documentation to PyPI :author: Jannis Leidel :contact: jannis@leidel.info :copyright: Copyright 2009, Jannis Leidel. :license: BSD, see LICENSE for details. """ import os import socket import httplib import base64 import urlparse import tempfile import cStringIO as StringIO from distutils import log from distutils.command.upload import upload class UploadDoc(upload): """Distutils command to upload Sphinx documentation.""" description = 'Upload Sphinx documentation to PyPI' user_options = [ ('repository=', 'r', "url of repository [default: %s]" % upload.DEFAULT_REPOSITORY), ('show-response', None, 'display full response text from server'), ('upload-file=', None, 'file to upload'), ] boolean_options = upload.boolean_options def initialize_options(self): upload.initialize_options(self) self.upload_file = None def finalize_options(self): upload.finalize_options(self) if self.upload_file is None: self.upload_file = 'doc/documentation.zip' self.announce('Using upload file %s' % self.upload_file) def upload(self, filename): content = open(filename,'rb').read() meta = self.distribution.metadata data = { ':action': 'doc_upload', 'name': meta.get_name(), 'content': (os.path.basename(filename),content), } # set up the authentication auth = "Basic " + base64.encodestring(self.username + ":" + self.password).strip() # Build up the MIME payload for the POST data boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254' sep_boundary = '\n--' + boundary end_boundary = sep_boundary + '--' body = StringIO.StringIO() for key, value in data.items(): # handle multiple entries for the same name if type(value) != type([]): value = [value] for value in value: if type(value) is tuple: fn = ';filename="%s"' % value[0] value = value[1] else: fn = "" value = str(value) body.write(sep_boundary) body.write('\nContent-Disposition: form-data; name="%s"'%key) body.write(fn) body.write("\n\n") body.write(value) if value and value[-1] == '\r': body.write('\n') # write an extra newline (lurve Macs) body.write(end_boundary) body.write("\n") body = body.getvalue() self.announce("Submitting documentation to %s" % (self.repository), log.INFO) # build the Request # We can't use urllib2 since we need to send the Basic # auth right with the first request schema, netloc, url, params, query, fragments = \ urlparse.urlparse(self.repository) assert not params and not query and not fragments if schema == 'http': http = httplib.HTTPConnection(netloc) elif schema == 'https': http = httplib.HTTPSConnection(netloc) else: raise AssertionError, "unsupported schema "+schema data = '' loglevel = log.INFO try: http.connect() http.putrequest("POST", url) http.putheader('Content-type', 'multipart/form-data; boundary=%s'%boundary) http.putheader('Content-length', str(len(body))) http.putheader('Authorization', auth) http.endheaders() http.send(body) except socket.error, e: self.announce(str(e), log.ERROR) return response = http.getresponse() if response.status == 200: self.announce('Server response (%s): %s' % (response.status, response.reason), log.INFO) elif response.status == 301: location = response.getheader('Location') if location is None: location = 'http://packages.python.org/%s/' % meta.get_name() self.announce('Upload successful. Visit %s' % location, log.INFO) else: self.announce('Upload failed (%s): %s' % (response.status, response.reason), log.ERROR) if self.show_response: print '-'*75, response.read(), '-'*75 def run(self): zip_file = self.upload_file self.upload(zip_file)