Commit 55015082 authored by marc's avatar marc
parents 15989d1d 0119350a
......@@ -31,8 +31,9 @@
#define NO_FORBIDDEN_ID (-1)
AlignBox::AlignBox(string _key) {
AlignBox::AlignBox(string _key, string _color) {
key = _key;
color = _color;
del_left = 0 ;
start = 0 ;
......@@ -69,6 +70,61 @@ void AlignBox::addToJson(json &seg) {
seg[key] = j ;
}
#define NO_COLOR "\033[0m"
int AlignBox::posInRef(int i) {
// Works now only for V/J boxes
if (del_left >= 0) // J
return i - start + del_left + 1; // Why +1 ?
if (del_right >= 0) // V
return i + (ref.size() - del_right) - end ;
return -99;
}
string AlignBox::refToString(int from, int to) {
stringstream s;
s << ref_label << " \t" ;
int j = posInRef(from);
s << j << "\t" ;
if (from > start)
s << color;
for (int i=from; i<=to; i++) {
if (i == start)
s << color;
if (j > 0 && j <= ref.size())
s << ref[j-1] ;
else
s << ".";
if (i == end)
s << NO_COLOR;
// Related position. To improve
j++ ;
}
if (to < end)
s << NO_COLOR;
s << "\t" << j ;
return s.str();
}
ostream &operator<<(ostream &out, const AlignBox &box)
{
out << "[/" << box.del_left << " " ;
......@@ -107,8 +163,12 @@ Segmenter::~Segmenter() {}
Sequence Segmenter::getSequence() const {
Sequence s ;
s.label_full = info ;
s.label = label + " " + (reversed ? "-" : "+");
s.sequence = revcomp(sequence, reversed);
if (segmented) {
s.label = label + " " + (reversed ? "-" : "+");
s.sequence = revcomp(sequence, reversed);
} else {
s.sequence = sequence;
}
return s ;
}
......@@ -798,6 +858,8 @@ FineSegmenter::FineSegmenter(Sequence seq, Germline *germline, Cost segment_c,
evalue = NO_LIMIT_VALUE;
evalue_left = NO_LIMIT_VALUE;
evalue_right = NO_LIMIT_VALUE;
box_V->marked_pos = 0;
box_J->marked_pos = 0;
CDR3start = -1;
CDR3end = -1;
......
......@@ -76,16 +76,29 @@ class AlignBox
{
public:
string key;
string color;
int del_left;
int start;
int end;
int del_right;
AlignBox(string key = "");
AlignBox(string key = "", string color="");
string getSequence(string sequence);
void addToJson(json &seg);
/**
* Returns the position in the reference string corresponding to the position in the read
* Preliminary implementation, only works for the start of V and J boxes
*/
int posInRef(int i);
/**
* Format the reference string in a given range position, possibly adding the ANSI colors
* where there is the alignment
*/
string refToString(int from, int to);
/* Identifier, label and sequence of the reference sequence (the best one) */
int ref_nb;
string ref_label;
......
#target 0746OC
>IGHV5-51*01 0/TCCGCCCTA/5 IGHD1-26*01 2/A/2 IGHJ3*02 [IGH]
# Both alleles are possible for IGHV. The *01 is slightly longer (2nt)
# but has 2 mutations instead of 1 for the *03.
>(IGHV5-51*01, IGHV5-51*03) 0/TCCGCCCTA/5 IGHD1-26*01 2/A/2 IGHJ3*02 [IGH]
TGGAGTCTGGAGCAGAGGTGAAAAAGCCGGGGGAGTCTCTGAAGATCTCCTGT
AAGGGTTCTGGATACAGCTTTACCAGCTACTGGATCGGCTGGGTGCGCCAGATGCCCGGGAAAGGCCTGGAG
TGGATGGGGATCATCTATCCTGGTGACTCTGATACCAGATACAGCCCGTCCTTCCAAGGCCAGGTCACCATC
......@@ -68,7 +70,8 @@ TGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGGTAAGCCCTATAGTGAGTCGTATTA
#target 874MK
>IGHV1-24*01 3/TGAGGAAGGGGG/7 IGHD6-6*01 1/0/9 IGHJ6*02 [IGH]
# End of V1-24*01 is Aga
>IGHV1-24*01 (3/TGAGGAAGGGGG/7, 0/GGAAGGGGG/7) IGHD6-6*01 1/0/9 IGHJ6*02 [IGH]
GTAAAACGACGGCCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTCTCCTGCAAG
GTTTCCGGATACACCCTCACTGAATTATCCATGCACTGGGTGCGACAGGCTCCTGGAAAAGGGCTTGAGTGG
ATGGGAGGTTTTGATCCTGAAGATGGTGAAACAATCTACGCACAGAAGTTCCAGGGCAGAGTCACCATGACC
......@@ -80,7 +83,12 @@ AAGCCCTATAGTGAGTCGTATTA
#target 899BR
>IGHV3-11*01 3/CGAGGGAGC/3 IGHD5-24*01 5/C/7 IGHJ6*03 [IGH]
# End of V3-11*01 is Aga
# read 263 GTGTATTACTGTGCGAGCGAGGGAGCGAGATGGCTACACCTACTACTACTACAT 316
# IGHV3-11*01 277 GTGTATTACTGTGCGAGAGA.................................. 331
# IGHD5-24*01 .......................gtaGAGATGGCTACAattac...........
# IGHJ6*03 -31 .......................................CTACTACTACTACAT 23
>IGHV3-11*01 (3/CGAGGGAGC/3, 0/GGGAGC/3) IGHD5-24*01 5/C/7 IGHJ6*03 [IGH] BUG
TGGAGTCTGGGGGAGGCTTGGTCAAGCCTGGAGGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCT
TCAGTGAC
TACTACATGAGCTGGATCCGCCAGGCTCCAGGGAAGGGGCTGGAGTGGGTTTCATACATTAGTAGTAGTGGT
......@@ -91,7 +99,7 @@ CTACTACTACTACATGGACGTCTGGGGCAAAGGGACCACGGTCACCGTCTCCTCAGGT
#target 0889CE
>IGHV1-3*01 3/GCT/2 IGHD2-15*01 22/CCCCCG/16 IGHJ6*02 [IGH]
>IGHV1-3*01 3/GCT/2 IGHD2-15*01 22/CCCCCG/16 IGHJ6*02 [IGH] BUG
TAAAACGACGGCCAGTCTGGGGCTGAGGTGAAGAAGCCTGGGGCCTCAGTGAAGGTTTCCTGCAAG
GCTTCTGGATACACCTTCACTAGCTATGCTATGCATTGGGTGCGCCAGGCCCCCGGACAAAGGCTTGAGTGG
ATGGGATGGATCAACGCTGGCAATGGTAACACAAAATATTCACAGAAGTTCCAGGGCAGAGTCACCATTACC
......@@ -218,7 +226,7 @@ TTGACTACTGGGGCCAGGGAACCCTGGTCACCGTCTCCTCAGGT
#target 0990CE
>IGHV3-30*18 4/AAGATTCACCATA/21 IGHD32-21*01 0/GTCGGCCCC/2 IGHD3-22*01 7/CGC/10 IGHJ4*02 [IGH+]
>IGHV3-30*18 4/AAGATTCACCATA/21 IGHD32-21*01 0/GTCGGCCCC/2 IGHD3-22*01 7/CGC/10 IGHJ4*02 [IGH]
TGGAGTCTGGGGGAGGCGTGGTCCAGCCTGGGAGGTCCCTGAGACTCTCCTGTGCAGCCTCTGGATTCACCT
TCAGTAGCTATGGCATGCACTGGGTCCGCCAGGCTCCAGGCAAGGGGCTGGAGTGGGTGGCAGTTATATCAT
ATGATGGAAGTAATAAATACTATGCAGACTCCGTGAAGGGCCGATTCACCATCTCCAGAGACAATTCCAAGA
......
......@@ -57,8 +57,8 @@ int main(int argc, const char** argv)
string read = argv[1];
string germline = argv[2];
Fasta Vgenes(germline+"V.fa");
Fasta Jgenes(germline+"J.fa");
Fasta Vgenes(germline+"V.fa", 2, "|");
Fasta Jgenes(germline+"J.fa", 2, "|");
Fasta interestingV = extractInterestingGenes(Vgenes, argv[3]);
Fasta interestingJ = extractInterestingGenes(Jgenes, argv[4]);
......@@ -72,8 +72,8 @@ int main(int argc, const char** argv)
exit(2);
}
AlignBox box_V("5");
AlignBox box_J("3");
AlignBox box_V("5", V_COLOR);
AlignBox box_J("3", J_COLOR);
if (read == "-") {
// Read on stdin
......@@ -82,26 +82,28 @@ int main(int argc, const char** argv)
align_against_collection(read, interestingV, -1, false, false, false, &box_V, VDJ);
align_against_collection(read, interestingJ, -1, false, true, false, &box_J, VDJ);
// This should be handled directly into align_against_collection
box_J.start = box_J.end ;
box_J.del_left = box_J.del_right;
box_J.end = read.size() - 1;
int align_V_length = min(GENE_ALIGN, box_V.end - box_V.start + 1);
int align_J_length = min(GENE_ALIGN, (int)read.size() - box_J.end + 1);
int align_J_length = min(GENE_ALIGN, (int)read.size() - box_J.start + 1);
int start_V = box_V.end - align_V_length + 1;
int end_J = box_J.start + align_J_length - 1;
cout << "read \t" << start_V << "\t" ;
cout << V_COLOR << read.substr(start_V, align_V_length)
<< NO_COLOR
<< read.substr(box_V.end+1, (box_J.end - 1) - (box_V.end + 1) +1)
<< read.substr(box_V.end+1, (box_J.start - 1) - (box_V.end + 1) +1)
<< J_COLOR
<< read.substr(box_J.end, align_J_length)
<< read.substr(box_J.start, align_J_length)
<< NO_COLOR
<< endl
<< V_COLOR << box_V.ref.substr(box_V.ref.size() - box_V.del_right - align_V_length, align_V_length)
<< NO_COLOR << box_V.ref.substr(box_V.ref.size() - box_V.del_right, box_V.del_right)
<< endl;
for (int i = 0; i < box_J.end - start_V - box_J.del_right; i++) {
cout << " ";
}
cout << box_J.ref.substr(0, box_J.del_right)
<< J_COLOR << box_J.ref.substr(box_J.del_right, align_J_length) << NO_COLOR << endl;
<< "\t" << end_J << endl ;
cout << box_V.refToString(start_V, end_J) << "\t" << box_V << endl ;
cout << box_J.refToString(start_V, end_J) << "\t" << box_J << endl ;
exit (0);
}
LESSC=lessc
all: dark.css light.css svg.css
all: dark.css light.css svg.css talk.css
dark.css: dark.less vidjil.less
$(LESSC) dark.less dark.css
light.css: light.less vidjil.less
$(LESSC) light.less light.css
talk.css: talk.less light.less vidjil.less
$(LESSC) $< $@
svg.css: svg.less vidjil.less
$(LESSC) svg.less svg.css
......
......@@ -896,7 +896,8 @@ span.logo {
float: left;
width: eval(300px);
}
.devel-mode {
.devel-mode,
.beta-mode {
display: none;
}
.focus {
......@@ -1229,9 +1230,15 @@ span.warningReads {
table-layout: fixed;
}
.db_table td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.db_table td:hover {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
.db_table_split {
text-align: center;
......@@ -1728,6 +1735,16 @@ textarea#edit_value {
overflow: hidden;
text-overflow: ellipsis;
}
/* Doesn't work well
* if opacity is not at 1
* (for instance with .inactive classes)
*/
.ellipsisOverflow {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
#highlightCheckboxes {
height: 100%;
float: left;
......
......@@ -896,7 +896,8 @@ span.logo {
float: left;
width: eval(300px);
}
.devel-mode {
.devel-mode,
.beta-mode {
display: none;
}
.focus {
......@@ -1229,9 +1230,15 @@ span.warningReads {
table-layout: fixed;
}
.db_table td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.db_table td:hover {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
.db_table_split {
text-align: center;
......@@ -1728,6 +1735,16 @@ textarea#edit_value {
overflow: hidden;
text-overflow: ellipsis;
}
/* Doesn't work well
* if opacity is not at 1
* (for instance with .inactive classes)
*/
.ellipsisOverflow {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
#highlightCheckboxes {
height: 100%;
float: left;
......
......@@ -895,7 +895,8 @@ span.logo {
float: left;
width: eval(300px);
}
.devel-mode {
.devel-mode,
.beta-mode {
display: none;
}
.focus {
......@@ -1228,9 +1229,15 @@ span.warningReads {
table-layout: fixed;
}
.db_table td {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.db_table td:hover {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
.db_table_split {
text-align: center;
......@@ -1727,6 +1734,16 @@ textarea#edit_value {
overflow: hidden;
text-overflow: ellipsis;
}
/* Doesn't work well
* if opacity is not at 1
* (for instance with .inactive classes)
*/
.ellipsisOverflow {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
#highlightCheckboxes {
height: 100%;
float: left;
......
This diff is collapsed.
@import "light.less";
@default-font: ubuntumedium, Arial, Helvetica, Sans-serif;
#mid-container {
font-size: 125%;
}
.sp_legend2 {
opacity: 0.8;
}
\ No newline at end of file
......@@ -1062,7 +1062,7 @@ span.logo
width: eval(@width_highlight);
}
.devel-mode {
.devel-mode, .beta-mode {
display: none;
}
......@@ -1403,10 +1403,12 @@ span.warningReads {
table-layout: fixed;
}
.db_table td{
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
.db_table td {
.ellipsis;
}
.db_table td:hover {
.ellipsisOverflow;
}
.db_table_split{
......@@ -1963,6 +1965,17 @@ textarea#edit_value {
text-overflow: ellipsis;
}
/* Doesn't work well
* if opacity is not at 1
* (for instance with .inactive classes)
*/
.ellipsisOverflow {
z-index: 999;
position: relative;
background: inherit;
display: inline-block;
}
#highlightCheckboxes {
height: 100%;
float: left;
......
......@@ -239,8 +239,9 @@
<div style="float: right" class="menu" onmouseover="showSelector('paletteSelector');"> palette
<div id="paletteSelector" class="selector"><div>
<a class="buttonSelector" onclick="changeStyle('solarizeD')">dark</a>
<a class="buttonSelector" onclick="changeStyle('solarizeL')">light</a>
<a class="buttonSelector" onclick="changeStyle('display')">light (presentation)</a>
<a class="buttonSelector" onclick="changeStyle('solarizeD')">dark</a>
</div></div>
</div>
......
......@@ -11,11 +11,6 @@ require(["jquery",
"d3.v3",
"jquery.form",
"StackBlur",
"jspdf",
"jspdf.plugin.addimage",
"jspdf.plugin.svgToPdf",
"jspdf.plugin.split_text_to_size",
"jspdf.plugin.standard_fonts_metrics",
"underscore",
"rgbcolor",
"file",
......
......@@ -857,9 +857,15 @@ Builder.prototype = {
var spanProductive = document.createElement('span')
spanProductive.style.backgroundColor = colorProductivity('true')
spanProductive.className = 'tagColorBox'
span2.appendChild(spanNotProductive)
span2.appendChild(spanProductive)
span3.appendChild(document.createTextNode('productive'));
span1.appendChild(spanNotProductive)
span1.appendChild(spanProductive)
span2.appendChild(document.createTextNode('productive'));
var spanNoCDR3 = document.createElement('span')
spanNoCDR3.className = 'tagColorBox tagColor8'
span3.style.marginLeft = '20px'
span3.appendChild(document.createTextNode(' no CDR3 '));
span3.appendChild(spanNoCDR3);
break;
case "abundance":
......
......@@ -611,6 +611,7 @@ Database.prototype = {
xhrFields: {withCredentials: true},
success: function (result) {
self.display_result(result, "", args);
console.log('=== load_data: success ===');
},
error: function (request, status, error) {
if (status === "timeout") {
......@@ -691,6 +692,7 @@ Database.prototype = {
xhrFields: {withCredentials: true},
success: function (result) {
self.display_result(result)
console.log('=== load_analysis: success ===');
},
error: function (request, status, error) {
if (status === "timeout") {
......
......@@ -204,7 +204,7 @@ Germline.prototype = {
list1[tmp1[i]] = this.allele[tmp1[i]];
}
this.allele = list1;
console.log(system +" "+ type)
// console.log(system +" "+ type)
//color
......
......@@ -321,7 +321,8 @@ Graph.prototype = {
elapsedTime = new Date()
.getTime() - startTime;
console.log("update Graph: " + elapsedTime + "ms");
// console.log("update Graph: " + elapsedTime + "ms");
return this
},
......
This diff is collapsed.
/** @preserve
jsPDF addImage plugin (JPEG only at this time)
Copyright (c) 2012 https://github.com/siefkenj/
*/
/**
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* ====================================================================
*/
;(function(jsPDFAPI) {
'use strict'
var namespace = 'addImage_'
// takes a string imgData containing the raw bytes of
// a jpeg image and returns [width, height]
// Algorithm from: http://www.64lines.com/jpeg-width-height
var getJpegSize = function(imgData) {
'use strict'
var width, height;
// Verify we have a valid jpeg header 0xff,0xd8,0xff,0xe0,?,?,'J','F','I','F',0x00
if (!imgData.charCodeAt(0) === 0xff ||
!imgData.charCodeAt(1) === 0xd8 ||
!imgData.charCodeAt(2) === 0xff ||
!imgData.charCodeAt(3) === 0xe0 ||
!imgData.charCodeAt(6) === 'J'.charCodeAt(0) ||
!imgData.charCodeAt(7) === 'F'.charCodeAt(0) ||
!imgData.charCodeAt(8) === 'I'.charCodeAt(0) ||
!imgData.charCodeAt(9) === 'F'.charCodeAt(0) ||
!imgData.charCodeAt(10) === 0x00) {
throw new Error('getJpegSize requires a binary jpeg file')
}
var blockLength = imgData.charCodeAt(4)*256 + imgData.charCodeAt(5);
var i = 4, len = imgData.length;
while ( i < len ) {
i += blockLength;
if (imgData.charCodeAt(i) !== 0xff) {
throw new Error('getJpegSize could not find the size of the image');
}
if (imgData.charCodeAt(i+1) === 0xc0 || //(SOF) Huffman - Baseline DCT
imgData.charCodeAt(i+1) === 0xc1 || //(SOF) Huffman - Extended sequential DCT
imgData.charCodeAt(i+1) === 0xc2 || // Progressive DCT (SOF2)
imgData.charCodeAt(i+1) === 0xc3 || // Spatial (sequential) lossless (SOF3)
imgData.charCodeAt(i+1) === 0xc4 || // Differential sequential DCT (SOF5)
imgData.charCodeAt(i+1) === 0xc5 || // Differential progressive DCT (SOF6)
imgData.charCodeAt(i+1) === 0xc6 || // Differential spatial (SOF7)
imgData.charCodeAt(i+1) === 0xc7) {
height = imgData.charCodeAt(i+5)*256 + imgData.charCodeAt(i+6);
width = imgData.charCodeAt(i+7)*256 + imgData.charCodeAt(i+8);
return [width, height];
} else {
i += 2;
blockLength = imgData.charCodeAt(i)*256 + imgData.charCodeAt(i+1)
}
}
}
// Image functionality ported from pdf.js
, putImage = function(img) {
var objectNumber = this.internal.newObject()
, out = this.internal.write
, putStream = this.internal.putStream
img['n'] = objectNumber
out('<</Type /XObject')
out('/Subtype /Image')
out('/Width ' + img['w'])
out('/Height ' + img['h'])
if (img['cs'] === 'Indexed') {
out('/ColorSpace [/Indexed /DeviceRGB '
+ (img['pal'].length / 3 - 1) + ' ' + (objectNumber + 1)
+ ' 0 R]');
} else {
out('/ColorSpace /' + img['cs']);
if (img['cs'] === 'DeviceCMYK') {
out('/Decode [1 0 1 0 1 0 1 0]');
}
}
out('/BitsPerComponent ' + img['bpc']);
if ('f' in img) {
out('/Filter /' + img['f']);
}
if ('dp' in img) {
out('/DecodeParms <<' + img['dp'] + '>>');
}
if ('trns' in img && img['trns'].constructor == Array) {
var trns = '';
for ( var i = 0; i < img['trns'].length; i++) {
trns += (img[trns][i] + ' ' + img['trns'][i] + ' ');
out('/Mask [' + trns + ']');
}
}
if ('smask' in img) {
out('/SMask ' + (objectNumber + 1) + ' 0 R');
}
out('/Length ' + img['data'].length + '>>');
putStream(img['data']);
out('endobj');
}
, putResourcesCallback = function() {
var images = this.internal.collections[namespace + 'images']
for ( var i in images ) {
putImage.call(this, images[i])
}
}
, putXObjectsDictCallback = function(){
var images = this.internal.collections[namespace + 'images']
, out = this.internal.write
, image
for (var i in images) {
image = images[i]
out(
'/I' + image['i']
, image['n']
, '0'
, 'R'
)
}
}
jsPDFAPI.addImage = function(imageData, format, x, y, w, h) {
'use strict'
if (typeof imageData === 'object' && imageData.nodeType === 1) {
var canvas = document.createElement('canvas');
canvas.width = imageData.clientWidth;
canvas.height = imageData.clientHeight;
var ctx = canvas.getContext('2d');
if (!ctx) {
throw ('addImage requires canvas to be supported by browser.');
}
ctx.drawImage(imageData, 0, 0, canvas.width, canvas.height);
imageData = canvas.toDataURL('image/jpeg');
format = "JPEG";
}
if (format.toUpperCase() !== 'JPEG') {
throw new Error('addImage currently only supports format \'JPEG\', not \''+format+'\'');
}
var imageIndex
, images = this.internal.collections[namespace + 'images']
, coord = this.internal.getCoordinateString
, vcoord = this.internal.getVerticalCoordinateString;
// Detect if the imageData is raw binary or Data URL
if (imageData.substring(0, 23) === 'data:image/jpeg;base64,') {
imageData = atob(imageData.replace('data:image/jpeg;base64,', ''));
}
if (images){
// this is NOT the first time this method is ran on this instance of jsPDF object.
imageIndex = Object.keys ?
Object.keys(images).length :
(function(o){
var i = 0
for (var e in o){if(o.hasOwnProperty(e)){ i++ }}
return i
})(images)
} else {
// this is the first time this method is ran on this instance of jsPDF object.
imageIndex = 0
this.internal.collections[namespace + 'images'] = images = {}
this.internal.events.subscribe('putResources', putResourcesCallback)
this.internal.events.subscribe('putXobjectDict', putXObjectsDictCallback)
}