9#include <OpenMS/FORMAT/FileHandler.h>
10#include <OpenMS/FORMAT/FileTypes.h>
11#include <OpenMS/ANALYSIS/MAPMATCHING/FeatureGroupingAlgorithm.h>
12#include <OpenMS/DATASTRUCTURES/ListUtils.h>
13#include <OpenMS/CONCEPT/ProgressLogger.h>
14#include <OpenMS/METADATA/ExperimentalDesign.h>
15#include <OpenMS/FORMAT/ExperimentalDesignFile.h>
17#include <OpenMS/KERNEL/ConversionHelper.h>
19#include <OpenMS/APPLICATIONS/TOPPBase.h>
40class TOPPFeatureLinkerBase :
46 TOPPFeatureLinkerBase(String name, String description,
bool official =
true) :
47 TOPPBase(name, description, official)
52 void registerOptionsAndFlags_() override
54 registerInputFileList_(
"in",
"<files>", ListUtils::create<String>(
""),
"input files separated by blanks",
true);
55 setValidFormats_(
"in", ListUtils::create<String>(
"featureXML,consensusXML"));
56 registerOutputFile_(
"out",
"<file>",
"",
"Output file",
true);
57 setValidFormats_(
"out", ListUtils::create<String>(
"consensusXML"));
58 registerInputFile_(
"design",
"<file>",
"",
"input file containing the experimental design",
false);
59 setValidFormats_(
"design", ListUtils::create<String>(
"tsv"));
61 registerFlag_(
"keep_subelements",
"For consensusXML input only: If set, the sub-features of the inputs are transferred to the output.");
64 ExitCodes common_main_(FeatureGroupingAlgorithm * algorithm,
73 ins.push_back(getStringOption_(
"in"));
77 ins = getStringList_(
"in");
79 String out = getStringOption_(
"out");
85 FileTypes::Type file_type = FileHandler::getType(ins[0]);
86 for (Size i = 0; i < ins.size(); ++i)
88 if (FileHandler::getType(ins[i]) != file_type)
90 writeLogError_(
"Error: All input files must be of the same type!");
91 return ILLEGAL_PARAMETERS;
98 Param algorithm_param = getParam_().copy(
"algorithm:",
true);
99 writeDebug_(
"Used algorithm parameters", algorithm_param, 3);
100 algorithm->setParameters(algorithm_param);
106 ConsensusMap out_map;
107 StringList ms_run_locations;
114 design_file = getStringOption_(
"design");
117 if (file_type == FileTypes::CONSENSUSXML && !design_file.empty())
119 writeLogError_(
"Error: Using fractionated design with consensusXML als input is not supported!");
120 return ILLEGAL_PARAMETERS;
123 if (file_type == FileTypes::FEATUREXML)
125 OPENMS_LOG_INFO <<
"Linking " << ins.size() <<
" featureXMLs." << endl;
132 map<unsigned, vector<String>> frac2files;
134 if (!design_file.empty())
137 ExperimentalDesign ed = ExperimentalDesignFile::load(design_file,
false);
140 frac2files = ed.getFractionToMSFilesMapping();
142 writeDebug_(String(
"Grouping ") + String(ed.getNumberOfFractions()) +
" fractions.", 3);
145 if (!ed.sameNrOfMSFilesPerFraction())
147 writeLogError_(
"Error: Number of runs must match for every fraction!");
148 return ILLEGAL_PARAMETERS;
153 for (Size i = 0; i != ins.size(); ++i)
155 frac2files[1].emplace_back(String(
"file") + String(i));
159 vector<FeatureMap > maps(ins.size());
161 FeatureFileOptions param = f.getFeatOptions();
164 param.setLoadSubordinates(
false);
165 param.setLoadConvexHull(
false);
166 f.setFeatOptions(param);
169 setLogType(ProgressLogger::CMD);
170 startProgress(0, ins.size(),
"reading input");
171 for (Size i = 0; i < ins.size(); ++i)
174 f.loadFeatures(ins[i], tmp, {FileTypes::FEATUREXML});
177 tmp.getPrimaryMSRunPath(ms_runs);
180 if (ms_runs.size() > 1 || ms_runs.empty())
182 OPENMS_LOG_WARN <<
"Exactly one MS run should be associated with a FeatureMap. "
184 <<
" provided." << endl;
188 out_map.getColumnHeaders()[i].filename = ms_runs.front();
190 out_map.getColumnHeaders()[i].size = tmp.size();
191 out_map.getColumnHeaders()[i].unique_id = tmp.getUniqueId();
194 ms_run_locations.insert(ms_run_locations.end(), ms_runs.begin(), ms_runs.end());
197 for (Feature& ft : tmp)
202 if (ft.metaValueExists(Constants::UserParam::DC_CHARGE_ADDUCTS))
204 adduct = ft.getMetaValue(Constants::UserParam::DC_CHARGE_ADDUCTS);
206 if (ft.metaValueExists(Constants::UserParam::ADDUCT_GROUP))
208 group = ft.getMetaValue(Constants::UserParam::ADDUCT_GROUP);
210 ft.getSubordinates().clear();
211 ft.getConvexHulls().clear();
215 ft.setMetaValue(Constants::UserParam::DC_CHARGE_ADDUCTS, adduct);
219 ft.setMetaValue(
"Group", group);
225 maps[i].updateRanges();
227 setProgress(progress++);
234 out_map.getColumnHeaders()[1] = out_map.getColumnHeaders()[0];
235 out_map.getColumnHeaders()[0].label =
"light";
236 out_map.getColumnHeaders()[1].label =
"heavy";
237 ms_run_locations.push_back(ms_run_locations[0]);
243 if (frac2files.size() == 1)
245 algorithm->group(maps, out_map);
249 writeDebug_(String(
"Stored in ") + String(maps.size()) +
" maps.", 3);
250 for (Size i = 1; i <= frac2files.size(); ++i)
252 vector<FeatureMap> fraction_maps;
255 for (
size_t feature_map_index = 0; feature_map_index != frac2files[i].size(); ++feature_map_index)
257 fraction_maps.push_back(maps[feature_map_index]);
259 algorithm->group(fraction_maps, out_map);
267 bool keep_subelements = getFlag_(
"keep_subelements");
268 vector<ConsensusMap> maps(ins.size());
270 for (Size i = 0; i < ins.size(); ++i)
272 f.loadConsensusFeatures(ins[i], maps[i], {FileTypes::CONSENSUSXML});
273 maps[i].updateRanges();
276 maps[i].getPrimaryMSRunPath(ms_runs);
277 ms_run_locations.insert(ms_run_locations.end(), ms_runs.begin(), ms_runs.end());
278 if (keep_subelements)
280 auto saveOldMapIndex =
281 [](PeptideIdentification &p)
283 if (p.metaValueExists(
"map_index"))
285 p.setMetaValue(
"old_map_index", p.getMetaValue(
"map_index"));
289 OPENMS_LOG_WARN <<
"Warning: map_index not found in PeptideID. The tool will not be able to assign a"
290 "consistent one. Check the settings of previous tools." << std::endl;
293 maps[i].applyFunctionOnPeptideIDs(saveOldMapIndex,
true);
297 algorithm->group(maps, out_map);
301 if (!keep_subelements)
303 for (Size i = 0; i < ins.size(); ++i)
305 out_map.getColumnHeaders()[i].filename = ins[i];
306 out_map.getColumnHeaders()[i].size = maps[i].size();
307 out_map.getColumnHeaders()[i].unique_id = maps[i].getUniqueId();
314 algorithm->transferSubelements(maps, out_map);
319 out_map.applyMemberFunction(&UniqueIdInterface::setUniqueId);
322 addDataProcessing_(out_map,
323 getProcessingInfo_(DataProcessing::FEATURE_GROUPING));
327 out_map.sortPeptideIdentificationsByMapIndex();
330 FileHandler().storeConsensusFeatures(out, out_map, {FileTypes::CONSENSUSXML});
333 map<Size, UInt> num_consfeat_of_size;
334 for (
const ConsensusFeature& cf : out_map)
336 ++num_consfeat_of_size[cf.size()];
339 OPENMS_LOG_INFO <<
"Number of consensus features:" << endl;
340 for (map<Size, UInt>::reverse_iterator i = num_consfeat_of_size.rbegin();
341 i != num_consfeat_of_size.rend(); ++i)
343 OPENMS_LOG_INFO <<
" of size " << setw(2) << i->first <<
": " << setw(6)
344 << i->second << endl;
346 OPENMS_LOG_INFO <<
" total: " << setw(6) << out_map.size() << endl;
Definition FLASHDeconvWizardBase.cpp:26