1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 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
|
/*
* Ray -- Parallel genome assemblies for parallel DNA sequencing
* Copyright (C) 2013 Sébastien Boisvert
*
* http://DeNovoAssembler.SourceForge.Net/
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You have received a copy of the GNU General Public License
* along with this program (gpl-3.0.txt).
* see <http://www.gnu.org/licenses/>
*/
#ifndef _AnnihilationWorker_h
#define _AnnihilationWorker_h
#include "AttributeFetcher.h"
#include "AnnotationFetcher.h"
#include <code/SeedingData/GraphPath.h>
#include <code/Mock/Parameters.h>
#include <code/SeedExtender/Direction.h>
#include <RayPlatform/scheduling/Worker.h>
#include <stack>
#include <vector>
#include <set>
using namespace std;
#include <stdint.h>
/**
* This is a worker that analyze a seed.
*
* \author Sébastien Boisvert
*/
class AnnihilationWorker: public Worker{
AttributeFetcher m_attributeFetcher;
AnnotationFetcher m_annotationFetcher;
uint64_t m_identifier; // TODO this should be in Worker because it's always there anyway
bool m_done; // TODO this should be in Worker because it's always there anyway
GraphPath * m_seed;
VirtualCommunicator * m_virtualCommunicator; // TODO this should be in Worker because it's always there anyway
Parameters * m_parameters;
Kmer m_parent;
Kmer m_grandparent;
Kmer m_child;
Kmer m_grandchild;
int m_step;
MessageTag RAY_MPI_TAG_GET_VERTEX_EDGES_COMPACT;
MessageTag RAY_MPI_TAG_ASK_VERTEX_PATHS_SIZE;
MessageTag RAY_MPI_TAG_ASK_VERTEX_PATH;
int STEP_CHECK_LENGTH;
int STEP_CHECK_DEAD_END_ON_THE_LEFT;
int STEP_CHECK_DEAD_END_ON_THE_RIGHT;
int STEP_CHECK_BUBBLE_PATTERNS;
int STEP_FETCH_FIRST_PARENT;
int STEP_FETCH_SECOND_PARENT;
int STEP_DOWNLOAD_ORIGINAL_ANNOTATIONS;
int STEP_GET_SEED_SEQUENCE_NOW;
bool m_queryWasSent;
Rank m_rank;
RingAllocator*m_outboxAllocator;
bool m_startedToCheckDeadEndOnTheLeft;
bool m_startedToCheckDeadEndOnTheRight;
stack<int> m_depths;
stack<Kmer> m_vertices;
int m_maximumAllowedDepth;
int m_actualMaximumDepth;
int m_maximumDepthForExploration;
bool m_valid;
set<Kmer> m_visited;
bool m_searchIsStarted;
int DIRECTION_PARENTS;
int DIRECTION_CHILDREN;
bool m_fetchedFirstParent;
bool m_fetchedSecondParent;
bool m_fetchedFirstChild;
bool m_fetchedSecondChild;
vector<Direction> m_leftDirections;
vector<Direction> m_rightDirections;
bool m_fetchedGrandparentDirections;
bool m_fetchedGrandchildDirections;
bool m_fetchedGrandparentReverseDirections;
bool m_fetchedGrandchildReverseDirections;
bool m_isPerfectBubble;
// private methods
bool checkDeadEndOnTheLeft();
bool checkDeadEndOnTheRight();
bool searchGraphForNiceThings(int direction);
bool checkBubblePatterns();
bool getOtherBestParent(Kmer*kmer);
bool getOtherBestChild(Kmer*kmer);
bool getBestChild(Kmer*kmer);
bool getBestParent(Kmer*kmer);
public:
void work();
bool isDone();
WorkerHandle getWorkerIdentifier();
void initialize(uint64_t identifier, GraphPath*seed, Parameters * parameters,
VirtualCommunicator * virtualCommunicator,
RingAllocator * outboxAllocator,
MessageTag RAY_MPI_TAG_GET_VERTEX_EDGES_COMPACT,
MessageTag RAY_MPI_TAG_ASK_VERTEX_PATHS_SIZE, MessageTag RAY_MPI_TAG_ASK_VERTEX_PATH
);
bool isValid();
};
#endif
|