44 #ifdef CEXMC_USE_CUSTOM_FILTER 
   47 #include <boost/variant/get.hpp> 
   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" );
 
  151 CexmcASTEval::CexmcASTEval( 
const CexmcEventFastSObject *  evFastSObject,
 
  152                             const CexmcEventSObject *  evSObject ) :
 
  153     evFastSObject( evFastSObject ), evSObject( evSObject )
 
  158 CexmcAST::BasicEval::ScalarValueType  CexmcASTEval::GetFunScalarValue(
 
  159                                         const CexmcAST::Subtree &  ast )
 const 
  161     const CexmcAST::Function &  fun( boost::get< CexmcAST::Function >(
 
  167         GetEDCollectionValue( ast.children[ 0 ], edCol );
 
  171         for ( CexmcEnergyDepositCalorimeterCollection::iterator
 
  172                                     k( edCol.begin() ); k != edCol.end(); ++k )
 
  174             result += std::accumulate( k->begin(), k->end(), 
G4double( 0. ) );
 
  180     bool             evalResult( 
false );
 
  181     ScalarValueType  result( GetBasicFunScalarValue( ast, evalResult ) );
 
  192 CexmcAST::BasicEval::ScalarValueType  CexmcASTEval::GetVarScalarValue(
 
  193                                         const CexmcAST::Variable &  var )
 const 
  195     if ( evFastSObject == NULL || evSObject == NULL )
 
  202     const double * 
const *  addr( boost::get< const double * >( &var.addr ) );
 
  211         const int * 
const &  addr( boost::get< const int * >( var.addr ) );
 
  219     VarAddrMap::const_iterator  found( varAddrMap.find( var.name ) );
 
  221     if ( found != varAddrMap.end() )
 
  224                 boost::get< const CexmcEnergyDepositCalorimeterCollection * >(
 
  230                 if ( ( *addr )->size() == 0 )
 
  232                 if ( var.index1 == 0 || var.index2 == 0 )
 
  234                 return ( *addr )->at( var.index1 - 1 ).at( var.index2 - 1 );
 
  239             const bool * 
const &  addr( boost::get< const bool * >(
 
  248     if ( var.name == CexmcCFVarTPT )
 
  250         return int( evSObject->targetTPOutputParticle.trackId !=
 
  260 void  CexmcASTEval::GetEDCollectionValue( 
const CexmcAST::Node &  node,
 
  263     if ( evSObject == NULL )
 
  266     const CexmcAST::Subtree *  ast( boost::get< CexmcAST::Subtree >( &node ) );
 
  270         const CexmcAST::Function &  fun( boost::get< CexmcAST::Function >(
 
  273         if ( fun == 
"Inner" )
 
  275             GetEDCollectionValue( ast->children[ 0 ], edCol );
 
  277             edCol.erase( edCol.begin() );
 
  278             for ( CexmcEnergyDepositCalorimeterCollection::iterator
 
  279                             k( edCol.begin() ); k != edCol.end(); ++k )
 
  282                 k->erase( k->begin() );
 
  286         if ( fun == 
"Outer" )
 
  288             GetEDCollectionValue( ast->children[ 0 ], edCol );
 
  289             if ( edCol.size() < 3 )
 
  291             for ( CexmcEnergyDepositCalorimeterCollection::iterator
 
  292                             k( edCol.begin() + 1 ); k != edCol.end() - 1; ++k )
 
  296                 k->erase( k->begin() + 1, k->end() - 1 );
 
  303         const CexmcAST::Leaf &      leaf( boost::get< CexmcAST::Leaf >(
 
  305         const CexmcAST::Variable &  var( boost::get< CexmcAST::Variable >(
 
  308         if ( var.index1 != 0 || var.index2 != 0 )
 
  311         VarAddrMap::const_iterator  found( varAddrMap.find( var.name ) );
 
  313         if ( found == varAddrMap.end() )
 
  317                 boost::get< const CexmcEnergyDepositCalorimeterCollection * >(
 
  333 void  CexmcASTEval::BindAddresses( CexmcAST::Subtree &  ast )
 
  335     if ( evFastSObject == NULL || evSObject == NULL )
 
  338     for ( std::vector< CexmcAST::Node >::iterator  k( ast.children.begin() );
 
  339                                                   k != ast.children.end(); ++k )
 
  341         CexmcAST::Subtree *  subtree( boost::get< CexmcAST::Subtree >( &*k ) );
 
  345             BindAddresses( *subtree );
 
  349             CexmcAST::Leaf &      leaf( boost::get< CexmcAST::Leaf >( *k ) );
 
  350             CexmcAST::Variable *  var( boost::get< CexmcAST::Variable >(
 
  355             const int * 
const *   intVarAddr(
 
  356                                     boost::get< const int * >( &var->addr ) );
 
  364                 const double * 
const &  doubleVarAddr(
 
  365                                     boost::get< const double * >( var->addr ) );
 
  370             VarAddrMap::const_iterator  found( varAddrMap.find( var->name ) );
 
  372             if ( found != varAddrMap.end() )
 
  377                 if ( var->name == CexmcCFVarEvent )
 
  379                     var->addr = &evFastSObject->eventId;
 
  382                 if ( var->name == CexmcCFVarOpCosThetaSCM )
 
  384                     var->addr = &evFastSObject->opCosThetaSCM;
 
  387                 if ( var->name == CexmcCFVarEDT )
 
  389                     varAddrMap.insert( VarAddrMapData( var->name,
 
  390                                    &evFastSObject->edDigitizerHasTriggered ) );
 
  393                 if ( var->name == CexmcCFVarMon )
 
  395                     varAddrMap.insert( VarAddrMapData( var->name,
 
  396                            &evFastSObject->edDigitizerMonitorHasTriggered ) );
 
  399                 if ( var->name == CexmcCFVarMonED )
 
  401                     var->addr = &evSObject->monitorED;
 
  404                 if ( var->name == CexmcCFVarVclED )
 
  406                     var->addr = &evSObject->vetoCounterEDLeft;
 
  409                 if ( var->name == CexmcCFVarVcrED )
 
  411                     var->addr = &evSObject->vetoCounterEDRight;
 
  414                 if ( var->name == CexmcCFVarClED )
 
  416                     var->addr = &evSObject->calorimeterEDLeft;
 
  419                 if ( var->name == CexmcCFVarCrED )
 
  421                     var->addr = &evSObject->calorimeterEDRight;
 
  424                 if ( var->name == CexmcCFVarClEDCol )
 
  426                     varAddrMap.insert( VarAddrMapData( var->name,
 
  427                                 &evSObject->calorimeterEDLeftCollection ) );
 
  430                 if ( var->name == CexmcCFVarCrEDCol )
 
  432                     varAddrMap.insert( VarAddrMapData( var->name,
 
  433                                 &evSObject->calorimeterEDRightCollection ) );
 
  436                 if ( var->name == CexmcCFVarBpMonPosL )
 
  438                     var->addr = GetThreeVectorElementAddrByIndex(
 
  439                             evSObject->monitorTP.positionLocal, var->index1 );
 
  442                 if ( var->name == CexmcCFVarBpMonPosW )
 
  444                     var->addr = GetThreeVectorElementAddrByIndex(
 
  445                             evSObject->monitorTP.positionWorld, var->index1 );
 
  448                 if ( var->name == CexmcCFVarBpMonDirL )
 
  450                     var->addr = GetThreeVectorElementAddrByIndex(
 
  451                             evSObject->monitorTP.directionLocal, var->index1 );
 
  454                 if ( var->name == CexmcCFVarBpMonDirW )
 
  456                     var->addr = GetThreeVectorElementAddrByIndex(
 
  457                             evSObject->monitorTP.directionWorld, var->index1 );
 
  460                 if ( var->name == CexmcCFVarBpMonMom )
 
  462                     var->addr = &evSObject->monitorTP.momentumAmp;
 
  465                 if ( var->name == CexmcCFVarBpMonTid )
 
  467                     var->addr = &evSObject->monitorTP.trackId;
 
  470                 if ( var->name == CexmcCFVarBpTgtPosL )
 
  472                     var->addr = GetThreeVectorElementAddrByIndex(
 
  473                             evSObject->targetTPBeamParticle.positionLocal,
 
  477                 if ( var->name == CexmcCFVarBpTgtPosW )
 
  479                     var->addr = GetThreeVectorElementAddrByIndex(
 
  480                             evSObject->targetTPBeamParticle.positionWorld,
 
  484                 if ( var->name == CexmcCFVarBpTgtDirL )
 
  486                     var->addr = GetThreeVectorElementAddrByIndex(
 
  487                             evSObject->targetTPBeamParticle.directionLocal,
 
  491                 if ( var->name == CexmcCFVarBpTgtDirW )
 
  493                     var->addr = GetThreeVectorElementAddrByIndex(
 
  494                             evSObject->targetTPBeamParticle.directionWorld,
 
  498                 if ( var->name == CexmcCFVarBpTgtMom )
 
  500                     var->addr = &evSObject->targetTPBeamParticle.momentumAmp;
 
  503                 if ( var->name == CexmcCFVarBpTgtTid )
 
  505                     var->addr = &evSObject->targetTPBeamParticle.trackId;
 
  508                 if ( var->name == CexmcCFVarOpTgtPosL )
 
  510                     var->addr = GetThreeVectorElementAddrByIndex(
 
  511                             evSObject->targetTPOutputParticle.positionLocal,
 
  515                 if ( var->name == CexmcCFVarOpTgtPosW )
 
  517                     var->addr = GetThreeVectorElementAddrByIndex(
 
  518                             evSObject->targetTPOutputParticle.positionWorld,
 
  522                 if ( var->name == CexmcCFVarOpTgtDirL )
 
  524                     var->addr = GetThreeVectorElementAddrByIndex(
 
  525                             evSObject->targetTPOutputParticle.directionLocal,
 
  529                 if ( var->name == CexmcCFVarOpTgtDirW )
 
  531                     var->addr = GetThreeVectorElementAddrByIndex(
 
  532                             evSObject->targetTPOutputParticle.directionWorld,
 
  536                 if ( var->name == CexmcCFVarOpTgtMom )
 
  538                     var->addr = &evSObject->targetTPOutputParticle.momentumAmp;
 
  541                 if ( var->name == CexmcCFVarOpTgtTid )
 
  543                     var->addr = &evSObject->targetTPOutputParticle.trackId;
 
  546                 if ( var->name == CexmcCFVarNpTgtPosL )
 
  548                     var->addr = GetThreeVectorElementAddrByIndex(
 
  549                             evSObject->targetTPNucleusParticle.positionLocal,
 
  553                 if ( var->name == CexmcCFVarNpTgtPosW )
 
  555                     var->addr = GetThreeVectorElementAddrByIndex(
 
  556                             evSObject->targetTPNucleusParticle.positionWorld,
 
  560                 if ( var->name == CexmcCFVarNpTgtDirL )
 
  562                     var->addr = GetThreeVectorElementAddrByIndex(
 
  563                             evSObject->targetTPNucleusParticle.directionLocal,
 
  567                 if ( var->name == CexmcCFVarNpTgtDirW )
 
  569                     var->addr = GetThreeVectorElementAddrByIndex(
 
  570                             evSObject->targetTPNucleusParticle.directionWorld,
 
  574                 if ( var->name == CexmcCFVarNpTgtMom )
 
  576                     var->addr = &evSObject->targetTPNucleusParticle.momentumAmp;
 
  579                 if ( var->name == CexmcCFVarNpTgtTid )
 
  581                     var->addr = &evSObject->targetTPNucleusParticle.trackId;
 
  584                 if ( var->name == CexmcCFVarOpdp1TgtPosL )
 
  586                     var->addr = GetThreeVectorElementAddrByIndex(
 
  587                         evSObject->targetTPOutputParticleDecayProductParticle1.
 
  592                 if ( var->name == CexmcCFVarOpdp1TgtPosW )
 
  594                     var->addr = GetThreeVectorElementAddrByIndex(
 
  595                         evSObject->targetTPOutputParticleDecayProductParticle1.
 
  600                 if ( var->name == CexmcCFVarOpdp1TgtDirL )
 
  602                     var->addr = GetThreeVectorElementAddrByIndex(
 
  603                         evSObject->targetTPOutputParticleDecayProductParticle1.
 
  608                 if ( var->name == CexmcCFVarOpdp1TgtDirW )
 
  610                     var->addr = GetThreeVectorElementAddrByIndex(
 
  611                         evSObject->targetTPOutputParticleDecayProductParticle1.
 
  616                 if ( var->name == CexmcCFVarOpdp1TgtMom )
 
  618                     var->addr = &evSObject->
 
  619                         targetTPOutputParticleDecayProductParticle1.momentumAmp;
 
  622                 if ( var->name == CexmcCFVarOpdp1TgtTid )
 
  624                     var->addr = &evSObject->
 
  625                         targetTPOutputParticleDecayProductParticle1.trackId;
 
  628                 if ( var->name == CexmcCFVarOpdp2TgtPosL )
 
  630                     var->addr = GetThreeVectorElementAddrByIndex(
 
  631                         evSObject->targetTPOutputParticleDecayProductParticle2.
 
  636                 if ( var->name == CexmcCFVarOpdp2TgtPosW )
 
  638                     var->addr = GetThreeVectorElementAddrByIndex(
 
  639                         evSObject->targetTPOutputParticleDecayProductParticle2.
 
  644                 if ( var->name == CexmcCFVarOpdp2TgtDirL )
 
  646                     var->addr = GetThreeVectorElementAddrByIndex(
 
  647                         evSObject->targetTPOutputParticleDecayProductParticle2.
 
  652                 if ( var->name == CexmcCFVarOpdp2TgtDirW )
 
  654                     var->addr = GetThreeVectorElementAddrByIndex(
 
  655                         evSObject->targetTPOutputParticleDecayProductParticle2.
 
  660                 if ( var->name == CexmcCFVarOpdp2TgtMom )
 
  662                     var->addr = &evSObject->
 
  663                         targetTPOutputParticleDecayProductParticle2.momentumAmp;
 
  666                 if ( var->name == CexmcCFVarOpdp2TgtTid )
 
  668                     var->addr = &evSObject->
 
  669                         targetTPOutputParticleDecayProductParticle2.trackId;
 
  672                 if ( var->name == CexmcCFVarOpdpVclPosL )
 
  674                     var->addr = GetThreeVectorElementAddrByIndex(
 
  675                             evSObject->vetoCounterTPLeft.positionLocal,
 
  679                 if ( var->name == CexmcCFVarOpdpVclPosW )
 
  681                     var->addr = GetThreeVectorElementAddrByIndex(
 
  682                             evSObject->vetoCounterTPLeft.positionWorld,
 
  686                 if ( var->name == CexmcCFVarOpdpVclDirL )
 
  688                     var->addr = GetThreeVectorElementAddrByIndex(
 
  689                             evSObject->vetoCounterTPLeft.directionLocal,
 
  693                 if ( var->name == CexmcCFVarOpdpVclDirW )
 
  695                     var->addr = GetThreeVectorElementAddrByIndex(
 
  696                             evSObject->vetoCounterTPLeft.directionWorld,
 
  700                 if ( var->name == CexmcCFVarOpdpVclMom )
 
  702                     var->addr = &evSObject->vetoCounterTPLeft.momentumAmp;
 
  705                 if ( var->name == CexmcCFVarOpdpVclTid )
 
  707                     var->addr = &evSObject->vetoCounterTPLeft.trackId;
 
  710                 if ( var->name == CexmcCFVarOpdpVcrPosL )
 
  712                     var->addr = GetThreeVectorElementAddrByIndex(
 
  713                             evSObject->vetoCounterTPRight.positionLocal,
 
  717                 if ( var->name == CexmcCFVarOpdpVcrPosW )
 
  719                     var->addr = GetThreeVectorElementAddrByIndex(
 
  720                             evSObject->vetoCounterTPRight.positionWorld,
 
  724                 if ( var->name == CexmcCFVarOpdpVcrDirL )
 
  726                     var->addr = GetThreeVectorElementAddrByIndex(
 
  727                             evSObject->vetoCounterTPRight.directionLocal,
 
  731                 if ( var->name == CexmcCFVarOpdpVcrDirW )
 
  733                     var->addr = GetThreeVectorElementAddrByIndex(
 
  734                             evSObject->vetoCounterTPRight.directionWorld,
 
  738                 if ( var->name == CexmcCFVarOpdpVcrMom )
 
  740                     var->addr = &evSObject->vetoCounterTPRight.momentumAmp;
 
  743                 if ( var->name == CexmcCFVarOpdpVcrTid )
 
  745                     var->addr = &evSObject->vetoCounterTPRight.trackId;
 
  748                 if ( var->name == CexmcCFVarOpdpClPosL )
 
  750                     var->addr = GetThreeVectorElementAddrByIndex(
 
  751                             evSObject->calorimeterTPLeft.positionLocal,
 
  755                 if ( var->name == CexmcCFVarOpdpClPosW )
 
  757                     var->addr = GetThreeVectorElementAddrByIndex(
 
  758                             evSObject->calorimeterTPLeft.positionWorld,
 
  762                 if ( var->name == CexmcCFVarOpdpClDirL )
 
  764                     var->addr = GetThreeVectorElementAddrByIndex(
 
  765                             evSObject->calorimeterTPLeft.directionLocal,
 
  769                 if ( var->name == CexmcCFVarOpdpClDirW )
 
  771                     var->addr = GetThreeVectorElementAddrByIndex(
 
  772                             evSObject->calorimeterTPLeft.directionWorld,
 
  776                 if ( var->name == CexmcCFVarOpdpClMom )
 
  778                     var->addr = &evSObject->calorimeterTPLeft.momentumAmp;
 
  781                 if ( var->name == CexmcCFVarOpdpClTid )
 
  783                     var->addr = &evSObject->calorimeterTPLeft.trackId;
 
  786                 if ( var->name == CexmcCFVarOpdpCrPosL )
 
  788                     var->addr = GetThreeVectorElementAddrByIndex(
 
  789                             evSObject->calorimeterTPRight.positionLocal,
 
  793                 if ( var->name == CexmcCFVarOpdpCrPosW )
 
  795                     var->addr = GetThreeVectorElementAddrByIndex(
 
  796                             evSObject->calorimeterTPRight.positionWorld,
 
  800                 if ( var->name == CexmcCFVarOpdpCrDirL )
 
  802                     var->addr = GetThreeVectorElementAddrByIndex(
 
  803                             evSObject->calorimeterTPRight.directionLocal,
 
  807                 if ( var->name == CexmcCFVarOpdpCrDirW )
 
  809                     var->addr = GetThreeVectorElementAddrByIndex(
 
  810                             evSObject->calorimeterTPRight.directionWorld,
 
  814                 if ( var->name == CexmcCFVarOpdpCrMom )
 
  816                     var->addr = &evSObject->calorimeterTPRight.momentumAmp;
 
  819                 if ( var->name == CexmcCFVarOpdpCrTid )
 
  821                     var->addr = &evSObject->calorimeterTPRight.trackId;
 
  824                 if ( var->name == CexmcCFVarIpSCM )
 
  826                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  827                         evSObject->productionModelData.incidentParticleSCM,
 
  831                 if ( var->name == CexmcCFVarIpLAB )
 
  833                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  834                         evSObject->productionModelData.incidentParticleLAB,
 
  838                 if ( var->name == CexmcCFVarNpSCM )
 
  840                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  841                         evSObject->productionModelData.nucleusParticleSCM,
 
  845                 if ( var->name == CexmcCFVarNpLAB )
 
  847                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  848                         evSObject->productionModelData.nucleusParticleLAB,
 
  852                 if ( var->name == CexmcCFVarOpSCM )
 
  854                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  855                         evSObject->productionModelData.outputParticleSCM,
 
  859                 if ( var->name == CexmcCFVarOpLAB )
 
  861                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  862                         evSObject->productionModelData.outputParticleLAB,
 
  866                 if ( var->name == CexmcCFVarNopSCM )
 
  868                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  869                         evSObject->productionModelData.nucleusOutputParticleSCM,
 
  873                 if ( var->name == CexmcCFVarNopLAB )
 
  875                     var->addr = GetLorentzVectorElementAddrByIndex(
 
  876                         evSObject->productionModelData.nucleusOutputParticleLAB,
 
  880                 if ( var->name == CexmcCFVarIpId )
 
  883                         &evSObject->productionModelData.incidentParticle;
 
  886                 if ( var->name == CexmcCFVarNpId )
 
  888                     var->addr = &evSObject->productionModelData.nucleusParticle;
 
  891                 if ( var->name == CexmcCFVarOpId )
 
  893                     var->addr = &evSObject->productionModelData.outputParticle;
 
  896                 if ( var->name == CexmcCFVarNopId )
 
  899                         &evSObject->productionModelData.nucleusOutputParticle;
 
  902                 if ( var->name == CexmcCFVarConst_eV )
 
  904                     var->addr = &constants[ 0 ];
 
  907                 if ( var->name == CexmcCFVarConst_keV )
 
  909                     var->addr = &constants[ 1 ];
 
  912                 if ( var->name == CexmcCFVarConst_MeV )
 
  914                     var->addr = &constants[ 2 ];
 
  917                 if ( var->name == CexmcCFVarConst_GeV )
 
  919                     var->addr = &constants[ 3 ];
 
  922                 if ( var->name == CexmcCFVarConst_mm )
 
  924                     var->addr = &constants[ 4 ];
 
  927                 if ( var->name == CexmcCFVarConst_cm )
 
  929                     var->addr = &constants[ 5 ];
 
  932                 if ( var->name == CexmcCFVarConst_m )
 
  934                     var->addr = &constants[ 6 ];
 
  943 void  CexmcASTEval::ResetAddressBinding( CexmcAST::Subtree &  ast )
 
  945     for ( std::vector< CexmcAST::Node >::iterator  k( ast.children.begin() );
 
  946                                                   k != ast.children.end(); ++k )
 
  948         CexmcAST::Subtree *  subtree( boost::get< CexmcAST::Subtree >( &*k ) );
 
  952             ResetAddressBinding( *subtree );
 
  956             CexmcAST::Leaf &      leaf( boost::get< CexmcAST::Leaf >( *k ) );
 
  957             CexmcAST::Variable *  var( boost::get< CexmcAST::Variable >(
 
  960                 var->addr = ( 
const int * ) NULL;
 
const G4int CexmcInvalidTrackId(-1)
 
std::vector< CexmcEnergyDepositCrystalRowCollection > CexmcEnergyDepositCalorimeterCollection