Fork me on GitHub

Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • modules/SimpleCalorimeter.cc

    re0f8f99 rf8299bc  
    5858  fItParticleInputArray(0), fItTrackInputArray(0)
    5959{
    60  
     60  Int_t i;
     61
    6162  fResolutionFormula = new DelphesFormula;
    62   fTowerTrackArray = new TObjArray;
    63   fItTowerTrackArray = fTowerTrackArray->MakeIterator();
    64  
     63
     64  for(i = 0; i < 2; ++i)
     65  {
     66    fTowerTrackArray[i] = new TObjArray;
     67    fItTowerTrackArray[i] = fTowerTrackArray[i]->MakeIterator();
     68  }
    6569}
    6670
     
    6973SimpleCalorimeter::~SimpleCalorimeter()
    7074{
    71  
     75  Int_t i;
     76
    7277  if(fResolutionFormula) delete fResolutionFormula;
    73   if(fTowerTrackArray) delete fTowerTrackArray;
    74   if(fItTowerTrackArray) delete fItTowerTrackArray;
    75  
     78
     79  for(i = 0; i < 2; ++i)
     80  {
     81    if(fTowerTrackArray[i]) delete fTowerTrackArray[i];
     82    if(fItTowerTrackArray[i]) delete fItTowerTrackArray[i];
     83  }
    7684}
    7785
     
    190198  Double_t fraction;
    191199  Double_t energy;
     200  Double_t sigma;
    192201  Int_t pdgCode;
    193202
     
    331340      fTowerEnergy = 0.0;
    332341
    333       fTrackEnergy = 0.0;
    334       fTrackSigma = 0.0;
     342      fTrackEnergy[0] = 0.0;
     343      fTrackEnergy[1] = 0.0;
    335344
    336345      fTowerTime = 0.0;
     
    342351      fTowerPhotonHits = 0;
    343352
    344       fTowerTrackArray->Clear();
    345      }
     353      fTowerTrackArray[0]->Clear();
     354      fTowerTrackArray[1]->Clear();
     355    }
    346356
    347357    // check for track hits
     
    361371      if(fTrackFractions[number] > 1.0E-9)
    362372      {
    363              
    364        // compute total charged energy   
    365        fTrackEnergy += energy;
    366        fTrackSigma += ((track->TrackResolution)*momentum.E())*((track->TrackResolution)*momentum.E());
    367        
    368        fTowerTrackArray->Add(track);
    369      
     373        sigma = fResolutionFormula->Eval(0.0, fTowerEta, 0.0, momentum.E());
     374        if(sigma/momentum.E() < track->TrackResolution)
     375        {
     376          fTrackEnergy[0] += energy;
     377          fTowerTrackArray[0]->Add(track);
     378        }
     379        else
     380        {
     381          fTrackEnergy[1] += energy;
     382          fTowerTrackArray[1]->Add(track);
     383        }
    370384      }
    371        
    372385      else
    373386      {
     
    390403    fTowerEnergy += energy;
    391404
    392     fTowerTime += energy*position.T();
    393     fTowerTimeWeight += energy;
     405    fTowerTime += TMath::Sqrt(energy)*position.T();
     406    fTowerTimeWeight += TMath::Sqrt(energy);
    394407
    395408    fTower->AddCandidate(particle);
     
    405418{
    406419  Candidate *tower, *track, *mother;
    407   Double_t energy,neutralEnergy, pt, eta, phi;
    408   Double_t sigma, neutralSigma;
     420  Double_t energy, pt, eta, phi;
     421  Double_t sigma;
    409422  Double_t time;
    410    
    411   Double_t weightTrack, weightCalo, bestEnergyEstimate, rescaleFactor;
    412423
    413424  TLorentzVector momentum;
     
    425436
    426437  if(energy < fEnergyMin || energy < fEnergySignificanceMin*sigma) energy = 0.0;
    427 
    428438
    429439  if(fSmearTowerCenter)
     
    454464  if(energy > 0.0) fTowerOutputArray->Add(fTower);
    455465
    456  
    457   // e-flow candidates
    458 
    459   //compute neutral excess
    460  
    461   fTrackSigma = TMath::Sqrt(fTrackSigma);
    462   neutralEnergy = max( (energy - fTrackEnergy) , 0.0);
    463  
    464   //compute sigma_trk total
    465   neutralSigma = neutralEnergy / TMath::Sqrt(fTrackSigma*fTrackSigma+ sigma*sigma);
    466    
    467   // if neutral excess is significant, simply create neutral Eflow tower and clone each track into eflowtrack
    468   if(neutralEnergy > fEnergyMin && neutralSigma > fEnergySignificanceMin)
     466  // fill e-flow candidates
     467
     468  energy -= fTrackEnergy[1];
     469
     470  fItTowerTrackArray[0]->Reset();
     471  while((track = static_cast<Candidate*>(fItTowerTrackArray[0]->Next())))
     472  {
     473    mother = track;
     474    track = static_cast<Candidate*>(track->Clone());
     475    track->AddCandidate(mother);
     476
     477    track->Momentum *= energy/fTrackEnergy[0];
     478
     479    fEFlowTrackOutputArray->Add(track);
     480  }
     481
     482  fItTowerTrackArray[1]->Reset();
     483  while((track = static_cast<Candidate*>(fItTowerTrackArray[1]->Next())))
     484  {
     485    mother = track;
     486    track = static_cast<Candidate*>(track->Clone());
     487    track->AddCandidate(mother);
     488
     489    fEFlowTrackOutputArray->Add(track);
     490  }
     491
     492  if(fTowerTrackArray[0]->GetEntriesFast() > 0) energy = 0.0;
     493
     494  sigma = fResolutionFormula->Eval(0.0, fTowerEta, 0.0, energy);
     495  if(energy < fEnergyMin || energy < fEnergySignificanceMin*sigma) energy = 0.0;
     496
     497  // save energy excess as an energy flow tower
     498  if(energy > 0.0)
    469499  {
    470500    // create new photon tower
    471501    tower = static_cast<Candidate*>(fTower->Clone());
    472     pt = neutralEnergy / TMath::CosH(eta);
    473 
    474     tower->Eem = (!fIsEcal) ? 0 : neutralEnergy;
    475     tower->Ehad = (fIsEcal) ? 0 : neutralEnergy;
     502    pt = energy / TMath::CosH(eta);
     503
     504    tower->Eem = (!fIsEcal) ? 0 : energy;
     505    tower->Ehad = (fIsEcal) ? 0 : energy;
     506   
     507    tower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy);
     508   
    476509    tower->PID = (fIsEcal) ? 22 : 0;
    477  
    478     tower->Momentum.SetPtEtaPhiE(pt, eta, phi, neutralEnergy);
     510   
    479511    fEFlowTowerOutputArray->Add(tower);
    480    
    481     fItTowerTrackArray->Reset();
    482     while((track = static_cast<Candidate*>(fItTowerTrackArray->Next())))
    483     {
    484       mother = track;
    485       track = static_cast<Candidate*>(track->Clone());
    486       track->AddCandidate(mother);
    487 
    488       fEFlowTrackOutputArray->Add(track);
    489     }
    490   }
    491    
    492   // if neutral excess is not significant, rescale eflow tracks, such that the total charged equals the best measurement given by the calorimeter and tracking
    493   else if (fTrackEnergy > 0.0)
    494   {
    495     weightTrack = (fTrackSigma > 0.0) ? 1 / (fTrackSigma*fTrackSigma) : 0.0;
    496     weightCalo  = (sigma > 0.0) ? 1 / (sigma*sigma) : 0.0;
    497  
    498     bestEnergyEstimate = (weightTrack*fTrackEnergy + weightCalo*energy) / (weightTrack + weightCalo);
    499     rescaleFactor = bestEnergyEstimate/fTrackEnergy;
    500    
    501     fItTowerTrackArray->Reset();
    502     while((track = static_cast<Candidate*>(fItTowerTrackArray->Next())))
    503     {
    504       mother = track;
    505       track = static_cast<Candidate*>(track->Clone());
    506       track->AddCandidate(mother);
    507 
    508       track->Momentum *= rescaleFactor;
    509 
    510       fEFlowTrackOutputArray->Add(track);
    511     }
    512   }
    513    
    514  }
     512  }
     513}
    515514
    516515//------------------------------------------------------------------------------
Note: See TracChangeset for help on using the changeset viewer.