ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
CexmcASTEval.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file CexmcASTEval.hh
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 /*
27  * =============================================================================
28  *
29  * Filename: CexmcASTEval.hh
30  *
31  * Description: abstract syntax tree for custom filter eval
32  *
33  * Version: 1.0
34  * Created: 17.07.2010 15:43:09
35  * Revision: none
36  * Compiler: gcc
37  *
38  * Author: Alexey Radkov (),
39  * Company: PNPI
40  *
41  * =============================================================================
42  */
43 
44 #ifndef CEXMC_AST_EVAL_HH
45 #define CEXMC_AST_EVAL_HH
46 
47 #ifdef CEXMC_USE_CUSTOM_FILTER
48 
49 #include <map>
50 #include <string>
51 #include <boost/variant/variant.hpp>
52 #include "CexmcAST.hh"
53 #include "CexmcEventSObject.hh"
54 #include "CexmcEventFastSObject.hh"
55 #include "CexmcException.hh"
56 #include "CexmcCommon.hh"
57 
58 
59 class CexmcASTEval : public CexmcAST::BasicEval
60 {
61  private:
62  typedef boost::variant< const CexmcEnergyDepositCalorimeterCollection *,
63  const bool * > VarAddr;
64 
65  typedef std::map< std::string, VarAddr > VarAddrMap;
66 
67  typedef VarAddrMap::value_type VarAddrMapData;
68 
69  public:
70  explicit CexmcASTEval(
71  const CexmcEventFastSObject * evFastSObject = NULL,
72  const CexmcEventSObject * evSObject = NULL );
73 
74  public:
75  void SetAddressedData(
76  const CexmcEventFastSObject * evFastSObject_ = NULL,
77  const CexmcEventSObject * evSObject_ = NULL );
78 
79  void BindAddresses( CexmcAST::Subtree & ast );
80 
81  void ResetAddressBinding( CexmcAST::Subtree & ast );
82 
83  private:
84  ScalarValueType GetFunScalarValue( const CexmcAST::Subtree & ast )
85  const;
86 
87  ScalarValueType GetVarScalarValue( const CexmcAST::Variable & var )
88  const;
89 
90  void GetEDCollectionValue( const CexmcAST::Node & node,
92 
93  private:
94  const G4double * GetThreeVectorElementAddrByIndex(
95  const CexmcSimpleThreeVectorStore & vect,
96  G4int index ) const;
97 
98  const G4double * GetLorentzVectorElementAddrByIndex(
99  const CexmcSimpleLorentzVectorStore & vect,
100  G4int index ) const;
101 
102  private:
103  const CexmcEventFastSObject * evFastSObject;
104 
105  const CexmcEventSObject * evSObject;
106 
107  private:
108  VarAddrMap varAddrMap;
109 
110  private:
111  static const G4double constants[];
112 };
113 
114 
115 inline void CexmcASTEval::SetAddressedData(
116  const CexmcEventFastSObject * evFastSObject_,
117  const CexmcEventSObject * evSObject_ )
118 {
119  varAddrMap.clear();
120  evFastSObject = evFastSObject_;
121  evSObject = evSObject_;
122 }
123 
124 
125 inline const G4double * CexmcASTEval::GetThreeVectorElementAddrByIndex(
126  const CexmcSimpleThreeVectorStore & vect,
127  G4int index ) const
128 {
129  switch ( index )
130  {
131  case 1 :
132  return &vect.x;
133  case 2 :
134  return &vect.y;
135  case 3 :
136  return &vect.z;
137  default :
138  throw CexmcException( CexmcCFUnexpectedVectorIndex );
139  return NULL;
140  }
141 }
142 
143 
144 inline const G4double * CexmcASTEval::GetLorentzVectorElementAddrByIndex(
145  const CexmcSimpleLorentzVectorStore & vect,
146  G4int index ) const
147 {
148  switch ( index )
149  {
150  case 1 :
151  return &vect.px;
152  case 2 :
153  return &vect.py;
154  case 3 :
155  return &vect.pz;
156  case 4 :
157  return &vect.e;
158  default :
159  throw CexmcException( CexmcCFUnexpectedVectorIndex );
160  return NULL;
161  }
162 }
163 
164 #endif
165 
166 #endif
167