CMS 3D CMS Logo

/afs/cern.ch/work/a/aaltunda/public/www/CMSSW_6_2_7/src/SUSYBSMAnalysis/HSCP/src/HSCPTreeBuilder.cc

Go to the documentation of this file.
00001 // -*- C++ -*-
00002 //
00003 // Package:    HSCPTreeBuilder
00004 // Class:      HSCPTreeBuilder
00005 // 
00013 //
00014 // Original Author:  Loic QUERTENMONT
00015 //         Created:  Thu Mar 11 12:19:07 CEST 2010
00016 // $Id: HSCPTreeBuilder.cc,v 1.8 2012/12/26 22:12:10 wmtan Exp $
00017 //
00018 
00019 
00020 #include <memory>
00021 #include <cmath>
00022 
00023 #include "FWCore/Framework/interface/Frameworkfwd.h"
00024 #include "FWCore/Framework/interface/EDFilter.h"
00025 #include "FWCore/Framework/interface/Event.h"
00026 #include "FWCore/Framework/interface/MakerMacros.h"
00027 #include "FWCore/Framework/interface/ESHandle.h"
00028 #include "FWCore/ParameterSet/interface/ParameterSet.h"
00029 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00030 #include "FWCore/Utilities/interface/Exception.h"
00031 
00032 #include "DataFormats/TrackReco/interface/DeDxData.h"
00033 
00034 #include <MagneticField/Engine/interface/MagneticField.h>
00035 #include <MagneticField/Records/interface/IdealMagneticFieldRecord.h>
00036 
00037 #include "Geometry/CommonDetUnit/interface/GeomDetUnit.h"
00038 #include "Geometry/CommonDetUnit/interface/GeomDetType.h"
00039 #include "Geometry/CommonTopologies/interface/StripTopology.h"
00040 #include "DataFormats/GeometrySurface/interface/TrapezoidalPlaneBounds.h"
00041 #include "DataFormats/GeometrySurface/interface/RectangularPlaneBounds.h"
00042 
00043 #include "Geometry/TrackerGeometryBuilder/interface/TrackerGeometry.h"
00044 #include "Geometry/Records/interface/TrackerDigiGeometryRecord.h"
00045 #include "Geometry/TrackerGeometryBuilder/interface/StripGeomDetUnit.h"
00046 #include "Geometry/TrackerGeometryBuilder/interface/PixelGeomDetUnit.h"
00047 #include "Geometry/TrackerNumberingBuilder/interface/GeometricDet.h"
00048 #include "Geometry/CommonDetUnit/interface/TrackingGeometry.h"
00049 
00050 #include "DataFormats/SiStripCluster/interface/SiStripClusterCollection.h"
00051 
00052 #include "DataFormats/MuonReco/interface/Muon.h"
00053 #include "DataFormats/MuonReco/interface/MuonFwd.h"
00054 
00055 #include "DataFormats/TrackReco/interface/Track.h"
00056 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00057 #include "DataFormats/TrackerRecHit2D/interface/SiStripRecHit2D.h"
00058 #include "DataFormats/TrackerRecHit2D/interface/SiStripMatchedRecHit2D.h"
00059 #include "DataFormats/SiStripDetId/interface/SiStripSubStructure.h"
00060 #include "DataFormats/DetId/interface/DetId.h"
00061 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
00062 
00063 #include "TrackingTools/PatternTools/interface/Trajectory.h"
00064 #include "TrackingTools/PatternTools/interface/TrajTrackAssociation.h"
00065 
00066 #include "DataFormats/TrackReco/interface/TrackFwd.h"
00067 
00068 #include "FWCore/ServiceRegistry/interface/Service.h"
00069 #include "CommonTools/UtilAlgos/interface/TFileService.h"
00070 
00071 
00072 #include "DataFormats/Common/interface/TriggerResults.h"
00073 #include "FWCore/Common/interface/TriggerNames.h"
00074 #include "FWCore/Framework/interface/TriggerNamesService.h"
00075 
00076 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
00077 #include "DataFormats/HepMCCandidate/interface/GenParticle.h"
00078 
00079 #include "CommonTools/UtilAlgos/interface/DeltaR.h"
00080 
00081 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskTechTrigRcd.h"
00082 #include "CondFormats/DataRecord/interface/L1GtTriggerMaskAlgoTrigRcd.h"
00083 #include "CondFormats/L1TObjects/interface/L1GtTriggerMask.h"
00084 #include "DataFormats/L1GlobalTrigger/interface/L1GlobalTriggerReadoutRecord.h"
00085 
00086 #include "DataFormats/VertexReco/interface/Vertex.h"
00087 #include "DataFormats/VertexReco/interface/VertexFwd.h"
00088 
00089 #include "DataFormats/MuonReco/interface/MuonTimeExtra.h"
00090 #include "DataFormats/MuonReco/interface/MuonTimeExtraMap.h"
00091 
00092 #include "AnalysisDataFormats/SUSYBSMObjects/interface/HSCParticle.h"
00093 
00094 
00095 #include "TFile.h"
00096 #include "TObjString.h"
00097 #include "TString.h"
00098 #include "TH1F.h"
00099 #include "TH2F.h"
00100 #include "TProfile.h"
00101 #include "TF1.h"
00102 #include "TTree.h"
00103 #include "TROOT.h"
00104 
00105 #include <ext/hash_map>
00106 
00107 
00108 using namespace edm;
00109 using namespace reco;
00110 using namespace std;
00111 using namespace __gnu_cxx;
00112 
00113 #define MAX_VERTICES 1000
00114 #define MAX_HSCPS    10000
00115 #define MAX_GENS     10000
00116 #define MAX_ECALCRYS 10
00117 
00118 class HSCPTreeBuilder : public edm::EDFilter {
00119         public:
00120                 explicit HSCPTreeBuilder(const edm::ParameterSet&);
00121                 ~HSCPTreeBuilder();
00122 
00123 
00124         private:
00125                 virtual void beginJob() ;
00126                 virtual bool filter(edm::Event&, const edm::EventSetup&);
00127                 virtual void endJob() ;
00128                 int ClosestMuonIndex(reco::TrackRef track, std::vector<reco::MuonRef>);
00129 
00130                 const edm::EventSetup* iSetup_;
00131                 const edm::Event*      iEvent_;
00132 
00133                 edm::Service<TFileService> tfs;
00134                 InputTag       m_HSCPsTag;
00135                 bool           reccordVertexInfo;
00136                 bool           reccordGenInfo;
00137 
00138                 TTree*         MyTree;
00139                 bool           Event_triggerL1Bits[192];
00140                 bool           Event_triggerHLTBits[128];
00141                 bool           Event_technicalBits[64];
00142                 unsigned int   Event_EventNumber;
00143                 unsigned int   Event_RunNumber;
00144                 unsigned int   Event_LumiSection;
00145                 unsigned int   Event_BXCrossing;
00146                 unsigned int   Event_Orbit;
00147                 unsigned int   Event_Store;
00148                 unsigned int   Event_Time;
00149                 bool           Event_PhysicsDeclared;
00150                 float          Event_BField;
00151 
00152                 unsigned int   NVertices;
00153                 float          Vertex_x           [MAX_VERTICES];
00154                 float          Vertex_y           [MAX_VERTICES];
00155                 float          Vertex_z           [MAX_VERTICES];
00156                 float          Vertex_x_err       [MAX_VERTICES];
00157                 float          Vertex_y_err       [MAX_VERTICES];
00158                 float          Vertex_z_err       [MAX_VERTICES];
00159                 int            Vertex_TrackSize   [MAX_VERTICES];
00160                 float          Vertex_chi2        [MAX_VERTICES];
00161                 float          Vertex_ndof        [MAX_VERTICES];
00162                 bool           Vertex_isFake      [MAX_VERTICES];
00163 
00164                 unsigned int   NHSCPs;
00165                 bool           Hscp_hasTrack      [MAX_HSCPS];
00166                 bool           Hscp_hasMuon       [MAX_HSCPS];
00167                 bool           Hscp_hasRpc        [MAX_HSCPS];
00168                 bool           Hscp_hasCalo       [MAX_HSCPS];
00169                 int            Hscp_type          [MAX_HSCPS];
00170                 unsigned int   Track_NOH          [MAX_HSCPS];
00171                 float          Track_p            [MAX_HSCPS];
00172                 float          Track_pt           [MAX_HSCPS];
00173                 float          Track_pt_err       [MAX_HSCPS];
00174                 float          Track_chi2         [MAX_HSCPS];
00175                 unsigned int   Track_ndof         [MAX_HSCPS];
00176                 float          Track_eta          [MAX_HSCPS];  
00177                 float          Track_eta_err      [MAX_HSCPS];
00178                 float          Track_phi          [MAX_HSCPS];
00179                 float          Track_phi_err      [MAX_HSCPS];
00180                 float          Track_dz           [MAX_HSCPS];
00181                 float          Track_d0           [MAX_HSCPS];
00182                 int            Track_quality      [MAX_HSCPS];
00183                 int            Track_charge       [MAX_HSCPS];
00184                 float          Track_dEdxE1       [MAX_HSCPS];
00185                 float          Track_dEdxE1_NOS   [MAX_HSCPS];
00186                 unsigned int   Track_dEdxE1_NOM   [MAX_HSCPS];
00187                 float          Track_dEdxE2       [MAX_HSCPS];
00188                 float          Track_dEdxE2_NOS   [MAX_HSCPS];
00189                 unsigned int   Track_dEdxE2_NOM   [MAX_HSCPS];
00190                 float          Track_dEdxE3       [MAX_HSCPS];
00191                 float          Track_dEdxE3_NOS   [MAX_HSCPS];
00192                 unsigned int   Track_dEdxE3_NOM   [MAX_HSCPS];
00193                 float          Track_dEdxD1       [MAX_HSCPS];
00194                 float          Track_dEdxD1_NOS   [MAX_HSCPS];
00195                 unsigned int   Track_dEdxD1_NOM   [MAX_HSCPS];
00196                 float          Track_dEdxD2       [MAX_HSCPS]; 
00197                 float          Track_dEdxD2_NOS   [MAX_HSCPS];
00198                 unsigned int   Track_dEdxD2_NOM   [MAX_HSCPS];
00199                 float          Track_dEdxD3       [MAX_HSCPS];
00200                 float          Track_dEdxD3_NOS   [MAX_HSCPS];
00201                 unsigned int   Track_dEdxD3_NOM   [MAX_HSCPS];
00202                 float          Muon_p             [MAX_HSCPS];
00203                 float          Muon_pt            [MAX_HSCPS];
00204                 float          Muon_eta           [MAX_HSCPS];
00205                 float          Muon_phi           [MAX_HSCPS];
00206                 int            Muon_type          [MAX_HSCPS];
00207                 bool           Muon_qualityValid  [MAX_HSCPS];
00208                 int            Muon_charge        [MAX_HSCPS];
00209                 float          Muon_dt_IBeta      [MAX_HSCPS];
00210                 float          Muon_dt_IBeta_err  [MAX_HSCPS];
00211                 float          Muon_dt_fIBeta     [MAX_HSCPS];
00212                 float          Muon_dt_fIBeta_err [MAX_HSCPS];
00213                 int            Muon_dt_ndof       [MAX_HSCPS];
00214                 float          Muon_csc_IBeta     [MAX_HSCPS];
00215                 float          Muon_csc_IBeta_err [MAX_HSCPS];
00216                 float          Muon_csc_fIBeta    [MAX_HSCPS];
00217                 float          Muon_csc_fIBeta_err[MAX_HSCPS];
00218                 int            Muon_csc_ndof      [MAX_HSCPS];
00219                 float          Muon_cb_IBeta      [MAX_HSCPS];
00220                 float          Muon_cb_IBeta_err  [MAX_HSCPS];
00221                 float          Muon_cb_fIBeta     [MAX_HSCPS];
00222                 float          Muon_cb_fIBeta_err [MAX_HSCPS];
00223                 int            Muon_cb_ndof       [MAX_HSCPS];          
00224                 float          Rpc_beta           [MAX_HSCPS];
00225 
00226                 float          Calo_ecal_crossedE         [MAX_HSCPS];
00227                 float          Calo_ecal_beta             [MAX_HSCPS];
00228                 float          Calo_ecal_beta_err         [MAX_HSCPS];
00229                 float          Calo_ecal_invBeta_err      [MAX_HSCPS];
00230                 float          Calo_ecal_dEdx             [MAX_HSCPS];
00231                 float          Calo_ecal_time             [MAX_HSCPS];
00232                 float          Calo_ecal_time_err         [MAX_HSCPS];
00233                 int            Calo_ecal_numCrysCrossed   [MAX_HSCPS];
00234                 float          Calo_ecal_swissCrossKs     [MAX_HSCPS][MAX_ECALCRYS];
00235                 float          Calo_ecal_e1OverE9s        [MAX_HSCPS][MAX_ECALCRYS];
00236                 float          Calo_ecal_trackLengths     [MAX_HSCPS][MAX_ECALCRYS];
00237                 float          Calo_ecal_trackExitEtas    [MAX_HSCPS][MAX_ECALCRYS];
00238                 float          Calo_ecal_trackExitPhis    [MAX_HSCPS][MAX_ECALCRYS];
00239                 float          Calo_ecal_energies         [MAX_HSCPS][MAX_ECALCRYS];
00240                 float          Calo_ecal_outOfTimeEnergies[MAX_HSCPS][MAX_ECALCRYS];
00241                 float          Calo_ecal_chi2s            [MAX_HSCPS][MAX_ECALCRYS];
00242                 float          Calo_ecal_outOfTimeChi2s   [MAX_HSCPS][MAX_ECALCRYS];
00243                 float          Calo_ecal_times            [MAX_HSCPS][MAX_ECALCRYS];
00244                 float          Calo_ecal_timeErrors       [MAX_HSCPS][MAX_ECALCRYS];
00245                 unsigned int   Calo_ecal_detIds           [MAX_HSCPS][MAX_ECALCRYS];
00246 
00247                 unsigned int   NGens;
00248                 int            Gen_pdgId          [MAX_GENS];
00249                 float          Gen_charge         [MAX_GENS];
00250                 float          Gen_p              [MAX_GENS];
00251                 float          Gen_px             [MAX_GENS];
00252                 float          Gen_py             [MAX_GENS];
00253                 float          Gen_pz             [MAX_GENS];
00254                 float          Gen_pt             [MAX_GENS];
00255                 float          Gen_eta            [MAX_GENS];
00256                 float          Gen_phi            [MAX_GENS];
00257                 float          Gen_beta           [MAX_GENS];
00258                 float          Gen_mass           [MAX_GENS];
00259 };
00260 
00261 HSCPTreeBuilder::HSCPTreeBuilder(const edm::ParameterSet& iConfig)
00262 {
00263    m_HSCPsTag          = iConfig.getParameter<InputTag>              ("HSCParticles");
00264 
00265    reccordVertexInfo   = iConfig.getUntrackedParameter<bool>    ("reccordVertexInfo"  ,  true );
00266    reccordGenInfo      = iConfig.getUntrackedParameter<bool>    ("reccordGenInfo"     ,  false );
00267 
00268    std::cout << "######################################################" << endl;
00269    std::cout << "      USE OF THE HSCPTreeBuilder is deprecated!       " << endl;
00270    std::cout << "better to use the HSCParticle Producer and then FWLite" << endl;
00271    std::cout << "######################################################" << endl;
00272 
00273 }
00274 
00275 
00276 HSCPTreeBuilder::~HSCPTreeBuilder()
00277 {
00278 }
00279 
00280 void
00281 HSCPTreeBuilder::beginJob()
00282 {
00283    TTree::SetMaxTreeSize(1000*Long64_t(2000000000)); // authorize Trees up to 2 Terabytes
00284    MyTree = tfs->make<TTree> ("HscpTree","HscpTree");
00285 
00286    MyTree->Branch("Event_EventNumber"       ,&Event_EventNumber     ,"Event_EventNumber/i");
00287    MyTree->Branch("Event_RunNumber"         ,&Event_RunNumber       ,"Event_RunNumber/i");
00288    MyTree->Branch("Event_LumiSection"       ,&Event_LumiSection     ,"Event_LumiSection/i");
00289    MyTree->Branch("Event_BXCrossing"        ,&Event_BXCrossing      ,"Event_BXCrossing/i");
00290    MyTree->Branch("Event_Orbit"             ,&Event_Orbit           ,"Event_Orbit/i");
00291    MyTree->Branch("Event_Store"             ,&Event_Store           ,"Event_Store/i");
00292    MyTree->Branch("Event_Time"              ,&Event_Time            ,"Event_Time/i");
00293    MyTree->Branch("Event_PhysicsDeclared"   ,&Event_PhysicsDeclared ,"Event_PhysicsDeclared/O");
00294    MyTree->Branch("Event_technicalBits"     ,Event_technicalBits    ,"Event_technicalBits[64]/O");
00295    MyTree->Branch("Event_triggerL1Bits"     ,Event_triggerL1Bits    ,"Event_triggerL1Bits[192]/O");
00296    MyTree->Branch("Event_triggerHLTBits"    ,Event_triggerHLTBits   ,"Event_triggerHLTBits[128]/O");
00297    MyTree->Branch("Event_BField"            ,&Event_BField          ,"Event_BField/F");
00298 
00299    if(reccordVertexInfo){
00300    MyTree->Branch("NVertices"       ,&NVertices      ,"NVertices/I");
00301    MyTree->Branch("Vertex_x"        ,Vertex_x        ,"Vertex_x[NVertices]/F");
00302    MyTree->Branch("Vertex_y"        ,Vertex_y        ,"Vertex_y[NVertices]/F");
00303    MyTree->Branch("Vertex_z"        ,Vertex_z        ,"Vertex_z[NVertices]/F");
00304    MyTree->Branch("Vertex_x_err"    ,Vertex_x_err    ,"Vertex_x_err[NVertices]/F");
00305    MyTree->Branch("Vertex_y_err"    ,Vertex_y_err    ,"Vertex_y_err[NVertices]/F");
00306    MyTree->Branch("Vertex_z_err"    ,Vertex_z_err    ,"Vertex_z_err[NVertices]/F");
00307    MyTree->Branch("Vertex_TrackSize",Vertex_TrackSize,"Vertex_TrackSize[NVertices]/I");
00308    MyTree->Branch("Vertex_chi2"     ,Vertex_chi2     ,"Vertex_chi2[NVertices]/F");
00309    MyTree->Branch("Vertex_ndof"     ,Vertex_ndof     ,"Vertex_ndof[NVertices]/F");
00310    MyTree->Branch("Vertex_isFake"   ,Vertex_isFake   ,"Vertex_isFake[NVertices]/O");
00311    }
00312 
00313    MyTree->Branch("NHSCPs"             ,&NHSCPs            ,"NHSCPs/I");
00314    MyTree->Branch("Hscp_hasTrack"      ,Hscp_hasTrack      ,"Hscp_hasTrack[NHSCPs]/O");
00315    MyTree->Branch("Hscp_hasMuon"       ,Hscp_hasMuon       ,"Hscp_hasMuon[NHSCPs]/O");
00316    MyTree->Branch("Hscp_hasRpc"        ,Hscp_hasRpc        ,"Hscp_hasRpc[NHSCPs]/O");
00317    MyTree->Branch("Hscp_hasCalo"       ,Hscp_hasCalo       ,"Hscp_hasCalo[NHSCPs]/O");
00318    MyTree->Branch("Hscp_type"          ,Hscp_type          ,"Hscp_type[NHSCPs]/I");
00319    MyTree->Branch("Track_NOH"          ,Track_NOH          ,"Track_NOH[NHSCPs]/I");
00320    MyTree->Branch("Track_p"            ,Track_p            ,"Track_p[NHSCPs]/F");
00321    MyTree->Branch("Track_pt"           ,Track_pt           ,"Track_pt[NHSCPs]/F");
00322    MyTree->Branch("Track_pt_err"       ,Track_pt_err       ,"Track_pt_err[NHSCPs]/F");
00323    MyTree->Branch("Track_chi2"         ,Track_chi2         ,"Track_chi2[NHSCPs]/F");
00324    MyTree->Branch("Track_ndof"         ,Track_ndof         ,"Track_ndof[NHSCPs]/F");
00325    MyTree->Branch("Track_eta"          ,Track_eta          ,"Track_eta[NHSCPs]/F");
00326    MyTree->Branch("Track_eta_err"      ,Track_eta_err      ,"Track_eta_err[NHSCPs]/F");
00327    MyTree->Branch("Track_phi"          ,Track_phi          ,"Track_phi[NHSCPs]/F");
00328    MyTree->Branch("Track_phi_err"      ,Track_phi_err      ,"Track_phi_err[NHSCPs]/F");
00329    MyTree->Branch("Track_d0"           ,Track_d0           ,"Track_d0[NHSCPs]/F");
00330    MyTree->Branch("Track_dz"           ,Track_dz           ,"Track_dz[NHSCPs]/F");
00331    MyTree->Branch("Track_quality"      ,Track_quality      ,"Track_quality[NHSCPs]/I");
00332    MyTree->Branch("Track_charge"       ,Track_charge       ,"Track_charge[NHSCPs]/I");
00333    MyTree->Branch("Track_dEdxE1"       ,Track_dEdxE1       ,"Track_dEdxE1[NHSCPs]/F");
00334    MyTree->Branch("Track_dEdxE1_NOS"   ,Track_dEdxE1_NOS   ,"Track_dEdxE1_NOS[NHSCPs]/F");
00335    MyTree->Branch("Track_dEdxE1_NOM"   ,Track_dEdxE1_NOM   ,"Track_dEdxE1_NOM[NHSCPs]/I");
00336    MyTree->Branch("Track_dEdxE2"       ,Track_dEdxE2       ,"Track_dEdxE2[NHSCPs]/F");
00337    MyTree->Branch("Track_dEdxE2_NOS"   ,Track_dEdxE2_NOS   ,"Track_dEdxE2_NOS[NHSCPs]/F");
00338    MyTree->Branch("Track_dEdxE2_NOM"   ,Track_dEdxE2_NOM   ,"Track_dEdxE2_NOM[NHSCPs]/I");
00339    MyTree->Branch("Track_dEdxE3"       ,Track_dEdxE3       ,"Track_dEdxE3[NHSCPs]/F");
00340    MyTree->Branch("Track_dEdxE3_NOS"   ,Track_dEdxE3_NOS   ,"Track_dEdxE3_NOS[NHSCPs]/F");
00341    MyTree->Branch("Track_dEdxE3_NOM"   ,Track_dEdxE3_NOM   ,"Track_dEdxE3_NOM[NHSCPs]/I");
00342    MyTree->Branch("Track_dEdxD1"       ,Track_dEdxD1       ,"Track_dEdxD1[NHSCPs]/F");
00343    MyTree->Branch("Track_dEdxD1_NOS"   ,Track_dEdxD1_NOS   ,"Track_dEdxD1_NOS[NHSCPs]/F");
00344    MyTree->Branch("Track_dEdxD1_NOM"   ,Track_dEdxD1_NOM   ,"Track_dEdxD1_NOM[NHSCPs]/I");
00345    MyTree->Branch("Track_dEdxD2"       ,Track_dEdxD2       ,"Track_dEdxD2[NHSCPs]/F");
00346    MyTree->Branch("Track_dEdxD2_NOS"   ,Track_dEdxD2_NOS   ,"Track_dEdxD2_NOS[NHSCPs]/F");
00347    MyTree->Branch("Track_dEdxD2_NOM"   ,Track_dEdxD2_NOM   ,"Track_dEdxD2_NOM[NHSCPs]/I");
00348    MyTree->Branch("Track_dEdxD3"       ,Track_dEdxD3       ,"Track_dEdxD3[NHSCPs]/F");
00349    MyTree->Branch("Track_dEdxD3_NOS"   ,Track_dEdxD3_NOS   ,"Track_dEdxD3_NOS[NHSCPs]/F");
00350    MyTree->Branch("Track_dEdxD3_NOM"   ,Track_dEdxD3_NOM   ,"Track_dEdxD3_NOM[NHSCPs]/I");
00351    MyTree->Branch("Muon_p"             ,Muon_p             ,"Muon_p[NHSCPs]/F");
00352    MyTree->Branch("Muon_pt"            ,Muon_pt            ,"Muon_pt[NHSCPs]/F");
00353    MyTree->Branch("Muon_eta"           ,Muon_eta           ,"Muon_eta[NHSCPs]/F");
00354    MyTree->Branch("Muon_phi"           ,Muon_phi           ,"Muon_phi[NHSCPs]/F");
00355    MyTree->Branch("Muon_type"          ,Muon_type          ,"Muon_type[NHSCPs]/i");
00356    MyTree->Branch("Muon_qualityValid"  ,Muon_qualityValid  ,"Muon_qualityValid[NHSCPs]/O");
00357    MyTree->Branch("Muon_charge"        ,Muon_charge        ,"Muon_charge[NHSCPs]/i");
00358    MyTree->Branch("Muon_dt_IBeta"      ,Muon_dt_IBeta      ,"Muon_dt_IBeta[NHSCPs]/F");
00359    MyTree->Branch("Muon_dt_IBeta_err"  ,Muon_dt_IBeta_err  ,"Muon_dt_IBeta_err[NHSCPs]/F");
00360    MyTree->Branch("Muon_dt_fIBeta"     ,Muon_dt_fIBeta     ,"Muon_dt_fIBeta[NHSCPs]/F");
00361    MyTree->Branch("Muon_dt_fIBeta_err" ,Muon_dt_fIBeta_err ,"Muon_dt_fIBeta_err[NHSCPs]/F");
00362    MyTree->Branch("Muon_dt_ndof"       ,Muon_dt_ndof       ,"Muon_dt_ndof[NHSCPs]/I");
00363    MyTree->Branch("Muon_csc_IBeta"     ,Muon_csc_IBeta     ,"Muon_csc_IBeta[NHSCPs]/F");
00364    MyTree->Branch("Muon_csc_IBeta_err" ,Muon_csc_IBeta_err ,"Muon_csc_IBeta_err[NHSCPs]/F");
00365    MyTree->Branch("Muon_csc_fIBeta"    ,Muon_csc_fIBeta    ,"Muon_csc_fIBeta[NHSCPs]/F");
00366    MyTree->Branch("Muon_csc_fIBeta_err",Muon_csc_fIBeta_err,"Muon_csc_fIBeta_err[NHSCPs]/F");
00367    MyTree->Branch("Muon_csc_ndof"      ,Muon_csc_ndof      ,"Muon_csc_ndof[NHSCPs]/I");
00368    MyTree->Branch("Muon_cb_IBeta"      ,Muon_cb_IBeta      ,"Muon_cb_IBeta[NHSCPs]/F");
00369    MyTree->Branch("Muon_cb_IBeta_err"  ,Muon_cb_IBeta_err  ,"Muon_cb_IBeta_err[NHSCPs]/F");
00370    MyTree->Branch("Muon_cb_fIBeta"     ,Muon_cb_fIBeta     ,"Muon_cb_fIBeta[NHSCPs]/F");
00371    MyTree->Branch("Muon_cb_fIBeta_err" ,Muon_cb_fIBeta_err ,"Muon_cb_fIBeta_err[NHSCPs]/F");
00372    MyTree->Branch("Muon_cb_ndof"       ,Muon_cb_ndof       ,"Muon_cb_ndof[NHSCPs]/I");
00373 
00374    MyTree->Branch("Rpc_beta"           ,Rpc_beta           ,"Rpc_beta[NHSCPs]/F");
00375 
00376    MyTree->Branch("Calo_ecal_crossedE"         ,Calo_ecal_crossedE      ,"Calo_ecal_crossedE[NHSCPs]/F");
00377    MyTree->Branch("Calo_ecal_beta"             ,Calo_ecal_beta          ,"Calo_ecal_beta[NHSCPs]/F");
00378    MyTree->Branch("Calo_ecal_beta_err"         ,Calo_ecal_beta_err      ,"Calo_ecal_beta_err[NHSCPs]/F");
00379    MyTree->Branch("Calo_ecal_invBeta_err"      ,Calo_ecal_invBeta_err   ,"Calo_ecal_invBeta_err[NHSCPs]/F");
00380    MyTree->Branch("Calo_ecal_dEdx"             ,Calo_ecal_dEdx          ,"Calo_ecal_dEdx[NHSCPs]/F");
00381    MyTree->Branch("Calo_ecal_time"             ,Calo_ecal_time          ,"Calo_ecal_time[NHSCPs]/F");
00382    MyTree->Branch("Calo_ecal_time_err"         ,Calo_ecal_time_err      ,"Calo_ecal_time_err[NHSCPs]/F");
00383    MyTree->Branch("Calo_ecal_numCrysCrossed"   ,Calo_ecal_numCrysCrossed,"Calo_ecal_numCrysCrossed[NHSCPs]/I");
00384    MyTree->Branch("Calo_ecal_swissCrossKs"     ,Calo_ecal_swissCrossKs  ,"Calo_ecal_swissCrossKs[NHSCPs][10]/F");
00385    MyTree->Branch("Calo_ecal_e1OverE9s"        ,Calo_ecal_e1OverE9s     ,"Calo_ecal_e1OverE9s[NHSCPs][10]/F");
00386    MyTree->Branch("Calo_ecal_trackLengths"     ,Calo_ecal_trackLengths  ,"Calo_ecal_trackLengths[NHSCPs][10]/F");
00387    MyTree->Branch("Calo_ecal_trackExitEtas"    ,Calo_ecal_trackExitEtas ,"Calo_ecal_trackExitEtas[NHSCPs][10]/F");
00388    MyTree->Branch("Calo_ecal_trackExitPhis"    ,Calo_ecal_trackExitPhis ,"Calo_ecal_trackExitPhis[NHSCPs][10]/F");
00389    MyTree->Branch("Calo_ecal_energies"         ,Calo_ecal_energies      ,"Calo_ecal_energies[NHSCPs][10]/F");
00390    MyTree->Branch("Calo_ecal_outOfTimeEnergies",Calo_ecal_outOfTimeEnergies      ,"Calo_ecal_outOfTimeEnergies[NHSCPs][10]/F");
00391    MyTree->Branch("Calo_ecal_chi2s"            ,Calo_ecal_chi2s      ,"Calo_ecal_chi2s[NHSCPs][10]/F");
00392    MyTree->Branch("Calo_ecal_outOfTimeChi2s"   ,Calo_ecal_outOfTimeChi2s      ,"Calo_ecal_outOfTimeChi2s[NHSCPs][10]/F");
00393    MyTree->Branch("Calo_ecal_times"            ,Calo_ecal_times         ,"Calo_ecal_times[NHSCPs][10]/F");
00394    MyTree->Branch("Calo_ecal_timeErrors"       ,Calo_ecal_timeErrors    ,"Calo_ecal_timeErrors[NHSCPs][10]/F");
00395    MyTree->Branch("Calo_ecal_detIds"           ,Calo_ecal_detIds        ,"Calo_ecal_detIds[NHSCPs][10]/I");
00396 
00397    if(reccordGenInfo){
00398    MyTree->Branch("NGens"              ,&NGens             ,"NGens/I");
00399    MyTree->Branch("Gen_pdgId"          ,Gen_pdgId          ,"Gen_pdgId[NGens]/i");
00400    MyTree->Branch("Gen_charge"         ,Gen_charge         ,"Gen_charge[NGens]/F");
00401    MyTree->Branch("Gen_p"              ,Gen_p              ,"Gen_p[NGens]/F");
00402    MyTree->Branch("Gen_px"             ,Gen_px             ,"Gen_px[NGens]/F");
00403    MyTree->Branch("Gen_py"             ,Gen_py             ,"Gen_py[NGens]/F");
00404    MyTree->Branch("Gen_pz"             ,Gen_pz             ,"Gen_pz[NGens]/F");
00405    MyTree->Branch("Gen_pt"             ,Gen_pt             ,"Gen_pt[NGens]/F");
00406    MyTree->Branch("Gen_eta"            ,Gen_eta            ,"Gen_eta[NGens]/F");
00407    MyTree->Branch("Gen_phi"            ,Gen_phi            ,"Gen_phi[NGens]/F");
00408    MyTree->Branch("Gen_beta"           ,Gen_beta           ,"Gen_beta[NGens]/F");
00409    MyTree->Branch("Gen_mass"           ,Gen_mass           ,"Gen_mass[NGens]/F");
00410    }
00411 
00412 }
00413 
00414 void
00415 HSCPTreeBuilder::endJob() 
00416 {
00417 }
00418 
00419 
00420 
00421 bool
00422 HSCPTreeBuilder::filter(edm::Event& iEvent, const edm::EventSetup& iSetup)
00423 {
00424    bool debug = false;
00425    if (debug) cout << "I'm in HSCPTreeBuilder::analyze!" << endl;
00426 
00427 
00428    Event_EventNumber     = iEvent.id().event();
00429    Event_RunNumber       = iEvent.id().run();
00430    Event_LumiSection     = iEvent.eventAuxiliary().luminosityBlock();
00431    Event_BXCrossing      = iEvent.eventAuxiliary().bunchCrossing();
00432    Event_Orbit           = iEvent.eventAuxiliary().orbitNumber();
00433    Event_Store           = iEvent.eventAuxiliary().storeNumber();
00434    Event_Time            = iEvent.eventAuxiliary().time().value();
00435 
00436    // BField part:
00437    ESHandle<MagneticField> MF;
00438    iSetup.get<IdealMagneticFieldRecord>().get(MF);
00439    const MagneticField* theMagneticField = MF.product();
00440    Event_BField = fabs(theMagneticField->inTesla(GlobalPoint(0,0,0)).z());
00441 
00442    // L1 TRIGGER part:
00443    edm::Handle<L1GlobalTriggerReadoutRecord> h_gtReadoutRecord;
00444    iEvent.getByLabel("gtDigis", h_gtReadoutRecord);
00445    L1GtFdlWord fdlWord = h_gtReadoutRecord->gtFdlWord();
00446    TechnicalTriggerWord L1technical = fdlWord.gtTechnicalTriggerWord();
00447    Event_PhysicsDeclared = h_gtReadoutRecord->gtFdlWord().physicsDeclared();
00448    for (unsigned int i = 0; i <  64; ++i){ Event_technicalBits [i] = L1technical[i]; }
00449    DecisionWord L1decision = fdlWord.gtDecisionWord();
00450    for (unsigned int i = 0; i < 128; ++i){ Event_triggerL1Bits [i] = L1decision[i]; }
00451    DecisionWordExtended L1decisionE = fdlWord.gtDecisionWordExtended();
00452    for (unsigned int i = 0; i < 64; ++i){ Event_triggerL1Bits [128+i] = L1decisionE[i]; }
00453 
00454    // HLT TRIGGER part:
00455    edm::Handle<edm::TriggerResults> trh;
00456    iEvent.getByLabel("TriggerResults", trh);
00457    for(unsigned int i=0;i<trh->size() && i<128;++i){Event_triggerHLTBits[i] = trh->at(i).accept();}
00458 
00459    edm::Handle<reco::VertexCollection> recoVertexHandle;
00460    iEvent.getByLabel("offlinePrimaryVertices", recoVertexHandle);
00461    reco::VertexCollection recoVertex = *recoVertexHandle;
00462 
00463    if(reccordVertexInfo){
00464    NVertices = 0;
00465    for(unsigned int i=0;i<recoVertex.size();i++){
00466       Vertex_x        [NVertices] = recoVertex[i].x();
00467       Vertex_y        [NVertices] = recoVertex[i].y();
00468       Vertex_z        [NVertices] = recoVertex[i].z();
00469       Vertex_x_err    [NVertices] = recoVertex[i].xError();
00470       Vertex_y_err    [NVertices] = recoVertex[i].yError();
00471       Vertex_z_err    [NVertices] = recoVertex[i].zError();
00472       Vertex_TrackSize[NVertices] = recoVertex[i].tracksSize();
00473       Vertex_chi2     [NVertices] = recoVertex[i].chi2();
00474       Vertex_ndof     [NVertices] = recoVertex[i].ndof();
00475       Vertex_isFake   [NVertices] = recoVertex[i].isFake();
00476       NVertices++; 
00477    }
00478    }
00479 
00480    // Source Collection
00481    edm::Handle<susybsm::HSCParticleCollection > HSCPCollectionHandle;
00482    iEvent.getByLabel(m_HSCPsTag, HSCPCollectionHandle);
00483    susybsm::HSCParticleCollection HSCPCollection = *HSCPCollectionHandle.product();
00484 
00485    NHSCPs=0;
00486    for(unsigned int i=0; i<HSCPCollection.size();i++){
00487       susybsm::HSCParticle hscp = HSCPCollection[i]; 
00488       reco::MuonRef  muon  = hscp.muonRef();
00489       reco::TrackRef track = hscp.trackRef();;
00490 
00491        Hscp_hasTrack        [NHSCPs] = hscp.hasTrackRef();
00492        Hscp_hasMuon         [NHSCPs] = hscp.hasMuonRef();
00493        Hscp_hasRpc          [NHSCPs] = hscp.hasRpcInfo();
00494        Hscp_hasCalo         [NHSCPs] = hscp.hasCaloInfo();
00495        Hscp_type            [NHSCPs] = hscp.type();
00496 
00497       if(track.isNonnull() && Hscp_hasTrack){
00498          Track_p            [NHSCPs] = track->p();
00499          Track_pt           [NHSCPs] = track->pt();
00500          Track_pt_err       [NHSCPs] = track->ptError();
00501          Track_eta          [NHSCPs] = track->eta();
00502          Track_eta_err      [NHSCPs] = track->etaError();
00503          Track_phi          [NHSCPs] = track->phi();
00504          Track_phi_err      [NHSCPs] = track->phiError();
00505          Track_NOH          [NHSCPs] = track->found();
00506          Track_chi2         [NHSCPs] = track->chi2();
00507          Track_ndof         [NHSCPs] = track->ndof();
00508          Track_d0           [NHSCPs] = -1.0f * track->dxy(recoVertex[0].position());
00509          Track_dz           [NHSCPs] = -1.0f * track->dz (recoVertex[0].position());
00510          Track_quality      [NHSCPs] = track->qualityMask();
00511          Track_charge       [NHSCPs] = track->charge(); 
00512 /*         Track_dEdxE1       [NHSCPs] = hscp.dedxEstimator1().dEdx();
00513          Track_dEdxE1_NOM   [NHSCPs] = hscp.dedxEstimator1().numberOfMeasurements();
00514          Track_dEdxE1_NOS   [NHSCPs] = hscp.dedxEstimator1().numberOfSaturatedMeasurements();
00515          Track_dEdxE2       [NHSCPs] = hscp.dedxEstimator2().dEdx();
00516          Track_dEdxE2_NOM   [NHSCPs] = hscp.dedxEstimator2().numberOfMeasurements();
00517          Track_dEdxE2_NOS   [NHSCPs] = hscp.dedxEstimator2().numberOfSaturatedMeasurements();
00518          Track_dEdxE3       [NHSCPs] = hscp.dedxEstimator3().dEdx();
00519          Track_dEdxE3_NOM   [NHSCPs] = hscp.dedxEstimator3().numberOfMeasurements();
00520          Track_dEdxE3_NOS   [NHSCPs] = hscp.dedxEstimator3().numberOfSaturatedMeasurements();
00521          Track_dEdxD1       [NHSCPs] = hscp.dedxDiscriminator1().dEdx();
00522          Track_dEdxD1_NOM   [NHSCPs] = hscp.dedxDiscriminator1().numberOfMeasurements();
00523          Track_dEdxD1_NOS   [NHSCPs] = hscp.dedxDiscriminator1().numberOfSaturatedMeasurements();
00524          Track_dEdxD2       [NHSCPs] = hscp.dedxDiscriminator2().dEdx();
00525          Track_dEdxD2_NOM   [NHSCPs] = hscp.dedxDiscriminator2().numberOfMeasurements();
00526          Track_dEdxD2_NOS   [NHSCPs] = hscp.dedxDiscriminator2().numberOfSaturatedMeasurements();
00527          Track_dEdxD3       [NHSCPs] = hscp.dedxDiscriminator3().dEdx();
00528          Track_dEdxD3_NOM   [NHSCPs] = hscp.dedxDiscriminator3().numberOfMeasurements();
00529          Track_dEdxD3_NOS   [NHSCPs] = hscp.dedxDiscriminator3().numberOfSaturatedMeasurements();
00530 */
00531       }
00532 
00533       if(muon.isNonnull() && Hscp_hasMuon){
00534          Muon_p             [NHSCPs] = muon->p();
00535          Muon_pt            [NHSCPs] = muon->pt();
00536          Muon_eta           [NHSCPs] = muon->eta();
00537          Muon_phi           [NHSCPs] = muon->phi();
00538          Muon_type          [NHSCPs] = muon->type();
00539          Muon_qualityValid  [NHSCPs] = muon->isQualityValid();
00540          Muon_charge        [NHSCPs] = muon->charge();
00541 /*         Muon_dt_IBeta      [NHSCPs] = hscp.muonTimeDt().inverseBeta();
00542          Muon_dt_IBeta_err  [NHSCPs] = hscp.muonTimeDt().inverseBetaErr();
00543          Muon_dt_fIBeta     [NHSCPs] = hscp.muonTimeDt().freeInverseBeta();
00544          Muon_dt_fIBeta_err [NHSCPs] = hscp.muonTimeDt().freeInverseBetaErr();
00545          Muon_dt_ndof       [NHSCPs] = hscp.muonTimeDt().nDof();
00546          Muon_csc_IBeta     [NHSCPs] = hscp.muonTimeCsc().inverseBeta();
00547          Muon_csc_IBeta_err [NHSCPs] = hscp.muonTimeCsc().inverseBetaErr();
00548          Muon_csc_fIBeta    [NHSCPs] = hscp.muonTimeCsc().freeInverseBeta();
00549          Muon_csc_fIBeta_err[NHSCPs] = hscp.muonTimeCsc().freeInverseBetaErr();
00550          Muon_csc_ndof      [NHSCPs] = hscp.muonTimeCsc().nDof();
00551          Muon_cb_IBeta      [NHSCPs] = hscp.muonTimeCombined().inverseBeta();
00552          Muon_cb_IBeta_err  [NHSCPs] = hscp.muonTimeCombined().inverseBetaErr();
00553          Muon_cb_fIBeta     [NHSCPs] = hscp.muonTimeCombined().freeInverseBeta();
00554          Muon_cb_fIBeta_err [NHSCPs] = hscp.muonTimeCombined().freeInverseBetaErr();
00555          Muon_cb_ndof       [NHSCPs] = hscp.muonTimeCombined().nDof();
00556 */
00557       }
00558 
00559       if(hscp.hasCaloInfo()){
00560 //         Calo_ecal_crossedE      [NHSCPs] = hscp.calo().ecalCrossedEnergy;
00561 //         Calo_ecal_beta          [NHSCPs] = hscp.calo().ecalBeta;
00562 //         Calo_ecal_beta_err      [NHSCPs] = hscp.calo().ecalBetaError;
00563 //         Calo_ecal_invBeta_err   [NHSCPs] = hscp.calo().ecalInvBetaError;
00564 //         Calo_ecal_dEdx          [NHSCPs] = hscp.calo().ecalDeDx;
00565 //         Calo_ecal_time          [NHSCPs] = hscp.calo().ecalTime;
00566 //         Calo_ecal_time_err      [NHSCPs] = hscp.calo().ecalTimeError;
00567 //         Calo_ecal_numCrysCrossed[NHSCPs] = hscp.calo().ecalCrysCrossed;
00568 /*         for(int i=0; i < Calo_ecal_numCrysCrossed[NHSCPs] && i < MAX_ECALCRYS; ++i)
00569          {
00570            Calo_ecal_swissCrossKs     [NHSCPs][i] = hscp.calo().ecalSwissCrossKs[i];
00571            Calo_ecal_e1OverE9s        [NHSCPs][i] = hscp.calo().ecalE1OverE9s[i];
00572            Calo_ecal_trackLengths     [NHSCPs][i] = hscp.calo().ecalTrackLengths[i];
00573            GlobalPoint exitPosition = hscp.calo().ecalTrackExitPositions[i];
00574            Calo_ecal_trackExitEtas    [NHSCPs][i] = exitPosition.eta();
00575            Calo_ecal_trackExitPhis    [NHSCPs][i] = exitPosition.phi();
00576            Calo_ecal_energies         [NHSCPs][i] = hscp.calo().ecalEnergies[i];
00577            Calo_ecal_outOfTimeEnergies[NHSCPs][i] = hscp.calo().ecalOutOfTimeEnergies[i];
00578            Calo_ecal_chi2s            [NHSCPs][i] = hscp.calo().ecalChi2s[i];
00579            Calo_ecal_outOfTimeChi2s   [NHSCPs][i] = hscp.calo().ecalOutOfTimeChi2s[i];
00580            Calo_ecal_times            [NHSCPs][i] = hscp.calo().ecalTimes[i];
00581            Calo_ecal_timeErrors       [NHSCPs][i] = hscp.calo().ecalTimeErrors[i];
00582            Calo_ecal_detIds           [NHSCPs][i] = hscp.calo().ecalDetIds[i];
00583          }
00584 */
00585       }
00586 
00587       if(Hscp_hasRpc){
00588          Rpc_beta           [NHSCPs] = hscp.rpc().beta;
00589       }
00590 
00591       NHSCPs++;
00592    }
00593    
00594 
00595    if(reccordGenInfo){
00596    Handle<GenParticleCollection> genParticles;
00597    iEvent.getByLabel("genParticles", genParticles);
00598    NGens=0;
00599    for(unsigned int i=0;i<genParticles->size();i++){
00600      const GenParticle & part = (*genParticles)[i];
00601      if(part.status()!=1)continue;
00602      if(part.pt()<5)continue;
00603 //     if(fabs(part.pdgId())<1000000) continue;
00604 
00605         Gen_pdgId [NGens]     = part.pdgId();
00606         Gen_charge[NGens]     = part.charge();
00607         Gen_p     [NGens]     = part.p();
00608         Gen_px    [NGens]     = part.px();
00609         Gen_py    [NGens]     = part.py();
00610         Gen_pz    [NGens]     = part.pz();
00611         Gen_pt    [NGens]     = part.pt();
00612         Gen_eta   [NGens]     = part.eta();
00613         Gen_phi   [NGens]     = part.phi();
00614         Gen_beta  [NGens]     = part.p()/part.energy();
00615         Gen_mass  [NGens]     = part.mass();
00616         NGens++;
00617      }     
00618   }
00619    
00620 
00621    MyTree->Fill();
00622    return true;
00623 }
00624 
00625 //define this as a plug-in
00626 DEFINE_FWK_MODULE(HSCPTreeBuilder);
00627 
00628 
00629 
00630 
00631 
00632 
00633 
00634 
00635 
00636