using namespace std;
#include "hgeantkineana.h"
#include "hgeantrich.h"
#include "htrackinfo.h"
#include "hgeantkine.h"
#include "hhitmatchsim.h"
#include "hdihitmatch.h"
#include "hconstant.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hrichdetector.h"
#include "hparset.h"
#include "hrichhitsim.h"
#include "hrichutilfunc.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hspectrometer.h"
#include "hdetector.h"
#include "hrichdetector.h"
#include "hcategory.h"
#include "hiterator.h"
#include "hdebug.h"
#include "hades.h"
#include "richdef.h"
#include "hlinearcategory.h"
#include "hmatrixcategory.h"
#include "hgeomvector2.h"
#include "hrichgeometrypar.h"
#include "hrichcut.h"
#include <fstream>
#include <stdlib.h>
ClassImp(HGeantKineAna)
HGeantKineAna::HGeantKineAna(const Text_t *name,const Text_t *title) :
HReconstructor(name,title)
{
}
HGeantKineAna::HGeantKineAna(const Text_t *name,const Text_t *title,const Char_t* filename,const Char_t* evtgen) :
HReconstructor(name,title)
{
pFileName = filename;
pEvtGen = evtgen;
}
HGeantKineAna::HGeantKineAna()
{
}
HGeantKineAna::~HGeantKineAna(void)
{
}
Bool_t HGeantKineAna::init() {
if (gHades) {
HEvent *event=gHades->getCurrentEvent();
HRuntimeDb *rtdb=gHades->getRuntimeDb();
HSpectrometer *spec=gHades->getSetup();
HRichDetector *rich = (HRichDetector*)spec->getDetector("Rich");
if (event && rtdb && rich) {
fRichPID=gHades->getCurrentEvent()->getCategory(catRichHit);
if (!fRichPID) Warning("init","no HRichHit cat");
if (fRichPID) fRichIter = (HIterator*) fRichPID->MakeIterator();
if(!fRichIter) Warning("init","no RichHitSim iter defined");
fGeantRichMirrorCat = (HMatrixCategory*)(gHades->getCurrentEvent()
->getCategory(catRichGeantRaw+2));
if (!fGeantRichMirrorCat)
{
Error("HRichCorrelatorSim::init",
"no GEANT RICH MIRROR category available");
}
iter_mirror = (HIterator *)fGeantRichMirrorCat->MakeIterator("native");
fGeantMdcCat = (HMatrixCategory*)(gHades->getCurrentEvent()
->getCategory(catMdcGeantRaw));
if (!fGeantMdcCat)
{
Error("HRichCorrelatorSim::init",
"no GEANT MDC RAW category available");
}
iter_mdcgeant = (HIterator *)fGeantMdcCat->MakeIterator("native");
fGeantKineCat =(HLinearCategory*) event->getCategory(catGeantKine);
if (!fGeantKineCat)
{
Error("HGeantKineAna::init",
"no GEANT Kine category available");
}
setGeantKineCat(fGeantKineCat);
iter_kine = (HIterator *) getGeantKineCat()->MakeIterator("native");
} else {
Error ("init","! (event && rtdb)");
return kFALSE;
}
iniSwitches();
iniControlHistos();
iniCounters();
pFileOut = new TFile(pFileName.Data(),"RECREATE");
el = new TEventList("rings","rings",100);
return kTRUE;
} else {
Error ("init","! (gHades)");
return kFALSE;
}
}
void HGeantKineAna::iniSwitches()
{
kDumpIt = kTRUE;
}
void HGeantKineAna::iniCounters()
{
nEvtsProcessed=0;
nbRings=0;
nbLeptons=0;
nbDalitzPairs=0;
nbDalitzSingle=0;
nbTracks=0;
nbTrackPairs=0;
nbgMatchedPairs=0;
nbgMatchedTracks=0;
nbgMatchedGPairs=0;
nbgMatchedGTracks=0;
}
void HGeantKineAna::iniControlHistos()
{
pHistArray = new TObjArray(12);
med_conv = new TH1D("Medium_conv","Medium_conv",41,0,42);
pHistArray->Add(med_conv);
mech_conv = new TH1D("Mechanism_conv","Mechanism_conv",36,0,35);
pHistArray->Add(mech_conv);
par_conv = new TH1D("Parent_conv","Parent_conv",56,0,55);
pHistArray->Add(par_conv);
par_med_conv = new TH2D("parent_medium_conv","parent_medium_conv",56,0,55,46,0,45);
pHistArray->Add(par_med_conv);
par_mech_conv = new TH2D("parent_mechanism_conv","parent_mechanism_conv",56,0,55,36,0,35);
pHistArray->Add(par_mech_conv);
mech_mom_conv = new TH2D("mechanism_momentum_conv","mechanism_momentum_conv",36,0,35,100,0,1000);
pHistArray->Add(mech_mom_conv);
g_conv_opangle = new TH1F("pi0_2gamma_opangle","pi0->2*gamma_opangle",180,0,180);
pHistArray->Add(g_conv_opangle);
deltaP_opangle = new TH2F("delta_AbsP_opangle","delta_Abs(P)__opangle",100,0,1000,180,0,180);
pHistArray->Add(deltaP_opangle);
med_dalitz = new TH1D("Medium_dalitz","Medium_dalitz",41,0,42);
pHistArray->Add(med_dalitz);
mech_dalitz = new TH1D("Mechanism_dalitz","Mechanism_dalitz",36,0,35);
pHistArray->Add(mech_dalitz);
par_dalitz = new TH1D("Parent_dalitz","Parent_dalitz",56,0,55);
pHistArray->Add(par_dalitz);
par_med_dalitz = new TH2D("parent_medium_dalitz","parent_medium_dalitz",56,0,55,46,0,45);
pHistArray->Add(par_med_dalitz);
par_mech_dalitz = new TH2D("parent_mechanism_dalitz","parent_mechanism_dalitz",56,0,55,36,0,35);
pHistArray->Add(par_mech_dalitz);
mech_mom_dalitz = new TH2D("mechanism_momentum_dalitz","mechanism_momentum_dalitz",36,0,35,100,0,1000);
pHistArray->Add(mech_mom_dalitz);
hidkine = new TH1D("ID_kine","ID_kine",50,0,50);
pHistArray->Add(hidkine);
hmedkine = new TH1D("Medium_kine","Medium_kine",41,0,42);
pHistArray->Add(hmedkine);
hmechkine = new TH1D("Mechanism_kine","Mechanism_kine",36,0,35);
pHistArray->Add(hmechkine);
hmomkine = new TH1D("Momentum_kine","Momentum_kine",25,0,500);
pHistArray->Add(hmomkine);
hmomthetakine = new TH2D("Momentum_theta_kine","Momentum_theta_kine",180,0,180,100,0,500);
pHistArray->Add(hmomthetakine);
hmompairkine = new TH2D("Momentum_pair_kine","Momentum_pair_kine",100,0,500,100,0,500);
pHistArray->Add(hmompairkine);
hthetapairkine = new TH2D("polangle_pair_kine","polangle_pair_kine",180,0,180,180,0,180);
pHistArray->Add(hthetapairkine);
hvertexkine = new TH3D("Vertex_kine","Vertex_kine",100,-10,10,
100,-10,10,100,-10,10);
pHistArray->Add(hvertexkine);
hparentkine = new TH1D("parent_kine","parent_kine",50,0,50);
pHistArray->Add(hparentkine);
hcntdistx = new TH1D("xdist","xdist",21,-10,10);
pHistArray->Add(hcntdistx);
hcntdisty = new TH1D("ydist","ydist",21,-10,10);
pHistArray->Add(hcntdisty);
hcntdistxy = new TH2D("xydist","xydist",21,-10,10,21,-10,10);
pHistArray->Add(hcntdistxy);
hweight = new TH1D("weight","weight",40,0,1.1);
pHistArray->Add(hweight);
hweightdist = new TH2D("weightdist","weightdist",40,0,1.1,22,-1,10.);
pHistArray->Add(hweightdist);
hpi0invmass = new TH1D("pi0mass","pi0mass",300,0,300);
pHistArray->Add(hpi0invmass);
hdalitzopang = new TH1D("Dalitzopang","Dalitzopang",101,0,100);
pHistArray->Add(hdalitzopang);
hdalitzinvmass = new TH1D("Dalitzinvmass","Dalitzinvmass",151,0,150);
pHistArray->Add(hdalitzinvmass);
hgammathetatheta = new TH2D("pi0gammatheta_theta","pi0gammatheta_theta",
180,0,180,180,0,180);
pHistArray->Add(hgammathetatheta);
hgammamommom = new TH2D("pi0gammamom_mom","pi0gammamom_mom",
100,0,500,100,0,500);
pHistArray->Add(hgammamommom);
hgammamom1theta2 = new TH2D("pi0gammamom1_theta2","pi0gammamom1_theta2",
100,0,500,180,0,180);
pHistArray->Add(hgammamom1theta2);
hgammamomtheta = new TH2D("pi0gammamom_theta","pi0gammamom_theta",
100,0,500,180,0,180);
pHistArray->Add(hgammamomtheta);
hmomthetaallsingle = new TH2D("Momentum_theta_allsingle","Momentum_theta_allsingle",30,0,300,20,0,90);
pHistArray->Add(hmomthetaallsingle);
hmomthetareconsingle = new TH2D("Momentum_theta_reconsingle","Momentum_theta_reconsingle",30,0,300,20,0,90);
pHistArray->Add(hmomthetareconsingle);
hmomthetaallpair = new TH2D("Momentum_theta_allpair","Momentum_theta_allpair",30,0,300,20,0,90);
pHistArray->Add(hmomthetaallpair);
hmomthetareconpair = new TH2D("Momentum_theta_reconpair","Momentum_theta_reconpair",30,0,300,20,0,90);
pHistArray->Add(hmomthetareconpair);
hpolpol = new TH2D("diff_polang_gamma_lepton1.2","diff_polang_gamma_lepton1.2",200,0,20,200,0,20);
pHistArray->Add(hpolpol);
hpoldiffinvmass = new TH2D("diff_polangdiff_invmass","diff_polangdiff_invmass",600,0,300,500,0,50);
pHistArray->Add(hpoldiffinvmass);
hmomdiffpoldiff = new TH2D("diff_polangdiff_mom","diff_polangdiff_mom",1000,0,100,500,0,50);
pHistArray->Add(hmomdiffpoldiff);
}
Bool_t HGeantKineAna::reconPionFromGammaConversionLeptons(TObjArray* t)
{
Bool_t isReconPi0 = kFALSE;
if (t->GetLast()+1<4) return isReconPi0;
for (Int_t i=0;i<(t->GetLast()+1);i+=4)
{
HGeantKine *e1 = (HGeantKine*)(*t)[i];
HGeantKine *e2 = 0;
if (i+1 <= t->GetLast()) e2 = (HGeantKine*)(*t)[i+1];
else return isReconPi0;
Int_t aTrack1, aID1;
Int_t aPar1,aMed1,aMech1;
Int_t aTrack2, aID2;
Int_t aPar2,aMed2,aMech2;
if (e1)
{
e1->getParticle(aTrack1,aID1);
e1->getCreator(aPar1,aMed1,aMech1);
}
if (e2)
{
e2->getParticle(aTrack2,aID2);
e2->getCreator(aPar2,aMed2,aMech2);
}
Float_t p1sumx,p1sumy,p1sumz;
p1sumx=p1sumy=p1sumz=0;
Float_t t1mean,p1mean;
t1mean=p1mean=0;
if ( e1 && e2 &&
aID1+aID2 == 5 &&
aPar1==aPar2 &&
HRichUtilFunc::getParentParID(aPar1,(HLinearCategory*)fGeantKineCat)==7 &&
HRichUtilFunc::calcOpeningAngleKine(e1,e2)>0.
)
{
Float_t apx1, apy1, apz1;
e1->getMomentum(apx1,apy1,apz1);
Float_t apx2, apy2, apz2;
e2->getMomentum(apx2,apy2,apz2);
p1sumx=apx1+apx2;
p1sumy=apy1+apy2;
p1sumz=apz1+apz2;
Float_t theta1,phi1;
HRichUtilFunc::calcParticleAnglesKine(e1,theta1,phi1);
Float_t theta2,phi2;
HRichUtilFunc::calcParticleAnglesKine(e2,theta2,phi2);
t1mean = (theta1+theta2)/2.;
p1mean = (phi1+phi2)/2.;
HGeantKine *gamma = HRichUtilFunc::findParent(e2,(HLinearCategory*)fGeantKineCat);
Float_t gammat,gammap;
HRichUtilFunc::calcParticleAnglesKine(gamma,gammat,gammap);
gamma->getMomentum(apx1,apy1,apz1);
hpolpol->Fill(TMath::Abs(gammat-theta1),(TMath::Abs(gammat-theta2)));
}
HGeantKine *e3 = 0;
HGeantKine *e4 = 0;
if (i+2 <= t->GetLast()) e3 = (HGeantKine*)(*t)[i+2];
else return isReconPi0;
if (i+3 <= t->GetLast()) e4 = (HGeantKine*)(*t)[i+3];
else return isReconPi0;
Int_t aTrack3, aID3;
Int_t aPar3,aMed3,aMech3;
Int_t aTrack4, aID4;
Int_t aPar4,aMed4,aMech4;
if (e3)
{
e3->getParticle(aTrack3,aID3);
e3->getCreator(aPar3,aMed3,aMech3);
}
if (e4)
{
e4->getParticle(aTrack4,aID4);
e4->getCreator(aPar4,aMed4,aMech4);
}
Float_t p2sumx,p2sumy,p2sumz;
p2sumx=p2sumy=p2sumz=0;
Float_t t2mean,p2mean;
t2mean=p2mean=0;
if ( e3 && e4 &&
aID3+aID4 == 5 &&
aPar3==aPar4 &&
HRichUtilFunc::getParentParID(aPar3,(HLinearCategory*)fGeantKineCat)==7 &&
HRichUtilFunc::calcOpeningAngleKine(e3,e4)>0.
)
{
Float_t apx1, apy1, apz1;
e3->getMomentum(apx1,apy1,apz1);
Float_t apx2, apy2, apz2;
e4->getMomentum(apx2,apy2,apz2);
p2sumx=apx1+apx2;
p2sumy=apy1+apy2;
p2sumz=apz1+apz2;
Float_t theta1,phi1;
HRichUtilFunc::calcParticleAnglesKine(e3,theta1,phi1);
Float_t theta2,phi2;
HRichUtilFunc::calcParticleAnglesKine(e4,theta2,phi2);
t2mean = (theta1+theta2)/2.;
p2mean = (phi1+phi2)/2.;
HGeantKine *gamma = HRichUtilFunc::findParent(e3,(HLinearCategory*)fGeantKineCat);
Float_t gammat,gammap;
HRichUtilFunc::calcParticleAnglesKine(gamma,gammat,gammap);
hpolpol->Fill(TMath::Abs(gammat-theta1),(TMath::Abs(gammat-theta2)));
}
if (e1 && e2 && e3 && e4)
{
Float_t p1sumtot = TMath::Sqrt(p1sumx*p1sumx+p1sumy*p1sumy+p1sumz*p1sumz);
Float_t p2sumtot = TMath::Sqrt(p2sumx*p2sumx+p2sumy*p2sumy+p2sumz*p2sumz);
Float_t opang = HRichUtilFunc::calcOpeningAngleT(t1mean,p1mean,t2mean,p2mean);
Float_t invmass = 2.*sin(opang/57.3/2.)*sqrt(p1sumtot*p2sumtot);
if (invmass>0.)
{
Float_t theta1,phi1;
HRichUtilFunc::calcParticleAnglesKine(e1,theta1,phi1);
Float_t theta2,phi2;
HRichUtilFunc::calcParticleAnglesKine(e2,theta2,phi2);
Float_t theta3,phi3;
HRichUtilFunc::calcParticleAnglesKine(e3,theta3,phi3);
Float_t theta4,phi4;
HRichUtilFunc::calcParticleAnglesKine(e4,theta4,phi4);
Float_t mom1,mom2,mom3,mom4;
mom1 = e1->getTotalMomentum();
mom2 = e2->getTotalMomentum();
mom3 = e3->getTotalMomentum();
mom4 = e4->getTotalMomentum();
HGeantKine *gamma1 = HRichUtilFunc::findParent(e1,(HLinearCategory*)fGeantKineCat);
HGeantKine *gamma2 = HRichUtilFunc::findParent(e3,(HLinearCategory*)fGeantKineCat);
Float_t gamma1t,gamma1p,gamma2t,gamma2p;
HRichUtilFunc::calcParticleAnglesKine(gamma1,gamma1t,gamma1p);
HRichUtilFunc::calcParticleAnglesKine(gamma2,gamma2t,gamma2p);
hpoldiffinvmass->Fill(invmass,fabs(gamma1t-theta1)-fabs(gamma1t-theta2));
hpoldiffinvmass->Fill(invmass,fabs(gamma2t-theta3)-fabs(gamma2t-theta4));
hmomdiffpoldiff->Fill(fabs(mom1-mom2),fabs(gamma1t-theta1)-fabs(gamma1t-theta2));
hmomdiffpoldiff->Fill(fabs(mom3-mom4),fabs(gamma2t-theta3)-fabs(gamma2t-theta4));
}
if (invmass>130. && invmass<140.)
{
isReconPi0=kTRUE;
}
}
}
return isReconPi0;
}
TObjArray* HGeantKineAna::getPionGammaConversionLeptons()
{
TObjArray *leps = new TObjArray(4);
HGeantKine * pion =0;
iter_kine->Reset();
while((pion=(HGeantKine *)iter_kine->Next())!=0)
{
Int_t aID, aTrack;
pion->getParticle(aTrack,aID);
if (aID==7)
{
HIterator* iter_gamma = (HIterator*)(fGeantKineCat->MakeIterator("native"));
iter_gamma->Reset();
HGeantKine *gamma=0;
while((gamma=(HGeantKine *)iter_gamma->Next())!=0)
{
Int_t aTrackGamma, aIDGamma;
Int_t aParGamma,aMedGamma,aMechGamma;
gamma->getParticle(aTrackGamma,aIDGamma);
gamma->getCreator(aParGamma,aMedGamma,aMechGamma);
if (aIDGamma==1 && aMechGamma==5 && aParGamma==aTrack)
{
HGeantKine *gamma1 = HRichUtilFunc::getSecondPionDecayGamma(gamma,(HLinearCategory*)fGeantKineCat);
if (gamma1)
{
Float_t mom1,mom2;
mom1 = gamma->getTotalMomentum();
mom2 = gamma1->getTotalMomentum();
Float_t opang = HRichUtilFunc::calcOpeningAngleKine(gamma,gamma1);
Float_t invmass = 2.*sin(opang/57.3/2.)*sqrt(mom1*mom2);
hpi0invmass->Fill(invmass);
}
HIterator* iter_ele = (HIterator*)(fGeantKineCat->MakeIterator("native"));
iter_ele->Reset();
HGeantKine *ele=0;
while((ele=(HGeantKine *)iter_ele->Next())!=0)
{
Int_t aTrackEle, aIDEle;
Int_t aParEle,aMedEle,aMechEle;
ele->getParticle(aTrackEle,aIDEle);
ele->getCreator(aParEle,aMedEle,aMechEle);
if ((aIDEle==2 || aIDEle==3) && aMechEle==6 && aParEle==aTrackGamma)
{
leps->Add(ele);
}
}
}
}
}
}
return leps;
}
void HGeantKineAna::findPionDalitzLeptons()
{
HGeantKine * kine =0;
iter_kine->Reset();
while((kine=(HGeantKine *)iter_kine->Next())!=0)
{
Int_t aTrack, aID;
Int_t aPar, aMed, aMech;
Float_t ptot;
kine->getParticle(aTrack,aID);
kine->getCreator(aPar,aMed,aMech);
ptot=kine->getTotalMomentum();
if ( aMech==5 && (aID == 2 || aID==3) && (aMed>=8 && aMed<=19))
{
HGeantKine *kine_parent1 = HRichUtilFunc::findParent(kine,(HLinearCategory*) getGeantKineCat());
if(kine_parent1){
Float_t theta1,phi1;
theta1=phi1=0.;
HRichUtilFunc::calcParticleAnglesKine(kine_parent1,theta1,phi1);
Int_t aTrackp1, aIDp1;
kine_parent1->getParticle(aTrackp1,aIDp1);
if(aIDp1==7)
{
HGeantKine *secondlepton =
HRichUtilFunc::getSecondPionDalitzLepton(kine,(HLinearCategory*) getGeantKineCat());
if (secondlepton)
{
Float_t deltaptot =
TMath::Abs(ptot-secondlepton->getTotalMomentum());
Float_t opangle =
HRichUtilFunc::calcOpeningAngleKine(kine,secondlepton);
deltaP_opangle->Fill(deltaptot,opangle);
}
med_dalitz->Fill(aMed);
mech_dalitz->Fill(aMech);
par_dalitz->Fill(aIDp1);
par_med_dalitz->Fill(aID,aMed);
par_mech_dalitz->Fill(aID,aMech);
mech_mom_dalitz->Fill(aMech,ptot);
}
}
}
}
}
void HGeantKineAna::findPionGammaConversionLeptons()
{
HGeantKine * kine =0;
iter_kine->Reset();
while((kine=(HGeantKine *)iter_kine->Next())!=0)
{
Int_t aTrack, aID;
Int_t aPar, aMed, aMech;
Float_t ptot;
kine->getParticle(aTrack,aID);
kine->getCreator(aPar,aMed,aMech);
ptot=kine->getTotalMomentum();
if ( aMech==6 && (aID == 2 || aID==3) && (aMed>=8 && aMed<=19))
{
HGeantKine *kine_parent1 = HRichUtilFunc::findParent(kine,(HLinearCategory*) getGeantKineCat());
if(kine_parent1){
Int_t aTrackp1, aIDp1;
Int_t aParp1,aMedp1,aMechp1;
kine_parent1->getParticle(aTrackp1,aIDp1);
kine_parent1->getCreator(aParp1,aMedp1,aMechp1);
if(aIDp1==1 && aMechp1==5)
{
HGeantKine *kine_parent2 = HRichUtilFunc::findParent(kine_parent1,(HLinearCategory*) getGeantKineCat());
if(kine_parent2){
Int_t aTrackp2, aIDp2;
kine_parent2->getParticle(aTrackp2,aIDp2);
Float_t theta2,phi2;
theta2=phi2=0.;
HRichUtilFunc::calcParticleAnglesKine(kine_parent2,theta2,phi2);
if(aIDp2==7 && (theta2>=10. && theta2<=90.))
{
HGeantKine *secondgamma = HRichUtilFunc::getSecondPionDecayGamma(kine_parent1,(HLinearCategory*) getGeantKineCat());
if (secondgamma) g_conv_opangle->Fill(HRichUtilFunc::calcOpeningAngleKine(kine_parent1,secondgamma));
med_conv->Fill(aMed);
mech_conv->Fill(aMech);
par_conv->Fill(aIDp2);
par_med_conv->Fill(aID,aMed);
par_mech_conv->Fill(aID,aMech);
mech_mom_conv->Fill(aMech,ptot);
}
}
}
}
}
}
}
Int_t HGeantKineAna::execute()
{
nEvtsProcessed++;
if ( nEvtsProcessed%5000==0)
{
cout<<nEvtsProcessed
<<" EVTS PROCESSED ***** saving histos"<<endl;
HRichUtilFunc::saveHistos(pFileOut,pHistArray);
}
TObjArray *leps = getPionGammaConversionLeptons();
Bool_t kWriteEvt = reconPionFromGammaConversionLeptons(leps);
delete leps;
if (kWriteEvt) return 1;
else return kSkipEvent;
}
HRichHitSim* HGeantKineAna::checkRings(HGeantKine* kine)
{
Int_t ret_val=0;
fRichIter->Reset();
HRichHitSim *r = 0;
Int_t aTrk, aID;
kine->getParticle(aTrk,aID);
Int_t richInd[20];
Int_t xdistArr[20];
Int_t ydistArr[20];
Float_t distArr[20];
for (Int_t i=0;i<20;i++) richInd[i]=xdistArr[i]=ydistArr[i]=-1;
for (Int_t j=0;j<20;j++) distArr[j]=-1.;
Int_t ringCnt=0;
while((r = (HRichHitSim *)fRichIter->Next()))
{
Int_t t1,t2,t3;
t1=t2=t3=-1;
t1=r->track1;t2=r->track2;t3=r->track3;
if ((t1==aTrk) || (t2==aTrk) || (t3==aTrk) )
{
HGeantRichMirror *mirr=0;
iter_mirror->Reset();
HRichGeometryPar* pGeo = (HRichGeometryPar*) pGeoPar;
Float_t fYShift = pGeo->getSectorShift();
fYShift = fYShift/TMath::Cos(20./57.3);
HRichPadTab* pPadsTab = ((HRichGeometryPar*)pGeo)->getPadsPar();
HRichPad *pPad = 0;
Int_t xRing=r->getRingCenterX();
Int_t yRing=r->getRingCenterY();
while((mirr=(HGeantRichMirror *)iter_mirror->Next())!=0)
{
Int_t mirrTrack,aID;
mirr->getTrack(mirrTrack,aID);
if (mirrTrack==aTrk)
{
ret_val=1;
Float_t x=mirr->getYRing()/10.;
Float_t y=mirr->getXRing()/10. + fYShift;
pPad=pPadsTab->getPad(x,
y );
if (!pPad) Error("checkRings","no pad found for coord");
Int_t xMirrPhotCM=pPad->getPadX();
Int_t yMirrPhotCM=pPad->getPadY();
Float_t distance = TMath::Sqrt(1.*(xMirrPhotCM-xRing)*(xMirrPhotCM-xRing)+
1.*(yMirrPhotCM-yRing)*(yMirrPhotCM-yRing));
Int_t richind = getRichHitCat()->getIndex(r);
richInd[ringCnt]=richind;
distArr[ringCnt]=distance;
xdistArr[ringCnt]=xMirrPhotCM-xRing;
ydistArr[ringCnt]=yMirrPhotCM-yRing;
ringCnt++;
Float_t padsum = r->weigTrack1+r->weigTrack2+r->weigTrack3;
Float_t weight =-1.;
if (aTrk==r->track1) weight = ((Float_t)r->weigTrack1)/padsum;
else if (aTrk==r->track2) weight = ((Float_t)r->weigTrack2)/padsum;
else if (aTrk==r->track3) weight = ((Float_t)r->weigTrack3)/padsum;
}
}
}
}
HRichHitSim *rs = 0;
Int_t sorted[20]; for (Int_t k=0;k<20;k++) sorted[k]=-1;
TMath::Sort(20, distArr, sorted,kFALSE);
Int_t nn=0;
while (nn<19&&distArr[sorted[nn]]==-1) nn++;
if (richInd[sorted[nn]]!=-1)
{
rs =(HRichHitSim*)getRichHitCat()
->getObject(richInd[sorted[nn]]);
Float_t padsum = rs->weigTrack1+rs->weigTrack2+rs->weigTrack3;
Float_t weight =-1.;
if (aTrk==rs->track1) weight = ((Float_t)rs->weigTrack1)/padsum;
else if (aTrk==rs->track2) weight = ((Float_t)rs->weigTrack2)/padsum;
else if (aTrk==rs->track3) weight = ((Float_t)rs->weigTrack3)/padsum;
hweight->Fill(weight);
hweightdist->Fill(weight,distArr[sorted[nn]]);
hcntdistx->Fill(xdistArr[sorted[nn]]);
hcntdisty->Fill(ydistArr[sorted[nn]]);
hcntdistxy->Fill(xdistArr[sorted[nn]],ydistArr[sorted[nn]]);
}
return rs;
}
void HGeantKineAna::showGammasFromPi0Decays()
{
HGeantKine * kine =0;
iter_kine->Reset();
Int_t size = 20;
Int_t *gammapairs = new Int_t[size];
for (Int_t k=0;k<size;k++) gammapairs[k]=-2;
while((kine=(HGeantKine *)iter_kine->Next())!=0)
{
Int_t i = getGeantKineCat()->getIndex(kine);
HGeantKine *secondgamma=0;
if(HRichUtilFunc::isGammaFromPi0(kine,
(HLinearCategory*)getGeantKineCat())
)
{
secondgamma = HRichUtilFunc::getSecondPionDecayGamma(kine,
(HLinearCategory*)getGeantKineCat());
Int_t j = getGeantKineCat()->getIndex(secondgamma);
if (HRichCut::isNew2Tuple(i,j,gammapairs,size) &&
secondgamma
) histoGammas(kine,secondgamma);
}
}
delete [] gammapairs;
}
void HGeantKineAna::histoGammas(HGeantKine* gamma1,HGeantKine* gamma2)
{
Float_t momgamma1 = gamma1->getTotalMomentum();
Float_t momgamma2 = gamma2->getTotalMomentum();
Float_t theta_gamma1,phi_gamma1;
Float_t theta_gamma2,phi_gamma2;
HRichUtilFunc::calcParticleAnglesKine(gamma1,theta_gamma1,phi_gamma1);
HRichUtilFunc::calcParticleAnglesKine(gamma2,theta_gamma2,phi_gamma2);
hgammathetatheta->Fill(theta_gamma1,theta_gamma2);
hgammamommom->Fill(momgamma1,momgamma2);
hgammamomtheta->Fill(momgamma1,theta_gamma1);
hgammamomtheta->Fill(momgamma2,theta_gamma2);
hgammamom1theta2->Fill(momgamma1,theta_gamma2);
}
void HGeantKineAna::showLeptonsFromPi0Decays(const Char_t *swt)
{
TObjArray leps(4);
HGeantKine * kine =0;
iter_kine->Reset();
while((kine=(HGeantKine *)iter_kine->Next())!=0)
{
TString decaymode(swt);
if (!decaymode.CompareTo("dalitz") &&
HRichUtilFunc::isPi0DalitzLep(kine,
(HLinearCategory*)getGeantKineCat(),pEvtGen.Data()) )
{
histoKine(kine);
leps.Add(kine);
}
if (!decaymode.CompareTo("conv") &&
HRichUtilFunc::isPi0ConvLep(kine,
(HLinearCategory*)getGeantKineCat()) )
{
histoKine(kine);
leps.Add(kine);
}
if (!decaymode.CompareTo("lepinMDC") &&
HRichUtilFunc::isPi0DalitzLep(kine,(HLinearCategory*)getGeantKineCat(),
pEvtGen.Data()) &&
HRichUtilFunc::isLepOnMDC(kine,(HMatrixCategory*)getGeantMDCCat()) )
{
histoKine(kine);
}
if (!decaymode.CompareTo("leponmirror") &&
HRichUtilFunc::isPi0DalitzLep(kine,(HLinearCategory*)getGeantKineCat(),
pEvtGen.Data()) &&
HRichUtilFunc::isLepOnMirror(kine,(HMatrixCategory*)getGeantMirrCat()) )
{
histoKine(kine);
}
if (!decaymode.CompareTo("dalitzlepinacc") &&
HRichUtilFunc::isPi0DalitzLep(kine,(HLinearCategory*)getGeantKineCat(),pEvtGen.Data()) &&
HRichUtilFunc::isLepOnMirror(kine,(HMatrixCategory*)getGeantMirrCat()) &&
HRichUtilFunc::isLepOnMDC(kine,(HMatrixCategory*)getGeantMDCCat()) )
{
histoKine(kine);
leps.Add(kine);
cout<<" **** lepton *************************************************"<<endl;
HRichUtilFunc::dumpKine(kine);
HRichHitSim* rs=0;
if ((rs=checkRings(kine)))
{
cout<<" **** corresponding min dist ring ****************************"<<endl;
TObjArray tracks(5);
Int_t nbTracks = checkRingCorrelation(rs,tracks);
if (nbTracks)
{
cout<<" ***** constructed tracks for this ring *********************"<<endl;
for (Int_t i=0;i<(tracks.GetLast()+1);i++)
{
((HHitMatchSim*)tracks[i])->dumpToStdoutSim();
}
}
TObjArray pairs(3);
if (nbTracks)
{
Int_t nbpairs =0;
nbpairs = checkTrackPairs(tracks,pairs);
}
cout<<" **** -------------------- ***************************************"<<endl;
}
else
{
}
}
}
checkForPair(leps,swt);
}
Int_t HGeantKineAna::findAcceptedDalitzLeptons(TObjArray& dalitzleps)
{
Int_t n=0;
HGeantKine * kine =0;
iter_kine->Reset();
while((kine=(HGeantKine *)iter_kine->Next())!=0)
{
if (HRichUtilFunc::isPi0DalitzLep(kine,(HLinearCategory*)getGeantKineCat(),pEvtGen.Data()) &&
HRichUtilFunc::isLepOnMirror(kine,(HMatrixCategory*)getGeantMirrCat()) &&
HRichUtilFunc::isLepOnMDC(kine,(HMatrixCategory*)getGeantMDCCat()) )
{
if (kine->getTotalMomentum()>=50.){
n++;
dalitzleps.Add(kine);
histoLepton(kine,hmomthetaallsingle);
}
}
}
nbLeptons+=n;
return n;
}
void HGeantKineAna::histoLepton(HGeantKine* lep,TH2D* h)
{
if (lep)
{
Float_t ptot=lep->getTotalMomentum();
Float_t theta,phi;
HRichUtilFunc::calcParticleAnglesKine(lep,theta,phi);
h->Fill(ptot,theta);
}
}
void HGeantKineAna::histoLeptonPair(TObjArray& p,TH2D* h)
{
histoLepton((HGeantKine*)p[0],h);
histoLepton((HGeantKine*)p[1],h);
}
void HGeantKineAna::checkAcceptedDalitzLeptons(TObjArray& dalitzleps)
{
Int_t nbfoundRings=0;
Int_t nbfoundGEANTDalitzPairs=0;
Int_t nbfoundDetTracks = 0;
Int_t nbfoundDetPairs = 0;
Int_t nbfoundGEANTSingleDalitzLeptons = 0;
Int_t nbMatchedPairs = 0;
Int_t nbMatchedTracks = 0;
Int_t nbMatchedGPairs = 0;
Int_t nbMatchedGTracks = 0;
TObjArray dalitzpairs(1);
if (dalitzleps.GetLast()==0)
{
nbfoundGEANTSingleDalitzLeptons++;
nbDalitzSingle++;
}
else
{
nbfoundGEANTDalitzPairs = fillDalitzPairs(dalitzleps,dalitzpairs);
nbDalitzPairs+=nbfoundGEANTDalitzPairs;
if (nbfoundGEANTDalitzPairs)
{
histoLeptonPair(dalitzpairs,hmomthetaallpair);
}
else {}
}
TObjArray mindistrings(1);
for (Int_t i=0;i<(dalitzleps.GetLast()+1);i++)
{
HRichHitSim *r=checkRings((HGeantKine*)dalitzleps[i]);
if (r)
{
nbfoundRings++;
mindistrings.Add(r);
}
}
nbRings+=nbfoundRings;
if (nbfoundRings)
{
TObjArray foundTracks(1);
nbfoundDetTracks = getTracksForRings(mindistrings,foundTracks);
nbTracks+=nbfoundDetTracks;
nbMatchedTracks = matchGEANTwithFoundTracks(dalitzleps,foundTracks);
nbgMatchedTracks+=nbMatchedTracks;
nbMatchedGTracks = matchFoundTrackswithGEANT(dalitzleps,foundTracks);
nbgMatchedGTracks+=nbMatchedGTracks;
if (nbfoundDetTracks)
{
TObjArray foundPairs(1);
nbfoundDetPairs = getPairsForTracks(foundTracks,foundPairs);
nbTrackPairs+=nbfoundDetPairs;
nbMatchedPairs = matchGEANTwithFoundPair(dalitzpairs,foundPairs);
nbgMatchedPairs+=nbMatchedPairs;
nbMatchedGPairs = matchFoundPairwithGEANT(dalitzpairs,foundPairs);
nbgMatchedGPairs+=nbMatchedGPairs;
}
}
}
Int_t HGeantKineAna::matchGEANTwithFoundTracks(TObjArray& Gl,TObjArray& Rt)
{
Int_t confirmedtracks = 0;
Int_t *trackinds=new Int_t[Rt.GetLast()+1];
for (Int_t kk=0;kk<(Rt.GetLast()+1);kk++) trackinds[kk]=-2;
if ((Gl.GetLast()+1)>=1)
{
for (Int_t i=0;i<(Gl.GetLast()+1);i++)
{
Int_t aTrack,aID;
((HGeantKine*)Gl[i])->getParticle(aTrack, aID);
if ((Rt.GetLast()+1)>=1)
{
for (Int_t j=0;j<(Rt.GetLast()+1);j++)
{
HTrackInfo *t = ((HHitMatchSim*)Rt[j])->getTrackInfoObj();
for (Int_t k=0;k<MAXPARTICLES;k++)
{
if (t->getTrkNb(k)==aTrack &&
HRichCut::isNewIndex(getHitMatchCat()->
getIndex((HHitMatchSim*)Rt[j]),
trackinds,Rt.GetLast()+1)
)
{
confirmedtracks++;
break;
}
}
}
}
}
}
delete [] trackinds;
return confirmedtracks;
}
Int_t HGeantKineAna::matchFoundTrackswithGEANT(TObjArray& Gl,TObjArray& Rt)
{
Int_t confirmedlepton = 0;
Int_t *trackinds=new Int_t[Rt.GetLast()+1];
for (Int_t kk=0;kk<(Rt.GetLast()+1);kk++) trackinds[kk]=-2;
if ((Gl.GetLast()+1)>=1)
{
for (Int_t i=0;i<(Gl.GetLast()+1);i++)
{
Int_t aTrack,aID;
((HGeantKine*)Gl[i])->getParticle(aTrack, aID);
if ((Rt.GetLast()+1)>=1)
{
Bool_t lepisSeen=kFALSE;
for (Int_t j=0;j<(Rt.GetLast()+1);j++)
{
HTrackInfo *t = ((HHitMatchSim*)Rt[j])->getTrackInfoObj();
for (Int_t k=0;k<MAXPARTICLES;k++)
{
if (!lepisSeen &&
t->getTrkNb(k)==aTrack &&
HRichCut::isNewIndex(getHitMatchCat()->
getIndex((HHitMatchSim*)Rt[j]),
trackinds,Rt.GetLast()+1)
)
{
lepisSeen=kTRUE;
confirmedlepton++;
histoLepton((HGeantKine*)Gl[i],hmomthetareconsingle);
break;
}
}
}
}
}
}
delete [] trackinds;
return confirmedlepton;
}
Int_t HGeantKineAna::matchGEANTwithFoundPair(TObjArray& Gp,TObjArray& Rp)
{
Int_t confirmedpair = 0;
if ((Gp.GetLast()+1)==2)
{
Int_t aTrack1, aTrack2;
Int_t aID1, aID2;
((HGeantKine*)Gp[0])->getParticle(aTrack1, aID1);
((HGeantKine*)Gp[1])->getParticle(aTrack2, aID2);
for (Int_t i=0;i<(Rp.GetLast()+1);i++)
{
Int_t ind1=((HDiHitMatch*)Rp[i])->getIndTrk1();
Int_t ind2=((HDiHitMatch*)Rp[i])->getIndTrk2();
HHitMatchSim *trk1 = (HHitMatchSim*)(getHitMatchCat()
->getObject(ind1));
HHitMatchSim *trk2 = (HHitMatchSim*)(getHitMatchCat()
->getObject(ind2));
HTrackInfo *t1 = trk1->getTrackInfoObj();
HTrackInfo *t2 = trk2->getTrackInfoObj();
Bool_t found11=kFALSE;
Bool_t found12=kFALSE;
Bool_t found21=kFALSE;
Bool_t found22=kFALSE;
for (Int_t k=0;k<MAXPARTICLES;k++)
{
if (t1->getTrkNb(k)==aTrack1) found11=kTRUE;
if (t1->getTrkNb(k)==aTrack2) found12=kTRUE;
if (t2->getTrkNb(k)==aTrack1) found21=kTRUE;
if (t2->getTrkNb(k)==aTrack2) found22=kTRUE;
}
if (
!( (found11&&found12&&!found21&&!found22) ||
(found21&&found22&&!found11&&!found12)
)
)
{
confirmedpair++;
}
else
{
trk1->dumpToStdoutSim();
trk2->dumpToStdoutSim();
}
}
}
else if((Gp.GetLast()+1)<2)
{
}
else if((Gp.GetLast()+1)>2)
{
}
return confirmedpair;
}
Int_t HGeantKineAna::matchFoundPairwithGEANT(TObjArray& Gp,TObjArray& Rp)
{
Int_t confirmedpair = 0;
if ((Gp.GetLast()+1)==2)
{
Int_t aTrack1, aTrack2;
Int_t aID1, aID2;
((HGeantKine*)Gp[0])->getParticle(aTrack1, aID1);
((HGeantKine*)Gp[1])->getParticle(aTrack2, aID2);
for (Int_t i=0;i<(Rp.GetLast()+1);i++)
{
Int_t ind1=((HDiHitMatch*)Rp[i])->getIndTrk1();
Int_t ind2=((HDiHitMatch*)Rp[i])->getIndTrk2();
HHitMatchSim *trk1 = (HHitMatchSim*)(getHitMatchCat()
->getObject(ind1));
HHitMatchSim *trk2 = (HHitMatchSim*)(getHitMatchCat()
->getObject(ind2));
HTrackInfo *t1 = trk1->getTrackInfoObj();
HTrackInfo *t2 = trk2->getTrackInfoObj();
Bool_t found11=kFALSE;
Bool_t found12=kFALSE;
Bool_t found21=kFALSE;
Bool_t found22=kFALSE;
for (Int_t k=0;k<MAXPARTICLES;k++)
{
if (t1->getTrkNb(k)==aTrack1) found11=kTRUE;
if (t1->getTrkNb(k)==aTrack2) found12=kTRUE;
if (t2->getTrkNb(k)==aTrack1) found21=kTRUE;
if (t2->getTrkNb(k)==aTrack2) found22=kTRUE;
}
if (
!( (found11&&found12&&!found21&&!found22) ||
(found21&&found22&&!found11&&!found12)
)
)
{
confirmedpair++;
histoLeptonPair(Gp,hmomthetareconpair);
break;
}
else
{
trk1->dumpToStdoutSim();
trk2->dumpToStdoutSim();
}
}
}
else if((Gp.GetLast()+1)<2)
{
}
else if((Gp.GetLast()+1)>2)
{
}
return confirmedpair;
}
Int_t HGeantKineAna::getPairsForTracks(TObjArray& tracks,TObjArray& pairs)
{
HDiHitMatch *h=0;
pIterDiHitMatch->Reset();
Int_t nbFoundPairs=0;
while(( h= (HDiHitMatch *)pIterDiHitMatch->Next()))
{
Int_t ind1=h->getIndTrk1();
Int_t ind2=h->getIndTrk2();
Int_t nbfoundtracksforpair=0;
Int_t *trkinds = new Int_t[tracks.GetLast()+1];
for (Int_t kk=0;kk<(tracks.GetLast()+1);kk++)trkinds[kk]=-2;
for (Int_t i=0;i<(tracks.GetLast()+1);i++)
{
Int_t trkind=getHitMatchCat()->getIndex((HHitMatchSim*)tracks[i]);
if(
(trkind==ind1 || trkind==ind2) &&
HRichCut::isNewIndex(trkind,trkinds,tracks.GetLast()+1)
)
{
nbfoundtracksforpair++;
if (nbfoundtracksforpair==2)
{
nbFoundPairs++;
pairs.Add(h);
break;
}
}
}
delete [] trkinds;
}
return nbFoundPairs;
}
Int_t HGeantKineAna::getTracksForRings(TObjArray& rings,TObjArray& tracks)
{
Int_t n=0;
for (Int_t i=0;i<(rings.GetLast()+1);i++)
{
HHitMatchSim *track =0;
pIterMatchHit->Reset();
Int_t richind = getRichHitCat()->getIndex((HRichHitSim*)rings[i]);
while((track=(HHitMatchSim *)pIterMatchHit->Next())!=0)
{
if (
HRichCut::isGoodRing((HRichHitSim*)rings[i]) &&
HRichCut::isGoodTrack(track) &&
track->getRichInd()==richind
)
{
n++;
tracks.Add(track);
}
}
}
return n;
}
Int_t HGeantKineAna::fillDalitzPairs(TObjArray& dalitzleps,TObjArray& dalitzpairs)
{
Int_t n=0;
for (Int_t i=0;i<(dalitzleps.GetLast()+1);i++)
{
for (Int_t j=i+1;j<(dalitzleps.GetLast()+1);j++)
{
Int_t aPar1, aMed1, aMech1;
Int_t aPar2, aMed2, aMech2;
Int_t aTrack1, aTrack2;
Int_t aID1, aID2;
((HGeantKine*)dalitzleps[i])->getParticle(aTrack1, aID1);
((HGeantKine*)dalitzleps[j])->getParticle(aTrack2, aID2);
((HGeantKine*)dalitzleps[i])->getCreator(aPar1, aMed1, aMech1);
((HGeantKine*)dalitzleps[j])->getCreator(aPar2, aMed2, aMech2);
if (aPar1==aPar2 && aMed1==aMed2 && aMech1==aMech2)
{
dalitzpairs.Add((HGeantKine*)dalitzleps[i]);
dalitzpairs.Add((HGeantKine*)dalitzleps[j]);
n++;
}
}
}
return n;
}
Int_t HGeantKineAna::checkTrackPairs(TObjArray &t, TObjArray &p)
{
HDiHitMatch *h=0;
pIterDiHitMatch->Reset();
Int_t nbFoundPairs=0;
while(( h= (HDiHitMatch *)pIterDiHitMatch->Next()))
{
Int_t ind1=h->getIndTrk1();
Int_t ind2=h->getIndTrk2();
Int_t foundtracks=0;
Int_t *trkinds = new Int_t[t.GetLast()+1];
for (Int_t j=0;j<(t.GetLast()+1);j++) trkinds[j]=-2;
for (Int_t i=0;i<(t.GetLast()+1);i++)
{
Int_t trkind=getHitMatchCat()->getIndex(t[i]);
if ((trkind==ind1 || trkind==ind2)&&
HRichCut::isNewIndex(trkind,trkinds,t.GetLast()+1)) foundtracks++;
}
delete [] trkinds;
if (foundtracks>=2) {nbFoundPairs++;p.Add(h);}
}
return nbFoundPairs;
}
Int_t HGeantKineAna::checkRingCorrelation(HRichHitSim* r,TObjArray& tracks)
{
HHitMatchSim *track =0;
pIterMatchHit->Reset();
Int_t richind = getRichHitCat()->getIndex(r);
Int_t n=0;
while((track=(HHitMatchSim *)pIterMatchHit->Next())!=0)
{
if (
HRichUtilFunc::isGoodRing(r) &&
HRichUtilFunc::isGoodTrack(track) &&
track->getRichInd()==richind
)
{
n++;
tracks.Add(track);
}
}
return n;
}
Int_t HGeantKineAna::checkForPair(TObjArray& l,const Char_t *swt)
{
if (l.GetLast()==0)
{
cout<<" **** pi0-Dalitz single lepton **** "<<endl;
HRichUtilFunc::dumpKine((HGeantKine*)l[0]);
}
for (Int_t i=0;i<(l.GetLast()+1);i++)
{
for (Int_t j=i+1;j<(l.GetLast()+1);j++)
{
Int_t aPar1, aMed1, aMech1;
Int_t aPar2, aMed2, aMech2;
Int_t aTrack1, aTrack2;
Int_t aID1, aID2;
((HGeantKine*)l[i])->getParticle(aTrack1, aID1);
((HGeantKine*)l[j])->getParticle(aTrack2, aID2);
((HGeantKine*)l[i])->getCreator(aPar1, aMed1, aMech1);
((HGeantKine*)l[j])->getCreator(aPar2, aMed2, aMech2);
if (aPar1==aPar2 && aMed1==aMed2 && aMech1==aMech2)
{
Float_t opang = HRichUtilFunc::calcOpeningAngleKine((HGeantKine*)l[i],(HGeantKine*)l[j]);
Float_t invMass=HRichUtilFunc::calcInvMassKine((HGeantKine*)l[i],(HGeantKine*)l[j]);
HGeantKine *gamma = 0;
HGeantKine *pi0 = 0;
HGeantKine *gamma1 =0;
TString mode(swt);
if (!mode.CompareTo("dalitz"))
{
gamma = HRichUtilFunc::
getPionDalitzGamma((HGeantKine*)l[i],
(HLinearCategory*)getGeantKineCat());
if (gamma) pi0 = HRichUtilFunc::
findParent(gamma,(HLinearCategory*)getGeantKineCat());
}
else if (!mode.CompareTo("conv"))
{
gamma1 = HRichUtilFunc::
findParent((HGeantKine*)l[i],
(HLinearCategory*)getGeantKineCat());
if (gamma1) gamma = HRichUtilFunc::
getSecondPionDecayGamma(gamma1,
(HLinearCategory*)getGeantKineCat());
if (gamma1) pi0 = HRichUtilFunc::
findParent(gamma1,(HLinearCategory*)getGeantKineCat());
}
Bool_t validDecay = kFALSE;
if (!mode.CompareTo("conv") && gamma1) validDecay=kTRUE;
else if (!mode.CompareTo("dalitz")) validDecay = kTRUE;
if (gamma&&pi0&&validDecay){
Float_t ppi0X,ppi0Y,ppi0Z;
pi0->getMomentum(ppi0X,ppi0Y,ppi0Z);
Float_t plep1X,plep1Y,plep1Z;
Float_t plep2X,plep2Y,plep2Z;
((HGeantKine*)l[i])->getMomentum(plep1X,plep1Y,plep1Z);
((HGeantKine*)l[j])->getMomentum(plep2X,plep2Y,plep2Z);
Float_t plepX = plep1X+plep2X;
Float_t plepY = plep1Y+plep2Y;
Float_t plepZ = plep1Z+plep2Z;
Float_t pleptotal = TMath::Sqrt( plepX*plepX+
plepY*plepY+
plepZ*plepZ );
HGeomVector psumleptons;
psumleptons.setX(plepX);
psumleptons.setY(plepY);
psumleptons.setZ(plepZ);
Float_t totMom1 = ((HGeantKine*)l[i])->getTotalMomentum();
Float_t totMom2 = ((HGeantKine*)l[j])->getTotalMomentum();
hmompairkine->Fill(totMom1,totMom2);
Float_t theta1,phi1;
Float_t theta2,phi2;
HRichUtilFunc::calcParticleAnglesKine((HGeantKine*)l[i],theta1,phi1);
HRichUtilFunc::calcParticleAnglesKine((HGeantKine*)l[j],theta2,phi2);
hthetapairkine->Fill(theta1,theta2);
Float_t momgamma = gamma->getTotalMomentum();
HGeomVector pgamma;
Float_t pgammaX,pgammaY,pgammaZ;
gamma->getMomentum(pgammaX,pgammaY,pgammaZ);
pgamma.setX(pgammaX);
pgamma.setY(pgammaY);
pgamma.setZ(pgammaZ);
Float_t psumX,psumY,psumZ;
psumX = plep1X+plep2X+pgammaX-ppi0X;
psumY = plep1Y+plep2Y+pgammaY-ppi0Y;
psumZ = plep1Z+plep2Z+pgammaZ-ppi0Z;
Float_t opanglepsgamma = HRichUtilFunc::calcOpeningAngleVectors(pgamma,psumleptons);
Float_t invMassPion =
2.*
sin( (1./HConstant::rad2deg()) *opanglepsgamma/2. )*
sqrt(momgamma*pleptotal);
hpi0invmass->Fill(invMassPion);
hdalitzopang->Fill(opang);
hdalitzinvmass->Fill(invMass);
}
}
}
}
return 1;
}
void HGeantKineAna::calcParticleAnglesV(HGeantKine *kine,Float_t &theta, Float_t &phi)
{
Float_t xMom,yMom,zMom;
kine->getMomentum(xMom,yMom,zMom);
HGeomVector2 vec;
vec.setX(xMom);
vec.setY(yMom);
vec.setZ(zMom);
vec/=vec.length();
Float_t rad;
vec.sphereCoord(rad,theta,phi);
}
Float_t HGeantKineAna::calcOpeningAngleV(HGeantKine *kine1,HGeantKine *kine2)
{
Float_t rad2deg = 180./TMath::Pi();
HGeomVector vec1;
if (kine1){
Float_t xMom1,yMom1,zMom1;
kine1->getMomentum(xMom1,yMom1,zMom1);
vec1.setX(xMom1);
vec1.setY(yMom1);
vec1.setZ(zMom1);
vec1/=vec1.length();
}
HGeomVector vec2;
if (kine2){
Float_t xMom2,yMom2,zMom2;
kine2->getMomentum(xMom2,yMom2,zMom2);
vec2.setX(xMom2);
vec2.setY(yMom2);
vec2.setZ(zMom2);
vec2/=vec2.length();
}
Float_t cosfOpeningAngle = vec1.scalarProduct(vec2);
Float_t fOpeningAngle=0.;
if (TMath::Abs(cosfOpeningAngle) <= 1)
fOpeningAngle=TMath::ACos(cosfOpeningAngle) * rad2deg;
return fOpeningAngle;
}
void HGeantKineAna::calcParticleAnglesT(HGeantKine *kine,Float_t &fpt, Float_t &fpp)
{
Float_t rad2deg = 180./TMath::Pi();
Float_t pX,pY,pZ;
pX=pY=pZ=0;
kine->getMomentum(pX,pY,pZ);
Float_t pT = TMath::Sqrt(pX*pX+pY*pY);
Float_t pTot = kine->getTotalMomentum();
fpt = TMath::ASin(pT/pTot) * rad2deg;
fpp = TMath::ASin(pY/pT) *rad2deg;
if (pX<0.) fpp = 180.-fpp;
else if (pY<0.) fpp+=360.;
}
Float_t HGeantKineAna::calcOpeningAngleT(Float_t t1,Float_t p1,
Float_t t2,Float_t p2)
{
Float_t rad2deg = 180./TMath::Pi();
HGeomVector vec1,vec2;
vec1.setX(TMath::Sin(t1/rad2deg) * TMath::Cos(p1/rad2deg));
vec1.setY(TMath::Sin(t1/rad2deg) * TMath::Sin(p1/rad2deg));
vec1.setZ(TMath::Cos(t1/rad2deg));
vec2.setX(TMath::Sin(t2/rad2deg) * TMath::Cos(p2/rad2deg));
vec2.setY(TMath::Sin(t2/rad2deg) * TMath::Sin(p2/rad2deg));
vec2.setZ(TMath::Cos(t2/rad2deg));
Float_t cosfOpeningAngle = vec1.scalarProduct(vec2);
cout<<cosfOpeningAngle<<endl;
Float_t fOpeningAngle=0.;
if (TMath::Abs(cosfOpeningAngle) <= 1)
fOpeningAngle=TMath::ACos(cosfOpeningAngle) * rad2deg;
return fOpeningAngle;
}
void HGeantKineAna::dumpKine(HGeantKine *kine)
{
if (kine)
{
Int_t aTrack, aID;
Int_t aPar, aMed, aMech;
Float_t ax, ay, az;
Float_t apx, apy, apz;
Float_t aInfo, aWeight;
Float_t ptot;
kine->getParticle(aTrack,aID);
kine->getCreator(aPar,aMed,aMech);
kine->getVertex(ax,ay,az);
kine->getMomentum(apx,apy,apz);
kine->getGenerator(aInfo,aWeight);
ptot=kine->getTotalMomentum();
cout<<"-----------------------------------------------------------"<<endl;
cout<<"--- GEANT track number: "<<aTrack<<endl;
cout<<"--- track number of parent particle: "<<aPar<<endl;
cout<<"--- GEANT particle ID: "<<aID<<endl;
cout<<"--- GEANT medium of creation: "<<aMed<<endl;
cout<<"--- GEANT creation mechanism: "<<aMech<<endl;
cout<<"--- x of track vertex (in mm): "<<ax<<endl;
cout<<"--- y : "<<ay<<endl;
cout<<"--- z : "<<az<<endl;
cout<<"--- x component of particle momentum (in MeV/c): "<<apx<<endl;
cout<<"--- y : "<<apy<<endl;
cout<<"--- z : "<<apz<<endl;
cout<<"--- total momentum : "<<ptot<<endl;
cout<<"--- event generator info: "<<aInfo<<endl;
cout<<"--- associated weight: "<<aWeight<<endl;
cout<<"--- "<<endl;
cout<<"--- "<<endl;
cout<<"--- "<<endl;
cout<<"--- "<<endl;
cout<<"-----------------------------------------------------------"<<endl;
}
}
void HGeantKineAna::histoKine(HGeantKine *kine)
{
if (kine)
{
Int_t aTrack, aID;
Int_t aPar, aMed, aMech;
Float_t ax, ay, az;
Float_t apx, apy, apz;
Float_t aInfo, aWeight;
Float_t ptot;
kine->getParticle(aTrack,aID);
kine->getCreator(aPar,aMed,aMech);
kine->getVertex(ax,ay,az);
kine->getMomentum(apx,apy,apz);
kine->getGenerator(aInfo,aWeight);
ptot=kine->getTotalMomentum();
Float_t theta,phi;
HRichUtilFunc::calcParticleAnglesKine(kine,theta,phi);
hidkine->Fill(aID);
hmedkine->Fill(aMed);
hmechkine->Fill(aMech);
hmomkine->Fill(ptot);
hmomthetakine->Fill(theta,ptot);
hparentkine->Fill(aPar);
hvertexkine->Fill(ax,ay,az);
}
}
HGeantKine* HGeantKineAna::findParent(HGeantKine *kine)
{
Int_t aPar, aMed, aMech;
kine->getCreator(aPar,aMed,aMech);
if (aPar){
HIterator* iter_kine2 = (HIterator*)(((HLinearCategory*)
getGeantKineCat())
->MakeIterator("native"));
iter_kine2->Reset();
HGeantKine *kine2=0;
Int_t aTrackParent,aIDParent;
while((kine2=(HGeantKine *)iter_kine2->Next())!=0)
{
kine2->getParticle(aTrackParent,aIDParent);;
if (aPar == aTrackParent)
{
return kine2;
}
}
}
return 0;
}
Bool_t HGeantKineAna::finalize() {
HRichUtilFunc::saveHistos(pFileOut,pHistArray);
pFileOut->Close();
cout<<"Sum rings:"<<nbRings<<" leptons:"<<nbLeptons<<" dal pairs:"<<nbDalitzPairs
<<" tracks:"<<nbTracks<<" pairs:"<<nbTrackPairs
<<" singles:"<<nbDalitzSingle<<endl;
cout<<"Nb GEANT confirmed reconstructed pairs -- Sum:"<<nbgMatchedPairs<<endl;
cout<<"Nb of reconstructed GEANT pairs -- Sum:"<<nbgMatchedGPairs<<endl;
cout<<"Nb GEANT confirmed reconstructed tracks -- Sum:"<<nbgMatchedTracks<<endl;
cout<<"Nb of reconstructed GEANT leptons -- Sum:"<<nbgMatchedGTracks<<endl;
return kTRUE;
}
void HGeantKineAna::saveHistos()
{
pFileOut->cd();
for (Int_t i=0;i<(pHistArray->GetLast()+1);i++)
{
( (TH1*)(*pHistArray)[i] )->Write();
}
}
Last change: Sat May 22 12:55:54 2010
Last generated: 2010-05-22 12:55
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.