CMS 3D CMS Logo

stringutil.cc
Go to the documentation of this file.
1 // .
2 // ..: P. Chang, philip@physics.ucsd.edu
3 
4 #include "stringutil.h"
5 
6 //#############################################################################
7 // rstrip TString
8 //
9 void RooUtil::StringUtil::rstrip(TString &in, TString separator) {
10  TString save(in);
11  if (separator.EqualTo(" ")) {
12  // Remove end-of-line spaces
13  std::string str = in.Data();
14  str.erase(str.find_last_not_of(" \n\r\t") + 1);
15  in = str.c_str();
16  } else {
17  // Remove text after separator
18  TObjArray *list = in.Tokenize(separator);
19  if (list->GetEntries() != 0) {
20  in = ((TObjString *)list->At(0))->GetString();
21  }
22  }
23  // Print
24  return;
25 }
26 
27 //#############################################################################
28 // Convert TString -> vector<TString>
29 // like ' '.split()
30 //
33  TObjArray *list = in.Tokenize(separator);
34  for (unsigned i = 0; i < (unsigned)list->GetEntries(); ++i) {
35  TString token = ((TObjString *)list->At(i))->GetString();
36  out.push_back(token);
37  }
38  if (out.size() == 0) {
39  out.push_back("");
40  }
41  delete list;
42  return out;
43 }
44 
45 //#############################################################################
46 // Convert TString -> vector<TString>
47 // like ' '.rsplit()
48 //
50  TString left = in;
51  rstrip(left, separator);
52  int size = left.Length();
53  vecTString rtn;
54  rtn.push_back(left);
55  rtn.push_back(in(size + 1, in.Length() - size - 1));
56  return rtn;
57 }
58 
59 //#############################################################################
60 // Convert vector<TString> -> TString
61 // like ':'.join()
62 //
63 TString RooUtil::StringUtil::join(RooUtil::StringUtil::vecTString in, TString joiner, Int_t rm_blanks) {
64  std::stringstream ss;
65  for (unsigned i = 0; i < in.size(); ++i) {
66  TString token = in[i];
67  ss << token << ((i < in.size() - 1) ? joiner : "");
68  }
69  // Remove blanks
70  TString out = ss.str();
71  if (rm_blanks) {
72  out.ReplaceAll(" ", "");
73  }
74  return out;
75 }
76 
77 //#############################################################################
78 // Convert TString -> vector<TString> -> TString
79 //
80 TString RooUtil::StringUtil::sjoin(TString in, TString separator, TString joiner, Int_t rm_blanks) {
82  TString out = RooUtil::StringUtil::join(vec, joiner, rm_blanks);
83  return out;
84 }
85 
86 //#############################################################################
89  for (unsigned i = 0; i < vec.size(); ++i) {
90  if (!vec[i].Contains(keyword)) {
91  continue;
92  }
93  newvec.push_back(vec[i]);
94  }
95  return newvec;
96 }
97 
98 //#############################################################################
100  int bunch_size = vec.size() / nchunk + (vec.size() % nchunk > 0);
102  for (size_t i = 0; i < vec.size(); i += bunch_size) {
103  auto last = std::min(vec.size(), i + bunch_size);
104  bunches.emplace_back(vec.begin() + i, vec.begin() + last);
105  }
106  return bunches;
107 }
108 
109 //#############################################################################
110 // From std::vector<TString> form an expression for TTree::Draw
112  in.erase(std::remove_if(in.begin(), in.end(), [](TString s) { return s.EqualTo("1"); }), in.end());
113  if (in.size() == 0)
114  in.push_back("1");
115  return Form("(%s)", RooUtil::StringUtil::join(in, ")*(").Data());
116 }
117 
118 //#############################################################################
119 // Clean unwanted parantheses
121  std::string s = input.Data();
123  return s.c_str();
124 }
125 
126 //#############################################################################
127 // Under the hood for cleaning unwanted parantheses
129  using namespace std;
130  map<int, bool> pmap;
131  for (size_t i = 0; i < S.size(); i++) {
132  map<int, bool>::iterator it;
133  if (S.at(i) == '(') {
134  pmap[i] = true;
135  } else if (S.at(i) == ')') {
136  it = pmap.end();
137  it--;
138  if (!(*it).second) {
139  pmap.erase(it);
140  } else {
141  S.erase(S.begin() + i);
142  S.erase(S.begin() + (*it).first);
143  pmap.erase(it);
144  i = i - 2;
145  }
146  } else {
147  if (!pmap.empty()) {
148  it = pmap.end();
149  it--;
150  (*it).second = false;
151  }
152  }
153  }
154 }
155 
156 //#############################################################################
157 // Given a template replace tokens by pattern.
158 // Could be thought of as "".format() from python. (although it's not nearly as good as that...)
159 TString RooUtil::StringUtil::format(TString tmp, std::vector<TString> tokens) {
160  for (auto &token : tokens) {
161  std::vector<TString> v = rsplit(token, "=");
162  TString key = v[0];
163  TString val = v[1];
164  tmp.ReplaceAll(Form("{%s}", key.Data()), val);
165  }
166  return tmp;
167 }
168 
169 //std::string RooUtil::StringUtil::parser(std::string _input, int loc_){
170 //
171 // using namespace std;
172 //
173 // string input = _input;
174 //
175 // set<char> support;
176 // support.insert('+');
177 // support.insert('-');
178 // support.insert('*');
179 // support.insert('/');
180 // support.insert('>');
181 // support.insert('<');
182 // support.insert('=');
183 //
184 // string expi;
185 // set<char> op;
186 // int loc = loc_;
187 // int size = input.size();
188 //
189 // while(1){
190 // if(input[loc] == '('){
191 // expi += parser(input,loc+1);
192 // }else if(input[loc] == ')'){
193 // if((input[loc+1] != '*') && (input[loc+1] != '/')){
194 // return expi;
195 // }else{
196 // if ((op.find('+') == op.end()) && (op.find('-') == op.end())){
197 // return expi;
198 // }else{
199 // return '('+expi+')';
200 // }
201 // }
202 // }else{
203 // char temp = input[loc];
204 // expi=expi+temp;
205 // if(support.find(temp) != support.end()){
206 // op.insert(temp);
207 // }
208 // }
209 // loc++;
210 // if(loc >= size){
211 // break;
212 // }
213 // }
214 //
215 // return expi;
216 //}
size
Write out results.
string separator
Definition: mps_merge.py:79
TString formexpr(vecTString in)
Definition: stringutil.cc:111
std::vector< vecTString > vecVecTString
Definition: stringutil.h:34
vecTString split(TString in, TString separator=" ")
Definition: stringutil.cc:31
void rstrip(TString &in, TString separator="#")
Definition: stringutil.cc:9
TString cleanparantheses(TString expr)
Definition: stringutil.cc:120
vecVecTString chunk(vecTString in, Int_t nchunk)
Definition: stringutil.cc:99
vecTString rsplit(TString in, TString separator="=")
Definition: stringutil.cc:49
static std::string const input
Definition: EdmProvDump.cc:50
vecTString filter(vecTString &vec, TString keyword)
Definition: stringutil.cc:87
TString format(TString tmp, std::vector< TString >)
Definition: stringutil.cc:159
void remove_parantheses(std::string &S)
Definition: stringutil.cc:128
std::vector< TString > vecTString
Definition: stringutil.h:33
key
prepare the HTCondor submission files and eventually submit them
TString join(vecTString in, TString joiner=",", Int_t rm_blanks=1)
Definition: stringutil.cc:63
TString sjoin(TString in, TString separator=" ", TString joiner=":", Int_t rm_blanks=1)
Definition: stringutil.cc:80
#define str(s)
tmp
align.sh
Definition: createJobs.py:716
save
Definition: cuy.py:1164