#include "Hit.h"
#include "TSeqCollection.h"
#include "WirePlane.h"
#include "Road.h"
#include <iostream>
using std::cout;
using std::endl;
using std::make_pair;
ClassImp(TreeSearch::Hit)
ClassImp(TreeSearch::MCHit)
ClassImp(TreeSearch::HitPairIter)
ClassImp(TreeSearch::HitSet)
namespace TreeSearch {
void Hit:: Shiftdis(Double_t shift){
fPos = fPos + shift;
fPosL = fPosL + shift;
fPosR = fPosR + shift;
fWireNum = fWireNum + Int_t(shift/fWirePlane->GetWireSpacing());
}
void Hit::Print( Option_t* opt ) const
{
cout << "Hit: wire=" << GetWireNum()
<< "/" << (fWirePlane ? fWirePlane->GetName() : "??")
<< " wpos=" << GetWirePos()
<< " z=" << GetZ()
<< " res=" << GetResolution()
<< " time=" << GetDriftTime()
<< " drift=" << GetDriftDist();
if( *opt != 'C' )
cout << endl;
}
Double_t Hit::ConvertTimeToDist( Double_t slope )
{
Double_t dist = fWirePlane->GetTTDConv()->ConvertTimeToDist(fTime, slope);
fPosL = fPos-dist;
fPosR = fPos+dist;
return dist;
}
Double_t Hit::GetZ() const
{
return fWirePlane->GetZ();
}
void MCHit::Print( Option_t* ) const
{
Hit::Print("C");
cout << " MCpos=" << GetMCPos()
<< endl;
}
Double_t FitCoord::GetChi2() const
{
return fRoad ? fRoad->GetChi2() : kBig;
}
HitPairIter::HitPairIter( const TSeqCollection* collA,
const TSeqCollection* collB,
Double_t maxdist )
: fCollA(collA), fCollB(collB), fIterA(0), fIterB(0),
fSaveIter(0), fSaveHit(0), fMaxDist(maxdist), fStarted(kFALSE),
fScanning(kFALSE)
{
if( !fIterA && fCollA )
fIterA = fCollA->MakeIterator();
if( !fIterB && fCollB ) {
fIterB = fCollB->MakeIterator();
if( !fSaveIter )
fSaveIter = fCollB->MakeIterator();
}
Next();
}
HitPairIter::HitPairIter( const HitPairIter& rhs )
: fCollA(rhs.fCollA), fCollB(rhs.fCollB), fIterA(0), fIterB(0),
fSaveIter(0), fSaveHit(rhs.fSaveHit),
fMaxDist(fMaxDist), fStarted(rhs.fStarted), fScanning(rhs.fScanning),
fCurrent(rhs.fCurrent), fNext(rhs.fNext)
{
if( fCollA ) {
fIterA = fCollA->MakeIterator();
*fIterA = *rhs.fIterA;
}
if( fCollB ) {
fIterB = fCollB->MakeIterator();
*fIterB = *rhs.fIterB;
fSaveIter = fCollB->MakeIterator();
*fSaveIter = *rhs.fSaveIter;
}
}
HitPairIter& HitPairIter::operator=( const HitPairIter& rhs )
{
if( this != &rhs ) {
fCollA = rhs.fCollA;
fCollB = rhs.fCollB;
fMaxDist = rhs.fMaxDist;
fStarted = rhs.fStarted;
fScanning = rhs.fScanning;
fCurrent = rhs.fCurrent;
fNext = rhs.fNext;
delete fIterA;
delete fIterB;
delete fSaveIter;
if( fCollA ) {
fIterA = fCollA->MakeIterator();
*fIterA = *rhs.fIterA;
}
if( fCollB ) {
fIterB = fCollB->MakeIterator();
*fIterB = *rhs.fIterB;
fSaveIter = fCollB->MakeIterator();
*fSaveIter = *rhs.fSaveIter;
}
}
return *this;
}
HitPairIter::~HitPairIter()
{
delete fIterA;
delete fIterB;
delete fSaveIter;
}
void HitPairIter::Reset()
{
fStarted = fScanning = kFALSE;
if( fIterA )
fIterA->Reset();
if( fIterB )
fIterB->Reset();
Next();
}
HitPairIter& HitPairIter::Next()
{
if( !fStarted ) {
fNext = make_pair( fIterA ? fIterA->Next() : 0,
fIterB ? fIterB->Next() : 0 );
fStarted = kTRUE;
}
fCurrent = fNext;
Hit* hitA = static_cast<Hit*>( fCurrent.first );
Hit* hitB = static_cast<Hit*>( fCurrent.second );
if( hitA && hitB ) {
switch( hitA->Compare(hitB,fMaxDist) ) {
case -1:
fNext.first = fIterA->Next();
fCurrent.second = 0;
break;
case 1:
fNext.second = fIterB->Next();
fCurrent.first = 0;
break;
default:
{
Hit* nextB = static_cast<Hit*>( fIterB->Next() );
if( !nextB || hitA->Compare(nextB,fMaxDist) < 0 ) {
if( fScanning ) {
fScanning = kFALSE;
*fIterB = *fSaveIter;
hitB = fSaveHit;
hitA = static_cast<Hit*>( fIterA->Next() );
if( hitA ) {
while( hitB != nextB && hitB->Compare(hitA,fMaxDist) < 0 )
hitB = static_cast<Hit*>( fIterB->Next() );
} else {
hitB = nextB;
}
fNext = make_pair( hitA, hitB );
} else {
fNext = make_pair( fIterA->Next(), nextB );
}
} else {
if( !fScanning ) {
fScanning = kTRUE;
*fSaveIter = *fIterB;
fSaveHit = hitB;
}
fNext.second = nextB;
}
break;
}
}
} else if( hitA ) {
fNext.first = fIterA->Next();
} else if( hitB ) {
fNext.second = fIterB->Next();
}
return *this;
}
UInt_t HitSet::GetMatchValue( const Hset_t& hits )
{
UInt_t curpat = 0;
for( Hset_t::const_iterator it = hits.begin(); it != hits.end(); ++it )
curpat |= 1U << (*it)->GetPlaneNum();
return curpat;
}
Bool_t HitSet::IsSimilarTo( const HitSet& tryset, Int_t maxdist ) const
{
assert( tryset.plane_pattern );
Hset_t::const_iterator ihits = hits.begin();
Hset_t::const_iterator ehits = hits.end();
Hset_t::const_iterator itry = tryset.hits.begin();
Hset_t::const_iterator etry = tryset.hits.end();
Hit::WireDistLess comp(maxdist);
UInt_t intersection_pattern = 0;
while( ihits != ehits and itry != etry ) {
if( comp(*itry, *ihits) )
++itry;
else if( comp(*ihits, *itry) )
++ihits;
else {
intersection_pattern |= 1U << (*itry)->GetPlaneNum();
++ihits;
++itry;
}
}
return tryset.plane_pattern == intersection_pattern;
}
}
Last update: Tue Jul 7 19:26:18 2009
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.