TTrackManager Class Reference

A manager of TTrack information to make outputs as MdcRec_trk. More...

#include <TTrackManager.h>

Inheritance diagram for TTrackManager:

TUpdater List of all members.

Public Member Functions

 TTrackManager ()
 Constructor.
virtual ~TTrackManager ()
 Destructor.
void dump (const std::string &message=std::string(""), const std::string &prefix=std::string("")) const
 dumps debug information.
std::string name (void) const
 returns name.
std::string version (void) const
 returns version.
const AList< TTrack > & allTracks (void) const
 returns a list of all reconstructed tracks including junks.
const AList< TTrack > & tracks (void) const
 returns a list of reconstructed tracks.
const AList< TTrack > & tracks2D (void) const
 returns a list of 2D tracks.
const AList< TTrack > & tracksFinal (void) const
 returns a list of tracks writen to MdcRec_trk.
void fittingFlag (unsigned)
 sets fitting flag.
double maxMomentum (double)
 sets the max. momentum.
int debugLevel (void) const
 returns/sets debug level.
int debugLevel (int)
float paraT0 (void) const
void clear (void)
 clears all internal information.
void append (AList< TTrack > &list)
 appends (2D) tracks. 'list' will be cleaned up.
void append2D (AList< TTrack > &list)
void refit (void)
 refits tracks.
void finish (void)
 finishes tracks.
void movePivot (void)
 moves pivot of tracks.
StatusCode determineT0 (unsigned level, unsigned nMaxTracks)
 determines T0 and refit all tracks.
void setCurlerFlags (void)
 tests for curlers.
void sortTracksByQuality (void)
 sorts tracks.
void sortTracksByPt (void)
void clearTables (void) const
 clears tables.
StatusCode makeTds (RecMdcTrackCol *trackList, RecMdcHitCol *hitList, int tkStat=1, int runge=0, int cal=0)
 stores track info. into TDS. by Zang Shilei
void saveTables (void)
 stores track info. into Panther table.
void saveMCTables (void) const
 stores MC track info. into Panther table.
void sortBanksByPt (void) const
 sorts RECMDC_TRK tables.
void treatCurler (MdcTrk &curl, MdcRec_trk_add &cdc, unsigned flag) const
 final decision for a curler.
void determineIP (void)
 determines IP.
void maskCurlHits (const AList< TMDCWireHit > &axial, const AList< TMDCWireHit > &stereo, const AList< TTrack > &tracks) const
 masks hits on found curl tracks.
void salvageAssociateHits (const AList< TMDCWireHit > &, float maxSigma2)
 salvages hits for dE/dx(not for track fitting).
TMLinkdivide (const TTrack &t, AList< TMLink > *l) const
TMLinkdivideByIp (const TTrack &t, AList< TMLink > *l) const
void removeHitsAcrossOverIp (AList< TMLink > &) const
TTrackclosest (const AList< TTrack > &, const TMDCWireHit &) const
 returns a track which is the closest to a hit.
void salvage (const AList< TMDCWireHit > &) const
 salvages remaining hits.
void mask (void) const
 masks hits out which are in tail of curly tracks.
void maskNormal (TTrack &) const
void maskCurl (TTrack &) const
void maskOut (TTrack &, const AList< TMLink > &) const
void maskMultiHits (TTrack &) const
void merge (void)
void sett0bes (double t0)
virtual bool updated (void) const
 returns true if an object is updated.
virtual void update (void)
 updates an object.
virtual bool initialized (void) const
 returns true if an object is initialized.
virtual void initialize (void)
 initializes an object.

Static Public Member Functions

static bool goodTrack (const TTrack &, bool track2D=false)
 checks goodness of a track.
static void maskBadHits (const AList< TTrack > &, float maxSigma2)
 masks hits with large chisq as associated hits. Pull in TMLink is used.

Private Member Functions

int copyTrack (TTrack &t, MdcRec_trk **r, MdcRec_trk_add **a) const
 copies a track. Non-zero will be returned if error happens.
void swapReccdc (MdcRec_trk &cdc0, MdcRec_trk_add &add0, MdcRec_mctrk &mc0, MdcRec_trk &cdc1, MdcRec_trk_add &add1, MdcRec_mctrk &mc1) const
 sorts banks.
void swapRectrk (MdcTrk &trk0, MdcTrk &tkr1) const
void tagReccdc (unsigned *id, unsigned n) const
void tagRectrk (unsigned *id, unsigned n) const
AList< TTrackselectGoodTracks (const AList< TTrack > &, bool track2D=false) const
 checks track quality.
void nameTracks (void)
 names tracks.
float T0 (unsigned n)
 returns T0 by old methode(expensive).
float T0Fit (unsigned n)
 returns T0 by T0 fitting.
float minimum (float y0, float y1, float y2) const

Static Private Member Functions

static bool checkNumberOfHits (const TTrack &, bool track2D=false)

Private Attributes

IMagneticFieldSvcm_pmgnIMF
RawDataProviderSvcm_rawDataProviderSvc
double t0bes
int _debugLevel
double _maxMomentum
double _sigmaCurlerMergeTest
unsigned _nCurlerMergeTest
THelixFitter _fitter
THelixFitter _cFitter
AList< TTrack_tracksAll
AList< TTrack_tracks
AList< TTrack_tracks2D
AList< TTrack_tracksFinal
AList< TMLink_associateHits
summary_s
float _t0

Classes

struct  summary

Detailed Description

A manager of TTrack information to make outputs as MdcRec_trk.

Definition at line 44 of file TTrackManager.h.


Constructor & Destructor Documentation

TTrackManager::TTrackManager (  ) 

Constructor.

Definition at line 79 of file TTrackManager.cxx.

References m_pmgnIMF, and m_rawDataProviderSvc.

00080 : _maxMomentum(10.),
00081   _sigmaCurlerMergeTest(sqrt(100.)),
00082   _nCurlerMergeTest(4),
00083   _debugLevel(0),
00084   _fitter("TTrackManager Fitter"),
00085   _cFitter("TTrackManager 2D Fitter"),
00086   _s(0) {
00087 //    BASF_Sharedmem->allocate("TrkMgrSum", sizeof(struct summary));
00088 
00089   StatusCode scmgn = Gaudi::svcLocator()->service("MagneticFieldSvc",m_pmgnIMF); 
00090   if(scmgn!=StatusCode::SUCCESS) { 
00091     std::cout<< "ERROR: Unable to open Magnetic field service"<<std::endl;
00092   }
00093   // Get RawDataProviderSvc
00094   IRawDataProviderSvc* irawDataProviderSvc;
00095   StatusCode sc = Gaudi::svcLocator()->service("RawDataProviderSvc",irawDataProviderSvc); 
00096   m_rawDataProviderSvc = dynamic_cast<RawDataProviderSvc*> (irawDataProviderSvc);
00097   if(sc!=StatusCode::SUCCESS) { 
00098     std::cout<< "ERROR: Unable to load RawDataProviderSvc"<<std::endl;
00099   }
00100 }

TTrackManager::~TTrackManager (  )  [virtual]

Destructor.

Definition at line 102 of file TTrackManager.cxx.

00102                               {
00103 }


Member Function Documentation

const AList< TTrack > & TTrackManager::allTracks ( void   )  const [inline]

returns a list of all reconstructed tracks including junks.

Definition at line 281 of file TTrackManager.h.

References _tracksAll.

00281                                    {
00282     return _tracksAll;
00283 }

void TTrackManager::append ( AList< TTrack > &  list  ) 

appends (2D) tracks. 'list' will be cleaned up.

Definition at line 889 of file TTrackManager.cxx.

References _tracks, _tracksAll, and selectGoodTracks().

Referenced by TrkReco::execute().

00889                                           {
00890   _tracksAll.append(list);
00891   _tracks.append(selectGoodTracks(list));
00892   list.removeAll();
00893 }

void TTrackManager::append2D ( AList< TTrack > &  list  ) 

Definition at line 896 of file TTrackManager.cxx.

References _tracks2D, _tracksAll, selectGoodTracks(), and SortByPt().

Referenced by TrkReco::execute().

00896                                             {
00897   _tracksAll.append(list);
00898   _tracks2D.append(selectGoodTracks(list, true));
00899   _tracks2D.sort(SortByPt);
00900   list.removeAll();
00901 }

bool TTrackManager::checkNumberOfHits ( const TTrack ,
bool  track2D = false 
) [static, private]

Definition at line 2595 of file TTrackManager.cxx.

References NAxialHits(), NStereoHits(), and t().

Referenced by goodTrack().

02595                                                                {
02596   const AList<TMLink> & cores = t.cores();
02597 
02598   if (track2D) {
02599     unsigned axialHits = NAxialHits(cores);
02600     if (axialHits < 3) return false;
02601   }
02602   else {
02603     unsigned allHits = cores.length();
02604     if (allHits < 5) return false;
02605     unsigned stereoHits = NStereoHits(cores);
02606     if (stereoHits < 2) return false;
02607     unsigned axialHits = allHits - stereoHits;
02608     if (axialHits < 3) return false;
02609   }
02610   return true;
02611 }

void TTrackManager::clear ( void   )  [virtual]

clears all internal information.

Reimplemented from TUpdater.

Definition at line 854 of file TTrackManager.cxx.

References _associateHits, _tracks, _tracks2D, _tracksAll, _tracksFinal, first, and delete_small_size::size.

Referenced by TrkReco::clear().

00854                          {
00855   HepAListDeleteAll(_tracksAll);
00856   _tracks.removeAll();
00857   _tracks2D.removeAll();
00858   _tracksFinal.removeAll();
00859   HepAListDeleteAll(_associateHits);
00860   static bool first = true;
00861   if (first) {
00862     first = false;
00863     int size;
00864     //  _s = (struct summary *)
00865     //      BASF_Sharedmem->get_pointer(BASF_Sharedmem->get_id(),
00866     //                                  "TrkMgrSum",
00867     //                                  & size);
00868   }
00869 }

void TTrackManager::clearTables ( void   )  const

clears tables.

Definition at line 2515 of file TTrackManager.cxx.

References MdcDatMcwirhitCol::getMdcDatMcwirhitCol(), MdcRecMctrk2hepCol::getMdcRecMctrk2hepCol(), MdcRecMctrkCol::getMdcRecMctrkCol(), MdcRecTrkAddCol::getMdcRecTrkAddCol(), MdcRecTrkCol::getMdcRecTrkCol(), MdcRecWirhitCol::getMdcRecWirhitCol(), and genRecEmupikp::i.

Referenced by TrkReco::clear().

02515                                      {
02516   //    BsDelEnt(RECMDC_TRK, BBS_ID_ALL);
02517   //    BsDelEnt(RECMDC_TRK_ADD, BBS_ID_ALL);
02518   //    BsDelEnt(RECMDC_MCTRK, BBS_ID_ALL);
02519   //    BsDelEnt(RECMDC_MCTRK2HEP, BBS_ID_ALL);
02520   unsigned n = MdcRecTrkCol::getMdcRecTrkCol()->size();
02521   for (unsigned i = 0; i < n; i++) delete &(*MdcRecTrkCol::getMdcRecTrkCol())[i];
02522 
02523   n = MdcRecTrkAddCol::getMdcRecTrkAddCol()->size();
02524   for (unsigned i = 0; i < n; i++) delete &(*MdcRecTrkAddCol::getMdcRecTrkAddCol())[i];
02525 
02526   n = MdcRecMctrkCol::getMdcRecMctrkCol()->size();
02527   for (unsigned i = 0; i < n; i++) delete &(*MdcRecMctrkCol::getMdcRecMctrkCol())[i];
02528 
02529   n = MdcRecMctrk2hepCol::getMdcRecMctrk2hepCol()->size();
02530   for (unsigned i = 0; i < n; i++) delete &(*MdcRecMctrk2hepCol::getMdcRecMctrk2hepCol())[i];
02531 
02532 
02533   //...Clear track association...
02534   //    unsigned n = BsCouTab(RECMDC_WIRHIT);
02535   n = MdcRecWirhitCol::getMdcRecWirhitCol()->size();
02536   for (unsigned i = 0; i < n; i++) {
02537     //  reccdc_wirhit & h = * (reccdc_wirhit *)
02538     //      BsGetEnt(RECMDC_WIRHIT, i + 1, BBS_No_Index);
02539     //  h.m_trk = 0;
02540     MdcRec_wirhit& h = (*MdcRecWirhitCol::getMdcRecWirhitCol())[i];
02541     h.trk = 0;
02542   }
02543   //    n = BsCouTab(DATMDC_MCWIRHIT);
02544   n = MdcDatMcwirhitCol::getMdcDatMcwirhitCol()->size();
02545   for (unsigned i = 0; i < n; i++) {
02546     //  datcdc_mcwirhit & h = * (datcdc_mcwirhit *)
02547     //      BsGetEnt(DATMDC_MCWIRHIT, i + 1, BBS_No_Index);
02548     //  h.m_trk = 0;
02549     MdcDat_mcwirhit& h = (*MdcDatMcwirhitCol::getMdcDatMcwirhitCol())[i];
02550     h.trk = 0;
02551   }
02552 }

TTrack * TTrackManager::closest ( const AList< TTrack > &  ,
const TMDCWireHit  
) const

returns a track which is the closest to a hit.

Definition at line 255 of file TTrackManager.cxx.

References showlog::err, genRecEmupikp::i, and t().

Referenced by salvage().

00256                                                       {
00257 
00258     TMLink t;
00259     t.hit(& hit);
00260     unsigned n = tracks.length();
00261     double minDistance = MAXDOUBLE;
00262     TTrack * minTrk = NULL;
00263 
00264     //...Loop over all tracks...
00265     for (unsigned i = 0; i < n; i++) {
00266         TTrack & trk = * tracks[i];
00267         int err = trk.approach(t);
00268         if (err < 0) continue;
00269         if (minDistance > t.distance()) {
00270             minDistance = t.distance();
00271             minTrk = & trk;
00272         }
00273     }
00274 
00275     return minTrk;
00276 }

int TTrackManager::copyTrack ( TTrack t,
MdcRec_trk **  r,
MdcRec_trk_add **  a 
) const [private]

copies a track. Non-zero will be returned if error happens.

Definition at line 1708 of file TTrackManager.cxx.

References MdcRec_trk::chiSq, TMLink::dPhi(), showlog::err, MdcRec_trk::error, MdcRec_trk::fiTerm, MdcRec_trk::helix, genRecEmupikp::i, ganga-rec::j, MdcRec_wirhit::lr, MdcRec_trk::nclus, MdcRec_trk::ndf, MdcRec_trk::nhits, MdcRec_trk::nster, OuterMost(), MdcRec_wirhit::pChiSq, MdcRec_trk::pivot, pr, MdcRec_trk::stat, MdcRec_wirhit::stat, t(), TrackQuality2D, MdcRec_wirhit::trk, WireHitChargeValid, WireHitFindingValid, WireHitFittingValid, WireHitInvalidForFit, WireHitTimeValid, and x.

Referenced by saveTables().

01710                                  {
01711 
01712   static const unsigned GoodHitMask = (WireHitTimeValid |
01713       WireHitChargeValid |
01714       WireHitFindingValid |
01715       WireHitFittingValid);
01716   int err = 0;
01717 
01718   //...Hit loop...
01719 #ifdef TRKRECO_DEBUG_DETAIL
01720   std::cout << "    checking hits ... " << t.name() 
01721     << " quality = " << t.quality();
01722   std::cout << " : " << t.cores().length() << ", " << t.ndf() << " : ";
01723   unsigned nnn = 0;
01724 #endif
01725   unsigned j = 0;
01726   unsigned nClst = 0;
01727   unsigned nStereos = 0;
01728   unsigned nOccupied = 0;
01729   AList<TMLink> hits;
01730   AList<TMLink> badHits;
01731   unsigned n = t.links().length();
01732   for (unsigned i = 0; i < n; i++) {
01733     TMLink * l = t.links()[i];
01734     MdcRec_wirhit * h = l->hit()->reccdc();
01735 
01736 #ifdef TRKRECO_DEBUG_DETAIL
01737     if (h->trk) std::cout << l->wire()->name() << "(n/a),";
01738 #endif
01739 
01740     if (h->trk) {
01741       ++nOccupied;
01742       if (! (h->stat & WireHitInvalidForFit))
01743         continue;
01744     }
01745     if ((l->hit()->state() & GoodHitMask) == GoodHitMask) {
01746       if (l->hit()->state() & WireHitInvalidForFit) {
01747         if (! (h->stat & WireHitInvalidForFit))
01748           badHits.append(l);
01749       }
01750       else {
01751         hits.append(l);
01752         if (l->wire()->stereo()) ++nStereos;
01753       }
01754     }
01755   }
01756   t.finalHits(hits);
01757 #ifdef TRKRECO_DEBUG_DETAIL
01758   std::cout << std::endl;
01759 #endif
01760 
01761   //...Check # of hits...
01762   if (t.quality() & TrackQuality2D) {
01763     if (hits.length() < 3) err = 3;
01764     if (nOccupied > 2) err = 4;
01765   }
01766   else {
01767     if (hits.length() < 5) err = 1;
01768     if (nStereos < 2) err = 2;
01769   }
01770   if (err) return err;
01771 
01772   //...Create new tables...
01773   //    * pr = (reccdc_trk *) BsNewEnt(RECMDC_TRK);
01774   //    * pra = (reccdc_trk_add *) BsNewEnt(RECMDC_TRK_ADD);
01775   //    reccdc_trk * r = * pr;
01776   //    reccdc_trk_add * ra = * pra;
01777   * pr = new MdcRec_trk;
01778   * pra = new MdcRec_trk_add;
01779   MdcRec_trk* r = * pr;
01780   MdcRec_trk_add* ra = * pra;
01781 
01782   //...Copy hit information...
01783   // const AList<TMLink> & cores = t.cores();
01784   // const AList<TMLink> & links = t.links();
01785   // unsigned allHits = cores.length();
01786   // unsigned stereoHits = NStereoHits(cores);
01787   // r.m_chiSq = t.chi2();
01788   // r.m_confl = t.confidenceLevel();
01789   // r.m_ndf = t.ndf();
01790   // r.m_nhits = allHits;
01791   // r.m_nster = stereoHits;
01792   float chisq = 0.;
01793   unsigned nHits = hits.length();
01794   for (unsigned i = 0; i < nHits; i++) {
01795     TMLink * l = hits[i];
01796     MdcRec_wirhit * h = hits[i]->hit()->reccdc();
01797     h->trk = r;
01798     h->pChiSq = l->pull();
01799     h->lr = l->leftRight();
01800     //zsl       if (l->usecathode() == 4) ++nClst;
01801     chisq += h->pChiSq;
01802   }
01803   r->chiSq = chisq;
01804   r->nhits = nHits;
01805   r->nster = nStereos;
01806   r->ndf = nHits - 5;
01807   if (t.quality() & TrackQuality2D)
01808     r->ndf = nHits - 3;
01809 
01810   //...Bad hits...
01811   n = badHits.length();
01812   for (unsigned i = 0; i < n; i++) {
01813     MdcRec_wirhit * h = badHits[i]->hit()->reccdc();
01814     h->trk = r;
01815     h->stat |= WireHitInvalidForFit;
01816   }
01817 
01818   //...Cathode...
01819   r->nclus = nClst;
01820 
01821   //...Helix parameter...
01822   const Vector & a = t.helix().a();
01823   const SymMatrix & ea = t.helix().Ea();
01824   const HepPoint3D & x = t.helix().pivot();
01825   r->helix[0] = a[0];
01826   r->helix[1] = a[1];
01827   r->helix[2] = a[2];
01828   r->helix[3] = a[3];
01829   r->helix[4] = a[4];
01830 
01831   r->pivot[0] = x.x();
01832   r->pivot[1] = x.y();
01833   r->pivot[2] = x.z();
01834 
01835   r->error[0] = ea[0][0];
01836   r->error[1] = ea[1][0];
01837   r->error[2] = ea[1][1];
01838   r->error[3] = ea[2][0];
01839   r->error[4] = ea[2][1];
01840   r->error[5] = ea[2][2];
01841   r->error[6] = ea[3][0];
01842   r->error[7] = ea[3][1];
01843   r->error[8] = ea[3][2];
01844   r->error[9] = ea[3][3];
01845   r->error[10] = ea[4][0];
01846   r->error[11] = ea[4][1];
01847   r->error[12] = ea[4][2];
01848   r->error[13] = ea[4][3];
01849   r->error[14] = ea[4][4];
01850 
01851   //...Get outer most hit(=termination point)...
01852   TMLink * last = OuterMost(hits);
01853 
01854   //...Calculate phi of the termination point...
01855   t.approach(* last);
01856   r->fiTerm = last->dPhi();
01857 
01858   return err;
01859 }

int TTrackManager::debugLevel ( int   )  [inline]

Definition at line 299 of file TTrackManager.h.

References _debugLevel.

00299                                {
00300     return _debugLevel = a;
00301 }

int TTrackManager::debugLevel ( void   )  const [inline]

returns/sets debug level.

Definition at line 293 of file TTrackManager.h.

References _debugLevel.

Referenced by TrkReco::initialize().

00293                                     {
00294     return _debugLevel;
00295 }

void TTrackManager::determineIP ( void   ) 

determines IP.

Definition at line 2614 of file TTrackManager.cxx.

References MdcTrkCol::getMdcTrkCol(), genRecEmupikp::i, if(), nZ, and t().

02614                                {
02615   static const HepVector3D InitialVertex(0., 0., 0.);
02616 
02617   //...Track selection...
02618   //    unsigned n = BsCouTab(RECTRK);
02619   unsigned n = MdcTrkCol::getMdcTrkCol()->size();
02620   AList<MdcTrk_localz> zList;
02621   for (unsigned i = 0; i < n; i++) {
02622     //  const rectrk & t = * (rectrk *) BsGetEnt(RECTRK, i + 1, BBS_No_Index);
02623     const MdcTrk & t = (* MdcTrkCol::getMdcTrkCol())[i];
02624 
02625     if (t.prekal == 0) continue;
02626     //  const reccdc_trk_add & c = * (reccdc_trk_add *)
02627     //      BsGetEnt(RECMDC_TRK_ADD, t.m_prekal, BBS_No_Index);
02628     const MdcRec_trk_add & c = * t.prekal->add;
02629 
02630     //...Only good tracks...
02631     if (c.quality) continue;
02632 
02633     //...Require SVD hits...
02634     //  const rectrk_global & g = * (rectrk_global *) BsGetEnt(RECTRK_GLOBAL,
02635     //                                                         t.m_glob[2],
02636     //                                                         BBS_No_Index);
02637     const MdcTrk_global & g = * t.glob[2];
02638 
02639     if (! & g) continue;
02640     if (g.nhits[3] < 2) continue;
02641     if (g.nhits[4] < 2) continue;
02642 
02643     //...OK...
02644     //  const rectrk_localz & z = * (rectrk_localz *) BsGetEnt(RECTRK_LOCALZ,
02645     //                                                         t.m_zero[2],
02646     //                                                         BBS_No_Index);
02647     MdcTrk_localz & z = * t.zero[2];
02648 
02649     if (! & z) continue;
02650     //  zList.append((rectrk_localz &) z);
02651     zList.append(z);
02652   }
02653   unsigned nZ = zList.length();
02654   if (nZ < 2) return;
02655 
02656   //...Fitting...
02657   //      kvertexfitter kvf;
02658   //      kvf.initialVertex(initialVertex);
02659   //      for (unsigned i = 0; i < nZ; i++) {
02660   //    kvf.addTrack();
02661   //      }
02662 
02663 }

StatusCode TTrackManager::determineT0 ( unsigned  level,
unsigned  nMaxTracks 
)

determines T0 and refit all tracks.

Definition at line 1293 of file TTrackManager.cxx.

References _cFitter, _debugLevel, _t0, _tracks, Bes_Common::FATAL, first, THelixFitter::fit2D(), Bes_Common::INFO, msgSvc(), THelixFitter::propagation(), EventModel::Recon::RecEsTimeCol, T0(), T0Fit(), THelixFitter::tof(), and Bes_Common::WARNING.

Referenced by TrkReco::execute().

01293                                                         {
01294 #ifdef TRKRECO_DEBUG_DETAIL
01295   if (level == 0) {
01296     std::cout << "TTrackManager::determineT0 !!! called with level = 0";
01297     std::cout << std::endl;
01298   }
01299 #endif
01300 
01301   IMessageSvc *msgSvc;
01302   Gaudi::svcLocator()->service("MessageSvc", msgSvc);
01303   MsgStream log(msgSvc, "TTrackManager");
01304 
01305   IDataProviderSvc* eventSvc = NULL;
01306   Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
01307 
01308   static bool first = true;
01309   static unsigned methode = 0;
01310   if (first) {
01311     first = false;
01312 
01313     if (level == 1) {
01314       _cFitter.fit2D(true);
01315     }
01316     else if (level == 2) {
01317       // default setting
01318     }
01319     else if (level == 3) {
01320       //            _cFitter.sag(true);  //Liuqg
01321     }
01322     else if (level == 4) {
01323       //            _cFitter.sag(true);  //Liuqg
01324       _cFitter.propagation(true);
01325     }
01326     else if (level == 5) {
01327       //            _cFitter.sag(true);  //Liuqg
01328       _cFitter.propagation(true);
01329       _cFitter.tof(true);
01330     }
01331     else if (level == 6) {
01332       methode = 1;
01333       //            _cFitter.sag(true); //Liuqg
01334       _cFitter.propagation(true);
01335       _cFitter.tof(true);
01336     }
01337     else if (level == 7) {
01338       methode = 2;
01339       //            _cFitter.sag(true);  //Liuqg
01340       _cFitter.propagation(true);
01341       _cFitter.tof(true);
01342     }
01343   }
01344 
01345   unsigned n = _tracks.length();
01346   if (! n) return StatusCode::SUCCESS;
01347 
01348   if (nMax == 0) nMax = n;
01349   if (n > nMax) n = nMax;
01350 
01351   //    float t0 = 0.;
01352   _t0 = 999.;
01353 
01354   //read t0 from TDS
01355   float t0_sta = -1;
01356   float tev = 0;
01357   SmartDataPtr<RecEsTimeCol> aevtimeCol(eventSvc,"/Event/Recon/RecEsTimeCol");
01358   if (aevtimeCol) {
01359     RecEsTimeCol::iterator iter_evt = aevtimeCol->begin();
01360     t0_sta =  (*iter_evt)->getStat();
01361     tev = (*iter_evt)->getTest();
01362     //  cout<<"t0_sta: "<<t0_sta<<"  tev: "<<tev<<endl;
01363   }else{
01364     log << MSG::WARNING << "Could not find RecEsTimeCol" << endreq;
01365   }
01366 
01367   if (methode == 0) _t0 = T0(n);
01368 
01369   else if (methode == 1) _t0 = T0Fit(n);
01370 
01371   else if (methode ==2) {   //revise method == 2 to BESIII environment. Liuqg
01372     if (t0_sta != 1) {    //1: tof  11:tof after reco  //no tof
01373       _t0 = T0Fit(n);
01374       //cout<<"t0: "<<_t0<<endl;
01375     }
01376   }
01377 
01378   // std::cout << "reccdc_timing=" << BsCouTab(RECMDC_TIMING) << std::endl;
01379   /*    else if (methode == 2 && BsCouTab(RECMDC_TIMING) != 0) {
01380         struct reccdc_timing * r0 = (struct reccdc_timing *)
01381         BsGetEnt(RECMDC_TIMING, BsCouTab(RECMDC_TIMING), BBS_No_Index);
01382         if (r0->m_quality == 102) {
01383         if (BsCouTab(BELLE_EVENT)) {
01384         struct belle_event * b0 = (struct belle_event *)
01385         BsGetEnt(BELLE_EVENT, 1, BBS_No_Index);
01386         if(1==b0->m_ExpMC)                    t0 = T0Fit(n);
01387         if(2==b0->m_ExpMC && r0->m_time !=0.) t0 = T0Fit(n);
01388         }
01389         }
01390         else if (r0->m_quality == 100) t0 = T0Fit(n);
01391   //      std::cout << "quality=" << r0->m_quality << std::endl;
01392   }
01393   */
01394 
01395   //...For debug...
01396   if (_debugLevel) {
01397     std::cout << "TTrackManager::determineT0 ... methode=" << methode;
01398     std::cout << ", T0 offset=" << - _t0;
01399     std::cout << ", # of tracks used=" << n << std::endl;
01400   }
01401 
01402   //...store them... Liuqg
01403   float t0_rec = 999.;
01404   int t0_recSta = 8;
01405   if(fabs(_t0 + tev) < 4) t0_rec = 0;
01406   if(fabs(_t0 + tev - 8) < 4) t0_rec = 8;
01407   if(fabs(_t0 + tev - 16) < 4) t0_rec = 16;
01408   log << MSG::INFO << "beginning to make RecEsTimeCol" <<endreq;
01409   IDataManagerSvc *dataManSvc = dynamic_cast<IDataManagerSvc*> (eventSvc);
01410   DataObject *aEvTime;
01411   eventSvc->findObject("/Event/Recon/RecEsTimeCol",aEvTime);
01412   if(aEvTime!=NULL && t0_rec<25){
01413     dataManSvc->clearSubTree("/Event/Recon/RecEsTimeCol");
01414     eventSvc->unregisterObject("/Event/Recon/RecEsTimeCol");
01415   }
01416   if(t0_rec<25){
01417 
01418     RecEsTimeCol *aEvTimeCol = new RecEsTimeCol;
01419     RecEsTime *aevtime = new RecEsTime;
01420     aevtime -> setTest(t0_rec);
01421     aevtime -> setStat(t0_recSta);
01422     aEvTimeCol->push_back(aevtime);
01423 
01424     // register event time  to TDS
01425     //check whether the t0  has been already registered
01426     StatusCode evtime = eventSvc->registerObject("/Event/Recon/RecEsTimeCol", aEvTimeCol);
01427 
01428     if(evtime!=StatusCode::SUCCESS) {
01429       log << MSG::FATAL << "Could not register Event Start Time" << endreq;
01430       return( StatusCode::FAILURE);
01431     }
01432   }
01433   return( StatusCode::SUCCESS );
01434 }

TMLink & TTrackManager::divide ( const TTrack t,
AList< TMLink > *  l 
) const

Definition at line 1028 of file TTrackManager.cxx.

References divideByIp(), ganga-rec::j, OuterMost(), TMLink::positionOnTrack(), deljobs::start, and t().

01028                                                                {
01029   TMLink & start = * OuterMost(t.links());
01030   const HepPoint3D & center = t.helix().center();
01031   const HepVector3D a = start.positionOnTrack() - center;
01032   for (unsigned j = 0; j < t.nLinks(); j++) {
01033     if (t[j] == & start) continue;
01034     TMLink & k = * t[j];
01035     const HepVector3D b = k.positionOnTrack() - center;
01036     if (a.cross(b).z() >= 0.) l[0].append(k);
01037     else                      l[1].append(k);
01038   }
01039 
01040 #ifdef TRKRECO_DEBUG_DETAIL
01041   std::cout << "    outer link = " << start.hit()->wire()->name() << std::endl;
01042   std::cout << "        nLinks of 0 = " << l[0].length() << std::endl;
01043   std::cout << "        nLinks of 1 = " << l[1].length() << std::endl;
01044 #endif
01045 
01046   if (l[0].length() == 0 || l[1].length() == 0)
01047     return divideByIp(t, l);
01048 
01049   return start;
01050 }

TMLink & TTrackManager::divideByIp ( const TTrack t,
AList< TMLink > *  l 
) const

Definition at line 1053 of file TTrackManager.cxx.

References ganga-rec::j, ORIGIN, OuterMost(), deljobs::start, and t().

Referenced by divide(), maskCurl(), and maskNormal().

01053                                                                    {
01054   l[0].removeAll();
01055   l[1].removeAll();
01056 
01057   const HepPoint3D & center = t.helix().center();
01058   const HepVector3D a = ORIGIN - center;
01059   for (unsigned j = 0; j < t.nLinks(); j++) {
01060     TMLink & k = * t[j];
01061     const HepVector3D b = k.positionOnTrack() - center;
01062     if (a.cross(b).z() >= 0.) l[0].append(k);
01063     else                      l[1].append(k);
01064   }    
01065 
01066   //...This is a dummy...
01067   TMLink & start = * OuterMost(t.links());
01068   return start;
01069 }

void TTrackManager::dump ( const std::string message = std::string(""),
const std::string prefix = std::string("") 
) const

dumps debug information.

Reimplemented from TUpdater.

Definition at line 111 of file TTrackManager.cxx.

References _tracks, _tracks2D, _tracksAll, Dump(), genRecEmupikp::i, RealDBUtil::npos, deljobs::string, and TrackDump().

00111                                                                       {
00112     bool def = (msg == "") ? true : false;
00113 /*
00114     if (msg.find("summary") != std::string::npos || msg.find("detail") != std::string::npos) {
00115         struct summary s;
00116         //              bzero((char*)& s, sizeof(struct summary));
00117         memset((char*)& s, 0, sizeof(struct summary));
00118         for (int i = 0; i < BASF_Sharedmem->nprocess(); i++) {
00119             int size;
00120             struct summary & r = * (struct summary *)
00121                 BASF_Sharedmem->get_pointer(i, "TrkMgrSum", & size);
00122             s._nEvents += r._nEvents;
00123             s._nTracks += r._nTracks;
00124             s._nTracksAll += r._nTracksAll;
00125             s._nTracks2D += r._nTracks2D;
00126             s._nTracksFinal += r._nTracksFinal;
00127             s._nSuperMoms += r._nSuperMoms;
00128             s._nToBeMerged += r._nToBeMerged;
00129             s._nToBeMergedMoreThanTwo += r._nToBeMergedMoreThanTwo;
00130         }
00131 
00132         std::cout << pre;
00133         std::cout << "all events : " << s._nEvents << std::endl;
00134         std::cout << pre;
00135         std::cout << "all tracks : " << s._nTracksAll << std::endl;
00136         std::cout << pre;
00137         std::cout << "    good tracks  : " << s._nTracks << std::endl;
00138         std::cout << pre;
00139         std::cout << "    2D tracks    : " << s._nTracks2D << std::endl;
00140         std::cout << pre;
00141         std::cout << "    final tracks : " << s._nTracksFinal << std::endl;
00142         std::cout << pre;
00143         std::cout << "    super mom.   : " << s._nSuperMoms << std::endl;
00144         std::cout << pre;
00145         std::cout << "    to be mreged : " << s._nToBeMerged << std::endl;
00146         std::cout << pre;
00147         std::cout << "    to be mreged2: " << s._nToBeMergedMoreThanTwo
00148                   << std::endl;
00149     }
00150 */
00151     if (def || msg.find("eventSummary") != std::string::npos || msg.find("detail") != std::string::npos) {
00152         std::cout << pre
00153                   << "tracks reconstructed : " << _tracksAll.length()
00154                   << std::endl;
00155         std::cout << pre
00156                   << "good tracks          : " << _tracks.length()
00157                   << std::endl;
00158         std::cout << pre
00159                   << "2D tracks            : " << _tracks2D.length()
00160                   << std::endl;
00161         std::cout << pre
00162                   << "Track list:" << std::endl;
00163 
00164         std::string tab = pre;
00165         std::string spc = " ";
00166         for (unsigned i = 0; i < _tracksAll.length(); i++) {
00167             std::cout << tab << TrackDump(* _tracksAll[i]) << std::endl;
00168             if (msg.find("hits") != std::string::npos || msg.find("detail") != std::string::npos)
00169                 Dump(_tracksAll[i]->links(), "hits sort flag");
00170         }
00171     }
00172 }

void TTrackManager::finish ( void   ) 

finishes tracks.

Definition at line 872 of file TTrackManager.cxx.

References _debugLevel, _tracks, genRecEmupikp::i, movePivot(), name(), refit(), and t().

00872                           {
00873   refit();
00874   movePivot();
00875   if (_debugLevel > 1) {
00876     std::cout << name() << " ... finishing" << std::endl;
00877     //  unsigned n = _tracksAll.length();
00878     unsigned n = _tracks.length();
00879     for (unsigned i = 0; i < n; i++) {
00880       //            TTrack & t = * _tracksAll[i];
00881       TTrack & t = * _tracks[i];
00882       std::cout << "    " << t.name() << std::endl;
00883       t.dump("hits mc track flag sort", "    ");
00884     }
00885   }
00886 }

void TTrackManager::fittingFlag ( unsigned   )  [inline]

sets fitting flag.

Definition at line 305 of file TTrackManager.h.

References _fitter, THelixFitter::freeT0(), THelixFitter::propagation(), THelixFitter::sag(), and THelixFitter::tof().

Referenced by TrkReco::initialize().

00305                                      {
00306     if (a & 1) _fitter.sag(true);
00307     if (a & 2) _fitter.propagation(true);
00308     if (a & 4) _fitter.tof(true);
00309     if (a & 8) _fitter.freeT0(true);
00310 }

bool TTrackManager::goodTrack ( const TTrack ,
bool  track2D = false 
) [static]

checks goodness of a track.

Definition at line 3015 of file TTrackManager.cxx.

References checkNumberOfHits(), HelixHasNan(), and t().

Referenced by TConformalFinder::fastFinding3D(), and selectGoodTracks().

03015                                                        {
03016 
03017   //...Check number of hits...
03018   if (! checkNumberOfHits(t, track2D)) return false;
03019 
03020   //...Check helix parameter...
03021   if (HelixHasNan(t.helix())) return false;
03022 
03023   return true;
03024 }

void TUpdater::initialize ( void   )  [inline, virtual, inherited]

initializes an object.

Definition at line 82 of file TUpdater.h.

References TUpdater::_init.

00082                          {
00083     _init = true;
00084 }

bool TUpdater::initialized ( void   )  const [inline, virtual, inherited]

returns true if an object is initialized.

Definition at line 76 of file TUpdater.h.

References TUpdater::_init.

00076                                 {
00077     return _init;
00078 }

StatusCode TTrackManager::makeTds ( RecMdcTrackCol trackList,
RecMdcHitCol hitList,
int  tkStat = 1,
int  runge = 0,
int  cal = 0 
)

stores track info. into TDS. by Zang Shilei

added by Jike Wang

add by jialk: returns driftTime prop time correction & entra angle

check the result:MdcTrackCol

Definition at line 281 of file TTrackManager.cxx.

References _tracks, abs, alpha, cos(), TMLink::dPhi(), Bes_Common::FATAL, RawDataProviderSvc::getMdcDigiVec(), IMagneticFieldSvc::getReferField(), genRecEmupikp::i, Bes_Common::INFO, iter(), ganga-rec::j, MdcID::layer(), m_pmgnIMF, m_rawDataProviderSvc, msgSvc(), name(), OuterMost(), phi0, pi, boss::pos, s, RecMdcHit::setAdc(), RecMdcHit::setChisqAdd(), RecMdcHit::setDoca(), RecMdcHit::setDriftDistLeft(), RecMdcHit::setDriftDistRight(), RecMdcHit::setDriftT(), RecMdcHit::setEntra(), RecMdcHit::setErrDriftDistLeft(), RecMdcHit::setErrDriftDistRight(), RecMdcHit::setFlagLR(), RecMdcHit::setFltLen(), RecMdcHit::setId(), RecMdcHit::setMdcId(), RecMdcHit::setStat(), RecMdcHit::setTdc(), RecMdcHit::setTrkId(), RecMdcHit::setZhit(), sin(), t(), TrackQuality2D, w, MdcID::wire(), and MdcID::wire_id().

Referenced by TrkReco::execute().

00281                                                                                                      { //yzhang change interface 2010-05-14 
00282   IMessageSvc *msgSvc;
00283   Gaudi::svcLocator()->service("MessageSvc", msgSvc);
00284 
00285   MsgStream log(msgSvc, "TrkReco");
00286 
00287   IDataProviderSvc* eventSvc = NULL;
00288   Gaudi::svcLocator()->service("EventDataSvc", eventSvc);
00289 
00290 #ifdef TRKRECO_DEBUG
00291   if (eventSvc) {
00292      log << MSG::INFO << "makeTds:event Svc has been found" << endreq;
00293   } else {
00294      log << MSG::FATAL << "makeTds:Could not find eventSvc" << endreq;
00295     return StatusCode::FAILURE ;
00296   }
00297 #endif
00298 //check whether  Recon  already registered
00299 //   DataObject *aReconEvent;
00300 //   eventSvc->findObject("/Event/Recon",aReconEvent);
00301 //   if(!aReconEvent) {
00302 //      ReconEvent* recevt = new ReconEvent;
00303 //      StatusCode sc = eventSvc->registerObject("/Event/Recon",recevt );
00304 //      if(sc!=StatusCode::SUCCESS) {
00305 //       log << MSG::FATAL << "Could not register ReconEvent" <<endreq;
00306 //       return( StatusCode::FAILURE);
00307 //     }
00308 //  }
00309 //
00310 //  /// Unregister Tracks
00311 //  IDataManagerSvc *dataManSvc;
00312 //  if(doClear){//yzhang add, do NOT clear Tds when associate rec
00313 //    dataManSvc= dynamic_cast<IDataManagerSvc*>(eventSvc);
00314 //    DataObject *aTrackCol;
00315 //    eventSvc->findObject("/Event/Recon/RecMdcTrackCol",aTrackCol);
00316 //    if(aTrackCol != NULL) {
00317 //      dataManSvc->clearSubTree("/Event/Recon/RecMdcTrackCol");
00318 //      eventSvc->unregisterObject("/Event/Recon/RecMdcTrackCol");
00319 //    }
00320 //    DataObject *aRecHitCol;
00321 //    eventSvc->findObject("/Event/Recon/RecMdcHitCol",aRecHitCol);
00322 //    if(aRecHitCol != NULL) {
00323 //      dataManSvc->clearSubTree("/Event/Recon/RecMdcHitCol");
00324 //      eventSvc->unregisterObject("/Event/Recon/RecMdcHitCol");
00325 //    }
00326 //  }
00327 //  /// Writing
00328 //  RecMdcTrackCol* trkcol = new RecMdcTrackCol;   
00329 //  RecMdcHitCol* hitcol = new RecMdcHitCol;
00330 
00331   unsigned n = _tracks.length();
00332   int nTdsTk = trkcol->size(); 
00333   for (int i =0; i < n; i++) {
00334     RecMdcTrack* trk = new RecMdcTrack;
00335     TTrack* t = _tracks[i];
00336     int trackindex = i + nTdsTk;//for combination
00337 
00338     HitRefVec  hitrefvec;
00339     AList<TMLink> hits = t->links();
00340     float chisq=0;
00341 
00342     HepPoint3D pos = t->helix().pivot();
00343     int charge = -1;
00344     HepVector m_a(5,0);
00345     m_a = t->helix().a();
00346     int statfinder=t->getFinderType();
00347     if(abs(statfinder)>1000&&brunge)statfinder=103;
00348     if(abs(statfinder)>1000&&!brunge)statfinder=3;
00349     //be cautious
00350     if(!brunge)m_a[2] = -m_a[2];
00351     if(abs(m_a[1])>999)m_a[1]=0;
00352     while(m_a[1]<0){m_a[1]+=2*pi;}
00353     while(m_a[1]>2*pi){m_a[1]-=2*pi;}  
00355     const double x0 = t->helix().pivot().x();
00356     const double y0 = t->helix().pivot().y();
00357 
00358     const double dr    =  m_a[0];
00359     const double phi0  =  m_a[1];
00360     const double kappa =  m_a[2]; 
00361     const double dz    =  m_a[3];
00362     const double tanl  =  m_a[4];
00363    
00364     const double Bz = -1000*(m_pmgnIMF->getReferField());
00365     const double alpha = 333.564095 / Bz;
00366 
00367     const double cox = x0 + dr*cos(phi0) - alpha*cos(phi0)/kappa;
00368     const double coy = y0 + dr*sin(phi0) - alpha*sin(phi0)/kappa; 
00369 
00370 
00371     unsigned nHits = t->links().length();
00372     unsigned nStereos = 0;
00373     unsigned firstLyr = 44;
00374     unsigned lastLyr = 0;
00375     for (unsigned j=0; j<nHits; j++){
00376 
00377            TMLink * l = hits[j];
00378 
00379            HepPoint3D ontrack = l->positionOnTrack();
00380            HepPoint3D onwire = l->positionOnWire();
00381            HepPoint3D dir(ontrack.y()-coy,cox-ontrack.x(),0);
00382            double pos_phi=onwire.phi();
00383            double dir_phi=dir.phi();
00384            while(pos_phi>pi){pos_phi-=pi;}
00385            while(pos_phi<0){pos_phi+=pi;}
00386            while(dir_phi>pi){dir_phi-=pi;}
00387            while(dir_phi<0){dir_phi+=pi;}
00388            double entrangle=dir_phi-pos_phi;
00389            while(entrangle>pi/2)entrangle-=pi;
00390            while(entrangle<(-1)*pi/2)entrangle+=pi; 
00391            
00392            //jialk setFltLen to tds
00393             int imass = 3;
00394             float tl = t->helix().a()[4];
00395             float f = sqrt(1. + tl * tl);
00396             float s = fabs(t->helix().curv()) * fabs(l->dPhi()) * f;
00397             float p = f / fabs(t->helix().a()[2]);
00398             float Mass[5] = {0.000511,0.105,0.140,0.493677,0.98327};
00399             double tof = s/29.98*sqrt(1.0+(Mass[imass-1]/p)*(Mass[imass-1]/p));
00400             
00401            RecMdcHit*  hit = new RecMdcHit;
00402            hit->setId(l->hit()->reccdc()->id);
00403 //         hit->setTrkId(i);
00404            hit->setTrkId(trackindex); //for combination
00405            hit->setDriftDistLeft(l->drift(0));
00406            hit->setDriftDistRight(l->drift(1));
00407            hit->setErrDriftDistLeft(l->dDrift(0));
00408            hit->setErrDriftDistRight(l->dDrift(1));
00409            hit->setChisqAdd(l->pull());
00410            hit->setFlagLR(l->leftRight());
00411          //  hit->setStat(l->hit()->state());
00412            hit->setStat(1);
00413          //  std::cout<<"state :"<< l->hit()->state() << std::endl;
00414            hit->setAdc(l->hit()->reccdc()->adc);
00415 //           hit->setTdc((l->hit()->reccdc()->tdc + t0bes)/0.09375); //jialk
00416            hit->setTdc(l->hit()->reccdc()->timechannel);
00417            hit->setFltLen(tof * 30);//jialk 
00418           // std::cout<<"tdc :"<< l->hit()->reccdc()->tdc <<"  "<<"t0bes : "<< t0bes <<std::endl;
00419            if(cal){hit->setDoca(l->distancenew());} 
00420        else{hit->setDoca(l->distance());}
00421            hit->setZhit(l->positionOnTrack().z());
00422            
00424            hit->setEntra(entrangle);
00425            hit->setDriftT(l->getDriftTime());
00426            
00427 
00428            Identifier hitIdf = MdcID:: wire_id(l->wire()->layerId(),l->wire()->localId());
00429            hit->setMdcId(hitIdf);          
00430            hitcol->push_back(hit);
00431 
00432            SmartRef<RecMdcHit> refhit(hit);
00433            hitrefvec.push_back(refhit);           
00434            chisq += l->pull();
00435            if(l->wire()->stereo()) ++nStereos;
00436            if(firstLyr > l->wire()->layerId()) firstLyr = l->wire()->layerId();
00437            if(lastLyr < l->wire()->layerId()) lastLyr = l->wire()->layerId();
00438     }
00439 
00440     
00441     HepSymMatrix m_ea = t->helix().Ea();
00442     double errorMat[15];
00443     int k = 0;
00444     for (int ie = 0 ; ie < 5 ; ie ++){
00445       for (int je = ie ; je < 5 ; je ++) {
00446         errorMat[k] = m_ea[ie][je];
00447         k++;
00448       }
00449     }
00450 
00451     trk->setTrackId(trackindex);
00452     trk->setHelix(m_a);
00453     trk->setPxy(t->pt());
00454     trk->setPx(t->pt() * (-sin(t->helix().phi0())));
00455     trk->setPy(t->pt() * cos(t->helix().phi0()));
00456     trk->setPz(t->pz());
00457     trk->setP(t->ptot());
00458 
00459         //jialk
00460         double theta = acos((t->pz())/t->ptot());
00461         trk->setTheta(theta);
00462 
00463     double poca_dr = t->helix().dr();
00464     double poca_phi0 = t->helix().phi0();
00465     trk->setPhi(poca_phi0);
00466     HepPoint3D poca(pos.x()+poca_dr*cos(poca_phi0),
00467         pos.y()+poca_dr*sin(poca_phi0),
00468         pos.z()+t->helix().dz());
00469     trk->setPoca(poca);
00470     trk->setX(poca.x());
00471     trk->setY(poca.y());
00472     trk->setZ(poca.z());
00473     trk->setR(sqrt(poca.x()*poca.x() + poca.y()*poca.y()));
00474     trk->setPivot(pos);
00475     trk->setVX0(pos.x());
00476     trk->setVY0(pos.y());
00477     trk->setVZ0(pos.z());
00478     
00479     trk->setError(m_ea);
00480 //    trk->setError(errorMat);   //...............2
00481 
00482 //    double poca_dr = t->helix().dr();
00483 //    double poca_phi0 = t->helix().phi0();
00484 //    HepPoint3D poca(poca_dr*cos(poca_phi0),poca_dr*sin(poca_phi0),t->helix().dz()); 
00485 //    trk->setVX0(pos.x()+poca_dr*cos(poca_phi0));
00486 //    trk->setVY0(pos.y()+poca_dr*sin(poca_phi0));
00487 //    trk->setVZ0(pos.z()+t->helix().dz());
00488 //    cout<<"pivot:("<<pos.x()<<","<<pos.y()<<","<<pos.z()<<")"<<endl;
00489 //    cout<<"poca:("<<trk->getVX0()<<","<<trk->getVY0()<<","<<trk->getVZ0()<<")"<<endl;
00490 
00491     trk->setChi2(chisq);
00492     trk->setNdof(nHits-5);
00493     if (t->quality() & TrackQuality2D) trk->setNdof(nHits-3);
00494 
00495     TMLink * last = OuterMost(hits);
00496     t->approach(*last);
00497     trk->setFiTerm(last->dPhi());
00498 
00499     trk->setNhits(nHits);
00500     trk->setNster(nStereos);
00501     trk->setStat(statfinder);//yzhang add stat: ConformalFinder=2, CurlFiner=3
00502     //xuqn 2013-02-26
00503     //trk->setCharge(int(t->charge())*(-1));
00504     if(!brunge) trk->setCharge(int(t->charge())*(-1));
00505     else trk->setCharge(t->charge());
00506     trk->setVecHits(hitrefvec); 
00507     trk->setFirstLayer(firstLyr);
00508     trk->setLastLayer(lastLyr);
00509     //cout<<"first: "<<firstLyr<<"  last: "<<lastLyr<<endl;
00510     trkcol->push_back(trk);
00511   } 
00512   
00513 // StatusCode trksc;
00514 // trksc = eventSvc->registerObject("/Event/Recon/RecMdcTrackCol", trkcol);
00515 // if( trksc.isFailure() ) {
00516 //   log << MSG::FATAL << "Could not register MdcTrack" << endreq;
00517 //   return trksc; 
00518 // }
00519 //
00520 // StatusCode hitsc = eventSvc->registerObject("/Event/Recon/RecMdcHitCol", hitcol);
00521 // if ( hitsc.isFailure() ) {
00522 //   log << MSG::FATAL << "Could not register MdcRecHit" << endreq;
00523 //   return hitsc;
00524 // }
00525 //log << MSG::INFO << "MdcTrackCol registered successfully!" <<endreq;
00526    
00528 #ifdef TRKRECO_DEBUG
00529   SmartDataPtr<RecMdcTrackCol> newtrkCol(eventSvc,"/Event/Recon/RecMdcTrackCol");
00530   if (!newtrkCol) { 
00531      log << MSG::FATAL << "Could not find RecMdcTrackCol" << endreq;
00532      return( StatusCode::FAILURE);
00533   }
00534   log << MSG::INFO << "Begin to check RecMdcTrackCol"<<endreq; 
00535    RecMdcTrackCol::iterator iter_trk = newtrkCol->begin();
00536    for( ; iter_trk != newtrkCol->end(); iter_trk++){
00537      const RecMdcTrack* tk = *iter_trk;
00538      std::cout<< "//==== "<<name()<<" print RecMdcTrack No."<<tk->trackId()<<" :"<< std::endl;
00539      cout <<" dr "<<tk->helix(0)
00540        <<" phi0 "<<tk->helix(1)
00541        <<" cpa "<<tk->helix(2)
00542        <<" z0 "<<tk->helix(3)
00543        <<" tanl "<<tk->helix(4)
00544        <<endl;
00545      bool printTrackDetail = true;
00546      if(printTrackDetail){
00547        std::cout<<" q "<<tk->charge() 
00548          <<" theta "<<tk->theta()
00549          <<" phi "<<tk->phi()
00550          <<" x0 "<<tk->x()
00551          <<" y0 "<<tk->y()
00552          <<" z0 "<<tk->z()
00553          <<" r0 "<<tk->r()
00554          <<endl;
00555        std::cout <<" p "<<tk->p()
00556          <<" pt "<<tk->pxy()
00557          <<" pxyz("<<tk->px()
00558          <<","<<tk->py()
00559          <<","<<tk->pz()
00560          <<")"<<endl;
00561        std::cout<<" tkStat "<<tk->stat()
00562          <<" chi2 "<<tk->chi2()
00563          <<" ndof "<<tk->ndof()
00564          <<" nhit "<<tk->getNhits()
00565          <<" nst "<<tk->nster()
00566          <<endl;
00567        bool printErrMat = true;
00568        if(printErrMat){
00569          std::cout<< "errmat   " << std::endl;
00570          for (int i=0; i<15; i++){ std::cout<< " "<<tk->err(i); }
00571          std::cout<< "   " << std::endl;
00572        }
00573      }
00574 
00575      bool printHit = true;
00576      if(printHit){
00577        int haveDigi[43][288];
00578        bool printMcTk = true;
00579        if(printMcTk) {
00580          for(int ii=0;ii<43;ii++){
00581            for(int jj=0;jj<43;jj++){
00582              haveDigi[ii][jj]=-9999;
00583            }
00584          }
00585          MdcDigiVec mdcDigiVec = m_rawDataProviderSvc->getMdcDigiVec();
00586          MdcDigiCol::iterator iter = mdcDigiVec.begin();
00587          std::cout<<name()<<"//==== "<<name()<<" print MdcDigiVec, nDigi="<<mdcDigiVec.size()<<" :"<<std::endl;
00588          for (int iDigi=0;iter!= mdcDigiVec.end(); iter++,iDigi++ ) {
00589            long l = MdcID::layer((*iter)->identify());
00590            long w = MdcID::wire((*iter)->identify());
00591            haveDigi[l][w]=(*iter)->getTrackIndex();
00592          }
00593        }
00594 
00595        int nhits = tk->getVecHits().size();
00596        std::cout<<"nHits=" <<nhits<< std::endl;
00597        cout<<"No. ";
00598        if(printMcTk) cout<<"mcTkId ";
00599        cout<<"(layer,wire,lr) stat z"<<endl;
00600        for(int ii=0; ii <nhits ; ii++){
00601          Identifier id(tk->getVecHits()[ii]->getMdcId());
00602          int layer = MdcID::layer(id);
00603          int wire = MdcID::wire(id);
00604          cout<<ii<<":";
00605          if(printMcTk) { cout<<haveDigi[layer][wire]; }
00606          cout<<" ("<<layer<<","<<wire
00607            <<","<<tk->getVecHits()[ii]->getFlagLR()
00608            <<")  "<<tk->getVecHits()[ii]->getStat()
00609            <<"  "<<tk->getVecHits()[ii]->getZhit()<< " "<<std::endl;
00610        }//end of hit list
00611        std::cout << "  "<< std::endl;
00612      }
00613        /*
00614           std::cout << "retrieved MDC track:"
00615           << "Track Id: " << (*iter_trk)->getTrkId()
00616           << "   Pivot: " << (*iter_trk)->getVX0() << " "
00617           << (*iter_trk)->getVY0() << " " << (*iter_trk)->getVZ0() 
00618           << endl
00619           << "Phi0: " << (*iter_trk)->getFi0() << "   Error of Phi0 "
00620           << (*iter_trk)->getError()(2,2) << endreq
00621           << "kappa: " << (*iter_trk)->getCpa() << "   Error of kappa "
00622           << (*iter_trk)->getError()(3,3) << endreq
00623           << "Tanl: " << (*iter_trk)->getTanl() << "   Error of Tanl "
00624           << (*iter_trk)->getError()(5,5) << endreq      
00625           << "Chisq of fit: "<< (*iter_trk)->getChisq()
00626           << "   Phi terminal: "<< (*iter_trk)->getFiTerm()
00627           << endl
00628           << "Number of hits: "<< (*iter_trk)->getNhits()
00629           << "   Number of stereo hits " << (*iter_trk)->getNster()
00630           << endreq;
00631 
00632           log << MSG::DEBUG << "hitList of this  track:" << endreq;
00633           std::vector<MdcRecHit*> gothits = (*iter_trk)->getVecHits();
00634           std::vector<MdcRecHit*>::iterator it_gothit = gothits.begin();
00635           for( ; it_gothit != gothits.end(); it_gothit++){
00636           log << MSG::DEBUG << "hits Id: "<<(*it_gothit)->getId()
00637           << "   hits DDL&DDR " <<(*it_gothit)->getDriftDistLeft()
00638           << "   hits MDC IDentifier " <<(*it_gothit)->getMdcId()
00639           << endreq      
00640           << "   hits TDC " <<(*it_gothit)->getTdc()  
00641           << "   hits ADC " <<(*it_gothit)->getAdc() << endreq;
00642           } 
00643           */
00644    }
00645 #endif
00646    return StatusCode::SUCCESS;
00647 }

void TTrackManager::mask ( void   )  const

masks hits out which are in tail of curly tracks.

Definition at line 947 of file TTrackManager.cxx.

References _fitter, _tracks, Dump(), THelixFitter::fit(), genRecEmupikp::i, ganga-rec::j, maskCurl(), maskMultiHits(), maskNormal(), name(), NHits(), SameLayer(), t(), TrackTypeCurl, TrackTypeNormal, and Width().

Referenced by TrkReco::execute().

00947                               {
00948 #ifdef TRKRECO_DEBUG_DETAIL
00949   std::cout << name() << " ... masking" << std::endl;
00950 #endif
00951 
00952   unsigned n = _tracks.length();
00953   for (unsigned i = 0; i < n; i++) {
00954     TTrack & t = * _tracks[i];
00955 
00956     //...Skip if no core...
00957     //   This should not be happend...
00958     if (! t.cores().length()) continue;
00959 
00960     //...Counts # of hits per layer...
00961     unsigned nHits[43];
00962     NHits(t.cores(), nHits);
00963 
00964     //...Check each layer...
00965     bool needMask = false;
00966     for (unsigned j = 0; j < 43; j++) {
00967       if (nHits[j] > 1) {
00968         AList<TMLink> linksInLayer = SameLayer(t.links(), j);
00969         if (Width(linksInLayer) > 2) {
00970           needMask = true;
00971 
00972 #ifdef TRKRECO_DEBUG_DETAIL
00973           Dump(linksInLayer, "sort", "    -->");
00974 #endif      
00975           break;
00976         }
00977       }
00978     }
00979     if (! needMask) continue;
00980 
00981 #ifdef TRKRECO_DEBUG_DETAIL
00982     std::cout << "    trk" << i << "(id is tmp) needs mask" << std::endl;
00983     std::cout << "        type = " << t.type() << std::endl;
00984 #endif  
00985 
00986     //...Switch by track type...
00987     switch (t.type()) {
00988       case TrackTypeNormal:
00989         maskNormal(t);
00990         maskMultiHits(t);
00991         break;
00992       case TrackTypeCurl:
00993         maskCurl(t);
00994         maskMultiHits(t);
00995         break;
00996       default:
00997         break;
00998     }
00999 
01000     //...Refit...
01001     // refit() ???
01002     _fitter.fit(t);
01003 
01004 #ifdef TRKRECO_DEBUG_DETAIL
01005     std::cout << "    masking result : ";
01006     t.dump("detail sort", "    ");
01007 #endif
01008   }
01009 }

void TTrackManager::maskBadHits ( const AList< TTrack > &  ,
float  maxSigma2 
) [static]

masks hits with large chisq as associated hits. Pull in TMLink is used.

Definition at line 2487 of file TTrackManager.cxx.

References genRecEmupikp::i, ganga-rec::j, t(), and WireHitInvalidForFit.

Referenced by TConformalFinder::doit().

02487                                                                         {
02488 #ifdef TRKRECO_DEBUG
02489   std::cout << "... trkmgr::maskBadHits" << std::endl;
02490 #endif          
02491 
02492   unsigned n = tracks.length();
02493   for (unsigned i = 0; i < n; i++) {
02494     TTrack & t = * tracks[i];
02495     bool toBeUpdated = false;
02496     const AList<TMLink> links = t.links();
02497     unsigned nHits = links.length();
02498     for (unsigned j = 0; j < nHits; j++) {
02499       if (links[j]->pull() > maxSigma2) {
02500         links[j]->hit()->state(links[j]->hit()->state() |
02501             WireHitInvalidForFit);
02502         toBeUpdated = true;
02503 #ifdef TRKRECO_DEBUG
02504         std::cout << "    " << t.name() << " : ";
02505         std::cout << links[j]->wire()->name() << "(pull=";
02506         std::cout << links[j]->pull() << ") is masked" << std::endl;
02507 #endif          
02508       }
02509     }
02510     if (toBeUpdated) t.update();
02511   }
02512 }

void TTrackManager::maskCurl ( TTrack  )  const

Definition at line 1237 of file TTrackManager.cxx.

References _fitter, divideByIp(), Dump(), Helix::dz(), THelixFitter::fit(), Helix, maskOut(), NSuperLayers(), ORIGIN, Helix::pivot(), TTrackBase::remove(), deljobs::start, and t().

Referenced by mask().

01237                                         {
01238 
01239   //...Divide into two tracks...
01240   AList<TMLink> l[2];
01241   TMLink & start = divideByIp(t, l);
01242   if (l[0].length() == 0) return;
01243   if (l[1].length() == 0) return;
01244 
01245 #ifdef TRKRECO_DEBUG_DETAIL
01246   std::cout << "    curl : divided by IP" << std::endl;
01247   std::cout << "    0:";
01248   Dump(l[0], "flag sort");
01249   std::cout << "    1:";
01250   Dump(l[1], "flag sort");
01251   std::cout << std::endl;
01252 #endif
01253 
01254   //...Which should be masked out ?...
01255   unsigned maskSide = 2;
01256 
01257   //...1. Check by # of super layers...
01258   if (NSuperLayers(l[0]) < NSuperLayers(l[1]))      maskSide = 0;
01259   else if (NSuperLayers(l[0]) > NSuperLayers(l[1])) maskSide = 1;
01260 #ifdef TRKRECO_DEBUG_DETAIL
01261   std::cout << "    NSuperLayers 0, 1 = " << NSuperLayers(l[0]) << ", ";
01262   std::cout << NSuperLayers(l[1]) << std::endl;
01263 #endif
01264   if (maskSide != 2) {
01265     maskOut(t, l[maskSide]);
01266     return;
01267   }
01268 
01269   //...Make two tracks...
01270   TTrack * tt[2];
01271   tt[0] = new TTrack(t);
01272   tt[1] = new TTrack(t);
01273   tt[0]->remove(l[1]);
01274   tt[1]->remove(l[0]);
01275   _fitter.fit(* tt[0]);
01276   _fitter.fit(* tt[1]);
01277   Helix h0 = Helix(tt[0]->helix());
01278   Helix h1 = Helix(tt[1]->helix());
01279 
01280   //...Check by z...
01281   h0.pivot(ORIGIN);
01282   h1.pivot(ORIGIN);
01283   if (fabs(h0.dz()) < fabs(h1.dz())) maskSide = 1;
01284   else                               maskSide = 0;
01285 
01286   delete tt[0];
01287   delete tt[1];
01288   maskOut(t, l[maskSide]);
01289   return;
01290 }

void TTrackManager::maskCurlHits ( const AList< TMDCWireHit > &  axial,
const AList< TMDCWireHit > &  stereo,
const AList< TTrack > &  tracks 
) const

masks hits on found curl tracks.

Definition at line 175 of file TTrackManager.cxx.

References genRecEmupikp::i, ganga-rec::j, q, rb::R(), s, t(), WireHitUsed, and x.

Referenced by TrkReco::execute().

00177                                                                {
00178 //...Coded by jtanaka...
00179 
00180   int i = 0;
00181   while(const TTrack *t = tracks[i++]){
00182     int j = 0;
00183     while(TMDCWireHit *a = axial[j++]){
00184       double x = t->helix().center().x() - a->xyPosition().x();
00185       double y = t->helix().center().y() - a->xyPosition().y();
00186       double r = sqrt(x*x+y*y);
00187       double R = fabs(t->helix().radius());
00188         double q = t->helix().center().x()*a->xyPosition().y() - 
00189           t->helix().center().y()*a->xyPosition().x();
00190         double qq = q*t->charge();
00191       if(R-2. < r && r < R+2. && qq > 0.){
00192         a->state(a->state() | WireHitUsed);
00193       }
00194     }
00195     j = 0;
00196     while(TMDCWireHit *s = stereo[j++]){
00197       double x = t->helix().center().x() - s->xyPosition().x();
00198       double y = t->helix().center().y() - s->xyPosition().y();
00199       double r = sqrt(x*x+y*y);
00200       double R = fabs(t->helix().radius());
00201         double q = t->helix().center().x()*s->xyPosition().y() - 
00202           t->helix().center().y()*s->xyPosition().x();
00203         double qq = q*t->charge();
00204       if(R-2.5 < r && r < R+2.5 && qq > 0.){
00205         s->state(s->state() | WireHitUsed);
00206       }
00207     }
00208   }
00209 }

void TTrackManager::maskMultiHits ( TTrack  )  const

Definition at line 1127 of file TTrackManager.cxx.

References genRecEmupikp::i, maskOut(), SameLayer(), SortByWireId(), and t().

Referenced by mask().

01127                                              {
01128 #ifdef TRKRECO_DEBUG_DETAIL
01129   std::cout << "... masking multi-hits" << std::endl;
01130 #endif
01131 
01132   if (! t.cores().length()) return;
01133   AList<TMLink> cores = t.cores();
01134   unsigned n = cores.length();
01135   bool layerLimited = false;
01136   AList<TMLink> bads;
01137 
01138   cores.sort(SortByWireId);
01139   for (unsigned i = 0; i < n; i++) {
01140     if (layerLimited) {
01141       bads.append(cores[i]);
01142       continue;
01143     }
01144     AList<TMLink> linksInLayer =
01145       SameLayer(cores, cores[i]->wire()->layerId());
01146     if (linksInLayer.length() > 3) {
01147       bads.append(cores[i]);
01148       layerLimited = true;
01149     }
01150   }
01151   maskOut(t, bads);
01152 }

void TTrackManager::maskNormal ( TTrack  )  const

Definition at line 1155 of file TTrackManager.cxx.

References _fitter, divideByIp(), THelixFitter::fit(), InnerMost(), ganga-rec::j, TMDCWire::layerId(), maskOut(), NLayers(), NSuperLayers(), TTrack::pt(), TTrackBase::remove(), deljobs::start, t(), and TMLink::wire().

Referenced by mask().

01155                                           {
01156 
01157   //...Divide into two tracks...
01158   AList<TMLink> l[2];
01159   TMLink & start = divideByIp(t, l);
01160 
01161 #ifdef TRKRECO_DEBUG_DETAIL
01162   std::cout << "    normal : divided by IP" << std::endl;
01163   std::cout << "    0=";
01164   for (unsigned j = 0; j < l[0].length(); j++) {
01165     std::cout << "," << l[0][j]->wire()->name();
01166   }
01167   std::cout << std::endl;
01168   std::cout << "    1=";
01169   for (unsigned j = 0; j < l[1].length(); j++) {
01170     std::cout << "," << l[1][j]->wire()->name();
01171   }
01172   std::cout << std::endl;
01173 #endif
01174 
01175   //...Which should be masked out ?...
01176   unsigned maskSide = 2;
01177 
01178   //...1. Check by # of super layers...
01179   if (NSuperLayers(l[0]) < NSuperLayers(l[1]))      maskSide = 0;
01180   else if (NSuperLayers(l[0]) > NSuperLayers(l[1])) maskSide = 1;
01181 #ifdef TRKRECO_DEBUG_DETAIL
01182   std::cout << "    NSuperLayers 0, 1 = " << NSuperLayers(l[0]) << ", ";
01183   std::cout << NSuperLayers(l[1]) << std::endl;
01184 #endif
01185   if (maskSide != 2) {
01186     maskOut(t, l[maskSide]);
01187     return;
01188   }
01189 
01190   //...2. Check by the inner-most layer...
01191   unsigned i0 = InnerMost(l[0])->wire()->layerId();
01192   unsigned i1 = InnerMost(l[1])->wire()->layerId();
01193   if (i0 < i1) maskSide = 1;
01194   else if (i0 > i1) maskSide = 0;
01195 #ifdef TRKRECO_DEBUG_DETAIL
01196   std::cout << "    i0, i1 = " << i0 << ", " << i1 << std::endl;
01197 #endif
01198   if (maskSide != 2) {
01199     maskOut(t, l[maskSide]);
01200     return;
01201   }
01202 
01203   //...3. Check by # of layers...
01204   if (NLayers(l[0]) < NLayers(l[1])) maskSide = 0;
01205   else if (NLayers(l[0]) > NLayers(l[1])) maskSide = 1;
01206 #ifdef TRKRECO_DEBUG_DETAIL
01207   std::cout << "    NLayers 0, 1 = " << NLayers(l[0]) << ", ";
01208   std::cout << NLayers(l[1]) << std::endl;
01209 #endif
01210   if (maskSide != 2) {
01211     maskOut(t, l[maskSide]);
01212     return;
01213   }
01214 
01215   //...4. Check by pt...
01216   if (maskSide == 2) {
01217     TTrack * tt[2];
01218     for (unsigned j = 0; j < 2; j++) {
01219       tt[j] = new TTrack(t);
01220       tt[j]->remove(l[j]);
01221       _fitter.fit(* tt[j]);
01222     }
01223     if (tt[1]->pt() > tt[0]->pt()) maskSide = 1;
01224     else                           maskSide = 0;
01225 #ifdef TRKRECO_DEBUG_DETAIL
01226     std::cout << "    pt 0 = " << tt[1]->pt() << std::endl;
01227     std::cout << "    pt 1 = " << tt[0]->pt() << std::endl;
01228 #endif      
01229     delete tt[0];
01230     delete tt[1];
01231   }
01232   maskOut(t, l[maskSide]);
01233   return;
01234 }

void TTrackManager::maskOut ( TTrack ,
const AList< TMLink > &   
) const

Definition at line 1112 of file TTrackManager.cxx.

References Dump(), genRecEmupikp::i, t(), and WireHitInvalidForFit.

Referenced by maskCurl(), maskMultiHits(), and maskNormal().

01112                                                                     {
01113   unsigned n = links.length();
01114   if (! n) return;
01115   for (unsigned i = 0; i < n; i++) {
01116     const TMDCWireHit & hit = * links[i]->hit();
01117     hit.state(hit.state() | WireHitInvalidForFit);
01118   }
01119   t._fitted = false;
01120 
01121 #ifdef TRKRECO_DEBUG_DETAIL
01122   Dump(links, "detail", "    TTrackManager::maskOut ... masking ");
01123 #endif
01124 }

double TTrackManager::maxMomentum ( double   )  [inline]

sets the max. momentum.

Definition at line 287 of file TTrackManager.h.

References _maxMomentum.

Referenced by TrkReco::initialize().

00287                                    {
00288     return _maxMomentum = a;
00289 }

void TTrackManager::merge ( void   ) 

Definition at line 1547 of file TTrackManager.cxx.

References _fitter, _tracks, TTrackBase::append(), Helix::center(), Dump(), Helix::dz(), THelixFitter::fit(), Helix, TTrack::helix(), genRecEmupikp::i, InnerMost(), ganga-rec::j, TMDCWire::layerId(), TTrackBase::links(), NSuperLayers(), ORIGIN, Helix::pivot(), TTrack::pt(), q, rb::R(), Helix::radius(), TMDCWireHit::state(), t(), TMLink::wire(), WireHitFittingValid, WireHitInvalidForFit, WireHitStereo, and x.

Referenced by TrkReco::execute().

01547                          {
01548 
01549   //...Merging...
01550   unsigned n = _tracks.length();
01551   //cout<<"tracks: "<<n<<endl;
01552   AList<TTrack> bads;
01553   unsigned * flagTrk = (unsigned *) malloc(n * sizeof(unsigned));
01554   for (unsigned i = 0; i < n; i++) flagTrk[i] = 0;
01555 
01556   //...Search a track to be merged...
01557   for (unsigned i0 = 0; i0 < n; i0++) {
01558 
01559     if (flagTrk[i0] != 0) continue;
01560     TTrack & t0 = * _tracks[i0];
01561     if (! (t0.pt() < 0.13)) continue;
01562 
01563     unsigned Noverlap(0), Nall(0);
01564     float OverlapRatioMax(-999.);
01565     unsigned MaxID(0);
01566 
01567     for (unsigned i1= 0 ; i1 < n; i1++) {
01568 
01569       if (i0 == i1 || flagTrk[i1] != 0) continue;
01570       TTrack & t1 = * _tracks[i1];
01571       if (! (t1.pt() < 0.13)) continue;
01572       Nall = t1.links().length();
01573       if (! Nall) continue;
01574 
01575       Noverlap = 0;
01576       for (unsigned j = 0; j < Nall; j++) {
01577         TMLink & l =  * t1.links()[j];
01578         const TMDCWireHit & whit =  * l.hit();
01579         double load(3.);//jialk original is 2
01580         if (whit.state() & WireHitStereo) load = 4.;//jialk original is 3
01581 
01582         double x = t0.helix().center().x() - l.positionOnTrack().x();
01583         double y = t0.helix().center().y() - l.positionOnTrack().y();
01584         double r = sqrt(x * x + y * y);
01585         double R = fabs(t0.helix().radius());
01586 
01587         if ((R - load) < r && r < (R + load)) Noverlap++;
01588       }
01589 
01590       if (! Noverlap) continue;
01591       float tmpRatio = float(Noverlap) / float(Nall);
01592 
01593       if (tmpRatio > OverlapRatioMax) {
01594         OverlapRatioMax = tmpRatio;
01595         MaxID = i1;
01596       }
01597     } 
01598     //jialk caution original is 0.8
01599     if (OverlapRatioMax < 0.7) continue;
01600 
01601     //...Mask should be done...
01602     unsigned MaskID[2] = {MaxID , i0};
01603     AList<TMLink> l[2];
01604 
01605     for( unsigned j0=0;j0<2;j0++){
01606       for( unsigned j1=0;j1< _tracks[MaskID[j0]]->nLinks();j1++){
01607         TMLink &k = * _tracks[MaskID[j0]]->links()[j1]; 
01608         l[j0].append( k );
01609       }
01610     }
01611     // _tracks[i0]->links().append( _tracks[MaxID]->links() );
01612     // _tracks[MaxID]->links().append( _tracks[i0]->links ());
01613     _tracks[i0]->append(_tracks[MaxID]->links());
01614     _tracks[MaxID]->append(_tracks[i0]->links());
01615 
01616 #ifdef TRKRECO_DEBUG_DETAIL
01617     std::cout << "    mask & merge " << std::endl;
01618     std::cout << "    0:";
01619     Dump(l[0], "flag sort");
01620     std::cout << "    1:";
01621     Dump(l[1], "flag sort");
01622     std::cout << std::endl;
01623 #endif
01624 
01625     //...Which should be masked out ?...
01626     unsigned maskSide = 2;
01627 
01628 #if 0
01629     //...0. Check by # of super layers... ( not applied now )
01630     unsigned super0 = NSuperLayers(l[0]);
01631     unsigned super1 = NSuperLayers(l[1]);
01632 
01633     if( super0 < super1 ) maskSide = 0;
01634     else if ( super0 > super1 ) maskSide = 1;
01635 
01636 #ifdef TRKRECO_DEBUG_DETAIL
01637     std::cout << "    NSuperLayers 0, 1 = " << NSuperLayers(l[0]) << ", ";
01638     std::cout << NSuperLayers(l[1]) << std::endl;
01639 #endif
01640 
01641     if (maskSide == 2) {
01642 #endif
01643 
01644       //...1. Check by the inner-most layer...
01645       unsigned inner0 = InnerMost(l[0])->wire()->layerId();
01646       unsigned inner1 = InnerMost(l[1])->wire()->layerId();
01647       if (inner0 < inner1 ) maskSide = 1;
01648       else if (inner0 > inner1) maskSide = 0;
01649 
01650       if( maskSide == 2 ){
01651 
01652         //...2. Check by dz 
01653 
01654         //...Make two tracks...
01655         TTrack * tt[2];
01656         tt[0] = new TTrack( *(_tracks[MaskID[0]]));
01657         tt[1] = new TTrack( *(_tracks[MaskID[1]]));
01658         _fitter.fit(* tt[0]);
01659         _fitter.fit(* tt[1]);
01660         Helix h0 = Helix(tt[0]->helix());
01661         Helix h1 = Helix(tt[1]->helix());
01662 
01663         //...Check dz...
01664         h0.pivot(ORIGIN);
01665         h1.pivot(ORIGIN);
01666         if (fabs(h0.dz()) < fabs(h1.dz())) maskSide = 1;
01667         else                               maskSide = 0;
01668 
01669         delete tt[0];
01670         delete tt[1];
01671       }
01672 #if 0
01673     }
01674 #endif
01675     bads.append(_tracks[MaskID[maskSide]]);
01676     flagTrk[MaskID[maskSide]] = 1;
01677   }
01678 
01679   //cout<<"bads: "<<bads.length()<<endl;
01680   _tracks.remove(bads);
01681 
01682   //*****  Masking *****
01683   n = _tracks.length();
01684 
01685   for( unsigned i=0;i<n;i++){
01686     TTrack & t = * _tracks[i];
01687     for( unsigned j=0;j<t.links().length();j++){
01688       TMLink & l =  * t.links()[j];
01689       const TMDCWireHit & whit =  * l.hit();
01690 
01691       if( !(whit.state() & WireHitFittingValid) ) continue;
01692 
01693       // within half circle or not?
01694       double q = t.helix().center().x() * l.positionOnTrack().y() - 
01695         t.helix().center().y() * l.positionOnTrack().x();
01696       double qq =  q *t.charge();
01697 
01698       if( qq > 0 ) whit.state(whit.state() & ~WireHitInvalidForFit);
01699       else         whit.state(whit.state() | WireHitInvalidForFit);
01700     }
01701   }
01702 
01703   free(flagTrk);
01704 }

float TTrackManager::minimum ( float  y0,
float  y1,
float  y2 
) const [private]

Definition at line 1540 of file TTrackManager.cxx.

References STEP, and X1.

Referenced by T0().

01540                                                          {
01541   float xMin = X1 + 0.5 * STEP * (y0 - y2) / (y0 + y2 - 2. * y1);
01542   return xMin;
01543 }

void TTrackManager::movePivot ( void   ) 

moves pivot of tracks.

Definition at line 843 of file TTrackManager.cxx.

References _tracksAll, genRecEmupikp::i, and nameTracks().

Referenced by finish().

00843                              {
00844   unsigned n = _tracksAll.length();
00845   //  unsigned n = _tracks.length();
00846   for (unsigned i = 0; i < n; i++) {
00847     if (_tracksAll[i]->nLinks()) _tracksAll[i]->movePivot();
00848     //  if (_tracks[i]->nLinks()) _tracks[i]->movePivot();
00849   }
00850   nameTracks();
00851 }

std::string TTrackManager::name ( void   )  const [inline]

returns name.

Definition at line 263 of file TTrackManager.h.

References deljobs::string.

Referenced by finish(), makeTds(), mask(), refit(), and salvage().

00263                               {
00264     return std::string("Track Manager");
00265 }

void TTrackManager::nameTracks ( void   )  [private]

names tracks.

Definition at line 1012 of file TTrackManager.cxx.

References _tracks, _tracksAll, genRecEmupikp::i, n1, and t().

Referenced by movePivot().

01012                               {
01013   unsigned n = _tracks.length();
01014   for (unsigned i = 0; i < n; i++) {
01015     TTrack & t = * _tracks[i];
01016     t._name = "trk" + itostring(i) + "(" + t._name + ")";
01017   }
01018   AList<TTrack> tmp = _tracksAll;
01019   tmp.remove(_tracks);
01020   unsigned n1 = tmp.length();
01021   for (unsigned i = 0; i < n1; i++) {
01022     TTrack & t = * tmp[i];
01023     t._name = "trk" + itostring(i + n)  + "(" + t._name + ")";
01024   }
01025 }

float TTrackManager::paraT0 ( void   )  const [inline]

Definition at line 320 of file TTrackManager.h.

References _t0.

Referenced by TrkReco::execute().

00320                                 {
00321   return _t0;
00322 }

void TTrackManager::refit ( void   ) 

refits tracks.

Definition at line 904 of file TTrackManager.cxx.

References _fitter, _tracks, showlog::err, THelixFitter::fit(), genRecEmupikp::i, name(), and t().

Referenced by finish().

00904                          {
00905 #ifdef TRKRECO_DEBUG_DETAIL
00906   std::cout << name() << " ... refitting" << std::endl;
00907 #endif
00908   unsigned n = _tracks.length();
00909   AList<TTrack> bads;
00910   for (unsigned i = 0; i < n; i++) {
00911     TTrack & t = * _tracks[i];
00912     int err;
00913     err = _fitter.fit(t);
00914     if (err < 0) {
00915       bads.append(t);
00916 #ifdef TRKRECO_DEBUG_DETAIL
00917       std::cout << "    " << t.name();
00918       std::cout << " rejected because of fitting failure" << std::endl;
00919 #endif
00920       continue;
00921     }
00922     t.refine(30. * 10.);
00923     err = _fitter.fit(t);
00924     if (err < 0) {
00925       bads.append(t);
00926 #ifdef TRKRECO_DEBUG_DETAIL
00927       std::cout << "    " << t.name();
00928       std::cout << " rejected because of fitting failure" << std::endl;
00929 #endif
00930       continue;
00931     }
00932     t.refine(30. * 1.);
00933     err = _fitter.fit(t);
00934     if (err < 0) {
00935       bads.append(t);
00936 #ifdef TRKRECO_DEBUG_DETAIL
00937       std::cout << "    " << t.name();
00938       std::cout << " rejected because of fitting failure" << std::endl;
00939 #endif
00940       continue;
00941     }
00942   }
00943   _tracks.remove(bads);
00944 }

void TTrackManager::removeHitsAcrossOverIp ( AList< TMLink > &   )  const

Definition at line 1072 of file TTrackManager.cxx.

References cross(), genRecEmupikp::i, ganga-rec::j, and w.

01072                                                              {
01073 
01074   //...Calculate average phi...
01075   unsigned n = l.length();
01076   float phiSum = 0.;
01077   for (unsigned i = 0; i < n; i++) {
01078     const TMDCWire & w = * l[i]->hit()->wire();
01079     unsigned j = w.localId();
01080     unsigned nWire = w.layer()->nWires();
01081 
01082     float phi = (float) j / (float) nWire;
01083     phiSum += phi;
01084   }
01085   float average = phiSum / (float) n;
01086 
01087   AList<TMLink> cross;
01088   for (unsigned i = 0; i < n; i++) {
01089     const TMDCWire & w = * l[i]->hit()->wire();
01090     unsigned j = w.localId();
01091     unsigned nWire = w.layer()->nWires();
01092 
01093     float phi = (float) j / (float) nWire;
01094     float dif = fabs(phi - average);
01095     if (dif > 0.5) dif = 1. - dif;
01096 
01097     if (dif > 0.3) cross.append(l[i]);
01098   }
01099   l.remove(cross);
01100 
01101 #ifdef TRKRECO_DEBUG_DETAIL
01102   std::cout << "    Cross over IP reduction : ";
01103   for (unsigned i = 0; i < cross.length(); i++) {
01104     std::cout << cross[i]->wire()->name() << ",";
01105   }
01106   std::cout << std::endl;
01107 #endif
01108 }

void TTrackManager::salvage ( const AList< TMDCWireHit > &   )  const

salvages remaining hits.

Definition at line 212 of file TTrackManager.cxx.

References _tracks, TTrackBase::appendByApproach(), closest(), TTrack::finder(), genRecEmupikp::i, name(), TrackTrackManager, and WireHitUsed.

Referenced by TrkReco::execute().

00212                                                             {
00213 
00214 #ifdef TRKRECO_DEBUG_DETAIL
00215     std::cout << name() << " ... salvaging" << std::endl;
00216     std::cout << "    # of given hits=" << hits.length() << std::endl;
00217 #endif
00218 
00219     //...Check arguments...
00220     unsigned nTracks = _tracks.length();
00221     if (nTracks == 0) return;
00222     unsigned nHits = hits.length();
00223     if (nHits == 0) return;
00224 
00225     //...Hit loop...
00226     for (unsigned i = 0; i < nHits; i++) {
00227         TMDCWireHit & h = * hits[i];
00228 
00229         //...Already used?...
00230         if (h.state() & WireHitUsed) continue;
00231 #ifdef TRKRECO_DEBUG_DETAIL
00232         std::cout << "    checking " << h.wire()->name() << std::endl;
00233 #endif
00234 
00235         //...Select the closest track to a hit...
00236         TTrack * best = closest(_tracks, h);
00237 #ifdef TRKRECO_DEBUG_DETAIL
00238         if (! best) {
00239             std::cout << "        no track candidate returned";
00240             std::cout << "by TTrackManager::closest" << std::endl;
00241         }
00242 #endif
00243         if (! best) continue;
00244 
00245         //...Try to append this hit...
00246         AList<TMLink> link;
00247         link.append(new TMLink(0, & h));
00248         best->appendByApproach(link, 30.);
00249         // best->assign(WireHitConformalFinder);
00250         best->finder(TrackTrackManager);
00251     }
00252 }

void TTrackManager::salvageAssociateHits ( const AList< TMDCWireHit > &  ,
float  maxSigma2 
)

salvages hits for dE/dx(not for track fitting).

Definition at line 2378 of file TTrackManager.cxx.

References _associateHits, _tracks, TTrackBase::append(), TPoint2D::cross(), TMDCWireHit::dDrift(), TMLink::distance(), TMDCWireHit::drift(), showlog::err, TMLink::hit(), genRecEmupikp::i, ganga-rec::j, TTrack::name(), TMLink::pull(), t(), WireHitInvalidForFit, WireHitUsed, and x.

02379                      {
02380   //#define TRKRECO_DEBUG
02381   //#define TRKRECO_DEBUG_DETAIL
02382 
02383 #ifdef TRKRECO_DEBUG
02384   std::cout << "... trkmgr::salvaging associate hits" << std::endl;
02385   std::cout << "    # of given hits=" << hits.length() << std::endl;
02386 #endif
02387 
02388   //...Check arguments...
02389   unsigned nTracks = _tracks.length();
02390   if (nTracks == 0) return;
02391   unsigned nHits = hits.length();
02392   if (nHits == 0) return;
02393 
02394   static const TPoint2D o(0., 0.);
02395 
02396   //...Hit loop...
02397   for (unsigned i = 0; i < nHits; i++) {
02398     TMDCWireHit & h = * hits[i];
02399 
02400     //...Already used?...
02401     if (h.state() & WireHitUsed) continue;
02402 #ifdef TRKRECO_DEBUG_DETAIL
02403     std::cout << "    checking " << h.wire()->name();
02404 #endif
02405 
02406     //...Track loop...
02407     AList<TMLink> toBeDeleted;
02408     TMLink * best = NULL;
02409     TTrack * bestTrack = NULL;
02410     for (unsigned j = 0; j < nTracks; j++) {
02411       TTrack & t = * _tracks[j];
02412 
02413       //...Pre-selection...
02414       TPoint2D c = t.center();
02415       TPoint2D co = - c;
02416       TPoint2D x = h.wire()->xyPosition();
02417 
02418 #ifdef TRKRECO_DEBUG_DETAIL
02419       std::cout << " : c= " << co.cross(x - c) * t.charge();
02420       std::cout << ", d=" << fabs((x - c).mag() - fabs(t.radius()));
02421 #endif
02422 
02423       if (co.cross(x - c) * t.charge() > 0.)
02424         continue;
02425       if (fabs((x - c).mag() - fabs(t.radius())) > 5.)
02426         continue;
02427 
02428       //...Try to append this hit...
02429       TMLink & link = * new TMLink(0, & h);
02430       int err = t.approach(link);
02431       if (err < 0) {
02432 #ifdef TRKRECO_DEBUG_DETAIL
02433         std::cout << " : " << t.name() << " approach failure";
02434 #endif
02435         toBeDeleted.append(link);
02436         continue;
02437       }
02438 
02439       //...Calculate sigma...
02440       float distance = link.distance();
02441       float diff = fabs(distance - link.hit()->drift());
02442       float sigma = diff / link.hit()->dDrift();
02443       link.pull(sigma * sigma);
02444 
02445 #ifdef TRKRECO_DEBUG_DETAIL
02446       std::cout << " : " << t.name() << " pull = " << link.pull();
02447 #endif
02448       if (link.pull() > maxSigma2) {
02449         toBeDeleted.append(link);
02450         continue;
02451       }
02452 
02453       if (best) {
02454         if (best->pull() > link.pull()) {
02455           toBeDeleted.append(best);
02456           best = & link;
02457           bestTrack = & t;
02458         }
02459         else {
02460           toBeDeleted.append(link);
02461         }
02462       }
02463       else {
02464         best = & link;
02465         bestTrack = & t;
02466       }
02467     }
02468 
02469     if (best) {
02470       bestTrack->append(* best);
02471       best->hit()->state(best->hit()->state() | WireHitInvalidForFit);
02472       _associateHits.append(best);
02473 #ifdef TRKRECO_DEBUG
02474       std::cout << "    " << best->hit()->wire()->name();
02475       std::cout << " -> " << bestTrack->name() << std::endl;
02476 #endif
02477     }
02478     HepAListDeleteAll(toBeDeleted);
02479 
02480 #ifdef TRKRECO_DEBUG_DETAIL
02481     std::cout << std::endl;
02482 #endif
02483   }
02484 }

void TTrackManager::saveMCTables ( void   )  const

stores MC track info. into Panther table.

Definition at line 797 of file TTrackManager.cxx.

References _tracksFinal, TTrackMC::charge(), MdcRec_mctrk::charge, TTrackHEP::gen(), MdcRecMctrk2hepCol::getMdcRecMctrk2hepCol(), MdcRecMctrkCol::getMdcRecMctrkCol(), MdcRecTrkCol::getMdcRecTrkCol(), MdcRec_mctrk::hep, TTrackMC::hep(), MdcRec_mctrk2hep::hep, genRecEmupikp::i, ganga-rec::j, MdcRec_mctrk::ptFrac, TTrackMC::ptFraction(), MdcRec_mctrk::pzFrac, TTrackMC::pzFraction(), TTrackMC::quality(), MdcRec_mctrk::quality, t(), MdcRec_mctrk2hep::trk, MdcDat_mcwirhit::trk, MdcRec_mctrk2hep::wir, TTrackMC::wireFraction(), TTrackMC::wireFractionHEP(), MdcRec_mctrk::wirFrac, and MdcRec_mctrk::wirFracHep.

00797                                       {
00798   unsigned n = _tracksFinal.length();
00799   for (unsigned i = 0; i < n; i++) {
00800     const TTrack & t = * _tracksFinal[i];
00801 
00802     //  struct reccdc_trk * r;
00803     //  r = (struct reccdc_trk *) BsGetEnt(RECMDC_TRK, i + 1, BBS_No_Index);
00804     MdcRec_trk* r = &(*MdcRecTrkCol::getMdcRecTrkCol())[i];
00805 
00806     //...Set type...
00807 
00808     //...Hit loop...
00809     const AList<TMLink> & hits = t.finalHits();
00810     unsigned nHits = hits.length();
00811     for (unsigned j = 0; j < nHits;  j++) {
00812       TMLink * l = hits[j];
00813       MdcRec_wirhit * h = l->hit()->reccdc();
00814       MdcDat_mcwirhit * m = l->hit()->mc()->datcdc();
00815       m->trk = r;
00816       //            struct reccdc_mctrk2hep * c;
00817       //            c = (struct reccdc_mctrk2hep *) BsNewEnt(RECMDC_MCTRK2HEP);
00818       MdcRec_mctrk2hep* c =  new MdcRec_mctrk2hep;
00819       MdcRecMctrk2hepCol::getMdcRecMctrk2hepCol()->push_back(*c);
00820       c->wir = h;
00821       c->trk = r;
00822       c->hep = l->hit()->mc()->hep()->gen();
00823     }
00824 
00825     const TTrackMC * const mc = t.mc();
00826     //  struct reccdc_mctrk * m;
00827     //  m = (struct reccdc_mctrk *) BsNewEnt(RECMDC_MCTRK);
00828     // //       MdcRec_mctrk* m = &(*MdcRecMctrkCol::getMdcRecMctrkCol())[0];
00829     MdcRec_mctrk* m = new MdcRec_mctrk;
00830     MdcRecMctrkCol::getMdcRecMctrkCol()->push_back(*m);
00831     m->wirFrac = mc->wireFraction();
00832     m->wirFracHep = mc->wireFractionHEP();
00833     m->charge = mc->charge();
00834     m->ptFrac = mc->ptFraction();
00835     m->pzFrac = mc->pzFraction();
00836     m->quality = mc->quality();
00837     if (mc->hep()) m->hep = mc->hep()->gen();
00838     else           m->hep = 0;
00839   }
00840 }

void TTrackManager::saveTables ( void   ) 

stores track info. into Panther table.

Definition at line 652 of file TTrackManager.cxx.

References TTrackManager::summary::_nEvents, TTrackManager::summary::_nTracks, TTrackManager::summary::_nTracks2D, TTrackManager::summary::_nTracksAll, TTrackManager::summary::_nTracksFinal, _s, _tracks, _tracks2D, _tracksAll, _tracksFinal, MdcRec_trk::chiSq, copyTrack(), MdcRec_trk_add::decision, showlog::err, MdcRecTrkAddCol::getMdcRecTrkAddCol(), genRecEmupikp::i, MdcRec_trk::id, MdcRec_trk_add::kind, MdcRec_trk::ndf, MdcRec_trk_add::quality, MdcRec_trk_add::stat, MdcRec_trk::stat, t(), TrackDump(), and TrackQuality2D.

00652                               {
00653 #ifdef TRKRECO_DEBUG
00654   std::cout << "TTrackManager::saveTables ... # 3D tracks=" << _tracks.length()
00655     << ", # 2D tracks=" << _tracks2D.length()
00656     << ", all tracks=" << _tracksAll.length() << std::endl;
00657 #endif
00658 
00659   //...For 3D tracks...
00660   AList<TTrack> badTracks;
00661   unsigned n = _tracks.length();
00662   unsigned * id = (unsigned *) malloc(n * sizeof(unsigned));
00663   //    bzero((char *) id, n * sizeof(unsigned));
00664   memset((char *) id, 0, n * sizeof(unsigned));
00665   for (unsigned i = 0; i < n; i++) {
00666     TTrack & t = * _tracks[i];
00667     if (! t.nLinks()) {
00668       badTracks.append((TTrack &) t);
00669       continue;
00670     }
00671 
00672     //...Copy track parameters...
00673     MdcRec_trk * r = 0;
00674     MdcRec_trk_add * a = 0;
00675     int err = copyTrack(t, & r, & a);
00676     if (err) {
00677       badTracks.append(t);
00678       continue;
00679     }
00680     _tracksFinal.append(t);
00681 
00682     //...Type and quality...
00683     id[i] = r->id;
00684     r->stat = t.state();
00685     a->kind = t.type();
00686     a->decision = t.finder();
00687     a->stat = t.fitting();
00688     //          if (a->m_kind == TrackTypeCosmic) {
00689     //              a->m_quality = TrackQualityCosmic;
00690     //          }
00691     //          if (t.daughter() && (_tracks.index(t.daughter()) >= 0))
00692     //              a->m_daughter = _tracks.index(t.daughter()) + 1;
00693 
00694   }
00695 
00696   //...Daughter treatment...
00697   for (unsigned i = 0; i < n; i++) {
00698 
00699 #ifdef TRKRECO_DEBUG_DETAIL
00700     std::cout << "id[" << i << "]=" << id[i] << std::endl;
00701 #endif
00702     if (! (id[i])) continue;
00703     if (! (_tracks[i]->daughter())) continue;
00704 
00705     int dId = _tracks.index(_tracks[i]->daughter());
00706 
00707 #ifdef TRKRECO_DEBUG_DETAIL
00708     std::cout << "    dId=" << dId;
00709     if (dId >= 0) std::cout << ", id[dId]=" << id[dId];
00710     std::cout << std::endl;
00711 #endif
00712 
00713     if (dId >= 0) {
00714       if (id[dId]) {
00715         //              reccdc_trk_add * a = (reccdc_trk_add *)
00716         //                  BsGetEnt(RECMDC_TRK_ADD, id[i], BBS_No_Index);
00717         //              a->m_daughter = id[dId];
00718         MdcRec_trk_add* a = &(*MdcRecTrkAddCol::getMdcRecTrkAddCol())[i];
00719       }
00720     }
00721   }
00722   free(id);
00723 
00724   //...Remove bad tracks...
00725   _tracks.remove(badTracks);
00726   badTracks.removeAll();
00727 
00728   //...For 2D tracks...
00729   n = _tracks2D.length();
00730   for (unsigned i = 0; i < n; i++) {
00731     TTrack & t = * _tracks2D[i];
00732 
00733     //...Copy track parameters...
00734     MdcRec_trk * r = 0;
00735     MdcRec_trk_add * a = 0;
00736     int err = copyTrack(t, & r, & a);
00737     if (err) {
00738 #ifdef TRKRECO_DEBUG
00739       std::cout << "TTrackManager::saveTables !!! bad 2D tracks found"
00740         << " : err=" << err << std::endl
00741         << TrackDump(t) << std::endl;
00742 #endif
00743       badTracks.append(t);
00744       continue;
00745     }
00746     _tracksFinal.append(t);
00747 
00748     //...Reset helix parameter...
00749     //          r->m_helix[3] = 0.;
00750     //          r->m_helix[4] = 0.;
00751     //          r->m_nhits -= r->m_nster;
00752     //          r->m_nster = 0;
00753 
00754     //...Table filling...
00755     r->stat = t.state();
00756     a->kind = t.type();
00757     a->decision = t.finder();
00758     // a->m_quality = t.quality();
00759     a->quality = TrackQuality2D;
00760     a->stat = t.fitting();
00761 
00762 #ifdef TRKRECO_DEBUG
00763     if ((r->ndf == 0) && (r->chiSq > 0.)) {
00764       std::cout << "TTrackManager::saveTables !!! chisq>0 with ndf=0."
00765         << std::endl
00766         << "    Here is a track dump"
00767         << "    " << TrackDump(t) << std::endl;
00768       t.dump("detail");
00769     }
00770     if ((r->ndf > 0) && (r->chiSq == 0.)) {
00771       std::cout << "TTrackManager::saveTables !!! chisq=0 with ndf>0."
00772         << std::endl
00773         << "    Here is a track dump"
00774         << "    " << TrackDump(t) << std::endl;
00775       t.dump("detail");
00776     }
00777 
00778     if (r->ndf == 0)
00779       std::cout << "TTrackManager::saveTables ... ndf = 0" << std::endl
00780         << "    " << TrackDump(t) << std::endl;
00781     if (r->chiSq == 0.)
00782       std::cout << "TTrackManager::saveTables ... chisq = 0" << std::endl
00783         << "    " << TrackDump(t) << std::endl;
00784 #endif
00785   }
00786   _tracks2D.remove(badTracks);
00787 
00788   //...Statistics...
00789   ++_s->_nEvents;
00790   _s->_nTracks += _tracks.length();
00791   _s->_nTracksAll += _tracksAll.length();
00792   _s->_nTracks2D += _tracks2D.length();
00793   _s->_nTracksFinal += _tracksFinal.length();
00794 }

AList< TTrack > TTrackManager::selectGoodTracks ( const AList< TTrack > &  ,
bool  track2D = false 
) const [private]

checks track quality.

Definition at line 2555 of file TTrackManager.cxx.

References _debugLevel, _maxMomentum, goodTrack(), genRecEmupikp::i, t(), and TrackDump().

Referenced by append(), and append2D().

02556                         {
02557   AList<TTrack> goodTracks;
02558   unsigned n = list.length();
02559   for (unsigned i = 0; i < n; i++) {
02560     const TTrack & t = * list[i];
02561     if (! goodTrack(t, track2D)) continue;
02562 
02563     //...Remove super momentum...
02564     if (_maxMomentum > 0.) {
02565       if (t.ptot() > _maxMomentum) {
02566         //              ++_s->_nSuperMoms;
02567         continue;
02568       }
02569     }
02570 
02571     goodTracks.append((TTrack &) t);
02572   }
02573 
02574   if (_debugLevel) {
02575     if (list.length() != goodTracks.length()) {
02576       std::cout << "TTrackManager::selectGoodTracks ... bad tracks found"
02577         << std::endl
02578         << "                                    # of bad tracks = "
02579         << list.length() - goodTracks.length()
02580         << " : 2D flag = " << track2D << std::endl;
02581       AList<TTrack> tmp;
02582       tmp.append(list);
02583       tmp.remove(goodTracks);
02584       std::cout << "    Track dump" << std::endl;
02585       for (unsigned i = 0; i < tmp.length(); i++) {
02586         std::cout << "    " << TrackDump(* tmp[i]) << std::endl;
02587       }
02588     }
02589   }
02590 
02591   return goodTracks;
02592 }

void TTrackManager::setCurlerFlags ( void   ) 

tests for curlers.

Definition at line 2341 of file TTrackManager.cxx.

References _nCurlerMergeTest, TTrackManager::summary::_nToBeMergedMoreThanTwo, _s, _sigmaCurlerMergeTest, _tracks, genRecEmupikp::i, ganga-rec::j, n1, and TrackTypeCurl.

02341                                   {
02342   unsigned n = _tracks.length();
02343   if (n < 2) return;
02344 
02345   for (unsigned i = 0; i < n - 1; i++) {
02346     TTrack & t0 = * _tracks[i];
02347     if (t0.type() != TrackTypeCurl) continue;
02348     float c0 = t0.charge();
02349 
02350     for (unsigned j = i + 1; j < n; j++) {
02351       TTrack & t1 = * _tracks[j];
02352       float c1 = t1.charge();
02353       if (c0 * c1 > 0.) continue;
02354       if (t1.type() != TrackTypeCurl) continue;
02355 
02356       bool toBeMerged = false;
02357       unsigned n0 = t0.testByApproach(t1.cores(), _sigmaCurlerMergeTest);
02358       if (n0 > _nCurlerMergeTest) toBeMerged = true;
02359       if (! toBeMerged) {
02360         unsigned n1 = t1.testByApproach(t0.cores(),
02361             _sigmaCurlerMergeTest);
02362         if (n1 > _nCurlerMergeTest) toBeMerged = true;
02363       }
02364 
02365       if (toBeMerged) {
02366         //              ++_s->_nToBeMerged;
02367         if ((t0.daughter()) || (t1.daughter()))
02368           ++_s->_nToBeMergedMoreThanTwo;
02369         t0.daughter(& t1);
02370         t1.daughter(& t0);
02371 
02372       }
02373     }
02374   }
02375 }

void TTrackManager::sett0bes ( double  t0  )  [inline]

Definition at line 211 of file TTrackManager.h.

References t0bes.

Referenced by TrkReco::execute().

00211                          {
00212           t0bes = t0;
00213     }   

void TTrackManager::sortBanksByPt ( void   )  const

sorts RECMDC_TRK tables.

Definition at line 2012 of file TTrackManager.cxx.

References MdcRecMctrkCol::getMdcRecMctrkCol(), MdcRecTrkAddCol::getMdcRecTrkAddCol(), MdcRecTrkCol::getMdcRecTrkCol(), genRecEmupikp::i, ganga-rec::j, MdcRec_trk_add::quality, s, swapReccdc(), swapRectrk(), t(), and tagReccdc().

02012                                        {
02013 #ifdef TRKRECO_DEBUG_DETAIL
02014   std::cout << "trkmgr::sortBanksByPt : # of tracks="
02015     //   << BsCouTab(RECMDC_TRK_ADD) << std::endl;
02016     << MdcRecTrkAddCol::getMdcRecTrkAddCol()->size() << std::endl;
02017 #endif
02018 
02019   //    unsigned n = BsCouTab(RECMDC_TRK_ADD);
02020   unsigned n = MdcRecTrkAddCol::getMdcRecTrkAddCol()->size();
02021   if (n < 2) return;
02022 
02023   //...Sort RECMDC...
02024   unsigned * id = (unsigned *) malloc(n * sizeof(unsigned));
02025   for (unsigned i = 0; i < n; i++) id[i] = i;
02026   for (unsigned i = 0; i < n - 1; i++) {
02027     //  reccdc_trk & cdc0 =
02028     //      * (reccdc_trk *) BsGetEnt(RECMDC_TRK,
02029     //                                i + 1,
02030     //                                BBS_No_Index);
02031     //  reccdc_trk_add & add0 =
02032     //      * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02033     //                                    i + 1,
02034     //                                    BBS_No_Index);
02035     //  reccdc_mctrk & mc0 =
02036     //      * (reccdc_mctrk *) BsGetEnt(RECMDC_MCTRK,
02037     //                                  i + 1,
02038     //                                  BBS_No_Index);
02039     MdcRec_trk & cdc0 = (* MdcRecTrkCol::getMdcRecTrkCol())[i]; 
02040     MdcRec_trk_add & add0 = (* MdcRecTrkAddCol::getMdcRecTrkAddCol())[i];  
02041     MdcRec_mctrk & mc0 = (* MdcRecMctrkCol::getMdcRecMctrkCol())[i];  
02042 
02043     float bestPt = 1. / fabs(cdc0.helix[2]);
02044     unsigned bestQuality = add0.quality;
02045     for (unsigned j = i + 1; j < n; j++) {
02046       //            reccdc_trk & cdc1 =
02047       //                * (reccdc_trk *) BsGetEnt(RECMDC_TRK,
02048       //                                          j + 1,
02049       //                                          BBS_No_Index);
02050       //            reccdc_trk_add & add1 =
02051       //                * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02052       //                                              j + 1,
02053       //                                              BBS_No_Index);
02054       //            reccdc_mctrk & mc1 =
02055       //                * (reccdc_mctrk *) BsGetEnt(RECMDC_MCTRK,
02056       //                                            j + 1,
02057       //                                            BBS_No_Index);
02058       MdcRec_trk & cdc1 = (* MdcRecTrkCol::getMdcRecTrkCol())[j];
02059       MdcRec_trk_add & add1 = (* MdcRecTrkAddCol::getMdcRecTrkAddCol())[j];
02060       MdcRec_mctrk & mc1 = (* MdcRecMctrkCol::getMdcRecMctrkCol())[j];
02061 
02062       float pt = 1. / fabs(cdc1.helix[2]);
02063 #ifdef TRKRECO_DEBUG_DETAIL
02064       std::cout << "i,j=" << i << "," << j
02065         << " : quality i,j=" << bestQuality << ","
02066         << add1.quality << std::endl;
02067 #endif
02068       unsigned quality = add1.quality;
02069       if (quality > bestQuality) continue;
02070       else if (quality < bestQuality) {
02071         bestQuality = quality;
02072         bestPt = pt;
02073         swapReccdc(cdc0, add0, mc0, cdc1, add1, mc1);
02074         unsigned tmp = id[i];
02075         id[i] = id[j];
02076         id[j] = tmp;
02077 #ifdef TRKRECO_DEBUG_DETAIL
02078         std::cout << "swapped" << std::endl;
02079 #endif
02080         continue;
02081       }
02082 #ifdef TRKRECO_DEBUG_DETAIL
02083       std::cout << "i,j=" << i << "," << j
02084         << " : pt i,j=" << bestPt << "," << pt << std::endl;
02085 #endif
02086       if (pt > bestPt) {
02087 #ifdef TRKRECO_DEBUG_DETAIL
02088         std::cout << "swapping ... " << & cdc0 << "," << & add0 << ","
02089           << & mc0 << " <-> " << & cdc1 << "," << & add1 << ","
02090           << & mc1 << std::endl;
02091 #endif
02092         bestQuality = quality;
02093         bestPt = pt;
02094         swapReccdc(cdc0, add0, mc0, cdc1, add1, mc1);
02095         unsigned tmp = id[i];
02096         id[i] = id[j];
02097         id[j] = tmp;
02098 #ifdef TRKRECO_DEBUG_DETAIL
02099         std::cout << "swapped" << std::endl;
02100 #endif
02101       }
02102     }
02103   }
02104 #ifdef TRKRECO_DEBUG_DETAIL
02105   std::cout << "trkmgr::sortBanksByPt : first phase finished" << std::endl;
02106 #endif
02107 
02108   tagReccdc(id, n);
02109   free(id);
02110 
02111 #ifdef TRKRECO_DEBUG_DETAIL
02112   std::cout << "trkmgr::sortBanksByPt : second phase finished" << std::endl;
02113 #endif
02114 
02115 #if 0
02116   //...Sort RECTRK...
02117   n = BsCouTab(RECTRK);
02118   id = (unsigned *) malloc(n * sizeof(unsigned));
02119   for (unsigned i = 0; i < n; i++) id[i] = i;
02120   if (n > 1) {
02121     unsigned i = 0;
02122     while (i < n - 1) {
02123       rectrk & t = * (rectrk *) BsGetEnt(RECTRK, i + 1, BBS_No_Index);
02124       if (t.m_prekal == (i + 1)) {
02125         ++i;
02126         continue;
02127       }
02128 
02129       rectrk & s = * (rectrk *) BsGetEnt(RECTRK,
02130           t.m_prekal,
02131           BBS_No_Index);
02132 
02133       swapRectrk(t, s);
02134       unsigned tmp = id[i];
02135       id[i] = id[s.m_ID - 1];
02136       id[s.m_ID - 1] = tmp;
02137 
02138       //std::cout << "swap " << i + 1 << " and " << s.m_ID << std::endl;
02139 
02140       reccdc_trk_add & a =
02141         * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02142             t.m_prekal,
02143             BBS_No_Index);
02144       reccdc_trk_add & b =
02145         * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02146             s.m_prekal,
02147             BBS_No_Index);
02148       a.m_rectrk = t.m_ID;
02149       b.m_rectrk = s.m_ID;
02150     }
02151   }
02152 #else
02153   /*
02154   // jtanaka 000925 -->
02155   n = BsCouTab(RECTRK);
02156   id = (unsigned *) malloc(n * sizeof(unsigned));
02157   for (unsigned i = 0; i < n; i++) id[i] = i;
02158   int foundId = 0;
02159   while(foundId != n){
02160   rectrk & t = * (rectrk *) BsGetEnt(RECTRK, foundId + 1, BBS_No_Index);
02161   int minPrekal = t.m_prekal;
02162   int exchangeId = foundId;
02163   for(int i=foundId+1;i<n;++i){
02164   rectrk & s = * (rectrk *) BsGetEnt(RECTRK, i + 1, BBS_No_Index);
02165   if(s.m_prekal < minPrekal){
02166   minPrekal = s.m_prekal;
02167   exchangeId = i;
02168   }
02169   }
02170   if(exchangeId != foundId){
02171   rectrk & s = * (rectrk *) BsGetEnt(RECTRK,
02172   exchangeId + 1,
02173   BBS_No_Index);
02174 
02175   swapRectrk(t, s);
02176   unsigned tmp = id[t.m_ID - 1];
02177   id[t.m_ID - 1] = id[s.m_ID - 1];
02178   id[s.m_ID - 1] = tmp;
02179 
02180   reccdc_trk_add & a =
02181    * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02182    t.m_prekal,
02183    BBS_No_Index);
02184    reccdc_trk_add & b =
02185    * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02186    s.m_prekal,
02187    BBS_No_Index);
02188    a.m_rectrk = t.m_ID;
02189    b.m_rectrk = s.m_ID;
02190    }
02191    ++foundId;
02192    }
02193   // <-- jtanaka 000925
02194   */
02195 #endif
02196 
02197   tagRectrk(id, n);
02198   free(id);
02199 }

void TTrackManager::sortTracksByPt ( void   ) 

Definition at line 1883 of file TTrackManager.cxx.

References _tracks, genRecEmupikp::i, and ganga-rec::j.

01883                                   {
01884 #ifdef TRKRECO_DEBUG_DETAIL
01885   std::cout << "trkmgr::sortTracksByPt : # of tracks="
01886     << _tracks.length() << std::endl;
01887 #endif
01888 
01889   unsigned n = _tracks.length();
01890   if (n < 2) return;
01891 
01892   for (unsigned i = 0; i < n - 1; i++) {
01893     TTrack & t0 = * _tracks[i];
01894     float bestPt = t0.pt();
01895     for (unsigned j = i + 1; j < n; j++) {
01896       TTrack & t1 = * _tracks[j];
01897       float pt = t1.pt();
01898 #ifdef TRKRECO_DEBUG_DETAIL
01899       std::cout << "i,j=" << i << "," << j
01900         << " : pt i,j=" << bestPt << "," << pt << std::endl;
01901 #endif
01902       if (pt > bestPt) {
01903         bestPt = pt;
01904         _tracks.swap(i, j);
01905       }
01906     }
01907   }
01908 }

void TTrackManager::sortTracksByQuality ( void   ) 

sorts tracks.

Definition at line 1862 of file TTrackManager.cxx.

References _tracks, genRecEmupikp::i, and ganga-rec::j.

01862                                        {
01863   unsigned n = _tracks.length();
01864   if (n < 2) return;
01865 
01866   for (unsigned i = 0; i < n - 1; i++) {
01867     TTrack & t0 = * _tracks[i];
01868     float bestRChisq = HUGE_VAL;
01869     if (t0.ndf() > 0) bestRChisq = t0.chi2() / t0.ndf();
01870     for (unsigned j = i + 1; j < n; j++) {
01871       TTrack & t1 = * _tracks[j];
01872       float rChisq = HUGE_VAL;
01873       if (t1.ndf() > 0) rChisq = t1.chi2() / t1.ndf();
01874       if (rChisq < bestRChisq) {
01875         bestRChisq = rChisq;
01876         _tracks.swap(i, j);
01877       }
01878     }
01879   }
01880 }

void TTrackManager::swapReccdc ( MdcRec_trk cdc0,
MdcRec_trk_add add0,
MdcRec_mctrk mc0,
MdcRec_trk cdc1,
MdcRec_trk_add add1,
MdcRec_mctrk mc1 
) const [private]

sorts banks.

Definition at line 2202 of file TTrackManager.cxx.

References first, MdcRec_trk::helix, MdcRec_mctrk::hep, MdcRec_trk_add::quality, RECMDC_ACTUAL_SIZE, RECMDCADD_ACTUAL_SIZE, and RECMDCMC_ACTUAL_SIZE.

Referenced by sortBanksByPt().

02207                               {
02208 #define RECMDC_ACTUAL_SIZE 124
02209 #define RECMDCADD_ACTUAL_SIZE 40
02210 #define RECMDCMC_ACTUAL_SIZE 28
02211 
02212   static bool first = true;
02213   static void * swapRegion;
02214   if (first) {
02215     first = false;
02216     swapRegion = malloc(RECMDC_ACTUAL_SIZE);
02217   }
02218 
02219   void * s0 = & cdc0.helix[0];
02220   void * s1 = & cdc1.helix[0];
02221   memcpy(swapRegion, s0, RECMDC_ACTUAL_SIZE);
02222   memcpy(s0, s1, RECMDC_ACTUAL_SIZE);
02223   memcpy(s1, swapRegion, RECMDC_ACTUAL_SIZE);
02224 
02225   s0 = & add0.quality;
02226   s1 = & add1.quality;
02227   memcpy(swapRegion, s0, RECMDCADD_ACTUAL_SIZE);
02228   memcpy(s0, s1, RECMDCADD_ACTUAL_SIZE);
02229   memcpy(s1, swapRegion, RECMDCADD_ACTUAL_SIZE);
02230 
02231   if ((& mc0) && (& mc1)) {
02232     s0 = & mc0.hep;
02233     s1 = & mc1.hep;
02234     memcpy(swapRegion, s0, RECMDCMC_ACTUAL_SIZE);
02235     memcpy(s0, s1, RECMDCMC_ACTUAL_SIZE);
02236     memcpy(s1, swapRegion, RECMDCMC_ACTUAL_SIZE);
02237   }
02238 }

void TTrackManager::swapRectrk ( MdcTrk trk0,
MdcTrk tkr1 
) const [private]

Definition at line 2241 of file TTrackManager.cxx.

References first, MdcTrk::glob, and RECTRK_ACTUAL_SIZE.

Referenced by sortBanksByPt().

02242                          {
02243 #define RECTRK_ACTUAL_SIZE 84
02244 
02245   static bool first = true;
02246   static void * swapRegion;
02247   if (first) {
02248     first = false;
02249     swapRegion = malloc(RECTRK_ACTUAL_SIZE);
02250   }
02251 
02252   void * s0 = & rec0.glob[0];
02253   void * s1 = & rec1.glob[0];
02254   memcpy(swapRegion, s0, RECTRK_ACTUAL_SIZE);
02255   memcpy(s0, s1, RECTRK_ACTUAL_SIZE);
02256   memcpy(s1, swapRegion, RECTRK_ACTUAL_SIZE);
02257 }

float TTrackManager::T0 ( unsigned  n  )  [private]

returns T0 by old methode(expensive).

Definition at line 1437 of file TTrackManager.cxx.

References _cFitter, _tracks, THelixFitter::fit(), genRecEmupikp::i, ganga-rec::j, minimum(), STEP, t(), and X0.

Referenced by determineT0().

01437                             {
01438 
01439 #define X0 -10.
01440 #define X1 0.
01441 #define X2 10.
01442 #define STEP 10.
01443 
01444   //...Determine T0 for each track...
01445   float t0Sum = 0.;
01446   for (unsigned i = 0; i < n; i++) {
01447     TTrack & t = * _tracks[i];
01448     float y[3];
01449     for (unsigned j = 0; j < 3; j++) {
01450       float offset = X0 + j * STEP;
01451       _cFitter.fit(t, offset);
01452       y[j] = t.chi2();
01453     }
01454     t0Sum += minimum(y[0], y[1], y[2]);
01455   }
01456   float t0 = t0Sum / (float) n;
01457   if (isnan(t0)) t0 = 0.;
01458 
01459   //...Fit with T0 correction...
01460   n = _tracks.length();
01461   for (unsigned i = 0; i < n; i++) {
01462     TTrack & t = * _tracks[i];
01463     _cFitter.fit(t, t0);
01464   }
01465 
01466   //...Store it...
01467   //    reccdc_timing * t = (reccdc_timing *) BsNewEnt(RECMDC_TIMING);
01468   /*    MdcRec_timing* t = new MdcRec_timing;
01469         MdcRecTimingCol::getMdcRecTimingCol()->push_back(*t);
01470         t->time = - t0;
01471         t->quality = 11;
01472         */
01473   return - t0;
01474 }

float TTrackManager::T0Fit ( unsigned  n  )  [private]

returns T0 by T0 fitting.

Definition at line 1477 of file TTrackManager.cxx.

References _cFitter, _tracks, THelixFitter::fit(), genRecEmupikp::i, ganga-rec::j, t(), and w.

Referenced by determineT0().

01477                                {
01478 
01479   float tev_err;
01480   float tev_sum0= 0.;
01481   float tev_sum = 0.;
01482   float tev_sum2= 0.;
01483   float w_sum   = 0.;
01484 
01485   //sort in order of pt
01486   //    std::cout << "length=" << _tracks.length() << std::endl;
01487   const int cn=_tracks.length();
01488   float* sort = new float[cn];
01489   float ptmax_pre=1.e10;
01490   for (unsigned i = 0; i < cn; i++) {
01491     float ptmax=-999.;
01492     int   jmax;
01493     for (unsigned j = 0; j < cn; j++) {
01494       TTrack & tj = * _tracks[j];
01495       float pt = fabs(1./tj.helix().a()[2]);
01496       if( pt < ptmax_pre && pt > ptmax) {
01497         ptmax = pt;
01498         jmax  = j;
01499       }
01500       sort[i]=jmax;
01501     }
01502     ptmax_pre=ptmax;
01503   }
01504 
01505   for (unsigned i = 0; i < n; i++) {
01506     //srtbypt   TTrack & t = * _tracks[i];
01507     TTrack & t = * _tracks[sort[i]];    
01508     //float pt = fabs(1./t.helix().a()[2]);
01509     //std::cout << "pt=" << pt << endl;
01510     float tev = 0.;
01511     _cFitter.fit(t, tev, tev_err);
01512     //  std::cout << "tev,tev_err=" <<tev<< " "<<tev_err<<endl; 
01513     float w = 1. / tev_err / tev_err;
01514     tev_sum += w * tev;
01515     w_sum += w;
01516     // tev_sum0 += tev;
01517     // tev_sum2 += tev * tev;
01518   }
01519 
01520   delete [] sort;
01521 
01522   float tev_mean = tev_sum / w_sum;
01523   // float tev_err_a = 1. / sqrt(w_sum);
01524   // float tev_err_b = (tev_sum2 - tev_sum0 * tev_sum0 / (n + 1)) / n;
01525   // tev_err_b = sqrt(tev_err_b);
01526   // std::cout << "comp,t0,mean tev,err ="<<t0<<" "<<tev_mean<<" "<<tev_err_a<<" "<<tev_err_b<<std::endl;
01527   if (isnan(tev_mean)) tev_mean = 0.;
01528 
01529   //...Store it...
01530   //    reccdc_timing * tt = (reccdc_timing *) BsNewEnt(RECMDC_TIMING);
01531   //    MdcRec_timing* tt = new MdcRec_timing;
01532   //    MdcRecTimingCol::getMdcRecTimingCol()->push_back(*tt);
01533   //    tt->time = tev_mean;
01534   //    tt->quality = 151;
01535 
01536   return - tev_mean;
01537 }

void TTrackManager::tagReccdc ( unsigned *  id,
unsigned  n 
) const [private]

Definition at line 2260 of file TTrackManager.cxx.

Referenced by sortBanksByPt().

02260                                                             {
02261   /*
02262      unsigned * id = (unsigned *) malloc(nTrk * sizeof(unsigned));
02263      for (unsigned i = 0; i < nTrk; i++)
02264      id[id0[i]] = i;
02265 
02266 #ifdef TRKRECO_DEBUG_DETAIL
02267 for (unsigned i = 0; i < nTrk; i++)
02268 std::cout << "id0 " << i << " ... " << id0[i] << std::endl;
02269 for (unsigned i = 0; i < nTrk; i++)
02270 std::cout << "id  " << i << " ... " << id[i] << std::endl;
02271 #endif
02272   //    unsigned n = BsCouTab(RECMDC_TRK_ADD);
02273   //    unsigned n = MdcRecTrkAddCol::getMdcRecTrkAddCol()->size();
02274 
02275   //    for (unsigned i = 0; i < n; i++) {
02276   //    reccdc_trk_add & w = * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
02277   //                                                       i + 1,
02278   //                                                       BBS_No_Index);
02279   //    MdcRec_trk_add & w = (* MdcRecTrkAddCol::getMdcRecTrkAddCol())[i];
02280   //    if (w.mother) w.mother = id[w.mother - 1] + 1;
02281   //    if (w.daughter) w.daughter = id[w.daughter - 1] + 1;
02282   //    }
02283 
02284 #ifdef TRKRECO_DEBUG_DETAIL
02285 std::cout << "TTrackManager::tagReccdc ... RECMDC_TRK_ADD done" << std::endl;
02286 #endif
02287 
02288 n = BsCouTab(RECMDC_WIRHIT);
02289 for (unsigned i = 0; i < n; i++) {
02290 reccdc_wirhit & w = * (reccdc_wirhit *) BsGetEnt(RECMDC_WIRHIT,
02291 i + 1,
02292 BBS_No_Index);
02293 if (w.m_trk == 0) continue;
02294 w.m_trk = id[w.m_trk - 1] + 1;
02295 }
02296 
02297 #ifdef TRKRECO_DEBUG_DETAIL
02298 std::cout << "TTrackManager::tagReccdc ... RECMDC_WIRHIT done" << std::endl;
02299 #endif
02300 
02301 n = BsCouTab(DATMDC_MCWIRHIT);
02302 for (unsigned i = 0; i < n; i++) {
02303 datcdc_mcwirhit & m =
02304    * (datcdc_mcwirhit *) BsGetEnt(DATMDC_MCWIRHIT,i + 1,BBS_No_Index);
02305    if (m.m_trk == 0) continue;
02306    m.m_trk = id[m.m_trk - 1] + 1;
02307    }
02308 
02309 #ifdef TRKRECO_DEBUG_DETAIL
02310 std::cout << "TTrackManager::tagReccdc ... DATMDC_MCWIRHIT done" << std::endl;
02311 #endif
02312 
02313 n = BsCouTab(RECTRK);
02314 for (unsigned i = 0; i < n; i++) {
02315 rectrk & r = * (rectrk *) BsGetEnt(RECTRK, i + 1, BBS_No_Index);
02316 if (r.m_prekal == 0) continue;
02317 r.m_prekal = id[r.m_prekal - 1] + 1;
02318 }
02319 
02320 #ifdef TRKRECO_DEBUG_DETAIL
02321 std::cout << "TTrackManager::tagReccdc ... RECTRK done" << std::endl;
02322 #endif
02323 
02324 // jtanaka
02325 n = BsCouTab(RECMDC_SVD_TRK);
02326 for (unsigned i = 0; i < n; i++) {
02327 reccdc_svd_trk & r = * (reccdc_svd_trk *) BsGetEnt(RECMDC_SVD_TRK, i + 1, BBS_No_Index);
02328 if (r.m_cdc_trk == 0) continue;
02329 r.m_cdc_trk = id[r.m_cdc_trk - 1] + 1;
02330 }
02331 
02332 #ifdef TRKRECO_DEBUG_DETAIL
02333 std::cout << "TTrackManager::tagReccdc ... RECMDC_SVD_TRK done" << std::endl;
02334 #endif
02335 
02336 free(id);
02337 */
02338 }

void TTrackManager::tagRectrk ( unsigned *  id,
unsigned  n 
) const [private]

Definition at line 2666 of file TTrackManager.cxx.

02666                                                             {
02667   /*
02668      unsigned * id = (unsigned *) malloc(nTrk * sizeof(unsigned));
02669      for (unsigned i = 0; i < nTrk; i++)
02670      id[id0[i]] = i;
02671 
02672   //      for (unsigned i = 0; i < nTrk; i++)
02673   //            std::cout << "id0 " << i << " ... " << id0[i] << std::endl;
02674   //      for (unsigned i = 0; i < nTrk; i++)
02675   //            std::cout << "id  " << i << " ... " << id[i] << std::endl;
02676   //      BsShwDat(RECTRK_TOF);
02677 
02678   unsigned n = BsCouTab(RECTRK_TOF);
02679   for (unsigned i = 0; i < n; i++) {
02680   rectrk_tof & t = * (rectrk_tof *) BsGetEnt(RECTRK_TOF,
02681   i + 1,
02682   BBS_No_Index);
02683   if (t.m_rectrk) t.m_rectrk = id[t.m_rectrk - 1] + 1;
02684   }
02685 
02686   //      BsShwDat(RECTRK_TOF);
02687 
02688   // jtanaka
02689   n = BsCouTab(RECSVD_HIT);
02690   for (unsigned i = 0; i < n; i++) {
02691   recsvd_hit & t = * (recsvd_hit *) BsGetEnt(RECSVD_HIT,
02692   i + 1,
02693   BBS_No_Index);
02694   if (t.m_trk) t.m_trk = id[t.m_trk - 1] + 1;
02695   }
02696 
02697   free(id);
02698   */
02699 }

const AList< TTrack > & TTrackManager::tracks ( void   )  const [inline]

returns a list of reconstructed tracks.

Definition at line 269 of file TTrackManager.h.

References _tracks.

Referenced by TrkReco::execute(), and TrkReco::FillTuple().

00269                                 {
00270     return _tracks;
00271 }

const AList< TTrack > & TTrackManager::tracks2D ( void   )  const [inline]

returns a list of 2D tracks.

Definition at line 275 of file TTrackManager.h.

References _tracks2D.

Referenced by TrkReco::FillTuple().

00275                                   {
00276     return _tracks2D;
00277 }

const AList< TTrack > & TTrackManager::tracksFinal ( void   )  const [inline]

returns a list of tracks writen to MdcRec_trk.

Definition at line 314 of file TTrackManager.h.

References _tracksFinal.

Referenced by TrkReco::mcInformation(), and TrkReco::tracks().

00314                                      {
00315     return _tracksFinal;
00316 }

void TTrackManager::treatCurler ( MdcTrk curl,
MdcRec_trk_add cdc,
unsigned  flag 
) const

final decision for a curler.

Definition at line 1911 of file TTrackManager.cxx.

References MdcRec_trk::add, MdcRec_trk_add::body, MdcRec_trk_add::daughter, MdcRec_trk_add::decision, MdcTrk_localz::helix, MdcRec_trk_add::likelihood, MdcRec_trk_add::mother, MdcRec_trk_add::quality, MdcRec_trk_add::rectrk, TrackQualityOutsideCurler, TrackTrackManager, and MdcTrk::zero.

01913                          {
01914   //...Originally coded by j.tanaka...
01915 
01916   //...Check inputs...
01917   if (trk1.zero[2] == 0) return;
01918   if (cdc1.daughter == 0) return;
01919 
01920   //...The other side...
01921   //    reccdc_trk_add & cdc2 = * (reccdc_trk_add *) BsGetEnt(RECMDC_TRK_ADD,
01922   //                                                      cdc1.m_daughter,
01923   //                                                      BBS_No_Index);
01924   //    MdcRec_trk_add & cdc2 = (*MdcRecTrkAddCol::getMdcRecTrkAddCol())[cdc1.daughter.id];
01925   MdcRec_trk_add & cdc2 = * cdc1.daughter->add;
01926 
01927   if (cdc2.daughter == 0) return;
01928   if (cdc2.rectrk == 0) return;
01929   //    rectrk & trk2 = * (rectrk *) BsGetEnt(RECTRK, cdc2.m_rectrk, BBS_No_Index);
01930   MdcTrk & trk2 = * cdc2.rectrk;
01931 
01932   if (trk2.zero[2] == 0) return;
01933 
01934   //...Obtain RECTRK_LOCALZ...
01935   //    rectrk_localz & z1 = * (rectrk_localz *) BsGetEnt(RECTRK_LOCALZ,
01936   //                                                  trk1.m_zero[2],
01937   //                                                  BBS_No_Index);
01938   //    rectrk_localz & z2 = * (rectrk_localz *) BsGetEnt(RECTRK_LOCALZ,
01939   //                                                  trk2.m_zero[2],
01940   //                                                  BBS_No_Index);
01941   MdcTrk_localz & z1 = * trk1.zero[2];
01942   MdcTrk_localz & z2 = * trk2.zero[2];
01943 
01944   //...Pointer to mother and daughter...
01945   MdcRec_trk_add * mother = & cdc1;
01946   MdcRec_trk_add * daughter = & cdc2;
01947 
01948   //      //...By dr...
01949   //      if (flag == 1) {
01950   //    float dr1 = fabs(z1.m_helix[0]);
01951   //    float dr2 = fabs(z2.m_helix[0]);
01952   //    if (dr1 > dr2) {
01953   //        mother = & cdc2;
01954   //        daughter = & cdc1;
01955   //    }
01956   //      }
01957 
01958   //      //...By dz...
01959   //      else {
01960   //    float dz1 = fabs(z1.m_helix[3]);
01961   //    float dz2 = fabs(z2.m_helix[3]);
01962   //    if (dz1 > dz2) {
01963   //        mother = & cdc2;
01964   //        daughter = & cdc1;
01965   //    }
01966   //      }
01967 
01968   //...By dz + dr...
01969   if(flag == 3){
01970     float dz1 = fabs(z1.helix[3]);
01971     float dz2 = fabs(z2.helix[3]);
01972     if (fabs(dz1 - dz2) < 2.) flag = 1;
01973     else                      flag = 2;
01974   }
01975 
01976   //...By dr...
01977   if(flag == 1){
01978     float dr1 = fabs(z1.helix[0]);
01979     float dr2 = fabs(z2.helix[0]);
01980     if (dr1 > dr2) {
01981       mother = & cdc2;
01982       daughter = & cdc1;
01983     }
01984   }
01985 
01986   //...By dz...
01987   else if(flag == 2){
01988     float dz1 = fabs(z1.helix[3]);
01989     float dz2 = fabs(z2.helix[3]);
01990     if (dz1 > dz2) {
01991       mother = & cdc2;
01992       daughter = & cdc1;
01993     }
01994   }
01995 
01996   //...Update information...
01997   mother->quality &= (~ TrackQualityOutsideCurler);
01998   mother->likelihood[0] = 1.;
01999   mother->decision |= TrackTrackManager;
02000   //zsl
02001   mother->daughter = daughter->body;
02002   mother->mother = 0;
02003   //zsl end;
02004   daughter->quality |= TrackQualityOutsideCurler;
02005   daughter->likelihood[0] = 0.;
02006   daughter->mother = mother->body;
02007   daughter->daughter = 0;
02008   daughter->decision |= TrackTrackManager;
02009 }

void TUpdater::update ( void   )  [virtual, inherited]

updates an object.

Definition at line 37 of file TUpdater.cxx.

References TUpdater::_evtN, TUpdater::_expN, TUpdater::_runN, and TUpdater::updated().

Referenced by TMDC::badHits(), main(), and TMDC::update().

00037                      {
00038     if (updated()) return;
00039 
00040    /*
00041     struct belle_event * ev = 
00042         (struct belle_event *) BsGetEnt(BELLE_EVENT, 1, BBS_No_Index);
00043 
00044     //...No BELLE_EVENT ???...
00045     if (! ev) return;
00046   
00047     _expN = ev->m_ExpNo;
00048     _runN = ev->m_RunNo;
00049     _evtN = ev->m_EvtNo;
00050    */
00051     _expN = 1;
00052     _runN = 1;
00053     _evtN = 1;
00054 }

bool TUpdater::updated ( void   )  const [virtual, inherited]

returns true if an object is updated.

Definition at line 57 of file TUpdater.cxx.

References TUpdater::_evtN, TUpdater::_expN, and TUpdater::_runN.

Referenced by TMDC::badHits(), TUpdater::dump(), and TUpdater::update().

00057                             {
00058     /*
00059     struct belle_event * ev = 
00060         (struct belle_event *) BsGetEnt(BELLE_EVENT, 1, BBS_No_Index);
00061 
00062     //...No BELLE_EVENT ???...
00063     if (! ev) return false;
00064 
00065     //...Same event?...
00066     if (_expN == ev->m_ExpNo &&
00067         _runN == ev->m_RunNo &&
00068         _evtN == ev->m_EvtNo) return true;
00069     */
00070 
00071    if (_expN == 1 &&
00072        _runN == 1 &&
00073        _evtN == 1) return true;
00074 
00075    return false;
00076 }

std::string TTrackManager::version ( void   )  const

returns version.

Definition at line 106 of file TTrackManager.cxx.

References deljobs::string.

00106                                  {
00107     return std::string("2.27");
00108 }


Member Data Documentation

AList<TMLink> TTrackManager::_associateHits [private]

Definition at line 232 of file TTrackManager.h.

Referenced by clear(), and salvageAssociateHits().

THelixFitter TTrackManager::_cFitter [private]

Definition at line 225 of file TTrackManager.h.

Referenced by determineT0(), T0(), and T0Fit().

int TTrackManager::_debugLevel [private]

Definition at line 219 of file TTrackManager.h.

Referenced by debugLevel(), determineT0(), finish(), and selectGoodTracks().

THelixFitter TTrackManager::_fitter [private]

Definition at line 224 of file TTrackManager.h.

Referenced by fittingFlag(), mask(), maskCurl(), maskNormal(), merge(), and refit().

double TTrackManager::_maxMomentum [private]

Definition at line 220 of file TTrackManager.h.

Referenced by maxMomentum(), and selectGoodTracks().

unsigned TTrackManager::_nCurlerMergeTest [private]

Definition at line 222 of file TTrackManager.h.

Referenced by setCurlerFlags().

struct summary* TTrackManager::_s [private]

Definition at line 244 of file TTrackManager.h.

Referenced by saveTables(), and setCurlerFlags().

double TTrackManager::_sigmaCurlerMergeTest [private]

Definition at line 221 of file TTrackManager.h.

Referenced by setCurlerFlags().

float TTrackManager::_t0 [private]

Definition at line 247 of file TTrackManager.h.

Referenced by determineT0(), and paraT0().

AList<TTrack> TTrackManager::_tracks [private]

Definition at line 228 of file TTrackManager.h.

Referenced by append(), clear(), determineT0(), dump(), finish(), makeTds(), mask(), merge(), nameTracks(), refit(), salvage(), salvageAssociateHits(), saveTables(), setCurlerFlags(), sortTracksByPt(), sortTracksByQuality(), T0(), T0Fit(), and tracks().

AList<TTrack> TTrackManager::_tracks2D [private]

Definition at line 229 of file TTrackManager.h.

Referenced by append2D(), clear(), dump(), saveTables(), and tracks2D().

AList<TTrack> TTrackManager::_tracksAll [private]

Definition at line 227 of file TTrackManager.h.

Referenced by allTracks(), append(), append2D(), clear(), dump(), movePivot(), nameTracks(), and saveTables().

AList<TTrack> TTrackManager::_tracksFinal [private]

Definition at line 230 of file TTrackManager.h.

Referenced by clear(), saveMCTables(), saveTables(), and tracksFinal().

IMagneticFieldSvc* TTrackManager::m_pmgnIMF [private]

Definition at line 216 of file TTrackManager.h.

Referenced by makeTds(), and TTrackManager().

RawDataProviderSvc* TTrackManager::m_rawDataProviderSvc [private]

Definition at line 217 of file TTrackManager.h.

Referenced by makeTds(), and TTrackManager().

double TTrackManager::t0bes [private]

Definition at line 218 of file TTrackManager.h.

Referenced by sett0bes().


Generated on Tue Nov 29 23:36:19 2016 for BOSS_7.0.2 by  doxygen 1.4.7