Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

AlgFitTrackSA Class Reference

#include <AlgFitTrackSA.h>

Inheritance diagram for AlgFitTrackSA:

AlgBase List of all members.

Public Member Functions

 AlgFitTrackSA ()
virtual ~AlgFitTrackSA ()
virtual void RunAlg (AlgConfig &ac, CandHandle &ch, CandContext &cx)

Private Member Functions

void PrepareFit (CandFitTrackSAHandle &cftsah, CandTrackHandle *candtrackhandle)
void FillFromCandTrack (CandFitTrackSAHandle &cftsah, CandTrackHandle *trackHandle)
void FillClusterList (CandTrackHandle *trackHandle)
void FillDaughterList (CandFitTrackSAHandle &cftsah)
void FillCandFitTrack (CandFitTrackSAHandle &cftsah)
void FillDummyNtp ()
void CloneDaughterList (CandFitTrackSAHandle &cftsah)
void FillDummyCandFitTrack (CandFitTrackSAHandle &cftsah)
void CleanupFit ()
void InitialEstimate ()
FitState DoFit ()
bool CanFit ()
SuperIterationState DoSuperIterations ()
void InitSuperIterations ()
void InitNextSuperIteration ()
void DoNextSuperIteration ()
bool ContinueSuperIterations ()
IterationState DoIterations (int nplanes)
void InitIterations ()
void InitNextIteration ()
void DoNextIteration ()
bool ContinueIterations ()
void Guesstimate (TVectorD &trackOut, int nplanes)
void FilterHits ()
void FillLinear ()
void FillNtp ()
int Swim (int nplanes)
int Swim ()
int NPlanesNext (int nplanesconv, int nplanesdiv)
 ClassDef (AlgFitTrackSA, 0)

Private Attributes

AlgConfig falgcfg
Int_t fBegPlane
Int_t fEndPlane
Int_t fIdir
Double_t fPrange
list< TrackClusterSRfClusterList
BFieldfBField
DataFTfData
TVectorD fTrackIn0
FitState fFitState
Double_t fCpu
vector< SuperIterationStatefSuperIterationStateList
vector< IterationStatefIterationStateList
FitResultfLastGoodFit
NtpFitSAfFitNtp
MatrixCalculator fMatCalc

Constructor & Destructor Documentation

AlgFitTrackSA::AlgFitTrackSA  ) 
 

Definition at line 73 of file AlgFitTrackSA.cxx.

References MSG.

00073                              :
00074         fBegPlane(0), fEndPlane(0), fIdir(0), fPrange(0), fBField(0),
00075         fData(0), fTrackIn0(NTrackParams), fCpu(0), 
00076         fLastGoodFit(0), fFitNtp(0) {
00077     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::Constructor\n";
00078 }

AlgFitTrackSA::~AlgFitTrackSA  )  [virtual]
 

Definition at line 81 of file AlgFitTrackSA.cxx.

References CleanupFit(), and MSG.

00081                               {
00082     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::Destructor\n";
00083     CleanupFit();
00084 }


Member Function Documentation

bool AlgFitTrackSA::CanFit  )  [private]
 

Definition at line 415 of file AlgFitTrackSA.cxx.

References falgcfg, fData, Registry::GetInt(), DataFT::GetNUHitsUsed(), and DataFT::GetNVHitsUsed().

Referenced by DoFit().

00415                            {
00416 
00417     if ( fData->GetNUHitsUsed() < falgcfg.GetInt("NHitsInViewMin") ||
00418          fData->GetNVHitsUsed() < falgcfg.GetInt("NHitsInViewMin") ) {
00419         return 0;
00420     } else {
00421         return 1;
00422     }
00423 }

AlgFitTrackSA::ClassDef AlgFitTrackSA  ,
[private]
 

void AlgFitTrackSA::CleanupFit  )  [private]
 

Definition at line 151 of file AlgFitTrackSA.cxx.

References fBField, fClusterList, fData, fFitNtp, and fLastGoodFit.

Referenced by RunAlg(), and ~AlgFitTrackSA().

00152 {
00153     fClusterList.clear();
00154     
00155     if ( fData )  delete fData; fData = 0;
00156     if ( fBField )  delete fBField; fBField = 0;
00157     if ( fLastGoodFit ) delete fLastGoodFit; fLastGoodFit = 0;
00158     if ( fFitNtp ) delete fFitNtp; fFitNtp = 0;
00159 }    

void AlgFitTrackSA::CloneDaughterList CandFitTrackSAHandle cftsah  )  [private]
 

Definition at line 854 of file AlgFitTrackSA.cxx.

References abs(), CandHandle::AddDaughterLink(), fBegPlane, fClusterList, fData, MSG, DataFT::UseHitU(), and DataFT::UseHitV().

Referenced by RunAlg().

00854                                                                   {
00855     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::CloneDaughterList\n";
00856     //
00857     for ( list<TrackClusterSR>::iterator tcit = fClusterList.begin(); tcit != fClusterList.end(); ++tcit) {
00858         int iplane = tcit->GetPlane();
00859         
00860         if ( fData->UseHitU(abs(iplane-fBegPlane)) || fData->UseHitV(abs(iplane-fBegPlane)) ) {
00861             const TObjArray* striplist = tcit->GetStripList();
00862             
00863             for ( int i = 0; i<striplist->GetEntries(); i++) {
00864                 CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplist->At(i));                
00865                 cftsah.AddDaughterLink(*cstriph);
00866             }
00867         }
00868     }
00869     
00870     return;
00871 }

bool AlgFitTrackSA::ContinueIterations  )  [private]
 

Definition at line 661 of file AlgFitTrackSA.cxx.

References fIterationStateList, and MSG.

Referenced by DoIterations().

00661                                        {
00662     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::ContinueIterations\n";
00663     
00664     MSG("FitTrackSA",Msg::kDebug) << "Decide if need to continue iterations\n";
00665 
00666     vector<IterationState>::const_reverse_iterator last = fIterationStateList.rbegin();
00667     // each of the conditions stops iterations 
00668     if ( last->status == kPass ) return kTRUE;    // continue only if status kPass
00669     
00670     return kFALSE;
00671 }

bool AlgFitTrackSA::ContinueSuperIterations  )  [private]
 

Definition at line 542 of file AlgFitTrackSA.cxx.

References fSuperIterationStateList, MSG, SuperIterationState::nplanesconv, and SuperIterationState::nplanesdiv.

Referenced by DoSuperIterations().

00542                                             {
00543     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::ContinueSuperIterations\n";
00544 
00545     MSG("FitTrackSA",Msg::kDebug) << "Decide if need to continue super iterations\n";
00546     
00547     vector<SuperIterationState>::const_reverse_iterator lastsi = fSuperIterationStateList.rbegin();
00548     
00549     MSG("FitTrackSA",Msg::kDebug) << "Number of diverging planes " << lastsi->nplanesdiv << "\n";    
00550     MSG("FitTrackSA",Msg::kDebug) << "Number of converging planes " << lastsi->nplanesconv << "\n";    
00551     
00552     if ( lastsi->status == kConvergedFinal ) return kFALSE;
00553     if ( lastsi->status == kNoConvergenceFinal ) return kFALSE;
00554     if ( lastsi->status == kMaxIterationsReached ) return kFALSE;
00555             
00556     return kTRUE;
00557 }

FitState AlgFitTrackSA::DoFit  )  [private]
 

Definition at line 382 of file AlgFitTrackSA.cxx.

References CanFit(), DoSuperIterations(), fSuperIterationStateList, MSG, FitState::niterations, FitState::nplanes, SuperIterationState::nplanesconv, FitState::status, and SuperIterationState::status.

Referenced by RunAlg().

00382                               {
00383     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::DoFit\n";
00384     
00385     MSG("FitTrackSA",Msg::kDebug) << "Starting fit.\n";
00386     
00387 //    InitFitState();
00388   
00389     FitState fstate;
00390         
00391     if ( CanFit() ) {  
00392         SuperIterationState sistate = DoSuperIterations(); 
00393         
00394         fstate.nplanes = sistate.nplanesconv;
00395         if ( sistate.status == kConvergedFinal ) {
00396             fstate.status = kFitSuccess;
00397         } else {
00398             fstate.status = kFitFailed;
00399         }
00400         
00401         int niter = 0;
00402         for (vector<SuperIterationState>::const_iterator it = fSuperIterationStateList.begin(); 
00403                                                         it != fSuperIterationStateList.end(); ++it) {
00404             niter += it->niterations;
00405         }
00406         fstate.niterations = niter;    
00407     } else {
00408         fstate.status = kFitFailed;
00409     }
00410                     
00411     return fstate;
00412 }

IterationState AlgFitTrackSA::DoIterations int  nplanes  )  [private]
 

Definition at line 560 of file AlgFitTrackSA.cxx.

References ContinueIterations(), IterationState::dchi2, DoNextIteration(), fData, fIterationStateList, fTrackIn0, DataFT::GetTrack(), IterationState::iteration, MSG, IterationState::ndiv, IterationState::nplanesrequest, DataFT::SetInitial(), and IterationState::status.

Referenced by DoNextSuperIteration().

00560                                                       {
00561     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::DoIterations\n";
00562 
00563     MSG("FitTrackSA",Msg::kDebug) << "Iterations\n";
00564     
00565     fIterationStateList.clear();
00566     IterationState state;
00567     state.iteration = 0;
00568     state.status = 0;
00569     state.dchi2 = 1e9;
00570     state.ndiv = 0;
00571     state.nplanesrequest = nplanes;
00572     
00573     fData->SetInitial(fTrackIn0);
00574     
00575     MSG("FitTrackSA",Msg::kDebug) << "Iteration " << state.iteration << "\n";
00576     MSG("FitTrackSA",Msg::kDebug) << "Status " << state.status << "\n";
00577     MSG("FitTrackSA",Msg::kDebug) << "dchi2 " << state.dchi2 << "\n";
00578     MSG("FitTrackSA",Msg::kDebug) << "N diverging " << state.ndiv << "\n";
00579     MSG("FitTrackSA",Msg::kDebug) << "Planes requested " << state.nplanesrequest << "\n";
00580     TVectorD track = fData->GetTrack();        
00581     MSG("FitTrackSA",Msg::kDebug) << "Track: " << track(0) << " " << track(1) << " " 
00582                                 << track(2) << " " << track(3) << " " << track(4) << "\n";
00583     
00584     fIterationStateList.push_back(state);
00585 
00586     do {
00587         DoNextIteration();
00588     } while ( ContinueIterations() );
00589         
00590     return *fIterationStateList.rbegin();
00591 }

void AlgFitTrackSA::DoNextIteration  )  [private]
 

Definition at line 594 of file AlgFitTrackSA.cxx.

References IterationState::dchi2, falgcfg, fData, fIterationStateList, fMatCalc, MatrixCalculator::GetdChi2(), Registry::GetDouble(), Registry::GetInt(), DataFT::GetNPlanesMin(), MatrixCalculator::GetTrackOut(), IterationState::iteration, MSG, IterationState::ndiv, IterationState::nplanesfit, IterationState::nplanesrequest, MatrixCalculator::SetForceMatrixBuild(), DataFT::SetInitial(), MatrixCalculator::Solve(), IterationState::status, and Swim().

Referenced by DoIterations().

00594                                     {
00595     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::DoNextIteration\n";
00596 
00597     MSG("FitTrackSA",Msg::kDebug) << "Next iteration\n";
00598     
00599     vector<IterationState>::const_reverse_iterator last = fIterationStateList.rbegin();
00600     
00601     IterationState state;
00602     state.iteration = last->iteration + 1;
00603     state.ndiv = last->ndiv;
00604     state.nplanesrequest = last->nplanesrequest;
00605         
00606     if ( state.iteration != 1 ) {
00607         fData->SetInitial(fMatCalc.GetTrackOut());
00608     }
00609     
00610     state.nplanesfit = Swim(state.nplanesrequest);
00611     
00612     if ( state.nplanesfit < fData->GetNPlanesMin(falgcfg.GetInt("NHitsInViewMin")) ) {
00613         state.status = kTooShortSwim;
00614         MSG("FitTrackSA",Msg::kDebug) << "Not enough planes!!\n";
00615         MSG("FitTrackSA",Msg::kDebug) << "Iteration " << state.iteration << "\n";
00616         MSG("FitTrackSA",Msg::kDebug) << "Status " << state.status << "\n";
00617     } else {
00618         //    
00619         fMatCalc.Solve(fData);        
00620         state.dchi2 = fMatCalc.GetdChi2();
00621         if ( last->dchi2 < state.dchi2 ) {
00622             state.ndiv = state.ndiv + 1;
00623         }
00624 
00625         state.status = kPass;
00626                 
00627         if ( state.dchi2 < falgcfg.GetDouble("MatrixBuildCond") ) {
00628             fMatCalc.SetForceMatrixBuild(0);
00629         } else {
00630             fMatCalc.SetForceMatrixBuild(1);
00631         }
00632         
00633         if ( state.dchi2 < falgcfg.GetDouble("ConvergenceCond") && state.nplanesfit == state.nplanesrequest ) {
00634             state.status = kConverged;
00635         }
00636 
00637         if ( state.dchi2 < falgcfg.GetDouble("ConvergenceCond") && state.nplanesfit != state.nplanesrequest ) {
00638             state.status = kConvergedPartial;
00639         }
00640 
00641         if ( state.ndiv > falgcfg.GetInt("NMaxDiverging") ) {
00642             state.status = kNoConvergence;
00643         } 
00644         if ( state.iteration > falgcfg.GetInt("NMaxIterations") ) {
00645             state.status = kMaxIterationsReached;
00646         }
00647         
00648         MSG("FitTrackSA",Msg::kDebug) << "Results of Iteration " << state.iteration << "\n";
00649         MSG("FitTrackSA",Msg::kDebug) << "Status " << state.status << "\n";
00650         MSG("FitTrackSA",Msg::kDebug) << "dchi2 " << state.dchi2 << "\n";
00651         MSG("FitTrackSA",Msg::kDebug) << "N diverging " << state.ndiv << "\n";
00652         TVectorD track = fMatCalc.GetTrackOut();        
00653         MSG("FitTrackSA",Msg::kDebug) << "Track: " << track(0) << " " << track(1) << " " 
00654                                     << track(2) << " " << track(3) << " " << track(4) << "\n";
00655     }
00656 
00657     fIterationStateList.push_back(state);            
00658 }

void AlgFitTrackSA::DoNextSuperIteration  )  [private]
 

Definition at line 474 of file AlgFitTrackSA.cxx.

References DoIterations(), falgcfg, fData, fLastGoodFit, fMatCalc, fSuperIterationStateList, fTrackIn0, Registry::GetInt(), DataFT::GetNHitsUsed(), FitResult::GetNplanes(), DataFT::GetNPlanesUsed(), FitResult::GetTrackOut(), MatrixCalculator::GetTrackOut(), IterationState::iteration, SuperIterationState::iteration, MSG, SuperIterationState::niterations, SuperIterationState::nplanesconv, SuperIterationState::nplanesdiv, IterationState::nplanesfit, NPlanesNext(), SuperIterationState::nplanesnext, IterationState::nplanesrequest, MatrixCalculator::SetForceMatrixBuild(), DataFT::SetInitial(), SuperIterationState::status, IterationState::status, and Swim().

Referenced by DoSuperIterations().

00474                                          {
00475     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::DoNextSuperIteration\n";
00476     
00477     MSG("FitTrackSA",Msg::kDebug) << "Next super iteration\n";
00478 
00479     fMatCalc.SetForceMatrixBuild(1);
00480     
00481     vector<SuperIterationState>::const_reverse_iterator lastsi = fSuperIterationStateList.rbegin();
00482     
00483     IterationState state = DoIterations(lastsi->nplanesnext);
00484     
00485     SuperIterationState sistate;    
00486     sistate.iteration = lastsi->iteration + 1;
00487     sistate.niterations = state.iteration;
00488     
00489     if ( state.status == kConverged ) {
00490         // converged ok - update lastgoodfit, trackin
00491         sistate.status = kConverged;
00492         sistate.nplanesdiv = lastsi->nplanesdiv;
00493         sistate.nplanesconv = state.nplanesfit;
00494         sistate.nplanesnext = NPlanesNext(sistate.nplanesconv, sistate.nplanesdiv);
00495         fTrackIn0 = fMatCalc.GetTrackOut();
00496         MSG("FitTrackSA",Msg::kDebug) << "Updated fTrackIn0: " << fTrackIn0(0) << " " 
00497             << fTrackIn0(1) << " " << fTrackIn0(2) << " " << fTrackIn0(3) << " " 
00498             << fTrackIn0(4) << "\n";        
00499         
00500         delete fLastGoodFit;
00501         fLastGoodFit = new FitResult(fMatCalc, fData->GetNHitsUsed()-5, fData->GetNPlanesUsed());                
00502     } else if ( state.status == kConvergedPartial ) {
00503         // coverged, but shorter track
00504         sistate.status = kConvergedPartial;
00505         sistate.nplanesdiv = state.nplanesrequest;
00506         sistate.nplanesconv = lastsi->nplanesconv;        
00507         //sistate.nplanesconv = state.nplanesfit;
00508         sistate.nplanesnext = NPlanesNext(sistate.nplanesconv, sistate.nplanesdiv);
00509     } else {
00510         sistate.status = kNoConvergence;
00511         sistate.nplanesdiv = state.nplanesrequest;
00512         sistate.nplanesconv = lastsi->nplanesconv;        
00513         sistate.nplanesnext = NPlanesNext(sistate.nplanesconv, sistate.nplanesdiv);
00514     }
00515         
00516     if ( sistate.nplanesdiv-sistate.nplanesconv <= 1 ) {
00517         if ( fLastGoodFit ) {
00518             if ( sistate.status != kConverged ) {
00519                 fData->SetInitial(fLastGoodFit->GetTrackOut());
00520                 Swim(fLastGoodFit->GetNplanes());
00521             } 
00522             sistate.status = kConvergedFinal;      
00523         } else { 
00524             sistate.status = kNoConvergenceFinal;
00525         }
00526     }
00527         
00528     MSG("FitTrackSA",Msg::kDebug) << "Results of Super Iteration " << sistate.iteration << "\n";
00529     MSG("FitTrackSA",Msg::kDebug) << "Status " << sistate.status << "\n";
00530     MSG("FitTrackSA",Msg::kDebug) << "Number of planes next " << sistate.nplanesnext << "\n";    
00531     MSG("FitTrackSA",Msg::kDebug) << "Number of diverging planes " << sistate.nplanesdiv << "\n";
00532     MSG("FitTrackSA",Msg::kDebug) << "Number of converging planes " << sistate.nplanesconv << "\n";
00533 
00534     if ( sistate.iteration > falgcfg.GetInt("NMaxIterations") ) {
00535         sistate.status = kMaxIterationsReached;
00536     }
00537         
00538     fSuperIterationStateList.push_back(sistate);            
00539 }

SuperIterationState AlgFitTrackSA::DoSuperIterations  )  [private]
 

Definition at line 442 of file AlgFitTrackSA.cxx.

References ContinueSuperIterations(), DoNextSuperIteration(), falgcfg, fData, fSuperIterationStateList, Registry::GetInt(), DataFT::GetNPlanes(), DataFT::GetNPlanesMin(), SuperIterationState::iteration, MSG, SuperIterationState::niterations, SuperIterationState::nplanesconv, SuperIterationState::nplanesdiv, SuperIterationState::nplanesnext, and SuperIterationState::status.

Referenced by DoFit().

00442                                                      {
00443     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::DoSuperIterations\n";
00444     
00445     MSG("FitTrackSA",Msg::kDebug) << "Super iterations\n";
00446 
00447     fSuperIterationStateList.clear();
00448     SuperIterationState sistate;
00449     
00450     sistate.status = 0;
00451     sistate.iteration = 0;    
00452     sistate.niterations = 0;    
00453     
00454     sistate.nplanesdiv = TMath::Min(fData->GetNPlanes(), falgcfg.GetInt("NMaxPlanes")) + 1;
00455     sistate.nplanesconv = fData->GetNPlanesMin(falgcfg.GetInt("NHitsInViewMin")) - 1;
00456     
00457     // sistate.nplanesnext = NPlanesNext(sistate.nplanesconv, sistate.nplanesdiv);;
00458     sistate.nplanesnext = sistate.nplanesdiv - 1;
00459     
00460     MSG("FitTrackSA",Msg::kDebug) << "Number of diverging planes " << sistate.nplanesdiv << "\n";
00461     MSG("FitTrackSA",Msg::kDebug) << "Number of converging planes " << sistate.nplanesconv << "\n";
00462     MSG("FitTrackSA",Msg::kDebug) << "Number of planes to try " << sistate.nplanesnext << "\n";
00463     
00464     fSuperIterationStateList.push_back(sistate);
00465     
00466     do {
00467         DoNextSuperIteration();
00468     } while ( ContinueSuperIterations() );
00469         
00470     return *fSuperIterationStateList.rbegin();
00471 }

void AlgFitTrackSA::FillCandFitTrack CandFitTrackSAHandle cftsah  )  [private]
 

Definition at line 724 of file AlgFitTrackSA.cxx.

References NtpFitSAFit::chi2, NtpFitSAFit::cpu, NtpFitSAVtx::dcosu, NtpFitSAVtx::dcosv, NtpFitSAVtx::dcosz, NtpFitSAVtx::eu, NtpFitSAVtx::ev, fFitNtp, NtpFitSA::fit, MSG, NtpFitSAFit::ndf, NtpFitSAFit::niter, NtpFitSA::p, NtpFitSAFit::parerr, NtpFitSAVtx::plane, NtpFitSA::q, CandFitTrackHandle::SetChi2(), CandFitTrackHandle::SetCPUTime(), CandRecoHandle::SetDirCosU(), CandRecoHandle::SetDirCosV(), CandRecoHandle::SetDirCosZ(), CandFitTrackHandle::SetEMCharge(), CandFitTrackHandle::SetMomentumCurve(), CandFitTrackHandle::SetNDOF(), CandFitTrackHandle::SetNIterate(), CandFitTrackHandle::SetPass(), CandFitTrackHandle::SetVtxdUError(), CandFitTrackHandle::SetVtxdVError(), CandRecoHandle::SetVtxPlane(), CandFitTrackHandle::SetVtxQPError(), CandRecoHandle::SetVtxU(), CandFitTrackHandle::SetVtxUError(), CandRecoHandle::SetVtxV(), CandFitTrackHandle::SetVtxVError(), CandRecoHandle::SetVtxZ(), NtpFitSAVtx::u, NtpFitSAVtx::v, NtpFitSA::vtx, and NtpFitSAVtx::z.

Referenced by RunAlg().

00724                                                                  {
00725     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FillCandFitTrack\n";
00726 // Fill in fit results
00727     cftsah.SetMomentumCurve(fFitNtp->p);
00728     cftsah.SetEMCharge(fFitNtp->q);
00729     cftsah.SetChi2(fFitNtp->fit.chi2);
00730     cftsah.SetNDOF(fFitNtp->fit.ndf);
00731     cftsah.SetCPUTime(fFitNtp->fit.cpu);
00732     cftsah.SetNIterate(fFitNtp->fit.niter);
00733     if ( fFitNtp->fit.parerr[4][4] > 0 ) {
00734         cftsah.SetVtxQPError(pow(fFitNtp->fit.parerr[4][4],(Float_t)0.5));
00735     } else {
00736         cftsah.SetVtxQPError(-1.);
00737     }
00738     cftsah.SetVtxPlane(fFitNtp->vtx.plane);
00739     cftsah.SetVtxU(fFitNtp->vtx.u);
00740     cftsah.SetVtxUError(fFitNtp->vtx.eu);
00741     cftsah.SetVtxV(fFitNtp->vtx.v);
00742     cftsah.SetVtxVError(fFitNtp->vtx.ev);
00743     cftsah.SetVtxZ(fFitNtp->vtx.z);
00744     cftsah.SetDirCosU(fFitNtp->vtx.dcosu);
00745     cftsah.SetVtxdUError(pow(TMath::Max(TinyNumber, (double)fFitNtp->fit.parerr[1][1]),0.5));
00746     cftsah.SetDirCosV(fFitNtp->vtx.dcosv);
00747     cftsah.SetVtxdVError(pow(TMath::Max(TinyNumber, (double)fFitNtp->fit.parerr[3][3]),0.5));
00748     cftsah.SetDirCosZ(fFitNtp->vtx.dcosz);
00749     
00750     cftsah.SetPass(kTRUE);
00751     return;
00752 }    

void AlgFitTrackSA::FillClusterList CandTrackHandle trackHandle  )  [private]
 

Definition at line 771 of file AlgFitTrackSA.cxx.

References falgcfg, fClusterList, fIdir, CandRecoHandle::GetCharge(), Registry::GetDouble(), Registry::GetInt(), lessThanByPlane(), and MSG.

Referenced by PrepareFit().

00771                                                                  {
00772     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FillClusterList\n";
00773     // Copy all the strips from CandTrack and fill cluster list
00774     
00775     // (re)implement to set how you want your list to be sorted .
00776     list<CandStripHandle*> stripList = DataUtil::CDL2STLlist<CandStripHandle>(*pTrackHandle);
00777     stripList.sort(lessThanByPlane);
00778     
00779     if (fIdir<0) stripList.reverse();
00780     
00781     Int_t oldplane=-1;
00782     //TrackClusterSR* oldtrackcluster=0;
00783     
00784     list<CandStripHandle*>::iterator pStripHandleItr;
00785     // Fill TrackSRClusters
00786     for ( pStripHandleItr = stripList.begin(); pStripHandleItr != stripList.end(); ++pStripHandleItr) {
00787     
00788         MSG("FitTrackSA", Msg::kVerbose) << "Plane=" << (*pStripHandleItr)->GetPlane() 
00789             << "; Charge=" << (*pStripHandleItr)->GetCharge() 
00790             << "; Strip=" << (*pStripHandleItr)->GetStrip() << "\n";
00791         
00792         // cftsah.AddDaughterLink(*(const_cast<CandStripHandle*>(*pStripHandleItr)));
00793         // check if strip is not demux vetoed and charge is not too small
00794         if ( (*pStripHandleItr)->GetDemuxVetoFlag() ) continue;
00795         if ( (*pStripHandleItr)->GetCharge() < falgcfg.GetDouble("MinStripCharge") ) continue;
00796         
00797         // And add it to a track cluster
00798         if ( (*pStripHandleItr)->GetPlane() != oldplane ) {
00799             TrackClusterSR trackcluster(*pStripHandleItr,
00800                                         falgcfg.GetInt("MisalignmentError")*Munits::mm);
00801             fClusterList.push_back(trackcluster);
00802             oldplane = (*pStripHandleItr)->GetPlane();
00803             //oldtrackcluster = trackcluster;
00804         } else {
00805             fClusterList.rbegin()->AddStrip(*pStripHandleItr);
00806         }
00807     }
00808     
00809     for ( list<TrackClusterSR>::iterator tcit = fClusterList.begin(); tcit != fClusterList.end(); ++tcit) {
00810         // remove cluster if strips are not continuous
00811         if ( ( tcit->GetMaxStrip() - tcit->GetMinStrip() + 1) != tcit->GetNStrip() ) {
00812             MSG("FitTrackSA", Msg::kDebug) << "Removing plane " << tcit->GetPlane() 
00813                 << " cluster - strips are not continuous.\n"; 
00814             list<TrackClusterSR>::iterator it = fClusterList.erase(tcit);
00815             tcit = --it;
00816             continue;
00817         }
00818         // remove cluster if too many strips
00819         if ( tcit->GetNStrip() > falgcfg.GetInt("MaxStripsInCluster") ) {
00820             MSG("FitTrackSA", Msg::kDebug) << "Removing plane " << tcit->GetPlane() 
00821                 << " cluster - too many strips.\n"; 
00822             list<TrackClusterSR>::iterator it = fClusterList.erase(tcit);
00823             tcit = --it;
00824             continue;
00825         }
00826     }         
00827     // 
00828     return;
00829 }

void AlgFitTrackSA::FillDaughterList CandFitTrackSAHandle cftsah  )  [private]
 

Definition at line 832 of file AlgFitTrackSA.cxx.

References abs(), CandHandle::AddDaughterLink(), fBegPlane, fClusterList, fData, DataFT::GetNPlanesUsed(), MSG, DataFT::UseHitU(), and DataFT::UseHitV().

Referenced by RunAlg().

00832                                                                  {
00833     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FillDaughterList\n";
00834     //
00835     for ( list<TrackClusterSR>::iterator tcit = fClusterList.begin(); tcit != fClusterList.end(); ++tcit) {
00836         int iplane = tcit->GetPlane();
00837         
00838         if ( abs(iplane - fBegPlane) >= fData->GetNPlanesUsed() ) break;
00839         
00840         if ( fData->UseHitU(abs(iplane-fBegPlane)) || fData->UseHitV(abs(iplane-fBegPlane)) ) {
00841             const TObjArray* striplist = tcit->GetStripList();
00842             
00843             for ( int i = 0; i<striplist->GetEntries(); i++) {
00844                 CandStripHandle* cstriph = dynamic_cast<CandStripHandle*>(striplist->At(i));                
00845                 cftsah.AddDaughterLink(*cstriph);
00846             }
00847         }
00848     }
00849     
00850     return;
00851 }

void AlgFitTrackSA::FillDummyCandFitTrack CandFitTrackSAHandle cftsah  )  [private]
 

Definition at line 755 of file AlgFitTrackSA.cxx.

References MSG, and CandFitTrackHandle::SetPass().

Referenced by RunAlg().

00755                                                                       {
00756     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FillDummyCandFitTrack\n";
00757     // Fit Failed
00758     cftsah.SetPass(kFALSE);
00759     return;
00760 }    

void AlgFitTrackSA::FillDummyNtp  )  [private]
 

Definition at line 366 of file AlgFitTrackSA.cxx.

References fFitNtp, and MSG.

Referenced by RunAlg().

00366                                  {
00367     MSG("FitTrackSA",Msg::kVerbose) << "AlgFitTrackSA::FillDummyNtp\n";
00368     
00369     fFitNtp = new NtpFitSA();
00370 }

void AlgFitTrackSA::FillFromCandTrack CandFitTrackSAHandle cftsah,
CandTrackHandle trackHandle
[private]
 

Definition at line 674 of file AlgFitTrackSA.cxx.

References fIdir, CandRecoHandle::GetCandSlice(), CandRecoHandle::GetDirCosU(), CandRecoHandle::GetDirCosV(), CandRecoHandle::GetDirCosZ(), CandTrackHandle::GetdS(), CandRecoHandle::GetEndDirCosU(), CandRecoHandle::GetEndDirCosV(), CandRecoHandle::GetEndDirCosZ(), CandRecoHandle::GetEndPlane(), CandRecoHandle::GetEndT(), CandTrackHandle::GetEndTrace(), CandTrackHandle::GetEndTraceZ(), CandRecoHandle::GetEndU(), CandRecoHandle::GetEndV(), CandRecoHandle::GetEndZ(), CandTrackHandle::GetMomentum(), CandTrackHandle::GetRange(), CandRecoHandle::GetTimeOffset(), CandRecoHandle::GetTimeSlope(), CandTrackHandle::GetU(), CandTrackHandle::GetV(), CandRecoHandle::GetVtxPlane(), CandRecoHandle::GetVtxT(), CandTrackHandle::GetVtxTrace(), CandTrackHandle::GetVtxTraceZ(), CandRecoHandle::GetVtxU(), CandRecoHandle::GetVtxV(), CandRecoHandle::GetVtxZ(), CandTrackHandle::IsTPosValid(), MSG, CandRecoHandle::SetCandSlice(), CandRecoHandle::SetDirCosU(), CandRecoHandle::SetDirCosV(), CandRecoHandle::SetDirCosZ(), CandTrackHandle::SetdS(), CandRecoHandle::SetEndDirCosU(), CandRecoHandle::SetEndDirCosV(), CandRecoHandle::SetEndDirCosZ(), CandRecoHandle::SetEndPlane(), CandRecoHandle::SetEndT(), CandTrackHandle::SetEndTrace(), CandTrackHandle::SetEndTraceZ(), CandRecoHandle::SetEndU(), CandRecoHandle::SetEndV(), CandRecoHandle::SetEndZ(), CandFitTrackHandle::SetMomentumRange(), CandTrackHandle::SetRange(), CandRecoHandle::SetTimeOffset(), CandRecoHandle::SetTimeSlope(), CandTrackHandle::SetU(), CandTrackHandle::SetV(), CandRecoHandle::SetVtxPlane(), CandRecoHandle::SetVtxT(), CandTrackHandle::SetVtxTrace(), CandTrackHandle::SetVtxTraceZ(), CandRecoHandle::SetVtxU(), CandRecoHandle::SetVtxV(), and CandRecoHandle::SetVtxZ().

Referenced by PrepareFit().

00674                                                                                                  {
00675     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FillFromCandTrack\n";
00676 
00677     // Copy various track info from CandTrack
00678     cftsah.SetCandSlice(pTrackHandle->GetCandSlice());
00679     
00680     cftsah.SetDirCosU(pTrackHandle->GetDirCosU());
00681     cftsah.SetDirCosV(pTrackHandle->GetDirCosV());
00682     cftsah.SetDirCosZ(pTrackHandle->GetDirCosZ());
00683     cftsah.SetVtxU(pTrackHandle->GetVtxU());
00684     cftsah.SetVtxV(pTrackHandle->GetVtxV());
00685     cftsah.SetVtxZ(pTrackHandle->GetVtxZ());
00686     cftsah.SetVtxT(pTrackHandle->GetVtxT());
00687     cftsah.SetVtxPlane(pTrackHandle->GetVtxPlane());
00688     cftsah.SetVtxTrace(pTrackHandle->GetVtxTrace());
00689     cftsah.SetVtxTraceZ(pTrackHandle->GetVtxTraceZ());
00690     
00691     cftsah.SetEndDirCosU(pTrackHandle->GetEndDirCosU());
00692     cftsah.SetEndDirCosV(pTrackHandle->GetEndDirCosV());
00693     cftsah.SetEndDirCosZ(pTrackHandle->GetEndDirCosZ());
00694     cftsah.SetEndU(pTrackHandle->GetEndU());
00695     cftsah.SetEndV(pTrackHandle->GetEndV());
00696     cftsah.SetEndZ(pTrackHandle->GetEndZ());
00697     cftsah.SetEndT(pTrackHandle->GetEndT());
00698     cftsah.SetEndPlane(pTrackHandle->GetEndPlane());
00699     cftsah.SetEndTrace(pTrackHandle->GetEndTrace());
00700     cftsah.SetEndTraceZ(pTrackHandle->GetEndTraceZ());
00701     
00702     cftsah.SetTimeSlope(pTrackHandle->GetTimeSlope());
00703     cftsah.SetTimeOffset(pTrackHandle->GetTimeOffset());
00704     cftsah.SetMomentumRange(pTrackHandle->GetMomentum());
00705     //cftsah.SetScore(pTrackHandle->GetScore());
00706 
00707     //   cftsah.SetInitialQP(0.0);
00708 
00709     // set ds, range
00710     for (Int_t iplane = cftsah.GetVtxPlane(); iplane*fIdir<=cftsah.GetEndPlane()*fIdir; iplane+=fIdir) {
00711         if (pTrackHandle->IsTPosValid(iplane)) {
00712             // u and v coordinates have been calculated for this plane
00713             cftsah.SetU(iplane,pTrackHandle->GetU(iplane));
00714             cftsah.SetV(iplane,pTrackHandle->GetV(iplane));
00715             cftsah.SetdS(iplane,pTrackHandle->GetdS(iplane));
00716             cftsah.SetRange(iplane,pTrackHandle->GetRange(iplane));
00717         }
00718     }
00719 
00720     return;
00721 }

void AlgFitTrackSA::FillLinear  )  [private]
 

Definition at line 985 of file AlgFitTrackSA.cxx.

References falgcfg, fData, DataFT::FillLin(), Registry::GetInt(), and MSG.

Referenced by PrepareFit().

00986 {    
00987     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FillLinear\n";
00988     fData->FillLin(falgcfg.GetInt("NHitsLinear"), 
00989                 falgcfg.GetInt("NParamsLinear")); 
00990 }

void AlgFitTrackSA::FillNtp  )  [private]
 

Definition at line 230 of file AlgFitTrackSA.cxx.

References NtpFitSAPlane::begin, NtpFitSAFit::chi2, NtpFitSAFit::cpu, NtpFitSAVtx::dcosu, NtpFitSAVtx::dcosv, NtpFitSAVtx::dcosz, NtpFitSA::dp, NtpFitSA::dr, NtpFitSA::ds, NtpFitSA::dudz, NtpFitSA::dvdz, NtpFitSAVtx::edcosu, NtpFitSAVtx::edcosv, NtpFitSA::end, NtpFitSAPlane::end, NtpFitSA::ep, NtpFitSAVtx::eu, NtpFitSAVtx::ev, fBegPlane, fData, fEndPlane, fFitNtp, fFitState, fIdir, NtpFitSA::fit, NtpFitSA::fitplane, fLastGoodFit, DataFT::GetBegHit(), DataFT::GetBegHitUsed(), FitResult::GetChi2(), DataFT::GetDudz(), DataFT::GetDvdz(), DataFT::GetEMCharge(), DataFT::GetEndHit(), DataFT::GetEndHitUsed(), FitResult::GetFitErrM(), FitResult::GetNdof(), DataFT::GetNPlanesUsed(), DataFT::GetNUHits(), DataFT::GetNUHitsUsed(), DataFT::GetNVHits(), DataFT::GetNVHitsUsed(), DataFT::GetP(), DataFT::GetPlane(), DataFT::GetR(), DataFT::GetS(), FitResult::GetTrackOut(), DataFT::GetU(), DataFT::GetUf(), DataFT::GetV(), DataFT::GetVf(), DataFT::GetZ(), NtpFitSA::hitplane, NtpFitSA::index, NtpFitSA::iplane, MSG, NtpFitSAPlane::n, NtpFitSAFit::ndf, NtpFitSAFit::niter, FitState::niterations, NtpFitSA::nplanes, NtpFitSAPlane::nu, NtpFitSAPlane::nv, NtpFitSA::p, NtpFitSAFit::par, NtpFitSAFit::parerr, NtpFitSAVtx::plane, NtpFitSA::plane, NtpFitSA::q, NtpFitSA::r, NtpFitSA::rchi2, NtpFitSA::s, FitState::status, NtpFitSAFit::status, NtpFitSAVtx::u, NtpFitSA::u, NtpFitSAVtx::v, NtpFitSA::v, NtpFitSA::vtx, NtpFitSAVtx::z, NtpFitSA::z, and NtpFitSA::zdir.

Referenced by RunAlg().

00230                             {
00231     MSG("FitTrackSA",Msg::kVerbose) << "AlgFitTrackSA::FillNtp\n";
00232     
00233     // delete previous record, create new
00234     if ( fFitNtp ) delete fFitNtp;
00235     fFitNtp = new NtpFitSA(fData->GetNPlanesUsed());
00236 
00237     // Fill
00238     fFitNtp->index = 0;
00239     
00240     Int_t nplanes = fData->GetNPlanesUsed();
00241     fFitNtp->zdir = fIdir;
00242     fFitNtp->nplanes = nplanes;
00243 
00244     MSG("FitTrackSA",Msg::kVerbose) << "Filling Arrays..\n";
00245     if ( nplanes>0 ) {
00246         fFitNtp->s = fData->GetS(nplanes-1);
00247         fFitNtp->r = fData->GetR(nplanes-1);
00248 
00249         for (Int_t i = 0; i<nplanes; i++) {
00250             fFitNtp->iplane[i] = fData->GetPlane(i);
00251             fFitNtp->u[i] = fData->GetUf(i);
00252             fFitNtp->v[i] = fData->GetVf(i);
00253             fFitNtp->z[i] = fData->GetZ(i);
00254             fFitNtp->dudz[i] = fData->GetDudz(i);
00255             fFitNtp->dvdz[i] = fData->GetDvdz(i);
00256             fFitNtp->dp[i] = fData->GetP(i);
00257             fFitNtp->ds[i] = fData->GetS(i);
00258             fFitNtp->dr[i] = fData->GetR(i);
00259         }
00260     }
00261     
00262     MSG("FitTrackSA",Msg::kVerbose) << "Filling Plane..\n";
00263     fFitNtp->plane.begin    = fBegPlane;
00264     fFitNtp->plane.end      = fEndPlane;
00265     fFitNtp->plane.n        = TMath::Abs(fBegPlane-fEndPlane+1);
00266     fFitNtp->plane.nu       = 0;
00267     fFitNtp->plane.nv       = 0;
00268 
00269     MSG("FitTrackSA",Msg::kVerbose) << "Filling Hitplane..\n";
00270     fFitNtp->hitplane.begin = fData->GetBegHit();
00271     fFitNtp->hitplane.end   = fData->GetEndHit();
00272     fFitNtp->hitplane.n     = fData->GetNUHits() + fData->GetNVHits();
00273     fFitNtp->hitplane.nu    = fData->GetNUHits();
00274     fFitNtp->hitplane.nv    = fData->GetNVHits();
00275 
00276     MSG("FitTrackSA",Msg::kVerbose) << "Filling Fitplane..\n";
00277     fFitNtp->fitplane.begin = fData->GetBegHitUsed();
00278     fFitNtp->fitplane.end   = fData->GetEndHitUsed();
00279     fFitNtp->fitplane.n     = fData->GetNUHitsUsed() + fData->GetNVHitsUsed();
00280     fFitNtp->fitplane.nu    = fData->GetNUHitsUsed();
00281     fFitNtp->fitplane.nv    = fData->GetNVHitsUsed();
00282 
00283     Float_t dcosu, dcosv, dcosz;    
00284     
00285     MSG("FitTrackSA",Msg::kVerbose) << "Filling Vtx..\n";
00286     fFitNtp->vtx.plane    = fData->GetPlane(0);
00287     //ugh.uv2xy(fData->GetU(0), fData->GetV(0), x, y);    
00288     //dcosz = fIdir*pow(1.+pow(fData->GetDudz(0),2)+pow(fData->GetDvdz(0),2),-0.5);
00289     
00290     dcosz = fIdir*pow(1.+pow(fLastGoodFit->GetTrackOut(1),2)+pow(fLastGoodFit->GetTrackOut(3),2),-0.5);
00291     dcosu = fLastGoodFit->GetTrackOut(1)*dcosz; //fData->GetDudz(0)*dcosz;
00292     dcosv = fLastGoodFit->GetTrackOut(3)*dcosz; //fData->GetDvdz(0)*dcosz;
00293     //ugh.uv2xy(dcosu, dcosv, dcosx, dcosy);    
00294     fFitNtp->vtx.u        = fLastGoodFit->GetTrackOut(0); //fData->GetU(0);
00295     fFitNtp->vtx.eu       = pow(TMath::Max(TinyNumber, fLastGoodFit->GetFitErrM(0,0)), 0.5);    
00296     fFitNtp->vtx.v        = fLastGoodFit->GetTrackOut(2); //fData->GetV(0);
00297     fFitNtp->vtx.ev       = pow(TMath::Max(TinyNumber, fLastGoodFit->GetFitErrM(2,2)), 0.5);    
00298     fFitNtp->vtx.z        = fData->GetZ(0);        
00299     
00300     float edudz           = pow(TMath::Max(TinyNumber, fLastGoodFit->GetFitErrM(1,1)), 0.5);
00301     float edvdz           = pow(TMath::Max(TinyNumber, fLastGoodFit->GetFitErrM(3,3)), 0.5);
00302     
00303     fFitNtp->vtx.dcosu    = dcosu;
00304     fFitNtp->vtx.edcosu   = sqrt(fabs(dcosz))*sqrt(pow(dcosu*dcosv*edvdz,2) + pow((pow(dcosz,2)+pow(dcosv,2))*edudz,2));
00305     fFitNtp->vtx.dcosv    = dcosv;
00306     fFitNtp->vtx.edcosv   = sqrt(fabs(dcosz))*sqrt(pow(dcosu*dcosv*edudz,2) + pow((pow(dcosz,2)+pow(dcosu,2))*edvdz,2));
00307     fFitNtp->vtx.dcosz    = dcosz;
00308 
00309     Int_t nplanesused       = fData->GetNPlanesUsed();
00310     MSG("FitTrackSA",Msg::kVerbose) << "Filling End..\n";
00311     if ( nplanesused>0 ) {
00312         fFitNtp->end.plane    = fData->GetPlane(nplanesused-1);
00313         //ugh.uv2xy(fData->GetU(nplanesused-1), fData->GetV(nplanesused-1), x, y);
00314         dcosz=fIdir*pow(1.+pow(fData->GetDudz(nplanesused-1),2)+
00315                             pow(fData->GetDvdz(nplanesused-1),2),-0.5);
00316         dcosu = fData->GetDudz(nplanesused-1)*dcosz;
00317         dcosv = fData->GetDvdz(nplanesused-1)*dcosz;
00318         //ugh.uv2xy(dcosu, dcosv, dcosx, dcosy);
00319         fFitNtp->end.u        = fData->GetU(nplanesused-1);
00320         fFitNtp->end.v        = fData->GetV(nplanesused-1);
00321         fFitNtp->end.z        = fData->GetZ(nplanesused-1);
00322         fFitNtp->end.dcosu    = dcosu;
00323         fFitNtp->end.dcosv    = dcosv;
00324         fFitNtp->end.dcosz    = dcosz;
00325     }
00326     
00327     MSG("FitTrackSA",Msg::kVerbose) << "Filling Fit..\n";
00328     fFitNtp->fit.niter      = fFitState.niterations;
00329     fFitNtp->fit.status     = fFitState.status;
00330     
00331     fFitNtp->fit.ndf        = fLastGoodFit->GetNdof();
00332     fFitNtp->fit.chi2       = fLastGoodFit->GetChi2();
00333     fFitNtp->fit.cpu        = fCpu;
00334 
00335     MSG("FitTrackSA",Msg::kVerbose) << "Filling FitParams..\n";
00336     for ( int i = 0; i < NTrackParams; i++ ) {
00337         fFitNtp->fit.par[i] = fLastGoodFit->GetTrackOut(i);
00338         for ( int j = 0; j < NTrackParams; j++ ) {
00339             fFitNtp->fit.parerr[i][j] = fLastGoodFit->GetFitErrM(i,j);
00340         }
00341     }
00342 
00343     MSG("FitTrackSA",Msg::kVerbose) << "Filling P ..\n";
00344     fFitNtp->q              = (Int_t) fData->GetEMCharge();
00345     if ( TMath::Abs(fFitNtp->fit.par[4]) > TinyNumber ) {
00346         fFitNtp->p              = TMath::Abs(1./fFitNtp->fit.par[4]);
00347     } else {
00348         fFitNtp->p = 0.;
00349     }
00350     
00351     MSG("FitTrackSA",Msg::kVerbose) << "Filling sigma(P)..\n";
00352     if ( fFitNtp->fit.parerr[4][4] > 0 ) {
00353         fFitNtp->ep             = pow(fFitNtp->p,2)*pow(fFitNtp->fit.parerr[4][4],(Float_t)0.5);
00354     } else {
00355         fFitNtp->ep = -1.;
00356     }
00357     MSG("FitTrackSA",Msg::kVerbose) << "Filling chi2/ndf..\n";
00358     if ( TMath::Abs(fFitNtp->fit.ndf) > TinyNumber ) { 
00359         fFitNtp->rchi2 = fFitNtp->fit.chi2/fFitNtp->fit.ndf;
00360     } else {
00361         fFitNtp->rchi2 = 0.;
00362     }        
00363 }

void AlgFitTrackSA::FilterHits  )  [private]
 

Definition at line 973 of file AlgFitTrackSA.cxx.

References falgcfg, fData, DataFT::Filter(), Registry::GetDouble(), Registry::GetInt(), and MSG.

Referenced by PrepareFit().

00974 {
00975     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::FilterHits\n";
00976     
00977     //
00978     if ( falgcfg.GetInt("FilterHits") ) 
00979         fData->Filter(falgcfg.GetInt("NHitsFilter"), 
00980                       falgcfg.GetInt("NParamsFilter"), 
00981                       falgcfg.GetDouble("FilterChi2Cut"));
00982 }

void AlgFitTrackSA::Guesstimate TVectorD &  trackOut,
int  nplanes
[private]
 

Definition at line 874 of file AlgFitTrackSA.cxx.

References falgcfg, fData, fMatCalc, fPrange, MatrixCalculator::GetChi2(), Registry::GetDouble(), Registry::GetInt(), DataFT::GetNHitsUsed(), DataFT::GetNUHitsUsed(), DataFT::GetNVHitsUsed(), MatrixCalculator::GetTrackOut(), DataFT::LinearFitEstimate(), MSG, MSGSTREAM, DataFT::SetInitial(), MatrixCalculator::Solve(), and Swim().

Referenced by InitialEstimate().

00874                                                                {
00875     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::Guesstimate\n";
00876 
00877     MSG("FitTrackSA",Msg::kDebug) << "Estimating track parameters, using " << nplanes << " planes.\n";
00878     // Initial estimate od the track parameters:
00879     //   1. u, du/dz, v, dv/dz - from a linear fit - use up to NPlanesLinearFit planes
00880     //   2. set momentum to +P_range (mu+) - iterate once using up to NPlanesGuesstimate planes
00881     //   3. charge - set as sign of 1/p from 2.
00882 
00883     TVectorD trackIn(NTrackParams);
00884     //fData->LinearFitEstimate(falgcfg.GetInt("NInitP"), trackIn);
00885     fData->LinearFitEstimate(nplanes, trackIn);
00886     
00887     // Try fitting low momentum (~range) both charges and high momentum +mu
00888     const Int_t nTest = 3;
00889     Double_t invpTest[nTest];
00890     TString* nameTest[nTest];
00891     TVectorD* trackOutTest[nTest];
00892     Double_t chi2Test[nTest];
00893     Int_t nhitsTest[nTest];
00894 
00895     invpTest[0] = 1./fPrange;
00896     nameTest[0] = new TString("Low,  +1");
00897 
00898     invpTest[1] = -1./fPrange;
00899     nameTest[1] = new TString("Low,  -1");
00900 
00901     invpTest[2] = falgcfg.GetDouble("InvMomentum0");
00902     nameTest[2] = new TString("High, +1");
00903 
00904 //     invpTest[3] = -falgcfg.GetDouble("InvMomentum0");
00905 //     nameTest[3] = new TString("High, -1");
00906 
00907     Int_t iMin = 0;
00908     Double_t chi2Min = 1e9;
00909     // Do test fits
00910     for ( Int_t i=0; i<nTest; i++) {
00911         trackIn(4) = invpTest[i];
00912         fData->SetInitial(trackIn);
00913         Swim(nplanes);
00914         //fData->SetNPlanesUsed(fData->Swim(falgcfg));
00915 
00916         if (fData->GetNUHitsUsed() < falgcfg.GetInt("NHitsInViewMin") || 
00917             fData->GetNVHitsUsed() < falgcfg.GetInt("NHitsInViewMin") ) {
00918             MSG("FitTrackSA",Msg::kDebug) << "Can't fit " << nameTest[i]->Data() << "!!\n";
00919             chi2Test[i] = 9999.;
00920             nhitsTest[i] = 0;
00921             trackOutTest[i] = new TVectorD(NTrackParams);
00922         } else {
00923             fMatCalc.Solve(fData);
00924             chi2Test[i] = fMatCalc.GetChi2();
00925             nhitsTest[i] = fData->GetNHitsUsed();
00926             trackOutTest[i] = new TVectorD(fMatCalc.GetTrackOut());
00927             if ( chi2Test[i] < chi2Min) {
00928                 chi2Min = chi2Test[i];
00929                 iMin = i;
00930             }
00931         }
00932     }
00933 
00934     MsgStream *mftsa = &MSGSTREAM("FitTrackSA", Msg::kDebug);
00935     (*mftsa) << "Guesstimate results:\n";
00936 
00937     MsgFormat ffmtl("%9.4f");
00938     MsgFormat ifmt("%3d");
00939 
00940     for (Int_t i=0; i<nTest; i++) {
00941         (*mftsa) << nameTest[i]->Data() << ": chi2=" << ffmtl(chi2Test[i]) << ", nhits=" << ifmt(nhitsTest[i])
00942         << ", q/p=" << ffmtl((*trackOutTest[i])(4)) << "\n";
00943     }
00944     (*mftsa) << "Done\n";
00945 
00946     // Set momentum to the one with the lowest chi2
00947     if ( chi2Min > 9998. ) {
00948         // Couldn't do any fit
00949         MSG("FitTrackSA",Msg::kDebug) << "Guesstimate: couldn't do any fit!\n";
00950         trackIn(4) = 1./fPrange;
00951         trackOut = trackIn;
00952     } else {
00953         trackOut = *trackOutTest[iMin];
00954     }
00955 
00956     // if momentum guess is obviously too low - set to Prange
00957     if ( TMath::Abs(1./trackOut(4)) < (fPrange + .1) ) {
00958         MSG("FitTrackSA",Msg::kDebug) << "Guesstimate: setting P = Prange.\n";
00959         trackOut(4) = TMath::Sign(1.,trackOut(4))/(fPrange + .1);
00960         MSG("FitTrackSA",Msg::kDebug) << "trackOut(4) = " << trackOut(4) << "\n";
00961     }
00962     
00963     // Clean up
00964     for (Int_t i=0; i<nTest; i++) {
00965         delete nameTest[i];
00966         delete trackOutTest[i];
00967     }
00968 
00969     return;
00970 }

void AlgFitTrackSA::InitialEstimate  )  [private]
 

Definition at line 373 of file AlgFitTrackSA.cxx.

References falgcfg, fData, fTrackIn0, Registry::GetInt(), DataFT::GetNPlanes(), Guesstimate(), and DataFT::SetInitial().

Referenced by PrepareFit().

00374 {    
00375     int nplanesguess = TMath::Min(falgcfg.GetInt("NPlanesGuesstimate"), fData->GetNPlanes());
00376     Guesstimate(fTrackIn0, nplanesguess);    
00377 
00378     fData->SetInitial(fTrackIn0);
00379 }

void AlgFitTrackSA::InitIterations  )  [private]
 

void AlgFitTrackSA::InitNextIteration  )  [private]
 

void AlgFitTrackSA::InitNextSuperIteration  )  [private]
 

void AlgFitTrackSA::InitSuperIterations  )  [private]
 

int AlgFitTrackSA::NPlanesNext int  nplanesconv,
int  nplanesdiv
[private]
 

Definition at line 1012 of file AlgFitTrackSA.cxx.

References falgcfg, Registry::GetInt(), and MSG.

Referenced by DoNextSuperIteration().

01013 {
01014     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::NPlanesNext\n";
01015     
01016     if ( falgcfg.GetInt("ConvergenceSearch") == 0 ) {
01017         // "linear" search
01018         return nplanesdiv-1;
01019     } else if ( falgcfg.GetInt("ConvergenceSearch") == 1 ) {
01020         // "binary" search
01021         return (nplanesconv + nplanesdiv)/2;
01022     } else if ( falgcfg.GetInt("ConvergenceSearch") == 2 ) {
01023         // "optimized"
01024         int istep = falgcfg.GetInt("SearchStep");
01025         if ( (nplanesdiv - nplanesconv) > 2*istep ) {
01026             return nplanesdiv-istep;
01027         } else {
01028             return (nplanesconv + nplanesdiv)/2;
01029         }
01030     } else if ( falgcfg.GetInt("ConvergenceSearch") == 3 ) {
01031         // "optimized" binary search with length cutoff for linear search
01032         int istep = falgcfg.GetInt("SearchStep");
01033         int ilong = falgcfg.GetInt("BinaryLength");
01034         if ( nplanesdiv >= ilong ) {
01035             return (nplanesconv + nplanesdiv)/2;
01036         } else if ( (nplanesdiv - nplanesconv) < ilong && (nplanesdiv - nplanesconv) > 2*istep ) {
01037             return nplanesdiv-istep;
01038         } else {
01039             return (nplanesconv + nplanesdiv)/2;
01040         }
01041     } 
01042     return nplanesdiv-1;
01043 }

void AlgFitTrackSA::PrepareFit CandFitTrackSAHandle cftsah,
CandTrackHandle candtrackhandle
[private]
 

Definition at line 162 of file AlgFitTrackSA.cxx.

References falgcfg, fBegPlane, fBField, fClusterList, fData, fEndPlane, fIdir, DataFT::Fill(), FillClusterList(), FillFromCandTrack(), FillLinear(), FilterHits(), fPrange, CandRecoHandle::GetBegPlane(), CandRecoHandle::GetEndPlane(), Registry::GetInt(), CandTrackHandle::GetMomentum(), CandHandle::GetVldContext(), InitialEstimate(), and MSG.

Referenced by RunAlg().

00163 {
00164     // First and last planes in the track
00165     fBegPlane = candtrackhandle->GetBegPlane();
00166     fEndPlane = candtrackhandle->GetEndPlane();
00167 
00168     fPrange = candtrackhandle->GetMomentum();
00169     MSG("FitTrackSA",Msg::kDebug) << "P(range) = " << fPrange << "\n";
00170     if ( fPrange > MaxPrange ) {
00171         // something's wrong with Prange
00172         fPrange = MaxPrange;
00173     }
00174 
00175     if (fEndPlane>fBegPlane) {
00176         fIdir = 1;
00177     } else {
00178         fIdir = -1;
00179     }
00180     
00181     //
00182     FillFromCandTrack(cftsah, candtrackhandle);
00183     FillClusterList(candtrackhandle);
00184 
00185     // Make DataFT object
00186     const VldContext *vldcptr = candtrackhandle->GetVldContext();
00187     assert(vldcptr);
00188     VldContext vldc = *vldcptr;
00189     
00190     // BField 
00191     if ( falgcfg.GetInt("BFieldOff") ) {
00192         fBField = new BFieldFT(TinyNumber);
00193         fData = new DataFT(fBegPlane, fEndPlane, vldc, fBField);
00194     } else {
00195         fData = new DataFT(fBegPlane, fEndPlane, vldc);
00196     }        
00197 /*    else {
00198         switch (vldc.GetDetector()) {
00199         case DetectorType::kFar:
00200             fBField  = new BField(vldc,-1,120);
00201             break;
00202         case DetectorType::kNear:
00203             fBField = new BField(vldc,-1,-142);
00204             break;
00205         case DetectorType::kCalDet:
00206             fBField = new BField(vldc,0,0);
00207             break;
00208         default:
00209             MSG("FitTrackSA",Msg::kError)
00210             << "BField does not support the "
00211             << DetectorType::AsString(vldc.GetDetector())
00212             << " detector " << endl;
00213             assert(0);
00214         }
00215     }*/
00216     
00217     //fData = new DataFT(fBegPlane, fEndPlane, vldc, fBField);
00218     
00219     // Fill dataft object
00220     fData->Fill(fClusterList);
00221     
00222     FilterHits();
00223     FillLinear();
00224     
00225     InitialEstimate();                
00226 }

void AlgFitTrackSA::RunAlg AlgConfig ac,
CandHandle ch,
CandContext cx
[virtual]
 

Implements AlgBase.

Definition at line 87 of file AlgFitTrackSA.cxx.

References CandFitTrackSAHandle::AddNtpFitSA(), CleanupFit(), CloneDaughterList(), DoFit(), falgcfg, fCpu, fFitNtp, fFitState, FillCandFitTrack(), FillDaughterList(), FillDummyCandFitTrack(), FillDummyNtp(), FillNtp(), CandContext::GetDataIn(), MSG, PrepareFit(), FitState::status, and timer().

00087                                                                         {
00088     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::RunAlg\n";
00089 
00090     assert(cx.GetDataIn());
00091 
00092     falgcfg = ac;
00093     
00094     if (!(cx.GetDataIn()->InheritsFrom("TObjArray"))) {
00095         return;
00096     }
00097 
00098     CandFitTrackSAHandle& cftsah = (CandFitTrackSAHandle&) ch;
00099 
00100     // Start timer 
00101     TStopwatch timer;
00102     timer.Start();
00103     
00104     // Find CandTrack object in the input list
00105     CandTrackHandle *track0 = 0;
00106     const TObjArray* cxin = dynamic_cast<const TObjArray*>(cx.GetDataIn());
00107     for (Int_t i=0; i<=cxin->GetLast(); i++) {
00108         TObject *tobj = cxin->At(i);
00109         //tobj->Dump();
00110         if ( tobj ) {
00111             if (tobj->InheritsFrom("CandTrackHandle")) {
00112                 track0 = dynamic_cast<CandTrackHandle*>(tobj);
00113             }
00114         }
00115     }
00116 
00117     // Bail out if no tracks
00118     if (!track0) {
00119         return;
00120     }
00121 
00122     PrepareFit(cftsah, track0);
00123             
00124     // Fit
00125     fFitState = DoFit();
00126             
00127     // Stop Timer
00128     timer.Stop();
00129     fCpu = timer.CpuTime();
00130             
00131     if ( fFitState.status == kFitSuccess ) {
00132         FillNtp();
00133         FillDaughterList(cftsah);
00134         FillCandFitTrack(cftsah);
00135     } else {
00136         FillDummyNtp();
00137         CloneDaughterList(cftsah);
00138         FillDummyCandFitTrack(cftsah);
00139     }
00140              
00141     // Fill fit results
00142     cftsah.AddNtpFitSA(*fFitNtp);
00143         
00144     // Clean up
00145     CleanupFit();
00146     
00147     return;
00148 }

int AlgFitTrackSA::Swim  )  [private]
 

Definition at line 1005 of file AlgFitTrackSA.cxx.

References fData, DataFT::GetNPlanes(), and MSG.

Referenced by DoNextIteration(), DoNextSuperIteration(), and Guesstimate().

01006 {    
01007     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::Swim\n";
01008     return Swim(fData->GetNPlanes());
01009 }

int AlgFitTrackSA::Swim int  nplanes  )  [private]
 

Definition at line 993 of file AlgFitTrackSA.cxx.

References falgcfg, fData, Registry::GetInt(), MSG, DataFT::SwimAsData(), and DataFT::SwimAsSwimmer().

00994 {
00995     MSG("FitTrackSA", Msg::kVerbose) << "AlgFitTrackSA::Swim(int)\n";
00996     
00997     if ( falgcfg.GetInt("SwimAsData") == 1 ) {
00998         return fData->SwimAsData(nplanes);
00999     } else {
01000         return fData->SwimAsSwimmer(nplanes);
01001     }
01002 }


Member Data Documentation

AlgConfig AlgFitTrackSA::falgcfg [private]
 

Definition at line 89 of file AlgFitTrackSA.h.

Referenced by CanFit(), DoNextIteration(), DoNextSuperIteration(), DoSuperIterations(), FillClusterList(), FillLinear(), FilterHits(), Guesstimate(), InitialEstimate(), NPlanesNext(), PrepareFit(), RunAlg(), and Swim().

Int_t AlgFitTrackSA::fBegPlane [private]
 

Definition at line 91 of file AlgFitTrackSA.h.

Referenced by CloneDaughterList(), FillDaughterList(), FillNtp(), and PrepareFit().

BField* AlgFitTrackSA::fBField [private]
 

Definition at line 96 of file AlgFitTrackSA.h.

Referenced by CleanupFit(), and PrepareFit().

list<TrackClusterSR> AlgFitTrackSA::fClusterList [private]
 

Definition at line 95 of file AlgFitTrackSA.h.

Referenced by CleanupFit(), CloneDaughterList(), FillClusterList(), FillDaughterList(), and PrepareFit().

Double_t AlgFitTrackSA::fCpu [private]
 

Definition at line 102 of file AlgFitTrackSA.h.

Referenced by RunAlg().

DataFT* AlgFitTrackSA::fData [private]
 

Definition at line 97 of file AlgFitTrackSA.h.

Referenced by CanFit(), CleanupFit(), CloneDaughterList(), DoIterations(), DoNextIteration(), DoNextSuperIteration(), DoSuperIterations(), FillDaughterList(), FillLinear(), FillNtp(), FilterHits(), Guesstimate(), InitialEstimate(), PrepareFit(), and Swim().

Int_t AlgFitTrackSA::fEndPlane [private]
 

Definition at line 92 of file AlgFitTrackSA.h.

Referenced by FillNtp(), and PrepareFit().

NtpFitSA* AlgFitTrackSA::fFitNtp [private]
 

Definition at line 108 of file AlgFitTrackSA.h.

Referenced by CleanupFit(), FillCandFitTrack(), FillDummyNtp(), FillNtp(), and RunAlg().

FitState AlgFitTrackSA::fFitState [private]
 

Definition at line 101 of file AlgFitTrackSA.h.

Referenced by FillNtp(), and RunAlg().

Int_t AlgFitTrackSA::fIdir [private]
 

Definition at line 93 of file AlgFitTrackSA.h.

Referenced by FillClusterList(), FillFromCandTrack(), FillNtp(), and PrepareFit().

vector<IterationState> AlgFitTrackSA::fIterationStateList [private]
 

Definition at line 105 of file AlgFitTrackSA.h.

Referenced by ContinueIterations(), DoIterations(), and DoNextIteration().

FitResult* AlgFitTrackSA::fLastGoodFit [private]
 

Definition at line 107 of file AlgFitTrackSA.h.

Referenced by CleanupFit(), DoNextSuperIteration(), and FillNtp().

MatrixCalculator AlgFitTrackSA::fMatCalc [private]
 

Definition at line 110 of file AlgFitTrackSA.h.

Referenced by DoNextIteration(), DoNextSuperIteration(), and Guesstimate().

Double_t AlgFitTrackSA::fPrange [private]
 

Definition at line 94 of file AlgFitTrackSA.h.

Referenced by Guesstimate(), and PrepareFit().

vector<SuperIterationState> AlgFitTrackSA::fSuperIterationStateList [private]
 

Definition at line 104 of file AlgFitTrackSA.h.

Referenced by ContinueSuperIterations(), DoFit(), DoNextSuperIteration(), and DoSuperIterations().

TVectorD AlgFitTrackSA::fTrackIn0 [private]
 

Definition at line 99 of file AlgFitTrackSA.h.

Referenced by DoIterations(), DoNextSuperIteration(), and InitialEstimate().


The documentation for this class was generated from the following files:
Generated on Thu Nov 1 15:55:25 2007 for loon by  doxygen 1.3.9.1