#ifndef STNTUPLE_ALG_TStntuple_hh #define STNTUPLE_ALG_TStntuple_hh #include "TClonesArray.h" #include "TVector2.h" #include "TVector3.h" // #include "TMatrixFSym.h" #include "Stntuple/data/TStnBeamPos.hh" #include "Stntuple/data/TStnBeamPosBlock.hh" class TStnLepton; class TStnTrack; class TStnElectron; class TStnPhoton; class TStnPi0; class TStnJet; class TStnTau; class TStnMuon; class TStnVertex; class TStnEvent; class TStnTauBlock; class TStnTrackBlock; class TStnPi0Block; class CdfTrack; class TStnTriggerBlock; class TCalDataBlock; class TStnJetBlock; class TDcasDataBlock; class TStnModule; class TStnMuonBlock; class TStnElectronBlock; class TPhoenixElectronBlock; class TStnMuonID; class TStnTofMatch; class TStntuple: public TObject { protected: static TStntuple* fgInstance; static Int_t fgRunNumber; static Int_t fgTriggerBucket; static TStnBeamPos* fgCotBeamPos; // COT beam position static TStnBeamPos* fgSvxBeamPos; // SVX beam position static TStnBeamPos* fgBeamPos; // best (if SVX exists, then SVX) static TStnBeamPosBlock* fgCotBeamPosBlock; // COT beam position static TStnBeamPosBlock* fgSvxBeamPosBlock; // SVX beam position static TStnBeamPosBlock* fgBeamPosBlock; // best (if SVX exists, then SVX) static Int_t fgLut_Dat[6][4096]; // lookUpTable: L1Met calculation Float_t fL1TrigEt; Float_t fL2TrigEt; Float_t fL3TrigEt; class Cleaner { public: Cleaner (); ~Cleaner(); }; friend class Cleaner; //----------------------------------------------------------------------------- // methods //----------------------------------------------------------------------------- public: // don't use constructor! use Instance() // instead (if ever necessary...) TStntuple(); virtual ~TStntuple(); static TStntuple* Instance(); static Int_t Init(Int_t RunNumber); // calorimeter isolation static Float_t CalIso(TCalDataBlock* calData, TStnTrack* trk, Float_t cone=0.4); static Float_t CalIso(TCalDataBlock* calData, Float_t detEta, Float_t phi, Float_t z=0.0, Float_t cone=0.4); // geometric conversions based on CES/PES radius static Float_t DetEtaFromCot(Float_t cott, Float_t z=0.0); static Float_t CotFromDetEta(Float_t detEta, Float_t z=0.0); static Float_t SinFromDetEta(Float_t detEta, Float_t z=0.0); static Float_t CesZPesRFromDetEta(Float_t detEta); static Int_t CenTowerFromZ(Float_t cesz); static Float_t DeltaR(Float_t phi0, Float_t eta0, Float_t phi1, Float_t eta1); static Int_t VprimReco (TClonesArray* trackList, TClonesArray* vertexList, double maxChi2, int minTracks, int searchMode); static Double_t TrackChi2RZ(TStnTrack* t, TStnVertex* v); static Int_t InitJets (TStnEvent* event); // return [signed!] track Pt for a // given curvature [1/cm] in a given // magnetic field [Tesla] static Double_t TrackPt (Double_t C0, Double_t BField = 1.4116); // correct RAW missing Et for muons // Mode = 0: only for high-Pt 'CMUO' // Mode = 1: plus for high-Pt 'CMIO' // Mode = 2: plus for low-Pt 'CMIO' static Int_t CorrectMetForMuons (TStnEvent* Event, TVector2& CorrMet, const char* MuonBranch, Int_t Mode = 1); static Int_t CorrectMetForMuons (TStnMuonBlock* MuonBlock, TStnMuonID* MuonID, TVector2* Met, TVector2* CorrMet, Int_t Mode = 1); static Int_t CorrectMet (TStnEvent* event, TVector2* corrMet, Double_t* corrHt); static Double_t CorrectedD0(TStnMuon* muo); static Double_t CorrectedD0(TStnElectron* ele); static Double_t CorrectedD0(TStnTrack* trk); //----------------------------------------------------------------------------- // clearly this implementation is not the best. Storing seed track number // in the tau record would allow to get rid of TauBlock parameter... //----------------------------------------------------------------------------- static TStnTrack* SeedTrack(const TStnTau* Tau , TStnTauBlock* TauBlock , TStnTrackBlock* TrackBlock); static Int_t TriggerBucket() { return fgTriggerBucket; } static Double_t TrkIso (TStnTrack* track, TClonesArray* trackList, Double_t cone = 0.4, Double_t dz = 5., Double_t ptMin = 10.); //----------------------------------------------------------------------------- // trigger utilities //----------------------------------------------------------------------------- static Int_t InitListOfL3Triggers(TStnModule* Module); static Int_t CheckL3TriggerPath (TStnTriggerBlock* TriggerBlock, TObjArray* ListOfTriggers); static Int_t PrintListOfPassedTriggers(TStnTriggerBlock* TriggerBlock, Int_t Level); //----------------------------------------------------------------------------- // Z0 of a high-Pt lepton (electron, muon or tau) //----------------------------------------------------------------------------- static Double_t LeptonZ0(TStnLepton* Lepton, TStnTrackBlock* TrackBlock); //----------------------------------------------------------------------------- // utility: set L1, L2 and L3 jet trigger thresholds for a given path // "JET_20", "JET_50", "JET_70" or "JET_100" //----------------------------------------------------------------------------- Int_t SetJetTriggerThresholds(const char* TriggerName); //----------------------------------------------------------------------------- // L1, L2 and L3 jet trigger thresholds for a given QCD trigger // set by the routine above //----------------------------------------------------------------------------- Float_t L1TrigEt() { return fL1TrigEt; } Float_t L2TrigEt() { return fL2TrigEt; } Float_t L3TrigEt() { return fL3TrigEt; } //----------------------------------------------------------------------------- // match a L2 cluster to a detector eta and phi // pass is L2 pass number // clusOrIso = 0 = return index to TTl2d::Cluster(i) // clusOrIso = 1 = return index to TTl2d::ClusterIso(i) //----------------------------------------------------------------------------- Int_t L2ClusterMatch(Double_t eta, Double_t phi, TStnTriggerBlock* trigBlock, int pass = 1, int clusOrIso = 0); //----------------------------------------------------------------------------- // 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 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 Double_t XftPt(Int_t PtBin, Int_t IsoBit, Int_t ShortBit); //----------------------------------------------------------------------------- // definitions of "good" (so far - for MET vertex only) high-pt leptons //----------------------------------------------------------------------------- static Int_t GoodHptElectron(const TStnElectron* Ele); static Int_t GoodHptMuon (const TStnMuon* Mu ); static Int_t GoodHptTau (const TStnTau* Tau); //----------------------------------------------------------------------------- // Larry's (Jun 28 2003) corrections to the track Pt (signed) // believe that it comes from the misalignment: // // pinv=pinv-.00037-.00110*sin(phi+.28) // // Mode=1: COT_only, 2: COT+SVX //----------------------------------------------------------------------------- Double_t LarrysPt (Double_t SignedPt, Double_t Phi0) { Error("LarrysPt", "Obsolete, use TStntuple::LarrysPt(TStnTrack*,Int_t,Int_t). Pasha"); double x = 1/SignedPt-0.00037-0.00110*sin(Phi0+0.28); return 1/x; } Double_t LarrysPt (TStnTrack* Track, Int_t Mode = 1, Int_t OffVer = 5); //----------------------------------------------------------------------------- // Pi0's //----------------------------------------------------------------------------- // define Pi0 4-momentum (and Z!) static void DefinePi0Momentum(TStnPi0* Pi0, Double_t Z0); //----------------------------------------------------------------------------- // # interaction len in central, noninteract Prob = exp(-cmwint/sin(theta)) // id = 0, 1, 2, 3, 4 ==>> pi, K+, K-, p, p-bar //----------------------------------------------------------------------------- static Float_t CmwInt(Int_t id, Float_t E); //----------------------------------------------------------------------------- // electrons //----------------------------------------------------------------------------- // scaled CES chi^2 (see CDF1329 by Rob Harris) static Float_t ScaledCesChi2(Float_t Chi2, Float_t E) { return 0.1792*pow(float(2.11),log(E))*Chi2; } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- static TStnTrack* TauSeedTrack(TStnTau* Tau, TStnTauBlock* TauBlock, TStnTrackBlock* TrackBlock); static TStnTrack* ElectronTrack(TStnElectron* Ele, TStnTrackBlock* TrackBlock); // initialize lookup table for met // calculation. taken from // CalTrigger/src/CalTriggerDB.cc static Int_t Load_LUT(); // calculate L1 MET from trigger towers // Tl1d[0] - metx; Tl1d[1] - mety // could not get it working with integer // sumet so made it float for now (D.T.) static void L1Met(TDcasDataBlock* _DcasData, int* Tl1d, Float_t &sumet); // correction to strip energy depending on position in chamber // wedge is calorimeter wedge (0-23) and side is east (0) or west (1) // x is ces cluster local x (-phi direction) // z is the ces local z = fabs(cdfz) // mcFlag = true when Mc event static double swMultiplier(int wedge, int side, float locX, float locZ, int mcflag); // set Track pointers in muon block static void SetTrackPointers(TStnMuonBlock* fMuonBlock, TStnTrackBlock* fTrackBlock); // set Track pointers in electron block static void SetTrackPointers(TStnElectronBlock* fElectronBlock, TStnTrackBlock* fTrackBlock); // set Track pointers in a phoenix electron block static void SetTrackPointersPh(TPhoenixElectronBlock* fPhoenixElectronBlock, TStnTrackBlock* fPhoenixSiTrackBlock); // set Track pointers in tau block static void SetTrackPointers(TStnTauBlock* fTauBlock, TStnTrackBlock* fTrackBlock); // make some standard corrections to electron energy for 5.3.3 // result is a modified fEtcor, which is used to scale Momentum() static Int_t CorrectElectronEnergy(TStnEvent* event); // fill in some missing Tau variables static Int_t TauTransients(TStnEvent* event, int mode=0xFFFFFFFF); //find a z position from the tracks in a jet // returns -999.0 if no vertex, else the vertex z // atracks return the number of tracks in the vertex static Float_t JetZpos(TStnJet* jet, TStnJetBlock* jbl, TStnTrackBlock* trbl, Int_t& atracks); //----------------------------------------------------------------------------- // print routines - sometimes it is not possible to do it from a single block //----------------------------------------------------------------------------- static int PrintTauBlock(TStnEvent* Event, Int_t PrintLevel); static int PrintTauTracks(TStnTau* Tau, TStnTauBlock* TauBlock, TStnTrackBlock* TrackBlock); static int PrintTauPi0s (TStnTau* Tau, TStnTauBlock* TauBlock, TStnPi0Block* Pi0Block); static int PrintTauTowers(TStnTau* Tau, TStnTauBlock* TauBlock, TCalDataBlock* CalDataBlock); static int PrintJetTowers(TStnJet* Jet, TStnJetBlock* JetBlock, TCalDataBlock* CalDataBlock); static int PrintJetTracks(TStnJet* Jet, TStnJetBlock* JetBlock, TStnTrackBlock* TrackBlock); //// Beamline main interface //static TVector3 BeamPosition(Int_t iEvent, Float_t z); //static TMatrixFSym BeamCov3 (Int_t iEvent, Float_t z); //// Beamline utility helpers //static TVector3 BeamOffset (Int_t iEvent); //static TVector3 BeamSlope (Int_t iEvent); // TOF utility functions static Float_t PredictedTofMuon (TStnTofMatch* tm, int run); static Float_t PredictedTofPion (TStnTofMatch* tm, int run); static Float_t PredictedTofKaon (TStnTofMatch* tm, int run); static Float_t PredictedTofProton(TStnTofMatch* tm, int run); static Float_t PredictedTof (Float_t arclen, Float_t p, Float_t mass); static Float_t ZCorrMPi (Float_t const par[6], Float_t z); static Float_t ZCorrKP (Float_t const par[13],Float_t pt, Float_t z); static Float_t PtCorrKP (Float_t const par[13],Float_t pt); ClassDef(TStntuple,0) }; #endif