using namespace std;
#include "hhypPPipProjector.h"
#include "hgeomvector.h"
#include "hgeomvertexfit.h"
#define c 0.299792
#define D2R 0.0174532925199432955
#define R2D 57.2957795130823229
#define P_mass 938.272309999999998
#define Pip_mass 139.57018
ClassImp(HHypPPipProjector)
HHypPPipProjector::HHypPPipProjector(Char_t *name_i, Option_t par[])
:HHypBaseAlgorithm(name_i,par)
{
simuflag = 0;
}
HHypPPipProjector::~HHypPPipProjector()
{
}
Bool_t HHypPPipProjector::execute()
{
#if(1)
Short_t triggerBit = gHades->getCurrentEvent()->getHeader()->getTBit();
HEventHeader *evHeader = gHades->getCurrentEvent()->getHeader();
UInt_t date = evHeader->getDate();
UInt_t time = evHeader->getTime();
UInt_t dsf = evHeader->getDownscaling();
if (!beam)
{
cerr << algoName << " needs beam particle! " << endl;
return kFALSE;
}
Float_t beta_p=0, beta_pip=0;
Float_t r_p=0,z_p=0,r_pip=0,z_pip=0;
Float_t RKchiq_p=-10, RKchiq_pip=-10;
Short_t sector_p=-1, sector_pip=-1;
Short_t system_p=-1, system_pip=-1;
Float_t InnerMDCchiq_p=-10, InnerMDCchiq_pip=-10;
TVector3 v1(0,0,0), v2(0,0,0);
Float_t P_p=0., P_pip=0., Th_p=0., Th_pip=0., Ph_p=0., Ph_pip=0.;
Int_t geant_grandparentID_p = -10, geant_parentID_p = -10, geantID_p = -100;
Int_t geant_grandparentID_pip = -10, geant_parentID_pip = -10, geantID_pip = -100;
Float_t geninfo1_p =-10, geninfo2_p =-10;
Float_t geninfo1_pip=-10, geninfo2_pip=-10;
Float_t geninfo_p =-10, geninfo_pip =-10;
TLorentzVector proton(0,0,0,0), pip(0,0,0,0);
Float_t dEdx_p=0;
Float_t dEdx_pip=0;
Float_t deltaTof= 100000000;
Int_t BestComb = 0;
Int_t IsBestComb = 0;
Int_t icomb=-1;
mylist->CombIteratorReset();
while (mylist->CombIterator())
{
Float_t deltaTof_tmp;
icomb++;
mylist->getUserValue(DELTATOF_CHI2, deltaTof_tmp);
if( deltaTof_tmp < deltaTof )
{
deltaTof = deltaTof_tmp;
BestComb = icomb;
}
}
mylist->CombIteratorReset();
Int_t ncomb=mylist->getNcomb();
icomb=-1;
while (mylist->CombIterator())
{
icomb++;
if( icomb == BestComb ) IsBestComb = 1;
else IsBestComb = 0;
if(mylist->getProbAlg(icomb)<=0) continue;
TLorentzVector geant_proton(0,0,0,0);
TLorentzVector geant_pip(0,0,0,0);
TVector3 vertex;
TVector3 pp_distance;
Float_t dist_ppip=100;
if (mylist->getIterStatus() == kTRUE)
{
const HPidHitData *PidData = NULL;
const HPidTrackData *pTrack = NULL;
HPidTrackCand *PidTrackCand= NULL;
if (simuflag == 1 )
{
HPidTrackCandSim *my_p = (HPidTrackCandSim *) CatTrackCandSim->
getObject(mylist->getIdxPidTrackCand(icomb, 0));
HPidTrackCandSim *my_pip = (HPidTrackCandSim *) CatTrackCandSim->
getObject(mylist->getIdxPidTrackCand(icomb, 1));
const HPidGeantTrackSet *p1GeantSet = my_p->getGeantTrackSet();
const HPidGeantTrackSet *p2GeantSet = my_pip->getGeantTrackSet();
geninfo_p = p1GeantSet->getGenInfo();
geninfo1_p = p1GeantSet->getGenInfo1();
geninfo2_p = p1GeantSet->getGenInfo2();
geantID_p = p1GeantSet->getGeantPID();
geant_parentID_p = p1GeantSet->getGeantParentID();
geant_grandparentID_p = p1GeantSet->getGeantGrandParentID();
TVector3 v1(p1GeantSet->getGeantMomX(), p1GeantSet->getGeantMomY(), p1GeantSet->getGeantMomZ());
geant_proton.SetVectM(v1,P_mass);
geninfo_pip = p2GeantSet->getGenInfo();
geninfo1_pip = p2GeantSet->getGenInfo1();
geninfo2_pip = p2GeantSet->getGenInfo2();
geantID_pip = p2GeantSet->getGeantPID();
geant_parentID_pip = p2GeantSet->getGeantParentID();
geant_grandparentID_pip = p2GeantSet->getGeantGrandParentID();
TVector3 v2(p2GeantSet->getGeantMomX(), p2GeantSet->getGeantMomY(), p2GeantSet->getGeantMomZ());
geant_pip.SetVectM(v2,P_mass);
}
HCategory *pidpartCat = gHades->getCurrentEvent()->getCategory(catPidTrackCand);
if (pidpartCat != NULL )
{
PidTrackCand = (HPidTrackCand *) pidpartCat->getObject(mylist->getIdxPidTrackCand(icomb, 0));
if (PidTrackCand != NULL)
{
PidData = PidTrackCand->getHitData();
pTrack = PidTrackCand->getTrackData();
InnerMDCchiq_p = PidData->fInnerMdcChiSquare;
system_p = PidData->iSystem;
sector_p = PidData->getSector();
beta_p = pTrack->getBeta(4);
r_p = pTrack->getTrackR(4);
z_p = pTrack->getTrackZ(4);
P_p = pTrack->fMomenta[4];
Th_p = pTrack->getRKTheta();
Ph_p = pTrack->getRKPhi();
Th_p=Th_p*D2R;
Ph_p=Ph_p*D2R;
dEdx_p = PidData -> getInnerMdcdEdx();
P_p = enLossCorr.getCorrMom(14,P_p,Th_p*R2D);
v1.SetXYZ(P_p*sin(Th_p)*cos(Ph_p),P_p*sin(Th_p)*sin(Ph_p),P_p*cos(Th_p));
proton.SetVectM(v1,P_mass);
}
PidTrackCand = (HPidTrackCand *) pidpartCat->getObject(mylist->getIdxPidTrackCand(icomb, 1));
if (PidTrackCand != NULL) {
PidData = PidTrackCand->getHitData();
pTrack = PidTrackCand->getTrackData();
InnerMDCchiq_pip = PidData->fInnerMdcChiSquare;
system_pip = PidData->iSystem;
sector_pip = PidData->getSector();
beta_pip = pTrack->getBeta(4);
r_pip = pTrack->getTrackR(4);
z_pip = pTrack->getTrackZ(4);
P_pip = pTrack->fMomenta[4];
Th_pip = pTrack->getRKTheta();
Ph_pip = pTrack->getRKPhi();
Th_pip=Th_pip*D2R;
Ph_pip=Ph_pip*D2R;
dEdx_pip = PidData -> getInnerMdcdEdx();
P_p = enLossCorr.getCorrMom(8,P_p,Th_p*R2D);
v2.SetXYZ(P_pip*sin(Th_pip)*cos(Ph_pip),P_pip*sin(Th_pip)*sin(Ph_pip),P_pip*cos(Th_pip));
pip.SetVectM(v2,Pip_mass);
}
dist_ppip = calcVertex((HPidTrackCand *) pidpartCat->getObject(mylist->getIdxPidTrackCand(icomb, 0)),
(HPidTrackCand *) pidpartCat->getObject(mylist->getIdxPidTrackCand(icomb, 1)),
&vertex, &pp_distance);
}
TLorentzVector miss2 = (*beam) - (proton + pip);
TLorentzVector R1 = miss2 + proton;
TLorentzVector R2 = miss2 + pip;
if(proton.E()==0 || pip.E()==0) {cout<<"HHypPPipProjector:: empty particle"<<endl; continue;}
TLorentzVector miss2_cm = miss2;
TLorentzVector proton_cm = proton;
TLorentzVector pip_cm = pip;
miss2_cm.Boost(0.0, 0.0, -(*beam).Beta() );
proton_cm.Boost(0.0, 0.0, -(*beam).Beta() );
pip_cm.Boost(0.0, 0.0, -(*beam).Beta() );
Float_t tanTh1 = TMath::Tan(proton.Theta());
Float_t tanTh2 = TMath::Tan(pip.Theta());
TVector3 NppCM, NPi0Z;
NppCM = (proton_cm.Vect()).Cross(pip_cm.Vect());
NPi0Z = (miss2_cm.Vect()).Cross((*beam).Vect());
if(simuflag==1)
{
Float_t fpp[]={ sector_p, sector_pip, system_p, system_pip,
proton.P(), proton.Theta(), proton.Phi(),
pip.P(), pip.Theta(), pip.Phi(),
z_p, r_p, z_pip, r_pip,
vertex.X(), vertex.Y(), vertex.Z(), dist_ppip,
miss2.M(), miss2.P(), (proton+pip).M(), fabs(v1.Phi() - v2.Phi()),
tanTh1*tanTh2, miss2_cm.CosTheta(),
beta_p, beta_pip,
RKchiq_p, RKchiq_pip, ncomb, dsf, triggerBit, date, time,
InnerMDCchiq_p, InnerMDCchiq_pip,
geantID_p, geant_parentID_p, geant_grandparentID_p,
geantID_pip, geant_parentID_pip, geant_grandparentID_pip,
geninfo_p, geninfo1_p, geninfo2_p,
geninfo_pip, geninfo1_pip, geninfo2_pip, IsBestComb
};
pp->Fill(fpp);
}
else
{
Float_t fpp[]={ sector_p, sector_pip, system_p, system_pip,
proton.P(), proton.Theta(), proton.Phi(),
pip.P(), pip.Theta(), pip.Phi(),
z_p, r_p, z_pip, r_pip,
dEdx_p, dEdx_pip,
vertex.X(), vertex.Y(), vertex.Z(), dist_ppip,
miss2.M(), miss2.P(), (proton+pip).M(), fabs(v1.Phi() - v2.Phi()),
tanTh1*tanTh2, miss2_cm.CosTheta(), (proton_cm+pip_cm).CosTheta(),
beta_p, beta_pip,
RKchiq_p, RKchiq_pip, ncomb, dsf, triggerBit, date, time,
InnerMDCchiq_p, InnerMDCchiq_pip, IsBestComb
};
pp->Fill(fpp);
}
} else cerr << algoName << " got no TLorentzVector " << endl;
}
#endif
return kTRUE;
}
Bool_t HHypPPipProjector::init()
{
cerr<<" HHypPPipProjector::init() "<<endl;
enLossCorr.setDefaultPar("jan04");
simCat = gHades->getCurrentEvent()->getCategory(catGeantKine);
if (!simCat)
{
simuflag = 0;
}
else
{
simuflag = 1;
cout << "Projector uses SIMULATION" << endl;
CatTrackCandSim = NULL;
if ((CatTrackCandSim =
gHades->getCurrentEvent()->getCategory(catPidTrackCand)) == NULL) {
Error("init", "Cannot get catPidTrackCandSim cat");
return kFALSE;
}
}
TString input(channel->Get(initList));
TFile *f=GetHFile();
f->cd();
if(simuflag==1)
{
pp = new TNtuple(input + TString("_ppip"),
"sector_p:sector_pip:system_p:system_pip:P_p:Th_p:Ph_p:P_pip:Th_pip:Ph_pip:z_p:r_p:z_pip:r_pip:xvert:yvert:zvert:dist_ppip:m_miss2:p_miss2:m_inv:dphi:tanT1tanT2:miss_cosThCM:inv_cosThCM:beta_p:beta_pip:RKchiq_p:RKchiq_pip:ncomb:dsf:triggerBit:date:time:InnerMDCchiq_p:InnerMDCchiq_pip:geant_ID_p:geant_parentID_p:geant_grandparentID_p:geant_ID_pip:geant_parentID_pip:geant_grandparentID_pip:geninfo_p:geninfo1_p:geninfo2_p:geninfo_pip:geninfo1_pip:IsBestComb",
"sector_p:sector_pip:system_p:system_pip:P_p:Th_p:Ph_p:P_pip:Th_pip:Ph_pip:z_p:r_p:z_pip:r_pip:xvert:yvert:zvert:dist_ppip:m_miss2:p_miss2:m_inv:dphi:tanT1tanT2:miss_cosThCM:inv_cosThCM:beta_p:beta_pip:RKchiq_p:RKchiq_pip:ncomb:dsf:triggerBit:date:time:InnerMDCchiq_p:InnerMDCchiq_pip:geant_ID_p:geant_parentID_p:geant_grandparentID_p:geant_ID_pip:geant_parentID_pip:geant_grandparentID_pip:geninfo_p:geninfo1_p:geninfo2_p:geninfo_pip:geninfo1_pip:IsBestComb");
}
else
{
pp = new TNtuple(input + TString("_ppip"),
"sector_p:sector_pip:system_p:system_pip:P_p:Th_p:Ph_p:P_pip:Th_pip:Ph_pip:z_p:r_p:z_pip:r_pip:dEdx_p:dEdx_pip:xvert:yvert:zvert:dist_ppip:m_miss2:p_miss2:m_inv:dphi:tanT1tanT2:miss_cosThCM:inv_cosThCM:beta_p:beta_pip:RKchiq_p:RKchiq_pip:ncomb:dsf:triggerBit:date:time:InnerMDCchiq_p:InnerMDCchiq_pip:IsBestComb",
"sector_p:sector_pip:system_p:system_pip:P_p:Th_p:Ph_p:P_pip:Th_pip:Ph_pip:z_p:r_p:z_pip:r_pip:dEdx_p:dEdx_pip:xvert:yvert:zvert:dist_ppip:m_miss2:p_miss2:m_inv:dphi:tanT1tanT2:miss_cosThCM:inv_cosThCM:beta_p:beta_pip:RKchiq_p:RKchiq_pip:ncomb:dsf:triggerBit:date:time:InnerMDCchiq_p:InnerMDCchiq_pip:IsBestComb");
}
return kTRUE;
}
Bool_t HHypPPipProjector::reinit()
{
return kTRUE;
}
Bool_t HHypPPipProjector::finalize()
{
pp->Write();
return kTRUE;
}
Bool_t HHypPPipProjector::IsOpposit(Short_t sec1, Short_t sec2)
{
if(sec1==0 && sec2==3) return 1; else
if(sec1==1 && sec2==4) return 1; else
if(sec1==2 && sec2==5) return 1; else
if(sec1==3 && sec2==0) return 1; else
if(sec1==4 && sec2==1) return 1; else
if(sec1==5 && sec2==2) return 1; else
return 0;
}
Float_t HHypPPipProjector::calcVertex(HPidTrackCand *p1, HPidTrackCand *p2,
TVector3 *vertex, TVector3 *distance)
{
HGeomVector hoff[2];
HGeomVector hdir[2];
HGeomVector hvertex;
HGeomVertexFit hfitter;
TVector3 dir[2];
Float_t dist;
Float_t det1, det2;
hoff[0].setXYZ( p1->getTrackData()->getTrackR(4)*TMath::Cos(p1->getTrackData()->getRKPhi()*D2R
+ TMath::PiOver2()),
p1->getTrackData()->getTrackR(4)*TMath::Sin(p1->getTrackData()->getRKPhi()*D2R
+ TMath::PiOver2()),
p1->getTrackData()->getTrackZ(4));
hoff[1].setXYZ( p2->getTrackData()->getTrackR(4)*TMath::Cos(p1->getTrackData()->getRKPhi()*D2R
+ TMath::PiOver2()),
p1->getTrackData()->getTrackR(4)*TMath::Sin(p1->getTrackData()->getRKPhi()*D2R
+ TMath::PiOver2()),
p2->getTrackData()->getTrackZ(4));
dir[0].SetMagThetaPhi(p1->getTrackData()->getMomenta(4),p1->getTrackData()->getRKTheta()*D2R,
p1->getTrackData()->getRKPhi()*D2R);
dir[1].SetMagThetaPhi(p2->getTrackData()->getMomenta(4),p2->getTrackData()->getRKTheta()*D2R,
p2->getTrackData()->getRKPhi()*D2R);
hdir[0].setXYZ(dir[0].X(),dir[0].Y(),dir[0].Z());
hdir[1].setXYZ(dir[1].X(),dir[1].Y(),dir[1].Z());
hfitter.reset();
for (Int_t i = 0; i < 2; i++) {
hfitter.addLine(hoff[i],hdir[i]);
}
hfitter.getVertex(hvertex);
vertex->SetXYZ(hvertex.getX(),hvertex.getY(),hvertex.getZ());
det1 = (
(hoff[0].getX()-hoff[1].getX()) *
(hdir[0].getY()*hdir[1].getZ()-hdir[0].getZ()*hdir[1].getY()) -
(hoff[0].getY()-hoff[1].getY()) *
(hdir[0].getX()*hdir[1].getZ()-hdir[0].getZ()*hdir[1].getX()) +
(hoff[0].getZ()-hoff[1].getZ()) *
(hdir[0].getX()*hdir[1].getY()-hdir[0].getY()*hdir[1].getX())
);
det2 = TMath::Sqrt(
(hdir[0].getX()*hdir[1].getY() - hdir[0].getY()*hdir[1].getX()) *
(hdir[0].getX()*hdir[1].getY() - hdir[0].getY()*hdir[1].getX()) +
(hdir[0].getX()*hdir[1].getZ() - hdir[0].getZ()*hdir[1].getX()) *
(hdir[0].getX()*hdir[1].getZ() - hdir[0].getZ()*hdir[1].getX()) +
(hdir[0].getY()*hdir[1].getZ() - hdir[0].getZ()*hdir[1].getY()) *
(hdir[0].getY()*hdir[1].getZ() - hdir[0].getZ()*hdir[1].getY())
);
*distance = dir[0].Cross(dir[1]);
if (det2==0) {
dist = -1.;
} else {
dist = TMath::Abs(det1/det2);
distance->SetMag(dist);
}
return dist;
}
Last change: Sat May 22 12:58:05 2010
Last generated: 2010-05-22 12:58
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.