11 #include <analysis/VariableManager/Manager.h>
12 #include <analysis/dataobjects/Particle.h>
13 #include <analysis/dataobjects/EventShapeContainer.h>
15 #include <analysis/utility/ReferenceFrame.h>
17 #include <framework/logging/Logger.h>
18 #include <framework/datastore/StoreObjPtr.h>
20 #include <TLorentzVector.h>
24 #include <boost/algorithm/string.hpp>
35 if (arguments.size() < 1) {
36 B2ERROR(
"foxWolframR cannot be called without providing the moment order");
40 int order = std::stoi(arguments[0]);
42 if (order < 0 || order > 8) {
43 B2ERROR(
"The Fox-Wolfram moment order must be within 0 and 8.");
47 auto func = [order](
const Particle*) ->
double{
49 StoreObjPtr<EventShapeContainer> evtShapeCont;
52 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
53 return std::numeric_limits<float>::quiet_NaN();
55 if (evtShapeCont->getFWMoment(0) == 0)
57 B2ERROR(
"The 0th-order FoxWolfram moment is zero");
58 return std::numeric_limits<float>::quiet_NaN();
60 return evtShapeCont->getFWMoment(order) / evtShapeCont->getFWMoment(0);
69 if (arguments.size() < 1) {
70 B2ERROR(
"foxWolframH cannot be called without providing the moment order");
74 int order = std::stoi(arguments[0]);
76 if (order < 0 || order > 8) {
77 B2ERROR(
"The Fox-Wolfram moment order must be within 0 and 8.");
81 auto func = [order](
const Particle*) ->
double{
83 StoreObjPtr<EventShapeContainer> evtShapeCont;
86 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
87 return std::numeric_limits<float>::quiet_NaN();
89 return evtShapeCont->getFWMoment(order);
98 if (arguments.size() < 2) {
99 B2ERROR(
"harmonicMoment requires two arguments: the harmonic order (0-8) and the reference axis name (thrust or collision)");
103 int order = std::stoi(arguments[0]);
104 std::string axisName = arguments[1];
105 boost::to_lower(axisName);
107 if (order < 0 || order > 8) {
108 B2ERROR(
"The Fox-Wolfram moment order must be within 0 and 8.");
111 if (axisName !=
"thrust" && axisName !=
"collision") {
112 B2ERROR(
"Invalid axis name " << arguments[1] <<
". The valid options are thrust and collision");
116 auto func = [order, axisName](
const Particle*) ->
double{
117 StoreObjPtr<EventShapeContainer> evtShapeCont;
120 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
121 return std::numeric_limits<float>::quiet_NaN();
123 if (axisName ==
"thrust")
124 return evtShapeCont->getHarmonicMomentThrust(order);
126 return evtShapeCont->getHarmonicMomentCollision(order);
134 if (arguments.size() < 2) {
135 B2ERROR(
"cleoCone requires two arguments: the cone order (0-9) and the reference axis name (thrust or collision)");
139 int order = std::stoi(arguments[0]);
140 std::string axisName = arguments[1];
141 boost::to_lower(axisName);
143 if (order < 0 || order > 8) {
144 B2ERROR(
"The CLEO cone order must be within 0 and 9.");
147 if (axisName !=
"thrust" && axisName !=
"collision") {
148 B2ERROR(
"Invalid axis name " << arguments[1] <<
". The valid options are thrust and collision");
152 auto func = [order, axisName](
const Particle*) ->
double{
153 StoreObjPtr<EventShapeContainer> evtShapeCont;
156 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
157 return std::numeric_limits<float>::quiet_NaN();
159 if (axisName ==
"thrust")
160 return evtShapeCont->getCleoConeThrust(order);
162 return evtShapeCont->getCleoConeCollision(order);
169 double foxWolframR1(
const Particle*)
171 StoreObjPtr<EventShapeContainer> evtShapeCont;
173 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
174 return std::numeric_limits<float>::quiet_NaN();
176 if (evtShapeCont->getFWMoment(0) == 0) {
177 B2ERROR(
"The 0th-order FoxWolfram moment is zero");
178 return std::numeric_limits<float>::quiet_NaN();
180 return evtShapeCont->getFWMoment(1) / evtShapeCont->getFWMoment(0);
183 double foxWolframR2(
const Particle*)
185 StoreObjPtr<EventShapeContainer> evtShapeCont;
187 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
188 return std::numeric_limits<float>::quiet_NaN();
190 if (evtShapeCont->getFWMoment(0) == 0) {
191 B2ERROR(
"The 0th-order FoxWolfram moment is zero");
192 return std::numeric_limits<float>::quiet_NaN();
194 return evtShapeCont->getFWMoment(2) / evtShapeCont->getFWMoment(0);
197 double foxWolframR3(
const Particle*)
199 StoreObjPtr<EventShapeContainer> evtShapeCont;
201 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
202 return std::numeric_limits<float>::quiet_NaN();
204 if (evtShapeCont->getFWMoment(0) == 0) {
205 B2ERROR(
"The 0th-order FoxWolfram moment is zero");
206 return std::numeric_limits<float>::quiet_NaN();
208 return evtShapeCont->getFWMoment(3) / evtShapeCont->getFWMoment(0);
211 double foxWolframR4(
const Particle*)
213 StoreObjPtr<EventShapeContainer> evtShapeCont;
215 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
216 return std::numeric_limits<float>::quiet_NaN();
218 if (evtShapeCont->getFWMoment(0) == 0) {
219 B2ERROR(
"The 0th-order FoxWolfram moment is zero");
220 return std::numeric_limits<float>::quiet_NaN();
222 return evtShapeCont->getFWMoment(4) / evtShapeCont->getFWMoment(0);
226 double harmonicMomentThrust0(
const Particle*)
228 StoreObjPtr<EventShapeContainer> evtShapeCont;
230 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
231 return std::numeric_limits<float>::quiet_NaN();
233 return evtShapeCont->getHarmonicMomentThrust(0);
236 double harmonicMomentThrust1(
const Particle*)
238 StoreObjPtr<EventShapeContainer> evtShapeCont;
240 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
241 return std::numeric_limits<float>::quiet_NaN();
243 return evtShapeCont->getHarmonicMomentThrust(1);
246 double harmonicMomentThrust2(
const Particle*)
248 StoreObjPtr<EventShapeContainer> evtShapeCont;
250 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
251 return std::numeric_limits<float>::quiet_NaN();
253 return evtShapeCont->getHarmonicMomentThrust(2);
256 double harmonicMomentThrust3(
const Particle*)
258 StoreObjPtr<EventShapeContainer> evtShapeCont;
260 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
261 return std::numeric_limits<float>::quiet_NaN();
263 return evtShapeCont->getHarmonicMomentThrust(3);
266 double harmonicMomentThrust4(
const Particle*)
268 StoreObjPtr<EventShapeContainer> evtShapeCont;
270 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
271 return std::numeric_limits<float>::quiet_NaN();
273 return evtShapeCont->getHarmonicMomentThrust(4);
277 double cleoConeThrust0(
const Particle*)
279 StoreObjPtr<EventShapeContainer> evtShapeCont;
281 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
282 return std::numeric_limits<float>::quiet_NaN();
284 return evtShapeCont->getCleoConeThrust(0);
287 double cleoConeThrust1(
const Particle*)
289 StoreObjPtr<EventShapeContainer> evtShapeCont;
291 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
292 return std::numeric_limits<float>::quiet_NaN();
294 return evtShapeCont->getCleoConeThrust(1);
297 double cleoConeThrust2(
const Particle*)
299 StoreObjPtr<EventShapeContainer> evtShapeCont;
301 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
302 return std::numeric_limits<float>::quiet_NaN();
304 return evtShapeCont->getCleoConeThrust(2);
307 double cleoConeThrust3(
const Particle*)
309 StoreObjPtr<EventShapeContainer> evtShapeCont;
311 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
312 return std::numeric_limits<float>::quiet_NaN();
314 return evtShapeCont->getCleoConeThrust(3);
317 double cleoConeThrust4(
const Particle*)
319 StoreObjPtr<EventShapeContainer> evtShapeCont;
321 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
322 return std::numeric_limits<float>::quiet_NaN();
324 return evtShapeCont->getCleoConeThrust(4);
327 double cleoConeThrust5(
const Particle*)
329 StoreObjPtr<EventShapeContainer> evtShapeCont;
331 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
332 return std::numeric_limits<float>::quiet_NaN();
334 return evtShapeCont->getCleoConeThrust(5);
337 double cleoConeThrust6(
const Particle*)
339 StoreObjPtr<EventShapeContainer> evtShapeCont;
341 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
342 return std::numeric_limits<float>::quiet_NaN();
344 return evtShapeCont->getCleoConeThrust(6);
347 double cleoConeThrust7(
const Particle*)
349 StoreObjPtr<EventShapeContainer> evtShapeCont;
351 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
352 return std::numeric_limits<float>::quiet_NaN();
354 return evtShapeCont->getCleoConeThrust(7);
357 double cleoConeThrust8(
const Particle*)
359 StoreObjPtr<EventShapeContainer> evtShapeCont;
361 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
362 return std::numeric_limits<float>::quiet_NaN();
364 return evtShapeCont->getCleoConeThrust(8);
368 double sphericity(
const Particle*)
370 StoreObjPtr<EventShapeContainer> evtShapeCont;
372 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
373 return std::numeric_limits<float>::quiet_NaN();
376 return 1.5 * (evtShapeCont->getSphericityEigenvalue(1) + evtShapeCont->getSphericityEigenvalue(2)) ;
379 double aplanarity(
const Particle*)
381 StoreObjPtr<EventShapeContainer> evtShapeCont;
383 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
384 return std::numeric_limits<float>::quiet_NaN();
387 return 1.5 * evtShapeCont->getSphericityEigenvalue(2);
390 double forwardHemisphereMass(
const Particle*)
392 StoreObjPtr<EventShapeContainer> evtShapeCont;
394 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
395 return std::numeric_limits<float>::quiet_NaN();
397 return evtShapeCont->getForwardHemisphere4Momentum().Mag();
400 double forwardHemisphereX(
const Particle*)
402 StoreObjPtr<EventShapeContainer> evtShapeCont;
404 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
405 return std::numeric_limits<float>::quiet_NaN();
407 return evtShapeCont->getForwardHemisphere4Momentum().Vect().X();
410 double forwardHemisphereY(
const Particle*)
412 StoreObjPtr<EventShapeContainer> evtShapeCont;
414 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
415 return std::numeric_limits<float>::quiet_NaN();
417 return evtShapeCont->getForwardHemisphere4Momentum().Vect().Y();
420 double forwardHemisphereZ(
const Particle*)
422 StoreObjPtr<EventShapeContainer> evtShapeCont;
424 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
425 return std::numeric_limits<float>::quiet_NaN();
427 return evtShapeCont->getForwardHemisphere4Momentum().Vect().Z();
430 double forwardHemisphereMomentum(
const Particle*)
432 StoreObjPtr<EventShapeContainer> evtShapeCont;
434 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
435 return std::numeric_limits<float>::quiet_NaN();
437 return evtShapeCont->getForwardHemisphere4Momentum().Vect().Mag();
440 double forwardHemisphereEnergy(
const Particle*)
442 StoreObjPtr<EventShapeContainer> evtShapeCont;
444 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
445 return std::numeric_limits<float>::quiet_NaN();
447 return evtShapeCont->getForwardHemisphere4Momentum().E();
453 double backwardHemisphereMass(
const Particle*)
455 StoreObjPtr<EventShapeContainer> evtShapeCont;
457 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
458 return std::numeric_limits<float>::quiet_NaN();
460 return evtShapeCont->getBackwardHemisphere4Momentum().Mag();
464 double backwardHemisphereX(
const Particle*)
466 StoreObjPtr<EventShapeContainer> evtShapeCont;
468 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
469 return std::numeric_limits<float>::quiet_NaN();
471 return evtShapeCont->getBackwardHemisphere4Momentum().Vect().X();
474 double backwardHemisphereY(
const Particle*)
476 StoreObjPtr<EventShapeContainer> evtShapeCont;
478 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
479 return std::numeric_limits<float>::quiet_NaN();
481 return evtShapeCont->getBackwardHemisphere4Momentum().Vect().Y();
484 double backwardHemisphereZ(
const Particle*)
486 StoreObjPtr<EventShapeContainer> evtShapeCont;
488 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
489 return std::numeric_limits<float>::quiet_NaN();
491 return evtShapeCont->getBackwardHemisphere4Momentum().Vect().Z();
494 double backwardHemisphereMomentum(
const Particle*)
496 StoreObjPtr<EventShapeContainer> evtShapeCont;
498 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
499 return std::numeric_limits<float>::quiet_NaN();
501 return evtShapeCont->getBackwardHemisphere4Momentum().Vect().Mag();
504 double backwardHemisphereEnergy(
const Particle*)
506 StoreObjPtr<EventShapeContainer> evtShapeCont;
508 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
509 return std::numeric_limits<float>::quiet_NaN();
511 return evtShapeCont->getBackwardHemisphere4Momentum().E();
518 double thrust(
const Particle*)
520 StoreObjPtr<EventShapeContainer> evtShapeCont;
522 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
523 return std::numeric_limits<float>::quiet_NaN();
525 return evtShapeCont->getThrust();
529 double thrustAxisX(
const Particle*)
531 StoreObjPtr<EventShapeContainer> evtShapeCont;
533 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
534 return std::numeric_limits<float>::quiet_NaN();
536 return evtShapeCont->getThrustAxis().X();
539 double thrustAxisY(
const Particle*)
541 StoreObjPtr<EventShapeContainer> evtShapeCont;
543 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
544 return std::numeric_limits<float>::quiet_NaN();
546 return evtShapeCont->getThrustAxis().Y();
549 double thrustAxisZ(
const Particle*)
551 StoreObjPtr<EventShapeContainer> evtShapeCont;
553 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
554 return std::numeric_limits<float>::quiet_NaN();
556 return evtShapeCont->getThrustAxis().Z();
560 double thrustAxisCosTheta(
const Particle*)
562 StoreObjPtr<EventShapeContainer> evtShapeCont;
564 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
565 return std::numeric_limits<float>::quiet_NaN();
567 return evtShapeCont->getThrustAxis().CosTheta();
573 if (arguments.size() == 1) {
574 auto variableName = arguments[0];
578 auto func = [var](
const Particle * particle) ->
double {
579 StoreObjPtr<EventShapeContainer> evtShapeCont;
582 B2ERROR(
"No EventShapeContainer object has been found in the datastore");
583 return std::numeric_limits<float>::quiet_NaN();
586 TVector3 newZ = evtShapeCont->getThrustAxis();
587 TVector3 newY(0, 0, 0);
588 if (newZ(2) == 0 and newZ(1) == 0)
594 TVector3 newX = newY.Cross(newZ);
596 UseReferenceFrame<CMSRotationFrame> signalframe(newX, newY, newZ);
598 return var->function(particle);
602 B2FATAL(
"Wrong number of arguments for meta function useThrustFrame. It only takes one argument, the variable name.");
607 VARIABLE_GROUP(
"EventShape");
609 REGISTER_VARIABLE(
"foxWolframR(i)", foxWolframR,
610 "[Eventbased] ratio of the i-th to the 0-th order Fox Wolfram moments. The order can go up to 8th.");
611 REGISTER_VARIABLE(
"foxWolframH(i)", foxWolframH,
"[Eventbased] i-th order Fox Wolfram moment. The order can go up to 8th.");
612 REGISTER_VARIABLE(
"harmonicMoment(i, axisName)", harmonicMoment,
613 "[Eventbased] i-th order harmonic moment, calculated respect to the axis axisName. The order can go up to 8th., the axisName can be either 'thrust' or 'collision'");
614 REGISTER_VARIABLE(
"cleoCone(i, axisName)", cleoCone,
615 "[Eventbased] i-th order cleoCone, calculated respect to the axis axisName. The order can go up to 9th., the axisName can be either 'thrust' or 'collision'");
616 REGISTER_VARIABLE(
"useThrustFrame(variable)", useThrustFrame,
"Evaluates a variable value in the thrust reference frame.");
619 REGISTER_VARIABLE(
"foxWolframR1", foxWolframR1,
620 "[Eventbased] ratio of the 1-st to the 0-th order Fox Wolfram moments. This is just an alias of foxWolframR(1) defined for the user's covenience.");
621 REGISTER_VARIABLE(
"foxWolframR2", foxWolframR2,
622 "[Eventbased] ratio of the 2-nd to the 0-th order Fox Wolfram moments. This is just an alias of foxWolframR(2) defined for the user's covenience.");
623 REGISTER_VARIABLE(
"foxWolframR3", foxWolframR3,
624 "[Eventbased] ratio of the 3-rd to the 0-th order Fox Wolfram moments. This is just an alias of foxWolframR(3) defined for the user's covenience.");
625 REGISTER_VARIABLE(
"foxWolframR4", foxWolframR4,
626 "[Eventbased] ratio of the 4-th to the 0-th order Fox Wolfram moments. This is just an alias of foxWolframR(4) defined for the user's covenience.");
628 REGISTER_VARIABLE(
"harmonicMomentThrust0", harmonicMomentThrust0,
629 "[Eventbased] Harmonic moment of the 0th order calculated respect to the thrust axis.");
630 REGISTER_VARIABLE(
"harmonicMomentThrust1", harmonicMomentThrust1,
631 "[Eventbased] Harmonic moment of the 1st order calculated respect to the thrust axis.");
632 REGISTER_VARIABLE(
"harmonicMomentThrust2", harmonicMomentThrust2,
633 "[Eventbased] Harmonic moment of the 2nd order calculated respect to the thrust axis.");
634 REGISTER_VARIABLE(
"harmonicMomentThrust3", harmonicMomentThrust3,
635 "[Eventbased] Harmonic moment of the 3rd order calculated respect to the thrust axis.");
636 REGISTER_VARIABLE(
"harmonicMomentThrust4", harmonicMomentThrust4,
637 "[Eventbased] Harmonic moment of the 4th order calculated respect to the thrust axis.");
639 REGISTER_VARIABLE(
"cleoConeThrust0", cleoConeThrust0,
640 "[Eventbased] 0th Cleo cone calculated respect to the thrust axis.");
641 REGISTER_VARIABLE(
"cleoConeThrust1", cleoConeThrust1,
642 "[Eventbased] 1st Cleo cone calculated respect to the thrust axis.");
643 REGISTER_VARIABLE(
"cleoConeThrust2", cleoConeThrust2,
644 "[Eventbased] 2nd Cleo cone calculated respect to the thrust axis.");
645 REGISTER_VARIABLE(
"cleoConeThrust3", cleoConeThrust3,
646 "[Eventbased] 3rd Cleo cone calculated respect to the thrust axis.");
647 REGISTER_VARIABLE(
"cleoConeThrust4", cleoConeThrust4,
648 "[Eventbased] 4th Cleo cone calculated respect to the thrust axis.");
649 REGISTER_VARIABLE(
"cleoConeThrust5", cleoConeThrust5,
650 "[Eventbased] 5th Cleo cone calculated respect to the thrust axis.");
651 REGISTER_VARIABLE(
"cleoConeThrust6", cleoConeThrust6,
652 "[Eventbased] 6th Cleo cone calculated respect to the thrust axis.");
653 REGISTER_VARIABLE(
"cleoConeThrust7", cleoConeThrust7,
654 "[Eventbased] 7th Cleo cone calculated respect to the thrust axis.");
655 REGISTER_VARIABLE(
"cleoConeThrust8", cleoConeThrust8,
656 "[Eventbased] 8th Cleo cone calculated respect to the thrust axis.");
659 REGISTER_VARIABLE(
"sphericity", sphericity,
660 "[Eventbased] Event sphericity, defined as the linear combination of the sphericity eigenvlaues S = (3/2)(lambda2+lambda3)");
661 REGISTER_VARIABLE(
"aplanarity", aplanarity,
662 "[Eventbased] Event aplanarity, defined as the 3/2 of the third sphericity eigenvalue.");
664 REGISTER_VARIABLE(
"thrust", thrust,
"[Eventbased] Event thrust.");
665 REGISTER_VARIABLE(
"thrustAxisX", thrustAxisX,
"[Eventbased] X component of the thrust axis.");
666 REGISTER_VARIABLE(
"thrustAxisY", thrustAxisY,
"[Eventbased] Y component of the thrust axis.");
667 REGISTER_VARIABLE(
"thrustAxisZ", thrustAxisZ,
"[Eventbased] Z component of the thrust axis.");
668 REGISTER_VARIABLE(
"thrustAxisCosTheta", thrustAxisCosTheta,
"[Eventbased] Cosine of the polar angle component of the thrust axis.");
670 REGISTER_VARIABLE(
"forwardHemisphereMass", forwardHemisphereMass,
671 "[Eventbased] Invariant mass of the particles flying in the same direction of the thrust axis.");
672 REGISTER_VARIABLE(
"forwardHemisphereX", forwardHemisphereX,
673 "[Eventbased] X component of the total momentum of the particles flying in the same direction of the thrust axis");
674 REGISTER_VARIABLE(
"forwardHemisphereY", forwardHemisphereY,
675 "[Eventbased] Y component of the total momentum of the particles flying in the same direction of the thrust axis");
676 REGISTER_VARIABLE(
"forwardHemisphereZ", forwardHemisphereZ,
677 "[Eventbased] Z component of the total momentum of the particles flying in the same direction of the thrust axis");
678 REGISTER_VARIABLE(
"forwardHemisphereMomentum", forwardHemisphereMomentum,
679 "[Eventbased] Total momentum the particles flying in the same direction of the thrust axis.");
680 REGISTER_VARIABLE(
"forwardHemisphereEnergy", forwardHemisphereEnergy,
681 "[Eventbased] Total energy the particles flying in the same direction of the thrust axis.");
683 REGISTER_VARIABLE(
"backwardHemisphereMass", backwardHemisphereMass,
684 "[Eventbased] Invariant mass of the particles flying in the direction opposite to the thrust axis.");
685 REGISTER_VARIABLE(
"backwardHemisphereX", backwardHemisphereX,
686 "[Eventbased] X component of the total momentum of the particles flying in the direciton opposite to the thrust axis");
687 REGISTER_VARIABLE(
"backwardHemisphereY", backwardHemisphereY,
688 "[Eventbased] Y component of the total momentum of the particles flying in the direction opposite to the thrust axis");
689 REGISTER_VARIABLE(
"backwardHemisphereZ", backwardHemisphereZ,
690 "[Eventbased] Z component of the total momentum of the particles flying in the direction opposite to the thrust axis");
691 REGISTER_VARIABLE(
"backwardHemisphereMomentum", backwardHemisphereMomentum,
692 "[Eventbased] Total momentum the particles flying in the direction opposite to the thrust axis.");
693 REGISTER_VARIABLE(
"backwardHemisphereEnergy", backwardHemisphereEnergy,
694 "[Eventbased] Total energy the particles flying in the direction opposite to the thrust axis.");