ROOT logo
#include "hmdcrichcorr.h"
#include "hades.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hrichhit.h"
#include "richdef.h"
#include "hmdctrackddef.h"
#include "hmdclookuptb.h"
#include "hmdcclus.h"
#include "hevent.h"
#include "hmdcgetcontainers.h"
#include "hmdccalibrater1.h"
#include "hmdclistcells.h"
#include "hmdctrackdset.h"
#include "TH1.h"
#include "TF1.h"
#include "TMath.h"
#include "TROOT.h"
#include "TCanvas.h"
#include "TLine.h"
#include "TStyle.h"

//*-- AUTHOR : Pechenov Vladimir
//*-- Modified : 25/03/2003 by V. Pechenov

ClassImp(HMdcRichCorr)
ClassImp(HMdcDGaus)

HMdcRichCorr::HMdcRichCorr(void) : HReconstructor() {
  nRingsCut=1;
  setup();
}

HMdcRichCorr::HMdcRichCorr(const Text_t *name,const Text_t *title,Int_t nRCut) :
    HReconstructor(name,title) {
  nRingsCut=nRCut;
  setup();
}

void HMdcRichCorr::setup(void) {
  radToDeg     = 180./acos(-1.);
  clFinderType = 1; // chamber clusters

  pListCells   = 0;
  fLookUpTb    = 0;
  level4       = 10;
  level5       = 50;
  for(Int_t sec=0; sec<6; sec++)
      for(Int_t mod=0; mod<4; mod++) nLayers[sec][mod]=6;
  isInitialised=kFALSE;

  fClusCat=0;
  fCalib1=0;
  for(Int_t s=0;s<6;s++) {
    dThCuts[s][0][0]=dThCuts[s][1][0]=-5.;
    dThCuts[s][0][1]=dThCuts[s][1][1]=5.;
    dPhCuts[s][0][0]=dPhCuts[s][1][0]=-3.;
    dPhCuts[s][0][1]=dPhCuts[s][1][1]=3.;
    hDTh[s][0]=hDTh[s][1]=0;
    hDPh[s][0]=hDPh[s][1]=0;
  }
  numSigPh=numSigTh=3.;
  hDThAll[0]=hDThAll[1]=0;
  hDPhAll[0]=hDPhAll[1]=0;
  hNRings=hNMRings=hNEvents=0;
  
  setHistFile(".","fhs_","NEW");
  saveHist=saveCanv=savePSFile=kTRUE;
}

HMdcRichCorr::~HMdcRichCorr() {
  HMdcEvntListCells::deleteCont();
  HMdcLookUpTb::deleteCont();
  if(fCalib1) delete fCalib1;  
}

void HMdcRichCorr::makeCalibrater1(Int_t vers,Int_t cut,Int_t domerge) {
  fCalib1=new HMdcCalibrater1("MdcCali1","MdcCali1",vers,cut,domerge);
}

Bool_t HMdcRichCorr::init(void) {
  nEvents          = 0;
  nRingEvents      = 0;
  nMatchedEvents   = 0;
  nMatchedEvents1R = 0;
  if(fCalib1 && !fCalib1->init()) return kFALSE;
  HMdcGetContainers* fGetCont = HMdcGetContainers::getObject();
  
  if(pListCells == 0)  pListCells = HMdcEvntListCells::getObject(isMdcLCellsOwn);

  fClusCat = fGetCont->getCatMdcClus(kTRUE);
  if(!fClusCat) return kFALSE;
  iterMdcClus=(HIterator *)fClusCat->MakeIterator("native");

  fRichHitCat = gHades->getCurrentEvent()->getCategory(catRichHit);
  if(!fRichHitCat) return kFALSE;
  if(fRichHitCat) iterRichHit=(HIterator *)fRichHitCat->MakeIterator("native");

  fLookUpTb=HMdcLookUpTb::getObject();
  HMdcTrackDSet::setProjectPlotSizeSeg1(160,444);//!!!!!!!!!!!!319! ???
  fLookUpTb->setIsCoilOffFlag(kFALSE);
  return kTRUE;
}

Bool_t HMdcRichCorr::reinit(void) {
  if(fCalib1) if(!fCalib1->reinit()) return kFALSE;
  return reinitMdcFinder();
}

Bool_t HMdcRichCorr::reinitMdcFinder(void) {
  if(!fLookUpTb->initContainer()) return kFALSE;
  printStatus();
  if( !isInitialised ) {
    for(Int_t sec=0; sec<6; sec++) if(&((*fLookUpTb)[sec]))
      (*fLookUpTb)[sec].setTypeClFinder(clFinderType);
    for(Int_t sec=0; sec<6; sec++) {
      HMdcLookUpTbSec* fLookUpTbSec=&((*fLookUpTb)[sec]);
      if(!fLookUpTbSec) continue;
      for(Int_t mod=0; mod<2; mod++) {
        HMdcLookUpTbMod* fLookUpTbMod=&((*fLookUpTbSec)[mod]);
        if( !fLookUpTbMod ) nLayers[sec][mod]=0;
      }
    }
    isInitialised=kTRUE;
  }
  makeHist();
  return kTRUE;
}

void HMdcRichCorr::makeHist(void) {
  Char_t buf[100];
  if(hDPhAll[0]==0) {
    hDThAll[0]=new TH1F("dThetaM1","dTheta M1",100,-20.,20.);
    hDPhAll[0]=new TH1F("dPhiM1","dPhi M1",100,-20.,20.);
    hDThAll[1]=new TH1F("dThetaM2","dTheta M2",100,-20.,20.);
    hDPhAll[1]=new TH1F("dPhiM2","dPhi M2",100,-20.,20.);
  } else {
    hDThAll[0]->Reset();
    hDPhAll[0]->Reset();
    hDThAll[1]->Reset();
    hDPhAll[1]->Reset();
  }
  for(Int_t sec=0; sec<6; sec++) for(Int_t mod=0; mod<2; mod++) {
    if(hDTh[sec][mod]==0) {
      sprintf(buf,"dThetaS%iM%i",sec+1,mod+1);
      hDTh[sec][mod]=new TH1F(buf,"",100,-20.,20.);
      sprintf(buf,"dPhiS%iM%i",sec+1,mod+1);
      hDPh[sec][mod]=new TH1F(buf,"",100,-20.,20.);
    } else {
      hDTh[sec][mod]->Reset();
      hDPh[sec][mod]->Reset();
    }
    sprintf(buf,"dTheta: S%i M%i; Cut: %.2f +/- %g*%.2f",
        sec+1,mod+1,meanDTh(sec,mod),numSigTh,sigmaDTh(sec,mod));
    hDTh[sec][mod]->SetTitle(buf);
    sprintf(buf,"dPhi: S%i M%i; cut: %.2f +/- %g*%.2f",
        sec+1,mod+1,meanDPh(sec,mod),numSigPh,sigmaDPh(sec,mod));
    hDPh[sec][mod]->SetTitle(buf);
  }
  if(hNRings==0) {
    hNRings=new TH1F("hRings","<Num. of rings/event>",250,0.,500000.);
    hNMRings=new TH1F("hMRings","<Num. of matched rings/event>",250,0.,500000.);
    hNEvents=new TH1F("nEvents","Num of events",250,0.,500000.);
#if ROOT_VERSION_CODE  > ROOT_VERSION(6,0,0)
    hNRings->SetCanExtend(TH1::kAllAxes);
    hNMRings->SetCanExtend(TH1::kAllAxes);
    hNEvents->SetCanExtend(TH1::kAllAxes);
#else
    hNRings->SetBit(TH1::kCanRebin);
    hNMRings->SetBit(TH1::kCanRebin);
    hNEvents->SetBit(TH1::kCanRebin);
#endif
  } else {
    hNRings->Reset();
    hNMRings->Reset();
    hNEvents->Reset();
    hNRings->SetBins(500,0.,500000.);
    hNMRings->SetBins(500,0.,500000.);
    hNEvents->SetBins(500,0.,500000.);
  }
}

void HMdcRichCorr::setNLayers(const Int_t *lst) {
  Int_t* nLay=nLayers[0];
  for(Int_t i=0;i<6*4;i++) nLay[i]=lst[i];
}

void HMdcRichCorr::setDThetaCuts(Float_t dTh1, Float_t dTh2, Float_t nSig) {
  // Set the same cuts for all mdc modules, (dTh1<dTh2 !)
  numSigTh=nSig;
  for(Int_t s=0;s<6;s++) {
    dThCuts[s][0][0]=dThCuts[s][1][0]=dTh1;
    dThCuts[s][0][1]=dThCuts[s][1][1]=dTh2;
  }
}

void HMdcRichCorr::setDPhiCuts(Float_t dPh1, Float_t dPh2, Float_t nSig) {
  // set the same cuts for all mdc modules, (dPh1<dPh2 !)
  numSigPh=nSig;
  for(Int_t s=0;s<6;s++) {
    dPhCuts[s][0][0]=dPhCuts[s][1][0]=dPh1;
    dPhCuts[s][0][1]=dPhCuts[s][1][1]=dPh2;
  }
}

void HMdcRichCorr::setDThetaCuts(const Float_t* dTh, Float_t nSig) {
  // dTheta cuts seting
  numSigTh=nSig;
  Float_t* dThAr=dThCuts[0][0];
  for(Int_t i=0;i<6*2*2;i++) dThAr[i]=dTh[i];
}

void HMdcRichCorr::setDPhiCuts(const Float_t* dPh, Float_t nSig) {
  // dPhi cuts seting
  numSigPh=nSig;
  Float_t* dPhAr=dPhCuts[0][0];
  for(Int_t i=0;i<6*2*2;i++) dPhAr[i]=dPh[i];
}

void HMdcRichCorr::setDThetaCutsSig(Float_t mDTh,Float_t sDTh,Float_t nSig) {
  // Set the same cuts for all mdc modules. 
  // Cut: mDTh-nSig*sDTh < dTheta < mDTh+nSig*sDTh
  numSigTh=nSig;
  for(Int_t s=0;s<6;s++) {
    dThCuts[s][0][0]=dThCuts[s][1][0]=mDTh-nSig*sDTh;
    dThCuts[s][0][1]=dThCuts[s][1][1]=mDTh+nSig*sDTh;
  }
}

void HMdcRichCorr::setDPhiCutsSig(Float_t mDPh,Float_t sDPh,Float_t nSig) {
  // set the same cuts for all mdc modules, (dPh1<dPh2 !)
  // Cut: mDPh-nSig*sDPh < dPhi < mDPh+nSig*sDPh
  numSigPh=nSig;
  for(Int_t s=0;s<6;s++) {
    dPhCuts[s][0][0]=dPhCuts[s][1][0]=mDPh-nSig*sDPh;
    dPhCuts[s][0][1]=dPhCuts[s][1][1]=mDPh+nSig*sDPh;
  }
}

void HMdcRichCorr::setDThetaCuts(const Float_t* mDTh, const Float_t* sDTh, 
    Float_t nSig) {
  // dTheta cuts seting
  numSigTh=nSig;
  for(Int_t s=0;s<6;s++) for(Int_t m=0;m<2;m++) {
    Int_t i=s*2+m;
    dThCuts[s][m][0]=mDTh[i]-nSig*sDTh[i];
    dThCuts[s][m][1]=mDTh[i]+nSig*sDTh[i];
  }
}

void HMdcRichCorr::setDPhiCuts(const Float_t* mDPh, const Float_t* sDPh, 
    Float_t nSig) {
  // dPheta cuts seting
  numSigPh=nSig;
  for(Int_t s=0;s<6;s++) for(Int_t m=0;m<2;m++) {
    Int_t i=s*2+m;
    dPhCuts[s][m][0]=mDPh[i]-nSig*sDPh[i];
    dPhCuts[s][m][1]=mDPh[i]+nSig*sDPh[i];
  }
}

Int_t HMdcRichCorr::execute(void) {
  if(nEvents==0) {
    HMdcGetContainers::getFileNameWInd(fileName);
    HMdcGetContainers::getFileName(flNmWoExt);
    HMdcGetContainers::getRunId(runId);
    HMdcGetContainers::getEventDate(eventDate);
    HMdcGetContainers::getEventTime(eventTime);
  }
  nEvents++;
  hNEvents->Fill(nEvents-0.5);
  iterRichHit->Reset();
  for(Int_t s=0;s<6;s++) nRichHits[s]=0;
  fillListByRichHit();
  Int_t nRings=nRichHits[0]+nRichHits[1]+nRichHits[2]+nRichHits[3]+
      nRichHits[4]+nRichHits[5];
  if(nRings==0) return kSkipEvent;
  hNRings->Fill(nEvents-0.5,(Float_t)nRings);
  
  nRingEvents++;

  if(fCalib1) fCalib1->execute();
  if(isMdcLCellsOwn) {
    pListCells->clear();
    Int_t nFiredWires = pListCells->collectWires();
    if(nFiredWires<3) return kSkipEvent;
  }
  findMdcClusters();

  iterMdcClus->Reset();
  HMdcClus* pMdcClus;
  Int_t nMatchedRings=0;
  while( (pMdcClus=(HMdcClus*)iterMdcClus->Next()) !=0) {
    if(pMdcClus->getIOSeg()!=0) continue;
    Int_t sec=pMdcClus->getSec();
    Float_t mdcTheta=pMdcClus->getTheta()*radToDeg;
    Float_t mdcPhi=pMdcClus->getPhi()*radToDeg+sec*60.;
    if(mdcPhi>360.) mdcPhi-=360.;
    Int_t mod=pMdcClus->getMod();
    if(mod<0) mod=1;
    for(Int_t r=0;r<nRichHits[sec];r++) {
      Float_t dPh=richPhi[sec][r]-mdcPhi;
      Float_t dTh=richTheta[sec][r]-mdcTheta;
      Bool_t dPhCond = dPh>=dPhCuts[sec][mod][0] && dPh<=dPhCuts[sec][mod][1];
      Bool_t dThCond = dTh>=dThCuts[sec][mod][0] && dTh<=dThCuts[sec][mod][1];
      if(dPhCond) hDTh[sec][mod]->Fill(dTh);
      if(dThCond) hDPh[sec][mod]->Fill(dPh);
      if(!dPhCond || !dThCond) continue;
      nMdcHitRing[sec][r]++;
      if(nMdcHitRing[sec][r]==1) nMatchedRings++;
    }
  }

  if(nMatchedRings) hNMRings->Fill(nEvents-0.5,(Float_t)nMatchedRings);
  if(nMatchedRings<nRingsCut) return kSkipEvent;
  nMatchedEvents++;
  if(nMatchedRings==1) nMatchedEvents1R++;

  return 0;
}

void HMdcRichCorr::fillListByRichHit(void) {
  HRichHit* pRichHit;
  while( (pRichHit=(HRichHit*)iterRichHit->Next()) !=0) {
    Int_t sec=pRichHit->getSector();
    Int_t& nHits=nRichHits[sec];
    if(nHits>=400) continue;
//     if(pRichHit->getRingPatMat()<=250 &&
//        pRichHit->getRingHouTra()<=28) continue;
    richTheta[sec][nHits]=pRichHit->getTheta();
    richPhi[sec][nHits]=pRichHit->getPhi();
    nMdcHitRing[sec][nHits]=0;
    nHits++;
  }
}

void HMdcRichCorr::findMdcClusters(void) {
  // Fired wires collecting:
  (*fLookUpTb).clear();

  // Cluster finder levels determination:
  Int_t minLevel[6][4];
  for(Int_t sec=0; sec<6; sec++) {
    if(nRichHits[sec]==0) continue;
    Int_t* minlv=minLevel[sec];
    minlv[2]=minlv[3]=0;
    for(Int_t mod=0; mod<2; mod++) {
      minlv[mod]=nLayers[sec][mod];
      if( minlv[mod]>0 ) {
        Int_t occup=((*pListCells)[sec][mod].getNCells()*6)/minlv[mod];
        if( occup <= level5 ) minlv[mod]--;
        if( occup <= level4 ) minlv[mod]--;
        if( occup < 3 ) minlv[mod]=3;
      }
    }
  }

  // Track finder:
  for(Int_t sec=0; sec<6; sec++) {
    nMdcHits[sec]=0;
    if(nRichHits[sec]==0 || &(*fLookUpTb)[sec]==0 ) continue;
    nMdcHits[sec]=(*fLookUpTb)[sec].findClusters(minLevel[sec]);
  }
}

Bool_t HMdcRichCorr::finalize(void) {
  for(Int_t sec=0; sec<6; sec++) for(Int_t mod=0; mod<2; mod++) {
    if(hDThAll[mod] && hDTh[sec][mod]) hDThAll[mod]->Add(hDTh[sec][mod]);
    if(hDPhAll[mod] && hDPh[sec][mod]) hDPhAll[mod]->Add(hDPh[sec][mod]);
  }
  
  Float_t meanDThN[6][2];
  Float_t sigmaDThN[6][2];
  Float_t meanDPhN[6][2];
  Float_t sigmaDPhN[6][2];
  
  gROOT->SetBatch();
  gStyle->SetOptFit(111);
  Bool_t fitFlag=kTRUE;
  TCanvas cDThDPhPlane("cDThDPhPlane","dTheta, dPhi plane",650,900);
  cDThDPhPlane.Divide(2,2);
  TCanvas cDThMod("cDThMod","dTheta",650,900);
  cDThMod.Divide(2,6);
  TCanvas cDPhMod("cDPhMod","dPhi",650,900);
  cDPhMod.Divide(2,6);
  TCanvas cNRings("cNRings","<Num. rings>",650,900);
  cNRings.Divide(1,2);
  TLine* ln=new TLine();
  // Fit:
  calcAvMnSg();
  for(Int_t m=0; m<2; m++) {
    Float_t mnN,sgN;
    cDThDPhPlane.cd(m*2+1);
    if(hDThAll[m]) funDGaus.histFit(hDThAll[m],planeMeanDTh[m],planeSigmaDTh[m],
      mnN,sgN,kFALSE);
    cDThDPhPlane.cd(m*2+2);
    if(hDPhAll[m]) funDGaus.histFit(hDPhAll[m],planeMeanDPh[m],planeSigmaDPh[m],
      mnN,sgN,kFALSE);
  }
  cDThDPhPlane.Update();
  for(Int_t s=0; s<6; s++) for(Int_t m=0; m<2; m++) {
    cDThMod.cd(s*2+m+1);
    if(hDTh[s][m]) {
      Float_t mean=meanDTh(s,m);
      Float_t sigma=sigmaDTh(s,m);
      fitStatDTh[s][m]=funDGaus.histFit(hDTh[s][m],
          mean,sigma,meanDThN[s][m],sigmaDThN[s][m]);
      if(fitStatDTh[s][m]!=0) fitFlag=kFALSE; 
      drawCut(ln,mean,sigma,numSigTh,4,hDTh[s][m]->GetMaximum()/2.);
      drawCut(ln,meanDThN[s][m],sigmaDThN[s][m],numSigTh,
          3-fitStatDTh[s][m], hDTh[s][m]->GetMaximum()/2.);
    } else fitStatDTh[s][m]=-1;
    cDPhMod.cd(s*2+m+1);
    if(hDPh[s][m]) {
      Float_t mean=meanDPh(s,m);
      Float_t sigma=sigmaDPh(s,m);
      fitStatDPh[s][m]=funDGaus.histFit(hDPh[s][m],
          mean,sigma,meanDPhN[s][m],sigmaDPhN[s][m]);
      if(fitStatDPh[s][m]!=0) fitFlag=kFALSE;
      drawCut(ln,mean,sigma,numSigPh,4,hDPh[s][m]->GetMaximum()/2.);
      drawCut(ln,meanDPhN[s][m],sigmaDPhN[s][m],numSigPh,
          3-fitStatDPh[s][m], hDPh[s][m]->GetMaximum()/2.);
    } else fitStatDPh[s][m]=-1;
  }
  cDThMod.Update();
  cDPhMod.Update();
  for(Int_t bin=0;bin<hNEvents->GetNbinsX();bin++) {
    Stat_t norm=hNEvents->GetBinContent(bin+1);
    if(norm==0.) break; 
    Stat_t nrn=hNRings->GetBinContent(bin+1);
    Stat_t nmrn=hNMRings->GetBinContent(bin+1);
    hNRings->SetBinContent(bin+1,nrn/norm);
    hNMRings->SetBinContent(bin+1,nmrn/norm);
    hNRings->SetBinError(bin+1,sqrt(nrn)/norm);
    hNMRings->SetBinError(bin+1,sqrt(nmrn)/norm);
  }
  cNRings.cd(1);
  hNRings->Draw();
  cNRings.cd(2);
  hNMRings->Draw();
  cNRings.Update();
  
  // Writing hist. to file:
  const Char_t* flag=(fitFlag) ? "":"x_";
  TFile* file=0;
  if(saveHist || saveCanv) file=openHistFile(flag);
  if(file) {
    if(saveHist) {
      if(hDThAll[0]) hDThAll[0]->Write();
      if(hDThAll[1]) hDThAll[1]->Write();
      if(hDPhAll[0]) hDPhAll[0]->Write();
      if(hDPhAll[1]) hDPhAll[1]->Write();
      for(Int_t sec=0; sec<6; sec++) for(Int_t mod=0; mod<2; mod++) {
        if(hDTh[sec][mod]) hDTh[sec][mod]->Write();
        if(hDPh[sec][mod]) hDPh[sec][mod]->Write();
      }
      hNEvents->Write();
      hNRings->Write();
      hNMRings->Write();
    }
    if(saveCanv) {
      cDThDPhPlane.Write();
      cDThMod.Write();
      cDPhMod.Write();
      cNRings.Write();
    }
    
    file->Close();
    delete file;
  }
  
  // ps-file:
  if(savePSFile) {
    TString tPsFile=psFile+"(";
    cNRings.Print(tPsFile.Data());
    cDThDPhPlane.Print(psFile.Data());
    cDThMod.Print(psFile.Data());
    tPsFile=psFile+")";
    cDPhMod.Print(tPsFile.Data());
  }

  delete ln;
  gROOT->SetBatch(kFALSE);
    
  printf("\n\n********** Events filtering *********************************\n");
  printf("* FileName      : %s\n* RunId         : %s\n* Run start time: %s %s\n",
      fileName.Data(),runId.Data(),eventTime.Data(),eventDate.Data());
  printf("* Hist.file     : %s\n",histFile.Data());
  printf("*------------------------------------------------------------\n");
  printf("* Total number of real events processed  : %8i\n",nEvents);
  if(nEvents>0) {
    printf("* Number of events with rings            : %8i (%6.2f%c)\n",
        nRingEvents,Float_t(nRingEvents)/Float_t(nEvents)*100.,'%');
    printf("* Number of matched events               : %8i (%6.2f%c)\n",
        nMatchedEvents,Float_t(nMatchedEvents)/Float_t(nEvents)*100.,'%');
    printf("* Number of events with >=2 matched rings: %8i (%6.2f%c)\n",
        nMatchedEvents-nMatchedEvents1R,
        Float_t(nMatchedEvents-nMatchedEvents1R)/Float_t(nEvents)*100.,'%');
  }
  printf("*------------------------------------------------------------\n");
  printf("  Float_t meanDTh[6][2]={\n");
  for(Int_t s=0; s<6; s++) {
    printf("    {%5.2f, %5.2f},  // Sec.%i Mdc1 Mdc2| Shift: %+5.2f, %+5.2f\n",
        meanDThN[s][0],meanDThN[s][1],s,meanDThN[s][0]-meanDTh(s,0),
        meanDThN[s][1]-meanDTh(s,1));
  }
  printf("  };\n");
  printf("  Float_t sigmaDTh[6][2]={\n");
  for(Int_t s=0; s<6; s++) {
    printf("    {%5.2f, %5.2f},  // Sec.%i Mdc1 Mdc2 | Shift: %+5.2f, %+5.2f\n",
        sigmaDThN[s][0],sigmaDThN[s][1],s,sigmaDThN[s][0]-sigmaDTh(s,0),
        sigmaDThN[s][1]-sigmaDTh(s,1));
  }
  printf("  };\n");
  printf("  Float_t meanDPh[6][2]={\n");
  for(Int_t s=0; s<6; s++) {
    printf("    {%5.2f, %5.2f},  // Sec.%i Mdc1 Mdc2 | Shift: %+5.2f, %+5.2f\n",
        meanDPhN[s][0],meanDPhN[s][1],s,meanDPhN[s][0]-meanDPh(s,0),
        meanDPhN[s][1]-meanDPh(s,1));
  }
  printf("  };\n");
  printf("  Float_t sigmaDPh[6][2]={\n");
  for(Int_t s=0; s<6; s++) {
    printf("    {%5.2f, %5.2f},  // Sec.%i Mdc1 Mdc2 | Shift: %+5.2f, %+5.2f\n",
        sigmaDPhN[s][0],sigmaDPhN[s][1],s,sigmaDPhN[s][0]-sigmaDPh(s,0),
        sigmaDPhN[s][1]-sigmaDPh(s,1));
  }
  printf("  };\n");
  printf("*************************************************************\n\n");

  if(fCalib1) if(!fCalib1->finalize()) return kFALSE;
  return kTRUE;
}

void HMdcRichCorr::calcAvMnSg(void) {
  for(Int_t m=0;m<2;m++) {
    planeMeanDTh[m]=0;
    planeSigmaDTh[m]=0;
    planeMeanDPh[m]=0;
    planeSigmaDPh[m]=0;
    Float_t nm=0.;
    for(Int_t s=0;s<2;s++) {
      if(dThCuts[s][m][1]-dThCuts[s][m][0]<=0. || 
          dPhCuts[s][m][1]-dPhCuts[s][m][0]<=0.) continue;
      planeMeanDTh[m]+=meanDTh(s,m);
      planeSigmaDTh[m]+=sigmaDTh(s,m);
      planeMeanDPh[m]+=meanDPh(s,m);
      planeSigmaDPh[m]+=sigmaDPh(s,m);
      nm++;
    }
    if(nm>0.) {
      planeMeanDTh[m]/=nm;
      planeSigmaDTh[m]/=nm;
      planeMeanDPh[m]/=nm;
      planeSigmaDPh[m]/=nm;
    }
  }
}

TFile* HMdcRichCorr::openHistFile(const Char_t* flag) {
  histFile=histFileDir+flag+histFileSuffix+flNmWoExt+".root";
  TFile* file=new TFile(histFile.Data(),histFileOption.Data());
  if(file==0 || file->IsOpen()) {
    psFile=histFileDir+flag+histFileSuffix+flNmWoExt+".ps";
    return file;
  }
  printf("File %s already exists!\n",histFile.Data());
  const Char_t* ind="123456789";
  for(Int_t i=0;i<9;i++){
    delete file;
    histFile=histFileDir+flag+histFileSuffix+flNmWoExt+"_"+ind[i]+".root";
    file=new TFile(histFile.Data(),histFileOption.Data());
    if(file==0 || file->IsOpen()) {
      psFile=histFileDir+flag+histFileSuffix+flNmWoExt+"_"+ind[i]+".ps";
      return file;
    }
  }
  Error("openHistFile","Can not open histograms file!");
  delete file;
  return 0;
}

void HMdcRichCorr::setHistFile(const Char_t* dir,const Char_t* suf, const Char_t* option)
{
    TString tmp = dir;
    if(tmp.Length()>0) {
	histFileDir=dir;
	if(histFileDir.Length()>0 && histFileDir(histFileDir.Length()-1)!='/')
	    histFileDir+='/';
    }
    tmp = suf;

  if(tmp.Length()>0) histFileSuffix=suf;
  tmp=option;
  if(tmp.Length()>0) histFileOption=option;
}

void HMdcRichCorr::printStatus(void) const{
  // prints the parameters to the screen
  const Char_t* hType ="0 = comb.chamb.clust., 1 = single chamb.clust., 2 = 0+1";
  const Char_t* hLevS1="max. occupancy of MDC for cl.find. level 4 & 5 layers";
  const Int_t* l=nLayers[0];
  printf("\n\n-----------------------------------------------------------------\n");
   printf("HMdcRichCorr setup:\n");
  printf("Using rings param. from HRichHit container for matching to MDC.\n");
  printf("Filtering of events with >=%i matched to mdc rings.\n",nRingsCut);
  
  printf("Matching cuts:\n");
  printf("  abs(dTheta-meanDTheta)<%3.1f*sigmaDTheta  (dTheta=thetaRich-thetaMdc)\n",
      numSigTh);
  printf("  abs(dPhi  -meanDPhi  )<%3.1f*sigmaDPhi    (dPhi  =phiRich  -phiMdc  )\n",
      numSigPh);
  printf("               dTheta:  mean  sigma    dPhi:  mean  sigma\n");
  for(Int_t s=0;s<6;s++) for(Int_t m=0;m<2;m++) {
    printf("  %i sec. %i mdc:       %6.2f %6.2f         %6.2f %6.2f\n",s+1,m+1,
        (dThCuts[s][m][0]+dThCuts[s][m][1])/2.,
        (dThCuts[s][m][1]-dThCuts[s][m][0])/(2.*numSigTh),
        (dPhCuts[s][m][0]+dPhCuts[s][m][1])/2.,
        (dPhCuts[s][m][1]-dPhCuts[s][m][0])/(2.*numSigPh));
  }
  printf("-----------------------------------------------------------------\n");
  printf("HMdcTrackFinderSetup:\n");
  printf("ClustFinderType = %i :  %s\n",clFinderType,hType);
  printf("LevelsSegment1  = %i,%i  : %s\n",level4,level5,hLevS1);
  printf("NumLayersPerMod = {{%i,%i,,},\n",l[ 0],l[ 1]);
  printf("                   {%i,%i,,},\n",l[ 4],l[ 5]);
  printf("                   {%i,%i,,},\n",l[ 8],l[ 9]);
  printf("                   {%i,%i,,},\n",l[12],l[13]);
  printf("                   {%i,%i,,},\n",l[16],l[17]);
  printf("                   {%i,%i,,}}\n",l[20],l[21]);
  printf("-----------------------------------------------------------------\n");
}

void HMdcRichCorr::drawCut(TLine* ln,Float_t mean,Float_t sigma,Float_t nSig,
    Int_t color, Double_t y) {
  ln->SetLineColor(color);
  ln->DrawLine(mean-sigma*nSig,0.,mean-sigma*nSig,y);
  ln->DrawLine(mean+sigma*nSig,0.,mean+sigma*nSig,y);
}

HMdcDGaus::HMdcDGaus(void) : TF1("dgaus",dgaus,-10.,10.,(Int_t)6) {
  condMean=0.3;
  condSig1=0.3;
  condSig2=0.5;
}

HMdcDGaus::HMdcDGaus(const Char_t* name, Double_t xmin, Double_t xmax) : 
    TF1(name,dgaus,xmin,xmax,(Int_t)6) {
  condMean=0.3;
  condSig1=0.3;
  condSig2=0.5;
}

Int_t HMdcDGaus::histFit(TH1F* hst,Float_t oMean,Float_t oSig,
    Float_t& nMean,Float_t& nSig, Bool_t doTest) {
  if(hst==0) return kFALSE;
  Double_t mean=oMean;
  Double_t hMax=hst->GetMaximum();
  SetParameters(hMax*0.9,oMean,oSig,hMax*0.1,0.,20.);
  //  SetParLimits(0,0.,1.0e+8);
  SetParLimits(1,-oSig*7,oSig*7);
  SetParLimits(2,oSig/2.,oSig*2);  // limit: 0.5*sig - 2*sig
  //  SetParLimits(3,0.,1.0e+8);
  //  SetParLimits(4,-1.0e+3,1.0e+3);
  //  SetParLimits(5,5.,1.0e+3);    
  Int_t fitStatus=hst->Fit(this,"WQ","");
  if(fitStatus!=0) fitStatus=2;
  nMean=GetParameter(1);
  for(Int_t i=0;i<5 && fitStatus!=0;i++) {
    if(fabs(nMean-mean)>oSig) {  // shift of mean <= one sigma
      if(nMean<mean) mean-=oSig;
      else mean+=oSig;
    } else mean=nMean;
    SetParameters(hMax*0.9,mean,oSig,hMax*0.1,0.,15.);
    SetParLimits(2,oSig/2.,oSig*3);  // limit: 0.5*sig - 3*sig
    fitStatus=hst->Fit(this,"WQ","");
    nMean=GetParameter(1);
  }
  nSig=GetParameter(2);
  if(doTest && fitStatus==0 && (nSig-oSig>oSig*condSig1 || 
      oSig-nSig>oSig*condSig2 || fabs(nMean-oMean)>oSig*condMean)) fitStatus=1;
  TF1* fngh=hst->GetFunction("dgaus");
  fngh->SetLineWidth((Width_t)2.);
  fngh->SetLineColor(3-fitStatus);
  
  return fitStatus;
}

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