// $Id: hdihitmatch.cc,v 1.8 2005/03/14 14:20:46 jurkovic Exp $
// Last update by Thomas Eberl: 04/08/02 13:05:43
//
using namespace std;
#include "hdihitmatch.h"
#include "hhitmatch.h"
#include <iostream> 
#include <iomanip>
#include <TLorentzVector.h>
#include <TVector3.h>
#include "hrichutilfunc.h"
ClassImp(HDiHitMatch)

 HDiHitMatch::HDiHitMatch() {
    reset();//default init of data members
    
}
 HDiHitMatch::HDiHitMatch(HHitMatch* trk1, HHitMatch* trk2) {
    reset();//default init of data members
    setIndHitsTrk1(trk1->getRichInd(),
		   trk1->getMdcInd(),
		   trk1->getTofInd(),
		   trk1->getShowInd(),
		   trk1->getKickInd());
    setIndHitsTrk2(trk2->getRichInd(),
		   trk2->getMdcInd(),
		   trk2->getTofInd(),
		   trk2->getShowInd(),
		   trk2->getKickInd());
    if      (trk1->getRichInd()==-1 && trk2->getRichInd()!=-1) setNbDRichHit(0);
    else if (trk1->getRichInd()!=-1 && trk2->getRichInd()==-1) setNbDRichHit(0);
    else if (trk1->getRichInd()==-1 && trk2->getRichInd()==-1) setNbDRichHit(-2); 
    else if (trk1->getRichInd()==trk2->getRichInd()) setNbDRichHit(1);
    else if (trk1->getRichInd()!=trk2->getRichInd()) setNbDRichHit(2);

    if      (trk1->getMdcInd()==-1 && trk2->getMdcInd()!=-1) setNbDMdcHit(0);
    else if (trk1->getMdcInd()!=-1 && trk2->getMdcInd()==-1) setNbDMdcHit(0);
    else if (trk1->getMdcInd()==-1 && trk2->getMdcInd()==-1) setNbDMdcHit(-2); 
    else if (trk1->getMdcInd()==trk2->getMdcInd()) setNbDMdcHit(1);
    else if (trk1->getMdcInd()!=trk2->getMdcInd()) setNbDMdcHit(2);


    Int_t t1 = trk1->getTofInd();
    Int_t s1 = trk1->getShowInd();
    Int_t t2 = trk2->getTofInd();
    Int_t s2 = trk2->getShowInd();


    if      (t1 == -1 && t2 == -1) setNbDMetaHit(-2); // no TOF META hit
    else if (t1 != -1 && t2 == -1) setNbDMetaHit(0); //one trk had TOF META, the other not
    else if (t2 != -1 && t1 == -1) setNbDMetaHit(0);
    else if (t2 == t1            ) setNbDMetaHit(1); // twice the same TOF META, end !
    else if (t2 != t1            ) setNbDMetaHit(2); // two different hits in TOF META, end !

    if (getNbDMetaHit() == 0) // one is TOF, find the other
    {
	if      (s1 != -1 && s2 == -1) setNbDMetaHit(2); // one SHO META, the other not
	else if (s2 != -1 && s1 == -1) setNbDMetaHit(2);
	else if (s1 == -1 && s2 == -1) setNbDMetaHit(0); // possible only in complex mode
    }

    if (getNbDMetaHit() == -2) //no TOF META, check SHOWER
    {
	if      (s1 == -1 && s2 == -1) setNbDMetaHit(-2);
	else if (s1 != -1 && s2 == -1) setNbDMetaHit(0);
	else if (s2 != -1 && s1 == -1) setNbDMetaHit(0);
	else if (s2 == s1            ) setNbDMetaHit(1);
	else if (s2 != s1            ) setNbDMetaHit(2);
    }

//     if (t1 == t2 && s1 != s2 )
//     if (getNbDMetaHit() != 2)
//     {
// 	cout<<t1<<" "<<t2<<"  "<<s1<<" "<<s2<<endl;
// 	cout<<getNbDMetaHit()<<endl;
//     }
    setIndHitsTrk1( trk1->getRichInd(),
		    trk1->getMdcInd(),
		    trk1->getTofInd(),
		    trk1->getShowInd(),
		    trk1->getKickInd()  );

    setIndHitsTrk2( trk2->getRichInd(),
		    trk2->getMdcInd(),
		    trk2->getTofInd(),
		    trk2->getShowInd(),
		    trk2->getKickInd()  );

    setMomTrk1(trk1->getKickMom());
    setMomTrk2(trk2->getKickMom());
    setCorrCode1(calcCorrCode(trk1));
    setCorrCode2(calcCorrCode(trk2));

//      Int_t c1=getCorrCode1();
//      Int_t c2=getCorrCode2();
    //cout<<"corr code 1: "<<c1<<" -- corr code 2: "<<c2<<endl;
    //    if ( c1==7 && c2==7) // both tracks have full correlation
    //    {
	//trk1->dumpToStdout();
	//cout<<"*******************"<<endl;
	//trk2->dumpToStdout();
    setInvMass(calcInvMass(trk1,trk2));
    setCharge(calcCharge(trk1,trk2));
    setOpangKICK(calcOpangKICK(trk1,trk2));
    setOpangMDC(calcOpangMDC(trk1,trk2));
    setOpangMETA(calcOpangMETA(trk1,trk2));
    setPt(trk1,trk2);
    setPairPt(trk1,trk2);
    setPairRap(trk1,trk2);
	//    }
}

 HDiHitMatch::~HDiHitMatch() {}

 HDiHitMatch::HDiHitMatch(const HDiHitMatch& source) {

}

HDiHitMatch& HDiHitMatch::operator=(const HDiHitMatch& source) {
 if (this != &source) {
 }
 
 return *this;
}
 void HDiHitMatch::dumpToStdout()
{
    cout<<"***********************************"<<endl;
    cout<<"Track1: code: "<<nCorrCode1<<" - index: "<<indTrk1<<" - hits [RMTSK]: ";
	for (Int_t i=0;i<MAXIND;i++)
	{
	    cout<<indHitsTrk1[i]<<" ";
	}
    cout<<endl;

    cout<<"Track2: code: "<<nCorrCode2<<" - index: "<<indTrk2<<" - hits [RMTSK]: ";
	for (Int_t i=0;i<MAXIND;i++)
	{
	    cout<<indHitsTrk2[i]<<" ";
	}
    cout<<endl;
    cout<<"nb diff Hits Rich: "<<nbDRichHit<<" - MDC: "<<nbDMdcHit
	<<" - META: "<<nbDMetaHit<<endl;
    cout<<"Chrg: "<<charge<<" - OpA MDC: "<<opangMDC<<" - OpA KICK: "<<opangKICK
	<<" - OpA META: "<<opangMETA<<endl;
    cout<<"Inv Mass: "<<invMass<<" - Mom1: "<<mom1<<" - Mom2: "<<mom2<<endl;
}

 void HDiHitMatch::reset(void) 
{
    nbDRichHit = -1;
    nbDMdcHit  = -1;
    nbDMetaHit = -1;
    opangMDC   = -1.;
    opangKICK   = -1.;
    opangMETA  = -1.;
    charge     = -1;
    indTrk1    = -1;
    indTrk2    = -1;
    invMass    = -1.;
    for (Int_t i=0;i<MAXIND;i++) indHitsTrk1[i]=-1;
    for (Int_t i=0;i<MAXIND;i++) indHitsTrk2[i]=-1;
}

 void HDiHitMatch::setPt(HHitMatch* h1,HHitMatch* h2)
{
    if (h1 && h1->getKickInd()>=0)
    {
	TLorentzVector* v1 = ((TLorentzVector*)h1->getLVec());
	momt1 = (Float_t) v1->Pt();
    }
    if (h2 && h2->getKickInd()>=0)
    {
	TLorentzVector* v2 = ((TLorentzVector*)h2->getLVec());
	momt2 = (Float_t) v2->Pt();
    }
}

 void HDiHitMatch::setPairPt(HHitMatch* h1,HHitMatch* h2)
{
    if (h1 && h1->getKickInd()>=0 && h2 && h2->getKickInd()>=0)
    {
	TLorentzVector* v1 = ((TLorentzVector*)h1->getLVec());
	TLorentzVector* v2 = ((TLorentzVector*)h2->getLVec());
	TLorentzVector vsum = (*v1)+(*v2);
	pt = (Float_t)  vsum.Pt();
    }
}

 void HDiHitMatch::setPairRap(HHitMatch* h1,HHitMatch* h2)
{
    if (h1 && h1->getKickInd()>=0 && h2 && h2->getKickInd()>=0)
    {
	TLorentzVector* v1 = ((TLorentzVector*)h1->getLVec());
	TLorentzVector* v2 = ((TLorentzVector*)h2->getLVec());
	TLorentzVector vsum = (*v1)+(*v2);
	rap = (Float_t)  vsum.Rapidity();
    }
}

 Float_t HDiHitMatch::calcInvMass(HHitMatch* h1,HHitMatch* h2)
{
    if (h1->getKickInd()>=0 && h2->getKickInd()>=0 && h1->getKickInd() != h2->getKickInd())
    {
	TLorentzVector* v1 = ((TLorentzVector*)h1->getLVec());
	TLorentzVector* v2 = ((TLorentzVector*)h2->getLVec());
	Float_t p1 = (v1->Vect()).Mag();
	Float_t p2 = (v2->Vect()).Mag();
	Float_t eps=1e-3;
	if (p1>0. && p2>0.)
	{

	    if ((h1->getKickMom() - p1) > eps) // consistency check
	    {
		cout<<"mom from kick track: "<<h1->getKickMom()
		    <<" from Lorentz vector: "<<p1<<" diff "
	     <<h1->getKickMom() - p1<<endl;
		Error("HDiHitMatch::calcInvMass","wrong mom");
	    }

	    TVector3 pvec1 = v1->Vect();
	    TVector3 pvec2 = v2->Vect();
	    Float_t opang=pvec1.Angle(pvec2);//in radians
	    Float_t invMass=2.*sin(opang/2.)*sqrt(p1*p2);
	    if (invMass>0.) return invMass;
	    else return -1.;
	    
	}else return -1.;
    }
    else return -1.;
}
 Float_t HDiHitMatch::calcOpangMDC(HHitMatch* h1,HHitMatch* h2)
{

    Float_t th1 = h1->getMdcTheta();
    Float_t ph1 = h1->getMdcPhi();
    Float_t th2 = h2->getMdcTheta();
    Float_t ph2 = h2->getMdcPhi();
    Float_t myopangle = HRichUtilFunc::calcOpeningAngleT(th1,ph1,th2,ph2);

    if (myopangle>0.)
    {
	return myopangle;
    } else return -1.;
}
 Float_t HDiHitMatch::calcOpangKICK(HHitMatch* h1,HHitMatch* h2)
{
    if (h1->getKickInd()>=0 && h2->getKickInd()>=0 )
    {
	TLorentzVector* v1 = ((TLorentzVector*)h1->getLVec());
	TLorentzVector* v2 = ((TLorentzVector*)h2->getLVec());
	Float_t p1 = (v1->Vect()).Mag();
	Float_t p2 = (v2->Vect()).Mag();
	if (p1>0. && p2>0.)
	{
	    TVector3 pvec1 = v1->Vect();
	    TVector3 pvec2 = v2->Vect();
	    Float_t opang=pvec1.Angle(pvec2);//in radians
	    opang=opang*57.29578;//in degrees
	    if (opang>0.) return opang;
	    else return -1.;
	} else return -1.;
    }
    else return -1.;
}
 Float_t HDiHitMatch::calcOpangMETA(HHitMatch* h1,HHitMatch* h2)
{
    
    Int_t nTInd1 = h1->getTofInd();
    Int_t nSInd1 = h1->getShowInd();

    Int_t nTInd2 = h2->getTofInd();
    Int_t nSInd2 = h2->getShowInd();

    Float_t h1Theta = -1;
    Float_t h1Phi = -1;
    Float_t h2Theta = -1;
    Float_t h2Phi = -1;

    if (nTInd1>-1) 
    {
	h1Theta= h1->getTofTheta();
	h1Phi  = h1->getTofPhi();
    }
    else if (nSInd1>-1)
    {
	h1Theta= h1->getShowerTheta();
	h1Phi  = h1->getShowerPhi();
    }
    if (nTInd2>-1) 
    {
	h2Theta= h2->getTofTheta();
	h2Phi  = h2->getTofPhi();
    }
    else if (nSInd2>-1)
    {
	h2Theta= h2->getShowerTheta();
	h2Phi  = h2->getShowerPhi();
    }
// # warning "h1Theta,h1Phi,h2Theta,h2Phi might be used uninitialized! fix me."
    Float_t myopangle = HRichUtilFunc::calcOpeningAngleT(h1Theta,h1Phi,
							 h2Theta,h2Phi);

    if (myopangle>0.)
    {
	return myopangle;
    } else return -1.;
    return -1.;
}
 Int_t HDiHitMatch::calcCharge(HHitMatch* h1,HHitMatch* h2)
{
    Int_t c=-1;
    Int_t kc1=h1->getKickCharge();
    Int_t kc2=h2->getKickCharge();
    setKICKCharge(kc1+kc2);
    //calc "deflection angle" using MDC and META info
    Float_t d1=-1.;
    Float_t d2=-1.;

    if (h1->getMatchedMdcTof()==1) 
    {
	d1=h1->getMdcTheta() - h1->getTofTheta();
	//cout<<"tof dtheta1: "<<d1<<endl;
    }
    else if (h1->getMatchedMdcShower()==1) 
    {
	d1=h1->getMdcTheta() - h1->getShowerTheta();
	//cout<<"shower dtheta1: "<<d1<<endl;
    }
    
    
    if (h2->getMatchedMdcTof()==1)
    {
	d2=h2->getMdcTheta() - h2->getTofTheta();
	//cout<<"tof dtheta2: "<<d2<<endl;
    }
    else if (h2->getMatchedMdcShower()==1) 
    {
	d2=h2->getMdcTheta() - h2->getShowerTheta();
	//cout<<"tof dshower2: "<<d2<<endl;
    }
    
	// neg value for deflection is electron
    if (d1*d2>0.)//like sign pair
    {
	//cout<<"like sign pair"<<endl;
	if (d1<0. && d2<0.) c=-2;//2 e-
	if (d1>0. && d2>0.) c= 2;//2 e+
    }
    else if (d1*d2<0.)//unlike sign pair
    {
	//cout<<"unlike sign pair"<<endl;
	c=0;
    }
    if (h1->getKickInd()>=0 && h2->getKickInd()>=0)
    {
	if (c != kc1+kc2) 
	{
	    c = kc1+kc2; // believe in kick track 
//  	    cout<<"kc1: "<<kc1<<" / kc2: "<<kc2<<"  -- c: "<<c
//  		<<"  -- d1:"<<d1<<" / d2:"<<d2<<endl;
//  	    Error ("calcCharge","inconsistent charge KickTrack<->Correlator");
	}
    }
    return c;
}

 Int_t HDiHitMatch::calcCorrCode(HHitMatch* h)
{
    Int_t c=-1;
    Int_t rm=h->getMatchedRichMdc();
    Int_t rt=h->getMatchedRichTof();
    Int_t rs=h->getMatchedRichShower();
    Int_t mt=h->getMatchedMdcTof();
    Int_t ms=h->getMatchedMdcShower();
    //cf. look-up table in .h file
    if (rm!=1 && (rt!=1 && rs!=1) && (mt==1 || ms==1) ) c=1;
    if (rm!=1 && (rt==1 || rs==1) && (mt!=1 && ms!=1) ) c=2;
    if (rm!=1 && (rt==1 || rs==1) && (mt==1 || ms==1) ) c=3;
    if (rm==1 && (rt!=1 && rs!=1) && (mt!=1 && ms!=1) ) c=4;
    if (rm==1 && (rt!=1 && rs!=1) && (mt==1 || ms==1) ) c=5;
    if (rm==1 && (rt==1 || rs==1) && (mt!=1 && ms!=1) ) c=6;
    if (rm==1 && (rt==1 || rs==1) && (mt==1 || ms==1) ) c=7;
    return c;
}


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.