Exemplo n.º 1
0
// -----------------------------------------------------------------------------
// ReadEvent
// -----------------------------------------------------------------------------
StatusCode::Type DelfesTreeReader::ReadEvent(EventFormat& myEvent, SampleFormat& mySample)
{
  // Initiliaze MC
  myEvent.InitializeRec();
  myEvent.InitializeMC();

  // (expected) end of the file ?
  if (read_nevents_ >= total_nevents_) return StatusCode::FAILURE;

  // read the next event
  if (!treeReader_->ReadEntry(read_nevents_))
  {
    ERROR << "Unexpected end of the file !" << endmsg;
    return StatusCode::FAILURE;
  }

  read_nevents_++;

  FillEvent(myEvent,mySample);

  return StatusCode::KEEP;
}
Exemplo n.º 2
0
// -----------------------------------------------------------------------------
// FillEventParticleLine
// -----------------------------------------------------------------------------
void DelfesTreeReader::FillEvent(EventFormat& myEvent, SampleFormat& mySample)
{
  // Fill electrons
  if (branchElectron_!=0)
  for (unsigned int i=0;i<static_cast<UInt_t>(branchElectron_->GetEntries());i++)
  {
    Electron* part = dynamic_cast<Electron*>(branchElectron_->At(i));
    RecLeptonFormat * electron = myEvent.rec()->GetNewElectron();
    electron->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0);
    if (part->Charge>0) electron->charge_=true; else electron->charge_=false;
    electron->HEoverEE_ = part->EhadOverEem;

    IsolationConeType* isolcone05 = electron->GetNewIsolCone();
    isolcone05->sumPT_   = part->sumPT05;
    isolcone05->sumET_   = part->sumET05;
    isolcone05->ntracks_ = part->nTrack05;
    isolcone05->deltaR_  = 0.5;

    IsolationConeType* isolcone04 = electron->GetNewIsolCone();
    isolcone04->sumPT_   = part->sumPT04;
    isolcone04->sumET_   = part->sumET04;
    isolcone04->ntracks_ = part->nTrack04;
    isolcone04->deltaR_  = 0.4;

    IsolationConeType* isolcone03 = electron->GetNewIsolCone();
    isolcone03->sumPT_   = part->sumPT03;
    isolcone03->sumET_   = part->sumET03;
    isolcone03->ntracks_ = part->nTrack03;
    isolcone03->deltaR_  = 0.3;

    IsolationConeType* isolcone02 = electron->GetNewIsolCone();
    isolcone02->sumPT_   = part->sumPT02;
    isolcone02->sumET_   = part->sumET02;
    isolcone02->ntracks_ = part->nTrack02;
    isolcone02->deltaR_  = 0.2;

  }

  // Fill photons
  if (branchPhoton_!=0)
  for (unsigned int i=0;i<static_cast<UInt_t>(branchPhoton_->GetEntries());i++)
  {
    Photon* part = dynamic_cast<Photon*>(branchPhoton_->At(i));
    RecPhotonFormat * photon = myEvent.rec()->GetNewPhoton();
    photon->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0);
    photon->HEoverEE_ = part->EhadOverEem;

    IsolationConeType* isolcone05 = photon->GetNewIsolCone();
    isolcone05->sumPT_   = part->sumPT05;
    isolcone05->sumET_   = part->sumET05;
    isolcone05->ntracks_ = part->nTrack05;
    isolcone05->deltaR_  = 0.5;

    IsolationConeType* isolcone04 = photon->GetNewIsolCone();
    isolcone04->sumPT_   = part->sumPT04;
    isolcone04->sumET_   = part->sumET04;
    isolcone04->ntracks_ = part->nTrack04;
    isolcone04->deltaR_  = 0.4;

    IsolationConeType* isolcone03 = photon->GetNewIsolCone();
    isolcone03->sumPT_   = part->sumPT03;
    isolcone03->sumET_   = part->sumET03;
    isolcone03->ntracks_ = part->nTrack03;
    isolcone03->deltaR_  = 0.3;

    IsolationConeType* isolcone02 = photon->GetNewIsolCone();
    isolcone02->sumPT_   = part->sumPT02;
    isolcone02->sumET_   = part->sumET02;
    isolcone02->ntracks_ = part->nTrack02;
    isolcone02->deltaR_  = 0.2;

  }

  // Fill muons
  if (branchMuon_!=0)
  for (unsigned int i=0;i<static_cast<UInt_t>(branchMuon_->GetEntries());i++)
  {
    Muon* part = dynamic_cast<Muon*>(branchMuon_->At(i));
    RecLeptonFormat * muon = myEvent.rec()->GetNewMuon();
    muon->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0);
    if (part->Charge>0) muon->charge_=true; else muon->charge_=false;

    IsolationConeType* isolcone05 = muon->GetNewIsolCone();
    isolcone05->sumPT_   = part->sumPT05;
    isolcone05->sumET_   = part->sumET05;
    isolcone05->ntracks_ = part->nTrack05;
    isolcone05->deltaR_  = 0.5;

    IsolationConeType* isolcone04 = muon->GetNewIsolCone();
    isolcone04->sumPT_   = part->sumPT04;
    isolcone04->sumET_   = part->sumET04;
    isolcone04->ntracks_ = part->nTrack04;
    isolcone04->deltaR_  = 0.4;

    IsolationConeType* isolcone03 = muon->GetNewIsolCone();
    isolcone03->sumPT_   = part->sumPT03;
    isolcone03->sumET_   = part->sumET03;
    isolcone03->ntracks_ = part->nTrack03;
    isolcone03->deltaR_  = 0.3;

    IsolationConeType* isolcone02 = muon->GetNewIsolCone();
    isolcone02->sumPT_   = part->sumPT02;
    isolcone02->sumET_   = part->sumET02;
    isolcone02->ntracks_ = part->nTrack02;
    isolcone02->deltaR_  = 0.2;
  }

  // Fill jets and taus
  if (branchJet_!=0)
  for (unsigned int i=0;i<static_cast<UInt_t>(branchJet_->GetEntries());i++)
  {
    Jet* part = dynamic_cast<Jet*>(branchJet_->At(i));
    if(part->TauTag==1)
    {
      RecTauFormat * tau = myEvent.rec()->GetNewTau();
      tau->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0);
      tau->ntracks_  = 0; // To fix later
      if (part->Charge>0) tau->charge_=true; else tau->charge_=false;
      tau->HEoverEE_ = part->EhadOverEem;
    }
    else
    {
      RecJetFormat * jet = myEvent.rec()->GetNewJet();
      jet->momentum_.SetPtEtaPhiM(part->PT,part->Eta,part->Phi,0.0);
      jet->ntracks_  = 0; // To fix later
      jet->btag_     = part->BTag;
      jet->HEoverEE_ = part->EhadOverEem;
    }
  }

  // MET
  if (branchMissingET_!=0)
  if (branchMissingET_->GetEntries()>0)
  {
    MissingET* part = dynamic_cast<MissingET*>(branchMissingET_->At(0));
    myEvent.rec()->MET_.momentum_.SetPx(part->MET*cos(part->Phi));
    myEvent.rec()->MET_.momentum_.SetPy(part->MET*sin(part->Phi));
    myEvent.rec()->MET_.momentum_.SetE(part->MET);
  }

  // THT
  if (branchScalarHT_!=0)
  if (branchScalarHT_->GetEntries()>0)
  {
    ScalarHT* part = dynamic_cast<ScalarHT*>(branchScalarHT_->At(0));
    myEvent.rec()->THT_=part->HT;
  }

  // GenParticle collection
  if (branchGenParticle_!=0)
  for (unsigned int i=0;i<static_cast<UInt_t>(branchGenParticle_->GetEntries());i++)
  {
    GenParticle* part = dynamic_cast<GenParticle*>(branchGenParticle_->At(i));
    MCParticleFormat * gen = myEvent.mc()->GetNewParticle();
    gen->pdgid_      = part->PID;
    gen->statuscode_ = part->Status;
    gen->mothup1_    = part->M1;
    gen->mothup2_    = part->M2;
    gen->momentum_.SetPxPyPzE(part->Px,part->Py, part->Pz, part->E);
  }

  // Track collection
  if (branchTrack_!=0)
  for (unsigned int i=0;i<static_cast<UInt_t>(branchTrack_->GetEntries());i++)
  {
    Track* ref = dynamic_cast<Track*>(branchTrack_->At(i));
    RecTrackFormat * track = myEvent.rec()->GetNewTrack();
    track->pdgid_ = ref->PID;
    if (ref->Charge>0) track->charge_=true; else track->charge_=false;
    track->momentum_.SetPtEtaPhiE(ref->PT,ref->Eta,ref->Phi,ref->PT);
    track->etaOuter_ = ref->EtaOuter;
    track->phiOuter_ = ref->PhiOuter;

    IsolationConeType* isolcone05 = track->GetNewIsolCone();
    isolcone05->sumPT_   = ref->sumPT05;
    isolcone05->sumET_   = ref->sumET05;
    isolcone05->ntracks_ = ref->nTrack05;
    isolcone05->deltaR_  = 0.5;

    IsolationConeType* isolcone04 = track->GetNewIsolCone();
    isolcone04->sumPT_   = ref->sumPT04;
    isolcone04->sumET_   = ref->sumET04;
    isolcone04->ntracks_ = ref->nTrack04;
    isolcone04->deltaR_  = 0.4;

    IsolationConeType* isolcone03 = track->GetNewIsolCone();
    isolcone03->sumPT_   = ref->sumPT03;
    isolcone03->sumET_   = ref->sumET03;
    isolcone03->ntracks_ = ref->nTrack03;
    isolcone03->deltaR_  = 0.3;

    IsolationConeType* isolcone02 = track->GetNewIsolCone();
    isolcone02->sumPT_   = ref->sumPT02;
    isolcone02->sumET_   = ref->sumET02;
    isolcone02->ntracks_ = ref->nTrack02;
    isolcone02->deltaR_  = 0.2;
  }
}
Exemplo n.º 3
0
// -----------------------------------------------------------------------------
// FinalizeEvent
// -----------------------------------------------------------------------------
bool DelfesTreeReader::FinalizeEvent(SampleFormat& mySample, EventFormat& myEvent)
{
  // MHT & THT
  for (unsigned int i=0; i<myEvent.rec()->jets_.size();i++)
  {
    myEvent.rec()->MHT_ -= myEvent.rec()->jets_[i].momentum();
    if (branchScalarHT_==0) myEvent.rec()->THT_ += myEvent.rec()->jets_[i].pt();
    myEvent.rec()->TET_ += myEvent.rec()->jets_[i].pt();
  }

  // TET
  for (unsigned int i=0; i<myEvent.rec()->muons_.size();i++)
  {
    myEvent.rec()->TET_ += myEvent.rec()->muons_[i].pt();
  }
  for (unsigned int i=0; i<myEvent.rec()->electrons_.size();i++)
  {
    myEvent.rec()->TET_ += myEvent.rec()->electrons_[i].pt();
  }
  for (unsigned int i=0; i<myEvent.rec()->taus_.size();i++)
  {
    myEvent.rec()->TET_ += myEvent.rec()->taus_[i].pt();
  }
  for (unsigned int i=0; i<myEvent.rec()->photons_.size();i++)
  {
    myEvent.rec()->TET_ += myEvent.rec()->photons_[i].pt();
  }

  // Finalize MHT
  myEvent.rec()->MHT_.momentum().SetPz(0.);
  myEvent.rec()->MHT_.momentum().SetE(myEvent.rec()->MHT_.momentum().Pt());


  // Mother pointer assignment
  for (unsigned int i=0; i<myEvent.mc()->particles_.size();i++)
  {
    MCParticleFormat& part = myEvent.mc()->particles_[i];

    // MET, MHT, TET, THT
    if (part.statuscode()==1 && !PHYSICS->Id->IsInvisible(part))
    {
      myEvent.mc()->MET_ -= part.momentum();
      myEvent.mc()->TET_ += part.pt();
      if (PHYSICS->Id->IsHadronic(part))
      {
        myEvent.mc()->MHT_ -= part.momentum();
        myEvent.mc()->THT_ += part.pt(); 
      }
    }
    
    /*    unsigned int index1=myEvent.mc()->particles_[i].mothup1_;
    unsigned int index2=myEvent.mc()->particles_[i].mothup2_;
    if (index1!=0 && index2!=0)
    {
      if (index1>=myEvent.mc()->particles_.size() ||
          index2>=myEvent.mc()->particles_.size())
      {
        WARNING << "mother index is greater to nb of particles" << endmsg;
        WARNING << " - index1 = " << index1 << endmsg;
        WARNING << " - index2 = " << index2 << endmsg;
        WARNING << " - particles.size() " << myEvent.mc()->particles_.size() << endmsg;
        WARNING << "This event is skipped." << endmsg;
        return false;
      }

      myEvent.mc()->particles_[i].mother1_ = &myEvent.mc()->particles_[index1-1];
      myEvent.mc()->particles_[index1-1].daughters_.push_back(&myEvent.mc()->particles_[i]);
      myEvent.mc()->particles_[i].mother2_ = &myEvent.mc()->particles_[index2-1];
      myEvent.mc()->particles_[index2-1].daughters_.push_back(&myEvent.mc()->particles_[i]);
    }
    */
  }

  // Finalize event
  myEvent.mc()->MET_.momentum().SetPz(0.);
  myEvent.mc()->MET_.momentum().SetE(myEvent.mc()->MET_.momentum().Pt());
  myEvent.mc()->MHT_.momentum().SetPz(0.);
  myEvent.mc()->MHT_.momentum().SetE(myEvent.mc()->MHT_.momentum().Pt());

  // Normal end
  return true; 
}
Exemplo n.º 4
0
// -----------------------------------------------------------------------------
// Execute
// function called each time one event is read
// -----------------------------------------------------------------------------
bool cms_b2g_15_004::Execute(SampleFormat& sample, const EventFormat& event)
{
        if(event.rec()!= 0){
                double myEventWeight;
                if(Configuration().IsNoEventWeight()) myEventWeight=1.;
                else if(event.mc()->weight()!=0.) myEventWeight=event.mc()->weight();
                else{
                        WARNING << "Found one event with a zero weight. Skipping..." << endmsg;
                        return false;
                }
                Manager()->InitializeForNewEvent(myEventWeight);
                Manager()->SetCurrentEventWeight(myEventWeight);

                //Declare empty containers
                vector<const RecJetFormat*> myJets;
                vector<const RecLeptonFormat*> myElectrons;
                vector<const RecLeptonFormat*> myMuons;

                if(!Manager()->ApplyCut(event.rec()->electrons().size()+ event.rec()->muons().size()>= 1,"1+ candidate lepton")) return true;
                if(!Manager()->ApplyCut(event.rec()->jets().size()>1, "2+ candidate jets")) return true;

                for(unsigned int i= 0; i< event.rec()->electrons().size(); i++){
                        bool good= true;
                        const RecLeptonFormat *CurrentElectron= &(event.rec()->electrons()[i]);

                        for(unsigned int j= 0; j< event.rec()->jets().size(); j++){
                                const RecJetFormat *CurrentJet= &(event.rec()->jets()[j]);
                                double deltaR= CurrentElectron->dr(CurrentJet);
                                double angle= CurrentElectron->angle(CurrentJet);
                                double relapt= CurrentElectron->momentum().Pt()*sin(angle);
                                if(!(deltaR> 0.4 || relapt> 60.)) good= false;
                        }

                        double pt= CurrentElectron->momentum().Pt();
                        double eta= CurrentElectron->momentum().Eta();
                        if(pt> 180. && fabs(eta)< 2.5 && good) myElectrons.push_back(CurrentElectron);
                }

                for(unsigned int i= 0; i< event.rec()->muons().size(); i++){
                        bool good= true;
                        const RecLeptonFormat *CurrentMuon= &(event.rec()->muons()[i]);

                        for(unsigned int j= 0; j< event.rec()->jets().size(); j++){
                                const RecJetFormat *CurrentJet= &(event.rec()->jets()[j]);
                                double deltaR= CurrentMuon->dr(CurrentJet);
                                double angle= CurrentMuon->angle(CurrentJet);
                                double relapt= CurrentMuon->momentum().Pt()*sin(angle);
                                if(!(deltaR> 0.4 || relapt> 50.)) good= false;
                        }

                        double pt= CurrentMuon->momentum().Pt();
                        double eta= CurrentMuon->momentum().Eta();
                        if(pt> 180. && fabs(eta)< 2.1 && good) myMuons.push_back(CurrentMuon);
                }

                for(unsigned int j= 0; j< event.rec()->jets().size(); j++){
                        const RecJetFormat *CurrentJet= &(event.rec()->jets()[j]);
                        myJets.push_back(CurrentJet);
                }
                SORTER->sort(myJets);

                if(!Manager()->ApplyCut(myElectrons.size()>=1, "1+ electrons")) return true;
                if(!Manager()->ApplyCut(myJets[0]->momentum().Pt()> 350, "pt leading jet> 350 GeV")) return true;
                if(!Manager()->ApplyCut(myJets[1]->momentum().Pt()> 30., "pt subleading jet> 30 GeV")) return true;
                if(!Manager()->ApplyCut((myJets[0]->btag() || myJets[1]->btag()), "b-tagging electron")) return true;
                if(!Manager()->ApplyCut(event.rec()->MET().et()> 120., "missing ET> 120 GeV")) return true;
                if(myElectrons.size()>=1){
                        double phi= event.rec()->MET().phi()- myElectrons[0]->phi();
                        if(!Manager()->ApplyCut(fabs(phi)< 2.,"delta phi (missing ET, electron)< 2 rad")) return true;
                }

                if(!Manager()->ApplyCut(myMuons.size()>=1, "1+ muons")) return true;
                if(!Manager()->ApplyCut(myJets[0]->momentum().Pt()> 450., "pt leading jet> 450 GeV")) return true;
                if(!Manager()->ApplyCut(myJets[1]->momentum().Pt()> 30., "pt subleading jet> 30 GeV")) return true;
                if(!Manager()->ApplyCut((myJets[0]->btag() || myJets[1]->btag()), "b-tagging muon")) return true;
                if(!Manager()->ApplyCut(event.rec()->MET().et()> 50., "missing ET> 50 GeV")) return true;

                if(myElectrons.size()>=1){
                        double Wmass= (myElectrons[0]->momentum()+event.rec()->MET().momentum()).M();
                        double test= sqrt(2*myElectrons[0]->pt()*event.rec()->MET().pt()*(cosh(myElectrons[0]->eta() -event.rec()->MET().eta())- cos(myElectrons[0]->phi() - event.rec()->MET().phi())));
                        if(pow((myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2),2)- event.rec()->MET().et()*event.rec()->MET().et()*
                                (myElectrons[0]->e()*myElectrons[0]->e() - myElectrons[0]->pz()*myElectrons[0]->pz())>0){
                        double pzneutri1= (myElectrons[0]->pz()*(myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2) + 
                                        myElectrons[0]->e()* sqrt(pow((myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2),2)- event.rec()->MET().et()*event.rec()->MET().et()*
                                                (myElectrons[0]->e()*myElectrons[0]->e() - myElectrons[0]->pz()*myElectrons[0]->pz())))/(myElectrons[0]->e()*myElectrons[0]->e()- myElectrons[0]->pz()*myElectrons[0]->pz());
                        double pzneutri2= (myElectrons[0]->pz()*(myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2) - 
                                        myElectrons[0]->e()* sqrt(pow((myElectrons[0]->px()*event.rec()->MET().px() + myElectrons[0]->py()*event.rec()->MET().py() + (80.4*80.4)/2),2)- event.rec()->MET().et()*event.rec()->MET().et()*
                                                (myElectrons[0]->e()*myElectrons[0]->e() - myElectrons[0]->pz()*myElectrons[0]->pz())))/(myElectrons[0]->e()*myElectrons[0]->e()- myElectrons[0]->pz()*myElectrons[0]->pz());
                        cout<<"pz1: "<< pzneutri1 << endl; 
                        cout<<"pz2: "<< pzneutri2 << endl; 
                        double nrjneut1= sqrt(event.rec()->MET().px()*event.rec()->MET().px() + event.rec()->MET().py()*event.rec()->MET().py() + pzneutri1*pzneutri1); 
                        double nrjneut2= sqrt(event.rec()->MET().px()*event.rec()->MET().px() + event.rec()->MET().py()*event.rec()->MET().py() + pzneutri2*pzneutri2); 
                        cout<<"e neut1: "<< nrjneut1 << endl;
                        cout<<"e neut2: "<< nrjneut2 << endl;
                        double lachose= sqrt(2*(nrjneut1*myElectrons[0]->e()-myElectrons[0]->px()*event.rec()->MET().px()-myElectrons[0]->py()*event.rec()->MET().py()-myElectrons[0]->pz()*pzneutri1));
                        cout<<"la masse: "<< lachose << endl;
                                                }
                        //cout<<"W: "<< Wmass << endl;
                        //cout<<"E neutri: "<< event.rec()->MET().e() << endl;
                        //cout<<"pt: "<< event.rec()->MET().pt() << endl;
                        //cout<<"px: "<< event.rec()->MET().px() << endl;
                        //cout<<"py: "<< event.rec()->MET().py() << endl;
                        //cout<<"pz: "<< event.rec()->MET().pz() << endl;
                        //cout<<"truc: "<< sqrt(event.rec()->MET().px()*event.rec()->MET().px()+event.rec()->MET().py()*event.rec()->MET().py()) << endl;
                        //cout<<"test: "<< test << endl;
                }

        }

        return true;
}
Exemplo n.º 5
0
// -----------------------------------------------------------------------------
// Initialize
// -----------------------------------------------------------------------------
void AnalysisHelper::Initialize(SampleFormat& sample, const EventFormat& event)
{
  // Reset
  partons_.clear();
  matchedjets_.clear();

  // Safety: no MC information
  if (event.mc()==0) return;

  // Storing b and c quarks
  for (unsigned int i=0;i<event.mc()->particles().size();i++)
  {
    const MCParticleFormat& part = event.mc()->particles()[i];

    // particle from MadGraph
    if (part.statuscode()!=3) continue;

    // keeping only partons
    unsigned int pid = std::abs(part.pdgid());
    if (pid==21) pid=0;
    if (pid>=6) continue;

    // Removing partons from initial state
    if (i<4) continue;
    if (part.pt()<5) continue;

    // Safety: this particle must have a mother
    if (part.mother1()==0) continue;

    // Taking into account radiation
    // -> taking parton before radiation
    // Case of gluon ????
    if (part.mother1()->pdgid()==part.pdgid()) continue;

    // Saving parton
    partons_.push_back(&part);
  }

  // Ordering partons by PT order
  for (unsigned int i=0;i<partons_.size();i++)
    for (unsigned int j=i+1;j<partons_.size();j++)
    {
      if (partons_[i]->pt()<partons_[j]->pt())
      {
        const MCParticleFormat* tmp=partons_[i];
        partons_[i]=partons_[j];
        partons_[j]=tmp;
      }
    }

  // Prepare collection of jets
  matchedjets_.resize(partons_.size(),0);

  // Skip ?
  if (partons_.size()==0) return;

  // Mask : only one jet for each parton
  std::vector<bool> mask(partons_.size(),false);

  // Ordering jets by PT order
  std::vector<const RecJetFormat*> jets;
  for (unsigned int i=0;i<event.rec()->jets().size();i++)
  {
    jets.push_back(&event.rec()->jets()[i]);
  }
  for (unsigned int i=0;i<jets.size();i++)
    for (unsigned int j=i+1;j<jets.size();j++)
    {
      if (jets[i]->pt()<jets[j]->pt())
      {
        const RecJetFormat* tmp=jets[i];
        jets[i]=jets[j];
        jets[j]=tmp;
      }
    }

  // Matching jets
  for (unsigned int i=0;i<jets.size();i++)
  {
    const RecJetFormat* jet = jets[i];

    // cut on the PT
    if (jet->pt()<1.e-6) continue;

    int bestcandidate = -1;
    double deltaRmin = 0;

    // loop over particles
    for (unsigned int j=0;j<partons_.size();j++)
    {
      // is the parton already used?
      if (mask[j]) continue;

      // computing DR
      const MCParticleFormat* part = partons_[j];
      double dr=jet->dr(*part);

      // does the parton match the jet ?
      if (dr<0.5)
      {
        if (bestcandidate==-1 || deltaRmin<dr)
        {
          deltaRmin=dr;
          bestcandidate=j;
        }
      }
    }

    // final matching
    if (bestcandidate!=-1)
    {
       matchedjets_[bestcandidate]=jet;
       mask[bestcandidate]=true;
    }
  }
}