//*-- Author : V.Pechenov
//*-- Modified : 07.05.2002 by V.Pechenov
//*-- Modified : 17.01.2002 by V.Pechenov
//*-- Modified : 12.05.2001 by V.Pechenov

//_HADES_CLASS_DESCRIPTION 
//////////////////////////////////////////////////////////////////////
// HMdcTrackFinder
//
// The program for candidates to tracks finding.
//
// Using:
// Put in task list task:
// HMdcTrackFinder* trackFinder;
// ...
// tasks->connect((trackFinder=new HMdcTrackFinder("MdcTrackD","MdcTrackD",
//                                     isCoilOff,typeClustFinder)),"...");
//
// isCoilOff=kTRUE(kFULSE) - The current in coil is turn off(on) for this run(s).
// typeClustFinder=1(0) - type of the work of cluster finder
//
// The parameters isCoilOff and typeClustFinder define the type
// of the work of cluster finder (default values of isCoilOff
// and typeClustFinder are kFALSE and 0):
//
//    isCoilOff=kTRUE - the tracks in all MDC will finded to respect of target.
//    isCoilOff=kFALSE - the tracks in MDC1 & MDC2 will finded to respect
//      of target. In MDC3 & MDC4 - to respect of the the point on kick plane.
//
//    typeClustFinder=0 - the tracks will finded in segment or sector
//      (needs in a alignment of MDC's).
//
// 1. isCoilOff=kTRUE, typeClustFinder=1:
//      The tracks will be searched in each MDC (1-4) independently
// 2. isCoilOff=kTRUE, typeClustFinder=0:
//      The tracks will be searched in all MDC of sector together to
//    respect of target (needs an alignment of MDC's).
// 3. isCoilOff=kFALSE, typeClustFinder=1:
//      The tracks will be searched in MDC1, MDC2 (segment 1) independently,
//      in MDC3, MDC4 (segment 2) together.
// 4. isCoilOff=kFALSE, typeClustFinder=0:
//      The tracks will be searched in MDC1, MDC2 (segment 1) together
//      (needs an alignment of MDC's).
// 5. isCoilOff=kFALSE, typeClustFinder=2:
//      The tracks will be searched in MDC1, MDC2 (segment 1) together
//      and after it in MDC1, MDC2 (segment 1) independently.
// For isCoilOff=kFALSE the program needs HKickPlane parameters
//
// The member function
// trackFinder->setNLayers(nLayers);
// set the number of woring planes in MDC's
// Int_t nLayers[6][4]={ {3,6,6,6}, {6,6,6,6}, {6,6,6,6},
//                       {4,6,6,6}, {6,6,6,6}, {5,6,6,6} };
//
//
// The output of the program is container HMdcClus.
// For writing of HMdcClus to ROOT file use function:
// trackFinder->setPersitency(kTRUE);
//                           (put this line in macros befor makeTree()!)
//
// HMdcClusterToHit task copy the HMdcClus data to HMdcHit and HMdcSeg
//
// The HMdcHit and HMdcSeg containers filled by HMdc12Fit task.
// The new ver. of HMdc12Fit will be commited to CVS soon.
//
//////////////////////////////////////////////////////////////////////

#include "hmdctrackfinder.h"
#include "hmdctrackddef.h"
//#include "hdebug.h"
#include "hiterator.h"
#include "hcategory.h"
#include "hmdcgetcontainers.h"
#include "hmdcclussim.h"
#include "hmdccal1sim.h"
#include "hmdctimecut.h"
#include "hmdclookuptb.h"
#include "hmdc34clfinder.h"
#include "hmdctrackdset.h"
#include "hmdcclussim.h"
#include "hmdclistcells.h"

 HMdcTrackFinder::HMdcTrackFinder(Bool_t isCOff, Int_t typeClFn) {
  HMdcTrackDSet::setMdcTrackFinder(isCOff,typeClFn);
  setParContainers();
}

 HMdcTrackFinder::HMdcTrackFinder(Text_t *name, Text_t *title,
     Bool_t isCOff, Int_t typeClFn) : HReconstructor(name,title) {
  HMdcTrackDSet::setMdcTrackFinder(isCOff,typeClFn);
  setParContainers();
}

 HMdcTrackFinder::HMdcTrackFinder(void) {
  setParContainers();
}

 HMdcTrackFinder::HMdcTrackFinder(Text_t *name, Text_t *title) : 
    HReconstructor(name,title) {
  setParContainers();
}

 HMdcTrackFinder::~HMdcTrackFinder() {
  if(event) {delete event; event=0;}
  HMdcLookUpTb::deleteCont();
  HMdc34ClFinder::deleteCont();
  HMdcTrackDSet::pTrackFinder=0;
  if(iter)    {delete iter    ; iter=0;}
  if(iterClus){delete iterClus; iterClus=0;}
}

 void HMdcTrackFinder::setParContainers() {
  event=0;
  prntSt=kFALSE;
  HMdcTrackDSet::setTrackFinder(this);
  isInitialised=kFALSE;
  fLookUpTb=0;
  f34ClFinder=0;
  level4[0]=HMdcTrackDSet::level4[0];
  level5[0]=HMdcTrackDSet::level5[0];
  level4[1]=HMdcTrackDSet::level4[1];
  level5[1]=HMdcTrackDSet::level5[1];
  locClus.set(2,0,0);
  locNewCl.set(3,0,0,0);
  fClusCat=0;
  iter=0;
  iterClus=0;

  perMdcClus=kFALSE;
  for(Int_t sec=0; sec<6; sec++) {
    nModules[sec]=0;
    for(Int_t mod=0; mod<4; mod++) listModules[sec][mod]=
        HMdcTrackDSet::nLayersInMod[sec][mod];
  }
}

 Bool_t HMdcTrackFinder::init(void) {
  if(event==0) event=new HMdcEvntListCells;
  fcut=HMdcTimeCut::getExObject();
  if(fcut && fcut->getIsUsed()) fcut=0;
  fCalCat=HMdcGetContainers::getCatMdcCal1();
  if( !fCalCat ) return kFALSE;
  isGeant=HMdcGetContainers::isGeant();
  iter=(HIterator *)fCalCat->MakeIterator("native");

  fClusCat=HMdcGetContainers::getCatMdcClus(kTRUE);
  if( !fClusCat ) return kFALSE;
  fClusCat->setPersistency(perMdcClus);
  iterClus=(HIterator *)fClusCat->MakeIterator();

  fLookUpTb=HMdcLookUpTb::getObject();
  fLookUpTb->setPar(319,HMdcTrackDSet::isCoiloff); //!!!!!!!!!!!!319!

  if( !HMdcTrackDSet::isCoiloff ) f34ClFinder=HMdc34ClFinder::getObject();
  else f34ClFinder=0;
  if(!prntSt) printStatus();
  return kTRUE;
}

 Bool_t HMdcTrackFinder::reinit(void) {
  if(!fLookUpTb->initContainer()) return kFALSE;
  if( f34ClFinder && !f34ClFinder->initContainer() ) return kFALSE;
  Int_t typeClFinder=HMdcTrackDSet::clFinderType;
  if( !isInitialised ) {
    if(HMdcTrackDSet::clFinderType!=0) {
      for(Int_t sec=0; sec<6; sec++) if(&((*fLookUpTb)[sec])) 
        (*fLookUpTb)[sec].setTypeClFinder(typeClFinder);
    }
    Int_t nModsF=(HMdcTrackDSet::isCoiloff) ? 4:2;
    for(Int_t sec=0; sec<6; sec++) {
      nModules[sec]=0;
      HMdcLookUpTbSec* fLookUpTbSec=&((*fLookUpTb)[sec]);
      for(Int_t mod=0; mod<nModsF; mod++) {
        HMdcLookUpTbMod* fLookUpTbMod=(fLookUpTbSec) ?
            &((*fLookUpTbSec)[mod]):0;
        if( fLookUpTbMod ) {
          nModules[sec]++;
          if(listModules[sec][mod] != 6)
              fLookUpTbMod->setNLayers(listModules[sec][mod]);
        } else listModules[sec][mod]=0;
      }
      HMdc34ClFinderSec* f34ClFinderSec=(f34ClFinder)?&((*f34ClFinder)[sec]):0;
      if(f34ClFinderSec) f34ClFinderSec->setTypeClFinder(typeClFinder);
      for(Int_t mod=nModsF; mod<4; mod++) {
        HMdc34ClFinderMod* f34ClFinderMod=(f34ClFinderSec) ?
            &((*f34ClFinderSec)[mod]) : 0;
        if( f34ClFinderMod ) nModules[sec]++;
        else listModules[sec][mod]=0;
      }
    }
    isInitialised=kTRUE;
  }
  return kTRUE;
}

 void HMdcTrackFinder::setPersistency(Bool_t perCl) {
  perMdcClus=perCl;
  if(fClusCat) fClusCat->setPersistency(perMdcClus);
}


 Int_t HMdcTrackFinder::execute(void) {
  iter->Reset();
  event->clear();

  HMdcCal1* cal=0;
  Int_t  nHits;
  while ((cal=nextCell(nHits)) != 0) {
    Int_t s,m,l,c;
    cal->getAddress(s,m,l,c);
    event->setTime(s,m,l,c,nHits);
  }

  calcClFndrLevel();             // Cluster finder levels determination
  
  Int_t numcl=clFndrBeforField(); // Cl.finder in MDCI-II/all(without mag.field)
  
  if(f34ClFinder) {              // Track finder in MDCIII-IV (with mag.field)
    f34ClFinder->setCellsList(*event);
    setMod34Levels();
    if(HMdcTrackDSet::pClusterToHit) numcl+=noFitClFndr34();
  }
  return 0;
}

 HMdcCal1* HMdcTrackFinder::nextCell(Int_t& nHits) {
  HMdcCal1* cal;
  nHits=0;
  do {
    cal=(HMdcCal1 *)iter->Next();
    if(cal==0) return 0;
    nHits=cal->getNHits();
    if(nHits!=0) {
      if(nHits>0) nHits=1;
      else {
        nHits=-nHits;
        if(nHits==2) nHits=3;
      }
      if(isGeant ) {
        HMdcCal1Sim* cals=(HMdcCal1Sim *)cal;
        if((nHits&1) == 1 && cals->getStatus1()<0) nHits-=1;
        if((nHits&2) == 2 && cals->getStatus2()<0) nHits-=2;
      } else if(fcut && fcut->cut(cal)) nHits=0;
    }
  } while (nHits==0);
  return cal;
}

 void HMdcTrackFinder::fillLookUpTb(void) {
  (*fLookUpTb).clear();
  Int_t s,m,l,c;
  s=m=l=c=-1;
  UChar_t tm;
  while(event->nextCell(s,m,l,c,tm)) {
    if(HMdcTrackDSet::isCoiloff || m<2) {
      HMdcLookUpTbSec& fSec=(*fLookUpTb)[s];
      if(&fSec) fSec.setCell(m,l,c,tm);
    }
  }
}

 void HMdcTrackFinder::calcClFndrLevel(void) {
  // Cluster finder levels determination:
  for(Int_t sec=0; sec<6; sec++) {
    Int_t* levelSec=clFndrLevel[sec];
    for(Int_t mod=0; mod<4; mod++) {
      levelSec[mod]=listModules[sec][mod];
      if( levelSec[mod]>0 ) {
        Int_t occup=((*event)[sec][mod].getNCells()*6)/levelSec[mod];
	if( occup <= level5[mod/2] ) levelSec[mod]--;
	if( occup <= level4[mod/2] ) levelSec[mod]--;
	if( occup < 3 && HMdcTrackDSet::getClFinderType()==0) levelSec[mod]=3;
        if( levelSec[mod]<3 ) levelSec[mod]=3;
        
        if( HMdcTrackDSet::getClFinderType()==2 && mod>1) {
          if(listModules[sec][mod]<4) {
            levelSec[mod]=listModules[sec][mod]-1;
            if(levelSec[mod]<0) levelSec[mod]=0;
          }
        }
      }
    }
  }
}

 Int_t HMdcTrackFinder::clFndrBeforField(void) {
  // Track finder in MDCI-II or all MDC's without mag.field
  fillLookUpTb();                // Filling HMdcLookUpTb by list of cells
  Int_t numcl=0;
  for(Int_t sec=0; sec<6; sec++) {
    if( nModules[sec] == 0 || &(*fLookUpTb)[sec]==0 ) continue;
    numcl+=(*fLookUpTb)[sec].findClusters(clFndrLevel[sec]);
  }
  return numcl;
}

 void HMdcTrackFinder::setMod34Levels(void) {  
  for(Int_t sec=0; sec<6; sec++) {
    HMdc34ClFinderSec& fSec=(*f34ClFinder)[sec];
    if( !(&fSec) ) continue;
    fSec.setMinBin(clFndrLevel[sec]);
  }
}

 Int_t HMdcTrackFinder::noFitClFndr34(void) {
  Int_t numcl=0;
  iterClus->Reset();
  for(Int_t sec=0; sec<6; sec++) {
    HMdc34ClFinderSec& fSec=(*f34ClFinder)[sec];
    if( !(&fSec) ) continue;
    if(fSec.notEnoughWires()) continue;
    locClus[0]=sec;
    iterClus->gotoLocation(locClus);
    HMdcClus* clus;
    while ((clus=(HMdcClus *)iterClus->Next())!=0) {
      Int_t typeClFn=clus->getTypeClFinder();
      Int_t mod=clus->getMod();
      if(typeClFn==1) {
        if(HMdcTrackDSet::modForSeg1 != mod) continue;
      } else if(typeClFn==2 && mod>=0) {
        //                                           mixFitCut for fit!
        if(clus->getNLayersMod(mod^1)<HMdcTrackDSet::mixClusCut) continue;
      }
      numcl+=fSec.findClustersSeg2(clus);
    }
  }
  return numcl;
}

 void HMdcTrackFinder::setNLayers(Int_t *lst) {
  HMdcTrackDSet::setTrFnNLayers(lst);
  for(Int_t sec=0; sec<6; sec++) {
    for(Int_t mod=0; mod<4; mod++) {
      if(lst[sec*4+mod]>3 && lst[sec*4+mod]<=6)
        listModules[sec][mod]=lst[sec*4+mod];
    }
  }
}

 void HMdcTrackFinder::setLevel(Int_t l4s1, Int_t l5s1, Int_t l4s2, Int_t l5s2) {
  HMdcTrackDSet::setTrFnLevel(l4s1,l5s1,l4s2,l5s2);
  level4[0]=l4s1; 
  level5[0]=l5s1; 
  level4[1]=l4s2; 
  level5[1]=l5s2;
}

 void HMdcTrackFinder::setLevelSeg1(Int_t l4, Int_t l5) {
  HMdcTrackDSet::setTrFnSegLevel(0,l4,l5);
  level4[0]=l4; 
  level5[0]=l5;
}

 void HMdcTrackFinder::setLevelSeg2(Int_t l4, Int_t l5) {
  HMdcTrackDSet::setTrFnSegLevel(1,l4,l5);
  level4[1]=l4; 
  level5[1]=l5;
}

 void HMdcTrackFinder::printStatus(void) {
  // prints the parameters to the screen
  char* hCoil ="0 = MagnetOn,  1 = MagnetOff";
  char* hType ="0 = combined chamber clusters, 1 = single cham. cl., 2 = mixed cl.(0+1)";
  char* hLevS1="max. occupancy of MDC for level of cl.finding 4 & 5 layers";
  char* hLevS2="max. occupancy of MDC for level of cl.finding 4 & 5 layers";
  Int_t* l=&listModules[0][0];
  printf("--------------------------------------------------------------------------------------------n");
  printf("HMdcTrackFinderSetup:n");
  printf("MagnetStatus    =  %i :  %sn",HMdcTrackDSet::isCoiloff,hCoil);
  printf("ClustFinderType =  %i :  %sn",HMdcTrackDSet::clFinderType,hType);  
  printf("LevelsSegment1  =  %i,%i  : %sn",level4[0],level5[0],hLevS1);
  printf("LevelsSegment2  =  %i,%i  : %sn",level4[1],level5[1],hLevS2);
  printf("NumLayersPerMod = {{%i,%i,%i,%i},n",l[ 0],l[ 1],l[ 2],l[ 3]);
  printf("                   {%i,%i,%i,%i},n",l[ 4],l[ 5],l[ 6],l[ 7]);
  printf("                   {%i,%i,%i,%i},n",l[ 8],l[ 9],l[10],l[11]);
  printf("                   {%i,%i,%i,%i},n",l[12],l[13],l[14],l[15]);
  printf("                   {%i,%i,%i,%i},n",l[16],l[17],l[18],l[19]);
  printf("                   {%i,%i,%i,%i}}n",l[20],l[21],l[22],l[23]);
  printf ("--------------------------------------------------------------------------------------------n");
  prntSt=kTRUE;
}

ClassImp(HMdcTrackFinder)


ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.