//============================================================================ // TrackObspMatch.cc // ----------------- // Module to match all CdfTracks with their parent OBSP particles. // Resulting list is appended to the event record. // // // 31-May-2000 K. Bloom, University of Michigan // Oct 31 2005 P.Murat: move to TrackingMods //============================================================================ #include "TrackingMods/TrackObspMatch.hh" #include #include #include #include using std::cout; using std::endl; using std::map; #include "CLHEP/Matrix/SymMatrix.h" #include "CLHEP/Matrix/Vector.h" #include "CotGeometry/CotDetectorNode.hh" #include "CotGeometry/CT_Configuration.hh" #include "ErrorLogger_i/gERRLOG.hh" #include "GeometryBase/CdfDetector.hh" #include "SiliconGeometry/AbsSiDetectorNode.hh" #include "SiliconGeometry/CdfHalfLadder.hh" #include "SiliconGeometry/SiDigiCode.hh" #include "TrackingObjects/SiData/SiHitSet.hh" #include "TrackingObjects/CT_Track/CT_Hit.hh" #include "TrackingObjects/CT_Track/CT_HitLink.hh" #include "TrackingObjects/CT_Track/CT_Track.hh" #include "TrackingObjects/CT_Simulation/CT_Simulation.hh" #include "TrackingObjects/Storable/CT_HitSet.hh" #include "TrackingObjects/Storable/CdfTrackColl.hh" #include "TrackingObjects/Storable/CdfTrackView.hh" #include "TrackingObjects/Storable/CdfTrackMatch.hh" #include "TrackingObjects/Tracks/CdfTrack.hh" #include "TrackingObjects/Tracks/CdfTrackCutBase.hh" //============================ // Constructor, destructor //============================ TrackObspMatch::TrackObspMatch(const char* const theName, const char* const theDescription ) : AppModule( theName, theDescription ) { } TrackObspMatch::~TrackObspMatch() { } //============================================================== // Operations //============================================================== AppResult TrackObspMatch::event( AbsEvent* anEvent ) { //Initialize the CT_Simulation structures; CT_Simulation *simptr = 0; simptr = CT_Simulation::instance(); simptr->loadMCData(); //Read in all tracks, loop over them. CdfTrackView_h hView; if (CdfTrackView::allTracks(hView) != CdfTrackView::OK) { ERRLOG( ELerror, "Failed to create CdfTrackView" ) << "@SUB=TrackObspMatch::event" << endmsg; return AppResult::ERROR; } const CdfTrackView::CollType & tracks = hView->contents(); //First, find out the largest ID number, just in case there are //gaps. Then set up a vector of integers that is one more than //that size (so we can start counting at 1). int maxID = 0; for (CdfTrackView::const_iterator it = tracks.begin(); it != tracks.end(); ++it) { const CdfTrack & trk = **it; if (trk.id().value() > maxID) maxID = trk.id().value(); } //Create a CdfTrackMatch object and set size CdfTrackMatch* myMatch; myMatch = new CdfTrackMatch; myMatch->setMax(maxID); for (int i=0; isetMatch(i,-1); } // do COT-only first, since OI tracks get info from COT parent for (CdfTrackView::const_iterator it = tracks.begin(); it != tracks.end(); ++it) { const CdfTrack & trk = **it; int nCot = trk.numCTHits(); int nSvx = trk.numSIHits(); //For COT-only tracks, use information in CT_Simulation if ( nCot > 0 && nSvx == 0 ) { CT_Track cotTrack; for (int isl = 0; isl < 8; ++isl) { for (CdfTrack::CotHitIterator ihit = trk.beginCTHitBlock(isl); ihit != trk.endCTHitBlock(isl); ++ihit) { cotTrack.addHit(isl,*ihit); } } CT_SimSegmentMatch ctMatch = simptr->match(cotTrack); myMatch->setMatch(trk.id().value(),ctMatch.parent); } } for (CdfTrackView::const_iterator it = tracks.begin(); it != tracks.end(); ++it) { const CdfTrack & trk = **it; int nCot = trk.numCTHits(); int nSvx = trk.numSIHits(); //For all varieties of outside-in tracks, find the ultimate parent //COT track and use its OBSP match. if ( nCot > 0 && nSvx > 0 ) { CdfTrack_clnk finalParent = *it; while (finalParent->parent().is_nonnull()) { finalParent = finalParent->parent(); } myMatch->setMatch(trk.id().value(), myMatch->match(finalParent->id().value())); } //For standalone silicon tracks, count hits that are due single OBSP //particle. The winner is the OBSP contributing the largest number //of hits; require that to be a majority of hits. if ( nCot == 0 && nSvx > 0 ) { map trackobsp; for (CdfTrack::SiHitIterator ihit = trk.beginSIHits(); ihit != trk.endSIHits(); ++ihit) { std::set hitobsp; const SiCluster* cl=(*ihit)->getCluster(); if (cl) { cl->getObspNum(hitobsp); if (hitobsp.size() == 1) { std::set::iterator iter=hitobsp.begin(); if (trackobsp.find(*iter) == trackobsp.end()) { trackobsp[*iter]=1; } else { trackobsp[*iter]+=1; } } } } map::iterator iter=trackobsp.begin(); int bestObsp = 1; int nHits = 0; while (iter != trackobsp.end()) { if ((*iter).second > nHits) { nHits = (*iter).second; bestObsp = (*iter).first; } ++iter; } float fraction = (float)nHits/trk.numSIHits(); if (fraction > 0.5) { myMatch->setMatch(trk.id().value(),bestObsp); } else { myMatch->setMatch(trk.id().value(),-1); } } } //Append the CdfTrackMatch to the event. CdfTrackMatch_h matchH(myMatch); anEvent->append(matchH); return AppResult::OK; }