From 7d76a3519003778da67caa74d5c29c8b99ff972e Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Thu, 20 Jul 2023 14:26:53 +0200
Subject: [PATCH 01/13] Add Hectar loader (#31)
---
cli/genoboo.js | 39 +++++
imports/api/genes/hectar/addHectar.js | 143 +++++++++++++++++++
imports/api/genes/hectar/hectar.test.js | 64 +++++++++
imports/api/genes/hectar/hectarCollection.js | 41 ++++++
imports/api/jobqueue/process-hectar.js | 57 ++++++++
private/data/Bnigra_hectar.tab | 2 +
6 files changed, 346 insertions(+)
create mode 100644 imports/api/genes/hectar/addHectar.js
create mode 100644 imports/api/genes/hectar/hectar.test.js
create mode 100644 imports/api/genes/hectar/hectarCollection.js
create mode 100644 imports/api/jobqueue/process-hectar.js
create mode 100644 private/data/Bnigra_hectar.tab
diff --git a/cli/genoboo.js b/cli/genoboo.js
index 59328c65..22a032ca 100755
--- a/cli/genoboo.js
+++ b/cli/genoboo.js
@@ -755,6 +755,45 @@ Example:
})
.exitOverride(customExitOverride(addEggnog));
+// Add Hectar annotations file.
+const addHectar = add.command('hectar');
+
+addHectar
+ .description('Add Hectar results to a running GeneNoteBook server')
+ .usage('[options] ')
+ .arguments('')
+ .requiredOption(
+ '-u, --username ',
+ 'GeneNoteBook admin username'
+ )
+ .requiredOption(
+ '-p, --password ',
+ 'GeneNoteBook admin password'
+ )
+ .option(
+ '--port [port]',
+ 'Port on which GeneNoteBook is running. Default: 3000'
+ )
+ .action((file, { username, password, port = 3000 }) => {
+ if (typeof file !== 'string') addHectar.help();
+
+ const fileName = path.resolve(file);
+ if (!(fileName && username && password)) {
+ addHectar.help();
+ }
+
+ new GeneNoteBookConnection({ username, password, port }).call('addHectar', {
+ fileName,
+ });
+ })
+ .on('--help', () => {
+ console.log(`
+Example:
+ genenotebook add hectar hectar_annotations.tab -u admin -p admin
+ `);
+ })
+ .exitOverride(customExitOverride(addHectar));
+
// add orthogroups.
const addOrthogroups = add.command('orthogroups');
diff --git a/imports/api/genes/hectar/addHectar.js b/imports/api/genes/hectar/addHectar.js
new file mode 100644
index 00000000..b08d8806
--- /dev/null
+++ b/imports/api/genes/hectar/addHectar.js
@@ -0,0 +1,143 @@
+import { hectarCollection } from '/imports/api/genes/hectar/hectarCollection.js';
+import jobQueue, { Job } from '/imports/api/jobqueue/jobqueue.js';
+import { ValidatedMethod } from 'meteor/mdg:validated-method';
+import { Genes } from '/imports/api/genes/geneCollection.js';
+import logger from '/imports/api/util/logger.js';
+import { Roles } from 'meteor/alanning:roles';
+import SimpleSchema from 'simpl-schema';
+import { Meteor } from 'meteor/meteor';
+
+class HectarProcessor {
+ constructor() {
+ // Not a bulk mongo suite.
+ this.genesDb = Genes.rawCollection();
+ this.nHectar = 0;
+ }
+
+ /**
+ * Function that returns the total number of insertions or updates in the
+ * hectar collection.
+ * @function
+ * @return {Number} Return the total number of insertions or updates of
+ * hectar.
+ */
+ getNumberHectar() {
+ return this.nHectar;
+ }
+
+ parse = (line) => {
+ if (!(line[0] === '#' || line.split('\t').length <= 1)) {
+ // Get all hectar informations line by line and separated by tabs.
+ const [
+ proteinId,
+ predictedTargetingCategory,
+ signalPeptideScore,
+ signalPeptideCleavageSite,
+ typeIISignalAnchorScore,
+ chloroplastScore,
+ mitochondrionScore,
+ otherScore,
+ ] = line.split('\t');
+
+ // Organize data in a dictionary.
+ const annotations = {
+ protein_id: proteinId,
+ predicted_targeting_category: predictedTargetingCategory,
+ signal_peptide_score: signalPeptideScore,
+ signal_peptide_cleavage_site: signalPeptideCleavageSite,
+ typeII_signal_anchor_score: typeIISignalAnchorScore,
+ chloroplast_score: chloroplastScore,
+ mitochondrion_score: mitochondrionScore,
+ other_score: otherScore,
+ };
+
+ // Filters undefined data (with a dash) and splits into an array for
+ // comma-separated data.
+ for (const [key, value] of Object.entries(annotations)) {
+ if (value[0] === '-') {
+ annotations[key] = undefined;
+ }
+ if (value.indexOf(',') > -1) {
+ annotations[key] = value.split(',');
+ }
+ }
+
+ // If subfeatures is found in genes database (e.g: ID =
+ // MMUCEDO_000002-T1).
+ const subfeatureIsFound = Genes.findOne({
+ $or: [
+ { 'subfeatures.ID': protein_id },
+ { 'subfeatures.protein_id': protein_id },
+ ],
+ });
+
+ if (typeof subfeatureIsFound !== 'undefined') {
+ // Increment hectar.
+ this.nHectar += 1;
+
+ // Update or insert if no matching documents were found.
+ const documentHectar = hectarCollection.upsert(
+ { protein_id: proteinId }, // selector.
+ annotations, // modifier.
+ );
+
+ // Update hectarId in genes database.
+ if (typeof documentHectar.insertedId !== 'undefined') {
+ // Hectar _id is created.
+ return this.genesDb.update({
+ $or: [
+ { 'subfeatures.ID': proteinId },
+ { 'subfeatures.protein_id': proteinId },
+ ]},
+ { $set: { hectarId: documentHectar.insertedId } },
+ );
+ } else {
+ // Hectar already exists.
+ const hectarIdentifiant = hectarCollection.findOne({ protein_id: proteinId })._id;
+ return this.genesDb.update(
+ { $or: [{'subfeatures.ID': proteinId}, {'subfeatures.protein_id': proteinId}] },
+ { $set: { hectarId: hectarIdentifiant } },
+ );
+ }
+ } else {
+ logger.warn(`
+Warning ! ${proteinId} hectar annotation did
+not find a matching protein domain in the genes database.
+${proteinId} is not added to the hectar database.`);
+ }
+ }
+ };
+}
+
+const addHectar = new ValidatedMethod({
+ name: 'addHectar',
+ validate: new SimpleSchema({
+ fileName: { type: String },
+ }).validator(),
+ applyOptions: {
+ noRetry: true,
+ },
+ run({ fileName }) {
+ if (!this.userId) {
+ throw new Meteor.Error('not-authorized');
+ }
+ if (!Roles.userIsInRole(this.userId, 'admin')) {
+ throw new Meteor.Error('not-authorized');
+ }
+
+ logger.log('file :', { fileName });
+ const job = new Job(jobQueue, 'addHectar', { fileName });
+ const jobId = job.priority('high').save();
+
+ let { status } = job.doc;
+ logger.debug(`Job status: ${status}`);
+ while ((status !== 'completed') && (status !== 'failed')) {
+ const { doc } = job.refresh();
+ status = doc.status;
+ }
+ return { result: job.doc.result, jobStatus: status};
+ },
+});
+
+export default addHectar;
+export { HectarProcessor };
diff --git a/imports/api/genes/hectar/hectar.test.js b/imports/api/genes/hectar/hectar.test.js
new file mode 100644
index 00000000..b9bebd0a
--- /dev/null
+++ b/imports/api/genes/hectar/hectar.test.js
@@ -0,0 +1,64 @@
+/* eslint-env mocha */
+import { resetDatabase } from 'meteor/xolvio:cleaner';
+import chai from 'chai';
+import logger from '../../util/logger';
+import { hectarCollection } from './hectarCollection';
+import addhectar from './addHectar';
+import { addTestUsers, addTestGenome } from '../../../startup/server/fixtures/addTestData';
+import '../../jobqueue/process-hectar';
+
+describe('hectar', function testHectar() {
+ let adminId;
+ let newUserId;
+ let adminContext;
+ let userContext;
+
+ logger.log('Testing Hectar methods');
+
+ beforeEach(() => {
+ ({ adminId, newUserId } = addTestUsers());
+ adminContext = { userId: adminId };
+ userContext = { userId: newUserId };
+ });
+
+ afterEach(() => {
+ resetDatabase();
+ });
+
+ it('Should add Hectar tab file', function importhectar() {
+ // Increase timeout
+ this.timeout(20000);
+
+ addTestGenome(annot = true);
+
+ const hectarParams = {
+ fileName: 'assets/app/data/Bnigra_hectar.tsv',
+ };
+
+ // Should fail for non-logged in
+ chai.expect(() => {
+ addHectar._execute({}, hectarParams);
+ }).to.throw('[not-authorized]');
+
+ // Should fail for non admin user
+ chai.expect(() => {
+ addHectar._execute(userContext, hectarParams);
+ }).to.throw('[not-authorized]');
+
+ const { result } = addHectar._execute(adminContext, hectarParams);
+
+ chai.assert.equal(result.nInserted, 1)
+
+ const hecs = hectarCollection.find({ protein_id: 'BniB01g000010.2N.1-P' }).fetch();
+
+ chai.assert.lengthOf(hecs, 1, 'No hectar data found');
+
+ const hec = hecs[0];
+
+ chai.assert.equal(hec.predicted_targeting_category, 'other localisation');
+ chai.assert.equal(hec.signal_peptide_score, '0.0583');
+ chai.assert.equal(hec.typeII_signal_anchor_score, '0.0228');
+ chai.assert.equal(hec.mitochondrion_score, '0.1032');
+ chai.assert.equal(hec.other_score, '0.8968');
+ });
+});
diff --git a/imports/api/genes/hectar/hectarCollection.js b/imports/api/genes/hectar/hectarCollection.js
new file mode 100644
index 00000000..bf7dad3f
--- /dev/null
+++ b/imports/api/genes/hectar/hectarCollection.js
@@ -0,0 +1,41 @@
+import SimpleSchema from 'simpl-schema';
+import { Mongo } from 'meteor/mongo';
+
+const hectarSchema = new SimpleSchema({
+ protein_id: {
+ type: String,
+ label: 'Query sequence name and type.',
+ },
+ predicted_targeting_category: {
+ type: String,
+ label: 'Predicted sub-cellular localization.',
+ },
+ signal_peptide_score: {
+ type: String,
+ label: 'Probability (score) to be a signal peptide.',
+ },
+ signal_peptide_cleavage_site: {
+ type: String,
+ label: 'Predicted cleavage site of signal peptide.',
+ },
+ typeII_signal_anchor_score: {
+ type: String,
+ label: 'Probability (score) to be a type II signal anchor.',
+ },
+ chloroplast_score: {
+ type: String,
+ label: 'Probability (score) to be in chloroplast.',
+ },
+ mitochondrion_score: {
+ type: String,
+ label: 'Probability (score) to be in mitochondrion.',
+ },
+ other_score: {
+ type: String,
+ label: 'Probability (score) to be elsewhere .',
+ },
+});
+
+const hectarCollection = new Mongo.Collection('hectar');
+
+export { hectarCollection, hectarSchema };
diff --git a/imports/api/jobqueue/process-hectar.js b/imports/api/jobqueue/process-hectar.js
new file mode 100644
index 00000000..4338b288
--- /dev/null
+++ b/imports/api/jobqueue/process-hectar.js
@@ -0,0 +1,57 @@
+import { HectarProcessor } from '/imports/api/genes/hectar/addHectar.js';
+import logger from '/imports/api/util/logger.js';
+import jobQueue from './jobqueue.js';
+import readline from 'readline';
+import fs from 'fs';
+
+jobQueue.processJobs(
+ 'addHectar',
+ {
+ concurrency: 4,
+ payload: 1,
+ },
+ async (job, callback) => {
+ const { fileName } = job.data;
+ logger.log(`Add ${fileName} hectar file.`);
+
+ const lineProcessor = new HectarProcessor();
+
+ const rl = readline.createInterface({
+ input: fs.createReadStream(fileName, 'utf8'),
+ crlfDelay: Infinity,
+ });
+
+ const { size: fileSize } = await fs.promises.stat(fileName);
+ let processedBytes = 0;
+ let processedLines = 0;
+ let nHectar = 0;
+
+ for await (const line of rl) {
+ processedBytes += line.length + 1; // also count \n
+ processedLines += 1;
+
+ if ((processedLines % 100) === 0) {
+ await job.progress(
+ processedBytes,
+ fileSize,
+ { echo: true },
+ (err) => {
+ if (err) logger.error(err);
+ },
+ );
+ }
+
+ try {
+ await lineProcessor.parse(line);
+ nHectar = lineProcessor.getNumberHectar();
+ } catch (err) {
+ logger.error(err);
+ job.fail({ err });
+ callback();
+ }
+ }
+ logger.log(`Inserted ${nHectar} Hectar`);
+ job.done({ nInserted: nHectar });
+ callback();
+ },
+);
diff --git a/private/data/Bnigra_hectar.tab b/private/data/Bnigra_hectar.tab
new file mode 100644
index 00000000..7d62a5ec
--- /dev/null
+++ b/private/data/Bnigra_hectar.tab
@@ -0,0 +1,2 @@
+protein id predicted targeting category signal peptide score signal peptide cleavage site type II signal anchor score chloroplast score mitochondrion score other score
+BniB01g000010.2N.1-P other localisation 0.0583 - 0.0228 - 0.1032 0.8968
From 4ffb519abf7b958ffaea26621b21bb3072a91afe Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Wed, 26 Jul 2023 13:59:57 +0200
Subject: [PATCH 02/13] import hectar (#31)
---
imports/api/api.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/imports/api/api.js b/imports/api/api.js
index d552add6..6632a5dd 100644
--- a/imports/api/api.js
+++ b/imports/api/api.js
@@ -19,6 +19,7 @@ import './genomes/annotation/addAnnotation.js';
import './genes/interproscan.js';
import './genes/addInterproscan.js';
import './genes/eggnog/addEggnog.js';
+import './genes/hectar/addHectar.js';
import './genes/scanGeneAttributes.js';
import './genes/updateAttributeInfo.js';
import './genes/updateGene.js';
From 39473b485317a9b220f26850fff4a50e61d8eaa1 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Wed, 26 Jul 2023 14:00:39 +0200
Subject: [PATCH 03/13] Modify prot name to correspond in gff
---
private/data/Bnigra_hectar.tab | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/private/data/Bnigra_hectar.tab b/private/data/Bnigra_hectar.tab
index 7d62a5ec..d32d333f 100644
--- a/private/data/Bnigra_hectar.tab
+++ b/private/data/Bnigra_hectar.tab
@@ -1,2 +1,2 @@
protein id predicted targeting category signal peptide score signal peptide cleavage site type II signal anchor score chloroplast score mitochondrion score other score
-BniB01g000010.2N.1-P other localisation 0.0583 - 0.0228 - 0.1032 0.8968
+BniB01g000010.2N.1 other localisation 0.0583 - 0.0228 - 0.1032 0.8968
From 99e743953081486ff5360c5dea05ca9ae8001f79 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Wed, 26 Jul 2023 15:53:28 +0200
Subject: [PATCH 04/13] Add Hectar to ui (#31)
---
imports/ui/singleGenePage/SingleGenePage.jsx | 1 +
imports/ui/singleGenePage/hectar/Hectar.jsx | 271 +++++++++++++++++++
imports/ui/singleGenePage/hectar/hectar.scss | 4 +
3 files changed, 276 insertions(+)
create mode 100644 imports/ui/singleGenePage/hectar/Hectar.jsx
create mode 100644 imports/ui/singleGenePage/hectar/hectar.scss
diff --git a/imports/ui/singleGenePage/SingleGenePage.jsx b/imports/ui/singleGenePage/SingleGenePage.jsx
index 4ff5cccf..3782901f 100644
--- a/imports/ui/singleGenePage/SingleGenePage.jsx
+++ b/imports/ui/singleGenePage/SingleGenePage.jsx
@@ -16,6 +16,7 @@ import Genemodel from './Genemodel.jsx';
import Seq from './Seq.jsx';
import ProteinDomains from './ProteinDomains.jsx';
import Eggnog from './eggnog/Eggnog.jsx';
+import Hectar from './hectar/Hectar.jsx';
import SequenceSimilarity from './alignment/SequenceSimilarity.jsx';
import Orthogroup from './orthoGroup/Orthogroup.jsx';
diff --git a/imports/ui/singleGenePage/hectar/Hectar.jsx b/imports/ui/singleGenePage/hectar/Hectar.jsx
new file mode 100644
index 00000000..e0679680
--- /dev/null
+++ b/imports/ui/singleGenePage/hectar/Hectar.jsx
@@ -0,0 +1,271 @@
+/* eslint-disable react/prop-types */
+import { hectarCollection } from '/imports/api/genes/hectar/hectarCollection.js';
+import { branch, compose } from '/imports/ui/util/uiUtil.jsx';
+import { Genes } from '/imports/api/genes/geneCollection.js';
+import { withTracker } from 'meteor/react-meteor-data';
+import React, { useEffect, useState } from 'react';
+import { Meteor } from 'meteor/meteor';
+import './hectar.scss';
+
+function Header() {
+ return (
+ <>
+
+ Hectar annotations
+ >
+ );
+}
+
+function hasNoHectar({ hectar }) {
+ return typeof hectar === 'undefined';
+}
+
+function NoHectar({ showHeader }) {
+ return (
+ <>
+ {showHeader && }
+
+
+
No Hectar annotations found
+
+
+ >
+ );
+}
+
+function hectarDataTracker({ gene }) {
+ const hectarSub = Meteor.subscribe('hectar', gene.hectarId);
+ const loading = !hectarSub.ready();
+ const hectar = hectarCollection.findOne({});
+
+ return {
+ loading,
+ gene,
+ hectar,
+ };
+}
+
+function Localisation({ annot }) {
+ return (
+
+ { annot }
+
+ );
+}
+
+function SigPepScore({ sigPep }) {
+ return (
+
+ { sigPep }
+
+ );
+}
+
+function SigPepClivScore({ sigPepCli }) {
+ return (
+
+ { sigPepCli }
+
+ );
+}
+
+function TIISigAncScore({ sigAnchor }) {
+ return (
+
+ { sigAnchor }
+
+ );
+}
+
+function ChloroScore({ chloro }) {
+ return (
+
+ { chloro }
+
+ );
+}
+
+function MitoScore({ mito }) {
+ return (
+
+ { mito }
+
+ );
+}
+
+
+function OtherScore({ other }) {
+ return (
+
+ { other }
+
+ );
+}
+
+function HectarGeneralInformations({ informations, maxArray = 5 }) {
+ const maxChar = 70;
+ const maxArrayLines = maxArray;
+ const infoIsArray = Array.isArray(informations);
+ const isMaxArray = informations.length > maxArrayLines;
+ const isMaxChar = informations.length > maxChar;
+
+ const [openInfo, setOpenInfo] = useState(false);
+ const [descArray, setDescArray] = useState([]);
+ const [descChar, setDescChar] = useState('');
+
+ useEffect(() => {
+ if (infoIsArray) {
+ if (openInfo) {
+ setDescArray(informations);
+ } else {
+ setDescArray(informations.slice(0, maxArrayLines));
+ }
+ } else {
+ if (informations.length > maxChar) {
+ if (openInfo === false) {
+ const descNoArray = informations
+ ? `${informations.slice(0, maxChar)} ... `
+ : informations;
+ setDescChar(descNoArray);
+ } else {
+ setDescChar(informations);
+ }
+ } else {
+ setDescChar(informations);
+ }
+ }
+ }, [openInfo]);
+
+ const buttonText = (() => {
+ if (infoIsArray) {
+ if (openInfo) {
+ return 'Show less';
+ }
+ return `Show ${informations.length - maxArrayLines} more ...`;
+ } else {
+ if (openInfo) {
+ return 'Show less';
+ }
+ return 'Show more ...';
+ }
+ })();
+
+ return (
+ <>
+ {
+ infoIsArray
+ (
+ { descChar }
+ )
+ }
+ >
+ );
+}
+
+function ArrayHectarAnnotations({ hectar }) {
+ return (
+
+
+
+
+
+ General informations
+ |
+
+
+
+ Sub-cellular localisation prediction
+ |
+
+ { hectar.predicted_targeting_category && }
+ |
+
+
+
+ Signal peptide score
+ |
+
+ { hectar.signal_peptide_score && }
+ |
+
+
+
+ Signal peptide cleavage site score
+ |
+
+ { hectar.signal_peptide_cleavage_site && }
+ |
+
+
+
+ TypeII signal anchor score
+ |
+
+ {
+ hectar.typeII_signal_anchor_score
+ && (
+
+ )
+ }
+ |
+
+
+
+ Chloroplastic protein score
+ |
+
+ {
+ hectar.chloroplast_score
+ && (
+
+ )
+ }
+ |
+
+
+
+ Mitochondrial protein score
+ |
+
+ {
+ hectar.mitochondrion_score
+ && (
+
+ )
+ }
+ |
+
+
+
+ Other localisation score
+ |
+
+ {
+ hectar.other_score
+ && (
+
+ )
+ }
+ |
+
+
+
+
+ );
+}
+
+function HectarAnnotation({ showHeader = false, hectar }) {
+ return (
+ <>
+ { showHeader && }
+
+ >
+ );
+}
+
+export default compose(
+ withTracker(hectarDataTracker),
+ branch(hasNoHectar, NoHectar),
+)(HectarAnnotation);
diff --git a/imports/ui/singleGenePage/hectar/hectar.scss b/imports/ui/singleGenePage/hectar/hectar.scss
new file mode 100644
index 00000000..98be477b
--- /dev/null
+++ b/imports/ui/singleGenePage/hectar/hectar.scss
@@ -0,0 +1,4 @@
+.table-hectar {
+ width: 100%;
+ table-layout: fixed;
+}
From 5cbdc7d6dbfbbec5dc01cd40dceaa56b1fc49856 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Wed, 26 Jul 2023 15:56:22 +0200
Subject: [PATCH 05/13] add Hectar infos (#31)
---
imports/api/genes/geneCollection.js | 6 ++++++
imports/api/publications.js | 5 +++++
tests/main.js | 1 +
3 files changed, 12 insertions(+)
diff --git a/imports/api/genes/geneCollection.js b/imports/api/genes/geneCollection.js
index c741c79e..cc093e3e 100644
--- a/imports/api/genes/geneCollection.js
+++ b/imports/api/genes/geneCollection.js
@@ -173,6 +173,12 @@ const GeneSchema = new SimpleSchema(
optional: true,
label: 'eggnog DB identifier (_id in eggnog collection)',
},
+ hectarId: {
+ type: String,
+ index: true,
+ optional: true,
+ label: 'Hectar identifier (_id in hectar collection)',
+ },
seqid: {
type: String,
label: 'ID of the sequence on which the gene is, e.g. chr1',
diff --git a/imports/api/publications.js b/imports/api/publications.js
index b8f14428..e82906bb 100644
--- a/imports/api/publications.js
+++ b/imports/api/publications.js
@@ -9,6 +9,7 @@ import { attributeCollection } from '/imports/api/genes/attributeCollection.js';
import { dbxrefCollection } from '/imports/api/genes/dbxrefCollection.js';
import { EditHistory } from '/imports/api/genes/edithistory_collection.js';
import { eggnogCollection } from '/imports/api/genes/eggnog/eggnogCollection.js';
+import { hectarCollection } from '/imports/api/genes/hectar/hectarCollection.js';
import { interproscanCollection } from '/imports/api/genes/interproscan/interproscanCollection.js';
import { similarSequencesCollection } from '/imports/api/genes/alignment/similarSequenceCollection.js';
// orthogroups
@@ -179,6 +180,10 @@ Meteor.publish({
const eggnog = eggnogCollection.find({_id: query});
return eggnog;
},
+ hectar(query) {
+ const hectar = hectarCollection.find({_id: query});
+ return hectar;
+ },
alignment(gene) {
const diamond = similarSequencesCollection.find(
{
diff --git a/tests/main.js b/tests/main.js
index 7b3a444a..aa6a4c5d 100644
--- a/tests/main.js
+++ b/tests/main.js
@@ -10,6 +10,7 @@ if (Meteor.isServer) {
import '../imports/api/genomes/annotation/addAnnotation.test';
import '../imports/api/genes/alignment/alignment.test.js';
import '../imports/api/genes/eggnog/eggnog.test.js';
+ import '../imports/api/genes/hectar/hectar.test.js';
import '../imports/api/genes/interproscan/interproscan.test.js';
import '../imports/api/transcriptomes/transcriptomes.test.js';
import '../imports/api/genes/download/download.test.js';
From d923337b26372217d7b4452803bba960390f3471 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Wed, 26 Jul 2023 16:08:49 +0200
Subject: [PATCH 06/13] Fix hectar main page (#31)
---
imports/ui/singleGenePage/SingleGenePage.jsx | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/imports/ui/singleGenePage/SingleGenePage.jsx b/imports/ui/singleGenePage/SingleGenePage.jsx
index 3782901f..983cce10 100644
--- a/imports/ui/singleGenePage/SingleGenePage.jsx
+++ b/imports/ui/singleGenePage/SingleGenePage.jsx
@@ -116,6 +116,11 @@ function SingleGenePage({ gene, genome = {} }) {
EggNOG
+
+
+ Hectar
+
+
Sequence Similarity
@@ -148,6 +153,9 @@ function SingleGenePage({ gene, genome = {} }) {
+
From 9dc798f7fa16500054ea14b0297afbd4144c5fcd Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Thu, 27 Jul 2023 11:18:45 +0200
Subject: [PATCH 07/13] Fix (#31)
---
imports/api/api.js | 1 +
imports/api/genes/hectar/addHectar.js | 4 ++--
2 files changed, 3 insertions(+), 2 deletions(-)
diff --git a/imports/api/api.js b/imports/api/api.js
index 6632a5dd..486c50aa 100644
--- a/imports/api/api.js
+++ b/imports/api/api.js
@@ -55,5 +55,6 @@ import './jobqueue/process-blast.js';
import './jobqueue/process-download.js';
import './jobqueue/process-addGenome.js';
import './jobqueue/process-eggnog.js';
+import './jobqueue/process-hectar.js';
import './jobqueue/process-similarsequences.js';
import './jobqueue/process-orthogroup.js';
diff --git a/imports/api/genes/hectar/addHectar.js b/imports/api/genes/hectar/addHectar.js
index b08d8806..43ab76cc 100644
--- a/imports/api/genes/hectar/addHectar.js
+++ b/imports/api/genes/hectar/addHectar.js
@@ -66,8 +66,8 @@ class HectarProcessor {
// MMUCEDO_000002-T1).
const subfeatureIsFound = Genes.findOne({
$or: [
- { 'subfeatures.ID': protein_id },
- { 'subfeatures.protein_id': protein_id },
+ { 'subfeatures.ID': proteinId },
+ { 'subfeatures.protein_id': proteinId },
],
});
From c5f0678dbaeaa2787982a163867596dc7fa68677 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Thu, 27 Jul 2023 11:37:53 +0200
Subject: [PATCH 08/13] Tab instead of spaces (#31)
---
private/data/Bnigra_hectar.tab | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/private/data/Bnigra_hectar.tab b/private/data/Bnigra_hectar.tab
index d32d333f..3926ca41 100644
--- a/private/data/Bnigra_hectar.tab
+++ b/private/data/Bnigra_hectar.tab
@@ -1,2 +1,2 @@
-protein id predicted targeting category signal peptide score signal peptide cleavage site type II signal anchor score chloroplast score mitochondrion score other score
-BniB01g000010.2N.1 other localisation 0.0583 - 0.0228 - 0.1032 0.8968
+protein id predicted targeting category signal peptide score signal peptide cleavage site type II signal anchor score chloroplast score mitochondrion score other score
+BniB01g000010.2N.1 other localisation 0.0583 - 0.0228 - 0.1032 0.8968
From 4604f9228ce2d8d677d2917a6981ab88c8811184 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Thu, 27 Jul 2023 11:46:13 +0200
Subject: [PATCH 09/13] Remove links (#31)
---
imports/ui/singleGenePage/hectar/Hectar.jsx | 88 ++++-----------------
1 file changed, 14 insertions(+), 74 deletions(-)
diff --git a/imports/ui/singleGenePage/hectar/Hectar.jsx b/imports/ui/singleGenePage/hectar/Hectar.jsx
index e0679680..ec22abe0 100644
--- a/imports/ui/singleGenePage/hectar/Hectar.jsx
+++ b/imports/ui/singleGenePage/hectar/Hectar.jsx
@@ -47,118 +47,58 @@ function hectarDataTracker({ gene }) {
function Localisation({ annot }) {
return (
-
+
{ annot }
-
+
);
}
function SigPepScore({ sigPep }) {
return (
-
+
{ sigPep }
-
+
);
}
function SigPepClivScore({ sigPepCli }) {
return (
-
+
{ sigPepCli }
-
+
);
}
function TIISigAncScore({ sigAnchor }) {
return (
-
+
{ sigAnchor }
-
+
);
}
function ChloroScore({ chloro }) {
return (
-
+
{ chloro }
-
+
);
}
function MitoScore({ mito }) {
return (
-
+
{ mito }
-
+
);
}
function OtherScore({ other }) {
return (
-
+
{ other }
-
- );
-}
-
-function HectarGeneralInformations({ informations, maxArray = 5 }) {
- const maxChar = 70;
- const maxArrayLines = maxArray;
- const infoIsArray = Array.isArray(informations);
- const isMaxArray = informations.length > maxArrayLines;
- const isMaxChar = informations.length > maxChar;
-
- const [openInfo, setOpenInfo] = useState(false);
- const [descArray, setDescArray] = useState([]);
- const [descChar, setDescChar] = useState('');
-
- useEffect(() => {
- if (infoIsArray) {
- if (openInfo) {
- setDescArray(informations);
- } else {
- setDescArray(informations.slice(0, maxArrayLines));
- }
- } else {
- if (informations.length > maxChar) {
- if (openInfo === false) {
- const descNoArray = informations
- ? `${informations.slice(0, maxChar)} ... `
- : informations;
- setDescChar(descNoArray);
- } else {
- setDescChar(informations);
- }
- } else {
- setDescChar(informations);
- }
- }
- }, [openInfo]);
-
- const buttonText = (() => {
- if (infoIsArray) {
- if (openInfo) {
- return 'Show less';
- }
- return `Show ${informations.length - maxArrayLines} more ...`;
- } else {
- if (openInfo) {
- return 'Show less';
- }
- return 'Show more ...';
- }
- })();
-
- return (
- <>
- {
- infoIsArray
- (
- { descChar }
- )
- }
- >
+
);
}
From f01d7d9fa36c49ecc5c1c93e0abf60c870f6e96a Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Thu, 27 Jul 2023 14:20:40 +0200
Subject: [PATCH 10/13] Pass first line of file (#31)
---
imports/api/genes/hectar/addHectar.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/imports/api/genes/hectar/addHectar.js b/imports/api/genes/hectar/addHectar.js
index 43ab76cc..413af13d 100644
--- a/imports/api/genes/hectar/addHectar.js
+++ b/imports/api/genes/hectar/addHectar.js
@@ -26,7 +26,7 @@ class HectarProcessor {
}
parse = (line) => {
- if (!(line[0] === '#' || line.split('\t').length <= 1)) {
+ if (!(line.slice(0,10) === 'protein id' || line.split('\t').length <= 1)) {
// Get all hectar informations line by line and separated by tabs.
const [
proteinId,
@@ -61,7 +61,7 @@ class HectarProcessor {
annotations[key] = value.split(',');
}
}
-
+ console.log(proteinId);
// If subfeatures is found in genes database (e.g: ID =
// MMUCEDO_000002-T1).
const subfeatureIsFound = Genes.findOne({
@@ -72,6 +72,7 @@ class HectarProcessor {
});
if (typeof subfeatureIsFound !== 'undefined') {
+ console.log("if loop" + typeof subfeatureIsFound);
// Increment hectar.
this.nHectar += 1;
From aa4445e956d7c095e9d571eeaea459d3a849a3d7 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Mon, 21 Aug 2023 10:55:08 +0200
Subject: [PATCH 11/13] Remove console.log
---
imports/api/genes/hectar/addHectar.js | 1 -
1 file changed, 1 deletion(-)
diff --git a/imports/api/genes/hectar/addHectar.js b/imports/api/genes/hectar/addHectar.js
index 413af13d..7c8ebf6d 100644
--- a/imports/api/genes/hectar/addHectar.js
+++ b/imports/api/genes/hectar/addHectar.js
@@ -61,7 +61,6 @@ class HectarProcessor {
annotations[key] = value.split(',');
}
}
- console.log(proteinId);
// If subfeatures is found in genes database (e.g: ID =
// MMUCEDO_000002-T1).
const subfeatureIsFound = Genes.findOne({
From 23c01f6cb95607d21f1d343be2c569e78a2963f1 Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Mon, 21 Aug 2023 11:57:28 +0200
Subject: [PATCH 12/13] Fix typo
---
imports/api/genes/hectar/hectar.test.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/imports/api/genes/hectar/hectar.test.js b/imports/api/genes/hectar/hectar.test.js
index b9bebd0a..c63e74b3 100644
--- a/imports/api/genes/hectar/hectar.test.js
+++ b/imports/api/genes/hectar/hectar.test.js
@@ -3,7 +3,7 @@ import { resetDatabase } from 'meteor/xolvio:cleaner';
import chai from 'chai';
import logger from '../../util/logger';
import { hectarCollection } from './hectarCollection';
-import addhectar from './addHectar';
+import addHectar from './addHectar';
import { addTestUsers, addTestGenome } from '../../../startup/server/fixtures/addTestData';
import '../../jobqueue/process-hectar';
From f5d16d96b6e2e66c0c4e0a1ea5f4c27225b461fd Mon Sep 17 00:00:00 2001
From: Kamassau
Date: Mon, 21 Aug 2023 12:08:53 +0200
Subject: [PATCH 13/13] Fix typo and protein_id
---
imports/api/genes/hectar/hectar.test.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/imports/api/genes/hectar/hectar.test.js b/imports/api/genes/hectar/hectar.test.js
index c63e74b3..dbc210f8 100644
--- a/imports/api/genes/hectar/hectar.test.js
+++ b/imports/api/genes/hectar/hectar.test.js
@@ -32,7 +32,7 @@ describe('hectar', function testHectar() {
addTestGenome(annot = true);
const hectarParams = {
- fileName: 'assets/app/data/Bnigra_hectar.tsv',
+ fileName: 'assets/app/data/Bnigra_hectar.tab',
};
// Should fail for non-logged in
@@ -49,7 +49,7 @@ describe('hectar', function testHectar() {
chai.assert.equal(result.nInserted, 1)
- const hecs = hectarCollection.find({ protein_id: 'BniB01g000010.2N.1-P' }).fetch();
+ const hecs = hectarCollection.find({ protein_id: 'BniB01g000010.2N.1' }).fetch();
chai.assert.lengthOf(hecs, 1, 'No hectar data found');