#include "hpidtrackfiller.h"
#include "piddef.h"
#include "hades.h"
#include "hevent.h"
#include "heventheader.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hdetector.h"
#include "hgeantdef.h"
#include "hbasetrack.h"
#include "hrichhit.h"
#include "hmdcseg.h"
#include "hpidtrackcand.h"
#include "hpidtrackcandsim.h"
#include "hpidfl.h"
#include "kickdef.h"
#include "richdef.h"
#include "hmdcdef.h"
#include "tofdef.h"
#include "showertofinodef.h"
#include "hmdctrackgdef.h"
#include "hmetamatch.h"
#include "hruntimedb.h"
#include "hshowerhittoftrack.h"
#include <iostream>
#include "hpidtrackfillerpar.h"
#include "showertofinodef.h"
#include "hshowerhittof.h"
#include "htofhit.h"
#include "hmdctrkcand.h"
#include "hpidmdcfunc.h"
#include "TVector3.h"
#define DEF_ARRAY_SIZE 10000
#define SAFE_DELETE(A) { if(A) { delete (A); A = NULL; }}
ClassImp(HPidTrackFiller)
HPidTrackFiller::HPidTrackFiller(const Option_t par[])
: HReconstructor("PidTrackFiller", "PID track candidate filler")
{
setDefault();
setMatchingConditions(par);
}
HPidTrackFiller::HPidTrackFiller(const Text_t name[],const Text_t title[],const Option_t par[])
: HReconstructor(name, title)
{
setDefault();
setMatchingConditions(par);
}
HPidTrackFiller::~HPidTrackFiller(void)
{
SAFE_DELETE(pitCand);
SAFE_DELETE(pitMatch);
}
void HPidTrackFiller::setMatchingConditions(const Option_t par[])
{
TString s = par;
s.ToUpper();
bSkipNoLepton = (strstr(s.Data(), "SKIPNOLEPTON") != NULL);
bSkipTofinoMult = (strstr(s.Data(), "SKIPTOFINOMULT") != NULL);
bNoChi2Selection[0] = (strstr(s.Data(), "NOCHI2SEG0") != NULL);
bNoChi2Selection[1] = (strstr(s.Data(), "NOCHI2SEG1") != NULL);
bSkipNoOuterSegAndNoMeta = (strstr(s.Data(), "SKIPNOOUTERSEGANDNOMETA") != NULL);
}
Bool_t HPidTrackFiller::reinit(void)
{
if(bInitOk == kFALSE)
Warning("reinit", "init() didn't succeed");
else
bInitOk = kTRUE;
return kTRUE;
}
Bool_t HPidTrackFiller::init(void)
{
meanDevChange=0.0;
nShifts=0;
HEvent *pEvent;
bInitOk = kFALSE;
if(gHades == NULL)
{
Error("init", "gHades == NULL");
return kFALSE;
}
if((pEvent = gHades->getCurrentEvent()) == NULL)
{
Error("init", "gHades->getCurrentEvent() == NULL");
return kFALSE;
}
HCategory* pGeantKineCat = pEvent->getCategory(catGeantKine);
if(pGeantKineCat) bMakeSimCategory = kTRUE;
else bMakeSimCategory = kFALSE;
SAFE_DELETE(pitMatch);
SAFE_DELETE(pitCand);
if((pCatMatch = pEvent->getCategory(catMetaMatch)) == NULL)
{
Error("init", "No catMetaMatch");
return kFALSE;
}
if((pCatTrkCand = pEvent->getCategory(catMdcTrkCand)) == NULL){
Error("init", "No catMdcTrkCand");
return kFALSE;
}
if((pCatMdcSeg = pEvent->getCategory(catMdcSeg)) == NULL){
Error("init", "No catMdcSeg");
return kFALSE;
}
if(bMakeSimCategory)
{
if((pCatTof = pEvent->getCategory(catTofHit)) == NULL){
Error("init", "No catTofHit");
return kFALSE;
}
if((pCatShower = pEvent->getCategory(catShowerHitTofTrack)) == NULL){
Error("init", "No catShowerHitTofTrack");
return kFALSE;
}
}
else
{
if((pCatTof = pEvent->getCategory(catTofHit)) == NULL){
Error("init", "No catTofHit");
return kFALSE;
}
if((pCatShower = pEvent->getCategory(catShowerHitTof)) == NULL){
Error("init", "No catShowerHitTof");
return kFALSE;
}
}
if((pitMatch = (HIterator *)pCatMatch->MakeIterator()) == NULL)
{
Error("init", "Cannot make catMetaMatch category iterator");
return kFALSE;
}
if((pCatCand = buildOutputCategory()) == NULL)
{
Error("init", "Cannot build PidTrackCand Category");
return kFALSE;
}
if((pitCand = (HIterator *)pCatCand->MakeIterator()) == NULL)
{
Error("init", "Cannot make an iterator for PidTrack Category");
return kFALSE;
}
if((pTrackFillerParam = (HPidTrackFillerPar *)gHades->getRuntimeDb()
->getContainer(HPIDTRACKFILLERPAR_NAME)) == NULL)
{
Error("init", "Cannot get parameters: %s", HPIDTRACKFILLERPAR_NAME);
return kFALSE;
}
bInitOk = kTRUE;
return kTRUE;
}
HCategory* HPidTrackFiller::buildOutputCategory(void)
{
HCategory* pOutCat;
if(bMakeSimCategory)
{
pOutCat = HPidTrackCandSim::buildPidTrackCandCategory();
}
else
pOutCat = HPidTrackCand::buildPidTrackCandCategory();
return pOutCat;
}
Int_t HPidTrackFiller::execute(void)
{
Bool_t bIsLeptonEvent = kFALSE;
Float_t shift=0.0;
Bool_t hasCorrelatedRing[MAX_MOM_ALGS];
for(Int_t i=0;i<MAX_MOM_ALGS;i++)
{
hasCorrelatedRing[i]=kFALSE;
}
HMetaMatch* pMatch=NULL;
HPidTrackCand *pCand=NULL;
if(bInitOk == kFALSE)
{
Error("execute", "Class not initialized");
return -1;
}
pCatCand->Clear();
pitMatch->Reset();
while((pMatch = (HMetaMatch *)pitMatch->Next()) != NULL)
{
for(Int_t i=0;i<MAX_MOM_ALGS;i++)
{
hasCorrelatedRing[i]=kFALSE;
}
Bool_t isCPCand = kFALSE;
Bool_t isMomAccepted = kFALSE;
Int_t nTrCand = pMatch->getTrkCandInd();
if(nTrCand > -1)
{
HMdcTrkCand* pTrkCand = (HMdcTrkCand *)pCatTrkCand->getObject(nTrCand);
if(NULL != pTrkCand){
if(pTrkCand->getSeg1Ind() >= 0 &&
pTrkCand->getSeg2Ind() < 0 &&
pMatch->getSystem() < 0) { isCPCand = kTRUE; }
} else {
Error("execute()","NULL pointer received for HMdcTrkCand !");
}
} else {
Error("execute()","No valid index for HMdcTrkCand !");
}
if(pMatch->isKickAccepted() || pMatch->isSplineAccepted() || pMatch->isRungeKuttaAccepted()){
isMomAccepted = kTRUE;
}
if(!isCPCand && !isMomAccepted ) { continue; }
if( isCPCand && bSkipNoOuterSegAndNoMeta) { continue; }
nTotalTrack++;
Bool_t ok=checkChi2(pMatch);
(ok)?nAccTrack++:nRejTrack++;
if((!bNoChi2Selection[0] || !bNoChi2Selection[1]) && (!checkChi2(pMatch))){
continue;
}
if((bSkipTofinoMult) && ( ! checkTofinoMult(pMatch)))
continue;
pCand = getNextSlot(pMatch);
if( pCand->getHitData()->getFlagRICH())
{
shift = correctRingShift(pCand);
nShifts++;
meanDevChange+=shift;
}
assignRingCorrelations(pCand);
assignMetaCorrelations(pCand);
if(bIsLeptonEvent==kFALSE && bSkipNoLepton==kTRUE)
bIsLeptonEvent=checkForLepton(pMatch);
}
pitCand->Reset();
HPidTrackCand* currentCandidate=NULL;
Float_t tmpOpangle=180.0;
while((currentCandidate = (HPidTrackCand*)pitCand->Next()) != NULL)
{
tmpOpangle = 180.0;
if( !(currentCandidate->getHitData()->getFlagRICH()) )
{
continue;
}
pitMatch->Reset();
while( (pMatch = (HMetaMatch *)pitMatch->Next()) != NULL)
{
if(pCatMatch->getIndex(pMatch) == currentCandidate->getHitData()->iIndMatch)
{
continue;
}
HMdcTrkCand* pMMTrkCand = HPidFL::getMdcTrkCand(pMatch->getTrkCandInd());
if(pMMTrkCand->getSeg1Ind()<0)
{
Error("HPidTrackFiller::execute","There was a trk-cand object withou valid inner segment index!");
exit(-1);
}
if(currentCandidate->getHitData()->iIndInnerSeg==pMMTrkCand->getSeg1Ind())
{
continue;
}
HMdcSeg* pMMSeg = HPidFL::getMdcSeg(pMMTrkCand->getSeg1Ind());
tmpOpangle=getAngularDistance(pMatch, currentCandidate);
if(tmpOpangle>25)
{
continue;
}
if(pMatch->getARichInd(0)<0)
{
tmpOpangle+=1000;
}
if(pMMSeg->getChi2()<0)
{
tmpOpangle*=-1;
}
currentCandidate->getTrackData()->appendCloseTracklet(tmpOpangle,
HPidMdcFunc::getMdcClusInfoIndexBySegment(pMMSeg,0),
HPidMdcFunc::getMdcClusInfoIndexBySegment(pMMSeg,1));
}
}
if((bSkipNoLepton == kTRUE) && (bIsLeptonEvent == kFALSE))
return kSkipEvent;
return 0;
}
Float_t HPidTrackFiller::getAngularDistance(HMetaMatch* pMatch, HPidTrackCand* pCand)
{
TVector3 vecCandidate;
TVector3 vecMetaMatch;
HMdcTrkCand* pMdcTrackCand = HPidFL::getMdcTrkCand(pMatch->getTrkCandInd());
HMdcSeg* pMMSeg = HPidFL::getMdcSeg(pMdcTrackCand->getSeg1Ind());
if(pCand->getHitData()->iIndInnerSeg==pMdcTrackCand->getSeg1Ind())
{
Error("HPidTrackFiller::getAngularDistance()",
"The current candidate and the MetaMatch we comare it to have the same segment index. This should be intercepted!");
exit(-1);
}
Float_t fThetaMM = HPidFL::getMdcTheta( pMMSeg->getTheta());
Float_t fThetaCND = pCand->getHitData()->fMdcTheta;
Float_t fPhiMM = HPidFL::getMdcPhi( pMMSeg->getSec(),pMMSeg->getPhi());
Float_t fPhiCND = pCand->getHitData()->fMdcPhi;
vecCandidate.SetMagThetaPhi(1.0,fThetaCND*TMath::DegToRad(),fPhiCND*TMath::DegToRad());
vecMetaMatch.SetMagThetaPhi(1.0,fThetaMM*TMath::DegToRad() ,fPhiMM*TMath::DegToRad());
Float_t fAngularDifference=TMath::RadToDeg()*vecCandidate.Angle(vecMetaMatch);
return fAngularDifference;
}
Float_t HPidTrackFiller::correctRingShift(HPidTrackCand* pCand)
{
Float_t PolynomialCoeff[8];
Float_t RingShift=0.0;
HPidHitData* pHitData = pCand->getHitData();
Float_t thetaRich=pHitData->fRichTheta;
Float_t diffbefore=TMath::Abs(pHitData->getDeltaThetaMDCRICH());
getPolynomialCoefficients(PolynomialCoeff, pCand->getHitData()->nSector);
for(Int_t i=0;i<8;i++)
{
RingShift+=(Float_t)(PolynomialCoeff[i]*TMath::Power(thetaRich,i));
}
pHitData->fRichTheta+=RingShift;
Float_t diffafter=TMath::Abs(pHitData->getDeltaThetaMDCRICH());
return diffbefore-diffafter;
}
void HPidTrackFiller::getPolynomialCoefficients(Float_t* coefficients,Int_t sector)
{
Float_t VertexZCoord=0.0;
VertexZCoord=gHades->getCurrentEvent()->getHeader()->getVertexZ();
pTrackFillerParam->getPolynomialCoeff(sector,VertexZCoord, coefficients);
}
void HPidTrackFiller::assignRingCorrelations(HPidTrackCand* pCand)
{
HPidHitData* pHitData = pCand->getHitData();
HPidTrackData* pTrackData = pCand->getTrackData();
if(!pHitData->getFlagRICH()) return;
Float_t dThetaMDCRICH=pHitData->getDeltaThetaMDCRICH();
Float_t dPhiMDCRICH=pHitData->getDeltaPhiMDCRICH();
Float_t dThetaRKRICH=-99.0;
Float_t dPhiRKRICH=-99.0;
if(pTrackData->getRKTrackInd()>=0)
{
dThetaRKRICH=pHitData->getDeltaThetaRKRICH(pTrackData->getRKTheta());
dPhiRKRICH=pHitData->getDeltaPhiRKRICH(pTrackData->getRKPhi(),pTrackData->getRKTheta());
pTrackData->setRKRichMatchingQuality( sqrt( dThetaRKRICH * dThetaRKRICH + dPhiRKRICH * dPhiRKRICH));
}
Int_t sector = pHitData->nSector;
for(Int_t AlgCounter=0;AlgCounter<MAX_MOM_ALGS;AlgCounter++)
{
pCand->getHitData()->hasRingCorrelation[AlgCounter]=kFALSE;
if(pTrackData->bIsAccepted[AlgCounter])
{
if(AlgCounter==ALG_RUNGEKUTTA)
{
if( dPhiRKRICH > pTrackFillerParam->getDeltaPhiMin(sector, pTrackData->fMomenta[AlgCounter]) &&
dPhiRKRICH < pTrackFillerParam->getDeltaPhiMax(sector, pTrackData->fMomenta[AlgCounter]) &&
dThetaRKRICH > pTrackFillerParam->getDeltaThetaMin(sector, pTrackData->fMomenta[AlgCounter]) &&
dThetaRKRICH < pTrackFillerParam->getDeltaThetaMax(sector, pTrackData->fMomenta[AlgCounter]) )
{
pCand->getHitData()->hasRingCorrelation[AlgCounter]=kTRUE;
}
}
else
{
if( dPhiMDCRICH > pTrackFillerParam->getDeltaPhiMin(sector, pTrackData->fMomenta[AlgCounter]) &&
dPhiMDCRICH < pTrackFillerParam->getDeltaPhiMax(sector, pTrackData->fMomenta[AlgCounter]) &&
dThetaMDCRICH > pTrackFillerParam->getDeltaThetaMin(sector, pTrackData->fMomenta[AlgCounter]) &&
dThetaMDCRICH < pTrackFillerParam->getDeltaThetaMax(sector, pTrackData->fMomenta[AlgCounter]) ){
pCand->getHitData()->hasRingCorrelation[AlgCounter]=kTRUE;
}
}
}
}
}
void HPidTrackFiller::assignMetaCorrelations(HPidTrackCand* pCand)
{
HPidTrackData* pTrackData = pCand->getTrackData();
HPidHitData* pHitData = pCand->getHitData();
Int_t sector = pHitData->getSector();
Short_t system = pHitData->getSystem();
if(system<0)
{
return;
}
Float_t dxRkMeta=-pTrackData->getRkMetadx();
Float_t dyRkMeta=-pTrackData->getRkMetady();
Float_t dxMdcMeta=pTrackData->getMdcMetadx();
Float_t dyMdcMeta=pTrackData->getMdcMetady();
for(Int_t AlgCounter=0;AlgCounter<MAX_MOM_ALGS;AlgCounter++)
{
if(pTrackData->bIsAccepted[AlgCounter])
{
if(AlgCounter==ALG_RUNGEKUTTA)
{
if(
dxRkMeta>pTrackFillerParam->getDeltaRkMetaXMin(sector,system) &&
dxRkMeta<pTrackFillerParam->getDeltaRkMetaXMax(sector,system) &&
dyRkMeta>pTrackFillerParam->getDeltaRkMetaYMin(sector,system) &&
dyRkMeta<pTrackFillerParam->getDeltaRkMetaYMax(sector,system)
)
{
pCand->getHitData()->setMetaTrackCorrelation(AlgCounter,kTRUE);
}
}
else
{
if(
dxMdcMeta>pTrackFillerParam->getDeltaMdcMetaXMin(sector,system) &&
dxMdcMeta<pTrackFillerParam->getDeltaMdcMetaXMax(sector,system) &&
dyMdcMeta>pTrackFillerParam->getDeltaMdcMetaYMin(sector,system) &&
dyMdcMeta<pTrackFillerParam->getDeltaMdcMetaYMax(sector,system)
)
{
pCand->getHitData()->setMetaTrackCorrelation(AlgCounter,kTRUE);
}
}
}
}
}
Bool_t HPidTrackFiller::checkForLepton(HMetaMatch* pMatch)
{
if(pMatch->getARichInd(0)>-1)
return kTRUE;
else
return kFALSE;
}
Bool_t HPidTrackFiller::finalize(void)
{
meanDevChange/=nShifts;
cout <<"Mean change in deviation per ring:" << meanDevChange << endl;
print();
printf("------------------------------------------------------\n");
printf("HPidTrackFiller Chi^2 cut\n");
printf("Total tracks: %d. Accepted: %d. Rejected: %d\n",
nTotalTrack,nAccTrack,nRejTrack);
printf("Ratio: %f\n",nAccTrack/(float)nTotalTrack);
printf("------------------------------------------------------\n");
if(bMakeSimCategory)
{
cout <<"NUMBER OF NO-PARENT-TRACKS: " << HPidGeantTrackSet::nullparent << endl;
}
return kTRUE;
}
void HPidTrackFiller::setDefault(void)
{
pCatMatch = NULL;
pCatCand = NULL;
pCatTrkCand = NULL;
pCatTof = NULL;
pCatShower = NULL;
pCatMdcSeg = NULL;
lTrack.set(1, 0);
pitMatch = NULL;
pitCand = NULL;
pTrackFillerParam = NULL;
bSkipNoLepton = kFALSE;
bSkipTofinoMult = kFALSE;
bNoChi2Selection[0] = kFALSE;
bNoChi2Selection[1] = kFALSE;
bSkipNoOuterSegAndNoMeta = kFALSE;
bInitOk = kFALSE;
nAccTrack=nRejTrack=nTotalTrack=nShifts=0;
meanDevChange = 0.0;
}
HPidTrackCand* HPidTrackFiller::getNextSlot(void)
{
HPidTrackCand *pOut = NULL;
static HLocation locDummy;
if(pCatCand == NULL)
{
Error("getNextSlot", "Output category not set: use init/reinit");
return NULL;
}
if((pOut = (HPidTrackCand *) pCatCand->getNewSlot(locDummy)) == NULL)
{
Error("getNextSlot", "No new slot");
return NULL;
}
return new(pOut) HPidTrackCand;
}
HPidTrackCand* HPidTrackFiller::getNextSlot(HMetaMatch *pMatch)
{
Int_t iMatchIndex = pCatMatch->getIndex(pMatch);
HPidTrackCand *pOut = NULL;
static HLocation locDummy;
if(pCatCand == NULL)
{
Error("getNextSlot", "Output category not set: use init/reinit");
return NULL;
}
if((pOut = (HPidTrackCand *) pCatCand->getNewSlot(locDummy)) == NULL)
{
Error("getNextSlot", "No new slot");
return NULL;
}
if(bMakeSimCategory)
{
return new (pOut) HPidTrackCandSim(pMatch, iMatchIndex);
}
else
{
return new(pOut) HPidTrackCand(pMatch,iMatchIndex);
}
}
Bool_t HPidTrackFiller::checkTofinoMult(HMetaMatch *pMatch)
{
HShowerHitTof *pShwTof = NULL;
HShowerHitTofTrack *pShwTofTrack = NULL;
if(pMatch->getSystem() != 0)
return kTRUE;
if(pMatch->getMetaHitInd() < 0)
{
::Error("HPidTrackFiller::checkTofinoMult","Invalid MetaMatch index %d",pMatch->getMetaHitInd());
return kFALSE;
}
if(HPidFL::getCategory(catShowerHitTof) && !bMakeSimCategory)
{
pShwTof = HPidFL::getShowerHitTof(pMatch->getMetaHitInd());
if(pShwTof == NULL)
{
Error("checkTofinoMult", "Cannot get HShowerHitTof %d" ,
pMatch->getMetaHitInd());
return kFALSE;
}
if(pShwTof->getTofinoMult() <= 1)
return kTRUE;
}
else if (HPidFL::getCategory(catShowerHitTofTrack) && bMakeSimCategory)
{
pShwTofTrack = HPidFL::getShowerHitTofTrack(pMatch->getMetaHitInd());
if(pShwTofTrack == NULL)
{
Error("checkTofinoMult", "Cannot get HShowerHitTofTrack %d" ,
pMatch->getMetaHitInd());
return kFALSE;
}
if(pShwTofTrack->getTofinoMult() <= 1)
return kTRUE;
}
else
::Error("HPidTrackFiller::checkTofinoMult","No ShowerHitTofCategory present!");
return kFALSE;
}
Bool_t HPidTrackFiller::checkChi2(HMetaMatch *pMatch){
HMdcTrkCand *pTrkCand = NULL;
HMdcSeg *pMdcSeg1 = NULL;
HMdcSeg *pMdcSeg2 = NULL;
Float_t fChi2In = 0.;
Float_t fChi2Out = 0.;
Int_t nSeg1Ind = -1;
Int_t nSeg2Ind = -1;
Int_t nTrCand = pMatch->getTrkCandInd();
if(nTrCand>-1)
{
pTrkCand = (HMdcTrkCand *)pCatTrkCand->getObject(nTrCand);
if( NULL!= pTrkCand ){
nSeg1Ind = pTrkCand->getSeg1Ind();
nSeg2Ind = pTrkCand->getSeg2Ind();
pMdcSeg1 = (HMdcSeg*)pCatMdcSeg->getObject(nSeg1Ind);
pMdcSeg2 = (HMdcSeg*)pCatMdcSeg->getObject(nSeg2Ind);
if( NULL != pMdcSeg1 && !bNoChi2Selection[0]){
fChi2In = pMdcSeg1->getChi2();
}
if( NULL != pMdcSeg2 && !bNoChi2Selection[1]){
fChi2Out = pMdcSeg2->getChi2();
}
}
}
else
{
Error("checkChi2","TrkCandInd not found");
}
if( fChi2In<0 || fChi2Out <0 )
{
return kFALSE;
}
return kTRUE;
}
void HPidTrackFiller::print(void) const
{
printf("HPidTrackFiller:\n");
printf("SKIPNOLEPTON : %s\n", (bSkipNoLepton) ? "YES" : "NO");
printf("SKIPTOFNIOMULT : %s\n", (bSkipTofinoMult) ? "YES" : "NO");
printf("NOCHI2SEG0: %s\n", (bNoChi2Selection[0]) ? "YES" : "NO");
printf("NOCHI2SEG1: %s\n", (bNoChi2Selection[1]) ? "YES" : "NO");
printf("SKIPNOOUTERSEGANDNOMETA: %s\n", (bSkipNoOuterSegAndNoMeta) ? "YES" : "NO");
}
Last change: Sat May 22 13:07:35 2010
Last generated: 2010-05-22 13:07
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.