ROOT logo
//////////////////////////////////////////////////////////////////////////////
//
// $Id: $
//
//*-- Author  : S. Lebedev
//
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
//
//  HRich700DigiParCreator
//
//
//////////////////////////////////////////////////////////////////////////////

#include "hrich700digiparcreator.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hcategory.h"
#include "hevent.h"
#include "hgeantrich.h"
#include "hlinearcatiter.h"
#include "hmatrixcatiter.h"
#include "hparset.h"
#include "hspectrometer.h"
#include "richdef.h"
#include "hrich700drawhist.h"
#include "hrich700pmt.h"
#include "hrichhitsim.h"
#include "htool.h"
#include "hhistconverter.h"

#include "TCanvas.h"
#include "TH2D.h"
#include "TPad.h"
#include "TEllipse.h"
#include "TRandom.h"
#include "TLatex.h"
#include "TStyle.h"

#include "hgeantkine.h"

#include "hrich700histmanager.h"
#include "hrich700digipar.h"
#include "hrich700utils.h"

#include <iostream>
#include <sstream>
#include <fstream>

using namespace std;


ClassImp(HRich700DigiParCreator)

HRich700DigiParCreator::HRich700DigiParCreator():
fEventNum(0),
fOutputFilePath("richpar_output.dat"),
fOutputHistFilePath("richpar_hist.root")
{

}

HRich700DigiParCreator::~HRich700DigiParCreator()
{

}

Bool_t HRich700DigiParCreator::init()
{
    fCatKine = gHades->getCurrentEvent()->getCategory(catGeantKine);
    if (NULL == fCatKine) {
    	Error("init", "Initializatin of kine category failed, returning...");
    	return kFALSE;
    }

    fCatRichHit = gHades->getCurrentEvent()->getCategory(catRichHit);
    if (NULL == fCatRichHit) {
    	Error("init", "Initializatin of RICH hit category failed, returning...");
    	return kFALSE;
    }

    fDigiPar = (HRich700DigiPar*) gHades->getRuntimeDb()->getContainer("Rich700DigiPar");
    if(fDigiPar == NULL) {
	    Error("init", "Can not retrieve HRich700DigiPar");
        return kFALSE;
    }

    fRingFinderPar = (HRich700RingFinderPar*) gHades->getRuntimeDb()->getContainer("Rich700RingFinderPar");
    if(fRingFinderPar == NULL) {
        Error("init", "Can not retrieve fRingFinderPar");
        return kFALSE;
    }

    initHist();
    return kTRUE;
}

void HRich700DigiParCreator::initHist()
{
    // XY [mm]
    for(Int_t i = 0; i < knPmt; i++){
        fhPhi[i] = new TH1F(Form("fhPhi[%i]", i), Form("fhPhi[%i];Phi [deg];Counter", i), 1440, 0, 360);
        fhTheta[i] = new TH1F(Form("fhTheta[%i]", i), Form("fhTheta[%i];Theta [deg];Counter", i), 360, 0, 90);
    }
    const Double_t hMinXY = -660.;
    const Double_t hMaxXY = 660;
    fhXYCounter = new TH2F("fhXYCounter", "fhXYCounter;X [mm];Y [mm];Counter", knXY, hMinXY, hMaxXY, knXY, hMinXY, hMaxXY);
    fhXYPhiMean = new TH2F("fhXYPhiMean", "fhXYPhiMean;X [mm];Y [mm];Phi_{mean} [deg]", knXY, hMinXY, hMaxXY, knXY, hMinXY, hMaxXY);
    fhXYThetaMean = new TH2F("fhXYThetaMean", "fhXYThetaMean;X [mm];Y [mm];Theta_{mean} [deg]", knXY,  hMinXY, hMaxXY, knXY, hMinXY, hMaxXY);
    fhXYPhiRms = new TH2F("fhXYPhiRms", "fhXYPhiRms;X [mm];Y [mm];Phi_{RMS} [deg]", knXY, hMinXY, hMaxXY, knXY, hMinXY, hMaxXY);
    fhXYThetaRms = new TH2F("fhXYThetaRms", "fhXYThetaRms;X [mm];Y [mm];Theta_{RMS} [deg]", knXY, hMinXY, hMaxXY, knXY, hMinXY, hMaxXY);


    // XY pmtIndX, pmtIndY
    for(Int_t i = 0; i < knXY; i++){
        for(Int_t j = 0; j < knXY; j++){
            fhPhiXY[i][j] = new TH1F(Form("fhPhiXY[%i][%i]", i, j), Form("fhPhiXY[%i][%i];Phi [deg];Counter", i, j), 1440, 0, 360);
            fhThetaXY[i][j] = new TH1F(Form("fhThetaXY[%i][%i]", i, j), Form("fhThetaXY[%i][%i];Theta [deg];Counter", i, j), 360, 0, 90);
        }
    }
    const Double_t hMinInd = -0.5;
    const Double_t hMaxInd = 23.5;
    const Int_t nofBinsInd = 24;
    fhXYIndCounter = new TH2F("fhXYIndCounter", "fhXYIndCounter;PMT X_{ind};PMT Y_{ind};Counter", nofBinsInd, hMinInd, hMaxInd, nofBinsInd, hMinInd, hMaxInd);
    fhXYIndPhiMean = new TH2F("fhXYIndPhiMean", "fhXYIndPhiMean;PMT X_{ind};PMT Y_{ind};Phi_{mean} [deg]", nofBinsInd, hMinInd, hMaxInd, nofBinsInd, hMinInd, hMaxInd);
    fhXYIndThetaMean = new TH2F("fhXYIndThetaMean", "fhXYIndThetaMean;PMT X_{ind};PMT Y_{ind};Theta_{mean} [deg]", nofBinsInd, hMinInd, hMaxInd, nofBinsInd, hMinInd, hMaxInd);
    fhXYIndPhiRms = new TH2F("fhXYIndPhiRms", "fhXYIndPhiRms;PMT X_{ind};PMT Y_{ind};Phi_{RMS} [deg]", nofBinsInd, hMinInd, hMaxInd, nofBinsInd, hMinInd, hMaxInd);
    fhXYIndThetaRms = new TH2F("fhXYIndThetaRms", "fhXYIndThetaRms;PMT X_{ind};PMT Y_{ind};Theta_{RMS} [deg]", nofBinsInd, hMinInd, hMaxInd, nofBinsInd, hMinInd, hMaxInd);

    // interpolation
    fhXYPhiInterpolation = new TH2F("fhXYPhiInterpolation", "fhXYPhiInterpolation;X [mm];Y [mm];Phi", 200, -636, 636, 200, -636, 636);
    fhXYThetaInterpolation = new TH2F("fhXYThetaInterpolation", "fhXYThetaInterpolation;X [mm];Y[mm];Theta", 200, -636, 636, 200, -636, 636);
}

Bool_t HRich700DigiParCreator::reinit()
{
    return kTRUE;
}


Int_t HRich700DigiParCreator::execute()
{
    HRichDrawHist::SetDefaultDrawStyle();
    fEventNum++;
    if (fEventNum % 10000 == 0) cout << "HRich700DigiParCreator::execute eventNum " << fEventNum << endl;

    processEvent();

    return 0;
}

void HRich700DigiParCreator::processEvent()
{
    Int_t nofRichHits = fCatRichHit->getEntries();
    for (Int_t i = 0; i < nofRichHits; i++) {
    	HRichHitSim* richHit = (HRichHitSim*) fCatRichHit->getObject(i);
        if (richHit == NULL) continue;
        HGeantKine* kine = (HGeantKine*)fCatKine->getObject(richHit->track1 - 1);
        // select only rings from primary electrons
    	if (!isPrimaryElectron(kine)) continue;

        Int_t pmtId = fDigiPar->getPMTId((Float_t)richHit->fRich700CircleCenterX, (Float_t)richHit->fRich700CircleCenterY);
        if (pmtId < 0) {
            //cout << "HRich700DigiParCreator::processEvent pmtId is not correct:" << pmtId << endl;
            continue;
        }

        Float_t theta = 0;
        Float_t phi = 0;
        Int_t gsec = kine->getPhiThetaDeg(theta, phi);
        HRich700PmtData* richdata = fDigiPar->getPMTData(pmtId);
        Double_t ringX = richHit->fRich700CircleCenterX;
        Double_t ringY = richHit->fRich700CircleCenterY;
        Int_t sec = fDigiPar->getSector(ringX, ringY);
        // PMT
        Bool_t isGoodXdY = ( fabs(ringX - richdata->fX) < 5. && fabs(ringY - richdata->fY) < 5. );
        if(isGoodXdY && richHit->fRich700CircleChi2 < 500. &&  sec == gsec){
            fhPhi[pmtId]->Fill(phi);
            fhTheta[pmtId]->Fill(theta);
            fhXYIndCounter->Fill(richdata->fIndX, richdata->fIndY);
        }

        // x,y [mm]
        if(richHit->fRich700CircleChi2 < 500. &&  sec == gsec){
            fhXYCounter->Fill(ringX, ringY);

            Int_t xBin = fhXYCounter->GetXaxis()->FindBin(ringX) - 1;
            Int_t yBin = fhXYCounter->GetYaxis()->FindBin(ringY) - 1;
            if (xBin < 0 || xBin >= knXY || yBin < 0 || yBin >= knXY) {
                //cout << "processEvent: xBin < 0 || xBin >= knXY || yBin < 0 || yBin >= knXY xBin:" << xBin << " yBin:" << yBin  << endl;
            } else {
                fhPhiXY[xBin][yBin]->Fill(phi);
                fhThetaXY[xBin][yBin]->Fill(theta);
            }
        }
    }
}

Double_t HRich700DigiParCreator::calculateHistMean(TH1* hist, Double_t minVal, Double_t maxVal)
{
    if (hist == NULL) return 0.;
    Double_t width = 5.;
    Double_t mean = hist->GetMean();
    hist->GetXaxis()->SetRangeUser(mean > width? mean - width : minVal, mean < maxVal - width? mean + width : maxVal);
    mean = hist->GetMean();
    width = 5. * hist->GetRMS();
    hist->GetXaxis()->SetRangeUser(mean > width? mean - width: minVal, mean < maxVal - width? mean + width : maxVal);
    return hist->GetMean();
}

void HRich700DigiParCreator::createOutputFile()
{
    string rfStr = fRingFinderPar->getStringForParTxtFile();
    string digiStr = fDigiPar->getStringForParTxtFile();

    string digiPmtIdStr = createStringPhiThetaPmtId();
    string digiXYStr = createStringPhiThetaXY();

    ofstream fout;
    fout.open(fOutputFilePath.c_str());
    fout << rfStr << digiStr << digiPmtIdStr << digiXYStr;
    fout << "##############################################################################" <<endl;
    fout.close();

}

string HRich700DigiParCreator::createStringPhiThetaPmtId()
{
    ostringstream ss;
    ss <<"fArrayPmt:  Double_t \\" << endl;
    for(Int_t i = 0; i < knPmt; i++){
        HRich700PmtData* pd = fDigiPar->getPMTData(i);
        if(pd == NULL){
            cout<<" NO pmt for id "<< i <<endl;
            continue;
        }

        Double_t phiMean = calculateHistMean(fhPhi[i], 0., 360.);
        Double_t thetaMean = calculateHistMean(fhTheta[i], 0., 90.);
        if (fhPhi[i]->Integral() < 4){
            phiMean = 0.;
            thetaMean = 0.;
        }

        ss << pd->fPmtId << " " << pd->fIndX << " " << pd->fIndY << " " << pd->fX << " "
           << pd->fY << " " << pd->fZ << " " << pd->fPmtType << " " << thetaMean << " "
           << phiMean << " \\" << endl;

        fhXYIndPhiMean->Fill(pd->fIndX, pd->fIndY, phiMean);
        fhXYIndThetaMean->Fill(pd->fIndX, pd->fIndY, thetaMean);
        fhXYIndPhiRms->Fill(pd->fIndX, pd->fIndY, fhPhi[i]->GetRMS());
        fhXYIndThetaRms->Fill(pd->fIndX, pd->fIndY, fhTheta[i]->GetRMS());
    }
    // remove last " \" and endl symbols
    string str = ss.str().substr(0, ss.str().size() - 3);
    str = string(str + "\n");
    cout << str << endl;

    return str;
    //fclose(pFile);
}

string HRich700DigiParCreator::createStringPhiThetaXY()
{
    ostringstream ss;
    for(Int_t i = 0; i < knXY; i++){
    	for(Int_t j = 0; j < knXY; j++){
            TH1F* hth = fhThetaXY[i][j];
            TH1F* hph = fhPhiXY[i][j];

            Double_t phiMean = calculateHistMean(hph, 0., 360.);
            Double_t thetaMean = calculateHistMean(hth, 0., 90.);
            if (hph->Integral() < 4){
                phiMean = 0.;
                thetaMean = 0.;
            }

    		fhXYPhiMean->SetBinContent(i+1, j+1, phiMean);
    		fhXYThetaMean->SetBinContent(i+1, j+1, thetaMean);
    		fhXYPhiRms->SetBinContent(i+1, j+1, hph->GetRMS());
    		fhXYThetaRms->SetBinContent(i+1, j+1, hth->GetRMS());
    	}
    }

    TArrayD linDataPhi;
    TArrayD linDataTheta;
    HHistConverter::fillArray(fhXYPhiMean, linDataPhi, "fArrayPhiMean", 10, 10, kFALSE);
    HHistConverter::fillArray(fhXYThetaMean, linDataTheta, "fArrayThetaMean", 10, 10, kFALSE);

    //ofstream fout;
    //fout.open(fOutputPhiThetaXYFilePath.c_str());
    HHistConverter::writeArray(ss, "fArrayPhiMean", linDataPhi, 10);
    HHistConverter::writeArray(ss, "fArrayThetaMean", linDataTheta, 10);
    //fout.close();
    return ss.str();
}

void HRich700DigiParCreator::fillInterpolatedHist()
{
    // plot interoiolated hists from PMT x,y theta,phi (low RES!)
    for(Int_t i = 0; i < 200; i++){
    	for(Int_t j = 0; j < 200; j++){
    	    Float_t x = fhXYCounter->GetXaxis()->GetBinCenter(i+1);
    	    Float_t y = fhXYCounter->GetYaxis()->GetBinCenter(j+1);
    	    Float_t phi,theta;
    	    if(fDigiPar->getInterpolatedThetaPhiPMT(x, y, theta, phi)){
                fhXYPhiInterpolation->SetBinContent(i+1, j+1, phi) ;
                fhXYThetaInterpolation->SetBinContent(i+1, j+1, theta) ;
    	    }
    	}
    }
}

void HRich700DigiParCreator::writeHist()
{
    TFile* out = new TFile(fOutputHistFilePath.c_str(), "RECREATE");
    out->cd();

    fhXYIndCounter->SetOption("colz");
    fhXYIndPhiMean->SetOption("colz");
    fhXYIndThetaMean->SetOption("colz");
    fhXYIndPhiRms->SetOption("colz");
    fhXYIndThetaRms->SetOption("colz");

    fhXYPhiInterpolation->SetOption("colz");
    fhXYThetaInterpolation->SetOption("colz");

    fhXYCounter->SetOption("colz");
    fhXYPhiMean->SetOption("colz");
    fhXYThetaMean->SetOption("colz");
    fhXYPhiRms->SetOption("colz");
    fhXYThetaRms->SetOption("colz");

    fhXYIndCounter->Write();
    fhXYIndPhiMean->Write();
    fhXYIndThetaMean->Write();
    fhXYIndPhiRms->Write();
    fhXYIndThetaRms->Write();

    fhXYPhiInterpolation->Write();
    fhXYThetaInterpolation->Write();

    fhXYCounter->Write();
    fhXYPhiMean->Write();
    fhXYThetaMean->Write();
    fhXYPhiRms->Write();
    fhXYThetaRms->Write();

    HTool::changeToDir("phi");
    for(Int_t i = 0; i < knPmt; i++){
        fhPhi[i]->Write();
    }

    out->cd();
    HTool::changeToDir("theta");
    for(Int_t i = 0; i < knPmt;i++){
        fhTheta[i]->Write();
    }

    out->cd();
    HTool::changeToDir("thetaxy");

    for(Int_t i = 0; i < knXY; i++){
        for(Int_t j=0; j < knXY; j++){
            fhThetaXY[i][j]->Write();
        }
    }
    out->cd();

    HTool::changeToDir("phixy");
    for(Int_t i = 0; i < knXY; i++){
        for(Int_t j = 0; j < knXY; j++){
            fhPhiXY[i][j]->Write();
        }
    }
    out->Save();
    out->Write();
}

Bool_t HRich700DigiParCreator::isPrimaryElectron(
					    HGeantKine* kine)
{
    if (kine == NULL) return kFALSE;
    return (kine->getID() == 2 || kine->getID() == 3) && kine->isPrimary();
}


Bool_t HRich700DigiParCreator::finalize()
{
    createOutputFile();
    fillInterpolatedHist();

    writeHist();

    cout << "Output files:" << endl;
    cout << "Par file:" << fOutputFilePath << endl;
    cout << "Histograms:" << fOutputHistFilePath << endl;

    return kTRUE;
}

void HRich700DigiParCreator::drawHist()
{
    {
	fHM->CreateCanvas("hrichdigipar_fhXYCounter", "hrichdigipar_fhXYCounter", 1000, 800);
	HRichDrawHist::DrawH2(fHM->H2("fhXYCounter"));
    }

    {
	TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhXYMean", "hrichdigipar_fhXYMean", 1500, 700);
    c->Divide(2,1);
    c->cd(1);
	HRichDrawHist::DrawH2(fHM->H2("fhXYPhiMean"));
    c->cd(2);
    HRichDrawHist::DrawH2(fHM->H2("fhXYThetaMean"));
    }

    {
    TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhXYRms", "hrichdigipar_fhXYRms", 1500, 700);
    c->Divide(2,1);
    c->cd(1);
    fHM->H2("fhXYPhiRms")->GetZaxis()->SetRangeUser(0., 2.);
    HRichDrawHist::DrawH2(fHM->H2("fhXYPhiRms"));
    c->cd(2);
    fHM->H2("fhXYThetaRms")->GetZaxis()->SetRangeUser(0., 2.);
    HRichDrawHist::DrawH2(fHM->H2("fhXYThetaRms"));
    }

    {
    fHM->CreateCanvas("hrichdigipar_fhXYIndCounter", "hrichdigipar_fhXYIndCounter", 1000, 800);
    HRichDrawHist::DrawH2(fHM->H2("fhXYIndCounter"));
    }

    {
    TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhXYIndMean", "hrichdigipar_fhXYIndMean", 1500, 700);
    c->Divide(2,1);
    c->cd(1);
    HRichDrawHist::DrawH2(fHM->H2("fhXYIndPhiMean"));
    c->cd(2);
    HRichDrawHist::DrawH2(fHM->H2("fhXYIndThetaMean"));
    }

    {
    TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhXYIndRms", "hrichdigipar_fhXYIndRms", 1500, 700);
    c->Divide(2,1);
    c->cd(1);
    HRichDrawHist::DrawH2(fHM->H2("fhXYIndPhiRms"));
    c->cd(2);
    HRichDrawHist::DrawH2(fHM->H2("fhXYIndThetaRms"));
    }

    {
    TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhXYInterpolation", "hrichdigipar_fhXYInterpolation", 1500, 700);
    c->Divide(2,1);
    c->cd(1);
    HRichDrawHist::DrawH2(fHM->H2("fhXYPhiInterpolation"));
    c->cd(2);
    HRichDrawHist::DrawH2(fHM->H2("fhXYThetaInterpolation"));
    }


    {
    TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhPhi_fhTheta", "hrichdigipar_fhPhi_fhTheta", 1500, 700);
    c->Divide(3,2);
    c->cd(1);
    HRichDrawHist::DrawH1(fHM->H1("fhPhi[183]"));
    c->cd(2);
    HRichDrawHist::DrawH1(fHM->H1("fhPhi[125]"));
    c->cd(3);
    HRichDrawHist::DrawH1(fHM->H1("fhPhi[350]"));

    c->cd(4);
    HRichDrawHist::DrawH1(fHM->H1("fhTheta[200]"));
    c->cd(5);
    HRichDrawHist::DrawH1(fHM->H1("fhTheta[400]"));
    c->cd(6);
    HRichDrawHist::DrawH1(fHM->H1("fhTheta[500]"));
    }

    {
    TCanvas* c = fHM->CreateCanvas("hrichdigipar_fhPhiXY_fhThetaXY", "hrichdigipar_fhPhiXY_fhThetaXY", 1500, 700);
    c->Divide(3,2);
    c->cd(1);
    HRichDrawHist::DrawH1(fHM->H1("fhPhiXY[183][100]"));
    c->cd(2);
    HRichDrawHist::DrawH1(fHM->H1("fhPhiXY[125][200]"));
    c->cd(3);
    HRichDrawHist::DrawH1(fHM->H1("fhPhiXY[50][50]"));

    c->cd(4);
    HRichDrawHist::DrawH1(fHM->H1("fhThetaXY[200][77]"));
    c->cd(5);
    HRichDrawHist::DrawH1(fHM->H1("fhThetaXY[156][99]"));
    c->cd(6);
    HRichDrawHist::DrawH1(fHM->H1("fhThetaXY[69][70]"));
    }

}

void HRich700DigiParCreator::drawFromFile( const string& fileName, const string& outputDir)
{
    HRichDrawHist::SetDefaultDrawStyle();
    gStyle->SetOptTitle(1);
    //if (fHM != NULL) delete fHM;

    fHM = new HRich700HistManager();
    TFile* file = new TFile(fileName.c_str());
    fHM->ReadFromFile(file);

    drawHist();

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