diff --git a/.yardoc/checksums b/.yardoc/checksums
new file mode 100644
index 0000000..1e48c8a
--- /dev/null
+++ b/.yardoc/checksums
@@ -0,0 +1,3 @@
+lib/classyfire_api.rb ed7783c1c688d4ee2a91044082a5ac80c3cd3c3e
+lib/query_resource.rb 645cfb1688a5c44e67e5227fc0e9a77589731f24
+lib/entity_resource.rb 6c50b4be6a5eb13b44d7080b19c7033b7a37c7cf
diff --git a/.yardoc/object_types b/.yardoc/object_types
new file mode 100644
index 0000000..8cb81af
Binary files /dev/null and b/.yardoc/object_types differ
diff --git a/.yardoc/objects/root.dat b/.yardoc/objects/root.dat
new file mode 100644
index 0000000..fc0d560
Binary files /dev/null and b/.yardoc/objects/root.dat differ
diff --git a/.yardoc/proxy_types b/.yardoc/proxy_types
new file mode 100644
index 0000000..beefda1
Binary files /dev/null and b/.yardoc/proxy_types differ
diff --git a/Gemfile b/Gemfile
new file mode 100644
index 0000000..e212456
--- /dev/null
+++ b/Gemfile
@@ -0,0 +1,4 @@
+source "https://rubygems.org"
+
+gem 'rest-client'
+gem 'yard'
\ No newline at end of file
diff --git a/Gemfile.lock b/Gemfile.lock
new file mode 100644
index 0000000..f77ad1b
--- /dev/null
+++ b/Gemfile.lock
@@ -0,0 +1,27 @@
+GEM
+ remote: https://rubygems.org/
+ specs:
+ domain_name (0.5.20160309)
+ unf (>= 0.0.5, < 1.0.0)
+ http-cookie (1.0.2)
+ domain_name (~> 0.5)
+ mime-types (2.99.1)
+ netrc (0.11.0)
+ rest-client (1.8.0)
+ http-cookie (>= 1.0.2, < 2.0)
+ mime-types (>= 1.16, < 3.0)
+ netrc (~> 0.7)
+ unf (0.1.4)
+ unf_ext
+ unf_ext (0.0.7.2)
+ yard (0.8.7.6)
+
+PLATFORMS
+ ruby
+
+DEPENDENCIES
+ rest-client
+ yard
+
+BUNDLED WITH
+ 1.11.2
diff --git a/README.md b/README.md
index 0879518..528fd7e 100644
--- a/README.md
+++ b/README.md
@@ -29,11 +29,17 @@
> >
> >###GET###
> >
-> >**/entities/{entity_inchikey}**
+> >**/entities/{entityInchikey}**
> >
> >A chemical compound's classification can be retrieved in the JSON or XML format. The compound's information is accessed via the InChIkey as show in the following examples. In this example, the entity has the InChIKey=LABTWGUMFABVFG-ONEGZZNKSA-N.
> > >
-> > >curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://classyfire.wishartlab.com/entities/BDAGIHXWWSANSR-UHFFFAOYSA-N.json
+> > >ClassyFireAPI.get_entity_classification("BDAGIHXWWSANSR-UHFFFAOYSA-N","json")
+> >
+> > Where:
+> >
+> > >The entity's InChIKey is "BDAGIHXWWSANSR-UHFFFAOYSA-N",
+> > >
+> > >The output format is "json" (JSON).
> ##2. Query##
@@ -41,29 +47,33 @@
> >The Query model represents the chemical structure to be classified. Its attributes are the query label and the query input.
> > >The query label is an identifier
> > >
-> > > The query input contains the compound's identifier (optional) and its structural representation, separated by a comma. The chemical structure is represented either in the [Daylight SMILES](http://www.daylight.com/dayhtml/doc/theory/theory.smiles.html) or the [InChI](http://www.iupac.org/home/publications/e-resources/inchi.html) format.
+> > >The query input contains the compound's identifier (optional) and its structural representation, separated by a comma. The chemical structure is represented either in the [Daylight SMILES](http://www.daylight.com/dayhtml/doc/theory/theory.smiles.html) or the [InChI](http://www.iupac.org/home/publications/e-resources/inchi.html) format.
> >
> >###POST###
> >A query can be submitted using the POST method as demonstrated in the following example.
-> > >curl -is http://localhost:3000/queries.json -X POST -d '{"label":"curl_test","query_input":"MOL1,CCCOCC\nMOL2,COCC=CCCC"}' -H "Content-Type: application/json"
+> > >ClassyFireAPI.submit_query("curl_test","MOL1\\tCCCOCC\\nMOL2\\tCOCC=CCCC","STRUCTURE")
> >
> >where the parameters are:
> >
> > >The query label: curl_test,
> > >
-> > >The entity identifiers: ID1,ID2
+> > >The entity identifiers: MOL1,MOL2
> >
> > >The entity's structure represented in the SMILES format: CCCOCC and COCC=CCCC.
> >
+> > >The query is of type 'STRUCTURE'
+
> >###GET###
> >
-> >**/queries/{query_id}**
+> >**/queries/{queryId}**
> >
> >The classification results can be retrieved via a GET method in the JSON or XML format.
> > >
-> > >curl -H "Accept: application/json" -H "Content-Type: application/json" -X GET http://classyfire.wishartlab.com/queries/88.json
+> > >ClassyFireAPI.get_query(443431,"json")
> >
-> >where the query id is 88.
+> >where:
+> > >The query id is 443431,
+> > >The output format is "json" (JSON)
# **Directory Structure** #
diff --git a/contributors.txt b/contributors.txt
index 21b18b9..b92ddc3 100644
--- a/contributors.txt
+++ b/contributors.txt
@@ -1 +1 @@
-djoumbou
+Yannick Djoumbou Feunang
diff --git a/doc/ClassyFireAPI.html b/doc/ClassyFireAPI.html
new file mode 100644
index 0000000..6a7c99c
--- /dev/null
+++ b/doc/ClassyFireAPI.html
@@ -0,0 +1,1928 @@
+
+
+
+
+
+ Module: ClassyFireAPI
+
+ — Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Module: ClassyFireAPI
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Defined in:
+ lib/classyfire_api.rb
+
+
+
+
+
+
Constant Summary
+
+
+
+ URL =
+
+
+ ' http://classyfire.wishartlab.com '
+
+
+
+
+
+
+
+
+
+
+
+
+ Class Method Summary
+ (collapse )
+
+
+
+
+
+
+
+ + (Text) get_entity_classification (inchikey, format = "json")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Retrieves the classification results for a given entity.
+
+
+
+
+
+
+
+
+ + (Text) get_query (query_id, format = "json")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Retrieves the classification results for a given query.
+
+
+
+
+
+
+
+
+ + (String) query_status (query_id)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Retrieves the status of a query.
+
+
+
+
+
+
+
+
+ + (String) retrieve_classification (input, output)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Reads a tab separated file, and use the structure representation to
+retrieve the strutcure's classification from ClassyFire.
+
+
+
+
+
+
+
+
+ + (String) retrieve_entities_json (input, output)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Reads a tab separated file, and use the structure representation to
+retrieve the strutcure's classification from ClassyFire in a JSON
+format.
+
+
+
+
+
+
+
+
+ + (String) retrieve_entities_sdf (input, output)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Reads a tab separated file, and use the structure representation to
+retrieve the strutcure's classification from ClassyFire in a SDF
+format.
+
+
+
+
+
+
+
+
+ + (Object) submit_queries_from_directory (folder, slice_length, type = "STRUCTURE")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Takes each file in a folder, and submit the contained structures in bluks
+of a given size.
+
+
+
+
+
+
+
+
+ + (Hash) submit_query (label, input, type = 'STRUCTURE')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Submits a ClassyFire query, which should be returned in a specific format.
+
+
+
+
+
+
+
+
+ + (Object) submit_query_input_in_chunks (input_file, slice_length, start, type = 'STRUCTURE')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Takes a tab-separated file and submit the contained structures in bulks of
+a given size.
+
+
+
+
+
+
+
+
+ + (Object) submit_random_subset_of_query_input_in_chunks (tab_separated_input_file, size, type = 'STRUCTURE')
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Takes a tab-separated file and submit randomly selected structures in bulks
+of a given size.
+
+
+
+
+
+
+
+
+
+
+
+
Class Method Details
+
+
+
+
+
+ + (Text ) get_entity_classification (inchikey, format = "json")
+
+
+
+
+
+
+
+
+
Retrieves the classification results for a given entity.
+
+
+
+
+
+
+
+
+
+
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+
+
+ # File 'lib/classyfire_api.rb', line 61
+
+def ClassyFireAPI . get_entity_classification ( inchikey , format = " json " )
+ inchikey_id = inchikey . to_s . gsub ( ' InChIKey= ' , ' ' )
+ begin
+ if format == " json "
+ RestClient . get " #{ URL } /entities/ #{ inchikey_id } . #{ format } " , :accept => :json
+ elsif format == " sdf "
+ RestClient . get " #{ URL } /entities/ #{ inchikey_id } . #{ format } " , :accept => :sdf
+ elsif format == " csv "
+ RestClient . get " #{ URL } /entities/ #{ inchikey_id } . #{ format } " , :accept => :csv
+ end
+ rescue RestClient :: ResourceNotFound => e
+ e . response
+ rescue RestClient :: InternalServerError => e
+ e . response
+ rescue RestClient :: GatewayTimeout => e
+ e . response
+ rescue RestClient :: RequestTimeout => e
+ e . response
+ end
+end
+
+
+
+
+
+
+
+
+ + (Text ) get_query (query_id, format = "json")
+
+
+
+
+
+
+
+
+
Retrieves the classification results for a given query.
+
+
the query's entities in the specified format.
+
+
+
+
+
+
+
+
+
+
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+
+
+ # File 'lib/classyfire_api.rb', line 36
+
+def ClassyFireAPI . get_query ( query_id , format = " json " )
+ begin
+ if format == " json "
+ RestClient . get " #{ URL } /queries/ #{ query_id } .json " , :accept => :json
+ elsif format == " sdf "
+ RestClient . get " #{ URL } /queries/ #{ query_id } .sdf " , :accept => :sdf
+ elsif format == " csv "
+ RestClient . get " #{ URL } /queries/ #{ query_id } .csv " , :accept => :csv
+ end
+ rescue RestClient :: ResourceNotFound => e
+ e . response
+ rescue RestClient :: InternalServerError => e
+ e . response
+ rescue RestClient :: GatewayTimeout => e
+ e . response
+ rescue RestClient :: RequestTimeout => e
+ e . response
+ end
+end
+
+
+
+
+
+
+
+
+ + (String ) query_status (query_id)
+
+
+
+
+
+
+
+
+
Retrieves the status of a query
+
+
+
+
+
+
+
+
+
+
+85
+86
+87
+88
+89
+90
+91
+92
+
+
+ # File 'lib/classyfire_api.rb', line 85
+
+def ClassyFireAPI . query_status ( query_id )
+ begin
+ RestClient . get " #{ URL } /queries/ #{ query_id } /status.json " , :accept => :json
+ rescue Exception => e
+ $stderr . puts e . message
+ nil
+ end
+end
+
+
+
+
+
+
+
+
+ + (String ) retrieve_classification (input, output)
+
+
+
+
+
+
+
+
+
Reads a tab separated file, and use the structure representation to
+retrieve the strutcure's classification from ClassyFire.
+
+
+
+
+
+
+
+
+
+
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+
+
+ # File 'lib/classyfire_api.rb', line 266
+
+def ClassyFireAPI . retrieve_classification ( input , output )
+ absolute_path = File . expand_path ( input )
+ f_input = File . open ( absolute_path , ' r ' )
+ h = Hash . new
+ directory = absolute_path . split ( ' / ' ) [ 0 ... - 1 ] . join ( " / " )
+ f_output = File . new ( output , ' w ' )
+ res = String . new
+
+
+ res += " { "
+ res += ' "id": 1, '
+ res += ' "label":" ' + output + ' ", ' + ' "classification_status":"Done", ' + ' "entities":[ '
+
+ f_input . each_line do | line |
+ sline = line . strip . split ( " \t " )
+ if sline . length == 1
+ h [ sline [ 0 ] ] = sline [ 0 ]
+ elsif sline . length == 2
+ h [ sline [ 0 ] ] = line . strip
+ end
+ end
+
+ puts h . keys . uniq . length
+ if h . keys . length > 0
+ i = 1
+ h . keys . uniq [ 0 .. - 1 ] . each do | key |
+ puts i
+
+ puts " #{ key } :: #{ h [ key ] } "
+ begin
+ qs = submit_query ( key , h [ key ] )
+
+ qs_decoded = JSON . parse ( qs )
+ qr = JSON . parse ( get_query ( qs_decoded [ " id " ] , format = " json " ) )
+
+ res += qr [ " entities " ] [ 0 ] . to_json
+ res += " , "
+ i += 1
+ rescue Exception => e
+ e . message
+ end
+
+ end
+ key = h . keys [ - 1 ]
+ puts " #{ key } :: #{ h [ key ] } "
+ begin
+ qs = submit_query ( key , h [ key ] )
+ sleep ( 0.2 )
+ qs_decoded = JSON . parse ( qs )
+ qr = JSON . parse ( get_query ( qs_decoded [ " id " ] , format = " json " ) )
+ res += qr [ " entities " ] [ 0 ] . to_json
+ rescue Exception => e
+ e . message
+ end
+ end
+
+ res += " ]} "
+ f_output . print res
+end
+
+
+
+
+
+
+
+
+ + (String ) retrieve_entities_json (input, output)
+
+
+
+
+
+
+
+
+
Reads a tab separated file, and use the structure representation to
+retrieve the strutcure's classification from ClassyFire in a JSON
+format.
+
+
+
+
+
+
+
+
+
+
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+
+
+ # File 'lib/classyfire_api.rb', line 335
+
+def ClassyFireAPI . retrieve_entities_json ( input , output )
+ absolute_path = File . expand_path ( input )
+ f_input = File . open ( absolute_path , ' r ' )
+ h = Hash . new
+ directory = absolute_path . split ( ' / ' ) [ 0 ... - 1 ] . join ( " / " )
+ f_output = File . new ( output , ' w ' )
+ puts
+ res = String . new
+
+ res += " { "
+ res += ' "id": 1, '
+ res += ' "label":" ' + output + ' ", ' + ' "classification_status":"Done", ' + ' "entities":[ '
+
+ f_input . each_line do | line |
+ sline = line . strip . split ( " \t " )
+ h [ sline [ 0 ] ] = sline [ - 1 ]
+ end
+
+ puts h . keys . uniq . length
+ if h . keys . length > 0
+ i = 1
+ h . keys . uniq [ 0 ... - 1 ] . each do | key |
+ puts i
+ begin
+ inchikey = %x( /Applications/ChemAxon/JChem/bin/molconvert inchikey -s " #{ h [ key ] } " ) . strip
+ qr = JSON . parse ( ClassyFireAPI . get_entity_classification ( inchikey , format = " json " ) )
+ qr [ ' identifier ' ] = key
+ res += qr . to_json
+ res += " , "
+ puts " #{ key } :: RETURN NIL " if qr . nil? || qr [ ' direct_parent ' ] [ ' name ' ] . nil?
+ rescue Exception => e
+ e . message
+ end
+ i += 1
+ end
+ key = h . keys [ - 1 ]
+ begin
+ inchikey = %x( /Applications/ChemAxon/JChem/bin/molconvert inchikey -s " #{ h [ key ] } " ) . strip
+ qr = JSON . parse ( ClassyFireAPI . get_entity_classification ( inchikey , format = " json " ) )
+ qr [ ' identifier ' ] = key
+ res += qr . to_json
+ puts " #{ key } :: RETURN NIL " if qr . nil? || qr [ ' direct_parent ' ] [ ' name ' ] . nil?
+ rescue Exception => e
+ e . message
+ end
+ end
+ res += " ]} "
+ f_output . print res
+end
+
+
+
+
+
+
+
+
+ + (String ) retrieve_entities_sdf (input, output)
+
+
+
+
+
+
+
+
+
Reads a tab separated file, and use the structure representation to
+retrieve the strutcure's classification from ClassyFire in a SDF
+format.
+
+
+
+
+
+
+
+
+
+
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+
+
+ # File 'lib/classyfire_api.rb', line 397
+
+def ClassyFireAPI . retrieve_entities_sdf ( input , output )
+ absolute_path = File . expand_path ( input )
+ f_input = File . open ( absolute_path , ' r ' )
+ h = Hash . new
+ directory = absolute_path . split ( ' / ' ) [ 0 ... - 1 ] . join ( " / " )
+ f_output = File . new ( output , ' w ' )
+ res = String . new
+
+ f_input . each_line do | line |
+ sline = line . strip . split ( " \t " )
+ h [ sline [ 0 ] ] = sline [ - 1 ]
+ end
+
+ puts h . keys . uniq . length
+ if h . keys . length > 0
+ i = 1
+ h . keys . uniq [ 0 ... - 1 ] . each do | key |
+ puts i
+ begin
+ inchikey = %x( /Applications/ChemAxon/JChem/bin/molconvert inchikey -s " #{ h [ key ] } " ) . strip
+ qr = ClassyFireAPI . get_entity_classification ( inchikey , format = " sdf " )
+ if qr . include? ( " The page you were looking for doesn't exist " )
+ puts " The page you were looking for doesn't exist "
+ elsif qr . empty?
+
+ else
+ input = qr . split ( " \n " ) [ 1 .. - 1 ] . join ( " \n " )
+ puts input
+ f_output . puts " #{ key } \n "
+ f_output . puts input
+ end
+ rescue Exception => e
+ e . message
+ end
+ i += 1
+ end
+ key = h . keys [ - 1 ]
+ begin
+ inchikey = %x( /Applications/ChemAxon/JChem/bin/molconvert inchikey -s " #{ h [ key ] } " ) . strip
+ qr = ClassyFireAPI . get_entity_classification ( inchikey , format = " sdf " )
+ if qr . include? ( " The page you were looking for doesn't exist " )
+ puts " The page you were looking for doesn't exist "
+ elsif qr . empty?
+
+ else
+ input = qr . split ( " \n " ) [ 1 .. - 1 ] . join ( " \n " )
+ puts input
+ f_output . puts " #{ key } \n "
+ f_output . puts input
+ end
+ rescue Exception => e
+ e . message
+ end
+ end
+ end
+
+
+
+
+
+
+
+
+ + (Object ) submit_queries_from_directory (folder, slice_length, type = "STRUCTURE")
+
+
+
+
+
+
+
+
+
Takes each file in a folder, and submit the contained structures in bluks
+of a given size.
+
+
For 'STRUCTURE' or 'IUPAC_NAME'query types, each line must
+contain either
+
+
1) Only a structural represenation: SMILES, InChI for the 'STRUCTURE' query_type or a IUPAC name
+ for the 'IUPAC NAME' query type.
+2) a tab-separated pair of an ID and the corresponding sructure representation: SMILES, InChI for the
+ 'STRUCTURE' query_type or a IUPAC name for the 'IUPAC NAME' query type.
+
+
For 'FASTA' query type, just submit the query as a standard FASTA
+text. @param: input_file [String] The path to the folder. @param:
+slice_length [Integer] The maximum number of entries for each query input
+(each file is fragmented into n part of #slice_length entries each),
+'integer'
+
+
+
+
+
+
+
+
+
+
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+
+
+ # File 'lib/classyfire_api.rb', line 184
+
+def ClassyFireAPI . submit_queries_from_directory ( folder , slice_length , type = " STRUCTURE " )
+ if File . directory? ( folder )
+ Dir . foreach ( folder ) do | filename |
+ puts " Filename: #{ filename } "
+ ClassyFireAPI . submit_query_input_in_chunks ( folder + " / " + filename , slice_length , type ) unless filename == " . " || filename == " .. " || filename == " .DS_Store "
+ end
+ else
+ $stderr . puts " #{ folder } is not a folder. "
+ end
+end
+
+
+
+
+
+
+
+
+ + (Hash ) submit_query (label, input, type = 'STRUCTURE')
+
+
+
+
+
+
+
+
+
Submits a ClassyFire query, which should be returned in a specific format.
+
+
if there is an error.
+
+
+
+
+
+
+
+
+
+
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+
+
+ # File 'lib/classyfire_api.rb', line 13
+
+def ClassyFireAPI . submit_query ( label , input , type = ' STRUCTURE ' )
+ begin
+ q = RestClient . post URL + ' /queries ' , { :label => label , :query_input => input , :query_type => type } . to_json , :accept => :json , :content_type => :json
+ rescue RestClient :: BadRequest => e
+ e . response
+ rescue RestClient :: InternalServerError => e
+ e . response
+ rescue RestClient :: GatewayTimeout => e
+ e . response
+ rescue RestClient :: RequestTimeout => e
+ e . response
+ rescue RestClient :: UnprocessableEntity => e
+ e . response
+ end
+ q
+end
+
+
+
+
+
+
+
+
+
+
Takes a tab-separated file and submit the contained structures in bulks of
+a given size
+
+
For 'STRUCTURE' or 'IUPAC_NAME'query types, each line must
+contain either
+
+
1) Only a structural represenation: SMILES, InChI for the 'STRUCTURE' query_type or a IUPAC name
+ for the 'IUPAC NAME' query type.
+2) a tab-separated pair of an ID and the corresponding sructure representation: SMILES, InChI for the
+ 'STRUCTURE' query_type or a IUPAC name for the 'IUPAC NAME' query type.
+
+
For 'FASTA' query type, just submit the query as a standard FASTA
+text. @param: slice_length [Integer] The maximum number of entries for each
+query input (the whole file is fragmented into n part of #slice_length
+entries each). @param: start [Integer] The starting index. Submit
+framgments from the index 'start'.
+
+
+
+
+
+
+
+
+
+
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+
+
+ # File 'lib/classyfire_api.rb', line 107
+
+def ClassyFireAPI . submit_query_input_in_chunks ( input_file , slice_length , start , type = ' STRUCTURE ' )
+ @start_time = Time . now
+ absolute_path = File . expand_path ( input_file )
+ f = File . open ( absolute_path , ' r ' )
+ input = [ ]
+
+ lines = File . readlines ( absolute_path )
+
+ lines . uniq . each do | line |
+ sline = line . strip . split ( " \t " )
+ if sline . length == 1
+ input << " #{ sline [ 0 ] } "
+ elsif sline . length >= 2
+ input << " #{ sline [ 0 ] } \t #{ sline [ 2 ] } "
+ end
+ end
+
+ query_ids = [ ]
+ subdivised_groups = input . uniq . each_slice ( slice_length ) . to_a
+ puts " nr of subdivised_groups: #{ subdivised_groups . length } "
+ puts subdivised_groups [ 0 ]
+ sleeping_time = 120
+ initial_nr_of_jobs = 60
+ i = start
+
+ while i < initial_nr_of_jobs
+ title = File . basename ( absolute_path ) . split ( " . " ) [ 0 ] + " _yannick " + " _part_ #{ i } "
+
+ begin
+ puts " submitting #{ title } "
+ q = submit_query ( title , subdivised_groups [ i - 1 ] . join ( " \n " ) , type )
+ query_ids << JSON . parse ( q ) [ ' id ' ]
+ rescue Exception => e
+ puts e . message
+ puts e . backtrace . inspect
+ end
+ i = i + 1
+ end
+
+ puts " Going to sleep at #{ Time . now - @start_time } for #{ sleeping_time } s. "
+ sleep ( sleeping_time )
+ puts " Waking up at #{ Time . now - @start_time } "
+
+ while i < subdivised_groups . length
+ k = 0
+ for k in ( i .. ( i + 80 ) )
+ title = File . basename ( absolute_path ) . split ( " . " ) [ 0 ] + " _yannick " + " _part_ #{ k } "
+ i = i + 1
+ begin
+ puts " submitting #{ title } "
+ q = submit_query ( title , subdivised_groups [ k - 1 ] . join ( " \n " ) , type )
+ rescue Exception => e
+ puts e . message
+ puts e . backtrace . inspect
+ end
+
+ end
+ i = k
+ puts " Going to sleep at #{ Time . now - @start_time } for #{ sleeping_time } s. "
+ sleep ( sleeping_time )
+ puts " Waking up at #{ Time . now - @start_time } "
+ end
+end
+
+
+
+
+
+
+
+
+
+
Takes a tab-separated file and submit randomly selected structures in bulks
+of a given size.
+
+
For 'STRUCTURE' or 'IUPAC_NAME'query types, each line must
+contain either
+
+
1) Only a structural represenation: SMILES, InChI for the 'STRUCTURE' query_type or a IUPAC name
+ for the 'IUPAC NAME' query type.
+2) a tab-separated pair of an ID and the corresponding sructure representation: SMILES, InChI for the
+ 'STRUCTURE' query_type or a IUPAC name for the 'IUPAC NAME' query type.
+
+
For 'FASTA' query type, just submit the query as a standard FASTA
+text. is fragmented into n part of #slice_length entries each).
+
+
+
+
+
+
+
+
+
+
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+
+
+ # File 'lib/classyfire_api.rb', line 209
+
+def ClassyFireAPI . submit_random_subset_of_query_input_in_chunks ( tab_separated_input_file , size , type = ' STRUCTURE ' )
+ @start_time = Time . now
+ absolute_path = File . expand_path ( tab_separated_input_file )
+ f = File . open ( absolute_path , ' r ' )
+ input = [ ]
+
+ f . each_line do | line |
+
+ sline = line . strip . split ( " \t " )
+ if sline . length == 1
+ input << " #{ sline [ 0 ] } "
+ elsif sline . length == 2
+ input << " #{ sline [ 0 ] } \t #{ sline [ 1 ] } "
+ end
+ end
+
+ query_ids = [ ]
+ indexes = [ ]
+ r = 1
+ while r <= ( size )
+ s = rand ( 0 .. ( input . length - 1 ) )
+ unless indexes . include? ( s )
+ indexes << s
+ r += 1
+ end
+ end
+
+ random_subset = indexes . map { | x | input [ x ] }
+ subdivised_groups = random_subset . each_slice ( 100 ) . to_a
+ sleeping_time = 120
+
+ i = 0
+ while i < subdivised_groups . length
+ k = 0
+ for k in ( i .. ( i + 5 ) )
+ title = File . basename ( absolute_path ) . split ( " . " ) [ 0 ] + " _yannick " + " _part_ #{ k + 1 } "
+ i = i + 1
+ begin
+ puts " submitting #{ title } "
+ q = submit_query ( title , subdivised_groups [ k ] . join ( " \n " ) , type )
+ rescue Exception => e
+ puts e . message
+ puts e . backtrace . inspect
+ end
+ end
+ i = k
+ puts " Going to sleep at #{ Time . now - @start_time } for #{ sleeping_time } s. "
+ sleep ( sleeping_time )
+ puts " Waking up at #{ Time . now - @start_time } "
+ end
+end
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/EntityResource.html b/doc/EntityResource.html
new file mode 100644
index 0000000..5fe5906
--- /dev/null
+++ b/doc/EntityResource.html
@@ -0,0 +1,123 @@
+
+
+
+
+
+ Class: EntityResource
+
+ — Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class: EntityResource
+
+
+
+
+
+
+
+ Inherits:
+
+ ActiveResource::Base
+
+
+ Object
+
+ ActiveResource::Base
+
+ EntityResource
+
+
+ show all
+
+
+
+
+
+
+
+
+
+
+
+ Defined in:
+ lib/entity_resource.rb
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/QueryResource.html b/doc/QueryResource.html
new file mode 100644
index 0000000..2611f26
--- /dev/null
+++ b/doc/QueryResource.html
@@ -0,0 +1,192 @@
+
+
+
+
+
+ Class: QueryResource
+
+ — Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class: QueryResource
+
+
+
+
+
+
+
+ Inherits:
+
+ ActiveResource::Base
+
+
+ Object
+
+ ActiveResource::Base
+
+ QueryResource
+
+
+ show all
+
+
+
+
+
+
+
+
+
+
+
+ Defined in:
+ lib/query_resource.rb
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Instance Method Summary
+ (collapse )
+
+
+
+
+
+
+
+
+
+
Instance Method Details
+
+
+
+
+
+ - (Object ) to_param
+
+
+
+
+
+
+
+
+
+
+
+7
+8
+9
+
+
+ # File 'lib/query_resource.rb', line 7
+
+def to_param
+ self . identifier
+end
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/_index.html b/doc/_index.html
new file mode 100644
index 0000000..f8f7858
--- /dev/null
+++ b/doc/_index.html
@@ -0,0 +1,136 @@
+
+
+
+
+
+ Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Documentation by YARD 0.8.7.6
+
+
Alphabetic Index
+
+
File Listing
+
+
+
+
Namespace Listing A-Z
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/class_list.html b/doc/class_list.html
new file mode 100644
index 0000000..2a62e5e
--- /dev/null
+++ b/doc/class_list.html
@@ -0,0 +1,58 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Class List
+
+
+
+
+
+
+
diff --git a/doc/css/common.css b/doc/css/common.css
new file mode 100644
index 0000000..cf25c45
--- /dev/null
+++ b/doc/css/common.css
@@ -0,0 +1 @@
+/* Override this file with custom rules */
\ No newline at end of file
diff --git a/doc/css/full_list.css b/doc/css/full_list.css
new file mode 100644
index 0000000..c918cf1
--- /dev/null
+++ b/doc/css/full_list.css
@@ -0,0 +1,57 @@
+body {
+ margin: 0;
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-size: 13px;
+ height: 101%;
+ overflow-x: hidden;
+}
+
+h1 { padding: 12px 10px; padding-bottom: 0; margin: 0; font-size: 1.4em; }
+.clear { clear: both; }
+#search { position: absolute; right: 5px; top: 9px; padding-left: 24px; }
+#content.insearch #search, #content.insearch #noresults { background: url(data:image/gif;base64,R0lGODlhEAAQAPYAAP///wAAAPr6+pKSkoiIiO7u7sjIyNjY2J6engAAAI6OjsbGxjIyMlJSUuzs7KamppSUlPLy8oKCghwcHLKysqSkpJqamvT09Pj4+KioqM7OzkRERAwMDGBgYN7e3ujo6Ly8vCoqKjY2NkZGRtTU1MTExDw8PE5OTj4+PkhISNDQ0MrKylpaWrS0tOrq6nBwcKysrLi4uLq6ul5eXlxcXGJiYoaGhuDg4H5+fvz8/KKiohgYGCwsLFZWVgQEBFBQUMzMzDg4OFhYWBoaGvDw8NbW1pycnOLi4ubm5kBAQKqqqiQkJCAgIK6urnJyckpKSjQ0NGpqatLS0sDAwCYmJnx8fEJCQlRUVAoKCggICLCwsOTk5ExMTPb29ra2tmZmZmhoaNzc3KCgoBISEiIiIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/hpDcmVhdGVkIHdpdGggYWpheGxvYWQuaW5mbwAh+QQJCAAAACwAAAAAEAAQAAAHaIAAgoMgIiYlg4kACxIaACEJCSiKggYMCRselwkpghGJBJEcFgsjJyoAGBmfggcNEx0flBiKDhQFlIoCCA+5lAORFb4AJIihCRbDxQAFChAXw9HSqb60iREZ1omqrIPdJCTe0SWI09GBACH5BAkIAAAALAAAAAAQABAAAAdrgACCgwc0NTeDiYozCQkvOTo9GTmDKy8aFy+NOBA7CTswgywJDTIuEjYFIY0JNYMtKTEFiRU8Pjwygy4ws4owPyCKwsMAJSTEgiQlgsbIAMrO0dKDGMTViREZ14kYGRGK38nHguHEJcvTyIEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDAggPg4iJAAMJCRUAJRIqiRGCBI0WQEEJJkWDERkYAAUKEBc4Po1GiKKJHkJDNEeKig4URLS0ICImJZAkuQAhjSi/wQyNKcGDCyMnk8u5rYrTgqDVghgZlYjcACTA1sslvtHRgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCQARAtOUoQRGRiFD0kJUYWZhUhKT1OLhR8wBaaFBzQ1NwAlkIszCQkvsbOHL7Y4q4IuEjaqq0ZQD5+GEEsJTDCMmIUhtgk1lo6QFUwJVDKLiYJNUd6/hoEAIfkECQgAAAAsAAAAABAAEAAAB2iAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4uen4ICCA+IkIsDCQkVACWmhwSpFqAABQoQF6ALTkWFnYMrVlhWvIKTlSAiJiVVPqlGhJkhqShHV1lCW4cMqSkAR1ofiwsjJyqGgQAh+QQJCAAAACwAAAAAEAAQAAAHZ4AAgoOEhYaCJSWHgxGDJCSMhREZGIYYGY2ElYebi56fhyWQniSKAKKfpaCLFlAPhl0gXYNGEwkhGYREUywag1wJwSkHNDU3D0kJYIMZQwk8MjPBLx9eXwuETVEyAC/BOKsuEjYFhoEAIfkECQgAAAAsAAAAABAAEAAAB2eAAIKDhIWGgiUlh4MRgyQkjIURGRiGGBmNhJWHm4ueICImip6CIQkJKJ4kigynKaqKCyMnKqSEK05StgAGQRxPYZaENqccFgIID4KXmQBhXFkzDgOnFYLNgltaSAAEpxa7BQoQF4aBACH5BAkIAAAALAAAAAAQABAAAAdogACCg4SFggJiPUqCJSWGgkZjCUwZACQkgxGEXAmdT4UYGZqCGWQ+IjKGGIUwPzGPhAc0NTewhDOdL7Ykji+dOLuOLhI2BbaFETICx4MlQitdqoUsCQ2vhKGjglNfU0SWmILaj43M5oEAOwAAAAAAAAAAAA==) no-repeat center left; }
+#full_list { padding: 0; list-style: none; margin-left: 0; }
+#full_list ul { padding: 0; }
+#full_list li { padding: 5px; padding-left: 12px; margin: 0; font-size: 1.1em; list-style: none; }
+#noresults { padding: 7px 12px; }
+#content.insearch #noresults { margin-left: 7px; }
+ul.collapsed ul, ul.collapsed li { display: none; }
+ul.collapsed.search_uncollapsed { display: block; }
+ul.collapsed.search_uncollapsed li { display: list-item; }
+li a.toggle { cursor: default; position: relative; left: -5px; top: 4px; text-indent: -999px; width: 10px; height: 9px; margin-left: -10px; display: block; float: left; background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAK8AAACvABQqw0mAAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTM5jWRgMAAAAVdEVYdENyZWF0aW9uIFRpbWUAMy8xNC8wOeNZPpQAAAE2SURBVDiNrZTBccIwEEXfelIAHUA6CZ24BGaWO+FuzZAK4k6gg5QAdGAq+Bxs2Yqx7BzyL7Llp/VfzZeQhCTc/ezuGzKKnKSzpCxXJM8fwNXda3df5RZETlIt6YUzSQDs93sl8w3wBZxCCE10GM1OcWbWjB2mWgEH4Mfdyxm3PSepBHibgQE2wLe7r4HjEidpnXMYdQPKEMJcsZ4zs2POYQOcaPfwMVOo58zsAdMt18BuoVDPxUJRacELbXv3hUIX2vYmOUvi8C8ydz/ThjXrqKqqLbDIAdsCKBd+Wo7GWa7o9qzOQHVVVXeAbs+yHHCH4aTsaCOQqunmUy1yBUAXkdMIfMlgF5EXLo2OpV/c/Up7jG4hhHcYLgWzAZXUc2b2ixsfvc/RmNNfOXD3Q/oeL9axJE1yT9IOoUu6MGUkAAAAAElFTkSuQmCC) no-repeat bottom left; }
+li.collapsed a.toggle { opacity: 0.5; cursor: default; background-position: top left; }
+li { color: #888; cursor: pointer; }
+li.deprecated { text-decoration: line-through; font-style: italic; }
+li.r1 { background: #f0f0f0; }
+li.r2 { background: #fafafa; }
+li:hover { background: #ddd; }
+li small:before { content: "("; }
+li small:after { content: ")"; }
+li small.search_info { display: none; }
+a:link, a:visited { text-decoration: none; color: #05a; }
+li.clicked { background: #05a; color: #ccc; }
+li.clicked a:link, li.clicked a:visited { color: #eee; }
+li.clicked a.toggle { opacity: 0.5; background-position: bottom right; }
+li.collapsed.clicked a.toggle { background-position: top right; }
+#search input { border: 1px solid #bbb; -moz-border-radius: 3px; -webkit-border-radius: 3px; }
+#nav { margin-left: 10px; font-size: 0.9em; display: none; color: #aaa; }
+#nav a:link, #nav a:visited { color: #358; }
+#nav a:hover { background: transparent; color: #5af; }
+.frames #nav span:after { content: ' | '; }
+.frames #nav span:last-child:after { content: ''; }
+
+.frames #content h1 { margin-top: 0; }
+.frames li { white-space: nowrap; cursor: normal; }
+.frames li small { display: block; font-size: 0.8em; }
+.frames li small:before { content: ""; }
+.frames li small:after { content: ""; }
+.frames li small.search_info { display: none; }
+.frames #search { width: 170px; position: static; margin: 3px; margin-left: 10px; font-size: 0.9em; color: #888; padding-left: 0; padding-right: 24px; }
+.frames #content.insearch #search { background-position: center right; }
+.frames #search input { width: 110px; }
+.frames #nav { display: block; }
+
+#full_list.insearch li { display: none; }
+#full_list.insearch li.found { display: list-item; padding-left: 10px; }
+#full_list.insearch li a.toggle { display: none; }
+#full_list.insearch li small.search_info { display: block; }
diff --git a/doc/css/style.css b/doc/css/style.css
new file mode 100644
index 0000000..96307c5
--- /dev/null
+++ b/doc/css/style.css
@@ -0,0 +1,339 @@
+body {
+ padding: 0 20px;
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-size: 13px;
+}
+body.frames { padding: 0 5px; }
+h1 { font-size: 25px; margin: 1em 0 0.5em; padding-top: 4px; border-top: 1px dotted #d5d5d5; }
+h1.noborder { border-top: 0px; margin-top: 0; padding-top: 4px; }
+h1.title { margin-bottom: 10px; }
+h1.alphaindex { margin-top: 0; font-size: 22px; }
+h2 {
+ padding: 0;
+ padding-bottom: 3px;
+ border-bottom: 1px #aaa solid;
+ font-size: 1.4em;
+ margin: 1.8em 0 0.5em;
+}
+h2 small { font-weight: normal; font-size: 0.7em; display: block; float: right; }
+.clear { clear: both; }
+.inline { display: inline; }
+.inline p:first-child { display: inline; }
+.docstring h1, .docstring h2, .docstring h3, .docstring h4 { padding: 0; border: 0; border-bottom: 1px dotted #bbb; }
+.docstring h1 { font-size: 1.2em; }
+.docstring h2 { font-size: 1.1em; }
+.docstring h3, .docstring h4 { font-size: 1em; border-bottom: 0; padding-top: 10px; }
+.summary_desc .object_link, .docstring .object_link { font-family: monospace; }
+.rdoc-term { padding-right: 25px; font-weight: bold; }
+.rdoc-list p { margin: 0; padding: 0; margin-bottom: 4px; }
+
+/* style for */
+#filecontents table, .docstring table { border-collapse: collapse; }
+#filecontents table th, #filecontents table td,
+.docstring table th, .docstring table td { border: 1px solid #ccc; padding: 8px; padding-right: 17px; }
+#filecontents table tr:nth-child(odd),
+.docstring table tr:nth-child(odd) { background: #eee; }
+#filecontents table tr:nth-child(even),
+.docstring table tr:nth-child(even) { background: #fff; }
+#filecontents table th, .docstring table th { background: #fff; }
+
+/* style for */
+#filecontents li > p, .docstring li > p { margin: 0px; }
+#filecontents ul, .docstring ul { padding-left: 20px; }
+/* style for */
+#filecontents dl, .docstring dl { border: 1px solid #ccc; }
+#filecontents dt, .docstring dt { background: #ddd; font-weight: bold; padding: 3px 5px; }
+#filecontents dd, .docstring dd { padding: 5px 0px; margin-left: 18px; }
+#filecontents dd > p, .docstring dd > p { margin: 0px; }
+
+.note {
+ color: #222;
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
+ background: #e3e4e3; border: 1px solid #d5d5d5; padding: 7px 10px;
+ display: block;
+}
+.note.todo { background: #ffffc5; border-color: #ececaa; }
+.note.returns_void { background: #efefef; }
+.note.deprecated { background: #ffe5e5; border-color: #e9dada; }
+.note.private { background: #ffffc5; border-color: #ececaa; }
+.note.title { padding: 1px 5px; font-size: 0.9em; font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif; display: inline; }
+.summary_signature + .note.title { margin-left: 7px; }
+h1 .note.title { font-size: 0.5em; font-weight: normal; padding: 3px 5px; position: relative; top: -3px; text-transform: capitalize; }
+.note.title.constructor { color: #fff; background: #6a98d6; border-color: #6689d6; }
+.note.title.writeonly { color: #fff; background: #45a638; border-color: #2da31d; }
+.note.title.readonly { color: #fff; background: #6a98d6; border-color: #6689d6; }
+.note.title.private { background: #d5d5d5; border-color: #c5c5c5; }
+.note.title.not_defined_here { background: transparent; border: none; font-style: italic; }
+.discussion .note { margin-top: 6px; }
+.discussion .note:first-child { margin-top: 0; }
+
+h3.inherited {
+ font-style: italic;
+ font-family: "Lucida Sans", "Lucida Grande", Verdana, Arial, sans-serif;
+ font-weight: normal;
+ padding: 0;
+ margin: 0;
+ margin-top: 12px;
+ margin-bottom: 3px;
+ font-size: 13px;
+}
+p.inherited {
+ padding: 0;
+ margin: 0;
+ margin-left: 25px;
+}
+
+#filecontents dl.box, dl.box {
+ border: 0;
+ width: 520px;
+ font-size: 1em;
+}
+#filecontents dl.box dt, dl.box dt {
+ float: left;
+ display: block;
+ width: 100px;
+ margin: 0;
+ text-align: right;
+ font-weight: bold;
+ background: transparent;
+ border: 1px solid #aaa;
+ border-width: 1px 0px 0px 1px;
+ padding: 6px 0;
+ padding-right: 10px;
+}
+#filecontents dl.box dd, dl.box dd {
+ float: left;
+ display: block;
+ width: 380px;
+ margin: 0;
+ padding: 6px 0;
+ padding-right: 20px;
+ border: 1px solid #aaa;
+ border-width: 1px 1px 0 0;
+}
+#filecontents dl.box .last, dl.box .last {
+ border-bottom: 1px solid #aaa;
+}
+#filecontents dl.box .r1, dl.box .r1 { background: #eee; }
+
+ul.toplevel { list-style: none; padding-left: 0; font-size: 1.1em; }
+.index_inline_list { padding-left: 0; font-size: 1.1em; }
+.index_inline_list li { list-style: none; display: inline; padding: 7px 12px; line-height: 35px; }
+
+dl.constants { margin-left: 40px; }
+dl.constants dt { font-weight: bold; font-size: 1.1em; margin-bottom: 5px; }
+dl.constants dd { width: 75%; white-space: pre; font-family: monospace; margin-bottom: 18px; }
+
+.summary_desc { margin-left: 32px; display: block; font-family: sans-serif; }
+.summary_desc tt { font-size: 0.9em; }
+dl.constants .note { padding: 2px 6px; padding-right: 12px; margin-top: 6px; }
+dl.constants .docstring { margin-left: 32px; font-size: 0.9em; font-weight: normal; }
+dl.constants .tags { padding-left: 32px; font-size: 0.9em; line-height: 0.8em; }
+dl.constants .discussion *:first-child { margin-top: 0; }
+dl.constants .discussion *:last-child { margin-bottom: 0; }
+
+.method_details { border-top: 1px dotted #aaa; margin-top: 15px; padding-top: 0; }
+.method_details.first { border: 0; }
+p.signature, h3.signature {
+ font-size: 1.1em; font-weight: normal; font-family: Monaco, Consolas, Courier, monospace;
+ padding: 6px 10px; margin-top: 18px;
+ background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
+}
+p.signature tt,
+h3.signature tt { font-family: Monaco, Consolas, Courier, monospace; }
+p.signature .overload,
+h3.signature .overload { display: block; }
+p.signature .extras,
+h3.signature .extras { font-weight: normal; font-family: sans-serif; color: #444; font-size: 1em; }
+p.signature .not_defined_here,
+h3.signature .not_defined_here,
+p.signature .aliases,
+h3.signature .aliases { display: block; font-weight: normal; font-size: 0.9em; font-family: sans-serif; margin-top: 0px; color: #555; }
+p.signature .aliases .names,
+h3.signature .aliases .names { font-family: Monaco, Consolas, Courier, monospace; font-weight: bold; color: #000; font-size: 1.2em; }
+
+.tags .tag_title { font-size: 1em; margin-bottom: 0; font-weight: bold; }
+.tags ul { margin-top: 5px; padding-left: 30px; list-style: square; }
+.tags ul li { margin-bottom: 3px; }
+.tags ul .name { font-family: monospace; font-weight: bold; }
+.tags ul .note { padding: 3px 6px; }
+.tags { margin-bottom: 12px; }
+
+.tags .examples .tag_title { margin-bottom: 10px; font-weight: bold; }
+.tags .examples .inline p { padding: 0; margin: 0; margin-left: 15px; font-weight: bold; font-size: 0.9em; }
+
+.tags .overload .overload_item { list-style: none; margin-bottom: 25px; }
+.tags .overload .overload_item .signature {
+ padding: 2px 8px;
+ background: #e5e8ff; border: 1px solid #d8d8e5; -moz-border-radius: 3px; -webkit-border-radius: 3px;
+}
+.tags .overload .signature { margin-left: -15px; font-family: monospace; display: block; font-size: 1.1em; }
+.tags .overload .docstring { margin-top: 15px; }
+
+.defines { display: none; }
+
+#method_missing_details .notice.this { position: relative; top: -8px; color: #888; padding: 0; margin: 0; }
+
+.showSource { font-size: 0.9em; }
+.showSource a:link, .showSource a:visited { text-decoration: none; color: #666; }
+
+#content a:link, #content a:visited { text-decoration: none; color: #05a; }
+#content a:hover { background: #ffffa5; }
+div.docstring, p.docstring { margin-right: 6em; }
+
+ul.summary {
+ list-style: none;
+ font-family: monospace;
+ font-size: 1em;
+ line-height: 1.5em;
+}
+ul.summary a:link, ul.summary a:visited {
+ text-decoration: none; font-size: 1.1em;
+}
+ul.summary li { margin-bottom: 5px; }
+.summary .summary_signature {
+ padding: 1px 10px;
+ background: #eaeaff; border: 1px solid #dfdfe5;
+ -moz-border-radius: 3px; -webkit-border-radius: 3px;
+}
+.summary_signature:hover { background: #eeeeff; cursor: pointer; }
+ul.summary.compact li { display: inline-block; margin: 0px 5px 0px 0px; line-height: 2.6em;}
+ul.summary.compact .summary_signature { padding: 5px 7px; padding-right: 4px; }
+#content .summary_signature:hover a:link,
+#content .summary_signature:hover a:visited {
+ background: transparent;
+ color: #48f;
+}
+
+p.inherited a { font-family: monospace; font-size: 0.9em; }
+p.inherited { word-spacing: 5px; font-size: 1.2em; }
+
+p.children { font-size: 1.2em; }
+p.children a { font-size: 0.9em; }
+p.children strong { font-size: 0.8em; }
+p.children strong.modules { padding-left: 5px; }
+
+ul.fullTree { display: none; padding-left: 0; list-style: none; margin-left: 0; margin-bottom: 10px; }
+ul.fullTree ul { margin-left: 0; padding-left: 0; list-style: none; }
+ul.fullTree li { text-align: center; padding-top: 18px; padding-bottom: 12px; background: url(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAACXBIWXMAAAsTAAALEwEAmpwYAAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAAHtJREFUeNqMzrEJAkEURdGzuhgZbSoYWcAWoBVsB4JgZAGmphsZCZYzTQgWNCYrDN9RvMmHx+X916SUBFbo8CzD1idXrLErw1mQttgXtyrOcQ/Ny5p4Qh+2XqLYYazsPWNTiuMkRxa4vcV+evuNAUOLIx5+c2hyzv7hNQC67Q+/HHmlEwAAAABJRU5ErkJggg==) no-repeat top center; }
+ul.fullTree li:first-child { padding-top: 0; background: transparent; }
+ul.fullTree li:last-child { padding-bottom: 0; }
+.showAll ul.fullTree { display: block; }
+.showAll .inheritName { display: none; }
+
+#search { position: absolute; right: 14px; top: 0px; }
+#search a:link, #search a:visited {
+ display: block; float: left; margin-right: 4px;
+ padding: 8px 10px; text-decoration: none; color: #05a;
+ border: 1px solid #d8d8e5;
+ -moz-border-radius-bottomleft: 3px; -moz-border-radius-bottomright: 3px;
+ -webkit-border-bottom-left-radius: 3px; -webkit-border-bottom-right-radius: 3px;
+ background: #eaf0ff;
+ -webkit-box-shadow: -1px 1px 3px #ddd;
+}
+#search a:hover { background: #f5faff; color: #06b; }
+#search a.active {
+ background: #568; padding-bottom: 20px; color: #fff; border: 1px solid #457;
+ -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px;
+ -webkit-border-top-left-radius: 5px; -webkit-border-top-right-radius: 5px;
+}
+#search a.inactive { color: #999; }
+.frames #search { display: none; }
+.inheritanceTree, .toggleDefines { float: right; }
+
+#menu { font-size: 1.3em; color: #bbb; top: -5px; position: relative; }
+#menu .title, #menu a { font-size: 0.7em; }
+#menu .title a { font-size: 1em; }
+#menu .title { color: #555; }
+#menu a:link, #menu a:visited { color: #333; text-decoration: none; border-bottom: 1px dotted #bbd; }
+#menu a:hover { color: #05a; }
+#menu .noframes { display: inline; }
+.frames #menu .noframes { display: inline; float: right; }
+
+#footer { margin-top: 15px; border-top: 1px solid #ccc; text-align: center; padding: 7px 0; color: #999; }
+#footer a:link, #footer a:visited { color: #444; text-decoration: none; border-bottom: 1px dotted #bbd; }
+#footer a:hover { color: #05a; }
+
+#listing ul.alpha { font-size: 1.1em; }
+#listing ul.alpha { margin: 0; padding: 0; padding-bottom: 10px; list-style: none; }
+#listing ul.alpha li.letter { font-size: 1.4em; padding-bottom: 10px; }
+#listing ul.alpha ul { margin: 0; padding-left: 15px; }
+#listing ul small { color: #666; font-size: 0.7em; }
+
+li.r1 { background: #f0f0f0; }
+li.r2 { background: #fafafa; }
+
+#search_frame {
+ z-index: 9999;
+ background: #fff;
+ display: none;
+ position: absolute;
+ top: 36px;
+ right: 18px;
+ width: 500px;
+ height: 80%;
+ overflow-y: scroll;
+ border: 1px solid #999;
+ border-collapse: collapse;
+ -webkit-box-shadow: -7px 5px 25px #aaa;
+ -moz-box-shadow: -7px 5px 25px #aaa;
+ -moz-border-radius: 2px;
+ -webkit-border-radius: 2px;
+}
+
+#content ul.summary li.deprecated .summary_signature a:link,
+#content ul.summary li.deprecated .summary_signature a:visited { text-decoration: line-through; font-style: italic; }
+
+#toc {
+ padding: 20px; padding-right: 30px; border: 1px solid #ddd; float: right; background: #fff; margin-left: 20px; margin-bottom: 20px;
+ max-width: 300px;
+ -webkit-box-shadow: -2px 2px 6px #bbb;
+ -moz-box-shadow: -2px 2px 6px #bbb;
+ z-index: 5000;
+ position: relative;
+ overflow-x: auto;
+}
+#toc.nofloat { float: none; max-width: none; border: none; padding: 0; margin: 20px 0; -webkit-box-shadow: none; -moz-box-shadow: none; }
+#toc.nofloat.hidden { padding: 0; background: 0; margin-bottom: 5px; }
+#toc .title { margin: 0; }
+#toc ol { padding-left: 1.8em; }
+#toc li { font-size: 1.1em; line-height: 1.7em; }
+#toc > ol > li { font-size: 1.1em; font-weight: bold; }
+#toc ol > ol { font-size: 0.9em; }
+#toc ol ol > ol { padding-left: 2.3em; }
+#toc ol + li { margin-top: 0.3em; }
+#toc.hidden { padding: 10px; background: #f6f6f6; -webkit-box-shadow: none; -moz-box-shadow: none; }
+#filecontents h1 + #toc.nofloat { margin-top: 0; }
+
+/* syntax highlighting */
+.source_code { display: none; padding: 3px 8px; border-left: 8px solid #ddd; margin-top: 5px; }
+#filecontents pre.code, .docstring pre.code, .source_code pre { font-family: monospace; }
+#filecontents pre.code, .docstring pre.code { display: block; }
+.source_code .lines { padding-right: 12px; color: #555; text-align: right; }
+#filecontents pre.code, .docstring pre.code,
+.tags pre.example { padding: 5px 12px; margin-top: 4px; border: 1px solid #eef; background: #f5f5ff; }
+pre.code { color: #000; }
+pre.code .info.file { color: #555; }
+pre.code .val { color: #036A07; }
+pre.code .tstring_content,
+pre.code .heredoc_beg, pre.code .heredoc_end,
+pre.code .qwords_beg, pre.code .qwords_end,
+pre.code .tstring, pre.code .dstring { color: #036A07; }
+pre.code .fid, pre.code .rubyid_new, pre.code .rubyid_to_s,
+pre.code .rubyid_to_sym, pre.code .rubyid_to_f,
+pre.code .dot + pre.code .id,
+pre.code .rubyid_to_i pre.code .rubyid_each { color: #0085FF; }
+pre.code .comment { color: #0066FF; }
+pre.code .const, pre.code .constant { color: #585CF6; }
+pre.code .label,
+pre.code .symbol { color: #C5060B; }
+pre.code .kw,
+pre.code .rubyid_require,
+pre.code .rubyid_extend,
+pre.code .rubyid_include { color: #0000FF; }
+pre.code .ivar { color: #318495; }
+pre.code .gvar,
+pre.code .rubyid_backref,
+pre.code .rubyid_nth_ref { color: #6D79DE; }
+pre.code .regexp, .dregexp { color: #036A07; }
+pre.code a { border-bottom: 1px dotted #bbf; }
diff --git a/doc/file.README.html b/doc/file.README.html
new file mode 100644
index 0000000..0deac3a
--- /dev/null
+++ b/doc/file.README.html
@@ -0,0 +1,213 @@
+
+
+
+
+
+ File: README
+
+ — Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ClassyFire is a resource
+that allows you to automatically classify any chemical compound based on
+its structure. This is the repository for the ClassyFire API allows you to
+send requests to and pull information from the ClassyFire web server.
+
+
What is this repository for?
+
+
+
How do I get set up?
+
+Summary of set up
+
+Configuration
+
+Dependencies
+
+Database configuration
+
+How to run tests
+
+Deployment instructions
+
+
+
Contribution guidelines
+
+Writing tests
+
+Code review
+
+Other guidelines
+
+
+
Endpoints
+
+
+1. Entity
+
+
+Chemical compounds are represented by the Entity model, through which one
+can access the compound's structure-based classification.
+
+GET
+
+/entities/entityInchikey
+
+A chemical compound's classification can be retrieved in the JSON or
+XML format. The compound's information is accessed via the InChIkey as
+show in the following examples. In this example, the entity has the
+InChIKey=LABTWGUMFABVFG-ONEGZZNKSA-N.
+
+
+ClassyFireAPI.get_entity_classification(“BDAGIHXWWSANSR-UHFFFAOYSA-N”,“json”)
+
+
+Where:
+
+
+The entity's InChIKey is “BDAGIHXWWSANSR-UHFFFAOYSA-N”,
+
+The output format is “json” (JSON).
+
+
+
+2. Query
+
+
+The Query model represents the chemical structure to be classified. Its
+attributes are the query label and the query input.
+
+
+The query label is an identifier
+
+The query input contains the compound's identifier (optional) and its
+structural representation, separated by a comma. The chemical structure is
+represented either in the Daylight
+SMILES or the InChI
+format.
+
+
+POST
+
+A query can be submitted using the POST method as demonstrated in the
+following example.
+
+
+ClassyFireAPI.submit_query(“curl_test”,“MOL1tCCCOCCnMOL2tCOCC=CCCC”,“STRUCTURE”)
+
+
+where the parameters are:
+
+
+The query label: curl_test,
+
+The entity identifiers: MOL1,MOL2
+
+The entity's structure represented in the SMILES format: CCCOCC and
+COCC=CCCC.
+
+The query is of type 'STRUCTURE'
+
+
+GET
+
+/queries/queryId
+
+The classification results can be retrieved via a GET method in the JSON or
+XML format.
+
+
+ClassyFireAPI.get_query(443431,“json”)
+
+
+where:
+
+
+The query id is 443431, The output format is “json” (JSON)
+
+
+
+
+
Directory Structure
+
+
+
Who do I talk to?
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/file_list.html b/doc/file_list.html
new file mode 100644
index 0000000..6bf67e5
--- /dev/null
+++ b/doc/file_list.html
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ File List
+
+
+
+
+
+
+
diff --git a/doc/frames.html b/doc/frames.html
new file mode 100644
index 0000000..87a4a6d
--- /dev/null
+++ b/doc/frames.html
@@ -0,0 +1,26 @@
+
+
+
+
+
+ Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..30215ef
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,213 @@
+
+
+
+
+
+ File: README
+
+ — Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ClassyFire is a resource
+that allows you to automatically classify any chemical compound based on
+its structure. This is the repository for the ClassyFire API allows you to
+send requests to and pull information from the ClassyFire web server.
+
+
What is this repository for?
+
+
+
How do I get set up?
+
+Summary of set up
+
+Configuration
+
+Dependencies
+
+Database configuration
+
+How to run tests
+
+Deployment instructions
+
+
+
Contribution guidelines
+
+Writing tests
+
+Code review
+
+Other guidelines
+
+
+
Endpoints
+
+
+1. Entity
+
+
+Chemical compounds are represented by the Entity model, through which one
+can access the compound's structure-based classification.
+
+GET
+
+/entities/entityInchikey
+
+A chemical compound's classification can be retrieved in the JSON or
+XML format. The compound's information is accessed via the InChIkey as
+show in the following examples. In this example, the entity has the
+InChIKey=LABTWGUMFABVFG-ONEGZZNKSA-N.
+
+
+ClassyFireAPI.get_entity_classification(“BDAGIHXWWSANSR-UHFFFAOYSA-N”,“json”)
+
+
+Where:
+
+
+The entity's InChIKey is “BDAGIHXWWSANSR-UHFFFAOYSA-N”,
+
+The output format is “json” (JSON).
+
+
+
+2. Query
+
+
+The Query model represents the chemical structure to be classified. Its
+attributes are the query label and the query input.
+
+
+The query label is an identifier
+
+The query input contains the compound's identifier (optional) and its
+structural representation, separated by a comma. The chemical structure is
+represented either in the Daylight
+SMILES or the InChI
+format.
+
+
+POST
+
+A query can be submitted using the POST method as demonstrated in the
+following example.
+
+
+ClassyFireAPI.submit_query(“curl_test”,“MOL1tCCCOCCnMOL2tCOCC=CCCC”,“STRUCTURE”)
+
+
+where the parameters are:
+
+
+The query label: curl_test,
+
+The entity identifiers: MOL1,MOL2
+
+The entity's structure represented in the SMILES format: CCCOCC and
+COCC=CCCC.
+
+The query is of type 'STRUCTURE'
+
+
+GET
+
+/queries/queryId
+
+The classification results can be retrieved via a GET method in the JSON or
+XML format.
+
+
+ClassyFireAPI.get_query(443431,“json”)
+
+
+where:
+
+
+The query id is 443431, The output format is “json” (JSON)
+
+
+
+
+
Directory Structure
+
+
+
Who do I talk to?
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/doc/js/app.js b/doc/js/app.js
new file mode 100644
index 0000000..d933ebc
--- /dev/null
+++ b/doc/js/app.js
@@ -0,0 +1,219 @@
+function createSourceLinks() {
+ $('.method_details_list .source_code').
+ before("[View source ] ");
+ $('.toggleSource').toggle(function() {
+ $(this).parent().nextAll('.source_code').slideDown(100);
+ $(this).text("Hide source");
+ },
+ function() {
+ $(this).parent().nextAll('.source_code').slideUp(100);
+ $(this).text("View source");
+ });
+}
+
+function createDefineLinks() {
+ var tHeight = 0;
+ $('.defines').after(" more... ");
+ $('.toggleDefines').toggle(function() {
+ tHeight = $(this).parent().prev().height();
+ $(this).prev().show();
+ $(this).parent().prev().height($(this).parent().height());
+ $(this).text("(less)");
+ },
+ function() {
+ $(this).prev().hide();
+ $(this).parent().prev().height(tHeight);
+ $(this).text("more...");
+ });
+}
+
+function createFullTreeLinks() {
+ var tHeight = 0;
+ $('.inheritanceTree').toggle(function() {
+ tHeight = $(this).parent().prev().height();
+ $(this).parent().toggleClass('showAll');
+ $(this).text("(hide)");
+ $(this).parent().prev().height($(this).parent().height());
+ },
+ function() {
+ $(this).parent().toggleClass('showAll');
+ $(this).parent().prev().height(tHeight);
+ $(this).text("show all");
+ });
+}
+
+function fixBoxInfoHeights() {
+ $('dl.box dd.r1, dl.box dd.r2').each(function() {
+ $(this).prev().height($(this).height());
+ });
+}
+
+function searchFrameLinks() {
+ $('.full_list_link').click(function() {
+ toggleSearchFrame(this, $(this).attr('href'));
+ return false;
+ });
+}
+
+function toggleSearchFrame(id, link) {
+ var frame = $('#search_frame');
+ $('#search a').removeClass('active').addClass('inactive');
+ if (frame.attr('src') == link && frame.css('display') != "none") {
+ frame.slideUp(100);
+ $('#search a').removeClass('active inactive');
+ }
+ else {
+ $(id).addClass('active').removeClass('inactive');
+ frame.attr('src', link).slideDown(100);
+ }
+}
+
+function linkSummaries() {
+ $('.summary_signature').click(function() {
+ document.location = $(this).find('a').attr('href');
+ });
+}
+
+function framesInit() {
+ if (hasFrames) {
+ document.body.className = 'frames';
+ $('#menu .noframes a').attr('href', document.location);
+ try {
+ window.top.document.title = $('html head title').text();
+ } catch(error) {
+ // some browsers will not allow this when serving from file://
+ // but we don't want to stop the world.
+ }
+ }
+ else {
+ $('#menu .noframes a').text('frames').attr('href', framesUrl);
+ }
+}
+
+function keyboardShortcuts() {
+ if (window.top.frames.main) return;
+ $(document).keypress(function(evt) {
+ if (evt.altKey || evt.ctrlKey || evt.metaKey || evt.shiftKey) return;
+ if (typeof evt.target !== "undefined" &&
+ (evt.target.nodeName == "INPUT" ||
+ evt.target.nodeName == "TEXTAREA")) return;
+ switch (evt.charCode) {
+ case 67: case 99: $('#class_list_link').click(); break; // 'c'
+ case 77: case 109: $('#method_list_link').click(); break; // 'm'
+ case 70: case 102: $('#file_list_link').click(); break; // 'f'
+ default: break;
+ }
+ });
+}
+
+function summaryToggle() {
+ $('.summary_toggle').click(function() {
+ if (localStorage) {
+ localStorage.summaryCollapsed = $(this).text();
+ }
+ $('.summary_toggle').each(function() {
+ $(this).text($(this).text() == "collapse" ? "expand" : "collapse");
+ var next = $(this).parent().parent().nextAll('ul.summary').first();
+ if (next.hasClass('compact')) {
+ next.toggle();
+ next.nextAll('ul.summary').first().toggle();
+ }
+ else if (next.hasClass('summary')) {
+ var list = $('');
+ list.html(next.html());
+ list.find('.summary_desc, .note').remove();
+ list.find('a').each(function() {
+ $(this).html($(this).find('strong').html());
+ $(this).parent().html($(this)[0].outerHTML);
+ });
+ next.before(list);
+ next.toggle();
+ }
+ });
+ return false;
+ });
+ if (localStorage) {
+ if (localStorage.summaryCollapsed == "collapse") {
+ $('.summary_toggle').first().click();
+ }
+ else localStorage.summaryCollapsed = "expand";
+ }
+}
+
+function fixOutsideWorldLinks() {
+ $('a').each(function() {
+ if (window.location.host != this.host) this.target = '_parent';
+ });
+}
+
+function generateTOC() {
+ if ($('#filecontents').length === 0) return;
+ var _toc = $(' ');
+ var show = false;
+ var toc = _toc;
+ var counter = 0;
+ var tags = ['h2', 'h3', 'h4', 'h5', 'h6'];
+ var i;
+ if ($('#filecontents h1').length > 1) tags.unshift('h1');
+ for (i = 0; i < tags.length; i++) { tags[i] = '#filecontents ' + tags[i]; }
+ var lastTag = parseInt(tags[0][1], 10);
+ $(tags.join(', ')).each(function() {
+ if ($(this).parents('.method_details .docstring').length != 0) return;
+ if (this.id == "filecontents") return;
+ show = true;
+ var thisTag = parseInt(this.tagName[1], 10);
+ if (this.id.length === 0) {
+ var proposedId = $(this).attr('toc-id');
+ if (typeof(proposedId) != "undefined") this.id = proposedId;
+ else {
+ var proposedId = $(this).text().replace(/[^a-z0-9-]/ig, '_');
+ if ($('#' + proposedId).length > 0) { proposedId += counter; counter++; }
+ this.id = proposedId;
+ }
+ }
+ if (thisTag > lastTag) {
+ for (i = 0; i < thisTag - lastTag; i++) {
+ var tmp = $(' '); toc.append(tmp); toc = tmp;
+ }
+ }
+ if (thisTag < lastTag) {
+ for (i = 0; i < lastTag - thisTag; i++) toc = toc.parent();
+ }
+ var title = $(this).attr('toc-title');
+ if (typeof(title) == "undefined") title = $(this).text();
+ toc.append(' ' + title + ' ');
+ lastTag = thisTag;
+ });
+ if (!show) return;
+ html = '';
+ $('#content').prepend(html);
+ $('#toc').append(_toc);
+ $('#toc .hide_toc').toggle(function() {
+ $('#toc .top').slideUp('fast');
+ $('#toc').toggleClass('hidden');
+ $('#toc .title small').toggle();
+ }, function() {
+ $('#toc .top').slideDown('fast');
+ $('#toc').toggleClass('hidden');
+ $('#toc .title small').toggle();
+ });
+ $('#toc .float_toc').toggle(function() {
+ $(this).text('float');
+ $('#toc').toggleClass('nofloat');
+ }, function() {
+ $(this).text('left');
+ $('#toc').toggleClass('nofloat');
+ });
+}
+
+$(framesInit);
+$(createSourceLinks);
+$(createDefineLinks);
+$(createFullTreeLinks);
+$(fixBoxInfoHeights);
+$(searchFrameLinks);
+$(linkSummaries);
+$(keyboardShortcuts);
+$(summaryToggle);
+$(fixOutsideWorldLinks);
+$(generateTOC);
diff --git a/doc/js/full_list.js b/doc/js/full_list.js
new file mode 100644
index 0000000..4b10377
--- /dev/null
+++ b/doc/js/full_list.js
@@ -0,0 +1,181 @@
+var inSearch = null;
+var searchIndex = 0;
+var searchCache = [];
+var searchString = '';
+var regexSearchString = '';
+var caseSensitiveMatch = false;
+var ignoreKeyCodeMin = 8;
+var ignoreKeyCodeMax = 46;
+var commandKey = 91;
+
+RegExp.escape = function(text) {
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
+}
+
+function fullListSearch() {
+ // generate cache
+ searchCache = [];
+ $('#full_list li').each(function() {
+ var link = $(this).find('.object_link a');
+ if (link.length === 0) return;
+ var fullName = link.attr('title').split(' ')[0];
+ searchCache.push({name:link.text(), fullName:fullName, node:$(this), link:link});
+ });
+
+ $('#search input').keyup(function(event) {
+ if ((event.keyCode > ignoreKeyCodeMin && event.keyCode < ignoreKeyCodeMax)
+ || event.keyCode == commandKey)
+ return;
+ searchString = this.value;
+ caseSensitiveMatch = searchString.match(/[A-Z]/) != null;
+ regexSearchString = RegExp.escape(searchString);
+ if (caseSensitiveMatch) {
+ regexSearchString += "|" +
+ $.map(searchString.split(''), function(e) { return RegExp.escape(e); }).
+ join('.+?');
+ }
+ if (searchString === "") {
+ clearTimeout(inSearch);
+ inSearch = null;
+ $('ul .search_uncollapsed').removeClass('search_uncollapsed');
+ $('#full_list, #content').removeClass('insearch');
+ $('#full_list li').removeClass('found').each(function() {
+
+ var link = $(this).find('.object_link a');
+ if (link.length > 0) link.text(link.text());
+ });
+ if (clicked) {
+ clicked.parents('ul').each(function() {
+ $(this).removeClass('collapsed').prev().removeClass('collapsed');
+ });
+ }
+ highlight();
+ }
+ else {
+ if (inSearch) clearTimeout(inSearch);
+ searchIndex = 0;
+ lastRowClass = '';
+ $('#full_list, #content').addClass('insearch');
+ $('#noresults').text('');
+ searchItem();
+ }
+ });
+
+ $('#search input').focus();
+ $('#full_list').after("
");
+}
+
+var lastRowClass = '';
+function searchItem() {
+ for (var i = 0; i < searchCache.length / 50; i++) {
+ var item = searchCache[searchIndex];
+ var searchName = (searchString.indexOf('::') != -1 ? item.fullName : item.name);
+ var matchString = regexSearchString;
+ var matchRegexp = new RegExp(matchString, caseSensitiveMatch ? "" : "i");
+ if (searchName.match(matchRegexp) == null) {
+ item.node.removeClass('found');
+ }
+ else {
+ item.node.css('padding-left', '10px').addClass('found');
+ item.node.parents().addClass('search_uncollapsed');
+ item.node.removeClass(lastRowClass).addClass(lastRowClass == 'r1' ? 'r2' : 'r1');
+ lastRowClass = item.node.hasClass('r1') ? 'r1' : 'r2';
+ item.link.html(item.name.replace(matchRegexp, "$& "));
+ }
+
+ if (searchCache.length === searchIndex + 1) {
+ searchDone();
+ return;
+ }
+ else {
+ searchIndex++;
+ }
+ }
+ inSearch = setTimeout('searchItem()', 0);
+}
+
+function searchDone() {
+ highlight(true);
+ if ($('#full_list li:visible').size() === 0) {
+ $('#noresults').text('No results were found.').hide().fadeIn();
+ }
+ else {
+ $('#noresults').text('');
+ }
+ $('#content').removeClass('insearch');
+ clearTimeout(inSearch);
+ inSearch = null;
+}
+
+clicked = null;
+function linkList() {
+ $('#full_list li, #full_list li a:last').click(function(evt) {
+ if ($(this).hasClass('toggle')) return true;
+ if (this.tagName.toLowerCase() == "li") {
+ if ($(this).find('.object_link a').length === 0) {
+ $(this).children('a.toggle').click();
+ return false;
+ }
+ var toggle = $(this).children('a.toggle');
+ if (toggle.size() > 0 && evt.pageX < toggle.offset().left) {
+ toggle.click();
+ return false;
+ }
+ }
+ if (clicked) clicked.removeClass('clicked');
+ var win;
+ try {
+ win = window.top.frames.main ? window.top.frames.main : window.parent;
+ } catch (e) { win = window.parent; }
+ if (this.tagName.toLowerCase() == "a") {
+ clicked = $(this).parents('li').addClass('clicked');
+ win.location = this.href;
+ }
+ else {
+ clicked = $(this).addClass('clicked');
+ win.location = $(this).find('a:last').attr('href');
+ }
+ return false;
+ });
+}
+
+function collapse() {
+ if (!$('#full_list').hasClass('class')) return;
+ $('#full_list.class a.toggle').click(function() {
+ $(this).parent().toggleClass('collapsed').next().toggleClass('collapsed');
+ highlight();
+ return false;
+ });
+ $('#full_list.class ul').each(function() {
+ $(this).addClass('collapsed').prev().addClass('collapsed');
+ });
+ $('#full_list.class').children().removeClass('collapsed');
+ highlight();
+}
+
+function highlight(no_padding) {
+ var n = 1;
+ $('#full_list li:visible').each(function() {
+ var next = n == 1 ? 2 : 1;
+ $(this).removeClass("r" + next).addClass("r" + n);
+ if (!no_padding && $('#full_list').hasClass('class')) {
+ $(this).css('padding-left', (10 + $(this).parents('ul').size() * 15) + 'px');
+ }
+ n = next;
+ });
+}
+
+function escapeShortcut() {
+ $(document).keydown(function(evt) {
+ if (evt.which == 27) {
+ $('#search_frame', window.top.document).slideUp(100);
+ $('#search a', window.top.document).removeClass('active inactive');
+ $(window.top).focus();
+ }
+ });
+}
+
+$(escapeShortcut);
+$(fullListSearch);
+$(linkList);
+$(collapse);
diff --git a/doc/js/jquery.js b/doc/js/jquery.js
new file mode 100644
index 0000000..198b3ff
--- /dev/null
+++ b/doc/js/jquery.js
@@ -0,0 +1,4 @@
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"":"")+""),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;g=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;ca ",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o=""+"",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="
",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&i.push({elem:this,matches:d.slice(e)});for(j=0;j0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c ",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML=" ",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="
";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/",""],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div","
"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>$2>");try{for(var c=0,d=this.length;c1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1>$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]===""&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/
+
+
+
+
+ Method List
+
+
+
+
+
+
+
diff --git a/doc/top-level-namespace.html b/doc/top-level-namespace.html
new file mode 100644
index 0000000..5c5e989
--- /dev/null
+++ b/doc/top-level-namespace.html
@@ -0,0 +1,114 @@
+
+
+
+
+
+ Top Level Namespace
+
+ — Documentation by YARD 0.8.7.6
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Top Level Namespace
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Defined Under Namespace
+
+
+
+ Modules: ClassyFireAPI
+
+
+
+ Classes: EntityResource , QueryResource
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/lib/classyfire_api.rb b/lib/classyfire_api.rb
index 9297b78..82bf645 100644
--- a/lib/classyfire_api.rb
+++ b/lib/classyfire_api.rb
@@ -1,12 +1,18 @@
require 'JSON'
-require 'RestClient'
+require 'csv'
module ClassyFireAPI
URL = 'http://classyfire.wishartlab.com'
- def ClassyFireAPI.submit_query(label,input)
+ # Submits a ClassyFire query, which should be returned in a specific format.
+ #
+ # @param label [String] the label of the query.
+ # @param input[String] the input of the query.
+ # @return [Hash] A Ruby Hash with the id (and other attributes) of the Query or nil
+ # if there is an error.
+ def ClassyFireAPI.submit_query(label,input, type='STRUCTURE')
begin
- RestClient.post URL+'/queries', {:label => label, :query_input => input}.to_json, :accept => :json, :content_type => :json
+ q = RestClient.post URL+'/queries', {:label => label, :query_input => input, :query_type => type}.to_json, :accept => :json, :content_type => :json
rescue RestClient::BadRequest => e
e.response
rescue RestClient::InternalServerError => e
@@ -15,18 +21,26 @@ module ClassyFireAPI
e.response
rescue RestClient::RequestTimeout => e
e.response
+ rescue RestClient::UnprocessableEntity => e
+ e.response
end
+ q
end
+ # Retrieves the classification results for a given query.
+ #
+ # @param query_id [Integer] the ID of the query.
+ # @param format [String] the format of the query (either JSON, CSV, or SDF)
+ # @return [Text] A text file displaying the classification results for
+ # the query's entities in the specified format.
def ClassyFireAPI.get_query(query_id,format="json")
- # format can be either 'json' or 'sdf'
begin
if format == "json"
- puts "#{URL}/queries/#{query_id}.json"
RestClient.get "#{URL}/queries/#{query_id}.json", :accept => :json
elsif format == "sdf"
- puts "#{URL}/queries/#{query_id}.sdf"
RestClient.get "#{URL}/queries/#{query_id}.sdf", :accept => :sdf
+ elsif format == "csv"
+ RestClient.get "#{URL}/queries/#{query_id}.csv", :accept => :csv
end
rescue RestClient::ResourceNotFound => e
e.response
@@ -39,14 +53,20 @@ module ClassyFireAPI
end
end
+ # Retrieves the classification results for a given entity.
+ #
+ # @param inchikey [String] the ID of the query.
+ # @param format [String] the format of the query, 'text' (either JSON, CSV, or SDF)
+ # @return [Text] A text file displaying the classification results for the entity in the specified format.
def ClassyFireAPI.get_entity_classification(inchikey,format="json")
- # format can be either 'json' or 'sdf'
inchikey_id = inchikey.to_s.gsub('InChIKey=','')
begin
if format == "json"
RestClient.get "#{URL}/entities/#{inchikey_id}.#{format}", :accept => :json
elsif format == "sdf"
RestClient.get "#{URL}/entities/#{inchikey_id}.#{format}", :accept => :sdf
+ elsif format == "csv"
+ RestClient.get "#{URL}/entities/#{inchikey_id}.#{format}", :accept => :csv
end
rescue RestClient::ResourceNotFound => e
e.response
@@ -59,12 +79,379 @@ module ClassyFireAPI
end
end
+ # Retrieves the status of a query
+ # @param query_id [Integer] the ID of the query
+ # @return [String] the query status, 'Done' or 'In progress', 'string'
def ClassyFireAPI.query_status(query_id)
- s = JSON.parse(get_query(query_id))
- if s['error']
- s
- elsif s['classification_status:']
- s['classification_status']
+ begin
+ RestClient.get "#{URL}/queries/#{query_id}/status.json", :accept => :json
+ rescue Exception=>e
+ $stderr.puts e.message
+ nil
end
end
+
+ # Takes a tab-separated file and submit the contained structures in bulks of a given size
+ #
+ # For 'STRUCTURE' or 'IUPAC_NAME'query types, each line must contain either
+ # 1) Only a structural represenation: SMILES, InChI for the 'STRUCTURE' query_type or a IUPAC name
+ # for the 'IUPAC NAME' query type.
+ # 2) a tab-separated pair of an ID and the corresponding sructure representation: SMILES, InChI for the
+ # 'STRUCTURE' query_type or a IUPAC name for the 'IUPAC NAME' query type.
+ #
+ # For 'FASTA' query type, just submit the query as a standard FASTA text.
+ # @param input_file [Text] The path to the input file.
+ # @param: slice_length [Integer] The maximum number of entries for each query input (the whole file
+ # is fragmented into n part of #slice_length entries each).
+ # @param: start [Integer] The starting index. Submit framgments from the index 'start'.
+ def ClassyFireAPI.submit_query_input_in_chunks(input_file,slice_length, start, type='STRUCTURE')
+ @start_time = Time.now
+ absolute_path = File.expand_path(input_file)
+ f = File.open(absolute_path, 'r')
+ input = []
+
+ lines = File.readlines(absolute_path)
+
+ lines.uniq.each do |line|
+ sline = line.strip.split("\t")
+ if sline.length == 1
+ input <<"#{sline[0]}"
+ elsif sline.length >= 2
+ input <<"#{sline[0]}\t#{sline[2]}"
+ end
+ end
+
+ query_ids = []
+ subdivised_groups = input.uniq.each_slice(slice_length).to_a
+ puts "nr of subdivised_groups: #{subdivised_groups.length}"
+ puts subdivised_groups[0]
+ sleeping_time = 120
+ initial_nr_of_jobs = 60
+ i = start
+
+ while i < initial_nr_of_jobs
+ title = File.basename(absolute_path).split(".")[0] + "_yannick" + "_part_#{i}"
+
+ begin
+ puts "submitting #{title}"
+ q = submit_query(title,subdivised_groups[i-1].join("\n"),type)
+ query_ids << JSON.parse(q)['id']
+ rescue Exception => e
+ puts e.message
+ puts e.backtrace.inspect
+ end
+ i = i + 1
+ end
+
+ puts "Going to sleep at #{Time.now - @start_time} for #{sleeping_time} s."
+ sleep(sleeping_time)
+ puts "Waking up at #{Time.now - @start_time}"
+
+ while i < subdivised_groups.length
+ k = 0
+ for k in (i..(i+80))
+ title = File.basename(absolute_path).split(".")[0] + "_yannick" + "_part_#{k}"
+ i = i + 1
+ begin
+ puts "submitting #{title}"
+ q = submit_query(title,subdivised_groups[k-1].join("\n"),type)
+ rescue Exception => e
+ puts e.message
+ puts e.backtrace.inspect
+ end
+
+ end
+ i = k
+ puts "Going to sleep at #{Time.now - @start_time} for #{sleeping_time} s."
+ sleep(sleeping_time)
+ puts "Waking up at #{Time.now - @start_time}"
+ end
+ end
+
+ # Takes each file in a folder, and submit the contained structures in bluks of a given size.
+ #
+ # For 'STRUCTURE' or 'IUPAC_NAME'query types, each line must contain either
+ # 1) Only a structural represenation: SMILES, InChI for the 'STRUCTURE' query_type or a IUPAC name
+ # for the 'IUPAC NAME' query type.
+ # 2) a tab-separated pair of an ID and the corresponding sructure representation: SMILES, InChI for the
+ # 'STRUCTURE' query_type or a IUPAC name for the 'IUPAC NAME' query type.
+ #
+ # For 'FASTA' query type, just submit the query as a standard FASTA text.
+ # @param: input_file [String] The path to the folder.
+ # @param: slice_length [Integer] The maximum number of entries for each query input (each file
+ # is fragmented into n part of #slice_length entries each), 'integer'
+ # @param type [String] the query_type 'STRUCTURE' (default) or 'IUPAC_NAME' or 'FASTA'
+ def ClassyFireAPI.submit_queries_from_directory(folder,slice_length,type="STRUCTURE")
+ if File.directory?(folder)
+ Dir.foreach(folder) do |filename|
+ puts "Filename: #{filename}"
+ ClassyFireAPI.submit_query_input_in_chunks(folder+"/"+filename,slice_length, type) unless filename == "." || filename == ".." || filename == ".DS_Store"
+ end
+ else
+ $stderr.puts "#{folder} is not a folder."
+ end
+ end
+
+
+ # Takes a tab-separated file and submit randomly selected structures in bulks of a given size.
+ #
+ # For 'STRUCTURE' or 'IUPAC_NAME'query types, each line must contain either
+ # 1) Only a structural represenation: SMILES, InChI for the 'STRUCTURE' query_type or a IUPAC name
+ # for the 'IUPAC NAME' query type.
+ # 2) a tab-separated pair of an ID and the corresponding sructure representation: SMILES, InChI for the
+ # 'STRUCTURE' query_type or a IUPAC name for the 'IUPAC NAME' query type.
+ #
+ # For 'FASTA' query type, just submit the query as a standard FASTA text.
+ # @param tab_separated_input_file [Text] The path to the input file.
+ # @param size [Integer] The maximum number of entries for each query input (the whole file
+ # is fragmented into n part of #slice_length entries each).
+ # @param type [String] The query_type, 'STRUCTURE' (default) or 'IUPAC_NAME' or 'FASTA'.
+ def ClassyFireAPI.submit_random_subset_of_query_input_in_chunks(tab_separated_input_file,size, type='STRUCTURE')
+ @start_time = Time.now
+ absolute_path = File.expand_path(tab_separated_input_file)
+ f = File.open(absolute_path, 'r')
+ input = []
+
+ f.each_line do |line|
+
+ sline = line.strip.split("\t")
+ if sline.length == 1
+ input <<"#{sline[0]}"
+ elsif sline.length == 2
+ input <<"#{sline[0]}\t#{sline[1]}"
+ end
+ end
+
+ query_ids = []
+ indexes = []
+ r = 1
+ while r <= (size)
+ s = rand(0..(input.length - 1))
+ unless indexes.include?(s)
+ indexes< e
+ puts e.message
+ puts e.backtrace.inspect
+ end
+ end
+ i = k
+ puts "Going to sleep at #{Time.now - @start_time} for #{sleeping_time} s."
+ sleep(sleeping_time)
+ puts "Waking up at #{Time.now - @start_time}"
+ end
+ end
+
+ # Reads a tab separated file, and use the structure representation
+ #to retrieve the strutcure's classification from ClassyFire.
+ #
+ # @param input [String] path to the input file.
+ # @return [String] path to the output file.
+ def ClassyFireAPI.retrieve_classification(input,output)
+ absolute_path = File.expand_path(input)
+ f_input = File.open(absolute_path, 'r')
+ h = Hash.new
+ directory = absolute_path.split('/')[0...-1].join("/")
+ f_output = File.new(output, 'w')
+ res = String.new
+
+
+ res += "{"
+ res += '"id": 1,'
+ res += '"label":"' + output + '",' + '"classification_status":"Done",' + '"entities":['
+
+ f_input.each_line do |line|
+ sline = line.strip.split("\t")
+ if sline.length == 1
+ h[sline[0]] = sline[0]
+ elsif sline.length == 2
+ h[sline[0]] = line.strip
+ end
+ end
+
+ puts h.keys.uniq.length
+ if h.keys.length > 0
+ i = 1
+ h.keys.uniq[0..-1].each do |key|
+ puts i
+
+ puts "#{key} :: #{h[key]}"
+ begin
+ qs = submit_query(key,h[key])
+
+ qs_decoded = JSON.parse(qs)
+ qr = JSON.parse(get_query(qs_decoded["id"],format="json"))
+
+ res += qr["entities"][0].to_json
+ res += ","
+ i += 1
+ rescue Exception => e
+ e.message
+ end
+
+ end
+ key = h.keys[-1]
+ puts "#{key} :: #{h[key]}"
+ begin
+ qs = submit_query(key,h[key])
+ sleep(0.2)
+ qs_decoded = JSON.parse(qs)
+ qr = JSON.parse(get_query(qs_decoded["id"],format="json"))
+ # puts qr["entities"]
+ # sleep(0.2)
+ # f_output.print qr["entities"][0],"\n"
+ res += qr["entities"][0].to_json
+ # res += ","
+ rescue Exception => e
+ e.message
+ end
+ end
+
+ res += "]}"
+ f_output.print res
+ end
+
+ # Reads a tab separated file, and use the structure representation
+ # to retrieve the strutcure's classification from ClassyFire in a JSON format.
+ #
+ # @param input [String] path to the input file
+ # @return [String] path to the output file
+ def ClassyFireAPI.retrieve_entities_json(input,output)
+ absolute_path = File.expand_path(input)
+ f_input = File.open(absolute_path, 'r')
+ h = Hash.new
+ directory = absolute_path.split('/')[0...-1].join("/")
+ f_output = File.new(output, 'w')
+ puts
+ res = String.new
+
+ res += "{"
+ res += '"id": 1,'
+ res += '"label":"' + output + '",' + '"classification_status":"Done",' + '"entities":['
+
+ f_input.each_line do |line|
+ sline = line.strip.split("\t")
+ h[sline[0]] = sline[-1]
+ end
+
+ puts h.keys.uniq.length
+ if h.keys.length > 0
+ i = 1
+ h.keys.uniq[0...-1].each do |key|
+ puts i
+ # puts "#{key} :: #{h[key]}"
+ begin
+ inchikey = %x(/Applications/ChemAxon/JChem/bin/molconvert inchikey -s "#{h[key]}").strip
+ # puts inchikey
+ qr = JSON.parse(ClassyFireAPI.get_entity_classification(inchikey,format="json"))
+ qr['identifier'] = key
+ res += qr.to_json
+ res += ","
+ puts "#{key} :: RETURN NIL" if qr.nil? || qr['direct_parent']['name'].nil?
+ rescue Exception => e
+ e.message
+ end
+ i += 1
+ end
+ key = h.keys[-1]
+ # puts "#{key} :: #{h[key]}"
+ begin
+ inchikey = %x(/Applications/ChemAxon/JChem/bin/molconvert inchikey -s "#{h[key]}").strip
+ # puts inchikey
+ qr = JSON.parse(ClassyFireAPI.get_entity_classification(inchikey,format="json"))
+ qr['identifier'] = key
+ res += qr.to_json
+ puts "#{key} :: RETURN NIL" if qr.nil? || qr['direct_parent']['name'].nil?
+ # res += ","
+ rescue Exception => e
+ e.message
+ end
+ end
+ res += "]}"
+ f_output.print res
+ end
+
+
+
+ # Reads a tab separated file, and use the structure representation
+ # to retrieve the strutcure's classification from ClassyFire in a SDF format.
+ #
+ # @param input [String] path to the input file
+ # @return [String] path to the output file
+ def ClassyFireAPI.retrieve_entities_sdf(input,output)
+ absolute_path = File.expand_path(input)
+ f_input = File.open(absolute_path, 'r')
+ h = Hash.new
+ directory = absolute_path.split('/')[0...-1].join("/")
+ f_output = File.new(output, 'w')
+ res = String.new
+
+ f_input.each_line do |line|
+ sline = line.strip.split("\t")
+ h[sline[0]] = sline[-1]
+ end
+
+ puts h.keys.uniq.length
+ if h.keys.length > 0
+ i = 1
+ h.keys.uniq[0...-1].each do |key|
+ puts i
+ # puts "#{key} :: #{h[key]}"
+ begin
+ inchikey = %x(/Applications/ChemAxon/JChem/bin/molconvert inchikey -s "#{h[key]}").strip
+ # puts inchikey
+ qr = ClassyFireAPI.get_entity_classification(inchikey,format="sdf")
+ if qr.include?("The page you were looking for doesn't exist")
+ puts "The page you were looking for doesn't exist"
+ elsif qr.empty?
+
+ else
+ input = qr.split("\n")[1..-1].join("\n")
+ puts input
+ f_output.puts "#{key}\n"
+ f_output.puts input
+ end
+ rescue Exception => e
+ e.message
+ end
+ i += 1
+ end
+ key = h.keys[-1]
+ # puts "#{key} :: #{h[key]}"
+ begin
+ inchikey = %x(/Applications/ChemAxon/JChem/bin/molconvert inchikey -s "#{h[key]}").strip
+ # puts inchikey
+ qr = ClassyFireAPI.get_entity_classification(inchikey,format="sdf")
+ if qr.include?("The page you were looking for doesn't exist")
+ puts "The page you were looking for doesn't exist"
+ elsif qr.empty?
+
+ else
+ input = qr.split("\n")[1..-1].join("\n")
+ puts input
+ f_output.puts "#{key}\n"
+ f_output.puts input
+ end
+ rescue Exception => e
+ e.message
+ end
+ end
+ # f_output.print res
+ end
end
\ No newline at end of file
diff --git a/lib/entity_resource.rb b/lib/entity_resource.rb
index cbebcd6..badfa2b 100644
--- a/lib/entity_resource.rb
+++ b/lib/entity_resource.rb
@@ -1,7 +1,6 @@
require 'active_resource'
class EntityResource < ActiveResource::Base
- self.site ='http://localhost:3000'
+ self.site ='http://classyfire.wishartlab.com'
self.element_name = "entity"
-
end
\ No newline at end of file
diff --git a/lib/query_resource.rb b/lib/query_resource.rb
index decfee1..9d17a11 100644
--- a/lib/query_resource.rb
+++ b/lib/query_resource.rb
@@ -1,7 +1,7 @@
require 'active_resource'
class QueryResource < ActiveResource::Base
- self.site ='http://localhost:3000'
+ self.site ='http://classyfire.wishartlab.com'
self.element_name = "query"
has_many :entities, class_name: 'EntityResource'
def to_param