File: AnnihilationWorker.h

package info (click to toggle)
ray 2.3.1-9
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 6,008 kB
  • sloc: cpp: 49,973; sh: 339; makefile: 281; python: 168
file content (141 lines) | stat: -rw-r--r-- 3,687 bytes parent folder | download | duplicates (5)
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