#include <iostream>
#include "hades.h"
#include "hmetamatch.h"
#include "hcategory.h"
#include "hdetector.h"
#include "hevent.h"
#include "htofhitsim.h"
#include "hsplinetrackF.h"
#include "hkicktrack123B.h"
#include "hiterator.h"
#include "hgeomvolume.h"
#include "hgeomcompositevolume.h"
#include "hspectrometer.h"
#include "hruntimedb.h"
#include "hmdcgeompar.h"
#include "htofinogeompar.h"
#include "htofgeompar.h"
#include "hspecgeompar.h"
#include "tofdef.h"
#include "hmdcseg.h"
#include "showerdef.h"
#include "hmdctrackgcorrpar.h"
#include "hmdctrackgfieldpar.h"
#include "hmatrixcategory.h"
#include "hbasetrack.h"
#include "showertofinodef.h"
#include "hgeantmdc.h"
#include "hkickplane2.h"
#include "hgeantkine.h"
#include "hgeomtransform.h"
#include "hgeomvolume.h"
#include "hmdctrackddef.h"
#include "hmdctrackgdef.h"
#include "hruntimedb.h"
#include "hevent.h"
#include "hmdctrkcand.h"
#include "hmdctrackgspline.h"
#include "hmdctrackgcorrpar.h"
#include "hgeomvector.h"
#include "TNtuple.h"
#include "hlocation.h"
#include "hmdctrackgsplinecorr.h"
#include "hsplinetrack.h"
#include "hshowerhittoftrack.h"
#include "TFile.h"
#include "hkicktrackbaseF.h"
using namespace std;
#include <iostream>
ClassImp(HKickTrackBaseF)
HKickTrackBaseF::HKickTrackBaseF()
{
C=299792458;
pi=acos(-1.);
fCatKickTrack123B=0;
fCatMdcSegSim=0;
fMdcGeometry=0;
fSpecGeomPar=0;
fMetaMatchIter=0;
field=0;
corr=0;
}
HKickTrackBaseF::HKickTrackBaseF(const Text_t *name,const Text_t *title) : HReconstructor(name,title)
{
C=299792458;
pi=acos(-1.);
fCatKickTrack123B=0;
fCatMdcSegSim=0;
fMdcGeometry=0;
fSpecGeomPar=0;
fMetaMatchIter=0;
field=0;
corr=0;
}
HKickTrackBaseF::~HKickTrackBaseF()
{
;
}
Bool_t HKickTrackBaseF::init()
{
cout << "Initialisation of HKickTrackBaseF" << endl;
if(gHades)
{
for(Int_t i=0; i<6;i++) tRans[i]=0;
HRuntimeDb *rtdb=gHades->getRuntimeDb();
HSpectrometer *spec=gHades->getSetup();
HEvent *event=gHades->getCurrentEvent();
if(rtdb && spec && event)
{
field =(HMdcTrackGFieldPar*)(rtdb->getContainer("MdcTrackGFieldPar"));
corr =(HMdcTrackGCorrPar* )(rtdb->getContainer("MdcTrackGCorrPar") );
fSpecGeomPar=(HSpecGeomPar*)(rtdb->getContainer("SpecGeomPar") );
fGetCont=HMdcGetContainers::getObject();
fGetCont->getMdcGeomPar();
fGetCont->getSpecGeomPar();
kickplane=(HKickPlane2*)rtdb->getContainer("KickPlane2MDC3");
HDetector *pDtof=spec->getDetector("Tof");
if (pDtof) {
fTofGeometry = (HTofGeomPar *)rtdb->getContainer("TofGeomPar");
}else{
fTofGeometry=0;
}
HDetector *pDshower = spec->getDetector("Shower");
HDetector *pDtofino = spec->getDetector("Tofino");
if(pDshower && pDtofino){
fTofinoGeometry = (HTofinoGeomPar *)rtdb->getContainer("TofinoGeomPar");
}
}
fCatMdcTrkCand=event->getCategory(catMdcTrkCand);
if(!fCatMdcTrkCand) return kFALSE;
fCatMetaMatch=event->getCategory(catMetaMatch);
if (!fCatMetaMatch) return kFALSE;
fMetaMatchIter=(HIterator*)fCatMetaMatch->MakeIterator();
if(!fMetaMatchIter) return kFALSE;
fCatMdcSegSim=event->getCategory(catMdcSeg);
fCatTof=event->getCategory(catTofHit);
if(!fCatTof) return kFALSE;
fCatKine=event->getCategory(catGeantKine);
if(!fCatKine)
{
fCatShower=event->getCategory(catShowerHitTof);
if(!fCatShower) return kFALSE;
}
else
{
fCatShower=event->getCategory(catShowerHitTofTrack);
if(!fCatShower) return kFALSE;
}
fCatKickTrack123B=event->getCategory(catKickTrack123B);
if(!fCatKickTrack123B)
{
Int_t size[2]={6,600};
fCatKickTrack123B=new HMatrixCategory("HKickTrack123B",2,size,0.5);
if(fCatKickTrack123B) event->addCategory(catKickTrack123B,fCatKickTrack123B,"KickTrack123B");
}
}
return kTRUE;
}
Bool_t HKickTrackBaseF::reinit()
{
for(Int_t i=0; i<6; i++) tRans[i]=0;
return kTRUE;
}
Bool_t HKickTrackBaseF::finalize()
{
return kTRUE;
}
Int_t HKickTrackBaseF::execute()
{
return kicktrackMDC123();
}
Int_t HKickTrackBaseF::kicktrackMDC123()
{
HGeomVector fMetaNormVec;
fMetaMatchIter->Reset();
while((pMetaMatch=(HMetaMatch*)(fMetaMatchIter->Next()))!=0)
{
sector = pMetaMatch->getSector();
indTrkCand = pMetaMatch->getTrkCandInd();
metaInd = pMetaMatch->getMetaHitInd();
pMdcTrkCand=(HMdcTrkCand*)fCatMdcTrkCand->getObject(indTrkCand);
if(!pMdcTrkCand) continue;
index1=pMdcTrkCand->getSeg1Ind();
index2=pMdcTrkCand->getSeg2Ind();
metaInd=pMetaMatch->getMetaHitInd();
sectorloc.set(1,(Int_t)sector);
segments[0]=(HMdcSeg*)fCatMdcSegSim->getObject(index1);
segments[1]=(HMdcSeg*)fCatMdcSegSim->getObject(index2);
system=pMetaMatch->getSystem();
if(!segments[0] || !segments[1]) continue;
if(metaInd>=0){
if(system==0){
pShowerHitTofTrack=(HShowerHitTofTrack*)fCatShower->getObject(metaInd);
tof=pShowerHitTofTrack->getTof();
pShowerHitTofTrack->getLabXYZ(&xTof,&yTof,&zTof);
if(fTofinoGeometry){
HModGeomPar *module = fTofinoGeometry->getModule(sector, pShowerHitTofTrack->getModule());
HGeomTransform &transMod = module->getLabTransform();
HGeomTransform &transSec = fSpecGeomPar->getSector(sector)->getTransform();
HGeomTransform modTrans(transMod);
modTrans.transTo(transSec);
HGeomVector r0_mod, rz_mod, r0_lab, rz_lab;
r0_mod.setXYZ(0.0, 0.0, 0.0);
rz_mod.setXYZ(0.0, 0.0, 1.0);
r0_lab=modTrans.transFrom(r0_mod);
rz_lab=modTrans.transFrom(rz_mod);
fMetaNormVec = rz_lab - r0_lab;
}else{
cout << "No Shower/Tofino geometry specified" << endl;
}
}
if(system==1){
pTofHit=(HTofHitSim*)fCatTof->getObject(metaInd);
tof=pTofHit->getTof();
pTofHit->getXYZLab(xTof,yTof,zTof);
tofSystem = pTofHit->getSector()*1000 + pTofHit->getModule()*100 + pTofHit->getCell();
if(fTofGeometry){
HModGeomPar *module = fTofGeometry->getModule(sector, pTofHit->getModule());
HGeomTransform &transMod = module->getLabTransform();
HGeomTransform &transSec = fSpecGeomPar->getSector(sector)->getTransform();
HGeomTransform modTrans(transMod);
modTrans.transTo(transSec);
HGeomVector r0_mod, rz_mod, r0_lab, rz_lab;
r0_mod.setXYZ(0.0, 0.0, 0.0);
rz_mod.setXYZ(0.0, 0.0, 1.0);
r0_lab=modTrans.transFrom(r0_mod);
rz_lab=modTrans.transFrom(rz_mod);
fMetaNormVec = rz_lab - r0_lab;
}else{
cout << "No Tof geometry specified" << endl;
}
}
pointMeta.setXYZ(xTof,yTof,zTof);
if(tRans[(Int_t)sector]==0){
tRans[(Int_t)sector]=new HGeomTransform();
if(!fGetCont->getLabTransSec(*(tRans[(Int_t)sector]),sector)) continue;
}
pointMeta=tRans[(Int_t)sector]->transTo(pointMeta);
xTof=pointMeta.getX();
yTof=pointMeta.getY();
zTof=pointMeta.getZ();
}
HGeomVector interkickpoint;
HGeomVector dir1, dir2;
HGeomVector point[4];
if((segments[1]->getHitInd(1)==-1&&segments[1]->getHitInd(0)!=-1)||
(segments[1]->getHitInd(1)!=-1&&segments[1]->getHitInd(0)==-1) )
{
Float_t tetaseg[2],phiseg[2],zseg[2],roseg[2];
tetaseg[0]=segments[0]->getTheta();
phiseg[ 0]=segments[0]->getPhi();
zseg[ 0]=segments[0]->getZ();
roseg[ 0]=segments[0]->getR();
tetaseg[1]=segments[1]->getTheta();
phiseg[ 1]=segments[1]->getPhi();
zseg[ 1]=segments[1]->getZ();
roseg[ 1]=segments[1]->getR();
Double_t Xseg[4],Yseg[4],Zseg[4];
Xseg[0]=roseg[0]*cos(phiseg[0]+pi/2);
Yseg[0]=roseg[0]*sin(phiseg[0]+pi/2);
Zseg[0]=zseg[0];
Xseg[1]=Xseg[0]+cos(phiseg[0])*sin(tetaseg[0]);
Yseg[1]=Yseg[0]+sin(phiseg[0])*sin(tetaseg[0]);
Zseg[1]=Zseg[0]+cos(tetaseg[0]);
Double_t dirX=Xseg[1]-Xseg[0];
Double_t dirY=Yseg[1]-Yseg[0];
Double_t dirZ=Zseg[1]-Zseg[0];
HGeomVector pointSeg1;
pointSeg1.setXYZ(Xseg[0],Yseg[0],Zseg[0]);
dir1.setXYZ(dirX,dirY,dirZ);
kickplane->calcIntersection(pointSeg1,dir1,interkickpoint);
Xseg[2]=roseg[1]*cos(phiseg[1]+pi/2);
Yseg[2]=roseg[1]*sin(phiseg[1]+pi/2);
Zseg[2]=zseg[1];
Xseg[3]=Xseg[2]+cos(phiseg[1])*sin(tetaseg[1]);
Yseg[3]=Yseg[2]+sin(phiseg[1])*sin(tetaseg[1]);
Zseg[3]=Zseg[2]+cos(tetaseg[1]);
point[0].setXYZ(0.1*Xseg[0], 0.1*Yseg[0], 0.1*Zseg[0]);
point[1].setXYZ(0.1*Xseg[1], 0.1*Yseg[1], 0.1*Zseg[1]);
point[2].setXYZ(0.1*Xseg[2], 0.1*Yseg[2], 0.1*Zseg[2]);
point[3].setXYZ(0.1*Xseg[3], 0.1*Yseg[3], 0.1*Zseg[3]);
dir2 = point[3] - point[2];
Float_t dir2length = dir2.length();
dir2 /= dir2length;
Double_t fAngle = TMath::ACos(dir1.scalarProduct(dir2));
Double_t beta1, beta2, deltaBeta;
beta1 = TMath::ATan2( dir1.getZ(), dir1.getY() );
beta2 = TMath::ATan2( dir2.getZ(), dir2.getY() );
deltaBeta = beta2 - beta1;
if(deltaBeta>=0){polarity=1;}else{polarity=-1;}
Momentum = kickplane->getP(interkickpoint, 2.*sin(fAngle/2.), polarity);
}else{
Float_t tetaseg[2],phiseg[2],zseg[2],roseg[2];
tetaseg[0]=segments[0]->getTheta();
phiseg[ 0]=segments[0]->getPhi();
zseg[ 0]=segments[0]->getZ();
roseg[ 0]=segments[0]->getR();
tetaseg[1]=segments[1]->getTheta();
phiseg[ 1]=segments[1]->getPhi();
zseg[ 1]=segments[1]->getZ();
roseg[ 1]=segments[1]->getR();
Double_t Xseg[4],Yseg[4],Zseg[4];
Xseg[0]=roseg[0]*cos(phiseg[0]+pi/2);
Yseg[0]=roseg[0]*sin(phiseg[0]+pi/2);
Zseg[0]=zseg[0];
Xseg[1]=Xseg[0]+cos(phiseg[0])*sin(tetaseg[0]);
Yseg[1]=Yseg[0]+sin(phiseg[0])*sin(tetaseg[0]);
Zseg[1]=Zseg[0]+cos(tetaseg[0]);
Double_t dirX=Xseg[1]-Xseg[0];
Double_t dirY=Yseg[1]-Yseg[0];
Double_t dirZ=Zseg[1]-Zseg[0];
HGeomVector pointSeg1;
pointSeg1.setXYZ(Xseg[0],Yseg[0],Zseg[0]);
dir1.setXYZ(dirX,dirY,dirZ);
kickplane->calcIntersection(pointSeg1,dir1,interkickpoint);
Xseg[2]=roseg[1]*cos(phiseg[1]+pi/2);
Yseg[2]=roseg[1]*sin(phiseg[1]+pi/2);
Zseg[2]=zseg[1];
Xseg[3]=Xseg[2]+cos(phiseg[1])*sin(tetaseg[1]);
Yseg[3]=Yseg[2]+sin(phiseg[1])*sin(tetaseg[1]);
Zseg[3]=Zseg[2]+cos(tetaseg[1]);
point[0].setXYZ(0.1*Xseg[0], 0.1*Yseg[0], 0.1*Zseg[0]);
point[1].setXYZ(0.1*Xseg[1], 0.1*Yseg[1], 0.1*Zseg[1]);
point[2].setXYZ(0.1*Xseg[2], 0.1*Yseg[2], 0.1*Zseg[2]);
point[3].setXYZ(0.1*Xseg[3], 0.1*Yseg[3], 0.1*Zseg[3]);
dir2 = point[3] - point[2];
Float_t dir2length = dir2.length();
dir2 /= dir2length;
Double_t fAngle = TMath::ACos(dir1.scalarProduct(dir2));
Double_t beta1, beta2, deltaBeta;
beta1 = TMath::ATan2( dir1.getZ(), dir1.getY() );
beta2 = TMath::ATan2( dir2.getZ(), dir2.getY() );
deltaBeta = beta2 - beta1;
if(deltaBeta>=0){polarity=1;}else{polarity=-1;}
Momentum = kickplane->getP(interkickpoint, 2.*sin(fAngle/2.), polarity);
}
if(metaInd<0){
if(Momentum<3000){
fillData(segments[0],kFALSE);
}
continue;
}
const HGeomVector &targetPos = fSpecGeomPar->getTarget(0)->getTransform().getTransVector();
Float_t distanceTarget2kickPlane = (interkickpoint - targetPos).length();
Float_t distanceKickPlane2META = (interkickpoint - pointMeta).length();
TOFdistance = distanceTarget2kickPlane + distanceKickPlane2META;
beta = 1.0e6*TOFdistance/tof/C;
mass2 = Momentum*Momentum*(1-beta*beta)/beta/beta;
HGeomVector dir2M = pointMeta - point[2];
Float_t dir2Mlength = dir2M.length();
dir2M /= dir2Mlength;
Double_t fAngleM = TMath::ACos(dir1.scalarProduct(dir2M));
MomentumMETA = kickplane->getP(interkickpoint, 2.*sin(fAngleM/2.), polarity);
HGeomVector metanorm = fMetaNormVec;
Float_t zprojvec_lab = dir2.scalarProduct(metanorm);
metanorm *= zprojvec_lab;
Float_t path, edep;
if(system==0){
path = ( metanorm.length() * dir2.length() )/dir2.scalarProduct(metanorm);
edep = ( (HShowerHitTof *) pShowerHitTofTrack)->getADC();
if(path >= 1.0){
eloss = edep/path;
}else{
Warning("evaluateMDC123(4)","particle crossed TOFINO with path < 1.\n");
eloss = -1.0;
}
}
if(system==1){
path = (metanorm.length()/dir2.length()) / dir2.scalarProduct(metanorm);
if(pTofHit->getAdcFlag() !=0 ){
edep = pTofHit->getEdep();
if(path >= 1.0){
eloss = edep/path;
}else{
Warning("evaluateMDC123(4)","particle crossed TOF wall with path < 1.\n");
eloss = -1.0;
}
}else{
eloss = -1.0;
}
}
if(Momentum<3000) fillData(segments[0],kTRUE);
}
return 0;
}
HKickTrack123B * HKickTrackBaseF::fillData(HMdcSeg *segment, Bool_t condition){
Int_t indexkicktrack123b;
HKickTrack123B *kt123b = (HKickTrack123B*)fCatKickTrack123B->getNewSlot(sectorloc,&indexkicktrack123b);
if(!kt123b){
Error("fillData","No slot available");
return 0;
}
kt123b = (HKickTrack123B*)(new(kt123b)HKickTrack123B);
if(kt123b){
kt123b->setP(Momentum,0);
kt123b->setZ(segment->getZ(),segment->getErrZ());
kt123b->setR(segment->getR(),segment->getErrR());
kt123b->setTheta(segment->getTheta(),segment->getErrTheta());
kt123b->setPhi(segment->getPhi(),segment->getErrPhi());
kt123b->setPolarity(polarity);
kt123b->setSector(sector);
pMetaMatch->setKick123Ind(indexkicktrack123b);
if(condition){
kt123b->setTofDist(TOFdistance);
kt123b->setBeta(beta);
kt123b->setMass2(mass2,0);
kt123b->setTof(tof);
kt123b->setTofHitInd(pMetaMatch->getTofHitInd());
kt123b->setShowerHitInd(pMetaMatch->getShowerHitInd());
kt123b->setPMeta(MomentumMETA);
kt123b->setMetaEloss(eloss);
}else{
kt123b->setTofDist(-1000.);
kt123b->setBeta(-1.);
kt123b->setMass2(-1000.,0);
kt123b->setTof(-1000.);
kt123b->setPMeta(0.);
kt123b->setMetaEloss(-1.);
}
}else{
Error("HKickTrackBaseF::FillData","No slots free");
}
return kt123b;
}
Last change: Sat May 22 12:58:43 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.