Belle II Software  release-06-02-00
generalCut.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <framework/utilities/GeneralCut.h>
9 #include <gtest/gtest.h>
10 
11 using namespace Belle2;
12 namespace {
14  struct MockObjectType {
16  double value = 4.2;
17  };
18 
24  class MockVariableType {
25  public:
27  double function(const MockObjectType* object) const
28  {
29  return object->value;
30  }
31 
33  const std::string name = "mocking_variable";
34  };
35 
40  class MockVariableManager {
41  public:
43  using Object = MockObjectType;
45  using Var = MockVariableType;
46 
48  static MockVariableManager& Instance()
49  {
50  static MockVariableManager instance;
51  return instance;
52  }
53 
55  Var* getVariable(const std::string& name)
56  {
57  if (name == "mocking_variable") {
58  return &m_mocking_variable;
59  } else {
60  return nullptr;
61  }
62  }
63 
65  Var m_mocking_variable;
66  };
67 
69  using MockGeneralCut = GeneralCut<MockVariableManager>;
70 
72  TEST(GeneralCutTest, cutCheck)
73  {
74  MockObjectType testObject;
75 
76  std::unique_ptr<MockGeneralCut> a = MockGeneralCut::compile("1.2 < 1.5 ");
77  EXPECT_TRUE(a->check(&testObject));
78  a = MockGeneralCut::compile(" 1.5<1.2");
79  EXPECT_FALSE(a->check(&testObject));
80 
81  // Check for regression
82  // This was broken in the past due to the abs function in almostEqual
83  a = MockGeneralCut::compile("-1 == 1");
84  EXPECT_FALSE(a->check(&testObject));
85  a = MockGeneralCut::compile("-1 != 1");
86  EXPECT_TRUE(a->check(&testObject));
87 
88  a = MockGeneralCut::compile(" 12.3 >1.5 ");
89  EXPECT_TRUE(a->check(&testObject));
90  a = MockGeneralCut::compile("12 > 15");
91  EXPECT_FALSE(a->check(&testObject));
92 
93  a = MockGeneralCut::compile("1.2 == 1.2");
94  EXPECT_TRUE(a->check(&testObject));
95  a = MockGeneralCut::compile(" 1.5!=1.2");
96  EXPECT_TRUE(a->check(&testObject));
97 
98  a = MockGeneralCut::compile("1.2 == 1.2 == 1.2");
99  EXPECT_TRUE(a->check(&testObject));
100  a = MockGeneralCut::compile(" 1.5 == 1.5!=1.2");
101  EXPECT_TRUE(a->check(&testObject));
102  a = MockGeneralCut::compile(" 1.5 == 1.5!=1.5");
103  EXPECT_FALSE(a->check(&testObject));
104 
105  a = MockGeneralCut::compile("1.0 < 1.2 == 1.2");
106  EXPECT_TRUE(a->check(&testObject));
107  a = MockGeneralCut::compile(" 1.5 < 1.6 != 1.6");
108  EXPECT_FALSE(a->check(&testObject));
109  a = MockGeneralCut::compile(" 1.5 < 1.6 != 1.7");
110  EXPECT_TRUE(a->check(&testObject));
111 
112  a = MockGeneralCut::compile(" [12 >= 12 ]");
113  EXPECT_TRUE(a->check(&testObject));
114  a = MockGeneralCut::compile("[ 15>= 16 ]");
115  EXPECT_FALSE(a->check(&testObject));
116 
117  a = MockGeneralCut::compile(" [12 <= 12 ]");
118  EXPECT_TRUE(a->check(&testObject));
119  a = MockGeneralCut::compile(" [ 17<= 16.7 ]");
120  EXPECT_FALSE(a->check(&testObject));
121 
122  a = MockGeneralCut::compile(" [12 <= 12 < 13]");
123  EXPECT_TRUE(a->check(&testObject));
124  a = MockGeneralCut::compile(" [ 17<= 16.7 < 18 ]");
125  EXPECT_FALSE(a->check(&testObject));
126 
127  a = MockGeneralCut::compile(" [12 >= 12 < 13]");
128  EXPECT_TRUE(a->check(&testObject));
129  a = MockGeneralCut::compile(" [ 15> 16.7 <= 18 ]");
130  EXPECT_FALSE(a->check(&testObject));
131 
132  a = MockGeneralCut::compile("mocking_variable > 1.0");
133  EXPECT_TRUE(a->check(&testObject));
134  a = MockGeneralCut::compile("1.0 < mocking_variable <= mocking_variable");
135  EXPECT_TRUE(a->check(&testObject));
136 
137  a = MockGeneralCut::compile("mocking_variable < 100.0");
138  EXPECT_TRUE(a->check(&testObject));
139  a = MockGeneralCut::compile("mocking_variable <= mocking_variable <= mocking_variable");
140  EXPECT_TRUE(a->check(&testObject));
141 
142  a = MockGeneralCut::compile("1 < 2 and 3 < 4");
143  EXPECT_TRUE(a->check(&testObject));
144  a = MockGeneralCut::compile("1 < 2 and 4 < 3");
145  EXPECT_FALSE(a->check(&testObject));
146  a = MockGeneralCut::compile("2 < 1 and 4 < 3");
147  EXPECT_FALSE(a->check(&testObject));
148  a = MockGeneralCut::compile("2 < 1 and 3 < 4");
149  EXPECT_FALSE(a->check(&testObject));
150 
151  a = MockGeneralCut::compile("1 < 2 or 3 < 4");
152  EXPECT_TRUE(a->check(&testObject));
153  a = MockGeneralCut::compile("1 < 2 or 4 < 3");
154  EXPECT_TRUE(a->check(&testObject));
155  a = MockGeneralCut::compile("2 < 1 or 4 < 3");
156  EXPECT_FALSE(a->check(&testObject));
157  a = MockGeneralCut::compile("2 < 1 or 3 < 4");
158  EXPECT_TRUE(a->check(&testObject));
159 
160  a = MockGeneralCut::compile("1 < 2 and 3 < 4 and [ 5 < 6 or 7 > 6 ]");
161  EXPECT_TRUE(a->check(&testObject));
162  a = MockGeneralCut::compile("[1 < 2 < 3 or 3 > 4 ] and [ 5 < 6 or 7 > 6 ]");
163  EXPECT_TRUE(a->check(&testObject));
164  a = MockGeneralCut::compile("[1 < 2 < 3 or 3 > 4 ] or [ 5 < 6 and 7 > 6 ]");
165  EXPECT_TRUE(a->check(&testObject));
166 
167  a = MockGeneralCut::compile("1 < 2 and 3 < 4 or 5 > 6");
168  EXPECT_TRUE(a->check(&testObject));
169  a = MockGeneralCut::compile("1 < 2 or 3 < 4 and 5 > 6");
170  EXPECT_TRUE(a->check(&testObject));
171  a = MockGeneralCut::compile("1 < 2 and 4 < 3 or 6 > 5");
172  EXPECT_TRUE(a->check(&testObject));
173  a = MockGeneralCut::compile("1 < 2 or 4 < 3 and 6 > 5");
174  EXPECT_TRUE(a->check(&testObject));
175 
176  a = MockGeneralCut::compile("1 != 2 and 3 < 4 or 5 > 6");
177  EXPECT_TRUE(a->check(&testObject));
178  a = MockGeneralCut::compile("1 < 2 or 3 != 4 and 5 > 6");
179  EXPECT_TRUE(a->check(&testObject));
180 
181  a = MockGeneralCut::compile("1 != 2 and 3 == 4 or 5 > 6");
182  EXPECT_FALSE(a->check(&testObject));
183  a = MockGeneralCut::compile("1 < 2 or 3 == 4 and 5 > 6");
184  EXPECT_TRUE(a->check(&testObject));
185 
186  a = MockGeneralCut::compile("15 != 0x15");
187  EXPECT_TRUE(a->check(&testObject));
188 
189  a = MockGeneralCut::compile("15 == 0xF");
190  EXPECT_TRUE(a->check(&testObject));
191 
192  // Should throw an exception
193  EXPECT_THROW(a = MockGeneralCut::compile("15 == 15.0 bla"), std::runtime_error);
194  EXPECT_TRUE(a->check(&testObject));
195  EXPECT_THROW(a = MockGeneralCut::compile("15 == other_var"), std::runtime_error);
196  EXPECT_TRUE(a->check(&testObject));
197  EXPECT_THROW(a = MockGeneralCut::compile("15 == 15e1000"), std::out_of_range);
198  EXPECT_TRUE(a->check(&testObject));
199 
200  a = MockGeneralCut::compile("1e-3 < 1e3");
201  EXPECT_TRUE(a->check(&testObject));
202 
203  a = MockGeneralCut::compile("1e-3 == 0.001");
204  EXPECT_TRUE(a->check(&testObject));
205 
206  a = MockGeneralCut::compile("1000 < infinity");
207  EXPECT_TRUE(a->check(&testObject));
208 
209  a = MockGeneralCut::compile("1000 > infinity");
210  EXPECT_FALSE(a->check(&testObject));
211 
212  a = MockGeneralCut::compile("1000 < nan");
213  EXPECT_FALSE(a->check(&testObject));
214 
215  a = MockGeneralCut::compile("1000 > nan");
216  EXPECT_FALSE(a->check(&testObject));
217 
218  // Check if we have double precision
219  a = MockGeneralCut::compile("3.141592653589793 == 3.141592653589792");
220  EXPECT_FALSE(a->check(&testObject));
221 
222  a = MockGeneralCut::compile("3.1415926535897931234567890 == 3.1415926535897931234567891");
223  EXPECT_TRUE(a->check(&testObject));
224 
225  a = MockGeneralCut::compile("3141592653589 != 3141592653588");
226  EXPECT_TRUE(a->check(&testObject));
227 
228  a = MockGeneralCut::compile("");
229  EXPECT_TRUE(a->check(&testObject));
230 
231  a = MockGeneralCut::compile(" ");
232  EXPECT_TRUE(a->check(&testObject));
233 
234  a = MockGeneralCut::compile("[ ]");
235  EXPECT_TRUE(a->check(&testObject));
236 
237  a = MockGeneralCut::compile("[ ] and []");
238  EXPECT_TRUE(a->check(&testObject));
239  }
240 
242  TEST(GeneralCutTest, compileAndDecompile)
243  {
244 
245  std::unique_ptr<MockGeneralCut> a = MockGeneralCut::compile("1 < 2");
246  EXPECT_EQ(a->decompile(), "[1 < 2]");
247 
248  a = MockGeneralCut::compile("[1 < 2]");
249  EXPECT_EQ(a->decompile(), "[1 < 2]");
250 
251  a = MockGeneralCut::compile("1 < 2 < 3");
252  EXPECT_EQ(a->decompile(), "[[1 < 2] and [2 < 3]]");
253 
254  a = MockGeneralCut::compile("[1 < 2 < 3] or [[ 2 < 4] and [ mocking_variable < 4.4231 and [1 < 3 and 4 < mocking_variable]]]");
255  EXPECT_EQ(a->decompile(),
256  "[[[1 < 2] and [2 < 3]] or [[2 < 4] and [[mocking_variable < 4.4231] and [[1 < 3] and [4 < mocking_variable]]]]]");
257  }
258 
259 
260 } // namespace
This class implements a common way to implement cut/selection functionality for arbitrary objects.
Definition: GeneralCut.h:91
TEST(TestgetDetectorRegion, TestgetDetectorRegion)
Test Constructors.
Abstract base class for different kinds of events.