29std::shared_ptr<DataOutputDirector> AnalysisSupportHelpers::getDataOutputDirector(
ConfigContext const& ctx)
31 auto const& options = ctx.
options();
35 std::shared_ptr<DataOutputDirector> dod = std::make_shared<DataOutputDirector>();
39 std::string rdn, resdir(
"./");
40 std::string fnb, fnbase(
"AnalysisResults_trees");
41 float mfs, maxfilesize(-1.);
42 std::string fmo, filemode(
"RECREATE");
43 int ntfm, ntfmerge = 1;
46 if (options.isSet(
"aod-writer-json")) {
47 auto fnjson = options.get<std::string>(
"aod-writer-json");
48 if (!fnjson.empty()) {
49 std::tie(rdn, fnb, fmo, mfs, ntfm) = dod->readJson(fnjson);
69 if (options.isSet(
"aod-writer-resdir")) {
70 rdn = options.get<std::string>(
"aod-writer-resdir");
75 if (options.isSet(
"aod-writer-resfile")) {
76 fnb = options.get<std::string>(
"aod-writer-resfile");
81 if (options.isSet(
"aod-writer-resmode")) {
82 fmo = options.get<std::string>(
"aod-writer-resmode");
87 if (options.isSet(
"aod-writer-maxfilesize")) {
88 mfs = options.get<
float>(
"aod-writer-maxfilesize");
93 if (options.isSet(
"aod-writer-ntfmerge")) {
94 ntfm = options.get<
int>(
"aod-writer-ntfmerge");
100 if (options.isSet(
"aod-writer-keep")) {
101 auto keepString = options.get<std::string>(
"aod-writer-keep");
102 if (!keepString.empty()) {
104 std::string d(
"dangling");
105 if (d.find(keepString) == 0) {
107 std::vector<InputSpec> danglingOutputs;
108 for (
auto ii = 0u; ii < OutputsInputs.size(); ii++) {
109 if (DataSpecUtils::partialMatch(OutputsInputs[ii], writableAODOrigins) && isDangling[ii]) {
110 danglingOutputs.emplace_back(OutputsInputs[ii]);
113 dod->readSpecs(danglingOutputs);
116 dod->readString(keepString);
120 dod->setResultDir(resdir);
121 dod->setFilenameBase(fnbase);
122 dod->setFileMode(filemode);
123 dod->setMaximumFileSize(maxfilesize);
124 dod->setNumberTimeFramesToMerge(ntfmerge);
129void AnalysisSupportHelpers::addMissingOutputsToReader(std::vector<OutputSpec>
const& providedOutputs,
130 std::vector<InputSpec>
const& requestedInputs,
133 auto matchingOutputFor = [](
InputSpec const& requested) {
134 return [&requested](
OutputSpec const& provided) {
135 return DataSpecUtils::match(requested, provided);
138 for (
InputSpec const& requested : requestedInputs) {
139 auto provided = std::find_if(providedOutputs.begin(),
140 providedOutputs.end(),
141 matchingOutputFor(requested));
143 if (provided != providedOutputs.end()) {
147 auto inList = std::find_if(publisher.
outputs.begin(),
149 matchingOutputFor(requested));
150 if (inList != publisher.
outputs.end()) {
154 auto concrete = DataSpecUtils::asConcreteDataMatcher(requested);
155 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec, requested.lifetime, requested.metadata);
159void AnalysisSupportHelpers::addMissingOutputsToSpawner(std::vector<OutputSpec>
const& providedSpecials,
160 std::vector<InputSpec>
const& requestedSpecials,
161 std::vector<InputSpec>& requestedAODs,
164 for (
auto& input : requestedSpecials) {
165 if (std::any_of(providedSpecials.begin(), providedSpecials.end(), [&input](
auto const&
x) {
166 return DataSpecUtils::match(input, x);
170 auto concrete = DataSpecUtils::asConcreteDataMatcher(input);
171 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec);
172 for (
auto&
i : input.metadata) {
173 if ((
i.type == VariantType::String) && (
i.name.find(
"input:") != std::string::npos)) {
174 auto spec = DataSpecUtils::fromMetadataString(
i.defaultValue.get<std::string>());
175 auto j = std::find(publisher.
inputs.begin(), publisher.
inputs.end(), spec);
176 if (
j == publisher.
inputs.end()) {
177 publisher.
inputs.push_back(spec);
179 DataSpecUtils::updateInputList(requestedAODs, std::move(spec));
185void AnalysisSupportHelpers::addMissingOutputsToBuilder(std::vector<InputSpec>
const& requestedSpecials,
186 std::vector<InputSpec>& requestedAODs,
187 std::vector<InputSpec>& requestedDYNs,
190 for (
auto& input : requestedSpecials) {
191 auto concrete = DataSpecUtils::asConcreteDataMatcher(input);
192 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec);
193 for (
auto&
i : input.metadata) {
194 if ((
i.type == VariantType::String) && (
i.name.find(
"input:") != std::string::npos)) {
195 auto spec = DataSpecUtils::fromMetadataString(
i.defaultValue.get<std::string>());
196 auto j = std::find_if(publisher.
inputs.begin(), publisher.
inputs.end(), [&](
auto x) { return x.binding == spec.binding; });
197 if (
j == publisher.
inputs.end()) {
198 publisher.
inputs.push_back(spec);
200 if (DataSpecUtils::partialMatch(spec, AODOrigins)) {
201 DataSpecUtils::updateInputList(requestedAODs, std::move(spec));
203 DataSpecUtils::updateInputList(requestedDYNs, std::move(spec));
ServiceRegistryRef services() const
ConfigParamRegistry & options() const