|
27 | 27 | #include <cassert> |
28 | 28 | #include <iostream> |
29 | 29 | #include <fstream> |
| 30 | +#include <sstream> |
| 31 | +#include <cstdlib> |
30 | 32 |
|
31 | 33 | ClassImp(o2::StepInfo); |
32 | 34 | ClassImp(o2::MagCallInfo); |
@@ -163,38 +165,29 @@ bool StepLookups::initSensitiveVolLookup(const std::string& filename) |
163 | 165 | auto vlist = gGeoManager->GetListOfVolumes(); |
164 | 166 | volidtoissensitive.resize(vlist->GetEntries(), false); |
165 | 167 |
|
166 | | - auto setSensitive = [this](int volID, bool sensitive) { |
167 | | - if (volID >= volidtoissensitive.size()) { |
168 | | - // should not happen |
169 | | - assert(false); |
170 | | - } |
171 | | - volidtoissensitive[volID] = sensitive; |
172 | | - }; |
173 | | - |
174 | | - // lambda returning all ids with that name |
175 | | - // assume the name to be unique |
176 | | - // unfortunately this is very slow: we should think about a more clever way |
177 | | - auto findSensVolumeAndRegister = [&vlist, setSensitive](const std::string& name) { |
178 | | - for (int i = 0; i < vlist->GetEntries(); ++i) { |
179 | | - auto v = static_cast<TGeoVolume*>(vlist->At(i)); |
180 | | - if (strlen(v->GetName()) == strlen(name.c_str())) { |
181 | | - if (strcmp(v->GetName(), name.c_str()) == 0) { |
182 | | - setSensitive(v->GetNumber(), true); |
183 | | - std::cout << "Registering " << v->GetNumber() << " as id for sensitive volume " << name << "\n"; |
184 | | - } |
185 | | - } |
186 | | - } |
187 | | - }; |
188 | | - |
189 | 168 | // open for reading or fail |
190 | 169 | std::ifstream ifs; |
191 | 170 | ifs.open(filename); |
192 | 171 | if (ifs.is_open()) { |
193 | 172 | std::string line; |
194 | 173 | std::vector<int> ids; |
195 | 174 | while (std::getline(ifs, line)) { |
196 | | - // a line is supposed to be a volume name |
197 | | - findSensVolumeAndRegister(line); |
| 175 | + std::istringstream ss(line); |
| 176 | + std::string token; |
| 177 | + // split the line into key + value |
| 178 | + int counter = 0; |
| 179 | + std::string keyvalue[2] = { "NULL", "NULL" }; |
| 180 | + while (counter < 2 && std::getline(ss, token, ':')) { |
| 181 | + if (!token.empty()) { |
| 182 | + keyvalue[counter] = token; |
| 183 | + counter++; |
| 184 | + } |
| 185 | + } |
| 186 | + // mark this as sensitive |
| 187 | + int index = atoi(keyvalue[0].c_str()); |
| 188 | + assert(index >= 0); |
| 189 | + assert(index < volidtoissensitive.size()); |
| 190 | + volidtoissensitive[index] = true; |
198 | 191 | } |
199 | 192 | return true; |
200 | 193 | } |
|
0 commit comments