Mattione GlueX Kinematic Fitting

From GlueXWiki
Revision as of 20:21, 13 October 2012 by Pmatt (Talk | contribs) (Quick Start)

Jump to: navigation, search

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();
}