1 /*
2  * HHDatabase.h
3  *
4  *  Created on: Apr 7, 2014
5  *      Author: meiermark
6  */
7 
8 #ifndef HHDATABASE_H_
9 #define HHDATABASE_H_
10 
11 class HHEntry;
12 class HHDatabaseEntry;
13 class Alignment;
14 class Prefilter;
15 
16 #include <cstdlib>
17 
18 #include "ffindexdatabase.h"
19 #include "hhutil.h"
20 #include "hash.h"
21 #include "hhhit.h"
22 #include "log.h"
23 #include "hhalignment.h"
24 
25 class HHDatabase {
26   public:
27     HHDatabase();
28     virtual ~HHDatabase();
29 
30     static bool checkDatabaseConflicts(const char* base);
31 
32 protected:
33     static void buildDatabaseName(const char* base, const char* extension,
34                                   const char* suffix, char* databaseName);
35 };
36 
37 class HHblitsDatabase: HHDatabase {
38   public:
39     HHblitsDatabase(const char* base, bool initCs219 = true);
40     ~HHblitsDatabase();
41 
42     void initPrefilter(const std::string& cs_library);
43     void initNoPrefilter(std::vector<HHEntry*>& new_prefilter_hits);
44     void initSelected(std::vector<std::string>& selected_templates,
45         std::vector<HHEntry*>& new_entries);
46 
47     void prefilter_db(HMM* q_tmp, Hash<Hit>* previous_hits, const int threads,
48         const int prefilter_gap_open, const int prefilter_gap_extend,
49         const int prefilter_score_offset, const int prefilter_bit_factor,
50         const double prefilter_evalue_thresh,
51         const double prefilter_evalue_coarse_thresh,
52         const int preprefilter_smax_thresh, const int min_prefilter_hits, const int maxnumdb,
53         const float R[20][20], std::vector<HHEntry*>& new_entries,
54         std::vector<HHEntry*>& old_entries);
55 
56     char* basename;
57 
58     FFindexDatabase* cs219_database;
59 
60     FFindexDatabase* a3m_database;
61     FFindexDatabase* hhm_database;
62 
63     FFindexDatabase* query_database;
64 
65     bool use_compressed;
66     FFindexDatabase* ca3m_database;
67     FFindexDatabase* sequence_database;
68     FFindexDatabase* header_database;
69 
70   private:
71     void getEntriesFromNames(std::vector<std::pair<int, std::string> >& names,
72         std::vector<HHEntry*>& entries);
73     bool checkAndBuildCompressedDatabase(const char* base);
74 
75     Prefilter* prefilter;
76 };
77 
78 class HHEntry {
79   public:
80     int sequence_length;
81 
82     HHEntry(int sequence_length);
83     virtual ~HHEntry();
84 
getTemplateA3M(Parameters & par,float * pb,const float S[20][20],const float Sim[20][20],Alignment & tali)85     virtual void getTemplateA3M(Parameters& par, float* pb, const float S[20][20],
86         const float Sim[20][20], Alignment& tali) {};
getTemplateHMM(Parameters & par,char use_global_weights,const float qsc,int & format,float * pb,const float S[20][20],const float Sim[20][20],HMM * t)87     virtual void getTemplateHMM(Parameters& par, char use_global_weights, const float qsc, int& format,
88         float* pb, const float S[20][20], const float Sim[20][20], HMM* t) {};
89 
getName()90     virtual char* getName() {return NULL;};
91 
92   protected:
93     void getTemplateHMM(FILE* inf, char* name, Parameters& par, char use_global_weights,
94         const float qsc, int& format, float* pb, const float S[20][20],
95         const float Sim[20][20], HMM* t);
96 };
97 
98 class HHDatabaseEntry : public HHEntry {
99   public:
100     HHDatabaseEntry(int sequence_length, HHblitsDatabase* hhdatabase, FFindexDatabase* ffdatabase, ffindex_entry_t* entry);
101     ~HHDatabaseEntry();
102 
103     void getTemplateA3M(Parameters& par, float* pb, const float S[20][20],
104         const float Sim[20][20], Alignment& tali);
105     void getTemplateHMM(Parameters& par, char use_global_weights, const float qsc, int& format,
106         float* pb, const float S[20][20], const float Sim[20][20], HMM* t);
107 
108     char* getName();
109 
110   private:
111     HHblitsDatabase* hhdatabase;
112     FFindexDatabase* ffdatabase;
113     ffindex_entry_t* entry;
114 };
115 
116 class HHFileEntry : public HHEntry {
117   public:
118     HHFileEntry(const char* file, int sequence_length);
119     ~HHFileEntry();
120 
121     void getTemplateA3M(Parameters& par, float* pb, const float S[20][20],
122         const float Sim[20][20], Alignment& tali);
123     void getTemplateHMM(Parameters& par, char use_global_weights, const float qsc, int& format,
124         float* pb, const float S[20][20], const float Sim[20][20], HMM* t);
125 
126     char* getName();
127 
128   private:
129     char* file;
130 };
131 
132 struct HHDatabaseEntryCompare {
operatorHHDatabaseEntryCompare133   bool operator()(const HHEntry* l, const HHEntry* r) {
134     return (*l).sequence_length > (*r).sequence_length;
135   }
136 };
137 
138 int getMaxTemplateLength(std::vector<HHEntry*>& entries);
139 
140 #endif /* HHDATABASE_H_ */
141