//*-- Author : Stefano Spataro (spataro@lns.infn.it)
// ***************************************************************************
//_HADES_CLASS_DESCRIPTION
//////////////////////////////////////////////////////////////////////////////
// HPidTofRec
// In case of experiments where there exists no start hit and the TOF of the
// particles has to be recalculated. This class will reconstruct it,
// and the new value (plus the new beta and new mass2), will be written inside HPidTrackData
// To mark those objects as changed one can ask to HPidTrackData::getTofRecFlag(algorythm).
// The result should be 1 or 2 depending on the method which has been used, -1 if the
// reconstructor failed (such as in cases when there are only positive charged tracks and no
// leptons), 0 (default value) if the reconstructor did not run.
// Anyhow the original tof can be retrieved direct HPidHitData::getTof().
//
// To setup the constructor call HPidTofRec(Text_t *name,Text_t *title, const char *select, const char *track),
// where "select" contains the key words for configuration (just "," separated list)
// nospline : switch off spline
// nohires : switch off high resolution kickplane
// nolowres : switch off low resolution kickplane
// nork : switch off Runge Kutta tracking
// noreft : switch off Reference Trajectories tracking
// norich : switch off rich mode
// ntuple : switch on create,fill and write ntuple for debugging
// chiin : switch on the chi2>-1 cut for inner MDC segments
// chiout : switch on the chi2>-1 cut for outer MDC segments
// common : use spline as reconstructor for all the trackings
// skip : skip event in DST if start is not reconstructed
// sim : switch on simulation mode
// nopidparam : do not get rich parameters from HPidAlgStandCutsPar
//
// if common mode is switched on, "track" is the chosen tracking algorythm for global tof reconstruction:
// spline : spline
// lowres : low resolution kickplane
// hires : high resolution kickplane
// rk : Runge Kutta tracking
// reft : Reference Trajectories tracking
//
// defaults (empty string) are:
// spline ON
// low resolution kickplane ON
// high resolution kickplane ON
// RungeKutta ON
// Reference Trajectories ON
// fRichMode ON
// ntuple OFF
// chi cut (inner MDC) mode OFF
// chi cut (outer MDC) mode OFF
// skip event OFF
// common OFF
// simulation OFF
// pidparam ON
//
// Usage:
//
// HPidTofRec *pidtofrec = new HPidTofRec("tofreconstructor","tofreconstructor",option,track);
// pidtofrec->setQualityRichParams(200.,4.,2.8,5);
// HTaskSet * pidtofrectask = new HTaskSet("","");
// pidtofrectask->connect(pidtofrec);
// masterTaskSet->add(pidtofrec);
//
//////////////////////////////////////////////////////////////////////////////
// ***************************************************************************
#include "hpidtofrec.h"
#include "hades.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include <TMath.h>
#include "hpidtrackcandsim.h"
#include "hpidgeanttrackset.h"
#include "hpidtrackdata.h"
#include "hpidhitdata.h"
#include "hpidphysicsconstants.h"
#include "hpidalgstandcutspar.h"
#include <iostream>
ClassImp(HPidTofRec)
HPidTofRec::HPidTofRec()
{
// Default constructor
richParam = NULL;
pidalg = -1111;
fRichQparams[0] = 0.; fRichQparams[1] = 0.; fRichQparams[2] = 1000.; fRichQparams[3] = 0.;
nCommonFlag = -1;
for (Short_t nSs=0; nSs<6;nSs++)
{
nMdcSeg[nSs] = 0;
for (Short_t nMm=0; nMm<4;nMm++)
if (gHades->getSetup()->getDetector("Mdc")->getModule(nSs,nMm)) nMdcSeg[nSs]++;
}
hit = 0;
richcorr = 0;
bRichMode = kTRUE;
bMinusMode = kTRUE;
bFillNTuple = kFALSE;
bChiCutInner = kFALSE;
bChiCutOuter = kFALSE;
bSkip = kFALSE;
bIsCommon = kFALSE;
bIsSimulation = kFALSE;
bPidParam = kTRUE;
for (Int_t nAlg=0; nAlg<MAX_MOM_ALGS; nAlg++) // switch on all the tracking algorythms
bTrackAlg[nAlg] = kTRUE;
}
HPidTofRec::HPidTofRec(Text_t *name,Text_t *title, const char *select, const char *track) :
HReconstructor(name,title)
{
// Constructor
TString sel = select;
sel.ToLower();
TString tracking = track;
tracking.ToLower();
bRichMode = kTRUE;
bMinusMode = kTRUE;
bFillNTuple = kFALSE;
bChiCutInner = kFALSE;
bChiCutOuter = kFALSE;
bSkip = kFALSE;
bIsCommon = kFALSE;
bIsSimulation = kFALSE;
for (Int_t nAlg=0; nAlg<MAX_MOM_ALGS; nAlg++) // switch on all the tracking algorythms
bTrackAlg[nAlg] = kTRUE;
richParam = NULL;
pidalg = -1111;
fRichQparams[0] = 0.; fRichQparams[1] = 0.; fRichQparams[2] = 1000.; fRichQparams[3] = 0.;
nCommonFlag = -1;
if (sel.Contains("nospline")) bTrackAlg[ALG_SPLINE] = kFALSE;
if (sel.Contains("nohires")) bTrackAlg[ALG_KICK123] = kFALSE;
if (sel.Contains("nolowres")) bTrackAlg[ALG_KICK] = kFALSE;
if (sel.Contains("nork")) bTrackAlg[ALG_RUNGEKUTTA] = kFALSE;
if (sel.Contains("noreft")) bTrackAlg[ALG_REFT] = kFALSE;
if (sel.Contains("norich")) bRichMode = kFALSE;
if (sel.Contains("ntuple")) bFillNTuple = kTRUE;
if (sel.Contains("chiin")) bChiCutInner = kTRUE;
if (sel.Contains("chiout")) bChiCutOuter = kTRUE;
if (sel.Contains("skip")) bSkip = kTRUE;
if (sel.Contains("sim")) bIsSimulation = kTRUE;
if (sel.Contains("nopidparam")) bPidParam = kFALSE;
if (sel.Contains("common")) {
if (tracking.Contains("spline")) nCommonFlag = ALG_SPLINE;
if (tracking.Contains("lowres")) nCommonFlag = ALG_KICK;
if (tracking.Contains("hires")) nCommonFlag = ALG_KICK123;
if (tracking.Contains("rk")) nCommonFlag = ALG_RUNGEKUTTA;
if (tracking.Contains("reft")) nCommonFlag = ALG_REFT;
if (nCommonFlag!=-1) bIsCommon = kTRUE;
else Warning("init","HPidTofRec: No common tracking setted -> Switching Common Mode OFF");
}
for (Short_t nSs=0; nSs<6;nSs++)
{
nMdcSeg[nSs] = 0;
for (Short_t nMm=0; nMm<4;nMm++)
if (gHades->getSetup()->getDetector("Mdc")->getModule(nSs,nMm)) nMdcSeg[nSs]++;
}
hit = 0;
richcorr = 0;
sDir = "./";
sFile = "";
}
HPidTofRec::~HPidTofRec(void){
// Destructor.
}
Bool_t HPidTofRec::init(void){
cout << "PID Tof Reconstructor default initialization *** " << endl;
pTrackCand=gHades->getCurrentEvent()->getCategory(catPidTrackCand);
if (!pTrackCand) {
Error("init","HPidTofRec: No HPIDTrackCand Input -> Switching HPidTofRec OFF");
}
else iterTrackCand= (HIterator *)pTrackCand->MakeIterator();
cout << "Spline: " <<bTrackAlg[ALG_SPLINE] <<" Kick lowres: "<< bTrackAlg[ALG_KICK] << " Kick hires: "<< bTrackAlg[ALG_KICK123] << " RungeKutta: "<< bTrackAlg[ALG_RUNGEKUTTA] << " RefTraj: "<< bTrackAlg[ALG_REFT] << endl;
cout << " Rich Mode: "<<bRichMode<<" Minus Mode: " << bMinusMode << " ChiCutMode (INNER) " << bChiCutInner << " ChiCutMode (OUTER) " << bChiCutOuter<< " Ntuple Mode: " << bFillNTuple << endl;
cout << "Skip Event: " << bSkip << " Common Mode: " << bIsCommon << " Simulation Mode: " << bIsSimulation << endl;
cout << " Mdc Sectors:t\t";
for (Int_t nSs=0; nSs<6; nSs++) cout << nMdcSeg[nSs] << " ";
cout << endl;
if (bRichMode)
{
if (bPidParam) {
if((richParam = (HPidAlgStandCutsPar *)gHades->getRuntimeDb()
->getContainer(PIDALGSTANDCUTSPAR_NAME)) == NULL)
{
Error("HPidTofRec::init()", "Cannot get parameters: %s",
PIDALGSTANDCUTSPAR_NAME);
return kFALSE;
}
if (bTrackAlg[ALG_RUNGEKUTTA]) {
pidalg = ALG_RUNGEKUTTA;
} else if (bTrackAlg[ALG_SPLINE]) {
pidalg = ALG_SPLINE;
} else if (bTrackAlg[ALG_REFT]) {
pidalg = ALG_REFT;
} else if (bTrackAlg[ALG_KICK123]) {
pidalg = ALG_KICK123;
} else if (bTrackAlg[ALG_KICK]) {
pidalg = ALG_KICK;
}
if (-1111==pidalg) {
Error("HPidTofRec::init()","no valid momentum algorithm activated");
return kFALSE;
}
richParam->setContext(pidalg);
} else { // ! bPidParam
cout << "Rich Quality parameters: RingPatMat "<< fRichQparams[0] << " RingPadNr " << fRichQparams[1] << " Centroid ";
cout << fRichQparams[2] << " RingAverageCharge " << fRichQparams[3] << endl;
} // ! bPidParam
}
if (bFillNTuple)
{
if(bIsSimulation)
hit = new TNtuple("hit" ,"hit" ,"P:Pol:Sec:Sys:Theta:Phi:Flag:Alg:TofOld:TofNew:BetaOld:BetaNew:Mass2Old:Mass2New:RecSys:RecPol:RecSec:Chi2In:Chi2Out:Z:R:TofinoMult:Id:Rich:QSpline:GeantFlag:GeantP:GeantPID:GeantParent");
else hit = new TNtuple("hit" ,"hit" ,"P:Pol:Sec:Sys:Theta:Phi:Flag:Alg:TofOld:TofNew:BetaOld:BetaNew:Mass2Old:Mass2New:RecSys:RecPol:RecSec:Chi2In:Chi2Out:Z:R:TofinoMult:Id:Rich:QSpline");
richcorr = new TNtuple("richcorr","rich corr","MdcTheta:RichTheta:MdcPhi:RichPhi:Sec:Sys:Pol:P:Alg:Chi2In:Chi2Out:Z:R:PatMat:PadNr:Centr:Ampl");
}
bIsFirst = kTRUE;
return kTRUE;
}
Bool_t HPidTofRec::reinit(void)
{
//Check if parameter context corresponds to the
//appropriate momentum algorithm index
//If not -> return kFALSE (analysis can not be done in such case)
//and print error message
if (bPidParam) {
return richParam->checkContext(pidalg);
} else {
return kTRUE;
}
}
Int_t HPidTofRec::execute(void){
// Execute function
if (bIsFirst && bFillNTuple)
{
TString dstFile = gHades->getOutputFile()->GetName();
if (sFile=="") sFile = sDir+"/pidtofrec_"+dstFile(dstFile.Last('/')+1,dstFile.Last('.')-dstFile.Last('/')-1)+".root";
else sFile = sDir + "/" + sFile;
cout << " *** HPidTofRec: Ntuple output file:t" << sFile << "t ***" << endl;
bIsFirst = kFALSE;
}
Bool_t bIsRichRec[MAX_MOM_ALGS], bIsMinusRec[MAX_MOM_ALGS];
Float_t fStartTime[MAX_MOM_ALGS], fRecTof[MAX_MOM_ALGS], fRecStart[MAX_MOM_ALGS];
Short_t nIndex[MAX_MOM_ALGS], nRecSys[MAX_MOM_ALGS],nRecPol[MAX_MOM_ALGS], nRecSec[MAX_MOM_ALGS], nRecIndex[MAX_MOM_ALGS] ;
Bool_t bIsRec = kFALSE;
for (Short_t nAlg=0; nAlg<MAX_MOM_ALGS; nAlg++)
{
bIsRichRec[nAlg] = kFALSE;
bIsMinusRec[nAlg] = kFALSE;
nIndex[nAlg] = 0;
fStartTime[nAlg] = 0.;
nRecSys[nAlg] = -10;
nRecPol[nAlg] = 0;
nRecSec[nAlg] = -1;
fRecTof[nAlg] = 0.;
fRecStart[nAlg] = 0.;
nRecIndex[nAlg] = -1;
}
HPidTrackCandSim *pCand = 0;
iterTrackCand->Reset();
while ((pCand = (HPidTrackCandSim *)iterTrackCand->Next()) != 0) // begin of PidTrackCand iterator
{
for (Int_t nAlg=0; nAlg<MAX_MOM_ALGS; nAlg++) // loop over tracking algorythms
if (bTrackAlg[nAlg]) // selection of algorythm activated for reconstruction
{
nIndex[nAlg]++;
pCand->getTrackData()->nTofRecFlag[nAlg] = -1; // reset HPidTofRec flag
if ((pCand->getTrackData()->bIsAccepted[nAlg]) // check on isXXXAccepted()
&& !((bChiCutInner) && (pCand->getHitData()->fInnerMdcChiSquare==-1)) // check on chi for inner mdc segment
&& !((bChiCutOuter) && (nAlg!=ALG_KICK) && (pCand->getHitData()->fOuterMdcChiSquare==-1)) // check on chi for outer mdc segment
&& !((nAlg==ALG_SPLINE) && (pCand->getTrackData()->fSplineChiSquare==-1)) // skip spline tracks with Qspline==-1
&& (pCand->getHitData()->iSystem!=-1) // skip tracks without META correlation
&& !((pCand->getHitData()->iSystem==0) && (pCand->getHitData()->iTofinoMult!=1))) // skip system==0 && TofinoMult!=1
{
if ((bRichMode) && (pCand->getHitData()->hasRingCorrelation[nAlg])) { // check of RICH correlation
if (bFillNTuple) // fill RICH debug histos
{
Float_t richcorr_ntuple[17] = {
pCand->getHitData()->fMdcTheta,pCand->getHitData()->fRichTheta,pCand->getHitData()->fMdcPhi,pCand->getHitData()->fRichPhi,pCand->getHitData()->nSector,
pCand->getHitData()->iSystem,pCand->getTrackData()->nPolarity[nAlg],pCand->getTrackData()->fMomenta[nAlg],nAlg,pCand->getHitData()->fInnerMdcChiSquare,
pCand->getHitData()->fOuterMdcChiSquare,pCand->getHitData()->fMdcZCoord,pCand->getHitData()->fMdcRCoord,pCand->getHitData()->nRingPatMat,pCand->getHitData()->nRingPadNr,
pCand->getHitData()->fRingCentroid,pCand->getHitData()->nRingAmplitude};
richcorr->Fill(richcorr_ntuple);
} // enf of RICH debug histos
Bool_t bGoodRing = kFALSE;
if (bPidParam) {
Int_t mdc_sec = pCand->getHitData()->nSector;
if (// positrons
((pCand->getHitData()->nRingPatMat
>richParam->getValue(2, 0, mdc_sec, 0))&&
(pCand->getHitData()->fRingCentroid
>=richParam->getValue(2, 0, mdc_sec, 1))&&
(pCand->getHitData()->nRingPadNr
>=richParam->getValue(2, 0, mdc_sec, 2))&&
(pCand->getHitData()->nRingPatMat/pCand->getHitData()->nRingPadNr
>=richParam->getValue(2, 0, mdc_sec, 3)))
#ifdef THIS_IS_BEAUTIFUL_BUT_OBSOLETE // positrons and electrons have same thr
|| // electrons
((pCand->getHitData()->nRingPatMat
>richParam->getValue(3, 0, mdc_sec, 0))&&
(pCand->getHitData()->fRingCentroid
>=richParam->getValue(3, 0, mdc_sec, 1))&&
(pCand->getHitData()->nRingPadNr
>=richParam->getValue(3, 0, mdc_sec, 2))&&
(pCand->getHitData()->nRingPatMat/pCand->getHitData()->nRingPadNr
>=richParam->getValue(3, 0, mdc_sec, 3)))
#endif // THIS_IS_BEAUTIFUL_BUT_OBSOLETE
) {
bGoodRing = kTRUE;
}
} else { // ! PidParam
if ((pCand->getHitData()->nRingPatMat>fRichQparams[0]) && // quality parameters
(pCand->getHitData()->nRingPadNr>=fRichQparams[1]) &&
(pCand->getHitData()->fRingCentroid<fRichQparams[2]) &&
((pCand->getHitData()->nRingAmplitude/pCand->getHitData()->nRingPadNr)>=fRichQparams[3])) {
bGoodRing = kTRUE;
}
} // ! PidParam
if (bGoodRing) {
if ((!bIsRichRec[nAlg]) // if there are no other rich correlated tracks
|| (bIsRichRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]>nMdcSeg[nRecSec[nAlg]])) // priority on sectors with more MDC chambers
|| (bIsRichRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]==nMdcSeg[nRecSec[nAlg]]) && (pCand->getHitData()->iSystem==1&&nRecSys[nAlg]==0)) // or if new one TOF, old one TOFINO
|| (bIsRichRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]==nMdcSeg[nRecSec[nAlg]]) && (pCand->getHitData()->iSystem==nRecSys[nAlg]) && (pCand->getTrackData()->nPolarity[nAlg]==-1 && nRecPol[nAlg]==1)) // or if new one pol==1 and old pol ==1
|| (bIsRichRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]==nMdcSeg[nRecSec[nAlg]]) && (pCand->getHitData()->iSystem==nRecSys[nAlg]) && (pCand->getTrackData()->nPolarity[nAlg]==nRecPol[nAlg]) && (pCand->getHitData()->getTof()<fRecTof[nAlg]))) // faster particle
{
bIsRec = kTRUE;
bIsRichRec[nAlg] = kTRUE;
nRecIndex[nAlg] = nIndex[nAlg];
fRecTof[nAlg] = pCand->getHitData()->getTof();
nRecSys[nAlg] = pCand->getHitData()->iSystem;
nRecPol[nAlg] = pCand->getTrackData()->nPolarity[nAlg];
nRecSec[nAlg] = pCand->getHitData()->nSector;
fRecStart[nAlg] = pCand->getHitData()->getTof()*pCand->getTrackData()->fCorrectedBeta[nAlg]*TMath::C()*1e-6*sqrt(pCand->getTrackData()->fMomenta[nAlg]*pCand->getTrackData()->fMomenta[nAlg]+HPidPhysicsConstants::mass(3)*HPidPhysicsConstants::mass(3))/(TMath::C()*1e-6*pCand->getTrackData()->fMomenta[nAlg])-pCand->getHitData()->getTof();
}
} // end of lepton recognition
} // end of rich loop
if (bMinusMode && (!bIsRichRec[nAlg]) && (pCand->getTrackData()->nPolarity[nAlg]==-1))
{
if ((!bIsMinusRec[nAlg]) // if there are no other negative charged trackss
|| (bIsMinusRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]>nMdcSeg[nRecSec[nAlg]])) // priority on sectors with more MDC chambers
|| (bIsMinusRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]==nMdcSeg[nRecSec[nAlg]]) && (pCand->getHitData()->iSystem==1&&nRecSys[nAlg]==0)) // or if new one TOF, old one TOFINO
|| (bIsMinusRec[nAlg] && (nMdcSeg[pCand->getHitData()->nSector]==nMdcSeg[nRecSec[nAlg]]) && (pCand->getHitData()->iSystem==nRecSys[nAlg]) && (pCand->getHitData()->getTof()<fRecTof[nAlg]))) // faster particle
{
bIsRec = kTRUE;
bIsMinusRec[nAlg] = kTRUE;
nRecIndex[nAlg] = nIndex[nAlg];
fRecTof[nAlg] = pCand->getHitData()->getTof();
nRecSys[nAlg] = pCand->getHitData()->iSystem;
nRecPol[nAlg] = pCand->getTrackData()->nPolarity[nAlg];
nRecSec[nAlg] = pCand->getHitData()->nSector;
fRecStart[nAlg] = pCand->getHitData()->getTof()*pCand->getTrackData()->fCorrectedBeta[nAlg]*TMath::C()*1e-6*sqrt(pCand->getTrackData()->fMomenta[nAlg]*pCand->getTrackData()->fMomenta[nAlg]+HPidPhysicsConstants::mass(8)*HPidPhysicsConstants::mass(8))/(TMath::C()*1e-6*pCand->getTrackData()->fMomenta[nAlg])-pCand->getHitData()->getTof();
}
} // end of pi- recognition
} // end of "quality" check of the track
} // end of loop over different tracking
} // end of HPidTrackCand iterator
Short_t nRecAlg = 0;
// time/beta/mass2 recalculation
for (Short_t nAlg=0; nAlg<MAX_MOM_ALGS; nAlg++)
{
nIndex[nAlg] = 0;
}
iterTrackCand->Reset();
while ((pCand = (HPidTrackCandSim *)iterTrackCand->Next()) != 0) // begin of PidTrackCand iterator
{
for (Int_t nAlg=0; nAlg<MAX_MOM_ALGS; nAlg++) // loop over tracking algorythms
if (bTrackAlg[nAlg]) // selection of algorythm activated for reconstruction, plus isXXXAccepted
{
nIndex[nAlg]++;
if ((pCand->getTrackData()->bIsAccepted[nAlg]) && (pCand->getHitData()->iSystem!=-1) && (bIsRec)) // check on isXXXAccepted()
{
if (bIsCommon) nRecAlg = nCommonFlag;
else nRecAlg = nAlg;
if (bIsRichRec[nRecAlg]) pCand->getTrackData()->nTofRecFlag[nAlg] = 1;
if ((!bIsRichRec[nRecAlg]) && (bIsMinusRec[nRecAlg])) pCand->getTrackData()->nTofRecFlag[nAlg] = 2;
if (pCand->getTrackData()->nTofRecFlag[nAlg]>0) // if the start time was reconstructed
{
pCand->getTrackData()->fTofRecTof[nAlg] = pCand->getHitData()->getTof()+fRecStart[nRecAlg];
pCand->getTrackData()->fTofRecBeta[nAlg] = pCand->getHitData()->getTof()*pCand->getTrackData()->fCorrectedBeta[nAlg]/pCand->getTrackData()->fTofRecTof[nAlg];
pCand->getTrackData()->fTofRecMassSquared[nAlg] = pCand->getTrackData()->fMomenta[nAlg]*pCand->getTrackData()->fMomenta[nAlg]*(1./pCand->getTrackData()->fTofRecBeta[nAlg]/pCand->getTrackData()->fTofRecBeta[nAlg]-1);
}
if (bFillNTuple) // fill debug ntuples
{
if (bIsSimulation)
{
Float_t hit_ntuple[29] = {
pCand->getTrackData()->fMomenta[nAlg],pCand->getTrackData()->nPolarity[nAlg],pCand->getHitData()->nSector,pCand->getHitData()->iSystem,pCand->getHitData()->fMdcTheta,
pCand->getHitData()->fMdcPhi,pCand->getTrackData()->nTofRecFlag[nAlg],nAlg,pCand->getHitData()->getTof(),pCand->getTrackData()->fTofRecTof[nAlg],
pCand->getTrackData()->fCorrectedBeta[nAlg],pCand->getTrackData()->fTofRecBeta[nAlg],pCand->getTrackData()->fMassSquared[nAlg],pCand->getTrackData()->fTofRecMassSquared[nAlg],nRecSys[nAlg],
nRecPol[nAlg],nRecSec[nAlg],pCand->getHitData()->fInnerMdcChiSquare,pCand->getHitData()->fOuterMdcChiSquare,pCand->getHitData()->fMdcZCoord,
pCand->getHitData()->fMdcRCoord,pCand->getHitData()->iTofinoMult,(Float_t)(nRecIndex[nAlg]==nIndex[nAlg]),pCand->getHitData()->hasRingCorrelation[nAlg],pCand->getTrackData()->fSplineChiSquare,
pCand->getGeantTrackSet()->getCorrelationFlag(),pCand->getGeantTrackSet()->getTotalMomentum(),pCand->getGeantTrackSet()->getGeantPID(),pCand->getGeantTrackSet()->getGeantParentID()};
hit->Fill(hit_ntuple);
} // end of ntuple filling sim
else
{
Float_t hit_ntuple[25] = {
pCand->getTrackData()->fMomenta[nAlg],pCand->getTrackData()->nPolarity[nAlg],pCand->getHitData()->nSector,pCand->getHitData()->iSystem,pCand->getHitData()->fMdcTheta,
pCand->getHitData()->fMdcPhi,pCand->getTrackData()->nTofRecFlag[nAlg],nAlg,pCand->getHitData()->getTof(),pCand->getTrackData()->fTofRecTof[nAlg],
pCand->getTrackData()->fCorrectedBeta[nAlg],pCand->getTrackData()->fTofRecBeta[nAlg],pCand->getTrackData()->fMassSquared[nAlg],pCand->getTrackData()->fTofRecMassSquared[nAlg],nRecSys[nAlg],
nRecPol[nAlg],nRecSec[nAlg],pCand->getHitData()->fInnerMdcChiSquare,pCand->getHitData()->fOuterMdcChiSquare,pCand->getHitData()->fMdcZCoord,
pCand->getHitData()->fMdcRCoord,pCand->getHitData()->iTofinoMult,(Float_t)(nRecIndex[nAlg]==nIndex[nAlg]),pCand->getHitData()->hasRingCorrelation[nAlg],pCand->getTrackData()->fSplineChiSquare};
hit->Fill(hit_ntuple);
} // end of ntuple filling exp
} // end of ntuple filling
} // cut on isXXXAccepted() sys!=-1 and tof recalcutation
} // end of algorythm loop
} // end of loop on HPidTrackCand
if (!bIsRec && bSkip) return kSkipEvent;
return 0;
}
Bool_t HPidTofRec::finalize(void){
if(bFillNTuple)
{
TFile *r = TFile::Open(sFile,"RECREATE");
hit ->Write();
richcorr->Write();
r->Save();
r->Close();
r->Delete();
hit->Delete();
richcorr->Delete();
}
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.