Beispiel #1
0
void Metal::setVariables( VariableContainer& container ) const
{
    container.setTexture( "reflectance", m_reflectance );
    container.setTexture( "alpha",       m_alpha       );
    container.setTexture( "eta",         m_eta         );
    container.setTexture( "k",           m_k           );
}
Beispiel #2
0
void Dielectric::setVariables( VariableContainer& container ) const
{
    container.setFloat( "ior_out",    m_ior_out );
    container.setFloat( "ior_in",     m_ior_in  );
    container.setFloat( "absorption", m_absorption);
    container.setFloat( "reflectance", m_reflectance );
    container.setFloat( "transmittance", m_transmittance );
}
Beispiel #3
0
void Beckmann::setVariables( VariableContainer& container ) const
{
    /*
    container.setFloat( "reflectance", Color( 0.5f ) );
    container.setFloat( "alpha",       0.02f         );
    */
    container.setTexture( "reflectance", m_reflectance );
    container.setTexture( "alpha",       m_alpha );
}
EnvironmentVariablesManager::VariableContainer 
EnvironmentVariablesManager::PairToContainer(const std::string& name,
                                             const std::string& value) const {
  VariableContainer pair;                                            
  std::copy(name.begin(), name.end(), std::back_inserter(pair));
  pair.push_back('=');
  std::copy(value.begin(), value.end(), std::back_inserter(pair));
  pair.push_back('\0');
  return pair;
}
void ProgressiveRenderer::setVariables( VariableContainer& container ) const
{
    const unsigned do_byte_updates  = m_display->getUpdateFrameType() &
                                      IDisplay::BYTE;
    const unsigned do_byte_complete = m_display->getCompleteFrameType() &
                                      IDisplay::BYTE;
    container.setBuffer  ( "float_output_buffer", m_float_output_buffer );
    container.setBuffer  ( "byte_output_buffer",  m_byte_output_buffer  );
    container.setUnsigned( "samples_per_pixel",   getSamplesPerPixel()  );
    container.setUnsigned( "do_byte_updates",     do_byte_updates       );
    container.setUnsigned( "do_byte_complete",    do_byte_complete      );
    container.setUnsigned( "max_diff_depth",      m_max_diff_depth      );
    container.setUnsigned( "max_spec_depth",      m_max_spec_depth      );
}
void ProgressiveRenderer::preRender( VariableContainer& container )
{
    LLOG_INFO << "\tProgressiveRenderer : pre rendering ...";
    m_float_output_buffer->setSize( getResolution().x(), getResolution().y() );
    m_byte_output_buffer->setSize ( getResolution().x(), getResolution().y() );

    //
    // Force pre-compilation and accel structure builds
    //
    {
        container.setUnsigned( "sample_index", 0u   );
        container.setFloat   ( "light_seed"  , 0.0f );
        AutoPrintTimer apt( PrintTimeElapsed( "\tCompile/accel build " ) );
        launchOptiX( Index2( 0u, 0u ) );
    }
}
void WeightProcessor::Process(const InputCollections& input,VariableContainer& vars){
  if(!initialized) cerr << "tree processor not initialized" << endl;
  
  for (auto it=input.weights.begin(); it!=input.weights.end(); ++it){
    vars.FillVar( it->first,it->second);  
  }
}
void WeightProcessor::Init(const InputCollections& input,VariableContainer& vars){

  for (auto it=input.weights.begin(); it!=input.weights.end(); ++it){
    vars.InitVar(it->first);  
  }

  initialized=true;
}
void ProgressiveRenderer::render( VariableContainer& container )
{
    LLOG_INFO << "\tProgressiveRenderer : rendering ...";
    //
    // Progressive loop
    //
    legion::MTRand32 mtrand;

    LoopTimerInfo progressive_updates( "\tProgressive loop    :" );

    m_display->setUpdateCount( getSamplesPerPixel() );
    m_display->beginFrame( getResolution() );

    for( unsigned i = 0; i < getSamplesPerPixel(); ++i )
    {
        LoopTimer timer( progressive_updates );

        container.setUnsigned( "sample_index", i         );
        container.setFloat   ( "light_seed"  , mtrand() );
        launchOptiX( getResolution() );

        const IDisplay::FrameType frame_type = m_display->getUpdateFrameType();
        float* fpix = 0;
        unsigned char* bpix = 0;
        if( frame_type & IDisplay::FLOAT )
            fpix = reinterpret_cast<float*>( m_float_output_buffer->map() );
        if( frame_type & IDisplay::BYTE )
            bpix =
                reinterpret_cast<unsigned char*>( m_byte_output_buffer->map() );

        bool keep_going = m_display->updateFrame( fpix, bpix );
        
        if( frame_type & IDisplay::FLOAT )
            m_float_output_buffer->unmap();
        if( frame_type & IDisplay::BYTE )
            m_byte_output_buffer->unmap();

        if( !keep_going )
            break;
    }

    //
    // Log statistics
    //
    progressive_updates.log();
    const float num_pixels = getResolution().x() * 
                             getResolution().y() * 
                             static_cast<float>(getSamplesPerPixel());
    LLOG_STAT << "| render time | " << progressive_updates.total_time;
    LLOG_STAT << "| pixels/second | " 
              << static_cast<unsigned>( num_pixels / 
                                        progressive_updates.total_time );

    //
    // Display
    //
    AutoPrintTimer apt( PrintTimeElapsed( "\tDisplay" ) );
    const IDisplay::FrameType frame_type = m_display->getCompleteFrameType();
    float* fpix = 0;
    unsigned char* bpix = 0;
    if( frame_type & IDisplay::FLOAT )
        fpix = reinterpret_cast<float*>( m_float_output_buffer->map() );
    if( frame_type & IDisplay::BYTE )
        bpix = reinterpret_cast<unsigned char*>( m_byte_output_buffer->map() );

    m_display->completeFrame( fpix, bpix ); 
    
    if( frame_type & IDisplay::FLOAT )
        m_float_output_buffer->unmap();
    if( frame_type & IDisplay::BYTE )
        m_byte_output_buffer->unmap();
}
Beispiel #10
0
void DiffuseEmitter::setVariables( VariableContainer& container ) const
{
    container.setFloat( "radiance", m_radiance );
}
Beispiel #11
0
void MVAVarProcessor::Init(const InputCollections& input,VariableContainer& vars){
 
  vars.InitVar( "N_Jets","I" );
  vars.InitVar( "N_LooseJets","I" );
  vars.InitVar( "N_TightLeptons","I" );
  vars.InitVar( "N_LooseLeptons" ,"I");
  vars.InitVar( "N_TightElectrons" ,"I");
  vars.InitVar( "N_LooseElectrons","I" );
  vars.InitVar( "N_TightMuons" ,"I");
  vars.InitVar( "N_LooseMuons" ,"I");
  vars.InitVar( "N_BTagsM" ,"I");
  vars.InitVar( "N_BTagsT","I" );
  vars.InitVar( "N_BTagsL" ,"I");
  vars.InitVar( "N_PrimaryVertices","I" );
  
  vars.InitVars( "Jet_E","N_Jets" );
  vars.InitVars( "Jet_M","N_Jets" );
  vars.InitVars( "Jet_Pt","N_Jets" );
  vars.InitVars( "Jet_Phi","N_Jets" );
  vars.InitVars( "Jet_Eta","N_Jets" );
  vars.InitVars( "Jet_CSV","N_Jets" );
  vars.InitVars( "Jet_Flav","N_Jets" );
  
  vars.InitVars( "TaggedJet_E","N_BTagsM" );
  vars.InitVars( "TaggedJet_M","N_BTagsM" );
  vars.InitVars( "TaggedJet_Pt","N_BTagsM" );
  vars.InitVars( "TaggedJet_Phi","N_BTagsM" );
  vars.InitVars( "TaggedJet_Eta","N_BTagsM" );
  
  vars.InitVar( "Evt_E_PrimaryLepton" );
  vars.InitVar( "Evt_M_PrimaryLepton" );
  vars.InitVar( "Evt_Pt_PrimaryLepton" );
  vars.InitVar( "Evt_Eta_PrimaryLepton" );
  vars.InitVar( "Evt_Phi_PrimaryLepton" );
  
  vars.InitVars( "LooseLepton_E","N_LooseLeptons" );
  vars.InitVars( "LooseLepton_M","N_LooseLeptons" );
  vars.InitVars( "LooseLepton_Pt","N_LooseLeptons" );
  vars.InitVars( "LooseLepton_Eta","N_LooseLeptons" );
  vars.InitVars( "LooseLepton_Phi","N_LooseLeptons" );
  
  vars.InitVars( "Muon_E","N_LooseMuons" );
  vars.InitVars( "Muon_M","N_LooseMuons" );
  vars.InitVars( "Muon_Pt","N_LooseMuons" );
  vars.InitVars( "Muon_Eta","N_LooseMuons" );
  vars.InitVars( "Muon_Phi","N_LooseMuons" );
  
  vars.InitVars( "Electron_E","N_LooseElectrons" );
  vars.InitVars( "Electron_M","N_LooseElectrons" );
  vars.InitVars( "Electron_Pt","N_LooseElectrons" );
  vars.InitVars( "Electron_Eta","N_LooseElectrons" );
  vars.InitVars( "Electron_Phi","N_LooseElectrons" );
  
  vars.InitVar( "Evt_Pt_MET" );
  vars.InitVar( "Evt_Phi_MET" );

  vars.InitVar("Evt_M3");
  vars.InitVar("Evt_M3_OneJetTagged");
  vars.InitVar("Evt_MTW");
  vars.InitVar("Evt_HT");
  vars.InitVar("Evt_HT_Jets");
  vars.InitVar("Evt_M_Total");
  vars.InitVar("Evt_MHT");
  
  vars.InitVars( "CSV","N_Jets" );
  vars.InitVar( "Evt_CSV_Average" );
  vars.InitVar( "Evt_CSV_Min" );
  vars.InitVar( "Evt_CSV_Dev" );
  vars.InitVar( "Evt_CSV_Average_Tagged" );
  vars.InitVar( "Evt_CSV_Min_Tagged" );
  vars.InitVar( "Evt_CSV_Dev_Tagged" );

  vars.InitVar( "Evt_M_MinDeltaRJets" );    
  vars.InitVar( "Evt_M_MinDeltaRTaggedJets" );
  vars.InitVar( "Evt_M_MinDeltaRUntaggedJets" );
  vars.InitVar( "Evt_M_MinDeltaRLeptonTaggedJet" );
  vars.InitVar( "Evt_M_MinDeltaRLeptonJet" );

  vars.InitVar( "Evt_Dr_MinDeltaRJets" );    
  vars.InitVar( "Evt_Dr_MinDeltaRTaggedJets" );
  vars.InitVar( "Evt_Dr_MinDeltaRUntaggedJets" );
  vars.InitVar( "Evt_Dr_MinDeltaRLeptonTaggedJet" );
  vars.InitVar( "Evt_Dr_MinDeltaRLeptonJet" );

  vars.InitVar( "Evt_Pt_MinDeltaRJets" );    
  vars.InitVar( "Evt_Pt_MinDeltaRTaggedJets" );
  vars.InitVar( "Evt_Pt_MinDeltaRUntaggedJets" );

  vars.InitVar( "Evt_M_JetsAverage" );
  vars.InitVar( "Evt_M_TaggedJetsAverage" );
  vars.InitVar( "Evt_M_UntaggedJetsAverage" );
  
  vars.InitVar( "Evt_Eta_JetsAverage" );
  vars.InitVar( "Evt_Eta_TaggedJetsAverage" );
  vars.InitVar( "Evt_Eta_UntaggedJetsAverage" );
  
  vars.InitVar( "Evt_M2_JetsAverage" );
  vars.InitVar( "Evt_M2_TaggedJetsAverage" );
  vars.InitVar( "Evt_M2_UntaggedJetsAverage" );
  vars.InitVar( "Evt_M2_2JetsAverage" );
  vars.InitVar( "Evt_M2_3JetsAverage" );
  vars.InitVar( "Evt_M2_4JetsAverage" );
  vars.InitVar( "Evt_M2_5JetsAverage" );
  vars.InitVar( "Evt_M2_6JetsAverage" );
  vars.InitVar( "Evt_M2_2TaggedJetsAverage" );
  vars.InitVar( "Evt_M2_3TaggedJetsAverage" );
  vars.InitVar( "Evt_M2_4TaggedJetsAverage" );
  
  vars.InitVar( "Evt_Deta_JetsAverage" );
  vars.InitVar( "Evt_Deta_TaggedJetsAverage" );
  vars.InitVar( "Evt_Deta_UntaggedJetsAverage" );
  vars.InitVar( "Evt_Deta_2JetsAverage" );
  vars.InitVar( "Evt_Deta_3JetsAverage" );
  vars.InitVar( "Evt_Deta_4JetsAverage" );
  vars.InitVar( "Evt_Deta_5JetsAverage" );
  vars.InitVar( "Evt_Deta_6JetsAverage" );
  vars.InitVar( "Evt_Deta_2TaggedJetsAverage" );
  vars.InitVar( "Evt_Deta_3TaggedJetsAverage" );
  vars.InitVar( "Evt_Deta_4TaggedJetsAverage" );
  
  vars.InitVar( "Evt_Dr_JetsAverage" );
  vars.InitVar( "Evt_Dr_TaggedJetsAverage" );
  vars.InitVar( "Evt_Dr_UntaggedJetsAverage" );
  vars.InitVar( "Evt_Dr_2JetsAverage" );
  vars.InitVar( "Evt_Dr_3JetsAverage" );
  vars.InitVar( "Evt_Dr_4JetsAverage" );
  vars.InitVar( "Evt_Dr_5JetsAverage" );
  vars.InitVar( "Evt_Dr_6JetsAverage" );
  vars.InitVar( "Evt_Dr_2TaggedJetsAverage" );
  vars.InitVar( "Evt_Dr_3TaggedJetsAverage" );
  vars.InitVar( "Evt_Dr_4TaggedJetsAverage" );
  
  vars.InitVar( "Evt_Dkt_JetsAverage" );
  vars.InitVar( "Evt_Dkt_TaggedJetsAverage" );
  vars.InitVar( "Evt_Dkt_UntaggedJetsAverage" );
  vars.InitVar( "Evt_Dkt_2JetsAverage" );
  vars.InitVar( "Evt_Dkt_3JetsAverage" );
  vars.InitVar( "Evt_Dkt_4JetsAverage" );
  vars.InitVar( "Evt_Dkt_5JetsAverage" );
  vars.InitVar( "Evt_Dkt_6JetsAverage" );
  vars.InitVar( "Evt_Dkt_2TaggedJetsAverage" );
  vars.InitVar( "Evt_Dkt_3TaggedJetsAverage" );
  vars.InitVar( "Evt_Dkt_4TaggedJetsAverage" );
  
  vars.InitVar( "Evt_M_TaggedJetsClosestTo125" );
  
  vars.InitVar( "Evt_JetPtOverJetE" );
  
  vars.InitVar( "Evt_Aplanarity" );
  vars.InitVar( "Evt_Sphericity" );
    
  vars.InitVar( "Evt_H0" );
  vars.InitVar( "Evt_H1" );
  vars.InitVar( "Evt_H2" );
  vars.InitVar( "Evt_H3" );
  vars.InitVar( "Evt_H4" );

  vars.InitVar( "Evt_Jet_MaxDeta_Jets" );
  vars.InitVar( "Evt_TaggedJet_MaxDeta_Jets" );
  vars.InitVar( "Evt_TaggedJet_MaxDeta_TaggedJets" );

  vars.InitVar( "Evt_M_MedianTaggedJets" );
  
  vars.InitVar( "Evt_Jet_Drmax_Lepton" );
  vars.InitVar( "Evt_Jet_Detamax_Lepton" );
  
  vars.InitVars( "Jet_CosTheta_cm","N_Jets" );
  vars.InitVar( "Evt_Jet_CosThetamax_cm" );

  vars.InitVar( "Evt_Jet_Drmax_Jet1" );
    
  vars.InitVar( "Evt_Jet_Detamax_Jet1" );

  vars.InitVars("Jet_CosThetaStar_Lepton","N_Jets");
  vars.InitVars("Jet_CosThetaStar_Jet1","N_Jets");
  vars.InitVars("Jet_CosThetaStar_Jet2","N_Jets");
  vars.InitVars("Jet_CosThetaStar_Jet3","N_Jets");
  vars.InitVars("Jet_CosThetaStar_Jet4","N_Jets");

  vars.InitVars("Jet_Dr_Lepton","N_Jets");
  vars.InitVars("Jet_Dr_Jet1","N_Jets");
  vars.InitVars("Jet_Dr_Jet2","N_Jets");
  vars.InitVars("Jet_Dr_Jet3","N_Jets");
  vars.InitVars("Jet_Dr_Jet4","N_Jets");

  vars.InitVars("Jet_Dkt_Lepton","N_Jets");
  vars.InitVars("Jet_Dkt_Jet1","N_Jets");
  vars.InitVars("Jet_Dkt_Jet2","N_Jets");
  vars.InitVars("Jet_Dkt_Jet3","N_Jets");
  vars.InitVars("Jet_Dkt_Jet4","N_Jets");

  vars.InitVars("Jet_Deta_Lepton","N_Jets");
  vars.InitVars("Jet_Deta_Jet1","N_Jets");
  vars.InitVars("Jet_Deta_Jet2","N_Jets");
  vars.InitVars("Jet_Deta_Jet3","N_Jets");
  vars.InitVars("Jet_Deta_Jet4","N_Jets");
  
  vars.InitVar("Evt_Deta_TopLep_BB_Ohio");
  vars.InitVar("Evt_Deta_TopHad_BB_Ohio");
  vars.InitVar("Evt_Best_Higgs_Mass_Ohio");
  vars.InitVar("Evt_Deta_Fn_Ohio");
  vars.InitVar("Evt_Dr_BB_Ohio");

  initialized=true;
}
Beispiel #12
0
void MVAVarProcessor::Process(const InputCollections& input,VariableContainer& vars){
  if(!initialized) cerr << "tree processor not initialized" << endl;

  const char* btagger="combinedInclusiveSecondaryVertexV2BJetTags";
  std::vector<pat::Jet> selectedTaggedJets;
  std::vector<pat::Jet> selectedTaggedJetsT;
  std::vector<pat::Jet> selectedTaggedJetsL;
  std::vector<pat::Jet> selectedUntaggedJets;
  for(std::vector<pat::Jet>::const_iterator itJet = input.selectedJets.begin(); itJet != input.selectedJets.end(); ++itJet){
    if(tHqUtils::PassesCSV(*itJet, 'M')){
      selectedTaggedJets.push_back(*itJet);
    }
    else{
      selectedUntaggedJets.push_back(*itJet);
    }
    if(tHqUtils::PassesCSV(*itJet, 'L')){
      selectedTaggedJetsL.push_back(*itJet);
    }
    if(tHqUtils::PassesCSV(*itJet, 'T')){
      selectedTaggedJetsT.push_back(*itJet);
    }
  }
  
  // Fill Multiplicity Variables
  vars.FillVar( "N_PrimaryVertices",input.selectedPVs.size());  
  vars.FillVar( "N_Jets",input.selectedJets.size());
  vars.FillVar( "N_LooseJets",input.selectedJetsLoose.size());
  vars.FillVar( "N_TightLeptons",input.selectedElectrons.size()+ input.selectedMuons.size());  
  vars.FillVar( "N_LooseLeptons",input.selectedElectronsLoose.size()+ input.selectedMuonsLoose.size());  
  vars.FillVar( "N_TightElectrons",input.selectedElectrons.size());  
  vars.FillVar( "N_LooseElectrons",input.selectedElectronsLoose.size());  
  vars.FillVar( "N_TightMuons",input.selectedMuons.size());  
  vars.FillVar( "N_LooseMuons",input.selectedMuonsLoose.size());  
  
  // Fill Jet Variables
  // All Jets
  for(std::vector<pat::Jet>::const_iterator itJet = input.selectedJets.begin() ; itJet != input.selectedJets.end(); ++itJet){
    int iJet = itJet - input.selectedJets.begin();
    vars.FillVars( "Jet_E",iJet,itJet->energy() );
    vars.FillVars( "Jet_M",iJet,itJet->mass() );
    vars.FillVars( "Jet_Pt",iJet,itJet->pt() );
    vars.FillVars( "Jet_Eta",iJet,itJet->eta() );
    vars.FillVars( "Jet_Phi",iJet,itJet->phi() );
    vars.FillVars( "Jet_CSV",iJet,fmax(itJet->bDiscriminator(btagger),-.1) );        
    vars.FillVars( "Jet_Flav",iJet,itJet->partonFlavour() );        
  }
  
  // Tagged Jets
  for(std::vector<pat::Jet>::iterator itTaggedJet = selectedTaggedJets.begin() ; itTaggedJet != selectedTaggedJets.end(); ++itTaggedJet){
    int iTaggedJet = itTaggedJet - selectedTaggedJets.begin();
    vars.FillVars( "TaggedJet_E",iTaggedJet,itTaggedJet->energy() );
    vars.FillVars( "TaggedJet_M",iTaggedJet,itTaggedJet->mass() );
    vars.FillVars( "TaggedJet_Pt",iTaggedJet,itTaggedJet->pt() );
    vars.FillVars( "TaggedJet_Eta",iTaggedJet,itTaggedJet->eta() );
    vars.FillVars( "TaggedJet_Phi",iTaggedJet,itTaggedJet->phi() );
  }
  
  // Fill Lepton Variables
  std::vector<math::XYZTLorentzVector> looseLeptonVecs = tHqUtils::GetLepVecs(input.selectedElectronsLoose,input.selectedMuonsLoose);
  for(std::vector<math::XYZTLorentzVector>::iterator itLep = looseLeptonVecs.begin() ; itLep != looseLeptonVecs.end(); ++itLep){
    int iLep = itLep - looseLeptonVecs.begin();
    vars.FillVars( "LooseLepton_E",iLep,itLep->E() );
    vars.FillVars( "LooseLepton_M",iLep,itLep->M() );
    vars.FillVars( "LooseLepton_Pt",iLep,itLep->Pt() );
    vars.FillVars( "LooseLepton_Eta",iLep,itLep->Eta());
    vars.FillVars( "LooseLepton_Phi",iLep,itLep->Phi() );
  }
  
  math::XYZTLorentzVector primLepVec = math::XYZTLorentzVector();
  if(input.selectedElectrons.size()>0 || input.selectedMuons.size()>0){
    primLepVec = tHqUtils::GetPrimLepVec(input.selectedElectrons,input.selectedMuons);
    vars.FillVar( "Evt_E_PrimaryLepton",primLepVec.E());
    vars.FillVar( "Evt_M_PrimaryLepton",primLepVec.M());
    vars.FillVar( "Evt_Pt_PrimaryLepton",primLepVec.Pt() );
    vars.FillVar( "Evt_Eta_PrimaryLepton",primLepVec.Eta());
    vars.FillVar( "Evt_Phi_PrimaryLepton",primLepVec.Phi());    
  }
  
  for(std::vector<pat::Electron>::const_iterator itEle = input.selectedElectronsLoose.begin(); itEle != input.selectedElectronsLoose.end(); ++itEle){
    int iEle = itEle - input.selectedElectronsLoose.begin();
    vars.FillVars( "Electron_E",iEle,itEle->energy() );
    vars.FillVars( "Electron_M",iEle,itEle->mass() );
    vars.FillVars( "Electron_Pt",iEle,itEle->pt() );
    vars.FillVars( "Electron_Eta",iEle,itEle->eta() );
    vars.FillVars( "Electron_Phi",iEle,itEle->phi() ); 
  }
  for(std::vector<pat::Muon>::const_iterator itMu = input.selectedMuonsLoose.begin(); itMu != input.selectedMuonsLoose.end(); ++itMu){
    int iMu = itMu - input.selectedMuonsLoose.begin();
    vars.FillVars( "Muon_E",iMu,itMu->energy() );
    vars.FillVars( "Muon_M",iMu,itMu->mass() );
    vars.FillVars( "Muon_Pt",iMu,itMu->pt() );
    vars.FillVars( "Muon_Eta",iMu,itMu->eta() );
    vars.FillVars( "Muon_Phi",iMu,itMu->phi() );
  }
  
  vars.FillVar( "Evt_Pt_MET",input.pfMET.pt() );
  vars.FillVar( "Evt_Phi_MET",input.pfMET.phi() );
  
  std::vector<math::XYZTLorentzVector> jetvecs = tHqUtils::GetJetVecs(input.selectedJets);
  math::XYZTLorentzVector metvec = input.pfMET.p4();
  
  // Fill M3 Variables
  float m3 = -1.;
  float maxpt=-1;
  for(std::vector<math::XYZTLorentzVector>::iterator itJetVec1 = jetvecs.begin() ; itJetVec1 != jetvecs.end(); ++itJetVec1){
    for(std::vector<math::XYZTLorentzVector>::iterator itJetVec2 = itJetVec1+1 ; itJetVec2 != jetvecs.end(); ++itJetVec2){
      for(std::vector<math::XYZTLorentzVector>::iterator itJetVec3 = itJetVec2+1 ; itJetVec3 != jetvecs.end(); ++itJetVec3){
    
        math::XYZTLorentzVector m3vec = *itJetVec1 + *itJetVec2 + *itJetVec3;
        
	      if(m3vec.Pt() > maxpt){
	        maxpt = m3vec.Pt();
	        m3 = m3vec.M();
	      }
      } 
    }
  }
  vars.FillVar("Evt_M3",m3);
  float m3tagged = -1.;
  float maxpttagged=-1.;
  for(std::vector<pat::Jet>::iterator itJetUntagged1 = selectedUntaggedJets.begin() ; itJetUntagged1 != selectedUntaggedJets.end(); ++itJetUntagged1){
    for(std::vector<pat::Jet>::iterator itJetUntagged2 = itJetUntagged1+1 ; itJetUntagged2 != selectedUntaggedJets.end(); ++itJetUntagged2){
      for(std::vector<pat::Jet>::iterator itJetTagged = selectedTaggedJets.begin() ; itJetTagged != selectedTaggedJets.end(); ++itJetTagged){
        
        math::XYZTLorentzVector m3vec = itJetUntagged1->p4() + itJetUntagged2->p4() + itJetTagged->p4();
	      
        if(m3vec.Pt() > maxpttagged){
	        maxpttagged = m3vec.Pt();
	        m3tagged = m3vec.M();
	      }
      } 
    }
  }
  vars.FillVar("Evt_M3_OneJetTagged",m3tagged);
  
  // Fill MTW
  float mtw = -1.;
  if(input.selectedElectrons.size()>0 || input.selectedMuons.size()>0){
    mtw = sqrt(2*(primLepVec.Pt()*input.pfMET.pt() - primLepVec.Px()*input.pfMET.px() - primLepVec.Py()*input.pfMET.py()));
  }
  vars.FillVar("Evt_MTW",mtw);
  
  // Fill Ht Variables
  float ht = 0.;
  float htjets = 0.;
  float mht_px = 0.;
  float mht_py = 0.;
  for(std::vector<pat::Jet>::const_iterator itJet = input.selectedJets.begin() ; itJet != input.selectedJets.end(); ++itJet){
    ht += itJet->pt();
    htjets += itJet->pt();
    mht_px += itJet->px();
    mht_py += itJet->py();
  }
  for(std::vector<pat::Electron>::const_iterator itEle = input.selectedElectronsLoose.begin(); itEle != input.selectedElectronsLoose.end(); ++itEle){
    ht += itEle->pt();
    mht_px += itEle->px();
    mht_py += itEle->py();
    
  }
  for(std::vector<pat::Muon>::const_iterator itMu = input.selectedMuonsLoose.begin(); itMu != input.selectedMuonsLoose.end(); ++itMu){
    ht += itMu->pt();
    mht_px += itMu->px();
    mht_py += itMu->py();
    
  }
  ht += input.pfMET.pt();
  
  vars.FillVar("Evt_HT",ht);
  vars.FillVar("Evt_MHT",sqrt( mht_px*mht_px + mht_py*mht_py ));
  vars.FillVar("Evt_HT_Jets",htjets);
  
  // Fill Event Mass
  math::XYZTLorentzVector p4all;
  for(std::vector<math::XYZTLorentzVector>::iterator itJetVec = jetvecs.begin() ; itJetVec != jetvecs.end(); ++itJetVec){
    p4all += *itJetVec;
  }
  for(std::vector<math::XYZTLorentzVector>::iterator itLep = looseLeptonVecs.begin() ; itLep != looseLeptonVecs.end(); ++itLep){
    p4all += *itLep;
  }
  p4all += metvec;
  vars.FillVar("Evt_M_Total",p4all.M());
  
  // Fill Number of b Tags
  vars.FillVar( "N_BTagsM",selectedTaggedJets.size() );  
  vars.FillVar( "N_BTagsL",selectedTaggedJetsL.size() );  
  vars.FillVar( "N_BTagsT",selectedTaggedJetsT.size() );
  
  // Fill CSV Variables
  // All Jets
  std::vector<float> csvJets;
  for(std::vector<pat::Jet>::const_iterator itJet = input.selectedJets.begin() ; itJet != input.selectedJets.end(); ++itJet){
    csvJets.push_back(fmax(itJet->bDiscriminator(btagger),-.1));
  }
  
  std::sort(csvJets.begin(),csvJets.end(),tHqUtils::FirstIsLarger);
  vars.FillVar("Evt_CSV_Min",csvJets.size()>0 ? csvJets.back() : -.1);
  
  float averageCSV = 0;
  for(std::vector<float>::iterator itCSV = csvJets.begin() ; itCSV != csvJets.end(); ++itCSV){
    int iCSV = itCSV - csvJets.begin();
    vars.FillVars("CSV" ,iCSV,*itCSV);
    averageCSV += fmax(*itCSV,0);
  }
  averageCSV /= csvJets.size();
  vars.FillVar("Evt_CSV_Average" ,averageCSV );
  
  float csvDev = 0;
  for(std::vector<float>::iterator itCSV = csvJets.begin() ; itCSV != csvJets.end(); ++itCSV){
    csvDev += fabs(pow(*itCSV - averageCSV,2));
  }
  if(csvJets.size() > 0)
    csvDev /= csvJets.size();
  else
    csvDev=-1.;
  vars.FillVar("Evt_CSV_Dev",csvDev);
  
  // Tagged Jets
  vector<float> csvTaggedJets;
  for(std::vector<pat::Jet>::iterator itTaggedJet = selectedTaggedJets.begin() ; itTaggedJet != selectedTaggedJets.end(); ++itTaggedJet){
    csvTaggedJets.push_back(fmax(itTaggedJet->bDiscriminator( btagger),-.1));
  }
  sort(csvTaggedJets.begin(),csvTaggedJets.end(),tHqUtils::FirstIsLarger);
  vars.FillVar("Evt_CSV_Min_Tagged",csvTaggedJets.size()>0 ? csvTaggedJets.back() : -.1);
  
  float averageCSVTagged = 0;
  for(std::vector<float>::iterator itCSVTagged = csvTaggedJets.begin() ; itCSVTagged != csvTaggedJets.end(); ++itCSVTagged){
    averageCSVTagged += fmax(*itCSVTagged,0);
  }
  averageCSVTagged /= csvTaggedJets.size();
  vars.FillVar("Evt_CSV_Average_Tagged",averageCSVTagged);
  
  float csvDevTagged = 0;
  for(std::vector<float>::iterator itCSVTagged = csvTaggedJets.begin() ; itCSVTagged != csvTaggedJets.end(); ++itCSVTagged){
    csvDevTagged += fabs(pow(*itCSVTagged - averageCSVTagged,2));
  }
  if(csvTaggedJets.size() > 0)
    csvDevTagged /= csvTaggedJets.size();
  else
    csvDevTagged=-1.;
    
  vars.FillVar("Evt_CSV_Dev_Tagged",csvDevTagged);
  // Fill Variables for closest ak5 Jets
  // All Jets
  if(input.selectedJets.size()>1){
    int idClosestJet1 = -1;
    int idClosestJet2 = -1;
    float minDrJets = tHqUtils::GetClosestJetIDs(idClosestJet1,idClosestJet2,input.selectedJets);
    math::XYZTLorentzVector closestJetVec1 = input.selectedJets[idClosestJet1].p4();
    math::XYZTLorentzVector closestJetVec2 = input.selectedJets[idClosestJet1].p4();
    vars.FillVar("Evt_M_MinDeltaRJets",(closestJetVec1+closestJetVec2).M());
    vars.FillVar("Evt_Dr_MinDeltaRJets",minDrJets);
    vars.FillVar("Evt_Pt_MinDeltaRJets",(closestJetVec1+closestJetVec2).Pt());
  }
  // Tagged Jets
  if(selectedTaggedJets.size()>1){
    int idClosestTaggedJet1 = -1;
    int idClosestTaggedJet2 = -1;
    float minDrTaggedJets = tHqUtils::GetClosestJetIDs(idClosestTaggedJet1,idClosestTaggedJet2,selectedTaggedJets);
    math::XYZTLorentzVector closestTaggedJetVec1 = selectedTaggedJets[idClosestTaggedJet1].p4();
    math::XYZTLorentzVector closestTaggedJetVec2 = selectedTaggedJets[idClosestTaggedJet2].p4();
    vars.FillVar("Evt_M_MinDeltaRTaggedJets",(closestTaggedJetVec1+closestTaggedJetVec2).M());
    vars.FillVar("Evt_Dr_MinDeltaRTaggedJets",minDrTaggedJets);
    vars.FillVar("Evt_Pt_MinDeltaRTaggedJets",(closestTaggedJetVec1+closestTaggedJetVec2).Pt());
  }
  // Untagged Jets
  if(selectedUntaggedJets.size()>1){
    int idClosestUntaggedJet1 = -1;
    int idClosestUntaggedJet2 = -1;
    float minDrUntaggedJets = tHqUtils::GetClosestJetIDs(idClosestUntaggedJet1,idClosestUntaggedJet2,selectedUntaggedJets);
    math::XYZTLorentzVector closestUntaggedJetVec1 = selectedUntaggedJets[idClosestUntaggedJet1].p4();
    math::XYZTLorentzVector closestUntaggedJetVec2 = selectedUntaggedJets[idClosestUntaggedJet2].p4();
    vars.FillVar("Evt_M_MinDeltaRUntaggedJets",(closestUntaggedJetVec1+closestUntaggedJetVec2).M());
    vars.FillVar("Evt_Dr_MinDeltaRUntaggedJets",minDrUntaggedJets);
    vars.FillVar("Evt_Pt_MinDeltaRUntaggedJets",(closestUntaggedJetVec1+closestUntaggedJetVec2).Pt());
  }
  // Jet and Lepton
  if(input.selectedJets.size()>1&&(input.selectedElectrons.size()>0||input.selectedMuons.size()>0)){
    int idClosestJet = -1;
    float minDrLepJet = tHqUtils::GetClosestLepJetID(idClosestJet,primLepVec,input.selectedJets);
    math::XYZTLorentzVector closestJetVec = input.selectedJets[idClosestJet].p4();
    vars.FillVar("Evt_M_MinDeltaRLeptonJet",(primLepVec+closestJetVec).M());
    vars.FillVar("Evt_Dr_MinDeltaRLeptonJet",minDrLepJet);
  }
  
  // Tagged Jet and Lepton
  if(selectedTaggedJets.size()>1&&(input.selectedElectrons.size()>0||input.selectedMuons.size()>0)){
    int idClosestTaggedJet = -1;
    float minDrLepTaggedJet = tHqUtils::GetClosestLepJetID(idClosestTaggedJet,primLepVec,selectedTaggedJets);
    math::XYZTLorentzVector closestTaggedJetVec = input.selectedJets[idClosestTaggedJet].p4();
    vars.FillVar("Evt_M_MinDeltaRLeptonTaggedJet",(primLepVec+closestTaggedJetVec).M());
    vars.FillVar("Evt_Dr_MinDeltaRLeptonTaggedJet",minDrLepTaggedJet);
  }
  
  // JetRelation Variables
  // All Jets
  float mJetsAverage = 0;
  float eJetsAverage = 0;
  float ptJetsAverage = 0;
  float etaJetsAverage = 0;
  float m2JetsAverage = 0;
  float detaJetsAverage = 0;
  float drJetsAverage = 0;
  float dktJetsAverage = 0;
  
  int nPairsJets = 0;
  for(std::vector<math::XYZTLorentzVector>::iterator itJetVec1 = jetvecs.begin();itJetVec1 != jetvecs.end();++itJetVec1){
    mJetsAverage += itJetVec1->M();
    eJetsAverage += itJetVec1->E();
    ptJetsAverage += itJetVec1->Pt();
    etaJetsAverage += itJetVec1->Eta();
    
    for(std::vector<math::XYZTLorentzVector>::iterator itJetVec2 = itJetVec1+1;itJetVec2 != jetvecs.end();++itJetVec2){
      m2JetsAverage += (*itJetVec1+*itJetVec2).M();
      detaJetsAverage += fabs(itJetVec1->Eta()-itJetVec2->Eta());
      drJetsAverage += tHqUtils::DeltaR(*itJetVec1,*itJetVec2);
      dktJetsAverage += tHqUtils::DeltaKt(*itJetVec1,*itJetVec2);
      
      nPairsJets++;
    }
  }
  if(jetvecs.size() > 0){
    mJetsAverage /= (float) nPairsJets;
    etaJetsAverage /= (float) jetvecs.size();
  }
  if(nPairsJets > 0){
    m2JetsAverage /= (float) nPairsJets;
    detaJetsAverage /= (float) nPairsJets;
    drJetsAverage /= (float) nPairsJets;
    dktJetsAverage /= (float) nPairsJets;
  }
  vars.FillVar("Evt_M_JetsAverage",mJetsAverage);
  vars.FillVar("Evt_Eta_JetsAverage",etaJetsAverage);
  vars.FillVar("Evt_M2_JetsAverage",m2JetsAverage);
  vars.FillVar("Evt_Deta_JetsAverage",detaJetsAverage);
  vars.FillVar("Evt_Dr_JetsAverage",drJetsAverage);
  vars.FillVar("Evt_Dkt_JetsAverage",dktJetsAverage);
  vars.FillVar("Evt_JetPtOverJetE", ptJetsAverage/eJetsAverage);  
  
  // Tagged Jets
  float mTaggedJetsAverage = 0;
  float etaTaggedJetsAverage = 0;
  float m2TaggedJetsAverage = 0;
  vector<float> m2TaggedJets;
  float m2TaggedJetsClosestTo125 = -999;
  float detaTaggedJetsAverage = 0;
  float drTaggedJetsAverage = 0;
  float dktTaggedJetsAverage = 0;
  
  int nPairsTaggedJets=0;
  for(std::vector<pat::Jet>::iterator itTaggedJet1 = selectedTaggedJets.begin();itTaggedJet1 != selectedTaggedJets.end();++itTaggedJet1){
    math::XYZTLorentzVector taggedJetVec1 = itTaggedJet1->p4();
    
    mTaggedJetsAverage += taggedJetVec1.M();
    etaTaggedJetsAverage += taggedJetVec1.Eta();
    
    for(std::vector<pat::Jet>::iterator itTaggedJet2 = itTaggedJet1+1;itTaggedJet2 != selectedTaggedJets.end();++itTaggedJet2){
      math::XYZTLorentzVector taggedJetVec2 = itTaggedJet2->p4();
      
      m2TaggedJets.push_back((taggedJetVec1+taggedJetVec2).M());
      m2TaggedJetsAverage += m2TaggedJets.back();
      if(fabs(m2TaggedJets.back()-125)<fabs(m2TaggedJetsClosestTo125-125)) m2TaggedJetsClosestTo125 = m2TaggedJets.back();
      detaTaggedJetsAverage += fabs(taggedJetVec1.Eta()-taggedJetVec2.Eta());
      drTaggedJetsAverage += tHqUtils::DeltaR(taggedJetVec1,taggedJetVec2);
      dktTaggedJetsAverage += tHqUtils::DeltaKt(taggedJetVec1,taggedJetVec2);
      
      nPairsTaggedJets++;
    }
  }
  if(selectedTaggedJets.size() > 0){
    mTaggedJetsAverage /= (float) selectedTaggedJets.size();
    etaTaggedJetsAverage /= (float) selectedTaggedJets.size();
  }
  if(nPairsTaggedJets > 0){
    m2TaggedJetsAverage /= (float) nPairsTaggedJets;
    detaTaggedJetsAverage /= (float) nPairsTaggedJets;
    drTaggedJetsAverage /= (float) nPairsTaggedJets;
    dktTaggedJetsAverage /= (float) nPairsTaggedJets;
  }
  sort(m2TaggedJets.begin(),m2TaggedJets.end(),tHqUtils::FirstIsLarger);
  
  vars.FillVar("Evt_M_TaggedJetsAverage",mTaggedJetsAverage);
  vars.FillVar("Evt_Eta_TaggedJetsAverage",etaTaggedJetsAverage);
  vars.FillVar("Evt_M2_TaggedJetsAverage",m2TaggedJetsAverage);
  if(m2TaggedJets.size()>0) vars.FillVar("Evt_M_MedianTaggedJets",m2TaggedJets.at(m2TaggedJets.size()/2));
  vars.FillVar("Evt_M_TaggedJetsClosestTo125",m2TaggedJetsClosestTo125);
  vars.FillVar("Evt_Deta_TaggedJetsAverage",detaTaggedJetsAverage);
  vars.FillVar("Evt_Dr_TaggedJetsAverage",drTaggedJetsAverage);
  vars.FillVar("Evt_Dkt_TaggedJetsAverage",dktTaggedJetsAverage);
  // Untagged Jets
  float mUntaggedJetsAverage = 0;
  float etaUntaggedJetsAverage = 0;
  float m2UntaggedJetsAverage=0;
  float detaUntaggedJetsAverage = 0;
  float drUntaggedJetsAverage=0;
  float dktUntaggedJetsAverage=0;
  int nPairsUntaggedJets=0;
  for(std::vector<pat::Jet>::iterator itUntaggedJet1 = selectedUntaggedJets.begin();itUntaggedJet1 != selectedUntaggedJets.end();++itUntaggedJet1){
    math::XYZTLorentzVector untaggedJetVec1 = itUntaggedJet1->p4();
    
    mUntaggedJetsAverage += untaggedJetVec1.M();
    etaUntaggedJetsAverage += untaggedJetVec1.Eta();
    
    for(std::vector<pat::Jet>::iterator itUntaggedJet2 = itUntaggedJet1+1;itUntaggedJet2 != selectedUntaggedJets.end();++itUntaggedJet2){
      math::XYZTLorentzVector untaggedJetVec2 = itUntaggedJet2->p4();
      m2UntaggedJetsAverage += (untaggedJetVec1+untaggedJetVec2).M();
      detaUntaggedJetsAverage += fabs(untaggedJetVec1.Eta()-untaggedJetVec2.Eta());
      drUntaggedJetsAverage += tHqUtils::DeltaR(untaggedJetVec1,untaggedJetVec2);
      dktUntaggedJetsAverage += tHqUtils::DeltaKt(untaggedJetVec1,untaggedJetVec2);
      nPairsUntaggedJets++;
    }
  }
  if(selectedUntaggedJets.size() > 0){
    mUntaggedJetsAverage /= (float) selectedUntaggedJets.size();
    etaUntaggedJetsAverage /= (float) selectedUntaggedJets.size();
  }
  if(nPairsUntaggedJets > 0){
    m2UntaggedJetsAverage /= nPairsUntaggedJets;
    detaUntaggedJetsAverage /= nPairsUntaggedJets;
    drUntaggedJetsAverage /= nPairsUntaggedJets;
    dktUntaggedJetsAverage /= nPairsUntaggedJets;
  }
  vars.FillVar( "Evt_M_UntaggedJetsAverage",mUntaggedJetsAverage );
  vars.FillVar( "Evt_Eta_UntaggedJetsAverage",etaUntaggedJetsAverage );
  vars.FillVar( "Evt_M2_UntaggedJetsAverage",m2UntaggedJetsAverage );
  vars.FillVar( "Evt_Deta_UntaggedJetsAverage",detaUntaggedJetsAverage );
  vars.FillVar( "Evt_Dr_UntaggedJetsAverage",drUntaggedJetsAverage );
  vars.FillVar( "Evt_Dkt_UntaggedJetsAverage",dktUntaggedJetsAverage );
  
  // Hardest N Jets
  for(int maxjets=2;maxjets<=6;maxjets++){
    
    float m2JetsAverage=0;
    float drJetsAverage=0;
    float dktJetsAverage=0;
    int nPairsJets=0;
    
    for(std::vector<math::XYZTLorentzVector>::iterator itJetVec1 = jetvecs.begin();itJetVec1 != jetvecs.end() && itJetVec1-jetvecs.begin() < maxjets;++itJetVec1){
      for(std::vector<math::XYZTLorentzVector>::iterator itJetVec2 = itJetVec1+1;itJetVec2 != jetvecs.end() && itJetVec2-jetvecs.begin() < maxjets;++itJetVec2){
        m2JetsAverage += (*itJetVec1+*itJetVec2).M();
        drJetsAverage += tHqUtils::DeltaR(*itJetVec1,*itJetVec2);
        dktJetsAverage += tHqUtils::DeltaKt(*itJetVec1,*itJetVec2);
        nPairsJets++;
      }
    }
    if(nPairsJets > 0){
      m2JetsAverage/=nPairsJets;
      drJetsAverage/=nPairsJets;
      dktJetsAverage/=nPairsJets;
    }
    
    TString mName = "Evt_M2_";
    TString detaName = "Evt_Deta_";
    TString drName = "Evt_Dr_";
    TString dktName = "Evt_Dkt_";
    mName += maxjets;
    detaName += maxjets;
    drName += maxjets;
    dktName += maxjets;
    mName+="JetsAverage";
    detaName += "JetsAverage";
    drName+="JetsAverage";
    dktName+="JetsAverage";
    
    vars.FillVar(mName.Data(),m2JetsAverage);
    vars.FillVar(detaName.Data(),drJetsAverage);
    vars.FillVar(drName.Data(),drJetsAverage);
    vars.FillVar(dktName.Data(),dktJetsAverage);
  }
  
  // N Jets with highest CSV
  std::vector<pat::Jet> jetsByCSV = input.selectedJets;
  std::sort(jetsByCSV.begin(), jetsByCSV.end(),tHqUtils::FirstHasHigherCSV);
  for(int maxjets=2;maxjets<=4;maxjets++){
    float m2JetsAverage=0;
    float detaJetsAverage=0;
    float drJetsAverage=0;
    float dktJetsAverage=0;
    int nPairsJets=0;
    
    for(std::vector<pat::Jet>::iterator itJet1 = jetsByCSV.begin();itJet1 != jetsByCSV.end() && itJet1-jetsByCSV.begin() < maxjets;++itJet1){
      math::XYZTLorentzVector jetVec1 = itJet1->p4();
      
      for(std::vector<pat::Jet>::iterator itJet2 = itJet1+1;itJet2 != jetsByCSV.end() && itJet2-jetsByCSV.begin() < maxjets;++itJet2){
        math::XYZTLorentzVector jetVec2 = itJet2->p4();
        m2JetsAverage += (jetVec1+jetVec2).M();
        detaJetsAverage += fabs(jetVec1.Eta()-jetVec2.Eta());
        drJetsAverage += tHqUtils::DeltaR(jetVec1,jetVec2);
        dktJetsAverage += tHqUtils::DeltaKt(jetVec1,jetVec2);
        nPairsJets++;
      }
    }
    if(nPairsJets > 0){
      m2JetsAverage /= nPairsJets;
      detaJetsAverage /= nPairsJets;
      drJetsAverage /= nPairsJets;
      dktJetsAverage /= nPairsJets;
    }
    
    TString mName = "Evt_M2_";
    TString detaName = "Evt_Deta_";
    TString drName = "Evt_Dr_";
    TString dktName = "Evt_Dkt_";
    mName += maxjets;
    detaName += maxjets;
    drName += maxjets;
    dktName += maxjets;
    mName += "TaggedJetsAverage";
    detaName += "TaggedJetsAverage";
    drName += "TaggedJetsAverage";
    dktName += "TaggedJetsAverage";
    
    vars.FillVar(mName.Data(),m2JetsAverage);
    vars.FillVar(detaName.Data(),drJetsAverage);
    vars.FillVar(drName.Data(),drJetsAverage);
    vars.FillVar(dktName.Data(),dktJetsAverage);
  }
  
  // DeltaEta of Jets
  vars.FillVar("Evt_Jet_MaxDeta_Jets",tHqUtils::GetJetAverageJetEtaMax(input.selectedJets,input.selectedJets));
  vars.FillVar("Evt_TaggedJet_MaxDeta_Jets",tHqUtils::GetJetAverageJetEtaMax(input.selectedJets,selectedTaggedJets));
  vars.FillVar("Evt_TaggedJet_MaxDeta_TaggedJets",tHqUtils::GetJetAverageJetEtaMax(selectedTaggedJets,selectedTaggedJets));
  
  // Event Shape Variables
  // Fox Wolfram Moments
  float h0,h1,h2,h3,h4;
  h0=-9;
  h1=-9;
  h2=-9;
  h3=-9;
  h4=-9;
  tHqUtils::GetFoxWolframMoments(jetvecs, h0,h1,h2,h3,h4);
  vars.FillVar( "Evt_H0", h0 );
  vars.FillVar( "Evt_H1", h1 );
  vars.FillVar( "Evt_H2", h2 );
  vars.FillVar( "Evt_H3", h3 );
  vars.FillVar( "Evt_H4", h4 );
  
  // Aplanarity and Sphericity;
  float aplanarity,sphericity;
  tHqUtils::GetAplanaritySphericity(primLepVec, metvec, jetvecs, aplanarity, sphericity) ;
  vars.FillVar( "Evt_Aplanarity", aplanarity );
  vars.FillVar( "Evt_Sphericity", sphericity );
  
  // Event Angle Variables 
  float drmax_lj=-1;
  float detamax_lj=-1;
  float drmax_j1j=-1;
  float drmax_j2j=-1;
  float drmax_j3j=-1;
  float drmax_j4j=-1;
  float detamax_j1j=-1;
  float detamax_j2j=-1;
  float detamax_j3j=-1;
  float detamax_j4j=-1;
  float costhetamax_jcm=-1;
  for(std::vector<math::XYZTLorentzVector>::iterator itJetVec = jetvecs.begin();itJetVec != jetvecs.end();++itJetVec){
    int iJetVec = itJetVec - jetvecs.begin();
    
    float c_lj=-1.5;
    float c_j1j=-1.5;
    float c_j2j=-1.5;
    float c_j3j=-1.5;
    float c_j4j=-1.5;
    float deta_lj=-1.;
    float deta_j1j=-1.;
    float deta_j2j=-1.;
    float deta_j3j=-1.;
    float deta_j4j=-1.;
    float dr_lj=-1.;
    float dr_j1j=-1.;
    float dr_j2j=-1.;
    float dr_j3j=-1.;
    float dr_j4j=-1.;
    float dkt_lj=-50.;
    float dkt_j1j=-50.;
    float dkt_j2j=-50.;
    float dkt_j3j=-50.;
    float dkt_j4j=-50.;
    
    if(primLepVec.Pt()>1){
      deta_lj = tHqUtils::DeltaEta(*itJetVec,primLepVec);
      dr_lj = tHqUtils::DeltaR(*itJetVec,primLepVec);
      dkt_lj = tHqUtils::DeltaKt(*itJetVec,primLepVec);
      c_lj = tHqUtils::CosThetaStar(*itJetVec,primLepVec);
    }
    if(jetvecs.size()>0){
      deta_j1j = tHqUtils::DeltaEta(*itJetVec,jetvecs[0]);
      dr_j1j = tHqUtils::DeltaR(*itJetVec,jetvecs[0]);
      dkt_j1j = tHqUtils::DeltaKt(*itJetVec,jetvecs[0]);
      c_j1j = tHqUtils::CosThetaStar(*itJetVec,jetvecs[0]);
    }
    if(jetvecs.size()>1){
      deta_j2j = tHqUtils::DeltaEta(*itJetVec,jetvecs[1]);
      dr_j2j = tHqUtils::DeltaR(*itJetVec,jetvecs[1]);
      dkt_j2j = tHqUtils::DeltaKt(*itJetVec,jetvecs[1]);
      c_j2j = tHqUtils::CosThetaStar(*itJetVec,jetvecs[1]);
    }
    if(jetvecs.size()>2){
      deta_j3j = tHqUtils::DeltaEta(*itJetVec,jetvecs[2]);
      dr_j3j = tHqUtils::DeltaR(*itJetVec,jetvecs[2]);
      dkt_j3j = tHqUtils::DeltaKt(*itJetVec,jetvecs[2]);
      c_j3j = tHqUtils::CosThetaStar(*itJetVec,jetvecs[2]);
    }
    if(jetvecs.size()>3){
      deta_j4j = tHqUtils::DeltaEta(*itJetVec,jetvecs[3]);
      dr_j4j = tHqUtils::DeltaR(*itJetVec,jetvecs[3]);
      dkt_j4j = tHqUtils::DeltaKt(*itJetVec,jetvecs[3]);
      c_j4j = tHqUtils::CosThetaStar(*itJetVec,jetvecs[3]);
    }
    
    vars.FillVars("Jet_Deta_Lepton",iJetVec,deta_lj);
    vars.FillVars("Jet_Deta_Jet1",iJetVec,deta_j1j);
    vars.FillVars("Jet_Deta_Jet2",iJetVec,deta_j2j);
    vars.FillVars("Jet_Deta_Jet3",iJetVec,deta_j3j);
    vars.FillVars("Jet_Deta_Jet4",iJetVec,deta_j4j);
    
    vars.FillVars("Jet_Dr_Lepton",iJetVec,dr_lj);
    vars.FillVars("Jet_Dr_Jet1",iJetVec,dr_j1j);
    vars.FillVars("Jet_Dr_Jet2",iJetVec,dr_j2j);
    vars.FillVars("Jet_Dr_Jet3",iJetVec,dr_j3j);
    vars.FillVars("Jet_Dr_Jet4",iJetVec,dr_j4j);
    
    vars.FillVars("Jet_Dkt_Lepton",iJetVec,dkt_lj);
    vars.FillVars("Jet_Dkt_Jet1",iJetVec,dkt_j1j);
    vars.FillVars("Jet_Dkt_Jet2",iJetVec,dkt_j2j);
    vars.FillVars("Jet_Dkt_Jet3",iJetVec,dkt_j3j);
    vars.FillVars("Jet_Dkt_Jet4",iJetVec,dkt_j4j);
    
    vars.FillVars("Jet_CosThetaStar_Lepton",iJetVec,c_lj);
    vars.FillVars("Jet_CosThetaStar_Jet1",iJetVec,c_j1j);
    vars.FillVars("Jet_CosThetaStar_Jet2",iJetVec,c_j2j);
    vars.FillVars("Jet_CosThetaStar_Jet3",iJetVec,c_j3j);
    vars.FillVars("Jet_CosThetaStar_Jet4",iJetVec,c_j4j);
    
    if(drmax_lj < dr_lj){
      drmax_lj = dr_lj;
    }
    if(detamax_lj < deta_lj){
      detamax_lj = deta_lj;
    }
    if(drmax_j1j < dr_j1j){
      drmax_j1j = dr_j1j;
    }
    if(drmax_j2j < dr_j2j){
      drmax_j2j = dr_j2j;
    }
    if(drmax_j3j < dr_j3j){
      drmax_j3j = dr_j3j;
    }
    if(drmax_j4j < dr_j4j){
      drmax_j4j = dr_j4j;
    }
    if(detamax_j1j < deta_j1j){
      detamax_j1j = deta_j1j;
    }
    if(detamax_j2j < deta_j2j){
      detamax_j2j = deta_j2j;
    }
    if(detamax_j3j < deta_j3j){
      detamax_j3j = deta_j3j;
    }
    if(detamax_j4j < deta_j4j){
      detamax_j4j = deta_j4j;
    }
    
    float costheta_jcm= tHqUtils::CosThetaCM(*itJetVec,p4all);
    vars.FillVars("Jet_CosTheta_cm",iJetVec,costheta_jcm  );
    if(costhetamax_jcm<fabs(costheta_jcm)){
      costhetamax_jcm=fabs(costheta_jcm);
    }
  }
  vars.FillVar("Evt_Jet_Drmax_Lepton",drmax_lj);
  vars.FillVar("Evt_Jet_Detamax_Lepton",detamax_lj);
  vars.FillVar("Evt_Jet_Drmax_Jet1",drmax_j1j);
  vars.FillVar("Evt_Jet_Detamax_Jet1",detamax_j1j);
  vars.FillVar("Evt_Jet_CosThetamax_cm",costhetamax_jcm );
  
  // Ohio Variables
  std::vector<pat::Jet> selectedJetsLooseExclusive;
  for(std::vector<pat::Jet>::const_iterator itJet = input.selectedJetsLoose.begin() ; itJet != input.selectedJetsLoose.end(); ++itJet){
    if(itJet->pt() >= 30) continue;
    selectedJetsLooseExclusive.push_back(*itJet);
  }
  

}
void MCMatchVarProcessor::Init(const InputCollections& input,VariableContainer& vars){

 
  vars.InitVar( "GenEvt_I_TTPlusCC",-1,"I" );
  vars.InitVar( "GenEvt_I_TTPlusBB",-1,"I" );
  vars.InitVar( "GenEvt_TTxId_FromHelper",-1,"I" );
  vars.InitVar( "N_GoodTagsM",-1,"I" );
  vars.InitVar( "N_MisTagsM",-1,"I" );
  
  vars.InitVar( "N_GenTopHad", -1, "I" );
  vars.InitVars( "GenTopHad_Pt",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Eta",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Phi",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_W_Pt",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_B_Pt",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q1_Pt",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q2_Pt",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_W_Eta",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_B_Eta",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q1_Eta",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q2_Eta",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_W_Phi",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_B_Phi",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q1_Phi",-9.,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q2_Phi",-9.,"N_GenTopHad" );
 
  vars.InitVar( "N_GenTopLep",-1,"I" );
  vars.InitVars( "GenTopLep_Pt",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Eta",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Phi",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_W_Pt",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_B_Pt",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Lep_Pt",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Nu_Pt",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_W_Eta",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_B_Eta",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Lep_Eta",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Nu_Eta",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_W_Phi",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_B_Phi",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Lep_Phi",-9.,"N_GenTopLep" );
  vars.InitVars( "GenTopLep_Nu_Phi",-9.,"N_GenTopLep" );
  
  vars.InitVar( "GenHiggs_Pt",-9. );
  vars.InitVar( "GenHiggs_Eta",-9. );
  vars.InitVar( "GenHiggs_Phi",-9. );
  vars.InitVar( "GenHiggs_B1_Pt",-9. );
  vars.InitVar( "GenHiggs_B2_Pt",-9. );
  vars.InitVar( "GenHiggs_B1_Eta",-9. );
  vars.InitVar( "GenHiggs_B2_Eta",-9. );
  vars.InitVar( "GenHiggs_B1_Phi",-9. );
  vars.InitVar( "GenHiggs_B2_Phi",-9. );
  
  vars.InitVars( "GenTopHad_B_Idx",-1,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q1_Idx",-1,"N_GenTopHad" );
  vars.InitVars( "GenTopHad_Q2_Idx",-1,"N_GenTopHad" );
  vars.InitVars( "GenTopLep_B_Idx",-1,"N_GenTopLep" );
  vars.InitVar( "GenHiggs_B1_Idx",-1 );
  vars.InitVar( "GenHiggs_B2_Idx",-1 );
  
  vars.InitVar( "GenHiggs_DecProd1_Pt",-9. );
  vars.InitVar( "GenHiggs_DecProd1_Eta",-9. );
  vars.InitVar( "GenHiggs_DecProd1_PDGID",-999 );
  vars.InitVar( "GenHiggs_DecProd2_Pt",-9. );
  vars.InitVar( "GenHiggs_DecProd2_Eta",-9. );
  vars.InitVar( "GenHiggs_DecProd2_PDGID",-999 );

  vars.InitVar( "GenHiggs_B1_GenJet_Pt",-9. );
  vars.InitVar( "GenHiggs_B2_GenJet_Pt",-9. );
  vars.InitVar( "GenHiggs_B1_GenJet_Eta",-9. );
  vars.InitVar( "GenHiggs_B2_GenJet_Eta",-9. );
  vars.InitVar( "GenHiggs_B1_GenJet_Phi",-9. );
  vars.InitVar( "GenHiggs_B2_GenJet_Phi",-9. );

  vars.InitVars( "GenTopLep_B_GenJet_Pt",-9., "N_GenTopLep" );
  vars.InitVars( "GenTopHad_B_GenJet_Pt",-9., "N_GenTopHad");
  vars.InitVars( "GenTopLep_B_GenJet_Eta",-9., "N_GenTopLep" );
  vars.InitVars( "GenTopHad_B_GenJet_Eta",-9., "N_GenTopHad");
  vars.InitVars( "GenTopLep_B_GenJet_Phi",-9., "N_GenTopLep" );
  vars.InitVars( "GenTopHad_B_GenJet_Phi",-9., "N_GenTopHad");


  vars.InitVar( "GenHiggs_B1_Hadron_Pt",-9. );
  vars.InitVar( "GenHiggs_B2_Hadron_Pt",-9. );
  vars.InitVar( "GenHiggs_B1_Hadron_Eta",-9. );
  vars.InitVar( "GenHiggs_B2_Hadron_Eta",-9. );
  vars.InitVar( "GenHiggs_B1_Hadron_Phi",-9. );
  vars.InitVar( "GenHiggs_B2_Hadron_Phi",-9. );

  vars.InitVars( "GenTopLep_B_Hadron_Pt",-9., "N_GenTopLep" );
  vars.InitVars( "GenTopHad_B_Hadron_Pt",-9., "N_GenTopHad");
  vars.InitVars( "GenTopLep_B_Hadron_Eta",-9., "N_GenTopLep" );
  vars.InitVars( "GenTopHad_B_Hadron_Eta",-9., "N_GenTopHad");
  vars.InitVars( "GenTopLep_B_Hadron_Phi",-9., "N_GenTopLep" );
  vars.InitVars( "GenTopHad_B_Hadron_Phi",-9., "N_GenTopHad");

  initialized = true;
}
void MCMatchVarProcessor::Process(const InputCollections& input,VariableContainer& vars){
  
  if(!initialized) cerr << "tree processor not initialized" << endl;
  
  int iBB = 0;
  int iCC = 0;
  
  if(input.sampleType == SampleType::ttbb) iBB = 3;
  if(input.sampleType == SampleType::ttb) iBB = 1;
  if(input.sampleType == SampleType::tt2b) iBB = 2;
  if(input.sampleType == SampleType::ttcc) iCC = 1;
  
  vars.FillVar( "GenEvt_I_TTPlusCC",iCC );
  vars.FillVar( "GenEvt_I_TTPlusBB",iBB );
  vars.FillVar( "GenEvt_TTxId_FromHelper",input.genTopEvt.GetTTxIdFromHelper());
  int nGoodTagsM=0;
  int nMisTagsM=0;
  for(auto j=input.selectedJets.begin(); j!=input.selectedJets.end(); j++){
      if (!(BoostedUtils::PassesCSV(*j, 'M'))) continue;
      if(abs(j->hadronFlavour())==5) nGoodTagsM++;
      if(abs(j->hadronFlavour())!=5) nMisTagsM++;
  }  
  vars.FillVar( "N_GoodTagsM",nGoodTagsM);
  vars.FillVar( "N_MisTagsM",nMisTagsM);


  std::vector<reco::GenParticle> tophad;
  std::vector<reco::GenParticle> whad;
  std::vector<reco::GenParticle> bhad;
  std::vector<reco::GenParticle> q1;
  std::vector<reco::GenParticle> q2;
  std::vector<reco::GenParticle> toplep;
  std::vector<reco::GenParticle> wlep;
  std::vector<reco::GenParticle> blep;
  std::vector<reco::GenParticle> lep;
  std::vector<reco::GenParticle> nu;
  reco::GenParticle higgs;
  std::vector<reco::GenParticle> higgs_bs;
  if(input.genTopEvt.IsFilled()){
    tophad=input.genTopEvt.GetAllTopHads();
    whad=input.genTopEvt.GetAllWhads();
    bhad=input.genTopEvt.GetAllTopHadDecayQuarks();
    q1=input.genTopEvt.GetAllWQuarks();
    q2=input.genTopEvt.GetAllWAntiQuarks();
    toplep=input.genTopEvt.GetAllTopLeps();
    wlep=input.genTopEvt.GetAllWleps();
    blep=input.genTopEvt.GetAllTopLepDecayQuarks();
    lep=input.genTopEvt.GetAllLeptons();
    nu=input.genTopEvt.GetAllNeutrinos();
    higgs=input.genTopEvt.GetHiggs();
    higgs_bs=input.genTopEvt.GetHiggsDecayProducts();
  }

  reco::GenParticle b1;
  reco::GenParticle b2;
  reco::GenParticle decProd1;
  reco::GenParticle decProd2;

//if(higgs_bs.size()>2)std::cout<<"MORE THAN TWO HIGGS PRODUCTS"<<std::endl;
bool dfirst=true;
  for(auto p =higgs_bs.begin(); p!=higgs_bs.end(); p++){
    if(p->pdgId()==5) b1=*p;
    if(p->pdgId()==-5) b2=*p;
    if(dfirst){
      decProd1=*p;
      dfirst=false;
    }
    else{
      decProd2=*p;
    }
  }
  
  if(decProd1.pt()>0.){
    vars.FillVar("GenHiggs_DecProd1_Pt",decProd1.pt());
    vars.FillVar("GenHiggs_DecProd2_Pt",decProd2.pt());
    vars.FillVar("GenHiggs_DecProd1_Eta",decProd1.eta());
    vars.FillVar("GenHiggs_DecProd2_Eta",decProd2.eta());
    vars.FillVar("GenHiggs_DecProd1_PDGID",decProd1.pdgId());
    vars.FillVar("GenHiggs_DecProd2_PDGID",decProd2.pdgId());
  }
  //std::cout<<decProd1.pdgId()<<" "<<decProd2.pdgId()<<std::endl;
  
  vars.FillVar( "N_GenTopLep", toplep.size());
  vars.FillVar( "N_GenTopHad", tophad.size());
  
  vector<math::XYZTLorentzVector> jetvecs = BoostedUtils::GetJetVecs(input.selectedJets);
  
  for(size_t i=0;i<toplep.size();i++){
    vars.FillVars( "GenTopLep_Pt",i,toplep[i].pt());
    vars.FillVars( "GenTopLep_Eta",i,toplep[i].eta());
    vars.FillVars( "GenTopLep_Phi",i,toplep[i].phi());
    vars.FillVars( "GenTopLep_W_Pt",i,wlep[i].pt());
    vars.FillVars( "GenTopLep_B_Pt",i,blep[i].pt());
    vars.FillVars( "GenTopLep_Lep_Pt",i,lep[i].pt());
    vars.FillVars( "GenTopLep_Nu_Pt",i,nu[i].pt());
    vars.FillVars( "GenTopLep_W_Eta",i,wlep[i].eta());
    vars.FillVars( "GenTopLep_B_Eta",i,blep[i].eta());
    vars.FillVars( "GenTopLep_Lep_Eta",i,lep[i].eta());
    vars.FillVars( "GenTopLep_Nu_Eta",i,nu[i].eta());
    vars.FillVars( "GenTopLep_W_Phi",i,wlep[i].phi());
    vars.FillVars( "GenTopLep_B_Phi",i,blep[i].phi());
    vars.FillVars( "GenTopLep_Lep_Phi",i,lep[i].phi());
    vars.FillVars( "GenTopLep_Nu_Phi",i,nu[i].phi());
    
    int idxblep = -1;
    double minDrTopLep = 999;
    for(std::vector<math::XYZTLorentzVector>::iterator itJetVec = jetvecs.begin() ; itJetVec != jetvecs.end(); ++itJetVec){
      if(BoostedUtils::DeltaR(*itJetVec,blep[i].p4())<minDrTopLep){
        idxblep = itJetVec-jetvecs.begin();
        minDrTopLep = BoostedUtils::DeltaR(*itJetVec,blep[i].p4());
      }
    }
    
    if(minDrTopLep<.25){
      vars.FillVars( "GenTopLep_B_Idx",i,idxblep);
    }
  }
  
  for(size_t i=0;i<tophad.size();i++){
    vars.FillVars( "GenTopHad_Pt",i,tophad[i].pt());
    vars.FillVars( "GenTopHad_Eta",i,tophad[i].eta());
    vars.FillVars( "GenTopHad_Phi",i,tophad[i].phi());
    vars.FillVars( "GenTopHad_W_Pt",i,whad[i].pt());
    vars.FillVars( "GenTopHad_B_Pt",i,bhad[i].pt());
    vars.FillVars( "GenTopHad_Q1_Pt",i,q1[i].pt());
    vars.FillVars( "GenTopHad_Q2_Pt",i,q2[i].pt());
    vars.FillVars( "GenTopHad_W_Eta",i,whad[i].eta());
    vars.FillVars( "GenTopHad_B_Eta",i,bhad[i].eta());
    vars.FillVars( "GenTopHad_Q1_Eta",i,q1[i].eta());
    vars.FillVars( "GenTopHad_Q2_Eta",i,q2[i].eta());
    vars.FillVars( "GenTopHad_W_Phi",i,whad[i].phi());
    vars.FillVars( "GenTopHad_B_Phi",i,bhad[i].phi());
    vars.FillVars( "GenTopHad_Q1_Phi",i,q1[i].phi());
    vars.FillVars( "GenTopHad_Q2_Phi",i,q2[i].phi());
    int idxbhad=-1;
    int idxq1=-1;
    int idxq2=-1;
    double minDrTopHadB = 999;
    double minDrTopHadQ1 = 999;
    double minDrTopHadQ2 = 999;
    
    for(size_t j=0; j<jetvecs.size(); j++){
	    if(BoostedUtils::DeltaR(jetvecs[j],bhad[i].p4())<minDrTopHadB){
        idxbhad = j;
        minDrTopHadB = BoostedUtils::DeltaR(jetvecs[j],bhad[i].p4());
      }
      if(BoostedUtils::DeltaR(jetvecs[j],q1[i].p4())<minDrTopHadQ1){
        idxq1 = j;
        minDrTopHadQ1 = BoostedUtils::DeltaR(jetvecs[j],q1[i].p4());
      }
      if(BoostedUtils::DeltaR(jetvecs[j],q2[i].p4())<minDrTopHadQ2){
        idxq2 = j;
        minDrTopHadQ2 = BoostedUtils::DeltaR(jetvecs[j],q2[i].p4());
      }
    }
    
    if(minDrTopHadB<.25){
      vars.FillVars( "GenTopHad_B_Idx",i,idxbhad);
    }
    if(minDrTopHadQ1<.25){
      vars.FillVars( "GenTopHad_Q1_Idx",i,idxq1);
    }
    if(minDrTopHadQ2<.25){
      vars.FillVars( "GenTopHad_Q2_Idx",i,idxq2);
    }
  }

  if(higgs.pt()>0.){
    vars.FillVar( "GenHiggs_Pt",higgs.pt());
    vars.FillVar( "GenHiggs_Eta",higgs.eta());
    vars.FillVar( "GenHiggs_Phi",higgs.phi());
  }
  if(b1.pt()>0.){
    vars.FillVar("GenHiggs_B1_Pt",b1.pt());
    vars.FillVar("GenHiggs_B2_Pt",b2.pt());
    vars.FillVar("GenHiggs_B1_Eta",b1.eta());
    vars.FillVar("GenHiggs_B2_Eta",b2.eta());
    vars.FillVar("GenHiggs_B1_Phi",b1.phi());
    vars.FillVar("GenHiggs_B2_Phi",b2.phi());
    
    int idxb1=-1;
    int idxb2=-1;
    
    double minDrB1 = 999;
    double minDrB2 = 999;
    
    for(std::vector<math::XYZTLorentzVector>::iterator itJetVec = jetvecs.begin() ; itJetVec != jetvecs.end(); ++itJetVec){
      assert(itJetVec->pt()>0);
      assert(b1.pt()>0);
      assert(b2.pt()>0);
      if(BoostedUtils::DeltaR(*itJetVec,b1.p4())<minDrB1){
        idxb1 = itJetVec-jetvecs.begin();
        minDrB1 = BoostedUtils::DeltaR(*itJetVec,b1.p4());
      }
      if(BoostedUtils::DeltaR(*itJetVec,b2.p4())<minDrB2){
        idxb2 = itJetVec-jetvecs.begin();
        minDrB2 = BoostedUtils::DeltaR(*itJetVec,b2.p4());
      }
    }
    
    if(minDrB1<.25){
      vars.FillVar( "GenHiggs_B1_Idx",idxb1);
    }
    if(minDrB2<.25){
      vars.FillVar( "GenHiggs_B2_Idx",idxb2);
    }
  }
  if(input.genTopEvt.IsFilled()&&input.genTopEvt.TTxIsFilled()&&input.genTopEvt.IsSemiLepton()){
    std::vector<reco::GenJet> bhad_genjet=input.genTopEvt.GetAllTopHadBGenJets();
    std::vector<reco::GenJet> blep_genjet=input.genTopEvt.GetAllTopLepBGenJets();
    reco::GenJet b1_genjet=input.genTopEvt.GetHiggsBBarGenJet();
    reco::GenJet b2_genjet=input.genTopEvt.GetHiggsBGenJet();

    std::vector<reco::GenParticle> bhad_hadron=input.genTopEvt.GetAllTopHadBHadrons();
    std::vector<reco::GenParticle> blep_hadron=input.genTopEvt.GetAllTopLepBHadrons();
    reco::GenParticle b1_hadron=input.genTopEvt.GetHiggsBBarHadron();
    reco::GenParticle b2_hadron=input.genTopEvt.GetHiggsBHadron();

    vars.FillVar( "GenHiggs_B1_GenJet_Pt",b1_genjet.pt() );
    vars.FillVar( "GenHiggs_B2_GenJet_Pt",b2_genjet.pt() );
    vars.FillVar( "GenHiggs_B1_GenJet_Eta",b1_genjet.eta() );
    vars.FillVar( "GenHiggs_B2_GenJet_Eta",b2_genjet.eta());
    vars.FillVar( "GenHiggs_B1_GenJet_Phi",b1_genjet.phi());
    vars.FillVar( "GenHiggs_B2_GenJet_Phi",b2_genjet.phi() );

    vars.FillVar( "GenHiggs_B1_Hadron_Pt",b1_hadron.pt() );
    vars.FillVar( "GenHiggs_B2_Hadron_Pt",b2_hadron.pt() );
    vars.FillVar( "GenHiggs_B1_Hadron_Eta",b1_hadron.eta() );
    vars.FillVar( "GenHiggs_B2_Hadron_Eta",b2_hadron.eta());
    vars.FillVar( "GenHiggs_B1_Hadron_Phi",b1_hadron.phi());
    vars.FillVar( "GenHiggs_B2_Hadron_Phi",b2_hadron.phi() );
    
    for(uint i=0;i<bhad_genjet.size();i++){
      if(bhad_genjet[i].pt()>1){
	      vars.FillVars( "GenTopHad_B_GenJet_Pt",i,bhad_genjet[i].pt() );
	      vars.FillVars( "GenTopHad_B_GenJet_Eta",i,bhad_genjet[i].eta() );
	      vars.FillVars( "GenTopHad_B_GenJet_Phi",i,bhad_genjet[i].phi());
      }
      if(bhad_hadron[i].pt()>1){
	      vars.FillVars( "GenTopHad_B_Hadron_Pt",i,bhad_hadron[i].pt() );
	      vars.FillVars( "GenTopHad_B_Hadron_Eta",i,bhad_hadron[i].eta() );
	      vars.FillVars( "GenTopHad_B_Hadron_Phi",i,bhad_hadron[i].phi());
      }
	  }
    
    for(uint i=0;i<blep_genjet.size();i++){
      if(blep_genjet[i].pt()>1){
	      vars.FillVars( "GenTopLep_B_GenJet_Phi",i,blep_genjet[i].phi());
	      vars.FillVars( "GenTopLep_B_GenJet_Pt",i,blep_genjet[i].pt() );
	      vars.FillVars( "GenTopLep_B_GenJet_Eta",i,blep_genjet[i].eta());
      }
      if(blep_hadron[i].pt()>1){
	      vars.FillVars( "GenTopLep_B_Hadron_Pt",i,blep_hadron[i].pt() );
	      vars.FillVars( "GenTopLep_B_Hadron_Eta",i,blep_hadron[i].eta());
	      vars.FillVars( "GenTopLep_B_Hadron_Phi",i,blep_hadron[i].phi());
      }
    }
  }
}
void StdTopVarProcessor::Init(const InputCollections& input,VariableContainer& vars){
 
  vars.InitVar( "HadTop_Pt","F" );
  vars.InitVar( "HadTop_E","F" );
  vars.InitVar( "HadTop_Eta","F" );
  vars.InitVar( "HadTop_Phi","F" );
  vars.InitVar( "HadTop_M","F" );

  vars.InitVar( "HadTop_B_Pt","F" );
  vars.InitVar( "HadTop_B_E","F" );
  vars.InitVar( "HadTop_B_Eta","F" );
  vars.InitVar( "HadTop_B_Phi","F" );
  vars.InitVar( "HadTop_B_M","F" );
//   vars.InitVar( "HadTop_B_CSV","F" );
//   vars.InitVar( "HadTop_B_Flav","F" );

  vars.InitVar( "HadTop_W_Pt","F" );
  vars.InitVar( "HadTop_W_E","F" );
  vars.InitVar( "HadTop_W_Eta","F" );
  vars.InitVar( "HadTop_W_Phi","F" );
  vars.InitVar( "HadTop_W_M","F" );

  vars.InitVar( "HadTop_W1_Pt","F" );
  vars.InitVar( "HadTop_W1_E","F" );
  vars.InitVar( "HadTop_W1_Eta","F" );
  vars.InitVar( "HadTop_W1_Phi","F" );
  vars.InitVar( "HadTop_W1_M","F" );

  vars.InitVar( "HadTop_W2_Pt","F" );
  vars.InitVar( "HadTop_W2_E","F" );
  vars.InitVar( "HadTop_W2_Eta","F" );
  vars.InitVar( "HadTop_W2_Phi","F" );
  vars.InitVar( "HadTop_W2_M","F" );

  vars.InitVar( "LepTop_Pt","F" );
  vars.InitVar( "LepTop_E","F" );
  vars.InitVar( "LepTop_Eta","F" );
  vars.InitVar( "LepTop_Phi","F" );
  vars.InitVar( "LepTop_M","F" );

  vars.InitVar( "LepTop_B_Pt","F" );
  vars.InitVar( "LepTop_B_E","F" );
  vars.InitVar( "LepTop_B_Eta","F" );
  vars.InitVar( "LepTop_B_Phi","F" );
  vars.InitVar( "LepTop_B_M","F" );
//   vars.InitVar( "LepTop_B_CSV","F" );
//   vars.InitVar( "LepTop_B_Flav","F" );

  vars.InitVar( "LepTop_W_Pt","F" );
  vars.InitVar( "LepTop_W_E","F" );
  vars.InitVar( "LepTop_W_Eta","F" );
  vars.InitVar( "LepTop_W_Phi","F" );
  vars.InitVar( "LepTop_W_M","F" );

  initialized=true;
}
void StdTopVarProcessor::Process(const InputCollections& input,VariableContainer& vars){
  if(!initialized) cerr << "tree processor not initialized" << endl;

  std::vector<pat::Jet> selectedTaggedJets;
  std::vector<pat::Jet> selectedUntaggedJets;
  for(std::vector<pat::Jet>::const_iterator itJet = input.selectedJets.begin(); itJet != input.selectedJets.end(); ++itJet){
    if(BoostedUtils::PassesCSV(*itJet, 'M')) selectedTaggedJets.push_back(*itJet);
    else selectedUntaggedJets.push_back(*itJet);
  }

  math::XYZTLorentzVector HadW;
  math::XYZTLorentzVector HadW1;
  math::XYZTLorentzVector HadW2;

  for(std::vector<pat::Jet>::const_iterator it1Jet = selectedUntaggedJets.begin(); it1Jet != selectedUntaggedJets.end(); ++it1Jet){
    for(std::vector<pat::Jet>::const_iterator it2Jet = selectedUntaggedJets.begin(); it2Jet != selectedUntaggedJets.end(); ++it2Jet){
      if(abs(80.4-(it1Jet->p4()+it2Jet->p4()).M())<abs(80.4-(HadW1+HadW2).M())){
        HadW1 = it1Jet->p4();
        HadW2 = it2Jet->p4();
        HadW = HadW1+HadW2;
      }
    }
  }

  vars.FillVar( "HadTop_W_Pt",HadW.Pt() );
  vars.FillVar( "HadTop_W_E",HadW.E() );
  vars.FillVar( "HadTop_W_Eta",HadW.Eta() );
  vars.FillVar( "HadTop_W_Phi",HadW.Phi() );
  vars.FillVar( "HadTop_W_M",HadW.M() );

  vars.FillVar( "HadTop_W1_Pt",HadW1.Pt() );
  vars.FillVar( "HadTop_W1_E",HadW1.E() );
  vars.FillVar( "HadTop_W1_Eta",HadW1.Eta() );
  vars.FillVar( "HadTop_W1_Phi",HadW1.Phi() );
  vars.FillVar( "HadTop_W1_M",HadW1.M() );

  vars.FillVar( "HadTop_W2_Pt",HadW2.Pt() );
  vars.FillVar( "HadTop_W2_E",HadW2.E() );
  vars.FillVar( "HadTop_W2_Eta",HadW2.Eta() );
  vars.FillVar( "HadTop_W2_Phi",HadW2.Phi() );
  vars.FillVar( "HadTop_W2_M",HadW2.M() );

  math::XYZTLorentzVector HadB;
  math::XYZTLorentzVector HadTop;

  for(std::vector<pat::Jet>::const_iterator itJet = selectedTaggedJets.begin(); itJet != selectedTaggedJets.end(); ++itJet){
    if(HadTop.M()==0 || abs(172.4-(HadW+itJet->p4()).M())<abs(172.4-HadTop.M())){
      HadB = itJet->p4();
      HadTop = HadB+HadW;
    }
    else{
      cout << "HadTop_W_Pt: " << HadW.Pt() << ", HadTop_B_Pt: " << itJet->pt() << ", Top mass: " << (HadW+itJet->p4()).M() << endl;
    }
  }

  vars.FillVar( "HadTop_B_Pt",HadB.Pt() );
  vars.FillVar( "HadTop_B_E",HadB.E() );
  vars.FillVar( "HadTop_B_Eta",HadB.Eta() );
  vars.FillVar( "HadTop_B_Phi",HadB.Phi() );
  vars.FillVar( "HadTop_B_M",HadB.M() );
//   vars.FillVar( "HadTop_B_CSV",MiniAODHelper::GetJetCSV(HadB,btagger) );
//   vars.FillVar( "HadTop_B_Flav",HadB.flavour() );

  vars.FillVar( "HadTop_Pt",HadTop.Pt() );
  vars.FillVar( "HadTop_E",HadTop.E() );
  vars.FillVar( "HadTop_Eta",HadTop.Eta() );
  vars.FillVar( "HadTop_Phi",HadTop.Phi() );
  vars.FillVar( "HadTop_M",HadTop.M() );

  math::XYZTLorentzVector nu1;
  math::XYZTLorentzVector nu2;
  TVector2 MET;
  MET.Set(input.pfMET.px(),input.pfMET.py());
  math::XYZTLorentzVector PrimLep = BoostedUtils::GetPrimLepVec(input.selectedElectrons, input.selectedMuons);
  BoostedUtils::GetNuVecs(PrimLep, MET, nu1, nu2);

  math::XYZTLorentzVector LepW;

  if(abs(80.4-(nu1+PrimLep).M())<abs(80.4-(nu2+PrimLep).M())) LepW = nu1+PrimLep;
  else LepW = nu2+PrimLep;

  vars.FillVar( "LepTop_W_Pt",LepW.Pt() );
  vars.FillVar( "LepTop_W_E",LepW.E() );
  vars.FillVar( "LepTop_W_Eta",LepW.Eta() );
  vars.FillVar( "LepTop_W_Phi",LepW.Phi() );
  vars.FillVar( "LepTop_W_M",LepW.M() );

  math::XYZTLorentzVector LepB;
  math::XYZTLorentzVector LepTop;

  for(std::vector<pat::Jet>::const_iterator itJet = selectedTaggedJets.begin(); itJet != selectedTaggedJets.end(); ++itJet){
    if(LepTop.M()==0 || abs(172.4-(LepW+itJet->p4()).M())<abs(172.4-LepTop.M())){
      LepB = itJet->p4();
      LepTop = LepW+LepB;
    }
  }

  vars.FillVar( "LepTop_B_Pt",LepB.Pt() );
  vars.FillVar( "LepTop_B_E",LepB.E() );
  vars.FillVar( "LepTop_B_Eta",LepB.Eta() );
  vars.FillVar( "LepTop_B_Phi",LepB.Phi() );
  vars.FillVar( "LepTop_B_M",LepB.M() );
//   vars.FillVar( "LepTop_B_CSV",MiniAODHelper::GetJetCSV(LepB,btagger) );
//   vars.FillVar( "LepTop_B_Flav",LepB.flavour() );

  vars.FillVar( "LepTop_Pt",LepTop.Pt() );
  vars.FillVar( "LepTop_E",LepTop.E() );
  vars.FillVar( "LepTop_Eta",LepTop.Eta() );
  vars.FillVar( "LepTop_Phi",LepTop.Phi() );
  vars.FillVar( "LepTop_M",LepTop.M() );

}