diff --git a/src/THcHallCSpectrometer.cxx b/src/THcHallCSpectrometer.cxx
index 110e438d250f3ac6e7d2842a41e059a4f6530913..7ec7c3c017881253a7d82ae8c2b769a909d1992c 100644
--- a/src/THcHallCSpectrometer.cxx
+++ b/src/THcHallCSpectrometer.cxx
@@ -234,10 +234,15 @@ Int_t THcHallCSpectrometer::ReadDatabase( const TDatime& date )
     {"prune_fptime",          &fPruneFpTime,             kDouble,         0,  1},
     {0}
   };
-  gHcParms->LoadParmValues((DBRequest*)&list,prefix);
-  //
 
+  // Default values
+  fSelUsingScin = 0;
+  fSelUsingPrune = 0;
 
+  gHcParms->LoadParmValues((DBRequest*)&list,prefix);
+
+  EnforcePruneLimits();
+  
   cout <<  "\n\n\nhodo planes = " << fNPlanes << endl;
   cout <<  "sel using scin = "    << fSelUsingScin << endl;
   cout <<  "fPruneXp = "          <<  fPruneXp << endl; 
@@ -317,6 +322,22 @@ Int_t THcHallCSpectrometer::ReadDatabase( const TDatime& date )
   return kOK;
 }
 
+//_____________________________________________________________________________
+void THcHallCSpectrometer::EnforcePruneLimits()
+{
+  // Enforce minimum values for the prune cuts
+  
+  fPruneXp      = TMath::Max( 0.08, fPruneXp); 
+  fPruneYp      = TMath::Max( 0.04, fPruneYp); 
+  fPruneYtar    = TMath::Max( 4.0,  fPruneYtar); 
+  fPruneDelta   = TMath::Max( 13.0, fPruneDelta); 
+  fPruneBeta    = TMath::Max( 0.1,  fPruneBeta); 
+  fPruneDf      = TMath::Max( 1.0,  fPruneDf); 
+  fPruneChiBeta = TMath::Max( 2.0,  fPruneChiBeta); 
+  fPruneFpTime  = TMath::Max( 5.0,  fPruneFpTime); 
+  fPruneNPMT    = TMath::Max( 6.0,  fPruneNPMT);
+}
+
 //_____________________________________________________________________________
 Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks )
 {
@@ -420,434 +441,424 @@ Int_t THcHallCSpectrometer::FindVertices( TClonesArray& tracks )
 Int_t THcHallCSpectrometer::TrackCalc()
 {
 
+  if ( ( fSelUsingScin == 0 ) && ( fSelUsingPrune == 0 ) ) {
+    BestTrackSimple();
+  } else if (fSelUsingPrune !=0) {
+    BestTrackUsingPrune();
+  } else {
+    BestTrackUsingScin();
+  }
 
+  return TrackTimes( fTracks );
+}
 
-  if ( ( fSelUsingScin == 0 ) && ( fSelUsingPrune == 0 ) ) {
-    
-    if( GetTrSorting() )
-      fTracks->Sort();
-    
-    // Find the "Golden Track". 
-    //  if( GetNTracks() > 0 ) {
-    if( fNtracks > 0 ) {
-      // Select first track in the array. If there is more than one track
-      // and track sorting is enabled, then this is the best fit track
-      // (smallest chi2/ndof).  Otherwise, it is the track with the best
-      // geometrical match (smallest residuals) between the U/V clusters
-      // in the upper and lower VDCs (old behavior).
-      // 
-      // Chi2/dof is a well-defined quantity, and the track selected in this
-      // way is immediately physically meaningful. The geometrical match
-      // criterion is mathematically less well defined and not usually used
-      // in track reconstruction. Hence, chi2 sortiing is preferable, albeit
-      // obviously slower.
+//_____________________________________________________________________________
+Int_t THcHallCSpectrometer::BestTrackSimple()
+{
+  
+  if( GetTrSorting() )
+    fTracks->Sort();
+  
+  // Find the "Golden Track". 
+  //  if( GetNTracks() > 0 ) {
+  if( fNtracks > 0 ) {
+    // Select first track in the array. If there is more than one track
+    // and track sorting is enabled, then this is the best fit track
+    // (smallest chi2/ndof).  Otherwise, it is the track with the best
+    // geometrical match (smallest residuals) between the U/V clusters
+    // in the upper and lower VDCs (old behavior).
+    // 
+    // Chi2/dof is a well-defined quantity, and the track selected in this
+    // way is immediately physically meaningful. The geometrical match
+    // criterion is mathematically less well defined and not usually used
+    // in track reconstruction. Hence, chi2 sortiing is preferable, albeit
+    // obviously slower.
       
-      fGoldenTrack = static_cast<THaTrack*>( fTracks->At(0) );
-      fTrkIfo      = *fGoldenTrack;
-      fTrk         = fGoldenTrack;
-    } else
-      fGoldenTrack = NULL;
-  }
+    fGoldenTrack = static_cast<THaTrack*>( fTracks->At(0) );
+    fTrkIfo      = *fGoldenTrack;
+    fTrk         = fGoldenTrack;
+  } else
+    fGoldenTrack = NULL;
+
+  return(0);
+}
 
+//_____________________________________________________________________________
+Int_t THcHallCSpectrometer::BestTrackUsingScin()
+{
   Double_t chi2Min;
-  if ( fSelUsingScin == 1 ){
-    if( fNtracks > 0 ) {
-      fGoodTrack = -1;
-      chi2Min = 10000000000.0;
-      Int_t y2Dmin = 100;
-      Int_t x2Dmin = 100;
 
-      Bool_t* x2Hits        = new Bool_t [fHodo->GetNPaddles(2)];
-      Bool_t* y2Hits        = new Bool_t [fHodo->GetNPaddles(3)];
-      for (UInt_t j = 0; j < fHodo->GetNPaddles(2); j++ ){ 
-	x2Hits[j] = kFALSE;
-      }
-      for (UInt_t j = 0; j < fHodo->GetNPaddles(3); j++ ){ 
-	y2Hits[j] = kFALSE;
-      }
+  if( fNtracks > 0 ) {
+    fGoodTrack = -1;
+    chi2Min = 10000000000.0;
+    Int_t y2Dmin = 100;
+    Int_t x2Dmin = 100;
+
+    Bool_t* x2Hits        = new Bool_t [fHodo->GetNPaddles(2)];
+    Bool_t* y2Hits        = new Bool_t [fHodo->GetNPaddles(3)];
+    for (UInt_t j = 0; j < fHodo->GetNPaddles(2); j++ ){ 
+      x2Hits[j] = kFALSE;
+    }
+    for (UInt_t j = 0; j < fHodo->GetNPaddles(3); j++ ){ 
+      y2Hits[j] = kFALSE;
+    }
       
-      for (Int_t rawindex=0; rawindex<fHodo->GetTotHits(); rawindex++) {
-	Int_t ip = fHodo->GetGoodRawPlane(rawindex);
-	if(ip==2) {	// X2
-	  Int_t goodRawPad = fHodo->GetGoodRawPad(rawindex);
-	  x2Hits[goodRawPad] = kTRUE;
-	} else if (ip==3) { // Y2
-	  Int_t goodRawPad = fHodo->GetGoodRawPad(rawindex);
-	  y2Hits[goodRawPad] = kTRUE;
-	}
+    for (Int_t rawindex=0; rawindex<fHodo->GetTotHits(); rawindex++) {
+      Int_t ip = fHodo->GetGoodRawPlane(rawindex);
+      if(ip==2) {	// X2
+	Int_t goodRawPad = fHodo->GetGoodRawPad(rawindex);
+	x2Hits[goodRawPad] = kTRUE;
+      } else if (ip==3) { // Y2
+	Int_t goodRawPad = fHodo->GetGoodRawPad(rawindex);
+	y2Hits[goodRawPad] = kTRUE;
       }
+    }
 
-      for (Int_t itrack = 0; itrack < fNtracks; itrack++ ){
-	Double_t chi2PerDeg;
-	
-	THaTrack* aTrack = static_cast<THaTrack*>( fTracks->At(itrack) );      
-        if (!aTrack) return -1;	
+    for (Int_t itrack = 0; itrack < fNtracks; itrack++ ){
+      Double_t chi2PerDeg;
 
-	if ( aTrack->GetNDoF() > fSelNDegreesMin ){
-	  chi2PerDeg =  aTrack->GetChi2() / aTrack->GetNDoF();
+      THaTrack* aTrack = static_cast<THaTrack*>( fTracks->At(itrack) );      
+      if (!aTrack) return -1;	
+
+      if ( aTrack->GetNDoF() > fSelNDegreesMin ){
+	chi2PerDeg =  aTrack->GetChi2() / aTrack->GetNDoF();
 
-	  if( ( aTrack->GetDedx()    > fSeldEdX1Min )   && 
-	      ( aTrack->GetDedx()    < fSeldEdX1Max )   && 
-	      ( aTrack->GetBeta()    > fSelBetaMin  )   &&
-	      ( aTrack->GetBeta()    < fSelBetaMax  )   &&
-	      ( aTrack->GetEnergy()  > fSelEtMin    )   && 
-	      ( aTrack->GetEnergy()  < fSelEtMax    ) )  	    	    
-	    {
-	      Int_t x2D, y2D;
+	if( ( aTrack->GetDedx()    > fSeldEdX1Min )   && 
+	    ( aTrack->GetDedx()    < fSeldEdX1Max )   && 
+	    ( aTrack->GetBeta()    > fSelBetaMin  )   &&
+	    ( aTrack->GetBeta()    < fSelBetaMax  )   &&
+	    ( aTrack->GetEnergy()  > fSelEtMin    )   && 
+	    ( aTrack->GetEnergy()  < fSelEtMax    ) )  	    	    
+	  {
+	    Int_t x2D, y2D;
 	      	      
-	      if ( fNtracks > 1 ){
-		Double_t hitpos3  = aTrack->GetX() + aTrack->GetTheta() * ( fScin2XZpos + 0.5 * fScin2XdZpos );
-		Int_t icounter3  = TMath::Nint( ( hitpos3 - fHodo->GetPlaneCenter(2) ) / fHodo->GetPlaneSpacing(2) ) + 1;
-		Int_t hitCnt3  = TMath::Max( TMath::Min(icounter3, (Int_t) fHodo->GetNPaddles(2) ) , 1); // scin_2x_nr = 16
-		//	      fHitDist3 = fHitPos3 - ( fHodo->GetPlaneSpacing(2) * ( hitCnt3 - 1 ) + fHodo->GetPlaneCenter(2) );
-		Double_t hitpos4 = aTrack->GetY() + aTrack->GetPhi() * ( fScin2YZpos + 0.5 * fScin2YdZpos );
-		Int_t icounter4  = TMath::Nint( ( fHodo->GetPlaneCenter(3) - hitpos4 ) / fHodo->GetPlaneSpacing(3) ) + 1;
-		Int_t hitCnt4  = TMath::Max( TMath::Min(icounter4, (Int_t) fHodo->GetNPaddles(3) ) , 1); // scin_2y_nr = 10
-		//	      fHitDist4 = fHitPos4 - ( fHodo->GetPlaneCenter(3) - fHodo->GetPlaneSpacing(3) * ( hitCnt4 - 1 ) );
-		// Plane 3
-		Int_t mindiff=1000;
-		for (UInt_t i = 0; i <  fHodo->GetNPaddles(2); i++ ){
-		  if ( x2Hits[i] ) {
-		    Int_t diff = TMath::Abs((Int_t)hitCnt3-(Int_t)i-1);
-		    if (diff < mindiff) mindiff = diff;
-		  }
-		}
-		if(mindiff < 1000) {
-		  x2D = mindiff;
-		} else {
-		  x2D = 0;	// Is this what we really want if there were no hits on this plane?
+	    if ( fNtracks > 1 ){
+	      Double_t hitpos3  = aTrack->GetX() + aTrack->GetTheta() * ( fScin2XZpos + 0.5 * fScin2XdZpos );
+	      Int_t icounter3  = TMath::Nint( ( hitpos3 - fHodo->GetPlaneCenter(2) ) / fHodo->GetPlaneSpacing(2) ) + 1;
+	      Int_t hitCnt3  = TMath::Max( TMath::Min(icounter3, (Int_t) fHodo->GetNPaddles(2) ) , 1); // scin_2x_nr = 16
+	      //	      fHitDist3 = fHitPos3 - ( fHodo->GetPlaneSpacing(2) * ( hitCnt3 - 1 ) + fHodo->GetPlaneCenter(2) );
+	      Double_t hitpos4 = aTrack->GetY() + aTrack->GetPhi() * ( fScin2YZpos + 0.5 * fScin2YdZpos );
+	      Int_t icounter4  = TMath::Nint( ( fHodo->GetPlaneCenter(3) - hitpos4 ) / fHodo->GetPlaneSpacing(3) ) + 1;
+	      Int_t hitCnt4  = TMath::Max( TMath::Min(icounter4, (Int_t) fHodo->GetNPaddles(3) ) , 1); // scin_2y_nr = 10
+	      //	      fHitDist4 = fHitPos4 - ( fHodo->GetPlaneCenter(3) - fHodo->GetPlaneSpacing(3) * ( hitCnt4 - 1 ) );
+	      // Plane 3
+	      Int_t mindiff=1000;
+	      for (UInt_t i = 0; i <  fHodo->GetNPaddles(2); i++ ){
+		if ( x2Hits[i] ) {
+		  Int_t diff = TMath::Abs((Int_t)hitCnt3-(Int_t)i-1);
+		  if (diff < mindiff) mindiff = diff;
 		}
+	      }
+	      if(mindiff < 1000) {
+		x2D = mindiff;
+	      } else {
+		x2D = 0;	// Is this what we really want if there were no hits on this plane?
+	      }
 
-		// Plane 4
-		mindiff = 1000;
-		for (UInt_t i = 0; i < fHodo->GetNPaddles(3); i++ ){
-		  if ( y2Hits[i] ) {		    
-		    Int_t diff = TMath::Abs((Int_t)hitCnt4-(Int_t)i-1);
-		    if (diff < mindiff) mindiff = diff;
-		  }
-		}
-		if(mindiff < 1000) {
-		  y2D = mindiff;
-		} else {
-		  y2D = 0;	// Is this what we really want if there were no hits on this plane?
+	      // Plane 4
+	      mindiff = 1000;
+	      for (UInt_t i = 0; i < fHodo->GetNPaddles(3); i++ ){
+		if ( y2Hits[i] ) {		    
+		  Int_t diff = TMath::Abs((Int_t)hitCnt4-(Int_t)i-1);
+		  if (diff < mindiff) mindiff = diff;
 		}
-	      } else { // Only a single track
-		x2D = 0.;
-		y2D = 0.;
 	      }
+	      if(mindiff < 1000) {
+		y2D = mindiff;
+	      } else {
+		y2D = 0;	// Is this what we really want if there were no hits on this plane?
+	      }
+	    } else { // Only a single track
+	      x2D = 0.;
+	      y2D = 0.;
+	    }
 
-	      if ( y2D <= y2Dmin ) {
-		if ( y2D < y2Dmin ) {
-		  x2Dmin = 100;
-		  chi2Min = 10000000000.;
-		} // y2D min
-		
-		if ( x2D <= x2Dmin ){
-		  if ( x2D < x2Dmin ){
-		    chi2Min = 10000000000.0;
-		  } // condition x2D
-		  if ( chi2PerDeg < chi2Min ){
-
-		    fGoodTrack = itrack; // fGoodTrack = itrack
-		    y2Dmin = y2D;
-		    x2Dmin = x2D;
-		    chi2Min = chi2PerDeg;
-
-		    fGoldenTrack = static_cast<THaTrack*>( fTracks->At( fGoodTrack ) );
-		    fTrkIfo      = *fGoldenTrack;
-		    fTrk         = fGoldenTrack;
-		  }		  
+	    if ( y2D <= y2Dmin ) {
+	      if ( y2D < y2Dmin ) {
+		x2Dmin = 100;
+		chi2Min = 10000000000.;
+	      } // y2D min
+
+	      if ( x2D <= x2Dmin ){
+		if ( x2D < x2Dmin ){
+		  chi2Min = 10000000000.0;
 		} // condition x2D
-	      } // condition y2D
-	    } // conditions for dedx, beta and trac energy		  
-	} // confition for fNFreeFP greater than fSelNDegreesMin
-      } // loop over tracks      
-
-      // Fall back to using track with minimum chi2
-      if ( fGoodTrack == -1 ){
-	
-	chi2Min = 10000000000.0;
-	for (Int_t iitrack = 0; iitrack < fNtracks; iitrack++ ){
-	  Double_t chi2PerDeg;
-	  THaTrack* aTrack = dynamic_cast<THaTrack*>( fTracks->At(iitrack) );
-	  if (!aTrack) return -1;
+		if ( chi2PerDeg < chi2Min ){
+
+		  fGoodTrack = itrack; // fGoodTrack = itrack
+		  y2Dmin = y2D;
+		  x2Dmin = x2D;
+		  chi2Min = chi2PerDeg;
+
+		  fGoldenTrack = static_cast<THaTrack*>( fTracks->At( fGoodTrack ) );
+		  fTrkIfo      = *fGoldenTrack;
+		  fTrk         = fGoldenTrack;
+		}		  
+	      } // condition x2D
+	    } // condition y2D
+	  } // conditions for dedx, beta and trac energy		  
+      } // confition for fNFreeFP greater than fSelNDegreesMin
+    } // loop over tracks      
+
+    // Fall back to using track with minimum chi2
+    if ( fGoodTrack == -1 ){
+      
+      chi2Min = 10000000000.0;
+      for (Int_t iitrack = 0; iitrack < fNtracks; iitrack++ ){
+	Double_t chi2PerDeg;
+	THaTrack* aTrack = dynamic_cast<THaTrack*>( fTracks->At(iitrack) );
+	if (!aTrack) return -1;
 	  
-	  if ( aTrack->GetNDoF() > fSelNDegreesMin ){
-	    chi2PerDeg =  aTrack->GetChi2() / aTrack->GetNDoF();
-	    
-	    if ( chi2PerDeg < chi2Min ){
-	      
-	      fGoodTrack = iitrack;
-	      chi2Min = chi2PerDeg;
+	if ( aTrack->GetNDoF() > fSelNDegreesMin ){
+	  chi2PerDeg =  aTrack->GetChi2() / aTrack->GetNDoF();
+
+	  if ( chi2PerDeg < chi2Min ){
 	      
-	      fGoldenTrack = aTrack;
-	      fTrkIfo      = *fGoldenTrack;
-	      fTrk         = fGoldenTrack;
+	    fGoodTrack = iitrack;
+	    chi2Min = chi2PerDeg;
+
+	    fGoldenTrack = aTrack;
+	    fTrkIfo      = *fGoldenTrack;
+	    fTrk         = fGoldenTrack;
 
-	    }
 	  }
-	} // loop over trakcs
-	
-      } 
+	}
+      } // loop over trakcs
 
-    } else // Condition for fNtrack > 0
-      fGoldenTrack = NULL;
-    
-  } //  condtion fSelUsingScin == 1 
+    } 
 
-  //-------------------------------------------------------------------------------------
-  //-------------------------------------------------------------------------------------
-  //-------------------------------------------------------------------------------------
-  //-------------------------------------------------------------------------------------
+  } else // Condition for fNtrack > 0
+    fGoldenTrack = NULL;
 
-  if ( fSelUsingPrune == 1 ){
-    
-    fPruneXp      = TMath::Max( 0.08, fPruneXp); 
-    fPruneYp      = TMath::Max( 0.04, fPruneYp); 
-    fPruneYtar    = TMath::Max( 4.0,  fPruneYtar); 
-    fPruneDelta   = TMath::Max( 13.0, fPruneDelta); 
-    fPruneBeta    = TMath::Max( 0.1,  fPruneBeta); 
-    fPruneDf      = TMath::Max( 1.0,  fPruneDf); 
-    fPruneChiBeta = TMath::Max( 2.0,  fPruneChiBeta); 
-    fPruneFpTime  = TMath::Max( 5.0,  fPruneFpTime); 
-    fPruneNPMT    = TMath::Max( 6.0,  fPruneNPMT); 
+  return(0);
+}
     
-    Int_t ptrack = 0, fNGood;
-    Double_t fP = 0., fBetaP = 0.; // , fPartMass = 0.00051099; // 5.10989979E-04 Fix it
-
-    if ( fNtracks > 0 ) {
-      chi2Min   = 10000000000.0;
-      fGoodTrack = 0;    
-      fKeep      = new Bool_t [fNtracks];  
-      fReject    = new Int_t  [fNtracks];  
-
-      THaTrack *testTracks[fNtracks];
-
-      // ! Initialize all tracks to be good
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	fKeep[ptrack] = kTRUE;
-	fReject[ptrack] = 0;
-	testTracks[ptrack] = static_cast<THaTrack*>( fTracks->At(ptrack) );      
-        if (!testTracks[ptrack]) return -1;	
-      }      
+//_____________________________________________________________________________
+Int_t THcHallCSpectrometer::BestTrackUsingPrune()
+{  
+  Int_t nGood;
+  Double_t chi2Min;
+
+  if ( fNtracks > 0 ) {
+    chi2Min   = 10000000000.0;
+    fGoodTrack = 0;    
+    Bool_t* keep      = new Bool_t [fNtracks];  
+    Int_t* reject    = new Int_t  [fNtracks];  
+
+    THaTrack *testTracks[fNtracks];
+
+    // ! Initialize all tracks to be good
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+      keep[ptrack] = kTRUE;
+      reject[ptrack] = 0;
+      testTracks[ptrack] = static_cast<THaTrack*>( fTracks->At(ptrack) );      
+      if (!testTracks[ptrack]) return -1;	
+    }      
       
-      // ! Prune on xptar
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	if ( ( TMath::Abs( testTracks[ptrack]->GetTTheta() ) < fPruneXp ) && ( fKeep[ptrack] ) ){	  
-	  fNGood ++;
-	}	
-      }
-      if ( fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	  if ( TMath::Abs( testTracks[ptrack]->GetTTheta() ) >= fPruneXp ){
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 1;
-	  }
+    // ! Prune on xptar
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+      if ( ( TMath::Abs( testTracks[ptrack]->GetTTheta() ) < fPruneXp ) && ( keep[ptrack] ) ){	  
+	nGood ++;
+      }	
+    }
+    if ( nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+	if ( TMath::Abs( testTracks[ptrack]->GetTTheta() ) >= fPruneXp ){
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 1;
 	}
       }
+    }
       
-      // ! Prune on yptar
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	if ( ( TMath::Abs( testTracks[ptrack]->GetTPhi() ) < fPruneYp ) && ( fKeep[ptrack] ) ){
-	  fNGood ++; 
-	}
+    // ! Prune on yptar
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+      if ( ( TMath::Abs( testTracks[ptrack]->GetTPhi() ) < fPruneYp ) && ( keep[ptrack] ) ){
+	nGood ++; 
       }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	  if ( TMath::Abs( testTracks[ptrack]->GetTPhi() ) >= fPruneYp ){
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 2;
-	    
-	  }		
-	}
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+	if ( TMath::Abs( testTracks[ptrack]->GetTPhi() ) >= fPruneYp ){
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 2;
+  
+	}		
       }
+    }
       
-      // !     Prune on ytar
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	
-	if ( ( TMath::Abs( testTracks[ptrack]->GetTY() ) < fPruneYtar ) && ( fKeep[ptrack] ) ){
-	  fNGood ++; 
-	}	
-      }      
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	  if ( TMath::Abs( testTracks[ptrack]->GetTY() ) >= fPruneYtar ){
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 10;
-	  }
+    // !     Prune on ytar
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	
+      if ( ( TMath::Abs( testTracks[ptrack]->GetTY() ) < fPruneYtar ) && ( keep[ptrack] ) ){
+	nGood ++; 
+      }	
+    }      
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+	if ( TMath::Abs( testTracks[ptrack]->GetTY() ) >= fPruneYtar ){
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 10;
 	}
       }
-      
-      // !     Prune on delta
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	
-	if ( ( TMath::Abs( testTracks[ptrack]->GetDp() ) < fPruneDelta ) && ( fKeep[ptrack] ) ){
-	  fNGood ++; 
-	}	
-      }            
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){
-	  if ( TMath::Abs( testTracks[ptrack]->GetDp() ) >= fPruneDelta ){
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 20;
-	  }
+    }
+  
+    // !     Prune on delta
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	
+      if ( ( TMath::Abs( testTracks[ptrack]->GetDp() ) < fPruneDelta ) && ( keep[ptrack] ) ){
+	nGood ++; 
+      }	
+    }            
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){
+	if ( TMath::Abs( testTracks[ptrack]->GetDp() ) >= fPruneDelta ){
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 20;
 	}
-      }      
-            
-      // !     Prune on beta
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	fP = testTracks[ptrack]->GetP();
-	fBetaP = fP / TMath::Sqrt( fP * fP + fPartMass * fPartMass );       
-	if ( ( TMath::Abs( testTracks[ptrack]->GetBeta() - fBetaP ) < fPruneBeta ) && ( fKeep[ptrack] ) ){
-	  fNGood ++; 
-	}	
-      }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  fP = testTracks[ptrack]->GetP();
-	  fBetaP = fP / TMath::Sqrt( fP * fP + fPartMass * fPartMass );       
-	  if ( TMath::Abs( testTracks[ptrack]->GetBeta() - fBetaP ) >= fPruneBeta ) {	    
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 100;	          
-	  }	  
-	}	
       }
-      
-      // !     Prune on deg. freedom for track chisq
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
-	if ( ( testTracks[ptrack]->GetNDoF() >= fPruneDf ) && ( fKeep[ptrack] ) ){
-	  fNGood ++; 	  
-	}		
-      }          
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  if ( testTracks[ptrack]->GetNDoF() < fPruneDf ){	  
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 200;
-	  }
+    }      
+            
+    // !     Prune on beta
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+      Double_t p = testTracks[ptrack]->GetP();
+      Double_t betaP = p / TMath::Sqrt( p * p + fPartMass * fPartMass );       
+      if ( ( TMath::Abs( testTracks[ptrack]->GetBeta() - betaP ) < fPruneBeta ) && ( keep[ptrack] ) ){
+	nGood ++; 
+      }	
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	Double_t p = testTracks[ptrack]->GetP();
+	Double_t betaP = p / TMath::Sqrt( p * p + fPartMass * fPartMass );       
+	if ( TMath::Abs( testTracks[ptrack]->GetBeta() - betaP ) >= fPruneBeta ) {	    
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 100;	          
+	}	  
+      }	
+    }
+  
+    // !     Prune on deg. freedom for track chisq
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+      if ( ( testTracks[ptrack]->GetNDoF() >= fPruneDf ) && ( keep[ptrack] ) ){
+	nGood ++; 	  
+      }		
+    }          
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	if ( testTracks[ptrack]->GetNDoF() < fPruneDf ){	  
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 200;
 	}
       }
+    }
 
-      //!     Prune on num pmt hits
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
-	if ( ( testTracks[ptrack]->GetNPMT() >= fPruneNPMT ) && ( fKeep[ptrack] ) ){
-	  fNGood ++; 	  
-	}	        		
-      }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  if ( testTracks[ptrack]->GetNPMT() < fPruneNPMT ){
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 100000;
-	  }
+    //!     Prune on num pmt hits
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+      if ( ( testTracks[ptrack]->GetNPMT() >= fPruneNPMT ) && ( keep[ptrack] ) ){
+	nGood ++; 	  
+      }	        		
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	if ( testTracks[ptrack]->GetNPMT() < fPruneNPMT ){
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 100000;
 	}
       }
+    }
 
-      // !     Prune on beta chisqr
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
-	if ( ( testTracks[ptrack]->GetBetaChi2() < fPruneChiBeta ) && 
-	     ( testTracks[ptrack]->GetBetaChi2() > 0.01 )          &&   ( fKeep[ptrack] ) ){
-	  fNGood ++; 	  
-	}	        			
-      }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  if ( ( testTracks[ptrack]->GetBetaChi2() >= fPruneChiBeta ) || 
-	       ( testTracks[ptrack]->GetBetaChi2() <= 0.01          ) ){
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 1000;
-	  }	  	  
-	}
+    // !     Prune on beta chisqr
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+      if ( ( testTracks[ptrack]->GetBetaChi2() < fPruneChiBeta ) && 
+	   ( testTracks[ptrack]->GetBetaChi2() > 0.01 )          &&   ( keep[ptrack] ) ){
+	nGood ++; 	  
+      }	        			
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	if ( ( testTracks[ptrack]->GetBetaChi2() >= fPruneChiBeta ) || 
+	     ( testTracks[ptrack]->GetBetaChi2() <= 0.01          ) ){
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 1000;
+	}	  	  
       }
+    }
 
-      // !     Prune on fptime
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
-	if ( ( TMath::Abs( testTracks[ptrack]->GetFPTime() - fHodo->GetStartTimeCenter() ) < fPruneFpTime )  &&   
-	     ( fKeep[ptrack] ) ){
-	  fNGood ++; 	  
-	}	        			
-      }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  if ( TMath::Abs( testTracks[ptrack]->GetFPTime() - fHodo->GetStartTimeCenter() ) >= fPruneFpTime ) {
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 2000;	    	    
-	  }
+    // !     Prune on fptime
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+      if ( ( TMath::Abs( testTracks[ptrack]->GetFPTime() - fHodo->GetStartTimeCenter() ) < fPruneFpTime )  &&   
+	   ( keep[ptrack] ) ){
+	nGood ++; 	  
+      }	        			
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	if ( TMath::Abs( testTracks[ptrack]->GetFPTime() - fHodo->GetStartTimeCenter() ) >= fPruneFpTime ) {
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 2000;	    	    
 	}
       }
+    }
       
-      // !     Prune on Y2 being hit
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
-	if ( ( testTracks[ptrack]->GetGoodPlane4() == 1 )  &&  fKeep[ptrack] ) {
-	  fNGood ++; 	  	  
-	}	        			
-      }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  if ( testTracks[ptrack]->GetGoodPlane4() != 1 ) {
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 10000;	    	    
-	  }
+    // !     Prune on Y2 being hit
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+      if ( ( testTracks[ptrack]->GetGoodPlane4() == 1 )  &&  keep[ptrack] ) {
+	nGood ++; 	  	  
+      }	        			
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	if ( testTracks[ptrack]->GetGoodPlane4() != 1 ) {
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 10000;	    	    
 	}
-      }      
-      
-      // !     Prune on X2 being hit
-      fNGood = 0;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
-	if ( ( testTracks[ptrack]->GetGoodPlane3() == 1 )  &&  fKeep[ptrack] ) {
-	  fNGood ++; 	  	  
-	}	        			
       }
-      if (fNGood > 0 ) {
-	for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
-	  if ( testTracks[ptrack]->GetGoodPlane3() != 1 ) {
-	    fKeep[ptrack] = kFALSE;
-	    fReject[ptrack] = fReject[ptrack] + 20000;	    	    	    	    
-	  }
+    }      
+  
+    // !     Prune on X2 being hit
+    nGood = 0;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+      if ( ( testTracks[ptrack]->GetGoodPlane3() == 1 )  &&  keep[ptrack] ) {
+	nGood ++; 	  	  
+      }	        			
+    }
+    if (nGood > 0 ) {
+      for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      
+	if ( testTracks[ptrack]->GetGoodPlane3() != 1 ) {
+	  keep[ptrack] = kFALSE;
+	  reject[ptrack] = reject[ptrack] + 20000;	    	    	    	    
 	}
-      }      
+      }
+    }      
       
-      // !     Pick track with best chisq if more than one track passed prune tests
-      Double_t chi2PerDeg = 0.;
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
+    // !     Pick track with best chisq if more than one track passed prune tests
+    Double_t chi2PerDeg = 0.;
+    for (Int_t ptrack = 0; ptrack < fNtracks; ptrack++ ){	      	
 
-	chi2PerDeg =  testTracks[ptrack]->GetChi2() / testTracks[ptrack]->GetNDoF();
+      chi2PerDeg =  testTracks[ptrack]->GetChi2() / testTracks[ptrack]->GetNDoF();
 
-	if ( ( chi2PerDeg < chi2Min ) && ( fKeep[ptrack] ) ){
-	  fGoodTrack = ptrack;
-	  chi2Min = chi2PerDeg;
-	}	
-      }      
+      if ( ( chi2PerDeg < chi2Min ) && ( keep[ptrack] ) ){
+	fGoodTrack = ptrack;
+	chi2Min = chi2PerDeg;
+      }	
+    }      
 
-      fGoldenTrack = static_cast<THaTrack*>( fTracks->At(fGoodTrack) );
-      fTrkIfo      = *fGoldenTrack;
-      fTrk         = fGoldenTrack;
-      
-      delete [] fKeep;             fKeep = NULL;        
-      delete [] fReject;           fKeep = NULL;        
-      for ( ptrack = 0; ptrack < fNtracks; ptrack++ ){	
-	testTracks[ptrack] = NULL;
-	delete 	testTracks[ptrack];
-      }	      
+    fGoldenTrack = static_cast<THaTrack*>( fTracks->At(fGoodTrack) );
+    fTrkIfo      = *fGoldenTrack;
+    fTrk         = fGoldenTrack;
       
-    } else // Condition for fNtrack > 0
-      fGoldenTrack = NULL;
-  } // if prune
-  
-  //-------------------------------------------------------------------------------------
-  //-------------------------------------------------------------------------------------
-  //-------------------------------------------------------------------------------------
-  //-------------------------------------------------------------------------------------
-  //  cout << endl;
-  return TrackTimes( fTracks );
+  } else // Condition for fNtrack > 0
+    fGoldenTrack = NULL;
+
+  return(0);
 }
 
 //_____________________________________________________________________________
diff --git a/src/THcHallCSpectrometer.h b/src/THcHallCSpectrometer.h
index e40bb28b00e288feb9860c8093eec9e9ca532f71..cfb1335defedc56c6de3d2d0659e89b5926d86be 100644
--- a/src/THcHallCSpectrometer.h
+++ b/src/THcHallCSpectrometer.h
@@ -40,8 +40,12 @@ public:
   virtual ~THcHallCSpectrometer();
 
   virtual Int_t   ReadDatabase( const TDatime& date );
+  virtual void    EnforcePruneLimits();
   virtual Int_t   FindVertices( TClonesArray& tracks );
   virtual Int_t   TrackCalc();
+  virtual Int_t   BestTrackSimple();
+  virtual Int_t   BestTrackUsingScin();
+  virtual Int_t   BestTrackUsingPrune();
   virtual Int_t   TrackTimes( TClonesArray* tracks );
 
   virtual Int_t   ReadRunDatabase( const TDatime& date );
@@ -58,8 +62,8 @@ public:
 protected:
   void InitializeReconstruction();
 
-  Bool_t*      fKeep;
-  Int_t*       fReject;
+  //  Bool_t*      fKeep;
+  //  Int_t*       fReject;
 
   Double_t     fPartMass;
   Double_t     fPruneXp;