Changes in modules/SimpleCalorimeter.cc [f8299bc:e0f8f99] in git
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
modules/SimpleCalorimeter.cc
rf8299bc re0f8f99 58 58 fItParticleInputArray(0), fItTrackInputArray(0) 59 59 { 60 Int_t i; 61 60 62 61 fResolutionFormula = new DelphesFormula; 63 64 for(i = 0; i < 2; ++i) 65 { 66 fTowerTrackArray[i] = new TObjArray; 67 fItTowerTrackArray[i] = fTowerTrackArray[i]->MakeIterator(); 68 } 62 fTowerTrackArray = new TObjArray; 63 fItTowerTrackArray = fTowerTrackArray->MakeIterator(); 64 69 65 } 70 66 … … 73 69 SimpleCalorimeter::~SimpleCalorimeter() 74 70 { 75 Int_t i; 76 71 77 72 if(fResolutionFormula) delete fResolutionFormula; 78 79 for(i = 0; i < 2; ++i) 80 { 81 if(fTowerTrackArray[i]) delete fTowerTrackArray[i]; 82 if(fItTowerTrackArray[i]) delete fItTowerTrackArray[i]; 83 } 73 if(fTowerTrackArray) delete fTowerTrackArray; 74 if(fItTowerTrackArray) delete fItTowerTrackArray; 75 84 76 } 85 77 … … 198 190 Double_t fraction; 199 191 Double_t energy; 200 Double_t sigma;201 192 Int_t pdgCode; 202 193 … … 340 331 fTowerEnergy = 0.0; 341 332 342 fTrackEnergy [0]= 0.0;343 fTrack Energy[1]= 0.0;333 fTrackEnergy = 0.0; 334 fTrackSigma = 0.0; 344 335 345 336 fTowerTime = 0.0; … … 351 342 fTowerPhotonHits = 0; 352 343 353 fTowerTrackArray[0]->Clear(); 354 fTowerTrackArray[1]->Clear(); 355 } 344 fTowerTrackArray->Clear(); 345 } 356 346 357 347 // check for track hits … … 371 361 if(fTrackFractions[number] > 1.0E-9) 372 362 { 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 } 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 384 370 } 371 385 372 else 386 373 { … … 403 390 fTowerEnergy += energy; 404 391 405 fTowerTime += TMath::Sqrt(energy)*position.T();406 fTowerTimeWeight += TMath::Sqrt(energy);392 fTowerTime += energy*position.T(); 393 fTowerTimeWeight += energy; 407 394 408 395 fTower->AddCandidate(particle); … … 418 405 { 419 406 Candidate *tower, *track, *mother; 420 Double_t energy, pt, eta, phi;421 Double_t sigma ;407 Double_t energy,neutralEnergy, pt, eta, phi; 408 Double_t sigma, neutralSigma; 422 409 Double_t time; 410 411 Double_t weightTrack, weightCalo, bestEnergyEstimate, rescaleFactor; 423 412 424 413 TLorentzVector momentum; … … 436 425 437 426 if(energy < fEnergyMin || energy < fEnergySignificanceMin*sigma) energy = 0.0; 427 438 428 439 429 if(fSmearTowerCenter) … … 464 454 if(energy > 0.0) fTowerOutputArray->Add(fTower); 465 455 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) 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) 499 469 { 500 470 // create new photon tower 501 471 tower = static_cast<Candidate*>(fTower->Clone()); 502 pt = energy / TMath::CosH(eta); 503 504 tower->Eem = (!fIsEcal) ? 0 : energy; 505 tower->Ehad = (fIsEcal) ? 0 : energy; 472 pt = neutralEnergy / TMath::CosH(eta); 473 474 tower->Eem = (!fIsEcal) ? 0 : neutralEnergy; 475 tower->Ehad = (fIsEcal) ? 0 : neutralEnergy; 476 tower->PID = (fIsEcal) ? 22 : 0; 477 478 tower->Momentum.SetPtEtaPhiE(pt, eta, phi, neutralEnergy); 479 fEFlowTowerOutputArray->Add(tower); 506 480 507 tower->Momentum.SetPtEtaPhiE(pt, eta, phi, energy); 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 } 508 491 509 tower->PID = (fIsEcal) ? 22 : 0; 510 511 fEFlowTowerOutputArray->Add(tower); 512 } 513 } 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 } 514 515 515 516 //------------------------------------------------------------------------------
Note:
See TracChangeset
for help on using the changeset viewer.