ROOT logo
//*-- Author   : Patrick Sellheim, Georgy Kornakov
//*-- Created  : 09/01/2014

//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HParticleBtRingF
//
//  This class predicts fired pads based on theta and phi angle of a track.
//  Predicted pads and rich cal hits are stored and used to search for
//  fired pads matching to prediction area. 
//
//
//
//
//////////////////////////////////////////////////////////////////////////////

#include "hparticlebtringf.h"
#include "TF2.h"
#include "hcategory.h"
#include "hparticlecand.h"
#include "heventheader.h"

#include "hrichcal.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hcategorymanager.h"
#include "hparticlebtangletrafo.h"



// ----------------------------------------------------------------

ClassImp(HParticleBtRingF)

// ----------------------------------------------------------------

HParticleBtRingF::HParticleBtRingF( ){

}

HParticleBtRingF::~HParticleBtRingF( ){

}


Bool_t HParticleBtRingF::init() {

    fNSector = 6;

    fBtPar =(HParticleBtPar*) gHades->getRuntimeDb()->getContainer("ParticleBtPar");
    if(!fBtPar) {
	Error ("init()", "Retrieve ZERO pointer for ParticleBtPar!");
	return kFALSE;
    }
    //Init constants
    fNVertex                = fBtPar->getNVertex();
    fNParMean               = fBtPar->getNParMean();
    fNParSigma              = fBtPar->getNParSigma();
    fNRingSeg               = fBtPar->getNRingSegments();
    fNRingSegStep           = fBtPar->getRingSegStep();
    fNRingSegOffset         = fBtPar->getRingSegOffset();

    fNRichSeg               = fBtPar->getNRichSeg();
    fRichSegBorderX         = fBtPar->getRichSegBorderX();
    fRichSegBorderY         = fBtPar->getRichSegBorderY();
  
    fThetaAngleMin          = fBtPar->getThetaAngleMin();
    fThetaAngleMax          = fBtPar->getThetaAngleMax();
    fSizeMatrix             = fBtPar->getSizeMatrix();
    memcpy(&fChargeLimit[0]        ,fBtPar->getChargeThres()   , sizeof(fChargeLimit) );
    memcpy(&fChargeLimitMaximum[0] ,fBtPar->getChargeThresMax(), sizeof(fChargeLimitMaximum) );

    fNSigma                 = fBtPar->getSigmaRange();
    fMaxSigmaRange          = fBtPar->getSigmaRangeMax();

    fVertexPosMin           = fBtPar->getVertexPosMin();
    fVertexPosMax           = fBtPar->getVertexPosMax();
    fVertexStep             = fBtPar->getVertexStep();

    memcpy(&fPhiOff[0] , fBtPar->getPhiOffset() , sizeof(fPhiOff ) );
    memcpy(&fPhiOff2[0], fBtPar->getPhiOffset2(), sizeof(fPhiOff2 ) );
    fPhiOffsetPar        = fBtPar->getOffsetPar();


    fPol2DMean.resize(fNRingSeg);
    fPol2DSigma.resize(fNRingSeg);
    for(Int_t bin=0; bin<fNRingSeg; bin++){
	for(Int_t vertex=0; vertex<fNVertex; vertex++){
	    //Theta,Phi Range, + x: x is half step width of binning used for calculating theses values
	    fPol2DMean[bin].push_back( new TF2(Form("meanPol_%i_v%i",bin,vertex),"x*x*x*[0]+x*x*[1]+x*[2]+y*y*[3]+y*[4]+[5]+y*(x*x*[6]+x*[7])",20.+3.3,86.,0+7.51,60.)); 
	    fPol2DSigma[bin].push_back(new TF2(Form("sigmaPol_%i_v%i",bin,vertex),"TMath::Power(x,3)*[0]+TMath::Power(x,2)*[1]+x*[2]+TMath::Power(y,4)*[3]+TMath::Power(y,3)*[4]+TMath::Power(y,2)*[5]+y*[6]+[7]+y*(x*x*[8]+x*[9]+[10]) + x*(y*y*y*[11]+y*y*[12])",20.+3.3,86,8+7.51,60.));
	    for(Int_t par=0; par<fNParMean; par++)
		fPol2DMean[bin][vertex] ->SetParameter(par, fBtPar->getTF2ParMean( bin, vertex, par));
	    for(Int_t par=0; par<fNParSigma; par++)
		fPol2DSigma[bin][vertex]->SetParameter(par, fBtPar->getTF2ParSigma(bin, vertex, par));
	}
	fRad2Deg.push_back(TMath::DegToRad()*(bin*fNRingSegStep+fNRingSegOffset));
	fRad2DegX.push_back(TMath::Sin(fRad2Deg[bin]));
	fRad2DegY.push_back(-1*TMath::Cos(fRad2Deg[bin]));
    }

    fFiredPads.resize( fNSector , vector<Int_t>( fNRichSeg , 0 ) );

    return kTRUE;
}



//--------------------------------------------------------------------
// -- Helper functions

void HParticleBtRingF::addressToColRow(const Int_t address, Int_t &sec, Int_t &row, Int_t &col)
{
    //Converts richCal address to sector, column and row numbers

    sec = (Int_t)address/10000;
    row = (Int_t)(address-sec*10000)/100;
    col = address-sec*10000-row*100;
    sec = sec==6 ? 0 : sec;
}

Int_t HParticleBtRingF::correctPhi(const Int_t sec,  const Float_t phi)
{
    //Correct phi angle if phi angle disagrees with sector number
    //Agreement is necessary for transformations from angle to RICH pad plane

    if(sec==0){
	if(phi>120)
	    return 120;
	else if(phi<60)
	    return 60;
	else
	    return phi;
    }else if(sec==1){
	if(phi<120)
            return 120;
	else if(phi>180)
	    return 180;
	else
	    return phi;
    }else if(sec==2){
	if(phi<180)
            return 180;
	else if(phi>240)
	    return 240;
	else
	    return phi;
    }else if(sec==3){
	if(phi<240)
	    return 240;
	else if(phi>300)
	    return 300;
	else
	    return phi;
    }else if(sec==4){
	if(phi>360 || (phi>=0 && phi < 60))
            return 360;
	else if(phi<300)
            return 300;
	else
	    return phi;
    }else{  //sec==5
	if(phi>300 || phi<0)
            return 0;
	else if(phi >60 && phi<=300)
	    return 60;
	else
            return phi;
    }
}

void HParticleBtRingF::sortElements(Double_t &entry1 ,Double_t &entry2)
{
    //Sorts 2 Double_t values by size (ascending)
    if(entry1 >entry2){
	Float_t tmp = entry1;
	entry1      = entry2;
        entry2      = tmp;
    }
}

            
Int_t HParticleBtRingF::getVertexNum(const Float_t vertex)
{
    //Returns vertex number to given z-vertex position

    for(Int_t i=0; i < fNVertex;i++){
	if((vertex>-fVertexPosMin+(i*fVertexStep))&& (vertex<-fVertexPosMax+(i*fVertexStep))) return i;
    }
    if(vertex<=fVertexPosMin)
	return 0;
    else //v>-2.5
	return 14;
}



//--------------------------------------------------------------------
// -- Called once per event

void HParticleBtRingF::fillRichCal(HCategory* catRichCal)
{
    //Fills rich cal hit addresses and charges into vectors
    //Bad hits and hits from bad events are exluded

    Int_t sizeRichCal = catRichCal->getEntries();
    HRichCal* richCal;
    Int_t sec;
    Int_t col;
    Int_t row;
    for(Int_t l=0; l < sizeRichCal;l++){
	richCal = HCategoryManager::getObject(richCal,catRichCal,l);
	if(!richCal)
	    continue;
        if(!richCal->getIsCleanedSector() && !richCal->getIsCleanedHigh()){
	    addressToColRow(richCal->getAddress(),sec, row, col);
	    if(richCal->getCharge() > fChargeLimit[sec]){
		fRichHitAdd.push_back(richCal->getAddress());
		fRichHitCharge.push_back(richCal->getCharge());
	    }
	     if(row<fRichSegBorderY){
		 fFiredPads[sec][0]++;
	     }else{
		 if(col<fRichSegBorderX)
		     fFiredPads[sec][1]++;
		 else
		     fFiredPads[sec][2]++;
	     }
        }
    }
}

void HParticleBtRingF::clearData()
{
    //Empties rich and track vectors

    for(UInt_t i = 0; i < fPrediction.size() ; i++ )
	fPrediction[i].clear();
    fPrediction.clear();
    for(UInt_t i = 0; i < fRingMatrix.size() ; i++ )
	fRingMatrix[i].clear();
    fRingMatrix.clear();

    fRichHitAdd.clear();
    fRichHitCharge.clear();
    fTrackTheta.clear();
    fTrackPhi.clear();
    fTrackVertex.clear();
    fTrackSec.clear();
    fTrackPCandIdx.clear();
    fIsGoodTrack.clear();
    fPosXCenter.clear();
    fPosYCenter.clear();

    for(Int_t i = 0; i < fNSector ; i++ ){
	for(Int_t j = 0; j < fNRichSeg ; j++ ){
	    fFiredPads[i][j]=0;
	}
    }

}


//--------------------------------------------------------------------
//  -- Called once per track

//Marks pads in area around ring center
void HParticleBtRingF::fillMatrix(Int_t xPad, Int_t yPad, Int_t sec)
{
    //Marks area around ring center
    //Address are stored in ringMatrix vector

    Int_t address    = 0;

    vector <Int_t> ringMatrixVec;
    xPad -= fSizeMatrix*0.5;
    yPad -= fSizeMatrix*0.5;
    address = 10000 * (sec ? sec : 6) + 100 * yPad + xPad;

  
    for(Int_t posX=0; posX <fSizeMatrix; posX++){
	for(Int_t posY=0; posY <fSizeMatrix; posY++){
	    if( TMath::Sqrt( TMath::Power(TMath::Abs(fSizeMatrix*0.5-posX),2) + TMath::Power(TMath::Abs(fSizeMatrix*0.5-posY),2) ) < (Float_t)fSizeMatrix/2. ){
		ringMatrixVec.push_back(address+posY*100+posX);
	    }
	}
    }
    fRingMatrix.push_back(ringMatrixVec);
}


void HParticleBtRingF::fillPrediction(const HParticleCand* cand, HVertex &vertex, Bool_t isGoodTrack, const Bool_t doAngleCorr)
{
    //Theta and phi angles and vertex position is used to determine track position on pad plane
    //Information about optical ring distortion is used to predict fired pads in defined sigma area
    //Mean values with neighbouring sectors assure a more smooth ring prediction
    //Predicted pads are stored in prediction vector

    HParticleBtAngleTrafo richAngles;

    Int_t address = 0;
    Double_t theta        = cand->getTheta();
    Double_t phi          = cand->getPhi();
    Int_t   sec           = cand->getSector();
    Float_t candZ         = cand->getZ();
    Float_t vertexZ       = vertex.getZ();
    Int_t   vertexNum;
    Double_t radius;
    Double_t sigma;
    Double_t sigmaX0;
    Double_t sigmaY0;
    Double_t radiusSeg0;
    Double_t sigmaSeg0;
    Double_t sigmaX0Seg0;
    Double_t sigmaY0Seg0;
    Double_t radiusNext;
    Double_t sigmaNext;
    Double_t sigmaX0Next;
    Double_t sigmaY0Next;
    Double_t sigNum;
    vector <Int_t> predictionVec;

    phi = correctPhi(sec,phi);

    if(theta>fThetaAngleMin && theta < fThetaAngleMax)
    {
	//Cases if no vertex was reconstructed
	if(vertexZ > -80. && vertexZ < 20.){
	    vertexNum     = getVertexNum(vertexZ);
	}else if(candZ > -80. && candZ < 20.){
	    vertexZ       = candZ;
	    vertexNum     = getVertexNum(candZ);
	}else if(candZ <= -80.){
	    vertexZ       = -80.;
	    vertexNum     = getVertexNum(-80.);
	}else{
	    vertexZ       = 20.;
	    vertexNum     = getVertexNum(20.);
	}

     

	//Correct theta and phi angle
	Double_t thetaCor;
	Double_t phiCor;
	if(doAngleCorr){
	    if(fAngleCor.alignRichRing(theta,phi, thetaCor, phiCor)){
		theta = thetaCor;
		phi   = phiCor;
	    }
	}

	thetaCor = richAngles.zTheta2dTheta(vertexZ,theta, -(phi-fPhiOff[sec]));
	theta-=thetaCor;



	//Transform angles to x,y Padplane coordinates
	Double_t xPad  = richAngles.angles2xPad(theta,-(phi-fPhiOff[sec]));
	Double_t yPad  = richAngles.angles2yPad(theta,-(phi-fPhiOff[sec]));
	Double_t posX  = richAngles.angles2x(theta,-(phi-fPhiOff[sec]));
	Double_t posY  = richAngles.angles2y(theta,-(phi-fPhiOff[sec]));

       
	//z vertex correction
	Double_t yPadCorr = richAngles.zTheta2dYPad(vertexZ,theta,-(phi-fPhiOff2[sec]));
	Double_t xPadCorr = richAngles.zTheta2dXPad();
	Double_t posXCorr = richAngles.zTheta2dY(vertexZ,theta,-(phi-fPhiOff2[sec]));
	Double_t posYCorr = richAngles.zTheta2dX();
	posX += posXCorr;
	posY += posYCorr;
	xPad += xPadCorr;
	yPad += yPadCorr;


	//Coordinates for n sigma areas
	Double_t sigmaX[2]     = {0.,0.};
	Double_t sigmaY[2]     = {0.,0.};
	Double_t padX[2]       = {0.,0.};
	Double_t padY[2]       = {0.,0.};
	Int_t   padXRound[2]   = {0,0};
	Int_t   padYRound[2]   = {0,0};

	sigNum=fNSigma;

        //Loop over different phi angles of the ring
        for( Int_t bin = 0; bin < fNRingSeg; bin++ ) {
	  
            //Find neighbouring segments
	    Int_t binPrev;
            Int_t binNext;
	    if(bin==0){
                binPrev = fNRingSeg-1;
		binNext = 2;
	    }
            else if(bin==fNRingSeg-1){
                binPrev = fNRingSeg-2;
		binNext = 0;
	    }
	    else{
                binPrev = bin-1;
                binNext = bin+1;
	    }
	    radius  = fPol2DMean[bin][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
	    sigma   = fPol2DSigma[bin][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
	    sigmaX0 = fRad2DegX[bin]*sigNum*sigma;
	    sigmaY0 = fRad2DegY[bin]*sigNum*sigma;


	    //Smooth ring prediction area width neighbour sigma and radius
	    radiusSeg0  = fPol2DMean[binPrev][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
	    sigmaSeg0   = fPol2DSigma[binPrev][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
	    sigmaX0Seg0 = fRad2DegX[binPrev]*sigNum*sigmaSeg0;
	    sigmaY0Seg0 = fRad2DegY[binPrev]*sigNum*sigmaSeg0;
           
	    radiusNext  = fPol2DMean[binNext][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
	    sigmaNext   = fPol2DSigma[binNext][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
	    sigmaX0Next = fRad2DegX[binNext]*sigNum*sigmaNext;
	    sigmaY0Next = fRad2DegY[binNext]*sigNum*sigmaNext;

	   
	    radius  = (radius + radiusSeg0  + radiusNext  )/3.;
	    if(sigma<sigmaSeg0){
		sigma   = (sigma  + sigmaSeg0   + sigmaNext   )/3.;
		sigmaX0 = (sigmaX0+ sigmaX0Seg0 + sigmaX0Next )/3.;
		sigmaY0 = (sigmaY0+ sigmaY0Seg0 + sigmaY0Next )/3.;
	    }
       
	    //Smooth Overlap region
	    if(bin==fNRingSeg-1 || bin==fNRingSeg-2 || bin==fNRingSeg-3){
                radiusSeg0  = fPol2DMean[0][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
		sigmaSeg0   = fPol2DSigma[0][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
		sigmaX0Seg0 = fRad2DegX[0]*sigNum*sigmaSeg0;
		sigmaY0Seg0 = fRad2DegY[0]*sigNum*sigmaSeg0;

		radius  = (radius + radiusSeg0 )/2.;
		if(sigma<sigmaSeg0){
		    sigma   = (sigma  + sigmaSeg0  )/2.;
		    sigmaX0 = (sigmaX0+ sigmaX0Seg0)/2.;
		    sigmaY0 = (sigmaY0+ sigmaY0Seg0)/2.;
		    sigma   = sigmaSeg0  ;
		    sigmaX0 = sigmaX0Seg0;
		    sigmaY0 = sigmaY0Seg0;
		}
	    }
	    if(bin==0 || bin==1 || bin==2){
                radiusSeg0  = fPol2DMean[fNRingSeg-1][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
		sigmaSeg0   = fPol2DSigma[fNRingSeg-1][vertexNum]->Eval(theta,-(phi-fPhiOff[sec])+fPhiOffsetPar);
		sigmaX0Seg0 = fRad2DegX[fNRingSeg-1]*sigNum*sigmaSeg0;
		sigmaY0Seg0 = fRad2DegY[fNRingSeg-1]*sigNum*sigmaSeg0;

		radius  = (radius + radiusSeg0 )/2.;
		if(sigma<sigmaSeg0){
		    sigma   = (sigma  + sigmaSeg0  )/2.;
		    sigmaX0 = (sigmaX0+ sigmaX0Seg0)/2.;
		    sigmaY0 = (sigmaY0+ sigmaY0Seg0)/2.;
		    sigma   = sigmaSeg0  ;
	            sigmaX0 = sigmaX0Seg0;
		    sigmaY0 = sigmaY0Seg0;
		}
	    }


	    sigmaX[0] = fRad2DegX[bin]*radius-sigmaX0;
	    sigmaY[0] = fRad2DegY[bin]*radius-sigmaY0;
	    sigmaX[1] = fRad2DegX[bin]*radius+sigmaX0;
	    sigmaY[1] = fRad2DegY[bin]*radius+sigmaY0;
	    sortElements(sigmaX[0],sigmaX[1]);
	    sortElements(sigmaY[0],sigmaY[1]);
	    padX[0]   = richAngles.x2xPad(posX+sigmaX[0]);
	    padY[0]   = richAngles.xy2yPad(posX+sigmaX[0],posY+sigmaY[0]);
	    padX[1]   = richAngles.x2xPad(posX+sigmaX[1]);
	    padY[1]   = richAngles.xy2yPad(posX+sigmaX[1],posY+sigmaY[1]);



	    padXRound[0] = TMath::Floor(padX[0]);
	    padXRound[1] = TMath::Floor(padX[1]);
	    padYRound[0] = TMath::Floor(padY[0]);
	    padYRound[1] = TMath::Floor(padY[1]);
	
            //Convert pad position in address and store address in vector
	    Int_t padY0=padY[0];
	    while(padXRound[0] <= padXRound[1]){
		
		while(padYRound[0] <= padYRound[1]){
		    address = 10000 * (sec ? sec : 6) + 100 * padYRound[0] + padXRound[0];

		    //Fill only if object is not yet stored in vector
		    Bool_t kFound=kFALSE;
		    UInt_t pred=0;
		    while(pred < predictionVec.size() && !kFound){
			if(predictionVec[pred] == address)
			    kFound=kTRUE;
			pred++;

		    }
		    if(!kFound)
			predictionVec.push_back(address);

		    padYRound[0]++;
		}
		padYRound[0]=padY0;
		padXRound[0]++;
	    }
	}
        fPrediction.push_back(predictionVec);
	fTrackTheta.push_back(theta);
	fTrackPhi.push_back(phi);
	fTrackVertex.push_back(vertexNum);
	fTrackSec.push_back(sec);
	fTrackPCandIdx.push_back(cand->getIndex());
        fIsGoodTrack.push_back(isGoodTrack);
	fPosXCenter.push_back(xPad);
	fPosYCenter.push_back(yPad);

	fillMatrix(TMath::Floor(xPad),TMath::Floor(yPad),sec);
  
    } else {
	predictionVec.clear();
        predictionVec.push_back(-1);
	fPrediction.push_back(predictionVec);
	fTrackTheta.push_back(-1);
	fTrackPhi.push_back(-1);
	fTrackVertex.push_back(-1);
	fTrackSec.push_back(-1);
	fTrackPCandIdx.push_back(-1);
        fIsGoodTrack.push_back(kFALSE);
	fRingMatrix.push_back(predictionVec);
	fPosXCenter.push_back(-1.);
	fPosYCenter.push_back(-1.);

    }

}



Float_t HParticleBtRingF::getRingMatrix(const Int_t trackNo)
{
    //Returns fraction of  pads fired on ring prediction compared to pads fired in ring matrix around ring center

    Int_t padsFired     = 0;
    Int_t padsFiredPred = 0;
    Float_t chargeFired     = 0;
    Float_t chargeFiredPred = 0;
 
    for(UInt_t i=0; i<fRingMatrix[trackNo].size(); i++){
	for(UInt_t j=0; j<fRichHitAdd.size(); j++){
	    if(fRingMatrix[trackNo][i]==fRichHitAdd[j]){
		padsFired++;
                chargeFired +=fRichHitCharge[j];
		for(UInt_t k=0; k<fPrediction[trackNo].size(); k++){
		    if(fRingMatrix[trackNo][i]==fPrediction[trackNo][k]){
			padsFiredPred++;
			chargeFiredPred +=fRichHitCharge[j];
		    }
		}
	    }
	}
    }
    return (Float_t)chargeFiredPred/(Float_t)chargeFired;
}

Float_t HParticleBtRingF::getTrackTheta(Int_t trackNo)
{
    //Returns theta angle for given trackNo
    if(trackNo<(Int_t)fTrackTheta.size()) {
	return fTrackTheta[trackNo];
    } else return -1;
}

Float_t HParticleBtRingF::getTrackPhi(Int_t trackNo)
{
    //Returns phi angle for given trackNo
    if(trackNo<(Int_t)fTrackPhi.size()) {
	return fTrackPhi[trackNo];
    } else return -1;
}

Int_t HParticleBtRingF::getTrackVertex(Int_t trackNo)
{
    //Returns vertex number for given trackNo
    if(trackNo<(Int_t)fTrackVertex.size()) {
	return fTrackVertex[trackNo];
    } else return -1;
}

Int_t HParticleBtRingF::getTrackSec(Int_t trackNo)
{
    //Returns sector for given trackNo
    if(trackNo<(Int_t)fTrackSec.size()) {
	return fTrackSec[trackNo];
    } else return -1;
}

Float_t HParticleBtRingF::getPosXCenter(Int_t trackNo)
{
    //Returns phi angle for given trackNo
    if(trackNo<(Int_t)fPosXCenter.size()) {
	return fPosXCenter[trackNo];
    } else return -1;
}

Float_t HParticleBtRingF::getPosYCenter(Int_t trackNo)
{
    //Returns phi angle for given trackNo
    if(trackNo<(Int_t)fPosYCenter.size()) {
	return fPosYCenter[trackNo];
    } else return -1;
}

Bool_t HParticleBtRingF::isGoodTrack(Int_t trackNo)
{
    //Returns sector for given trackNo
    if(trackNo<(Int_t)fTrackSec.size()) {
	return fIsGoodTrack[trackNo];
    } else return 0;
}

Bool_t HParticleBtRingF::fillRingInfo(HParticleBtRingInfo* btRingInfo)
{
    //Stores ring,track and rich information in arrays
    //Arrays are stored in HParticleBtRingFInfo for output
    Bool_t kOverflow = kFALSE;

    Int_t   prediction      [128][128]; //tracks,predicted pads
    Int_t   ringMatrix      [128][128];
    Int_t   richHitAdd      [1024];    //fired pads
    Float_t richHitCharge   [1024];

    Float_t trackTheta    [128];
    Float_t trackPhi      [128];
    Int_t trackVertex     [128];
    Int_t trackSec        [128];
    Int_t trackPCandIdx   [128];
    Bool_t  isGoodTrack   [128];
    Float_t posXCenter    [128];
    Float_t posYCenter    [128];


    //Initialization
    for(Int_t i = 0; i < 128; i++ ){
	for(Int_t j = 0; j < 128; j++ ){
	    prediction[i][j]  = -1;
	    ringMatrix[i][j]  = -1;
	}
    }

    for(Int_t i = 0; i < 1024; i++ ){
	richHitAdd[i]    = -1;
	richHitCharge[i] = -1.;
    }

    for(Int_t i = 0; i < 128; i++ ){
	trackTheta[i]    = -1.;
	trackPhi[i]      = -1.;
	trackVertex[i]   = -1;
	trackSec[i]      = -1;
	trackPCandIdx[i] = -1;
	isGoodTrack[i]   = kFALSE;
	posXCenter[i]    = -1.;
	posYCenter[i]    = -1.;
    }

    //Fill vector to array and check if vector size is too large
    if(fPrediction.size() <= 128){
	for(UInt_t i = 0; i < fPrediction.size(); i++ ){
	    if(fPrediction[i].size() <= 128){
		for(UInt_t j = 0; j < fPrediction[i].size(); j++ ){
		    prediction[i][j] = fPrediction[i][j];
		    ringMatrix[i][j] = fRingMatrix[i][j];
		}
	    }
	    else
		kOverflow = kTRUE;
	}
    }else
        kOverflow = kTRUE;


    if(fRichHitAdd.size() <= 1024){
	for(UInt_t i = 0; i < fRichHitAdd.size(); i++ ){
	    richHitAdd[i]     =  fRichHitAdd[i];
	    richHitCharge[i]  =  fRichHitCharge[i];
	}
    }else
	kOverflow =kTRUE;
    if(fTrackTheta.size()<=128){
	for(UInt_t i = 0; i < fTrackTheta.size(); i++ ){
	    trackTheta[i]    =  fTrackTheta[i];
	    trackPhi[i]      =  fTrackPhi[i];
	    trackVertex[i]   =  fTrackVertex[i];
	    trackSec[i]      =  fTrackSec[i];
	    trackPCandIdx[i] =  fTrackPCandIdx[i];
	    isGoodTrack[i]   =  fIsGoodTrack[i];
	    posXCenter[i]    =  fPosXCenter[i];
	    posYCenter[i]    =  fPosYCenter[i];
	}
    }else
	kOverflow =kTRUE;

	btRingInfo->setPrediction       ( prediction   );
        btRingInfo->setRingMatrix       ( ringMatrix   );
        btRingInfo->setRichHitAdd       ( richHitAdd   );
        btRingInfo->setRichHitCharge    ( richHitCharge);
      
	btRingInfo->setTrackTheta       ( trackTheta   );
	btRingInfo->setTrackPhi         ( trackPhi     );
	btRingInfo->setTrackVertex      ( trackVertex  );
	btRingInfo->setTrackSec         ( trackSec     );
	btRingInfo->setTrackPCandIdx    ( trackPCandIdx);
	btRingInfo->setIsGoodTrack      ( isGoodTrack  );
        btRingInfo->setPosXCenter       ( posXCenter   );
	btRingInfo->setPosYCenter       ( posYCenter   );

     	return kOverflow;

}

Int_t HParticleBtRingF::plotPrediction(Int_t trackNo = -1)
{
    Int_t returnVal = 0 ;
    for(UInt_t j = 0; j < fPrediction[trackNo].size(); j++ ){
	Bool_t hasHit = kFALSE;
	for(UInt_t k = 0; k <  fRichHitAdd.size(); k++ ){
	    if(fRichHitAdd[k] == fPrediction[trackNo][j]){
		hasHit = kTRUE;
		returnVal++;
	    }
	}
	cout << fPrediction[trackNo][j] <<  " - " <<"["<< hasHit << "]"  << endl;
    }

return returnVal;
}


void HParticleBtRingF::plotRichHit(Int_t trackNo = -1)
{
    Int_t sec[2];
    Int_t row[2];
    Int_t col[2];
    Int_t plotCounter = 0 ;
    for(UInt_t i = 0; i < fRichHitAdd.size(); i++ ){
	addressToColRow(fRichHitAdd[i]         ,sec[0], row[0], col[0]);
	addressToColRow(fPrediction[trackNo][1],sec[1], row[1], col[1]);
	if(sec[0] == sec[1]){
	    cout << fRichHitAdd[i] << " --  " ;
            plotCounter++;
	    if(plotCounter%5 == 0)
		cout << endl;
	}
    }
     
}



Bool_t HParticleBtRingF::hasNoisyRichSeg(Bool_t *trackInSec)
{
    Bool_t secUsed[6];
    for(Int_t i=0;i<6;i++) secUsed[0+i] = trackInSec[i];
    Bool_t isNoisy = kFALSE;
    for(Int_t i = 0;  i < fNSector;  i++){
	for(Int_t j = 0;  j < fNRichSeg;  j++){
	    if( fFiredPads[i][j] > 100 && secUsed[i])
                isNoisy = kTRUE;
	}
    }
    if(isNoisy)
	cout << "hparticlebtringf: Noisy RICH segment detected and removed" << endl;
    return isNoisy;
}


 hparticlebtringf.cc:1
 hparticlebtringf.cc:2
 hparticlebtringf.cc:3
 hparticlebtringf.cc:4
 hparticlebtringf.cc:5
 hparticlebtringf.cc:6
 hparticlebtringf.cc:7
 hparticlebtringf.cc:8
 hparticlebtringf.cc:9
 hparticlebtringf.cc:10
 hparticlebtringf.cc:11
 hparticlebtringf.cc:12
 hparticlebtringf.cc:13
 hparticlebtringf.cc:14
 hparticlebtringf.cc:15
 hparticlebtringf.cc:16
 hparticlebtringf.cc:17
 hparticlebtringf.cc:18
 hparticlebtringf.cc:19
 hparticlebtringf.cc:20
 hparticlebtringf.cc:21
 hparticlebtringf.cc:22
 hparticlebtringf.cc:23
 hparticlebtringf.cc:24
 hparticlebtringf.cc:25
 hparticlebtringf.cc:26
 hparticlebtringf.cc:27
 hparticlebtringf.cc:28
 hparticlebtringf.cc:29
 hparticlebtringf.cc:30
 hparticlebtringf.cc:31
 hparticlebtringf.cc:32
 hparticlebtringf.cc:33
 hparticlebtringf.cc:34
 hparticlebtringf.cc:35
 hparticlebtringf.cc:36
 hparticlebtringf.cc:37
 hparticlebtringf.cc:38
 hparticlebtringf.cc:39
 hparticlebtringf.cc:40
 hparticlebtringf.cc:41
 hparticlebtringf.cc:42
 hparticlebtringf.cc:43
 hparticlebtringf.cc:44
 hparticlebtringf.cc:45
 hparticlebtringf.cc:46
 hparticlebtringf.cc:47
 hparticlebtringf.cc:48
 hparticlebtringf.cc:49
 hparticlebtringf.cc:50
 hparticlebtringf.cc:51
 hparticlebtringf.cc:52
 hparticlebtringf.cc:53
 hparticlebtringf.cc:54
 hparticlebtringf.cc:55
 hparticlebtringf.cc:56
 hparticlebtringf.cc:57
 hparticlebtringf.cc:58
 hparticlebtringf.cc:59
 hparticlebtringf.cc:60
 hparticlebtringf.cc:61
 hparticlebtringf.cc:62
 hparticlebtringf.cc:63
 hparticlebtringf.cc:64
 hparticlebtringf.cc:65
 hparticlebtringf.cc:66
 hparticlebtringf.cc:67
 hparticlebtringf.cc:68
 hparticlebtringf.cc:69
 hparticlebtringf.cc:70
 hparticlebtringf.cc:71
 hparticlebtringf.cc:72
 hparticlebtringf.cc:73
 hparticlebtringf.cc:74
 hparticlebtringf.cc:75
 hparticlebtringf.cc:76
 hparticlebtringf.cc:77
 hparticlebtringf.cc:78
 hparticlebtringf.cc:79
 hparticlebtringf.cc:80
 hparticlebtringf.cc:81
 hparticlebtringf.cc:82
 hparticlebtringf.cc:83
 hparticlebtringf.cc:84
 hparticlebtringf.cc:85
 hparticlebtringf.cc:86
 hparticlebtringf.cc:87
 hparticlebtringf.cc:88
 hparticlebtringf.cc:89
 hparticlebtringf.cc:90
 hparticlebtringf.cc:91
 hparticlebtringf.cc:92
 hparticlebtringf.cc:93
 hparticlebtringf.cc:94
 hparticlebtringf.cc:95
 hparticlebtringf.cc:96
 hparticlebtringf.cc:97
 hparticlebtringf.cc:98
 hparticlebtringf.cc:99
 hparticlebtringf.cc:100
 hparticlebtringf.cc:101
 hparticlebtringf.cc:102
 hparticlebtringf.cc:103
 hparticlebtringf.cc:104
 hparticlebtringf.cc:105
 hparticlebtringf.cc:106
 hparticlebtringf.cc:107
 hparticlebtringf.cc:108
 hparticlebtringf.cc:109
 hparticlebtringf.cc:110
 hparticlebtringf.cc:111
 hparticlebtringf.cc:112
 hparticlebtringf.cc:113
 hparticlebtringf.cc:114
 hparticlebtringf.cc:115
 hparticlebtringf.cc:116
 hparticlebtringf.cc:117
 hparticlebtringf.cc:118
 hparticlebtringf.cc:119
 hparticlebtringf.cc:120
 hparticlebtringf.cc:121
 hparticlebtringf.cc:122
 hparticlebtringf.cc:123
 hparticlebtringf.cc:124
 hparticlebtringf.cc:125
 hparticlebtringf.cc:126
 hparticlebtringf.cc:127
 hparticlebtringf.cc:128
 hparticlebtringf.cc:129
 hparticlebtringf.cc:130
 hparticlebtringf.cc:131
 hparticlebtringf.cc:132
 hparticlebtringf.cc:133
 hparticlebtringf.cc:134
 hparticlebtringf.cc:135
 hparticlebtringf.cc:136
 hparticlebtringf.cc:137
 hparticlebtringf.cc:138
 hparticlebtringf.cc:139
 hparticlebtringf.cc:140
 hparticlebtringf.cc:141
 hparticlebtringf.cc:142
 hparticlebtringf.cc:143
 hparticlebtringf.cc:144
 hparticlebtringf.cc:145
 hparticlebtringf.cc:146
 hparticlebtringf.cc:147
 hparticlebtringf.cc:148
 hparticlebtringf.cc:149
 hparticlebtringf.cc:150
 hparticlebtringf.cc:151
 hparticlebtringf.cc:152
 hparticlebtringf.cc:153
 hparticlebtringf.cc:154
 hparticlebtringf.cc:155
 hparticlebtringf.cc:156
 hparticlebtringf.cc:157
 hparticlebtringf.cc:158
 hparticlebtringf.cc:159
 hparticlebtringf.cc:160
 hparticlebtringf.cc:161
 hparticlebtringf.cc:162
 hparticlebtringf.cc:163
 hparticlebtringf.cc:164
 hparticlebtringf.cc:165
 hparticlebtringf.cc:166
 hparticlebtringf.cc:167
 hparticlebtringf.cc:168
 hparticlebtringf.cc:169
 hparticlebtringf.cc:170
 hparticlebtringf.cc:171
 hparticlebtringf.cc:172
 hparticlebtringf.cc:173
 hparticlebtringf.cc:174
 hparticlebtringf.cc:175
 hparticlebtringf.cc:176
 hparticlebtringf.cc:177
 hparticlebtringf.cc:178
 hparticlebtringf.cc:179
 hparticlebtringf.cc:180
 hparticlebtringf.cc:181
 hparticlebtringf.cc:182
 hparticlebtringf.cc:183
 hparticlebtringf.cc:184
 hparticlebtringf.cc:185
 hparticlebtringf.cc:186
 hparticlebtringf.cc:187
 hparticlebtringf.cc:188
 hparticlebtringf.cc:189
 hparticlebtringf.cc:190
 hparticlebtringf.cc:191
 hparticlebtringf.cc:192
 hparticlebtringf.cc:193
 hparticlebtringf.cc:194
 hparticlebtringf.cc:195
 hparticlebtringf.cc:196
 hparticlebtringf.cc:197
 hparticlebtringf.cc:198
 hparticlebtringf.cc:199
 hparticlebtringf.cc:200
 hparticlebtringf.cc:201
 hparticlebtringf.cc:202
 hparticlebtringf.cc:203
 hparticlebtringf.cc:204
 hparticlebtringf.cc:205
 hparticlebtringf.cc:206
 hparticlebtringf.cc:207
 hparticlebtringf.cc:208
 hparticlebtringf.cc:209
 hparticlebtringf.cc:210
 hparticlebtringf.cc:211
 hparticlebtringf.cc:212
 hparticlebtringf.cc:213
 hparticlebtringf.cc:214
 hparticlebtringf.cc:215
 hparticlebtringf.cc:216
 hparticlebtringf.cc:217
 hparticlebtringf.cc:218
 hparticlebtringf.cc:219
 hparticlebtringf.cc:220
 hparticlebtringf.cc:221
 hparticlebtringf.cc:222
 hparticlebtringf.cc:223
 hparticlebtringf.cc:224
 hparticlebtringf.cc:225
 hparticlebtringf.cc:226
 hparticlebtringf.cc:227
 hparticlebtringf.cc:228
 hparticlebtringf.cc:229
 hparticlebtringf.cc:230
 hparticlebtringf.cc:231
 hparticlebtringf.cc:232
 hparticlebtringf.cc:233
 hparticlebtringf.cc:234
 hparticlebtringf.cc:235
 hparticlebtringf.cc:236
 hparticlebtringf.cc:237
 hparticlebtringf.cc:238
 hparticlebtringf.cc:239
 hparticlebtringf.cc:240
 hparticlebtringf.cc:241
 hparticlebtringf.cc:242
 hparticlebtringf.cc:243
 hparticlebtringf.cc:244
 hparticlebtringf.cc:245
 hparticlebtringf.cc:246
 hparticlebtringf.cc:247
 hparticlebtringf.cc:248
 hparticlebtringf.cc:249
 hparticlebtringf.cc:250
 hparticlebtringf.cc:251
 hparticlebtringf.cc:252
 hparticlebtringf.cc:253
 hparticlebtringf.cc:254
 hparticlebtringf.cc:255
 hparticlebtringf.cc:256
 hparticlebtringf.cc:257
 hparticlebtringf.cc:258
 hparticlebtringf.cc:259
 hparticlebtringf.cc:260
 hparticlebtringf.cc:261
 hparticlebtringf.cc:262
 hparticlebtringf.cc:263
 hparticlebtringf.cc:264
 hparticlebtringf.cc:265
 hparticlebtringf.cc:266
 hparticlebtringf.cc:267
 hparticlebtringf.cc:268
 hparticlebtringf.cc:269
 hparticlebtringf.cc:270
 hparticlebtringf.cc:271
 hparticlebtringf.cc:272
 hparticlebtringf.cc:273
 hparticlebtringf.cc:274
 hparticlebtringf.cc:275
 hparticlebtringf.cc:276
 hparticlebtringf.cc:277
 hparticlebtringf.cc:278
 hparticlebtringf.cc:279
 hparticlebtringf.cc:280
 hparticlebtringf.cc:281
 hparticlebtringf.cc:282
 hparticlebtringf.cc:283
 hparticlebtringf.cc:284
 hparticlebtringf.cc:285
 hparticlebtringf.cc:286
 hparticlebtringf.cc:287
 hparticlebtringf.cc:288
 hparticlebtringf.cc:289
 hparticlebtringf.cc:290
 hparticlebtringf.cc:291
 hparticlebtringf.cc:292
 hparticlebtringf.cc:293
 hparticlebtringf.cc:294
 hparticlebtringf.cc:295
 hparticlebtringf.cc:296
 hparticlebtringf.cc:297
 hparticlebtringf.cc:298
 hparticlebtringf.cc:299
 hparticlebtringf.cc:300
 hparticlebtringf.cc:301
 hparticlebtringf.cc:302
 hparticlebtringf.cc:303
 hparticlebtringf.cc:304
 hparticlebtringf.cc:305
 hparticlebtringf.cc:306
 hparticlebtringf.cc:307
 hparticlebtringf.cc:308
 hparticlebtringf.cc:309
 hparticlebtringf.cc:310
 hparticlebtringf.cc:311
 hparticlebtringf.cc:312
 hparticlebtringf.cc:313
 hparticlebtringf.cc:314
 hparticlebtringf.cc:315
 hparticlebtringf.cc:316
 hparticlebtringf.cc:317
 hparticlebtringf.cc:318
 hparticlebtringf.cc:319
 hparticlebtringf.cc:320
 hparticlebtringf.cc:321
 hparticlebtringf.cc:322
 hparticlebtringf.cc:323
 hparticlebtringf.cc:324
 hparticlebtringf.cc:325
 hparticlebtringf.cc:326
 hparticlebtringf.cc:327
 hparticlebtringf.cc:328
 hparticlebtringf.cc:329
 hparticlebtringf.cc:330
 hparticlebtringf.cc:331
 hparticlebtringf.cc:332
 hparticlebtringf.cc:333
 hparticlebtringf.cc:334
 hparticlebtringf.cc:335
 hparticlebtringf.cc:336
 hparticlebtringf.cc:337
 hparticlebtringf.cc:338
 hparticlebtringf.cc:339
 hparticlebtringf.cc:340
 hparticlebtringf.cc:341
 hparticlebtringf.cc:342
 hparticlebtringf.cc:343
 hparticlebtringf.cc:344
 hparticlebtringf.cc:345
 hparticlebtringf.cc:346
 hparticlebtringf.cc:347
 hparticlebtringf.cc:348
 hparticlebtringf.cc:349
 hparticlebtringf.cc:350
 hparticlebtringf.cc:351
 hparticlebtringf.cc:352
 hparticlebtringf.cc:353
 hparticlebtringf.cc:354
 hparticlebtringf.cc:355
 hparticlebtringf.cc:356
 hparticlebtringf.cc:357
 hparticlebtringf.cc:358
 hparticlebtringf.cc:359
 hparticlebtringf.cc:360
 hparticlebtringf.cc:361
 hparticlebtringf.cc:362
 hparticlebtringf.cc:363
 hparticlebtringf.cc:364
 hparticlebtringf.cc:365
 hparticlebtringf.cc:366
 hparticlebtringf.cc:367
 hparticlebtringf.cc:368
 hparticlebtringf.cc:369
 hparticlebtringf.cc:370
 hparticlebtringf.cc:371
 hparticlebtringf.cc:372
 hparticlebtringf.cc:373
 hparticlebtringf.cc:374
 hparticlebtringf.cc:375
 hparticlebtringf.cc:376
 hparticlebtringf.cc:377
 hparticlebtringf.cc:378
 hparticlebtringf.cc:379
 hparticlebtringf.cc:380
 hparticlebtringf.cc:381
 hparticlebtringf.cc:382
 hparticlebtringf.cc:383
 hparticlebtringf.cc:384
 hparticlebtringf.cc:385
 hparticlebtringf.cc:386
 hparticlebtringf.cc:387
 hparticlebtringf.cc:388
 hparticlebtringf.cc:389
 hparticlebtringf.cc:390
 hparticlebtringf.cc:391
 hparticlebtringf.cc:392
 hparticlebtringf.cc:393
 hparticlebtringf.cc:394
 hparticlebtringf.cc:395
 hparticlebtringf.cc:396
 hparticlebtringf.cc:397
 hparticlebtringf.cc:398
 hparticlebtringf.cc:399
 hparticlebtringf.cc:400
 hparticlebtringf.cc:401
 hparticlebtringf.cc:402
 hparticlebtringf.cc:403
 hparticlebtringf.cc:404
 hparticlebtringf.cc:405
 hparticlebtringf.cc:406
 hparticlebtringf.cc:407
 hparticlebtringf.cc:408
 hparticlebtringf.cc:409
 hparticlebtringf.cc:410
 hparticlebtringf.cc:411
 hparticlebtringf.cc:412
 hparticlebtringf.cc:413
 hparticlebtringf.cc:414
 hparticlebtringf.cc:415
 hparticlebtringf.cc:416
 hparticlebtringf.cc:417
 hparticlebtringf.cc:418
 hparticlebtringf.cc:419
 hparticlebtringf.cc:420
 hparticlebtringf.cc:421
 hparticlebtringf.cc:422
 hparticlebtringf.cc:423
 hparticlebtringf.cc:424
 hparticlebtringf.cc:425
 hparticlebtringf.cc:426
 hparticlebtringf.cc:427
 hparticlebtringf.cc:428
 hparticlebtringf.cc:429
 hparticlebtringf.cc:430
 hparticlebtringf.cc:431
 hparticlebtringf.cc:432
 hparticlebtringf.cc:433
 hparticlebtringf.cc:434
 hparticlebtringf.cc:435
 hparticlebtringf.cc:436
 hparticlebtringf.cc:437
 hparticlebtringf.cc:438
 hparticlebtringf.cc:439
 hparticlebtringf.cc:440
 hparticlebtringf.cc:441
 hparticlebtringf.cc:442
 hparticlebtringf.cc:443
 hparticlebtringf.cc:444
 hparticlebtringf.cc:445
 hparticlebtringf.cc:446
 hparticlebtringf.cc:447
 hparticlebtringf.cc:448
 hparticlebtringf.cc:449
 hparticlebtringf.cc:450
 hparticlebtringf.cc:451
 hparticlebtringf.cc:452
 hparticlebtringf.cc:453
 hparticlebtringf.cc:454
 hparticlebtringf.cc:455
 hparticlebtringf.cc:456
 hparticlebtringf.cc:457
 hparticlebtringf.cc:458
 hparticlebtringf.cc:459
 hparticlebtringf.cc:460
 hparticlebtringf.cc:461
 hparticlebtringf.cc:462
 hparticlebtringf.cc:463
 hparticlebtringf.cc:464
 hparticlebtringf.cc:465
 hparticlebtringf.cc:466
 hparticlebtringf.cc:467
 hparticlebtringf.cc:468
 hparticlebtringf.cc:469
 hparticlebtringf.cc:470
 hparticlebtringf.cc:471
 hparticlebtringf.cc:472
 hparticlebtringf.cc:473
 hparticlebtringf.cc:474
 hparticlebtringf.cc:475
 hparticlebtringf.cc:476
 hparticlebtringf.cc:477
 hparticlebtringf.cc:478
 hparticlebtringf.cc:479
 hparticlebtringf.cc:480
 hparticlebtringf.cc:481
 hparticlebtringf.cc:482
 hparticlebtringf.cc:483
 hparticlebtringf.cc:484
 hparticlebtringf.cc:485
 hparticlebtringf.cc:486
 hparticlebtringf.cc:487
 hparticlebtringf.cc:488
 hparticlebtringf.cc:489
 hparticlebtringf.cc:490
 hparticlebtringf.cc:491
 hparticlebtringf.cc:492
 hparticlebtringf.cc:493
 hparticlebtringf.cc:494
 hparticlebtringf.cc:495
 hparticlebtringf.cc:496
 hparticlebtringf.cc:497
 hparticlebtringf.cc:498
 hparticlebtringf.cc:499
 hparticlebtringf.cc:500
 hparticlebtringf.cc:501
 hparticlebtringf.cc:502
 hparticlebtringf.cc:503
 hparticlebtringf.cc:504
 hparticlebtringf.cc:505
 hparticlebtringf.cc:506
 hparticlebtringf.cc:507
 hparticlebtringf.cc:508
 hparticlebtringf.cc:509
 hparticlebtringf.cc:510
 hparticlebtringf.cc:511
 hparticlebtringf.cc:512
 hparticlebtringf.cc:513
 hparticlebtringf.cc:514
 hparticlebtringf.cc:515
 hparticlebtringf.cc:516
 hparticlebtringf.cc:517
 hparticlebtringf.cc:518
 hparticlebtringf.cc:519
 hparticlebtringf.cc:520
 hparticlebtringf.cc:521
 hparticlebtringf.cc:522
 hparticlebtringf.cc:523
 hparticlebtringf.cc:524
 hparticlebtringf.cc:525
 hparticlebtringf.cc:526
 hparticlebtringf.cc:527
 hparticlebtringf.cc:528
 hparticlebtringf.cc:529
 hparticlebtringf.cc:530
 hparticlebtringf.cc:531
 hparticlebtringf.cc:532
 hparticlebtringf.cc:533
 hparticlebtringf.cc:534
 hparticlebtringf.cc:535
 hparticlebtringf.cc:536
 hparticlebtringf.cc:537
 hparticlebtringf.cc:538
 hparticlebtringf.cc:539
 hparticlebtringf.cc:540
 hparticlebtringf.cc:541
 hparticlebtringf.cc:542
 hparticlebtringf.cc:543
 hparticlebtringf.cc:544
 hparticlebtringf.cc:545
 hparticlebtringf.cc:546
 hparticlebtringf.cc:547
 hparticlebtringf.cc:548
 hparticlebtringf.cc:549
 hparticlebtringf.cc:550
 hparticlebtringf.cc:551
 hparticlebtringf.cc:552
 hparticlebtringf.cc:553
 hparticlebtringf.cc:554
 hparticlebtringf.cc:555
 hparticlebtringf.cc:556
 hparticlebtringf.cc:557
 hparticlebtringf.cc:558
 hparticlebtringf.cc:559
 hparticlebtringf.cc:560
 hparticlebtringf.cc:561
 hparticlebtringf.cc:562
 hparticlebtringf.cc:563
 hparticlebtringf.cc:564
 hparticlebtringf.cc:565
 hparticlebtringf.cc:566
 hparticlebtringf.cc:567
 hparticlebtringf.cc:568
 hparticlebtringf.cc:569
 hparticlebtringf.cc:570
 hparticlebtringf.cc:571
 hparticlebtringf.cc:572
 hparticlebtringf.cc:573
 hparticlebtringf.cc:574
 hparticlebtringf.cc:575
 hparticlebtringf.cc:576
 hparticlebtringf.cc:577
 hparticlebtringf.cc:578
 hparticlebtringf.cc:579
 hparticlebtringf.cc:580
 hparticlebtringf.cc:581
 hparticlebtringf.cc:582
 hparticlebtringf.cc:583
 hparticlebtringf.cc:584
 hparticlebtringf.cc:585
 hparticlebtringf.cc:586
 hparticlebtringf.cc:587
 hparticlebtringf.cc:588
 hparticlebtringf.cc:589
 hparticlebtringf.cc:590
 hparticlebtringf.cc:591
 hparticlebtringf.cc:592
 hparticlebtringf.cc:593
 hparticlebtringf.cc:594
 hparticlebtringf.cc:595
 hparticlebtringf.cc:596
 hparticlebtringf.cc:597
 hparticlebtringf.cc:598
 hparticlebtringf.cc:599
 hparticlebtringf.cc:600
 hparticlebtringf.cc:601
 hparticlebtringf.cc:602
 hparticlebtringf.cc:603
 hparticlebtringf.cc:604
 hparticlebtringf.cc:605
 hparticlebtringf.cc:606
 hparticlebtringf.cc:607
 hparticlebtringf.cc:608
 hparticlebtringf.cc:609
 hparticlebtringf.cc:610
 hparticlebtringf.cc:611
 hparticlebtringf.cc:612
 hparticlebtringf.cc:613
 hparticlebtringf.cc:614
 hparticlebtringf.cc:615
 hparticlebtringf.cc:616
 hparticlebtringf.cc:617
 hparticlebtringf.cc:618
 hparticlebtringf.cc:619
 hparticlebtringf.cc:620
 hparticlebtringf.cc:621
 hparticlebtringf.cc:622
 hparticlebtringf.cc:623
 hparticlebtringf.cc:624
 hparticlebtringf.cc:625
 hparticlebtringf.cc:626
 hparticlebtringf.cc:627
 hparticlebtringf.cc:628
 hparticlebtringf.cc:629
 hparticlebtringf.cc:630
 hparticlebtringf.cc:631
 hparticlebtringf.cc:632
 hparticlebtringf.cc:633
 hparticlebtringf.cc:634
 hparticlebtringf.cc:635
 hparticlebtringf.cc:636
 hparticlebtringf.cc:637
 hparticlebtringf.cc:638
 hparticlebtringf.cc:639
 hparticlebtringf.cc:640
 hparticlebtringf.cc:641
 hparticlebtringf.cc:642
 hparticlebtringf.cc:643
 hparticlebtringf.cc:644
 hparticlebtringf.cc:645
 hparticlebtringf.cc:646
 hparticlebtringf.cc:647
 hparticlebtringf.cc:648
 hparticlebtringf.cc:649
 hparticlebtringf.cc:650
 hparticlebtringf.cc:651
 hparticlebtringf.cc:652
 hparticlebtringf.cc:653
 hparticlebtringf.cc:654
 hparticlebtringf.cc:655
 hparticlebtringf.cc:656
 hparticlebtringf.cc:657
 hparticlebtringf.cc:658
 hparticlebtringf.cc:659
 hparticlebtringf.cc:660
 hparticlebtringf.cc:661
 hparticlebtringf.cc:662
 hparticlebtringf.cc:663
 hparticlebtringf.cc:664
 hparticlebtringf.cc:665
 hparticlebtringf.cc:666
 hparticlebtringf.cc:667
 hparticlebtringf.cc:668
 hparticlebtringf.cc:669
 hparticlebtringf.cc:670
 hparticlebtringf.cc:671
 hparticlebtringf.cc:672
 hparticlebtringf.cc:673
 hparticlebtringf.cc:674
 hparticlebtringf.cc:675
 hparticlebtringf.cc:676
 hparticlebtringf.cc:677
 hparticlebtringf.cc:678
 hparticlebtringf.cc:679
 hparticlebtringf.cc:680
 hparticlebtringf.cc:681
 hparticlebtringf.cc:682
 hparticlebtringf.cc:683
 hparticlebtringf.cc:684
 hparticlebtringf.cc:685
 hparticlebtringf.cc:686
 hparticlebtringf.cc:687
 hparticlebtringf.cc:688
 hparticlebtringf.cc:689
 hparticlebtringf.cc:690
 hparticlebtringf.cc:691
 hparticlebtringf.cc:692
 hparticlebtringf.cc:693
 hparticlebtringf.cc:694
 hparticlebtringf.cc:695
 hparticlebtringf.cc:696
 hparticlebtringf.cc:697
 hparticlebtringf.cc:698
 hparticlebtringf.cc:699
 hparticlebtringf.cc:700
 hparticlebtringf.cc:701
 hparticlebtringf.cc:702
 hparticlebtringf.cc:703
 hparticlebtringf.cc:704
 hparticlebtringf.cc:705
 hparticlebtringf.cc:706
 hparticlebtringf.cc:707
 hparticlebtringf.cc:708
 hparticlebtringf.cc:709
 hparticlebtringf.cc:710
 hparticlebtringf.cc:711
 hparticlebtringf.cc:712
 hparticlebtringf.cc:713
 hparticlebtringf.cc:714
 hparticlebtringf.cc:715
 hparticlebtringf.cc:716
 hparticlebtringf.cc:717
 hparticlebtringf.cc:718
 hparticlebtringf.cc:719
 hparticlebtringf.cc:720
 hparticlebtringf.cc:721
 hparticlebtringf.cc:722
 hparticlebtringf.cc:723
 hparticlebtringf.cc:724
 hparticlebtringf.cc:725
 hparticlebtringf.cc:726
 hparticlebtringf.cc:727
 hparticlebtringf.cc:728
 hparticlebtringf.cc:729
 hparticlebtringf.cc:730
 hparticlebtringf.cc:731
 hparticlebtringf.cc:732
 hparticlebtringf.cc:733
 hparticlebtringf.cc:734
 hparticlebtringf.cc:735
 hparticlebtringf.cc:736
 hparticlebtringf.cc:737
 hparticlebtringf.cc:738
 hparticlebtringf.cc:739
 hparticlebtringf.cc:740
 hparticlebtringf.cc:741
 hparticlebtringf.cc:742
 hparticlebtringf.cc:743
 hparticlebtringf.cc:744
 hparticlebtringf.cc:745
 hparticlebtringf.cc:746
 hparticlebtringf.cc:747
 hparticlebtringf.cc:748
 hparticlebtringf.cc:749
 hparticlebtringf.cc:750
 hparticlebtringf.cc:751
 hparticlebtringf.cc:752
 hparticlebtringf.cc:753
 hparticlebtringf.cc:754
 hparticlebtringf.cc:755
 hparticlebtringf.cc:756
 hparticlebtringf.cc:757
 hparticlebtringf.cc:758
 hparticlebtringf.cc:759
 hparticlebtringf.cc:760
 hparticlebtringf.cc:761
 hparticlebtringf.cc:762
 hparticlebtringf.cc:763
 hparticlebtringf.cc:764
 hparticlebtringf.cc:765
 hparticlebtringf.cc:766
 hparticlebtringf.cc:767
 hparticlebtringf.cc:768
 hparticlebtringf.cc:769
 hparticlebtringf.cc:770
 hparticlebtringf.cc:771
 hparticlebtringf.cc:772
 hparticlebtringf.cc:773
 hparticlebtringf.cc:774
 hparticlebtringf.cc:775
 hparticlebtringf.cc:776
 hparticlebtringf.cc:777