#include #include #include #include #include #include #include #include #include #include IDsECalElectronControlSample::IDsECalElectronControlSample() : IControlSampleBase("DsECalElectron") { fMinTpc3Hits = COMET::IOARuntimeParameters::Get().GetParameterI("oaControlSample.DsECalElectron.MinTpc3Hits"); fTpc3BackDirMaxAngle = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.Tpc3BackDirMaxAngle"); fMinElePullAccept = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MinElePullAccept"); fMaxElePullAccept = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MaxElePullAccept"); fMinMuonPullReject = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MinMuonPullReject"); fMaxMuonPullReject = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MaxMuonPullReject"); fMinPionPullReject = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MinPionPullReject"); fMaxPionPullReject = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MaxPionPullReject"); fMinMomentum = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MinMomentum"); fMaxMomentum = COMET::IOARuntimeParameters::Get().GetParameterD("oaControlSample.DsECalElectron.MaxMomentum"); fMaxNumTpc3Objects = COMET::IOARuntimeParameters::Get().GetParameterI("oaControlSample.DsECalElectron.MaxNumTpc3Objects"); fMaxNumTpc3ObjectsPassingAllCuts = COMET::IOARuntimeParameters::Get().GetParameterI("oaControlSample.DsECalElectron.MaxNumTpc3ObjectsPassingAllCuts"); AddValidTrigger(COMET::Trigger::kBeamSpill); } IDsECalElectronControlSample::~IDsECalElectronControlSample() { if (hMom) { delete hMom; } } void IDsECalElectronControlSample::InitHistograms() { hMom = new TH1F("hMom", "Momentum", 50, 0, 5000); } double IDsECalElectronControlSample::GetFrontMomentum(COMET::IHandle object) { COMET::IHandle firstState = TrackingUtils::GetFirstState(*object); if (!firstState) { return -10000.; } return TrackingUtils::GetMomentum(firstState); } bool IDsECalElectronControlSample::PassesPullCuts(COMET::IHandle object) { COMET::IHandle pid = object; double pullEle = 10000, pullMuon = 10000, pullPion = 10000; if (pid) { COMET::IHandle test_datum = (pid)->Get ("tpcPid_NTrun"); if (test_datum) { pullEle = pid->Get ("tpcPid_PullEle")->GetValue(); pullMuon = pid->Get ("tpcPid_PullMuon")->GetValue(); pullPion = pid->Get ("tpcPid_PullPion")->GetValue(); } else { return false; } } if (pullEle < fMinElePullAccept || pullEle > fMaxElePullAccept) { return false; } if (pullMuon > fMinMuonPullReject && pullMuon < fMaxMuonPullReject) { return false; } if (pullPion > fMinPionPullReject && pullPion < fMaxPionPullReject) { return false; } return true; } bool IDsECalElectronControlSample::AtDsECalFrontFace(COMET::IHandle object) { COMET::IHandle lastState = TrackingUtils::GetLastState(*object); if (!lastState) { return false; } TLorentzVector backPos = TrackingUtils::GetPosition(lastState); double dsECalMinZ = 2665.; double dsECalMinX = -920.; double dsECalMaxX = 920.; double dsECalMinY = -910.; double dsECalMaxY = 930.; return (backPos.X() < dsECalMaxX && backPos.X() > dsECalMinX && backPos.Y() < dsECalMaxY && backPos.Y() > dsECalMinY && backPos.Z() > dsECalMinZ); } double IDsECalElectronControlSample::GetBackAngleToZ(COMET::IHandle object) { COMET::IHandle lastState = TrackingUtils::GetLastState(*object); if (!lastState) { return -1000.; } return TrackingUtils::GetDirection(lastState).Unit().Angle(TVector3(0, 0, 1)) * TMath::RadToDeg(); } bool IDsECalElectronControlSample::IsEventSelectedInternal(COMET::ICOMETEvent& event) { COMET::IHandle reconResult = event.GetFit("ReconGlobal"); if (!reconResult) { return false; } COMET::IHandle roc = reconResult->GetResultsContainer("final"); if (!roc) { return false; } // The number of TPC3 objects that enter the DsECal unsigned int numTpc3Objects = 0; // The TPC3 objects that enter the DsECal and pass all our other cuts std::vector > selectedObjects; for (COMET::IReconObjectContainer::iterator it = roc->begin(); it != roc->end(); it++) { COMET::IHandle object = *it; if (!object || !object->UsesDetector(COMET::IReconBase::kTPC3) || !object->CheckStatus(COMET::IReconBase::kSuccess)) { continue; } COMET::IHandle tpc3Object = ReconObjectUtils::GetConstituentInDetector(object, COMET::IReconBase::kTPC3); if (!tpc3Object || !AtDsECalFrontFace(tpc3Object)) { continue; } numTpc3Objects++; bool passesPulls = PassesPullCuts(tpc3Object); double momentum = GetFrontMomentum(tpc3Object); double backAngle = GetBackAngleToZ(tpc3Object); int nHits = 0; if (tpc3Object->GetHits()) { nHits = tpc3Object->GetHits()->size(); } if (nHits > fMinTpc3Hits && backAngle < fTpc3BackDirMaxAngle && momentum > fMinMomentum && momentum < fMaxMomentum && passesPulls) { selectedObjects.push_back(tpc3Object); } } if (numTpc3Objects > fMaxNumTpc3Objects || selectedObjects.size() > fMaxNumTpc3ObjectsPassingAllCuts || selectedObjects.size() == 0) { return false; } if(fMakeHistoFile) for (std::vector >::iterator it = selectedObjects.begin(); it != selectedObjects.end(); it++) { hMom->Fill(GetFrontMomentum(*it)); } return true; }