ROOT logo
//*-- Author : M.Sanchez (14.06.2000)
#include "hparticlevertexfind.h"
#include "hcategory.h"
#include "hmdcgeompar.h"
#include "hades.h"
#include "htool.h"
#include "hevent.h"
#include "hruntimedb.h"
#include "hspectrometer.h"
#include "hgeomvector.h"
#include "hparticlecand.h"
#include "hgeomvolume.h"
#include "hrecevent.h"
#include "hpartialevent.h"

#include "hcategorymanager.h"
#include "hparticletool.h"
#include "hparticledef.h"

#include "TMath.h"


#include <vector>

//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////
// HParticleVertexFind
//
//   Vertex finder using weighted LSM with optional Tukey weights
//
// To use it in a macro just add
//
// taskset->add(new HParticleVertexFind("name","title",tukey)
//
// where  input data is read from HParticleCand (r,z,phi,theta from RK)
// Only candidate flagged kIsUsed are taken into account . Inner segment
// is require to be fitted and RK chi2 < 1000. Candidates markes as fakes
// are skipped by default.
//
// As for 'tukey' it can be kTRUE or kFALSE depending on if Tukey weights
// should be used in the minimization. For low multiplicity environments
// like C+C I would recomend kFALSE; at least until I have found better
// parameters for the Tukey weigths minimization.
//
/////////////////////////////////////////

Bool_t  HParticleVertexFind::doSkipFakes = kTRUE;

HParticleVertexFind::HParticleVertexFind(const Text_t name[],const Text_t title[], Bool_t tukey) :
    HReconstructor(name,title),fPos("HGeomVector",300),
    fAlpha("HGeomVector",300)
{
    initVars();
    useTukeyWeights(tukey);
}

HParticleVertexFind::~HParticleVertexFind(void)
{
    initVars();
}

void HParticleVertexFind::initVars(void)
{
    fInput         = 0;
    fGeometry      = 0;
    fMaxIterations = 100;
    fTukeyConst    = 6.0;
    fEpsilon       = .3;
    fUsingTukey    = kTRUE;

    fmomChi2Cut  = 100;
    fseg0Chi2Cut = 6;  // cut 10%
    fcallExecuteManual = kFALSE;
    setCut(-120,20,15);
    setMinReqTracks(10);
    setMinWindow(2);
    fProgressiveTukey = kFALSE;
}

Bool_t HParticleVertexFind::init(void)
{
    HRuntimeDb *rtdb = gHades->getRuntimeDb();
    HRecEvent *ev    = dynamic_cast<HRecEvent *>(gHades->getCurrentEvent());
    if(!ev) {return kFALSE;}

    fInput = gHades->getCurrentEvent()->getCategory(catParticleCand);
    if(!fInput) { Warning("init()","No catParticleCand category in input!");}

    if(fInput){
	fGeometry     = (HMdcGeomPar *) rtdb->getContainer("MdcGeomPar");
	fSpecGeometry = (HSpecGeomPar *)rtdb->getContainer("SpecGeomPar");
    }
    return kTRUE;
}

Bool_t HParticleVertexFind::finalize(void)
{
    return kTRUE;
}

Bool_t HParticleVertexFind::pointsToTarget(const HGeomVector &r,HGeomVector &alpha,
					   Int_t sector,Int_t module, Double_t locminZ,Double_t locmaxZ)
{
    Double_t bx = alpha.getX() / alpha.getZ();
    Double_t by = alpha.getY() / alpha.getZ();
    Bool_t res  = kTRUE;

    HGeomVector rmin;

    //Evaluate maximum approach to z axis
    rmin.setZ(r.getZ() - (r.getX() * bx + r.getY() * by) / (bx * bx + by * by));
    rmin.setX(r.getX() + bx * (rmin.getZ() - r.getZ()));
    rmin.setY(r.getY() + by * (rmin.getZ() - r.getZ()));
    Double_t rhomin = TMath::Sqrt(rmin.getX() * rmin.getX() +
				  rmin.getY() * rmin.getY());


    if(rmin.getZ() < locmaxZ && rmin.getZ() > locminZ && rhomin < fmaxR) {res = kTRUE;}
    else                                                                 {res = kFALSE;}

    return res;
}

void HParticleVertexFind::transform(HParticleCand *hit,
				    HGeomVector &r,HGeomVector &alpha)
{

    //Calculates position and direction vector for a Segment (theta,phi.r,alpha)

    Float_t phi   =  HParticleTool::phiLabToPhiSecDeg(hit->getPhi())*TMath::DegToRad();
    Float_t theta =  hit->getTheta() * TMath::DegToRad();

    Double_t pi2 = TMath::Pi() / 2.;

    r.setZ(hit->getZ());
    r.setX(hit->getR() * TMath::Cos(phi + pi2));
    r.setY(hit->getR() * TMath::Sin(phi + pi2));
    alpha.setZ(TMath::Cos(theta));
    alpha.setY(TMath::Sin(theta) * TMath::Sin(phi));
    alpha.setX(TMath::Sin(theta) * TMath::Cos(phi));
}

Bool_t HParticleVertexFind::readInput(HGeomVector &estimate)
{
    HGeomVector *r,*alpha,rLocal,alphaLocal;
    HParticleCand *cand = 0;
    Int_t count   = 0;
    fCands  .clear();
    fweights.clear();
    if(fInput)
    {
	//First vertex estimation and filling of fPos, fAlpha.


        //---------------------------------------------
        // get x,y shift of beam
	HVertex& vertexclust = gHades->getCurrentEvent()->getHeader()->getVertexCluster();
        Double_t locmaxZ = fmaxZ;
	Double_t locminZ = fminZ;
	Double_t xClust  = 0.;
	Double_t yClust  = 0.;

	if(vertexclust.getZ() != -1000){ // was filled
             xClust  = vertexclust.getX();
             yClust  = vertexclust.getY();
	}
        //---------------------------------------------

	fFitter.reset();

	Int_t n = fInput->getEntries();
        vector <HParticleCand*> usedCand;
        vector <HParticleCand*> usedCandFinal;

        //---------------------------------------------
	// fill starting list
	for(Int_t i = 0; i < n; i ++)
	{
	    cand = HCategoryManager::getObject(cand,fInput,i);
	    if( cand->isFakeRejected())   continue;
	    if(!cand->isFlagBit(kIsUsed)) continue;

	    if(cand->getZ() < locmaxZ && cand->getZ() > locminZ && cand->getR() < fmaxR) {
		usedCand.push_back(cand);
	    }
	}
        //---------------------------------------------

	if (usedCand.size() > 10) {  // we have enough tracks

	    vector <HParticleCand*> usedCandTmp;
	    vector <HParticleCand*> usedCandTmp2;
            vector<Double_t> values;
	    Double_t mean = 0;

	    for(UInt_t i = 0; i < usedCand.size() ; i ++){
                cand = usedCand[i];
		if(cand->getChi2()             < getMomChi2Cut()  &&
		   cand->getInnerSegmentChi2() < getSeg0Chi2Cut() &&
                   cand->getBeta() > 0 && cand->getBeta() < 1.2
		  ) {
		    usedCandFinal.push_back(cand);
		    usedCandTmp2.push_back(cand);
		    values.push_back(cand->getZprime(xClust,yClust));
		}
	    }
	    mean = TMath::Mean(values.size(),values.data());

	    //------------------------------------------------------
            // filter more
	    if(usedCandFinal.size() > 0)
	    {
                
		Double_t accepted    = usedCandFinal.size();
                Double_t window      = 40;
                Int_t maxIteration   = 20;
		Double_t fac         = 0.8;
		Int_t it = 0;

		while (accepted >= fminReqTrack && window >= fminWindow && it < maxIteration){
                    it++;
		    usedCandTmp.clear();
		    accepted = 0;
                    values.clear();
		    //------------------------------------------------------
                    // calculate new mean + accepted tracks
		    for(UInt_t i = 0; i < usedCandFinal.size() ; i ++){
			cand = usedCandFinal[i];
			Double_t zprime = cand->getZprime(xClust,yClust) ;
			if( TMath::Abs(zprime - mean) < window){
                            values.push_back(zprime);
			    usedCandTmp.push_back(cand);
			}
		    }
		    accepted = values.size();
		    //------------------------------------------------------

		    //------------------------------------------------------
		    // worked out : copy pointers
		    if(accepted >= fminReqTrack) {
			usedCandTmp2.clear();
			for(UInt_t i = 0; i < usedCandTmp.size() ; i ++){
			    usedCandTmp2.push_back(usedCandTmp[i]);
			}
			mean = TMath::Mean(values.size(),values.data());
			window *= fac; // shrink the window
		    }
		    //------------------------------------------------------

		} // end while
	    }
            //------------------------------------------------------

	    //------------------------------------------------------
            // copy to output
            usedCandFinal.clear();
	    for(UInt_t i = 0; i < usedCandTmp2.size() ; i ++){
		usedCandFinal.push_back(usedCandTmp2[i]);
	    }
            //------------------------------------------------------



	} else {  // do not cut sharp at low mult
	    for(UInt_t i = 0; i < usedCand.size() ; i ++){
		usedCandFinal.push_back(usedCand[i]);
	    }

	}

	for(UInt_t i = 0; i < usedCandFinal.size(); i ++)
	{
            cand = usedCandFinal[i] ;

	    Int_t s = cand->getSector();

	    HGeomTransform &trans = fSpecGeometry->getSector(s)->getTransform();

	    transform(cand,rLocal,alphaLocal);

	    r    = new(fPos  [count]) HGeomVector(trans.transFrom(rLocal));
	    alpha= new(fAlpha[count]) HGeomVector(trans.getRotMatrix() * alphaLocal);

	    //Feed to LSM fitter.
	    if(pointsToTarget(*r,*alpha,s,0,locminZ,locmaxZ))
	    {
		fFitter.addLine(*r,*alpha); //Default weigth =1.0
		count ++;
                fCands.push_back(cand);
                fweights.push_back(1.);
	    }
	}
    }

    if(count > 1){
	fFitter.getVertex(estimate);
    } else {
	estimate.setXYZ(-1000,-1000,-1000);
	return kFALSE;
    }
    return kTRUE;
}

Int_t HParticleVertexFind::execute(void)
{
      if (!fcallExecuteManual) return doFit();
      return 0;

}

Int_t HParticleVertexFind::doFit()
{
    HGeomVector *r,*alpha;
    HGeomVector oldVertex;
    HVertex     &event_vertex = gHades->getCurrentEvent()->getHeader()->getVertexReco();
    HGeomVector &vertex       = event_vertex.getPos();



    Int_t count = 0,iteration = 0;
    Double_t weight,residual2,temp; //Weight and residual^2

    readInput(vertex);


    if(fUsingTukey)
    {
	count = fPos.GetEntriesFast();

	Double_t locTukeyConst = fTukeyConst;

	if(fProgressiveTukey){
	    //--------------------------------------------------------
	    // progressive tukey constants
	    Double_t minTuk = 1.0;
	    Double_t maxTuk = fTukeyConst;
	    Int_t   minMult = 10;
	    Int_t   maxMult = 30;

	    if(count >= minMult && count < maxMult ){
		locTukeyConst = maxTuk - ((maxTuk-minTuk)/(maxMult-minMult)) * (count-maxMult);

	    } else if (count < minMult) {

		locTukeyConst = maxTuk;

	    } else if (count >= maxMult) {

		locTukeyConst = minTuk;
	    }
	    //--------------------------------------------------------
	}

	if(count > 1 && (vertex.Z()!=-1000. && vertex.X()!=-1000. && vertex.Y()!=-1000.))
	{
	    //Iteration on weights
	    Float_t sumOfResiduals = 0;
	    Float_t sumOfWeights   = 0;
	    for (Int_t i = 0; i < count; i ++) {
		r     = (HGeomVector *)fPos.UncheckedAt(i);
		alpha = (HGeomVector *)fAlpha.UncheckedAt(i);
		temp  = ((r->getY() - vertex.getY()) * alpha->getZ() -
			 (r->getZ() - vertex.getZ()) * alpha->getY());
		residual2 = temp * temp;
		temp = ((r->getZ() - vertex.getZ()) * alpha->getX() -
			(r->getX() - vertex.getX()) * alpha->getZ());
		residual2 += temp * temp;
		temp = ((r->getX() - vertex.getX()) * alpha->getY() -
			(r->getY() - vertex.getY()) * alpha->getX());
		residual2 += temp * temp;
		sumOfResiduals += residual2;
	    }

	    Float_t width = locTukeyConst * sqrt(sumOfResiduals);


	    iteration = 0;
	    do {
		sumOfResiduals = 0;
		sumOfWeights   = 0;
		oldVertex      = vertex;
		iteration ++;
		fFitter.reset();
		for (Int_t i = 0; i < count; i ++)
		{
		    r     = (HGeomVector *)fPos.UncheckedAt(i);
		    alpha = (HGeomVector *)fAlpha.UncheckedAt(i);
		    temp  = ((r->getY() - oldVertex.getY()) * alpha->getZ() -
			     (r->getZ() - oldVertex.getZ()) * alpha->getY());
		    residual2 = temp * temp;
		    temp = ((r->getZ() - oldVertex.getZ()) * alpha->getX() -
			    (r->getX() - oldVertex.getX()) * alpha->getZ());
		    residual2 += temp * temp;
		    temp = ((r->getX() - oldVertex.getX()) * alpha->getY() -
			    (r->getY() - oldVertex.getY()) * alpha->getX());
		    residual2 += temp * temp;



		    temp   = sqrt(residual2);
		    weight = (temp < width) ? (1. - temp / width * temp / width)  * (1. - temp/width * temp/width) : 0.0;
                    fweights[i]=weight;

		    sumOfResiduals += weight*residual2;
		    sumOfWeights   += weight;
		    fFitter.addLine(*r,*alpha,weight);
                }

                width = locTukeyConst * sqrt(sumOfResiduals / sumOfWeights);

                fFitter.getVertex(vertex);

            } while(!hasConverged(vertex,oldVertex) && (iteration < fMaxIterations));


          if(iteration < fMaxIterations){
	      event_vertex.setIterations(iteration);
	      event_vertex.setChi2(sumOfResiduals / sumOfWeights);
	      event_vertex.setSumOfWeights(sumOfWeights);
	  } else {  // iteration >= fMaxIterations
	      event_vertex.setIterations(-2);
	      event_vertex.setChi2(-1);
	      event_vertex.setSumOfWeights(-1);
	  }
       } else {  // count <= 1  or vertex fit failed
          event_vertex.setIterations(-1);
	  event_vertex.setChi2(-1);
	  event_vertex.setSumOfWeights(-1);
       }
     } else {  // !fUsingTukey
       event_vertex.setIterations(1);
       event_vertex.setChi2(-1);
       event_vertex.setSumOfWeights(-1);
     }

     for (UInt_t i = 0; i < fCands.size(); i ++){
       if(fweights[i]>0) fCands[i]->setUsedVertex();
     }

     fPos.Clear();
     fAlpha.Clear();

     return 0;
}

Bool_t HParticleVertexFind::hasConverged(HGeomVector &v,HGeomVector &oldV) {
    Bool_t r =((v - oldV).length() < fEpsilon) ? kTRUE:kFALSE;
    return r;
}

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