57 for(
unsigned int i=0; i<a.size(); i++){
58 for(
unsigned int j=0; j<b.size(); j++){
82 gPARMS->SetDefaultParameter(
"TRKFIT:DEBUG_LEVEL",DEBUG_LEVEL);
84 SKIP_MASS_HYPOTHESES_WIRE_BASED=
true;
85 gPARMS->SetDefaultParameter(
"TRKFIT:SKIP_MASS_HYPOTHESES_WIRE_BASED",
86 SKIP_MASS_HYPOTHESES_WIRE_BASED);
87 PROTON_MOM_THRESH=0.8;
88 gPARMS->SetDefaultParameter(
"TRKFIT:PROTON_MOM_THRESH",
92 vector<int> hypotheses;
94 hypotheses.push_back(
PiPlus);
95 hypotheses.push_back(
KPlus);
96 hypotheses.push_back(
Proton);
99 hypotheses.push_back(
KMinus);
102 ostringstream locMassStream;
103 for(
size_t loc_i = 0; loc_i < hypotheses.size(); ++loc_i)
105 locMassStream << hypotheses[loc_i];
106 if(loc_i != (hypotheses.size() - 1))
107 locMassStream <<
",";
110 string HYPOTHESES = locMassStream.str();
111 gPARMS->SetDefaultParameter(
"TRKFIT:HYPOTHESES", HYPOTHESES);
116 for(
size_t loc_i = 0; loc_i < hypotheses.size(); ++loc_i)
119 mass_hypotheses_positive.push_back(hypotheses[loc_i]);
121 mass_hypotheses_negative.push_back(hypotheses[loc_i]);
124 if(mass_hypotheses_positive.empty()){
125 static once_flag pwarn_flag;
126 call_once(pwarn_flag, [](){
128 jout <<
"############# WARNING !! ################ " <<endl;
129 jout <<
"There are no mass hypotheses for positive tracks!" << endl;
130 jout <<
"Be SURE this is what you really want!" << endl;
131 jout <<
"######################################### " <<endl;
135 if(mass_hypotheses_negative.empty()){
136 static once_flag nwarn_flag;
137 call_once(nwarn_flag, [](){
139 jout <<
"############# WARNING !! ################ " <<endl;
140 jout <<
"There are no mass hypotheses for negative tracks!" << endl;
141 jout <<
"Be SURE this is what you really want!" << endl;
142 jout <<
"######################################### " <<endl;
146 mNumHypPlus=mass_hypotheses_positive.size();
147 mNumHypMinus=mass_hypotheses_negative.size();
169 SetFactoryFlag(NOT_OBJECT_OWNER);
172 ClearFactoryFlag(NOT_OBJECT_OWNER);
177 rt->SetDGeometry(geom);
180 vector<const DTrackFitter *> fitters;
183 if(fitters.size()<1){
184 _DBG_<<
"Unable to get a DTrackFitter object! NO Charged track fitting will be done!"<<endl;
185 return RESOURCE_UNAVAILABLE;
193 _DBG_<<
"Unable to get a DTrackFitter object! NO Charged track fitting will be done!"<<endl;
194 return RESOURCE_UNAVAILABLE;
197 USE_HITS_FROM_CANDIDATE=
false;
198 gPARMS->SetDefaultParameter(
"TRKFIT:USE_HITS_FROM_CANDIDATE",
199 USE_HITS_FROM_CANDIDATE);
202 gPARMS->SetDefaultParameter(
"TRKFIT:MIN_FIT_P", MIN_FIT_P,
"Minimum fit momentum in GeV/c for fit to be considered successful");
215 loop->GetSingle(dPIDAlgorithm);
218 if (geom->GetDIRCZ(dDIRCz)==
false) dDIRCz=1000.;
219 geom->GetFCALZ(dFCALz);
220 vector<double>tof_face;
221 geom->Get(
"//section/composition/posXYZ[@volume='ForwardTOF']/@X_Y_Z",
223 vector<double>tof_plane;
224 geom->Get(
"//composition[@name='ForwardTOF']/posXYZ[@volume='forwardTOF']/@X_Y_Z/plane[@value='0']", tof_plane);
225 dTOFz=tof_face[2]+tof_plane[2];
226 geom->Get(
"//composition[@name='ForwardTOF']/posXYZ[@volume='forwardTOF']/@X_Y_Z/plane[@value='1']", tof_plane);
227 dTOFz+=tof_face[2]+tof_plane[2];
231 if (geom->GetStartCounterGeom(sc_pos,sc_norm)){
233 for (
int i=0;i<30;i++){
234 vector<DVector3>
temp;
235 for (
unsigned int j=0;j<sc_pos[i].size()-1;j++){
236 double dx=sc_pos[i][j+1].x()-sc_pos[i][j].x();
237 double dy=sc_pos[i][j+1].y()-sc_pos[i][j].y();
238 double dz=sc_pos[i][j+1].z()-sc_pos[i][j].z();
239 temp.push_back(
DVector3(dx/dz,dy/dz,1.));
241 sc_dir.push_back(temp);
243 SC_END_NOSE_Z=sc_pos[0][12].z();
244 SC_BARREL_R=sc_pos[0][0].Perp();
245 SC_PHI_SECTOR1=sc_pos[0][0].Phi();
257 if(!
fitter)
return NOERROR;
265 vector<const DTrackWireBased*> locWireBasedTracks;
266 loop->Get(locWireBasedTracks,
"StraightLine");
267 for(
size_t loc_i = 0; loc_i < locWireBasedTracks.size(); ++loc_i)
268 _data.push_back(const_cast<DTrackWireBased*>(locWireBasedTracks[loc_i]));
273 vector<const DTrackCandidate*> candidates;
274 loop->Get(candidates);
276 if (candidates.size()==0)
return NOERROR;
279 for(
unsigned int i=0; i<candidates.size(); i++){
283 if (candidate->
momentum().Mag()<MIN_FIT_P){
287 if (SKIP_MASS_HYPOTHESES_WIRE_BASED){
289 rt->q = candidate->
charge();
293 if (candidate->
momentum().Mag()<PROTON_MOM_THRESH){
300 vector<int> mass_hypotheses;
301 if(candidate->
charge()<0.0){
302 mass_hypotheses = mass_hypotheses_negative;
304 mass_hypotheses = mass_hypotheses_positive;
307 if ((!isfinite(candidate->
momentum().Mag())) || (!isfinite(candidate->
position().Mag())))
308 _DBG_ <<
"Invalid seed data for event "<< eventnumber <<
"..."<<endl;
311 for(
unsigned int j=0; j<mass_hypotheses.size(); j++){
312 if(DEBUG_LEVEL>1){
_DBG__;
_DBG_<<
"---- Starting wire based fit with id: "<<mass_hypotheses[j]<<endl;}
315 rt->q = candidate->
charge();
326 if (SKIP_MASS_HYPOTHESES_WIRE_BASED==
false){
327 InsertMissingHypotheses();
360 if(_data.size()==0)
return;
362 if(DEBUG_LEVEL>2)
_DBG_<<
"Looking for clones of wire-based tracks ..."<<endl;
364 set<unsigned int> indexes_to_delete;
365 for(
unsigned int i=0; i<_data.size()-1; i++){
368 vector<const DCDCTrackHit*> cdchits1;
369 vector<const DFDCPseudo*> fdchits1;
370 dtrack1->Get(cdchits1);
371 dtrack1->Get(fdchits1);
374 for(
unsigned int j=i+1; j<_data.size(); j++){
377 if (dtrack2->
mass() != dtrack1->
mass())
continue;
379 vector<const DCDCTrackHit*> cdchits2;
380 vector<const DFDCPseudo*> fdchits2;
381 dtrack2->Get(cdchits2);
382 dtrack2->Get(fdchits2);
387 unsigned int total = Ncdc + Nfdc;
389 if (total==0)
continue;
390 if(Ncdc!=cdchits1.size() && Ncdc!=cdchits2.size())
continue;
391 if(Nfdc!=fdchits1.size() && Nfdc!=fdchits2.size())
continue;
393 unsigned int total1 = cdchits1.size()+fdchits1.size();
394 unsigned int total2 = cdchits2.size()+fdchits2.size();
395 if(total!=total1 && total!=total2)
continue;
403 _data[j]->candidateid=cand1;
404 indexes_to_delete.insert(i);
406 indexes_to_delete.insert(j);
412 if(DEBUG_LEVEL>2)
_DBG_<<
"Found "<<indexes_to_delete.size()<<
" wire-based clones"<<endl;
415 if(indexes_to_delete.size()==0)
return;
419 vector<DTrackWireBased*> new_data;
420 for(
unsigned int i=0; i<_data.size(); i++){
421 if(indexes_to_delete.find(i)==indexes_to_delete.end()){
422 new_data.push_back(_data[i]);
425 if(DEBUG_LEVEL>1)
_DBG_<<
"Deleting clone wire-based track "<<i<<endl;
435 JEventLoop *loop,
double mass){
437 vector<const DFDCPseudo*>myfdchits;
438 candidate->GetT(myfdchits);
439 vector<const DCDCTrackHit *>mycdchits;
440 candidate->GetT(mycdchits);
444 if (USE_HITS_FROM_CANDIDATE) {
452 candidate->
charge(),mass,0.);
464 mycdchits.size()+2*myfdchits.size());
466 if (DEBUG_LEVEL>1)
_DBG_ <<
"Using hits from candidate..." << endl;
473 candidate->
charge(),mass,0.);
508 for(
unsigned int m=0; m<cdchits.size(); m++)track->AddAssociatedObject(cdchits[m]);
509 for(
unsigned int m=0; m<fdchits.size(); m++)track->AddAssociatedObject(fdchits[m]);
512 vector<const DCDCTrackHit*> tempCDCTrackHits;
513 vector<const DFDCPseudo*> tempFDCPseudos;
514 track->Get(tempCDCTrackHits);
515 track->Get(tempFDCPseudos);
516 track->
dCDCRings = dPIDAlgorithm->Get_CDCRingBitPattern(tempCDCTrackHits);
517 track->
dFDCPlanes = dPIDAlgorithm->Get_FDCPlaneBitPattern(tempFDCPseudos);
520 track->AddAssociatedObject(candidate);
522 _data.push_back(track);
533 if (_data.size()==0)
return false;
538 JObject::oid_t old_id=_data[0]->candidateid;
539 unsigned int mass_bits=0;
540 double q=_data[0]->charge();
541 vector<DTrackWireBased*>myhypotheses;
542 vector<DTrackWireBased*>tracks_to_add;
543 for (
size_t i=0;i<_data.size();i++){
544 if (_data[i]->candidateid!=old_id){
545 int num_hyp=myhypotheses.size();
546 if ((q<0 && num_hyp!=mNumHypMinus)||(q>0 && num_hyp!=mNumHypPlus)){
547 AddMissingTrackHypotheses(mass_bits,tracks_to_add,myhypotheses,q);
551 myhypotheses.clear();
553 q=_data[i]->charge();
556 mass_bits = 1<<_data[i]->PID();
559 myhypotheses.push_back(_data[i]);
562 myhypotheses.push_back(_data[i]);
565 mass_bits |= 1<< _data[i]->PID();
568 old_id=_data[i]->candidateid;
571 int num_hyp=myhypotheses.size();
572 if ((q<0 && num_hyp!=mNumHypMinus)||(q>0 && num_hyp!=mNumHypPlus)){
573 AddMissingTrackHypotheses(mass_bits,tracks_to_add,myhypotheses,q);
577 if (tracks_to_add.size()>0){
578 for (
size_t i=0;i<tracks_to_add.size();i++){
579 _data.push_back(tracks_to_add[i]);
596 *
static_cast<DTrackingData*
>(wirebased_track) = *static_cast<const DTrackingData*>(src_track);
601 wirebased_track->
Ndof = src_track->
Ndof;
605 wirebased_track->
FOM=src_track->
FOM;
623 if (momentum.Mag()>0.){
624 CorrectForELoss(position,momentum,q,my_mass);
631 vector<const DCDCTrackHit *>cdchits;
632 src_track->GetT(cdchits);
633 vector<const DFDCPseudo *>fdchits;
634 src_track->GetT(fdchits);
635 for(
unsigned int m=0; m<fdchits.size(); m++)
636 wirebased_track->AddAssociatedObject(fdchits[m]);
637 for(
unsigned int m=0; m<cdchits.size(); m++)
638 wirebased_track->AddAssociatedObject(cdchits[m]);
640 tracks_to_add.push_back(wirebased_track);
649 rt->SetMass(my_mass);
654 rt->FastSwim(position,momentum,last_pos,last_mom,rt->q,origin,dir,300.);
662 vector<DTrackWireBased*>&tracks_to_add,
663 vector<DTrackWireBased *>&myhypotheses,
668 unsigned int last_index=myhypotheses.size()-1;
670 if ((mass_bits & (1<<
Proton))==0){
671 AddMissingTrackHypothesis(tracks_to_add,myhypotheses[last_index],
674 for (
int i=0;i<3;i++){
675 if ((mass_bits & (1<<positive_particles[i]))==0){
676 AddMissingTrackHypothesis(tracks_to_add,myhypotheses[0],
683 AddMissingTrackHypothesis(tracks_to_add,myhypotheses[last_index],
686 for (
int i=0;i<3;i++){
687 if ((mass_bits & (1<<negative_particles[i]))==0){
688 AddMissingTrackHypothesis(tracks_to_add,myhypotheses[0],
map< DetectorSystem_t, vector< DTrackFitter::Extrapolation_t > > extrapolations
void AddMissingTrackHypothesis(vector< DTrackWireBased * > &tracks_to_add, const DTrackWireBased *src_track, double my_mass, double q)
void setMomentum(const DVector3 &aMomentum)
vector< pull_t > & GetPulls(void)
float chisq
Chi-squared for the track (not chisq/dof!)
The DTrackFitter class is a base class for different charged track fitting algorithms. It does not actually fit the track itself, but provides the interface and some common support features most algorthims will need to implement.
void AddHits(vector< const DCDCTrackHit * > cdchits)
DMagneticFieldMap * GetBfield(unsigned int run_number=1)
void SetMass(double mass)
const DVector3 & position(void) const
const DFDCWire * wire
DFDCWire for this wire.
class DFDCPseudo: definition for a reconstructed point in the FDC
jerror_t brun(jana::JEventLoop *loop, int32_t runnumber)
Called everytime a new run number is detected.
jerror_t fini(void)
Called after last event of last event source has been processed.
static int ParticleCharge(Particle_t p)
static char index(char c)
void AddMissingTrackHypotheses(unsigned int mass_bits, vector< DTrackWireBased * > &tracks_to_add, vector< DTrackWireBased * > &hypotheses, double q)
fit_status_t FindHitsAndFitTrack(const DKinematicData &starting_params, const DReferenceTrajectory *rt, JEventLoop *loop, double mass=-1.0, int N=0, double t0=QuietNaN, DetectorSystem_t t0_det=SYS_NULL)
mass<0 means get it from starting_params
jerror_t erun(void)
Called everytime run number changes, provided brun has been called.
vector< DTrackFitter::pull_t > pulls
Holds pulls used in chisq calc. (not including off-diagonals)
void FastSwimForHitSelection(const DVector3 &pos, const DVector3 &mom, double q)
const map< DetectorSystem_t, vector< Extrapolation_t > > & GetExtrapolations(void) const
jerror_t init(void)
Called once at program start.
void CorrectForELoss(DVector3 &position, DVector3 &momentum, double q, double mass)
double GetChisq(void) const
void SetFitType(fit_type_t type)
void SplitString(string str, vector< T > &vec, const string &delim=" ")
DGeometry * GetDGeometry(unsigned int run_number)
bool FDCSortByZincreasing(DTrackCandidate_factory_FDC::DFDCTrkHit *const &hit1, DTrackCandidate_factory_FDC::DFDCTrkHit *const &hit2)
void FilterDuplicates(void)
double charge(void) const
const vector< const DCDCTrackHit * > & GetCDCFitHits(void) const
static unsigned int count_common_members(vector< T > &a, vector< T > &b)
jerror_t evnt(jana::JEventLoop *loop, uint64_t eventnumber)
Called every event.
<A href="index.html#legend"> <IMG src="CORE.png" width="100"> </A>
int Ndof
Number of degrees of freedom in the fit.
void setPID(Particle_t locPID)
const vector< const DFDCPseudo * > & GetFDCFitHits(void) const
static double ParticleMass(Particle_t p)
const DVector3 & momentum(void) const
void DoFit(unsigned int c_id, const DTrackCandidate *candidate, DReferenceTrajectory *rt, jana::JEventLoop *loop, double mass)
fit_status_t FitTrack(const DVector3 &pos, const DVector3 &mom, double q, double mass, double t0=QuietNaN, DetectorSystem_t t0_det=SYS_NULL)
const DTrackFitter * fitter
bool DTrackWireBased_cmp(DTrackWireBased *a, DTrackWireBased *b)
oid_t candidateid
which DTrackCandidate this came from
void setPosition(const DVector3 &aPosition)
static Particle_t IDTrack(float locCharge, float locMass)
bool CDCSortByRincreasing(const DCDCTrackHit *const &hit1, const DCDCTrackHit *const &hit2)
bool InsertMissingHypotheses(void)
const DTrackingData & GetFitParameters(void) const