ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : S. Lebedev
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRich700DigiPar
//
//  This class handles parameters for RICH digitizer
//
//////////////////////////////////////////////////////////////////////////////

#include "hrich700digipar.h"
#include "hparamlist.h"
#include "richdef.h"
#include "hhistconverter.h"

#include "TRandom.h"
#include "TMath.h"

#include <sstream>
#include <iostream>
ClassImp(HRich700DigiPar)

using namespace std;

HRich700DigiPar::HRich700DigiPar(const Char_t* name,const Char_t* title,
				       const Char_t* context)
    : HParCond(name,title,context)
{
    clear();
}

HRich700DigiPar::~HRich700DigiPar()
{
  // destructor
}

void HRich700DigiPar::clear()
{
    fArrayPmt.Reset();
    fArrayZVertices.Reset();
    for (UInt_t i = 0; i < fArrayThetaMean.size(); i++) {
	fArrayThetaMean[i].Reset();
    }
    fArrayThetaMean.clear();
    fhxyThetaMean.clear();// =0;
    fArrayThetaTransParamsPoly.Reset();
    fArrayThetaTransParamsGeo.Reset();
    fArrayPhiAlign.Reset();
    fArrayThetaAlign.Reset();
    fhPhiAlign = nullptr;
    fhThetaAlign = nullptr;
    fArrayInvPhiAlign.Reset();
    fArrayInvThetaAlign.Reset();
    fhInvPhiAlign = nullptr;
    fhInvThetaAlign = nullptr;
    resetInputVersions();
}

void HRich700DigiPar::printParam(void)
{
    printf("----------------------------------------------------------------------\n");
    printf("HRich700DigiPar: \n");
    printf("fNofPixelsInRow       = %i \n" , fNofPixelsInRow);
    printf("fPmtSize              = %f \n" , fPmtSize);
    printf("fPmtGap               = %f \n" , fPmtGap);
    printf("fPmtSensSize          = %f \n" , fPmtSensSize);
    printf("fCollectionEfficiency = %f \n" , fCollectionEfficiency);
    printf("fCrossTalkProbability = %f \n" , fCrossTalkProbability);
    printf("fNofNoiseHits         = %i \n" , fNofNoiseHits);
    printf("----------------------------------------------------------------------\n");


    printf("Sec PmtId IndX IndY       x          y          z     pmtType     theta     phi  \n");
    for(Int_t i = 0; i < fArrayPmt.GetSize()/NPARPMT; i ++){
        Int_t id =getPMTId  ( (Float_t)fArrayPmt[i*NPARPMT+3], (Float_t) fArrayPmt[i*NPARPMT+4]);
        if(id!= (Int_t)fArrayPmt[i*NPARPMT+0] ) cout <<"missmatch : "<<id<<" "<<(Int_t)fArrayPmt[i*NPARPMT+0]<<endl;

        printf("%3i %5i %4i %4i %10.3f %10.3f %10.3f %5i %10.3f %10.3f \n",
            getSector((Float_t)fArrayPmt[i*NPARPMT+3],(Float_t)fArrayPmt[i*NPARPMT+4]),
            (Int_t)fArrayPmt[i*NPARPMT+0],
            (Int_t)fArrayPmt[i*NPARPMT+1],
            (Int_t)fArrayPmt[i*NPARPMT+2],
            fArrayPmt[i*NPARPMT+3],
            fArrayPmt[i*NPARPMT+4],
            fArrayPmt[i*NPARPMT+5],
            (Int_t)fArrayPmt[i*NPARPMT+6],
            fArrayPmt[i*NPARPMT+7],
            fArrayPmt[i*NPARPMT+8]
        );
    }


    for(Int_t i = 0; i < fArrayZVertices.GetSize(); i ++){
        printf("fArrayZVertices[%i] = %f \n" , i, (Float_t)fArrayZVertices[i]);
    }

    for(UInt_t i = 0; i < fArrayThetaMean.size(); i ++){
	TArrayD arTmp;
	TH2F*htmp    = (TH2F*)HHistConverter::createHist("htmp"  ,fArrayThetaMean[i]);
	HHistConverter::fillArray(htmp,arTmp,Form("fArrayThetaMean[%i]",i),10,10,kTRUE);
	delete htmp;
    }

    for(Int_t i = 0; i < fArrayThetaTransParamsPoly.GetSize(); i ++){
        printf("fArrayThetaTransParamsPoly[%i] = %f \n" , i, (Float_t)fArrayThetaTransParamsPoly[i]);
    }

    for(Int_t i = 0; i < fArrayThetaTransParamsGeo.GetSize(); i ++){
        printf("fArrayThetaTransParamsGeo[%i] = %f \n" , i, (Float_t)fArrayThetaTransParamsGeo[i]);
    }
    
    TArrayD tmpArr;
    TH2F* tmpHist = (TH2F*)HHistConverter::createHist("tmpHist", fArrayPhiAlign);
    HHistConverter::fillArray(tmpHist,tmpArr, "fArrayPhiAlign", 10, 10, kTRUE);
    delete tmpHist;

    tmpHist = (TH2F*)HHistConverter::createHist("tmpHist", fArrayThetaAlign);
    HHistConverter::fillArray(tmpHist,tmpArr, "fArrayThetaAlign", 10, 10, kTRUE);
    delete tmpHist;

    tmpHist = (TH2F*)HHistConverter::createHist("tmpHist", fArrayInvPhiAlign);
    HHistConverter::fillArray(tmpHist,tmpArr, "fArrayInvPhiAlign", 10, 10, kTRUE);
    delete tmpHist;

    tmpHist = (TH2F*)HHistConverter::createHist("tmpHist", fArrayInvThetaAlign);
    HHistConverter::fillArray(tmpHist,tmpArr, "fArrayInvThetaAlign", 10, 10, kTRUE);
    delete tmpHist;

    printf("----------------------------------------------------------------------\n");

}

string  HRich700DigiPar::getStringForParTxtFile()
{
    stringstream ss;

    ss << "##############################################################################" << endl;
    ss << "# Class:   HRich700DigiPar" << endl;
    ss << "# Context: Rich700DigiParProduction" << endl;
    ss << "##############################################################################" << endl;
    ss << "[Rich700DigiPar]" << endl;
    ss << "//----------------------------------------------------------------------------" << endl;
    ss << "fNofPixelsInRow:  Int_t  " << fNofPixelsInRow << endl;
    ss << "fPmtSize:  Double_t  " << fPmtSize << endl;
    ss << "fPmtGap:  Double_t  " << fPmtGap << endl;
    ss << "fPmtSensSize:  Double_t  " << fPmtSensSize << endl;
    ss << "fCollectionEfficiency:  Double_t  " << fCollectionEfficiency << endl;
    ss << "fCrossTalkProbability: Double_t " << fCrossTalkProbability << endl;
    ss << "fNofNoiseHits: Int_t " << fNofNoiseHits << endl;

    return ss.str();
}

Bool_t HRich700DigiPar::init(HParIo* inp,Int_t* set)
{
    // intitializes the container from an input
  Bool_t rc = HParCond::init(inp,set);
  if (rc && changed){
      // make hists new
      fillMaps();
  }

  return rc;
}


void HRich700DigiPar::putParams(HParamList* l)
{
    if (!l) return;
    l->add("fNofPixelsInRow" , fNofPixelsInRow);
    l->add("fPmtSize"        , fPmtSize);
    l->add("fPmtGap"         , fPmtGap);
    l->add("fPmtSensSize"    , fPmtSensSize);
    l->add("fCollectionEfficiency", fCollectionEfficiency);
    l->add("fCrossTalkProbability", fCrossTalkProbability);
    l->add("fNofNoiseHits", fNofNoiseHits);
    l->add("fArrayPmt"       , fArrayPmt);
    l->add("fArrayZVertices"   , fArrayZVertices);
    for (UInt_t i = 0; i < fArrayThetaMean.size(); i++) {
	l->add(Form("fArrayThetaMean[%i]",i) , fArrayThetaMean[i]);
    }
    l->add("fArrayThetaTransParamsPoly", fArrayThetaTransParamsPoly);
    l->add("fArrayThetaTransParamsGeo", fArrayThetaTransParamsGeo);
    l->add("fArrayPhiAlign", fArrayPhiAlign);
    l->add("fArrayThetaAlign", fArrayThetaAlign);
    l->add("fArrayInvPhiAlign", fArrayInvPhiAlign);
    l->add("fArrayInvThetaAlign", fArrayInvThetaAlign);
}

Bool_t HRich700DigiPar::getParams(HParamList* l)
{
    if (!l) return kFALSE;
    if(!( l->fill("fNofPixelsInRow", &fNofPixelsInRow))) return kFALSE;
    if(!( l->fill("fPmtSize"       , &fPmtSize)))        return kFALSE;
    if(!( l->fill("fPmtGap"        , &fPmtGap)))         return kFALSE;
    if(!( l->fill("fPmtSensSize"   , &fPmtSensSize)))    return kFALSE;
    if(!( l->fill("fCollectionEfficiency", &fCollectionEfficiency))) return kFALSE;
    if(!( l->fill("fCrossTalkProbability", &fCrossTalkProbability))) return kFALSE;
    if(!( l->fill("fNofNoiseHits", &fNofNoiseHits))) return kFALSE;
    if(!( l->fill("fArrayPmt"      , &fArrayPmt)))       return kFALSE;
    if(!( l->fill("fArrayZVertices"  , &fArrayZVertices)))   return kFALSE;
    fArrayThetaMean.resize(fArrayZVertices.GetSize());
    for (Int_t i = 0; i < fArrayZVertices.GetSize(); i++) {
	if(!( l->fill(Form("fArrayThetaMean[%i]",i), &fArrayThetaMean[i]))) return kFALSE;
    }
    if(!( l->fill("fArrayThetaTransParamsPoly", &fArrayThetaTransParamsPoly)))   return kFALSE;
    if(!( l->fill("fArrayThetaTransParamsGeo", &fArrayThetaTransParamsGeo)))   return kFALSE;
    if(!( l->fill("fArrayPhiAlign", &fArrayPhiAlign)))   return kFALSE;
    if(!( l->fill("fArrayThetaAlign", &fArrayThetaAlign)))   return kFALSE;
    if(!( l->fill("fArrayInvPhiAlign", &fArrayInvPhiAlign)))   return kFALSE;
    if(!( l->fill("fArrayInvThetaAlign", &fArrayInvThetaAlign)))   return kFALSE;
    return kTRUE;
}
void HRich700DigiPar::fillMaps(void)
{
    for (UInt_t i = 0; i < fhxyThetaMean.size(); i++) {
	if(fhxyThetaMean[i]) delete fhxyThetaMean[i];
    }
    fhxyThetaMean.clear();

    for (UInt_t i = 0; i < fArrayThetaMean.size(); i++) {
	fhxyThetaMean.push_back((TH2F*)HHistConverter::createHist(Form("fhxyThetaMean[%i]",i),fArrayThetaMean[i]) );
    }

    if(fhPhiAlign)      delete fhPhiAlign;
    fhPhiAlign      = (TH2D*)HHistConverter::createHist("fhPhiAlign", fArrayPhiAlign);
    if(fhThetaAlign)    delete fhThetaAlign;
    fhThetaAlign    = (TH2D*)HHistConverter::createHist("fhThetaAlign", fArrayThetaAlign);
    if(fhInvPhiAlign)   delete fhInvPhiAlign;
    fhInvPhiAlign   = (TH2D*)HHistConverter::createHist("fhInvPhiAlign", fArrayInvPhiAlign);
    if(fhInvThetaAlign) delete fhInvThetaAlign;
    fhInvThetaAlign = (TH2D*)HHistConverter::createHist("fhInvThetaAlign", fArrayInvThetaAlign);

    fPmtDataMapPmtId.clear();
    fPmtDataMapXY   .clear();

    fMaxX = -1000;
    fMaxY = -1000;
    for(Int_t i = 0; i < fArrayPmt.GetSize()/NPARPMT; i++){
        Int_t j = i*NPARPMT;
        HRich700PmtData pmtData;
        pmtData.fPmtId = (Int_t)fArrayPmt[j+0];
        pmtData.fIndX = (Int_t)fArrayPmt[j+1];
        pmtData.fIndY = (Int_t)fArrayPmt[j+2];
        pmtData.fX = fArrayPmt[j+3];
        pmtData.fY = fArrayPmt[j+4];
        pmtData.fZ = fArrayPmt[j+5];
        pmtData.fPmtType = static_cast<HRich700PmtTypeEnum>(fArrayPmt[j+6]);
        pmtData.fTheta = fArrayPmt[j+7];
        pmtData.fPhi = fArrayPmt[j+8];

        if(pmtData.fX > fMaxX) fMaxX = pmtData.fX ;
        if(pmtData.fY > fMaxY) fMaxY = pmtData.fY ;

        pmtData.fSector = getSector( (Float_t)pmtData.fX, (Float_t)pmtData.fY);

        fPmtDataMapPmtId[pmtData.fPmtId] = pmtData;
        pair<Int_t,Int_t> xyInd(pmtData.fIndX, pmtData.fIndY);
        fPmtDataMapXY[xyInd] = pmtData;
    }
}
Int_t HRich700DigiPar::getSector(Float_t x, Float_t y)
{
    // In PMT geometry there are no sectors any more ... lets take it for phi
    // phi calculated from x,y on PMT plane
    if(x==0&&y==0) {
	Warning("getSector()","x and y equal zero, return sector 0");
	return 0;
    }

    Float_t phi = TMath::ACos(x/sqrt(x*x+y*y));
    if (y<0) phi = 2.*TMath::Pi()-phi;
    Int_t sectorPhi = (Int_t)(phi/1.0471975)-1;   // get sector from phi angle
    if (sectorPhi == -1) sectorPhi = 5;           // 1st sector is along y axis!
    return sectorPhi;
}

void HRich700DigiPar::getLocation(Int_t pmtId, Float_t x, Float_t y, Int_t *loc, Bool_t silent)
{
    UInt_t ufNofPixelsInRow = (UInt_t)fNofPixelsInRow;

    loc[0]=-1; loc[1]=-1; loc[2]=-1;
    map<Int_t, HRich700PmtData>::iterator it = fPmtDataMapPmtId.find(pmtId);
    if (it == fPmtDataMapPmtId.end()){
    	if(!silent) Warning("getLocation","No PMT with id: %i!", pmtId);
    	return;
    }

    HRich700PmtData pmtData = it->second;
    Double_t dx = fPmtSensSize / (Double_t)fNofPixelsInRow;
    Double_t halfPmtSensSize = fPmtSensSize / 2.;

     // not in the sensitive area
    if (x < -halfPmtSensSize || x > halfPmtSensSize || y < -halfPmtSensSize || y > halfPmtSensSize) {
        return;
    }

    // local pixels address
    UInt_t indX = (UInt_t)((x + halfPmtSensSize) / dx);
    UInt_t indY = (UInt_t)((y + halfPmtSensSize) / dx);

    if (indX >= ufNofPixelsInRow){
	    indX = ufNofPixelsInRow - 1;
    }

    if (indY >= ufNofPixelsInRow){
	    indY = ufNofPixelsInRow - 1;
    }

    //cout << "x:" << x << " y:"<< y << " indX:" << indX << " indY:" << indY << endl;

    Int_t sectorPhi = getSector(x,y);

    //----------------------------------------------------------------------------------
    // location of the pixel
    loc[0] = sectorPhi;
    loc[1] = indX + pmtData.fIndX * ufNofPixelsInRow; // col
    loc[2] = indY + pmtData.fIndY * ufNofPixelsInRow; // row
}

void HRich700DigiPar::pmtIdPixelToColRowSec(Int_t pmtId,Int_t pixel,Int_t& sec,Int_t& col,Int_t& row, Bool_t silent)
{
    // pmtID
    // pixel (1-64)
    // sec   (0-5)
    // col   (0-192)
    // row   (0-192)

    UInt_t ufNofPixelsInRow = (UInt_t)fNofPixelsInRow;
    col =-1;
    row =-1;
    sec =-1;

    if(pixel<1){
	Warning("pmtIdPixelToColRowSec","pixel < 1 !");
    }

    map<Int_t, HRich700PmtData>::iterator it = fPmtDataMapPmtId.find(pmtId);
    if (it == fPmtDataMapPmtId.end()){
    	if(!silent) Warning("pmtIdPixelToColRowSec","No PMT with id: %i!", pmtId);
    	return;
    }
    pixel-=1;

    HRich700PmtData pmtData = it->second;

    //----------------------------------------------------------------------------------
    // pmtID, pixel -> col,row
    UInt_t pix_x = pixel % fNofPixelsInRow;
    UInt_t pix_y = pixel / fNofPixelsInRow;

    col = pix_x + pmtData.fIndX * ufNofPixelsInRow; // col
    row = pix_y + pmtData.fIndY * ufNofPixelsInRow; // row

    //----------------------------------------------------------------------------------
    // pmtID, pixel -> x,y
    Double_t dx = fPmtSensSize / ufNofPixelsInRow;
    Double_t halfPmtSensSize = fPmtSensSize / 2.;

    Double_t xLoc = (pix_x + 0.5) * dx - halfPmtSensSize;
    Double_t yLoc = (pix_y + 0.5) * dx - halfPmtSensSize;

    Float_t x = xLoc + pmtData.fX;
    Float_t y = yLoc + pmtData.fY;

    sec = getSector(x,y);

}


pair<Double_t, Double_t> HRich700DigiPar::getXY(Int_t* loc,Bool_t silent)
{
    UInt_t ufNofPixelsInRow = (UInt_t)fNofPixelsInRow;

    Int_t indX = loc[1];
    Int_t indY = loc[2];

    Int_t pmtIndX = (Int_t) indX / ufNofPixelsInRow;
    Int_t pmtIndY = (Int_t) indY / ufNofPixelsInRow;

    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(pmtIndX, pmtIndY));
    if (it == fPmtDataMapXY.end()){
    	if(!silent)Warning("getXY()","No PMT with XY: %i %i!",pmtIndX,pmtIndY);
    	return pair<Double_t, Double_t>(0., 0.);
    }
    HRich700PmtData pmtData = it->second;

    Int_t locIndX = indX % ufNofPixelsInRow;
    Int_t locIndY = indY % ufNofPixelsInRow;

   // Double_t padding = (fPmtSize - fPmtSensSize) / 2.;
    Double_t dx = fPmtSensSize / ufNofPixelsInRow;
    Double_t halfPmtSensSize = fPmtSensSize / 2.;

    Double_t xLoc = (locIndX + 0.5) * dx - halfPmtSensSize;
    Double_t yLoc = (locIndY + 0.5) * dx - halfPmtSensSize;
    // cout << "locIndX:" << locIndX << " xLoc:" << xLoc << " locIndY:"<< locIndY <<  "  yLoc:" << yLoc << endl;
    // cout << "indX:" << indX << " x: " << xLoc + pmtData.fX << " indY:" << indY << " y:" << yLoc + pmtData.fY << endl;

    pair<Double_t, Double_t> xy(xLoc + pmtData.fX, yLoc + pmtData.fY);
    return xy;
}

pair<Double_t, Double_t> HRich700DigiPar::getPmtCenter(Int_t pmtId)
{
    return pair<Double_t, Double_t>(fPmtDataMapPmtId[pmtId].fX, fPmtDataMapPmtId[pmtId].fY);
}

vector<pair<Double_t, Double_t> > HRich700DigiPar::getPmtCenters()
{
    vector<pair<Double_t, Double_t> > v;
    v.reserve(fPmtDataMapPmtId.size());
    for(map<Int_t,HRich700PmtData>::iterator it = fPmtDataMapPmtId.begin(); it != fPmtDataMapPmtId.end(); it++) {
	    v.push_back(pair<Double_t,Double_t>(it->second.fX, it->second.fY));
    }

    return v;
}

vector<pair<Int_t, Int_t> > HRich700DigiPar::getDirectNeighbourPixels(Int_t col, Int_t row)
{
    UInt_t ufNofPixelsInRow = (UInt_t)fNofPixelsInRow;
    std::vector<pair<Int_t, Int_t> > v;

    UInt_t locCol = (UInt_t)(col % ufNofPixelsInRow);
    UInt_t locRow = (UInt_t)(row % ufNofPixelsInRow);

    if (locCol < ufNofPixelsInRow - 1) {
	    v.push_back(make_pair(col + 1, row));
    }

    if (locCol > 0) {
	    v.push_back(make_pair(col - 1, row));
    }

    if (locRow < ufNofPixelsInRow - 1) {
	    v.push_back(make_pair(col, row + 1));
    }

    if (locRow > 0) {
	    v.push_back(make_pair(col, row - 1));
    }

    return v;
}

vector<pair<Int_t, Int_t> > HRich700DigiPar::getDiagonalNeighbourPixels(Int_t col, Int_t row)
{
    UInt_t ufNofPixelsInRow = (UInt_t)fNofPixelsInRow;
    std::vector<pair<Int_t, Int_t> > v;

    UInt_t locCol = (UInt_t)(col % ufNofPixelsInRow);
    UInt_t locRow = (UInt_t)(row % ufNofPixelsInRow);

    if (locCol < ufNofPixelsInRow - 1 && locRow < ufNofPixelsInRow - 1) {
	    v.push_back(make_pair(col + 1, row  + 1));
    }

    if (locCol > 0 && locRow > 0) {
	    v.push_back(make_pair(col - 1, row  - 1));
    }

    if (locCol < ufNofPixelsInRow - 1 && locRow > 0) {
	    v.push_back(make_pair(col + 1, row - 1));
    }

    if (locCol > 0 && locRow < ufNofPixelsInRow - 1) {
	    v.push_back(make_pair(col - 1, row + 1));
    }

    return v;
}


vector<pair<Int_t, Int_t> > HRich700DigiPar::getNoisePixels(UInt_t nofNoisePixels)
{
    UInt_t ufNofPixelsInRow = (UInt_t)fNofPixelsInRow;
    std::vector<pair<Int_t, Int_t> > v;

    while(kTRUE) {
    	Int_t col = (Int_t)(gRandom->Rndm() * RICH700_MAX_COLS);
    	Int_t row = (Int_t)(gRandom->Rndm() * RICH700_MAX_ROWS);

    	Int_t pmtIndX = (Int_t) col / ufNofPixelsInRow;
    	Int_t pmtIndY = (Int_t) row / ufNofPixelsInRow;

    	map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(pmtIndX, pmtIndY));
    	if (it != fPmtDataMapXY.end()){
    	    v.push_back(make_pair(col, row));
    	    if (v.size() >= nofNoisePixels) break;
    	}
    }

    return v;
}

Int_t HRich700DigiPar::getPMTId(Float_t x, Float_t y)
{
    if(x>fMaxX) x = fMaxX;
    if(y>fMaxY) y = fMaxY;

    if(x<-fMaxX) x = -fMaxX;
    if(y<-fMaxY) y = -fMaxY;

    Int_t pmtIndX = ( (fMaxX+fPmtSize/2.) + x)/(fPmtSize+fPmtGap);
    Int_t pmtIndY = ( (fMaxY+fPmtSize/2.) + y)/(fPmtSize+fPmtGap);
    //cout <<"x: " << x << " y:" << y << " pmtX:" << pmtIndX << " pmtY:" << pmtIndY << endl;
    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(pmtIndX, pmtIndY));
    if (it != fPmtDataMapXY.end()){
	    return it->second.fPmtId;
    } else {
    	//Warning("getPMTId()","No PMT found for (x,y) = (%f,%f).",x,y);
    	return -1;
    }
}

Int_t HRich700DigiPar::getPMTId(Int_t col, Int_t row)
{

    Int_t pmtIndX = col/fNofPixelsInRow;
    Int_t pmtIndY = row/fNofPixelsInRow;

    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(pmtIndX, pmtIndY));
    if (it != fPmtDataMapXY.end()){
	    return it->second.fPmtId;
    } else {
    	Warning("getPMTId()","No PMT found for (col,row) = (%i,%i).",col,row);
    	return -1;
    }
}

HRich700PmtData* HRich700DigiPar::getPMTData(Int_t pmtid)
{
    map<Int_t,HRich700PmtData>::iterator it = fPmtDataMapPmtId.find(pmtid);
    if(it == fPmtDataMapPmtId.end()) return NULL;
    return &fPmtDataMapPmtId[pmtid];
}

Int_t  HRich700DigiPar::getInterpolatedSectorThetaPhi(Float_t x, Float_t y, Float_t& theta,Float_t& phi)
{
    theta = 0;
    phi   = 0;
    Int_t sector = getSector(x,y);

    phi = atan2(y, x)*TMath::RadToDeg();
    phi = phi>0 ? phi : 360+phi;

    theta = fhxyThetaMean[0] ->Interpolate(x,y) ; // do not use Z vertex

    return sector;
}

Int_t  HRich700DigiPar::getInterpolatedSectorThetaPhi(Float_t x, Float_t y, Float_t zv, Float_t& theta,Float_t& phi)
{
    theta = 0;
    phi   = 0;
    Int_t sector = getSector(x,y);

    phi = atan2(y, x)*TMath::RadToDeg();
    phi = phi>0 ? phi : 360+phi;

    if (zv >= fArrayZVertices[0]) {
       theta = fhxyThetaMean[0] ->Interpolate(x,y);
    } else if (zv <= fArrayZVertices[fArrayZVertices.GetSize() - 1]) {
       theta = fhxyThetaMean[fhxyThetaMean.size() - 1] ->Interpolate(x,y);
    } else {
        // interpolation between two Z positions
	Int_t iZ0 = 0;
        Int_t iZ1 = 0;
	// we assume that Z values are sorted in the array
	for (Int_t i = 0; fArrayZVertices.GetSize(); i++){
	    if (zv > fArrayZVertices[i]){
		iZ1 = i;
                iZ0 = iZ1 - 1;
                break;
	    }
	}
	Double_t z0 = fArrayZVertices[iZ0];
	Double_t z1 = fArrayZVertices[iZ1];
	Double_t vTheta0 = fhxyThetaMean[iZ0]->Interpolate(x, y);
	Double_t vTheta1 = fhxyThetaMean[iZ1]->Interpolate(x, y);
	theta =  vTheta0 + (zv - z0) * (vTheta1 - vTheta0) / (z1 - z0);
    }

    return sector;
}

Int_t HRich700DigiPar::getInterpolatedSectorThetaPhiAnalytical(Float_t x, Float_t y, Float_t zv, Float_t& theta,Float_t& phi)
{
    theta = 0;
    phi   = 0;
    Int_t sector = getSector(x,y);

    phi = atan2(y, x)*TMath::RadToDeg();
    phi = phi>0 ? phi : 360+phi;

    Double_t innerPlaneWidth = fArrayThetaTransParamsGeo[0];
    Double_t meanTargetWRTMirror = fArrayThetaTransParamsGeo[1];
    Double_t TargetCenter = fArrayThetaTransParamsGeo[2];

    Double_t P[16][5];
    Int_t i = 0;
    for (Int_t i1 = 0; i1 < 16; i1++) {
	for (Int_t i2 = 0; i2 < 5; i2++) {
            P[i1][i2] = fArrayThetaTransParamsPoly[i];
            i++;
	}
    }

    Bool_t isInnerPlane = (std::abs(x)<innerPlaneWidth && std::abs(y)<innerPlaneWidth);

    //if Z-Vertex is too far out of range use target center as z-position
    Double_t z = (zv < -120 || zv > 20)?meanTargetWRTMirror + TargetCenter : meanTargetWRTMirror + zv;

    //Parameters for which the polynomials were derived are:
    // r = 872;target0 = 533.3;k_diff = 128;k0 = target0 - 122.2;k1 = k0 - k_diff;
    Double_t z2 = z * z;
    Double_t z3 = z2 * z;
    Double_t z4 = z3 * z;
    Double_t P0I = P[0][0] + P[0][1] * z + P[0][2] * z2 + P[0][3] * z3 + P[0][4] * z4;
    Double_t P1I = P[1][0] + P[1][1] * z + P[1][2] * z2 + P[1][3] * z3 + P[1][4] * z4;
    Double_t P2I = P[2][0] + P[2][1] * z + P[2][2] * z2 + P[2][3] * z3 + P[2][4] * z4;
    Double_t P3I = P[3][0] + P[3][1] * z + P[3][2] * z2 + P[3][3] * z3 + P[3][4] * z4;
    Double_t P4I = P[4][0] + P[4][1] * z + P[4][2] * z2 + P[4][3] * z3 + P[4][4] * z4;
    Double_t P5I = P[5][0] + P[5][1] * z + P[5][2] * z2 + P[5][3] * z3 + P[5][4] * z4;
    Double_t P6I = P[6][0] + P[6][1] * z + P[6][2] * z2 + P[6][3] * z3 + P[6][4] * z4;
    Double_t P7I = P[7][0] + P[7][1] * z + P[7][2] * z2 + P[7][3] * z3 + P[7][4] * z4;
    Double_t P0O = P[8][0] + P[8][1] * z + P[8][2] * z2 + P[8][3] * z3 + P[8][4] * z4;
    Double_t P1O = P[9][0] + P[9][1] * z + P[9][2] * z2 + P[9][3] * z3 + P[9][4] * z4;
    Double_t P2O = P[10][0] + P[10][1] * z + P[10][2] * z2 + P[10][3] * z3 + P[10][4] * z4;
    Double_t P3O = P[11][0] + P[11][1] * z + P[11][2] * z2 + P[11][3] * z3 + P[11][4] * z4;
    Double_t P4O = P[12][0] + P[12][1] * z + P[12][2] * z2 + P[12][3] * z3 + P[12][4] * z4;
    Double_t P5O = P[13][0] + P[13][1] * z + P[13][2] * z2 + P[13][3] * z3 + P[13][4] * z4;
    Double_t P6O = P[14][0] + P[14][1] * z + P[14][2] * z2 + P[14][3] * z3 + P[14][4] * z4;
    Double_t P7O = P[15][0] + P[15][1] * z + P[15][2] * z2 + P[15][3] * z3 + P[15][4] * z4;

    Double_t r = sqrt(x*x + y*y);
    Double_t r2 = r * r;
    Double_t r3 = r2 * r;
    Double_t r4 = r3 * r;
    Double_t r5 = r4 * r;
    Double_t r6 = r5 * r;
    Double_t r7 = r6 * r;
    if(isInnerPlane ) {
	theta = P0I + P1I * r + P2I * r2 + P3I * r3 + P4I * r4 + P5I * r5 + P6I * r6 + P7I * r7;
    } else {
	theta = P0O + P1O * r + P2O * r2 + P3O * r3 + P4O * r4 + P5O * r5 + P6O * r6 + P7O * r7;
    }

    return sector;
}

// This is inverse transformation Theta, Phi -> XY Pmt
void HRich700DigiPar::getRingCenterXY(Float_t theta, Float_t phi, Float_t zv, Float_t& x,Float_t& y)
{
    Double_t innerPlaneWidth = fArrayThetaTransParamsGeo[0];
    Double_t meanTargetWRTMirror = fArrayThetaTransParamsGeo[1];
    Double_t TargetCenter = fArrayThetaTransParamsGeo[2];
    Double_t mirrorRadius = fArrayThetaTransParamsGeo[3];
    Double_t PMTPlane1Z = fArrayThetaTransParamsGeo[4];
    Double_t PMTPlane2Z = fArrayThetaTransParamsGeo[5];

    Double_t z = (zv < -120 || zv > 20)?meanTargetWRTMirror + TargetCenter : meanTargetWRTMirror + zv;

    //calculate the intersection of planes
    Double_t phiModNeg45 = fmod(phi, 90);
    if(phiModNeg45 > 45) {
	phiModNeg45 = fmod(phi, 90) - 90;
    }
    Double_t innerPlaneWidthAtPhi = innerPlaneWidth / cos(phiModNeg45 * TMath::DegToRad() );

    Double_t phiRad = phi*TMath::DegToRad();
    Double_t ct = cos(theta*TMath::DegToRad() );
    Double_t st = sin(theta*TMath::DegToRad() );
    Double_t zz = z*z;
    Double_t rr = mirrorRadius*mirrorRadius;

    //calculate the radial position as if the ring would be on the inner plane
    Double_t xInner = (2*PMTPlane1Z*zz*st*st*st + 2*sqrt(-zz*st*st + rr)*PMTPlane1Z*z*ct*st - PMTPlane1Z*rr*st - rr*z*st)
	/(2*zz*ct*st*st - 2*sqrt(-zz*st*st + rr)*z*st*st - rr*ct);
    if (xInner < innerPlaneWidthAtPhi){
	x = xInner*cos(phiRad);
	y = xInner*sin(phiRad);
        return;
    }

    //calculate the radial position as if the ring would be on the outer plane
    double xOuter = (2*PMTPlane2Z*zz*st*st*st + 2*sqrt(-zz*st*st + rr)*PMTPlane2Z*z*ct*st - PMTPlane2Z*rr*st - rr*z*st)
	/(2*zz*ct*st*st - 2*sqrt(-zz*st*st + rr)*z*st*st - rr*ct);
    if (xOuter > innerPlaneWidthAtPhi){
	x = xOuter*cos(phiRad);
	y = xOuter*sin(phiRad);
        return;
    }

    //Ambiguous position on detector
    x = innerPlaneWidthAtPhi*cos(phiRad);
    y = innerPlaneWidthAtPhi*sin(phiRad);
}


void  HRich700DigiPar::getAlignedThetaPhi(const Float_t theta, const Float_t phi
    , Float_t& thetaCor, Float_t& phiCor) 
{
    thetaCor = theta;
    phiCor = phi;
    if(theta > 90 || theta < 10) {
        return;
    }
    else {
        Float_t mod_phi = fmod(phi,360);
        phiCor   -= fhPhiAlign->Interpolate(theta, mod_phi);
        thetaCor -= fhThetaAlign->Interpolate(theta, mod_phi);
        return;
    }
}

void  HRich700DigiPar::getAlignedThetaPhiInv(const Float_t theta, const Float_t phi
    , Float_t & thetaCor, Float_t & phiCor) 
{
    thetaCor = theta;
    phiCor = phi;
    if(theta > 90 || theta < 10) {
        return;
    }
    else {
        Float_t mod_phi = fmod(phi,360);
        phiCor   -= fhInvPhiAlign->Interpolate(theta, mod_phi);
        thetaCor -= fhInvThetaAlign->Interpolate(theta, mod_phi);
        return;
    }
}

Bool_t  HRich700DigiPar::getInterpolatedThetaPhiPMT(Float_t x, Float_t y, Float_t& theta,Float_t& phi)
{
    Int_t pmtid = getPMTId(x,y);
    if(pmtid < 0) return kFALSE;

    HRich700PmtData& data = fPmtDataMapPmtId[pmtid];
    Int_t iX = data.fIndX;
    Int_t iY = data.fIndY;
    Double_t x0 = data.fX;
    Double_t y0 = data.fY;
    Double_t phi0 = data.fPhi;
    Double_t theta0 = data.fTheta;

    theta = theta0;
    phi = phi0;

    // indX 0 at min X, indX 23 at max X
    // indY 0 at min Y, indY 23 at max Y
    // get neighbour pmts for interpolation
    //
    //          iy+1            2     1
    //     ix+1 ix,iy ix-1         c
    //          iy-1            3     4
    //
    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator itX, itY, itXY;
    Double_t x1,x2,y1,y2;
    Double_t p11,p12,p21,p22;
    Double_t t11,t12,t21,t22;

    if(x <= x0 && y >= y0){  // right upper (1)
        itX = fPmtDataMapXY.find(make_pair(iX-1, iY));
        itY = fPmtDataMapXY.find(make_pair(iX, iY+1));
        itXY = fPmtDataMapXY.find(make_pair(iX-1, iY+1));
    } else if(x >= x0 && y >= y0){ // left upper (2)
        itX = fPmtDataMapXY.find(make_pair(iX+1, iY));
        itY = fPmtDataMapXY.find(make_pair(iX, iY+1));
        itXY = fPmtDataMapXY.find(make_pair(iX+1, iY+1));
    } else if(x >= x0 && y <= y0){ // left lower (3)
        itX = fPmtDataMapXY.find(make_pair(iX+1, iY));
        itY = fPmtDataMapXY.find(make_pair(iX, iY-1));
        itXY = fPmtDataMapXY.find(make_pair(iX+1, iY-1));
    } else if(x <= x0 && y <= y0){ // right lower (4)
        itX = fPmtDataMapXY.find(make_pair(iX-1, iY));
        itY = fPmtDataMapXY.find(make_pair(iX, iY-1));
        itXY = fPmtDataMapXY.find(make_pair(iX-1, iY-1));
    }

    x1 = x0;
    y1 = y0;
	p11 = phi0;
	t11 = theta0;

    if (itX != fPmtDataMapXY.end()){
	    x2  = itX->second.fX;
	    p21 = itX->second.fPhi;
	    t21 = itX->second.fTheta;
	} else {
	    x2  = x0;
	    p21 = phi0;
	    t21 = theta0;
	}

    if (itY != fPmtDataMapXY.end()){
	    y2  = itY->second.fY;
	    p12 = itY->second.fPhi;
	    t12 = itY->second.fTheta;
	} else {
	    y2  = y0;
	    p12 = phi0;
	    t12 = theta0;
	}

    if (itXY != fPmtDataMapXY.end()){
	    p22 = itXY->second.fPhi;
	    t22 = itXY->second.fTheta;
	} else {
	    p22 = phi0;
	    t22 = theta0;
	}

    Double_t d = 1.0*(x2-x1)*(y2-y1);
    if (d == 0) {
         theta = theta0;
	     phi = phi0;
         return kTRUE;
    }

    theta = (Float_t)(1.0*t11/d*(x2-x)*(y2-y)+1.0*t21/d*(x-x1)*(y2-y)+1.0*t12/d*(x2-x)*(y-y1)+1.0*t22/d*(x-x1)*(y-y1));
    phi = (Float_t)(1.0*p11/d*(x2-x)*(y2-y)+1.0*p21/d*(x-x1)*(y2-y)+1.0*p12/d*(x2-x)*(y-y1)+1.0*p22/d*(x-x1)*(y-y1));

    return kTRUE;
}

Int_t HRich700DigiPar::getSectorPixels(Int_t col,Int_t row)
{
    Int_t pmtIndX = (Int_t) col / fNofPixelsInRow;
    Int_t pmtIndY = (Int_t) row / fNofPixelsInRow;

    Int_t sectorPhi=0;
    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(pmtIndX, pmtIndY));
    if (it != fPmtDataMapXY.end()){
        Float_t x = (Float_t)it->second.fX;
	    Float_t y = (Float_t)it->second.fY;

	    sectorPhi = getSector(x, y);
    }
    return sectorPhi;
}

Int_t HRich700DigiPar::getSectorPMTInd(Int_t xind,Int_t yind)
{
    Int_t sectorPhi=0;
    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(xind,yind));
    if (it != fPmtDataMapXY.end()){
	sectorPhi = it->second.fSector;
    }
    return sectorPhi;
}

Int_t HRich700DigiPar::getSectorPMTId(Int_t pmtid)
{
    Int_t sectorPhi=0;
    map<Int_t,HRich700PmtData> ::iterator it = fPmtDataMapPmtId.find(pmtid);
    if (it != fPmtDataMapPmtId.end()){
	sectorPhi = it->second.fSector;
    }
    return sectorPhi;
}

Int_t HRich700DigiPar::getSectorPhiThetaDegPixels(Int_t col,Int_t row,Float_t& phiDeg,Float_t& thetaDeg)
{
    Int_t pmtIndX = (Int_t) col / fNofPixelsInRow;
    Int_t pmtIndY = (Int_t) row / fNofPixelsInRow;

    Int_t sectorPhi = 0;
    phiDeg          = 0;
    thetaDeg        = 0;

    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(pmtIndX, pmtIndY));
    if (it != fPmtDataMapXY.end()){
        Float_t x = (Float_t)it->second.fX;
	Float_t y = (Float_t)it->second.fY;

        sectorPhi = getInterpolatedSectorThetaPhi(x,y,thetaDeg,phiDeg);

    }
    return sectorPhi;
}

Int_t HRich700DigiPar::getSectorPhiThetaDegPMTInd(Int_t xind,Int_t yind,Float_t& phiDeg,Float_t& thetaDeg)
{
    Int_t sectorPhi = 0;
    phiDeg          = 0;
    thetaDeg        = 0;
    map<pair<Int_t, Int_t>, HRich700PmtData>::iterator it = fPmtDataMapXY.find(make_pair(xind,yind));
    if (it != fPmtDataMapXY.end()){
	sectorPhi = it->second.fSector;
        phiDeg   = (Float_t)it->second.fPhi;
        thetaDeg = (Float_t)it->second.fTheta;
    }
    return sectorPhi;
}

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