// // PndAnaPidCombiner.cxx // PANDAROOT // // Created by Ralf Kliemt on 12/16/11. // // This class reads the different information from the PID algorithms // and combines them according to the users specifications // // #include "PndAnaPidCombiner.h" #include #include "TDatabasePDG.h" #include "RhoBase/RhoCandidate.h" #include "RhoBase/RhoCandList.h" #include "FairRecoCandidate.h" #include "TClonesArray.h" #include "TPRegexp.h" #include "PndPidProbability.h" ClassImp ( PndAnaPidCombiner ) PndAnaPidCombiner::PndAnaPidCombiner ( const char* name, TString tcanames ) : TNamed ( name,"Panda PID Combiner" ) , fRootManager ( 0 ), fPidArrays(),//FIXME: What should the initializing constructor contain here? fPidResult ( 0 ), fInitialized ( kFALSE ) { if ( tcanames=="" ) { SetDefaults(); } else { SetTcaNames ( tcanames ); } fRootManager=FairRootManager::Instance(); fPidResult = new PndPidProbability(); } void PndAnaPidCombiner::Init() { // Initialize the TClonesArray lists if ( fInitialized ) { return; } //if we did initilize, don't do it again. for ( std::vector::iterator iter=fCurrentPidArrays.begin(); iter!=fCurrentPidArrays.end()&&fCurrentPidArrays.size()>0; iter++ ) { //std::cout<<"Init: Item name is \""<<(*iter).Data()<<"\" with array size "<ReadBranchEvent((*iter).Data()); } else { fCurrentPidArrays.erase(iter); } } } //std::cout<<"PidCombiner initialized."<Reset(); // combine algorithms TClonesArray* aTca=0; PndPidProbability* aProb=0; Int_t trackIndex = tc->GetTrackNumber(); //std::cout<<"PidCombiner: Try RhoCandidate uid:"<Uid()<<" trknr:"<SetIndex(trackIndex); if ( fCurrentPidArrays.size()==0 || trackIndex<0 ) { ApplyFlat ( tc ); return kFALSE; } for ( std::vector::iterator iter=fCurrentPidArrays.begin(); iter!=fCurrentPidArrays.end(); iter++ ){ aTca=fPidArrays[*iter]; //Info ( "Apply","try tca %s at %p",*iter.Data(),aTca ); if ( 0==aTca ) { Error ( "Apply", "PID Probability array not found, skip setting pid for candidate %i.",trackIndex ); check=kFALSE; continue; } if ( 0==aTca->GetEntriesFast() ) { Error ( "Apply", "PID Probability array '%s' at %p of size zero, skip setting pid for candidate %i.", aTca->GetName(), aTca, trackIndex ); continue; check=kFALSE; } if ( trackIndex>=aTca->GetEntriesFast() ) { Error ( "Apply", "Index out of '%s' array (%p) bounds, skip setting pid for candidate %i.",aTca->GetName(),aTca,trackIndex ); continue; check=kFALSE; } aProb= ( PndPidProbability* ) aTca->At ( trackIndex ); if ( aProb == 0 ) { Error ( "Apply", "PID Probability object in array '%s' at %p not found, skip setting pid for candidate %i.",aTca->GetName(),aTca,trackIndex ); continue; check=kFALSE; } if ( trackIndex!=aProb->GetIndex() ) { Error ( "Apply", "PID Probability object index (%i) is not the track index (%i). Is that bad?",aProb->GetIndex(),trackIndex ); continue; check=kFALSE; } // catch Zeros to avoid NAN from Div/Zero if ( aProb->GetSumProb() == 0 ) { continue; } // avoid numerics with low numbers //aProb->NormalizeTo(1.); //now multiply *fPidResult *= *aProb; } //std::cout<<"PndAnaPidCombiner: "; fPidResult->Print(); //TODO renormalizing is done in the Pid object upon request ??? //fPidResult->NormalizeTo(1.); //std::cout<<"PndAnaPisCombiner: scaled = "; fPidResult->Print(); // numbering see PndPidListMaker // No flux implemented! To come for each Detector! tc->SetPidInfo ( 0,fPidResult->GetElectronPidProb() ); tc->SetPidInfo ( 1,fPidResult->GetMuonPidProb() ); tc->SetPidInfo ( 2,fPidResult->GetPionPidProb() ); tc->SetPidInfo ( 3,fPidResult->GetKaonPidProb() ); tc->SetPidInfo ( 4,fPidResult->GetProtonPidProb() ); //std::cout<<"PndAnaPidCombiner: "<SetPidInfo ( 0,0.2 ); tc->SetPidInfo ( 1,0.2 ); tc->SetPidInfo ( 2,0.2 ); tc->SetPidInfo ( 3,0.2 ); tc->SetPidInfo ( 4,0.2 ); return; } void PndAnaPidCombiner::SetDefaults() { // Set list of names and weights to the default PANDA //TString names = "PidAlgoMvd;PidAlgoStt;PidAlgoEmcBayes;PidAlgoDrc;PidAlgoDisc;PidAlgoMdtHardCuts;"; //TString names = "PidAlgoIdealCharged"; //TString names = "PidMvaChargedProbability"; //SetTcaNames ( names ); fCurrentPidArrays.clear(); fInitialized=kFALSE; return; } void PndAnaPidCombiner::SetTcaNames ( TString& names ) { fCurrentPidArrays.clear(); // Tokenizer, cool thingy! TStringToken list ( names,";" ); //use TString class part (inherited, Tokenizer stores data there) while ( list.NextToken() ) { if ((TString) list == "") continue; fCurrentPidArrays.push_back ( ( TString ) list ); } fInitialized=kFALSE; return; } TClonesArray* PndAnaPidCombiner::ReadTCA ( const TString& tcaname ) { // Fetch a TCLonesArray from the framework by its root name if (tcaname == "") { Warning ( "PndAnaPidCombiner::ReadTCA()","Empty TCA name." ); return NULL; } TClonesArray* tca = ( TClonesArray* ) fRootManager->GetObject ( tcaname.Data() ); if ( ! tca ) { Warning ( "PndAnaPidCombiner::ReadTCA()","No \"%s\" array found.",tcaname.Data() ); return NULL; } return tca; }