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