//*-- AUTHOR : I. Froehlich
//*-- Modified : ?? by ??
//_HADES_CLASS_DESCRIPTION
////////////////////////////////////////////////////////////////////////
//
// HHypHardCutsAlg
//
// Algorithm which removes combinations acconding to hard cuts
//
////////////////////////////////////////////////////////////////////////
using namespace std;
#include <stdlib.h>
#include <iostream>
#include "hhypHardCutsAlg.h"
#include "hpidalghardcuts.h"
#include "hypinfodef.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hpartialevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hpidgeanttrackset.h"
#include "hgeantheader.h"
ClassImp(HHypHardCutsAlg)
HHypHardCutsAlg::HHypHardCutsAlg(char *name_i, Option_t par[])
:HHypBaseAlgorithm(name_i,par)
{
#if 0
TString * path = GetOpt("cutfile");
if (path == NULL) {
Error("HHypHardCutsAlg" , "no cutfile given");
}
//hardcuts = new HPidAlgHardCuts(*path);
// constructor
sInFileName = *path;
#endif
pidParams = NULL;
pidParams2 = NULL;
bSim = kTRUE;
bCut8 = kTRUE;
bCut9 = kTRUE;
bCut14 = kTRUE;
#if 0
if (sInFileName.IsNull())
{
Error("HPidAlgHardCuts::init","No input file");
}
else
{
TFile *fFile;
// Load param file for graphical cut.
Info("HPidAlgHardCuts::init","Load file: "+sInFileName);
fFile = TFile::Open(sInFileName,"READ");
GCut_8 = (TCutG*)fFile->Get("pid_8");
if (!GCut_8)
Warning("HPidAlgHardCuts::init","No pi+ cut");
else bCut8 = kTRUE;
GCut_9 = (TCutG*)fFile->Get("pid_9");
if (!GCut_9)
Warning("HPidAlgHardCuts::init","No input file");
else bCut9 = kTRUE;
GCut_14 = (TCutG*)fFile->Get("pid_14");
if (!GCut_14)
Warning("HPidAlgHardCuts::init","No input file");
else bCut14 = kTRUE;
}
#endif
}
HHypHardCutsAlg::~HHypHardCutsAlg()
{
}
Bool_t HHypHardCutsAlg::execute()
{
if (!beam) {
cerr << algoName << " needs beam particle! " << endl;
return kFALSE;
}
// Resetting the list and start looping over the combinations
// Loop is only done over the VALID combinations
mylist->CombIteratorReset();
while (mylist->CombIterator()) {
//cout << "CombIterator" << endl;
Bool_t removeComb = kFALSE;
for (int i = 0; i < mylist->getNpart(); i++) {
//loop over all particles
Bool_t isLep = kFALSE;
Int_t hyppid = mylist->getPid(i);
HPidParticle *particle = mylist->getPidParticle(i);
HPidHitData * pHitData = particle->getTrackCand()->getHitData();
//First check if we have a shitty lepton :-)
// Check RICH ring quality by using standard cuts
Int_t iSelectedMomAlg = particle->getMomAlg();
if (pHitData->hasRingCorrelation[iSelectedMomAlg] && ((isLepInRich(2, pHitData)
|| (isLepInRich(3, pHitData))))) isLep=kTRUE;
Double_t my_beta, my_momentum;
my_beta=mylist->getBeta(i);
my_momentum=(mylist->getMomentum(i)).Mag();
// A check for charge is not necessary, because its already checke din the filler
// nevertheless, its useful to have it in the debug ntuple downthepage
if (bCut14 && hyppid == 14 && (!GCut_14->IsInside(my_beta,my_momentum ))) {
removeComb = kTRUE;
}
if (bCut8 && hyppid == 8 && (!GCut_8->IsInside(my_beta,my_momentum) )) {
removeComb = kTRUE;
}
if (bCut9 && hyppid == 9 && (!GCut_9->IsInside(my_beta, -my_momentum) )) {// negative momentum!!!
removeComb = kTRUE;
}
if ((hyppid == 2) || (hyppid == 3)) {// Rich not fired, but we wanted leptons
if (!isLep) removeComb = kTRUE;
}
if ((hyppid != 2) && (hyppid != 3)) {// Rich fired, but we do NOT want leptons
if (isLep) removeComb = kTRUE;
}
if(histofile){
Double_t my_charge;
my_charge=particle->getCharge();// get Charge from PID, not List
qa->Fill(my_charge*my_beta, my_momentum, removeComb, isLep);
}
} // end loop over all particles
#if 0
if ((removeComb) && (mylist->getProbAlg() > 0.1)) { //remove good combination
cout << "remove good combination" << endl;
//exit(1);
}
else if ((!removeComb) && (mylist->getProbAlg() < 0.1)) {
cout << "keep bad combination" << endl;
//exit(1);
}
#endif
if (removeComb) {
//cout << "remove comb " << mylist->getProbAlg() << endl;
mylist->removeComb();
}
} //END Iterator
if (exitIdx > -1)
return kTRUE;
return kFALSE;
}
Bool_t HHypHardCutsAlg::init()
{
// need to get name from channel
TString input(channel->Get(initList));
// init lepton parameters
if((pidParams = (HPidAlgStandCutsPar *)gHades->getRuntimeDb()
->getContainer(PIDALGSTANDCUTSPAR_NAME)) == NULL)
{
Error("HHypHardCutsAlg::init", "Cannot get parameters: %s", PIDALGSTANDCUTSPAR_NAME);
return kFALSE;
}
// init hadron parameters
if((pidParams2 = (HPidAlgHardCutsPar *)gHades->getRuntimeDb()
->getContainer("PidAlgHardCutsPar")) == NULL)
{
Error("HHypHardCutsAlg::init", "Cannot get parameters: %s", "PidAlgHardCutsPar");
return kFALSE;
}
pidParams2->registerCut("hardcut_pid_9");
pidParams2->registerCut("hardcut_pid_8");
pidParams2->registerCut("hardcut_pid_14");
if (histofile){
qa = new TNtuple(input + TString("_hardcut_debug"), "Hardcut Debug ntuple","beta:mom:removed:islep");
}
return kTRUE;
}
Bool_t HHypHardCutsAlg::reinit()
{
#if 1
GCut_8 = pidParams2->getCut("hardcut_pid_8");
if (!GCut_8)
Error("HPidAlgHardCuts::init","No pi+ cut");
GCut_9 = pidParams2->getCut("hardcut_pid_9");
if (!GCut_8)
Error("HPidAlgHardCuts::init","No pi- cut");
GCut_14 = pidParams2->getCut("hardcut_pid_14");
if (!GCut_8)
Error("HPidAlgHardCuts::init","No p cut");
#endif
return kTRUE;
}
Bool_t HHypHardCutsAlg::finalize()
{
if (histofile) qa->Write();
return kTRUE;
}
Bool_t HHypHardCutsAlg::isLepInRich(Int_t iPid,HPidHitData *pHitData)
{
// Check RICH ring quality by using standard cuts
Int_t sec = pHitData->getSector();
Stat_t iRingPatMatrThresh = pidParams->getValue(iPid,0,sec,0);
// particle id, 0 - hist offset, sector, 0 bin value
Float_t fRingCentroidThresh = pidParams->getValue(iPid,0,sec,1);
Stat_t iRingPadNrThres = pidParams->getValue(iPid,0,sec,2);
Float_t fRingAvChargeThres = pidParams->getValue(iPid,0,sec,3);
Float_t fRingAvChrg = ((Float_t)pHitData->nRingAmplitude)/((Float_t)pHitData->nRingPadNr);
if(pHitData->nRingPatMat <= iRingPatMatrThresh ) return kFALSE;
if(pHitData->fRingCentroid >= fRingCentroidThresh) return kFALSE;
if(pHitData->nRingPadNr <= iRingPadNrThres ) return kFALSE;
if(fRingAvChrg <= fRingAvChargeThres ) return kFALSE;
return kTRUE;
}
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.