#include "hmdctrackfinder.h"
#include "hmdctrackddef.h"
#include "hiterator.h"
#include "hcategory.h"
#include "hmdcgetcontainers.h"
#include "hmdcclussim.h"
#include "hmdclookuptb.h"
#include "hmdc34clfinder.h"
#include "hmdctrackdset.h"
#include "hmdclistcells.h"
#include "hmdcgeanttrack.h"
HMdcTrackFinder::HMdcTrackFinder(Bool_t isCOff, Int_t typeClFn) {
HMdcTrackDSet::setMdcTrackFinder(isCOff,typeClFn);
setParContainers();
}
HMdcTrackFinder::HMdcTrackFinder(const Text_t *name, const Text_t *title,
Bool_t isCOff, Int_t typeClFn) : HReconstructor(name,title) {
HMdcTrackDSet::setMdcTrackFinder(isCOff,typeClFn);
setParContainers();
}
HMdcTrackFinder::HMdcTrackFinder(void) {
setParContainers();
}
HMdcTrackFinder::HMdcTrackFinder(const Text_t *name, const Text_t *title) :
HReconstructor(name,title) {
setParContainers();
}
HMdcTrackFinder::~HMdcTrackFinder() {
HMdcEvntListCells::deleteCont();
HMdcGeantEvent::deleteCont();
HMdcLookUpTb::deleteCont();
HMdc34ClFinder::deleteCont();
HMdcTrackDSet::clearPTrackFinder();
if(iterClus) {
delete iterClus;
iterClus = 0;
}
}
void HMdcTrackFinder::setParContainers() {
HMdcTrackDSet::setTrackFinder(this);
event = 0;
isMdcLCellsOwn = kFALSE;
geantEvent = 0;
isGeantEventOwn = kFALSE;
prntSt = kFALSE;
isInitialised = kFALSE;
fLookUpTb = NULL;
f34ClFinder = NULL;
level4[0] = HMdcTrackDSet::getLevel4(0);
level5[0] = HMdcTrackDSet::getLevel5(0);
level4[1] = HMdcTrackDSet::getLevel4(1);
level5[1] = HMdcTrackDSet::getLevel5(1);
fClusCat = NULL;
iterClus = NULL;
perMdcClus = kFALSE;
nBinXS1 = 319;
nBinYS1 = -1;
locClus.set(2,0,0);
locNewCl.set(3,0,0,0);
for(Int_t sec=0; sec<6; sec++) {
nModules[sec]=0;
for(Int_t mod=0; mod<4; mod++) numLayers[sec][mod]=
HMdcTrackDSet::getNLayersInMod(sec,mod);
}
}
Bool_t HMdcTrackFinder::init(void) {
if(event == 0) event = HMdcEvntListCells::getObject(isMdcLCellsOwn);
if(geantEvent == 0) geantEvent = HMdcGeantEvent::getObject(isGeantEventOwn);
fClusCat = HMdcGetContainers::getObject()->getCatMdcClus(kTRUE);
if( !fClusCat ) return kFALSE;
fClusCat->setPersistency(perMdcClus);
iterClus = (HIterator *)fClusCat->MakeIterator();
if(HMdcLookUpTb::getExObject() == 0) {
fLookUpTb = HMdcLookUpTb::getObject();
fLookUpTb->setPar(nBinXS1,HMdcTrackDSet::isCoilOff(),nBinYS1);
}
f34ClFinder = (HMdcTrackDSet::isCoilOff()) ? 0 : HMdc34ClFinder::getObject();
if(!prntSt) printStatus();
return kTRUE;
}
Bool_t HMdcTrackFinder::reinit(void) {
if(!fLookUpTb->initContainer()) return kFALSE;
if( f34ClFinder && !f34ClFinder->initContainer(*event) ) return kFALSE;
Int_t typeClFinder = HMdcTrackDSet::getClFinderType();
if( isInitialised ) return kTRUE;
fLookUpTb->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]++;
fLookUpTbMod->setNLayers(numLayers[sec][mod]);
} else numLayers[sec][mod]=0;
}
HMdc34ClFinderSec* f34ClFinderSec = f34ClFinder ? &((*f34ClFinder)[sec]):0;
if(f34ClFinderSec) f34ClFinderSec->setTypeClFinder(typeClFinder);
for(Int_t mod=nModsF; mod<4; mod++) {
if(f34ClFinderSec!=0 && (&((*f34ClFinderSec)[mod]))!=0) nModules[sec]++;
else numLayers[sec][mod]=0;
}
}
isClustToHit = HMdcTrackDSet::getMdcClusterToHit() != NULL;
isInitialised = kTRUE;
return kTRUE;
}
void HMdcTrackFinder::setPersistency(Bool_t perCl) {
perMdcClus=perCl;
if(fClusCat) fClusCat->setPersistency(perMdcClus);
}
Int_t HMdcTrackFinder::execute(void) {
Int_t nFiredWires = 0;
if(isMdcLCellsOwn) {
event->clear();
nFiredWires = event->collectWires();
} else nFiredWires = event->getNCells();
if(isGeantEventOwn) geantEvent->collectTracks();
if(nFiredWires<3) return 0;
calcClFndrLevel();
Int_t numcl=clFndrBeforField();
if(f34ClFinder) {
f34ClFinder->clear();
setMod34Levels();
if(isClustToHit) numcl += noFitClFndr34();
}
if(geantEvent && isClustToHit) sortTracksInClusters();
return 0;
}
void HMdcTrackFinder::calcClFndrLevel(void) {
for(Int_t sec=0; sec<6; sec++) {
Int_t* levelSec=clFndrLevel[sec];
for(Int_t mod=0; mod<4; mod++) {
levelSec[mod]=numLayers[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(numLayers[sec][mod]<4) {
levelSec[mod]=numLayers[sec][mod]-1;
if(levelSec[mod]<0) levelSec[mod]=0;
}
}
}
}
}
}
Int_t HMdcTrackFinder::clFndrBeforField(void) {
(*fLookUpTb).clear();
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::getModForSeg1() != mod) continue;
} else if(typeClFn==2 && mod>=0) {
if(clus->getNLayersMod(mod^1)<HMdcTrackDSet::getMixClusCut()) continue;
}
numcl+=fSec.findClustersSeg2(clus);
}
}
return numcl;
}
void HMdcTrackFinder::sortTracksInClusters(void) {
iterClus->Reset();
HMdcClusSim* clusSim;
while ((clusSim=(HMdcClusSim*)iterClus->Next())!=0)
clusSim->sortTrListByContr();
}
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)
numLayers[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) {
const Char_t* hCoil ="0 = MagnetOn, 1 = MagnetOff";
const Char_t* hType ="0 = combined chamber clusters, 1 = single cham. cl., 2 = mixed cl.(0+1)";
const Char_t* hLevS1="max. occupancy of MDC for level of cl.finding 4 & 5 layers";
const Char_t* hLevS2="max. occupancy of MDC for level of cl.finding 4 & 5 layers";
Int_t* l=&numLayers[0][0];
printf("--------------------------------------------------------------------------------------------\n");
printf("HMdcTrackFinderSetup:\n");
printf("MagnetStatus = %i : %s\n",HMdcTrackDSet::isCoilOff(),hCoil);
printf("ClustFinderType = %i : %s\n",HMdcTrackDSet::getClFinderType(),hType);
printf("LevelsSegment1 = %i,%i : %s\n",level4[0],level5[0],hLevS1);
printf("LevelsSegment2 = %i,%i : %s\n",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)
Last change: Sat May 22 13:03:55 2010
Last generated: 2010-05-22 13:03
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.