#ifndef STNTUPLE_PHOTON_TPhotonUtil_hh #define STNTUPLE_PHOTON_TPhotonUtil_hh class TStnTrack; class TStnPhoton; class TStnPhotonBlock; class TStnElectron; class TStnJet; class TStnEvent; class TStnTrackBlock; class TStnTriggerBlock; class TClonesArray; class TEmTimeCorrection; class TPhotonUtil: public TObject { public: // Correct photon quantites for a new z vertex. Track list is needed for // Track iso, can be retrieved from TrackBlock or set to NULL (iso=999.0) static Int_t SetPhotonZ(TStnPhoton* pho, Double_t z = 0, TClonesArray* trackList = NULL); static Int_t SetAllPhotonZ(TStnEvent* event, Double_t z = 0); // fix the isolation energy correction vs the number of vertices // only for dev_242 and dev_243_01 // only call this once since it modifies the PhotonBlock contents static Int_t CorrectPhotonIsolation(TStnEvent* event); static Double_t TrkIsoSum1(TStnTrack* track, TClonesArray* trackList, Double_t cone = 0.4, Double_t dz = 5.0, TStnTrack* skipTrack = NULL); static Double_t TrkIsoSum0(Double_t phi, Double_t eta, Double_t z, TClonesArray* trackList, Double_t cone = 0.4, Double_t dz = 5.0, TStnTrack* skipTrack = NULL); static Int_t DumpPhotons(TStnEvent* event, Float_t PhotonEt=0.0); static Double_t ExpectedHadEm(Double_t energy); // deltax between expected CPR hit and nearest track static Double_t CprTrack(TStnPhoton* pho, TStnTrackBlock* tblk); // returns true if a good vertex was found // return false and z=0 if no vertex, false and z=vertex if |z|>60cm. // nv12=nzv withclass>12 for jet corr static Bool_t SelectVertex(TStnEvent* event, Float_t& z, Int_t& nv12, int minClass = 12, bool useVxprimToo = false); // find matching object static TStnJet* MatchJet(TStnEvent* event, TStnPhoton* pho); static TStnElectron* MatchElectron(TStnEvent* event, TStnPhoton* pho); static TStnElectron* MatchPhoenixElectron(TStnEvent* event, TStnPhoton* pho); static TStnElectron* MatchPhoenixElectron(TStnEvent* event, TStnElectron* ele); static TStnPhoton* MatchPhoton(TStnEvent* event, TStnElectron* pho); // find most likely source of this photon, return genp index static Int_t MatchGenp(TStnEvent* event, TStnPhoton* pho, Int_t dump=0); // number of Phoenix hits in trajectory for a TStnElectron from TPhoenixBlock static Int_t PhoenixHits(TStnEvent* event, TStnElectron* pele, Int_t& nHit, Int_t& nHitPhi); static TStnTrack* PhoenixTrack(TStnEvent* event, TStnElectron* pele); // give this routine an uncorr jet Et and it returns // an array of 15 smeared fake photon Et's and weights // for(int i=0; i<15; i++) hist.Fill(quantity such as bgEt[i], bgWht[i]); // uses numbers from Helen from 7/2004 (for gen4, dev_240), verified 2/2005 // mode =0 for central value, -1 for -1sigma, +1 for +1sigma static void PhoBgWeights(Float_t jetEt, Float_t* bgEt, Float_t* bgWht, int mode=0); // The following methods are added by Shin-Shan Yu for Cp2 study // May 15th 2007 // CP2 related //! Note delx and delz are signed static int cp2_close_pad( Float_t zCPR, Float_t phiGlobal, Float_t &delx, Float_t &delz); // cp2Sum[]={4pad, 1+1pad, 1+2+4pad}; // wedge counting from 0-24 static void GetCP2(TStnPhoton* pho, int* padIndex, int* padE, int* cp2Sum); static float GetTOFZ(TStnPhoton* pho); static float GetCOTZ(TStnPhoton* pho); static float GetCP2Z(TStnPhoton* pho); static float GetLocalZ(TStnPhoton* pho, float Rdetector); static float GetCP2X(TStnPhoton* pho); static bool isCP2BadChan(int side, int wedge, int pad); static bool isCP2Fid(TStnPhoton* pho); // read corrections file into TEmTimeCorrection static Int_t LoadEmTimeCorr(char* fn); static TEmTimeCorrection* EmTimeCorr(){ return fEmTimeCorr;} //load tower energies into TStnPhoton, provide photoube assym static Int_t PhotonTowerTransients(TStnEvent* event); //load tower EM time in TStnPhoton // useCorr=0 do not use TEmTimeCorrection, 1=use it static Int_t PhotonTimeTransients(TStnEvent* event, Int_t useCorr=1); private: static TEmTimeCorrection* fEmTimeCorr; ClassDef(TPhotonUtil,0) }; #endif