ROOT logo
//*-- Author : H.Agakichiev & V.Pechenov
//*-- Modified : 30.06.2004 by V.Pechenov

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////
// HMdcTrackFinder
//
// The program for candidates to tracks finding.
//
// Using:
// Put in task list task:
// HMdcTrackFinder* trackFinder;
//
//////////////////////////////////////////////////////////////////////

#include "hmdcalignerd.h"
#include "hmdcalignerparam.h"

#include "hiterator.h"
#include "hmdclookuptb.h"
#include "hmdctrackfittera.h"
#include "hmdctrackfitterb.h"
#include "hmdccal1sim.h"
#include "hcategory.h"
#include "hmdctrackdset.h"
#include "hmdcclussim.h"
#include "hmdcsizescells.h"
#include "hmdctrackfitter.h"
#include "hmdclistcells.h"
#include "hmdcminimize.h"
#include "hgeomvertexfit.h"
#include "hgeomvector.h"
#include "TH2.h"
#include "TCanvas.h"
#include "TFile.h"
#include "TNtuple.h"

Double_t clusterFunctional(TObject *obj,Int_t& nPar, Double_t* par);
Double_t alignmentFunctional(TObject *obj,Int_t& nPar, Double_t* par);
Double_t directionFunctional(TObject *obj,Int_t& nPar, Double_t* par);
Double_t beamLine(TObject *obj,Int_t& nPar, Double_t* par);

HMdcAlignerD::HMdcAlignerD(Bool_t isCOff, Int_t typeClFn) 
    : HMdcTrackFinder(isCOff,typeClFn) {
  event=0;
  param = new HMdcAlignerParam();
}
    
HMdcAlignerD::HMdcAlignerD(const Text_t *name,const Text_t *title, Bool_t isCOff, Int_t typeClFn)
    : HMdcTrackFinder(name,title,isCOff,typeClFn) {
  event=0;
  param = new HMdcAlignerParam();
}

HMdcAlignerD::HMdcAlignerD(void){
  event=0;
  param = new HMdcAlignerParam();
}

HMdcAlignerD::HMdcAlignerD(const Text_t *name,const Text_t *title) :
    HMdcTrackFinder(name,title) {
  event=0;
  param = new HMdcAlignerParam();

}

HMdcAlignerD::~HMdcAlignerD() {
  if(HMdcTrackFinder::event) {
    delete event;
    event=0;
    HMdcTrackFinder::event=0;
  }
}

Bool_t HMdcAlignerD::init(void) {
  event=new HMdcEvntListCells;
  HMdcTrackFinder::event=event;
  HMdcTrackFinder::init();
  return kTRUE;
}

Bool_t HMdcAlignerD::reinit(void) {
   
  HMdcTrackFinder::reinit();
  fLookUpTb->setQuietMode();        // switch off print
  fLookUpTb->fillTrackList(kFALSE); // don't fill list of tracks for sim.data
  param->init();
  param->print(" initial value "); cout << endl;
  return kTRUE;
}

Int_t HMdcAlignerD::execute(void) {
//   iter->Reset();
//   Int_t  nHits;
//   event->clear();
//   HMdcCal1* cal;
// //   Int_t nWires = 0;
//   while ((cal=nextCell(nHits)) != 0) {
//     Int_t s,m,l,c;
//     cal->getAddress(s,m,l,c);
//     
//     if(s != param->getAlignSec()) continue;
// //     nWires++;
// 
//     if(nHits==1) event->addTime1(s,m,l,c,cal->getTime1());
//     else if(nHits==2) event->addTime1(s,m,l,c,cal->getTime2()); //???
//     else continue; // to keep 2 dr.times in EvntListCells is not possible yet
//   }

  event->clear();
/*  Int_t  nHits =*/ event->collectWires(param->getAlignSec());
//   if (nWires > 24) storeWires.addEvent(*event);
  storeWires.addEvent(*event);
  return 0;
}

Bool_t HMdcAlignerD::finalize(void) {

   if(param->getAlignSec() < 0 || param->getAlignSec() > 5) return kTRUE;
   
   fitpar = new HMdcTrackFitInOut();// obj. keep pointer to param. and categ.
   fitpar->init();
   fitpar->reinit();
   fitpar->setModuleTof();
   fitpar->setUseTukeyFlag(kFALSE);
   if(param->getScan())
      fitter = new HMdcTrackFitterB(fitpar);
   else
      fitter = new HMdcTrackFitterA(fitpar);
   
   HMdcMinimize min;
      
   fLookUpTb->setTargLenInc(15,15);   // aug04
   fLookUpTb->initContainer();
   
   Int_t nPar = param->getNMinParams();

   Double_t * alignPar = param->getMinParams();   
   Double_t * steps = param->getMinSteps();
   
//   Double_t beamPar[3] = {0, 0, 0};
//   Double_t beamSteps[2] = {1., 1.};

   Double_t alignParFit[24];   
   Double_t alignParClus[24];
   Int_t numcl;

   if(nPar == 0) { monitor(); return kTRUE;}
   
   if(param->getCluster()) {
      nPar = 12;
      min.setFCN((TObject*)this,clusterFunctional);
      min.random(500,nPar,alignPar,alignPar);
      return kTRUE;
   }

   Int_t offset = param->getOffset();;
   
   min.setFCN((TObject*)this,alignmentFunctional);
   if(offset == 3) min.setFCN((TObject*)this,directionFunctional);
   
   Double_t functOldCluster = 10000000000.;
   for(Int_t itClus = 0; itClus < 300; itClus++) {            //iteration for clusters
   
      storeWires.resetIter();
      numcl = 0;
      delete storeClusters;
      storeClusters = new HMdcStoreClusters();

  
      while(storeWires.getNextEvent(*event)) { // loop over events to find clusters

	 fClusCat->Clear();             // Category cleaning
	 calcClFndrLevel();             // Cluster finder levels determination
	 numcl += clFndrBeforField();    // Cl.finder in MDCI-II/all(without mag.field)

	 iterClus->Reset();
	 HMdcClus * fClst1;
	 HMdcClus * fClst2 = 0;
      
      
	 while((fClst1=(HMdcClus*)iterClus->Next())) {
	    if(fClst1->getIndexParent() >= 0) continue;
	 
	    Int_t first,last;
	    fClst1->getIndexRegChilds(first,last);
	    fClst2 = (first<0) ? 0:(HMdcClus*)fClusCat->getObject(first);
	    
	    Double_t xFirstMod, yFirstMod, xLastMod, yLastMod;
	    
	    param->getModTrackParams(fClst1->getXTarg(),fClst1->getYTarg(),fClst1->getZTarg(),
						fClst1->getX(),fClst1->getY(),fClst1->getZ(),
						xFirstMod, yFirstMod, xLastMod, yLastMod);
  
	    storeClusters->addClustWires(*event,fClst1,fClst2);
//	    storeClusters->setClusterPar(xFirstMod, yFirstMod, xLastMod, yLastMod);
            storeClusters->setTrackPar(param->getAlignSec(),
                param->getFirstMod(), xFirstMod, yFirstMod, 
                param->getLastMod(), xLastMod, yLastMod);
	    storeClusters->setEndCluster();
	 }
         storeClusters->setEndEvent();
	 
      } // end loop over events to find clusters
      
//       if(offset == 3) {
// 	 min.setFCN((TObject*)this,directionFunctional);
// 	 min.minimize(50,nPar,alignPar,steps,alignPar);
// 	 param->setNewPosition(alignPar,offset);
// 	 monitor();
// 	 return kTRUE;
//       }
   
      Bool_t iniPar = kTRUE;//kFALSE;
   
      Double_t funct, functOld = 10000000000.;
      for(Int_t itFit = 0; itFit < 50; itFit++) {            //iteration for fit
      
	 Double_t sumFunctional = 0;
	 Double_t nClus = 0;
	 storeClusters->resetIter();
	 
         while(storeClusters->nextEvent()) {
	   while(storeClusters->getNextCluster(*event)) {     //loop over clusters
      
	      Double_t x1 = storeClusters->getX1();
	      Double_t y1 = storeClusters->getY1();
	      Double_t z1 = 0.;
	      Double_t x2 = storeClusters->getX2();
	      Double_t y2 = storeClusters->getY2();
	      Double_t z2 = 0.;

	      param->getSecTrackParams(x1, y1, z1, x2, y2, z2); 

	      if(!fitter->setClustAndFill(event,x1, y1, z1, x2, y2, z2)) continue;

	      fitter->setRegionOfWires();

	      if(!fitter->fitCluster(300000)) {
	         storeClusters->resetTrackPar(-999, -999, -999, -999);
	         continue;
	      }

	      if(fitter->getChi2() > 300.) continue;

  // 	 cout << " finalize " << fitter->getFinalParam()->x1() << " " << fitter->getFinalParam()->y1() << " "
  // 	      << fitter->getFinalParam()->z1() << " " << fitter->getFinalParam()->x2() << " " << fitter->getFinalParam()->y2()
  // 	      << " " << fitter->getFinalParam()->z2() << " " << fitter->getChi2() << endl;

	      sumFunctional += fitter->getChi2();
	      nClus++ ;

	      Double_t xFirstMod, yFirstMod, xLastMod, yLastMod;

	      param->getModTrackParams(fitter->getFinalParam()->x1(),fitter->getFinalParam()->y1(),fitter->getFinalParam()->z1(),
				       fitter->getFinalParam()->x2(),fitter->getFinalParam()->y2(),fitter->getFinalParam()->z2(),
				       xFirstMod, yFirstMod, xLastMod, yLastMod);

	      storeClusters->resetTrackPar(xFirstMod, yFirstMod, xLastMod, yLastMod);

	   } //end loop over clusters
         }
	 
	 param->print(" finalize functional "); cout << numcl << " " << nClus << " " << sumFunctional/nClus  << endl;
      
	 funct = sumFunctional/nClus;
      
	 if(funct >= functOld) {
	 
	    for(Int_t i=0; i<nPar; i++) alignPar[i] = alignParFit[i];
	    param->setNewPosition(alignPar,offset);

	    param->print(" finalize best functional "); cout << numcl << " " << nClus << " " << functOld << endl;
	    
	    if(iniPar) break;
	    else iniPar = kTRUE;
	 }
      
	 functOld = funct;
   
	 for(Int_t i=0; i<nPar; i++) alignParFit[i] = alignPar[i];
	 param->setNewPosition(alignPar,offset);
      
	 if(iniPar) {	    
	    if(nPar == 0) {
// 	       min.setFCN((TObject*)this,beamLine);
// 	       min.minimize(50,2,beamPar,beamSteps,beamPar);
// 	       HGeomVector * target = new HGeomVector(beamPar[0], beamPar[1], beamPar[2]);
	       HGeomVector * target = 0;
	       
	       monitor(target);
	       return kTRUE;
	    }
	    min.minimize(50,nPar,alignPar,steps,alignPar);
	    param->setNewPosition(alignPar,offset);
	 }

      }  //End fit iteration
      
      param->print(" finalize best cluster functional "); cout << numcl << " " << " " << functOld << " " << functOldCluster << endl;
      
      if(functOld >= functOldCluster) {
	 for(Int_t i=0; i<nPar; i++) alignPar[i] = alignParClus[i];
	 param->setNewPosition(alignPar,offset);
	 break;
      }
      
      functOldCluster = functOld;
      for(Int_t i=0; i<nPar; i++) alignParClus[i] = alignPar[i];
      param->setNewPosition(alignPar,offset);

   } //End clusterfinder iteration
    
//    min.setFCN((TObject*)this,beamLine);
//    min.minimize(50,2,beamPar,beamSteps,beamPar);
//    HGeomVector * target = new HGeomVector(beamPar[0], beamPar[1], beamPar[2]);
   HGeomVector * target = 0;
	       
   monitor(target);
   return kTRUE;
}

Double_t clusterFunctional(TObject * obj,Int_t& nPar, Double_t* par) {

   HMdcAlignerD * aligner = (HMdcAlignerD *)obj;
   HMdcAlignerParam * param = aligner->getParam();
   HMdcStoreEvents * store = aligner->getStoreWires();
   HMdcEvntListCells * event = aligner->getEvent();
//    HCategory * fClusCat = aligner->getClusCat();
   
   param->setNewPosition(par,param->getOffset());

   //========= Event loop:=========================================
   store->resetIter();
   Double_t numcl = 0;
   
   while(store->getNextEvent(*event)) {
      
//       fClusCat->Clear();             // Category cleaning
      aligner->calcClFndrLevel();             // Cluster finder levels determination
      numcl += aligner->clFndrBeforField(); // Cl.finder in MDCI-II/all(without mag.field)
   }
   
   if(numcl == 0) numcl = 1;
   
   Double_t f = 2500000./numcl;
   
   param->print(" cluster functional "); cout <<  numcl << " " << f << endl;
   
  return (f==0) ? 1000000. : f;

}

Double_t alignmentFunctional(TObject * obj,Int_t& nPar, Double_t* par) {

   HMdcAlignerD * aligner = (HMdcAlignerD *)obj;
   HMdcAlignerParam * param = aligner->getParam();
   HMdcStoreClusters & store = *(aligner->getStoreClusters());
   HMdcEvntListCells * event = aligner->getEvent();
   HMdcTrackFitter * fitter = aligner->getFitter();
   
   param->setNewPosition(par,param->getOffset());

   //========= Event loop:=========================================
   
   store.resetIter();
   Double_t sumFunctional = 0;
   Double_t nClus = 0;
   Double_t nCells = 0;
   
   while(store.nextEvent()) {
     while(store.getNextCluster(*event)) {

        Double_t x1 = store.getX1();
        Double_t y1 = store.getY1();
        Double_t z1 = 0.;
        Double_t x2 = store.getX2();
        Double_t y2 = store.getY2();
        Double_t z2 = 0.;

        if(x1 < -998) continue;

        param->getSecTrackParams(x1, y1, z1, x2, y2, z2);

        if(!fitter->setClustAndFill(event,x1, y1, z1, x2, y2, z2)) continue;

        fitter->setRegionOfWires();

        fitter->fillOutput();

  // 	 cout << " alignmentFunctional functional " << fitter->getFinalParam()->x1() << " " << fitter->getFinalParam()->y1() << " "
  // 	      << fitter->getFinalParam()->z1() << " " << fitter->getFinalParam()->x2() << " " << fitter->getFinalParam()->y2() << " "
  // 	      << fitter->getFinalParam()->z2() << " " << fitter->getChi2() << endl;

        if(fitter->getChi2() > 300.) continue;

        nCells += fitter->getWiresArr().getNumOfGoodWires();	 
        sumFunctional += fitter->getChi2();
        nClus++ ;

     }
   }
 
   if(nClus == 0) nClus = 1;
   if(nCells == 0) nCells = 1;
   
   Double_t f = sumFunctional/nClus;

   param->print(" alignment functional "); cout	<<  nClus << " " << nCells << " " << sumFunctional/nClus << " " << f << endl;
   
  return (f==0) ? 1000000. : f;
  
}

Double_t directionFunctional(TObject * obj,Int_t& nPar, Double_t* par) {

   HMdcAlignerD * aligner = (HMdcAlignerD *)obj;
   HMdcAlignerParam * param = aligner->getParam();
   HMdcStoreClusters & store = *(aligner->getStoreClusters());
   HMdcEvntListCells * event = aligner->getEvent();
   HMdcTrackFitter * fitter = aligner->getFitter();
   
   param->setNewPosition(par,param->getOffset());

   //========= Event loop:=========================================
   
   store.resetIter();
   Double_t sumFunctional = 0;
   Double_t nClus = 0;
   Double_t nCells = 0;
   
   while(store.nextEvent()) {
     while(store.getNextCluster(*event)) {

        Double_t xDir[4] = {-10000, -10000, -10000, -10000};
        Double_t yDir[4] = {-10000, -10000, -10000, -10000};

        Double_t x1 = store.getX1();
        Double_t y1 = store.getY1();
        Double_t z1 = 0.;
        Double_t x2 = store.getX2();
        Double_t y2 = store.getY2();
        Double_t z2 = 0.;

        if(x1 < -998) continue;

        param->getSecTrackParams(x1, y1, z1, x2, y2, z2);

        if(!fitter->setClustAndFill(event,x1, y1, z1, x2, y2, z2)) continue;

        for(Int_t iMod=1; iMod>-1; iMod--) {
	   fitter->setRegionOfWires(iMod);
	   if(!fitter->fitCluster(300000)) continue;
	   if(fitter->getChi2() > 300.) continue;

	   Double_t fitX1 = fitter->getFinalParam()->x1();
	   Double_t fitY1 = fitter->getFinalParam()->y1();
	   Double_t fitZ1 = fitter->getFinalParam()->z1();
	   Double_t fitX2 = fitter->getFinalParam()->x2();
	   Double_t fitY2 = fitter->getFinalParam()->y2();
	   Double_t fitZ2 = fitter->getFinalParam()->z2();
	   Double_t dx = fitX2 - fitX1;
	   Double_t dy = fitY2 - fitY1;
	   Double_t dz = fitZ2 - fitZ1;
	   Double_t r = 1./sqrt(dx*dx+dy*dy+dz*dz);
	   dx *= r;
	   dy *= r;
	   dz *= r;
	   const Double_t * tfSysRSec = param->getTfSysRSec(iMod);

	   xDir[iMod] = tfSysRSec[0]*dx + tfSysRSec[3]*dy + tfSysRSec[6]*dz;
	   yDir[iMod] = tfSysRSec[1]*dx + tfSysRSec[4]*dy + tfSysRSec[7]*dz;

	   cout << iMod << " " << fitter->getChi2() << " " << xDir[iMod] << " " << yDir[iMod] << endl; 
        }
        if(xDir[0] == -10000 || xDir[1] == -10000) continue;



  // 	 cout << " alignmentFunctional functional " << fitter->getFinalParam()->x1() << " " << fitter->getFinalParam()->y1() << " "
  // 	      << fitter->getFinalParam()->z1() << " " << fitter->getFinalParam()->x2() << " " << fitter->getFinalParam()->y2() << " "
  // 	      << fitter->getFinalParam()->z2() << " " << fitter->getChi2() << endl;

        nCells += fitter->getWiresArr().getNumOfGoodWires();	 
        sumFunctional += (xDir[0] - xDir[1])*(xDir[0] - xDir[1]) + (yDir[0] - yDir[1])*(yDir[0] - yDir[1]);
        nClus++ ;

     }
   }
 
   if(nClus == 0) nClus = 1;
   if(nCells == 0) nCells = 1;
   
   Double_t f = sumFunctional/nClus;

   param->print(" direction functional "); cout	<<  nClus << " " << nCells << " " << f << endl;
   
  return (f==0) ? 1000000. : f;
  
}

Double_t beamLine(TObject * obj,Int_t& nPar, Double_t* par) {

   HMdcAlignerD * aligner = (HMdcAlignerD *)obj;
   HMdcAlignerParam * param = aligner->getParam();
   HMdcStoreClusters & store = *(aligner->getStoreClusters());
   HMdcEvntListCells * event = aligner->getEvent();
   HMdcTrackFitter * fitter = aligner->getFitter();
   
   //========= Event loop:=========================================
   
   store.resetIter();
//   Double_t sumFunctional = 0;
   Double_t nClus = 0;
//   Double_t nCells = 0;
   Double_t sumr = 0;
   Double_t sumr2 = 0;
   
   while(store.nextEvent()) {
     while(store.getNextCluster(*event)) {

        Double_t x1 = store.getX1();
        Double_t y1 = store.getY1();
        Double_t z1 = 0.;
        Double_t x2 = store.getX2();
        Double_t y2 = store.getY2();
        Double_t z2 = 0.;

        if(x1 < -998) continue;

        param->getSecTrackParams(x1, y1, z1, x2, y2, z2);

        if(!fitter->setClustAndFill(event,x1, y1, z1, x2, y2, z2)) continue;

        fitter->setRegionOfWires();

        fitter->fillOutput();

        if(fitter->getChi2() > 300.) continue;

        Double_t z, r;

        HMdcSizesCells* fSizesCells   =  HMdcSizesCells::getObject();   
        fSizesCells->calcRZToLineXY(fitter->getFinalParam()->x1(),fitter->getFinalParam()->y1(),fitter->getFinalParam()->z1(),
				      fitter->getFinalParam()->x2(),fitter->getFinalParam()->y2(),fitter->getFinalParam()->z2(),
				      par[0], par[1], z, r);
        sumr += r;
        sumr2 += r*r;
        nClus++ ;

     }
   }
 
   if(nClus == 0) nClus = 1;
   
   Double_t sigma = sumr2/nClus - (sumr/nClus)*(sumr/nClus);
//    Double_t f = fabs(sumr/nClus);
   Double_t f = sumr2/nClus;
   
   cout << " beamLine " << par[0] << " " << par[1] << " " << nClus << " " << sigma << " " << f << endl;
   
  return (f==0) ? 1000000. : f;
  
}

// void HMdcAlignerD::monitor(HGeomVector * target) {   


//    HMdcSizesCells* fSizesCells   =  HMdcSizesCells::getObject();
   
//    HMdcSizesCellsSec& fSCSec = (*fSizesCells)[param->getAlignSec()];
//    (fSCSec.getTargetMiddlePoint()).print();
//    param->setNewPosition(0,param->getOffset());
   
   
//    TFile * file = new TFile(param->getRootFile(),"recreate");
//    TNtuple * inner = new TNtuple("inner","deviations","dev0:dev1:dev2:dev3:dev4:dev5:dev6:dev7:dev8:dev9:dev10:dev11:ch2:nw:z");
//    TNtuple * outer = new TNtuple("outer","deviations","dev12:dev13:dev14:dev15:dev16:dev17:dev18:dev19:dev20:dev21:dev22:dev23:ch2:nw:z");
   
//    //========= Event loop:=========================================

//    storeWires.resetIter();
//    Double_t numcl = 0;
//    delete storeClusters;
//    storeClusters = new HMdcStoreClusters();
   
//    while(storeWires.getNextEvent(*event)) { // loop over events to find clusters

//       fClusCat->Clear();             // Category cleaning
//       calcClFndrLevel();             // Cluster finder levels determination
//       numcl += clFndrBeforField();    // Cl.finder in MDCI-II/all(without mag.field)
      
//       iterClus->Reset();
//       HMdcClus * fClst1;
//       HMdcClus * fClst2 = 0;
      
      
//       while((fClst1=(HMdcClus*)iterClus->Next())) {
// 	 if(fClst1->getIndexParent() >= 0) continue;
	 
// 	 Int_t first,last;
// 	 fClst1->getIndexRegChilds(first,last);
// 	 fClst2 = (first<0) ? 0:(HMdcClus*)fClusCat->getObject(first);
	 
// 	 Double_t xFirstMod, yFirstMod, xLastMod, yLastMod;
	    
// 	 param->getModTrackParams(fClst1->getXTarg(),fClst1->getYTarg(),fClst1->getZTarg(),
// 				  fClst1->getX(),fClst1->getY(),fClst1->getZ(),
// 				  xFirstMod, yFirstMod, xLastMod, yLastMod);
  
// 	 storeClusters->addClustWires(*event,fClst1,fClst2);
// 	 storeClusters->setClusterPar(xFirstMod, yFirstMod, xLastMod, yLastMod);
// 	 storeClusters->setEndCluster();
//       }
	 
//    } // end loop over events to find clusters
   
      
//    storeClusters->resetIter();
//    Double_t sumFunctional = 0;
//    Double_t nClus = 0;
//    Double_t nCells = 0;   

//    while(storeClusters->getNextCluster(*event)) {     // loop over clusters 
      
//       Int_t segment = 1000;
//       fitter->setAddress(param->getAlignSec(),segment);
//       if(!fitter->fillListHits(event)) continue;

//       Double_t x1 = storeClusters->getX1();
//       Double_t y1 = storeClusters->getY1();
//       Double_t z1 = 0.;
//       Double_t x2 = storeClusters->getX2();
//       Double_t y2 = storeClusters->getY2();
//       Double_t z2 = 0.;
	 
//      param->getSecTrackParams(x1, y1, z1, x2, y2, z2);
	 
//       fitter->setTrackPar(x1, y1, z1, x2, y2, z2);
	 
//       fitter->setFittingTimesList();
	 
//       if(!fitter->fitCluster(300000)) continue;
	 
//       if(fitter->getChi2() > 300.) continue;
	 
//       Double_t z, r, dz;
//       Double_t zl, rl;
//       Double_t xv, yv, zv, xl, yl;
//       Double_t nC = fitter->getNumberOfGoodWires();	 
//       Double_t sF= fitter->getChi2();
      
//       fSCSec.calcRZToTargLine(fitter->getFinalParam()->x1(),fitter->getFinalParam()->y1(),
// 			      fitter->getFinalParam()->z1(),fitter->getFinalParam()->x2(),
// 			      fitter->getFinalParam()->y2(),fitter->getFinalParam()->z2(),
// 			      z, r);
//       Float_t dev[24] = {-1000,-1000,-1000,-1000,-1000,-1000,
// 			 -1000,-1000,-1000,-1000,-1000,-1000,
// 			 -1000,-1000,-1000,-1000,-1000,-1000,
// 			 -1000,-1000,-1000,-1000,-1000,-1000,};

//       for( Int_t nT = 0; nT < fitter->getLastTime(); nT++)
// 	 dev[fitter->getLayer(nT)] = fitter->getDeviation(nT);
// //       for( Int_t nT = 0; nT < fitter->getLastTime(); nT++) {
// // 	 if(fitter->getLayer(nT) !=  || fitter->getCell(nT) > 23) continue;
// // 	 dev[fitter->getCell(nT)] = fitter->getDeviation(nT);
// //       }
	 
//       inner->Fill(dev[0],dev[1],dev[2],dev[3],dev[4],dev[5],dev[6],dev[7],dev[8],
// 	       dev[9],dev[10],dev[11],float(sF),float(nC),float(z));
//       outer->Fill(dev[12],dev[13],dev[14],dev[15],dev[16],dev[17],dev[18],dev[19],dev[20],
// 	       dev[21],dev[22],dev[23],float(sF),float(nC),float(z));
	 
//       nCells += fitter->getNumberOfGoodWires();	 
//       sumFunctional += fitter->getChi2();
//       nClus++ ;
               
      
//    }

   
//    if(numcl == 0) numcl = 1;
//    if(nClus == 0) nClus = 1;
//    if(nCells == 0) nCells = 1;
   
//    Double_t f = sumFunctional/nClus;
   
    
//    param->print(" monitor "); cout <<  numcl << " " <<  nClus << " " << nCells << " " << sumFunctional/nClus << " " << " " << f << endl;	 
	 
//    Double_t targetPar[6] = {0,0,0,0,0,0};
//    HGeomTransform targetTrans;
   
//    param->printTransforms(targetPar);
   
//    inner->Write();
//    outer->Write();
//    file->Close();
	 
// }
   
void HMdcAlignerD::monitor(HGeomVector * target) {   


   HMdcSizesCells* fSizesCells   =  HMdcSizesCells::getObject();
//    if(target) fSizesCells->fillTargetPos(target);
   
   HMdcSizesCellsSec& fSCSec = (*fSizesCells)[param->getAlignSec()];
   (fSCSec.getTargetMiddlePoint()).print();
//    target->print();
   param->setNewPosition(0,param->getOffset());
   
   
   TFile * file = new TFile(param->getRootFile(),"recreate");
   
   TNtuple * inner = new TNtuple("inner","deviations","dev0:dev1:dev2:dev3:dev4:dev5:dev6:dev7:dev8:dev9:dev10:dev11:ch2:nw:z");
   TNtuple * outer = new TNtuple("outer","deviations","dev12:dev13:dev14:dev15:dev16:dev17:dev18:dev19:dev20:dev21:dev22:dev23:ch2:nw:z");
   TNtuple * zr = new TNtuple("ZR","traks","z:r:x:y:chi2:nw");
   
//    if(param->getOffset()) {
//       TNtuple * inner = new TNtuple("inner","deviations","dev0:dev1:dev2:dev3:dev4:dev5:dev6:dev7:dev8:dev9:dev10:dev11:ch2:nw:z");
//       TNtuple * outer = new TNtuple("outer","deviations","dev12:dev13:dev14:dev15:dev16:dev17:dev18:dev19:dev20:dev21:dev22:dev23:ch2:nw:z");
//    }
//    else {
//       TNtuple * zr = new TNtuple("ZR","traks","z:r:chi2:nw");
//    }
   
   //========= Event loop:=========================================

   storeWires.resetIter();
   Double_t numcl = 0;
   delete storeClusters;
   storeClusters = new HMdcStoreClusters();
   
   while(storeWires.getNextEvent(*event)) { // loop over events to find clusters

      fClusCat->Clear();             // Category cleaning
      calcClFndrLevel();             // Cluster finder levels determination
      numcl += clFndrBeforField();    // Cl.finder in MDCI-II/all(without mag.field)
      
      iterClus->Reset();
      HMdcClus * fClst1;
      HMdcClus * fClst2 = 0;
      
      
      while((fClst1=(HMdcClus*)iterClus->Next())) {
	 if(fClst1->getIndexParent() >= 0) continue;
	 
	 Int_t first,last;
	 fClst1->getIndexRegChilds(first,last);
	 fClst2 = (first<0) ? 0:(HMdcClus*)fClusCat->getObject(first);
	 
	 Double_t xFirstMod, yFirstMod, xLastMod, yLastMod;
	    
	 param->getModTrackParams(fClst1->getXTarg(),fClst1->getYTarg(),fClst1->getZTarg(),
				  fClst1->getX(),fClst1->getY(),fClst1->getZ(),
				  xFirstMod, yFirstMod, xLastMod, yLastMod);

	 storeClusters->addClustWires(*event,fClst1,fClst2);
//	 storeClusters->setClusterPar(xFirstMod, yFirstMod, xLastMod, yLastMod);
         storeClusters->setTrackPar(param->getAlignSec(),
                param->getFirstMod(), xFirstMod, yFirstMod, 
                param->getLastMod(), xLastMod, yLastMod);
	 storeClusters->setEndCluster();
      }
      storeClusters->setEndEvent();
	 
   } // end loop over events to find clusters
   
   storeClusters->resetIter();
   Double_t sumFunctional = 0;
   Double_t nClus = 0;
   Double_t nCells = 0;   
   HMdcEvntListCells cluster;

   while(storeClusters->nextEvent()) {
     while(storeClusters->getNextCluster(cluster)) {     // loop over clusters

        Double_t x1 = storeClusters->getX1();
        Double_t y1 = storeClusters->getY1();
        Double_t z1 = 0.;
        Double_t x2 = storeClusters->getX2();
        Double_t y2 = storeClusters->getY2();
        Double_t z2 = 0.;

        param->getSecTrackParams(x1, y1, z1, x2, y2, z2);

        if(!fitter->setClustAndFill(&cluster,x1, y1, z1, x2, y2, z2)) continue;

        fitter->setRegionOfWires();

  //       fitter->switchOffWires(param->getAlignSec(), 3, 2);

        if(!fitter->fitCluster(300000)) continue;
  // 	 fitter->fitCluster(300000);

        if(fitter->getChi2() > 300.) continue;

        Double_t z, r;
  //      Double_t zl, rl, dz;
  //      Double_t xv, yv, zv, xl, yl;
        Double_t nC = fitter->getWiresArr().getNumOfGoodWires();	 
        Double_t sF= fitter->getChi2();

        fSCSec.calcRZToTargLine(fitter->getFinalParam()->x1(),fitter->getFinalParam()->y1(),
			        fitter->getFinalParam()->z1(),fitter->getFinalParam()->x2(),
			        fitter->getFinalParam()->y2(),fitter->getFinalParam()->z2(),
			        z, r);

        Float_t dev[24] = {-1000,-1000,-1000,-1000,-1000,-1000,
			   -1000,-1000,-1000,-1000,-1000,-1000,
			   -1000,-1000,-1000,-1000,-1000,-1000,
			   -1000,-1000,-1000,-1000,-1000,-1000,};

        if(param->getOffset()) {
	   for( Int_t nT = 0; nT < fitter->getWiresArr().getLastTimeInd(); nT++)
	      dev[((fitter->getWiresArr())[nT]).getLayer()] = ((fitter->getWiresArr())[nT]).getDev();
  //       for( Int_t nT = 0; nT < fitter->getLastTime(); nT++) {
  // 	 if(fitter->getLayer(nT) !=  || fitter->getCell(nT) > 23) continue;
  // 	 dev[fitter->getCell(nT)] = fitter->getDeviation(nT);
  //       }

	   inner->Fill(dev[0],dev[1],dev[2],dev[3],dev[4],dev[5],dev[6],dev[7],dev[8],
		       dev[9],dev[10],dev[11],float(sF),float(nC),float(z));
	   outer->Fill(dev[12],dev[13],dev[14],dev[15],dev[16],dev[17],dev[18],dev[19],dev[20],
		       dev[21],dev[22],dev[23],float(sF),float(nC),float(z));
        }
        else {
	   zr->Fill(float(z), float(r), float(x2), float(y2), float(sF), float(nC));
        }

        nCells += fitter->getWiresArr().getNumOfGoodWires();	 
        sumFunctional += fitter->getChi2();
        nClus++ ;


     }
   }

   
   if(numcl == 0) numcl = 1;
   if(nClus == 0) nClus = 1;
   if(nCells == 0) nCells = 1;
   
   Double_t f = sumFunctional/nClus;
   
    
   param->print(" monitor "); cout <<  numcl << " " <<  nClus << " " << nCells << " " << sumFunctional/nClus << " " << " " << f << endl;	 
	 
   Double_t targetPar[6] = {0,0,0,0,0,0};
   HGeomTransform targetTrans;
   
   param->printTransforms(targetPar);
   
   if(param->getOffset()) {
      inner->Write();
      outer->Write();
   }
   else {
      zr->Write();
   }
   
   file->Close();
	 
}
   
void HMdcAlignerD::printCluster(HMdcClus* fClst) {
  Int_t sec=fClst->getSec();
  Int_t seg=fClst->getIOSeg();
  Int_t l,c;
  l=c=-1;
  Int_t lOld=l;
  Int_t lay=-1;
  Int_t mod=-1;
  printf("=Cluster:=== Sec. %i ===============\n",sec);
  while(fClst->getNextCell(l,c)) {
    if(l != lOld) {
      lay=l%6;
      mod=l%6 + seg*2;
      printf("%i mod. %i layer:",mod,lay);
      if(lOld>=0) printf("\n");
      lOld=l;
    }
    printf(" %i/%.1f",c,event->getTimeValue(sec,mod,lay,c));
  }
  printf("\n");
  Int_t first,last;
  fClst->getIndexRegChilds(first,last);
  if(first<0) return;
  HMdcClus* fClst2 = (HMdcClus*)fClusCat->getObject(first);
  if(fClst2==0) return;
  l=c=-1;
  lOld=l;
  while(fClst2->getNextCell(l,c)) {
    if(l != lOld) {
      lay=l%6;
      mod=l%6 + seg*2;
      printf("%i mod. %i layer:",mod,lay);
      if(lOld>=0) printf("\n");
      lOld=l;
    }
    printf(" %i/%.1f",c,event->getTimeValue(sec,mod,lay,c));
  }
  printf("\n");
}

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