00001 #ifndef RESOLUTIONANALYZER_CC
00002 #define RESOLUTIONANALYZER_CC
00003
00004 #include "ResolutionAnalyzer.h"
00005 #include "MuonAnalysis/MomentumScaleCalibration/interface/Functions.h"
00006 #include "MuonAnalysis/MomentumScaleCalibration/interface/RootTreeHandler.h"
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 ResolutionAnalyzer::ResolutionAnalyzer(const edm::ParameterSet& iConfig) :
00020 theMuonLabel_( iConfig.getParameter<edm::InputTag>( "MuonLabel" ) ),
00021 theMuonType_( iConfig.getParameter<int>( "MuonType" ) ),
00022 theRootFileName_( iConfig.getUntrackedParameter<std::string>("OutputFileName") ),
00023 theCovariancesRootFileName_( iConfig.getUntrackedParameter<std::string>("InputFileName") ),
00024 debug_( iConfig.getUntrackedParameter<bool>( "Debug" ) ),
00025 resonance_( iConfig.getParameter<bool>("Resonance") ),
00026 readCovariances_( iConfig.getParameter<bool>( "ReadCovariances" ) ),
00027 treeFileName_( iConfig.getParameter<std::string>("InputTreeName") ),
00028 maxEvents_( iConfig.getParameter<int>("MaxEvents") ),
00029 ptMax_( iConfig.getParameter<double>("PtMax") )
00030 {
00031
00032
00033
00034
00035 int resolFitType = iConfig.getParameter<int>("ResolFitType");
00036 MuScleFitUtils::ResolFitType = resolFitType;
00037
00038 MuScleFitUtils::resolutionFunction = resolutionFunctionService( resolFitType );
00039
00040 MuScleFitUtils::resolutionFunctionForVec = resolutionFunctionVecService( resolFitType );
00041
00042 MuScleFitUtils::parResol = iConfig.getParameter<std::vector<double> >("parResol");
00043
00044 MuScleFitUtils::resfind = iConfig.getParameter<std::vector<int> >("ResFind");
00045
00046 outputFile_ = new TFile(theRootFileName_.c_str(), "RECREATE");
00047 outputFile_->cd();
00048 fillHistoMap();
00049
00050 eventCounter_ = 0;
00051 }
00052
00053
00054 ResolutionAnalyzer::~ResolutionAnalyzer()
00055 {
00056 outputFile_->cd();
00057 writeHistoMap();
00058 outputFile_->Close();
00059 std::cout << "Total analyzed events = " << eventCounter_ << std::endl;
00060 }
00061
00062
00063
00064
00065
00066
00067
00068 void ResolutionAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
00069 using namespace edm;
00070
00071 std::cout << "starting" << std::endl;
00072
00073 lorentzVector nullLorentzVector(0, 0, 0, 0);
00074
00075 RootTreeHandler rootTreeHandler;
00076 typedef std::vector<std::pair<lorentzVector,lorentzVector> > MuonPairVector;
00077 MuonPairVector savedPairVector;
00078 MuonPairVector genPairVector;
00079
00080 std::vector<std::pair<int, int> > evtRun;
00081 rootTreeHandler.readTree(maxEvents_, treeFileName_, &savedPairVector, 0, &evtRun, &genPairVector);
00082 MuonPairVector::iterator savedPair = savedPairVector.begin();
00083 MuonPairVector::iterator genPair = genPairVector.begin();
00084 std::cout << "Starting loop on " << savedPairVector.size() << " muons" << std::endl;
00085 for( ; savedPair != savedPairVector.end(); ++savedPair, ++genPair ) {
00086
00087 ++eventCounter_;
00088
00089 if( (eventCounter_ % 10000) == 0 ) {
00090 std::cout << "event = " << eventCounter_ << std::endl;
00091 }
00092
00093 lorentzVector recMu1( savedPair->first );
00094 lorentzVector recMu2( savedPair->second );
00095
00096 if ( resonance_ ) {
00097
00098
00099
00100
00101 reco::Particle::LorentzVector genMother( genPair->first + genPair->second );
00102
00103 mapHisto_["GenMother"]->Fill( genMother );
00104 mapHisto_["DeltaGenMotherMuons"]->Fill( genPair->first, genPair->second );
00105 mapHisto_["GenMotherMuons"]->Fill( genPair->first );
00106 mapHisto_["GenMotherMuons"]->Fill( genPair->second );
00107
00108
00109
00110 if(checkDeltaR(genPair->first,recMu1)){
00111 mapHisto_["PtResolutionGenVSMu"]->Fill(recMu1,(-genPair->first.Pt()+recMu1.Pt())/genPair->first.Pt(),-1);
00112 mapHisto_["ThetaResolutionGenVSMu"]->Fill(recMu1,(-genPair->first.Theta()+recMu1.Theta()),-1);
00113 mapHisto_["CotgThetaResolutionGenVSMu"]->Fill(recMu1,(-cos(genPair->first.Theta())/sin(genPair->first.Theta())
00114 +cos(recMu1.Theta())/sin(recMu1.Theta())),-1);
00115 mapHisto_["EtaResolutionGenVSMu"]->Fill(recMu1,(-genPair->first.Eta()+recMu1.Eta()),-1);
00116
00117 mapHisto_["PhiResolutionGenVSMu"]->Fill(recMu1,MuScleFitUtils::deltaPhiNoFabs(recMu1.Phi(), genPair->first.Phi()),-1);
00118 recoPtVsgenPt_->Fill(genPair->first.Pt(), recMu1.Pt());
00119 deltaPtOverPt_->Fill( (recMu1.Pt() - genPair->first.Pt())/genPair->first.Pt() );
00120 if( fabs(recMu1.Eta()) > 1 && fabs(recMu1.Eta()) < 1.2 ) {
00121 recoPtVsgenPtEta12_->Fill(genPair->first.Pt(), recMu1.Pt());
00122 deltaPtOverPtForEta12_->Fill( (recMu1.Pt() - genPair->first.Pt())/genPair->first.Pt() );
00123 }
00124 }
00125 if(checkDeltaR(genPair->second,recMu2)){
00126 mapHisto_["PtResolutionGenVSMu"]->Fill(recMu2,(-genPair->second.Pt()+recMu2.Pt())/genPair->second.Pt(),+1);
00127 mapHisto_["ThetaResolutionGenVSMu"]->Fill(recMu2,(-genPair->second.Theta()+recMu2.Theta()),+1);
00128 mapHisto_["CotgThetaResolutionGenVSMu"]->Fill(recMu2,(-cos(genPair->second.Theta())/sin(genPair->second.Theta())
00129 +cos(recMu2.Theta())/sin(recMu2.Theta())),+1);
00130 mapHisto_["EtaResolutionGenVSMu"]->Fill(recMu2,(-genPair->second.Eta()+recMu2.Eta()),+1);
00131
00132 mapHisto_["PhiResolutionGenVSMu"]->Fill(recMu2,MuScleFitUtils::deltaPhiNoFabs(recMu2.Phi(), genPair->second.Phi()),+1);
00133 recoPtVsgenPt_->Fill(genPair->second.Pt(), recMu2.Pt());
00134 deltaPtOverPt_->Fill( (recMu2.Pt() - genPair->second.Pt())/genPair->second.Pt() );
00135 if( fabs(recMu2.Eta()) > 1 && fabs(recMu2.Eta()) < 1.2 ) {
00136 recoPtVsgenPtEta12_->Fill(genPair->second.Pt(), recMu2.Pt());
00137 deltaPtOverPtForEta12_->Fill( (recMu2.Pt() - genPair->second.Pt())/genPair->second.Pt() );
00138 }
00139 }
00140
00141
00142
00143
00144
00145 if( genPair->first != nullLorentzVector && genPair->second != nullLorentzVector &&
00146 checkDeltaR(genPair->first,recMu1) && checkDeltaR(genPair->second,recMu2) ) {
00147
00148 double recoMass = (recMu1+recMu2).mass();
00149 double genMass = (genPair->first + genPair->second).mass();
00150
00151 mapHisto_["MassResolution"]->Fill(recMu1, -1, genPair->first, recMu2, +1, genPair->second, recoMass, genMass);
00152
00153
00154 reco::Particle::LorentzVector recoResonance( recMu1+recMu2 );
00155 mapHisto_["RecoResonance"]->Fill( recoResonance );
00156 mapHisto_["DeltaRecoResonanceMuons"]->Fill( recMu1, recMu2 );
00157 mapHisto_["RecoResonanceMuons"]->Fill( recMu1 );
00158 mapHisto_["RecoResonanceMuons"]->Fill( recMu2 );
00159
00160
00161 if( genMass != 0 ) {
00162
00163 double diffMass = recoMass - genMass;
00164
00165 double pt1 = recMu1.pt();
00166 double eta1 = recMu1.eta();
00167 double pt2 = recMu2.pt();
00168 double eta2 = recMu2.eta();
00169
00170 if( diffMass == diffMass ) {
00171 massResolutionVsPtEta_->Fill(pt1, eta1, diffMass, diffMass);
00172 massResolutionVsPtEta_->Fill(pt2, eta2, diffMass, diffMass);
00173 }
00174 else {
00175 std::cout << "Error, there is a nan: recoMass = " << recoMass << ", genMass = " << genMass << std::endl;
00176 }
00177
00178 double massRes = MuScleFitUtils::massResolution(recMu1, recMu2, MuScleFitUtils::parResol);
00179
00180
00181 mapHisto_["hFunctionResolMass"]->Fill( recMu1, std::pow(massRes,2), -1 );
00182 mapHisto_["hFunctionResolMass"]->Fill( recMu2, std::pow(massRes,2), +1 );
00183 }
00184
00185
00186 mapHisto_["hFunctionResolPt"]->Fill( recMu1, MuScleFitUtils::resolutionFunctionForVec->sigmaPt(recMu1.Pt(), recMu1.Eta(), MuScleFitUtils::parResol), -1 );
00187 mapHisto_["hFunctionResolCotgTheta"]->Fill( recMu1, MuScleFitUtils::resolutionFunctionForVec->sigmaCotgTh(recMu1.Pt(), recMu1.Eta(), MuScleFitUtils::parResol), -1 );
00188 mapHisto_["hFunctionResolPhi"]->Fill( recMu1, MuScleFitUtils::resolutionFunctionForVec->sigmaPhi(recMu1.Pt(), recMu1.Eta(), MuScleFitUtils::parResol), -1 );
00189 mapHisto_["hFunctionResolPt"]->Fill( recMu2, MuScleFitUtils::resolutionFunctionForVec->sigmaPt(recMu2.Pt(), recMu2.Eta(), MuScleFitUtils::parResol), +1 );
00190 mapHisto_["hFunctionResolCotgTheta"]->Fill( recMu2, MuScleFitUtils::resolutionFunctionForVec->sigmaCotgTh(recMu2.Pt(), recMu2.Eta(), MuScleFitUtils::parResol), +1 );
00191 mapHisto_["hFunctionResolPhi"]->Fill( recMu2, MuScleFitUtils::resolutionFunctionForVec->sigmaPhi(recMu2.Pt(), recMu2.Eta(), MuScleFitUtils::parResol), +1 );
00192
00193 if( readCovariances_ ) {
00194
00195
00196 double mass = (recMu1+recMu2).mass();
00197 double pt1 = recMu1.Pt();
00198 double phi1 = recMu1.Phi();
00199 double eta1 = recMu1.Eta();
00200 double theta1 = 2*atan(exp(-eta1));
00201 double pt2 = recMu2.Pt();
00202 double phi2 = recMu2.Phi();
00203 double eta2 = recMu2.Eta();
00204 double theta2 = 2*atan(exp(-eta2));
00205
00206 double mMu2 = MuScleFitUtils::mMu2;
00207 double dmdpt1 = (pt1/std::pow(sin(theta1),2)*sqrt((std::pow(pt2/sin(theta2),2)+mMu2)/(std::pow(pt1/sin(theta1),2)+mMu2))-
00208 pt2*(cos(phi1-phi2)+cos(theta1)*cos(theta2)/(sin(theta1)*sin(theta2))))/mass;
00209 double dmdpt2 = (pt2/std::pow(sin(theta2),2)*sqrt((std::pow(pt1/sin(theta1),2)+mMu2)/(std::pow(pt2/sin(theta2),2)+mMu2))-
00210 pt1*(cos(phi2-phi1)+cos(theta2)*cos(theta1)/(sin(theta2)*sin(theta1))))/mass;
00211 double dmdphi1 = pt1*pt2/mass*sin(phi1-phi2);
00212 double dmdphi2 = pt2*pt1/mass*sin(phi2-phi1);
00213 double dmdcotgth1 = (pt1*pt1*cos(theta1)/sin(theta1)*
00214 sqrt((std::pow(pt2/sin(theta2),2)+mMu2)/(std::pow(pt1/sin(theta1),2)+mMu2)) -
00215 pt1*pt2*cos(theta2)/sin(theta2))/mass;
00216 double dmdcotgth2 = (pt2*pt2*cos(theta2)/sin(theta2)*
00217 sqrt((std::pow(pt1/sin(theta1),2)+mMu2)/(std::pow(pt2/sin(theta2),2)+mMu2)) -
00218 pt2*pt1*cos(theta1)/sin(theta1))/mass;
00219
00220
00221
00222 double dmdpt[2] = {dmdpt1*recMu1.Pt(), dmdpt2*recMu2.Pt()};
00223 double dmdphi[2] = {dmdphi1, dmdphi2};
00224 double dmdcotgth[2] = {dmdcotgth1, dmdcotgth2};
00225
00226
00227
00228 reco::Particle::LorentzVector * recMu[2] = { &recMu1, &recMu2 };
00229 int charge[2] = { -1, +1 };
00230
00231 double fullMassRes = 0.;
00232 double massRes1 = 0.;
00233 double massRes2 = 0.;
00234 double massRes3 = 0.;
00235 double massRes4 = 0.;
00236 double massRes5 = 0.;
00237 double massRes6 = 0.;
00238 double massResPtAndPt12 = 0.;
00239
00240 for( int i=0; i<2; ++i ) {
00241
00242 double ptVariance = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Pt");
00243 double cotgThetaVariance = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "CotgTheta");
00244 double phiVariance = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Phi");
00245 double pt_cotgTheta = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Pt-CotgTheta");
00246 double pt_phi = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Pt-Phi");
00247 double cotgTheta_phi = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "CotgTheta-Phi");
00248
00249 double pt1_pt2 = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Pt1-Pt2");
00250 double cotgTheta1_cotgTheta2 = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "CotgTheta1-CotgTheta2");
00251 double phi1_phi2 = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Phi1-Phi2");
00252 double pt12_cotgTheta21 = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Pt12-CotgTheta21");
00253 double pt12_phi21 = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "Pt12-Phi21");
00254 double cotgTheta12_phi21 = mapHisto_["ReadCovariances"]->Get(*(recMu[i]), "CotgTheta12-Phi21");
00255
00256
00257 mapHisto_["MassResolutionPt"]->Fill( *(recMu[i]), ptVariance*std::pow(dmdpt[i],2), charge[i] );
00258 mapHisto_["MassResolutionCotgTheta"]->Fill( *(recMu[i]), cotgThetaVariance*std::pow(dmdcotgth[i],2), charge[i] );
00259 mapHisto_["MassResolutionPhi"]->Fill( *(recMu[i]), phiVariance*std::pow(dmdphi[i],2), charge[i] );
00260 mapHisto_["MassResolutionPt-CotgTheta"]->Fill( *(recMu[i]), 2*pt_cotgTheta*dmdpt[i]*dmdcotgth[i], charge[i] );
00261 mapHisto_["MassResolutionPt-Phi"]->Fill( *(recMu[i]), 2*pt_phi*dmdpt[i]*dmdphi[i], charge[i] );
00262 mapHisto_["MassResolutionCotgTheta-Phi"]->Fill( *(recMu[i]), 2*cotgTheta_phi*dmdcotgth[i]*dmdphi[i], charge[i] );
00263
00264 mapHisto_["MassResolutionPt1-Pt2"]->Fill( *(recMu[i]), pt1_pt2*dmdpt[0]*dmdpt[1], charge[i] );
00265 mapHisto_["MassResolutionCotgTheta1-CotgTheta2"]->Fill( *(recMu[i]), cotgTheta1_cotgTheta2*dmdcotgth[0]*dmdcotgth[1], charge[i] );
00266 mapHisto_["MassResolutionPhi1-Phi2"]->Fill( *(recMu[i]), phi1_phi2*dmdphi[0]*dmdphi[1], charge[i] );
00267
00268 mapHisto_["MassResolutionPt12-CotgTheta21"]->Fill( *(recMu[i]), pt12_cotgTheta21*dmdpt[0]*dmdcotgth[1], charge[i] );
00269 mapHisto_["MassResolutionPt12-CotgTheta21"]->Fill( *(recMu[i]), pt12_cotgTheta21*dmdpt[1]*dmdcotgth[0], charge[i] );
00270 mapHisto_["MassResolutionPt12-Phi21"]->Fill( *(recMu[i]), pt12_phi21*dmdpt[0]*dmdphi[1], charge[i] );
00271 mapHisto_["MassResolutionPt12-Phi21"]->Fill( *(recMu[i]), pt12_phi21*dmdpt[1]*dmdphi[0], charge[i] );
00272 mapHisto_["MassResolutionCotgTheta12-Phi21"]->Fill( *(recMu[i]), cotgTheta12_phi21*dmdcotgth[0]*dmdphi[1], charge[i] );
00273 mapHisto_["MassResolutionCotgTheta12-Phi21"]->Fill( *(recMu[i]), cotgTheta12_phi21*dmdcotgth[1]*dmdphi[0], charge[i] );
00274
00275
00276 mapHisto_["sigmaPtFromVariance"]->Fill( *(recMu[i]), sqrt(ptVariance), charge[i] );
00277 mapHisto_["sigmaCotgThetaFromVariance"]->Fill( *(recMu[i]), sqrt(cotgThetaVariance), charge[i] );
00278 mapHisto_["sigmaPhiFromVariance"]->Fill( *(recMu[i]), sqrt(phiVariance), charge[i] );
00279
00280
00281 mapHisto_["MassResolutionPtFromFunction"]->Fill( *(recMu[i]), ( MuScleFitUtils::resolutionFunctionForVec->sigmaPt((recMu[i])->Pt(), (recMu[i])->Eta(), MuScleFitUtils::parResol) )*std::pow(dmdpt[i],2), charge[i] );
00282
00283 fullMassRes +=
00284 ptVariance*std::pow(dmdpt[i],2) +
00285 cotgThetaVariance*std::pow(dmdcotgth[i],2) +
00286 phiVariance*std::pow(dmdphi[i],2) +
00287
00288
00289 2*pt_cotgTheta*dmdpt[i]*dmdcotgth[i] +
00290 2*pt_phi*dmdpt[i]*dmdphi[i] +
00291 2*cotgTheta_phi*dmdcotgth[i]*dmdphi[i] +
00292
00293 pt1_pt2*dmdpt[0]*dmdpt[1] +
00294 cotgTheta1_cotgTheta2*dmdcotgth[0]*dmdcotgth[1] +
00295 phi1_phi2*dmdphi[0]*dmdphi[1] +
00296
00297
00298 pt12_cotgTheta21*dmdpt[0]*dmdcotgth[1] +
00299 pt12_cotgTheta21*dmdpt[1]*dmdcotgth[0] +
00300 pt12_phi21*dmdpt[0]*dmdphi[1] +
00301 pt12_phi21*dmdpt[1]*dmdphi[0] +
00302 cotgTheta12_phi21*dmdcotgth[0]*dmdphi[1] +
00303 cotgTheta12_phi21*dmdcotgth[1]*dmdphi[0];
00304
00305 massRes1 += ptVariance*std::pow(dmdpt[i],2);
00306 massRes2 += ptVariance*std::pow(dmdpt[i],2) +
00307 cotgThetaVariance*std::pow(dmdcotgth[i],2);
00308 massRes3 += ptVariance*std::pow(dmdpt[i],2) +
00309 cotgThetaVariance*std::pow(dmdcotgth[i],2) +
00310 phiVariance*std::pow(dmdphi[i],2);
00311 massRes4 += ptVariance*std::pow(dmdpt[i],2) +
00312 cotgThetaVariance*std::pow(dmdcotgth[i],2) +
00313 phiVariance*std::pow(dmdphi[i],2) +
00314 pt1_pt2*dmdpt[0]*dmdpt[1] +
00315 2*pt_cotgTheta*dmdpt[i]*dmdcotgth[i] +
00316 2*pt_phi*dmdpt[i]*dmdphi[i] +
00317 2*cotgTheta_phi*dmdcotgth[i]*dmdphi[i];
00318 massRes5 += ptVariance*std::pow(dmdpt[i],2) +
00319 cotgThetaVariance*std::pow(dmdcotgth[i],2) +
00320 phiVariance*std::pow(dmdphi[i],2) +
00321 pt1_pt2*dmdpt[0]*dmdpt[1] +
00322 2*pt_cotgTheta*dmdpt[i]*dmdcotgth[i] +
00323 2*pt_phi*dmdpt[i]*dmdphi[i] +
00324 2*cotgTheta_phi*dmdcotgth[i]*dmdphi[i] +
00325 cotgTheta1_cotgTheta2*dmdcotgth[0]*dmdcotgth[1] +
00326 phi1_phi2*dmdphi[0]*dmdphi[1];
00327 massRes6 += ptVariance*std::pow(dmdpt[i],2) +
00328 cotgThetaVariance*std::pow(dmdcotgth[i],2) +
00329 phiVariance*std::pow(dmdphi[i],2) +
00330 pt1_pt2*dmdpt[0]*dmdpt[1] +
00331 2*pt_cotgTheta*dmdpt[i]*dmdcotgth[i] +
00332 2*pt_phi*dmdpt[i]*dmdphi[i] +
00333 2*cotgTheta_phi*dmdcotgth[i]*dmdphi[i] +
00334 cotgTheta1_cotgTheta2*dmdcotgth[0]*dmdcotgth[1] +
00335 phi1_phi2*dmdphi[0]*dmdphi[1] +
00336 pt12_cotgTheta21*dmdpt[0]*dmdcotgth[1] +
00337 pt12_cotgTheta21*dmdpt[1]*dmdcotgth[0] +
00338 pt12_phi21*dmdpt[0]*dmdphi[1] +
00339 pt12_phi21*dmdpt[1]*dmdphi[0] +
00340 cotgTheta12_phi21*dmdcotgth[0]*dmdphi[1] +
00341 cotgTheta12_phi21*dmdcotgth[1]*dmdphi[0];
00342
00343 massResPtAndPt12 += ptVariance*std::pow(dmdpt[i],2) + pt1_pt2*dmdpt[0]*dmdpt[1];
00344
00345
00346 mapHisto_["DerivativePt"]->Fill( *(recMu[i]), dmdpt[i], charge[i] );
00347 mapHisto_["DerivativeCotgTheta"]->Fill( *(recMu[i]), dmdcotgth[i], charge[i] );
00348 mapHisto_["DerivativePhi"]->Fill( *(recMu[i]), dmdphi[i], charge[i] );
00349 }
00350
00351 mapHisto_["FullMassResolution"]->Fill( *(recMu[0]), fullMassRes, charge[0]);
00352 mapHisto_["FullMassResolution"]->Fill( *(recMu[1]), fullMassRes, charge[1]);
00353
00354 mapHisto_["MassRes1"]->Fill( *(recMu[0]), massRes1, charge[0] );
00355 mapHisto_["MassRes1"]->Fill( *(recMu[1]), massRes1, charge[1] );
00356 mapHisto_["MassRes2"]->Fill( *(recMu[0]), massRes2, charge[0] );
00357 mapHisto_["MassRes2"]->Fill( *(recMu[1]), massRes2, charge[1] );
00358 mapHisto_["MassRes3"]->Fill( *(recMu[0]), massRes3, charge[0] );
00359 mapHisto_["MassRes3"]->Fill( *(recMu[1]), massRes3, charge[1] );
00360 mapHisto_["MassRes4"]->Fill( *(recMu[0]), massRes4, charge[0] );
00361 mapHisto_["MassRes4"]->Fill( *(recMu[1]), massRes4, charge[1] );
00362 mapHisto_["MassRes5"]->Fill( *(recMu[0]), massRes5, charge[0] );
00363 mapHisto_["MassRes5"]->Fill( *(recMu[1]), massRes5, charge[1] );
00364 mapHisto_["MassRes6"]->Fill( *(recMu[0]), massRes6, charge[0] );
00365 mapHisto_["MassRes6"]->Fill( *(recMu[1]), massRes6, charge[1] );
00366 mapHisto_["MassResPtAndPt12"]->Fill( *(recMu[0]), massResPtAndPt12, charge[0] );
00367 mapHisto_["MassResPtAndPt12"]->Fill( *(recMu[1]), massResPtAndPt12, charge[1] );
00368 }
00369 else {
00370
00371 mapHisto_["Covariances"]->Fill(recMu1, genPair->first, recMu2, genPair->second);
00372 }
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
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418 }
00419
00420 void ResolutionAnalyzer::fillHistoMap() {
00421
00422 outputFile_->cd();
00423
00424
00425
00426 double minMass = 0.;
00427 double maxMass = 200.;
00428 if( MuScleFitUtils::resfind[0] != 1 ) {
00429 maxMass = 30.;
00430 }
00431 mapHisto_["GenMother"] = new HParticle(outputFile_, "GenMother", minMass, maxMass);
00432 mapHisto_["SimResonance"] = new HParticle(outputFile_, "SimResonance", minMass, maxMass);
00433 mapHisto_["RecoResonance"] = new HParticle(outputFile_, "RecoResonance", minMass, maxMass);
00434
00435
00436 mapHisto_["GenMotherMuons"] = new HParticle(outputFile_, "GenMotherMuons", minMass, 1.);
00437 mapHisto_["SimResonanceMuons"] = new HParticle(outputFile_, "SimResonanceMuons", minMass, 1.);
00438 mapHisto_["RecoResonanceMuons"] = new HParticle(outputFile_, "RecoResonanceMuons", minMass, 1.);
00439
00440
00441 mapHisto_["DeltaGenMotherMuons"] = new HDelta (outputFile_, "DeltaGenMotherMuons");
00442 mapHisto_["DeltaSimResonanceMuons"] = new HDelta (outputFile_, "DeltaSimResonanceMuons");
00443 mapHisto_["DeltaRecoResonanceMuons"] = new HDelta (outputFile_, "DeltaRecoResonanceMuons");
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457 mapHisto_["PtResolutionGenVSMu"] = new HResolutionVSPart (outputFile_, "PtResolutionGenVSMu");
00458 mapHisto_["PtResolutionSimVSMu"] = new HResolutionVSPart (outputFile_, "PtResolutionSimVSMu");
00459 mapHisto_["EtaResolutionGenVSMu"] = new HResolutionVSPart (outputFile_, "EtaResolutionGenVSMu");
00460 mapHisto_["EtaResolutionSimVSMu"] = new HResolutionVSPart (outputFile_, "EtaResolutionSimVSMu");
00461 mapHisto_["ThetaResolutionGenVSMu"] = new HResolutionVSPart (outputFile_, "ThetaResolutionGenVSMu");
00462 mapHisto_["ThetaResolutionSimVSMu"] = new HResolutionVSPart (outputFile_, "ThetaResolutionSimVSMu");
00463 mapHisto_["CotgThetaResolutionGenVSMu"] = new HResolutionVSPart (outputFile_, "CotgThetaResolutionGenVSMu", -0.02, 0.02, -0.02, 0.02);
00464 mapHisto_["CotgThetaResolutionSimVSMu"] = new HResolutionVSPart (outputFile_, "CotgThetaResolutionSimVSMu");
00465 mapHisto_["PhiResolutionGenVSMu"] = new HResolutionVSPart (outputFile_, "PhiResolutionGenVSMu", -0.002, 0.002, -0.002, 0.002);
00466 mapHisto_["PhiResolutionSimVSMu"] = new HResolutionVSPart (outputFile_, "PhiResolutionSimVSMu");
00467
00468
00469
00470 double ptMax = ptMax_;
00471
00472
00473
00474 mapHisto_["MassResolution"] = new HMassResolutionVSPart (outputFile_,"MassResolution");
00475
00476
00477
00478
00479 massResolutionVsPtEta_ = new HCovarianceVSxy ( "Mass", "Mass", 100, 0., ptMax, 60, -3, 3 );
00480
00481 recoPtVsgenPt_ = new TH2D("recoPtVsgenPt", "recoPtVsgenPt", 100, 0, ptMax, 100, 0, ptMax);
00482 recoPtVsgenPtEta12_ = new TH2D("recoPtVsgenPtEta12", "recoPtVsgenPtEta12", 100, 0, ptMax, 100, 0, ptMax);
00483 deltaPtOverPt_ = new TH1D("deltaPtOverPt", "deltaPtOverPt", 100, -0.1, 0.1);
00484 deltaPtOverPtForEta12_ = new TH1D("deltaPtOverPtForEta12", "deltaPtOverPtForEta12", 100, -0.1, 0.1);
00485
00486
00487
00488 int totBinsY = 60;
00489 mapHisto_["hFunctionResolMass"] = new HFunctionResolution (outputFile_, "hFunctionResolMass", ptMax, totBinsY);
00490 mapHisto_["hFunctionResolPt"] = new HFunctionResolution (outputFile_, "hFunctionResolPt", ptMax, totBinsY);
00491 mapHisto_["hFunctionResolCotgTheta"] = new HFunctionResolution (outputFile_, "hFunctionResolCotgTheta", ptMax, totBinsY);
00492 mapHisto_["hFunctionResolPhi"] = new HFunctionResolution (outputFile_, "hFunctionResolPhi", ptMax, totBinsY);
00493
00494 if( readCovariances_ ) {
00495
00496 mapHisto_["ReadCovariances"] = new HCovarianceVSParts ( theCovariancesRootFileName_, "Covariance" );
00497
00498
00499 mapHisto_["MassResolutionPt"] = new HFunctionResolutionVarianceCheck(outputFile_,"functionResolMassPt", ptMax);
00500 mapHisto_["MassResolutionCotgTheta"] = new HFunctionResolutionVarianceCheck(outputFile_,"functionResolMassCotgTheta", ptMax);
00501 mapHisto_["MassResolutionPhi"] = new HFunctionResolutionVarianceCheck(outputFile_,"functionResolMassPhi", ptMax);
00502
00503 mapHisto_["MassResolutionPt-CotgTheta"] = new HFunctionResolution(outputFile_,"functionResolMassPt-CotgTheta", ptMax, totBinsY);
00504 mapHisto_["MassResolutionPt-Phi"] = new HFunctionResolution(outputFile_,"functionResolMassPt-Phi", ptMax, totBinsY);
00505 mapHisto_["MassResolutionCotgTheta-Phi"] = new HFunctionResolution(outputFile_,"functionResolMassCotgTheta-Phi", ptMax, totBinsY);
00506 mapHisto_["MassResolutionPt1-Pt2"] = new HFunctionResolution(outputFile_,"functionResolMassPt1-Pt2", ptMax, totBinsY);
00507 mapHisto_["MassResolutionCotgTheta1-CotgTheta2"] = new HFunctionResolution(outputFile_,"functionResolMassCotgTheta1-CotgTheta2", ptMax, totBinsY);
00508 mapHisto_["MassResolutionPhi1-Phi2"] = new HFunctionResolution(outputFile_,"functionResolMassPhi1-Phi2", ptMax, totBinsY);
00509 mapHisto_["MassResolutionPt12-CotgTheta21"] = new HFunctionResolution(outputFile_,"functionResolMassPt12-CotgTheta21", ptMax, totBinsY);
00510 mapHisto_["MassResolutionPt12-Phi21"] = new HFunctionResolution(outputFile_,"functionResolMassPt12-Phi21", ptMax, totBinsY);
00511 mapHisto_["MassResolutionCotgTheta12-Phi21"] = new HFunctionResolution(outputFile_,"functionResolMassCotgTheta12-Phi21", ptMax, totBinsY);
00512
00513 mapHisto_["sigmaPtFromVariance"] = new HFunctionResolution(outputFile_,"sigmaPtFromVariance", ptMax, totBinsY);
00514 mapHisto_["sigmaCotgThetaFromVariance"] = new HFunctionResolution(outputFile_,"sigmaCotgThetaFromVariance", ptMax, totBinsY);
00515 mapHisto_["sigmaPhiFromVariance"] = new HFunctionResolution(outputFile_,"sigmaPhiFromVariance", ptMax, totBinsY);
00516
00517
00518 mapHisto_["DerivativePt"] = new HFunctionResolution(outputFile_,"derivativePt", ptMax);
00519 mapHisto_["DerivativeCotgTheta"] = new HFunctionResolution(outputFile_,"derivativeCotgTheta", ptMax);
00520 mapHisto_["DerivativePhi"] = new HFunctionResolution(outputFile_,"derivativePhi", ptMax);
00521
00522
00523 mapHisto_["MassResolutionPtFromFunction"] = new HFunctionResolutionVarianceCheck(outputFile_,"functionResolMassPtFromFunction", ptMax);
00524
00525 mapHisto_["FullMassResolution"] = new HFunctionResolution(outputFile_, "fullMassResolution", ptMax);
00526 mapHisto_["MassRes1"] = new HFunctionResolution(outputFile_, "massRes1", ptMax);
00527 mapHisto_["MassRes2"] = new HFunctionResolution(outputFile_, "massRes2", ptMax);
00528 mapHisto_["MassRes3"] = new HFunctionResolution(outputFile_, "massRes3", ptMax);
00529 mapHisto_["MassRes4"] = new HFunctionResolution(outputFile_, "massRes4", ptMax);
00530 mapHisto_["MassRes5"] = new HFunctionResolution(outputFile_, "massRes5", ptMax);
00531 mapHisto_["MassRes6"] = new HFunctionResolution(outputFile_, "massRes6", ptMax);
00532 mapHisto_["MassResPtAndPt12"] = new HFunctionResolution(outputFile_, "massResPtAndPt12", ptMax);
00533 }
00534 else {
00535 mapHisto_["Covariances"] = new HCovarianceVSParts ( outputFile_, "Covariance", ptMax );
00536 }
00537 }
00538
00539 void ResolutionAnalyzer::writeHistoMap() {
00540 for (std::map<std::string, Histograms*>::const_iterator histo=mapHisto_.begin();
00541 histo!=mapHisto_.end(); histo++) {
00542 (*histo).second->Write();
00543 }
00544 outputFile_->cd();
00545 massResolutionVsPtEta_->Write();
00546 recoPtVsgenPt_->Write();
00547 recoPtVsgenPtEta12_->Write();
00548 deltaPtOverPt_->Write();
00549 deltaPtOverPtForEta12_->Write();
00550 }
00551
00552 bool ResolutionAnalyzer::checkDeltaR(const reco::Particle::LorentzVector & genMu, const reco::Particle::LorentzVector & recMu){
00553
00554 double deltaR = sqrt(MuScleFitUtils::deltaPhi(recMu.Phi(),genMu.Phi()) * MuScleFitUtils::deltaPhi(recMu.Phi(),genMu.Phi()) +
00555 ((recMu.Eta()-genMu.Eta()) * (recMu.Eta()-genMu.Eta())));
00556 if(deltaR<0.01)
00557 return true;
00558 else if (debug_>0)
00559 std::cout<<"Reco muon "<<recMu<<" with eta "<<recMu.Eta()<<" and phi "<<recMu.Phi()<<std::endl
00560 <<" DOES NOT MATCH with generated muon from resonance: "<<std::endl
00561 <<genMu<<" with eta "<<genMu.Eta()<<" and phi "<<genMu.Phi()<<std::endl;
00562 return false;
00563 }
00564
00565
00566 DEFINE_FWK_MODULE(ResolutionAnalyzer);
00567
00568 #endif // RESOLUTIONANALYZER_CC