using namespace std;
#include <iostream>
#include <iomanip>
#include <hades.h>
#include <hcategory.h>
#include <hevent.h>
#include <heventheader.h>
#include <hiterator.h>
#include <hpidparticle.h>
#include "hgeantdef.h"
#include "hpairevtfilter.h"
ClassImp(HPairEvtFilter)
HPairEvtFilter::HPairEvtFilter(const Text_t *name,const Text_t *title,
TString opt,
Int_t nLower,
Int_t nUpper) :
HReconstructor(name,title)
{
filterOption=opt;
nLowerMult=nLower;
nUpperMult=nUpper;
zVertMin=-10000.;
zVertMax=10000.;
pCatPidParticle=0;
pIterPidParticle=0;
}
HPairEvtFilter::HPairEvtFilter(const Text_t *name,const Text_t *title,
TString opt,
Double_t zMin,
Double_t zMax) :
HReconstructor(name,title)
{
filterOption=opt;
nLowerMult=0;
nUpperMult=1000;
zVertMin=zMin;
zVertMax=zMax;
pCatPidParticle=0;
pIterPidParticle=0;
}
HPairEvtFilter::HPairEvtFilter()
{
}
HPairEvtFilter::~HPairEvtFilter(void)
{
}
Bool_t HPairEvtFilter::init()
{
if (gHades)
{
HEvent *event=gHades->getCurrentEvent();
if (event)
{
HCategory* pCatGeantKine=event->getCategory(catGeantKine);
if(pCatGeantKine) kIsReal = kFALSE;
else kIsReal = kTRUE;
if (kIsReal) cout<<"REAL event mode selected!"<<endl;
else cout<<"SIMULATION event mode selected!"<<endl;
if (filterOption.Contains("multrange"))
{
pCatPidParticle=event->getCategory(catPidPart);
if (!pCatPidParticle)
{
Error("init","No PIDPARTICLE category defined");
return kFALSE;
}
else pIterPidParticle = (HIterator*)getPidParticleCat()
->MakeIterator("native");
if (!pIterPidParticle)
{
Error("init","No PIDPARTICLE iterator defined");
return kFALSE;
}
}
}
resetCounters();
}
return kTRUE;
}
Bool_t HPairEvtFilter::finalize()
{
cout<<"************** EVT FILTER TASK *****************************"<<endl;
cout<<"Number of rejected evts: "<<nCounterNbRejectedEvts<<endl;
cout<<"Number of remaining evts: "
<<nCntProcessedEvents-nCounterNbRejectedEvts<<endl;
cout<<"Percentage of rejected evts: "
<<(((Float_t)nCounterNbRejectedEvts)/
((Float_t)nCntProcessedEvents))*100<<"%"<<endl;
cout<<"Percentage of accepted evts: "
<<100-(((Float_t)nCounterNbRejectedEvts)/
((Float_t)nCntProcessedEvents))*100<<"%"<<endl;
cout<<"************************************************************"<<endl;
return kTRUE;
}
Int_t HPairEvtFilter::execute()
{
nCntProcessedEvents++;
Int_t kReturnValue=0;
if (isDiscardedEvt(filterOption))
{
nCounterNbRejectedEvts++;
kReturnValue = kSkipEvent;
}
else if (isSkipNextTask(0)) kReturnValue = 1;
return kReturnValue;
}
void HPairEvtFilter::resetCounters()
{
nCntProcessedEvents=0;
nCounterNbRejectedEvts=0;
}
Bool_t HPairEvtFilter::isDiscardedEvt(TString opt)
{
Bool_t kBadParticleMultiplicityRange = kFALSE;
Bool_t kNotTargetRange = kFALSE;
Bool_t kNotFirstTarget = kFALSE;
Bool_t kNotSecondTarget = kFALSE;
if (opt.Contains("multrange"))
{
if (!isParticleMultRange()) kBadParticleMultiplicityRange = kTRUE;
}
if (opt.Contains("targetz"))
{
if (!isTargetZ(zVertMin, zVertMax)) kNotTargetRange = kTRUE;
}
else if (opt.Contains("target1"))
{
if (!isTarget(1)) kNotFirstTarget = kTRUE;
}
else if (opt.Contains("target2"))
{
if (!isTarget(2)) kNotSecondTarget = kTRUE;
}
Bool_t kIsDiscarded = kFALSE;
if (
kBadParticleMultiplicityRange ||
kNotTargetRange ||
kNotFirstTarget ||
kNotSecondTarget
) kIsDiscarded = kTRUE;
return kIsDiscarded;
}
Bool_t HPairEvtFilter::isSkipNextTask(Int_t swt)
{
Bool_t kSwitch=kFALSE;
switch (swt)
{
case 0:
break;
default:
kSwitch=kFALSE;
}
return kSwitch;
}
Bool_t HPairEvtFilter::isParticleMultRange()
{
Bool_t r=kFALSE;
Int_t nLC = 0;
HPidParticle* pPart = 0;
if (pIterPidParticle) pIterPidParticle->Reset();
else Error("isParticleMultRange","no valid iterator");
while ( (pPart = (HPidParticle*) pIterPidParticle->Next()) )
{
if (pPart->getPid()!=2 && pPart->getPid()!=3) nLC++;
}
if (nLC>=nLowerMult && nLC<=nUpperMult) r=kTRUE;
return r;
}
Bool_t HPairEvtFilter::isTarget(Int_t nTargetNumber)
{
Bool_t r=kFALSE;
Double_t dLimitFirstTarget = -25.;
Double_t dVertexZ = ( (HEventHeader*)
( (HEvent*)gHades->getCurrentEvent())->getHeader() )
-> getVertexZ();
if ( dVertexZ < dLimitFirstTarget && nTargetNumber == 1) r=kTRUE;
else if ( dVertexZ > dLimitFirstTarget && nTargetNumber == 1) r=kFALSE;
else if ( dVertexZ < dLimitFirstTarget && nTargetNumber == 2) r=kFALSE;
else if ( dVertexZ > dLimitFirstTarget && nTargetNumber == 2) r=kTRUE;
return r;
}
Bool_t HPairEvtFilter::isTargetZ(Double_t zMin, Double_t zMax)
{
Double_t dVertexZ = ( (HEventHeader*)
( (HEvent*)gHades->getCurrentEvent())->getHeader() )
-> getVertexZ();
if (zMin<=dVertexZ && dVertexZ<zMax) return kTRUE;
return kFALSE;
}
Last change: Sat May 22 13:06:09 2010
Last generated: 2010-05-22 13:06
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.