28std::shared_ptr<DataOutputDirector> AnalysisSupportHelpers::getDataOutputDirector(
ConfigContext const& ctx)
30 auto const& options = ctx.
options();
34 std::shared_ptr<DataOutputDirector> dod = std::make_shared<DataOutputDirector>();
38 std::string rdn, resdir(
"./");
39 std::string fnb, fnbase(
"AnalysisResults_trees");
40 float mfs, maxfilesize(-1.);
41 std::string fmo, filemode(
"RECREATE");
42 int ntfm, ntfmerge = 1;
45 if (options.isSet(
"aod-writer-json")) {
46 auto fnjson = options.get<std::string>(
"aod-writer-json");
47 if (!fnjson.empty()) {
48 std::tie(rdn, fnb, fmo, mfs, ntfm) = dod->readJson(fnjson);
68 if (options.isSet(
"aod-writer-resdir")) {
69 rdn = options.get<std::string>(
"aod-writer-resdir");
74 if (options.isSet(
"aod-writer-resfile")) {
75 fnb = options.get<std::string>(
"aod-writer-resfile");
80 if (options.isSet(
"aod-writer-resmode")) {
81 fmo = options.get<std::string>(
"aod-writer-resmode");
86 if (options.isSet(
"aod-writer-maxfilesize")) {
87 mfs = options.get<
float>(
"aod-writer-maxfilesize");
92 if (options.isSet(
"aod-writer-ntfmerge")) {
93 ntfm = options.get<
int>(
"aod-writer-ntfmerge");
99 if (options.isSet(
"aod-writer-keep")) {
100 auto keepString = options.get<std::string>(
"aod-writer-keep");
101 if (!keepString.empty()) {
103 std::string d(
"dangling");
104 if (d.find(keepString) == 0) {
106 std::vector<InputSpec> danglingOutputs;
107 for (
auto ii = 0u; ii < OutputsInputs.size(); ii++) {
108 if (DataSpecUtils::partialMatch(OutputsInputs[ii], writableAODOrigins) && isDangling[ii]) {
109 danglingOutputs.emplace_back(OutputsInputs[ii]);
112 dod->readSpecs(danglingOutputs);
115 dod->readString(keepString);
119 dod->setResultDir(resdir);
120 dod->setFilenameBase(fnbase);
121 dod->setFileMode(filemode);
122 dod->setMaximumFileSize(maxfilesize);
123 dod->setNumberTimeFramesToMerge(ntfmerge);
128void AnalysisSupportHelpers::addMissingOutputsToReader(std::vector<OutputSpec>
const& providedOutputs,
129 std::vector<InputSpec>
const& requestedInputs,
132 auto matchingOutputFor = [](
InputSpec const& requested) {
133 return [&requested](
OutputSpec const& provided) {
134 return DataSpecUtils::match(requested, provided);
137 for (
InputSpec const& requested : requestedInputs) {
138 auto provided = std::find_if(providedOutputs.begin(),
139 providedOutputs.end(),
140 matchingOutputFor(requested));
142 if (provided != providedOutputs.end()) {
146 auto inList = std::find_if(publisher.
outputs.begin(),
148 matchingOutputFor(requested));
149 if (inList != publisher.
outputs.end()) {
153 auto concrete = DataSpecUtils::asConcreteDataMatcher(requested);
154 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec, requested.lifetime, requested.metadata);
158void AnalysisSupportHelpers::addMissingOutputsToSpawner(std::vector<OutputSpec>
const& providedSpecials,
159 std::vector<InputSpec>
const& requestedSpecials,
160 std::vector<InputSpec>& requestedAODs,
163 for (
auto& input : requestedSpecials) {
164 if (std::any_of(providedSpecials.begin(), providedSpecials.end(), [&input](
auto const&
x) {
165 return DataSpecUtils::match(input, x);
169 auto concrete = DataSpecUtils::asConcreteDataMatcher(input);
170 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec);
171 for (
auto&
i : input.metadata) {
172 if ((
i.type == VariantType::String) && (
i.name.find(
"input:") != std::string::npos)) {
173 auto spec = DataSpecUtils::fromMetadataString(
i.defaultValue.get<std::string>());
174 auto j = std::find(publisher.
inputs.begin(), publisher.
inputs.end(), spec);
175 if (
j == publisher.
inputs.end()) {
176 publisher.
inputs.push_back(spec);
178 DataSpecUtils::updateInputList(requestedAODs, std::move(spec));
184void AnalysisSupportHelpers::addMissingOutputsToBuilder(std::vector<InputSpec>
const& requestedSpecials,
185 std::vector<InputSpec>& requestedAODs,
186 std::vector<InputSpec>& requestedDYNs,
189 for (
auto& input : requestedSpecials) {
190 auto concrete = DataSpecUtils::asConcreteDataMatcher(input);
191 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec);
192 for (
auto&
i : input.metadata) {
193 if ((
i.type == VariantType::String) && (
i.name.find(
"input:") != std::string::npos)) {
194 auto spec = DataSpecUtils::fromMetadataString(
i.defaultValue.get<std::string>());
195 auto j = std::find_if(publisher.
inputs.begin(), publisher.
inputs.end(), [&](
auto x) { return x.binding == spec.binding; });
196 if (
j == publisher.
inputs.end()) {
197 publisher.
inputs.push_back(spec);
199 if (DataSpecUtils::partialMatch(spec, AODOrigins)) {
200 DataSpecUtils::updateInputList(requestedAODs, std::move(spec));
202 DataSpecUtils::updateInputList(requestedDYNs, std::move(spec));
209void AnalysisSupportHelpers::addMissingOutputsToAnalysisCCDBFetcher(
210 std::vector<OutputSpec>
const& providedSpecials,
211 std::vector<InputSpec>
const& requestedSpecials,
212 std::vector<InputSpec>& requestedAODs,
213 std::vector<InputSpec>& requestedDYNs,
216 for (
auto& input : requestedSpecials) {
217 auto concrete = DataSpecUtils::asConcreteDataMatcher(input);
218 publisher.
outputs.emplace_back(concrete.origin, concrete.description, concrete.subSpec);
220 for (
auto&
i : input.metadata) {
221 if ((
i.type == VariantType::String) && (
i.name.find(
"input:") != std::string::npos)) {
222 auto value =
i.defaultValue.get<std::string>();
223 auto spec = DataSpecUtils::fromMetadataString(
i.defaultValue.get<std::string>());
224 auto j = std::find_if(publisher.
inputs.begin(), publisher.
inputs.end(), [&](
auto x) { return x.binding == spec.binding; });
225 if (
j == publisher.
inputs.end()) {
226 publisher.
inputs.push_back(spec);
228 if (DataSpecUtils::partialMatch(spec, AODOrigins)) {
229 DataSpecUtils::updateInputList(requestedAODs, std::move(spec));
231 DataSpecUtils::updateInputList(requestedDYNs, std::move(spec));
ServiceRegistryRef services() const
ConfigParamRegistry & options() const