00001 #include <iostream>
00002
00003 #include "RecoEgamma/Examples/plugins/SimpleConvertedPhotonAnalyzer.h"
00004 #include "RecoEgamma/EgammaMCTools/interface/PhotonMCTruthFinder.h"
00005 #include "RecoEgamma/EgammaMCTools/interface/PhotonMCTruth.h"
00006 #include "RecoEgamma/EgammaMCTools/interface/ElectronMCTruth.h"
00007
00008 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
00009 #include "SimDataFormats/Track/interface/SimTrack.h"
00010 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
00011 #include "SimDataFormats/Vertex/interface/SimVertex.h"
00012 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
00013
00014 #include "FWCore/Framework/interface/Event.h"
00015 #include "FWCore/Framework/interface/EventSetup.h"
00016 #include "FWCore/Framework/interface/ESHandle.h"
00017 #include "FWCore/Framework/interface/MakerMacros.h"
00018 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00019 #include "FWCore/Utilities/interface/Exception.h"
00020
00021 #include "DataFormats/Common/interface/Handle.h"
00022 #include "DataFormats/TrackReco/interface/Track.h"
00023 #include "DataFormats/TrackReco/interface/TrackExtra.h"
00024 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00025 #include "DataFormats/EgammaCandidates/interface/Conversion.h"
00026 #include "DataFormats/EgammaCandidates/interface/ConversionFwd.h"
00027
00028 #include "DataFormats/CaloRecHit/interface/CaloCluster.h"
00029
00030 #include "MagneticField/Records/interface/IdealMagneticFieldRecord.h"
00031 #include "MagneticField/Engine/interface/MagneticField.h"
00032
00033
00034 #include "TFile.h"
00035 #include "TH1.h"
00036 #include "TH2.h"
00037 #include "TTree.h"
00038 #include "TVector3.h"
00039 #include "TProfile.h"
00040
00041
00042
00043
00044 using namespace std;
00045
00046
00047 SimpleConvertedPhotonAnalyzer::SimpleConvertedPhotonAnalyzer( const edm::ParameterSet& pset )
00048 : fOutputFileName_( pset.getUntrackedParameter<string>("HistOutFile",std::string("TestConversions.root")) ),
00049 fOutputFile_(0)
00050 {
00051
00052 convertedPhotonCollectionProducer_ = pset.getParameter<std::string>("phoProducer");
00053 convertedPhotonCollection_ = pset.getParameter<std::string>("convertedPhotonCollection");
00054
00055
00056
00057 }
00058
00059
00060
00061 SimpleConvertedPhotonAnalyzer::~SimpleConvertedPhotonAnalyzer() {
00062
00063
00064 delete thePhotonMCTruthFinder_;
00065
00066 }
00067
00068
00069 void SimpleConvertedPhotonAnalyzer::beginJob()
00070 {
00071
00072
00073 nEvt_=0;
00074 nMCPho_=0;
00075 nMatched_=0;
00076
00077
00078 thePhotonMCTruthFinder_ = new PhotonMCTruthFinder();
00079
00080 fOutputFile_ = new TFile( fOutputFileName_.c_str(), "RECREATE" ) ;
00081
00083 h_ErecoEMC_ = new TH1F("deltaE"," delta(reco-mc) energy",100,0.,2.);
00084 h_deltaPhi_ = new TH1F("deltaPhi"," delta(reco-mc) phi",100,-0.1, 0.1);
00085 h_deltaEta_ = new TH1F("deltaEta"," delta(reco-mc) eta",100,-0.05, 0.05);
00086
00088 h_MCphoE_ = new TH1F("MCphoE","MC photon energy",100,0.,100.);
00089 h_MCphoPhi_ = new TH1F("MCphoPhi","MC photon phi",40,-3.14, 3.14);
00090 h_MCphoEta_ = new TH1F("MCphoEta","MC photon eta",40,-3., 3.);
00091
00092
00094 h_MCConvE_ = new TH1F("MCConvE","MC converted photon energy",100,0.,100.);
00095 h_MCConvPt_ = new TH1F("MCConvPt","MC converted photon pt",100,0.,100.);
00096 h_MCConvEta_ = new TH1F("MCConvEta","MC converted photon eta",50, 0., 2.5);
00097
00099 h_scE_ = new TH1F("scE","Uncorrected converted photons : SC Energy ",100,0., 200.);
00100 h_scEta_ = new TH1F("scEta","Uncorrected converted photons: SC Eta ",40,-3., 3.);
00101 h_scPhi_ = new TH1F("scPhi","Uncorrected converted photons: SC Phi ",40, -3.14, 3.14);
00102
00103 h_phoE_ = new TH1F("phoE","Uncorrected converted photons : Energy ",100,0., 200.);
00104 h_phoEta_ = new TH1F("phoEta","Uncorrected converted photons: Eta ",40,-3., 3.);
00105 h_phoPhi_ = new TH1F("phoPhi","Uncorrected converted photons: Phi ",40, -3.14, 3.14);
00106
00107
00108 h2_tk_nHitsVsR_ = new TH2F("tknHitsVsR","Tracks Hits vs R ", 12,0.,120.,20,0.5, 20.5);
00109 h2_tk_inPtVsR_ = new TH2F("tkInPtvsR","Tracks inner Pt vs R ", 12,0.,120.,100,0., 100.);
00110
00111
00112 return ;
00113 }
00114
00115
00116 float SimpleConvertedPhotonAnalyzer::etaTransformation( float EtaParticle , float Zvertex) {
00117
00118
00119 const float PI = 3.1415927;
00120
00121
00122
00123 const float R_ECAL = 136.5;
00124 const float Z_Endcap = 328.0;
00125 const float etaBarrelEndcap = 1.479;
00126
00127
00128
00129 float Theta = 0.0 ;
00130 float ZEcal = R_ECAL*sinh(EtaParticle)+Zvertex;
00131
00132 if(ZEcal != 0.0) Theta = atan(R_ECAL/ZEcal);
00133 if(Theta<0.0) Theta = Theta+PI ;
00134 float ETA = - log(tan(0.5*Theta));
00135
00136 if( fabs(ETA) > etaBarrelEndcap )
00137 {
00138 float Zend = Z_Endcap ;
00139 if(EtaParticle<0.0 ) Zend = -Zend ;
00140 float Zlen = Zend - Zvertex ;
00141 float RR = Zlen/sinh(EtaParticle);
00142 Theta = atan(RR/Zend);
00143 if(Theta<0.0) Theta = Theta+PI ;
00144 ETA = - log(tan(0.5*Theta));
00145 }
00146
00147 return ETA;
00148
00149 }
00150
00151
00152
00153
00154
00155
00156 void SimpleConvertedPhotonAnalyzer::analyze( const edm::Event& e, const edm::EventSetup& )
00157 {
00158
00159
00160 using namespace edm;
00161 const float etaPhiDistance=0.01;
00162
00163
00164 const float BARL = 1.4442;
00165 const float END_LO = 1.566;
00166 const float END_HI = 2.5;
00167
00168
00169
00170
00171 nEvt_++;
00172 LogInfo("ConvertedPhotonAnalyzer") << "ConvertedPhotonAnalyzer Analyzing event number: " << e.id() << " Global Counter " << nEvt_ <<"\n";
00173
00174 std::cout << "ConvertedPhotonAnalyzer Analyzing event number: " << e.id() << " Global Counter " << nEvt_ <<"\n";
00175
00176
00178 Handle<reco::ConversionCollection> convertedPhotonHandle;
00179 e.getByLabel(convertedPhotonCollectionProducer_, convertedPhotonCollection_ , convertedPhotonHandle);
00180 const reco::ConversionCollection phoCollection = *(convertedPhotonHandle.product());
00181 std::cout << "ConvertedPhotonAnalyzer Converted photon collection size " << phoCollection.size() << "\n";
00182
00183
00185 std::cout << " ConvertedPhotonAnalyzer Looking for MC truth " << "\n";
00186
00187
00188 std::vector<SimTrack> theSimTracks;
00189 std::vector<SimVertex> theSimVertices;
00190
00191 edm::Handle<SimTrackContainer> SimTk;
00192 edm::Handle<SimVertexContainer> SimVtx;
00193 e.getByLabel("g4SimHits",SimTk);
00194 e.getByLabel("g4SimHits",SimVtx);
00195
00196 theSimTracks.insert(theSimTracks.end(),SimTk->begin(),SimTk->end());
00197 theSimVertices.insert(theSimVertices.end(),SimVtx->begin(),SimVtx->end());
00198
00199 std::vector<PhotonMCTruth> mcPhotons=thePhotonMCTruthFinder_->find (theSimTracks, theSimVertices);
00200 std::cout << " ConvertedPhotonAnalyzer mcPhotons size " << mcPhotons.size() << std::endl;
00201
00202
00203
00204
00205
00206
00207
00208
00209 for ( std::vector<PhotonMCTruth>::const_iterator mcPho=mcPhotons.begin(); mcPho !=mcPhotons.end(); mcPho++) {
00210 float mcPhi= (*mcPho).fourMomentum().phi();
00211 float mcEta= (*mcPho).fourMomentum().pseudoRapidity();
00212 mcEta = etaTransformation(mcEta, (*mcPho).primaryVertex().z() );
00213
00214 if ( ! ( fabs(mcEta) <= BARL || ( fabs(mcEta) >= END_LO && fabs(mcEta) <=END_HI ) ) ) {
00215 continue;
00216 }
00217
00218
00219 std::cout << " ConvertedPhotonAnalyzer MC Photons before matching " << std::endl;
00220 std::cout << " ConvertedPhotonAnalyzer Photons isAconversion " << (*mcPho).isAConversion() << " mcMatchingPhoton energy " << (*mcPho).fourMomentum().e() << " conversion vertex R " << (*mcPho).vertex().perp() << " Z " << (*mcPho).vertex().z() << " x " << (*mcPho).vertex().x() << " y " <<(*mcPho).vertex().y() << " z " << (*mcPho).vertex().z() << std::endl;
00221 std::cout << " ConvertedPhotonAnalyzer mcEta " << mcEta<< " mcPhi " << mcPhi << std::endl;
00222
00223
00224 h_MCphoE_->Fill( (*mcPho).fourMomentum().e());
00225 h_MCphoEta_->Fill( (*mcPho).fourMomentum().eta());
00226 h_MCphoPhi_->Fill( (*mcPho).fourMomentum().phi());
00227
00228
00229
00230
00231 if ( (*mcPho).isAConversion() == 0 ) continue;
00232
00233
00234 nMCPho_++;
00235
00236 h_MCConvEta_ ->Fill ( fabs( (*mcPho).fourMomentum().pseudoRapidity()) - 0.001);
00237
00238
00239 bool REJECTED;
00240
00241
00243 std::cout << " ConvertedPhotonAnalyzer Starting loop over photon candidates " << "\n";
00244 for( reco::ConversionCollection::const_iterator iPho = phoCollection.begin(); iPho != phoCollection.end(); iPho++) {
00245 REJECTED=false;
00246
00247 std::cout << " ConvertedPhotonAnalyzer Reco SC energy " << (*iPho).caloCluster()[0]->energy() << "\n";
00248
00249
00250
00251 float phiClu=(*iPho).caloCluster()[0]->phi();
00252 float etaClu=(*iPho).caloCluster()[0]->eta();
00253 float deltaPhi = phiClu-mcPhi;
00254 float deltaEta = etaClu-mcEta;
00255
00256
00257 if ( deltaPhi > Geom::pi() ) deltaPhi -= Geom::twoPi();
00258 if ( deltaPhi < -Geom::pi() ) deltaPhi += Geom::twoPi();
00259 deltaPhi=std::pow(deltaPhi,2);
00260 deltaEta=std::pow(deltaEta,2);
00261 float delta = deltaPhi+deltaEta ;
00262 if ( delta >= etaPhiDistance ) REJECTED=true;
00263
00264
00265
00266
00267 if ( REJECTED ) continue;
00268 std::cout << " MATCHED " << std::endl;
00269 nMatched_++;
00270
00271
00272 std::cout << " ConvertedPhotonAnalyzer Matching candidate " << std::endl;
00273
00274 std::cout << " ConvertedPhotonAnalyzer Photons isAconversion " << (*mcPho).isAConversion() << " mcMatchingPhoton energy " << (*mcPho).fourMomentum().e() << " ConvertedPhotonAnalyzer conversion vertex R " << (*mcPho).vertex().perp() << " Z " << (*mcPho).vertex().z() << std::endl;
00275
00276
00277 h_ErecoEMC_->Fill( (*iPho).caloCluster()[0]->energy()/(*mcPho).fourMomentum().e());
00278 h_deltaPhi_-> Fill ( (*iPho).caloCluster()[0]->position().phi()- mcPhi);
00279 h_deltaEta_-> Fill ( (*iPho).caloCluster()[0]->position().eta()- mcEta);
00280
00281 h_scE_->Fill( (*iPho).caloCluster()[0]->energy() );
00282 h_scEta_->Fill( (*iPho).caloCluster()[0]->position().eta() );
00283 h_scPhi_->Fill( (*iPho).caloCluster()[0]->position().phi() );
00284
00285
00286 for (unsigned int i=0; i<(*iPho).tracks().size(); i++) {
00287 std::cout << " ConvertedPhotonAnalyzer Reco Track charge " << (*iPho).tracks()[i]->charge() << " Num of RecHits " << (*iPho).tracks()[i]->recHitsSize() << " inner momentum " << sqrt ( (*iPho).tracks()[i]->innerMomentum().Mag2() ) << "\n";
00288
00289
00290 h2_tk_nHitsVsR_ -> Fill ( (*mcPho).vertex().perp(), (*iPho).tracks()[i]->recHitsSize() );
00291 h2_tk_inPtVsR_->Fill ( (*mcPho).vertex().perp(), sqrt( (*iPho).tracks()[i]->innerMomentum().Mag2() ) );
00292
00293
00294 }
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304 }
00305
00306 }
00307
00308
00309 }
00310
00311
00312
00313
00314 void SimpleConvertedPhotonAnalyzer::endJob()
00315 {
00316
00317
00318
00319
00320 fOutputFile_->Write() ;
00321 fOutputFile_->Close() ;
00322
00323 edm::LogInfo("ConvertedPhotonAnalyzer") << "Analyzed " << nEvt_ << "\n";
00324
00325 std::cout << "ConvertedPhotonAnalyzer::endJob Analyzed " << nEvt_ << " events " << "\n";
00326
00327 return ;
00328 }
00329
00330
00331