class OpenTox::QMRFReport

Class for QMRF reporting.

Provides a ruby OpenTox class to prepare an initial version of a QMRF report. The XML output is in QMRF version 1.3 and can be finalized with the QMRF editor 2.0 (sourceforge.net/projects/qmrf/)

@example Report

require "qsar-report"
report = OpenTox::QMRFReport.new
report.value "QSAR_title", "My QSAR Title"
report.change_attributes "training_set_data", {:inchi => "Yes", :smiles => "Yes"}
report.change_catalog :publications_catalog, :publications_catalog_1, {:title => "MyName M (2016) My Publication Title, QSAR News, 10, 14-22", :url => "http://myqsarnewsmag.dom"}
report.ref_catalog :bibliography, :publications_catalog, :publications_catalog_1
puts report.to_xml

Constants

ATTRIBUTE_TAGS

QMRF XML tags with attributes to edit

CATALOGS

QMRF catalogs. Entries of a catalog can be referenced in certain tags.

SCHEMA_FILE

QMRF XML Schema file

TEMPLATE_FILE

QMRF XML Template file

Attributes

report[RW]
xml[RW]

Public Class Methods

new() click to toggle source

Initialize a new report instance from qmrf template

# File lib/qmrf-report.rb, line 39
def initialize
  xml = File.read(TEMPLATE_FILE)
  @report = Nokogiri.XML(xml)
end

Public Instance Methods

catalog_exists?(catalog) click to toggle source

Check if a catalog exists in this QMRF version @param [String] catalog Catalog @return [Error, true] returns true or Error if a catalog do not exists. See also {OpenTox::QMRFReport::CATALOGS CATALOGS}.

# File lib/qmrf-report.rb, line 144
def catalog_exists? catalog
  raise "Unknown catalog: #{catalog}" unless CATALOGS.include? catalog.to_s
  true
end
change_attributes(tagname, valuehash) click to toggle source
Set attributes of an report XML tag.
Some of the QMRF XML tags have attributes to be edited. This applies to 6.1 to 6.4 and 7.1 to 7.4 see also: {OpenTox::QMRFReport::ATTRIBUTE_TAGS ATTRIBUTE_TAGS}.   
e.G. "Available information for the training set" at 6.2 of the report: 
 <training_set_data cas="Yes" chapter="6.2" chemname="Yes" formula="Yes" help="" inchi="Yes" mol="Yes" name="Available information for the training set" smiles="Yes"/>

@example change_attributes

 report.change_attributes "training_set_data", {:inchi => "Yes", :smiles => "Yes"}
@param [String] tagname Nodename e.g.: "training_set_data"
@param [Hash] valuehash Key-Value Hash of tag attributes to change.
@return [Error]  returns Error message if fails
# File lib/qmrf-report.rb, line 76
def change_attributes tagname, valuehash
  raise "Can not edit the attributes of tag: #{tagname}." unless ATTRIBUTE_TAGS.include? tagname
  tag = @report.at_css tagname
  valuehash.each do |key, value|
    tag.attributes["#{key}"].value = value
  end
end
change_catalog(catalog, id, valuehash) click to toggle source

Change a catalog @param [String] catalog Name of the catalog - One of {OpenTox::QMRFReport::CATALOGS CATALOGS}. @param [String] id Single entry node in the catalog e.G.: “<software contact='mycontact@mydomain.dom' description=”My QSAR Software “ id=”software_catalog_2“ name=”MySoftware“ number=”“ url=”mydomain.dom“/> @param [Hash] valuehash Key-Value Hash with attributes for a single catalog node @return [Error] returns Error message if fails

# File lib/qmrf-report.rb, line 89
def change_catalog catalog, id, valuehash
  catalog_exists? catalog
  if @report.at_css("#{catalog}").at("[@id='#{id}']")
    valuehash.each do |key, value|
      @report.at_css("#{catalog}").at("[@id='#{id}']")["#{key}"]= value
    end
  else
    cat = @report.at_css("#{catalog}")
    newentry = Nokogiri::XML::Node.new("#{catalog.to_s.gsub(/s?_catalog/,'')}", self.report)
    newentry["id"] = id
    valuehash.each do |key, value|
      newentry["#{key}"] = value
    end
    cat << newentry
  end
end
get_catalog_value(catalog, id, key) click to toggle source

get an attribute from a catalog entry @param [String] catalog Name of the catalog. One of {OpenTox::QMRFReport::CATALOGS CATALOGS}. @param [String] id entry id in the catalog @param [String] key returns value of a key in a catalog node @return [String, false] returns value of a key in a catalog node or false if catalog entry do not exists.

# File lib/qmrf-report.rb, line 132
def get_catalog_value catalog, id, key
  catalog_exists? catalog
  if @report.at_css("#{catalog}").at("[@id='#{id}']")
    @report.at_css("#{catalog}").at("[@id='#{id}']")["#{key}"]
  else
    return false
  end
end
open(file) click to toggle source

Open an existing QMRF xml report @param [String] file Name of the file

# File lib/qmrf-report.rb, line 33
def open file
  xml = File.read("#{file}")
  @report = Nokogiri.XML(xml)
end
ref_catalog(chapter, catalog, id) click to toggle source
Set reference to a catalog entry.
e.g.: reference an author entry from authors_catalog to Chapter 2.2 QMRF authors

@example ref_catalog

 report.ref_catalog 'qmrf_authors', 'authors_catalog', 'firstauthor'
@param [String] chapter Name of the chapter to add the catalog reference. e.g.: qmrf_authors, model_authors, QSAR_software, ...
@param [String] catalog Name of the catalog. One of {OpenTox::QMRFReport::CATALOGS CATALOGS}.
@param [String] id entry node in the catalog
# File lib/qmrf-report.rb, line 113
def ref_catalog chapter, catalog, id
  catalog_exists? catalog
  if @report.at_css("#{catalog}").at("//*[@id='#{id}']")
    chap = @report.at_css("#{chapter}")
    if chap.at("[@idref='#{id}']").nil?
      newentry = Nokogiri::XML::Node.new("#{catalog.to_s.gsub(/s?_catalog/,'_ref')}", self.report)
      newentry["idref"] = id
      chap << newentry
    end
  else
    raise "catalog entry with id: #{id} do not exist."      
  end
end
to_xml() click to toggle source

returns XML representation (QMRF XML report) of report instance @return [String] returns XML

# File lib/qmrf-report.rb, line 46
def to_xml
  @report.to_xml
end
validate() click to toggle source

Validates a report instance against qmrf.xsd (XML Structure Definition)

# File lib/qmrf-report.rb, line 150
def validate
  xsd = Nokogiri::XML::Schema(File.read(SCHEMA_FILE))
  out = ""
  xsd.validate(@report).each do |error|
    out << error.message unless error.message == "Element 'algorithm', attribute 'publication_ref': '' is not a valid value of the atomic type 'xs:IDREF'." || error.message == "Element 'descriptor', attribute 'publication_ref': '' is not a valid value of the atomic type 'xs:IDREF'." 
    # @todo ignore case sensitivity error: error.message The value 'NO' is not an.Element of the set {'Yes', 'No'}.
  end
  return out
end
value(key, value=nil) click to toggle source
Get or Set a value
e.G.:

@example change the title

 report.value "QSAR_title", "Title of My QSAR"
 #changes the QSAR_title tag to:
 #<QSAR_title chapter="1.1" help="" name="QSAR identifier (title)">Title of My QSAR</QSAR_title>
@param [String] key Nodename e.g.: "QSAR_title"
@param [String] value Value to change. If not set the function returns the current value
@return [Error]  returns Error message if fails
@return [String] returns value
# File lib/qmrf-report.rb, line 60
def value key, value=nil
  raise "Can not edit attribute #{key} directly. Edit the catalog with 'report.change_catalog(catalog, key, value)'." if ["QSAR_software","QSAR_Algorithm", ""].include? key
  t = @report.at_css key
  t.content = value unless value.nil?
  t.content
end