Project
Loading...
Searching...
No Matches
global-mapper.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11
16
17#include <iostream>
18#include <fstream>
19#include <filesystem>
20#include <map>
21#include <vector>
22#include <fmt/format.h>
23#include "boost/program_options.hpp"
24#include <rapidjson/document.h>
25#include <rapidjson/stringbuffer.h>
26#include <rapidjson/writer.h>
30
31namespace po = boost::program_options;
32
33void stripsInfo2json(const std::vector<o2::mid::ExtendedMappingInfo>& infos, const char* outDir)
34{
35 rapidjson::StringBuffer buffer;
36 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
37 writer.StartArray();
38 for (size_t idx = 0; idx < infos.size(); ++idx) {
39 writer.StartObject();
40 writer.Key("id");
41 writer.Int(infos[idx].id);
42 writer.Key("idx");
43 writer.Int(idx);
44 writer.Key("rpc");
45 writer.String(infos[idx].rpc.c_str());
46 writer.Key("deId");
47 writer.Int(infos[idx].deId);
48 writer.Key("columnId");
49 writer.Int(infos[idx].columnId);
50 writer.Key("lineId");
51 writer.Int(infos[idx].lineId);
52 writer.Key("stripId");
53 writer.Int(infos[idx].stripId);
54 writer.Key("cathode");
55 writer.Int(infos[idx].cathode);
56 writer.Key("locId");
57 writer.Int(infos[idx].locId);
58 writer.Key("locIdDcs");
59 writer.String(infos[idx].locIdDcs.c_str());
60 writer.Key("locIdHw");
61 writer.String(infos[idx].locIdHw.c_str());
62 writer.EndObject();
63 }
64 writer.EndArray();
65
66 std::ofstream outInfo(fmt::format("{}/stripInfo.json", outDir));
67 outInfo << buffer.GetString() << std::endl;
68}
69
70void strips2json(const std::vector<o2::mid::ExtendedMappingInfo>& infos, const char* outDir)
71{
72 rapidjson::StringBuffer buffer;
73 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
74
75 auto strip2json = [&](const o2::mid::ExtendedMappingInfo& info) {
76 writer.StartObject();
77 writer.Key("id");
78 writer.Int(info.id);
79 writer.Key("vertices");
80 writer.StartArray();
81 // (x1,y1)
82 writer.StartObject();
83 writer.Key("x");
84 writer.Int(info.xpos);
85 writer.Key("y");
86 writer.Int(info.ypos);
87 writer.EndObject();
88 // (x2,y1)
89 writer.StartObject();
90 writer.Key("x");
91 writer.Int(info.xpos + info.xwidth);
92 writer.Key("y");
93 writer.Int(info.ypos);
94 writer.EndObject();
95 // (x2,y2)
96 writer.StartObject();
97 writer.Key("x");
98 writer.Int(info.xpos + info.xwidth);
99 writer.Key("y");
100 writer.Int(info.ypos + info.ywidth);
101 writer.EndObject();
102 // (x1,y2)
103 writer.StartObject();
104 writer.Key("x");
105 writer.Int(info.xpos);
106 writer.Key("y");
107 writer.Int(info.ypos + info.ywidth);
108 writer.EndObject();
109 // (x1,y1)
110 writer.StartObject();
111 writer.Key("x");
112 writer.Int(info.xpos);
113 writer.Key("y");
114 writer.Int(info.ypos);
115 writer.EndObject();
116 writer.EndArray();
117 writer.EndObject();
118 };
119
120 std::array<std::string, 2> planes{"bending", "non-bending"};
121
122 for (int ide = 0; ide < o2::mid::detparams::NDetectionElements; ++ide) {
123 for (int icath = 0; icath < 2; ++icath) {
124 std::string fname = fmt::format("{}/strips.{}.{}.json", outDir, ide, planes[icath]);
125 writer.StartArray();
126 for (auto& info : infos) {
127 if (info.deId == ide && info.cathode == icath) {
128 strip2json(info);
129 }
130 }
131 writer.EndArray();
132 std::ofstream outFile(fname);
133 outFile << buffer.GetString() << std::endl;
134 buffer.Clear();
135 }
136 }
137}
138
139void de2json(const std::map<int, std::vector<std::pair<int, int>>>& deMap, const char* outDir)
140{
141 rapidjson::StringBuffer buffer;
142 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
143 for (auto& item : deMap) {
144 buffer.Clear();
145 writer.StartObject();
146 writer.Key("deId");
147 writer.Int(item.first);
148 writer.Key("vertices");
149 writer.StartArray();
150 for (auto& vtx : item.second) {
151 writer.StartObject();
152 writer.Key("x");
153 writer.Int(vtx.first);
154 writer.Key("y");
155 writer.Int(vtx.second);
156 writer.EndObject();
157 }
158 writer.EndArray();
159 writer.EndObject();
160
161 std::string fname = fmt::format("{}/de.{}.json", outDir, item.first);
162 std::ofstream outFile(fname);
163 outFile << buffer.GetString() << std::endl;
164 }
165}
166
167void writeJson(const std::vector<o2::mid::ExtendedMappingInfo>& infos, const std::map<int, std::vector<std::pair<int, int>>>& deMap, const char* outDir)
168{
169
170 if (!std::filesystem::exists(outDir)) {
171 std::filesystem::create_directory(outDir);
172 }
173 stripsInfo2json(infos, outDir);
174 strips2json(infos, outDir);
175 de2json(deMap, outDir);
176}
177
178int main(int argc, char* argv[])
179{
180 po::variables_map vm;
181 po::options_description generic("Generic options");
182
183 std::string outDir;
184
185 // clang-format off
186 generic.add_options()
187 ("help,h", "produce help message")
188 ("outdir,o", po::value<std::string>(&outDir)->default_value("midmapping"), "Output directory")
189 ;
190 // clang-format on
191
192 po::options_description cmdline;
193 cmdline.add(generic);
194
195 po::store(po::command_line_parser(argc, argv).options(cmdline).run(), vm);
196
197 if (vm.count("help")) {
198 std::cout << generic << "\n";
199 return 2;
200 }
201
202 try {
203 po::notify(vm);
204 } catch (boost::program_options::error& e) {
205 std::cout << "Error: " << e.what() << "\n";
206 exit(1);
207 }
208
210 gm.setScaleFactor(2);
211 auto infos = gm.buildStripsInfo();
212 auto deMap = gm.buildDEGeom();
213
214 writeJson(infos, deMap, outDir.c_str());
215 return 0;
216}
Useful detector parameters for MID.
Extended mapping info.
Global mapper for MID.
void de2json(const std::map< int, std::vector< std::pair< int, int > > > &deMap, const char *outDir)
void stripsInfo2json(const std::vector< o2::mid::ExtendedMappingInfo > &infos, const char *outDir)
void writeJson(const std::vector< o2::mid::ExtendedMappingInfo > &infos, const std::map< int, std::vector< std::pair< int, int > > > &deMap, const char *outDir)
void strips2json(const std::vector< o2::mid::ExtendedMappingInfo > &infos, const char *outDir)
Global mapper for MID.
void setScaleFactor(int scaleFactor)
Sets the scale factor for geometrical positions and sizes.
std::map< int, std::vector< std::pair< int, int > > > buildDEGeom() const
Build the geometry for the Detection elements.
std::vector< ExtendedMappingInfo > buildStripsInfo() const
Build the strips info.
GLuint buffer
Definition glcorearb.h:655
constexpr int NDetectionElements
Number of RPCs.
#define main