12 #include "TObjArray.h"
13 #include "TObjString.h"
27 if (feedThrough >= 0 &&
info.feedThrough() != feedThrough)
return false;
28 if (slot >= 0 &&
info.slot() != slot)
return false;
36 if (gotMin() && gotMax() &&
min >
max)
return (
val ==
min);
37 if (gotMin() &&
val <
min)
return false;
38 if (gotMax() &&
val >=
max)
return false;
45 m_calos(
other.m_calos), m_partitions(
other.m_partitions), m_channels(
other.m_channels), m_layers(
other.m_layers),
46 m_gains(
other.m_gains), m_status(
other.m_status), m_requireSat(
other.m_requireSat),
47 m_cuts(
other.m_cuts), m_requireConvergence(
other.m_requireConvergence),
48 m_channelSel(
other.m_channelSel), m_indexParity(
other.m_indexParity)
54 TString
error =
"Allowed syntax is \" condition1 && condition2 && ... && conditionN\n";
55 error +=
"where conditionX is of the form status==XXX, saturate==yes|no, energy>XX, eta>XX, eta<XX, adcMax>XX, sampleMax>XX\n";
56 error +=
"chi2<XX, time>XX, time<XX, converged=true, calo==XX, cell==[FT,slot,channel], run==XX, event=XX\n";
57 error +=
"or an or list (item1 || item2 ||... itemN) of such statements.";
61 sel.ReplaceAll(
" ",
"");
63 for (
int i = 0;
i <
tokens->GetEntries();
i++) {
64 TString& token = ((TObjString*)
tokens->At(
i))->String();
65 if (TString(token[0]) ==
"(" && TString(token[token.Length() - 1]) ==
")") {
66 TObjArray* orTokens = TString(token(1, token.Length() - 2)).Tokenize(
"||");
68 for (
int j = 0; j < orTokens->GetEntries(); j++) {
69 TString& orToken = ((TObjString*)orTokens->At(j))->String();
71 cout <<
"could not process token " << orToken << endl <<
error << endl;
76 if (oring !=
"" && oring !=
var) {
77 cout <<
"inconsistent or-list " << token << endl <<
error << endl;
84 cout <<
"Error while processing token " << orToken <<
" : " <<
result << endl <<
error << endl;
96 cout <<
"could not process token " << token << endl <<
error << endl;
102 cout <<
"Error while processing token " << token <<
" : " <<
result << endl <<
error << endl;
115 if (token.Index(
"!=") >= 0) {
116 TObjArray* neTokens = token.Tokenize(
"!=");
117 if (neTokens->GetEntries() == 2) {
118 var = ((TObjString*)neTokens->At(0))->String();
119 arg = ((TObjString*)neTokens->At(1))->String();
126 if (token.Index(
"==") >= 0) {
127 TObjArray* eqTokens = token.Tokenize(
"==");
128 if (eqTokens->GetEntries() == 2) {
129 var = ((TObjString*)eqTokens->At(0))->String();
130 arg = ((TObjString*)eqTokens->At(1))->String();
137 if (token.Index(
">") >= 0) {
138 TObjArray* gtTokens = token.Tokenize(
">");
139 if (gtTokens->GetEntries() == 2) {
140 var = ((TObjString*)gtTokens->At(0))->String();
141 arg = ((TObjString*)gtTokens->At(1))->String();
148 if (token.Index(
"<") >= 0) {
149 TObjArray* ltTokens = token.Tokenize(
"<");
150 if (ltTokens->GetEntries() == 2) {
151 var = ((TObjString*)ltTokens->At(0))->String();
152 arg = ((TObjString*)ltTokens->At(1))->String();
166 if (
var ==
"status" && op ==
"==") {
167 if (
m_status != 0xffffffff)
return "Variable " +
var +
" already set";
171 if (
var ==
"saturate" && op ==
"==") {
175 return "Invalid argument " +
arg;
178 if (oring !=
"cell" && !
m_channels.empty())
return "Variable " +
var +
" already set";
180 if (
m_channelSel == -1)
return "Cannot have positive channel selections and vetos in the same command";
181 cout <<
"---> set channel sel == 1" << endl;
185 if (
m_channelSel == +1)
return "Cannot have positive channel selections and vetos in the same command";
186 cout <<
"---> set channel sel == -1" << endl;
189 TObjArray* chTokens =
nullptr;
190 if (TString(
arg[0]) ==
"[" || TString(
arg[
arg.Length() - 1]) ==
"]")
191 chTokens = TString(
arg(1,
arg.Length() - 2)).Tokenize(
",");
193 chTokens =
arg.Tokenize(
"/");
194 if (chTokens->GetEntries() != 4) {
delete chTokens;
return "Invalid argument " +
arg; }
195 TString calo = ((TObjString*)chTokens->At(0))->String();
196 TString
ft = ((TObjString*)chTokens->At(1))->String();
197 TString slot = ((TObjString*)chTokens->At(2))->String();
198 TString
channel = ((TObjString*)chTokens->At(3))->String();
202 int ftNum = -99, slotNum = -99, channelNum = -99;
205 else if (
ft ==
"?" ||
ft ==
"x" ||
ft ==
"-1")
207 if (ftNum == -99)
return "Invalid FT argument " +
ft;
209 slotNum = slot.Atoi();
210 else if (slot ==
"?" || slot ==
"x" || slot ==
"-1")
212 if (slotNum == -99)
return "Invalid slot argument " + slot;
217 if (channelNum == -99)
return "Invalid channel argument " +
channel;
218 addChannel(caloId, ftNum, slotNum, channelNum);
219 cout <<
"---> addChannel " <<
Id::str(caloId) <<
" " << ftNum <<
" " << slotNum <<
" " << channelNum << endl;
222 if (
var ==
"calo" && op ==
"==") {
223 if (oring !=
"calo" && !
m_calos.empty())
return "Variable " +
var +
" already set";
227 cout <<
"---> addCalo " <<
Id::str(caloId) << endl;
230 if (
var ==
"partition" && op ==
"==") {
231 if (oring !=
"partition" && !
m_calos.empty())
return "Variable " +
var +
" already set";
235 cout <<
"---> addPartition " <<
Id::str(partId) << endl;
238 if (
var ==
"layer" && op ==
"==") {
239 if (oring !=
"layer" && !
m_layers.empty())
return "Variable " +
var +
" already set";
240 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
242 cout <<
"---> addLayer " <<
arg.Atoi() << endl;
245 if (
var ==
"gain" && op ==
"==") {
246 if (oring !=
"gain" && !
m_gains.empty())
return "Variable " +
var +
" already set";
256 if (
var ==
"runNum" && op ==
"==") {
257 if (oring !=
"runNum" && !
m_runs.empty())
return "Variable " +
var +
" already set";
258 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
260 cout <<
"---> addRun " <<
arg.Atoi() << endl;
263 if (
var ==
"eventNum" && op ==
"==") {
264 if (oring !=
"eventNum" && !
m_events.empty())
return "Variable " +
var +
" already set";
265 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
267 cout <<
"---> addEvent " <<
arg.Atoi() << endl;
270 if (
var ==
"eventSpec" && op ==
"==") {
271 if (oring !=
"eventSpec" && !
m_events.empty())
return "Variable " +
var +
" already set";
272 TObjArray* evTokens =
arg.Tokenize(
"/");
273 if (evTokens->GetEntries() != 2) {
delete evTokens;
return "Invalid argument " +
arg; }
274 TString
evt = ((TObjString*)evTokens->At(0))->String();
275 TString
run = ((TObjString*)evTokens->At(1))->String();
277 if (!
run.IsDigit())
return "Invalid run argument in " +
arg;
278 if (!
evt.IsDigit())
return "Invalid event argument in " +
arg;
281 cout <<
"---> addRun/addEvent " <<
run.Atoi() <<
"/" <<
evt.Atoi() << endl;
284 if (
var ==
"eventFile" && op ==
"==") {
285 if (oring !=
"eventFile" && !
m_events.empty())
return "Variable " +
var +
" already set";
287 if (!
fs.is_open() ||
fs.eof())
return "File " +
arg +
" does not contain a valid event list";
292 TObjArray* evTokens =
arg.Tokenize(
"/");
293 if (evTokens->GetEntries() != 2) {
delete evTokens;
return "Invalid argument " +
arg; }
294 TString
evt = ((TObjString*)evTokens->At(0))->String();
295 TString
run = ((TObjString*)evTokens->At(1))->String();
297 if (!
run.IsDigit())
return "Invalid run argument in " +
arg;
298 if (!
evt.IsDigit())
return "Invalid event argument in " +
arg;
301 cout <<
"---> addRun/addEvent " <<
run.Atoi() <<
"/" <<
evt.Atoi() << endl;
305 if (
var ==
"lb" && op ==
"==") {
306 if (oring !=
"lb" && !
m_lbs.empty())
return "Variable " +
var +
" already set";
307 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
309 cout <<
"---> addLB " <<
arg.Atoi() << endl;
312 if (
var ==
"hashId" && op ==
"==") {
313 if (oring !=
"hashId" && !
m_hashIds.empty())
return "Variable " +
var +
" already set";
314 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
316 cout <<
"---> addHashId " <<
arg.Atoi() << endl;
319 if (
var ==
"hashId" && op ==
"<") {
320 if (oring !=
"hashId" && !
m_hashIds.empty())
return "Variable " +
var +
" already set";
321 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
323 cout <<
"---> addHashIdRange 0 " <<
arg.Atoi() << endl;
326 if (
var ==
"indexParity" && op ==
"==") {
327 if (oring !=
"")
return "Variable " +
var +
" cannot be or'ed";
328 if (!
arg.IsDigit())
return "Invalid argument " +
arg;
330 cout <<
"---> indexParity " <<
arg.Atoi() << endl;
334 std::vector<TString> vars;
335 std::vector<DataFuncSet> funcs;
336 std::vector<DataFuncArgs>
args;
338 if (
status && vars.size() == 1) {
345 if (
cut->second.gotMin())
return "Min value for variable " +
var +
" was already set";
346 cut->second.min =
arg.Atof();
347 cout <<
"---> set " <<
var <<
" >= " <<
arg.Atof() << endl;
350 if (
cut->second.gotMax())
return "Max value for variable " +
var +
" was already set";
351 cut->second.max =
arg.Atof();
352 cout <<
"---> set " <<
var <<
" < " <<
arg.Atof() << endl;
355 if (
cut->second.gotMin() ||
cut->second.gotMax())
return "A cut for variable " +
var +
" was already set";
356 cut->second.setEqual(
arg.Atof());
357 cout <<
"---> set " <<
var <<
" == " <<
arg.Atof() << endl;
362 return "Invalid variable or operator";
391 if (barrel_ec == 0 && pos_neg == 0) calo =
EMB_C;
392 if (barrel_ec == 0 && pos_neg == 1) calo =
EMB_A;
393 if (barrel_ec == 1 && pos_neg == 0) calo =
EMEC_C;
394 if (barrel_ec == 1 && pos_neg == 1) calo =
EMEC_A;
405 if (!
passHash(hashId))
return false;
421 if (!
pass)
return false;
430 if (!
p.second.pass(
data))
return false;
440 for (
unsigned int k = 0;
k <
m_runs.size();
k++)
445 if (!
pass)
return false;
455 if (!
pass)
return false;
458 if (!
m_lbs.empty()) {
460 for (
unsigned int k = 0;
k <
m_lbs.size();
k++)
465 if (!
pass)
return false;
470 for (
unsigned int k = 0;
k <
m_gains.size();
k++)
475 if (!
pass)
return false;
486 for (
unsigned int k = 0;
k <
m_calos.size();
k++)
491 if (!
pass)
return false;
501 if (!
pass)
return false;
511 if (!
found)
return false;