bool TopMuonPairSelector::processEvent(cafe::Event &event)
    {
    //get pointer to statistics collector
        StatPointer stat ;
        event.get("StatPointer", stat) ;

        Collection<TMBEMCluster> em_from(event.getCollection<TMBEMCluster>(_electronBranch.c_str()));
        Collection<TMBMuon> mu_from(event.getCollection<TMBMuon>(_muonBranch.c_str()));

        Collection<TMBMuon> all_muons( event.getMuons() );

        if (em_from.size() == 0 && mu_from.size() == 0 && debug ) {
            out() << "PAIR SELECTOR WARNING! Electron/Muon branch " 
                    << _electronBranch << "/" << _muonBranch << " is empty or is not existing! "
                    << endl ;
            return true ;
        }

        if (em_from.size() >=2 && debug) {
            out() << "PAIR SELECTOR ERROR! 2 electrons found in branch \""
                    << _electronBranch << "\". Considering only leading electron outside of a jet!"
                    << endl ;
//     return false ;
        }

        l_mom.SetPxPyPzE( 0 , 0 , 0 , 0 );
        lepton_charge = 0;

        jet_array = event.getCollection<TMBJet>(_jet_branch.c_str());
        if( em_from.size() == 0 )
        {
            for( int i = 0 ; i < mu_from.size() ; i++ )
            {
                bool is_in_jet = false;
                if( dR_cut > 0 )
                {
                    for( int j = 0 ; j < jet_array.size() ; j++ )
                    {
                        if( do_dr_mujet_lead_muon && mu_from[i].DeltaR( jet_array[j] ) < dR_cut )
                            is_in_jet = true;
                    }
                }
                if( use_only_leading_lepton && i > 0 )
                    is_in_jet = true;
                if( mu_from[i].Pt() > l_mom.Pt() && mu_from[i].charge() != 0 && !is_in_jet )
                {
                    l_mom = mu_from[i];
                    l_track = const_cast<TMBTrack*>(mu_from[i].GetChargedTrack());
                    lepton_charge = mu_from[i].charge();
                }
            }
        }
        else
        {
            for( int i = 0 ; i < em_from.size() ; i++ )
            {
                if( em_from[i].Pt() > l_mom.Pt() && em_from[i].charge() != 0 )
                {
                    bool common_track = false;
                    for( int j = 0 ; j < all_muons.size() ; j++ )
                    {
                        if( remove_common_track && ( all_muons[j].GetChargedTrack() && all_muons[j].isLoose() == 1 )
                              && ( em_from[i].getPtrChp()->DeltaR( *all_muons[j].GetChargedTrack() ) < 1e-4 ) )
                            common_track = true;
                    }
                    if( use_only_leading_lepton && i > 0 )
                        common_track = true;
                    if( !common_track )
                    {
                        l_mom = em_from[i];
                        l_track = const_cast<TMBTrack*>(em_from[i].getPtrChp());
                        lepton_charge = em_from[i].charge();
                    }
                }
            }
        }

        if (_selectSameSign) 
        {
            stat.EventSelected("Same charge selection") ;     
        }
        else
        {
            stat.EventSelected("Opposite charge selection") ;
        }
  
        SelectUserObjects<TMBMuon>::processEvent(event);
  
        return true;
    }
Ejemplo n.º 2
0
    bool TriggerSelection::processEvent(Event& event)
    {
	++_numEvents;

	vector<TriggerEpoch>::iterator epoch = _epochs.end() ;
	for(vector<TriggerEpoch>::iterator jt = _epochs.begin() ; jt != _epochs.end(); jt++) {
	  if (jt->isEpoch(event)) {
	    if (epoch != _epochs.end()) 
	      throw runtime_error ("caf_trigger::TriggerSelection [" + name() +  
                        "] ERROR: event belong to two epoch [" + 
				   jt->name() + "] and [" + epoch->name() + "]." + 
				   " No overlaping epoch allows." ) ;
	    epoch = jt ; 
	  }
	}
	
	if (epoch == _epochs.end()) {
	  ostringstream s ;
	  s << "caf_trigger::TriggerSelection  [" + name() +   
                        "] ERROR: can't find epoch for the current event with run number " 
	    <<  event.getGlobal()->runno() ;
	  throw runtime_error (s.str()) ;
	}

	// increase number of events processed
	epoch->increaseNevents() ;

	StatPointer stat ;
	event.get("StatPointer", stat) ;

	bool trig_found = !_required;
	Collection<TMBTrigger> triggers = event.getTriggers(_vars);
	
	if(triggers.size()>0 && !_useTrigBits){


	  for(Collection<TMBTrigger>::const_iterator it = triggers.begin(); 
	      it != triggers.end(); ++it) {
	    
	    if(epoch->isInList(it->getTrgName())) {
	      trig_found = _required;
	      
	      // if _Tracking required, will run over all trigger in the list and increase 
	      // number of times when trigger fired. 
	      // If not, only the first fired trigger is detected.
	      if(!_Tracking) break ;
	    }
	  }
	}else{
	  const TMBTrigBits* trigbits = event.getTrigBits();
	  if(!trigbits) return false ;

	  map<string,long>* triggers = epoch->getMapOfTriggers() ;

	  for(map<string,long>::iterator it = triggers->begin(); it != triggers->end(); it++){

	    // if any trigger allow, doesn't make a verification
	    if (it->first == "ANY") break ;

	    if(trigbits->triggerFired(it->first)){
	      trig_found=_required;
	      it->second++ ; 
	      if(!_Tracking)  break ;
	    }
	  }
	}

	if(!trig_found) return false ;
	
	++_numPassed;
	stat.EventSelected(name()); 
	return true;
    }