00001 #include "Validation/RecoMuon/src/HTrack.h"
00002 #include "Validation/RecoMuon/src/Histograms.h"
00003 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
00004 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
00005 #include "SimDataFormats/Track/interface/SimTrack.h"
00006
00007 #include "DQMServices/Core/interface/DQMStore.h"
00008 #include "DQMServices/Core/interface/MonitorElement.h"
00009 #include "FWCore/ServiceRegistry/interface/Service.h"
00010
00011 #include "TFile.h"
00012 #include "TDirectory.h"
00013
00014
00015 using namespace std;
00016
00017 HTrack::HTrack(string dirName_,string name,string whereIs):
00018 theName(name.c_str()),where(whereIs.c_str()){
00019
00020 dbe_ = edm::Service<DQMStore>().operator->();
00021 dbe_->cd();
00022 std::string dirName=dirName_;
00023 dirName+="/";
00024 dirName+=name.c_str();
00025 dirName+="_";
00026 dirName+=whereIs.c_str();
00027
00028 dbe_->cd();
00029 dbe_->setCurrentFolder(dirName.c_str());
00030
00031 hVariables = new HTrackVariables(dirName.c_str(),name,whereIs);
00032
00033
00034 dbe_->cd();
00035 dbe_->setCurrentFolder(dirName.c_str());
00036 string resName = dirName;
00037 resName+="/Resolution";
00038 hResolution = new HResolution(resName.c_str(),name+"_Res",whereIs);
00039 dbe_->cd();
00040 dbe_->setCurrentFolder(dirName.c_str());
00041 hTDRResolution = new HResolution(resName.c_str(),name+"_TDRRes",whereIs);
00042
00043 dbe_->cd();
00044 dbe_->setCurrentFolder(dirName.c_str());
00045 string pullName = dirName;
00046 pullName+="/Pull";
00047 hPull = new HResolution(pullName.c_str(),name+"_Pull",whereIs);
00048 hTDRPull = new HResolution(pullName.c_str(),name+"_TDRPull",whereIs);
00049
00050
00051 doSubHisto = false;
00052
00053 if(doSubHisto){
00054 dbe_->cd();
00055 dbe_->setCurrentFolder(dirName.c_str());
00056 string subName = dirName;
00057 subName+="/subHistos";
00058
00059 hResolution_5_10 = new HResolution(subName.c_str(),name+"_Res_Pt_5_10",whereIs);
00060 hTDRResolution_5_10 = new HResolution(subName.c_str(),name+"_TDRRes_Pt_5_10",whereIs);
00061 hPull_5_10 = new HResolution(subName.c_str(),name+"_Pull_Pt_5_10",whereIs);
00062
00063
00064 hResolution_10_40 = new HResolution(subName.c_str(),name+"_Res_Pt_10_40",whereIs);
00065 hTDRResolution_10_40 = new HResolution(subName.c_str(),name+"_TDRRes_Pt_10_40",whereIs);
00066 hPull_10_40 = new HResolution(subName.c_str(),name+"_Pull_Pt_10_40",whereIs);
00067
00068
00069 hResolution_40_70 = new HResolution(subName.c_str(),name+"_Res_Pt_40_70",whereIs);
00070 hTDRResolution_40_70 = new HResolution(subName.c_str(),name+"_TDRRes_Pt_40_70",whereIs);
00071 hPull_40_70 = new HResolution(subName.c_str(),name+"_Pull_Pt_40_70",whereIs);
00072
00073
00074 hResolution_70_100 = new HResolution(subName.c_str(),name+"_Res_Pt_70_100",whereIs);
00075 hTDRResolution_70_100 = new HResolution(subName.c_str(),name+"_TDRRes_Pt_70_100",whereIs);
00076 hPull_70_100 = new HResolution(subName.c_str(),name+"_Pull_Pt_70_100",whereIs);
00077
00078
00079 hResolution_08 = new HResolution(subName.c_str(),name+"_Res_Eta_08",whereIs);
00080 hTDRResolution_08 = new HResolution(subName.c_str(),name+"_TDRRes_Eta_08",whereIs);
00081 hPull_08 = new HResolution(subName.c_str(),name+"_Pull_Eta_08",whereIs);
00082
00083
00084 hResolution_08_12 = new HResolution(subName.c_str(),name+"_Res_Eta_08_12",whereIs);
00085 hTDRResolution_08_12 = new HResolution(subName.c_str(),name+"_TDRRes_Eta_08_12",whereIs);
00086 hPull_08_12 = new HResolution(subName.c_str(),name+"_Pull_Eta_08_12",whereIs);
00087
00088
00089 hResolution_12_21 = new HResolution(subName.c_str(),name+"_Res_Eta_12_21",whereIs);
00090 hTDRResolution_12_21 = new HResolution(subName.c_str(),name+"_TDRRes_Eta_12_21",whereIs);
00091 hPull_12_21 = new HResolution(subName.c_str(),name+"_Pull_Eta_12_21",whereIs);
00092
00093
00094 hResolution_12_24 = new HResolution(subName.c_str(),name+"_Res_Eta_12_24",whereIs);
00095 hTDRResolution_12_24 = new HResolution(subName.c_str(),name+"_TDRRes_Eta_12_24",whereIs);
00096 hPull_12_24 = new HResolution(subName.c_str(),name+"_Pull_Eta_12_24",whereIs);
00097
00098
00099 hResolution_12_21_plus = new HResolution(subName.c_str(),name+"_Res_Eta_12_21_plus",whereIs);
00100 hTDRResolution_12_21_plus = new HResolution(subName.c_str(),name+"_TDRRes_Eta_12_21_plus",whereIs);
00101 hPull_12_21_plus = new HResolution(subName.c_str(),name+"_Pull_Eta_12_21_plus",whereIs);
00102
00103
00104 hResolution_12_24_plus = new HResolution(subName.c_str(),name+"_Res_Eta_12_24_plus",whereIs);
00105 hTDRResolution_12_24_plus = new HResolution(subName.c_str(),name+"_TDRRes_Eta_12_24_plus",whereIs);
00106 hPull_12_24_plus = new HResolution(subName.c_str(),name+"_Pull_Eta_12_24_plus",whereIs);
00107
00108
00109 hResolution_12_21_minus = new HResolution(subName.c_str(),name+"_Res_Eta_12_21_minus",whereIs);
00110 hTDRResolution_12_21_minus = new HResolution(subName.c_str(),name+"_TDRRes_Eta_12_21_minus",whereIs);
00111 hPull_12_21_minus = new HResolution(subName.c_str(),name+"_Pull_Eta_12_21_minus",whereIs);
00112
00113
00114 hResolution_12_24_minus = new HResolution(subName.c_str(),name+"_Res_Eta_12_24_minus",whereIs);
00115 hTDRResolution_12_24_minus = new HResolution(subName.c_str(),name+"_TDRRes_Eta_12_24_minus",whereIs);
00116 hPull_12_24_minus = new HResolution(subName.c_str(),name+"_Pull_Eta_12_24_minus",whereIs);
00117 }
00118 }
00119
00120 double HTrack::pull(double rec,double sim, double sigmarec){
00121 return (rec-sim)/sigmarec;
00122 }
00123
00124 double HTrack::resolution(double rec,double sim){
00125 return (rec-sim)/sim;
00126 }
00127
00128
00129 void HTrack::Fill(TrajectoryStateOnSurface &tsos){
00130 Fill(*tsos.freeState());
00131 }
00132
00133 void HTrack::Fill(FreeTrajectoryState &fts){
00134
00135 hVariables->Fill(fts.momentum().mag(),
00136 fts.momentum().perp(),
00137 fts.momentum().eta(),
00138 fts.momentum().phi(),
00139 fts.charge());
00140 }
00141
00142 void HTrack::FillDeltaR(double deltaR){
00143 hVariables->FillDeltaR(deltaR);
00144 }
00145
00146
00147 double HTrack::computeEfficiency(HTrackVariables *sim){
00148 return hVariables->computeEfficiency(sim);
00149 }
00150
00151
00152 void HTrack::computeResolutionAndPull(TrajectoryStateOnSurface& tsos, SimTrack& simTrack){
00153 computeResolutionAndPull(*tsos.freeState(),simTrack);
00154 }
00155
00156
00157 void HTrack::computeResolutionAndPull(FreeTrajectoryState& fts, SimTrack& simTrack){
00158
00159
00160
00161 computeResolution(fts,simTrack,hResolution);
00162 computePull(fts,simTrack,hPull);
00163
00164
00165 computeTDRResolution(fts,simTrack,hTDRResolution);
00166
00167
00168
00169 hVariables->Fill(sqrt(simTrack.momentum().Perp2()),
00170 simTrack.momentum().eta(),
00171 simTrack.momentum().phi());
00172
00173
00174 if(doSubHisto){
00175
00176 if(sqrt(simTrack.momentum().Perp2()) <10 ){
00177 computeResolution(fts,simTrack,hResolution_5_10);
00178 computeTDRResolution(fts,simTrack,hTDRResolution_5_10);
00179 computePull(fts,simTrack,hPull_5_10);
00180 }
00181
00182
00183 if(sqrt(simTrack.momentum().Perp2()) >=10 && sqrt(simTrack.momentum().Perp2()) < 40){
00184 computeResolution(fts,simTrack,hResolution_10_40);
00185 computeTDRResolution(fts,simTrack, hTDRResolution_10_40);
00186 computePull(fts,simTrack,hPull_10_40);
00187 }
00188
00189
00190 if(sqrt(simTrack.momentum().Perp2()) >=40 && sqrt(simTrack.momentum().Perp2()) < 70){
00191 computeResolution(fts,simTrack,hResolution_40_70);
00192 computeTDRResolution(fts,simTrack,hTDRResolution_40_70);
00193 computePull(fts,simTrack,hPull_40_70);
00194 }
00195
00196
00197 if(sqrt(simTrack.momentum().Perp2()) >= 70 && sqrt(simTrack.momentum().Perp2()) < 100){
00198 computeResolution(fts,simTrack,hResolution_70_100);
00199 computeTDRResolution(fts,simTrack,hTDRResolution_70_100);
00200 computePull(fts,simTrack,hPull_70_100);
00201 }
00202
00203
00204 if(abs(simTrack.momentum().eta()) <= 0.8){
00205 computeResolution(fts,simTrack,hResolution_08);
00206 computeTDRResolution(fts,simTrack, hTDRResolution_08);
00207 computePull(fts,simTrack,hPull_08);
00208 }
00209
00210
00211 if( abs(simTrack.momentum().eta()) > 0.8 && abs(simTrack.momentum().eta()) <= 1.2 ){
00212 computeResolution(fts,simTrack,hResolution_08_12);
00213 computeTDRResolution(fts,simTrack, hTDRResolution_08_12);
00214 computePull(fts,simTrack,hPull_08_12);
00215 }
00216
00217
00218 if( abs(simTrack.momentum().eta()) > 1.2 && abs(simTrack.momentum().eta()) <= 2.1 ){
00219 computeResolution(fts,simTrack,hResolution_12_21);
00220 computeTDRResolution(fts,simTrack, hTDRResolution_12_21);
00221 computePull(fts,simTrack,hPull_12_21);
00222
00223 if(simTrack.momentum().eta() > 0){
00224 computeResolution(fts,simTrack,hResolution_12_21_plus);
00225 computeTDRResolution(fts,simTrack, hTDRResolution_12_21_plus);
00226 computePull(fts,simTrack,hPull_12_21_plus);
00227 }
00228 else{
00229 computeResolution(fts,simTrack,hResolution_12_21_minus);
00230 computeTDRResolution(fts,simTrack, hTDRResolution_12_21_minus);
00231 computePull(fts,simTrack,hPull_12_21_minus);
00232 }
00233 }
00234
00235
00236 if( abs(simTrack.momentum().eta()) > 1.2 && abs(simTrack.momentum().eta()) <= 2.4 ){
00237 computeResolution(fts,simTrack,hResolution_12_24);
00238 computeTDRResolution(fts,simTrack, hTDRResolution_12_24);
00239 computePull(fts,simTrack,hPull_12_24);
00240
00241 if(simTrack.momentum().eta() > 0){
00242 computeResolution(fts,simTrack,hResolution_12_24_plus);
00243 computeTDRResolution(fts,simTrack, hTDRResolution_12_24_plus);
00244 computePull(fts,simTrack,hPull_12_24_plus);
00245 }
00246 else{
00247 computeResolution(fts,simTrack,hResolution_12_24_minus);
00248 computeTDRResolution(fts,simTrack, hTDRResolution_12_24_minus);
00249 computePull(fts,simTrack,hPull_12_24_minus);
00250 }
00251 }
00252 }
00253 }
00254
00255 void HTrack::computeResolution(FreeTrajectoryState &fts,
00256 SimTrack& simTrack,
00257 HResolution* hReso){
00258
00259
00260 hReso->Fill(simTrack.momentum().mag(),
00261 sqrt(simTrack.momentum().Perp2()),
00262 simTrack.momentum().eta(),
00263 simTrack.momentum().phi(),
00264 resolution(fts.momentum().mag(),simTrack.momentum().mag()),
00265 resolution(fts.momentum().perp(),sqrt(simTrack.momentum().Perp2())),
00266 fts.momentum().eta()-simTrack.momentum().eta(),
00267 fts.momentum().phi()-simTrack.momentum().phi(),
00268 fts.charge()+simTrack.type()/abs(simTrack.type()));
00269 }
00270
00271 void HTrack::computeTDRResolution(FreeTrajectoryState &fts,
00272 SimTrack& simTrack,
00273 HResolution* hReso){
00274
00275 int simCharge = -simTrack.type()/ abs(simTrack.type());
00276
00277 double invSimP = (simTrack.momentum().mag() == 0 ) ? 0 : simTrack.momentum().mag();
00278 double signedInverseRecMom = (simTrack.momentum().mag() == 0 ) ? 0 : fts.signedInverseMomentum();
00279
00280 hReso->Fill(simTrack.momentum().mag(),
00281 sqrt(simTrack.momentum().Perp2()),
00282 simTrack.momentum().eta(),
00283 simTrack.momentum().phi(),
00284 resolution(signedInverseRecMom , simCharge*invSimP ),
00285 resolution(fts.charge()/fts.momentum().perp(),simCharge/sqrt(simTrack.momentum().Perp2())));
00286 }
00287
00288 void HTrack::computePull(FreeTrajectoryState &fts,
00289 SimTrack& simTrack,
00290 HResolution* hReso){
00291
00292
00293 AlgebraicSymMatrix66 const & errors = fts.cartesianError().matrix();
00294
00295 double partialPterror = errors[3][3]*pow(fts.momentum().x(),2) + errors[4][4]*pow(fts.momentum().y(),2);
00296
00297
00298 double pterror = sqrt(partialPterror)/fts.momentum().perp();
00299
00300
00301 double perror = sqrt(partialPterror+errors[5][5]*pow(fts.momentum().z(),2))/fts.momentum().mag();
00302
00303 double phierror = sqrt(fts.curvilinearError().matrix()[2][2]);
00304
00305 double etaerror = sqrt(fts.curvilinearError().matrix()[1][1])*abs(sin(fts.momentum().theta()));
00306
00307
00308 hReso->Fill(simTrack.momentum().mag(),
00309 sqrt(simTrack.momentum().Perp2()),
00310 simTrack.momentum().eta(),
00311 simTrack.momentum().phi(),
00312 pull(fts.momentum().mag(),simTrack.momentum().mag(),perror),
00313 pull(fts.momentum().perp(),sqrt(simTrack.momentum().Perp2()),pterror),
00314 pull(fts.momentum().eta(),simTrack.momentum().eta(),etaerror),
00315 pull(fts.momentum().phi(),simTrack.momentum().phi(),phierror),
00316 pull(fts.charge() , -simTrack.type()/ abs(simTrack.type()), 1.));
00317 }