00001 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00002 #include "FWCore/Framework/interface/ESHandle.h"
00003 #include "FWCore/Framework/interface/Event.h"
00004 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00005 #include "RecoParticleFlow/PFProducer/plugins/PFPhotonTranslator.h"
00006
00007 #include "RecoParticleFlow/PFClusterTools/interface/PFClusterWidthAlgo.h"
00008 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
00009 #include "DataFormats/EgammaReco/interface/BasicCluster.h"
00010 #include "DataFormats/EgammaReco/interface/PreshowerCluster.h"
00011 #include "DataFormats/EgammaReco/interface/SuperCluster.h"
00012 #include "DataFormats/EgammaCandidates/interface/PhotonCore.h"
00013 #include "DataFormats/EgammaCandidates/interface/Photon.h"
00014 #include "DataFormats/EgammaCandidates/interface/PhotonCoreFwd.h"
00015 #include "DataFormats/EgammaCandidates/interface/PhotonFwd.h"
00016 #include "DataFormats/VertexReco/interface/Vertex.h"
00017 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00018
00019 #include "DataFormats/ParticleFlowReco/interface/PFBlockElement.h"
00020 #include "DataFormats/ParticleFlowReco/interface/PFBlockFwd.h"
00021 #include "DataFormats/ParticleFlowReco/interface/PFBlock.h"
00022
00023 #include "DataFormats/CaloTowers/interface/CaloTowerCollection.h"
00024 #include "RecoEgamma/PhotonIdentification/interface/PhotonIsolationCalculator.h"
00025 #include "RecoEgamma/EgammaIsolationAlgos/interface/EgammaTowerIsolation.h"
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidatePhotonExtra.h"
00042
00043 #include "DataFormats/Math/interface/Vector3D.h"
00044 #include "DataFormats/Math/interface/LorentzVector.h"
00045 #include "DataFormats/GeometryVector/interface/GlobalVector.h"
00046 #include "DataFormats/Common/interface/AssociationVector.h"
00047
00048 #include <Math/VectorUtil.h>
00049 #include <vector>
00050 #include "TLorentzVector.h"
00051 #include "TMath.h"
00052
00053 using namespace edm;
00054 using namespace std;
00055 using namespace reco;
00056
00057 using namespace ROOT::Math::VectorUtil;
00058 typedef math::XYZTLorentzVector LorentzVector;
00059 typedef math::XYZPoint Point;
00060 typedef math::XYZVector Vector;
00061
00062
00063 PFPhotonTranslator::PFPhotonTranslator(const edm::ParameterSet & iConfig) {
00064
00065
00066
00067 inputTagPFCandidates_
00068 = iConfig.getParameter<edm::InputTag>("PFCandidate");
00069
00070 edm::ParameterSet isoVals = iConfig.getParameter<edm::ParameterSet> ("isolationValues");
00071 inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfChargedHadrons"));
00072 inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfPhotons"));
00073 inputTagIsoVals_.push_back(isoVals.getParameter<edm::InputTag>("pfNeutralHadrons"));
00074
00075
00076 PFBasicClusterCollection_ = iConfig.getParameter<std::string>("PFBasicClusters");
00077 PFPreshowerClusterCollection_ = iConfig.getParameter<std::string>("PFPreshowerClusters");
00078 PFSuperClusterCollection_ = iConfig.getParameter<std::string>("PFSuperClusters");
00079 PFConversionCollection_ = iConfig.getParameter<std::string>("PFConversionCollection");
00080 PFPhotonCoreCollection_ = iConfig.getParameter<std::string>("PFPhotonCores");
00081 PFPhotonCollection_ = iConfig.getParameter<std::string>("PFPhotons");
00082
00083 EGPhotonCollection_ = iConfig.getParameter<std::string>("EGPhotons");
00084
00085 vertexProducer_ = iConfig.getParameter<std::string>("primaryVertexProducer");
00086
00087 barrelEcalHits_ = iConfig.getParameter<edm::InputTag>("barrelEcalHits");
00088 endcapEcalHits_ = iConfig.getParameter<edm::InputTag>("endcapEcalHits");
00089
00090 hcalTowers_ = iConfig.getParameter<edm::InputTag>("hcalTowers");
00091 hOverEConeSize_ = iConfig.getParameter<double>("hOverEConeSize");
00092
00093 if (iConfig.exists("emptyIsOk")) emptyIsOk_ = iConfig.getParameter<bool>("emptyIsOk");
00094 else emptyIsOk_=false;
00095
00096 produces<reco::BasicClusterCollection>(PFBasicClusterCollection_);
00097 produces<reco::PreshowerClusterCollection>(PFPreshowerClusterCollection_);
00098 produces<reco::SuperClusterCollection>(PFSuperClusterCollection_);
00099 produces<reco::PhotonCoreCollection>(PFPhotonCoreCollection_);
00100 produces<reco::PhotonCollection>(PFPhotonCollection_);
00101 produces<reco::ConversionCollection>(PFConversionCollection_);
00102 }
00103
00104 PFPhotonTranslator::~PFPhotonTranslator() {}
00105
00106 void PFPhotonTranslator::beginRun(edm::Run& run,const edm::EventSetup & es) {
00107
00108 }
00109
00110 void PFPhotonTranslator::produce(edm::Event& iEvent,
00111 const edm::EventSetup& iSetup) {
00112
00113
00114
00115 std::auto_ptr<reco::BasicClusterCollection>
00116 basicClusters_p(new reco::BasicClusterCollection);
00117
00118 std::auto_ptr<reco::PreshowerClusterCollection>
00119 psClusters_p(new reco::PreshowerClusterCollection);
00120
00121
00122
00123
00124
00125
00126 reco::SuperClusterCollection outputSuperClusterCollection;
00127 reco::ConversionCollection outputOneLegConversionCollection;
00128 reco::PhotonCoreCollection outputPhotonCoreCollection;
00129 reco::PhotonCollection outputPhotonCollection;
00130
00131 outputSuperClusterCollection.clear();
00132 outputOneLegConversionCollection.clear();
00133 outputPhotonCoreCollection.clear();
00134 outputPhotonCollection.clear();
00135
00136
00137 edm::Handle<reco::PFCandidateCollection> pfCandidates;
00138 bool status=fetchCandidateCollection(pfCandidates,
00139 inputTagPFCandidates_,
00140 iEvent );
00141
00142 edm::Handle<reco::PhotonCollection> egPhotons;
00143 iEvent.getByLabel(EGPhotonCollection_, egPhotons);
00144
00145
00146 Handle<reco::VertexCollection> vertexHandle;
00147
00148
00149 IsolationValueMaps isolationValues(inputTagIsoVals_.size());
00150 for (size_t j = 0; j<inputTagIsoVals_.size(); ++j) {
00151 iEvent.getByLabel(inputTagIsoVals_[j], isolationValues[j]);
00152 }
00153
00154
00155
00156 photPFCandidateIndex_.clear();
00157 basicClusters_.clear();
00158 pfClusters_.clear();
00159 preshowerClusters_.clear();
00160 superClusters_.clear();
00161 basicClusterPtr_.clear();
00162 preshowerClusterPtr_.clear();
00163 CandidatePtr_.clear();
00164 egSCRef_.clear();
00165 egPhotonRef_.clear();
00166
00167 pfConv_.clear();
00168 pfSingleLegConv_.clear();
00169 pfSingleLegConvMva_.clear();
00170 conv1legPFCandidateIndex_.clear();
00171 conv2legPFCandidateIndex_.clear();
00172
00173
00174
00175
00176
00177
00178 unsigned ncand=(status)?pfCandidates->size():0;
00179
00180 unsigned iphot=0;
00181 unsigned iconv1leg=0;
00182 unsigned iconv2leg=0;
00183
00184 for( unsigned i=0; i<ncand; ++i ) {
00185
00186 const reco::PFCandidate& cand = (*pfCandidates)[i];
00187 if(cand.particleId()!=reco::PFCandidate::gamma) continue;
00188
00189 if(cand. mva_nothing_gamma()>0.001)
00190 {
00191
00192
00193
00194
00195
00196 if (cand.photonExtraRef()->conversionRef().size()>0){
00197
00198 pfConv_.push_back(reco::ConversionRefVector());
00199
00200 const reco::ConversionRefVector & doubleLegConvColl = cand.photonExtraRef()->conversionRef();
00201 for (unsigned int iconv=0; iconv<doubleLegConvColl.size(); iconv++){
00202 pfConv_[iconv2leg].push_back(doubleLegConvColl[iconv]);
00203 }
00204
00205 conv2legPFCandidateIndex_.push_back(iconv2leg);
00206 iconv2leg++;
00207 }
00208 else conv2legPFCandidateIndex_.push_back(-1);
00209
00210 const std::vector<reco::TrackRef> & singleLegConvColl = cand.photonExtraRef()->singleLegConvTrackRef();
00211 const std::vector<float>& singleLegConvCollMva = cand.photonExtraRef()->singleLegConvMva();
00212
00213
00214
00215 if (singleLegConvColl.size()>0){
00216
00217 pfSingleLegConv_.push_back(std::vector<reco::TrackRef>());
00218 pfSingleLegConvMva_.push_back(std::vector<float>());
00219
00220
00221 for (unsigned int itk=0; itk<singleLegConvColl.size(); itk++){
00222
00223
00224 pfSingleLegConv_[iconv1leg].push_back(singleLegConvColl[itk]);
00225 pfSingleLegConvMva_[iconv1leg].push_back(singleLegConvCollMva[itk]);
00226 }
00227
00228
00229 conv1legPFCandidateIndex_.push_back(iconv1leg);
00230
00231 iconv1leg++;
00232 }
00233 else conv1legPFCandidateIndex_.push_back(-1);
00234
00235 }
00236
00237 photPFCandidateIndex_.push_back(i);
00238
00239 basicClusters_.push_back(reco::BasicClusterCollection());
00240 pfClusters_.push_back(std::vector<const reco::PFCluster *>());
00241 preshowerClusters_.push_back(reco::PreshowerClusterCollection());
00242 superClusters_.push_back(reco::SuperClusterCollection());
00243
00244 reco::PFCandidatePtr ptrToPFPhoton(pfCandidates,i);
00245 CandidatePtr_.push_back(ptrToPFPhoton);
00246 egSCRef_.push_back(cand.superClusterRef());
00247
00248
00249 int iegphot=0;
00250 for (reco::PhotonCollection::const_iterator gamIter = egPhotons->begin(); gamIter != egPhotons->end(); ++gamIter){
00251 if (cand.superClusterRef()==gamIter->superCluster()){
00252 reco::PhotonRef PhotRef(reco::PhotonRef(egPhotons, iegphot));
00253 egPhotonRef_.push_back(PhotRef);
00254 }
00255 iegphot++;
00256 }
00257
00258
00259
00260
00261 for(unsigned iele=0; iele<cand.elementsInBlocks().size(); ++iele) {
00262
00263 reco::PFBlockRef blockRef = cand.elementsInBlocks()[iele].first;
00264
00265 unsigned elementIndex = cand.elementsInBlocks()[iele].second;
00266
00267 if(blockRef.isNull()) continue;
00268
00269
00270 const edm::OwnVector< reco::PFBlockElement >& elements = (*blockRef).elements();
00271
00272 const reco::PFBlockElement & pfbe (elements[elementIndex]);
00273
00274 if(pfbe.type()==reco::PFBlockElement::ECAL)
00275 {
00276
00277
00278
00279
00280
00281 createBasicCluster(pfbe,basicClusters_[iphot],pfClusters_[iphot],correspondingDaughterCandidate(cand,pfbe));
00282 }
00283 if(pfbe.type()==reco::PFBlockElement::PS1)
00284 {
00285
00286 createPreshowerCluster(pfbe,preshowerClusters_[iphot],1);
00287 }
00288 if(pfbe.type()==reco::PFBlockElement::PS2)
00289 {
00290
00291 createPreshowerCluster(pfbe,preshowerClusters_[iphot],2);
00292 }
00293
00294
00295 }
00296
00297
00298 basicClusters_p->insert(basicClusters_p->end(),basicClusters_[iphot].begin(), basicClusters_[iphot].end());
00299
00300 psClusters_p->insert(psClusters_p->end(),preshowerClusters_[iphot].begin(),preshowerClusters_[iphot].end());
00301
00302 ++iphot;
00303
00304 }
00305
00306
00307
00308
00309 const edm::OrphanHandle<reco::BasicClusterCollection> bcRefProd =
00310 iEvent.put(basicClusters_p,PFBasicClusterCollection_);
00311
00312
00313 const edm::OrphanHandle<reco::PreshowerClusterCollection> psRefProd =
00314 iEvent.put(psClusters_p,PFPreshowerClusterCollection_);
00315
00316
00317 createBasicClusterPtrs(bcRefProd);
00318
00319 createPreshowerClusterPtrs(psRefProd);
00320
00321
00322
00323 if(status) createSuperClusters(*pfCandidates,outputSuperClusterCollection);
00324
00325
00326
00327
00328 std::auto_ptr<reco::SuperClusterCollection> superClusters_p(new reco::SuperClusterCollection(outputSuperClusterCollection));
00329 const edm::OrphanHandle<reco::SuperClusterCollection> scRefProd = iEvent.put(superClusters_p,PFSuperClusterCollection_);
00330
00331
00332
00333
00334
00335
00336
00337
00338
00339
00340
00341
00342
00343
00344 if (status) createOneLegConversions(scRefProd, outputOneLegConversionCollection);
00345
00346
00347 std::auto_ptr<reco::ConversionCollection> SingleLeg_p(new reco::ConversionCollection(outputOneLegConversionCollection));
00348 const edm::OrphanHandle<reco::ConversionCollection> ConvRefProd = iEvent.put(SingleLeg_p,PFConversionCollection_);
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365 if(status) createPhotonCores(scRefProd, ConvRefProd, outputPhotonCoreCollection);
00366
00367
00368
00369
00370 std::auto_ptr<reco::PhotonCoreCollection> photonCores_p(new reco::PhotonCoreCollection(outputPhotonCoreCollection));
00371
00372 const edm::OrphanHandle<reco::PhotonCoreCollection> pcRefProd = iEvent.put(photonCores_p,PFPhotonCoreCollection_);
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404 reco::VertexCollection vertexCollection;
00405 bool validVertex=true;
00406 iEvent.getByLabel(vertexProducer_, vertexHandle);
00407 if (!vertexHandle.isValid()) {
00408 edm::LogWarning("PhotonProducer") << "Error! Can't get the product primary Vertex Collection "<< "\n";
00409 validVertex=false;
00410 }
00411 if (validVertex) vertexCollection = *(vertexHandle.product());
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448 if(status) createPhotons(vertexCollection, egPhotons, pcRefProd, isolationValues, outputPhotonCollection);
00449
00450
00451 std::auto_ptr<reco::PhotonCollection> photons_p(new reco::PhotonCollection(outputPhotonCollection));
00452
00453 const edm::OrphanHandle<reco::PhotonCollection> photonRefProd = iEvent.put(photons_p,PFPhotonCollection_);
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504 }
00505
00506 bool PFPhotonTranslator::fetchCandidateCollection(edm::Handle<reco::PFCandidateCollection>& c,
00507 const edm::InputTag& tag,
00508 const edm::Event& iEvent) const {
00509 bool found = iEvent.getByLabel(tag, c);
00510
00511 if(!found && !emptyIsOk_)
00512 {
00513 std::ostringstream err;
00514 err<<" cannot get PFCandidates: "
00515 <<tag<<std::endl;
00516 edm::LogError("PFPhotonTranslator")<<err.str();
00517 }
00518 return found;
00519
00520 }
00521
00522
00523
00524
00525 void PFPhotonTranslator::createBasicCluster(const reco::PFBlockElement & PFBE,
00526 reco::BasicClusterCollection & basicClusters,
00527 std::vector<const reco::PFCluster *> & pfClusters,
00528 const reco::PFCandidate & coCandidate) const
00529 {
00530 reco::PFClusterRef myPFClusterRef = PFBE.clusterRef();
00531 if(myPFClusterRef.isNull()) return;
00532
00533 const reco::PFCluster & myPFCluster (*myPFClusterRef);
00534 pfClusters.push_back(&myPFCluster);
00535
00536
00537
00538
00539 basicClusters.push_back(reco::CaloCluster(coCandidate.rawEcalEnergy(),
00540 myPFCluster.position(),
00541 myPFCluster.caloID(),
00542 myPFCluster.hitsAndFractions(),
00543 myPFCluster.algo(),
00544 myPFCluster.seed()));
00545 }
00546
00547 void PFPhotonTranslator::createPreshowerCluster(const reco::PFBlockElement & PFBE, reco::PreshowerClusterCollection& preshowerClusters,unsigned plane) const
00548 {
00549 reco::PFClusterRef myPFClusterRef= PFBE.clusterRef();
00550 preshowerClusters.push_back(reco::PreshowerCluster(myPFClusterRef->energy(),myPFClusterRef->position(),
00551 myPFClusterRef->hitsAndFractions(),plane));
00552 }
00553
00554 void PFPhotonTranslator::createBasicClusterPtrs(const edm::OrphanHandle<reco::BasicClusterCollection> & basicClustersHandle )
00555 {
00556 unsigned size=photPFCandidateIndex_.size();
00557 unsigned basicClusterCounter=0;
00558 basicClusterPtr_.resize(size);
00559
00560 for(unsigned iphot=0;iphot<size;++iphot)
00561 {
00562 unsigned nbc=basicClusters_[iphot].size();
00563 for(unsigned ibc=0;ibc<nbc;++ibc)
00564 {
00565
00566 reco::CaloClusterPtr bcPtr(basicClustersHandle,basicClusterCounter);
00567 basicClusterPtr_[iphot].push_back(bcPtr);
00568 ++basicClusterCounter;
00569 }
00570 }
00571 }
00572
00573 void PFPhotonTranslator::createPreshowerClusterPtrs(const edm::OrphanHandle<reco::PreshowerClusterCollection> & preshowerClustersHandle )
00574 {
00575 unsigned size=photPFCandidateIndex_.size();
00576 unsigned psClusterCounter=0;
00577 preshowerClusterPtr_.resize(size);
00578
00579 for(unsigned iphot=0;iphot<size;++iphot)
00580 {
00581 unsigned nbc=preshowerClusters_[iphot].size();
00582 for(unsigned ibc=0;ibc<nbc;++ibc)
00583 {
00584
00585 reco::CaloClusterPtr psPtr(preshowerClustersHandle,psClusterCounter);
00586 preshowerClusterPtr_[iphot].push_back(psPtr);
00587 ++psClusterCounter;
00588 }
00589 }
00590 }
00591
00592 void PFPhotonTranslator::createSuperClusters(const reco::PFCandidateCollection & pfCand,
00593 reco::SuperClusterCollection &superClusters) const
00594 {
00595 unsigned nphot=photPFCandidateIndex_.size();
00596 for(unsigned iphot=0;iphot<nphot;++iphot)
00597 {
00598
00599
00600
00601
00602 double sclusterE=0;
00603 double posX=0.;
00604 double posY=0.;
00605 double posZ=0.;
00606
00607 unsigned nbasics=basicClusters_[iphot].size();
00608 for(unsigned ibc=0;ibc<nbasics;++ibc)
00609 {
00610
00611
00612 double e = basicClusters_[iphot][ibc].energy();
00613 sclusterE += e;
00614 posX += e * basicClusters_[iphot][ibc].position().X();
00615 posY += e * basicClusters_[iphot][ibc].position().Y();
00616 posZ += e * basicClusters_[iphot][ibc].position().Z();
00617 }
00618 posX /=sclusterE;
00619 posY /=sclusterE;
00620 posZ /=sclusterE;
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630 PFClusterWidthAlgo pfwidth(pfClusters_[iphot]);
00631
00632 double correctedEnergy=pfCand[photPFCandidateIndex_[iphot]].ecalEnergy();
00633 reco::SuperCluster mySuperCluster(correctedEnergy,math::XYZPoint(posX,posY,posZ));
00634
00635 if(nbasics)
00636 {
00637
00638
00639
00640 mySuperCluster.setSeed(basicClusterPtr_[iphot][0]);
00641 }
00642 else
00643 {
00644
00645
00646
00647
00648
00649 mySuperCluster.setSeed(reco::CaloClusterPtr());
00650 }
00651
00652
00653 for(unsigned ibc=0;ibc<nbasics;++ibc)
00654 {
00655 mySuperCluster.addCluster(basicClusterPtr_[iphot][ibc]);
00656
00657 const std::vector< std::pair<DetId, float> > & v1 = basicClusters_[iphot][ibc].hitsAndFractions();
00658
00659 for( std::vector< std::pair<DetId, float> >::const_iterator diIt = v1.begin();
00660 diIt != v1.end();
00661 ++diIt ) {
00662
00663 mySuperCluster.addHitAndFraction(diIt->first,diIt->second);
00664 }
00665 }
00666
00667 unsigned nps=preshowerClusterPtr_[iphot].size();
00668 for(unsigned ips=0;ips<nps;++ips)
00669 {
00670 mySuperCluster.addPreshowerCluster(preshowerClusterPtr_[iphot][ips]);
00671 }
00672
00673
00674
00675 mySuperCluster.setPreshowerEnergy(pfCand[photPFCandidateIndex_[iphot]].pS1Energy()+
00676 pfCand[photPFCandidateIndex_[iphot]].pS2Energy());
00677
00678
00679 mySuperCluster.setEtaWidth(pfwidth.pflowEtaWidth());
00680 mySuperCluster.setPhiWidth(pfwidth.pflowPhiWidth());
00681
00682 mySuperCluster.rawEnergy();
00683
00684
00685
00686 superClusters.push_back(mySuperCluster);
00687
00688 }
00689 }
00690
00691 void PFPhotonTranslator::createOneLegConversions(const edm::OrphanHandle<reco::SuperClusterCollection> & superClustersHandle, reco::ConversionCollection &oneLegConversions)
00692 {
00693
00694
00695
00696 unsigned nphot=photPFCandidateIndex_.size();
00697 for(unsigned iphot=0;iphot<nphot;++iphot)
00698 {
00699
00700
00701
00702
00703
00704 if (conv1legPFCandidateIndex_[iphot]>-1){
00705
00706 for (unsigned iConv=0; iConv<pfSingleLegConv_[conv1legPFCandidateIndex_[iphot]].size(); iConv++){
00707
00708 reco::CaloClusterPtrVector scPtrVec;
00709
00710 math::Error<3>::type error;
00711 const reco::Vertex * convVtx = new reco::Vertex(pfSingleLegConv_[conv1legPFCandidateIndex_[iphot]][iConv]->innerPosition(), error);
00712
00713
00714
00715
00716 std::vector<reco::TrackRef> OneLegConvVector;
00717 OneLegConvVector.push_back(pfSingleLegConv_[conv1legPFCandidateIndex_[iphot]][iConv]);
00718
00719 reco::Conversion myOneLegConversion(scPtrVec, OneLegConvVector, *convVtx, reco::Conversion::pflow);
00720
00721
00722 std::vector< float > OneLegMvaVector;
00723 OneLegMvaVector.push_back(pfSingleLegConvMva_[conv1legPFCandidateIndex_[iphot]][iConv]);
00724 myOneLegConversion.setOneLegMVA(OneLegMvaVector);
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
00738 oneLegConversions.push_back(myOneLegConversion);
00739
00740
00741
00742 }
00743 }
00744 }
00745 }
00746
00747
00748 void PFPhotonTranslator::createPhotonCores(const edm::OrphanHandle<reco::SuperClusterCollection> & superClustersHandle, const edm::OrphanHandle<reco::ConversionCollection> & oneLegConversionHandle, reco::PhotonCoreCollection &photonCores)
00749 {
00750
00751
00752
00753 unsigned nphot=photPFCandidateIndex_.size();
00754
00755 unsigned i1legtot = 0;
00756
00757 for(unsigned iphot=0;iphot<nphot;++iphot)
00758 {
00759
00760
00761 reco::PhotonCore myPhotonCore;
00762
00763 reco::SuperClusterRef SCref(reco::SuperClusterRef(superClustersHandle, iphot));
00764
00765 myPhotonCore.setPFlowPhoton(true);
00766 myPhotonCore.setStandardPhoton(false);
00767 myPhotonCore.setPflowSuperCluster(SCref);
00768 myPhotonCore.setSuperCluster(egSCRef_[iphot]);
00769
00770 reco::ElectronSeedRefVector pixelSeeds = egPhotonRef_[iphot]->electronPixelSeeds();
00771 for (unsigned iseed=0; iseed<pixelSeeds.size(); iseed++){
00772 myPhotonCore.addElectronPixelSeed(pixelSeeds[iseed]);
00773 }
00774
00775
00776
00777
00778
00779
00780 if (conv1legPFCandidateIndex_[iphot]>-1){
00781 for (unsigned int iConv=0; iConv<pfSingleLegConv_[conv1legPFCandidateIndex_[iphot]].size(); iConv++){
00782
00783 const reco::ConversionRef & OneLegRef(reco::ConversionRef(oneLegConversionHandle, i1legtot));
00784 myPhotonCore.addOneLegConversion(OneLegRef);
00785
00786
00787
00788
00789
00790
00791
00792
00793
00794
00795
00796
00797
00798
00799
00800
00801
00802
00803 i1legtot++;
00804 }
00805 }
00806
00807 if (conv2legPFCandidateIndex_[iphot]>-1){
00808 for(unsigned int iConv=0; iConv<pfConv_[conv2legPFCandidateIndex_[iphot]].size(); iConv++) {
00809
00810 const reco::ConversionRef & TwoLegRef(pfConv_[conv2legPFCandidateIndex_[iphot]][iConv]);
00811 myPhotonCore.addConversion(TwoLegRef);
00812
00813 }
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
00827
00828
00829
00830
00831 }
00832
00833 photonCores.push_back(myPhotonCore);
00834
00835 }
00836
00837
00838 }
00839
00840
00841 void PFPhotonTranslator::createPhotons(reco::VertexCollection &vertexCollection, edm::Handle<reco::PhotonCollection> &egPhotons, const edm::OrphanHandle<reco::PhotonCoreCollection> & photonCoresHandle, const IsolationValueMaps& isolationValues, reco::PhotonCollection &photons)
00842 {
00843
00844
00845
00846 unsigned nphot=photPFCandidateIndex_.size();
00847
00848 for(unsigned iphot=0;iphot<nphot;++iphot)
00849 {
00850
00851
00852 reco::PhotonCoreRef PCref(reco::PhotonCoreRef(photonCoresHandle, iphot));
00853
00854 math::XYZPoint vtx(0.,0.,0.);
00855 if (vertexCollection.size()>0) vtx = vertexCollection.begin()->position();
00856
00857
00858 math::XYZVector direction = PCref->pfSuperCluster()->position() - vtx;
00859
00860
00861 math::XYZVector P3 = direction.unit() * PCref->pfSuperCluster()->energy();
00862 LorentzVector P4(P3.x(), P3.y(), P3.z(), PCref->pfSuperCluster()->energy());
00863
00864 reco::Photon myPhoton(P4, PCref->pfSuperCluster()->position(), PCref, vtx);
00865
00866
00867
00868
00869 reco::Photon::ShowerShape showerShape;
00870 reco::Photon::FiducialFlags fiducialFlags;
00871 reco::Photon::IsolationVariables isolationVariables03;
00872 reco::Photon::IsolationVariables isolationVariables04;
00873
00874 showerShape.e1x5= egPhotonRef_[iphot]->e1x5();
00875 showerShape.e2x5= egPhotonRef_[iphot]->e2x5();
00876 showerShape.e3x3= egPhotonRef_[iphot]->e3x3();
00877 showerShape.e5x5= egPhotonRef_[iphot]->e5x5();
00878 showerShape.maxEnergyXtal = egPhotonRef_[iphot]->maxEnergyXtal();
00879 showerShape.sigmaEtaEta = egPhotonRef_[iphot]->sigmaEtaEta();
00880 showerShape.sigmaIetaIeta = egPhotonRef_[iphot]->sigmaIetaIeta();
00881 showerShape.hcalDepth1OverEcal = egPhotonRef_[iphot]->hadronicDepth1OverEm();
00882 showerShape.hcalDepth2OverEcal = egPhotonRef_[iphot]->hadronicDepth2OverEm();
00883 myPhoton.setShowerShapeVariables ( showerShape );
00884
00885 fiducialFlags.isEB = egPhotonRef_[iphot]->isEB();
00886 fiducialFlags.isEE = egPhotonRef_[iphot]->isEE();
00887 fiducialFlags.isEBEtaGap = egPhotonRef_[iphot]->isEBEtaGap();
00888 fiducialFlags.isEBPhiGap = egPhotonRef_[iphot]->isEBPhiGap();
00889 fiducialFlags.isEERingGap = egPhotonRef_[iphot]->isEERingGap();
00890 fiducialFlags.isEEDeeGap = egPhotonRef_[iphot]->isEEDeeGap();
00891 fiducialFlags.isEBEEGap = egPhotonRef_[iphot]->isEBEEGap();
00892 myPhoton.setFiducialVolumeFlags ( fiducialFlags );
00893
00894 isolationVariables03.ecalRecHitSumEt = egPhotonRef_[iphot]->ecalRecHitSumEtConeDR03();
00895 isolationVariables03.hcalTowerSumEt = egPhotonRef_[iphot]->hcalTowerSumEtConeDR03();
00896 isolationVariables03.hcalDepth1TowerSumEt = egPhotonRef_[iphot]->hcalDepth1TowerSumEtConeDR03();
00897 isolationVariables03.hcalDepth2TowerSumEt = egPhotonRef_[iphot]->hcalDepth2TowerSumEtConeDR03();
00898 isolationVariables03.trkSumPtSolidCone = egPhotonRef_[iphot]->trkSumPtSolidConeDR03();
00899 isolationVariables03.trkSumPtHollowCone = egPhotonRef_[iphot]->trkSumPtHollowConeDR03();
00900 isolationVariables03.nTrkSolidCone = egPhotonRef_[iphot]->nTrkSolidConeDR03();
00901 isolationVariables03.nTrkHollowCone = egPhotonRef_[iphot]->nTrkHollowConeDR03();
00902 isolationVariables04.ecalRecHitSumEt = egPhotonRef_[iphot]->ecalRecHitSumEtConeDR04();
00903 isolationVariables04.hcalTowerSumEt = egPhotonRef_[iphot]->hcalTowerSumEtConeDR04();
00904 isolationVariables04.hcalDepth1TowerSumEt = egPhotonRef_[iphot]->hcalDepth1TowerSumEtConeDR04();
00905 isolationVariables04.hcalDepth2TowerSumEt = egPhotonRef_[iphot]->hcalDepth2TowerSumEtConeDR04();
00906 isolationVariables04.trkSumPtSolidCone = egPhotonRef_[iphot]->trkSumPtSolidConeDR04();
00907 isolationVariables04.trkSumPtHollowCone = egPhotonRef_[iphot]->trkSumPtHollowConeDR04();
00908 isolationVariables04.nTrkSolidCone = egPhotonRef_[iphot]->nTrkSolidConeDR04();
00909 isolationVariables04.nTrkHollowCone = egPhotonRef_[iphot]->nTrkHollowConeDR04();
00910 myPhoton.setIsolationVariables(isolationVariables04, isolationVariables03);
00911
00912
00913
00914
00915 reco::Photon::PflowIsolationVariables myPFIso;
00916 myPFIso.chargedHadronIso=(*isolationValues[0])[CandidatePtr_[iphot]];
00917 myPFIso.photonIso=(*isolationValues[1])[CandidatePtr_[iphot]];
00918 myPFIso.neutralHadronIso=(*isolationValues[2])[CandidatePtr_[iphot]];
00919 myPhoton.setPflowIsolationVariables(myPFIso);
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978 photons.push_back(myPhoton);
00979
00980 }
00981
00982
00983 }
00984
00985
00986 const reco::PFCandidate & PFPhotonTranslator::correspondingDaughterCandidate(const reco::PFCandidate & cand, const reco::PFBlockElement & pfbe) const
00987 {
00988 unsigned refindex=pfbe.index();
00989
00990 reco::PFCandidate::const_iterator myDaughterCandidate=cand.begin();
00991 reco::PFCandidate::const_iterator itend=cand.end();
00992
00993 for(;myDaughterCandidate!=itend;++myDaughterCandidate)
00994 {
00995 const reco::PFCandidate * myPFCandidate = (const reco::PFCandidate*)&*myDaughterCandidate;
00996 if(myPFCandidate->elementsInBlocks().size()!=1)
00997 {
00998
00999 return cand;
01000 }
01001 if(myPFCandidate->elementsInBlocks()[0].second==refindex)
01002 {
01003
01004 return *myPFCandidate;
01005 }
01006 }
01007 return cand;
01008 }
01009