Mattione GlueX Kinematic Fitting
From GlueXWiki
Quick Start
- It's fully integrated into the analysis suite, so to kinematically fit a DReaction you only have to specify the desired kinematic fit type in the DReaction.
#include "ANALYSIS/DKinFitter_GlueX.h" #include "ANALYSIS/DKinFitParticle.h" bool DKinFitAction_Sample::Perform_Action(JEventLoop* locEventLoop, const DParticleCombo* locParticleCombo, const deque<pair<const DParticleCombo*, bool> >& locPreviousParticleCombos) { //DParticleCombo is setup as: //g, p -> K+, Lambda //Lambda -> p, pi- DKinFitter_GlueX locKinFitter; DApplication* locApplication = dynamic_cast<DApplication*>(locEventLoop->GetJApplication()); locKinFitter.Set_BField(locApplication->GetBfield()); //need call only once locKinFitter.Reset_NewEvent(); //need to call prior to use in each event (cleans up memory allocated from last event) //CREATE DKINFITPARTICLE OBJECTS FOR EACH PARTICLE const DBeamPhoton* locBeamPhoton = static_cast<const DBeamPhoton*>(locParticleCombo->Get_ParticleComboStep(0)->Get_InitialParticle_Measured()); const DKinFitParticle* locKinFitParticle_BeamPhoton = locKinFitter.Make_BeamParticle(locBeamPhoton); const DKinFitParticle* locKinFitParticle_Target = locKinFitter.Make_TargetParticle(Proton); const DKinFitParticle* locKinFitParticle_Lambda = locKinFitter.Make_DecayingParticle(Lambda); const DChargedTrackHypothesis* locChargedTrackHypothesis_KPlus = static_cast<const DChargedTrackHypothesis*>(locParticleCombo->Get_ParticleComboStep(0)->Get_FinalParticle_Measured(0)); const DKinFitParticle* locKinFitParticle_KPlus = locKinFitter.Make_DetectedParticle(locChargedTrackHypothesis_KPlus); const DChargedTrackHypothesis* locChargedTrackHypothesis_Proton = static_cast<const DChargedTrackHypothesis*>(locParticleCombo->Get_ParticleComboStep(1)->Get_FinalParticle_Measured(0)); const DKinFitParticle* locKinFitParticle_Proton = locKinFitter.Make_DetectedParticle(locChargedTrackHypothesis_Proton); const DChargedTrackHypothesis* locChargedTrackHypothesis_PiMinus = static_cast<const DChargedTrackHypothesis*>(locParticleCombo->Get_ParticleComboStep(1)->Get_FinalParticle_Measured(1)); const DKinFitParticle* locKinFitParticle_PiMinus = locKinFitter.Make_DetectedParticle(locChargedTrackHypothesis_PiMinus); // SETUP THE CONSTRAINTS locKinFitter.Reset_NewFit(); //disregards the constraints from the previous kinematic fit deque<const DKinFitParticle*> locInitialKinFitParticles, locFinalKinFitParticles; // first p4 constraint: locInitialKinFitParticles.push_back(locKinFitParticle_BeamPhoton); locInitialKinFitParticles.push_back(locKinFitParticle_Target); locFinalKinFitParticles.push_back(locKinFitParticle_KPlus); locFinalKinFitParticles.push_back(locKinFitParticle_Lambda); locKinFitter.Add_P4Constraint(locInitialKinFitParticles, locFinalKinFitParticles); // second p4 constraint: locInitialKinFitParticles.clear(); locFinalKinFitParticles.clear(); locInitialKinFitParticles.push_back(locKinFitParticle_Lambda); locFinalKinFitParticles.push_back(locKinFitParticle_PiMinus); locFinalKinFitParticles.push_back(locKinFitParticle_Proton); locKinFitter.Add_P4Constraint(locInitialKinFitParticles, locFinalKinFitParticles); // vertex constraint TVector3 locVertexGuess(locKinFitParticle_Proton->Get_Position()); //try to get a better vertex guess than this! locInitialKinFitParticles.clear(); locFinalKinFitParticles.clear(); locInitialKinFitParticles.push_back(locKinFitParticle_Lambda); //here the lambda isn't constraining the vertex (since it's only in one vertex fit); instead it's vertex will be defined by the fit result locFinalKinFitParticles.push_back(locKinFitParticle_PiMinus); locFinalKinFitParticles.push_back(locKinFitParticle_Proton); locKinFitter.Add_VertexConstraint(locInitialKinFitParticles, locFinalKinFitParticles, locVertexGuess); // PERFORM THE KINEMATIC FIT locKinFitter.Fit_Reaction(); // GET THE FIT RESULTS double locConfidenceLevel = locKinFitter.Get_ConfidenceLevel(); double locChiSq = locKinFitter.Get_ChiSq(); unsigned int locNDF = locKinFitter.Get_NDF(); const TMatrixDSym* locMeasuredParametersKinFitCovarianceMatrix = locKinFitter.Get_VEta(); const TMatrixDSym* locUnknownParametersCovarianceMatrix = locKinFitter.Get_VXi(); DKinFitParticle* locKinFitParticle_Proton_Output = locKinFitter.Get_OutputKinFitParticle(locKinFitParticle_Proton); DKinFitParticle* locKinFitParticle_PiMinus_Output = locKinFitter.Get_OutputKinFitParticle(locKinFitParticle_PiMinus); DKinFitParticle* locKinFitParticle_KPlus_Output = locKinFitter.Get_OutputKinFitParticle(locKinFitParticle_KPlus); DKinFitParticle* locKinFitParticle_Lambda_Output = locKinFitter.Get_OutputKinFitParticle(locKinFitParticle_Lambda); TVector3 locKinFitVertex = locKinFitParticle_PiMinus_Output->Get_CommonVertex(); }