Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/ChargeExchangeMC/src/CexmcASTEval.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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.cc
 30  *
 31  *    Description:  abstract syntax tree for custom filter eval
 32  *
 33  *        Version:  1.0
 34  *        Created:  17.07.2010 15:46:01
 35  *       Revision:  none
 36  *       Compiler:  gcc
 37  *
 38  *         Author:  Alexey Radkov (), 
 39  *        Company:  PNPI
 40  *
 41  * =============================================================================
 42  */
 43 
 44 #ifdef CEXMC_USE_CUSTOM_FILTER
 45 
 46 #include <numeric>
 47 #include <boost/variant/get.hpp>
 48 #include <G4SystemOfUnits.hh>
 49 #include "CexmcASTEval.hh"
 50 
 51 
 52 namespace
 53 {
 54     const std::string  CexmcCFVarEvent( "event" );
 55     const std::string  CexmcCFVarOpCosThetaSCM( "op_cosTh_SCM" );
 56     const std::string  CexmcCFVarEDT( "edt" );
 57     const std::string  CexmcCFVarTPT( "tpt" );
 58     const std::string  CexmcCFVarMon( "mon" );
 59     const std::string  CexmcCFVarMonED( "monED" );
 60     const std::string  CexmcCFVarVclED( "vclED" );
 61     const std::string  CexmcCFVarVcrED( "vcrED" );
 62     const std::string  CexmcCFVarClED( "clED" );
 63     const std::string  CexmcCFVarCrED( "crED" );
 64     const std::string  CexmcCFVarClEDCol( "clEDcol" );
 65     const std::string  CexmcCFVarCrEDCol( "crEDcol" );
 66     const std::string  CexmcCFVarBpMonPosL( "bp_mon_posl" );
 67     const std::string  CexmcCFVarBpMonPosW( "bp_mon_posw" );
 68     const std::string  CexmcCFVarBpMonDirL( "bp_mon_dirl" );
 69     const std::string  CexmcCFVarBpMonDirW( "bp_mon_dirw" );
 70     const std::string  CexmcCFVarBpMonMom( "bp_mon_mom" );
 71     const std::string  CexmcCFVarBpMonTid( "bp_mon_tid" );
 72     const std::string  CexmcCFVarBpTgtPosL( "bp_tgt_posl" );
 73     const std::string  CexmcCFVarBpTgtPosW( "bp_tgt_posw" );
 74     const std::string  CexmcCFVarBpTgtDirL( "bp_tgt_dirl" );
 75     const std::string  CexmcCFVarBpTgtDirW( "bp_tgt_dirw" );
 76     const std::string  CexmcCFVarBpTgtMom( "bp_tgt_mom" );
 77     const std::string  CexmcCFVarBpTgtTid( "bp_tgt_tid" );
 78     const std::string  CexmcCFVarOpTgtPosL( "op_tgt_posl" );
 79     const std::string  CexmcCFVarOpTgtPosW( "op_tgt_posw" );
 80     const std::string  CexmcCFVarOpTgtDirL( "op_tgt_dirl" );
 81     const std::string  CexmcCFVarOpTgtDirW( "op_tgt_dirw" );
 82     const std::string  CexmcCFVarOpTgtMom( "op_tgt_mom" );
 83     const std::string  CexmcCFVarOpTgtTid( "op_tgt_tid" );
 84     const std::string  CexmcCFVarNpTgtPosL( "np_tgt_posl" );
 85     const std::string  CexmcCFVarNpTgtPosW( "np_tgt_posw" );
 86     const std::string  CexmcCFVarNpTgtDirL( "np_tgt_dirl" );
 87     const std::string  CexmcCFVarNpTgtDirW( "np_tgt_dirw" );
 88     const std::string  CexmcCFVarNpTgtMom( "np_tgt_mom" );
 89     const std::string  CexmcCFVarNpTgtTid( "np_tgt_tid" );
 90     const std::string  CexmcCFVarOpdp1TgtPosL( "opdp1_tgt_posl" );
 91     const std::string  CexmcCFVarOpdp1TgtPosW( "opdp1_tgt_posw" );
 92     const std::string  CexmcCFVarOpdp1TgtDirL( "opdp1_tgt_dirl" );
 93     const std::string  CexmcCFVarOpdp1TgtDirW( "opdp1_tgt_dirw" );
 94     const std::string  CexmcCFVarOpdp1TgtMom( "opdp1_tgt_mom" );
 95     const std::string  CexmcCFVarOpdp1TgtTid( "opdp1_tgt_tid" );
 96     const std::string  CexmcCFVarOpdp2TgtPosL( "opdp2_tgt_posl" );
 97     const std::string  CexmcCFVarOpdp2TgtPosW( "opdp2_tgt_posw" );
 98     const std::string  CexmcCFVarOpdp2TgtDirL( "opdp2_tgt_dirl" );
 99     const std::string  CexmcCFVarOpdp2TgtDirW( "opdp2_tgt_dirw" );
100     const std::string  CexmcCFVarOpdp2TgtMom( "opdp2_tgt_mom" );
101     const std::string  CexmcCFVarOpdp2TgtTid( "opdp2_tgt_tid" );
102     const std::string  CexmcCFVarOpdpVclPosL( "opdp_vcl_posl" );
103     const std::string  CexmcCFVarOpdpVclPosW( "opdp_vcl_posw" );
104     const std::string  CexmcCFVarOpdpVclDirL( "opdp_vcl_dirl" );
105     const std::string  CexmcCFVarOpdpVclDirW( "opdp_vcl_dirw" );
106     const std::string  CexmcCFVarOpdpVclMom( "opdp_vcl_mom" );
107     const std::string  CexmcCFVarOpdpVclTid( "opdp_vcl_tid" );
108     const std::string  CexmcCFVarOpdpVcrPosL( "opdp_vcr_posl" );
109     const std::string  CexmcCFVarOpdpVcrPosW( "opdp_vcr_posw" );
110     const std::string  CexmcCFVarOpdpVcrDirL( "opdp_vcr_dirl" );
111     const std::string  CexmcCFVarOpdpVcrDirW( "opdp_vcr_dirw" );
112     const std::string  CexmcCFVarOpdpVcrMom( "opdp_vcr_mom" );
113     const std::string  CexmcCFVarOpdpVcrTid( "opdp_vcr_tid" );
114     const std::string  CexmcCFVarOpdpClPosL( "opdp_cl_posl" );
115     const std::string  CexmcCFVarOpdpClPosW( "opdp_cl_posw" );
116     const std::string  CexmcCFVarOpdpClDirL( "opdp_cl_dirl" );
117     const std::string  CexmcCFVarOpdpClDirW( "opdp_cl_dirw" );
118     const std::string  CexmcCFVarOpdpClMom( "opdp_cl_mom" );
119     const std::string  CexmcCFVarOpdpClTid( "opdp_cl_tid" );
120     const std::string  CexmcCFVarOpdpCrPosL( "opdp_cr_posl" );
121     const std::string  CexmcCFVarOpdpCrPosW( "opdp_cr_posw" );
122     const std::string  CexmcCFVarOpdpCrDirL( "opdp_cr_dirl" );
123     const std::string  CexmcCFVarOpdpCrDirW( "opdp_cr_dirw" );
124     const std::string  CexmcCFVarOpdpCrMom( "opdp_cr_mom" );
125     const std::string  CexmcCFVarOpdpCrTid( "opdp_cr_tid" );
126     const std::string  CexmcCFVarIpSCM( "ipSCM" );
127     const std::string  CexmcCFVarIpLAB( "ipLAB" );
128     const std::string  CexmcCFVarNpSCM( "npSCM" );
129     const std::string  CexmcCFVarNpLAB( "npLAB" );
130     const std::string  CexmcCFVarOpSCM( "opSCM" );
131     const std::string  CexmcCFVarOpLAB( "opLAB" );
132     const std::string  CexmcCFVarNopSCM( "nopSCM" );
133     const std::string  CexmcCFVarNopLAB( "nopLAB" );
134     const std::string  CexmcCFVarIpId( "ipId" );
135     const std::string  CexmcCFVarNpId( "npId" );
136     const std::string  CexmcCFVarOpId( "opId" );
137     const std::string  CexmcCFVarNopId( "nopId" );
138     const std::string  CexmcCFVarConst_eV( "eV" );
139     const std::string  CexmcCFVarConst_keV( "keV" );
140     const std::string  CexmcCFVarConst_MeV( "MeV" );
141     const std::string  CexmcCFVarConst_GeV( "GeV" );
142     const std::string  CexmcCFVarConst_mm( "mm" );
143     const std::string  CexmcCFVarConst_cm( "cm" );
144     const std::string  CexmcCFVarConst_m( "m" );
145 }
146 
147 
148 const G4double  CexmcASTEval::constants[] = { eV, keV, MeV, GeV, mm, cm, m };
149 
150 
151 CexmcASTEval::CexmcASTEval( const CexmcEventFastSObject *  evFastSObject_,
152                             const CexmcEventSObject *  evSObject_ ) :
153     evFastSObject( evFastSObject_ ), evSObject( evSObject_ )
154 {
155 }
156 
157 
158 CexmcAST::BasicEval::ScalarValueType  CexmcASTEval::GetFunScalarValue(
159                                         const CexmcAST::Subtree &  ast ) const
160 {
161     const CexmcAST::Function &  fun( boost::get< CexmcAST::Function >(
162                                                                 ast.type ) );
163 
164     if ( fun == "Sum" )
165     {
166         CexmcEnergyDepositCalorimeterCollection  edCol;
167         GetEDCollectionValue( ast.children[ 0 ], edCol );
168 
169         G4double  result( 0. );
170 
171         for ( CexmcEnergyDepositCalorimeterCollection::iterator
172                                     k( edCol.begin() ); k != edCol.end(); ++k )
173         {
174             result += std::accumulate( k->begin(), k->end(), G4double( 0. ) );
175         }
176 
177         return result;
178     }
179 
180     bool             evalResult( false );
181     ScalarValueType  result( GetBasicFunScalarValue( ast, evalResult ) );
182 
183     if ( evalResult )
184         return result;
185 
186     throw CexmcException( CexmcCFUnexpectedFunction );
187 
188     return 0;
189 }
190 
191 
192 CexmcAST::BasicEval::ScalarValueType  CexmcASTEval::GetVarScalarValue(
193                                         const CexmcAST::Variable &  var ) const
194 {
195     if ( evFastSObject == NULL || evSObject == NULL )
196         throw CexmcException( CexmcCFUninitialized );
197 
198     /* Variables with initialized address */
199 
200     /* bound to CexmcAST::Variable:addr */
201 
202     const double * const *  addr( boost::get< const double * >( &var.addr ) );
203 
204     if ( addr )
205     {
206         if ( *addr )
207             return **addr;
208     }
209     else
210     {
211         const int * const &  addr_( boost::get< const int * >( var.addr ) );
212 
213         if ( addr_ )
214             return *addr_;
215     }
216 
217     /* found in varAddrMap */
218 
219     VarAddrMap::const_iterator  found( varAddrMap.find( var.name ) );
220 
221     if ( found != varAddrMap.end() )
222     {
223         const CexmcEnergyDepositCalorimeterCollection * const *  addr_(
224                 boost::get< const CexmcEnergyDepositCalorimeterCollection * >(
225                                                             &found->second ) );
226         if ( addr_ )
227         {
228             if ( *addr_ )
229             {
230                 if ( ( *addr_ )->size() == 0 )
231                     throw CexmcException( CexmcCFUninitializedVector );
232                 if ( var.index1 == 0 || var.index2 == 0 )
233                     throw CexmcException( CexmcCFUnexpectedVectorIndex );
234                 return ( *addr_ )->at( var.index1 - 1 ).at( var.index2 - 1 );
235             }
236         }
237         else
238         {
239             const bool * const &  addr__( boost::get< const bool * >(
240                                                             found->second ) );
241             if ( addr__ )
242                 return int( *addr__ );
243         }
244     }
245 
246     /* Variables without address */
247 
248     if ( var.name == CexmcCFVarTPT )
249     {
250         return int( evSObject->targetTPOutputParticle.trackId !=
251                     CexmcInvalidTrackId );
252     } 
253 
254     throw CexmcException( CexmcCFUnexpectedVariable );
255 
256     return 0;
257 }
258 
259 
260 void  CexmcASTEval::GetEDCollectionValue( const CexmcAST::Node &  node,
261                         CexmcEnergyDepositCalorimeterCollection &  edCol ) const
262 {
263     if ( evSObject == NULL )
264         throw CexmcException( CexmcCFUninitialized );
265 
266     const CexmcAST::Subtree *  ast( boost::get< CexmcAST::Subtree >( &node ) );
267 
268     if ( ast )
269     {
270         const CexmcAST::Function &  fun( boost::get< CexmcAST::Function >(
271                                                                 ast->type ) );
272 
273         if ( fun == "Inner" )
274         {
275             GetEDCollectionValue( ast->children[ 0 ], edCol );
276             edCol.pop_back();
277             edCol.erase( edCol.begin() );
278             for ( CexmcEnergyDepositCalorimeterCollection::iterator
279                             k( edCol.begin() ); k != edCol.end(); ++k )
280             {
281                 k->pop_back();
282                 k->erase( k->begin() );
283             }
284             return;
285         }
286         if ( fun == "Outer" )
287         {
288             GetEDCollectionValue( ast->children[ 0 ], edCol );
289             if ( edCol.size() < 3 )
290                 return;
291             for ( CexmcEnergyDepositCalorimeterCollection::iterator
292                             k( edCol.begin() + 1 ); k != edCol.end() - 1; ++k )
293             {
294                 if ( k->size() < 3 )
295                     continue;
296                 k->erase( k->begin() + 1, k->end() - 1 );
297             }
298             return;
299         }
300     }
301     else
302     {
303         const CexmcAST::Leaf &      leaf( boost::get< CexmcAST::Leaf >(
304                                                                     node ) );
305         const CexmcAST::Variable &  var( boost::get< CexmcAST::Variable >(
306                                                                     leaf ) );
307 
308         if ( var.index1 != 0 || var.index2 != 0 )
309             throw CexmcException( CexmcCFUnexpectedVariableUsage );
310 
311         VarAddrMap::const_iterator  found( varAddrMap.find( var.name ) );
312 
313         if ( found == varAddrMap.end() )
314             throw CexmcException( CexmcCFUnexpectedVariable );
315 
316         const CexmcEnergyDepositCalorimeterCollection * const *  addr(
317                 boost::get< const CexmcEnergyDepositCalorimeterCollection * >(
318                                                             &found->second ) );
319         if ( ! addr )
320         {
321             throw CexmcException( CexmcCFUnexpectedVariableUsage );
322         }
323         else
324         {
325             if ( *addr )
326                 edCol = **addr;
327             return;
328         }
329     }
330 }
331 
332 
333 void  CexmcASTEval::BindAddresses( CexmcAST::Subtree &  ast )
334 {
335     if ( evFastSObject == NULL || evSObject == NULL )
336         return;
337 
338     for ( std::vector< CexmcAST::Node >::iterator  k( ast.children.begin() );
339                                                   k != ast.children.end(); ++k )
340     {
341         CexmcAST::Subtree *  subtree( boost::get< CexmcAST::Subtree >( &*k ) );
342 
343         if ( subtree )
344         {
345             BindAddresses( *subtree );
346         }
347         else
348         {
349             CexmcAST::Leaf &      leaf( boost::get< CexmcAST::Leaf >( *k ) );
350             CexmcAST::Variable *  var( boost::get< CexmcAST::Variable >(
351                                                                     &leaf ) );
352             if ( ! var )
353                 continue;
354 
355             const int * const *   intVarAddr(
356                                     boost::get< const int * >( &var->addr ) );
357             if ( intVarAddr )
358             {
359                 if ( *intVarAddr )
360                     continue;
361             }
362             else
363             {
364                 const double * const &  doubleVarAddr(
365                                     boost::get< const double * >( var->addr ) );
366                 if ( doubleVarAddr )
367                     continue;
368             }
369 
370             VarAddrMap::const_iterator  found( varAddrMap.find( var->name ) );
371 
372             if ( found != varAddrMap.end() )
373                 continue;
374 
375             do
376             {
377                 if ( var->name == CexmcCFVarEvent )
378                 {
379                     var->addr = &evFastSObject->eventId;
380                     break;
381                 }
382                 if ( var->name == CexmcCFVarOpCosThetaSCM )
383                 {
384                     var->addr = &evFastSObject->opCosThetaSCM;
385                     break;
386                 }
387                 if ( var->name == CexmcCFVarEDT )
388                 {
389                     varAddrMap.insert( VarAddrMapData( var->name,
390                                    &evFastSObject->edDigitizerHasTriggered ) );
391                     break;
392                 } 
393                 if ( var->name == CexmcCFVarMon )
394                 {
395                     varAddrMap.insert( VarAddrMapData( var->name,
396                            &evFastSObject->edDigitizerMonitorHasTriggered ) );
397                     break;
398                 }
399                 if ( var->name == CexmcCFVarMonED )
400                 {
401                     var->addr = &evSObject->monitorED;
402                     break;
403                 }
404                 if ( var->name == CexmcCFVarVclED )
405                 {
406                     var->addr = &evSObject->vetoCounterEDLeft;
407                     break;
408                 }
409                 if ( var->name == CexmcCFVarVcrED )
410                 {
411                     var->addr = &evSObject->vetoCounterEDRight;
412                     break;
413                 }
414                 if ( var->name == CexmcCFVarClED )
415                 {
416                     var->addr = &evSObject->calorimeterEDLeft;
417                     break;
418                 }
419                 if ( var->name == CexmcCFVarCrED )
420                 {
421                     var->addr = &evSObject->calorimeterEDRight;
422                     break;
423                 }
424                 if ( var->name == CexmcCFVarClEDCol )
425                 {
426                     varAddrMap.insert( VarAddrMapData( var->name,
427                                 &evSObject->calorimeterEDLeftCollection ) );
428                     break;
429                 }
430                 if ( var->name == CexmcCFVarCrEDCol )
431                 {
432                     varAddrMap.insert( VarAddrMapData( var->name,
433                                 &evSObject->calorimeterEDRightCollection ) );
434                     break;
435                 }
436                 if ( var->name == CexmcCFVarBpMonPosL )
437                 {
438                     var->addr = GetThreeVectorElementAddrByIndex(
439                             evSObject->monitorTP.positionLocal, var->index1 );
440                     break;
441                 }
442                 if ( var->name == CexmcCFVarBpMonPosW )
443                 {
444                     var->addr = GetThreeVectorElementAddrByIndex(
445                             evSObject->monitorTP.positionWorld, var->index1 );
446                     break;
447                 }
448                 if ( var->name == CexmcCFVarBpMonDirL )
449                 {
450                     var->addr = GetThreeVectorElementAddrByIndex(
451                             evSObject->monitorTP.directionLocal, var->index1 );
452                     break;
453                 }
454                 if ( var->name == CexmcCFVarBpMonDirW )
455                 {
456                     var->addr = GetThreeVectorElementAddrByIndex(
457                             evSObject->monitorTP.directionWorld, var->index1 );
458                     break;
459                 }
460                 if ( var->name == CexmcCFVarBpMonMom )
461                 {
462                     var->addr = &evSObject->monitorTP.momentumAmp;
463                     break;
464                 }
465                 if ( var->name == CexmcCFVarBpMonTid )
466                 {
467                     var->addr = &evSObject->monitorTP.trackId;
468                     break;
469                 }
470                 if ( var->name == CexmcCFVarBpTgtPosL )
471                 {
472                     var->addr = GetThreeVectorElementAddrByIndex(
473                             evSObject->targetTPBeamParticle.positionLocal,
474                             var->index1 );
475                     break;
476                 }
477                 if ( var->name == CexmcCFVarBpTgtPosW )
478                 {
479                     var->addr = GetThreeVectorElementAddrByIndex(
480                             evSObject->targetTPBeamParticle.positionWorld,
481                             var->index1 );
482                     break;
483                 }
484                 if ( var->name == CexmcCFVarBpTgtDirL )
485                 {
486                     var->addr = GetThreeVectorElementAddrByIndex(
487                             evSObject->targetTPBeamParticle.directionLocal,
488                             var->index1 );
489                     break;
490                 }
491                 if ( var->name == CexmcCFVarBpTgtDirW )
492                 {
493                     var->addr = GetThreeVectorElementAddrByIndex(
494                             evSObject->targetTPBeamParticle.directionWorld,
495                             var->index1 );
496                     break;
497                 }
498                 if ( var->name == CexmcCFVarBpTgtMom )
499                 {
500                     var->addr = &evSObject->targetTPBeamParticle.momentumAmp;
501                     break;
502                 }
503                 if ( var->name == CexmcCFVarBpTgtTid )
504                 {
505                     var->addr = &evSObject->targetTPBeamParticle.trackId;
506                     break;
507                 }
508                 if ( var->name == CexmcCFVarOpTgtPosL )
509                 {
510                     var->addr = GetThreeVectorElementAddrByIndex(
511                             evSObject->targetTPOutputParticle.positionLocal,
512                             var->index1 );
513                     break;
514                 }
515                 if ( var->name == CexmcCFVarOpTgtPosW )
516                 {
517                     var->addr = GetThreeVectorElementAddrByIndex(
518                             evSObject->targetTPOutputParticle.positionWorld,
519                             var->index1 );
520                     break;
521                 }
522                 if ( var->name == CexmcCFVarOpTgtDirL )
523                 {
524                     var->addr = GetThreeVectorElementAddrByIndex(
525                             evSObject->targetTPOutputParticle.directionLocal,
526                             var->index1 );
527                     break;
528                 }
529                 if ( var->name == CexmcCFVarOpTgtDirW )
530                 {
531                     var->addr = GetThreeVectorElementAddrByIndex(
532                             evSObject->targetTPOutputParticle.directionWorld,
533                             var->index1 );
534                     break;
535                 }
536                 if ( var->name == CexmcCFVarOpTgtMom )
537                 {
538                     var->addr = &evSObject->targetTPOutputParticle.momentumAmp;
539                     break;
540                 }
541                 if ( var->name == CexmcCFVarOpTgtTid )
542                 {
543                     var->addr = &evSObject->targetTPOutputParticle.trackId;
544                     break;
545                 }
546                 if ( var->name == CexmcCFVarNpTgtPosL )
547                 {
548                     var->addr = GetThreeVectorElementAddrByIndex(
549                             evSObject->targetTPNucleusParticle.positionLocal,
550                             var->index1 );
551                     break;
552                 }
553                 if ( var->name == CexmcCFVarNpTgtPosW )
554                 {
555                     var->addr = GetThreeVectorElementAddrByIndex(
556                             evSObject->targetTPNucleusParticle.positionWorld,
557                             var->index1 );
558                     break;
559                 }
560                 if ( var->name == CexmcCFVarNpTgtDirL )
561                 {
562                     var->addr = GetThreeVectorElementAddrByIndex(
563                             evSObject->targetTPNucleusParticle.directionLocal,
564                             var->index1 );
565                     break;
566                 }
567                 if ( var->name == CexmcCFVarNpTgtDirW )
568                 {
569                     var->addr = GetThreeVectorElementAddrByIndex(
570                             evSObject->targetTPNucleusParticle.directionWorld,
571                             var->index1 );
572                     break;
573                 }
574                 if ( var->name == CexmcCFVarNpTgtMom )
575                 {
576                     var->addr = &evSObject->targetTPNucleusParticle.momentumAmp;
577                     break;
578                 }
579                 if ( var->name == CexmcCFVarNpTgtTid )
580                 {
581                     var->addr = &evSObject->targetTPNucleusParticle.trackId;
582                     break;
583                 }
584                 if ( var->name == CexmcCFVarOpdp1TgtPosL )
585                 {
586                     var->addr = GetThreeVectorElementAddrByIndex(
587                         evSObject->targetTPOutputParticleDecayProductParticle1.
588                                                                 positionLocal,
589                         var->index1 );
590                     break;
591                 }
592                 if ( var->name == CexmcCFVarOpdp1TgtPosW )
593                 {
594                     var->addr = GetThreeVectorElementAddrByIndex(
595                         evSObject->targetTPOutputParticleDecayProductParticle1.
596                                                                 positionWorld,
597                         var->index1 );
598                     break;
599                 }
600                 if ( var->name == CexmcCFVarOpdp1TgtDirL )
601                 {
602                     var->addr = GetThreeVectorElementAddrByIndex(
603                         evSObject->targetTPOutputParticleDecayProductParticle1.
604                                                                 directionLocal,
605                         var->index1 );
606                     break;
607                 }
608                 if ( var->name == CexmcCFVarOpdp1TgtDirW )
609                 {
610                     var->addr = GetThreeVectorElementAddrByIndex(
611                         evSObject->targetTPOutputParticleDecayProductParticle1.
612                                                                 directionWorld,
613                         var->index1 );
614                     break;
615                 }
616                 if ( var->name == CexmcCFVarOpdp1TgtMom )
617                 {
618                     var->addr = &evSObject->
619                         targetTPOutputParticleDecayProductParticle1.momentumAmp;
620                     break;
621                 }
622                 if ( var->name == CexmcCFVarOpdp1TgtTid )
623                 {
624                     var->addr = &evSObject->
625                         targetTPOutputParticleDecayProductParticle1.trackId;
626                     break;
627                 }
628                 if ( var->name == CexmcCFVarOpdp2TgtPosL )
629                 {
630                     var->addr = GetThreeVectorElementAddrByIndex(
631                         evSObject->targetTPOutputParticleDecayProductParticle2.
632                                                                 positionLocal,
633                         var->index1 );
634                     break;
635                 }
636                 if ( var->name == CexmcCFVarOpdp2TgtPosW )
637                 {
638                     var->addr = GetThreeVectorElementAddrByIndex(
639                         evSObject->targetTPOutputParticleDecayProductParticle2.
640                                                                 positionWorld,
641                         var->index1 );
642                     break;
643                 }
644                 if ( var->name == CexmcCFVarOpdp2TgtDirL )
645                 {
646                     var->addr = GetThreeVectorElementAddrByIndex(
647                         evSObject->targetTPOutputParticleDecayProductParticle2.
648                                                                 directionLocal,
649                         var->index1 );
650                     break;
651                 }
652                 if ( var->name == CexmcCFVarOpdp2TgtDirW )
653                 {
654                     var->addr = GetThreeVectorElementAddrByIndex(
655                         evSObject->targetTPOutputParticleDecayProductParticle2.
656                                                                 directionWorld,
657                         var->index1 );
658                     break;
659                 }
660                 if ( var->name == CexmcCFVarOpdp2TgtMom )
661                 {
662                     var->addr = &evSObject->
663                         targetTPOutputParticleDecayProductParticle2.momentumAmp;
664                     break;
665                 }
666                 if ( var->name == CexmcCFVarOpdp2TgtTid )
667                 {
668                     var->addr = &evSObject->
669                         targetTPOutputParticleDecayProductParticle2.trackId;
670                     break;
671                 }
672                 if ( var->name == CexmcCFVarOpdpVclPosL )
673                 {
674                     var->addr = GetThreeVectorElementAddrByIndex(
675                             evSObject->vetoCounterTPLeft.positionLocal,
676                             var->index1 );
677                     break;
678                 }
679                 if ( var->name == CexmcCFVarOpdpVclPosW )
680                 {
681                     var->addr = GetThreeVectorElementAddrByIndex(
682                             evSObject->vetoCounterTPLeft.positionWorld,
683                             var->index1 );
684                     break;
685                 }
686                 if ( var->name == CexmcCFVarOpdpVclDirL )
687                 {
688                     var->addr = GetThreeVectorElementAddrByIndex(
689                             evSObject->vetoCounterTPLeft.directionLocal,
690                             var->index1 );
691                     break;
692                 }
693                 if ( var->name == CexmcCFVarOpdpVclDirW )
694                 {
695                     var->addr = GetThreeVectorElementAddrByIndex(
696                             evSObject->vetoCounterTPLeft.directionWorld,
697                             var->index1 );
698                     break;
699                 }
700                 if ( var->name == CexmcCFVarOpdpVclMom )
701                 {
702                     var->addr = &evSObject->vetoCounterTPLeft.momentumAmp;
703                     break;
704                 }
705                 if ( var->name == CexmcCFVarOpdpVclTid )
706                 {
707                     var->addr = &evSObject->vetoCounterTPLeft.trackId;
708                     break;
709                 }
710                 if ( var->name == CexmcCFVarOpdpVcrPosL )
711                 {
712                     var->addr = GetThreeVectorElementAddrByIndex(
713                             evSObject->vetoCounterTPRight.positionLocal,
714                             var->index1 );
715                     break;
716                 }
717                 if ( var->name == CexmcCFVarOpdpVcrPosW )
718                 {
719                     var->addr = GetThreeVectorElementAddrByIndex(
720                             evSObject->vetoCounterTPRight.positionWorld,
721                             var->index1 );
722                     break;
723                 }
724                 if ( var->name == CexmcCFVarOpdpVcrDirL )
725                 {
726                     var->addr = GetThreeVectorElementAddrByIndex(
727                             evSObject->vetoCounterTPRight.directionLocal,
728                             var->index1 );
729                     break;
730                 }
731                 if ( var->name == CexmcCFVarOpdpVcrDirW )
732                 {
733                     var->addr = GetThreeVectorElementAddrByIndex(
734                             evSObject->vetoCounterTPRight.directionWorld,
735                             var->index1 );
736                     break;
737                 }
738                 if ( var->name == CexmcCFVarOpdpVcrMom )
739                 {
740                     var->addr = &evSObject->vetoCounterTPRight.momentumAmp;
741                     break;
742                 }
743                 if ( var->name == CexmcCFVarOpdpVcrTid )
744                 {
745                     var->addr = &evSObject->vetoCounterTPRight.trackId;
746                     break;
747                 }
748                 if ( var->name == CexmcCFVarOpdpClPosL )
749                 {
750                     var->addr = GetThreeVectorElementAddrByIndex(
751                             evSObject->calorimeterTPLeft.positionLocal,
752                             var->index1 );
753                     break;
754                 }
755                 if ( var->name == CexmcCFVarOpdpClPosW )
756                 {
757                     var->addr = GetThreeVectorElementAddrByIndex(
758                             evSObject->calorimeterTPLeft.positionWorld,
759                             var->index1 );
760                     break;
761                 }
762                 if ( var->name == CexmcCFVarOpdpClDirL )
763                 {
764                     var->addr = GetThreeVectorElementAddrByIndex(
765                             evSObject->calorimeterTPLeft.directionLocal,
766                             var->index1 );
767                     break;
768                 }
769                 if ( var->name == CexmcCFVarOpdpClDirW )
770                 {
771                     var->addr = GetThreeVectorElementAddrByIndex(
772                             evSObject->calorimeterTPLeft.directionWorld,
773                             var->index1 );
774                     break;
775                 }
776                 if ( var->name == CexmcCFVarOpdpClMom )
777                 {
778                     var->addr = &evSObject->calorimeterTPLeft.momentumAmp;
779                     break;
780                 }
781                 if ( var->name == CexmcCFVarOpdpClTid )
782                 {
783                     var->addr = &evSObject->calorimeterTPLeft.trackId;
784                     break;
785                 }
786                 if ( var->name == CexmcCFVarOpdpCrPosL )
787                 {
788                     var->addr = GetThreeVectorElementAddrByIndex(
789                             evSObject->calorimeterTPRight.positionLocal,
790                             var->index1 );
791                     break;
792                 }
793                 if ( var->name == CexmcCFVarOpdpCrPosW )
794                 {
795                     var->addr = GetThreeVectorElementAddrByIndex(
796                             evSObject->calorimeterTPRight.positionWorld,
797                             var->index1 );
798                     break;
799                 }
800                 if ( var->name == CexmcCFVarOpdpCrDirL )
801                 {
802                     var->addr = GetThreeVectorElementAddrByIndex(
803                             evSObject->calorimeterTPRight.directionLocal,
804                             var->index1 );
805                     break;
806                 }
807                 if ( var->name == CexmcCFVarOpdpCrDirW )
808                 {
809                     var->addr = GetThreeVectorElementAddrByIndex(
810                             evSObject->calorimeterTPRight.directionWorld,
811                             var->index1 );
812                     break;
813                 }
814                 if ( var->name == CexmcCFVarOpdpCrMom )
815                 {
816                     var->addr = &evSObject->calorimeterTPRight.momentumAmp;
817                     break;
818                 }
819                 if ( var->name == CexmcCFVarOpdpCrTid )
820                 {
821                     var->addr = &evSObject->calorimeterTPRight.trackId;
822                     break;
823                 }
824                 if ( var->name == CexmcCFVarIpSCM )
825                 {
826                     var->addr = GetLorentzVectorElementAddrByIndex(
827                         evSObject->productionModelData.incidentParticleSCM,
828                         var->index1 );
829                     break;
830                 }
831                 if ( var->name == CexmcCFVarIpLAB )
832                 {
833                     var->addr = GetLorentzVectorElementAddrByIndex(
834                         evSObject->productionModelData.incidentParticleLAB,
835                         var->index1 );
836                     break;
837                 }
838                 if ( var->name == CexmcCFVarNpSCM )
839                 {
840                     var->addr = GetLorentzVectorElementAddrByIndex(
841                         evSObject->productionModelData.nucleusParticleSCM,
842                         var->index1 );
843                     break;
844                 }
845                 if ( var->name == CexmcCFVarNpLAB )
846                 {
847                     var->addr = GetLorentzVectorElementAddrByIndex(
848                         evSObject->productionModelData.nucleusParticleLAB,
849                         var->index1 );
850                     break;
851                 }
852                 if ( var->name == CexmcCFVarOpSCM )
853                 {
854                     var->addr = GetLorentzVectorElementAddrByIndex(
855                         evSObject->productionModelData.outputParticleSCM,
856                         var->index1 );
857                     break;
858                 }
859                 if ( var->name == CexmcCFVarOpLAB )
860                 {
861                     var->addr = GetLorentzVectorElementAddrByIndex(
862                         evSObject->productionModelData.outputParticleLAB,
863                         var->index1 );
864                     break;
865                 }
866                 if ( var->name == CexmcCFVarNopSCM )
867                 {
868                     var->addr = GetLorentzVectorElementAddrByIndex(
869                         evSObject->productionModelData.nucleusOutputParticleSCM,
870                         var->index1 );
871                     break;
872                 }
873                 if ( var->name == CexmcCFVarNopLAB )
874                 {
875                     var->addr = GetLorentzVectorElementAddrByIndex(
876                         evSObject->productionModelData.nucleusOutputParticleLAB,
877                         var->index1 );
878                     break;
879                 }
880                 if ( var->name == CexmcCFVarIpId )
881                 {
882                     var->addr =
883                         &evSObject->productionModelData.incidentParticle;
884                     break;
885                 }
886                 if ( var->name == CexmcCFVarNpId )
887                 {
888                     var->addr = &evSObject->productionModelData.nucleusParticle;
889                     break;
890                 }
891                 if ( var->name == CexmcCFVarOpId )
892                 {
893                     var->addr = &evSObject->productionModelData.outputParticle;
894                     break;
895                 }
896                 if ( var->name == CexmcCFVarNopId )
897                 {
898                     var->addr =
899                         &evSObject->productionModelData.nucleusOutputParticle;
900                     break;
901                 }
902                 if ( var->name == CexmcCFVarConst_eV )
903                 {
904                     var->addr = &constants[ 0 ];
905                     break;
906                 }
907                 if ( var->name == CexmcCFVarConst_keV )
908                 {
909                     var->addr = &constants[ 1 ];
910                     break;
911                 }
912                 if ( var->name == CexmcCFVarConst_MeV )
913                 {
914                     var->addr = &constants[ 2 ];
915                     break;
916                 }
917                 if ( var->name == CexmcCFVarConst_GeV )
918                 {
919                     var->addr = &constants[ 3 ];
920                     break;
921                 }
922                 if ( var->name == CexmcCFVarConst_mm )
923                 {
924                     var->addr = &constants[ 4 ];
925                     break;
926                 }
927                 if ( var->name == CexmcCFVarConst_cm )
928                 {
929                     var->addr = &constants[ 5 ];
930                     break;
931                 }
932                 if ( var->name == CexmcCFVarConst_m )
933                 {
934                     var->addr = &constants[ 6 ];
935                     break;
936                 }
937             } while ( false );
938         }
939     }
940 }
941 
942 
943 void  CexmcASTEval::ResetAddressBinding( CexmcAST::Subtree &  ast )
944 {
945     for ( std::vector< CexmcAST::Node >::iterator  k( ast.children.begin() );
946                                                   k != ast.children.end(); ++k )
947     {
948         CexmcAST::Subtree *  subtree( boost::get< CexmcAST::Subtree >( &*k ) );
949 
950         if ( subtree )
951         {
952             ResetAddressBinding( *subtree );
953         }
954         else
955         {
956             CexmcAST::Leaf &      leaf( boost::get< CexmcAST::Leaf >( *k ) );
957             CexmcAST::Variable *  var( boost::get< CexmcAST::Variable >(
958                                                                     &leaf ) );
959             if ( var )
960                 var->addr = ( const int * ) NULL;
961         }
962     }
963 }
964 
965 #endif
966 
967