#pragma implementation
#include "hpidalgmomvsbeta.h"
#include "hpidtrackcand.h"
#include "hpidreconstructor.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hpidalgmomvsbetapar.h"
#include "hpidphysicsconstants.h"
#include "hpidgaussconf.h"
#include "hshowerhittof.h"
#include "hshowerhittoftrack.h"
#include <hkicktrack.h>
#define MAX_FAKES_BETA 1.0
ClassImp(HPidAlgMomVsBeta)
const Float_t HPidAlgMomVsBeta::kDefMinBkg = 0.0f;
const Float_t HPidAlgMomVsBeta::kDefMaxGaussDev = 3.0f;
HPidAlgMomVsBeta::HPidAlgMomVsBeta(void)
: HPidAlgorithm("PidAlgMomVsBeta", algMomVsBeta)
{
fMinBkg = kDefMinBkg;
fMaxGaussDev = kDefMaxGaussDev;
}
HPidAlgMomVsBeta::HPidAlgMomVsBeta(Float_t fWeight)
: HPidAlgorithm("PidAlgMomVsBeta", algMomVsBeta, fWeight)
{
fMinBkg = kDefMinBkg;
fMaxGaussDev = kDefMaxGaussDev;
}
Bool_t HPidAlgMomVsBeta::init(void)
{
if((pParams = (HPidAlgMomVsBetaPar *)gHades->getRuntimeDb()
->getContainer(PIDALGMOMVSBETAPAR_NAME)) == NULL)
{
Error("init", "Cannot get parameters: %s", PIDALGMOMVSBETAPAR_NAME);
return kFALSE;
}
pParams->setContext(pRec->iSelectedMomAlg);
return kTRUE;
}
Bool_t HPidAlgMomVsBeta::reinit(void)
{
return pParams->checkContext(pRec->iSelectedMomAlg);
}
Bool_t HPidAlgMomVsBeta::finalize(void)
{
return kTRUE;
}
Bool_t HPidAlgMomVsBeta::calculatePDF(HPidTrackCand *pTrack,
Float_t afReturn[], Short_t &nCatIndex)
{
HPidTrackData *pTrackData = pTrack->getTrackData();
HPidHitData *pHitData = pTrack->getHitData();
if(pHitData->iIndTOF < 0)
{
}
static Float_t SQRT_2PI = TMath::Sqrt(2.0 * TMath::Pi());
Int_t iSelectedMomAlg = pRec->iSelectedMomAlg;
Float_t fCharge = pTrackData->nPolarity[iSelectedMomAlg];
Int_t iSys = pHitData->iSystem;
Int_t iSect = pHitData->nSector;
Float_t fMom = pTrackData->fMomenta[iSelectedMomAlg];
Float_t fTheta = pHitData->fMdcTheta;
Float_t fBeta = pTrackData->getBeta(iSelectedMomAlg);
if (pTrackData->nTofRecFlag[iSelectedMomAlg]==-1)
{
return kFALSE;
}
Float_t f;
Int_t particleId;
Float_t fParams[3];
Int_t k, particle_counter;
if(fCharge==0) cout << "undefined charge!" << endl ;
for( particle_counter = 0; particle_counter < pRec->particlesNumber(); particle_counter++)
{
particleId = pRec->getParticleId(particle_counter);
if(fCharge != HPidPhysicsConstants::charge(particleId))
{
afReturn[particle_counter] = 0.0f;
continue;
}
if( ! HPidPhysicsConstants::isFake(particleId))
{
for(k = 0; k < 2; k++)
{
fParams[k] = pParams->getParameterValue( particleId, 3 * iSys + k, iSect,
fMom, fTheta);
}
if(fParams[1] <= 0.0f)
{
if(fParams[1] < 0.0f)
{
Error("calculatePDF", "Wrong sigma value for gauss distr. "
"%d %d %d %f %f = %f",
particleId, 3 * iSys + 1, iSect, fMom, fTheta, fParams[1]);
}
afReturn[particle_counter] = 0.0f;
continue;
}
f = (fBeta - fParams[0]) / fParams[1];
if(iSys==1 && (fMaxGaussDev > 0.0f) && (TMath::Abs(f) > fMaxGaussDev)){
afReturn[particle_counter] = 0.0f;
}
else if (iSys==0 && (fMaxGaussDev > 0.0f) && (TMath::Abs(f) > fMaxGaussDev) && fBeta < 1.){
afReturn[particle_counter] = 0.0f;
}
else
{
afReturn[particle_counter] = TMath::Exp(-0.5 * f * f)
/ (SQRT_2PI * fParams[1]);
}
}
else
{
for(k = 0; k < 3; k++)
{
fParams[k] = pParams->getParameterValue(particleId, 3 * iSys + k, iSect,
fMom, fTheta);
}
afReturn[particle_counter] = fParams[0] + fParams[1] * fBeta
+ fParams[2] * fBeta * fBeta;
if(afReturn[particle_counter] < fMinBkg)
afReturn[particle_counter] = fMinBkg;
}
}
return kTRUE;
}
Bool_t HPidAlgMomVsBeta::calculateCL(HPidTrackCand *pTrack,
Float_t afReturn[], Short_t &nCatIndex)
{
HPidTrackData *pTrackData = pTrack->getTrackData();
HPidHitData *pHitData = pTrack->getHitData();
if(pHitData->iIndTOF < 0)
{
return kTRUE;
}
Int_t iSelectedMomAlg = pRec->iSelectedMomAlg;
Float_t fCharge = pTrackData->nPolarity[iSelectedMomAlg];
Int_t iSys = pHitData->iSystem;
Int_t iSect = pHitData->nSector;
Float_t fMom = pTrackData->fMomenta[iSelectedMomAlg];
Float_t fTheta = pHitData->fMdcTheta;
Float_t fBeta = pTrackData->getBeta(iSelectedMomAlg);
Int_t particleId;
Float_t fParams[3];
Int_t k, particle_counter;
for(particle_counter = 0; particle_counter < pRec->particlesNumber(); particle_counter++)
{
particleId = pRec->getParticleId(particle_counter);
if(HPidPhysicsConstants::isFake(particleId))
{
afReturn[particle_counter] = -1.0f;
continue;
}
if(fCharge != HPidPhysicsConstants::charge(particleId))
{
afReturn[particle_counter] = -2.0f;
continue;
}
for(k = 0; k < 2; k++)
{
fParams[k] = pParams->getParameterValue(particleId, 3 * iSys + k, iSect,
fMom, fTheta);
}
if(fParams[1] <= 0.0f)
{
if(fParams[1] < 0.0f)
{
Error("calculateCL", "Wrong sigma value for gauss distr. "
"%d %d %d %f %f = %f",
particleId, 3 * iSys + 1, iSect, fMom, fTheta, fParams[1]);
}
afReturn[particle_counter] = -2.0f;
continue;
}
afReturn[particle_counter] = HPidGaussConf::getConfLevel(fParams[0],
fParams[1], fBeta);
}
return kTRUE;
}
void HPidAlgMomVsBeta::print(void) const
{
printf("MomVsBeta algorithm\n");
printf("fMinBkg: %f\n", fMinBkg);
printf("fMaxGaussDev: %f\n", fMaxGaussDev);
}
Last change: Sat May 22 13:06:49 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.