9#include "GaudiKernel/EventContext.h"
19 ISvcLocator* pSvcLocator)
30 return StatusCode::SUCCESS;
37 if (
m_done.load(std::memory_order_acquire)) {
38 return StatusCode::SUCCESS;
41 bool expected =
false;
42 if (!
m_done.compare_exchange_strong(expected,
true, std::memory_order_acq_rel)) {
43 return StatusCode::SUCCESS;
51 return StatusCode::FAILURE;
53 output <<
"DetectorResourceID,True DetectorResourceID,FELIX Card Name,Uplink Pin,DMA buffer,SourceID\n";
55 std::vector<int> dma_buffer_vec =
DmaBuffer();
57 for (
size_t i = 0; i <
m_rows.size(); ++i) {
59 const auto w_and_fe_id =
waferId(row);
60 const Identifier&
id = std::get<0>(w_and_fe_id);
61 const int fe = std::get<1>(w_and_fe_id);
62 std::bitset<32>
onlineId = std::get<2>(w_and_fe_id);
63 const std::string waferId_str =
id.get_identifier32().getString();
69 std::bitset<32> sID =
sourceID(
parseSPChain(row.spChain), row.flx_card_device, dma_buffer_vec[i]);
71 std::string
x = waferId_str.substr(0, waferId_str.length() - 2 );
78 std::bitset<32> febits = std::bitset<32>(fe);
82 output << waferId_str <<
"\t"
84 << b.to_string() <<
"\t"
85 << febits.to_string() <<
"\t"
90 << std::hex<<
onlineId.to_ulong() <<
"\t";
93 std::stringstream
res;
94 res << std::hex << std::uppercase << b.to_ulong();
97 output << std::hex << (b|
onlineId).to_ulong() <<
","
99 << row.flx_card_device <<
","
101 << dma_buffer_vec[i] <<
","
102 << sID.to_ulong() <<
"\n";
107 return StatusCode::SUCCESS;
112 if (resolvedCsv.empty()) {
114 return StatusCode::FAILURE;
118 std::ifstream input(resolvedCsv);
121 return StatusCode::FAILURE;
128 bool firstLine =
true;
129 while (std::getline(input, line)) {
138 const std::vector<std::string> fields =
splitCsvLine(line);
139 if (fields.size() < 5) {
145 row.spChain =
trim(fields[0]);
146 row.md =
trim(fields[1]);
147 row.fe = std::stoi(
trim(fields[2]));
148 row.flx_card_device =
trim(fields[3]);
149 row.fiber =
static_cast<unsigned int>(std::stoul(
trim(fields[4])));
151 m_rows.push_back(std::move(row));
155 return StatusCode::SUCCESS;
163 std::vector<std::string> spChain_cur =
parseSPChain(row.spChain);
169 int fe_n =
feID(spChain_cur, row.fe );
170 std::bitset<32> online_id =
onlineId(spChain_cur, row.md, row.fe);
176 const auto begin = input.find_first_not_of(
" \t\r\n");
177 if (begin == std::string::npos) {
181 const auto end = input.find_last_not_of(
" \t\r\n");
182 return input.substr(begin, end - begin + 1);
186 std::vector<std::string> fields;
187 std::stringstream
ss(line);
190 while (std::getline(
ss, field,
',')) {
191 fields.push_back(field);
198 std::vector<std::string> elements;
199 std::stringstream
ss(spChain);
202 while (std::getline(
ss, element,
'-')) {
203 elements.push_back(element);
212 if (spchain[1] ==
"IS" &&
213 (spchain[2] ==
"L0" || spchain[2] ==
"L1") &&
214 spchain.at(3)[0] !=
'R') {
217 else if (spchain[1] ==
"OB" &&
218 (spchain[2] ==
"L2" || spchain[2] ==
"L3" ||
219 spchain[2] ==
"L4") &&
220 (spchain.at(3)[0] ==
'B')) {
225 std::string sideAC = spchain[4];
226 if(sideAC !=
"A" && sideAC !=
"C"){
229 int side = (sideAC ==
"A")? 1 : -1;
237 return spchain.at(2)[1] -
'0';
240 if (spchain[2] ==
"L01" &&
241 (spchain.at(5) ==
"SP1" || spchain.at(5) ==
"SP3")) {
244 else if (spchain[2] ==
"L01" &&
245 (spchain.at(5) ==
"SP2" || spchain.at(5) ==
"SP4")) {
248 else if(spchain[1] ==
"OB" && (spchain[2] ==
"L2" ||
249 spchain[2] ==
"L3" ||
250 spchain[2] ==
"L4") ){
251 return (2* ((spchain.at(2))[1] -
'0') - 1);
253 else if(spchain[1] ==
"IS" && spchain[2] ==
"L05"){
256 else if(spchain[1] ==
"IS" && spchain[2] ==
"L1"){
259 else if(spchain[1] ==
"EC"){
260 return 2* (spchain.at(2)[1]-
'0');
275 std::string phi_str = (spchain.at(3)).substr(1,2);
276 if(ld == 0 || ld ==1 ){
277 return std::stoi(phi_str) - 1;
280 int phi = std::stoi(phi_str) - 1 ;
281 phi = (mod[2] ==
'T') ? 2*
phi + 1 : 2*
phi;
286 if (spchain[2] ==
"L01" &&
287 (spchain.at(5) ==
"SP1" || spchain.at(5) ==
"SP3")) {
288 std::string sp_str(1, (spchain.at(5)[2]));
290 return 6 * (stoi(mod) - 1 ) + 2 * (fe - 1);
292 else if(sp_str ==
"3"){
293 return 6 * (stoi(mod) - 1 ) + 2 * (fe - 1) + 1;
300 else if (spchain[2] ==
"L01" &&
301 (spchain.at(5) ==
"SP2" || spchain.at(5) ==
"SP4")) {
303 std::string sp_str(1, spchain.at(5)[2]);
305 return 2 * (stoi(mod) - 1 ) ;
307 else if(sp_str ==
"4"){
308 return 2 * (stoi(mod) - 1 ) + 1;
316 else if(ld == 3 || ld == 5 || ld ==7){
317 std::string phi_str = mod.substr(3,2);
318 int phi = std::stoi(phi_str);
322 return 6 * (stoi(mod) - 1 ) + 2 * (fe - 1);
325 std::string sp_str(1, spchain.at(5)[2]);
327 return 2 * (stoi(mod) - 1 ) ;
329 else if(sp_str ==
"2"){
330 return 2 * (stoi(mod) - 1 ) + 1;
334 else if(ld == 4 || ld == 6 || ld ==8){
335 std::string phi_str = mod.substr(2,2);
336 int phi = std::stoi(phi_str);
351 int side = (spchain[4] ==
"A") ? 1 : -1;
355 return side * (3 * (std::stoi(mod) -1) + fe );
358 return side * std::stoi(mod);
361 std::string eta_str(1, mod[4]);
362 int eta = std::stoi(eta_str);
372 if(spchain[2] ==
"L01"){
373 std::string eta_str = (spchain.at(3)).substr(1,2);
374 return std::stoi(eta_str);
376 else if(ld == 3 || ld == 5 || ld ==7){
377 std::string eta_str = (spchain.at(3)).substr(1,2);
378 return std::stoi(eta_str) - 1 ;
381 std::string eta_str = (spchain.at(3)).substr(1,2);
382 return std::stoi(eta_str) - 1;
385 std::string eta_str = (spchain.at(3)).substr(1,2);
386 return std::stoi(eta_str) + 14 ;
388 else if(ld == 4 || ld == 6 || ld ==8){
389 std::string eta_str = (spchain.at(3)).substr(1,2);
390 return std::stoi(eta_str) - 1 ;
414 std::bitset<32> febits(0);
416 int fe_id =
feID(spchain, fe);
421 if(ld == 1 || ld ==2 ){
423 febits = std::bitset<32>(0x30000000);
426 febits = std::bitset<32>(0xC0000000);
429 if(ld == 3 || ld == 4 ){
430 febits = std::bitset<32>(0xF0000000);
436 febits = std::bitset<32>(0x30000000);
439 febits = std::bitset<32>(0xC0000000);
442 if(ld == 5 || ld ==7){
443 febits = std::bitset<32>(0xF0000000);
445 if(ld == 4 && etamod < 5){
447 febits = std::bitset<32>(0x30000000);
450 febits = std::bitset<32>(0xC0000000);
455 febits = std::bitset<32>(0x30000000);
458 febits = std::bitset<32>(0xC0000000);
461 if(ld == 8 && etamod < 7){
462 febits = std::bitset<32>(0xF0000000);
464 if(ld == 8 && etamod >= 7){
466 febits = std::bitset<32>(0x30000000);
469 febits = std::bitset<32>(0xC0000000);
473 febits |= std::bitset<32>(
"00001100000000000000000000000000");
479 std::vector<int> dmaNumbers;
480 dmaNumbers.reserve(
m_rows.size());
483 while (i <
m_rows.size()) {
485 const std::string& card =
m_rows[i].flx_card_device;
487 unsigned int minFiber = std::numeric_limits<unsigned int>::max();
488 for (; j <
m_rows.size() &&
m_rows[j].flx_card_device == card; ++j) {
490 minFiber =
m_rows[j].fiber;
493 if (minFiber == std::numeric_limits<unsigned int>::max()) {
495 for (
size_t k = i; k < j; ++k){
496 dmaNumbers.push_back(9);
503 for (
size_t k = i; k < j; ++k) {
505 if (
m_rows[k].fiber >= minFiber) {
506 const int offset =
static_cast<int>(
m_rows[k].fiber) -
static_cast<int>(minFiber);
510 if(b_ec == 0 && ld ==0){
523 dmaNumbers.push_back(std::move(dma));
538 std::bitset<32> b(0);
539 std::bitset<32> subdet =
subDetID(b_ec, ld);
544 std::bitset<32> flxCard = std::bitset<32>(std::stoi(flx_card_device[0]));
546 std::bitset<32> flxDev = std::bitset<32>(std::stoi(flx_card_device[1]) - 1 );
548 std::bitset<32> dma_b = std::bitset<32>(dma);
550 b = subdet | flxCard | flxDev | dma_b;
557 std::vector<std::string> fields;
558 std::stringstream
ss(s);
561 while (std::getline(
ss, field,
'.')) {
562 fields.push_back(field);
564 if (fields.size() !=2){
567 if (fields[1] !=
"1" && fields[1] !=
"2" ){
575 if(barrel_endcap == 0){
577 return std::bitset<32>(0x16);
580 return std::bitset<32>(0x17);
583 else if(barrel_endcap == 2){
584 return std::bitset<32>(0x18);
586 else if(barrel_endcap == -2){
587 return std::bitset<32>(0x19);
590 ATH_MSG_ERROR(
"Wrong barrel_endcap value: " << barrel_endcap);
592 return std::bitset<32>(0);
Scalar eta() const
pseudorapidity method
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
std::pair< std::vector< unsigned int >, bool > res
This is an Identifier helper class for the Pixel subdetector.
const ServiceHandle< StoreGateSvc > & detStore() const
bool msgLvl(const MSG::Level lvl) const
An algorithm that can be simultaneously executed in multiple threads.
std::bitset< 32 > subDetID(int barrel_endcap, int layer_disk) const
virtual StatusCode initialize() override
virtual StatusCode execute(const EventContext &ctx) const override
static std::string trim(const std::string &input)
std::vector< std::string > splitFLX_card_device(const std::string &s) const
std::bitset< 32 > onlineId(const std::vector< std::string > &spchain, const std::string &mod, int fe) const
std::atomic< bool > m_done
static std::vector< std::string > splitCsvLine(const std::string &line)
const PixelID * m_pixIdHelper
std::vector< int > DmaBuffer() const
std::bitset< 32 > sourceID(const std::vector< std::string > &spchain, const std::string &flx, const unsigned int dma) const
std::vector< CsvRow > m_rows
int phi_module(const std::vector< std::string > &spchain, const std::string &mod, int fe) const
Gaudi::Property< std::string > m_outputFile
static std::vector< std::string > parseSPChain(const std::string &spChain)
int feID(const std::vector< std::string > &spchain, int fe) const
Gaudi::Property< std::string > m_csvFile
int barrel_ec(const std::vector< std::string > &spchain) const
std::tuple< Identifier, int, std::bitset< 32 > > waferId(const CsvRow &row) const
int eta_module(const std::vector< std::string > &spchain, const std::string &mod, int fe) const
ITkPixelCsvWaferIdAlg(const std::string &name, ISvcLocator *pSvcLocator)
int layer_disk(const std::vector< std::string > &spchain) const
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)