#ifndef HIGHPTELECTRONS_HH #define HIGHPTELECTRONS_HH //---------------------- // Base Class Headers -- //---------------------- #include "FrameMods/HepHistModule.hh" // ------------------- // Talk-to includes -- // ------------------- #include "Framework/AbsParmBool.hh" #include "Framework/AbsParmGeneral.hh" #include "Framework/APPMenu.hh" #include "SimulationObjects/HEPG_StorableBank.hh" #ifdef CDF #include "BaBar/Cdf.hh" #endif //------------------------------- // Collaborating Class Headers -- //--------------------------- #include "CLHEP/Matrix/Vector.h" //------------------------------------ // Collaborating Class Declarations -- //------------------------------------ class HepHist1D; class HepHist2D; class HepNtuple; class EmCluster; class CdfTrack; // --------------------- // -- Class Interface -- // --------------------- const int _MAXTRK = 20 ; const int _MAXELE = 50 ; const int _MAXTRG = 128 ; const int _MAXVER = 500 ; const int _MAXOBS = 250 ; const int _MAXHEP = 1000 ; const int _MAXCES = 10 ; const int _MAXMOT = 10 ; //this I have to do because some values are so close to zero to make it crash. const double _myMin = 0.000000001 ; const double _myPi = (2*M_PI-0.000001); class HighPtElectrons : public HepHistModule { //-------------------- // Instance Members -- //-------------------- public: // Constructors HighPtElectrons(const char* const theName = "HighPtElectrons", const char* const theDescription = "Electroweak Analysis Module - High pT Electrons"); // Destructor virtual ~HighPtElectrons( ); // Operations virtual AppResult bookHistograms( void ); virtual AppResult fillHistograms( AbsEvent* event ); virtual AppModule* clone( const char* cloneName ); const char* rcsId( ) const; // ----------------- // Analysis methods : // ------------------ // Find closest matcing COT track : const CdfTrack* findMatchingTrackForCluster(EmCluster& emObj); // Find the transverse mass from two 2D-vectors, assumed to be in the transverse plane : inline static double transverseMass(const HepVector& lepton, const HepVector& neutrino); private: // ---------------------------------------------- // Cuts Menu : // ---------------------------------------------- APPMenu _CutsMenu; // Talk-to parameters for this menu : AbsParmBool _debug; AbsParmBool _fill_OBS; AbsParmBool _fill_HEPG; AbsParmBool _fill_ELEC; AbsParmBool _fill_TRIG; AbsParmBool _fill_MET; AbsParmBool _useTrkZVert; AbsParmGeneral _ClusterHadEmCut; AbsParmGeneral _EM_EnergyScaleFactor; AbsParmGeneral _EM_ClusterPtCut; AbsParmGeneral _EM_ClusterAbsEtaRange; AbsParmGeneral _MatchingTrackPtCut; // Make regional histograms ? AbsParmBool _regionalHistos; AbsParmBool _makeHistos; // Ntuple for electron studies : HepNtuple* _ElectronNtuple; HepHist1D* _ClusterEtot; HepHist1D* _ClusterE_Em; HepHist1D* _ClusterHadEm; HepHist1D* _ClusterNumTow; HepHist1D* _ClusterEtaPhiArea; HepHist1D* _EM_ClusterPt; HepHist1D* _EM_ClusterEta; HepHist1D* _EM_ClusterPhi; HepHist1D* _MatchingTrackPt; HepHist1D* _MatchingTrackEta; HepHist1D* _MatchingTrackPhi; HepHist1D* _EoverP; HepHist1D* _TransverseMass; HepHist1D* _InvariantMass; // Regional histograms : // HepHist2D* _nClustersVsEta; HepHist1D* _nCesCls; HepHist1D* _nCesDefWireCls; HepHist1D* _nCesDefStripCls; HepHist1D* _nMatchTrks; HepHist1D* _nCprDefCls; // This feels way too much like Fortran and common blocks, but needed // for filling a simple column-wise ntuple : int _nEvt; int _nRun; bool _mcflag; int _nTrig; int _L1Bit[_MAXTRG]; int _L2Bit[_MAXTRG]; int _L3Bit[_MAXTRG]; // ELEC block : int _nElec; int _ElecReg[_MAXELE]; double _ElecEtot[_MAXELE]; double _ElecEmEt[_MAXELE]; double _ElecHadEt[_MAXELE]; double _ElecPx[_MAXELE]; double _ElecPy[_MAXELE]; double _ElecPz[_MAXELE]; double _ElecEta[_MAXELE]; double _ElecPhi[_MAXELE]; double _ElecTheta[_MAXELE]; double _ElecIsoTot4[_MAXELE]; double _ElecIsoTot7[_MAXELE]; double _ElecIsoEm4[_MAXELE]; double _ElecIsoEm7[_MAXELE]; double _ElecIsoHad4[_MAXELE]; double _ElecIsoHad7[_MAXELE]; double _ElecTrkPt[_MAXELE][_MAXTRK]; double _ElecTrkEta[_MAXELE][_MAXTRK]; double _ElecTrkPhi[_MAXELE][_MAXTRK]; double _ElecTrkD0[_MAXELE][_MAXTRK]; double _ElecTrkZ0[_MAXELE][_MAXTRK]; double _ElecTrkCot[_MAXELE][_MAXTRK]; double _ElecTrkCurv[_MAXELE][_MAXTRK]; double _ElecTrkAxHits[_MAXELE][_MAXTRK]; double _ElecTrkStHits[_MAXELE][_MAXTRK]; double _ElecTrkAlg[_MAXELE][_MAXTRK]; double _ElecTrkId[_MAXELE][_MAXTRK]; double _ElecTrkXAtCes[_MAXELE][_MAXTRK]; double _ElecTrkZAtCes[_MAXELE][_MAXTRK]; double _ElecTrkEtaAtCes[_MAXELE][_MAXTRK]; double _ElecTrkPhiAtCes[_MAXELE][_MAXTRK]; double _ElecTrkSideOfCes[_MAXELE][_MAXTRK]; double _ElecTrkCesWedge[_MAXELE][_MAXTRK]; double _ElecMaxTrkId[_MAXELE]; double _ElecMaxTrkIso[_MAXELE]; double _ElecMaxTrkPt[_MAXELE]; double _ElecMaxTrkPhi[_MAXELE]; double _ElecMaxTrkEta[_MAXELE]; double _ElecMaxTrkTheta[_MAXELE]; double _ElecMaxTrkZ0[_MAXELE]; double _ElecMaxTrkD0[_MAXELE]; double _ElecMaxTrkX[_MAXELE]; double _ElecMaxTrkZ[_MAXELE]; double _ElecBestCesX[_MAXELE]; double _ElecBestCesXChiW[_MAXELE]; double _ElecBestCesDeltaX[_MAXELE]; double _ElecBestCesZ[_MAXELE]; double _ElecBestCesZChiS[_MAXELE]; double _ElecBestCesDeltaZ[_MAXELE]; double _ElecCesView[_MAXELE][_MAXCES]; double _ElecCesLocCoord[_MAXELE][_MAXCES]; double _ElecCesGlbCoord[_MAXELE][_MAXCES]; double _ElecCesEnergy[_MAXELE][_MAXCES]; double _ElecCesChi2[_MAXELE][_MAXCES]; double _ElecCesDistTrkCls[_MAXELE][_MAXCES]; double _ElecCesAssTrkId[_MAXELE][_MAXCES]; int _ElecNCesDefCls[_MAXELE]; int _ElecNCesWirCls[_MAXELE]; int _ElecNCesStrCls[_MAXELE]; int _ElecNMatchTrks[_MAXELE]; double _ElecNCprCls[_MAXELE]; double _ElecCprCoord[_MAXELE]; double _ElecCprCharge[_MAXELE]; double _ElecCprDelta[_MAXELE]; double _ElecZCentroid[_MAXELE]; double _ElecHadEm[_MAXELE]; double _ElecTrigHadEm[_MAXELE]; double _ElecLShwr[_MAXELE]; double _ElecLShwr2[_MAXELE]; //MET Block: only one Met object per event! double _MetEt; double _MetPhi; // PLUG block : int _MAXPLUG; int _nPes2dCluster; // OBS block : int _nElecOBS; double _ElecOBSP_Px[_MAXVER][_MAXOBS]; double _ElecOBSP_Py[_MAXVER][_MAXOBS]; double _ElecOBSP_Pz[_MAXVER][_MAXOBS]; double _ElecOBSP_Ptot[_MAXVER][_MAXOBS]; double _ElecOBSP_Pt[_MAXVER][_MAXOBS]; double _ElecOBSP_Theta[_MAXVER][_MAXOBS]; double _ElecOBSP_Eta[_MAXVER][_MAXOBS]; double _ElecOBSP_Phi[_MAXVER][_MAXOBS]; double _ElecOBSP_Curv[_MAXVER][_MAXOBS]; double _ElecOBSP_globCprX[_MAXVER][_MAXOBS]; double _ElecOBSP_cprX[_MAXVER][_MAXOBS]; double _ElecOBSP_cprY[_MAXVER][_MAXOBS]; double _ElecOBSP_cprZ[_MAXVER][_MAXOBS]; double _ElecOBSP_cprPhi[_MAXVER][_MAXOBS]; double _ElecOBSP_cprTheta[_MAXVER][_MAXOBS]; double _ElecOBSP_cprEta[_MAXVER][_MAXOBS]; //OBSV Block int _nVert; double _ElecOBSV_Vx[_MAXVER]; double _ElecOBSV_Vy[_MAXVER]; double _ElecOBSV_Vz[_MAXVER]; double _ElecOBSV_nDau[_MAXVER]; //HEPG block int _nHepg; int _nHepgEvt; int _nHepgPrim; int _nHepgDispl; double _Hepg_mo1[_MAXHEP]; double _Hepg_mo2[_MAXHEP]; double _Hepg_moId[_MAXHEP][_MAXMOT]; double _Hepg_da1[_MAXHEP]; double _Hepg_da2[_MAXHEP]; double _Hepg_type[_MAXHEP]; double _Hepg_ist[_MAXHEP]; int _Hepg_ind[_MAXHEP]; double _Hepg_M[_MAXHEP]; double _Hepg_Vx[_MAXHEP]; double _Hepg_Vy[_MAXHEP]; double _Hepg_Vz[_MAXHEP]; double _Hepg_E[_MAXHEP]; double _Hepg_Px[_MAXHEP]; double _Hepg_Py[_MAXHEP]; double _Hepg_Pz[_MAXHEP]; double _Hepg_Pt[_MAXHEP]; double _Hepg_Phi[_MAXHEP]; double _Hepg_Theta[_MAXHEP]; double _Hepg_Eta[_MAXHEP]; double getMother(const HEPG_StorableBank & ,int pIndex ); }; inline double HighPtElectrons::transverseMass(const HepVector& lepton, const HepVector& neutrino) { if (lepton.num_row() != 2 || neutrino.num_row() != 2) { std::cout << " HighPtElectrons::transverseMass error : vectors are not 2-dimensional " << std::endl; return 0.0; } else { double mt2 = 2.0*(lepton.norm()*neutrino.norm() - dot(lepton,neutrino)); if (mt2 >= 0.0) { return sqrt(mt2); } else { std::cout << " HighPtElectrons::transverseMass error : negative transverse mass squared " << std::endl; return 0.0; } } } #endif