#include "hpidtracksorter.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hpidgeanttrackset.h"
#include "hpidtrackcandsim.h"
#include "hpidtrackcand.h"
#include "hpidtrackdata.h"
#include "hpidhitdata.h"
#include "piddef.h"
#include "htool.h"
#include <algorithm>
#include <iostream>
#include <iomanip>
#define DEBUG 0
ClassImp(HPidTrackSorter)
Bool_t HPidTrackSorter::kDebug = kFALSE;
Int_t HPidTrackSorter::printLevel = 1;
Int_t HPidTrackSorter::kSwitchIndex = 0;
Int_t HPidTrackSorter::kSwitchQuality = 0;
Int_t HPidTrackSorter::kSwitchParticle = 0;
Int_t HPidTrackSorter::kSwitchRICHMatching = kUseRKRICHWindow;
Float_t HPidTrackSorter::fRICHMDCWindow = 4.;
Bool_t HPidTrackSorter::kIgnoreRICH = kFALSE;
Bool_t HPidTrackSorter::kIgnoreInnerMDC = kFALSE;
Bool_t HPidTrackSorter::kIgnoreOuterMDC = kFALSE;
Bool_t HPidTrackSorter::kIgnoreMETA = kFALSE;
Bool_t HPidTrackSorter::kIgnorePreviousIndex = kFALSE;
HPidTrackSorter::HPidTrackSorter(void)
: TNamed("PidTrackSorter","PID track candidate sorter")
{
clear();
}
HPidTrackSorter::HPidTrackSorter(TString name, TString title)
: TNamed(name, title)
{
clear();
}
HPidTrackSorter::~HPidTrackSorter(void)
{
if(nameIndex) delete [] nameIndex;
if(nameQuality) delete [] nameQuality;
if(iterPidTrackCandCat) delete iterPidTrackCandCat;
}
void HPidTrackSorter::clear()
{
fout = NULL;
nt = NULL;
isSimulation = kFALSE;
nameIndex = 0;
nameQuality = 0;
pPidTrackCandCat = NULL;
iterPidTrackCandCat = NULL;
fill_Iteration = 0;
selectBest_Iteration = 0;
currentEvent = -1;
}
Bool_t HPidTrackSorter::init(void)
{
pPidTrackCandCat = gHades->getCurrentEvent()->getCategory(catPidTrackCand);
if (!pPidTrackCandCat) {
Error("HPidTrackSorter::init()"," No HPidTrackCand Input -> Switching HPidTrackSorter OFF");
}
else iterPidTrackCandCat = (HIterator *) pPidTrackCandCat->MakeIterator();
HCategory* catKine = gHades->getCurrentEvent()->getCategory(catGeantKine);
if(catKine) isSimulation = kTRUE;
if(kDebug) {
Int_t size;
nameIndex = HTool::parseString("kIsIndexRICH,kIsIndexInnerMDC,kIsIndexOuterMDC,"
"kIsIndexTOF,kIsIndexSHOWER,kIsIndexRPC,kIsIndexMETA",size,",",kFALSE);
cout<<"-------------------------------------------"<<endl;
cout<<"HPidTrackSorter::init() :"<<endl;
cout<<"index :: " <<endl;
for(Int_t i = 0; i < size; i ++){
cout<<i <<" "<<nameIndex[i].Data()<<endl;
}
nameQuality = HTool::parseString("kIsBestHitRICH,kIsBestHitInnerMDC,kIsBestHitOuterMDC,kIsBestHitMETA,"
"kIsBestRKMETA,kIsBestRKRICH,kIsBestRK,kIsBestSPLINE,kIsBestKICK,"
"kIsBestRKRKMETA,kIsBestRKRKRICH,kIsBestRKMETAQA",size,",",kFALSE);
for(Int_t i = 0; i < size; i ++){
cout<<i + NUMBER_OF_INDEX<<" "<<nameQuality[i].Data()<<endl;
}
cout<<"-------------------------------------------"<<endl;
}
return kTRUE;
}
Bool_t HPidTrackSorter::finalize(void)
{
cleanUp(kTRUE);
if(fout)
{
fout->cd();
nt ->Write();
fout->Close();
}
return kTRUE ;
}
Int_t HPidTrackSorter::clearVector( vector<candidate*>& all_candidates)
{
for(UInt_t i = 0; i < all_candidates.size() ; ++ i)
{
candidate* cand = all_candidates[i];
delete cand;
}
all_candidates.clear();
return 0;
}
Bool_t HPidTrackSorter::cmpIndex(candidate* a, candidate* b)
{
switch (kSwitchIndex) {
case kIsIndexRICH:
return a->ind_RICH < b->ind_RICH;
case kIsIndexInnerMDC:
return a->ind_innerMDC < b->ind_innerMDC;
case kIsIndexOuterMDC:
return a->ind_outerMDC < b->ind_outerMDC;
case kIsIndexTOF:
return a->ind_TOF < b->ind_TOF;
case kIsIndexSHOWER:
return a->ind_SHOWER < b->ind_SHOWER;
case kIsIndexRPC:
return a->ind_RPC < b->ind_RPC;
default:
::Error("HPidTrackSorter::CmpIndex()","Unknown switch statement %i!",kSwitchIndex);
return kFALSE;
}
}
Bool_t HPidTrackSorter::cmpQuality(candidate* a, candidate* b)
{
switch (kSwitchQuality) {
case kIsBestHitRICH:
return a->ring_PadNr > b->ring_PadNr;
case kIsBestHitInnerMDC:
return a->innerMDCChi2 < b->innerMDCChi2;
case kIsBestHitOuterMDC:
return a->outerMDCChi2 < b->outerMDCChi2;
case kIsBestHitMETA:
return a->metamatch_Quality < b->metamatch_Quality;
case kIsBestRKMETA:
return a->RK_META_match_Quality < b->RK_META_match_Quality;
case kIsBestRKRICH:
return a->RK_RICH_match_Quality < b->RK_RICH_match_Quality;
case kIsBestRK:
return a->RK_Chi2 < b->RK_Chi2;
case kIsBestSPLINE:
return a->SPLINE_Chi2 < b->SPLINE_Chi2;
case kIsBestKICK:
return a->KICK_Pull < b->KICK_Pull;
case kIsBestRKRKMETA:
return (a->RK_Chi2 * a->RK_META_match_Quality) < (b->RK_Chi2 * b->RK_META_match_Quality);
case kIsBestRKRKRICH:
return (a->RK_Chi2 * a->RK_RICH_match_Quality) < (b->RK_Chi2 * b->RK_RICH_match_Quality);
case kIsBestRKMETAQA:
return (a->RK_Chi2 * a->metamatch_Quality) < (b->RK_Chi2 * b->metamatch_Quality);
default:
::Error("HPidTrackSorter::CmpQuality()","Unknown switch statement %i!",kSwitchQuality);
return kFALSE;
}
}
Bool_t HPidTrackSorter::rejectIndex(candidate* a, HPidTrackSorter::ESwitch byIndex, Int_t& index)
{
switch (byIndex) {
case kIsIndexRICH:
return ( index = a->ind_RICH ) < 0;
case kIsIndexInnerMDC:
return ( index = a->ind_innerMDC ) < 0;
case kIsIndexOuterMDC:
return ( index = a->ind_outerMDC ) < 0;
case kIsIndexTOF:
return ( index = a->ind_TOF ) < 0;
case kIsIndexSHOWER:
return ( index = a->ind_SHOWER ) < 0;
case kIsIndexRPC:
return ( index = a->ind_RPC ) < 0;
default:
::Error("HPidTrackSorter::rejectIndex()","Unknown switch statement %i!",byIndex);
return kFALSE;
}
}
Bool_t HPidTrackSorter::rejectQuality(candidate* a, HPidTrackSorter::ESwitch byQuality)
{
switch (byQuality) {
case kIsBestHitRICH:
return a->ind_RICH < 0;
case kIsBestHitInnerMDC:
return a->innerMDCChi2 < 0;
case kIsBestHitOuterMDC:
return (a->outerMDCChi2 < 0 || a->ind_outerMDC < 0);
case kIsBestHitMETA:
return (a->ind_TOF < 0 && a->ind_SHOWER < 0 && a->ind_RPC < 0);
case kIsBestRKMETA:
return (a->RK_Chi2 == 1000000. || a->RK_Chi2< 0 || (a->ind_TOF < 0 && a->ind_SHOWER < 0 && a->ind_RPC < 0));
case kIsBestRKRICH:
return (a->RK_Chi2 == 1000000. || a->RK_Chi2< 0 || a->ind_outerMDC < 0 || a->ind_RICH < 0);
case kIsBestRK:
return (a->RK_Chi2 == 1000000. || a->RK_Chi2< 0);
case kIsBestSPLINE:
return (a->SPLINE_Chi2 < 0 || a->ind_outerMDC < 0);
case kIsBestKICK:
return (a->KICK_Pull == -1 || (a->ind_TOF < 0 && a->ind_SHOWER < 0 && a->ind_RPC < 0));
case kIsBestRKRKMETA:
return (a->ind_TOF < 0 && a->ind_SHOWER < 0 && a->ind_RPC < 0) || (a->RK_Chi2 == 1000000. || a->RK_Chi2< 0);
case kIsBestRKRKRICH:
return (a->ind_RICH < 0) || (a->RK_Chi2 == 1000000. || a->RK_Chi2< 0);
case kIsBestRKMETAQA:
return (a->ind_TOF < 0 && a->ind_SHOWER < 0 && a->ind_RPC < 0) || (a->RK_Chi2 == 1000000. || a->RK_Chi2< 0);
default:
::Error("HPidTrackSorter::rejectQuality()","Unknown switch statement %i!",byQuality);
return kFALSE;
}
}
Int_t HPidTrackSorter::flagAccepted(vector <candidate*>& all_candidates, HPidTrackSorter::ESwitch byQuality)
{
Int_t ctAll = 0;
Int_t ctAcceptQuality = 0;
HPidTrackCand* pcand;
for(UInt_t i = 0; i < all_candidates.size(); ++ i)
{
++ ctAll;
candidate* cand = all_candidates[i];
if(rejectQuality(cand, byQuality)) continue;
++ ctAcceptQuality;
pcand = (HPidTrackCand*) pPidTrackCandCat->getObject(cand->ind_PidCand);
if(!pcand) {
Error("HPidTrackSorter::flagAccepted()","NULL pointer retrieved for HPidTrackCand at index %i",cand->ind_PidCand);
continue;
}
switch (byQuality) {
case kIsBestHitRICH:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedHitRICH);
break;
case kIsBestHitInnerMDC:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedHitInnerMDC);
break;
case kIsBestHitOuterMDC:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedHitOuterMDC);
break;
case kIsBestHitMETA:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedHitMETA);
break;
case kIsBestRKMETA:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedRKMETA);
break;
case kIsBestRKRICH:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedRKRICH);
break;
case kIsBestRK:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedRK);
break;
case kIsBestSPLINE:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedSPLINE);
break;
case kIsBestKICK:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedKICK);
break;
case kIsBestRKRKMETA:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedRKRKMETA);
break;
case kIsBestRKRKRICH:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedRKRKRICH);
break;
case kIsBestRKMETAQA:
pcand -> setFlagBit(HPidTrackCand::kIsAcceptedRKMETAQA);
break;
default :
Error("HPidTrackSorter::flagAccepted()","Unknown switch statement : %i!",byQuality);
exit(1);
break;
}
}
if(kDebug && printLevel >= 2){
cout<<"flagAccepted(): "
<<"s: " <<selectBest_Iteration
<<", f: " <<fill_Iteration
<<", kSwitchParticle: " <<kSwitchParticle
<<", quality " <<nameQuality[byQuality-NUMBER_OF_INDEX].Data()
<<", candidate= " <<ctAll
<<", acc. quality = " <<ctAcceptQuality
<<endl;
}
return 0;
}
Int_t HPidTrackSorter::flagDouble(vector <candidate*>& all_candidates, HPidTrackSorter::ESwitch byIndex)
{
kSwitchIndex = byIndex;
sort(all_candidates.begin(), all_candidates.end(), this->cmpIndex);
Int_t index;
Int_t old_index =-99;
vector <candidate*> daughter;
Int_t ctAll = 0;
Int_t ctAcceptIndex = 0;
Int_t ctAcceptDoubles= 0;
Int_t ctCheck = 0;
for(UInt_t i = 0; i < all_candidates.size(); ++ i)
{
++ ctAll;
candidate* cand = all_candidates[i];
if(rejectIndex (cand, byIndex, index)) continue;
++ ctAcceptIndex;
if(index == old_index || old_index == -99)
{
daughter.push_back(cand);
} else {
if(!daughter.empty())
{
setFlagsDouble(daughter,byIndex);
if(daughter.size() >= 2){
ctAcceptDoubles += daughter.size();
}
ctCheck += daughter.size();
daughter.clear();
}
daughter.push_back(cand);
}
old_index = index;
}
if(!daughter.empty())
{
setFlagsDouble(daughter, byIndex);
if(daughter.size() >= 2){
ctAcceptDoubles += daughter.size();
}
ctCheck += daughter.size();
}
if(kDebug && printLevel >= 2){
cout<<"flagDouble(): "
<<"s: " <<selectBest_Iteration
<<", f: " <<fill_Iteration
<<", kSwitchParticle: "<<kSwitchParticle
<<", index " <<nameIndex [byIndex].Data()
<<", candidate= " <<ctAll
<<", acc. index = " <<ctAcceptIndex
<<", acc. doubles = " <<ctAcceptDoubles
<<", check = " <<ctCheck
<<endl;
}
return 0;
}
Int_t HPidTrackSorter::setFlagsDouble(vector<candidate*>& daughter, HPidTrackSorter::ESwitch byIndex)
{
if(daughter.empty() ) return 0;
if(daughter.size() < 2) return 0;
HPidTrackCand* cand;
for(UInt_t i = 0; i < daughter.size(); ++ i)
{
cand = (HPidTrackCand*) pPidTrackCandCat->getObject(daughter[i]->ind_PidCand);
if(!cand) {
Error("HPidTrackSorter::setFlagsDouble()","NULL pointer retrieved for HPidTrackCand at index %i",daughter[i]->ind_PidCand);
continue;
}
switch (byIndex)
{
case kIsIndexRICH:
cand -> setFlagBit(HPidTrackCand::kIsDoubleHitRICH);
break;
case kIsIndexInnerMDC:
cand -> setFlagBit(HPidTrackCand::kIsDoubleHitInnerMDC);
break;
case kIsIndexOuterMDC:
cand -> setFlagBit(HPidTrackCand::kIsDoubleHitOuterMDC);
break;
case kIsIndexTOF:
cand -> setFlagBit(HPidTrackCand::kIsDoubleHitMETA);
break;
case kIsIndexSHOWER:
cand -> setFlagBit(HPidTrackCand::kIsDoubleHitMETA);
break;
case kIsIndexRPC:
cand -> setFlagBit(HPidTrackCand::kIsDoubleHitMETA);
break;
default :
Error("HPidTrackSorter::setFlagsDouble()","Unknown switch statement : %i!",byIndex);
exit(1);
break;
}
}
return 0;
}
Int_t HPidTrackSorter::fillInput(vector < candidate* >& all_candidates)
{
HPidTrackCand* pCand ;
HPidTrackData* tdata ;
HPidHitData* hdata ;
candidate* cand;
iterPidTrackCandCat->Reset();
while ((pCand = (HPidTrackCand *)iterPidTrackCandCat->Next()) != 0 )
{
tdata = pCand->getTrackData();
hdata = pCand->getHitData();
if(pCand->isFlagBit(HPidTrackCand::kIsUsed))
{
if(!kIgnorePreviousIndex && fill_Iteration == 2)
{
if(hdata->getIndRICH() >= 0 &&
(find(index_RICH.begin(),index_RICH.end() ,hdata->getIndRICH()) == index_RICH.end()) ){
index_RICH.push_back(hdata->getIndRICH());
}
if(hdata->getIndInnerSeg() >= 0 &&
(find(index_InnerMDC.begin(),index_InnerMDC.end(),hdata->getIndInnerSeg()) == index_InnerMDC.end()) ){
index_InnerMDC.push_back(hdata->getIndInnerSeg());
}
if(hdata->getIndOuterSeg() >= 0 &&
(find(index_OuterMDC.begin(),index_OuterMDC.end(),hdata->getIndOuterSeg()) == index_OuterMDC.end()) ){
index_OuterMDC.push_back(hdata->getIndOuterSeg());
}
if(hdata->getIndTOF() >= 0 &&
(find(index_TOF.begin(),index_TOF.end() ,hdata->getIndTOF()) == index_TOF.end()) ){
index_TOF.push_back(hdata->getIndTOF());
}
if(hdata->getIndShower() >= 0 &&
(find(index_SHOWER.begin(),index_SHOWER.end() ,hdata->getIndShower()) == index_SHOWER.end()) ){
index_SHOWER.push_back(hdata->getIndShower());
}
}
continue;
}
if(pCand->isFlagBit(HPidTrackCand::kIsRejected)) continue;
for(Int_t i = 0; i < 29; i ++) { pCand->unsetFlagBit(i); }
cand = new candidate;
cand->ind_PidCand = pPidTrackCandCat->getIndex(pCand);
cand->ind_RICH = hdata->getIndRICH();
cand->ind_innerMDC = hdata->getIndInnerSeg();
cand->ind_outerMDC = hdata->getIndOuterSeg();
cand->ind_TOF = hdata->getIndTOF();
cand->ind_SHOWER = hdata->getIndShower();
cand->ind_RPC = -1;
cand->ring_PadNr = hdata->getRingPadNr();
cand->innerMDCChi2 = hdata->getInnerMdcChiSquare();
cand->innerMDCChi2 = -1.;
cand->outerMDCChi2 = -1.;
cand->metamatch_Quality = -1.;
cand->RK_META_match_Quality = -1.;
cand->RK_RICH_match_Quality = -1.;
cand->RK_Chi2 = -1.;
cand->RICH_RK_Corr = hdata->getRingCorrelation(ALG_RUNGEKUTTA);
if( hdata->getIndInnerSeg() >= 0 ){
if(hdata->getInnerMdcChiSquare() > 0) cand->innerMDCChi2 = hdata->getInnerMdcChiSquare();
else cand->innerMDCChi2 = 1000000;
}
if( hdata->getIndOuterSeg() >= 0 ){
if(hdata->getOuterMdcChiSquare() > 0) cand->outerMDCChi2 = hdata->getOuterMdcChiSquare();
else cand->outerMDCChi2 = 1000000;
}
if( (hdata->getIndShower() >= 0 ||
hdata->getIndTOF() >= 0 ) &&
hdata->getIndOuterSeg() >= 0
){
cand->metamatch_Quality = tdata->getMetaMatchingQuality();
}
if( tdata->getRKChiSquare() != 1000000. &&
tdata->getRKChiSquare() > 0 )
{
if(hdata->getIndShower() >= 0 || hdata->getIndTOF()>= 0 )
{
cand->RK_META_match_Quality = tdata->getRKMetaMatchingQuality();
if(!finite(cand->RK_META_match_Quality)) {
cand->RK_META_match_Quality = -1;
}
}
if(hdata->getIndRICH() >= 0 )
{
if(tdata->getRKRichMatchingQuality() == -1.){
Float_t dthA = hdata -> getDeltaThetaRKRICH(tdata->getRKTheta());
Float_t dphA = hdata -> getDeltaPhiRKRICH (tdata->getRKPhi(), tdata->getRKTheta());
tdata->setRKRichMatchingQuality( sqrt( dthA*dthA + dphA*dphA));
}
cand->RK_RICH_match_Quality = tdata->getRKRichMatchingQuality();
}
}
if(tdata->getRKChiSquare() != 1000000. &&
tdata->getRKChiSquare() > 0. &&
hdata->getOuterMdcChiSquare() > 0 ){
cand->RK_Chi2 = tdata->getRKChiSquare();
}
else if (tdata->getRKChiSquare() != 1000000. &&
tdata->getRKChiSquare() > 0. &&
hdata->getOuterMdcChiSquare() < 0) {
cand->RK_Chi2 = tdata->getRKChiSquare() + 100;
}
cand->SPLINE_Chi2 = tdata->getSplineChiSquare();
if(tdata->getPull() != -1){
cand->KICK_Pull = fabs(tdata->getPull());
}
else { cand->KICK_Pull = -1; }
all_candidates.push_back(cand);
}
return 0;
}
void HPidTrackSorter::printCand(candidate* cand, Int_t i,TString spacer)
{
cout<<spacer.Data()<<i<<" --------------------------------------------"<<endl;
cout<<spacer.Data()<<"cand " <<cand->ind_PidCand
<<", R: " <<cand->ind_RICH
<<", iM: " <<cand->ind_innerMDC
<<", oM: " <<cand->ind_outerMDC
<<", T: " <<cand->ind_TOF
<<", S: " <<cand->ind_SHOWER
<<", RPC: "<<cand->ind_RPC
<<endl;
cout<<spacer.Data()
<<"Ring " <<cand->ring_PadNr
<<", ichi2: " <<cand->innerMDCChi2
<<", ochi2: " <<cand->outerMDCChi2
<<", MQA: " <<cand->metamatch_Quality<<endl;
cout<<spacer.Data()
<<"RKM: " <<cand->RK_META_match_Quality
<<", RKR: " <<cand->RK_RICH_match_Quality
<<", RK: " <<cand->RK_Chi2
<<", SPL: " <<cand->SPLINE_Chi2
<<", KICK: " <<cand->KICK_Pull <<endl;
cout<<spacer.Data()
<<"RKRKMETA: " <<(cand->RK_Chi2 != -1 && cand->RK_META_match_Quality != -1 ? cand->RK_Chi2*cand->RK_META_match_Quality : -1)
<<", RKRKRICH: "<<(cand->RK_Chi2 != -1 && cand->RK_RICH_match_Quality != -1 ? cand->RK_Chi2*cand->RK_RICH_match_Quality : -1)
<<", RKMETAQA: "<<(cand->RK_Chi2 != -1 && cand->metamatch_Quality != -1 ? cand->RK_Chi2*cand->metamatch_Quality : -1)
<<", isRingRK: "<<(Int_t) cand->RICH_RK_Corr
<<endl;
HPidTrackCand* pcand = (HPidTrackCand*) pPidTrackCandCat->getObject(cand->ind_PidCand);
if(cand)
{
cout<<spacer.Data()<<flush;
pcand->printFlags();
} else {
::Error("HPidTrackSorter::printCand()","NULL pointer retrieved for HPidTrackCand Index %i",cand->ind_PidCand);
}
}
void HPidTrackSorter::printEvent(TString comment)
{
Int_t ctcand = 0;
cout<<"----------------------------------------"<<endl;
cout<<"Event kSwitchParticle: "<<kSwitchParticle<<" "
<<setw(6) <<gHades->getEventCounter()
<<"s: " <<selectBest_Iteration
<<", f: " <<fill_Iteration
<<" " <<comment.Data()
<<endl;
HPidTrackCand* pcand;
iterPidTrackCandCat->Reset();
while ((pcand = (HPidTrackCand *)iterPidTrackCandCat->Next()) != 0 )
{
cout <<setw(6)<<ctcand<<" "<<flush;
pcand->printInfo();
++ ctcand;
}
}
void HPidTrackSorter::setOutputFile(TString filename )
{
if(filename.CompareTo("") == 0){
fout = new TFile("pidtrackcleaner.root","RECREATE");
} else {
fout = new TFile(filename.Data(),"RECREATE");
}
if(fout){
nt = new TNtuple("nt","nt",
"p:th:ph:"
"RKchiq:Spchiq:KPpull:"
"system:sum0:isRICHRKCorr:"
"common:geantID:"
"best:double:"
"IsDoubleHitRICH:IsDoubleHitInnerMDC:IsDoubleHitOuterMDC:kIsDoubleHitMETA:"
"IsBestHitRICH:IsBestHitInnerMDC:IsBestHitOuterMDC:IsBestHitMETA:"
"IsBestRKMETA:IsBestRKRICH:IsBestRK:IsBestSPLINE:IsBestKICK:"
"IsBestRKRKMETA:IsBestRKRKRICH:IsBestRKMETAQA:"
"IsRejected:IsUsed:IsLepton:"
"IsAcceptedHitRICH:IsAcceptedHitInnerMDC:IsAcceptedHitOuterMDC:IsAcceptedHitMETA:"
"IsAcceptedRKMETA:IsAcceptedRKRICH:IsAcceptedRK:IsAcceptedSPLINE:IsAcceptedKICK:"
"IsAcceptedRKRKMETA:IsAcceptedRKRKRICH:IsAcceptedRKMETAQA:"
"evtNr"
);
} else {
Error("HPidTrackSorter::setOutputFile()","Could not create outputfile !");
exit(1);
}
}
void HPidTrackSorter::fillNtuple()
{
if(!iterPidTrackCandCat) return;
if(!nt) return;
HPidGeantTrackSet* PidGeant;
HPidTrackCandSim* pTrCandSim;
HPidTrackData* pTrack;
HPidHitData* pHit ;
iterPidTrackCandCat->Reset();
while ((pTrCandSim = (HPidTrackCandSim *) iterPidTrackCandCat->Next()) != 0)
{
Float_t data[45]={0};
pTrack = pTrCandSim -> getTrackData();
pHit = pTrCandSim -> getHitData();
data[0] = pTrack -> getMomenta(4);
data[1] = pTrack -> getRKTheta();
data[2] = pTrack -> getRKPhi();
data[3] = pTrack -> fRKChiSquare;
data[4] = pTrack -> getSplineChiSquare();
data[5] = pTrack -> getPull();
data[6] = pHit -> getSystem();
data[7] = pHit -> getShowerSum(0);
data[8] = pHit -> getRingCorrelation(ALG_RUNGEKUTTA);
if(isSimulation){
PidGeant = pTrCandSim->getGeantTrackSet();
data[9] = PidGeant -> getMostCommonCorrelation();
data[10] = PidGeant -> getGeantPID();
}
data[11] = pTrCandSim ->isFlagAllBestHit();
data[12] = pTrCandSim ->isFlagOR (4,
HPidTrackCand::kIsDoubleHitRICH,
HPidTrackCand::kIsDoubleHitInnerMDC,
HPidTrackCand::kIsDoubleHitOuterMDC,
HPidTrackCand::kIsDoubleHitMETA);
data[13] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsDoubleHitRICH);
data[14] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsDoubleHitInnerMDC);
data[15] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsDoubleHitOuterMDC);
data[16] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsDoubleHitMETA);
data[17] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestHitRICH);
data[18] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestHitInnerMDC);
data[19] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestHitOuterMDC);
data[20] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestHitMETA);
data[21] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestRKMETA);
data[22] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestRKRICH);
data[23] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestRK);
data[24] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestSPLINE);
data[25] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestKICK);
data[26] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestRKRKMETA);
data[27] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestRKRKRICH);
data[28] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsBestRKMETAQA);
data[29] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsRejected);
data[30] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsUsed);
data[31] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsLepton);
data[32] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedHitRICH);
data[33] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedHitInnerMDC);
data[34] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedHitOuterMDC);
data[35] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedHitMETA);
data[36] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedRKMETA);
data[37] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedRKRICH);
data[38] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedRK);
data[39] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedSPLINE);
data[40] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedKICK);
data[41] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedRKRKMETA);
data[42] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedRKRKRICH);
data[43] = pTrCandSim ->isFlagBit(HPidTrackCand::kIsAcceptedRKMETAQA);
data[44] = gHades->getEventCounter();
nt ->Fill(data);
}
}
void HPidTrackSorter::resetFlags(Bool_t flag, Bool_t reject, Bool_t used, Bool_t lepton)
{
if(!iterPidTrackCandCat) return;
HPidTrackCand* pCand;
iterPidTrackCandCat->Reset();
while ((pCand = (HPidTrackCand *) iterPidTrackCandCat->Next()) != 0)
{
if(flag){
if((pCand->isFlagBit(HPidTrackCand::kIsUsed) && used) ||
!pCand->isFlagBit(HPidTrackCand::kIsUsed) ){
for(Int_t i=0;i<HPidTrackCand::kIsLepton;i++) { pCand->unsetFlagBit(i); }
}
}
if(reject) pCand->unsetFlagBit(HPidTrackCand::kIsRejected);
if(used) pCand->unsetFlagBit(HPidTrackCand::kIsUsed);
if(lepton) pCand->unsetFlagBit(HPidTrackCand::kIsLepton);
}
}
void HPidTrackSorter::selection(Bool_t (*function)(HPidTrackCand* ))
{
if(!iterPidTrackCandCat) return;
HPidTrackCand* pTrCand;
iterPidTrackCandCat->Reset();
while ((pTrCand = (HPidTrackCand *) iterPidTrackCandCat->Next()) != 0)
{
if( pTrCand->isFlagBit(HPidTrackCand::kIsUsed)) continue;
if(!pTrCand->select(function)) pTrCand->setFlagBit(HPidTrackCand::kIsRejected);
}
}
void HPidTrackSorter::cleanUp(Bool_t final)
{
clearVector(all_candidates);
if(kIgnorePreviousIndex || final){
index_RICH.clear();
index_InnerMDC.clear();
index_OuterMDC.clear();
index_SHOWER.clear();
index_TOF.clear();
index_RPC.clear();
}
}
Int_t HPidTrackSorter::fillAndSetFlags()
{
if(!pPidTrackCandCat) return 0;
fill_Iteration++;
cleanUp(kFALSE);
fillInput(all_candidates);
HPidTrackSorter::ESwitch myIndex [] = {
kIsIndexRICH,
kIsIndexInnerMDC,
kIsIndexOuterMDC,
kIsIndexTOF,
kIsIndexSHOWER,
kIsIndexRPC
};
HPidTrackSorter::ESwitch myQuality[] = {
kIsBestHitRICH,
kIsBestHitInnerMDC,
kIsBestHitOuterMDC,
kIsBestHitMETA,
kIsBestRKMETA,
kIsBestRKRICH,
kIsBestRK,
kIsBestSPLINE,
kIsBestKICK,
kIsBestRKRKMETA,
kIsBestRKRKRICH,
kIsBestRKMETAQA
};
kSwitchIndex = kIsIndexRICH;
kSwitchQuality = kIsBestHitRICH;
for(UInt_t i = 0; i < (sizeof(myQuality) / sizeof(Int_t)); i ++){
flagAccepted(all_candidates,myQuality[i]);
}
for(UInt_t i = 0; i < (sizeof(myIndex) / sizeof(Int_t)); i ++){
flagDouble(all_candidates,myIndex[i]);
}
return all_candidates.empty() ? 0 : all_candidates.size();
}
void HPidTrackSorter::backupFlags()
{
kSwitchRICHMatchingBackup = kSwitchRICHMatching;
fRICHMDCWindowBackup = fRICHMDCWindow ;
kIgnoreRICHBackup = kIgnoreRICH;
kIgnoreInnerMDCBackup = kIgnoreInnerMDC;
kIgnoreOuterMDCBackup = kIgnoreOuterMDC;
kIgnoreMETABackup = kIgnoreMETA;
kIgnorePreviousIndexBackup = kIgnorePreviousIndex;
old_flags.clear();
HPidTrackCand* pCand ;
iterPidTrackCandCat->Reset();
while ((pCand = (HPidTrackCand *)iterPidTrackCandCat->Next()) != 0 )
{
old_flags.push_back(pCand->getFlagField());
}
}
Bool_t HPidTrackSorter::restoreFlags()
{
kSwitchRICHMatching = kSwitchRICHMatchingBackup;
fRICHMDCWindow = fRICHMDCWindowBackup ;
kIgnoreRICH = kIgnoreRICHBackup;
kIgnoreInnerMDC = kIgnoreInnerMDCBackup;
kIgnoreOuterMDC = kIgnoreOuterMDCBackup;
kIgnoreMETA = kIgnoreMETABackup;
kIgnorePreviousIndex = kIgnorePreviousIndexBackup;
HPidTrackCand* pCand ;
iterPidTrackCandCat->Reset();
vector<Int_t>::iterator iter;
iter = old_flags.begin();
while ((pCand = (HPidTrackCand *)iterPidTrackCandCat->Next()) != 0 )
{
if(iter != old_flags.end()){
pCand->setFlagField(*iter);
iter ++;
} else {
Error("restoreFlags()","Size of backuped flags does not match number of HPidTrackCand objects!");
return kFALSE;
}
}
return kTRUE;
}
Int_t HPidTrackSorter::fill(Bool_t (*function)(HPidTrackCand* ))
{
resetFlags(kTRUE,kTRUE,kFALSE,kFALSE);
Int_t first = fillAndSetFlags();
selection(function);
Int_t second = fillAndSetFlags();
if(kDebug && printLevel >= 1) {
cout<<"fill(): "
<<"s: " <<selectBest_Iteration
<<", f: " <<fill_Iteration
<<", kSwitchParticle: "<<kSwitchParticle
<<", nCands first: " <<first
<<", nCands second :" <<second
<<endl;
}
return all_candidates.empty() ? 0 : all_candidates.size();
}
Int_t HPidTrackSorter::selectBest(HPidTrackSorter::ESwitch byQuality, Int_t byParticle)
{
if(gHades->getEventCounter() != currentEvent){
currentEvent = gHades->getEventCounter();
selectBest_Iteration = 0;
}
selectBest_Iteration++;
kSwitchQuality = byQuality;
kSwitchParticle = byParticle;
Int_t ct = 0;
Int_t ctdouble[4] = {0};
sort(all_candidates.begin(),all_candidates.end(),this->cmpQuality);
for(UInt_t i = 0; i < all_candidates.size(); ++ i)
{
candidate* cand = all_candidates[i];
Int_t isDoubleHit = 0;
if( !kIgnoreInnerMDC ) {
if(cand->ind_innerMDC >= 0 &&
(find(index_InnerMDC.begin(),index_InnerMDC.end(),cand->ind_innerMDC) != index_InnerMDC.end()) ){
isDoubleHit |= 0x1 << 1;
ctdouble[1] ++;
}
}
if( !kIgnoreOuterMDC ) {
if(cand->ind_outerMDC >= 0 &&
(find(index_OuterMDC.begin(),index_OuterMDC.end(),cand->ind_outerMDC) != index_OuterMDC.end()) ){
isDoubleHit |= 0x1 << 2;
ctdouble[2] ++;
}
}
if( !kIgnoreMETA ) {
if(cand->ind_TOF >= 0 &&
(find(index_TOF.begin(),index_TOF.end() ,cand->ind_TOF) != index_TOF.end()) ){
isDoubleHit |= 0x1 << 3;
ctdouble[3] ++;
}
if(cand->ind_SHOWER >= 0 &&
(find(index_SHOWER.begin(),index_SHOWER.end() ,cand->ind_SHOWER) != index_SHOWER.end()) ){
isDoubleHit |= 0x1 << 3;
ctdouble[3] ++;
}
if(cand->ind_RPC >= 0 &&
(find(index_RPC.begin(),index_RPC.end() ,cand->ind_RPC) != index_RPC.end()) ){
isDoubleHit |= 0x1 << 3;
ctdouble[3] ++;
}
}
if(isDoubleHit){
if(kDebug && printLevel >= 1){
TString out="";
for(Int_t j = 3; j >= 0; j --){
out += ( (isDoubleHit>>j) & 0x1 );
}
cout<<"--selectBest(): skip Double_t hit with pattern : "<<out.Data()<<endl;
printCand(cand,i);
}
continue;
}
if(cand->ind_innerMDC >= 0 ){
index_InnerMDC.push_back(cand->ind_innerMDC);
}
if(cand->ind_outerMDC >= 0 ){
index_OuterMDC.push_back(cand->ind_outerMDC);
}
if(cand->ind_TOF >= 0 ){
index_TOF.push_back(cand->ind_TOF);
}
if(cand->ind_SHOWER >= 0 ){
index_SHOWER.push_back(cand->ind_SHOWER);
}
if(cand->ind_RPC >= 0 ){
index_RPC.push_back(cand->ind_RPC);
}
HPidTrackCand* pcand = (HPidTrackCand*) pPidTrackCandCat->getObject(cand->ind_PidCand);
if(!pcand) {
Error("HPidTrackSorter::selectBest()","NULL pointer retrieved for HPidTrackCand at index %i",cand->ind_PidCand);
continue;
}
switch (byQuality)
{
case kIsBestHitRICH:
pcand -> setFlagBit(HPidTrackCand::kIsBestHitRICH);
break;
case kIsBestHitInnerMDC:
pcand -> setFlagBit(HPidTrackCand::kIsBestHitInnerMDC);
break;
case kIsBestHitOuterMDC:
pcand -> setFlagBit(HPidTrackCand::kIsBestHitOuterMDC);
break;
case kIsBestHitMETA:
pcand -> setFlagBit(HPidTrackCand::kIsBestHitMETA);
break;
case kIsBestRKMETA:
pcand -> setFlagBit(HPidTrackCand::kIsBestRKMETA);
break;
case kIsBestRKRICH:
pcand -> setFlagBit(HPidTrackCand::kIsBestRKRICH);
break;
case kIsBestRK:
pcand -> setFlagBit(HPidTrackCand::kIsBestRK);
break;
case kIsBestSPLINE:
pcand -> setFlagBit(HPidTrackCand::kIsBestSPLINE);
break;
case kIsBestKICK:
pcand -> setFlagBit(HPidTrackCand::kIsBestKICK);
break;
case kIsBestRKRKMETA:
pcand -> setFlagBit(HPidTrackCand::kIsBestRKRKMETA);
break;
case kIsBestRKRKRICH:
pcand -> setFlagBit(HPidTrackCand::kIsBestRKRKRICH);
break;
case kIsBestRKMETAQA:
pcand -> setFlagBit(HPidTrackCand::kIsBestRKMETAQA);
break;
default :
Error("HPidTrackSorter::selectBest()","Unknown switch statement : %i!",byQuality);
exit(1);
break;
}
++ ct;
pcand ->setFlagBit(HPidTrackCand::kIsUsed);
if(byParticle == kIsLepton){
pcand ->setFlagBit(HPidTrackCand::kIsLepton);
}
if(kDebug && printLevel >= 1){
cout<<"++selectBest(): select hit : "<<endl;
printCand(cand,i);
}
}
if(kDebug && printLevel >= 1)
{
cout<<"selectBest(): "
<<"s: " <<selectBest_Iteration
<<", f: " <<fill_Iteration
<<", kSwitchParticle: "<<kSwitchParticle
<<", nBest cand: " <<ct
<<", Double_t RICH: " <<ctdouble[0]
<<", InnerMDC: " <<ctdouble[1]
<<", Double_t OuterMDC: "<<ctdouble[2]
<<", Double_t META: " <<ctdouble[3]
<<endl;
}
fill_Iteration = 0;
return ct;
}
void HPidTrackSorter::setRICHMatching(HPidTrackSorter::ERichMatch match, Float_t window)
{
kSwitchRICHMatching = match;
fRICHMDCWindow = window;
}
Bool_t HPidTrackSorter::selectLeptons(HPidTrackCand* pcand)
{
HPidTrackData* pTrack = pcand -> getTrackData();
HPidHitData* pHit = pcand -> getHitData();
Bool_t test = kFALSE;
if( pcand->isFlagAND(5,
HPidTrackCand::kIsAcceptedHitRICH,
HPidTrackCand::kIsAcceptedHitInnerMDC,
HPidTrackCand::kIsAcceptedHitOuterMDC,
HPidTrackCand::kIsAcceptedHitMETA,
HPidTrackCand::kIsAcceptedRK
)
&&
pHit->getInnerMdcChiSquare() > 0
&&
pTrack->getRKChiSquare() < 10000
) test = kTRUE;
if(test)
{
if( kSwitchRICHMatching == kUseRICHIndex)
{
return kTRUE;
}
else if ( kSwitchRICHMatching == kUseRKRICHCorrelation && pHit -> getRingCorrelation(ALG_RUNGEKUTTA) )
{
return kTRUE;
}
else if ( kSwitchRICHMatching == kUseRKRICHWindow
&&
fabs(pHit->getDeltaThetaRKRICH(pTrack->getRKTheta())) < fRICHMDCWindow
&&
fabs(pHit->getDeltaPhiRKRICH(pTrack->getRKPhi(),pTrack->getRKTheta())) < fRICHMDCWindow
)
{
return kTRUE;
}
else return kFALSE;
}
else return kFALSE;
}
Bool_t HPidTrackSorter::selectHadrons(HPidTrackCand* pcand )
{
HPidTrackData* pTrack = pcand -> getTrackData();
HPidHitData* pHit = pcand -> getHitData();
if( pcand->isFlagAND(4,
HPidTrackCand::kIsAcceptedHitInnerMDC,
HPidTrackCand::kIsAcceptedHitOuterMDC,
HPidTrackCand::kIsAcceptedHitMETA,
HPidTrackCand::kIsAcceptedRK
)
&&
pHit->getInnerMdcChiSquare() > 0
&&
pTrack->getRKChiSquare() < 10000
) return kTRUE;
return kFALSE;
}
Last change: Sat May 22 13:07:38 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.