CMS 3D CMS Logo

/data/refman/pasoursint/CMSSW_5_3_0/src/DQMOffline/JetMET/src/BeamHaloAnalyzer.cc

Go to the documentation of this file.
00001 #include "DQMOffline/JetMET/interface/BeamHaloAnalyzer.h"
00002 #include "FWCore/ServiceRegistry/interface/Service.h"
00003 
00004 //author : Ronny Remington, University of Florida
00005 //date : 11/11/09
00006 
00007 using namespace edm;
00008 using namespace reco;
00009 
00010 int Phi_To_iPhi(float phi) 
00011 {
00012   phi = phi < 0 ? phi + 2.*TMath::Pi() : phi ;
00013   float phi_degrees = phi * (360.) / ( 2. * TMath::Pi() ) ;
00014   int iPhi = (int) ( ( phi_degrees/5. ) + 1.);
00015    
00016   return iPhi < 73 ? iPhi : 73 ;
00017 }
00018 
00019 
00020 BeamHaloAnalyzer::BeamHaloAnalyzer( const edm::ParameterSet& iConfig)
00021 {
00022   OutputFileName = iConfig.getParameter<std::string>("OutputFile"); 
00023   TextFileName   = iConfig.getParameter<std::string>("TextFile");
00024 
00025   if(TextFileName.size())
00026     out = new ofstream(TextFileName.c_str() );
00027 
00028 
00029   if( iConfig.exists("StandardDQM") )  // If StandardDQM == true , coarse binning is used on selected (important) histograms   
00030     StandardDQM = iConfig.getParameter<bool>("StandardDQM");
00031   else
00032     StandardDQM = false;
00033   
00034   //Get Input Tags
00035   //Digi Level 
00036   IT_L1MuGMTReadout = iConfig.getParameter<edm::InputTag>("L1MuGMTReadoutLabel");
00037   
00038   //RecHit Level
00039   IT_CSCRecHit   = iConfig.getParameter<edm::InputTag>("CSCRecHitLabel");
00040   IT_EBRecHit    = iConfig.getParameter<edm::InputTag>("EBRecHitLabel");
00041   IT_EERecHit    = iConfig.getParameter<edm::InputTag>("EERecHitLabel");
00042   IT_ESRecHit    = iConfig.getParameter<edm::InputTag>("ESRecHitLabel");
00043   IT_HBHERecHit  = iConfig.getParameter<edm::InputTag>("HBHERecHitLabel");
00044   IT_HFRecHit    = iConfig.getParameter<edm::InputTag>("HFRecHitLabel");
00045   IT_HORecHit    = iConfig.getParameter<edm::InputTag>("HORecHitLabel");
00046 
00047   //Higher Level Reco 
00048   IT_CSCSegment = iConfig.getParameter<edm::InputTag>("CSCSegmentLabel");  
00049   IT_CosmicStandAloneMuon = iConfig.getParameter<edm::InputTag>("CosmicStandAloneMuonLabel"); 
00050   IT_BeamHaloMuon = iConfig.getParameter<edm::InputTag>("BeamHaloMuonLabel");
00051   IT_CollisionMuon = iConfig.getParameter<edm::InputTag>("CollisionMuonLabel");
00052   IT_CollisionStandAloneMuon  = iConfig.getParameter<edm::InputTag>("CollisionStandAloneMuonLabel"); 
00053   IT_met = iConfig.getParameter<edm::InputTag>("metLabel");
00054   IT_CaloTower = iConfig.getParameter<edm::InputTag>("CaloTowerLabel");
00055   IT_SuperCluster = iConfig.getParameter<edm::InputTag>("SuperClusterLabel");
00056   IT_Photon = iConfig.getParameter<edm::InputTag>("PhotonLabel") ;
00057   
00058   //Halo Data
00059   IT_CSCHaloData = iConfig.getParameter<edm::InputTag> ("CSCHaloDataLabel");
00060   IT_EcalHaloData = iConfig.getParameter<edm::InputTag>("EcalHaloDataLabel");
00061   IT_HcalHaloData = iConfig.getParameter<edm::InputTag>("HcalHaloDataLabel");
00062   IT_GlobalHaloData = iConfig.getParameter<edm::InputTag>("GlobalHaloDataLabel");
00063   IT_BeamHaloSummary = iConfig.getParameter<edm::InputTag>("BeamHaloSummaryLabel");
00064 
00065   FolderName = iConfig.getParameter<std::string>("folderName");
00066   DumpMET = iConfig.getParameter<double>("DumpMET");
00067 
00068   //Muon to Segment Matching
00069   edm::ParameterSet serviceParameters = iConfig.getParameter<edm::ParameterSet>("ServiceParameters");
00070   TheService = new MuonServiceProxy(serviceParameters);
00071   edm::ParameterSet matchParameters = iConfig.getParameter<edm::ParameterSet>("MatchParameters");
00072   TheMatcher = new MuonSegmentMatcher(matchParameters, TheService);
00073 
00074 }
00075 
00076 
00077 void BeamHaloAnalyzer::beginJob(void){}
00078 
00079 void BeamHaloAnalyzer::beginRun(const edm::Run&, const edm::EventSetup& iSetup){
00080   
00081   dqm = edm::Service<DQMStore>().operator->();
00082   if( dqm ) {
00083   
00084     // EcalHaloData
00085     dqm->setCurrentFolder(FolderName+"/EcalHaloData");
00086     if(StandardDQM)
00087       {
00088         hEcalHaloData_PhiWedgeMultiplicity = dqm->book1D("EcalHaloData_PhiWedgeMultiplicity","",20, -0.5, 19.5);
00089         hEcalHaloData_PhiWedgeConstituents = dqm->book1D("EcalHaloData_PhiWedgeConstituents","",20,-0.5, 19.5);
00090         //      hEcalHaloData_PhiWedgeiPhi         = dqm->book1D("EcalHaloData_PhiWedgeiPhi","", 360, 0.5, 360.5) ;
00091         hEcalHaloData_PhiWedgeZDirectionConfidence = dqm->book1D("EcalHaloData_ZDirectionConfidence","",  120, -1.2, 1.2);
00092         hEcalHaloData_SuperClusterShowerShapes  = dqm->book2D("EcalHaloData_SuperClusterShowerShapes","", 25,0.0, TMath::Pi(), 25,0.0, 2.0);
00093         hEcalHaloData_SuperClusterEnergy = dqm->book1D("EcalHaloData_SuperClusterEnergy","",50,-0.5,99.5); 
00094         hEcalHaloData_SuperClusterNHits = dqm->book1D("EcalHaloData_SuperClusterNHits", "", 20, -0.5, 19.5);
00095       }
00096     else
00097       {
00098         hEcalHaloData_PhiWedgeMultiplicity = dqm->book1D("EcalHaloData_PhiWedgeMultiplicity","",20, -0.5, 19.5);
00099         hEcalHaloData_PhiWedgeEnergy       = dqm->book1D("EcalHaloData_PhiWedgeEnergy","", 50,-0.5,199.5);
00100         hEcalHaloData_PhiWedgeConstituents = dqm->book1D("EcalHaloData_PhiWedgeConstituents","",20,-0.5, 19.5);
00101         hEcalHaloData_PhiWedgeMinTime      = dqm->book1D("EcalHaloData_PhiWedgeMinTime","", 100, -225.0, 225.0);
00102         hEcalHaloData_PhiWedgeMaxTime      = dqm->book1D("EcalHaloData_PhiWedgeMaxTime","", 100, -225.0, 225.0);
00103         hEcalHaloData_PhiWedgeiPhi         = dqm->book1D("EcalHaloData_PhiWedgeiPhi","", 360, 0.5, 360.5) ;
00104         hEcalHaloData_PhiWedgePlusZDirectionConfidence = dqm->book1D("EcalHaloData_PlusZDirectionConfidence","",  50, 0., 1.0);
00105         hEcalHaloData_PhiWedgeZDirectionConfidence = dqm->book1D("EcalHaloData_ZDirectionConfidence","",  120, -1.2, 1.2);
00106         hEcalHaloData_PhiWedgeMinVsMaxTime = dqm->book2D("EcalHaloData_PhiWedgeMinVsMaxTime","", 50,-100.0, 100.0, 50, -100.0, 100.0);
00107         hEcalHaloData_SuperClusterShowerShapes  = dqm->book2D("EcalHaloData_SuperClusterShowerShapes","", 25,0.0, TMath::Pi(), 25,0.0, 2.0);
00108         hEcalHaloData_SuperClusterEnergy = dqm->book1D("EcalHaloData_SuperClusterEnergy","",100,-0.5,99.5); 
00109         hEcalHaloData_SuperClusterNHits = dqm->book1D("EcalHaloData_SuperClusterNHits", "", 20, -0.5, 19.5);
00110         hEcalHaloData_SuperClusterPhiVsEta = dqm->book2D("EcalHaloData_SuperClusterPhiVsEta","",60, -3.0, 3.0,72, -TMath::Pi(), TMath::Pi());  
00111       }
00112 
00113     // HcalHaloData
00114     dqm->setCurrentFolder(FolderName+"/HcalHaloData");    
00115     if( StandardDQM )
00116       { 
00117         hHcalHaloData_PhiWedgeMultiplicity = dqm->book1D("HcalHaloData_PhiWedgeMultiplicity","", 20, -0.5, 19.5);
00118         hHcalHaloData_PhiWedgeConstituents = dqm->book1D("HcalHaloData_PhiWedgeConstituents","", 20,-0.5, 19.5);
00119         //hHcalHaloData_PhiWedgeiPhi         = dqm->book1D("HcalHaloData_PhiWedgeiPhi","", 72, 0.5,72.5);
00120         hHcalHaloData_PhiWedgeZDirectionConfidence = dqm->book1D("HcalHaloData_ZDirectionConfidence","",  120, -1.2, 1.2);
00121       }
00122     else
00123       {
00124         hHcalHaloData_PhiWedgeMultiplicity = dqm->book1D("HcalHaloData_PhiWedgeMultiplicity","", 20, -0.5, 19.5);
00125         hHcalHaloData_PhiWedgeEnergy       = dqm->book1D("HcalHaloData_PhiWedgeEnergy", "", 50,-0.5,199.5);
00126         hHcalHaloData_PhiWedgeConstituents = dqm->book1D("HcalHaloData_PhiWedgeConstituents","", 20,-0.5, 19.5);
00127         hHcalHaloData_PhiWedgeiPhi         = dqm->book1D("HcalHaloData_PhiWedgeiPhi","", 72, 0.5,72.5);
00128         hHcalHaloData_PhiWedgeMinTime      = dqm->book1D("HcalHaloData_PhiWedgeMinTime", "", 50, -100.0, 100.0);
00129         hHcalHaloData_PhiWedgeMaxTime      = dqm->book1D("HcalHaloData_PhiWedgeMaxTime", "", 50, -100.0, 100.0);
00130         hHcalHaloData_PhiWedgePlusZDirectionConfidence = dqm->book1D("HcalHaloData_PlusZDirectionConfidence","",  50, 0., 1.0);
00131         hHcalHaloData_PhiWedgeZDirectionConfidence = dqm->book1D("HcalHaloData_ZDirectionConfidence","",  120, -1.2, 1.2);
00132         hHcalHaloData_PhiWedgeMinVsMaxTime = dqm->book2D("HcalHaloData_PhiWedgeMinVsMaxTime","" , 50,-100.0, 100.0, 50, -100.0, 100.0);
00133       }
00134 
00135     // CSCHaloData
00136     dqm->setCurrentFolder(FolderName+"/CSCHaloData");
00137     if( StandardDQM ) 
00138       {
00139         hCSCHaloData_TrackMultiplicity  = dqm->book1D("CSCHaloData_TrackMultiplicity", "", 15, -0.5, 14.5);
00140         hCSCHaloData_TrackMultiplicityMEPlus  = dqm->book1D("CSCHaloData_TrackMultiplicityMEPlus", "", 15, -0.5, 14.5);
00141         hCSCHaloData_TrackMultiplicityMEMinus  = dqm->book1D("CSCHaloData_TrackMultiplicityMEMinus", "", 15, -0.5, 14.5);
00142         hCSCHaloData_InnerMostTrackHitR  = dqm->book1D("CSCHaloData_InnerMostTrackHitR", "", 70, 99.5, 799.5);
00143         hCSCHaloData_InnerMostTrackHitPhi  = dqm->book1D("CSCHaloData_InnerMostTrackHitPhi","", 72, -TMath::Pi(), TMath::Pi());
00144         hCSCHaloData_L1HaloTriggersMEPlus  = dqm->book1D("CSCHaloData_L1HaloTriggersMEPlus", "", 10, -0.5, 9.5);
00145         hCSCHaloData_L1HaloTriggersMEMinus  = dqm->book1D("CSCHaloData_L1HaloTriggersMEMinus", "" , 10, -0.5, 9.5);
00146         hCSCHaloData_L1HaloTriggers  = dqm->book1D("CSCHaloData_L1HaloTriggers", "", 10, -0.5, 9.5);
00147         hCSCHaloData_HLHaloTriggers  = dqm->book1D("CSCHaloData_HLHaloTriggers", "", 2, -0.5, 1.5);
00148         hCSCHaloData_NOutOfTimeTriggersvsL1HaloExists  = dqm->book2D("CSCHaloData_NOutOfTimeTriggersvsL1HaloExists", "", 20, -0.5, 19.5, 2, -0.5, 1.5);
00149         hCSCHaloData_NOutOfTimeTriggersMEPlus  = dqm->book1D("CSCHaloData_NOutOfTimeTriggersMEPlus", "", 20, -0.5, 19.5);
00150         hCSCHaloData_NOutOfTimeTriggersMEMinus  = dqm->book1D("CSCHaloData_NOutOfTimeTriggersMEMinus", "", 20, -0.5, 19.5);
00151         hCSCHaloData_NOutOfTimeTriggers  = dqm->book1D("CSCHaloData_NOutOfTimeTriggers", "", 20, -0.5, 19.5);
00152         hCSCHaloData_NOutOfTimeHits  = dqm->book1D("CSCHaloData_NOutOfTimeHits", "", 60, -0.5, 59.5);
00153         hCSCHaloData_NTracksSmalldT  = dqm->book1D("CSCHaloData_NTracksSmalldT", "", 15, -0.5, 14.5);
00154         hCSCHaloData_NTracksSmallBeta  = dqm->book1D("CSCHaloData_NTracksSmallBeta", "", 15, -0.5, 14.5);
00155         hCSCHaloData_NTracksSmallBetaAndSmalldT  = dqm->book1D("CSCHaloData_NTracksSmallBetaAndSmalldT", "", 15, -0.5, 14.5);
00156         hCSCHaloData_NTracksSmalldTvsNHaloTracks = dqm->book2D("CSCHaloData_NTracksSmalldTvsNHaloTracks","",15, -0.5, 14.5,15, -0.5, 14.5);
00157         hCSCHaloData_SegmentdT = dqm->book1D("CSCHaloData_SegmentdT","",100,-100,100);
00158         hCSCHaloData_FreeInverseBeta = dqm->book1D("CSCHaloData_FreeInverseBeta","",80,-4,4);
00159         hCSCHaloData_FreeInverseBetaVsSegmentdT = dqm->book2D("CSCHaloData_FreeInverseBetaVsSegmentdT","",100,-100,100,80,-4,4);
00160         // MLR
00161         hCSCHaloData_NFlatHaloSegments = dqm->book1D("CSCHaloData_NFlatHaloSegments","",20,0,20);
00162         hCSCHaloData_SegmentsInBothEndcaps = dqm->book1D("CSCHaloData_SegmentsInBothEndcaps","",2,0,2);
00163         hCSCHaloData_NFlatSegmentsInBothEndcaps = dqm->book1D("CSCHaloData_NFlatSegmentsInBothEndcaps","",20,0,20);
00164         // End MLR
00165       }
00166     else 
00167       {
00168         hCSCHaloData_TrackMultiplicity  = dqm->book1D("CSCHaloData_TrackMultiplicity", "", 15, -0.5, 14.5);
00169         hCSCHaloData_TrackMultiplicityMEPlus  = dqm->book1D("CSCHaloData_TrackMultiplicityMEPlus", "", 15, -0.5, 14.5);
00170         hCSCHaloData_TrackMultiplicityMEMinus  = dqm->book1D("CSCHaloData_TrackMultiplicityMEMinus", "", 15, -0.5, 14.5);
00171         hCSCHaloData_InnerMostTrackHitXY  = dqm->book2D("CSCHaloData_InnerMostTrackHitXY","", 100,-700,700,100, -700,700);
00172         hCSCHaloData_InnerMostTrackHitR  = dqm->book1D("CSCHaloData_InnerMostTrackHitR", "", 400, -0.5, 799.5);
00173         hCSCHaloData_InnerMostTrackHitRPlusZ = dqm->book2D("CSCHaloData_InnerMostTrackHitRPlusZ","", 400 , 400, 1200, 400, -0.5, 799.5 );
00174         hCSCHaloData_InnerMostTrackHitRMinusZ = dqm->book2D("CSCHaloData_InnerMostTrackHitRMinusZ","", 400 , -1200, -400, 400, -0.5, 799.5 );
00175         hCSCHaloData_InnerMostTrackHitiPhi  = dqm->book1D("CSCHaloData_InnerMostTrackHitiPhi","", 72, 0.5, 72.5);
00176         hCSCHaloData_InnerMostTrackHitPhi  = dqm->book1D("CSCHaloData_InnerMostTrackHitPhi","", 72, -TMath::Pi(), TMath::Pi());
00177         hCSCHaloData_L1HaloTriggersMEPlus  = dqm->book1D("CSCHaloData_L1HaloTriggersMEPlus", "", 10, -0.5, 9.5);
00178         hCSCHaloData_L1HaloTriggersMEMinus  = dqm->book1D("CSCHaloData_L1HaloTriggersMEMinus", "" , 10, -0.5, 9.5);
00179         hCSCHaloData_L1HaloTriggers  = dqm->book1D("CSCHaloData_L1HaloTriggers", "", 10, -0.5, 9.5);
00180         hCSCHaloData_HLHaloTriggers  = dqm->book1D("CSCHaloData_HLHaloTriggers", "", 2, -0.5, 1.5);
00181         hCSCHaloData_NOutOfTimeTriggersvsL1HaloExists  = dqm->book2D("CSCHaloData_NOutOfTimeTriggersvsL1HaloExists", "", 20, -0.5, 19.5, 2, -0.5, 1.5);
00182         hCSCHaloData_NOutOfTimeTriggers  = dqm->book1D("CSCHaloData_NOutOfTimeTriggers", "", 20, -0.5, 19.5);
00183         hCSCHaloData_NOutOfTimeHits  = dqm->book1D("CSCHaloData_NOutOfTimeHits", "", 60, -0.5, 59.5);
00184         hCSCHaloData_NTracksSmalldT  = dqm->book1D("CSCHaloData_NTracksSmalldT", "", 15, -0.5, 14.5);
00185         hCSCHaloData_NTracksSmallBeta  = dqm->book1D("CSCHaloData_NTracksSmallBeta", "", 15, -0.5, 14.5);
00186         hCSCHaloData_NTracksSmallBetaAndSmalldT  = dqm->book1D("CSCHaloData_NTracksSmallBetaAndSmalldT", "", 15, -0.5, 14.5);
00187         hCSCHaloData_NTracksSmalldTvsNHaloTracks = dqm->book2D("CSCHaloData_NTracksSmalldTvsNHaloTracks","",15, -0.5, 14.5,15, -0.5, 14.5);
00188         hCSCHaloData_SegmentdT = dqm->book1D("CSCHaloData_SegmentdT","",100,-100,100);
00189         hCSCHaloData_FreeInverseBeta = dqm->book1D("CSCHaloData_FreeInverseBeta","",80,-4,4);
00190         hCSCHaloData_FreeInverseBetaVsSegmentdT = dqm->book2D("CSCHaloData_FreeInverseBetaVsSegmentdT","",100,-100,100,80,-4,4);
00191         // MLR
00192         hCSCHaloData_NFlatHaloSegments = dqm->book1D("CSCHaloData_NFlatHaloSegments","",20,0,20);
00193         hCSCHaloData_SegmentsInBothEndcaps = dqm->book1D("CSCHaloData_SegmentsInBothEndcaps","",2,0,2);
00194         hCSCHaloData_NFlatSegmentsInBothEndcaps = dqm->book1D("CSCHaloData_NFlatSegmentsInBothEndcaps","",20,0,20);
00195         // End MLR
00196       }
00197 
00198     // GlobalHaloData
00199     dqm->setCurrentFolder(FolderName+"/GlobalHaloData");
00200     if(!StandardDQM)
00201       {
00202         hGlobalHaloData_MExCorrection  = dqm->book1D("GlobalHaloData_MExCorrection", "" , 200, -200., 200.);
00203         hGlobalHaloData_MEyCorrection  = dqm->book1D("GlobalHaloData_MEyCorrection", "" , 200, -200., 200.);
00204         hGlobalHaloData_SumEtCorrection = dqm->book1D("GlobalHaloData_SumEtCorrection", "" , 200, -0.5, 399.5);
00205         hGlobalHaloData_HaloCorrectedMET = dqm->book1D("GlobalHaloData_HaloCorrectedMET", "" , 500, -0.5, 1999.5);
00206         hGlobalHaloData_RawMETMinusHaloCorrectedMET = dqm->book1D("GlobalHaloData_RawMETMinusHaloCorrectedMET","" , 250, -500., 500.);
00207         hGlobalHaloData_RawMETOverSumEt  = dqm->book1D("GlobalHaloData_RawMETOverSumEt","" , 100, 0.0, 1.0);
00208         hGlobalHaloData_MatchedHcalPhiWedgeMultiplicity = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeMultiplicity","", 15, -0.5, 14.5);    
00209         hGlobalHaloData_MatchedHcalPhiWedgeEnergy       = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeEnergy", "", 50,-0.5,199.5);
00210         hGlobalHaloData_MatchedHcalPhiWedgeConstituents = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeConstituents","", 20,-0.5, 19.5);
00211         hGlobalHaloData_MatchedHcalPhiWedgeiPhi         = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeiPhi","", 1, 0.5,72.5);
00212         hGlobalHaloData_MatchedHcalPhiWedgeMinTime      = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeMinTime", "", 50, -100.0, 100.0);
00213         hGlobalHaloData_MatchedHcalPhiWedgeMaxTime      = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeMaxTime", "", 50, -100.0, 100.0);
00214         hGlobalHaloData_MatchedHcalPhiWedgeZDirectionConfidence = dqm->book1D("GlobalHaloData_MatchedHcalPhiWedgeZDirectionConfidence","",  120, -1.2, 1.2);
00215         hGlobalHaloData_MatchedEcalPhiWedgeMultiplicity = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeMultiplicity","", 15, -0.5, 14.5);
00216         hGlobalHaloData_MatchedEcalPhiWedgeEnergy       = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeEnergy", "", 50,-0.5,199.5);
00217         hGlobalHaloData_MatchedEcalPhiWedgeConstituents = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeConstituents","", 20,-0.5, 19.5);
00218         hGlobalHaloData_MatchedEcalPhiWedgeiPhi         = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeiPhi","", 360, 0.5,360.5);
00219         hGlobalHaloData_MatchedEcalPhiWedgeMinTime      = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeMinTime", "", 50, -100.0, 100.0);
00220         hGlobalHaloData_MatchedEcalPhiWedgeMaxTime      = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeMaxTime", "", 50, -100.0, 100.0);
00221         hGlobalHaloData_MatchedEcalPhiWedgeZDirectionConfidence = dqm->book1D("GlobalHaloData_MatchedEcalPhiWedgeZDirectionConfidence","",  120, 1.2, 1.2);
00222       }
00223     // BeamHaloSummary 
00224     dqm->setCurrentFolder(FolderName+"/BeamHaloSummary");
00225 
00226     hBeamHaloSummary_Id = dqm->book1D("BeamHaloSumamry_Id", "", 11, 0.5,11.5);
00227     hBeamHaloSummary_Id ->setBinLabel(1,"CSC Loose");
00228     hBeamHaloSummary_Id ->setBinLabel(2,"CSC Tight");
00229     hBeamHaloSummary_Id ->setBinLabel(3,"Ecal Loose");
00230     hBeamHaloSummary_Id ->setBinLabel(4,"Ecal Tight");
00231     hBeamHaloSummary_Id ->setBinLabel(5,"Hcal Loose");
00232     hBeamHaloSummary_Id ->setBinLabel(6,"Hcal Tight");
00233     hBeamHaloSummary_Id ->setBinLabel(7,"Global Loose");
00234     hBeamHaloSummary_Id ->setBinLabel(8,"Global Tight");
00235     hBeamHaloSummary_Id ->setBinLabel(9,"Event Loose");
00236     hBeamHaloSummary_Id ->setBinLabel(10,"Event Tight");
00237     hBeamHaloSummary_Id ->setBinLabel(11,"Nothing");
00238     if(!StandardDQM)
00239       {
00240         hBeamHaloSummary_BXN = dqm->book2D("BeamHaloSummary_BXN", "",11, 0.5, 11.5, 4000, -0.5,3999.5);
00241         hBeamHaloSummary_BXN ->setBinLabel(1,"CSC Loose");
00242         hBeamHaloSummary_BXN ->setBinLabel(2,"CSC Tight");
00243         hBeamHaloSummary_BXN ->setBinLabel(3,"Ecal Loose");
00244         hBeamHaloSummary_BXN ->setBinLabel(4,"Ecal Tight");
00245         hBeamHaloSummary_BXN ->setBinLabel(5,"Hcal Loose");
00246         hBeamHaloSummary_BXN ->setBinLabel(6,"Hcal Tight");
00247         hBeamHaloSummary_BXN ->setBinLabel(7,"Global Loose");
00248         hBeamHaloSummary_BXN ->setBinLabel(8,"Global Tight");
00249         hBeamHaloSummary_BXN ->setBinLabel(9,"Event Loose");
00250         hBeamHaloSummary_BXN ->setBinLabel(10,"Event Tight");
00251         hBeamHaloSummary_BXN ->setBinLabel(11,"Nothing");
00252       }
00253     // Extra
00254     dqm->setCurrentFolder(FolderName+"/ExtraHaloData");
00255     if(StandardDQM)
00256       {
00257         hExtra_CSCTrackInnerOuterDPhi = dqm->book1D("Extra_CSCTrackInnerOuterDPhi","",100, 0, TMath::Pi() );
00258         hExtra_CSCTrackInnerOuterDEta = dqm->book1D("Extra_CSCTrackInnerOuterDEta","", 100, 0, 3.0 );
00259         hExtra_CSCTrackChi2Ndof  = dqm->book1D("Extra_CSCTrackChi2Ndof","", 25, 0, 10);
00260         hExtra_CSCTrackNHits     = dqm->book1D("Extra_CSCTrackNHits","", 75,0, 75);
00261         hExtra_CSCActivityWithMET= dqm->book2D("Extra_CSCActivityWithMET", "", 4, 0.5, 4.5, 4, 0.5, 4.5);
00262         hExtra_CSCActivityWithMET->setBinLabel(1,"Track",1);
00263         hExtra_CSCActivityWithMET->setBinLabel(1,"Track",2);
00264         hExtra_CSCActivityWithMET->setBinLabel(2, "Segments",1);
00265         hExtra_CSCActivityWithMET->setBinLabel(2, "Segments",2);
00266         hExtra_CSCActivityWithMET->setBinLabel(3, "RecHits", 1);
00267         hExtra_CSCActivityWithMET->setBinLabel(3, "RecHits", 2);
00268         hExtra_CSCActivityWithMET->setBinLabel(4, "Nothing", 1);
00269         hExtra_CSCActivityWithMET->setBinLabel(4, "Nothing", 2);
00270         hExtra_InnerMostTrackHitR  = dqm->book1D("Extra_InnerMostTrackHitR", "", 70, 99.5, 799.5);
00271         hExtra_InnerMostTrackHitPhi  = dqm->book1D("Extra_InnerMostTrackHitPhi","", 72, -TMath::Pi(), TMath::Pi());
00272       }
00273     else 
00274       {
00275         hExtra_CSCActivityWithMET= dqm->book2D("Extra_CSCActivityWithMET", "", 4, 0.5, 4.5, 4, 0.5, 4.5);
00276         hExtra_CSCActivityWithMET->setBinLabel(1,"Track",1);
00277         hExtra_CSCActivityWithMET->setBinLabel(1,"Track",2);
00278         hExtra_CSCActivityWithMET->setBinLabel(2, "Segments",1);
00279         hExtra_CSCActivityWithMET->setBinLabel(2, "Segments",2);
00280         hExtra_CSCActivityWithMET->setBinLabel(3, "RecHits", 1);
00281         hExtra_CSCActivityWithMET->setBinLabel(3, "RecHits", 2);
00282         hExtra_CSCActivityWithMET->setBinLabel(4, "Nothing", 1);
00283         hExtra_CSCActivityWithMET->setBinLabel(4, "Nothing", 2);
00284         hExtra_HcalToF  = dqm->book2D("Extra_HcalToF","" , 83,-41.5,41.5 , 1000, -125., 125.); 
00285         hExtra_HcalToF_HaloId  = dqm->book2D("Extra_HcalToF_HaloId","", 83,-41.5,41.5 , 1000, -125., 125.); 
00286         hExtra_EcalToF  = dqm->book2D("Extra_EcalToF","",  171,-85.5,85.5 , 2000, -225., 225.); 
00287         hExtra_EcalToF_HaloId  = dqm->book2D("Extra_EcalToF_HaloId","",  171,-85.5,85.5 , 2000, -225., 225.); 
00288         hExtra_CSCTrackInnerOuterDPhi = dqm->book1D("Extra_CSCTrackInnerOuterDPhi","",100, 0, TMath::Pi() );
00289         hExtra_CSCTrackInnerOuterDEta = dqm->book1D("Extra_CSCTrackInnerOuterDEta","", 100, 0, TMath::Pi() );
00290         hExtra_CSCTrackChi2Ndof  = dqm->book1D("Extra_CSCTrackChi2Ndof","", 100, 0, 10);
00291         hExtra_CSCTrackNHits     = dqm->book1D("Extra_CSCTrackNHits","", 75,0, 75);
00292         hExtra_InnerMostTrackHitXY  = dqm->book2D("Extra_InnerMostTrackHitXY","", 100,-700,700,100, -700,700);
00293         hExtra_InnerMostTrackHitR  = dqm->book1D("Extra_InnerMostTrackHitR", "", 400, -0.5, 799.5);
00294         hExtra_InnerMostTrackHitRPlusZ = dqm->book2D("Extra_InnerMostTrackHitRPlusZ","", 400 , 400, 1200, 400, -0.5, 799.5 );
00295         hExtra_InnerMostTrackHitRMinusZ = dqm->book2D("Extra_InnerMostTrackHitRMinusZ","", 400 , -1200, -400, 400, -0.5, 799.5 );
00296         hExtra_InnerMostTrackHitiPhi  = dqm->book1D("Extra_InnerMostTrackHitiPhi","", 72, 0.5, 72.5);
00297         hExtra_InnerMostTrackHitPhi  = dqm->book1D("Extra_InnerMostTrackHitPhi","", 72, -TMath::Pi(), TMath::Pi());
00298         hExtra_BXN = dqm->book1D("Extra_BXN", "BXN Occupancy", 4000, 0.5, 4000.5);
00299       }
00300   }
00301 }
00302 
00303 void BeamHaloAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00304 {
00305   EventID TheEvent = iEvent.id();
00306   int BXN = iEvent.bunchCrossing() ;
00307   bool Dump = TextFileName.size();
00308   int TheEventNumber = TheEvent.event();
00309   int Lumi = iEvent.luminosityBlock();
00310   int Run  = iEvent.run();
00311 
00312   //Get CSC Geometry
00313   edm::ESHandle<CSCGeometry> TheCSCGeometry;
00314   iSetup.get<MuonGeometryRecord>().get(TheCSCGeometry);
00315 
00316   //Get CaloGeometry
00317   edm::ESHandle<CaloGeometry> TheCaloGeometry;
00318   iSetup.get<CaloGeometryRecord>().get(TheCaloGeometry);
00319 
00320   //Get Stand-alone Muons from Cosmic Muon Reconstruction
00321   edm::Handle< reco::MuonCollection > TheCosmics;
00322   iEvent.getByLabel(IT_CosmicStandAloneMuon, TheCosmics);
00323   edm::Handle<reco::MuonTimeExtraMap> TheCSCTimeMap;
00324   iEvent.getByLabel(IT_CosmicStandAloneMuon.label(),"csc",TheCSCTimeMap);
00325   bool CSCTrackPlus = false; bool CSCTrackMinus = false;
00326   int imucount=0;
00327   if( TheCosmics.isValid() )
00328     {
00329       for( reco::MuonCollection::const_iterator iMuon = TheCosmics->begin() ; iMuon != TheCosmics->end() ; iMuon++, imucount++ )
00330         {
00331           reco::TrackRef Track = iMuon->outerTrack();
00332           if(!Track) continue;
00333 
00334           if( !CSCTrackPlus || !CSCTrackMinus )
00335             {
00336               if( Track->eta() > 0 || Track->outerPosition().z() > 0  || Track->innerPosition().z() > 0 ) CSCTrackPlus = true ;
00337               else if( Track->eta() < 0 || Track->outerPosition().z() < 0 || Track->innerPosition().z() < 0) CSCTrackMinus = true;
00338             }
00339           
00340           float innermost_phi = 0.;
00341           float outermost_phi = 0.;
00342           float innermost_z = 99999.;
00343           float outermost_z = 0.;
00344           float innermost_eta = 0.;
00345           float outermost_eta = 0.;
00346           float innermost_x =0.;
00347           float innermost_y =0.;
00348           float innermost_r =0.;
00349           for(unsigned int j = 0 ; j < Track->extra()->recHits().size(); j++ )
00350             {
00351               edm::Ref<TrackingRecHitCollection> hit( Track->extra()->recHits(), j );
00352               DetId TheDetUnitId(hit->geographicalId());
00353               if( TheDetUnitId.det() != DetId::Muon ) continue;
00354               if( TheDetUnitId.subdetId() != MuonSubdetId::CSC ) continue;
00355 
00356               const GeomDetUnit *TheUnit = TheCSCGeometry->idToDetUnit(TheDetUnitId);
00357               LocalPoint TheLocalPosition = hit->localPosition();  
00358               const BoundPlane& TheSurface = TheUnit->surface();
00359               const GlobalPoint TheGlobalPosition = TheSurface.toGlobal(TheLocalPosition);
00360               
00361               float z = TheGlobalPosition.z();
00362               if( TMath::Abs(z) < innermost_z )
00363                 {
00364                   innermost_phi = TheGlobalPosition.phi();
00365                   innermost_eta = TheGlobalPosition.eta();
00366                   innermost_z   = TheGlobalPosition.z();
00367                   innermost_x   = TheGlobalPosition.x();
00368                   innermost_y   = TheGlobalPosition.y();
00369                   innermost_r = TMath::Sqrt( innermost_x*innermost_x + innermost_y*innermost_y );
00370                 }
00371               if( TMath::Abs(z) > outermost_z)
00372                 {
00373                   outermost_phi = TheGlobalPosition.phi() ;
00374                   outermost_eta = TheGlobalPosition.eta() ;
00375                   outermost_z   = TheGlobalPosition.z();
00376                 }
00377             }
00378           float dphi = TMath::Abs( outermost_phi - innermost_phi );
00379           float deta = TMath::Abs( outermost_eta - innermost_eta );
00380           hExtra_CSCTrackInnerOuterDPhi -> Fill( dphi );
00381           hExtra_CSCTrackInnerOuterDEta -> Fill( deta ); 
00382           hExtra_CSCTrackChi2Ndof  -> Fill(Track->normalizedChi2() );
00383           hExtra_CSCTrackNHits     -> Fill(Track->numberOfValidHits() );
00384           hExtra_InnerMostTrackHitR  ->Fill(innermost_r);
00385           hExtra_InnerMostTrackHitPhi ->Fill(innermost_phi);      
00386           if( !StandardDQM )
00387             {
00388               hExtra_InnerMostTrackHitXY  ->Fill(innermost_x, innermost_y);
00389               hExtra_InnerMostTrackHitiPhi ->Fill(Phi_To_iPhi(innermost_phi));        
00390               if(innermost_z > 0 ) 
00391                 hExtra_InnerMostTrackHitRPlusZ ->Fill(innermost_z, innermost_r);
00392               else 
00393                 hExtra_InnerMostTrackHitRMinusZ ->Fill(innermost_z, innermost_r);
00394             }
00395 
00396           std::vector<const CSCSegment*> MatchedSegments = TheMatcher->matchCSC(*Track,iEvent);
00397           // Find the inner and outer segments separately in case they don't agree completely with recHits
00398           // Plan for the possibility segments in both endcaps
00399           float InnerSegmentTime[2] = {0,0};
00400           float OuterSegmentTime[2] = {0,0};
00401           float innermost_seg_z[2] = {1500,1500};
00402           float outermost_seg_z[2] = {0,0};
00403           for (std::vector<const CSCSegment*>::const_iterator segment =MatchedSegments.begin();
00404                segment != MatchedSegments.end(); ++segment)
00405             {
00406               CSCDetId TheCSCDetId((*segment)->cscDetId());
00407               const CSCChamber* TheCSCChamber = TheCSCGeometry->chamber(TheCSCDetId);
00408               LocalPoint TheLocalPosition = (*segment)->localPosition();
00409               const GlobalPoint TheGlobalPosition = TheCSCChamber->toGlobal(TheLocalPosition);
00410               float z = TheGlobalPosition.z();
00411               int TheEndcap = TheCSCDetId.endcap();
00412               if( TMath::Abs(z) < innermost_seg_z[TheEndcap-1] )
00413                 {
00414                   innermost_seg_z[TheEndcap-1] = TMath::Abs(z);
00415                   InnerSegmentTime[TheEndcap-1] = (*segment)->time();
00416                 }
00417               if( TMath::Abs(z) > outermost_seg_z[TheEndcap-1] )
00418                 {
00419                   outermost_seg_z[TheEndcap-1] = TMath::Abs(z);
00420                   OuterSegmentTime[TheEndcap-1] = (*segment)->time();
00421                 }
00422             }
00423 
00424           float dT_Segment = 0; // default safe value, looks like collision muon
00425           if( innermost_seg_z[0] < outermost_seg_z[0]) // two segments in ME+
00426             dT_Segment =  OuterSegmentTime[0]-InnerSegmentTime[0];
00427           if( innermost_seg_z[1] < outermost_seg_z[1]) // two segments in ME-
00428             {
00429               // replace the measurement if there weren't segments in ME+ or
00430               // if the track in ME- has timing more consistent with an incoming particle
00431               if (dT_Segment == 0.0 ||  OuterSegmentTime[1]-InnerSegmentTime[1] < dT_Segment)
00432                 dT_Segment = OuterSegmentTime[1]-InnerSegmentTime[1] ;
00433             }
00434           hCSCHaloData_SegmentdT->Fill(dT_Segment);
00435 
00436           // Analyze the MuonTimeExtra information
00437           reco::MuonRef muonR(TheCosmics,imucount);
00438           if (TheCSCTimeMap.isValid()){
00439             const reco::MuonTimeExtraMap & timeMapCSC = *TheCSCTimeMap;
00440             reco::MuonTimeExtra timecsc = timeMapCSC[muonR];
00441             float freeInverseBeta = timecsc.freeInverseBeta();
00442             hCSCHaloData_FreeInverseBeta->Fill(freeInverseBeta);
00443             hCSCHaloData_FreeInverseBetaVsSegmentdT->Fill(dT_Segment,freeInverseBeta);
00444           }
00445 
00446         }
00447     }
00448   
00449   //Get CSC Segments
00450   edm::Handle<CSCSegmentCollection> TheCSCSegments;
00451   iEvent.getByLabel(IT_CSCSegment, TheCSCSegments);
00452 
00453   // Group segments according to endcaps
00454   std::vector< CSCSegment> vCSCSegments_Plus;
00455   std::vector< CSCSegment> vCSCSegments_Minus;
00456 
00457   bool CSCSegmentPlus = false; 
00458   bool CSCSegmentMinus=false;
00459   if( TheCSCSegments.isValid() ) 
00460     {
00461       for(CSCSegmentCollection::const_iterator iSegment = TheCSCSegments->begin(); iSegment != TheCSCSegments->end(); iSegment++) 
00462         {
00463           const std::vector<CSCRecHit2D> vCSCRecHits = iSegment->specificRecHits();
00464           CSCDetId iDetId  = (CSCDetId)(*iSegment).cscDetId();
00465           
00466           if ( iDetId.endcap() == 1 ) vCSCSegments_Plus.push_back( *iSegment );
00467           else vCSCSegments_Minus.push_back( *iSegment );
00468         }      
00469     }
00470   
00471   // Are there segments on the plus/minus side?  
00472   if( vCSCSegments_Plus.size() ) CSCSegmentPlus = true;
00473   if( vCSCSegments_Minus.size() ) CSCSegmentMinus = true;
00474 
00475   //Get CSC RecHits
00476   Handle<CSCRecHit2DCollection> TheCSCRecHits;
00477   iEvent.getByLabel(IT_CSCRecHit, TheCSCRecHits);
00478   bool CSCRecHitPlus = false; 
00479   bool CSCRecHitMinus = false;
00480   if( TheCSCRecHits.isValid() )
00481     {
00482       for(CSCRecHit2DCollection::const_iterator iCSCRecHit = TheCSCRecHits->begin();   iCSCRecHit != TheCSCRecHits->end(); iCSCRecHit++ )
00483         {
00484           DetId TheDetUnitId(iCSCRecHit->geographicalId());
00485           const GeomDetUnit *TheUnit = (*TheCSCGeometry).idToDetUnit(TheDetUnitId);
00486           LocalPoint TheLocalPosition = iCSCRecHit->localPosition();
00487           const BoundPlane& TheSurface = TheUnit->surface();
00488           GlobalPoint TheGlobalPosition = TheSurface.toGlobal(TheLocalPosition);
00489 
00490           //Are there hits on the plus/minus side?
00491           if ( TheGlobalPosition.z() > 0 ) CSCRecHitPlus = true;
00492           else CSCRecHitMinus = true;
00493         }
00494     }
00495   
00496   //Get  EB RecHits
00497   edm::Handle<EBRecHitCollection> TheEBRecHits;
00498   iEvent.getByLabel(IT_EBRecHit, TheEBRecHits);
00499   int EBHits=0;
00500   if( TheEBRecHits.isValid() )
00501     {
00502       for( EBRecHitCollection::const_iterator iEBRecHit = TheEBRecHits->begin() ; iEBRecHit != TheEBRecHits->end(); iEBRecHit++)
00503         {
00504           if( iEBRecHit->energy() < 0.5 ) continue;
00505           DetId id = DetId( iEBRecHit->id() ) ;
00506           EBDetId EcalId ( id.rawId() );
00507           int ieta = EcalId.ieta() ;
00508           if(!StandardDQM)
00509             hExtra_EcalToF ->Fill(ieta, iEBRecHit->time() );
00510           EBHits++;
00511         }
00512     }
00513   
00514 
00515   //Get HB/HE RecHits
00516   edm::Handle<HBHERecHitCollection> TheHBHERecHits;
00517   iEvent.getByLabel(IT_HBHERecHit, TheHBHERecHits);
00518   if( TheHBHERecHits.isValid() )
00519     {
00520       for( HBHERecHitCollection::const_iterator iHBHERecHit = TheHBHERecHits->begin(); iHBHERecHit != TheHBHERecHits->end(); iHBHERecHit++)  
00521         {
00522           if( iHBHERecHit->energy() < 1.) continue;
00523           HcalDetId id = HcalDetId( iHBHERecHit->id() );
00524           if(!StandardDQM)
00525             hExtra_HcalToF->Fill( id.ieta(), iHBHERecHit->time() ) ;
00526         }
00527     }
00528 
00529   //Get MET
00530   edm::Handle< reco::CaloMETCollection > TheCaloMET;
00531   iEvent.getByLabel(IT_met, TheCaloMET);
00532 
00533   //Get CSCHaloData
00534   edm::Handle<reco::CSCHaloData> TheCSCDataHandle;
00535   iEvent.getByLabel(IT_CSCHaloData,TheCSCDataHandle);
00536   int TheHaloOrigin = 0;
00537   if (TheCSCDataHandle.isValid())
00538     {
00539       const CSCHaloData CSCData = (*TheCSCDataHandle.product());
00540       if( CSCData.NumberOfOutOfTimeTriggers(HaloData::plus) && !CSCData.NumberOfOutOfTimeTriggers(HaloData::minus) ) 
00541         TheHaloOrigin = 1;
00542       else if ( CSCData.NumberOfOutOfTimeTriggers(HaloData::minus) && !CSCData.NumberOfOutOfTimeTriggers(HaloData::plus))
00543         TheHaloOrigin = -1 ;
00544 
00545       for( std::vector<GlobalPoint>::const_iterator i=CSCData.GetCSCTrackImpactPositions().begin();  i != CSCData.GetCSCTrackImpactPositions().end() ; i++ )   
00546         {                          
00547           float r = TMath::Sqrt( i->x()*i->x() + i->y()*i->y() );
00548           if( !StandardDQM )
00549             {
00550               hCSCHaloData_InnerMostTrackHitXY->Fill( i->x(), i->y() );
00551               hCSCHaloData_InnerMostTrackHitiPhi  ->Fill( Phi_To_iPhi( i->phi())); 
00552               if( i->z() > 0 ) 
00553                 hCSCHaloData_InnerMostTrackHitRPlusZ ->Fill(i->z(), r) ;
00554               else
00555                 hCSCHaloData_InnerMostTrackHitRMinusZ ->Fill(i->z(), r) ;
00556             }
00557           hCSCHaloData_InnerMostTrackHitR  ->Fill(r);
00558           hCSCHaloData_InnerMostTrackHitPhi  ->Fill( i->phi()); 
00559         }
00560       hCSCHaloData_L1HaloTriggersMEPlus   -> Fill ( CSCData.NumberOfHaloTriggers(HaloData::plus) );
00561       hCSCHaloData_L1HaloTriggersMEMinus  -> Fill ( CSCData.NumberOfHaloTriggers(HaloData::minus));
00562       hCSCHaloData_L1HaloTriggers  -> Fill ( CSCData.NumberOfHaloTriggers(HaloData::both));
00563       hCSCHaloData_HLHaloTriggers  -> Fill ( CSCData.CSCHaloHLTAccept());
00564       hCSCHaloData_TrackMultiplicityMEPlus ->Fill ( CSCData.NumberOfHaloTracks(HaloData::plus) );
00565       hCSCHaloData_TrackMultiplicityMEMinus ->Fill ( CSCData.NumberOfHaloTracks(HaloData::minus) );
00566       hCSCHaloData_TrackMultiplicity->Fill( CSCData.GetTracks().size() );
00567       hCSCHaloData_NOutOfTimeTriggersMEPlus->Fill( CSCData.NOutOfTimeTriggers(HaloData::plus) );
00568       hCSCHaloData_NOutOfTimeTriggersMEMinus->Fill( CSCData.NOutOfTimeTriggers(HaloData::minus) );
00569       hCSCHaloData_NOutOfTimeTriggers->Fill( CSCData.NOutOfTimeTriggers(HaloData::both) );
00570       hCSCHaloData_NOutOfTimeHits->Fill( CSCData.NOutOfTimeHits() );
00571       hCSCHaloData_NOutOfTimeTriggersvsL1HaloExists->Fill( CSCData.NOutOfTimeTriggers(HaloData::both), CSCData.NumberOfHaloTriggers(HaloData::both) >0 );
00572       hCSCHaloData_NTracksSmalldT            ->Fill( CSCData.NTracksSmalldT()            );  
00573       hCSCHaloData_NTracksSmallBeta          ->Fill( CSCData.NTracksSmallBeta()          );
00574       hCSCHaloData_NTracksSmallBetaAndSmalldT->Fill( CSCData.NTracksSmallBetaAndSmalldT());
00575       hCSCHaloData_NTracksSmalldTvsNHaloTracks->Fill( CSCData.GetTracks().size(), CSCData.NTracksSmalldT()  );  
00576       // MLR
00577       hCSCHaloData_NFlatHaloSegments->Fill(CSCData.NFlatHaloSegments());
00578       hCSCHaloData_SegmentsInBothEndcaps->Fill(CSCData.GetSegmentsInBothEndcaps());
00579       if (CSCData.GetSegmentsInBothEndcaps())
00580         hCSCHaloData_NFlatSegmentsInBothEndcaps->Fill(CSCData.NFlatHaloSegments());
00581       // End MLR
00582   }
00583 
00584   //Get EcalHaloData 
00585   edm::Handle<reco::EcalHaloData> TheEcalHaloData;
00586   iEvent.getByLabel(IT_EcalHaloData, TheEcalHaloData );
00587   if( TheEcalHaloData.isValid() ) 
00588     {
00589       const EcalHaloData EcalData = (*TheEcalHaloData.product()); 
00590       std::vector<PhiWedge> EcalWedges = EcalData.GetPhiWedges();                                                                                              
00591       for(std::vector<PhiWedge>::const_iterator iWedge = EcalWedges.begin() ; iWedge != EcalWedges.end(); iWedge ++ )                                  
00592         {                                                                                                                                                     
00593           if(!StandardDQM ) 
00594             {
00595               hEcalHaloData_PhiWedgeEnergy->Fill( iWedge->Energy() );
00596               hEcalHaloData_PhiWedgeMinTime     ->Fill( iWedge->MinTime() );
00597               hEcalHaloData_PhiWedgeMaxTime     ->Fill( iWedge->MaxTime() );
00598               hEcalHaloData_PhiWedgeMinVsMaxTime->Fill(iWedge->MinTime() , iWedge->MaxTime() ) ;
00599               hEcalHaloData_PhiWedgePlusZDirectionConfidence->Fill( iWedge->PlusZDirectionConfidence() );
00600               hEcalHaloData_PhiWedgeiPhi->Fill(iWedge->iPhi() ) ;
00601             }
00602           hEcalHaloData_PhiWedgeZDirectionConfidence ->Fill( iWedge->ZDirectionConfidence() );
00603           hEcalHaloData_PhiWedgeConstituents->Fill( iWedge->NumberOfConstituents() ) ;
00604         }      
00605 
00606       hEcalHaloData_PhiWedgeMultiplicity->Fill( EcalWedges.size() );
00607 
00608       edm::ValueMap<float> vm_Angle = EcalData.GetShowerShapesAngle();
00609       edm::ValueMap<float> vm_Roundness = EcalData.GetShowerShapesRoundness();
00610       //Access selected SuperClusters
00611       for(unsigned int n = 0 ; n < EcalData.GetSuperClusters().size() ; n++ )
00612         {
00613           edm::Ref<SuperClusterCollection> cluster(EcalData.GetSuperClusters(), n );
00614           float angle = vm_Angle[cluster];
00615           float roundness = vm_Roundness[cluster];
00616           hEcalHaloData_SuperClusterShowerShapes->Fill(angle, roundness);
00617           hEcalHaloData_SuperClusterNHits->Fill( cluster->size() );
00618           hEcalHaloData_SuperClusterEnergy->Fill(cluster->energy() );
00619 
00620           if(!StandardDQM)
00621             {
00622               hEcalHaloData_SuperClusterPhiVsEta->Fill(cluster->eta() ,cluster->phi() );
00623             }
00624         }
00625     }
00626 
00627   //Get HcalHaloData
00628   edm::Handle<reco::HcalHaloData> TheHcalHaloData;
00629   iEvent.getByLabel(IT_HcalHaloData ,TheHcalHaloData );
00630   if( TheHcalHaloData.isValid( ) )
00631     {
00632       const HcalHaloData HcalData = (*TheHcalHaloData.product());                                                                
00633       std::vector<PhiWedge> HcalWedges = HcalData.GetPhiWedges();                                                                                   
00634       hHcalHaloData_PhiWedgeMultiplicity ->Fill( HcalWedges.size() );
00635       for(std::vector<PhiWedge>::const_iterator iWedge = HcalWedges.begin() ; iWedge != HcalWedges.end(); iWedge ++ )                               
00636         {
00637           if( !StandardDQM ) 
00638             {
00639               hHcalHaloData_PhiWedgeEnergy       ->Fill( iWedge->Energy() );
00640               hHcalHaloData_PhiWedgeMinTime      ->Fill( iWedge->MinTime() );
00641               hHcalHaloData_PhiWedgeMaxTime      ->Fill( iWedge->MaxTime() );
00642               hHcalHaloData_PhiWedgePlusZDirectionConfidence ->Fill( iWedge->PlusZDirectionConfidence() );
00643               hHcalHaloData_PhiWedgeMinVsMaxTime  ->Fill( iWedge->MinTime() , iWedge->MaxTime() );
00644               hHcalHaloData_PhiWedgeiPhi         ->Fill( iWedge->iPhi() );
00645             }     
00646           
00647           hHcalHaloData_PhiWedgeConstituents ->Fill( iWedge->NumberOfConstituents() );
00648           hHcalHaloData_PhiWedgeZDirectionConfidence ->Fill( iWedge->ZDirectionConfidence() );
00649         }
00650     }
00651   
00652 
00653   if(!StandardDQM)
00654     {
00655       //Get GlobalHaloData
00656       edm::Handle<reco::GlobalHaloData> TheGlobalHaloData;
00657       iEvent.getByLabel(IT_GlobalHaloData, TheGlobalHaloData );
00658       if( TheGlobalHaloData.isValid() ) 
00659         {
00660           const GlobalHaloData GlobalData =(*TheGlobalHaloData.product());                                                           
00661           if( TheCaloMET.isValid() ) 
00662             {
00663               // Get Raw Uncorrected CaloMET
00664               const CaloMETCollection *calometcol = TheCaloMET.product();
00665               const CaloMET *RawMET = &(calometcol->front());
00666               
00667               // Get BeamHalo Corrected CaloMET 
00668               const CaloMET CorrectedMET = GlobalData.GetCorrectedCaloMET(*RawMET);
00669               hGlobalHaloData_MExCorrection  ->Fill( GlobalData.DeltaMEx() );
00670               hGlobalHaloData_MEyCorrection  ->Fill( GlobalData.DeltaMEy() );
00671               hGlobalHaloData_HaloCorrectedMET->Fill(CorrectedMET.pt() );
00672               hGlobalHaloData_RawMETMinusHaloCorrectedMET ->Fill( RawMET->pt() - CorrectedMET.pt() );
00673               if( RawMET->sumEt() )
00674                 hGlobalHaloData_RawMETOverSumEt ->Fill( RawMET->pt() / RawMET->sumEt() ); 
00675               
00676             }                
00677           
00678           // Get Matched Hcal Phi Wedges
00679           std::vector<PhiWedge> HcalWedges = GlobalData.GetMatchedHcalPhiWedges();
00680           hGlobalHaloData_MatchedHcalPhiWedgeMultiplicity ->Fill(HcalWedges.size());
00681           // Loop over Matched Hcal Phi Wedges
00682           for( std::vector<PhiWedge>::const_iterator iWedge = HcalWedges.begin() ; iWedge != HcalWedges.end() ; iWedge ++ )
00683             {
00684               hGlobalHaloData_MatchedHcalPhiWedgeEnergy       ->Fill( iWedge->Energy() );
00685               hGlobalHaloData_MatchedHcalPhiWedgeConstituents ->Fill( iWedge->NumberOfConstituents());
00686               hGlobalHaloData_MatchedHcalPhiWedgeiPhi         ->Fill( iWedge->iPhi() );
00687               hGlobalHaloData_MatchedHcalPhiWedgeMinTime      ->Fill( iWedge->MinTime() );
00688               hGlobalHaloData_MatchedHcalPhiWedgeMaxTime      ->Fill( iWedge->MaxTime() );
00689               hGlobalHaloData_MatchedHcalPhiWedgeZDirectionConfidence ->Fill( iWedge->ZDirectionConfidence() ) ;
00690               if( TheHBHERecHits.isValid() )
00691                 {
00692                   for( HBHERecHitCollection::const_iterator iHBHERecHit = TheHBHERecHits->begin(); iHBHERecHit != TheHBHERecHits->end(); iHBHERecHit++)  
00693                     {
00694                       HcalDetId id = HcalDetId( iHBHERecHit->id() ) ;
00695                       int iphi = id.iphi() ;
00696                       if( iphi != iWedge->iPhi() ) continue;
00697                       if( iHBHERecHit->energy() < 1.0) continue;  // Otherwise there are thousands of hits per event (even with negative energies)
00698                       
00699                       float time = iHBHERecHit->time();
00700                       int ieta = id.ieta();
00701                       hExtra_HcalToF_HaloId ->Fill( ieta, time );
00702                     }
00703                 }
00704             }
00705 
00706           // Get Matched Hcal Phi Wedges
00707           std::vector<PhiWedge> EcalWedges = GlobalData.GetMatchedEcalPhiWedges();
00708           hGlobalHaloData_MatchedEcalPhiWedgeMultiplicity ->Fill(EcalWedges.size());
00709           for( std::vector<PhiWedge>::const_iterator iWedge = EcalWedges.begin() ; iWedge != EcalWedges.end() ; iWedge ++ )
00710             {
00711               hGlobalHaloData_MatchedEcalPhiWedgeEnergy       ->Fill(iWedge->Energy());
00712               hGlobalHaloData_MatchedEcalPhiWedgeConstituents ->Fill(iWedge->NumberOfConstituents());
00713               hGlobalHaloData_MatchedEcalPhiWedgeiPhi         ->Fill(iWedge->iPhi());
00714               hGlobalHaloData_MatchedEcalPhiWedgeMinTime      ->Fill(iWedge->MinTime());
00715               hGlobalHaloData_MatchedEcalPhiWedgeMaxTime      ->Fill(iWedge->MaxTime());
00716               hGlobalHaloData_MatchedEcalPhiWedgeZDirectionConfidence ->Fill( iWedge->ZDirectionConfidence() ) ;
00717               if( TheEBRecHits.isValid() ) 
00718                 {
00719                   for( EBRecHitCollection::const_iterator iEBRecHit = TheEBRecHits->begin() ; iEBRecHit != TheEBRecHits->end(); iEBRecHit++ )
00720                     {
00721                       if( iEBRecHit->energy() < 0.5 ) continue;
00722                       DetId id = DetId( iEBRecHit->id() ) ;
00723                       EBDetId EcalId ( id.rawId() );
00724                       int iPhi = EcalId.iphi() ;
00725                       iPhi = (iPhi-1)/5 + 1;
00726                       if( iPhi != iWedge->iPhi() ) continue;
00727                       hExtra_EcalToF_HaloId ->Fill(EcalId.ieta(), iEBRecHit->time() );
00728                     }
00729                 }
00730             }
00731         }
00732     }
00733 
00734 
00735   // Get BeamHaloSummary 
00736   edm::Handle<BeamHaloSummary> TheBeamHaloSummary ;
00737   iEvent.getByLabel(IT_BeamHaloSummary, TheBeamHaloSummary) ;
00738   if( TheBeamHaloSummary.isValid() ) 
00739     {
00740       const BeamHaloSummary TheSummary = (*TheBeamHaloSummary.product() );
00741       if( TheSummary.CSCLooseHaloId() ) 
00742         {
00743           hBeamHaloSummary_Id ->Fill(1);
00744           if(!StandardDQM) hBeamHaloSummary_BXN -> Fill( 1, BXN );
00745           if(Dump)*out << std::setw(15) << "CSCLoose" << std::setw(15) << Run << std::setw(15) << Lumi << std::setw(15) << TheEventNumber << std::endl;
00746         }
00747       if( TheSummary.CSCTightHaloId() ) 
00748         {
00749           hBeamHaloSummary_Id ->Fill(2);
00750           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 2, BXN );
00751         }
00752       if( TheSummary.EcalLooseHaloId() )
00753         {
00754           hBeamHaloSummary_Id ->Fill(3);
00755           if(!StandardDQM) hBeamHaloSummary_BXN -> Fill( 3, BXN );
00756           if(Dump) *out << std::setw(15) << "EcalLoose" << std::setw(15) << Run << std::setw(15) << Lumi << std::setw(15) << TheEventNumber << std::endl;
00757         }
00758       if( TheSummary.EcalTightHaloId() ) 
00759         {
00760           hBeamHaloSummary_Id ->Fill(4);
00761           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 4, BXN );
00762         }
00763       if( TheSummary.HcalLooseHaloId() ) 
00764         {
00765           hBeamHaloSummary_Id ->Fill(5);
00766           if(!StandardDQM) hBeamHaloSummary_BXN -> Fill( 5, BXN );
00767           if(Dump) *out << std::setw(15) << "HcalLoose" << std::setw(15) << Run << std::setw(15) << Lumi << std::setw(15) << TheEventNumber << std::endl;
00768         }
00769       if( TheSummary.HcalTightHaloId() ) 
00770         {
00771           hBeamHaloSummary_Id ->Fill(6);
00772           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 6, BXN );
00773         }
00774       if( TheSummary.GlobalLooseHaloId()) 
00775         {
00776           hBeamHaloSummary_Id ->Fill(7);
00777           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 7, BXN );
00778           if(Dump) *out << std::setw(15) << "GlobalLoose" << std::setw(15) << Run << std::setw(15) << Lumi << std::setw(15) << TheEventNumber << std::endl;
00779         }
00780       if( TheSummary.GlobalTightHaloId() )
00781         {
00782           hBeamHaloSummary_Id ->Fill(8);        
00783           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 8, BXN );
00784         }
00785       if( TheSummary.LooseId() ) 
00786         {
00787           hBeamHaloSummary_Id ->Fill(9);
00788           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 9, BXN );
00789         }
00790       if( TheSummary.TightId() )
00791         {
00792           hBeamHaloSummary_Id ->Fill(10);
00793           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 10, BXN );
00794         }
00795       if( !TheSummary.EcalLooseHaloId()  && !TheSummary.HcalLooseHaloId() && !TheSummary.CSCLooseHaloId() && !TheSummary.GlobalLooseHaloId() )
00796         {
00797           hBeamHaloSummary_Id ->Fill(11);
00798           if(!StandardDQM)hBeamHaloSummary_BXN -> Fill( 11, BXN );
00799         }
00800     }
00801 
00802   if( TheCaloMET.isValid() )
00803     {
00804       const CaloMETCollection *calometcol = TheCaloMET.product();
00805       const CaloMET *calomet = &(calometcol->front());
00806       
00807       if( calomet->pt() > DumpMET )
00808         if(Dump) *out << std::setw(15) << "HighMET" << std::setw(15) << Run << std::setw(15) << Lumi << std::setw(15) << TheEventNumber << std::endl;
00809 
00810       //Fill CSC Activity Plot 
00811       if( calomet->pt() > 15.0 ) 
00812         {
00813           if( TheHaloOrigin > 0 )
00814             {
00815               if( CSCTrackPlus && CSCTrackMinus ) 
00816                 hExtra_CSCActivityWithMET->Fill(1,1);
00817               else if( CSCTrackPlus && CSCSegmentMinus) 
00818                 hExtra_CSCActivityWithMET->Fill(1,2);
00819               else if( CSCTrackPlus && CSCRecHitMinus ) 
00820                 hExtra_CSCActivityWithMET->Fill(1,3);
00821               else if( CSCTrackPlus ) 
00822                 hExtra_CSCActivityWithMET->Fill(1,4);
00823               else if( CSCSegmentPlus && CSCTrackMinus ) 
00824                 hExtra_CSCActivityWithMET->Fill(2,1);
00825               else if( CSCSegmentPlus && CSCSegmentMinus )
00826                 hExtra_CSCActivityWithMET-> Fill(2,2);
00827               else if( CSCSegmentPlus && CSCRecHitMinus   )
00828                 hExtra_CSCActivityWithMET-> Fill(2,3);
00829               else if( CSCSegmentPlus ) 
00830                 hExtra_CSCActivityWithMET->Fill(2,4 );
00831               else if( CSCRecHitPlus && CSCTrackMinus  ) 
00832                 hExtra_CSCActivityWithMET->Fill(3,1);
00833               else if( CSCRecHitPlus && CSCSegmentMinus ) 
00834                 hExtra_CSCActivityWithMET->Fill(3,2);
00835               else if( CSCRecHitPlus && CSCRecHitMinus ) 
00836                 hExtra_CSCActivityWithMET->Fill(3,3);
00837               else if( CSCRecHitPlus ) 
00838                 hExtra_CSCActivityWithMET->Fill(3,4);
00839               else 
00840                 hExtra_CSCActivityWithMET->Fill(4,4);
00841             }
00842           else if( TheHaloOrigin < 0 )
00843             {
00844               if( CSCTrackMinus && CSCTrackPlus ) 
00845                 hExtra_CSCActivityWithMET->Fill(1,1);
00846               else if( CSCTrackMinus && CSCSegmentPlus)
00847                 hExtra_CSCActivityWithMET->Fill(1,2);
00848               else if( CSCTrackMinus && CSCRecHitPlus ) 
00849                 hExtra_CSCActivityWithMET->Fill(1,3);
00850               else if( CSCTrackMinus ) 
00851                 hExtra_CSCActivityWithMET->Fill(1,4);
00852               else if( CSCSegmentMinus && CSCTrackPlus) 
00853                 hExtra_CSCActivityWithMET->Fill(2,1);
00854               else if( CSCSegmentMinus && CSCSegmentPlus ) 
00855                 hExtra_CSCActivityWithMET->Fill(2,2 );
00856               else if( CSCSegmentMinus && CSCRecHitPlus ) 
00857                 hExtra_CSCActivityWithMET->Fill(2,3);
00858               else if( CSCSegmentMinus ) 
00859                 hExtra_CSCActivityWithMET->Fill(2,4);
00860               else if( CSCRecHitMinus && CSCTrackPlus )
00861                 hExtra_CSCActivityWithMET->Fill(3,1 );
00862               else if( CSCRecHitMinus && CSCSegmentPlus )
00863                 hExtra_CSCActivityWithMET->Fill(3,2 );
00864               else if( CSCRecHitMinus && CSCRecHitPlus ) 
00865                 hExtra_CSCActivityWithMET->Fill(3,3);
00866               else if( CSCRecHitMinus )
00867                 hExtra_CSCActivityWithMET->Fill(3,4);
00868               else hExtra_CSCActivityWithMET->Fill(4,4);
00869             }
00870         }
00871     }
00872   
00873 }
00874 
00875 void BeamHaloAnalyzer::endJob()
00876 {
00877 
00878 }
00879 
00880 BeamHaloAnalyzer::~BeamHaloAnalyzer(){
00881 }
00882 
00883 //DEFINE_FWK_MODULE(CMSEventAnalyzer);
00884 
00885 
00886 
00887