#include "hrtmetamatch.h"
#include "hcategory.h"
#include "hlocation.h"
#include "hiterator.h"
#include "hruntimedb.h"
#include "hades.h"
#include "hevent.h"
#include "hmatrixcategory.h"
#include "hspectrometer.h"
#include "hkicktrack.h"
#include "kickdef.h"
#include "haddef.h"
#include "hgeomvolume.h"
#include "hgeomcompositevolume.h"
#include "hmdcdef.h"
#include "hrtmetatrack.h"
#include "hrtmdctrk.h"
#include "hkickplane2.h"
#include "hkickmatchpar.h"
#include "hrtmatchingpar.h"
#undef LOCAL_PARAM_FILE
HRtMetaMatch::HRtMetaMatch(const Text_t name[],const Text_t title[]) :
HReconstructor(name,title) {
fMdcCat = 0;
fTrackCat = 0;
fHitLoc.set(2,0,2);
fSecLoc.set(1,0);
}
HRtMetaMatch::~HRtMetaMatch(void) {
}
Bool_t HRtMetaMatch::init(void) {
if (gHades) {
HRuntimeDb *rtdb = gHades->getRuntimeDb();
HEvent *event = gHades->getCurrentEvent();
if (event && rtdb) {
fCorrelator.init(event,rtdb);
fMdcCat = event->getCategory(catMdcTrack);
if (!fMdcCat) {
Error("init","KickMdcTrk category not found!");
return kFALSE;
}
fMdcIter = dynamic_cast<HIterator *>(fMdcCat->MakeIterator());
fMdcGeometry=(HMdcGeomPar *)rtdb->getContainer("MdcGeomPar");
fTrackCat = event->getCategory(catKickMdcTrk);
if (!fTrackCat) {
Int_t ssize[2]={6,100};
fTrackCat = new HMatrixCategory("HRtMetaTrack",2,ssize,0.5);
if (fTrackCat) event->addCategory(catKickMdcTrk,
fTrackCat,
"Tracks");
}
fKickplane = (HKickPlane2 *)(rtdb->getContainer("KickPlane2Meta"));
fMatchpar = (HKickMatchPar *)rtdb->getContainer("KickMatchParMeta");
#ifndef LOCAL_PARAM_FILE
fMdcMetaMatchPar = (HRtMatchingPar *)
rtdb->getContainer("RtMatchingParMeta");
#else
Warning("init","Using hardcoded parameter file!!");
TFile f("params.root");
fMdcMetaMatchPar = (HRtMatchingPar *)gFile->Get("RtMatchingParMeta");
#endif
if (fDebug) {
Hades::instance()->getOutputFile()->cd();
fControl = new TNtuple("metamatch_con","metamatch_con","pmeta:pm3:dPnorm:xPull:massMeta:massM3:dsx:dsy:dphi:theta:phi:tof:charge:sector:sys");
}
} else {
Error("init","! rtdb && event && spec");
return kFALSE;
}
} else {
Error("init","gHades does not exist");
return kFALSE;
}
return kTRUE;
}
Int_t HRtMetaMatch::execute(void) {
HRtMdcTrk *track=0;
fHitLoc[1] = 2;
fHitLoc[0] = 0;
for (fSecLoc[0] = 0; fSecLoc[0] < 6; fSecLoc[0]++) {
fHitLoc[0] = fSecLoc[0];
fCorrelator.setSector(fSecLoc[0]);
fCorrelator.readMetaPoints();
fMdcIter->Reset();
fMdcIter->gotoLocation(fSecLoc);
while ( (track = (HRtMdcTrk *)fMdcIter->Next()) != 0) {
for (Int_t i=0;i<fCorrelator.getNMetaPoints();i++) {
HRtMetaPoint &point = fCorrelator.getMetaPoint(i);
evaluate(track,point);
}
}
}
return 0;
}
void HRtMetaMatch::evaluate(HRtMdcTrk *track, HRtMetaPoint &point) {
HGeomVector r,r0,alpha0,inter;
Float_t theta,phi;
Float_t pi2 = TMath::Pi() / 2.;
Float_t g1,g2,pmeta,angle;
Int_t pol;
Float_t et1,et2;
Float_t errPtPhi;
Float_t itanphi,deltaX;
Float_t predictedSinPhi;
HGeomVector dir;
Int_t system=point.getSystem();
Float_t matchVar[5];
r.setXYZ(point.getX(), point.getY(), point.getZ());
theta = track->getTheta();
phi = track->getPhi();
r0.setX(track->getR() * TMath::Cos(phi + pi2));
r0.setY(track->getR() * TMath::Sin(phi + pi2));
r0.setZ(track->getZ());
alpha0.setX(TMath::Sin(theta) * TMath::Cos(phi));
alpha0.setY(TMath::Sin(theta) * TMath::Sin(phi));
alpha0.setZ(TMath::Cos(theta));
fKickplane->calcIntersection(r0,alpha0,inter);
dir = r - inter;
dir /= dir.length();
g1 = TMath::ATan2(alpha0.getZ(),alpha0.getY());
g2 = TMath::ATan2(dir.getZ(),dir.getY());
angle = g2 - g1;
pol = ((angle)>=0)?1:-1;
pmeta = fKickplane->getP(inter,2*TMath::Sin(angle/2.),pol);
Float_t dPnorm = track->getP()*(1/pmeta - 1/track->getP());
et1 = TMath::ATan2(alpha0.getX(),alpha0.getZ());
et2 = TMath::ATan2(dir.getX(),dir.getZ());
predictedSinPhi = fMatchpar->getDeflection(inter,pmeta,errPtPhi,pol);
if (predictedSinPhi>1) {
deltaX = 29.;
} else {
itanphi = TMath::Tan(2*TMath::ASin(predictedSinPhi)+et1);
if (TMath::Abs(itanphi) > 0.) {
deltaX = r.getX() - inter.getX() - itanphi * (r.getZ() - inter.getZ());
} else deltaX = 1000;
deltaX /= point.getErrors().getX();
}
matchVar[0] = track->getD();
matchVar[1] = track->getDKick();
matchVar[2] = track->getDPhi();
matchVar[3] = deltaX;
matchVar[4] = dPnorm;
if (fDebug) {
Double_t dist,beta,m2;
Double_t tof;
Double_t C = 299792458.0;
HGeomVector rOut;
Float_t pMdc3;
Float_t m2Meta,m2Mdc3;
Float_t scaling;
pMdc3 = track->getP();
tof = point.getTof();
rOut.setX(point.getX());
rOut.setY(point.getY());
rOut.setZ(point.getZ());
dist = (rOut - track->getOuterPos()).length();
scaling = track->getLeverArm() / (dist + track->getLeverArm());
dist += track->getLength();
dist /= 1000.;
if (tof>.1) {
beta = (dist / tof) * (1.0e9/C);
m2 = ( 1/(beta*beta) - 1);
m2Meta = pmeta * pmeta * m2;
m2Mdc3 = pMdc3 * pMdc3 * m2;
} else {
m2Meta = -1000;
m2Mdc3 = -1000;
}
fControl->Fill(pmeta,track->getP(),dPnorm,deltaX,m2Meta,m2Mdc3,track->getD(),track->getDKick(),track->getDPhi(),theta,phi,tof,pol,track->getSector(),system);
}
if (fIgnoreCuts || fMdcMetaMatchPar->bin(matchVar) != 0) {
fillData(track,point,pmeta);
}
}
void HRtMetaMatch::fillData(HRtMdcTrk *track, HRtMetaPoint &point,
Float_t pMeta) {
HRtMetaTrack *c=0;
TObject *slot=0;
Double_t dist,beta=-1.,m2;
Double_t tof;
Double_t C = 299792458.0;
HGeomVector rOut;
Float_t p,pMdc3;
Float_t m2Meta,m2Mdc3;
Float_t scaling;
pMdc3 = track->getP();
p = .5*pMeta +.5*(pMdc3);
tof = point.getTof();
rOut.setX(point.getX());
rOut.setY(point.getY());
rOut.setZ(point.getZ());
dist = (rOut - track->getOuterPos()).length();
scaling = track->getLeverArm() / (dist + track->getLeverArm());
dist += track->getLength();
dist /= 1000.;
if (tof>.1) {
beta = (dist / tof) * (1.0e9/C);
m2 = ( 1/(beta*beta) - 1);
m2Meta = pMeta * pMeta * m2;
m2Mdc3 = pMdc3 * pMdc3 * m2;
m2 = p * p * m2;
} else {
m2Meta = -1000;
m2Mdc3 = -1000;
m2 = -1000;
}
slot = fTrackCat->getNewSlot(fSecLoc);
if (slot) {
c = new (slot) HRtMetaTrack;
c->set(p, m2, tof,dist);
c->setSystem(point.getSystem());
c->setPull(fCorrelator.getDistance());
c->setResXY(fCorrelator.getResX(),fCorrelator.getResY());
c->setPMdc3(pMdc3);
c->setPMeta(pMeta);
c->setMass(m2Meta,m2Mdc3);
c->setDirection(track->getTheta(),track->getPhi());
c->setDistances(track->getDKick(),track->getD());
c->setTargetPos(track->getR(),track->getZ());
c->setScaling(scaling);
c->setBeta(beta);
c->setSector(track->getSector());
c->setPolarity(track->getCharge());
}
}
Bool_t HRtMetaMatch::finalize(void) {
fCorrelator.finalize();
if (fDebug) {
Hades::instance()->getOutputFile()->cd();
fControl->Write();
}
return kTRUE;
}
ClassImp(HRtMetaMatch)
Last change: Sat May 22 13:11:56 2010
Last generated: 2010-05-22 13:11
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.