Fork me on GitHub

Changeset d612dec in git for modules


Ignore:
Timestamp:
Dec 9, 2021, 7:52:15 AM (3 years ago)
Author:
christinaw97 <christina.wang@…>
Children:
29b722a
Parents:
a5af1df (diff), 0c0c9af (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of github.com:Christinaw97/delphes into HEAD

Location:
modules
Files:
12 added
26 edited

Legend:

Unmodified
Added
Removed
  • modules/AngularSmearing.cc

    ra5af1df rd612dec  
    9898{
    9999  Candidate *candidate, *mother;
    100   Double_t pt, eta, phi, e;
     100  Double_t pt, eta, phi, e, m;
    101101
    102102  fItInputArray->Reset();
    103103  while((candidate = static_cast<Candidate *>(fItInputArray->Next())))
    104104  {
    105     const TLorentzVector &candidatePosition = candidate->Position;
    106105    const TLorentzVector &candidateMomentum = candidate->Momentum;
    107     eta = candidatePosition.Eta();
    108     phi = candidatePosition.Phi();
     106    eta = candidateMomentum.Eta();
     107    phi = candidateMomentum.Phi();
    109108    pt = candidateMomentum.Pt();
    110109    e = candidateMomentum.E();
     110    m = candidateMomentum.M();
    111111
    112112    // apply smearing formula for eta,phi
    113 
    114     eta = gRandom->Gaus(eta, fFormulaEta->Eval(pt, eta, phi, e));
    115     phi = gRandom->Gaus(phi, fFormulaPhi->Eval(pt, eta, phi, e));
     113    eta = gRandom->Gaus(eta, fFormulaEta->Eval(pt, eta, phi, e, candidate));
     114    phi = gRandom->Gaus(phi, fFormulaPhi->Eval(pt, eta, phi, e, candidate));
    116115
    117116    if(pt <= 0.0) continue;
     
    119118    mother = candidate;
    120119    candidate = static_cast<Candidate *>(candidate->Clone());
    121     eta = candidateMomentum.Eta();
    122     phi = candidateMomentum.Phi();
    123     candidate->Momentum.SetPtEtaPhiE(pt, eta, phi, pt * TMath::CosH(eta));
     120    candidate->Momentum.SetPtEtaPhiM(pt, eta, phi, m);
    124121    candidate->AddCandidate(mother);
    125122
  • modules/Calorimeter.cc

    ra5af1df rd612dec  
    231231  fItParticleInputArray->Reset();
    232232  number = -1;
     233  fTowerRmax=0.;
    233234  while((particle = static_cast<Candidate *>(fItParticleInputArray->Next())))
    234235  {
    235236    const TLorentzVector &particlePosition = particle->Position;
    236237    ++number;
     238
     239    // compute maximum radius (needed in FinalizeTower to assess whether barrel or endcap tower)
     240    if (particlePosition.Perp() > fTowerRmax)
     241      fTowerRmax=particlePosition.Perp();
    237242
    238243    pdgCode = TMath::Abs(particle->PID);
     
    450455
    451456    fTower->AddCandidate(particle);
     457    fTower->Position = position;
    452458  }
    453459
     
    461467{
    462468  Candidate *track, *tower, *mother;
    463   Double_t energy, pt, eta, phi;
     469  Double_t energy, pt, eta, phi, r;
    464470  Double_t ecalEnergy, hcalEnergy;
    465471  Double_t ecalNeutralEnergy, hcalNeutralEnergy;
     
    511517  for(size_t i = 0; i < fTower->ECalEnergyTimePairs.size(); ++i)
    512518  {
    513     weight = TMath::Sqrt(fTower->ECalEnergyTimePairs[i].first);
     519    weight = TMath::Power((fTower->ECalEnergyTimePairs[i].first),2);
    514520    sumWeightedTime += weight * fTower->ECalEnergyTimePairs[i].second;
    515521    sumWeight += weight;
     
    517523  }
    518524
     525  // check whether barrel or endcap tower
     526  if (fTower->Position.Perp() < fTowerRmax && TMath::Abs(eta) > 0.)
     527    r = fTower->Position.Z()/TMath::SinH(eta);
     528  else
     529    r = fTower->Position.Pt();
     530
    519531  if(sumWeight > 0.0)
    520532  {
    521     fTower->Position.SetPtEtaPhiE(1.0, eta, phi, sumWeightedTime / sumWeight);
     533    fTower->Position.SetPtEtaPhiE(r, eta, phi, sumWeightedTime / sumWeight);
    522534  }
    523535  else
    524536  {
    525     fTower->Position.SetPtEtaPhiE(1.0, eta, phi, 999999.9);
     537    fTower->Position.SetPtEtaPhiE(r, eta, phi, 999999.9);
    526538  }
    527539
     
    559571  if(ecalNeutralEnergy > fECalEnergyMin && ecalNeutralSigma > fECalEnergySignificanceMin)
    560572  {
    561     // create new photon tower
     573    // create new photon tower assuming null mass
    562574    tower = static_cast<Candidate *>(fTower->Clone());
    563575    pt = ecalNeutralEnergy / TMath::CosH(eta);
     
    646658      track = static_cast<Candidate *>(track->Clone());
    647659      track->AddCandidate(mother);
    648 
    649660      track->Momentum *= rescaleFactor;
     661      track->Momentum.SetPtEtaPhiM(track->Momentum.Pt()*rescaleFactor, track->Momentum.Eta(), track->Momentum.Phi(), track->Momentum.M());
    650662
    651663      fEFlowTrackOutputArray->Add(track);
  • modules/Calorimeter.h

    ra5af1df rd612dec  
    6060  Double_t fTimingEnergyMin;
    6161  Bool_t fElectronsFromTrack;
     62  Double_t fTowerRmax;
    6263
    6364  Int_t fTowerTrackHits, fTowerPhotonHits;
  • modules/Delphes.cc

    ra5af1df rd612dec  
    6161  fFactory(0)
    6262{
    63   TFolder *folder = new TFolder(name, "");
     63  TFolder *folder;
     64
    6465  fFactory = new DelphesFactory("ObjectFactory");
     66
     67  folder = new TFolder(name, "");
    6568
    6669  SetName(name);
     
    8083  if(folder)
    8184  {
     85    gROOT->GetListOfBrowsables()->Remove(folder);
    8286    folder->Clear();
    8387    delete folder;
  • modules/DenseTrackFilter.cc

    ra5af1df rd612dec  
    237237
    238238  Candidate *candidate, *track;
    239   Double_t pt, eta, phi;
     239  Double_t pt, eta, phi, m;
    240240  Int_t numberOfCandidates;
    241241
     
    251251  eta = candidate->Momentum.Eta();
    252252  phi = candidate->Momentum.Phi();
     253  m = candidate->Momentum.M();
     254
    253255  eta = gRandom->Gaus(eta, fEtaPhiRes);
    254256  phi = gRandom->Gaus(phi, fEtaPhiRes);
    255   candidate->Momentum.SetPtEtaPhiE(pt, eta, phi, pt * TMath::CosH(eta));
     257  candidate->Momentum.SetPtEtaPhiM(pt, eta, phi, m);
    256258  candidate->AddCandidate(track);
    257259
  • modules/DualReadoutCalorimeter.cc

    ra5af1df rd612dec  
    2424  // This implementation of dual calorimetry relies on several approximations:
    2525  // - If hadronic energy is found in the tower the energy resolution then the full tower enrgy is smeared according to hadronic resolution (pessimistic for (e,n) or (pi+,gamma))
    26   // - While e+ vs pi+ (or gamma vs n) separation is in principle possible for single particles (using C/S, PMT timing, lateral shower profile) it is not obvious it can be done overlapping particles. 
     26  // - While e+ vs pi+ (or gamma vs n) separation is in principle possible for single particles (using C/S, PMT timing, lateral shower profile) it is not obvious it can be done overlapping particles.
    2727  //   Now we assume that regarless of the number of particle hits per tower we can always distinguish e+ vs pi+, which is probably not true in the case (e+,n) vs (pi+,gamma) without longitudinal segmentation.
    2828
     
    6363  fItParticleInputArray(0), fItTrackInputArray(0)
    6464{
    65  
     65
    6666  fECalResolutionFormula = new DelphesFormula;
    6767  fHCalResolutionFormula = new DelphesFormula;
     
    7575  fTowerTrackArray = new TObjArray;
    7676  fItTowerTrackArray = fTowerTrackArray->MakeIterator();
    77  
     77
    7878}
    7979
     
    8282DualReadoutCalorimeter::~DualReadoutCalorimeter()
    8383{
    84  
     84
    8585  if(fECalResolutionFormula) delete fECalResolutionFormula;
    8686  if(fHCalResolutionFormula) delete fHCalResolutionFormula;
     
    9494  if(fTowerTrackArray) delete fTowerTrackArray;
    9595  if(fItTowerTrackArray) delete fItTowerTrackArray;
    96  
     96
    9797}
    9898
     
    172172  fECalEnergyMin = GetDouble("ECalEnergyMin", 0.0);
    173173  fHCalEnergyMin = GetDouble("HCalEnergyMin", 0.0);
     174  fEnergyMin = GetDouble("EnergyMin", 0.0);
    174175
    175176  fECalEnergySignificanceMin = GetDouble("ECalEnergySignificanceMin", 0.0);
    176177  fHCalEnergySignificanceMin = GetDouble("HCalEnergySignificanceMin", 0.0);
     178  fEnergySignificanceMin = GetDouble("EnergySignificanceMin", 0.0);
    177179
    178180  // switch on or off the dithering of the center of DualReadoutCalorimeter towers
     
    245247  fItParticleInputArray->Reset();
    246248  number = -1;
     249  fTowerRmax=0.;
     250
     251  //cout<<"--------- new event ---------- "<<endl;
     252
    247253  while((particle = static_cast<Candidate*>(fItParticleInputArray->Next())))
    248254  {
    249255    const TLorentzVector &particlePosition = particle->Position;
    250256    ++number;
     257
     258    // compute maximum radius (needed in FinalizeTower to assess whether barrel or endcap tower)
     259    if (particlePosition.Perp() > fTowerRmax)
     260      fTowerRmax=particlePosition.Perp();
    251261
    252262    pdgCode = TMath::Abs(particle->PID);
     
    377387      fHCalTrackEnergy = 0.0;
    378388      fTrackEnergy = 0.0;
    379      
     389
    380390      fECalTrackSigma = 0.0;
    381391      fHCalTrackSigma = 0.0;
    382392      fTrackSigma = 0.0;
    383      
     393
    384394      fTowerTrackHits = 0;
    385395      fTowerPhotonHits = 0;
     396
     397      fTowerTime = 0.0;
     398      fTowerTimeWeight = 0.0;
    386399
    387400      fECalTowerTrackArray->Clear();
    388401      fHCalTowerTrackArray->Clear();
    389402      fTowerTrackArray->Clear();
    390    
     403
    391404    }
    392405
     
    412425      }
    413426
    414      
    415       /*
    416       if(fECalTrackFractions[number] > 1.0E-9 && fHCalTrackFractions[number] < 1.0E-9)
    417       {
    418         fECalTrackEnergy += ecalEnergy;
    419         ecalSigma = fECalResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E());       
    420         if(ecalSigma/momentum.E() < track->TrackResolution) energyGuess = ecalEnergy;       
    421         else energyGuess = momentum.E();
    422 
    423         fECalTrackSigma += (track->TrackResolution)*energyGuess*(track->TrackResolution)*energyGuess;
    424         fECalTowerTrackArray->Add(track);
    425       }
    426      
    427       else if(fECalTrackFractions[number] < 1.0E-9 && fHCalTrackFractions[number] > 1.0E-9)
    428       {
    429         fHCalTrackEnergy += hcalEnergy;
    430         hcalSigma = fHCalResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E());
    431         if(hcalSigma/momentum.E() < track->TrackResolution) energyGuess = hcalEnergy;
    432         else energyGuess = momentum.E();
    433 
    434         fHCalTrackSigma += (track->TrackResolution)*energyGuess*(track->TrackResolution)*energyGuess;
    435         fHCalTowerTrackArray->Add(track);
    436       }
    437      
    438       // muons
    439       else if(fECalTrackFractions[number] < 1.0E-9 && fHCalTrackFractions[number] < 1.0E-9)
    440       {
    441         fEFlowTrackOutputArray->Add(track);
    442       }
    443       */
    444      
    445427      // in Dual Readout we do not care if tracks are ECAL of HCAL
    446428      if(fECalTrackFractions[number] > 1.0E-9 || fHCalTrackFractions[number] > 1.0E-9)
    447       { 
     429      {
    448430        fTrackEnergy += energy;
    449         // this sigma will be used to determine whether neutral excess is significant. We choose the resolution according to bthe higest deposited fraction (in practice had for charged hadrons and em for electrons)     
     431        // this sigma will be used to determine whether neutral excess is significant. We choose the resolution according to bthe higest deposited fraction (in practice had for charged hadrons and em for electrons)
    450432        sigma = 0.0;
    451433        if(fHCalTrackFractions[number] > 0)
     
    453435        else
    454436          sigma = fECalResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E());
    455          
    456         if(sigma/momentum.E() < track->TrackResolution) 
    457           energyGuess = ecalEnergy + hcalEnergy;     
     437
     438        if(sigma/momentum.E() < track->TrackResolution)
     439          energyGuess = ecalEnergy + hcalEnergy;
    458440        else
    459441          energyGuess = momentum.E();
    460              
     442
    461443        fTrackSigma += (track->TrackResolution)*energyGuess*(track->TrackResolution)*energyGuess;
    462444        fTowerTrackArray->Add(track);
    463      
    464445      }
    465446      else
     
    478459    position = particle->Position;
    479460
     461
    480462    // fill current tower
    481463    ecalEnergy = momentum.E() * fECalTowerFractions[number];
     
    485467    fHCalTowerEnergy += hcalEnergy;
    486468
    487     if(ecalEnergy > fTimingEnergyMin && fTower)
    488     {
    489       if (abs(particle->PID) != 11 || !fElectronsFromTrack)
    490       {
    491         fTower->ECalEnergyTimePairs.push_back(make_pair<Float_t, Float_t>(ecalEnergy, particle->Position.T()));
    492       }
    493     }
     469    // assume combined timing measurements in ECAL/HCAL sections
     470    fTowerTime += (ecalEnergy + hcalEnergy) * position.T(); //sigma_t ~ 1/sqrt(E)
     471    fTowerTimeWeight += ecalEnergy + hcalEnergy;
    494472
    495473    fTower->AddCandidate(particle);
     474    fTower->Position = position;
    496475  }
    497476
     
    506485
    507486  Candidate *track, *tower, *mother;
    508   Double_t energy, pt, eta, phi;
     487  Double_t energy, pt, eta, phi, r, time;
    509488  Double_t ecalEnergy, hcalEnergy;
    510489  Double_t ecalNeutralEnergy, hcalNeutralEnergy, neutralEnergy;
    511  
     490
    512491  Double_t ecalSigma, hcalSigma, sigma;
    513492  Double_t ecalNeutralSigma, hcalNeutralSigma, neutralSigma;
    514493
    515494  Double_t weightTrack, weightCalo, bestEnergyEstimate, rescaleFactor;
    516  
     495
    517496  TLorentzVector momentum;
    518497  TFractionMap::iterator itFractionMap;
     
    522501  if(!fTower) return;
    523502
    524 
    525   //if (fHCalTowerEnergy < 30 && fECalTowerEnergy < 30) return;
    526   //cout<<"----------- New tower ---------"<<endl;
    527 
    528 
    529   // here we change behaviour w.r.t to standard calorimeter. Start with worse case scenario. If fHCalTowerEnergy > 0, assume total energy smeared by HCAL resolution.
    530   // For example, if overlapping charged pions and photons take hadronic resolution as combined measurement
    531 
    532   // if no hadronic fraction at all, then use ECAL resolution
    533 
    534   //cout<<"fECalTowerEnergy: "<<fECalTowerEnergy<<", fHCalTowerEnergy: "<<fHCalTowerEnergy<<", Eta: "<<fTowerEta<<endl;
    535 
    536   // if no hadronic energy, use ECAL resolution
     503  // if no hadronic energy, use ECAL resolution
    537504  if (fHCalTowerEnergy <= fHCalEnergyMin)
    538505  {
    539506    energy = fECalTowerEnergy;
    540507    sigma  = fECalResolutionFormula->Eval(0.0, fTowerEta, 0.0, energy);
    541     //cout<<"em energy"<<energy<<", sigma: "<<sigma<<endl;
    542   }
    543 
    544   // if hadronic fraction > 0, use HCAL resolution
     508  }
     509
     510  // if hadronic fraction > 0, use HCAL resolution
    545511  else
    546512  {
    547513    energy = fECalTowerEnergy + fHCalTowerEnergy;
    548514    sigma  = fHCalResolutionFormula->Eval(0.0, fTowerEta, 0.0, energy);
    549     //cout<<"had energy: "<<energy<<", sigma: "<<sigma<<endl;
    550515  }
    551516
    552517  energy = LogNormal(energy, sigma);
    553   //cout<<energy<<","<<ecalEnergy<<","<<hcalEnergy<<endl;
    554  
     518
    555519  if(energy < fEnergyMin || energy < fEnergySignificanceMin*sigma) energy = 0.0;
    556520
     
    562526  hcalEnergy = LogNormal(fHCalTowerEnergy, hcalSigma);
    563527
     528  time = (fTowerTimeWeight < 1.0E-09) ? 0.0 : fTowerTime / fTowerTimeWeight;
     529
    564530  ecalSigma = fECalResolutionFormula->Eval(0.0, fTowerEta, 0.0, ecalEnergy);
    565531  hcalSigma = fHCalResolutionFormula->Eval(0.0, fTowerEta, 0.0, hcalEnergy);
     
    568534  if(hcalEnergy < fHCalEnergyMin || hcalEnergy < fHCalEnergySignificanceMin*hcalSigma) hcalEnergy = 0.0;
    569535
    570   //cout<<"Measured energy: "<<energy<<endl;
    571 
    572536  if(fSmearTowerCenter)
    573537  {
     
    583547  pt = energy / TMath::CosH(eta);
    584548
    585   // Time calculation for tower
    586   fTower->NTimeHits = 0;
    587   sumWeightedTime = 0.0;
    588   sumWeight = 0.0;
    589 
    590   for(size_t i = 0; i < fTower->ECalEnergyTimePairs.size(); ++i)
    591   {
    592     weight = TMath::Sqrt(fTower->ECalEnergyTimePairs[i].first);
    593     sumWeightedTime += weight * fTower->ECalEnergyTimePairs[i].second;
    594     sumWeight += weight;
    595     fTower->NTimeHits++;
    596   }
    597 
    598   if(sumWeight > 0.0)
    599   {
    600     fTower->Position.SetPtEtaPhiE(1.0, eta, phi, sumWeightedTime/sumWeight);
    601   }
    602   else
    603   {
    604     fTower->Position.SetPtEtaPhiE(1.0, eta, phi, 999999.9);
    605   }
     549  // check whether barrel or endcap tower
     550
     551  // endcap
     552  if (TMath::Abs(fTower->Position.Pt() - fTowerRmax) > 1.e-06 && TMath::Abs(eta) > 0.){
     553    r = fTower->Position.Z()/TMath::SinH(eta);
     554  }
     555  // barrel
     556  else {
     557    r = fTower->Position.Pt();
     558  }
     559
     560  fTower->Position.SetPtEtaPhiE(r, eta, phi, time);
     561  fTower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy);
     562  fTower->L = fTower->Position.Vect().Mag();
    606563
    607564  fTower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy);
    608565  fTower->Eem = ecalEnergy;
    609566  fTower->Ehad = hcalEnergy;
    610 
     567  fTower->Etrk = fTrackEnergy;
    611568  fTower->Edges[0] = fTowerEdges[0];
    612569  fTower->Edges[1] = fTowerEdges[1];
     
    624581
    625582  // fill energy flow candidates
    626  
     583
    627584  fTrackSigma = TMath::Sqrt(fTrackSigma);
    628585  neutralEnergy = max( (energy - fTrackEnergy) , 0.0);
    629586  neutralSigma = neutralEnergy / TMath::Sqrt(fTrackSigma*fTrackSigma + sigma*sigma);
    630587
    631   //cout<<"trackEnergy: "<<fTrackEnergy<<", trackSigma: "<<fTrackSigma<<", Ntracks: "<<fTowerTrackArray->GetEntries()<<endl;
    632 
    633   //cout<<"neutralEnergy: "<<neutralEnergy<<", neutralSigma: "<<neutralSigma<<endl;
    634 
    635    // For now, if neutral excess is significant, simply create neutral EflowPhoton tower and clone each track into eflowtrack !!! -> Creating only photons !! EFlowNeutralHadron collection will be empy!!! TO BE FIXED
    636588  if(neutralEnergy > fEnergyMin && neutralSigma > fEnergySignificanceMin)
    637589  {
    638    
    639     //cout<<"significant neutral excess found:"<<endl;
    640590    // create new photon tower
    641591    tower = static_cast<Candidate*>(fTower->Clone());
    642     pt =  neutralEnergy / TMath::CosH(eta);
    643     //cout<<"Creating tower with Pt, Eta, Phi, Energy: "<<pt<<","<<eta<<","<<phi<<","<<neutralEnergy<<endl;
     592    pt = neutralEnergy / TMath::CosH(eta);
    644593    tower->Momentum.SetPtEtaPhiE(pt, eta, phi, neutralEnergy);
    645     tower->Eem = neutralEnergy;
    646     tower->Ehad = 0.0;
    647     tower->PID = 22;
    648 
    649     fEFlowPhotonOutputArray->Add(tower);
    650 
     594
     595    // if no hadronic energy, use ECAL resolution
     596    if (fHCalTowerEnergy <= fHCalEnergyMin)
     597    {
     598      tower->Eem = neutralEnergy;
     599      tower->Ehad = 0.0;
     600      tower->PID = 22;
     601      fEFlowPhotonOutputArray->Add(tower);
     602    }
     603    // if hadronic fraction > 0, use HCAL resolution
     604    else
     605    {
     606      tower->Eem = 0;
     607      tower->Ehad = neutralEnergy;
     608      tower->PID = 130;
     609      fEFlowNeutralHadronOutputArray->Add(tower);
     610    }
    651611
    652612    //clone tracks
     
    654614    while((track = static_cast<Candidate*>(fItTowerTrackArray->Next())))
    655615    {
    656       //cout<<"looping over tracks"<<endl;
    657616      mother = track;
    658617      track = static_cast<Candidate*>(track->Clone());
     
    662621  }
    663622
    664  
     623
    665624  // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the DualReadoutCalorimeter and tracking
    666625  else if(fTrackEnergy > 0.0)
     
    670629    weightCalo  = (sigma > 0.0) ? 1 / (sigma*sigma) : 0.0;
    671630
    672     bestEnergyEstimate = (weightTrack*fTrackEnergy + weightCalo*energy) / (weightTrack + weightCalo); 
     631    bestEnergyEstimate = (weightTrack*fTrackEnergy + weightCalo*energy) / (weightTrack + weightCalo);
    673632    rescaleFactor = bestEnergyEstimate/fTrackEnergy;
    674633
     
    676635    fItTowerTrackArray->Reset();
    677636    while((track = static_cast<Candidate*>(fItTowerTrackArray->Next())))
    678     { 
     637    {
    679638      mother = track;
    680       track = static_cast<Candidate*>(track->Clone());
     639      track = static_cast<Candidate *>(track->Clone());
    681640      track->AddCandidate(mother);
    682 
    683       track->Momentum *= rescaleFactor;
    684 
     641      track->Momentum.SetPtEtaPhiM(track->Momentum.Pt()*rescaleFactor, track->Momentum.Eta(), track->Momentum.Phi(), track->Momentum.M());
    685642      fEFlowTrackOutputArray->Add(track);
    686643    }
    687644  }
    688  
    689 
    690   /*
    691   // fill energy flow candidates
    692   fECalTrackSigma = TMath::Sqrt(fECalTrackSigma);
    693   fHCalTrackSigma = TMath::Sqrt(fHCalTrackSigma);
    694 
    695   //compute neutral excesses
    696   ecalNeutralEnergy = max( (ecalEnergy - fECalTrackEnergy) , 0.0);
    697   hcalNeutralEnergy = max( (hcalEnergy - fHCalTrackEnergy) , 0.0);
    698  
    699   ecalNeutralSigma = ecalNeutralEnergy / TMath::Sqrt(fECalTrackSigma*fECalTrackSigma + ecalSigma*ecalSigma);
    700   hcalNeutralSigma = hcalNeutralEnergy / TMath::Sqrt(fHCalTrackSigma*fHCalTrackSigma + hcalSigma*hcalSigma);
    701  
    702    // if ecal neutral excess is significant, simply create neutral EflowPhoton tower and clone each track into eflowtrack
    703   if(ecalNeutralEnergy > fECalEnergyMin && ecalNeutralSigma > fECalEnergySignificanceMin)
    704   {
    705     // create new photon tower
    706     tower = static_cast<Candidate*>(fTower->Clone());
    707     pt =  ecalNeutralEnergy / TMath::CosH(eta);
    708    
    709     tower->Momentum.SetPtEtaPhiE(pt, eta, phi, ecalNeutralEnergy);
    710     tower->Eem = ecalNeutralEnergy;
    711     tower->Ehad = 0.0;
    712     tower->PID = 22;
    713    
    714     fEFlowPhotonOutputArray->Add(tower);
    715    
    716     //clone tracks
    717     fItECalTowerTrackArray->Reset();
    718     while((track = static_cast<Candidate*>(fItECalTowerTrackArray->Next())))
    719     {
    720       mother = track;
    721       track = static_cast<Candidate*>(track->Clone());
    722       track->AddCandidate(mother);
    723 
    724       fEFlowTrackOutputArray->Add(track);
    725     }
    726  
    727   }
    728  
    729   // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the DualReadoutCalorimeter and tracking
    730   else if(fECalTrackEnergy > 0.0)
    731   {
    732     weightTrack = (fECalTrackSigma > 0.0) ? 1 / (fECalTrackSigma*fECalTrackSigma) : 0.0;
    733     weightCalo  = (ecalSigma > 0.0) ? 1 / (ecalSigma*ecalSigma) : 0.0;
    734  
    735     bestEnergyEstimate = (weightTrack*fECalTrackEnergy + weightCalo*ecalEnergy) / (weightTrack + weightCalo);
    736     rescaleFactor = bestEnergyEstimate/fECalTrackEnergy;
    737 
    738     //rescale tracks
    739     fItECalTowerTrackArray->Reset();
    740     while((track = static_cast<Candidate*>(fItECalTowerTrackArray->Next())))
    741     { 
    742       mother = track;
    743       track = static_cast<Candidate*>(track->Clone());
    744       track->AddCandidate(mother);
    745 
    746       track->Momentum *= rescaleFactor;
    747 
    748       fEFlowTrackOutputArray->Add(track);
    749     }
    750   }
    751 
    752 
    753   // if hcal neutral excess is significant, simply create neutral EflowNeutralHadron tower and clone each track into eflowtrack
    754   if(hcalNeutralEnergy > fHCalEnergyMin && hcalNeutralSigma > fHCalEnergySignificanceMin)
    755   {
    756     // create new photon tower
    757     tower = static_cast<Candidate*>(fTower->Clone());
    758     pt =  hcalNeutralEnergy / TMath::CosH(eta);
    759    
    760     tower->Momentum.SetPtEtaPhiE(pt, eta, phi, hcalNeutralEnergy);
    761     tower->Ehad = hcalNeutralEnergy;
    762     tower->Eem = 0.0;
    763    
    764     fEFlowNeutralHadronOutputArray->Add(tower);
    765    
    766     //clone tracks
    767     fItHCalTowerTrackArray->Reset();
    768     while((track = static_cast<Candidate*>(fItHCalTowerTrackArray->Next())))
    769     {
    770       mother = track;
    771       track = static_cast<Candidate*>(track->Clone());
    772       track->AddCandidate(mother);
    773 
    774       fEFlowTrackOutputArray->Add(track);
    775     }
    776  
    777   }
    778  
    779   // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the DualReadoutCalorimeter and tracking
    780   else if(fHCalTrackEnergy > 0.0)
    781   {
    782     weightTrack = (fHCalTrackSigma > 0.0) ? 1 / (fHCalTrackSigma*fHCalTrackSigma) : 0.0;
    783     weightCalo  = (hcalSigma > 0.0) ? 1 / (hcalSigma*hcalSigma) : 0.0;
    784  
    785     bestEnergyEstimate = (weightTrack*fHCalTrackEnergy + weightCalo*hcalEnergy) / (weightTrack + weightCalo);
    786     rescaleFactor = bestEnergyEstimate / fHCalTrackEnergy;
    787 
    788     //rescale tracks
    789     fItHCalTowerTrackArray->Reset();
    790     while((track = static_cast<Candidate*>(fItHCalTowerTrackArray->Next())))
    791     { 
    792       mother = track;
    793       track = static_cast<Candidate*>(track->Clone());
    794       track->AddCandidate(mother);
    795 
    796       track->Momentum *= rescaleFactor;
    797 
    798       fEFlowTrackOutputArray->Add(track);
    799     }
    800   }
    801 
    802   */
     645
     646
    803647}
    804648
  • modules/DualReadoutCalorimeter.h

    ra5af1df rd612dec  
    6060  Double_t fECalTrackEnergy, fHCalTrackEnergy;
    6161  Double_t fTrackEnergy;
     62  Double_t fTowerRmax;
    6263
    6364  Double_t fTimingEnergyMin;
     
    7778  Double_t fHCalTrackSigma;
    7879  Double_t fTrackSigma;
     80
     81  Double_t fTowerTime;
     82  Double_t fTowerTimeWeight;
    7983
    8084  Bool_t fSmearTowerCenter;
  • modules/Efficiency.cc

    ra5af1df rd612dec  
    7878  fItInputArray = fInputArray->MakeIterator();
    7979
     80  // switch to compute efficiency based on momentum vector eta, phi
     81  fUseMomentumVector = GetBool("UseMomentumVector", false);
     82
    8083  // create output array
    8184
     
    9598{
    9699  Candidate *candidate;
    97   Double_t pt, eta, phi, e, d0, dz, ctgTheta;
     100  Double_t pt, eta, phi, e;
     101
    98102
    99103  fItInputArray->Reset();
     
    104108    eta = candidatePosition.Eta();
    105109    phi = candidatePosition.Phi();
     110
     111    if (fUseMomentumVector){
     112      eta = candidateMomentum.Eta();
     113      phi = candidateMomentum.Phi();
     114    }
     115
    106116    pt = candidateMomentum.Pt();
    107117    e = candidateMomentum.E();
    108     d0 = candidate->D0;
    109     dz = candidate->DZ;
    110     ctgTheta = candidate->CtgTheta;
    111118
    112119    // apply an efficency formula
    113     if(gRandom->Uniform() > fFormula->Eval(pt, eta, phi, e, d0, dz, ctgTheta)) continue;
     120    if(gRandom->Uniform() > fFormula->Eval(pt, eta, phi, e, candidate)) continue;
    114121
    115122    fOutputArray->Add(candidate);
  • modules/Efficiency.h

    ra5af1df rd612dec  
    5353  TObjArray *fOutputArray; //!
    5454
     55  Double_t fUseMomentumVector; //!
     56
    5557  ClassDef(Efficiency, 1)
    5658};
  • modules/EnergySmearing.cc

    ra5af1df rd612dec  
    9595{
    9696  Candidate *candidate, *mother;
    97   Double_t pt, energy, eta, phi;
     97  Double_t pt, energy, eta, phi, m;
    9898
    9999  fItInputArray->Reset();
     
    107107    phi = candidatePosition.Phi();
    108108    energy = candidateMomentum.E();
     109    m = candidateMomentum.M();
    109110
    110111    // apply smearing formula
     
    117118    eta = candidateMomentum.Eta();
    118119    phi = candidateMomentum.Phi();
    119     candidate->Momentum.SetPtEtaPhiE(energy / TMath::CosH(eta), eta, phi, energy);
     120    pt = (energy > m) ? TMath::Sqrt(energy*energy - m*m)/TMath::CosH(eta) : 0;
     121    candidate->Momentum.SetPtEtaPhiE(pt, eta, phi, energy);
    120122    candidate->TrackResolution = fFormula->Eval(pt, eta, phi, energy) / candidateMomentum.E();
    121123    candidate->AddCandidate(mother);
  • modules/FastJetFinder.cc

    ra5af1df rd612dec  
    104104  fJetAlgorithm = GetInt("JetAlgorithm", 6);
    105105  fParameterR = GetDouble("ParameterR", 0.5);
     106  fParameterP = GetDouble("ParameterP", -1.0);
    106107
    107108  fConeRadius = GetDouble("ConeRadius", 0.5);
     
    247248    fDefinition = new JetDefinition(fValenciaPlugin);
    248249    break;
     250  case 10:
     251    fDefinition = new JetDefinition(ee_genkt_algorithm,fParameterR,fParameterP);
     252    break;
     253
    249254  }
    250255
     
    316321  Double_t deta, dphi, detaMax, dphiMax;
    317322  Double_t time, timeWeight;
     323  Double_t neutralEnergyFraction, chargedEnergyFraction;
     324
    318325  Int_t number, ncharged, nneutrals;
    319326  Int_t charge;
     
    418425    nneutrals = 0;
    419426
     427    neutralEnergyFraction =0.;
     428    chargedEnergyFraction =0.;
     429
    420430    inputList.clear();
    421431    inputList = sequence->constituents(*itOutputList);
     
    432442
    433443      if(constituent->Charge == 0)
     444      {
    434445        nneutrals++;
     446        neutralEnergyFraction += constituent->Momentum.E();
     447      }
    435448      else
     449      {
    436450        ncharged++;
    437 
     451        chargedEnergyFraction += constituent->Momentum.E();
     452      }
     453     
    438454      time += TMath::Sqrt(constituent->Momentum.E()) * (constituent->Position.T());
    439455      timeWeight += TMath::Sqrt(constituent->Momentum.E());
     
    455471    candidate->NCharged = ncharged;
    456472
     473    candidate->NeutralEnergyFraction = (momentum.E() > 0 ) ? neutralEnergyFraction/momentum.E() : 0.0;
     474    candidate->ChargedEnergyFraction = (momentum.E() > 0 ) ? chargedEnergyFraction/momentum.E() : 0.0;
     475
    457476    //for exclusive clustering, access y_n,n+1 as exclusive_ymerge (fNJets);
    458477    candidate->ExclYmerge23 = excl_ymerge23;
     
    470489      fastjet::Filter trimmer(fastjet::JetDefinition(fastjet::kt_algorithm, fRTrim), fastjet::SelectorPtFractionMin(fPtFracTrim));
    471490      fastjet::PseudoJet trimmed_jet = trimmer(*itOutputList);
    472 
    473       trimmed_jet = join(trimmed_jet.constituents());
    474 
     491     
    475492      candidate->TrimmedP4[0].SetPtEtaPhiM(trimmed_jet.pt(), trimmed_jet.eta(), trimmed_jet.phi(), trimmed_jet.m());
    476493
  • modules/FastJetFinder.h

    ra5af1df rd612dec  
    7272  Int_t fJetAlgorithm;
    7373  Double_t fParameterR;
     74  Double_t fParameterP;
    7475
    7576  Double_t fJetPTMin;
  • modules/IdentificationMap.cc

    ra5af1df rd612dec  
    170170      {
    171171        // change PID of particle
     172        candidate = static_cast<Candidate *>(candidate->Clone());
    172173        if(pdgCodeOut != 0) candidate->PID = charge * pdgCodeOut;
    173174        fOutputArray->Add(candidate);
  • modules/JetFakeParticle.cc

    ra5af1df rd612dec  
    146146  while((candidate = static_cast<Candidate *>(fItInputArray->Next())))
    147147  {
    148     const TLorentzVector &candidatePosition = candidate->Position;
    149148    const TLorentzVector &candidateMomentum = candidate->Momentum;
    150     eta = candidatePosition.Eta();
    151     phi = candidatePosition.Phi();
     149    eta = candidateMomentum.Eta();
     150    phi = candidateMomentum.Phi();
    152151    pt = candidateMomentum.Pt();
    153152    e = candidateMomentum.E();
  • modules/ModulesLinkDef.h

    ra5af1df rd612dec  
    3636#include "modules/MomentumSmearing.h"
    3737#include "modules/TrackSmearing.h"
     38#include "modules/TrackCovariance.h"
     39#include "modules/ClusterCounting.h"
    3840#include "modules/ImpactParameterSmearing.h"
    3941#include "modules/TimeSmearing.h"
     42#include "modules/TimeOfFlight.h"
    4043#include "modules/SimpleCalorimeter.h"
    4144#include "modules/DenseTrackFilter.h"
     
    7275#include "modules/VertexFinder.h"
    7376#include "modules/VertexFinderDA4D.h"
     77#include "modules/DecayFilter.h"
     78#include "modules/ParticleDensity.h"
     79#include "modules/TruthVertexFinder.h"
    7480#include "modules/ExampleModule.h"
    7581#include "modules/LLPFilter.h"
     
    9399#pragma link C++ class MomentumSmearing+;
    94100#pragma link C++ class TrackSmearing+;
     101#pragma link C++ class TrackCovariance+;
     102#pragma link C++ class ClusterCounting+;
    95103#pragma link C++ class ImpactParameterSmearing+;
    96104#pragma link C++ class TimeSmearing+;
     105#pragma link C++ class TimeOfFlight+;
    97106#pragma link C++ class SimpleCalorimeter+;
    98107#pragma link C++ class DenseTrackFilter+;
     
    129138#pragma link C++ class VertexFinder+;
    130139#pragma link C++ class VertexFinderDA4D+;
     140#pragma link C++ class DecayFilter+;
     141#pragma link C++ class ParticleDensity+;
     142#pragma link C++ class TruthVertexFinder+;
    131143#pragma link C++ class ExampleModule+;
    132144#pragma link C++ class LLPFilter+;
  • modules/MomentumSmearing.cc

    ra5af1df rd612dec  
    7878  fItInputArray = fInputArray->MakeIterator();
    7979
     80  // switch to compute momentum smearing based on momentum vector eta, phi
     81  fUseMomentumVector = GetBool("UseMomentumVector", false);
     82
    8083  // create output array
    8184
     
    9598{
    9699  Candidate *candidate, *mother;
    97   Double_t pt, eta, phi, e, res;
     100  Double_t pt, eta, phi, e, m, res;
    98101
    99102  fItInputArray->Reset();
     
    104107    eta = candidatePosition.Eta();
    105108    phi = candidatePosition.Phi();
     109
     110    if (fUseMomentumVector){
     111      eta = candidateMomentum.Eta();
     112      phi = candidateMomentum.Phi();
     113    }
     114
    106115    pt = candidateMomentum.Pt();
    107116    e = candidateMomentum.E();
    108     res = fFormula->Eval(pt, eta, phi, e);
     117    m = candidateMomentum.M();
     118    res = fFormula->Eval(pt, eta, phi, e, candidate);
    109119
    110120    // apply smearing formula
     
    121131    eta = candidateMomentum.Eta();
    122132    phi = candidateMomentum.Phi();
    123     candidate->Momentum.SetPtEtaPhiE(pt, eta, phi, pt * TMath::CosH(eta));
     133    candidate->Momentum.SetPtEtaPhiM(pt, eta, phi, m);
    124134    //candidate->TrackResolution = fFormula->Eval(pt, eta, phi, e);
    125135    candidate->TrackResolution = res;
  • modules/MomentumSmearing.h

    ra5af1df rd612dec  
    5555  TObjArray *fOutputArray; //!
    5656
     57  Double_t fUseMomentumVector; //!
     58
    5759  ClassDef(MomentumSmearing, 1)
    5860};
  • modules/ParticlePropagator.cc

    ra5af1df rd612dec  
    125125  TLorentzVector particlePosition, particleMomentum, beamSpotPosition;
    126126  Double_t px, py, pz, pt, pt2, e, q;
    127   Double_t x, y, z, t, r, phi;
    128   Double_t x_c, y_c, r_c, phi_c, phi_0;
    129   Double_t x_t, y_t, z_t, r_t;
    130   Double_t t1, t2, t3, t4, t5, t6;
    131   Double_t t_z, t_r, t_ra, t_rb;
    132   Double_t tmp, discr, discr2;
    133   Double_t delta, gammam, omega, asinrho;
    134   Double_t rcu, rc2, xd, yd, zd;
    135   Double_t l, d0, dz, p, ctgTheta, phip, etap, alpha;
     127  Double_t x, y, z, t, r;
     128  Double_t x_c, y_c, r_c, phi_0;
     129  Double_t x_t, y_t, z_t, r_t, phi_t;
     130  Double_t t_r, t_z;
     131  Double_t tmp;
     132  Double_t gammam, omega;
     133  Double_t xd, yd, zd;
     134  Double_t l, d0, dz, ctgTheta, alpha;
    136135  Double_t bsx, bsy, bsz;
     136  Double_t td, pio, phid, vz;
    137137
    138138  const Double_t c_light = 2.99792458E8;
    139139
    140140  if(!fBeamSpotInputArray || fBeamSpotInputArray->GetSize() == 0)
     141  {
    141142    beamSpotPosition.SetXYZT(0.0, 0.0, 0.0, 0.0);
     143  }
    142144  else
    143145  {
     
    160162    particlePosition = particle->Position;
    161163    particleMomentum = particle->Momentum;
     164
    162165    x = particlePosition.X() * 1.0E-3;
    163166    y = particlePosition.Y() * 1.0E-3;
     
    206209      // solve pt2*t^2 + 2*(px*x + py*y)*t - (fRadius2 - x*x - y*y) = 0
    207210      tmp = px * y - py * x;
    208       discr2 = pt2 * fRadius2 - tmp * tmp;
    209 
    210       if(discr2 < 0.0)
    211       {
    212         // no solutions
    213         continue;
    214       }
    215 
    216       tmp = px * x + py * y;
    217       discr = TMath::Sqrt(discr2);
    218       t1 = (-tmp + discr) / pt2;
    219       t2 = (-tmp - discr) / pt2;
    220       t = (t1 < 0.0) ? t2 : t1;
    221 
    222       z_t = z + pz * t;
    223       if(TMath::Abs(z_t) > fHalfLength)
    224       {
    225         t3 = (+fHalfLength - z) / pz;
    226         t4 = (-fHalfLength - z) / pz;
    227         t = (t3 < 0.0) ? t4 : t3;
    228       }
     211      t_r = (TMath::Sqrt(pt2 * fRadius2 - tmp * tmp) - px * x - py * y) / pt2;
     212
     213      t_z = (TMath::Sign(fHalfLength, pz) - z) / pz;
     214
     215      t = TMath::Min(t_r, t_z);
    229216
    230217      x_t = x + px * t;
     
    245232
    246233      fOutputArray->Add(candidate);
     234
    247235      if(TMath::Abs(q) > 1.0E-9)
    248236      {
     
    267255    {
    268256
    269       // 1.  initial transverse momentum p_{T0}: Part->pt
    270       //     initial transverse momentum direction phi_0 = -atan(p_X0/p_Y0)
    271       //     relativistic gamma: gamma = E/mc^2; gammam = gamma * m
    272       //     gyration frequency omega = q/(gamma m) fBz
    273       //     helix radius r = p_{T0} / (omega gamma m)
     257      // 1. initial transverse momentum p_{T0}: Part->pt
     258      //    initial transverse momentum direction phi_0 = -atan(p_{X0} / p_{Y0})
     259      //    relativistic gamma: gamma = E / mc^2; gammam = gamma * m
     260      //    gyration frequency omega = q * Bz / (gammam)
     261      //    helix radius r = p_{T0} / (omega * gammam)
    274262
    275263      gammam = e * 1.0E9 / (c_light * c_light); // gammam in [eV/c^2]
    276       omega = q * fBz / (gammam); // omega is here in [89875518/s]
     264      omega = q * fBz / gammam; // omega is here in [89875518/s]
    277265      r = pt / (q * fBz) * 1.0E9 / c_light; // in [m]
    278266
     
    283271      y_c = y - r * TMath::Cos(phi_0);
    284272      r_c = TMath::Hypot(x_c, y_c);
    285       phi_c = TMath::ATan2(y_c, x_c);
    286       phi = phi_c;
    287       if(x_c < 0.0) phi += TMath::Pi();
    288 
    289       rcu = TMath::Abs(r);
    290       rc2 = r_c * r_c;
    291 
    292       // calculate coordinates of closest approach to track circle in transverse plane xd, yd, zd
    293       xd = x_c * x_c * x_c - x_c * rcu * r_c + x_c * y_c * y_c;
    294       xd = (rc2 > 0.0) ? xd / rc2 : -999;
    295       yd = y_c * (-rcu * r_c + rc2);
    296       yd = (rc2 > 0.0) ? yd / rc2 : -999;
    297       zd = z + (TMath::Sqrt(xd * xd + yd * yd) - TMath::Sqrt(x * x + y * y)) * pz / pt;
    298 
    299       // use perigee momentum rather than original particle
    300       // momentum, since the orignal particle momentum isn't known
    301 
    302       px = TMath::Sign(1.0, r) * pt * (-y_c / r_c);
    303       py = TMath::Sign(1.0, r) * pt * (x_c / r_c);
    304       etap = particleMomentum.Eta();
    305       phip = TMath::ATan2(py, px);
    306 
    307       particleMomentum.SetPtEtaPhiE(pt, etap, phip, particleMomentum.E());
     273
     274      // time of closest approach
     275      td = (phi_0 + TMath::ATan2(x_c, y_c)) / omega;
     276
     277      // remove all the modulo pi that might have come from the atan
     278      pio = TMath::Abs(TMath::Pi() / omega);
     279      while(TMath::Abs(td) > 0.5 * pio)
     280      {
     281        td -= TMath::Sign(1.0, td) * pio;
     282      }
     283
     284      vz = pz * c_light / e;
     285
     286      // calculate coordinates of closest approach to z axis
     287      phid = phi_0 - omega * td;
     288      xd = x_c - r * TMath::Sin(phid);
     289      yd = y_c + r * TMath::Cos(phid);
     290      zd = z + vz * td;
     291
     292      // momentum at closest approach
     293      px = pt * TMath::Cos(phid);
     294      py = pt * TMath::Sin(phid);
     295
     296      particleMomentum.SetPtEtaPhiE(pt, particleMomentum.Eta(), phid, particleMomentum.E());
    308297
    309298      // calculate additional track parameters (correct for beamspot position)
    310 
    311       d0 = ((x - bsx) * py - (y - bsy) * px) / pt;
    312       dz = z - ((x - bsx) * px + (y - bsy) * py) / pt * (pz / pt);
    313       p = particleMomentum.P();
     299      d0 = ((xd - bsx) * py - (yd - bsy) * px) / pt;
     300      dz = zd - bsz;
    314301      ctgTheta = 1.0 / TMath::Tan(particleMomentum.Theta());
    315302
     
    317304      //    t_r : time to exit from the sides
    318305      //    t_z : time to exit from the front or the back
    319       t_r = 0.0; // in [ns]
    320       int sign_pz = (pz > 0.0) ? 1 : -1;
    321       if(pz == 0.0)
    322         t_z = 1.0E99;
    323       else
    324         t_z = gammam / (pz * 1.0E9 / c_light) * (-z + fHalfLength * sign_pz);
     306      t_z = (vz == 0.0) ? 1.0E99 : (TMath::Sign(fHalfLength, pz) - z) / vz;
    325307
    326308      if(r_c + TMath::Abs(r) < fRadius)
     
    331313      else
    332314      {
    333         asinrho = TMath::ASin((fRadius * fRadius - r_c * r_c - r * r) / (2 * TMath::Abs(r) * r_c));
    334         delta = phi_0 - phi;
    335         if(delta < -TMath::Pi()) delta += 2 * TMath::Pi();
    336         if(delta > TMath::Pi()) delta -= 2 * TMath::Pi();
    337         t1 = (delta + asinrho) / omega;
    338         t2 = (delta + TMath::Pi() - asinrho) / omega;
    339         t3 = (delta + TMath::Pi() + asinrho) / omega;
    340         t4 = (delta - asinrho) / omega;
    341         t5 = (delta - TMath::Pi() - asinrho) / omega;
    342         t6 = (delta - TMath::Pi() + asinrho) / omega;
    343 
    344         if(t1 < 0.0) t1 = 1.0E99;
    345         if(t2 < 0.0) t2 = 1.0E99;
    346         if(t3 < 0.0) t3 = 1.0E99;
    347         if(t4 < 0.0) t4 = 1.0E99;
    348         if(t5 < 0.0) t5 = 1.0E99;
    349         if(t6 < 0.0) t6 = 1.0E99;
    350 
    351         t_ra = TMath::Min(t1, TMath::Min(t2, t3));
    352         t_rb = TMath::Min(t4, TMath::Min(t5, t6));
    353         t_r = TMath::Min(t_ra, t_rb);
     315        alpha = TMath::ACos((r * r + r_c * r_c - fRadius * fRadius) / (2 * TMath::Abs(r) * r_c));
     316        t_r = td + TMath::Abs(alpha / omega);
     317
    354318        t = TMath::Min(t_r, t_z);
    355319      }
    356320
    357321      // 4. position in terms of x(t), y(t), z(t)
    358       x_t = x_c + r * TMath::Sin(omega * t - phi_0);
    359       y_t = y_c + r * TMath::Cos(omega * t - phi_0);
    360       z_t = z + pz * 1.0E9 / c_light / gammam * t;
     322      phi_t = phi_0 - omega * t;
     323      x_t = x_c - r * TMath::Sin(phi_t);
     324      y_t = y_c + r * TMath::Cos(phi_t);
     325      z_t = z + vz * t;
    361326      r_t = TMath::Hypot(x_t, y_t);
    362327
    363       // compute path length for an helix
    364 
    365       alpha = pz * 1.0E9 / c_light / gammam;
    366       l = t * TMath::Sqrt(alpha * alpha + r * r * omega * omega);
     328      // lenght of the path from production to tracker
     329      l = t * TMath::Hypot(vz, r * omega);
    367330
    368331      if(r_t > 0.0)
    369332      {
    370 
    371333        // store these variables before cloning
    372334        if(particle == candidate)
     
    374336          particle->D0 = d0 * 1.0E3;
    375337          particle->DZ = dz * 1.0E3;
    376           particle->P = p;
     338          particle->P = particleMomentum.P();
    377339          particle->PT = pt;
    378340          particle->CtgTheta = ctgTheta;
    379           particle->Phi = phip;
     341          particle->Phi = particleMomentum.Phi();
    380342        }
    381343
  • modules/SimpleCalorimeter.cc

    ra5af1df rd612dec  
    208208  fItParticleInputArray->Reset();
    209209  number = -1;
     210  fTowerRmax=0.;
    210211  while((particle = static_cast<Candidate *>(fItParticleInputArray->Next())))
    211212  {
    212213    const TLorentzVector &particlePosition = particle->Position;
    213214    ++number;
     215
     216    // compute maximum radius (needed in FinalizeTower to assess whether barrel or endcap tower)
     217    if (particlePosition.Perp() > fTowerRmax)
     218      fTowerRmax=particlePosition.Perp();
    214219
    215220    pdgCode = TMath::Abs(particle->PID);
     
    394399    fTowerEnergy += energy;
    395400
    396     fTowerTime += energy * position.T();
    397     fTowerTimeWeight += energy;
     401    fTowerTime += energy * energy * position.T(); //sigma_t ~ 1/E
     402    fTowerTimeWeight += energy * energy;
    398403
    399404    fTower->AddCandidate(particle);
     405    fTower->Position = position;
     406
    400407  }
    401408
     
    409416{
    410417  Candidate *tower, *track, *mother;
    411   Double_t energy, neutralEnergy, pt, eta, phi;
     418  Double_t energy, neutralEnergy, pt, eta, phi, r;
    412419  Double_t sigma, neutralSigma;
    413420  Double_t time;
     
    443450  pt = energy / TMath::CosH(eta);
    444451
    445   fTower->Position.SetPtEtaPhiE(1.0, eta, phi, time);
     452  // endcap
     453  if (TMath::Abs(fTower->Position.Pt() - fTowerRmax) > 1.e-06 && TMath::Abs(eta) > 0.){
     454    r = fTower->Position.Z()/TMath::SinH(eta);
     455  }
     456  // barrel
     457  else {
     458    r = fTower->Position.Pt();
     459  }
     460
     461  fTower->Position.SetPtEtaPhiE(r, eta, phi, time);
    446462  fTower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy);
     463  fTower->L = fTower->Position.Vect().Mag();
    447464
    448465  fTower->Eem = (!fIsEcal) ? 0 : energy;
    449466  fTower->Ehad = (fIsEcal) ? 0 : energy;
     467  fTower->Etrk = fTrackEnergy;
    450468
    451469  fTower->Edges[0] = fTowerEdges[0];
     
    507525      track = static_cast<Candidate *>(track->Clone());
    508526      track->AddCandidate(mother);
    509 
    510       track->Momentum *= rescaleFactor;
    511 
     527      track->Momentum.SetPtEtaPhiM(track->Momentum.Pt()*rescaleFactor, track->Momentum.Eta(), track->Momentum.Phi(), track->Momentum.M());
    512528      fEFlowTrackOutputArray->Add(track);
    513529    }
  • modules/SimpleCalorimeter.h

    ra5af1df rd612dec  
    6262  Double_t fTrackTime;
    6363
     64  Double_t fTowerRmax;
     65
    6466  Double_t fTowerTimeWeight;
    6567  Double_t fTrackTimeWeight;
  • modules/TauTagging.cc

    ra5af1df rd612dec  
    8383    daughter1 = static_cast<Candidate *>(fParticleInputArray->At(i));
    8484    pdgCode = TMath::Abs(daughter1->PID);
    85     if(pdgCode == 11 || pdgCode == 13 || pdgCode == 15)
    86       return -1;
    87     else if(pdgCode == 24)
     85    //if(pdgCode == 11 || pdgCode == 13 || pdgCode == 15)
     86    //  return -1;
     87    if(pdgCode == 24)
    8888    {
    8989      if(daughter1->D1 < 0) return -1;
     
    9696    }
    9797  }
    98 
    9998  return 0;
    10099}
     
    190189void TauTagging::Process()
    191190{
    192   Candidate *jet, *tau, *daughter;
     191  Candidate *jet, *tau, *daughter, *part;
    193192  TLorentzVector tauMomentum;
    194193  Double_t pt, eta, phi, e, eff;
     
    204203  // loop over all input jets
    205204  fItJetInputArray->Reset();
     205
    206206  while((jet = static_cast<Candidate *>(fItJetInputArray->Next())))
    207207  {
     208
    208209    const TLorentzVector &jetMomentum = jet->Momentum;
    209210    pdgCode = 0;
     
    243244      }
    244245    }
     246   
     247    // fake electrons and muons
     248   
     249    if (pdgCode == 0)
     250    {
     251     
     252      Double_t drMin = fDeltaR;   
     253      fItPartonInputArray->Reset();
     254      while((part = static_cast<Candidate *>(fItPartonInputArray->Next())))
     255      {
     256        if(TMath::Abs(part->PID) == 11 || TMath::Abs(part->PID) == 13)
     257        {
     258            tauMomentum = part->Momentum;
     259            if (tauMomentum.Pt() < fClassifier->fPTMin) continue;
     260            if (TMath::Abs(tauMomentum.Eta()) > fClassifier->fEtaMax) continue;
     261
     262            Double_t dr = jetMomentum.DeltaR(tauMomentum);
     263            if( dr < drMin)
     264            {
     265               drMin = dr;
     266               pdgCode = TMath::Abs(part->PID);
     267               charge = part->Charge;
     268            } 
     269        }
     270      }
     271    }
     272
    245273    // find an efficency formula
    246274    itEfficiencyMap = fEfficiencyMap.find(pdgCode);
  • modules/TimeSmearing.cc

    ra5af1df rd612dec  
    1919/** \class TimeSmearing
    2020 *
    21  *  Performs transverse momentum resolution smearing.
     21 *  Performs time smearing.
    2222 *
    23  *  \author P. Demin - UCL, Louvain-la-Neuve
     23 *  \author M. Selvaggi - CERN
    2424 *
    2525 */
     
    4949
    5050using namespace std;
    51 
    5251//------------------------------------------------------------------------------
    5352
    5453TimeSmearing::TimeSmearing() :
    55   fItInputArray(0)
     54  fItInputArray(0), fResolutionFormula(0)
    5655{
     56        fResolutionFormula = new DelphesFormula;
    5757}
    5858
     
    6161TimeSmearing::~TimeSmearing()
    6262{
     63        if(fResolutionFormula) delete fResolutionFormula;
    6364}
    6465
     
    6970  // read resolution formula
    7071
    71   fTimeResolution = GetDouble("TimeResolution", 1.0E-10);
    72   // import input array
     72  // read time resolution formula in seconds
     73  fResolutionFormula->Compile(GetString("TimeResolution", "30e-12"));
    7374
     75  // import track input array
    7476  fInputArray = ImportArray(GetString("InputArray", "MuonMomentumSmearing/muons"));
    7577  fItInputArray = fInputArray->MakeIterator();
    7678
     79
    7780  // create output array
    78 
    79   fOutputArray = ExportArray(GetString("OutputArray", "muons"));
     81  fOutputArray = ExportArray(GetString("OutputArray", "tracks"));
    8082}
    8183
     
    9294{
    9395  Candidate *candidate, *mother;
    94   Double_t ti, tf_smeared, tf;
     96  Double_t tf_smeared, tf;
     97  Double_t eta, energy;
     98  Double_t timeResolution;
     99
    95100  const Double_t c_light = 2.99792458E8;
    96101
     
    98103  while((candidate = static_cast<Candidate *>(fItInputArray->Next())))
    99104  {
    100     const TLorentzVector &candidateInitialPosition = candidate->InitialPosition;
     105
    101106    const TLorentzVector &candidateFinalPosition = candidate->Position;
     107    const TLorentzVector &candidateMomentum = candidate->Momentum;
    102108
    103     ti = candidateInitialPosition.T() * 1.0E-3 / c_light;
    104109    tf = candidateFinalPosition.T() * 1.0E-3 / c_light;
    105110
     111    eta = candidateMomentum.Eta();
     112    energy = candidateMomentum.E();
     113
    106114    // apply smearing formula
    107     tf_smeared = gRandom->Gaus(tf, fTimeResolution);
    108     ti = ti + tf_smeared - tf;
    109     tf = tf_smeared;
     115    timeResolution = fResolutionFormula->Eval(0.0, eta, 0.0, energy);
     116    tf_smeared = gRandom->Gaus(tf, timeResolution);
    110117
    111118    mother = candidate;
    112119    candidate = static_cast<Candidate *>(candidate->Clone());
    113     candidate->InitialPosition.SetT(ti * 1.0E3 * c_light);
    114     candidate->Position.SetT(tf * 1.0E3 * c_light);
    115120
    116     candidate->ErrorT = fTimeResolution * 1.0E3 * c_light;
     121    candidate->Position.SetT(tf_smeared * 1.0E3 * c_light);
     122    candidate->ErrorT = timeResolution * 1.0E3 * c_light;
    117123
    118124    candidate->AddCandidate(mother);
    119 
    120125    fOutputArray->Add(candidate);
    121126  }
    122127}
    123 
    124 //------------------------------------------------------------------------------
  • modules/TimeSmearing.h

    ra5af1df rd612dec  
    2222/** \class TimeSmearing
    2323 *
    24  *  Performs transverse time smearing.
     24 *  Performs time smearing.
    2525 *
    26  *  \author Michele Selvaggi - UCL, Louvain-la-Neuve
     26 *  \author Michele Selvaggi - CERN
    2727 *
    2828 */
     
    3232class TIterator;
    3333class TObjArray;
     34class DelphesFormula;
    3435
    3536class TimeSmearing: public DelphesModule
     
    4445
    4546private:
    46   Double_t fTimeResolution;
     47
     48  DelphesFormula *fResolutionFormula;
     49  Int_t fVertexTimeMode;
    4750
    4851  TIterator *fItInputArray; //!
  • modules/TrackSmearing.cc

    ra5af1df rd612dec  
    158158  TLorentzVector beamSpotPosition;
    159159  Candidate *candidate, *mother;
    160   Double_t pt, eta, d0, d0Error, trueD0, dz, dzError, trueDZ, p, pError, trueP, ctgTheta, ctgThetaError, trueCtgTheta, phi, phiError, truePhi;
     160  Double_t pt, eta, e, m, d0, d0Error, trueD0, dz, dzError, trueDZ, p, pError, trueP, ctgTheta, ctgThetaError, trueCtgTheta, phi, phiError, truePhi;
    161161  Double_t x, y, z, t, px, py, pz, theta;
    162162  Double_t q, r;
     
    223223    pt = momentum.Pt();
    224224    eta = momentum.Eta();
     225    e = momentum.E();
     226    m = momentum.M();
    225227
    226228    d0 = trueD0 = candidate->D0;
     
    232234
    233235    if(fUseD0Formula)
    234       d0Error = fD0Formula->Eval(pt, eta);
     236      d0Error = fD0Formula->Eval(pt, eta, phi, e, candidate);
    235237    else
    236238    {
     
    247249
    248250    if(fUseDZFormula)
    249       dzError = fDZFormula->Eval(pt, eta);
     251      dzError = fDZFormula->Eval(pt, eta, phi, e, candidate);
    250252    else
    251253    {
     
    262264
    263265    if(fUsePFormula)
    264       pError = fPFormula->Eval(pt, eta) * p;
     266      pError = fPFormula->Eval(pt, eta, phi, e, candidate) * p;
    265267    else
    266268    {
     
    277279
    278280    if(fUseCtgThetaFormula)
    279       ctgThetaError = fCtgThetaFormula->Eval(pt, eta);
     281      ctgThetaError = fCtgThetaFormula->Eval(pt, eta, phi, e, candidate);
    280282    else
    281283    {
     
    292294
    293295    if(fUsePhiFormula)
    294       phiError = fPhiFormula->Eval(pt, eta);
     296      phiError = fPhiFormula->Eval(pt, eta, phi, e, candidate);
    295297    else
    296298    {
     
    331333    candidate->Momentum.SetPy(p * TMath::Sin(phi) * TMath::Sin(theta));
    332334    candidate->Momentum.SetPz(p * TMath::Cos(theta));
    333     candidate->Momentum.SetE(candidate->Momentum.Pt() * TMath::CosH(eta));
     335    candidate->Momentum.SetE(TMath::Sqrt(p*p + m*m));
    334336    candidate->PT = candidate->Momentum.Pt();
    335337
  • modules/TreeWriter.cc

    ra5af1df rd612dec  
    7272  fClassMap[Track::Class()] = &TreeWriter::ProcessTracks;
    7373  fClassMap[Tower::Class()] = &TreeWriter::ProcessTowers;
     74  fClassMap[ParticleFlowCandidate::Class()] = &TreeWriter::ProcessParticleFlowCandidates;
    7475  fClassMap[Photon::Class()] = &TreeWriter::ProcessPhotons;
    7576  fClassMap[Electron::Class()] = &TreeWriter::ProcessElectrons;
     
    123124    fBranchMap.insert(make_pair(branch, make_pair(itClassMap->second, array)));
    124125  }
     126
     127  param = GetParam("Info");
     128  TString infoName;
     129  Double_t infoValue;
     130
     131  size = param.GetSize();
     132  for(i = 0; i < size / 2; ++i)
     133  {
     134    infoName = param[i * 2].GetString();
     135    infoValue = param[i * 2 + 1].GetDouble();
     136
     137    AddInfo(infoName, infoValue);
     138  }
    125139}
    126140
     
    138152  it1.Reset();
    139153  array->Clear();
     154
    140155  while((candidate = static_cast<Candidate *>(it1.Next())))
    141156  {
     
    215230    entry->Pz = momentum.Pz();
    216231
    217     entry->D0 = candidate->D0;
    218     entry->DZ = candidate->DZ;
    219     entry->P = momentum.P();
    220     entry->PT = candidate->PT;
    221     entry->CtgTheta = candidate->CtgTheta;
    222     entry->Phi = candidate->Phi;
    223 
    224232    entry->Eta = eta;
    225233    entry->Phi = momentum.Phi();
     
    322330  Candidate *particle = 0;
    323331  Track *entry = 0;
    324   Double_t pt, signz, cosTheta, eta, rapidity, p, ctgTheta, phi;
     332  Double_t pt, signz, cosTheta, eta, rapidity, p, ctgTheta, phi, m;
    325333  const Double_t c_light = 2.99792458E8;
    326334
     
    356364
    357365    entry->D0 = candidate->D0;
    358     entry->ErrorD0 = candidate->ErrorD0;
    359366    entry->DZ = candidate->DZ;
    360     entry->ErrorDZ = candidate->ErrorDZ;
     367    entry->Nclusters = candidate->Nclusters;
     368    entry->dNdx = candidate->dNdx;
    361369
    362370    entry->ErrorP = candidate->ErrorP;
    363371    entry->ErrorPT = candidate->ErrorPT;
     372
     373    // diagonal covariance matrix terms
     374    entry->ErrorD0 = candidate->ErrorD0;
     375    entry->ErrorC = candidate->ErrorC;
     376    entry->ErrorPhi = candidate->ErrorPhi;
     377    entry->ErrorDZ = candidate->ErrorDZ;
    364378    entry->ErrorCtgTheta = candidate->ErrorCtgTheta;
    365     entry->ErrorPhi = candidate->ErrorPhi;
     379
     380    // add some offdiagonal covariance matrix elements
     381    entry->ErrorD0Phi          = candidate->TrackCovariance(0,1);
     382    entry->ErrorD0C            = candidate->TrackCovariance(0,2);
     383    entry->ErrorD0DZ           = candidate->TrackCovariance(0,3);
     384    entry->ErrorD0CtgTheta     = candidate->TrackCovariance(0,4);
     385    entry->ErrorPhiC           = candidate->TrackCovariance(1,2);
     386    entry->ErrorPhiDZ          = candidate->TrackCovariance(1,3);
     387    entry->ErrorPhiCtgTheta    = candidate->TrackCovariance(1,4);
     388    entry->ErrorCDZ            = candidate->TrackCovariance(2,3);
     389    entry->ErrorCCtgTheta      = candidate->TrackCovariance(2,4);
     390    entry->ErrorDZCtgTheta     = candidate->TrackCovariance(3,4);
    366391
    367392    entry->Xd = candidate->Xd;
     
    374399    p = momentum.P();
    375400    phi = momentum.Phi();
     401    m = momentum.M();
    376402    ctgTheta = (TMath::Tan(momentum.Theta()) != 0) ? 1 / TMath::Tan(momentum.Theta()) : 1e10;
    377403
     
    386412    entry->Phi = phi;
    387413    entry->CtgTheta = ctgTheta;
     414    entry->C = candidate->C;
     415    entry->Mass = m;
    388416
    389417    particle = static_cast<Candidate *>(candidate->GetCandidates()->At(0));
    390     const TLorentzVector &initialPosition = particle->Position;
     418    //const TLorentzVector &initialPosition = particle->Position;
     419    const TLorentzVector &initialPosition = candidate->InitialPosition;
    391420
    392421    entry->X = initialPosition.X();
     
    394423    entry->Z = initialPosition.Z();
    395424    entry->T = initialPosition.T() * 1.0E-3 / c_light;
     425    entry->ErrorT =candidate-> ErrorT * 1.0E-3 / c_light;
    396426
    397427    entry->Particle = particle;
     
    435465    entry->Eem = candidate->Eem;
    436466    entry->Ehad = candidate->Ehad;
     467    entry->Etrk = candidate->Etrk;
    437468    entry->Edges[0] = candidate->Edges[0];
    438469    entry->Edges[1] = candidate->Edges[1];
     
    444475
    445476    FillParticles(candidate, &entry->Particles);
     477  }
     478}
     479
     480//------------------------------------------------------------------------------
     481
     482void TreeWriter::ProcessParticleFlowCandidates(ExRootTreeBranch *branch, TObjArray *array)
     483{
     484
     485  TIter iterator(array);
     486  Candidate *candidate = 0;
     487  Candidate *particle = 0;
     488  ParticleFlowCandidate *entry = 0;
     489  Double_t e, pt, signz, cosTheta, eta, rapidity, p, ctgTheta, phi, m;
     490  const Double_t c_light = 2.99792458E8;
     491
     492  // loop over all tracks
     493  iterator.Reset();
     494  while((candidate = static_cast<Candidate *>(iterator.Next())))
     495  {
     496    const TLorentzVector &position = candidate->Position;
     497
     498    cosTheta = TMath::Abs(position.CosTheta());
     499    signz = (position.Pz() >= 0.0) ? 1.0 : -1.0;
     500    eta = (cosTheta == 1.0 ? signz * 999.9 : position.Eta());
     501    rapidity = (cosTheta == 1.0 ? signz * 999.9 : position.Rapidity());
     502
     503    entry = static_cast<ParticleFlowCandidate *>(branch->NewEntry());
     504
     505    entry->SetBit(kIsReferenced);
     506    entry->SetUniqueID(candidate->GetUniqueID());
     507
     508    entry->PID = candidate->PID;
     509
     510    entry->Charge = candidate->Charge;
     511
     512    entry->EtaOuter = eta;
     513    entry->PhiOuter = position.Phi();
     514
     515    entry->XOuter = position.X();
     516    entry->YOuter = position.Y();
     517    entry->ZOuter = position.Z();
     518    entry->TOuter = position.T() * 1.0E-3 / c_light;
     519
     520    entry->L = candidate->L;
     521
     522    entry->D0 = candidate->D0;
     523    entry->DZ = candidate->DZ;
     524    entry->Nclusters = candidate->Nclusters;
     525    entry->dNdx = candidate->dNdx;
     526
     527    entry->ErrorP = candidate->ErrorP;
     528    entry->ErrorPT = candidate->ErrorPT;
     529    entry->ErrorCtgTheta = candidate->ErrorCtgTheta;
     530
     531
     532    // diagonal covariance matrix terms
     533
     534    entry->ErrorD0 = candidate->ErrorD0;
     535    entry->ErrorC = candidate->ErrorC;
     536    entry->ErrorPhi = candidate->ErrorPhi;
     537    entry->ErrorDZ = candidate->ErrorDZ;
     538    entry->ErrorCtgTheta = candidate->ErrorCtgTheta;
     539
     540    // add some offdiagonal covariance matrix elements
     541    entry->ErrorD0Phi          = candidate->TrackCovariance(0,1);
     542    entry->ErrorD0C            = candidate->TrackCovariance(0,2);
     543    entry->ErrorD0DZ           = candidate->TrackCovariance(0,3);
     544    entry->ErrorD0CtgTheta     = candidate->TrackCovariance(0,4);
     545    entry->ErrorPhiC           = candidate->TrackCovariance(1,2);
     546    entry->ErrorPhiDZ          = candidate->TrackCovariance(1,3);
     547    entry->ErrorPhiCtgTheta    = candidate->TrackCovariance(1,4);
     548    entry->ErrorCDZ            = candidate->TrackCovariance(2,3);
     549    entry->ErrorCCtgTheta      = candidate->TrackCovariance(2,4);
     550    entry->ErrorDZCtgTheta     = candidate->TrackCovariance(3,4);
     551
     552    entry->Xd = candidate->Xd;
     553    entry->Yd = candidate->Yd;
     554    entry->Zd = candidate->Zd;
     555
     556    const TLorentzVector &momentum = candidate->Momentum;
     557
     558    e = momentum.E();
     559    pt = momentum.Pt();
     560    p = momentum.P();
     561    phi = momentum.Phi();
     562    m = momentum.M();
     563    ctgTheta = (TMath::Tan(momentum.Theta()) != 0) ? 1 / TMath::Tan(momentum.Theta()) : 1e10;
     564
     565    entry->E = e;
     566    entry->P = p;
     567    entry->PT = pt;
     568    entry->Eta = eta;
     569    entry->Phi = phi;
     570    entry->CtgTheta = ctgTheta;
     571    entry->C = candidate->C;
     572    entry->Mass = m;
     573
     574    particle = static_cast<Candidate *>(candidate->GetCandidates()->At(0));
     575    //const TLorentzVector &initialPosition = particle->Position;
     576    const TLorentzVector &initialPosition = candidate->InitialPosition;
     577
     578    entry->X = initialPosition.X();
     579    entry->Y = initialPosition.Y();
     580    entry->Z = initialPosition.Z();
     581    entry->T = initialPosition.T() * 1.0E-3 / c_light;
     582    entry->ErrorT = candidate-> ErrorT * 1.0E-3 / c_light;
     583
     584    entry->VertexIndex = candidate->ClusterIndex;
     585
     586    entry->Eem = candidate->Eem;
     587    entry->Ehad = candidate->Ehad;
     588    entry->Etrk = candidate->Etrk;
     589    entry->Edges[0] = candidate->Edges[0];
     590    entry->Edges[1] = candidate->Edges[1];
     591    entry->Edges[2] = candidate->Edges[2];
     592    entry->Edges[3] = candidate->Edges[3];
     593
     594    //entry->T = position.T() * 1.0E-3 / c_light;
     595    entry->NTimeHits = candidate->NTimeHits;
     596
     597    FillParticles(candidate, &entry->Particles);
     598
    446599  }
    447600}
     
    687840    entry->NCharged = candidate->NCharged;
    688841    entry->NNeutrals = candidate->NNeutrals;
     842
     843    entry->NeutralEnergyFraction = candidate->NeutralEnergyFraction;
     844    entry->ChargedEnergyFraction = candidate->ChargedEnergyFraction;
    689845    entry->Beta = candidate->Beta;
    690846    entry->BetaStar = candidate->BetaStar;
  • modules/TreeWriter.h

    ra5af1df rd612dec  
    5656  void ProcessTracks(ExRootTreeBranch *branch, TObjArray *array);
    5757  void ProcessTowers(ExRootTreeBranch *branch, TObjArray *array);
     58  void ProcessParticleFlowCandidates(ExRootTreeBranch *branch, TObjArray *array);
    5859  void ProcessPhotons(ExRootTreeBranch *branch, TObjArray *array);
    5960  void ProcessElectrons(ExRootTreeBranch *branch, TObjArray *array);
     
    7980#endif
    8081
    81   ClassDef(TreeWriter, 1)
     82  ClassDef(TreeWriter, 2)
    8283};
    8384
Note: See TracChangeset for help on using the changeset viewer.