ATLAS Offline Software
Loading...
Searching...
No Matches
interpretSeeds.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5#include <charconv>
6#include <iostream>
7#include <boost/tokenizer.hpp>
8
9#include "interpretSeeds.h"
10
11//get the luxury level, if specified. In that case moves token past it
12inline
13void getLuxury( boost::tokenizer<boost::char_separator<char> >::iterator& token, short& luxLevel) {
14 if ((*token) == "LUXURY") {
15 ++token;
16 uint32_t parsedValue = 0;
17 auto result = std::from_chars(token->data(), token->data() + token->size(), parsedValue);
18 if (result.ec != std::errc()) {
19 std::cerr << "Parsing error in function getLuxury." << std::endl;
20 }
21 luxLevel = parsedValue;
22 ++token;
23 }
24}
25
26//get the luxury level, if specified. In that case moves token past it
27inline
28void getOffset( boost::tokenizer<boost::char_separator<char> >::iterator& token, uint32_t& offset) {
29 if ((*token) == "OFFSET") {
30 ++token;
31 uint32_t parsedValue = 0;
32 auto result = std::from_chars(token->data(), token->data() + token->size(), parsedValue);
33 if (result.ec != std::errc()) {
34 std::cerr << "Parsing error in function getOffset." << std::endl;
35 }
36 offset = parsedValue;
37 ++token;
38 }
39}
40
41bool interpretSeeds(const std::string& buffer,
42 std::string& stream, uint32_t& seed1, uint32_t& seed2, short& luxury, uint32_t& offset)
43{
44 //split the space-separated string in 3 or 5 or 7 words:
45 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
46 boost::char_separator<char> sep(" ");
47 tokenizer tokens(buffer, sep);
48 int nToks(distance(tokens.begin(), tokens.end()));
49 bool status = (nToks == 3 || nToks == 5 || nToks == 7);
50 if (status) {
51 tokenizer::iterator token(tokens.begin());
52 stream = *token++;
53 //FIXME, try permutations by hand. With more than two we'd need a parser
54 getOffset(token, offset);
55 getLuxury(token, luxury);
56 getOffset(token, offset);
57 auto [ptr1, ec1] = std::from_chars(token->data(), token->data() + token->size(), seed1);
58 ++token;
59 auto [ptr2, ec2] = std::from_chars(token->data(), token->data() + token->size(), seed2);
60 ++token;
61 if (ec1 != std::errc() || ec2 != std::errc()) {
62 status = false;
63 }
64 }
65 return status;
66}
67
68bool interpretSeeds(const std::string& buffer,
69 std::string& stream, std::vector<uint32_t>& seeds)
70{
71 //split the space-separated string in 31 or 33 words:
72 typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
73 boost::char_separator<char> sep(" ");
74 tokenizer tokens(buffer, sep);
75 int nToks(distance(tokens.begin(), tokens.end()));
76 bool status = (nToks == 31 || nToks == 33 || nToks == 771);
77 if (status) {
78 tokenizer::iterator token(tokens.begin());
79 stream = *token++;
80 --nToks;
81 if (nToks == 32) nToks=30; //ranlux (FIXME NEEDED?)
82 for (int i=0; i<nToks; i++) {
83 uint32_t value = 0;
84 auto [ptr, ec] = std::from_chars(token->data(), token->data() + token->size(), value);
85 if (ec != std::errc()) {
86 status = false;
87 break;
88 }
89 seeds.push_back(value);
90 ++token;
91 }
92 }
93 return status;
94}
size_type size() const
bool interpretSeeds(const std::string &buffer, std::string &stream, uint32_t &seed1, uint32_t &seed2, short &luxury, uint32_t &offset)
void getOffset(boost::tokenizer< boost::char_separator< char > >::iterator &token, uint32_t &offset)
void getLuxury(boost::tokenizer< boost::char_separator< char > >::iterator &token, short &luxLevel)