ROOT logo
//*-- Author :    Ole Hansen, Jefferson Lab   13-Aug-2007

///////////////////////////////////////////////////////////////////////////////
//                                                                           //
// TreeSearch::Hitpattern                                                    //
//                                                                           //
///////////////////////////////////////////////////////////////////////////////

#include "Hitpattern.h"
#include "Hit.h"
#include "WirePlane.h"
#include "PatternTree.h"
#include "TError.h"
#include "TMath.h"
#include "MWDC.h"

#include <iostream>
#include <stdexcept>
#include <algorithm>

using namespace std;

typedef std::vector<TreeSearch::Hit*>::size_type vsiz_t;

ClassImp(TreeSearch::Hitpattern)

namespace TreeSearch {

//_____________________________________________________________________________
Hitpattern::Hitpattern( const PatternTree& pt )
  : fNlevels(pt.GetNlevels()), fNplanes(pt.GetNplanes()), fScale(0), 
    fOffset(0.5*pt.GetWidth()), fPattern(0)
#ifdef TESTCODE
  , fMaxhitBin(0)
#endif
{
  // Construct Hitpattern using paramaters of pattern tree

  Init( pt.GetWidth() );
}

//_____________________________________________________________________________
Hitpattern::Hitpattern( UInt_t nlevels, UInt_t nplanes, Double_t width )
  : fNlevels(nlevels), fNplanes(0), fScale(0), fOffset(0.5*width), fPattern(0)
#ifdef TESTCODE
  , fMaxhitBin(0)
#endif
{
  // Constructor

  static const char* const here = "TreeSearch::Hitpattern";
  
  if( nplanes == 0 || nplanes > 16 || fNlevels == 0 || fNlevels > 16 ) {
    ::Error( here, "Illegal number of planes or tree levels: %d %d.\n"
	     "Both must be 0 < n <= 16.", nplanes, nlevels );
  } else if( width < 1e-2 ) { // Negative or very small width?
    ::Error( here, "Illegal detector width %lf. Must be >= +1cm.", width );
  } else {
    fNplanes = nplanes;
    Init( width );
  }
}

//_____________________________________________________________________________
void Hitpattern::Init( Double_t width )
{
  // Allocate memory for new Hitpattern object.
  // Internal utility function called by constructors.

  assert( width >= 1e-2 );
  fScale = GetNbins() / width;
  fBinWidth = 1.0/fScale;

  try {
    fPattern = new Bits*[fNplanes];
    UInt_t nbins2 = 2*GetNbins();  // 2*number of bins at deepest level
    for( UInt_t i=0; i<fNplanes; i++ )
      fPattern[i] = new Bits( nbins2 );
    fHits.resize( fNplanes*GetNbins() );
  }
  catch ( std::bad_alloc ) {
    ::Error( "Hitpattern::Hitpattern", "Out of memory trying to construct "
	     "new Hitpattern object. Call expert." );
    throw;
  }
}

//_____________________________________________________________________________
Hitpattern::Hitpattern( const Hitpattern& orig ) 
try
  : fNlevels(orig.fNlevels), fNplanes(orig.fNplanes),
    fScale(orig.fScale), fBinWidth(orig.fBinWidth), fOffset(orig.fOffset),
    fPattern(0), fHits(orig.fHits), fHitList(orig.fHitList)
#ifdef TESTCODE
  , fMaxhitBin(orig.fMaxhitBin)
#endif
{
  // Copy ctor

  if( fNplanes > 0 ) {
    fPattern = new Bits*[fNplanes];
    for( UInt_t i=fNplanes; i--; )
      fPattern[i] = new Bits(*orig.fPattern[i]);
  }
  assert( fHits.size() == fNplanes*GetNbins() );
}
catch ( std::bad_alloc ) {
  ::Error( "Hitpattern::Hitpattern", "Out of memory trying to copy Hitpattern "
	   "object. Call expert." );
  throw;
}

//_____________________________________________________________________________
Hitpattern& Hitpattern::operator=( const Hitpattern& rhs )
{
  // Assignment

  if( this != &rhs ) {
    fNlevels = rhs.fNlevels;
    fNplanes = rhs.fNplanes;
    fScale   = rhs.fScale;
    fBinWidth= rhs.fBinWidth;
    fOffset  = rhs.fOffset;
    delete fPattern; fPattern = 0;
    if( fNplanes > 0 ) {
      fPattern = new Bits*[fNplanes];
      for( UInt_t i=fNplanes; i--; )
	fPattern[i] = new Bits(*rhs.fPattern[i]);
    }
    fHits = rhs.fHits;
    assert( fHits.size() == fNplanes*GetNbins() );
    fHitList = rhs.fHitList;
#ifdef TESTCODE
    fMaxhitBin = rhs.fMaxhitBin;
#endif
  }
  return *this;
}

//_____________________________________________________________________________
Hitpattern::~Hitpattern()
{
  // Destructor

  for( UInt_t i=fNplanes; i; )
    delete fPattern[--i];
  delete [] fPattern;
}

//_____________________________________________________________________________
inline
void Hitpattern::AddHit( UInt_t plane, UInt_t bin, Hit* hit ) {
  // Add hit for given bin in plane to the hit arrays
  assert(hit);
  UInt_t idx = MakeIdx( plane, bin );
  fHits[idx].push_back( hit );
  // Even though this may record the same idx multiple times, it performs
  // better than anything more fancy (like e.g. a set)
  fHitList.push_back( idx );
#ifdef TESTCODE
  if( fMaxhitBin < (UInt_t)fHits[idx].size() )
    fMaxhitBin = fHits[idx].size();
#endif
}

//_____________________________________________________________________________
void Hitpattern::Clear( Option_t* )
{
  // Clear the hitpattern

  for( UInt_t i=fNplanes; i; )
    fPattern[--i]->FastClear();

  // For speed, clear only arrays that are actually filled
  for( vector<UInt_t>::iterator it = fHitList.begin(); it != fHitList.end();
       ++it ) {
    UInt_t idx = *it;
    assert( idx < fHits.size());
    fHits[idx].clear();
  }
  fHitList.clear();

#ifdef TESTCODE
  fMaxhitBin = 0;
#endif
}

//_____________________________________________________________________________
#ifdef TESTCODE
UInt_t Hitpattern::GetBinsSet() const
{
  // Return number of bins set at the highest resolution
  UInt_t n = 0, nbins = GetNbins();
  for( UInt_t i=fNplanes; i; ) {
    n += fPattern[--i]->CountBits( nbins );
  }
  return n;
}
#endif

//_____________________________________________________________________________
void Hitpattern::SetPositionRange( Double_t start, Double_t end,
				   UInt_t plane, Hit* hit )
{
  // Set pattern bins corresponding to the exact physical positions
  // between start and end (in m) in the given plane. 
  // Positions may range from 0.0 to width.
  // Associate these bins with given hit

  assert( plane<fNplanes && start<=end );
  Int_t hi = TMath::FloorNint( fScale*end );
  if( hi < 0 ) return;
  Int_t lo = TMath::FloorNint( fScale*start );
  // At the deepest tree level, there are 2^(fNlevels-1) bins.
  Int_t nbins = GetNbins();
  if( lo >= nbins ) return;
  if( lo < 0 )
    lo = 0;
  if( hi >= nbins )
    hi = nbins-1;

  // Save the hit pointer(s) in the hit array so that we can efficiently
  // retrieve later the hit(s) that caused the bits to be set.
  // NB: This is quite expensive
  for( Int_t i = lo; i <= hi; ++i )
    AddHit( plane, i, hit );

  // Loop through the tree levels, starting at the highest resolution.
  // In practice, we usually have hi-lo <= 1 even at the highest resolution.
  while (true) {
    fPattern[plane]->SetBitRange( lo+nbins, hi+nbins );
    nbins >>= 1;
    if( nbins == 0 ) break;
    lo >>= 1;
    hi >>= 1;
  }
}

//_____________________________________________________________________________
Int_t Hitpattern::ScanHits( WirePlane* A, WirePlane* B )
{
  // Set the points at all depths of the hit pattern that correspond to
  // the hits in plane A. The plane number is extracted from A.
  // The second, optional plane B represents an optional partner
  // plane of A, i.e. a nearby plane with (usually) staggered wires. 
  // If B is present, test for pairs of hits in A and B.
  // Naturally, the two planes and their wires must be parallel.
  //
  // Returns number of hits processed

  if( !A ) return 0;
  UInt_t planeA = A->GetPlaneNum();
  assert( planeA < fNplanes );
  Double_t maxdist = 0.0;
  UInt_t planeB = fNplanes;
  if( B ) {
    maxdist = A->GetMaxSlope() * (B->GetZ() - A->GetZ());
    planeB = B->GetPlaneNum();
    assert( planeB < fNplanes );
  }
  bool do_single_hits =
    ( A->GetMWDC()->TestBit(MWDC::kPairsOnly) == kFALSE || B == 0 );

  Int_t nhits = 0;

  HitPairIter it( A->GetHits(), B ? B->GetHits() : 0, maxdist );
  while( it ) {
    // At least one hit found
    nhits++;
    Hit* hitA = static_cast<Hit*>((*it).first);
    Hit* hitB = static_cast<Hit*>((*it).second);
    assert( hitA || hitB );
    if( hitA && hitB ) {
      // A pair of hits registered in partner planes. One or more combinations
      // of hit positions may be within maxdist of each other.
      // Determine which combinations these are and set their bins.
      int set = 0, bitA, bitB;
      Double_t posA, posB;
      for( int i = 4; i; ) { --i;
	if( i&2 ) { posA = hitA->GetPosL(); bitA = 8; }
	else      { posA = hitA->GetPosR(); bitA = 4; }
	if( i&1 ) { posB = hitB->GetPosL(); bitB = 2; }
	else      { posB = hitB->GetPosR(); bitB = 1; }
	if( TMath::Abs( posA-posB ) <= maxdist ) {
	  if( (bitA & set) == 0 ) {
	    SetPosition( posA+fOffset, hitA->GetResolution(), planeA, hitA );
	    // Prevent duplicate entries for zero-drift hits
	    if( hitA->GetDriftDist() == 0 )
	      set |= 12;
	    else
	      set |= bitA;
	  }
	  if( (bitB & set) == 0 ) {
	    SetPosition( posB+fOffset, hitB->GetResolution(), planeB, hitB );
	    if( hitB->GetDriftDist() == 0 )
	      set |= 3;
	    else
	      set |= bitB;
	  }
	}
      }
    }
    else if( do_single_hits ) {
      // Unpaired hit in only one plane
      if( hitA ) {
	SetPosition( hitA->GetPosL()+fOffset, hitA->GetResolution(),
		     planeA, hitA );
	SetPosition( hitA->GetPosR()+fOffset, hitA->GetResolution(),
		     planeA, hitA );
      } else {
	SetPosition( hitB->GetPosL()+fOffset, hitB->GetResolution(),
		     planeB, hitB );
	SetPosition( hitB->GetPosR()+fOffset, hitB->GetResolution(),
		     planeB, hitB );
      }
    }
    ++it;
  }
  return nhits;
}


//_____________________________________________________________________________
void Hitpattern::Print( Option_t* ) const
{
  // Print basic info about hitpattern.

  //TODO
}


//_____________________________________________________________________________
void Bits::ResetBitRange( UInt_t lo, UInt_t hi )
{
  // Set range of bits from lo to hi to value.

  if( hi<lo ) return;
  UChar_t mask = ~((1U<<(lo&7))-1);
  lo >>= 3;
  if( lo >= fNbytes ) return;
  UChar_t mask2 = (1U<<((hi&7)+1))-1;
  hi >>= 3;
  if( hi >= fNbytes ) {
    hi = fNbytes-1;
    mask2 = 0xFF;
  }
  if( lo < hi ) {
    fAllBits[hi] &= (0xFF ^ mask2);
    memset( fAllBits+lo+1, 0, hi-lo-1 );
  } else {
    mask &= mask2;
  }
  fAllBits[lo] &= (0xFF ^ mask);
}

//_____________________________________________________________________________
void Bits::SetBitRange( UInt_t lo, UInt_t hi )
{
  // Set range of bits from lo to hi (inclusive, i.e. [lo,hi])

  if( hi<lo ) return;
  SetBitNumber( hi ); // expands array if necessary
  if( lo==hi ) return;
  UChar_t mask  = ~((1U<<(lo&7))-1);
  UChar_t mask2 = (1U<<(hi&7))-1;
  lo >>= 3;
  hi >>= 3;
  if( lo < hi ) {
    fAllBits[hi] |= mask2;
    memset( fAllBits+lo+1, 0xFF, hi-lo-1 );
  } else {
    mask &= mask2;
  }
  fAllBits[lo] |= mask;
}

///////////////////////////////////////////////////////////////////////////////

} // end namespace TreeSearch

 Hitpattern.cxx:1
 Hitpattern.cxx:2
 Hitpattern.cxx:3
 Hitpattern.cxx:4
 Hitpattern.cxx:5
 Hitpattern.cxx:6
 Hitpattern.cxx:7
 Hitpattern.cxx:8
 Hitpattern.cxx:9
 Hitpattern.cxx:10
 Hitpattern.cxx:11
 Hitpattern.cxx:12
 Hitpattern.cxx:13
 Hitpattern.cxx:14
 Hitpattern.cxx:15
 Hitpattern.cxx:16
 Hitpattern.cxx:17
 Hitpattern.cxx:18
 Hitpattern.cxx:19
 Hitpattern.cxx:20
 Hitpattern.cxx:21
 Hitpattern.cxx:22
 Hitpattern.cxx:23
 Hitpattern.cxx:24
 Hitpattern.cxx:25
 Hitpattern.cxx:26
 Hitpattern.cxx:27
 Hitpattern.cxx:28
 Hitpattern.cxx:29
 Hitpattern.cxx:30
 Hitpattern.cxx:31
 Hitpattern.cxx:32
 Hitpattern.cxx:33
 Hitpattern.cxx:34
 Hitpattern.cxx:35
 Hitpattern.cxx:36
 Hitpattern.cxx:37
 Hitpattern.cxx:38
 Hitpattern.cxx:39
 Hitpattern.cxx:40
 Hitpattern.cxx:41
 Hitpattern.cxx:42
 Hitpattern.cxx:43
 Hitpattern.cxx:44
 Hitpattern.cxx:45
 Hitpattern.cxx:46
 Hitpattern.cxx:47
 Hitpattern.cxx:48
 Hitpattern.cxx:49
 Hitpattern.cxx:50
 Hitpattern.cxx:51
 Hitpattern.cxx:52
 Hitpattern.cxx:53
 Hitpattern.cxx:54
 Hitpattern.cxx:55
 Hitpattern.cxx:56
 Hitpattern.cxx:57
 Hitpattern.cxx:58
 Hitpattern.cxx:59
 Hitpattern.cxx:60
 Hitpattern.cxx:61
 Hitpattern.cxx:62
 Hitpattern.cxx:63
 Hitpattern.cxx:64
 Hitpattern.cxx:65
 Hitpattern.cxx:66
 Hitpattern.cxx:67
 Hitpattern.cxx:68
 Hitpattern.cxx:69
 Hitpattern.cxx:70
 Hitpattern.cxx:71
 Hitpattern.cxx:72
 Hitpattern.cxx:73
 Hitpattern.cxx:74
 Hitpattern.cxx:75
 Hitpattern.cxx:76
 Hitpattern.cxx:77
 Hitpattern.cxx:78
 Hitpattern.cxx:79
 Hitpattern.cxx:80
 Hitpattern.cxx:81
 Hitpattern.cxx:82
 Hitpattern.cxx:83
 Hitpattern.cxx:84
 Hitpattern.cxx:85
 Hitpattern.cxx:86
 Hitpattern.cxx:87
 Hitpattern.cxx:88
 Hitpattern.cxx:89
 Hitpattern.cxx:90
 Hitpattern.cxx:91
 Hitpattern.cxx:92
 Hitpattern.cxx:93
 Hitpattern.cxx:94
 Hitpattern.cxx:95
 Hitpattern.cxx:96
 Hitpattern.cxx:97
 Hitpattern.cxx:98
 Hitpattern.cxx:99
 Hitpattern.cxx:100
 Hitpattern.cxx:101
 Hitpattern.cxx:102
 Hitpattern.cxx:103
 Hitpattern.cxx:104
 Hitpattern.cxx:105
 Hitpattern.cxx:106
 Hitpattern.cxx:107
 Hitpattern.cxx:108
 Hitpattern.cxx:109
 Hitpattern.cxx:110
 Hitpattern.cxx:111
 Hitpattern.cxx:112
 Hitpattern.cxx:113
 Hitpattern.cxx:114
 Hitpattern.cxx:115
 Hitpattern.cxx:116
 Hitpattern.cxx:117
 Hitpattern.cxx:118
 Hitpattern.cxx:119
 Hitpattern.cxx:120
 Hitpattern.cxx:121
 Hitpattern.cxx:122
 Hitpattern.cxx:123
 Hitpattern.cxx:124
 Hitpattern.cxx:125
 Hitpattern.cxx:126
 Hitpattern.cxx:127
 Hitpattern.cxx:128
 Hitpattern.cxx:129
 Hitpattern.cxx:130
 Hitpattern.cxx:131
 Hitpattern.cxx:132
 Hitpattern.cxx:133
 Hitpattern.cxx:134
 Hitpattern.cxx:135
 Hitpattern.cxx:136
 Hitpattern.cxx:137
 Hitpattern.cxx:138
 Hitpattern.cxx:139
 Hitpattern.cxx:140
 Hitpattern.cxx:141
 Hitpattern.cxx:142
 Hitpattern.cxx:143
 Hitpattern.cxx:144
 Hitpattern.cxx:145
 Hitpattern.cxx:146
 Hitpattern.cxx:147
 Hitpattern.cxx:148
 Hitpattern.cxx:149
 Hitpattern.cxx:150
 Hitpattern.cxx:151
 Hitpattern.cxx:152
 Hitpattern.cxx:153
 Hitpattern.cxx:154
 Hitpattern.cxx:155
 Hitpattern.cxx:156
 Hitpattern.cxx:157
 Hitpattern.cxx:158
 Hitpattern.cxx:159
 Hitpattern.cxx:160
 Hitpattern.cxx:161
 Hitpattern.cxx:162
 Hitpattern.cxx:163
 Hitpattern.cxx:164
 Hitpattern.cxx:165
 Hitpattern.cxx:166
 Hitpattern.cxx:167
 Hitpattern.cxx:168
 Hitpattern.cxx:169
 Hitpattern.cxx:170
 Hitpattern.cxx:171
 Hitpattern.cxx:172
 Hitpattern.cxx:173
 Hitpattern.cxx:174
 Hitpattern.cxx:175
 Hitpattern.cxx:176
 Hitpattern.cxx:177
 Hitpattern.cxx:178
 Hitpattern.cxx:179
 Hitpattern.cxx:180
 Hitpattern.cxx:181
 Hitpattern.cxx:182
 Hitpattern.cxx:183
 Hitpattern.cxx:184
 Hitpattern.cxx:185
 Hitpattern.cxx:186
 Hitpattern.cxx:187
 Hitpattern.cxx:188
 Hitpattern.cxx:189
 Hitpattern.cxx:190
 Hitpattern.cxx:191
 Hitpattern.cxx:192
 Hitpattern.cxx:193
 Hitpattern.cxx:194
 Hitpattern.cxx:195
 Hitpattern.cxx:196
 Hitpattern.cxx:197
 Hitpattern.cxx:198
 Hitpattern.cxx:199
 Hitpattern.cxx:200
 Hitpattern.cxx:201
 Hitpattern.cxx:202
 Hitpattern.cxx:203
 Hitpattern.cxx:204
 Hitpattern.cxx:205
 Hitpattern.cxx:206
 Hitpattern.cxx:207
 Hitpattern.cxx:208
 Hitpattern.cxx:209
 Hitpattern.cxx:210
 Hitpattern.cxx:211
 Hitpattern.cxx:212
 Hitpattern.cxx:213
 Hitpattern.cxx:214
 Hitpattern.cxx:215
 Hitpattern.cxx:216
 Hitpattern.cxx:217
 Hitpattern.cxx:218
 Hitpattern.cxx:219
 Hitpattern.cxx:220
 Hitpattern.cxx:221
 Hitpattern.cxx:222
 Hitpattern.cxx:223
 Hitpattern.cxx:224
 Hitpattern.cxx:225
 Hitpattern.cxx:226
 Hitpattern.cxx:227
 Hitpattern.cxx:228
 Hitpattern.cxx:229
 Hitpattern.cxx:230
 Hitpattern.cxx:231
 Hitpattern.cxx:232
 Hitpattern.cxx:233
 Hitpattern.cxx:234
 Hitpattern.cxx:235
 Hitpattern.cxx:236
 Hitpattern.cxx:237
 Hitpattern.cxx:238
 Hitpattern.cxx:239
 Hitpattern.cxx:240
 Hitpattern.cxx:241
 Hitpattern.cxx:242
 Hitpattern.cxx:243
 Hitpattern.cxx:244
 Hitpattern.cxx:245
 Hitpattern.cxx:246
 Hitpattern.cxx:247
 Hitpattern.cxx:248
 Hitpattern.cxx:249
 Hitpattern.cxx:250
 Hitpattern.cxx:251
 Hitpattern.cxx:252
 Hitpattern.cxx:253
 Hitpattern.cxx:254
 Hitpattern.cxx:255
 Hitpattern.cxx:256
 Hitpattern.cxx:257
 Hitpattern.cxx:258
 Hitpattern.cxx:259
 Hitpattern.cxx:260
 Hitpattern.cxx:261
 Hitpattern.cxx:262
 Hitpattern.cxx:263
 Hitpattern.cxx:264
 Hitpattern.cxx:265
 Hitpattern.cxx:266
 Hitpattern.cxx:267
 Hitpattern.cxx:268
 Hitpattern.cxx:269
 Hitpattern.cxx:270
 Hitpattern.cxx:271
 Hitpattern.cxx:272
 Hitpattern.cxx:273
 Hitpattern.cxx:274
 Hitpattern.cxx:275
 Hitpattern.cxx:276
 Hitpattern.cxx:277
 Hitpattern.cxx:278
 Hitpattern.cxx:279
 Hitpattern.cxx:280
 Hitpattern.cxx:281
 Hitpattern.cxx:282
 Hitpattern.cxx:283
 Hitpattern.cxx:284
 Hitpattern.cxx:285
 Hitpattern.cxx:286
 Hitpattern.cxx:287
 Hitpattern.cxx:288
 Hitpattern.cxx:289
 Hitpattern.cxx:290
 Hitpattern.cxx:291
 Hitpattern.cxx:292
 Hitpattern.cxx:293
 Hitpattern.cxx:294
 Hitpattern.cxx:295
 Hitpattern.cxx:296
 Hitpattern.cxx:297
 Hitpattern.cxx:298
 Hitpattern.cxx:299
 Hitpattern.cxx:300
 Hitpattern.cxx:301
 Hitpattern.cxx:302
 Hitpattern.cxx:303
 Hitpattern.cxx:304
 Hitpattern.cxx:305
 Hitpattern.cxx:306
 Hitpattern.cxx:307
 Hitpattern.cxx:308
 Hitpattern.cxx:309
 Hitpattern.cxx:310
 Hitpattern.cxx:311
 Hitpattern.cxx:312
 Hitpattern.cxx:313
 Hitpattern.cxx:314
 Hitpattern.cxx:315
 Hitpattern.cxx:316
 Hitpattern.cxx:317
 Hitpattern.cxx:318
 Hitpattern.cxx:319
 Hitpattern.cxx:320
 Hitpattern.cxx:321
 Hitpattern.cxx:322
 Hitpattern.cxx:323
 Hitpattern.cxx:324
 Hitpattern.cxx:325
 Hitpattern.cxx:326
 Hitpattern.cxx:327
 Hitpattern.cxx:328
 Hitpattern.cxx:329
 Hitpattern.cxx:330
 Hitpattern.cxx:331
 Hitpattern.cxx:332
 Hitpattern.cxx:333
 Hitpattern.cxx:334
 Hitpattern.cxx:335
 Hitpattern.cxx:336
 Hitpattern.cxx:337
 Hitpattern.cxx:338
 Hitpattern.cxx:339
 Hitpattern.cxx:340
 Hitpattern.cxx:341
 Hitpattern.cxx:342
 Hitpattern.cxx:343
 Hitpattern.cxx:344
 Hitpattern.cxx:345
 Hitpattern.cxx:346
 Hitpattern.cxx:347
 Hitpattern.cxx:348
 Hitpattern.cxx:349
 Hitpattern.cxx:350
 Hitpattern.cxx:351
 Hitpattern.cxx:352
 Hitpattern.cxx:353
 Hitpattern.cxx:354
 Hitpattern.cxx:355
 Hitpattern.cxx:356
 Hitpattern.cxx:357
 Hitpattern.cxx:358
 Hitpattern.cxx:359
 Hitpattern.cxx:360
 Hitpattern.cxx:361
 Hitpattern.cxx:362
 Hitpattern.cxx:363
 Hitpattern.cxx:364
 Hitpattern.cxx:365
 Hitpattern.cxx:366
 Hitpattern.cxx:367
 Hitpattern.cxx:368
 Hitpattern.cxx:369
 Hitpattern.cxx:370
 Hitpattern.cxx:371
 Hitpattern.cxx:372
 Hitpattern.cxx:373
 Hitpattern.cxx:374
 Hitpattern.cxx:375
 Hitpattern.cxx:376
 Hitpattern.cxx:377
 Hitpattern.cxx:378
 Hitpattern.cxx:379
 Hitpattern.cxx:380