ROOT logo
//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////
//
//  HPionTrackerHitF:
//
//  Hit finder of the PionTracker
//
////////////////////////////////////////////////////////////////

#include "hpiontrackerhitf.h"
#include "hpiontrackerdef.h"
#include "hpiontrackercal.h"
#include "hpiontrackerhit.h"
#include "hpiontrackerdetector.h"
#include "hpiontrackerhitfpar.h"
#include "hpiontrackergeompar.h"
#include "../base/geometry/hgeomtransform.h"
#include "hades.h"
#include "hcategory.h"
#include "hdebug.h"
#include "hevent.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hspectrometer.h"

#include <iomanip>
#include <iostream>
#include <algorithm>
#include <vector>
#include <cmath>
#include <stdlib.h>
#include <string.h>
using namespace std;

#define PR(x) std::cout << "++DEBUG: " << #x << " = |" << x << "| (" << __FILE__ << ", " << __LINE__ << ")\n";
#define PRh(x) std::cout << "++DEBUG: " << #x << " = hex |" << std::hex << x << std::dec << "| (" << __FILE__ << ", " << __LINE__ << ")\n";

typedef std::vector< StripData > strips_vec; // vector for fired strips and also used for cross talk selection
typedef std::vector<HitCanData> hitcan; // vector for hit candidates

struct ClusterCand
{
    strips_vec hits; //neighbours

    //    void print(Int_t m = -1)
    //    {
    //            Int_t min_t, max_t, min_c, max_c;
    //            min_t = max_t = hits[0].first;
    //            min_c = max_c = hits[0].second.second;
    //
    //            printf("Cluster candidate (%d):\n", (int)hits.size());
    //            printf(" -c:\ts: %d,\tt: %.0f,\tc: %.0f\n", hits[0].second.first, hits[0].first, hits[0].second.second);
    //            for (size_t h = 1; h < hits.size(); ++h)
    //            {
    //                    printf("  n:\ts: %d,\tt: %.0f,\tc: %.0f\n", hits[h].second.first, hits[h].first, hits[h].second.second);
    //
    //                    if (hits[h].first < min_t) min_t = hits[h].first;
    //                    if (hits[h].first > max_t) max_t = hits[h].first;
    //
    //                    if (hits[h].second.second < min_c) min_c = hits[h].second.second;
    //                    if (hits[h].second.second > max_c) max_c = hits[h].second.second;
    //            }
    //            if (hits.size() > 1)
    //                    printf("CSTAT:\t%d\t%lu\t%d\t%d\n", m, hits.size(), max_t - min_t, max_c - min_c);
    //    }
};

struct ClusterData
{
    Int_t strip;                  // keeps the info about local maximum strip location

    Float_t pos;                  // weighted position of the cluster
    Float_t time;                 // weighted time of the cluster
    Float_t charge;                       // total charge of teh cluster

    //    void print()
    //    {
    //            printf("Cluster (%d):\n", (int)strip);
    //            printf(" -d:\tp: %.0f,\tt: %.0f,\tc: %.0f\n", pos, time, charge);
    //    }
};


struct hit // vector of hit candidates
{
    hitcan h[2];
};


struct HitsData
{
    Float_t posX;                 // weighted position of the cluster
    Float_t timeX;                        // weighted time of the cluster
    Float_t chargeX;                      // total charge of teh cluster

    Float_t posY;                 // weighted position of the cluster
    Float_t timeY;                        // weighted time of the cluster
    Float_t chargeY;                      // total charge of teh cluster

    Float_t time_avg;                     // weighted time of the cluster
    Float_t charge_avg;                   // total charge of teh cluster

    void calcAvgs()
    {
	Float_t qtot = chargeX + chargeY;
	time_avg = (timeX * chargeX + timeY*chargeY)/qtot;
	charge_avg = (chargeX + chargeY) / 2.0;
    }

    //    void print()
    //    {
    //            printf("Matched hit:\tx\ty\n");
    //            printf(" position:\t%.1f\t%.1f\n time\t%.0f\t%.0f\t%.0f\n charge:\t%.0f\t%.0f\t%.0f\n",
    //                       posX, posY, timeX, timeY, time_avg, chargeX, chargeY, charge_avg);
    //    }
};

// Sort hits by charge
Bool_t hit_sort_c(StripData a, StripData b)
{
    return a.second.second < b.second.second;
}

typedef std::vector< ClusterCand > clus_cand_vec;
typedef std::vector< ClusterData > clusters_vec;
typedef std::vector< HitsData > hits_vec;


ClassImp (HPionTrackerHitF)
    HPionTrackerHitF::HPionTrackerHitF (void)
{
    // default constructor
    pCalCat      = NULL;
    pHitCat      = NULL;
    iter         = NULL;
    pHitfpar     = NULL;
    pGeompar     = NULL;
}

HPionTrackerHitF::HPionTrackerHitF (const Text_t * name, const Text_t * title, Bool_t skip)
: HReconstructor (name, title)
{
    // constructor
    // the parameter "skip" (default; kFALSE) defines, if the event is skipted in case no hit can be reconstructed
    pCalCat      = NULL;
    pHitCat      = NULL;
    iter         = NULL;
    pHitfpar     = NULL;
    pGeompar     = NULL;
}

HPionTrackerHitF::~HPionTrackerHitF (void)
{
    //destructor deletes the iterator on the raw category
    if (NULL != iter)
    {
	delete iter;
	iter = NULL;
    }
}

Bool_t HPionTrackerHitF::init (void)
{
    // gets the parameter containers
    // gets the PionTrackerCal category and creates the PionTrackerHit category
    // creates an iterator which loops over all fired strips in PionTrackerCal

    HPionTrackerDetector * det = (HPionTrackerDetector *) gHades->getSetup()->getDetector ("PionTracker");

    if (!det)
    {
	Error ("init", "No PionTracker found.");
	return kFALSE;
    }

    pHitfpar = (HPionTrackerHitFPar *) gHades->getRuntimeDb()->getContainer ("PionTrackerHitFPar");

    if (!pHitfpar) return kFALSE;

    pGeompar = (HPionTrackerGeomPar *) gHades->getRuntimeDb()->getContainer ("PionTrackerGeomPar");

    if (!pGeompar) return kFALSE;

    pCalCat = gHades->getCurrentEvent()->getCategory (catPionTrackerCal);

    if (!pCalCat)
    {
	Error ("init()", "HPionTrackerCal category not available!");
	return kFALSE;
    }

    iter = (HIterator *) pCalCat->MakeIterator();
    loccal.set (2, 0, 0);

    pHitCat = det->buildCategory (catPionTrackerHit);
    if (!pHitCat) return kFALSE;

    loc.set(2, 0, 0);

    fActive = kTRUE;

    return kTRUE;
}

Int_t HPionTrackerHitF::execute (void)
{
    // make hits
    HPionTrackerCal * pCal = NULL;
    HPionTrackerHit * pHit = NULL;

    const Int_t modules = pHitfpar->getNumModules();

    strips_vec fired_strips[modules];
    strips_vec can_strips[modules];
    //clus_cand_vec clus_cand[modules];
    //clusters_vec clusters[modules];

    for (Int_t entry = 0; entry < pCalCat->getEntries(); ++entry)
    {
	if (NULL == (pCal = static_cast<HPionTrackerCal *> (pCalCat->getObject (entry))))
	{
	    Error ("execute", "Pointer to HPionTrackerCal object == NULL, returning");
	    return -1;
	}

	Int_t module = pCal->getModule();
	Int_t strip = pCal->getStrip();

	size_t mult = pCal->getMultiplicity();

	Float_t win_l = pHitfpar->getTimeWindowOffset(module);
	Float_t win_u = pHitfpar->getTimeWindowWidth(module) + win_l;
	//

	// put all fired strips info into array
	for (size_t i = 0; i < mult; ++i)
	{
	    Float_t hit_t;
	    Float_t hit_c;
	    // get time and charge
	    pCal->getTimeAndCharge(i, hit_t, hit_c);

	    // check if time is inside the selection window
	    if ( (hit_t < win_l) or (hit_t > win_u))  // ----------------------------or (hit_c < q_thresh) )
		continue;

	    //---------------------------------------------------------------
	    // fix warnings gcc < 4.7
	    std::pair<Int_t, Float_t> pinner(strip, hit_c);
	    StripData stripdat(hit_t,pinner);
	    fired_strips[module].push_back(stripdat);
	    //fired_strips[module].push_back( { hit_t, { strip, hit_c } } );  //  for C++11 gcc > 4.7
	    //---------------------------------------------------------------
	}
    }

    //-----------------------------------------------------HIT SELECTION ONLY BY TIME +Charge  (Joana & Alessandro) ------------------------------------------------------------------------

    hit hits;

    hits.h[0].clear();
    hits.h[1].clear();


    // FIRST : Loop over strips to check for crosstalk. If 2 or 3 near strips (of the same module) are fired than merge together as only 1 hit

    for (Int_t m1 = 0; m1 < modules; ++m1)
    {
	for (UInt_t h1 = 0; h1 < fired_strips[m1].size(); ++h1)
	{
	    Float_t stripdiff1=fired_strips[m1][h1].second.first-fired_strips[m1][h1+1].second.first;
	    Float_t stripdiff2=fired_strips[m1][h1].second.first-fired_strips[m1][h1+2].second.first;
	    if(abs(stripdiff1)==1)
	    {
		if(abs(stripdiff2)==2)
		{
		    Int_t av_strip=fired_strips[m1][h1+1].second.first;
		    Float_t av_time=(fired_strips[m1][h1].first+fired_strips[m1][h1+1].first+fired_strips[m1][h1+2].first)/3.;
		    Float_t av_charge=(fired_strips[m1][h1].second.second+fired_strips[m1][h1+1].second.second+fired_strips[m1][h1+2].second.second)/3.;
		    std::pair<Int_t, Float_t> stripper(av_strip, av_charge);
		    StripData stripcandat(av_time,stripper);
		    can_strips[m1].push_back(stripcandat);
		    h1++;

		}
		else
		{
		    Int_t av_strip=fired_strips[m1][h1].second.first;
		    Float_t av_time=(fired_strips[m1][h1].first+fired_strips[m1][h1+1].first)/2.;
		    Float_t av_charge=(fired_strips[m1][h1].second.second+fired_strips[m1][h1+1].second.second)/2.;
		    std::pair<Int_t, Float_t> stripper(av_strip, av_charge);
		    StripData stripcandat(av_time,stripper);
		    can_strips[m1].push_back(stripcandat);

		}
		h1++;

	    }
	    else
	    {
		std::pair<Int_t, Float_t> stripper(fired_strips[m1][h1].second.first,fired_strips[m1][h1].second.second);
		StripData stripcandat(fired_strips[m1][h1].first,stripper);
		can_strips[m1].push_back(stripcandat);

	    }
	}
    }


    // SECOND: Loop over all hit candidates and application of the -30:30 time difference between front&back sides of each detector + charge difference cut

    for (Int_t m1 = 0; m1 < modules; ++m1)
    {
	Float_t clus_time_diff = pHitfpar->getClusterDistT(m1);
	Float_t charge_diff = pHitfpar->getChargeThresh(m1);

	for (Int_t m2 = m1+1; m2< modules; ++m2)
	{
	    for (UInt_t h1 = 0; h1 < can_strips[m1].size(); ++h1)
	    {
		for (UInt_t h2 = 0; h2 < can_strips[m2].size(); ++h2)
		{
		    Float_t difft = can_strips[m1][h1].first-can_strips[m2][h2].first;

		    if (difft > (-1. * clus_time_diff) and difft < clus_time_diff) //time difference cut
		    {

			Float_t diffc = can_strips[m1][h1].second.second-can_strips[m2][h2].second.second;
			Float_t radius = sqrt(diffc*diffc + difft * difft);

			if (m1 == 0 and m2 == 1) // first detector
			{
			    Float_t chargethr_u =  charge_diff;
			    Float_t chargethr_l =  -1.0 * charge_diff;

			    if (can_strips[m1][h1].second.second != HPionTrackerCal::InvalidAdc() and can_strips[m2][h2].second.second != HPionTrackerCal::InvalidAdc() ) // check for valid ADC data
			    {
				if( diffc >= chargethr_l and diffc <= chargethr_u) //charge difference cut
				{
				    Float_t avg_t = (can_strips[m1][h1].first+can_strips[m2][h2].first)/2.;
				    Float_t avg_c = (can_strips[m1][h1].second.second+can_strips[m2][h2].second.second)/2.;

				    HitCanData can;
				    can.radtimecharge = radius;
				    can.posX = can_strips[m1][h1].second.first;
				    can.timeX = can_strips[m1][h1].first;
				    can.chargeX = can_strips[m1][h1].second.second;
				    can.eventnrX = h1;
				    can.posY = can_strips[m2][h2].second.first;
				    can.timeY = can_strips[m2][h2].first;
				    can.chargeY = can_strips[m2][h2].second.second;
				    can.eventnrY = h2;
				    can.timeavg = avg_t;
				    can.chargeavg = avg_c;
				    hits.h[0].push_back(can);
				}
			    }

			    else
			    {	Float_t avg_t = (can_strips[m1][h1].first+can_strips[m2][h2].first)/2.;
				Float_t avg_c = (can_strips[m1][h1].second.second+can_strips[m2][h2].second.second)/2.;

			    HitCanData can;
			    can.radtimecharge = radius;
			    can.posX = can_strips[m1][h1].second.first;
			    can.timeX = can_strips[m1][h1].first;
			    can.chargeX = can_strips[m1][h1].second.second;
			    can.eventnrX = h1;
			    can.posY = can_strips[m2][h2].second.first;
			    can.timeY = can_strips[m2][h2].first;
			    can.chargeY = can_strips[m2][h2].second.second;
			    can.eventnrY = h2;
			    can.timeavg = avg_t;
			    can.chargeavg = avg_c;
			    hits.h[0].push_back(can);

			    }
			}

			if (m1 == 2 and m2 == 3) //second detector
			{
			    Float_t chargethr_u =  charge_diff;
			    Float_t chargethr_l =  -1.0 * charge_diff;

			    if (can_strips[m1][h1].second.second != HPionTrackerCal::InvalidAdc() and can_strips[m2][h2].second.second != HPionTrackerCal::InvalidAdc()) // check for valid ADC data
			    {

				if( diffc >= chargethr_l and diffc <= chargethr_u) //charge difference cut
				{
				    Float_t avg_t = (can_strips[m1][h1].first+can_strips[m2][h2].first)/2.;
				    Float_t avg_c = (can_strips[m1][h1].second.second+can_strips[m2][h2].second.second)/2.;

				    HitCanData can;
				    can.radtimecharge = radius;
				    can.posX = can_strips[m1][h1].second.first;
				    can.timeX = can_strips[m1][h1].first;
				    can.chargeX = can_strips[m1][h1].second.second;
				    can.eventnrX = h1;
				    can.posY = can_strips[m2][h2].second.first;
				    can.timeY = can_strips[m2][h2].first;
				    can.chargeY = can_strips[m2][h2].second.second;
				    can.eventnrY = h2;
				    can.timeavg = avg_t;
				    can.chargeavg = avg_c;
				    hits.h[1].push_back(can);
				}
			    }

			    else
			    {
				Float_t avg_t = (can_strips[m1][h1].first+can_strips[m2][h2].first)/2.;
				Float_t avg_c = (can_strips[m1][h1].second.second+can_strips[m2][h2].second.second)/2.;

				HitCanData can;
				can.radtimecharge = radius;
				can.posX = can_strips[m1][h1].second.first;
				can.timeX = can_strips[m1][h1].first;
				can.chargeX = can_strips[m1][h1].second.second;
				can.eventnrX = h1;
				can.posY = can_strips[m2][h2].second.first;
				can.timeY = can_strips[m2][h2].first;
				can.chargeY = can_strips[m2][h2].second.second;
				can.eventnrY = h2;
				can.timeavg = avg_t;
				can.chargeavg = avg_c;
				hits.h[1].push_back(can);
			    }
			}
		    }
		}
	    }
	}
    }

    //Sorting minimal radius(minimal time difference & minimal charge difference) (Preparing for clustering)
    std::sort(hits.h[1].begin(), hits.h[1].end(), HPionTrackerHitF::sortfunction);
    std::sort(hits.h[0].begin(), hits.h[0].end(), HPionTrackerHitF::sortfunction);

    //FORTH: Loop over particles: CLUSTERING (if ADC valid)
    for (Int_t p = 0; p < 2; ++p)
    {
	for (UInt_t h1 = 0; h1 < hits.h[p].size(); ++h1)
	{
	    if (hits.h[p][h1].chargeX == HPionTrackerCal::InvalidAdc())
		continue;

	    int eventnrX_ref = hits.h[p][h1].eventnrX;
	    int eventnrY_ref = hits.h[p][h1].eventnrY;

	    for (UInt_t h2 = h1+1; h2 < hits.h[p].size(); ++h2)
	    {
		int eventnrX = hits.h[p][h2].eventnrX;
		int eventnrY = hits.h[p][h2].eventnrY;

		if (eventnrX_ref == eventnrX or eventnrY_ref == eventnrY)
		{
		    hits.h[p].erase(hits.h[p].begin()+h2);
		    --h2;
		}
	    }
	}
    }


    //--------------------------------------------------END-------------------------------------------------------------------------------------

    // make hit matching for each plane
    for (Int_t p = 0; p < pHitfpar->getNumPlanes(); ++p)
    {
	Int_t planeX, planeY;
	pHitfpar->getPlanePair(p, planeX,  planeY); // (0 1), (2 3)

	HPionTrackerDetGeomPar * dgeo = pGeompar->getDetector(p); // detector geometry
	HGeomTransform gt = dgeo->getLabTransform();           // transformation info

	Int_t plane_hit_cnt = 0;
	loc[0] = p;

	for (size_t i = 0; i < hits.h[p].size(); ++i)
	{
	    loc[1] = plane_hit_cnt++; //first save value to loc[1], then increase hit counter by one

	    pHit = (HPionTrackerHit*)pHitCat->getObject(loc);
	    if (!pHit)
	    {
		pHit = (HPionTrackerHit *)pHitCat->getSlot(loc);
		if (pHit)
		{
		    pHit = new(pHit) HPionTrackerHit;
		    pHit->setPlaneHit(p, loc[1]); // save plane & hit number info to the object

		    pHit->setTimeAndCharge(hits.h[p][i].timeX, hits.h[p][i].chargeX, hits.h[p][i].timeY, hits.h[p][i].chargeY);
		    pHit->setLocalPos(hits.h[p][i].posX, hits.h[p][i].posY);

		    // hit postion in the local frame
		    HGeomVector v1(
				   dgeo->getStripPos(hits.h[p][i].posX),
				   dgeo->getStripPos(hits.h[p][i].posY),
				   0);

		    // hit position in the lab frame
		    HGeomVector v2 = gt.getTransVector() + gt.getRotMatrix() * v1;

		    // set lab values to the object
		    pHit->setLabPos(v2.getX(), v2.getY(), v2.getZ());
		}
		else
		{
		    Error("execute()", "Can't get slot plane=%i, cnt=%i for hit %lu",
			  loc[0], loc[1], i+1);
		    return 0;
		}
	    }
	    else
	    {
		Error("execute()", "Slot already exists for plane=%i, cnt=%i", loc[0], loc[1]);
		return -1;
	    }
	}
    }
    return 0;
}
 hpiontrackerhitf.cc:1
 hpiontrackerhitf.cc:2
 hpiontrackerhitf.cc:3
 hpiontrackerhitf.cc:4
 hpiontrackerhitf.cc:5
 hpiontrackerhitf.cc:6
 hpiontrackerhitf.cc:7
 hpiontrackerhitf.cc:8
 hpiontrackerhitf.cc:9
 hpiontrackerhitf.cc:10
 hpiontrackerhitf.cc:11
 hpiontrackerhitf.cc:12
 hpiontrackerhitf.cc:13
 hpiontrackerhitf.cc:14
 hpiontrackerhitf.cc:15
 hpiontrackerhitf.cc:16
 hpiontrackerhitf.cc:17
 hpiontrackerhitf.cc:18
 hpiontrackerhitf.cc:19
 hpiontrackerhitf.cc:20
 hpiontrackerhitf.cc:21
 hpiontrackerhitf.cc:22
 hpiontrackerhitf.cc:23
 hpiontrackerhitf.cc:24
 hpiontrackerhitf.cc:25
 hpiontrackerhitf.cc:26
 hpiontrackerhitf.cc:27
 hpiontrackerhitf.cc:28
 hpiontrackerhitf.cc:29
 hpiontrackerhitf.cc:30
 hpiontrackerhitf.cc:31
 hpiontrackerhitf.cc:32
 hpiontrackerhitf.cc:33
 hpiontrackerhitf.cc:34
 hpiontrackerhitf.cc:35
 hpiontrackerhitf.cc:36
 hpiontrackerhitf.cc:37
 hpiontrackerhitf.cc:38
 hpiontrackerhitf.cc:39
 hpiontrackerhitf.cc:40
 hpiontrackerhitf.cc:41
 hpiontrackerhitf.cc:42
 hpiontrackerhitf.cc:43
 hpiontrackerhitf.cc:44
 hpiontrackerhitf.cc:45
 hpiontrackerhitf.cc:46
 hpiontrackerhitf.cc:47
 hpiontrackerhitf.cc:48
 hpiontrackerhitf.cc:49
 hpiontrackerhitf.cc:50
 hpiontrackerhitf.cc:51
 hpiontrackerhitf.cc:52
 hpiontrackerhitf.cc:53
 hpiontrackerhitf.cc:54
 hpiontrackerhitf.cc:55
 hpiontrackerhitf.cc:56
 hpiontrackerhitf.cc:57
 hpiontrackerhitf.cc:58
 hpiontrackerhitf.cc:59
 hpiontrackerhitf.cc:60
 hpiontrackerhitf.cc:61
 hpiontrackerhitf.cc:62
 hpiontrackerhitf.cc:63
 hpiontrackerhitf.cc:64
 hpiontrackerhitf.cc:65
 hpiontrackerhitf.cc:66
 hpiontrackerhitf.cc:67
 hpiontrackerhitf.cc:68
 hpiontrackerhitf.cc:69
 hpiontrackerhitf.cc:70
 hpiontrackerhitf.cc:71
 hpiontrackerhitf.cc:72
 hpiontrackerhitf.cc:73
 hpiontrackerhitf.cc:74
 hpiontrackerhitf.cc:75
 hpiontrackerhitf.cc:76
 hpiontrackerhitf.cc:77
 hpiontrackerhitf.cc:78
 hpiontrackerhitf.cc:79
 hpiontrackerhitf.cc:80
 hpiontrackerhitf.cc:81
 hpiontrackerhitf.cc:82
 hpiontrackerhitf.cc:83
 hpiontrackerhitf.cc:84
 hpiontrackerhitf.cc:85
 hpiontrackerhitf.cc:86
 hpiontrackerhitf.cc:87
 hpiontrackerhitf.cc:88
 hpiontrackerhitf.cc:89
 hpiontrackerhitf.cc:90
 hpiontrackerhitf.cc:91
 hpiontrackerhitf.cc:92
 hpiontrackerhitf.cc:93
 hpiontrackerhitf.cc:94
 hpiontrackerhitf.cc:95
 hpiontrackerhitf.cc:96
 hpiontrackerhitf.cc:97
 hpiontrackerhitf.cc:98
 hpiontrackerhitf.cc:99
 hpiontrackerhitf.cc:100
 hpiontrackerhitf.cc:101
 hpiontrackerhitf.cc:102
 hpiontrackerhitf.cc:103
 hpiontrackerhitf.cc:104
 hpiontrackerhitf.cc:105
 hpiontrackerhitf.cc:106
 hpiontrackerhitf.cc:107
 hpiontrackerhitf.cc:108
 hpiontrackerhitf.cc:109
 hpiontrackerhitf.cc:110
 hpiontrackerhitf.cc:111
 hpiontrackerhitf.cc:112
 hpiontrackerhitf.cc:113
 hpiontrackerhitf.cc:114
 hpiontrackerhitf.cc:115
 hpiontrackerhitf.cc:116
 hpiontrackerhitf.cc:117
 hpiontrackerhitf.cc:118
 hpiontrackerhitf.cc:119
 hpiontrackerhitf.cc:120
 hpiontrackerhitf.cc:121
 hpiontrackerhitf.cc:122
 hpiontrackerhitf.cc:123
 hpiontrackerhitf.cc:124
 hpiontrackerhitf.cc:125
 hpiontrackerhitf.cc:126
 hpiontrackerhitf.cc:127
 hpiontrackerhitf.cc:128
 hpiontrackerhitf.cc:129
 hpiontrackerhitf.cc:130
 hpiontrackerhitf.cc:131
 hpiontrackerhitf.cc:132
 hpiontrackerhitf.cc:133
 hpiontrackerhitf.cc:134
 hpiontrackerhitf.cc:135
 hpiontrackerhitf.cc:136
 hpiontrackerhitf.cc:137
 hpiontrackerhitf.cc:138
 hpiontrackerhitf.cc:139
 hpiontrackerhitf.cc:140
 hpiontrackerhitf.cc:141
 hpiontrackerhitf.cc:142
 hpiontrackerhitf.cc:143
 hpiontrackerhitf.cc:144
 hpiontrackerhitf.cc:145
 hpiontrackerhitf.cc:146
 hpiontrackerhitf.cc:147
 hpiontrackerhitf.cc:148
 hpiontrackerhitf.cc:149
 hpiontrackerhitf.cc:150
 hpiontrackerhitf.cc:151
 hpiontrackerhitf.cc:152
 hpiontrackerhitf.cc:153
 hpiontrackerhitf.cc:154
 hpiontrackerhitf.cc:155
 hpiontrackerhitf.cc:156
 hpiontrackerhitf.cc:157
 hpiontrackerhitf.cc:158
 hpiontrackerhitf.cc:159
 hpiontrackerhitf.cc:160
 hpiontrackerhitf.cc:161
 hpiontrackerhitf.cc:162
 hpiontrackerhitf.cc:163
 hpiontrackerhitf.cc:164
 hpiontrackerhitf.cc:165
 hpiontrackerhitf.cc:166
 hpiontrackerhitf.cc:167
 hpiontrackerhitf.cc:168
 hpiontrackerhitf.cc:169
 hpiontrackerhitf.cc:170
 hpiontrackerhitf.cc:171
 hpiontrackerhitf.cc:172
 hpiontrackerhitf.cc:173
 hpiontrackerhitf.cc:174
 hpiontrackerhitf.cc:175
 hpiontrackerhitf.cc:176
 hpiontrackerhitf.cc:177
 hpiontrackerhitf.cc:178
 hpiontrackerhitf.cc:179
 hpiontrackerhitf.cc:180
 hpiontrackerhitf.cc:181
 hpiontrackerhitf.cc:182
 hpiontrackerhitf.cc:183
 hpiontrackerhitf.cc:184
 hpiontrackerhitf.cc:185
 hpiontrackerhitf.cc:186
 hpiontrackerhitf.cc:187
 hpiontrackerhitf.cc:188
 hpiontrackerhitf.cc:189
 hpiontrackerhitf.cc:190
 hpiontrackerhitf.cc:191
 hpiontrackerhitf.cc:192
 hpiontrackerhitf.cc:193
 hpiontrackerhitf.cc:194
 hpiontrackerhitf.cc:195
 hpiontrackerhitf.cc:196
 hpiontrackerhitf.cc:197
 hpiontrackerhitf.cc:198
 hpiontrackerhitf.cc:199
 hpiontrackerhitf.cc:200
 hpiontrackerhitf.cc:201
 hpiontrackerhitf.cc:202
 hpiontrackerhitf.cc:203
 hpiontrackerhitf.cc:204
 hpiontrackerhitf.cc:205
 hpiontrackerhitf.cc:206
 hpiontrackerhitf.cc:207
 hpiontrackerhitf.cc:208
 hpiontrackerhitf.cc:209
 hpiontrackerhitf.cc:210
 hpiontrackerhitf.cc:211
 hpiontrackerhitf.cc:212
 hpiontrackerhitf.cc:213
 hpiontrackerhitf.cc:214
 hpiontrackerhitf.cc:215
 hpiontrackerhitf.cc:216
 hpiontrackerhitf.cc:217
 hpiontrackerhitf.cc:218
 hpiontrackerhitf.cc:219
 hpiontrackerhitf.cc:220
 hpiontrackerhitf.cc:221
 hpiontrackerhitf.cc:222
 hpiontrackerhitf.cc:223
 hpiontrackerhitf.cc:224
 hpiontrackerhitf.cc:225
 hpiontrackerhitf.cc:226
 hpiontrackerhitf.cc:227
 hpiontrackerhitf.cc:228
 hpiontrackerhitf.cc:229
 hpiontrackerhitf.cc:230
 hpiontrackerhitf.cc:231
 hpiontrackerhitf.cc:232
 hpiontrackerhitf.cc:233
 hpiontrackerhitf.cc:234
 hpiontrackerhitf.cc:235
 hpiontrackerhitf.cc:236
 hpiontrackerhitf.cc:237
 hpiontrackerhitf.cc:238
 hpiontrackerhitf.cc:239
 hpiontrackerhitf.cc:240
 hpiontrackerhitf.cc:241
 hpiontrackerhitf.cc:242
 hpiontrackerhitf.cc:243
 hpiontrackerhitf.cc:244
 hpiontrackerhitf.cc:245
 hpiontrackerhitf.cc:246
 hpiontrackerhitf.cc:247
 hpiontrackerhitf.cc:248
 hpiontrackerhitf.cc:249
 hpiontrackerhitf.cc:250
 hpiontrackerhitf.cc:251
 hpiontrackerhitf.cc:252
 hpiontrackerhitf.cc:253
 hpiontrackerhitf.cc:254
 hpiontrackerhitf.cc:255
 hpiontrackerhitf.cc:256
 hpiontrackerhitf.cc:257
 hpiontrackerhitf.cc:258
 hpiontrackerhitf.cc:259
 hpiontrackerhitf.cc:260
 hpiontrackerhitf.cc:261
 hpiontrackerhitf.cc:262
 hpiontrackerhitf.cc:263
 hpiontrackerhitf.cc:264
 hpiontrackerhitf.cc:265
 hpiontrackerhitf.cc:266
 hpiontrackerhitf.cc:267
 hpiontrackerhitf.cc:268
 hpiontrackerhitf.cc:269
 hpiontrackerhitf.cc:270
 hpiontrackerhitf.cc:271
 hpiontrackerhitf.cc:272
 hpiontrackerhitf.cc:273
 hpiontrackerhitf.cc:274
 hpiontrackerhitf.cc:275
 hpiontrackerhitf.cc:276
 hpiontrackerhitf.cc:277
 hpiontrackerhitf.cc:278
 hpiontrackerhitf.cc:279
 hpiontrackerhitf.cc:280
 hpiontrackerhitf.cc:281
 hpiontrackerhitf.cc:282
 hpiontrackerhitf.cc:283
 hpiontrackerhitf.cc:284
 hpiontrackerhitf.cc:285
 hpiontrackerhitf.cc:286
 hpiontrackerhitf.cc:287
 hpiontrackerhitf.cc:288
 hpiontrackerhitf.cc:289
 hpiontrackerhitf.cc:290
 hpiontrackerhitf.cc:291
 hpiontrackerhitf.cc:292
 hpiontrackerhitf.cc:293
 hpiontrackerhitf.cc:294
 hpiontrackerhitf.cc:295
 hpiontrackerhitf.cc:296
 hpiontrackerhitf.cc:297
 hpiontrackerhitf.cc:298
 hpiontrackerhitf.cc:299
 hpiontrackerhitf.cc:300
 hpiontrackerhitf.cc:301
 hpiontrackerhitf.cc:302
 hpiontrackerhitf.cc:303
 hpiontrackerhitf.cc:304
 hpiontrackerhitf.cc:305
 hpiontrackerhitf.cc:306
 hpiontrackerhitf.cc:307
 hpiontrackerhitf.cc:308
 hpiontrackerhitf.cc:309
 hpiontrackerhitf.cc:310
 hpiontrackerhitf.cc:311
 hpiontrackerhitf.cc:312
 hpiontrackerhitf.cc:313
 hpiontrackerhitf.cc:314
 hpiontrackerhitf.cc:315
 hpiontrackerhitf.cc:316
 hpiontrackerhitf.cc:317
 hpiontrackerhitf.cc:318
 hpiontrackerhitf.cc:319
 hpiontrackerhitf.cc:320
 hpiontrackerhitf.cc:321
 hpiontrackerhitf.cc:322
 hpiontrackerhitf.cc:323
 hpiontrackerhitf.cc:324
 hpiontrackerhitf.cc:325
 hpiontrackerhitf.cc:326
 hpiontrackerhitf.cc:327
 hpiontrackerhitf.cc:328
 hpiontrackerhitf.cc:329
 hpiontrackerhitf.cc:330
 hpiontrackerhitf.cc:331
 hpiontrackerhitf.cc:332
 hpiontrackerhitf.cc:333
 hpiontrackerhitf.cc:334
 hpiontrackerhitf.cc:335
 hpiontrackerhitf.cc:336
 hpiontrackerhitf.cc:337
 hpiontrackerhitf.cc:338
 hpiontrackerhitf.cc:339
 hpiontrackerhitf.cc:340
 hpiontrackerhitf.cc:341
 hpiontrackerhitf.cc:342
 hpiontrackerhitf.cc:343
 hpiontrackerhitf.cc:344
 hpiontrackerhitf.cc:345
 hpiontrackerhitf.cc:346
 hpiontrackerhitf.cc:347
 hpiontrackerhitf.cc:348
 hpiontrackerhitf.cc:349
 hpiontrackerhitf.cc:350
 hpiontrackerhitf.cc:351
 hpiontrackerhitf.cc:352
 hpiontrackerhitf.cc:353
 hpiontrackerhitf.cc:354
 hpiontrackerhitf.cc:355
 hpiontrackerhitf.cc:356
 hpiontrackerhitf.cc:357
 hpiontrackerhitf.cc:358
 hpiontrackerhitf.cc:359
 hpiontrackerhitf.cc:360
 hpiontrackerhitf.cc:361
 hpiontrackerhitf.cc:362
 hpiontrackerhitf.cc:363
 hpiontrackerhitf.cc:364
 hpiontrackerhitf.cc:365
 hpiontrackerhitf.cc:366
 hpiontrackerhitf.cc:367
 hpiontrackerhitf.cc:368
 hpiontrackerhitf.cc:369
 hpiontrackerhitf.cc:370
 hpiontrackerhitf.cc:371
 hpiontrackerhitf.cc:372
 hpiontrackerhitf.cc:373
 hpiontrackerhitf.cc:374
 hpiontrackerhitf.cc:375
 hpiontrackerhitf.cc:376
 hpiontrackerhitf.cc:377
 hpiontrackerhitf.cc:378
 hpiontrackerhitf.cc:379
 hpiontrackerhitf.cc:380
 hpiontrackerhitf.cc:381
 hpiontrackerhitf.cc:382
 hpiontrackerhitf.cc:383
 hpiontrackerhitf.cc:384
 hpiontrackerhitf.cc:385
 hpiontrackerhitf.cc:386
 hpiontrackerhitf.cc:387
 hpiontrackerhitf.cc:388
 hpiontrackerhitf.cc:389
 hpiontrackerhitf.cc:390
 hpiontrackerhitf.cc:391
 hpiontrackerhitf.cc:392
 hpiontrackerhitf.cc:393
 hpiontrackerhitf.cc:394
 hpiontrackerhitf.cc:395
 hpiontrackerhitf.cc:396
 hpiontrackerhitf.cc:397
 hpiontrackerhitf.cc:398
 hpiontrackerhitf.cc:399
 hpiontrackerhitf.cc:400
 hpiontrackerhitf.cc:401
 hpiontrackerhitf.cc:402
 hpiontrackerhitf.cc:403
 hpiontrackerhitf.cc:404
 hpiontrackerhitf.cc:405
 hpiontrackerhitf.cc:406
 hpiontrackerhitf.cc:407
 hpiontrackerhitf.cc:408
 hpiontrackerhitf.cc:409
 hpiontrackerhitf.cc:410
 hpiontrackerhitf.cc:411
 hpiontrackerhitf.cc:412
 hpiontrackerhitf.cc:413
 hpiontrackerhitf.cc:414
 hpiontrackerhitf.cc:415
 hpiontrackerhitf.cc:416
 hpiontrackerhitf.cc:417
 hpiontrackerhitf.cc:418
 hpiontrackerhitf.cc:419
 hpiontrackerhitf.cc:420
 hpiontrackerhitf.cc:421
 hpiontrackerhitf.cc:422
 hpiontrackerhitf.cc:423
 hpiontrackerhitf.cc:424
 hpiontrackerhitf.cc:425
 hpiontrackerhitf.cc:426
 hpiontrackerhitf.cc:427
 hpiontrackerhitf.cc:428
 hpiontrackerhitf.cc:429
 hpiontrackerhitf.cc:430
 hpiontrackerhitf.cc:431
 hpiontrackerhitf.cc:432
 hpiontrackerhitf.cc:433
 hpiontrackerhitf.cc:434
 hpiontrackerhitf.cc:435
 hpiontrackerhitf.cc:436
 hpiontrackerhitf.cc:437
 hpiontrackerhitf.cc:438
 hpiontrackerhitf.cc:439
 hpiontrackerhitf.cc:440
 hpiontrackerhitf.cc:441
 hpiontrackerhitf.cc:442
 hpiontrackerhitf.cc:443
 hpiontrackerhitf.cc:444
 hpiontrackerhitf.cc:445
 hpiontrackerhitf.cc:446
 hpiontrackerhitf.cc:447
 hpiontrackerhitf.cc:448
 hpiontrackerhitf.cc:449
 hpiontrackerhitf.cc:450
 hpiontrackerhitf.cc:451
 hpiontrackerhitf.cc:452
 hpiontrackerhitf.cc:453
 hpiontrackerhitf.cc:454
 hpiontrackerhitf.cc:455
 hpiontrackerhitf.cc:456
 hpiontrackerhitf.cc:457
 hpiontrackerhitf.cc:458
 hpiontrackerhitf.cc:459
 hpiontrackerhitf.cc:460
 hpiontrackerhitf.cc:461
 hpiontrackerhitf.cc:462
 hpiontrackerhitf.cc:463
 hpiontrackerhitf.cc:464
 hpiontrackerhitf.cc:465
 hpiontrackerhitf.cc:466
 hpiontrackerhitf.cc:467
 hpiontrackerhitf.cc:468
 hpiontrackerhitf.cc:469
 hpiontrackerhitf.cc:470
 hpiontrackerhitf.cc:471
 hpiontrackerhitf.cc:472
 hpiontrackerhitf.cc:473
 hpiontrackerhitf.cc:474
 hpiontrackerhitf.cc:475
 hpiontrackerhitf.cc:476
 hpiontrackerhitf.cc:477
 hpiontrackerhitf.cc:478
 hpiontrackerhitf.cc:479
 hpiontrackerhitf.cc:480
 hpiontrackerhitf.cc:481
 hpiontrackerhitf.cc:482
 hpiontrackerhitf.cc:483
 hpiontrackerhitf.cc:484
 hpiontrackerhitf.cc:485
 hpiontrackerhitf.cc:486
 hpiontrackerhitf.cc:487
 hpiontrackerhitf.cc:488
 hpiontrackerhitf.cc:489
 hpiontrackerhitf.cc:490
 hpiontrackerhitf.cc:491
 hpiontrackerhitf.cc:492
 hpiontrackerhitf.cc:493
 hpiontrackerhitf.cc:494
 hpiontrackerhitf.cc:495
 hpiontrackerhitf.cc:496
 hpiontrackerhitf.cc:497
 hpiontrackerhitf.cc:498
 hpiontrackerhitf.cc:499
 hpiontrackerhitf.cc:500
 hpiontrackerhitf.cc:501
 hpiontrackerhitf.cc:502
 hpiontrackerhitf.cc:503
 hpiontrackerhitf.cc:504
 hpiontrackerhitf.cc:505
 hpiontrackerhitf.cc:506
 hpiontrackerhitf.cc:507
 hpiontrackerhitf.cc:508
 hpiontrackerhitf.cc:509
 hpiontrackerhitf.cc:510
 hpiontrackerhitf.cc:511
 hpiontrackerhitf.cc:512
 hpiontrackerhitf.cc:513
 hpiontrackerhitf.cc:514
 hpiontrackerhitf.cc:515
 hpiontrackerhitf.cc:516
 hpiontrackerhitf.cc:517
 hpiontrackerhitf.cc:518
 hpiontrackerhitf.cc:519
 hpiontrackerhitf.cc:520
 hpiontrackerhitf.cc:521
 hpiontrackerhitf.cc:522