using namespace std;
#include "hpidpdfmaker.h"
#include "hmdcdef.h"
#include "hmdctrackddef.h"
#include "richdef.h"
#include "hiterator.h"
#include "hcategory.h"
#include "piddef.h"
#include "hiterator.h"
#include "hcategory.h"
#include "TNtuple.h"
#include "TString.h"
#include "hgeantkine.h"
#include "hshowerhittof.h"
#include "hkicktracksim.h"
#include "hkicktrack.h"
#include "kickdef.h"
#include "hrichhitsim.h"
#include "hpidfl.h"
#include "hcategory.h"
#include "hmdcsegsim.h"
#include "hmdcseg.h"
#include "hmdchit.h"
#include "hrichgeometrypar.h"
#include "hruntimedb.h"
#include "hpidhitdata.h"
#include "hpidtrackdata.h"
#include "hpidtrackcandsim.h"
#include <iostream>
ClassImp(HPidPdfMaker)
HPidPdfMaker::HPidPdfMaker(const Char_t*cOutFileName, Bool_t analyseSim)
:HSUDummyRec(kFALSE){
analyseSimData=analyseSim;
clearMembers();
sOutFileName = cOutFileName;
}
HPidPdfMaker::~HPidPdfMaker(){
}
void HPidPdfMaker::clearArray()
{
for(Int_t n=0;n<MAX_NTUPLE_SIZE;n++){
aPatternInstance[n]=-99;
}
}
void HPidPdfMaker::clearMembers(){
pRichGeometryPar = NULL;
pHitData = NULL;
pTrackData = NULL;
pGeantTrackSet = NULL;
pItTrackCand = NULL;
pTrackCand = NULL;
pShowerHitTof = NULL;
pKickTrack = NULL;
pRichHit = NULL;
pNtuple = NULL;
pCatPidTrkCand = NULL;
pCatKine = NULL;
pCatMdcSeg = NULL;
pCatMdcHit = NULL;
clearArray();
}
Bool_t HPidPdfMaker::init(void){
HRuntimeDb *rtdb = gHades->getRuntimeDb();
if(!rtdb)
{
Error("init","No Runtime Database found!");
return kFALSE;
}
pRichGeometryPar = (HRichGeometryPar*)rtdb->getContainer("RichGeometryParameters");
HEvent *pEvent= gHades->getCurrentEvent();
pCatPidTrkCand = pEvent->getCategory(catPidTrackCand);
if(NULL==pCatPidTrkCand){
cout <<"No trk cand!" << endl;
return kFALSE;
}
if((pItTrackCand = (HIterator *)pCatPidTrkCand->MakeIterator()) == NULL)
{
Error("init", "Cannot make catPidTrackCand category iterator");
return kFALSE;
}
if( NULL==pItTrackCand){
cout <<"No iterator" << endl;
return kFALSE;
}
if(analyseSimData)
{
pCatKine = getCategory(catGeantKine,kTRUE);
if( NULL==pCatKine){
cout <<"No kine" << endl;
return kFALSE;
}
}
if(openOutFile(sOutFileName.Data()) == NULL){
return kFALSE;
}
TString ntuple_str(NTUPLE_VARS1);
ntuple_str.Append(NTUPLE_VARS2);
ntuple_str.Append(NTUPLE_VARS3);
ntuple_str.Append(NTUPLE_VARS4);
printf("Ntuple %s\n",ntuple_str.Data());
if((pNtuple=new TNtuple("N","Ntuple with pdf data",ntuple_str))==NULL){
Error("init", "Cannot create NTuple");
return kFALSE;
}
setInitOk();
cout << "Init of pdfmaker OK! "<< endl;
return kTRUE;
}
Int_t HPidPdfMaker::execute(void) {
if(analyseSimData)
checkGeantTrackNumbers();
Bool_t isDSEvent=getDownscalingFlag();
pItTrackCand->Reset();
Int_t leptonCandidateCounter=0;
Int_t nrks=0;
Int_t nkicks=0;
Int_t npidtrackcands=0;
Int_t nrks_full=0;
while((pTrackCand=(HPidTrackCandSim *)pItTrackCand->Next())!=NULL)
{
pHitData = pTrackCand->getHitData();
for(Int_t i=0;i<MAX_MOM_ALGS;i++)
{
if(pHitData->getRingCorrelation(i))
{
leptonCandidateCounter++;
break;
}
}
}
pItTrackCand->Reset();
while((pTrackCand=(HPidTrackCandSim *)pItTrackCand->Next())!=NULL)
{
npidtrackcands++;
clearArray();
aPatternInstance[b_isdownscaled]=isDSEvent;
aPatternInstance[n_lepton_candidates]=leptonCandidateCounter;
pHitData = pTrackCand->getHitData();
pTrackData = pTrackCand->getTrackData();
if(analyseSimData)
{
pGeantTrackSet = pTrackCand->getGeantTrackSet();
if(pHitData->getFlagRICH())
{
pRichHit=HPidFL::getRichHitSim(pHitData->getIndRICH());
}
}
aPatternInstance[b_ring]=kFALSE;
aPatternInstance[b_corrRingSpline]=kFALSE;
aPatternInstance[b_corrRingKick]=kFALSE;
aPatternInstance[b_corrRingRK]=kFALSE;
if(pHitData->getFlagRICH()){
aPatternInstance[b_ring]=kTRUE;
if(analyseSimData)
{
aPatternInstance[i_ringtype]=getRingType(pRichHit);
}
if(pHitData->getRingCorrelation(ALG_SPLINE))
{
aPatternInstance[b_corrRingSpline]=kTRUE;
}
else
{
aPatternInstance[b_corrRingSpline]=kFALSE;
}
if(pHitData->getRingCorrelation(ALG_KICK))
{
aPatternInstance[b_corrRingKick]=kTRUE;
}
else
{
aPatternInstance[b_corrRingKick]=kFALSE;
}
if(pHitData->getRingCorrelation(ALG_RUNGEKUTTA))
{
aPatternInstance[b_corrRingRK]=kTRUE;
}
else
{
aPatternInstance[b_corrRingRK]=kFALSE;
}
bookRingObservables();
}
aPatternInstance[b_kicktrack]= (pTrackData->getKickTrackInd()>=0 && pTrackData->getIsAccepted(ALG_KICK))? kTRUE : kFALSE;
aPatternInstance[b_splinetrack]= (pTrackData->getSplineTrackInd()>=0 && pTrackData->getIsAccepted(ALG_SPLINE))? kTRUE : kFALSE;
aPatternInstance[b_rktrack]= (pTrackData->getRKTrackInd()>=0 && pTrackData->getIsAccepted(ALG_RUNGEKUTTA))? kTRUE : kFALSE;
aPatternInstance[n_rk_ind]=pTrackData->getRKTrackInd();
aPatternInstance[b_reftrack]= (pTrackData->getRefTrackInd()>=0)? kTRUE : kFALSE;
aPatternInstance[b_kick123track]= (pTrackData->getKickTrack123Ind()>=0)? kTRUE : kFALSE;
if(pTrackData->getKickTrackInd()>=0) nkicks++;
if(aPatternInstance[b_rktrack]==1)
{
nrks++;
if(pHitData->getMetaTrackCorrelation(ALG_RUNGEKUTTA))
{
nrks_full++;
}
}
if(analyseSimData){
aPatternInstance[i_tracktype]=getTrackType(pTrackCand);
}
bookTrackObservables();
bookVertexInformation();
aPatternInstance[b_segments]=kFALSE;
if(pTrackData->getNCloseTracklets()>0){
aPatternInstance[b_segments]= pTrackData->getNCloseTracklets();
}
aPatternInstance[b_corrMetaRK]=kFALSE;
aPatternInstance[b_corrMetaSpline]=kFALSE;
aPatternInstance[b_corrMetaKick]=kFALSE;
if(pHitData->iIndShower>=0 || pHitData->iIndTOF>=0)
{
if(pHitData->getMetaTrackCorrelation(ALG_KICK))
{
aPatternInstance[b_corrMetaKick]=kTRUE;
}
if(pHitData->getMetaTrackCorrelation(ALG_SPLINE))
{
aPatternInstance[b_corrMetaSpline]=kTRUE;
}
if(pHitData->getMetaTrackCorrelation(ALG_RUNGEKUTTA))
{
aPatternInstance[b_corrMetaRK]=kTRUE;
}
}
if(pHitData->iIndShower>=0){
aPatternInstance[f_shw_sum0] = pHitData->getShowerSum(0);
aPatternInstance[f_shw_sum1] = pHitData->getShowerSum(1);
aPatternInstance[f_shw_sum2] = pHitData->getShowerSum(2);
aPatternInstance[n_shw_cs0] = pHitData->getShowerClS(0);
aPatternInstance[n_shw_cs1] = pHitData->getShowerClS(1);
aPatternInstance[n_shw_cs2] = pHitData->getShowerClS(2);
aPatternInstance[n_shw_row] = pHitData->getShowerRow();
aPatternInstance[n_shw_col] = pHitData->getShowerCol();
aPatternInstance[f_shw_tof] = pHitData->getShowerTimeOfFlight();
aPatternInstance[n_shw_mult] = pHitData->getTofinoMult();
aPatternInstance[f_meta_local_x] = pHitData->getMetaLocalX();
aPatternInstance[f_meta_local_y] = pHitData->getMetaLocalY();
}
if(pHitData->iIndTOF>=0)
{
aPatternInstance[f_tof_tof] = pHitData->getTOFTimeOfFlight();
aPatternInstance[f_tof_leftamp] = pHitData->getTOFLeftAmplitude();
aPatternInstance[f_tof_rightamp] = pHitData->getTOFRightAmplitude();
aPatternInstance[f_tof_eloss] = pHitData->getTofEloss();
aPatternInstance[n_tof_clss] = pHitData->getTofClsSize();
aPatternInstance[n_meta_cell] = pHitData->getMetaCell();
aPatternInstance[n_tof_module] = pHitData->getTofModule();
aPatternInstance[n_tof_cell] = pHitData->getTofCell();
aPatternInstance[f_meta_local_x] = pHitData->getMetaLocalX();
}
aPatternInstance[n_tofino_mult] = pHitData->getTofinoMult();
bookCommonObservables();
pNtuple->Fill(aPatternInstance);
}
return 0;
}
Bool_t HPidPdfMaker::hasATrack()
{
return (aPatternInstance[b_kicktrack]>0 || aPatternInstance[b_splinetrack]>0 || aPatternInstance[b_rktrack]>0 ||aPatternInstance[b_reftrack]>0 || aPatternInstance[b_kick123track]>0);
}
Bool_t HPidPdfMaker::finalize(void) {
return writeAndCloseOutFile();
}
Bool_t HPidPdfMaker::getDownscalingFlag()
{
if(analyseSimData)
{
return kTRUE;
}
if(gHades->getCurrentEvent()->getHeader()->getDownscalingFlag())
{
return kTRUE;
}
return kFALSE;
}
Bool_t HPidPdfMaker::bookCommonObservables()
{
aPatternInstance[f_angle_to_closest_fitted_lep]=pTrackData->getAngleWithClosestCandidate(1,1);
aPatternInstance[f_angle_to_closest_fitted_had]=pTrackData->getAngleWithClosestCandidate(-1,1);
aPatternInstance[f_angle_to_closest_nonfitted_lep]=pTrackData->getAngleWithClosestCandidate(1,-1);
aPatternInstance[f_angle_to_closest_nonfitted_had]=pTrackData->getAngleWithClosestCandidate(-1,-1);
aPatternInstance[n_charge_rk]=pTrackData->getPolarity(ALG_RUNGEKUTTA);
aPatternInstance[n_charge_kick]=pTrackData->getPolarity(ALG_KICK);
aPatternInstance[n_charge_spline]=pTrackData->getPolarity(ALG_SPLINE);
aPatternInstance[n_sector]=(Float_t)(pHitData->getSector());
if(pHitData->nSector>5 || pHitData->nSector<0)
cout <<"NOPE! This sector does not exist!" << pHitData->getSector() << endl;
aPatternInstance[n_system]=(Float_t)(pHitData->getSystem());
if(aPatternInstance[b_ring] && hasATrack())
{
aPatternInstance[f_deltatheta]=pHitData->getDeltaThetaMDCRICH();
aPatternInstance[f_deltaphi]=pHitData->getDeltaPhiMDCRICH();
}
return kTRUE;
}
Bool_t HPidPdfMaker::bookVertexInformation()
{
if(!(pHitData && pTrackData))
{
::Error("HPidPdfMaker::bookVertexInfo","No hit/track data found!");
return kFALSE;
}
if(pTrackData->getIsAccepted(ALG_SPLINE)){
aPatternInstance[f_track_r_spline]=pTrackData->getTrackR(ALG_SPLINE);
aPatternInstance[f_track_z_spline]=pTrackData->getTrackZ(ALG_SPLINE);
aPatternInstance[f_distance_to_vertex_spline]=pHitData->getDistanceToVertex(ALG_SPLINE);
}
if(pTrackData->getIsAccepted(ALG_KICK)){
aPatternInstance[f_track_r_kick]=pTrackData->getTrackR(ALG_KICK);
aPatternInstance[f_track_z_kick]=pTrackData->getTrackZ(ALG_KICK);
aPatternInstance[f_distance_to_vertex_kick]=pHitData->getDistanceToVertex(ALG_KICK);
}
if(pTrackData->getIsAccepted(ALG_RUNGEKUTTA)){
aPatternInstance[f_track_r_rk]=pTrackData->getTrackR(ALG_RUNGEKUTTA);
aPatternInstance[f_track_z_rk]=pTrackData->getTrackZ(ALG_RUNGEKUTTA);
aPatternInstance[f_distance_to_vertex_rk]=pHitData->getDistanceToVertex(ALG_RUNGEKUTTA);
}
aPatternInstance[f_vertex_zcoord]=gHades->getCurrentEvent()->getHeader()->getVertexZ();
return kTRUE;
}
Bool_t HPidPdfMaker::bookRingObservables()
{
aPatternInstance[n_rich_patmatrix]=(float)pHitData->getRingPatMat();
aPatternInstance[n_rich_npads]=(float)pHitData->getRingPadNr();
aPatternInstance[f_rich_centroid]=(float)pHitData->getRingCentroid();
aPatternInstance[f_rich_avcharge]=(float)pHitData->getRingAmplitude()/(float)pHitData->getRingPadNr();
aPatternInstance[n_rich_locmax]=(float)pHitData->getRingLocalMax4();
aPatternInstance[n_rich_houtra]=(float)pHitData->getRingHouTra();
aPatternInstance[f_rich_theta]=(float)pHitData->getRichTheta();
aPatternInstance[f_rich_phi]=(float)pHitData->getRichPhi();
return kTRUE;
}
Bool_t HPidPdfMaker::bookTrackObservables()
{
if(aPatternInstance[i_geant_pid]>0 && analyseSimData)
{
aPatternInstance[f_mom_geant]=pGeantTrackSet->getTotalMomentum(0);
}
if(analyseSimData){
aPatternInstance[n_process]=pGeantTrackSet->getGeantProcessID(0);
aPatternInstance[n_medium]=pGeantTrackSet->getGeantMediumID(0);
}
aPatternInstance[f_metamatch_quality]=pTrackData->getMetaMatchingQuality();
aPatternInstance[f_track_theta]=pHitData->getMdcTheta();
aPatternInstance[f_rk_theta]=pTrackData->getRKTheta();
aPatternInstance[f_track_phi]=pHitData->getMdcPhi();
aPatternInstance[f_rk_phi]=pTrackData->getRKPhi();
aPatternInstance[f_kick_mom_exp]=pTrackData->getMomenta(ALG_KICK);
aPatternInstance[f_kick_beta]=pTrackData->getBeta(ALG_KICK);
aPatternInstance[f_spline_mom_exp]=pTrackData->getMomenta(ALG_SPLINE);
aPatternInstance[f_spline_beta]=pTrackData->getBeta(ALG_SPLINE);
aPatternInstance[f_kick123_mom_exp]=pTrackData->getMomenta(ALG_KICK123);
aPatternInstance[f_kick123_beta]=pTrackData->getBeta(ALG_KICK123);
aPatternInstance[f_reft_mom_exp]=pTrackData->getMomenta(ALG_REFT);
aPatternInstance[f_reft_beta]=pTrackData->getBeta(ALG_REFT);
aPatternInstance[f_rk_mom_exp]=pTrackData->getMomenta(ALG_RUNGEKUTTA);
aPatternInstance[f_rk_beta]=pTrackData->getBeta(ALG_RUNGEKUTTA);
aPatternInstance[f_kick_pull]=pTrackData->getPull();
aPatternInstance[f_spline_quality]=pTrackData->getSplineChiSquare();
aPatternInstance[f_rk_quality]=pTrackData->getRKChiSquare();
aPatternInstance[f_meta_rk_dx]=pTrackData->getRkMetadx();
aPatternInstance[f_meta_rk_dy]=pTrackData->getRkMetady();
aPatternInstance[f_meta_rk_dz]=pTrackData->getRkMetadz();
aPatternInstance[f_meta_x]=pTrackData->getxMeta();
aPatternInstance[f_meta_y]=pTrackData->getyMeta();
aPatternInstance[f_meta_z]=pTrackData->getzMeta();
aPatternInstance[f_meta_x_err]=pTrackData->geterrXMeta();
aPatternInstance[f_meta_y_err]=pTrackData->geterrYMeta();
aPatternInstance[f_meta_z_err]=pTrackData->geterrZMeta();
aPatternInstance[f_meta_mdc_dx]=pTrackData->getMdcMetadx();
aPatternInstance[f_meta_mdc_dy]=pTrackData->getMdcMetady();
aPatternInstance[f_kick_mass]=pTrackData->getMass2(ALG_KICK);
aPatternInstance[f_spline_mass]=pTrackData->getMass2(ALG_SPLINE);
aPatternInstance[f_kick123_mass]=pTrackData->getMass2(ALG_KICK123);
aPatternInstance[f_reft_mass]=pTrackData->getMass2(ALG_REFT);
aPatternInstance[f_rk_mass]=pTrackData->getMass2(ALG_RUNGEKUTTA);
bookSegmentObservables();
return kTRUE;
}
Bool_t HPidPdfMaker::bookSegmentObservables()
{
if(pHitData->iIndInnerSeg >= 0) {
aPatternInstance[n_mdc_nw0] = pHitData->getMdcNWires(0);
aPatternInstance[n_mdc_cls0] = pHitData->getMdcClsSize(0);
aPatternInstance[n_mdc_cfl0] = pHitData->getMdcLevelCls(0);
aPatternInstance[n_mdc_nw1] = pHitData->getMdcNWires(1);
aPatternInstance[n_mdc_cls1] = pHitData->getMdcClsSize(1);
aPatternInstance[n_mdc_cfl1] = pHitData->getMdcLevelCls(1);
aPatternInstance[f_mdc_inner_dedx] = pHitData->getInnerMdcdEdx();
}
if(pHitData->iIndOuterSeg >= 0) {
aPatternInstance[f_mdc_outer_dedx] = pHitData->getOuterMdcdEdx();
}
aPatternInstance[f_mdc_chi2] = pHitData->getInnerMdcChiSquare();
aPatternInstance[f_outer_mdc_chi2] = pHitData->getOuterMdcChiSquare();
aPatternInstance[f_mdc_combined_dedx]=pHitData->getCombinedMdcdEdx();
aPatternInstance[f_mdc_combined_dedxsigma]=pHitData->getCombinedMdcdEdxSigma();
return kTRUE;
}
void HPidPdfMaker::checkGeantTrackNumbers()
{
HGeantKine *pKine;
Int_t iTrackNumber,iPID, wait;
Int_t i=0;
Int_t nKineObjects=0;
Int_t iMax = pCatKine->getEntries();
Int_t lastTrackID=0;
while((pKine = (HGeantKine *) pCatKine->getObject(i))!=NULL)
{
nKineObjects++;
pKine->getParticle(iTrackNumber,iPID);
if(lastTrackID+1!=iTrackNumber)
{
cout << "Warning! Tracknumbers are not consecutive!" << endl;
cout << "Object number: " << i << "has address: " << pKine;
cout <<" PID is: " <<iPID << endl;
cout <<" TrackID is: " <<iTrackNumber << endl;
cin >> wait;
}
lastTrackID++;
i++;
}
if(nKineObjects!=iMax) cout << "Mismatch between number of announced and found objects!" << endl;
}
Float_t HPidPdfMaker::getTrackType(HPidTrackCandSim* pTrackCand)
{
Int_t nMatchesMdcMeta, nMatchesFull, nLeptonicMatchesMdcMeta, GeantPid;
Int_t nLeptonsInInnerMdc = HPidFL::countLeptonsInInnerMdc(pGeantTrackSet);
HPidFL::getGeantMatches(pTrackCand,nMatchesMdcMeta, nMatchesFull, nLeptonicMatchesMdcMeta, GeantPid);
if(GeantPid!=-99)
{
aPatternInstance[i_geant_pid]=GeantPid;
}
if(!nLeptonsInInnerMdc &&(GeantPid==2 ||GeantPid==3))
{
cout << "Inconsistent result! There was an electron without leptonic matches in mdc and meta!" << endl;
HPidFL::countLeptonsInInnerMdc(pGeantTrackSet, kTRUE);
}
aPatternInstance[i_geant_corrflag]=pTrackCand->getGeantTrackSet()->getMostCommonCorrelation();
if(nLeptonicMatchesMdcMeta)
{
return (Float_t)nLeptonsInInnerMdc;
}
if(nMatchesMdcMeta)
{
return 0.;
}
return -1.;
}
Float_t HPidPdfMaker::getRingType(HRichHitSim* pRichHit)
{
Int_t nMirrTracks1, nMirrTracks2;
if (HPidFL::isDoubleLepOnMirror(pRichHit, nMirrTracks1, nMirrTracks2))
{
return 2.0;
}
else
{
if (HPidFL::isLepOnMirror(pRichHit, nMirrTracks1))
{
return 1.0;
}
else {
return 0.0;
}
}
}
Last change: Sat May 22 13:07:19 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.